Repository: uinosoft/t3d.js Branch: dev Commit: aab1a3c9c603 Files: 864 Total size: 11.6 MB Directory structure: gitextract_bg_rxfqd/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── contributing.md │ └── workflows/ │ └── deploy-to-pages.yml ├── .gitignore ├── .vscode/ │ └── extensions.json ├── LICENSE ├── README.md ├── build/ │ ├── t3d.js │ └── t3d.module.js ├── eslint.config.mjs ├── examples/ │ ├── animation_blending_additive.html │ ├── animation_bone_attach.html │ ├── animation_crossfade.html │ ├── animation_interpolant.html │ ├── animation_keyframe_animation.html │ ├── animation_morphtargets.html │ ├── animation_multiple.html │ ├── animation_skinned_instancing.html │ ├── animation_skinned_mesh.html │ ├── animation_snake.html │ ├── camera_multiple.html │ ├── camera_projection.html │ ├── canvas2d_canvas2d.html │ ├── controls_camera_fly.html │ ├── controls_camera_free.html │ ├── controls_camera_orbit.html │ ├── controls_camera_view.html │ ├── controls_transform.html │ ├── custompass_bloom.html │ ├── custompass_blur.html │ ├── custompass_car.html │ ├── custompass_deferred.html │ ├── custompass_depth_buffer_share.html │ ├── custompass_depth_texture_share.html │ ├── custompass_dof.html │ ├── custompass_gbuffer.html │ ├── custompass_gpupick.html │ ├── custompass_lensflare.html │ ├── custompass_motion_blur.html │ ├── custompass_motion_blur2.html │ ├── custompass_msaa.html │ ├── custompass_oit.html │ ├── custompass_rendertarget_2d.html │ ├── custompass_rendertarget_3d.html │ ├── custompass_shadow_planar.html │ ├── custompass_sketch.html │ ├── custompass_ssao.html │ ├── custompass_ssr.html │ ├── custompass_taa.html │ ├── custompass_transmission.html │ ├── custompass_unrealbloom.html │ ├── custompass_xray.html │ ├── exporter_draco.html │ ├── exporter_gltf.html │ ├── files/ │ │ ├── fonts/ │ │ │ ├── OFL-hind.txt │ │ │ └── OFL-montserrat.txt │ │ └── main.css │ ├── files.json │ ├── geometry_boundings.html │ ├── geometry_builder_edges.html │ ├── geometry_builder_lines.html │ ├── geometry_builder_shapes.html │ ├── geometry_geometries.html │ ├── geometry_groups.html │ ├── geometry_loader_assimp2json.html │ ├── geometry_loader_gltf.html │ ├── geometry_loader_gltf2.html │ ├── geometry_loader_gltf3.html │ ├── geometry_loader_gltf_avif.html │ ├── geometry_loader_gltf_camera.html │ ├── geometry_loader_gltf_draco.html │ ├── geometry_loader_gltf_helmat.html │ ├── geometry_loader_gltf_instancing.html │ ├── geometry_loader_gltf_lights.html │ ├── geometry_loader_gltf_materials_clearcoat.html │ ├── geometry_loader_gltf_materials_dispersion.html │ ├── geometry_loader_gltf_materials_transmission.html │ ├── geometry_loader_gltf_materials_unlit.html │ ├── geometry_loader_gltf_meshopt.html │ ├── geometry_loader_gltf_morphtargets.html │ ├── geometry_loader_gltf_pointer.html │ ├── geometry_loader_gltf_skinning.html │ ├── geometry_loader_gltf_tangent.html │ ├── geometry_loader_gltf_uvtransform.html │ ├── geometry_loader_vox.html │ ├── index.html │ ├── jsm/ │ │ ├── Clock.js │ │ ├── DynamicFont.js │ │ ├── GBuffer.js │ │ ├── PickBuffer.js │ │ ├── Raycaster.js │ │ ├── SHGenerator.js │ │ ├── SceneUtils.js │ │ ├── SkeletonUtils.js │ │ ├── SuperSampling.js │ │ ├── VoxMeshBuilder.js │ │ ├── WaterSimulation.js │ │ ├── WorkerPool.js │ │ ├── animation/ │ │ │ ├── CCDIKSolver.js │ │ │ └── LockedTrack.js │ │ ├── canvas2d/ │ │ │ ├── Canvas2D.js │ │ │ ├── Object2D.js │ │ │ └── Sprite2D.js │ │ ├── controls/ │ │ │ ├── FlyControls.js │ │ │ ├── FreeControls.js │ │ │ ├── OrbitControls.js │ │ │ ├── TransformControls.js │ │ │ └── ViewControls.js │ │ ├── exporters/ │ │ │ ├── DRACOExporter.js │ │ │ └── GLTFExporter.js │ │ ├── geometries/ │ │ │ ├── BitmapTextGeometry.js │ │ │ ├── CapsuleGeometry.js │ │ │ ├── CircleGeometry.js │ │ │ ├── GeometryUtils.js │ │ │ └── builders/ │ │ │ ├── Earcut.js │ │ │ ├── EdgesBuilder.js │ │ │ ├── ExtrudeShapeBuilder.js │ │ │ ├── Font.js │ │ │ ├── GeometryBuilderUtils.js │ │ │ ├── LatheBuilder.js │ │ │ ├── PolygonBuilder.js │ │ │ ├── PolyhedronBuilder.js │ │ │ ├── RouteBuilder.js │ │ │ ├── TorusBuilder.js │ │ │ └── TubeBuilder.js │ │ ├── impostor/ │ │ │ ├── OctahedralImpostor.js │ │ │ └── OctahedralTextureGenerator.js │ │ ├── lights/ │ │ │ ├── LightShadowAdapter.js │ │ │ └── RectAreaLightLTC.js │ │ ├── loaders/ │ │ │ ├── AssimpJsonLoader.js │ │ │ ├── DDSLoader.js │ │ │ ├── DRACOLoader.js │ │ │ ├── EXRLoader.js │ │ │ ├── EnvLoader.js │ │ │ ├── ImageBitmapLoader.js │ │ │ ├── KTX2Loader.js │ │ │ ├── PVRLoader.js │ │ │ ├── RGBELoader.js │ │ │ ├── TGALoader.js │ │ │ ├── Texture2DLoader.js │ │ │ ├── TextureCubeLoader.js │ │ │ └── glTF/ │ │ │ ├── Constants.js │ │ │ ├── GLTFLoader.js │ │ │ ├── GLTFResource.js │ │ │ ├── GLTFUtils.js │ │ │ ├── extensions/ │ │ │ │ ├── EXT_mesh_gpu_instancing.js │ │ │ │ ├── EXT_meshopt_compression.js │ │ │ │ ├── KHR_animation_pointer.js │ │ │ │ ├── KHR_draco_mesh_compression.js │ │ │ │ ├── KHR_lights_punctual.js │ │ │ │ ├── KHR_materials_clearcoat.js │ │ │ │ ├── KHR_materials_dispersion.js │ │ │ │ ├── KHR_materials_ior.js │ │ │ │ ├── KHR_materials_pbrSpecularGlossiness.js │ │ │ │ ├── KHR_materials_transmission.js │ │ │ │ ├── KHR_materials_unlit.js │ │ │ │ ├── KHR_materials_volume.js │ │ │ │ ├── KHR_texture_basisu.js │ │ │ │ └── KHR_texture_transform.js │ │ │ └── parsers/ │ │ │ ├── AccessorParser.js │ │ │ ├── AnimationParser.js │ │ │ ├── BufferParser.js │ │ │ ├── BufferViewParser.js │ │ │ ├── ImageParser.js │ │ │ ├── IndexParser.js │ │ │ ├── MaterialParser.js │ │ │ ├── NodeParser.js │ │ │ ├── PrimitiveParser.js │ │ │ ├── ReferenceParser.js │ │ │ ├── SceneParser.js │ │ │ ├── SkinParser.js │ │ │ ├── TextureParser.js │ │ │ └── Validator.js │ │ ├── materials/ │ │ │ ├── AlphaHashedPBRMaterial.js │ │ │ ├── AttenuationMaterial.js │ │ │ ├── BatchedMaterial.js │ │ │ ├── BatchedPBRMaterial.js │ │ │ ├── BitmapTextMaterial.js │ │ │ ├── InstancedBasicMaterial.js │ │ │ ├── InstancedMaterial.js │ │ │ ├── InstancedPBRMaterial.js │ │ │ ├── PlanarReflectionMaterial.js │ │ │ └── TransmissionPBRMaterial.js │ │ ├── math/ │ │ │ ├── ColorGradient.js │ │ │ ├── DistanceTransform.js │ │ │ ├── OBB.js │ │ │ ├── Octree.js │ │ │ ├── TriangleSoup.js │ │ │ ├── TrianglesOctree.js │ │ │ ├── VirtualGroup.js │ │ │ └── curves/ │ │ │ ├── CubicBezierCurve2.js │ │ │ ├── CubicBezierCurve3.js │ │ │ ├── Curve.js │ │ │ ├── CurvePath.js │ │ │ ├── CurvePath2.js │ │ │ ├── CurvePath3.js │ │ │ ├── CurveUtils.js │ │ │ ├── Curves.js │ │ │ ├── LineCurve2.js │ │ │ ├── LineCurve3.js │ │ │ ├── QuadraticBezierCurve2.js │ │ │ └── QuadraticBezierCurve3.js │ │ ├── misc/ │ │ │ ├── OcclusionProxyManager.js │ │ │ └── Timer.js │ │ ├── navigation/ │ │ │ ├── AStar.js │ │ │ ├── Pathfinding.js │ │ │ ├── PathfindingHelper.js │ │ │ ├── Utils.js │ │ │ └── Zone.js │ │ ├── objects/ │ │ │ ├── AxisHelper.js │ │ │ ├── Background.js │ │ │ ├── BatchedMesh.js │ │ │ ├── Box3Helper.js │ │ │ ├── BoxHelper.js │ │ │ ├── CameraHelper.js │ │ │ ├── DirectionalLightHelper.js │ │ │ ├── GradientSky.js │ │ │ ├── GridHelper.js │ │ │ ├── HemisphereLightHelper.js │ │ │ ├── InstancedLine.js │ │ │ ├── LayeredVolumeMesh.js │ │ │ ├── LegacySkeletonHelper.js │ │ │ ├── LightShadowAdapterHelper.js │ │ │ ├── LineChartFillMesh.js │ │ │ ├── OcclusionTester.js │ │ │ ├── OctreeHelper.js │ │ │ ├── ParticleContainer.js │ │ │ ├── PointLightHelper.js │ │ │ ├── PolarGridHelper.js │ │ │ ├── RectAreaLightHelper.js │ │ │ ├── SkeletonHelper.js │ │ │ ├── Sky.js │ │ │ ├── SkyBox.js │ │ │ ├── SphereHelper.js │ │ │ ├── SpotLightHelper.js │ │ │ ├── Sprite.js │ │ │ ├── Terrain.js │ │ │ ├── TriangleSoupHelper.js │ │ │ ├── VertexNormalsHelper.js │ │ │ ├── VertexTangentsHelper.js │ │ │ └── Water.js │ │ ├── ocean/ │ │ │ ├── Butterfly.js │ │ │ ├── OceanField.js │ │ │ ├── OceanFieldBuilder.js │ │ │ ├── OceanMaterial.js │ │ │ ├── Utils.js │ │ │ ├── index.js │ │ │ └── shaders/ │ │ │ ├── FFT2HShader.js │ │ │ ├── FFT2VShader.js │ │ │ ├── H0Shader.js │ │ │ ├── HkShader.js │ │ │ └── PostFFT2Shader.js │ │ ├── pass/ │ │ │ ├── BlurPass.js │ │ │ ├── DepthPeelingOITPass.js │ │ │ ├── SSAOPass.js │ │ │ ├── UnrealBloomPass.js │ │ │ └── WeightedBlendedOITPass.js │ │ ├── probes/ │ │ │ ├── PlanarReflectionProbe.js │ │ │ └── ReflectionProbe.js │ │ ├── render/ │ │ │ ├── DeferredRenderer.js │ │ │ └── ForwardRenderer.js │ │ ├── shaders/ │ │ │ ├── BlendShader.js │ │ │ ├── BlurShader.js │ │ │ ├── BokehShader.js │ │ │ ├── ClusteredDebugShader.js │ │ │ ├── ColorAdjustShader.js │ │ │ ├── CopyShader.js │ │ │ ├── DeferredShader.js │ │ │ ├── DepthLinearShader.js │ │ │ ├── FXAAShader.js │ │ │ ├── FastGaussianBlurShader.js │ │ │ ├── FilmShader.js │ │ │ ├── GroundProjectedSkyboxShader.js │ │ │ ├── InfiniteGridShader.js │ │ │ ├── LineDashedShader.js │ │ │ ├── LuminosityHighPassShader.js │ │ │ ├── MSDFTextShader.js │ │ │ ├── MatcapShader.js │ │ │ ├── MotionBlur2Shader.js │ │ │ ├── MotionBlurShader.js │ │ │ ├── OutputShader.js │ │ │ ├── PlanarShadowShader.js │ │ │ ├── SDFTextShader.js │ │ │ ├── SSAOShader.js │ │ │ ├── SSRShader.js │ │ │ ├── ShadowShader.js │ │ │ ├── SketchShader.js │ │ │ ├── SkyShader.js │ │ │ ├── TAAShader.js │ │ │ ├── TextureVariationShader.js │ │ │ ├── VolumeShader.js │ │ │ ├── WaterShader.js │ │ │ └── XRayShader.js │ │ ├── stereo/ │ │ │ ├── AnaglyphRenderer.js │ │ │ ├── StereoCamera.js │ │ │ ├── StereoRenderer.js │ │ │ ├── WebVRControls.js │ │ │ └── WebXRControls.js │ │ └── textures/ │ │ ├── GradientTextureGenerator.js │ │ ├── HeatmapGenerator.js │ │ ├── IDWMapGenerator.js │ │ ├── PMREMGenerator.js │ │ └── RGBDDecoder.js │ ├── lab_clouds.html │ ├── lab_clouds_shader.html │ ├── lab_earth.html │ ├── lab_geometry_grass.html │ ├── lab_geometry_images.html │ ├── lab_gltf_grass.html │ ├── lab_ground.html │ ├── lab_histogram.html │ ├── lab_ik.html │ ├── lab_impostor_octahedral.html │ ├── lab_impostor_octahedral_instancing.html │ ├── lab_linechart_fill.html │ ├── lab_ocean.html │ ├── lab_ocean_fft.html │ ├── lab_terrain.html │ ├── lab_texture_variation.html │ ├── lab_water_simulation.html │ ├── libs/ │ │ ├── ammo.wasm.js │ │ ├── ammo.wasm.wasm │ │ ├── basis/ │ │ │ ├── README.md │ │ │ ├── basis_transcoder.js │ │ │ └── basis_transcoder.wasm │ │ ├── cannon.js │ │ ├── draco/ │ │ │ ├── README.md │ │ │ ├── draco_decoder.js │ │ │ ├── draco_decoder.wasm │ │ │ ├── draco_encoder.js │ │ │ ├── draco_wasm_wrapper.js │ │ │ └── gltf/ │ │ │ ├── draco_decoder.js │ │ │ ├── draco_decoder.wasm │ │ │ ├── draco_encoder.js │ │ │ └── draco_wasm_wrapper.js │ │ ├── es-module-shims.js │ │ ├── fflate.module.js │ │ ├── ktx-parse.module.js │ │ ├── meshopt_decoder.module.js │ │ ├── nanobar.js │ │ ├── simplex-noise.js │ │ ├── stats.module.js │ │ ├── tween.module.js │ │ ├── webvr-polyfill.js │ │ └── zstddec.module.js │ ├── light_directlight.html │ ├── light_group.html │ ├── light_hemispherelight.html │ ├── light_pointlight.html │ ├── light_rectarealight.html │ ├── light_shadow.html │ ├── light_shadow_adapter.html │ ├── light_softshadow.html │ ├── light_sphericalharmonicslight.html │ ├── light_spotlight.html │ ├── lines_dashedlines.html │ ├── lines_instancedlines.html │ ├── lines_lines.html │ ├── main.css │ ├── material_alphahash.html │ ├── material_alphamask.html │ ├── material_blending.html │ ├── material_bumpmap.html │ ├── material_clearcoat.html │ ├── material_clippingplanes.html │ ├── material_depth.html │ ├── material_emissivemap.html │ ├── material_envmap.html │ ├── material_flatshading.html │ ├── material_lightmap.html │ ├── material_materials.html │ ├── material_normalmap.html │ ├── material_pbr.html │ ├── material_shader_background.html │ ├── material_shader_extend.html │ ├── material_shader_fakeInterior.html │ ├── material_shader_grid.html │ ├── material_shader_matcap.html │ ├── material_shader_shadow.html │ ├── material_shader_sky.html │ ├── material_shader_sky2.html │ ├── material_shader_sky_gradient.html │ ├── material_shader_skybox.html │ ├── material_shader_skybox_filter.html │ ├── material_shader_skybox_groundprojected.html │ ├── material_shader_volume.html │ ├── material_shader_volume_layered.html │ ├── material_shader_water.html │ ├── material_shader_water_pbr.html │ ├── material_shader_xray.html │ ├── material_shadermaterial.html │ ├── material_transparent.html │ ├── material_uvcoord.html │ ├── material_uvtransform.html │ ├── material_vertexcolors.html │ ├── math_curve.html │ ├── math_curve_motion.html │ ├── math_obb.html │ ├── math_octree.html │ ├── navigation_pathfinding.html │ ├── navigation_recast_crowd.html │ ├── navigation_recast_generation.html │ ├── navigation_recast_obstacles.html │ ├── navigation_recast_walking.html │ ├── particle_particle.html │ ├── physics_ammo.html │ ├── physics_ammo_softbody_volume.html │ ├── physics_cannon.html │ ├── physics_ik.html │ ├── physics_rapier.html │ ├── physics_rapier_character_controller.html │ ├── points_sprites.html │ ├── probes_reflection.html │ ├── probes_reflection_planar.html │ ├── raycast_raycaster.html │ ├── renderer_clustered_lighting.html │ ├── renderer_culling_contribution.html │ ├── renderer_culling_frustum.html │ ├── renderer_deferred.html │ ├── renderer_deferred_lighting.html │ ├── resources/ │ │ ├── 3d/ │ │ │ └── Readme.txt │ │ ├── compressed/ │ │ │ ├── 2d_astc_6x6.ktx2 │ │ │ ├── 2d_etc1s.ktx2 │ │ │ ├── 2d_rgba16_linear.ktx2 │ │ │ ├── 2d_rgba32_linear.ktx2 │ │ │ ├── 2d_rgba8.ktx2 │ │ │ ├── 2d_rgba8_displayp3.ktx2 │ │ │ ├── 2d_rgba8_linear.ktx2 │ │ │ ├── 2d_uastc.ktx2 │ │ │ ├── Mountains.dds │ │ │ ├── Mountains_argb_mip.dds │ │ │ ├── Mountains_argb_nomip.dds │ │ │ ├── disturb_2bpp_rgb.pvr │ │ │ ├── disturb_4bpp_rgb.pvr │ │ │ ├── disturb_4bpp_rgb_mips.pvr │ │ │ ├── disturb_4bpp_rgb_v3.pvr │ │ │ ├── disturb_argb_mip.dds │ │ │ ├── disturb_argb_nomip.dds │ │ │ ├── disturb_dxt1_mip.dds │ │ │ ├── disturb_dxt1_nomip.dds │ │ │ ├── explosion_dxt5_mip.dds │ │ │ ├── flare_2bpp_rgba.pvr │ │ │ ├── flare_4bpp_rgba.pvr │ │ │ ├── hepatica_dxt3_mip.dds │ │ │ ├── park3_cube_mip_2bpp_rgb_v3.pvr │ │ │ └── park3_cube_nomip_4bpp_rgb.pvr │ │ ├── crate_color8.tga │ │ ├── fonts/ │ │ │ ├── msdf/ │ │ │ │ └── roboto-regular.fnt │ │ │ └── typeface/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── helvetiker_bold.typeface.json │ │ │ ├── helvetiker_regular.typeface.json │ │ │ ├── optimer_bold.typeface.json │ │ │ └── optimer_regular.typeface.json │ │ ├── hdr/ │ │ │ ├── Grand_Canyon_C.env │ │ │ ├── Grand_Canyon_C.hdr │ │ │ ├── blouberg_sunrise_2_1k.hdr │ │ │ ├── hall.hdr │ │ │ ├── memorial.exr │ │ │ ├── memorial.hdr │ │ │ ├── pisa.hdr │ │ │ ├── pisaHDR/ │ │ │ │ ├── nx.hdr │ │ │ │ ├── ny.hdr │ │ │ │ ├── nz.hdr │ │ │ │ ├── px.hdr │ │ │ │ ├── py.hdr │ │ │ │ └── pz.hdr │ │ │ └── royal_esplanade_1k.env │ │ ├── lensflare/ │ │ │ └── LICENSE.txt │ │ ├── models/ │ │ │ ├── assimp/ │ │ │ │ ├── interior/ │ │ │ │ │ ├── interior.3ds │ │ │ │ │ └── interior.assimp.json │ │ │ │ └── jeep/ │ │ │ │ ├── jeep.assimp.json │ │ │ │ ├── jeep1.ms3d │ │ │ │ └── jeep1.readme.txt │ │ │ ├── gltf/ │ │ │ │ ├── BotSkinned/ │ │ │ │ │ └── glTF-MaterialsUnlit/ │ │ │ │ │ └── Bot_Skinned.gltf │ │ │ │ ├── CesiumMan/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── glTF/ │ │ │ │ │ │ └── CesiumMan.gltf │ │ │ │ │ ├── glTF-Binary/ │ │ │ │ │ │ └── CesiumMan.glb │ │ │ │ │ ├── glTF-Draco/ │ │ │ │ │ │ └── CesiumMan.gltf │ │ │ │ │ └── glTF-Embedded/ │ │ │ │ │ └── CesiumMan.gltf │ │ │ │ ├── ClearCoatTest.glb │ │ │ │ ├── CornellBox.glb │ │ │ │ ├── DamagedHelmet/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── glTF/ │ │ │ │ │ └── DamagedHelmet.gltf │ │ │ │ ├── DispersionTest.glb │ │ │ │ ├── DragonAttenuation/ │ │ │ │ │ └── DragonAttenuation.gltf │ │ │ │ ├── Duck/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── glTF/ │ │ │ │ │ │ └── Duck.gltf │ │ │ │ │ ├── glTF-Binary/ │ │ │ │ │ │ └── Duck.glb │ │ │ │ │ ├── glTF-Draco/ │ │ │ │ │ │ └── Duck.gltf │ │ │ │ │ ├── glTF-Embedded/ │ │ │ │ │ │ └── Duck.gltf │ │ │ │ │ └── glTF-pbrSpecularGlossiness/ │ │ │ │ │ └── Duck.gltf │ │ │ │ ├── Flamingo.glb │ │ │ │ ├── GlamVelvetSofa/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── glTF/ │ │ │ │ │ │ └── GlamVelvetSofa.gltf │ │ │ │ │ └── glTF-Binary/ │ │ │ │ │ └── GlamVelvetSofa.glb │ │ │ │ ├── IKTest.glb │ │ │ │ ├── InterpolationTest.glb │ │ │ │ ├── IridescentDishWithOlives.glb │ │ │ │ ├── LeePerrySmith/ │ │ │ │ │ ├── LeePerrySmith.glb │ │ │ │ │ └── LeePerrySmith_License.txt │ │ │ │ ├── LittlestTokyo.glb │ │ │ │ ├── Michelle.glb │ │ │ │ ├── NormalTangentMirrorTest/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── glTF/ │ │ │ │ │ └── NormalTangentMirrorTest.gltf │ │ │ │ ├── NormalTangentTest/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── glTF/ │ │ │ │ │ └── NormalTangentTest.gltf │ │ │ │ ├── PointerTest.glb │ │ │ │ ├── PrimaryIonDrive.glb │ │ │ │ ├── Soldier.glb │ │ │ │ ├── Spheres/ │ │ │ │ │ └── Spheres.gltf │ │ │ │ ├── TextureTransformTest/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── glTF/ │ │ │ │ │ └── TextureTransformTest.gltf │ │ │ │ ├── UinoDog/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── glTF/ │ │ │ │ │ └── robot.gltf │ │ │ │ ├── UinoHelmet/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── glTF/ │ │ │ │ │ └── UinoHelmet.gltf │ │ │ │ ├── UinoMan/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── glTF/ │ │ │ │ │ └── UinoMan.gltf │ │ │ │ ├── UinoSpaceman/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── glTF/ │ │ │ │ │ │ └── UinoSpaceman.gltf │ │ │ │ │ └── glTF-Binary/ │ │ │ │ │ └── UinoSpaceman.glb │ │ │ │ ├── Xbot.glb │ │ │ │ ├── asteroid.glb │ │ │ │ ├── bust_of_woman/ │ │ │ │ │ ├── glTF/ │ │ │ │ │ │ └── bust_of_woman.gltf │ │ │ │ │ └── glTF-Binary/ │ │ │ │ │ └── bust_of_woman.glb │ │ │ │ ├── coffeemat.glb │ │ │ │ ├── ferrari/ │ │ │ │ │ └── ferrari.glb │ │ │ │ ├── forest_house.glb │ │ │ │ ├── grass/ │ │ │ │ │ └── grass.gltf │ │ │ │ ├── lighthouse.glb │ │ │ │ ├── pool.glb │ │ │ │ ├── robot_arm/ │ │ │ │ │ └── glTF/ │ │ │ │ │ ├── license.txt │ │ │ │ │ └── scene.gltf │ │ │ │ ├── sea_shell.glb │ │ │ │ ├── suzanne/ │ │ │ │ │ └── suzanne.gltf │ │ │ │ ├── teapots_galore/ │ │ │ │ │ └── teapots_galore.gltf │ │ │ │ └── tree.glb │ │ │ └── vox/ │ │ │ ├── castle.vox │ │ │ ├── largedata.vox │ │ │ ├── menger.vox │ │ │ ├── monu1.vox │ │ │ ├── monu10.vox │ │ │ ├── monu9.vox │ │ │ ├── p1.vox │ │ │ ├── p2.vox │ │ │ ├── p3.vox │ │ │ ├── p4.vox │ │ │ ├── p5.vox │ │ │ ├── p6.vox │ │ │ ├── p7.vox │ │ │ └── ship.vox │ │ ├── navigation/ │ │ │ ├── level.glb │ │ │ └── level.nav.glb │ │ ├── sintel.ogv │ │ └── skybox/ │ │ ├── Bridge2/ │ │ │ └── readme.txt │ │ ├── Park2/ │ │ │ └── readme.txt │ │ ├── mp_cloud9/ │ │ │ ├── Cloud 9.nfo │ │ │ ├── cloud9_bk.tga │ │ │ ├── cloud9_dn.tga │ │ │ ├── cloud9_ft.tga │ │ │ ├── cloud9_lf.tga │ │ │ ├── cloud9_rt.tga │ │ │ ├── cloud9_up.tga │ │ │ ├── license.txt │ │ │ └── mp_cloud9.shader │ │ └── skyboxsun25deg/ │ │ └── skyboxsun25degtest.txt │ ├── scene_anchor.html │ ├── scene_clippingplanes.html │ ├── scene_fog.html │ ├── scene_gamma_correction.html │ ├── sprite_sprites.html │ ├── stereo_anaglyph.html │ ├── stereo_webvr_car.html │ ├── stereo_webxr_vr_car.html │ ├── text_bitmap.html │ ├── text_bitmap_dynamic.html │ ├── text_sdf.html │ ├── text_sdf_dynamic.html │ ├── text_typeface.html │ ├── texture_2darray.html │ ├── texture_3d.html │ ├── texture_anisotropic.html │ ├── texture_depth.html │ ├── texture_generator_heatmap.html │ ├── texture_generator_idwmap.html │ ├── texture_integer.html │ ├── texture_loader_compressed_dds.html │ ├── texture_loader_compressed_pvr.html │ ├── texture_loader_env.html │ ├── texture_loader_exr.html │ ├── texture_loader_hdr.html │ ├── texture_loader_hdr_cube.html │ ├── texture_loader_hdr_panorama.html │ ├── texture_loader_imagebitmap.html │ ├── texture_loader_ktx2.html │ ├── texture_loader_tga.html │ ├── texture_mipmap.html │ ├── texture_video.html │ ├── webgl_canvas_transparent.html │ ├── webgl_clipculldistance.html │ ├── webgl_contextlost.html │ ├── webgl_depthfunc.html │ ├── webgl_external_buffer.html │ ├── webgl_external_texture.html │ ├── webgl_helpers.html │ ├── webgl_instanced_draw.html │ ├── webgl_logarithmicDepthBuffer.html │ ├── webgl_mesh_batch.html │ ├── webgl_multi_draw.html │ ├── webgl_polygonoffset.html │ ├── webgl_primitive_restart.html │ ├── webgl_query_occlusion.html │ ├── webgl_query_occlusion_proxy.html │ ├── webgl_query_timer.html │ ├── webgl_renderinfo.html │ ├── webgl_shader_compile.html │ ├── webgl_shader_precompile.html │ └── webgl_stencil.html ├── package.json ├── rollup.config.js ├── src/ │ ├── EventDispatcher.js │ ├── animation/ │ │ ├── AnimationAction.js │ │ ├── AnimationMixer.js │ │ ├── KeyframeClip.js │ │ ├── KeyframeInterpolants.js │ │ ├── KeyframeTrack.js │ │ ├── PropertyBindingMixer.js │ │ └── tracks/ │ │ ├── BooleanKeyframeTrack.js │ │ ├── ColorKeyframeTrack.js │ │ ├── NumberKeyframeTrack.js │ │ ├── QuaternionKeyframeTrack.js │ │ ├── StringKeyframeTrack.js │ │ └── VectorKeyframeTrack.js │ ├── base.js │ ├── const.js │ ├── legacy.js │ ├── loaders/ │ │ ├── FileLoader.js │ │ ├── ImageLoader.js │ │ ├── Loader.js │ │ └── LoadingManager.js │ ├── main.js │ ├── math/ │ │ ├── Box2.js │ │ ├── Box3.js │ │ ├── Color3.js │ │ ├── Color4.js │ │ ├── Euler.js │ │ ├── Frustum.js │ │ ├── MathUtils.js │ │ ├── Matrix3.js │ │ ├── Matrix4.js │ │ ├── Plane.js │ │ ├── Quaternion.js │ │ ├── Ray.js │ │ ├── Sphere.js │ │ ├── Spherical.js │ │ ├── SphericalHarmonics3.js │ │ ├── Triangle.js │ │ ├── Vector2.js │ │ ├── Vector3.js │ │ └── Vector4.js │ ├── render/ │ │ ├── LightingData.js │ │ ├── LightingGroup.js │ │ ├── PropertyMap.js │ │ ├── RenderCollector.js │ │ ├── RenderInfo.js │ │ ├── RenderQueue.js │ │ ├── RenderQueueLayer.js │ │ ├── RenderStates.js │ │ ├── SceneData.js │ │ ├── ThinRenderer.js │ │ └── passes/ │ │ ├── ShaderPostPass.js │ │ └── ShadowMapPass.js │ ├── resources/ │ │ ├── QuerySet.js │ │ ├── Raycaster.js │ │ ├── RenderBuffer.js │ │ ├── Skeleton.js │ │ ├── TransformUV.js │ │ ├── fogs/ │ │ │ ├── Fog.js │ │ │ └── FogExp2.js │ │ ├── geometries/ │ │ │ ├── Attribute.js │ │ │ ├── BoxGeometry.js │ │ │ ├── Buffer.js │ │ │ ├── CylinderGeometry.js │ │ │ ├── Geometry.js │ │ │ ├── PlaneGeometry.js │ │ │ ├── SphereGeometry.js │ │ │ └── TorusKnotGeometry.js │ │ ├── materials/ │ │ │ ├── BasicMaterial.js │ │ │ ├── DepthMaterial.js │ │ │ ├── DistanceMaterial.js │ │ │ ├── LambertMaterial.js │ │ │ ├── LineMaterial.js │ │ │ ├── Material.js │ │ │ ├── PBR2Material.js │ │ │ ├── PBRMaterial.js │ │ │ ├── PhongMaterial.js │ │ │ ├── PointsMaterial.js │ │ │ └── ShaderMaterial.js │ │ ├── projections/ │ │ │ ├── CameraProjection.js │ │ │ ├── OrthographicProjection.js │ │ │ └── PerspectiveProjection.js │ │ ├── targets/ │ │ │ ├── OffscreenRenderTarget.js │ │ │ ├── RenderTargetBase.js │ │ │ └── ScreenRenderTarget.js │ │ └── textures/ │ │ ├── Texture2D.js │ │ ├── Texture2DArray.js │ │ ├── Texture3D.js │ │ ├── TextureBase.js │ │ └── TextureCube.js │ ├── scenes/ │ │ ├── Bone.js │ │ ├── Camera.js │ │ ├── Light.js │ │ ├── Mesh.js │ │ ├── Object3D.js │ │ ├── Scene.js │ │ ├── SkinnedMesh.js │ │ └── lights/ │ │ ├── AmbientLight.js │ │ ├── DirectionalLight.js │ │ ├── DirectionalLightShadow.js │ │ ├── HemisphereLight.js │ │ ├── LightShadow.js │ │ ├── PointLight.js │ │ ├── PointLightShadow.js │ │ ├── RectAreaLight.js │ │ ├── SphericalHarmonicsLight.js │ │ ├── SpotLight.js │ │ └── SpotLightShadow.js │ ├── shaders/ │ │ ├── ShaderChunk.js │ │ ├── ShaderLib.js │ │ ├── shaderChunk/ │ │ │ ├── alphaTest_frag.glsl │ │ │ ├── alphaTest_pars_frag.glsl │ │ │ ├── alphamap_frag.glsl │ │ │ ├── alphamap_pars_frag.glsl │ │ │ ├── alphamap_pars_vert.glsl │ │ │ ├── alphamap_vert.glsl │ │ │ ├── aoMap_frag.glsl │ │ │ ├── aoMap_pars_frag.glsl │ │ │ ├── aoMap_pars_vert.glsl │ │ │ ├── aoMap_vert.glsl │ │ │ ├── begin_frag.glsl │ │ │ ├── begin_vert.glsl │ │ │ ├── bsdfs.glsl │ │ │ ├── bumpMap_pars_frag.glsl │ │ │ ├── clearcoat_pars_frag.glsl │ │ │ ├── clippingPlanes_frag.glsl │ │ │ ├── clippingPlanes_pars_frag.glsl │ │ │ ├── color_frag.glsl │ │ │ ├── color_pars_frag.glsl │ │ │ ├── color_pars_vert.glsl │ │ │ ├── color_vert.glsl │ │ │ ├── common_frag.glsl │ │ │ ├── common_vert.glsl │ │ │ ├── diffuseMap_frag.glsl │ │ │ ├── diffuseMap_pars_frag.glsl │ │ │ ├── diffuseMap_pars_vert.glsl │ │ │ ├── diffuseMap_vert.glsl │ │ │ ├── dithering_frag.glsl │ │ │ ├── dithering_pars_frag.glsl │ │ │ ├── emissiveMap_frag.glsl │ │ │ ├── emissiveMap_pars_frag.glsl │ │ │ ├── emissiveMap_pars_vert.glsl │ │ │ ├── emissiveMap_vert.glsl │ │ │ ├── encodings_frag.glsl │ │ │ ├── encodings_pars_frag.glsl │ │ │ ├── end_frag.glsl │ │ │ ├── envMap_frag.glsl │ │ │ ├── envMap_pars_frag.glsl │ │ │ ├── envMap_pars_vert.glsl │ │ │ ├── envMap_vert.glsl │ │ │ ├── fog_frag.glsl │ │ │ ├── fog_pars_frag.glsl │ │ │ ├── inverse.glsl │ │ │ ├── light_frag.glsl │ │ │ ├── light_pars_frag.glsl │ │ │ ├── logdepthbuf_frag.glsl │ │ │ ├── logdepthbuf_pars_frag.glsl │ │ │ ├── logdepthbuf_pars_vert.glsl │ │ │ ├── logdepthbuf_vert.glsl │ │ │ ├── modelPos_pars_frag.glsl │ │ │ ├── modelPos_pars_vert.glsl │ │ │ ├── modelPos_vert.glsl │ │ │ ├── morphnormal_vert.glsl │ │ │ ├── morphtarget_pars_vert.glsl │ │ │ ├── morphtarget_vert.glsl │ │ │ ├── normalMap_pars_frag.glsl │ │ │ ├── normal_frag.glsl │ │ │ ├── normal_pars_frag.glsl │ │ │ ├── normal_pars_vert.glsl │ │ │ ├── normal_vert.glsl │ │ │ ├── packing.glsl │ │ │ ├── premultipliedAlpha_frag.glsl │ │ │ ├── pvm_vert.glsl │ │ │ ├── shadow.glsl │ │ │ ├── shadowMap_frag.glsl │ │ │ ├── shadowMap_pars_frag.glsl │ │ │ ├── shadowMap_pars_vert.glsl │ │ │ ├── shadowMap_vert.glsl │ │ │ ├── skinning_pars_vert.glsl │ │ │ ├── skinning_vert.glsl │ │ │ ├── skinnormal_vert.glsl │ │ │ ├── specularMap_frag.glsl │ │ │ ├── specularMap_pars_frag.glsl │ │ │ ├── transpose.glsl │ │ │ ├── tsn.glsl │ │ │ ├── uv_pars_frag.glsl │ │ │ ├── uv_pars_vert.glsl │ │ │ └── uv_vert.glsl │ │ └── shaderLib/ │ │ ├── basic_frag.glsl │ │ ├── basic_vert.glsl │ │ ├── depth_frag.glsl │ │ ├── depth_vert.glsl │ │ ├── distance_frag.glsl │ │ ├── distance_vert.glsl │ │ ├── lambert_frag.glsl │ │ ├── lambert_vert.glsl │ │ ├── normaldepth_frag.glsl │ │ ├── normaldepth_vert.glsl │ │ ├── pbr2_frag.glsl │ │ ├── pbr_frag.glsl │ │ ├── pbr_vert.glsl │ │ ├── phong_frag.glsl │ │ ├── phong_vert.glsl │ │ ├── point_frag.glsl │ │ └── point_vert.glsl │ └── webgl/ │ ├── WebGLAttribute.js │ ├── WebGLBuffers.js │ ├── WebGLCapabilities.js │ ├── WebGLClusteredLighting.js │ ├── WebGLConstants.js │ ├── WebGLGeometries.js │ ├── WebGLLights.js │ ├── WebGLMaterials.js │ ├── WebGLProgram.js │ ├── WebGLPrograms.js │ ├── WebGLQuerySets.js │ ├── WebGLRenderBuffers.js │ ├── WebGLRenderTargets.js │ ├── WebGLRenderer.js │ ├── WebGLState.js │ ├── WebGLTextures.js │ ├── WebGLUniforms.js │ └── WebGLVertexArrayBindings.js ├── tests/ │ ├── index.html │ └── unit/ │ ├── source.unit.js │ ├── src/ │ │ ├── EventDispatcher.tests.js │ │ └── math/ │ │ ├── Box2.tests.js │ │ ├── Box3.tests.js │ │ ├── Color3.tests.js │ │ ├── Color4.tests.js │ │ ├── MathUtils.tests.js │ │ ├── Matrix3.tests.js │ │ ├── Matrix4.tests.js │ │ ├── Plane.tests.js │ │ ├── Quaternion.tests.js │ │ ├── Ray.tests.js │ │ ├── Sphere.tests.js │ │ ├── Vector2.tests.js │ │ ├── Vector3.tests.js │ │ └── Vector4.tests.js │ └── utils/ │ └── math-constants.js └── tools/ ├── assimp2json └── doc.config.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ # http://editorconfig.org root = true [*] end_of_line = lf insert_final_newline = false [*.{js,ts,html}] charset = utf-8 indent_style = tab indent_size = 4 [*.{js,ts}] trim_trailing_whitespace = true ================================================ FILE: .gitattributes ================================================ # Set the default behavior, in case people don't have core.autocrlf set. * text=auto ================================================ FILE: .github/contributing.md ================================================ # t3d.js Contributing Guide ## Issue Reporting Guidelines Welcome to use [Github](https://github.com/uinosoft/t3d.js/issues) to report a issues, request a feature, or ask a question. ## Pull Request Guidelines - Don't send PRs to the `master` branch, send them to the `dev` branch instead. - Make sure your code lints (`npm run lint` ...). - Branch naming convention: use kebab naming, and start with `build|ci|docs|feat|fix|perf|refactor|test`, for example: `refactor-addons-pmrem`. - It's OK to have multiple small commits as you work on the PR - GitHub can automatically squash them before merging. ## Development Setup You will need [Node.js](https://nodejs.org), and NPM (which comes with Node.js) installed on your computer. After cloning the repository, run `npm install` to install all dependencies. ## Scripts - `npm run build` - Build the core library to `build/t3d.js` and `build/t3d.module.js` - `npm run dev` - This will watch the source files and rebuild the library whenever they change - `npm run doc` - This will build the api documentation to `docs/` - `npm run lint` - This will lint the source files using ESLint - `npm run server` - This will start a local server where you can view the examples or docs ## Git Commit Message Convention Currently follows [Angular's commit convention](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit). ## Code Formatting Currently, we use eslint to perform code specification and style checks to ensure code uniformity. You can use npm scripts to lint the code, but it is more recommended to use an editor plug-in for automatic code formatting. If you use VSCode, you can install the [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) plug-in and enable the auto-fix option in the settings: ````json { "editor.codeActionsOnSave": { "source.fixAll.eslint": true } } ```` ## Naming Conventions - Variable names use camelCase notation, for example: `camera`, `renderer`. - Class file name, class name uses camel case nomenclature, for example: `OrbitControls.js`, `OrbitControls`. - Use kebab naming for folder names, for example: `kebab`, `kebab-case`. ## Comments We use [JSDoc](https://jsdoc.app/) to generate api documentation, so all the public methods and properties should be documented with JSDoc. ## Project Structure A overview of project structure: ```bash ├─ 📁 .github/ # Github related files │ ├─ 📁 workflows/ # Github ci workflows | ├─ 📄 contributing.md # Contributing guide ├─ 📁 build/ # Build output ├─ 📁 docs/ # Documentation output (not tracked by git) ├─ 📁 examples/ # Examples │ ├─ 📁 jsm/ # Addons for t3d.js, exported to `t3d/addons/` ├─ 📂 node_modules/ # Dependencies (not tracked by git) │ ├─ 📁 rollup # Rollup dependencies │ └─ 📁 ... # Other dependencies (@eslint, @jsdoc, etc.) ├─ 📁 src/ # Source code for core package │ ├─ 📁 ... # The core source files in sub category │ ├─ 📄 main.js # The entry root, export all modules from /src ├─ 📁 tests/ # Tests ├─ 📁 tools/ # Some build tools │ ├─ 📄 doc.config.json # JSDoc config │ ├─ 📄 ... # Other tools ├─ 📄 .editorconfig # Editor config ├─ 📄 .eslintrc.cjs # ESLint config ├─ 📄 .gitignore # Git ignore ├─ 📄 icon.jpg # Icon for t3d.js ├─ 📄 LICENSE # License ├─ 📄 package.json # Package.json for core package ├─ 📄 README.md # Readme └─ 📄 rollup.config.js # Rollup config ``` ## Credits Thank you to all the people who have already contributed to t3d.js! ================================================ FILE: .github/workflows/deploy-to-pages.yml ================================================ name: Deploy examples and docs to Pages on: push: branches: ['dev'] paths-ignore: - 'build/**' workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: 'pages' cancel-in-progress: true jobs: build: name: 'Build job' runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - name: Install Packages run: npm ci - name: Build Docs run: npm run doc - name: Setup Pages uses: actions/configure-pages@v5 - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: '.' deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 ================================================ FILE: .gitignore ================================================ .DS_Store *.swp # Editor directories and files .vscode/* !.vscode/extensions.json .idea .project *.suo *.ntvs* *.njsproj *.sln *.user .vs/ *.sw? # Logs npm-debug.log /docs **/node_modules *.local .jshintrc ================================================ FILE: .vscode/extensions.json ================================================ { "recommendations": [ "dbaeumer.vscode-eslint" ] } ================================================ FILE: LICENSE ================================================ BSD 3-Clause License Copyright (c) 2021-present, uino Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: README.md ================================================ # ThingJS 3D Engine [![NPM Package][npm]][npm-url] ![npm-size][npm-size-url] [![Issues][issues-badge]][issues-badge-url] [![DeepScan grade][deepscan]][deepscan-url] [![Discord][discord]][discord-url] [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/uinosoft/t3d.js) ![Engine Screenshot](./screenshot.png) ThingJS 3D Engine (t3d) is a lightweight, web-first, and extendable 3D rendering library. It is used by ThingJS for web3d rendering, but can also be used as a standalone library. t3d's API borrows the look and feel of three.js—familiar and easy to use—but it is not fully compatible or a drop-in replacement. It keeps a simple, flexible design while adding modern features and extra hooks for real‑time workflows, such as customizable rendering callbacks for finer control and post‑processing, clustered lighting for scalable many‑light scenes, light groups for organizing reusable lights, and other performance-minded optimizations. [Examples](https://uinosoft.github.io/t3d.js/examples/) — [Docs](https://uinosoft.github.io/t3d.js/docs/) — [Discord](https://discord.gg/urB54PPXc4) ## Import Use `t3d.js` or `t3d.min.js` in your page: ````html ```` or import as es6 module: ````javascript import * as t3d from 't3d.module.js'; ```` ## Npm t3d is published on npm. To install, use: ```` npm install t3d --save ```` This will allow you to import t3d entirely using: ````javascript import * as t3d from 't3d'; ```` or individual classes using: ````javascript import { Scene, Renderer } from 't3d'; ```` Since v0.2.0, the JavaScript files in `examples/jsm` can be imported like this: ````javascript import { OrbitControls } from 't3d/addons/controls/OrbitControls.js'; ```` ## CDN * https://unpkg.com/t3d@latest/build/t3d.min.js * https://unpkg.com/t3d@latest/build/t3d.module.js * https://cdn.jsdelivr.net/npm/t3d@latest/build/t3d.min.js * https://cdn.jsdelivr.net/npm/t3d@latest/build/t3d.module.min.js ## Quick Start Create a simple rotating cube with PBR materials: ````javascript // Initialize renderer with WebGL2 const width = window.innerWidth || 2; const height = window.innerHeight || 2; const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; document.body.appendChild(canvas); // Create WebGL2 context and renderer const gl = canvas.getContext('webgl2', { antialias: true, alpha: false }); const renderer = new t3d.WebGLRenderer(gl); const screenRenderTarget = new t3d.ScreenRenderTarget(canvas); screenRenderTarget.setColorClearValue(0.1, 0.1, 0.1, 1); // Create scene const scene = new t3d.Scene(); // Create mesh with PBR material const geometry = new t3d.BoxGeometry(8, 8, 8); const material = new t3d.PBRMaterial(); const mesh = new t3d.Mesh(geometry, material); scene.add(mesh); // Add lighting const ambientLight = new t3d.AmbientLight(0xffffff); scene.add(ambientLight); const directionalLight = new t3d.DirectionalLight(0xffffff); directionalLight.position.set(-5, 5, 5); directionalLight.lookAt(new t3d.Vector3(), new t3d.Vector3(0, 1, 0)); scene.add(directionalLight); // Set up camera const camera = new t3d.Camera(); camera.position.set(0, 10, 30); camera.lookAt(new t3d.Vector3(0, 0, 0), new t3d.Vector3(0, 1, 0)); camera.setPerspective(45 / 180 * Math.PI, width / height, 1, 1000); scene.add(camera); // Animation loop function loop(count) { requestAnimationFrame(loop); // Rotate cube mesh.euler.y = count / 1000 * .5; scene.updateMatrix(); scene.updateRenderStates(camera); scene.updateRenderQueue(camera); renderer.renderScene(scene, camera, screenRenderTarget); } requestAnimationFrame(loop); ```` ## Extensions * [t3d-effect-composer](https://github.com/uinosoft/t3d-effect-composer) - Post Effects extension for t3d.js. * [t3d-particle](https://github.com/uinosoft/t3d-particle) - This is a particle system developed based on t3d.js. * [t3d-pano](https://github.com/uinosoft/t3d-pano) - Panorama extension for t3d. * [t3d-3dtiles](https://github.com/uinosoft/t3d-3dtiles) - A 3dtile extension based on t3d.js. * [t3d-dynamic-sky](https://github.com/uinosoft/t3d-dynamic-sky) - Dynamic sky addon for t3d. * [t3d-gaussian-splatting](https://github.com/uinosoft/t3d-gaussian-splatting) - A t3d-based implementation of 3D Gaussian Splatting. ## Tools * [t3d-model-viewer](https://uinosoft.github.io/t3d-model-viewer/) - A Model Viewer based on t3d.js and t3d-effect-composer. * [t3d-particle-editor](https://uinosoft.github.io/t3d-particle/editor) - A particle editor based on t3d.js and t3d-particle. * [t3d-ibl-baker](https://uinosoft.github.io/t3d-ibl-baker/) - This is a simple tool to bake IBL maps for t3d. ## Contributing Please make sure to read the [Contributing Guide](./.github/contributing.md) before making a pull request. [npm]: https://img.shields.io/npm/v/t3d [npm-url]: https://www.npmjs.com/package/t3d [npm-size-url]: https://img.shields.io/bundlephobia/minzip/t3d [issues-badge]: https://img.shields.io/github/issues/uinosoft/t3d.js.svg [issues-badge-url]: https://github.com/uinosoft/t3d.js/issues [deepscan]: https://deepscan.io/api/teams/20241/projects/25542/branches/800776/badge/grade.svg [deepscan-url]: https://deepscan.io/dashboard#view=project&tid=20241&pid=25542&bid=800776 [discord]: https://img.shields.io/discord/1069800954494464043 [discord-url]: https://discord.gg/urB54PPXc4 ================================================ FILE: build/t3d.js ================================================ /** * @license * Copyright 2021-present uino * SPDX-License-Identifier: BSD-3-Clause */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.t3d = {})); })(this, (function (exports) { 'use strict'; /** * An utility class for mathematical operations. */ class MathUtils { /** * Method for generate uuid. * http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 * @returns {string} - The uuid. */ static generateUUID() { const d0 = Math.random() * 0xffffffff | 0; const d1 = Math.random() * 0xffffffff | 0; const d2 = Math.random() * 0xffffffff | 0; const d3 = Math.random() * 0xffffffff | 0; const uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' + _lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' + _lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] + _lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff]; // .toUpperCase() here flattens concatenated strings to save heap memory space. return uuid.toUpperCase(); } /** * Returns a value linearly interpolated from two known points based on the given interval - t = 0 will return x and t = 1 will return y. * @param {number} x - The first value. * @param {number} y - The second value. * @param {number} t - The interpolation factor. * @returns {number} - The interpolated value. */ static lerp(x, y, t) { return x + (y - x) * t; } /** * Clamps the value to be between min and max. * @param {number} value - Value to be clamped. * @param {number} min - The minimum value. * @param {number} max - The maximum value. * @returns {number} - The clamped value. */ static clamp(value, min, max) { return Math.max(min, Math.min(max, value)); } /** * Compute euclidean modulo of m % n. * Refer to: https://en.wikipedia.org/wiki/Modulo_operation * @param {number} n - The dividend. * @param {number} m - The divisor. * @returns {number} - The result of the modulo operation. */ static euclideanModulo(n, m) { return (n % m + m) % m; } /** * Performs a linear mapping from range `` to range `` * for the given value. * @param {number} x - The value to be mapped. * @param {number} a1 - Minimum value for range A. * @param {number} a2 - Maximum value for range A. * @param {number} b1 - Minimum value for range B. * @param {number} b2 - Maximum value for range B. * @returns {number} The mapped value. */ static mapLinear(x, a1, a2, b1, b2) { return b1 + (x - a1) * (b2 - b1) / (a2 - a1); } /** * Is this number a power of two. * @param {number} value - The input number. * @returns {boolean} - Is this number a power of two. */ static isPowerOfTwo(value) { return (value & value - 1) === 0 && value !== 0; } /** * Return the nearest power of two number of this number. * @param {number} value - The input number. * @returns {number} - The result number. */ static nearestPowerOfTwo(value) { return Math.pow(2, Math.round(Math.log(value) / Math.LN2)); } /** * Return the next power of two number of this number. * @param {number} value - The input number. * @returns {number} - The result number. */ static nextPowerOfTwo(value) { value--; value |= value >> 1; value |= value >> 2; value |= value >> 4; value |= value >> 8; value |= value >> 16; value++; return value; } /** * Return the next power of two square size of this number. * This method is usually used to calculate the minimum 2d texture size based on the pixel length. * @param {number} value - The input number. * @returns {number} - The result size. */ static nextPowerOfTwoSquareSize(value) { return this.nextPowerOfTwo(Math.ceil(Math.sqrt(value))); } /** * Denormalizes a value based on the type of the provided array. * @param {number} value - The value to be denormalized. * @param {TypedArray} array - The typed array to determine the normalization factor. * @returns {number} - The denormalized value. * @throws {Error} - Throws an error if the array type is invalid. */ static denormalize(value, array) { switch (array.constructor) { case Float32Array: return value; case Uint32Array: return value / 4294967295.0; case Uint16Array: return value / 65535.0; case Uint8Array: return value / 255.0; case Int32Array: return Math.max(value / 2147483647.0, -1); case Int16Array: return Math.max(value / 32767.0, -1); case Int8Array: return Math.max(value / 127.0, -1); default: throw new Error('Invalid component type.'); } } /** * Normalizes a value based on the type of the provided array. * @param {number} value - The value to be normalized. * @param {TypedArray} array - The typed array to determine the normalization factor. * @returns {number} - The normalized value. * @throws {Error} - Throws an error if the array type is invalid. */ static normalize(value, array) { switch (array.constructor) { case Float32Array: return value; case Uint32Array: return Math.round(value * 4294967295.0); case Uint16Array: return Math.round(value * 65535.0); case Uint8Array: return Math.round(value * 255.0); case Int32Array: return Math.round(value * 2147483647.0); case Int16Array: return Math.round(value * 32767.0); case Int8Array: return Math.round(value * 127.0); default: throw new Error('Invalid component type.'); } } /** * Converts float to half float. * @param {number} val - The float value. * @returns {number} - The half float value. */ static toHalfFloat(val) { if (Math.abs(val) > 65504) { console.warn('MathUtils.toHalfFloat(): Value out of range.'); val = this.clamp(val, -65504, 65504); } _tables.floatView[0] = val; const f = _tables.uint32View[0]; const e = f >> 23 & 0x1ff; return _tables.baseTable[e] + ((f & 0x007fffff) >> _tables.shiftTable[e]); } /** * Converts half float to float. * @param {number} val - The half float value. * @returns {number} - The float value. */ static fromHalfFloat(val) { const m = val >> 10; _tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 0x3ff)] + _tables.exponentTable[m]; return _tables.floatView[0]; } } const _lut = []; for (let i = 0; i < 256; i++) { _lut[i] = (i < 16 ? '0' : '') + i.toString(16); } // Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf const _tables = _generateTables(); function _generateTables() { // float32 to float16 helpers const buffer = new ArrayBuffer(4); const floatView = new Float32Array(buffer); const uint32View = new Uint32Array(buffer); const baseTable = new Uint32Array(512); const shiftTable = new Uint32Array(512); for (let i = 0; i < 256; ++i) { const e = i - 127; if (e < -27) { // very small number (0, -0) baseTable[i] = 0x0000; baseTable[i | 0x100] = 0x8000; shiftTable[i] = 24; shiftTable[i | 0x100] = 24; } else if (e < -14) { // small number (denorm) baseTable[i] = 0x0400 >> -e - 14; baseTable[i | 0x100] = 0x0400 >> -e - 14 | 0x8000; shiftTable[i] = -e - 1; shiftTable[i | 0x100] = -e - 1; } else if (e <= 15) { // normal number baseTable[i] = e + 15 << 10; baseTable[i | 0x100] = e + 15 << 10 | 0x8000; shiftTable[i] = 13; shiftTable[i | 0x100] = 13; } else if (e < 128) { // large number (Infinity, -Infinity) baseTable[i] = 0x7c00; baseTable[i | 0x100] = 0xfc00; shiftTable[i] = 24; shiftTable[i | 0x100] = 24; } else { // stay (NaN, Infinity, -Infinity) baseTable[i] = 0x7c00; baseTable[i | 0x100] = 0xfc00; shiftTable[i] = 13; shiftTable[i | 0x100] = 13; } } // float16 to float32 helpers const mantissaTable = new Uint32Array(2048); const exponentTable = new Uint32Array(64); const offsetTable = new Uint32Array(64); for (let i = 1; i < 1024; ++i) { let m = i << 13; // zero pad mantissa bits let e = 0; // zero exponent // normalized while ((m & 0x00800000) === 0) { m <<= 1; e -= 0x00800000; // decrement exponent } m &= -8388609; // clear leading 1 bit e += 0x38800000; // adjust bias mantissaTable[i] = m | e; } for (let i = 1024; i < 2048; ++i) { mantissaTable[i] = 0x38000000 + (i - 1024 << 13); } for (let i = 1; i < 31; ++i) { exponentTable[i] = i << 23; } exponentTable[31] = 0x47800000; exponentTable[32] = 0x80000000; for (let i = 33; i < 63; ++i) { exponentTable[i] = 0x80000000 + (i - 32 << 23); } exponentTable[63] = 0xc7800000; for (let i = 1; i < 64; ++i) { if (i !== 32) { offsetTable[i] = 1024; } } return { floatView: floatView, uint32View: uint32View, baseTable: baseTable, shiftTable: shiftTable, mantissaTable: mantissaTable, exponentTable: exponentTable, offsetTable: offsetTable }; } /** * Class representing a 3D vector. */ class Vector3 { /** * Constructs a new 3D vector. * @param {number} [x=0] - The x value of this vector. * @param {number} [y=0] - The y value of this vector. * @param {number} [z=0] - The z value of this vector. */ constructor(x = 0, y = 0, z = 0) { /** * The x value of this vector. * @type {number} */ this.x = x; /** * The y value of this vector. * @type {number} */ this.y = y; /** * The z value of this vector. * @type {number} */ this.z = z; } /** * Sets the vector components. * @param {number} x - The value of the x component. * @param {number} y - The value of the y component. * @param {number} z - The value of the z component. * @returns {Vector3} A reference to this vector. */ set(x = 0, y = 0, z = 0) { this.x = x; this.y = y; this.z = z; return this; } /** * Sets the vector components to the same value. * @param {number} scalar - The value to set for all vector components. * @returns {Vector3} A reference to this vector. */ setScalar(scalar) { this.x = scalar; this.y = scalar; this.z = scalar; return this; } /** * Returns a new vector with copied values from this instance. * @returns {Vector3} A clone of this instance. */ clone() { return new Vector3(this.x, this.y, this.z); } /** * Copies the values of the given vector to this instance. * @param {Vector3} v - The vector to copy. * @returns {Vector3} A reference to this vector. */ copy(v) { this.x = v.x; this.y = v.y; this.z = v.z; return this; } /** * Adds the given vector to this instance. * @param {Vector3} v - The vector to add. * @returns {Vector3} A reference to this vector. */ add(v) { this.x += v.x; this.y += v.y; this.z += v.z; return this; } /** * Adds the given scalar value to all components of this instance. * @param {number} s - The scalar to add. * @returns {Vector3} A reference to this vector. */ addScalar(s) { this.x += s; this.y += s; this.z += s; return this; } /** * Adds the given vectors and stores the result in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ addVectors(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; this.z = a.z + b.z; return this; } /** * Adds the given vector scaled by the given factor to this instance. * @param {Vector3|Vector4} v - The vector. * @param {number} s - The factor that scales `v`. * @returns {Vector3} A reference to this vector. */ addScaledVector(v, s) { this.x += v.x * s; this.y += v.y * s; this.z += v.z * s; return this; } /** * Subtracts the given vector from this instance. * @param {Vector3} v - The vector to subtract. * @returns {Vector3} A reference to this vector. */ sub(v) { this.x -= v.x; this.y -= v.y; this.z -= v.z; return this; } /** * Subtracts the given vectors and stores the result in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; return this; } /** * Multiplies the given vector with this instance. * @param {Vector3} v - The vector to multiply. * @returns {Vector3} A reference to this vector. */ multiply(v) { this.x *= v.x; this.y *= v.y; this.z *= v.z; return this; } /** * Multiplies the given scalar value with all components of this instance. * @param {number} scalar - The scalar to multiply. * @returns {Vector3} A reference to this vector. */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; this.z *= scalar; return this; } /** * Multiplies this vector with the given 3x3 matrix. * @param {Matrix3} m - The 3x3 matrix. * @returns {Vector3} A reference to this vector. */ applyMatrix3(m) { const x = this.x, y = this.y, z = this.z; const e = m.elements; this.x = e[0] * x + e[3] * y + e[6] * z; this.y = e[1] * x + e[4] * y + e[7] * z; this.z = e[2] * x + e[5] * y + e[8] * z; return this; } /** * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and * divides by perspective. * @param {Matrix4} m - The matrix to apply. * @returns {Vector3} A reference to this vector. */ applyMatrix4(m) { const x = this.x, y = this.y, z = this.z; const e = m.elements; const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]); this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w; this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w; this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w; return this; } /** * Applies the given Quaternion to this vector. * @param {Quaternion} q - The Quaternion. * @returns {Vector3} A reference to this vector. */ applyQuaternion(q) { const x = this.x, y = this.y, z = this.z; const qx = q._x, qy = q._y, qz = q._z, qw = q._w; // calculate quat * vector const ix = qw * x + qy * z - qz * y; const iy = qw * y + qz * x - qx * z; const iz = qw * z + qx * y - qy * x; const iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; return this; } /** * Projects this vector from world space into the camera's normalized * device coordinate (NDC) space. * @param {Camera} camera - The camera. * @returns {Vector3} A reference to this vector. */ project(camera) { return this.applyMatrix4(camera.projectionViewMatrix); } /** * Unprojects this vector from the camera's normalized device coordinate (NDC) * space into world space. * @param {Camera} camera - The camera. * @returns {Vector3} A reference to this vector. */ unproject(camera) { return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.worldMatrix); } /** * Transforms the direction of this vector by a matrix (the upper left 3 x 3 * subset of the given 4x4 matrix and then normalizes the result. * @param {Matrix4} m - The matrix. * @returns {Vector3} A reference to this vector. */ transformDirection(m) { // input: Matrix4 affine matrix // vector interpreted as a direction const x = this.x, y = this.y, z = this.z; const e = m.elements; this.x = e[0] * x + e[4] * y + e[8] * z; this.y = e[1] * x + e[5] * y + e[9] * z; this.z = e[2] * x + e[6] * y + e[10] * z; return this.normalize(); } /** * If this vector's x, y or z value is greater than the given vector's x, y or z * value, replace that value with the corresponding min value. * @param {Vector3} v - The vector. * @returns {Vector3} A reference to this vector. */ min(v) { this.x = Math.min(this.x, v.x); this.y = Math.min(this.y, v.y); this.z = Math.min(this.z, v.z); return this; } /** * If this vector's x, y or z value is less than the given vector's x, y or z * value, replace that value with the corresponding max value. * @param {Vector3} v - The vector. * @returns {Vector3} A reference to this vector. */ max(v) { this.x = Math.max(this.x, v.x); this.y = Math.max(this.y, v.y); this.z = Math.max(this.z, v.z); return this; } /** * Inverts this vector - i.e. sets x = -x, y = -y and z = -z. * @returns {Vector3} A reference to this vector. */ negate() { this.x = -this.x; this.y = -this.y; this.z = -this.z; return this; } /** * Calculates the dot product of the given vector with this instance. * @param {Vector3} v - The vector to compute the dot product with. * @returns {number} The result of the dot product. */ dot(v) { return this.x * v.x + this.y * v.y + this.z * v.z; } /** * Computes the square of the Euclidean length (straight-line length) from * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should * compare the length squared instead as it is slightly more efficient to calculate. * @returns {number} The square length of this vector. */ getLengthSquared() { return this.x * this.x + this.y * this.y + this.z * this.z; } /** * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z). * @returns {number} The length of this vector. */ getLength() { return Math.sqrt(this.getLengthSquared()); } /** * Converts this vector to a unit vector - that is, sets it equal to a vector * with the same direction as this one, but with a vector length of `1`. * @param {number} [thickness=1] * @returns {Vector3} A reference to this vector. */ normalize(thickness = 1) { const length = this.getLength() || 1; const invLength = thickness / length; this.x *= invLength; this.y *= invLength; this.z *= invLength; return this; } /** * Linearly interpolates between the given vector and this instance, where * alpha is the percent distance along the line - alpha = 0 will be this * vector, and alpha = 1 will be the given one. * @param {Vector3} v - The vector to interpolate towards. * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. * @returns {Vector3} A reference to this vector. */ lerp(v, alpha) { this.x += (v.x - this.x) * alpha; this.y += (v.y - this.y) * alpha; this.z += (v.z - this.z) * alpha; return this; } /** * Linearly interpolates between the given vectors, where alpha is the percent * distance along the line - alpha = 0 will be first vector, and alpha = 1 will * be the second one. The result is stored in this instance. * @param {Vector3} v1 - The first vector. * @param {Vector3} v2 - The second vector. * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. * @returns {Vector3} A reference to this vector. */ lerpVectors(v1, v2, alpha) { this.x = v1.x + (v2.x - v1.x) * alpha; this.y = v1.y + (v2.y - v1.y) * alpha; this.z = v1.z + (v2.z - v1.z) * alpha; return this; } /** * Calculates the cross product of the given vector with this instance. * @param {Vector3} v - The vector to compute the cross product with. * @returns {Vector3} The result of the cross product. */ cross(v) { return this.crossVectors(this, v); } /** * Calculates the cross product of the given vectors and stores the result * in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ crossVectors(a, b) { const ax = a.x, ay = a.y, az = a.z; const bx = b.x, by = b.y, bz = b.z; this.x = ay * bz - az * by; this.y = az * bx - ax * bz; this.z = ax * by - ay * bx; return this; } /** * Reflects this vector off a plane orthogonal to the given normal vector. * @param {Vector3} normal - The (normalized) normal vector. * @returns {Vector3} A reference to this vector. */ reflect(normal) { return this.sub(_vector$2.copy(normal).multiplyScalar(2 * this.dot(normal))); } /** * Scales this vector along the given direction vector by the given scale factor. * @param {Vector3} direction - The (normalized) direction vector to scale along. * @param {number} scale - The scale factor. * @returns {Vector3} A reference to this vector. */ scaleAlong(direction, scale) { _vector$2.copy(direction).multiplyScalar(this.dot(direction)); return this.sub(_vector$2).addScaledVector(_vector$2, scale); } /** * Returns the angle between the given vector and this instance in radians. * @param {Vector3} v - The vector to compute the angle with. * @returns {number} The angle in radians. */ angleTo(v) { const denominator = Math.sqrt(this.getLengthSquared() * v.getLengthSquared()); if (denominator === 0) return Math.PI / 2; const theta = this.dot(v) / denominator; // clamp, to handle numerical problems return Math.acos(MathUtils.clamp(theta, -1, 1)); } /** * Computes the distance from the given vector to this instance. * @param {Vector3} v - The vector to compute the distance to. * @returns {number} The distance. */ distanceTo(v) { return Math.sqrt(this.distanceToSquared(v)); } /** * Computes the squared distance from the given vector to this instance. * If you are just comparing the distance with another distance, you should compare * the distance squared instead as it is slightly more efficient to calculate. * @param {Vector3} v - The vector to compute the squared distance to. * @returns {number} The squared distance. */ distanceToSquared(v) { const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; return dx * dx + dy * dy + dz * dz; } /** * Sets the vector components from the given spherical coordinates. * @param {Spherical} s - The spherical coordinates. * @returns {Vector3} A reference to this vector. */ setFromSpherical(s) { const sinPhiRadius = Math.sin(s.phi) * s.radius; this.x = sinPhiRadius * Math.sin(s.theta); this.y = Math.cos(s.phi) * s.radius; this.z = sinPhiRadius * Math.cos(s.theta); return this; } /** * Sets the vector components to the position elements of the * given transformation matrix. * @param {Matrix4} m - The 4x4 matrix. * @returns {Vector3} A reference to this vector. */ setFromMatrixPosition(m) { const e = m.elements; this.x = e[12]; this.y = e[13]; this.z = e[14]; return this; } /** * Sets the vector components to the scale elements of the * given transformation matrix. * @param {Matrix4} m - The 4x4 matrix. * @returns {Vector3} A reference to this vector. */ setFromMatrixScale(m) { const sx = this.setFromMatrixColumn(m, 0).getLength(); const sy = this.setFromMatrixColumn(m, 1).getLength(); const sz = this.setFromMatrixColumn(m, 2).getLength(); return this.set(sx, sy, sz); } /** * Sets the vector components from the specified matrix column. * @param {Matrix4} m - The 4x4 matrix. * @param {number} index - The column index. * @returns {Vector3} A reference to this vector. */ setFromMatrixColumn(m, index) { return this.fromArray(m.elements, index * 4); } /** * Returns `true` if this vector is equal with the given one. * @param {Vector3} v - The vector to test for equality. * @returns {boolean} Whether this vector is equal with the given one. */ equals(v) { return v.x === this.x && v.y === this.y && v.z === this.z; } /** * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]` * and z value to be `array[ offset + 2 ]`. * @param {Array} array - An array holding the vector component values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Vector3} A reference to this vector. */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); } this.x = x; this.y = y; this.z = z; return this; } /** * Writes the components of this vector to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the vector components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {Array} The vector components. */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y, z = this.z; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; return array; } *[Symbol.iterator]() { yield this.x; yield this.y; yield this.z; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector3.prototype.isVector3 = true; const _vector$2 = new Vector3(); /** * Represents a 4x4 matrix. */ class Matrix4 { /** * Constructs a new 4x4 matrix. */ constructor() { /** * A column-major list of matrix values. * @type {Array} */ this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; } /** * Sets the elements of the matrix.The arguments are supposed to be * in row-major order. * @param {number} [n11] - 1-1 matrix element. * @param {number} [n12] - 1-2 matrix element. * @param {number} [n13] - 1-3 matrix element. * @param {number} [n14] - 1-4 matrix element. * @param {number} [n21] - 2-1 matrix element. * @param {number} [n22] - 2-2 matrix element. * @param {number} [n23] - 2-3 matrix element. * @param {number} [n24] - 2-4 matrix element. * @param {number} [n31] - 3-1 matrix element. * @param {number} [n32] - 3-2 matrix element. * @param {number} [n33] - 3-3 matrix element. * @param {number} [n34] - 3-4 matrix element. * @param {number} [n41] - 4-1 matrix element. * @param {number} [n42] - 4-2 matrix element. * @param {number} [n43] - 4-3 matrix element. * @param {number} [n44] - 4-4 matrix element. * @returns {Matrix4} A reference to this matrix. */ set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { const ele = this.elements; ele[0] = n11; ele[4] = n12; ele[8] = n13; ele[12] = n14; ele[1] = n21; ele[5] = n22; ele[9] = n23; ele[13] = n24; ele[2] = n31; ele[6] = n32; ele[10] = n33; ele[14] = n34; ele[3] = n41; ele[7] = n42; ele[11] = n43; ele[15] = n44; return this; } /** * Sets this matrix to the 4x4 identity matrix. * @returns {Matrix4} A reference to this matrix. */ identity() { return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); } /** * Checks if the matrix is an identity matrix. * @returns {boolean} - True if the matrix is an identity matrix, false otherwise. */ isIdentity() { const te = this.elements; return te[0] === 1 && te[4] === 0 && te[8] === 0 && te[12] === 0 && te[1] === 0 && te[5] === 1 && te[9] === 0 && te[13] === 0 && te[2] === 0 && te[6] === 0 && te[10] === 1 && te[14] === 0 && te[3] === 0 && te[7] === 0 && te[11] === 0 && te[15] === 1; } /** * Returns a matrix with copied values from this instance. * @returns {Matrix4} A clone of this instance. */ clone() { return new Matrix4().fromArray(this.elements); } /** * Copies the values of the given matrix to this instance. * @param {Matrix4} m - The matrix to copy. * @returns {Matrix4} A reference to this matrix. */ copy(m) { const te = this.elements; const me = m.elements; te[0] = me[0]; te[1] = me[1]; te[2] = me[2]; te[3] = me[3]; te[4] = me[4]; te[5] = me[5]; te[6] = me[6]; te[7] = me[7]; te[8] = me[8]; te[9] = me[9]; te[10] = me[10]; te[11] = me[11]; te[12] = me[12]; te[13] = me[13]; te[14] = me[14]; te[15] = me[15]; return this; } /** * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix. * @param {Matrix3} m - The 3x3 matrix. * @returns {Matrix4} A reference to this matrix. */ setFromMatrix3(m) { const me = m.elements; return this.set(me[0], me[3], me[6], 0, me[1], me[4], me[7], 0, me[2], me[5], me[8], 0, 0, 0, 0, 1); } /** * Extracts the basis of this matrix into the three axis vectors provided. * @param {Vector3} xAxis - The basis's x axis. * @param {Vector3} yAxis - The basis's y axis. * @param {Vector3} zAxis - The basis's z axis. * @returns {Matrix4} A reference to this matrix. */ extractBasis(xAxis, yAxis, zAxis) { xAxis.setFromMatrixColumn(this, 0); yAxis.setFromMatrixColumn(this, 1); zAxis.setFromMatrixColumn(this, 2); return this; } /** * Sets the given basis vectors to this matrix. * @param {Vector3} xAxis - The basis's x axis. * @param {Vector3} yAxis - The basis's y axis. * @param {Vector3} zAxis - The basis's z axis. * @returns {Matrix4} A reference to this matrix. */ makeBasis(xAxis, yAxis, zAxis) { this.set(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1); return this; } /** * Extracts the rotation component of the given matrix * into this matrix's rotation component. * * Note: This method does not support reflection matrices. * @param {Matrix4} m - The matrix. * @returns {Matrix4} A reference to this matrix. */ extractRotation(m) { const te = this.elements; const me = m.elements; const scaleX = 1 / _vec3_1$6.setFromMatrixColumn(m, 0).getLength(); const scaleY = 1 / _vec3_1$6.setFromMatrixColumn(m, 1).getLength(); const scaleZ = 1 / _vec3_1$6.setFromMatrixColumn(m, 2).getLength(); te[0] = me[0] * scaleX; te[1] = me[1] * scaleX; te[2] = me[2] * scaleX; te[3] = 0; te[4] = me[4] * scaleY; te[5] = me[5] * scaleY; te[6] = me[6] * scaleY; te[7] = 0; te[8] = me[8] * scaleZ; te[9] = me[9] * scaleZ; te[10] = me[10] * scaleZ; te[11] = 0; te[12] = 0; te[13] = 0; te[14] = 0; te[15] = 1; return this; } /** * Sets the rotation component (the upper left 3x3 matrix) of this matrix to * the rotation specified by the given Euler angles. The rest of * the matrix is set to the identity. Depending on the {@link Euler#order}, * there are six possible outcomes. See [this page]{@link https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix} * for a complete list. * @param {Euler} euler - The Euler angles. * @returns {Matrix4} A reference to this matrix. */ makeRotationFromEuler(euler) { const te = this.elements; const x = euler.x, y = euler.y, z = euler.z; const a = Math.cos(x), b = Math.sin(x); const c = Math.cos(y), d = Math.sin(y); const e = Math.cos(z), f = Math.sin(z); if (euler.order === 'XYZ') { const ae = a * e, af = a * f, be = b * e, bf = b * f; te[0] = c * e; te[4] = -c * f; te[8] = d; te[1] = af + be * d; te[5] = ae - bf * d; te[9] = -b * c; te[2] = bf - ae * d; te[6] = be + af * d; te[10] = a * c; } else if (euler.order === 'YXZ') { const ce = c * e, cf = c * f, de = d * e, df = d * f; te[0] = ce + df * b; te[4] = de * b - cf; te[8] = a * d; te[1] = a * f; te[5] = a * e; te[9] = -b; te[2] = cf * b - de; te[6] = df + ce * b; te[10] = a * c; } else if (euler.order === 'ZXY') { const ce = c * e, cf = c * f, de = d * e, df = d * f; te[0] = ce - df * b; te[4] = -a * f; te[8] = de + cf * b; te[1] = cf + de * b; te[5] = a * e; te[9] = df - ce * b; te[2] = -a * d; te[6] = b; te[10] = a * c; } else if (euler.order === 'ZYX') { const ae = a * e, af = a * f, be = b * e, bf = b * f; te[0] = c * e; te[4] = be * d - af; te[8] = ae * d + bf; te[1] = c * f; te[5] = bf * d + ae; te[9] = af * d - be; te[2] = -d; te[6] = b * c; te[10] = a * c; } else if (euler.order === 'YZX') { const ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[0] = c * e; te[4] = bd - ac * f; te[8] = bc * f + ad; te[1] = f; te[5] = a * e; te[9] = -b * e; te[2] = -d * e; te[6] = ad * f + bc; te[10] = ac - bd * f; } else if (euler.order === 'XZY') { const ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[0] = c * e; te[4] = -f; te[8] = d * e; te[1] = ac * f + bd; te[5] = a * e; te[9] = ad * f - bc; te[2] = bc * f - ad; te[6] = b * e; te[10] = bd * f + ac; } // bottom row te[3] = 0; te[7] = 0; te[11] = 0; // last column te[12] = 0; te[13] = 0; te[14] = 0; te[15] = 1; return this; } /** * Sets the rotation component of this matrix to the rotation specified by q, as outlined here. * @param {Quaternion} q * @returns {Matrix4} */ makeRotationFromQuaternion(q) { return this.compose(_zero, q, _one); } /** * Constructs a rotation matrix, looking from eye towards center oriented by the up vector. * @param {Vector3} eye - The eye vector. * @param {Vector3} target - The target vector. * @param {Vector3} up - The up vector. * @returns {Matrix4} A reference to this matrix. */ lookAtRH(eye, target, up) { const te = this.elements; _z.subVectors(eye, target); if (_z.getLengthSquared() === 0) { // eye and target are in the same position _z.z = 1; } _z.normalize(); _x.crossVectors(up, _z); if (_x.getLengthSquared() === 0) { // up and z are parallel if (Math.abs(up.z) === 1) { _z.x += 0.0001; } else { _z.z += 0.0001; } _z.normalize(); _x.crossVectors(up, _z); } _x.normalize(); _y.crossVectors(_z, _x); te[0] = _x.x; te[4] = _y.x; te[8] = _z.x; te[1] = _x.y; te[5] = _y.y; te[9] = _z.y; te[2] = _x.z; te[6] = _y.z; te[10] = _z.z; return this; } /** * Post-multiplies this matrix by the given 4x4 matrix. * @param {Matrix4} m - The matrix to multiply with. * @returns {Matrix4} A reference to this matrix. */ multiply(m) { return this.multiplyMatrices(this, m); } /** * Pre-multiplies this matrix by the given 4x4 matrix. * @param {Matrix4} m - The matrix to multiply with. * @returns {Matrix4} A reference to this matrix. */ premultiply(m) { return this.multiplyMatrices(m, this); } /** * Multiples the given 4x4 matrices and stores the result * in this matrix. * @param {Matrix4} a - The first matrix. * @param {Matrix4} b - The second matrix. * @returns {Matrix4} A reference to this matrix. */ multiplyMatrices(a, b) { const ae = a.elements; const be = b.elements; const te = this.elements; const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; return this; } /** * Computes and returns the determinant of this matrix. * Based on the method outlined [here]{@link http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html}. * @returns {number} The determinant. */ determinant() { const te = this.elements; const n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12]; const n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13]; const n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14]; const n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15]; // TODO: make this more efficient return n41 * (+n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34) + n42 * (+n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31) + n43 * (+n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31) + n44 * (-n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31); } /** * Transposes this matrix in place. * @returns {Matrix4} A reference to this matrix. */ transpose() { const te = this.elements; let tmp; tmp = te[1]; te[1] = te[4]; te[4] = tmp; tmp = te[2]; te[2] = te[8]; te[8] = tmp; tmp = te[6]; te[6] = te[9]; te[9] = tmp; tmp = te[3]; te[3] = te[12]; te[12] = tmp; tmp = te[7]; te[7] = te[13]; te[13] = tmp; tmp = te[11]; te[11] = te[14]; te[14] = tmp; return this; } /** * Sets the position component for this matrix from the given vector, * without affecting the rest of the matrix. * @param {number|Vector3} x - The x component of the vector or alternatively the vector object. * @param {number} y - The y component of the vector. * @param {number} z - The z component of the vector. * @returns {Matrix4} A reference to this matrix. */ setPosition(x, y, z) { const te = this.elements; if (x.isVector3) { te[12] = x.x; te[13] = x.y; te[14] = x.z; } else { te[12] = x; te[13] = y; te[14] = z; } return this; } /** * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}. * You can not invert with a determinant of zero. If you attempt this, the method produces * a zero matrix instead. * @returns {Matrix4} A reference to this matrix. */ invert() { // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n41 = te[3], n12 = te[4], n22 = te[5], n32 = te[6], n42 = te[7], n13 = te[8], n23 = te[9], n33 = te[10], n43 = te[11], n14 = te[12], n24 = te[13], n34 = te[14], n44 = te[15], t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const detInv = 1 / det; te[0] = t11 * detInv; te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv; te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv; te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv; te[4] = t12 * detInv; te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv; te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv; te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv; te[8] = t13 * detInv; te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv; te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv; te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv; te[12] = t14 * detInv; te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv; te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv; te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv; return this; } /** * Gets the maximum scale value of the three axes. * @returns {number} The maximum scale. */ getMaxScaleOnAxis() { const te = this.elements; const scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2]; const scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6]; const scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10]; return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)); } /** * Sets this matrix as a translation transform from the given vector. * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector. * @param {number} y - The amount to translate in the Y axis. * @param {number} z - The amount to translate in the z axis. * @returns {Matrix4} A reference to this matrix. */ makeTranslation(x, y, z) { if (x.isVector3) { this.set(1, 0, 0, x.x, 0, 1, 0, x.y, 0, 0, 1, x.z, 0, 0, 0, 1); } else { this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1); } return this; } /** * Sets this matrix as a rotational transformation around the given axis by * the given angle. * This is a somewhat controversial but mathematically sound alternative to * rotating via Quaternions. See the discussion [here]{@link https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199}. * @param {Vector3} axis - The normalized rotation axis. * @param {number} angle - The rotation in radians. * @returns {Matrix4} A reference to this matrix. */ makeRotationAxis(axis, angle) { // Based on http://www.gamedev.net/reference/articles/article1199.asp const c = Math.cos(angle); const s = Math.sin(angle); const t = 1 - c; const x = axis.x, y = axis.y, z = axis.z; const tx = t * x, ty = t * y; return this.set(tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1); } /** * Sets this matrix as a scale transformation. * @param {number} x - The amount to scale in the X axis. * @param {number} y - The amount to scale in the Y axis. * @param {number} z - The amount to scale in the Z axis. * @returns {Matrix4} A reference to this matrix. */ makeScale(x, y, z) { return this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1); } /** * Sets this matrix to the transformation composed of the given position, * rotation (Quaternion) and scale. * @param {Vector3} position - The position vector. * @param {Quaternion} quaternion - The rotation as a Quaternion. * @param {Vector3} scale - The scale vector. * @returns {Matrix4} A reference to this matrix. */ compose(position, quaternion, scale) { const te = this.elements; const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; const x2 = x + x, y2 = y + y, z2 = z + z; const xx = x * x2, xy = x * y2, xz = x * z2; const yy = y * y2, yz = y * z2, zz = z * z2; const wx = w * x2, wy = w * y2, wz = w * z2; const sx = scale.x, sy = scale.y, sz = scale.z; te[0] = (1 - (yy + zz)) * sx; te[1] = (xy + wz) * sx; te[2] = (xz - wy) * sx; te[3] = 0; te[4] = (xy - wz) * sy; te[5] = (1 - (xx + zz)) * sy; te[6] = (yz + wx) * sy; te[7] = 0; te[8] = (xz + wy) * sz; te[9] = (yz - wx) * sz; te[10] = (1 - (xx + yy)) * sz; te[11] = 0; te[12] = position.x; te[13] = position.y; te[14] = position.z; te[15] = 1; return this; } /** * Decomposes this matrix into its position, rotation and scale components * and provides the result in the given objects. * Note: Not all matrices are decomposable in this way. For example, if an * object has a non-uniformly scaled parent, then the object's world matrix * may not be decomposable, and this method may not be appropriate. * @param {Vector3} position - The position vector. * @param {Quaternion} quaternion - The rotation as a Quaternion. * @param {Vector3} scale - The scale vector. * @returns {Matrix4} A reference to this matrix. */ decompose(position, quaternion, scale) { const te = this.elements; let sx = _vec3_1$6.set(te[0], te[1], te[2]).getLength(); const sy = _vec3_1$6.set(te[4], te[5], te[6]).getLength(); const sz = _vec3_1$6.set(te[8], te[9], te[10]).getLength(); // if determine is negative, we need to invert one scale const det = this.determinant(); if (det < 0) { sx = -sx; } position.x = te[12]; position.y = te[13]; position.z = te[14]; // scale the rotation part _mat4_1$3.copy(this); const invSX = 1 / sx; const invSY = 1 / sy; const invSZ = 1 / sz; _mat4_1$3.elements[0] *= invSX; _mat4_1$3.elements[1] *= invSX; _mat4_1$3.elements[2] *= invSX; _mat4_1$3.elements[4] *= invSY; _mat4_1$3.elements[5] *= invSY; _mat4_1$3.elements[6] *= invSY; _mat4_1$3.elements[8] *= invSZ; _mat4_1$3.elements[9] *= invSZ; _mat4_1$3.elements[10] *= invSZ; quaternion.setFromRotationMatrix(_mat4_1$3); scale.x = sx; scale.y = sy; scale.z = sz; return this; } /** * Returns `true` if this matrix is equal with the given one. * @param {Matrix4} matrix - The matrix to test for equality. * @returns {boolean} Whether this matrix is equal with the given one. */ equals(matrix) { const te = this.elements; const me = matrix.elements; for (let i = 0; i < 16; i++) { if (te[i] !== me[i]) return false; } return true; } /** * Sets the elements of the matrix from the given array. * @param {Array} array - The matrix elements in column-major order. * @param {number} [offset=0] - Index of the first element in the array. * @returns {Matrix4} A reference to this matrix. */ fromArray(array, offset = 0) { for (let i = 0; i < 16; i++) { this.elements[i] = array[i + offset]; } return this; } /** * Writes the elements of this matrix to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order. * @param {number} [offset=0] - Index of the first element in the array. * @returns {Array} The matrix elements in column-major order. */ toArray(array = [], offset = 0) { const te = this.elements; array[offset] = te[0]; array[offset + 1] = te[1]; array[offset + 2] = te[2]; array[offset + 3] = te[3]; array[offset + 4] = te[4]; array[offset + 5] = te[5]; array[offset + 6] = te[6]; array[offset + 7] = te[7]; array[offset + 8] = te[8]; array[offset + 9] = te[9]; array[offset + 10] = te[10]; array[offset + 11] = te[11]; array[offset + 12] = te[12]; array[offset + 13] = te[13]; array[offset + 14] = te[14]; array[offset + 15] = te[15]; return array; } /** * Linearly interpolates between two matrix4. * @param {Matrix4} m1 * @param {Matrix4} m2 * @param {number} ratio * @returns {Matrix4} */ lerpMatrices(m1, m2, ratio) { if (ratio === 0) return this.copy(m1); if (ratio === 1) return this.copy(m2); const te = this.elements, te1 = m1.elements, te2 = m2.elements; for (let i = 0; i < 16; i++) { te[i] = te1[i] * (1 - ratio) + te2[i] * ratio; } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Matrix4.prototype.isMatrix4 = true; const _vec3_1$6 = new Vector3(); const _mat4_1$3 = new Matrix4(); const _zero = new Vector3(0, 0, 0); const _one = new Vector3(1, 1, 1); const _x = new Vector3(); const _y = new Vector3(); const _z = new Vector3(); /** * Class for representing a Quaternion. */ class Quaternion { /** * Constructs a new quaternion. * @param {number} [x=0] - The x value of this quaternion. * @param {number} [y=0] - The y value of this quaternion. * @param {number} [z=0] - The z value of this quaternion. * @param {number} [w=1] - The w value of this quaternion. */ constructor(x = 0, y = 0, z = 0, w = 1) { this._x = x; this._y = y; this._z = z; this._w = w; } /** * Interpolates between two quaternions via SLERP. This implementation assumes the * quaternion data are managed in flat arrays. * @param {Array} dst - The destination array. * @param {number} dstOffset - An offset into the destination array. * @param {Array} src0 - The source array of the first quaternion. * @param {number} srcOffset0 - An offset into the first source array. * @param {Array} src1 - The source array of the second quaternion. * @param {number} srcOffset1 - An offset into the second source array. * @param {number} t - The interpolation factor in the range `[0,1]`. * @see {@link Quaternion#slerp} */ static slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) { let x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3]; let x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3]; if (t <= 0) { dst[dstOffset + 0] = x0; dst[dstOffset + 1] = y0; dst[dstOffset + 2] = z0; dst[dstOffset + 3] = w0; return; } if (t >= 1) { dst[dstOffset + 0] = x1; dst[dstOffset + 1] = y1; dst[dstOffset + 2] = z1; dst[dstOffset + 3] = w1; return; } if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { let dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1; if (dot < 0) { x1 = -x1; y1 = -y1; z1 = -z1; w1 = -w1; dot = -dot; } let s = 1 - t; if (dot < 0.9995) { // slerp const theta = Math.acos(dot); const sin = Math.sin(theta); s = Math.sin(s * theta) / sin; t = Math.sin(t * theta) / sin; x0 = x0 * s + x1 * t; y0 = y0 * s + y1 * t; z0 = z0 * s + z1 * t; w0 = w0 * s + w1 * t; } else { // for small angles, lerp then normalize x0 = x0 * s + x1 * t; y0 = y0 * s + y1 * t; z0 = z0 * s + z1 * t; w0 = w0 * s + w1 * t; const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0); x0 *= f; y0 *= f; z0 *= f; w0 *= f; } } dst[dstOffset] = x0; dst[dstOffset + 1] = y0; dst[dstOffset + 2] = z0; dst[dstOffset + 3] = w0; } /** * Multiplies two quaternions. This implementation assumes the quaternion data are managed * in flat arrays. * @param {Array} dst - The destination array. * @param {number} dstOffset - An offset into the destination array. * @param {Array} src0 - The source array of the first quaternion. * @param {number} srcOffset0 - An offset into the first source array. * @param {Array} src1 - The source array of the second quaternion. * @param {number} srcOffset1 - An offset into the second source array. * @returns {Array} The destination array. * @see {@link Quaternion#multiplyQuaternions} */ static multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) { const x0 = src0[srcOffset0]; const y0 = src0[srcOffset0 + 1]; const z0 = src0[srcOffset0 + 2]; const w0 = src0[srcOffset0 + 3]; const x1 = src1[srcOffset1]; const y1 = src1[srcOffset1 + 1]; const z1 = src1[srcOffset1 + 2]; const w1 = src1[srcOffset1 + 3]; dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; return dst; } /** * The x value of this quaternion. * @type {number} * @default 0 */ get x() { return this._x; } set x(value) { this._x = value; this.onChangeCallback(); } /** * The y value of this quaternion. * @type {number} * @default 0 */ get y() { return this._y; } set y(value) { this._y = value; this.onChangeCallback(); } /** * The z value of this quaternion. * @type {number} * @default 0 */ get z() { return this._z; } set z(value) { this._z = value; this.onChangeCallback(); } /** * The w value of this quaternion. * @type {number} * @default 1 */ get w() { return this._w; } set w(value) { this._w = value; this.onChangeCallback(); } /** * Sets the quaternion components. * @param {number} x - The x value of this quaternion. * @param {number} y - The y value of this quaternion. * @param {number} z - The z value of this quaternion. * @param {number} w - The w value of this quaternion. * @returns {Quaternion} A reference to this quaternion. */ set(x, y, z, w) { this._x = x; this._y = y; this._z = z; this._w = w; this.onChangeCallback(); return this; } /** * Returns a new quaternion with copied values from this instance. * @returns {Quaternion} A clone of this instance. */ clone() { return new Quaternion(this._x, this._y, this._z, this._w); } /** * Copies the values of the given quaternion to this instance. * @param {Quaternion} quaternion - The quaternion to copy. * @returns {Quaternion} A reference to this quaternion. */ copy(quaternion) { this._x = quaternion.x; this._y = quaternion.y; this._z = quaternion.z; this._w = quaternion.w; this.onChangeCallback(); return this; } /** * Sets this quaternion from the rotation specified by the given * Euler angles. * @param {Euler} euler - The Euler angles. * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. * @returns {Quaternion} A reference to this quaternion. */ setFromEuler(euler, update = true) { const c1 = Math.cos(euler._x / 2); const c2 = Math.cos(euler._y / 2); const c3 = Math.cos(euler._z / 2); const s1 = Math.sin(euler._x / 2); const s2 = Math.sin(euler._y / 2); const s3 = Math.sin(euler._z / 2); const order = euler._order; if (order === 'XYZ') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'YXZ') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if (order === 'ZXY') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'ZYX') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if (order === 'YZX') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'XZY') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } if (update === true) this.onChangeCallback(); return this; } /** * Sets this quaternion from the given axis and angle. * @param {Vector3} axis - The normalized axis. * @param {number} angle - The angle in radians. * @returns {Quaternion} A reference to this quaternion. */ setFromAxisAngle(axis, angle) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm const halfAngle = angle / 2, s = Math.sin(halfAngle); this._x = axis.x * s; this._y = axis.y * s; this._z = axis.z * s; this._w = Math.cos(halfAngle); this.onChangeCallback(); return this; } /** * Sets this quaternion from the given rotation matrix. * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled). * @returns {Quaternion} A reference to this quaternion. */ setFromRotationMatrix(m) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) const te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10], trace = m11 + m22 + m33; let s; if (trace > 0) { s = 0.5 / Math.sqrt(trace + 1.0); this._w = 0.25 / s; this._x = (m32 - m23) * s; this._y = (m13 - m31) * s; this._z = (m21 - m12) * s; } else if (m11 > m22 && m11 > m33) { s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33); this._w = (m32 - m23) / s; this._x = 0.25 * s; this._y = (m12 + m21) / s; this._z = (m13 + m31) / s; } else if (m22 > m33) { s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33); this._w = (m13 - m31) / s; this._x = (m12 + m21) / s; this._y = 0.25 * s; this._z = (m23 + m32) / s; } else { s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22); this._w = (m21 - m12) / s; this._x = (m13 + m31) / s; this._y = (m23 + m32) / s; this._z = 0.25 * s; } this.onChangeCallback(); return this; } /** * Sets this quaternion to the rotation required to rotate the direction vector * `vFrom` to the direction vector `vTo`. * @param {Vector3} vFrom - The first (normalized) direction vector. * @param {Vector3} vTo - The second (normalized) direction vector. * @returns {Quaternion} A reference to this quaternion. */ setFromUnitVectors(vFrom, vTo) { // assumes direction vectors vFrom and vTo are normalized let r = vFrom.dot(vTo) + 1; if (r < 1e-8) { // vFrom and vTo point in opposite directions r = 0; if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) { this._x = -vFrom.y; this._y = vFrom.x; this._z = 0; this._w = r; } else { this._x = 0; this._y = -vFrom.z; this._z = vFrom.y; this._w = r; } } else { // crossVectors(vFrom, vTo); // inlined to avoid cyclic dependency on Vector3 this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; this._w = r; } return this.normalize(); } /** * Returns the angle between this quaternion and the given one in radians. * @param {Quaternion} q - The quaternion to compute the angle with. * @returns {number} The angle in radians. */ angleTo(q) { return 2 * Math.acos(Math.abs(MathUtils.clamp(this.dot(q), -1, 1))); } /** * Sets this quaternion to the identity quaternion; that is, to the * quaternion that represents "no rotation". * @returns {Quaternion} A reference to this quaternion. */ identity() { return this.set(0, 0, 0, 1); } /** * Returns the rotational conjugate of this quaternion. The conjugate of a * quaternion represents the same rotation in the opposite direction about * the rotational axis. * @returns {Quaternion} A reference to this quaternion. */ conjugate() { this._x *= -1; this._y *= -1; this._z *= -1; this.onChangeCallback(); return this; } /** * Calculates the dot product of this quaternion and the given one. * @param {Quaternion} v - The quaternion to compute the dot product with. * @returns {number} The result of the dot product. */ dot(v) { return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; } /** * Computes the squared Euclidean length (straight-line length) of this quaternion, * considered as a 4 dimensional vector. This can be useful if you are comparing the * lengths of two quaternions, as this is a slightly more efficient calculation than * {@link Quaternion#length}. * @returns {number} The squared Euclidean length. */ lengthSq() { return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; } /** * Computes the Euclidean length (straight-line length) of this quaternion, * considered as a 4 dimensional vector. * @returns {number} The Euclidean length. */ length() { return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w); } /** * Normalizes this quaternion - that is, calculated the quaternion that performs * the same rotation as this one, but has a length equal to `1`. * @returns {Quaternion} A reference to this quaternion. */ normalize() { let l = this.length(); if (l === 0) { this._x = 0; this._y = 0; this._z = 0; this._w = 1; } else { l = 1 / l; this._x = this._x * l; this._y = this._y * l; this._z = this._z * l; this._w = this._w * l; } this.onChangeCallback(); return this; } /** * Multiplies this quaternion by the given one. * @param {Quaternion} q - The quaternion. * @returns {Quaternion} A reference to this quaternion. */ multiply(q) { return this.multiplyQuaternions(this, q); } /** * Pre-multiplies this quaternion by the given one. * @param {Quaternion} q - The quaternion. * @returns {Quaternion} A reference to this quaternion. */ premultiply(q) { return this.multiplyQuaternions(q, this); } /** * Multiplies the given quaternions and stores the result in this instance. * @param {Quaternion} a - The first quaternion. * @param {Quaternion} b - The second quaternion. * @returns {Quaternion} A reference to this quaternion. */ multiplyQuaternions(a, b) { // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; this.onChangeCallback(); return this; } /** * Linearly interpolates between two quaternions. * @param {Quaternion} q1 * @param {Quaternion} q2 * @param {number} ratio * @returns {Quaternion} */ lerpQuaternions(q1, q2, ratio) { if (ratio === 0) return this.copy(q1); if (ratio === 1) return this.copy(q2); const w1 = q1._w, x1 = q1._x, y1 = q1._y, z1 = q1._z; let w2 = q2._w, x2 = q2._x, y2 = q2._y, z2 = q2._z; const dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2; // shortest direction if (dot < 0) { w2 = -w2; x2 = -x2; y2 = -y2; z2 = -z2; } this._w = w1 + ratio * (w2 - w1); this._x = x1 + ratio * (x2 - x1); this._y = y1 + ratio * (y2 - y1); this._z = z1 + ratio * (z2 - z1); const len = 1.0 / Math.sqrt(this._w * this._w + this._x * this._x + this._y * this._y + this._z * this._z); this._w *= len; this._x *= len; this._y *= len; this._z *= len; this.onChangeCallback(); return this; } /** * Performs a spherical linear interpolation between quaternions. * @param {Quaternion} qb - The target quaternion. * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. * @returns {Quaternion} A reference to this quaternion. */ slerp(qb, t) { if (t <= 0) return this; if (t >= 1) return this.copy(qb); // copy calls onChangeCallback() let x = qb._x, y = qb._y, z = qb._z, w = qb._w; let dot = this.dot(qb); if (dot < 0) { x = -x; y = -y; z = -z; w = -w; dot = -dot; } let s = 1 - t; if (dot < 0.9995) { // slerp const theta = Math.acos(dot); const sin = Math.sin(theta); s = Math.sin(s * theta) / sin; t = Math.sin(t * theta) / sin; this._x = this._x * s + x * t; this._y = this._y * s + y * t; this._z = this._z * s + z * t; this._w = this._w * s + w * t; this.onChangeCallback(); } else { // for small angles, lerp then normalize this._x = this._x * s + x * t; this._y = this._y * s + y * t; this._z = this._z * s + z * t; this._w = this._w * s + w * t; this.normalize(); // normalize calls onChangeCallback() } return this; } /** * Performs a spherical linear interpolation between the given quaternions * and stores the result in this quaternion. * @param {Quaternion} qa - The source quaternion. * @param {Quaternion} qb - The target quaternion. * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. * @returns {Quaternion} A reference to this quaternion. */ slerpQuaternions(qa, qb, t) { return this.copy(qa).slerp(qb, t); } /** * Returns `true` if this quaternion is equal with the given one. * @param {Quaternion} quaternion - The quaternion to test for equality. * @returns {boolean} Whether this quaternion is equal with the given one. */ equals(quaternion) { return quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w; } /** * Sets this quaternion's components from the given array. * @param {Array} array - An array holding the quaternion component values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Quaternion} A reference to this quaternion. */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2], w = array[offset + 3]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); w = MathUtils.denormalize(w, array); } this._x = x; this._y = y; this._z = z; this._w = w; this.onChangeCallback(); return this; } /** * Writes the components of this quaternion to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the quaternion components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {Quaternion} The quaternion components. */ toArray(array = [], offset = 0, normalize = false) { let x = this._x, y = this._y, z = this._z, w = this._w; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); w = MathUtils.normalize(w, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; array[offset + 3] = w; return array; } /** * Convert the current quaternion to a matrix4. * @param {Matrix4} target - The target matrix to write the quaternion data to. * @returns {Matrix4} The target matrix with the quaternion data written to it. */ toMatrix4(target = new Matrix4()) { const ele = target.elements; const xy2 = 2.0 * this._x * this._y, xz2 = 2.0 * this._x * this._z, xw2 = 2.0 * this._x * this._w; const yz2 = 2.0 * this._y * this._z, yw2 = 2.0 * this._y * this._w, zw2 = 2.0 * this._z * this._w; const xx = this._x * this._x, yy = this._y * this._y, zz = this._z * this._z, ww = this._w * this._w; ele[0] = xx - yy - zz + ww; ele[4] = xy2 - zw2; ele[8] = xz2 + yw2; ele[12] = 0; ele[1] = xy2 + zw2; ele[5] = -xx + yy - zz + ww; ele[9] = yz2 - xw2; ele[13] = 0; ele[2] = xz2 - yw2; ele[6] = yz2 + xw2; ele[10] = -xx - yy + zz + ww; ele[14] = 0; ele[3] = 0.0; ele[7] = 0.0; ele[11] = 0; ele[15] = 1; return target; } /** * Registers a callback that is called whenever the quaternion's * angle value changes. * @param {Function} callback - When the Quaternion angle value changes, the callback method is triggered * @returns {Quaternion} A reference to this quaternion. */ onChange(callback) { this.onChangeCallback = callback; return this; } onChangeCallback() {} *[Symbol.iterator]() { yield this._x; yield this._y; yield this._z; yield this._w; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Quaternion.prototype.isQuaternion = true; /** * Interpolant serves as the base class for all interpolation algorithms. * It defines a set of static methods that are intended to be invoked by a keyframe track for the purpose of interpolation. * @abstract */ class KeyframeInterpolant { /** * Get the value size for keyframe values. * @returns {number} - the value size. */ static getValueSize() { return this.values.length / this.times.length; } /** * Interpolate the value for the specified time. * @param {number} index0 - the index of the first keyframe. * @param {number} ratio - the ratio (0-1) of the time passed between the first keyframe and the next keyframe. * @param {number} duration - the duration time between the first keyframe and the next keyframe. * @param {Array} outBuffer - the output buffer to store the interpolated value. * @returns {Array} - the output buffer to store the interpolated value. */ static interpolate(index0, ratio, duration, outBuffer) { throw new Error('Interpolant: call to abstract method'); } /** * Copy the value for the specified index. * @param {number} index - the index of the keyframe. * @param {Array} outBuffer - the output buffer to store the copied value. * @returns {Array} - the output buffer to store the copied value. */ static copyValue(index, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Step (Discrete) interpolation of keyframe values. * @extends KeyframeInterpolant */ class StepInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index0; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Linear interpolation of keyframe values. * @extends KeyframeInterpolant */ class LinearInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, offset0 = index0 * valueSize, offset1 = (index0 + 1) * valueSize; let value1, value2; for (let i = 0; i < valueSize; i++) { value1 = values[offset0 + i]; value2 = values[offset1 + i]; if (value1 !== undefined && value2 !== undefined) { outBuffer[i] = value1 * (1 - ratio) + value2 * ratio; } else { outBuffer[i] = value1; } } return outBuffer; } } /** * Quaternion Linear interpolation of keyframe values. * @extends KeyframeInterpolant */ class QuaternionLinearInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize; Quaternion.slerpFlat(outBuffer, 0, values, index0 * valueSize, values, (index0 + 1) * valueSize, ratio); return outBuffer; } } /** * Cubic spline interpolation of keyframe values. * @extends KeyframeInterpolant */ class CubicSplineInterpolant extends KeyframeInterpolant { static getValueSize() { return this.values.length / this.times.length / 3; } static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, valueSize2 = valueSize * 2, valueSize3 = valueSize * 3, rr = ratio * ratio, rrr = rr * ratio, offset0 = index0 * valueSize3, offset1 = offset0 + valueSize3, s2 = -2 * rrr + 3 * rr, s3 = rrr - rr, s0 = 1 - s2, s1 = s3 - rr + ratio; // Layout of keyframe output values for CUBICSPLINE animations: // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] for (let i = 0; i < valueSize; i++) { const p0 = values[offset0 + i + valueSize], // splineVertex_k m0 = values[offset0 + i + valueSize2] * duration, // outTangent_k * (t_k+1 - t_k) p1 = values[offset1 + i + valueSize], // splineVertex_k+1 m1 = values[offset1 + i] * duration; // inTangent_k+1 * (t_k+1 - t_k) outBuffer[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; } return outBuffer; } static copyValue(index, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index * 3 + valueSize; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Quaternion Cubic spline interpolation of keyframe values. * @extends CubicSplineInterpolant */ class QuaternionCubicSplineInterpolant extends CubicSplineInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const result = super.interpolate(index0, ratio, duration, outBuffer); _q.fromArray(result).normalize().toArray(result); return result; } } const _q = new Quaternion(); /** * Base class for property track. * @abstract */ class KeyframeTrack { /** * @param {Object3D|Material} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant = LinearInterpolant) { this.target = target; this.propertyPath = propertyPath; this.name = this.target.uuid + '.' + propertyPath; this.times = times; this.values = values; this.valueSize = 0; this.interpolant = null; // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = LinearInterpolant; } else if (interpolant === false) { interpolant = StepInterpolant; } this.setInterpolant(interpolant); } /** * Set interpolant for this keyframe track. * @param {KeyframeInterpolant.constructor} interpolant * @returns {KeyframeTrack} */ setInterpolant(interpolant) { this.valueSize = interpolant.getValueSize.call(this); this.interpolant = interpolant; return this; } /** * Get value at time. * The value will be interpolated by interpolant if time is between keyframes. * @param {number} t - time * @param {Array} outBuffer - output buffer * @returns {Array} output buffer */ getValue(t, outBuffer) { const interpolant = this.interpolant, times = this.times, tl = times.length; if (t <= times[0]) { return interpolant.copyValue.call(this, 0, outBuffer); } else if (t >= times[tl - 1]) { return interpolant.copyValue.call(this, tl - 1, outBuffer); } // TODO use index cache for better performance // https://github.com/mrdoob/three.js/blob/dev/src/math/Interpolant.js let i0 = tl - 1; while (t < times[i0] && i0 > 0) { i0--; } const duration = times[i0 + 1] - times[i0]; const ratio = (t - times[i0]) / duration; return interpolant.interpolate.call(this, i0, ratio, duration, outBuffer); } } /** * Used for boolean property track. * @extends KeyframeTrack */ class BooleanKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant] */ constructor(target, propertyPath, times, values, interpolant = StepInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = StepInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'bool' */ BooleanKeyframeTrack.prototype.valueTypeName = 'bool'; /** * Used for color property track. * @extends KeyframeTrack */ class ColorKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'color' */ ColorKeyframeTrack.prototype.valueTypeName = 'color'; /** * Used for number property track. * @extends KeyframeTrack */ class NumberKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'number' */ NumberKeyframeTrack.prototype.valueTypeName = 'number'; /** * Used for quaternion property track. * @extends KeyframeTrack */ class QuaternionKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=QuaternionLinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant = QuaternionLinearInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = QuaternionLinearInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'quaternion' */ QuaternionKeyframeTrack.prototype.valueTypeName = 'quaternion'; /** * Used for string property track. * @extends KeyframeTrack */ class StringKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant] */ constructor(target, propertyPath, times, values, interpolant = StepInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = StepInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'string' */ StringKeyframeTrack.prototype.valueTypeName = 'string'; /** * Used for vector property track. * @extends KeyframeTrack */ class VectorKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'vector' */ VectorKeyframeTrack.prototype.valueTypeName = 'vector'; /** * Enum for material Type. * @readonly * @enum {string} */ const MATERIAL_TYPE = { BASIC: 'basic', LAMBERT: 'lambert', PHONG: 'phong', PBR: 'pbr', PBR2: 'pbr2', POINT: 'point', LINE: 'line', SHADER: 'shader', DEPTH: 'depth', DISTANCE: 'distance' }; /** * Enum for blend Type. * @readonly * @enum {string} */ const BLEND_TYPE = { NONE: 'none', NORMAL: 'normal', ADD: 'add', SUB: 'sub', MUL: 'mul', CUSTOM: 'custom' }; /** * Enum for blend equation. * @readonly * @enum {number} */ const BLEND_EQUATION = { ADD: 100, SUBTRACT: 101, REVERSE_SUBTRACT: 102, /** Only webgl2 */ MIN: 103, MAX: 104 }; /** * Enum for blend factor. * @readonly * @enum {number} */ const BLEND_FACTOR = { ZERO: 200, ONE: 201, SRC_COLOR: 202, SRC_ALPHA: 203, SRC_ALPHA_SATURATE: 204, DST_COLOR: 205, DST_ALPHA: 206, ONE_MINUS_SRC_COLOR: 207, ONE_MINUS_SRC_ALPHA: 208, ONE_MINUS_DST_COLOR: 209, ONE_MINUS_DST_ALPHA: 210 }; /** * Enum for cull face Type. * @readonly * @enum {string} */ const CULL_FACE_TYPE = { NONE: 'none', FRONT: 'front', BACK: 'back', FRONT_AND_BACK: 'front_and_back' }; /** * Enum for draw side. * @readonly * @enum {string} */ const DRAW_SIDE = { FRONT: 'front', BACK: 'back', DOUBLE: 'double' }; /** * Enum for shading side. * @readonly * @enum {string} */ const SHADING_TYPE = { SMOOTH_SHADING: 'smooth_shading', FLAT_SHADING: 'flat_shading' }; /** * Enum for pixel format. * @readonly * @enum {number} */ const PIXEL_FORMAT = { DEPTH_COMPONENT: 1000, DEPTH_STENCIL: 1001, STENCIL_INDEX8: 1002, ALPHA: 1003, RED: 1004, RGB: 1005, RGBA: 1006, LUMINANCE: 1007, LUMINANCE_ALPHA: 1008, /** Only webgl2 */ RED_INTEGER: 1010, RG: 1011, RG_INTEGER: 1012, RGB_INTEGER: 1013, RGBA_INTEGER: 1014, /** Only internal formats and webgl2 */ R32F: 1100, R16F: 1101, R8: 1102, RG32F: 1103, RG16F: 1104, RG8: 1105, RGB32F: 1106, RGB16F: 1107, RGB8: 1108, RGBA32F: 1109, RGBA16F: 1110, RGBA8: 1111, RGBA4: 1112, RGB5_A1: 1113, DEPTH_COMPONENT32F: 1114, DEPTH_COMPONENT24: 1115, DEPTH_COMPONENT16: 1116, DEPTH24_STENCIL8: 1117, DEPTH32F_STENCIL8: 1118, R11F_G11F_B10F: 1119, /** For compressed texture formats */ RGB_S3TC_DXT1: 1200, RGBA_S3TC_DXT1: 1201, RGBA_S3TC_DXT3: 1202, RGBA_S3TC_DXT5: 1203, RGB_PVRTC_4BPPV1: 1204, RGB_PVRTC_2BPPV1: 1205, RGBA_PVRTC_4BPPV1: 1206, RGBA_PVRTC_2BPPV1: 1207, RGB_ETC1: 1208, RGBA_ASTC_4x4: 1209, RGBA_BPTC: 1210, RGB_BPTC_SIGNED_FORMAT: 1211, RGB_BPTC_UNSIGNED_FORMAT: 1212 }; /** * Enum for pixel Type. * @readonly * @enum {number} */ const PIXEL_TYPE = { UNSIGNED_BYTE: 1500, UNSIGNED_SHORT_5_6_5: 1501, UNSIGNED_SHORT_4_4_4_4: 1502, UNSIGNED_SHORT_5_5_5_1: 1503, UNSIGNED_SHORT: 1504, UNSIGNED_INT: 1505, UNSIGNED_INT_24_8: 1506, FLOAT: 1507, HALF_FLOAT: 1508, FLOAT_32_UNSIGNED_INT_24_8_REV: 1509, BYTE: 1510, SHORT: 1511, INT: 1512 }; /** * Enum for texture filter. * @readonly * @enum {number} */ const TEXTURE_FILTER = { NEAREST: 1600, LINEAR: 1601, NEAREST_MIPMAP_NEAREST: 1602, LINEAR_MIPMAP_NEAREST: 1603, NEAREST_MIPMAP_LINEAR: 1604, LINEAR_MIPMAP_LINEAR: 1605 }; /** * Enum for texture wrap. * @readonly * @enum {number} */ const TEXTURE_WRAP = { REPEAT: 1700, CLAMP_TO_EDGE: 1701, MIRRORED_REPEAT: 1702 }; /** * Enum for compare function. * @readonly * @enum {number} */ const COMPARE_FUNC = { LEQUAL: 0x0203, GEQUAL: 0x0206, LESS: 0x0201, GREATER: 0x0204, EQUAL: 0x0202, NOTEQUAL: 0x0205, ALWAYS: 0x0207, NEVER: 0x0200 }; /** * Enum for operation. * @readonly * @enum {number} */ const OPERATION = { KEEP: 0x1E00, REPLACE: 0x1E01, INCR: 0x1E02, DECR: 0x1E03, INVERT: 0x150A, INCR_WRAP: 0x8507, DECR_WRAP: 0x8508 }; /** * Enum for Shadow Type. * @readonly * @enum {string} */ const SHADOW_TYPE = { HARD: 'hard', POISSON_SOFT: 'poisson_soft', VOGEL5_SOFT: 'vogel5_soft', PCF3_SOFT: 'pcf3_soft', PCF5_SOFT: 'pcf5_soft', /** Only webgl2 */ PCSS16_SOFT: 'pcss16_soft', PCSS32_SOFT: 'pcss32_soft', PCSS64_SOFT: 'pcss64_soft' }; /** * Enum for Texel Encoding Type. * @readonly * @enum {string} */ const TEXEL_ENCODING_TYPE = { LINEAR: 'linear', SRGB: 'sRGB', GAMMA: 'Gamma' }; /** * Enum for Envmap Combine Type. * @readonly * @enum {string} */ const ENVMAP_COMBINE_TYPE = { MULTIPLY: 'ENVMAP_BLENDING_MULTIPLY', MIX: 'ENVMAP_BLENDING_MIX', ADD: 'ENVMAP_BLENDING_ADD' }; /** * Enum for Draw Mode. * @readonly * @enum {number} */ const DRAW_MODE = { POINTS: 0, LINES: 1, LINE_LOOP: 2, LINE_STRIP: 3, TRIANGLES: 4, TRIANGLE_STRIP: 5, TRIANGLE_FAN: 6 }; /** * Enum for Vertex Color. * @readonly * @enum {number} */ const VERTEX_COLOR = { NONE: 0, RGB: 1, RGBA: 2 }; /** * Enum for ATTACHMENT * @readonly * @enum {number} */ const ATTACHMENT = { COLOR_ATTACHMENT0: 2000, COLOR_ATTACHMENT1: 2001, COLOR_ATTACHMENT2: 2002, COLOR_ATTACHMENT3: 2003, COLOR_ATTACHMENT4: 2004, COLOR_ATTACHMENT5: 2005, COLOR_ATTACHMENT6: 2006, COLOR_ATTACHMENT7: 2007, COLOR_ATTACHMENT8: 2008, COLOR_ATTACHMENT9: 2009, COLOR_ATTACHMENT10: 2010, COLOR_ATTACHMENT11: 2011, COLOR_ATTACHMENT12: 2012, COLOR_ATTACHMENT13: 2013, COLOR_ATTACHMENT14: 2014, COLOR_ATTACHMENT15: 2015, DEPTH_ATTACHMENT: 2020, STENCIL_ATTACHMENT: 2021, DEPTH_STENCIL_ATTACHMENT: 2030 }; /** * Enum for BUFFER_USAGE * @readonly * @enum {number} */ const BUFFER_USAGE = { STREAM_DRAW: 35040, STREAM_READ: 35041, STREAM_COPY: 35042, STATIC_DRAW: 35044, STATIC_READ: 35045, STATIC_COPY: 35046, DYNAMIC_DRAW: 35048, DYNAMIC_READ: 35049, DYNAMIC_COPY: 35050 }; /** * Enum for QUERYSET_TYPE * @readonly * @enum {number} */ const QUERYSET_TYPE = { OCCLUSION: 8000, TIMESTAMP: 8001 }; /** * JavaScript events for custom objects. */ class EventDispatcher { /** * Adds a listener to an event type. * @param {string} type - The type of event to listen to. * @param {Function} listener - The function that gets called when the event is fired. */ addEventListener(type, listener) { if (this._listeners === undefined) this._listeners = {}; const listeners = this._listeners; if (listeners[type] === undefined) { listeners[type] = []; } if (listeners[type].indexOf(listener) === -1) { listeners[type].push(listener); } } /** * Removes a listener from an event type. * @param {string} type - The type of the listener that gets removed. * @param {Function} listener - The listener function that gets removed. */ removeEventListener(type, listener) { const listeners = this._listeners; if (listeners === undefined) return; const listenerArray = listeners[type]; if (listenerArray !== undefined) { const index = listenerArray.indexOf(listener); if (index !== -1) { listenerArray.splice(index, 1); } } } /** * Fire an event. * @param {object} event - The event that gets fired. */ dispatchEvent(event) { const listeners = this._listeners; if (listeners === undefined) return; const listenerArray = listeners[event.type]; if (listenerArray !== undefined) { event.target = this; // Make a copy, in case listeners are removed while iterating. const array = listenerArray.slice(0); for (let i = 0, l = array.length; i < l; i++) { array[i].call(this, event); } event.target = null; } } } /** * AnimationAction wraps AnimationClip and is mainly responsible for the update logic of time. * You can extend other functions by inheriting this class, such as repeat playback, pingpang, etc. * And since this class inherits from EventDispatcher, animation events can also be extended. * @extends EventDispatcher */ class AnimationAction extends EventDispatcher { /** * @param {KeyframeClip} clip - The keyframe clip for this action. */ constructor(clip) { super(); /** * The keyframe clip for this action. * @type {KeyframeClip} */ this.clip = clip; /** * The degree of influence of this action (in the interval [0, 1]). * Values can be used to blend between several actions. * @type {number} * @default 0 */ this.weight = 0; /** * The local time of this action (in seconds). * @type {number} */ this.time = 0; /** * The blend mode for this action, currently only two values BLEND_TYPE.NORMAL and BLEND_TYPE.ADD are available. * @type {BLEND_TYPE} * @default {BLEND_TYPE.NORMAL} */ this.blendMode = BLEND_TYPE.NORMAL; } /** * Update time. * @param {number} deltaTime - The delta time in seconds. */ update(deltaTime) { this.time += deltaTime; const endTime = this.clip.duration; if (endTime === 0) { this.time = 0; return; } if (this.time > endTime) { this.time = this.time % endTime; } if (this.time < 0) { this.time = this.time % endTime + endTime; } } } /** * This holds a reference to a real property in the scene graph; used internally. * Binding property and value, mixer for multiple values. */ class PropertyBindingMixer { /** * @param {Object3D|Material} target * @param {string} propertyPath * @param {string} typeName - vector/bool/string/quaternion/number/color * @param {number} valueSize */ constructor(target, propertyPath, typeName, valueSize) { this.target = null; this.property = ''; this.parseBinding(target, propertyPath); this.valueSize = valueSize; let BufferType = Float64Array; let mixFunction, mixFunctionAdditive, setIdentity; switch (typeName) { case 'quaternion': mixFunction = slerp; mixFunctionAdditive = slerpAdditive; setIdentity = setIdentityQuaternion; break; case 'string': case 'bool': BufferType = Array; mixFunction = select; mixFunctionAdditive = select; setIdentity = setIdentityOther; break; default: mixFunction = lerp; mixFunctionAdditive = lerpAdditive; setIdentity = setIdentityNumeric; } // [ incoming | accu | orig | addAccu ] this.buffer = new BufferType(valueSize * 4); this._mixBufferFunction = mixFunction; this._mixBufferFunctionAdditive = mixFunctionAdditive; this._setIdentity = setIdentity; this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; // cache whether the bound property should be treated as an array-like value // (treat existing arrays or types with toArray/fromArray as array bindings, // or when valueSize > 1) const boundValue = this.target && this.target[this.property]; this._isArrayProperty = this.valueSize > 1 || Array.isArray(boundValue) || boundValue && (typeof boundValue.toArray === 'function' || typeof boundValue.fromArray === 'function'); } parseBinding(target, propertyPath) { propertyPath = propertyPath.split('.'); if (propertyPath.length > 1) { let property = target[propertyPath[0]]; for (let index = 1; index < propertyPath.length - 1; index++) { property = property[propertyPath[index]]; } this.property = propertyPath[propertyPath.length - 1]; this.target = property; } else { this.property = propertyPath[0]; this.target = target; } } /** * Remember the state of the bound property and copy it to both accus. */ saveOriginalState() { const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * 2; // get value if (this._isArrayProperty) { if (this.target[this.property].toArray) { this.target[this.property].toArray(buffer, originalValueOffset); } else { setArray(buffer, this.target[this.property], originalValueOffset, stride); } } else { this.target[this.property] = buffer[originalValueOffset]; } // accu[0..1] := orig -- initially detect changes against the original for (let i = stride, e = originalValueOffset; i !== e; ++i) { buffer[i] = buffer[originalValueOffset + i % stride]; } // Add to identify for additive this._setIdentity(buffer, stride * 3, stride, originalValueOffset); this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; } /** * Apply the state previously taken via 'saveOriginalState' to the binding. */ restoreOriginalState() { const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * 2; // accu[0..1] := orig -- initially detect changes against the original for (let i = stride, e = originalValueOffset; i !== e; ++i) { buffer[i] = buffer[originalValueOffset + i % stride]; } this.apply(); } /** * Accumulate value. * @param {number} weight */ accumulate(weight) { const buffer = this.buffer, stride = this.valueSize, offset = stride; let currentWeight = this.cumulativeWeight; if (currentWeight === 0) { for (let i = 0; i !== stride; ++i) { buffer[offset + i] = buffer[i]; } currentWeight = weight; } else { currentWeight += weight; const mix = weight / currentWeight; this._mixBufferFunction(buffer, offset, 0, mix, stride); } this.cumulativeWeight = currentWeight; } /** * Additive Accumulate value. * @param {number} weight */ accumulateAdditive(weight) { const buffer = this.buffer, stride = this.valueSize, offset = stride * 3; if (this.cumulativeWeightAdditive === 0) { this._setIdentity(buffer, offset, stride, stride * 2); } this._mixBufferFunctionAdditive(buffer, offset, 0, weight, stride); this.cumulativeWeightAdditive += weight; } /** * Apply to scene graph. */ apply() { const buffer = this.buffer, stride = this.valueSize, weight = this.cumulativeWeight, weightAdditive = this.cumulativeWeightAdditive; this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; if (weight < 1) { // accuN := accuN + original * ( 1 - cumulativeWeight ) const originalValueOffset = stride * 2; this._mixBufferFunction(buffer, stride, originalValueOffset, 1 - weight, stride); } if (weightAdditive > 0) { // accuN := accuN + additive accuN this._mixBufferFunctionAdditive(buffer, stride, 3 * stride, 1, stride); } // set value if (this._isArrayProperty) { if (this.target[this.property].fromArray) { this.target[this.property].fromArray(buffer, stride); } else { getArray(this.target[this.property], buffer, stride, stride); } } else { this.target[this.property] = buffer[stride]; } if (this.target.isTransformUV) { this.target.needsUpdate = true; } } } // Mix functions function select(buffer, dstOffset, srcOffset, t, stride) { if (t >= 0.5) { for (let i = 0; i !== stride; ++i) { buffer[dstOffset + i] = buffer[srcOffset + i]; } } } function slerp(buffer, dstOffset, srcOffset, t) { Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t); } const tempQuternionBuffer = new Float64Array(4); function slerpAdditive(buffer, dstOffset, srcOffset, t) { // Store result in tempQuternionBuffer Quaternion.multiplyQuaternionsFlat(tempQuternionBuffer, 0, buffer, dstOffset, buffer, srcOffset); // Slerp to the result Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, tempQuternionBuffer, 0, t); } function lerp(buffer, dstOffset, srcOffset, t, stride) { const s = 1 - t; for (let i = 0; i !== stride; ++i) { const j = dstOffset + i; buffer[j] = buffer[j] * s + buffer[srcOffset + i] * t; } } function lerpAdditive(buffer, dstOffset, srcOffset, t, stride) { for (let i = 0; i !== stride; ++i) { const j = dstOffset + i; buffer[j] = buffer[j] + buffer[srcOffset + i] * t; } } // identity function setIdentityNumeric(buffer, offset, stride) { for (let i = 0; i < stride; i++) { buffer[offset + i] = 0; } } function setIdentityQuaternion(buffer, offset) { setIdentityNumeric(buffer, offset, 3); buffer[offset + 3] = 1; } function setIdentityOther(buffer, offset, stride, copyOffset) { for (let i = 0; i < stride; i++) { buffer[offset + i] = buffer[copyOffset + i]; } } // get array function getArray(target, source, stride, count) { for (let i = 0; i < count; i++) { target[i] = source[stride + i]; } } function setArray(target, source, stride, count) { for (let i = 0; i < count; i++) { target[stride + i] = source[i]; } } /** * The AnimationMixer is a player for animations on a particular object in the scene. * When multiple objects in the scene are animated independently, one AnimationMixer may be used for each object. */ class AnimationMixer { constructor() { this._actions = []; this._bindings = {}; } /** * Add an action to this mixer. * @param {AnimationAction} action - The action to add. */ addAction(action) { if (this._actions.indexOf(action) !== -1) { console.warn('AnimationMixer.addAction(): already has the action, clip name is <' + action.clip.name + '>.'); return; } this._actions.push(action); const tracks = action.clip.tracks; for (let i = 0; i < tracks.length; i++) { const track = tracks[i]; const trackName = track.name; if (!this._bindings[trackName]) { const binding = new PropertyBindingMixer(track.target, track.propertyPath, track.valueTypeName, track.valueSize); this._bindings[trackName] = { binding, referenceCount: 0, active: false, cachedActive: false }; } this._bindings[trackName].referenceCount++; } } /** * Remove an action from this mixer. * @param {AnimationAction} action - The action to be removed. */ removeAction(action) { const index = this._actions.indexOf(action); if (index === -1) { console.warn('AnimationMixer.removeAction(): action not found in this mixer, clip name is <' + action.clip.name + '>.'); return; } if (action.weight > 0) { console.warn('AnimationMixer.removeAction(): make sure action\'s weight is zero before removing it.'); return; } this._actions.splice(index, 1); const tracks = action.clip.tracks; for (let i = 0; i < tracks.length; i++) { const trackName = tracks[i].name; const bindingInfo = this._bindings[trackName]; if (bindingInfo) { if (--bindingInfo.referenceCount <= 0) { if (bindingInfo.cachedActive) { bindingInfo.binding.restoreOriginalState(); } delete this._bindings[trackName]; } } } } /** * Whether has this action. * @param {AnimationAction} action - The action. * @returns {boolean} */ hasAction(action) { return this._actions.indexOf(action) > -1; } /** * Get all actions. * @returns {AnimationAction[]} */ getActions() { return this._actions; } /** * Advances the global mixer time and updates the animation. * @param {number} deltaTime - The delta time in seconds. */ update(deltaTime) { // Mark active to false for all bindings. for (const bindingName in this._bindings) { this._bindings[bindingName].active = false; } // Update the time of actions with a weight greater than 1 // And accumulate those bindings for (let i = 0, l = this._actions.length; i < l; i++) { const action = this._actions[i]; if (action.weight > 0) { action.update(deltaTime); const tracks = action.clip.tracks; for (let j = 0, tl = tracks.length; j < tl; j++) { const track = tracks[j]; const bindingInfo = this._bindings[track.name]; const binding = bindingInfo.binding; bindingInfo.active = true; if (!bindingInfo.cachedActive) { bindingInfo.binding.saveOriginalState(); bindingInfo.cachedActive = true; } track.getValue(action.time, binding.buffer); if (action.blendMode === BLEND_TYPE.ADD) { binding.accumulateAdditive(action.weight); } else { binding.accumulate(action.weight); } } } } // Apply all bindings. for (const bindingName in this._bindings) { const bindingInfo = this._bindings[bindingName]; if (bindingInfo.active) { bindingInfo.binding.apply(); } else { if (bindingInfo.cachedActive) { bindingInfo.binding.restoreOriginalState(); bindingInfo.cachedActive = false; } } } } } /** * An KeyframeClip is a reusable set of keyframe tracks which represent an animation. */ class KeyframeClip { /** * @param {string} [name=''] - A name for this clip. * @param {KeyframeTrack[]} [tracks=[]] - An array of KeyframeTracks. * @param {number} [duration] - The duration of this clip (in seconds). If not passed, the duration will be calculated from the passed tracks array. */ constructor(name = '', tracks = [], duration = -1) { /** * A name for this clip. * @type {string} */ this.name = name; /** * An array of KeyframeTracks. * @type {KeyframeTrack[]} */ this.tracks = tracks; /** * The duration of this clip (in seconds). * If a negative value is passed, the duration will be calculated from the passed tracks array. * @type {number} */ this.duration = duration; if (this.duration < 0) { this.resetDuration(); } } /** * Sets the duration of the clip to the duration of its longest KeyframeTrack. * @returns {KeyframeClip} */ resetDuration() { const tracks = this.tracks; let duration = 0; for (let i = 0, l = tracks.length; i < l; i++) { const track = tracks[i]; duration = Math.max(duration, track.times[track.times.length - 1]); } this.duration = duration; return this; } } /** * Handles and keeps track of loaded and pending data. A default global * instance of this class is created and used by loaders if not supplied * manually. * In general that should be sufficient, however there are times when it can * be useful to have separate loaders - for example if you want to show * separate loading bars for objects and textures. * ```js * const manager = new LoadingManager( * () => console.log('All items loaded!'), * (url, itemsLoaded, itemsTotal) => { * console.log(`Loaded ${itemsLoaded} of ${itemsTotal} items`); * }, * url => console.error(`Error loading ${url}`) * ); * ``` */ class LoadingManager { /** * Constructs a new loading manager. * @param {Function} [onLoad] - Executes when all items have been loaded. * @param {Function} [onProgress] - Executes when single items have been loaded. * @param {Function} [onError] - Executes when an error occurs. */ constructor(onLoad, onProgress, onError) { this.isLoading = false; this.itemsLoaded = 0; this.itemsTotal = 0; this.urlModifier = undefined; /** * Executes when an item starts loading. * @type {Function|undefined} * @default undefined */ this.onStart = undefined; /** * Executes when all items have been loaded. * @type {Function|undefined} * @default undefined */ this.onLoad = onLoad; /** * Executes when single items have been loaded. * @type {Function|undefined} * @default undefined */ this.onProgress = onProgress; /** * Executes when an error occurs. * @type {Function|undefined} * @default undefined */ this.onError = onError; } /** * This should be called by any loader using the manager when the loader * starts loading an item. * @param {string} url - The URL to load. */ itemStart(url) { this.itemsTotal++; if (this.isLoading === false) { if (this.onStart !== undefined) { this.onStart(url, this.itemsLoaded, this.itemsTotal); } } this.isLoading = true; } /** * This should be called by any loader using the manager when the loader * ended loading an item. * @param {string} url - The URL of the loaded item. */ itemEnd(url) { this.itemsLoaded++; if (this.onProgress !== undefined) { this.onProgress(url, this.itemsLoaded, this.itemsTotal); } if (this.itemsLoaded === this.itemsTotal) { this.isLoading = false; if (this.onLoad !== undefined) { this.onLoad(); } } } /** * This should be called by any loader using the manager when the loader * encounters an error when loading an item. * @param {string} url - The URL of the item that produces an error. */ itemError(url) { if (this.onError !== undefined) { this.onError(url); } } /** * Given a URL, uses the URL modifier callback (if any) and returns a * resolved URL. If no URL modifier is set, returns the original URL. * @param {string} url - The URL to load. * @returns {string} The resolved URL. */ resolveURL(url) { if (this.urlModifier) { return this.urlModifier(url); } return url; } /** * If provided, the callback will be passed each resource URL before a * request is sent. The callback may return the original URL, or a new URL to * override loading behavior. This behavior can be used to load assets from * .ZIP files, drag-and-drop APIs, and Data URIs. * @param {Function} transform - URL modifier callback. Called with an URL and must return a resolved URL. * @returns {LoadingManager} A reference to this loading manager. * @example * const blobs = { 'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3 }; * * const manager = new LoadingManager(); * * // Initialize loading manager with URL callback. * const objectURLs = []; * manager.setURLModifier(url => { * url = URL.createObjectURL(blobs[url]); * objectURLs.push(url); * return url; * }); * * // Load as usual, then revoke the blob URLs. * const loader = new GLTFLoader(manager); * loader.load('fish.gltf', gltf => { * scene.add(gltf.scene); * objectURLs.forEach(url => URL.revokeObjectURL(url)); * }); */ setURLModifier(transform) { this.urlModifier = transform; return this; } } /** * The global default loading manager. * @type {LoadingManager} */ const DefaultLoadingManager = new LoadingManager(); /** * Abstract base class for loaders. * @abstract */ class Loader { /** * Constructs a new Loader. * @param {LoadingManager} [manager=DefaultLoadingManager] - The loading manager. */ constructor(manager) { /** * The loading manager. * @type {LoadingManager} * @default DefaultLoadingManager */ this.manager = manager !== undefined ? manager : DefaultLoadingManager; /** * The crossOrigin string to implement CORS for loading the url from a * different domain that allows CORS. * @type {string} * @default 'anonymous' */ this.crossOrigin = 'anonymous'; /** * Whether the XMLHttpRequest uses credentials. * @type {boolean} * @default false */ this.withCredentials = false; /** * The base path from which the asset will be loaded. * @type {string} * @default '' */ this.path = ''; /** * The [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header} * used in HTTP request. * @type {object} * @default {} */ this.requestHeader = {}; } /** * This method needs to be implement by all concrete loaders. * It holds the logic for loading the asset from the backend. * @param {string} url - The path/URL of the file to be loaded. * @param {Function} onLoad - Executed when the loading process has been finished. * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress. * @param {onErrorCallback} [onError] - Executed when errors occur. */ load(url, onLoad, onProgress, onError) {} /** * A async version of {@link Loader#load}. * @param {string} url - The path/URL of the file to be loaded. * @param {Function} [onProgress] - Executed while the loading is in progress. * @returns {Promise} A Promise that resolves when the asset has been loaded. */ loadAsync(url, onProgress) { const scope = this; return new Promise(function (resolve, reject) { scope.load(url, resolve, onProgress, reject); }); } /** * Sets the `crossOrigin` String to implement CORS for loading the URL * from a different domain that allows CORS. * @param {string} crossOrigin - The `crossOrigin` value. * @returns {Loader} A reference to this instance. */ setCrossOrigin(crossOrigin) { this.crossOrigin = crossOrigin; return this; } /** * Whether the XMLHttpRequest uses credentials such as cookies, authorization * headers or TLS client certificates, see [XMLHttpRequest.withCredentials]{@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}. * Note: This setting has no effect if you are loading files locally or from the same domain. * @param {boolean} value - The `withCredentials` value. * @returns {Loader} A reference to this instance. */ setWithCredentials(value) { this.withCredentials = value; return this; } /** * Sets the base path for the asset. * @param {string} path - The base path. * @returns {Loader} A reference to this instance. */ setPath(path) { this.path = path; return this; } /** * Sets the given request header. * @param {object} requestHeader - A [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header} * for configuring the HTTP request. * @returns {Loader} A reference to this instance. */ setRequestHeader(requestHeader) { this.requestHeader = requestHeader; return this; } } /** * A low level class for loading resources with the Fetch API, used internally by * most loaders. It can also be used directly to load any file type that does * not have a loader. * ```js * const loader = new FileLoader(); * const data = await loader.loadAsync('example.txt'); * ``` * @extends Loader */ class FileLoader extends Loader { /** * Constructs a new file loader. * @param {LoadingManager} [manager] - The loading manager. */ constructor(manager) { super(manager); /** * The expected response type. See {@link FileLoader.setResponseType}. * @type {'arraybuffer'|'blob'|'document'|'json'|''} * @default '' */ this.responseType = ''; /** * The expected mimeType. See {@link FileLoader.setMimeType}. * @type {string} * @default '' */ this.mimeType = ''; } /** * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback. * @param {string} url — The path/URL of the file to be loaded. This can also be a data URI. * @param {Function} [onLoad] — Executed when the loading process has been finished. The argument is the loaded data. * @param {onProgressCallback} [onProgress] — Executed while the loading is in progress. * @param {onErrorCallback} [onError] — Executed when errors occur. */ load(url, onLoad, onProgress, onError) { if (url === undefined) url = ''; if (this.path != undefined) url = this.path + url; url = this.manager.resolveURL(url); // create request const req = new Request(url, { headers: new Headers(this.requestHeader), credentials: this.withCredentials ? 'include' : 'same-origin' // An abort controller could be added within a future PR }); // record states ( avoid data race ) const mimeType = this.mimeType; const responseType = this.responseType; // start the fetch fetch(req).then(response => { if (response.status === 200 || response.status === 0) { // Some browsers return HTTP Status 0 when using non-http protocol // e.g. 'file://' or 'data://'. Handle as success. if (response.status === 0) { console.warn('FileLoader: HTTP Status 0 received.'); } // Workaround: Checking if response.body === undefined for Alipay browser #23548 if (typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined) { return response; } const reader = response.body.getReader(); // Nginx needs X-File-Size check // https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content const contentLength = response.headers.get('X-File-Size') || response.headers.get('Content-Length'); const total = contentLength ? parseInt(contentLength) : 0; const lengthComputable = total !== 0; let loaded = 0; // periodically read data into the new stream tracking while download progress const stream = new ReadableStream({ start(controller) { readData(); function readData() { reader.read().then(({ done, value }) => { if (done) { controller.close(); } else { loaded += value.byteLength; const event = new ProgressEvent('progress', { lengthComputable, loaded, total }); if (onProgress) onProgress(event); controller.enqueue(value); readData(); } }, error => { controller.error(error); }); } } }); return new Response(stream); } else { throw new HttpError(`fetch for "${response.url}" responded with ${response.status}: ${response.statusText}`, response); } }).then(response => { switch (responseType) { case 'arraybuffer': return response.arrayBuffer(); case 'blob': return response.blob(); case 'document': return response.text().then(text => { const parser = new DOMParser(); return parser.parseFromString(text, mimeType); }); case 'json': return response.json(); default: if (mimeType === '') { return response.text(); } else { // sniff encoding const re = /charset="?([^;"\s]*)"?/i; const exec = re.exec(mimeType); const label = exec && exec[1] ? exec[1].toLowerCase() : undefined; const decoder = new TextDecoder(label); return response.arrayBuffer().then(ab => decoder.decode(ab)); } } }).then(data => { if (onLoad) onLoad(data); }).catch(err => { onError && onError(err); this.manager.itemError(url); }).finally(() => { this.manager.itemEnd(url); }); this.manager.itemStart(url); } /** * Sets the expected response type. * @param {'arraybuffer'|'blob'|'document'|'json'|''} value - The response type. * @returns {FileLoader} A reference to this file loader. */ setResponseType(value) { this.responseType = value; return this; } /** * Sets the expected mime type of the loaded file. * @param {string} value - The mime type. * @returns {FileLoader} A reference to this file loader. */ setMimeType(value) { this.mimeType = value; return this; } } class HttpError extends Error { constructor(message, response) { super(message); this.response = response; } } /** * A loader for loading images. The class loads images with the HTML `Image` API. * Please note that 'ImageLoader' not support progress events. * ```js * const loader = new ImageLoader(); * const image = await loader.loadAsync('image.png'); * ``` * @extends Loader */ class ImageLoader extends Loader { /** * Constructs a new image loader. * @param {LoadingManager} [manager] - The loading manager. */ constructor(manager) { super(manager); } /** * Starts loading from the given URL and passes the loaded image * to the `onLoad()` callback. The method also returns a new `Image` object which can * directly be used for texture creation. If you do it this way, the texture * may pop up in your scene once the respective loading process is finished. * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. * @param {Function} [onLoad] - Executed when the loading process has been finished. The argument is an `HTMLImageElement`. * @param {onProgressCallback} [onProgress] - Unsupported in this loader. * @param {onErrorCallback} [onError] - Executed when errors occur. * @returns {HTMLImageElement} The image. */ load(url, onLoad, onProgress, onError) { if (url === undefined) url = ''; if (this.path !== undefined) url = this.path + url; url = this.manager.resolveURL(url); const scope = this; const image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img'); function onImageLoad() { removeEventListeners(); if (onLoad) onLoad(this); scope.manager.itemEnd(url); } function onImageError(event) { removeEventListeners(); if (onError) onError(event); scope.manager.itemError(url); scope.manager.itemEnd(url); } function removeEventListeners() { image.removeEventListener('load', onImageLoad, false); image.removeEventListener('error', onImageError, false); } image.addEventListener('load', onImageLoad, false); image.addEventListener('error', onImageError, false); if (url.slice(0, 5) !== 'data:') { if (this.crossOrigin !== undefined) image.crossOrigin = this.crossOrigin; } scope.manager.itemStart(url); image.src = url; return image; } } /** * The vector 2 class */ class Vector2 { /** * @param {number} [x=0] - the x value of this vector. * @param {number} [y=0] - the y value of this vector. */ constructor(x = 0, y = 0) { this.x = x; this.y = y; } /** * Sets the x and y components of this vector. * @param {number} x * @param {number} y * @returns {Vector2} */ set(x = 0, y = 0) { this.x = x; this.y = y; return this; } /** * Sets this vector to be the vector linearly interpolated between v1 and v2 * where ratio is the percent distance along the line connecting the two vectors * - ratio = 0 will be v1, and ratio = 1 will be v2. * @param {Vector2} v1 - the starting Vector2. * @param {Vector2} v2 - Vector2 to interpolate towards. * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1]. * @returns {Vector2} */ lerpVectors(v1, v2, ratio) { return this.subVectors(v2, v1).multiplyScalar(ratio).add(v1); } /** * If this vector's x or y value is greater than v's x or y value, replace that value with the corresponding min value. * @param {Vector2} v * @returns {Vector2} */ min(v) { this.x = Math.min(this.x, v.x); this.y = Math.min(this.y, v.y); return this; } /** * If this vector's x or y value is less than v's x or y value, replace that value with the corresponding max value. * @param {Vector2} v * @returns {Vector2} */ max(v) { this.x = Math.max(this.x, v.x); this.y = Math.max(this.y, v.y); return this; } /** * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y). * @returns {number} */ getLength() { return Math.sqrt(this.getLengthSquared()); } /** * Computes the square of the Euclidean length (straight-line length) from (0, 0) to (x, y). * If you are comparing the lengths of vectors, you should compare the length squared instead * as it is slightly more efficient to calculate. * @returns {number} */ getLengthSquared() { return this.x * this.x + this.y * this.y; } /** * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1. * @param {number} [thickness=1] * @returns {Vector2} */ normalize(thickness = 1) { const length = this.getLength() || 1; const invLength = thickness / length; this.x *= invLength; this.y *= invLength; return this; } /** * Subtracts v from the vector. * @param {Vector2} a * @param {Vector2} target - the result vector2 * @returns {Vector2} */ subtract(a, target = new Vector2()) { return target.set(this.x - a.x, this.y - a.y); } /** * Subtracts v from this vector. * @param {Vector2} v * @returns {Vector2} */ sub(v) { this.x -= v.x; this.y -= v.y; return this; } /** * Copies the values of the passed Vector2's x and y properties to this Vector2. * @param {Vector2} v * @returns {Vector2} */ copy(v) { this.x = v.x; this.y = v.y; return this; } /** * Sets this vector to a + b. * @param {Vector2} a * @param {Vector2} b * @returns {Vector2} */ addVectors(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; return this; } /** * Sets this vector to a - b. * @param {Vector2} a * @param {Vector2} b * @returns {Vector2} */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; return this; } /** * Multiplies this vector by scalar. * @param {number} scalar * @returns {Vector2} */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; return this; } /** * Computes the squared distance from this vector to v. If you are just comparing the distance with * another distance, you should compare the distance squared instead as it is slightly more efficient to calculate. * @param {Vector2} v * @returns {number} */ distanceToSquared(v) { const dx = this.x - v.x, dy = this.y - v.y; return dx * dx + dy * dy; } /** * Computes the distance from this vector to v. * @param {Vector2} v * @returns {number} */ distanceTo(v) { return Math.sqrt(this.distanceToSquared(v)); } /** * Sets this vector's x value to be array[ offset ] and y value to be array[ offset + 1 ]. * @param {number[]} array - the source array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array. * @returns {Vector2} */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); } this.x = x; this.y = y; return this; } /** * Sets this array[ offset ] value to be vector's x and array[ offset + 1 ] to be vector's y. * @param {number[]} [array] - the target array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {number[]} */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); } array[offset] = x; array[offset + 1] = y; return array; } /** * Adds v to this vector. * @param {Vector2} v * @returns {Vector2} */ add(v) { this.x += v.x; this.y += v.y; return this; } /** * Computes the angle in radians of this vector with respect to the positive x-axis. * @returns {number} */ angle() { // computes the angle in radians with respect to the positive x-axis // let angle = Math.atan2(this.y, this.x); // if (angle < 0) angle += 2 * Math.PI; // return angle; return Math.atan2(-this.y, -this.x) + Math.PI; } /** * Inverts this vector - i.e. sets x = -x, y = -y. * @returns {Vector2} */ negate() { this.x = -this.x; this.y = -this.y; return this; } /** * Calculate the dot product of this vector and v. * @param {Vector2} a * @returns {number} */ dot(a) { return this.x * a.x + this.y * a.y; } /** * Checks for strict equality of this vector and v. * @param {Vector2} v * @returns {boolean} */ equals(v) { return v.x === this.x && v.y === this.y; } /** * Returns a new Vector2 with the same x and y values as this one. * @returns {Vector2} */ clone() { return new Vector2(this.x, this.y); } *[Symbol.iterator]() { yield this.x; yield this.y; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector2.prototype.isVector2 = true; /** * Represents an axis-aligned bounding box (AABB) in 2D space. */ class Box2 { /** * @param {Vector2} min - (optional) Vector2 representing the lower (x, y) boundary of the box. * Default is ( + Infinity, + Infinity ). * @param {Vector2} max - (optional) Vector2 representing the upper (x, y) boundary of the box. * Default is ( - Infinity, - Infinity ). */ constructor(min, max) { this.min = min !== undefined ? min : new Vector2(+Infinity, +Infinity); this.max = max !== undefined ? max : new Vector2(-Infinity, -Infinity); } /** * @param {number} x1 * @param {number} y1 * @param {number} x2 * @param {number} y2 */ set(x1, y1, x2, y2) { this.min.set(x1, y1); this.max.set(x2, y2); } /** * Returns a new Box2 with the same min and max as this one. * @returns {Box2} */ clone() { return new Box2().copy(this); } /** * Copies the min and max from box to this box. * @param {Box2} box * @returns {Box2} */ copy(box) { this.min.copy(box.min); this.max.copy(box.max); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Box2.prototype.isBox2 = true; /** * Represents an axis-aligned bounding box (AABB) in 3D space. */ class Box3 { /** * @param {Vector3} min - (optional) Vector3 representing the lower (x, y, z) boundary of the box. * Default is ( + Infinity, + Infinity, + Infinity ). * @param {Vector3} max - (optional) Vector3 representing the upper (x, y, z) boundary of the box. * Default is ( - Infinity, - Infinity, - Infinity ). */ constructor(min, max) { this.min = min !== undefined ? min : new Vector3(+Infinity, +Infinity, +Infinity); this.max = max !== undefined ? max : new Vector3(-Infinity, -Infinity, -Infinity); } /** * Sets the lower and upper (x, y, z) boundaries of this box. * @param {Vector3} min - Vector3 representing the lower (x, y, z) boundary of the box. * @param {Vector3} max - Vector3 representing the lower upper (x, y, z) boundary of the box. */ set(min, max) { this.min.copy(min); this.max.copy(max); } /** * Sets the upper and lower bounds of this box to include all of the points in points. * @param {Vector3[]} points - Array of Vector3s that the resulting box will contain. * @returns {Box3} */ setFromPoints(points) { this.makeEmpty(); for (let i = 0, il = points.length; i < il; i++) { this.expandByPoint(points[i]); } return this; } /** * Makes this box empty. * @returns {Box3} */ makeEmpty() { this.min.x = this.min.y = this.min.z = +Infinity; this.max.x = this.max.y = this.max.z = -Infinity; return this; } /** * Expands the boundaries of this box to include point. * @param {Vector3} point - Vector3 that should be included in the box. * @returns {Box3} */ expandByPoint(point) { this.min.min(point); this.max.max(point); return this; } /** * Expands each dimension of the box by scalar. If negative, the dimensions of the box will be contracted. * @param {number} scalar - Distance to expand the box by. * @returns {Box3} */ expandByScalar(scalar) { this.min.addScalar(-scalar); this.max.addScalar(scalar); return this; } /** * Expands the boundaries of this box to include box3. * @param {Box3} box3 - Box that will be unioned with this box. * @returns {Box3} */ expandByBox3(box3) { this.min.min(box3.min); this.max.max(box3.max); return this; } /** * Sets the upper and lower bounds of this box to include all of the data in array. * @param {number[]} array - An array of position data that the resulting box will envelop. * @param {number} [gap=3] - The number of elements between the start of each position in the array. * @param {number} [offset=0] - The offset in each gap where the position data starts. * @param {boolean} [denormalize=false] - Whether to denormalize the values in the array. * @returns {Box3} A reference to this box. */ setFromArray(array, gap = 3, offset = 0, denormalize = false) { let minX = +Infinity; let minY = +Infinity; let minZ = +Infinity; let maxX = -Infinity; let maxY = -Infinity; let maxZ = -Infinity; for (let i = 0, l = array.length; i < l; i += gap) { let x = array[i + offset]; let y = array[i + offset + 1]; let z = array[i + offset + 2]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); } if (x < minX) minX = x; if (y < minY) minY = y; if (z < minZ) minZ = z; if (x > maxX) maxX = x; if (y > maxY) maxY = y; if (z > maxZ) maxZ = z; } this.min.set(minX, minY, minZ); this.max.set(maxX, maxY, maxZ); return this; } /** * Clamps the point within the bounds of this box. * @param {Vector3} point - Vector3 to clamp. * @param {Vector3} target - Vector3 to store the result in. * @returns {Vector3} */ clampPoint(point, target) { return target.copy(point).min(this.max).max(this.min); } /** * Returns the distance from any edge of this box to the specified point. * If the point lies inside of this box, the distance will be 0. * @param {Vector3} point - Vector3 to measure the distance to. * @returns {number} */ distanceToPoint(point) { return this.clampPoint(point, _vec3_1$5).distanceTo(point); } /** * Returns aMinimum Bounding Sphere for the box. * @param {Sphere} target — the result will be copied into this Sphere. * @returns {Sphere} */ getBoundingSphere(target) { if (this.isEmpty()) { target.makeEmpty(); } else { this.getCenter(target.center); target.radius = this.getSize(_vec3_1$5).getLength() * 0.5; } return target; } /** * Returns true if this box includes zero points within its bounds. * @returns {boolean} */ isEmpty() { // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z; } /** * Returns true if this box and box share the same lower and upper bounds. * @param {Box3} box - Box to compare with this one. * @returns {boolean} */ equals(box) { return box.min.equals(this.min) && box.max.equals(this.max); } /** * Returns the center point of the box as a Vector3. * @param {Vector3} target - the result will be copied into this Vector3. * @returns {Vector3} */ getCenter(target = new Vector3()) { return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); } /** * Returns the width, height and depth of this box. * @param {Vector3} target - the result will be copied into this Vector3. * @returns {Vector3} */ getSize(target = new Vector3()) { return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min); } /** * Get the 8 corner points of the bounding box, the order is as follows: * 7-------3 * /| /| * 4-------0 | * | | | | * | 6-----|-2 * |/ |/ * 5-------1 * @param {Vector3[]} points - The array to store the points. * @returns {Vector3[]} The array of points. */ getPoints(points) { const minX = this.min.x, minY = this.min.y, minZ = this.min.z; const maxX = this.max.x, maxY = this.max.y, maxZ = this.max.z; points[0].set(maxX, maxY, maxZ); points[1].set(maxX, minY, maxZ); points[2].set(maxX, minY, minZ); points[3].set(maxX, maxY, minZ); points[4].set(minX, maxY, maxZ); points[5].set(minX, minY, maxZ); points[6].set(minX, minY, minZ); points[7].set(minX, maxY, minZ); return points; } /** * Computes the union of this box and box, * setting the upper bound of this box to the greater of the two boxes' upper bounds and the lower bound of this box to the lesser of the two boxes' lower bounds. * @param {Box3} box - Box that will be unioned with this box. * @returns {Box3} */ union(box) { this.min.min(box.min); this.max.max(box.max); return this; } /** * Transforms this Box3 with the supplied matrix. * @param {Matrix4} matrix - The Matrix4 to apply * @returns {Box3} */ applyMatrix4(matrix) { // transform of empty box is an empty box. if (this.isEmpty()) return this; // NOTE: I am using a binary pattern to specify all 2^3 combinations below _points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); // 000 _points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); // 001 _points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); // 010 _points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); // 011 _points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); // 100 _points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); // 101 _points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); // 110 _points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); // 111 this.setFromPoints(_points); return this; } /** * Returns true if the specified point lies within or on the boundaries of this box. * @param {Vector3} point - Vector3 to check for inclusion. * @returns {boolean} */ containsPoint(point) { return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z ? false : true; } /** * Determines whether or not this box intersects triangle. * @param {Triangle} triangle - Triangle to check for intersection against. * @returns {boolean} */ intersectsTriangle(triangle) { if (this.isEmpty()) { return false; } // compute box center and extents this.getCenter(_center); _extents.subVectors(this.max, _center); // translate triangle to aabb origin _v0$1.subVectors(triangle.a, _center); _v1$1.subVectors(triangle.b, _center); _v2$1.subVectors(triangle.c, _center); // compute edge vectors for triangle _f0.subVectors(_v1$1, _v0$1); _f1.subVectors(_v2$1, _v1$1); _f2.subVectors(_v0$1, _v2$1); // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) let axes = [0, -_f0.z, _f0.y, 0, -_f1.z, _f1.y, 0, -_f2.z, _f2.y, _f0.z, 0, -_f0.x, _f1.z, 0, -_f1.x, _f2.z, 0, -_f2.x, -_f0.y, _f0.x, 0, -_f1.y, _f1.x, 0, -_f2.y, _f2.x, 0]; if (!satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents)) { return false; } // test 3 face normals from the aabb axes = [1, 0, 0, 0, 1, 0, 0, 0, 1]; if (!satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents)) { return false; } // finally testing the face normal of the triangle // use already existing triangle edge vectors here _triangleNormal.crossVectors(_f0, _f1); axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z]; return satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents); } /** * Returns a new Box3 with the same min and max as this one. * @returns {Box3} */ clone() { return new Box3().copy(this); } /** * Copies the min and max from box to this box. * @param {Box3} box - Box3 to copy. * @returns {Box3} */ copy(box) { this.min.copy(box.min); this.max.copy(box.max); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Box3.prototype.isBox3 = true; const _points = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()]; const _vec3_1$5 = new Vector3(); // triangle centered vertices const _v0$1 = new Vector3(); const _v1$1 = new Vector3(); const _v2$1 = new Vector3(); // triangle edge vectors const _f0 = new Vector3(); const _f1 = new Vector3(); const _f2 = new Vector3(); const _center = new Vector3(); const _extents = new Vector3(); const _triangleNormal = new Vector3(); const _testAxis = new Vector3(); function satForAxes(axes, v0, v1, v2, extents) { for (let i = 0, j = axes.length - 3; i <= j; i += 3) { _testAxis.fromArray(axes, i); // project the aabb onto the separating axis const r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z); // project all 3 vertices of the triangle onto the separating axis const p0 = v0.dot(_testAxis); const p1 = v1.dot(_testAxis); const p2 = v2.dot(_testAxis); // actual test, basically see if either of the most extreme of the triangle points intersects r if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) { // points of the projected triangle are outside the projected half-length of the aabb // the axis is separating and we can exit return false; } } return true; } /** * A Color3 instance is represented by RGB components. */ class Color3 { /** * Constructs a new three-component color. * @param {number} [r] - The red component of the color. If `g` and `b` are not provided, it can be a hexadecimal triplet. * @param {number} [g] - The green component. * @param {number} [b] - The blue component. */ constructor(r, g, b) { /** * The red component. * @type {number} * @default 0 */ this.r = 0; /** * The green component. * @type {number} * @default 0 */ this.g = 0; /** * The blue component. * @type {number} * @default 0 */ this.b = 0; if (g === undefined && b === undefined) { this.setHex(r); } else { this.setRGB(r, g, b); } } /** * Sets this color from a hexadecimal value. * @param {number} hex - The hexadecimal value. * @returns {Color3} A reference to this color. */ setHex(hex) { hex = Math.floor(hex); this.r = (hex >> 16 & 255) / 255; this.g = (hex >> 8 & 255) / 255; this.b = (hex & 255) / 255; return this; } /** * Sets this color from RGB values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @returns {Color3} A reference to this color. */ setRGB(r, g, b) { this.r = r; this.g = g; this.b = b; return this; } /** * Set this color from HSL values. * @param {number} h - Hue value between 0.0 and 1.0. * @param {number} s - Saturation value between 0.0 and 1.0. * @param {number} l - Lightness value between 0.0 and 1.0. * @returns {Color3} A reference to this color. */ setHSL(h, s, l) { // h,s,l ranges are in 0.0 - 1.0 h = MathUtils.euclideanModulo(h, 1); s = MathUtils.clamp(s, 0, 1); l = MathUtils.clamp(l, 0, 1); if (s === 0) { this.r = this.g = this.b = l; } else { const p = l <= 0.5 ? l * (1 + s) : l + s - l * s; const q = 2 * l - p; this.r = hue2rgb(q, p, h + 1 / 3); this.g = hue2rgb(q, p, h); this.b = hue2rgb(q, p, h - 1 / 3); } return this; } /** * Returns a new color with copied values from this instance. * @returns {Color3} A clone of this instance. */ clone() { return new this.constructor(this.r, this.g, this.b); } /** * Copies the values of the given color to this instance. * @param {Color3} color - The color to copy. * @returns {Color3} A reference to this color. */ copy(color) { this.r = color.r; this.g = color.g; this.b = color.b; return this; } /** * Converts this color from sRGB space to linear space. * @returns {Color3} A reference to this color. */ convertSRGBToLinear() { this.r = SRGBToLinear(this.r); this.g = SRGBToLinear(this.g); this.b = SRGBToLinear(this.b); return this; } /** * Converts this color from linear space to sRGB space. * @returns {Color3} A reference to this color. */ convertLinearToSRGB() { this.r = LinearToSRGB(this.r); this.g = LinearToSRGB(this.g); this.b = LinearToSRGB(this.b); return this; } /** * Returns the hexadecimal value of this color. * @returns {number} The hexadecimal value. */ getHex() { return MathUtils.clamp(this.r * 255, 0, 255) << 16 ^ MathUtils.clamp(this.g * 255, 0, 255) << 8 ^ MathUtils.clamp(this.b * 255, 0, 255) << 0; } /** * Linearly interpolates this color's RGB values toward the RGB values of the * given color. The alpha argument can be thought of as the ratio between * the two colors, where 0.0 is this color and 1.0 is the first argument. * @param {Color3} color - The color to converge on. * @param {number} alpha - The interpolation factor in the closed interval [0,1]. * @returns {Color3} A reference to this color. */ lerp(color, alpha) { return this.lerpColors(this, color, alpha); } /** * Linearly interpolates between the given colors and stores the result in this instance. * The alpha argument can be thought of as the ratio between the two colors, where 0.0 * is the first and 1.0 is the second color. * @param {Color3} color1 - The first color. * @param {Color3} color2 - The second color. * @param {number} alpha - The interpolation factor in the closed interval [0,1]. * @returns {Color3} A reference to this color. */ lerpColors(color1, color2, alpha) { this.r = MathUtils.lerp(color1.r, color2.r, alpha); this.g = MathUtils.lerp(color1.g, color2.g, alpha); this.b = MathUtils.lerp(color1.b, color2.b, alpha); return this; } /** * Sets this color's RGB components from the given array. * @param {number[]} array - An array holding the RGB values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Color3} A reference to this color. */ fromArray(array, offset = 0, denormalize = false) { let r = array[offset], g = array[offset + 1], b = array[offset + 2]; if (denormalize) { r = MathUtils.denormalize(r, array); g = MathUtils.denormalize(g, array); b = MathUtils.denormalize(b, array); } this.r = r; this.g = g; this.b = b; return this; } /** * Writes the RGB components of this color to the given array. If no array is provided, * the method returns a new instance. * @param {number[]} [array=[]] - The target array holding the color components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {number[]} The color components. */ toArray(array = [], offset = 0, normalize = false) { let r = this.r, g = this.g, b = this.b; if (normalize) { r = MathUtils.normalize(r, array); g = MathUtils.normalize(g, array); b = MathUtils.normalize(b, array); } array[offset] = r; array[offset + 1] = g; array[offset + 2] = b; return array; } *[Symbol.iterator]() { yield this.r; yield this.g; yield this.b; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Color3.prototype.isColor3 = true; function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t); return p; } function SRGBToLinear(c) { return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4); } function LinearToSRGB(c) { return c < 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 0.41666) - 0.055; } /** * A Color4 instance is represented by RGBA components. */ class Color4 { /** * Constructs a new four-component color. * @param {number} [r=0] - The red value. * @param {number} [g=0] - The green value. * @param {number} [b=0] - The blue value. * @param {number} [a=1] - The alpha value. */ constructor(r = 0, g = 0, b = 0, a = 1) { /** * The red component. * @type {number} * @default 0 */ this.r = r; /** * The green component. * @type {number} * @default 0 */ this.g = g; /** * The blue component. * @type {number} * @default 0 */ this.b = b; /** * The alpha component. * @type {number} * @default 1 */ this.a = a; } /** * Sets this color from RGBA values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @param {number} a - Alpha channel value between 0.0 and 1.0. * @returns {Color4} A reference to this color. */ setRGBA(r, g, b, a) { this.r = r; this.g = g; this.b = b; this.a = a; return this; } /** * Returns a new color with copied values from this instance. * @returns {Color4} A clone of this instance. */ clone() { return new Color4(this.r, this.g, this.b, this.a); } /** * Copies the values of the given color to this instance. * @param {Color4} color - The color to copy. * @returns {Color4} A clone of this instance. */ copy(color) { this.r = color.r; this.g = color.g; this.b = color.b; this.a = color.a; return this; } /** * Sets this color's RGBA components from the given array. * @param {number[]} array - An array holding the RGBA values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Color4} A reference to this color. */ fromArray(array, offset = 0, denormalize = false) { let r = array[offset], g = array[offset + 1], b = array[offset + 2], a = array[offset + 3]; if (denormalize) { r = MathUtils.denormalize(r, array); g = MathUtils.denormalize(g, array); b = MathUtils.denormalize(b, array); a = MathUtils.denormalize(a, array); } this.r = r; this.g = g; this.b = b; this.a = a; return this; } /** * Writes the RGBA components of this color to the given array. If no array is provided, * the method returns a new instance. * @param {number[]} [array=[]] - The target array holding the color components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {number[]} The color components. */ toArray(array = [], offset = 0, normalize = false) { let r = this.r, g = this.g, b = this.b, a = this.a; if (normalize) { r = MathUtils.normalize(r, array); g = MathUtils.normalize(g, array); b = MathUtils.normalize(b, array); a = MathUtils.normalize(a, array); } array[offset] = r; array[offset + 1] = g; array[offset + 2] = b; array[offset + 3] = a; return array; } *[Symbol.iterator]() { yield this.r; yield this.g; yield this.b; yield this.a; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Color4.prototype.isColor4 = true; const _matrix$1 = new Matrix4(); /** * Euler class. */ class Euler { /** * @param {number} [x=0] * @param {number} [y=0] * @param {number} [z=0] * @param {string} [order=Euler.DefaultOrder] */ constructor(x = 0, y = 0, z = 0, order = Euler.DefaultOrder) { this._x = x; this._y = y; this._z = z; this._order = order; } /** * @type {number} */ get x() { return this._x; } /** * @type {number} */ set x(value) { this._x = value; this.onChangeCallback(); } /** * @type {number} */ get y() { return this._y; } /** * @type {number} */ set y(value) { this._y = value; this.onChangeCallback(); } /** * @type {number} */ get z() { return this._z; } /** * @type {number} */ set z(value) { this._z = value; this.onChangeCallback(); } /** * @type {string} */ get order() { return this._order; } /** * @type {string} */ set order(value) { this._order = value; this.onChangeCallback(); } /** * Returns a new Euler with the same parameters as this one. * @returns {Euler} */ clone() { return new Euler(this._x, this._y, this._z, this._order); } /** * Copies value of euler to this euler. * @param {Euler} euler * @returns {Euler} */ copy(euler) { this._x = euler._x; this._y = euler._y; this._z = euler._z; this._order = euler._order; this.onChangeCallback(); return this; } /** * @param {number} x - the angle of the x axis in radians. * @param {number} y - the angle of the y axis in radians. * @param {number} z - the angle of the z axis in radians. * @param {string} order - (optional) a string representing the order that the rotations are applied. * @returns {Euler} */ set(x = 0, y = 0, z = 0, order = this._order) { this._x = x; this._y = y; this._z = z; this._order = order; this.onChangeCallback(); return this; } /** * Sets the angles of this euler transform from a pure rotation matrix based on the orientation specified by order. * @param {Matrix4} m - a Matrix4 of which the upper 3x3 of matrix is a pure rotation matrix * @param {string} order - (optional) a string representing the order that the rotations are applied. * @param {boolean} [update=true] - Whether to notify Euler angle has changed * @returns {Euler} */ setFromRotationMatrix(m, order = this._order, update = true) { // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) const te = m.elements; const m11 = te[0], m12 = te[4], m13 = te[8]; const m21 = te[1], m22 = te[5], m23 = te[9]; const m31 = te[2], m32 = te[6], m33 = te[10]; if (order === 'XYZ') { this._y = Math.asin(MathUtils.clamp(m13, -1, 1)); if (Math.abs(m13) < 0.99999) { this._x = Math.atan2(-m23, m33); this._z = Math.atan2(-m12, m11); } else { this._x = Math.atan2(m32, m22); this._z = 0; } } else if (order === 'YXZ') { this._x = Math.asin(-MathUtils.clamp(m23, -1, 1)); if (Math.abs(m23) < 0.99999) { this._y = Math.atan2(m13, m33); this._z = Math.atan2(m21, m22); } else { this._y = Math.atan2(-m31, m11); this._z = 0; } } else if (order === 'ZXY') { this._x = Math.asin(MathUtils.clamp(m32, -1, 1)); if (Math.abs(m32) < 0.99999) { this._y = Math.atan2(-m31, m33); this._z = Math.atan2(-m12, m22); } else { this._y = 0; this._z = Math.atan2(m21, m11); } } else if (order === 'ZYX') { this._y = Math.asin(-MathUtils.clamp(m31, -1, 1)); if (Math.abs(m31) < 0.99999) { this._x = Math.atan2(m32, m33); this._z = Math.atan2(m21, m11); } else { this._x = 0; this._z = Math.atan2(-m12, m22); } } else if (order === 'YZX') { this._z = Math.asin(MathUtils.clamp(m21, -1, 1)); if (Math.abs(m21) < 0.99999) { this._x = Math.atan2(-m23, m22); this._y = Math.atan2(-m31, m11); } else { this._x = 0; this._y = Math.atan2(m13, m33); } } else if (order === 'XZY') { this._z = Math.asin(-MathUtils.clamp(m12, -1, 1)); if (Math.abs(m12) < 0.99999) { this._x = Math.atan2(m32, m22); this._y = Math.atan2(m13, m11); } else { this._x = Math.atan2(-m23, m33); this._y = 0; } } else { console.warn('given unsupported order: ' + order); } this._order = order; if (update === true) this.onChangeCallback(); return this; } /** * Sets the angles of this euler transform from a normalized quaternion based on the orientation specified by order. * @param {Quaternion} q - a normalized quaternion. * @param {string} order - (optional) a string representing the order that the rotations are applied. * @param {boolean} [update=true] - Whether to notify Euler angle has changed * @returns {Euler} */ setFromQuaternion(q, order, update) { q.toMatrix4(_matrix$1); return this.setFromRotationMatrix(_matrix$1, order, update); } /** * @param {Function} callback - When the Euler angle value changes, the callback method is triggered * @returns {Euler} */ onChange(callback) { this.onChangeCallback = callback; return this; } onChangeCallback() {} *[Symbol.iterator]() { yield this._x; yield this._y; yield this._z; yield this._order; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Euler.prototype.isEuler = true; /** * The order in which to apply rotations. * @readonly */ Euler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX']; /** * The default order in which to apply rotations. * @readonly */ Euler.DefaultOrder = 'XYZ'; /** * The 3x3 matrix class. */ class Matrix3 { /** * Create a 3x3 matrix. */ constructor() { this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1]; } /** * Sets the 3x3 matrix values to the given row-major sequence of values. * @param {number} n11 - value to put in row 1, col 1. * @param {number} n12 - value to put in row 1, col 2. * @param {number} n13 - value to put in row 1, col 3. * @param {number} n21 - value to put in row 2, col 1. * @param {number} n22 - value to put in row 2, col 2. * @param {number} n23 - value to put in row 2, col 3. * @param {number} n31 - value to put in row 3, col 1. * @param {number} n32 - value to put in row 3, col 2. * @param {number} n33 - value to put in row 3, col 3. * @returns {Matrix3} */ set(n11, n12, n13, n21, n22, n23, n31, n32, n33) { const ele = this.elements; ele[0] = n11; ele[3] = n12; ele[6] = n13; ele[1] = n21; ele[4] = n22; ele[7] = n23; ele[2] = n31; ele[5] = n32; ele[8] = n33; return this; } /** * Resets this matrix to the 3x3 identity matrix * @returns {Matrix3} */ identity() { return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1); } /** * Checks if the matrix is an identity matrix. * @returns {boolean} - True if the matrix is an identity matrix, false otherwise. */ isIdentity() { const te = this.elements; return te[0] === 1 && te[3] === 0 && te[6] === 0 && te[1] === 0 && te[4] === 1 && te[7] === 0 && te[2] === 0 && te[5] === 0 && te[8] === 1; } /** * Computes and returns the determinant of this matrix. * @returns {number} The determinant. */ determinant() { const te = this.elements; const a = te[0], b = te[1], c = te[2], d = te[3], e = te[4], f = te[5], g = te[6], h = te[7], i = te[8]; return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; } /** * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}. * You can not invert with a determinant of zero. If you attempt this, the method produces * a zero matrix instead. * @returns {Matrix3} A reference to this matrix. */ invert() { const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n12 = te[3], n22 = te[4], n32 = te[5], n13 = te[6], n23 = te[7], n33 = te[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13; if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); const detInv = 1 / det; te[0] = t11 * detInv; te[1] = (n31 * n23 - n33 * n21) * detInv; te[2] = (n32 * n21 - n31 * n22) * detInv; te[3] = t12 * detInv; te[4] = (n33 * n11 - n31 * n13) * detInv; te[5] = (n31 * n12 - n32 * n11) * detInv; te[6] = t13 * detInv; te[7] = (n21 * n13 - n23 * n11) * detInv; te[8] = (n22 * n11 - n21 * n12) * detInv; return this; } /** * Transposes this matrix in place. * @returns {Matrix3} */ transpose() { let tmp; const m = this.elements; tmp = m[1]; m[1] = m[3]; m[3] = tmp; tmp = m[2]; m[2] = m[6]; m[6] = tmp; tmp = m[5]; m[5] = m[7]; m[7] = tmp; return this; } /** * Return true if this matrix and m are equal. * @param {Matrix3} matrix * @returns {boolean} */ equals(matrix) { const te = this.elements; const me = matrix.elements; for (let i = 0; i < 9; i++) { if (te[i] !== me[i]) return false; } return true; } /** * Sets the elements of this matrix based on an array in column-major format. * @param {number[]} array * @param {number} [offset=0] * @returns {Matrix3} */ fromArray(array, offset = 0) { for (let i = 0; i < 9; i++) { this.elements[i] = array[i + offset]; } return this; } /** * Writes the elements of this matrix to an array in column-major format. * @param {number[]} [array] * @param {number} [offset=0] * @returns {number[]} */ toArray(array = [], offset = 0) { const te = this.elements; array[offset] = te[0]; array[offset + 1] = te[1]; array[offset + 2] = te[2]; array[offset + 3] = te[3]; array[offset + 4] = te[4]; array[offset + 5] = te[5]; array[offset + 6] = te[6]; array[offset + 7] = te[7]; array[offset + 8] = te[8]; return array; } /** * Creates a new Matrix3 and with identical elements to this one. * @returns {Matrix3} */ clone() { return new Matrix3().fromArray(this.elements); } /** * Copies the elements of matrix m into this matrix. * @param {Matrix3} m * @returns {Matrix3} */ copy(m) { const te = this.elements; const me = m.elements; te[0] = me[0]; te[1] = me[1]; te[2] = me[2]; te[3] = me[3]; te[4] = me[4]; te[5] = me[5]; te[6] = me[6]; te[7] = me[7]; te[8] = me[8]; return this; } /** * Post-multiplies this matrix by m. * @param {Matrix3} m * @returns {Matrix3} */ multiply(m) { return this.multiplyMatrices(this, m); } /** * Pre-multiplies this matrix by m. * @param {Matrix3} m * @returns {Matrix3} */ premultiply(m) { return this.multiplyMatrices(m, this); } /** * Sets this matrix to a x b. * @param {Matrix3} a * @param {Matrix3} b * @returns {Matrix3} */ multiplyMatrices(a, b) { const ae = a.elements; const be = b.elements; const te = this.elements; const a11 = ae[0], a12 = ae[3], a13 = ae[6]; const a21 = ae[1], a22 = ae[4], a23 = ae[7]; const a31 = ae[2], a32 = ae[5], a33 = ae[8]; const b11 = be[0], b12 = be[3], b13 = be[6]; const b21 = be[1], b22 = be[4], b23 = be[7]; const b31 = be[2], b32 = be[5], b33 = be[8]; te[0] = a11 * b11 + a12 * b21 + a13 * b31; te[3] = a11 * b12 + a12 * b22 + a13 * b32; te[6] = a11 * b13 + a12 * b23 + a13 * b33; te[1] = a21 * b11 + a22 * b21 + a23 * b31; te[4] = a21 * b12 + a22 * b22 + a23 * b32; te[7] = a21 * b13 + a22 * b23 + a23 * b33; te[2] = a31 * b11 + a32 * b21 + a33 * b31; te[5] = a31 * b12 + a32 * b22 + a33 * b32; te[8] = a31 * b13 + a32 * b23 + a33 * b33; return this; } /** * Transform 2D * @param {number} x - position.x * @param {number} y - position.y * @param {number} scaleX - scale.x * @param {number} scaleY - scale.y * @param {number} rotation - rotation * @param {number} anchorX - anchor.x * @param {number} anchorY - anchor.y * @returns {Matrix3} */ transform(x, y, scaleX, scaleY, rotation, anchorX, anchorY) { const te = this.elements; const cr = Math.cos(rotation); const sr = Math.sin(rotation); te[0] = cr * scaleX; te[3] = -sr * scaleY; te[6] = x; te[1] = sr * scaleX; te[4] = cr * scaleY; te[7] = y; te[2] = 0; te[5] = 0; te[8] = 1; if (anchorX || anchorY) { // prepend the anchor offset: te[6] -= anchorX * te[0] + anchorY * te[3]; te[7] -= anchorX * te[1] + anchorY * te[4]; } return this; } /** * Set the transformation matrix of uv coordinates * @param {number} tx * @param {number} ty * @param {number} sx * @param {number} sy * @param {number} rotation * @param {number} cx * @param {number} cy * @returns {Matrix3} */ setUvTransform(tx, ty, sx, sy, rotation, cx, cy) { const c = Math.cos(rotation); const s = Math.sin(rotation); return this.set(sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1); } /** * Sets the matri3 planes from the matrix4. * @param {Matrix4} m * @returns {Matrix3} */ setFromMatrix4(m) { const me = m.elements; return this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]); } /** * Extracts the basis vectors from the matrix. * @param {Vector3} xAxis * @param {Vector3} yAxis * @param {Vector3} zAxis * @returns {Matrix3} */ extractBasis(xAxis, yAxis, zAxis) { const te = this.elements; xAxis.fromArray(te); yAxis.fromArray(te, 3); zAxis.fromArray(te, 6); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Matrix3.prototype.isMatrix3 = true; const _vec3_1$4 = new Vector3(); const _vec3_2$1 = new Vector3(); const _mat3_1$1 = new Matrix3(); /** * A two dimensional surface that extends infinitely in 3d space, * represented in Hessian normal form by a unit length normal vector and a constant. */ class Plane { /** * Constructs a new Plane. * @param {Vector3} [normal=Vector3(1, 0, 0)] - A unit length Vector3 defining the normal of the plane. * @param {number} [constant=0] - The signed distance from the origin to the plane. */ constructor(normal = new Vector3(1, 0, 0), constant = 0) { this.normal = normal; this.constant = constant; } /** * Solve a system of equations to find the point where the three planes intersect. * @param {Plane} p1 - The first plane. * @param {Plane} p2 - The second plane. * @param {Plane} p3 - The third plane. * @param {Vector3} target - The result will be copied into this Vector3. * @returns {Vector3} */ static intersectPlanes(p1, p2, p3, target) { // Create the matrix using the normals of the planes as rows _mat3_1$1.set(p1.normal.x, p1.normal.y, p1.normal.z, p2.normal.x, p2.normal.y, p2.normal.z, p3.normal.x, p3.normal.y, p3.normal.z); // Create the vector using the constants of the planes target.set(-p1.constant, -p2.constant, -p3.constant); // Solve for X by applying the inverse matrix to vector target.applyMatrix3(_mat3_1$1.invert()); return target; } /** * Sets this plane's normal and constant properties by copying the values from the given normal. * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane. * @param {number} constant - the signed distance from the origin to the plane. Default is 0. * @returns {Plane} */ set(normal, constant) { this.normal.copy(normal); this.constant = constant; return this; } /** * Set the individual components that define the plane. * @param {number} x - x value of the unit length normal vector. * @param {number} y - y value of the unit length normal vector. * @param {number} z - z value of the unit length normal vector. * @param {number} w - the value of the plane's constant property. * @returns {Plane} */ setComponents(x, y, z, w) { this.normal.set(x, y, z); this.constant = w; return this; } /** * Sets the plane's properties as defined by a normal and an arbitrary coplanar point. * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane. * @param {Vector3} point - Vector3 * @returns {Plane} */ setFromNormalAndCoplanarPoint(normal, point) { this.normal.copy(normal); this.constant = -point.dot(this.normal); return this; } /** * Defines the plane based on the 3 provided points. * The winding order is assumed to be counter-clockwise, and determines the direction of the normal. * @param {Vector3} a - first point on the plane. * @param {Vector3} b - second point on the plane. * @param {Vector3} c - third point on the plane. * @returns {Plane} */ setFromCoplanarPoints(a, b, c) { const normal = _vec3_1$4.subVectors(c, b).cross(_vec3_2$1.subVectors(a, b)).normalize(); // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? this.setFromNormalAndCoplanarPoint(normal, a); return this; } /** * Normalizes the normal vector, and adjusts the constant value accordingly. * @returns {Plane} */ normalize() { // Note: will lead to a divide by zero if the plane is invalid. const inverseNormalLength = 1.0 / this.normal.getLength(); this.normal.multiplyScalar(inverseNormalLength); this.constant *= inverseNormalLength; return this; } /** * Returns the signed distance from the point to the plane. * @param {Vector3} point * @returns {number} */ distanceToPoint(point) { return this.normal.dot(point) + this.constant; } /** * Projects a point onto the plane. * @param {Vector3} point - the Vector3 to project onto the plane. * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ projectPoint(point, target = new Vector3()) { return target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point)); } /** * Reflects a point through the plane. * @param {Vector3} point - the Vector3 to reflect through the plane. * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ mirrorPoint(point, target = new Vector3()) { const distance = this.distanceToPoint(point); return target.copy(point).addScaledVector(this.normal, -2 * distance); } /** * Returns a Vector3 coplanar to the plane, by calculating the projection of the normal vector at the origin onto the plane. * @param {Vector3} [target] * @returns {Vector3} */ coplanarPoint(target = new Vector3()) { return target.copy(this.normal).multiplyScalar(-this.constant); } /** * Returns a new plane with the same normal and constant as this one. * @returns {Plane} */ clone() { return new Plane().copy(this); } /** * Copies the values of the passed plane's normal and constant properties to this plane. * @param {Plane} plane * @returns {Plane} */ copy(plane) { this.normal.copy(plane.normal); this.constant = plane.constant; return this; } /** * Apply a Matrix4 to the plane. The matrix must be an affine, homogeneous transform. * @param {Matrix4} matrix - the Matrix4 to apply. * @param {Matrix3} [optionalNormalMatrix] - (optional) pre-computed normal Matrix3 of the Matrix4 being applied. * @returns {Plane} */ applyMatrix4(matrix, optionalNormalMatrix) { const normalMatrix = optionalNormalMatrix || _mat3_1$1.setFromMatrix4(matrix).invert().transpose(); const referencePoint = this.coplanarPoint(_vec3_1$4).applyMatrix4(matrix); const normal = this.normal.applyMatrix3(normalMatrix).normalize(); this.constant = -referencePoint.dot(normal); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Plane.prototype.isPlane = true; const _vec3_1$3 = new Vector3(); const _mat3_1 = new Matrix3(); /** * Frustums are used to determine what is inside the camera's field of view. * They help speed up the rendering process - objects which lie outside a camera's frustum can safely be excluded from rendering. */ class Frustum { /** * @param {Plane} p0 - (optional) defaults to a new Plane. * @param {Plane} p1 - (optional) defaults to a new Plane. * @param {Plane} p2 - (optional) defaults to a new Plane. * @param {Plane} p3 - (optional) defaults to a new Plane. * @param {Plane} p4 - (optional) defaults to a new Plane. * @param {Plane} p5 - (optional) defaults to a new Plane. */ constructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) { this.planes = [p0, p1, p2, p3, p4, p5]; } /** * Sets the frustum from the passed planes. No plane order is implied. * @param {Plane} p0 - (optional) defaults to a new Plane. * @param {Plane} p1 - (optional) defaults to a new Plane. * @param {Plane} p2 - (optional) defaults to a new Plane. * @param {Plane} p3 - (optional) defaults to a new Plane. * @param {Plane} p4 - (optional) defaults to a new Plane. * @param {Plane} p5 - (optional) defaults to a new Plane. * @returns {Frustum} */ set(p0, p1, p2, p3, p4, p5) { const planes = this.planes; planes[0].copy(p0); planes[1].copy(p1); planes[2].copy(p2); planes[3].copy(p3); planes[4].copy(p4); planes[5].copy(p5); return this; } /** * Sets the frustum planes from the matrix. * @param {Matrix4} m - a Matrix4 used to set the planes * @returns {Frustum} */ setFromMatrix(m) { const planes = this.planes; const me = m.elements; const me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3]; const me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7]; const me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11]; const me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15]; planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize(); planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize(); planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize(); planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize(); planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize(); planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize(); return this; } /** * Return true if sphere intersects with this frustum. * @param {Sphere} sphere - Sphere to check for intersection. * @returns {boolean} */ intersectsSphere(sphere) { const planes = this.planes; const center = sphere.center; const negRadius = -sphere.radius; for (let i = 0; i < 6; i++) { const distance = planes[i].distanceToPoint(center); if (distance < negRadius) { return false; } } return true; } /** * Return true if box intersects with this frustum. * @param {Box3} box - Box3 to check for intersection. * @returns {boolean} */ intersectsBox(box) { const planes = this.planes; for (let i = 0; i < 6; i++) { const plane = planes[i]; // corner at max distance _vec3_1$3.x = plane.normal.x > 0 ? box.max.x : box.min.x; _vec3_1$3.y = plane.normal.y > 0 ? box.max.y : box.min.y; _vec3_1$3.z = plane.normal.z > 0 ? box.max.z : box.min.z; // if both outside plane, no intersection if (plane.distanceToPoint(_vec3_1$3) < 0) { return false; } } return true; } /** * Apply a matrix4x4 to the frustum. * @param {Matrix4} matrix - Matrix4 to apply to the frustum. * @returns {Frustum} */ applyMatrix4(matrix) { const planes = this.planes; const normalMatrix = _mat3_1.setFromMatrix4(matrix).invert().transpose(); for (let i = 0; i < 6; i++) { planes[i].applyMatrix4(matrix, normalMatrix); } return this; } /** * Return a new Frustum with the same parameters as this one. * @returns {Frustum} */ clone() { return new this.constructor().copy(this); } /** * Copies the properties of the passed frustum into this one. * @param {Frustum} frustum - The frustum to copy * @returns {Frustum} */ copy(frustum) { const planes = this.planes; for (let i = 0; i < 6; i++) { planes[i].copy(frustum.planes[i]); } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Frustum.prototype.isFrustum = true; const _vec3_1$2 = new Vector3(); const _diff = new Vector3(); const _edge1 = new Vector3(); const _edge2 = new Vector3(); const _normal = new Vector3(); /** * A ray that emits from an origin in a certain direction. This is used by * {@link Raycaster} to assist with raycasting. Raycasting is used for * mouse picking (working out what objects in the 3D space the mouse is over) * amongst other things. */ class Ray { /** * Constructs a new ray. * @param {Vector3} [origin=(0,0,0)] - The origin of the ray. * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray. */ constructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) { /** * The origin of the ray. * @type {Vector3} */ this.origin = origin; /** * The (normalized) direction of the ray. * @type {Vector3} */ this.direction = direction; } /** * Sets the ray's components by copying the given values. * @param {Vector3} origin - The origin. * @param {Vector3} direction - The direction. * @returns {Ray} A reference to this ray. */ set(origin, direction) { this.origin.copy(origin); this.direction.copy(direction); return this; } /** * Copies the values of the given ray to this instance. * @param {Ray} ray - The ray to copy. * @returns {Ray} A reference to this ray. */ copy(ray) { this.origin.copy(ray.origin); this.direction.copy(ray.direction); return this; } /** * Returns a vector that is located at a given distance along this ray. * @param {number} t - The distance along the ray to retrieve a position for. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {Vector3} A position on the ray. */ at(t, target = new Vector3()) { return target.copy(this.origin).addScaledVector(this.direction, t); } /** * Shift the origin of this ray along its direction by the given distance. * @param {number} t - The distance along the ray to interpolate. * @returns {Ray} A reference to this ray. */ recast(t) { this.origin.copy(this.at(t, _vec3_1$2)); return this; } /** * Returns the point along this ray that is closest to the given point. * @param {Vector3} point - A point in 3D space to get the closet location on the ray for. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {Vector3} The closest point on this ray. */ closestPointToPoint(point, target) { target.subVectors(point, this.origin); const directionDistance = target.dot(this.direction); if (directionDistance < 0) { return target.copy(this.origin); } return target.copy(this.origin).addScaledVector(this.direction, directionDistance); } /** * Returns the distance of the closest approach between this ray and the given point. * @param {Vector3} point - A point in 3D space to compute the distance to. * @returns {number} The distance. */ distanceToPoint(point) { return Math.sqrt(this.distanceSqToPoint(point)); } /** * Returns the squared distance of the closest approach between this ray and the given point. * @param {Vector3} point - A point in 3D space to compute the distance to. * @returns {number} The squared distance. */ distanceSqToPoint(point) { const directionDistance = _vec3_1$2.subVectors(point, this.origin).dot(this.direction); if (directionDistance < 0) { return this.origin.distanceToSquared(point); } _vec3_1$2.copy(this.direction).multiplyScalar(directionDistance).add(this.origin); return _vec3_1$2.distanceToSquared(point); } /** * Intersects this ray with the given sphere, returning the intersection * point or `null` if there is no intersection. * @param {Sphere} sphere - The sphere to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectSphere(sphere, target) { _vec3_1$2.subVectors(sphere.center, this.origin); const tca = _vec3_1$2.dot(this.direction); const d2 = _vec3_1$2.dot(_vec3_1$2) - tca * tca; const radius2 = sphere.radius * sphere.radius; if (d2 > radius2) { return null; } const thc = Math.sqrt(radius2 - d2); // t0 = first intersect point - entrance on front of sphere const t0 = tca - thc; // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; // test to see if both t0 and t1 are behind the ray - if so, return null if (t0 < 0 && t1 < 0) { return null; } // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, // in order to always return an intersect point that is in front of the ray. if (t0 < 0) { return this.at(t1, target); } // else t0 is in front of the ray, so return the first collision point scaled by t0 return this.at(t0, target); } /** * Returns `true` if this ray intersects with the given sphere. * @param {Sphere} sphere - The sphere to intersect. * @returns {boolean} Whether this ray intersects with the given sphere or not. */ intersectsSphere(sphere) { if (sphere.radius < 0) return false; // handle empty spheres return this.distanceSqToPoint(sphere.center) <= sphere.radius * sphere.radius; } /** * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray * does not intersect with the plane. * @param {Plane} plane - The plane to compute the distance to. * @returns {?number} Whether this ray intersects with the given sphere or not. */ distanceToPlane(plane) { const denominator = plane.normal.dot(this.direction); if (denominator === 0) { // line is coplanar, return origin if (plane.distanceToPoint(this.origin) === 0) { return 0; } // Null is preferable to undefined since undefined means.... it is undefined return null; } const t = -(this.origin.dot(plane.normal) + plane.constant) / denominator; // Return if the ray never intersects the plane return t >= 0 ? t : null; } /** * Intersects this ray with the given plane, returning the intersection * point or `null` if there is no intersection. * @param {Plane} plane - The plane to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectPlane(plane, target) { const t = this.distanceToPlane(plane); if (t === null) { return null; } return this.at(t, target); } /** * Returns `true` if this ray intersects with the given plane. * @param {Plane} plane - The plane to intersect. * @returns {boolean} Whether this ray intersects with the given plane or not. */ intersectsPlane(plane) { // check if the ray lies on the plane first const distToPoint = plane.distanceToPoint(this.origin); if (distToPoint === 0) { return true; } const denominator = plane.normal.dot(this.direction); if (denominator * distToPoint < 0) { return true; } // ray origin is behind the plane (and is pointing behind it) return false; } /** * Intersects this ray with the given bounding box, returning the intersection * point or `null` if there is no intersection. * @param {Box3} box - The box to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectBox(box, target) { let tmin, tmax, tymin, tymax, tzmin, tzmax; const invdirx = 1 / this.direction.x, invdiry = 1 / this.direction.y, invdirz = 1 / this.direction.z; const origin = this.origin; if (invdirx >= 0) { tmin = (box.min.x - origin.x) * invdirx; tmax = (box.max.x - origin.x) * invdirx; } else { tmin = (box.max.x - origin.x) * invdirx; tmax = (box.min.x - origin.x) * invdirx; } if (invdiry >= 0) { tymin = (box.min.y - origin.y) * invdiry; tymax = (box.max.y - origin.y) * invdiry; } else { tymin = (box.max.y - origin.y) * invdiry; tymax = (box.min.y - origin.y) * invdiry; } if (tmin > tymax || tymin > tmax) return null; // These lines also handle the case where tmin or tmax is NaN // (result of 0 * Infinity). x !== x returns true if x is NaN if (tymin > tmin || tmin !== tmin) tmin = tymin; if (tymax < tmax || tmax !== tmax) tmax = tymax; if (invdirz >= 0) { tzmin = (box.min.z - origin.z) * invdirz; tzmax = (box.max.z - origin.z) * invdirz; } else { tzmin = (box.max.z - origin.z) * invdirz; tzmax = (box.min.z - origin.z) * invdirz; } if (tmin > tzmax || tzmin > tmax) return null; if (tzmin > tmin || tmin !== tmin) tmin = tzmin; if (tzmax < tmax || tmax !== tmax) tmax = tzmax; // return point closest to the ray (positive side) if (tmax < 0) return null; return this.at(tmin >= 0 ? tmin : tmax, target); } /** * Returns `true` if this ray intersects with the given box. * @param {Box3} box - The box to intersect. * @returns {boolean} Whether this ray intersects with the given box or not. */ intersectsBox(box) { return this.intersectBox(box, _vec3_1$2) !== null; } /** * Intersects this ray with the given triangle, returning the intersection * point or `null` if there is no intersection. * @param {Vector3} a - The first vertex of the triangle. * @param {Vector3} b - The second vertex of the triangle. * @param {Vector3} c - The third vertex of the triangle. * @param {boolean} backfaceCulling - Whether to use backface culling or not. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectTriangle(a, b, c, backfaceCulling, target) { // Compute the offset origin, edges, and normal. // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h _edge1.subVectors(b, a); _edge2.subVectors(c, a); _normal.crossVectors(_edge1, _edge2); // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) let DdN = this.direction.dot(_normal); let sign; if (DdN > 0) { if (backfaceCulling) return null; sign = 1; } else if (DdN < 0) { sign = -1; DdN = -DdN; } else { return null; } _diff.subVectors(this.origin, a); const DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2)); // b1 < 0, no intersection if (DdQxE2 < 0) { return null; } const DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff)); // b2 < 0, no intersection if (DdE1xQ < 0) { return null; } // b1+b2 > 1, no intersection if (DdQxE2 + DdE1xQ > DdN) { return null; } // Line intersects triangle, check if ray does. const QdN = -sign * _diff.dot(_normal); // t < 0, no intersection if (QdN < 0) { return null; } // Ray intersects triangle. return this.at(QdN / DdN, target); } /** * Transforms this ray with the given 4x4 transformation matrix. * @param {Matrix4} matrix4 - The transformation matrix. * @returns {Ray} A reference to this ray. */ applyMatrix4(matrix4) { this.origin.applyMatrix4(matrix4); this.direction.transformDirection(matrix4); return this; } /** * Returns `true` if this ray is equal with the given one. * @param {Ray} ray - The ray to test for equality. * @returns {boolean} Whether this ray is equal with the given one. */ equals(ray) { return ray.origin.equals(this.origin) && ray.direction.equals(this.direction); } /** * Returns a new ray with copied values from this instance. * @returns {Ray} A clone of this instance. */ clone() { return new this.constructor().copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Ray.prototype.isRay = true; const _box3_1 = new Box3(); const _vec3_1$1 = new Vector3(); const _vec3_2 = new Vector3(); /** * A sphere defined by a center and radius. */ class Sphere { /** * @param {Vector3} [center=Vector3(0, 0, 0)] - center of the sphere. * @param {number} [radius=-1] - radius of the sphere. */ constructor(center = new Vector3(), radius = -1) { this.center = center; this.radius = radius; } /** * Sets the center and radius properties of this sphere. * @param {Vector3} center - center of the sphere. * @param {number} radius - radius of the sphere. * @returns {Sphere} */ set(center, radius) { this.center.copy(center); this.radius = radius; return this; } /** * Computes the minimum bounding sphere for an array of points. * If optionalCenteris given, it is used as the sphere's center. * Otherwise, the center of the axis-aligned bounding box encompassing points is calculated. * @param {Vector3[]} points - an Array of Vector3 positions. * @param {Vector3} [optionalCenter] - the center of the sphere. * @returns {Sphere} */ setFromPoints(points, optionalCenter) { const center = this.center; if (optionalCenter !== undefined) { center.copy(optionalCenter); } else { _box3_1.setFromPoints(points).getCenter(center); } let maxRadiusSq = 0; for (let i = 0, il = points.length; i < il; i++) { maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i])); } this.radius = Math.sqrt(maxRadiusSq); return this; } /** * Computes the minimum bounding sphere for an array of points. * @param {number[]} array - An Array of position data that the resulting sphere will envelop. * @param {number} [gap=3] - The number of elements between the start of each position in the array. * @param {number} [offset=0] - The offset in each gap where the position data starts. * @param {boolean} [denormalize=false] - whether to denormalize the values in the array. * @returns {Sphere} A reference to this sphere. */ setFromArray(array, gap = 3, offset = 0, denormalize = false) { const center = this.center; _box3_1.setFromArray(array, gap, offset, denormalize).getCenter(center); let maxRadiusSq = 0; for (let i = 0, l = array.length; i < l; i += gap) { _vec3_1$1.fromArray(array, i + offset, denormalize); maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vec3_1$1)); } this.radius = Math.sqrt(maxRadiusSq); return this; } /** * Transforms this sphere with the provided Matrix4. * @param {Matrix4} matrix - the Matrix4 to apply * @returns {Matrix4} */ applyMatrix4(matrix) { this.center.applyMatrix4(matrix); this.radius = this.radius * matrix.getMaxScaleOnAxis(); return this; } /** * Returns aMinimum Bounding Box for the sphere. * @param {Box3} target — the result will be copied into this Box3. * @returns {Box3} */ getBoundingBox(target) { if (this.isEmpty()) { // Empty sphere produces empty bounding box target.makeEmpty(); return target; } target.set(this.center, this.center); target.expandByScalar(this.radius); return target; } /** * Checks to see if the sphere is empty (the radius set to a negative number). * Spheres with a radius of 0 contain only their center point and are not considered to be empty. * @returns {boolean} */ isEmpty() { return this.radius < 0; } /** * Makes the sphere empty by setting center to (0, 0, 0) and radius to -1. * @returns {Sphere} */ makeEmpty() { this.center.set(0, 0, 0); this.radius = -1; return this; } /** * Checks to see if the sphere contains the provided point inclusive of the surface of the sphere. * @param {Vector3} point - The point to check for containment. * @returns {boolean} */ containsPoint(point) { return point.distanceToSquared(this.center) <= this.radius * this.radius; } /** * Returns the closest distance from the boundary of the sphere to the point. * If the sphere contains the point, the distance will be negative. * @param {Vector3} point - The point to calculate the distance to. * @returns {number} */ distanceToPoint(point) { return point.distanceTo(this.center) - this.radius; } /** * Expands the boundaries of this sphere to include point. * @param {Vector3} point - The vector3 that should be included in the sphere. * @returns {Sphere} */ expandByPoint(point) { if (this.isEmpty()) { this.center.copy(point); this.radius = 0; return this; } _vec3_1$1.subVectors(point, this.center); const lengthSq = _vec3_1$1.getLengthSquared(); if (lengthSq > this.radius * this.radius) { // calculate the minimal sphere const length = Math.sqrt(lengthSq); const delta = (length - this.radius) * 0.5; this.center.addScaledVector(_vec3_1$1, delta / length); this.radius += delta; } return this; } /** * Expands this sphere to enclose both the original sphere and the given sphere. * @param {Sphere} sphere - The sphere to include. * @returns {Sphere} A reference to this sphere. */ union(sphere) { if (sphere.isEmpty()) { return this; } if (this.isEmpty()) { this.copy(sphere); return this; } if (this.center.equals(sphere.center)) { this.radius = Math.max(this.radius, sphere.radius); } else { _vec3_2.subVectors(sphere.center, this.center).normalize().multiplyScalar(sphere.radius); this.expandByPoint(_vec3_1$1.addVectors(sphere.center, _vec3_2)); this.expandByPoint(_vec3_1$1.addVectors(sphere.center, _vec3_2)); } return this; } /** * Returns a new sphere with the same center and radius as this one. * @returns {Sphere} */ clone() { return new Sphere().copy(this); } /** * Copies the values of the passed sphere's center and radius properties to this sphere. * @param {Sphere} sphere * @returns {Sphere} */ copy(sphere) { this.center.copy(sphere.center); this.radius = sphere.radius; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Sphere.prototype.isSphere = true; /** * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system * * The poles (phi) are at the positive and negative y axis. * The equator starts at positive z. */ class Spherical { /** * @param {number} [radius=1] - the radius, or the Euclidean distance (straight-line distance) from the point to the origin. Default is 1.0. * @param {number} [phi=0] - - polar angle in radians from the y (up) axis. Default is 0. * @param {number} [theta=0] - - equator angle in radians around the y (up) axis. Default is 0. */ constructor(radius = 1, phi = 0, theta = 0) { this.radius = radius; this.phi = phi; // up / down towards top and bottom pole this.theta = theta; // around the equator of the sphere } /** * Sets values of this spherical's radius, phi and theta properties. * @param {number} radius * @param {number} phi * @param {number} theta * @returns {Spherical} */ set(radius, phi, theta) { this.radius = radius; this.phi = phi; this.theta = theta; return this; } /** * Copies the values of the passed Spherical's radius, phi and theta properties to this spherical. * @param {Spherical} other * @returns {Spherical} */ copy(other) { this.radius = other.radius; this.phi = other.phi; this.theta = other.theta; return this; } /** * Returns a new spherical with the same radius, phi and theta properties as this one. * @returns {Spherical} */ clone() { return new Spherical().copy(this); } /** * Restrict phi to be betwee EPS and PI-EPS. * @returns {Spherical} */ makeSafe() { const EPS = 0.000001; this.phi = MathUtils.clamp(this.phi, EPS, Math.PI - EPS); return this; } /** * Sets values of this spherical's radius, phi and theta properties from the Vector3. * @param {Vector3} vec3 * @returns {Spherical} */ setFromVector3(vec3) { this.radius = vec3.getLength(); if (this.radius === 0) { this.theta = 0; this.phi = 0; } else { this.theta = Math.atan2(vec3.x, vec3.z); // equator angle around y-up axis this.phi = Math.acos(MathUtils.clamp(vec3.y / this.radius, -1, 1)); // polar angle } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Spherical.prototype.isSpherical = true; /** * Primary reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf * Secondary reference: https://www.ppsloan.org/publications/StupidSH36.pdf * 3-band SH defined by 9 coefficients. */ class SphericalHarmonics3 { /** * Creates a new instance of SphericalHarmonics3. */ constructor() { /** * An array holding the (9) SH coefficients. * A single coefficient is represented as an instance of Vector3. * @type {Array} */ this.coefficients = []; for (let i = 0; i < 9; i++) { this.coefficients.push(new Vector3()); } } /** * Set this sphericalHarmonics3 value. * @param {Vector3[]} coefficients An array of SH coefficients. * @returns {SphericalHarmonics3} */ set(coefficients) { for (let i = 0; i < 9; i++) { this.coefficients[i].copy(coefficients[i]); } return this; } /** * Sets all SH coefficients to 0. * @returns {SphericalHarmonics3} */ zero() { for (let i = 0; i < 9; i++) { this.coefficients[i].set(0, 0, 0); } return this; } /** * Returns the radiance in the direction of the given normal. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {Vector3} target - The result vector. * @returns {Vector3} */ getAt(normal, target) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; const coeff = this.coefficients; // band 0 target.copy(coeff[0]).multiplyScalar(0.282095); // band 1 target.addScaledVector(coeff[1], 0.488603 * y); target.addScaledVector(coeff[2], 0.488603 * z); target.addScaledVector(coeff[3], 0.488603 * x); // band 2 target.addScaledVector(coeff[4], 1.092548 * (x * y)); target.addScaledVector(coeff[5], 1.092548 * (y * z)); target.addScaledVector(coeff[6], 0.315392 * (3.0 * z * z - 1.0)); target.addScaledVector(coeff[7], 1.092548 * (x * z)); target.addScaledVector(coeff[8], 0.546274 * (x * x - y * y)); return target; } /** * Reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf * Returns the irradiance (radiance convolved with cosine lobe) in the direction of the given normal. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {Vector3} target - The result vector. * @returns {Vector3} */ getIrradianceAt(normal, target) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; const coeff = this.coefficients; // band 0 target.copy(coeff[0]).multiplyScalar(0.886227); // π * 0.282095 // band 1 target.addScaledVector(coeff[1], 2.0 * 0.511664 * y); // ( 2 * π / 3 ) * 0.488603 target.addScaledVector(coeff[2], 2.0 * 0.511664 * z); target.addScaledVector(coeff[3], 2.0 * 0.511664 * x); // band 2 target.addScaledVector(coeff[4], 2.0 * 0.429043 * x * y); // ( π / 4 ) * 1.092548 target.addScaledVector(coeff[5], 2.0 * 0.429043 * y * z); target.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); // ( π / 4 ) * 0.315392 * 3 target.addScaledVector(coeff[7], 2.0 * 0.429043 * x * z); target.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); // ( π / 4 ) * 0.546274 return target; } /** * Adds the given SH to this instance. * @param {SphericalHarmonics3} sh - The SH to add. * @returns {SphericalHarmonics3} */ add(sh) { for (let i = 0; i < 9; i++) { this.coefficients[i].add(sh.coefficients[i]); } return this; } /** * A convenience method for performing .add() and .scale() at once. * @param {SphericalHarmonics3} sh - The SH to add. * @param {Vector3} s - The scale factor. * @returns {SphericalHarmonics3} */ addScaledSH(sh, s) { for (let i = 0; i < 9; i++) { this.coefficients[i].addScaledVector(sh.coefficients[i], s); } return this; } /** * Multiply the s to this SphericalHarmonics3. * @param {number} s - The scale factor. * @returns {SphericalHarmonics3} */ scale(s) { for (let i = 0; i < 9; i++) { this.coefficients[i].multiplyScalar(s); } return this; } /** * Linear interpolates between the given SH and this instance by the given alpha factor. * Sets this coefficients vector to be the vector linearly interpolated between v1 and v2 * where alpha is the percent distance along the line connecting the two vectors * - alpha = 0 will be v1, and alpha = 1 will be v2. * @param {SphericalHarmonics3} sh - The SH to interpolate with. * @param {number} alpha - The alpha factor. * @returns {SphericalHarmonics3} */ lerp(sh, alpha) { for (let i = 0; i < 9; i++) { this.coefficients[i].lerpVectors(this.coefficients[i], sh.coefficients[i], alpha); } return this; } /** * Returns true if the given SH and this instance have equal coefficients. * @param {SphericalHarmonics3} sh - The SH to compare with. * @returns {boolean} */ equals(sh) { for (let i = 0; i < 9; i++) { if (!this.coefficients[i].equals(sh.coefficients[i])) { return false; } } return true; } /** * Copies the given SH to this instance. * @param {SphericalHarmonics3} sh - The SH to compare with. * @returns {SphericalHarmonics3} */ copy(sh) { return this.set(sh.coefficients); } /** * Returns a new instance of SphericalHarmonics3 with equal coefficients. * @returns {SphericalHarmonics3} */ clone() { return new this.constructor().copy(this); } /** * Sets the coefficients of this instance from the given array. * @param {number[]} array - The array holding the numbers of the SH coefficients. * @param {number} [offset=0] - The array offset. * @returns {SphericalHarmonics3} */ fromArray(array, offset = 0) { const coefficients = this.coefficients; for (let i = 0; i < 9; i++) { coefficients[i].fromArray(array, offset + i * 3); } return this; } /** * Returns an array with the coefficients, or copies them into the provided array. * The coefficients are represented as numbers. * @param {number[]} [array] - The target array. * @param {number} [offset=0] - The array offset. * @returns {number[]} */ toArray(array = [], offset = 0) { const coefficients = this.coefficients; for (let i = 0; i < 9; i++) { coefficients[i].toArray(array, offset + i * 3); } return array; } /** * Computes the SH basis for the given normal vector. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {number[]} shBasis - The resulting SH basis. */ static getBasisAt(normal, shBasis) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; // band 0 shBasis[0] = 0.282095; // band 1 shBasis[1] = 0.488603 * y; shBasis[2] = 0.488603 * z; shBasis[3] = 0.488603 * x; // band 2 shBasis[4] = 1.092548 * x * y; shBasis[5] = 1.092548 * y * z; shBasis[6] = 0.315392 * (3 * z * z - 1); shBasis[7] = 1.092548 * x * z; shBasis[8] = 0.546274 * (x * x - y * y); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SphericalHarmonics3.prototype.isSphericalHarmonics3 = true; const _v0 = new Vector3(); const _v1 = new Vector3(); const _v2 = new Vector3(); const _v3 = new Vector3(); /** * A geometric triangle as defined by three Vector3s representing its three corners. */ class Triangle { /** * @param {Vector3} [a] - the first corner of the triangle. Default is a Vector3 at (0, 0, 0). * @param {Vector3} [b] - the second corner of the triangle. Default is a Vector3 at (0, 0, 0). * @param {Vector3} [c] - the final corner of the triangle. Default is a Vector3 at (0, 0, 0). */ constructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) { this.a = a; this.b = b; this.c = c; } /** * Calculate the normal vector of the triangle. * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @param {Vector3} [optionalTarget] * @returns {Vector3} */ static normal(a, b, c, optionalTarget) { const result = optionalTarget || new Vector3(); result.subVectors(c, b); _v0.subVectors(a, b); result.cross(_v0); const resultLengthSq = result.getLengthSquared(); if (resultLengthSq > 0) { return result.multiplyScalar(1 / Math.sqrt(resultLengthSq)); } return result.set(0, 0, 0); } /** * static/instance method to calculate barycentric coordinates. * based on: http://www.blackpawn.com/texts/pointinpoly/default.html * @param {Vector3} point - Vector3 * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ static barycoordFromPoint(point, a, b, c, target) { _v0.subVectors(c, a); _v1.subVectors(b, a); _v2.subVectors(point, a); const dot00 = _v0.dot(_v0); const dot01 = _v0.dot(_v1); const dot02 = _v0.dot(_v2); const dot11 = _v1.dot(_v1); const dot12 = _v1.dot(_v2); const denom = dot00 * dot11 - dot01 * dot01; const result = target || new Vector3(); // collinear or singular triangle if (denom === 0) { // arbitrary location outside of triangle? // not sure if this is the best idea, maybe should be returning undefined return result.set(-2, -1, -1); } const invDenom = 1 / denom; const u = (dot11 * dot02 - dot01 * dot12) * invDenom; const v = (dot00 * dot12 - dot01 * dot02) * invDenom; // barycentric coordinates must always sum to 1 return result.set(1 - u - v, v, u); } /** * Returns true if the passed point, when projected onto the plane of the triangle, lies within the triangle. * @param {Vector3} point * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @returns {Vector3} */ static containsPoint(point, a, b, c) { this.barycoordFromPoint(point, a, b, c, _v3); return _v3.x >= 0 && _v3.y >= 0 && _v3.x + _v3.y <= 1; } /** * Sets the triangle's a, b and c properties to the passed vector3s. * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @returns {Triangle} */ set(a, b, c) { this.a.copy(a); this.b.copy(b); this.c.copy(c); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Triangle.prototype.isTriangle = true; /** * The vector 4 class */ class Vector4 { /** * @param {number} [x=0] - the x value of this vector. * @param {number} [y=0] - the y value of this vector. * @param {number} [z=0] - the z value of this vector. * @param {number} [w=1] - the w value of this vector. */ constructor(x = 0, y = 0, z = 0, w = 1) { this.x = x; this.y = y; this.z = z; this.w = w; } /** * Sets this vector to be the vector linearly interpolated between v1 and v2 * where ratio is the percent distance along the line connecting the two vectors * - ratio = 0 will be v1, and ratio = 1 will be v2. * @param {Vector4} v1 - the starting Vector4. * @param {Vector4} v2 - Vector4 to interpolate towards. * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1]. * @returns {Vector4} */ lerpVectors(v1, v2, ratio) { return this.subVectors(v2, v1).multiplyScalar(ratio).add(v1); } /** * Sets the x, y, z and w components of this vector. * @param {number} x * @param {number} y * @param {number} z * @param {number} w * @returns {Vector4} */ set(x = 0, y = 0, z = 0, w = 1) { this.x = x; this.y = y; this.z = z; this.w = w; return this; } /** * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1. * @returns {Vector4} */ normalize() { return this.multiplyScalar(1 / (this.getLength() || 1)); } /** * Multiplies this vector by scalar s. * @param {number} scalar * @returns {Vector4} */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; this.z *= scalar; this.w *= scalar; return this; } /** * Calculates the dot product of this vector and v. * @param {Vector4} v * @returns {Vector4} */ dot(v) { return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; } /** * Computes the square of the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w). * If you are comparing the lengths of vectors, you should compare the length squared instead * as it is slightly more efficient to calculate. * @returns {number} */ getLengthSquared() { return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; } /** * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w). * @returns {number} */ getLength() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); } /** * Computes the {@link https://en.wikipedia.org/wiki/Taxicab_geometry|Manhattan length} from (0, 0, 0, 0) to (x, y, z, w). * @returns {number} */ getManhattanLength() { return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w); } /** * Multiplies this vector by 4 x 4 m. * @param {Matrix4} m * @returns {Vector4} */ applyMatrix4(m) { const x = this.x, y = this.y, z = this.z, w = this.w; const e = m.elements; this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w; this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w; this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w; this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w; return this; } /** * Sets this vector to the position represented by the matrix m. * @param {Matrix4} m * @returns {Vector4} */ setFromMatrixPosition(m) { const e = m.elements; this.x = e[12]; this.y = e[13]; this.z = e[14]; this.w = e[15]; return this; } /** * Checks for strict equality of this vector and v. * @param {Vector4} v * @returns {boolean} */ equals(v) { return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w; } /** * Adds v to this vector. * @param {Vector4} v * @returns {Vector4} */ add(v) { this.x += v.x; this.y += v.y; this.z += v.z; this.w += v.w; return this; } /** * Multiplies this vector by v. * @param {Vector4} v * @returns {Vector4} */ multiply(v) { this.x *= v.x; this.y *= v.y; this.z *= v.z; this.w *= v.w; return this; } /** * Sets this vector to a - b. * @param {Vector4} a * @param {Vector4} b * @returns {Vector4} */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; this.w = a.w - b.w; return this; } /** * Sets this vector's x value to be array[ offset + 0 ], * y value to be array[ offset + 1 ] z value to be array[ offset + 2 ] * and w value to be array[ offset + 3 ]. * @param {number[]} array - the source array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array. * @returns {Vector4} */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2], w = array[offset + 3]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); w = MathUtils.denormalize(w, array); } this.x = x; this.y = y; this.z = z; this.w = w; return this; } /** * Returns an array [x, y, z, w], or copies x, y, z and w into the provided array. * @param {number[]} [array] - array to store this vector to. If this is not provided, a new array will be created. * @param {number} [offset=0] - offset into the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {number[]} */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y, z = this.z, w = this.w; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); w = MathUtils.normalize(w, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; array[offset + 3] = w; return array; } /** * Rounds the x, y, z and w values of this vector to the nearest integer value. * @returns {Vector4} */ round() { this.x = Math.round(this.x); this.y = Math.round(this.y); this.z = Math.round(this.z); this.w = Math.round(this.w); return this; } /** * Returns a new Vector4 with the same x, y, z and w values as this one. * @returns {Vector4} */ clone() { return new Vector4(this.x, this.y, this.z, this.w); } /** * Copies the values of the passed Vector4's x, y, z and w properties to this Vector4. * @param {Vector4} v * @returns {Vector4} */ copy(v) { this.x = v.x; this.y = v.y; this.z = v.z; this.w = v.w !== undefined ? v.w : 1; return this; } *[Symbol.iterator]() { yield this.x; yield this.y; yield this.z; yield this.w; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector4.prototype.isVector4 = true; /** * Clone uniforms. * @function * @name cloneUniforms * @param {object} uniforms_src - The input uniforms. * @returns {object} - The output uniforms. */ function cloneUniforms(uniforms_src) { const uniforms_dst = {}; for (const name in uniforms_src) { const uniform_src = uniforms_src[name]; if (Array.isArray(uniform_src) || ArrayBuffer.isView(uniform_src)) { uniforms_dst[name] = uniform_src.slice(); } else { uniforms_dst[name] = uniform_src; } } return uniforms_dst; } /** * Clone json. * This is faster than JSON.parse(JSON.stringify()). * @function * @name cloneJson * @param {object} obj - The input json. * @returns {object} - The output json. */ function cloneJson(obj) { const newObj = Array.isArray(obj) ? [] : {}; if (obj && typeof obj === 'object') { for (const key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = obj[key] && typeof obj[key] === 'object' ? cloneJson(obj[key]) : obj[key]; } } } return newObj; } let _object3DId = 0; const _mat4_1$2 = new Matrix4(); /** * This is the base class for most objects, * and provides a set of properties and methods for manipulating objects in 3D space. */ class Object3D { constructor() { /** * Unique number for this object instance. * @readonly * @type {number} */ this.id = _object3DId++; /** * UUID of this object instance. * This gets automatically assigned, so this shouldn't be edited. * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * Optional name of the object (doesn't need to be unique). * @type {string} * @default "" */ this.name = ''; /** * A Vector3 representing the object's local position. * @type {Vector3} * @default Vector3(0, 0, 0) */ this.position = new Vector3(); /** * The object's local scale. * @type {Vector3} * @default Vector3(1, 1, 1) */ this.scale = new Vector3(1, 1, 1); /** * Object's local rotation as an {@link Euler}, in radians. * @type {Euler} * @default Euler(0, 0, 0) */ this.euler = new Euler(); /** * Object's local rotation as a {@link Quaternion}. * @type {Quaternion} * @default Quaternion(0, 0, 0, 1) */ this.quaternion = new Quaternion(); // bind euler and quaternion const euler = this.euler, quaternion = this.quaternion; euler.onChange(function () { quaternion.setFromEuler(euler, false); }); quaternion.onChange(function () { euler.setFromQuaternion(quaternion, undefined, false); }); /** * The local transform matrix. * @type {Matrix4} */ this.matrix = new Matrix4(); /** * The global transform of the object. * If the Object3D has no parent, then it's identical to the local transform {@link Object3D#matrix}. * @type {Matrix4} */ this.worldMatrix = new Matrix4(); /** * Object's parent in the scene graph. * An object can have at most one parent. * @type {Object3D[]} */ this.children = new Array(); /** * Object's parent in the scene graph. * An object can have at most one parent. * @type {Object3D} */ this.parent = null; /** * Whether the object gets rendered into shadow map. * @type {boolean} * @default false */ this.castShadow = false; /** * Whether the material receives shadows. * @type {boolean} * @default false */ this.receiveShadow = false; /** * Defines shadow map type. * Note: In webgl1 or {@link Scene#disableShadowSampler} is true, soft shadow types will fallback to POISSON_SOFT without warning. * Note: Point light only support POISSON_SOFT for now. * @type {SHADOW_TYPE} * @default SHADOW_TYPE.PCF3_SOFT */ this.shadowType = SHADOW_TYPE.PCF3_SOFT; /** * When this is set, it checks every frame if the object is in the frustum of the camera before rendering the object. * Otherwise the object gets rendered every frame even if it isn't visible. * @type {boolean} * @default true */ this.frustumCulled = true; /** * Object gets rendered if true. * @type {boolean} * @default true */ this.visible = true; /** * This value allows the default rendering order of scene graph objects to be overridden although opaque and transparent objects remain sorted independently. * Sorting is from lowest to highest renderOrder. * @type {number} * @default 0 */ this.renderOrder = 0; /** * Render layer of this object. * RenderQueue will dispatch all renderable objects to the corresponding RenderQueueLayer according to object.renderLayer. * @type {number} * @default 0 */ this.renderLayer = 0; /** * Whether it can be collected into the Render Queue. * @type {boolean} * @default true */ this.renderable = true; /** * An object that can be used to store custom data about the {@link Object3D}. * It should not hold references to functions as these will not be cloned. * @type {object} * @default {} */ this.userData = {}; /** * When this is set, it calculates the matrix of position, (rotation or quaternion) and scale every frame and also recalculates the worldMatrix property. * @type {boolean} * @default true */ this.matrixAutoUpdate = true; /** * When this is set, it calculates the matrix in that frame and resets this property to false. * @type {boolean} * @default true */ this.matrixNeedsUpdate = true; /** * When this is set, it calculates the world matrix in that frame and resets this property to false. * @type {boolean} * @default true */ this.worldMatrixNeedsUpdate = true; } /** * An optional callback that is executed immediately before the Object3D is rendered. */ onBeforeRender() {} /** * An optional callback that is executed immediately after the Object3D is rendered. */ onAfterRender() {} /** * Add object as child of this object. * @param {Object3D} object */ add(object) { if (object === this) { console.error('Object3D.add: object can\'t be added as a child of itself.', object); return; } if (object.parent !== null) { object.parent.remove(object); } object.parent = this; this.children.push(object); object.worldMatrixNeedsUpdate = true; } /** * Remove object as child of this object. * @param {Object3D} object */ remove(object) { const index = this.children.indexOf(object); if (index !== -1) { object.parent = null; this.children.splice(index, 1); object.worldMatrixNeedsUpdate = true; } } /** * Searches through the object's children and returns the first with a matching name. * Note that for most objects the name is an empty string by default. * You will have to set it manually to make use of this method. * @param {string} name - String to match to the children's {@link Object3D#name} property. * @returns {Object3D} */ getObjectByName(name) { return this.getObjectByProperty('name', name); } /** * Searches through the object's children and returns the first with a property that matches the value given. * @param {string} name - the property name to search for. * @param {number} value - value of the given property. * @returns {Object3D} */ getObjectByProperty(name, value) { if (this[name] === value) return this; for (let i = 0, l = this.children.length; i < l; i++) { const child = this.children[i]; const object = child.getObjectByProperty(name, value); if (object !== undefined) { return object; } } return undefined; } /** * Update the local transform. * @param {boolean} force */ updateMatrix(force) { if (this.matrixAutoUpdate || this.matrixNeedsUpdate) { this.matrix.compose(this.position, this.quaternion, this.scale); this.matrixNeedsUpdate = false; this.worldMatrixNeedsUpdate = true; } if (this.worldMatrixNeedsUpdate || force) { this.worldMatrix.copy(this.matrix); if (this.parent) { const parentMatrix = this.parent.worldMatrix; this.worldMatrix.premultiply(parentMatrix); } this.worldMatrixNeedsUpdate = false; force = true; } const children = this.children; for (let i = 0, l = children.length; i < l; i++) { children[i].updateMatrix(force); } } /** * Returns a vector representing the direction of object's positive z-axis in world space. * This call must be after {@link Object3D#updateMatrix}. * @param {Vector3} [optionalTarget] — the result will be copied into this Vector3. * @returns {Vector3} - the result. */ getWorldDirection(optionalTarget = new Vector3()) { const e = this.worldMatrix.elements; return optionalTarget.set(e[8], e[9], e[10]).normalize(); } /** * Rotates the object to face a point in local space. * @param {Vector3} target - A vector representing a position in local space. * @param {Vector3} up — A vector representing the up direction in local space. */ lookAt(target, up) { _mat4_1$2.lookAtRH(target, this.position, up); this.quaternion.setFromRotationMatrix(_mat4_1$2); } /** * Method to get intersections between a casted ray and this object. * @abstract * @param {Ray} ray - The {@link Ray} instance. * @param {Array} intersects - output intersects array. */ raycast(ray, intersects) {} /** * Executes the callback on this object and all descendants. * @param {Function} callback - A function with as first argument an object3D object. */ traverse(callback) { callback(this); const children = this.children; for (let i = 0, l = children.length; i < l; i++) { children[i].traverse(callback); } } /** * Returns a clone of this object and optionally all descendants. * @param {Function} [recursive=true] - if true, descendants of the object are also cloned. * @returns {Object3D} */ clone(recursive) { return new this.constructor().copy(this, recursive); } /** * Copy the given object into this object. * @param {Object3D} source - The object to be copied. * @param {boolean} [recursive=true] - if true, descendants of the object are also copied. * @returns {Object3D} */ copy(source, recursive = true) { this.name = source.name; this.position.copy(source.position); this.quaternion.copy(source.quaternion); this.scale.copy(source.scale); this.matrix.copy(source.matrix); this.worldMatrix.copy(source.worldMatrix); this.castShadow = source.castShadow; this.receiveShadow = source.receiveShadow; this.shadowType = source.shadowType; this.frustumCulled = source.frustumCulled; this.visible = source.visible; this.renderOrder = source.renderOrder; this.renderLayer = source.renderLayer; this.renderable = source.renderable; this.userData = cloneJson(source.userData); if (recursive === true) { for (let i = 0; i < source.children.length; i++) { const child = source.children[i]; this.add(child.clone()); } } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Object3D.prototype.isObject3D = true; const _plane_1 = new Plane(); let _sceneDataId = 0; /** * SceneData collect all render states about scene, Including lights. */ class SceneData { constructor() { this.id = _sceneDataId++; this.version = 0; this.useAnchorMatrix = false; this.anchorMatrix = new Matrix4(); this.anchorMatrixInverse = new Matrix4(); this.disableShadowSampler = false; this.logarithmicDepthBuffer = false; this.fog = null; this.environment = null; this.envDiffuseIntensity = 1; this.envSpecularIntensity = 1; this.clippingPlanesData = new Float32Array([]); this.numClippingPlanes = 0; } /** * Update scene data. * @param {Scene} scene */ update(scene) { this.useAnchorMatrix = !scene.anchorMatrix.isIdentity(); this.anchorMatrix.copy(scene.anchorMatrix); this.anchorMatrixInverse.copy(scene.anchorMatrix).invert(); this.disableShadowSampler = scene.disableShadowSampler; this.logarithmicDepthBuffer = scene.logarithmicDepthBuffer; this.fog = scene.fog; this.environment = scene.environment; this.envDiffuseIntensity = scene.envDiffuseIntensity; this.envSpecularIntensity = scene.envSpecularIntensity; if (this.clippingPlanesData.length < scene.clippingPlanes.length * 4) { this.clippingPlanesData = new Float32Array(scene.clippingPlanes.length * 4); } this.setClippingPlanesData(scene.clippingPlanes, this.clippingPlanesData); this.numClippingPlanes = scene.clippingPlanes.length; this.version++; } setClippingPlanesData(clippingPlanes, clippingPlanesData) { for (let i = 0; i < clippingPlanes.length; i++) { _plane_1.copy(clippingPlanes[i]); if (this.useAnchorMatrix) { _plane_1.applyMatrix4(this.anchorMatrixInverse); } clippingPlanesData[i * 4 + 0] = _plane_1.normal.x; clippingPlanesData[i * 4 + 1] = _plane_1.normal.y; clippingPlanesData[i * 4 + 2] = _plane_1.normal.z; clippingPlanesData[i * 4 + 3] = _plane_1.constant; } return clippingPlanesData; } } /** * Abstract base class for lights * - The light's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed light points down the -Z axis. * - all other light types inherit the properties and methods described here. * @abstract * @extends Object3D */ class Light extends Object3D { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color = 0xffffff, intensity = 1) { super(); /** * Color of the light. * @type {Color3} * @default Color3(0xffffff) */ this.color = new Color3(color); /** * The light's intensity, or strength. * @type {number} * @default 1 */ this.intensity = intensity; /** * Group mask of the light, indicating which lighting group the light belongs to. Default is 1 (binary 0001), meaning the light belongs to lighting group 0. * For example, to make the light effective in both lighting group 0 and lighting group 1, set groupMask to 3 (binary 0011). * Used in conjunction with {@link Material#lightingGroup}. * @type {number} * @default 1 */ this.groupMask = 1; } /** * Set light direction, this func will set quaternion of this light. * @param {Vector3} target - The target that the light look at. * @param {Vector3} up - The up direction of the light. */ lookAt(target, up) { _mat4_1$1.lookAtRH(this.position, target, up); this.quaternion.setFromRotationMatrix(_mat4_1$1); } /** * Copies properties from the source light into this one. * @param {Light} source - The source light. * @returns {Light} - This light. */ copy(source) { super.copy(source); this.color.copy(source.color); this.intensity = source.intensity; this.groupMask = source.groupMask; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Light.prototype.isLight = true; const _mat4_1$1 = new Matrix4(); /** * RectAreaLight emits light uniformly across the face a rectangular plane. * This light can be used to simulate light sources such as bright windows or strip lighting. * Important Notes: * - There is no shadow support. * - Only PBRMaterial are supported. * - You have to set LTC1 and LTC2 in RectAreaLight before using it. * @extends Light */ class RectAreaLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [width=10] * @param {number} [height=10] */ constructor(color, intensity, width = 10, height = 10) { super(color, intensity); /** * The width of the light. * @type {number} * @default 10 */ this.width = width; /** * The height of the light. * @type {number} * @default 10 */ this.height = height; } /** * The light's power. * Power is the luminous power of the light measured in lumens (lm). * Changing the power will also change the light's intensity. * @type {number} */ get power() { // compute the light's luminous power (in lumens) from its intensity (in nits) return this.intensity * this.width * this.height * Math.PI; } set power(power) { // set the light's intensity (in nits) from the desired luminous power (in lumens) this.intensity = power / (this.width * this.height * Math.PI); } copy(source) { super.copy(source); this.width = source.width; this.height = source.height; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RectAreaLight.prototype.isRectAreaLight = true; /** * The first LTC (Linearly Transformed Cosines). * If you want to use RectAreaLight, you have to set this before using it. * @type {null | Texture2D} */ RectAreaLight.LTC1 = null; /** * The second LTC (Linearly Transformed Cosines). * If you want to use RectAreaLight, you have to set this before using it. * @type {null | Texture2D} */ RectAreaLight.LTC2 = null; class LightingGroup extends EventDispatcher { constructor() { super(); this.id = _lightingGroupId++; // Light collection array this.lights = []; // Data caches this.ambient = new Float32Array([0, 0, 0]); this.sh = new Float32Array(27); this.hemisphere = []; this.directional = []; this.directionalShadow = []; this.directionalShadowMap = []; this.directionalShadowDepthMap = []; this.directionalShadowMatrix = new Float32Array(0); this.point = []; this.pointShadow = []; this.pointShadowMap = []; this.pointShadowMatrix = new Float32Array(0); this.spot = []; this.spotShadow = []; this.spotShadowMap = []; this.spotShadowDepthMap = []; this.spotShadowMatrix = new Float32Array(0); this.rectArea = []; this.LTC1 = null; this.LTC2 = null; // Status this.useAmbient = false; this.useSphericalHarmonics = false; this.hemisNum = 0; this.directsNum = 0; this.pointsNum = 0; this.spotsNum = 0; this.rectAreaNum = 0; this.directShadowNum = 0; this.pointShadowNum = 0; this.spotShadowNum = 0; this.totalNum = 0; this.shadowsNum = 0; // Version this.version = 0; } begin() { this.totalNum = 0; this.shadowsNum = 0; } push(light, shadow) { this.lights[this.totalNum++] = light; if (shadow) { this.shadowsNum++; } } end(sceneData) { this.lights.length = this.totalNum; this._setupCache(sceneData); this.version++; } dispose() { this.dispatchEvent({ type: 'dispose' }); } _setupCache(sceneData) { for (let i = 0; i < 3; i++) { this.ambient[i] = 0; } for (let i = 0; i < this.sh.length; i++) { this.sh[i] = 0; } this.useAmbient = false; this.useSphericalHarmonics = false; this.hemisNum = 0; this.directsNum = 0; this.pointsNum = 0; this.spotsNum = 0; this.rectAreaNum = 0; this.directShadowNum = 0; this.pointShadowNum = 0; this.spotShadowNum = 0; this.LTC1 = null; this.LTC2 = null; // Setup Uniforms for (let i = 0, l = this.lights.length; i < l; i++) { const light = this.lights[i]; if (light.isAmbientLight) { this._doAddAmbientLight(light); } else if (light.isHemisphereLight) { this._doAddHemisphereLight(light, sceneData); } else if (light.isDirectionalLight) { this._doAddDirectLight(light, sceneData); } else if (light.isPointLight) { this._doAddPointLight(light, sceneData); } else if (light.isSpotLight) { this._doAddSpotLight(light, sceneData); } else if (light.isSphericalHarmonicsLight) { this._doAddSphericalHarmonicsLight(light); } else if (light.isRectAreaLight) { this._doAddRectAreaLight(light, sceneData); } } const directShadowNum = this.directShadowNum; if (directShadowNum > 0) { this.directionalShadowMap.length = directShadowNum; this.directionalShadowDepthMap.length = directShadowNum; tempDirectionalShadowMatrices.length = directShadowNum; if (this.directionalShadowMatrix.length !== directShadowNum * 16) { this.directionalShadowMatrix = new Float32Array(directShadowNum * 16); } for (let i = 0; i < directShadowNum; i++) { tempDirectionalShadowMatrices[i].toArray(this.directionalShadowMatrix, i * 16); } } const pointShadowNum = this.pointShadowNum; if (pointShadowNum > 0) { this.pointShadowMap.length = pointShadowNum; tempPointShadowMatrices.length = pointShadowNum; if (this.pointShadowMatrix.length !== pointShadowNum * 16) { this.pointShadowMatrix = new Float32Array(pointShadowNum * 16); } for (let i = 0; i < pointShadowNum; i++) { tempPointShadowMatrices[i].toArray(this.pointShadowMatrix, i * 16); } } const spotShadowNum = this.spotShadowNum; if (spotShadowNum > 0) { this.spotShadowMap.length = spotShadowNum; this.spotShadowDepthMap.length = spotShadowNum; tempSpotShadowMatrices.length = spotShadowNum; if (this.spotShadowMatrix.length !== spotShadowNum * 16) { this.spotShadowMatrix = new Float32Array(spotShadowNum * 16); } for (let i = 0; i < spotShadowNum; i++) { tempSpotShadowMatrices[i].toArray(this.spotShadowMatrix, i * 16); } } if (this.rectAreaNum > 0) { this.LTC1 = RectAreaLight.LTC1; this.LTC2 = RectAreaLight.LTC2; } } _doAddAmbientLight(object) { const intensity = object.intensity; const color = object.color; this.ambient[0] += color.r * intensity; this.ambient[1] += color.g * intensity; this.ambient[2] += color.b * intensity; this.useAmbient = true; } _doAddSphericalHarmonicsLight(object) { const intensity = object.intensity; const sh = object.sh.coefficients; for (let i = 0; i < sh.length; i += 1) { this.sh[i * 3] += sh[i].x * intensity; this.sh[i * 3 + 1] += sh[i].y * intensity; this.sh[i * 3 + 2] += sh[i].z * intensity; } this.useSphericalHarmonics = true; } _doAddHemisphereLight(object, sceneData) { const intensity = object.intensity; const skyColor = object.color; const groundColor = object.groundColor; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.skyColor[0] = skyColor.r * intensity; cache.skyColor[1] = skyColor.g * intensity; cache.skyColor[2] = skyColor.b * intensity; cache.groundColor[0] = groundColor.r * intensity; cache.groundColor[1] = groundColor.g * intensity; cache.groundColor[2] = groundColor.b * intensity; const e = object.worldMatrix.elements; const direction = helpVector3.set(e[4], e[5], e[6]).normalize(); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.toArray(cache.direction); this.hemisphere[this.hemisNum++] = cache; } _doAddDirectLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; const direction = object.getWorldDirection(helpVector3); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.multiplyScalar(-1).toArray(cache.direction); if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = shadow.frustumEdgeFalloff; this.directionalShadow[this.directShadowNum++] = shadowCache; shadow.update(object); shadow.updateMatrix(); if (useAnchorMatrix) { shadow.matrix.multiply(sceneData.anchorMatrix); } this.directionalShadowMap[this.directsNum] = shadow.map; this.directionalShadowDepthMap[this.directsNum] = shadow.depthMap; tempDirectionalShadowMatrices[this.directsNum] = shadow.matrix; } this.directional[this.directsNum++] = cache; } _doAddPointLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const distance = object.distance; const decay = object.decay; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; cache.distance = distance; cache.decay = decay; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = 0; shadowCache.shadowCameraRange[0] = shadow.cameraNear; shadowCache.shadowCameraRange[1] = shadow.cameraFar; this.pointShadow[this.pointShadowNum++] = shadowCache; shadow.update(object, 0); shadow.matrix.makeTranslation(-position.x, -position.y, -position.z); // for point light this.pointShadowMap[this.pointsNum] = shadow.map; tempPointShadowMatrices[this.pointsNum] = shadow.matrix; } this.point[this.pointsNum++] = cache; } _doAddSpotLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const distance = object.distance; const decay = object.decay; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; cache.distance = distance; cache.decay = decay; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; const direction = object.getWorldDirection(helpVector3); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.multiplyScalar(-1).toArray(cache.direction); const coneCos = Math.cos(object.angle); const penumbraCos = Math.cos(object.angle * (1 - object.penumbra)); cache.coneCos = coneCos; cache.penumbraCos = penumbraCos; if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = shadow.frustumEdgeFalloff; this.spotShadow[this.spotShadowNum++] = shadowCache; shadow.update(object); shadow.updateMatrix(); if (useAnchorMatrix) { shadow.matrix.multiply(sceneData.anchorMatrix); } this.spotShadowMap[this.spotsNum] = shadow.map; this.spotShadowDepthMap[this.spotsNum] = shadow.depthMap; tempSpotShadowMatrices[this.spotsNum] = shadow.matrix; } this.spot[this.spotsNum++] = cache; } _doAddRectAreaLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const halfHeight = object.height; const halfWidth = object.width; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; // extract rotation of light to derive width/height half vectors helpMatrix4$1.copy(object.worldMatrix); if (useAnchorMatrix) { helpMatrix4$1.premultiply(sceneData.anchorMatrixInverse); } helpMatrix4$1.extractRotation(helpMatrix4$1); const halfWidthPos = helpVector3.set(halfWidth * 0.5, 0.0, 0.0); halfWidthPos.applyMatrix4(helpMatrix4$1); cache.halfWidth[0] = halfWidthPos.x; cache.halfWidth[1] = halfWidthPos.y; cache.halfWidth[2] = halfWidthPos.z; const halfHeightPos = helpVector3.set(0.0, halfHeight * 0.5, 0.0); halfHeightPos.applyMatrix4(helpMatrix4$1); cache.halfHeight[0] = halfHeightPos.x; cache.halfHeight[1] = halfHeightPos.y; cache.halfHeight[2] = halfHeightPos.z; this.rectArea[this.rectAreaNum++] = cache; } } // Variables let _lightingGroupId = 0; const helpVector3 = new Vector3(); const helpMatrix4$1 = new Matrix4(); const tempDirectionalShadowMatrices = []; const tempPointShadowMatrices = []; const tempSpotShadowMatrices = []; // Light caches const lightCaches = new WeakMap(); function getLightCache(light) { if (lightCaches.has(light)) { return lightCaches.get(light); } let cache; if (light.isHemisphereLight) { cache = { direction: new Float32Array(3), skyColor: new Float32Array([0, 0, 0]), groundColor: new Float32Array([0, 0, 0]) }; } else if (light.isDirectionalLight) { cache = { direction: new Float32Array(3), color: new Float32Array([0, 0, 0]) }; } else if (light.isPointLight) { cache = { position: new Float32Array(3), color: new Float32Array([0, 0, 0]), distance: 0, decay: 0 }; } else if (light.isSpotLight) { cache = { position: new Float32Array(3), direction: new Float32Array(3), color: new Float32Array([0, 0, 0]), distance: 0, coneCos: 0, penumbraCos: 0, decay: 0 }; } else if (light.isRectAreaLight) { cache = { position: new Float32Array(3), color: new Float32Array([0, 0, 0]), halfWidth: new Float32Array(3), halfHeight: new Float32Array(3) }; } lightCaches.set(light, cache); return cache; } // Shadow caches const shadowCaches = new WeakMap(); function getShadowCache(light) { if (shadowCaches.has(light)) { return shadowCaches.get(light); } let cache; if (light.isDirectionalLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff] }; } else if (light.isPointLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2), // [radius, 0] shadowCameraRange: new Float32Array(2) // [cameraNear, cameraFar] }; } else if (light.isSpotLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff] }; } shadowCaches.set(light, cache); return cache; } class LightingData { constructor() { this.lightsArray = []; this.shadowsNum = 0; this.groupList = []; this.groupList.push(new LightingGroup()); // create default group 0 this._locked = true; } getGroup(id) { return this.groupList[id]; } setMaxGroupCount(max) { max = Math.max(1, max); // at least one group const groupList = this.groupList; const oldMax = groupList.length; if (max < oldMax) { for (let i = max; i < oldMax; i++) { groupList[i].dispose(); } groupList.length = max; } else if (max > oldMax) { for (let i = oldMax; i < max; i++) { groupList.push(new LightingGroup()); } } } begin() { if (!this._locked) { console.warn('LightingData: begin() called without end().'); } this.lightsArray.length = 0; this.shadowsNum = 0; this._locked = false; } collect(light) { if (this._locked) return; this.lightsArray.push(light); if (castShadow(light)) { this.shadowsNum++; } } end(sceneData) { const lightsArray = this.lightsArray; const shadowsNum = this.shadowsNum; const groupList = this.groupList; lightsArray.sort(shadowCastingLightsFirst); let i, l; for (i = 0, l = groupList.length; i < l; i++) { groupList[i].begin(); } for (i = 0, l = lightsArray.length; i < l; i++) { this._distribute(lightsArray[i], i < shadowsNum); } for (i = 0, l = groupList.length; i < l; i++) { groupList[i].end(sceneData); } this._locked = true; } _distribute(light, shadow) { const groupMask = light.groupMask; const groupList = this.groupList; // optimize for single group if (groupList.length === 1 && groupMask & 1) { groupList[0].push(light, shadow); return; } for (let i = 0, l = groupList.length; i < l; i++) { const mask = 1 << i; if (groupMask < mask) break; if (groupMask & mask) { groupList[i].push(light, shadow); } } } } function shadowCastingLightsFirst(lightA, lightB) { const a = castShadow(lightA) ? 1 : 0; const b = castShadow(lightB) ? 1 : 0; return b - a; } function castShadow(light) { return light.shadow && light.castShadow; } function _isPerspectiveMatrix$1(m) { return m.elements[11] === -1; } let _cameraDataId = 0; /** * RenderStates collect all render states about scene and camera. */ class RenderStates { constructor(sceneData, lightingData) { this.scene = sceneData; this.lighting = lightingData; this.camera = { id: _cameraDataId++, version: 0, near: 0, far: 0, position: new Vector3(), logDepthCameraNear: 0, logDepthBufFC: 0, viewMatrix: new Matrix4(), projectionMatrix: new Matrix4(), projectionViewMatrix: new Matrix4(), rect: new Vector4(0, 0, 1, 1) }; this.gammaFactor = 2.0; this.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR; } /** * Update render states about camera. * @param {Camera} camera */ updateCamera(camera) { const sceneData = this.scene; const cameraData = this.camera; const projectionMatrix = camera.projectionMatrix; let cameraNear = 0, cameraFar = 0; if (_isPerspectiveMatrix$1(projectionMatrix)) { cameraNear = projectionMatrix.elements[14] / (projectionMatrix.elements[10] - 1); cameraFar = projectionMatrix.elements[14] / (projectionMatrix.elements[10] + 1); } else { cameraNear = (projectionMatrix.elements[14] + 1) / projectionMatrix.elements[10]; cameraFar = (projectionMatrix.elements[14] - 1) / projectionMatrix.elements[10]; } cameraData.near = cameraNear; cameraData.far = cameraFar; if (sceneData.logarithmicDepthBuffer) { cameraData.logDepthCameraNear = cameraNear; cameraData.logDepthBufFC = 2.0 / (Math.log(cameraFar - cameraNear + 1.0) * Math.LOG2E); } else { cameraData.logDepthCameraNear = 0; cameraData.logDepthBufFC = 0; } cameraData.position.setFromMatrixPosition(camera.worldMatrix); if (sceneData.useAnchorMatrix) { cameraData.position.applyMatrix4(sceneData.anchorMatrixInverse); } cameraData.viewMatrix.copy(camera.viewMatrix); if (sceneData.useAnchorMatrix) { cameraData.viewMatrix.multiply(sceneData.anchorMatrix); } cameraData.projectionMatrix.copy(projectionMatrix); cameraData.projectionViewMatrix.copy(projectionMatrix).multiply(cameraData.viewMatrix); cameraData.rect.copy(camera.rect); cameraData.version++; this.gammaFactor = camera.gammaFactor; this.outputEncoding = camera.outputEncoding; } } /** * RenderQueueLayer holds all the renderable objects. * Now has an opaque list and a transparent list. */ class RenderQueueLayer { /** * @param {number} id - layer id. */ constructor(id) { this.id = id; this.opaque = []; this.opaqueCount = 0; this.transparent = []; this.transparentCount = 0; this._cache = []; this._cacheIndex = 0; this._lastCacheIndex = 0; this.opaqueSortCompareFn = defaultOpaqueSortCompare; this.transparentSortCompareFn = defaultTransparentSortCompare; } begin() { this._cacheIndex = 0; this.opaqueCount = 0; this.transparentCount = 0; } end() { this.opaque.length = this.opaqueCount; this.transparent.length = this.transparentCount; // Clear references from inactive renderables in the list const cacheIndex = this._cacheIndex, lastCacheIndex = this._lastCacheIndex; if (lastCacheIndex > cacheIndex) { const cache = this._cache; for (let i = cacheIndex; i < lastCacheIndex; i++) { const renderable = cache[i]; renderable.object = null; renderable.geometry = null; renderable.material = null; renderable.group = null; } } this._lastCacheIndex = cacheIndex; } addRenderable(object, geometry, material, z, group) { const cache = this._cache; let renderable = cache[this._cacheIndex]; if (renderable === undefined) { renderable = { object: object, geometry: geometry, material: material, z: z, renderOrder: object.renderOrder, group: group }; cache[this._cacheIndex] = renderable; } else { renderable.object = object; renderable.geometry = geometry; renderable.material = material; renderable.z = z; renderable.renderOrder = object.renderOrder; renderable.group = group; } if (material.transparent) { this.transparent[this.transparentCount] = renderable; this.transparentCount++; } else { this.opaque[this.opaqueCount] = renderable; this.opaqueCount++; } this._cacheIndex++; } sort() { this.opaque.sort(this.opaqueSortCompareFn); quickSort(this.transparent, 0, this.transparent.length, this.transparentSortCompareFn); } } function defaultOpaqueSortCompare(a, b) { if (a.renderOrder !== b.renderOrder) { return a.renderOrder - b.renderOrder; } else if (a.material.id !== b.material.id) { return a.material.id - b.material.id; } else { return a.id - b.id; } } function defaultTransparentSortCompare(a, b) { if (a.renderOrder !== b.renderOrder) { return a.renderOrder - b.renderOrder; } else if (a.z !== b.z) { return b.z - a.z; } else if (a.material.id !== b.material.id) { // fix Unstable sort below chrome version 7.0 // if render same object with different materials return a.material.id - b.material.id; } else { return a.id - b.id; } } // Reference github.com/ant-galaxy/oasis-engine/blob/main/packages/core/src/RenderPipeline/RenderQueue.ts // quickSort is faster when sorting highly randomized arrays, // but for sorting lowly randomized arrays, Array.prototype.sort is faster, // so quickSort is more suitable for transparent list sorting. function quickSort(a, from, to, compareFunc) { while (true) { // Insertion sort is faster for short arrays. if (to - from <= 10) { insertionSort(a, from, to, compareFunc); return; } const third_index = from + to >> 1; // Find a pivot as the median of first, last and middle element. let v0 = a[from]; let v1 = a[to - 1]; let v2 = a[third_index]; const c01 = compareFunc(v0, v1); if (c01 > 0) { const tmp = v0; v0 = v1; v1 = tmp; } const c02 = compareFunc(v0, v2); if (c02 >= 0) { const tmp = v0; v0 = v2; v2 = v1; v1 = tmp; } else { const c12 = compareFunc(v1, v2); if (c12 > 0) { const tmp = v1; v1 = v2; v2 = tmp; } } a[from] = v0; a[to - 1] = v2; const pivot = v1; let low_end = from + 1; // Upper bound of elements lower than pivot. let high_start = to - 1; // Lower bound of elements greater than pivot. a[third_index] = a[low_end]; a[low_end] = pivot; // From low_end to i are elements equal to pivot. // From i to high_start are elements that haven't been compared yet. partition: for (let i = low_end + 1; i < high_start; i++) { let element = a[i]; let order = compareFunc(element, pivot); if (order < 0) { a[i] = a[low_end]; a[low_end] = element; low_end++; } else if (order > 0) { do { high_start--; if (high_start == i) break partition; const top_elem = a[high_start]; order = compareFunc(top_elem, pivot); } while (order > 0); a[i] = a[high_start]; a[high_start] = element; if (order < 0) { element = a[i]; a[i] = a[low_end]; a[low_end] = element; low_end++; } } } if (to - high_start < low_end - from) { quickSort(a, high_start, to, compareFunc); to = low_end; } else { quickSort(a, from, low_end, compareFunc); from = high_start; } } } function insertionSort(a, from, to, compareFunc) { for (let i = from + 1; i < to; i++) { let j; const element = a[i]; for (j = i - 1; j >= from; j--) { const tmp = a[j]; const order = compareFunc(tmp, element); if (order > 0) { a[j + 1] = tmp; } else { break; } } a[j + 1] = element; } } /** * RenderQueue is used to collect all renderable items, lights and skeletons from the scene. * Renderable items will be dispatched to the corresponding RenderQueueLayer according to the object's renderLayer property. */ class RenderQueue { constructor() { this.layerMap = new Map(); this.layerList = []; this.skeletons = new Set(); // to optimize the performance of the next push, cache the last layer used this._lastLayer = this.createLayer(0); } begin() { for (let i = 0, l = this.layerList.length; i < l; i++) { this.layerList[i].begin(); } this.skeletons.clear(); } end() { for (let i = 0, l = this.layerList.length; i < l; i++) { this.layerList[i].end(); this.layerList[i].sort(); } } push(object, camera) { // collect skeleton if exists if (object.skeleton) { this.skeletons.add(object.skeleton); } _vec4.setFromMatrixPosition(object.worldMatrix).applyMatrix4(camera.projectionViewMatrix); const clipZ = _vec4.z; const layerId = object.renderLayer || 0; let layer = this._lastLayer; if (layer.id !== layerId) { layer = this.layerMap.get(layerId); if (!layer) { layer = this.createLayer(layerId); } this._lastLayer = layer; } if (Array.isArray(object.material)) { const groups = object.geometry.groups; for (let i = 0; i < groups.length; i++) { const group = groups[i]; const groupMaterial = object.material[group.materialIndex]; if (groupMaterial) { layer.addRenderable(object, object.geometry, groupMaterial, clipZ, group); } } } else { layer.addRenderable(object, object.geometry, object.material, clipZ); } } /** * Set a render queue layer. * @param {number} id - The layer id. * @param {RenderQueueLayer} layer - The layer to set. */ setLayer(id, layer) { this.layerMap.set(id, layer); this.layerList.push(layer); this.layerList.sort(sortLayer); } /** * Create and set a render queue layer. * @param {number} id - The layer id. * @returns {RenderQueueLayer} */ createLayer(id) { const layer = new RenderQueueLayer(id); this.setLayer(id, layer); return layer; } /** * Get the render queue layer. * @param {number} id - The layer id. * @returns {RenderQueueLayer} */ getLayer(id) { return this.layerMap.get(id); } /** * Remove the render queue layer. * @param {number} id - The layer id. */ removeLayer(id) { const layer = this.layerMap.get(id); if (layer) { this.layerMap.delete(id); const index = this.layerList.indexOf(layer); if (index !== -1) { this.layerList.splice(index, 1); } if (this._lastLayer === id) { this._lastLayer = null; } } } } const _vec4 = new Vector4(); function sortLayer(a, b) { return a.id - b.id; } /** * RenderCollector traverses the scene graph and collects all necessary rendering information. * It manages scene data, lighting data, and per-camera render states/queues. */ class RenderCollector { /** * Creates a new RenderCollector instance. * In most cases, RenderCollector does not need to be created manually, * as Scene will automatically create one. See {@link Scene#collector}. */ constructor() { // collects scene and lighting data for single scene this.sceneData = new SceneData(); this.lightingData = new LightingData(); // collects render states and render queues for each camera this._renderStatesMap = new WeakMap(); this._renderQueueMap = new WeakMap(); // internal states this._lightingNeedsUpdate = true; this._skeletonVersion = 1; const _boundingSphere = new Sphere(); /** * Visibility checking function called during scene traversal. * Determines whether an object should be included in the render queue. * Can be overridden to implement custom culling logic (LOD, distance, etc.). * @param {Object3D} object - The object to test for visibility. * @param {Camera} camera - The camera to test against. * @returns {boolean} True if the object should be rendered, false to cull it. * @type {Function} * @example * // Custom visibility check that always returns true * collector.checkVisibility = function(object, camera) { * return true; * }; */ this.checkVisibility = function (object, camera) { if (!object.renderable) { return false; } if (!object.frustumCulled || !camera.frustumCulled) { return true; } _boundingSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix); return camera.frustum.intersectsSphere(_boundingSphere); }; } /** * Setting this property to `true` indicates the lighting data needs to be updated. * Lighting data updates are triggered by the {@link RenderCollector#traverseAndCollect} method. * @type {boolean} * @default false * @param {boolean} value */ set lightingNeedsUpdate(value) { if (value) { this._lightingNeedsUpdate = true; } } /** * Setting this property to `true` indicates all skeletons in the scene should be updated. * Skeleton updates are triggered by the {@link RenderCollector#traverseAndCollect} method. * @type {boolean} * @default false * @param {boolean} value */ set skeletonNeedsUpdate(value) { if (value) { this._skeletonVersion++; } } /** * Get the RenderStates for the scene and camera. * If the RenderStates for the camera does not exist, it will be created. * @param {Camera} camera - The render camera. * @returns {RenderStates} The target render states. */ getRenderStates(camera) { let renderStates = this._renderStatesMap.get(camera); if (!renderStates) { // every camera has its own RenderStates // but they share the same scene and lighting data renderStates = new RenderStates(this.sceneData, this.lightingData); this._renderStatesMap.set(camera, renderStates); } return renderStates; } /** * Get the RenderQueue for the scene and camera. * If the RenderQueue for the camera does not exist, it will be created. * @param {Camera} camera - The render camera. * @returns {RenderQueue} The target render queue. */ getRenderQueue(camera) { let renderQueue = this._renderQueueMap.get(camera); if (!renderQueue) { renderQueue = new RenderQueue(); this._renderQueueMap.set(camera, renderQueue); } return renderQueue; } /** * Traverse the scene and collect all renderable objects, lights and skeletons. * This method will update the RenderQueue and RenderStates for the camera. * @param {Scene} scene - The scene to traverse. * @param {Camera} camera - The camera to collect renderable objects for. * @returns {RenderQueue} The collected render queue. */ traverseAndCollect(scene, camera) { const sceneData = this.sceneData; const lightingData = this.lightingData; const lightingNeedsUpdate = this._lightingNeedsUpdate; const renderQueue = this.getRenderQueue(camera); if (lightingNeedsUpdate) { lightingData.begin(); } renderQueue.begin(); this._traverseAndCollect(scene, camera, renderQueue); renderQueue.end(); if (lightingNeedsUpdate) { lightingData.end(sceneData); this._lightingNeedsUpdate = false; } // Since skeletons may be referenced by different mesh, // it is necessary to collect skeletons in the scene in order to avoid repeated updates. // For IOS platform, we should try to avoid repeated texture updates within one frame, // otherwise the performance will be seriously degraded. const skeletonVersion = this._skeletonVersion; for (const skeleton of _skeletons) { // Skeleton version ensures uncollected skeletons will be updated in subsequent frames if (skeleton._version !== skeletonVersion) { skeleton.updateBones(sceneData); skeleton._version = skeletonVersion; } } _skeletons.clear(); return renderQueue; } _traverseAndCollect(object, camera, renderQueue) { if (!object.visible) { return; } if (object.isMesh) { if (this.checkVisibility(object, camera)) { renderQueue.push(object, camera); if (object.skeleton) { _skeletons.add(object.skeleton); } } } else if (object.isLight) { this.lightingData.collect(object); } const children = object.children; for (let i = 0, l = children.length; i < l; i++) { this._traverseAndCollect(children[i], camera, renderQueue); } } } const _skeletons = new Set(); /** * Scenes allow you to set up what and where is to be rendered, * this is where you place objects, lights and cameras. * @extends Object3D */ class Scene extends Object3D { /** * Create a scene. */ constructor() { super(); /** * A {@link Fog} instance defining the type of fog that affects everything rendered in the scene. * @type {Fog} * @default null */ this.fog = null; /** * Sets the environment map for all materials in the scene. * However, it's not possible to overwrite an existing texture assigned to Material.envMap. * @type {TextureCube | null} * @default null */ this.environment = null; /** * The diffuse intensity of the environment map. * @type {number} * @default 1 */ this.envDiffuseIntensity = 1; /** * The specular intensity of the environment map. * This value is multiplied with the envMapIntensity of the material to get the final intensity. * @type {number} * @default 1 */ this.envSpecularIntensity = 1; /** * User-defined clipping planes specified as {@link Plane} objects in world space. * These planes apply to the scene. * Points in space whose dot product with the plane is negative are cut away. * @type {Plane[]} * @default [] */ this.clippingPlanes = []; /** * Defines whether disable shadow sampler feature. * Shader with sampler2DShadow uniforms may cause unknown error on some android phones, set disableShadowSampler to true to avoid these bugs. * When this property is set to true, soft shadow types will fallback to POISSON_SOFT without warning. * @type {boolean} * @default false */ this.disableShadowSampler = false; /** * whether to use a logarithmic depth buffer. It may be neccesary to use this if dealing with huge differences in scale in a single scene. * Note that this setting uses gl_FragDepth if available which disables the Early Fragment Test optimization and can cause a decrease in performance. * @type {boolean} * @default false */ this.logarithmicDepthBuffer = false; /** * The anchor matrix of the world coordinate system. * If it is not an identity matrix, the actual lighting calculating and the world position in the shader, will be in the anchor coordinate system. * By setting this property, you can solve the floating point precision problem caused by the rendering object far away from the origin of the world coordinate system. * In addition, by setting the rotation, it can also repair the direction of the reflection. * @type {Matrix4} */ this.anchorMatrix = new Matrix4(); /** * A {@link RenderCollector} instance for this scene. * @type {RenderCollector} */ this.collector = new RenderCollector(); } /** * The maximum number of lighting groups. * @type {number} * @default 1 */ set maxLightingGroups(value) { this.collector.lightingData.setMaxGroupCount(value); } get maxLightingGroups() { return this.collector.lightingData.groupList.length; } /** * Get {@link RenderStates} for the scene and camera. * The RenderStates will be updated by calling {@link Scene#updateRenderStates}. * The light data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @returns {RenderQueue} - The target render queue. */ getRenderStates(camera) { return this.collector.getRenderStates(camera); } /** * Get {@link RenderQueue} for the scene and camera. * The RenderQueue will be updated by calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @returns {RenderQueue} - The target render queue. */ getRenderQueue(camera) { return this.collector.getRenderQueue(camera); } /** * Update {@link RenderStates} for the scene and camera. * The lighting data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @param {boolean} [updateScene=true] - Whether to update scene data. * @returns {RenderStates} - The result render states. */ updateRenderStates(camera, updateScene = true) { const collector = this.collector; if (updateScene) { collector.sceneData.update(this); } const renderStates = collector.getRenderStates(camera); renderStates.updateCamera(camera); return renderStates; } /** * Update {@link RenderQueue} for the scene and camera. * Collect all visible meshes (and lights) from scene graph, and push meshes to render queue. * Light data will be stored in RenderStates. * @param {Camera} camera - The camera. * @param {boolean} [collectLights=true] - Whether to collect light data. * @param {boolean} [updateSkeletons=true] - Whether to update skeletons. * @returns {RenderQueue} - The result render queue. */ updateRenderQueue(camera, collectLights = true, updateSkeletons = true) { const collector = this.collector; collector.lightingNeedsUpdate = collectLights; collector.skeletonNeedsUpdate = updateSkeletons; return collector.traverseAndCollect(this, camera); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Scene.prototype.isScene = true; /** * Base camera projection class. All projection types should inherit from this. * Should not be instantiated directly; subclasses must implement matrix calculation. * @abstract */ class CameraProjection { /** * Creates a CameraProjection instance. */ constructor() { this._matrix = new Matrix4(); this._dirty = true; } /** * Get the current projection matrix. * @returns {Matrix4} The projection matrix. */ get matrix() { if (this._dirty) { this._updateMatrix(); } return this._matrix; } /** * Copy parameters from another CameraProjection. Should be implemented by subclasses. * @param {CameraProjection} source The source projection object. * @returns {CameraProjection} this */ copy(source) { console.warn('CameraProjection: copy() must be implemented in subclass.'); return this; } /** * Clone this projection object. * @returns {CameraProjection} A new projection object. */ clone() { return new this.constructor().copy(this); } /** * Update the projection matrix. Should be implemented by subclasses. * @protected */ _updateMatrix() { console.warn('CameraProjection: _updateMatrix() must be implemented in subclass.'); this._dirty = false; } } /** * Perspective projection camera class. * Generates a perspective projection matrix based on field of view, aspect ratio, near and far planes. * Field of view is specified in degrees. */ class PerspectiveProjection extends CameraProjection { /** * Creates a PerspectiveProjection instance. * @param {number} [fov=50] Vertical field of view in degrees. * @param {number} [aspect=1] Aspect ratio (width / height). * @param {number} [near=0.1] Near clipping plane. * @param {number} [far=2000] Far clipping plane. */ constructor(fov = 50, aspect = 1, near = 0.1, far = 2000) { super(); this._fov = fov; this._aspect = aspect; this._near = near; this._far = far; } /** * The vertical field of view in degrees. * @type {number} * @default 50 */ set fov(value) { this._fov = value; this._dirty = true; } get fov() { return this._fov; } /** * The aspect ratio (width / height). * @type {number} * @default 1 */ set aspect(value) { this._aspect = value; this._dirty = true; } get aspect() { return this._aspect; } /** * The near clipping plane. * @type {number} * @default 0.1 */ set near(value) { this._near = value; this._dirty = true; } get near() { return this._near; } /** * The far clipping plane. * @type {number} * @default 2000 */ set far(value) { this._far = value; this._dirty = true; } get far() { return this._far; } /** * Sets all perspective parameters at once. * @param {number} fov Vertical field of view in degrees. * @param {number} aspect Aspect ratio (width / height). * @param {number} near Near clipping plane. * @param {number} far Far clipping plane. * @returns {PerspectiveProjection} this */ set(fov, aspect, near, far) { this._fov = fov; this._aspect = aspect; this._near = near; this._far = far; this._dirty = true; return this; } /** * Copies the parameters from another PerspectiveProjection. * @param {PerspectiveProjection} source * @returns {PerspectiveProjection} this */ copy(source) { this._fov = source._fov; this._aspect = source._aspect; this._near = source._near; this._far = source._far; this._dirty = true; return this; } /** * Updates the perspective projection matrix. * @protected */ _updateMatrix() { const fov = this._fov * Math.PI / 180, aspect = this._aspect, near = this._near, far = this._far; const f = 1 / Math.tan(fov / 2); this._matrix.set(f / aspect, 0, 0, 0, 0, f, 0, 0, 0, 0, (far + near) / (near - far), 2 * far * near / (near - far), 0, 0, -1, 0); this._dirty = false; } } /** * Orthographic projection camera class. * Generates an orthographic projection matrix based on left, right, top, bottom, near, and far planes. */ class OrthographicProjection extends CameraProjection { /** * Creates an OrthographicProjection instance. * @param {number} [left=-1] Left plane of the orthographic box. * @param {number} [right=1] Right plane of the orthographic box. * @param {number} [top=1] Top plane of the orthographic box. * @param {number} [bottom=-1] Bottom plane of the orthographic box. * @param {number} [near=0.1] Near clipping plane. * @param {number} [far=2000] Far clipping plane. */ constructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000) { super(); this._left = left; this._right = right; this._top = top; this._bottom = bottom; this._near = near; this._far = far; } /** * The left plane of the orthographic box. * @type {number} * @default -1 */ set left(value) { this._left = value; this._dirty = true; } get left() { return this._left; } /** * The right plane of the orthographic box. * @type {number} * @default 1 */ set right(value) { this._right = value; this._dirty = true; } get right() { return this._right; } /** * The top plane of the orthographic box. * @type {number} * @default 1 */ set top(value) { this._top = value; this._dirty = true; } get top() { return this._top; } /** * The bottom plane of the orthographic box. * @type {number} * @default -1 */ set bottom(value) { this._bottom = value; this._dirty = true; } get bottom() { return this._bottom; } /** * The near clipping plane. * @type {number} * @default 0.1 */ set near(value) { this._near = value; this._dirty = true; } get near() { return this._near; } /** * The far clipping plane. * @type {number} * @default 2000 */ set far(value) { this._far = value; this._dirty = true; } get far() { return this._far; } /** * Sets all orthographic parameters at once. * @param {number} left The left plane of the orthographic box. * @param {number} right The right plane of the orthographic box. * @param {number} top The top plane of the orthographic box. * @param {number} bottom The bottom plane of the orthographic box. * @param {number} near The near clipping plane. * @param {number} far The far clipping plane. * @returns {OrthographicProjection} this */ set(left, right, top, bottom, near, far) { this._left = left; this._right = right; this._top = top; this._bottom = bottom; this._near = near; this._far = far; this._dirty = true; return this; } /** * Sets the orthographic box size by width and height, centered at (0, 0). * @param {number} width The width of the orthographic box. * @param {number} height The height of the orthographic box. * @returns {OrthographicProjection} this */ setSize(width, height) { this._left = -width / 2; this._right = width / 2; this._top = height / 2; this._bottom = -height / 2; this._dirty = true; return this; } /** * Copies the parameters from another OrthographicProjection. * @param {OrthographicProjection} source * @returns {OrthographicProjection} this */ copy(source) { this._left = source._left; this._right = source._right; this._top = source._top; this._bottom = source._bottom; this._near = source._near; this._far = source._far; this._dirty = true; return this; } /** * Updates the orthographic projection matrix. * @protected */ _updateMatrix() { const left = this._left, right = this._right, bottom = this._bottom, top = this._top, near = this._near, far = this._far; this._matrix.set(2 / (right - left), 0, 0, -(right + left) / (right - left), 0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom), 0, 0, -2 / (far - near), -(far + near) / (far - near), 0, 0, 0, 1); this._dirty = false; } } /** * The camera used for rendering a 3D scene. * The camera's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed camera points down the -Z axis. * @extends Object3D */ class Camera extends Object3D { /** * Create a camera. */ constructor() { super(); /** * This is the inverse of worldMatrix. * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here. * @type {Matrix4} */ this.viewMatrix = new Matrix4(); /** * This is the matrix which contains the projection. * @type {Matrix4} */ this.projectionMatrix = new Matrix4(); /** * This is the matrix which contains the projection. * @type {Matrix4} */ this.projectionMatrixInverse = new Matrix4(); /** * This is the matrix which contains the projection and view matrix. * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here. * @type {Matrix4} */ this.projectionViewMatrix = new Matrix4(); /** * The frustum of the camera. * @type {Frustum} */ this.frustum = new Frustum(); /** * The factor of gamma. * @type {number} * @default 2.0 */ this.gammaFactor = 2.0; /** * Output pixel encoding. * @type {TEXEL_ENCODING_TYPE} * @default TEXEL_ENCODING_TYPE.LINEAR */ this.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR; /** * Where on the screen is the camera rendered in normalized coordinates. * The values in rect range from zero (left/bottom) to one (right/top). * @type {Vector4} * @default Vector4(0, 0, 1, 1) */ this.rect = new Vector4(0, 0, 1, 1); /** * When this is set, it checks every frame if objects are in the frustum of the camera before rendering objects. * Otherwise objects gets rendered every frame even if it isn't visible. * @type {boolean} * @default true */ this.frustumCulled = true; } /** * Set view by look at, this func will set quaternion of this camera. * @param {Vector3} target - The target that the camera look at. * @param {Vector3} up - The up direction of the camera. */ lookAt(target, up) { _mat4_1.lookAtRH(this.position, target, up); this.quaternion.setFromRotationMatrix(_mat4_1); } /** * Set orthographic projection matrix. * @param {number} left Camera frustum left plane. * @param {number} right Camera frustum right plane. * @param {number} bottom Camera frustum bottom plane. * @param {number} top Camera frustum top plane. * @param {number} near Camera frustum near plane. * @param {number} far Camera frustum far plane. * @deprecated Use OrthographicProjection instead. */ setOrtho(left, right, bottom, top, near, far) { _orthographicProjection.set(left, right, top, bottom, near, far); this.setProjectionMatrix(_orthographicProjection.matrix); } /** * Set perspective projection matrix. * @param {number} fov Camera frustum vertical field of view. * @param {number} aspect Camera frustum aspect ratio. * @param {number} near Camera frustum near plane. * @param {number} far Camera frustum far plane. * @deprecated Use PerspectiveProjection instead. */ setPerspective(fov, aspect, near, far) { _perspectiveProjection.set(fov * 180 / Math.PI, aspect, near, far); this.setProjectionMatrix(_perspectiveProjection.matrix); } /** * Set the projection matrix. * @param {Matrix4} matrix The projection matrix. */ setProjectionMatrix(matrix) { this.projectionMatrix.copy(matrix); this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); } getWorldDirection(optionalTarget = new Vector3()) { return super.getWorldDirection(optionalTarget).negate(); } updateMatrix(force) { Object3D.prototype.updateMatrix.call(this, force); this.viewMatrix.copy(this.worldMatrix).invert(); // update view matrix this.projectionViewMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix); // get PV matrix this.frustum.setFromMatrix(this.projectionViewMatrix); // update frustum } copy(source, recursive) { Object3D.prototype.copy.call(this, source, recursive); this.viewMatrix.copy(source.viewMatrix); this.projectionMatrix.copy(source.projectionMatrix); this.projectionMatrixInverse.copy(source.projectionMatrixInverse); this.frustum.copy(source.frustum); this.gammaFactor = source.gammaFactor; this.outputEncoding = source.outputEncoding; this.rect.copy(source.rect); this.frustumCulled = source.frustumCulled; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Camera.prototype.isCamera = true; const _mat4_1 = new Matrix4(); const _perspectiveProjection = new PerspectiveProjection(); const _orthographicProjection = new OrthographicProjection(); const _sphere = new Sphere(); const _inverseMatrix = new Matrix4(); const _ray = new Ray(); const _barycoord = new Vector3(); const _vA = new Vector3(); const _vB = new Vector3(); const _vC = new Vector3(); const _tempA = new Vector3(); const _morphA = new Vector3(); const _uvA = new Vector2(); const _uvB = new Vector2(); const _uvC = new Vector2(); const _intersectionPoint = new Vector3(); const _intersectionPointWorld = new Vector3(); /** * Class representing triangular polygon mesh based objects. * Also serves as a base for other classes such as {@link SkinnedMesh}. * @extends Object3D */ class Mesh extends Object3D { /** * @param {Geometry} geometry — an instance of {@link Geometry}. * @param {Material} material - a single or an array of {@link Material}. */ constructor(geometry, material) { super(); /** * an instance of {@link Geometry}. * @type {Geometry} */ this.geometry = geometry; /** * a single or an array of {@link Material}. * @type {Material|Material[]} */ this.material = material; /** * An array of weights typically from 0-1 that specify how much of the morph is applied. * @type {number[] | null} * @default null */ this.morphTargetInfluences = null; } /** * Get the local-space position of the vertex at the given index, * taking into account the current animation state of both morph targets and skinning. * @param {number} index - The index of the vertex. * @param {Vector3} target - The target vector. * @returns {Vector3} The target vector. */ getVertexPosition(index, target) { const geometry = this.geometry; const position = geometry.getAttribute('a_Position'); const morphPosition = geometry.morphAttributes.position; target.fromArray(position.buffer.array, index * position.buffer.stride + position.offset); const morphInfluences = this.morphTargetInfluences; if (morphPosition && morphInfluences) { _morphA.set(0, 0, 0); for (let i = 0, il = morphPosition.length; i < il; i++) { const influence = morphInfluences[i]; const morphAttribute = morphPosition[i]; if (influence === 0) continue; _tempA.fromArray(morphAttribute.buffer.array, index * morphAttribute.buffer.stride + morphAttribute.offset); _morphA.addScaledVector(_tempA, influence); } target.add(_morphA); } return target; } raycast(ray, intersects) { const geometry = this.geometry; const material = this.material; const worldMatrix = this.worldMatrix; _sphere.copy(geometry.boundingSphere); _sphere.applyMatrix4(worldMatrix); if (!ray.intersectsSphere(_sphere)) { return; } _inverseMatrix.copy(worldMatrix).invert(); _ray.copy(ray).applyMatrix4(_inverseMatrix); if (!_ray.intersectsBox(geometry.boundingBox)) { return; } const position = geometry.getAttribute('a_Position'); if (!position) { return; } const uv = geometry.getAttribute('a_Uv'); const groups = geometry.groups; let intersection; if (geometry.index) { const index = geometry.index.buffer.array; if (Array.isArray(material)) { for (let i = 0, il = groups.length; i < il; i++) { const group = groups[i]; const groupMaterial = material[group.materialIndex]; const start = group.start; const end = Math.min(index.length, group.start + group.count); for (let j = start, jl = end; j < jl; j += 3) { const a = index[j]; const b = index[j + 1]; const c = index[j + 2]; intersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersection.face.materialIndex = group.materialIndex; intersects.push(intersection); } } } } else { for (let i = 0, il = index.length; i < il; i += 3) { const a = index[i]; const b = index[i + 1]; const c = index[i + 2]; intersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersects.push(intersection); } } } } else { if (Array.isArray(material)) { for (let i = 0, il = groups.length; i < il; i++) { const group = groups[i]; const groupMaterial = material[group.materialIndex]; const start = group.start; const end = Math.min(position.buffer.count, group.start + group.count); for (let j = start, jl = end; j < jl; j += 3) { const a = j; const b = j + 1; const c = j + 2; intersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersection.face.materialIndex = group.materialIndex; intersects.push(intersection); } } } } else { for (let i = 0, il = position.buffer.count; i < il; i += 3) { const a = i; const b = i + 1; const c = i + 2; intersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersects.push(intersection); } } } } } copy(source) { super.copy(source); if (source.morphTargetInfluences) { this.morphTargetInfluences = source.morphTargetInfluences.slice(); } return this; } clone() { return new this.constructor(this.geometry, this.material).copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Mesh.prototype.isMesh = true; function checkGeometryIntersection(object, material, ray, _ray, uv, a, b, c) { object.getVertexPosition(a, _vA); object.getVertexPosition(b, _vB); object.getVertexPosition(c, _vC); const intersection = checkIntersection(object, material, ray, _ray, _vA, _vB, _vC, _intersectionPoint); if (intersection) { let array; let bufferStride; let attributeOffset; if (uv) { array = uv.buffer.array; bufferStride = uv.buffer.stride; attributeOffset = uv.offset; _uvA.fromArray(array, a * bufferStride + attributeOffset); _uvB.fromArray(array, b * bufferStride + attributeOffset); _uvC.fromArray(array, c * bufferStride + attributeOffset); intersection.uv = uvIntersection(_intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC); } const face = { a: a, b: b, c: c, normal: new Vector3() }; Triangle.normal(_vA, _vB, _vC, face.normal); intersection.face = face; } return intersection; } function uvIntersection(point, p1, p2, p3, uv1, uv2, uv3) { Triangle.barycoordFromPoint(point, p1, p2, p3, _barycoord); uv1.multiplyScalar(_barycoord.x); uv2.multiplyScalar(_barycoord.y); uv3.multiplyScalar(_barycoord.z); uv1.add(uv2).add(uv3); return uv1.clone(); } function checkIntersection(object, material, ray, localRay, pA, pB, pC, point) { let intersect; if (material.side === DRAW_SIDE.BACK) { intersect = localRay.intersectTriangle(pC, pB, pA, true, point); } else { intersect = localRay.intersectTriangle(pA, pB, pC, material.side !== DRAW_SIDE.DOUBLE, point); } if (intersect === null) return null; _intersectionPointWorld.copy(point); _intersectionPointWorld.applyMatrix4(object.worldMatrix); const distance = ray.origin.distanceTo(_intersectionPointWorld); return { distance: distance, point: _intersectionPointWorld.clone(), object: object }; } /** * The Attribute add structural information to Buffer. * This class stores data for an attribute (such as vertex positions, face indices, normals, colors, UVs, and any custom attributes ) associated with a Geometry, which allows for more efficient passing of data to the GPU. * Data is stored as vectors of any length (defined by size). */ class Attribute { /** * @param {Buffer} buffer - The Buffer instance passed in the constructor. * @param {number} [size=buffer.stride] - The number of values of the array that should be associated with a particular vertex. For instance, if this attribute is storing a 3-component vector (such as a position, normal, or color), then size should be 3. * @param {number} [offset=0] - The offset in the underlying array buffer where an item starts. * @param {boolean} [normalized=false] - Indicates how the underlying data in the buffer maps to the values in the GLSL shader code. */ constructor(buffer, size = buffer.stride, offset = 0, normalized = false) { /** * The Buffer instance passed in the constructor. * @type {Buffer} */ this.buffer = buffer; /** * The number of values of the buffer that should be associated with the attribute. * @type {number} * @default buffer.stride */ this.size = size; /** * The offset in the underlying buffer where an item starts. * @type {number} * @default 0 */ this.offset = offset; /** * Indicates how the underlying data in the buffer maps to the values in the GLSL shader code. * @type {boolean} * @default false */ this.normalized = normalized; /** * Instance cadence, the number of instances drawn for each vertex in the buffer, non-instance attributes must be 0. * @type {number} * @default 0 */ this.divisor = 0; } /** * Copy the parameters from the passed attribute. * @param {Attribute} source - The attribute to be copied. * @returns {Attribute} */ copy(source) { this.buffer = source.buffer; this.size = source.size; this.offset = source.offset; this.normalized = source.normalized; this.divisor = source.divisor; return this; } /** * Return a new attribute with the same parameters as this attribute. * @param {object} buffers - A WeakMap to save shared buffers. * @returns {Attribute} */ clone(buffers) { let attribute; if (!buffers) { console.warn('Attribute.clone(): now requires a WeakMap as an argument to save shared buffers.'); attribute = new Attribute(this.buffer.clone(), this.size, this.offset, this.normalized); attribute.divisor = this.divisor; return attribute; } if (!buffers.has(this.buffer)) { buffers.set(this.buffer, this.buffer.clone()); } attribute = new Attribute(buffers.get(this.buffer), this.size, this.offset, this.normalized); attribute.divisor = this.divisor; return attribute; } } /** * The Buffer contain the data that is used for the geometry of 3D models, animations, and skinning. */ class Buffer { /** * @param {TypedArray} array -- A typed array with a shared buffer. Stores the geometry data. * @param {number} stride -- The number of typed-array elements per vertex. */ constructor(array, stride) { /** * A typed array with a shared buffer. * Stores the geometry data. * @type {TypedArray} */ this.array = array; /** * The number of typed-array elements per vertex. * @type {number} */ this.stride = stride; /** * Gives the total number of elements in the array. * @type {number} */ this.count = array !== undefined ? array.length / stride : 0; /** * Defines the intended usage pattern of the data store for optimization purposes. * Corresponds to the usage parameter of WebGLRenderingContext.bufferData(). * @type {BUFFER_USAGE} * @default BUFFER_USAGE.STATIC_DRAW */ this.usage = BUFFER_USAGE.STATIC_DRAW; /** * Object containing offset and count. * @type {object} * @default { offset: 0, count: - 1 } */ this.updateRange = { offset: 0, count: -1 }; /** * A version number, incremented every time the data is changed. * @type {number} * @default 0 */ this.version = 0; } /** * A callback function that is executed after the Renderer has transferred the attribute array data to the GPU. */ onUploadCallback() {} /** * Copies another Buffer to this Buffer. * @param {Buffer} source - The buffer to be copied. * @returns {Buffer} */ copy(source) { this.array = new source.array.constructor(source.array); this.stride = source.stride; this.count = source.array.length / this.stride; this.usage = source.usage; return this; } /** * Return a copy of this buffer. * @returns {Buffer} */ clone() { const array = new this.array.constructor(this.array); const ib = new Buffer(array, this.stride); ib.usage = this.usage; return ib; } } let _geometryId = 0; const _vector$1 = new Vector3(); const _offset = new Vector3(); const _sum = new Vector3(); const _box3 = new Box3(); const _boxMorphTargets = new Box3(); /** * An efficient representation of mesh, line, or point geometry. * Includes vertex positions, face indices, normals, colors, UVs, and custom attributes within buffers, reducing the cost of passing all this data to the GPU. * To read and edit data in {@link Geometry#attributes}. * @extends EventDispatcher */ class Geometry extends EventDispatcher { /** * Create a geometry. */ constructor() { super(); /** * Unique number for this geometry instance. * @readonly * @type {number} */ this.id = _geometryId++; /** * UUID of this geometry instance. * This gets automatically assigned, so this shouldn't be edited. * @readonly * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * This hashmap has as id the name of the attribute to be set and as value the buffer to set it to. * Rather than accessing this property directly, use {@link Geometry#addAttribute} and {@link Geometry#getAttribute} to access attributes of this geometry. * @type {object} */ this.attributes = {}; /** * Hashmap of Attributes Array for morph targets. * @type {object} */ this.morphAttributes = {}; /** * Allows for vertices to be re-used across multiple triangles; this is called using "indexed triangles" and each triangle is associated with the indices of three vertices. * This attribute therefore stores the index of each vertex for each triangular face. * If this attribute is not set, the renderer assumes that each three contiguous positions represent a single triangle. * @type {Attribute | null} */ this.index = null; /** * Bounding box for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingBox}. * @type {Box3} * @default Box3() */ this.boundingBox = new Box3(); /** * Bounding sphere for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingSphere}. * @type {Sphere} * @default Sphere() */ this.boundingSphere = new Sphere(); /** * Split the geometry into groups, each of which will be rendered in a separate WebGL draw call. This allows an array of materials to be used with the geometry. * Each group is an object of the form: { start: Integer, count: Integer, materialIndex: Integer }, * or { multiDrawStarts: Integer[], multiDrawCounts: Integer[], multiDrawCount: Integer, materialIndex: Integer } if multiDraw is available. * @type {Array} * @default [] */ this.groups = []; /** * The number of instances to be rendered. If set to -1 (default), instanced rendering is disabled. * This property is used for instanced rendering, where multiple copies of the geometry * are drawn with a single draw call. * @type {number} * @default -1 */ this.instanceCount = -1; /** * A version number, incremented every time the attribute object or index object changes to mark VAO drity. * @type {number} * @default 0 */ this.version = 0; } /** * Adds an attribute to this geometry. * Use this rather than the attributes property. * @param {string} name * @param {Attribute} attribute */ addAttribute(name, attribute) { this.attributes[name] = attribute; } /** * Returns the attribute with the specified name. * @param {string} name * @returns {Attribute} */ getAttribute(name) { return this.attributes[name]; } /** * Removes the attribute with the specified name. * @param {string} name */ removeAttribute(name) { delete this.attributes[name]; } /** * Set the {@link Geometry#index} buffer. * @param {Array | Attribute | null} index */ setIndex(index) { if (Array.isArray(index)) { const typedArray = new (arrayMax(index) > 65535 ? Uint32Array : Uint16Array)(index); this.index = new Attribute(new Buffer(typedArray, 1)); } else { this.index = index; } } /** * Adds a group to this geometry; see the {@link Geometry#groups} for details. * @param {number} start * @param {number} count * @param {number} [materialIndex=0] */ addGroup(start, count, materialIndex = 0) { this.groups.push({ start: start, count: count, materialIndex: materialIndex }); } /** * Clears all groups. */ clearGroups() { this.groups = []; } /** * Computes bounding box of the geometry, updating {@link Geometry#boundingBox}. * Bounding boxes aren't computed by default. They need to be explicitly computed. */ computeBoundingBox() { const position = this.attributes['a_Position'] || this.attributes['position']; if (position) { this.boundingBox.setFromArray(position.buffer.array, position.buffer.stride, position.offset, position.normalized); } const morphAttributesPosition = this.morphAttributes.position; if (morphAttributesPosition) { for (let i = 0; i < morphAttributesPosition.length; i++) { const morphAttribute = morphAttributesPosition[i]; _box3.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized); _vector$1.addVectors(this.boundingBox.min, _box3.min); this.boundingBox.expandByPoint(_vector$1); _vector$1.addVectors(this.boundingBox.max, _box3.max); this.boundingBox.expandByPoint(_vector$1); } } } /** * Computes bounding sphere of the geometry, updating {@link Geometry#boundingSphere}. * Bounding spheres aren't computed by default. They need to be explicitly computed. */ computeBoundingSphere() { const position = this.attributes['a_Position'] || this.attributes['position']; const morphAttributesPosition = this.morphAttributes.position; if (!position) { return; } const bufferStride = position.buffer.stride; const positionOffset = position.offset; if (morphAttributesPosition) { _box3.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized); for (let i = 0; i < morphAttributesPosition.length; i++) { const morphAttribute = morphAttributesPosition[i]; _boxMorphTargets.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized); _vector$1.addVectors(_box3.min, _boxMorphTargets.min); _box3.expandByPoint(_vector$1); _vector$1.addVectors(_box3.max, _boxMorphTargets.max); _box3.expandByPoint(_vector$1); } const center = this.boundingSphere.center; _box3.getCenter(center); let maxRadiusSq = 0; for (let i = 0; i < position.buffer.count; i++) { _offset.fromArray(position.buffer.array, i * bufferStride + positionOffset); maxRadiusSq = center.distanceToSquared(_offset); for (let j = 0; j < morphAttributesPosition.length; j++) { const morphAttribute = morphAttributesPosition[j]; _vector$1.fromArray(morphAttribute.buffer.array, i * morphAttribute.buffer.stride + morphAttribute.offset); _sum.addVectors(_offset, _vector$1); const offsetLengthSq = center.distanceToSquared(_sum); // TODO The maximum radius cannot be obtained here if (offsetLengthSq > maxRadiusSq) { maxRadiusSq = offsetLengthSq; _offset.add(_vector$1); } } } this.boundingSphere.radius = Math.sqrt(maxRadiusSq); } else { this.boundingSphere.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized); } } /** * Disposes the object from memory. * You need to call this when you want the BufferGeometry removed while the application is running. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } /** * Copies another Geometry to this Geometry. * @param {Geometry} source - The geometry to be copied. * @returns {Geometry} */ copy(source) { let name, i, l; // reset this.index = null; this.attributes = {}; this.morphAttributes = {}; this.groups = []; const buffers = new WeakMap(); // used for storing cloned, shared buffers // index const index = source.index; if (index !== null) { this.setIndex(index.clone(buffers)); } // attributes const attributes = source.attributes; for (name in attributes) { const attribute = attributes[name]; this.addAttribute(name, attribute.clone(buffers)); } // morph attributes const morphAttributes = source.morphAttributes; for (name in morphAttributes) { const array = []; const morphAttribute = morphAttributes[name]; // morphAttribute: array of Float32BufferAttributes for (i = 0, l = morphAttribute.length; i < l; i++) { array.push(morphAttribute[i].clone(buffers)); } this.morphAttributes[name] = array; } // groups const groups = source.groups; for (i = 0, l = groups.length; i < l; i++) { const group = groups[i]; this.addGroup(group.start, group.count, group.materialIndex); } // boundings this.boundingBox.copy(source.boundingBox); this.boundingSphere.copy(source.boundingSphere); // instance count this.instanceCount = source.instanceCount; return this; } /** * Creates a clone of this Geometry. * @returns {Geometry} */ clone() { return new Geometry().copy(this); } } function arrayMax(array) { if (array.length === 0) return -Infinity; let max = array[0]; for (let i = 1, l = array.length; i < l; ++i) { if (array[i] > max) max = array[i]; } return max; } /** * A transform object for UV coordinates. * @extends Matrix3 */ class TransformUV extends Matrix3 { /** * Create a new TransformUV object. */ constructor() { super(); this.offset = new Vector2(0, 0); this.scale = new Vector2(1, 1); this.center = new Vector2(0, 0); this.rotation = 0; this.needsUpdate = false; } /** * Update the matrix for UV transformation based on the offset, scale, rotation and center. * If needsUpdate is false, this method will do nothing. * @returns {TransformUV} This object. */ update() { if (!this.needsUpdate) return this; this.needsUpdate = false; this.updateMatrix(); return this; } /** * Update the matrix for UV transformation based on the offset, scale, rotation and center. * This method will always update the matrix regardless of the needsUpdate flag. * @returns {TransformUV} This object. */ updateMatrix() { return this.setUvTransform(this.offset.x, this.offset.y, this.scale.x, this.scale.y, this.rotation, this.center.x, this.center.y); } /** * Copy the properties of another TransformUV object. * @param {TransformUV|Matrix3} source - The object to copy the properties from. * @returns {TransformUV} This object. */ copy(source) { super.copy(source); // in case source is only a Matrix3 object (without additional properties) if (!source.isTransformUV) return this; this.offset.copy(source.offset); this.scale.copy(source.scale); this.center.copy(source.center); this.rotation = source.rotation; this.needsUpdate = source.needsUpdate; return this; } /** * Clone this TransformUV object. * @returns {TransformUV} The cloned object. */ clone() { return new this.constructor().copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TransformUV.prototype.isTransformUV = true; let _materialId = 0; /** * Abstract base class for materials. * Materials describe the appearance of {@link Object3D}. * They are defined in a (mostly) renderer-independent way, so you don't have to rewrite materials if you decide to use a different renderer. * The following properties and methods are inherited by all other material types (although they may have different defaults). * @abstract * @extends EventDispatcher */ class Material extends EventDispatcher { constructor() { super(); /** * Unique number for this material instance. * @readonly * @type {number} */ this.id = _materialId++; /** * UUID of this material instance. * This gets automatically assigned, so this shouldn't be edited. * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * Type of the material. * @type {MATERIAL_TYPE} * @default MATERIAL_TYPE.SHADER */ this.type = MATERIAL_TYPE.SHADER; /** * Custom shader name. This naming can help ShaderMaterial to optimize the length of the index hash string. * It is valid only when the material type is MATERIAL_TYPE.SHADER. * Otherwise, if the material is a built-in type, the name of the shader will always be equal to the material type. * @type {string} * @default "" */ this.shaderName = ''; /** * Custom defines of the shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {object} * @default {} */ this.defines = {}; /** * Custom uniforms of the shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {object} * @default {} */ this.uniforms = {}; /** * Custom GLSL code for vertex shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {string} * @default "" */ this.vertexShader = ''; /** * Custom GLSL code for fragment shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {string} * @default "" */ this.fragmentShader = ''; /** * Override the renderer's default precision for this material. * Can be "highp", "mediump" or "lowp". * @type {string} * @default null */ this.precision = null; /** * The bitmask of UV coordinate channels to use for the external texture. * This will be combined with the internal UV coordinate mask collected from the renderer by default. * Finally, it will be used to determine which UV coordinate attribute to use and to generate the shader code. * @type {number} * @default 0 */ this.extUvCoordMask = 0; /** * Defines whether this material is transparent. * This has an effect on rendering as transparent objects need special treatment and are rendered after non-transparent objects. * When set to true, the extent to which the material is transparent is controlled by setting it's blending property. * @type {boolean} * @default false */ this.transparent = false; /** * Which blending to use when displaying objects with this material. * This must be set to BLEND_TYPE.CUSTOM to use custom blendSrc, blendDst or blendEquation. * @type {BLEND_TYPE} * @default BLEND_TYPE.NORMAL */ this.blending = BLEND_TYPE.NORMAL; /** * Blending source. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default BLEND_FACTOR.SRC_ALPHA */ this.blendSrc = BLEND_FACTOR.SRC_ALPHA; /** * Blending destination. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default BLEND_FACTOR.ONE_MINUS_SRC_ALPHA */ this.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; /** * Blending equation to use when applying blending. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_EQUATION} * @default BLEND_EQUATION.ADD */ this.blendEquation = BLEND_EQUATION.ADD; /** * The transparency of the {@link Material#blendSrc}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default null */ this.blendSrcAlpha = null; /** * The transparency of the {@link Material#blendDst}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default null */ this.blendDstAlpha = null; /** * The tranparency of the {@link Material#blendEquation}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_EQUATION} * @default null */ this.blendEquationAlpha = null; /** * Whether to premultiply the alpha (transparency) value. * @type {boolean} * @default false */ this.premultipliedAlpha = false; /** * Defines whether vertex coloring is used. * @type {VERTEX_COLOR} * @default VERTEX_COLOR.NONE */ this.vertexColors = VERTEX_COLOR.NONE; /** * Defines whether precomputed vertex tangents, which must be provided in a vec4 "tangent" attribute, are used. * When disabled, tangents are derived automatically. * Using precomputed tangents will give more accurate normal map details in some cases, such as with mirrored UVs. * @type {boolean} * @default false */ this.vertexTangents = false; /** * Float in the range of 0.0 - 1.0 indicating how transparent the material is. * A value of 0.0 indicates fully transparent, 1.0 is fully opaque. * @type {number} * @default 1 */ this.opacity = 1; /** * The diffuse color. * @type {Color3} * @default Color3(0xffffff) */ this.diffuse = new Color3(0xffffff); /** * The diffuse map. * @type {Texture2D} * @default null */ this.diffuseMap = null; /** * Define the UV chanel for the diffuse map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.diffuseMapCoord = 0; /** * The uv-transform matrix of diffuse map. * This will also affect other maps that cannot be individually specified uv transform, such as normalMap, bumpMap, etc. * @type {TransformUV} * @default TransformUV() */ this.diffuseMapTransform = new TransformUV(); /** * The alpha map. * @type {Texture2D} * @default null */ this.alphaMap = null; /** * Define the UV chanel for the alpha map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.alphaMapCoord = 0; /** * The uv-transform matrix of alpha map. * @type {TransformUV} * @default TransformUV() */ this.alphaMapTransform = new TransformUV(); /** * Emissive (light) color of the material, essentially a solid color unaffected by other lighting. * @type {Color3} * @default Color3(0x000000) */ this.emissive = new Color3(0x000000); /** * Set emissive (glow) map. * The emissive map color is modulated by the emissive color. * If you have an emissive map, be sure to set the emissive color to something other than black. * @type {Texture2D} * @default null */ this.emissiveMap = null; /** * Define the UV chanel for the emissive map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.emissiveMapCoord = 0; /** * The uv-transform matrix of emissive map. * @type {TransformUV} * @default TransformUV() */ this.emissiveMapTransform = new TransformUV(); /** * The red channel of this texture is used as the ambient occlusion map. * @type {Texture2D} * @default null */ this.aoMap = null; /** * Intensity of the ambient occlusion effect. * @type {number} * @default 1 */ this.aoMapIntensity = 1.0; /** * Define the UV chanel for the ao map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.aoMapCoord = 0; /** * The uv-transform matrix of ao map. * @type {TransformUV} * @default TransformUV() */ this.aoMapTransform = new TransformUV(); /** * The normal map. * @type {Texture2D} * @default null */ this.normalMap = null; /** * How much the normal map affects the material. Typical ranges are 0-1. * @type {Vector2} * @default Vector2(1,1) */ this.normalScale = new Vector2(1, 1); /** * The texture to create a bump map. * The black and white values map to the perceived depth in relation to the lights. Bump doesn't actually affect the geometry of the object, only the lighting. * @type {Texture2D} * @default null */ this.bumpMap = null; /** * How much the bump map affects the material. * Typical ranges are 0-1. * @type {number} * @default 1 */ this.bumpScale = 1; /** * The environment map. * If set to undefined, then the material will not inherit envMap from scene.environment. * @type {TextureCube|null|undefined} * @default null */ this.envMap = null; /** * Scales the effect of the environment map by multiplying its color. * This can effect both the diffuse and specular components of environment map. * @type {number} * @default 1 */ this.envMapIntensity = 1; /** * How to combine the result of the surface's color with the environment map, if any. * This has no effect in a {@link PBRMaterial}. * @type {ENVMAP_COMBINE_TYPE} * @default ENVMAP_COMBINE_TYPE.MULTIPLY */ this.envMapCombine = ENVMAP_COMBINE_TYPE.MULTIPLY; /** * Which depth function to use. See the {@link COMPARE_FUNC} constants for all possible values. * @type {COMPARE_FUNC} * @default COMPARE_FUNC.LEQUAL */ this.depthFunc = COMPARE_FUNC.LEQUAL; /** * Whether to have depth test enabled when rendering this material. * @type {boolean} * @default true */ this.depthTest = true; /** * Whether rendering this material has any effect on the depth buffer. * When drawing 2D overlays it can be useful to disable the depth writing in order to layer several things together without creating z-index artifacts. * @type {boolean} * @default true */ this.depthWrite = true; /** * Whether to render the material's color. * This can be used in conjunction with a mesh's renderOrder property to create invisible objects that occlude other objects. * @type {boolean} * @default true */ this.colorWrite = true; /** * Whether stencil operations are performed against the stencil buffer. * In order to perform writes or comparisons against the stencil buffer this value must be true. * @type {boolean} * @default false */ this.stencilTest = false; /** * The bit mask to use when writing to the stencil buffer. * @type {number} * @default 0xFF */ this.stencilWriteMask = 0xff; /** * The stencil comparison function to use. * See the {@link COMPARE_FUNC} constants for all possible values. * @type {COMPARE_FUNC} * @default COMPARE_FUNC.ALWAYS */ this.stencilFunc = COMPARE_FUNC.ALWAYS; /** * The value to use when performing stencil comparisons or stencil operations. * @type {number} * @default 0 */ this.stencilRef = 0; /** * The bit mask to use when comparing against the stencil buffer. * @type {number} * @default 0xFF */ this.stencilFuncMask = 0xff; /** * Which stencil operation to perform when the comparison function returns false. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilFail = OPERATION.KEEP; /** * Which stencil operation to perform when the comparison function returns true but the depth test fails. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilZFail = OPERATION.KEEP; /** * Which stencil operation to perform when the comparison function returns true and the depth test passes. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilZPass = OPERATION.KEEP; /** * The stencil comparison function to use. * See the {@link COMPARE_FUNC} constants for all possible values. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {COMPARE_FUNC|null} * @default null */ this.stencilFuncBack = null; /** * The value to use when performing stencil comparisons or stencil operations. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {number | null} * @default null */ this.stencilRefBack = null; /** * The bit mask to use when comparing against the stencil buffer. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {number | null} * @default null */ this.stencilFuncMaskBack = null; /** * Which stencil operation to perform when the comparison function returns false. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilFailBack = null; /** * Which stencil operation to perform when the comparison function returns true but the depth test fails. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilZFailBack = null; /** * Which stencil operation to perform when the comparison function returns true and the depth test passes. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilZPassBack = null; /** * User-defined clipping planes specified as Plane objects in world space. * These planes apply to the objects this material is attached to. * Points in space whose signed distance to the plane is negative are clipped (not rendered). * @type {Plane[]} * @default null */ this.clippingPlanes = null; /** * Sets the alpha value to be used when running an alpha test. * The material will not be renderered if the opacity is lower than this value. * @type {number} * @default 0 */ this.alphaTest = 0; /** * Enables alpha to coverage. * Can only be used when MSAA is enabled. * @type {boolean} * @default false */ this.alphaToCoverage = false; /** * Defines which side of faces will be rendered - front, back or double. * @type {DRAW_SIDE} * @default DRAW_SIDE.FRONT */ this.side = DRAW_SIDE.FRONT; /** * Whether to use polygon offset. * This corresponds to the GL_POLYGON_OFFSET_FILL WebGL feature. * @type {boolean} * @default false */ this.polygonOffset = false; /** * Sets the polygon offset factor. * @type {number} * @default 0 */ this.polygonOffsetFactor = 0; /** * Sets the polygon offset units. * @type {number} * @default 0 */ this.polygonOffsetUnits = 0; /** * Define whether the material is rendered with flat shading or smooth shading. * @type {SHADING_TYPE} * @default SHADING_TYPE.SMOOTH_SHADING */ this.shading = SHADING_TYPE.SMOOTH_SHADING; /** * Whether to apply dithering to the color to remove the appearance of banding. * @type {boolean} * @default false */ this.dithering = false; /** * Whether the material is affected by lights. * If set true, renderer will try to upload light uniforms. * @type {boolean} * @default false */ this.acceptLight = false; /** * The lighting group of the material. * Used in conjunction with {@link Light#groupMask}. * @type {number} * @default 0 */ this.lightingGroup = 0; /** * Whether the material is affected by fog. * @type {boolean} * @default true */ this.fog = true; /** * Determines how the mesh triangles are constructed from the vertices. * @type {DRAW_MODE} * @default DRAW_MODE.TRIANGLES */ this.drawMode = DRAW_MODE.TRIANGLES; /** * Whether the material uniforms need to be updated every draw call. * If set false, the material uniforms are only updated once per frame , this can help optimize performance. * @type {boolean} * @default true */ this.forceUpdateUniforms = true; /** * Specifies that the material needs to be recompiled. * This property is automatically set to true when instancing a new material. * @type {boolean} * @default true */ this.needsUpdate = true; } /** * Copy the parameters from the passed material into this material. * @param {Material} source - The material to be copied. * @returns {Material} */ copy(source) { this.shaderName = source.shaderName; this.defines = Object.assign({}, source.defines); this.uniforms = cloneUniforms(source.uniforms); this.vertexShader = source.vertexShader; this.fragmentShader = source.fragmentShader; this.precision = source.precision; this.extUvCoordMask = source.extUvCoordMask; this.transparent = source.transparent; this.blending = source.blending; this.blendSrc = source.blendSrc; this.blendDst = source.blendDst; this.blendEquation = source.blendEquation; this.blendSrcAlpha = source.blendSrcAlpha; this.blendDstAlpha = source.blendDstAlpha; this.blendEquationAlpha = source.blendEquationAlpha; this.premultipliedAlpha = source.premultipliedAlpha; this.vertexColors = source.vertexColors; this.vertexTangents = source.vertexTangents; this.opacity = source.opacity; this.diffuse.copy(source.diffuse); this.diffuseMap = source.diffuseMap; this.diffuseMapCoord = source.diffuseMapCoord; this.diffuseMapTransform.copy(source.diffuseMapTransform); this.alphaMap = source.alphaMap; this.alphaMapCoord = source.alphaMapCoord; this.alphaMapTransform.copy(source.alphaMapTransform); this.emissive.copy(source.emissive); this.emissiveMap = source.emissiveMap; this.emissiveMapCoord = source.emissiveMapCoord; this.emissiveMapTransform.copy(source.emissiveMapTransform); this.aoMap = source.aoMap; this.aoMapIntensity = source.aoMapIntensity; this.aoMapCoord = source.aoMapCoord; this.aoMapTransform.copy(source.aoMapTransform); this.normalMap = source.normalMap; this.normalScale.copy(source.normalScale); this.bumpMap = source.bumpMap; this.bumpScale = source.bumpScale; this.envMap = source.envMap; this.envMapIntensity = source.envMapIntensity; this.envMapCombine = source.envMapCombine; this.depthFunc = source.depthFunc; this.depthTest = source.depthTest; this.depthWrite = source.depthWrite; this.colorWrite = source.colorWrite; this.stencilTest = source.stencilTest; this.stencilWriteMask = source.stencilWriteMask; this.stencilFunc = source.stencilFunc; this.stencilRef = source.stencilRef; this.stencilFuncMask = source.stencilFuncMask; this.stencilFail = source.stencilFail; this.stencilZFail = source.stencilZFail; this.stencilZPass = source.stencilZPass; this.stencilFuncBack = source.stencilFuncBack; this.stencilRefBack = source.stencilRefBack; this.stencilFuncMaskBack = source.stencilFuncMaskBack; this.stencilFailBack = source.stencilFailBack; this.stencilZFailBack = source.stencilZFailBack; this.stencilZPassBack = source.stencilZPassBack; this.clippingPlanes = source.clippingPlanes; this.alphaTest = source.alphaTest; this.alphaToCoverage = source.alphaToCoverage; this.side = source.side; this.polygonOffset = source.polygonOffset; this.polygonOffsetFactor = source.polygonOffsetFactor; this.polygonOffsetUnits = source.polygonOffsetUnits; this.shading = source.shading; this.dithering = source.dithering; this.acceptLight = source.acceptLight; this.lightingGroup = source.lightingGroup; this.fog = source.fog; this.drawMode = source.drawMode; return this; } /** * Return a new material with the same parameters as this material. * @returns {Material} */ clone() { return new this.constructor().copy(this); } /** * This disposes the material. * Textures of a material don't get disposed. These needs to be disposed by Texture. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * A material rendered with custom shaders. * A shader is a small program written in GLSL that runs on the GPU. * @extends Material */ class ShaderMaterial extends Material { /** * @param {object} shader - Shader object for the shader material. * @param {string} shader.name - Name of the shader. * @param {object} shader.defines - Defines of the shader. * @param {object} shader.uniforms - Uniforms of the shader. * @param {string} shader.vertexShader - Vertex shader GLSL code. * @param {string} shader.fragmentShader - Fragment shader GLSL code. */ constructor(shader) { super(); // Set values if (shader) { this.shaderName = shader.name; Object.assign(this.defines, shader.defines); this.uniforms = cloneUniforms(shader.uniforms); this.vertexShader = shader.vertexShader; this.fragmentShader = shader.fragmentShader; } } } /** * Shader post pass. */ class ShaderPostPass { /** * @param {object} shader - Shader object for the shader material. * @param {string} shader.name - Name of the shader. * @param {object} shader.defines - Defines of the shader. * @param {object} shader.uniforms - Uniforms of the shader. * @param {string} shader.vertexShader - Vertex shader GLSL code. * @param {string} shader.fragmentShader - Fragment shader GLSL code. */ constructor(shader) { const scene = new Scene(); const camera = this.camera = new Camera(); camera.frustumCulled = false; camera.position.set(0, 0, 1); camera.lookAt(new Vector3(0, 0, 0), new Vector3(0, 1, 0)); camera.setOrtho(-1, 1, -1, 1, 0.1, 2); scene.add(camera); const geometry = this.geometry = new Geometry(); // fullscreen triangle geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([-1, 3, 0, -1, -1, 0, 3, -1, 0]), 3))); geometry.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array([0, 2, 0, 0, 2, 0]), 2))); const material = this.material = new ShaderMaterial(shader); this.uniforms = material.uniforms; const plane = new Mesh(geometry, material); plane.frustumCulled = false; scene.add(plane); // static scene scene.updateMatrix(); this.renderStates = scene.updateRenderStates(camera); const renderQueue = scene.updateRenderQueue(camera, false, false); this.renderQueueLayer = renderQueue.layerList[0]; this.renderConfig = {}; } /** * Render the post pass. * @param {ThinRenderer} renderer - The renderer. * @param {RenderTarget} renderTarget - The render target. */ render(renderer, renderTarget) { renderer.beginRender(renderTarget); renderer.renderRenderableList(this.renderQueueLayer.opaque, this.renderStates, this.renderConfig); renderer.endRender(); } /** * Dispose the post pass. */ dispose() { this.geometry.dispose(); this.material.dispose(); } } /** * A material for drawing geometry by depth. * Depth is based off of the camera near and far plane. White is nearest, black is farthest. * @extends Material */ class DepthMaterial extends Material { /** * Create a DepthMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.DEPTH; /** * Encoding for depth packing. * @type {boolean} * @default false */ this.packToRGBA = false; } } /** * A material for drawing geometry by distance. * @extends Material */ class DistanceMaterial extends Material { /** * Create a DistanceMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.DISTANCE; } } /** * Shadow map pass. */ class ShadowMapPass { constructor() { /** * Get depth material function. * Override this to use custom depth material. * @type {Function} */ this.getDepthMaterial = _getDepthMaterial; /** * Get distance material function. * Override this to use custom distance material. * @type {Function} */ this.getDistanceMaterial = _getDistanceMaterial; /** * Define which render layers will produce shadows. * If the value is Null, it means that all render layers will produce shadows. * @type {null | Array} * @default null */ this.shadowLayers = null; /** * Whether transparent objects can cast shadows. * @type {boolean} * @default false */ this.transparentShadow = false; const state = { isPointLight: false, light: null }; this._state = state; const that = this; this._renderOptions = { getGeometry: null, getMaterial: function (renderable) { return state.isPointLight ? that.getDistanceMaterial(renderable, state.light) : that.getDepthMaterial(renderable, state.light); }, ifRender: function (renderable) { return state.light.groupMask & 1 << renderable.material.lightingGroup && renderable.object.castShadow; } }; } /** * Get geometry function for shadow render options. * @type {null | Function} */ set getGeometry(func) { if (func) { this._renderOptions.getGeometry = func; } else { delete this._renderOptions.getGeometry; } } get getGeometry() { return this._renderOptions.getGeometry; } /** * The if render function for shadow render options. * @type {Function} */ set ifRender(func) { if (func) { this._renderOptions.ifRender = func; } else { delete this._renderOptions.ifRender; } } get ifRender() { return this._renderOptions.ifRender; } /** * Render shadow map. * @param {ThinRenderer} renderer * @param {Scene} scene */ render(renderer, scene) { // @deprecated // This can be deleted when renderer.setClearColor is completely removed. oldClearColor.copy(renderer.getClearColor()); const lightingData = scene.collector.lightingData; const lightsArray = lightingData.lightsArray; const shadowsNum = lightingData.shadowsNum; for (let i = 0; i < shadowsNum; i++) { const light = lightsArray[i]; const shadow = light.shadow; if (shadow.autoUpdate === false && shadow.needsUpdate === false) continue; const camera = shadow.camera; const shadowTarget = shadow.renderTarget; const isPointLight = light.isPointLight; const faces = isPointLight ? 6 : 1; this._state.isPointLight = isPointLight; this._state.light = light; const renderOptions = this._renderOptions; shadow.prepareDepthMap(!scene.disableShadowSampler, renderer.capabilities); for (let j = 0; j < faces; j++) { if (isPointLight) { shadow.update(light, j); shadowTarget.activeLayer = j; } shadowTarget.setColorClearValue(1, 1, 1, 1).setClear(true, true, false); const renderStates = scene.updateRenderStates(camera, j === 0); const renderQueue = scene.updateRenderQueue(camera, false, false); renderer.beginRender(shadowTarget); for (let k = 0; k < renderQueue.layerList.length; k++) { const renderQueueLayer = renderQueue.layerList[k]; if (this.shadowLayers !== null && this.shadowLayers.indexOf(renderQueueLayer.id) === -1) continue; renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderOptions); if (this.transparentShadow) { renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions); } } renderer.endRender(); } shadow.needsUpdate = false; } // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.setClearColor(oldClearColor.x, oldClearColor.y, oldClearColor.z, oldClearColor.w); } } const oldClearColor = new Vector4(); const shadowSide = { 'front': DRAW_SIDE.BACK, 'back': DRAW_SIDE.FRONT, 'double': DRAW_SIDE.DOUBLE }; const depthMaterials = {}; const distanceMaterials = {}; function _getDepthMaterial(renderable, light) { const useSkinning = !!renderable.object.skeleton; const useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0; const clippingPlanes = renderable.material.clippingPlanes; const numClippingPlanes = clippingPlanes && clippingPlanes.length > 0 ? clippingPlanes.length : 0; const index = useMorphing << 0 | useSkinning << 1; let materials = depthMaterials[index]; if (materials === undefined) { materials = {}; depthMaterials[index] = materials; } let material = materials[numClippingPlanes]; if (material === undefined) { material = new DepthMaterial(); material.packToRGBA = true; materials[numClippingPlanes] = material; } material.side = shadowSide[renderable.material.side]; material.clippingPlanes = renderable.material.clippingPlanes; material.drawMode = renderable.material.drawMode; return material; } function _getDistanceMaterial(renderable, light) { const useSkinning = !!renderable.object.skeleton; const useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0; const clippingPlanes = renderable.material.clippingPlanes; const numClippingPlanes = clippingPlanes && clippingPlanes.length > 0 ? clippingPlanes.length : 0; const index = useMorphing << 0 | useSkinning << 1; let materials = distanceMaterials[index]; if (materials === undefined) { materials = {}; distanceMaterials[index] = materials; } let material = materials[numClippingPlanes]; if (material === undefined) { material = new DistanceMaterial(); materials[numClippingPlanes] = material; } material.side = shadowSide[renderable.material.side]; material.uniforms['nearDistance'] = light.shadow.cameraNear; material.uniforms['farDistance'] = light.shadow.cameraFar; material.clippingPlanes = renderable.material.clippingPlanes; material.drawMode = renderable.material.drawMode; return material; } /** * PropertyMap is a helper class for storing properties on objects. * Instead of using a Map, we store the property map directly on the object itself, * which provides better lookup performance. * This is generally used to store the gpu resources corresponding to objects. */ class PropertyMap { /** * Create a new PropertyMap. * @param {string} prefix - The prefix of the properties name. */ constructor(prefix) { this._key = prefix + '$'; this._count = 0; } /** * Get the properties of the object. * If the object does not have properties, create a new one. * @param {object} object - The object to get properties. * @returns {object} - The properties of the object. */ get(object) { const key = this._key; let properties = object[key]; if (properties === undefined) { properties = {}; object[key] = properties; this._count++; } return properties; } /** * Delete the properties of the object. * @param {object} object - The object to delete properties. */ delete(object) { const key = this._key; const properties = object[key]; if (properties) { this._count--; delete object[key]; } } /** * Get the number of objects that have properties. * @returns {number} - The number of objects that have properties. */ size() { return this._count; } } /** * Render info collector. * If you want to collect information about the rendering of this frame, * pass an instance of RenderInfo to RenderOption when calling renderRenderableList. */ class RenderInfo { constructor() { const render = { calls: 0, triangles: 0, lines: 0, points: 0 }; // A series of function use for collect information. const updateFuncs = [function updatePoints(instanceCount, count) { render.points += instanceCount * count; }, function updateLines(instanceCount, count) { render.lines += instanceCount * (count / 2); }, function updateLineLoop(instanceCount, count) { render.lines += instanceCount * count; }, function updateLineStrip(instanceCount, count) { render.lines += instanceCount * (count - 1); }, function updateTriangles(instanceCount, count) { render.triangles += instanceCount * (count / 3); }, function updateTriangleStrip(instanceCount, count) { render.triangles += instanceCount * (count - 2); }, function updateTriangleFan(instanceCount, count) { render.triangles += instanceCount * (count - 2); }]; /** * Method of update render info. * This method will be executed after each draw. * @private * @param {number} count * @param {DRAW_MODE} mode * @param {number} instanceCount */ this.update = function (count, mode, instanceCount) { render.calls++; updateFuncs[mode](instanceCount, count); }; /** * Reset the render info. * Call this method whenever you have finished to render a single frame. */ this.reset = function () { render.calls = 0; render.triangles = 0; render.lines = 0; render.points = 0; }; /** * A series of statistical information of rendering process, include calls, triangles, lines and points. * @type {object} */ this.render = render; } } let _rendererId = 0; /** * Base class for WebGL and WebGPU renderers. */ class ThinRenderer { constructor() { /** * The unique id of this renderer. * This will be incremented when the context is lost and restored. * @readonly * @type {number} */ this.id = 0; // assigned in init method /** * The Rendering Context privided by canvas. * @type {WebGLRenderingContext|WebGPURenderingContext} */ this.context = null; // assigned in init method /** * An object containing details about the capabilities of the current RenderingContext. * @type {object} */ this.capabilities = {}; /** * The shader compiler options. * @type {object} * @property {boolean} checkErrors - Whether to use error checking when compiling shaders, defaults to true. * @property {boolean} compileAsynchronously - Whether to compile shaders asynchronously, defaults to false. * @property {number} maxMaterialPrograms - The maximum number of programs that one material can cache, defaults to 5. */ this.shaderCompileOptions = { checkErrors: true, compileAsynchronously: false, maxMaterialPrograms: 5 }; /** * The lighting options. * @type {object} * @property {object} clustered - The clustered lighting options. * @property {boolean} clustered.enabled - Whether to use clustered lighting, defaults to false. * @property {number} clustered.maxClusterLights - The maximum number of lights, defaults to 1024. * @property {boolean} clustered.useFloatPrecision - Whether the lights are stored as floats, defaults to false (half floats). * @property {Vector3} clustered.gridDimensions - The number of cells in each dimension, defaults to Vector3(16, 8, 32). * @property {number} clustered.maxLightsPerCell - The maximum number of lights per cell, defaults to 256. * @property {Vector2} clustered.zClip - The near and far clipping planes for the cells, defaults to Vector2(-1, -1) (clip based on camera near and far planes). * @property {number} clustered.version - The version of the clustered lighting options. If the options change, the version should be incremented, defaults to 0. */ this.lightingOptions = { clustered: { enabled: false, maxClusterLights: 1024, useFloatPrecision: false, gridDimensions: new Vector3(16, 8, 32), maxLightsPerCell: 256, zClip: new Vector2(-1, -1), version: 0 } }; this._passInfo = { // Whether the renderer is in the process of pass rendering. // If true, means that the beginRender method has been called but the endRender method has not been called. enabled: false, // The pass rendering count count: 0 }; } /** * Initialize this renderer with a rendering context. * This method is called automatically by {@link WebGLRenderer} constructor when a context is provided. * For WebGPURenderer, you must call this method manually and wait for the promise to resolve. * @param {WebGLRenderingContext|WebGPURenderingContext} context - The rendering context. * @param {object} [options] - The options for initializing this renderer. * @returns {Promise} A promise that resolves when initialization completes. */ init(context, options = {}) {} /** * Begin rendering. * @param {RenderTargetBase} renderTarget - The render target to render to. */ beginRender(renderTarget) { this._passInfo.enabled = true; } /** * End rendering. */ endRender() { this._passInfo.enabled = false; this._passInfo.count++; } /** * @typedef {object} RenderOptions - The render options for renderRenderableItem and renderRenderableList methods. * @property {Function} getGeometry - (Optional) Get renderable geometry. * @property {Function} getMaterial - (Optional) Get renderable material. * @property {Function} beforeRender - (Optional) Before render each renderable item. * @property {Function} afterRender - (Optional) After render each renderable item. * @property {Function} ifRender - (Optional) If render the renderable item. * @property {RenderInfo} renderInfo - (Optional) Render info for collect information. * @property {boolean} onlyCompile - (Optional) Only compile shader, do not render. */ /** * Render a single renderable item with render states. * @param {object} renderable - The renderable item. * @param {RenderStates} renderStates - The render states. * @param {RenderOptions} [options] - The render options for this render task. */ renderRenderableItem(renderable, renderStates, options) {} /** * Render a single renderable list with render states. * @param {Array} renderables - Array of renderable. * @param {RenderStates} renderStates - Render states. * @param {RenderOptions} [options] - The render options for this render task. */ renderRenderableList(renderables, renderStates, options = {}) { for (let i = 0, l = renderables.length; i < l; i++) { this.renderRenderableItem(renderables[i], renderStates, options); } } /** * Render a scene with a particular camera. * This method will render all layers in scene's RenderQueue by default. * If you need a customized rendering process, it is recommended to use renderRenderableList method. * @param {Scene} scene - The scene to render. * @param {Camera} camera - The camera used to render the scene. * @param {RenderTargetBase} renderTarget - The render target to render to. * @param {RenderOptions} [options] - The render options for this scene render task. */ renderScene(scene, camera, renderTarget, options = {}) { // Compatibility handling: if there are only 3 arguments, // and the third is not a RenderTarget, treat it as options. if (arguments.length === 3 && (!renderTarget || !renderTarget.isRenderTarget)) { options = renderTarget; renderTarget = null; } const renderStates = scene.getRenderStates(camera); const renderQueue = scene.getRenderQueue(camera); this.beginRender(renderTarget); let renderQueueLayer; for (let i = 0, l = renderQueue.layerList.length; i < l; i++) { renderQueueLayer = renderQueue.layerList[i]; this.renderRenderableList(renderQueueLayer.opaque, renderStates, options); this.renderRenderableList(renderQueueLayer.transparent, renderStates, options); } this.endRender(); } /** * Copy a frame buffer to another. * This copy process can be used to perform multi-sampling (MSAA). * @param {RenderTargetBase} read - The source renderTarget. * @param {RenderTargetBase} draw - The destination renderTarget. * @param {boolean} [color=true] - Copy color buffer. * @param {boolean} [depth=true] - Copy depth buffer. * @param {boolean} [stencil=true] - Copy stencil buffer. */ blitRenderTarget(read, draw, color = true, depth = true, stencil = true) {} /** * Generate mipmaps for the texture you pass in. * @param {TextureBase} texture - The texture to update. */ generateMipmaps(texture) {} /** * Read pixels from a texture. * This is an asynchronous operation. See {@link ThinRenderer#readTexturePixelsSync} for the synchronous version. * @param {TextureBase} texture - The texture to read from. * @param {number} x - The x coordinate of the rectangle to read from. * @param {number} y - The y coordinate of the rectangle to read from. * @param {number} width - The width of the rectangle to read from. * @param {number} height - The height of the rectangle to read from. * @param {TypedArray} buffer - The buffer to store the pixel data. * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index. * @param {number} [mipLevel=0] - The mip level to read. * @returns {Promise} A promise that resolves with the passed in buffer after it has been filled with the pixel data. */ readTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {} /** * Read pixels from a texture. * This is a synchronous operation. See {@link ThinRenderer#readTexturePixels} for the asynchronous version. * @param {TextureBase} texture - The texture to read from. * @param {number} x - The x coordinate of the rectangle to read from. * @param {number} y - The y coordinate of the rectangle to read from. * @param {number} width - The width of the rectangle to read from. * @param {number} height - The height of the rectangle to read from. * @param {TypedArray} buffer - The buffer to store the pixel data. * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index. * @param {number} [mipLevel=0] - The mip level to read. * @returns {TypedArray} The passed in buffer after it has been filled with the pixel data. */ readTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {} /** * Reset vertex array object bindings. * @param {boolean} [force=false] - Whether clear the current vertex array object. */ resetVertexArrayBindings(force) {} /** * Reset all render states cached in this renderer. * This is useful when you use multiple renderers in one application. */ resetState() {} /** * Begin an occlusion query. * @param {number} index - The query index in the current occlusion query set. */ beginOcclusionQuery(index) {} /** * End the current occlusion query. */ endOcclusionQuery() {} /** * Read back the results of a query set. * This is an asynchronous operation. * @param {QuerySet} querySet - The query set to read from. * @param {Array|TypedArray} dstBuffer - The buffer to store the results. * @param {number} [firstQuery=0] - The first query index to read. * @param {number} [queryCount=querySet.count] - The number of queries to read. * @returns {Promise} A promise that resolves with the passed in buffer after it has been filled with the results. */ readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {} /** * Used for context lost and restored. * @protected * @returns {number} */ increaseId() { this.id = _rendererId++; return this.id; } } /** * Linear fog. */ class Fog { /** * @param {number} [color=0x000000] - The color of the fog. * @param {number} [near=1] - The near clip of the fog. * @param {number} [far=1000] - The far clip of the fog. */ constructor(color = 0x000000, near = 1, far = 1000) { /** * The color of the fog. * @type {Color3} * @default Color3(0x000000) */ this.color = new Color3(color); /** * The near clip of the fog. * @type {number} * @default 1 */ this.near = near; /** * The far clip of the fog. * @type {number} * @default 1000 */ this.far = far; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Fog.prototype.isFog = true; /** * Exp2 fog. */ class FogExp2 { /** * @param {number} [color=0x000000] - The color of the fog. * @param {number} [density=0.00025] - The density of the exp2 fog. */ constructor(color = 0x000000, density = 0.00025) { /** * The color of the fog. * @type {Color3} * @default Color3(0x000000) */ this.color = new Color3(color); /** * The density of the exp2 fog. * @type {number} * @default 0.00025 */ this.density = density; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ FogExp2.prototype.isFogExp2 = true; /** * BoxGeometry is the quadrilateral primitive geometry class. * It is typically used for creating a cube or irregular quadrilateral of the dimensions provided with the 'width', 'height', and 'depth' constructor arguments. * @extends Geometry */ class BoxGeometry extends Geometry { /** * @param {number} [width=1] - Width of the sides on the X axis. * @param {number} [height=1] - Height of the sides on the Y axis. * @param {number} [depth=1] - Depth of the sides on the Z axis. * @param {number} [widthSegments=1] - Number of segmented faces along the width of the sides. * @param {number} [heightSegments=1] - Number of segmented faces along the height of the sides. * @param {number} [depthSegments=1] - Number of segmented faces along the depth of the sides. */ constructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) { super(); const scope = this; // segments widthSegments = Math.floor(widthSegments); heightSegments = Math.floor(heightSegments); depthSegments = Math.floor(depthSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let numberOfVertices = 0; let groupStart = 0; // build each side of the box geometry buildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0); // px buildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1); // nx buildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2); // py buildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3); // ny buildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4); // pz buildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5); // nz // build geometry this.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); function buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) { const segmentWidth = width / gridX; const segmentHeight = height / gridY; const widthHalf = width / 2; const heightHalf = height / 2; const depthHalf = depth / 2; const gridX1 = gridX + 1; const gridY1 = gridY + 1; let vertexCounter = 0; let groupCount = 0; const vector = new Vector3(); // generate vertices, normals and uvs for (let iy = 0; iy < gridY1; iy++) { const y = iy * segmentHeight - heightHalf; for (let ix = 0; ix < gridX1; ix++) { const x = ix * segmentWidth - widthHalf; // set values to correct vector component vector[u] = x * udir; vector[v] = y * vdir; vector[w] = depthHalf; // now apply vector to vertex buffer vertices.push(vector.x, vector.y, vector.z); // set values to correct vector component vector[u] = 0; vector[v] = 0; vector[w] = depth > 0 ? 1 : -1; // now apply vector to normal buffer normals.push(vector.x, vector.y, vector.z); // uvs uvs.push(ix / gridX); uvs.push(1 - iy / gridY); // counters vertexCounter += 1; } } // indices // 1. you need three indices to draw a single face // 2. a single segment consists of two faces // 3. so we need to generate six (2*3) indices per segment for (let iy = 0; iy < gridY; iy++) { for (let ix = 0; ix < gridX; ix++) { const a = numberOfVertices + ix + gridX1 * iy; const b = numberOfVertices + ix + gridX1 * (iy + 1); const c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1); const d = numberOfVertices + (ix + 1) + gridX1 * iy; // faces indices.push(a, b, d); indices.push(b, c, d); // increase counter groupCount += 6; } } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, materialIndex); // calculate new start value for groups groupStart += groupCount; // update total number of vertices numberOfVertices += vertexCounter; } this.computeBoundingBox(); this.computeBoundingSphere(); } } /** * A class for generating cylinder geometries. * @extends Geometry */ class CylinderGeometry extends Geometry { /** * @param {number} [radiusTop=1] — Radius of the cylinder at the top. * @param {number} [radiusBottom=1] — Radius of the cylinder at the bottom. * @param {number} [height=1] — Height of the cylinder. * @param {number} [radialSegments=8] — Number of segmented faces around the circumference of the cylinder. * @param {number} [heightSegments=1] — Number of rows of faces along the height of the cylinder. * @param {number} [openEnded=false] — A Boolean indicating whether the ends of the cylinder are open or capped. Default is false, meaning capped. * @param {number} [thetaStart=0] — Start angle for first segment, default = 0 (three o'clock position). * @param {number} [thetaLength=2*Pi] — The central angle, often called theta, of the circular sector. The default is 2*Pi, which makes for a complete cylinder. */ constructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { super(); const scope = this; radialSegments = Math.floor(radialSegments); heightSegments = Math.floor(heightSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let index = 0; const indexArray = []; const halfHeight = height / 2; let groupStart = 0; // generate geometry generateTorso(); if (openEnded === false) { if (radiusTop > 0) generateCap(true); if (radiusBottom > 0) generateCap(false); } // build geometry this.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); function generateTorso() { const normal = new Vector3(); const vertex = new Vector3(); let groupCount = 0; let x, y; // this will be used to calculate the normal const slope = (radiusBottom - radiusTop) / height; // generate vertices, normals and uvs for (y = 0; y <= heightSegments; y++) { const indexRow = []; const v = y / heightSegments; // calculate the radius of the current row const radius = v * (radiusBottom - radiusTop) + radiusTop; for (x = 0; x <= radialSegments; x++) { const u = x / radialSegments; const theta = u * thetaLength + thetaStart; const sinTheta = Math.sin(theta); const cosTheta = Math.cos(theta); // vertex vertex.x = radius * sinTheta; vertex.y = -v * height + halfHeight; vertex.z = radius * cosTheta; vertices.push(vertex.x, vertex.y, vertex.z); // normal normal.set(sinTheta, slope, cosTheta).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(u, 1 - v); // save index of vertex in respective row indexRow.push(index++); } // now save vertices of the row in our index array indexArray.push(indexRow); } // generate indices for (x = 0; x < radialSegments; x++) { for (y = 0; y < heightSegments; y++) { // we use the index array to access the correct indices const a = indexArray[y][x]; const b = indexArray[y + 1][x]; const c = indexArray[y + 1][x + 1]; const d = indexArray[y][x + 1]; // faces if (radiusTop > 0 || y !== 0) { indices.push(a, b, d); groupCount += 3; } if (radiusBottom > 0 || y !== heightSegments - 1) { indices.push(b, c, d); groupCount += 3; } } } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, 0); // calculate new start value for groups groupStart += groupCount; } function generateCap(top) { // save the index of the first center vertex const centerIndexStart = index; const uv = new Vector2(); const vertex = new Vector3(); let groupCount = 0; let x; const radius = top === true ? radiusTop : radiusBottom; const sign = top === true ? 1 : -1; // first we generate the center vertex data of the cap. // because the geometry needs one set of uvs per face, // we must generate a center vertex per face/segment for (x = 1; x <= radialSegments; x++) { // vertex vertices.push(0, halfHeight * sign, 0); // normal normals.push(0, sign, 0); // uv uvs.push(0.5, 0.5); // increase index index++; } // save the index of the last center vertex const centerIndexEnd = index; // now we generate the surrounding vertices, normals and uvs for (x = 0; x <= radialSegments; x++) { const u = x / radialSegments; const theta = u * thetaLength + thetaStart; const cosTheta = Math.cos(theta); const sinTheta = Math.sin(theta); // vertex vertex.x = radius * sinTheta; vertex.y = halfHeight * sign; vertex.z = radius * cosTheta; vertices.push(vertex.x, vertex.y, vertex.z); // normal normals.push(0, sign, 0); // uv uv.x = cosTheta * 0.5 + 0.5; uv.y = sinTheta * 0.5 * sign + 0.5; uvs.push(uv.x, uv.y); // increase index index++; } // generate indices for (x = 0; x < radialSegments; x++) { const c = centerIndexStart + x; const i = centerIndexEnd + x; if (top === true) { // face top indices.push(i, i + 1, c); } else { // face bottom indices.push(i + 1, i, c); } groupCount += 3; } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, top === true ? 1 : 2); // calculate new start value for groups groupStart += groupCount; } this.computeBoundingBox(); this.computeBoundingSphere(); } } /** * A class for generating plane geometries. * @extends Geometry */ class PlaneGeometry extends Geometry { /** * @param {number} [width=1] — Width along the X axis. * @param {number} [height=1] — Height along the Y axis. * @param {number} [widthSegments=1] * @param {number} [heightSegments=1] */ constructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) { super(); const width_half = width / 2; const height_half = height / 2; const gridX = Math.floor(widthSegments); const gridY = Math.floor(heightSegments); const gridX1 = gridX + 1; const gridY1 = gridY + 1; const segment_width = width / gridX; const segment_height = height / gridY; let ix, iy; // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // generate vertices, normals and uvs for (iy = 0; iy < gridY1; iy++) { const y = iy * segment_height - height_half; for (ix = 0; ix < gridX1; ix++) { const x = ix * segment_width - width_half; vertices.push(x, 0, y); normals.push(0, 1, 0); uvs.push(ix / gridX); uvs.push(1 - iy / gridY); } } // indices for (iy = 0; iy < gridY; iy++) { for (ix = 0; ix < gridX; ix++) { const a = ix + gridX1 * iy; const b = ix + gridX1 * (iy + 1); const c = ix + 1 + gridX1 * (iy + 1); const d = ix + 1 + gridX1 * iy; // faces indices.push(a, b, d); indices.push(b, c, d); } } // build geometry this.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); } } /** * A class for generating sphere geometries. * The geometry is created by sweeping and calculating vertexes around the Y axis (horizontal sweep) and the Z axis (vertical sweep). * Thus, incomplete spheres (akin to 'sphere slices') can be created through the use of different values of phiStart, phiLength, thetaStart and thetaLength, in order to define the points in which we start (or end) calculating those vertices. * @extends Geometry */ class SphereGeometry extends Geometry { /** * @param {number} [radius=1] — sphere radius. Default is 1. * @param {number} [widthSegments=8] — number of horizontal segments. Minimum value is 3, and the default is 8. * @param {number} [heightSegments=6] — number of vertical segments. Minimum value is 2, and the default is 6. * @param {number} [phiStart=0] — specify horizontal starting angle. Default is 0. * @param {number} [phiLength=Math.PI*2] — specify horizontal sweep angle size. Default is Math.PI * 2. * @param {number} [thetaStart=0] — specify vertical starting angle. Default is 0. * @param {number} [thetaLength=Math.PI] — specify vertical sweep angle size. Default is Math.PI. */ constructor(radius = 1, widthSegments = 8, heightSegments = 6, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) { super(); widthSegments = Math.max(3, Math.floor(widthSegments)); heightSegments = Math.max(2, Math.floor(heightSegments)); const thetaEnd = thetaStart + thetaLength; let ix, iy; let index = 0; const grid = []; const vertex = new Vector3(); const normal = new Vector3(); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // generate vertices, normals and uvs for (iy = 0; iy <= heightSegments; iy++) { const verticesRow = []; const v = iy / heightSegments; // special case for the poles // https://github.com/mrdoob/three.js/pull/16043 let uOffset = 0; if (iy == 0 && thetaStart == 0) { uOffset = 0.5 / widthSegments; } else if (iy == heightSegments && thetaEnd == Math.PI) { uOffset = -0.5 / widthSegments; } for (ix = 0; ix <= widthSegments; ix++) { const u = ix / widthSegments; // vertex vertex.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); vertex.y = radius * Math.cos(thetaStart + v * thetaLength); vertex.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); vertices.push(vertex.x, vertex.y, vertex.z); // normal normal.copy(vertex).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(u + uOffset, 1 - v); verticesRow.push(index++); } grid.push(verticesRow); } // indices for (iy = 0; iy < heightSegments; iy++) { for (ix = 0; ix < widthSegments; ix++) { const a = grid[iy][ix + 1]; const b = grid[iy][ix]; const c = grid[iy + 1][ix]; const d = grid[iy + 1][ix + 1]; if (iy !== 0 || thetaStart > 0) indices.push(a, b, d); if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d); } } this.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); } } /** * Creates a torus knot, the particular shape of which is defined by a pair of coprime integers, p and q. * If p and q are not coprime, the result will be a torus link. * @extends Geometry */ class TorusKnotGeometry extends Geometry { /** * @param {number} [radius=1] — Radius of the torus. Default is 1. * @param {number} [tube=0.4] — Radius of the tube. Default is 0.4. * @param {number} [tubularSegments=64] — Default is 64. * @param {number} [radialSegments=8] — Default is 8. * @param {number} [p=2] — This value determines, how many times the geometry winds around its axis of rotational symmetry. Default is 2. * @param {number} [q=3] — This value determines, how many times the geometry winds around a circle in the interior of the torus. Default is 3. */ constructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) { super(); tubularSegments = Math.floor(tubularSegments); radialSegments = Math.floor(radialSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let i, j; const vertex = new Vector3(); const normal = new Vector3(); const P1 = new Vector3(); const P2 = new Vector3(); const B = new Vector3(); const T = new Vector3(); const N = new Vector3(); // generate vertices, normals and uvs for (i = 0; i <= tubularSegments; ++i) { // the radian "u" is used to calculate the position on the torus curve of the current tubular segement const u = i / tubularSegments * p * Math.PI * 2; // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions calculatePositionOnCurve(u, p, q, radius, P1); calculatePositionOnCurve(u + 0.01, p, q, radius, P2); // calculate orthonormal basis T.subVectors(P2, P1); N.addVectors(P2, P1); B.crossVectors(T, N); N.crossVectors(B, T); // normalize B, N. T can be ignored, we don't use it B.normalize(); N.normalize(); for (j = 0; j <= radialSegments; ++j) { // now calculate the vertices. they are nothing more than an extrusion of the torus curve. // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. const v = j / radialSegments * Math.PI * 2; const cx = -tube * Math.cos(v); const cy = tube * Math.sin(v); // now calculate the final vertex position. // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve vertex.x = P1.x + (cx * N.x + cy * B.x); vertex.y = P1.y + (cx * N.y + cy * B.y); vertex.z = P1.z + (cx * N.z + cy * B.z); vertices.push(vertex.x, vertex.y, vertex.z); // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) normal.subVectors(vertex, P1).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(i / tubularSegments); uvs.push(j / radialSegments); } } // generate indices for (j = 1; j <= tubularSegments; j++) { for (i = 1; i <= radialSegments; i++) { // indices const a = (radialSegments + 1) * (j - 1) + (i - 1); const b = (radialSegments + 1) * j + (i - 1); const c = (radialSegments + 1) * j + i; const d = (radialSegments + 1) * (j - 1) + i; // faces indices.push(a, b, d); indices.push(b, c, d); } } // build geometry this.setIndex(new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); // this function calculates the current position on the torus curve function calculatePositionOnCurve(u, p, q, radius, position) { const cu = Math.cos(u); const su = Math.sin(u); const quOverP = q / p * u; const cs = Math.cos(quOverP); position.x = radius * (2 + cs) * 0.5 * cu; position.y = radius * (2 + cs) * su * 0.5; position.z = radius * Math.sin(quOverP) * 0.5; } } } /** * A material for drawing geometries in a simple shaded (flat or wireframe) way. * This material is not affected by lights. * @extends Material */ class BasicMaterial extends Material { /** * Create a BasicMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.BASIC; } } /** * A material for non-shiny surfaces, without specular highlights. * The material uses a non-physically based Lambertian model for calculating reflectance. * This can simulate some surfaces (such as untreated wood or stone) well, but cannot simulate shiny surfaces with specular highlights (such as varnished wood). * @extends Material */ class LambertMaterial extends Material { /** * Create a LambertMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.LAMBERT; /** * @default true */ this.acceptLight = true; } } /** * A material for drawing wireframe-style geometries. * @extends Material */ class LineMaterial extends Material { /** * Create a LineMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.LINE; /** * Controls line thickness. * Due to limitations of the OpenGL Core Profile with the WebGL renderer on most platforms linewidth will always be 1 regardless of the set value. * @type {number} * @default 1 */ this.lineWidth = 1; /** * Set draw mode to LINES / LINE_LOOP / LINE_STRIP * @type {DRAW_MODE} * @default DRAW_MODE.LINES */ this.drawMode = DRAW_MODE.LINES; } copy(source) { super.copy(source); this.lineWidth = source.lineWidth; return this; } } /** * A standard physically based material, using Specular-Glossiness workflow. * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max. * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used. * The idea is that, instead of tweaking materials to look good under specific lighting, a material can be created that will react 'correctly' under all lighting scenarios. * @extends Material */ class PBR2Material extends Material { /** * Create a PBR2Material. */ constructor() { super(); this.type = MATERIAL_TYPE.PBR2; /** * Specular color of the material. * @type {number} * @default 0.5 */ this.specular = new Color3(0x111111); /** * Glossiness of the material. * @type {number} * @default 0.5 */ this.glossiness = 0.5; /** * The RGB channel of this texture is used to alter the specular of the material. * @type {Texture2D} * @default null */ this.specularMap = null; /** * The A channel of this texture is used to alter the glossiness of the material. * @type {Texture2D} * @default null */ this.glossinessMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.specular = source.specular; this.glossiness = source.glossiness; this.specularMap = source.specularMap; this.glossinessMap = source.glossinessMap; return this; } } /** * A standard physically based material, using Metallic-Roughness workflow. * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max. * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used. * The idea is that, instead of tweaking materials to look good under specific lighting, a material can be created that will react 'correctly' under all lighting scenarios. * @extends Material */ class PBRMaterial extends Material { /** * Create a PBRMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.PBR; /** * How rough the material appears. 0.0 means a smooth mirror reflection, 1.0 means fully diffuse. * If roughnessMap is also provided, both values are multiplied. * @type {number} * @default 0.5 */ this.roughness = 0.5; /** * How much the material is like a metal. * Non-metallic materials such as wood or stone use 0.0, metallic use 1.0, with nothing (usually) in between. * A value between 0.0 and 1.0 could be used for a rusty metal look. If metalnessMap is also provided, both values are multiplied. * @type {number} * @default 0.5 */ this.metalness = 0.5; /** * The green channel of this texture is used to alter the roughness of the material. * @type {Texture2D} * @default null */ this.roughnessMap = null; /** * The blue channel of this texture is used to alter the metalness of the material. * @type {Texture2D} * @default null */ this.metalnessMap = null; /** * The strength of a clearcoat layer on a material surface. * When clearcoatFactor is set to 0.0, it indicates that there is no clearcoat present. * When it is set to 1.0, it indicates a very strong clearcoat that- * will cause the reflection and refraction effects on the surface of the object to become more prominent. * @type {number} * @default 0.0 */ this.clearcoat = 0.0; /** * A texture property that allows for the modulation of the strength or roughness of the clearcoat layer. * @type {Texture2D} * @default null */ this.clearcoatMap = null; /** * The roughness of a clearcoat layer on a material surface. * When clearcoatRoughness is set to 0.0, the clearcoat layer will appear perfectly smooth and reflective- * and 0.0 represents a rough, textured clearcoat layer. * Adjusting the clearcoatRoughness can achieve a wide range of effects and create more realistic materials. * @type {number} * @default 0.0 */ this.clearcoatRoughness = 0.0; /** * A texture that will be applied to the clearcoat layer of a material to simulate the roughness of the surface. * @type {Texture2D} * @default null */ this.clearcoatRoughnessMap = null; /** * Adjust the normal map's strength or intensity. * Affect the amount of bumpiness or surface detail that is visible on the clearcoat layer. * Typical ranges are 0-1. * @type {number} * @default 1 */ this.clearcoatNormalScale = new Vector2(1, 1); /** * The texture that modulates the clearcoat layer's surface normal. * @type {Texture2D} * @default null */ this.clearcoatNormalMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.roughness = source.roughness; this.metalness = source.metalness; this.roughnessMap = source.roughnessMap; this.metalnessMap = source.metalnessMap; this.clearcoat = source.clearcoat; this.clearcoatMap = source.clearcoatMap; this.clearcoatRoughness = source.clearcoatRoughness; this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; this.clearcoatNormalScale.copy(source.clearcoatNormalScale); return this; } } /** * A material for shiny surfaces with specular highlights. * The material uses a non-physically based Blinn-Phong model for calculating reflectance. * Unlike the Lambertian model used in the {@link LambertMaterial} this can simulate shiny surfaces with specular highlights (such as varnished wood). * @extends Material */ class PhongMaterial extends Material { /** * Create a PhongMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.PHONG; /** * How shiny the {@link PhongMaterial#specular} highlight is; a higher value gives a sharper highlight. * @type {number} * @default 30 */ this.shininess = 30; /** * Specular color of the material. * This defines how shiny the material is and the color of its shine. * @type {Color3} * @default Color(0x111111) */ this.specular = new Color3(0x111111); /** * The specular map value affects both how much the specular surface highlight contributes and how much of the environment map affects the surface. * @type {Texture2D} * @default null */ this.specularMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.shininess = source.shininess; this.specular.copy(source.specular); this.specularMap = source.specularMap; return this; } } /** * The default material used by Points. * @extends Material */ class PointsMaterial extends Material { /** * Create a PointsMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.POINT; /** * Sets the size of the points. * @type {number} * @default 1 */ this.size = 1; /** * Specify whether points' size is attenuated by the camera depth. (Perspective camera only.) * @type {boolean} * @default true */ this.sizeAttenuation = true; /** * Set draw mode to POINTS. * @type {DRAW_MODE} * @default DRAW_MODE.POINTS */ this.drawMode = DRAW_MODE.POINTS; } copy(source) { super.copy(source); this.size = source.size; this.sizeAttenuation = source.sizeAttenuation; return this; } } /** * RenderTargetBase is an abstract class representing a rendering target, * which encapsulates the configuration for a render pass, * including clear states, attachments, and other rendering parameters. * @extends EventDispatcher * @abstract */ class RenderTargetBase extends EventDispatcher { constructor(width, height) { super(); /** * The width of the render target. * @type {number} */ this.width = width; /** * The height of the render target. * @type {number} */ this.height = height; /** * Whether to clear the color buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearColor = true; /** * Whether to clear the depth buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearDepth = true; /** * Whether to clear the stencil buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearStencil = true; /** * Clear color value. * @type {Color4} */ this.colorClearValue = new Color4(0, 0, 0, 0); /** * Clear depth value. * @type {number} * @default 1 */ this.depthClearValue = 1; /** * Clear stencil value. * @type {number} * @default 0 */ this.stencilClearValue = 0; /** * A querySet that will store the occlusion query results. If null, occlusion queries are disabled. * @type {QuerySet|null} * @default null */ this.occlusionQuerySet = null; /** * An array of objects defining where and when timestamp query values will be written. * @type {object} * @property {QuerySet|null} querySet - A timestamp querySet. If null, timestamp queries are disabled. * @property {number} beginningOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the beginning of the render pass will be written. * @property {number} endOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the end of the render pass will be written. */ this.timestampWrites = { querySet: null, beginningOfPassWriteIndex: 0, endOfPassWriteIndex: 1 }; } /** * Resize the render target to the specified dimensions. * @abstract */ resize() { throw new Error('RenderTargetBase: resize method must be implemented by subclass'); } /** * Dispose the render target. * @abstract */ dispose() { throw new Error('RenderTargetBase: dispose method must be implemented by subclass'); } /** * Sets the clear state. * @param {boolean} [color] - Whether to clear the color buffer. * @param {boolean} [depth] - Whether to clear the depth buffer. * @param {boolean} [stencil] - Whether to clear the stencil buffer. * @returns {RenderTargetBase} A reference to this render target. */ setClear(color, depth, stencil) { this.clearColor = color !== undefined ? color : this.clearColor; this.clearDepth = depth !== undefined ? depth : this.clearDepth; this.clearStencil = stencil !== undefined ? stencil : this.clearStencil; return this; } /** * Sets the clear values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @param {number} a - Alpha channel value between 0.0 and 1.0. * @returns {RenderTargetBase} A reference to this render target. */ setColorClearValue(r, g, b, a) { this.colorClearValue.setRGBA(r, g, b, a); return this; } /** * Sets the clear depth value. * @param {number} depth - The depth value. * @returns {RenderTargetBase} A reference to this render target. */ setDepthClearValue(depth) { this.depthClearValue = depth; return this; } /** * Sets the clear stencil value. * @param {number} stencil - The stencil value. * @returns {RenderTargetBase} A reference to this render target. */ setStencilClearValue(stencil) { this.stencilClearValue = stencil; return this; } /** * Sets the occlusion query set. * @param {QuerySet|null} querySet - The occlusion query set. If null, occlusion queries are disabled. * @returns {RenderTargetBase} A reference to this render target. */ setOcclusionQuerySet(querySet) { this.occlusionQuerySet = querySet; return this; } /** * Sets the timestamp query set and the query indices. * @param {QuerySet|null} querySet - The timestamp query set. If null, timestamp queries are disabled. * @param {number} [beginIndex=0] - The query index in querySet where the timestamp at the beginning of the render pass will be written. * @param {number} [endIndex=1] - The query index in querySet where the timestamp at the end of the render pass will be written. * @returns {RenderTargetBase} A reference to this render target. */ setTimestampWrites(querySet, beginIndex = 0, endIndex = 1) { this.timestampWrites.querySet = querySet; this.timestampWrites.beginningOfPassWriteIndex = beginIndex; this.timestampWrites.endOfPassWriteIndex = endIndex; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RenderTargetBase.prototype.isRenderTarget = true; /** * Render Buffer can be attached to RenderTarget. * @extends EventDispatcher */ class RenderBuffer extends EventDispatcher { /** * @param {number} width - The width of the render buffer. * @param {number} height - The height of the render buffer. * @param {PIXEL_FORMAT} [format=PIXEL_FORMAT.RGBA8] - The internal format of the render buffer. * @param {number} [multipleSampling=0] - If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0) */ constructor(width, height, format = PIXEL_FORMAT.RGBA8, multipleSampling = 0) { super(); /** * The width of the render buffer. * @type {number} */ this.width = width; /** * The height of the render buffer. * @type {number} */ this.height = height; /** * Render buffer texel storage data format. * DEPTH_COMPONENT16: for depth attachments. * DEPTH_STENCIL: for depth stencil attachments. * RGBA8:for multiple sampled color attachments. * DEPTH_COMPONENT16: for multiple sampled depth attachments. * DEPTH24_STENCIL8: for multiple sampled depth stencil attachments. * @type {PIXEL_FORMAT} * @default PIXEL_FORMAT.RGBA8 */ this.format = format; /** * If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0) * A Render Target's attachments must have the same multipleSampling value. * Texture can't be attached to the same render target with a multiple sampled render buffer. * Max support 8. * @type {number} * @default 0 */ this.multipleSampling = multipleSampling; } /** * Resize the render buffer. * @param {number} width - The width of the render buffer. * @param {number} height - The height of the render buffer. * @returns {boolean} - If size changed. */ resize(width, height) { if (this.width !== width || this.height !== height) { this.dispose(); this.width = width; this.height = height; return true; } return false; } /** * Returns a clone of this render buffer. * @returns {RenderBuffer} */ clone() { return new this.constructor().copy(this); } /** * Copy the given render buffer into this render buffer. * @param {RenderBuffer} source - The render buffer to be copied. * @returns {RenderBuffer} */ copy(source) { this.format = source.format; this.multipleSampling = source.multipleSampling; return this; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RenderBuffer.prototype.isRenderBuffer = true; let _textureId = 0; /** * Create a texture to apply to a surface or as a reflection or refraction map. * @abstract * @extends EventDispatcher */ class TextureBase extends EventDispatcher { constructor() { super(); /** * Unique number for this texture instance. * @readonly * @type {number} */ this.id = _textureId++; /** * An object that can be used to store custom data about the {@link TextureBase}. * It should not hold references to functions as these will not be cloned. * @type {object} * @default {} */ this.userData = {}; /** * Array of user-specified mipmaps (optional). * @type {HTMLImageElement[] | object[]} * @default [] */ this.mipmaps = []; /** * WebGLTexture border. * See {@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D WebGLTexture texImage2D()}. * Must be zero. * @type {number} */ this.border = 0; /** * WebGLTexture texel data format. * @type {PIXEL_FORMAT} * @default PIXEL_FORMAT.RGBA */ this.format = PIXEL_FORMAT.RGBA; /** * The default value is null, the texture's internal format will be obtained using a combination of .format and .type. * Users can also specify a specific internalFormat. * @type {null | PIXEL_FORMAT} * @default null */ this.internalformat = null; /** * WebGLTexture texel data type. * @type {PIXEL_TYPE} * @default PIXEL_TYPE.UNSIGNED_BYTE */ this.type = PIXEL_TYPE.UNSIGNED_BYTE; /** * How the texture is sampled when a texel covers more than one pixel. * @type {TEXTURE_FILTER} * @default TEXTURE_FILTER.LINEAR */ this.magFilter = TEXTURE_FILTER.LINEAR; /** * How the texture is sampled when a texel covers less than one pixel. * @type {TEXTURE_FILTER} * @default TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR */ this.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; /** * This defines how the texture is wrapped horizontally and corresponds to U in UV mapping. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * This defines how the texture is wrapped vertically and corresponds to V in UV mapping. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * The number of samples taken along the axis through the pixel that has the highest density of texels. * A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used. * Use {@link WebGLcapabilities#maxAnisotropy} to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2. * @type {number} * @default 1 */ this.anisotropy = 1; /** * Use for shadow sampler (WebGL 2.0 Only). * @type {COMPARE_FUNC | undefined} * @default undefined */ this.compare = undefined; /** * Whether to generate mipmaps (if possible) for a texture. * Set this to false if you are creating mipmaps manually. * @type {boolean} * @default true */ this.generateMipmaps = true; /** * texture pixel encoding. * @type {TEXEL_ENCODING_TYPE} * @default TEXEL_ENCODING_TYPE.LINEAR */ this.encoding = TEXEL_ENCODING_TYPE.LINEAR; /** * If set to true, the texture is flipped along the vertical axis when uploaded to the GPU. * Default is true to flips the image's Y axis to match the WebGL texture coordinate space. * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead. * @type {boolean} * @default true */ this.flipY = true; /** * If set to true, the alpha channel, if present, is multiplied into the color channels when the texture is uploaded to the GPU. * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead. * @type {boolean} * @default false */ this.premultiplyAlpha = false; /** * Specifies the alignment requirements for the start of each pixel row in memory. * The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on double-word boundaries). * @type {number} * @default 4 */ this.unpackAlignment = 4; /** * version code increse if texture changed. * if version is still 0, this texture will be skiped. * @type {number} * @default 0 */ this.version = 0; } /** * Returns a clone of this texture. * @returns {TextureBase} */ clone() { return new this.constructor().copy(this); } /** * Copy the given texture into this texture. * @param {TextureBase} source - The texture to be copied. * @returns {TextureBase} */ copy(source) { this.userData = cloneJson(source.userData); this.mipmaps = source.mipmaps.slice(0); this.border = source.border; this.format = source.format; this.internalformat = source.internalformat; this.type = source.type; this.magFilter = source.magFilter; this.minFilter = source.minFilter; this.wrapS = source.wrapS; this.wrapT = source.wrapT; this.anisotropy = source.anisotropy; this.compare = source.compare; this.generateMipmaps = source.generateMipmaps; this.encoding = source.encoding; this.flipY = source.flipY; this.premultiplyAlpha = source.premultiplyAlpha; this.unpackAlignment = source.unpackAlignment; this.version = source.version; return this; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); this.version = 0; } /** * Resize the texture for use as a render target attachment. * @param {number} width - The new width of the texture. * @param {number} height - The new height of the texture. * @param {number} [depth] - The new depth of the texture. * Only {@link Texture3D} and {@link Texture2DArray} will use this parameter. * If not specified, the depth will not be changed. */ resizeAsAttachment(width, height, depth) {} } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TextureBase.prototype.isTexture = true; /** * Creates a 2d texture. * @extends TextureBase */ class Texture2D extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {null | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | object} * @default null */ this.image = null; } /** * Copy the given 2d texture into this texture. * @param {Texture2D} source - The 2d texture to be copied. * @returns {Texture2D} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height) { if (this.image && this.image.rtt) { if (this.image.width !== width || this.image.height !== height) { this.version++; this.image.width = width; this.image.height = height; } } else { this.version++; this.image = { rtt: true, data: null, width, height }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture2D.prototype.isTexture2D = true; /** * Creates a cube texture. * @extends TextureBase */ class TextureCube extends TextureBase { constructor() { super(); /** * Images data for this texture. * @type {HTMLImageElement[]} * @default [] */ this.images = []; /** * @default false */ this.flipY = false; } /** * Copy the given cube texture into this texture. * @param {TextureCube} source - The cube texture to be copied. * @returns {TextureCube} */ copy(source) { super.copy(source); this.images = source.images.slice(0); return this; } /** * @override */ resizeAsAttachment(width, height) { let changed = false; for (let i = 0; i < 6; i++) { if (this.images[i] && this.images[i].rtt) { if (this.images[i].width !== width || this.images[i].height !== height) { this.images[i].width = width; this.images[i].height = height; changed = true; } } else { this.images[i] = { rtt: true, data: null, width, height }; changed = true; } } if (changed) { this.version++; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TextureCube.prototype.isTextureCube = true; /** * Creates a 3D texture. (WebGL 2.0) * @extends TextureBase */ class Texture3D extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {object} */ this.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 }; /** * This defines how the texture is wrapped in the depth direction. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * @default PIXEL_FORMAT.RED */ this.format = PIXEL_FORMAT.RED; /** * @default PIXEL_TYPE.UNSIGNED_BYTE */ this.type = PIXEL_TYPE.UNSIGNED_BYTE; /** * @default TEXTURE_FILTER.NEAREST */ this.magFilter = TEXTURE_FILTER.NEAREST; /** * @default TEXTURE_FILTER.NEAREST */ this.minFilter = TEXTURE_FILTER.NEAREST; /** * @default false */ this.generateMipmaps = false; /** * @default false */ this.flipY = false; /** * @default 1 */ this.unpackAlignment = 1; } /** * Copy the given 3d texture into this texture. * @param {Texture3D} source - The 3d texture to be copied. * @returns {Texture3D} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height, depth) { const resizeDepth = depth !== undefined; if (this.image && this.image.rtt) { if (this.image.width !== width || this.image.height !== height || resizeDepth && this.image.depth !== depth) { this.version++; this.image.width = width; this.image.height = height; if (resizeDepth) this.image.depth = depth; } } else { this.version++; const oldDepth = this.image && this.image.depth ? this.image.depth : 1; this.image = { rtt: true, data: null, width, height, depth: resizeDepth ? depth : oldDepth }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture3D.prototype.isTexture3D = true; /** * Creates a 2d texture. (WebGL 2.0) * @extends TextureBase */ class Texture2DArray extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {object} * @default null */ this.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 }; /** * @default PIXEL_FORMAT.RED */ this.format = PIXEL_FORMAT.RED; /** * @default TEXTURE_FILTER.NEAREST */ this.magFilter = TEXTURE_FILTER.NEAREST; /** * @default TEXTURE_FILTER.NEAREST */ this.minFilter = TEXTURE_FILTER.NEAREST; /** * @default false */ this.generateMipmaps = false; /** * @default false */ this.flipY = false; /** * @default 1 */ this.unpackAlignment = 1; /** * A set of all layers which need to be updated in the texture. * @type {Set} */ this.layerUpdates = new Set(); } /** * Copy the given 2d texture into this texture. * @param {Texture2DArray} source - The 2d texture to be copied. * @returns {Texture2DArray} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height, depth) { const resizeDepth = depth !== undefined; if (this.image && this.image.rtt) { if (this.image.width !== width || this.image.height !== height || resizeDepth && this.image.depth !== depth) { this.version++; this.image.width = width; this.image.height = height; if (resizeDepth) this.image.depth = depth; } } else { this.version++; const oldDepth = this.image && this.image.depth ? this.image.depth : 1; this.image = { rtt: true, data: null, width, height, depth: resizeDepth ? depth : oldDepth }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture2DArray.prototype.isTexture2DArray = true; /** * Render Target that render to offscreen textures or renderbuffers. * @extends RenderTargetBase */ class OffscreenRenderTarget extends RenderTargetBase { /** * Create a new OffscreenRenderTarget. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. */ constructor(width, height) { super(width, height); /** * The active layer index for rendering. * For cube render targets, this represents the active cube face. * @type {number} * @default 0 */ this.activeLayer = 0; /** * The active mipmap level for rendering. * Not supported in WebGL1. * @type {number} * @default 0 */ this.activeMipmapLevel = 0; this._attachments = {}; } /** * Resize the render target to the specified dimensions. * This will resize all attached attachments. * @param {number} width - The new width of the render target. * @param {number} height - The new height of the render target. * @param {number} [depth] - **DEPRECATED**: Depth parameter is no longer used. * Individual textures manage their own depth dimensions. */ resize(width, height, depth) { if (arguments.length > 2) { console.warn('OffscreenRenderTarget.resize(): The depth parameter is deprecated. ' + 'RenderTarget no longer manages texture depth as it is not required by the rendering backend. ' + 'Use texture.resizeAsAttachment() directly to control texture dimensions.'); } if (this.width === width && this.height === height) return; this.width = width; this.height = height; this.dispose(false); for (const attachment in this._attachments) { const target = this._attachments[attachment]; if (target.isTexture) { target.resizeAsAttachment(width, height); } else { target.resize(width, height); } } } /** * Dispose the render target. * @param {boolean} [disposeAttachments=true] - Whether to dispose attachments as well. */ dispose(disposeAttachments = true) { this.dispatchEvent({ type: 'dispose' }); if (disposeAttachments) { for (const attachment in this._attachments) { this._attachments[attachment].dispose(); } } } /** * Attach a texture(RTT) or renderbuffer to the framebuffer. * Notice: For now, dynamic Attachment during rendering is not supported. * @param {TextureBase|RenderBuffer} target - The texture or renderbuffer to attach. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point. * @returns {OffscreenRenderTarget} Self for chaining. */ attach(target, attachment = ATTACHMENT.COLOR_ATTACHMENT0) { if (target.isTexture) { target.resizeAsAttachment(this.width, this.height); } else { target.resize(this.width, this.height); } this._attachments[attachment] = target; return this; } /** * Detach a texture(RTT) or renderbuffer. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point to detach. * @returns {OffscreenRenderTarget} Self for chaining. */ detach(attachment = ATTACHMENT.COLOR_ATTACHMENT0) { delete this._attachments[attachment]; return this; } /** * Get the attached attachment at the specified attachment point. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point. * @returns {TextureBase|RenderBuffer|null} The attached texture or renderbuffer. */ getAttachment(attachment = ATTACHMENT.COLOR_ATTACHMENT0) { return this._attachments[attachment] || null; } /** * The main texture attachment which is the first color attachment. * @type {TextureBase|null} */ set texture(texture) { if (texture && texture.isTexture) { this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } else { this.detach(ATTACHMENT.COLOR_ATTACHMENT0); } } get texture() { const target = this._attachments[ATTACHMENT.COLOR_ATTACHMENT0]; return target && target.isTexture ? target : null; } /** * An alias for {@link OffscreenRenderTarget#activeLayer}. Specifically represents * the currently rendered cube face (0-5) when using cube textures. * @type {number} */ set activeCubeFace(value) { this.activeLayer = value; } get activeCubeFace() { return this.activeLayer; } /** * Create a simple offscreen render target with a color texture and * a depth-stencil renderbuffer. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create2D(width, height) { const renderTarget = new OffscreenRenderTarget(width, height); renderTarget.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0); renderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); return renderTarget; } /** * Create a simple offscreen render target with a cube color texture and * a depth-stencil renderbuffer. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static createCube(width, height) { const renderTarget = new OffscreenRenderTarget(width, height); renderTarget.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0); renderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); return renderTarget; } /** * Create a simple offscreen render target with a 3D color texture. * Note: No depth-stencil attachment is created by default. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @param {number} depth - The depth of the 3D texture. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create3D(width, height, depth) { const renderTarget = new OffscreenRenderTarget(width, height); const texture = new Texture3D(); texture.resizeAsAttachment(width, height, depth); renderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); return renderTarget; } /** * Create a simple offscreen render target with a 2D array color texture. * Note: No depth-stencil attachment is created by default. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @param {number} depth - The depth of the 2D array texture (number of layers). * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create2DArray(width, height, depth) { const renderTarget = new OffscreenRenderTarget(width, height); const texture = new Texture2DArray(); texture.resizeAsAttachment(width, height, depth); renderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); return renderTarget; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ OffscreenRenderTarget.prototype.isOffscreenRenderTarget = true; /** * Render Target that render to screen (canvas). * @extends RenderTargetBase */ class ScreenRenderTarget extends RenderTargetBase { /** * Create a new ScreenRenderTarget. * @param {HTMLCanvasElement} view - The canvas element which the Render Target rendered to. */ constructor(view) { super(view.width, view.height); /** * The canvas element which the Render Target rendered to. * @type {HTMLCanvasElement} */ this.view = view; } /** * Resizes the render target to the specified dimensions. * This method will set the width and height properties of the canvas. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. */ resize(width, height) { this.view.width = width; this.view.height = height; this.width = width; this.height = height; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ ScreenRenderTarget.prototype.isScreenRenderTarget = true; let _querySetId = 0; /** * A QuerySet holds a set of queries of a particular type. * @extends EventDispatcher */ class QuerySet extends EventDispatcher { /** * Creates a new QuerySet. * @param {QUERYSET_TYPE} type - The type of the query set. * @param {number} count - The number of queries in the set. */ constructor(type, count) { super(); /** * Unique number for this query set instance. * @readonly * @type {number} */ this.id = _querySetId++; /** * The name of the query set. * @type {string} * @default "" */ this.name = ''; /** * The type of the query set. * @readonly * @type {QUERYSET_TYPE} */ this.type = type; /** * The max number of queries in the set. * @readonly * @type {number} */ this.count = count; /** * Indicates whether the query set operates in conservative mode. * This property only applies to occlusion query sets in WebGL renderer. * @type {boolean} * @default true */ this.conservative = true; } /** * Dispose this query set. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * This class is designed to assist with raycasting. Raycasting is used for * mouse picking (working out what objects in the 3d space the mouse is over) * amongst other things. */ class Raycaster { /** * Constructs a new raycaster. * @param {Vector3} origin — The origin vector where the ray casts from. * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray. */ constructor(origin, direction) { /** * The ray used for raycasting. * @type {Ray} */ this.ray = new Ray(origin, direction); } /** * Updates the ray with a new origin and direction by copying the values from the arguments. * @param {Vector3} origin — The origin vector where the ray casts from. * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray. */ set(origin, direction) { // direction is assumed to be normalized (for accurate distance calculations) this.ray.set(origin, direction); } /** * Uses the given coordinates and camera to compute a new origin and direction for the internal ray. * @param {Vector2} coords — 2D coordinates of the mouse, in normalized device coordinates (NDC). * X and Y components should be between `-1` and `1`. * @param {Camera} camera — The camera from which the ray should originate. */ setFromCamera(coords, camera) { if (camera.projectionMatrix.elements[11] === -1) { // perspective this.ray.origin.setFromMatrixPosition(camera.worldMatrix); this.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize(); } else { // orthographic // set origin in plane of camera // projectionMatrix.elements[14] = (near + far) / (near - far) this.ray.origin.set(coords.x, coords.y, camera.projectionMatrix.elements[14]).unproject(camera); this.ray.direction.set(0, 0, -1).transformDirection(camera.worldMatrix); } } /** * Checks all intersection between the ray and the object with or without the * descendants. Intersections are returned sorted by distance, closest first. * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ] * @param {Object3D} object — The 3D object to check for intersection with the ray. * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants. * Otherwise it only checks intersection with the object. * @param {object[]} [intersects=[]] - The target array that holds the result of the method. * @returns {object[]} An array holding the intersection points. */ intersectObject(object, recursive = false, intersects = []) { intersect(object, this, intersects, recursive); intersects.sort(ascSort); return intersects; } /** * Checks all intersection between the ray and the objects with or without * the descendants. Intersections are returned sorted by distance, closest first. * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ] * @param {Object3D[]} objects — The 3D objects to check for intersection with the ray. * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants. * Otherwise it only checks intersection with the object. * @param {object[]} [intersects=[]] - The target array that holds the result of the method. * @returns {object[]} An array holding the intersection points. */ intersectObjects(objects, recursive = false, intersects = []) { for (let i = 0, l = objects.length; i < l; i++) { intersect(objects[i], this, intersects, recursive); } intersects.sort(ascSort); return intersects; } } function ascSort(a, b) { return a.distance - b.distance; } function intersect(object, raycaster, intersects, recursive) { let propagate = true; const result = object.raycast(raycaster.ray, intersects); if (result === false) propagate = false; if (propagate === true && recursive === true) { const children = object.children; for (let i = 0, l = children.length; i < l; i++) { intersect(children[i], raycaster, intersects, true); } } } const _offsetMatrix = new Matrix4(); /** * Use an array of bones to create a skeleton that can be used by a {@link SkinnedMesh}. */ class Skeleton { /** * @param {Bone[]} bones * @param {Matrix4[]} boneInverses */ constructor(bones, boneInverses) { /** * The array of bones. * @type {Bone[]} */ this.bones = bones.slice(0); /** * An array of Matrix4s that represent the inverse of the worldMatrix of the individual bones. * @type {Matrix4[]} */ this.boneInverses = boneInverses; /** * The array buffer holding the bone data. * @type {Float32Array} */ this.boneMatrices = new Float32Array(16 * this.bones.length); /** * The {@link Texture2D} holding the bone data when using a vertex texture. * Use vertex texture to update boneMatrices, by that way, we can use more bones on phone. * @type {Texture2D|undefined} * @default undefined */ this.boneTexture = undefined; this._version = 0; } /** * Returns the skeleton to the base pose. */ pose() { const boneInverses = this.boneInverses; for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; bone.worldMatrix.copy(boneInverses[i]).invert(); } for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; if (bone.parent && bone.parent.isBone) { bone.matrix.copy(bone.parent.worldMatrix).invert(); bone.matrix.multiply(bone.worldMatrix); } else { bone.matrix.copy(bone.worldMatrix); } bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); } } /** * Clone skeleton. * @returns {Skeleton} */ clone() { return new Skeleton(this.bones, this.boneInverses); } /** * Updates the boneMatrices and boneTexture after changing the bones. * This is called automatically if the skeleton is used with a SkinnedMesh. * @ignore */ updateBones(sceneData) { const useAnchorMatrix = sceneData.useAnchorMatrix; const anchorMatrixInverse = sceneData.anchorMatrixInverse; const boneInverses = this.boneInverses; for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; _offsetMatrix.multiplyMatrices(bone.worldMatrix, boneInverses[i]); if (useAnchorMatrix) { _offsetMatrix.premultiply(anchorMatrixInverse); } _offsetMatrix.toArray(this.boneMatrices, i * 16); } if (this.boneTexture !== undefined) { this.boneTexture.version++; } } generateBoneTexture() { let size = MathUtils.nextPowerOfTwoSquareSize(this.bones.length * 4); size = Math.max(size, 4); const boneMatrices = new Float32Array(size * size * 4); boneMatrices.set(this.boneMatrices); const boneTexture = new Texture2D(); boneTexture.image = { data: boneMatrices, width: size, height: size }; boneTexture.format = PIXEL_FORMAT.RGBA; boneTexture.type = PIXEL_TYPE.FLOAT; boneTexture.magFilter = TEXTURE_FILTER.NEAREST; boneTexture.minFilter = TEXTURE_FILTER.NEAREST; boneTexture.generateMipmaps = false; boneTexture.flipY = false; this.boneMatrices = boneMatrices; this.boneTexture = boneTexture; } } /** * This light globally illuminates all objects in the scene equally. * This light cannot be used to cast shadows as it does not have a direction. * @extends Light */ class AmbientLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color, intensity) { super(color, intensity); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ AmbientLight.prototype.isAmbientLight = true; /** * Serves as a base class for the other shadow classes. * @abstract */ class LightShadow { constructor() { /** * The light's view of the world. * This is used to generate a depth map of the scene; objects behind other objects from the light's perspective will be in shadow. * @type {Camera} */ this.camera = new Camera(); /** * Model to shadow camera space, to compute location and depth in shadow map. Stored in a {@link Matrix4}. * This is computed internally during rendering. * @type {Matrix4} */ this.matrix = new Matrix4(); /** * Shadow map bias, how much to add or subtract from the normalized depth when deciding whether a surface is in shadow. * Very tiny adjustments here (in the order of 0.0001) may help reduce artefacts in shadows. * @type {number} * @default 0 */ this.bias = 0; /** * Defines how much the position used to query the shadow map is offset along the object normal. * Increasing this value can be used to reduce shadow acne especially in large scenes where light shines onto geometry at a shallow angle. * The cost is that shadows may appear distorted. * @type {number} * @default 0 */ this.normalBias = 0; /** * Setting this to values greater than 1 will blur the edges of the shadow. * High values will cause unwanted banding effects in the shadows - a greater mapSize will allow for a higher value to be used here before these effects become visible. * Note that this has no effect if the {@link Object3D#shadowType} is set to PCF or PCSS. * @type {number} * @default 1 */ this.radius = 1; /** * Shadow camera near. * @type {number} * @default 1 */ this.cameraNear = 1; /** * Shadow camera far. * @type {number} * @default 500 */ this.cameraFar = 500; /** * A {@link Vector2} defining the width and height of the shadow map. * Higher values give better quality shadows at the cost of computation time. * Values must be powers of 2. * @type {Vector2} * @default Vector2(512, 512) */ this.mapSize = new Vector2(512, 512); /** * Enables automatic updates of the light's shadow. * If you do not require dynamic lighting / shadows, you may set this to false. * @type {boolean} * @default true */ this.autoUpdate = true; /** * When set to true, shadow maps will be updated in the next ShadowMapPass.render call. * If you have set .autoUpdate to false, you will need to set this property to true and then make a ShadowMapPass.render call to update the light's shadow. * @type {boolean} * @default false */ this.needsUpdate = false; this.renderTarget = null; this.map = null; this.depthMap = null; } update(light, face) {} updateMatrix() { const matrix = this.matrix; const camera = this.camera; // matrix * 0.5 + 0.5, after identity, range is 0 ~ 1 instead of -1 ~ 1 matrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0); matrix.multiply(camera.projectionMatrix); matrix.multiply(camera.viewMatrix); } copy(source) { this.camera.copy(source.camera); this.matrix.copy(source.matrix); this.bias = source.bias; this.normalBias = source.normalBias; this.radius = source.radius; this.cameraNear = source.cameraNear; this.cameraFar = source.cameraFar; this.mapSize.copy(source.mapSize); return this; } clone() { return new this.constructor().copy(this); } prepareDepthMap(_enable, _capabilities) {} } /** * This is used internally by DirectionalLights for calculating shadows. * @extends LightShadow */ class DirectionalLightShadow extends LightShadow { constructor() { super(); /** * The cast shadow window size. * @type {number} * @default 500 */ this.windowSize = 500; /** * Controls the extent to which the shadows fade out at the edge of the frustum. * If the value is greater than 0, the shadow fades out from center to all sides of shadow texture (radial fade out), * if the value is less than 0, the shadow will fade out from the y+ direction (vertical fade out). * @type {number} * @default 0 */ this.frustumEdgeFalloff = 0.0; this.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; const depthTexture = new Texture2D(); depthTexture.type = PIXEL_TYPE.UNSIGNED_INT; depthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT; depthTexture.magFilter = TEXTURE_FILTER.LINEAR; depthTexture.minFilter = TEXTURE_FILTER.LINEAR; depthTexture.compare = COMPARE_FUNC.LESS; depthTexture.generateMipmaps = false; const depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16); this.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); this.map = map; this.depthMap = depthTexture; this._depthBuffer = depthBuffer; } update(light) { this._updateCamera(light); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light) { const camera = this.camera; camera.matrix.copy(light.worldMatrix); camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); camera.updateMatrix(); const halfWindowSize = this.windowSize / 2; camera.setOrtho(-halfWindowSize, halfWindowSize, -halfWindowSize, halfWindowSize, this.cameraNear, this.cameraFar); } copy(source) { super.copy(source); this.windowSize = source.windowSize; this.frustumEdgeFalloff = source.frustumEdgeFalloff; return this; } prepareDepthMap(enable, capabilities) { const useDepthMap = enable && capabilities.version >= 2; const renderTarget = this.renderTarget; const attachments = renderTarget._attachments; const depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap; if (useDepthMap === depthMapAttached) return; if (useDepthMap) { if (capabilities.getExtension('OES_texture_float_linear')) { this.depthMap.type = PIXEL_TYPE.FLOAT; } renderTarget.dispose(); renderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT); } else { renderTarget.dispose(); renderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); } } } /** * A light that gets emitted in a specific direction. * This light will behave as though it is infinitely far away and the rays produced from it are all parallel. * The common use case for this is to simulate daylight; the sun is far enough away that its position can be considered to be infinite, and all light rays coming from it are parallel. * This light can cast shadows - see the {@link DirectionalLightShadow} page for details. * @extends Light */ class DirectionalLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color, intensity) { super(color, intensity); /** * A {@link DirectionalLightShadow} used to calculate shadows for this light. * @type {DirectionalLightShadow} * @default DirectionalLightShadow() */ this.shadow = new DirectionalLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ DirectionalLight.prototype.isDirectionalLight = true; /** * A light source positioned directly above the scene, with color fading from the sky color to the ground color. * This light cannot be used to cast shadows. * @extends Light */ class HemisphereLight extends Light { /** * @param {number} [skyColor=0xffffff] - Hexadecimal color of the sky. * @param {number} [groundColor=0xffffff] - Hexadecimal color of the ground. * @param {number} [intensity=1] - numeric value of the light's strength/intensity. */ constructor(skyColor, groundColor, intensity) { super(skyColor, intensity); /** * Color of the ground. * @type {Color3} * @default Color3(0xffffff) */ this.groundColor = new Color3(groundColor !== undefined ? groundColor : 0xffffff); } copy(source) { super.copy(source); this.groundColor.copy(source.groundColor); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ HemisphereLight.prototype.isHemisphereLight = true; /** * This is used internally by PointLights for calculating shadows. * @extends LightShadow */ class PointLightShadow extends LightShadow { constructor() { super(); this.renderTarget = OffscreenRenderTarget.createCube(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; this.map = map; this._targets = [new Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1)]; this._ups = [new Vector3(0, -1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(0, -1, 0)]; this._lookTarget = new Vector3(); } update(light, face) { this._updateCamera(light, face); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light, face) { const camera = this.camera; const lookTarget = this._lookTarget; const targets = this._targets; const ups = this._ups; // set camera position and lookAt(rotation) camera.position.setFromMatrixPosition(light.worldMatrix); lookTarget.set(targets[face].x + camera.position.x, targets[face].y + camera.position.y, targets[face].z + camera.position.z); camera.lookAt(lookTarget, ups[face]); // update view matrix camera.updateMatrix(); // update projection camera.setPerspective(90 / 180 * Math.PI, 1, this.cameraNear, this.cameraFar); } } /** * A light that gets emitted from a single point in all directions. * A common use case for this is to replicate the light emitted from a bare lightbulb. * This light can cast shadows - see {@link PointLightShadow} page for details. * @extends Light */ class PointLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [distance=200] * @param {number} [decay=1] */ constructor(color, intensity, distance, decay) { super(color, intensity); /** * The amount the light dims along the distance of the light. * @type {number} * @default 1 */ this.decay = decay !== undefined ? decay : 1; /** * The distance from the light where the intensity is 0. * @type {number} * @default 200 */ this.distance = distance !== undefined ? distance : 200; /** * A {@link PointLightShadow} used to calculate shadows for this light. * @type {PointLightShadow} * @default PointLightShadow() */ this.shadow = new PointLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ PointLight.prototype.isPointLight = true; /** * This light globally all objects in the scene equally. * This light depends on spherical harmonics. * @extends Light */ class SphericalHarmonicsLight extends Light { /** * Creates a new SphericalHarmonicsLight. * @param {SphericalHarmonics3} [sh = new SphericalHarmonics3()] * @param {number} [intensity = 1] */ constructor(sh = new SphericalHarmonics3(), intensity = 1) { super(undefined, intensity); /** * An instance of SphericalHarmonics3. * @type {SphericalHarmonics3} */ this.sh = sh; } copy(source) { super.copy(source); this.sh.copy(source.sh); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SphericalHarmonicsLight.prototype.isSphericalHarmonicsLight = true; /** * This is used internally by SpotLights for calculating shadows. * @extends LightShadow */ class SpotLightShadow extends LightShadow { constructor() { super(); /** * Controls the extent to which the shadows fade out at the edge of the frustum. * @type {number} * @default 0 */ this.frustumEdgeFalloff = 0.0; this.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; const depthTexture = new Texture2D(); depthTexture.type = PIXEL_TYPE.UNSIGNED_INT; depthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT; depthTexture.magFilter = TEXTURE_FILTER.LINEAR; depthTexture.minFilter = TEXTURE_FILTER.LINEAR; depthTexture.compare = COMPARE_FUNC.LESS; depthTexture.generateMipmaps = false; const depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16); this.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); this.map = map; this.depthMap = depthTexture; this._depthBuffer = depthBuffer; } update(light) { this._updateCamera(light); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light) { const camera = this.camera; camera.matrix.copy(light.worldMatrix); camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); camera.updateMatrix(); camera.setPerspective(light.angle * 2, 1, this.cameraNear, this.cameraFar); } copy(source) { super.copy(source); this.frustumEdgeFalloff = source.frustumEdgeFalloff; return this; } prepareDepthMap(enable, capabilities) { const useDepthMap = enable && capabilities.version >= 2; const renderTarget = this.renderTarget; const attachments = renderTarget._attachments; const depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap; if (useDepthMap === depthMapAttached) return; if (useDepthMap) { if (capabilities.getExtension('OES_texture_float_linear')) { this.depthMap.type = PIXEL_TYPE.FLOAT; } renderTarget.dispose(); renderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT); } else { renderTarget.dispose(); renderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); } } } /** * This light gets emitted from a single point in one direction, along a cone that increases in size the further from the light it gets. * This light can cast shadows - see the {@link SpotLightShadow} page for details. * @extends Light */ class SpotLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [distance=200] * @param {number} [angle=Math.PI/6] * @param {number} [penumbra=0] * @param {number} [decay=1] */ constructor(color, intensity, distance, angle, penumbra, decay) { super(color, intensity); /** * The amount the light dims along the distance of the light. * @type {number} * @default 1 */ this.decay = decay !== undefined ? decay : 1; /** * The distance from the light where the intensity is 0. * @type {number} * @default 200 */ this.distance = distance !== undefined ? distance : 200; /** * Percent of the spotlight cone that is attenuated due to penumbra. * Takes values between zero and 1. * @type {number} * @default 0 */ this.penumbra = penumbra !== undefined ? penumbra : 0; /** * Maximum extent of the spotlight, in radians, from its direction. * Should be no more than Math.PI/2. * @type {number} * @default Math.PI/6 */ this.angle = angle !== undefined ? angle : Math.PI / 6; /** * A {@link SpotLightShadow} used to calculate shadows for this light. * @type {SpotLightShadow} * @default SpotLightShadow() */ this.shadow = new SpotLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SpotLight.prototype.isSpotLight = true; /** * A bone which is part of a Skeleton. * The skeleton in turn is used by the SkinnedMesh. * Bones are almost identical to a blank Object3D. * Bone acturely is a joint. * The position means joint position. * Mesh transform is based this joint space. * @extends Object3D */ class Bone extends Object3D { constructor() { super(); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Bone.prototype.isBone = true; /** * A mesh that has a {@link Skeleton} with bones that can then be used to animate the vertices of the geometry. * The material must support skinning. * @extends Mesh */ class SkinnedMesh extends Mesh { constructor(geometry, material) { super(geometry, material); /** * Skeleton created from the bones of the Geometry. * @type {Skeleton} */ this.skeleton = undefined; /** * Either "attached" or "detached". * "attached" uses the {@link SkinnedMesh#worldMatrix} property for the base transform matrix of the bones. * "detached" uses the {@link SkinnedMesh#bindMatrix}. * @type {string} * @default "attached" */ this.bindMode = 'attached'; /** * The base matrix that is used for the bound bone transforms. * @type {Matrix4} */ this.bindMatrix = new Matrix4(); /** * The base matrix that is used for resetting the bound bone transforms. * @type {Matrix4} */ this.bindMatrixInverse = new Matrix4(); } /** * Bind a skeleton to the skinned mesh. * The bindMatrix gets saved to .bindMatrix property and the .bindMatrixInverse gets calculated. * @param {Skeleton} skeleton - Skeleton created from a Bones tree. * @param {Matrix4} [bindMatrix] - Matrix4 that represents the base transform of the skeleton. */ bind(skeleton, bindMatrix) { this.skeleton = skeleton; if (bindMatrix === undefined) { this.updateMatrix(); bindMatrix = this.worldMatrix; } this.bindMatrix.copy(bindMatrix); this.bindMatrixInverse.copy(bindMatrix).invert(); } updateMatrix(force) { super.updateMatrix(force); if (this.bindMode === 'attached') { this.bindMatrixInverse.copy(this.worldMatrix).invert(); } else if (this.bindMode === 'detached') { this.bindMatrixInverse.copy(this.bindMatrix).invert(); } else { console.warn('SkinnedMesh: Unrecognized bindMode: ' + this.bindMode); } } copy(source) { super.copy(source); this.bindMode = source.bindMode; this.bindMatrix.copy(source.bindMatrix); this.bindMatrixInverse.copy(source.bindMatrixInverse); this.skeleton = source.skeleton; return this; } getVertexPosition(index, target) { super.getVertexPosition(index, target); this.applyBoneTransform(index, target); return target; } /** * Applies the bone transform associated with the given index to the given position vector. * Returns the updated vector. * @param {number} index - The index of the vertex. * @param {Vector3} target - The target vector. * @returns {Vector3} The target vector. */ applyBoneTransform(index, target) { const skeleton = this.skeleton; const geometry = this.geometry; const skinIndex = geometry.attributes.skinIndex; const skinWeight = geometry.attributes.skinWeight; _skinIndex.fromArray(skinIndex.buffer.array, index * skinIndex.size); _skinWeight.fromArray(skinWeight.buffer.array, index * skinWeight.size); _basePosition.copy(target).applyMatrix4(this.bindMatrix); target.set(0, 0, 0); for (let i = 0; i < 4; i++) { const weight = getComponent(_skinWeight, i); if (weight < Number.EPSILON) continue; const boneIndex = getComponent(_skinIndex, i); if (!skeleton.bones[boneIndex]) continue; _matrix.multiplyMatrices(skeleton.bones[boneIndex].worldMatrix, skeleton.boneInverses[boneIndex]); target.addScaledVector(_vector.copy(_basePosition).applyMatrix4(_matrix), weight); } return target.applyMatrix4(this.bindMatrixInverse); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SkinnedMesh.prototype.isSkinnedMesh = true; const _basePosition = new Vector3(); const _skinIndex = new Vector4(); const _skinWeight = new Vector4(); const _vector = new Vector3(); const _matrix = new Matrix4(); function getComponent(vec, index) { switch (index) { case 0: return vec.x; case 1: return vec.y; case 2: return vec.z; case 3: return vec.w; default: throw new Error('index is out of range: ' + index); } } var alphaTest_frag = "#ifdef ALPHATEST\n\tif (outColor.a < u_AlphaTest) discard;\n\toutColor.a = u_Opacity;\n#endif"; var alphaTest_pars_frag = "#ifdef ALPHATEST\n\tuniform float u_AlphaTest;\n#endif"; var aoMap_pars_frag = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\tvarying vec2 vAOMapUV;\n#endif"; var aoMap_pars_vert = "#ifdef USE_AOMAP\n\tuniform mat3 aoMapUVTransform;\n\tvarying vec2 vAOMapUV;\n#endif"; var aoMap_vert = "#ifdef USE_AOMAP\n\tvAOMapUV = (aoMapUVTransform * vec3(AOMAP_UV, 1.)).xy;\n#endif"; var aoMap_frag = "\n#ifdef USE_AOMAP\n float ambientOcclusion = (texture2D(aoMap, vAOMapUV).r - 1.0) * aoMapIntensity + 1.0;\n \n reflectedLight.indirectDiffuse *= ambientOcclusion;\n #if defined(USE_ENV_MAP) && defined(USE_PBR)\n float dotNV = saturate(dot(N, V));\n reflectedLight.indirectSpecular *= computeSpecularOcclusion(dotNV, ambientOcclusion, roughness);\n #endif\n#endif"; var begin_frag = "vec4 outColor = vec4(u_Color, u_Opacity);"; var begin_vert = "vec3 transformed = vec3(a_Position);\nvec3 objectNormal = vec3(a_Normal);\n#ifdef USE_TANGENT\n vec3 objectTangent = vec3(a_Tangent.xyz);\n#endif"; var bsdfs = "\nvec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) {\n return RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick(const in vec3 specularColor, const in float dotLH) {\n\tfloat fresnel = exp2((-5.55473 * dotLH - 6.98316) * dotLH);\n\treturn (1.0 - specularColor) * fresnel + specularColor;\n}\nfloat D_BlinnPhong(const in float shininess, const in float dotNH) {\n\treturn RECIPROCAL_PI * (shininess * 0.5 + 1.0) * pow(dotNH, shininess);\n}\nfloat G_BlinnPhong_Implicit() {\n\treturn 0.25;\n}\nvec3 BRDF_Specular_BlinnPhong(vec3 specularColor, vec3 N, vec3 L, vec3 V, float shininess) {\n vec3 H = normalize(L + V);\n float dotNH = saturate(dot(N, H));\n float dotLH = saturate(dot(L, H));\n vec3 F = F_Schlick(specularColor, dotLH);\n float G = G_BlinnPhong_Implicit();\n float D = D_BlinnPhong(shininess, dotNH);\n return F * G * D;\n}\nfloat D_GGX(const in float alpha, const in float dotNH) {\n\tfloat a2 = pow2(alpha);\n\tfloat denom = pow2(dotNH) * (a2 - 1.0) + 1.0;\treturn RECIPROCAL_PI * a2 / pow2(denom);\n}\nfloat G_GGX_SmithCorrelated(const in float alpha, const in float dotNL, const in float dotNV) {\n\tfloat a2 = pow2(alpha);\n\tfloat gv = dotNL * sqrt(a2 + (1.0 - a2) * pow2(dotNV));\n\tfloat gl = dotNV * sqrt(a2 + (1.0 - a2) * pow2(dotNL));\n\treturn 0.5 / max(gv + gl, EPSILON);\n}\nvec3 BRDF_Specular_GGX(vec3 specularColor, vec3 N, vec3 L, vec3 V, float roughness) {\n\tfloat alpha = pow2(roughness);\n\tvec3 H = normalize(L + V);\n\tfloat dotNL = saturate(dot(N, L));\n\tfloat dotNV = saturate(dot(N, V));\n\tfloat dotNH = saturate(dot(N, H));\n\tfloat dotLH = saturate(dot(L, H));\n\tvec3 F = F_Schlick(specularColor, dotLH);\n\tfloat G = G_GGX_SmithCorrelated(alpha, dotNL, dotNV);\n\tfloat D = D_GGX(alpha, dotNH);\n\treturn F * G * D;\n}\nvec2 integrateSpecularBRDF(const in float dotNV, const in float roughness) {\n\tconst vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022);\n\tconst vec4 c1 = vec4(1, 0.0425, 1.04, -0.04);\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y;\n\treturn vec2(-1.04, 1.04) * a004 + r.zw;\n}\nvec3 F_Schlick_RoughnessDependent(const in vec3 F0, const in float dotNV, const in float roughness) {\n\tfloat fresnel = exp2((-5.55473 * dotNV - 6.98316) * dotNV);\n\tvec3 Fr = max(vec3(1.0 - roughness), F0) - F0;\n\treturn Fr * fresnel + F0;\n}\nvec3 BRDF_Specular_GGX_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness) {\n\tfloat dotNV = saturate(dot(N, V));\n\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter) {\n\tfloat dotNV = saturate(dot(N, V));\n\tvec3 F = F_Schlick_RoughnessDependent(specularColor, dotNV, roughness);\n\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + (1.0 - specularColor) * 0.047619;\tvec3 Fms = FssEss * Favg / (1.0 - Ems * Favg);\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}"; var bumpMap_pars_frag = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd(vec2 uv) {\n\t\tvec2 dSTdx = dFdx( uv );\n\t\tvec2 dSTdy = dFdy( uv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, uv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, uv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, uv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif"; var clippingPlanes_frag = "\n#if NUM_CLIPPING_PLANES > 0\n vec4 plane;\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if ( dot( -v_modelPos, plane.xyz ) > plane.w ) discard;\n }\n #pragma unroll_loop_end\n#endif"; var clippingPlanes_pars_frag = "#if NUM_CLIPPING_PLANES > 0\n uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; var color_frag = "#ifdef USE_VCOLOR_RGB\n outColor.rgb *= v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n outColor *= v_Color;\n#endif"; var color_pars_frag = "#ifdef USE_VCOLOR_RGB\n varying vec3 v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n varying vec4 v_Color;\n#endif"; var color_pars_vert = "#ifdef USE_VCOLOR_RGB\n attribute vec3 a_Color;\n varying vec3 v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n attribute vec4 a_Color;\n varying vec4 v_Color;\n#endif"; var color_vert = "#if defined(USE_VCOLOR_RGB) || defined(USE_VCOLOR_RGBA)\n v_Color = a_Color;\n#endif"; var common_frag = "uniform mat4 u_View;\nuniform float u_Opacity;\nuniform vec3 u_Color;\nuniform vec3 u_CameraPosition;\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};"; var common_vert = "attribute vec3 a_Position;\nattribute vec3 a_Normal;\n#ifdef USE_TANGENT\n\tattribute vec4 a_Tangent;\n#endif\n#include \n#include \nuniform mat4 u_Projection;\nuniform mat4 u_View;\nuniform mat4 u_Model;\nuniform mat4 u_ProjectionView;\nuniform vec3 u_CameraPosition;\n#define EPSILON 1e-6\n#ifdef USE_MORPHTARGETS\n attribute vec3 morphTarget0;\n attribute vec3 morphTarget1;\n attribute vec3 morphTarget2;\n attribute vec3 morphTarget3;\n #ifdef USE_MORPHNORMALS\n \tattribute vec3 morphNormal0;\n \tattribute vec3 morphNormal1;\n \tattribute vec3 morphNormal2;\n \tattribute vec3 morphNormal3;\n #else\n \tattribute vec3 morphTarget4;\n \tattribute vec3 morphTarget5;\n \tattribute vec3 morphTarget6;\n \tattribute vec3 morphTarget7;\n #endif\n#endif\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}"; var diffuseMap_frag = "#ifdef USE_DIFFUSE_MAP\n outColor *= mapTexelToLinear(texture2D(diffuseMap, vDiffuseMapUV));\n#endif"; var diffuseMap_pars_frag = "#ifdef USE_DIFFUSE_MAP\n uniform sampler2D diffuseMap;\n varying vec2 vDiffuseMapUV;\n#endif"; var diffuseMap_vert = "#ifdef USE_DIFFUSE_MAP\n vDiffuseMapUV = (uvTransform * vec3(DIFFUSEMAP_UV, 1.)).xy;\n#endif"; var diffuseMap_pars_vert = "#ifdef USE_DIFFUSE_MAP\n varying vec2 vDiffuseMapUV;\n#endif"; var emissiveMap_frag = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = emissiveMapTexelToLinear(texture2D(emissiveMap, vEmissiveMapUV));\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; var emissiveMap_pars_frag = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n\tvarying vec2 vEmissiveMapUV;\n#endif"; var emissiveMap_vert = "#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUV = (emissiveMapUVTransform * vec3(EMISSIVEMAP_UV, 1.)).xy;\n#endif"; var emissiveMap_pars_vert = "#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapUVTransform;\n\tvarying vec2 vEmissiveMapUV;\n#endif"; var encodings_frag = "gl_FragColor = linearToOutputTexel(gl_FragColor);"; var encodings_pars_frag = "vec4 LinearToLinear(in vec4 value) {\n\treturn value;\n}\nvec4 GammaToLinear(in vec4 value, in float gammaFactor) {\n\treturn vec4(pow(value.xyz, vec3(gammaFactor)), value.w);\n}\nvec4 LinearToGamma(in vec4 value, in float gammaFactor) {\n\treturn vec4(pow(value.xyz, vec3(1.0 / gammaFactor)), value.w);\n}\nvec4 sRGBToLinear(in vec4 value) {\n\treturn vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\n}\nvec4 LinearTosRGB(in vec4 value) {\n\treturn vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\n}"; var end_frag = "gl_FragColor = outColor;"; var envMap_frag = "#ifdef USE_ENV_MAP\n vec3 envDir;\n #ifdef USE_VERTEX_ENVDIR\n envDir = v_EnvDir;\n #else\n envDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\n #endif\n vec4 envColor = textureCube(envMap, vec3(envMapParams.z * envDir.x, envDir.yz));\n envColor = envMapTexelToLinear( envColor );\n #ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutColor = mix(outColor, envColor * outColor, envMapParams.y);\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutColor = mix(outColor, envColor, envMapParams.y);\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutColor += envColor * envMapParams.y;\n\t#endif\n#endif"; var envMap_pars_frag = "#ifdef USE_ENV_MAP\n #ifdef USE_VERTEX_ENVDIR\n varying vec3 v_EnvDir;\n #endif\n uniform samplerCube envMap;\n uniform vec3 envMapParams;\n uniform int maxMipLevel;\n#endif"; var envMap_pars_vert = "#ifdef USE_ENV_MAP\n #ifdef USE_VERTEX_ENVDIR\n varying vec3 v_EnvDir;\n #endif\n#endif"; var envMap_vert = "\n#ifdef USE_ENV_MAP\n #ifdef USE_VERTEX_ENVDIR\n vec3 transformedNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n transformedNormal = normalize(transformedNormal);\n v_EnvDir = reflect(normalize(worldPosition.xyz - u_CameraPosition), transformedNormal);\n #endif\n#endif"; var fog_frag = "#ifdef USE_FOG\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n #ifdef USE_EXP2_FOG\n float fogFactor = 1.0 - exp(-u_FogDensity * u_FogDensity * depth * depth);\n #else\n float fogFactor = smoothstep(u_FogNear, u_FogFar, depth);\n #endif\n gl_FragColor.rgb = mix(gl_FragColor.rgb, u_FogColor, fogFactor);\n#endif"; var fog_pars_frag = "#ifdef USE_FOG\n uniform vec3 u_FogColor;\n #ifdef USE_EXP2_FOG\n uniform float u_FogDensity;\n #else\n uniform float u_FogNear;\n uniform float u_FogFar;\n #endif\n#endif"; var inverse = "mat4 inverseMat4(mat4 m) {\n float\n a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n return mat4(\n a11 * b11 - a12 * b10 + a13 * b09,\n a02 * b10 - a01 * b11 - a03 * b09,\n a31 * b05 - a32 * b04 + a33 * b03,\n a22 * b04 - a21 * b05 - a23 * b03,\n a12 * b08 - a10 * b11 - a13 * b07,\n a00 * b11 - a02 * b08 + a03 * b07,\n a32 * b02 - a30 * b05 - a33 * b01,\n a20 * b05 - a22 * b02 + a23 * b01,\n a10 * b10 - a11 * b08 + a13 * b06,\n a01 * b08 - a00 * b10 - a03 * b06,\n a30 * b04 - a31 * b02 + a33 * b00,\n a21 * b02 - a20 * b04 - a23 * b00,\n a11 * b07 - a10 * b09 - a12 * b06,\n a00 * b09 - a01 * b07 + a02 * b06,\n a31 * b01 - a30 * b03 - a32 * b00,\n a20 * b03 - a21 * b01 + a22 * b00) / det;\n}"; var light_frag = "\n#if (defined(USE_PHONG) || defined(USE_PBR))\n vec3 V = normalize(u_CameraPosition - v_modelPos);\n#endif\n#ifdef USE_PBR\n #ifdef USE_PBR2\n vec3 diffuseColor = outColor.xyz;\n vec3 specularColor = specularFactor.xyz;\n float roughness = max(1.0 - glossinessFactor, 0.0525);\n #else\n vec3 diffuseColor = outColor.xyz * (1.0 - metalnessFactor);\n vec3 specularColor = mix(vec3(0.04), outColor.xyz, metalnessFactor);\n float roughness = max(roughnessFactor, 0.0525);\n #endif\n vec3 dxy = max(abs(dFdx(geometryNormal)), abs(dFdy(geometryNormal)));\n float geometryRoughness = max(max(dxy.x, dxy.y), dxy.z);\n roughness += geometryRoughness;\n roughness = min(roughness, 1.0);\n #ifdef USE_CLEARCOAT\n float clearcoat = u_Clearcoat;\n float clearcoatRoughness = u_ClearcoatRoughness;\n #ifdef USE_CLEARCOATMAP\n\t\t clearcoat *= texture2D(clearcoatMap, v_Uv).x;\n #endif\n #ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\t clearcoatRoughness *= texture2D(clearcoatRoughnessMap, v_Uv).y;\n\t #endif\n clearcoat = saturate(clearcoat);\n clearcoatRoughness = max(clearcoatRoughness, 0.0525);\n\t clearcoatRoughness += geometryRoughness;\n\t clearcoatRoughness = min(clearcoatRoughness, 1.0);\n #endif\n#else\n vec3 diffuseColor = outColor.xyz;\n #ifdef USE_PHONG\n vec3 specularColor = u_SpecularColor.xyz;\n float shininess = u_Specular;\n #endif\n#endif\nvec3 L;\nfloat falloff;\nfloat dotNL;\nvec3 irradiance;\nfloat clearcoatDHR;\n#ifdef USE_CLEARCOAT\n float ccDotNL;\n vec3 ccIrradiance;\n#endif\n#if NUM_DIR_LIGHTS > 0\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_DIR_LIGHTS; i++) {\n L = normalize(-u_Directional[i].direction);\n falloff = 1.0;\n #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_DIR_SHADOWS)\n #ifdef USE_PCSS_SOFT_SHADOW\n falloff *= getShadowWithPCSS(directionalDepthMap[i], directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\n #else\n falloff *= getShadow(directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\n #endif\n #endif\n dotNL = saturate(dot(N, L));\n irradiance = u_Directional[i].color * falloff * dotNL * PI;\n #ifdef USE_CLEARCOAT \n ccDotNL = saturate(dot(clearcoatNormal, L));\n ccIrradiance = ccDotNL * u_Directional[i].color * falloff * PI;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n #else\n clearcoatDHR = 0.0;\n #endif\n reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n #ifdef USE_PHONG\n reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n #endif\n #ifdef USE_PBR\n reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n #endif\n }\n #pragma unroll_loop_end\n#endif\n#if NUM_POINT_LIGHTS > 0\n vec3 worldV;\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_POINT_LIGHTS; i++) {\n worldV = v_modelPos - u_Point[i].position;\n L = -worldV;\n falloff = pow(clamp(1. - length(L) / u_Point[i].distance, 0.0, 1.0), u_Point[i].decay);\n L = normalize(L);\n #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_POINT_SHADOWS)\n falloff *= getPointShadow(pointShadowMap[i], vPointShadowCoord[i], u_PointShadow[i].shadowMapSize, u_PointShadow[i].shadowBias, u_PointShadow[i].shadowParams, u_PointShadow[i].shadowCameraRange);\n #endif\n dotNL = saturate(dot(N, L));\n irradiance = u_Point[i].color * falloff * dotNL * PI;\n #ifdef USE_CLEARCOAT \n ccDotNL = saturate(dot(clearcoatNormal, L));\n ccIrradiance = ccDotNL * u_Point[i].color * falloff * PI;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n #else\n clearcoatDHR = 0.0;\n #endif\n reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n #ifdef USE_PHONG\n reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n #endif\n #ifdef USE_PBR\n reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n #endif\n }\n #pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n float lightDistance;\n float angleCos;\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_SPOT_LIGHTS; i++) {\n L = u_Spot[i].position - v_modelPos;\n lightDistance = length(L);\n L = normalize(L);\n angleCos = dot(L, -normalize(u_Spot[i].direction));\n falloff = smoothstep(u_Spot[i].coneCos, u_Spot[i].penumbraCos, angleCos);\n falloff *= pow(clamp(1. - lightDistance / u_Spot[i].distance, 0.0, 1.0), u_Spot[i].decay);\n #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_SPOT_SHADOWS)\n #ifdef USE_PCSS_SOFT_SHADOW\n falloff *= getShadowWithPCSS(spotDepthMap[i], spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\n #else\n falloff *= getShadow(spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\n #endif\n #endif\n dotNL = saturate(dot(N, L));\n irradiance = u_Spot[i].color * falloff * dotNL * PI;\n #ifdef USE_CLEARCOAT \n ccDotNL = saturate(dot(clearcoatNormal, L));\n ccIrradiance = ccDotNL * u_Spot[i].color * falloff * PI;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n #else\n clearcoatDHR = 0.0;\n #endif\n reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n #ifdef USE_PHONG\n reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n #endif\n #ifdef USE_PBR\n reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n #endif\n }\n #pragma unroll_loop_end\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n vec3 RectAreaLightDirectSpecular;\n vec3 RectAreaLightDirectDiffuse;\n vec3 rectCoords[4];\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_RECT_AREA_LIGHTS; i++) {\n LTC_RectCoords(u_RectArea[i].position, u_RectArea[i].halfWidth, u_RectArea[i].halfHeight, rectCoords);\n reflectedLight.directDiffuse += u_RectArea[i].color * LTC_Diffuse(diffuseColor, N, V, v_modelPos, rectCoords);\n #ifdef USE_PBR\n reflectedLight.directSpecular += u_RectArea[i].color * LTC_Specular(specularColor, N, V, v_modelPos, rectCoords, roughness);\n #endif\n }\n #pragma unroll_loop_end\n#endif\n#ifdef USE_CLUSTERED_LIGHTS\n vec4 positionView = u_View * vec4(v_modelPos, 1.0);\n float perspectiveFactor = step(0.0, cellsTransformFactors.z);\n float halfFrustumHeight = -cellsTransformFactors.z * mix(1.0, positionView.z, perspectiveFactor);\n float halfFrustumWidth = halfFrustumHeight * cellsTransformFactors.w;\n vec3 cellCoords;\n cellCoords.z = floor(log(-positionView.z) * cellsTransformFactors.x + cellsTransformFactors.y);\n cellCoords.y = floor((positionView.y / (2.0 * halfFrustumHeight) + 0.5) * cells.y);\n cellCoords.x = floor((positionView.x / (2.0 * halfFrustumWidth) + 0.5) * cells.x);\n if(!(any(lessThan(cellCoords, vec3(0.0))) || any(greaterThanEqual(cellCoords, cells)))) {\n float cellIndex = dot(cellsDotData, cellCoords);\n float clusterV = floor(cellIndex * cellsTextureSize.y);\n float clusterU = cellIndex - (clusterV * cellsTextureSize.x);\n int size = textureSize(lightsTexture, 0).x;\n ClusteredPointLight clusteredPointLight;\n ClusteredSpotLight clusteredSpotLight;\n vec3 clusteredLightColor;\n float clusteredLightDistance;\n float clusteredAngleCos;\n for (int lightCellIndex = 0; lightCellIndex < maxLightsPerCell; lightCellIndex++) {\n float lightIndex = texelFetch(cellsTexture, ivec2(int(clusterU) + lightCellIndex, clusterV), 0).x;\n if (lightIndex <= 0.0) break;\n int lightOffset = int(lightIndex - 1.) * 4;\n ivec2 lightDataCoords = ivec2(lightOffset % size, lightOffset / size);\n vec4 lightData0 = texelFetch(lightsTexture, lightDataCoords, 0);\n if (lightData0.x == 1.0) {\n getPointLightFromTexture(lightDataCoords, lightData0, clusteredPointLight);\n L = clusteredPointLight.position - v_modelPos;\n clusteredLightDistance = length(L);\n L = normalize(L);\n falloff = pow(clamp(1. - clusteredLightDistance / clusteredPointLight.distance, 0.0, 1.0), clusteredPointLight.decay);\n clusteredLightColor = clusteredPointLight.color;\n } else if (lightData0.x == 2.0) {\n getSpotLightFromTexture(lightDataCoords, lightData0, clusteredSpotLight);\n L = clusteredSpotLight.position - v_modelPos;\n clusteredLightDistance = length(L);\n L = normalize(L);\n clusteredAngleCos = dot(L, -normalize(clusteredSpotLight.direction));\n falloff = smoothstep(clusteredSpotLight.coneCos, clusteredSpotLight.penumbraCos, clusteredAngleCos);\n falloff *= pow(clamp(1. - clusteredLightDistance / clusteredSpotLight.distance, 0.0, 1.0), clusteredSpotLight.decay);\n clusteredLightColor = clusteredSpotLight.color;\n }\n dotNL = saturate(dot(N, L));\n irradiance = clusteredLightColor * falloff * dotNL * PI;\n #ifdef USE_CLEARCOAT\n ccDotNL = saturate(dot(clearcoatNormal, L));\n ccIrradiance = ccDotNL * clusteredLightColor * falloff * PI;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n #else\n clearcoatDHR = 0.0;\n #endif\n reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n #ifdef USE_PHONG\n reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n #endif\n #ifdef USE_PBR\n reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n #endif\n }\n }\n#endif\nvec3 indirectIrradiance = vec3(0., 0., 0.); \n#ifdef USE_AMBIENT_LIGHT\n indirectIrradiance += u_AmbientLightColor * PI;\n#endif\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n indirectIrradiance += getLightProbeIrradiance(u_SphericalHarmonicsLightData, N);\n#endif\n#if NUM_HEMI_LIGHTS > 0\n float hemiDiffuseWeight;\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_HEMI_LIGHTS; i++) {\n L = normalize(u_Hemi[i].direction);\n dotNL = dot(N, L);\n hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n indirectIrradiance += mix(u_Hemi[i].groundColor, u_Hemi[i].skyColor, hemiDiffuseWeight) * PI;\n }\n #pragma unroll_loop_end\n#endif\nreflectedLight.indirectDiffuse += indirectIrradiance * BRDF_Diffuse_Lambert(diffuseColor);\n#if defined(USE_ENV_MAP) && defined(USE_PBR)\n vec3 iblIrradiance = vec3(0., 0., 0.);\n vec3 indirectRadiance = vec3(0., 0., 0.);\n vec3 clearcoatRadiance = vec3(0., 0., 0.);\n vec3 envDir;\n #ifdef USE_VERTEX_ENVDIR\n envDir = v_EnvDir;\n #else\n envDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\n #endif\n iblIrradiance += getLightProbeIndirectIrradiance(maxMipLevel, N);\n indirectRadiance += getLightProbeIndirectRadiance(roughness, maxMipLevel, N, envDir);\n #ifdef USE_CLEARCOAT\n vec3 clearcoatDir = reflect(normalize(v_modelPos - u_CameraPosition), clearcoatNormal);\n clearcoatRadiance += getLightProbeIndirectRadiance(clearcoatRoughness, maxMipLevel, clearcoatNormal, clearcoatDir);\n #endif\n #ifdef USE_CLEARCOAT\n float ccDotNV = saturate(dot(clearcoatNormal, V));\n reflectedLight.indirectSpecular += clearcoatRadiance * clearcoat * BRDF_Specular_GGX_Environment(clearcoatNormal, V, specularColor, clearcoatRoughness);\n ccDotNL = ccDotNV;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n #else\n clearcoatDHR = 0.0;\n #endif\n float clearcoatInv = 1.0 - clearcoatDHR;\n vec3 singleScattering = vec3(0.0);\n vec3 multiScattering = vec3(0.0);\n vec3 cosineWeightedIrradiance = iblIrradiance * RECIPROCAL_PI;\n BRDF_Specular_Multiscattering_Environment(N, V, specularColor, roughness, singleScattering, multiScattering);\n vec3 diffuse = diffuseColor * (1.0 - (singleScattering + multiScattering));\n reflectedLight.indirectSpecular += clearcoatInv * indirectRadiance * singleScattering;\n reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n#endif"; var light_pars_frag = "#ifdef USE_AMBIENT_LIGHT\n uniform vec3 u_AmbientLightColor;\n#endif\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n uniform vec3 u_SphericalHarmonicsLightData[9];\n#endif\n#ifdef USE_CLEARCOAT\n float clearcoatDHRApprox(const in float roughness, const in float dotNL) {\n return 0.04 + (1.0 - 0.16) * (pow(1.0 - dotNL, 5.0) * pow(1.0 - roughness, 2.0));\n }\n#endif\n#if NUM_HEMI_LIGHTS > 0\n struct HemisphereLight {\n vec3 direction;\n vec3 skyColor;\n\t\tvec3 groundColor;\n };\n uniform HemisphereLight u_Hemi[NUM_HEMI_LIGHTS];\n#endif\n#if NUM_DIR_LIGHTS > 0\n struct DirectLight {\n vec3 direction;\n vec3 color;\n };\n uniform DirectLight u_Directional[NUM_DIR_LIGHTS];\n#endif\n#if NUM_POINT_LIGHTS > 0\n struct PointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n uniform PointLight u_Point[NUM_POINT_LIGHTS];\n#endif\n#if NUM_SPOT_LIGHTS > 0\n struct SpotLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n float coneCos;\n float penumbraCos;\n vec3 direction;\n };\n uniform SpotLight u_Spot[NUM_SPOT_LIGHTS];\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n struct RectAreaLight {\n vec3 position;\n vec3 color;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n };\n uniform RectAreaLight u_RectArea[NUM_RECT_AREA_LIGHTS];\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n void LTC_RectCoords(const in vec3 lightPos, const in vec3 halfWidth, const in vec3 halfHeight, inout vec3 rectCoords[4]) {\n rectCoords[0] = lightPos + halfWidth - halfHeight; rectCoords[1] = lightPos - halfWidth - halfHeight;\n rectCoords[2] = lightPos - halfWidth + halfHeight;\n rectCoords[3] = lightPos + halfWidth + halfHeight;\n }\n vec2 LTC_Uv(const in vec3 N, const in vec3 V, const in float roughness) {\n const float LUT_SIZE = 64.0; \n const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;\n const float LUT_BIAS = 0.5 / LUT_SIZE;\n float dotNV = saturate(dot(N, V));\n vec2 uv = vec2(roughness, sqrt(1.0 - dotNV));\n uv = uv * LUT_SCALE + LUT_BIAS;\n return uv;\n }\n vec3 LTC_EdgeVectorFormFactor(const in vec3 v1, const in vec3 v2) {\n float x = dot(v1, v2);\n float y = abs(x);\n float a = 0.8543985 + (0.4965155 + 0.0145206 * y) * y;\n float b = 3.4175940 + (4.1616724 + y) * y;\n float v = a / b;\n float theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt(max(1.0 - x * x, 1e-7)) - v;\n return cross(v1, v2) * theta_sintheta;\n }\n float LTC_ClippedSphereFormFactor(const in vec3 f) {\n float l = length(f);\n return max((l * l + f.z) / (l + 1.0), 0.0);\n }\n vec3 LTC_Evaluate(const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[4]) {\n vec3 v1 = rectCoords[1] - rectCoords[0];\n vec3 v2 = rectCoords[3] - rectCoords[0];\n vec3 lightNormal = cross(v1, v2);\n if(dot(lightNormal, P - rectCoords[0]) < 0.0) return vec3(0.0);\n vec3 T1, T2;\n T1 = normalize(V - N * dot(V, N));\n T2 = - cross(N, T1);\n mat3 mat = mInv * mat3(\n T1.x, T2.x, N.x,\n T1.y, T2.y, N.y,\n T1.z, T2.z, N.z\n );\n vec3 coords[4];\n coords[0] = mat * (rectCoords[0] - P);\n coords[1] = mat * (rectCoords[1] - P);\n coords[2] = mat * (rectCoords[2] - P);\n coords[3] = mat * (rectCoords[3] - P);\n coords[0] = normalize(coords[0]);\n coords[1] = normalize(coords[1]);\n coords[2] = normalize(coords[2]);\n coords[3] = normalize(coords[3]);\n vec3 vectorFormFactor = vec3(0.0);\n vectorFormFactor += LTC_EdgeVectorFormFactor(coords[0], coords[1]);\n vectorFormFactor += LTC_EdgeVectorFormFactor(coords[1], coords[2]);\n vectorFormFactor += LTC_EdgeVectorFormFactor(coords[2], coords[3]);\n vectorFormFactor += LTC_EdgeVectorFormFactor(coords[3], coords[0]);\n float result = LTC_ClippedSphereFormFactor(vectorFormFactor);\n return vec3(result);\n }\n vec3 LTC_Diffuse(const in vec3 diffuseColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4]) {\n return diffuseColor * LTC_Evaluate(N, V, P, mat3(1.0), rectCoords);\n }\n vec3 LTC_Specular(const in vec3 specularColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4], const in float roughness) {\n vec2 ltc_uv = LTC_Uv(N, V, roughness);\n vec4 t1 = texture2D(ltc_1, ltc_uv);\n vec4 t2 = texture2D(ltc_2, ltc_uv);\n mat3 mInv = mat3(\n vec3(t1.x, 0, t1.y),\n vec3(0, 1, 0),\n vec3(t1.z, 0, t1.w)\n );\n vec3 fresnel = (specularColor * t2.x + (vec3(1.0) - specularColor) * t2.y);\n return fresnel * LTC_Evaluate(N, V, P, mInv, rectCoords);\n }\n#endif\n#if defined(USE_PBR) && defined(USE_ENV_MAP)\n vec3 getLightProbeIndirectIrradiance(const in int maxMIPLevel, const in vec3 N) {\n vec3 coordVec = vec3(envMapParams.z * N.x, N.yz);\n \t#ifdef TEXTURE_LOD_EXT\n \t\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, float(maxMIPLevel));\n \t#else\n \t\tvec4 envMapColor = textureCube(envMap, coordVec, float(maxMIPLevel));\n \t#endif\n envMapColor = envMapTexelToLinear(envMapColor);\n return PI * envMapColor.rgb * envMapParams.x;\n }\n float getSpecularMIPLevel(const in float roughness, const in int maxMIPLevel) {\n \tfloat maxMIPLevelScalar = float(maxMIPLevel);\n float sigma = PI * roughness * roughness / (1.0 + roughness);\n float desiredMIPLevel = maxMIPLevelScalar + log2(sigma);\n \treturn clamp(desiredMIPLevel, 0.0, maxMIPLevelScalar);\n }\n vec3 getLightProbeIndirectRadiance(const in float roughness, const in int maxMIPLevel, const in vec3 normal, const in vec3 envDir) {\n float specularMIPLevel = getSpecularMIPLevel(roughness, maxMIPLevel);\n vec3 coordVec = normalize(mix(envDir, normal, roughness * roughness));\n coordVec.x *= envMapParams.z;\n #ifdef TEXTURE_LOD_EXT\n \t\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, specularMIPLevel);\n \t#else\n \t\tvec4 envMapColor = textureCube(envMap, coordVec, specularMIPLevel);\n \t#endif\n envMapColor = envMapTexelToLinear(envMapColor);\n return envMapColor.rgb * envMapParams.y;\n }\n float computeSpecularOcclusion(const in float dotNV, const in float ambientOcclusion, const in float roughness) {\n \treturn saturate(pow(dotNV + ambientOcclusion, exp2(-16.0 * roughness - 1.0)) - 1.0 + ambientOcclusion);\n }\n#endif\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n vec3 shGetIrradianceAt(in vec3 normal, in vec3 shCoefficients[9]) {\n float x = normal.x, y = normal.y, z = normal.z;\n vec3 result = shCoefficients[0] * 0.886227;\n result += shCoefficients[1] * 2.0 * 0.511664 * y;\n result += shCoefficients[2] * 2.0 * 0.511664 * z;\n result += shCoefficients[3] * 2.0 * 0.511664 * x;\n result += shCoefficients[4] * 2.0 * 0.429043 * x * y;\n result += shCoefficients[5] * 2.0 * 0.429043 * y * z;\n result += shCoefficients[6] * (0.743125 * z * z - 0.247708);\n result += shCoefficients[7] * 2.0 * 0.429043 * x * z;\n result += shCoefficients[8] * 0.429043 * (x * x - y * y);\n return result;\n }\n vec3 getLightProbeIrradiance(const in vec3 lightProbe[9], const in vec3 normal) {\n vec3 irradiance = shGetIrradianceAt(normal, lightProbe);\n return irradiance;\n }\n#endif\n#ifdef USE_CLUSTERED_LIGHTS\n uniform vec3 cells;\n uniform int maxLightsPerCell;\n uniform vec3 cellsDotData;\n uniform vec3 cellsTextureSize;\n uniform vec4 cellsTransformFactors;\n uniform sampler2D cellsTexture;\n uniform sampler2D lightsTexture;\n struct ClusteredPointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n struct ClusteredSpotLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n vec3 direction;\n float coneCos;\n float penumbraCos;\n };\n void getPointLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredPointLight pointLight) {\n vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\n vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\n pointLight.color = lightData1.xyz;\n pointLight.decay = lightData1.w;\n pointLight.position = lightData2.xyz;\n pointLight.distance = lightData2.w;\n }\n void getSpotLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredSpotLight spotLight) {\n vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\n vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\n vec4 lightData3 = texelFetch(lightsTexture, lightDataCoords + ivec2(3, 0), 0);\n spotLight.color = lightData1.xyz;\n spotLight.decay = lightData1.w;\n spotLight.position = lightData2.xyz;\n spotLight.distance = lightData2.w;\n spotLight.direction = lightData3.xyz;\n spotLight.coneCos = lightData3.w;\n spotLight.penumbraCos = lightData0.y;\n }\n#endif"; var alphamap_pars_frag = "#ifdef USE_ALPHA_MAP\n\tuniform sampler2D alphaMap;\n\tvarying vec2 vAlphaMapUV;\n#endif"; var alphamap_frag = "#ifdef USE_ALPHA_MAP\n\toutColor.a *= texture2D(alphaMap, vAlphaMapUV).g;\n#endif"; var alphamap_pars_vert = "#ifdef USE_ALPHA_MAP\n uniform mat3 alphaMapUVTransform;\n\tvarying vec2 vAlphaMapUV;\n#endif"; var alphamap_vert = "#ifdef USE_ALPHA_MAP\n\tvAlphaMapUV = (alphaMapUVTransform * vec3(ALPHAMAP_UV, 1.)).xy;\n#endif"; var normalMap_pars_frag = "#ifdef USE_NORMAL_MAP\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n#endif\n#if defined(USE_NORMAL_MAP) || defined(USE_CLEARCOAT_NORMALMAP)\n #if defined(USE_TANGENT) && !defined(FLAT_SHADED)\n #define USE_TBN\n #else\n #include \n #endif\n#endif"; var normal_frag = "\n#ifdef FLAT_SHADED\n vec3 fdx = dFdx(v_modelPos);\n vec3 fdy = dFdy(v_modelPos);\n vec3 N = normalize(cross(fdx, fdy));\n#else\n vec3 N = normalize(v_Normal);\n #ifdef DOUBLE_SIDED\n N = N * (float(gl_FrontFacing) * 2.0 - 1.0);\n #endif\n#endif\n#ifdef USE_TBN\n\tvec3 tangent = normalize(v_Tangent);\n\tvec3 bitangent = normalize(v_Bitangent);\n\t#ifdef DOUBLE_SIDED\n\t\ttangent = tangent * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\tbitangent = bitangent * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t#endif\n\tmat3 tspace = mat3(tangent, bitangent, N);\n#endif\nvec3 geometryNormal = N;\n#ifdef USE_NORMAL_MAP\n vec3 mapN = texture2D(normalMap, v_Uv).rgb * 2.0 - 1.0;\n mapN.xy *= normalScale;\n #ifdef USE_TBN\n N = normalize(tspace * mapN);\n #else\n mapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\n N = normalize(tsn(N, v_modelPos, v_Uv) * mapN);\n #endif\n#elif defined(USE_BUMPMAP)\n N = perturbNormalArb(v_modelPos, N, dHdxy_fwd(v_Uv));\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D(clearcoatNormalMap, v_Uv).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TBN\n\t\tclearcoatNormal = normalize(tspace * clearcoatMapN);\n\t#else\n\t\tclearcoatMapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\tclearcoatNormal = normalize(tsn(clearcoatNormal, v_modelPos, v_Uv) * clearcoatMapN);\n\t#endif\n#endif"; var normal_pars_frag = "#ifndef FLAT_SHADED\n varying vec3 v_Normal;\n #ifdef USE_TANGENT\n varying vec3 v_Tangent;\n\t\tvarying vec3 v_Bitangent;\n #endif\n#endif"; var normal_pars_vert = "#ifndef FLAT_SHADED\n varying vec3 v_Normal;\n #ifdef USE_TANGENT\n varying vec3 v_Tangent;\n\t\tvarying vec3 v_Bitangent;\n #endif\n#endif"; var normal_vert = "#ifndef FLAT_SHADED\n v_Normal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n #ifdef FLIP_SIDED\n \tv_Normal = - v_Normal;\n #endif\n #ifdef USE_TANGENT\n v_Tangent = (transposeMat4(inverseMat4(u_Model)) * vec4(objectTangent, 0.0)).xyz;\n #ifdef FLIP_SIDED\n v_Tangent = - v_Tangent;\n #endif\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * a_Tangent.w);\n #endif\n#endif"; var packing = "const float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n vec4 r = vec4( fract( v * PackFactors ), v );\n r.yzw -= r.xyz * ShiftRight8; return r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n return dot( v, UnpackFactors );\n}"; var premultipliedAlpha_frag = "#ifdef USE_PREMULTIPLIED_ALPHA\n gl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a;\n#endif"; var pvm_vert = "vec4 worldPosition = u_Model * vec4(transformed, 1.0);\ngl_Position = u_ProjectionView * worldPosition;"; var dithering_frag = "#if defined( DITHERING )\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; var dithering_pars_frag = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif"; var shadow = "#ifdef USE_SHADOW_SAMPLER\n float computeShadow(sampler2DShadow shadowMap, vec3 shadowCoord) {\n return texture2D( shadowMap, shadowCoord );\n }\n#else\n float computeShadow(sampler2D shadowMap, vec3 shadowCoord) {\n return step(shadowCoord.z, unpackRGBAToDepth(texture2D(shadowMap, shadowCoord.xy)));\n }\n#endif\n#ifdef USE_POISSON_SOFT_SHADOW\n float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n float texelSize = shadowParams.x * 0.5 * shadowMapSizeAndInverse.y;\n vec3 poissonDisk[4];\n poissonDisk[0] = vec3(-0.94201624, -0.39906216, 0);\n poissonDisk[1] = vec3(0.94558609, -0.76890725, 0);\n poissonDisk[2] = vec3(-0.094184101, -0.92938870, 0);\n poissonDisk[3] = vec3(0.34495938, 0.29387760, 0);\n return computeShadow(shadowMap, shadowCoord + poissonDisk[0] * texelSize) * 0.25 +\n computeShadow(shadowMap, shadowCoord + poissonDisk[1] * texelSize) * 0.25 +\n computeShadow(shadowMap, shadowCoord + poissonDisk[2] * texelSize) * 0.25 +\n computeShadow(shadowMap, shadowCoord + poissonDisk[3] * texelSize) * 0.25;\n }\n#elif defined(USE_VOGEL5_SOFT_SHADOW)\n float interleavedGradientNoise(vec2 position) {\n return fract(52.9829189 * fract(dot(position, vec2(0.06711056, 0.00583715))));\n }\n vec2 vogelDiskSample(int sampleIndex, int samplesCount, float phi) {\n const float goldenAngle = 2.399963229728653;\n float r = sqrt((float(sampleIndex) + 0.5) / float(samplesCount));\n float theta = float(sampleIndex) * goldenAngle + phi;\n return vec2(cos(theta), sin(theta)) * r;\n }\n float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n float radius = shadowParams.x * shadowMapSizeAndInverse.y;\n float phi = interleavedGradientNoise(gl_FragCoord.xy) * 6.28318530718;\n float shadow = 0.0;\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(0, 5, phi) * radius, shadowCoord.z));\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(1, 5, phi) * radius, shadowCoord.z));\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(2, 5, phi) * radius, shadowCoord.z));\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(3, 5, phi) * radius, shadowCoord.z));\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(4, 5, phi) * radius, shadowCoord.z));\n return shadow * 0.2;\n }\n#elif defined(USE_PCF3_SOFT_SHADOW)\n float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x; uv += 0.5; vec2 st = fract(uv); vec2 base_uv = floor(uv) - 0.5; base_uv *= shadowMapSizeAndInverse.y;\n vec2 uvw0 = 3. - 2. * st;\n vec2 uvw1 = 1. + 2. * st;\n vec2 u = vec2((2. - st.x) / uvw0.x - 1., st.x / uvw1.x + 1.) * shadowMapSizeAndInverse.y;\n vec2 v = vec2((2. - st.y) / uvw0.y - 1., st.y / uvw1.y + 1.) * shadowMapSizeAndInverse.y;\n float shadow = 0.;\n shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\n shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\n shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\n shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\n shadow = shadow / 16.;\n return shadow;\n }\n#elif defined(USE_PCF5_SOFT_SHADOW)\n float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x; uv += 0.5; vec2 st = fract(uv); vec2 base_uv = floor(uv) - 0.5; base_uv *= shadowMapSizeAndInverse.y;\n vec2 uvw0 = 4. - 3. * st;\n vec2 uvw1 = vec2(7.);\n vec2 uvw2 = 1. + 3. * st;\n vec3 u = vec3((3. - 2. * st.x) / uvw0.x - 2., (3. + st.x) / uvw1.x, st.x / uvw2.x + 2.) * shadowMapSizeAndInverse.y;\n vec3 v = vec3((3. - 2. * st.y) / uvw0.y - 2., (3. + st.y) / uvw1.y, st.y / uvw2.y + 2.) * shadowMapSizeAndInverse.y;\n float shadow = 0.;\n shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\n shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\n shadow += uvw2.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[0]), shadowCoord.z));\n shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\n shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\n shadow += uvw2.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[1]), shadowCoord.z));\n shadow += uvw0.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[2]), shadowCoord.z));\n shadow += uvw1.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[2]), shadowCoord.z));\n shadow += uvw2.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[2]), shadowCoord.z));\n shadow = shadow / 144.;\n return shadow;\n }\n#else\n float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n return computeShadow(shadowSampler, shadowCoord);\n }\n#endif\nfloat computeFallOff(float value, vec2 clipSpace, float frustumEdgeFalloff) {\n float factor = mix(clipSpace.y * abs(clipSpace.y), dot(clipSpace, clipSpace), step(0., frustumEdgeFalloff));\n float mask = smoothstep(1.0 - abs(frustumEdgeFalloff), 1.00000012, clamp(factor, 0., 1.));\n return mix(value, 1.0, mask);\n}\nfloat getShadow(sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias.x;\n bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\n bool inFrustum = all(inFrustumVec);\n bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\n bool frustumTest = all(frustumTestVec);\n float shadow = 1.0;\n if (frustumTest) {\n vec2 shadowMapSizeAndInverse = vec2(shadowMapSize.x, 1. / shadowMapSize.x);\n shadow = computeShadowWithPCF(shadowMap, shadowCoord.xyz, shadowMapSizeAndInverse, shadowParams);\n shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\n }\n return shadow;\n}\nfloat textureCubeCompare(samplerCube depths, vec3 uv, float compare) {\n return step(compare, unpackRGBAToDepth(textureCube(depths, uv)));\n}\nfloat getPointShadow(samplerCube shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams, vec2 shadowCameraRange) {\n float shadow = 1.0;\n vec3 lightToPosition = shadowCoord.xyz;\n float lightToPositionLength = length(lightToPosition);\n if (lightToPositionLength - shadowCameraRange.y <= 0.0 && lightToPositionLength - shadowCameraRange.x >= 0.0) {\n float dp = (lightToPositionLength - shadowCameraRange.x) / (shadowCameraRange.y - shadowCameraRange.x);\n dp += shadowBias.x;\n\t\tvec3 bd3D = normalize(lightToPosition);\n #ifdef USE_HARD_SHADOW\n shadow = textureCubeCompare(shadowMap, bd3D, dp);\n #else\n float texelSize = shadowParams.x * 0.5 / shadowMapSize.x;\n vec2 offset = vec2(-1.0, 1.0) * texelSize;\n shadow = (\n textureCubeCompare(shadowMap, bd3D + offset.xyy, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.yyy, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.xyx, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.yyx, dp) +\n textureCubeCompare(shadowMap, bd3D, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.xxy, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.yxy, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.xxx, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.yxx, dp)\n ) * (1.0 / 9.0);\n #endif\n }\n return shadow;\n}\n#ifdef USE_PCSS_SOFT_SHADOW\n const vec3 PoissonSamplers32[64] = vec3[64](\n vec3(0.06407013, 0.05409927, 0.),\n vec3(0.7366577, 0.5789394, 0.),\n vec3(-0.6270542, -0.5320278, 0.),\n vec3(-0.4096107, 0.8411095, 0.),\n vec3(0.6849564, -0.4990818, 0.),\n vec3(-0.874181, -0.04579735, 0.),\n vec3(0.9989998, 0.0009880066, 0.),\n vec3(-0.004920578, -0.9151649, 0.),\n vec3(0.1805763, 0.9747483, 0.),\n vec3(-0.2138451, 0.2635818, 0.),\n vec3(0.109845, 0.3884785, 0.),\n vec3(0.06876755, -0.3581074, 0.),\n vec3(0.374073, -0.7661266, 0.),\n vec3(0.3079132, -0.1216763, 0.),\n vec3(-0.3794335, -0.8271583, 0.),\n vec3(-0.203878, -0.07715034, 0.),\n vec3(0.5912697, 0.1469799, 0.),\n vec3(-0.88069, 0.3031784, 0.),\n vec3(0.5040108, 0.8283722, 0.),\n vec3(-0.5844124, 0.5494877, 0.),\n vec3(0.6017799, -0.1726654, 0.),\n vec3(-0.5554981, 0.1559997, 0.),\n vec3(-0.3016369, -0.3900928, 0.),\n vec3(-0.5550632, -0.1723762, 0.),\n vec3(0.925029, 0.2995041, 0.),\n vec3(-0.2473137, 0.5538505, 0.),\n vec3(0.9183037, -0.2862392, 0.),\n vec3(0.2469421, 0.6718712, 0.),\n vec3(0.3916397, -0.4328209, 0.),\n vec3(-0.03576927, -0.6220032, 0.),\n vec3(-0.04661255, 0.7995201, 0.),\n vec3(0.4402924, 0.3640312, 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.)\n );\n const vec3 PoissonSamplers64[64] = vec3[64](\n vec3(-0.613392, 0.617481, 0.),\n vec3(0.170019, -0.040254, 0.),\n vec3(-0.299417, 0.791925, 0.),\n vec3(0.645680, 0.493210, 0.),\n vec3(-0.651784, 0.717887, 0.),\n vec3(0.421003, 0.027070, 0.),\n vec3(-0.817194, -0.271096, 0.),\n vec3(-0.705374, -0.668203, 0.),\n vec3(0.977050, -0.108615, 0.),\n vec3(0.063326, 0.142369, 0.),\n vec3(0.203528, 0.214331, 0.),\n vec3(-0.667531, 0.326090, 0.),\n vec3(-0.098422, -0.295755, 0.),\n vec3(-0.885922, 0.215369, 0.),\n vec3(0.566637, 0.605213, 0.),\n vec3(0.039766, -0.396100, 0.),\n vec3(0.751946, 0.453352, 0.),\n vec3(0.078707, -0.715323, 0.),\n vec3(-0.075838, -0.529344, 0.),\n vec3(0.724479, -0.580798, 0.),\n vec3(0.222999, -0.215125, 0.),\n vec3(-0.467574, -0.405438, 0.),\n vec3(-0.248268, -0.814753, 0.),\n vec3(0.354411, -0.887570, 0.),\n vec3(0.175817, 0.382366, 0.),\n vec3(0.487472, -0.063082, 0.),\n vec3(-0.084078, 0.898312, 0.),\n vec3(0.488876, -0.783441, 0.),\n vec3(0.470016, 0.217933, 0.),\n vec3(-0.696890, -0.549791, 0.),\n vec3(-0.149693, 0.605762, 0.),\n vec3(0.034211, 0.979980, 0.),\n vec3(0.503098, -0.308878, 0.),\n vec3(-0.016205, -0.872921, 0.),\n vec3(0.385784, -0.393902, 0.),\n vec3(-0.146886, -0.859249, 0.),\n vec3(0.643361, 0.164098, 0.),\n vec3(0.634388, -0.049471, 0.),\n vec3(-0.688894, 0.007843, 0.),\n vec3(0.464034, -0.188818, 0.),\n vec3(-0.440840, 0.137486, 0.),\n vec3(0.364483, 0.511704, 0.),\n vec3(0.034028, 0.325968, 0.),\n vec3(0.099094, -0.308023, 0.),\n vec3(0.693960, -0.366253, 0.),\n vec3(0.678884, -0.204688, 0.),\n vec3(0.001801, 0.780328, 0.),\n vec3(0.145177, -0.898984, 0.),\n vec3(0.062655, -0.611866, 0.),\n vec3(0.315226, -0.604297, 0.),\n vec3(-0.780145, 0.486251, 0.),\n vec3(-0.371868, 0.882138, 0.),\n vec3(0.200476, 0.494430, 0.),\n vec3(-0.494552, -0.711051, 0.),\n vec3(0.612476, 0.705252, 0.),\n vec3(-0.578845, -0.768792, 0.),\n vec3(-0.772454, -0.090976, 0.),\n vec3(0.504440, 0.372295, 0.),\n vec3(0.155736, 0.065157, 0.),\n vec3(0.391522, 0.849605, 0.),\n vec3(-0.620106, -0.328104, 0.),\n vec3(0.789239, -0.419965, 0.),\n vec3(-0.545396, 0.538133, 0.),\n vec3(-0.178564, -0.596057, 0.)\n );\n float getRand(vec2 seed) {\n return fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) * 43758.5453);\n }\n float computeShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowSampler, vec3 shadowCoord, float shadowMapSizeInverse, float lightSizeUV, int searchTapCount, int pcfTapCount, vec3[64] poissonSamplers) {\n float depthMetric = shadowCoord.z;\n float blockerDepth = 0.0;\n float sumBlockerDepth = 0.0;\n float numBlocker = 0.0;\n for (int i = 0; i < searchTapCount; i++) {\n blockerDepth = unpackRGBAToDepth(texture(depthSampler, shadowCoord.xy + (lightSizeUV * shadowMapSizeInverse * PoissonSamplers32[i].xy)));\n if (blockerDepth < depthMetric) {\n sumBlockerDepth += blockerDepth;\n numBlocker++;\n }\n }\n if (numBlocker < 1.0) {\n return 1.0;\n }\n float avgBlockerDepth = sumBlockerDepth / numBlocker;\n float AAOffset = shadowMapSizeInverse * 10.;\n float penumbraRatio = ((depthMetric - avgBlockerDepth) + AAOffset);\n float filterRadius = penumbraRatio * lightSizeUV * shadowMapSizeInverse;\n float random = getRand(shadowCoord.xy); float rotationAngle = random * 3.1415926;\n vec2 rotationVector = vec2(cos(rotationAngle), sin(rotationAngle));\n float shadow = 0.;\n for (int i = 0; i < pcfTapCount; i++) {\n vec3 offset = poissonSamplers[i];\n offset = vec3(offset.x * rotationVector.x - offset.y * rotationVector.y, offset.y * rotationVector.x + offset.x * rotationVector.y, 0.);\n shadow += texture(shadowSampler, shadowCoord + offset * filterRadius);\n }\n shadow /= float(pcfTapCount);\n shadow = mix(shadow, 1., depthMetric - avgBlockerDepth);\n return shadow;\n }\n float getShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias.x;\n bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\n bool inFrustum = all(inFrustumVec);\n bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\n bool frustumTest = all(frustumTestVec);\n float shadow = 1.0;\n if (frustumTest) {\n #ifdef USE_PCSS16_SOFT_SHADOW\n shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 16, PoissonSamplers32);\n #else\n #ifdef USE_PCSS32_SOFT_SHADOW\n shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 32, PoissonSamplers32);\n #else\n shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 32, 64, PoissonSamplers64);\n #endif\n #endif\n shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\n }\n return shadow;\n }\n#endif"; var shadowMap_frag = "#ifdef USE_SHADOW\n#endif"; var shadowMap_pars_frag = "#ifdef USE_SHADOW\n\t#if NUM_DIR_SHADOWS > 0\n\t\tuniform sampler2DShadow directionalShadowMap[NUM_DIR_SHADOWS];\n\t\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\n\t\t#ifdef USE_PCSS_SOFT_SHADOW\n\t\t\tuniform sampler2D directionalDepthMap[NUM_DIR_SHADOWS];\n\t\t#endif\n\t\tstruct DirectLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\n\t#endif\n\t#if NUM_POINT_SHADOWS > 0\n\t\tuniform samplerCube pointShadowMap[NUM_POINT_SHADOWS];\n\t\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\n\t\tstruct PointLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t\tvec2 shadowCameraRange;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\n\t#endif\n\t#if NUM_SPOT_SHADOWS > 0\n\t\tuniform sampler2DShadow spotShadowMap[NUM_SPOT_SHADOWS];\n\t\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\n\t\t#ifdef USE_PCSS_SOFT_SHADOW\n\t\t\tuniform sampler2D spotDepthMap[NUM_SPOT_SHADOWS];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\n\t#endif\n\t#include \n\t#include \n#endif"; var shadowMap_pars_vert = "#ifdef USE_SHADOW\n\t#if NUM_DIR_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[NUM_DIR_SHADOWS];\n\t\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\n\t\tstruct DirectLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\n\t#endif\n\t#if NUM_POINT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[NUM_POINT_SHADOWS];\n\t\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\n\t\tstruct PointLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t\tvec2 shadowCameraRange;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\n\t#endif\n\t#if NUM_SPOT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[NUM_SPOT_SHADOWS];\n\t\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\n\t\tstruct SpotLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\n\t#endif\n#endif"; var shadowMap_vert = "\n#ifdef USE_SHADOW\n\tvec3 shadowWorldNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n\tshadowWorldNormal = normalize(shadowWorldNormal);\n\t#ifdef FLIP_SIDED\n\t\tshadowWorldNormal = -shadowWorldNormal;\n\t#endif\n\tvec4 shadowWorldPosition;\n\t#if NUM_DIR_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_DIR_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_DirectionalShadow[i].shadowBias[1], 0);\n\t\t\tvDirectionalShadowCoord[i] = directionalShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_POINT_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_PointShadow[i].shadowBias[1], 0);\n\t\t\tvPointShadowCoord[i] = pointShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_SPOT_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_SpotShadow[i].shadowBias[1], 0);\n\t\t\tvSpotShadowCoord[i] = spotShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif"; var morphnormal_vert = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif"; var morphtarget_pars_vert = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif"; var morphtarget_vert = "#ifdef USE_MORPHTARGETS\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n transformed += morphTarget4 * morphTargetInfluences[ 4 ];\n transformed += morphTarget5 * morphTargetInfluences[ 5 ];\n transformed += morphTarget6 * morphTargetInfluences[ 6 ];\n transformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif"; var skinning_pars_vert = "#ifdef USE_SKINNING\n attribute vec4 skinIndex;\n\tattribute vec4 skinWeight;\n uniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n #ifdef BONE_TEXTURE\n uniform sampler2D boneTexture;\n uniform int boneTextureSize;\n mat4 getBoneMatrix( const in float i ) {\n float j = i * 4.0;\n float x = mod( j, float( boneTextureSize ) );\n float y = floor( j / float( boneTextureSize ) );\n float dx = 1.0 / float( boneTextureSize );\n float dy = 1.0 / float( boneTextureSize );\n y = dy * ( y + 0.5 );\n vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n mat4 bone = mat4( v1, v2, v3, v4 );\n return bone;\n }\n #else\n uniform mat4 boneMatrices[MAX_BONES];\n mat4 getBoneMatrix(const in float i) {\n mat4 bone = boneMatrices[int(i)];\n return bone;\n }\n #endif\n#endif"; var skinning_vert = "#ifdef USE_SKINNING\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n vec4 skinVertex = bindMatrix * vec4(transformed, 1.0);\n vec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n transformed = skinned.xyz / skinned.w;\n#endif"; var skinnormal_vert = "#ifdef USE_SKINNING\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n #ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif"; var specularMap_frag = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, v_Uv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; var specularMap_pars_frag = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; var transpose = "mat4 transposeMat4(mat4 inMatrix) {\n vec4 i0 = inMatrix[0];\n vec4 i1 = inMatrix[1];\n vec4 i2 = inMatrix[2];\n vec4 i3 = inMatrix[3];\n mat4 outMatrix = mat4(\n vec4(i0.x, i1.x, i2.x, i3.x),\n vec4(i0.y, i1.y, i2.y, i3.y),\n vec4(i0.z, i1.z, i2.z, i3.z),\n vec4(i0.w, i1.w, i2.w, i3.w)\n );\n return outMatrix;\n}"; var tsn = "mat3 tsn(vec3 N, vec3 V, vec2 uv) {\n vec3 q0 = dFdx(V.xyz);\n vec3 q1 = dFdy(V.xyz);\n vec2 st0 = dFdx(uv.xy);\n vec2 st1 = dFdy(uv.xy);\n float scale = sign(st1.y * st0.x - st0.y * st1.x);\n vec3 S = normalize((q0 * st1.y - q1 * st0.y) * scale);\n vec3 T = normalize((-q0 * st1.x + q1 * st0.x) * scale);\n return mat3(S, T, N);\n}"; var uv_pars_frag = "#ifdef USE_UV1\n varying vec2 v_Uv;\n#endif"; var uv_pars_vert = "#if defined(USE_UV) || defined(USE_UV1)\n uniform mat3 uvTransform;\n#endif\n#ifdef USE_UV1\n attribute vec2 a_Uv;\n varying vec2 v_Uv;\n#endif"; var uv_vert = "#ifdef USE_UV1\n v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\n#endif"; var modelPos_pars_frag = "varying vec3 v_modelPos;"; var modelPos_pars_vert = "varying vec3 v_modelPos;"; var modelPos_vert = "\nv_modelPos = worldPosition.xyz;"; var logdepthbuf_frag = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; var logdepthbuf_pars_frag = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif"; var logdepthbuf_pars_vert = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tuniform float logDepthCameraNear;\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t\tuniform float logDepthCameraNear;\n\t#endif\n#endif"; var logdepthbuf_vert = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w - logDepthCameraNear;\n\t\tvIsPerspective = float( isPerspectiveMatrix( u_Projection ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( u_Projection ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w - logDepthCameraNear + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif"; var clearcoat_pars_frag = "#ifdef USE_CLEARCOAT\n\tuniform float u_Clearcoat;\n\tuniform float u_ClearcoatRoughness;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif"; const ShaderChunk = { alphaTest_frag: alphaTest_frag, alphaTest_pars_frag: alphaTest_pars_frag, aoMap_pars_frag: aoMap_pars_frag, aoMap_pars_vert: aoMap_pars_vert, aoMap_vert: aoMap_vert, aoMap_frag: aoMap_frag, begin_frag: begin_frag, begin_vert: begin_vert, bsdfs: bsdfs, bumpMap_pars_frag: bumpMap_pars_frag, clippingPlanes_frag: clippingPlanes_frag, clippingPlanes_pars_frag: clippingPlanes_pars_frag, color_frag: color_frag, color_pars_frag: color_pars_frag, color_pars_vert: color_pars_vert, color_vert: color_vert, common_frag: common_frag, common_vert: common_vert, diffuseMap_frag: diffuseMap_frag, diffuseMap_pars_frag: diffuseMap_pars_frag, diffuseMap_vert: diffuseMap_vert, diffuseMap_pars_vert: diffuseMap_pars_vert, emissiveMap_frag: emissiveMap_frag, emissiveMap_pars_frag: emissiveMap_pars_frag, emissiveMap_vert: emissiveMap_vert, emissiveMap_pars_vert: emissiveMap_pars_vert, encodings_frag: encodings_frag, encodings_pars_frag: encodings_pars_frag, end_frag: end_frag, envMap_frag: envMap_frag, envMap_pars_frag: envMap_pars_frag, envMap_pars_vert: envMap_pars_vert, envMap_vert: envMap_vert, fog_frag: fog_frag, fog_pars_frag: fog_pars_frag, inverse: inverse, light_frag: light_frag, light_pars_frag: light_pars_frag, alphamap_pars_frag: alphamap_pars_frag, alphamap_frag: alphamap_frag, alphamap_pars_vert: alphamap_pars_vert, alphamap_vert: alphamap_vert, normalMap_pars_frag: normalMap_pars_frag, normal_frag: normal_frag, normal_pars_frag: normal_pars_frag, normal_pars_vert: normal_pars_vert, normal_vert: normal_vert, packing: packing, premultipliedAlpha_frag: premultipliedAlpha_frag, pvm_vert: pvm_vert, dithering_frag: dithering_frag, dithering_pars_frag: dithering_pars_frag, shadow: shadow, shadowMap_frag: shadowMap_frag, shadowMap_pars_frag: shadowMap_pars_frag, shadowMap_pars_vert: shadowMap_pars_vert, shadowMap_vert: shadowMap_vert, morphnormal_vert: morphnormal_vert, morphtarget_pars_vert: morphtarget_pars_vert, morphtarget_vert: morphtarget_vert, skinning_pars_vert: skinning_pars_vert, skinning_vert: skinning_vert, skinnormal_vert: skinnormal_vert, specularMap_frag: specularMap_frag, specularMap_pars_frag: specularMap_pars_frag, transpose: transpose, tsn: tsn, uv_pars_frag: uv_pars_frag, uv_pars_vert: uv_pars_vert, uv_vert: uv_vert, modelPos_pars_frag: modelPos_pars_frag, modelPos_pars_vert: modelPos_pars_vert, modelPos_vert: modelPos_vert, logdepthbuf_frag: logdepthbuf_frag, logdepthbuf_pars_frag: logdepthbuf_pars_frag, logdepthbuf_pars_vert: logdepthbuf_pars_vert, logdepthbuf_vert: logdepthbuf_vert, clearcoat_pars_frag: clearcoat_pars_frag }; var basic_frag = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n #include \n #include \n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n reflectedLight.indirectDiffuse += vec3(1.0);\n #include \n reflectedLight.indirectDiffuse *= outColor.xyz;\n outColor.xyz = reflectedLight.indirectDiffuse;\n #if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n}"; var basic_vert = "#include \n#include \n#include \n#include \n#include \n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n #include \n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #ifdef USE_ENV_MAP\n #include \n #include \n #ifndef USE_VERTEX_ENVDIR\n #include \n #endif \n #endif\n #include \n #include \n #include \n}"; var depth_frag = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n vec4 texelColor = texture2D( diffuseMap, v_Uv );\n float alpha = texelColor.a * u_Opacity;\n if(alpha < u_AlphaTest) discard;\n #endif\n #include \n \n #ifdef DEPTH_PACKING_RGBA\n gl_FragColor = packDepthToRGBA(gl_FragCoord.z);\n #else\n gl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), u_Opacity );\n #endif\n}"; var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var distance_frag = "#include \nuniform float nearDistance;\nuniform float farDistance;\n#include \n#include \n#include \nvoid main() {\n #include \n \n float dist = length( v_modelPos - u_CameraPosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n gl_FragColor = packDepthToRGBA(dist);\n}"; var distance_vert = "#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n}"; var lambert_frag = "#define USE_LAMBERT\n#include \n#include \nuniform vec3 emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n #include \n #include \n outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n #include \n #include \n vec3 totalEmissiveRadiance = emissive;\n #include \n outColor.xyz += totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n}"; var lambert_vert = "#define USE_LAMBERT\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var normaldepth_frag = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n vec4 texelColor = texture2D( diffuseMap, v_Uv );\n float alpha = texelColor.a * u_Opacity;\n if(alpha < u_AlphaTest) discard;\n #endif\n #include \n vec4 packedNormalDepth;\n packedNormalDepth.xyz = normalize(v_Normal) * 0.5 + 0.5;\n packedNormalDepth.w = gl_FragCoord.z;\n gl_FragColor = packedNormalDepth;\n}"; var normaldepth_vert = "#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var pbr_frag = "#define USE_PBR\n#include \n#include \nuniform float u_Metalness;\n#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif\nuniform float u_Roughness;\n#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif\nuniform vec3 emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n float roughnessFactor = u_Roughness;\n #ifdef USE_ROUGHNESSMAP\n \tvec4 texelRoughness = texture2D( roughnessMap, v_Uv );\n \troughnessFactor *= texelRoughness.g;\n #endif\n float metalnessFactor = u_Metalness;\n #ifdef USE_METALNESSMAP\n \tvec4 texelMetalness = texture2D( metalnessMap, v_Uv );\n \tmetalnessFactor *= texelMetalness.b;\n #endif\n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n #include \n #include \n outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n vec3 totalEmissiveRadiance = emissive;\n #include \n outColor.xyz += totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n}"; var pbr2_frag = "#define USE_PBR\n#define USE_PBR2\n#include \n#include \nuniform vec3 u_SpecularColor;\n#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif\nuniform float glossiness;\n#ifdef USE_GLOSSINESSMAP\n\tuniform sampler2D glossinessMap;\n#endif\nuniform vec3 emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 specularFactor = u_SpecularColor;\n #ifdef USE_SPECULARMAP\n vec4 texelSpecular = texture2D(specularMap, v_Uv);\n texelSpecular = sRGBToLinear(texelSpecular);\n specularFactor *= texelSpecular.rgb;\n #endif\n float glossinessFactor = glossiness;\n #ifdef USE_GLOSSINESSMAP\n vec4 texelGlossiness = texture2D(glossinessMap, v_Uv);\n glossinessFactor *= texelGlossiness.a;\n #endif\n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n #include \n #include \n outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n vec3 totalEmissiveRadiance = emissive;\n #include \n outColor.xyz += totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n}"; var pbr_vert = "#define USE_PBR\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var phong_frag = "#define USE_PHONG\n#include \n#include \nuniform float u_Specular;\nuniform vec3 u_SpecularColor;\n#include \nuniform vec3 emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n #include \n #include \n outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n #include \n vec3 totalEmissiveRadiance = emissive;\n #include \n outColor.xyz += totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n}"; var phong_vert = "#define USE_PHONG\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var point_frag = "#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #ifdef USE_DIFFUSE_MAP\n outColor *= texture2D(diffuseMap, vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y));\n #endif\n #include \n #include \n #include \n #include \n}"; var point_vert = "#include \n#include \n#include \nuniform float u_PointSize;\nuniform vec2 u_RenderTargetSize;\nvoid main() {\n #include \n #include \n #include \n vec4 mvPosition = u_View * u_Model * vec4(transformed, 1.0);\n #ifdef USE_SIZEATTENUATION\n gl_PointSize = u_PointSize * (u_RenderTargetSize.y * 0.5 / -mvPosition.z);\n #else\n gl_PointSize = u_PointSize;\n #endif\n #include \n}"; const ShaderLib = { basic_frag: basic_frag, basic_vert: basic_vert, depth_frag: depth_frag, depth_vert: depth_vert, distance_frag: distance_frag, distance_vert: distance_vert, lambert_frag: lambert_frag, lambert_vert: lambert_vert, normaldepth_frag: normaldepth_frag, normaldepth_vert: normaldepth_vert, pbr_frag: pbr_frag, pbr_vert: pbr_vert, pbr2_frag: pbr2_frag, pbr2_vert: pbr_vert, phong_frag: phong_frag, phong_vert: phong_vert, point_frag: point_frag, point_vert: point_vert }; class WebGLAttribute { constructor(gl, program, attributeData) { this.gl = gl; this.name = attributeData.name; this.type = attributeData.type; this.size = attributeData.size; this.location = gl.getAttribLocation(program, this.name); this.count = getAttributeCount(gl, this.type); this.format = getAttributeFormat(gl, this.type); this.locationSize = 1; if (this.type === gl.FLOAT_MAT2) this.locationSize = 2; if (this.type === gl.FLOAT_MAT3) this.locationSize = 3; if (this.type === gl.FLOAT_MAT4) this.locationSize = 4; } } function getAttributeCount(gl, type) { switch (type) { case gl.FLOAT: case gl.INT: case gl.UNSIGNED_INT: return 1; case gl.FLOAT_VEC2: case gl.INT_VEC2: return 2; case gl.FLOAT_VEC3: case gl.INT_VEC3: return 3; case gl.FLOAT_VEC4: case gl.INT_VEC4: return 4; case gl.FLOAT_MAT2: return 4; case gl.FLOAT_MAT3: return 9; case gl.FLOAT_MAT4: return 16; default: return 0; } } function getAttributeFormat(gl, type) { switch (type) { case gl.FLOAT: case gl.FLOAT_VEC2: case gl.FLOAT_VEC3: case gl.FLOAT_VEC4: case gl.FLOAT_MAT2: case gl.FLOAT_MAT3: case gl.FLOAT_MAT4: return gl.FLOAT; case gl.INT: case gl.INT_VEC2: case gl.INT_VEC3: case gl.INT_VEC4: return gl.INT; case gl.UNSIGNED_INT: return gl.UNSIGNED_INT; default: return gl.FLOAT; } } class WebGLCapabilities { constructor(gl) { this._gl = gl; this._extensions = {}; // webgl version this.version = parseFloat(/^WebGL (\d)/.exec(gl.getParameter(gl.VERSION))[1]); // texture filter anisotropic extension // this extension is available to both, WebGL1 and WebGL2 contexts. const anisotropyExt = this.getExtension('EXT_texture_filter_anisotropic'); this.anisotropyExt = anisotropyExt; this.maxAnisotropy = anisotropyExt !== null ? gl.getParameter(anisotropyExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1; // query extension let timerQuery = null, canUseTimestamp = false; try { if (this.version > 1) { timerQuery = this.getExtension('EXT_disjoint_timer_query_webgl2'); if (timerQuery) { canUseTimestamp = !!gl.getQuery(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT); } } else { timerQuery = this.getExtension('EXT_disjoint_timer_query'); if (timerQuery) { canUseTimestamp = !!timerQuery.getQueryEXT(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT); } } } catch (err) { console.warn(err); } this.timerQuery = timerQuery; this.canUseTimestamp = canUseTimestamp; // parallel_shader_compile this.parallelShaderCompileExt = this.getExtension('KHR_parallel_shader_compile'); // others this.maxPrecision = getMaxPrecision(gl, 'highp'); this.maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); this.maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS); this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); this.maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE); this.maxVertexUniformVectors = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS); this.maxSamples = this.version > 1 ? gl.getParameter(gl.MAX_SAMPLES) : 1; this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE); } getExtension(name) { const gl = this._gl; const extensions = this._extensions; if (extensions[name] !== undefined) { return extensions[name]; } let ext = null; for (const prefix of vendorPrefixes) { ext = gl.getExtension(prefix + name); if (ext) { break; } } extensions[name] = ext; return ext; } } const vendorPrefixes = ['', 'WEBKIT_', 'MOZ_']; function getMaxPrecision(gl, precision) { if (precision === 'highp') { if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) { return 'highp'; } precision = 'mediump'; } if (precision === 'mediump') { if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) { return 'mediump'; } } return 'lowp'; } // This class handles buffer creation and updating for geometries. class WebGLGeometries extends PropertyMap { constructor(prefix, gl, buffers, vertexArrayBindings) { super(prefix); this._gl = gl; this._buffers = buffers; this._vertexArrayBindings = vertexArrayBindings; const that = this; function onGeometryDispose(event) { const geometry = event.target; const geometryProperties = that.get(geometry); geometry.removeEventListener('dispose', onGeometryDispose); if (geometry.index !== null) { buffers.removeBuffer(geometry.index.buffer); } for (const name in geometry.attributes) { buffers.removeBuffer(geometry.attributes[name].buffer); } for (const name in geometry.morphAttributes) { const array = geometry.morphAttributes[name]; for (let i = 0, l = array.length; i < l; i++) { buffers.removeBuffer(array[i].buffer); } } vertexArrayBindings.releaseByGeometry(geometry); geometryProperties.created = false; that.delete(geometry); } this._onGeometryDispose = onGeometryDispose; } setGeometry(geometry, passInfo) { const gl = this._gl; const buffers = this._buffers; const geometryProperties = this.get(geometry); // If in pass rendering, skip the geometry if it has been set in this pass. if (geometryProperties.pass === passInfo.count) { return; } geometryProperties.pass = passInfo.count; if (!geometryProperties.created) { geometry.addEventListener('dispose', this._onGeometryDispose); geometryProperties.created = true; } if (geometry.index !== null) { buffers.setBuffer(geometry.index.buffer, gl.ELEMENT_ARRAY_BUFFER, this._vertexArrayBindings); } for (const name in geometry.attributes) { buffers.setBuffer(geometry.attributes[name].buffer, gl.ARRAY_BUFFER); } for (const name in geometry.morphAttributes) { const array = geometry.morphAttributes[name]; for (let i = 0, l = array.length; i < l; i++) { buffers.setBuffer(array[i].buffer, gl.ARRAY_BUFFER); } } return geometryProperties; } } // Build-in uniforms const internalUniforms = { 'u_Model': [1, null], 'u_Projection': [2, function (cameraData) { this.set(cameraData.projectionMatrix.elements); }], 'u_View': [2, function (cameraData) { this.set(cameraData.viewMatrix.elements); }], 'u_ProjectionView': [2, function (cameraData) { this.set(cameraData.projectionViewMatrix.elements); }], 'u_CameraPosition': [2, function (cameraData) { this.setValue(cameraData.position.x, cameraData.position.y, cameraData.position.z); }], 'logDepthBufFC': [2, function (cameraData) { this.set(cameraData.logDepthBufFC); }], 'logDepthCameraNear': [2, function (cameraData) { this.set(cameraData.logDepthCameraNear); }], 'u_FogColor': [3, function (sceneData) { const color = sceneData.fog.color; this.setValue(color.r, color.g, color.b); }], 'u_FogDensity': [3, function (sceneData) { this.set(sceneData.fog.density); }], 'u_FogNear': [3, function (sceneData) { this.set(sceneData.fog.near); }], 'u_FogFar': [3, function (sceneData) { this.set(sceneData.fog.far); }], 'u_Color': [4, function (material, textures) { const color = material.diffuse; this.setValue(color.r, color.g, color.b); }], 'u_Opacity': [4, function (material, textures) { this.set(material.opacity); }], 'u_AlphaTest': [4, function (material, textures) { this.set(material.alphaTest); }], 'diffuseMap': [4, function (material, textures) { this.set(material.diffuseMap, textures); }], 'alphaMap': [4, function (material, textures) { this.set(material.alphaMap, textures); }], 'alphaMapUVTransform': [4, function (material, textures) { const transform = material.alphaMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }], 'normalMap': [4, function (material, textures) { this.set(material.normalMap, textures); }], 'normalScale': [4, function (material, textures) { this.setValue(material.normalScale.x, material.normalScale.y); }], 'bumpMap': [4, function (material, textures) { this.set(material.bumpMap, textures); }], 'bumpScale': [4, function (material, textures) { this.set(material.bumpScale); }], 'cubeMap': [4, function (material, textures) { this.set(material.cubeMap, textures); }], 'u_Specular': [4, function (material, textures) { this.set(material.shininess); }], 'u_SpecularColor': [4, function (material, textures) { const color = material.specular; this.setValue(color.r, color.g, color.b); }], 'specularMap': [4, function (material, textures) { this.set(material.specularMap, textures); }], 'aoMap': [4, function (material, textures) { this.set(material.aoMap, textures); }], 'aoMapIntensity': [4, function (material, textures) { this.set(material.aoMapIntensity); }], 'aoMapUVTransform': [4, function (material, textures) { const transform = material.aoMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }], 'u_Roughness': [4, function (material, textures) { this.set(material.roughness); }], 'roughnessMap': [4, function (material, textures) { this.set(material.roughnessMap, textures); }], 'u_Metalness': [4, function (material, textures) { this.set(material.metalness); }], 'metalnessMap': [4, function (material, textures) { this.set(material.metalnessMap, textures); }], 'u_Clearcoat': [4, function (material, textures) { this.set(material.clearcoat); }], 'u_ClearcoatRoughness': [4, function (material, textures) { this.set(material.clearcoatRoughness); }], 'clearcoatMap': [4, function (material, textures) { this.set(material.clearcoatMap, textures); }], 'clearcoatRoughnessMap': [4, function (material, textures) { this.set(material.clearcoatRoughnessMap, textures); }], 'clearcoatNormalMap': [4, function (material, textures) { this.set(material.clearcoatNormalMap, textures); }], 'clearcoatNormalScale': [4, function (material, textures) { this.setValue(material.clearcoatNormalScale.x, material.clearcoatNormalScale.y); }], 'glossiness': [4, function (material, textures) { this.set(material.glossiness); }], 'glossinessMap': [4, function (material, textures) { this.set(material.glossinessMap, textures); }], 'emissive': [4, function (material, textures) { const color = material.emissive; this.setValue(color.r, color.g, color.b); }], 'emissiveMap': [4, function (material, textures) { this.set(material.emissiveMap, textures); }], 'emissiveMapUVTransform': [4, function (material, textures) { const transform = material.emissiveMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }], 'uvTransform': [4, function (material, textures) { const transform = material.diffuseMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }], 'u_PointSize': [4, function (material, textures) { this.set(material.size); }], 'envMap': [5, function (envData, textures) { this.set(envData.map, textures); }], 'envMapParams': [5, function (envData, textures) { this.setValue(envData.diffuse, envData.specular, envData.map.images[0] && envData.map.images[0].rtt ? 1 : -1); }], 'maxMipLevel': [5, function (envData, textures) { this.set(textures.get(envData.map).__maxMipLevel || 8); }] }; // Empty textures const emptyTexture = new Texture2D(); emptyTexture.image = { data: new Uint8Array([1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1]), width: 2, height: 2 }; emptyTexture.magFilter = TEXTURE_FILTER.NEAREST; emptyTexture.minFilter = TEXTURE_FILTER.NEAREST; emptyTexture.generateMipmaps = false; emptyTexture.version++; const emptyShadowTexture = new Texture2D(); emptyShadowTexture.image = { data: null, width: 2, height: 2 }; emptyShadowTexture.version++; emptyShadowTexture.type = PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV; emptyShadowTexture.format = PIXEL_FORMAT.DEPTH_STENCIL; emptyShadowTexture.magFilter = TEXTURE_FILTER.NEAREST; emptyShadowTexture.minFilter = TEXTURE_FILTER.NEAREST; emptyShadowTexture.compare = COMPARE_FUNC.LESS; emptyShadowTexture.generateMipmaps = false; emptyShadowTexture.version++; const emptyTexture3d = new Texture3D(); const emptyTexture2dArray = new Texture2DArray(); const emptyCubeTexture = new TextureCube(); // Array helpers function arraysEqual(a, b) { if (a.length !== b.length) return false; for (let i = 0, l = a.length; i < l; i++) { if (a[i] !== b[i]) return false; } return true; } function copyArray(a, b) { for (let i = 0, l = b.length; i < l; i++) { a[i] = b[i]; } } // Texture unit allocation const arrayCacheI32 = []; function allocTexUnits(textures, n) { let r = arrayCacheI32[n]; if (r === undefined) { r = new Int32Array(n); arrayCacheI32[n] = r; } for (let i = 0; i !== n; ++i) { r[i] = textures.allocTexUnit(); } return r; } // Helper to pick the right setter for uniform function generateSetter(uniform, pureArray) { const gl = uniform.gl; const type = uniform.type; const location = uniform.location; const cache = uniform.cache; switch (type) { case gl.FLOAT: uniform.setValue = function (value) { if (cache[0] === value) return; gl.uniform1f(location, value); cache[0] = value; }; if (pureArray) { uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniform1fv(location, value); copyArray(cache, value); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_2D: case gl.SAMPLER_2D_SHADOW: case gl.INT_SAMPLER_2D: case gl.UNSIGNED_INT_SAMPLER_2D: uniform.setValue = function (value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function (value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_2D_ARRAY: case gl.SAMPLER_2D_ARRAY_SHADOW: case gl.INT_SAMPLER_2D_ARRAY: case gl.UNSIGNED_INT_SAMPLER_2D_ARRAY: uniform.setValue = function (value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyTexture2dArray, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function (value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyTexture2dArray, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_CUBE: case gl.SAMPLER_CUBE_SHADOW: uniform.setValue = function (value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyCubeTexture, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function (value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyCubeTexture, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_3D: uniform.setValue = function (value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyTexture3d, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function (value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyTexture3d, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.BOOL: case gl.INT: uniform.setValue = function (value) { if (cache[0] === value) return; gl.uniform1i(location, value); cache[0] = value; }; if (pureArray) { uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniform1iv(location, value); copyArray(cache, value); }; } else { uniform.set = uniform.setValue; } break; case gl.FLOAT_VEC2: uniform.setValue = function (p1, p2) { if (cache[0] !== p1 || cache[1] !== p2) { gl.uniform2f(location, p1, p2); cache[0] = p1; cache[1] = p2; } }; uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniform2fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC2: case gl.INT_VEC2: uniform.setValue = function (p1, p2) { if (cache[0] !== p1 || cache[1] !== p2) { gl.uniform2i(location, p1, p2); cache[0] = p1; cache[1] = p2; } }; uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniform2iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_VEC3: uniform.setValue = function (p1, p2, p3) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) { gl.uniform3f(location, p1, p2, p3); cache[0] = p1; cache[1] = p2; cache[2] = p3; } }; uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniform3fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC3: case gl.INT_VEC3: uniform.setValue = function (p1, p2, p3) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) { gl.uniform3i(location, p1, p2, p3); cache[0] = p1; cache[1] = p2; cache[2] = p3; } }; uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniform3iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_VEC4: uniform.setValue = function (p1, p2, p3, p4) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) { gl.uniform4f(location, p1, p2, p3, p4); cache[0] = p1; cache[1] = p2; cache[2] = p3; cache[3] = p4; } }; uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniform4fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC4: case gl.INT_VEC4: uniform.setValue = function (p1, p2, p3, p4) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) { gl.uniform4i(location, p1, p2, p3, p4); cache[0] = p1; cache[1] = p2; cache[2] = p3; cache[3] = p4; } }; uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniform4iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_MAT2: if (pureArray) { uniform.setValue = uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix2fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function (value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3]) { gl.uniformMatrix2fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; } }; } break; case gl.FLOAT_MAT3: if (pureArray) { uniform.setValue = uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix3fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function (value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8]) { gl.uniformMatrix3fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; cache[4] = value[4]; cache[5] = value[5]; cache[6] = value[6]; cache[7] = value[7]; cache[8] = value[8]; } }; } break; case gl.FLOAT_MAT4: if (pureArray) { uniform.setValue = uniform.set = function (value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix4fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function (value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8] || cache[9] !== value[9] || cache[10] !== value[10] || cache[11] !== value[11] || cache[12] !== value[12] || cache[13] !== value[13] || cache[14] !== value[14] || cache[15] !== value[15]) { gl.uniformMatrix4fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; cache[4] = value[4]; cache[5] = value[5]; cache[6] = value[6]; cache[7] = value[7]; cache[8] = value[8]; cache[9] = value[9]; cache[10] = value[10]; cache[11] = value[11]; cache[12] = value[12]; cache[13] = value[13]; cache[14] = value[14]; cache[15] = value[15]; } }; } break; } } // --- Uniform Classes --- class SingleUniform { constructor(gl, id, activeInfo, location) { this.gl = gl; this.id = id; this.type = activeInfo.type; // this.size = activeInfo.size; // always be 1 this.location = location; this.setValue = undefined; this.set = undefined; this.cache = []; generateSetter(this); // internal this.internalGroup = 0; this.internalFun = null; const internal = internalUniforms[id]; if (internal) { this.internalGroup = internal[0]; this.internalFun = internal[1]; } } } class PureArrayUniform { constructor(gl, id, activeInfo, location) { this.gl = gl; this.id = id; this.type = activeInfo.type; this.size = activeInfo.size; this.location = location; this.setValue = undefined; this.set = undefined; this.cache = []; generateSetter(this, true); } } class UniformContainer { constructor() { this.seq = []; this.map = {}; } } class StructuredUniform extends UniformContainer { constructor(id) { super(); this.id = id; } set(value, textures) { const seq = this.seq; for (let i = 0, n = seq.length; i !== n; ++i) { const u = seq[i]; u.set(value[u.id], textures); } } } // --- Top-level --- // Parser - builds up the property tree from the path strings const RePathPart = /(\w+)(\])?(\[|\.)?/g; // extracts // - the identifier (member name or array index) // - followed by an optional right bracket (found when array index) // - followed by an optional left bracket or dot (type of subscript) // // Note: These portions can be read in a non-overlapping fashion and // allow straightforward parsing of the hierarchy that WebGL encodes // in the uniform names. function addUniform(container, uniformObject) { container.seq.push(uniformObject); container.map[uniformObject.id] = uniformObject; } // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getActiveUniform function parseUniform(gl, activeInfo, location, container) { const path = activeInfo.name, pathLength = path.length; // reset RegExp object, because of the early exit of a previous run RePathPart.lastIndex = 0; while (true) { const match = RePathPart.exec(path), matchEnd = RePathPart.lastIndex; let id = match[1]; const idIsIndex = match[2] === ']', subscript = match[3]; if (idIsIndex) id = id | 0; // convert to integer if (subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength) { // bare name or "pure" bottom-level array "[0]" suffix addUniform(container, subscript === undefined ? new SingleUniform(gl, id, activeInfo, location) : new PureArrayUniform(gl, id, activeInfo, location)); break; } else { // step into inner node / create it in case it doesn't exist const map = container.map; let next = map[id]; if (next === undefined) { next = new StructuredUniform(id); addUniform(container, next); } container = next; } } } // Root Container class WebGLUniforms extends UniformContainer { constructor(gl, program) { super(); const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); for (let i = 0; i < n; ++i) { const info = gl.getActiveUniform(program, i), addr = gl.getUniformLocation(program, info.name); parseUniform(gl, info, addr, this); } } set(name, value, textures) { const u = this.map[name]; if (u !== undefined) u.set(value, textures); } has(name) { return !!this.map[name]; } } let programIdCount = 0; class WebGLProgram { constructor(gl, vshader, fshader) { this.gl = gl; this.vshaderSource = vshader; this.fshaderSource = fshader; this.id = programIdCount++; this.usedTimes = 1; this.code = ''; this.name = ''; this.lightId = -1; this.lightVersion = -1; this.cameraId = -1; this.cameraVersion = -1; this.sceneId = -1; this.sceneVersion = -1; this.program; this._checkErrors = true; this._compileAsynchronously = false; this._status = 0; let program, vertexShader, fragmentShader; // compile program this.compile = function (options) { // create shaders vertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader); fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader); // create a program object program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); this.program = program; // set properties this._checkErrors = options.checkErrors; this._compileAsynchronously = options.compileAsynchronously; this._status = 1; // here we can delete shaders, // according to the documentation: https://www.opengl.org/sdk/docs/man/html/glLinkProgram.xhtml gl.deleteShader(vertexShader); gl.deleteShader(fragmentShader); }; // check if program is ready to be used this.isReady = function (parallelShaderCompileExt) { if (this._status === 1) { if (this._compileAsynchronously && parallelShaderCompileExt) { if (gl.getProgramParameter(program, parallelShaderCompileExt.COMPLETION_STATUS_KHR)) { this._status = 2; this._tryCheckErrors(); } } else { this._status = 2; this._tryCheckErrors(); } } return this._status === 2; }; this._tryCheckErrors = function () { if (!this._checkErrors) return; if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { const programLog = gl.getProgramInfoLog(program).trim(); const vertexErrors = getShaderErrors(gl, vertexShader, 'VERTEX'); const fragmentErrors = getShaderErrors(gl, fragmentShader, 'FRAGMENT'); this.program = undefined; this._status = 0; console.error('Shader Error ' + gl.getError() + ' - ' + 'VALIDATE_STATUS ' + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + '\n\n' + 'Shader Name: ' + this.name + '\n' + 'Program Info Log: ' + programLog + '\n' + vertexErrors + '\n' + fragmentErrors); } }; // set up caching for uniforms let cachedUniforms; this.getUniforms = function () { if (cachedUniforms === undefined) { cachedUniforms = new WebGLUniforms(gl, program); } return cachedUniforms; }; // set up caching for attributes let cachedAttributes; this.getAttributes = function () { if (cachedAttributes === undefined) { cachedAttributes = extractAttributes(gl, program); } return cachedAttributes; }; // free program this.dispose = function () { gl.deleteProgram(program); this.program = undefined; this._status = 0; }; } } function handleSource(string, errorLine) { const lines = string.split('\n'); const lines2 = []; const from = Math.max(errorLine - 6, 0); const to = Math.min(errorLine + 6, lines.length); for (let i = from; i < to; i++) { const line = i + 1; lines2.push(`${line === errorLine ? '>' : ' '} ${line}: ${lines[i]}`); } return lines2.join('\n'); } function loadShader(gl, type, source) { const shader = gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); return shader; } function getShaderErrors(gl, shader, type) { const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS); const errors = gl.getShaderInfoLog(shader).trim(); if (status && errors === '') return ''; const errorMatches = /ERROR: 0:(\d+)/.exec(errors); if (errorMatches) { // --enable-privileged-webgl-extension // console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); const errorLine = parseInt(errorMatches[1]); return type + '\n\n' + errors + '\n\n' + handleSource(gl.getShaderSource(shader), errorLine); } else { return errors; } } // extract attributes function extractAttributes(gl, program) { const attributes = {}; const totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); for (let i = 0; i < totalAttributes; i++) { const attribData = gl.getActiveAttrib(program, i); attributes[attribData.name] = new WebGLAttribute(gl, program, attribData); } return attributes; } class WebGLPrograms { constructor(gl, state, capabilities) { this._gl = gl; this._state = state; this._capabilities = capabilities; this._programs = []; } getProgram(material, props, programCode, compileOptions) { const programs = this._programs; let program; for (let p = 0, pl = programs.length; p < pl; p++) { const programInfo = programs[p]; if (programInfo.code === programCode) { program = programInfo; ++program.usedTimes; break; } } if (program === undefined) { const customDefines = generateDefines(material.defines); const vertexShader = ShaderLib[material.type + '_vert'] || material.vertexShader || ShaderLib.basic_vert; const fragmentShader = ShaderLib[material.type + '_frag'] || material.fragmentShader || ShaderLib.basic_frag; program = createProgram(this._gl, customDefines, props, vertexShader, fragmentShader); program.name = props.shaderName; program.compile(compileOptions); program.code = programCode; programs.push(program); } return program; } releaseProgram(program) { if (--program.usedTimes === 0) { const programs = this._programs; // Remove from unordered set const index = programs.indexOf(program); programs[index] = programs[programs.length - 1]; programs.pop(); // Free WebGL resources program.dispose(this._gl); } } generateProps(material, object, lightingState, renderStates) { const state = this._state; const capabilities = this._capabilities; const fog = material.fog ? renderStates.scene.fog : null; const envMap = material.envMap !== undefined ? material.envMap || renderStates.scene.environment : null; const logarithmicDepthBuffer = renderStates.scene.logarithmicDepthBuffer; const disableShadowSampler = renderStates.scene.disableShadowSampler; const numClippingPlanes = material.clippingPlanes && material.clippingPlanes.length > 0 ? material.clippingPlanes.length : renderStates.scene.numClippingPlanes; const HAS_CLEARCOAT = material.clearcoat > 0; const HAS_DIFFUSEMAP = !!material.diffuseMap; const HAS_ALPHAMAP = !!material.alphaMap; const HAS_EMISSIVEMAP = !!material.emissiveMap; const HAS_AOMAP = !!material.aoMap; const HAS_NORMALMAP = !!material.normalMap; const HAS_BUMPMAP = !!material.bumpMap; const HAS_SPECULARMAP = !!material.specularMap; const HAS_ROUGHNESSMAP = !!material.roughnessMap; const HAS_METALNESSMAP = !!material.metalnessMap; const HAS_GLOSSINESSMAP = !!material.glossinessMap; const HAS_ENVMAP = !!envMap; const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap; const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap; const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap; _activeMapCoords = material.extUvCoordMask; // reset const props = {}; // cache this props? props.shaderName = material.type === MATERIAL_TYPE.SHADER && material.shaderName ? material.shaderName : material.type; // capabilities props.version = capabilities.version; props.precision = material.precision || capabilities.maxPrecision; props.useStandardDerivatives = capabilities.version >= 2 || !!capabilities.getExtension('OES_standard_derivatives') || !!capabilities.getExtension('GL_OES_standard_derivatives'); props.useShaderTextureLOD = capabilities.version >= 2 || !!capabilities.getExtension('EXT_shader_texture_lod'); // maps props.useDiffuseMap = HAS_DIFFUSEMAP; props.useAlphaMap = HAS_ALPHAMAP; props.useEmissiveMap = HAS_EMISSIVEMAP; props.useAOMap = HAS_AOMAP; props.useNormalMap = HAS_NORMALMAP; props.useBumpMap = HAS_BUMPMAP; props.useSpecularMap = HAS_SPECULARMAP; props.useRoughnessMap = HAS_ROUGHNESSMAP; props.useMetalnessMap = HAS_METALNESSMAP; props.useGlossinessMap = HAS_GLOSSINESSMAP; props.useEnvMap = HAS_ENVMAP; props.envMapCombine = HAS_ENVMAP && material.envMapCombine; props.useClearcoat = HAS_CLEARCOAT; props.useClearcoatMap = HAS_CLEARCOATMAP; props.useClearcoatRoughnessMap = HAS_CLEARCOAT_ROUGHNESSMAP; props.useClearcoatNormalMap = HAS_CLEARCOAT_NORMALMAP; props.diffuseMapUv = HAS_DIFFUSEMAP && getUVChannel(material.diffuseMapCoord); props.alphaMapUv = HAS_ALPHAMAP && getUVChannel(material.alphaMapCoord); props.emissiveMapUv = HAS_EMISSIVEMAP && getUVChannel(material.emissiveMapCoord); props.aoMapUv = HAS_AOMAP && getUVChannel(material.aoMapCoord); if (HAS_NORMALMAP || HAS_BUMPMAP || HAS_SPECULARMAP || HAS_ROUGHNESSMAP || HAS_METALNESSMAP || HAS_GLOSSINESSMAP || HAS_CLEARCOATMAP || HAS_CLEARCOAT_ROUGHNESSMAP || HAS_CLEARCOAT_NORMALMAP) { _activeMapCoords |= 1 << 0; // these maps use uv coord 0 by default } props.activeMapCoords = _activeMapCoords; // lights lightingState.setProgramProps(props, object.receiveShadow); props.useShadowSampler = capabilities.version >= 2 && !disableShadowSampler; props.shadowType = object.shadowType; if (!props.useShadowSampler && (props.shadowType == SHADOW_TYPE.PCF3_SOFT || props.shadowType == SHADOW_TYPE.PCF5_SOFT || props.shadowType == SHADOW_TYPE.PCSS16_SOFT || props.shadowType == SHADOW_TYPE.PCSS32_SOFT || props.shadowType == SHADOW_TYPE.PCSS64_SOFT)) { props.shadowType = SHADOW_TYPE.VOGEL5_SOFT; if (props.useShadow) { console.warn('WebGLPrograms: PCF and PCSS shadow type need shadow sampler support, falling back to VOGEL5_SOFT.'); } } props.dithering = material.dithering; // encoding const currentRenderTarget = state.currentRenderTarget; props.gammaFactor = renderStates.gammaFactor; props.outputEncoding = currentRenderTarget.texture ? getTextureEncodingFromMap(currentRenderTarget.texture) : renderStates.outputEncoding; props.diffuseMapEncoding = getTextureEncodingFromMap(material.diffuseMap || material.cubeMap); props.envMapEncoding = getTextureEncodingFromMap(envMap); props.emissiveMapEncoding = getTextureEncodingFromMap(material.emissiveMap); // other props.alphaTest = material.alphaTest > 0; props.premultipliedAlpha = material.premultipliedAlpha; props.useVertexColors = material.vertexColors; props.useVertexTangents = !!material.normalMap && material.vertexTangents; props.numClippingPlanes = numClippingPlanes; props.flatShading = material.shading === SHADING_TYPE.FLAT_SHADING; props.fog = !!fog; props.fogExp2 = !!fog && fog.isFogExp2; props.sizeAttenuation = material.sizeAttenuation; props.doubleSided = material.side === DRAW_SIDE.DOUBLE; props.flipSided = material.side === DRAW_SIDE.BACK; props.packDepthToRGBA = material.packToRGBA; props.logarithmicDepthBuffer = !!logarithmicDepthBuffer; props.rendererExtensionFragDepth = capabilities.version >= 2 || !!capabilities.getExtension('EXT_frag_depth'); // morph targets props.morphTargets = !!object.morphTargetInfluences; props.morphNormals = !!object.morphTargetInfluences && object.geometry.morphAttributes.normal; // skinned mesh const useSkinning = object.isSkinnedMesh && object.skeleton; const maxVertexUniformVectors = capabilities.maxVertexUniformVectors; const useVertexTexture = capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2); let maxBones = 0; if (useVertexTexture) { maxBones = 1024; } else { maxBones = object.skeleton ? object.skeleton.bones.length : 0; if (maxBones * 16 > maxVertexUniformVectors) { console.warn('Program: too many bones (' + maxBones + '), current cpu only support ' + Math.floor(maxVertexUniformVectors / 16) + ' bones!!'); maxBones = Math.floor(maxVertexUniformVectors / 16); } } props.useSkinning = useSkinning; props.bonesNum = maxBones; props.useVertexTexture = useVertexTexture; return props; } generateProgramCode(props, material) { let code = ''; for (const key in props) { code += props[key] + '_'; } for (const name in material.defines) { code += name + '_' + material.defines[name] + '_'; } // If the material type is SHADER and there is no shader Name, // use the entire shader code as part of the signature if (material.type === MATERIAL_TYPE.SHADER && !material.shaderName) { code += material.vertexShader; code += material.fragmentShader; } return code; } } // Helper functions function generateDefines(defines) { const chunks = []; for (const name in defines) { const value = defines[name]; if (value === false) continue; chunks.push('#define ' + name + ' ' + value); } return chunks.join('\n'); } let _activeMapCoords = 0; // bit mask function getUVChannel(coord) { _activeMapCoords |= 1 << coord; if (coord === 0) return 'a_Uv'; return `a_Uv${coord + 1}`; // a_Uv2, a_Uv3, a_Uv4, ... } function getTextureEncodingFromMap(map) { let encoding; if (!map) { encoding = TEXEL_ENCODING_TYPE.LINEAR; } else if (map.encoding) { encoding = map.encoding; } return encoding; } function getEncodingComponents(encoding) { switch (encoding) { case TEXEL_ENCODING_TYPE.LINEAR: return ['Linear', '(value)']; case TEXEL_ENCODING_TYPE.SRGB: return ['sRGB', '(value)']; case TEXEL_ENCODING_TYPE.GAMMA: return ['Gamma', '(value, float(GAMMA_FACTOR))']; default: console.error('unsupported encoding: ' + encoding); } } function getTexelDecodingFunction(functionName, encoding) { const components = getEncodingComponents(encoding); return 'vec4 ' + functionName + '(vec4 value) { return ' + components[0] + 'ToLinear' + components[1] + '; }'; } function getTexelEncodingFunction(functionName, encoding) { const components = getEncodingComponents(encoding); return 'vec4 ' + functionName + '(vec4 value) { return LinearTo' + components[0] + components[1] + '; }'; } function uvAttributes(activeMapCoords) { let str = ''; for (let i = 1; i < 8; i++) { // skip uv0 if (activeMapCoords & 1 << i) { str += 'attribute vec2 a_Uv' + (i + 1) + ';'; if (i !== 7) str += '\n'; } } return str; } const shadowDefines = { [SHADOW_TYPE.HARD]: '#define USE_HARD_SHADOW', [SHADOW_TYPE.POISSON_SOFT]: '#define USE_POISSON_SOFT_SHADOW', [SHADOW_TYPE.VOGEL5_SOFT]: '#define USE_VOGEL5_SOFT_SHADOW', [SHADOW_TYPE.PCF3_SOFT]: '#define USE_PCF3_SOFT_SHADOW', [SHADOW_TYPE.PCF5_SOFT]: '#define USE_PCF5_SOFT_SHADOW', [SHADOW_TYPE.PCSS16_SOFT]: ['#define USE_PCSS16_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW'].join('\n'), [SHADOW_TYPE.PCSS32_SOFT]: ['#define USE_PCSS32_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW'].join('\n'), [SHADOW_TYPE.PCSS64_SOFT]: ['#define USE_PCSS64_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW'].join('\n') }; function getShadowTypeDefines(shadowType) { if (shadowDefines[shadowType]) { return shadowDefines[shadowType]; } else { console.warn('unsupported shadow type: ' + shadowType); return shadowDefines[SHADOW_TYPE.HARD]; } } function createProgram(gl, defines, props, vertex, fragment) { let prefixVertex = ['precision ' + props.precision + ' float;', 'precision ' + props.precision + ' int;', // depth texture may have precision problem on iOS device. 'precision ' + props.precision + ' sampler2D;', props.version >= 2 ? 'precision ' + props.precision + ' isampler2D;' : '', props.version >= 2 ? 'precision ' + props.precision + ' usampler2D;' : '', '#define SHADER_NAME ' + props.shaderName, defines, props.version >= 2 ? '#define WEBGL2' : '', // maps props.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '', props.useAlphaMap ? '#define USE_ALPHA_MAP' : '', props.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '', props.useAOMap ? '#define USE_AOMAP' : '', props.useNormalMap ? '#define USE_NORMAL_MAP' : '', props.useBumpMap ? '#define USE_BUMPMAP' : '', props.useSpecularMap ? '#define USE_SPECULARMAP' : '', props.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '', props.useMetalnessMap ? '#define USE_METALNESSMAP' : '', props.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '', props.useEnvMap ? '#define USE_ENV_MAP' : '', props.diffuseMapUv ? '#define DIFFUSEMAP_UV ' + props.diffuseMapUv : '', props.alphaMapUv ? '#define ALPHAMAP_UV ' + props.alphaMapUv : '', props.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + props.emissiveMapUv : '', props.aoMapUv ? '#define AOMAP_UV ' + props.aoMapUv : '', props.activeMapCoords > 0 ? '#define USE_UV' : '', props.activeMapCoords & 1 ? '#define USE_UV1' : '', uvAttributes(props.activeMapCoords), // lights props.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '', props.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '', props.useShadow ? '#define USE_SHADOW' : '', // other props.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '', props.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '', props.useVertexTangents ? '#define USE_TANGENT' : '', props.flatShading ? '#define FLAT_SHADED' : '', props.fog ? '#define USE_FOG' : '', props.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', props.flipSided ? '#define FLIP_SIDED' : '', props.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', props.logarithmicDepthBuffer && props.rendererExtensionFragDepth ? '#define USE_LOGDEPTHBUF_EXT' : '', // morph targets props.morphTargets ? '#define USE_MORPHTARGETS' : '', props.morphNormals && props.flatShading === false ? '#define USE_MORPHNORMALS' : '', // skinned mesh props.useSkinning ? '#define USE_SKINNING' : '', props.bonesNum > 0 ? '#define MAX_BONES ' + props.bonesNum : '', props.useVertexTexture ? '#define BONE_TEXTURE' : '', '\n'].filter(filterEmptyLine).join('\n'); let prefixFragment = [ // use dfdx and dfdy must enable OES_standard_derivatives props.useStandardDerivatives && props.version < 2 ? '#extension GL_OES_standard_derivatives : enable' : '', props.useShaderTextureLOD && props.version < 2 ? '#extension GL_EXT_shader_texture_lod : enable' : '', props.logarithmicDepthBuffer && props.rendererExtensionFragDepth && props.version < 2 ? '#extension GL_EXT_frag_depth : enable' : '', 'precision ' + props.precision + ' float;', 'precision ' + props.precision + ' int;', // depth texture may have precision problem on iOS device. 'precision ' + props.precision + ' sampler2D;', props.version >= 2 ? 'precision ' + props.precision + ' isampler2D;' : '', props.version >= 2 ? 'precision ' + props.precision + ' usampler2D;' : '', props.version >= 2 ? 'precision ' + props.precision + ' sampler2DShadow;' : '', props.version >= 2 ? 'precision ' + props.precision + ' samplerCubeShadow;' : '', '#define SHADER_NAME ' + props.shaderName, '#define PI 3.14159265359', '#define EPSILON 1e-6', 'float pow2(const in float x) { return x * x; }', '#define LOG2 1.442695', '#define RECIPROCAL_PI 0.31830988618', '#define saturate(a) clamp(a, 0.0, 1.0)', '#define whiteCompliment(a) (1.0 - saturate(a))', // expects values in the range of [0,1] x [0,1], returns values in the [0,1] range. // do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ 'highp float rand(const in vec2 uv) {', ' const highp float a = 12.9898, b = 78.233, c = 43758.5453;', ' highp float dt = dot(uv.xy, vec2(a, b)), sn = mod(dt, PI);', ' return fract(sin(sn) * c);', '}', defines, props.version >= 2 ? '#define WEBGL2' : '', props.useShadowSampler ? '#define USE_SHADOW_SAMPLER' : '#define sampler2DShadow sampler2D', props.useShaderTextureLOD ? '#define TEXTURE_LOD_EXT' : '', // maps props.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '', props.useAlphaMap ? '#define USE_ALPHA_MAP' : '', props.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '', props.useAOMap ? '#define USE_AOMAP' : '', props.useNormalMap ? '#define USE_NORMAL_MAP' : '', props.useBumpMap ? '#define USE_BUMPMAP' : '', props.useSpecularMap ? '#define USE_SPECULARMAP' : '', props.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '', props.useMetalnessMap ? '#define USE_METALNESSMAP' : '', props.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '', props.useEnvMap ? '#define USE_ENV_MAP' : '', props.envMapCombine ? '#define ' + props.envMapCombine : '', props.useClearcoat ? '#define USE_CLEARCOAT' : '', props.useClearcoatMap ? '#define USE_CLEARCOATMAP' : '', props.useClearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', props.useClearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', props.activeMapCoords & 1 ? '#define USE_UV1' : '', // lights props.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '', props.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '', props.useClusteredLights ? '#define USE_CLUSTERED_LIGHTS' : '', props.useShadow ? '#define USE_SHADOW' : '', getShadowTypeDefines(props.shadowType), props.dithering ? '#define DITHERING' : '', // encoding ShaderChunk['encodings_pars_frag'], '#define GAMMA_FACTOR ' + props.gammaFactor, getTexelEncodingFunction('linearToOutputTexel', props.outputEncoding), getTexelDecodingFunction('mapTexelToLinear', props.diffuseMapEncoding), props.useEnvMap ? getTexelDecodingFunction('envMapTexelToLinear', props.envMapEncoding) : '', props.useEmissiveMap ? getTexelDecodingFunction('emissiveMapTexelToLinear', props.emissiveMapEncoding) : '', // other props.alphaTest ? '#define ALPHATEST' : '', props.premultipliedAlpha ? '#define USE_PREMULTIPLIED_ALPHA' : '', props.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '', props.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '', props.useVertexTangents ? '#define USE_TANGENT' : '', props.flatShading ? '#define FLAT_SHADED' : '', props.fog ? '#define USE_FOG' : '', props.fogExp2 ? '#define USE_EXP2_FOG' : '', props.doubleSided ? '#define DOUBLE_SIDED' : '', props.packDepthToRGBA ? '#define DEPTH_PACKING_RGBA' : '', props.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', props.logarithmicDepthBuffer && props.rendererExtensionFragDepth ? '#define USE_LOGDEPTHBUF_EXT' : '', '\n'].filter(filterEmptyLine).join('\n'); let vshader = vertex; let fshader = fragment; vshader = parseIncludes(vshader); fshader = parseIncludes(fshader); vshader = replaceLightNums(vshader, props); fshader = replaceLightNums(fshader, props); vshader = replaceClippingPlaneNums(vshader, props); fshader = replaceClippingPlaneNums(fshader, props); vshader = unrollLoops(vshader); fshader = unrollLoops(fshader); // enable glsl version 300 es for webgl ^2.0 if (props.version > 1) { // extract vertex extensions and insert after version strings later // because it must be at the top of the shader const vertexExtensions = vshader.match(extensionPattern); if (vertexExtensions) { vshader = vshader.replace(extensionPattern, ''); } prefixVertex = ['#version 300 es', vertexExtensions ? vertexExtensions.join('\n') : '', '#define attribute in', '#define varying out', '#define texture2D texture'].join('\n') + '\n' + prefixVertex; fshader = fshader.replace('#extension GL_EXT_draw_buffers : require', ''); // replace gl_FragData by layout let i = 0; const layout = []; while (fshader.indexOf('gl_FragData[' + i + ']') > -1) { fshader = fshader.replace('gl_FragData[' + i + ']', 'pc_fragData' + i); layout.push('layout(location = ' + i + ') out highp vec4 pc_fragData' + i + ';'); i++; } prefixFragment = ['#version 300 es', '#define varying in', fshader.indexOf('layout') > -1 || layout.length > 0 ? '' : 'out highp vec4 pc_fragColor;', '#define gl_FragColor pc_fragColor', '#define gl_FragDepthEXT gl_FragDepth', '#define texture2D texture', '#define textureCube texture', '#define texture2DProj textureProj', '#define texture2DLodEXT textureLod', '#define texture2DProjLodEXT textureProjLod', '#define textureCubeLodEXT textureLod', '#define texture2DGradEXT textureGrad', '#define texture2DProjGradEXT textureProjGrad', '#define textureCubeGradEXT textureGrad', layout.join('\n')].join('\n') + '\n' + prefixFragment; } vshader = prefixVertex + vshader; fshader = prefixFragment + fshader; return new WebGLProgram(gl, vshader, fshader); } const parseIncludes = function (string) { const pattern = /#include +<([\w\d.]+)>/g; function replace(match, include) { const replace = ShaderChunk[include]; if (replace === undefined) { throw new Error('Can not resolve #include <' + include + '>'); } return parseIncludes(replace); } return string.replace(pattern, replace); }; function filterEmptyLine(string) { return string !== ''; } function replaceLightNums(string, parameters) { return string.replace(/NUM_HEMI_LIGHTS/g, parameters.hemisphereLightNum).replace(/NUM_DIR_LIGHTS/g, parameters.directLightNum).replace(/NUM_SPOT_LIGHTS/g, parameters.spotLightNum).replace(/NUM_POINT_LIGHTS/g, parameters.pointLightNum).replace(/NUM_RECT_AREA_LIGHTS/g, parameters.rectAreaLightNum).replace(/NUM_DIR_SHADOWS/g, parameters.directShadowNum).replace(/NUM_SPOT_SHADOWS/g, parameters.spotShadowNum).replace(/NUM_POINT_SHADOWS/g, parameters.pointShadowNum); } function replaceClippingPlaneNums(string, parameters) { return string.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes); } const unrollLoopPattern = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; function loopReplacer(match, start, end, snippet) { let string = ''; for (let i = parseInt(start); i < parseInt(end); i++) { string += snippet.replace(/\[\s*i\s*\]/g, '[' + i + ']').replace(/UNROLLED_LOOP_INDEX/g, i); } return string; } function unrollLoops(string) { return string.replace(unrollLoopPattern, loopReplacer); } const extensionPattern = /#extension .*/g; class WebGLQuerySets extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; const timerQuery = capabilities.timerQuery; const that = this; function onQuerySetDispose(event) { const querySet = event.target; const querySetProperties = that.get(querySet); querySet.removeEventListener('dispose', onQuerySetDispose); if (querySetProperties._queriesGL) { const queriesGL = querySetProperties._queriesGL; queriesGL.forEach(queryGL => { if (queryGL) { if (capabilities.version > 1) { gl.deleteQuery(queryGL); } else { timerQuery.deleteQueryEXT(queryGL); } } }); } querySetProperties._isDisposed = true; that.delete(querySet); } this._onQuerySetDispose = onQuerySetDispose; this._checkResultAvailable = capabilities.version > 1 ? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT_AVAILABLE) : queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_AVAILABLE_EXT); this._getQueryResult = capabilities.version > 1 ? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT) : queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_EXT); } setQuerySet(querySet) { const querySetProperties = this.get(querySet); if (querySetProperties._queriesGL === undefined) { querySet.addEventListener('dispose', this._onQuerySetDispose); querySetProperties._queriesGL = new Array(querySet.count).fill(null); querySetProperties._valueCache = new Array(querySet.count).fill(0); querySetProperties._valueCacheValid = new Array(querySet.count).fill(true); const gl = this._gl; const capabilities = this._capabilities; if (querySet.type === QUERYSET_TYPE.OCCLUSION) { querySetProperties._targetGL = querySet.conservative ? gl.ANY_SAMPLES_PASSED_CONSERVATIVE : gl.ANY_SAMPLES_PASSED; } else { // If timestamp is supported, this variable will not be used, // so it is okay to set it to TIME_ELAPSED_EXT here. querySetProperties._targetGL = capabilities.timerQuery.TIME_ELAPSED_EXT; } querySetProperties._activeIndex = -1; querySetProperties._reading = false; } } beginQuery(querySet, index) { const gl = this._gl; const querySetProperties = this.get(querySet); if (querySetProperties._reading) { return; } const queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index); if (this._capabilities.version > 1) { gl.beginQuery(querySetProperties._targetGL, queryGL); } else { this._capabilities.timerQuery.beginQueryEXT(querySetProperties._targetGL, queryGL); } querySetProperties._activeIndex = index; } endQuery(querySet) { const querySetProperties = this.get(querySet); if (querySetProperties._reading || querySetProperties._activeIndex < 0) { return; } if (this._capabilities.version > 1) { this._gl.endQuery(querySetProperties._targetGL); } else { this._capabilities.timerQuery.endQueryEXT(querySetProperties._targetGL); } querySetProperties._valueCacheValid[querySetProperties._activeIndex] = false; querySetProperties._activeIndex = -1; } queryCounter(querySet, index) { const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const querySetProperties = this.get(querySet); if (querySetProperties._reading) { return; } const queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index); timerQuery.queryCounterEXT(queryGL, timerQuery.TIMESTAMP_EXT); querySetProperties._valueCacheValid[index] = false; } readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount) { const querySetProperties = this.get(querySet); querySetProperties._reading = true; return new Promise((resolve, reject) => { const checkQueries = () => { if (querySetProperties._isDisposed) { reject(new Error('QuerySet has been disposed')); return; } let completed = true; try { for (let i = firstQuery; i < queryCount; i++) { const queryGL = querySetProperties._queriesGL[i]; const valueCacheValid = querySetProperties._valueCacheValid[i]; if (!valueCacheValid) { if (this._checkResultAvailable(queryGL)) { const result = this._getQueryResult(queryGL); querySetProperties._valueCache[i] = result; querySetProperties._valueCacheValid[i] = true; } else { completed = false; break; } } } } catch (e) { for (let i = firstQuery; i < queryCount; i++) { querySetProperties._valueCacheValid[i] = true; } querySetProperties._reading = false; reject(e); return; } if (completed) { for (let i = firstQuery; i < queryCount; i++) { dstBuffer[i - firstQuery] = querySetProperties._valueCache[i]; } querySetProperties._reading = false; resolve(dstBuffer); } else { requestAnimationFrame(checkQueries); } }; checkQueries(); }); } _getQueryGLByIndex(queriesGL, index) { let queryGL = queriesGL[index]; if (!queryGL) { const gl = this._gl; const capabilities = this._capabilities; queryGL = capabilities.version > 1 ? gl.createQuery() : capabilities.timerQuery.createQueryEXT(); queriesGL[index] = queryGL; } return queryGL; } } class WebGLConstants { constructor(gl, capabilities) { this._gl = gl; this._capabilities = capabilities; } getGLType(type) { const gl = this._gl; const capabilities = this._capabilities; const isWebGL2 = capabilities.version >= 2; if (type === PIXEL_TYPE.UNSIGNED_BYTE) return gl.UNSIGNED_BYTE; if (type === PIXEL_TYPE.UNSIGNED_SHORT_5_6_5) return gl.UNSIGNED_SHORT_5_6_5; if (type === PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4) return gl.UNSIGNED_SHORT_4_4_4_4; if (type === PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1) return gl.UNSIGNED_SHORT_5_5_5_1; let extension; if (!isWebGL2) { if (type === PIXEL_TYPE.UNSIGNED_SHORT || type === PIXEL_TYPE.UNSIGNED_INT || type === PIXEL_TYPE.UNSIGNED_INT_24_8) { extension = capabilities.getExtension('WEBGL_depth_texture'); if (extension) { if (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT; if (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT; if (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return extension.UNSIGNED_INT_24_8_WEBGL; } else { console.warn('extension WEBGL_depth_texture is not support.'); return null; } } if (type === PIXEL_TYPE.FLOAT) { extension = capabilities.getExtension('OES_texture_float'); if (extension) { return gl.FLOAT; } else { console.warn('extension OES_texture_float is not support.'); return null; } } if (type === PIXEL_TYPE.HALF_FLOAT) { extension = capabilities.getExtension('OES_texture_half_float'); if (extension) { return extension.HALF_FLOAT_OES; } else { console.warn('extension OES_texture_half_float is not support.'); return null; } } } else { if (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT; if (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT; if (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return gl.UNSIGNED_INT_24_8; if (type === PIXEL_TYPE.FLOAT) return gl.FLOAT; if (type === PIXEL_TYPE.HALF_FLOAT) return gl.HALF_FLOAT; if (type === PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV) return gl.FLOAT_32_UNSIGNED_INT_24_8_REV; if (type === PIXEL_TYPE.BYTE) return gl.BYTE; if (type === PIXEL_TYPE.SHORT) return gl.SHORT; if (type === PIXEL_TYPE.INT) return gl.INT; // does not include: // UNSIGNED_INT_2_10_10_10_REV // UNSIGNED_INT_10F_11F_11F_REV // UNSIGNED_INT_5_9_9_9_REV } return gl[type] !== undefined ? gl[type] : type; } getGLFormat(format) { const gl = this._gl; const capabilities = this._capabilities; if (format === PIXEL_FORMAT.RGB) return gl.RGB; if (format === PIXEL_FORMAT.RGBA) return gl.RGBA; if (format === PIXEL_FORMAT.ALPHA) return gl.ALPHA; if (format === PIXEL_FORMAT.LUMINANCE) return gl.LUMINANCE; if (format === PIXEL_FORMAT.LUMINANCE_ALPHA) return gl.LUMINANCE_ALPHA; if (format === PIXEL_FORMAT.DEPTH_COMPONENT) return gl.DEPTH_COMPONENT; if (format === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL; if (format === PIXEL_FORMAT.RED) return gl.RED; if (format === PIXEL_FORMAT.RED_INTEGER) return gl.RED_INTEGER; if (format === PIXEL_FORMAT.RG) return gl.RG; if (format === PIXEL_FORMAT.RG_INTEGER) return gl.RG_INTEGER; if (format === PIXEL_FORMAT.RGB_INTEGER) return gl.RGB_INTEGER; if (format === PIXEL_FORMAT.RGBA_INTEGER) return gl.RGBA_INTEGER; let extension; // S3TC if (format === PIXEL_FORMAT.RGB_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT3 || format === PIXEL_FORMAT.RGBA_S3TC_DXT5) { extension = capabilities.getExtension('WEBGL_compressed_texture_s3tc'); if (extension) { if (format === PIXEL_FORMAT.RGB_S3TC_DXT1) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT1) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT3) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT5) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; } else { console.warn('extension WEBGL_compressed_texture_s3tc is not support.'); return null; } } // PVRTC if (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) { extension = capabilities.getExtension('WEBGL_compressed_texture_pvrtc'); if (extension) { if (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if (format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if (format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if (format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; } else { console.warn('extension WEBGL_compressed_texture_pvrtc is not support.'); return null; } } // ETC1 if (format === PIXEL_FORMAT.RGB_ETC1) { extension = capabilities.getExtension('WEBGL_compressed_texture_etc1'); if (extension) { return extension.COMPRESSED_RGB_ETC1_WEBGL; } else { console.warn('extension WEBGL_compressed_texture_etc1 is not support.'); return null; } } // ASTC if (format === PIXEL_FORMAT.RGBA_ASTC_4x4) { extension = capabilities.getExtension('WEBGL_compressed_texture_astc'); if (extension) { return extension.COMPRESSED_RGBA_ASTC_4x4_KHR; } else { console.warn('extension WEBGL_compressed_texture_astc is not support.'); return null; } } // BPTC if (format === PIXEL_FORMAT.RGBA_BPTC || format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT || format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) { extension = capabilities.getExtension('EXT_texture_compression_bptc'); if (extension) { if (format === PIXEL_FORMAT.RGBA_BPTC) return extension.COMPRESSED_RGBA_BPTC_UNORM_EXT; if (format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; if (format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; } else { console.warn('extension EXT_texture_compression_bptc is not support.'); return null; } } return gl[format] !== undefined ? gl[format] : format; } getGLInternalFormat(internalFormat) { const gl = this._gl; const capabilities = this._capabilities; const isWebGL2 = capabilities.version >= 2; if (internalFormat === PIXEL_FORMAT.RGBA4) return gl.RGBA4; if (internalFormat === PIXEL_FORMAT.RGB5_A1) return gl.RGB5_A1; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT16) return gl.DEPTH_COMPONENT16; if (internalFormat === PIXEL_FORMAT.STENCIL_INDEX8) return gl.STENCIL_INDEX8; if (internalFormat === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL; // does not include: // RGB565 let extension; if (!isWebGL2) { if (internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.RGB32F) { extension = capabilities.getExtension('WEBGL_color_buffer_float'); if (extension) { if (internalFormat === PIXEL_FORMAT.RGBA32F) return extension.RGBA32F_EXT; if (internalFormat === PIXEL_FORMAT.RGB32F) return extension.RGB32F_EXT; } else { console.warn('extension WEBGL_color_buffer_float is not support.'); return null; } } } else { if (internalFormat === PIXEL_FORMAT.R8) return gl.R8; if (internalFormat === PIXEL_FORMAT.RG8) return gl.RG8; if (internalFormat === PIXEL_FORMAT.RGB8) return gl.RGB8; if (internalFormat === PIXEL_FORMAT.RGBA8) return gl.RGBA8; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT24) return gl.DEPTH_COMPONENT24; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT32F) return gl.DEPTH_COMPONENT32F; if (internalFormat === PIXEL_FORMAT.DEPTH24_STENCIL8) return gl.DEPTH24_STENCIL8; if (internalFormat === PIXEL_FORMAT.DEPTH32F_STENCIL8) return gl.DEPTH32F_STENCIL8; // does not include: // R8UI R8I R16UI R16I R32UI R32I RG8UI RG8I RG16UI RG16I RG32UI RG32I SRGB8_ALPHA8 // RGB10_A2 RGBA8UI RGBA8I RGB10_A2UI RGBA16UI RGBA16I RGBA32I RGBA32UI if (internalFormat === PIXEL_FORMAT.R16F || internalFormat === PIXEL_FORMAT.RG16F || internalFormat === PIXEL_FORMAT.RGB16F || internalFormat === PIXEL_FORMAT.RGBA16F || internalFormat === PIXEL_FORMAT.R32F || internalFormat === PIXEL_FORMAT.RG32F || internalFormat === PIXEL_FORMAT.RGB32F || internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.R11F_G11F_B10F) { extension = capabilities.getExtension('EXT_color_buffer_float'); if (extension) { if (internalFormat === PIXEL_FORMAT.R16F) return gl.R16F; if (internalFormat === PIXEL_FORMAT.RG16F) return gl.RG16F; if (internalFormat === PIXEL_FORMAT.RGB16F) return gl.RGB16F; if (internalFormat === PIXEL_FORMAT.RGBA16F) return gl.RGBA16F; if (internalFormat === PIXEL_FORMAT.R32F) return gl.R32F; if (internalFormat === PIXEL_FORMAT.RG32F) return gl.RG32F; if (internalFormat === PIXEL_FORMAT.RGB32F) return gl.RGB32F; if (internalFormat === PIXEL_FORMAT.RGBA32F) return gl.RGBA32F; if (internalFormat === PIXEL_FORMAT.R11F_G11F_B10F) return gl.R11F_G11F_B10F; } else { console.warn('extension EXT_color_buffer_float is not support.'); return null; } } } return gl[internalFormat] !== undefined ? gl[internalFormat] : internalFormat; } } function createTexture(gl, type, target, count) { const data = new Uint8Array(4); // 4 is required to match default unpack alignment of 4. const texture = gl.createTexture(); gl.bindTexture(type, texture); gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST); for (let i = 0; i < count; i++) { gl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); } return texture; } function ColorBuffer(gl) { let locked = false; const color = new Vector4(); let currentColorMask = null; const currentColorClear = new Vector4(0, 0, 0, 0); return { setMask: function (colorMask) { if (currentColorMask !== colorMask && !locked) { gl.colorMask(colorMask, colorMask, colorMask, colorMask); currentColorMask = colorMask; } }, setLocked: function (lock) { locked = lock; }, setClear: function (r, g, b, a, premultipliedAlpha) { if (premultipliedAlpha === true) { r *= a; g *= a; b *= a; } color.set(r, g, b, a); if (currentColorClear.equals(color) === false) { gl.clearColor(r, g, b, a); currentColorClear.copy(color); } }, getClear: function () { return currentColorClear; }, reset: function () { locked = false; currentColorMask = null; currentColorClear.set(-1, 0, 0, 0); // set to invalid state } }; } function DepthBuffer(gl, state) { let locked = false; let currentDepthMask = null; let currentDepthFunc = null; let currentDepthClear = null; return { setTest: function (depthTest) { if (depthTest) { state.enable(gl.DEPTH_TEST); } else { state.disable(gl.DEPTH_TEST); } }, setMask: function (depthMask) { if (currentDepthMask !== depthMask && !locked) { gl.depthMask(depthMask); currentDepthMask = depthMask; } }, setFunc: function (depthFunc) { if (currentDepthFunc !== depthFunc) { gl.depthFunc(depthFunc); currentDepthFunc = depthFunc; } }, setLocked: function (lock) { locked = lock; }, setClear: function (depth) { if (currentDepthClear !== depth) { gl.clearDepth(depth); currentDepthClear = depth; } }, reset: function () { locked = false; currentDepthMask = null; currentDepthFunc = null; currentDepthClear = null; } }; } function StencilBuffer(gl, state) { let locked = false; let currentStencilMask = null; let currentStencilFunc = null; let currentStencilRef = null; let currentStencilFuncMask = null; let currentStencilFail = null; let currentStencilZFail = null; let currentStencilZPass = null; let currentStencilFuncBack = null; let currentStencilRefBack = null; let currentStencilFuncMaskBack = null; let currentStencilFailBack = null; let currentStencilZFailBack = null; let currentStencilZPassBack = null; let currentStencilClear = null; return { setTest: function (stencilTest) { if (stencilTest) { state.enable(gl.STENCIL_TEST); } else { state.disable(gl.STENCIL_TEST); } }, setMask: function (stencilMask) { if (currentStencilMask !== stencilMask && !locked) { gl.stencilMask(stencilMask); currentStencilMask = stencilMask; } }, setFunc: function (stencilFunc, stencilRef, stencilMask, stencilFuncBack, stencilRefBack, stencilMaskBack) { if (currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask || currentStencilFuncBack !== stencilFuncBack || currentStencilRefBack !== stencilRefBack || currentStencilFuncMaskBack !== stencilMaskBack) { if (stencilFuncBack === null || stencilRefBack === null || stencilMaskBack === null) { gl.stencilFunc(stencilFunc, stencilRef, stencilMask); } else { gl.stencilFuncSeparate(gl.FRONT, stencilFunc, stencilRef, stencilMask); gl.stencilFuncSeparate(gl.BACK, stencilFuncBack, stencilRefBack, stencilMaskBack); } currentStencilFunc = stencilFunc; currentStencilRef = stencilRef; currentStencilFuncMask = stencilMask; currentStencilFuncBack = stencilFuncBack; currentStencilRefBack = stencilRefBack; currentStencilFuncMaskBack = stencilMaskBack; } }, setOp: function (stencilFail, stencilZFail, stencilZPass, stencilFailBack, stencilZFailBack, stencilZPassBack) { if (currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass || currentStencilFailBack !== stencilFailBack || currentStencilZFailBack !== stencilZFailBack || currentStencilZPassBack !== stencilZPassBack) { if (stencilFailBack === null || stencilZFailBack === null || stencilZPassBack === null) { gl.stencilOp(stencilFail, stencilZFail, stencilZPass); } else { gl.stencilOpSeparate(gl.FRONT, stencilFail, stencilZFail, stencilZPass); gl.stencilOpSeparate(gl.BACK, stencilFailBack, stencilZFailBack, stencilZPassBack); } currentStencilFail = stencilFail; currentStencilZFail = stencilZFail; currentStencilZPass = stencilZPass; currentStencilFailBack = stencilFailBack; currentStencilZFailBack = stencilZFailBack; currentStencilZPassBack = stencilZPassBack; } }, setLocked: function (lock) { locked = lock; }, setClear: function (stencil) { if (currentStencilClear !== stencil) { gl.clearStencil(stencil); currentStencilClear = stencil; } }, reset: function () { locked = false; currentStencilMask = null; currentStencilFunc = null; currentStencilRef = null; currentStencilFuncMask = null; currentStencilFail = null; currentStencilZFail = null; currentStencilZPass = null; currentStencilFuncBack = null; currentStencilRefBack = null; currentStencilFuncMaskBack = null; currentStencilFailBack = null; currentStencilZFailBack = null; currentStencilZPassBack = null; currentStencilClear = null; } }; } class WebGLState { constructor(gl, capabilities) { this.gl = gl; this.capabilities = capabilities; this.colorBuffer = new ColorBuffer(gl); this.depthBuffer = new DepthBuffer(gl, this); this.stencilBuffer = new StencilBuffer(gl, this); this.states = {}; this.currentBlending = null; this.currentBlendEquation = null; this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendEquationAlpha = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; this.currentPremultipliedAlpha = null; this.currentFlipSided = false; this.currentCullFace = null; const viewportParam = gl.getParameter(gl.VIEWPORT); this.currentViewport = new Vector4().fromArray(viewportParam); this.currentLineWidth = null; this.currentPolygonOffsetFactor = null; this.currentPolygonOffsetUnits = null; this.currentProgram = null; this.currentBoundBuffers = {}; this.currentRenderTarget = null; // used in WebGLRenderTargets this.currentTextureSlot = null; this.currentBoundTextures = {}; this.emptyTextures = {}; this.emptyTextures[gl.TEXTURE_2D] = createTexture(gl, gl.TEXTURE_2D, gl.TEXTURE_2D, 1); this.emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl, gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6); this.blendEquationToGL = { [BLEND_EQUATION.ADD]: gl.FUNC_ADD, [BLEND_EQUATION.SUBTRACT]: gl.FUNC_SUBTRACT, [BLEND_EQUATION.REVERSE_SUBTRACT]: gl.FUNC_REVERSE_SUBTRACT, [BLEND_EQUATION.MIN]: gl.MIN, [BLEND_EQUATION.MAX]: gl.MAX }; this.blendFactorToGL = { [BLEND_FACTOR.ZERO]: gl.ZERO, [BLEND_FACTOR.ONE]: gl.ONE, [BLEND_FACTOR.SRC_COLOR]: gl.SRC_COLOR, [BLEND_FACTOR.SRC_ALPHA]: gl.SRC_ALPHA, [BLEND_FACTOR.SRC_ALPHA_SATURATE]: gl.SRC_ALPHA_SATURATE, [BLEND_FACTOR.DST_COLOR]: gl.DST_COLOR, [BLEND_FACTOR.DST_ALPHA]: gl.DST_ALPHA, [BLEND_FACTOR.ONE_MINUS_SRC_COLOR]: gl.ONE_MINUS_SRC_COLOR, [BLEND_FACTOR.ONE_MINUS_SRC_ALPHA]: gl.ONE_MINUS_SRC_ALPHA, [BLEND_FACTOR.ONE_MINUS_DST_COLOR]: gl.ONE_MINUS_DST_COLOR, [BLEND_FACTOR.ONE_MINUS_DST_ALPHA]: gl.ONE_MINUS_DST_ALPHA }; // init this.colorBuffer.setClear(0, 0, 0, 1); this.depthBuffer.setClear(1); this.stencilBuffer.setClear(0); this.depthBuffer.setTest(true); this.depthBuffer.setFunc(COMPARE_FUNC.LEQUAL); this.setFlipSided(false); this.setCullFace(CULL_FACE_TYPE.BACK); } enable(id) { if (this.states[id] !== true) { this.gl.enable(id); this.states[id] = true; } } disable(id) { if (this.states[id] !== false) { this.gl.disable(id); this.states[id] = false; } } setBlending(blend, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha) { const gl = this.gl; if (blend === BLEND_TYPE.NONE) { this.disable(gl.BLEND); return; } this.enable(gl.BLEND); if (blend !== BLEND_TYPE.CUSTOM) { if (blend !== this.currentBlending || premultipliedAlpha !== this.currentPremultipliedAlpha) { if (this.currentBlendEquation !== BLEND_EQUATION.ADD || this.currentBlendEquationAlpha !== BLEND_EQUATION.ADD) { gl.blendEquation(gl.FUNC_ADD); this.currentBlendEquation = BLEND_EQUATION.ADD; this.currentBlendEquationAlpha = BLEND_EQUATION.ADD; } if (blend === BLEND_TYPE.NORMAL) { if (premultipliedAlpha) { gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); } else { gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); } } else if (blend === BLEND_TYPE.ADD) { if (premultipliedAlpha) { gl.blendFunc(gl.ONE, gl.ONE); } else { gl.blendFunc(gl.SRC_ALPHA, gl.ONE); } } else if (blend === BLEND_TYPE.SUB) { gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE); } else if (blend === BLEND_TYPE.MUL) { if (premultipliedAlpha) { gl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA); } else { gl.blendFunc(gl.ZERO, gl.SRC_COLOR); } } else { console.error('WebGLState: Invalid blending: ', blend); } } this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; } else { blendEquationAlpha = blendEquationAlpha || blendEquation; blendSrcAlpha = blendSrcAlpha || blendSrc; blendDstAlpha = blendDstAlpha || blendDst; const equationToGL = this.blendEquationToGL; const factorToGL = this.blendFactorToGL; if (blendEquation !== this.currentBlendEquation || blendEquationAlpha !== this.currentBlendEquationAlpha) { gl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]); this.currentBlendEquation = blendEquation; this.currentBlendEquationAlpha = blendEquationAlpha; } if (blendSrc !== this.currentBlendSrc || blendDst !== this.currentBlendDst || blendSrcAlpha !== this.currentBlendSrcAlpha || blendDstAlpha !== this.currentBlendDstAlpha) { gl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]); this.currentBlendSrc = blendSrc; this.currentBlendDst = blendDst; this.currentBlendSrcAlpha = blendSrcAlpha; this.currentBlendDstAlpha = blendDstAlpha; } } this.currentBlending = blend; this.currentPremultipliedAlpha = premultipliedAlpha; } setFlipSided(flipSided) { const gl = this.gl; if (this.currentFlipSided !== flipSided) { if (flipSided) { gl.frontFace(gl.CW); } else { gl.frontFace(gl.CCW); } this.currentFlipSided = flipSided; } } setCullFace(cullFace) { const gl = this.gl; if (cullFace !== CULL_FACE_TYPE.NONE) { this.enable(gl.CULL_FACE); if (cullFace !== this.currentCullFace) { if (cullFace === CULL_FACE_TYPE.BACK) { gl.cullFace(gl.BACK); } else if (cullFace === CULL_FACE_TYPE.FRONT) { gl.cullFace(gl.FRONT); } else { gl.cullFace(gl.FRONT_AND_BACK); } } } else { this.disable(gl.CULL_FACE); } this.currentCullFace = cullFace; } viewport(viewport) { const currentViewport = this.currentViewport; if (currentViewport.equals(viewport)) return; this.gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w); currentViewport.copy(viewport); } setLineWidth(width) { if (width !== this.currentLineWidth) { const lineWidthRange = this.capabilities.lineWidthRange; if (lineWidthRange[0] <= width && width <= lineWidthRange[1]) { this.gl.lineWidth(width); } else { console.warn('GL_ALIASED_LINE_WIDTH_RANGE is [' + lineWidthRange[0] + ',' + lineWidthRange[1] + '], but set to ' + width + '.'); } this.currentLineWidth = width; } } setPolygonOffset(polygonOffset, factor, units) { const gl = this.gl; if (polygonOffset) { this.enable(gl.POLYGON_OFFSET_FILL); if (this.currentPolygonOffsetFactor !== factor || this.currentPolygonOffsetUnits !== units) { gl.polygonOffset(factor, units); this.currentPolygonOffsetFactor = factor; this.currentPolygonOffsetUnits = units; } } else { this.disable(gl.POLYGON_OFFSET_FILL); } } setProgram(program) { if (this.currentProgram !== program) { this.gl.useProgram(program.program); this.currentProgram = program; } } bindBuffer(type, buffer) { const gl = this.gl; const boundBuffer = this.currentBoundBuffers[type]; if (boundBuffer !== buffer) { gl.bindBuffer(type, buffer); this.currentBoundBuffers[type] = buffer; } } activeTexture(slot) { const gl = this.gl; if (slot === undefined) { slot = gl.TEXTURE0 + this.capabilities.maxTextures - 1; } if (this.currentTextureSlot !== slot) { gl.activeTexture(slot); this.currentTextureSlot = slot; } } bindTexture(type, texture) { const gl = this.gl; if (this.currentTextureSlot === null) { this.activeTexture(); } let boundTexture = this.currentBoundTextures[this.currentTextureSlot]; if (boundTexture === undefined) { boundTexture = { type: undefined, texture: undefined }; this.currentBoundTextures[this.currentTextureSlot] = boundTexture; } if (boundTexture.type !== type || boundTexture.texture !== texture) { gl.bindTexture(type, texture || this.emptyTextures[type]); boundTexture.type = type; boundTexture.texture = texture; } } reset() { const gl = this.gl; gl.colorMask(true, true, true, true); gl.clearColor(0, 0, 0, 0); gl.depthMask(true); gl.depthFunc(gl.LESS); gl.clearDepth(1); gl.stencilMask(0xffffffff); gl.stencilFunc(gl.ALWAYS, 0, 0xffffffff); gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); gl.clearStencil(0); gl.disable(gl.BLEND); gl.disable(gl.CULL_FACE); gl.disable(gl.DEPTH_TEST); gl.disable(gl.POLYGON_OFFSET_FILL); gl.disable(gl.SCISSOR_TEST); gl.disable(gl.STENCIL_TEST); gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE); gl.blendEquation(gl.FUNC_ADD); gl.blendFunc(gl.ONE, gl.ZERO); gl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO); gl.cullFace(gl.BACK); gl.frontFace(gl.CCW); // gl.scissor(0, 0, gl.canvas.width, gl.canvas.height); gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); gl.lineWidth(1); gl.polygonOffset(0, 0); gl.useProgram(null); gl.bindFramebuffer(gl.FRAMEBUFFER, null); gl.activeTexture(gl.TEXTURE0); this.colorBuffer.reset(); this.depthBuffer.reset(); this.stencilBuffer.reset(); this.states = {}; this.currentBlending = null; this.currentBlendEquation = null; this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendEquationAlpha = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; this.currentPremultipliedAlpha = null; this.currentFlipSided = false; this.currentCullFace = null; this.currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height); this.currentLineWidth = null; this.currentPolygonOffsetFactor = null; this.currentPolygonOffsetUnits = null; this.currentProgram = null; this.currentBoundBuffers = {}; this.currentRenderTarget = null; // used in WebGLRenderTargets this.currentTextureSlot = null; this.currentBoundTextures = {}; } setMaterial(material, frontFaceCW) { this.setCullFace(material.side === DRAW_SIDE.DOUBLE ? CULL_FACE_TYPE.NONE : CULL_FACE_TYPE.BACK); let flipSided = material.side === DRAW_SIDE.BACK; if (frontFaceCW) flipSided = !flipSided; this.setFlipSided(flipSided); if (material.blending === BLEND_TYPE.NORMAL && material.transparent === false) { this.setBlending(BLEND_TYPE.NONE); } else { this.setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha); } this.depthBuffer.setFunc(material.depthFunc); this.depthBuffer.setTest(material.depthTest); this.depthBuffer.setMask(material.depthWrite); this.colorBuffer.setMask(material.colorWrite); const stencilTest = material.stencilTest; this.stencilBuffer.setTest(stencilTest); if (stencilTest) { this.stencilBuffer.setMask(material.stencilWriteMask); this.stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask, material.stencilFuncBack, material.stencilRefBack, material.stencilFuncMaskBack); this.stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass, material.stencilFailBack, material.stencilZFailBack, material.stencilZPassBack); } this.setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits); if (material.lineWidth !== undefined) { this.setLineWidth(material.lineWidth); } material.alphaToCoverage === true ? this.enable(this.gl.SAMPLE_ALPHA_TO_COVERAGE) : this.disable(this.gl.SAMPLE_ALPHA_TO_COVERAGE); } } class WebGLTextures extends PropertyMap { constructor(prefix, gl, state, capabilities, constants) { super(prefix); this._gl = gl; this._state = state; this._capabilities = capabilities; this._constants = constants; this._usedTextureUnits = 0; const that = this; function onTextureDispose(event) { const texture = event.target; const textureProperties = that.get(texture); texture.removeEventListener('dispose', onTextureDispose); if (textureProperties.__webglTexture && !textureProperties.__external) { gl.deleteTexture(textureProperties.__webglTexture); } if (textureProperties.__readBuffer) { gl.deleteBuffer(textureProperties.__readBuffer); } that.delete(texture); } this._onTextureDispose = onTextureDispose; this._wrappingToGL = { [TEXTURE_WRAP.REPEAT]: gl.REPEAT, [TEXTURE_WRAP.CLAMP_TO_EDGE]: gl.CLAMP_TO_EDGE, [TEXTURE_WRAP.MIRRORED_REPEAT]: gl.MIRRORED_REPEAT }; this._filterToGL = { [TEXTURE_FILTER.NEAREST]: gl.NEAREST, [TEXTURE_FILTER.LINEAR]: gl.LINEAR, [TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST]: gl.NEAREST_MIPMAP_NEAREST, [TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST]: gl.LINEAR_MIPMAP_NEAREST, [TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR]: gl.NEAREST_MIPMAP_LINEAR, [TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR]: gl.LINEAR_MIPMAP_LINEAR }; } allocTexUnit() { const textureUnit = this._usedTextureUnits++; if (textureUnit >= this._capabilities.maxTextures) { console.warn('trying to use ' + textureUnit + ' texture units while this GPU supports only ' + this._capabilities.maxTextures); } return textureUnit; } resetTextureUnits() { this._usedTextureUnits = 0; } setTexture(texture, slot) { const gl = this._gl; const capabilities = this._capabilities; const constants = this._constants; const state = this._state; if ((texture.isTexture3D || texture.isTexture2DArray) && capabilities.version < 2) { console.warn('WebGLTextures: Texture3D/Texture2DArray is not supported in WebGL1.0.'); return; } if (slot !== undefined) { slot = gl.TEXTURE0 + slot; } const textureProperties = this.get(texture); const textureTarget = getTextureTarget(gl, texture); const hasImage = texture.isTextureCube ? texture.images.length === 6 : !!texture.image; let singleImage = texture.isTextureCube ? texture.images[0] : texture.image; if (hasImage && textureProperties.__version !== texture.version // Do not initialize rtt texture, unless slot is undefined, // which means the caller just wants to bind the texture to the framebuffer, not use it for sampling. && (!singleImage.rtt || slot === undefined) // Do not initialize external texture && !textureProperties.__external) { if (textureProperties.__webglTexture === undefined) { texture.addEventListener('dispose', this._onTextureDispose); textureProperties.__webglTexture = gl.createTexture(); textureProperties.__webglTarget = textureTarget; } if (capabilities.version < 2 && texture.isTexture2D && !_isPowerOfTwo(singleImage) && textureNeedsPowerOfTwo(texture) && domCheck(singleImage)) { singleImage = makePowerOf2(singleImage); } const needFallback = capabilities.version < 2 && !_isPowerOfTwo(singleImage); const uploadMipmaps = texture.mipmaps.length > 0 && !needFallback; const glFormat = constants.getGLFormat(texture.format), glType = constants.getGLType(texture.type), glInternalFormat = texture.internalformat !== null ? constants.getGLInternalFormat(texture.internalformat) : getGLInternalFormat(gl, capabilities, glFormat, glType); textureProperties.__glFormat = glFormat; textureProperties.__glType = glType; textureProperties.__glInternalFormat = glInternalFormat; textureProperties.__width = singleImage.width; textureProperties.__height = singleImage.height; textureProperties.__maxMipLevel = uploadMipmaps ? texture.mipmaps.length - 1 : 0; state.activeTexture(slot); state.bindTexture(textureTarget, textureProperties.__webglTexture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); gl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment); gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE); this._setTextureParameters(texture, textureTarget, needFallback); if (texture.isTexture2D) { this._upload2DImage(texture, textureProperties, uploadMipmaps, singleImage); } else if (texture.isTextureCube) { this._uploadCubeImages(texture, textureProperties, uploadMipmaps); } else if (texture.isTexture3D) { this._upload3DImage(texture, textureProperties); } else if (texture.isTexture2DArray) { this._upload2DArrayImage(texture, textureProperties); } if (texture.generateMipmaps && !uploadMipmaps && !needFallback) { this.generateMipmaps(texture); } textureProperties.__version = texture.version; return textureProperties; } state.activeTexture(slot); state.bindTexture(textureTarget, textureProperties.__webglTexture); return textureProperties; } generateMipmaps(texture) { const gl = this._gl; const textureProperties = this.get(texture); gl.generateMipmap(textureProperties.__webglTarget); const width = textureProperties.__width, height = textureProperties.__height; // Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 textureProperties.__maxMipLevel = Math.log(Math.max(width, height)) * Math.LOG2E; } setTextureExternal(texture, webglTexture) { const gl = this._gl; const textureProperties = this.get(texture); if (!textureProperties.__external) { if (textureProperties.__webglTexture) { gl.deleteTexture(textureProperties.__webglTexture); } else { texture.addEventListener('dispose', this._onTextureDispose); } } textureProperties.__webglTexture = webglTexture; textureProperties.__external = true; } _setTextureParameters(texture, textureType, needFallback) { const gl = this._gl; const capabilities = this._capabilities; const wrappingToGL = this._wrappingToGL; const filterToGL = this._filterToGL; let wrapS = texture.wrapS, wrapT = texture.wrapT, wrapR = texture.wrapR, magFilter = texture.magFilter, minFilter = texture.minFilter; // fix for non power of 2 image in WebGL 1.0 if (needFallback) { wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE; wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE; if (texture.isTexture3D) { wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE; } if (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) { console.warn('Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to TEXTURE_WRAP.CLAMP_TO_EDGE.', texture); } magFilter = filterFallback(texture.magFilter); minFilter = filterFallback(texture.minFilter); if (texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR || texture.magFilter !== TEXTURE_FILTER.NEAREST && texture.magFilter !== TEXTURE_FILTER.LINEAR) { console.warn('Texture is not power of two. Texture.minFilter and Texture.magFilter should be set to TEXTURE_FILTER.NEAREST or TEXTURE_FILTER.LINEAR.', texture); } } gl.texParameteri(textureType, gl.TEXTURE_WRAP_S, wrappingToGL[wrapS]); gl.texParameteri(textureType, gl.TEXTURE_WRAP_T, wrappingToGL[wrapT]); if (texture.isTexture3D) { gl.texParameteri(textureType, gl.TEXTURE_WRAP_R, wrappingToGL[wrapR]); } gl.texParameteri(textureType, gl.TEXTURE_MAG_FILTER, filterToGL[magFilter]); gl.texParameteri(textureType, gl.TEXTURE_MIN_FILTER, filterToGL[minFilter]); // anisotropy if EXT_texture_filter_anisotropic exist const extension = capabilities.anisotropyExt; if (extension) { gl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.maxAnisotropy)); } if (capabilities.version >= 2) { if (texture.compare !== undefined) { gl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); gl.texParameteri(textureType, gl.TEXTURE_COMPARE_FUNC, texture.compare); } else { gl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.NONE); } } } _upload2DImage(texture, textureProperties, uploadMipmaps, image) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; if (domCheck(image)) { if (uploadMipmaps) { const mipmaps = texture.mipmaps; for (let level = 0, l = mipmaps.length; level < l; level++) { gl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level]); } } else { gl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image); } } else { if (uploadMipmaps) { const isCompressed = image.isCompressed; const mipmaps = texture.mipmaps; let mipmap; for (let level = 0, l = mipmaps.length; level < l; level++) { mipmap = mipmaps[level]; if (isCompressed) { gl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); } else { gl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data); } } } else { gl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data); } } } _uploadCubeImages(texture, textureProperties, uploadMipmaps) { const gl = this._gl; const glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const images = texture.images; for (let face = 0; face < 6; face++) { const image = images[face]; const glTarget = gl.TEXTURE_CUBE_MAP_POSITIVE_X + face; if (domCheck(image)) { if (uploadMipmaps) { const mipmaps = texture.mipmaps; for (let level = 0, l = mipmaps.length; level < l; level++) { gl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level][face]); } } else { gl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image); } } else { if (uploadMipmaps) { const isCompressed = image.isCompressed; const mipmaps = texture.mipmaps; let mipmap; for (let level = 0, l = mipmaps.length; level < l; level++) { mipmap = mipmaps[level][face]; if (isCompressed) { gl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); } else { gl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data); } } } else { gl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data); } } } } _upload3DImage(texture, textureProperties) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const image = texture.image; gl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data); } _upload2DArrayImage(texture, textureProperties) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const image = texture.image; if (texture.layerUpdates.size > 0) { for (const layerIndex of texture.layerUpdates) { const layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type); const layerData = image.data.subarray(layerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT, (layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT); gl.texSubImage3D(glTarget, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData); } texture.layerUpdates.clear(); } else { gl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data); } } } function textureNeedsPowerOfTwo(texture) { return texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR; } function filterFallback(filter) { if (filter === TEXTURE_FILTER.NEAREST || filter === TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR || filter === TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST) { return TEXTURE_FILTER.NEAREST; } return TEXTURE_FILTER.LINEAR; } function _isPowerOfTwo(image) { return MathUtils.isPowerOfTwo(image.width) && MathUtils.isPowerOfTwo(image.height); } let _canvas; function makePowerOf2(image) { if (_canvas === undefined) _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); _canvas.width = MathUtils.nearestPowerOfTwo(image.width); _canvas.height = MathUtils.nearestPowerOfTwo(image.height); const context = _canvas.getContext('2d'); context.drawImage(image, 0, 0, _canvas.width, _canvas.height); console.warn('image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image); return _canvas; } function getGLInternalFormat(gl, capabilities, glFormat, glType) { const isWebGL2 = capabilities.version >= 2; if (isWebGL2 === false) return glFormat; let glInternalFormat = glFormat; if (glFormat === gl.RED) { if (glType === gl.FLOAT) glInternalFormat = gl.R32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.R16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.R8; } if (glFormat === gl.RG) { if (glType === gl.FLOAT) glInternalFormat = gl.RG32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RG16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RG8; } if (glFormat === gl.RGB) { if (glType === gl.FLOAT) glInternalFormat = gl.RGB32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGB16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGB8; } if (glFormat === gl.RGBA) { if (glType === gl.FLOAT) glInternalFormat = gl.RGBA32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGBA16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGBA8; if (glType === gl.UNSIGNED_SHORT_4_4_4_4) glInternalFormat = gl.RGBA4; if (glType === gl.UNSIGNED_SHORT_5_5_5_1) glInternalFormat = gl.RGB5_A1; } if (glFormat === gl.DEPTH_COMPONENT || glFormat === gl.DEPTH_STENCIL) { glInternalFormat = gl.DEPTH_COMPONENT16; if (glType === gl.FLOAT) glInternalFormat = gl.DEPTH_COMPONENT32F; if (glType === gl.UNSIGNED_INT) glInternalFormat = gl.DEPTH_COMPONENT24; if (glType === gl.UNSIGNED_INT_24_8) glInternalFormat = gl.DEPTH24_STENCIL8; if (glType === gl.FLOAT_32_UNSIGNED_INT_24_8_REV) glInternalFormat = gl.DEPTH32F_STENCIL8; } if (glInternalFormat === gl.R16F || glInternalFormat === gl.R32F || glInternalFormat === gl.RG16F || glInternalFormat === gl.RG32F || glInternalFormat === gl.RGB16F || glInternalFormat === gl.RGB32F || glInternalFormat === gl.RGBA16F || glInternalFormat === gl.RGBA32F) { capabilities.getExtension('EXT_color_buffer_float'); } return glInternalFormat; } function domCheck(image) { return typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement || typeof HTMLVideoElement !== 'undefined' && image instanceof HTMLVideoElement || typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap; } function getByteLength(width, height, format, type) { const typeByteLength = getTextureTypeByteLength(type); switch (format) { // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml case PIXEL_FORMAT.ALPHA: return width * height; case PIXEL_FORMAT.LUMINANCE: return width * height; case PIXEL_FORMAT.LUMINANCE_ALPHA: return width * height * 2; case PIXEL_FORMAT.RED: return width * height / typeByteLength.components * typeByteLength.byteLength; case PIXEL_FORMAT.RED_INTEGER: return width * height / typeByteLength.components * typeByteLength.byteLength; case PIXEL_FORMAT.RG: return width * height * 2 / typeByteLength.components * typeByteLength.byteLength; case PIXEL_FORMAT.RG_INTEGER: return width * height * 2 / typeByteLength.components * typeByteLength.byteLength; case PIXEL_FORMAT.RGB: return width * height * 3 / typeByteLength.components * typeByteLength.byteLength; case PIXEL_FORMAT.RGBA: return width * height * 4 / typeByteLength.components * typeByteLength.byteLength; case PIXEL_FORMAT.RGBA_INTEGER: return width * height * 4 / typeByteLength.components * typeByteLength.byteLength; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/ case PIXEL_FORMAT.RGB_S3TC_DXT1: case PIXEL_FORMAT.RGBA_S3TC_DXT1: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; case PIXEL_FORMAT.RGBA_S3TC_DXT3: case PIXEL_FORMAT.RGBA_S3TC_DXT5: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/ case PIXEL_FORMAT.RGB_PVRTC_2BPPV1: case PIXEL_FORMAT.RGBA_PVRTC_2BPPV1: return Math.max(width, 16) * Math.max(height, 8) / 4; case PIXEL_FORMAT.RGB_PVRTC_4BPPV1: case PIXEL_FORMAT.RGBA_PVRTC_4BPPV1: return Math.max(width, 8) * Math.max(height, 8) / 2; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/ case PIXEL_FORMAT.RGB_ETC1: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/ case PIXEL_FORMAT.RGBA_ASTC_4x4: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/ case PIXEL_FORMAT.RGBA_BPTC: return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; } throw new Error(`Unable to determine texture byte length for ${format} format.`); } const _tempTypeByteLength = { byteLength: 0, components: 0 }; function getTextureTypeByteLength(type) { switch (type) { case PIXEL_TYPE.UNSIGNED_BYTE: case PIXEL_TYPE.ByteType: _tempTypeByteLength.byteLength = 1; _tempTypeByteLength.components = 1; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_SHORT: case PIXEL_TYPE.SHORT: case PIXEL_TYPE.HALF_FLOAT: _tempTypeByteLength.byteLength = 2; _tempTypeByteLength.components = 1; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4: case PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1: _tempTypeByteLength.byteLength = 2; _tempTypeByteLength.components = 4; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_INT: case PIXEL_TYPE.INT: case PIXEL_TYPE.FLOAT: _tempTypeByteLength.byteLength = 4; _tempTypeByteLength.components = 1; return _tempTypeByteLength; } throw new Error(`Unknown texture type ${type}.`); } function getTextureTarget(gl, texture) { if (texture.isTexture2D) { return gl.TEXTURE_2D; } else if (texture.isTextureCube) { return gl.TEXTURE_CUBE_MAP; } else if (texture.isTexture3D) { return gl.TEXTURE_3D; } else if (texture.isTexture2DArray) { return gl.TEXTURE_2D_ARRAY; } else { return gl.TEXTURE_2D; } } class WebGLRenderBuffers extends PropertyMap { constructor(prefix, gl, capabilities, constants) { super(prefix); this._gl = gl; this._capabilities = capabilities; this._constants = constants; const that = this; function onRenderBufferDispose(event) { const renderBuffer = event.target; renderBuffer.removeEventListener('dispose', onRenderBufferDispose); const renderBufferProperties = that.get(renderBuffer); if (renderBufferProperties.__webglRenderbuffer && !renderBufferProperties.__external) { gl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer); } that.delete(renderBuffer); } this._onRenderBufferDispose = onRenderBufferDispose; } setRenderBuffer(renderBuffer) { const gl = this._gl; const capabilities = this._capabilities; const constants = this._constants; const renderBufferProperties = this.get(renderBuffer); if (renderBufferProperties.__webglRenderbuffer === undefined) { renderBuffer.addEventListener('dispose', this._onRenderBufferDispose); renderBufferProperties.__webglRenderbuffer = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); const glFormat = constants.getGLInternalFormat(renderBuffer.format); if (renderBuffer.multipleSampling > 0) { if (capabilities.version < 2) { console.error('render buffer multipleSampling is not support in webgl 1.0.'); } gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(renderBuffer.multipleSampling, capabilities.maxSamples), glFormat, renderBuffer.width, renderBuffer.height); } else { gl.renderbufferStorage(gl.RENDERBUFFER, glFormat, renderBuffer.width, renderBuffer.height); } } else { gl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); } return renderBufferProperties; } setRenderBufferExternal(renderBuffer, webglRenderbuffer) { const gl = this._gl; const renderBufferProperties = this.get(renderBuffer); if (!renderBufferProperties.__external) { if (renderBufferProperties.__webglRenderbuffer) { gl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer); } else { renderBuffer.addEventListener('dispose', this._onRenderBufferDispose); } } renderBufferProperties.__webglRenderbuffer = webglRenderbuffer; renderBufferProperties.__external = true; } } class WebGLRenderTargets extends PropertyMap { constructor(prefix, gl, state, capabilities, textures, renderBuffers, constants) { super(prefix); this._gl = gl; this._state = state; this._capabilities = capabilities; this._textures = textures; this._renderBuffers = renderBuffers; this._constants = constants; const that = this; function onRenderTargetDispose(event) { const renderTarget = event.target; renderTarget.removeEventListener('dispose', onRenderTargetDispose); const renderTargetProperties = that.get(renderTarget); if (renderTargetProperties.__webglFramebuffer && !renderTargetProperties.__external) { gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); } that.delete(renderTarget); if (state.currentRenderTarget === renderTarget) { state.currentRenderTarget = null; } } this._onRenderTargetDispose = onRenderTargetDispose; } _setupRenderTarget(renderTarget) { const gl = this._gl; const state = this._state; const textures = this._textures; const renderBuffers = this._renderBuffers; const capabilities = this._capabilities; const renderTargetProperties = this.get(renderTarget); renderTarget.addEventListener('dispose', this._onRenderTargetDispose); const glFrameBuffer = gl.createFramebuffer(); const drawBuffers = []; renderTargetProperties.__webglFramebuffer = glFrameBuffer; renderTargetProperties.__drawBuffers = drawBuffers; renderTargetProperties.__currentActiveMipmapLevel = renderTarget.activeMipmapLevel; renderTargetProperties.__currentActiveLayer = renderTarget.activeLayer; gl.bindFramebuffer(gl.FRAMEBUFFER, glFrameBuffer); for (const attachTarget in renderTarget._attachments) { const glAttachTarget = attachTargetToGL[attachTarget]; if (glAttachTarget === gl.DEPTH_ATTACHMENT || glAttachTarget === gl.DEPTH_STENCIL_ATTACHMENT) { if (capabilities.version < 2 && !capabilities.getExtension('WEBGL_depth_texture')) { console.warn('WebGLRenderTargets: extension WEBGL_depth_texture is not support.'); } } else if (glAttachTarget !== gl.STENCIL_ATTACHMENT) { drawBuffers.push(glAttachTarget); } const attachment = renderTarget._attachments[attachTarget]; if (attachment.isTexture) { const textureProperties = textures.setTexture(attachment); if (attachment.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_2D, textureProperties.__webglTexture, renderTarget.activeMipmapLevel); } else if (attachment.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeLayer, textureProperties.__webglTexture, renderTarget.activeMipmapLevel); } else if (attachment.isTexture3D || attachment.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, glAttachTarget, textureProperties.__webglTexture, renderTarget.activeMipmapLevel, renderTarget.activeLayer); } state.bindTexture(textureProperties.__webglTarget, null); } else { const renderBufferProperties = renderBuffers.setRenderBuffer(attachment); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, glAttachTarget, gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); } } drawBuffers.sort(drawBufferSort); if (capabilities.version >= 2) { gl.drawBuffers(drawBuffers); } else if (capabilities.getExtension('WEBGL_draw_buffers')) { capabilities.getExtension('WEBGL_draw_buffers').drawBuffersWEBGL(drawBuffers); } } setRenderTarget(renderTarget) { const gl = this._gl; const state = this._state; const textures = this._textures; let renderTargetProperties; if (state.currentRenderTarget !== renderTarget) { if (renderTarget.isScreenRenderTarget) { gl.bindFramebuffer(gl.FRAMEBUFFER, null); } else { renderTargetProperties = this.get(renderTarget); if (renderTargetProperties.__webglFramebuffer === undefined) { this._setupRenderTarget(renderTarget); } else { gl.bindFramebuffer(gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); } } state.currentRenderTarget = renderTarget; } renderTargetProperties = this.get(renderTarget); if (renderTargetProperties.__external) return; const activeLayer = renderTarget.activeLayer; const activeMipmapLevel = renderTarget.activeMipmapLevel; if (renderTargetProperties.__currentActiveLayer !== activeLayer || renderTargetProperties.__currentActiveMipmapLevel !== activeMipmapLevel) { for (const attachTarget in renderTarget._attachments) { const attachment = renderTarget._attachments[attachTarget]; if (!attachment.isTexture) continue; const textureProperties = textures.get(attachment); if (attachment.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel); } else if (attachment.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeLayer, textureProperties.__webglTexture, activeMipmapLevel); } else if (attachment.isTexture3D || attachment.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], textureProperties.__webglTexture, activeMipmapLevel, activeLayer); } } renderTargetProperties.__currentActiveLayer = activeLayer; renderTargetProperties.__currentActiveMipmapLevel = activeMipmapLevel; } } blitRenderTarget(read, draw, color = true, depth = true, stencil = true) { const gl = this._gl; const state = this._state; const capabilities = this._capabilities; if (capabilities.version < 2) { console.warn('WebGLRenderTargets: blitFramebuffer not support by WebGL' + capabilities.version); return; } let needRestoreFramebuffer = false; let readBuffer = this.get(read).__webglFramebuffer; if (!readBuffer) { this._setupRenderTarget(read); readBuffer = this.get(read).__webglFramebuffer; needRestoreFramebuffer = true; } let drawBuffer = this.get(draw).__webglFramebuffer; if (!drawBuffer) { this._setupRenderTarget(draw); drawBuffer = this.get(draw).__webglFramebuffer; needRestoreFramebuffer = true; } if (needRestoreFramebuffer) { // restore framebuffer binding const framebuffer = state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget ? this.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); } gl.bindFramebuffer(gl.READ_FRAMEBUFFER, readBuffer); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, drawBuffer); let mask = 0; if (color) mask |= gl.COLOR_BUFFER_BIT; if (depth) mask |= gl.DEPTH_BUFFER_BIT; if (stencil) mask |= gl.STENCIL_BUFFER_BIT; // gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 0.0]); gl.blitFramebuffer(0, 0, read.width, read.height, 0, 0, draw.width, draw.height, mask, gl.NEAREST); } setFramebufferExternal(renderTarget, webglFramebuffer) { const renderTargetProperties = this.get(renderTarget); if (!renderTargetProperties.__external) { if (renderTargetProperties.__webglFramebuffer) { this._gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); } else { renderTarget.addEventListener('dispose', this._onRenderTargetDispose); } } renderTargetProperties.__webglFramebuffer = webglFramebuffer; renderTargetProperties.__external = true; } } const attachTargetToGL = { [ATTACHMENT.COLOR_ATTACHMENT0]: 0x8CE0, [ATTACHMENT.COLOR_ATTACHMENT1]: 0x8CE1, [ATTACHMENT.COLOR_ATTACHMENT2]: 0x8CE2, [ATTACHMENT.COLOR_ATTACHMENT3]: 0x8CE3, [ATTACHMENT.COLOR_ATTACHMENT4]: 0x8CE4, [ATTACHMENT.COLOR_ATTACHMENT5]: 0x8CE5, [ATTACHMENT.COLOR_ATTACHMENT6]: 0x8CE6, [ATTACHMENT.COLOR_ATTACHMENT7]: 0x8CE7, [ATTACHMENT.COLOR_ATTACHMENT8]: 0x8CE8, [ATTACHMENT.COLOR_ATTACHMENT9]: 0x8CE9, [ATTACHMENT.COLOR_ATTACHMENT10]: 0x8CEA, [ATTACHMENT.COLOR_ATTACHMENT11]: 0x8CEB, [ATTACHMENT.COLOR_ATTACHMENT12]: 0x8CEC, [ATTACHMENT.COLOR_ATTACHMENT13]: 0x8CED, [ATTACHMENT.COLOR_ATTACHMENT14]: 0x8CEE, [ATTACHMENT.COLOR_ATTACHMENT15]: 0x8CEF, [ATTACHMENT.DEPTH_ATTACHMENT]: 0x8D00, [ATTACHMENT.STENCIL_ATTACHMENT]: 0x8D20, [ATTACHMENT.DEPTH_STENCIL_ATTACHMENT]: 0x821A }; function drawBufferSort(a, b) { return a - b; } class WebGLBuffers extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; } setBuffer(buffer, bufferType, vertexArrayBindings) { const bufferProperties = this.get(buffer); const needCreate = bufferProperties.glBuffer === undefined; if (!needCreate && bufferProperties.version === buffer.version) return; // Avoid polluting the binding state if (vertexArrayBindings) { vertexArrayBindings.reset(); } if (needCreate || bufferProperties.__external) { // Because Buffer does not have a dispose interface at present, // when the version increases, the external is automatically closed this._createGLBuffer(bufferProperties, buffer, bufferType); } else { this._updateGLBuffer(bufferProperties.glBuffer, buffer, bufferType); bufferProperties.version = buffer.version; } } removeBuffer(buffer) { const gl = this._gl; const bufferProperties = this.get(buffer); if (bufferProperties.glBuffer && !bufferProperties.__external) { gl.deleteBuffer(bufferProperties.glBuffer); } this.delete(buffer); } setBufferExternal(buffer, webglBuffer) { const gl = this._gl; const bufferProperties = this.get(buffer); if (!bufferProperties.__external) { if (bufferProperties.glBuffer) { gl.deleteBuffer(bufferProperties.glBuffer); } } const type = getBufferType(gl, buffer.array); bufferProperties.glBuffer = webglBuffer; bufferProperties.type = type; bufferProperties.bytesPerElement = buffer.array.BYTES_PER_ELEMENT; bufferProperties.version = buffer.version; bufferProperties.__external = true; } _createGLBuffer(bufferProperties, buffer, bufferType) { const gl = this._gl; const array = buffer.array; const usage = buffer.usage; const glBuffer = gl.createBuffer(); gl.bindBuffer(bufferType, glBuffer); gl.bufferData(bufferType, array, usage); buffer.onUploadCallback(); const type = getBufferType(gl, array); bufferProperties.glBuffer = glBuffer; bufferProperties.type = type; bufferProperties.bytesPerElement = array.BYTES_PER_ELEMENT; bufferProperties.version = buffer.version; bufferProperties.__external = false; buffer.updateRange.count = -1; // reset range } _updateGLBuffer(glBuffer, buffer, bufferType) { const gl = this._gl; const capabilities = this._capabilities; const array = buffer.array; const updateRange = buffer.updateRange; gl.bindBuffer(bufferType, glBuffer); if (updateRange.count === -1) { // Not using update ranges gl.bufferSubData(bufferType, 0, array); } else { if (capabilities.version >= 2) { gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array, updateRange.offset, updateRange.count); } else { gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array.subarray(updateRange.offset, updateRange.offset + updateRange.count)); } updateRange.count = -1; // reset range } } } function getBufferType(gl, array) { let type; if (array instanceof Float32Array) { type = gl.FLOAT; } else if (array instanceof Float64Array) { console.warn('Unsupported data buffer format: Float64Array.'); } else if (array instanceof Uint16Array) { type = gl.UNSIGNED_SHORT; } else if (array instanceof Int16Array) { type = gl.SHORT; } else if (array instanceof Uint32Array) { type = gl.UNSIGNED_INT; } else if (array instanceof Int32Array) { type = gl.INT; } else if (array instanceof Int8Array) { type = gl.BYTE; } else if (array instanceof Uint8Array) { type = gl.UNSIGNED_BYTE; } else { type = gl.FLOAT; } return type; } class WebGLMaterials extends PropertyMap { constructor(prefix, programs, vertexArrayBindings) { super(prefix); const that = this; function onMaterialDispose(event) { const material = event.target; const materialProperties = that.get(material); material.removeEventListener('dispose', onMaterialDispose); const programList = materialProperties.programList; if (programList !== undefined) { for (let i = 0, l = programList.length; i < l; i++) { const program = programList[i]; vertexArrayBindings.releaseByProgram(program); programs.releaseProgram(program); } } that.delete(material); } this._onMaterialDispose = onMaterialDispose; this._programs = programs; this._vertexArrayBindings = vertexArrayBindings; } setMaterial(material) { const materialProperties = this.get(material); if (materialProperties.programList === undefined) { material.addEventListener('dispose', this._onMaterialDispose); materialProperties.programList = []; } // Set other material properties in renderer return materialProperties; } updateProgram(material, object, lightingState, renderStates, shaderCompileOptions) { const programs = this._programs; const vertexArrayBindings = this._vertexArrayBindings; const materialProperties = this.get(material); const props = programs.generateProps(material, object, lightingState, renderStates); const programCode = programs.generateProgramCode(props, material); const programList = materialProperties.programList; let targetProgram = findProgram(programList, programCode); if (targetProgram === null) { targetProgram = programs.getProgram(material, props, programCode, shaderCompileOptions); programList.unshift(targetProgram); if (programList.length > shaderCompileOptions.maxMaterialPrograms) { // release the last program const lastProgram = programList.pop(); vertexArrayBindings.releaseByProgram(lastProgram); programs.releaseProgram(lastProgram); } } materialProperties.currentProgram = targetProgram; } } function findProgram(list, code) { let index = 0, target = null; for (let l = list.length; index < l; index++) { const program = list[index]; if (program.code === code) { target = program; break; } } // move to the first if (target !== null && index > 0) { for (let i = index; i > 0; i--) { list[i] = list[i - 1]; } list[0] = target; } return target; } const emptyString = ''; class WebGLVertexArrayBindings extends PropertyMap { constructor(prefix, gl, capabilities, buffers) { super(prefix); this._gl = gl; this._capabilities = capabilities; this._buffers = buffers; this._isWebGL2 = capabilities.version >= 2; this._vaoExt = capabilities.getExtension('OES_vertex_array_object'); this._vaoCache = {}; // save vao cache here for releaseByProgram() method this._currentGeometryProgram = ''; this._currentVAO = null; } setup(object, geometry, program) { if (object.morphTargetInfluences) { this.reset(); this._setupVertexAttributes(program, geometry); this._currentGeometryProgram = emptyString; } else if (this._isWebGL2 || this._vaoExt) { // use VAO const geometryProperties = this.get(geometry); if (geometryProperties._vaos === undefined) { geometryProperties._vaos = {}; this._vaoCache[geometry.id] = geometryProperties._vaos; } let vao = geometryProperties._vaos[program.id]; if (!vao) { vao = geometryProperties._vaos[program.id] = { version: -1, object: this._createVAO() }; } this._bindVAO(vao.object); if (vao.version !== geometry.version) { this._setupVertexAttributes(program, geometry); vao.version = geometry.version; } } else { const geometryProgram = program.id + '_' + geometry.id + '_' + geometry.version; if (geometryProgram !== this._currentGeometryProgram) { this._setupVertexAttributes(program, geometry); this._currentGeometryProgram = geometryProgram; } } } releaseByGeometry(geometry) { const geometryProperties = this.get(geometry); const vaos = geometryProperties._vaos; if (vaos) { for (const programId in vaos) { const vao = vaos[programId]; if (!vao) continue; this._disposeVAO(vao.object); } delete geometryProperties._vaos; delete this._vaoCache[geometry.id]; } } releaseByProgram(program) { for (const geometryId in this._vaoCache) { const vaos = this._vaoCache[geometryId]; if (vaos) { const vao = vaos[program.id]; if (!vao) continue; this._disposeVAO(vao.object); delete vaos[program.id]; } } } reset(force) { if (this._currentVAO !== null || force) { if (this._isWebGL2) { this._gl.bindVertexArray(null); } else if (this._vaoExt) { this._vaoExt.bindVertexArrayOES(null); } this._currentVAO = null; } if (this._currentGeometryProgram !== emptyString) { this._currentGeometryProgram = emptyString; } } _createVAO() { if (this._isWebGL2) { return this._gl.createVertexArray(); } else if (this._vaoExt) { return this._vaoExt.createVertexArrayOES(); } return null; } _bindVAO(vao) { if (this._currentVAO !== vao) { if (this._isWebGL2) { this._gl.bindVertexArray(vao); } else if (this._vaoExt) { this._vaoExt.bindVertexArrayOES(vao); } this._currentVAO = vao; } } _disposeVAO(vao) { if (this._isWebGL2) { this._gl.deleteVertexArray(vao); } else if (this._vaoExt) { this._vaoExt.deleteVertexArrayOES(vao); } } _setupVertexAttributes(program, geometry) { const gl = this._gl; const isWebGL2 = this._isWebGL2; const attributes = program.getAttributes(); const capabilities = this._capabilities; const buffers = this._buffers; for (const key in attributes) { const programAttribute = attributes[key]; const geometryAttribute = geometry.getAttribute(key); if (geometryAttribute) { const size = geometryAttribute.size; if (programAttribute.count !== size) { console.warn('WebGLVertexArrayBindings: attribute ' + key + ' size not match! ' + programAttribute.count + ' : ' + size); } const buffer = geometryAttribute.buffer; const bufferProperties = buffers.get(buffer); const type = bufferProperties.type; const integer = isWebGL2 && (programAttribute.format === gl.INT || programAttribute.format === gl.UNSIGNED_INT); for (let i = 0, l = programAttribute.locationSize; i < l; i++) { gl.enableVertexAttribArray(programAttribute.location + i); } if (geometryAttribute.divisor > 0) { // use instancing for (let i = 0, l = programAttribute.locationSize; i < l; i++) { if (isWebGL2) { gl.vertexAttribDivisor(programAttribute.location + i, geometryAttribute.divisor); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(programAttribute.location + i, geometryAttribute.divisor); } else { console.warn('vertexAttribDivisor not supported'); } } } const bytesPerElement = bufferProperties.bytesPerElement; const glBuffer = bufferProperties.glBuffer; const stride = buffer.stride; const offset = geometryAttribute.offset; const normalized = geometryAttribute.normalized; gl.bindBuffer(gl.ARRAY_BUFFER, glBuffer); if (programAttribute.count === stride && programAttribute.locationSize === 1) { this._vertexAttribPointer(programAttribute.location, programAttribute.count, type, normalized, 0, 0, integer); } else { for (let i = 0; i < programAttribute.locationSize; i++) { this._vertexAttribPointer(programAttribute.location + i, programAttribute.count / programAttribute.locationSize, type, normalized, bytesPerElement * stride, bytesPerElement * (offset + programAttribute.count / programAttribute.locationSize * i), integer); } } } } // bind index if could if (geometry.index) { const indexBufferProperties = buffers.get(geometry.index.buffer); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBufferProperties.glBuffer); } } _vertexAttribPointer(index, size, type, normalized, stride, offset, integer) { const gl = this._gl; if (integer) { gl.vertexAttribIPointer(index, size, type, stride, offset); } else { gl.vertexAttribPointer(index, size, type, normalized, stride, offset); } } } class WebGLClusteredLighting { constructor(options) { this.lightsTexture = new LightsTexture(); this.lightsTexture.initLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT); this.cellsTexture = new CellsTexture(); this.cellsTexture.initCells(options.gridDimensions, options.maxLightsPerCell); this._zClip = options.zClip.clone(); this._cellsTextureEmpty = false; this.cellsTransform = { clips: [0, 0], // near, far factors: [0, 0, 0, 0], // logFactor1, logFactor2, persp:tan(fov/2)|ortho:-height/2, aspect perspective: true }; } dispose() { this._cellsTextureEmpty = false; this.cellsTexture.dispose(); this.lightsTexture.dispose(); } setOptions(options) { this.lightsTexture.updateLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT); this.cellsTexture.updateCells(options.gridDimensions, options.maxLightsPerCell); this._zClip.copy(options.zClip); } update(lightingGroup, cameraData, lightsNeedsUpdate = true) { this._updateCellsTransform(cameraData); this.cellsTexture.resetLightIndices(); const cellsTable = this.cellsTexture.cellsInfo.table; const cellsTransform = this.cellsTransform; let lightIndicesWritten = false; for (let i = 0; i < lightingGroup.pointsNum; i++) { const pointLight = lightingGroup.point[i]; getPointLightBoundingSphere(pointLight, _lightSphere); _lightSphere.center.applyMatrix4(cameraData.viewMatrix); _lightSphere.center.z *= -1; if (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) { lightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i) || lightIndicesWritten; lightsNeedsUpdate && this.lightsTexture.setPointLight(i, pointLight); } } for (let i = 0; i < lightingGroup.spotsNum; i++) { const spotLight = lightingGroup.spot[i]; getSpotLightBoundingSphere(spotLight, _lightSphere); _lightSphere.center.applyMatrix4(cameraData.viewMatrix); _lightSphere.center.z *= -1; if (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) { lightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i + lightingGroup.pointsNum) || lightIndicesWritten; lightsNeedsUpdate && this.lightsTexture.setSpotLight(i + lightingGroup.pointsNum, spotLight); } } lightIndicesWritten && lightsNeedsUpdate && this.lightsTexture.version++; (lightIndicesWritten || !this._cellsTextureEmpty) && this.cellsTexture.version++; this._cellsTextureEmpty = !lightIndicesWritten; } _updateCellsTransform(cameraData) { const { clips, factors } = this.cellsTransform; this._zClip.toArray(clips); clips[0] = clips[0] > 0 ? clips[0] : cameraData.near; clips[1] = clips[1] > 0 ? clips[1] : cameraData.far; const cz = this.cellsTexture.cellsInfo.table[2]; const _logFarNear = Math.log(clips[1] / clips[0]); factors[0] = cz / _logFarNear; factors[1] = -cz * Math.log(clips[0]) / _logFarNear; const perspective = _isPerspectiveMatrix(cameraData.projectionMatrix); const elements = cameraData.projectionMatrix.elements; factors[2] = (perspective ? 1 : -1) / elements[5]; // persp: tan(fov / 2), ortho: -height / 2 factors[3] = elements[5] / elements[0]; // aspect: (width / height) this.cellsTransform.perspective = perspective; } } class CellsTexture extends Texture2D { constructor() { super(); this.format = PIXEL_FORMAT.RED; this.type = PIXEL_TYPE.HALF_FLOAT; this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; this.unpackAlignment = 1; this.cellsInfo = { table: [], maxLightsPerCell: 0, textureSize: [], dotData: [] }; this._counts = null; } initCells(cellTable, maxLightsPerCell) { const numCells = cellTable.x * cellTable.y * cellTable.z; const numPixels = numCells * maxLightsPerCell; // TODO - better texture size calculation let width = Math.ceil(Math.sqrt(numPixels)); width = Math.ceil(width / maxLightsPerCell) * maxLightsPerCell; const height = Math.ceil(numPixels / width); const data = new Uint16Array(width * height); this.image = { data, width, height }; cellTable.toArray(this.cellsInfo.table); this.cellsInfo.maxLightsPerCell = maxLightsPerCell; this.cellsInfo.textureSize[0] = width; this.cellsInfo.textureSize[1] = 1 / width; this.cellsInfo.textureSize[2] = 1 / height; this.cellsInfo.dotData[0] = maxLightsPerCell; this.cellsInfo.dotData[1] = cellTable.x * cellTable.z * maxLightsPerCell; this.cellsInfo.dotData[2] = cellTable.x * maxLightsPerCell; this._counts = new Int32Array(numCells); } updateCells(cellTable, maxLightsPerCell) { const cellsInfo = this.cellsInfo; if (_vec3_1.fromArray(cellsInfo.table).equals(cellTable) && cellsInfo.maxLightsPerCell === maxLightsPerCell) { return; } this.dispose(); this.initCells(cellTable, maxLightsPerCell); this.version++; } resetLightIndices() { this.image.data.fill(0); this._counts.fill(0); } setLightIndex(cellsRange, index) { const data = this.image.data; const counts = this._counts; const { table, maxLightsPerCell } = this.cellsInfo; const { min, max } = cellsRange; let needsUpdate = false; for (let x = min.x; x <= max.x; x++) { for (let z = min.z; z <= max.z; z++) { for (let y = min.y; y <= max.y; y++) { const idx = x + table[0] * (z + y * table[2]); const count = counts[idx]; if (count < maxLightsPerCell) { const offset = idx * maxLightsPerCell + count; data[offset] = MathUtils.toHalfFloat(index + 1); // 0 is reserved for empty cell, so we offset by 1 counts[idx]++; needsUpdate = true; } } } } return needsUpdate; } } class LightsTexture extends Texture2D { constructor() { super(); this.format = PIXEL_FORMAT.RGBA; this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; } initLights(maxLights, type) { const size = lightsTextureSize(maxLights); const arrayType = type === PIXEL_TYPE.FLOAT ? Float32Array : Uint16Array; const data = new arrayType(size * size * 4); // eslint-disable-line new-cap this.image = { data, width: size, height: size }; this.type = type; } updateLights(maxLights, type) { const size = lightsTextureSize(maxLights); if (size === this.image.width && type === this.type) return; this.dispose(); this.initLights(maxLights, type); this.version++; } setPointLight(index, lightInfo) { const data = this.image.data; const halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT; const start = index * LIGHT_STRIDE * 4; const { color, decay, position, distance } = lightInfo; // pixel 0 - R: lightType, G: -, B: -, A: - data[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(1) : 1; // pixel 1 - R: color.r, G: color.g, B: color.b, A: decay data[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0]; data[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1]; data[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2]; data[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay; // pixel 2 - R: position.x, G: position.y, B: position.z, A: distance data[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0]; data[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1]; data[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2]; data[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance; // pixel 3 - R: -, G: -, B: -, A: - } setSpotLight(index, lightInfo) { const data = this.image.data; const halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT; const start = index * LIGHT_STRIDE * 4; const { color, decay, position, distance, direction, coneCos, penumbraCos } = lightInfo; // pixel 0 - R: lightType, G: penumbraCos, B: -, A: - data[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(2) : 2; data[start + 0 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(penumbraCos) : penumbraCos; // pixel 1 - R: color.r, G: color.g, B: color.b, A: decay data[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0]; data[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1]; data[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2]; data[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay; // pixel 2 - R: position.x, G: position.y, B: position.z, A: distance data[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0]; data[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1]; data[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2]; data[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance; // pixel 3 - R: direction.x, G: direction.y, B: direction.z, A: coneCos data[start + 3 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(direction[0]) : direction[0]; data[start + 3 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(direction[1]) : direction[1]; data[start + 3 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(direction[2]) : direction[2]; data[start + 3 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(coneCos) : coneCos; } } const LIGHT_STRIDE = 4; const _lightSphere = new Sphere(); const _cellsRange = new Box3(); const _vec3_1 = new Vector3(); function getPointLightBoundingSphere(light, sphere) { sphere.center.fromArray(light.position); sphere.radius = light.distance; } function getSpotLightBoundingSphere(light, sphere) { if (light.coneCos < 0.70710678118) { // obtuse angle _vec3_1.fromArray(light.direction).multiplyScalar(light.distance * light.coneCos); sphere.center.fromArray(light.position).add(_vec3_1); sphere.radius = light.distance * Math.sqrt(1 - light.coneCos * light.coneCos); } else { _vec3_1.fromArray(light.direction).multiplyScalar(light.distance / (light.coneCos * 2)); sphere.center.fromArray(light.position).add(_vec3_1); sphere.radius = light.distance / (light.coneCos * 2); } } function lightsTextureSize(maxLights) { return Math.max(MathUtils.nextPowerOfTwo(Math.ceil(Math.sqrt(maxLights * LIGHT_STRIDE))), LIGHT_STRIDE); } function _isPerspectiveMatrix(m) { return m.elements[11] === -1; } function getCellsRange(lightSphere, cellsTable, cellsTransform, cellsRange) { const { center, radius } = lightSphere; const { clips, factors, perspective } = cellsTransform; let zMin = center.z - radius; const zMax = center.z + radius; if (zMin > clips[1] || zMax < clips[0]) { return false; } zMin = Math.max(zMin, clips[0]); const zStart = Math.floor(Math.log(zMin) * factors[0] + factors[1]); const zEnd = Math.min(Math.floor(Math.log(zMax) * factors[0] + factors[1]), cellsTable[2] - 1); const halfFrustumHeight = (perspective ? Math.abs(center.z) : -1) * factors[2]; const invH = 1 / (2 * halfFrustumHeight); const yMin = (center.y - radius) * invH + 0.5; const yMax = (center.y + radius) * invH + 0.5; if (yMin > 1 || yMax < 0) { return false; } const yStart = Math.max(Math.floor(yMin * cellsTable[1]), 0); const yEnd = Math.min(Math.floor(yMax * cellsTable[1]), cellsTable[1] - 1); const halfFrustumWidth = halfFrustumHeight * factors[3]; const invW = 1 / (2 * halfFrustumWidth); const xMin = (center.x - radius) * invW + 0.5; const xMax = (center.x + radius) * invW + 0.5; if (xMin > 1 || xMax < 0) { return false; } const xStart = Math.max(Math.floor(xMin * cellsTable[0]), 0); const xEnd = Math.min(Math.floor(xMax * cellsTable[0]), cellsTable[0] - 1); cellsRange.min.set(xStart, yStart, zStart); cellsRange.max.set(xEnd, yEnd, zEnd); return true; } class WebGLLights extends PropertyMap { constructor(prefix, capabilities, textures) { super(prefix); const that = this; function onLightingGroupDispose(event) { const lightingGroup = event.target; const lightingProperties = that.get(lightingGroup); lightingGroup.removeEventListener('dispose', onLightingGroupDispose); if (lightingProperties.clustered) { lightingProperties.clustered.dispose(); } that.delete(lightingGroup); } this._onLightingGroupDispose = onLightingGroupDispose; this._capabilities = capabilities; this._textures = textures; } setLightingGroup(lightingGroup, passInfo, options, cameraData) { const lightingProperties = this.get(lightingGroup); // Skip early if this lighting group has been set in this pass. if (lightingProperties.pass === passInfo.count) { return lightingProperties; } lightingProperties.pass = passInfo.count; if (lightingProperties.state === undefined) { lightingGroup.addEventListener('dispose', this._onLightingGroupDispose); lightingProperties.state = new LightingState(); lightingProperties.uploadVersion = 0; } // Skip early if this lighting group is empty if (lightingGroup.totalNum === 0) { return lightingProperties; } const clusteredOptions = options.clustered; const clusteredEnabled = clusteredOptions.enabled; let clusteredLightsChanged = false; if (lightingProperties.lightingVersion !== lightingGroup.version || lightingProperties.clusteredEnabled !== clusteredEnabled) { lightingProperties.state.update(lightingGroup, clusteredEnabled); lightingProperties.uploadVersion++; const hasClusteredLights = lightingProperties.state._factor[10] > 0; lightingProperties.lightingVersion = lightingGroup.version; lightingProperties.clusteredEnabled = clusteredEnabled; lightingProperties.hasClusteredLights = hasClusteredLights; clusteredLightsChanged = hasClusteredLights; // prepare clustered lighting if (hasClusteredLights && !lightingProperties.clustered) { lightingProperties.clustered = new WebGLClusteredLighting(clusteredOptions); lightingProperties.clusteredOptionVersion = clusteredOptions.version; } else if (!clusteredEnabled && lightingProperties.clustered) { lightingProperties.clustered.dispose(); delete lightingProperties.clustered; } } if (lightingProperties.hasClusteredLights) { if (lightingProperties.clusteredOptionVersion !== clusteredOptions.version) { lightingProperties.clustered.setOptions(clusteredOptions); lightingProperties.clusteredOptionVersion = clusteredOptions.version; clusteredLightsChanged = true; } let cameraChanged = false; if (lightingProperties.cameraId !== cameraData.id || lightingProperties.cameraVersion !== cameraData.version) { lightingProperties.cameraId = cameraData.id; lightingProperties.cameraVersion = cameraData.version; cameraChanged = true; } if (clusteredLightsChanged || cameraChanged) { lightingProperties.clustered.update(lightingGroup, cameraData, clusteredLightsChanged); } } return lightingProperties; } uploadUniforms(program, lightingGroup, disableShadowSampler) { const lightingGroupProperties = this.get(lightingGroup); let refresh = false; if (program.lightId !== lightingGroup.id || program.lightVersion !== lightingGroupProperties.uploadVersion) { refresh = true; program.lightId = lightingGroup.id; program.lightVersion = lightingGroupProperties.uploadVersion; } const uniforms = program.getUniforms(); const capabilities = this._capabilities; const textures = this._textures; const lightingFactor = lightingGroupProperties.state._factor; if (lightingFactor[0] && refresh) { uniforms.set('u_AmbientLightColor', lightingGroup.ambient); } if (lightingFactor[1] && refresh) { uniforms.set('u_SphericalHarmonicsLightData', lightingGroup.sh); } if (lightingFactor[2] > 0 && refresh) { uniforms.set('u_Hemi', lightingGroup.hemisphere); } if (lightingFactor[3] > 0) { if (refresh) uniforms.set('u_Directional', lightingGroup.directional); if (lightingFactor[7] > 0) { if (refresh) uniforms.set('u_DirectionalShadow', lightingGroup.directionalShadow); if (uniforms.has('directionalShadowMap')) { if (capabilities.version >= 2 && !disableShadowSampler) { uniforms.set('directionalShadowMap', lightingGroup.directionalShadowDepthMap, textures); } else { uniforms.set('directionalShadowMap', lightingGroup.directionalShadowMap, textures); } uniforms.set('directionalShadowMatrix', lightingGroup.directionalShadowMatrix); } if (uniforms.has('directionalDepthMap')) { uniforms.set('directionalDepthMap', lightingGroup.directionalShadowMap, textures); } } } if (lightingFactor[4] > 0) { if (refresh) uniforms.set('u_Point', lightingGroup.point); if (lightingFactor[8] > 0) { if (refresh) uniforms.set('u_PointShadow', lightingGroup.pointShadow); if (uniforms.has('pointShadowMap')) { uniforms.set('pointShadowMap', lightingGroup.pointShadowMap, textures); uniforms.set('pointShadowMatrix', lightingGroup.pointShadowMatrix); } } } if (lightingFactor[5] > 0) { if (refresh) uniforms.set('u_Spot', lightingGroup.spot); if (lightingFactor[9] > 0) { if (refresh) uniforms.set('u_SpotShadow', lightingGroup.spotShadow); if (uniforms.has('spotShadowMap')) { if (capabilities.version >= 2 && !disableShadowSampler) { uniforms.set('spotShadowMap', lightingGroup.spotShadowDepthMap, textures); } else { uniforms.set('spotShadowMap', lightingGroup.spotShadowMap, textures); } uniforms.set('spotShadowMatrix', lightingGroup.spotShadowMatrix); } if (uniforms.has('spotDepthMap')) { uniforms.set('spotDepthMap', lightingGroup.spotShadowMap, textures); } } } if (lightingFactor[6] > 0) { if (refresh) uniforms.set('u_RectArea', lightingGroup.rectArea); if (lightingGroup.LTC1 && lightingGroup.LTC2) { uniforms.set('ltc_1', lightingGroup.LTC1, textures); uniforms.set('ltc_2', lightingGroup.LTC2, textures); } else { console.warn('WebGLRenderer: RectAreaLight.LTC1 and LTC2 need to be set before use.'); } } if (lightingFactor[10] > 0) { const clusteredLighting = lightingGroupProperties.clustered; const cellsInfo = clusteredLighting.cellsTexture.cellsInfo; uniforms.set('maxLightsPerCell', cellsInfo.maxLightsPerCell); uniforms.set('cells', cellsInfo.table); uniforms.set('cellsDotData', cellsInfo.dotData); uniforms.set('cellsTextureSize', cellsInfo.textureSize); uniforms.set('cellsTransformFactors', clusteredLighting.cellsTransform.factors); uniforms.set('lightsTexture', clusteredLighting.lightsTexture, textures); uniforms.set('cellsTexture', clusteredLighting.cellsTexture, textures); } } } class LightingState { constructor() { this._factor = new Uint16Array(11); this._totalNum = 0; this._shadowsNum = 0; } update(lightingGroup, clusteredEnabled) { const selfFactor = this._factor; selfFactor[0] = lightingGroup.useAmbient ? 1 : 0; selfFactor[1] = lightingGroup.useSphericalHarmonics ? 1 : 0; selfFactor[2] = lightingGroup.hemisNum; selfFactor[3] = lightingGroup.directsNum; selfFactor[4] = lightingGroup.pointsNum; selfFactor[5] = lightingGroup.spotsNum; selfFactor[6] = lightingGroup.rectAreaNum; selfFactor[7] = lightingGroup.directShadowNum; selfFactor[8] = lightingGroup.pointShadowNum; selfFactor[9] = lightingGroup.spotShadowNum; selfFactor[10] = 0; this._totalNum = lightingGroup.totalNum; this._shadowsNum = lightingGroup.shadowsNum; if (clusteredEnabled) { const clusteredPointsNum = selfFactor[4] - selfFactor[8]; const clusteredSpotsNum = selfFactor[5] - selfFactor[9]; selfFactor[4] = selfFactor[8]; selfFactor[5] = selfFactor[9]; selfFactor[10] = clusteredPointsNum + clusteredSpotsNum > 0 ? 1 : 0; } } compare(factor) { if (!factor) { return false; } const selfFactor = this._factor; for (let i = 0, l = factor.length; i < l; i++) { if (selfFactor[i] !== factor[i]) { return false; } } return true; } copyTo(factor) { const selfFactor = this._factor; if (!factor) { factor = new selfFactor.constructor(this._factor.length); } factor.set(selfFactor); return factor; } hasLight() { return this._totalNum > 0; } hasShadow() { return this._shadowsNum > 0; } setProgramProps(props, receiveShadow) { const selfFactor = this._factor; props.useAmbientLight = selfFactor[0]; props.useSphericalHarmonicsLight = selfFactor[1]; props.hemisphereLightNum = selfFactor[2]; props.directLightNum = selfFactor[3]; props.pointLightNum = selfFactor[4]; props.spotLightNum = selfFactor[5]; props.rectAreaLightNum = selfFactor[6]; props.directShadowNum = receiveShadow ? selfFactor[7] : 0; props.pointShadowNum = receiveShadow ? selfFactor[8] : 0; props.spotShadowNum = receiveShadow ? selfFactor[9] : 0; props.useClusteredLights = selfFactor[10]; props.useShadow = this._shadowsNum > 0 && receiveShadow; } } const helpVector4 = new Vector4(); const helpMatrix3 = new Matrix3(); const helpMatrix4 = new Matrix4(); const influencesList = new WeakMap(); const morphInfluences = new Float32Array(8); const _envData = { map: null, diffuse: 1, specular: 1 }; let _clippingPlanesData = new Float32Array([]); function defaultGetGeometry(renderable) { return renderable.geometry; } function defaultGetMaterial(renderable) { return renderable.material; } function defaultIfRender(renderable) { return true; } const _emptyLightingGroup = new LightingGroup(); function getLightingGroup(lighting, material) { if (!material.acceptLight) { return _emptyLightingGroup; } const lightingGroup = lighting.getGroup(material.lightingGroup); if (lightingGroup && lightingGroup.totalNum > 0) { return lightingGroup; } return _emptyLightingGroup; } function clientWaitAsync(gl) { const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0); gl.flush(); return new Promise(function (resolve, reject) { function test() { const res = gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0); if (res === gl.WAIT_FAILED) { gl.deleteSync(sync); reject(); return; } if (res === gl.TIMEOUT_EXPIRED) { requestAnimationFrame(test); return; } gl.deleteSync(sync); resolve(); } test(); }); } /** * The WebGL renderer. * @extends ThinRenderer */ class WebGLRenderer extends ThinRenderer { /** * Create a WebGLRenderer. * @param {WebGLRenderingContext} [context] - The WebGL Rendering Context privided by canvas. * If not provided, you must call {@link WebGLRenderer.init} method with a valid context * before using this renderer. */ constructor(context) { super(); /** * An object containing details about the capabilities of the current RenderingContext. * @type {WebGLCapabilities} */ this.capabilities = {}; this._textures = null; this._renderBuffers = null; this._renderTargets = null; this._buffers = null; this._geometries = null; this._lights = null; this._programs = null; this._materials = null; this._state = null; this._vertexArrayBindings = null; if (context) { this.init(context); } // Cache current material if beginRender is called. this._currentMaterial = null; this._currentOcclusionQuerySet = null; this._currentTimestampWrites = { querySet: null, beginningOfPassWriteIndex: -1, endOfPassWriteIndex: -1 }; } init(context, options = {}) { if (!context) { context = this.context; } if (!context) { throw new Error('WebGLRenderer.init: context must be provided.'); } this.context = context; const prefix = `_gl${this.increaseId()}`; const capabilities = new WebGLCapabilities(context); const constants = new WebGLConstants(context, capabilities); const state = new WebGLState(context, capabilities); const textures = new WebGLTextures(prefix, context, state, capabilities, constants); const renderBuffers = new WebGLRenderBuffers(prefix, context, capabilities, constants); const renderTargets = new WebGLRenderTargets(prefix, context, state, capabilities, textures, renderBuffers, constants); const buffers = new WebGLBuffers(prefix, context, capabilities); const vertexArrayBindings = new WebGLVertexArrayBindings(prefix, context, capabilities, buffers); const geometries = new WebGLGeometries(prefix, context, buffers, vertexArrayBindings); const lights = new WebGLLights(prefix, capabilities, textures); const programs = new WebGLPrograms(context, state, capabilities); const materials = new WebGLMaterials(prefix, programs, vertexArrayBindings); const querySets = new WebGLQuerySets(prefix, context, capabilities); this.capabilities = capabilities; this._constants = constants; this._textures = textures; this._renderBuffers = renderBuffers; this._renderTargets = renderTargets; this._buffers = buffers; this._geometries = geometries; this._lights = lights; this._programs = programs; this._materials = materials; this._state = state; this._vertexArrayBindings = vertexArrayBindings; this._querySets = querySets; return Promise.resolve(this); } beginRender(renderTarget) { super.beginRender(renderTarget); if (renderTarget) { this._renderTargets.setRenderTarget(renderTarget); const gl = this.context; const state = this._state; let clearBits = 0; if (renderTarget.clearColor) { state.colorBuffer.setClear(renderTarget.colorClearValue.r, renderTarget.colorClearValue.g, renderTarget.colorClearValue.b, renderTarget.colorClearValue.a); clearBits |= gl.COLOR_BUFFER_BIT; } if (renderTarget.clearDepth) { state.depthBuffer.setClear(renderTarget.depthClearValue); clearBits |= gl.DEPTH_BUFFER_BIT; } if (renderTarget.clearStencil) { state.stencilBuffer.setClear(renderTarget.stencilClearValue); clearBits |= gl.STENCIL_BUFFER_BIT; } if (clearBits > 0) { // Prevent warning when bits is equal to zero gl.clear(clearBits); } this._currentOcclusionQuerySet = renderTarget.occlusionQuerySet; this._currentTimestampWrites.querySet = renderTarget.timestampWrites.querySet; this._currentTimestampWrites.beginningOfPassWriteIndex = renderTarget.timestampWrites.beginningOfPassWriteIndex; this._currentTimestampWrites.endOfPassWriteIndex = renderTarget.timestampWrites.endOfPassWriteIndex; } if (this._currentOcclusionQuerySet) { this._querySets.setQuerySet(this._currentOcclusionQuerySet); } if (this._currentTimestampWrites.querySet) { this._querySets.setQuerySet(this._currentTimestampWrites.querySet); if (this.capabilities.canUseTimestamp) { this._querySets.queryCounter(this._currentTimestampWrites.querySet, this._currentTimestampWrites.beginningOfPassWriteIndex); } else { // fallback to use TIME_ELAPSED_EXT this._querySets.beginQuery(this._currentTimestampWrites.querySet, this._currentTimestampWrites.endOfPassWriteIndex); } } } endRender() { if (this._currentTimestampWrites.querySet) { if (this.capabilities.canUseTimestamp) { this._querySets.queryCounter(this._currentTimestampWrites.querySet, this._currentTimestampWrites.endOfPassWriteIndex); } else { // fallback to use TIME_ELAPSED_EXT this._querySets.endQuery(this._currentTimestampWrites.querySet); } } // Ensure depth buffer writing is enabled so it can be cleared on next render const state = this._state; state.depthBuffer.setTest(true); state.depthBuffer.setMask(true); state.colorBuffer.setMask(true); this._currentMaterial = null; // Automatically clear the occlusion query set and timestamp writes this._currentOcclusionQuerySet = null; this._currentTimestampWrites.querySet = null; super.endRender(); } renderRenderableItem(renderable, renderStates, options) { const state = this._state; const capabilities = this.capabilities; const vertexArrayBindings = this._vertexArrayBindings; const textures = this._textures; const passInfo = this._passInfo; const getGeometry = options.getGeometry || defaultGetGeometry; const getMaterial = options.getMaterial || defaultGetMaterial; const beforeRender = options.beforeRender; const afterRender = options.afterRender; const ifRender = options.ifRender || defaultIfRender; const renderInfo = options.renderInfo; const sceneData = renderStates.scene; const cameraData = renderStates.camera; const currentRenderTarget = state.currentRenderTarget; if (!ifRender(renderable)) { return; } if (!passInfo.enabled) { console.warn('WebGLRenderer: beginRender must be called before renderRenderableItem.'); return; } const object = renderable.object; const material = getMaterial.call(this, renderable); const geometry = getGeometry.call(this, renderable); const group = renderable.group; const fog = material.fog ? sceneData.fog : null; const lightingGroup = getLightingGroup(renderStates.lighting, material); const lightingState = this._lights.setLightingGroup(lightingGroup, passInfo, this.lightingOptions, cameraData).state; const hasLighting = lightingState.hasLight(); const hasShadow = lightingState.hasShadow() && object.receiveShadow; _envData.map = material.envMap !== undefined ? material.envMap || sceneData.environment : null; _envData.diffuse = sceneData.envDiffuseIntensity * material.envMapIntensity; _envData.specular = sceneData.envSpecularIntensity * material.envMapIntensity; let clippingPlanesData = sceneData.clippingPlanesData; let numClippingPlanes = sceneData.numClippingPlanes; if (material.clippingPlanes && material.clippingPlanes.length > 0) { if (_clippingPlanesData.length < material.clippingPlanes.length * 4) { _clippingPlanesData = new Float32Array(material.clippingPlanes.length * 4); } clippingPlanesData = sceneData.setClippingPlanesData(material.clippingPlanes, _clippingPlanesData); numClippingPlanes = material.clippingPlanes.length; } object.onBeforeRender(renderable, material); beforeRender && beforeRender.call(this, renderable, material); // Check material version const materialProperties = this._materials.setMaterial(material); if (material.needsUpdate === false) { if (materialProperties.currentProgram === undefined) { material.needsUpdate = true; } else if (materialProperties.fog !== fog) { material.needsUpdate = true; } else if (materialProperties.envMap !== _envData.map) { material.needsUpdate = true; } else if (materialProperties.numClippingPlanes !== numClippingPlanes) { material.needsUpdate = true; } else if (materialProperties.logarithmicDepthBuffer !== sceneData.logarithmicDepthBuffer) { material.needsUpdate = true; } else if (renderStates.outputEncoding !== materialProperties.outputEncoding || renderStates.gammaFactor !== materialProperties.gammaFactor) { material.needsUpdate = true; } else if (capabilities.version > 1 && sceneData.disableShadowSampler !== materialProperties.disableShadowSampler) { material.needsUpdate = true; } else { if (hasLighting !== materialProperties.hasLighting) { material.needsUpdate = true; } else if (hasLighting) { if (!lightingState.compare(materialProperties.lightingFactors)) { material.needsUpdate = true; } else if (hasShadow !== materialProperties.hasShadow) { material.needsUpdate = true; } else if (hasShadow) { material.needsUpdate = materialProperties.shadowType !== object.shadowType; } } } } // Update program if needed. if (material.needsUpdate) { this._materials.updateProgram(material, object, lightingState, renderStates, this.shaderCompileOptions); materialProperties.fog = fog; materialProperties.envMap = _envData.map; materialProperties.logarithmicDepthBuffer = sceneData.logarithmicDepthBuffer; materialProperties.hasLighting = hasLighting; materialProperties.lightingFactors = lightingState.copyTo(materialProperties.lightingFactors); materialProperties.hasShadow = hasShadow; materialProperties.shadowType = object.shadowType; materialProperties.numClippingPlanes = numClippingPlanes; materialProperties.outputEncoding = renderStates.outputEncoding; materialProperties.gammaFactor = renderStates.gammaFactor; materialProperties.disableShadowSampler = sceneData.disableShadowSampler; material.needsUpdate = false; } const program = materialProperties.currentProgram; if (options.onlyCompile || !program.isReady(capabilities.parallelShaderCompileExt)) return; state.setProgram(program); this._geometries.setGeometry(geometry, passInfo); // update morph targets if (object.morphTargetInfluences) { this._updateMorphtargets(object, geometry, program); } vertexArrayBindings.setup(object, geometry, program); let refreshCamera = false; if (program.cameraId !== cameraData.id || program.cameraVersion !== cameraData.version) { refreshCamera = true; program.cameraId = cameraData.id; program.cameraVersion = cameraData.version; } let refreshScene = false; if (program.sceneId !== sceneData.id || program.sceneVersion !== sceneData.version) { refreshScene = true; program.sceneId = sceneData.id; program.sceneVersion = sceneData.version; } let refreshMaterial = true; if (!material.forceUpdateUniforms) { if (materialProperties.pass !== passInfo.count) { materialProperties.pass = passInfo.count; } else { refreshMaterial = this._currentMaterial !== material; } } this._currentMaterial = material; const uniforms = program.getUniforms(); // upload light uniforms if (hasLighting) { this._lights.uploadUniforms(program, lightingGroup, sceneData.disableShadowSampler); } // upload bone matrices if (object.isSkinnedMesh) { this._uploadSkeleton(uniforms, object, sceneData); } // upload other uniforms for (let n = 0, ll = uniforms.seq.length; n < ll; n++) { const uniform = uniforms.seq[n]; const key = uniform.id; const internalGroup = uniform.internalGroup; // upload custom uniforms if (material.uniforms && material.uniforms[key] !== undefined) { uniform.set(material.uniforms[key], textures); continue; } // u_Model: always upload this matrix if (internalGroup === 1) { let modelMatrix = object.worldMatrix; if (sceneData.useAnchorMatrix) { modelMatrix = helpMatrix4.copy(modelMatrix).premultiply(sceneData.anchorMatrixInverse); } uniform.set(modelMatrix.elements); continue; } // uniforms about camera data if (internalGroup === 2 && refreshCamera) { uniform.internalFun(cameraData); continue; } // uniforms about scene data if (internalGroup === 3 && refreshScene) { uniform.internalFun(sceneData); continue; } // uniforms about material if (internalGroup === 4 && refreshMaterial) { uniform.internalFun(material, textures); continue; } // uniforms about environment map if (internalGroup === 5) { uniform.internalFun(_envData, textures); continue; } // other internal uniforms if (key === 'clippingPlanes') { uniform.set(clippingPlanesData); } else if (key === 'u_RenderTargetSize') { uniform.setValue(currentRenderTarget.width, currentRenderTarget.height); } } const frontFaceCW = helpMatrix3.setFromMatrix4(object.worldMatrix).determinant() < 0; state.setMaterial(material, frontFaceCW); const viewport = helpVector4.set(currentRenderTarget.width, currentRenderTarget.height, currentRenderTarget.width, currentRenderTarget.height).multiply(cameraData.rect); viewport.z -= viewport.x; viewport.w -= viewport.y; state.viewport(viewport.round()); this._draw(geometry, material, group, renderInfo); textures.resetTextureUnits(); afterRender && afterRender.call(this, renderable); object.onAfterRender(renderable); } blitRenderTarget(read, draw, color = true, depth = true, stencil = true) { this._renderTargets.blitRenderTarget(read, draw, color, depth, stencil); } generateMipmaps(texture) { const state = this._state; const capabilities = this.capabilities; const textures = this._textures; const textureProperties = textures.get(texture); if (!textureProperties.__webglTexture) return; const powerOfTwo = MathUtils.isPowerOfTwo(textureProperties.__width) && MathUtils.isPowerOfTwo(textureProperties.__height); if (texture.generateMipmaps && texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR && (powerOfTwo || capabilities.version >= 2)) { const target = textureProperties.__webglTarget; state.bindTexture(target, textureProperties.__webglTexture); textures.generateMipmaps(texture); state.bindTexture(target, null); } } readTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) { const gl = this.context; const constants = this._constants; const state = this._state; const renderTargets = this._renderTargets; const textures = this._textures; if (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) { return Promise.reject('WebGLRenderer.readTexturePixels: Unsupported texture.'); } const glType = constants.getGLType(texture.type); const glFormat = constants.getGLFormat(texture.format); const textureProperties = textures.get(texture); if (textureProperties.__readBuffer === undefined) { textureProperties.__readBuffer = gl.createBuffer(); } gl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer); gl.bufferData(gl.PIXEL_PACK_BUFFER, buffer.byteLength, gl.STREAM_READ); gl.readPixels(x, y, width, height, glFormat, glType, 0); // restore framebuffer binding const framebuffer = state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget ? renderTargets.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); return clientWaitAsync(gl).then(() => { if (!textureProperties.__readBuffer) { throw new Error('WebGLRenderer.readTexturePixels: Texture has been disposed.'); } gl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer); gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, buffer); gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null); return buffer; }); } readTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) { const gl = this.context; const constants = this._constants; const state = this._state; const renderTargets = this._renderTargets; if (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) { console.warn('WebGLRenderer.readTexturePixels: Unsupported texture.'); return buffer; } const glType = constants.getGLType(texture.type); const glFormat = constants.getGLFormat(texture.format); gl.readPixels(x, y, width, height, glFormat, glType, buffer); // restore framebuffer binding const framebuffer = state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget ? renderTargets.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); return buffer; } resetVertexArrayBindings(force) { this._vertexArrayBindings.reset(force); } resetState() { this._state.reset(); } beginOcclusionQuery(index) { const querySet = this._currentOcclusionQuerySet; if (!querySet) return; this._querySets.beginQuery(querySet, index); } endOcclusionQuery() { const querySet = this._currentOcclusionQuerySet; if (!querySet) return; this._querySets.endQuery(querySet); } async readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) { return this._querySets.readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount); } /** * Bind webglTexture to Texture. * @param {TextureBase} texture * @param {WebGLTexture} webglTexture */ setTextureExternal(texture, webglTexture) { this._textures.setTextureExternal(texture, webglTexture); } /** * Bind webglRenderbuffer to RenderBuffer. * @param {RenderBuffer} renderBuffer * @param {WebGLRenderbuffer} webglRenderbuffer */ setRenderBufferExternal(renderBuffer, webglRenderbuffer) { this._renderBuffers.setRenderBufferExternal(renderBuffer, webglRenderbuffer); } /** * Bind webglBuffer to Buffer. * @param {Buffer} buffer * @param {WebGLBuffer} webglBuffer */ setBufferExternal(buffer, webglBuffer) { this._buffers.setBufferExternal(buffer, webglBuffer); } /** * Bind webglFramebuffer to RenderTarget. * @param {RenderTarget} renderTarget * @param {WebGLFramebuffer} webglFramebuffer */ setFramebufferExternal(renderTarget, webglFramebuffer) { this._renderTargets.setFramebufferExternal(renderTarget, webglFramebuffer); } _uploadSkeleton(uniforms, object, sceneData) { if (object.skeleton && object.skeleton.bones.length > 0) { const skeleton = object.skeleton; const capabilities = this.capabilities; if (capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2)) { if (skeleton.boneTexture === undefined) { skeleton.generateBoneTexture(capabilities.version >= 2); } uniforms.set('boneTexture', skeleton.boneTexture, this._textures); uniforms.set('boneTextureSize', skeleton.boneTexture.image.width); } else { uniforms.set('boneMatrices', skeleton.boneMatrices); } uniforms.set('bindMatrix', object.bindMatrix.elements); helpMatrix4.copy(object.bindMatrixInverse); if (sceneData.useAnchorMatrix) { helpMatrix4.multiply(sceneData.anchorMatrix); // convert to anchor space } uniforms.set('bindMatrixInverse', helpMatrix4.elements); } } _updateMorphtargets(object, geometry, program) { const objectInfluences = object.morphTargetInfluences; if (!influencesList.has(geometry)) { influencesList.set(geometry, objectInfluences.slice(0)); } const morphTargets = geometry.morphAttributes.position; const morphNormals = geometry.morphAttributes.normal; // Remove current morphAttributes const influences = influencesList.get(geometry); for (let i = 0; i < influences.length; i++) { const influence = influences[i]; if (influence !== 0) { if (morphTargets) geometry.removeAttribute('morphTarget' + i); if (morphNormals) geometry.removeAttribute('morphNormal' + i); } } // Collect influences for (let i = 0; i < objectInfluences.length; i++) { influences[i] = objectInfluences[i]; } influences.length = objectInfluences.length; // Add morphAttributes let count = 0; for (let i = 0; i < influences.length; i++) { const influence = influences[i]; if (influence > 0) { if (morphTargets) geometry.addAttribute('morphTarget' + count, morphTargets[i]); if (morphNormals) geometry.addAttribute('morphNormal' + count, morphNormals[i]); morphInfluences[count] = influence; count++; } } for (; count < 8; count++) { morphInfluences[count] = 0; } program.getUniforms().set('morphTargetInfluences', morphInfluences); } _draw(geometry, material, group, renderInfo) { const gl = this.context; const capabilities = this.capabilities; const buffers = this._buffers; const instanceCount = geometry.instanceCount; const useInstancing = instanceCount >= 0; const useGroup = !!group; const useMultiDraw = useGroup && group.multiDrawCount !== undefined; const useIndexBuffer = geometry.index !== null; let drawStart = 0; let drawCount = Infinity; if (!useMultiDraw) { const position = geometry.getAttribute('a_Position'); if (useIndexBuffer) { drawCount = geometry.index.buffer.count; } else if (position) { drawCount = position.buffer.count; } if (useGroup) { drawStart = Math.max(drawStart, group.start); drawCount = Math.min(drawCount, group.count); } if (drawCount < 0 || drawCount === Infinity) return; } if (useIndexBuffer) { const indexBufferProperties = buffers.get(geometry.index.buffer); const bytesPerElement = indexBufferProperties.bytesPerElement; const type = indexBufferProperties.type; if (type === gl.UNSIGNED_INT) { if (capabilities.version < 2 && !capabilities.getExtension('OES_element_index_uint')) { console.warn('WebGLRenderer: draw elements type not support UNSIGNED_INT!'); } } if (useInstancing) { if (instanceCount <= 0) return; if (capabilities.version >= 2) { gl.drawElementsInstanced(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').drawElementsInstancedANGLE(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount); } else { console.warn('WebGLRenderer: using instanced draw but hardware does not support.'); return; } } else if (useMultiDraw) { if (group.multiDrawCount <= 0) return; const extension = capabilities.getExtension('WEBGL_multi_draw'); if (!extension) { console.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.'); return; } extension.multiDrawElementsWEBGL(material.drawMode, group.multiDrawCounts, 0, type, group.multiDrawStarts, 0, group.multiDrawCount); } else { gl.drawElements(material.drawMode, drawCount, type, drawStart * bytesPerElement); } } else { if (useInstancing) { if (instanceCount <= 0) return; if (capabilities.version >= 2) { gl.drawArraysInstanced(material.drawMode, drawStart, drawCount, instanceCount); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').drawArraysInstancedANGLE(material.drawMode, drawStart, drawCount, instanceCount); } else { console.warn('WebGLRenderer: using instanced draw but hardware does not support.'); return; } } else if (useMultiDraw) { if (group.multiDrawCount <= 0) return; const extension = capabilities.getExtension('WEBGL_multi_draw'); if (!extension) { console.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.'); return; } extension.multiDrawArraysWEBGL(material.drawMode, group.multiDrawStarts, 0, group.multiDrawCounts, 0, group.multiDrawCount); } else { gl.drawArrays(material.drawMode, drawStart, drawCount); } } if (renderInfo) { if (useMultiDraw) { drawCount = 0; for (let i = 0; i < group.multiDrawCount; i++) { drawCount += group.multiDrawCounts[i]; } } renderInfo.update(drawCount, material.drawMode, instanceCount < 0 ? 1 : instanceCount); } } _bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel) { if (!texture.isTexture) return false; const gl = this.context; const textures = this._textures; const state = this._state; if (!this._dummyFrameBuffer) { this._dummyFrameBuffer = gl.createFramebuffer(); } gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFrameBuffer); const textureProperties = textures.setTexture(texture); if (texture.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureProperties.__webglTexture, mipLevel); } else if (texture.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + zIndex, textureProperties.__webglTexture, mipLevel); } else if (texture.isTexture3D || texture.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, mipLevel, zIndex); } state.bindTexture(textureProperties.__webglTarget, null); return true; } } Object.defineProperties(WebGLRenderer.prototype, { // deprecated since 0.4.5 asyncReadPixel: { configurable: true, get: function () { if (this._asyncReadPixel === undefined) { this._asyncReadPixel = false; } return this._asyncReadPixel; }, set: function (value) { this._asyncReadPixel = value; } } }); // deprecated since 0.4.5, use readTexturePixels instead WebGLRenderer.prototype.readRenderTargetPixels = function (x, y, width, height, buffer) { const state = this._state; const renderTarget = state.currentRenderTarget; const zIndex = renderTarget.activeLayer || renderTarget.activeLayer || 0; const mipLevel = renderTarget.activeMipmapLevel || 0; if (renderTarget && renderTarget.texture) { if (x >= 0 && x <= renderTarget.width - width && y >= 0 && y <= renderTarget.height - height) { if (this.asyncReadPixel) { return this.readTexturePixels(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel); } else { this.readTexturePixelsSync(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel); return Promise.resolve(buffer); } } } console.warn('WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed.'); return Promise.reject(); }; // deprecated since 0.5.1 WebGLTextures.prototype.setTexture2D = function (texture, slot) { // console.warn('WebGLTextures: .setTexture2D() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTextureCube = function (texture, slot) { // console.warn('WebGLTextures: .setTextureCube() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTexture3D = function (texture, slot) { // console.warn('WebGLTextures: .setTexture3D() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTexture2DArray = function (texture, slot) { // console.warn('WebGLTextures: .setTexture2DArray() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; Object.defineProperties(Scene.prototype, { // deprecated since 0.2.7, add warning since 0.4.0 environmentLightIntensity: { configurable: true, get: function () { console.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.'); return this.envDiffuseIntensity; }, set: function (value) { console.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.'); this.envDiffuseIntensity = value; } }, // deprecated since 0.4.0 _lightData: { configurable: true, get: function () { console.warn('Scene: ._lightData has been deprecated since v0.4.0, use .collector.lightingData.getGroup(0) instead.'); return this.collector.lightingData.getGroup(0); } }, // deprecated since 0.4.4 _sceneData: { configurable: true, get: function () { console.warn('Scene: ._sceneData has been deprecated since v0.4.4, use .collector.sceneData instead.'); return this.collector.sceneData; } }, // deprecated since 0.4.4 _lightingData: { configurable: true, get: function () { console.warn('Scene: ._lightingData has been deprecated since v0.4.4, use .collector.lightingData instead.'); return this.collector.lightingData; } } }); Object.defineProperties(RenderStates.prototype, { // deprecated since 0.4.0 lights: { configurable: true, get: function () { console.warn('RenderStates: .lights has been deprecated since v0.4.0, use .lighting.getGroup(0) instead.'); return this.lighting.getGroup(0); } } }); // deprecated since 0.2.8 const generateUUID = MathUtils.generateUUID; const isPowerOfTwo = MathUtils.isPowerOfTwo; const nearestPowerOfTwo = MathUtils.nearestPowerOfTwo; const nextPowerOfTwo = MathUtils.nextPowerOfTwo; // deprecated since 0.4.3 Matrix4.prototype.inverse = function () { return this.invert(); }; // deprecated since 0.4.3 Matrix4.prototype.getInverse = function (m) { return this.copy(m).invert(); }; // deprecated since 0.4.3 Matrix4.prototype.transform = function (position, scale, quaternion) { return this.compose(position, quaternion, scale); }; // deprecated since 0.4.3 Matrix3.prototype.inverse = function () { return this.invert(); }; // deprecated since 0.4.3 Matrix3.prototype.getInverse = function (m) { return this.copy(m).invert(); }; // deprecated since 0.4.3 Vector3.prototype.subtract = function (a, target = new Vector3()) { return target.set(this.x - a.x, this.y - a.y, this.z - a.z); }; // The old version of Query API has been deprecated since 0.4.4 const QUERY_TYPE = { ANY_SAMPLES_PASSED: 7000, ANY_SAMPLES_PASSED_CONSERVATIVE: 7001, TIME_ELAPSED: 7002 }; let _queryId = 0; class Query extends EventDispatcher { constructor() { super(); this.id = _queryId++; } dispose() { this.dispatchEvent({ type: 'dispose' }); } } WebGLRenderer.prototype.beginQuery = function (query, target) { this._queries.begin(query, target); }; WebGLRenderer.prototype.endQuery = function (query) { this._queries.end(query); }; WebGLRenderer.prototype.queryCounter = function (query) { this._queries.counter(query); }; WebGLRenderer.prototype.isTimerQueryDisjoint = function (query) { return this._queries.isTimerDisjoint(query); }; WebGLRenderer.prototype.isQueryResultAvailable = function (query) { return this._queries.isResultAvailable(query); }; WebGLRenderer.prototype.getQueryResult = function (query) { return this._queries.getResult(query); }; Object.defineProperties(WebGLRenderer.prototype, { _queries: { configurable: true, get: function () { if (this.__queries === undefined) { this.__queries = new WebGLQueries(`_gl${this.id}`, this.context, this.capabilities); } return this.__queries; } } }); class WebGLQueries extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; const timerQuery = capabilities.timerQuery; const that = this; const onQueryDispose = event => { const query = event.target; const queryProperties = that.get(query); query.removeEventListener('dispose', onQueryDispose); if (queryProperties._webglQuery) { if (capabilities.version > 1) { gl.deleteQuery(queryProperties._webglQuery); } else { timerQuery.deleteQueryEXT(queryProperties._webglQuery); } } that.delete(query); }; this._onQueryDispose = onQueryDispose; this._typeToGL = { [QUERY_TYPE.ANY_SAMPLES_PASSED]: 0x8C2F, [QUERY_TYPE.ANY_SAMPLES_PASSED_CONSERVATIVE]: 0x8D6A, [QUERY_TYPE.TIME_ELAPSED]: 0x88BF }; } _get(query) { const capabilities = this._capabilities; const queryProperties = this.get(query); if (queryProperties._webglQuery === undefined) { query.addEventListener('dispose', this._onQueryDispose); queryProperties._webglQuery = capabilities.version > 1 ? this._gl.createQuery() : capabilities.timerQuery.createQueryEXT(); queryProperties._target = null; queryProperties._result = null; } return queryProperties; } begin(query, target) { const capabilities = this._capabilities; const typeToGL = this._typeToGL; const queryProperties = this._get(query); if (capabilities.version > 1) { this._gl.beginQuery(typeToGL[target], queryProperties._webglQuery); } else { capabilities.timerQuery.beginQueryEXT(typeToGL[target], queryProperties._webglQuery); } queryProperties._target = target; queryProperties._result = null; // clear the last result. } end(query) { const capabilities = this._capabilities; const typeToGL = this._typeToGL; const queryProperties = this._get(query); if (capabilities.version > 1) { this._gl.endQuery(typeToGL[queryProperties._target]); } else { capabilities.timerQuery.endQueryEXT(typeToGL[queryProperties._target]); } } counter(query) { const timerQuery = this._capabilities.timerQuery; const queryProperties = this._get(query); timerQuery.queryCounterEXT(queryProperties._webglQuery, timerQuery.TIMESTAMP_EXT); queryProperties._target = timerQuery.TIMESTAMP_EXT; queryProperties._result = null; // clear the last result. } isResultAvailable(query) { const gl = this._gl; const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const queryProperties = this._get(query); let available; if (capabilities.version > 1) { available = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT_AVAILABLE); } else { available = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_AVAILABLE); } return available; } isTimerDisjoint() { return this._gl.getParameter(this._capabilities.timerQuery.GPU_DISJOINT_EXT); } getResult(query) { const gl = this._gl; const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const queryProperties = this._get(query); if (queryProperties._result === null) { if (capabilities.version > 1) { queryProperties._result = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT); } else { queryProperties._result = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_EXT); } } return queryProperties._result; } } // deprecated since 0.5.0 WebGLRenderer.prototype.clear = function (color, depth, stencil) { const gl = this.context; let bits = 0; if (color === undefined || color) bits |= gl.COLOR_BUFFER_BIT; if (depth === undefined || depth) bits |= gl.DEPTH_BUFFER_BIT; if (stencil === undefined || stencil) bits |= gl.STENCIL_BUFFER_BIT; if (bits > 0) { // Prevent warning when bits is equal to zero gl.clear(bits); } }; // deprecated since 0.5.0 WebGLRenderer.prototype.setClearColor = function (r, g, b, a, premultipliedAlpha) { this._state.colorBuffer.setClear(r, g, b, a, premultipliedAlpha); }; // deprecated since 0.5.0 WebGLRenderer.prototype.getClearColor = function () { return this._state.colorBuffer.getClear(); }; // deprecated since 0.5.0 WebGLRenderer.prototype.setRenderTarget = function (renderTarget) { this._renderTargets.setRenderTarget(renderTarget); }; // deprecated since 0.5.0 WebGLRenderer.prototype.getRenderTarget = function () { return this._state.currentRenderTarget; }; // deprecated since 0.5.0 WebGLRenderer.prototype.setOcclusionQuerySet = function (querySet) { this._currentOcclusionQuerySet = querySet; }; // deprecated since 0.5.0 WebGLRenderer.prototype.setTimestampWrites = function (querySet, beginIndex = 0, endIndex = 1) { this._currentTimestampWrites.querySet = querySet; this._currentTimestampWrites.beginningOfPassWriteIndex = beginIndex; this._currentTimestampWrites.endOfPassWriteIndex = endIndex; }; // deprecated since 0.5.0 WebGLRenderer.prototype.updateRenderTargetMipmap = function (renderTarget) { if (renderTarget.texture) { this.generateMipmaps(renderTarget.texture); } }; Object.defineProperties(OffscreenRenderTarget.prototype, { // deprecated since 0.5.0 depth: { configurable: true, get: function () { console.warn('OffscreenRenderTarget: .depth property is deprecated.'); return 1; } } }); // deprecated since 0.5.0 class RenderTarget2D extends OffscreenRenderTarget { constructor(width, height) { super(width, height); this.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0); this.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); } } RenderTarget2D.prototype.isRenderTarget2D = true; // deprecated since 0.5.0 class RenderTargetCube extends OffscreenRenderTarget { constructor(width, height) { super(width, height); this.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0); this.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); } } RenderTargetCube.prototype.isRenderTargetCube = true; // deprecated since 0.5.0 class RenderTarget3D extends OffscreenRenderTarget { constructor(width, height, depth) { super(width, height); const texture = new Texture3D(); texture.resizeAsAttachment(width, height, depth); this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } } RenderTarget3D.prototype.isRenderTarget3D = true; // deprecated since 0.5.0 class RenderTarget2DArray extends OffscreenRenderTarget { constructor(width, height, depth) { super(width, height); const texture = new Texture2DArray(); texture.resizeAsAttachment(width, height, depth); this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } } RenderTarget2DArray.prototype.isRenderTarget2DArray = true; // deprecated since 0.5.0 ScreenRenderTarget.prototype.isRenderTargetBack = true; exports.ATTACHMENT = ATTACHMENT; exports.AmbientLight = AmbientLight; exports.AnimationAction = AnimationAction; exports.AnimationMixer = AnimationMixer; exports.Attribute = Attribute; exports.BLEND_EQUATION = BLEND_EQUATION; exports.BLEND_FACTOR = BLEND_FACTOR; exports.BLEND_TYPE = BLEND_TYPE; exports.BUFFER_USAGE = BUFFER_USAGE; exports.BasicMaterial = BasicMaterial; exports.Bone = Bone; exports.BooleanKeyframeTrack = BooleanKeyframeTrack; exports.Box2 = Box2; exports.Box3 = Box3; exports.BoxGeometry = BoxGeometry; exports.Buffer = Buffer; exports.COMPARE_FUNC = COMPARE_FUNC; exports.CULL_FACE_TYPE = CULL_FACE_TYPE; exports.Camera = Camera; exports.CameraProjection = CameraProjection; exports.Color3 = Color3; exports.Color4 = Color4; exports.ColorKeyframeTrack = ColorKeyframeTrack; exports.CubicSplineInterpolant = CubicSplineInterpolant; exports.CylinderGeometry = CylinderGeometry; exports.DRAW_MODE = DRAW_MODE; exports.DRAW_SIDE = DRAW_SIDE; exports.DefaultLoadingManager = DefaultLoadingManager; exports.DepthMaterial = DepthMaterial; exports.DirectionalLight = DirectionalLight; exports.DirectionalLightShadow = DirectionalLightShadow; exports.DistanceMaterial = DistanceMaterial; exports.ENVMAP_COMBINE_TYPE = ENVMAP_COMBINE_TYPE; exports.Euler = Euler; exports.EventDispatcher = EventDispatcher; exports.FileLoader = FileLoader; exports.Fog = Fog; exports.FogExp2 = FogExp2; exports.Frustum = Frustum; exports.Geometry = Geometry; exports.HemisphereLight = HemisphereLight; exports.ImageLoader = ImageLoader; exports.KeyframeClip = KeyframeClip; exports.KeyframeInterpolant = KeyframeInterpolant; exports.KeyframeTrack = KeyframeTrack; exports.LambertMaterial = LambertMaterial; exports.Light = Light; exports.LightShadow = LightShadow; exports.LineMaterial = LineMaterial; exports.LinearInterpolant = LinearInterpolant; exports.Loader = Loader; exports.LoadingManager = LoadingManager; exports.MATERIAL_TYPE = MATERIAL_TYPE; exports.Material = Material; exports.MathUtils = MathUtils; exports.Matrix3 = Matrix3; exports.Matrix4 = Matrix4; exports.Mesh = Mesh; exports.NumberKeyframeTrack = NumberKeyframeTrack; exports.OPERATION = OPERATION; exports.Object3D = Object3D; exports.OffscreenRenderTarget = OffscreenRenderTarget; exports.OrthographicProjection = OrthographicProjection; exports.PBR2Material = PBR2Material; exports.PBRMaterial = PBRMaterial; exports.PIXEL_FORMAT = PIXEL_FORMAT; exports.PIXEL_TYPE = PIXEL_TYPE; exports.PerspectiveProjection = PerspectiveProjection; exports.PhongMaterial = PhongMaterial; exports.Plane = Plane; exports.PlaneGeometry = PlaneGeometry; exports.PointLight = PointLight; exports.PointLightShadow = PointLightShadow; exports.PointsMaterial = PointsMaterial; exports.PropertyBindingMixer = PropertyBindingMixer; exports.PropertyMap = PropertyMap; exports.QUERYSET_TYPE = QUERYSET_TYPE; exports.QUERY_TYPE = QUERY_TYPE; exports.Quaternion = Quaternion; exports.QuaternionCubicSplineInterpolant = QuaternionCubicSplineInterpolant; exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; exports.Query = Query; exports.QuerySet = QuerySet; exports.Ray = Ray; exports.Raycaster = Raycaster; exports.RectAreaLight = RectAreaLight; exports.RenderBuffer = RenderBuffer; exports.RenderInfo = RenderInfo; exports.RenderQueue = RenderQueue; exports.RenderQueueLayer = RenderQueueLayer; exports.RenderStates = RenderStates; exports.RenderTarget2D = RenderTarget2D; exports.RenderTarget2DArray = RenderTarget2DArray; exports.RenderTarget3D = RenderTarget3D; exports.RenderTargetBack = ScreenRenderTarget; exports.RenderTargetBase = RenderTargetBase; exports.RenderTargetCube = RenderTargetCube; exports.SHADING_TYPE = SHADING_TYPE; exports.SHADOW_TYPE = SHADOW_TYPE; exports.Scene = Scene; exports.SceneData = SceneData; exports.ScreenRenderTarget = ScreenRenderTarget; exports.ShaderChunk = ShaderChunk; exports.ShaderLib = ShaderLib; exports.ShaderMaterial = ShaderMaterial; exports.ShaderPostPass = ShaderPostPass; exports.ShadowMapPass = ShadowMapPass; exports.Skeleton = Skeleton; exports.SkinnedMesh = SkinnedMesh; exports.Sphere = Sphere; exports.SphereGeometry = SphereGeometry; exports.Spherical = Spherical; exports.SphericalHarmonics3 = SphericalHarmonics3; exports.SphericalHarmonicsLight = SphericalHarmonicsLight; exports.SpotLight = SpotLight; exports.SpotLightShadow = SpotLightShadow; exports.StepInterpolant = StepInterpolant; exports.StringKeyframeTrack = StringKeyframeTrack; exports.TEXEL_ENCODING_TYPE = TEXEL_ENCODING_TYPE; exports.TEXTURE_FILTER = TEXTURE_FILTER; exports.TEXTURE_WRAP = TEXTURE_WRAP; exports.Texture2D = Texture2D; exports.Texture2DArray = Texture2DArray; exports.Texture3D = Texture3D; exports.TextureBase = TextureBase; exports.TextureCube = TextureCube; exports.ThinRenderer = ThinRenderer; exports.TorusKnotGeometry = TorusKnotGeometry; exports.TransformUV = TransformUV; exports.Triangle = Triangle; exports.VERTEX_COLOR = VERTEX_COLOR; exports.Vector2 = Vector2; exports.Vector3 = Vector3; exports.Vector4 = Vector4; exports.VectorKeyframeTrack = VectorKeyframeTrack; exports.WebGLAttribute = WebGLAttribute; exports.WebGLCapabilities = WebGLCapabilities; exports.WebGLGeometries = WebGLGeometries; exports.WebGLProgram = WebGLProgram; exports.WebGLPrograms = WebGLPrograms; exports.WebGLQueries = WebGLQueries; exports.WebGLQuerySets = WebGLQuerySets; exports.WebGLRenderBuffers = WebGLRenderBuffers; exports.WebGLRenderer = WebGLRenderer; exports.WebGLState = WebGLState; exports.WebGLTextures = WebGLTextures; exports.WebGLUniforms = WebGLUniforms; exports.cloneJson = cloneJson; exports.cloneUniforms = cloneUniforms; exports.generateUUID = generateUUID; exports.isPowerOfTwo = isPowerOfTwo; exports.nearestPowerOfTwo = nearestPowerOfTwo; exports.nextPowerOfTwo = nextPowerOfTwo; })); ================================================ FILE: build/t3d.module.js ================================================ /** * @license * Copyright 2021-present uino * SPDX-License-Identifier: BSD-3-Clause */ /** * An utility class for mathematical operations. */ class MathUtils { /** * Method for generate uuid. * http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 * @returns {string} - The uuid. */ static generateUUID() { const d0 = Math.random() * 0xffffffff | 0; const d1 = Math.random() * 0xffffffff | 0; const d2 = Math.random() * 0xffffffff | 0; const d3 = Math.random() * 0xffffffff | 0; const uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' + _lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' + _lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] + _lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff]; // .toUpperCase() here flattens concatenated strings to save heap memory space. return uuid.toUpperCase(); } /** * Returns a value linearly interpolated from two known points based on the given interval - t = 0 will return x and t = 1 will return y. * @param {number} x - The first value. * @param {number} y - The second value. * @param {number} t - The interpolation factor. * @returns {number} - The interpolated value. */ static lerp(x, y, t) { return x + (y - x) * t; } /** * Clamps the value to be between min and max. * @param {number} value - Value to be clamped. * @param {number} min - The minimum value. * @param {number} max - The maximum value. * @returns {number} - The clamped value. */ static clamp(value, min, max) { return Math.max(min, Math.min(max, value)); } /** * Compute euclidean modulo of m % n. * Refer to: https://en.wikipedia.org/wiki/Modulo_operation * @param {number} n - The dividend. * @param {number} m - The divisor. * @returns {number} - The result of the modulo operation. */ static euclideanModulo(n, m) { return ((n % m) + m) % m; } /** * Performs a linear mapping from range `` to range `` * for the given value. * @param {number} x - The value to be mapped. * @param {number} a1 - Minimum value for range A. * @param {number} a2 - Maximum value for range A. * @param {number} b1 - Minimum value for range B. * @param {number} b2 - Maximum value for range B. * @returns {number} The mapped value. */ static mapLinear(x, a1, a2, b1, b2) { return b1 + (x - a1) * (b2 - b1) / (a2 - a1); } /** * Is this number a power of two. * @param {number} value - The input number. * @returns {boolean} - Is this number a power of two. */ static isPowerOfTwo(value) { return (value & (value - 1)) === 0 && value !== 0; } /** * Return the nearest power of two number of this number. * @param {number} value - The input number. * @returns {number} - The result number. */ static nearestPowerOfTwo(value) { return Math.pow(2, Math.round(Math.log(value) / Math.LN2)); } /** * Return the next power of two number of this number. * @param {number} value - The input number. * @returns {number} - The result number. */ static nextPowerOfTwo(value) { value--; value |= value >> 1; value |= value >> 2; value |= value >> 4; value |= value >> 8; value |= value >> 16; value++; return value; } /** * Return the next power of two square size of this number. * This method is usually used to calculate the minimum 2d texture size based on the pixel length. * @param {number} value - The input number. * @returns {number} - The result size. */ static nextPowerOfTwoSquareSize(value) { return this.nextPowerOfTwo(Math.ceil(Math.sqrt(value))); } /** * Denormalizes a value based on the type of the provided array. * @param {number} value - The value to be denormalized. * @param {TypedArray} array - The typed array to determine the normalization factor. * @returns {number} - The denormalized value. * @throws {Error} - Throws an error if the array type is invalid. */ static denormalize(value, array) { switch (array.constructor) { case Float32Array: return value; case Uint32Array: return value / 4294967295.0; case Uint16Array: return value / 65535.0; case Uint8Array: return value / 255.0; case Int32Array: return Math.max(value / 2147483647.0, -1); case Int16Array: return Math.max(value / 32767.0, -1); case Int8Array: return Math.max(value / 127.0, -1); default: throw new Error('Invalid component type.'); } } /** * Normalizes a value based on the type of the provided array. * @param {number} value - The value to be normalized. * @param {TypedArray} array - The typed array to determine the normalization factor. * @returns {number} - The normalized value. * @throws {Error} - Throws an error if the array type is invalid. */ static normalize(value, array) { switch (array.constructor) { case Float32Array: return value; case Uint32Array: return Math.round(value * 4294967295.0); case Uint16Array: return Math.round(value * 65535.0); case Uint8Array: return Math.round(value * 255.0); case Int32Array: return Math.round(value * 2147483647.0); case Int16Array: return Math.round(value * 32767.0); case Int8Array: return Math.round(value * 127.0); default: throw new Error('Invalid component type.'); } } /** * Converts float to half float. * @param {number} val - The float value. * @returns {number} - The half float value. */ static toHalfFloat(val) { if (Math.abs(val) > 65504) { console.warn('MathUtils.toHalfFloat(): Value out of range.'); val = this.clamp(val, -65504, 65504); } _tables.floatView[0] = val; const f = _tables.uint32View[0]; const e = (f >> 23) & 0x1ff; return _tables.baseTable[e] + ((f & 0x007fffff) >> _tables.shiftTable[e]); } /** * Converts half float to float. * @param {number} val - The half float value. * @returns {number} - The float value. */ static fromHalfFloat(val) { const m = val >> 10; _tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 0x3ff)] + _tables.exponentTable[m]; return _tables.floatView[0]; } } const _lut = []; for (let i = 0; i < 256; i++) { _lut[i] = (i < 16 ? '0' : '') + (i).toString(16); } // Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf const _tables = _generateTables(); function _generateTables() { // float32 to float16 helpers const buffer = new ArrayBuffer(4); const floatView = new Float32Array(buffer); const uint32View = new Uint32Array(buffer); const baseTable = new Uint32Array(512); const shiftTable = new Uint32Array(512); for (let i = 0; i < 256; ++i) { const e = i - 127; if (e < -27) { // very small number (0, -0) baseTable[i] = 0x0000; baseTable[i | 0x100] = 0x8000; shiftTable[i] = 24; shiftTable[i | 0x100] = 24; } else if (e < -14) { // small number (denorm) baseTable[i] = 0x0400 >> (-e - 14); baseTable[i | 0x100] = (0x0400 >> (-e - 14)) | 0x8000; shiftTable[i] = -e - 1; shiftTable[i | 0x100] = -e - 1; } else if (e <= 15) { // normal number baseTable[i] = (e + 15) << 10; baseTable[i | 0x100] = ((e + 15) << 10) | 0x8000; shiftTable[i] = 13; shiftTable[i | 0x100] = 13; } else if (e < 128) { // large number (Infinity, -Infinity) baseTable[i] = 0x7c00; baseTable[i | 0x100] = 0xfc00; shiftTable[i] = 24; shiftTable[i | 0x100] = 24; } else { // stay (NaN, Infinity, -Infinity) baseTable[i] = 0x7c00; baseTable[i | 0x100] = 0xfc00; shiftTable[i] = 13; shiftTable[i | 0x100] = 13; } } // float16 to float32 helpers const mantissaTable = new Uint32Array(2048); const exponentTable = new Uint32Array(64); const offsetTable = new Uint32Array(64); for (let i = 1; i < 1024; ++i) { let m = i << 13; // zero pad mantissa bits let e = 0; // zero exponent // normalized while ((m & 0x00800000) === 0) { m <<= 1; e -= 0x00800000; // decrement exponent } m &= -8388609; // clear leading 1 bit e += 0x38800000; // adjust bias mantissaTable[i] = m | e; } for (let i = 1024; i < 2048; ++i) { mantissaTable[i] = 0x38000000 + ((i - 1024) << 13); } for (let i = 1; i < 31; ++i) { exponentTable[i] = i << 23; } exponentTable[31] = 0x47800000; exponentTable[32] = 0x80000000; for (let i = 33; i < 63; ++i) { exponentTable[i] = 0x80000000 + ((i - 32) << 23); } exponentTable[63] = 0xc7800000; for (let i = 1; i < 64; ++i) { if (i !== 32) { offsetTable[i] = 1024; } } return { floatView: floatView, uint32View: uint32View, baseTable: baseTable, shiftTable: shiftTable, mantissaTable: mantissaTable, exponentTable: exponentTable, offsetTable: offsetTable }; } /** * Class representing a 3D vector. */ class Vector3 { /** * Constructs a new 3D vector. * @param {number} [x=0] - The x value of this vector. * @param {number} [y=0] - The y value of this vector. * @param {number} [z=0] - The z value of this vector. */ constructor(x = 0, y = 0, z = 0) { /** * The x value of this vector. * @type {number} */ this.x = x; /** * The y value of this vector. * @type {number} */ this.y = y; /** * The z value of this vector. * @type {number} */ this.z = z; } /** * Sets the vector components. * @param {number} x - The value of the x component. * @param {number} y - The value of the y component. * @param {number} z - The value of the z component. * @returns {Vector3} A reference to this vector. */ set(x = 0, y = 0, z = 0) { this.x = x; this.y = y; this.z = z; return this; } /** * Sets the vector components to the same value. * @param {number} scalar - The value to set for all vector components. * @returns {Vector3} A reference to this vector. */ setScalar(scalar) { this.x = scalar; this.y = scalar; this.z = scalar; return this; } /** * Returns a new vector with copied values from this instance. * @returns {Vector3} A clone of this instance. */ clone() { return new Vector3(this.x, this.y, this.z); } /** * Copies the values of the given vector to this instance. * @param {Vector3} v - The vector to copy. * @returns {Vector3} A reference to this vector. */ copy(v) { this.x = v.x; this.y = v.y; this.z = v.z; return this; } /** * Adds the given vector to this instance. * @param {Vector3} v - The vector to add. * @returns {Vector3} A reference to this vector. */ add(v) { this.x += v.x; this.y += v.y; this.z += v.z; return this; } /** * Adds the given scalar value to all components of this instance. * @param {number} s - The scalar to add. * @returns {Vector3} A reference to this vector. */ addScalar(s) { this.x += s; this.y += s; this.z += s; return this; } /** * Adds the given vectors and stores the result in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ addVectors(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; this.z = a.z + b.z; return this; } /** * Adds the given vector scaled by the given factor to this instance. * @param {Vector3|Vector4} v - The vector. * @param {number} s - The factor that scales `v`. * @returns {Vector3} A reference to this vector. */ addScaledVector(v, s) { this.x += v.x * s; this.y += v.y * s; this.z += v.z * s; return this; } /** * Subtracts the given vector from this instance. * @param {Vector3} v - The vector to subtract. * @returns {Vector3} A reference to this vector. */ sub(v) { this.x -= v.x; this.y -= v.y; this.z -= v.z; return this; } /** * Subtracts the given vectors and stores the result in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; return this; } /** * Multiplies the given vector with this instance. * @param {Vector3} v - The vector to multiply. * @returns {Vector3} A reference to this vector. */ multiply(v) { this.x *= v.x; this.y *= v.y; this.z *= v.z; return this; } /** * Multiplies the given scalar value with all components of this instance. * @param {number} scalar - The scalar to multiply. * @returns {Vector3} A reference to this vector. */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; this.z *= scalar; return this; } /** * Multiplies this vector with the given 3x3 matrix. * @param {Matrix3} m - The 3x3 matrix. * @returns {Vector3} A reference to this vector. */ applyMatrix3(m) { const x = this.x, y = this.y, z = this.z; const e = m.elements; this.x = e[0] * x + e[3] * y + e[6] * z; this.y = e[1] * x + e[4] * y + e[7] * z; this.z = e[2] * x + e[5] * y + e[8] * z; return this; } /** * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and * divides by perspective. * @param {Matrix4} m - The matrix to apply. * @returns {Vector3} A reference to this vector. */ applyMatrix4(m) { const x = this.x, y = this.y, z = this.z; const e = m.elements; const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]); this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w; this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w; this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w; return this; } /** * Applies the given Quaternion to this vector. * @param {Quaternion} q - The Quaternion. * @returns {Vector3} A reference to this vector. */ applyQuaternion(q) { const x = this.x, y = this.y, z = this.z; const qx = q._x, qy = q._y, qz = q._z, qw = q._w; // calculate quat * vector const ix = qw * x + qy * z - qz * y; const iy = qw * y + qz * x - qx * z; const iz = qw * z + qx * y - qy * x; const iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; return this; } /** * Projects this vector from world space into the camera's normalized * device coordinate (NDC) space. * @param {Camera} camera - The camera. * @returns {Vector3} A reference to this vector. */ project(camera) { return this.applyMatrix4(camera.projectionViewMatrix); } /** * Unprojects this vector from the camera's normalized device coordinate (NDC) * space into world space. * @param {Camera} camera - The camera. * @returns {Vector3} A reference to this vector. */ unproject(camera) { return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.worldMatrix); } /** * Transforms the direction of this vector by a matrix (the upper left 3 x 3 * subset of the given 4x4 matrix and then normalizes the result. * @param {Matrix4} m - The matrix. * @returns {Vector3} A reference to this vector. */ transformDirection(m) { // input: Matrix4 affine matrix // vector interpreted as a direction const x = this.x, y = this.y, z = this.z; const e = m.elements; this.x = e[0] * x + e[4] * y + e[8] * z; this.y = e[1] * x + e[5] * y + e[9] * z; this.z = e[2] * x + e[6] * y + e[10] * z; return this.normalize(); } /** * If this vector's x, y or z value is greater than the given vector's x, y or z * value, replace that value with the corresponding min value. * @param {Vector3} v - The vector. * @returns {Vector3} A reference to this vector. */ min(v) { this.x = Math.min(this.x, v.x); this.y = Math.min(this.y, v.y); this.z = Math.min(this.z, v.z); return this; } /** * If this vector's x, y or z value is less than the given vector's x, y or z * value, replace that value with the corresponding max value. * @param {Vector3} v - The vector. * @returns {Vector3} A reference to this vector. */ max(v) { this.x = Math.max(this.x, v.x); this.y = Math.max(this.y, v.y); this.z = Math.max(this.z, v.z); return this; } /** * Inverts this vector - i.e. sets x = -x, y = -y and z = -z. * @returns {Vector3} A reference to this vector. */ negate() { this.x = -this.x; this.y = -this.y; this.z = -this.z; return this; } /** * Calculates the dot product of the given vector with this instance. * @param {Vector3} v - The vector to compute the dot product with. * @returns {number} The result of the dot product. */ dot(v) { return this.x * v.x + this.y * v.y + this.z * v.z; } /** * Computes the square of the Euclidean length (straight-line length) from * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should * compare the length squared instead as it is slightly more efficient to calculate. * @returns {number} The square length of this vector. */ getLengthSquared() { return this.x * this.x + this.y * this.y + this.z * this.z; } /** * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z). * @returns {number} The length of this vector. */ getLength() { return Math.sqrt(this.getLengthSquared()); } /** * Converts this vector to a unit vector - that is, sets it equal to a vector * with the same direction as this one, but with a vector length of `1`. * @param {number} [thickness=1] * @returns {Vector3} A reference to this vector. */ normalize(thickness = 1) { const length = this.getLength() || 1; const invLength = thickness / length; this.x *= invLength; this.y *= invLength; this.z *= invLength; return this; } /** * Linearly interpolates between the given vector and this instance, where * alpha is the percent distance along the line - alpha = 0 will be this * vector, and alpha = 1 will be the given one. * @param {Vector3} v - The vector to interpolate towards. * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. * @returns {Vector3} A reference to this vector. */ lerp(v, alpha) { this.x += (v.x - this.x) * alpha; this.y += (v.y - this.y) * alpha; this.z += (v.z - this.z) * alpha; return this; } /** * Linearly interpolates between the given vectors, where alpha is the percent * distance along the line - alpha = 0 will be first vector, and alpha = 1 will * be the second one. The result is stored in this instance. * @param {Vector3} v1 - The first vector. * @param {Vector3} v2 - The second vector. * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. * @returns {Vector3} A reference to this vector. */ lerpVectors(v1, v2, alpha) { this.x = v1.x + (v2.x - v1.x) * alpha; this.y = v1.y + (v2.y - v1.y) * alpha; this.z = v1.z + (v2.z - v1.z) * alpha; return this; } /** * Calculates the cross product of the given vector with this instance. * @param {Vector3} v - The vector to compute the cross product with. * @returns {Vector3} The result of the cross product. */ cross(v) { return this.crossVectors(this, v); } /** * Calculates the cross product of the given vectors and stores the result * in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ crossVectors(a, b) { const ax = a.x, ay = a.y, az = a.z; const bx = b.x, by = b.y, bz = b.z; this.x = ay * bz - az * by; this.y = az * bx - ax * bz; this.z = ax * by - ay * bx; return this; } /** * Reflects this vector off a plane orthogonal to the given normal vector. * @param {Vector3} normal - The (normalized) normal vector. * @returns {Vector3} A reference to this vector. */ reflect(normal) { return this.sub(_vector$2.copy(normal).multiplyScalar(2 * this.dot(normal))); } /** * Scales this vector along the given direction vector by the given scale factor. * @param {Vector3} direction - The (normalized) direction vector to scale along. * @param {number} scale - The scale factor. * @returns {Vector3} A reference to this vector. */ scaleAlong(direction, scale) { _vector$2.copy(direction).multiplyScalar(this.dot(direction)); return this.sub(_vector$2).addScaledVector(_vector$2, scale); } /** * Returns the angle between the given vector and this instance in radians. * @param {Vector3} v - The vector to compute the angle with. * @returns {number} The angle in radians. */ angleTo(v) { const denominator = Math.sqrt(this.getLengthSquared() * v.getLengthSquared()); if (denominator === 0) return Math.PI / 2; const theta = this.dot(v) / denominator; // clamp, to handle numerical problems return Math.acos(MathUtils.clamp(theta, -1, 1)); } /** * Computes the distance from the given vector to this instance. * @param {Vector3} v - The vector to compute the distance to. * @returns {number} The distance. */ distanceTo(v) { return Math.sqrt(this.distanceToSquared(v)); } /** * Computes the squared distance from the given vector to this instance. * If you are just comparing the distance with another distance, you should compare * the distance squared instead as it is slightly more efficient to calculate. * @param {Vector3} v - The vector to compute the squared distance to. * @returns {number} The squared distance. */ distanceToSquared(v) { const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; return dx * dx + dy * dy + dz * dz; } /** * Sets the vector components from the given spherical coordinates. * @param {Spherical} s - The spherical coordinates. * @returns {Vector3} A reference to this vector. */ setFromSpherical(s) { const sinPhiRadius = Math.sin(s.phi) * s.radius; this.x = sinPhiRadius * Math.sin(s.theta); this.y = Math.cos(s.phi) * s.radius; this.z = sinPhiRadius * Math.cos(s.theta); return this; } /** * Sets the vector components to the position elements of the * given transformation matrix. * @param {Matrix4} m - The 4x4 matrix. * @returns {Vector3} A reference to this vector. */ setFromMatrixPosition(m) { const e = m.elements; this.x = e[12]; this.y = e[13]; this.z = e[14]; return this; } /** * Sets the vector components to the scale elements of the * given transformation matrix. * @param {Matrix4} m - The 4x4 matrix. * @returns {Vector3} A reference to this vector. */ setFromMatrixScale(m) { const sx = this.setFromMatrixColumn(m, 0).getLength(); const sy = this.setFromMatrixColumn(m, 1).getLength(); const sz = this.setFromMatrixColumn(m, 2).getLength(); return this.set(sx, sy, sz); } /** * Sets the vector components from the specified matrix column. * @param {Matrix4} m - The 4x4 matrix. * @param {number} index - The column index. * @returns {Vector3} A reference to this vector. */ setFromMatrixColumn(m, index) { return this.fromArray(m.elements, index * 4); } /** * Returns `true` if this vector is equal with the given one. * @param {Vector3} v - The vector to test for equality. * @returns {boolean} Whether this vector is equal with the given one. */ equals(v) { return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z)); } /** * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]` * and z value to be `array[ offset + 2 ]`. * @param {Array} array - An array holding the vector component values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Vector3} A reference to this vector. */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); } this.x = x; this.y = y; this.z = z; return this; } /** * Writes the components of this vector to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the vector components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {Array} The vector components. */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y, z = this.z; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; return array; } * [Symbol.iterator]() { yield this.x; yield this.y; yield this.z; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector3.prototype.isVector3 = true; const _vector$2 = new Vector3(); /** * Represents a 4x4 matrix. */ class Matrix4 { /** * Constructs a new 4x4 matrix. */ constructor() { /** * A column-major list of matrix values. * @type {Array} */ this.elements = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]; } /** * Sets the elements of the matrix.The arguments are supposed to be * in row-major order. * @param {number} [n11] - 1-1 matrix element. * @param {number} [n12] - 1-2 matrix element. * @param {number} [n13] - 1-3 matrix element. * @param {number} [n14] - 1-4 matrix element. * @param {number} [n21] - 2-1 matrix element. * @param {number} [n22] - 2-2 matrix element. * @param {number} [n23] - 2-3 matrix element. * @param {number} [n24] - 2-4 matrix element. * @param {number} [n31] - 3-1 matrix element. * @param {number} [n32] - 3-2 matrix element. * @param {number} [n33] - 3-3 matrix element. * @param {number} [n34] - 3-4 matrix element. * @param {number} [n41] - 4-1 matrix element. * @param {number} [n42] - 4-2 matrix element. * @param {number} [n43] - 4-3 matrix element. * @param {number} [n44] - 4-4 matrix element. * @returns {Matrix4} A reference to this matrix. */ set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { const ele = this.elements; ele[0] = n11; ele[4] = n12; ele[8] = n13; ele[12] = n14; ele[1] = n21; ele[5] = n22; ele[9] = n23; ele[13] = n24; ele[2] = n31; ele[6] = n32; ele[10] = n33; ele[14] = n34; ele[3] = n41; ele[7] = n42; ele[11] = n43; ele[15] = n44; return this; } /** * Sets this matrix to the 4x4 identity matrix. * @returns {Matrix4} A reference to this matrix. */ identity() { return this.set( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); } /** * Checks if the matrix is an identity matrix. * @returns {boolean} - True if the matrix is an identity matrix, false otherwise. */ isIdentity() { const te = this.elements; return te[0] === 1 && te[4] === 0 && te[8] === 0 && te[12] === 0 && te[1] === 0 && te[5] === 1 && te[9] === 0 && te[13] === 0 && te[2] === 0 && te[6] === 0 && te[10] === 1 && te[14] === 0 && te[3] === 0 && te[7] === 0 && te[11] === 0 && te[15] === 1; } /** * Returns a matrix with copied values from this instance. * @returns {Matrix4} A clone of this instance. */ clone() { return new Matrix4().fromArray(this.elements); } /** * Copies the values of the given matrix to this instance. * @param {Matrix4} m - The matrix to copy. * @returns {Matrix4} A reference to this matrix. */ copy(m) { const te = this.elements; const me = m.elements; te[0] = me[0]; te[1] = me[1]; te[2] = me[2]; te[3] = me[3]; te[4] = me[4]; te[5] = me[5]; te[6] = me[6]; te[7] = me[7]; te[8] = me[8]; te[9] = me[9]; te[10] = me[10]; te[11] = me[11]; te[12] = me[12]; te[13] = me[13]; te[14] = me[14]; te[15] = me[15]; return this; } /** * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix. * @param {Matrix3} m - The 3x3 matrix. * @returns {Matrix4} A reference to this matrix. */ setFromMatrix3(m) { const me = m.elements; return this.set( me[0], me[3], me[6], 0, me[1], me[4], me[7], 0, me[2], me[5], me[8], 0, 0, 0, 0, 1 ); } /** * Extracts the basis of this matrix into the three axis vectors provided. * @param {Vector3} xAxis - The basis's x axis. * @param {Vector3} yAxis - The basis's y axis. * @param {Vector3} zAxis - The basis's z axis. * @returns {Matrix4} A reference to this matrix. */ extractBasis(xAxis, yAxis, zAxis) { xAxis.setFromMatrixColumn(this, 0); yAxis.setFromMatrixColumn(this, 1); zAxis.setFromMatrixColumn(this, 2); return this; } /** * Sets the given basis vectors to this matrix. * @param {Vector3} xAxis - The basis's x axis. * @param {Vector3} yAxis - The basis's y axis. * @param {Vector3} zAxis - The basis's z axis. * @returns {Matrix4} A reference to this matrix. */ makeBasis(xAxis, yAxis, zAxis) { this.set( xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1 ); return this; } /** * Extracts the rotation component of the given matrix * into this matrix's rotation component. * * Note: This method does not support reflection matrices. * @param {Matrix4} m - The matrix. * @returns {Matrix4} A reference to this matrix. */ extractRotation(m) { const te = this.elements; const me = m.elements; const scaleX = 1 / _vec3_1$6.setFromMatrixColumn(m, 0).getLength(); const scaleY = 1 / _vec3_1$6.setFromMatrixColumn(m, 1).getLength(); const scaleZ = 1 / _vec3_1$6.setFromMatrixColumn(m, 2).getLength(); te[0] = me[0] * scaleX; te[1] = me[1] * scaleX; te[2] = me[2] * scaleX; te[3] = 0; te[4] = me[4] * scaleY; te[5] = me[5] * scaleY; te[6] = me[6] * scaleY; te[7] = 0; te[8] = me[8] * scaleZ; te[9] = me[9] * scaleZ; te[10] = me[10] * scaleZ; te[11] = 0; te[12] = 0; te[13] = 0; te[14] = 0; te[15] = 1; return this; } /** * Sets the rotation component (the upper left 3x3 matrix) of this matrix to * the rotation specified by the given Euler angles. The rest of * the matrix is set to the identity. Depending on the {@link Euler#order}, * there are six possible outcomes. See [this page]{@link https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix} * for a complete list. * @param {Euler} euler - The Euler angles. * @returns {Matrix4} A reference to this matrix. */ makeRotationFromEuler(euler) { const te = this.elements; const x = euler.x, y = euler.y, z = euler.z; const a = Math.cos(x), b = Math.sin(x); const c = Math.cos(y), d = Math.sin(y); const e = Math.cos(z), f = Math.sin(z); if (euler.order === 'XYZ') { const ae = a * e, af = a * f, be = b * e, bf = b * f; te[0] = c * e; te[4] = -c * f; te[8] = d; te[1] = af + be * d; te[5] = ae - bf * d; te[9] = -b * c; te[2] = bf - ae * d; te[6] = be + af * d; te[10] = a * c; } else if (euler.order === 'YXZ') { const ce = c * e, cf = c * f, de = d * e, df = d * f; te[0] = ce + df * b; te[4] = de * b - cf; te[8] = a * d; te[1] = a * f; te[5] = a * e; te[9] = -b; te[2] = cf * b - de; te[6] = df + ce * b; te[10] = a * c; } else if (euler.order === 'ZXY') { const ce = c * e, cf = c * f, de = d * e, df = d * f; te[0] = ce - df * b; te[4] = -a * f; te[8] = de + cf * b; te[1] = cf + de * b; te[5] = a * e; te[9] = df - ce * b; te[2] = -a * d; te[6] = b; te[10] = a * c; } else if (euler.order === 'ZYX') { const ae = a * e, af = a * f, be = b * e, bf = b * f; te[0] = c * e; te[4] = be * d - af; te[8] = ae * d + bf; te[1] = c * f; te[5] = bf * d + ae; te[9] = af * d - be; te[2] = -d; te[6] = b * c; te[10] = a * c; } else if (euler.order === 'YZX') { const ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[0] = c * e; te[4] = bd - ac * f; te[8] = bc * f + ad; te[1] = f; te[5] = a * e; te[9] = -b * e; te[2] = -d * e; te[6] = ad * f + bc; te[10] = ac - bd * f; } else if (euler.order === 'XZY') { const ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[0] = c * e; te[4] = -f; te[8] = d * e; te[1] = ac * f + bd; te[5] = a * e; te[9] = ad * f - bc; te[2] = bc * f - ad; te[6] = b * e; te[10] = bd * f + ac; } // bottom row te[3] = 0; te[7] = 0; te[11] = 0; // last column te[12] = 0; te[13] = 0; te[14] = 0; te[15] = 1; return this; } /** * Sets the rotation component of this matrix to the rotation specified by q, as outlined here. * @param {Quaternion} q * @returns {Matrix4} */ makeRotationFromQuaternion(q) { return this.compose(_zero, q, _one); } /** * Constructs a rotation matrix, looking from eye towards center oriented by the up vector. * @param {Vector3} eye - The eye vector. * @param {Vector3} target - The target vector. * @param {Vector3} up - The up vector. * @returns {Matrix4} A reference to this matrix. */ lookAtRH(eye, target, up) { const te = this.elements; _z.subVectors(eye, target); if (_z.getLengthSquared() === 0) { // eye and target are in the same position _z.z = 1; } _z.normalize(); _x.crossVectors(up, _z); if (_x.getLengthSquared() === 0) { // up and z are parallel if (Math.abs(up.z) === 1) { _z.x += 0.0001; } else { _z.z += 0.0001; } _z.normalize(); _x.crossVectors(up, _z); } _x.normalize(); _y.crossVectors(_z, _x); te[0] = _x.x; te[4] = _y.x; te[8] = _z.x; te[1] = _x.y; te[5] = _y.y; te[9] = _z.y; te[2] = _x.z; te[6] = _y.z; te[10] = _z.z; return this; } /** * Post-multiplies this matrix by the given 4x4 matrix. * @param {Matrix4} m - The matrix to multiply with. * @returns {Matrix4} A reference to this matrix. */ multiply(m) { return this.multiplyMatrices(this, m); } /** * Pre-multiplies this matrix by the given 4x4 matrix. * @param {Matrix4} m - The matrix to multiply with. * @returns {Matrix4} A reference to this matrix. */ premultiply(m) { return this.multiplyMatrices(m, this); } /** * Multiples the given 4x4 matrices and stores the result * in this matrix. * @param {Matrix4} a - The first matrix. * @param {Matrix4} b - The second matrix. * @returns {Matrix4} A reference to this matrix. */ multiplyMatrices(a, b) { const ae = a.elements; const be = b.elements; const te = this.elements; const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; return this; } /** * Computes and returns the determinant of this matrix. * Based on the method outlined [here]{@link http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html}. * @returns {number} The determinant. */ determinant() { const te = this.elements; const n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12]; const n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13]; const n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14]; const n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15]; // TODO: make this more efficient return ( n41 * ( +n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34 ) + n42 * ( +n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31 ) + n43 * ( +n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31 ) + n44 * ( -n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31 ) ); } /** * Transposes this matrix in place. * @returns {Matrix4} A reference to this matrix. */ transpose() { const te = this.elements; let tmp; tmp = te[1]; te[1] = te[4]; te[4] = tmp; tmp = te[2]; te[2] = te[8]; te[8] = tmp; tmp = te[6]; te[6] = te[9]; te[9] = tmp; tmp = te[3]; te[3] = te[12]; te[12] = tmp; tmp = te[7]; te[7] = te[13]; te[13] = tmp; tmp = te[11]; te[11] = te[14]; te[14] = tmp; return this; } /** * Sets the position component for this matrix from the given vector, * without affecting the rest of the matrix. * @param {number|Vector3} x - The x component of the vector or alternatively the vector object. * @param {number} y - The y component of the vector. * @param {number} z - The z component of the vector. * @returns {Matrix4} A reference to this matrix. */ setPosition(x, y, z) { const te = this.elements; if (x.isVector3) { te[12] = x.x; te[13] = x.y; te[14] = x.z; } else { te[12] = x; te[13] = y; te[14] = z; } return this; } /** * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}. * You can not invert with a determinant of zero. If you attempt this, the method produces * a zero matrix instead. * @returns {Matrix4} A reference to this matrix. */ invert() { // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n41 = te[3], n12 = te[4], n22 = te[5], n32 = te[6], n42 = te[7], n13 = te[8], n23 = te[9], n33 = te[10], n43 = te[11], n14 = te[12], n24 = te[13], n34 = te[14], n44 = te[15], t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const detInv = 1 / det; te[0] = t11 * detInv; te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv; te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv; te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv; te[4] = t12 * detInv; te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv; te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv; te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv; te[8] = t13 * detInv; te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv; te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv; te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv; te[12] = t14 * detInv; te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv; te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv; te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv; return this; } /** * Gets the maximum scale value of the three axes. * @returns {number} The maximum scale. */ getMaxScaleOnAxis() { const te = this.elements; const scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2]; const scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6]; const scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10]; return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)); } /** * Sets this matrix as a translation transform from the given vector. * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector. * @param {number} y - The amount to translate in the Y axis. * @param {number} z - The amount to translate in the z axis. * @returns {Matrix4} A reference to this matrix. */ makeTranslation(x, y, z) { if (x.isVector3) { this.set( 1, 0, 0, x.x, 0, 1, 0, x.y, 0, 0, 1, x.z, 0, 0, 0, 1 ); } else { this.set( 1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1 ); } return this; } /** * Sets this matrix as a rotational transformation around the given axis by * the given angle. * This is a somewhat controversial but mathematically sound alternative to * rotating via Quaternions. See the discussion [here]{@link https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199}. * @param {Vector3} axis - The normalized rotation axis. * @param {number} angle - The rotation in radians. * @returns {Matrix4} A reference to this matrix. */ makeRotationAxis(axis, angle) { // Based on http://www.gamedev.net/reference/articles/article1199.asp const c = Math.cos(angle); const s = Math.sin(angle); const t = 1 - c; const x = axis.x, y = axis.y, z = axis.z; const tx = t * x, ty = t * y; return this.set( tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1 ); } /** * Sets this matrix as a scale transformation. * @param {number} x - The amount to scale in the X axis. * @param {number} y - The amount to scale in the Y axis. * @param {number} z - The amount to scale in the Z axis. * @returns {Matrix4} A reference to this matrix. */ makeScale(x, y, z) { return this.set( x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1 ); } /** * Sets this matrix to the transformation composed of the given position, * rotation (Quaternion) and scale. * @param {Vector3} position - The position vector. * @param {Quaternion} quaternion - The rotation as a Quaternion. * @param {Vector3} scale - The scale vector. * @returns {Matrix4} A reference to this matrix. */ compose(position, quaternion, scale) { const te = this.elements; const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; const x2 = x + x, y2 = y + y, z2 = z + z; const xx = x * x2, xy = x * y2, xz = x * z2; const yy = y * y2, yz = y * z2, zz = z * z2; const wx = w * x2, wy = w * y2, wz = w * z2; const sx = scale.x, sy = scale.y, sz = scale.z; te[0] = (1 - (yy + zz)) * sx; te[1] = (xy + wz) * sx; te[2] = (xz - wy) * sx; te[3] = 0; te[4] = (xy - wz) * sy; te[5] = (1 - (xx + zz)) * sy; te[6] = (yz + wx) * sy; te[7] = 0; te[8] = (xz + wy) * sz; te[9] = (yz - wx) * sz; te[10] = (1 - (xx + yy)) * sz; te[11] = 0; te[12] = position.x; te[13] = position.y; te[14] = position.z; te[15] = 1; return this; } /** * Decomposes this matrix into its position, rotation and scale components * and provides the result in the given objects. * Note: Not all matrices are decomposable in this way. For example, if an * object has a non-uniformly scaled parent, then the object's world matrix * may not be decomposable, and this method may not be appropriate. * @param {Vector3} position - The position vector. * @param {Quaternion} quaternion - The rotation as a Quaternion. * @param {Vector3} scale - The scale vector. * @returns {Matrix4} A reference to this matrix. */ decompose(position, quaternion, scale) { const te = this.elements; let sx = _vec3_1$6.set(te[0], te[1], te[2]).getLength(); const sy = _vec3_1$6.set(te[4], te[5], te[6]).getLength(); const sz = _vec3_1$6.set(te[8], te[9], te[10]).getLength(); // if determine is negative, we need to invert one scale const det = this.determinant(); if (det < 0) { sx = -sx; } position.x = te[12]; position.y = te[13]; position.z = te[14]; // scale the rotation part _mat4_1$3.copy(this); const invSX = 1 / sx; const invSY = 1 / sy; const invSZ = 1 / sz; _mat4_1$3.elements[0] *= invSX; _mat4_1$3.elements[1] *= invSX; _mat4_1$3.elements[2] *= invSX; _mat4_1$3.elements[4] *= invSY; _mat4_1$3.elements[5] *= invSY; _mat4_1$3.elements[6] *= invSY; _mat4_1$3.elements[8] *= invSZ; _mat4_1$3.elements[9] *= invSZ; _mat4_1$3.elements[10] *= invSZ; quaternion.setFromRotationMatrix(_mat4_1$3); scale.x = sx; scale.y = sy; scale.z = sz; return this; } /** * Returns `true` if this matrix is equal with the given one. * @param {Matrix4} matrix - The matrix to test for equality. * @returns {boolean} Whether this matrix is equal with the given one. */ equals(matrix) { const te = this.elements; const me = matrix.elements; for (let i = 0; i < 16; i++) { if (te[i] !== me[i]) return false; } return true; } /** * Sets the elements of the matrix from the given array. * @param {Array} array - The matrix elements in column-major order. * @param {number} [offset=0] - Index of the first element in the array. * @returns {Matrix4} A reference to this matrix. */ fromArray(array, offset = 0) { for (let i = 0; i < 16; i++) { this.elements[i] = array[i + offset]; } return this; } /** * Writes the elements of this matrix to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order. * @param {number} [offset=0] - Index of the first element in the array. * @returns {Array} The matrix elements in column-major order. */ toArray(array = [], offset = 0) { const te = this.elements; array[offset] = te[0]; array[offset + 1] = te[1]; array[offset + 2] = te[2]; array[offset + 3] = te[3]; array[offset + 4] = te[4]; array[offset + 5] = te[5]; array[offset + 6] = te[6]; array[offset + 7] = te[7]; array[offset + 8] = te[8]; array[offset + 9] = te[9]; array[offset + 10] = te[10]; array[offset + 11] = te[11]; array[offset + 12] = te[12]; array[offset + 13] = te[13]; array[offset + 14] = te[14]; array[offset + 15] = te[15]; return array; } /** * Linearly interpolates between two matrix4. * @param {Matrix4} m1 * @param {Matrix4} m2 * @param {number} ratio * @returns {Matrix4} */ lerpMatrices(m1, m2, ratio) { if (ratio === 0) return this.copy(m1); if (ratio === 1) return this.copy(m2); const te = this.elements, te1 = m1.elements, te2 = m2.elements; for (let i = 0; i < 16; i++) { te[i] = te1[i] * (1 - ratio) + te2[i] * ratio; } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Matrix4.prototype.isMatrix4 = true; const _vec3_1$6 = new Vector3(); const _mat4_1$3 = new Matrix4(); const _zero = new Vector3(0, 0, 0); const _one = new Vector3(1, 1, 1); const _x = new Vector3(); const _y = new Vector3(); const _z = new Vector3(); /** * Class for representing a Quaternion. */ class Quaternion { /** * Constructs a new quaternion. * @param {number} [x=0] - The x value of this quaternion. * @param {number} [y=0] - The y value of this quaternion. * @param {number} [z=0] - The z value of this quaternion. * @param {number} [w=1] - The w value of this quaternion. */ constructor(x = 0, y = 0, z = 0, w = 1) { this._x = x; this._y = y; this._z = z; this._w = w; } /** * Interpolates between two quaternions via SLERP. This implementation assumes the * quaternion data are managed in flat arrays. * @param {Array} dst - The destination array. * @param {number} dstOffset - An offset into the destination array. * @param {Array} src0 - The source array of the first quaternion. * @param {number} srcOffset0 - An offset into the first source array. * @param {Array} src1 - The source array of the second quaternion. * @param {number} srcOffset1 - An offset into the second source array. * @param {number} t - The interpolation factor in the range `[0,1]`. * @see {@link Quaternion#slerp} */ static slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) { let x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3]; let x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3]; if (t <= 0) { dst[dstOffset + 0] = x0; dst[dstOffset + 1] = y0; dst[dstOffset + 2] = z0; dst[dstOffset + 3] = w0; return; } if (t >= 1) { dst[dstOffset + 0] = x1; dst[dstOffset + 1] = y1; dst[dstOffset + 2] = z1; dst[dstOffset + 3] = w1; return; } if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { let dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1; if (dot < 0) { x1 = -x1; y1 = -y1; z1 = -z1; w1 = -w1; dot = -dot; } let s = 1 - t; if (dot < 0.9995) { // slerp const theta = Math.acos(dot); const sin = Math.sin(theta); s = Math.sin(s * theta) / sin; t = Math.sin(t * theta) / sin; x0 = x0 * s + x1 * t; y0 = y0 * s + y1 * t; z0 = z0 * s + z1 * t; w0 = w0 * s + w1 * t; } else { // for small angles, lerp then normalize x0 = x0 * s + x1 * t; y0 = y0 * s + y1 * t; z0 = z0 * s + z1 * t; w0 = w0 * s + w1 * t; const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0); x0 *= f; y0 *= f; z0 *= f; w0 *= f; } } dst[dstOffset] = x0; dst[dstOffset + 1] = y0; dst[dstOffset + 2] = z0; dst[dstOffset + 3] = w0; } /** * Multiplies two quaternions. This implementation assumes the quaternion data are managed * in flat arrays. * @param {Array} dst - The destination array. * @param {number} dstOffset - An offset into the destination array. * @param {Array} src0 - The source array of the first quaternion. * @param {number} srcOffset0 - An offset into the first source array. * @param {Array} src1 - The source array of the second quaternion. * @param {number} srcOffset1 - An offset into the second source array. * @returns {Array} The destination array. * @see {@link Quaternion#multiplyQuaternions} */ static multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) { const x0 = src0[srcOffset0]; const y0 = src0[srcOffset0 + 1]; const z0 = src0[srcOffset0 + 2]; const w0 = src0[srcOffset0 + 3]; const x1 = src1[srcOffset1]; const y1 = src1[srcOffset1 + 1]; const z1 = src1[srcOffset1 + 2]; const w1 = src1[srcOffset1 + 3]; dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; return dst; } /** * The x value of this quaternion. * @type {number} * @default 0 */ get x() { return this._x; } set x(value) { this._x = value; this.onChangeCallback(); } /** * The y value of this quaternion. * @type {number} * @default 0 */ get y() { return this._y; } set y(value) { this._y = value; this.onChangeCallback(); } /** * The z value of this quaternion. * @type {number} * @default 0 */ get z() { return this._z; } set z(value) { this._z = value; this.onChangeCallback(); } /** * The w value of this quaternion. * @type {number} * @default 1 */ get w() { return this._w; } set w(value) { this._w = value; this.onChangeCallback(); } /** * Sets the quaternion components. * @param {number} x - The x value of this quaternion. * @param {number} y - The y value of this quaternion. * @param {number} z - The z value of this quaternion. * @param {number} w - The w value of this quaternion. * @returns {Quaternion} A reference to this quaternion. */ set(x, y, z, w) { this._x = x; this._y = y; this._z = z; this._w = w; this.onChangeCallback(); return this; } /** * Returns a new quaternion with copied values from this instance. * @returns {Quaternion} A clone of this instance. */ clone() { return new Quaternion(this._x, this._y, this._z, this._w); } /** * Copies the values of the given quaternion to this instance. * @param {Quaternion} quaternion - The quaternion to copy. * @returns {Quaternion} A reference to this quaternion. */ copy(quaternion) { this._x = quaternion.x; this._y = quaternion.y; this._z = quaternion.z; this._w = quaternion.w; this.onChangeCallback(); return this; } /** * Sets this quaternion from the rotation specified by the given * Euler angles. * @param {Euler} euler - The Euler angles. * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. * @returns {Quaternion} A reference to this quaternion. */ setFromEuler(euler, update = true) { const c1 = Math.cos(euler._x / 2); const c2 = Math.cos(euler._y / 2); const c3 = Math.cos(euler._z / 2); const s1 = Math.sin(euler._x / 2); const s2 = Math.sin(euler._y / 2); const s3 = Math.sin(euler._z / 2); const order = euler._order; if (order === 'XYZ') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'YXZ') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if (order === 'ZXY') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'ZYX') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if (order === 'YZX') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'XZY') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } if (update === true) this.onChangeCallback(); return this; } /** * Sets this quaternion from the given axis and angle. * @param {Vector3} axis - The normalized axis. * @param {number} angle - The angle in radians. * @returns {Quaternion} A reference to this quaternion. */ setFromAxisAngle(axis, angle) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm const halfAngle = angle / 2, s = Math.sin(halfAngle); this._x = axis.x * s; this._y = axis.y * s; this._z = axis.z * s; this._w = Math.cos(halfAngle); this.onChangeCallback(); return this; } /** * Sets this quaternion from the given rotation matrix. * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled). * @returns {Quaternion} A reference to this quaternion. */ setFromRotationMatrix(m) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) const te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10], trace = m11 + m22 + m33; let s; if (trace > 0) { s = 0.5 / Math.sqrt(trace + 1.0); this._w = 0.25 / s; this._x = (m32 - m23) * s; this._y = (m13 - m31) * s; this._z = (m21 - m12) * s; } else if (m11 > m22 && m11 > m33) { s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33); this._w = (m32 - m23) / s; this._x = 0.25 * s; this._y = (m12 + m21) / s; this._z = (m13 + m31) / s; } else if (m22 > m33) { s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33); this._w = (m13 - m31) / s; this._x = (m12 + m21) / s; this._y = 0.25 * s; this._z = (m23 + m32) / s; } else { s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22); this._w = (m21 - m12) / s; this._x = (m13 + m31) / s; this._y = (m23 + m32) / s; this._z = 0.25 * s; } this.onChangeCallback(); return this; } /** * Sets this quaternion to the rotation required to rotate the direction vector * `vFrom` to the direction vector `vTo`. * @param {Vector3} vFrom - The first (normalized) direction vector. * @param {Vector3} vTo - The second (normalized) direction vector. * @returns {Quaternion} A reference to this quaternion. */ setFromUnitVectors(vFrom, vTo) { // assumes direction vectors vFrom and vTo are normalized let r = vFrom.dot(vTo) + 1; if (r < 1e-8) { // vFrom and vTo point in opposite directions r = 0; if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) { this._x = -vFrom.y; this._y = vFrom.x; this._z = 0; this._w = r; } else { this._x = 0; this._y = -vFrom.z; this._z = vFrom.y; this._w = r; } } else { // crossVectors(vFrom, vTo); // inlined to avoid cyclic dependency on Vector3 this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; this._w = r; } return this.normalize(); } /** * Returns the angle between this quaternion and the given one in radians. * @param {Quaternion} q - The quaternion to compute the angle with. * @returns {number} The angle in radians. */ angleTo(q) { return 2 * Math.acos(Math.abs(MathUtils.clamp(this.dot(q), -1, 1))); } /** * Sets this quaternion to the identity quaternion; that is, to the * quaternion that represents "no rotation". * @returns {Quaternion} A reference to this quaternion. */ identity() { return this.set(0, 0, 0, 1); } /** * Returns the rotational conjugate of this quaternion. The conjugate of a * quaternion represents the same rotation in the opposite direction about * the rotational axis. * @returns {Quaternion} A reference to this quaternion. */ conjugate() { this._x *= -1; this._y *= -1; this._z *= -1; this.onChangeCallback(); return this; } /** * Calculates the dot product of this quaternion and the given one. * @param {Quaternion} v - The quaternion to compute the dot product with. * @returns {number} The result of the dot product. */ dot(v) { return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; } /** * Computes the squared Euclidean length (straight-line length) of this quaternion, * considered as a 4 dimensional vector. This can be useful if you are comparing the * lengths of two quaternions, as this is a slightly more efficient calculation than * {@link Quaternion#length}. * @returns {number} The squared Euclidean length. */ lengthSq() { return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; } /** * Computes the Euclidean length (straight-line length) of this quaternion, * considered as a 4 dimensional vector. * @returns {number} The Euclidean length. */ length() { return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w); } /** * Normalizes this quaternion - that is, calculated the quaternion that performs * the same rotation as this one, but has a length equal to `1`. * @returns {Quaternion} A reference to this quaternion. */ normalize() { let l = this.length(); if (l === 0) { this._x = 0; this._y = 0; this._z = 0; this._w = 1; } else { l = 1 / l; this._x = this._x * l; this._y = this._y * l; this._z = this._z * l; this._w = this._w * l; } this.onChangeCallback(); return this; } /** * Multiplies this quaternion by the given one. * @param {Quaternion} q - The quaternion. * @returns {Quaternion} A reference to this quaternion. */ multiply(q) { return this.multiplyQuaternions(this, q); } /** * Pre-multiplies this quaternion by the given one. * @param {Quaternion} q - The quaternion. * @returns {Quaternion} A reference to this quaternion. */ premultiply(q) { return this.multiplyQuaternions(q, this); } /** * Multiplies the given quaternions and stores the result in this instance. * @param {Quaternion} a - The first quaternion. * @param {Quaternion} b - The second quaternion. * @returns {Quaternion} A reference to this quaternion. */ multiplyQuaternions(a, b) { // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; this.onChangeCallback(); return this; } /** * Linearly interpolates between two quaternions. * @param {Quaternion} q1 * @param {Quaternion} q2 * @param {number} ratio * @returns {Quaternion} */ lerpQuaternions(q1, q2, ratio) { if (ratio === 0) return this.copy(q1); if (ratio === 1) return this.copy(q2); const w1 = q1._w, x1 = q1._x, y1 = q1._y, z1 = q1._z; let w2 = q2._w, x2 = q2._x, y2 = q2._y, z2 = q2._z; const dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2; // shortest direction if (dot < 0) { w2 = -w2; x2 = -x2; y2 = -y2; z2 = -z2; } this._w = w1 + ratio * (w2 - w1); this._x = x1 + ratio * (x2 - x1); this._y = y1 + ratio * (y2 - y1); this._z = z1 + ratio * (z2 - z1); const len = 1.0 / Math.sqrt(this._w * this._w + this._x * this._x + this._y * this._y + this._z * this._z); this._w *= len; this._x *= len; this._y *= len; this._z *= len; this.onChangeCallback(); return this; } /** * Performs a spherical linear interpolation between quaternions. * @param {Quaternion} qb - The target quaternion. * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. * @returns {Quaternion} A reference to this quaternion. */ slerp(qb, t) { if (t <= 0) return this; if (t >= 1) return this.copy(qb); // copy calls onChangeCallback() let x = qb._x, y = qb._y, z = qb._z, w = qb._w; let dot = this.dot(qb); if (dot < 0) { x = -x; y = -y; z = -z; w = -w; dot = -dot; } let s = 1 - t; if (dot < 0.9995) { // slerp const theta = Math.acos(dot); const sin = Math.sin(theta); s = Math.sin(s * theta) / sin; t = Math.sin(t * theta) / sin; this._x = this._x * s + x * t; this._y = this._y * s + y * t; this._z = this._z * s + z * t; this._w = this._w * s + w * t; this.onChangeCallback(); } else { // for small angles, lerp then normalize this._x = this._x * s + x * t; this._y = this._y * s + y * t; this._z = this._z * s + z * t; this._w = this._w * s + w * t; this.normalize(); // normalize calls onChangeCallback() } return this; } /** * Performs a spherical linear interpolation between the given quaternions * and stores the result in this quaternion. * @param {Quaternion} qa - The source quaternion. * @param {Quaternion} qb - The target quaternion. * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. * @returns {Quaternion} A reference to this quaternion. */ slerpQuaternions(qa, qb, t) { return this.copy(qa).slerp(qb, t); } /** * Returns `true` if this quaternion is equal with the given one. * @param {Quaternion} quaternion - The quaternion to test for equality. * @returns {boolean} Whether this quaternion is equal with the given one. */ equals(quaternion) { return (quaternion._x === this._x) && (quaternion._y === this._y) && (quaternion._z === this._z) && (quaternion._w === this._w); } /** * Sets this quaternion's components from the given array. * @param {Array} array - An array holding the quaternion component values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Quaternion} A reference to this quaternion. */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2], w = array[offset + 3]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); w = MathUtils.denormalize(w, array); } this._x = x; this._y = y; this._z = z; this._w = w; this.onChangeCallback(); return this; } /** * Writes the components of this quaternion to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the quaternion components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {Quaternion} The quaternion components. */ toArray(array = [], offset = 0, normalize = false) { let x = this._x, y = this._y, z = this._z, w = this._w; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); w = MathUtils.normalize(w, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; array[offset + 3] = w; return array; } /** * Convert the current quaternion to a matrix4. * @param {Matrix4} target - The target matrix to write the quaternion data to. * @returns {Matrix4} The target matrix with the quaternion data written to it. */ toMatrix4(target = new Matrix4()) { const ele = target.elements; const xy2 = 2.0 * this._x * this._y, xz2 = 2.0 * this._x * this._z, xw2 = 2.0 * this._x * this._w; const yz2 = 2.0 * this._y * this._z, yw2 = 2.0 * this._y * this._w, zw2 = 2.0 * this._z * this._w; const xx = this._x * this._x, yy = this._y * this._y, zz = this._z * this._z, ww = this._w * this._w; ele[0] = xx - yy - zz + ww; ele[4] = xy2 - zw2; ele[8] = xz2 + yw2; ele[12] = 0; ele[1] = xy2 + zw2; ele[5] = -xx + yy - zz + ww; ele[9] = yz2 - xw2; ele[13] = 0; ele[2] = xz2 - yw2; ele[6] = yz2 + xw2; ele[10] = -xx - yy + zz + ww; ele[14] = 0; ele[3] = 0.0; ele[7] = 0.0; ele[11] = 0; ele[15] = 1; return target; } /** * Registers a callback that is called whenever the quaternion's * angle value changes. * @param {Function} callback - When the Quaternion angle value changes, the callback method is triggered * @returns {Quaternion} A reference to this quaternion. */ onChange(callback) { this.onChangeCallback = callback; return this; } onChangeCallback() {} * [Symbol.iterator]() { yield this._x; yield this._y; yield this._z; yield this._w; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Quaternion.prototype.isQuaternion = true; /** * Interpolant serves as the base class for all interpolation algorithms. * It defines a set of static methods that are intended to be invoked by a keyframe track for the purpose of interpolation. * @abstract */ class KeyframeInterpolant { /** * Get the value size for keyframe values. * @returns {number} - the value size. */ static getValueSize() { return this.values.length / this.times.length; } /** * Interpolate the value for the specified time. * @param {number} index0 - the index of the first keyframe. * @param {number} ratio - the ratio (0-1) of the time passed between the first keyframe and the next keyframe. * @param {number} duration - the duration time between the first keyframe and the next keyframe. * @param {Array} outBuffer - the output buffer to store the interpolated value. * @returns {Array} - the output buffer to store the interpolated value. */ static interpolate(index0, ratio, duration, outBuffer) { throw new Error('Interpolant: call to abstract method'); } /** * Copy the value for the specified index. * @param {number} index - the index of the keyframe. * @param {Array} outBuffer - the output buffer to store the copied value. * @returns {Array} - the output buffer to store the copied value. */ static copyValue(index, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Step (Discrete) interpolation of keyframe values. * @extends KeyframeInterpolant */ class StepInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index0; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Linear interpolation of keyframe values. * @extends KeyframeInterpolant */ class LinearInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, offset0 = index0 * valueSize, offset1 = (index0 + 1) * valueSize; let value1, value2; for (let i = 0; i < valueSize; i++) { value1 = values[offset0 + i]; value2 = values[offset1 + i]; if (value1 !== undefined && value2 !== undefined) { outBuffer[i] = value1 * (1 - ratio) + value2 * ratio; } else { outBuffer[i] = value1; } } return outBuffer; } } /** * Quaternion Linear interpolation of keyframe values. * @extends KeyframeInterpolant */ class QuaternionLinearInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize; Quaternion.slerpFlat(outBuffer, 0, values, index0 * valueSize, values, (index0 + 1) * valueSize, ratio); return outBuffer; } } /** * Cubic spline interpolation of keyframe values. * @extends KeyframeInterpolant */ class CubicSplineInterpolant extends KeyframeInterpolant { static getValueSize() { return this.values.length / this.times.length / 3; } static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, valueSize2 = valueSize * 2, valueSize3 = valueSize * 3, rr = ratio * ratio, rrr = rr * ratio, offset0 = index0 * valueSize3, offset1 = offset0 + valueSize3, s2 = -2 * rrr + 3 * rr, s3 = rrr - rr, s0 = 1 - s2, s1 = s3 - rr + ratio; // Layout of keyframe output values for CUBICSPLINE animations: // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] for (let i = 0; i < valueSize; i++) { const p0 = values[offset0 + i + valueSize], // splineVertex_k m0 = values[offset0 + i + valueSize2] * duration, // outTangent_k * (t_k+1 - t_k) p1 = values[offset1 + i + valueSize], // splineVertex_k+1 m1 = values[offset1 + i] * duration; // inTangent_k+1 * (t_k+1 - t_k) outBuffer[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; } return outBuffer; } static copyValue(index, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index * 3 + valueSize; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Quaternion Cubic spline interpolation of keyframe values. * @extends CubicSplineInterpolant */ class QuaternionCubicSplineInterpolant extends CubicSplineInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const result = super.interpolate(index0, ratio, duration, outBuffer); _q.fromArray(result).normalize().toArray(result); return result; } } const _q = new Quaternion(); /** * Base class for property track. * @abstract */ class KeyframeTrack { /** * @param {Object3D|Material} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant = LinearInterpolant) { this.target = target; this.propertyPath = propertyPath; this.name = this.target.uuid + '.' + propertyPath; this.times = times; this.values = values; this.valueSize = 0; this.interpolant = null; // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = LinearInterpolant; } else if (interpolant === false) { interpolant = StepInterpolant; } this.setInterpolant(interpolant); } /** * Set interpolant for this keyframe track. * @param {KeyframeInterpolant.constructor} interpolant * @returns {KeyframeTrack} */ setInterpolant(interpolant) { this.valueSize = interpolant.getValueSize.call(this); this.interpolant = interpolant; return this; } /** * Get value at time. * The value will be interpolated by interpolant if time is between keyframes. * @param {number} t - time * @param {Array} outBuffer - output buffer * @returns {Array} output buffer */ getValue(t, outBuffer) { const interpolant = this.interpolant, times = this.times, tl = times.length; if (t <= times[0]) { return interpolant.copyValue.call(this, 0, outBuffer); } else if (t >= times[tl - 1]) { return interpolant.copyValue.call(this, tl - 1, outBuffer); } // TODO use index cache for better performance // https://github.com/mrdoob/three.js/blob/dev/src/math/Interpolant.js let i0 = tl - 1; while (t < times[i0] && i0 > 0) { i0--; } const duration = times[i0 + 1] - times[i0]; const ratio = (t - times[i0]) / duration; return interpolant.interpolate.call(this, i0, ratio, duration, outBuffer); } } /** * Used for boolean property track. * @extends KeyframeTrack */ class BooleanKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant] */ constructor(target, propertyPath, times, values, interpolant = StepInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = StepInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'bool' */ BooleanKeyframeTrack.prototype.valueTypeName = 'bool'; /** * Used for color property track. * @extends KeyframeTrack */ class ColorKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'color' */ ColorKeyframeTrack.prototype.valueTypeName = 'color'; /** * Used for number property track. * @extends KeyframeTrack */ class NumberKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'number' */ NumberKeyframeTrack.prototype.valueTypeName = 'number'; /** * Used for quaternion property track. * @extends KeyframeTrack */ class QuaternionKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=QuaternionLinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant = QuaternionLinearInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = QuaternionLinearInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'quaternion' */ QuaternionKeyframeTrack.prototype.valueTypeName = 'quaternion'; /** * Used for string property track. * @extends KeyframeTrack */ class StringKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant] */ constructor(target, propertyPath, times, values, interpolant = StepInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = StepInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'string' */ StringKeyframeTrack.prototype.valueTypeName = 'string'; /** * Used for vector property track. * @extends KeyframeTrack */ class VectorKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'vector' */ VectorKeyframeTrack.prototype.valueTypeName = 'vector'; /** * Enum for material Type. * @readonly * @enum {string} */ const MATERIAL_TYPE = { BASIC: 'basic', LAMBERT: 'lambert', PHONG: 'phong', PBR: 'pbr', PBR2: 'pbr2', POINT: 'point', LINE: 'line', SHADER: 'shader', DEPTH: 'depth', DISTANCE: 'distance' }; /** * Enum for blend Type. * @readonly * @enum {string} */ const BLEND_TYPE = { NONE: 'none', NORMAL: 'normal', ADD: 'add', SUB: 'sub', MUL: 'mul', CUSTOM: 'custom' }; /** * Enum for blend equation. * @readonly * @enum {number} */ const BLEND_EQUATION = { ADD: 100, SUBTRACT: 101, REVERSE_SUBTRACT: 102, /** Only webgl2 */ MIN: 103, MAX: 104 }; /** * Enum for blend factor. * @readonly * @enum {number} */ const BLEND_FACTOR = { ZERO: 200, ONE: 201, SRC_COLOR: 202, SRC_ALPHA: 203, SRC_ALPHA_SATURATE: 204, DST_COLOR: 205, DST_ALPHA: 206, ONE_MINUS_SRC_COLOR: 207, ONE_MINUS_SRC_ALPHA: 208, ONE_MINUS_DST_COLOR: 209, ONE_MINUS_DST_ALPHA: 210 }; /** * Enum for cull face Type. * @readonly * @enum {string} */ const CULL_FACE_TYPE = { NONE: 'none', FRONT: 'front', BACK: 'back', FRONT_AND_BACK: 'front_and_back' }; /** * Enum for draw side. * @readonly * @enum {string} */ const DRAW_SIDE = { FRONT: 'front', BACK: 'back', DOUBLE: 'double' }; /** * Enum for shading side. * @readonly * @enum {string} */ const SHADING_TYPE = { SMOOTH_SHADING: 'smooth_shading', FLAT_SHADING: 'flat_shading' }; /** * Enum for pixel format. * @readonly * @enum {number} */ const PIXEL_FORMAT = { DEPTH_COMPONENT: 1000, DEPTH_STENCIL: 1001, STENCIL_INDEX8: 1002, ALPHA: 1003, RED: 1004, RGB: 1005, RGBA: 1006, LUMINANCE: 1007, LUMINANCE_ALPHA: 1008, /** Only webgl2 */ RED_INTEGER: 1010, RG: 1011, RG_INTEGER: 1012, RGB_INTEGER: 1013, RGBA_INTEGER: 1014, /** Only internal formats and webgl2 */ R32F: 1100, R16F: 1101, R8: 1102, RG32F: 1103, RG16F: 1104, RG8: 1105, RGB32F: 1106, RGB16F: 1107, RGB8: 1108, RGBA32F: 1109, RGBA16F: 1110, RGBA8: 1111, RGBA4: 1112, RGB5_A1: 1113, DEPTH_COMPONENT32F: 1114, DEPTH_COMPONENT24: 1115, DEPTH_COMPONENT16: 1116, DEPTH24_STENCIL8: 1117, DEPTH32F_STENCIL8: 1118, R11F_G11F_B10F: 1119, /** For compressed texture formats */ RGB_S3TC_DXT1: 1200, RGBA_S3TC_DXT1: 1201, RGBA_S3TC_DXT3: 1202, RGBA_S3TC_DXT5: 1203, RGB_PVRTC_4BPPV1: 1204, RGB_PVRTC_2BPPV1: 1205, RGBA_PVRTC_4BPPV1: 1206, RGBA_PVRTC_2BPPV1: 1207, RGB_ETC1: 1208, RGBA_ASTC_4x4: 1209, RGBA_BPTC: 1210, RGB_BPTC_SIGNED_FORMAT: 1211, RGB_BPTC_UNSIGNED_FORMAT: 1212 }; /** * Enum for pixel Type. * @readonly * @enum {number} */ const PIXEL_TYPE = { UNSIGNED_BYTE: 1500, UNSIGNED_SHORT_5_6_5: 1501, UNSIGNED_SHORT_4_4_4_4: 1502, UNSIGNED_SHORT_5_5_5_1: 1503, UNSIGNED_SHORT: 1504, UNSIGNED_INT: 1505, UNSIGNED_INT_24_8: 1506, FLOAT: 1507, HALF_FLOAT: 1508, FLOAT_32_UNSIGNED_INT_24_8_REV: 1509, BYTE: 1510, SHORT: 1511, INT: 1512 }; /** * Enum for texture filter. * @readonly * @enum {number} */ const TEXTURE_FILTER = { NEAREST: 1600, LINEAR: 1601, NEAREST_MIPMAP_NEAREST: 1602, LINEAR_MIPMAP_NEAREST: 1603, NEAREST_MIPMAP_LINEAR: 1604, LINEAR_MIPMAP_LINEAR: 1605 }; /** * Enum for texture wrap. * @readonly * @enum {number} */ const TEXTURE_WRAP = { REPEAT: 1700, CLAMP_TO_EDGE: 1701, MIRRORED_REPEAT: 1702 }; /** * Enum for compare function. * @readonly * @enum {number} */ const COMPARE_FUNC = { LEQUAL: 0x0203, GEQUAL: 0x0206, LESS: 0x0201, GREATER: 0x0204, EQUAL: 0x0202, NOTEQUAL: 0x0205, ALWAYS: 0x0207, NEVER: 0x0200 }; /** * Enum for operation. * @readonly * @enum {number} */ const OPERATION = { KEEP: 0x1E00, REPLACE: 0x1E01, INCR: 0x1E02, DECR: 0x1E03, INVERT: 0x150A, INCR_WRAP: 0x8507, DECR_WRAP: 0x8508 }; /** * Enum for Shadow Type. * @readonly * @enum {string} */ const SHADOW_TYPE = { HARD: 'hard', POISSON_SOFT: 'poisson_soft', VOGEL5_SOFT: 'vogel5_soft', PCF3_SOFT: 'pcf3_soft', PCF5_SOFT: 'pcf5_soft', /** Only webgl2 */ PCSS16_SOFT: 'pcss16_soft', PCSS32_SOFT: 'pcss32_soft', PCSS64_SOFT: 'pcss64_soft' }; /** * Enum for Texel Encoding Type. * @readonly * @enum {string} */ const TEXEL_ENCODING_TYPE = { LINEAR: 'linear', SRGB: 'sRGB', GAMMA: 'Gamma' }; /** * Enum for Envmap Combine Type. * @readonly * @enum {string} */ const ENVMAP_COMBINE_TYPE = { MULTIPLY: 'ENVMAP_BLENDING_MULTIPLY', MIX: 'ENVMAP_BLENDING_MIX', ADD: 'ENVMAP_BLENDING_ADD' }; /** * Enum for Draw Mode. * @readonly * @enum {number} */ const DRAW_MODE = { POINTS: 0, LINES: 1, LINE_LOOP: 2, LINE_STRIP: 3, TRIANGLES: 4, TRIANGLE_STRIP: 5, TRIANGLE_FAN: 6 }; /** * Enum for Vertex Color. * @readonly * @enum {number} */ const VERTEX_COLOR = { NONE: 0, RGB: 1, RGBA: 2 }; /** * Enum for ATTACHMENT * @readonly * @enum {number} */ const ATTACHMENT = { COLOR_ATTACHMENT0: 2000, COLOR_ATTACHMENT1: 2001, COLOR_ATTACHMENT2: 2002, COLOR_ATTACHMENT3: 2003, COLOR_ATTACHMENT4: 2004, COLOR_ATTACHMENT5: 2005, COLOR_ATTACHMENT6: 2006, COLOR_ATTACHMENT7: 2007, COLOR_ATTACHMENT8: 2008, COLOR_ATTACHMENT9: 2009, COLOR_ATTACHMENT10: 2010, COLOR_ATTACHMENT11: 2011, COLOR_ATTACHMENT12: 2012, COLOR_ATTACHMENT13: 2013, COLOR_ATTACHMENT14: 2014, COLOR_ATTACHMENT15: 2015, DEPTH_ATTACHMENT: 2020, STENCIL_ATTACHMENT: 2021, DEPTH_STENCIL_ATTACHMENT: 2030 }; /** * Enum for BUFFER_USAGE * @readonly * @enum {number} */ const BUFFER_USAGE = { STREAM_DRAW: 35040, STREAM_READ: 35041, STREAM_COPY: 35042, STATIC_DRAW: 35044, STATIC_READ: 35045, STATIC_COPY: 35046, DYNAMIC_DRAW: 35048, DYNAMIC_READ: 35049, DYNAMIC_COPY: 35050 }; /** * Enum for QUERYSET_TYPE * @readonly * @enum {number} */ const QUERYSET_TYPE = { OCCLUSION: 8000, TIMESTAMP: 8001 }; /** * JavaScript events for custom objects. */ class EventDispatcher { /** * Adds a listener to an event type. * @param {string} type - The type of event to listen to. * @param {Function} listener - The function that gets called when the event is fired. */ addEventListener(type, listener) { if (this._listeners === undefined) this._listeners = {}; const listeners = this._listeners; if (listeners[type] === undefined) { listeners[type] = []; } if (listeners[type].indexOf(listener) === -1) { listeners[type].push(listener); } } /** * Removes a listener from an event type. * @param {string} type - The type of the listener that gets removed. * @param {Function} listener - The listener function that gets removed. */ removeEventListener(type, listener) { const listeners = this._listeners; if (listeners === undefined) return; const listenerArray = listeners[type]; if (listenerArray !== undefined) { const index = listenerArray.indexOf(listener); if (index !== -1) { listenerArray.splice(index, 1); } } } /** * Fire an event. * @param {object} event - The event that gets fired. */ dispatchEvent(event) { const listeners = this._listeners; if (listeners === undefined) return; const listenerArray = listeners[event.type]; if (listenerArray !== undefined) { event.target = this; // Make a copy, in case listeners are removed while iterating. const array = listenerArray.slice(0); for (let i = 0, l = array.length; i < l; i++) { array[i].call(this, event); } event.target = null; } } } /** * AnimationAction wraps AnimationClip and is mainly responsible for the update logic of time. * You can extend other functions by inheriting this class, such as repeat playback, pingpang, etc. * And since this class inherits from EventDispatcher, animation events can also be extended. * @extends EventDispatcher */ class AnimationAction extends EventDispatcher { /** * @param {KeyframeClip} clip - The keyframe clip for this action. */ constructor(clip) { super(); /** * The keyframe clip for this action. * @type {KeyframeClip} */ this.clip = clip; /** * The degree of influence of this action (in the interval [0, 1]). * Values can be used to blend between several actions. * @type {number} * @default 0 */ this.weight = 0; /** * The local time of this action (in seconds). * @type {number} */ this.time = 0; /** * The blend mode for this action, currently only two values BLEND_TYPE.NORMAL and BLEND_TYPE.ADD are available. * @type {BLEND_TYPE} * @default {BLEND_TYPE.NORMAL} */ this.blendMode = BLEND_TYPE.NORMAL; } /** * Update time. * @param {number} deltaTime - The delta time in seconds. */ update(deltaTime) { this.time += deltaTime; const endTime = this.clip.duration; if (endTime === 0) { this.time = 0; return; } if (this.time > endTime) { this.time = this.time % endTime; } if (this.time < 0) { this.time = this.time % endTime + endTime; } } } /** * This holds a reference to a real property in the scene graph; used internally. * Binding property and value, mixer for multiple values. */ class PropertyBindingMixer { /** * @param {Object3D|Material} target * @param {string} propertyPath * @param {string} typeName - vector/bool/string/quaternion/number/color * @param {number} valueSize */ constructor(target, propertyPath, typeName, valueSize) { this.target = null; this.property = ''; this.parseBinding(target, propertyPath); this.valueSize = valueSize; let BufferType = Float64Array; let mixFunction, mixFunctionAdditive, setIdentity; switch (typeName) { case 'quaternion': mixFunction = slerp; mixFunctionAdditive = slerpAdditive; setIdentity = setIdentityQuaternion; break; case 'string': case 'bool': BufferType = Array; mixFunction = select; mixFunctionAdditive = select; setIdentity = setIdentityOther; break; default: mixFunction = lerp; mixFunctionAdditive = lerpAdditive; setIdentity = setIdentityNumeric; } // [ incoming | accu | orig | addAccu ] this.buffer = new BufferType(valueSize * 4); this._mixBufferFunction = mixFunction; this._mixBufferFunctionAdditive = mixFunctionAdditive; this._setIdentity = setIdentity; this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; // cache whether the bound property should be treated as an array-like value // (treat existing arrays or types with toArray/fromArray as array bindings, // or when valueSize > 1) const boundValue = this.target && this.target[this.property]; this._isArrayProperty = this.valueSize > 1 || Array.isArray(boundValue) || (boundValue && (typeof boundValue.toArray === 'function' || typeof boundValue.fromArray === 'function')); } parseBinding(target, propertyPath) { propertyPath = propertyPath.split('.'); if (propertyPath.length > 1) { let property = target[propertyPath[0]]; for (let index = 1; index < propertyPath.length - 1; index++) { property = property[propertyPath[index]]; } this.property = propertyPath[propertyPath.length - 1]; this.target = property; } else { this.property = propertyPath[0]; this.target = target; } } /** * Remember the state of the bound property and copy it to both accus. */ saveOriginalState() { const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * 2; // get value if (this._isArrayProperty) { if (this.target[this.property].toArray) { this.target[this.property].toArray(buffer, originalValueOffset); } else { setArray(buffer, this.target[this.property], originalValueOffset, stride); } } else { this.target[this.property] = buffer[originalValueOffset]; } // accu[0..1] := orig -- initially detect changes against the original for (let i = stride, e = originalValueOffset; i !== e; ++i) { buffer[i] = buffer[originalValueOffset + (i % stride)]; } // Add to identify for additive this._setIdentity(buffer, stride * 3, stride, originalValueOffset); this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; } /** * Apply the state previously taken via 'saveOriginalState' to the binding. */ restoreOriginalState() { const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * 2; // accu[0..1] := orig -- initially detect changes against the original for (let i = stride, e = originalValueOffset; i !== e; ++i) { buffer[i] = buffer[originalValueOffset + (i % stride)]; } this.apply(); } /** * Accumulate value. * @param {number} weight */ accumulate(weight) { const buffer = this.buffer, stride = this.valueSize, offset = stride; let currentWeight = this.cumulativeWeight; if (currentWeight === 0) { for (let i = 0; i !== stride; ++i) { buffer[offset + i] = buffer[i]; } currentWeight = weight; } else { currentWeight += weight; const mix = weight / currentWeight; this._mixBufferFunction(buffer, offset, 0, mix, stride); } this.cumulativeWeight = currentWeight; } /** * Additive Accumulate value. * @param {number} weight */ accumulateAdditive(weight) { const buffer = this.buffer, stride = this.valueSize, offset = stride * 3; if (this.cumulativeWeightAdditive === 0) { this._setIdentity(buffer, offset, stride, stride * 2); } this._mixBufferFunctionAdditive(buffer, offset, 0, weight, stride); this.cumulativeWeightAdditive += weight; } /** * Apply to scene graph. */ apply() { const buffer = this.buffer, stride = this.valueSize, weight = this.cumulativeWeight, weightAdditive = this.cumulativeWeightAdditive; this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; if (weight < 1) { // accuN := accuN + original * ( 1 - cumulativeWeight ) const originalValueOffset = stride * 2; this._mixBufferFunction(buffer, stride, originalValueOffset, 1 - weight, stride); } if (weightAdditive > 0) { // accuN := accuN + additive accuN this._mixBufferFunctionAdditive(buffer, stride, 3 * stride, 1, stride); } // set value if (this._isArrayProperty) { if (this.target[this.property].fromArray) { this.target[this.property].fromArray(buffer, stride); } else { getArray(this.target[this.property], buffer, stride, stride); } } else { this.target[this.property] = buffer[stride]; } if (this.target.isTransformUV) { this.target.needsUpdate = true; } } } // Mix functions function select(buffer, dstOffset, srcOffset, t, stride) { if (t >= 0.5) { for (let i = 0; i !== stride; ++i) { buffer[dstOffset + i] = buffer[srcOffset + i]; } } } function slerp(buffer, dstOffset, srcOffset, t) { Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t); } const tempQuternionBuffer = new Float64Array(4); function slerpAdditive(buffer, dstOffset, srcOffset, t) { // Store result in tempQuternionBuffer Quaternion.multiplyQuaternionsFlat(tempQuternionBuffer, 0, buffer, dstOffset, buffer, srcOffset); // Slerp to the result Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, tempQuternionBuffer, 0, t); } function lerp(buffer, dstOffset, srcOffset, t, stride) { const s = 1 - t; for (let i = 0; i !== stride; ++i) { const j = dstOffset + i; buffer[j] = buffer[j] * s + buffer[srcOffset + i] * t; } } function lerpAdditive(buffer, dstOffset, srcOffset, t, stride) { for (let i = 0; i !== stride; ++i) { const j = dstOffset + i; buffer[j] = buffer[j] + buffer[srcOffset + i] * t; } } // identity function setIdentityNumeric(buffer, offset, stride) { for (let i = 0; i < stride; i++) { buffer[offset + i] = 0; } } function setIdentityQuaternion(buffer, offset) { setIdentityNumeric(buffer, offset, 3); buffer[offset + 3] = 1; } function setIdentityOther(buffer, offset, stride, copyOffset) { for (let i = 0; i < stride; i++) { buffer[offset + i] = buffer[copyOffset + i]; } } // get array function getArray(target, source, stride, count) { for (let i = 0; i < count; i++) { target[i] = source[stride + i]; } } function setArray(target, source, stride, count) { for (let i = 0; i < count; i++) { target[stride + i] = source[i]; } } /** * The AnimationMixer is a player for animations on a particular object in the scene. * When multiple objects in the scene are animated independently, one AnimationMixer may be used for each object. */ class AnimationMixer { constructor() { this._actions = []; this._bindings = {}; } /** * Add an action to this mixer. * @param {AnimationAction} action - The action to add. */ addAction(action) { if (this._actions.indexOf(action) !== -1) { console.warn('AnimationMixer.addAction(): already has the action, clip name is <' + action.clip.name + '>.'); return; } this._actions.push(action); const tracks = action.clip.tracks; for (let i = 0; i < tracks.length; i++) { const track = tracks[i]; const trackName = track.name; if (!this._bindings[trackName]) { const binding = new PropertyBindingMixer(track.target, track.propertyPath, track.valueTypeName, track.valueSize); this._bindings[trackName] = { binding, referenceCount: 0, active: false, cachedActive: false }; } this._bindings[trackName].referenceCount++; } } /** * Remove an action from this mixer. * @param {AnimationAction} action - The action to be removed. */ removeAction(action) { const index = this._actions.indexOf(action); if (index === -1) { console.warn('AnimationMixer.removeAction(): action not found in this mixer, clip name is <' + action.clip.name + '>.'); return; } if (action.weight > 0) { console.warn('AnimationMixer.removeAction(): make sure action\'s weight is zero before removing it.'); return; } this._actions.splice(index, 1); const tracks = action.clip.tracks; for (let i = 0; i < tracks.length; i++) { const trackName = tracks[i].name; const bindingInfo = this._bindings[trackName]; if (bindingInfo) { if (--bindingInfo.referenceCount <= 0) { if (bindingInfo.cachedActive) { bindingInfo.binding.restoreOriginalState(); } delete this._bindings[trackName]; } } } } /** * Whether has this action. * @param {AnimationAction} action - The action. * @returns {boolean} */ hasAction(action) { return this._actions.indexOf(action) > -1; } /** * Get all actions. * @returns {AnimationAction[]} */ getActions() { return this._actions; } /** * Advances the global mixer time and updates the animation. * @param {number} deltaTime - The delta time in seconds. */ update(deltaTime) { // Mark active to false for all bindings. for (const bindingName in this._bindings) { this._bindings[bindingName].active = false; } // Update the time of actions with a weight greater than 1 // And accumulate those bindings for (let i = 0, l = this._actions.length; i < l; i++) { const action = this._actions[i]; if (action.weight > 0) { action.update(deltaTime); const tracks = action.clip.tracks; for (let j = 0, tl = tracks.length; j < tl; j++) { const track = tracks[j]; const bindingInfo = this._bindings[track.name]; const binding = bindingInfo.binding; bindingInfo.active = true; if (!bindingInfo.cachedActive) { bindingInfo.binding.saveOriginalState(); bindingInfo.cachedActive = true; } track.getValue(action.time, binding.buffer); if (action.blendMode === BLEND_TYPE.ADD) { binding.accumulateAdditive(action.weight); } else { binding.accumulate(action.weight); } } } } // Apply all bindings. for (const bindingName in this._bindings) { const bindingInfo = this._bindings[bindingName]; if (bindingInfo.active) { bindingInfo.binding.apply(); } else { if (bindingInfo.cachedActive) { bindingInfo.binding.restoreOriginalState(); bindingInfo.cachedActive = false; } } } } } /** * An KeyframeClip is a reusable set of keyframe tracks which represent an animation. */ class KeyframeClip { /** * @param {string} [name=''] - A name for this clip. * @param {KeyframeTrack[]} [tracks=[]] - An array of KeyframeTracks. * @param {number} [duration] - The duration of this clip (in seconds). If not passed, the duration will be calculated from the passed tracks array. */ constructor(name = '', tracks = [], duration = -1) { /** * A name for this clip. * @type {string} */ this.name = name; /** * An array of KeyframeTracks. * @type {KeyframeTrack[]} */ this.tracks = tracks; /** * The duration of this clip (in seconds). * If a negative value is passed, the duration will be calculated from the passed tracks array. * @type {number} */ this.duration = duration; if (this.duration < 0) { this.resetDuration(); } } /** * Sets the duration of the clip to the duration of its longest KeyframeTrack. * @returns {KeyframeClip} */ resetDuration() { const tracks = this.tracks; let duration = 0; for (let i = 0, l = tracks.length; i < l; i++) { const track = tracks[i]; duration = Math.max(duration, track.times[track.times.length - 1]); } this.duration = duration; return this; } } /** * Handles and keeps track of loaded and pending data. A default global * instance of this class is created and used by loaders if not supplied * manually. * In general that should be sufficient, however there are times when it can * be useful to have separate loaders - for example if you want to show * separate loading bars for objects and textures. * ```js * const manager = new LoadingManager( * () => console.log('All items loaded!'), * (url, itemsLoaded, itemsTotal) => { * console.log(`Loaded ${itemsLoaded} of ${itemsTotal} items`); * }, * url => console.error(`Error loading ${url}`) * ); * ``` */ class LoadingManager { /** * Constructs a new loading manager. * @param {Function} [onLoad] - Executes when all items have been loaded. * @param {Function} [onProgress] - Executes when single items have been loaded. * @param {Function} [onError] - Executes when an error occurs. */ constructor(onLoad, onProgress, onError) { this.isLoading = false; this.itemsLoaded = 0; this.itemsTotal = 0; this.urlModifier = undefined; /** * Executes when an item starts loading. * @type {Function|undefined} * @default undefined */ this.onStart = undefined; /** * Executes when all items have been loaded. * @type {Function|undefined} * @default undefined */ this.onLoad = onLoad; /** * Executes when single items have been loaded. * @type {Function|undefined} * @default undefined */ this.onProgress = onProgress; /** * Executes when an error occurs. * @type {Function|undefined} * @default undefined */ this.onError = onError; } /** * This should be called by any loader using the manager when the loader * starts loading an item. * @param {string} url - The URL to load. */ itemStart(url) { this.itemsTotal++; if (this.isLoading === false) { if (this.onStart !== undefined) { this.onStart(url, this.itemsLoaded, this.itemsTotal); } } this.isLoading = true; } /** * This should be called by any loader using the manager when the loader * ended loading an item. * @param {string} url - The URL of the loaded item. */ itemEnd(url) { this.itemsLoaded++; if (this.onProgress !== undefined) { this.onProgress(url, this.itemsLoaded, this.itemsTotal); } if (this.itemsLoaded === this.itemsTotal) { this.isLoading = false; if (this.onLoad !== undefined) { this.onLoad(); } } } /** * This should be called by any loader using the manager when the loader * encounters an error when loading an item. * @param {string} url - The URL of the item that produces an error. */ itemError(url) { if (this.onError !== undefined) { this.onError(url); } } /** * Given a URL, uses the URL modifier callback (if any) and returns a * resolved URL. If no URL modifier is set, returns the original URL. * @param {string} url - The URL to load. * @returns {string} The resolved URL. */ resolveURL(url) { if (this.urlModifier) { return this.urlModifier(url); } return url; } /** * If provided, the callback will be passed each resource URL before a * request is sent. The callback may return the original URL, or a new URL to * override loading behavior. This behavior can be used to load assets from * .ZIP files, drag-and-drop APIs, and Data URIs. * @param {Function} transform - URL modifier callback. Called with an URL and must return a resolved URL. * @returns {LoadingManager} A reference to this loading manager. * @example * const blobs = { 'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3 }; * * const manager = new LoadingManager(); * * // Initialize loading manager with URL callback. * const objectURLs = []; * manager.setURLModifier(url => { * url = URL.createObjectURL(blobs[url]); * objectURLs.push(url); * return url; * }); * * // Load as usual, then revoke the blob URLs. * const loader = new GLTFLoader(manager); * loader.load('fish.gltf', gltf => { * scene.add(gltf.scene); * objectURLs.forEach(url => URL.revokeObjectURL(url)); * }); */ setURLModifier(transform) { this.urlModifier = transform; return this; } } /** * The global default loading manager. * @type {LoadingManager} */ const DefaultLoadingManager = new LoadingManager(); /** * Abstract base class for loaders. * @abstract */ class Loader { /** * Constructs a new Loader. * @param {LoadingManager} [manager=DefaultLoadingManager] - The loading manager. */ constructor(manager) { /** * The loading manager. * @type {LoadingManager} * @default DefaultLoadingManager */ this.manager = (manager !== undefined) ? manager : DefaultLoadingManager; /** * The crossOrigin string to implement CORS for loading the url from a * different domain that allows CORS. * @type {string} * @default 'anonymous' */ this.crossOrigin = 'anonymous'; /** * Whether the XMLHttpRequest uses credentials. * @type {boolean} * @default false */ this.withCredentials = false; /** * The base path from which the asset will be loaded. * @type {string} * @default '' */ this.path = ''; /** * The [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header} * used in HTTP request. * @type {object} * @default {} */ this.requestHeader = {}; } /** * This method needs to be implement by all concrete loaders. * It holds the logic for loading the asset from the backend. * @param {string} url - The path/URL of the file to be loaded. * @param {Function} onLoad - Executed when the loading process has been finished. * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress. * @param {onErrorCallback} [onError] - Executed when errors occur. */ load(url, onLoad, onProgress, onError) {} /** * A async version of {@link Loader#load}. * @param {string} url - The path/URL of the file to be loaded. * @param {Function} [onProgress] - Executed while the loading is in progress. * @returns {Promise} A Promise that resolves when the asset has been loaded. */ loadAsync(url, onProgress) { const scope = this; return new Promise(function(resolve, reject) { scope.load(url, resolve, onProgress, reject); }); } /** * Sets the `crossOrigin` String to implement CORS for loading the URL * from a different domain that allows CORS. * @param {string} crossOrigin - The `crossOrigin` value. * @returns {Loader} A reference to this instance. */ setCrossOrigin(crossOrigin) { this.crossOrigin = crossOrigin; return this; } /** * Whether the XMLHttpRequest uses credentials such as cookies, authorization * headers or TLS client certificates, see [XMLHttpRequest.withCredentials]{@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}. * Note: This setting has no effect if you are loading files locally or from the same domain. * @param {boolean} value - The `withCredentials` value. * @returns {Loader} A reference to this instance. */ setWithCredentials(value) { this.withCredentials = value; return this; } /** * Sets the base path for the asset. * @param {string} path - The base path. * @returns {Loader} A reference to this instance. */ setPath(path) { this.path = path; return this; } /** * Sets the given request header. * @param {object} requestHeader - A [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header} * for configuring the HTTP request. * @returns {Loader} A reference to this instance. */ setRequestHeader(requestHeader) { this.requestHeader = requestHeader; return this; } } /** * A low level class for loading resources with the Fetch API, used internally by * most loaders. It can also be used directly to load any file type that does * not have a loader. * ```js * const loader = new FileLoader(); * const data = await loader.loadAsync('example.txt'); * ``` * @extends Loader */ class FileLoader extends Loader { /** * Constructs a new file loader. * @param {LoadingManager} [manager] - The loading manager. */ constructor(manager) { super(manager); /** * The expected response type. See {@link FileLoader.setResponseType}. * @type {'arraybuffer'|'blob'|'document'|'json'|''} * @default '' */ this.responseType = ''; /** * The expected mimeType. See {@link FileLoader.setMimeType}. * @type {string} * @default '' */ this.mimeType = ''; } /** * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback. * @param {string} url — The path/URL of the file to be loaded. This can also be a data URI. * @param {Function} [onLoad] — Executed when the loading process has been finished. The argument is the loaded data. * @param {onProgressCallback} [onProgress] — Executed while the loading is in progress. * @param {onErrorCallback} [onError] — Executed when errors occur. */ load(url, onLoad, onProgress, onError) { if (url === undefined) url = ''; if (this.path != undefined) url = this.path + url; url = this.manager.resolveURL(url); // create request const req = new Request(url, { headers: new Headers(this.requestHeader), credentials: this.withCredentials ? 'include' : 'same-origin' // An abort controller could be added within a future PR }); // record states ( avoid data race ) const mimeType = this.mimeType; const responseType = this.responseType; // start the fetch fetch(req) .then(response => { if (response.status === 200 || response.status === 0) { // Some browsers return HTTP Status 0 when using non-http protocol // e.g. 'file://' or 'data://'. Handle as success. if (response.status === 0) { console.warn('FileLoader: HTTP Status 0 received.'); } // Workaround: Checking if response.body === undefined for Alipay browser #23548 if (typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined) { return response; } const reader = response.body.getReader(); // Nginx needs X-File-Size check // https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content const contentLength = response.headers.get('X-File-Size') || response.headers.get('Content-Length'); const total = contentLength ? parseInt(contentLength) : 0; const lengthComputable = total !== 0; let loaded = 0; // periodically read data into the new stream tracking while download progress const stream = new ReadableStream({ start(controller) { readData(); function readData() { reader.read().then(({ done, value }) => { if (done) { controller.close(); } else { loaded += value.byteLength; const event = new ProgressEvent('progress', { lengthComputable, loaded, total }); if (onProgress) onProgress(event); controller.enqueue(value); readData(); } }, error => { controller.error(error); }); } } }); return new Response(stream); } else { throw new HttpError(`fetch for "${response.url}" responded with ${response.status}: ${response.statusText}`, response); } }) .then(response => { switch (responseType) { case 'arraybuffer': return response.arrayBuffer(); case 'blob': return response.blob(); case 'document': return response.text() .then(text => { const parser = new DOMParser(); return parser.parseFromString(text, mimeType); }); case 'json': return response.json(); default: if (mimeType === '') { return response.text(); } else { // sniff encoding const re = /charset="?([^;"\s]*)"?/i; const exec = re.exec(mimeType); const label = exec && exec[1] ? exec[1].toLowerCase() : undefined; const decoder = new TextDecoder(label); return response.arrayBuffer().then(ab => decoder.decode(ab)); } } }) .then(data => { if (onLoad) onLoad(data); }) .catch(err => { onError && onError(err); this.manager.itemError(url); }) .finally(() => { this.manager.itemEnd(url); }); this.manager.itemStart(url); } /** * Sets the expected response type. * @param {'arraybuffer'|'blob'|'document'|'json'|''} value - The response type. * @returns {FileLoader} A reference to this file loader. */ setResponseType(value) { this.responseType = value; return this; } /** * Sets the expected mime type of the loaded file. * @param {string} value - The mime type. * @returns {FileLoader} A reference to this file loader. */ setMimeType(value) { this.mimeType = value; return this; } } class HttpError extends Error { constructor(message, response) { super(message); this.response = response; } } /** * A loader for loading images. The class loads images with the HTML `Image` API. * Please note that 'ImageLoader' not support progress events. * ```js * const loader = new ImageLoader(); * const image = await loader.loadAsync('image.png'); * ``` * @extends Loader */ class ImageLoader extends Loader { /** * Constructs a new image loader. * @param {LoadingManager} [manager] - The loading manager. */ constructor(manager) { super(manager); } /** * Starts loading from the given URL and passes the loaded image * to the `onLoad()` callback. The method also returns a new `Image` object which can * directly be used for texture creation. If you do it this way, the texture * may pop up in your scene once the respective loading process is finished. * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. * @param {Function} [onLoad] - Executed when the loading process has been finished. The argument is an `HTMLImageElement`. * @param {onProgressCallback} [onProgress] - Unsupported in this loader. * @param {onErrorCallback} [onError] - Executed when errors occur. * @returns {HTMLImageElement} The image. */ load(url, onLoad, onProgress, onError) { if (url === undefined) url = ''; if (this.path !== undefined) url = this.path + url; url = this.manager.resolveURL(url); const scope = this; const image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img'); function onImageLoad() { removeEventListeners(); if (onLoad) onLoad(this); scope.manager.itemEnd(url); } function onImageError(event) { removeEventListeners(); if (onError) onError(event); scope.manager.itemError(url); scope.manager.itemEnd(url); } function removeEventListeners() { image.removeEventListener('load', onImageLoad, false); image.removeEventListener('error', onImageError, false); } image.addEventListener('load', onImageLoad, false); image.addEventListener('error', onImageError, false); if (url.slice(0, 5) !== 'data:') { if (this.crossOrigin !== undefined) image.crossOrigin = this.crossOrigin; } scope.manager.itemStart(url); image.src = url; return image; } } /** * The vector 2 class */ class Vector2 { /** * @param {number} [x=0] - the x value of this vector. * @param {number} [y=0] - the y value of this vector. */ constructor(x = 0, y = 0) { this.x = x; this.y = y; } /** * Sets the x and y components of this vector. * @param {number} x * @param {number} y * @returns {Vector2} */ set(x = 0, y = 0) { this.x = x; this.y = y; return this; } /** * Sets this vector to be the vector linearly interpolated between v1 and v2 * where ratio is the percent distance along the line connecting the two vectors * - ratio = 0 will be v1, and ratio = 1 will be v2. * @param {Vector2} v1 - the starting Vector2. * @param {Vector2} v2 - Vector2 to interpolate towards. * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1]. * @returns {Vector2} */ lerpVectors(v1, v2, ratio) { return this.subVectors(v2, v1).multiplyScalar(ratio).add(v1); } /** * If this vector's x or y value is greater than v's x or y value, replace that value with the corresponding min value. * @param {Vector2} v * @returns {Vector2} */ min(v) { this.x = Math.min(this.x, v.x); this.y = Math.min(this.y, v.y); return this; } /** * If this vector's x or y value is less than v's x or y value, replace that value with the corresponding max value. * @param {Vector2} v * @returns {Vector2} */ max(v) { this.x = Math.max(this.x, v.x); this.y = Math.max(this.y, v.y); return this; } /** * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y). * @returns {number} */ getLength() { return Math.sqrt(this.getLengthSquared()); } /** * Computes the square of the Euclidean length (straight-line length) from (0, 0) to (x, y). * If you are comparing the lengths of vectors, you should compare the length squared instead * as it is slightly more efficient to calculate. * @returns {number} */ getLengthSquared() { return this.x * this.x + this.y * this.y; } /** * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1. * @param {number} [thickness=1] * @returns {Vector2} */ normalize(thickness = 1) { const length = this.getLength() || 1; const invLength = thickness / length; this.x *= invLength; this.y *= invLength; return this; } /** * Subtracts v from the vector. * @param {Vector2} a * @param {Vector2} target - the result vector2 * @returns {Vector2} */ subtract(a, target = new Vector2()) { return target.set(this.x - a.x, this.y - a.y); } /** * Subtracts v from this vector. * @param {Vector2} v * @returns {Vector2} */ sub(v) { this.x -= v.x; this.y -= v.y; return this; } /** * Copies the values of the passed Vector2's x and y properties to this Vector2. * @param {Vector2} v * @returns {Vector2} */ copy(v) { this.x = v.x; this.y = v.y; return this; } /** * Sets this vector to a + b. * @param {Vector2} a * @param {Vector2} b * @returns {Vector2} */ addVectors(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; return this; } /** * Sets this vector to a - b. * @param {Vector2} a * @param {Vector2} b * @returns {Vector2} */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; return this; } /** * Multiplies this vector by scalar. * @param {number} scalar * @returns {Vector2} */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; return this; } /** * Computes the squared distance from this vector to v. If you are just comparing the distance with * another distance, you should compare the distance squared instead as it is slightly more efficient to calculate. * @param {Vector2} v * @returns {number} */ distanceToSquared(v) { const dx = this.x - v.x, dy = this.y - v.y; return dx * dx + dy * dy; } /** * Computes the distance from this vector to v. * @param {Vector2} v * @returns {number} */ distanceTo(v) { return Math.sqrt(this.distanceToSquared(v)); } /** * Sets this vector's x value to be array[ offset ] and y value to be array[ offset + 1 ]. * @param {number[]} array - the source array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array. * @returns {Vector2} */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); } this.x = x; this.y = y; return this; } /** * Sets this array[ offset ] value to be vector's x and array[ offset + 1 ] to be vector's y. * @param {number[]} [array] - the target array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {number[]} */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); } array[offset] = x; array[offset + 1] = y; return array; } /** * Adds v to this vector. * @param {Vector2} v * @returns {Vector2} */ add(v) { this.x += v.x; this.y += v.y; return this; } /** * Computes the angle in radians of this vector with respect to the positive x-axis. * @returns {number} */ angle() { // computes the angle in radians with respect to the positive x-axis // let angle = Math.atan2(this.y, this.x); // if (angle < 0) angle += 2 * Math.PI; // return angle; return Math.atan2(-this.y, -this.x) + Math.PI; } /** * Inverts this vector - i.e. sets x = -x, y = -y. * @returns {Vector2} */ negate() { this.x = -this.x; this.y = -this.y; return this; } /** * Calculate the dot product of this vector and v. * @param {Vector2} a * @returns {number} */ dot(a) { return this.x * a.x + this.y * a.y; } /** * Checks for strict equality of this vector and v. * @param {Vector2} v * @returns {boolean} */ equals(v) { return ((v.x === this.x) && (v.y === this.y)); } /** * Returns a new Vector2 with the same x and y values as this one. * @returns {Vector2} */ clone() { return new Vector2(this.x, this.y); } * [Symbol.iterator]() { yield this.x; yield this.y; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector2.prototype.isVector2 = true; /** * Represents an axis-aligned bounding box (AABB) in 2D space. */ class Box2 { /** * @param {Vector2} min - (optional) Vector2 representing the lower (x, y) boundary of the box. * Default is ( + Infinity, + Infinity ). * @param {Vector2} max - (optional) Vector2 representing the upper (x, y) boundary of the box. * Default is ( - Infinity, - Infinity ). */ constructor(min, max) { this.min = (min !== undefined) ? min : new Vector2(+Infinity, +Infinity); this.max = (max !== undefined) ? max : new Vector2(-Infinity, -Infinity); } /** * @param {number} x1 * @param {number} y1 * @param {number} x2 * @param {number} y2 */ set(x1, y1, x2, y2) { this.min.set(x1, y1); this.max.set(x2, y2); } /** * Returns a new Box2 with the same min and max as this one. * @returns {Box2} */ clone() { return new Box2().copy(this); } /** * Copies the min and max from box to this box. * @param {Box2} box * @returns {Box2} */ copy(box) { this.min.copy(box.min); this.max.copy(box.max); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Box2.prototype.isBox2 = true; /** * Represents an axis-aligned bounding box (AABB) in 3D space. */ class Box3 { /** * @param {Vector3} min - (optional) Vector3 representing the lower (x, y, z) boundary of the box. * Default is ( + Infinity, + Infinity, + Infinity ). * @param {Vector3} max - (optional) Vector3 representing the upper (x, y, z) boundary of the box. * Default is ( - Infinity, - Infinity, - Infinity ). */ constructor(min, max) { this.min = (min !== undefined) ? min : new Vector3(+Infinity, +Infinity, +Infinity); this.max = (max !== undefined) ? max : new Vector3(-Infinity, -Infinity, -Infinity); } /** * Sets the lower and upper (x, y, z) boundaries of this box. * @param {Vector3} min - Vector3 representing the lower (x, y, z) boundary of the box. * @param {Vector3} max - Vector3 representing the lower upper (x, y, z) boundary of the box. */ set(min, max) { this.min.copy(min); this.max.copy(max); } /** * Sets the upper and lower bounds of this box to include all of the points in points. * @param {Vector3[]} points - Array of Vector3s that the resulting box will contain. * @returns {Box3} */ setFromPoints(points) { this.makeEmpty(); for (let i = 0, il = points.length; i < il; i++) { this.expandByPoint(points[i]); } return this; } /** * Makes this box empty. * @returns {Box3} */ makeEmpty() { this.min.x = this.min.y = this.min.z = +Infinity; this.max.x = this.max.y = this.max.z = -Infinity; return this; } /** * Expands the boundaries of this box to include point. * @param {Vector3} point - Vector3 that should be included in the box. * @returns {Box3} */ expandByPoint(point) { this.min.min(point); this.max.max(point); return this; } /** * Expands each dimension of the box by scalar. If negative, the dimensions of the box will be contracted. * @param {number} scalar - Distance to expand the box by. * @returns {Box3} */ expandByScalar(scalar) { this.min.addScalar(-scalar); this.max.addScalar(scalar); return this; } /** * Expands the boundaries of this box to include box3. * @param {Box3} box3 - Box that will be unioned with this box. * @returns {Box3} */ expandByBox3(box3) { this.min.min(box3.min); this.max.max(box3.max); return this; } /** * Sets the upper and lower bounds of this box to include all of the data in array. * @param {number[]} array - An array of position data that the resulting box will envelop. * @param {number} [gap=3] - The number of elements between the start of each position in the array. * @param {number} [offset=0] - The offset in each gap where the position data starts. * @param {boolean} [denormalize=false] - Whether to denormalize the values in the array. * @returns {Box3} A reference to this box. */ setFromArray(array, gap = 3, offset = 0, denormalize = false) { let minX = +Infinity; let minY = +Infinity; let minZ = +Infinity; let maxX = -Infinity; let maxY = -Infinity; let maxZ = -Infinity; for (let i = 0, l = array.length; i < l; i += gap) { let x = array[i + offset]; let y = array[i + offset + 1]; let z = array[i + offset + 2]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); } if (x < minX) minX = x; if (y < minY) minY = y; if (z < minZ) minZ = z; if (x > maxX) maxX = x; if (y > maxY) maxY = y; if (z > maxZ) maxZ = z; } this.min.set(minX, minY, minZ); this.max.set(maxX, maxY, maxZ); return this; } /** * Clamps the point within the bounds of this box. * @param {Vector3} point - Vector3 to clamp. * @param {Vector3} target - Vector3 to store the result in. * @returns {Vector3} */ clampPoint(point, target) { return target.copy(point).min(this.max).max(this.min); } /** * Returns the distance from any edge of this box to the specified point. * If the point lies inside of this box, the distance will be 0. * @param {Vector3} point - Vector3 to measure the distance to. * @returns {number} */ distanceToPoint(point) { return this.clampPoint(point, _vec3_1$5).distanceTo(point); } /** * Returns aMinimum Bounding Sphere for the box. * @param {Sphere} target — the result will be copied into this Sphere. * @returns {Sphere} */ getBoundingSphere(target) { if (this.isEmpty()) { target.makeEmpty(); } else { this.getCenter(target.center); target.radius = this.getSize(_vec3_1$5).getLength() * 0.5; } return target; } /** * Returns true if this box includes zero points within its bounds. * @returns {boolean} */ isEmpty() { // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes return (this.max.x < this.min.x) || (this.max.y < this.min.y) || (this.max.z < this.min.z); } /** * Returns true if this box and box share the same lower and upper bounds. * @param {Box3} box - Box to compare with this one. * @returns {boolean} */ equals(box) { return box.min.equals(this.min) && box.max.equals(this.max); } /** * Returns the center point of the box as a Vector3. * @param {Vector3} target - the result will be copied into this Vector3. * @returns {Vector3} */ getCenter(target = new Vector3()) { return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); } /** * Returns the width, height and depth of this box. * @param {Vector3} target - the result will be copied into this Vector3. * @returns {Vector3} */ getSize(target = new Vector3()) { return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min); } /** * Get the 8 corner points of the bounding box, the order is as follows: * 7-------3 * /| /| * 4-------0 | * | | | | * | 6-----|-2 * |/ |/ * 5-------1 * @param {Vector3[]} points - The array to store the points. * @returns {Vector3[]} The array of points. */ getPoints(points) { const minX = this.min.x, minY = this.min.y, minZ = this.min.z; const maxX = this.max.x, maxY = this.max.y, maxZ = this.max.z; points[0].set(maxX, maxY, maxZ); points[1].set(maxX, minY, maxZ); points[2].set(maxX, minY, minZ); points[3].set(maxX, maxY, minZ); points[4].set(minX, maxY, maxZ); points[5].set(minX, minY, maxZ); points[6].set(minX, minY, minZ); points[7].set(minX, maxY, minZ); return points; } /** * Computes the union of this box and box, * setting the upper bound of this box to the greater of the two boxes' upper bounds and the lower bound of this box to the lesser of the two boxes' lower bounds. * @param {Box3} box - Box that will be unioned with this box. * @returns {Box3} */ union(box) { this.min.min(box.min); this.max.max(box.max); return this; } /** * Transforms this Box3 with the supplied matrix. * @param {Matrix4} matrix - The Matrix4 to apply * @returns {Box3} */ applyMatrix4(matrix) { // transform of empty box is an empty box. if (this.isEmpty()) return this; // NOTE: I am using a binary pattern to specify all 2^3 combinations below _points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); // 000 _points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); // 001 _points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); // 010 _points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); // 011 _points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); // 100 _points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); // 101 _points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); // 110 _points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); // 111 this.setFromPoints(_points); return this; } /** * Returns true if the specified point lies within or on the boundaries of this box. * @param {Vector3} point - Vector3 to check for inclusion. * @returns {boolean} */ containsPoint(point) { return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z ? false : true; } /** * Determines whether or not this box intersects triangle. * @param {Triangle} triangle - Triangle to check for intersection against. * @returns {boolean} */ intersectsTriangle(triangle) { if (this.isEmpty()) { return false; } // compute box center and extents this.getCenter(_center); _extents.subVectors(this.max, _center); // translate triangle to aabb origin _v0$1.subVectors(triangle.a, _center); _v1$1.subVectors(triangle.b, _center); _v2$1.subVectors(triangle.c, _center); // compute edge vectors for triangle _f0.subVectors(_v1$1, _v0$1); _f1.subVectors(_v2$1, _v1$1); _f2.subVectors(_v0$1, _v2$1); // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) let axes = [ 0, -_f0.z, _f0.y, 0, -_f1.z, _f1.y, 0, -_f2.z, _f2.y, _f0.z, 0, -_f0.x, _f1.z, 0, -_f1.x, _f2.z, 0, -_f2.x, -_f0.y, _f0.x, 0, -_f1.y, _f1.x, 0, -_f2.y, _f2.x, 0 ]; if (!satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents)) { return false; } // test 3 face normals from the aabb axes = [1, 0, 0, 0, 1, 0, 0, 0, 1]; if (!satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents)) { return false; } // finally testing the face normal of the triangle // use already existing triangle edge vectors here _triangleNormal.crossVectors(_f0, _f1); axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z]; return satForAxes(axes, _v0$1, _v1$1, _v2$1, _extents); } /** * Returns a new Box3 with the same min and max as this one. * @returns {Box3} */ clone() { return new Box3().copy(this); } /** * Copies the min and max from box to this box. * @param {Box3} box - Box3 to copy. * @returns {Box3} */ copy(box) { this.min.copy(box.min); this.max.copy(box.max); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Box3.prototype.isBox3 = true; const _points = [ new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3() ]; const _vec3_1$5 = new Vector3(); // triangle centered vertices const _v0$1 = new Vector3(); const _v1$1 = new Vector3(); const _v2$1 = new Vector3(); // triangle edge vectors const _f0 = new Vector3(); const _f1 = new Vector3(); const _f2 = new Vector3(); const _center = new Vector3(); const _extents = new Vector3(); const _triangleNormal = new Vector3(); const _testAxis = new Vector3(); function satForAxes(axes, v0, v1, v2, extents) { for (let i = 0, j = axes.length - 3; i <= j; i += 3) { _testAxis.fromArray(axes, i); // project the aabb onto the separating axis const r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z); // project all 3 vertices of the triangle onto the separating axis const p0 = v0.dot(_testAxis); const p1 = v1.dot(_testAxis); const p2 = v2.dot(_testAxis); // actual test, basically see if either of the most extreme of the triangle points intersects r if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) { // points of the projected triangle are outside the projected half-length of the aabb // the axis is separating and we can exit return false; } } return true; } /** * A Color3 instance is represented by RGB components. */ class Color3 { /** * Constructs a new three-component color. * @param {number} [r] - The red component of the color. If `g` and `b` are not provided, it can be a hexadecimal triplet. * @param {number} [g] - The green component. * @param {number} [b] - The blue component. */ constructor(r, g, b) { /** * The red component. * @type {number} * @default 0 */ this.r = 0; /** * The green component. * @type {number} * @default 0 */ this.g = 0; /** * The blue component. * @type {number} * @default 0 */ this.b = 0; if (g === undefined && b === undefined) { this.setHex(r); } else { this.setRGB(r, g, b); } } /** * Sets this color from a hexadecimal value. * @param {number} hex - The hexadecimal value. * @returns {Color3} A reference to this color. */ setHex(hex) { hex = Math.floor(hex); this.r = (hex >> 16 & 255) / 255; this.g = (hex >> 8 & 255) / 255; this.b = (hex & 255) / 255; return this; } /** * Sets this color from RGB values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @returns {Color3} A reference to this color. */ setRGB(r, g, b) { this.r = r; this.g = g; this.b = b; return this; } /** * Set this color from HSL values. * @param {number} h - Hue value between 0.0 and 1.0. * @param {number} s - Saturation value between 0.0 and 1.0. * @param {number} l - Lightness value between 0.0 and 1.0. * @returns {Color3} A reference to this color. */ setHSL(h, s, l) { // h,s,l ranges are in 0.0 - 1.0 h = MathUtils.euclideanModulo(h, 1); s = MathUtils.clamp(s, 0, 1); l = MathUtils.clamp(l, 0, 1); if (s === 0) { this.r = this.g = this.b = l; } else { const p = l <= 0.5 ? l * (1 + s) : l + s - (l * s); const q = (2 * l) - p; this.r = hue2rgb(q, p, h + 1 / 3); this.g = hue2rgb(q, p, h); this.b = hue2rgb(q, p, h - 1 / 3); } return this; } /** * Returns a new color with copied values from this instance. * @returns {Color3} A clone of this instance. */ clone() { return new this.constructor(this.r, this.g, this.b); } /** * Copies the values of the given color to this instance. * @param {Color3} color - The color to copy. * @returns {Color3} A reference to this color. */ copy(color) { this.r = color.r; this.g = color.g; this.b = color.b; return this; } /** * Converts this color from sRGB space to linear space. * @returns {Color3} A reference to this color. */ convertSRGBToLinear() { this.r = SRGBToLinear(this.r); this.g = SRGBToLinear(this.g); this.b = SRGBToLinear(this.b); return this; } /** * Converts this color from linear space to sRGB space. * @returns {Color3} A reference to this color. */ convertLinearToSRGB() { this.r = LinearToSRGB(this.r); this.g = LinearToSRGB(this.g); this.b = LinearToSRGB(this.b); return this; } /** * Returns the hexadecimal value of this color. * @returns {number} The hexadecimal value. */ getHex() { return MathUtils.clamp(this.r * 255, 0, 255) << 16 ^ MathUtils.clamp(this.g * 255, 0, 255) << 8 ^ MathUtils.clamp(this.b * 255, 0, 255) << 0; } /** * Linearly interpolates this color's RGB values toward the RGB values of the * given color. The alpha argument can be thought of as the ratio between * the two colors, where 0.0 is this color and 1.0 is the first argument. * @param {Color3} color - The color to converge on. * @param {number} alpha - The interpolation factor in the closed interval [0,1]. * @returns {Color3} A reference to this color. */ lerp(color, alpha) { return this.lerpColors(this, color, alpha); } /** * Linearly interpolates between the given colors and stores the result in this instance. * The alpha argument can be thought of as the ratio between the two colors, where 0.0 * is the first and 1.0 is the second color. * @param {Color3} color1 - The first color. * @param {Color3} color2 - The second color. * @param {number} alpha - The interpolation factor in the closed interval [0,1]. * @returns {Color3} A reference to this color. */ lerpColors(color1, color2, alpha) { this.r = MathUtils.lerp(color1.r, color2.r, alpha); this.g = MathUtils.lerp(color1.g, color2.g, alpha); this.b = MathUtils.lerp(color1.b, color2.b, alpha); return this; } /** * Sets this color's RGB components from the given array. * @param {number[]} array - An array holding the RGB values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Color3} A reference to this color. */ fromArray(array, offset = 0, denormalize = false) { let r = array[offset], g = array[offset + 1], b = array[offset + 2]; if (denormalize) { r = MathUtils.denormalize(r, array); g = MathUtils.denormalize(g, array); b = MathUtils.denormalize(b, array); } this.r = r; this.g = g; this.b = b; return this; } /** * Writes the RGB components of this color to the given array. If no array is provided, * the method returns a new instance. * @param {number[]} [array=[]] - The target array holding the color components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {number[]} The color components. */ toArray(array = [], offset = 0, normalize = false) { let r = this.r, g = this.g, b = this.b; if (normalize) { r = MathUtils.normalize(r, array); g = MathUtils.normalize(g, array); b = MathUtils.normalize(b, array); } array[offset] = r; array[offset + 1] = g; array[offset + 2] = b; return array; } * [Symbol.iterator]() { yield this.r; yield this.g; yield this.b; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Color3.prototype.isColor3 = true; function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t); return p; } function SRGBToLinear(c) { return (c < 0.04045) ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4); } function LinearToSRGB(c) { return (c < 0.0031308) ? c * 12.92 : 1.055 * (Math.pow(c, 0.41666)) - 0.055; } /** * A Color4 instance is represented by RGBA components. */ class Color4 { /** * Constructs a new four-component color. * @param {number} [r=0] - The red value. * @param {number} [g=0] - The green value. * @param {number} [b=0] - The blue value. * @param {number} [a=1] - The alpha value. */ constructor(r = 0, g = 0, b = 0, a = 1) { /** * The red component. * @type {number} * @default 0 */ this.r = r; /** * The green component. * @type {number} * @default 0 */ this.g = g; /** * The blue component. * @type {number} * @default 0 */ this.b = b; /** * The alpha component. * @type {number} * @default 1 */ this.a = a; } /** * Sets this color from RGBA values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @param {number} a - Alpha channel value between 0.0 and 1.0. * @returns {Color4} A reference to this color. */ setRGBA(r, g, b, a) { this.r = r; this.g = g; this.b = b; this.a = a; return this; } /** * Returns a new color with copied values from this instance. * @returns {Color4} A clone of this instance. */ clone() { return new Color4(this.r, this.g, this.b, this.a); } /** * Copies the values of the given color to this instance. * @param {Color4} color - The color to copy. * @returns {Color4} A clone of this instance. */ copy(color) { this.r = color.r; this.g = color.g; this.b = color.b; this.a = color.a; return this; } /** * Sets this color's RGBA components from the given array. * @param {number[]} array - An array holding the RGBA values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Color4} A reference to this color. */ fromArray(array, offset = 0, denormalize = false) { let r = array[offset], g = array[offset + 1], b = array[offset + 2], a = array[offset + 3]; if (denormalize) { r = MathUtils.denormalize(r, array); g = MathUtils.denormalize(g, array); b = MathUtils.denormalize(b, array); a = MathUtils.denormalize(a, array); } this.r = r; this.g = g; this.b = b; this.a = a; return this; } /** * Writes the RGBA components of this color to the given array. If no array is provided, * the method returns a new instance. * @param {number[]} [array=[]] - The target array holding the color components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {number[]} The color components. */ toArray(array = [], offset = 0, normalize = false) { let r = this.r, g = this.g, b = this.b, a = this.a; if (normalize) { r = MathUtils.normalize(r, array); g = MathUtils.normalize(g, array); b = MathUtils.normalize(b, array); a = MathUtils.normalize(a, array); } array[offset] = r; array[offset + 1] = g; array[offset + 2] = b; array[offset + 3] = a; return array; } * [Symbol.iterator]() { yield this.r; yield this.g; yield this.b; yield this.a; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Color4.prototype.isColor4 = true; const _matrix$1 = new Matrix4(); /** * Euler class. */ class Euler { /** * @param {number} [x=0] * @param {number} [y=0] * @param {number} [z=0] * @param {string} [order=Euler.DefaultOrder] */ constructor(x = 0, y = 0, z = 0, order = Euler.DefaultOrder) { this._x = x; this._y = y; this._z = z; this._order = order; } /** * @type {number} */ get x() { return this._x; } /** * @type {number} */ set x(value) { this._x = value; this.onChangeCallback(); } /** * @type {number} */ get y() { return this._y; } /** * @type {number} */ set y(value) { this._y = value; this.onChangeCallback(); } /** * @type {number} */ get z() { return this._z; } /** * @type {number} */ set z(value) { this._z = value; this.onChangeCallback(); } /** * @type {string} */ get order() { return this._order; } /** * @type {string} */ set order(value) { this._order = value; this.onChangeCallback(); } /** * Returns a new Euler with the same parameters as this one. * @returns {Euler} */ clone() { return new Euler(this._x, this._y, this._z, this._order); } /** * Copies value of euler to this euler. * @param {Euler} euler * @returns {Euler} */ copy(euler) { this._x = euler._x; this._y = euler._y; this._z = euler._z; this._order = euler._order; this.onChangeCallback(); return this; } /** * @param {number} x - the angle of the x axis in radians. * @param {number} y - the angle of the y axis in radians. * @param {number} z - the angle of the z axis in radians. * @param {string} order - (optional) a string representing the order that the rotations are applied. * @returns {Euler} */ set(x = 0, y = 0, z = 0, order = this._order) { this._x = x; this._y = y; this._z = z; this._order = order; this.onChangeCallback(); return this; } /** * Sets the angles of this euler transform from a pure rotation matrix based on the orientation specified by order. * @param {Matrix4} m - a Matrix4 of which the upper 3x3 of matrix is a pure rotation matrix * @param {string} order - (optional) a string representing the order that the rotations are applied. * @param {boolean} [update=true] - Whether to notify Euler angle has changed * @returns {Euler} */ setFromRotationMatrix(m, order = this._order, update = true) { // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) const te = m.elements; const m11 = te[0], m12 = te[4], m13 = te[8]; const m21 = te[1], m22 = te[5], m23 = te[9]; const m31 = te[2], m32 = te[6], m33 = te[10]; if (order === 'XYZ') { this._y = Math.asin(MathUtils.clamp(m13, -1, 1)); if (Math.abs(m13) < 0.99999) { this._x = Math.atan2(-m23, m33); this._z = Math.atan2(-m12, m11); } else { this._x = Math.atan2(m32, m22); this._z = 0; } } else if (order === 'YXZ') { this._x = Math.asin(-MathUtils.clamp(m23, -1, 1)); if (Math.abs(m23) < 0.99999) { this._y = Math.atan2(m13, m33); this._z = Math.atan2(m21, m22); } else { this._y = Math.atan2(-m31, m11); this._z = 0; } } else if (order === 'ZXY') { this._x = Math.asin(MathUtils.clamp(m32, -1, 1)); if (Math.abs(m32) < 0.99999) { this._y = Math.atan2(-m31, m33); this._z = Math.atan2(-m12, m22); } else { this._y = 0; this._z = Math.atan2(m21, m11); } } else if (order === 'ZYX') { this._y = Math.asin(-MathUtils.clamp(m31, -1, 1)); if (Math.abs(m31) < 0.99999) { this._x = Math.atan2(m32, m33); this._z = Math.atan2(m21, m11); } else { this._x = 0; this._z = Math.atan2(-m12, m22); } } else if (order === 'YZX') { this._z = Math.asin(MathUtils.clamp(m21, -1, 1)); if (Math.abs(m21) < 0.99999) { this._x = Math.atan2(-m23, m22); this._y = Math.atan2(-m31, m11); } else { this._x = 0; this._y = Math.atan2(m13, m33); } } else if (order === 'XZY') { this._z = Math.asin(-MathUtils.clamp(m12, -1, 1)); if (Math.abs(m12) < 0.99999) { this._x = Math.atan2(m32, m22); this._y = Math.atan2(m13, m11); } else { this._x = Math.atan2(-m23, m33); this._y = 0; } } else { console.warn('given unsupported order: ' + order); } this._order = order; if (update === true) this.onChangeCallback(); return this; } /** * Sets the angles of this euler transform from a normalized quaternion based on the orientation specified by order. * @param {Quaternion} q - a normalized quaternion. * @param {string} order - (optional) a string representing the order that the rotations are applied. * @param {boolean} [update=true] - Whether to notify Euler angle has changed * @returns {Euler} */ setFromQuaternion(q, order, update) { q.toMatrix4(_matrix$1); return this.setFromRotationMatrix(_matrix$1, order, update); } /** * @param {Function} callback - When the Euler angle value changes, the callback method is triggered * @returns {Euler} */ onChange(callback) { this.onChangeCallback = callback; return this; } onChangeCallback() {} * [Symbol.iterator]() { yield this._x; yield this._y; yield this._z; yield this._order; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Euler.prototype.isEuler = true; /** * The order in which to apply rotations. * @readonly */ Euler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX']; /** * The default order in which to apply rotations. * @readonly */ Euler.DefaultOrder = 'XYZ'; /** * The 3x3 matrix class. */ class Matrix3 { /** * Create a 3x3 matrix. */ constructor() { this.elements = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; } /** * Sets the 3x3 matrix values to the given row-major sequence of values. * @param {number} n11 - value to put in row 1, col 1. * @param {number} n12 - value to put in row 1, col 2. * @param {number} n13 - value to put in row 1, col 3. * @param {number} n21 - value to put in row 2, col 1. * @param {number} n22 - value to put in row 2, col 2. * @param {number} n23 - value to put in row 2, col 3. * @param {number} n31 - value to put in row 3, col 1. * @param {number} n32 - value to put in row 3, col 2. * @param {number} n33 - value to put in row 3, col 3. * @returns {Matrix3} */ set(n11, n12, n13, n21, n22, n23, n31, n32, n33) { const ele = this.elements; ele[0] = n11; ele[3] = n12; ele[6] = n13; ele[1] = n21; ele[4] = n22; ele[7] = n23; ele[2] = n31; ele[5] = n32; ele[8] = n33; return this; } /** * Resets this matrix to the 3x3 identity matrix * @returns {Matrix3} */ identity() { return this.set( 1, 0, 0, 0, 1, 0, 0, 0, 1 ); } /** * Checks if the matrix is an identity matrix. * @returns {boolean} - True if the matrix is an identity matrix, false otherwise. */ isIdentity() { const te = this.elements; return te[0] === 1 && te[3] === 0 && te[6] === 0 && te[1] === 0 && te[4] === 1 && te[7] === 0 && te[2] === 0 && te[5] === 0 && te[8] === 1; } /** * Computes and returns the determinant of this matrix. * @returns {number} The determinant. */ determinant() { const te = this.elements; const a = te[0], b = te[1], c = te[2], d = te[3], e = te[4], f = te[5], g = te[6], h = te[7], i = te[8]; return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; } /** * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}. * You can not invert with a determinant of zero. If you attempt this, the method produces * a zero matrix instead. * @returns {Matrix3} A reference to this matrix. */ invert() { const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n12 = te[3], n22 = te[4], n32 = te[5], n13 = te[6], n23 = te[7], n33 = te[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13; if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); const detInv = 1 / det; te[0] = t11 * detInv; te[1] = (n31 * n23 - n33 * n21) * detInv; te[2] = (n32 * n21 - n31 * n22) * detInv; te[3] = t12 * detInv; te[4] = (n33 * n11 - n31 * n13) * detInv; te[5] = (n31 * n12 - n32 * n11) * detInv; te[6] = t13 * detInv; te[7] = (n21 * n13 - n23 * n11) * detInv; te[8] = (n22 * n11 - n21 * n12) * detInv; return this; } /** * Transposes this matrix in place. * @returns {Matrix3} */ transpose() { let tmp; const m = this.elements; tmp = m[1]; m[1] = m[3]; m[3] = tmp; tmp = m[2]; m[2] = m[6]; m[6] = tmp; tmp = m[5]; m[5] = m[7]; m[7] = tmp; return this; } /** * Return true if this matrix and m are equal. * @param {Matrix3} matrix * @returns {boolean} */ equals(matrix) { const te = this.elements; const me = matrix.elements; for (let i = 0; i < 9; i++) { if (te[i] !== me[i]) return false; } return true; } /** * Sets the elements of this matrix based on an array in column-major format. * @param {number[]} array * @param {number} [offset=0] * @returns {Matrix3} */ fromArray(array, offset = 0) { for (let i = 0; i < 9; i++) { this.elements[i] = array[i + offset]; } return this; } /** * Writes the elements of this matrix to an array in column-major format. * @param {number[]} [array] * @param {number} [offset=0] * @returns {number[]} */ toArray(array = [], offset = 0) { const te = this.elements; array[offset] = te[0]; array[offset + 1] = te[1]; array[offset + 2] = te[2]; array[offset + 3] = te[3]; array[offset + 4] = te[4]; array[offset + 5] = te[5]; array[offset + 6] = te[6]; array[offset + 7] = te[7]; array[offset + 8] = te[8]; return array; } /** * Creates a new Matrix3 and with identical elements to this one. * @returns {Matrix3} */ clone() { return new Matrix3().fromArray(this.elements); } /** * Copies the elements of matrix m into this matrix. * @param {Matrix3} m * @returns {Matrix3} */ copy(m) { const te = this.elements; const me = m.elements; te[0] = me[0]; te[1] = me[1]; te[2] = me[2]; te[3] = me[3]; te[4] = me[4]; te[5] = me[5]; te[6] = me[6]; te[7] = me[7]; te[8] = me[8]; return this; } /** * Post-multiplies this matrix by m. * @param {Matrix3} m * @returns {Matrix3} */ multiply(m) { return this.multiplyMatrices(this, m); } /** * Pre-multiplies this matrix by m. * @param {Matrix3} m * @returns {Matrix3} */ premultiply(m) { return this.multiplyMatrices(m, this); } /** * Sets this matrix to a x b. * @param {Matrix3} a * @param {Matrix3} b * @returns {Matrix3} */ multiplyMatrices(a, b) { const ae = a.elements; const be = b.elements; const te = this.elements; const a11 = ae[0], a12 = ae[3], a13 = ae[6]; const a21 = ae[1], a22 = ae[4], a23 = ae[7]; const a31 = ae[2], a32 = ae[5], a33 = ae[8]; const b11 = be[0], b12 = be[3], b13 = be[6]; const b21 = be[1], b22 = be[4], b23 = be[7]; const b31 = be[2], b32 = be[5], b33 = be[8]; te[0] = a11 * b11 + a12 * b21 + a13 * b31; te[3] = a11 * b12 + a12 * b22 + a13 * b32; te[6] = a11 * b13 + a12 * b23 + a13 * b33; te[1] = a21 * b11 + a22 * b21 + a23 * b31; te[4] = a21 * b12 + a22 * b22 + a23 * b32; te[7] = a21 * b13 + a22 * b23 + a23 * b33; te[2] = a31 * b11 + a32 * b21 + a33 * b31; te[5] = a31 * b12 + a32 * b22 + a33 * b32; te[8] = a31 * b13 + a32 * b23 + a33 * b33; return this; } /** * Transform 2D * @param {number} x - position.x * @param {number} y - position.y * @param {number} scaleX - scale.x * @param {number} scaleY - scale.y * @param {number} rotation - rotation * @param {number} anchorX - anchor.x * @param {number} anchorY - anchor.y * @returns {Matrix3} */ transform(x, y, scaleX, scaleY, rotation, anchorX, anchorY) { const te = this.elements; const cr = Math.cos(rotation); const sr = Math.sin(rotation); te[0] = cr * scaleX; te[3] = -sr * scaleY; te[6] = x; te[1] = sr * scaleX; te[4] = cr * scaleY; te[7] = y; te[2] = 0; te[5] = 0; te[8] = 1; if (anchorX || anchorY) { // prepend the anchor offset: te[6] -= anchorX * te[0] + anchorY * te[3]; te[7] -= anchorX * te[1] + anchorY * te[4]; } return this; } /** * Set the transformation matrix of uv coordinates * @param {number} tx * @param {number} ty * @param {number} sx * @param {number} sy * @param {number} rotation * @param {number} cx * @param {number} cy * @returns {Matrix3} */ setUvTransform(tx, ty, sx, sy, rotation, cx, cy) { const c = Math.cos(rotation); const s = Math.sin(rotation); return this.set( sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1 ); } /** * Sets the matri3 planes from the matrix4. * @param {Matrix4} m * @returns {Matrix3} */ setFromMatrix4(m) { const me = m.elements; return this.set( me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10] ); } /** * Extracts the basis vectors from the matrix. * @param {Vector3} xAxis * @param {Vector3} yAxis * @param {Vector3} zAxis * @returns {Matrix3} */ extractBasis(xAxis, yAxis, zAxis) { const te = this.elements; xAxis.fromArray(te); yAxis.fromArray(te, 3); zAxis.fromArray(te, 6); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Matrix3.prototype.isMatrix3 = true; const _vec3_1$4 = new Vector3(); const _vec3_2$1 = new Vector3(); const _mat3_1$1 = new Matrix3(); /** * A two dimensional surface that extends infinitely in 3d space, * represented in Hessian normal form by a unit length normal vector and a constant. */ class Plane { /** * Constructs a new Plane. * @param {Vector3} [normal=Vector3(1, 0, 0)] - A unit length Vector3 defining the normal of the plane. * @param {number} [constant=0] - The signed distance from the origin to the plane. */ constructor(normal = new Vector3(1, 0, 0), constant = 0) { this.normal = normal; this.constant = constant; } /** * Solve a system of equations to find the point where the three planes intersect. * @param {Plane} p1 - The first plane. * @param {Plane} p2 - The second plane. * @param {Plane} p3 - The third plane. * @param {Vector3} target - The result will be copied into this Vector3. * @returns {Vector3} */ static intersectPlanes(p1, p2, p3, target) { // Create the matrix using the normals of the planes as rows _mat3_1$1.set( p1.normal.x, p1.normal.y, p1.normal.z, p2.normal.x, p2.normal.y, p2.normal.z, p3.normal.x, p3.normal.y, p3.normal.z ); // Create the vector using the constants of the planes target.set(-p1.constant, -p2.constant, -p3.constant); // Solve for X by applying the inverse matrix to vector target.applyMatrix3(_mat3_1$1.invert()); return target; } /** * Sets this plane's normal and constant properties by copying the values from the given normal. * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane. * @param {number} constant - the signed distance from the origin to the plane. Default is 0. * @returns {Plane} */ set(normal, constant) { this.normal.copy(normal); this.constant = constant; return this; } /** * Set the individual components that define the plane. * @param {number} x - x value of the unit length normal vector. * @param {number} y - y value of the unit length normal vector. * @param {number} z - z value of the unit length normal vector. * @param {number} w - the value of the plane's constant property. * @returns {Plane} */ setComponents(x, y, z, w) { this.normal.set(x, y, z); this.constant = w; return this; } /** * Sets the plane's properties as defined by a normal and an arbitrary coplanar point. * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane. * @param {Vector3} point - Vector3 * @returns {Plane} */ setFromNormalAndCoplanarPoint(normal, point) { this.normal.copy(normal); this.constant = -point.dot(this.normal); return this; } /** * Defines the plane based on the 3 provided points. * The winding order is assumed to be counter-clockwise, and determines the direction of the normal. * @param {Vector3} a - first point on the plane. * @param {Vector3} b - second point on the plane. * @param {Vector3} c - third point on the plane. * @returns {Plane} */ setFromCoplanarPoints(a, b, c) { const normal = _vec3_1$4.subVectors(c, b).cross(_vec3_2$1.subVectors(a, b)).normalize(); // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? this.setFromNormalAndCoplanarPoint(normal, a); return this; } /** * Normalizes the normal vector, and adjusts the constant value accordingly. * @returns {Plane} */ normalize() { // Note: will lead to a divide by zero if the plane is invalid. const inverseNormalLength = 1.0 / this.normal.getLength(); this.normal.multiplyScalar(inverseNormalLength); this.constant *= inverseNormalLength; return this; } /** * Returns the signed distance from the point to the plane. * @param {Vector3} point * @returns {number} */ distanceToPoint(point) { return this.normal.dot(point) + this.constant; } /** * Projects a point onto the plane. * @param {Vector3} point - the Vector3 to project onto the plane. * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ projectPoint(point, target = new Vector3()) { return target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point)); } /** * Reflects a point through the plane. * @param {Vector3} point - the Vector3 to reflect through the plane. * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ mirrorPoint(point, target = new Vector3()) { const distance = this.distanceToPoint(point); return target.copy(point).addScaledVector(this.normal, -2 * distance); } /** * Returns a Vector3 coplanar to the plane, by calculating the projection of the normal vector at the origin onto the plane. * @param {Vector3} [target] * @returns {Vector3} */ coplanarPoint(target = new Vector3()) { return target.copy(this.normal).multiplyScalar(-this.constant); } /** * Returns a new plane with the same normal and constant as this one. * @returns {Plane} */ clone() { return new Plane().copy(this); } /** * Copies the values of the passed plane's normal and constant properties to this plane. * @param {Plane} plane * @returns {Plane} */ copy(plane) { this.normal.copy(plane.normal); this.constant = plane.constant; return this; } /** * Apply a Matrix4 to the plane. The matrix must be an affine, homogeneous transform. * @param {Matrix4} matrix - the Matrix4 to apply. * @param {Matrix3} [optionalNormalMatrix] - (optional) pre-computed normal Matrix3 of the Matrix4 being applied. * @returns {Plane} */ applyMatrix4(matrix, optionalNormalMatrix) { const normalMatrix = optionalNormalMatrix || _mat3_1$1.setFromMatrix4(matrix).invert().transpose(); const referencePoint = this.coplanarPoint(_vec3_1$4).applyMatrix4(matrix); const normal = this.normal.applyMatrix3(normalMatrix).normalize(); this.constant = -referencePoint.dot(normal); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Plane.prototype.isPlane = true; const _vec3_1$3 = new Vector3(); const _mat3_1 = new Matrix3(); /** * Frustums are used to determine what is inside the camera's field of view. * They help speed up the rendering process - objects which lie outside a camera's frustum can safely be excluded from rendering. */ class Frustum { /** * @param {Plane} p0 - (optional) defaults to a new Plane. * @param {Plane} p1 - (optional) defaults to a new Plane. * @param {Plane} p2 - (optional) defaults to a new Plane. * @param {Plane} p3 - (optional) defaults to a new Plane. * @param {Plane} p4 - (optional) defaults to a new Plane. * @param {Plane} p5 - (optional) defaults to a new Plane. */ constructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) { this.planes = [p0, p1, p2, p3, p4, p5]; } /** * Sets the frustum from the passed planes. No plane order is implied. * @param {Plane} p0 - (optional) defaults to a new Plane. * @param {Plane} p1 - (optional) defaults to a new Plane. * @param {Plane} p2 - (optional) defaults to a new Plane. * @param {Plane} p3 - (optional) defaults to a new Plane. * @param {Plane} p4 - (optional) defaults to a new Plane. * @param {Plane} p5 - (optional) defaults to a new Plane. * @returns {Frustum} */ set(p0, p1, p2, p3, p4, p5) { const planes = this.planes; planes[0].copy(p0); planes[1].copy(p1); planes[2].copy(p2); planes[3].copy(p3); planes[4].copy(p4); planes[5].copy(p5); return this; } /** * Sets the frustum planes from the matrix. * @param {Matrix4} m - a Matrix4 used to set the planes * @returns {Frustum} */ setFromMatrix(m) { const planes = this.planes; const me = m.elements; const me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3]; const me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7]; const me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11]; const me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15]; planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize(); planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize(); planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize(); planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize(); planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize(); planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize(); return this; } /** * Return true if sphere intersects with this frustum. * @param {Sphere} sphere - Sphere to check for intersection. * @returns {boolean} */ intersectsSphere(sphere) { const planes = this.planes; const center = sphere.center; const negRadius = -sphere.radius; for (let i = 0; i < 6; i++) { const distance = planes[i].distanceToPoint(center); if (distance < negRadius) { return false; } } return true; } /** * Return true if box intersects with this frustum. * @param {Box3} box - Box3 to check for intersection. * @returns {boolean} */ intersectsBox(box) { const planes = this.planes; for (let i = 0; i < 6; i++) { const plane = planes[i]; // corner at max distance _vec3_1$3.x = plane.normal.x > 0 ? box.max.x : box.min.x; _vec3_1$3.y = plane.normal.y > 0 ? box.max.y : box.min.y; _vec3_1$3.z = plane.normal.z > 0 ? box.max.z : box.min.z; // if both outside plane, no intersection if (plane.distanceToPoint(_vec3_1$3) < 0) { return false; } } return true; } /** * Apply a matrix4x4 to the frustum. * @param {Matrix4} matrix - Matrix4 to apply to the frustum. * @returns {Frustum} */ applyMatrix4(matrix) { const planes = this.planes; const normalMatrix = _mat3_1.setFromMatrix4(matrix).invert().transpose(); for (let i = 0; i < 6; i++) { planes[i].applyMatrix4(matrix, normalMatrix); } return this; } /** * Return a new Frustum with the same parameters as this one. * @returns {Frustum} */ clone() { return new this.constructor().copy(this); } /** * Copies the properties of the passed frustum into this one. * @param {Frustum} frustum - The frustum to copy * @returns {Frustum} */ copy(frustum) { const planes = this.planes; for (let i = 0; i < 6; i++) { planes[i].copy(frustum.planes[i]); } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Frustum.prototype.isFrustum = true; const _vec3_1$2 = new Vector3(); const _diff = new Vector3(); const _edge1 = new Vector3(); const _edge2 = new Vector3(); const _normal = new Vector3(); /** * A ray that emits from an origin in a certain direction. This is used by * {@link Raycaster} to assist with raycasting. Raycasting is used for * mouse picking (working out what objects in the 3D space the mouse is over) * amongst other things. */ class Ray { /** * Constructs a new ray. * @param {Vector3} [origin=(0,0,0)] - The origin of the ray. * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray. */ constructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) { /** * The origin of the ray. * @type {Vector3} */ this.origin = origin; /** * The (normalized) direction of the ray. * @type {Vector3} */ this.direction = direction; } /** * Sets the ray's components by copying the given values. * @param {Vector3} origin - The origin. * @param {Vector3} direction - The direction. * @returns {Ray} A reference to this ray. */ set(origin, direction) { this.origin.copy(origin); this.direction.copy(direction); return this; } /** * Copies the values of the given ray to this instance. * @param {Ray} ray - The ray to copy. * @returns {Ray} A reference to this ray. */ copy(ray) { this.origin.copy(ray.origin); this.direction.copy(ray.direction); return this; } /** * Returns a vector that is located at a given distance along this ray. * @param {number} t - The distance along the ray to retrieve a position for. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {Vector3} A position on the ray. */ at(t, target = new Vector3()) { return target.copy(this.origin).addScaledVector(this.direction, t); } /** * Shift the origin of this ray along its direction by the given distance. * @param {number} t - The distance along the ray to interpolate. * @returns {Ray} A reference to this ray. */ recast(t) { this.origin.copy(this.at(t, _vec3_1$2)); return this; } /** * Returns the point along this ray that is closest to the given point. * @param {Vector3} point - A point in 3D space to get the closet location on the ray for. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {Vector3} The closest point on this ray. */ closestPointToPoint(point, target) { target.subVectors(point, this.origin); const directionDistance = target.dot(this.direction); if (directionDistance < 0) { return target.copy(this.origin); } return target.copy(this.origin).addScaledVector(this.direction, directionDistance); } /** * Returns the distance of the closest approach between this ray and the given point. * @param {Vector3} point - A point in 3D space to compute the distance to. * @returns {number} The distance. */ distanceToPoint(point) { return Math.sqrt(this.distanceSqToPoint(point)); } /** * Returns the squared distance of the closest approach between this ray and the given point. * @param {Vector3} point - A point in 3D space to compute the distance to. * @returns {number} The squared distance. */ distanceSqToPoint(point) { const directionDistance = _vec3_1$2.subVectors(point, this.origin).dot(this.direction); if (directionDistance < 0) { return this.origin.distanceToSquared(point); } _vec3_1$2.copy(this.direction).multiplyScalar(directionDistance).add(this.origin); return _vec3_1$2.distanceToSquared(point); } /** * Intersects this ray with the given sphere, returning the intersection * point or `null` if there is no intersection. * @param {Sphere} sphere - The sphere to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectSphere(sphere, target) { _vec3_1$2.subVectors(sphere.center, this.origin); const tca = _vec3_1$2.dot(this.direction); const d2 = _vec3_1$2.dot(_vec3_1$2) - tca * tca; const radius2 = sphere.radius * sphere.radius; if (d2 > radius2) { return null; } const thc = Math.sqrt(radius2 - d2); // t0 = first intersect point - entrance on front of sphere const t0 = tca - thc; // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; // test to see if both t0 and t1 are behind the ray - if so, return null if (t0 < 0 && t1 < 0) { return null; } // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, // in order to always return an intersect point that is in front of the ray. if (t0 < 0) { return this.at(t1, target); } // else t0 is in front of the ray, so return the first collision point scaled by t0 return this.at(t0, target); } /** * Returns `true` if this ray intersects with the given sphere. * @param {Sphere} sphere - The sphere to intersect. * @returns {boolean} Whether this ray intersects with the given sphere or not. */ intersectsSphere(sphere) { if (sphere.radius < 0) return false; // handle empty spheres return this.distanceSqToPoint(sphere.center) <= (sphere.radius * sphere.radius); } /** * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray * does not intersect with the plane. * @param {Plane} plane - The plane to compute the distance to. * @returns {?number} Whether this ray intersects with the given sphere or not. */ distanceToPlane(plane) { const denominator = plane.normal.dot(this.direction); if (denominator === 0) { // line is coplanar, return origin if (plane.distanceToPoint(this.origin) === 0) { return 0; } // Null is preferable to undefined since undefined means.... it is undefined return null; } const t = -(this.origin.dot(plane.normal) + plane.constant) / denominator; // Return if the ray never intersects the plane return t >= 0 ? t : null; } /** * Intersects this ray with the given plane, returning the intersection * point or `null` if there is no intersection. * @param {Plane} plane - The plane to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectPlane(plane, target) { const t = this.distanceToPlane(plane); if (t === null) { return null; } return this.at(t, target); } /** * Returns `true` if this ray intersects with the given plane. * @param {Plane} plane - The plane to intersect. * @returns {boolean} Whether this ray intersects with the given plane or not. */ intersectsPlane(plane) { // check if the ray lies on the plane first const distToPoint = plane.distanceToPoint(this.origin); if (distToPoint === 0) { return true; } const denominator = plane.normal.dot(this.direction); if (denominator * distToPoint < 0) { return true; } // ray origin is behind the plane (and is pointing behind it) return false; } /** * Intersects this ray with the given bounding box, returning the intersection * point or `null` if there is no intersection. * @param {Box3} box - The box to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectBox(box, target) { let tmin, tmax, tymin, tymax, tzmin, tzmax; const invdirx = 1 / this.direction.x, invdiry = 1 / this.direction.y, invdirz = 1 / this.direction.z; const origin = this.origin; if (invdirx >= 0) { tmin = (box.min.x - origin.x) * invdirx; tmax = (box.max.x - origin.x) * invdirx; } else { tmin = (box.max.x - origin.x) * invdirx; tmax = (box.min.x - origin.x) * invdirx; } if (invdiry >= 0) { tymin = (box.min.y - origin.y) * invdiry; tymax = (box.max.y - origin.y) * invdiry; } else { tymin = (box.max.y - origin.y) * invdiry; tymax = (box.min.y - origin.y) * invdiry; } if ((tmin > tymax) || (tymin > tmax)) return null; // These lines also handle the case where tmin or tmax is NaN // (result of 0 * Infinity). x !== x returns true if x is NaN if (tymin > tmin || tmin !== tmin) tmin = tymin; if (tymax < tmax || tmax !== tmax) tmax = tymax; if (invdirz >= 0) { tzmin = (box.min.z - origin.z) * invdirz; tzmax = (box.max.z - origin.z) * invdirz; } else { tzmin = (box.max.z - origin.z) * invdirz; tzmax = (box.min.z - origin.z) * invdirz; } if ((tmin > tzmax) || (tzmin > tmax)) return null; if (tzmin > tmin || tmin !== tmin) tmin = tzmin; if (tzmax < tmax || tmax !== tmax) tmax = tzmax; // return point closest to the ray (positive side) if (tmax < 0) return null; return this.at(tmin >= 0 ? tmin : tmax, target); } /** * Returns `true` if this ray intersects with the given box. * @param {Box3} box - The box to intersect. * @returns {boolean} Whether this ray intersects with the given box or not. */ intersectsBox(box) { return this.intersectBox(box, _vec3_1$2) !== null; } /** * Intersects this ray with the given triangle, returning the intersection * point or `null` if there is no intersection. * @param {Vector3} a - The first vertex of the triangle. * @param {Vector3} b - The second vertex of the triangle. * @param {Vector3} c - The third vertex of the triangle. * @param {boolean} backfaceCulling - Whether to use backface culling or not. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectTriangle(a, b, c, backfaceCulling, target) { // Compute the offset origin, edges, and normal. // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h _edge1.subVectors(b, a); _edge2.subVectors(c, a); _normal.crossVectors(_edge1, _edge2); // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) let DdN = this.direction.dot(_normal); let sign; if (DdN > 0) { if (backfaceCulling) return null; sign = 1; } else if (DdN < 0) { sign = -1; DdN = -DdN; } else { return null; } _diff.subVectors(this.origin, a); const DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2)); // b1 < 0, no intersection if (DdQxE2 < 0) { return null; } const DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff)); // b2 < 0, no intersection if (DdE1xQ < 0) { return null; } // b1+b2 > 1, no intersection if (DdQxE2 + DdE1xQ > DdN) { return null; } // Line intersects triangle, check if ray does. const QdN = -sign * _diff.dot(_normal); // t < 0, no intersection if (QdN < 0) { return null; } // Ray intersects triangle. return this.at(QdN / DdN, target); } /** * Transforms this ray with the given 4x4 transformation matrix. * @param {Matrix4} matrix4 - The transformation matrix. * @returns {Ray} A reference to this ray. */ applyMatrix4(matrix4) { this.origin.applyMatrix4(matrix4); this.direction.transformDirection(matrix4); return this; } /** * Returns `true` if this ray is equal with the given one. * @param {Ray} ray - The ray to test for equality. * @returns {boolean} Whether this ray is equal with the given one. */ equals(ray) { return ray.origin.equals(this.origin) && ray.direction.equals(this.direction); } /** * Returns a new ray with copied values from this instance. * @returns {Ray} A clone of this instance. */ clone() { return new this.constructor().copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Ray.prototype.isRay = true; const _box3_1 = new Box3(); const _vec3_1$1 = new Vector3(); const _vec3_2 = new Vector3(); /** * A sphere defined by a center and radius. */ class Sphere { /** * @param {Vector3} [center=Vector3(0, 0, 0)] - center of the sphere. * @param {number} [radius=-1] - radius of the sphere. */ constructor(center = new Vector3(), radius = -1) { this.center = center; this.radius = radius; } /** * Sets the center and radius properties of this sphere. * @param {Vector3} center - center of the sphere. * @param {number} radius - radius of the sphere. * @returns {Sphere} */ set(center, radius) { this.center.copy(center); this.radius = radius; return this; } /** * Computes the minimum bounding sphere for an array of points. * If optionalCenteris given, it is used as the sphere's center. * Otherwise, the center of the axis-aligned bounding box encompassing points is calculated. * @param {Vector3[]} points - an Array of Vector3 positions. * @param {Vector3} [optionalCenter] - the center of the sphere. * @returns {Sphere} */ setFromPoints(points, optionalCenter) { const center = this.center; if (optionalCenter !== undefined) { center.copy(optionalCenter); } else { _box3_1.setFromPoints(points).getCenter(center); } let maxRadiusSq = 0; for (let i = 0, il = points.length; i < il; i++) { maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i])); } this.radius = Math.sqrt(maxRadiusSq); return this; } /** * Computes the minimum bounding sphere for an array of points. * @param {number[]} array - An Array of position data that the resulting sphere will envelop. * @param {number} [gap=3] - The number of elements between the start of each position in the array. * @param {number} [offset=0] - The offset in each gap where the position data starts. * @param {boolean} [denormalize=false] - whether to denormalize the values in the array. * @returns {Sphere} A reference to this sphere. */ setFromArray(array, gap = 3, offset = 0, denormalize = false) { const center = this.center; _box3_1.setFromArray(array, gap, offset, denormalize).getCenter(center); let maxRadiusSq = 0; for (let i = 0, l = array.length; i < l; i += gap) { _vec3_1$1.fromArray(array, i + offset, denormalize); maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vec3_1$1)); } this.radius = Math.sqrt(maxRadiusSq); return this; } /** * Transforms this sphere with the provided Matrix4. * @param {Matrix4} matrix - the Matrix4 to apply * @returns {Matrix4} */ applyMatrix4(matrix) { this.center.applyMatrix4(matrix); this.radius = this.radius * matrix.getMaxScaleOnAxis(); return this; } /** * Returns aMinimum Bounding Box for the sphere. * @param {Box3} target — the result will be copied into this Box3. * @returns {Box3} */ getBoundingBox(target) { if (this.isEmpty()) { // Empty sphere produces empty bounding box target.makeEmpty(); return target; } target.set(this.center, this.center); target.expandByScalar(this.radius); return target; } /** * Checks to see if the sphere is empty (the radius set to a negative number). * Spheres with a radius of 0 contain only their center point and are not considered to be empty. * @returns {boolean} */ isEmpty() { return this.radius < 0; } /** * Makes the sphere empty by setting center to (0, 0, 0) and radius to -1. * @returns {Sphere} */ makeEmpty() { this.center.set(0, 0, 0); this.radius = -1; return this; } /** * Checks to see if the sphere contains the provided point inclusive of the surface of the sphere. * @param {Vector3} point - The point to check for containment. * @returns {boolean} */ containsPoint(point) { return (point.distanceToSquared(this.center) <= (this.radius * this.radius)); } /** * Returns the closest distance from the boundary of the sphere to the point. * If the sphere contains the point, the distance will be negative. * @param {Vector3} point - The point to calculate the distance to. * @returns {number} */ distanceToPoint(point) { return (point.distanceTo(this.center) - this.radius); } /** * Expands the boundaries of this sphere to include point. * @param {Vector3} point - The vector3 that should be included in the sphere. * @returns {Sphere} */ expandByPoint(point) { if (this.isEmpty()) { this.center.copy(point); this.radius = 0; return this; } _vec3_1$1.subVectors(point, this.center); const lengthSq = _vec3_1$1.getLengthSquared(); if (lengthSq > (this.radius * this.radius)) { // calculate the minimal sphere const length = Math.sqrt(lengthSq); const delta = (length - this.radius) * 0.5; this.center.addScaledVector(_vec3_1$1, delta / length); this.radius += delta; } return this; } /** * Expands this sphere to enclose both the original sphere and the given sphere. * @param {Sphere} sphere - The sphere to include. * @returns {Sphere} A reference to this sphere. */ union(sphere) { if (sphere.isEmpty()) { return this; } if (this.isEmpty()) { this.copy(sphere); return this; } if (this.center.equals(sphere.center)) { this.radius = Math.max(this.radius, sphere.radius); } else { _vec3_2.subVectors(sphere.center, this.center).normalize().multiplyScalar(sphere.radius); this.expandByPoint(_vec3_1$1.addVectors(sphere.center, _vec3_2)); this.expandByPoint(_vec3_1$1.addVectors(sphere.center, _vec3_2)); } return this; } /** * Returns a new sphere with the same center and radius as this one. * @returns {Sphere} */ clone() { return new Sphere().copy(this); } /** * Copies the values of the passed sphere's center and radius properties to this sphere. * @param {Sphere} sphere * @returns {Sphere} */ copy(sphere) { this.center.copy(sphere.center); this.radius = sphere.radius; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Sphere.prototype.isSphere = true; /** * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system * * The poles (phi) are at the positive and negative y axis. * The equator starts at positive z. */ class Spherical { /** * @param {number} [radius=1] - the radius, or the Euclidean distance (straight-line distance) from the point to the origin. Default is 1.0. * @param {number} [phi=0] - - polar angle in radians from the y (up) axis. Default is 0. * @param {number} [theta=0] - - equator angle in radians around the y (up) axis. Default is 0. */ constructor(radius = 1, phi = 0, theta = 0) { this.radius = radius; this.phi = phi; // up / down towards top and bottom pole this.theta = theta; // around the equator of the sphere } /** * Sets values of this spherical's radius, phi and theta properties. * @param {number} radius * @param {number} phi * @param {number} theta * @returns {Spherical} */ set(radius, phi, theta) { this.radius = radius; this.phi = phi; this.theta = theta; return this; } /** * Copies the values of the passed Spherical's radius, phi and theta properties to this spherical. * @param {Spherical} other * @returns {Spherical} */ copy(other) { this.radius = other.radius; this.phi = other.phi; this.theta = other.theta; return this; } /** * Returns a new spherical with the same radius, phi and theta properties as this one. * @returns {Spherical} */ clone() { return new Spherical().copy(this); } /** * Restrict phi to be betwee EPS and PI-EPS. * @returns {Spherical} */ makeSafe() { const EPS = 0.000001; this.phi = MathUtils.clamp(this.phi, EPS, Math.PI - EPS); return this; } /** * Sets values of this spherical's radius, phi and theta properties from the Vector3. * @param {Vector3} vec3 * @returns {Spherical} */ setFromVector3(vec3) { this.radius = vec3.getLength(); if (this.radius === 0) { this.theta = 0; this.phi = 0; } else { this.theta = Math.atan2(vec3.x, vec3.z); // equator angle around y-up axis this.phi = Math.acos(MathUtils.clamp(vec3.y / this.radius, -1, 1)); // polar angle } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Spherical.prototype.isSpherical = true; /** * Primary reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf * Secondary reference: https://www.ppsloan.org/publications/StupidSH36.pdf * 3-band SH defined by 9 coefficients. */ class SphericalHarmonics3 { /** * Creates a new instance of SphericalHarmonics3. */ constructor() { /** * An array holding the (9) SH coefficients. * A single coefficient is represented as an instance of Vector3. * @type {Array} */ this.coefficients = []; for (let i = 0; i < 9; i++) { this.coefficients.push(new Vector3()); } } /** * Set this sphericalHarmonics3 value. * @param {Vector3[]} coefficients An array of SH coefficients. * @returns {SphericalHarmonics3} */ set(coefficients) { for (let i = 0; i < 9; i++) { this.coefficients[i].copy(coefficients[i]); } return this; } /** * Sets all SH coefficients to 0. * @returns {SphericalHarmonics3} */ zero() { for (let i = 0; i < 9; i++) { this.coefficients[i].set(0, 0, 0); } return this; } /** * Returns the radiance in the direction of the given normal. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {Vector3} target - The result vector. * @returns {Vector3} */ getAt(normal, target) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; const coeff = this.coefficients; // band 0 target.copy(coeff[0]).multiplyScalar(0.282095); // band 1 target.addScaledVector(coeff[1], 0.488603 * y); target.addScaledVector(coeff[2], 0.488603 * z); target.addScaledVector(coeff[3], 0.488603 * x); // band 2 target.addScaledVector(coeff[4], 1.092548 * (x * y)); target.addScaledVector(coeff[5], 1.092548 * (y * z)); target.addScaledVector(coeff[6], 0.315392 * (3.0 * z * z - 1.0)); target.addScaledVector(coeff[7], 1.092548 * (x * z)); target.addScaledVector(coeff[8], 0.546274 * (x * x - y * y)); return target; } /** * Reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf * Returns the irradiance (radiance convolved with cosine lobe) in the direction of the given normal. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {Vector3} target - The result vector. * @returns {Vector3} */ getIrradianceAt(normal, target) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; const coeff = this.coefficients; // band 0 target.copy(coeff[0]).multiplyScalar(0.886227); // π * 0.282095 // band 1 target.addScaledVector(coeff[1], 2.0 * 0.511664 * y); // ( 2 * π / 3 ) * 0.488603 target.addScaledVector(coeff[2], 2.0 * 0.511664 * z); target.addScaledVector(coeff[3], 2.0 * 0.511664 * x); // band 2 target.addScaledVector(coeff[4], 2.0 * 0.429043 * x * y); // ( π / 4 ) * 1.092548 target.addScaledVector(coeff[5], 2.0 * 0.429043 * y * z); target.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); // ( π / 4 ) * 0.315392 * 3 target.addScaledVector(coeff[7], 2.0 * 0.429043 * x * z); target.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); // ( π / 4 ) * 0.546274 return target; } /** * Adds the given SH to this instance. * @param {SphericalHarmonics3} sh - The SH to add. * @returns {SphericalHarmonics3} */ add(sh) { for (let i = 0; i < 9; i++) { this.coefficients[i].add(sh.coefficients[i]); } return this; } /** * A convenience method for performing .add() and .scale() at once. * @param {SphericalHarmonics3} sh - The SH to add. * @param {Vector3} s - The scale factor. * @returns {SphericalHarmonics3} */ addScaledSH(sh, s) { for (let i = 0; i < 9; i++) { this.coefficients[i].addScaledVector(sh.coefficients[i], s); } return this; } /** * Multiply the s to this SphericalHarmonics3. * @param {number} s - The scale factor. * @returns {SphericalHarmonics3} */ scale(s) { for (let i = 0; i < 9; i++) { this.coefficients[i].multiplyScalar(s); } return this; } /** * Linear interpolates between the given SH and this instance by the given alpha factor. * Sets this coefficients vector to be the vector linearly interpolated between v1 and v2 * where alpha is the percent distance along the line connecting the two vectors * - alpha = 0 will be v1, and alpha = 1 will be v2. * @param {SphericalHarmonics3} sh - The SH to interpolate with. * @param {number} alpha - The alpha factor. * @returns {SphericalHarmonics3} */ lerp(sh, alpha) { for (let i = 0; i < 9; i++) { this.coefficients[i].lerpVectors(this.coefficients[i], sh.coefficients[i], alpha); } return this; } /** * Returns true if the given SH and this instance have equal coefficients. * @param {SphericalHarmonics3} sh - The SH to compare with. * @returns {boolean} */ equals(sh) { for (let i = 0; i < 9; i++) { if (!this.coefficients[i].equals(sh.coefficients[i])) { return false; } } return true; } /** * Copies the given SH to this instance. * @param {SphericalHarmonics3} sh - The SH to compare with. * @returns {SphericalHarmonics3} */ copy(sh) { return this.set(sh.coefficients); } /** * Returns a new instance of SphericalHarmonics3 with equal coefficients. * @returns {SphericalHarmonics3} */ clone() { return new this.constructor().copy(this); } /** * Sets the coefficients of this instance from the given array. * @param {number[]} array - The array holding the numbers of the SH coefficients. * @param {number} [offset=0] - The array offset. * @returns {SphericalHarmonics3} */ fromArray(array, offset = 0) { const coefficients = this.coefficients; for (let i = 0; i < 9; i++) { coefficients[i].fromArray(array, offset + (i * 3)); } return this; } /** * Returns an array with the coefficients, or copies them into the provided array. * The coefficients are represented as numbers. * @param {number[]} [array] - The target array. * @param {number} [offset=0] - The array offset. * @returns {number[]} */ toArray(array = [], offset = 0) { const coefficients = this.coefficients; for (let i = 0; i < 9; i++) { coefficients[i].toArray(array, offset + (i * 3)); } return array; } /** * Computes the SH basis for the given normal vector. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {number[]} shBasis - The resulting SH basis. */ static getBasisAt(normal, shBasis) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; // band 0 shBasis[0] = 0.282095; // band 1 shBasis[1] = 0.488603 * y; shBasis[2] = 0.488603 * z; shBasis[3] = 0.488603 * x; // band 2 shBasis[4] = 1.092548 * x * y; shBasis[5] = 1.092548 * y * z; shBasis[6] = 0.315392 * (3 * z * z - 1); shBasis[7] = 1.092548 * x * z; shBasis[8] = 0.546274 * (x * x - y * y); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SphericalHarmonics3.prototype.isSphericalHarmonics3 = true; const _v0 = new Vector3(); const _v1 = new Vector3(); const _v2 = new Vector3(); const _v3 = new Vector3(); /** * A geometric triangle as defined by three Vector3s representing its three corners. */ class Triangle { /** * @param {Vector3} [a] - the first corner of the triangle. Default is a Vector3 at (0, 0, 0). * @param {Vector3} [b] - the second corner of the triangle. Default is a Vector3 at (0, 0, 0). * @param {Vector3} [c] - the final corner of the triangle. Default is a Vector3 at (0, 0, 0). */ constructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) { this.a = a; this.b = b; this.c = c; } /** * Calculate the normal vector of the triangle. * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @param {Vector3} [optionalTarget] * @returns {Vector3} */ static normal(a, b, c, optionalTarget) { const result = optionalTarget || new Vector3(); result.subVectors(c, b); _v0.subVectors(a, b); result.cross(_v0); const resultLengthSq = result.getLengthSquared(); if (resultLengthSq > 0) { return result.multiplyScalar(1 / Math.sqrt(resultLengthSq)); } return result.set(0, 0, 0); } /** * static/instance method to calculate barycentric coordinates. * based on: http://www.blackpawn.com/texts/pointinpoly/default.html * @param {Vector3} point - Vector3 * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ static barycoordFromPoint(point, a, b, c, target) { _v0.subVectors(c, a); _v1.subVectors(b, a); _v2.subVectors(point, a); const dot00 = _v0.dot(_v0); const dot01 = _v0.dot(_v1); const dot02 = _v0.dot(_v2); const dot11 = _v1.dot(_v1); const dot12 = _v1.dot(_v2); const denom = (dot00 * dot11 - dot01 * dot01); const result = target || new Vector3(); // collinear or singular triangle if (denom === 0) { // arbitrary location outside of triangle? // not sure if this is the best idea, maybe should be returning undefined return result.set(-2, -1, -1); } const invDenom = 1 / denom; const u = (dot11 * dot02 - dot01 * dot12) * invDenom; const v = (dot00 * dot12 - dot01 * dot02) * invDenom; // barycentric coordinates must always sum to 1 return result.set(1 - u - v, v, u); } /** * Returns true if the passed point, when projected onto the plane of the triangle, lies within the triangle. * @param {Vector3} point * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @returns {Vector3} */ static containsPoint(point, a, b, c) { this.barycoordFromPoint(point, a, b, c, _v3); return (_v3.x >= 0) && (_v3.y >= 0) && ((_v3.x + _v3.y) <= 1); } /** * Sets the triangle's a, b and c properties to the passed vector3s. * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @returns {Triangle} */ set(a, b, c) { this.a.copy(a); this.b.copy(b); this.c.copy(c); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Triangle.prototype.isTriangle = true; /** * The vector 4 class */ class Vector4 { /** * @param {number} [x=0] - the x value of this vector. * @param {number} [y=0] - the y value of this vector. * @param {number} [z=0] - the z value of this vector. * @param {number} [w=1] - the w value of this vector. */ constructor(x = 0, y = 0, z = 0, w = 1) { this.x = x; this.y = y; this.z = z; this.w = w; } /** * Sets this vector to be the vector linearly interpolated between v1 and v2 * where ratio is the percent distance along the line connecting the two vectors * - ratio = 0 will be v1, and ratio = 1 will be v2. * @param {Vector4} v1 - the starting Vector4. * @param {Vector4} v2 - Vector4 to interpolate towards. * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1]. * @returns {Vector4} */ lerpVectors(v1, v2, ratio) { return this.subVectors(v2, v1).multiplyScalar(ratio).add(v1); } /** * Sets the x, y, z and w components of this vector. * @param {number} x * @param {number} y * @param {number} z * @param {number} w * @returns {Vector4} */ set(x = 0, y = 0, z = 0, w = 1) { this.x = x; this.y = y; this.z = z; this.w = w; return this; } /** * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1. * @returns {Vector4} */ normalize() { return this.multiplyScalar(1 / (this.getLength() || 1)); } /** * Multiplies this vector by scalar s. * @param {number} scalar * @returns {Vector4} */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; this.z *= scalar; this.w *= scalar; return this; } /** * Calculates the dot product of this vector and v. * @param {Vector4} v * @returns {Vector4} */ dot(v) { return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; } /** * Computes the square of the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w). * If you are comparing the lengths of vectors, you should compare the length squared instead * as it is slightly more efficient to calculate. * @returns {number} */ getLengthSquared() { return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; } /** * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w). * @returns {number} */ getLength() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); } /** * Computes the {@link https://en.wikipedia.org/wiki/Taxicab_geometry|Manhattan length} from (0, 0, 0, 0) to (x, y, z, w). * @returns {number} */ getManhattanLength() { return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w); } /** * Multiplies this vector by 4 x 4 m. * @param {Matrix4} m * @returns {Vector4} */ applyMatrix4(m) { const x = this.x, y = this.y, z = this.z, w = this.w; const e = m.elements; this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w; this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w; this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w; this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w; return this; } /** * Sets this vector to the position represented by the matrix m. * @param {Matrix4} m * @returns {Vector4} */ setFromMatrixPosition(m) { const e = m.elements; this.x = e[12]; this.y = e[13]; this.z = e[14]; this.w = e[15]; return this; } /** * Checks for strict equality of this vector and v. * @param {Vector4} v * @returns {boolean} */ equals(v) { return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z) && (v.w === this.w)); } /** * Adds v to this vector. * @param {Vector4} v * @returns {Vector4} */ add(v) { this.x += v.x; this.y += v.y; this.z += v.z; this.w += v.w; return this; } /** * Multiplies this vector by v. * @param {Vector4} v * @returns {Vector4} */ multiply(v) { this.x *= v.x; this.y *= v.y; this.z *= v.z; this.w *= v.w; return this; } /** * Sets this vector to a - b. * @param {Vector4} a * @param {Vector4} b * @returns {Vector4} */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; this.w = a.w - b.w; return this; } /** * Sets this vector's x value to be array[ offset + 0 ], * y value to be array[ offset + 1 ] z value to be array[ offset + 2 ] * and w value to be array[ offset + 3 ]. * @param {number[]} array - the source array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array. * @returns {Vector4} */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2], w = array[offset + 3]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); w = MathUtils.denormalize(w, array); } this.x = x; this.y = y; this.z = z; this.w = w; return this; } /** * Returns an array [x, y, z, w], or copies x, y, z and w into the provided array. * @param {number[]} [array] - array to store this vector to. If this is not provided, a new array will be created. * @param {number} [offset=0] - offset into the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {number[]} */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y, z = this.z, w = this.w; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); w = MathUtils.normalize(w, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; array[offset + 3] = w; return array; } /** * Rounds the x, y, z and w values of this vector to the nearest integer value. * @returns {Vector4} */ round() { this.x = Math.round(this.x); this.y = Math.round(this.y); this.z = Math.round(this.z); this.w = Math.round(this.w); return this; } /** * Returns a new Vector4 with the same x, y, z and w values as this one. * @returns {Vector4} */ clone() { return new Vector4(this.x, this.y, this.z, this.w); } /** * Copies the values of the passed Vector4's x, y, z and w properties to this Vector4. * @param {Vector4} v * @returns {Vector4} */ copy(v) { this.x = v.x; this.y = v.y; this.z = v.z; this.w = (v.w !== undefined) ? v.w : 1; return this; } * [Symbol.iterator]() { yield this.x; yield this.y; yield this.z; yield this.w; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector4.prototype.isVector4 = true; /** * Clone uniforms. * @function * @name cloneUniforms * @param {object} uniforms_src - The input uniforms. * @returns {object} - The output uniforms. */ function cloneUniforms(uniforms_src) { const uniforms_dst = {}; for (const name in uniforms_src) { const uniform_src = uniforms_src[name]; if (Array.isArray(uniform_src) || ArrayBuffer.isView(uniform_src)) { uniforms_dst[name] = uniform_src.slice(); } else { uniforms_dst[name] = uniform_src; } } return uniforms_dst; } /** * Clone json. * This is faster than JSON.parse(JSON.stringify()). * @function * @name cloneJson * @param {object} obj - The input json. * @returns {object} - The output json. */ function cloneJson(obj) { const newObj = Array.isArray(obj) ? [] : {}; if (obj && typeof obj === 'object') { for (const key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = (obj[key] && typeof obj[key] === 'object') ? cloneJson(obj[key]) : obj[key]; } } } return newObj; } let _object3DId = 0; const _mat4_1$2 = new Matrix4(); /** * This is the base class for most objects, * and provides a set of properties and methods for manipulating objects in 3D space. */ class Object3D { constructor() { /** * Unique number for this object instance. * @readonly * @type {number} */ this.id = _object3DId++; /** * UUID of this object instance. * This gets automatically assigned, so this shouldn't be edited. * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * Optional name of the object (doesn't need to be unique). * @type {string} * @default "" */ this.name = ''; /** * A Vector3 representing the object's local position. * @type {Vector3} * @default Vector3(0, 0, 0) */ this.position = new Vector3(); /** * The object's local scale. * @type {Vector3} * @default Vector3(1, 1, 1) */ this.scale = new Vector3(1, 1, 1); /** * Object's local rotation as an {@link Euler}, in radians. * @type {Euler} * @default Euler(0, 0, 0) */ this.euler = new Euler(); /** * Object's local rotation as a {@link Quaternion}. * @type {Quaternion} * @default Quaternion(0, 0, 0, 1) */ this.quaternion = new Quaternion(); // bind euler and quaternion const euler = this.euler, quaternion = this.quaternion; euler.onChange(function() { quaternion.setFromEuler(euler, false); }); quaternion.onChange(function() { euler.setFromQuaternion(quaternion, undefined, false); }); /** * The local transform matrix. * @type {Matrix4} */ this.matrix = new Matrix4(); /** * The global transform of the object. * If the Object3D has no parent, then it's identical to the local transform {@link Object3D#matrix}. * @type {Matrix4} */ this.worldMatrix = new Matrix4(); /** * Object's parent in the scene graph. * An object can have at most one parent. * @type {Object3D[]} */ this.children = new Array(); /** * Object's parent in the scene graph. * An object can have at most one parent. * @type {Object3D} */ this.parent = null; /** * Whether the object gets rendered into shadow map. * @type {boolean} * @default false */ this.castShadow = false; /** * Whether the material receives shadows. * @type {boolean} * @default false */ this.receiveShadow = false; /** * Defines shadow map type. * Note: In webgl1 or {@link Scene#disableShadowSampler} is true, soft shadow types will fallback to POISSON_SOFT without warning. * Note: Point light only support POISSON_SOFT for now. * @type {SHADOW_TYPE} * @default SHADOW_TYPE.PCF3_SOFT */ this.shadowType = SHADOW_TYPE.PCF3_SOFT; /** * When this is set, it checks every frame if the object is in the frustum of the camera before rendering the object. * Otherwise the object gets rendered every frame even if it isn't visible. * @type {boolean} * @default true */ this.frustumCulled = true; /** * Object gets rendered if true. * @type {boolean} * @default true */ this.visible = true; /** * This value allows the default rendering order of scene graph objects to be overridden although opaque and transparent objects remain sorted independently. * Sorting is from lowest to highest renderOrder. * @type {number} * @default 0 */ this.renderOrder = 0; /** * Render layer of this object. * RenderQueue will dispatch all renderable objects to the corresponding RenderQueueLayer according to object.renderLayer. * @type {number} * @default 0 */ this.renderLayer = 0; /** * Whether it can be collected into the Render Queue. * @type {boolean} * @default true */ this.renderable = true; /** * An object that can be used to store custom data about the {@link Object3D}. * It should not hold references to functions as these will not be cloned. * @type {object} * @default {} */ this.userData = {}; /** * When this is set, it calculates the matrix of position, (rotation or quaternion) and scale every frame and also recalculates the worldMatrix property. * @type {boolean} * @default true */ this.matrixAutoUpdate = true; /** * When this is set, it calculates the matrix in that frame and resets this property to false. * @type {boolean} * @default true */ this.matrixNeedsUpdate = true; /** * When this is set, it calculates the world matrix in that frame and resets this property to false. * @type {boolean} * @default true */ this.worldMatrixNeedsUpdate = true; } /** * An optional callback that is executed immediately before the Object3D is rendered. */ onBeforeRender() {} /** * An optional callback that is executed immediately after the Object3D is rendered. */ onAfterRender() {} /** * Add object as child of this object. * @param {Object3D} object */ add(object) { if (object === this) { console.error('Object3D.add: object can\'t be added as a child of itself.', object); return; } if (object.parent !== null) { object.parent.remove(object); } object.parent = this; this.children.push(object); object.worldMatrixNeedsUpdate = true; } /** * Remove object as child of this object. * @param {Object3D} object */ remove(object) { const index = this.children.indexOf(object); if (index !== -1) { object.parent = null; this.children.splice(index, 1); object.worldMatrixNeedsUpdate = true; } } /** * Searches through the object's children and returns the first with a matching name. * Note that for most objects the name is an empty string by default. * You will have to set it manually to make use of this method. * @param {string} name - String to match to the children's {@link Object3D#name} property. * @returns {Object3D} */ getObjectByName(name) { return this.getObjectByProperty('name', name); } /** * Searches through the object's children and returns the first with a property that matches the value given. * @param {string} name - the property name to search for. * @param {number} value - value of the given property. * @returns {Object3D} */ getObjectByProperty(name, value) { if (this[name] === value) return this; for (let i = 0, l = this.children.length; i < l; i++) { const child = this.children[i]; const object = child.getObjectByProperty(name, value); if (object !== undefined) { return object; } } return undefined; } /** * Update the local transform. * @param {boolean} force */ updateMatrix(force) { if (this.matrixAutoUpdate || this.matrixNeedsUpdate) { this.matrix.compose(this.position, this.quaternion, this.scale); this.matrixNeedsUpdate = false; this.worldMatrixNeedsUpdate = true; } if (this.worldMatrixNeedsUpdate || force) { this.worldMatrix.copy(this.matrix); if (this.parent) { const parentMatrix = this.parent.worldMatrix; this.worldMatrix.premultiply(parentMatrix); } this.worldMatrixNeedsUpdate = false; force = true; } const children = this.children; for (let i = 0, l = children.length; i < l; i++) { children[i].updateMatrix(force); } } /** * Returns a vector representing the direction of object's positive z-axis in world space. * This call must be after {@link Object3D#updateMatrix}. * @param {Vector3} [optionalTarget] — the result will be copied into this Vector3. * @returns {Vector3} - the result. */ getWorldDirection(optionalTarget = new Vector3()) { const e = this.worldMatrix.elements; return optionalTarget.set(e[8], e[9], e[10]).normalize(); } /** * Rotates the object to face a point in local space. * @param {Vector3} target - A vector representing a position in local space. * @param {Vector3} up — A vector representing the up direction in local space. */ lookAt(target, up) { _mat4_1$2.lookAtRH(target, this.position, up); this.quaternion.setFromRotationMatrix(_mat4_1$2); } /** * Method to get intersections between a casted ray and this object. * @abstract * @param {Ray} ray - The {@link Ray} instance. * @param {Array} intersects - output intersects array. */ raycast(ray, intersects) { } /** * Executes the callback on this object and all descendants. * @param {Function} callback - A function with as first argument an object3D object. */ traverse(callback) { callback(this); const children = this.children; for (let i = 0, l = children.length; i < l; i++) { children[i].traverse(callback); } } /** * Returns a clone of this object and optionally all descendants. * @param {Function} [recursive=true] - if true, descendants of the object are also cloned. * @returns {Object3D} */ clone(recursive) { return new this.constructor().copy(this, recursive); } /** * Copy the given object into this object. * @param {Object3D} source - The object to be copied. * @param {boolean} [recursive=true] - if true, descendants of the object are also copied. * @returns {Object3D} */ copy(source, recursive = true) { this.name = source.name; this.position.copy(source.position); this.quaternion.copy(source.quaternion); this.scale.copy(source.scale); this.matrix.copy(source.matrix); this.worldMatrix.copy(source.worldMatrix); this.castShadow = source.castShadow; this.receiveShadow = source.receiveShadow; this.shadowType = source.shadowType; this.frustumCulled = source.frustumCulled; this.visible = source.visible; this.renderOrder = source.renderOrder; this.renderLayer = source.renderLayer; this.renderable = source.renderable; this.userData = cloneJson(source.userData); if (recursive === true) { for (let i = 0; i < source.children.length; i++) { const child = source.children[i]; this.add(child.clone()); } } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Object3D.prototype.isObject3D = true; const _plane_1 = new Plane(); let _sceneDataId = 0; /** * SceneData collect all render states about scene, Including lights. */ class SceneData { constructor() { this.id = _sceneDataId++; this.version = 0; this.useAnchorMatrix = false; this.anchorMatrix = new Matrix4(); this.anchorMatrixInverse = new Matrix4(); this.disableShadowSampler = false; this.logarithmicDepthBuffer = false; this.fog = null; this.environment = null; this.envDiffuseIntensity = 1; this.envSpecularIntensity = 1; this.clippingPlanesData = new Float32Array([]); this.numClippingPlanes = 0; } /** * Update scene data. * @param {Scene} scene */ update(scene) { this.useAnchorMatrix = !scene.anchorMatrix.isIdentity(); this.anchorMatrix.copy(scene.anchorMatrix); this.anchorMatrixInverse.copy(scene.anchorMatrix).invert(); this.disableShadowSampler = scene.disableShadowSampler; this.logarithmicDepthBuffer = scene.logarithmicDepthBuffer; this.fog = scene.fog; this.environment = scene.environment; this.envDiffuseIntensity = scene.envDiffuseIntensity; this.envSpecularIntensity = scene.envSpecularIntensity; if (this.clippingPlanesData.length < scene.clippingPlanes.length * 4) { this.clippingPlanesData = new Float32Array(scene.clippingPlanes.length * 4); } this.setClippingPlanesData(scene.clippingPlanes, this.clippingPlanesData); this.numClippingPlanes = scene.clippingPlanes.length; this.version++; } setClippingPlanesData(clippingPlanes, clippingPlanesData) { for (let i = 0; i < clippingPlanes.length; i++) { _plane_1.copy(clippingPlanes[i]); if (this.useAnchorMatrix) { _plane_1.applyMatrix4(this.anchorMatrixInverse); } clippingPlanesData[i * 4 + 0] = _plane_1.normal.x; clippingPlanesData[i * 4 + 1] = _plane_1.normal.y; clippingPlanesData[i * 4 + 2] = _plane_1.normal.z; clippingPlanesData[i * 4 + 3] = _plane_1.constant; } return clippingPlanesData; } } /** * Abstract base class for lights * - The light's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed light points down the -Z axis. * - all other light types inherit the properties and methods described here. * @abstract * @extends Object3D */ class Light extends Object3D { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color = 0xffffff, intensity = 1) { super(); /** * Color of the light. * @type {Color3} * @default Color3(0xffffff) */ this.color = new Color3(color); /** * The light's intensity, or strength. * @type {number} * @default 1 */ this.intensity = intensity; /** * Group mask of the light, indicating which lighting group the light belongs to. Default is 1 (binary 0001), meaning the light belongs to lighting group 0. * For example, to make the light effective in both lighting group 0 and lighting group 1, set groupMask to 3 (binary 0011). * Used in conjunction with {@link Material#lightingGroup}. * @type {number} * @default 1 */ this.groupMask = 1; } /** * Set light direction, this func will set quaternion of this light. * @param {Vector3} target - The target that the light look at. * @param {Vector3} up - The up direction of the light. */ lookAt(target, up) { _mat4_1$1.lookAtRH(this.position, target, up); this.quaternion.setFromRotationMatrix(_mat4_1$1); } /** * Copies properties from the source light into this one. * @param {Light} source - The source light. * @returns {Light} - This light. */ copy(source) { super.copy(source); this.color.copy(source.color); this.intensity = source.intensity; this.groupMask = source.groupMask; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Light.prototype.isLight = true; const _mat4_1$1 = new Matrix4(); /** * RectAreaLight emits light uniformly across the face a rectangular plane. * This light can be used to simulate light sources such as bright windows or strip lighting. * Important Notes: * - There is no shadow support. * - Only PBRMaterial are supported. * - You have to set LTC1 and LTC2 in RectAreaLight before using it. * @extends Light */ class RectAreaLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [width=10] * @param {number} [height=10] */ constructor(color, intensity, width = 10, height = 10) { super(color, intensity); /** * The width of the light. * @type {number} * @default 10 */ this.width = width; /** * The height of the light. * @type {number} * @default 10 */ this.height = height; } /** * The light's power. * Power is the luminous power of the light measured in lumens (lm). * Changing the power will also change the light's intensity. * @type {number} */ get power() { // compute the light's luminous power (in lumens) from its intensity (in nits) return this.intensity * this.width * this.height * Math.PI; } set power(power) { // set the light's intensity (in nits) from the desired luminous power (in lumens) this.intensity = power / (this.width * this.height * Math.PI); } copy(source) { super.copy(source); this.width = source.width; this.height = source.height; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RectAreaLight.prototype.isRectAreaLight = true; /** * The first LTC (Linearly Transformed Cosines). * If you want to use RectAreaLight, you have to set this before using it. * @type {null | Texture2D} */ RectAreaLight.LTC1 = null; /** * The second LTC (Linearly Transformed Cosines). * If you want to use RectAreaLight, you have to set this before using it. * @type {null | Texture2D} */ RectAreaLight.LTC2 = null; class LightingGroup extends EventDispatcher { constructor() { super(); this.id = _lightingGroupId++; // Light collection array this.lights = []; // Data caches this.ambient = new Float32Array([0, 0, 0]); this.sh = new Float32Array(27); this.hemisphere = []; this.directional = []; this.directionalShadow = []; this.directionalShadowMap = []; this.directionalShadowDepthMap = []; this.directionalShadowMatrix = new Float32Array(0); this.point = []; this.pointShadow = []; this.pointShadowMap = []; this.pointShadowMatrix = new Float32Array(0); this.spot = []; this.spotShadow = []; this.spotShadowMap = []; this.spotShadowDepthMap = []; this.spotShadowMatrix = new Float32Array(0); this.rectArea = []; this.LTC1 = null; this.LTC2 = null; // Status this.useAmbient = false; this.useSphericalHarmonics = false; this.hemisNum = 0; this.directsNum = 0; this.pointsNum = 0; this.spotsNum = 0; this.rectAreaNum = 0; this.directShadowNum = 0; this.pointShadowNum = 0; this.spotShadowNum = 0; this.totalNum = 0; this.shadowsNum = 0; // Version this.version = 0; } begin() { this.totalNum = 0; this.shadowsNum = 0; } push(light, shadow) { this.lights[this.totalNum++] = light; if (shadow) { this.shadowsNum++; } } end(sceneData) { this.lights.length = this.totalNum; this._setupCache(sceneData); this.version++; } dispose() { this.dispatchEvent({ type: 'dispose' }); } _setupCache(sceneData) { for (let i = 0; i < 3; i++) { this.ambient[i] = 0; } for (let i = 0; i < this.sh.length; i++) { this.sh[i] = 0; } this.useAmbient = false; this.useSphericalHarmonics = false; this.hemisNum = 0; this.directsNum = 0; this.pointsNum = 0; this.spotsNum = 0; this.rectAreaNum = 0; this.directShadowNum = 0; this.pointShadowNum = 0; this.spotShadowNum = 0; this.LTC1 = null; this.LTC2 = null; // Setup Uniforms for (let i = 0, l = this.lights.length; i < l; i++) { const light = this.lights[i]; if (light.isAmbientLight) { this._doAddAmbientLight(light); } else if (light.isHemisphereLight) { this._doAddHemisphereLight(light, sceneData); } else if (light.isDirectionalLight) { this._doAddDirectLight(light, sceneData); } else if (light.isPointLight) { this._doAddPointLight(light, sceneData); } else if (light.isSpotLight) { this._doAddSpotLight(light, sceneData); } else if (light.isSphericalHarmonicsLight) { this._doAddSphericalHarmonicsLight(light); } else if (light.isRectAreaLight) { this._doAddRectAreaLight(light, sceneData); } } const directShadowNum = this.directShadowNum; if (directShadowNum > 0) { this.directionalShadowMap.length = directShadowNum; this.directionalShadowDepthMap.length = directShadowNum; tempDirectionalShadowMatrices.length = directShadowNum; if (this.directionalShadowMatrix.length !== directShadowNum * 16) { this.directionalShadowMatrix = new Float32Array(directShadowNum * 16); } for (let i = 0; i < directShadowNum; i++) { tempDirectionalShadowMatrices[i].toArray(this.directionalShadowMatrix, i * 16); } } const pointShadowNum = this.pointShadowNum; if (pointShadowNum > 0) { this.pointShadowMap.length = pointShadowNum; tempPointShadowMatrices.length = pointShadowNum; if (this.pointShadowMatrix.length !== pointShadowNum * 16) { this.pointShadowMatrix = new Float32Array(pointShadowNum * 16); } for (let i = 0; i < pointShadowNum; i++) { tempPointShadowMatrices[i].toArray(this.pointShadowMatrix, i * 16); } } const spotShadowNum = this.spotShadowNum; if (spotShadowNum > 0) { this.spotShadowMap.length = spotShadowNum; this.spotShadowDepthMap.length = spotShadowNum; tempSpotShadowMatrices.length = spotShadowNum; if (this.spotShadowMatrix.length !== spotShadowNum * 16) { this.spotShadowMatrix = new Float32Array(spotShadowNum * 16); } for (let i = 0; i < spotShadowNum; i++) { tempSpotShadowMatrices[i].toArray(this.spotShadowMatrix, i * 16); } } if (this.rectAreaNum > 0) { this.LTC1 = RectAreaLight.LTC1; this.LTC2 = RectAreaLight.LTC2; } } _doAddAmbientLight(object) { const intensity = object.intensity; const color = object.color; this.ambient[0] += color.r * intensity; this.ambient[1] += color.g * intensity; this.ambient[2] += color.b * intensity; this.useAmbient = true; } _doAddSphericalHarmonicsLight(object) { const intensity = object.intensity; const sh = object.sh.coefficients; for (let i = 0; i < sh.length; i += 1) { this.sh[i * 3] += sh[i].x * intensity; this.sh[i * 3 + 1] += sh[i].y * intensity; this.sh[i * 3 + 2] += sh[i].z * intensity; } this.useSphericalHarmonics = true; } _doAddHemisphereLight(object, sceneData) { const intensity = object.intensity; const skyColor = object.color; const groundColor = object.groundColor; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.skyColor[0] = skyColor.r * intensity; cache.skyColor[1] = skyColor.g * intensity; cache.skyColor[2] = skyColor.b * intensity; cache.groundColor[0] = groundColor.r * intensity; cache.groundColor[1] = groundColor.g * intensity; cache.groundColor[2] = groundColor.b * intensity; const e = object.worldMatrix.elements; const direction = helpVector3.set(e[4], e[5], e[6]).normalize(); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.toArray(cache.direction); this.hemisphere[this.hemisNum++] = cache; } _doAddDirectLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; const direction = object.getWorldDirection(helpVector3); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.multiplyScalar(-1).toArray(cache.direction); if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = shadow.frustumEdgeFalloff; this.directionalShadow[this.directShadowNum++] = shadowCache; shadow.update(object); shadow.updateMatrix(); if (useAnchorMatrix) { shadow.matrix.multiply(sceneData.anchorMatrix); } this.directionalShadowMap[this.directsNum] = shadow.map; this.directionalShadowDepthMap[this.directsNum] = shadow.depthMap; tempDirectionalShadowMatrices[this.directsNum] = shadow.matrix; } this.directional[this.directsNum++] = cache; } _doAddPointLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const distance = object.distance; const decay = object.decay; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; cache.distance = distance; cache.decay = decay; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = 0; shadowCache.shadowCameraRange[0] = shadow.cameraNear; shadowCache.shadowCameraRange[1] = shadow.cameraFar; this.pointShadow[this.pointShadowNum++] = shadowCache; shadow.update(object, 0); shadow.matrix.makeTranslation(-position.x, -position.y, -position.z); // for point light this.pointShadowMap[this.pointsNum] = shadow.map; tempPointShadowMatrices[this.pointsNum] = shadow.matrix; } this.point[this.pointsNum++] = cache; } _doAddSpotLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const distance = object.distance; const decay = object.decay; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; cache.distance = distance; cache.decay = decay; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; const direction = object.getWorldDirection(helpVector3); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.multiplyScalar(-1).toArray(cache.direction); const coneCos = Math.cos(object.angle); const penumbraCos = Math.cos(object.angle * (1 - object.penumbra)); cache.coneCos = coneCos; cache.penumbraCos = penumbraCos; if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = shadow.frustumEdgeFalloff; this.spotShadow[this.spotShadowNum++] = shadowCache; shadow.update(object); shadow.updateMatrix(); if (useAnchorMatrix) { shadow.matrix.multiply(sceneData.anchorMatrix); } this.spotShadowMap[this.spotsNum] = shadow.map; this.spotShadowDepthMap[this.spotsNum] = shadow.depthMap; tempSpotShadowMatrices[this.spotsNum] = shadow.matrix; } this.spot[this.spotsNum++] = cache; } _doAddRectAreaLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const halfHeight = object.height; const halfWidth = object.width; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; // extract rotation of light to derive width/height half vectors helpMatrix4$1.copy(object.worldMatrix); if (useAnchorMatrix) { helpMatrix4$1.premultiply(sceneData.anchorMatrixInverse); } helpMatrix4$1.extractRotation(helpMatrix4$1); const halfWidthPos = helpVector3.set(halfWidth * 0.5, 0.0, 0.0); halfWidthPos.applyMatrix4(helpMatrix4$1); cache.halfWidth[0] = halfWidthPos.x; cache.halfWidth[1] = halfWidthPos.y; cache.halfWidth[2] = halfWidthPos.z; const halfHeightPos = helpVector3.set(0.0, halfHeight * 0.5, 0.0); halfHeightPos.applyMatrix4(helpMatrix4$1); cache.halfHeight[0] = halfHeightPos.x; cache.halfHeight[1] = halfHeightPos.y; cache.halfHeight[2] = halfHeightPos.z; this.rectArea[this.rectAreaNum++] = cache; } } // Variables let _lightingGroupId = 0; const helpVector3 = new Vector3(); const helpMatrix4$1 = new Matrix4(); const tempDirectionalShadowMatrices = []; const tempPointShadowMatrices = []; const tempSpotShadowMatrices = []; // Light caches const lightCaches = new WeakMap(); function getLightCache(light) { if (lightCaches.has(light)) { return lightCaches.get(light); } let cache; if (light.isHemisphereLight) { cache = { direction: new Float32Array(3), skyColor: new Float32Array([0, 0, 0]), groundColor: new Float32Array([0, 0, 0]) }; } else if (light.isDirectionalLight) { cache = { direction: new Float32Array(3), color: new Float32Array([0, 0, 0]) }; } else if (light.isPointLight) { cache = { position: new Float32Array(3), color: new Float32Array([0, 0, 0]), distance: 0, decay: 0 }; } else if (light.isSpotLight) { cache = { position: new Float32Array(3), direction: new Float32Array(3), color: new Float32Array([0, 0, 0]), distance: 0, coneCos: 0, penumbraCos: 0, decay: 0 }; } else if (light.isRectAreaLight) { cache = { position: new Float32Array(3), color: new Float32Array([0, 0, 0]), halfWidth: new Float32Array(3), halfHeight: new Float32Array(3) }; } lightCaches.set(light, cache); return cache; } // Shadow caches const shadowCaches = new WeakMap(); function getShadowCache(light) { if (shadowCaches.has(light)) { return shadowCaches.get(light); } let cache; if (light.isDirectionalLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff] }; } else if (light.isPointLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2), // [radius, 0] shadowCameraRange: new Float32Array(2) // [cameraNear, cameraFar] }; } else if (light.isSpotLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff] }; } shadowCaches.set(light, cache); return cache; } class LightingData { constructor() { this.lightsArray = []; this.shadowsNum = 0; this.groupList = []; this.groupList.push(new LightingGroup()); // create default group 0 this._locked = true; } getGroup(id) { return this.groupList[id]; } setMaxGroupCount(max) { max = Math.max(1, max); // at least one group const groupList = this.groupList; const oldMax = groupList.length; if (max < oldMax) { for (let i = max; i < oldMax; i++) { groupList[i].dispose(); } groupList.length = max; } else if (max > oldMax) { for (let i = oldMax; i < max; i++) { groupList.push(new LightingGroup()); } } } begin() { if (!this._locked) { console.warn('LightingData: begin() called without end().'); } this.lightsArray.length = 0; this.shadowsNum = 0; this._locked = false; } collect(light) { if (this._locked) return; this.lightsArray.push(light); if (castShadow(light)) { this.shadowsNum++; } } end(sceneData) { const lightsArray = this.lightsArray; const shadowsNum = this.shadowsNum; const groupList = this.groupList; lightsArray.sort(shadowCastingLightsFirst); let i, l; for (i = 0, l = groupList.length; i < l; i++) { groupList[i].begin(); } for (i = 0, l = lightsArray.length; i < l; i++) { this._distribute(lightsArray[i], i < shadowsNum); } for (i = 0, l = groupList.length; i < l; i++) { groupList[i].end(sceneData); } this._locked = true; } _distribute(light, shadow) { const groupMask = light.groupMask; const groupList = this.groupList; // optimize for single group if (groupList.length === 1 && (groupMask & 1)) { groupList[0].push(light, shadow); return; } for (let i = 0, l = groupList.length; i < l; i++) { const mask = 1 << i; if (groupMask < mask) break; if (groupMask & mask) { groupList[i].push(light, shadow); } } } } function shadowCastingLightsFirst(lightA, lightB) { const a = castShadow(lightA) ? 1 : 0; const b = castShadow(lightB) ? 1 : 0; return b - a; } function castShadow(light) { return light.shadow && light.castShadow; } function _isPerspectiveMatrix$1(m) { return m.elements[11] === -1; } let _cameraDataId = 0; /** * RenderStates collect all render states about scene and camera. */ class RenderStates { constructor(sceneData, lightingData) { this.scene = sceneData; this.lighting = lightingData; this.camera = { id: _cameraDataId++, version: 0, near: 0, far: 0, position: new Vector3(), logDepthCameraNear: 0, logDepthBufFC: 0, viewMatrix: new Matrix4(), projectionMatrix: new Matrix4(), projectionViewMatrix: new Matrix4(), rect: new Vector4(0, 0, 1, 1) }; this.gammaFactor = 2.0; this.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR; } /** * Update render states about camera. * @param {Camera} camera */ updateCamera(camera) { const sceneData = this.scene; const cameraData = this.camera; const projectionMatrix = camera.projectionMatrix; let cameraNear = 0, cameraFar = 0; if (_isPerspectiveMatrix$1(projectionMatrix)) { cameraNear = projectionMatrix.elements[14] / (projectionMatrix.elements[10] - 1); cameraFar = projectionMatrix.elements[14] / (projectionMatrix.elements[10] + 1); } else { cameraNear = (projectionMatrix.elements[14] + 1) / projectionMatrix.elements[10]; cameraFar = (projectionMatrix.elements[14] - 1) / projectionMatrix.elements[10]; } cameraData.near = cameraNear; cameraData.far = cameraFar; if (sceneData.logarithmicDepthBuffer) { cameraData.logDepthCameraNear = cameraNear; cameraData.logDepthBufFC = 2.0 / (Math.log(cameraFar - cameraNear + 1.0) * Math.LOG2E); } else { cameraData.logDepthCameraNear = 0; cameraData.logDepthBufFC = 0; } cameraData.position.setFromMatrixPosition(camera.worldMatrix); if (sceneData.useAnchorMatrix) { cameraData.position.applyMatrix4(sceneData.anchorMatrixInverse); } cameraData.viewMatrix.copy(camera.viewMatrix); if (sceneData.useAnchorMatrix) { cameraData.viewMatrix.multiply(sceneData.anchorMatrix); } cameraData.projectionMatrix.copy(projectionMatrix); cameraData.projectionViewMatrix.copy(projectionMatrix).multiply(cameraData.viewMatrix); cameraData.rect.copy(camera.rect); cameraData.version++; this.gammaFactor = camera.gammaFactor; this.outputEncoding = camera.outputEncoding; } } /** * RenderQueueLayer holds all the renderable objects. * Now has an opaque list and a transparent list. */ class RenderQueueLayer { /** * @param {number} id - layer id. */ constructor(id) { this.id = id; this.opaque = []; this.opaqueCount = 0; this.transparent = []; this.transparentCount = 0; this._cache = []; this._cacheIndex = 0; this._lastCacheIndex = 0; this.opaqueSortCompareFn = defaultOpaqueSortCompare; this.transparentSortCompareFn = defaultTransparentSortCompare; } begin() { this._cacheIndex = 0; this.opaqueCount = 0; this.transparentCount = 0; } end() { this.opaque.length = this.opaqueCount; this.transparent.length = this.transparentCount; // Clear references from inactive renderables in the list const cacheIndex = this._cacheIndex, lastCacheIndex = this._lastCacheIndex; if (lastCacheIndex > cacheIndex) { const cache = this._cache; for (let i = cacheIndex; i < lastCacheIndex; i++) { const renderable = cache[i]; renderable.object = null; renderable.geometry = null; renderable.material = null; renderable.group = null; } } this._lastCacheIndex = cacheIndex; } addRenderable(object, geometry, material, z, group) { const cache = this._cache; let renderable = cache[this._cacheIndex]; if (renderable === undefined) { renderable = { object: object, geometry: geometry, material: material, z: z, renderOrder: object.renderOrder, group: group }; cache[this._cacheIndex] = renderable; } else { renderable.object = object; renderable.geometry = geometry; renderable.material = material; renderable.z = z; renderable.renderOrder = object.renderOrder; renderable.group = group; } if (material.transparent) { this.transparent[this.transparentCount] = renderable; this.transparentCount++; } else { this.opaque[this.opaqueCount] = renderable; this.opaqueCount++; } this._cacheIndex++; } sort() { this.opaque.sort(this.opaqueSortCompareFn); quickSort(this.transparent, 0, this.transparent.length, this.transparentSortCompareFn); } } function defaultOpaqueSortCompare(a, b) { if (a.renderOrder !== b.renderOrder) { return a.renderOrder - b.renderOrder; } else if (a.material.id !== b.material.id) { return a.material.id - b.material.id; } else { return a.id - b.id; } } function defaultTransparentSortCompare(a, b) { if (a.renderOrder !== b.renderOrder) { return a.renderOrder - b.renderOrder; } else if (a.z !== b.z) { return b.z - a.z; } else if (a.material.id !== b.material.id) { // fix Unstable sort below chrome version 7.0 // if render same object with different materials return a.material.id - b.material.id; } else { return a.id - b.id; } } // Reference github.com/ant-galaxy/oasis-engine/blob/main/packages/core/src/RenderPipeline/RenderQueue.ts // quickSort is faster when sorting highly randomized arrays, // but for sorting lowly randomized arrays, Array.prototype.sort is faster, // so quickSort is more suitable for transparent list sorting. function quickSort(a, from, to, compareFunc) { while (true) { // Insertion sort is faster for short arrays. if (to - from <= 10) { insertionSort(a, from, to, compareFunc); return; } const third_index = (from + to) >> 1; // Find a pivot as the median of first, last and middle element. let v0 = a[from]; let v1 = a[to - 1]; let v2 = a[third_index]; const c01 = compareFunc(v0, v1); if (c01 > 0) { const tmp = v0; v0 = v1; v1 = tmp; } const c02 = compareFunc(v0, v2); if (c02 >= 0) { const tmp = v0; v0 = v2; v2 = v1; v1 = tmp; } else { const c12 = compareFunc(v1, v2); if (c12 > 0) { const tmp = v1; v1 = v2; v2 = tmp; } } a[from] = v0; a[to - 1] = v2; const pivot = v1; let low_end = from + 1; // Upper bound of elements lower than pivot. let high_start = to - 1; // Lower bound of elements greater than pivot. a[third_index] = a[low_end]; a[low_end] = pivot; // From low_end to i are elements equal to pivot. // From i to high_start are elements that haven't been compared yet. partition: for (let i = low_end + 1; i < high_start; i++) { let element = a[i]; let order = compareFunc(element, pivot); if (order < 0) { a[i] = a[low_end]; a[low_end] = element; low_end++; } else if (order > 0) { do { high_start--; if (high_start == i) break partition; const top_elem = a[high_start]; order = compareFunc(top_elem, pivot); } while (order > 0); a[i] = a[high_start]; a[high_start] = element; if (order < 0) { element = a[i]; a[i] = a[low_end]; a[low_end] = element; low_end++; } } } if (to - high_start < low_end - from) { quickSort(a, high_start, to, compareFunc); to = low_end; } else { quickSort(a, from, low_end, compareFunc); from = high_start; } } } function insertionSort(a, from, to, compareFunc) { for (let i = from + 1; i < to; i++) { let j; const element = a[i]; for (j = i - 1; j >= from; j--) { const tmp = a[j]; const order = compareFunc(tmp, element); if (order > 0) { a[j + 1] = tmp; } else { break; } } a[j + 1] = element; } } /** * RenderQueue is used to collect all renderable items, lights and skeletons from the scene. * Renderable items will be dispatched to the corresponding RenderQueueLayer according to the object's renderLayer property. */ class RenderQueue { constructor() { this.layerMap = new Map(); this.layerList = []; this.skeletons = new Set(); // to optimize the performance of the next push, cache the last layer used this._lastLayer = this.createLayer(0); } begin() { for (let i = 0, l = this.layerList.length; i < l; i++) { this.layerList[i].begin(); } this.skeletons.clear(); } end() { for (let i = 0, l = this.layerList.length; i < l; i++) { this.layerList[i].end(); this.layerList[i].sort(); } } push(object, camera) { // collect skeleton if exists if (object.skeleton) { this.skeletons.add(object.skeleton); } _vec4.setFromMatrixPosition(object.worldMatrix) .applyMatrix4(camera.projectionViewMatrix); const clipZ = _vec4.z; const layerId = object.renderLayer || 0; let layer = this._lastLayer; if (layer.id !== layerId) { layer = this.layerMap.get(layerId); if (!layer) { layer = this.createLayer(layerId); } this._lastLayer = layer; } if (Array.isArray(object.material)) { const groups = object.geometry.groups; for (let i = 0; i < groups.length; i++) { const group = groups[i]; const groupMaterial = object.material[group.materialIndex]; if (groupMaterial) { layer.addRenderable(object, object.geometry, groupMaterial, clipZ, group); } } } else { layer.addRenderable(object, object.geometry, object.material, clipZ); } } /** * Set a render queue layer. * @param {number} id - The layer id. * @param {RenderQueueLayer} layer - The layer to set. */ setLayer(id, layer) { this.layerMap.set(id, layer); this.layerList.push(layer); this.layerList.sort(sortLayer); } /** * Create and set a render queue layer. * @param {number} id - The layer id. * @returns {RenderQueueLayer} */ createLayer(id) { const layer = new RenderQueueLayer(id); this.setLayer(id, layer); return layer; } /** * Get the render queue layer. * @param {number} id - The layer id. * @returns {RenderQueueLayer} */ getLayer(id) { return this.layerMap.get(id); } /** * Remove the render queue layer. * @param {number} id - The layer id. */ removeLayer(id) { const layer = this.layerMap.get(id); if (layer) { this.layerMap.delete(id); const index = this.layerList.indexOf(layer); if (index !== -1) { this.layerList.splice(index, 1); } if (this._lastLayer === id) { this._lastLayer = null; } } } } const _vec4 = new Vector4(); function sortLayer(a, b) { return a.id - b.id; } /** * RenderCollector traverses the scene graph and collects all necessary rendering information. * It manages scene data, lighting data, and per-camera render states/queues. */ class RenderCollector { /** * Creates a new RenderCollector instance. * In most cases, RenderCollector does not need to be created manually, * as Scene will automatically create one. See {@link Scene#collector}. */ constructor() { // collects scene and lighting data for single scene this.sceneData = new SceneData(); this.lightingData = new LightingData(); // collects render states and render queues for each camera this._renderStatesMap = new WeakMap(); this._renderQueueMap = new WeakMap(); // internal states this._lightingNeedsUpdate = true; this._skeletonVersion = 1; const _boundingSphere = new Sphere(); /** * Visibility checking function called during scene traversal. * Determines whether an object should be included in the render queue. * Can be overridden to implement custom culling logic (LOD, distance, etc.). * @param {Object3D} object - The object to test for visibility. * @param {Camera} camera - The camera to test against. * @returns {boolean} True if the object should be rendered, false to cull it. * @type {Function} * @example * // Custom visibility check that always returns true * collector.checkVisibility = function(object, camera) { * return true; * }; */ this.checkVisibility = function(object, camera) { if (!object.renderable) { return false; } if (!object.frustumCulled || !camera.frustumCulled) { return true; } _boundingSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix); return camera.frustum.intersectsSphere(_boundingSphere); }; } /** * Setting this property to `true` indicates the lighting data needs to be updated. * Lighting data updates are triggered by the {@link RenderCollector#traverseAndCollect} method. * @type {boolean} * @default false * @param {boolean} value */ set lightingNeedsUpdate(value) { if (value) { this._lightingNeedsUpdate = true; } } /** * Setting this property to `true` indicates all skeletons in the scene should be updated. * Skeleton updates are triggered by the {@link RenderCollector#traverseAndCollect} method. * @type {boolean} * @default false * @param {boolean} value */ set skeletonNeedsUpdate(value) { if (value) { this._skeletonVersion++; } } /** * Get the RenderStates for the scene and camera. * If the RenderStates for the camera does not exist, it will be created. * @param {Camera} camera - The render camera. * @returns {RenderStates} The target render states. */ getRenderStates(camera) { let renderStates = this._renderStatesMap.get(camera); if (!renderStates) { // every camera has its own RenderStates // but they share the same scene and lighting data renderStates = new RenderStates(this.sceneData, this.lightingData); this._renderStatesMap.set(camera, renderStates); } return renderStates; } /** * Get the RenderQueue for the scene and camera. * If the RenderQueue for the camera does not exist, it will be created. * @param {Camera} camera - The render camera. * @returns {RenderQueue} The target render queue. */ getRenderQueue(camera) { let renderQueue = this._renderQueueMap.get(camera); if (!renderQueue) { renderQueue = new RenderQueue(); this._renderQueueMap.set(camera, renderQueue); } return renderQueue; } /** * Traverse the scene and collect all renderable objects, lights and skeletons. * This method will update the RenderQueue and RenderStates for the camera. * @param {Scene} scene - The scene to traverse. * @param {Camera} camera - The camera to collect renderable objects for. * @returns {RenderQueue} The collected render queue. */ traverseAndCollect(scene, camera) { const sceneData = this.sceneData; const lightingData = this.lightingData; const lightingNeedsUpdate = this._lightingNeedsUpdate; const renderQueue = this.getRenderQueue(camera); if (lightingNeedsUpdate) { lightingData.begin(); } renderQueue.begin(); this._traverseAndCollect(scene, camera, renderQueue); renderQueue.end(); if (lightingNeedsUpdate) { lightingData.end(sceneData); this._lightingNeedsUpdate = false; } // Since skeletons may be referenced by different mesh, // it is necessary to collect skeletons in the scene in order to avoid repeated updates. // For IOS platform, we should try to avoid repeated texture updates within one frame, // otherwise the performance will be seriously degraded. const skeletonVersion = this._skeletonVersion; for (const skeleton of _skeletons) { // Skeleton version ensures uncollected skeletons will be updated in subsequent frames if (skeleton._version !== skeletonVersion) { skeleton.updateBones(sceneData); skeleton._version = skeletonVersion; } } _skeletons.clear(); return renderQueue; } _traverseAndCollect(object, camera, renderQueue) { if (!object.visible) { return; } if (object.isMesh) { if (this.checkVisibility(object, camera)) { renderQueue.push(object, camera); if (object.skeleton) { _skeletons.add(object.skeleton); } } } else if (object.isLight) { this.lightingData.collect(object); } const children = object.children; for (let i = 0, l = children.length; i < l; i++) { this._traverseAndCollect(children[i], camera, renderQueue); } } } const _skeletons = new Set(); /** * Scenes allow you to set up what and where is to be rendered, * this is where you place objects, lights and cameras. * @extends Object3D */ class Scene extends Object3D { /** * Create a scene. */ constructor() { super(); /** * A {@link Fog} instance defining the type of fog that affects everything rendered in the scene. * @type {Fog} * @default null */ this.fog = null; /** * Sets the environment map for all materials in the scene. * However, it's not possible to overwrite an existing texture assigned to Material.envMap. * @type {TextureCube | null} * @default null */ this.environment = null; /** * The diffuse intensity of the environment map. * @type {number} * @default 1 */ this.envDiffuseIntensity = 1; /** * The specular intensity of the environment map. * This value is multiplied with the envMapIntensity of the material to get the final intensity. * @type {number} * @default 1 */ this.envSpecularIntensity = 1; /** * User-defined clipping planes specified as {@link Plane} objects in world space. * These planes apply to the scene. * Points in space whose dot product with the plane is negative are cut away. * @type {Plane[]} * @default [] */ this.clippingPlanes = []; /** * Defines whether disable shadow sampler feature. * Shader with sampler2DShadow uniforms may cause unknown error on some android phones, set disableShadowSampler to true to avoid these bugs. * When this property is set to true, soft shadow types will fallback to POISSON_SOFT without warning. * @type {boolean} * @default false */ this.disableShadowSampler = false; /** * whether to use a logarithmic depth buffer. It may be neccesary to use this if dealing with huge differences in scale in a single scene. * Note that this setting uses gl_FragDepth if available which disables the Early Fragment Test optimization and can cause a decrease in performance. * @type {boolean} * @default false */ this.logarithmicDepthBuffer = false; /** * The anchor matrix of the world coordinate system. * If it is not an identity matrix, the actual lighting calculating and the world position in the shader, will be in the anchor coordinate system. * By setting this property, you can solve the floating point precision problem caused by the rendering object far away from the origin of the world coordinate system. * In addition, by setting the rotation, it can also repair the direction of the reflection. * @type {Matrix4} */ this.anchorMatrix = new Matrix4(); /** * A {@link RenderCollector} instance for this scene. * @type {RenderCollector} */ this.collector = new RenderCollector(); } /** * The maximum number of lighting groups. * @type {number} * @default 1 */ set maxLightingGroups(value) { this.collector.lightingData.setMaxGroupCount(value); } get maxLightingGroups() { return this.collector.lightingData.groupList.length; } /** * Get {@link RenderStates} for the scene and camera. * The RenderStates will be updated by calling {@link Scene#updateRenderStates}. * The light data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @returns {RenderQueue} - The target render queue. */ getRenderStates(camera) { return this.collector.getRenderStates(camera); } /** * Get {@link RenderQueue} for the scene and camera. * The RenderQueue will be updated by calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @returns {RenderQueue} - The target render queue. */ getRenderQueue(camera) { return this.collector.getRenderQueue(camera); } /** * Update {@link RenderStates} for the scene and camera. * The lighting data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @param {boolean} [updateScene=true] - Whether to update scene data. * @returns {RenderStates} - The result render states. */ updateRenderStates(camera, updateScene = true) { const collector = this.collector; if (updateScene) { collector.sceneData.update(this); } const renderStates = collector.getRenderStates(camera); renderStates.updateCamera(camera); return renderStates; } /** * Update {@link RenderQueue} for the scene and camera. * Collect all visible meshes (and lights) from scene graph, and push meshes to render queue. * Light data will be stored in RenderStates. * @param {Camera} camera - The camera. * @param {boolean} [collectLights=true] - Whether to collect light data. * @param {boolean} [updateSkeletons=true] - Whether to update skeletons. * @returns {RenderQueue} - The result render queue. */ updateRenderQueue(camera, collectLights = true, updateSkeletons = true) { const collector = this.collector; collector.lightingNeedsUpdate = collectLights; collector.skeletonNeedsUpdate = updateSkeletons; return collector.traverseAndCollect(this, camera); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Scene.prototype.isScene = true; /** * Base camera projection class. All projection types should inherit from this. * Should not be instantiated directly; subclasses must implement matrix calculation. * @abstract */ class CameraProjection { /** * Creates a CameraProjection instance. */ constructor() { this._matrix = new Matrix4(); this._dirty = true; } /** * Get the current projection matrix. * @returns {Matrix4} The projection matrix. */ get matrix() { if (this._dirty) { this._updateMatrix(); } return this._matrix; } /** * Copy parameters from another CameraProjection. Should be implemented by subclasses. * @param {CameraProjection} source The source projection object. * @returns {CameraProjection} this */ copy(source) { console.warn('CameraProjection: copy() must be implemented in subclass.'); return this; } /** * Clone this projection object. * @returns {CameraProjection} A new projection object. */ clone() { return new this.constructor().copy(this); } /** * Update the projection matrix. Should be implemented by subclasses. * @protected */ _updateMatrix() { console.warn('CameraProjection: _updateMatrix() must be implemented in subclass.'); this._dirty = false; } } /** * Perspective projection camera class. * Generates a perspective projection matrix based on field of view, aspect ratio, near and far planes. * Field of view is specified in degrees. */ class PerspectiveProjection extends CameraProjection { /** * Creates a PerspectiveProjection instance. * @param {number} [fov=50] Vertical field of view in degrees. * @param {number} [aspect=1] Aspect ratio (width / height). * @param {number} [near=0.1] Near clipping plane. * @param {number} [far=2000] Far clipping plane. */ constructor(fov = 50, aspect = 1, near = 0.1, far = 2000) { super(); this._fov = fov; this._aspect = aspect; this._near = near; this._far = far; } /** * The vertical field of view in degrees. * @type {number} * @default 50 */ set fov(value) { this._fov = value; this._dirty = true; } get fov() { return this._fov; } /** * The aspect ratio (width / height). * @type {number} * @default 1 */ set aspect(value) { this._aspect = value; this._dirty = true; } get aspect() { return this._aspect; } /** * The near clipping plane. * @type {number} * @default 0.1 */ set near(value) { this._near = value; this._dirty = true; } get near() { return this._near; } /** * The far clipping plane. * @type {number} * @default 2000 */ set far(value) { this._far = value; this._dirty = true; } get far() { return this._far; } /** * Sets all perspective parameters at once. * @param {number} fov Vertical field of view in degrees. * @param {number} aspect Aspect ratio (width / height). * @param {number} near Near clipping plane. * @param {number} far Far clipping plane. * @returns {PerspectiveProjection} this */ set(fov, aspect, near, far) { this._fov = fov; this._aspect = aspect; this._near = near; this._far = far; this._dirty = true; return this; } /** * Copies the parameters from another PerspectiveProjection. * @param {PerspectiveProjection} source * @returns {PerspectiveProjection} this */ copy(source) { this._fov = source._fov; this._aspect = source._aspect; this._near = source._near; this._far = source._far; this._dirty = true; return this; } /** * Updates the perspective projection matrix. * @protected */ _updateMatrix() { const fov = this._fov * Math.PI / 180, aspect = this._aspect, near = this._near, far = this._far; const f = 1 / Math.tan(fov / 2); this._matrix.set( f / aspect, 0, 0, 0, 0, f, 0, 0, 0, 0, (far + near) / (near - far), (2 * far * near) / (near - far), 0, 0, -1, 0 ); this._dirty = false; } } /** * Orthographic projection camera class. * Generates an orthographic projection matrix based on left, right, top, bottom, near, and far planes. */ class OrthographicProjection extends CameraProjection { /** * Creates an OrthographicProjection instance. * @param {number} [left=-1] Left plane of the orthographic box. * @param {number} [right=1] Right plane of the orthographic box. * @param {number} [top=1] Top plane of the orthographic box. * @param {number} [bottom=-1] Bottom plane of the orthographic box. * @param {number} [near=0.1] Near clipping plane. * @param {number} [far=2000] Far clipping plane. */ constructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000) { super(); this._left = left; this._right = right; this._top = top; this._bottom = bottom; this._near = near; this._far = far; } /** * The left plane of the orthographic box. * @type {number} * @default -1 */ set left(value) { this._left = value; this._dirty = true; } get left() { return this._left; } /** * The right plane of the orthographic box. * @type {number} * @default 1 */ set right(value) { this._right = value; this._dirty = true; } get right() { return this._right; } /** * The top plane of the orthographic box. * @type {number} * @default 1 */ set top(value) { this._top = value; this._dirty = true; } get top() { return this._top; } /** * The bottom plane of the orthographic box. * @type {number} * @default -1 */ set bottom(value) { this._bottom = value; this._dirty = true; } get bottom() { return this._bottom; } /** * The near clipping plane. * @type {number} * @default 0.1 */ set near(value) { this._near = value; this._dirty = true; } get near() { return this._near; } /** * The far clipping plane. * @type {number} * @default 2000 */ set far(value) { this._far = value; this._dirty = true; } get far() { return this._far; } /** * Sets all orthographic parameters at once. * @param {number} left The left plane of the orthographic box. * @param {number} right The right plane of the orthographic box. * @param {number} top The top plane of the orthographic box. * @param {number} bottom The bottom plane of the orthographic box. * @param {number} near The near clipping plane. * @param {number} far The far clipping plane. * @returns {OrthographicProjection} this */ set(left, right, top, bottom, near, far) { this._left = left; this._right = right; this._top = top; this._bottom = bottom; this._near = near; this._far = far; this._dirty = true; return this; } /** * Sets the orthographic box size by width and height, centered at (0, 0). * @param {number} width The width of the orthographic box. * @param {number} height The height of the orthographic box. * @returns {OrthographicProjection} this */ setSize(width, height) { this._left = -width / 2; this._right = width / 2; this._top = height / 2; this._bottom = -height / 2; this._dirty = true; return this; } /** * Copies the parameters from another OrthographicProjection. * @param {OrthographicProjection} source * @returns {OrthographicProjection} this */ copy(source) { this._left = source._left; this._right = source._right; this._top = source._top; this._bottom = source._bottom; this._near = source._near; this._far = source._far; this._dirty = true; return this; } /** * Updates the orthographic projection matrix. * @protected */ _updateMatrix() { const left = this._left, right = this._right, bottom = this._bottom, top = this._top, near = this._near, far = this._far; this._matrix.set( 2 / (right - left), 0, 0, -(right + left) / (right - left), 0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom), 0, 0, -2 / (far - near), -(far + near) / (far - near), 0, 0, 0, 1 ); this._dirty = false; } } /** * The camera used for rendering a 3D scene. * The camera's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed camera points down the -Z axis. * @extends Object3D */ class Camera extends Object3D { /** * Create a camera. */ constructor() { super(); /** * This is the inverse of worldMatrix. * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here. * @type {Matrix4} */ this.viewMatrix = new Matrix4(); /** * This is the matrix which contains the projection. * @type {Matrix4} */ this.projectionMatrix = new Matrix4(); /** * This is the matrix which contains the projection. * @type {Matrix4} */ this.projectionMatrixInverse = new Matrix4(); /** * This is the matrix which contains the projection and view matrix. * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here. * @type {Matrix4} */ this.projectionViewMatrix = new Matrix4(); /** * The frustum of the camera. * @type {Frustum} */ this.frustum = new Frustum(); /** * The factor of gamma. * @type {number} * @default 2.0 */ this.gammaFactor = 2.0; /** * Output pixel encoding. * @type {TEXEL_ENCODING_TYPE} * @default TEXEL_ENCODING_TYPE.LINEAR */ this.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR; /** * Where on the screen is the camera rendered in normalized coordinates. * The values in rect range from zero (left/bottom) to one (right/top). * @type {Vector4} * @default Vector4(0, 0, 1, 1) */ this.rect = new Vector4(0, 0, 1, 1); /** * When this is set, it checks every frame if objects are in the frustum of the camera before rendering objects. * Otherwise objects gets rendered every frame even if it isn't visible. * @type {boolean} * @default true */ this.frustumCulled = true; } /** * Set view by look at, this func will set quaternion of this camera. * @param {Vector3} target - The target that the camera look at. * @param {Vector3} up - The up direction of the camera. */ lookAt(target, up) { _mat4_1.lookAtRH(this.position, target, up); this.quaternion.setFromRotationMatrix(_mat4_1); } /** * Set orthographic projection matrix. * @param {number} left Camera frustum left plane. * @param {number} right Camera frustum right plane. * @param {number} bottom Camera frustum bottom plane. * @param {number} top Camera frustum top plane. * @param {number} near Camera frustum near plane. * @param {number} far Camera frustum far plane. * @deprecated Use OrthographicProjection instead. */ setOrtho(left, right, bottom, top, near, far) { _orthographicProjection.set(left, right, top, bottom, near, far); this.setProjectionMatrix(_orthographicProjection.matrix); } /** * Set perspective projection matrix. * @param {number} fov Camera frustum vertical field of view. * @param {number} aspect Camera frustum aspect ratio. * @param {number} near Camera frustum near plane. * @param {number} far Camera frustum far plane. * @deprecated Use PerspectiveProjection instead. */ setPerspective(fov, aspect, near, far) { _perspectiveProjection.set(fov * 180 / Math.PI, aspect, near, far); this.setProjectionMatrix(_perspectiveProjection.matrix); } /** * Set the projection matrix. * @param {Matrix4} matrix The projection matrix. */ setProjectionMatrix(matrix) { this.projectionMatrix.copy(matrix); this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); } getWorldDirection(optionalTarget = new Vector3()) { return super.getWorldDirection(optionalTarget).negate(); } updateMatrix(force) { Object3D.prototype.updateMatrix.call(this, force); this.viewMatrix.copy(this.worldMatrix).invert(); // update view matrix this.projectionViewMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix); // get PV matrix this.frustum.setFromMatrix(this.projectionViewMatrix); // update frustum } copy(source, recursive) { Object3D.prototype.copy.call(this, source, recursive); this.viewMatrix.copy(source.viewMatrix); this.projectionMatrix.copy(source.projectionMatrix); this.projectionMatrixInverse.copy(source.projectionMatrixInverse); this.frustum.copy(source.frustum); this.gammaFactor = source.gammaFactor; this.outputEncoding = source.outputEncoding; this.rect.copy(source.rect); this.frustumCulled = source.frustumCulled; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Camera.prototype.isCamera = true; const _mat4_1 = new Matrix4(); const _perspectiveProjection = new PerspectiveProjection(); const _orthographicProjection = new OrthographicProjection(); const _sphere = new Sphere(); const _inverseMatrix = new Matrix4(); const _ray = new Ray(); const _barycoord = new Vector3(); const _vA = new Vector3(); const _vB = new Vector3(); const _vC = new Vector3(); const _tempA = new Vector3(); const _morphA = new Vector3(); const _uvA = new Vector2(); const _uvB = new Vector2(); const _uvC = new Vector2(); const _intersectionPoint = new Vector3(); const _intersectionPointWorld = new Vector3(); /** * Class representing triangular polygon mesh based objects. * Also serves as a base for other classes such as {@link SkinnedMesh}. * @extends Object3D */ class Mesh extends Object3D { /** * @param {Geometry} geometry — an instance of {@link Geometry}. * @param {Material} material - a single or an array of {@link Material}. */ constructor(geometry, material) { super(); /** * an instance of {@link Geometry}. * @type {Geometry} */ this.geometry = geometry; /** * a single or an array of {@link Material}. * @type {Material|Material[]} */ this.material = material; /** * An array of weights typically from 0-1 that specify how much of the morph is applied. * @type {number[] | null} * @default null */ this.morphTargetInfluences = null; } /** * Get the local-space position of the vertex at the given index, * taking into account the current animation state of both morph targets and skinning. * @param {number} index - The index of the vertex. * @param {Vector3} target - The target vector. * @returns {Vector3} The target vector. */ getVertexPosition(index, target) { const geometry = this.geometry; const position = geometry.getAttribute('a_Position'); const morphPosition = geometry.morphAttributes.position; target.fromArray(position.buffer.array, index * position.buffer.stride + position.offset); const morphInfluences = this.morphTargetInfluences; if (morphPosition && morphInfluences) { _morphA.set(0, 0, 0); for (let i = 0, il = morphPosition.length; i < il; i++) { const influence = morphInfluences[i]; const morphAttribute = morphPosition[i]; if (influence === 0) continue; _tempA.fromArray(morphAttribute.buffer.array, index * morphAttribute.buffer.stride + morphAttribute.offset); _morphA.addScaledVector(_tempA, influence); } target.add(_morphA); } return target; } raycast(ray, intersects) { const geometry = this.geometry; const material = this.material; const worldMatrix = this.worldMatrix; _sphere.copy(geometry.boundingSphere); _sphere.applyMatrix4(worldMatrix); if (!ray.intersectsSphere(_sphere)) { return; } _inverseMatrix.copy(worldMatrix).invert(); _ray.copy(ray).applyMatrix4(_inverseMatrix); if (!_ray.intersectsBox(geometry.boundingBox)) { return; } const position = geometry.getAttribute('a_Position'); if (!position) { return; } const uv = geometry.getAttribute('a_Uv'); const groups = geometry.groups; let intersection; if (geometry.index) { const index = geometry.index.buffer.array; if (Array.isArray(material)) { for (let i = 0, il = groups.length; i < il; i++) { const group = groups[i]; const groupMaterial = material[group.materialIndex]; const start = group.start; const end = Math.min(index.length, group.start + group.count); for (let j = start, jl = end; j < jl; j += 3) { const a = index[j]; const b = index[j + 1]; const c = index[j + 2]; intersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersection.face.materialIndex = group.materialIndex; intersects.push(intersection); } } } } else { for (let i = 0, il = index.length; i < il; i += 3) { const a = index[i]; const b = index[i + 1]; const c = index[i + 2]; intersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersects.push(intersection); } } } } else { if (Array.isArray(material)) { for (let i = 0, il = groups.length; i < il; i++) { const group = groups[i]; const groupMaterial = material[group.materialIndex]; const start = group.start; const end = Math.min(position.buffer.count, group.start + group.count); for (let j = start, jl = end; j < jl; j += 3) { const a = j; const b = j + 1; const c = j + 2; intersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersection.face.materialIndex = group.materialIndex; intersects.push(intersection); } } } } else { for (let i = 0, il = position.buffer.count; i < il; i += 3) { const a = i; const b = i + 1; const c = i + 2; intersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersects.push(intersection); } } } } } copy(source) { super.copy(source); if (source.morphTargetInfluences) { this.morphTargetInfluences = source.morphTargetInfluences.slice(); } return this; } clone() { return new this.constructor(this.geometry, this.material).copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Mesh.prototype.isMesh = true; function checkGeometryIntersection(object, material, ray, _ray, uv, a, b, c) { object.getVertexPosition(a, _vA); object.getVertexPosition(b, _vB); object.getVertexPosition(c, _vC); const intersection = checkIntersection(object, material, ray, _ray, _vA, _vB, _vC, _intersectionPoint); if (intersection) { let array; let bufferStride; let attributeOffset; if (uv) { array = uv.buffer.array; bufferStride = uv.buffer.stride; attributeOffset = uv.offset; _uvA.fromArray(array, a * bufferStride + attributeOffset); _uvB.fromArray(array, b * bufferStride + attributeOffset); _uvC.fromArray(array, c * bufferStride + attributeOffset); intersection.uv = uvIntersection(_intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC); } const face = { a: a, b: b, c: c, normal: new Vector3() }; Triangle.normal(_vA, _vB, _vC, face.normal); intersection.face = face; } return intersection; } function uvIntersection(point, p1, p2, p3, uv1, uv2, uv3) { Triangle.barycoordFromPoint(point, p1, p2, p3, _barycoord); uv1.multiplyScalar(_barycoord.x); uv2.multiplyScalar(_barycoord.y); uv3.multiplyScalar(_barycoord.z); uv1.add(uv2).add(uv3); return uv1.clone(); } function checkIntersection(object, material, ray, localRay, pA, pB, pC, point) { let intersect; if (material.side === DRAW_SIDE.BACK) { intersect = localRay.intersectTriangle(pC, pB, pA, true, point); } else { intersect = localRay.intersectTriangle(pA, pB, pC, material.side !== DRAW_SIDE.DOUBLE, point); } if (intersect === null) return null; _intersectionPointWorld.copy(point); _intersectionPointWorld.applyMatrix4(object.worldMatrix); const distance = ray.origin.distanceTo(_intersectionPointWorld); return { distance: distance, point: _intersectionPointWorld.clone(), object: object }; } /** * The Attribute add structural information to Buffer. * This class stores data for an attribute (such as vertex positions, face indices, normals, colors, UVs, and any custom attributes ) associated with a Geometry, which allows for more efficient passing of data to the GPU. * Data is stored as vectors of any length (defined by size). */ class Attribute { /** * @param {Buffer} buffer - The Buffer instance passed in the constructor. * @param {number} [size=buffer.stride] - The number of values of the array that should be associated with a particular vertex. For instance, if this attribute is storing a 3-component vector (such as a position, normal, or color), then size should be 3. * @param {number} [offset=0] - The offset in the underlying array buffer where an item starts. * @param {boolean} [normalized=false] - Indicates how the underlying data in the buffer maps to the values in the GLSL shader code. */ constructor(buffer, size = buffer.stride, offset = 0, normalized = false) { /** * The Buffer instance passed in the constructor. * @type {Buffer} */ this.buffer = buffer; /** * The number of values of the buffer that should be associated with the attribute. * @type {number} * @default buffer.stride */ this.size = size; /** * The offset in the underlying buffer where an item starts. * @type {number} * @default 0 */ this.offset = offset; /** * Indicates how the underlying data in the buffer maps to the values in the GLSL shader code. * @type {boolean} * @default false */ this.normalized = normalized; /** * Instance cadence, the number of instances drawn for each vertex in the buffer, non-instance attributes must be 0. * @type {number} * @default 0 */ this.divisor = 0; } /** * Copy the parameters from the passed attribute. * @param {Attribute} source - The attribute to be copied. * @returns {Attribute} */ copy(source) { this.buffer = source.buffer; this.size = source.size; this.offset = source.offset; this.normalized = source.normalized; this.divisor = source.divisor; return this; } /** * Return a new attribute with the same parameters as this attribute. * @param {object} buffers - A WeakMap to save shared buffers. * @returns {Attribute} */ clone(buffers) { let attribute; if (!buffers) { console.warn('Attribute.clone(): now requires a WeakMap as an argument to save shared buffers.'); attribute = new Attribute(this.buffer.clone(), this.size, this.offset, this.normalized); attribute.divisor = this.divisor; return attribute; } if (!buffers.has(this.buffer)) { buffers.set(this.buffer, this.buffer.clone()); } attribute = new Attribute(buffers.get(this.buffer), this.size, this.offset, this.normalized); attribute.divisor = this.divisor; return attribute; } } /** * The Buffer contain the data that is used for the geometry of 3D models, animations, and skinning. */ class Buffer { /** * @param {TypedArray} array -- A typed array with a shared buffer. Stores the geometry data. * @param {number} stride -- The number of typed-array elements per vertex. */ constructor(array, stride) { /** * A typed array with a shared buffer. * Stores the geometry data. * @type {TypedArray} */ this.array = array; /** * The number of typed-array elements per vertex. * @type {number} */ this.stride = stride; /** * Gives the total number of elements in the array. * @type {number} */ this.count = array !== undefined ? array.length / stride : 0; /** * Defines the intended usage pattern of the data store for optimization purposes. * Corresponds to the usage parameter of WebGLRenderingContext.bufferData(). * @type {BUFFER_USAGE} * @default BUFFER_USAGE.STATIC_DRAW */ this.usage = BUFFER_USAGE.STATIC_DRAW; /** * Object containing offset and count. * @type {object} * @default { offset: 0, count: - 1 } */ this.updateRange = { offset: 0, count: -1 }; /** * A version number, incremented every time the data is changed. * @type {number} * @default 0 */ this.version = 0; } /** * A callback function that is executed after the Renderer has transferred the attribute array data to the GPU. */ onUploadCallback() {} /** * Copies another Buffer to this Buffer. * @param {Buffer} source - The buffer to be copied. * @returns {Buffer} */ copy(source) { this.array = new source.array.constructor(source.array); this.stride = source.stride; this.count = source.array.length / this.stride; this.usage = source.usage; return this; } /** * Return a copy of this buffer. * @returns {Buffer} */ clone() { const array = new this.array.constructor(this.array); const ib = new Buffer(array, this.stride); ib.usage = this.usage; return ib; } } let _geometryId = 0; const _vector$1 = new Vector3(); const _offset = new Vector3(); const _sum = new Vector3(); const _box3 = new Box3(); const _boxMorphTargets = new Box3(); /** * An efficient representation of mesh, line, or point geometry. * Includes vertex positions, face indices, normals, colors, UVs, and custom attributes within buffers, reducing the cost of passing all this data to the GPU. * To read and edit data in {@link Geometry#attributes}. * @extends EventDispatcher */ class Geometry extends EventDispatcher { /** * Create a geometry. */ constructor() { super(); /** * Unique number for this geometry instance. * @readonly * @type {number} */ this.id = _geometryId++; /** * UUID of this geometry instance. * This gets automatically assigned, so this shouldn't be edited. * @readonly * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * This hashmap has as id the name of the attribute to be set and as value the buffer to set it to. * Rather than accessing this property directly, use {@link Geometry#addAttribute} and {@link Geometry#getAttribute} to access attributes of this geometry. * @type {object} */ this.attributes = {}; /** * Hashmap of Attributes Array for morph targets. * @type {object} */ this.morphAttributes = {}; /** * Allows for vertices to be re-used across multiple triangles; this is called using "indexed triangles" and each triangle is associated with the indices of three vertices. * This attribute therefore stores the index of each vertex for each triangular face. * If this attribute is not set, the renderer assumes that each three contiguous positions represent a single triangle. * @type {Attribute | null} */ this.index = null; /** * Bounding box for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingBox}. * @type {Box3} * @default Box3() */ this.boundingBox = new Box3(); /** * Bounding sphere for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingSphere}. * @type {Sphere} * @default Sphere() */ this.boundingSphere = new Sphere(); /** * Split the geometry into groups, each of which will be rendered in a separate WebGL draw call. This allows an array of materials to be used with the geometry. * Each group is an object of the form: { start: Integer, count: Integer, materialIndex: Integer }, * or { multiDrawStarts: Integer[], multiDrawCounts: Integer[], multiDrawCount: Integer, materialIndex: Integer } if multiDraw is available. * @type {Array} * @default [] */ this.groups = []; /** * The number of instances to be rendered. If set to -1 (default), instanced rendering is disabled. * This property is used for instanced rendering, where multiple copies of the geometry * are drawn with a single draw call. * @type {number} * @default -1 */ this.instanceCount = -1; /** * A version number, incremented every time the attribute object or index object changes to mark VAO drity. * @type {number} * @default 0 */ this.version = 0; } /** * Adds an attribute to this geometry. * Use this rather than the attributes property. * @param {string} name * @param {Attribute} attribute */ addAttribute(name, attribute) { this.attributes[name] = attribute; } /** * Returns the attribute with the specified name. * @param {string} name * @returns {Attribute} */ getAttribute(name) { return this.attributes[name]; } /** * Removes the attribute with the specified name. * @param {string} name */ removeAttribute(name) { delete this.attributes[name]; } /** * Set the {@link Geometry#index} buffer. * @param {Array | Attribute | null} index */ setIndex(index) { if (Array.isArray(index)) { const typedArray = new (arrayMax(index) > 65535 ? Uint32Array : Uint16Array)(index); this.index = new Attribute(new Buffer(typedArray, 1)); } else { this.index = index; } } /** * Adds a group to this geometry; see the {@link Geometry#groups} for details. * @param {number} start * @param {number} count * @param {number} [materialIndex=0] */ addGroup(start, count, materialIndex = 0) { this.groups.push({ start: start, count: count, materialIndex: materialIndex }); } /** * Clears all groups. */ clearGroups() { this.groups = []; } /** * Computes bounding box of the geometry, updating {@link Geometry#boundingBox}. * Bounding boxes aren't computed by default. They need to be explicitly computed. */ computeBoundingBox() { const position = this.attributes['a_Position'] || this.attributes['position']; if (position) { this.boundingBox.setFromArray(position.buffer.array, position.buffer.stride, position.offset, position.normalized); } const morphAttributesPosition = this.morphAttributes.position; if (morphAttributesPosition) { for (let i = 0; i < morphAttributesPosition.length; i++) { const morphAttribute = morphAttributesPosition[i]; _box3.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized); _vector$1.addVectors(this.boundingBox.min, _box3.min); this.boundingBox.expandByPoint(_vector$1); _vector$1.addVectors(this.boundingBox.max, _box3.max); this.boundingBox.expandByPoint(_vector$1); } } } /** * Computes bounding sphere of the geometry, updating {@link Geometry#boundingSphere}. * Bounding spheres aren't computed by default. They need to be explicitly computed. */ computeBoundingSphere() { const position = this.attributes['a_Position'] || this.attributes['position']; const morphAttributesPosition = this.morphAttributes.position; if (!position) { return; } const bufferStride = position.buffer.stride; const positionOffset = position.offset; if (morphAttributesPosition) { _box3.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized); for (let i = 0; i < morphAttributesPosition.length; i++) { const morphAttribute = morphAttributesPosition[i]; _boxMorphTargets.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized); _vector$1.addVectors(_box3.min, _boxMorphTargets.min); _box3.expandByPoint(_vector$1); _vector$1.addVectors(_box3.max, _boxMorphTargets.max); _box3.expandByPoint(_vector$1); } const center = this.boundingSphere.center; _box3.getCenter(center); let maxRadiusSq = 0; for (let i = 0; i < position.buffer.count; i++) { _offset.fromArray(position.buffer.array, i * bufferStride + positionOffset); maxRadiusSq = center.distanceToSquared(_offset); for (let j = 0; j < morphAttributesPosition.length; j++) { const morphAttribute = morphAttributesPosition[j]; _vector$1.fromArray(morphAttribute.buffer.array, i * morphAttribute.buffer.stride + morphAttribute.offset); _sum.addVectors(_offset, _vector$1); const offsetLengthSq = center.distanceToSquared(_sum); // TODO The maximum radius cannot be obtained here if (offsetLengthSq > maxRadiusSq) { maxRadiusSq = offsetLengthSq; _offset.add(_vector$1); } } } this.boundingSphere.radius = Math.sqrt(maxRadiusSq); } else { this.boundingSphere.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized); } } /** * Disposes the object from memory. * You need to call this when you want the BufferGeometry removed while the application is running. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } /** * Copies another Geometry to this Geometry. * @param {Geometry} source - The geometry to be copied. * @returns {Geometry} */ copy(source) { let name, i, l; // reset this.index = null; this.attributes = {}; this.morphAttributes = {}; this.groups = []; const buffers = new WeakMap(); // used for storing cloned, shared buffers // index const index = source.index; if (index !== null) { this.setIndex(index.clone(buffers)); } // attributes const attributes = source.attributes; for (name in attributes) { const attribute = attributes[name]; this.addAttribute(name, attribute.clone(buffers)); } // morph attributes const morphAttributes = source.morphAttributes; for (name in morphAttributes) { const array = []; const morphAttribute = morphAttributes[name]; // morphAttribute: array of Float32BufferAttributes for (i = 0, l = morphAttribute.length; i < l; i++) { array.push(morphAttribute[i].clone(buffers)); } this.morphAttributes[name] = array; } // groups const groups = source.groups; for (i = 0, l = groups.length; i < l; i++) { const group = groups[i]; this.addGroup(group.start, group.count, group.materialIndex); } // boundings this.boundingBox.copy(source.boundingBox); this.boundingSphere.copy(source.boundingSphere); // instance count this.instanceCount = source.instanceCount; return this; } /** * Creates a clone of this Geometry. * @returns {Geometry} */ clone() { return new Geometry().copy(this); } } function arrayMax(array) { if (array.length === 0) return -Infinity; let max = array[0]; for (let i = 1, l = array.length; i < l; ++i) { if (array[i] > max) max = array[i]; } return max; } /** * A transform object for UV coordinates. * @extends Matrix3 */ class TransformUV extends Matrix3 { /** * Create a new TransformUV object. */ constructor() { super(); this.offset = new Vector2(0, 0); this.scale = new Vector2(1, 1); this.center = new Vector2(0, 0); this.rotation = 0; this.needsUpdate = false; } /** * Update the matrix for UV transformation based on the offset, scale, rotation and center. * If needsUpdate is false, this method will do nothing. * @returns {TransformUV} This object. */ update() { if (!this.needsUpdate) return this; this.needsUpdate = false; this.updateMatrix(); return this; } /** * Update the matrix for UV transformation based on the offset, scale, rotation and center. * This method will always update the matrix regardless of the needsUpdate flag. * @returns {TransformUV} This object. */ updateMatrix() { return this.setUvTransform( this.offset.x, this.offset.y, this.scale.x, this.scale.y, this.rotation, this.center.x, this.center.y ); } /** * Copy the properties of another TransformUV object. * @param {TransformUV|Matrix3} source - The object to copy the properties from. * @returns {TransformUV} This object. */ copy(source) { super.copy(source); // in case source is only a Matrix3 object (without additional properties) if (!source.isTransformUV) return this; this.offset.copy(source.offset); this.scale.copy(source.scale); this.center.copy(source.center); this.rotation = source.rotation; this.needsUpdate = source.needsUpdate; return this; } /** * Clone this TransformUV object. * @returns {TransformUV} The cloned object. */ clone() { return new this.constructor().copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TransformUV.prototype.isTransformUV = true; let _materialId = 0; /** * Abstract base class for materials. * Materials describe the appearance of {@link Object3D}. * They are defined in a (mostly) renderer-independent way, so you don't have to rewrite materials if you decide to use a different renderer. * The following properties and methods are inherited by all other material types (although they may have different defaults). * @abstract * @extends EventDispatcher */ class Material extends EventDispatcher { constructor() { super(); /** * Unique number for this material instance. * @readonly * @type {number} */ this.id = _materialId++; /** * UUID of this material instance. * This gets automatically assigned, so this shouldn't be edited. * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * Type of the material. * @type {MATERIAL_TYPE} * @default MATERIAL_TYPE.SHADER */ this.type = MATERIAL_TYPE.SHADER; /** * Custom shader name. This naming can help ShaderMaterial to optimize the length of the index hash string. * It is valid only when the material type is MATERIAL_TYPE.SHADER. * Otherwise, if the material is a built-in type, the name of the shader will always be equal to the material type. * @type {string} * @default "" */ this.shaderName = ''; /** * Custom defines of the shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {object} * @default {} */ this.defines = {}; /** * Custom uniforms of the shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {object} * @default {} */ this.uniforms = {}; /** * Custom GLSL code for vertex shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {string} * @default "" */ this.vertexShader = ''; /** * Custom GLSL code for fragment shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {string} * @default "" */ this.fragmentShader = ''; /** * Override the renderer's default precision for this material. * Can be "highp", "mediump" or "lowp". * @type {string} * @default null */ this.precision = null; /** * The bitmask of UV coordinate channels to use for the external texture. * This will be combined with the internal UV coordinate mask collected from the renderer by default. * Finally, it will be used to determine which UV coordinate attribute to use and to generate the shader code. * @type {number} * @default 0 */ this.extUvCoordMask = 0; /** * Defines whether this material is transparent. * This has an effect on rendering as transparent objects need special treatment and are rendered after non-transparent objects. * When set to true, the extent to which the material is transparent is controlled by setting it's blending property. * @type {boolean} * @default false */ this.transparent = false; /** * Which blending to use when displaying objects with this material. * This must be set to BLEND_TYPE.CUSTOM to use custom blendSrc, blendDst or blendEquation. * @type {BLEND_TYPE} * @default BLEND_TYPE.NORMAL */ this.blending = BLEND_TYPE.NORMAL; /** * Blending source. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default BLEND_FACTOR.SRC_ALPHA */ this.blendSrc = BLEND_FACTOR.SRC_ALPHA; /** * Blending destination. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default BLEND_FACTOR.ONE_MINUS_SRC_ALPHA */ this.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; /** * Blending equation to use when applying blending. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_EQUATION} * @default BLEND_EQUATION.ADD */ this.blendEquation = BLEND_EQUATION.ADD; /** * The transparency of the {@link Material#blendSrc}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default null */ this.blendSrcAlpha = null; /** * The transparency of the {@link Material#blendDst}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default null */ this.blendDstAlpha = null; /** * The tranparency of the {@link Material#blendEquation}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_EQUATION} * @default null */ this.blendEquationAlpha = null; /** * Whether to premultiply the alpha (transparency) value. * @type {boolean} * @default false */ this.premultipliedAlpha = false; /** * Defines whether vertex coloring is used. * @type {VERTEX_COLOR} * @default VERTEX_COLOR.NONE */ this.vertexColors = VERTEX_COLOR.NONE; /** * Defines whether precomputed vertex tangents, which must be provided in a vec4 "tangent" attribute, are used. * When disabled, tangents are derived automatically. * Using precomputed tangents will give more accurate normal map details in some cases, such as with mirrored UVs. * @type {boolean} * @default false */ this.vertexTangents = false; /** * Float in the range of 0.0 - 1.0 indicating how transparent the material is. * A value of 0.0 indicates fully transparent, 1.0 is fully opaque. * @type {number} * @default 1 */ this.opacity = 1; /** * The diffuse color. * @type {Color3} * @default Color3(0xffffff) */ this.diffuse = new Color3(0xffffff); /** * The diffuse map. * @type {Texture2D} * @default null */ this.diffuseMap = null; /** * Define the UV chanel for the diffuse map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.diffuseMapCoord = 0; /** * The uv-transform matrix of diffuse map. * This will also affect other maps that cannot be individually specified uv transform, such as normalMap, bumpMap, etc. * @type {TransformUV} * @default TransformUV() */ this.diffuseMapTransform = new TransformUV(); /** * The alpha map. * @type {Texture2D} * @default null */ this.alphaMap = null; /** * Define the UV chanel for the alpha map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.alphaMapCoord = 0; /** * The uv-transform matrix of alpha map. * @type {TransformUV} * @default TransformUV() */ this.alphaMapTransform = new TransformUV(); /** * Emissive (light) color of the material, essentially a solid color unaffected by other lighting. * @type {Color3} * @default Color3(0x000000) */ this.emissive = new Color3(0x000000); /** * Set emissive (glow) map. * The emissive map color is modulated by the emissive color. * If you have an emissive map, be sure to set the emissive color to something other than black. * @type {Texture2D} * @default null */ this.emissiveMap = null; /** * Define the UV chanel for the emissive map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.emissiveMapCoord = 0; /** * The uv-transform matrix of emissive map. * @type {TransformUV} * @default TransformUV() */ this.emissiveMapTransform = new TransformUV(); /** * The red channel of this texture is used as the ambient occlusion map. * @type {Texture2D} * @default null */ this.aoMap = null; /** * Intensity of the ambient occlusion effect. * @type {number} * @default 1 */ this.aoMapIntensity = 1.0; /** * Define the UV chanel for the ao map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.aoMapCoord = 0; /** * The uv-transform matrix of ao map. * @type {TransformUV} * @default TransformUV() */ this.aoMapTransform = new TransformUV(); /** * The normal map. * @type {Texture2D} * @default null */ this.normalMap = null; /** * How much the normal map affects the material. Typical ranges are 0-1. * @type {Vector2} * @default Vector2(1,1) */ this.normalScale = new Vector2(1, 1); /** * The texture to create a bump map. * The black and white values map to the perceived depth in relation to the lights. Bump doesn't actually affect the geometry of the object, only the lighting. * @type {Texture2D} * @default null */ this.bumpMap = null; /** * How much the bump map affects the material. * Typical ranges are 0-1. * @type {number} * @default 1 */ this.bumpScale = 1; /** * The environment map. * If set to undefined, then the material will not inherit envMap from scene.environment. * @type {TextureCube|null|undefined} * @default null */ this.envMap = null; /** * Scales the effect of the environment map by multiplying its color. * This can effect both the diffuse and specular components of environment map. * @type {number} * @default 1 */ this.envMapIntensity = 1; /** * How to combine the result of the surface's color with the environment map, if any. * This has no effect in a {@link PBRMaterial}. * @type {ENVMAP_COMBINE_TYPE} * @default ENVMAP_COMBINE_TYPE.MULTIPLY */ this.envMapCombine = ENVMAP_COMBINE_TYPE.MULTIPLY; /** * Which depth function to use. See the {@link COMPARE_FUNC} constants for all possible values. * @type {COMPARE_FUNC} * @default COMPARE_FUNC.LEQUAL */ this.depthFunc = COMPARE_FUNC.LEQUAL; /** * Whether to have depth test enabled when rendering this material. * @type {boolean} * @default true */ this.depthTest = true; /** * Whether rendering this material has any effect on the depth buffer. * When drawing 2D overlays it can be useful to disable the depth writing in order to layer several things together without creating z-index artifacts. * @type {boolean} * @default true */ this.depthWrite = true; /** * Whether to render the material's color. * This can be used in conjunction with a mesh's renderOrder property to create invisible objects that occlude other objects. * @type {boolean} * @default true */ this.colorWrite = true; /** * Whether stencil operations are performed against the stencil buffer. * In order to perform writes or comparisons against the stencil buffer this value must be true. * @type {boolean} * @default false */ this.stencilTest = false; /** * The bit mask to use when writing to the stencil buffer. * @type {number} * @default 0xFF */ this.stencilWriteMask = 0xff; /** * The stencil comparison function to use. * See the {@link COMPARE_FUNC} constants for all possible values. * @type {COMPARE_FUNC} * @default COMPARE_FUNC.ALWAYS */ this.stencilFunc = COMPARE_FUNC.ALWAYS; /** * The value to use when performing stencil comparisons or stencil operations. * @type {number} * @default 0 */ this.stencilRef = 0; /** * The bit mask to use when comparing against the stencil buffer. * @type {number} * @default 0xFF */ this.stencilFuncMask = 0xff; /** * Which stencil operation to perform when the comparison function returns false. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilFail = OPERATION.KEEP; /** * Which stencil operation to perform when the comparison function returns true but the depth test fails. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilZFail = OPERATION.KEEP; /** * Which stencil operation to perform when the comparison function returns true and the depth test passes. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilZPass = OPERATION.KEEP; /** * The stencil comparison function to use. * See the {@link COMPARE_FUNC} constants for all possible values. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {COMPARE_FUNC|null} * @default null */ this.stencilFuncBack = null; /** * The value to use when performing stencil comparisons or stencil operations. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {number | null} * @default null */ this.stencilRefBack = null; /** * The bit mask to use when comparing against the stencil buffer. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {number | null} * @default null */ this.stencilFuncMaskBack = null; /** * Which stencil operation to perform when the comparison function returns false. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilFailBack = null; /** * Which stencil operation to perform when the comparison function returns true but the depth test fails. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilZFailBack = null; /** * Which stencil operation to perform when the comparison function returns true and the depth test passes. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilZPassBack = null; /** * User-defined clipping planes specified as Plane objects in world space. * These planes apply to the objects this material is attached to. * Points in space whose signed distance to the plane is negative are clipped (not rendered). * @type {Plane[]} * @default null */ this.clippingPlanes = null; /** * Sets the alpha value to be used when running an alpha test. * The material will not be renderered if the opacity is lower than this value. * @type {number} * @default 0 */ this.alphaTest = 0; /** * Enables alpha to coverage. * Can only be used when MSAA is enabled. * @type {boolean} * @default false */ this.alphaToCoverage = false; /** * Defines which side of faces will be rendered - front, back or double. * @type {DRAW_SIDE} * @default DRAW_SIDE.FRONT */ this.side = DRAW_SIDE.FRONT; /** * Whether to use polygon offset. * This corresponds to the GL_POLYGON_OFFSET_FILL WebGL feature. * @type {boolean} * @default false */ this.polygonOffset = false; /** * Sets the polygon offset factor. * @type {number} * @default 0 */ this.polygonOffsetFactor = 0; /** * Sets the polygon offset units. * @type {number} * @default 0 */ this.polygonOffsetUnits = 0; /** * Define whether the material is rendered with flat shading or smooth shading. * @type {SHADING_TYPE} * @default SHADING_TYPE.SMOOTH_SHADING */ this.shading = SHADING_TYPE.SMOOTH_SHADING; /** * Whether to apply dithering to the color to remove the appearance of banding. * @type {boolean} * @default false */ this.dithering = false; /** * Whether the material is affected by lights. * If set true, renderer will try to upload light uniforms. * @type {boolean} * @default false */ this.acceptLight = false; /** * The lighting group of the material. * Used in conjunction with {@link Light#groupMask}. * @type {number} * @default 0 */ this.lightingGroup = 0; /** * Whether the material is affected by fog. * @type {boolean} * @default true */ this.fog = true; /** * Determines how the mesh triangles are constructed from the vertices. * @type {DRAW_MODE} * @default DRAW_MODE.TRIANGLES */ this.drawMode = DRAW_MODE.TRIANGLES; /** * Whether the material uniforms need to be updated every draw call. * If set false, the material uniforms are only updated once per frame , this can help optimize performance. * @type {boolean} * @default true */ this.forceUpdateUniforms = true; /** * Specifies that the material needs to be recompiled. * This property is automatically set to true when instancing a new material. * @type {boolean} * @default true */ this.needsUpdate = true; } /** * Copy the parameters from the passed material into this material. * @param {Material} source - The material to be copied. * @returns {Material} */ copy(source) { this.shaderName = source.shaderName; this.defines = Object.assign({}, source.defines); this.uniforms = cloneUniforms(source.uniforms); this.vertexShader = source.vertexShader; this.fragmentShader = source.fragmentShader; this.precision = source.precision; this.extUvCoordMask = source.extUvCoordMask; this.transparent = source.transparent; this.blending = source.blending; this.blendSrc = source.blendSrc; this.blendDst = source.blendDst; this.blendEquation = source.blendEquation; this.blendSrcAlpha = source.blendSrcAlpha; this.blendDstAlpha = source.blendDstAlpha; this.blendEquationAlpha = source.blendEquationAlpha; this.premultipliedAlpha = source.premultipliedAlpha; this.vertexColors = source.vertexColors; this.vertexTangents = source.vertexTangents; this.opacity = source.opacity; this.diffuse.copy(source.diffuse); this.diffuseMap = source.diffuseMap; this.diffuseMapCoord = source.diffuseMapCoord; this.diffuseMapTransform.copy(source.diffuseMapTransform); this.alphaMap = source.alphaMap; this.alphaMapCoord = source.alphaMapCoord; this.alphaMapTransform.copy(source.alphaMapTransform); this.emissive.copy(source.emissive); this.emissiveMap = source.emissiveMap; this.emissiveMapCoord = source.emissiveMapCoord; this.emissiveMapTransform.copy(source.emissiveMapTransform); this.aoMap = source.aoMap; this.aoMapIntensity = source.aoMapIntensity; this.aoMapCoord = source.aoMapCoord; this.aoMapTransform.copy(source.aoMapTransform); this.normalMap = source.normalMap; this.normalScale.copy(source.normalScale); this.bumpMap = source.bumpMap; this.bumpScale = source.bumpScale; this.envMap = source.envMap; this.envMapIntensity = source.envMapIntensity; this.envMapCombine = source.envMapCombine; this.depthFunc = source.depthFunc; this.depthTest = source.depthTest; this.depthWrite = source.depthWrite; this.colorWrite = source.colorWrite; this.stencilTest = source.stencilTest; this.stencilWriteMask = source.stencilWriteMask; this.stencilFunc = source.stencilFunc; this.stencilRef = source.stencilRef; this.stencilFuncMask = source.stencilFuncMask; this.stencilFail = source.stencilFail; this.stencilZFail = source.stencilZFail; this.stencilZPass = source.stencilZPass; this.stencilFuncBack = source.stencilFuncBack; this.stencilRefBack = source.stencilRefBack; this.stencilFuncMaskBack = source.stencilFuncMaskBack; this.stencilFailBack = source.stencilFailBack; this.stencilZFailBack = source.stencilZFailBack; this.stencilZPassBack = source.stencilZPassBack; this.clippingPlanes = source.clippingPlanes; this.alphaTest = source.alphaTest; this.alphaToCoverage = source.alphaToCoverage; this.side = source.side; this.polygonOffset = source.polygonOffset; this.polygonOffsetFactor = source.polygonOffsetFactor; this.polygonOffsetUnits = source.polygonOffsetUnits; this.shading = source.shading; this.dithering = source.dithering; this.acceptLight = source.acceptLight; this.lightingGroup = source.lightingGroup; this.fog = source.fog; this.drawMode = source.drawMode; return this; } /** * Return a new material with the same parameters as this material. * @returns {Material} */ clone() { return new this.constructor().copy(this); } /** * This disposes the material. * Textures of a material don't get disposed. These needs to be disposed by Texture. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * A material rendered with custom shaders. * A shader is a small program written in GLSL that runs on the GPU. * @extends Material */ class ShaderMaterial extends Material { /** * @param {object} shader - Shader object for the shader material. * @param {string} shader.name - Name of the shader. * @param {object} shader.defines - Defines of the shader. * @param {object} shader.uniforms - Uniforms of the shader. * @param {string} shader.vertexShader - Vertex shader GLSL code. * @param {string} shader.fragmentShader - Fragment shader GLSL code. */ constructor(shader) { super(); // Set values if (shader) { this.shaderName = shader.name; Object.assign(this.defines, shader.defines); this.uniforms = cloneUniforms(shader.uniforms); this.vertexShader = shader.vertexShader; this.fragmentShader = shader.fragmentShader; } } } /** * Shader post pass. */ class ShaderPostPass { /** * @param {object} shader - Shader object for the shader material. * @param {string} shader.name - Name of the shader. * @param {object} shader.defines - Defines of the shader. * @param {object} shader.uniforms - Uniforms of the shader. * @param {string} shader.vertexShader - Vertex shader GLSL code. * @param {string} shader.fragmentShader - Fragment shader GLSL code. */ constructor(shader) { const scene = new Scene(); const camera = this.camera = new Camera(); camera.frustumCulled = false; camera.position.set(0, 0, 1); camera.lookAt(new Vector3(0, 0, 0), new Vector3(0, 1, 0)); camera.setOrtho(-1, 1, -1, 1, 0.1, 2); scene.add(camera); const geometry = this.geometry = new Geometry(); // fullscreen triangle geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([-1, 3, 0, -1, -1, 0, 3, -1, 0]), 3))); geometry.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array([0, 2, 0, 0, 2, 0]), 2))); const material = this.material = new ShaderMaterial(shader); this.uniforms = material.uniforms; const plane = new Mesh(geometry, material); plane.frustumCulled = false; scene.add(plane); // static scene scene.updateMatrix(); this.renderStates = scene.updateRenderStates(camera); const renderQueue = scene.updateRenderQueue(camera, false, false); this.renderQueueLayer = renderQueue.layerList[0]; this.renderConfig = {}; } /** * Render the post pass. * @param {ThinRenderer} renderer - The renderer. * @param {RenderTarget} renderTarget - The render target. */ render(renderer, renderTarget) { renderer.beginRender(renderTarget); renderer.renderRenderableList(this.renderQueueLayer.opaque, this.renderStates, this.renderConfig); renderer.endRender(); } /** * Dispose the post pass. */ dispose() { this.geometry.dispose(); this.material.dispose(); } } /** * A material for drawing geometry by depth. * Depth is based off of the camera near and far plane. White is nearest, black is farthest. * @extends Material */ class DepthMaterial extends Material { /** * Create a DepthMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.DEPTH; /** * Encoding for depth packing. * @type {boolean} * @default false */ this.packToRGBA = false; } } /** * A material for drawing geometry by distance. * @extends Material */ class DistanceMaterial extends Material { /** * Create a DistanceMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.DISTANCE; } } /** * Shadow map pass. */ class ShadowMapPass { constructor() { /** * Get depth material function. * Override this to use custom depth material. * @type {Function} */ this.getDepthMaterial = _getDepthMaterial; /** * Get distance material function. * Override this to use custom distance material. * @type {Function} */ this.getDistanceMaterial = _getDistanceMaterial; /** * Define which render layers will produce shadows. * If the value is Null, it means that all render layers will produce shadows. * @type {null | Array} * @default null */ this.shadowLayers = null; /** * Whether transparent objects can cast shadows. * @type {boolean} * @default false */ this.transparentShadow = false; const state = { isPointLight: false, light: null }; this._state = state; const that = this; this._renderOptions = { getGeometry: null, getMaterial: function(renderable) { return state.isPointLight ? that.getDistanceMaterial(renderable, state.light) : that.getDepthMaterial(renderable, state.light); }, ifRender: function(renderable) { return (state.light.groupMask & (1 << renderable.material.lightingGroup)) && renderable.object.castShadow; } }; } /** * Get geometry function for shadow render options. * @type {null | Function} */ set getGeometry(func) { if (func) { this._renderOptions.getGeometry = func; } else { delete this._renderOptions.getGeometry; } } get getGeometry() { return this._renderOptions.getGeometry; } /** * The if render function for shadow render options. * @type {Function} */ set ifRender(func) { if (func) { this._renderOptions.ifRender = func; } else { delete this._renderOptions.ifRender; } } get ifRender() { return this._renderOptions.ifRender; } /** * Render shadow map. * @param {ThinRenderer} renderer * @param {Scene} scene */ render(renderer, scene) { // @deprecated // This can be deleted when renderer.setClearColor is completely removed. oldClearColor.copy(renderer.getClearColor()); const lightingData = scene.collector.lightingData; const lightsArray = lightingData.lightsArray; const shadowsNum = lightingData.shadowsNum; for (let i = 0; i < shadowsNum; i++) { const light = lightsArray[i]; const shadow = light.shadow; if (shadow.autoUpdate === false && shadow.needsUpdate === false) continue; const camera = shadow.camera; const shadowTarget = shadow.renderTarget; const isPointLight = light.isPointLight; const faces = isPointLight ? 6 : 1; this._state.isPointLight = isPointLight; this._state.light = light; const renderOptions = this._renderOptions; shadow.prepareDepthMap(!scene.disableShadowSampler, renderer.capabilities); for (let j = 0; j < faces; j++) { if (isPointLight) { shadow.update(light, j); shadowTarget.activeLayer = j; } shadowTarget .setColorClearValue(1, 1, 1, 1) .setClear(true, true, false); const renderStates = scene.updateRenderStates(camera, j === 0); const renderQueue = scene.updateRenderQueue(camera, false, false); renderer.beginRender(shadowTarget); for (let k = 0; k < renderQueue.layerList.length; k++) { const renderQueueLayer = renderQueue.layerList[k]; if (this.shadowLayers !== null && this.shadowLayers.indexOf(renderQueueLayer.id) === -1) continue; renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderOptions); if (this.transparentShadow) { renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions); } } renderer.endRender(); } shadow.needsUpdate = false; } // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.setClearColor(oldClearColor.x, oldClearColor.y, oldClearColor.z, oldClearColor.w); } } const oldClearColor = new Vector4(); const shadowSide = { 'front': DRAW_SIDE.BACK, 'back': DRAW_SIDE.FRONT, 'double': DRAW_SIDE.DOUBLE }; const depthMaterials = {}; const distanceMaterials = {}; function _getDepthMaterial(renderable, light) { const useSkinning = !!renderable.object.skeleton; const useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0; const clippingPlanes = renderable.material.clippingPlanes; const numClippingPlanes = (clippingPlanes && clippingPlanes.length > 0) ? clippingPlanes.length : 0; const index = useMorphing << 0 | useSkinning << 1; let materials = depthMaterials[index]; if (materials === undefined) { materials = {}; depthMaterials[index] = materials; } let material = materials[numClippingPlanes]; if (material === undefined) { material = new DepthMaterial(); material.packToRGBA = true; materials[numClippingPlanes] = material; } material.side = shadowSide[renderable.material.side]; material.clippingPlanes = renderable.material.clippingPlanes; material.drawMode = renderable.material.drawMode; return material; } function _getDistanceMaterial(renderable, light) { const useSkinning = !!renderable.object.skeleton; const useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0; const clippingPlanes = renderable.material.clippingPlanes; const numClippingPlanes = (clippingPlanes && clippingPlanes.length > 0) ? clippingPlanes.length : 0; const index = useMorphing << 0 | useSkinning << 1; let materials = distanceMaterials[index]; if (materials === undefined) { materials = {}; distanceMaterials[index] = materials; } let material = materials[numClippingPlanes]; if (material === undefined) { material = new DistanceMaterial(); materials[numClippingPlanes] = material; } material.side = shadowSide[renderable.material.side]; material.uniforms['nearDistance'] = light.shadow.cameraNear; material.uniforms['farDistance'] = light.shadow.cameraFar; material.clippingPlanes = renderable.material.clippingPlanes; material.drawMode = renderable.material.drawMode; return material; } /** * PropertyMap is a helper class for storing properties on objects. * Instead of using a Map, we store the property map directly on the object itself, * which provides better lookup performance. * This is generally used to store the gpu resources corresponding to objects. */ class PropertyMap { /** * Create a new PropertyMap. * @param {string} prefix - The prefix of the properties name. */ constructor(prefix) { this._key = prefix + '$'; this._count = 0; } /** * Get the properties of the object. * If the object does not have properties, create a new one. * @param {object} object - The object to get properties. * @returns {object} - The properties of the object. */ get(object) { const key = this._key; let properties = object[key]; if (properties === undefined) { properties = {}; object[key] = properties; this._count++; } return properties; } /** * Delete the properties of the object. * @param {object} object - The object to delete properties. */ delete(object) { const key = this._key; const properties = object[key]; if (properties) { this._count--; delete object[key]; } } /** * Get the number of objects that have properties. * @returns {number} - The number of objects that have properties. */ size() { return this._count; } } /** * Render info collector. * If you want to collect information about the rendering of this frame, * pass an instance of RenderInfo to RenderOption when calling renderRenderableList. */ class RenderInfo { constructor() { const render = { calls: 0, triangles: 0, lines: 0, points: 0 }; // A series of function use for collect information. const updateFuncs = [ function updatePoints(instanceCount, count) { render.points += instanceCount * count; }, function updateLines(instanceCount, count) { render.lines += instanceCount * (count / 2); }, function updateLineLoop(instanceCount, count) { render.lines += instanceCount * count; }, function updateLineStrip(instanceCount, count) { render.lines += instanceCount * (count - 1); }, function updateTriangles(instanceCount, count) { render.triangles += instanceCount * (count / 3); }, function updateTriangleStrip(instanceCount, count) { render.triangles += instanceCount * (count - 2); }, function updateTriangleFan(instanceCount, count) { render.triangles += instanceCount * (count - 2); } ]; /** * Method of update render info. * This method will be executed after each draw. * @private * @param {number} count * @param {DRAW_MODE} mode * @param {number} instanceCount */ this.update = function(count, mode, instanceCount) { render.calls++; updateFuncs[mode](instanceCount, count); }; /** * Reset the render info. * Call this method whenever you have finished to render a single frame. */ this.reset = function() { render.calls = 0; render.triangles = 0; render.lines = 0; render.points = 0; }; /** * A series of statistical information of rendering process, include calls, triangles, lines and points. * @type {object} */ this.render = render; } } let _rendererId = 0; /** * Base class for WebGL and WebGPU renderers. */ class ThinRenderer { constructor() { /** * The unique id of this renderer. * This will be incremented when the context is lost and restored. * @readonly * @type {number} */ this.id = 0; // assigned in init method /** * The Rendering Context privided by canvas. * @type {WebGLRenderingContext|WebGPURenderingContext} */ this.context = null; // assigned in init method /** * An object containing details about the capabilities of the current RenderingContext. * @type {object} */ this.capabilities = {}; /** * The shader compiler options. * @type {object} * @property {boolean} checkErrors - Whether to use error checking when compiling shaders, defaults to true. * @property {boolean} compileAsynchronously - Whether to compile shaders asynchronously, defaults to false. * @property {number} maxMaterialPrograms - The maximum number of programs that one material can cache, defaults to 5. */ this.shaderCompileOptions = { checkErrors: true, compileAsynchronously: false, maxMaterialPrograms: 5 }; /** * The lighting options. * @type {object} * @property {object} clustered - The clustered lighting options. * @property {boolean} clustered.enabled - Whether to use clustered lighting, defaults to false. * @property {number} clustered.maxClusterLights - The maximum number of lights, defaults to 1024. * @property {boolean} clustered.useFloatPrecision - Whether the lights are stored as floats, defaults to false (half floats). * @property {Vector3} clustered.gridDimensions - The number of cells in each dimension, defaults to Vector3(16, 8, 32). * @property {number} clustered.maxLightsPerCell - The maximum number of lights per cell, defaults to 256. * @property {Vector2} clustered.zClip - The near and far clipping planes for the cells, defaults to Vector2(-1, -1) (clip based on camera near and far planes). * @property {number} clustered.version - The version of the clustered lighting options. If the options change, the version should be incremented, defaults to 0. */ this.lightingOptions = { clustered: { enabled: false, maxClusterLights: 1024, useFloatPrecision: false, gridDimensions: new Vector3(16, 8, 32), maxLightsPerCell: 256, zClip: new Vector2(-1, -1), version: 0 } }; this._passInfo = { // Whether the renderer is in the process of pass rendering. // If true, means that the beginRender method has been called but the endRender method has not been called. enabled: false, // The pass rendering count count: 0 }; } /** * Initialize this renderer with a rendering context. * This method is called automatically by {@link WebGLRenderer} constructor when a context is provided. * For WebGPURenderer, you must call this method manually and wait for the promise to resolve. * @param {WebGLRenderingContext|WebGPURenderingContext} context - The rendering context. * @param {object} [options] - The options for initializing this renderer. * @returns {Promise} A promise that resolves when initialization completes. */ init(context, options = {}) {} /** * Begin rendering. * @param {RenderTargetBase} renderTarget - The render target to render to. */ beginRender(renderTarget) { this._passInfo.enabled = true; } /** * End rendering. */ endRender() { this._passInfo.enabled = false; this._passInfo.count++; } /** * @typedef {object} RenderOptions - The render options for renderRenderableItem and renderRenderableList methods. * @property {Function} getGeometry - (Optional) Get renderable geometry. * @property {Function} getMaterial - (Optional) Get renderable material. * @property {Function} beforeRender - (Optional) Before render each renderable item. * @property {Function} afterRender - (Optional) After render each renderable item. * @property {Function} ifRender - (Optional) If render the renderable item. * @property {RenderInfo} renderInfo - (Optional) Render info for collect information. * @property {boolean} onlyCompile - (Optional) Only compile shader, do not render. */ /** * Render a single renderable item with render states. * @param {object} renderable - The renderable item. * @param {RenderStates} renderStates - The render states. * @param {RenderOptions} [options] - The render options for this render task. */ renderRenderableItem(renderable, renderStates, options) {} /** * Render a single renderable list with render states. * @param {Array} renderables - Array of renderable. * @param {RenderStates} renderStates - Render states. * @param {RenderOptions} [options] - The render options for this render task. */ renderRenderableList(renderables, renderStates, options = {}) { for (let i = 0, l = renderables.length; i < l; i++) { this.renderRenderableItem(renderables[i], renderStates, options); } } /** * Render a scene with a particular camera. * This method will render all layers in scene's RenderQueue by default. * If you need a customized rendering process, it is recommended to use renderRenderableList method. * @param {Scene} scene - The scene to render. * @param {Camera} camera - The camera used to render the scene. * @param {RenderTargetBase} renderTarget - The render target to render to. * @param {RenderOptions} [options] - The render options for this scene render task. */ renderScene(scene, camera, renderTarget, options = {}) { // Compatibility handling: if there are only 3 arguments, // and the third is not a RenderTarget, treat it as options. if (arguments.length === 3 && (!renderTarget || !renderTarget.isRenderTarget)) { options = renderTarget; renderTarget = null; } const renderStates = scene.getRenderStates(camera); const renderQueue = scene.getRenderQueue(camera); this.beginRender(renderTarget); let renderQueueLayer; for (let i = 0, l = renderQueue.layerList.length; i < l; i++) { renderQueueLayer = renderQueue.layerList[i]; this.renderRenderableList(renderQueueLayer.opaque, renderStates, options); this.renderRenderableList(renderQueueLayer.transparent, renderStates, options); } this.endRender(); } /** * Copy a frame buffer to another. * This copy process can be used to perform multi-sampling (MSAA). * @param {RenderTargetBase} read - The source renderTarget. * @param {RenderTargetBase} draw - The destination renderTarget. * @param {boolean} [color=true] - Copy color buffer. * @param {boolean} [depth=true] - Copy depth buffer. * @param {boolean} [stencil=true] - Copy stencil buffer. */ blitRenderTarget(read, draw, color = true, depth = true, stencil = true) {} /** * Generate mipmaps for the texture you pass in. * @param {TextureBase} texture - The texture to update. */ generateMipmaps(texture) {} /** * Read pixels from a texture. * This is an asynchronous operation. See {@link ThinRenderer#readTexturePixelsSync} for the synchronous version. * @param {TextureBase} texture - The texture to read from. * @param {number} x - The x coordinate of the rectangle to read from. * @param {number} y - The y coordinate of the rectangle to read from. * @param {number} width - The width of the rectangle to read from. * @param {number} height - The height of the rectangle to read from. * @param {TypedArray} buffer - The buffer to store the pixel data. * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index. * @param {number} [mipLevel=0] - The mip level to read. * @returns {Promise} A promise that resolves with the passed in buffer after it has been filled with the pixel data. */ readTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {} /** * Read pixels from a texture. * This is a synchronous operation. See {@link ThinRenderer#readTexturePixels} for the asynchronous version. * @param {TextureBase} texture - The texture to read from. * @param {number} x - The x coordinate of the rectangle to read from. * @param {number} y - The y coordinate of the rectangle to read from. * @param {number} width - The width of the rectangle to read from. * @param {number} height - The height of the rectangle to read from. * @param {TypedArray} buffer - The buffer to store the pixel data. * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index. * @param {number} [mipLevel=0] - The mip level to read. * @returns {TypedArray} The passed in buffer after it has been filled with the pixel data. */ readTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {} /** * Reset vertex array object bindings. * @param {boolean} [force=false] - Whether clear the current vertex array object. */ resetVertexArrayBindings(force) {} /** * Reset all render states cached in this renderer. * This is useful when you use multiple renderers in one application. */ resetState() {} /** * Begin an occlusion query. * @param {number} index - The query index in the current occlusion query set. */ beginOcclusionQuery(index) {} /** * End the current occlusion query. */ endOcclusionQuery() {} /** * Read back the results of a query set. * This is an asynchronous operation. * @param {QuerySet} querySet - The query set to read from. * @param {Array|TypedArray} dstBuffer - The buffer to store the results. * @param {number} [firstQuery=0] - The first query index to read. * @param {number} [queryCount=querySet.count] - The number of queries to read. * @returns {Promise} A promise that resolves with the passed in buffer after it has been filled with the results. */ readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {} /** * Used for context lost and restored. * @protected * @returns {number} */ increaseId() { this.id = _rendererId++; return this.id; } } /** * Linear fog. */ class Fog { /** * @param {number} [color=0x000000] - The color of the fog. * @param {number} [near=1] - The near clip of the fog. * @param {number} [far=1000] - The far clip of the fog. */ constructor(color = 0x000000, near = 1, far = 1000) { /** * The color of the fog. * @type {Color3} * @default Color3(0x000000) */ this.color = new Color3(color); /** * The near clip of the fog. * @type {number} * @default 1 */ this.near = near; /** * The far clip of the fog. * @type {number} * @default 1000 */ this.far = far; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Fog.prototype.isFog = true; /** * Exp2 fog. */ class FogExp2 { /** * @param {number} [color=0x000000] - The color of the fog. * @param {number} [density=0.00025] - The density of the exp2 fog. */ constructor(color = 0x000000, density = 0.00025) { /** * The color of the fog. * @type {Color3} * @default Color3(0x000000) */ this.color = new Color3(color); /** * The density of the exp2 fog. * @type {number} * @default 0.00025 */ this.density = density; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ FogExp2.prototype.isFogExp2 = true; /** * BoxGeometry is the quadrilateral primitive geometry class. * It is typically used for creating a cube or irregular quadrilateral of the dimensions provided with the 'width', 'height', and 'depth' constructor arguments. * @extends Geometry */ class BoxGeometry extends Geometry { /** * @param {number} [width=1] - Width of the sides on the X axis. * @param {number} [height=1] - Height of the sides on the Y axis. * @param {number} [depth=1] - Depth of the sides on the Z axis. * @param {number} [widthSegments=1] - Number of segmented faces along the width of the sides. * @param {number} [heightSegments=1] - Number of segmented faces along the height of the sides. * @param {number} [depthSegments=1] - Number of segmented faces along the depth of the sides. */ constructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) { super(); const scope = this; // segments widthSegments = Math.floor(widthSegments); heightSegments = Math.floor(heightSegments); depthSegments = Math.floor(depthSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let numberOfVertices = 0; let groupStart = 0; // build each side of the box geometry buildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0); // px buildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1); // nx buildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2); // py buildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3); // ny buildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4); // pz buildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5); // nz // build geometry this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); function buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) { const segmentWidth = width / gridX; const segmentHeight = height / gridY; const widthHalf = width / 2; const heightHalf = height / 2; const depthHalf = depth / 2; const gridX1 = gridX + 1; const gridY1 = gridY + 1; let vertexCounter = 0; let groupCount = 0; const vector = new Vector3(); // generate vertices, normals and uvs for (let iy = 0; iy < gridY1; iy++) { const y = iy * segmentHeight - heightHalf; for (let ix = 0; ix < gridX1; ix++) { const x = ix * segmentWidth - widthHalf; // set values to correct vector component vector[u] = x * udir; vector[v] = y * vdir; vector[w] = depthHalf; // now apply vector to vertex buffer vertices.push(vector.x, vector.y, vector.z); // set values to correct vector component vector[u] = 0; vector[v] = 0; vector[w] = depth > 0 ? 1 : -1; // now apply vector to normal buffer normals.push(vector.x, vector.y, vector.z); // uvs uvs.push(ix / gridX); uvs.push(1 - (iy / gridY)); // counters vertexCounter += 1; } } // indices // 1. you need three indices to draw a single face // 2. a single segment consists of two faces // 3. so we need to generate six (2*3) indices per segment for (let iy = 0; iy < gridY; iy++) { for (let ix = 0; ix < gridX; ix++) { const a = numberOfVertices + ix + gridX1 * iy; const b = numberOfVertices + ix + gridX1 * (iy + 1); const c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1); const d = numberOfVertices + (ix + 1) + gridX1 * iy; // faces indices.push(a, b, d); indices.push(b, c, d); // increase counter groupCount += 6; } } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, materialIndex); // calculate new start value for groups groupStart += groupCount; // update total number of vertices numberOfVertices += vertexCounter; } this.computeBoundingBox(); this.computeBoundingSphere(); } } /** * A class for generating cylinder geometries. * @extends Geometry */ class CylinderGeometry extends Geometry { /** * @param {number} [radiusTop=1] — Radius of the cylinder at the top. * @param {number} [radiusBottom=1] — Radius of the cylinder at the bottom. * @param {number} [height=1] — Height of the cylinder. * @param {number} [radialSegments=8] — Number of segmented faces around the circumference of the cylinder. * @param {number} [heightSegments=1] — Number of rows of faces along the height of the cylinder. * @param {number} [openEnded=false] — A Boolean indicating whether the ends of the cylinder are open or capped. Default is false, meaning capped. * @param {number} [thetaStart=0] — Start angle for first segment, default = 0 (three o'clock position). * @param {number} [thetaLength=2*Pi] — The central angle, often called theta, of the circular sector. The default is 2*Pi, which makes for a complete cylinder. */ constructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { super(); const scope = this; radialSegments = Math.floor(radialSegments); heightSegments = Math.floor(heightSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let index = 0; const indexArray = []; const halfHeight = height / 2; let groupStart = 0; // generate geometry generateTorso(); if (openEnded === false) { if (radiusTop > 0) generateCap(true); if (radiusBottom > 0) generateCap(false); } // build geometry this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); function generateTorso() { const normal = new Vector3(); const vertex = new Vector3(); let groupCount = 0; let x, y; // this will be used to calculate the normal const slope = (radiusBottom - radiusTop) / height; // generate vertices, normals and uvs for (y = 0; y <= heightSegments; y++) { const indexRow = []; const v = y / heightSegments; // calculate the radius of the current row const radius = v * (radiusBottom - radiusTop) + radiusTop; for (x = 0; x <= radialSegments; x++) { const u = x / radialSegments; const theta = u * thetaLength + thetaStart; const sinTheta = Math.sin(theta); const cosTheta = Math.cos(theta); // vertex vertex.x = radius * sinTheta; vertex.y = -v * height + halfHeight; vertex.z = radius * cosTheta; vertices.push(vertex.x, vertex.y, vertex.z); // normal normal.set(sinTheta, slope, cosTheta).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(u, 1 - v); // save index of vertex in respective row indexRow.push(index++); } // now save vertices of the row in our index array indexArray.push(indexRow); } // generate indices for (x = 0; x < radialSegments; x++) { for (y = 0; y < heightSegments; y++) { // we use the index array to access the correct indices const a = indexArray[y][x]; const b = indexArray[y + 1][x]; const c = indexArray[y + 1][x + 1]; const d = indexArray[y][x + 1]; // faces if (radiusTop > 0 || y !== 0) { indices.push(a, b, d); groupCount += 3; } if (radiusBottom > 0 || y !== heightSegments - 1) { indices.push(b, c, d); groupCount += 3; } } } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, 0); // calculate new start value for groups groupStart += groupCount; } function generateCap(top) { // save the index of the first center vertex const centerIndexStart = index; const uv = new Vector2(); const vertex = new Vector3(); let groupCount = 0; let x; const radius = (top === true) ? radiusTop : radiusBottom; const sign = (top === true) ? 1 : -1; // first we generate the center vertex data of the cap. // because the geometry needs one set of uvs per face, // we must generate a center vertex per face/segment for (x = 1; x <= radialSegments; x++) { // vertex vertices.push(0, halfHeight * sign, 0); // normal normals.push(0, sign, 0); // uv uvs.push(0.5, 0.5); // increase index index++; } // save the index of the last center vertex const centerIndexEnd = index; // now we generate the surrounding vertices, normals and uvs for (x = 0; x <= radialSegments; x++) { const u = x / radialSegments; const theta = u * thetaLength + thetaStart; const cosTheta = Math.cos(theta); const sinTheta = Math.sin(theta); // vertex vertex.x = radius * sinTheta; vertex.y = halfHeight * sign; vertex.z = radius * cosTheta; vertices.push(vertex.x, vertex.y, vertex.z); // normal normals.push(0, sign, 0); // uv uv.x = (cosTheta * 0.5) + 0.5; uv.y = (sinTheta * 0.5 * sign) + 0.5; uvs.push(uv.x, uv.y); // increase index index++; } // generate indices for (x = 0; x < radialSegments; x++) { const c = centerIndexStart + x; const i = centerIndexEnd + x; if (top === true) { // face top indices.push(i, i + 1, c); } else { // face bottom indices.push(i + 1, i, c); } groupCount += 3; } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, top === true ? 1 : 2); // calculate new start value for groups groupStart += groupCount; } this.computeBoundingBox(); this.computeBoundingSphere(); } } /** * A class for generating plane geometries. * @extends Geometry */ class PlaneGeometry extends Geometry { /** * @param {number} [width=1] — Width along the X axis. * @param {number} [height=1] — Height along the Y axis. * @param {number} [widthSegments=1] * @param {number} [heightSegments=1] */ constructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) { super(); const width_half = width / 2; const height_half = height / 2; const gridX = Math.floor(widthSegments); const gridY = Math.floor(heightSegments); const gridX1 = gridX + 1; const gridY1 = gridY + 1; const segment_width = width / gridX; const segment_height = height / gridY; let ix, iy; // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // generate vertices, normals and uvs for (iy = 0; iy < gridY1; iy++) { const y = iy * segment_height - height_half; for (ix = 0; ix < gridX1; ix++) { const x = ix * segment_width - width_half; vertices.push(x, 0, y); normals.push(0, 1, 0); uvs.push(ix / gridX); uvs.push(1 - (iy / gridY)); } } // indices for (iy = 0; iy < gridY; iy++) { for (ix = 0; ix < gridX; ix++) { const a = ix + gridX1 * iy; const b = ix + gridX1 * (iy + 1); const c = (ix + 1) + gridX1 * (iy + 1); const d = (ix + 1) + gridX1 * iy; // faces indices.push(a, b, d); indices.push(b, c, d); } } // build geometry this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); } } /** * A class for generating sphere geometries. * The geometry is created by sweeping and calculating vertexes around the Y axis (horizontal sweep) and the Z axis (vertical sweep). * Thus, incomplete spheres (akin to 'sphere slices') can be created through the use of different values of phiStart, phiLength, thetaStart and thetaLength, in order to define the points in which we start (or end) calculating those vertices. * @extends Geometry */ class SphereGeometry extends Geometry { /** * @param {number} [radius=1] — sphere radius. Default is 1. * @param {number} [widthSegments=8] — number of horizontal segments. Minimum value is 3, and the default is 8. * @param {number} [heightSegments=6] — number of vertical segments. Minimum value is 2, and the default is 6. * @param {number} [phiStart=0] — specify horizontal starting angle. Default is 0. * @param {number} [phiLength=Math.PI*2] — specify horizontal sweep angle size. Default is Math.PI * 2. * @param {number} [thetaStart=0] — specify vertical starting angle. Default is 0. * @param {number} [thetaLength=Math.PI] — specify vertical sweep angle size. Default is Math.PI. */ constructor(radius = 1, widthSegments = 8, heightSegments = 6, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) { super(); widthSegments = Math.max(3, Math.floor(widthSegments)); heightSegments = Math.max(2, Math.floor(heightSegments)); const thetaEnd = thetaStart + thetaLength; let ix, iy; let index = 0; const grid = []; const vertex = new Vector3(); const normal = new Vector3(); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // generate vertices, normals and uvs for (iy = 0; iy <= heightSegments; iy++) { const verticesRow = []; const v = iy / heightSegments; // special case for the poles // https://github.com/mrdoob/three.js/pull/16043 let uOffset = 0; if (iy == 0 && thetaStart == 0) { uOffset = 0.5 / widthSegments; } else if (iy == heightSegments && thetaEnd == Math.PI) { uOffset = -0.5 / widthSegments; } for (ix = 0; ix <= widthSegments; ix++) { const u = ix / widthSegments; // vertex vertex.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); vertex.y = radius * Math.cos(thetaStart + v * thetaLength); vertex.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); vertices.push(vertex.x, vertex.y, vertex.z); // normal normal.copy(vertex).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(u + uOffset, 1 - v); verticesRow.push(index++); } grid.push(verticesRow); } // indices for (iy = 0; iy < heightSegments; iy++) { for (ix = 0; ix < widthSegments; ix++) { const a = grid[iy][ix + 1]; const b = grid[iy][ix]; const c = grid[iy + 1][ix]; const d = grid[iy + 1][ix + 1]; if (iy !== 0 || thetaStart > 0) indices.push(a, b, d); if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d); } } this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); } } /** * Creates a torus knot, the particular shape of which is defined by a pair of coprime integers, p and q. * If p and q are not coprime, the result will be a torus link. * @extends Geometry */ class TorusKnotGeometry extends Geometry { /** * @param {number} [radius=1] — Radius of the torus. Default is 1. * @param {number} [tube=0.4] — Radius of the tube. Default is 0.4. * @param {number} [tubularSegments=64] — Default is 64. * @param {number} [radialSegments=8] — Default is 8. * @param {number} [p=2] — This value determines, how many times the geometry winds around its axis of rotational symmetry. Default is 2. * @param {number} [q=3] — This value determines, how many times the geometry winds around a circle in the interior of the torus. Default is 3. */ constructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) { super(); tubularSegments = Math.floor(tubularSegments); radialSegments = Math.floor(radialSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let i, j; const vertex = new Vector3(); const normal = new Vector3(); const P1 = new Vector3(); const P2 = new Vector3(); const B = new Vector3(); const T = new Vector3(); const N = new Vector3(); // generate vertices, normals and uvs for (i = 0; i <= tubularSegments; ++i) { // the radian "u" is used to calculate the position on the torus curve of the current tubular segement const u = i / tubularSegments * p * Math.PI * 2; // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions calculatePositionOnCurve(u, p, q, radius, P1); calculatePositionOnCurve(u + 0.01, p, q, radius, P2); // calculate orthonormal basis T.subVectors(P2, P1); N.addVectors(P2, P1); B.crossVectors(T, N); N.crossVectors(B, T); // normalize B, N. T can be ignored, we don't use it B.normalize(); N.normalize(); for (j = 0; j <= radialSegments; ++j) { // now calculate the vertices. they are nothing more than an extrusion of the torus curve. // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. const v = j / radialSegments * Math.PI * 2; const cx = -tube * Math.cos(v); const cy = tube * Math.sin(v); // now calculate the final vertex position. // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve vertex.x = P1.x + (cx * N.x + cy * B.x); vertex.y = P1.y + (cx * N.y + cy * B.y); vertex.z = P1.z + (cx * N.z + cy * B.z); vertices.push(vertex.x, vertex.y, vertex.z); // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) normal.subVectors(vertex, P1).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(i / tubularSegments); uvs.push(j / radialSegments); } } // generate indices for (j = 1; j <= tubularSegments; j++) { for (i = 1; i <= radialSegments; i++) { // indices const a = (radialSegments + 1) * (j - 1) + (i - 1); const b = (radialSegments + 1) * j + (i - 1); const c = (radialSegments + 1) * j + i; const d = (radialSegments + 1) * (j - 1) + i; // faces indices.push(a, b, d); indices.push(b, c, d); } } // build geometry this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); // this function calculates the current position on the torus curve function calculatePositionOnCurve(u, p, q, radius, position) { const cu = Math.cos(u); const su = Math.sin(u); const quOverP = q / p * u; const cs = Math.cos(quOverP); position.x = radius * (2 + cs) * 0.5 * cu; position.y = radius * (2 + cs) * su * 0.5; position.z = radius * Math.sin(quOverP) * 0.5; } } } /** * A material for drawing geometries in a simple shaded (flat or wireframe) way. * This material is not affected by lights. * @extends Material */ class BasicMaterial extends Material { /** * Create a BasicMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.BASIC; } } /** * A material for non-shiny surfaces, without specular highlights. * The material uses a non-physically based Lambertian model for calculating reflectance. * This can simulate some surfaces (such as untreated wood or stone) well, but cannot simulate shiny surfaces with specular highlights (such as varnished wood). * @extends Material */ class LambertMaterial extends Material { /** * Create a LambertMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.LAMBERT; /** * @default true */ this.acceptLight = true; } } /** * A material for drawing wireframe-style geometries. * @extends Material */ class LineMaterial extends Material { /** * Create a LineMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.LINE; /** * Controls line thickness. * Due to limitations of the OpenGL Core Profile with the WebGL renderer on most platforms linewidth will always be 1 regardless of the set value. * @type {number} * @default 1 */ this.lineWidth = 1; /** * Set draw mode to LINES / LINE_LOOP / LINE_STRIP * @type {DRAW_MODE} * @default DRAW_MODE.LINES */ this.drawMode = DRAW_MODE.LINES; } copy(source) { super.copy(source); this.lineWidth = source.lineWidth; return this; } } /** * A standard physically based material, using Specular-Glossiness workflow. * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max. * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used. * The idea is that, instead of tweaking materials to look good under specific lighting, a material can be created that will react 'correctly' under all lighting scenarios. * @extends Material */ class PBR2Material extends Material { /** * Create a PBR2Material. */ constructor() { super(); this.type = MATERIAL_TYPE.PBR2; /** * Specular color of the material. * @type {number} * @default 0.5 */ this.specular = new Color3(0x111111); /** * Glossiness of the material. * @type {number} * @default 0.5 */ this.glossiness = 0.5; /** * The RGB channel of this texture is used to alter the specular of the material. * @type {Texture2D} * @default null */ this.specularMap = null; /** * The A channel of this texture is used to alter the glossiness of the material. * @type {Texture2D} * @default null */ this.glossinessMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.specular = source.specular; this.glossiness = source.glossiness; this.specularMap = source.specularMap; this.glossinessMap = source.glossinessMap; return this; } } /** * A standard physically based material, using Metallic-Roughness workflow. * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max. * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used. * The idea is that, instead of tweaking materials to look good under specific lighting, a material can be created that will react 'correctly' under all lighting scenarios. * @extends Material */ class PBRMaterial extends Material { /** * Create a PBRMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.PBR; /** * How rough the material appears. 0.0 means a smooth mirror reflection, 1.0 means fully diffuse. * If roughnessMap is also provided, both values are multiplied. * @type {number} * @default 0.5 */ this.roughness = 0.5; /** * How much the material is like a metal. * Non-metallic materials such as wood or stone use 0.0, metallic use 1.0, with nothing (usually) in between. * A value between 0.0 and 1.0 could be used for a rusty metal look. If metalnessMap is also provided, both values are multiplied. * @type {number} * @default 0.5 */ this.metalness = 0.5; /** * The green channel of this texture is used to alter the roughness of the material. * @type {Texture2D} * @default null */ this.roughnessMap = null; /** * The blue channel of this texture is used to alter the metalness of the material. * @type {Texture2D} * @default null */ this.metalnessMap = null; /** * The strength of a clearcoat layer on a material surface. * When clearcoatFactor is set to 0.0, it indicates that there is no clearcoat present. * When it is set to 1.0, it indicates a very strong clearcoat that- * will cause the reflection and refraction effects on the surface of the object to become more prominent. * @type {number} * @default 0.0 */ this.clearcoat = 0.0; /** * A texture property that allows for the modulation of the strength or roughness of the clearcoat layer. * @type {Texture2D} * @default null */ this.clearcoatMap = null; /** * The roughness of a clearcoat layer on a material surface. * When clearcoatRoughness is set to 0.0, the clearcoat layer will appear perfectly smooth and reflective- * and 0.0 represents a rough, textured clearcoat layer. * Adjusting the clearcoatRoughness can achieve a wide range of effects and create more realistic materials. * @type {number} * @default 0.0 */ this.clearcoatRoughness = 0.0; /** * A texture that will be applied to the clearcoat layer of a material to simulate the roughness of the surface. * @type {Texture2D} * @default null */ this.clearcoatRoughnessMap = null; /** * Adjust the normal map's strength or intensity. * Affect the amount of bumpiness or surface detail that is visible on the clearcoat layer. * Typical ranges are 0-1. * @type {number} * @default 1 */ this.clearcoatNormalScale = new Vector2(1, 1); /** * The texture that modulates the clearcoat layer's surface normal. * @type {Texture2D} * @default null */ this.clearcoatNormalMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.roughness = source.roughness; this.metalness = source.metalness; this.roughnessMap = source.roughnessMap; this.metalnessMap = source.metalnessMap; this.clearcoat = source.clearcoat; this.clearcoatMap = source.clearcoatMap; this.clearcoatRoughness = source.clearcoatRoughness; this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; this.clearcoatNormalScale.copy(source.clearcoatNormalScale); return this; } } /** * A material for shiny surfaces with specular highlights. * The material uses a non-physically based Blinn-Phong model for calculating reflectance. * Unlike the Lambertian model used in the {@link LambertMaterial} this can simulate shiny surfaces with specular highlights (such as varnished wood). * @extends Material */ class PhongMaterial extends Material { /** * Create a PhongMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.PHONG; /** * How shiny the {@link PhongMaterial#specular} highlight is; a higher value gives a sharper highlight. * @type {number} * @default 30 */ this.shininess = 30; /** * Specular color of the material. * This defines how shiny the material is and the color of its shine. * @type {Color3} * @default Color(0x111111) */ this.specular = new Color3(0x111111); /** * The specular map value affects both how much the specular surface highlight contributes and how much of the environment map affects the surface. * @type {Texture2D} * @default null */ this.specularMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.shininess = source.shininess; this.specular.copy(source.specular); this.specularMap = source.specularMap; return this; } } /** * The default material used by Points. * @extends Material */ class PointsMaterial extends Material { /** * Create a PointsMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.POINT; /** * Sets the size of the points. * @type {number} * @default 1 */ this.size = 1; /** * Specify whether points' size is attenuated by the camera depth. (Perspective camera only.) * @type {boolean} * @default true */ this.sizeAttenuation = true; /** * Set draw mode to POINTS. * @type {DRAW_MODE} * @default DRAW_MODE.POINTS */ this.drawMode = DRAW_MODE.POINTS; } copy(source) { super.copy(source); this.size = source.size; this.sizeAttenuation = source.sizeAttenuation; return this; } } /** * RenderTargetBase is an abstract class representing a rendering target, * which encapsulates the configuration for a render pass, * including clear states, attachments, and other rendering parameters. * @extends EventDispatcher * @abstract */ class RenderTargetBase extends EventDispatcher { constructor(width, height) { super(); /** * The width of the render target. * @type {number} */ this.width = width; /** * The height of the render target. * @type {number} */ this.height = height; /** * Whether to clear the color buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearColor = true; /** * Whether to clear the depth buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearDepth = true; /** * Whether to clear the stencil buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearStencil = true; /** * Clear color value. * @type {Color4} */ this.colorClearValue = new Color4(0, 0, 0, 0); /** * Clear depth value. * @type {number} * @default 1 */ this.depthClearValue = 1; /** * Clear stencil value. * @type {number} * @default 0 */ this.stencilClearValue = 0; /** * A querySet that will store the occlusion query results. If null, occlusion queries are disabled. * @type {QuerySet|null} * @default null */ this.occlusionQuerySet = null; /** * An array of objects defining where and when timestamp query values will be written. * @type {object} * @property {QuerySet|null} querySet - A timestamp querySet. If null, timestamp queries are disabled. * @property {number} beginningOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the beginning of the render pass will be written. * @property {number} endOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the end of the render pass will be written. */ this.timestampWrites = { querySet: null, beginningOfPassWriteIndex: 0, endOfPassWriteIndex: 1 }; } /** * Resize the render target to the specified dimensions. * @abstract */ resize() { throw new Error('RenderTargetBase: resize method must be implemented by subclass'); } /** * Dispose the render target. * @abstract */ dispose() { throw new Error('RenderTargetBase: dispose method must be implemented by subclass'); } /** * Sets the clear state. * @param {boolean} [color] - Whether to clear the color buffer. * @param {boolean} [depth] - Whether to clear the depth buffer. * @param {boolean} [stencil] - Whether to clear the stencil buffer. * @returns {RenderTargetBase} A reference to this render target. */ setClear(color, depth, stencil) { this.clearColor = color !== undefined ? color : this.clearColor; this.clearDepth = depth !== undefined ? depth : this.clearDepth; this.clearStencil = stencil !== undefined ? stencil : this.clearStencil; return this; } /** * Sets the clear values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @param {number} a - Alpha channel value between 0.0 and 1.0. * @returns {RenderTargetBase} A reference to this render target. */ setColorClearValue(r, g, b, a) { this.colorClearValue.setRGBA(r, g, b, a); return this; } /** * Sets the clear depth value. * @param {number} depth - The depth value. * @returns {RenderTargetBase} A reference to this render target. */ setDepthClearValue(depth) { this.depthClearValue = depth; return this; } /** * Sets the clear stencil value. * @param {number} stencil - The stencil value. * @returns {RenderTargetBase} A reference to this render target. */ setStencilClearValue(stencil) { this.stencilClearValue = stencil; return this; } /** * Sets the occlusion query set. * @param {QuerySet|null} querySet - The occlusion query set. If null, occlusion queries are disabled. * @returns {RenderTargetBase} A reference to this render target. */ setOcclusionQuerySet(querySet) { this.occlusionQuerySet = querySet; return this; } /** * Sets the timestamp query set and the query indices. * @param {QuerySet|null} querySet - The timestamp query set. If null, timestamp queries are disabled. * @param {number} [beginIndex=0] - The query index in querySet where the timestamp at the beginning of the render pass will be written. * @param {number} [endIndex=1] - The query index in querySet where the timestamp at the end of the render pass will be written. * @returns {RenderTargetBase} A reference to this render target. */ setTimestampWrites(querySet, beginIndex = 0, endIndex = 1) { this.timestampWrites.querySet = querySet; this.timestampWrites.beginningOfPassWriteIndex = beginIndex; this.timestampWrites.endOfPassWriteIndex = endIndex; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RenderTargetBase.prototype.isRenderTarget = true; /** * Render Buffer can be attached to RenderTarget. * @extends EventDispatcher */ class RenderBuffer extends EventDispatcher { /** * @param {number} width - The width of the render buffer. * @param {number} height - The height of the render buffer. * @param {PIXEL_FORMAT} [format=PIXEL_FORMAT.RGBA8] - The internal format of the render buffer. * @param {number} [multipleSampling=0] - If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0) */ constructor(width, height, format = PIXEL_FORMAT.RGBA8, multipleSampling = 0) { super(); /** * The width of the render buffer. * @type {number} */ this.width = width; /** * The height of the render buffer. * @type {number} */ this.height = height; /** * Render buffer texel storage data format. * DEPTH_COMPONENT16: for depth attachments. * DEPTH_STENCIL: for depth stencil attachments. * RGBA8:for multiple sampled color attachments. * DEPTH_COMPONENT16: for multiple sampled depth attachments. * DEPTH24_STENCIL8: for multiple sampled depth stencil attachments. * @type {PIXEL_FORMAT} * @default PIXEL_FORMAT.RGBA8 */ this.format = format; /** * If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0) * A Render Target's attachments must have the same multipleSampling value. * Texture can't be attached to the same render target with a multiple sampled render buffer. * Max support 8. * @type {number} * @default 0 */ this.multipleSampling = multipleSampling; } /** * Resize the render buffer. * @param {number} width - The width of the render buffer. * @param {number} height - The height of the render buffer. * @returns {boolean} - If size changed. */ resize(width, height) { if (this.width !== width || this.height !== height) { this.dispose(); this.width = width; this.height = height; return true; } return false; } /** * Returns a clone of this render buffer. * @returns {RenderBuffer} */ clone() { return new this.constructor().copy(this); } /** * Copy the given render buffer into this render buffer. * @param {RenderBuffer} source - The render buffer to be copied. * @returns {RenderBuffer} */ copy(source) { this.format = source.format; this.multipleSampling = source.multipleSampling; return this; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RenderBuffer.prototype.isRenderBuffer = true; let _textureId = 0; /** * Create a texture to apply to a surface or as a reflection or refraction map. * @abstract * @extends EventDispatcher */ class TextureBase extends EventDispatcher { constructor() { super(); /** * Unique number for this texture instance. * @readonly * @type {number} */ this.id = _textureId++; /** * An object that can be used to store custom data about the {@link TextureBase}. * It should not hold references to functions as these will not be cloned. * @type {object} * @default {} */ this.userData = {}; /** * Array of user-specified mipmaps (optional). * @type {HTMLImageElement[] | object[]} * @default [] */ this.mipmaps = []; /** * WebGLTexture border. * See {@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D WebGLTexture texImage2D()}. * Must be zero. * @type {number} */ this.border = 0; /** * WebGLTexture texel data format. * @type {PIXEL_FORMAT} * @default PIXEL_FORMAT.RGBA */ this.format = PIXEL_FORMAT.RGBA; /** * The default value is null, the texture's internal format will be obtained using a combination of .format and .type. * Users can also specify a specific internalFormat. * @type {null | PIXEL_FORMAT} * @default null */ this.internalformat = null; /** * WebGLTexture texel data type. * @type {PIXEL_TYPE} * @default PIXEL_TYPE.UNSIGNED_BYTE */ this.type = PIXEL_TYPE.UNSIGNED_BYTE; /** * How the texture is sampled when a texel covers more than one pixel. * @type {TEXTURE_FILTER} * @default TEXTURE_FILTER.LINEAR */ this.magFilter = TEXTURE_FILTER.LINEAR; /** * How the texture is sampled when a texel covers less than one pixel. * @type {TEXTURE_FILTER} * @default TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR */ this.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; /** * This defines how the texture is wrapped horizontally and corresponds to U in UV mapping. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * This defines how the texture is wrapped vertically and corresponds to V in UV mapping. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * The number of samples taken along the axis through the pixel that has the highest density of texels. * A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used. * Use {@link WebGLcapabilities#maxAnisotropy} to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2. * @type {number} * @default 1 */ this.anisotropy = 1; /** * Use for shadow sampler (WebGL 2.0 Only). * @type {COMPARE_FUNC | undefined} * @default undefined */ this.compare = undefined; /** * Whether to generate mipmaps (if possible) for a texture. * Set this to false if you are creating mipmaps manually. * @type {boolean} * @default true */ this.generateMipmaps = true; /** * texture pixel encoding. * @type {TEXEL_ENCODING_TYPE} * @default TEXEL_ENCODING_TYPE.LINEAR */ this.encoding = TEXEL_ENCODING_TYPE.LINEAR; /** * If set to true, the texture is flipped along the vertical axis when uploaded to the GPU. * Default is true to flips the image's Y axis to match the WebGL texture coordinate space. * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead. * @type {boolean} * @default true */ this.flipY = true; /** * If set to true, the alpha channel, if present, is multiplied into the color channels when the texture is uploaded to the GPU. * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead. * @type {boolean} * @default false */ this.premultiplyAlpha = false; /** * Specifies the alignment requirements for the start of each pixel row in memory. * The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on double-word boundaries). * @type {number} * @default 4 */ this.unpackAlignment = 4; /** * version code increse if texture changed. * if version is still 0, this texture will be skiped. * @type {number} * @default 0 */ this.version = 0; } /** * Returns a clone of this texture. * @returns {TextureBase} */ clone() { return new this.constructor().copy(this); } /** * Copy the given texture into this texture. * @param {TextureBase} source - The texture to be copied. * @returns {TextureBase} */ copy(source) { this.userData = cloneJson(source.userData); this.mipmaps = source.mipmaps.slice(0); this.border = source.border; this.format = source.format; this.internalformat = source.internalformat; this.type = source.type; this.magFilter = source.magFilter; this.minFilter = source.minFilter; this.wrapS = source.wrapS; this.wrapT = source.wrapT; this.anisotropy = source.anisotropy; this.compare = source.compare; this.generateMipmaps = source.generateMipmaps; this.encoding = source.encoding; this.flipY = source.flipY; this.premultiplyAlpha = source.premultiplyAlpha; this.unpackAlignment = source.unpackAlignment; this.version = source.version; return this; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); this.version = 0; } /** * Resize the texture for use as a render target attachment. * @param {number} width - The new width of the texture. * @param {number} height - The new height of the texture. * @param {number} [depth] - The new depth of the texture. * Only {@link Texture3D} and {@link Texture2DArray} will use this parameter. * If not specified, the depth will not be changed. */ resizeAsAttachment(width, height, depth) {} } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TextureBase.prototype.isTexture = true; /** * Creates a 2d texture. * @extends TextureBase */ class Texture2D extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {null | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | object} * @default null */ this.image = null; } /** * Copy the given 2d texture into this texture. * @param {Texture2D} source - The 2d texture to be copied. * @returns {Texture2D} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height) { if (this.image && this.image.rtt) { if (this.image.width !== width || this.image.height !== height) { this.version++; this.image.width = width; this.image.height = height; } } else { this.version++; this.image = { rtt: true, data: null, width, height }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture2D.prototype.isTexture2D = true; /** * Creates a cube texture. * @extends TextureBase */ class TextureCube extends TextureBase { constructor() { super(); /** * Images data for this texture. * @type {HTMLImageElement[]} * @default [] */ this.images = []; /** * @default false */ this.flipY = false; } /** * Copy the given cube texture into this texture. * @param {TextureCube} source - The cube texture to be copied. * @returns {TextureCube} */ copy(source) { super.copy(source); this.images = source.images.slice(0); return this; } /** * @override */ resizeAsAttachment(width, height) { let changed = false; for (let i = 0; i < 6; i++) { if (this.images[i] && this.images[i].rtt) { if (this.images[i].width !== width || this.images[i].height !== height) { this.images[i].width = width; this.images[i].height = height; changed = true; } } else { this.images[i] = { rtt: true, data: null, width, height }; changed = true; } } if (changed) { this.version++; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TextureCube.prototype.isTextureCube = true; /** * Creates a 3D texture. (WebGL 2.0) * @extends TextureBase */ class Texture3D extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {object} */ this.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 }; /** * This defines how the texture is wrapped in the depth direction. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * @default PIXEL_FORMAT.RED */ this.format = PIXEL_FORMAT.RED; /** * @default PIXEL_TYPE.UNSIGNED_BYTE */ this.type = PIXEL_TYPE.UNSIGNED_BYTE; /** * @default TEXTURE_FILTER.NEAREST */ this.magFilter = TEXTURE_FILTER.NEAREST; /** * @default TEXTURE_FILTER.NEAREST */ this.minFilter = TEXTURE_FILTER.NEAREST; /** * @default false */ this.generateMipmaps = false; /** * @default false */ this.flipY = false; /** * @default 1 */ this.unpackAlignment = 1; } /** * Copy the given 3d texture into this texture. * @param {Texture3D} source - The 3d texture to be copied. * @returns {Texture3D} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height, depth) { const resizeDepth = depth !== undefined; if (this.image && this.image.rtt) { if ( this.image.width !== width || this.image.height !== height || (resizeDepth && this.image.depth !== depth) ) { this.version++; this.image.width = width; this.image.height = height; if (resizeDepth) this.image.depth = depth; } } else { this.version++; const oldDepth = (this.image && this.image.depth) ? this.image.depth : 1; this.image = { rtt: true, data: null, width, height, depth: resizeDepth ? depth : oldDepth }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture3D.prototype.isTexture3D = true; /** * Creates a 2d texture. (WebGL 2.0) * @extends TextureBase */ class Texture2DArray extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {object} * @default null */ this.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 }; /** * @default PIXEL_FORMAT.RED */ this.format = PIXEL_FORMAT.RED; /** * @default TEXTURE_FILTER.NEAREST */ this.magFilter = TEXTURE_FILTER.NEAREST; /** * @default TEXTURE_FILTER.NEAREST */ this.minFilter = TEXTURE_FILTER.NEAREST; /** * @default false */ this.generateMipmaps = false; /** * @default false */ this.flipY = false; /** * @default 1 */ this.unpackAlignment = 1; /** * A set of all layers which need to be updated in the texture. * @type {Set} */ this.layerUpdates = new Set(); } /** * Copy the given 2d texture into this texture. * @param {Texture2DArray} source - The 2d texture to be copied. * @returns {Texture2DArray} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height, depth) { const resizeDepth = depth !== undefined; if (this.image && this.image.rtt) { if ( this.image.width !== width || this.image.height !== height || (resizeDepth && this.image.depth !== depth) ) { this.version++; this.image.width = width; this.image.height = height; if (resizeDepth) this.image.depth = depth; } } else { this.version++; const oldDepth = (this.image && this.image.depth) ? this.image.depth : 1; this.image = { rtt: true, data: null, width, height, depth: resizeDepth ? depth : oldDepth }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture2DArray.prototype.isTexture2DArray = true; /** * Render Target that render to offscreen textures or renderbuffers. * @extends RenderTargetBase */ class OffscreenRenderTarget extends RenderTargetBase { /** * Create a new OffscreenRenderTarget. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. */ constructor(width, height) { super(width, height); /** * The active layer index for rendering. * For cube render targets, this represents the active cube face. * @type {number} * @default 0 */ this.activeLayer = 0; /** * The active mipmap level for rendering. * Not supported in WebGL1. * @type {number} * @default 0 */ this.activeMipmapLevel = 0; this._attachments = {}; } /** * Resize the render target to the specified dimensions. * This will resize all attached attachments. * @param {number} width - The new width of the render target. * @param {number} height - The new height of the render target. * @param {number} [depth] - **DEPRECATED**: Depth parameter is no longer used. * Individual textures manage their own depth dimensions. */ resize(width, height, depth) { if (arguments.length > 2) { console.warn('OffscreenRenderTarget.resize(): The depth parameter is deprecated. ' + 'RenderTarget no longer manages texture depth as it is not required by the rendering backend. ' + 'Use texture.resizeAsAttachment() directly to control texture dimensions.'); } if (this.width === width && this.height === height) return; this.width = width; this.height = height; this.dispose(false); for (const attachment in this._attachments) { const target = this._attachments[attachment]; if (target.isTexture) { target.resizeAsAttachment(width, height); } else { target.resize(width, height); } } } /** * Dispose the render target. * @param {boolean} [disposeAttachments=true] - Whether to dispose attachments as well. */ dispose(disposeAttachments = true) { this.dispatchEvent({ type: 'dispose' }); if (disposeAttachments) { for (const attachment in this._attachments) { this._attachments[attachment].dispose(); } } } /** * Attach a texture(RTT) or renderbuffer to the framebuffer. * Notice: For now, dynamic Attachment during rendering is not supported. * @param {TextureBase|RenderBuffer} target - The texture or renderbuffer to attach. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point. * @returns {OffscreenRenderTarget} Self for chaining. */ attach(target, attachment = ATTACHMENT.COLOR_ATTACHMENT0) { if (target.isTexture) { target.resizeAsAttachment(this.width, this.height); } else { target.resize(this.width, this.height); } this._attachments[attachment] = target; return this; } /** * Detach a texture(RTT) or renderbuffer. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point to detach. * @returns {OffscreenRenderTarget} Self for chaining. */ detach(attachment = ATTACHMENT.COLOR_ATTACHMENT0) { delete this._attachments[attachment]; return this; } /** * Get the attached attachment at the specified attachment point. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point. * @returns {TextureBase|RenderBuffer|null} The attached texture or renderbuffer. */ getAttachment(attachment = ATTACHMENT.COLOR_ATTACHMENT0) { return this._attachments[attachment] || null; } /** * The main texture attachment which is the first color attachment. * @type {TextureBase|null} */ set texture(texture) { if (texture && texture.isTexture) { this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } else { this.detach(ATTACHMENT.COLOR_ATTACHMENT0); } } get texture() { const target = this._attachments[ATTACHMENT.COLOR_ATTACHMENT0]; return target && target.isTexture ? target : null; } /** * An alias for {@link OffscreenRenderTarget#activeLayer}. Specifically represents * the currently rendered cube face (0-5) when using cube textures. * @type {number} */ set activeCubeFace(value) { this.activeLayer = value; } get activeCubeFace() { return this.activeLayer; } /** * Create a simple offscreen render target with a color texture and * a depth-stencil renderbuffer. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create2D(width, height) { const renderTarget = new OffscreenRenderTarget(width, height); renderTarget.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0); renderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); return renderTarget; } /** * Create a simple offscreen render target with a cube color texture and * a depth-stencil renderbuffer. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static createCube(width, height) { const renderTarget = new OffscreenRenderTarget(width, height); renderTarget.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0); renderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); return renderTarget; } /** * Create a simple offscreen render target with a 3D color texture. * Note: No depth-stencil attachment is created by default. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @param {number} depth - The depth of the 3D texture. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create3D(width, height, depth) { const renderTarget = new OffscreenRenderTarget(width, height); const texture = new Texture3D(); texture.resizeAsAttachment(width, height, depth); renderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); return renderTarget; } /** * Create a simple offscreen render target with a 2D array color texture. * Note: No depth-stencil attachment is created by default. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @param {number} depth - The depth of the 2D array texture (number of layers). * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create2DArray(width, height, depth) { const renderTarget = new OffscreenRenderTarget(width, height); const texture = new Texture2DArray(); texture.resizeAsAttachment(width, height, depth); renderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); return renderTarget; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ OffscreenRenderTarget.prototype.isOffscreenRenderTarget = true; /** * Render Target that render to screen (canvas). * @extends RenderTargetBase */ class ScreenRenderTarget extends RenderTargetBase { /** * Create a new ScreenRenderTarget. * @param {HTMLCanvasElement} view - The canvas element which the Render Target rendered to. */ constructor(view) { super(view.width, view.height); /** * The canvas element which the Render Target rendered to. * @type {HTMLCanvasElement} */ this.view = view; } /** * Resizes the render target to the specified dimensions. * This method will set the width and height properties of the canvas. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. */ resize(width, height) { this.view.width = width; this.view.height = height; this.width = width; this.height = height; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ ScreenRenderTarget.prototype.isScreenRenderTarget = true; let _querySetId = 0; /** * A QuerySet holds a set of queries of a particular type. * @extends EventDispatcher */ class QuerySet extends EventDispatcher { /** * Creates a new QuerySet. * @param {QUERYSET_TYPE} type - The type of the query set. * @param {number} count - The number of queries in the set. */ constructor(type, count) { super(); /** * Unique number for this query set instance. * @readonly * @type {number} */ this.id = _querySetId++; /** * The name of the query set. * @type {string} * @default "" */ this.name = ''; /** * The type of the query set. * @readonly * @type {QUERYSET_TYPE} */ this.type = type; /** * The max number of queries in the set. * @readonly * @type {number} */ this.count = count; /** * Indicates whether the query set operates in conservative mode. * This property only applies to occlusion query sets in WebGL renderer. * @type {boolean} * @default true */ this.conservative = true; } /** * Dispose this query set. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * This class is designed to assist with raycasting. Raycasting is used for * mouse picking (working out what objects in the 3d space the mouse is over) * amongst other things. */ class Raycaster { /** * Constructs a new raycaster. * @param {Vector3} origin — The origin vector where the ray casts from. * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray. */ constructor(origin, direction) { /** * The ray used for raycasting. * @type {Ray} */ this.ray = new Ray(origin, direction); } /** * Updates the ray with a new origin and direction by copying the values from the arguments. * @param {Vector3} origin — The origin vector where the ray casts from. * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray. */ set(origin, direction) { // direction is assumed to be normalized (for accurate distance calculations) this.ray.set(origin, direction); } /** * Uses the given coordinates and camera to compute a new origin and direction for the internal ray. * @param {Vector2} coords — 2D coordinates of the mouse, in normalized device coordinates (NDC). * X and Y components should be between `-1` and `1`. * @param {Camera} camera — The camera from which the ray should originate. */ setFromCamera(coords, camera) { if (camera.projectionMatrix.elements[11] === -1) { // perspective this.ray.origin.setFromMatrixPosition(camera.worldMatrix); this.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize(); } else { // orthographic // set origin in plane of camera // projectionMatrix.elements[14] = (near + far) / (near - far) this.ray.origin.set(coords.x, coords.y, camera.projectionMatrix.elements[14]).unproject(camera); this.ray.direction.set(0, 0, -1).transformDirection(camera.worldMatrix); } } /** * Checks all intersection between the ray and the object with or without the * descendants. Intersections are returned sorted by distance, closest first. * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ] * @param {Object3D} object — The 3D object to check for intersection with the ray. * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants. * Otherwise it only checks intersection with the object. * @param {object[]} [intersects=[]] - The target array that holds the result of the method. * @returns {object[]} An array holding the intersection points. */ intersectObject(object, recursive = false, intersects = []) { intersect(object, this, intersects, recursive); intersects.sort(ascSort); return intersects; } /** * Checks all intersection between the ray and the objects with or without * the descendants. Intersections are returned sorted by distance, closest first. * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ] * @param {Object3D[]} objects — The 3D objects to check for intersection with the ray. * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants. * Otherwise it only checks intersection with the object. * @param {object[]} [intersects=[]] - The target array that holds the result of the method. * @returns {object[]} An array holding the intersection points. */ intersectObjects(objects, recursive = false, intersects = []) { for (let i = 0, l = objects.length; i < l; i++) { intersect(objects[i], this, intersects, recursive); } intersects.sort(ascSort); return intersects; } } function ascSort(a, b) { return a.distance - b.distance; } function intersect(object, raycaster, intersects, recursive) { let propagate = true; const result = object.raycast(raycaster.ray, intersects); if (result === false) propagate = false; if (propagate === true && recursive === true) { const children = object.children; for (let i = 0, l = children.length; i < l; i++) { intersect(children[i], raycaster, intersects, true); } } } const _offsetMatrix = new Matrix4(); /** * Use an array of bones to create a skeleton that can be used by a {@link SkinnedMesh}. */ class Skeleton { /** * @param {Bone[]} bones * @param {Matrix4[]} boneInverses */ constructor(bones, boneInverses) { /** * The array of bones. * @type {Bone[]} */ this.bones = bones.slice(0); /** * An array of Matrix4s that represent the inverse of the worldMatrix of the individual bones. * @type {Matrix4[]} */ this.boneInverses = boneInverses; /** * The array buffer holding the bone data. * @type {Float32Array} */ this.boneMatrices = new Float32Array(16 * this.bones.length); /** * The {@link Texture2D} holding the bone data when using a vertex texture. * Use vertex texture to update boneMatrices, by that way, we can use more bones on phone. * @type {Texture2D|undefined} * @default undefined */ this.boneTexture = undefined; this._version = 0; } /** * Returns the skeleton to the base pose. */ pose() { const boneInverses = this.boneInverses; for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; bone.worldMatrix.copy(boneInverses[i]).invert(); } for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; if (bone.parent && bone.parent.isBone) { bone.matrix.copy(bone.parent.worldMatrix).invert(); bone.matrix.multiply(bone.worldMatrix); } else { bone.matrix.copy(bone.worldMatrix); } bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); } } /** * Clone skeleton. * @returns {Skeleton} */ clone() { return new Skeleton(this.bones, this.boneInverses); } /** * Updates the boneMatrices and boneTexture after changing the bones. * This is called automatically if the skeleton is used with a SkinnedMesh. * @ignore */ updateBones(sceneData) { const useAnchorMatrix = sceneData.useAnchorMatrix; const anchorMatrixInverse = sceneData.anchorMatrixInverse; const boneInverses = this.boneInverses; for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; _offsetMatrix.multiplyMatrices(bone.worldMatrix, boneInverses[i]); if (useAnchorMatrix) { _offsetMatrix.premultiply(anchorMatrixInverse); } _offsetMatrix.toArray(this.boneMatrices, i * 16); } if (this.boneTexture !== undefined) { this.boneTexture.version++; } } generateBoneTexture() { let size = MathUtils.nextPowerOfTwoSquareSize(this.bones.length * 4); size = Math.max(size, 4); const boneMatrices = new Float32Array(size * size * 4); boneMatrices.set(this.boneMatrices); const boneTexture = new Texture2D(); boneTexture.image = { data: boneMatrices, width: size, height: size }; boneTexture.format = PIXEL_FORMAT.RGBA; boneTexture.type = PIXEL_TYPE.FLOAT; boneTexture.magFilter = TEXTURE_FILTER.NEAREST; boneTexture.minFilter = TEXTURE_FILTER.NEAREST; boneTexture.generateMipmaps = false; boneTexture.flipY = false; this.boneMatrices = boneMatrices; this.boneTexture = boneTexture; } } /** * This light globally illuminates all objects in the scene equally. * This light cannot be used to cast shadows as it does not have a direction. * @extends Light */ class AmbientLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color, intensity) { super(color, intensity); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ AmbientLight.prototype.isAmbientLight = true; /** * Serves as a base class for the other shadow classes. * @abstract */ class LightShadow { constructor() { /** * The light's view of the world. * This is used to generate a depth map of the scene; objects behind other objects from the light's perspective will be in shadow. * @type {Camera} */ this.camera = new Camera(); /** * Model to shadow camera space, to compute location and depth in shadow map. Stored in a {@link Matrix4}. * This is computed internally during rendering. * @type {Matrix4} */ this.matrix = new Matrix4(); /** * Shadow map bias, how much to add or subtract from the normalized depth when deciding whether a surface is in shadow. * Very tiny adjustments here (in the order of 0.0001) may help reduce artefacts in shadows. * @type {number} * @default 0 */ this.bias = 0; /** * Defines how much the position used to query the shadow map is offset along the object normal. * Increasing this value can be used to reduce shadow acne especially in large scenes where light shines onto geometry at a shallow angle. * The cost is that shadows may appear distorted. * @type {number} * @default 0 */ this.normalBias = 0; /** * Setting this to values greater than 1 will blur the edges of the shadow. * High values will cause unwanted banding effects in the shadows - a greater mapSize will allow for a higher value to be used here before these effects become visible. * Note that this has no effect if the {@link Object3D#shadowType} is set to PCF or PCSS. * @type {number} * @default 1 */ this.radius = 1; /** * Shadow camera near. * @type {number} * @default 1 */ this.cameraNear = 1; /** * Shadow camera far. * @type {number} * @default 500 */ this.cameraFar = 500; /** * A {@link Vector2} defining the width and height of the shadow map. * Higher values give better quality shadows at the cost of computation time. * Values must be powers of 2. * @type {Vector2} * @default Vector2(512, 512) */ this.mapSize = new Vector2(512, 512); /** * Enables automatic updates of the light's shadow. * If you do not require dynamic lighting / shadows, you may set this to false. * @type {boolean} * @default true */ this.autoUpdate = true; /** * When set to true, shadow maps will be updated in the next ShadowMapPass.render call. * If you have set .autoUpdate to false, you will need to set this property to true and then make a ShadowMapPass.render call to update the light's shadow. * @type {boolean} * @default false */ this.needsUpdate = false; this.renderTarget = null; this.map = null; this.depthMap = null; } update(light, face) {} updateMatrix() { const matrix = this.matrix; const camera = this.camera; // matrix * 0.5 + 0.5, after identity, range is 0 ~ 1 instead of -1 ~ 1 matrix.set( 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0 ); matrix.multiply(camera.projectionMatrix); matrix.multiply(camera.viewMatrix); } copy(source) { this.camera.copy(source.camera); this.matrix.copy(source.matrix); this.bias = source.bias; this.normalBias = source.normalBias; this.radius = source.radius; this.cameraNear = source.cameraNear; this.cameraFar = source.cameraFar; this.mapSize.copy(source.mapSize); return this; } clone() { return new this.constructor().copy(this); } prepareDepthMap(_enable, _capabilities) {} } /** * This is used internally by DirectionalLights for calculating shadows. * @extends LightShadow */ class DirectionalLightShadow extends LightShadow { constructor() { super(); /** * The cast shadow window size. * @type {number} * @default 500 */ this.windowSize = 500; /** * Controls the extent to which the shadows fade out at the edge of the frustum. * If the value is greater than 0, the shadow fades out from center to all sides of shadow texture (radial fade out), * if the value is less than 0, the shadow will fade out from the y+ direction (vertical fade out). * @type {number} * @default 0 */ this.frustumEdgeFalloff = 0.0; this.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; const depthTexture = new Texture2D(); depthTexture.type = PIXEL_TYPE.UNSIGNED_INT; depthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT; depthTexture.magFilter = TEXTURE_FILTER.LINEAR; depthTexture.minFilter = TEXTURE_FILTER.LINEAR; depthTexture.compare = COMPARE_FUNC.LESS; depthTexture.generateMipmaps = false; const depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16); this.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); this.map = map; this.depthMap = depthTexture; this._depthBuffer = depthBuffer; } update(light) { this._updateCamera(light); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light) { const camera = this.camera; camera.matrix.copy(light.worldMatrix); camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); camera.updateMatrix(); const halfWindowSize = this.windowSize / 2; camera.setOrtho(-halfWindowSize, halfWindowSize, -halfWindowSize, halfWindowSize, this.cameraNear, this.cameraFar); } copy(source) { super.copy(source); this.windowSize = source.windowSize; this.frustumEdgeFalloff = source.frustumEdgeFalloff; return this; } prepareDepthMap(enable, capabilities) { const useDepthMap = enable && capabilities.version >= 2; const renderTarget = this.renderTarget; const attachments = renderTarget._attachments; const depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap; if (useDepthMap === depthMapAttached) return; if (useDepthMap) { if (capabilities.getExtension('OES_texture_float_linear')) { this.depthMap.type = PIXEL_TYPE.FLOAT; } renderTarget.dispose(); renderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT); } else { renderTarget.dispose(); renderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); } } } /** * A light that gets emitted in a specific direction. * This light will behave as though it is infinitely far away and the rays produced from it are all parallel. * The common use case for this is to simulate daylight; the sun is far enough away that its position can be considered to be infinite, and all light rays coming from it are parallel. * This light can cast shadows - see the {@link DirectionalLightShadow} page for details. * @extends Light */ class DirectionalLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color, intensity) { super(color, intensity); /** * A {@link DirectionalLightShadow} used to calculate shadows for this light. * @type {DirectionalLightShadow} * @default DirectionalLightShadow() */ this.shadow = new DirectionalLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ DirectionalLight.prototype.isDirectionalLight = true; /** * A light source positioned directly above the scene, with color fading from the sky color to the ground color. * This light cannot be used to cast shadows. * @extends Light */ class HemisphereLight extends Light { /** * @param {number} [skyColor=0xffffff] - Hexadecimal color of the sky. * @param {number} [groundColor=0xffffff] - Hexadecimal color of the ground. * @param {number} [intensity=1] - numeric value of the light's strength/intensity. */ constructor(skyColor, groundColor, intensity) { super(skyColor, intensity); /** * Color of the ground. * @type {Color3} * @default Color3(0xffffff) */ this.groundColor = new Color3(groundColor !== undefined ? groundColor : 0xffffff); } copy(source) { super.copy(source); this.groundColor.copy(source.groundColor); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ HemisphereLight.prototype.isHemisphereLight = true; /** * This is used internally by PointLights for calculating shadows. * @extends LightShadow */ class PointLightShadow extends LightShadow { constructor() { super(); this.renderTarget = OffscreenRenderTarget.createCube(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; this.map = map; this._targets = [ new Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1) ]; this._ups = [ new Vector3(0, -1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(0, -1, 0) ]; this._lookTarget = new Vector3(); } update(light, face) { this._updateCamera(light, face); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light, face) { const camera = this.camera; const lookTarget = this._lookTarget; const targets = this._targets; const ups = this._ups; // set camera position and lookAt(rotation) camera.position.setFromMatrixPosition(light.worldMatrix); lookTarget.set(targets[face].x + camera.position.x, targets[face].y + camera.position.y, targets[face].z + camera.position.z); camera.lookAt(lookTarget, ups[face]); // update view matrix camera.updateMatrix(); // update projection camera.setPerspective(90 / 180 * Math.PI, 1, this.cameraNear, this.cameraFar); } } /** * A light that gets emitted from a single point in all directions. * A common use case for this is to replicate the light emitted from a bare lightbulb. * This light can cast shadows - see {@link PointLightShadow} page for details. * @extends Light */ class PointLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [distance=200] * @param {number} [decay=1] */ constructor(color, intensity, distance, decay) { super(color, intensity); /** * The amount the light dims along the distance of the light. * @type {number} * @default 1 */ this.decay = (decay !== undefined) ? decay : 1; /** * The distance from the light where the intensity is 0. * @type {number} * @default 200 */ this.distance = (distance !== undefined) ? distance : 200; /** * A {@link PointLightShadow} used to calculate shadows for this light. * @type {PointLightShadow} * @default PointLightShadow() */ this.shadow = new PointLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ PointLight.prototype.isPointLight = true; /** * This light globally all objects in the scene equally. * This light depends on spherical harmonics. * @extends Light */ class SphericalHarmonicsLight extends Light { /** * Creates a new SphericalHarmonicsLight. * @param {SphericalHarmonics3} [sh = new SphericalHarmonics3()] * @param {number} [intensity = 1] */ constructor(sh = new SphericalHarmonics3(), intensity = 1) { super(undefined, intensity); /** * An instance of SphericalHarmonics3. * @type {SphericalHarmonics3} */ this.sh = sh; } copy(source) { super.copy(source); this.sh.copy(source.sh); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SphericalHarmonicsLight.prototype.isSphericalHarmonicsLight = true; /** * This is used internally by SpotLights for calculating shadows. * @extends LightShadow */ class SpotLightShadow extends LightShadow { constructor() { super(); /** * Controls the extent to which the shadows fade out at the edge of the frustum. * @type {number} * @default 0 */ this.frustumEdgeFalloff = 0.0; this.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; const depthTexture = new Texture2D(); depthTexture.type = PIXEL_TYPE.UNSIGNED_INT; depthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT; depthTexture.magFilter = TEXTURE_FILTER.LINEAR; depthTexture.minFilter = TEXTURE_FILTER.LINEAR; depthTexture.compare = COMPARE_FUNC.LESS; depthTexture.generateMipmaps = false; const depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16); this.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); this.map = map; this.depthMap = depthTexture; this._depthBuffer = depthBuffer; } update(light) { this._updateCamera(light); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light) { const camera = this.camera; camera.matrix.copy(light.worldMatrix); camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); camera.updateMatrix(); camera.setPerspective(light.angle * 2, 1, this.cameraNear, this.cameraFar); } copy(source) { super.copy(source); this.frustumEdgeFalloff = source.frustumEdgeFalloff; return this; } prepareDepthMap(enable, capabilities) { const useDepthMap = enable && capabilities.version >= 2; const renderTarget = this.renderTarget; const attachments = renderTarget._attachments; const depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap; if (useDepthMap === depthMapAttached) return; if (useDepthMap) { if (capabilities.getExtension('OES_texture_float_linear')) { this.depthMap.type = PIXEL_TYPE.FLOAT; } renderTarget.dispose(); renderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT); } else { renderTarget.dispose(); renderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); } } } /** * This light gets emitted from a single point in one direction, along a cone that increases in size the further from the light it gets. * This light can cast shadows - see the {@link SpotLightShadow} page for details. * @extends Light */ class SpotLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [distance=200] * @param {number} [angle=Math.PI/6] * @param {number} [penumbra=0] * @param {number} [decay=1] */ constructor(color, intensity, distance, angle, penumbra, decay) { super(color, intensity); /** * The amount the light dims along the distance of the light. * @type {number} * @default 1 */ this.decay = (decay !== undefined) ? decay : 1; /** * The distance from the light where the intensity is 0. * @type {number} * @default 200 */ this.distance = (distance !== undefined) ? distance : 200; /** * Percent of the spotlight cone that is attenuated due to penumbra. * Takes values between zero and 1. * @type {number} * @default 0 */ this.penumbra = (penumbra !== undefined) ? penumbra : 0; /** * Maximum extent of the spotlight, in radians, from its direction. * Should be no more than Math.PI/2. * @type {number} * @default Math.PI/6 */ this.angle = (angle !== undefined) ? angle : Math.PI / 6; /** * A {@link SpotLightShadow} used to calculate shadows for this light. * @type {SpotLightShadow} * @default SpotLightShadow() */ this.shadow = new SpotLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SpotLight.prototype.isSpotLight = true; /** * A bone which is part of a Skeleton. * The skeleton in turn is used by the SkinnedMesh. * Bones are almost identical to a blank Object3D. * Bone acturely is a joint. * The position means joint position. * Mesh transform is based this joint space. * @extends Object3D */ class Bone extends Object3D { constructor() { super(); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Bone.prototype.isBone = true; /** * A mesh that has a {@link Skeleton} with bones that can then be used to animate the vertices of the geometry. * The material must support skinning. * @extends Mesh */ class SkinnedMesh extends Mesh { constructor(geometry, material) { super(geometry, material); /** * Skeleton created from the bones of the Geometry. * @type {Skeleton} */ this.skeleton = undefined; /** * Either "attached" or "detached". * "attached" uses the {@link SkinnedMesh#worldMatrix} property for the base transform matrix of the bones. * "detached" uses the {@link SkinnedMesh#bindMatrix}. * @type {string} * @default "attached" */ this.bindMode = 'attached'; /** * The base matrix that is used for the bound bone transforms. * @type {Matrix4} */ this.bindMatrix = new Matrix4(); /** * The base matrix that is used for resetting the bound bone transforms. * @type {Matrix4} */ this.bindMatrixInverse = new Matrix4(); } /** * Bind a skeleton to the skinned mesh. * The bindMatrix gets saved to .bindMatrix property and the .bindMatrixInverse gets calculated. * @param {Skeleton} skeleton - Skeleton created from a Bones tree. * @param {Matrix4} [bindMatrix] - Matrix4 that represents the base transform of the skeleton. */ bind(skeleton, bindMatrix) { this.skeleton = skeleton; if (bindMatrix === undefined) { this.updateMatrix(); bindMatrix = this.worldMatrix; } this.bindMatrix.copy(bindMatrix); this.bindMatrixInverse.copy(bindMatrix).invert(); } updateMatrix(force) { super.updateMatrix(force); if (this.bindMode === 'attached') { this.bindMatrixInverse.copy(this.worldMatrix).invert(); } else if (this.bindMode === 'detached') { this.bindMatrixInverse.copy(this.bindMatrix).invert(); } else { console.warn('SkinnedMesh: Unrecognized bindMode: ' + this.bindMode); } } copy(source) { super.copy(source); this.bindMode = source.bindMode; this.bindMatrix.copy(source.bindMatrix); this.bindMatrixInverse.copy(source.bindMatrixInverse); this.skeleton = source.skeleton; return this; } getVertexPosition(index, target) { super.getVertexPosition(index, target); this.applyBoneTransform(index, target); return target; } /** * Applies the bone transform associated with the given index to the given position vector. * Returns the updated vector. * @param {number} index - The index of the vertex. * @param {Vector3} target - The target vector. * @returns {Vector3} The target vector. */ applyBoneTransform(index, target) { const skeleton = this.skeleton; const geometry = this.geometry; const skinIndex = geometry.attributes.skinIndex; const skinWeight = geometry.attributes.skinWeight; _skinIndex.fromArray(skinIndex.buffer.array, index * skinIndex.size); _skinWeight.fromArray(skinWeight.buffer.array, index * skinWeight.size); _basePosition.copy(target).applyMatrix4(this.bindMatrix); target.set(0, 0, 0); for (let i = 0; i < 4; i++) { const weight = getComponent(_skinWeight, i); if (weight < Number.EPSILON) continue; const boneIndex = getComponent(_skinIndex, i); if (!skeleton.bones[boneIndex]) continue; _matrix.multiplyMatrices(skeleton.bones[boneIndex].worldMatrix, skeleton.boneInverses[boneIndex]); target.addScaledVector(_vector.copy(_basePosition).applyMatrix4(_matrix), weight); } return target.applyMatrix4(this.bindMatrixInverse); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SkinnedMesh.prototype.isSkinnedMesh = true; const _basePosition = new Vector3(); const _skinIndex = new Vector4(); const _skinWeight = new Vector4(); const _vector = new Vector3(); const _matrix = new Matrix4(); function getComponent(vec, index) { switch (index) { case 0: return vec.x; case 1: return vec.y; case 2: return vec.z; case 3: return vec.w; default: throw new Error('index is out of range: ' + index); } } var alphaTest_frag = "#ifdef ALPHATEST\n\tif (outColor.a < u_AlphaTest) discard;\n\toutColor.a = u_Opacity;\n#endif"; var alphaTest_pars_frag = "#ifdef ALPHATEST\n\tuniform float u_AlphaTest;\n#endif"; var aoMap_pars_frag = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\tvarying vec2 vAOMapUV;\n#endif"; var aoMap_pars_vert = "#ifdef USE_AOMAP\n\tuniform mat3 aoMapUVTransform;\n\tvarying vec2 vAOMapUV;\n#endif"; var aoMap_vert = "#ifdef USE_AOMAP\n\tvAOMapUV = (aoMapUVTransform * vec3(AOMAP_UV, 1.)).xy;\n#endif"; var aoMap_frag = "\n#ifdef USE_AOMAP\n float ambientOcclusion = (texture2D(aoMap, vAOMapUV).r - 1.0) * aoMapIntensity + 1.0;\n \n reflectedLight.indirectDiffuse *= ambientOcclusion;\n #if defined(USE_ENV_MAP) && defined(USE_PBR)\n float dotNV = saturate(dot(N, V));\n reflectedLight.indirectSpecular *= computeSpecularOcclusion(dotNV, ambientOcclusion, roughness);\n #endif\n#endif"; var begin_frag = "vec4 outColor = vec4(u_Color, u_Opacity);"; var begin_vert = "vec3 transformed = vec3(a_Position);\nvec3 objectNormal = vec3(a_Normal);\n#ifdef USE_TANGENT\n vec3 objectTangent = vec3(a_Tangent.xyz);\n#endif"; var bsdfs = "\nvec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) {\n return RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick(const in vec3 specularColor, const in float dotLH) {\n\tfloat fresnel = exp2((-5.55473 * dotLH - 6.98316) * dotLH);\n\treturn (1.0 - specularColor) * fresnel + specularColor;\n}\nfloat D_BlinnPhong(const in float shininess, const in float dotNH) {\n\treturn RECIPROCAL_PI * (shininess * 0.5 + 1.0) * pow(dotNH, shininess);\n}\nfloat G_BlinnPhong_Implicit() {\n\treturn 0.25;\n}\nvec3 BRDF_Specular_BlinnPhong(vec3 specularColor, vec3 N, vec3 L, vec3 V, float shininess) {\n vec3 H = normalize(L + V);\n float dotNH = saturate(dot(N, H));\n float dotLH = saturate(dot(L, H));\n vec3 F = F_Schlick(specularColor, dotLH);\n float G = G_BlinnPhong_Implicit();\n float D = D_BlinnPhong(shininess, dotNH);\n return F * G * D;\n}\nfloat D_GGX(const in float alpha, const in float dotNH) {\n\tfloat a2 = pow2(alpha);\n\tfloat denom = pow2(dotNH) * (a2 - 1.0) + 1.0;\treturn RECIPROCAL_PI * a2 / pow2(denom);\n}\nfloat G_GGX_SmithCorrelated(const in float alpha, const in float dotNL, const in float dotNV) {\n\tfloat a2 = pow2(alpha);\n\tfloat gv = dotNL * sqrt(a2 + (1.0 - a2) * pow2(dotNV));\n\tfloat gl = dotNV * sqrt(a2 + (1.0 - a2) * pow2(dotNL));\n\treturn 0.5 / max(gv + gl, EPSILON);\n}\nvec3 BRDF_Specular_GGX(vec3 specularColor, vec3 N, vec3 L, vec3 V, float roughness) {\n\tfloat alpha = pow2(roughness);\n\tvec3 H = normalize(L + V);\n\tfloat dotNL = saturate(dot(N, L));\n\tfloat dotNV = saturate(dot(N, V));\n\tfloat dotNH = saturate(dot(N, H));\n\tfloat dotLH = saturate(dot(L, H));\n\tvec3 F = F_Schlick(specularColor, dotLH);\n\tfloat G = G_GGX_SmithCorrelated(alpha, dotNL, dotNV);\n\tfloat D = D_GGX(alpha, dotNH);\n\treturn F * G * D;\n}\nvec2 integrateSpecularBRDF(const in float dotNV, const in float roughness) {\n\tconst vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022);\n\tconst vec4 c1 = vec4(1, 0.0425, 1.04, -0.04);\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y;\n\treturn vec2(-1.04, 1.04) * a004 + r.zw;\n}\nvec3 F_Schlick_RoughnessDependent(const in vec3 F0, const in float dotNV, const in float roughness) {\n\tfloat fresnel = exp2((-5.55473 * dotNV - 6.98316) * dotNV);\n\tvec3 Fr = max(vec3(1.0 - roughness), F0) - F0;\n\treturn Fr * fresnel + F0;\n}\nvec3 BRDF_Specular_GGX_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness) {\n\tfloat dotNV = saturate(dot(N, V));\n\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter) {\n\tfloat dotNV = saturate(dot(N, V));\n\tvec3 F = F_Schlick_RoughnessDependent(specularColor, dotNV, roughness);\n\tvec2 brdf = integrateSpecularBRDF(dotNV, roughness);\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + (1.0 - specularColor) * 0.047619;\tvec3 Fms = FssEss * Favg / (1.0 - Ems * Favg);\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}"; var bumpMap_pars_frag = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd(vec2 uv) {\n\t\tvec2 dSTdx = dFdx( uv );\n\t\tvec2 dSTdy = dFdy( uv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, uv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, uv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, uv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif"; var clippingPlanes_frag = "\n#if NUM_CLIPPING_PLANES > 0\n vec4 plane;\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if ( dot( -v_modelPos, plane.xyz ) > plane.w ) discard;\n }\n #pragma unroll_loop_end\n#endif"; var clippingPlanes_pars_frag = "#if NUM_CLIPPING_PLANES > 0\n uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; var color_frag = "#ifdef USE_VCOLOR_RGB\n outColor.rgb *= v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n outColor *= v_Color;\n#endif"; var color_pars_frag = "#ifdef USE_VCOLOR_RGB\n varying vec3 v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n varying vec4 v_Color;\n#endif"; var color_pars_vert = "#ifdef USE_VCOLOR_RGB\n attribute vec3 a_Color;\n varying vec3 v_Color;\n#endif\n#ifdef USE_VCOLOR_RGBA\n attribute vec4 a_Color;\n varying vec4 v_Color;\n#endif"; var color_vert = "#if defined(USE_VCOLOR_RGB) || defined(USE_VCOLOR_RGBA)\n v_Color = a_Color;\n#endif"; var common_frag = "uniform mat4 u_View;\nuniform float u_Opacity;\nuniform vec3 u_Color;\nuniform vec3 u_CameraPosition;\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};"; var common_vert = "attribute vec3 a_Position;\nattribute vec3 a_Normal;\n#ifdef USE_TANGENT\n\tattribute vec4 a_Tangent;\n#endif\n#include \n#include \nuniform mat4 u_Projection;\nuniform mat4 u_View;\nuniform mat4 u_Model;\nuniform mat4 u_ProjectionView;\nuniform vec3 u_CameraPosition;\n#define EPSILON 1e-6\n#ifdef USE_MORPHTARGETS\n attribute vec3 morphTarget0;\n attribute vec3 morphTarget1;\n attribute vec3 morphTarget2;\n attribute vec3 morphTarget3;\n #ifdef USE_MORPHNORMALS\n \tattribute vec3 morphNormal0;\n \tattribute vec3 morphNormal1;\n \tattribute vec3 morphNormal2;\n \tattribute vec3 morphNormal3;\n #else\n \tattribute vec3 morphTarget4;\n \tattribute vec3 morphTarget5;\n \tattribute vec3 morphTarget6;\n \tattribute vec3 morphTarget7;\n #endif\n#endif\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}"; var diffuseMap_frag = "#ifdef USE_DIFFUSE_MAP\n outColor *= mapTexelToLinear(texture2D(diffuseMap, vDiffuseMapUV));\n#endif"; var diffuseMap_pars_frag = "#ifdef USE_DIFFUSE_MAP\n uniform sampler2D diffuseMap;\n varying vec2 vDiffuseMapUV;\n#endif"; var diffuseMap_vert = "#ifdef USE_DIFFUSE_MAP\n vDiffuseMapUV = (uvTransform * vec3(DIFFUSEMAP_UV, 1.)).xy;\n#endif"; var diffuseMap_pars_vert = "#ifdef USE_DIFFUSE_MAP\n varying vec2 vDiffuseMapUV;\n#endif"; var emissiveMap_frag = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = emissiveMapTexelToLinear(texture2D(emissiveMap, vEmissiveMapUV));\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; var emissiveMap_pars_frag = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n\tvarying vec2 vEmissiveMapUV;\n#endif"; var emissiveMap_vert = "#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUV = (emissiveMapUVTransform * vec3(EMISSIVEMAP_UV, 1.)).xy;\n#endif"; var emissiveMap_pars_vert = "#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapUVTransform;\n\tvarying vec2 vEmissiveMapUV;\n#endif"; var encodings_frag = "gl_FragColor = linearToOutputTexel(gl_FragColor);"; var encodings_pars_frag = "vec4 LinearToLinear(in vec4 value) {\n\treturn value;\n}\nvec4 GammaToLinear(in vec4 value, in float gammaFactor) {\n\treturn vec4(pow(value.xyz, vec3(gammaFactor)), value.w);\n}\nvec4 LinearToGamma(in vec4 value, in float gammaFactor) {\n\treturn vec4(pow(value.xyz, vec3(1.0 / gammaFactor)), value.w);\n}\nvec4 sRGBToLinear(in vec4 value) {\n\treturn vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\n}\nvec4 LinearTosRGB(in vec4 value) {\n\treturn vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\n}"; var end_frag = "gl_FragColor = outColor;"; var envMap_frag = "#ifdef USE_ENV_MAP\n vec3 envDir;\n #ifdef USE_VERTEX_ENVDIR\n envDir = v_EnvDir;\n #else\n envDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\n #endif\n vec4 envColor = textureCube(envMap, vec3(envMapParams.z * envDir.x, envDir.yz));\n envColor = envMapTexelToLinear( envColor );\n #ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutColor = mix(outColor, envColor * outColor, envMapParams.y);\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutColor = mix(outColor, envColor, envMapParams.y);\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutColor += envColor * envMapParams.y;\n\t#endif\n#endif"; var envMap_pars_frag = "#ifdef USE_ENV_MAP\n #ifdef USE_VERTEX_ENVDIR\n varying vec3 v_EnvDir;\n #endif\n uniform samplerCube envMap;\n uniform vec3 envMapParams;\n uniform int maxMipLevel;\n#endif"; var envMap_pars_vert = "#ifdef USE_ENV_MAP\n #ifdef USE_VERTEX_ENVDIR\n varying vec3 v_EnvDir;\n #endif\n#endif"; var envMap_vert = "\n#ifdef USE_ENV_MAP\n #ifdef USE_VERTEX_ENVDIR\n vec3 transformedNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n transformedNormal = normalize(transformedNormal);\n v_EnvDir = reflect(normalize(worldPosition.xyz - u_CameraPosition), transformedNormal);\n #endif\n#endif"; var fog_frag = "#ifdef USE_FOG\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n #ifdef USE_EXP2_FOG\n float fogFactor = 1.0 - exp(-u_FogDensity * u_FogDensity * depth * depth);\n #else\n float fogFactor = smoothstep(u_FogNear, u_FogFar, depth);\n #endif\n gl_FragColor.rgb = mix(gl_FragColor.rgb, u_FogColor, fogFactor);\n#endif"; var fog_pars_frag = "#ifdef USE_FOG\n uniform vec3 u_FogColor;\n #ifdef USE_EXP2_FOG\n uniform float u_FogDensity;\n #else\n uniform float u_FogNear;\n uniform float u_FogFar;\n #endif\n#endif"; var inverse = "mat4 inverseMat4(mat4 m) {\n float\n a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n return mat4(\n a11 * b11 - a12 * b10 + a13 * b09,\n a02 * b10 - a01 * b11 - a03 * b09,\n a31 * b05 - a32 * b04 + a33 * b03,\n a22 * b04 - a21 * b05 - a23 * b03,\n a12 * b08 - a10 * b11 - a13 * b07,\n a00 * b11 - a02 * b08 + a03 * b07,\n a32 * b02 - a30 * b05 - a33 * b01,\n a20 * b05 - a22 * b02 + a23 * b01,\n a10 * b10 - a11 * b08 + a13 * b06,\n a01 * b08 - a00 * b10 - a03 * b06,\n a30 * b04 - a31 * b02 + a33 * b00,\n a21 * b02 - a20 * b04 - a23 * b00,\n a11 * b07 - a10 * b09 - a12 * b06,\n a00 * b09 - a01 * b07 + a02 * b06,\n a31 * b01 - a30 * b03 - a32 * b00,\n a20 * b03 - a21 * b01 + a22 * b00) / det;\n}"; var light_frag = "\n#if (defined(USE_PHONG) || defined(USE_PBR))\n vec3 V = normalize(u_CameraPosition - v_modelPos);\n#endif\n#ifdef USE_PBR\n #ifdef USE_PBR2\n vec3 diffuseColor = outColor.xyz;\n vec3 specularColor = specularFactor.xyz;\n float roughness = max(1.0 - glossinessFactor, 0.0525);\n #else\n vec3 diffuseColor = outColor.xyz * (1.0 - metalnessFactor);\n vec3 specularColor = mix(vec3(0.04), outColor.xyz, metalnessFactor);\n float roughness = max(roughnessFactor, 0.0525);\n #endif\n vec3 dxy = max(abs(dFdx(geometryNormal)), abs(dFdy(geometryNormal)));\n float geometryRoughness = max(max(dxy.x, dxy.y), dxy.z);\n roughness += geometryRoughness;\n roughness = min(roughness, 1.0);\n #ifdef USE_CLEARCOAT\n float clearcoat = u_Clearcoat;\n float clearcoatRoughness = u_ClearcoatRoughness;\n #ifdef USE_CLEARCOATMAP\n\t\t clearcoat *= texture2D(clearcoatMap, v_Uv).x;\n #endif\n #ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\t clearcoatRoughness *= texture2D(clearcoatRoughnessMap, v_Uv).y;\n\t #endif\n clearcoat = saturate(clearcoat);\n clearcoatRoughness = max(clearcoatRoughness, 0.0525);\n\t clearcoatRoughness += geometryRoughness;\n\t clearcoatRoughness = min(clearcoatRoughness, 1.0);\n #endif\n#else\n vec3 diffuseColor = outColor.xyz;\n #ifdef USE_PHONG\n vec3 specularColor = u_SpecularColor.xyz;\n float shininess = u_Specular;\n #endif\n#endif\nvec3 L;\nfloat falloff;\nfloat dotNL;\nvec3 irradiance;\nfloat clearcoatDHR;\n#ifdef USE_CLEARCOAT\n float ccDotNL;\n vec3 ccIrradiance;\n#endif\n#if NUM_DIR_LIGHTS > 0\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_DIR_LIGHTS; i++) {\n L = normalize(-u_Directional[i].direction);\n falloff = 1.0;\n #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_DIR_SHADOWS)\n #ifdef USE_PCSS_SOFT_SHADOW\n falloff *= getShadowWithPCSS(directionalDepthMap[i], directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\n #else\n falloff *= getShadow(directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams);\n #endif\n #endif\n dotNL = saturate(dot(N, L));\n irradiance = u_Directional[i].color * falloff * dotNL * PI;\n #ifdef USE_CLEARCOAT \n ccDotNL = saturate(dot(clearcoatNormal, L));\n ccIrradiance = ccDotNL * u_Directional[i].color * falloff * PI;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n #else\n clearcoatDHR = 0.0;\n #endif\n reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n #ifdef USE_PHONG\n reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n #endif\n #ifdef USE_PBR\n reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n #endif\n }\n #pragma unroll_loop_end\n#endif\n#if NUM_POINT_LIGHTS > 0\n vec3 worldV;\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_POINT_LIGHTS; i++) {\n worldV = v_modelPos - u_Point[i].position;\n L = -worldV;\n falloff = pow(clamp(1. - length(L) / u_Point[i].distance, 0.0, 1.0), u_Point[i].decay);\n L = normalize(L);\n #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_POINT_SHADOWS)\n falloff *= getPointShadow(pointShadowMap[i], vPointShadowCoord[i], u_PointShadow[i].shadowMapSize, u_PointShadow[i].shadowBias, u_PointShadow[i].shadowParams, u_PointShadow[i].shadowCameraRange);\n #endif\n dotNL = saturate(dot(N, L));\n irradiance = u_Point[i].color * falloff * dotNL * PI;\n #ifdef USE_CLEARCOAT \n ccDotNL = saturate(dot(clearcoatNormal, L));\n ccIrradiance = ccDotNL * u_Point[i].color * falloff * PI;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n #else\n clearcoatDHR = 0.0;\n #endif\n reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n #ifdef USE_PHONG\n reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n #endif\n #ifdef USE_PBR\n reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n #endif\n }\n #pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n float lightDistance;\n float angleCos;\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_SPOT_LIGHTS; i++) {\n L = u_Spot[i].position - v_modelPos;\n lightDistance = length(L);\n L = normalize(L);\n angleCos = dot(L, -normalize(u_Spot[i].direction));\n falloff = smoothstep(u_Spot[i].coneCos, u_Spot[i].penumbraCos, angleCos);\n falloff *= pow(clamp(1. - lightDistance / u_Spot[i].distance, 0.0, 1.0), u_Spot[i].decay);\n #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_SPOT_SHADOWS)\n #ifdef USE_PCSS_SOFT_SHADOW\n falloff *= getShadowWithPCSS(spotDepthMap[i], spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\n #else\n falloff *= getShadow(spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams);\n #endif\n #endif\n dotNL = saturate(dot(N, L));\n irradiance = u_Spot[i].color * falloff * dotNL * PI;\n #ifdef USE_CLEARCOAT \n ccDotNL = saturate(dot(clearcoatNormal, L));\n ccIrradiance = ccDotNL * u_Spot[i].color * falloff * PI;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n #else\n clearcoatDHR = 0.0;\n #endif\n reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n #ifdef USE_PHONG\n reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n #endif\n #ifdef USE_PBR\n reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n #endif\n }\n #pragma unroll_loop_end\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n vec3 RectAreaLightDirectSpecular;\n vec3 RectAreaLightDirectDiffuse;\n vec3 rectCoords[4];\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_RECT_AREA_LIGHTS; i++) {\n LTC_RectCoords(u_RectArea[i].position, u_RectArea[i].halfWidth, u_RectArea[i].halfHeight, rectCoords);\n reflectedLight.directDiffuse += u_RectArea[i].color * LTC_Diffuse(diffuseColor, N, V, v_modelPos, rectCoords);\n #ifdef USE_PBR\n reflectedLight.directSpecular += u_RectArea[i].color * LTC_Specular(specularColor, N, V, v_modelPos, rectCoords, roughness);\n #endif\n }\n #pragma unroll_loop_end\n#endif\n#ifdef USE_CLUSTERED_LIGHTS\n vec4 positionView = u_View * vec4(v_modelPos, 1.0);\n float perspectiveFactor = step(0.0, cellsTransformFactors.z);\n float halfFrustumHeight = -cellsTransformFactors.z * mix(1.0, positionView.z, perspectiveFactor);\n float halfFrustumWidth = halfFrustumHeight * cellsTransformFactors.w;\n vec3 cellCoords;\n cellCoords.z = floor(log(-positionView.z) * cellsTransformFactors.x + cellsTransformFactors.y);\n cellCoords.y = floor((positionView.y / (2.0 * halfFrustumHeight) + 0.5) * cells.y);\n cellCoords.x = floor((positionView.x / (2.0 * halfFrustumWidth) + 0.5) * cells.x);\n if(!(any(lessThan(cellCoords, vec3(0.0))) || any(greaterThanEqual(cellCoords, cells)))) {\n float cellIndex = dot(cellsDotData, cellCoords);\n float clusterV = floor(cellIndex * cellsTextureSize.y);\n float clusterU = cellIndex - (clusterV * cellsTextureSize.x);\n int size = textureSize(lightsTexture, 0).x;\n ClusteredPointLight clusteredPointLight;\n ClusteredSpotLight clusteredSpotLight;\n vec3 clusteredLightColor;\n float clusteredLightDistance;\n float clusteredAngleCos;\n for (int lightCellIndex = 0; lightCellIndex < maxLightsPerCell; lightCellIndex++) {\n float lightIndex = texelFetch(cellsTexture, ivec2(int(clusterU) + lightCellIndex, clusterV), 0).x;\n if (lightIndex <= 0.0) break;\n int lightOffset = int(lightIndex - 1.) * 4;\n ivec2 lightDataCoords = ivec2(lightOffset % size, lightOffset / size);\n vec4 lightData0 = texelFetch(lightsTexture, lightDataCoords, 0);\n if (lightData0.x == 1.0) {\n getPointLightFromTexture(lightDataCoords, lightData0, clusteredPointLight);\n L = clusteredPointLight.position - v_modelPos;\n clusteredLightDistance = length(L);\n L = normalize(L);\n falloff = pow(clamp(1. - clusteredLightDistance / clusteredPointLight.distance, 0.0, 1.0), clusteredPointLight.decay);\n clusteredLightColor = clusteredPointLight.color;\n } else if (lightData0.x == 2.0) {\n getSpotLightFromTexture(lightDataCoords, lightData0, clusteredSpotLight);\n L = clusteredSpotLight.position - v_modelPos;\n clusteredLightDistance = length(L);\n L = normalize(L);\n clusteredAngleCos = dot(L, -normalize(clusteredSpotLight.direction));\n falloff = smoothstep(clusteredSpotLight.coneCos, clusteredSpotLight.penumbraCos, clusteredAngleCos);\n falloff *= pow(clamp(1. - clusteredLightDistance / clusteredSpotLight.distance, 0.0, 1.0), clusteredSpotLight.decay);\n clusteredLightColor = clusteredSpotLight.color;\n }\n dotNL = saturate(dot(N, L));\n irradiance = clusteredLightColor * falloff * dotNL * PI;\n #ifdef USE_CLEARCOAT\n ccDotNL = saturate(dot(clearcoatNormal, L));\n ccIrradiance = ccDotNL * clusteredLightColor * falloff * PI;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness);\n #else\n clearcoatDHR = 0.0;\n #endif\n reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor);\n #ifdef USE_PHONG\n reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength;\n #endif\n #ifdef USE_PBR\n reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness);\n #endif\n }\n }\n#endif\nvec3 indirectIrradiance = vec3(0., 0., 0.); \n#ifdef USE_AMBIENT_LIGHT\n indirectIrradiance += u_AmbientLightColor * PI;\n#endif\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n indirectIrradiance += getLightProbeIrradiance(u_SphericalHarmonicsLightData, N);\n#endif\n#if NUM_HEMI_LIGHTS > 0\n float hemiDiffuseWeight;\n #pragma unroll_loop_start\n for (int i = 0; i < NUM_HEMI_LIGHTS; i++) {\n L = normalize(u_Hemi[i].direction);\n dotNL = dot(N, L);\n hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n indirectIrradiance += mix(u_Hemi[i].groundColor, u_Hemi[i].skyColor, hemiDiffuseWeight) * PI;\n }\n #pragma unroll_loop_end\n#endif\nreflectedLight.indirectDiffuse += indirectIrradiance * BRDF_Diffuse_Lambert(diffuseColor);\n#if defined(USE_ENV_MAP) && defined(USE_PBR)\n vec3 iblIrradiance = vec3(0., 0., 0.);\n vec3 indirectRadiance = vec3(0., 0., 0.);\n vec3 clearcoatRadiance = vec3(0., 0., 0.);\n vec3 envDir;\n #ifdef USE_VERTEX_ENVDIR\n envDir = v_EnvDir;\n #else\n envDir = reflect(normalize(v_modelPos - u_CameraPosition), N);\n #endif\n iblIrradiance += getLightProbeIndirectIrradiance(maxMipLevel, N);\n indirectRadiance += getLightProbeIndirectRadiance(roughness, maxMipLevel, N, envDir);\n #ifdef USE_CLEARCOAT\n vec3 clearcoatDir = reflect(normalize(v_modelPos - u_CameraPosition), clearcoatNormal);\n clearcoatRadiance += getLightProbeIndirectRadiance(clearcoatRoughness, maxMipLevel, clearcoatNormal, clearcoatDir);\n #endif\n #ifdef USE_CLEARCOAT\n float ccDotNV = saturate(dot(clearcoatNormal, V));\n reflectedLight.indirectSpecular += clearcoatRadiance * clearcoat * BRDF_Specular_GGX_Environment(clearcoatNormal, V, specularColor, clearcoatRoughness);\n ccDotNL = ccDotNV;\n clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL);\n #else\n clearcoatDHR = 0.0;\n #endif\n float clearcoatInv = 1.0 - clearcoatDHR;\n vec3 singleScattering = vec3(0.0);\n vec3 multiScattering = vec3(0.0);\n vec3 cosineWeightedIrradiance = iblIrradiance * RECIPROCAL_PI;\n BRDF_Specular_Multiscattering_Environment(N, V, specularColor, roughness, singleScattering, multiScattering);\n vec3 diffuse = diffuseColor * (1.0 - (singleScattering + multiScattering));\n reflectedLight.indirectSpecular += clearcoatInv * indirectRadiance * singleScattering;\n reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n#endif"; var light_pars_frag = "#ifdef USE_AMBIENT_LIGHT\n uniform vec3 u_AmbientLightColor;\n#endif\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n uniform vec3 u_SphericalHarmonicsLightData[9];\n#endif\n#ifdef USE_CLEARCOAT\n float clearcoatDHRApprox(const in float roughness, const in float dotNL) {\n return 0.04 + (1.0 - 0.16) * (pow(1.0 - dotNL, 5.0) * pow(1.0 - roughness, 2.0));\n }\n#endif\n#if NUM_HEMI_LIGHTS > 0\n struct HemisphereLight {\n vec3 direction;\n vec3 skyColor;\n\t\tvec3 groundColor;\n };\n uniform HemisphereLight u_Hemi[NUM_HEMI_LIGHTS];\n#endif\n#if NUM_DIR_LIGHTS > 0\n struct DirectLight {\n vec3 direction;\n vec3 color;\n };\n uniform DirectLight u_Directional[NUM_DIR_LIGHTS];\n#endif\n#if NUM_POINT_LIGHTS > 0\n struct PointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n uniform PointLight u_Point[NUM_POINT_LIGHTS];\n#endif\n#if NUM_SPOT_LIGHTS > 0\n struct SpotLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n float coneCos;\n float penumbraCos;\n vec3 direction;\n };\n uniform SpotLight u_Spot[NUM_SPOT_LIGHTS];\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n struct RectAreaLight {\n vec3 position;\n vec3 color;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n };\n uniform RectAreaLight u_RectArea[NUM_RECT_AREA_LIGHTS];\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n void LTC_RectCoords(const in vec3 lightPos, const in vec3 halfWidth, const in vec3 halfHeight, inout vec3 rectCoords[4]) {\n rectCoords[0] = lightPos + halfWidth - halfHeight; rectCoords[1] = lightPos - halfWidth - halfHeight;\n rectCoords[2] = lightPos - halfWidth + halfHeight;\n rectCoords[3] = lightPos + halfWidth + halfHeight;\n }\n vec2 LTC_Uv(const in vec3 N, const in vec3 V, const in float roughness) {\n const float LUT_SIZE = 64.0; \n const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE;\n const float LUT_BIAS = 0.5 / LUT_SIZE;\n float dotNV = saturate(dot(N, V));\n vec2 uv = vec2(roughness, sqrt(1.0 - dotNV));\n uv = uv * LUT_SCALE + LUT_BIAS;\n return uv;\n }\n vec3 LTC_EdgeVectorFormFactor(const in vec3 v1, const in vec3 v2) {\n float x = dot(v1, v2);\n float y = abs(x);\n float a = 0.8543985 + (0.4965155 + 0.0145206 * y) * y;\n float b = 3.4175940 + (4.1616724 + y) * y;\n float v = a / b;\n float theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt(max(1.0 - x * x, 1e-7)) - v;\n return cross(v1, v2) * theta_sintheta;\n }\n float LTC_ClippedSphereFormFactor(const in vec3 f) {\n float l = length(f);\n return max((l * l + f.z) / (l + 1.0), 0.0);\n }\n vec3 LTC_Evaluate(const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[4]) {\n vec3 v1 = rectCoords[1] - rectCoords[0];\n vec3 v2 = rectCoords[3] - rectCoords[0];\n vec3 lightNormal = cross(v1, v2);\n if(dot(lightNormal, P - rectCoords[0]) < 0.0) return vec3(0.0);\n vec3 T1, T2;\n T1 = normalize(V - N * dot(V, N));\n T2 = - cross(N, T1);\n mat3 mat = mInv * mat3(\n T1.x, T2.x, N.x,\n T1.y, T2.y, N.y,\n T1.z, T2.z, N.z\n );\n vec3 coords[4];\n coords[0] = mat * (rectCoords[0] - P);\n coords[1] = mat * (rectCoords[1] - P);\n coords[2] = mat * (rectCoords[2] - P);\n coords[3] = mat * (rectCoords[3] - P);\n coords[0] = normalize(coords[0]);\n coords[1] = normalize(coords[1]);\n coords[2] = normalize(coords[2]);\n coords[3] = normalize(coords[3]);\n vec3 vectorFormFactor = vec3(0.0);\n vectorFormFactor += LTC_EdgeVectorFormFactor(coords[0], coords[1]);\n vectorFormFactor += LTC_EdgeVectorFormFactor(coords[1], coords[2]);\n vectorFormFactor += LTC_EdgeVectorFormFactor(coords[2], coords[3]);\n vectorFormFactor += LTC_EdgeVectorFormFactor(coords[3], coords[0]);\n float result = LTC_ClippedSphereFormFactor(vectorFormFactor);\n return vec3(result);\n }\n vec3 LTC_Diffuse(const in vec3 diffuseColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4]) {\n return diffuseColor * LTC_Evaluate(N, V, P, mat3(1.0), rectCoords);\n }\n vec3 LTC_Specular(const in vec3 specularColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4], const in float roughness) {\n vec2 ltc_uv = LTC_Uv(N, V, roughness);\n vec4 t1 = texture2D(ltc_1, ltc_uv);\n vec4 t2 = texture2D(ltc_2, ltc_uv);\n mat3 mInv = mat3(\n vec3(t1.x, 0, t1.y),\n vec3(0, 1, 0),\n vec3(t1.z, 0, t1.w)\n );\n vec3 fresnel = (specularColor * t2.x + (vec3(1.0) - specularColor) * t2.y);\n return fresnel * LTC_Evaluate(N, V, P, mInv, rectCoords);\n }\n#endif\n#if defined(USE_PBR) && defined(USE_ENV_MAP)\n vec3 getLightProbeIndirectIrradiance(const in int maxMIPLevel, const in vec3 N) {\n vec3 coordVec = vec3(envMapParams.z * N.x, N.yz);\n \t#ifdef TEXTURE_LOD_EXT\n \t\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, float(maxMIPLevel));\n \t#else\n \t\tvec4 envMapColor = textureCube(envMap, coordVec, float(maxMIPLevel));\n \t#endif\n envMapColor = envMapTexelToLinear(envMapColor);\n return PI * envMapColor.rgb * envMapParams.x;\n }\n float getSpecularMIPLevel(const in float roughness, const in int maxMIPLevel) {\n \tfloat maxMIPLevelScalar = float(maxMIPLevel);\n float sigma = PI * roughness * roughness / (1.0 + roughness);\n float desiredMIPLevel = maxMIPLevelScalar + log2(sigma);\n \treturn clamp(desiredMIPLevel, 0.0, maxMIPLevelScalar);\n }\n vec3 getLightProbeIndirectRadiance(const in float roughness, const in int maxMIPLevel, const in vec3 normal, const in vec3 envDir) {\n float specularMIPLevel = getSpecularMIPLevel(roughness, maxMIPLevel);\n vec3 coordVec = normalize(mix(envDir, normal, roughness * roughness));\n coordVec.x *= envMapParams.z;\n #ifdef TEXTURE_LOD_EXT\n \t\tvec4 envMapColor = textureCubeLodEXT(envMap, coordVec, specularMIPLevel);\n \t#else\n \t\tvec4 envMapColor = textureCube(envMap, coordVec, specularMIPLevel);\n \t#endif\n envMapColor = envMapTexelToLinear(envMapColor);\n return envMapColor.rgb * envMapParams.y;\n }\n float computeSpecularOcclusion(const in float dotNV, const in float ambientOcclusion, const in float roughness) {\n \treturn saturate(pow(dotNV + ambientOcclusion, exp2(-16.0 * roughness - 1.0)) - 1.0 + ambientOcclusion);\n }\n#endif\n#ifdef USE_SPHERICALHARMONICS_LIGHT\n vec3 shGetIrradianceAt(in vec3 normal, in vec3 shCoefficients[9]) {\n float x = normal.x, y = normal.y, z = normal.z;\n vec3 result = shCoefficients[0] * 0.886227;\n result += shCoefficients[1] * 2.0 * 0.511664 * y;\n result += shCoefficients[2] * 2.0 * 0.511664 * z;\n result += shCoefficients[3] * 2.0 * 0.511664 * x;\n result += shCoefficients[4] * 2.0 * 0.429043 * x * y;\n result += shCoefficients[5] * 2.0 * 0.429043 * y * z;\n result += shCoefficients[6] * (0.743125 * z * z - 0.247708);\n result += shCoefficients[7] * 2.0 * 0.429043 * x * z;\n result += shCoefficients[8] * 0.429043 * (x * x - y * y);\n return result;\n }\n vec3 getLightProbeIrradiance(const in vec3 lightProbe[9], const in vec3 normal) {\n vec3 irradiance = shGetIrradianceAt(normal, lightProbe);\n return irradiance;\n }\n#endif\n#ifdef USE_CLUSTERED_LIGHTS\n uniform vec3 cells;\n uniform int maxLightsPerCell;\n uniform vec3 cellsDotData;\n uniform vec3 cellsTextureSize;\n uniform vec4 cellsTransformFactors;\n uniform sampler2D cellsTexture;\n uniform sampler2D lightsTexture;\n struct ClusteredPointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n struct ClusteredSpotLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n vec3 direction;\n float coneCos;\n float penumbraCos;\n };\n void getPointLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredPointLight pointLight) {\n vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\n vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\n pointLight.color = lightData1.xyz;\n pointLight.decay = lightData1.w;\n pointLight.position = lightData2.xyz;\n pointLight.distance = lightData2.w;\n }\n void getSpotLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredSpotLight spotLight) {\n vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0);\n vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0);\n vec4 lightData3 = texelFetch(lightsTexture, lightDataCoords + ivec2(3, 0), 0);\n spotLight.color = lightData1.xyz;\n spotLight.decay = lightData1.w;\n spotLight.position = lightData2.xyz;\n spotLight.distance = lightData2.w;\n spotLight.direction = lightData3.xyz;\n spotLight.coneCos = lightData3.w;\n spotLight.penumbraCos = lightData0.y;\n }\n#endif"; var alphamap_pars_frag = "#ifdef USE_ALPHA_MAP\n\tuniform sampler2D alphaMap;\n\tvarying vec2 vAlphaMapUV;\n#endif"; var alphamap_frag = "#ifdef USE_ALPHA_MAP\n\toutColor.a *= texture2D(alphaMap, vAlphaMapUV).g;\n#endif"; var alphamap_pars_vert = "#ifdef USE_ALPHA_MAP\n uniform mat3 alphaMapUVTransform;\n\tvarying vec2 vAlphaMapUV;\n#endif"; var alphamap_vert = "#ifdef USE_ALPHA_MAP\n\tvAlphaMapUV = (alphaMapUVTransform * vec3(ALPHAMAP_UV, 1.)).xy;\n#endif"; var normalMap_pars_frag = "#ifdef USE_NORMAL_MAP\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n#endif\n#if defined(USE_NORMAL_MAP) || defined(USE_CLEARCOAT_NORMALMAP)\n #if defined(USE_TANGENT) && !defined(FLAT_SHADED)\n #define USE_TBN\n #else\n #include \n #endif\n#endif"; var normal_frag = "\n#ifdef FLAT_SHADED\n vec3 fdx = dFdx(v_modelPos);\n vec3 fdy = dFdy(v_modelPos);\n vec3 N = normalize(cross(fdx, fdy));\n#else\n vec3 N = normalize(v_Normal);\n #ifdef DOUBLE_SIDED\n N = N * (float(gl_FrontFacing) * 2.0 - 1.0);\n #endif\n#endif\n#ifdef USE_TBN\n\tvec3 tangent = normalize(v_Tangent);\n\tvec3 bitangent = normalize(v_Bitangent);\n\t#ifdef DOUBLE_SIDED\n\t\ttangent = tangent * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\tbitangent = bitangent * (float(gl_FrontFacing) * 2.0 - 1.0);\n\t#endif\n\tmat3 tspace = mat3(tangent, bitangent, N);\n#endif\nvec3 geometryNormal = N;\n#ifdef USE_NORMAL_MAP\n vec3 mapN = texture2D(normalMap, v_Uv).rgb * 2.0 - 1.0;\n mapN.xy *= normalScale;\n #ifdef USE_TBN\n N = normalize(tspace * mapN);\n #else\n mapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\n N = normalize(tsn(N, v_modelPos, v_Uv) * mapN);\n #endif\n#elif defined(USE_BUMPMAP)\n N = perturbNormalArb(v_modelPos, N, dHdxy_fwd(v_Uv));\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D(clearcoatNormalMap, v_Uv).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TBN\n\t\tclearcoatNormal = normalize(tspace * clearcoatMapN);\n\t#else\n\t\tclearcoatMapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0);\n\t\tclearcoatNormal = normalize(tsn(clearcoatNormal, v_modelPos, v_Uv) * clearcoatMapN);\n\t#endif\n#endif"; var normal_pars_frag = "#ifndef FLAT_SHADED\n varying vec3 v_Normal;\n #ifdef USE_TANGENT\n varying vec3 v_Tangent;\n\t\tvarying vec3 v_Bitangent;\n #endif\n#endif"; var normal_pars_vert = "#ifndef FLAT_SHADED\n varying vec3 v_Normal;\n #ifdef USE_TANGENT\n varying vec3 v_Tangent;\n\t\tvarying vec3 v_Bitangent;\n #endif\n#endif"; var normal_vert = "#ifndef FLAT_SHADED\n v_Normal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n #ifdef FLIP_SIDED\n \tv_Normal = - v_Normal;\n #endif\n #ifdef USE_TANGENT\n v_Tangent = (transposeMat4(inverseMat4(u_Model)) * vec4(objectTangent, 0.0)).xyz;\n #ifdef FLIP_SIDED\n v_Tangent = - v_Tangent;\n #endif\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * a_Tangent.w);\n #endif\n#endif"; var packing = "const float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n vec4 r = vec4( fract( v * PackFactors ), v );\n r.yzw -= r.xyz * ShiftRight8; return r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n return dot( v, UnpackFactors );\n}"; var premultipliedAlpha_frag = "#ifdef USE_PREMULTIPLIED_ALPHA\n gl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a;\n#endif"; var pvm_vert = "vec4 worldPosition = u_Model * vec4(transformed, 1.0);\ngl_Position = u_ProjectionView * worldPosition;"; var dithering_frag = "#if defined( DITHERING )\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; var dithering_pars_frag = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif"; var shadow = "#ifdef USE_SHADOW_SAMPLER\n float computeShadow(sampler2DShadow shadowMap, vec3 shadowCoord) {\n return texture2D( shadowMap, shadowCoord );\n }\n#else\n float computeShadow(sampler2D shadowMap, vec3 shadowCoord) {\n return step(shadowCoord.z, unpackRGBAToDepth(texture2D(shadowMap, shadowCoord.xy)));\n }\n#endif\n#ifdef USE_POISSON_SOFT_SHADOW\n float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n float texelSize = shadowParams.x * 0.5 * shadowMapSizeAndInverse.y;\n vec3 poissonDisk[4];\n poissonDisk[0] = vec3(-0.94201624, -0.39906216, 0);\n poissonDisk[1] = vec3(0.94558609, -0.76890725, 0);\n poissonDisk[2] = vec3(-0.094184101, -0.92938870, 0);\n poissonDisk[3] = vec3(0.34495938, 0.29387760, 0);\n return computeShadow(shadowMap, shadowCoord + poissonDisk[0] * texelSize) * 0.25 +\n computeShadow(shadowMap, shadowCoord + poissonDisk[1] * texelSize) * 0.25 +\n computeShadow(shadowMap, shadowCoord + poissonDisk[2] * texelSize) * 0.25 +\n computeShadow(shadowMap, shadowCoord + poissonDisk[3] * texelSize) * 0.25;\n }\n#elif defined(USE_VOGEL5_SOFT_SHADOW)\n float interleavedGradientNoise(vec2 position) {\n return fract(52.9829189 * fract(dot(position, vec2(0.06711056, 0.00583715))));\n }\n vec2 vogelDiskSample(int sampleIndex, int samplesCount, float phi) {\n const float goldenAngle = 2.399963229728653;\n float r = sqrt((float(sampleIndex) + 0.5) / float(samplesCount));\n float theta = float(sampleIndex) * goldenAngle + phi;\n return vec2(cos(theta), sin(theta)) * r;\n }\n float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n float radius = shadowParams.x * shadowMapSizeAndInverse.y;\n float phi = interleavedGradientNoise(gl_FragCoord.xy) * 6.28318530718;\n float shadow = 0.0;\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(0, 5, phi) * radius, shadowCoord.z));\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(1, 5, phi) * radius, shadowCoord.z));\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(2, 5, phi) * radius, shadowCoord.z));\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(3, 5, phi) * radius, shadowCoord.z));\n shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(4, 5, phi) * radius, shadowCoord.z));\n return shadow * 0.2;\n }\n#elif defined(USE_PCF3_SOFT_SHADOW)\n float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x; uv += 0.5; vec2 st = fract(uv); vec2 base_uv = floor(uv) - 0.5; base_uv *= shadowMapSizeAndInverse.y;\n vec2 uvw0 = 3. - 2. * st;\n vec2 uvw1 = 1. + 2. * st;\n vec2 u = vec2((2. - st.x) / uvw0.x - 1., st.x / uvw1.x + 1.) * shadowMapSizeAndInverse.y;\n vec2 v = vec2((2. - st.y) / uvw0.y - 1., st.y / uvw1.y + 1.) * shadowMapSizeAndInverse.y;\n float shadow = 0.;\n shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\n shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\n shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\n shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\n shadow = shadow / 16.;\n return shadow;\n }\n#elif defined(USE_PCF5_SOFT_SHADOW)\n float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x; uv += 0.5; vec2 st = fract(uv); vec2 base_uv = floor(uv) - 0.5; base_uv *= shadowMapSizeAndInverse.y;\n vec2 uvw0 = 4. - 3. * st;\n vec2 uvw1 = vec2(7.);\n vec2 uvw2 = 1. + 3. * st;\n vec3 u = vec3((3. - 2. * st.x) / uvw0.x - 2., (3. + st.x) / uvw1.x, st.x / uvw2.x + 2.) * shadowMapSizeAndInverse.y;\n vec3 v = vec3((3. - 2. * st.y) / uvw0.y - 2., (3. + st.y) / uvw1.y, st.y / uvw2.y + 2.) * shadowMapSizeAndInverse.y;\n float shadow = 0.;\n shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z));\n shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z));\n shadow += uvw2.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[0]), shadowCoord.z));\n shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z));\n shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z));\n shadow += uvw2.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[1]), shadowCoord.z));\n shadow += uvw0.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[2]), shadowCoord.z));\n shadow += uvw1.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[2]), shadowCoord.z));\n shadow += uvw2.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[2]), shadowCoord.z));\n shadow = shadow / 144.;\n return shadow;\n }\n#else\n float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) {\n return computeShadow(shadowSampler, shadowCoord);\n }\n#endif\nfloat computeFallOff(float value, vec2 clipSpace, float frustumEdgeFalloff) {\n float factor = mix(clipSpace.y * abs(clipSpace.y), dot(clipSpace, clipSpace), step(0., frustumEdgeFalloff));\n float mask = smoothstep(1.0 - abs(frustumEdgeFalloff), 1.00000012, clamp(factor, 0., 1.));\n return mix(value, 1.0, mask);\n}\nfloat getShadow(sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias.x;\n bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\n bool inFrustum = all(inFrustumVec);\n bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\n bool frustumTest = all(frustumTestVec);\n float shadow = 1.0;\n if (frustumTest) {\n vec2 shadowMapSizeAndInverse = vec2(shadowMapSize.x, 1. / shadowMapSize.x);\n shadow = computeShadowWithPCF(shadowMap, shadowCoord.xyz, shadowMapSizeAndInverse, shadowParams);\n shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\n }\n return shadow;\n}\nfloat textureCubeCompare(samplerCube depths, vec3 uv, float compare) {\n return step(compare, unpackRGBAToDepth(textureCube(depths, uv)));\n}\nfloat getPointShadow(samplerCube shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams, vec2 shadowCameraRange) {\n float shadow = 1.0;\n vec3 lightToPosition = shadowCoord.xyz;\n float lightToPositionLength = length(lightToPosition);\n if (lightToPositionLength - shadowCameraRange.y <= 0.0 && lightToPositionLength - shadowCameraRange.x >= 0.0) {\n float dp = (lightToPositionLength - shadowCameraRange.x) / (shadowCameraRange.y - shadowCameraRange.x);\n dp += shadowBias.x;\n\t\tvec3 bd3D = normalize(lightToPosition);\n #ifdef USE_HARD_SHADOW\n shadow = textureCubeCompare(shadowMap, bd3D, dp);\n #else\n float texelSize = shadowParams.x * 0.5 / shadowMapSize.x;\n vec2 offset = vec2(-1.0, 1.0) * texelSize;\n shadow = (\n textureCubeCompare(shadowMap, bd3D + offset.xyy, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.yyy, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.xyx, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.yyx, dp) +\n textureCubeCompare(shadowMap, bd3D, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.xxy, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.yxy, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.xxx, dp) +\n textureCubeCompare(shadowMap, bd3D + offset.yxx, dp)\n ) * (1.0 / 9.0);\n #endif\n }\n return shadow;\n}\n#ifdef USE_PCSS_SOFT_SHADOW\n const vec3 PoissonSamplers32[64] = vec3[64](\n vec3(0.06407013, 0.05409927, 0.),\n vec3(0.7366577, 0.5789394, 0.),\n vec3(-0.6270542, -0.5320278, 0.),\n vec3(-0.4096107, 0.8411095, 0.),\n vec3(0.6849564, -0.4990818, 0.),\n vec3(-0.874181, -0.04579735, 0.),\n vec3(0.9989998, 0.0009880066, 0.),\n vec3(-0.004920578, -0.9151649, 0.),\n vec3(0.1805763, 0.9747483, 0.),\n vec3(-0.2138451, 0.2635818, 0.),\n vec3(0.109845, 0.3884785, 0.),\n vec3(0.06876755, -0.3581074, 0.),\n vec3(0.374073, -0.7661266, 0.),\n vec3(0.3079132, -0.1216763, 0.),\n vec3(-0.3794335, -0.8271583, 0.),\n vec3(-0.203878, -0.07715034, 0.),\n vec3(0.5912697, 0.1469799, 0.),\n vec3(-0.88069, 0.3031784, 0.),\n vec3(0.5040108, 0.8283722, 0.),\n vec3(-0.5844124, 0.5494877, 0.),\n vec3(0.6017799, -0.1726654, 0.),\n vec3(-0.5554981, 0.1559997, 0.),\n vec3(-0.3016369, -0.3900928, 0.),\n vec3(-0.5550632, -0.1723762, 0.),\n vec3(0.925029, 0.2995041, 0.),\n vec3(-0.2473137, 0.5538505, 0.),\n vec3(0.9183037, -0.2862392, 0.),\n vec3(0.2469421, 0.6718712, 0.),\n vec3(0.3916397, -0.4328209, 0.),\n vec3(-0.03576927, -0.6220032, 0.),\n vec3(-0.04661255, 0.7995201, 0.),\n vec3(0.4402924, 0.3640312, 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.),\n vec3(0., 0., 0.)\n );\n const vec3 PoissonSamplers64[64] = vec3[64](\n vec3(-0.613392, 0.617481, 0.),\n vec3(0.170019, -0.040254, 0.),\n vec3(-0.299417, 0.791925, 0.),\n vec3(0.645680, 0.493210, 0.),\n vec3(-0.651784, 0.717887, 0.),\n vec3(0.421003, 0.027070, 0.),\n vec3(-0.817194, -0.271096, 0.),\n vec3(-0.705374, -0.668203, 0.),\n vec3(0.977050, -0.108615, 0.),\n vec3(0.063326, 0.142369, 0.),\n vec3(0.203528, 0.214331, 0.),\n vec3(-0.667531, 0.326090, 0.),\n vec3(-0.098422, -0.295755, 0.),\n vec3(-0.885922, 0.215369, 0.),\n vec3(0.566637, 0.605213, 0.),\n vec3(0.039766, -0.396100, 0.),\n vec3(0.751946, 0.453352, 0.),\n vec3(0.078707, -0.715323, 0.),\n vec3(-0.075838, -0.529344, 0.),\n vec3(0.724479, -0.580798, 0.),\n vec3(0.222999, -0.215125, 0.),\n vec3(-0.467574, -0.405438, 0.),\n vec3(-0.248268, -0.814753, 0.),\n vec3(0.354411, -0.887570, 0.),\n vec3(0.175817, 0.382366, 0.),\n vec3(0.487472, -0.063082, 0.),\n vec3(-0.084078, 0.898312, 0.),\n vec3(0.488876, -0.783441, 0.),\n vec3(0.470016, 0.217933, 0.),\n vec3(-0.696890, -0.549791, 0.),\n vec3(-0.149693, 0.605762, 0.),\n vec3(0.034211, 0.979980, 0.),\n vec3(0.503098, -0.308878, 0.),\n vec3(-0.016205, -0.872921, 0.),\n vec3(0.385784, -0.393902, 0.),\n vec3(-0.146886, -0.859249, 0.),\n vec3(0.643361, 0.164098, 0.),\n vec3(0.634388, -0.049471, 0.),\n vec3(-0.688894, 0.007843, 0.),\n vec3(0.464034, -0.188818, 0.),\n vec3(-0.440840, 0.137486, 0.),\n vec3(0.364483, 0.511704, 0.),\n vec3(0.034028, 0.325968, 0.),\n vec3(0.099094, -0.308023, 0.),\n vec3(0.693960, -0.366253, 0.),\n vec3(0.678884, -0.204688, 0.),\n vec3(0.001801, 0.780328, 0.),\n vec3(0.145177, -0.898984, 0.),\n vec3(0.062655, -0.611866, 0.),\n vec3(0.315226, -0.604297, 0.),\n vec3(-0.780145, 0.486251, 0.),\n vec3(-0.371868, 0.882138, 0.),\n vec3(0.200476, 0.494430, 0.),\n vec3(-0.494552, -0.711051, 0.),\n vec3(0.612476, 0.705252, 0.),\n vec3(-0.578845, -0.768792, 0.),\n vec3(-0.772454, -0.090976, 0.),\n vec3(0.504440, 0.372295, 0.),\n vec3(0.155736, 0.065157, 0.),\n vec3(0.391522, 0.849605, 0.),\n vec3(-0.620106, -0.328104, 0.),\n vec3(0.789239, -0.419965, 0.),\n vec3(-0.545396, 0.538133, 0.),\n vec3(-0.178564, -0.596057, 0.)\n );\n float getRand(vec2 seed) {\n return fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) * 43758.5453);\n }\n float computeShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowSampler, vec3 shadowCoord, float shadowMapSizeInverse, float lightSizeUV, int searchTapCount, int pcfTapCount, vec3[64] poissonSamplers) {\n float depthMetric = shadowCoord.z;\n float blockerDepth = 0.0;\n float sumBlockerDepth = 0.0;\n float numBlocker = 0.0;\n for (int i = 0; i < searchTapCount; i++) {\n blockerDepth = unpackRGBAToDepth(texture(depthSampler, shadowCoord.xy + (lightSizeUV * shadowMapSizeInverse * PoissonSamplers32[i].xy)));\n if (blockerDepth < depthMetric) {\n sumBlockerDepth += blockerDepth;\n numBlocker++;\n }\n }\n if (numBlocker < 1.0) {\n return 1.0;\n }\n float avgBlockerDepth = sumBlockerDepth / numBlocker;\n float AAOffset = shadowMapSizeInverse * 10.;\n float penumbraRatio = ((depthMetric - avgBlockerDepth) + AAOffset);\n float filterRadius = penumbraRatio * lightSizeUV * shadowMapSizeInverse;\n float random = getRand(shadowCoord.xy); float rotationAngle = random * 3.1415926;\n vec2 rotationVector = vec2(cos(rotationAngle), sin(rotationAngle));\n float shadow = 0.;\n for (int i = 0; i < pcfTapCount; i++) {\n vec3 offset = poissonSamplers[i];\n offset = vec3(offset.x * rotationVector.x - offset.y * rotationVector.y, offset.y * rotationVector.x + offset.x * rotationVector.y, 0.);\n shadow += texture(shadowSampler, shadowCoord + offset * filterRadius);\n }\n shadow /= float(pcfTapCount);\n shadow = mix(shadow, 1., depthMetric - avgBlockerDepth);\n return shadow;\n }\n float getShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) {\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias.x;\n bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0);\n bool inFrustum = all(inFrustumVec);\n bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0);\n bool frustumTest = all(frustumTestVec);\n float shadow = 1.0;\n if (frustumTest) {\n #ifdef USE_PCSS16_SOFT_SHADOW\n shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 16, PoissonSamplers32);\n #else\n #ifdef USE_PCSS32_SOFT_SHADOW\n shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 32, PoissonSamplers32);\n #else\n shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 32, 64, PoissonSamplers64);\n #endif\n #endif\n shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y);\n }\n return shadow;\n }\n#endif"; var shadowMap_frag = "#ifdef USE_SHADOW\n#endif"; var shadowMap_pars_frag = "#ifdef USE_SHADOW\n\t#if NUM_DIR_SHADOWS > 0\n\t\tuniform sampler2DShadow directionalShadowMap[NUM_DIR_SHADOWS];\n\t\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\n\t\t#ifdef USE_PCSS_SOFT_SHADOW\n\t\t\tuniform sampler2D directionalDepthMap[NUM_DIR_SHADOWS];\n\t\t#endif\n\t\tstruct DirectLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\n\t#endif\n\t#if NUM_POINT_SHADOWS > 0\n\t\tuniform samplerCube pointShadowMap[NUM_POINT_SHADOWS];\n\t\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\n\t\tstruct PointLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t\tvec2 shadowCameraRange;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\n\t#endif\n\t#if NUM_SPOT_SHADOWS > 0\n\t\tuniform sampler2DShadow spotShadowMap[NUM_SPOT_SHADOWS];\n\t\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\n\t\t#ifdef USE_PCSS_SOFT_SHADOW\n\t\t\tuniform sampler2D spotDepthMap[NUM_SPOT_SHADOWS];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\n\t#endif\n\t#include \n\t#include \n#endif"; var shadowMap_pars_vert = "#ifdef USE_SHADOW\n\t#if NUM_DIR_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[NUM_DIR_SHADOWS];\n\t\tvarying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS];\n\t\tstruct DirectLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS];\n\t#endif\n\t#if NUM_POINT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[NUM_POINT_SHADOWS];\n\t\tvarying vec4 vPointShadowCoord[NUM_POINT_SHADOWS];\n\t\tstruct PointLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t\tvec2 shadowCameraRange;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS];\n\t#endif\n\t#if NUM_SPOT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[NUM_SPOT_SHADOWS];\n\t\tvarying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS];\n\t\tstruct SpotLightShadow {\n\t\t\tvec2 shadowBias;\n\t\t\tvec2 shadowMapSize;\n\t\t\tvec2 shadowParams;\n\t\t};\n\t\tuniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS];\n\t#endif\n#endif"; var shadowMap_vert = "\n#ifdef USE_SHADOW\n\tvec3 shadowWorldNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz;\n\tshadowWorldNormal = normalize(shadowWorldNormal);\n\t#ifdef FLIP_SIDED\n\t\tshadowWorldNormal = -shadowWorldNormal;\n\t#endif\n\tvec4 shadowWorldPosition;\n\t#if NUM_DIR_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_DIR_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_DirectionalShadow[i].shadowBias[1], 0);\n\t\t\tvDirectionalShadowCoord[i] = directionalShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_POINT_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_PointShadow[i].shadowBias[1], 0);\n\t\t\tvPointShadowCoord[i] = pointShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor (int i = 0; i < NUM_SPOT_SHADOWS; i++) {\n\t\t\tshadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_SpotShadow[i].shadowBias[1], 0);\n\t\t\tvSpotShadowCoord[i] = spotShadowMatrix[i] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif"; var morphnormal_vert = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif"; var morphtarget_pars_vert = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif"; var morphtarget_vert = "#ifdef USE_MORPHTARGETS\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n transformed += morphTarget4 * morphTargetInfluences[ 4 ];\n transformed += morphTarget5 * morphTargetInfluences[ 5 ];\n transformed += morphTarget6 * morphTargetInfluences[ 6 ];\n transformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif"; var skinning_pars_vert = "#ifdef USE_SKINNING\n attribute vec4 skinIndex;\n\tattribute vec4 skinWeight;\n uniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n #ifdef BONE_TEXTURE\n uniform sampler2D boneTexture;\n uniform int boneTextureSize;\n mat4 getBoneMatrix( const in float i ) {\n float j = i * 4.0;\n float x = mod( j, float( boneTextureSize ) );\n float y = floor( j / float( boneTextureSize ) );\n float dx = 1.0 / float( boneTextureSize );\n float dy = 1.0 / float( boneTextureSize );\n y = dy * ( y + 0.5 );\n vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n mat4 bone = mat4( v1, v2, v3, v4 );\n return bone;\n }\n #else\n uniform mat4 boneMatrices[MAX_BONES];\n mat4 getBoneMatrix(const in float i) {\n mat4 bone = boneMatrices[int(i)];\n return bone;\n }\n #endif\n#endif"; var skinning_vert = "#ifdef USE_SKINNING\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n vec4 skinVertex = bindMatrix * vec4(transformed, 1.0);\n vec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n transformed = skinned.xyz / skinned.w;\n#endif"; var skinnormal_vert = "#ifdef USE_SKINNING\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n #ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif"; var specularMap_frag = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, v_Uv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; var specularMap_pars_frag = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; var transpose = "mat4 transposeMat4(mat4 inMatrix) {\n vec4 i0 = inMatrix[0];\n vec4 i1 = inMatrix[1];\n vec4 i2 = inMatrix[2];\n vec4 i3 = inMatrix[3];\n mat4 outMatrix = mat4(\n vec4(i0.x, i1.x, i2.x, i3.x),\n vec4(i0.y, i1.y, i2.y, i3.y),\n vec4(i0.z, i1.z, i2.z, i3.z),\n vec4(i0.w, i1.w, i2.w, i3.w)\n );\n return outMatrix;\n}"; var tsn = "mat3 tsn(vec3 N, vec3 V, vec2 uv) {\n vec3 q0 = dFdx(V.xyz);\n vec3 q1 = dFdy(V.xyz);\n vec2 st0 = dFdx(uv.xy);\n vec2 st1 = dFdy(uv.xy);\n float scale = sign(st1.y * st0.x - st0.y * st1.x);\n vec3 S = normalize((q0 * st1.y - q1 * st0.y) * scale);\n vec3 T = normalize((-q0 * st1.x + q1 * st0.x) * scale);\n return mat3(S, T, N);\n}"; var uv_pars_frag = "#ifdef USE_UV1\n varying vec2 v_Uv;\n#endif"; var uv_pars_vert = "#if defined(USE_UV) || defined(USE_UV1)\n uniform mat3 uvTransform;\n#endif\n#ifdef USE_UV1\n attribute vec2 a_Uv;\n varying vec2 v_Uv;\n#endif"; var uv_vert = "#ifdef USE_UV1\n v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy;\n#endif"; var modelPos_pars_frag = "varying vec3 v_modelPos;"; var modelPos_pars_vert = "varying vec3 v_modelPos;"; var modelPos_vert = "\nv_modelPos = worldPosition.xyz;"; var logdepthbuf_frag = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; var logdepthbuf_pars_frag = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif"; var logdepthbuf_pars_vert = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tuniform float logDepthCameraNear;\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t\tuniform float logDepthCameraNear;\n\t#endif\n#endif"; var logdepthbuf_vert = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w - logDepthCameraNear;\n\t\tvIsPerspective = float( isPerspectiveMatrix( u_Projection ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( u_Projection ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w - logDepthCameraNear + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif"; var clearcoat_pars_frag = "#ifdef USE_CLEARCOAT\n\tuniform float u_Clearcoat;\n\tuniform float u_ClearcoatRoughness;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif"; const ShaderChunk = { alphaTest_frag: alphaTest_frag, alphaTest_pars_frag: alphaTest_pars_frag, aoMap_pars_frag: aoMap_pars_frag, aoMap_pars_vert: aoMap_pars_vert, aoMap_vert: aoMap_vert, aoMap_frag: aoMap_frag, begin_frag: begin_frag, begin_vert: begin_vert, bsdfs: bsdfs, bumpMap_pars_frag: bumpMap_pars_frag, clippingPlanes_frag: clippingPlanes_frag, clippingPlanes_pars_frag: clippingPlanes_pars_frag, color_frag: color_frag, color_pars_frag: color_pars_frag, color_pars_vert: color_pars_vert, color_vert: color_vert, common_frag: common_frag, common_vert: common_vert, diffuseMap_frag: diffuseMap_frag, diffuseMap_pars_frag: diffuseMap_pars_frag, diffuseMap_vert: diffuseMap_vert, diffuseMap_pars_vert: diffuseMap_pars_vert, emissiveMap_frag: emissiveMap_frag, emissiveMap_pars_frag: emissiveMap_pars_frag, emissiveMap_vert: emissiveMap_vert, emissiveMap_pars_vert: emissiveMap_pars_vert, encodings_frag: encodings_frag, encodings_pars_frag: encodings_pars_frag, end_frag: end_frag, envMap_frag: envMap_frag, envMap_pars_frag: envMap_pars_frag, envMap_pars_vert: envMap_pars_vert, envMap_vert: envMap_vert, fog_frag: fog_frag, fog_pars_frag: fog_pars_frag, inverse: inverse, light_frag: light_frag, light_pars_frag: light_pars_frag, alphamap_pars_frag: alphamap_pars_frag, alphamap_frag: alphamap_frag, alphamap_pars_vert: alphamap_pars_vert, alphamap_vert: alphamap_vert, normalMap_pars_frag: normalMap_pars_frag, normal_frag: normal_frag, normal_pars_frag: normal_pars_frag, normal_pars_vert: normal_pars_vert, normal_vert: normal_vert, packing: packing, premultipliedAlpha_frag: premultipliedAlpha_frag, pvm_vert: pvm_vert, dithering_frag: dithering_frag, dithering_pars_frag: dithering_pars_frag, shadow: shadow, shadowMap_frag: shadowMap_frag, shadowMap_pars_frag: shadowMap_pars_frag, shadowMap_pars_vert: shadowMap_pars_vert, shadowMap_vert: shadowMap_vert, morphnormal_vert: morphnormal_vert, morphtarget_pars_vert: morphtarget_pars_vert, morphtarget_vert: morphtarget_vert, skinning_pars_vert: skinning_pars_vert, skinning_vert: skinning_vert, skinnormal_vert: skinnormal_vert, specularMap_frag: specularMap_frag, specularMap_pars_frag: specularMap_pars_frag, transpose: transpose, tsn: tsn, uv_pars_frag: uv_pars_frag, uv_pars_vert: uv_pars_vert, uv_vert: uv_vert, modelPos_pars_frag: modelPos_pars_frag, modelPos_pars_vert: modelPos_pars_vert, modelPos_vert: modelPos_vert, logdepthbuf_frag: logdepthbuf_frag, logdepthbuf_pars_frag: logdepthbuf_pars_frag, logdepthbuf_pars_vert: logdepthbuf_pars_vert, logdepthbuf_vert: logdepthbuf_vert, clearcoat_pars_frag: clearcoat_pars_frag }; var basic_frag = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n #include \n #include \n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n reflectedLight.indirectDiffuse += vec3(1.0);\n #include \n reflectedLight.indirectDiffuse *= outColor.xyz;\n outColor.xyz = reflectedLight.indirectDiffuse;\n #if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n}"; var basic_vert = "#include \n#include \n#include \n#include \n#include \n#if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR)\n #include \n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #ifdef USE_ENV_MAP\n #include \n #include \n #ifndef USE_VERTEX_ENVDIR\n #include \n #endif \n #endif\n #include \n #include \n #include \n}"; var depth_frag = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n vec4 texelColor = texture2D( diffuseMap, v_Uv );\n float alpha = texelColor.a * u_Opacity;\n if(alpha < u_AlphaTest) discard;\n #endif\n #include \n \n #ifdef DEPTH_PACKING_RGBA\n gl_FragColor = packDepthToRGBA(gl_FragCoord.z);\n #else\n gl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), u_Opacity );\n #endif\n}"; var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var distance_frag = "#include \nuniform float nearDistance;\nuniform float farDistance;\n#include \n#include \n#include \nvoid main() {\n #include \n \n float dist = length( v_modelPos - u_CameraPosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n gl_FragColor = packDepthToRGBA(dist);\n}"; var distance_vert = "#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n}"; var lambert_frag = "#define USE_LAMBERT\n#include \n#include \nuniform vec3 emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n #include \n #include \n outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n #include \n #include \n vec3 totalEmissiveRadiance = emissive;\n #include \n outColor.xyz += totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n}"; var lambert_vert = "#define USE_LAMBERT\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var normaldepth_frag = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST)\n vec4 texelColor = texture2D( diffuseMap, v_Uv );\n float alpha = texelColor.a * u_Opacity;\n if(alpha < u_AlphaTest) discard;\n #endif\n #include \n vec4 packedNormalDepth;\n packedNormalDepth.xyz = normalize(v_Normal) * 0.5 + 0.5;\n packedNormalDepth.w = gl_FragCoord.z;\n gl_FragColor = packedNormalDepth;\n}"; var normaldepth_vert = "#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var pbr_frag = "#define USE_PBR\n#include \n#include \nuniform float u_Metalness;\n#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif\nuniform float u_Roughness;\n#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif\nuniform vec3 emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n float roughnessFactor = u_Roughness;\n #ifdef USE_ROUGHNESSMAP\n \tvec4 texelRoughness = texture2D( roughnessMap, v_Uv );\n \troughnessFactor *= texelRoughness.g;\n #endif\n float metalnessFactor = u_Metalness;\n #ifdef USE_METALNESSMAP\n \tvec4 texelMetalness = texture2D( metalnessMap, v_Uv );\n \tmetalnessFactor *= texelMetalness.b;\n #endif\n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n #include \n #include \n outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n vec3 totalEmissiveRadiance = emissive;\n #include \n outColor.xyz += totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n}"; var pbr2_frag = "#define USE_PBR\n#define USE_PBR2\n#include \n#include \nuniform vec3 u_SpecularColor;\n#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif\nuniform float glossiness;\n#ifdef USE_GLOSSINESSMAP\n\tuniform sampler2D glossinessMap;\n#endif\nuniform vec3 emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 specularFactor = u_SpecularColor;\n #ifdef USE_SPECULARMAP\n vec4 texelSpecular = texture2D(specularMap, v_Uv);\n texelSpecular = sRGBToLinear(texelSpecular);\n specularFactor *= texelSpecular.rgb;\n #endif\n float glossinessFactor = glossiness;\n #ifdef USE_GLOSSINESSMAP\n vec4 texelGlossiness = texture2D(glossinessMap, v_Uv);\n glossinessFactor *= texelGlossiness.a;\n #endif\n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n #include \n #include \n outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n vec3 totalEmissiveRadiance = emissive;\n #include \n outColor.xyz += totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n}"; var pbr_vert = "#define USE_PBR\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var phong_frag = "#define USE_PHONG\n#include \n#include \nuniform float u_Specular;\nuniform vec3 u_SpecularColor;\n#include \nuniform vec3 emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n #include \n #include \n outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n #include \n vec3 totalEmissiveRadiance = emissive;\n #include \n outColor.xyz += totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n}"; var phong_vert = "#define USE_PHONG\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; var point_frag = "#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #ifdef USE_DIFFUSE_MAP\n outColor *= texture2D(diffuseMap, vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y));\n #endif\n #include \n #include \n #include \n #include \n}"; var point_vert = "#include \n#include \n#include \nuniform float u_PointSize;\nuniform vec2 u_RenderTargetSize;\nvoid main() {\n #include \n #include \n #include \n vec4 mvPosition = u_View * u_Model * vec4(transformed, 1.0);\n #ifdef USE_SIZEATTENUATION\n gl_PointSize = u_PointSize * (u_RenderTargetSize.y * 0.5 / -mvPosition.z);\n #else\n gl_PointSize = u_PointSize;\n #endif\n #include \n}"; const ShaderLib = { basic_frag: basic_frag, basic_vert: basic_vert, depth_frag: depth_frag, depth_vert: depth_vert, distance_frag: distance_frag, distance_vert: distance_vert, lambert_frag: lambert_frag, lambert_vert: lambert_vert, normaldepth_frag: normaldepth_frag, normaldepth_vert: normaldepth_vert, pbr_frag: pbr_frag, pbr_vert: pbr_vert, pbr2_frag: pbr2_frag, pbr2_vert: pbr_vert, phong_frag: phong_frag, phong_vert: phong_vert, point_frag: point_frag, point_vert: point_vert }; class WebGLAttribute { constructor(gl, program, attributeData) { this.gl = gl; this.name = attributeData.name; this.type = attributeData.type; this.size = attributeData.size; this.location = gl.getAttribLocation(program, this.name); this.count = getAttributeCount(gl, this.type); this.format = getAttributeFormat(gl, this.type); this.locationSize = 1; if (this.type === gl.FLOAT_MAT2) this.locationSize = 2; if (this.type === gl.FLOAT_MAT3) this.locationSize = 3; if (this.type === gl.FLOAT_MAT4) this.locationSize = 4; } } function getAttributeCount(gl, type) { switch (type) { case gl.FLOAT: case gl.INT: case gl.UNSIGNED_INT: return 1; case gl.FLOAT_VEC2: case gl.INT_VEC2: return 2; case gl.FLOAT_VEC3: case gl.INT_VEC3: return 3; case gl.FLOAT_VEC4: case gl.INT_VEC4: return 4; case gl.FLOAT_MAT2: return 4; case gl.FLOAT_MAT3: return 9; case gl.FLOAT_MAT4: return 16; default: return 0; } } function getAttributeFormat(gl, type) { switch (type) { case gl.FLOAT: case gl.FLOAT_VEC2: case gl.FLOAT_VEC3: case gl.FLOAT_VEC4: case gl.FLOAT_MAT2: case gl.FLOAT_MAT3: case gl.FLOAT_MAT4: return gl.FLOAT; case gl.INT: case gl.INT_VEC2: case gl.INT_VEC3: case gl.INT_VEC4: return gl.INT; case gl.UNSIGNED_INT: return gl.UNSIGNED_INT; default: return gl.FLOAT; } } class WebGLCapabilities { constructor(gl) { this._gl = gl; this._extensions = {}; // webgl version this.version = parseFloat(/^WebGL (\d)/.exec(gl.getParameter(gl.VERSION))[1]); // texture filter anisotropic extension // this extension is available to both, WebGL1 and WebGL2 contexts. const anisotropyExt = this.getExtension('EXT_texture_filter_anisotropic'); this.anisotropyExt = anisotropyExt; this.maxAnisotropy = (anisotropyExt !== null) ? gl.getParameter(anisotropyExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1; // query extension let timerQuery = null, canUseTimestamp = false; try { if (this.version > 1) { timerQuery = this.getExtension('EXT_disjoint_timer_query_webgl2'); if (timerQuery) { canUseTimestamp = !!gl.getQuery(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT); } } else { timerQuery = this.getExtension('EXT_disjoint_timer_query'); if (timerQuery) { canUseTimestamp = !!timerQuery.getQueryEXT(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT); } } } catch (err) { console.warn(err); } this.timerQuery = timerQuery; this.canUseTimestamp = canUseTimestamp; // parallel_shader_compile this.parallelShaderCompileExt = this.getExtension('KHR_parallel_shader_compile'); // others this.maxPrecision = getMaxPrecision(gl, 'highp'); this.maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); this.maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS); this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); this.maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE); this.maxVertexUniformVectors = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS); this.maxSamples = this.version > 1 ? gl.getParameter(gl.MAX_SAMPLES) : 1; this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE); } getExtension(name) { const gl = this._gl; const extensions = this._extensions; if (extensions[name] !== undefined) { return extensions[name]; } let ext = null; for (const prefix of vendorPrefixes) { ext = gl.getExtension(prefix + name); if (ext) { break; } } extensions[name] = ext; return ext; } } const vendorPrefixes = ['', 'WEBKIT_', 'MOZ_']; function getMaxPrecision(gl, precision) { if (precision === 'highp') { if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) { return 'highp'; } precision = 'mediump'; } if (precision === 'mediump') { if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) { return 'mediump'; } } return 'lowp'; } // This class handles buffer creation and updating for geometries. class WebGLGeometries extends PropertyMap { constructor(prefix, gl, buffers, vertexArrayBindings) { super(prefix); this._gl = gl; this._buffers = buffers; this._vertexArrayBindings = vertexArrayBindings; const that = this; function onGeometryDispose(event) { const geometry = event.target; const geometryProperties = that.get(geometry); geometry.removeEventListener('dispose', onGeometryDispose); if (geometry.index !== null) { buffers.removeBuffer(geometry.index.buffer); } for (const name in geometry.attributes) { buffers.removeBuffer(geometry.attributes[name].buffer); } for (const name in geometry.morphAttributes) { const array = geometry.morphAttributes[name]; for (let i = 0, l = array.length; i < l; i++) { buffers.removeBuffer(array[i].buffer); } } vertexArrayBindings.releaseByGeometry(geometry); geometryProperties.created = false; that.delete(geometry); } this._onGeometryDispose = onGeometryDispose; } setGeometry(geometry, passInfo) { const gl = this._gl; const buffers = this._buffers; const geometryProperties = this.get(geometry); // If in pass rendering, skip the geometry if it has been set in this pass. if (geometryProperties.pass === passInfo.count) { return; } geometryProperties.pass = passInfo.count; if (!geometryProperties.created) { geometry.addEventListener('dispose', this._onGeometryDispose); geometryProperties.created = true; } if (geometry.index !== null) { buffers.setBuffer(geometry.index.buffer, gl.ELEMENT_ARRAY_BUFFER, this._vertexArrayBindings); } for (const name in geometry.attributes) { buffers.setBuffer(geometry.attributes[name].buffer, gl.ARRAY_BUFFER); } for (const name in geometry.morphAttributes) { const array = geometry.morphAttributes[name]; for (let i = 0, l = array.length; i < l; i++) { buffers.setBuffer(array[i].buffer, gl.ARRAY_BUFFER); } } return geometryProperties; } } // Build-in uniforms const internalUniforms = { 'u_Model': [1, null], 'u_Projection': [2, function(cameraData) { this.set(cameraData.projectionMatrix.elements); }], 'u_View': [2, function(cameraData) { this.set(cameraData.viewMatrix.elements); }], 'u_ProjectionView': [2, function(cameraData) { this.set(cameraData.projectionViewMatrix.elements); }], 'u_CameraPosition': [2, function(cameraData) { this.setValue(cameraData.position.x, cameraData.position.y, cameraData.position.z); }], 'logDepthBufFC': [2, function(cameraData) { this.set(cameraData.logDepthBufFC); }], 'logDepthCameraNear': [2, function(cameraData) { this.set(cameraData.logDepthCameraNear); }], 'u_FogColor': [3, function(sceneData) { const color = sceneData.fog.color; this.setValue(color.r, color.g, color.b); }], 'u_FogDensity': [3, function(sceneData) { this.set(sceneData.fog.density); }], 'u_FogNear': [3, function(sceneData) { this.set(sceneData.fog.near); }], 'u_FogFar': [3, function(sceneData) { this.set(sceneData.fog.far); }], 'u_Color': [4, function(material, textures) { const color = material.diffuse; this.setValue(color.r, color.g, color.b); }], 'u_Opacity': [4, function(material, textures) { this.set(material.opacity); }], 'u_AlphaTest': [4, function(material, textures) { this.set(material.alphaTest); }], 'diffuseMap': [4, function(material, textures) { this.set(material.diffuseMap, textures); }], 'alphaMap': [4, function(material, textures) { this.set(material.alphaMap, textures); }], 'alphaMapUVTransform': [4, function(material, textures) { const transform = material.alphaMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }], 'normalMap': [4, function(material, textures) { this.set(material.normalMap, textures); }], 'normalScale': [4, function(material, textures) { this.setValue(material.normalScale.x, material.normalScale.y); }], 'bumpMap': [4, function(material, textures) { this.set(material.bumpMap, textures); }], 'bumpScale': [4, function(material, textures) { this.set(material.bumpScale); }], 'cubeMap': [4, function(material, textures) { this.set(material.cubeMap, textures); }], 'u_Specular': [4, function(material, textures) { this.set(material.shininess); }], 'u_SpecularColor': [4, function(material, textures) { const color = material.specular; this.setValue(color.r, color.g, color.b); }], 'specularMap': [4, function(material, textures) { this.set(material.specularMap, textures); }], 'aoMap': [4, function(material, textures) { this.set(material.aoMap, textures); }], 'aoMapIntensity': [4, function(material, textures) { this.set(material.aoMapIntensity); }], 'aoMapUVTransform': [4, function(material, textures) { const transform = material.aoMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }], 'u_Roughness': [4, function(material, textures) { this.set(material.roughness); }], 'roughnessMap': [4, function(material, textures) { this.set(material.roughnessMap, textures); }], 'u_Metalness': [4, function(material, textures) { this.set(material.metalness); }], 'metalnessMap': [4, function(material, textures) { this.set(material.metalnessMap, textures); }], 'u_Clearcoat': [4, function(material, textures) { this.set(material.clearcoat); }], 'u_ClearcoatRoughness': [4, function(material, textures) { this.set(material.clearcoatRoughness); }], 'clearcoatMap': [4, function(material, textures) { this.set(material.clearcoatMap, textures); }], 'clearcoatRoughnessMap': [4, function(material, textures) { this.set(material.clearcoatRoughnessMap, textures); }], 'clearcoatNormalMap': [4, function(material, textures) { this.set(material.clearcoatNormalMap, textures); }], 'clearcoatNormalScale': [4, function(material, textures) { this.setValue(material.clearcoatNormalScale.x, material.clearcoatNormalScale.y); }], 'glossiness': [4, function(material, textures) { this.set(material.glossiness); }], 'glossinessMap': [4, function(material, textures) { this.set(material.glossinessMap, textures); }], 'emissive': [4, function(material, textures) { const color = material.emissive; this.setValue(color.r, color.g, color.b); }], 'emissiveMap': [4, function(material, textures) { this.set(material.emissiveMap, textures); }], 'emissiveMapUVTransform': [4, function(material, textures) { const transform = material.emissiveMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }], 'uvTransform': [4, function(material, textures) { const transform = material.diffuseMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements); }], 'u_PointSize': [4, function(material, textures) { this.set(material.size); }], 'envMap': [5, function(envData, textures) { this.set(envData.map, textures); }], 'envMapParams': [5, function(envData, textures) { this.setValue(envData.diffuse, envData.specular, (envData.map.images[0] && envData.map.images[0].rtt) ? 1 : -1); }], 'maxMipLevel': [5, function(envData, textures) { this.set(textures.get(envData.map).__maxMipLevel || 8); }] }; // Empty textures const emptyTexture = new Texture2D(); emptyTexture.image = { data: new Uint8Array([1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1]), width: 2, height: 2 }; emptyTexture.magFilter = TEXTURE_FILTER.NEAREST; emptyTexture.minFilter = TEXTURE_FILTER.NEAREST; emptyTexture.generateMipmaps = false; emptyTexture.version++; const emptyShadowTexture = new Texture2D(); emptyShadowTexture.image = { data: null, width: 2, height: 2 }; emptyShadowTexture.version++; emptyShadowTexture.type = PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV; emptyShadowTexture.format = PIXEL_FORMAT.DEPTH_STENCIL; emptyShadowTexture.magFilter = TEXTURE_FILTER.NEAREST; emptyShadowTexture.minFilter = TEXTURE_FILTER.NEAREST; emptyShadowTexture.compare = COMPARE_FUNC.LESS; emptyShadowTexture.generateMipmaps = false; emptyShadowTexture.version++; const emptyTexture3d = new Texture3D(); const emptyTexture2dArray = new Texture2DArray(); const emptyCubeTexture = new TextureCube(); // Array helpers function arraysEqual(a, b) { if (a.length !== b.length) return false; for (let i = 0, l = a.length; i < l; i++) { if (a[i] !== b[i]) return false; } return true; } function copyArray(a, b) { for (let i = 0, l = b.length; i < l; i++) { a[i] = b[i]; } } // Texture unit allocation const arrayCacheI32 = []; function allocTexUnits(textures, n) { let r = arrayCacheI32[n]; if (r === undefined) { r = new Int32Array(n); arrayCacheI32[n] = r; } for (let i = 0; i !== n; ++i) { r[i] = textures.allocTexUnit(); } return r; } // Helper to pick the right setter for uniform function generateSetter(uniform, pureArray) { const gl = uniform.gl; const type = uniform.type; const location = uniform.location; const cache = uniform.cache; switch (type) { case gl.FLOAT: uniform.setValue = function(value) { if (cache[0] === value) return; gl.uniform1f(location, value); cache[0] = value; }; if (pureArray) { uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform1fv(location, value); copyArray(cache, value); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_2D: case gl.SAMPLER_2D_SHADOW: case gl.INT_SAMPLER_2D: case gl.UNSIGNED_INT_SAMPLER_2D: uniform.setValue = function(value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function(value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_2D_ARRAY: case gl.SAMPLER_2D_ARRAY_SHADOW: case gl.INT_SAMPLER_2D_ARRAY: case gl.UNSIGNED_INT_SAMPLER_2D_ARRAY: uniform.setValue = function(value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyTexture2dArray, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function(value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyTexture2dArray, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_CUBE: case gl.SAMPLER_CUBE_SHADOW: uniform.setValue = function(value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyCubeTexture, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function(value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyCubeTexture, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_3D: uniform.setValue = function(value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyTexture3d, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function(value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyTexture3d, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.BOOL: case gl.INT: uniform.setValue = function(value) { if (cache[0] === value) return; gl.uniform1i(location, value); cache[0] = value; }; if (pureArray) { uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform1iv(location, value); copyArray(cache, value); }; } else { uniform.set = uniform.setValue; } break; case gl.FLOAT_VEC2: uniform.setValue = function(p1, p2) { if (cache[0] !== p1 || cache[1] !== p2) { gl.uniform2f(location, p1, p2); cache[0] = p1; cache[1] = p2; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform2fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC2: case gl.INT_VEC2: uniform.setValue = function(p1, p2) { if (cache[0] !== p1 || cache[1] !== p2) { gl.uniform2i(location, p1, p2); cache[0] = p1; cache[1] = p2; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform2iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_VEC3: uniform.setValue = function(p1, p2, p3) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) { gl.uniform3f(location, p1, p2, p3); cache[0] = p1; cache[1] = p2; cache[2] = p3; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform3fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC3: case gl.INT_VEC3: uniform.setValue = function(p1, p2, p3) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) { gl.uniform3i(location, p1, p2, p3); cache[0] = p1; cache[1] = p2; cache[2] = p3; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform3iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_VEC4: uniform.setValue = function(p1, p2, p3, p4) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) { gl.uniform4f(location, p1, p2, p3, p4); cache[0] = p1; cache[1] = p2; cache[2] = p3; cache[3] = p4; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform4fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC4: case gl.INT_VEC4: uniform.setValue = function(p1, p2, p3, p4) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) { gl.uniform4i(location, p1, p2, p3, p4); cache[0] = p1; cache[1] = p2; cache[2] = p3; cache[3] = p4; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform4iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_MAT2: if (pureArray) { uniform.setValue = uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix2fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function(value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3]) { gl.uniformMatrix2fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; } }; } break; case gl.FLOAT_MAT3: if (pureArray) { uniform.setValue = uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix3fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function(value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8]) { gl.uniformMatrix3fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; cache[4] = value[4]; cache[5] = value[5]; cache[6] = value[6]; cache[7] = value[7]; cache[8] = value[8]; } }; } break; case gl.FLOAT_MAT4: if (pureArray) { uniform.setValue = uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix4fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function(value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8] || cache[9] !== value[9] || cache[10] !== value[10] || cache[11] !== value[11] || cache[12] !== value[12] || cache[13] !== value[13] || cache[14] !== value[14] || cache[15] !== value[15]) { gl.uniformMatrix4fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; cache[4] = value[4]; cache[5] = value[5]; cache[6] = value[6]; cache[7] = value[7]; cache[8] = value[8]; cache[9] = value[9]; cache[10] = value[10]; cache[11] = value[11]; cache[12] = value[12]; cache[13] = value[13]; cache[14] = value[14]; cache[15] = value[15]; } }; } break; } } // --- Uniform Classes --- class SingleUniform { constructor(gl, id, activeInfo, location) { this.gl = gl; this.id = id; this.type = activeInfo.type; // this.size = activeInfo.size; // always be 1 this.location = location; this.setValue = undefined; this.set = undefined; this.cache = []; generateSetter(this); // internal this.internalGroup = 0; this.internalFun = null; const internal = internalUniforms[id]; if (internal) { this.internalGroup = internal[0]; this.internalFun = internal[1]; } } } class PureArrayUniform { constructor(gl, id, activeInfo, location) { this.gl = gl; this.id = id; this.type = activeInfo.type; this.size = activeInfo.size; this.location = location; this.setValue = undefined; this.set = undefined; this.cache = []; generateSetter(this, true); } } class UniformContainer { constructor() { this.seq = []; this.map = {}; } } class StructuredUniform extends UniformContainer { constructor(id) { super(); this.id = id; } set(value, textures) { const seq = this.seq; for (let i = 0, n = seq.length; i !== n; ++i) { const u = seq[i]; u.set(value[u.id], textures); } } } // --- Top-level --- // Parser - builds up the property tree from the path strings const RePathPart = /(\w+)(\])?(\[|\.)?/g; // extracts // - the identifier (member name or array index) // - followed by an optional right bracket (found when array index) // - followed by an optional left bracket or dot (type of subscript) // // Note: These portions can be read in a non-overlapping fashion and // allow straightforward parsing of the hierarchy that WebGL encodes // in the uniform names. function addUniform(container, uniformObject) { container.seq.push(uniformObject); container.map[uniformObject.id] = uniformObject; } // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getActiveUniform function parseUniform(gl, activeInfo, location, container) { const path = activeInfo.name, pathLength = path.length; // reset RegExp object, because of the early exit of a previous run RePathPart.lastIndex = 0; while (true) { const match = RePathPart.exec(path), matchEnd = RePathPart.lastIndex; let id = match[1]; const idIsIndex = match[2] === ']', subscript = match[3]; if (idIsIndex) id = id | 0; // convert to integer if (subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength) { // bare name or "pure" bottom-level array "[0]" suffix addUniform(container, subscript === undefined ? new SingleUniform(gl, id, activeInfo, location) : new PureArrayUniform(gl, id, activeInfo, location)); break; } else { // step into inner node / create it in case it doesn't exist const map = container.map; let next = map[id]; if (next === undefined) { next = new StructuredUniform(id); addUniform(container, next); } container = next; } } } // Root Container class WebGLUniforms extends UniformContainer { constructor(gl, program) { super(); const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); for (let i = 0; i < n; ++i) { const info = gl.getActiveUniform(program, i), addr = gl.getUniformLocation(program, info.name); parseUniform(gl, info, addr, this); } } set(name, value, textures) { const u = this.map[name]; if (u !== undefined) u.set(value, textures); } has(name) { return !!this.map[name]; } } let programIdCount = 0; class WebGLProgram { constructor(gl, vshader, fshader) { this.gl = gl; this.vshaderSource = vshader; this.fshaderSource = fshader; this.id = programIdCount++; this.usedTimes = 1; this.code = ''; this.name = ''; this.lightId = -1; this.lightVersion = -1; this.cameraId = -1; this.cameraVersion = -1; this.sceneId = -1; this.sceneVersion = -1; this.program; this._checkErrors = true; this._compileAsynchronously = false; this._status = 0; let program, vertexShader, fragmentShader; // compile program this.compile = function(options) { // create shaders vertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader); fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader); // create a program object program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); this.program = program; // set properties this._checkErrors = options.checkErrors; this._compileAsynchronously = options.compileAsynchronously; this._status = 1; // here we can delete shaders, // according to the documentation: https://www.opengl.org/sdk/docs/man/html/glLinkProgram.xhtml gl.deleteShader(vertexShader); gl.deleteShader(fragmentShader); }; // check if program is ready to be used this.isReady = function(parallelShaderCompileExt) { if (this._status === 1) { if (this._compileAsynchronously && parallelShaderCompileExt) { if (gl.getProgramParameter(program, parallelShaderCompileExt.COMPLETION_STATUS_KHR)) { this._status = 2; this._tryCheckErrors(); } } else { this._status = 2; this._tryCheckErrors(); } } return this._status === 2; }; this._tryCheckErrors = function() { if (!this._checkErrors) return; if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { const programLog = gl.getProgramInfoLog(program).trim(); const vertexErrors = getShaderErrors(gl, vertexShader, 'VERTEX'); const fragmentErrors = getShaderErrors(gl, fragmentShader, 'FRAGMENT'); this.program = undefined; this._status = 0; console.error( 'Shader Error ' + gl.getError() + ' - ' + 'VALIDATE_STATUS ' + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + '\n\n' + 'Shader Name: ' + this.name + '\n' + 'Program Info Log: ' + programLog + '\n' + vertexErrors + '\n' + fragmentErrors ); } }; // set up caching for uniforms let cachedUniforms; this.getUniforms = function() { if (cachedUniforms === undefined) { cachedUniforms = new WebGLUniforms(gl, program); } return cachedUniforms; }; // set up caching for attributes let cachedAttributes; this.getAttributes = function() { if (cachedAttributes === undefined) { cachedAttributes = extractAttributes(gl, program); } return cachedAttributes; }; // free program this.dispose = function() { gl.deleteProgram(program); this.program = undefined; this._status = 0; }; } } function handleSource(string, errorLine) { const lines = string.split('\n'); const lines2 = []; const from = Math.max(errorLine - 6, 0); const to = Math.min(errorLine + 6, lines.length); for (let i = from; i < to; i++) { const line = i + 1; lines2.push(`${line === errorLine ? '>' : ' '} ${line}: ${lines[i]}`); } return lines2.join('\n'); } function loadShader(gl, type, source) { const shader = gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); return shader; } function getShaderErrors(gl, shader, type) { const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS); const errors = gl.getShaderInfoLog(shader).trim(); if (status && errors === '') return ''; const errorMatches = /ERROR: 0:(\d+)/.exec(errors); if (errorMatches) { // --enable-privileged-webgl-extension // console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); const errorLine = parseInt(errorMatches[1]); return type + '\n\n' + errors + '\n\n' + handleSource(gl.getShaderSource(shader), errorLine); } else { return errors; } } // extract attributes function extractAttributes(gl, program) { const attributes = {}; const totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); for (let i = 0; i < totalAttributes; i++) { const attribData = gl.getActiveAttrib(program, i); attributes[attribData.name] = new WebGLAttribute(gl, program, attribData); } return attributes; } class WebGLPrograms { constructor(gl, state, capabilities) { this._gl = gl; this._state = state; this._capabilities = capabilities; this._programs = []; } getProgram(material, props, programCode, compileOptions) { const programs = this._programs; let program; for (let p = 0, pl = programs.length; p < pl; p++) { const programInfo = programs[p]; if (programInfo.code === programCode) { program = programInfo; ++program.usedTimes; break; } } if (program === undefined) { const customDefines = generateDefines(material.defines); const vertexShader = ShaderLib[material.type + '_vert'] || material.vertexShader || ShaderLib.basic_vert; const fragmentShader = ShaderLib[material.type + '_frag'] || material.fragmentShader || ShaderLib.basic_frag; program = createProgram(this._gl, customDefines, props, vertexShader, fragmentShader); program.name = props.shaderName; program.compile(compileOptions); program.code = programCode; programs.push(program); } return program; } releaseProgram(program) { if (--program.usedTimes === 0) { const programs = this._programs; // Remove from unordered set const index = programs.indexOf(program); programs[index] = programs[programs.length - 1]; programs.pop(); // Free WebGL resources program.dispose(this._gl); } } generateProps(material, object, lightingState, renderStates) { const state = this._state; const capabilities = this._capabilities; const fog = material.fog ? renderStates.scene.fog : null; const envMap = material.envMap !== undefined ? (material.envMap || renderStates.scene.environment) : null; const logarithmicDepthBuffer = renderStates.scene.logarithmicDepthBuffer; const disableShadowSampler = renderStates.scene.disableShadowSampler; const numClippingPlanes = (material.clippingPlanes && material.clippingPlanes.length > 0) ? material.clippingPlanes.length : renderStates.scene.numClippingPlanes; const HAS_CLEARCOAT = material.clearcoat > 0; const HAS_DIFFUSEMAP = !!material.diffuseMap; const HAS_ALPHAMAP = !!material.alphaMap; const HAS_EMISSIVEMAP = !!material.emissiveMap; const HAS_AOMAP = !!material.aoMap; const HAS_NORMALMAP = !!material.normalMap; const HAS_BUMPMAP = !!material.bumpMap; const HAS_SPECULARMAP = !!material.specularMap; const HAS_ROUGHNESSMAP = !!material.roughnessMap; const HAS_METALNESSMAP = !!material.metalnessMap; const HAS_GLOSSINESSMAP = !!material.glossinessMap; const HAS_ENVMAP = !!envMap; const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap; const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap; const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap; _activeMapCoords = material.extUvCoordMask; // reset const props = {}; // cache this props? props.shaderName = (material.type === MATERIAL_TYPE.SHADER && material.shaderName) ? material.shaderName : material.type; // capabilities props.version = capabilities.version; props.precision = material.precision || capabilities.maxPrecision; props.useStandardDerivatives = capabilities.version >= 2 || !!capabilities.getExtension('OES_standard_derivatives') || !!capabilities.getExtension('GL_OES_standard_derivatives'); props.useShaderTextureLOD = capabilities.version >= 2 || !!capabilities.getExtension('EXT_shader_texture_lod'); // maps props.useDiffuseMap = HAS_DIFFUSEMAP; props.useAlphaMap = HAS_ALPHAMAP; props.useEmissiveMap = HAS_EMISSIVEMAP; props.useAOMap = HAS_AOMAP; props.useNormalMap = HAS_NORMALMAP; props.useBumpMap = HAS_BUMPMAP; props.useSpecularMap = HAS_SPECULARMAP; props.useRoughnessMap = HAS_ROUGHNESSMAP; props.useMetalnessMap = HAS_METALNESSMAP; props.useGlossinessMap = HAS_GLOSSINESSMAP; props.useEnvMap = HAS_ENVMAP; props.envMapCombine = HAS_ENVMAP && material.envMapCombine; props.useClearcoat = HAS_CLEARCOAT; props.useClearcoatMap = HAS_CLEARCOATMAP; props.useClearcoatRoughnessMap = HAS_CLEARCOAT_ROUGHNESSMAP; props.useClearcoatNormalMap = HAS_CLEARCOAT_NORMALMAP; props.diffuseMapUv = HAS_DIFFUSEMAP && getUVChannel(material.diffuseMapCoord); props.alphaMapUv = HAS_ALPHAMAP && getUVChannel(material.alphaMapCoord); props.emissiveMapUv = HAS_EMISSIVEMAP && getUVChannel(material.emissiveMapCoord); props.aoMapUv = HAS_AOMAP && getUVChannel(material.aoMapCoord); if (HAS_NORMALMAP || HAS_BUMPMAP || HAS_SPECULARMAP || HAS_ROUGHNESSMAP || HAS_METALNESSMAP || HAS_GLOSSINESSMAP || HAS_CLEARCOATMAP || HAS_CLEARCOAT_ROUGHNESSMAP || HAS_CLEARCOAT_NORMALMAP) { _activeMapCoords |= 1 << 0; // these maps use uv coord 0 by default } props.activeMapCoords = _activeMapCoords; // lights lightingState.setProgramProps(props, object.receiveShadow); props.useShadowSampler = capabilities.version >= 2 && !disableShadowSampler; props.shadowType = object.shadowType; if (!props.useShadowSampler && ( props.shadowType == SHADOW_TYPE.PCF3_SOFT || props.shadowType == SHADOW_TYPE.PCF5_SOFT || props.shadowType == SHADOW_TYPE.PCSS16_SOFT || props.shadowType == SHADOW_TYPE.PCSS32_SOFT || props.shadowType == SHADOW_TYPE.PCSS64_SOFT ) ) { props.shadowType = SHADOW_TYPE.VOGEL5_SOFT; if (props.useShadow) { console.warn('WebGLPrograms: PCF and PCSS shadow type need shadow sampler support, falling back to VOGEL5_SOFT.'); } } props.dithering = material.dithering; // encoding const currentRenderTarget = state.currentRenderTarget; props.gammaFactor = renderStates.gammaFactor; props.outputEncoding = currentRenderTarget.texture ? getTextureEncodingFromMap(currentRenderTarget.texture) : renderStates.outputEncoding; props.diffuseMapEncoding = getTextureEncodingFromMap(material.diffuseMap || material.cubeMap); props.envMapEncoding = getTextureEncodingFromMap(envMap); props.emissiveMapEncoding = getTextureEncodingFromMap(material.emissiveMap); // other props.alphaTest = material.alphaTest > 0; props.premultipliedAlpha = material.premultipliedAlpha; props.useVertexColors = material.vertexColors; props.useVertexTangents = !!material.normalMap && material.vertexTangents; props.numClippingPlanes = numClippingPlanes; props.flatShading = material.shading === SHADING_TYPE.FLAT_SHADING; props.fog = !!fog; props.fogExp2 = !!fog && fog.isFogExp2; props.sizeAttenuation = material.sizeAttenuation; props.doubleSided = material.side === DRAW_SIDE.DOUBLE; props.flipSided = material.side === DRAW_SIDE.BACK; props.packDepthToRGBA = material.packToRGBA; props.logarithmicDepthBuffer = !!logarithmicDepthBuffer; props.rendererExtensionFragDepth = capabilities.version >= 2 || !!capabilities.getExtension('EXT_frag_depth'); // morph targets props.morphTargets = !!object.morphTargetInfluences; props.morphNormals = !!object.morphTargetInfluences && object.geometry.morphAttributes.normal; // skinned mesh const useSkinning = object.isSkinnedMesh && object.skeleton; const maxVertexUniformVectors = capabilities.maxVertexUniformVectors; const useVertexTexture = capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2); let maxBones = 0; if (useVertexTexture) { maxBones = 1024; } else { maxBones = object.skeleton ? object.skeleton.bones.length : 0; if (maxBones * 16 > maxVertexUniformVectors) { console.warn('Program: too many bones (' + maxBones + '), current cpu only support ' + Math.floor(maxVertexUniformVectors / 16) + ' bones!!'); maxBones = Math.floor(maxVertexUniformVectors / 16); } } props.useSkinning = useSkinning; props.bonesNum = maxBones; props.useVertexTexture = useVertexTexture; return props; } generateProgramCode(props, material) { let code = ''; for (const key in props) { code += props[key] + '_'; } for (const name in material.defines) { code += name + '_' + material.defines[name] + '_'; } // If the material type is SHADER and there is no shader Name, // use the entire shader code as part of the signature if (material.type === MATERIAL_TYPE.SHADER && !material.shaderName) { code += material.vertexShader; code += material.fragmentShader; } return code; } } // Helper functions function generateDefines(defines) { const chunks = []; for (const name in defines) { const value = defines[name]; if (value === false) continue; chunks.push('#define ' + name + ' ' + value); } return chunks.join('\n'); } let _activeMapCoords = 0; // bit mask function getUVChannel(coord) { _activeMapCoords |= (1 << coord); if (coord === 0) return 'a_Uv'; return `a_Uv${coord + 1}`; // a_Uv2, a_Uv3, a_Uv4, ... } function getTextureEncodingFromMap(map) { let encoding; if (!map) { encoding = TEXEL_ENCODING_TYPE.LINEAR; } else if (map.encoding) { encoding = map.encoding; } return encoding; } function getEncodingComponents(encoding) { switch (encoding) { case TEXEL_ENCODING_TYPE.LINEAR: return ['Linear', '(value)']; case TEXEL_ENCODING_TYPE.SRGB: return ['sRGB', '(value)']; case TEXEL_ENCODING_TYPE.GAMMA: return ['Gamma', '(value, float(GAMMA_FACTOR))']; default: console.error('unsupported encoding: ' + encoding); } } function getTexelDecodingFunction(functionName, encoding) { const components = getEncodingComponents(encoding); return 'vec4 ' + functionName + '(vec4 value) { return ' + components[0] + 'ToLinear' + components[1] + '; }'; } function getTexelEncodingFunction(functionName, encoding) { const components = getEncodingComponents(encoding); return 'vec4 ' + functionName + '(vec4 value) { return LinearTo' + components[0] + components[1] + '; }'; } function uvAttributes(activeMapCoords) { let str = ''; for (let i = 1; i < 8; i++) { // skip uv0 if (activeMapCoords & (1 << i)) { str += 'attribute vec2 a_Uv' + (i + 1) + ';'; if (i !== 7) str += '\n'; } } return str; } const shadowDefines = { [SHADOW_TYPE.HARD]: '#define USE_HARD_SHADOW', [SHADOW_TYPE.POISSON_SOFT]: '#define USE_POISSON_SOFT_SHADOW', [SHADOW_TYPE.VOGEL5_SOFT]: '#define USE_VOGEL5_SOFT_SHADOW', [SHADOW_TYPE.PCF3_SOFT]: '#define USE_PCF3_SOFT_SHADOW', [SHADOW_TYPE.PCF5_SOFT]: '#define USE_PCF5_SOFT_SHADOW', [SHADOW_TYPE.PCSS16_SOFT]: [ '#define USE_PCSS16_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW' ].join('\n'), [SHADOW_TYPE.PCSS32_SOFT]: [ '#define USE_PCSS32_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW' ].join('\n'), [SHADOW_TYPE.PCSS64_SOFT]: [ '#define USE_PCSS64_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW' ].join('\n') }; function getShadowTypeDefines(shadowType) { if (shadowDefines[shadowType]) { return shadowDefines[shadowType]; } else { console.warn('unsupported shadow type: ' + shadowType); return shadowDefines[SHADOW_TYPE.HARD]; } } function createProgram(gl, defines, props, vertex, fragment) { let prefixVertex = [ 'precision ' + props.precision + ' float;', 'precision ' + props.precision + ' int;', // depth texture may have precision problem on iOS device. 'precision ' + props.precision + ' sampler2D;', (props.version >= 2) ? 'precision ' + props.precision + ' isampler2D;' : '', (props.version >= 2) ? 'precision ' + props.precision + ' usampler2D;' : '', '#define SHADER_NAME ' + props.shaderName, defines, (props.version >= 2) ? '#define WEBGL2' : '', // maps props.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '', props.useAlphaMap ? '#define USE_ALPHA_MAP' : '', props.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '', props.useAOMap ? '#define USE_AOMAP' : '', props.useNormalMap ? '#define USE_NORMAL_MAP' : '', props.useBumpMap ? '#define USE_BUMPMAP' : '', props.useSpecularMap ? '#define USE_SPECULARMAP' : '', props.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '', props.useMetalnessMap ? '#define USE_METALNESSMAP' : '', props.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '', props.useEnvMap ? '#define USE_ENV_MAP' : '', props.diffuseMapUv ? '#define DIFFUSEMAP_UV ' + props.diffuseMapUv : '', props.alphaMapUv ? '#define ALPHAMAP_UV ' + props.alphaMapUv : '', props.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + props.emissiveMapUv : '', props.aoMapUv ? '#define AOMAP_UV ' + props.aoMapUv : '', props.activeMapCoords > 0 ? '#define USE_UV' : '', props.activeMapCoords & 1 ? '#define USE_UV1' : '', uvAttributes(props.activeMapCoords), // lights props.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '', props.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '', props.useShadow ? '#define USE_SHADOW' : '', // other props.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '', props.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '', props.useVertexTangents ? '#define USE_TANGENT' : '', props.flatShading ? '#define FLAT_SHADED' : '', props.fog ? '#define USE_FOG' : '', props.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', props.flipSided ? '#define FLIP_SIDED' : '', props.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', (props.logarithmicDepthBuffer && props.rendererExtensionFragDepth) ? '#define USE_LOGDEPTHBUF_EXT' : '', // morph targets props.morphTargets ? '#define USE_MORPHTARGETS' : '', props.morphNormals && props.flatShading === false ? '#define USE_MORPHNORMALS' : '', // skinned mesh props.useSkinning ? '#define USE_SKINNING' : '', (props.bonesNum > 0) ? ('#define MAX_BONES ' + props.bonesNum) : '', props.useVertexTexture ? '#define BONE_TEXTURE' : '', '\n' ].filter(filterEmptyLine).join('\n'); let prefixFragment = [ // use dfdx and dfdy must enable OES_standard_derivatives (props.useStandardDerivatives && props.version < 2) ? '#extension GL_OES_standard_derivatives : enable' : '', (props.useShaderTextureLOD && props.version < 2) ? '#extension GL_EXT_shader_texture_lod : enable' : '', (props.logarithmicDepthBuffer && props.rendererExtensionFragDepth && props.version < 2) ? '#extension GL_EXT_frag_depth : enable' : '', 'precision ' + props.precision + ' float;', 'precision ' + props.precision + ' int;', // depth texture may have precision problem on iOS device. 'precision ' + props.precision + ' sampler2D;', (props.version >= 2) ? 'precision ' + props.precision + ' isampler2D;' : '', (props.version >= 2) ? 'precision ' + props.precision + ' usampler2D;' : '', (props.version >= 2) ? 'precision ' + props.precision + ' sampler2DShadow;' : '', (props.version >= 2) ? 'precision ' + props.precision + ' samplerCubeShadow;' : '', '#define SHADER_NAME ' + props.shaderName, '#define PI 3.14159265359', '#define EPSILON 1e-6', 'float pow2(const in float x) { return x * x; }', '#define LOG2 1.442695', '#define RECIPROCAL_PI 0.31830988618', '#define saturate(a) clamp(a, 0.0, 1.0)', '#define whiteCompliment(a) (1.0 - saturate(a))', // expects values in the range of [0,1] x [0,1], returns values in the [0,1] range. // do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ 'highp float rand(const in vec2 uv) {', ' const highp float a = 12.9898, b = 78.233, c = 43758.5453;', ' highp float dt = dot(uv.xy, vec2(a, b)), sn = mod(dt, PI);', ' return fract(sin(sn) * c);', '}', defines, (props.version >= 2) ? '#define WEBGL2' : '', props.useShadowSampler ? '#define USE_SHADOW_SAMPLER' : '#define sampler2DShadow sampler2D', props.useShaderTextureLOD ? '#define TEXTURE_LOD_EXT' : '', // maps props.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '', props.useAlphaMap ? '#define USE_ALPHA_MAP' : '', props.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '', props.useAOMap ? '#define USE_AOMAP' : '', props.useNormalMap ? '#define USE_NORMAL_MAP' : '', props.useBumpMap ? '#define USE_BUMPMAP' : '', props.useSpecularMap ? '#define USE_SPECULARMAP' : '', props.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '', props.useMetalnessMap ? '#define USE_METALNESSMAP' : '', props.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '', props.useEnvMap ? '#define USE_ENV_MAP' : '', props.envMapCombine ? '#define ' + props.envMapCombine : '', props.useClearcoat ? '#define USE_CLEARCOAT' : '', props.useClearcoatMap ? '#define USE_CLEARCOATMAP' : '', props.useClearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', props.useClearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', props.activeMapCoords & 1 ? '#define USE_UV1' : '', // lights props.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '', props.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '', props.useClusteredLights ? '#define USE_CLUSTERED_LIGHTS' : '', props.useShadow ? '#define USE_SHADOW' : '', getShadowTypeDefines(props.shadowType), props.dithering ? '#define DITHERING' : '', // encoding ShaderChunk['encodings_pars_frag'], '#define GAMMA_FACTOR ' + props.gammaFactor, getTexelEncodingFunction('linearToOutputTexel', props.outputEncoding), getTexelDecodingFunction('mapTexelToLinear', props.diffuseMapEncoding), props.useEnvMap ? getTexelDecodingFunction('envMapTexelToLinear', props.envMapEncoding) : '', props.useEmissiveMap ? getTexelDecodingFunction('emissiveMapTexelToLinear', props.emissiveMapEncoding) : '', // other props.alphaTest ? '#define ALPHATEST' : '', props.premultipliedAlpha ? '#define USE_PREMULTIPLIED_ALPHA' : '', props.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '', props.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '', props.useVertexTangents ? '#define USE_TANGENT' : '', props.flatShading ? '#define FLAT_SHADED' : '', props.fog ? '#define USE_FOG' : '', props.fogExp2 ? '#define USE_EXP2_FOG' : '', props.doubleSided ? '#define DOUBLE_SIDED' : '', props.packDepthToRGBA ? '#define DEPTH_PACKING_RGBA' : '', props.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', (props.logarithmicDepthBuffer && props.rendererExtensionFragDepth) ? '#define USE_LOGDEPTHBUF_EXT' : '', '\n' ].filter(filterEmptyLine).join('\n'); let vshader = vertex; let fshader = fragment; vshader = parseIncludes(vshader); fshader = parseIncludes(fshader); vshader = replaceLightNums(vshader, props); fshader = replaceLightNums(fshader, props); vshader = replaceClippingPlaneNums(vshader, props); fshader = replaceClippingPlaneNums(fshader, props); vshader = unrollLoops(vshader); fshader = unrollLoops(fshader); // enable glsl version 300 es for webgl ^2.0 if (props.version > 1) { // extract vertex extensions and insert after version strings later // because it must be at the top of the shader const vertexExtensions = vshader.match(extensionPattern); if (vertexExtensions) { vshader = vshader.replace(extensionPattern, ''); } prefixVertex = [ '#version 300 es', vertexExtensions ? vertexExtensions.join('\n') : '', '#define attribute in', '#define varying out', '#define texture2D texture' ].join('\n') + '\n' + prefixVertex; fshader = fshader.replace('#extension GL_EXT_draw_buffers : require', ''); // replace gl_FragData by layout let i = 0; const layout = []; while (fshader.indexOf('gl_FragData[' + i + ']') > -1) { fshader = fshader.replace('gl_FragData[' + i + ']', 'pc_fragData' + i); layout.push('layout(location = ' + i + ') out highp vec4 pc_fragData' + i + ';'); i++; } prefixFragment = [ '#version 300 es', '#define varying in', (fshader.indexOf('layout') > -1 || layout.length > 0) ? '' : 'out highp vec4 pc_fragColor;', '#define gl_FragColor pc_fragColor', '#define gl_FragDepthEXT gl_FragDepth', '#define texture2D texture', '#define textureCube texture', '#define texture2DProj textureProj', '#define texture2DLodEXT textureLod', '#define texture2DProjLodEXT textureProjLod', '#define textureCubeLodEXT textureLod', '#define texture2DGradEXT textureGrad', '#define texture2DProjGradEXT textureProjGrad', '#define textureCubeGradEXT textureGrad', layout.join('\n') ].join('\n') + '\n' + prefixFragment; } vshader = prefixVertex + vshader; fshader = prefixFragment + fshader; return new WebGLProgram(gl, vshader, fshader); } const parseIncludes = function(string) { const pattern = /#include +<([\w\d.]+)>/g; function replace(match, include) { const replace = ShaderChunk[include]; if (replace === undefined) { throw new Error('Can not resolve #include <' + include + '>'); } return parseIncludes(replace); } return string.replace(pattern, replace); }; function filterEmptyLine(string) { return string !== ''; } function replaceLightNums(string, parameters) { return string .replace(/NUM_HEMI_LIGHTS/g, parameters.hemisphereLightNum) .replace(/NUM_DIR_LIGHTS/g, parameters.directLightNum) .replace(/NUM_SPOT_LIGHTS/g, parameters.spotLightNum) .replace(/NUM_POINT_LIGHTS/g, parameters.pointLightNum) .replace(/NUM_RECT_AREA_LIGHTS/g, parameters.rectAreaLightNum) .replace(/NUM_DIR_SHADOWS/g, parameters.directShadowNum) .replace(/NUM_SPOT_SHADOWS/g, parameters.spotShadowNum) .replace(/NUM_POINT_SHADOWS/g, parameters.pointShadowNum); } function replaceClippingPlaneNums(string, parameters) { return string .replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes); } const unrollLoopPattern = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; function loopReplacer(match, start, end, snippet) { let string = ''; for (let i = parseInt(start); i < parseInt(end); i++) { string += snippet .replace(/\[\s*i\s*\]/g, '[' + i + ']') .replace(/UNROLLED_LOOP_INDEX/g, i); } return string; } function unrollLoops(string) { return string .replace(unrollLoopPattern, loopReplacer); } const extensionPattern = /#extension .*/g; class WebGLQuerySets extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; const timerQuery = capabilities.timerQuery; const that = this; function onQuerySetDispose(event) { const querySet = event.target; const querySetProperties = that.get(querySet); querySet.removeEventListener('dispose', onQuerySetDispose); if (querySetProperties._queriesGL) { const queriesGL = querySetProperties._queriesGL; queriesGL.forEach(queryGL => { if (queryGL) { if (capabilities.version > 1) { gl.deleteQuery(queryGL); } else { timerQuery.deleteQueryEXT(queryGL); } } }); } querySetProperties._isDisposed = true; that.delete(querySet); } this._onQuerySetDispose = onQuerySetDispose; this._checkResultAvailable = capabilities.version > 1 ? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT_AVAILABLE) : queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_AVAILABLE_EXT); this._getQueryResult = capabilities.version > 1 ? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT) : queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_EXT); } setQuerySet(querySet) { const querySetProperties = this.get(querySet); if (querySetProperties._queriesGL === undefined) { querySet.addEventListener('dispose', this._onQuerySetDispose); querySetProperties._queriesGL = new Array(querySet.count).fill(null); querySetProperties._valueCache = new Array(querySet.count).fill(0); querySetProperties._valueCacheValid = new Array(querySet.count).fill(true); const gl = this._gl; const capabilities = this._capabilities; if (querySet.type === QUERYSET_TYPE.OCCLUSION) { querySetProperties._targetGL = querySet.conservative ? gl.ANY_SAMPLES_PASSED_CONSERVATIVE : gl.ANY_SAMPLES_PASSED; } else { // If timestamp is supported, this variable will not be used, // so it is okay to set it to TIME_ELAPSED_EXT here. querySetProperties._targetGL = capabilities.timerQuery.TIME_ELAPSED_EXT; } querySetProperties._activeIndex = -1; querySetProperties._reading = false; } } beginQuery(querySet, index) { const gl = this._gl; const querySetProperties = this.get(querySet); if (querySetProperties._reading) { return; } const queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index); if (this._capabilities.version > 1) { gl.beginQuery(querySetProperties._targetGL, queryGL); } else { this._capabilities.timerQuery.beginQueryEXT(querySetProperties._targetGL, queryGL); } querySetProperties._activeIndex = index; } endQuery(querySet) { const querySetProperties = this.get(querySet); if (querySetProperties._reading || querySetProperties._activeIndex < 0) { return; } if (this._capabilities.version > 1) { this._gl.endQuery(querySetProperties._targetGL); } else { this._capabilities.timerQuery.endQueryEXT(querySetProperties._targetGL); } querySetProperties._valueCacheValid[querySetProperties._activeIndex] = false; querySetProperties._activeIndex = -1; } queryCounter(querySet, index) { const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const querySetProperties = this.get(querySet); if (querySetProperties._reading) { return; } const queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index); timerQuery.queryCounterEXT(queryGL, timerQuery.TIMESTAMP_EXT); querySetProperties._valueCacheValid[index] = false; } readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount) { const querySetProperties = this.get(querySet); querySetProperties._reading = true; return new Promise((resolve, reject) => { const checkQueries = () => { if (querySetProperties._isDisposed) { reject(new Error('QuerySet has been disposed')); return; } let completed = true; try { for (let i = firstQuery; i < queryCount; i++) { const queryGL = querySetProperties._queriesGL[i]; const valueCacheValid = querySetProperties._valueCacheValid[i]; if (!valueCacheValid) { if (this._checkResultAvailable(queryGL)) { const result = this._getQueryResult(queryGL); querySetProperties._valueCache[i] = result; querySetProperties._valueCacheValid[i] = true; } else { completed = false; break; } } } } catch (e) { for (let i = firstQuery; i < queryCount; i++) { querySetProperties._valueCacheValid[i] = true; } querySetProperties._reading = false; reject(e); return; } if (completed) { for (let i = firstQuery; i < queryCount; i++) { dstBuffer[i - firstQuery] = querySetProperties._valueCache[i]; } querySetProperties._reading = false; resolve(dstBuffer); } else { requestAnimationFrame(checkQueries); } }; checkQueries(); }); } _getQueryGLByIndex(queriesGL, index) { let queryGL = queriesGL[index]; if (!queryGL) { const gl = this._gl; const capabilities = this._capabilities; queryGL = capabilities.version > 1 ? gl.createQuery() : capabilities.timerQuery.createQueryEXT(); queriesGL[index] = queryGL; } return queryGL; } } class WebGLConstants { constructor(gl, capabilities) { this._gl = gl; this._capabilities = capabilities; } getGLType(type) { const gl = this._gl; const capabilities = this._capabilities; const isWebGL2 = capabilities.version >= 2; if (type === PIXEL_TYPE.UNSIGNED_BYTE) return gl.UNSIGNED_BYTE; if (type === PIXEL_TYPE.UNSIGNED_SHORT_5_6_5) return gl.UNSIGNED_SHORT_5_6_5; if (type === PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4) return gl.UNSIGNED_SHORT_4_4_4_4; if (type === PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1) return gl.UNSIGNED_SHORT_5_5_5_1; let extension; if (!isWebGL2) { if (type === PIXEL_TYPE.UNSIGNED_SHORT || type === PIXEL_TYPE.UNSIGNED_INT || type === PIXEL_TYPE.UNSIGNED_INT_24_8) { extension = capabilities.getExtension('WEBGL_depth_texture'); if (extension) { if (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT; if (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT; if (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return extension.UNSIGNED_INT_24_8_WEBGL; } else { console.warn('extension WEBGL_depth_texture is not support.'); return null; } } if (type === PIXEL_TYPE.FLOAT) { extension = capabilities.getExtension('OES_texture_float'); if (extension) { return gl.FLOAT; } else { console.warn('extension OES_texture_float is not support.'); return null; } } if (type === PIXEL_TYPE.HALF_FLOAT) { extension = capabilities.getExtension('OES_texture_half_float'); if (extension) { return extension.HALF_FLOAT_OES; } else { console.warn('extension OES_texture_half_float is not support.'); return null; } } } else { if (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT; if (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT; if (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return gl.UNSIGNED_INT_24_8; if (type === PIXEL_TYPE.FLOAT) return gl.FLOAT; if (type === PIXEL_TYPE.HALF_FLOAT) return gl.HALF_FLOAT; if (type === PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV) return gl.FLOAT_32_UNSIGNED_INT_24_8_REV; if (type === PIXEL_TYPE.BYTE) return gl.BYTE; if (type === PIXEL_TYPE.SHORT) return gl.SHORT; if (type === PIXEL_TYPE.INT) return gl.INT; // does not include: // UNSIGNED_INT_2_10_10_10_REV // UNSIGNED_INT_10F_11F_11F_REV // UNSIGNED_INT_5_9_9_9_REV } return (gl[type] !== undefined) ? gl[type] : type; } getGLFormat(format) { const gl = this._gl; const capabilities = this._capabilities; if (format === PIXEL_FORMAT.RGB) return gl.RGB; if (format === PIXEL_FORMAT.RGBA) return gl.RGBA; if (format === PIXEL_FORMAT.ALPHA) return gl.ALPHA; if (format === PIXEL_FORMAT.LUMINANCE) return gl.LUMINANCE; if (format === PIXEL_FORMAT.LUMINANCE_ALPHA) return gl.LUMINANCE_ALPHA; if (format === PIXEL_FORMAT.DEPTH_COMPONENT) return gl.DEPTH_COMPONENT; if (format === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL; if (format === PIXEL_FORMAT.RED) return gl.RED; if (format === PIXEL_FORMAT.RED_INTEGER) return gl.RED_INTEGER; if (format === PIXEL_FORMAT.RG) return gl.RG; if (format === PIXEL_FORMAT.RG_INTEGER) return gl.RG_INTEGER; if (format === PIXEL_FORMAT.RGB_INTEGER) return gl.RGB_INTEGER; if (format === PIXEL_FORMAT.RGBA_INTEGER) return gl.RGBA_INTEGER; let extension; // S3TC if (format === PIXEL_FORMAT.RGB_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT3 || format === PIXEL_FORMAT.RGBA_S3TC_DXT5) { extension = capabilities.getExtension('WEBGL_compressed_texture_s3tc'); if (extension) { if (format === PIXEL_FORMAT.RGB_S3TC_DXT1) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT1) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT3) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT5) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; } else { console.warn('extension WEBGL_compressed_texture_s3tc is not support.'); return null; } } // PVRTC if (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) { extension = capabilities.getExtension('WEBGL_compressed_texture_pvrtc'); if (extension) { if (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if (format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if (format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if (format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; } else { console.warn('extension WEBGL_compressed_texture_pvrtc is not support.'); return null; } } // ETC1 if (format === PIXEL_FORMAT.RGB_ETC1) { extension = capabilities.getExtension('WEBGL_compressed_texture_etc1'); if (extension) { return extension.COMPRESSED_RGB_ETC1_WEBGL; } else { console.warn('extension WEBGL_compressed_texture_etc1 is not support.'); return null; } } // ASTC if (format === PIXEL_FORMAT.RGBA_ASTC_4x4) { extension = capabilities.getExtension('WEBGL_compressed_texture_astc'); if (extension) { return extension.COMPRESSED_RGBA_ASTC_4x4_KHR; } else { console.warn('extension WEBGL_compressed_texture_astc is not support.'); return null; } } // BPTC if (format === PIXEL_FORMAT.RGBA_BPTC || format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT || format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) { extension = capabilities.getExtension('EXT_texture_compression_bptc'); if (extension) { if (format === PIXEL_FORMAT.RGBA_BPTC) return extension.COMPRESSED_RGBA_BPTC_UNORM_EXT; if (format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; if (format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; } else { console.warn('extension EXT_texture_compression_bptc is not support.'); return null; } } return (gl[format] !== undefined) ? gl[format] : format; } getGLInternalFormat(internalFormat) { const gl = this._gl; const capabilities = this._capabilities; const isWebGL2 = capabilities.version >= 2; if (internalFormat === PIXEL_FORMAT.RGBA4) return gl.RGBA4; if (internalFormat === PIXEL_FORMAT.RGB5_A1) return gl.RGB5_A1; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT16) return gl.DEPTH_COMPONENT16; if (internalFormat === PIXEL_FORMAT.STENCIL_INDEX8) return gl.STENCIL_INDEX8; if (internalFormat === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL; // does not include: // RGB565 let extension; if (!isWebGL2) { if (internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.RGB32F) { extension = capabilities.getExtension('WEBGL_color_buffer_float'); if (extension) { if (internalFormat === PIXEL_FORMAT.RGBA32F) return extension.RGBA32F_EXT; if (internalFormat === PIXEL_FORMAT.RGB32F) return extension.RGB32F_EXT; } else { console.warn('extension WEBGL_color_buffer_float is not support.'); return null; } } } else { if (internalFormat === PIXEL_FORMAT.R8) return gl.R8; if (internalFormat === PIXEL_FORMAT.RG8) return gl.RG8; if (internalFormat === PIXEL_FORMAT.RGB8) return gl.RGB8; if (internalFormat === PIXEL_FORMAT.RGBA8) return gl.RGBA8; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT24) return gl.DEPTH_COMPONENT24; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT32F) return gl.DEPTH_COMPONENT32F; if (internalFormat === PIXEL_FORMAT.DEPTH24_STENCIL8) return gl.DEPTH24_STENCIL8; if (internalFormat === PIXEL_FORMAT.DEPTH32F_STENCIL8) return gl.DEPTH32F_STENCIL8; // does not include: // R8UI R8I R16UI R16I R32UI R32I RG8UI RG8I RG16UI RG16I RG32UI RG32I SRGB8_ALPHA8 // RGB10_A2 RGBA8UI RGBA8I RGB10_A2UI RGBA16UI RGBA16I RGBA32I RGBA32UI if (internalFormat === PIXEL_FORMAT.R16F || internalFormat === PIXEL_FORMAT.RG16F || internalFormat === PIXEL_FORMAT.RGB16F || internalFormat === PIXEL_FORMAT.RGBA16F || internalFormat === PIXEL_FORMAT.R32F || internalFormat === PIXEL_FORMAT.RG32F || internalFormat === PIXEL_FORMAT.RGB32F || internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.R11F_G11F_B10F ) { extension = capabilities.getExtension('EXT_color_buffer_float'); if (extension) { if (internalFormat === PIXEL_FORMAT.R16F) return gl.R16F; if (internalFormat === PIXEL_FORMAT.RG16F) return gl.RG16F; if (internalFormat === PIXEL_FORMAT.RGB16F) return gl.RGB16F; if (internalFormat === PIXEL_FORMAT.RGBA16F) return gl.RGBA16F; if (internalFormat === PIXEL_FORMAT.R32F) return gl.R32F; if (internalFormat === PIXEL_FORMAT.RG32F) return gl.RG32F; if (internalFormat === PIXEL_FORMAT.RGB32F) return gl.RGB32F; if (internalFormat === PIXEL_FORMAT.RGBA32F) return gl.RGBA32F; if (internalFormat === PIXEL_FORMAT.R11F_G11F_B10F) return gl.R11F_G11F_B10F; } else { console.warn('extension EXT_color_buffer_float is not support.'); return null; } } } return (gl[internalFormat] !== undefined) ? gl[internalFormat] : internalFormat; } } function createTexture(gl, type, target, count) { const data = new Uint8Array(4); // 4 is required to match default unpack alignment of 4. const texture = gl.createTexture(); gl.bindTexture(type, texture); gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST); for (let i = 0; i < count; i++) { gl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); } return texture; } function ColorBuffer(gl) { let locked = false; const color = new Vector4(); let currentColorMask = null; const currentColorClear = new Vector4(0, 0, 0, 0); return { setMask: function(colorMask) { if (currentColorMask !== colorMask && !locked) { gl.colorMask(colorMask, colorMask, colorMask, colorMask); currentColorMask = colorMask; } }, setLocked: function(lock) { locked = lock; }, setClear: function(r, g, b, a, premultipliedAlpha) { if (premultipliedAlpha === true) { r *= a; g *= a; b *= a; } color.set(r, g, b, a); if (currentColorClear.equals(color) === false) { gl.clearColor(r, g, b, a); currentColorClear.copy(color); } }, getClear: function() { return currentColorClear; }, reset: function() { locked = false; currentColorMask = null; currentColorClear.set(-1, 0, 0, 0); // set to invalid state } }; } function DepthBuffer(gl, state) { let locked = false; let currentDepthMask = null; let currentDepthFunc = null; let currentDepthClear = null; return { setTest: function(depthTest) { if (depthTest) { state.enable(gl.DEPTH_TEST); } else { state.disable(gl.DEPTH_TEST); } }, setMask: function(depthMask) { if (currentDepthMask !== depthMask && !locked) { gl.depthMask(depthMask); currentDepthMask = depthMask; } }, setFunc: function(depthFunc) { if (currentDepthFunc !== depthFunc) { gl.depthFunc(depthFunc); currentDepthFunc = depthFunc; } }, setLocked: function(lock) { locked = lock; }, setClear: function(depth) { if (currentDepthClear !== depth) { gl.clearDepth(depth); currentDepthClear = depth; } }, reset: function() { locked = false; currentDepthMask = null; currentDepthFunc = null; currentDepthClear = null; } }; } function StencilBuffer(gl, state) { let locked = false; let currentStencilMask = null; let currentStencilFunc = null; let currentStencilRef = null; let currentStencilFuncMask = null; let currentStencilFail = null; let currentStencilZFail = null; let currentStencilZPass = null; let currentStencilFuncBack = null; let currentStencilRefBack = null; let currentStencilFuncMaskBack = null; let currentStencilFailBack = null; let currentStencilZFailBack = null; let currentStencilZPassBack = null; let currentStencilClear = null; return { setTest: function(stencilTest) { if (stencilTest) { state.enable(gl.STENCIL_TEST); } else { state.disable(gl.STENCIL_TEST); } }, setMask: function(stencilMask) { if (currentStencilMask !== stencilMask && !locked) { gl.stencilMask(stencilMask); currentStencilMask = stencilMask; } }, setFunc: function(stencilFunc, stencilRef, stencilMask, stencilFuncBack, stencilRefBack, stencilMaskBack) { if (currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask || currentStencilFuncBack !== stencilFuncBack || currentStencilRefBack !== stencilRefBack || currentStencilFuncMaskBack !== stencilMaskBack) { if (stencilFuncBack === null || stencilRefBack === null || stencilMaskBack === null) { gl.stencilFunc(stencilFunc, stencilRef, stencilMask); } else { gl.stencilFuncSeparate(gl.FRONT, stencilFunc, stencilRef, stencilMask); gl.stencilFuncSeparate(gl.BACK, stencilFuncBack, stencilRefBack, stencilMaskBack); } currentStencilFunc = stencilFunc; currentStencilRef = stencilRef; currentStencilFuncMask = stencilMask; currentStencilFuncBack = stencilFuncBack; currentStencilRefBack = stencilRefBack; currentStencilFuncMaskBack = stencilMaskBack; } }, setOp: function(stencilFail, stencilZFail, stencilZPass, stencilFailBack, stencilZFailBack, stencilZPassBack) { if (currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass || currentStencilFailBack !== stencilFailBack || currentStencilZFailBack !== stencilZFailBack || currentStencilZPassBack !== stencilZPassBack) { if (stencilFailBack === null || stencilZFailBack === null || stencilZPassBack === null) { gl.stencilOp(stencilFail, stencilZFail, stencilZPass); } else { gl.stencilOpSeparate(gl.FRONT, stencilFail, stencilZFail, stencilZPass); gl.stencilOpSeparate(gl.BACK, stencilFailBack, stencilZFailBack, stencilZPassBack); } currentStencilFail = stencilFail; currentStencilZFail = stencilZFail; currentStencilZPass = stencilZPass; currentStencilFailBack = stencilFailBack; currentStencilZFailBack = stencilZFailBack; currentStencilZPassBack = stencilZPassBack; } }, setLocked: function(lock) { locked = lock; }, setClear: function(stencil) { if (currentStencilClear !== stencil) { gl.clearStencil(stencil); currentStencilClear = stencil; } }, reset: function() { locked = false; currentStencilMask = null; currentStencilFunc = null; currentStencilRef = null; currentStencilFuncMask = null; currentStencilFail = null; currentStencilZFail = null; currentStencilZPass = null; currentStencilFuncBack = null; currentStencilRefBack = null; currentStencilFuncMaskBack = null; currentStencilFailBack = null; currentStencilZFailBack = null; currentStencilZPassBack = null; currentStencilClear = null; } }; } class WebGLState { constructor(gl, capabilities) { this.gl = gl; this.capabilities = capabilities; this.colorBuffer = new ColorBuffer(gl); this.depthBuffer = new DepthBuffer(gl, this); this.stencilBuffer = new StencilBuffer(gl, this); this.states = {}; this.currentBlending = null; this.currentBlendEquation = null; this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendEquationAlpha = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; this.currentPremultipliedAlpha = null; this.currentFlipSided = false; this.currentCullFace = null; const viewportParam = gl.getParameter(gl.VIEWPORT); this.currentViewport = new Vector4().fromArray(viewportParam); this.currentLineWidth = null; this.currentPolygonOffsetFactor = null; this.currentPolygonOffsetUnits = null; this.currentProgram = null; this.currentBoundBuffers = {}; this.currentRenderTarget = null; // used in WebGLRenderTargets this.currentTextureSlot = null; this.currentBoundTextures = {}; this.emptyTextures = {}; this.emptyTextures[gl.TEXTURE_2D] = createTexture(gl, gl.TEXTURE_2D, gl.TEXTURE_2D, 1); this.emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl, gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6); this.blendEquationToGL = { [BLEND_EQUATION.ADD]: gl.FUNC_ADD, [BLEND_EQUATION.SUBTRACT]: gl.FUNC_SUBTRACT, [BLEND_EQUATION.REVERSE_SUBTRACT]: gl.FUNC_REVERSE_SUBTRACT, [BLEND_EQUATION.MIN]: gl.MIN, [BLEND_EQUATION.MAX]: gl.MAX }; this.blendFactorToGL = { [BLEND_FACTOR.ZERO]: gl.ZERO, [BLEND_FACTOR.ONE]: gl.ONE, [BLEND_FACTOR.SRC_COLOR]: gl.SRC_COLOR, [BLEND_FACTOR.SRC_ALPHA]: gl.SRC_ALPHA, [BLEND_FACTOR.SRC_ALPHA_SATURATE]: gl.SRC_ALPHA_SATURATE, [BLEND_FACTOR.DST_COLOR]: gl.DST_COLOR, [BLEND_FACTOR.DST_ALPHA]: gl.DST_ALPHA, [BLEND_FACTOR.ONE_MINUS_SRC_COLOR]: gl.ONE_MINUS_SRC_COLOR, [BLEND_FACTOR.ONE_MINUS_SRC_ALPHA]: gl.ONE_MINUS_SRC_ALPHA, [BLEND_FACTOR.ONE_MINUS_DST_COLOR]: gl.ONE_MINUS_DST_COLOR, [BLEND_FACTOR.ONE_MINUS_DST_ALPHA]: gl.ONE_MINUS_DST_ALPHA }; // init this.colorBuffer.setClear(0, 0, 0, 1); this.depthBuffer.setClear(1); this.stencilBuffer.setClear(0); this.depthBuffer.setTest(true); this.depthBuffer.setFunc(COMPARE_FUNC.LEQUAL); this.setFlipSided(false); this.setCullFace(CULL_FACE_TYPE.BACK); } enable(id) { if (this.states[id] !== true) { this.gl.enable(id); this.states[id] = true; } } disable(id) { if (this.states[id] !== false) { this.gl.disable(id); this.states[id] = false; } } setBlending(blend, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha) { const gl = this.gl; if (blend === BLEND_TYPE.NONE) { this.disable(gl.BLEND); return; } this.enable(gl.BLEND); if (blend !== BLEND_TYPE.CUSTOM) { if (blend !== this.currentBlending || premultipliedAlpha !== this.currentPremultipliedAlpha) { if (this.currentBlendEquation !== BLEND_EQUATION.ADD || this.currentBlendEquationAlpha !== BLEND_EQUATION.ADD) { gl.blendEquation(gl.FUNC_ADD); this.currentBlendEquation = BLEND_EQUATION.ADD; this.currentBlendEquationAlpha = BLEND_EQUATION.ADD; } if (blend === BLEND_TYPE.NORMAL) { if (premultipliedAlpha) { gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); } else { gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); } } else if (blend === BLEND_TYPE.ADD) { if (premultipliedAlpha) { gl.blendFunc(gl.ONE, gl.ONE); } else { gl.blendFunc(gl.SRC_ALPHA, gl.ONE); } } else if (blend === BLEND_TYPE.SUB) { gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE); } else if (blend === BLEND_TYPE.MUL) { if (premultipliedAlpha) { gl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA); } else { gl.blendFunc(gl.ZERO, gl.SRC_COLOR); } } else { console.error('WebGLState: Invalid blending: ', blend); } } this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; } else { blendEquationAlpha = blendEquationAlpha || blendEquation; blendSrcAlpha = blendSrcAlpha || blendSrc; blendDstAlpha = blendDstAlpha || blendDst; const equationToGL = this.blendEquationToGL; const factorToGL = this.blendFactorToGL; if (blendEquation !== this.currentBlendEquation || blendEquationAlpha !== this.currentBlendEquationAlpha) { gl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]); this.currentBlendEquation = blendEquation; this.currentBlendEquationAlpha = blendEquationAlpha; } if (blendSrc !== this.currentBlendSrc || blendDst !== this.currentBlendDst || blendSrcAlpha !== this.currentBlendSrcAlpha || blendDstAlpha !== this.currentBlendDstAlpha) { gl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]); this.currentBlendSrc = blendSrc; this.currentBlendDst = blendDst; this.currentBlendSrcAlpha = blendSrcAlpha; this.currentBlendDstAlpha = blendDstAlpha; } } this.currentBlending = blend; this.currentPremultipliedAlpha = premultipliedAlpha; } setFlipSided(flipSided) { const gl = this.gl; if (this.currentFlipSided !== flipSided) { if (flipSided) { gl.frontFace(gl.CW); } else { gl.frontFace(gl.CCW); } this.currentFlipSided = flipSided; } } setCullFace(cullFace) { const gl = this.gl; if (cullFace !== CULL_FACE_TYPE.NONE) { this.enable(gl.CULL_FACE); if (cullFace !== this.currentCullFace) { if (cullFace === CULL_FACE_TYPE.BACK) { gl.cullFace(gl.BACK); } else if (cullFace === CULL_FACE_TYPE.FRONT) { gl.cullFace(gl.FRONT); } else { gl.cullFace(gl.FRONT_AND_BACK); } } } else { this.disable(gl.CULL_FACE); } this.currentCullFace = cullFace; } viewport(viewport) { const currentViewport = this.currentViewport; if (currentViewport.equals(viewport)) return; this.gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w); currentViewport.copy(viewport); } setLineWidth(width) { if (width !== this.currentLineWidth) { const lineWidthRange = this.capabilities.lineWidthRange; if (lineWidthRange[0] <= width && width <= lineWidthRange[1]) { this.gl.lineWidth(width); } else { console.warn('GL_ALIASED_LINE_WIDTH_RANGE is [' + lineWidthRange[0] + ',' + lineWidthRange[1] + '], but set to ' + width + '.'); } this.currentLineWidth = width; } } setPolygonOffset(polygonOffset, factor, units) { const gl = this.gl; if (polygonOffset) { this.enable(gl.POLYGON_OFFSET_FILL); if (this.currentPolygonOffsetFactor !== factor || this.currentPolygonOffsetUnits !== units) { gl.polygonOffset(factor, units); this.currentPolygonOffsetFactor = factor; this.currentPolygonOffsetUnits = units; } } else { this.disable(gl.POLYGON_OFFSET_FILL); } } setProgram(program) { if (this.currentProgram !== program) { this.gl.useProgram(program.program); this.currentProgram = program; } } bindBuffer(type, buffer) { const gl = this.gl; const boundBuffer = this.currentBoundBuffers[type]; if (boundBuffer !== buffer) { gl.bindBuffer(type, buffer); this.currentBoundBuffers[type] = buffer; } } activeTexture(slot) { const gl = this.gl; if (slot === undefined) { slot = gl.TEXTURE0 + this.capabilities.maxTextures - 1; } if (this.currentTextureSlot !== slot) { gl.activeTexture(slot); this.currentTextureSlot = slot; } } bindTexture(type, texture) { const gl = this.gl; if (this.currentTextureSlot === null) { this.activeTexture(); } let boundTexture = this.currentBoundTextures[this.currentTextureSlot]; if (boundTexture === undefined) { boundTexture = { type: undefined, texture: undefined }; this.currentBoundTextures[this.currentTextureSlot] = boundTexture; } if (boundTexture.type !== type || boundTexture.texture !== texture) { gl.bindTexture(type, texture || this.emptyTextures[type]); boundTexture.type = type; boundTexture.texture = texture; } } reset() { const gl = this.gl; gl.colorMask(true, true, true, true); gl.clearColor(0, 0, 0, 0); gl.depthMask(true); gl.depthFunc(gl.LESS); gl.clearDepth(1); gl.stencilMask(0xffffffff); gl.stencilFunc(gl.ALWAYS, 0, 0xffffffff); gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); gl.clearStencil(0); gl.disable(gl.BLEND); gl.disable(gl.CULL_FACE); gl.disable(gl.DEPTH_TEST); gl.disable(gl.POLYGON_OFFSET_FILL); gl.disable(gl.SCISSOR_TEST); gl.disable(gl.STENCIL_TEST); gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE); gl.blendEquation(gl.FUNC_ADD); gl.blendFunc(gl.ONE, gl.ZERO); gl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO); gl.cullFace(gl.BACK); gl.frontFace(gl.CCW); // gl.scissor(0, 0, gl.canvas.width, gl.canvas.height); gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); gl.lineWidth(1); gl.polygonOffset(0, 0); gl.useProgram(null); gl.bindFramebuffer(gl.FRAMEBUFFER, null); gl.activeTexture(gl.TEXTURE0); this.colorBuffer.reset(); this.depthBuffer.reset(); this.stencilBuffer.reset(); this.states = {}; this.currentBlending = null; this.currentBlendEquation = null; this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendEquationAlpha = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; this.currentPremultipliedAlpha = null; this.currentFlipSided = false; this.currentCullFace = null; this.currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height); this.currentLineWidth = null; this.currentPolygonOffsetFactor = null; this.currentPolygonOffsetUnits = null; this.currentProgram = null; this.currentBoundBuffers = {}; this.currentRenderTarget = null; // used in WebGLRenderTargets this.currentTextureSlot = null; this.currentBoundTextures = {}; } setMaterial(material, frontFaceCW) { this.setCullFace( (material.side === DRAW_SIDE.DOUBLE) ? CULL_FACE_TYPE.NONE : CULL_FACE_TYPE.BACK ); let flipSided = (material.side === DRAW_SIDE.BACK); if (frontFaceCW) flipSided = !flipSided; this.setFlipSided(flipSided); if (material.blending === BLEND_TYPE.NORMAL && material.transparent === false) { this.setBlending(BLEND_TYPE.NONE); } else { this.setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha); } this.depthBuffer.setFunc(material.depthFunc); this.depthBuffer.setTest(material.depthTest); this.depthBuffer.setMask(material.depthWrite); this.colorBuffer.setMask(material.colorWrite); const stencilTest = material.stencilTest; this.stencilBuffer.setTest(stencilTest); if (stencilTest) { this.stencilBuffer.setMask(material.stencilWriteMask); this.stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask, material.stencilFuncBack, material.stencilRefBack, material.stencilFuncMaskBack); this.stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass, material.stencilFailBack, material.stencilZFailBack, material.stencilZPassBack); } this.setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits); if (material.lineWidth !== undefined) { this.setLineWidth(material.lineWidth); } material.alphaToCoverage === true ? this.enable(this.gl.SAMPLE_ALPHA_TO_COVERAGE) : this.disable(this.gl.SAMPLE_ALPHA_TO_COVERAGE); } } class WebGLTextures extends PropertyMap { constructor(prefix, gl, state, capabilities, constants) { super(prefix); this._gl = gl; this._state = state; this._capabilities = capabilities; this._constants = constants; this._usedTextureUnits = 0; const that = this; function onTextureDispose(event) { const texture = event.target; const textureProperties = that.get(texture); texture.removeEventListener('dispose', onTextureDispose); if (textureProperties.__webglTexture && !textureProperties.__external) { gl.deleteTexture(textureProperties.__webglTexture); } if (textureProperties.__readBuffer) { gl.deleteBuffer(textureProperties.__readBuffer); } that.delete(texture); } this._onTextureDispose = onTextureDispose; this._wrappingToGL = { [TEXTURE_WRAP.REPEAT]: gl.REPEAT, [TEXTURE_WRAP.CLAMP_TO_EDGE]: gl.CLAMP_TO_EDGE, [TEXTURE_WRAP.MIRRORED_REPEAT]: gl.MIRRORED_REPEAT }; this._filterToGL = { [TEXTURE_FILTER.NEAREST]: gl.NEAREST, [TEXTURE_FILTER.LINEAR]: gl.LINEAR, [TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST]: gl.NEAREST_MIPMAP_NEAREST, [TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST]: gl.LINEAR_MIPMAP_NEAREST, [TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR]: gl.NEAREST_MIPMAP_LINEAR, [TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR]: gl.LINEAR_MIPMAP_LINEAR }; } allocTexUnit() { const textureUnit = this._usedTextureUnits++; if (textureUnit >= this._capabilities.maxTextures) { console.warn('trying to use ' + textureUnit + ' texture units while this GPU supports only ' + this._capabilities.maxTextures); } return textureUnit; } resetTextureUnits() { this._usedTextureUnits = 0; } setTexture(texture, slot) { const gl = this._gl; const capabilities = this._capabilities; const constants = this._constants; const state = this._state; if ((texture.isTexture3D || texture.isTexture2DArray) && capabilities.version < 2) { console.warn('WebGLTextures: Texture3D/Texture2DArray is not supported in WebGL1.0.'); return; } if (slot !== undefined) { slot = gl.TEXTURE0 + slot; } const textureProperties = this.get(texture); const textureTarget = getTextureTarget(gl, texture); const hasImage = texture.isTextureCube ? texture.images.length === 6 : !!texture.image; let singleImage = texture.isTextureCube ? texture.images[0] : texture.image; if ( hasImage && textureProperties.__version !== texture.version // Do not initialize rtt texture, unless slot is undefined, // which means the caller just wants to bind the texture to the framebuffer, not use it for sampling. && (!singleImage.rtt || slot === undefined) // Do not initialize external texture && !textureProperties.__external ) { if (textureProperties.__webglTexture === undefined) { texture.addEventListener('dispose', this._onTextureDispose); textureProperties.__webglTexture = gl.createTexture(); textureProperties.__webglTarget = textureTarget; } if ( capabilities.version < 2 && texture.isTexture2D && !_isPowerOfTwo(singleImage) && textureNeedsPowerOfTwo(texture) && domCheck(singleImage) ) { singleImage = makePowerOf2(singleImage); } const needFallback = capabilities.version < 2 && !_isPowerOfTwo(singleImage); const uploadMipmaps = texture.mipmaps.length > 0 && !needFallback; const glFormat = constants.getGLFormat(texture.format), glType = constants.getGLType(texture.type), glInternalFormat = (texture.internalformat !== null) ? constants.getGLInternalFormat(texture.internalformat) : getGLInternalFormat(gl, capabilities, glFormat, glType); textureProperties.__glFormat = glFormat; textureProperties.__glType = glType; textureProperties.__glInternalFormat = glInternalFormat; textureProperties.__width = singleImage.width; textureProperties.__height = singleImage.height; textureProperties.__maxMipLevel = uploadMipmaps ? texture.mipmaps.length - 1 : 0; state.activeTexture(slot); state.bindTexture(textureTarget, textureProperties.__webglTexture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); gl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment); gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE); this._setTextureParameters(texture, textureTarget, needFallback); if (texture.isTexture2D) { this._upload2DImage(texture, textureProperties, uploadMipmaps, singleImage); } else if (texture.isTextureCube) { this._uploadCubeImages(texture, textureProperties, uploadMipmaps); } else if (texture.isTexture3D) { this._upload3DImage(texture, textureProperties); } else if (texture.isTexture2DArray) { this._upload2DArrayImage(texture, textureProperties); } if (texture.generateMipmaps && !uploadMipmaps && !needFallback) { this.generateMipmaps(texture); } textureProperties.__version = texture.version; return textureProperties; } state.activeTexture(slot); state.bindTexture(textureTarget, textureProperties.__webglTexture); return textureProperties; } generateMipmaps(texture) { const gl = this._gl; const textureProperties = this.get(texture); gl.generateMipmap(textureProperties.__webglTarget); const width = textureProperties.__width, height = textureProperties.__height; // Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 textureProperties.__maxMipLevel = Math.log(Math.max(width, height)) * Math.LOG2E; } setTextureExternal(texture, webglTexture) { const gl = this._gl; const textureProperties = this.get(texture); if (!textureProperties.__external) { if (textureProperties.__webglTexture) { gl.deleteTexture(textureProperties.__webglTexture); } else { texture.addEventListener('dispose', this._onTextureDispose); } } textureProperties.__webglTexture = webglTexture; textureProperties.__external = true; } _setTextureParameters(texture, textureType, needFallback) { const gl = this._gl; const capabilities = this._capabilities; const wrappingToGL = this._wrappingToGL; const filterToGL = this._filterToGL; let wrapS = texture.wrapS, wrapT = texture.wrapT, wrapR = texture.wrapR, magFilter = texture.magFilter, minFilter = texture.minFilter; // fix for non power of 2 image in WebGL 1.0 if (needFallback) { wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE; wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE; if (texture.isTexture3D) { wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE; } if (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) { console.warn('Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to TEXTURE_WRAP.CLAMP_TO_EDGE.', texture); } magFilter = filterFallback(texture.magFilter); minFilter = filterFallback(texture.minFilter); if ( (texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR) || (texture.magFilter !== TEXTURE_FILTER.NEAREST && texture.magFilter !== TEXTURE_FILTER.LINEAR) ) { console.warn('Texture is not power of two. Texture.minFilter and Texture.magFilter should be set to TEXTURE_FILTER.NEAREST or TEXTURE_FILTER.LINEAR.', texture); } } gl.texParameteri(textureType, gl.TEXTURE_WRAP_S, wrappingToGL[wrapS]); gl.texParameteri(textureType, gl.TEXTURE_WRAP_T, wrappingToGL[wrapT]); if (texture.isTexture3D) { gl.texParameteri(textureType, gl.TEXTURE_WRAP_R, wrappingToGL[wrapR]); } gl.texParameteri(textureType, gl.TEXTURE_MAG_FILTER, filterToGL[magFilter]); gl.texParameteri(textureType, gl.TEXTURE_MIN_FILTER, filterToGL[minFilter]); // anisotropy if EXT_texture_filter_anisotropic exist const extension = capabilities.anisotropyExt; if (extension) { gl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.maxAnisotropy)); } if (capabilities.version >= 2) { if (texture.compare !== undefined) { gl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); gl.texParameteri(textureType, gl.TEXTURE_COMPARE_FUNC, texture.compare); } else { gl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.NONE); } } } _upload2DImage(texture, textureProperties, uploadMipmaps, image) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; if (domCheck(image)) { if (uploadMipmaps) { const mipmaps = texture.mipmaps; for (let level = 0, l = mipmaps.length; level < l; level++) { gl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level]); } } else { gl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image); } } else { if (uploadMipmaps) { const isCompressed = image.isCompressed; const mipmaps = texture.mipmaps; let mipmap; for (let level = 0, l = mipmaps.length; level < l; level++) { mipmap = mipmaps[level]; if (isCompressed) { gl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); } else { gl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data); } } } else { gl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data); } } } _uploadCubeImages(texture, textureProperties, uploadMipmaps) { const gl = this._gl; const glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const images = texture.images; for (let face = 0; face < 6; face++) { const image = images[face]; const glTarget = gl.TEXTURE_CUBE_MAP_POSITIVE_X + face; if (domCheck(image)) { if (uploadMipmaps) { const mipmaps = texture.mipmaps; for (let level = 0, l = mipmaps.length; level < l; level++) { gl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level][face]); } } else { gl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image); } } else { if (uploadMipmaps) { const isCompressed = image.isCompressed; const mipmaps = texture.mipmaps; let mipmap; for (let level = 0, l = mipmaps.length; level < l; level++) { mipmap = mipmaps[level][face]; if (isCompressed) { gl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); } else { gl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data); } } } else { gl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data); } } } } _upload3DImage(texture, textureProperties) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const image = texture.image; gl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data); } _upload2DArrayImage(texture, textureProperties) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const image = texture.image; if (texture.layerUpdates.size > 0) { for (const layerIndex of texture.layerUpdates) { const layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type); const layerData = image.data.subarray( layerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT, (layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT ); gl.texSubImage3D(glTarget, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData); } texture.layerUpdates.clear(); } else { gl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data); } } } function textureNeedsPowerOfTwo(texture) { return (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) || (texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR); } function filterFallback(filter) { if (filter === TEXTURE_FILTER.NEAREST || filter === TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR || filter === TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST) { return TEXTURE_FILTER.NEAREST; } return TEXTURE_FILTER.LINEAR; } function _isPowerOfTwo(image) { return MathUtils.isPowerOfTwo(image.width) && MathUtils.isPowerOfTwo(image.height); } let _canvas; function makePowerOf2(image) { if (_canvas === undefined) _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); _canvas.width = MathUtils.nearestPowerOfTwo(image.width); _canvas.height = MathUtils.nearestPowerOfTwo(image.height); const context = _canvas.getContext('2d'); context.drawImage(image, 0, 0, _canvas.width, _canvas.height); console.warn('image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image); return _canvas; } function getGLInternalFormat(gl, capabilities, glFormat, glType) { const isWebGL2 = capabilities.version >= 2; if (isWebGL2 === false) return glFormat; let glInternalFormat = glFormat; if (glFormat === gl.RED) { if (glType === gl.FLOAT) glInternalFormat = gl.R32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.R16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.R8; } if (glFormat === gl.RG) { if (glType === gl.FLOAT) glInternalFormat = gl.RG32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RG16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RG8; } if (glFormat === gl.RGB) { if (glType === gl.FLOAT) glInternalFormat = gl.RGB32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGB16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGB8; } if (glFormat === gl.RGBA) { if (glType === gl.FLOAT) glInternalFormat = gl.RGBA32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGBA16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGBA8; if (glType === gl.UNSIGNED_SHORT_4_4_4_4) glInternalFormat = gl.RGBA4; if (glType === gl.UNSIGNED_SHORT_5_5_5_1) glInternalFormat = gl.RGB5_A1; } if (glFormat === gl.DEPTH_COMPONENT || glFormat === gl.DEPTH_STENCIL) { glInternalFormat = gl.DEPTH_COMPONENT16; if (glType === gl.FLOAT) glInternalFormat = gl.DEPTH_COMPONENT32F; if (glType === gl.UNSIGNED_INT) glInternalFormat = gl.DEPTH_COMPONENT24; if (glType === gl.UNSIGNED_INT_24_8) glInternalFormat = gl.DEPTH24_STENCIL8; if (glType === gl.FLOAT_32_UNSIGNED_INT_24_8_REV) glInternalFormat = gl.DEPTH32F_STENCIL8; } if (glInternalFormat === gl.R16F || glInternalFormat === gl.R32F || glInternalFormat === gl.RG16F || glInternalFormat === gl.RG32F || glInternalFormat === gl.RGB16F || glInternalFormat === gl.RGB32F || glInternalFormat === gl.RGBA16F || glInternalFormat === gl.RGBA32F) { capabilities.getExtension('EXT_color_buffer_float'); } return glInternalFormat; } function domCheck(image) { return (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) || (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) || (typeof HTMLVideoElement !== 'undefined' && image instanceof HTMLVideoElement) || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap); } function getByteLength(width, height, format, type) { const typeByteLength = getTextureTypeByteLength(type); switch (format) { // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml case PIXEL_FORMAT.ALPHA: return width * height; case PIXEL_FORMAT.LUMINANCE: return width * height; case PIXEL_FORMAT.LUMINANCE_ALPHA: return width * height * 2; case PIXEL_FORMAT.RED: return ((width * height) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RED_INTEGER: return ((width * height) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RG: return ((width * height * 2) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RG_INTEGER: return ((width * height * 2) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RGB: return ((width * height * 3) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RGBA: return ((width * height * 4) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RGBA_INTEGER: return ((width * height * 4) / typeByteLength.components) * typeByteLength.byteLength; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/ case PIXEL_FORMAT.RGB_S3TC_DXT1: case PIXEL_FORMAT.RGBA_S3TC_DXT1: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; case PIXEL_FORMAT.RGBA_S3TC_DXT3: case PIXEL_FORMAT.RGBA_S3TC_DXT5: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/ case PIXEL_FORMAT.RGB_PVRTC_2BPPV1: case PIXEL_FORMAT.RGBA_PVRTC_2BPPV1: return (Math.max(width, 16) * Math.max(height, 8)) / 4; case PIXEL_FORMAT.RGB_PVRTC_4BPPV1: case PIXEL_FORMAT.RGBA_PVRTC_4BPPV1: return (Math.max(width, 8) * Math.max(height, 8)) / 2; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/ case PIXEL_FORMAT.RGB_ETC1: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/ case PIXEL_FORMAT.RGBA_ASTC_4x4: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/ case PIXEL_FORMAT.RGBA_BPTC: return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; } throw new Error( `Unable to determine texture byte length for ${format} format.` ); } const _tempTypeByteLength = { byteLength: 0, components: 0 }; function getTextureTypeByteLength(type) { switch (type) { case PIXEL_TYPE.UNSIGNED_BYTE: case PIXEL_TYPE.ByteType: _tempTypeByteLength.byteLength = 1; _tempTypeByteLength.components = 1; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_SHORT: case PIXEL_TYPE.SHORT: case PIXEL_TYPE.HALF_FLOAT: _tempTypeByteLength.byteLength = 2; _tempTypeByteLength.components = 1; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4: case PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1: _tempTypeByteLength.byteLength = 2; _tempTypeByteLength.components = 4; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_INT: case PIXEL_TYPE.INT: case PIXEL_TYPE.FLOAT: _tempTypeByteLength.byteLength = 4; _tempTypeByteLength.components = 1; return _tempTypeByteLength; } throw new Error(`Unknown texture type ${type}.`); } function getTextureTarget(gl, texture) { if (texture.isTexture2D) { return gl.TEXTURE_2D; } else if (texture.isTextureCube) { return gl.TEXTURE_CUBE_MAP; } else if (texture.isTexture3D) { return gl.TEXTURE_3D; } else if (texture.isTexture2DArray) { return gl.TEXTURE_2D_ARRAY; } else { return gl.TEXTURE_2D; } } class WebGLRenderBuffers extends PropertyMap { constructor(prefix, gl, capabilities, constants) { super(prefix); this._gl = gl; this._capabilities = capabilities; this._constants = constants; const that = this; function onRenderBufferDispose(event) { const renderBuffer = event.target; renderBuffer.removeEventListener('dispose', onRenderBufferDispose); const renderBufferProperties = that.get(renderBuffer); if (renderBufferProperties.__webglRenderbuffer && !renderBufferProperties.__external) { gl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer); } that.delete(renderBuffer); } this._onRenderBufferDispose = onRenderBufferDispose; } setRenderBuffer(renderBuffer) { const gl = this._gl; const capabilities = this._capabilities; const constants = this._constants; const renderBufferProperties = this.get(renderBuffer); if (renderBufferProperties.__webglRenderbuffer === undefined) { renderBuffer.addEventListener('dispose', this._onRenderBufferDispose); renderBufferProperties.__webglRenderbuffer = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); const glFormat = constants.getGLInternalFormat(renderBuffer.format); if (renderBuffer.multipleSampling > 0) { if (capabilities.version < 2) { console.error('render buffer multipleSampling is not support in webgl 1.0.'); } gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(renderBuffer.multipleSampling, capabilities.maxSamples), glFormat, renderBuffer.width, renderBuffer.height); } else { gl.renderbufferStorage(gl.RENDERBUFFER, glFormat, renderBuffer.width, renderBuffer.height); } } else { gl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); } return renderBufferProperties; } setRenderBufferExternal(renderBuffer, webglRenderbuffer) { const gl = this._gl; const renderBufferProperties = this.get(renderBuffer); if (!renderBufferProperties.__external) { if (renderBufferProperties.__webglRenderbuffer) { gl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer); } else { renderBuffer.addEventListener('dispose', this._onRenderBufferDispose); } } renderBufferProperties.__webglRenderbuffer = webglRenderbuffer; renderBufferProperties.__external = true; } } class WebGLRenderTargets extends PropertyMap { constructor(prefix, gl, state, capabilities, textures, renderBuffers, constants) { super(prefix); this._gl = gl; this._state = state; this._capabilities = capabilities; this._textures = textures; this._renderBuffers = renderBuffers; this._constants = constants; const that = this; function onRenderTargetDispose(event) { const renderTarget = event.target; renderTarget.removeEventListener('dispose', onRenderTargetDispose); const renderTargetProperties = that.get(renderTarget); if (renderTargetProperties.__webglFramebuffer && !renderTargetProperties.__external) { gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); } that.delete(renderTarget); if (state.currentRenderTarget === renderTarget) { state.currentRenderTarget = null; } } this._onRenderTargetDispose = onRenderTargetDispose; } _setupRenderTarget(renderTarget) { const gl = this._gl; const state = this._state; const textures = this._textures; const renderBuffers = this._renderBuffers; const capabilities = this._capabilities; const renderTargetProperties = this.get(renderTarget); renderTarget.addEventListener('dispose', this._onRenderTargetDispose); const glFrameBuffer = gl.createFramebuffer(); const drawBuffers = []; renderTargetProperties.__webglFramebuffer = glFrameBuffer; renderTargetProperties.__drawBuffers = drawBuffers; renderTargetProperties.__currentActiveMipmapLevel = renderTarget.activeMipmapLevel; renderTargetProperties.__currentActiveLayer = renderTarget.activeLayer; gl.bindFramebuffer(gl.FRAMEBUFFER, glFrameBuffer); for (const attachTarget in renderTarget._attachments) { const glAttachTarget = attachTargetToGL[attachTarget]; if (glAttachTarget === gl.DEPTH_ATTACHMENT || glAttachTarget === gl.DEPTH_STENCIL_ATTACHMENT) { if (capabilities.version < 2 && !capabilities.getExtension('WEBGL_depth_texture')) { console.warn('WebGLRenderTargets: extension WEBGL_depth_texture is not support.'); } } else if (glAttachTarget !== gl.STENCIL_ATTACHMENT) { drawBuffers.push(glAttachTarget); } const attachment = renderTarget._attachments[attachTarget]; if (attachment.isTexture) { const textureProperties = textures.setTexture(attachment); if (attachment.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_2D, textureProperties.__webglTexture, renderTarget.activeMipmapLevel); } else if (attachment.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeLayer, textureProperties.__webglTexture, renderTarget.activeMipmapLevel); } else if (attachment.isTexture3D || attachment.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, glAttachTarget, textureProperties.__webglTexture, renderTarget.activeMipmapLevel, renderTarget.activeLayer); } state.bindTexture(textureProperties.__webglTarget, null); } else { const renderBufferProperties = renderBuffers.setRenderBuffer(attachment); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, glAttachTarget, gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); } } drawBuffers.sort(drawBufferSort); if (capabilities.version >= 2) { gl.drawBuffers(drawBuffers); } else if (capabilities.getExtension('WEBGL_draw_buffers')) { capabilities.getExtension('WEBGL_draw_buffers').drawBuffersWEBGL(drawBuffers); } } setRenderTarget(renderTarget) { const gl = this._gl; const state = this._state; const textures = this._textures; let renderTargetProperties; if (state.currentRenderTarget !== renderTarget) { if (renderTarget.isScreenRenderTarget) { gl.bindFramebuffer(gl.FRAMEBUFFER, null); } else { renderTargetProperties = this.get(renderTarget); if (renderTargetProperties.__webglFramebuffer === undefined) { this._setupRenderTarget(renderTarget); } else { gl.bindFramebuffer(gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); } } state.currentRenderTarget = renderTarget; } renderTargetProperties = this.get(renderTarget); if (renderTargetProperties.__external) return; const activeLayer = renderTarget.activeLayer; const activeMipmapLevel = renderTarget.activeMipmapLevel; if (renderTargetProperties.__currentActiveLayer !== activeLayer || renderTargetProperties.__currentActiveMipmapLevel !== activeMipmapLevel) { for (const attachTarget in renderTarget._attachments) { const attachment = renderTarget._attachments[attachTarget]; if (!attachment.isTexture) continue; const textureProperties = textures.get(attachment); if (attachment.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel); } else if (attachment.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeLayer, textureProperties.__webglTexture, activeMipmapLevel); } else if (attachment.isTexture3D || attachment.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], textureProperties.__webglTexture, activeMipmapLevel, activeLayer); } } renderTargetProperties.__currentActiveLayer = activeLayer; renderTargetProperties.__currentActiveMipmapLevel = activeMipmapLevel; } } blitRenderTarget(read, draw, color = true, depth = true, stencil = true) { const gl = this._gl; const state = this._state; const capabilities = this._capabilities; if (capabilities.version < 2) { console.warn('WebGLRenderTargets: blitFramebuffer not support by WebGL' + capabilities.version); return; } let needRestoreFramebuffer = false; let readBuffer = this.get(read).__webglFramebuffer; if (!readBuffer) { this._setupRenderTarget(read); readBuffer = this.get(read).__webglFramebuffer; needRestoreFramebuffer = true; } let drawBuffer = this.get(draw).__webglFramebuffer; if (!drawBuffer) { this._setupRenderTarget(draw); drawBuffer = this.get(draw).__webglFramebuffer; needRestoreFramebuffer = true; } if (needRestoreFramebuffer) { // restore framebuffer binding const framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ? this.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); } gl.bindFramebuffer(gl.READ_FRAMEBUFFER, readBuffer); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, drawBuffer); let mask = 0; if (color) mask |= gl.COLOR_BUFFER_BIT; if (depth) mask |= gl.DEPTH_BUFFER_BIT; if (stencil) mask |= gl.STENCIL_BUFFER_BIT; // gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 0.0]); gl.blitFramebuffer( 0, 0, read.width, read.height, 0, 0, draw.width, draw.height, mask, gl.NEAREST ); } setFramebufferExternal(renderTarget, webglFramebuffer) { const renderTargetProperties = this.get(renderTarget); if (!renderTargetProperties.__external) { if (renderTargetProperties.__webglFramebuffer) { this._gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); } else { renderTarget.addEventListener('dispose', this._onRenderTargetDispose); } } renderTargetProperties.__webglFramebuffer = webglFramebuffer; renderTargetProperties.__external = true; } } const attachTargetToGL = { [ATTACHMENT.COLOR_ATTACHMENT0]: 0x8CE0, [ATTACHMENT.COLOR_ATTACHMENT1]: 0x8CE1, [ATTACHMENT.COLOR_ATTACHMENT2]: 0x8CE2, [ATTACHMENT.COLOR_ATTACHMENT3]: 0x8CE3, [ATTACHMENT.COLOR_ATTACHMENT4]: 0x8CE4, [ATTACHMENT.COLOR_ATTACHMENT5]: 0x8CE5, [ATTACHMENT.COLOR_ATTACHMENT6]: 0x8CE6, [ATTACHMENT.COLOR_ATTACHMENT7]: 0x8CE7, [ATTACHMENT.COLOR_ATTACHMENT8]: 0x8CE8, [ATTACHMENT.COLOR_ATTACHMENT9]: 0x8CE9, [ATTACHMENT.COLOR_ATTACHMENT10]: 0x8CEA, [ATTACHMENT.COLOR_ATTACHMENT11]: 0x8CEB, [ATTACHMENT.COLOR_ATTACHMENT12]: 0x8CEC, [ATTACHMENT.COLOR_ATTACHMENT13]: 0x8CED, [ATTACHMENT.COLOR_ATTACHMENT14]: 0x8CEE, [ATTACHMENT.COLOR_ATTACHMENT15]: 0x8CEF, [ATTACHMENT.DEPTH_ATTACHMENT]: 0x8D00, [ATTACHMENT.STENCIL_ATTACHMENT]: 0x8D20, [ATTACHMENT.DEPTH_STENCIL_ATTACHMENT]: 0x821A }; function drawBufferSort(a, b) { return a - b; } class WebGLBuffers extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; } setBuffer(buffer, bufferType, vertexArrayBindings) { const bufferProperties = this.get(buffer); const needCreate = bufferProperties.glBuffer === undefined; if (!needCreate && bufferProperties.version === buffer.version) return; // Avoid polluting the binding state if (vertexArrayBindings) { vertexArrayBindings.reset(); } if (needCreate || bufferProperties.__external) { // Because Buffer does not have a dispose interface at present, // when the version increases, the external is automatically closed this._createGLBuffer(bufferProperties, buffer, bufferType); } else { this._updateGLBuffer(bufferProperties.glBuffer, buffer, bufferType); bufferProperties.version = buffer.version; } } removeBuffer(buffer) { const gl = this._gl; const bufferProperties = this.get(buffer); if (bufferProperties.glBuffer && !bufferProperties.__external) { gl.deleteBuffer(bufferProperties.glBuffer); } this.delete(buffer); } setBufferExternal(buffer, webglBuffer) { const gl = this._gl; const bufferProperties = this.get(buffer); if (!bufferProperties.__external) { if (bufferProperties.glBuffer) { gl.deleteBuffer(bufferProperties.glBuffer); } } const type = getBufferType(gl, buffer.array); bufferProperties.glBuffer = webglBuffer; bufferProperties.type = type; bufferProperties.bytesPerElement = buffer.array.BYTES_PER_ELEMENT; bufferProperties.version = buffer.version; bufferProperties.__external = true; } _createGLBuffer(bufferProperties, buffer, bufferType) { const gl = this._gl; const array = buffer.array; const usage = buffer.usage; const glBuffer = gl.createBuffer(); gl.bindBuffer(bufferType, glBuffer); gl.bufferData(bufferType, array, usage); buffer.onUploadCallback(); const type = getBufferType(gl, array); bufferProperties.glBuffer = glBuffer; bufferProperties.type = type; bufferProperties.bytesPerElement = array.BYTES_PER_ELEMENT; bufferProperties.version = buffer.version; bufferProperties.__external = false; buffer.updateRange.count = -1; // reset range } _updateGLBuffer(glBuffer, buffer, bufferType) { const gl = this._gl; const capabilities = this._capabilities; const array = buffer.array; const updateRange = buffer.updateRange; gl.bindBuffer(bufferType, glBuffer); if (updateRange.count === -1) { // Not using update ranges gl.bufferSubData(bufferType, 0, array); } else { if (capabilities.version >= 2) { gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array, updateRange.offset, updateRange.count); } else { gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array.subarray(updateRange.offset, updateRange.offset + updateRange.count)); } updateRange.count = -1; // reset range } } } function getBufferType(gl, array) { let type; if (array instanceof Float32Array) { type = gl.FLOAT; } else if (array instanceof Float64Array) { console.warn('Unsupported data buffer format: Float64Array.'); } else if (array instanceof Uint16Array) { type = gl.UNSIGNED_SHORT; } else if (array instanceof Int16Array) { type = gl.SHORT; } else if (array instanceof Uint32Array) { type = gl.UNSIGNED_INT; } else if (array instanceof Int32Array) { type = gl.INT; } else if (array instanceof Int8Array) { type = gl.BYTE; } else if (array instanceof Uint8Array) { type = gl.UNSIGNED_BYTE; } else { type = gl.FLOAT; } return type; } class WebGLMaterials extends PropertyMap { constructor(prefix, programs, vertexArrayBindings) { super(prefix); const that = this; function onMaterialDispose(event) { const material = event.target; const materialProperties = that.get(material); material.removeEventListener('dispose', onMaterialDispose); const programList = materialProperties.programList; if (programList !== undefined) { for (let i = 0, l = programList.length; i < l; i++) { const program = programList[i]; vertexArrayBindings.releaseByProgram(program); programs.releaseProgram(program); } } that.delete(material); } this._onMaterialDispose = onMaterialDispose; this._programs = programs; this._vertexArrayBindings = vertexArrayBindings; } setMaterial(material) { const materialProperties = this.get(material); if (materialProperties.programList === undefined) { material.addEventListener('dispose', this._onMaterialDispose); materialProperties.programList = []; } // Set other material properties in renderer return materialProperties; } updateProgram(material, object, lightingState, renderStates, shaderCompileOptions) { const programs = this._programs; const vertexArrayBindings = this._vertexArrayBindings; const materialProperties = this.get(material); const props = programs.generateProps(material, object, lightingState, renderStates); const programCode = programs.generateProgramCode(props, material); const programList = materialProperties.programList; let targetProgram = findProgram(programList, programCode); if (targetProgram === null) { targetProgram = programs.getProgram(material, props, programCode, shaderCompileOptions); programList.unshift(targetProgram); if (programList.length > shaderCompileOptions.maxMaterialPrograms) { // release the last program const lastProgram = programList.pop(); vertexArrayBindings.releaseByProgram(lastProgram); programs.releaseProgram(lastProgram); } } materialProperties.currentProgram = targetProgram; } } function findProgram(list, code) { let index = 0, target = null; for (let l = list.length; index < l; index++) { const program = list[index]; if (program.code === code) { target = program; break; } } // move to the first if (target !== null && index > 0) { for (let i = index; i > 0; i--) { list[i] = list[i - 1]; } list[0] = target; } return target; } const emptyString = ''; class WebGLVertexArrayBindings extends PropertyMap { constructor(prefix, gl, capabilities, buffers) { super(prefix); this._gl = gl; this._capabilities = capabilities; this._buffers = buffers; this._isWebGL2 = capabilities.version >= 2; this._vaoExt = capabilities.getExtension('OES_vertex_array_object'); this._vaoCache = {}; // save vao cache here for releaseByProgram() method this._currentGeometryProgram = ''; this._currentVAO = null; } setup(object, geometry, program) { if (object.morphTargetInfluences) { this.reset(); this._setupVertexAttributes(program, geometry); this._currentGeometryProgram = emptyString; } else if (this._isWebGL2 || this._vaoExt) { // use VAO const geometryProperties = this.get(geometry); if (geometryProperties._vaos === undefined) { geometryProperties._vaos = {}; this._vaoCache[geometry.id] = geometryProperties._vaos; } let vao = geometryProperties._vaos[program.id]; if (!vao) { vao = geometryProperties._vaos[program.id] = { version: -1, object: this._createVAO() }; } this._bindVAO(vao.object); if (vao.version !== geometry.version) { this._setupVertexAttributes(program, geometry); vao.version = geometry.version; } } else { const geometryProgram = program.id + '_' + geometry.id + '_' + geometry.version; if (geometryProgram !== this._currentGeometryProgram) { this._setupVertexAttributes(program, geometry); this._currentGeometryProgram = geometryProgram; } } } releaseByGeometry(geometry) { const geometryProperties = this.get(geometry); const vaos = geometryProperties._vaos; if (vaos) { for (const programId in vaos) { const vao = vaos[programId]; if (!vao) continue; this._disposeVAO(vao.object); } delete geometryProperties._vaos; delete this._vaoCache[geometry.id]; } } releaseByProgram(program) { for (const geometryId in this._vaoCache) { const vaos = this._vaoCache[geometryId]; if (vaos) { const vao = vaos[program.id]; if (!vao) continue; this._disposeVAO(vao.object); delete vaos[program.id]; } } } reset(force) { if (this._currentVAO !== null || force) { if (this._isWebGL2) { this._gl.bindVertexArray(null); } else if (this._vaoExt) { this._vaoExt.bindVertexArrayOES(null); } this._currentVAO = null; } if (this._currentGeometryProgram !== emptyString) { this._currentGeometryProgram = emptyString; } } _createVAO() { if (this._isWebGL2) { return this._gl.createVertexArray(); } else if (this._vaoExt) { return this._vaoExt.createVertexArrayOES(); } return null; } _bindVAO(vao) { if (this._currentVAO !== vao) { if (this._isWebGL2) { this._gl.bindVertexArray(vao); } else if (this._vaoExt) { this._vaoExt.bindVertexArrayOES(vao); } this._currentVAO = vao; } } _disposeVAO(vao) { if (this._isWebGL2) { this._gl.deleteVertexArray(vao); } else if (this._vaoExt) { this._vaoExt.deleteVertexArrayOES(vao); } } _setupVertexAttributes(program, geometry) { const gl = this._gl; const isWebGL2 = this._isWebGL2; const attributes = program.getAttributes(); const capabilities = this._capabilities; const buffers = this._buffers; for (const key in attributes) { const programAttribute = attributes[key]; const geometryAttribute = geometry.getAttribute(key); if (geometryAttribute) { const size = geometryAttribute.size; if (programAttribute.count !== size) { console.warn('WebGLVertexArrayBindings: attribute ' + key + ' size not match! ' + programAttribute.count + ' : ' + size); } const buffer = geometryAttribute.buffer; const bufferProperties = buffers.get(buffer); const type = bufferProperties.type; const integer = isWebGL2 && (programAttribute.format === gl.INT || programAttribute.format === gl.UNSIGNED_INT); for (let i = 0, l = programAttribute.locationSize; i < l; i++) { gl.enableVertexAttribArray(programAttribute.location + i); } if (geometryAttribute.divisor > 0) { // use instancing for (let i = 0, l = programAttribute.locationSize; i < l; i++) { if (isWebGL2) { gl.vertexAttribDivisor(programAttribute.location + i, geometryAttribute.divisor); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(programAttribute.location + i, geometryAttribute.divisor); } else { console.warn('vertexAttribDivisor not supported'); } } } const bytesPerElement = bufferProperties.bytesPerElement; const glBuffer = bufferProperties.glBuffer; const stride = buffer.stride; const offset = geometryAttribute.offset; const normalized = geometryAttribute.normalized; gl.bindBuffer(gl.ARRAY_BUFFER, glBuffer); if (programAttribute.count === stride && programAttribute.locationSize === 1) { this._vertexAttribPointer(programAttribute.location, programAttribute.count, type, normalized, 0, 0, integer); } else { for (let i = 0; i < programAttribute.locationSize; i++) { this._vertexAttribPointer( programAttribute.location + i, programAttribute.count / programAttribute.locationSize, type, normalized, bytesPerElement * stride, bytesPerElement * (offset + (programAttribute.count / programAttribute.locationSize) * i), integer ); } } } } // bind index if could if (geometry.index) { const indexBufferProperties = buffers.get(geometry.index.buffer); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBufferProperties.glBuffer); } } _vertexAttribPointer(index, size, type, normalized, stride, offset, integer) { const gl = this._gl; if (integer) { gl.vertexAttribIPointer(index, size, type, stride, offset); } else { gl.vertexAttribPointer(index, size, type, normalized, stride, offset); } } } class WebGLClusteredLighting { constructor(options) { this.lightsTexture = new LightsTexture(); this.lightsTexture.initLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT); this.cellsTexture = new CellsTexture(); this.cellsTexture.initCells(options.gridDimensions, options.maxLightsPerCell); this._zClip = options.zClip.clone(); this._cellsTextureEmpty = false; this.cellsTransform = { clips: [0, 0], // near, far factors: [0, 0, 0, 0], // logFactor1, logFactor2, persp:tan(fov/2)|ortho:-height/2, aspect perspective: true }; } dispose() { this._cellsTextureEmpty = false; this.cellsTexture.dispose(); this.lightsTexture.dispose(); } setOptions(options) { this.lightsTexture.updateLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT); this.cellsTexture.updateCells(options.gridDimensions, options.maxLightsPerCell); this._zClip.copy(options.zClip); } update(lightingGroup, cameraData, lightsNeedsUpdate = true) { this._updateCellsTransform(cameraData); this.cellsTexture.resetLightIndices(); const cellsTable = this.cellsTexture.cellsInfo.table; const cellsTransform = this.cellsTransform; let lightIndicesWritten = false; for (let i = 0; i < lightingGroup.pointsNum; i++) { const pointLight = lightingGroup.point[i]; getPointLightBoundingSphere(pointLight, _lightSphere); _lightSphere.center.applyMatrix4(cameraData.viewMatrix); _lightSphere.center.z *= -1; if (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) { lightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i) || lightIndicesWritten; lightsNeedsUpdate && this.lightsTexture.setPointLight(i, pointLight); } } for (let i = 0; i < lightingGroup.spotsNum; i++) { const spotLight = lightingGroup.spot[i]; getSpotLightBoundingSphere(spotLight, _lightSphere); _lightSphere.center.applyMatrix4(cameraData.viewMatrix); _lightSphere.center.z *= -1; if (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) { lightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i + lightingGroup.pointsNum) || lightIndicesWritten; lightsNeedsUpdate && this.lightsTexture.setSpotLight(i + lightingGroup.pointsNum, spotLight); } } (lightIndicesWritten && lightsNeedsUpdate) && this.lightsTexture.version++; (lightIndicesWritten || !this._cellsTextureEmpty) && this.cellsTexture.version++; this._cellsTextureEmpty = !lightIndicesWritten; } _updateCellsTransform(cameraData) { const { clips, factors } = this.cellsTransform; this._zClip.toArray(clips); clips[0] = clips[0] > 0 ? clips[0] : cameraData.near; clips[1] = clips[1] > 0 ? clips[1] : cameraData.far; const cz = this.cellsTexture.cellsInfo.table[2]; const _logFarNear = Math.log(clips[1] / clips[0]); factors[0] = cz / _logFarNear; factors[1] = -cz * Math.log(clips[0]) / _logFarNear; const perspective = _isPerspectiveMatrix(cameraData.projectionMatrix); const elements = cameraData.projectionMatrix.elements; factors[2] = (perspective ? 1 : -1) / elements[5]; // persp: tan(fov / 2), ortho: -height / 2 factors[3] = elements[5] / elements[0]; // aspect: (width / height) this.cellsTransform.perspective = perspective; } } class CellsTexture extends Texture2D { constructor() { super(); this.format = PIXEL_FORMAT.RED; this.type = PIXEL_TYPE.HALF_FLOAT; this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; this.unpackAlignment = 1; this.cellsInfo = { table: [], maxLightsPerCell: 0, textureSize: [], dotData: [] }; this._counts = null; } initCells(cellTable, maxLightsPerCell) { const numCells = cellTable.x * cellTable.y * cellTable.z; const numPixels = numCells * maxLightsPerCell; // TODO - better texture size calculation let width = Math.ceil(Math.sqrt(numPixels)); width = Math.ceil(width / maxLightsPerCell) * maxLightsPerCell; const height = Math.ceil(numPixels / width); const data = new Uint16Array(width * height); this.image = { data, width, height }; cellTable.toArray(this.cellsInfo.table); this.cellsInfo.maxLightsPerCell = maxLightsPerCell; this.cellsInfo.textureSize[0] = width; this.cellsInfo.textureSize[1] = 1 / width; this.cellsInfo.textureSize[2] = 1 / height; this.cellsInfo.dotData[0] = maxLightsPerCell; this.cellsInfo.dotData[1] = cellTable.x * cellTable.z * maxLightsPerCell; this.cellsInfo.dotData[2] = cellTable.x * maxLightsPerCell; this._counts = new Int32Array(numCells); } updateCells(cellTable, maxLightsPerCell) { const cellsInfo = this.cellsInfo; if (_vec3_1.fromArray(cellsInfo.table).equals(cellTable) && cellsInfo.maxLightsPerCell === maxLightsPerCell) { return; } this.dispose(); this.initCells(cellTable, maxLightsPerCell); this.version++; } resetLightIndices() { this.image.data.fill(0); this._counts.fill(0); } setLightIndex(cellsRange, index) { const data = this.image.data; const counts = this._counts; const { table, maxLightsPerCell } = this.cellsInfo; const { min, max } = cellsRange; let needsUpdate = false; for (let x = min.x; x <= max.x; x++) { for (let z = min.z; z <= max.z; z++) { for (let y = min.y; y <= max.y; y++) { const idx = x + table[0] * (z + y * table[2]); const count = counts[idx]; if (count < maxLightsPerCell) { const offset = idx * maxLightsPerCell + count; data[offset] = MathUtils.toHalfFloat(index + 1); // 0 is reserved for empty cell, so we offset by 1 counts[idx]++; needsUpdate = true; } } } } return needsUpdate; } } class LightsTexture extends Texture2D { constructor() { super(); this.format = PIXEL_FORMAT.RGBA; this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; } initLights(maxLights, type) { const size = lightsTextureSize(maxLights); const arrayType = type === PIXEL_TYPE.FLOAT ? Float32Array : Uint16Array; const data = new arrayType(size * size * 4); // eslint-disable-line new-cap this.image = { data, width: size, height: size }; this.type = type; } updateLights(maxLights, type) { const size = lightsTextureSize(maxLights); if (size === this.image.width && type === this.type) return; this.dispose(); this.initLights(maxLights, type); this.version++; } setPointLight(index, lightInfo) { const data = this.image.data; const halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT; const start = index * LIGHT_STRIDE * 4; const { color, decay, position, distance } = lightInfo; // pixel 0 - R: lightType, G: -, B: -, A: - data[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(1) : 1; // pixel 1 - R: color.r, G: color.g, B: color.b, A: decay data[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0]; data[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1]; data[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2]; data[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay; // pixel 2 - R: position.x, G: position.y, B: position.z, A: distance data[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0]; data[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1]; data[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2]; data[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance; // pixel 3 - R: -, G: -, B: -, A: - } setSpotLight(index, lightInfo) { const data = this.image.data; const halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT; const start = index * LIGHT_STRIDE * 4; const { color, decay, position, distance, direction, coneCos, penumbraCos } = lightInfo; // pixel 0 - R: lightType, G: penumbraCos, B: -, A: - data[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(2) : 2; data[start + 0 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(penumbraCos) : penumbraCos; // pixel 1 - R: color.r, G: color.g, B: color.b, A: decay data[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0]; data[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1]; data[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2]; data[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay; // pixel 2 - R: position.x, G: position.y, B: position.z, A: distance data[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0]; data[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1]; data[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2]; data[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance; // pixel 3 - R: direction.x, G: direction.y, B: direction.z, A: coneCos data[start + 3 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(direction[0]) : direction[0]; data[start + 3 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(direction[1]) : direction[1]; data[start + 3 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(direction[2]) : direction[2]; data[start + 3 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(coneCos) : coneCos; } } const LIGHT_STRIDE = 4; const _lightSphere = new Sphere(); const _cellsRange = new Box3(); const _vec3_1 = new Vector3(); function getPointLightBoundingSphere(light, sphere) { sphere.center.fromArray(light.position); sphere.radius = light.distance; } function getSpotLightBoundingSphere(light, sphere) { if (light.coneCos < 0.70710678118) { // obtuse angle _vec3_1.fromArray(light.direction).multiplyScalar(light.distance * light.coneCos); sphere.center.fromArray(light.position).add(_vec3_1); sphere.radius = light.distance * Math.sqrt(1 - light.coneCos * light.coneCos); } else { _vec3_1.fromArray(light.direction).multiplyScalar(light.distance / (light.coneCos * 2)); sphere.center.fromArray(light.position).add(_vec3_1); sphere.radius = light.distance / (light.coneCos * 2); } } function lightsTextureSize(maxLights) { return Math.max(MathUtils.nextPowerOfTwo(Math.ceil(Math.sqrt(maxLights * LIGHT_STRIDE))), LIGHT_STRIDE); } function _isPerspectiveMatrix(m) { return m.elements[11] === -1; } function getCellsRange(lightSphere, cellsTable, cellsTransform, cellsRange) { const { center, radius } = lightSphere; const { clips, factors, perspective } = cellsTransform; let zMin = center.z - radius; const zMax = center.z + radius; if (zMin > clips[1] || zMax < clips[0]) { return false; } zMin = Math.max(zMin, clips[0]); const zStart = Math.floor(Math.log(zMin) * factors[0] + factors[1]); const zEnd = Math.min(Math.floor(Math.log(zMax) * factors[0] + factors[1]), cellsTable[2] - 1); const halfFrustumHeight = (perspective ? Math.abs(center.z) : -1) * factors[2]; const invH = 1 / (2 * halfFrustumHeight); const yMin = (center.y - radius) * invH + 0.5; const yMax = (center.y + radius) * invH + 0.5; if (yMin > 1 || yMax < 0) { return false; } const yStart = Math.max(Math.floor(yMin * cellsTable[1]), 0); const yEnd = Math.min(Math.floor(yMax * cellsTable[1]), cellsTable[1] - 1); const halfFrustumWidth = halfFrustumHeight * factors[3]; const invW = 1 / (2 * halfFrustumWidth); const xMin = (center.x - radius) * invW + 0.5; const xMax = (center.x + radius) * invW + 0.5; if (xMin > 1 || xMax < 0) { return false; } const xStart = Math.max(Math.floor(xMin * cellsTable[0]), 0); const xEnd = Math.min(Math.floor(xMax * cellsTable[0]), cellsTable[0] - 1); cellsRange.min.set(xStart, yStart, zStart); cellsRange.max.set(xEnd, yEnd, zEnd); return true; } class WebGLLights extends PropertyMap { constructor(prefix, capabilities, textures) { super(prefix); const that = this; function onLightingGroupDispose(event) { const lightingGroup = event.target; const lightingProperties = that.get(lightingGroup); lightingGroup.removeEventListener('dispose', onLightingGroupDispose); if (lightingProperties.clustered) { lightingProperties.clustered.dispose(); } that.delete(lightingGroup); } this._onLightingGroupDispose = onLightingGroupDispose; this._capabilities = capabilities; this._textures = textures; } setLightingGroup(lightingGroup, passInfo, options, cameraData) { const lightingProperties = this.get(lightingGroup); // Skip early if this lighting group has been set in this pass. if (lightingProperties.pass === passInfo.count) { return lightingProperties; } lightingProperties.pass = passInfo.count; if (lightingProperties.state === undefined) { lightingGroup.addEventListener('dispose', this._onLightingGroupDispose); lightingProperties.state = new LightingState(); lightingProperties.uploadVersion = 0; } // Skip early if this lighting group is empty if (lightingGroup.totalNum === 0) { return lightingProperties; } const clusteredOptions = options.clustered; const clusteredEnabled = clusteredOptions.enabled; let clusteredLightsChanged = false; if (lightingProperties.lightingVersion !== lightingGroup.version || lightingProperties.clusteredEnabled !== clusteredEnabled) { lightingProperties.state.update(lightingGroup, clusteredEnabled); lightingProperties.uploadVersion++; const hasClusteredLights = lightingProperties.state._factor[10] > 0; lightingProperties.lightingVersion = lightingGroup.version; lightingProperties.clusteredEnabled = clusteredEnabled; lightingProperties.hasClusteredLights = hasClusteredLights; clusteredLightsChanged = hasClusteredLights; // prepare clustered lighting if (hasClusteredLights && !lightingProperties.clustered) { lightingProperties.clustered = new WebGLClusteredLighting(clusteredOptions); lightingProperties.clusteredOptionVersion = clusteredOptions.version; } else if (!clusteredEnabled && lightingProperties.clustered) { lightingProperties.clustered.dispose(); delete lightingProperties.clustered; } } if (lightingProperties.hasClusteredLights) { if (lightingProperties.clusteredOptionVersion !== clusteredOptions.version) { lightingProperties.clustered.setOptions(clusteredOptions); lightingProperties.clusteredOptionVersion = clusteredOptions.version; clusteredLightsChanged = true; } let cameraChanged = false; if (lightingProperties.cameraId !== cameraData.id || lightingProperties.cameraVersion !== cameraData.version) { lightingProperties.cameraId = cameraData.id; lightingProperties.cameraVersion = cameraData.version; cameraChanged = true; } if (clusteredLightsChanged || cameraChanged) { lightingProperties.clustered.update(lightingGroup, cameraData, clusteredLightsChanged); } } return lightingProperties; } uploadUniforms(program, lightingGroup, disableShadowSampler) { const lightingGroupProperties = this.get(lightingGroup); let refresh = false; if (program.lightId !== lightingGroup.id || program.lightVersion !== lightingGroupProperties.uploadVersion) { refresh = true; program.lightId = lightingGroup.id; program.lightVersion = lightingGroupProperties.uploadVersion; } const uniforms = program.getUniforms(); const capabilities = this._capabilities; const textures = this._textures; const lightingFactor = lightingGroupProperties.state._factor; if (lightingFactor[0] && refresh) { uniforms.set('u_AmbientLightColor', lightingGroup.ambient); } if (lightingFactor[1] && refresh) { uniforms.set('u_SphericalHarmonicsLightData', lightingGroup.sh); } if (lightingFactor[2] > 0 && refresh) { uniforms.set('u_Hemi', lightingGroup.hemisphere); } if (lightingFactor[3] > 0) { if (refresh) uniforms.set('u_Directional', lightingGroup.directional); if (lightingFactor[7] > 0) { if (refresh) uniforms.set('u_DirectionalShadow', lightingGroup.directionalShadow); if (uniforms.has('directionalShadowMap')) { if (capabilities.version >= 2 && !disableShadowSampler) { uniforms.set('directionalShadowMap', lightingGroup.directionalShadowDepthMap, textures); } else { uniforms.set('directionalShadowMap', lightingGroup.directionalShadowMap, textures); } uniforms.set('directionalShadowMatrix', lightingGroup.directionalShadowMatrix); } if (uniforms.has('directionalDepthMap')) { uniforms.set('directionalDepthMap', lightingGroup.directionalShadowMap, textures); } } } if (lightingFactor[4] > 0) { if (refresh) uniforms.set('u_Point', lightingGroup.point); if (lightingFactor[8] > 0) { if (refresh) uniforms.set('u_PointShadow', lightingGroup.pointShadow); if (uniforms.has('pointShadowMap')) { uniforms.set('pointShadowMap', lightingGroup.pointShadowMap, textures); uniforms.set('pointShadowMatrix', lightingGroup.pointShadowMatrix); } } } if (lightingFactor[5] > 0) { if (refresh) uniforms.set('u_Spot', lightingGroup.spot); if (lightingFactor[9] > 0) { if (refresh) uniforms.set('u_SpotShadow', lightingGroup.spotShadow); if (uniforms.has('spotShadowMap')) { if (capabilities.version >= 2 && !disableShadowSampler) { uniforms.set('spotShadowMap', lightingGroup.spotShadowDepthMap, textures); } else { uniforms.set('spotShadowMap', lightingGroup.spotShadowMap, textures); } uniforms.set('spotShadowMatrix', lightingGroup.spotShadowMatrix); } if (uniforms.has('spotDepthMap')) { uniforms.set('spotDepthMap', lightingGroup.spotShadowMap, textures); } } } if (lightingFactor[6] > 0) { if (refresh) uniforms.set('u_RectArea', lightingGroup.rectArea); if (lightingGroup.LTC1 && lightingGroup.LTC2) { uniforms.set('ltc_1', lightingGroup.LTC1, textures); uniforms.set('ltc_2', lightingGroup.LTC2, textures); } else { console.warn('WebGLRenderer: RectAreaLight.LTC1 and LTC2 need to be set before use.'); } } if (lightingFactor[10] > 0) { const clusteredLighting = lightingGroupProperties.clustered; const cellsInfo = clusteredLighting.cellsTexture.cellsInfo; uniforms.set('maxLightsPerCell', cellsInfo.maxLightsPerCell); uniforms.set('cells', cellsInfo.table); uniforms.set('cellsDotData', cellsInfo.dotData); uniforms.set('cellsTextureSize', cellsInfo.textureSize); uniforms.set('cellsTransformFactors', clusteredLighting.cellsTransform.factors); uniforms.set('lightsTexture', clusteredLighting.lightsTexture, textures); uniforms.set('cellsTexture', clusteredLighting.cellsTexture, textures); } } } class LightingState { constructor() { this._factor = new Uint16Array(11); this._totalNum = 0; this._shadowsNum = 0; } update(lightingGroup, clusteredEnabled) { const selfFactor = this._factor; selfFactor[0] = lightingGroup.useAmbient ? 1 : 0; selfFactor[1] = lightingGroup.useSphericalHarmonics ? 1 : 0; selfFactor[2] = lightingGroup.hemisNum; selfFactor[3] = lightingGroup.directsNum; selfFactor[4] = lightingGroup.pointsNum; selfFactor[5] = lightingGroup.spotsNum; selfFactor[6] = lightingGroup.rectAreaNum; selfFactor[7] = lightingGroup.directShadowNum; selfFactor[8] = lightingGroup.pointShadowNum; selfFactor[9] = lightingGroup.spotShadowNum; selfFactor[10] = 0; this._totalNum = lightingGroup.totalNum; this._shadowsNum = lightingGroup.shadowsNum; if (clusteredEnabled) { const clusteredPointsNum = selfFactor[4] - selfFactor[8]; const clusteredSpotsNum = selfFactor[5] - selfFactor[9]; selfFactor[4] = selfFactor[8]; selfFactor[5] = selfFactor[9]; selfFactor[10] = (clusteredPointsNum + clusteredSpotsNum) > 0 ? 1 : 0; } } compare(factor) { if (!factor) { return false; } const selfFactor = this._factor; for (let i = 0, l = factor.length; i < l; i++) { if (selfFactor[i] !== factor[i]) { return false; } } return true; } copyTo(factor) { const selfFactor = this._factor; if (!factor) { factor = new selfFactor.constructor(this._factor.length); } factor.set(selfFactor); return factor; } hasLight() { return this._totalNum > 0; } hasShadow() { return this._shadowsNum > 0; } setProgramProps(props, receiveShadow) { const selfFactor = this._factor; props.useAmbientLight = selfFactor[0]; props.useSphericalHarmonicsLight = selfFactor[1]; props.hemisphereLightNum = selfFactor[2]; props.directLightNum = selfFactor[3]; props.pointLightNum = selfFactor[4]; props.spotLightNum = selfFactor[5]; props.rectAreaLightNum = selfFactor[6]; props.directShadowNum = receiveShadow ? selfFactor[7] : 0; props.pointShadowNum = receiveShadow ? selfFactor[8] : 0; props.spotShadowNum = receiveShadow ? selfFactor[9] : 0; props.useClusteredLights = selfFactor[10]; props.useShadow = this._shadowsNum > 0 && receiveShadow; } } const helpVector4 = new Vector4(); const helpMatrix3 = new Matrix3(); const helpMatrix4 = new Matrix4(); const influencesList = new WeakMap(); const morphInfluences = new Float32Array(8); const _envData = { map: null, diffuse: 1, specular: 1 }; let _clippingPlanesData = new Float32Array([]); function defaultGetGeometry(renderable) { return renderable.geometry; } function defaultGetMaterial(renderable) { return renderable.material; } function defaultIfRender(renderable) { return true; } const _emptyLightingGroup = new LightingGroup(); function getLightingGroup(lighting, material) { if (!material.acceptLight) { return _emptyLightingGroup; } const lightingGroup = lighting.getGroup(material.lightingGroup); if (lightingGroup && lightingGroup.totalNum > 0) { return lightingGroup; } return _emptyLightingGroup; } function clientWaitAsync(gl) { const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0); gl.flush(); return new Promise(function(resolve, reject) { function test() { const res = gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0); if (res === gl.WAIT_FAILED) { gl.deleteSync(sync); reject(); return; } if (res === gl.TIMEOUT_EXPIRED) { requestAnimationFrame(test); return; } gl.deleteSync(sync); resolve(); } test(); }); } /** * The WebGL renderer. * @extends ThinRenderer */ class WebGLRenderer extends ThinRenderer { /** * Create a WebGLRenderer. * @param {WebGLRenderingContext} [context] - The WebGL Rendering Context privided by canvas. * If not provided, you must call {@link WebGLRenderer.init} method with a valid context * before using this renderer. */ constructor(context) { super(); /** * An object containing details about the capabilities of the current RenderingContext. * @type {WebGLCapabilities} */ this.capabilities = {}; this._textures = null; this._renderBuffers = null; this._renderTargets = null; this._buffers = null; this._geometries = null; this._lights = null; this._programs = null; this._materials = null; this._state = null; this._vertexArrayBindings = null; if (context) { this.init(context); } // Cache current material if beginRender is called. this._currentMaterial = null; this._currentOcclusionQuerySet = null; this._currentTimestampWrites = { querySet: null, beginningOfPassWriteIndex: -1, endOfPassWriteIndex: -1 }; } init(context, options = {}) { if (!context) { context = this.context; } if (!context) { throw new Error('WebGLRenderer.init: context must be provided.'); } this.context = context; const prefix = `_gl${this.increaseId()}`; const capabilities = new WebGLCapabilities(context); const constants = new WebGLConstants(context, capabilities); const state = new WebGLState(context, capabilities); const textures = new WebGLTextures(prefix, context, state, capabilities, constants); const renderBuffers = new WebGLRenderBuffers(prefix, context, capabilities, constants); const renderTargets = new WebGLRenderTargets(prefix, context, state, capabilities, textures, renderBuffers, constants); const buffers = new WebGLBuffers(prefix, context, capabilities); const vertexArrayBindings = new WebGLVertexArrayBindings(prefix, context, capabilities, buffers); const geometries = new WebGLGeometries(prefix, context, buffers, vertexArrayBindings); const lights = new WebGLLights(prefix, capabilities, textures); const programs = new WebGLPrograms(context, state, capabilities); const materials = new WebGLMaterials(prefix, programs, vertexArrayBindings); const querySets = new WebGLQuerySets(prefix, context, capabilities); this.capabilities = capabilities; this._constants = constants; this._textures = textures; this._renderBuffers = renderBuffers; this._renderTargets = renderTargets; this._buffers = buffers; this._geometries = geometries; this._lights = lights; this._programs = programs; this._materials = materials; this._state = state; this._vertexArrayBindings = vertexArrayBindings; this._querySets = querySets; return Promise.resolve(this); } beginRender(renderTarget) { super.beginRender(renderTarget); if (renderTarget) { this._renderTargets.setRenderTarget(renderTarget); const gl = this.context; const state = this._state; let clearBits = 0; if (renderTarget.clearColor) { state.colorBuffer.setClear( renderTarget.colorClearValue.r, renderTarget.colorClearValue.g, renderTarget.colorClearValue.b, renderTarget.colorClearValue.a ); clearBits |= gl.COLOR_BUFFER_BIT; } if (renderTarget.clearDepth) { state.depthBuffer.setClear(renderTarget.depthClearValue); clearBits |= gl.DEPTH_BUFFER_BIT; } if (renderTarget.clearStencil) { state.stencilBuffer.setClear(renderTarget.stencilClearValue); clearBits |= gl.STENCIL_BUFFER_BIT; } if (clearBits > 0) { // Prevent warning when bits is equal to zero gl.clear(clearBits); } this._currentOcclusionQuerySet = renderTarget.occlusionQuerySet; this._currentTimestampWrites.querySet = renderTarget.timestampWrites.querySet; this._currentTimestampWrites.beginningOfPassWriteIndex = renderTarget.timestampWrites.beginningOfPassWriteIndex; this._currentTimestampWrites.endOfPassWriteIndex = renderTarget.timestampWrites.endOfPassWriteIndex; } if (this._currentOcclusionQuerySet) { this._querySets.setQuerySet(this._currentOcclusionQuerySet); } if (this._currentTimestampWrites.querySet) { this._querySets.setQuerySet(this._currentTimestampWrites.querySet); if (this.capabilities.canUseTimestamp) { this._querySets.queryCounter( this._currentTimestampWrites.querySet, this._currentTimestampWrites.beginningOfPassWriteIndex ); } else { // fallback to use TIME_ELAPSED_EXT this._querySets.beginQuery( this._currentTimestampWrites.querySet, this._currentTimestampWrites.endOfPassWriteIndex ); } } } endRender() { if (this._currentTimestampWrites.querySet) { if (this.capabilities.canUseTimestamp) { this._querySets.queryCounter( this._currentTimestampWrites.querySet, this._currentTimestampWrites.endOfPassWriteIndex ); } else { // fallback to use TIME_ELAPSED_EXT this._querySets.endQuery(this._currentTimestampWrites.querySet); } } // Ensure depth buffer writing is enabled so it can be cleared on next render const state = this._state; state.depthBuffer.setTest(true); state.depthBuffer.setMask(true); state.colorBuffer.setMask(true); this._currentMaterial = null; // Automatically clear the occlusion query set and timestamp writes this._currentOcclusionQuerySet = null; this._currentTimestampWrites.querySet = null; super.endRender(); } renderRenderableItem(renderable, renderStates, options) { const state = this._state; const capabilities = this.capabilities; const vertexArrayBindings = this._vertexArrayBindings; const textures = this._textures; const passInfo = this._passInfo; const getGeometry = options.getGeometry || defaultGetGeometry; const getMaterial = options.getMaterial || defaultGetMaterial; const beforeRender = options.beforeRender; const afterRender = options.afterRender; const ifRender = options.ifRender || defaultIfRender; const renderInfo = options.renderInfo; const sceneData = renderStates.scene; const cameraData = renderStates.camera; const currentRenderTarget = state.currentRenderTarget; if (!ifRender(renderable)) { return; } if (!passInfo.enabled) { console.warn('WebGLRenderer: beginRender must be called before renderRenderableItem.'); return; } const object = renderable.object; const material = getMaterial.call(this, renderable); const geometry = getGeometry.call(this, renderable); const group = renderable.group; const fog = material.fog ? sceneData.fog : null; const lightingGroup = getLightingGroup(renderStates.lighting, material); const lightingState = this._lights.setLightingGroup(lightingGroup, passInfo, this.lightingOptions, cameraData).state; const hasLighting = lightingState.hasLight(); const hasShadow = lightingState.hasShadow() && object.receiveShadow; _envData.map = material.envMap !== undefined ? (material.envMap || sceneData.environment) : null; _envData.diffuse = sceneData.envDiffuseIntensity * material.envMapIntensity; _envData.specular = sceneData.envSpecularIntensity * material.envMapIntensity; let clippingPlanesData = sceneData.clippingPlanesData; let numClippingPlanes = sceneData.numClippingPlanes; if (material.clippingPlanes && material.clippingPlanes.length > 0) { if (_clippingPlanesData.length < material.clippingPlanes.length * 4) { _clippingPlanesData = new Float32Array(material.clippingPlanes.length * 4); } clippingPlanesData = sceneData.setClippingPlanesData(material.clippingPlanes, _clippingPlanesData); numClippingPlanes = material.clippingPlanes.length; } object.onBeforeRender(renderable, material); beforeRender && beforeRender.call(this, renderable, material); // Check material version const materialProperties = this._materials.setMaterial(material); if (material.needsUpdate === false) { if (materialProperties.currentProgram === undefined) { material.needsUpdate = true; } else if (materialProperties.fog !== fog) { material.needsUpdate = true; } else if (materialProperties.envMap !== _envData.map) { material.needsUpdate = true; } else if (materialProperties.numClippingPlanes !== numClippingPlanes) { material.needsUpdate = true; } else if (materialProperties.logarithmicDepthBuffer !== sceneData.logarithmicDepthBuffer) { material.needsUpdate = true; } else if (renderStates.outputEncoding !== materialProperties.outputEncoding || renderStates.gammaFactor !== materialProperties.gammaFactor) { material.needsUpdate = true; } else if (capabilities.version > 1 && sceneData.disableShadowSampler !== materialProperties.disableShadowSampler) { material.needsUpdate = true; } else { if (hasLighting !== materialProperties.hasLighting) { material.needsUpdate = true; } else if (hasLighting) { if (!lightingState.compare(materialProperties.lightingFactors)) { material.needsUpdate = true; } else if (hasShadow !== materialProperties.hasShadow) { material.needsUpdate = true; } else if (hasShadow) { material.needsUpdate = materialProperties.shadowType !== object.shadowType; } } } } // Update program if needed. if (material.needsUpdate) { this._materials.updateProgram(material, object, lightingState, renderStates, this.shaderCompileOptions); materialProperties.fog = fog; materialProperties.envMap = _envData.map; materialProperties.logarithmicDepthBuffer = sceneData.logarithmicDepthBuffer; materialProperties.hasLighting = hasLighting; materialProperties.lightingFactors = lightingState.copyTo(materialProperties.lightingFactors); materialProperties.hasShadow = hasShadow; materialProperties.shadowType = object.shadowType; materialProperties.numClippingPlanes = numClippingPlanes; materialProperties.outputEncoding = renderStates.outputEncoding; materialProperties.gammaFactor = renderStates.gammaFactor; materialProperties.disableShadowSampler = sceneData.disableShadowSampler; material.needsUpdate = false; } const program = materialProperties.currentProgram; if (options.onlyCompile || !program.isReady(capabilities.parallelShaderCompileExt)) return; state.setProgram(program); this._geometries.setGeometry(geometry, passInfo); // update morph targets if (object.morphTargetInfluences) { this._updateMorphtargets(object, geometry, program); } vertexArrayBindings.setup(object, geometry, program); let refreshCamera = false; if (program.cameraId !== cameraData.id || program.cameraVersion !== cameraData.version) { refreshCamera = true; program.cameraId = cameraData.id; program.cameraVersion = cameraData.version; } let refreshScene = false; if (program.sceneId !== sceneData.id || program.sceneVersion !== sceneData.version) { refreshScene = true; program.sceneId = sceneData.id; program.sceneVersion = sceneData.version; } let refreshMaterial = true; if (!material.forceUpdateUniforms) { if (materialProperties.pass !== passInfo.count) { materialProperties.pass = passInfo.count; } else { refreshMaterial = this._currentMaterial !== material; } } this._currentMaterial = material; const uniforms = program.getUniforms(); // upload light uniforms if (hasLighting) { this._lights.uploadUniforms(program, lightingGroup, sceneData.disableShadowSampler); } // upload bone matrices if (object.isSkinnedMesh) { this._uploadSkeleton(uniforms, object, sceneData); } // upload other uniforms for (let n = 0, ll = uniforms.seq.length; n < ll; n++) { const uniform = uniforms.seq[n]; const key = uniform.id; const internalGroup = uniform.internalGroup; // upload custom uniforms if (material.uniforms && material.uniforms[key] !== undefined) { uniform.set(material.uniforms[key], textures); continue; } // u_Model: always upload this matrix if (internalGroup === 1) { let modelMatrix = object.worldMatrix; if (sceneData.useAnchorMatrix) { modelMatrix = helpMatrix4.copy(modelMatrix).premultiply(sceneData.anchorMatrixInverse); } uniform.set(modelMatrix.elements); continue; } // uniforms about camera data if (internalGroup === 2 && refreshCamera) { uniform.internalFun(cameraData); continue; } // uniforms about scene data if (internalGroup === 3 && refreshScene) { uniform.internalFun(sceneData); continue; } // uniforms about material if (internalGroup === 4 && refreshMaterial) { uniform.internalFun(material, textures); continue; } // uniforms about environment map if (internalGroup === 5) { uniform.internalFun(_envData, textures); continue; } // other internal uniforms if (key === 'clippingPlanes') { uniform.set(clippingPlanesData); } else if (key === 'u_RenderTargetSize') { uniform.setValue(currentRenderTarget.width, currentRenderTarget.height); } } const frontFaceCW = helpMatrix3.setFromMatrix4(object.worldMatrix).determinant() < 0; state.setMaterial(material, frontFaceCW); const viewport = helpVector4.set( currentRenderTarget.width, currentRenderTarget.height, currentRenderTarget.width, currentRenderTarget.height ).multiply(cameraData.rect); viewport.z -= viewport.x; viewport.w -= viewport.y; state.viewport(viewport.round()); this._draw(geometry, material, group, renderInfo); textures.resetTextureUnits(); afterRender && afterRender.call(this, renderable); object.onAfterRender(renderable); } blitRenderTarget(read, draw, color = true, depth = true, stencil = true) { this._renderTargets.blitRenderTarget(read, draw, color, depth, stencil); } generateMipmaps(texture) { const state = this._state; const capabilities = this.capabilities; const textures = this._textures; const textureProperties = textures.get(texture); if (!textureProperties.__webglTexture) return; const powerOfTwo = MathUtils.isPowerOfTwo(textureProperties.__width) && MathUtils.isPowerOfTwo(textureProperties.__height); if ( texture.generateMipmaps && texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR && (powerOfTwo || capabilities.version >= 2) ) { const target = textureProperties.__webglTarget; state.bindTexture(target, textureProperties.__webglTexture); textures.generateMipmaps(texture); state.bindTexture(target, null); } } readTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) { const gl = this.context; const constants = this._constants; const state = this._state; const renderTargets = this._renderTargets; const textures = this._textures; if (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) { return Promise.reject('WebGLRenderer.readTexturePixels: Unsupported texture.'); } const glType = constants.getGLType(texture.type); const glFormat = constants.getGLFormat(texture.format); const textureProperties = textures.get(texture); if (textureProperties.__readBuffer === undefined) { textureProperties.__readBuffer = gl.createBuffer(); } gl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer); gl.bufferData(gl.PIXEL_PACK_BUFFER, buffer.byteLength, gl.STREAM_READ); gl.readPixels(x, y, width, height, glFormat, glType, 0); // restore framebuffer binding const framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ? renderTargets.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); return clientWaitAsync(gl).then(() => { if (!textureProperties.__readBuffer) { throw new Error('WebGLRenderer.readTexturePixels: Texture has been disposed.'); } gl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer); gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, buffer); gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null); return buffer; }); } readTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) { const gl = this.context; const constants = this._constants; const state = this._state; const renderTargets = this._renderTargets; if (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) { console.warn('WebGLRenderer.readTexturePixels: Unsupported texture.'); return buffer; } const glType = constants.getGLType(texture.type); const glFormat = constants.getGLFormat(texture.format); gl.readPixels(x, y, width, height, glFormat, glType, buffer); // restore framebuffer binding const framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ? renderTargets.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); return buffer; } resetVertexArrayBindings(force) { this._vertexArrayBindings.reset(force); } resetState() { this._state.reset(); } beginOcclusionQuery(index) { const querySet = this._currentOcclusionQuerySet; if (!querySet) return; this._querySets.beginQuery(querySet, index); } endOcclusionQuery() { const querySet = this._currentOcclusionQuerySet; if (!querySet) return; this._querySets.endQuery(querySet); } async readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) { return this._querySets.readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount); } /** * Bind webglTexture to Texture. * @param {TextureBase} texture * @param {WebGLTexture} webglTexture */ setTextureExternal(texture, webglTexture) { this._textures.setTextureExternal(texture, webglTexture); } /** * Bind webglRenderbuffer to RenderBuffer. * @param {RenderBuffer} renderBuffer * @param {WebGLRenderbuffer} webglRenderbuffer */ setRenderBufferExternal(renderBuffer, webglRenderbuffer) { this._renderBuffers.setRenderBufferExternal(renderBuffer, webglRenderbuffer); } /** * Bind webglBuffer to Buffer. * @param {Buffer} buffer * @param {WebGLBuffer} webglBuffer */ setBufferExternal(buffer, webglBuffer) { this._buffers.setBufferExternal(buffer, webglBuffer); } /** * Bind webglFramebuffer to RenderTarget. * @param {RenderTarget} renderTarget * @param {WebGLFramebuffer} webglFramebuffer */ setFramebufferExternal(renderTarget, webglFramebuffer) { this._renderTargets.setFramebufferExternal(renderTarget, webglFramebuffer); } _uploadSkeleton(uniforms, object, sceneData) { if (object.skeleton && object.skeleton.bones.length > 0) { const skeleton = object.skeleton; const capabilities = this.capabilities; if (capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2)) { if (skeleton.boneTexture === undefined) { skeleton.generateBoneTexture(capabilities.version >= 2); } uniforms.set('boneTexture', skeleton.boneTexture, this._textures); uniforms.set('boneTextureSize', skeleton.boneTexture.image.width); } else { uniforms.set('boneMatrices', skeleton.boneMatrices); } uniforms.set('bindMatrix', object.bindMatrix.elements); helpMatrix4.copy(object.bindMatrixInverse); if (sceneData.useAnchorMatrix) { helpMatrix4.multiply(sceneData.anchorMatrix); // convert to anchor space } uniforms.set('bindMatrixInverse', helpMatrix4.elements); } } _updateMorphtargets(object, geometry, program) { const objectInfluences = object.morphTargetInfluences; if (!influencesList.has(geometry)) { influencesList.set(geometry, objectInfluences.slice(0)); } const morphTargets = geometry.morphAttributes.position; const morphNormals = geometry.morphAttributes.normal; // Remove current morphAttributes const influences = influencesList.get(geometry); for (let i = 0; i < influences.length; i++) { const influence = influences[i]; if (influence !== 0) { if (morphTargets) geometry.removeAttribute('morphTarget' + i); if (morphNormals) geometry.removeAttribute('morphNormal' + i); } } // Collect influences for (let i = 0; i < objectInfluences.length; i++) { influences[i] = objectInfluences[i]; } influences.length = objectInfluences.length; // Add morphAttributes let count = 0; for (let i = 0; i < influences.length; i++) { const influence = influences[i]; if (influence > 0) { if (morphTargets) geometry.addAttribute('morphTarget' + count, morphTargets[i]); if (morphNormals) geometry.addAttribute('morphNormal' + count, morphNormals[i]); morphInfluences[count] = influence; count++; } } for (; count < 8; count++) { morphInfluences[count] = 0; } program.getUniforms().set('morphTargetInfluences', morphInfluences); } _draw(geometry, material, group, renderInfo) { const gl = this.context; const capabilities = this.capabilities; const buffers = this._buffers; const instanceCount = geometry.instanceCount; const useInstancing = instanceCount >= 0; const useGroup = !!group; const useMultiDraw = useGroup && group.multiDrawCount !== undefined; const useIndexBuffer = geometry.index !== null; let drawStart = 0; let drawCount = Infinity; if (!useMultiDraw) { const position = geometry.getAttribute('a_Position'); if (useIndexBuffer) { drawCount = geometry.index.buffer.count; } else if (position) { drawCount = position.buffer.count; } if (useGroup) { drawStart = Math.max(drawStart, group.start); drawCount = Math.min(drawCount, group.count); } if (drawCount < 0 || drawCount === Infinity) return; } if (useIndexBuffer) { const indexBufferProperties = buffers.get(geometry.index.buffer); const bytesPerElement = indexBufferProperties.bytesPerElement; const type = indexBufferProperties.type; if (type === gl.UNSIGNED_INT) { if (capabilities.version < 2 && !capabilities.getExtension('OES_element_index_uint')) { console.warn('WebGLRenderer: draw elements type not support UNSIGNED_INT!'); } } if (useInstancing) { if (instanceCount <= 0) return; if (capabilities.version >= 2) { gl.drawElementsInstanced(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').drawElementsInstancedANGLE(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount); } else { console.warn('WebGLRenderer: using instanced draw but hardware does not support.'); return; } } else if (useMultiDraw) { if (group.multiDrawCount <= 0) return; const extension = capabilities.getExtension('WEBGL_multi_draw'); if (!extension) { console.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.'); return; } extension.multiDrawElementsWEBGL(material.drawMode, group.multiDrawCounts, 0, type, group.multiDrawStarts, 0, group.multiDrawCount); } else { gl.drawElements(material.drawMode, drawCount, type, drawStart * bytesPerElement); } } else { if (useInstancing) { if (instanceCount <= 0) return; if (capabilities.version >= 2) { gl.drawArraysInstanced(material.drawMode, drawStart, drawCount, instanceCount); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').drawArraysInstancedANGLE(material.drawMode, drawStart, drawCount, instanceCount); } else { console.warn('WebGLRenderer: using instanced draw but hardware does not support.'); return; } } else if (useMultiDraw) { if (group.multiDrawCount <= 0) return; const extension = capabilities.getExtension('WEBGL_multi_draw'); if (!extension) { console.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.'); return; } extension.multiDrawArraysWEBGL(material.drawMode, group.multiDrawStarts, 0, group.multiDrawCounts, 0, group.multiDrawCount); } else { gl.drawArrays(material.drawMode, drawStart, drawCount); } } if (renderInfo) { if (useMultiDraw) { drawCount = 0; for (let i = 0; i < group.multiDrawCount; i++) { drawCount += group.multiDrawCounts[i]; } } renderInfo.update(drawCount, material.drawMode, instanceCount < 0 ? 1 : instanceCount); } } _bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel) { if (!texture.isTexture) return false; const gl = this.context; const textures = this._textures; const state = this._state; if (!this._dummyFrameBuffer) { this._dummyFrameBuffer = gl.createFramebuffer(); } gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFrameBuffer); const textureProperties = textures.setTexture(texture); if (texture.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureProperties.__webglTexture, mipLevel); } else if (texture.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + zIndex, textureProperties.__webglTexture, mipLevel); } else if (texture.isTexture3D || texture.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, mipLevel, zIndex); } state.bindTexture(textureProperties.__webglTarget, null); return true; } } Object.defineProperties(WebGLRenderer.prototype, { // deprecated since 0.4.5 asyncReadPixel: { configurable: true, get: function() { if (this._asyncReadPixel === undefined) { this._asyncReadPixel = false; } return this._asyncReadPixel; }, set: function(value) { this._asyncReadPixel = value; } } }); // deprecated since 0.4.5, use readTexturePixels instead WebGLRenderer.prototype.readRenderTargetPixels = function(x, y, width, height, buffer) { const state = this._state; const renderTarget = state.currentRenderTarget; const zIndex = renderTarget.activeLayer || renderTarget.activeLayer || 0; const mipLevel = renderTarget.activeMipmapLevel || 0; if (renderTarget && renderTarget.texture) { if ((x >= 0 && x <= (renderTarget.width - width)) && (y >= 0 && y <= (renderTarget.height - height))) { if (this.asyncReadPixel) { return this.readTexturePixels(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel); } else { this.readTexturePixelsSync(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel); return Promise.resolve(buffer); } } } console.warn('WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed.'); return Promise.reject(); }; // deprecated since 0.5.1 WebGLTextures.prototype.setTexture2D = function(texture, slot) { // console.warn('WebGLTextures: .setTexture2D() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTextureCube = function(texture, slot) { // console.warn('WebGLTextures: .setTextureCube() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTexture3D = function(texture, slot) { // console.warn('WebGLTextures: .setTexture3D() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTexture2DArray = function(texture, slot) { // console.warn('WebGLTextures: .setTexture2DArray() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; Object.defineProperties(Scene.prototype, { // deprecated since 0.2.7, add warning since 0.4.0 environmentLightIntensity: { configurable: true, get: function() { console.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.'); return this.envDiffuseIntensity; }, set: function(value) { console.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.'); this.envDiffuseIntensity = value; } }, // deprecated since 0.4.0 _lightData: { configurable: true, get: function() { console.warn('Scene: ._lightData has been deprecated since v0.4.0, use .collector.lightingData.getGroup(0) instead.'); return this.collector.lightingData.getGroup(0); } }, // deprecated since 0.4.4 _sceneData: { configurable: true, get: function() { console.warn('Scene: ._sceneData has been deprecated since v0.4.4, use .collector.sceneData instead.'); return this.collector.sceneData; } }, // deprecated since 0.4.4 _lightingData: { configurable: true, get: function() { console.warn('Scene: ._lightingData has been deprecated since v0.4.4, use .collector.lightingData instead.'); return this.collector.lightingData; } } }); Object.defineProperties(RenderStates.prototype, { // deprecated since 0.4.0 lights: { configurable: true, get: function() { console.warn('RenderStates: .lights has been deprecated since v0.4.0, use .lighting.getGroup(0) instead.'); return this.lighting.getGroup(0); } } }); // deprecated since 0.2.8 const generateUUID = MathUtils.generateUUID; const isPowerOfTwo = MathUtils.isPowerOfTwo; const nearestPowerOfTwo = MathUtils.nearestPowerOfTwo; const nextPowerOfTwo = MathUtils.nextPowerOfTwo; // deprecated since 0.4.3 Matrix4.prototype.inverse = function() { return this.invert(); }; // deprecated since 0.4.3 Matrix4.prototype.getInverse = function(m) { return this.copy(m).invert(); }; // deprecated since 0.4.3 Matrix4.prototype.transform = function(position, scale, quaternion) { return this.compose(position, quaternion, scale); }; // deprecated since 0.4.3 Matrix3.prototype.inverse = function() { return this.invert(); }; // deprecated since 0.4.3 Matrix3.prototype.getInverse = function(m) { return this.copy(m).invert(); }; // deprecated since 0.4.3 Vector3.prototype.subtract = function(a, target = new Vector3()) { return target.set(this.x - a.x, this.y - a.y, this.z - a.z); }; // The old version of Query API has been deprecated since 0.4.4 const QUERY_TYPE = { ANY_SAMPLES_PASSED: 7000, ANY_SAMPLES_PASSED_CONSERVATIVE: 7001, TIME_ELAPSED: 7002 }; let _queryId = 0; class Query extends EventDispatcher { constructor() { super(); this.id = _queryId++; } dispose() { this.dispatchEvent({ type: 'dispose' }); } } WebGLRenderer.prototype.beginQuery = function(query, target) { this._queries.begin(query, target); }; WebGLRenderer.prototype.endQuery = function(query) { this._queries.end(query); }; WebGLRenderer.prototype.queryCounter = function(query) { this._queries.counter(query); }; WebGLRenderer.prototype.isTimerQueryDisjoint = function(query) { return this._queries.isTimerDisjoint(query); }; WebGLRenderer.prototype.isQueryResultAvailable = function(query) { return this._queries.isResultAvailable(query); }; WebGLRenderer.prototype.getQueryResult = function(query) { return this._queries.getResult(query); }; Object.defineProperties(WebGLRenderer.prototype, { _queries: { configurable: true, get: function() { if (this.__queries === undefined) { this.__queries = new WebGLQueries(`_gl${this.id}`, this.context, this.capabilities); } return this.__queries; } } }); class WebGLQueries extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; const timerQuery = capabilities.timerQuery; const that = this; const onQueryDispose = event => { const query = event.target; const queryProperties = that.get(query); query.removeEventListener('dispose', onQueryDispose); if (queryProperties._webglQuery) { if (capabilities.version > 1) { gl.deleteQuery(queryProperties._webglQuery); } else { timerQuery.deleteQueryEXT(queryProperties._webglQuery); } } that.delete(query); }; this._onQueryDispose = onQueryDispose; this._typeToGL = { [QUERY_TYPE.ANY_SAMPLES_PASSED]: 0x8C2F, [QUERY_TYPE.ANY_SAMPLES_PASSED_CONSERVATIVE]: 0x8D6A, [QUERY_TYPE.TIME_ELAPSED]: 0x88BF }; } _get(query) { const capabilities = this._capabilities; const queryProperties = this.get(query); if (queryProperties._webglQuery === undefined) { query.addEventListener('dispose', this._onQueryDispose); queryProperties._webglQuery = capabilities.version > 1 ? this._gl.createQuery() : capabilities.timerQuery.createQueryEXT(); queryProperties._target = null; queryProperties._result = null; } return queryProperties; } begin(query, target) { const capabilities = this._capabilities; const typeToGL = this._typeToGL; const queryProperties = this._get(query); if (capabilities.version > 1) { this._gl.beginQuery(typeToGL[target], queryProperties._webglQuery); } else { capabilities.timerQuery.beginQueryEXT(typeToGL[target], queryProperties._webglQuery); } queryProperties._target = target; queryProperties._result = null; // clear the last result. } end(query) { const capabilities = this._capabilities; const typeToGL = this._typeToGL; const queryProperties = this._get(query); if (capabilities.version > 1) { this._gl.endQuery(typeToGL[queryProperties._target]); } else { capabilities.timerQuery.endQueryEXT(typeToGL[queryProperties._target]); } } counter(query) { const timerQuery = this._capabilities.timerQuery; const queryProperties = this._get(query); timerQuery.queryCounterEXT(queryProperties._webglQuery, timerQuery.TIMESTAMP_EXT); queryProperties._target = timerQuery.TIMESTAMP_EXT; queryProperties._result = null; // clear the last result. } isResultAvailable(query) { const gl = this._gl; const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const queryProperties = this._get(query); let available; if (capabilities.version > 1) { available = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT_AVAILABLE); } else { available = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_AVAILABLE); } return available; } isTimerDisjoint() { return this._gl.getParameter(this._capabilities.timerQuery.GPU_DISJOINT_EXT); } getResult(query) { const gl = this._gl; const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const queryProperties = this._get(query); if (queryProperties._result === null) { if (capabilities.version > 1) { queryProperties._result = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT); } else { queryProperties._result = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_EXT); } } return queryProperties._result; } } // deprecated since 0.5.0 WebGLRenderer.prototype.clear = function(color, depth, stencil) { const gl = this.context; let bits = 0; if (color === undefined || color) bits |= gl.COLOR_BUFFER_BIT; if (depth === undefined || depth) bits |= gl.DEPTH_BUFFER_BIT; if (stencil === undefined || stencil) bits |= gl.STENCIL_BUFFER_BIT; if (bits > 0) { // Prevent warning when bits is equal to zero gl.clear(bits); } }; // deprecated since 0.5.0 WebGLRenderer.prototype.setClearColor = function(r, g, b, a, premultipliedAlpha) { this._state.colorBuffer.setClear(r, g, b, a, premultipliedAlpha); }; // deprecated since 0.5.0 WebGLRenderer.prototype.getClearColor = function() { return this._state.colorBuffer.getClear(); }; // deprecated since 0.5.0 WebGLRenderer.prototype.setRenderTarget = function(renderTarget) { this._renderTargets.setRenderTarget(renderTarget); }; // deprecated since 0.5.0 WebGLRenderer.prototype.getRenderTarget = function() { return this._state.currentRenderTarget; }; // deprecated since 0.5.0 WebGLRenderer.prototype.setOcclusionQuerySet = function(querySet) { this._currentOcclusionQuerySet = querySet; }; // deprecated since 0.5.0 WebGLRenderer.prototype.setTimestampWrites = function(querySet, beginIndex = 0, endIndex = 1) { this._currentTimestampWrites.querySet = querySet; this._currentTimestampWrites.beginningOfPassWriteIndex = beginIndex; this._currentTimestampWrites.endOfPassWriteIndex = endIndex; }; // deprecated since 0.5.0 WebGLRenderer.prototype.updateRenderTargetMipmap = function(renderTarget) { if (renderTarget.texture) { this.generateMipmaps(renderTarget.texture); } }; Object.defineProperties(OffscreenRenderTarget.prototype, { // deprecated since 0.5.0 depth: { configurable: true, get: function() { console.warn('OffscreenRenderTarget: .depth property is deprecated.'); return 1; } } }); // deprecated since 0.5.0 class RenderTarget2D extends OffscreenRenderTarget { constructor(width, height) { super(width, height); this.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0); this.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); } } RenderTarget2D.prototype.isRenderTarget2D = true; // deprecated since 0.5.0 class RenderTargetCube extends OffscreenRenderTarget { constructor(width, height) { super(width, height); this.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0); this.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); } } RenderTargetCube.prototype.isRenderTargetCube = true; // deprecated since 0.5.0 class RenderTarget3D extends OffscreenRenderTarget { constructor(width, height, depth) { super(width, height); const texture = new Texture3D(); texture.resizeAsAttachment(width, height, depth); this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } } RenderTarget3D.prototype.isRenderTarget3D = true; // deprecated since 0.5.0 class RenderTarget2DArray extends OffscreenRenderTarget { constructor(width, height, depth) { super(width, height); const texture = new Texture2DArray(); texture.resizeAsAttachment(width, height, depth); this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } } RenderTarget2DArray.prototype.isRenderTarget2DArray = true; // deprecated since 0.5.0 ScreenRenderTarget.prototype.isRenderTargetBack = true; export { ATTACHMENT, AmbientLight, AnimationAction, AnimationMixer, Attribute, BLEND_EQUATION, BLEND_FACTOR, BLEND_TYPE, BUFFER_USAGE, BasicMaterial, Bone, BooleanKeyframeTrack, Box2, Box3, BoxGeometry, Buffer, COMPARE_FUNC, CULL_FACE_TYPE, Camera, CameraProjection, Color3, Color4, ColorKeyframeTrack, CubicSplineInterpolant, CylinderGeometry, DRAW_MODE, DRAW_SIDE, DefaultLoadingManager, DepthMaterial, DirectionalLight, DirectionalLightShadow, DistanceMaterial, ENVMAP_COMBINE_TYPE, Euler, EventDispatcher, FileLoader, Fog, FogExp2, Frustum, Geometry, HemisphereLight, ImageLoader, KeyframeClip, KeyframeInterpolant, KeyframeTrack, LambertMaterial, Light, LightShadow, LineMaterial, LinearInterpolant, Loader, LoadingManager, MATERIAL_TYPE, Material, MathUtils, Matrix3, Matrix4, Mesh, NumberKeyframeTrack, OPERATION, Object3D, OffscreenRenderTarget, OrthographicProjection, PBR2Material, PBRMaterial, PIXEL_FORMAT, PIXEL_TYPE, PerspectiveProjection, PhongMaterial, Plane, PlaneGeometry, PointLight, PointLightShadow, PointsMaterial, PropertyBindingMixer, PropertyMap, QUERYSET_TYPE, QUERY_TYPE, Quaternion, QuaternionCubicSplineInterpolant, QuaternionKeyframeTrack, QuaternionLinearInterpolant, Query, QuerySet, Ray, Raycaster, RectAreaLight, RenderBuffer, RenderInfo, RenderQueue, RenderQueueLayer, RenderStates, RenderTarget2D, RenderTarget2DArray, RenderTarget3D, ScreenRenderTarget as RenderTargetBack, RenderTargetBase, RenderTargetCube, SHADING_TYPE, SHADOW_TYPE, Scene, SceneData, ScreenRenderTarget, ShaderChunk, ShaderLib, ShaderMaterial, ShaderPostPass, ShadowMapPass, Skeleton, SkinnedMesh, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SphericalHarmonicsLight, SpotLight, SpotLightShadow, StepInterpolant, StringKeyframeTrack, TEXEL_ENCODING_TYPE, TEXTURE_FILTER, TEXTURE_WRAP, Texture2D, Texture2DArray, Texture3D, TextureBase, TextureCube, ThinRenderer, TorusKnotGeometry, TransformUV, Triangle, VERTEX_COLOR, Vector2, Vector3, Vector4, VectorKeyframeTrack, WebGLAttribute, WebGLCapabilities, WebGLGeometries, WebGLProgram, WebGLPrograms, WebGLQueries, WebGLQuerySets, WebGLRenderBuffers, WebGLRenderer, WebGLState, WebGLTextures, WebGLUniforms, cloneJson, cloneUniforms, generateUUID, isPowerOfTwo, nearestPowerOfTwo, nextPowerOfTwo }; ================================================ FILE: eslint.config.mjs ================================================ import js from '@eslint/js'; import importPlugin from 'eslint-plugin-import'; import jsdoc from 'eslint-plugin-jsdoc'; import html from 'eslint-plugin-html'; import globals from 'globals'; export default [ js.configs.recommended, { ignores: [ 'build/**', 'node_modules/**', 'examples/libs/**' ] }, { languageOptions: { globals: { ...globals.browser, ...globals.node }, ecmaVersion: 2018, sourceType: 'module' }, plugins: { import: importPlugin }, rules: { /* Override eslint:recommended */ // modified: sometimes use while(true) and break inside 'no-constant-condition': ['error', { checkLoops: false }], // modified: set allowEmptyCase to true to allow empty cases 'no-fallthrough': ['error', { allowEmptyCase: true }], // modified: sometimes use function inside function 'no-inner-declarations': 'off', 'no-irregular-whitespace': ['error', { skipStrings: true, skipComments: false, skipRegExps: true, skipTemplates: true }], // modified: sometimes use object.hasOwnProperty 'no-prototype-builtins': 'off', // modified: ignore in some cases 'no-unused-vars': ['error', { vars: 'all', args: 'none', caughtErrors: 'none', ignoreRestSiblings: true }], // modified: set allowEmptyCatch to true to allow empty catch blocks 'no-empty': ['error', { allowEmptyCatch: true }], /* Possible Problems */ 'array-callback-return': 'error', 'no-template-curly-in-string': 'error', /* Suggestions */ 'curly': ['warn', 'multi-line', 'consistent'], 'comma-dangle': ['warn', 'never'], 'arrow-parens': ['warn', 'as-needed'], 'func-name-matching': ['warn', 'always', { includeCommonJSModuleExports: false }], 'no-var': 'warn', 'prefer-const': ['warn', { destructuring: 'all', ignoreReadBeforeAssign: false }], 'new-cap': ['warn', { newIsCap: true, capIsNew: false, properties: true }], 'max-depth': ['warn', 5], 'max-nested-callbacks': ['warn', 3], /* Layout & Formatting */ 'array-bracket-spacing': ['warn', 'never'], 'block-spacing': ['warn', 'always'], 'brace-style': ['warn', '1tbs', { allowSingleLine: true }], 'comma-spacing': ['warn', { before: false, after: true }], 'comma-style': ['warn', 'last'], 'computed-property-spacing': ['warn', 'never'], 'func-call-spacing': ['warn', 'never'], 'indent': ['warn', 'tab', { SwitchCase: 1 }], 'key-spacing': ['warn', { beforeColon: false, afterColon: true, mode: 'strict' }], 'new-parens': 'warn', 'no-trailing-spaces': 'warn', 'no-whitespace-before-property': 'warn', 'object-curly-spacing': ['warn', 'always'], 'padded-blocks': ['warn', { blocks: 'never', classes: 'always', switches: 'never' }], 'semi': ['warn', 'always', { omitLastInOneLineBlock: true }], 'semi-spacing': ['warn', { before: false, after: true }], 'space-before-blocks': ['warn', 'always'], 'space-before-function-paren': ['warn', { anonymous: 'never', named: 'never', asyncArrow: 'ignore' }], 'space-in-parens': ['warn', 'never'], 'space-infix-ops': 'warn', 'space-unary-ops': ['warn', { words: true, nonwords: false }], 'keyword-spacing': ['warn', { before: true, after: true }], 'spaced-comment': ['warn', 'always', { block: { exceptions: ['*'], balanced: true } }], 'switch-colon-spacing': ['warn', { after: true, before: false }], 'template-tag-spacing': ['warn', 'never'], 'arrow-spacing': ['warn', { before: true, after: true }], 'generator-star-spacing': ['warn', { before: false, after: true }], 'rest-spread-spacing': ['warn', 'never'], 'template-curly-spacing': ['warn', 'never'], 'yield-star-spacing': ['warn', 'after'], 'no-multi-spaces': 'warn', 'quotes': ['warn', 'single'], 'semi-style': ['warn', 'last'], 'no-multiple-empty-lines': ['warn', { max: 3, maxEOF: 1, maxBOF: 1 }], // "eol-last": ["warn", "always"], /* Import(plugin) */ 'import/extensions': ['warn', 'always'] } }, { files: ['src/**/*.js', 'examples/jsm/**/*.js'], ...jsdoc.configs['flat/recommended'] }, { files: ['src/**/*.js', 'examples/jsm/**/*.js'], settings: { jsdoc: { tagNamePreference: { augments: 'extends' } } }, rules: { /* JSDoc(plugin) */ 'jsdoc/no-defaults': 0, 'jsdoc/no-undefined-types': 0, 'jsdoc/require-jsdoc': 0, 'jsdoc/require-param-description': 0, 'jsdoc/require-property-description': 0, 'jsdoc/require-returns-check': 0, 'jsdoc/require-returns-description': 0, 'jsdoc/reject-any-type': 'off', 'jsdoc/reject-function-type': 'off' } }, { files: ['examples/**/*.html', 'tests/**/*.html'], plugins: { html } }, { files: ['examples/**/*.html'], languageOptions: { globals: { Nanobar: 'readonly', SimplexNoise: 'readonly' } } }, { files: ['tests/**/*.js'], languageOptions: { globals: { QUnit: 'readonly' } } } ]; ================================================ FILE: examples/animation_blending_additive.html ================================================ t3d - animation blending additive
t3d - animation blending additive
model from mixamo.com
================================================ FILE: examples/animation_bone_attach.html ================================================ t3d - animation / bone attach
t3d - animation / bone attach
================================================ FILE: examples/animation_crossfade.html ================================================ t3d - animation crossfade
t3d - animation crossfade
model from mixamo.com
================================================ FILE: examples/animation_interpolant.html ================================================ t3d - animation interpolant
t3d - animation interpolant
================================================ FILE: examples/animation_keyframe_animation.html ================================================ t3d - keyframe animation
t3d - keyframe animation
================================================ FILE: examples/animation_morphtargets.html ================================================ t3d - morph targets
t3d - morph targets
================================================ FILE: examples/animation_multiple.html ================================================ t3d - animation multiple
t3d - animation multiple
Use SkeletonUtils.clone() to clone a skinned 3d model
================================================ FILE: examples/animation_skinned_instancing.html ================================================ t3d - animation skinned instancing
t3d - skinned instancing
================================================ FILE: examples/animation_skinned_mesh.html ================================================ t3d - skinned mesh
t3d - skinned mesh
================================================ FILE: examples/animation_snake.html ================================================ t3d - snake
t3d - snake
================================================ FILE: examples/camera_multiple.html ================================================ t3d - multiple cameras
t3d - multiple cameras
================================================ FILE: examples/camera_projection.html ================================================ t3d - camera projection
t3d - camera projection
Sliding the `projWeight` to achieve smooth switching
between perspective(0) and orthogonal(1) camera.
================================================ FILE: examples/canvas2d_canvas2d.html ================================================ t3d - canvas2d
t3d - canvas2d
================================================ FILE: examples/controls_camera_fly.html ================================================ t3d - camera fly controls
t3d - camera fly controls
================================================ FILE: examples/controls_camera_free.html ================================================ t3d - camera free controls
t3d - camera free controls
================================================ FILE: examples/controls_camera_orbit.html ================================================ t3d - camera orbit controls
t3d - camera orbit controls
================================================ FILE: examples/controls_camera_view.html ================================================ t3d - camera view controls
t3d - camera view controls
================================================ FILE: examples/controls_transform.html ================================================ t3d - transform controls
t3d - transform controls
"W" translate | "E" rotate | "R" scale | "A" all
"Shift" snap or select multiple
================================================ FILE: examples/custompass_bloom.html ================================================ t3d - custom pass bloom
t3d - custom pass bloom
================================================ FILE: examples/custompass_blur.html ================================================ t3d - custom pass blur
t3d - custom pass blur
================================================ FILE: examples/custompass_car.html ================================================ t3d - custom pass custom
t3d - custom pass custom
================================================ FILE: examples/custompass_deferred.html ================================================ t3d - custom pass deferred
t3d - custom pass deferred
================================================ FILE: examples/custompass_depth_buffer_share.html ================================================ t3d - custom depth buffer share
t3d - Share Depth Buffer
Two FBO attach the same depth buffer
Available only for WebGL 2.0
================================================ FILE: examples/custompass_depth_texture_share.html ================================================ t3d - custom depth texture share
t3d - Share Depth Texture
Two FBO attach the same depth texture
Available only for WebGL 2.0
================================================ FILE: examples/custompass_dof.html ================================================ t3d - custom pass dof
t3d - custom pass dof
mousemove/click to focal object
================================================ FILE: examples/custompass_gbuffer.html ================================================ t3d - custom pass gbuffer
t3d - custom pass gbuffer
================================================ FILE: examples/custompass_gpupick.html ================================================ t3d - GPUPick
t3d - GPUPick
Move the mouse to obtain information
================================================ FILE: examples/custompass_lensflare.html ================================================ t3d - lens flare
t3d - lens flare
textures from ro.me
================================================ FILE: examples/custompass_motion_blur.html ================================================ t3d - custom pass motion blur
t3d - custom motion blur
================================================ FILE: examples/custompass_motion_blur2.html ================================================ t3d - custom pass motion blur
t3d - custom motion blur
================================================ FILE: examples/custompass_msaa.html ================================================ t3d - custom pass msaa
t3d - MSAA by Multisampled Renderbuffers
Available only for WebGL 2.0
================================================ FILE: examples/custompass_oit.html ================================================ t3d - custom pass oit
t3d - order-independent transparency
================================================ FILE: examples/custompass_rendertarget_2d.html ================================================ t3d - rendertarget 2d
t3d - rendertarget 2d
Render to each mipmap level of a 2D texture with different color,
then display it on a quad to verify the results.
================================================ FILE: examples/custompass_rendertarget_3d.html ================================================ t3d - rendertarget 3d
t3d - rendertarget 3d
================================================ FILE: examples/custompass_shadow_planar.html ================================================ t3d - planar shadow
t3d - planar shadow
================================================ FILE: examples/custompass_sketch.html ================================================ t3d - custom pass sketch
t3d - custom pass sketch
================================================ FILE: examples/custompass_ssao.html ================================================ t3d - custom pass ssao
t3d - custom pass ssao
================================================ FILE: examples/custompass_ssr.html ================================================ t3d - custom pass ssr
t3d - custom pass ssr
================================================ FILE: examples/custompass_taa.html ================================================ t3d - custom pass taa
t3d - custom pass taa
================================================ FILE: examples/custompass_transmission.html ================================================ t3d - custompass transmission
t3d - custompass transmission
================================================ FILE: examples/custompass_unrealbloom.html ================================================ t3d - custom pass unreal bloom
t3d - custom pass unreal bloom
================================================ FILE: examples/custompass_xray.html ================================================ t3d - custompass xray
t3d - custompass xray
================================================ FILE: examples/exporter_draco.html ================================================ t3d - draco exporter
t3d - draco exporter
================================================ FILE: examples/exporter_gltf.html ================================================ t3d - gltf exporter
t3d - gltf exporter
================================================ FILE: examples/files/fonts/OFL-hind.txt ================================================ Copyright (c) 2014, Indian Type Foundry (info@indiantypefoundry.com). This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: examples/files/fonts/OFL-montserrat.txt ================================================ Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat) This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: examples/files/main.css ================================================ :root { color-scheme: light dark; --background-color: #f7f7f7; --active-text-color: #FF7F02; --text-color: #5e5e5e; --secondary-text-color: #9e9e9e; --thirdary-text-color: #444; --font-size: 16px; --line-height: 26px; --border-style: 1px solid #E8E8E8; --header-height: 80px; --panel-width: 300px; --panel-padding: 16px; --icon-size: 20px; } @media (prefers-color-scheme: dark) { :root { --background-color: #2e2e2e; --text-color: #a7a7a7; --secondary-text-color: #888; --thirdary-text-color: #ccc; --border-style: 1px solid #444; } } @font-face { font-family: 'heading'; src: url('./fonts/Muli-Black.ttf') format('truetype'); font-display: fallback; } @font-face { font-family: 'body'; src: url('./fonts/Montserrat-Regular.ttf') format('truetype'); font-display: fallback; } * { box-sizing: border-box; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } html, body { height: 100%; } html { font-size: var(--font-size); line-height: var(--line-height); } body { font-family: "body", "Arial", sans-serif; margin: 0px; color: var(--secondary-text-color); background-color: var(--background-color); } a { text-decoration: none; } h1 { font-family: "heading", "Arial", sans-serif; font-size: calc(var(--font-size) + 10px); line-height: 24px; font-weight: 500; } h2 { font-family: "heading", "Arial", sans-serif; padding: 0; margin: 16px 0; font-size: calc(var(--font-size) + 14px); font-weight: 500; line-height: var(--line-height); } h1 a { color: var(--active-text-color); } #header { display: flex; height: var(--header-height); border-bottom: var(--border-style); align-items: center; } #header h1 { padding-left: var(--panel-padding); flex: 1; } #panel { position: fixed; z-index: 100; left: 0px; width: var(--panel-width); height: 100%; overflow: auto; border-right: var(--border-style); display: flex; flex-direction: column; } #expandButton { width: 32px; height: 32px; position: absolute; right: 16px; top: 12px; display: none; cursor: pointer; background-color: var(--active-text-color); background-size: var(--icon-size); -webkit-mask-image: url(./ic_menu_black_24dp.svg); -webkit-mask-position: 50% 50%; -webkit-mask-repeat: no-repeat; mask-image: url(./ic_menu_black_24dp.svg); mask-position: 50% 50%; mask-repeat: no-repeat; } #panel #content { flex: 1; overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch; padding: 0px var(--panel-padding) var(--panel-padding) var(--panel-padding); } #panel #content .link { color: var(--text-color); display: block; } #panel #content .link:hover { text-decoration: underline; color: var(--thirdary-text-color); } #panel #content .selected { color: var(--active-text-color) !important; } #viewer { position: absolute; border: 0px; padding-left: var(--panel-width); left: 0; right: 0; width: 100%; height: 100%; overflow: auto; } #button { position: fixed; bottom: 16px; right: 16px; padding: 12px; border-radius: 50%; margin-bottom: 0px; background-color: #fff; opacity: 0.9; z-index: 999; color: #fff; box-shadow: 0 0 4px rgba(0, 0, 0, .15); } #button:hover { cursor: pointer; opacity: 1; } #button img { display: block; width: var(--icon-size); } /* mobile */ @media all and (max-width: 640px) { :root { --header-height: 56px; --icon-size: 24px; } h1{ font-size: 20px; } #expandButton { display: block; } #panel { position: absolute; left: 0; top: 0; width: 100%; right: 0; z-index: 1000; overflow: hidden; border: none; height: var(--header-height); transition: 0s 0.2s height; } #panel.open { height: 100%; transition: 0s 0s height; } #panelScrim { pointer-events: none; background-color: rgba(0, 0, 0, 0); position: absolute; left: 0; right: 0; top: 0; bottom: 0; transition: .2s background-color; } #panel.open #panelScrim { pointer-events: auto; background-color: rgba(0, 0, 0, 0.4); } #content { position: absolute; right: 0; top: 0; bottom: 0; background: var(--background-color); box-shadow: 0 0 8px rgba(0,0,0,.1); width: calc(100vw - 60px); max-width: 360px; transition: .25s transform; font-size: 17px; margin-right: -380px; line-height: 2rem; } #panel.open #content { transform: translate3d(-380px, 0 ,0); } #viewer { left: 0; top: var(--header-height); width: 100%; height: calc(100% - var(--header-height)); padding-left: 0; } } ================================================ FILE: examples/files.json ================================================ { "light": [ "light_directlight", "light_pointlight", "light_spotlight", "light_rectarealight", "light_hemispherelight", "light_sphericalharmonicslight", "light_shadow", "light_shadow_adapter", "light_softshadow", "light_group" ], "geometry": [ "geometry_geometries", "geometry_loader_assimp2json", "geometry_loader_vox", "geometry_loader_gltf", "geometry_loader_gltf2", "geometry_loader_gltf3", "geometry_loader_gltf_helmat", "geometry_loader_gltf_tangent", "geometry_loader_gltf_lights", "geometry_loader_gltf_skinning", "geometry_loader_gltf_morphtargets", "geometry_loader_gltf_instancing", "geometry_loader_gltf_materials_unlit", "geometry_loader_gltf_materials_clearcoat", "geometry_loader_gltf_materials_transmission", "geometry_loader_gltf_materials_dispersion", "geometry_loader_gltf_uvtransform", "geometry_loader_gltf_draco", "geometry_loader_gltf_meshopt", "geometry_loader_gltf_camera", "geometry_loader_gltf_avif", "geometry_loader_gltf_pointer", "geometry_builder_shapes", "geometry_builder_lines", "geometry_builder_edges", "geometry_groups", "geometry_boundings" ], "material": [ "material_materials", "material_depth", "material_pbr", "material_normalmap", "material_emissivemap", "material_bumpmap", "material_lightmap", "material_envmap", "material_uvtransform", "material_uvcoord", "material_transparent", "material_blending", "material_flatshading", "material_vertexcolors", "material_clippingplanes", "material_clearcoat", "material_alphamask", "material_alphahash", "material_shadermaterial", "material_shader_shadow", "material_shader_matcap", "material_shader_background", "material_shader_skybox", "material_shader_skybox_filter", "material_shader_skybox_groundprojected", "material_shader_sky", "material_shader_sky2", "material_shader_sky_gradient", "material_shader_water", "material_shader_water_pbr", "material_shader_xray", "material_shader_grid", "material_shader_extend", "material_shader_fakeInterior", "material_shader_volume", "material_shader_volume_layered" ], "texture": [ "texture_anisotropic", "texture_mipmap", "texture_video", "texture_integer", "texture_depth", "texture_2darray", "texture_3d", "texture_loader_imagebitmap", "texture_loader_hdr", "texture_loader_hdr_panorama", "texture_loader_hdr_cube", "texture_loader_exr", "texture_loader_env", "texture_loader_ktx2", "texture_loader_compressed_dds", "texture_loader_compressed_pvr", "texture_loader_tga", "texture_generator_heatmap", "texture_generator_idwmap" ], "scene": [ "scene_fog", "scene_gamma_correction", "scene_anchor", "scene_clippingplanes" ], "camera": [ "camera_projection", "camera_multiple" ], "controls": [ "controls_camera_orbit", "controls_camera_fly", "controls_camera_free", "controls_camera_view", "controls_transform" ], "probes": [ "probes_reflection", "probes_reflection_planar" ], "math": [ "math_curve", "math_curve_motion", "math_octree", "math_obb" ], "sprite": [ "sprite_sprites" ], "points": [ "points_sprites" ], "lines": [ "lines_lines", "lines_dashedlines", "lines_instancedlines" ], "text": [ "text_typeface", "text_sdf", "text_sdf_dynamic", "text_bitmap", "text_bitmap_dynamic" ], "canvas2d": [ "canvas2d_canvas2d" ], "raycast": [ "raycast_raycaster" ], "stereo": [ "stereo_anaglyph", "stereo_webvr_car", "stereo_webxr_vr_car" ], "physics": [ "physics_cannon", "physics_ammo", "physics_ammo_softbody_volume", "physics_rapier", "physics_rapier_character_controller", "physics_ik" ], "navigation": [ "navigation_recast_generation", "navigation_recast_crowd", "navigation_recast_obstacles", "navigation_recast_walking", "navigation_pathfinding" ], "particle": [ "particle_particle" ], "animation": [ "animation_morphtargets", "animation_skinned_mesh", "animation_keyframe_animation", "animation_snake", "animation_multiple", "animation_crossfade", "animation_blending_additive", "animation_bone_attach", "animation_skinned_instancing", "animation_interpolant" ], "custompass": [ "custompass_car", "custompass_deferred", "custompass_gbuffer", "custompass_ssao", "custompass_sketch", "custompass_ssr", "custompass_dof", "custompass_taa", "custompass_bloom", "custompass_unrealbloom", "custompass_blur", "custompass_msaa", "custompass_motion_blur", "custompass_motion_blur2", "custompass_depth_texture_share", "custompass_depth_buffer_share", "custompass_gpupick", "custompass_lensflare", "custompass_transmission", "custompass_shadow_planar", "custompass_oit", "custompass_rendertarget_2d", "custompass_rendertarget_3d", "custompass_xray" ], "renderer": [ "renderer_culling_frustum", "renderer_culling_contribution", "renderer_deferred", "renderer_deferred_lighting", "renderer_clustered_lighting" ], "webgl": [ "webgl_depthfunc", "webgl_instanced_draw", "webgl_multi_draw", "webgl_mesh_batch", "webgl_polygonoffset", "webgl_logarithmicDepthBuffer", "webgl_canvas_transparent", "webgl_stencil", "webgl_external_texture", "webgl_external_buffer", "webgl_primitive_restart", "webgl_clipculldistance", "webgl_renderinfo", "webgl_query_occlusion", "webgl_query_occlusion_proxy", "webgl_query_timer", "webgl_helpers", "webgl_contextlost", "webgl_shader_compile", "webgl_shader_precompile" ], "exporter": [ "exporter_gltf", "exporter_draco" ], "lab": [ "lab_clouds", "lab_clouds_shader", "lab_earth", "lab_ocean", "lab_ocean_fft", "lab_ground", "lab_texture_variation", "lab_ik", "lab_gltf_grass", "lab_geometry_grass", "lab_geometry_images", "lab_terrain", "lab_water_simulation", "lab_histogram", "lab_linechart_fill", "lab_impostor_octahedral", "lab_impostor_octahedral_instancing" ] } ================================================ FILE: examples/geometry_boundings.html ================================================ t3d - boundings
t3d - boundings
================================================ FILE: examples/geometry_builder_edges.html ================================================ t3d - geometry edges builder
t3d - geometry edges builder
================================================ FILE: examples/geometry_builder_lines.html ================================================ t3d - geometry line builders
t3d - geometry line builders
================================================ FILE: examples/geometry_builder_shapes.html ================================================ t3d - geometry shape builders
t3d - geometry shape builders
================================================ FILE: examples/geometry_geometries.html ================================================ t3d - geometries
t3d - geometries
================================================ FILE: examples/geometry_groups.html ================================================ t3d - groups
t3d - groups
================================================ FILE: examples/geometry_loader_assimp2json.html ================================================ t3d - assimp2json
t3d - assimp2json
================================================ FILE: examples/geometry_loader_gltf.html ================================================ t3d - gltf
t3d - gltf
================================================ FILE: examples/geometry_loader_gltf2.html ================================================ t3d - gltf2
t3d - gltf2
================================================ FILE: examples/geometry_loader_gltf3.html ================================================ t3d - gltf3
t3d - gltf3
================================================ FILE: examples/geometry_loader_gltf_avif.html ================================================ t3d - gltf avif
t3d - gltf avif
Forest House by peachyroyalty
================================================ FILE: examples/geometry_loader_gltf_camera.html ================================================ t3d - gltf camera
t3d - gltf camera
================================================ FILE: examples/geometry_loader_gltf_draco.html ================================================ t3d - gltf draco
t3d - gltf draco
================================================ FILE: examples/geometry_loader_gltf_helmat.html ================================================ t3d - gltf
t3d - gltf halmat
================================================ FILE: examples/geometry_loader_gltf_instancing.html ================================================ t3d - gltf
t3d - gltf instancing
Model from teapots_galore
================================================ FILE: examples/geometry_loader_gltf_lights.html ================================================ t3d - gltf lights
t3d - gltf lights
================================================ FILE: examples/geometry_loader_gltf_materials_clearcoat.html ================================================ t3d - gltf materials clearcoat
t3d - gltf materials clearcoat
================================================ FILE: examples/geometry_loader_gltf_materials_dispersion.html ================================================ t3d - gltf materials dispersion
t3d - gltf materials dispersion
================================================ FILE: examples/geometry_loader_gltf_materials_transmission.html ================================================ t3d - gltf materials transmission
t3d - gltf materials transmission
================================================ FILE: examples/geometry_loader_gltf_materials_unlit.html ================================================ t3d - gltf materials unlit
t3d - gltf materials unlit
================================================ FILE: examples/geometry_loader_gltf_meshopt.html ================================================ t3d - gltf meshopt
t3d - gltf meshopt
================================================ FILE: examples/geometry_loader_gltf_morphtargets.html ================================================ t3d - gltf morphtargets
t3d - gltf morphtargets
================================================ FILE: examples/geometry_loader_gltf_pointer.html ================================================ t3d - gltf pointer
t3d - gltf pointer extension
================================================ FILE: examples/geometry_loader_gltf_skinning.html ================================================ t3d - gltf skinning
t3d - gltf skinning
================================================ FILE: examples/geometry_loader_gltf_tangent.html ================================================ t3d - gltf tangent
t3d - gltf
================================================ FILE: examples/geometry_loader_gltf_uvtransform.html ================================================ t3d - gltf uv transform
t3d - gltf uv transform
================================================ FILE: examples/geometry_loader_vox.html ================================================ t3d - vox
t3d - vox
dependence: vox.js
================================================ FILE: examples/index.html ================================================ t3d.js examples
================================================ FILE: examples/jsm/Clock.js ================================================ /** * @author alteredq / http://alteredqualia.com/ */ class Clock { constructor(autoStart = true) { this.autoStart = autoStart; this.startTime = 0; this.oldTime = 0; this.elapsedTime = 0; this.running = false; } start() { this.startTime = now(); this.oldTime = this.startTime; this.elapsedTime = 0; this.running = true; } stop() { this.getElapsedTime(); this.running = false; this.autoStart = false; } getElapsedTime() { this.getDelta(); return this.elapsedTime; } getDelta() { let diff = 0; if (this.autoStart && !this.running) { this.start(); return 0; } if (this.running) { const newTime = now(); diff = (newTime - this.oldTime) / 1000; this.oldTime = newTime; this.elapsedTime += diff; } return diff; } } function now() { return performance.now(); } export { Clock }; ================================================ FILE: examples/jsm/DynamicFont.js ================================================ import { DistanceTransform } from './math/DistanceTransform.js'; /** * DynamicFont uses the CharacterCanvas to obtain character pixels data and packages it into FontAtlas. * This class can be modified if more complete character management is required, * such as counting character references. */ class DynamicFont { /** * Create a DynamicFont. * @param {object} [options] - The options. * @param {number} [options.fontSize=72] - The font size. * @param {number} [options.width=1024] - The width of the atlas. * @param {number} [options.height=1024] - The height of the atlas. * @param {string} [options.fontFamily='sans-serif'] - The font family. * @param {string} [options.fontWeight='normal'] - The font weight. * @param {string} [options.fontStyle='normal'] - The font style. * @param {boolean} [options.sdf=true] - Whether to use signed distance field. */ constructor({ fontSize = 72, width = 2048, height = 2048, fontFamily = 'sans-serif', fontWeight = 'normal', fontStyle = 'normal', sdf = true } = {}) { this._charCanvas = new CharacterCanvas({ fontSize, fontFamily, fontWeight, fontStyle, sdf }); this._fontAtlas = new FontAtlas(width, height, this._charCanvas.size, sdf ? 'R2R' : 'RGBA2RGBA'); this._font = { common: { scaleW: width, scaleH: height }, info: { size: fontSize }, chars: [] }; } /** * Get the font data used by BitmapTextGeometry. * @returns {object} - The font data. */ get fontData() { return this._font; } /** * Get the atlas buffer. * @returns {Uint8ClampedArray} - The atlas buffer. */ get atlasBuffer() { return this._fontAtlas.buffer; } /** * Add characters to the atlas. * @param {string} chars - The characters to add. * @returns {boolean} - Returns true if new characters are added, otherwise returns false. */ addChars(chars) { let addFlag = false; for (let i = 0; i < chars.length; i++) { const char = chars[i]; if (!this._fontAtlas.hasChar(char)) { if (this._addChar(char)) { addFlag = true; } else { console.warn(`DynamicFont: Failed to add char: ${char}, the atlas is full.`); } } } return addFlag; } /** * Dispose the font data and atlas. */ dispose() { this._fontAtlas.clear(); this._font.chars.length = 0; } _addChar(char) { const { _charCanvas, _fontAtlas, _font } = this; const { buffer, width, height, padding, glyphTop } = _charCanvas.draw(char); const successed = _fontAtlas.addChar(char, { buffer, width, height }); if (!successed) { return false; } const { x, y, w, h } = _fontAtlas.getChar(char); const scaler = (char === 'j') ? 0.00001 : 1; _font.chars.push({ char: char, id: char.charCodeAt(0), x: x + padding * scaler, y: y + padding * scaler, width: w - padding * 2 * scaler, height: h - padding * 2 * scaler, xoffset: 0, yoffset: -glyphTop, xadvance: w - padding * 2 * scaler // same as width }); return true; } } /** * CharacterCanvas is used to draw a single character on a canvas, * and get the pixels data of the character. */ class CharacterCanvas { /** * Create a CharacterCanvas. * @param {object} [options] - The options of the CharacterCanvas. * @param {number} [options.fontSize=72] - The font size. * @param {string} [options.fontFamily='sans-serif'] - The font family. * @param {string} [options.fontWeight='normal'] - The font weight. * @param {string} [options.fontStyle='normal'] - The font style. * @param {boolean} [options.sdf=true] - Whether to use signed distance field. */ constructor({ fontSize = 72, fontFamily = 'sans-serif', fontWeight = 'normal', fontStyle = 'normal', sdf = true } = {}) { // make the canvas size big enough to both have the specified buffer around the glyph // for "halo", and account for some glyphs possibly being larger than their font size const padding = Math.floor(fontSize / 24 * 3); const size = fontSize + padding * 4; const canvas = document.createElement('canvas'); canvas.width = canvas.height = size; const ctx = canvas.getContext('2d', { willReadFrequently: true }); ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`; ctx.textBaseline = 'alphabetic'; ctx.textAlign = 'left'; // Necessary so that RTL text doesn't have different alignment ctx.fillStyle = sdf ? 'black' : 'white'; this.dt = sdf ? new DistanceTransform(size * size, size) : null; this.size = size; this.padding = padding; this.distanceRadius = Math.floor(fontSize / 24 * 8); this.distanceCutoff = 0.25; this.ctx = ctx; } /** * Draw a character on the canvas and get the pixels of the character. * @param {string} char - The character to draw. * @returns {object} - The pixel information of the character. * @property {Uint8ClampedArray} buffer - The pixel information buffer of the character. * @property {number} width - The width of the character pixel information. * @property {number} height - The height of the character pixel information. * @property {number} padding - The padding of the character pixel information. * @property {number} glyphTop - The baseline to the top of the highest bounding box of the glyphs used to render the text. */ draw(char) { const { size, padding, distanceRadius, distanceCutoff, ctx, dt } = this; const { actualBoundingBoxAscent, // The distance from the baseline to the top of the highest bounding box of the glyphs used to render the text. actualBoundingBoxDescent, // The distance from the baseline to the bottom of the lowest bounding box of the glyphs used to render the text. actualBoundingBoxLeft, // The distance from the origin to the left of the leftmost glyph of the text. actualBoundingBoxRight // The distance from the origin to the right of the rightmost glyph of the text. } = ctx.measureText(char); // The integer/pixel part of the top alignment is encoded in metrics.glyphTop // The remainder is implicitly encoded in the rasterization let glyphTop = Math.ceil(actualBoundingBoxAscent); // If the glyph overflows the canvas size, it will be clipped at the bottom/right let glyphWidth = Math.max(0, Math.min(size - padding, Math.ceil(actualBoundingBoxRight - actualBoundingBoxLeft))); let glyphHeight = Math.min(size - padding, glyphTop + Math.ceil(actualBoundingBoxDescent)); // handle space and tab if (glyphWidth === 0 || glyphHeight === 0) { glyphTop = 0; glyphWidth = Math.floor(size / 2 - padding * 2); // half font size glyphHeight = 0; } const width = Math.min(glyphWidth + 2 * padding, size); const height = Math.min(glyphHeight + 2 * padding, size); ctx.clearRect(0, 0, width, height); ctx.fillText(char, padding, padding + glyphTop); const imageData = ctx.getImageData(0, 0, width, height); let buffer; if (dt) { buffer = dt.transform(imageData, { radius: distanceRadius, cutoff: distanceCutoff }); } else { buffer = new Uint8ClampedArray(imageData.data); } return { buffer, width, height, padding, glyphTop }; } } /** * FontAtlas is responsible for caching all used character pixels data. */ class FontAtlas { /** * Create a FontAtlas. * @param {number} width - The width of the atlas. * @param {number} height - The height of the atlas. * @param {number} charSize - The size of each character. * @param {string} [channel='R2R'] - The channel of the atlas. 'R2R', 'RGB2RGBA' or 'RGBA2RGBA'. */ constructor(width, height, charSize, channel = 'R2R') { this.width = width; this.height = height; this._charSize = charSize; this._maxCol = Math.floor(width / charSize); this._maxRow = Math.floor(height / charSize); this._indexManager = new IndexManager(this._maxCol * this._maxRow); this._fontMap = new Map(); this._fontBuffer = new Uint8ClampedArray(width * height * (channel === 'R2R' ? 1 : 4)); this._copyMethod = CopyMethods[channel]; this._clearMethod = ClearMethods[channel]; } /** * Add a character to the atlas. * @param {string} char - The character to add. * @param {object} originCharData - The pixel information of the character. * @param {Uint8ClampedArray|Uint8Array} originCharData.buffer - The pixel information buffer of the character. * @param {number} originCharData.width - The width of the character pixel information. * @param {number} originCharData.height - The height of the character pixel information. * @returns {boolean} - Returns true if the character is added successfully, otherwise returns false. */ addChar(char, originCharData) { if (!this._indexManager.canAllocate()) { return false; } const { buffer, width, height } = originCharData; const writeIndex = this._indexManager.allocate(); const charInfo = { i: writeIndex, x: (writeIndex % this._maxCol) * this._charSize, y: Math.floor(writeIndex / this._maxCol) * this._charSize, w: width, h: height }; this._fontMap.set(char, charInfo); const copyMethod = this._copyMethod; for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { const targetIndex = (charInfo.x + x) + (charInfo.y + y) * this.width; const sourceIndex = x + y * width; copyMethod(buffer, this._fontBuffer, sourceIndex, targetIndex); } } return true; } /** * Remove a character from the atlas. * @param {string} char - The character to remove. */ removeChar(char) { if (!this._fontMap.has(char)) { return; } const charInfo = this._fontMap.get(char); this._indexManager.free(charInfo.i); this._fontMap.delete(char); const { x, y, w, h } = charInfo; const clearMethod = this._clearMethod; for (let j = y; j < y + h; j++) { for (let i = x; i < x + w; i++) { clearMethod(this._fontBuffer, i + j * this.width); } } } /** * Clear all characters in the atlas. * This method will clear all character information in the atlas. * After calling this method, the atlas will be empty. * You can add new characters to the atlas after calling this method. */ clear() { this._fontMap.clear(); this._indexManager.reset(this._maxCol * this._maxRow); this._fontBuffer.fill(0); } /** * Get the character information. * @param {string} char - The character to get. * @returns {object} - The character information. * @property {number} i - The index of the character in the atlas. * @property {number} x - The x position of the character in the atlas. * @property {number} y - The y position of the character in the atlas. * @property {number} w - The width of the character pixel information. * @property {number} h - The height of the character pixel information. */ getChar(char) { return this._fontMap.get(char); } /** * Check if the atlas has a character. * @param {string} char - The character to check. * @returns {boolean} - Returns true if the atlas has the character, otherwise returns false. */ hasChar(char) { return this._fontMap.has(char); } /** * Get the buffer of the atlas. * The buffer is a Uint8ClampedArray that contains the pixels data of the atlas. * @returns {Uint8ClampedArray} - The buffer of the atlas. */ get buffer() { return this._fontBuffer; } } const CopyMethods = { 'R2R': function(sourceBuffer, targetBuffer, sourceIndex, targetIndex) { targetBuffer[targetIndex] = sourceBuffer[sourceIndex]; }, 'RGB2RGBA': function(sourceBuffer, targetBuffer, sourceIndex, targetIndex) { targetBuffer[targetIndex * 4] = sourceBuffer[sourceIndex * 3]; targetBuffer[targetIndex * 4 + 1] = sourceBuffer[sourceIndex * 3 + 1]; targetBuffer[targetIndex * 4 + 2] = sourceBuffer[sourceIndex * 3 + 2]; targetBuffer[targetIndex * 4 + 3] = 255; }, 'RGBA2RGBA': function(sourceBuffer, targetBuffer, sourceIndex, targetIndex) { targetBuffer[targetIndex * 4] = sourceBuffer[sourceIndex * 4]; targetBuffer[targetIndex * 4 + 1] = sourceBuffer[sourceIndex * 4 + 1]; targetBuffer[targetIndex * 4 + 2] = sourceBuffer[sourceIndex * 4 + 2]; targetBuffer[targetIndex * 4 + 3] = sourceBuffer[sourceIndex * 4 + 3]; } }; const ClearMethods = { 'R2R': function(buffer, index) { buffer[index] = 0; }, 'RGB2RGBA': function(buffer, index) { buffer[index * 4] = 0; buffer[index * 4 + 1] = 0; buffer[index * 4 + 2] = 0; buffer[index * 4 + 3] = 0; }, 'RGBA2RGBA': function(buffer, index) { buffer[index * 4] = 0; buffer[index * 4 + 1] = 0; buffer[index * 4 + 2] = 0; buffer[index * 4 + 3] = 0; } }; /** * A simple index manager that manages the allocation and release of indexes. */ class IndexManager { constructor(max) { this.availabel = []; this.reset(max); } canAllocate() { return this.availabel.length > 0; } allocate() { return this.availabel.pop(); } free(index) { this.availabel.push(index); } reset(max) { this.availabel = Array.from({ length: max }, (_, i) => i).reverse(); } } export { DynamicFont, CharacterCanvas, FontAtlas }; ================================================ FILE: examples/jsm/GBuffer.js ================================================ import { ATTACHMENT, Matrix4, OffscreenRenderTarget, SHADING_TYPE, ShaderMaterial, ShaderPostPass, Texture2D, PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_FILTER } from 't3d'; class GBuffer { constructor(width, height) { this._renderTarget1 = OffscreenRenderTarget.create2D(width, height); this._renderTarget1.texture.minFilter = TEXTURE_FILTER.NEAREST; this._renderTarget1.texture.magFilter = TEXTURE_FILTER.NEAREST; this._renderTarget1.texture.type = PIXEL_TYPE.HALF_FLOAT; this._renderTarget1.texture.generateMipmaps = false; this._depthTexture = new Texture2D(); this._depthTexture.image = { data: null, width: 4, height: 4 }; this._depthTexture.type = PIXEL_TYPE.UNSIGNED_INT_24_8; this._depthTexture.format = PIXEL_FORMAT.DEPTH_STENCIL; this._depthTexture.magFilter = TEXTURE_FILTER.NEAREST; this._depthTexture.minFilter = TEXTURE_FILTER.NEAREST; this._depthTexture.generateMipmaps = false; this._depthTexture.flipY = false; this._renderTarget1.attach(this._depthTexture, ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this._texture2 = new Texture2D(); this._texture2.minFilter = TEXTURE_FILTER.LINEAR; this._texture2.magFilter = TEXTURE_FILTER.LINEAR; this._texture2.generateMipmaps = false; this._renderTarget2 = OffscreenRenderTarget.create2D(width, height); this._renderTarget2.texture.minFilter = TEXTURE_FILTER.LINEAR; this._renderTarget2.texture.magFilter = TEXTURE_FILTER.LINEAR; this._renderTarget2.texture.generateMipmaps = false; this._renderTarget3 = OffscreenRenderTarget.create2D(width, height); this._renderTarget3.texture.type = PIXEL_TYPE.HALF_FLOAT; this._renderTarget3.texture.minFilter = TEXTURE_FILTER.NEAREST; this._renderTarget3.texture.magFilter = TEXTURE_FILTER.NEAREST; this._renderTarget3.texture.generateMipmaps = false; this._useMRT = false; this._debugPass = new ShaderPostPass(debugShader); this.enableNormalGlossiness = true; this.enableAlbedoMetalness = true; this.enableMotion = false; } /** * Set G Buffer size. * @param {number} width * @param {number} height */ resize(width, height) { this._renderTarget1.resize(width, height); this._renderTarget2.resize(width, height); this._renderTarget3.resize(width, height); } update(renderer, scene, camera) { const renderStates = scene.getRenderStates(camera); const renderQueueLayer = scene.getRenderQueue(camera).layerList[0]; // now just render layer 0 // Use MRT if support, otherwise use multiple render targets, // renderer.capabilities.getExtension('WEBGL_draw_buffers') has bug here, // so we use renderer.capabilities.version to check if support MRT if (renderer.capabilities.version >= 2) { if (!this._useMRT) { this._useMRT = true; const ext = renderer.capabilities.getExtension('EXT_color_buffer_float'); if (ext) { this._renderTarget1.texture.type = PIXEL_TYPE.HALF_FLOAT; } else { this._renderTarget1.texture.type = PIXEL_TYPE.UNSIGNED_BYTE; } this._renderTarget1.attach(this._texture2, ATTACHMENT.COLOR_ATTACHMENT1); } renderer.beginRender(this._renderTarget1); renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, { getMaterial: function(renderable) { return materialCache.getMrtMaterial(renderable); }, ifRender: function(renderable) { return !!renderable.geometry.getAttribute('a_Normal'); } }); renderer.endRender(); } else { if (this.enableNormalGlossiness) { renderer.beginRender(this._renderTarget1); renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, { getMaterial: function(renderable) { return materialCache.getNormalGlossinessMaterial(renderable); }, ifRender: function(renderable) { return !!renderable.geometry.getAttribute('a_Normal'); } }); renderer.endRender(); } if (this.enableAlbedoMetalness) { renderer.beginRender(this._renderTarget2); renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, { getMaterial: function(renderable) { return materialCache.getAlbedoMetalnessMaterial(renderable); }, ifRender: function(renderable) { return !!renderable.geometry.getAttribute('a_Normal'); } }); renderer.endRender(); } } if (this.enableMotion) { const renderConfig = { getMaterial: function(renderable) { return materialCache.getMotionMaterial(renderable); }, afterRender: function(renderable) { if (!renderable.object.userData['prevModel']) { renderable.object.userData['prevModel'] = new Float32Array(16); } renderable.object.worldMatrix.toArray(renderable.object.userData['prevModel']); if (!renderable.object.userData['prevView']) { renderable.object.userData['prevView'] = new Float32Array(16); } helpMatrix4.copy(camera.viewMatrix).toArray(renderable.object.userData['prevView']); if (!renderable.object.userData['prevProjection']) { renderable.object.userData['prevProjection'] = new Float32Array(16); } helpMatrix4.copy(camera.projectionMatrix).toArray(renderable.object.userData['prevProjection']); const skeleton = renderable.object.skeleton; if (skeleton) { if (skeleton.boneTexture) { if (!renderable.object.userData['prevBoneTexture']) { const oldTexture = skeleton.boneTexture; const newTexture = oldTexture.clone(); newTexture.image = { width: oldTexture.image.width, height: oldTexture.image.height, data: new Float32Array(oldTexture.image.data.length) }; renderable.object.userData['prevBoneTexture'] = newTexture; } renderable.object.userData['prevBoneTexture'].image.data.set(skeleton.boneTexture.image.data); renderable.object.userData['prevBoneTexture'].version++; } else { if (!renderable.object.userData['prevBoneMatrices']) { renderable.object.userData['prevBoneMatrices'] = new Float32Array(skeleton.boneMatrices.length); } renderable.object.userData['prevBoneMatrices'].set(skeleton.boneMatrices); } } // TODO support morph targets } }; renderer.beginRender(this._renderTarget3); renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderConfig); renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderConfig); renderer.endRender(); } } /** * Debug output of gBuffer. Use `type` parameter to choos the debug output type, which can be: * * + 'normal' * + 'depth' * + 'position' * + 'glossiness' * + 'metalness' * + 'albedo' * + 'velocity' * @param {ThinRenderer} renderer * @param {Camera} camera * @param {string} type * @param {RenderTargetBase} renderTarget */ renderDebug(renderer, camera, type, renderTarget) { this._debugPass.uniforms['normalGlossinessTexture'] = this.getNormalGlossinessTexture(); this._debugPass.uniforms['depthTexture'] = this.getDepthTexture(); this._debugPass.uniforms['albedoMetalnessTexture'] = this.getAlbedoMetalnessTexture(); this._debugPass.uniforms['motionTexture'] = this.getMotionTexture(); this._debugPass.uniforms['debug'] = DebugTypes[type] || 0; helpMatrix4.multiplyMatrices(camera.projectionMatrix, camera.viewMatrix).invert(); helpMatrix4.toArray(this._debugPass.uniforms['matProjViewInverse']); this._debugPass.render(renderer, renderTarget); } /** * Get normal glossiness texture. * Channel storage: * + R: normal.x * 0.5 + 0.5 * + G: normal.y * 0.5 + 0.5 * + B: normal.z * 0.5 + 0.5 * + A: glossiness * @returns {Texture2D} */ getNormalGlossinessTexture() { return this._renderTarget1.texture; } /** * Get depth texture. * Channel storage: * + R: depth * @returns {Texture2D} */ getDepthTexture() { return this._depthTexture; } /** * Get albedo metalness texture. * Channel storage: * + R: albedo.r * + G: albedo.g * + B: albedo.b * + A: metalness * @returns {Texture2D} */ getAlbedoMetalnessTexture() { return this._useMRT ? this._texture2 : this._renderTarget2.texture; } /** * Get motion texture. * Channel storage: * + R: velocity.x * + G: velocity.y * @returns {Texture2D} */ getMotionTexture() { return this._renderTarget3.texture; } dispose() { this._renderTarget1.dispose(); this._renderTarget2.dispose(); this._renderTarget3.dispose(); this._depthTexture.dispose(); this._texture2.dispose(); this._debugPass.dispose(); materialCache.MRTMaterials.forEach(material => material.dispose()); materialCache.normalGlossinessMaterials.forEach(material => material.dispose()); materialCache.albedoMetalnessMaterials.forEach(material => material.dispose()); materialCache.motionMaterials.forEach(material => material.dispose()); materialCache.MRTMaterials.clear(); materialCache.normalGlossinessMaterials.clear(); materialCache.albedoMetalnessMaterials.clear(); materialCache.motionMaterials.clear(); } } const helpMatrix4 = new Matrix4(); const materialCache = new MaterialCache(); function MaterialCache() { const normalGlossinessMaterials = new Map(); const albedoMetalnessMaterials = new Map(); const motionMaterials = new Map(); const mrtMaterials = new Map(); const state = {}; function generateMaterialState(renderable, result) { result.useFlatShading = !renderable.geometry.attributes['a_Normal'] || (renderable.material.shading === SHADING_TYPE.FLAT_SHADING); result.useDiffuseMap = !!renderable.material.diffuseMap; result.useRoughnessMap = !!renderable.material.roughnessMap; result.useMetalnessMap = !!renderable.material.metalnessMap; result.useSkinning = renderable.object.isSkinnedMesh && renderable.object.skeleton; result.morphTargets = !!renderable.object.morphTargetInfluences; result.morphNormals = !!renderable.object.morphTargetInfluences && renderable.object.geometry.morphAttributes.normal; result.drawMode = renderable.material.drawMode; result.isSkyBox = renderable.material.shaderName == 'skybox'; let maxBones = 0; if (result.useSkinning) { if (renderable.object.skeleton.boneTexture) { maxBones = 1024; } else { maxBones = renderable.object.skeleton.bones.length; } } result.maxBones = maxBones; } function getMrtMaterial(renderable) { generateMaterialState(renderable, state); let material; const code = state.useFlatShading + '_' + state.useDiffuseMap + '_' + state.useRoughnessMap + '_' + state.useMetalnessMap + '_' + state.useSkinning + '_' + state.morphTargets + '_' + state.morphNormals; if (!mrtMaterials.has(code)) { material = new ShaderMaterial(mrtShader); material.shading = state.useFlatShading ? SHADING_TYPE.FLAT_SHADING : SHADING_TYPE.SMOOTH_SHADING; material.alphaTest = state.useDiffuseMap ? 0.999 : 0; // ignore if alpha < 0.99 mrtMaterials.set(code, material); } else { material = mrtMaterials.get(code); } material.diffuse.copy(renderable.material.diffuse); material.diffuseMap = renderable.material.diffuseMap; material.uniforms.roughness = renderable.material.roughness !== undefined ? renderable.material.roughness : 0.5; material.roughnessMap = renderable.material.roughnessMap; material.uniforms.metalness = renderable.material.metalness !== undefined ? renderable.material.metalness : 0.5; material.metalnessMap = renderable.material.metalnessMap; return material; } function getNormalGlossinessMaterial(renderable) { generateMaterialState(renderable, state); let material; const code = state.useFlatShading + '_' + state.useDiffuseMap + '_' + state.useRoughnessMap + '_' + state.useSkinning + '_' + state.morphTargets + '_' + state.morphNormals; if (!normalGlossinessMaterials.has(code)) { material = new ShaderMaterial(normalGlossinessShader); material.shading = state.useFlatShading ? SHADING_TYPE.FLAT_SHADING : SHADING_TYPE.SMOOTH_SHADING; material.alphaTest = state.useDiffuseMap ? 0.999 : 0; // ignore if alpha < 0.99 normalGlossinessMaterials.set(code, material); } else { material = normalGlossinessMaterials.get(code); } material.diffuseMap = renderable.material.diffuseMap; material.uniforms.roughness = renderable.material.roughness !== undefined ? renderable.material.roughness : 0.5; material.roughnessMap = renderable.material.roughnessMap; return material; } function getAlbedoMetalnessMaterial(renderable) { generateMaterialState(renderable, state); let material; const code = state.useFlatShading + '_' + state.useDiffuseMap + '_' + state.useMetalnessMap + '_' + state.useSkinning + '_' + state.morphTargets + '_' + state.morphNormals; if (!albedoMetalnessMaterials.has(code)) { material = new ShaderMaterial(albedoMetalnessShader); material.shading = state.useFlatShading ? SHADING_TYPE.FLAT_SHADING : SHADING_TYPE.SMOOTH_SHADING; material.alphaTest = state.useDiffuseMap ? 0.999 : 0; // ignore if alpha < 0.99 albedoMetalnessMaterials.set(code, material); } else { material = albedoMetalnessMaterials.get(code); } material.diffuse.copy(renderable.material.diffuse); material.diffuseMap = renderable.material.diffuseMap; material.uniforms.metalness = renderable.material.metalness !== undefined ? renderable.material.metalness : 0.5; material.metalnessMap = renderable.material.metalnessMap; return material; } function getMotionMaterial(renderable) { generateMaterialState(renderable, state); let material; const code = state.useSkinning + '_' + state.maxBones + '_' + state.morphTargets + '_' + state.drawMode + '_' + state.isSkyBox; if (!motionMaterials.has(code)) { material = new ShaderMaterial(motionShader); material.side = renderable.material.side; material.drawMode = renderable.material.drawMode; if (state.isSkyBox) { material.defines['IS_SKY'] = true; } motionMaterials.set(code, material); } else { material = motionMaterials.get(code); } if (renderable.object.userData['prevModel'] && renderable.object.userData['prevView'] && renderable.object.userData['prevProjection']) { helpMatrix4.fromArray(renderable.object.userData['prevModel']).toArray(material.uniforms['prevModel']); helpMatrix4.fromArray(renderable.object.userData['prevView']).toArray(material.uniforms['prevView']); helpMatrix4.fromArray(renderable.object.userData['prevProjection']).toArray(material.uniforms['prevProjection']); material.uniforms['firstRender'] = false; if (renderable.object.userData['prevBoneTexture']) { material.uniforms['prevBoneTexture'] = renderable.object.userData['prevBoneTexture']; material.uniforms['prevBoneTextureSize'] = renderable.object.userData['prevBoneTexture'].image.width; } else if (renderable.object.userData['prevBoneMatrices']) { material.uniforms['prevBoneMatrices'] = renderable.object.userData['prevBoneMatrices']; } } else { material.uniforms['firstRender'] = true; } return material; } return { getMrtMaterial: getMrtMaterial, getNormalGlossinessMaterial: getNormalGlossinessMaterial, getAlbedoMetalnessMaterial: getAlbedoMetalnessMaterial, getMotionMaterial: getMotionMaterial }; } const normalGlossinessShader = { name: 'g-normal-glossiness', defines: {}, uniforms: { roughness: 0.5 }, vertexShader: ` #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include } `, fragmentShader: ` #include #include #include #include #include #include uniform float roughness; #ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; #endif #include void main() { #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST) vec4 texelColor = texture2D(diffuseMap, v_Uv); float alpha = texelColor.a * u_Opacity; if(alpha < u_AlphaTest) discard; #endif #ifdef FLAT_SHADED vec3 fdx = dFdx(v_modelPos); vec3 fdy = dFdy(v_modelPos); vec3 normal = normalize(cross(fdx, fdy)); #else vec3 normal = normalize(v_Normal); #ifdef DOUBLE_SIDED normal = normal * (float(gl_FrontFacing) * 2.0 - 1.0); #endif #endif float roughnessFactor = roughness; #ifdef USE_ROUGHNESSMAP roughnessFactor *= texture2D(roughnessMap, v_Uv).g; #endif vec4 packedNormalGlossiness; packedNormalGlossiness.xyz = normal * 0.5 + 0.5; packedNormalGlossiness.w = clamp(1. - roughnessFactor, 0., 1.); gl_FragColor = packedNormalGlossiness; } ` }; const albedoMetalnessShader = { name: 'g-albedo-metalness', defines: {}, uniforms: { metalness: 0.5 }, vertexShader: ` #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include } `, fragmentShader: ` uniform vec3 u_Color; uniform float metalness; #include #include #ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; #endif void main() { vec4 outColor = vec4(u_Color, 1.0); #include vec3 diffuseColor = outColor.rgb * outColor.a; float metalnessFactor = metalness; #ifdef USE_METALNESSMAP metalnessFactor *= texture2D(metalnessMap, v_Uv).b; #endif gl_FragColor = vec4(diffuseColor.rgb, metalnessFactor); } ` }; const motionShader = { name: 'g-motion', defines: { IS_SKY: false }, uniforms: { prevModel: new Float32Array(16), prevView: new Float32Array(16), prevProjection: new Float32Array(16), prevBoneTexture: null, prevBoneTextureSize: 256, prevBoneMatrices: new Float32Array(), firstRender: false }, vertexShader: ` #include #include #include uniform mat4 prevModel; uniform mat4 prevView; uniform mat4 prevProjection; varying vec4 v_ScreenPosition; varying vec4 v_PrevScreenPosition; #ifdef USE_SKINNING #ifdef BONE_TEXTURE uniform sampler2D prevBoneTexture; uniform int prevBoneTextureSize; mat4 getPrevBoneMatrix(const in float i) { float j = i * 4.0; float x = mod(j, float(prevBoneTextureSize)); float y = floor(j / float(prevBoneTextureSize)); float dx = 1.0 / float(prevBoneTextureSize); float dy = 1.0 / float(prevBoneTextureSize); y = dy * (y + 0.5); vec4 v1 = texture2D(prevBoneTexture, vec2(dx * (x + 0.5), y)); vec4 v2 = texture2D(prevBoneTexture, vec2(dx * (x + 1.5), y)); vec4 v3 = texture2D(prevBoneTexture, vec2(dx * (x + 2.5), y)); vec4 v4 = texture2D(prevBoneTexture, vec2(dx * (x + 3.5), y)); mat4 bone = mat4(v1, v2, v3, v4); return bone; } #else uniform mat4 prevBoneMatrices[MAX_BONES]; mat4 getPrevBoneMatrix(const in float i) { mat4 bone = prevBoneMatrices[int(i)]; return bone; } #endif #endif #ifdef IS_SKY mat4 clearMat4Translate(mat4 m) { mat4 outMatrix = m; outMatrix[3].xyz = vec3(0., 0., 0.); return outMatrix; } #endif void main() { #include vec3 prevTransformed = transformed; #include #include #include #ifdef USE_SKINNING mat4 prevBoneMatX = getPrevBoneMatrix(skinIndex.x); mat4 prevBoneMatY = getPrevBoneMatrix(skinIndex.y); mat4 prevBoneMatZ = getPrevBoneMatrix(skinIndex.z); mat4 prevBoneMatW = getPrevBoneMatrix(skinIndex.w); vec4 prevSkinVertex = bindMatrix * vec4(prevTransformed, 1.0); vec4 prevSkinned = vec4(0.0); prevSkinned += prevBoneMatX * prevSkinVertex * skinWeight.x; prevSkinned += prevBoneMatY * prevSkinVertex * skinWeight.y; prevSkinned += prevBoneMatZ * prevSkinVertex * skinWeight.z; prevSkinned += prevBoneMatW * prevSkinVertex * skinWeight.w; prevSkinned = bindMatrixInverse * prevSkinned; prevTransformed = prevSkinned.xyz / prevSkinned.w; #endif #ifdef IS_SKY v_ScreenPosition = u_Projection * clearMat4Translate(u_View) * u_Model * vec4(transformed, 1.0); v_PrevScreenPosition = prevProjection * clearMat4Translate(prevView) * prevModel * vec4(prevTransformed, 1.0); gl_Position = u_Projection * clearMat4Translate(u_View) * u_Model * vec4(transformed, 1.0); gl_Position.z = gl_Position.w; #else v_ScreenPosition = u_ProjectionView * u_Model * vec4(transformed, 1.0); v_PrevScreenPosition = prevProjection * prevView * prevModel * vec4(prevTransformed, 1.0); #endif } `, fragmentShader: ` uniform bool firstRender; varying vec4 v_ScreenPosition; varying vec4 v_PrevScreenPosition; void main() { vec2 a = v_ScreenPosition.xy / v_ScreenPosition.w; vec2 b = v_PrevScreenPosition.xy / v_PrevScreenPosition.w; if (firstRender) { gl_FragColor = vec4(0.0); } else { gl_FragColor = vec4((a - b) * 0.5 + 0.5, 0.0, 1.0); } } ` }; const mrtShader = { name: 'g-mrt', defines: {}, uniforms: { roughness: 0.5, metalness: 0.5 }, vertexShader: ` #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include #include #include } `, fragmentShader: ` #extension GL_EXT_draw_buffers : require #include #include #include #include #include #include uniform float roughness; uniform float metalness; #ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; #endif #ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; #endif #include void main() { vec4 outColor = vec4(u_Color, 1.0); #include vec3 diffuseColor = outColor.rgb * outColor.a; float metalnessFactor = metalness; #ifdef USE_METALNESSMAP metalnessFactor *= texture2D(metalnessMap, v_Uv).b; #endif gl_FragData[1] = vec4(outColor.xyz, metalnessFactor); #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST) float alpha = outColor.a * u_Opacity; if(alpha < u_AlphaTest) discard; #endif #ifdef FLAT_SHADED vec3 fdx = dFdx(v_modelPos); vec3 fdy = dFdy(v_modelPos); vec3 normal = normalize(cross(fdx, fdy)); #else vec3 normal = normalize(v_Normal); #ifdef DOUBLE_SIDED normal = normal * (float(gl_FrontFacing) * 2.0 - 1.0); #endif #endif float roughnessFactor = roughness; #ifdef USE_ROUGHNESSMAP roughnessFactor *= texture2D(roughnessMap, v_Uv).g; #endif vec4 packedNormalGlossiness; packedNormalGlossiness.xyz = normal * 0.5 + 0.5; packedNormalGlossiness.w = clamp(1. - roughnessFactor, 0., 1.); gl_FragData[0] = packedNormalGlossiness; } ` }; const DebugTypes = { normal: 0, depth: 1, position: 2, glossiness: 3, metalness: 4, albedo: 5, velocity: 6 }; const debugShader = { name: 'g-debug', defines: { ARROW_TILE_SIZE: '32.0' }, uniforms: { normalGlossinessTexture: null, depthTexture: null, albedoMetalnessTexture: null, motionTexture: null, // DEBUG // - 0: normal // - 1: depth // - 2: position // - 3: glossiness // - 4: metalness // - 5: albedo // - 6: velocity debug: 0, matProjViewInverse: new Float32Array(16), velocityThreshold: 0.01, arrowScale: 4.8 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D normalGlossinessTexture; uniform sampler2D depthTexture; uniform sampler2D albedoMetalnessTexture; uniform sampler2D motionTexture; uniform int debug; uniform mat4 matProjViewInverse; uniform float velocityThreshold; uniform float arrowScale; varying vec2 v_Uv; vec2 arrowTileCenterCoord(vec2 pos) { return (floor(pos / ARROW_TILE_SIZE) + 0.5) * ARROW_TILE_SIZE; } float line(vec2 p, vec2 p1, vec2 p2) { vec2 center = (p1 + p2) * 0.5; float len = length(p2 - p1); vec2 dir = (p2 - p1) / len; vec2 rel_p = p - center; float dist1 = abs(dot(rel_p, vec2(dir.y, -dir.x))); float dist2 = abs(dot(rel_p, dir)) - 0.5 * len; return max(dist1, dist2); } float arrow(vec2 p, vec2 v) { p -= arrowTileCenterCoord(p); float mag_v = length(v), mag_p = length(p); if (mag_v > 0.0) { vec2 dir_v = v / mag_v; mag_v = clamp(mag_v, 0.0, ARROW_TILE_SIZE * 0.5); v = dir_v * mag_v; float shaft = line(p, v, -v); float head = min(line(p, v, 0.4 * v + 0.2 * vec2(-v.y, v.x)), line(p, v, 0.4 * v + 0.2 * vec2(v.y, -v.x))); return min(shaft, head); } else { return mag_p; } } void main() { vec2 texCoord = v_Uv; vec4 texel1 = texture2D(normalGlossinessTexture, texCoord); vec4 texel3 = texture2D(albedoMetalnessTexture, texCoord); if (dot(texel1.rgb, vec3(1.0)) == 0.0) { discard; } float glossiness = texel1.a; float metalness = texel3.a; vec3 N = texel1.rgb * 2.0 - 1.0; float depth = texture2D(depthTexture, texCoord).r; float z = depth * 2.0 - 1.0; vec2 xy = texCoord * 2.0 - 1.0; vec4 projectedPos = vec4(xy, z, 1.0); vec4 p4 = matProjViewInverse * projectedPos; vec3 position = p4.xyz / p4.w; vec3 albedo = texel3.rgb; if (debug == 0) { gl_FragColor = vec4(N * 0.5 + 0.5, 1.0); } else if (debug == 1) { gl_FragColor = vec4(vec3(depth), 1.0); } else if (debug == 2) { gl_FragColor = vec4(position, 1.0); } else if (debug == 3) { gl_FragColor = vec4(vec3(glossiness), 1.0); } else if (debug == 4) { gl_FragColor = vec4(vec3(metalness), 1.0); } else if (debug == 5) { gl_FragColor = vec4(albedo, 1.0); } else { vec4 texel4 = texture2D(motionTexture, texCoord); if (texel4.r == 0.) { discard; } float arrow_dist = arrow(gl_FragCoord.xy, (texel4.rg - 0.5) * ARROW_TILE_SIZE * arrowScale); vec4 arrow_col = vec4(0, 0, 0, clamp(arrow_dist, 0.0, 1.0)); vec4 field_col = vec4(texel4.rg , 0.5, 1.0); vec4 fColor = mix(vec4(1.0), field_col, arrow_col.a); gl_FragColor = fColor; if (length(texel4.rg - 0.5) < velocityThreshold) { gl_FragColor = field_col; } } } ` }; export { GBuffer }; ================================================ FILE: examples/jsm/PickBuffer.js ================================================ import { OffscreenRenderTarget, PIXEL_TYPE, TEXTURE_FILTER, SHADING_TYPE, ShaderMaterial } from 't3d'; export default class PickBuffer { constructor(width, height) { this._rt = OffscreenRenderTarget.create2D(width, height); this._rt.texture.minFilter = TEXTURE_FILTER.NEAREST; this._rt.texture.magFilter = TEXTURE_FILTER.NEAREST; this._rt.texture.generateMipmaps = false; this._rt.texture.type = PIXEL_TYPE.FLOAT; this._renderOptions = { getMaterial: createGetMaterialFunction(), ifRender: function(renderable) { return !!renderable.geometry.getAttribute('a_Normal'); } }; this.layers = [0]; this.meshes = new Map(); } setMeshPickId(pickId, mesh) { mesh.pickId = pickId; this.meshes.set(pickId, mesh); } getMeshByPickId(pickId) { return this.meshes.get(pickId); } render(renderer, scene, camera) { const renderOptions = this._renderOptions; const renderStates = scene.getRenderStates(camera); const renderQueue = scene.getRenderQueue(camera); renderer.beginRender(this._rt); const layers = this.layers; for (let i = 0, l = layers.length; i < l; i++) { const renderQueueLayer = renderQueue.getLayer(layers[i]); renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderOptions); renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions); } renderer.endRender(); } output() { return this._rt; } resize(width, height) { this._rt.resize(width, height); } dispose() { this._rt.dispose(); } } function createGetMaterialFunction(func = defaultMaterialReplaceFunction) { return function(renderable) { const material = func(renderable); material.uniforms['u_pickId'] = renderable.object.pickId || 0.0; material.side = renderable.material.side; return material; }; } const materialMap = new Map(); const materialWeakMap = new WeakMap(); function defaultMaterialReplaceFunction(renderable) { let materialRef = materialWeakMap.get(renderable.material); if (!materialRef) { const useFlatShading = !renderable.geometry.attributes['a_Normal'] || (renderable.material.shading === SHADING_TYPE.FLAT_SHADING); const useSkinning = renderable.object.isSkinnedMesh && renderable.object.skeleton; const morphTargets = !!renderable.object.morphTargetInfluences; const morphNormals = !!renderable.object.morphTargetInfluences && renderable.object.geometry.morphAttributes.normal; const side = renderable.material.side; let maxBones = 0; if (useSkinning) { if (renderable.object.skeleton.boneTexture) { maxBones = 1024; } else { maxBones = renderable.object.skeleton.bones.length; } } const code = useFlatShading + '_' + useSkinning + '_' + maxBones + '_' + morphTargets + '_' + morphNormals + '_' + side; materialRef = materialMap.get(code); if (!materialRef) { const material = new ShaderMaterial(pickShader); material.shading = useFlatShading ? SHADING_TYPE.FLAT_SHADING : SHADING_TYPE.SMOOTH_SHADING; material.side = side; materialRef = { refCount: 0, material }; materialMap.set(code, materialRef); } materialWeakMap.set(renderable.material, materialRef); materialRef.refCount++; function onDispose() { renderable.material.removeEventListener('dispose', onDispose); materialWeakMap.delete(renderable.material); materialRef.refCount--; if (materialRef.refCount <= 0) { materialMap.delete(code); } } renderable.material.addEventListener('dispose', onDispose); } return materialRef.material; } const pickShader = { name: 'gpu_pick', uniforms: { u_pickId: 1 }, vertexShader: ` #include #include #include #include #include varying float viewZ; void main() { #include #include #include #include #include #include #include #include viewZ = (u_View * worldPosition).z; } `, fragmentShader: ` #include #include #include uniform float u_pickId; varying float viewZ; vec2 unitVectorToOctahedron(vec3 v) { vec2 up = v.xz / dot(vec3(1.0), abs(v)); vec2 down = (1.0 - abs(up.yx)) * sign(up.xy); return mix(up, down, step(0.0, -v.y)); } void main() { #include vec3 normal = normalize(v_Normal); vec4 pickInformation; pickInformation.xy = unitVectorToOctahedron(normal); pickInformation.z = viewZ; pickInformation.w = round(u_pickId); gl_FragColor = pickInformation; } ` }; ================================================ FILE: examples/jsm/Raycaster.js ================================================ // deprecated since v0.4.3 console.warn('Raycaster has been moved to core. Please import it from t3d instead of t3d/addons.'); export { Raycaster } from 't3d'; ================================================ FILE: examples/jsm/SHGenerator.js ================================================ import { Vector3, Color3, OffscreenRenderTarget, Scene, PIXEL_TYPE, PIXEL_FORMAT, SphericalHarmonics3 } from 't3d'; import { SkyBox } from './objects/SkyBox.js'; import { ReflectionProbe } from './probes/ReflectionProbe.js'; class SHGenerator { static fromCubeTexture(renderer, envMap, out = new SphericalHarmonics3()) { const imageWidth = 256; const capabilities = renderer.capabilities; const isWebGL2 = capabilities.version > 1; if (isWebGL2) { capabilities.getExtension('EXT_color_buffer_float'); } else { capabilities.getExtension('OES_texture_half_float'); capabilities.getExtension('OES_texture_half_float_linear'); } capabilities.getExtension('OES_texture_float_linear'); capabilities.getExtension('EXT_color_buffer_half_float'); const textureType = PIXEL_TYPE.UNSIGNED_BYTE, ArrayCtor = Uint8Array, format = PIXEL_FORMAT.RGBA; const cubeRenderTarget = OffscreenRenderTarget.createCube(256, 256); cubeRenderTarget.texture.type = textureType; cubeRenderTarget.texture.format = format; const dummyScene = new Scene(); const skyEnv = new SkyBox(envMap); const reflectionProbe = new ReflectionProbe(cubeRenderTarget); dummyScene.add(skyEnv); dummyScene.add(reflectionProbe.camera); let totalWeight = 0; const coord = new Vector3(); const dir = new Vector3(); const color = new Color3(); const shBasis = [0, 0, 0, 0, 0, 0, 0, 0, 0]; const sh = out; const shCoefficients = sh.coefficients; reflectionProbe.render(renderer, dummyScene); for (let faceIndex = 0; faceIndex < 6; faceIndex++) { const data = new ArrayCtor(cubeRenderTarget.width * cubeRenderTarget.height * 4); renderer.readTexturePixelsSync( cubeRenderTarget.texture, 0, 0, cubeRenderTarget.width, cubeRenderTarget.height, data, faceIndex); const pixelSize = 2 / imageWidth; for (let i = 0, il = data.length; i < il; i += 4) { // RGBA assumed // pixel color color.setRGB(data[i] / 255, data[i + 1] / 255, data[i + 2] / 255); // convert to linear color space convertColorToLinear(color, cubeRenderTarget.texture.encoding); // pixel coordinate on unit cube const pixelIndex = i / 4; const col = -1 + (pixelIndex % imageWidth + 0.5) * pixelSize; const row = 1 - (Math.floor(pixelIndex / imageWidth) + 0.5) * pixelSize; switch (faceIndex) { case 0: coord.set(1, row, -col); break; case 1: coord.set(-1, row, col); break; case 2: coord.set(col, 1, -row); break; case 3: coord.set(col, -1, row); break; case 4: coord.set(col, row, 1); break; case 5: coord.set(-col, row, -1); break; } // weight assigned to this pixel const lengthSq = coord.getLengthSquared(); const weight = 4 / (Math.sqrt(lengthSq) * lengthSq); totalWeight += weight; // direction vector to this pixel dir.copy(coord).normalize(); // evaluate SH basis functions in direction dir SphericalHarmonics3.getBasisAt(dir, shBasis); // accummuulate for (let j = 0; j < 9; j++) { shCoefficients[j].x += shBasis[j] * color.r * weight; shCoefficients[j].y += shBasis[j] * color.g * weight; shCoefficients[j].z += shBasis[j] * color.b * weight; } } } cubeRenderTarget.dispose(); // normalize const norm = (4 * Math.PI) / totalWeight; for (let j = 0; j < 9; j++) { shCoefficients[j].x *= norm; shCoefficients[j].y *= norm; shCoefficients[j].z *= norm; } return out; } static fromColors(color1, color2, out = new SphericalHarmonics3()) { const sky = new Vector3(color1.r, color1.g, color1.b); const ground = new Vector3(color2.r, color2.g, color2.b); // without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI ); const c0 = Math.sqrt(Math.PI); const c1 = c0 * Math.sqrt(0.75); out.coefficients[0].copy(sky).add(ground).multiplyScalar(c0); out.coefficients[1].copy(sky).sub(ground).multiplyScalar(c1); return out; } static fromColor(color, out = new SphericalHarmonics3()) { // without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI ); out.coefficients[0].set(color.r, color.g, color.b).multiplyScalar(2 * Math.sqrt(Math.PI)); return out; } } function convertColorToLinear(color, encoding) { if (encoding !== 'linear') { color.convertSRGBToLinear(); } return color; } export { SHGenerator }; ================================================ FILE: examples/jsm/SceneUtils.js ================================================ import { Box3, Matrix4, Vector3 } from 't3d'; class SceneUtils { static getRelativeMatrixFromRoot(node, root, target = new Matrix4()) { target.identity(); let tempNode = node; while (tempNode !== root && tempNode !== null) { if (tempNode.matrixAutoUpdate || tempNode.matrixNeedsUpdate) { tempNode.matrix.compose(tempNode.position, tempNode.quaternion, tempNode.scale); tempNode.matrixNeedsUpdate = false; tempNode.worldMatrixNeedsUpdate = true; } target.premultiply(tempNode.matrix); tempNode = tempNode.parent; } return target; } static expandBox3ByObject(object, root, target, precise) { const geometry = object.geometry; if (geometry) { const matrix = root ? this.getRelativeMatrixFromRoot(object, root, _mat4_1) : object.worldMatrix; const box = precise ? this.computeMeshAccurateBoundings(object, _box3_1) : _box3_1.copy(geometry.boundingBox); box.applyMatrix4(matrix); target.expandByBox3(box); } const children = object.children; for (let i = 0, l = children.length; i < l; i++) { this.expandBox3ByObject(children[i], root, target, precise); } return target; } static setBox3FromObject(object, root, target = new Box3(), precise = false) { target.makeEmpty(); return this.expandBox3ByObject(object, root, target, precise); } static computeMeshAccurateBoundings(mesh, target) { target.makeEmpty(); const positionAttribute = mesh.geometry.attributes.a_Position; for (let i = 0; i < positionAttribute.buffer.count; i++) { mesh.getVertexPosition(i, _vec3_1); target.expandByPoint(_vec3_1); } return target; } } const _box3_1 = new Box3(); const _mat4_1 = new Matrix4(); const _vec3_1 = new Vector3(); export { SceneUtils }; ================================================ FILE: examples/jsm/SkeletonUtils.js ================================================ import { KeyframeClip } from 't3d'; /** * SkeletonUtils */ const SkeletonUtils = { clone: function(source, clips, outputClips) { const sourceLookup = new Map(); const cloneLookup = new Map(); const clone = source.clone(); parallelTraverse(source, clone, function(sourceNode, clonedNode) { sourceLookup.set(clonedNode, sourceNode); cloneLookup.set(sourceNode, clonedNode); }); clone.traverse(function(node) { if (!node.skeleton) return; const clonedMesh = node; const sourceMesh = sourceLookup.get(node); const sourceBones = sourceMesh.skeleton.bones; clonedMesh.skeleton = sourceMesh.skeleton.clone(); clonedMesh.bindMatrix.copy(sourceMesh.bindMatrix); clonedMesh.skeleton.bones = sourceBones.map(function(bone) { return cloneLookup.get(bone); }); // clonedMesh.bind(clonedMesh.skeleton, clonedMesh.bindMatrix); }); // console.time('clone'); if (clips && clips.length > 0) { clips.forEach(function(clip) { const tracks = clip.tracks.map(function(track) { return new track.constructor( cloneLookup.get(track.target), track.propertyPath, track.times, track.values, track.interpolant ); }); const newClip = new KeyframeClip(clip.name, tracks, clip.duration); outputClips.push(newClip); }); } // console.timeEnd('clone'); return clone; } }; function parallelTraverse(a, b, callback) { callback(a, b); for (let i = 0; i < a.children.length; i++) { parallelTraverse(a.children[i], b.children[i], callback); } } export { SkeletonUtils }; ================================================ FILE: examples/jsm/SuperSampling.js ================================================ /** * Super Sampling */ import { Matrix4, OffscreenRenderTarget, ShaderPostPass, TEXTURE_FILTER } from 't3d'; import { TAAShader } from './shaders/TAAShader.js'; class SuperSampling { constructor(width, height, samplingSize = 30) { this._samplingSize = samplingSize; const haltonSequence = [[0.5, 0.5]]; // first center for (let i = 0; i < this._samplingSize - 1; i++) { haltonSequence.push([ halton(i, 2), halton(i, 3) ]); } this._haltonSequence = haltonSequence; const prevFrame = OffscreenRenderTarget.create2D(width, height); prevFrame.texture.minFilter = TEXTURE_FILTER.LINEAR; prevFrame.texture.magFilter = TEXTURE_FILTER.LINEAR; prevFrame.texture.generateMipmaps = false; this._prevFrame = prevFrame; const output = OffscreenRenderTarget.create2D(width, height); output.texture.minFilter = TEXTURE_FILTER.LINEAR; output.texture.magFilter = TEXTURE_FILTER.LINEAR; output.texture.generateMipmaps = false; this._output = output; this._taaPass = new ShaderPostPass(TAAShader); this._taaPass.material.depthWrite = false; this._taaPass.material.depthTest = false; this._frame = 0; } resize(width, height) { this._prevFrame.resize(width, height); this._output.resize(width, height); } start() { this._frame = 0; } finished() { return this._frame >= this._samplingSize; } frame() { return this._frame; } /** * Jitter camera projectionMatrix * @param {Camera} camera * @param {number} width screen width * @param {number} height screen height */ jitterProjection(camera, width, height) { const offset = this._haltonSequence[this._frame]; if (!offset) { console.error('SuperSampling: try to jitter camera after finished!', this._frame, this._haltonSequence.length); } translationMat.elements[12] = (offset[0] * 2.0 - 1.0) / width; translationMat.elements[13] = (offset[1] * 2.0 - 1.0) / height; camera.projectionMatrix.premultiply(translationMat); } /** * @param {ThinRenderer} renderer * @param {TextureBase} texture input texture * @param {TextureBase} velocityTexture velocity texture * @param {TextureBase} depthTexture depth texture * @param {boolean} [still=true] * @returns {TextureBase} output texture */ sample(renderer, texture, velocityTexture, depthTexture, still) { velocityTexture = (velocityTexture !== undefined) ? velocityTexture : null; still = (still !== undefined) ? still : true; const first = this._frame === 0; this._taaPass.uniforms['currTex'] = texture; this._taaPass.uniforms['prevTex'] = this._prevFrame.texture; this._taaPass.uniforms['velocityTex'] = velocityTexture; this._taaPass.uniforms['depthTex'] = depthTexture; this._taaPass.uniforms['texelSize'][0] = 1 / this._prevFrame.width; this._taaPass.uniforms['texelSize'][1] = 1 / this._prevFrame.height; this._taaPass.uniforms['still'] = !!still; this._taaPass.uniforms['stillBlending'] = first ? 0 : 0.9; this._taaPass.uniforms['motionBlending'] = first ? 0 : 0.2; this._taaPass.render(renderer, this._output); const temp = this._prevFrame; this._prevFrame = this._output; this._output = temp; this._frame++; return this._prevFrame.texture; } /** * @returns {TextureBase} output texture */ output() { return this._prevFrame.texture; } } const translationMat = new Matrix4(); // https://en.wikipedia.org/wiki/Halton_sequence halton sequence. function halton(index, base) { let result = 0; let f = 1 / base; let i = index; while (i > 0) { result = result + f * (i % base); i = Math.floor(i / base); f = f / base; } return result; } export { SuperSampling }; ================================================ FILE: examples/jsm/VoxMeshBuilder.js ================================================ /** * VOXMeshBuilder */ import { Attribute, Buffer, Color3, Geometry, Matrix3, Matrix4, Mesh, PhongMaterial, VERTEX_COLOR, Vector2, Vector3 } from 't3d'; /** * VOXMeshBuilder * Reference https://github.com/daishihmr/vox.js */ class VOXMeshBuilder { /** * @param {VoxelData} voxelData * @param {object=} param * @param {number=} param.voxelSize default = 1.0. * @param {boolean=} param.vertexColor default = false. * @param {boolean=} param.optimizeFaces dafalue = true. * @param {boolean=} param.originToBottom dafalue = true. */ constructor(voxelData, param) { if (!VOXMeshBuilder.textureFactory) { // eslint-disable-next-line if (!vox || !vox.TextureFactory) { console.error('VOXMeshBuilder relies on vox.js'); } // eslint-disable-next-line VOXMeshBuilder.textureFactory = new vox.TextureFactory(); } param = param || {}; this.voxelData = voxelData; this.voxelSize = param.voxelSize || VOXMeshBuilder.DEFAULT_PARAM.voxelSize; this.vertexColor = (param.vertexColor === undefined) ? VOXMeshBuilder.DEFAULT_PARAM.vertexColor : param.vertexColor; this.optimizeFaces = (param.optimizeFaces === undefined) ? VOXMeshBuilder.DEFAULT_PARAM.optimizeFaces : param.optimizeFaces; this.originToBottom = (param.originToBottom === undefined) ? VOXMeshBuilder.DEFAULT_PARAM.originToBottom : param.originToBottom; this.geometry = null; this.material = null; this._build(); } _build() { this.geometry = new Geometry(); this.material = new PhongMaterial(); const geometry = new VOXGeometry(); this.hashTable = createHashTable(this.voxelData.voxels); const offsetX = (this.voxelData.size.x - 1) * -0.5; const offsetY = (this.voxelData.size.y - 1) * -0.5; const offsetZ = (this.originToBottom) ? 0 : (this.voxelData.size.z - 1) * -0.5; const matrix = new Matrix4(); this.voxelData.voxels.forEach(voxel => { const voxGeometry = this._createVoxGeometry(voxel); if (voxGeometry) { matrix.makeTranslation((voxel.x + offsetX) * this.voxelSize, (voxel.z + offsetZ) * this.voxelSize, -(voxel.y + offsetY) * this.voxelSize); geometry.merge(voxGeometry, matrix); } }); if (this.optimizeFaces) { geometry.mergeVertices(); } geometry.computeFaceNormals(); this.geometry = geometry.createGeometry(); if (this.vertexColor) { this.material.vertexColors = VERTEX_COLOR.RGBA; } else { this.material.diffuseMap = VOXMeshBuilder.textureFactory.getTexture(this.voxelData); } } _createVoxGeometry(voxel) { // find neighboring voxels and ignore coincident faces const ignoreFaces = []; if (this.optimizeFaces) { six.forEach(s => { if (this.hashTable.has(voxel.x + s.x, voxel.y + s.y, voxel.z + s.z)) { ignoreFaces.push(s.ignoreFace); } }); } // returns null if adjacent in all 6 directions if (ignoreFaces.length === 6) return null; // vertex data const voxVertices = voxVerticesSource.map(voxel => { return new Vector3(voxel.x * this.voxelSize * 0.5, voxel.y * this.voxelSize * 0.5, voxel.z * this.voxelSize * 0.5); }); // face data const voxFaces = voxFacesSource.map(f => { return { faceA: new VOXFace3(f.faceA.a, f.faceA.b, f.faceA.c), faceB: new VOXFace3(f.faceB.a, f.faceB.b, f.faceB.c) }; }); // vertex color let color; if (this.vertexColor) { const c = this.voxelData.palette[voxel.colorIndex]; color = new Color3(c.r / 255, c.g / 255, c.b / 255); } const vox = new VOXGeometry(); vox.faceVertexUvs[0] = []; // push faces voxFaces.forEach((faces, i) => { if (ignoreFaces.indexOf(i) >= 0) return; if (this.vertexColor) { faces.faceA.color = color; faces.faceB.color = color; } else { const uv = new Vector2((voxel.colorIndex + 0.5) / 256, 0.5); vox.faceVertexUvs[0].push([uv, uv, uv], [uv, uv, uv]); } vox.faces.push(faces.faceA, faces.faceB); }); // extract used vertices const usingVertices = {}; vox.faces.forEach(function(face) { usingVertices[face.a] = true; usingVertices[face.b] = true; usingVertices[face.c] = true; }); // processing to fill up the vertex index of the face function splice(index) { vox.faces.forEach(face => { if (face.a > index) face.a -= 1; if (face.b > index) face.b -= 1; if (face.c > index) face.c -= 1; }); } // add only used vertices let j = 0; voxVertices.forEach((vertex, i) => { if (usingVertices[i]) { vox.vertices.push(vertex); } else { splice(i - j); j += 1; } }); return vox; } /** * @returns {Texture2D} */ getTexture() { return VOXMeshBuilder.textureFactory.getTexture(this.voxelData); } /** * @returns {Mesh} */ createMesh() { return new Mesh(this.geometry, this.material); } /** * is it an outward facing voxel? * @param {object} voxel * @returns {boolean} */ isOuterVoxel(voxel) { return six.filter(s => { return this.hashTable.has(voxel.x + s.x, voxel.y + s.y, voxel.z + s.z); }).length < 6; } } VOXMeshBuilder.DEFAULT_PARAM = { voxelSize: 1.0, vertexColor: false, optimizeFaces: true, originToBottom: true }; VOXMeshBuilder.textureFactory = undefined; // correspondence table between adjacent directions and ignored surfaces const six = [ { x: -1, y: 0, z: 0, ignoreFace: 0 }, { x: 1, y: 0, z: 0, ignoreFace: 1 }, { x: 0, y: -1, z: 0, ignoreFace: 5 }, { x: 0, y: 1, z: 0, ignoreFace: 4 }, { x: 0, y: 0, z: -1, ignoreFace: 2 }, { x: 0, y: 0, z: 1, ignoreFace: 3 } ]; // vertex data source const voxVerticesSource = [ { x: -1, y: 1, z: -1 }, { x: 1, y: 1, z: -1 }, { x: -1, y: 1, z: 1 }, { x: 1, y: 1, z: 1 }, { x: -1, y: -1, z: -1 }, { x: 1, y: -1, z: -1 }, { x: -1, y: -1, z: 1 }, { x: 1, y: -1, z: 1 } ]; // face data source const voxFacesSource = [ { faceA: { a: 6, b: 2, c: 0 }, faceB: { a: 6, b: 0, c: 4 } }, { faceA: { a: 5, b: 1, c: 3 }, faceB: { a: 5, b: 3, c: 7 } }, { faceA: { a: 5, b: 7, c: 6 }, faceB: { a: 5, b: 6, c: 4 } }, { faceA: { a: 2, b: 3, c: 1 }, faceB: { a: 2, b: 1, c: 0 } }, { faceA: { a: 4, b: 0, c: 1 }, faceB: { a: 4, b: 1, c: 5 } }, { faceA: { a: 7, b: 3, c: 2 }, faceB: { a: 7, b: 2, c: 6 } } ]; function hash(x, y, z) { return 'x' + x + 'y' + y + 'z' + z; } function createHashTable(voxels) { const hashTable = {}; voxels.forEach(function(v) { hashTable[hash(v.x, v.y, v.z)] = true; }); hashTable.has = function(x, y, z) { return hash(x, y, z) in this; }; return hashTable; } class VOXFace3 { constructor(a, b, c, normal = new Vector3(), color = new Color3(), materialIndex = 0) { this.a = a; this.b = b; this.c = c; this.normal = normal; this.color = color; this.materialIndex = materialIndex; } copy(source) { this.a = source.a; this.b = source.b; this.c = source.c; this.normal.copy(source.normal); this.color.copy(source.color); this.materialIndex = source.materialIndex; return this; } clone() { return new VOXFace3().copy(this); } } class VOXGeometry { constructor() { this.vertices = []; this.faces = []; this.faceVertexUvs = [[]]; } computeFaceNormals() { const cb = new Vector3(), ab = new Vector3(); for (let f = 0, fl = this.faces.length; f < fl; f++) { const face = this.faces[f]; const vA = this.vertices[face.a]; const vB = this.vertices[face.b]; const vC = this.vertices[face.c]; cb.subVectors(vC, vB); ab.subVectors(vA, vB); cb.cross(ab); cb.normalize(); face.normal.copy(cb); } } merge(geometry, matrix, materialIndexOffset) { let normalMatrix; const vertexOffset = this.vertices.length, vertices1 = this.vertices, vertices2 = geometry.vertices, faces1 = this.faces, faces2 = geometry.faces, uvs1 = this.faceVertexUvs[0], uvs2 = geometry.faceVertexUvs[0]; if (materialIndexOffset === undefined) materialIndexOffset = 0; if (matrix !== undefined) { normalMatrix = new Matrix3().setFromMatrix4(matrix).invert().transpose(); } // vertices for (let i = 0, il = vertices2.length; i < il; i++) { const vertex = vertices2[i]; const vertexCopy = vertex.clone(); if (matrix !== undefined) vertexCopy.applyMatrix4(matrix); vertices1.push(vertexCopy); } // faces for (let i = 0, il = faces2.length; i < il; i++) { const face = faces2[i]; const faceCopy = new VOXFace3(face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset); faceCopy.normal.copy(face.normal); if (normalMatrix !== undefined) { faceCopy.normal.applyMatrix3(normalMatrix).normalize(); } faceCopy.color.copy(face.color); faceCopy.materialIndex = face.materialIndex + materialIndexOffset; faces1.push(faceCopy); } // uvs for (let i = 0, il = uvs2.length; i < il; i++) { const uv = uvs2[i], uvCopy = []; if (uv === undefined) { continue; } for (let j = 0, jl = uv.length; j < jl; j++) { uvCopy.push(uv[j].clone()); } uvs1.push(uvCopy); } } mergeVertices() { const verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) const unique = [], changes = []; let v, key; const precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 const precision = Math.pow(10, precisionPoints); let i, il, face; let indices, j, jl; for (i = 0, il = this.vertices.length; i < il; i++) { v = this.vertices[i]; key = Math.round(v.x * precision) + '_' + Math.round(v.y * precision) + '_' + Math.round(v.z * precision); if (verticesMap[key] === undefined) { verticesMap[key] = i; unique.push(this.vertices[i]); changes[i] = unique.length - 1; } else { // console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); changes[i] = changes[verticesMap[key]]; } } // if faces are completely degenerate after merging vertices, we // have to remove them from the geometry. const faceIndicesToRemove = []; for (i = 0, il = this.faces.length; i < il; i++) { face = this.faces[i]; face.a = changes[face.a]; face.b = changes[face.b]; face.c = changes[face.c]; indices = [face.a, face.b, face.c]; // if any duplicate vertices are found in a Face3 // we have to remove the face as nothing can be saved for (let n = 0; n < 3; n++) { if (indices[n] === indices[(n + 1) % 3]) { faceIndicesToRemove.push(i); break; } } } for (i = faceIndicesToRemove.length - 1; i >= 0; i--) { const idx = faceIndicesToRemove[i]; this.faces.splice(idx, 1); for (j = 0, jl = this.faceVertexUvs.length; j < jl; j++) { this.faceVertexUvs[j].splice(idx, 1); } } // Use unique set of vertices const diff = this.vertices.length - unique.length; this.vertices = unique; return diff; } createGeometry() { const geometry = new Geometry(); const verticesArray = []; function pushFaceData(posArray, normalArray, colorArray, uvArray) { for (let i = 0; i < 3; i++) { verticesArray.push(posArray[i].x, posArray[i].y, posArray[i].z); verticesArray.push(normalArray[i].x, normalArray[i].y, normalArray[i].z); verticesArray.push(colorArray[i].r, colorArray[i].g, colorArray[i].b, 1); if (uvArray) { verticesArray.push(uvArray[i].x, uvArray[i].y); } else { verticesArray.push(0, 0); } } } const faces = this.faces; const vertices = this.vertices; const faceVertexUvs = this.faceVertexUvs; const hasFaceVertexUv = faceVertexUvs[0] && faceVertexUvs[0].length > 0; for (let i = 0; i < faces.length; i++) { const face = faces[i]; const normal = face.normal; const color = face.color; const posArray = [vertices[face.a], vertices[face.b], vertices[face.c]]; const normalArray = [normal, normal, normal]; const colorArray = [color, color, color]; let uvArray; if (hasFaceVertexUv === true) { const vertexUvs = faceVertexUvs[0][i]; if (vertexUvs !== undefined) { uvArray = [vertexUvs[0], vertexUvs[1], vertexUvs[2]]; } else { console.warn('createGeometry(): Undefined vertexUv ', i); uvArray = [new Vector2(), new Vector2(), new Vector2()]; } } pushFaceData(posArray, normalArray, colorArray, uvArray); } const buffer = new Buffer(new Float32Array(verticesArray), 12); let attribute; attribute = new Attribute(buffer, 3, 0); geometry.addAttribute('a_Position', attribute); attribute = new Attribute(buffer, 3, 3); geometry.addAttribute('a_Normal', attribute); attribute = new Attribute(buffer, 4, 6); geometry.addAttribute('a_Color', attribute); attribute = new Attribute(buffer, 2, 10); geometry.addAttribute('a_Uv', attribute); geometry.computeBoundingBox(); geometry.computeBoundingSphere(); return geometry; } } export { VOXMeshBuilder }; ================================================ FILE: examples/jsm/WaterSimulation.js ================================================ import { OffscreenRenderTarget, ShaderPostPass, PIXEL_TYPE, TEXTURE_FILTER } from 't3d'; // refer: madebyevan.com/webgl-water class WaterSimulation { constructor(width = 256, height = 256) { const rt1 = OffscreenRenderTarget.create2D(width, height); rt1.texture.type = PIXEL_TYPE.HALF_FLOAT; rt1.texture.minFilter = rt1.texture.magFilter = TEXTURE_FILTER.LINEAR; rt1.texture.generateMipmaps = false; rt1.setClear(false, false, false); const rt2 = OffscreenRenderTarget.create2D(width, height); rt2.texture.type = PIXEL_TYPE.HALF_FLOAT; rt2.texture.minFilter = rt2.texture.magFilter = TEXTURE_FILTER.LINEAR; rt2.texture.generateMipmaps = false; rt2.setClear(false, false, false); this._currentRTT = rt1; this._nextRTT = rt2; this._dropPass = new ShaderPostPass(dropShader); this._normalPass = new ShaderPostPass(normalShader); this._updatePass = new ShaderPostPass(updateShader); } _swapRTT() { const temp = this._currentRTT; this._currentRTT = this._nextRTT; this._nextRTT = temp; } addDrop(renderer, x, y, radius, strength) { this._dropPass.uniforms.center[0] = x; this._dropPass.uniforms.center[1] = y; this._dropPass.uniforms.radius = radius; this._dropPass.uniforms.strength = strength; this._dropPass.uniforms.dropTexture = this._currentRTT.texture; this._dropPass.render(renderer, this._nextRTT); this._swapRTT(); } updateNormals(renderer) { this._normalPass.uniforms.normalTexture = this._currentRTT.texture; this._normalPass.uniforms.delta[0] = 1 / this._currentRTT.width; this._normalPass.uniforms.delta[1] = 1 / this._currentRTT.height; this._normalPass.render(renderer, this._nextRTT); this._swapRTT(); } stepSimulation(renderer) { this._updatePass.uniforms.flow = this._currentRTT.texture; this._updatePass.uniforms.delta[0] = 1 / this._currentRTT.width; this._updatePass.uniforms.delta[1] = 1 / this._currentRTT.height; this._updatePass.render(renderer, this._nextRTT); this._swapRTT(); } } const default_vert = ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_View; uniform mat4 u_Model; uniform mat4 u_Projection; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_Projection * u_View *u_Model * vec4(a_Position, 1.0); } `; const dropShader = { name: 'water_simu_drop', defines: {}, uniforms: { center: [0, 0], radius: 0, strength: 0, dropTexture: null }, vertexShader: default_vert, fragmentShader: ` uniform sampler2D dropTexture; uniform vec2 center; uniform float radius; uniform float strength; varying vec2 v_Uv; void main() { vec4 info = texture2D(dropTexture, v_Uv); float drop = max(0.0, 1.0 - length(center - v_Uv) / radius); drop = 0.5 - cos(drop * PI) * 0.5; info.r += drop * strength; gl_FragColor = info; } ` }; const normalShader = { name: 'water_simu_normal', defines: {}, uniforms: { delta: [1 / 256, 1 / 256], normalTexture: null }, vertexShader: default_vert, fragmentShader: ` uniform sampler2D normalTexture; uniform vec2 delta; varying vec2 v_Uv; void main() { vec4 info = texture2D(normalTexture, v_Uv); vec3 dx = vec3(delta.x, texture2D(normalTexture, vec2(v_Uv.x + delta.x, v_Uv.y)).r - info.r, 0.0); vec3 dy = vec3(0.0, texture2D(normalTexture, vec2(v_Uv.x, v_Uv.y + delta.y)).r - info.r, delta.y); info.ba = normalize(cross(dx, dy)).xz; gl_FragColor = info; } ` }; const updateShader = { name: 'water_simu_update', defines: {}, uniforms: { delta: [1 / 256, 1 / 256], flow: null }, vertexShader: default_vert, fragmentShader: ` uniform sampler2D flow; uniform vec2 delta; varying vec2 v_Uv; void main() { vec4 info = texture2D(flow, v_Uv); vec2 dx = vec2(delta.x, 0.0); vec2 dy = vec2(0.0, delta.y); float average = ( texture2D(flow, v_Uv - dx).r + texture2D(flow, v_Uv - dy).r + texture2D(flow, v_Uv + dx).r + texture2D(flow, v_Uv + dy).r ) * 0.25; info.g += (average - info.r) * 2.0; info.g *= 0.985; // 995 info.r += info.g; gl_FragColor = info; } ` }; export { WaterSimulation }; ================================================ FILE: examples/jsm/WorkerPool.js ================================================ /** * @author Deepkolos / https://github.com/deepkolos */ export class WorkerPool { constructor(pool = 4) { this.pool = pool; this.queue = []; this.workers = []; this.workersResolve = []; this.workerStatus = 0; } _initWorker(workerId) { if (!this.workers[workerId]) { const worker = this.workerCreator(); worker.addEventListener('message', this._onMessage.bind(this, workerId)); this.workers[workerId] = worker; } } _getIdleWorker() { for (let i = 0; i < this.pool; i++) { if (!(this.workerStatus & (1 << i))) return i; } return -1; } _onMessage(workerId, msg) { const resolve = this.workersResolve[workerId]; resolve && resolve(msg); if (this.queue.length) { const { resolve, msg, transfer } = this.queue.shift(); this.workersResolve[workerId] = resolve; this.workers[workerId].postMessage(msg, transfer); } else { this.workerStatus ^= 1 << workerId; } } setWorkerCreator(workerCreator) { this.workerCreator = workerCreator; } setWorkerLimit(pool) { this.pool = pool; } postMessage(msg, transfer) { return new Promise(resolve => { const workerId = this._getIdleWorker(); if (workerId !== -1) { this._initWorker(workerId); this.workerStatus |= 1 << workerId; this.workersResolve[workerId] = resolve; this.workers[workerId].postMessage(msg, transfer); } else { this.queue.push({ resolve, msg, transfer }); } }); } dispose() { this.workers.forEach(worker => worker.terminate()); this.workersResolve.length = 0; this.workers.length = 0; this.queue.length = 0; this.workerStatus = 0; } } ================================================ FILE: examples/jsm/animation/CCDIKSolver.js ================================================ import { Quaternion, Vector3 } from 't3d'; // CCD Algorithm // - https://sites.google.com/site/auraliusproject/ccd-algorithm // // ik parameter example // // target, effector, index in links are bone index in skeleton.bones. // the bones relation should be // <-- parent child --> // links[ n ], links[ n - 1 ], ..., links[ 0 ], effector // iks = [ { // target: 1, // effector: 2, // links: [ { index: 5, limitation: new Vector3( 1, 0, 0 ) }, { index: 4, enabled: false }, { index : 3 } ], // iteration: 10, // minAngle: 0.0, // maxAngle: 1.0, // } ]; class CCDIKSolver { /** * @param {Bone[]} bones * @param {object[]} iks */ constructor(bones, iks = []) { this.bones = bones; this.iks = iks; this.target = new Vector3(); this._valid(); } /** * Update all IK bones. * @returns {CCDIKSolver} */ update() { const iks = this.iks; for (let i = 0, il = iks.length; i < il; i++) { this.updateOne(iks[i]); } return this; } /** * Update one IK bone * @param {object} ik parameter * @returns {CCDIKSolver} */ updateOne(ik) { const bones = this.bones; // for reference overhead reduction in loop const math = Math; const effector = bones[ik.effector]; const links = ik.links; const iteration = ik.iteration !== undefined ? ik.iteration : 1; for (let i = 0; i < iteration; i++) { let rotated = false; for (let j = 0, jl = links.length; j < jl; j++) { const link = bones[links[j].index]; // skip this link and following links. // this skip is used for MMD performance optimization. if (links[j].enabled === false) break; const limitation = links[j].limitation; const rotationMin = links[j].rotationMin; const rotationMax = links[j].rotationMax; // don't use getWorldPosition/Quaternion() here for the performance // because they call updateMatrixWorld( true ) inside. link.worldMatrix.decompose(_linkPos, _invLinkQ, _linkScale); _invLinkQ.conjugate(); _effectorPos.setFromMatrixPosition(effector.worldMatrix); // work in link world _effectorVec.subVectors(_effectorPos, _linkPos); _effectorVec.applyQuaternion(_invLinkQ); _effectorVec.normalize(); _targetVec.subVectors(this.target, _linkPos); _targetVec.applyQuaternion(_invLinkQ); _targetVec.normalize(); let angle = _targetVec.dot(_effectorVec); if (angle > 1.0) { angle = 1.0; } else if (angle < -1.0) { angle = -1.0; } angle = math.acos(angle); // skip if changing angle is too small to prevent vibration of bone if (angle < 1e-5) continue; if (ik.minAngle !== undefined && angle < ik.minAngle) { angle = ik.minAngle; } if (ik.maxAngle !== undefined && angle > ik.maxAngle) { angle = ik.maxAngle; } _axis.crossVectors(_effectorVec, _targetVec); _axis.normalize(); _q.setFromAxisAngle(_axis, angle); link.quaternion.multiply(_q); // TODO: re-consider the limitation specification if (limitation !== undefined) { let c = link.quaternion.w; if (c > 1.0) { c = 1.0; } const c2 = math.sqrt(1 - c * c); link.quaternion.set(limitation.x * c2, limitation.y * c2, limitation.z * c2, c); } if (rotationMin !== undefined) { _vector.set(link.euler.x, link.euler.y, link.euler.z).max(rotationMin); link.euler.set(_vector.x, _vector.y, _vector.z); } if (rotationMax !== undefined) { _vector.set(link.euler.x, link.euler.y, link.euler.z).min(rotationMax); link.euler.set(_vector.x, _vector.y, _vector.z); } link.updateMatrix(true); rotated = true; } if (!rotated) break; } return this; } // private methods _valid() { const bones = this.bones; const iks = this.iks; for (let i = 0, il = iks.length; i < il; i++) { const ik = iks[i]; const effector = bones[ik.effector]; const links = ik.links; let link0, link1; link0 = effector; for (let j = 0, jl = links.length; j < jl; j++) { link1 = bones[links[j].index]; if (link0.parent !== link1) { console.warn('CCDIKSolver: bone ' + link0.name + ' is not the child of bone ' + link1.name); } link0 = link1; } } } } const _q = new Quaternion(); const _targetVec = new Vector3(); const _effectorPos = new Vector3(); const _effectorVec = new Vector3(); const _linkPos = new Vector3(); const _invLinkQ = new Quaternion(); const _linkScale = new Vector3(); const _axis = new Vector3(); const _vector = new Vector3(); export { CCDIKSolver }; ================================================ FILE: examples/jsm/animation/LockedTrack.js ================================================ import { Matrix4, Quaternion, Vector3 } from 't3d'; /** * LockedTrack class allows an object to track a target position * while keeping a specified axis locked in a certain direction. */ class LockedTrack { /** * Creates an instance of LockedTrack. * @param {Object3D} object - The object to be tracked. */ constructor(object) { /** * The object to track. * @type {Object3D} */ this.object = object; /** * Target position to track. * @type {Vector3} */ this.target = new Vector3(); /** * Axis that points to the target. * @type {Vector3} */ this.trackAxis = new Vector3(0, 0, 1); /** * Axis that points upward. * @type {Vector3} */ this.lockedAxis = new Vector3(0, 1, 0); } /** * Update the object's rotation to track the target position. */ update() { const object = this.object; const target = this.target; _inverseMatrix.copy(object.worldMatrix).invert().premultiply(object.matrix); _localTarget.copy(target).applyMatrix4(_inverseMatrix); _localDirection.copy(_localTarget).normalize(); _z_axis.set(0, 0, 1); _correctionQuat.setFromUnitVectors(_z_axis, this.trackAxis); _forward.copy(_localDirection).applyQuaternion(_correctionQuat.conjugate()); _up.copy(this.lockedAxis); _side.crossVectors(_up, _forward).normalize(); if (_side.getLengthSquared() < 0.0001) { _side.crossVectors(this.trackAxis, _forward).normalize(); } _forward.crossVectors(_side, _up).normalize(); _lookAtMatrix.makeBasis(_side, _up, _forward); object.quaternion.setFromRotationMatrix(_lookAtMatrix); object.updateMatrix(true); } } const _inverseMatrix = new Matrix4(); const _localTarget = new Vector3(); const _localDirection = new Vector3(); const _correctionQuat = new Quaternion(); const _z_axis = new Vector3(0, 0, 1); const _forward = new Vector3(); const _up = new Vector3(); const _side = new Vector3(); const _lookAtMatrix = new Matrix4(); export { LockedTrack }; ================================================ FILE: examples/jsm/canvas2d/Canvas2D.js ================================================ import { Attribute, BUFFER_USAGE, Buffer, Camera, Geometry, Mesh, ShaderMaterial, Vector2, Vector4 } from 't3d'; class Canvas2D extends Mesh { constructor(width = 640, height = 800, isScreenCanvas = true, screenMatchMode = SCREEN_MATCH_MODE.CONSTANT) { const geometry = new Geometry(); const buffer = new Buffer(new Float32Array(), 5); buffer.usage = BUFFER_USAGE.DYNAMIC_DRAW; geometry.addAttribute('a_Position', new Attribute(buffer, 3, 0)); geometry.addAttribute('a_Uv', new Attribute(buffer, 2, 3)); geometry.setIndex(new Attribute(new Buffer(new Uint16Array([]), 1))); super(geometry, []); this.buffer = buffer; const sharedMaterial = new ShaderMaterial(canvas2dShader); sharedMaterial.depthWrite = false; sharedMaterial.transparent = true; this.sharedMaterial = sharedMaterial; this.sprites = []; this.materialInfoArray = []; // screen space canvas or world space canvas this.isScreenCanvas = isScreenCanvas; // the size in world space this._size = new Vector2(width, height); // the resolution size of screen canvas this._resolutionSize = new Vector2(width, height); // screen match mode this._screenMatchMode = screenMatchMode; // set the same size with the renderer viewport this._renderViewport = new Vector4(0, 0, width, height); // if screen match mode is SCREEN_MATCH_MODE.CONSTANT, use this this._scaleFactor = 1; // real viewport after calculate with screen match mode this.viewport = new Vector4(); // screen canvas used ortho camera this.orthoCamera = new Camera(); this.orthoCamera.setOrtho(-width / 2, width / 2, -height / 2, height / 2, 0, 1); this.orthoCamera.viewMatrix.copy(this.orthoCamera.worldMatrix).invert(); // update view matrix this._vertices = []; this._indices = []; this._2dChildren = []; this.frustumCulled = false; // higher render order than other this.renderOrder = 10000; } setSize(width, height) { if (this.isScreenCanvas) { this._resolutionSize.set(width, height); this._screenMatchMode.call(this); this._updateCamera(); } else { this._size.set(width, height); } } setRenderViewport(x, y, w, h) { if (this._renderViewport.x !== x || this._renderViewport.y !== y || this._renderViewport.z !== w || this._renderViewport.w !== h) { this._renderViewport.set(x, y, w, h); this._screenMatchMode.call(this); this._updateCamera(); } } setScaleFactor(value) { if (this._scaleFactor !== value) { this._scaleFactor = value; this._screenMatchMode.call(this); this._updateCamera(); } } setScreenMatchMode(mode) { if (this._screenMatchMode !== mode) { this._screenMatchMode = mode; this._screenMatchMode.call(this); this._updateCamera(); } } _updateCamera() { if (this.isScreenCanvas) { this.orthoCamera.setOrtho(-this._resolutionSize.x / 2, this._resolutionSize.x / 2, -this._resolutionSize.y / 2, this._resolutionSize.y / 2, 0, 1); this.orthoCamera.viewMatrix.copy(this.orthoCamera.worldMatrix).invert(); // update view matrix } } /** * add child to canvas2d * @param {Object2D} object */ add(object) { this._2dChildren.push(object); } /** * remove child from canvas2d * @param {Object2D} object */ remove(object) { const index = this._2dChildren.indexOf(object); if (index !== -1) { this._2dChildren.splice(index, 1); } } updateSprites() { // update attributes and indices const vertices = this._vertices, indices = this._indices; let vertexIndex = 0, indexIndex = 0; const sprites = this.sprites; const width = this.isScreenCanvas ? this._resolutionSize.x : this._size.x; const height = this.isScreenCanvas ? this._resolutionSize.y : this._size.y; for (let i = 0; i < sprites.length; i++) { const sprite = sprites[i]; const x = 0; const y = 0; const w = sprite.width; const h = sprite.height; let _x, _y; const t = sprite.worldMatrix.elements; const a = t[0], b = t[1], c = t[3], d = t[4], tx = t[6] - width / 2, ty = height / 2 - t[7] - h; _x = x; _y = y; vertices[vertexIndex++] = a * _x + c * _y + tx; vertices[vertexIndex++] = b * _x + d * _y + ty; vertices[vertexIndex++] = 0; vertices[vertexIndex++] = 0; vertices[vertexIndex++] = 1; _x = x + w; // _y = y; vertices[vertexIndex++] = a * _x + c * _y + tx; vertices[vertexIndex++] = b * _x + d * _y + ty; vertices[vertexIndex++] = 0; vertices[vertexIndex++] = 1; vertices[vertexIndex++] = 1; // _x = x + w; _y = y + h; vertices[vertexIndex++] = a * _x + c * _y + tx; vertices[vertexIndex++] = b * _x + d * _y + ty; vertices[vertexIndex++] = 0; vertices[vertexIndex++] = 1; vertices[vertexIndex++] = 0; _x = x; // _y = y + h; vertices[vertexIndex++] = a * _x + c * _y + tx; vertices[vertexIndex++] = b * _x + d * _y + ty; vertices[vertexIndex++] = 0; vertices[vertexIndex++] = 0; vertices[vertexIndex++] = 0; const vertCount = vertexIndex / 5 - 4; indices[indexIndex++] = vertCount + 0; indices[indexIndex++] = vertCount + 1; indices[indexIndex++] = vertCount + 2; indices[indexIndex++] = vertCount + 2; indices[indexIndex++] = vertCount + 3; indices[indexIndex++] = vertCount + 0; } vertices.length = vertexIndex; indices.length = indexIndex; const geometry = this.geometry; this.buffer.array = new Float32Array(vertices); this.buffer.count = this.buffer.array.length / this.buffer.stride; geometry.index.buffer.array = new Uint16Array(indices); geometry.index.buffer.count = geometry.index.buffer.array.length; this.buffer.version++; geometry.index.version++; // push groups let currentTexture, currentCount = 0, currentOffset = 0; for (let i = 0; i < sprites.length; i++) { const sprite = sprites[i]; if (currentTexture !== sprite.texture) { if (geometry.groups[currentCount]) { geometry.groups.start = currentOffset; geometry.groups.count = 6; geometry.groups.materialIndex = currentCount; } else { geometry.groups.push({ start: currentOffset, count: 6, materialIndex: currentCount }); } this.material[currentCount] = this.sharedMaterial; this.materialInfoArray[currentCount] = sprite.texture; currentCount++; currentOffset += 6; currentTexture = sprite.texture; } else { geometry.groups[currentCount - 1].count += 6; } } geometry.groups.length = currentCount; this.materialInfoArray.length = currentCount; } // override updateMatrix(force) { Mesh.prototype.updateMatrix.call(this, force); this.sprites = []; const children = this._2dChildren; for (let i = 0, l = children.length; i < l; i++) { this.cacheSprites(children[i]); } const sprites = this.sprites; for (let i = 0, l = sprites.length; i < l; i++) { sprites[i].updateMatrix(); } // update geometry this.updateSprites(); } cacheSprites(object) { const sprites = this.sprites; sprites.push(object); for (let i = 0, l = object.children.length; i < l; i++) { this.cacheSprites(object.children[i]); } } } const canvas2dShader = { name: 'canvas2d_common', uniforms: { 'spriteTexture': null }, vertexShader: ` #include attribute vec2 a_Uv; varying vec2 v_Uv; void main() { #include #include v_Uv = a_Uv; } `, fragmentShader: ` #include varying vec2 v_Uv; uniform sampler2D spriteTexture; void main() { #include outColor *= texture2D(spriteTexture, v_Uv); #include #include } ` }; function constant() { const renderViewport = this._renderViewport; const curViewX = renderViewport.x; const curViewY = renderViewport.y; const curViewW = renderViewport.z; const curViewH = renderViewport.w; const scaleFactor = this._scaleFactor; const resultX = curViewX; const resultY = curViewY; const resultW = curViewW; const resultH = curViewH; this._resolutionSize.set(resultW / scaleFactor, resultH / scaleFactor); this.viewport.set(resultX, resultY, resultW, resultH); } function shrink() { const renderViewport = this._renderViewport; const curViewX = renderViewport.x; const curViewY = renderViewport.y; const curViewW = renderViewport.z; const curViewH = renderViewport.w; const resolutionSize = this._resolutionSize.copy(this._size); const screenRate = (curViewW - curViewX) / (curViewH - curViewY); const resolutionRate = resolutionSize.x / resolutionSize.y; const widthBigger = resolutionRate > screenRate; let resultW, resultH; if (widthBigger) { resultW = curViewW; resultH = Math.floor(resultW / resolutionRate); } else { resultH = curViewH; resultW = Math.floor(resultH * resolutionRate); } const resultX = Math.floor((curViewW - resultW) / 2) + curViewX; const resultY = Math.floor((curViewH - resultH) / 2) + curViewY; this.viewport.set(resultX, resultY, resultW, resultH); } function expand() { const renderViewport = this._renderViewport; const curViewX = renderViewport.x; const curViewY = renderViewport.y; const curViewW = renderViewport.z; const curViewH = renderViewport.w; const resolutionSize = this._resolutionSize.copy(this._size); const screenRate = (curViewW - curViewX) / (curViewH - curViewY); const resolutionRate = resolutionSize.x / resolutionSize.y; const widthBigger = resolutionRate > screenRate; let resultW, resultH; if (widthBigger) { resultH = curViewH; resultW = Math.floor(resultH * resolutionRate); } else { resultW = curViewW; resultH = Math.floor(resultW / resolutionRate); } const resultX = Math.floor((curViewW - resultW) / 2) + curViewX; const resultY = Math.floor((curViewH - resultH) / 2) + curViewY; this.viewport.set(resultX, resultY, resultW, resultH); } const SCREEN_MATCH_MODE = { CONSTANT: constant, SHRINK: shrink, EXPAND: expand }; Canvas2D.SCREEN_MATCH_MODE = SCREEN_MATCH_MODE; export { Canvas2D }; ================================================ FILE: examples/jsm/canvas2d/Object2D.js ================================================ import { Box2, Matrix3 } from 't3d'; class Object2D { constructor() { this.width = 0; this.height = 0; // bla bla ... this.x = 0; this.y = 0; this.rotation = 0; this.scaleX = 1; this.scaleY = 1; this.anchorX = 0; this.anchorY = 0; // a 3x3 transform matrix this.matrix = new Matrix3(); // used to cache world transform this.worldMatrix = new Matrix3(); // children this.children = new Array(); // parent this.parent = null; this.boundingBox = new Box2(); } /** * add child to object2d * @param {Object2D} object */ add(object) { this.children.push(object); object.parent = this; } /** * remove child from object2d * @param {Object2D} object */ remove(object) { const index = this.children.indexOf(object); if (index !== -1) { this.children.splice(index, 1); } object.parent = null; } /** * get object by name * @param {string} name * @returns {Object2D} */ getObjectByName(name) { return this.getObjectByProperty('name', name); } /** * get object by property * @param {string} name * @param {any} value * @returns {Object2D} */ getObjectByProperty(name, value) { if (this[name] === value) return this; for (let i = 0, l = this.children.length; i < l; i++) { const child = this.children[i]; const object = child.getObjectByProperty(name, value); if (object !== undefined) { return object; } } return undefined; } /** * update matrix */ updateMatrix() { const matrix = this.matrix.transform(this.x, this.y, this.scaleX, this.scaleY, this.rotation, this.anchorX * this.width, this.anchorY * this.height); this.worldMatrix.copy(matrix); if (this.parent) { const parentMatrix = this.parent.worldMatrix; this.worldMatrix.premultiply(parentMatrix); } const children = this.children; for (let i = 0, l = children.length; i < l; i++) { children[i].updateMatrix(); } } computeBoundingBox() { this.boundingBox.set(this.x, this.y, this.x + this.width, this.y + this.height); } } export { Object2D }; ================================================ FILE: examples/jsm/canvas2d/Sprite2D.js ================================================ import { Object2D } from '../canvas2d/Object2D.js'; class Sprite2D extends Object2D { constructor() { super(); this._texture = null; } } export { Sprite2D }; ================================================ FILE: examples/jsm/controls/FlyControls.js ================================================ import { Quaternion, Vector3 } from 't3d'; /** * reference: https://github.com/mrdoob/three.js/blob/dev/examples/jsm/controls/FlyControls.js */ class FlyControls { constructor(object, domElement = document) { this.object = object; this.domElement = domElement; // API this.enabled = true; this.movementSpeed = 1.0; this.rollSpeed = 0.005; this.dragToLook = false; this.autoForward = false; // disable default target object behavior // internals const EPS = 0.000001; const lastQuaternion = new Quaternion(); const lastPosition = new Vector3(); this.tmpQuaternion = new Quaternion(); const tempVector = new Vector3(); this.mouseStatus = 0; this.moveState = { up: 0, down: 0, left: 0, right: 0, forward: 0, back: 0, pitchUp: 0, pitchDown: 0, yawLeft: 0, yawRight: 0, rollLeft: 0, rollRight: 0 }; this.moveVector = new Vector3(0, 0, 0); this.rotationVector = new Vector3(0, 0, 0); this.keydown = function(event) { if (event.altKey || this.enabled === false) { return; } switch (event.code) { case 'ShiftLeft': case 'ShiftRight': this.movementSpeedMultiplier = .1; break; case 'KeyW': this.moveState.forward = 1; break; case 'KeyS': this.moveState.back = 1; break; case 'KeyA': this.moveState.left = 1; break; case 'KeyD': this.moveState.right = 1; break; case 'KeyR': this.moveState.up = 1; break; case 'KeyF': this.moveState.down = 1; break; case 'ArrowUp': this.moveState.pitchUp = 1; break; case 'ArrowDown': this.moveState.pitchDown = 1; break; case 'ArrowLeft': this.moveState.yawLeft = 1; break; case 'ArrowRight': this.moveState.yawRight = 1; break; case 'KeyQ': this.moveState.rollLeft = 1; break; case 'KeyE': this.moveState.rollRight = 1; break; } this.updateMovementVector(); this.updateRotationVector(); }; this.keyup = function(event) { if (this.enabled === false) return; switch (event.code) { case 'ShiftLeft': case 'ShiftRight': this.movementSpeedMultiplier = 1; break; case 'KeyW': this.moveState.forward = 0; break; case 'KeyS': this.moveState.back = 0; break; case 'KeyA': this.moveState.left = 0; break; case 'KeyD': this.moveState.right = 0; break; case 'KeyR': this.moveState.up = 0; break; case 'KeyF': this.moveState.down = 0; break; case 'ArrowUp': this.moveState.pitchUp = 0; break; case 'ArrowDown': this.moveState.pitchDown = 0; break; case 'ArrowLeft': this.moveState.yawLeft = 0; break; case 'ArrowRight': this.moveState.yawRight = 0; break; case 'KeyQ': this.moveState.rollLeft = 0; break; case 'KeyE': this.moveState.rollRight = 0; break; } this.updateMovementVector(); this.updateRotationVector(); }; this.pointerdown = function(event) { if (this.enabled === false) return; if (this.dragToLook) { this.mouseStatus++; } else { switch (event.button) { case 0: this.moveState.forward = 1; break; case 2: this.moveState.back = 1; break; } this.updateMovementVector(); } }; this.pointermove = function(event) { if (this.enabled === false) return; if (!this.dragToLook || this.mouseStatus > 0) { const container = this.getContainerDimensions(); const halfWidth = container.size[0] / 2; const halfHeight = container.size[1] / 2; this.moveState.yawLeft = -((event.pageX - container.offset[0]) - halfWidth) / halfWidth; this.moveState.pitchDown = ((event.pageY - container.offset[1]) - halfHeight) / halfHeight; this.updateRotationVector(); } }; this.pointerup = function(event) { if (this.enabled === false) return; if (this.dragToLook) { this.mouseStatus--; this.moveState.yawLeft = this.moveState.pitchDown = 0; } else { switch (event.button) { case 0: this.moveState.forward = 0; break; case 2: this.moveState.back = 0; break; } this.updateMovementVector(); } this.updateRotationVector(); }; this.contextMenu = function(event) { if (this.enabled === false) return; event.preventDefault(); }; this.update = function(delta = 0.0166) { if (this.enabled === false) return; const moveMult = delta * this.movementSpeed / 0.0166; const rotMult = delta * this.rollSpeed / 0.0166; tempVector.set(1, 0, 0).applyQuaternion(this.object.quaternion).multiplyScalar(this.moveVector.x * moveMult); this.object.position.add(tempVector); tempVector.set(0, 1, 0).applyQuaternion(this.object.quaternion).multiplyScalar(this.moveVector.y * moveMult); this.object.position.add(tempVector); tempVector.set(0, 0, 1).applyQuaternion(this.object.quaternion).multiplyScalar(this.moveVector.z * moveMult); this.object.position.add(tempVector); this.tmpQuaternion.set(this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1).normalize(); this.object.quaternion.multiply(this.tmpQuaternion); if ( lastPosition.distanceToSquared(this.object.position) > EPS || 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS ) { lastPosition.copy(this.object.position); lastQuaternion.copy(this.object.quaternion); return true; } return false; }; this.updateMovementVector = function() { const forward = (this.moveState.forward || (this.autoForward && !this.moveState.back)) ? 1 : 0; this.moveVector.x = (-this.moveState.left + this.moveState.right); this.moveVector.y = (-this.moveState.down + this.moveState.up); this.moveVector.z = (-forward + this.moveState.back); // console.log('move:', [this.moveVector.x, this.moveVector.y, this.moveVector.z]); }; this.updateRotationVector = function() { this.rotationVector.x = (-this.moveState.pitchDown + this.moveState.pitchUp); this.rotationVector.y = (-this.moveState.yawRight + this.moveState.yawLeft); this.rotationVector.z = (-this.moveState.rollRight + this.moveState.rollLeft); // console.log('rotate:', [this.rotationVector.x, this.rotationVector.y, this.rotationVector.z]); }; this.getContainerDimensions = function() { if (this.domElement != document) { return { size: [this.domElement.offsetWidth, this.domElement.offsetHeight], offset: [this.domElement.offsetLeft, this.domElement.offsetTop] }; } else { return { size: [window.innerWidth, window.innerHeight], offset: [0, 0] }; } }; this.dispose = function() { this.domElement.removeEventListener('contextmenu', _contextmenu); this.domElement.removeEventListener('pointerdown', _pointerdown); this.domElement.removeEventListener('pointermove', _pointermove); this.domElement.removeEventListener('pointerup', _pointerup); window.removeEventListener('keydown', _keydown); window.removeEventListener('keyup', _keyup); }; const _contextmenu = this.contextMenu.bind(this); const _pointermove = this.pointermove.bind(this); const _pointerdown = this.pointerdown.bind(this); const _pointerup = this.pointerup.bind(this); const _keydown = this.keydown.bind(this); const _keyup = this.keyup.bind(this); this.domElement.addEventListener('contextmenu', _contextmenu); this.domElement.addEventListener('mousemove', _pointermove); this.domElement.addEventListener('mousedown', _pointerdown); this.domElement.addEventListener('mouseup', _pointerup); window.addEventListener('keydown', _keydown); window.addEventListener('keyup', _keyup); this.updateMovementVector(); this.updateRotationVector(); } } export { FlyControls }; ================================================ FILE: examples/jsm/controls/FreeControls.js ================================================ /** * @author shawn0326 / http://halflab.me */ import { Quaternion, Vector2, Vector3 } from 't3d'; class FreeControls { constructor(object, domElement = document) { this.object = object; this.domElement = domElement; this.object.euler.order = 'YXZ'; // the right order? // API this.movementSpeed = 1.0; this.rotateSpeed = 0.25; this.enableMovementDamping = true; this.movementDampingFactor = 0.25; this.enableRotateDamping = true; this.rotateDampingFactor = 0.25; // internals const EPS = 0.000001; const tempVector = new Vector3(); const lastPosition = new Vector3(); const lastQuaternion = new Quaternion(); const rotateStart = new Vector2(); const rotateEnd = new Vector2(); const rotateDelta = new Vector2(); const moveDelta = new Vector3(); const rotateVector = new Vector2(); const moveVector = new Vector3(); let mouseState = 0; const moveState = { up: 0, down: 0, left: 0, right: 0, forward: 0, back: 0 }; const scope = this; this.update = function(delta = 0.0166) { const moveMult = delta * this.movementSpeed / 0.0166; moveVector.add(moveDelta); rotateVector.add(rotateDelta); tempVector.set(1, 0, 0).applyQuaternion(this.object.quaternion).multiplyScalar(moveVector.x * moveMult); this.object.position.add(tempVector); tempVector.set(0, 1, 0).applyQuaternion(this.object.quaternion).multiplyScalar(moveVector.y * moveMult); this.object.position.add(tempVector); tempVector.set(0, 0, 1).applyQuaternion(this.object.quaternion).multiplyScalar(moveVector.z * moveMult); this.object.position.add(tempVector); this.object.euler.x += delta * rotateVector.x / 0.0166; this.object.euler.y += delta * rotateVector.y / 0.0166; if (this.enableMovementDamping) { moveVector.multiplyScalar(1 - this.movementDampingFactor); } else { moveVector.set(0, 0, 0); } if (this.enableRotateDamping) { rotateVector.multiplyScalar(1 - this.rotateDampingFactor); } else { rotateVector.set(0, 0); } rotateDelta.set(0, 0); if ( lastPosition.distanceToSquared(this.object.position) > EPS || 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS ) { lastPosition.copy(this.object.position); lastQuaternion.copy(this.object.quaternion); return true; } return false; }; function updateRotateVector() { const element = scope.domElement === document ? scope.domElement.body : scope.domElement; const x = rotateDelta.x, y = rotateDelta.y; rotateDelta.x = (2 * Math.PI * y / element.clientHeight); rotateDelta.y = (2 * Math.PI * x / element.clientWidth); } function updateMovementVector() { moveDelta.x = (-moveState.left + moveState.right); moveDelta.y = (-moveState.down + moveState.up); moveDelta.z = (-moveState.forward + moveState.back); } function mousedown(event) { rotateStart.set(event.clientX, event.clientY); mouseState = 1; } function mousemove(event) { if (mouseState == 0) return; rotateEnd.set(event.clientX, event.clientY); rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(-scope.rotateSpeed); updateRotateVector(); rotateStart.copy(rotateEnd); } function mouseup(event) { mouseState = 0; rotateDelta.set(0, 0); } function keydown(event) { switch (event.keyCode) { case 87: /* W */ moveState.forward = 1; break; case 83: /* S */ moveState.back = 1; break; case 65: /* A */ moveState.left = 1; break; case 68: /* D */ moveState.right = 1; break; case 82: /* R */ moveState.up = 1; break; case 70: /* F */ moveState.down = 1; break; case 69: /* E */ moveState.up = 1; break; case 81: /* Q */ moveState.down = 1; break; } updateMovementVector(); } function keyup(event) { switch (event.keyCode) { case 87: /* W */ moveState.forward = 0; break; case 83: /* S */ moveState.back = 0; break; case 65: /* A */ moveState.left = 0; break; case 68: /* D */ moveState.right = 0; break; case 82: /* R */ moveState.up = 0; break; case 70: /* F */ moveState.down = 0; break; case 69: /* E */ moveState.up = 0; break; case 81: /* Q */ moveState.down = 0; break; } updateMovementVector(); } this.domElement.addEventListener('mousemove', mousemove); this.domElement.addEventListener('mousedown', mousedown); this.domElement.addEventListener('mouseup', mouseup); window.addEventListener('keydown', keydown); window.addEventListener('keyup', keyup); updateMovementVector(); updateRotateVector(); } } export { FreeControls }; ================================================ FILE: examples/jsm/controls/OrbitControls.js ================================================ import { Quaternion, Spherical, Vector2, Vector3 } from 't3d'; // Modified from https://github.com/mrdoob/three.js/blob/master/examples/jsm/controls/OrbitControls.js // At present, the 'Dolly' operation does not affect the effect of the orthographic camera, // because OrbitControls does not change the camera's projection matrix. // This set of controls performs orbiting, dollying, and panning. // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). // // Orbit - left mouse / touch: one-finger move // Dolly - middle mouse, or mousewheel / touch: two-finger spread or squish // Pan - right mouse, or arrow keys / touch: two-finger move class OrbitControls { constructor(object, domElement) { this.object = object; this.domElement = domElement; this.domElement.style.touchAction = 'none'; // disable touch scroll // Set to false to disable this control this.enabled = true; // "target" sets the location of focus, where the object orbits around this.target = new Vector3(); // The orbit axis this.up = new Vector3(0, 1, 0); // How far you can dolly in and out this.minDistance = 0; this.maxDistance = Infinity; // How far you can orbit vertically, upper and lower limits. // Range is 0 to Math.PI radians. this.minPolarAngle = 0; // radians this.maxPolarAngle = Math.PI; // radians // How far you can orbit horizontally, upper and lower limits. // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI ) this.minAzimuthAngle = -Infinity; // radians this.maxAzimuthAngle = Infinity; // radians // Set to true to enable damping (inertia) // If damping is enabled, you must call controls.update() in your animation loop this.enableDamping = true; this.dampingFactor = 0.1; // This option enables dollying in and out. // Set to false to disable dollying this.enableDollying = true; this.dollyingSpeed = 1.0; // Set to false to disable rotating this.enableRotate = true; this.rotateSpeed = 1.0; // Set to false to disable panning this.enablePan = true; this.panSpeed = 1.0; this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up this.keyPanSpeed = 7.0; // pixels moved per arrow key push // Set to true to automatically rotate around the target // If auto-rotate is enabled, you must call controls.update() in your animation loop this.autoRotate = false; this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 // The four arrow keys this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; // Mouse buttons this.mouseButtons = { ORBIT: 0, DOLLY: 1, PAN: 2 }; // Touch fingers this.touches = { ORBIT: 1, DOLLY_PAN: 2 }; // for reset this.target0 = this.target.clone(); this.position0 = this.object.position.clone(); // the target DOM element for key events this._domElementKeyEvents = null; // // public methods // this.getPolarAngle = function() { return spherical.phi; }; this.getAzimuthalAngle = function() { return spherical.theta; }; this.listenToKeyEvents = function(domElement) { domElement.addEventListener('keydown', onKeyDown); scope._domElementKeyEvents = domElement; }; this.saveState = function() { scope.target0.copy(scope.target); scope.position0.copy(scope.object.position); }; this.reset = function() { scope.target.copy(scope.target0); scope.object.position.copy(scope.position0); // scope.update(); state = STATE.NONE; }; this.update = function() { const offset = new Vector3(); const yAxis = new Vector3(0, 1, 0); const quat = new Quaternion(); const quatInverse = quat.clone(); const lastPosition = new Vector3(); const lastQuaternion = new Quaternion(); const twoPI = 2 * Math.PI; return function update() { quat.setFromUnitVectors(scope.up, yAxis); quatInverse.copy(quat).conjugate(); const position = scope.object.position; offset.copy(position).sub(scope.target); // rotate offset to "y-axis-is-up" space offset.applyQuaternion(quat); // angle from z-axis around y-axis spherical.setFromVector3(offset); if (scope.autoRotate && state === STATE.NONE) { rotateLeft(getAutoRotationAngle()); } if (scope.enableDamping) { spherical.theta += sphericalDelta.theta * scope.dampingFactor; spherical.phi += sphericalDelta.phi * scope.dampingFactor; } else { spherical.theta += sphericalDelta.theta; spherical.phi += sphericalDelta.phi; } // restrict theta to be between desired limits let min = scope.minAzimuthAngle; let max = scope.maxAzimuthAngle; if (isFinite(min) && isFinite(max)) { if (min < -Math.PI) min += twoPI; else if (min > Math.PI) min -= twoPI; if (max < -Math.PI) max += twoPI; else if (max > Math.PI) max -= twoPI; if (min <= max) { spherical.theta = Math.max(min, Math.min(max, spherical.theta)); } else { spherical.theta = (spherical.theta > (min + max) / 2) ? Math.max(min, spherical.theta) : Math.min(max, spherical.theta); } } // restrict phi to be between desired limits spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); spherical.makeSafe(); spherical.radius *= scale; // restrict radius to be between desired limits spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius)); // move target to panned location if (scope.enableDamping === true) { scope.target.addScaledVector(panOffset, scope.dampingFactor); } else { scope.target.add(panOffset); } offset.setFromSpherical(spherical); // rotate offset back to "camera-up-vector-is-up" space offset.applyQuaternion(quatInverse); position.copy(scope.target).add(offset); scope.object.lookAt(scope.target, scope.up); if (scope.enableDamping === true) { sphericalDelta.theta *= (1 - scope.dampingFactor); sphericalDelta.phi *= (1 - scope.dampingFactor); panOffset.multiplyScalar(1 - scope.dampingFactor); } else { sphericalDelta.set(0, 0, 0); panOffset.set(0, 0, 0); } scale = 1; // update condition is: // min(camera displacement, camera rotation in radians)^2 > EPS // using small-angle approximation cos(x/2) = 1 - x^2 / 8 if (lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { lastPosition.copy(scope.object.position); lastQuaternion.copy(scope.object.quaternion); return true; } return false; }; }(); this.dispose = function() { scope.domElement.removeEventListener('contextmenu', onContextMenu); scope.domElement.removeEventListener('pointerdown', onPointerDown); scope.domElement.removeEventListener('pointercancel', onPointerCancel); scope.domElement.removeEventListener('wheel', onMouseWheel); scope.domElement.removeEventListener('pointermove', onPointerMove); scope.domElement.removeEventListener('pointerup', onPointerUp); if (scope._domElementKeyEvents !== null) { scope._domElementKeyEvents.removeEventListener('keydown', onKeyDown); } }; // // internals // const scope = this; const STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 }; let state = STATE.NONE; const EPS = 0.000001; // current position in spherical coordinates const spherical = new Spherical(); const sphericalDelta = new Spherical(); let scale = 1; const panOffset = new Vector3(); const rotateStart = new Vector2(); const rotateEnd = new Vector2(); const rotateDelta = new Vector2(); const panStart = new Vector2(); const panEnd = new Vector2(); const panDelta = new Vector2(); const dollyStart = new Vector2(); const dollyEnd = new Vector2(); const dollyDelta = new Vector2(); const pointers = []; const pointerPositions = {}; function getAutoRotationAngle() { return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; } function getDollyingScale() { return Math.pow(0.95, scope.dollyingSpeed); } function rotateLeft(angle) { sphericalDelta.theta -= angle; } function rotateUp(angle) { sphericalDelta.phi -= angle; } const panLeft = function() { const v = new Vector3(); return function panLeft(distance, objectMatrix) { v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix v.multiplyScalar(-distance); panOffset.add(v); }; }(); const panUp = function() { const v = new Vector3(); return function panUp(distance, objectMatrix) { if (scope.screenSpacePanning === true) { v.setFromMatrixColumn(objectMatrix, 1); } else { v.setFromMatrixColumn(objectMatrix, 0); v.crossVectors(scope.up, v); } v.multiplyScalar(distance); panOffset.add(v); }; }(); // deltaX and deltaY are in pixels; right and down are positive const pan = function() { const offset = new Vector3(); const p = new Vector3(); return function pan(deltaX, deltaY) { const element = scope.domElement; const position = scope.object.position; offset.copy(position).sub(scope.target); const targetDistance = offset.getLength(); const depth = p.set(0, 0, targetDistance).applyMatrix4(scope.object.projectionMatrix).z; // full-screen to world distance const distance = p.set(0, -1, depth).applyMatrix4(scope.object.projectionMatrixInverse).y; // distance *= 2; // we use only clientHeight here so aspect ratio does not distort speed panLeft(2 * deltaX * distance / element.clientHeight, scope.object.matrix); panUp(2 * deltaY * distance / element.clientHeight, scope.object.matrix); }; }(); function dollyOut(dollyScale) { scale /= dollyScale; } function dollyIn(dollyScale) { scale *= dollyScale; } // // event callbacks - update the object state // function handleMouseDownRotate(event) { rotateStart.set(event.clientX, event.clientY); } function handleMouseDownDolly(event) { dollyStart.set(event.clientX, event.clientY); } function handleMouseDownPan(event) { panStart.set(event.clientX, event.clientY); } function handleMouseMoveRotate(event) { rotateEnd.set(event.clientX, event.clientY); rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed); const element = scope.domElement; rotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight); // use clientHeight to prevent aspect from affecting rotate speed rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight); rotateStart.copy(rotateEnd); } function handleMouseMoveDolly(event) { dollyEnd.set(event.clientX, event.clientY); dollyDelta.subVectors(dollyEnd, dollyStart); if (dollyDelta.y > 0) { dollyOut(getDollyingScale()); } else if (dollyDelta.y < 0) { dollyIn(getDollyingScale()); } dollyStart.copy(dollyEnd); } function handleMouseMovePan(event) { panEnd.set(event.clientX, event.clientY); panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); pan(panDelta.x, panDelta.y); panStart.copy(panEnd); } function handleMouseWheel(event) { if (event.deltaY < 0) { dollyIn(getDollyingScale()); } else if (event.deltaY > 0) { dollyOut(getDollyingScale()); } } function handleKeyDown(event) { let needsUpdate = false; switch (event.keyCode) { case scope.keys.UP: pan(0, scope.keyPanSpeed); needsUpdate = true; break; case scope.keys.BOTTOM: pan(0, -scope.keyPanSpeed); needsUpdate = true; break; case scope.keys.LEFT: pan(scope.keyPanSpeed, 0); needsUpdate = true; break; case scope.keys.RIGHT: pan(-scope.keyPanSpeed, 0); needsUpdate = true; break; } if (needsUpdate) { event.preventDefault(); // prevent the browser from scrolling on cursor keys // scope.update(); } } function handleTouchStartRotate() { if (pointers.length === 1) { rotateStart.set(pointers[0].pageX, pointers[0].pageY); } else { const x = 0.5 * (pointers[0].pageX + pointers[1].pageX); const y = 0.5 * (pointers[0].pageY + pointers[1].pageY); rotateStart.set(x, y); } } function handleTouchStartPan() { if (pointers.length === 1) { panStart.set(pointers[0].pageX, pointers[0].pageY); } else { const x = 0.5 * (pointers[0].pageX + pointers[1].pageX); const y = 0.5 * (pointers[0].pageY + pointers[1].pageY); panStart.set(x, y); } } function handleTouchStartDolly() { const dx = pointers[0].pageX - pointers[1].pageX; const dy = pointers[0].pageY - pointers[1].pageY; const distance = Math.sqrt(dx * dx + dy * dy); dollyStart.set(0, distance); } function handleTouchStartDollyPan() { if (scope.enableDollying) handleTouchStartDolly(); if (scope.enablePan) handleTouchStartPan(); } function handleTouchMoveRotate(event) { if (pointers.length == 1) { rotateEnd.set(event.pageX, event.pageY); } else { const position = getSecondPointerPosition(event); const x = 0.5 * (event.pageX + position.x); const y = 0.5 * (event.pageY + position.y); rotateEnd.set(x, y); } rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed); const element = scope.domElement; rotateLeft(2 * Math.PI * rotateDelta.x / element.clientHeight); // prevent the browser from scrolling on cursor keys rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight); rotateStart.copy(rotateEnd); } function handleTouchMovePan(event) { if (pointers.length === 1) { panEnd.set(event.pageX, event.pageY); } else { const position = getSecondPointerPosition(event); const x = 0.5 * (event.pageX + position.x); const y = 0.5 * (event.pageY + position.y); panEnd.set(x, y); } panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); pan(panDelta.x, panDelta.y); panStart.copy(panEnd); } function handleTouchMoveDolly(event) { const position = getSecondPointerPosition(event); const dx = event.pageX - position.x; const dy = event.pageY - position.y; const distance = Math.sqrt(dx * dx + dy * dy); dollyEnd.set(0, distance); dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.dollyingSpeed)); dollyOut(dollyDelta.y); dollyStart.copy(dollyEnd); } function handleTouchMoveDollyPan(event) { if (scope.enableDollying) handleTouchMoveDolly(event); if (scope.enablePan) handleTouchMovePan(event); } // // event handlers - FSM: listen for events and reset state // function onPointerDown(event) { if (scope.enabled === false) return; if (pointers.length === 0) { scope.domElement.setPointerCapture(event.pointerId); scope.domElement.addEventListener('pointermove', onPointerMove); scope.domElement.addEventListener('pointerup', onPointerUp); } // addPointer(event); if (event.pointerType === 'touch') { onTouchStart(event); } else { onMouseDown(event); } } function onPointerMove(event) { if (scope.enabled === false) return; if (event.pointerType === 'touch') { onTouchMove(event); } else { onMouseMove(event); } } function onPointerUp(event) { removePointer(event); if (pointers.length === 0) { scope.domElement.releasePointerCapture(event.pointerId); scope.domElement.removeEventListener('pointermove', onPointerMove); scope.domElement.removeEventListener('pointerup', onPointerUp); } state = STATE.NONE; } function onPointerCancel(event) { removePointer(event); } function onMouseDown(event) { switch (event.button) { case scope.mouseButtons.ORBIT: if (scope.enableRotate === false) return; handleMouseDownRotate(event); state = STATE.ROTATE; break; case scope.mouseButtons.DOLLY: if (scope.enableDollying === false) return; handleMouseDownDolly(event); state = STATE.DOLLY; break; case scope.mouseButtons.PAN: if (scope.enablePan === false) return; handleMouseDownPan(event); state = STATE.PAN; break; } } function onMouseMove(event) { switch (state) { case STATE.ROTATE: if (scope.enableRotate === false) return; handleMouseMoveRotate(event); // scope.update(); break; case STATE.DOLLY: if (scope.enableDollying === false) return; handleMouseMoveDolly(event); // scope.update(); break; case STATE.PAN: if (scope.enablePan === false) return; handleMouseMovePan(event); // scope.update(); break; } } function onMouseWheel(event) { if (scope.enabled === false || scope.enableDollying === false || state !== STATE.NONE) return; event.preventDefault(); handleMouseWheel(event); // scope.update(); } function onKeyDown(event) { if (scope.enabled === false || scope.enablePan === false) return; handleKeyDown(event); } function onTouchStart(event) { trackPointer(event); switch (pointers.length) { case scope.touches.ORBIT: if (scope.enableRotate === false) return; handleTouchStartRotate(); state = STATE.TOUCH_ROTATE; break; case scope.touches.DOLLY_PAN: if (scope.enableDollying === false && scope.enablePan === false) return; handleTouchStartDollyPan(); state = STATE.TOUCH_DOLLY_PAN; break; default: state = STATE.NONE; } } function onTouchMove(event) { trackPointer(event); switch (state) { case STATE.TOUCH_ROTATE: if (scope.enableRotate === false) return; handleTouchMoveRotate(event); // scope.update(); break; case STATE.TOUCH_DOLLY_PAN: if (scope.enableDollying === false && scope.enablePan === false) return; handleTouchMoveDollyPan(event); // scope.update(); break; default: state = STATE.NONE; } } function onContextMenu(event) { if (scope.enabled === false) return; event.preventDefault(); } function addPointer(event) { pointers.push(event); } function removePointer(event) { delete pointerPositions[event.pointerId]; for (let i = 0; i < pointers.length; i++) { if (pointers[i].pointerId == event.pointerId) { pointers.splice(i, 1); return; } } } function trackPointer(event) { let position = pointerPositions[event.pointerId]; if (position === undefined) { position = new Vector2(); pointerPositions[event.pointerId] = position; } position.set(event.pageX, event.pageY); } function getSecondPointerPosition(event) { const pointer = (event.pointerId === pointers[0].pointerId) ? pointers[1] : pointers[0]; return pointerPositions[pointer.pointerId]; } // scope.domElement.addEventListener('contextmenu', onContextMenu); scope.domElement.addEventListener('pointerdown', onPointerDown); scope.domElement.addEventListener('pointercancel', onPointerCancel); scope.domElement.addEventListener('wheel', onMouseWheel, { passive: false }); // force an update at start this.update(); } } export { OrbitControls }; ================================================ FILE: examples/jsm/controls/TransformControls.js ================================================ import { Object3D, Vector2, Vector3, Euler, Plane, Matrix4, Quaternion, Mesh, BasicMaterial, ShaderLib, Raycaster, CylinderGeometry, PlaneGeometry, BoxGeometry, SphereGeometry, Geometry, Attribute, Buffer, MATERIAL_TYPE, DRAW_SIDE, DRAW_MODE } from 't3d'; import { TorusBuilder } from '../geometries/builders/TorusBuilder.js'; import { VirtualGroup } from '../math/VirtualGroup.js'; class TransformControls extends Object3D { constructor(camera, domElement) { super(); const group = new VirtualGroup(); const controlMap = new Map(); const translateControl = new TranslateControl(camera, group); const scaleControl = new ScaleControl(camera, group); const rotateControl = new RotateControl(camera, group); controlMap.set('translate', translateControl); controlMap.set('scale', scaleControl); controlMap.set('rotate', rotateControl); this.add(translateControl); this.add(scaleControl); this.add(rotateControl); this._domElement = domElement; this._mode = ''; this._camera = camera; this._group = group; this._controlMap = controlMap; this._currentControl = []; this._currentDraggingControl = null; this._currentHoverControl = null; this._raycaster = new Raycaster(); this.mode = 'translate'; this._onPointDown = this._onPointDown.bind(this); this._onPointMove = this._onPointMove.bind(this); this._onPointUp = this._onPointUp.bind(this); this._addEventListeners(); this.onDragStart = null; this.onDragEnd = null; this.onDrag = null; } get group() { return this._group; } // 'translate' | 'scale' | 'rotate' | 'all' set mode(value) { if (this._mode === value) return; this._mode = value; this._currentControl = []; if (value === 'all') { this._controlMap.forEach(control => { this._currentControl.push(control); control.visible = true; }); } else { this._controlMap.forEach((control, key) => { if (key === value) { this._currentControl.push(control); control.visible = true; } else { control.visible = false; } }); } } get mode() { return this._mode; } set size(value) { this._controlMap.forEach(control => control.size = value); } get size() { return this._controlMap.get('translate').size; } set translateSnap(value) { this._controlMap.get('translate').snap = value; } get translateSnap() { return this._controlMap.get('translate').snap; } set scaleSnap(value) { this._controlMap.get('scale').snap = value; } get scaleSnap() { return this._controlMap.get('scale').snap; } set rotateSnap(value) { this._controlMap.get('rotate').snap = value; } get rotateSnap() { return this._controlMap.get('rotate').snap; } update() { const isModify = this._mode === 'all'; this._controlMap.forEach(control => control.update(isModify)); } dispose() { this._removeEventListeners(); this.traverse(child => { if (child.isMesh) { child.geometry.dispose(); child.material.dispose(); } }); this._group.reset(); } _addEventListeners() { const element = this._domElement; element.addEventListener('pointerdown', this._onPointDown); element.addEventListener('pointermove', this._onPointMove); element.addEventListener('pointerup', this._onPointUp); } _removeEventListeners() { const element = this._domElement; element.removeEventListener('pointerdown', this._onPointDown); element.removeEventListener('pointermove', this._onPointMove); element.removeEventListener('pointerup', this._onPointUp); } _onPointDown(e) { if (!this.visible || e.button !== 0) return; const selectedObject = this._selectGizmoMesh(e.clientX, e.clientY); if (selectedObject) { this._triggerGizmoStart(selectedObject.parent.name, selectedObject.name); this.onDragStart && this.onDragStart(); } } _onPointMove(e) { if (!this.visible) return; if (!this._currentDraggingControl) { this._onGizmoHoverEnd(); const selectedObject = this._selectGizmoMesh(e.clientX, e.clientY); if (selectedObject) { this._onGizmoHoverStart(selectedObject.parent.name, selectedObject.name); } } else { if (this._mode === 'all') { this._controlMap.forEach(control => { if (control !== this._currentDraggingControl) control.visible = false; }); } this._setRaycaster(e.clientX, e.clientY); this._currentDraggingControl.onMove(this._raycaster.ray); this.onDrag && this.onDrag(); } } _onPointUp(e) { if (!this.visible) return; if (this._currentDraggingControl) { this._triggerGizmoEnd(); this.onDragEnd && this.onDragEnd(); if (this._mode === 'all') { this._controlMap.forEach(control => control.visible = true); } } } _setRaycaster(clientX, clientY) { const element = this._domElement; const rect = element.getBoundingClientRect(); const style = element.currentStyle || window.getComputedStyle(element); const borderLeftWidth = parseInt(style['borderLeftWidth'], 10); const borderTopWidth = parseInt(style['borderTopWidth'], 10); _vec2_1.x = ((clientX - rect.left - borderLeftWidth) / element.clientWidth) * 2 - 1; _vec2_1.y = -((clientY - rect.top - borderTopWidth) / element.clientHeight) * 2 + 1; this._raycaster.setFromCamera(_vec2_1, this._camera); } _selectGizmoMesh(clientX, clientY) { this._setRaycaster(clientX, clientY); const array = this._raycaster.intersectObjects(this._currentControl, true); if (array.length === 0) return null; let selectedObject = array[0].object; // rotate xyz has lower priority if (array.length > 1) { for (let i = 0; i < array.length; i++) { const object = array[i].object; if (object.name !== 'xyz' || object.parent.name !== 'rotate') { selectedObject = object; break; } } } return selectedObject; } _onGizmoHoverEnd() { if (this._currentHoverControl) { this._currentHoverControl.onHoverEnd(); this._currentHoverControl = null; } } _onGizmoHoverStart(currentType, axisName) { if (!this._currentHoverControl) { this._currentHoverControl = this._controlMap.get(currentType); this._currentHoverControl.onHoverStart(axisName); } } _triggerGizmoStart(currentType, axisName) { this._onGizmoHoverEnd(); this._currentDraggingControl = this._controlMap.get(currentType); this._currentDraggingControl.onMoveStart(this._raycaster.ray, axisName); } _triggerGizmoEnd() { this._currentDraggingControl.onMoveEnd(); this._currentDraggingControl = null; this._group.dirty(); } } // Global variables const _vec2_1 = new Vector2(); const _vec3_1 = new Vector3(); const _vec3_2 = new Vector3(); const _vec3_3 = new Vector3(); const _mat4_1 = new Matrix4(); const _quat_1 = new Quaternion(); const _euler_1 = new Euler(); const _euler_2 = new Euler(); const redColor = [1.0, 0.25, 0.25]; const greenColor = [0.5, 0.8, 0.2]; const blueColor = [0.3, 0.5, 1.0]; const whiteColor = [1.0, 1.0, 1.0]; const grayColor = [0.75, 0.75, 0.75]; const yellowColor = [1.0, 1.0, 0.0]; const gizmoRenderOrder = 100; // for snap const _position = new Vector3(); const _scale = new Vector3(); const _quaternion = new Quaternion(); const axisVector = { 'x': new Vector3(1, 0, 0), 'y': new Vector3(0, 1, 0), 'z': new Vector3(0, 0, 1), 'xyz': new Vector3(1, 1, 1), 'xy': new Vector3(1, 1, 0), 'yz': new Vector3(0, 1, 1), 'xz': new Vector3(1, 0, 1) }; const axisPlane = { 'x': new Plane(new Vector3(1, 0, 0), 0), 'y': new Plane(new Vector3(0, 1, 0), 0), 'z': new Plane(new Vector3(0, 0, 1), 0), 'xyz': new Plane(new Vector3(0, 0, 0), 0), 'xy': new Plane(new Vector3(0, 0, 1), 0), 'yz': new Plane(new Vector3(1, 0, 0), 0), 'xz': new Plane(new Vector3(0, 1, 0), 0) }; const matchSign = (a, b) => (b < 0 ? -1 : 1) * Math.abs(a); // Separate class for each control class BaseControl extends Object3D { constructor(name, camera, group) { super(); this.name = name; this._camera = camera; this._group = group; this._startGroupMatrix = new Matrix4(); this._startGroupMatrixInverse = new Matrix4(); this._startLocalMatrix = new Matrix4(); this._moving = false; this.size = 1; this.snap = null; } onHoverStart(axisName) {} onHoverEnd() {} onMoveStart(ray, axisName) { const group = this._group; group.getWorldMatrix(this._startGroupMatrix); this._startGroupMatrixInverse.copy(this._startGroupMatrix).invert(); if (group.objects.length > 0) { this._startLocalMatrix.copy(group.objects[0].matrix); } this._moving = true; } onMove(ray) {} onMoveEnd() { this._moving = false; } update(isModify) {} } class TranslateControl extends BaseControl { constructor(camera, group) { super('translate', camera, group); this._translateControlMap = new Map(); this._helperMap = new Map(); this._gizmoPlanes = []; this._selectedAxis = null; this._scale = 1; this._plane = new Plane(); this._currPoint = new Vector3(); this._startPoint = new Vector3(); this._createAxis(); } _createAxis() { const lineX = new GizmoMesh('line', 'x', redColor, new Vector3(0.75, 0, 0), new Euler(0, 0, -Math.PI / 2), 1.5); const arrowX = new GizmoMesh('arrow', 'x', redColor, new Vector3(1.5, 0, 0), new Euler(0, 0, -Math.PI / 2)); this._translateControlMap.set('x', [lineX, arrowX]); this.add(lineX); this.add(arrowX); const pickX = new GizmoMesh('pickAxis', 'x', whiteColor, new Vector3(0.75, 0, 0), new Euler(0, 0, -Math.PI / 2)); pickX.visible = false; this.add(pickX); const lineY = new GizmoMesh('line', 'y', greenColor, new Vector3(0, 0.75, 0), new Euler(0, 0, 0), 1.5); const arrowY = new GizmoMesh('arrow', 'y', greenColor, new Vector3(0, 1.5, 0), new Euler(0, 0, 0)); this._translateControlMap.set('y', [lineY, arrowY]); this.add(lineY); this.add(arrowY); const pickY = new GizmoMesh('pickAxis', 'y', whiteColor, new Vector3(0, 0.75, 0), new Euler(0, 0, 0)); pickY.visible = false; this.add(pickY); const lineZ = new GizmoMesh('line', 'z', blueColor, new Vector3(0, 0, 0.75), new Euler(Math.PI / 2, 0, 0), 1.5); const arrowZ = new GizmoMesh('arrow', 'z', blueColor, new Vector3(0, 0, 1.5), new Euler(Math.PI / 2, 0, 0)); this._translateControlMap.set('z', [lineZ, arrowZ]); this.add(lineZ); this.add(arrowZ); const pickZ = new GizmoMesh('pickAxis', 'z', whiteColor, new Vector3(0, 0, 0.75), new Euler(Math.PI / 2, 0, 0)); pickZ.visible = false; this.add(pickZ); const planeXY = new GizmoMesh('plane', 'xy', blueColor, new Vector3(0.18, 0.18, 0), new Euler(Math.PI / 2, 0, 0), 0.3); this._translateControlMap.set('xy', [planeXY]); this._gizmoPlanes.push(planeXY); this.add(planeXY); const pickXY = new GizmoMesh('plane', 'xy', whiteColor, new Vector3(0.25, 0.25, 0), new Euler(Math.PI / 2, 0, 0), 0.5); pickXY.visible = false; this._gizmoPlanes.push(pickXY); this.add(pickXY); const planeYZ = new GizmoMesh('plane', 'yz', redColor, new Vector3(0, 0.18, 0.18), new Euler(0, 0, Math.PI / 2), 0.3); this._translateControlMap.set('yz', [planeYZ]); this._gizmoPlanes.push(planeYZ); this.add(planeYZ); const pickYZ = new GizmoMesh('plane', 'yz', whiteColor, new Vector3(0, 0.25, 0.25), new Euler(0, 0, Math.PI / 2), 0.5); pickYZ.visible = false; this._gizmoPlanes.push(pickYZ); this.add(pickYZ); const planeXZ = new GizmoMesh('plane', 'xz', greenColor, new Vector3(0.18, 0, 0.18), null, 0.3); this._translateControlMap.set('xz', [planeXZ]); this._gizmoPlanes.push(planeXZ); this.add(planeXZ); const pickXZ = new GizmoMesh('plane', 'xz', whiteColor, new Vector3(0.25, 0, 0.25), null, 0.5); pickXZ.visible = false; this._gizmoPlanes.push(pickXZ); this.add(pickXZ); const helperX = new GizmoMesh('axishelper', 'x', yellowColor, new Vector3(-1e3, 0, 0), null); helperX.visible = false; this._helperMap.set('x', helperX); this.add(helperX); const helperY = new GizmoMesh('axishelper', 'y', yellowColor, new Vector3(0, -1e3, 0), new Euler(0, 0, Math.PI / 2)); helperY.visible = false; this._helperMap.set('y', helperY); this.add(helperY); const helperZ = new GizmoMesh('axishelper', 'z', yellowColor, new Vector3(0, 0, -1e3), new Euler(0, -Math.PI / 2, 0)); helperZ.visible = false; this._helperMap.set('z', helperZ); this.add(helperZ); } onHoverStart(axisName) { this._selectedAxis = axisName; const currentAxis = this._translateControlMap.get(this._selectedAxis); currentAxis.forEach(axis => axis.highlight()); } onHoverEnd() { const currentAxis = this._translateControlMap.get(this._selectedAxis); currentAxis.forEach(axis => axis.unhighlight()); this._selectedAxis = null; } onMoveStart(ray, axisName) { this._selectedAxis = axisName; super.onMoveStart(ray, axisName); this._startScale = this._scale; this._getHitPlane(); this._calRayIntersection(ray, this._startPoint); this._translateControlMap.forEach((value, key) => { if (key === axisName) { value.forEach(axis => axis.yellow()); } else { value.forEach(axis => axis.visible = false); } }); } onMove(ray) { this._calRayIntersection(ray, this._currPoint); const currScale = this._scale; const { _startScale } = this; this._helperMap.forEach((value, key) => { if (this._selectedAxis.indexOf(key) !== -1) { value.visible = true; } }); _vec3_1.x = this._currPoint.x - (this._startPoint.x / _startScale) * currScale; _vec3_1.y = this._currPoint.y - (this._startPoint.y / _startScale) * currScale; _vec3_1.z = this._currPoint.z - (this._startPoint.z / _startScale) * currScale; const localAxis = axisVector[this._selectedAxis]; _vec3_1.x *= localAxis.x; _vec3_1.y *= localAxis.y; _vec3_1.z *= localAxis.z; this._applySnap(_vec3_1); _mat4_1.identity(); _mat4_1.elements[12] = _vec3_1.x; _mat4_1.elements[13] = _vec3_1.y; _mat4_1.elements[14] = _vec3_1.z; _mat4_1.premultiply(this._startGroupMatrix); this._group.setWorldMatrix(_mat4_1); } onMoveEnd() { this._translateControlMap.forEach(control => { control.forEach(axis => { axis.material.diffuse.copy(axis.material._color); axis.material.opacity = axis.material._opacity; axis.visible = true; }); }); this._helperMap.forEach(value => { value.visible = false; }); super.onMoveEnd(); } _getHitPlane() { switch (this._selectedAxis) { case 'x': case 'y': case 'z': { _vec3_1.setFromMatrixPosition(this._camera.worldMatrix); _vec3_1.applyMatrix4(this._startGroupMatrixInverse); const localAxis = axisVector[this._selectedAxis]; _vec3_2.crossVectors(_vec3_1, localAxis); this._plane.setFromCoplanarPoints(localAxis, _vec3_1.set(0, 0, 0), _vec3_2); break; } case 'xy': case 'yz': case 'xz': { this._plane.copy(axisPlane[this._selectedAxis]); break; } } } _calRayIntersection(ray, out) { // transform ray to local space ray.origin.applyMatrix4(this._startGroupMatrixInverse); ray.direction.transformDirection(this._startGroupMatrixInverse); ray.intersectPlane(this._plane, out); } update() { this._resizeControl(); this._adaptPlanes(); } _resizeControl() { this._group.getWorldMatrix(_mat4_1); const ele = this._camera.projectionMatrix.elements; let factor; if (ele[15] > 0) { factor = 2 / ele[5]; } else { _vec3_1.setFromMatrixPosition(_mat4_1); _vec3_2.setFromMatrixPosition(this._camera.worldMatrix); factor = _vec3_1.distanceTo(_vec3_2) * Math.min(1.9 / ele[5], 7); } factor *= this.size / 8; this._scale = factor; this.worldMatrix.copy(_mat4_1); const parentMatrixInverse = _mat4_1.copy(this.parent.worldMatrix).invert(); this.matrix.multiplyMatrices(parentMatrixInverse, this.worldMatrix); this.matrix.decompose(this.position, this.quaternion, this.scale); this.scale.multiplyScalar(factor); } _adaptPlanes() { if (this._moving) return; _mat4_1.copy(this.worldMatrix).invert().multiply(this._camera.worldMatrix); const cameraVector = _vec3_1.setFromMatrixPosition(_mat4_1); for (let i = 0, l = this._gizmoPlanes.length; i < l; i++) { const plane = this._gizmoPlanes[i]; if (plane.name === 'xz') { plane.position.x = matchSign(plane.position.x, cameraVector.x); plane.position.z = matchSign(plane.position.z, cameraVector.z); } else if (plane.name === 'xy') { plane.position.x = matchSign(plane.position.x, cameraVector.x); plane.position.y = matchSign(plane.position.y, cameraVector.y); } else if (plane.name === 'yz') { plane.position.y = matchSign(plane.position.y, cameraVector.y); plane.position.z = matchSign(plane.position.z, cameraVector.z); } } } _applySnap(target) { const snap = this.snap; if (!snap) return; const group = this._group; if (group.coordinateType === 'global' || group.objects.length > 1) { this._startGroupMatrix.decompose(_position, _quaternion, _scale); } else { this._startLocalMatrix.decompose(_position, _quaternion, _scale); } _position.applyQuaternion(_quaternion.conjugate()); if (target.x !== 0) { target.x += _position.x; target.x = Math.round(target.x / snap) * snap; target.x -= _position.x; } if (target.y !== 0) { target.y += _position.y; target.y = Math.round(target.y / snap) * snap; target.y -= _position.y; } if (target.z !== 0) { target.z += _position.z; target.z = Math.round(target.z / snap) * snap; target.z -= _position.z; } } } class ScaleControl extends BaseControl { constructor(camera, group) { super('scale', camera, group); this._scaleControlMap = new Map(); this._selectedAxis = null; this._plane = new Plane(); this._currPoint = new Vector3(); this._startPoint = new Vector3(); this._factorVec = new Vector3(); this._createAxis(); } _createAxis() { const lineX = new GizmoMesh('line', 'x', redColor, new Vector3(0.75, 0, 0), new Euler(0, 0, -Math.PI / 2), 1.3); const cubeX = new GizmoMesh('box', 'x', redColor, new Vector3(1.3, 0, 0), new Euler(0, 0, 0), 0.2); this._scaleControlMap.set('x', [lineX, cubeX]); this.add(lineX); this.add(cubeX); const pickX = new GizmoMesh('pickAxis', 'x', whiteColor, new Vector3(0.75, 0, 0), new Euler(0, 0, -Math.PI / 2)); pickX.visible = false; this.add(pickX); const lineY = new GizmoMesh('line', 'y', greenColor, new Vector3(0, 0.75, 0), new Euler(0, 0, 0), 1.3); const cubeY = new GizmoMesh('box', 'y', greenColor, new Vector3(0, 1.3, 0), new Euler(0, 0, 0), 0.2); this._scaleControlMap.set('y', [lineY, cubeY]); this.add(lineY); this.add(cubeY); const pickY = new GizmoMesh('pickAxis', 'y', whiteColor, new Vector3(0, 0.75, 0), new Euler(0, 0, 0)); pickY.visible = false; this.add(pickY); const lineZ = new GizmoMesh('line', 'z', blueColor, new Vector3(0, 0, 0.75), new Euler(Math.PI / 2, 0, 0), 1.3); const cubeZ = new GizmoMesh('box', 'z', blueColor, new Vector3(0, 0, 1.3), new Euler(0, 0, 0), 0.2); this._scaleControlMap.set('z', [lineZ, cubeZ]); this.add(lineZ); this.add(cubeZ); const pickZ = new GizmoMesh('pickAxis', 'z', whiteColor, new Vector3(0, 0, 0.75), new Euler(Math.PI / 2, 0, 0)); pickZ.visible = false; this.add(pickZ); const cubeXYZ = new GizmoMesh('box', 'xyz', grayColor, new Vector3(0, 0, 0), new Euler(0, 0, 0), 0.32); this._scaleControlMap.set('xyz', [cubeXYZ]); this.add(cubeXYZ); } onHoverStart(axisName) { this._selectedAxis = axisName; const currentAxis = this._scaleControlMap.get(this._selectedAxis); currentAxis.forEach(axis => axis.highlight()); } onHoverEnd() { const currentAxis = this._scaleControlMap.get(this._selectedAxis); currentAxis.forEach(axis => axis.unhighlight()); this._selectedAxis = null; } onMoveStart(ray, axisName) { this._selectedAxis = axisName; super.onMoveStart(ray, axisName); this._getHitPlane(); this._calRayIntersection(ray, this._startPoint); const localAxis = axisVector[this._selectedAxis]; this._factorVec.set( this._startPoint.x === 0 ? 0 : localAxis.x / this._startPoint.x, this._startPoint.y === 0 ? 0 : localAxis.y / this._startPoint.y, this._startPoint.z === 0 ? 0 : localAxis.z / this._startPoint.z ); this._scaleControlMap.forEach((value, key) => { if (key === axisName) { value.forEach(axis => axis.yellow()); } else { value.forEach(axis => axis.visible = false); } }); } onMove(ray) { this._calRayIntersection(ray, this._currPoint); const { _factorVec: factorVec } = this; if (this._selectedAxis === 'xyz') { const start = this._startPoint.getLength(); const end = this._currPoint.getLength(); _vec3_1.x = end / start; _vec3_1.y = end / start; _vec3_1.z = end / start; } else { // x y z _vec3_1.subVectors(this._currPoint, this._startPoint); _vec3_1.x = _vec3_1.x * factorVec.x + 1; _vec3_1.y = _vec3_1.y * factorVec.y + 1; _vec3_1.z = _vec3_1.z * factorVec.z + 1; } this._applySnap(_vec3_1); _mat4_1.identity(); _mat4_1.elements[0] = _vec3_1.x; _mat4_1.elements[5] = _vec3_1.y; _mat4_1.elements[10] = _vec3_1.z; _mat4_1.premultiply(this._startGroupMatrix); this._group.setWorldMatrix(_mat4_1); } onMoveEnd() { this._scaleControlMap.forEach(control => { control.forEach(axis => { axis.material.diffuse.copy(axis.material._color); axis.material.opacity = axis.material._opacity; axis.visible = true; }); }); super.onMoveEnd(); } update(isModify) { this._resizeControl(isModify); } _getHitPlane() { _vec3_1.setFromMatrixPosition(this._camera.worldMatrix); _vec3_1.applyMatrix4(this._startGroupMatrixInverse); const localAxis = axisVector[this._selectedAxis]; _vec3_2.crossVectors(_vec3_1, localAxis); this._plane.setFromCoplanarPoints(localAxis, _vec3_1.set(0, 0, 0), _vec3_2); } _calRayIntersection(ray, out) { ray.origin.applyMatrix4(this._startGroupMatrixInverse); ray.direction.transformDirection(this._startGroupMatrixInverse); ray.intersectPlane(this._plane, out); } _resizeControl(isModify) { this._group.getWorldMatrix(_mat4_1); const ele = this._camera.projectionMatrix.elements; let factor; if (ele[15] > 0) { factor = 2 / ele[5]; } else { _vec3_1.setFromMatrixPosition(_mat4_1); _vec3_2.setFromMatrixPosition(this._camera.worldMatrix); factor = _vec3_1.distanceTo(_vec3_2) * Math.min(1.9 / ele[5], 7); } factor *= this.size / 8; if (isModify) { factor *= 0.8; } this.worldMatrix.copy(_mat4_1); const parentMatrixInverse = _mat4_1.copy(this.parent.worldMatrix).invert(); this.matrix.multiplyMatrices(parentMatrixInverse, this.worldMatrix); this.matrix.decompose(this.position, this.quaternion, this.scale); this.scale.multiplyScalar(factor); // fix scale? if (ele[15] === 0) { const el = this.worldMatrix.elements; const sx = 1 / Math.sqrt(el[0] * el[0] + el[1] * el[1] + el[2] * el[2]); const sy = 1 / Math.sqrt(el[4] * el[4] + el[5] * el[5] + el[6] * el[6]); const sz = 1 / Math.sqrt(el[8] * el[8] + el[9] * el[9] + el[10] * el[10]); this.scale.x *= sx; this.scale.y *= sy; this.scale.z *= sz; } } _applySnap(target) { const snap = this.snap; if (!snap) return; const { _factorVec: factorVec } = this; this._startLocalMatrix.decompose(_position, _quaternion, _scale); if (factorVec.x !== 0) { target.x *= _scale.x; target.x = Math.round(target.x / snap) * snap || snap; target.x /= _scale.x; } if (factorVec.y !== 0) { target.y *= _scale.y; target.y = Math.round(target.y / snap) * snap || snap; target.y /= _scale.y; } if (factorVec.z !== 0) { target.z *= _scale.z; target.z = Math.round(target.z / snap) * snap || snap; target.z /= _scale.z; } } } class RotateControl extends BaseControl { constructor(camera, group) { super('rotate', camera, group); this.rotateCircleRadius = 1.4; this.rotateCircleRadiusE = 1.4; this._rotateControlMap = new Map(); this._pickHelper = new Map(); this._lineHelperE = null; this._lineHelperS = null; this._rotateHelper = null; this._selectedAxis = null; this._plane = new Plane(); this._startPointUnit = new Vector3(); this._currPointUnit = new Vector3(); this._needsUpdate = true; this._finalRad = 0; this._previousRad = 0; this._eye = new Vector3(); this._createAxis(); } _createAxis() { const axisE = new GizmoMesh('torus', 'e', grayColor, new Vector3(0, 0, 0), new Euler(0, 0, 0), this.rotateCircleRadiusE, Math.PI * 2); this._rotateControlMap.set('e', axisE); this.add(axisE); const pickE = new GizmoMesh('torus', 'e', whiteColor, new Vector3(0, 0, 0), new Euler(0, 0, 0), this.rotateCircleRadiusE, Math.PI * 2, 0.2); pickE.visible = false; this._pickHelper.set('e', pickE); this.add(pickE); const axisZ = new GizmoMesh('torus', 'z', blueColor, new Vector3(0, 0, 0), new Euler(0, 0, -Math.PI / 2), this.rotateCircleRadius); this._rotateControlMap.set('z', axisZ); this.add(axisZ); const pickZ = new GizmoMesh('torus', 'z', whiteColor, new Vector3(0, 0, 0), new Euler(0, 0, -Math.PI / 2), this.rotateCircleRadius, Math.PI, 0.2); pickZ.visible = false; this._pickHelper.set('z', pickZ); this.add(pickZ); this._axisZQuaternionStart = axisZ.quaternion.clone(); const axisY = new GizmoMesh('torus', 'y', greenColor, new Vector3(0, 0, 0), new Euler(Math.PI / 2, 0, 0), this.rotateCircleRadius); this._rotateControlMap.set('y', axisY); this.add(axisY); const pickY = new GizmoMesh('torus', 'y', whiteColor, new Vector3(0, 0, 0), new Euler(Math.PI / 2, 0, 0), this.rotateCircleRadius, Math.PI, 0.2); pickY.visible = false; this._pickHelper.set('y', pickY); this.add(pickY); this._axisYQuaternionStart = axisY.quaternion.clone(); const axisX = new GizmoMesh('torus', 'x', redColor, new Vector3(0, 0, 0), new Euler(0, Math.PI / 2, Math.PI / 2), this.rotateCircleRadius); this._rotateControlMap.set('x', axisX); this.add(axisX); const pickX = new GizmoMesh('torus', 'x', whiteColor, new Vector3(0, 0, 0), new Euler(0, Math.PI / 2, Math.PI / 2), this.rotateCircleRadius, Math.PI, 0.2); pickX.visible = false; this._pickHelper.set('x', pickX); this.add(pickX); this._axisXQuaternionStart = axisX.quaternion.clone(); const center = new GizmoMesh('sphere', 'xyz', whiteColor, new Vector3(0, 0, 0), new Euler(0, 0, 0), this.rotateCircleRadius); this._rotateControlMap.set('xyz', center); this.add(center); this._lineHelperS = new GizmoMesh('linehelper', 'helperS', yellowColor); this._lineHelperS.visible = false; this.add(this._lineHelperS); this._lineHelperE = new GizmoMesh('linehelper', 'helperE', yellowColor); this._lineHelperE.visible = false; this.add(this._lineHelperE); this._rotateHelper = new GizmoMesh('rotatehelper', 'rotatehelper', yellowColor); this._rotateHelper.visible = false; this.add(this._rotateHelper); } onHoverStart(axisName) { this._selectedAxis = axisName; const currentAxis = this._rotateControlMap.get(this._selectedAxis); currentAxis.highlight(); } onHoverEnd() { const currentAxis = this._rotateControlMap.get(this._selectedAxis); currentAxis.unhighlight(); this._selectedAxis = null; } onMoveStart(ray, axisName) { this._selectedAxis = axisName; super.onMoveStart(ray, axisName); const cameraPos = _vec3_1.setFromMatrixPosition(this._camera.worldMatrix); const gizmoPos = _vec3_2.setFromMatrixPosition(this._startGroupMatrix); const eye = _vec3_3.subVectors(cameraPos, gizmoPos).normalize(); eye.transformDirection(this._startGroupMatrixInverse); this._eye.copy(eye); this._calRayIntersection(ray, this._startPointUnit); if (this._selectedAxis !== 'xyz') { this._lineHelperS.visible = true; this._lineHelperS.geometry.updateLine(_vec3_1.set(0, 0, 0), this._startPointUnit); } this._rotateControlMap.forEach((value, key) => { if (key === axisName) { if (axisName === 'xyz') { value.highlight(); } else { value.yellow(); } } else { value.visible = false; } }); if (this._selectedAxis !== 'e' && this._selectedAxis !== 'xyz') { this._rotateControlMap.get(this._selectedAxis).geometry.updateTorus(this.rotateCircleRadius, Math.PI * 2); } this._needsUpdate = false; } onMove(ray) { this._calRayIntersection(ray, this._currPointUnit); let localAxis, rad; if (this._selectedAxis === 'xyz') { _vec3_1.copy(this._currPointUnit).sub(this._startPointUnit); localAxis = _vec3_3.copy(_vec3_1).cross(this._eye).normalize(); rad = _vec3_1.dot(_vec3_2.copy(localAxis).cross(this._eye)); } else { if (this._selectedAxis === 'e') { localAxis = this._eye; rad = this._getFinalRad(localAxis, this.rotateCircleRadiusE); } else { localAxis = axisVector[this._selectedAxis]; rad = this._getFinalRad(localAxis, this.rotateCircleRadius); } } _quat_1.setFromAxisAngle(localAxis, rad); if (this.snap && this._selectedAxis !== 'e') { _euler_1.setFromQuaternion(_quat_1); this._applySnap(_euler_1); _quat_1.setFromEuler(_euler_1); // fix rad if (this._selectedAxis === 'x') { rad = this._getSnapRad(_euler_1.x, rad); } else if (this._selectedAxis === 'y') { rad = this._getSnapRad(_euler_1.y, rad, true); } else if (this._selectedAxis === 'z') { rad = this._getSnapRad(_euler_1.z, rad); } } _mat4_1.identity(); _quat_1.toMatrix4(_mat4_1); if (this._selectedAxis !== 'xyz') { this._rotateHelper.geometry.updateCircle(this._startPointUnit, localAxis, -rad); this._rotateHelper.visible = true; _quat_1.setFromAxisAngle(localAxis, -rad); _vec3_2.copy(this._startPointUnit).applyQuaternion(_quat_1); this._lineHelperE.geometry.updateLine(_vec3_1.set(0, 0, 0), _vec3_2); this._lineHelperE.visible = true; } _mat4_1.premultiply(this._startGroupMatrix); this._group.setWorldMatrix(_mat4_1); } onMoveEnd() { this._rotateHelper.visible = false; this._lineHelperS.visible = false; this._lineHelperE.visible = false; this._finalRad = 0; this._previousRad = 0; if (this._selectedAxis !== 'e' && this._selectedAxis !== 'xyz') { this._rotateControlMap.get(this._selectedAxis).geometry.updateTorus(this.rotateCircleRadius, Math.PI); } this._rotateControlMap.forEach(control => { control.material.diffuse.copy(control.material._color); control.material.opacity = control.material._opacity; control.visible = true; }); this._needsUpdate = true; super.onMoveEnd(); } _calRayIntersection(ray, out) { // transform ray to local space ray.origin.applyMatrix4(this._startGroupMatrixInverse); ray.direction.transformDirection(this._startGroupMatrixInverse); if (this._selectedAxis === 'e') { this._plane.normal.copy(this._eye); ray.intersectPlane(this._plane, out); out.normalize().multiplyScalar(this.rotateCircleRadiusE); } else if (this._selectedAxis === 'xyz') { this._plane.normal.copy(this._eye); ray.intersectPlane(this._plane, out); } else { ray.intersectPlane(axisPlane[this._selectedAxis], out); out.normalize().multiplyScalar(this.rotateCircleRadius); } } _getFinalRad(rotateAxis, radius) { const p1 = this._startPointUnit; const p2 = this._currPointUnit; const dot = p1.dot(p2); _vec3_1.crossVectors(p1, p2); const direction = _vec3_1.dot(rotateAxis); const currentCos = Math.min(1, Math.max(-1, dot / (radius * radius))); // clamp value to the range [-1, 1] to prevent NaN const currentRad = Math.sign(direction) * Math.acos(currentCos); const incrementRad = currentRad - this._previousRad; if (this._previousRad * currentRad < 0) { Math.abs(currentRad) < Math.PI / 2 ? (this._finalRad += incrementRad) : (this._finalRad += -Math.sign(incrementRad) * (2 * Math.PI - Math.abs(incrementRad))); } else { this._finalRad += incrementRad; } this._previousRad = currentRad; return this._finalRad; } _getSnapRad(euler, rad, isY = false) { const period = isY ? Math.PI : Math.PI * 2; let finalRad; if (Math.abs(rad) % period <= (period / 2)) { finalRad = euler; } else { if (Math.sign(euler) === 0) { finalRad = Math.sign(rad) * (period - Math.abs(euler)); } else { finalRad = (isY ? 1 : -1) * Math.sign(euler) * (period - Math.abs(euler)); } } if (Math.abs(rad) >= period) { if (isY) { finalRad = Math.sign(rad) * Math.abs(finalRad); } finalRad += Math.sign(rad) * Math.floor(Math.abs(rad) / period) * period; } return finalRad; } update() { this._resizeControl(); this._updateAxisTransform(); } _updateAxisTransform() { if (!this._needsUpdate) return; const cameraPos = _vec3_1.setFromMatrixPosition(this._camera.worldMatrix); const gizmoPos = _vec3_2.setFromMatrixPosition(this.worldMatrix); const eye = _vec3_3.subVectors(cameraPos, gizmoPos).normalize(); eye.transformDirection(_mat4_1.copy(this.worldMatrix).invert()); this._eye.copy(eye); const { x, y, z } = eye; _quat_1.setFromAxisAngle(axisVector['z'], Math.atan2(-y, z)); _quat_1.multiplyQuaternions(this._axisXQuaternionStart, _quat_1); this._rotateControlMap.get('x').quaternion.copy(_quat_1); this._pickHelper.get('x').quaternion.copy(_quat_1); _quat_1.setFromAxisAngle(axisVector['z'], Math.atan2(-x, z)); _quat_1.multiplyQuaternions(this._axisYQuaternionStart, _quat_1); this._rotateControlMap.get('y').quaternion.copy(_quat_1); this._pickHelper.get('y').quaternion.copy(_quat_1); _quat_1.setFromAxisAngle(axisVector['z'], Math.atan2(y, x)); _quat_1.multiplyQuaternions(this._axisZQuaternionStart, _quat_1); this._rotateControlMap.get('z').quaternion.copy(_quat_1); this._pickHelper.get('z').quaternion.copy(_quat_1); this._rotateControlMap.get('e').quaternion.setFromRotationMatrix(_mat4_1.lookAtRH(eye, _vec3_1.set(0, 0, 0), axisVector['z'])); this._pickHelper.get('e').quaternion.setFromRotationMatrix(_mat4_1.lookAtRH(eye, _vec3_1.set(0, 0, 0), axisVector['z'])); } _resizeControl() { this._group.getWorldMatrix(_mat4_1); const ele = this._camera.projectionMatrix.elements; let factor; if (ele[15] > 0) { factor = 2 / ele[5]; } else { _vec3_1.setFromMatrixPosition(_mat4_1); _vec3_2.setFromMatrixPosition(this._camera.worldMatrix); factor = _vec3_1.distanceTo(_vec3_2) * Math.min(1.9 / ele[5], 7); } factor *= this.size / 8; this.worldMatrix.copy(_mat4_1); const parentMatrixInverse = _mat4_1.copy(this.parent.worldMatrix).invert(); this.matrix.multiplyMatrices(parentMatrixInverse, this.worldMatrix); this.matrix.decompose(this.position, this.quaternion, this.scale); this.scale.multiplyScalar(factor); } _applySnap(target) { const snap = this.snap; if (!snap) return; this._startLocalMatrix.decompose(_position, _quaternion, _scale); _euler_2.setFromQuaternion(_quaternion); if (target.x) { target.x += _euler_2.x; target.x = Math.round(target.x / snap) * snap; target.x -= _euler_2.x; } if (target.y) { target.y += _euler_2.y; target.y = Math.round(target.y / snap) * snap; target.y -= _euler_2.y; } if (target.z) { target.z += _euler_2.z; target.z = Math.round(target.z / snap) * snap; target.z -= _euler_2.z; } } } // GizmoMesh and geometries class GizmoMesh extends Mesh { constructor(type, name, color, position, rotation, size, arc, tube) { const material = new GizmoMaterial(); let geometry; switch (type) { case 'line': geometry = new CylinderGeometry(0.02, 0.02, size); break; case 'arrow': geometry = new CylinderGeometry(0, 0.08, 0.3); break; case 'pickAxis': geometry = new CylinderGeometry(0.3, 0, 1.5, 4); break; case 'plane': geometry = new PlaneGeometry(size, size); material.opacity = 0.9; break; case 'box': geometry = new BoxGeometry(size, size, size); break; case 'torus': geometry = new RotateTorusGeometry(size, arc, tube); break; case 'sphere': geometry = new SphereGeometry(size, 32, 16); material.opacity = 0; break; case 'linehelper': case 'axishelper': geometry = new LineHelperGeometry(new Vector3(0, 0, 0), new Vector3(1, 0, 0)); material.drawMode = DRAW_MODE.LINES; break; case 'rotatehelper': geometry = new RotateHelperGeometry(); material.opacity = 0.2; break; default: break; } super(geometry, material); material.diffuse.fromArray(color); material._color = material.diffuse.clone(); material._opacity = material.opacity; this.name = name; this.receiveShadows = false; this.castShadows = false; this.renderOrder = gizmoRenderOrder; if (type === 'axishelper') { this.frustumCulled = false; this.scale.x = 1e6; } rotation && this.euler.copy(rotation); position && this.position.copy(position); } highlight() { this.material.diffuse.r = this.material.diffuse.r + 0.3; this.material.diffuse.g = this.material.diffuse.g + 0.3; this.material.diffuse.b = this.material.diffuse.b + 0.3; this.material.opacity = this.material.opacity + 0.1; } unhighlight() { this.material.diffuse.copy(this.material._color); this.material.opacity = this.material._opacity; } yellow() { this.material.diffuse.fromArray(yellowColor); } } const gizmoFragmentShader = ShaderLib.basic_frag.replace('#include ', ''); class GizmoMaterial extends BasicMaterial { constructor() { super(); this.type = MATERIAL_TYPE.SHADER; this.shaderName = 'gizmo'; this.vertexShader = ShaderLib.basic_vert; this.fragmentShader = gizmoFragmentShader; this.transparent = true; this.depthTest = false; this.side = DRAW_SIDE.DOUBLE; } } class RotateTorusGeometry extends Geometry { constructor(radius = 1, arc = Math.PI, tube = 0.02) { super(); const param = TorusBuilder.getGeometryData(radius, tube, 6, 48, arc); // build geometry this.setIndex(new Attribute(new Buffer( (param.positions.length / 3) > 65536 ? new Uint32Array(param.indices) : new Uint16Array(param.indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(param.positions), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(param.normals), 3))); this.computeBoundingBox(); this.computeBoundingSphere(); } updateTorus(radius = 1, arc = Math.PI) { const param = TorusBuilder.getGeometryData(radius, 0.02, 6, 48, arc); this.getAttribute('a_Position').buffer.array.set(param.positions); this.getAttribute('a_Normal').buffer.array.set(param.normals); this.getAttribute('a_Position').buffer.version++; this.getAttribute('a_Normal').buffer.version++; this.computeBoundingBox(); this.computeBoundingSphere(); } } const _tempQuat = new Quaternion(); const _tempVect = new Vector3(); class RotateHelperGeometry extends Geometry { constructor() { super(); this.defaultCenter = new Vector3(0, 0, 0); const param = this._generateData(new Vector3(0, 1, 0), new Vector3(1, 0, 0), Math.PI * 10, this.defaultCenter, 16); this.setIndex(new Attribute(new Buffer( (param.vertices.length / 3) > 65536 ? new Uint32Array(param.indices) : new Uint16Array(param.indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(param.vertices), 3))); } updateCircle(startPoint, normal, thetaLength) { if (Math.abs(thetaLength) > Math.PI * 10) return; const param = this._generateData(startPoint, normal, thetaLength, this.defaultCenter, 16); this.index.buffer.array.set(param.indices); this.index.buffer.count = param.indices.length; this.index.buffer.version++; this.getAttribute('a_Position').buffer.array.set(param.vertices); this.getAttribute('a_Position').buffer.count = param.vertices.length / 3; this.getAttribute('a_Position').buffer.version++; } _generateData(startPoint, normal, thetaLength, center, segmentFactor) { const newSegments = Math.abs(Math.ceil((segmentFactor * thetaLength) / Math.PI)); const segments = Math.max(6, newSegments); const indices = []; const vertices = []; // indices for (let i = 1; i <= segments; i++) { indices.push(i, i + 1, 0); } vertices.push(center.x, center.y, center.z); // vertices for (let s = 0; s <= segments; s++) { const segment = (s / segments) * thetaLength; _tempQuat.setFromAxisAngle(normal, segment); _tempVect.copy(startPoint).applyQuaternion(_tempQuat); vertices.push(_tempVect.x, _tempVect.y, _tempVect.z); } return { indices, vertices }; } } class LineHelperGeometry extends Geometry { constructor(startPoint, endPoint) { super(); const vertices = [ startPoint.x, startPoint.y, startPoint.z, endPoint.x, endPoint.y, endPoint.z ]; this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); } updateLine(startPoint, endPoint) { const vertices = [ startPoint.x, startPoint.y, startPoint.z, endPoint.x, endPoint.y, endPoint.z ]; this.getAttribute('a_Position').buffer.array.set(vertices); this.getAttribute('a_Position').buffer.version++; } } export { TransformControls }; ================================================ FILE: examples/jsm/controls/ViewControls.js ================================================ import { Vector3, Quaternion, Euler, MathUtils, Object3D } from 't3d'; class ViewControls { constructor(camera, options) { this.camera = camera; this.target = options.target || new Vector3(0, 0, 0); this.up = options.up || new Vector3(0, 1, 0); this.interactive = options.interactive !== undefined ? options.interactive : true; this.size = options.size || 100; this.padding = options.padding || 10; this.pointRadius = options.pointRadius || 10; this.font = options.font || 'bold 16px Arial'; this.fontColor = options.fontColor || '#ffffff'; this.lineWidth = options.lineWidth || 2; const canvas = document.createElement('canvas'); canvas.width = this.size; canvas.height = this.size; canvas.style.cssText = options.style || 'position:fixed;top:0;right:0;opacity:0.9;z-index:10000;user-select:none;'; this.domElement = canvas; this._context = canvas.getContext('2d', { alpha: true }); this._points = [ { axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) }, { axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) }, { axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) }, { axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) }, { axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) }, { axisIndex: 0, position: new Vector3(0, 0, 0), linePosition: new Vector3(0, 0, 0) } ]; this._animating = false; this._targetPosition = new Vector3(); this._targetQuaternion = new Quaternion(); this._q1 = new Quaternion(); this._q2 = new Quaternion(); this._lastQuaternion = new Quaternion(); this.needsUpdate = true; const scope = this; this._onContextMenu = function(event) { event.preventDefault() }; let isDragging = false; let pointerDownPosition = null; this._onPointerDown = function(event) { if (!scope.interactive) return; isDragging = false; pointerDownPosition = { x: event.clientX, y: event.clientY }; }; this._onPointerMove = function(event) { if (!scope.interactive) return; if (pointerDownPosition) { const dx = event.clientX - pointerDownPosition.x; const dy = event.clientY - pointerDownPosition.y; if (dx * dx + dy * dy > 20) { isDragging = true; } } }; this._onPointerUp = function(event) { if (!scope.interactive) return; if (!isDragging && !scope._animating) { const pointer = event.changedTouches ? event.changedTouches[0] : event; const point = scope._raycast(pointer); if (point) { scope._prepareAnimationData(point.axisIndex); scope._animating = true; } } pointerDownPosition = null; }; this.domElement.addEventListener('contextmenu', this._onContextMenu); this.domElement.addEventListener('pointerdown', this._onPointerDown); this.domElement.addEventListener('pointermove', this._onPointerMove); this.domElement.addEventListener('pointerup', this._onPointerUp); } dispose() { this.domElement.removeEventListener('contextmenu', this._onContextMenu); this.domElement.removeEventListener('pointerdown', this._onPointerDown); this.domElement.removeEventListener('pointermove', this._onPointerMove); this.domElement.removeEventListener('pointerup', this._onPointerUp); } update(delta) { const camera = this.camera; // update canvas if (1 - this._lastQuaternion.dot(camera.quaternion) > 0.00001 || this.needsUpdate) { this._lastQuaternion.copy(camera.quaternion); this.needsUpdate = false; const halfSize = this.size / 2; for (let i = 0; i < _axisPoints.length; i++) { const _axisPoint = _axisPoints[i]; const _point = this._points[i]; _point.axisIndex = i; _quat_1.copy(camera.quaternion).conjugate(); const distance = halfSize - this.pointRadius - this.padding; const distance2 = Math.max(halfSize - this.pointRadius * 2 - this.padding, 0.0001); _point.position.copy(_axisPoint.direction).multiplyScalar(distance).applyQuaternion(_quat_1); _point.linePosition.copy(_axisPoint.direction).multiplyScalar(distance2).applyQuaternion(_quat_1); _point.position.x = _point.position.x + halfSize; _point.position.y = -_point.position.y + halfSize; _point.linePosition.x = _point.linePosition.x + halfSize; _point.linePosition.y = -_point.linePosition.y + halfSize; } this._points.sort(depthSort); // clear canvas this._context.clearRect(0, 0, this.size, this.size); this._context.textAlign = 'center'; this._context.textBaseline = 'middle'; // draw front points for (let i = 0; i < 3; i++) { const point = this._points[i]; this._drawPoint(point, _axisPoints[point.axisIndex]); } // draw lines for (let i = 0; i < 6; i++) { const _point = this._points[i]; if (_point.axisIndex % 2 === 0) { this._drawLine(_point, _axisPoints[_point.axisIndex]); } } // draw back points for (let i = 3; i < 6; i++) { const point = this._points[i]; this._drawPoint(point, _axisPoints[point.axisIndex]); } } // animate if (this._animating) { const step = delta * twoPI; rotateTowards(this._q2, step, this._q1); const radius = camera.position.distanceTo(this.target); camera.position.set(0, 0, 1).applyQuaternion(this._q1).multiplyScalar(radius).add(this.target); rotateTowards(this._targetQuaternion, step, camera.quaternion); if (angleTo(this._q1, this._q2) === 0) { this._animating = false; } } } _drawPoint(point, axisPoint) { const context = this._context; context.fillStyle = axisPoint.color; context.beginPath(); context.arc(point.position.x, point.position.y, this.pointRadius, 0, twoPI); context.fill(); context.fillStyle = this.fontColor; context.font = this.font; context.fillText(axisPoint.name, point.position.x, point.position.y); } _drawLine(point, axisPoint) { const context = this._context; const halfSize = this.size / 2; context.strokeStyle = axisPoint.color; context.lineWidth = this.lineWidth; context.lineCap = 'round'; context.beginPath(); context.moveTo(halfSize, halfSize); context.lineTo(point.linePosition.x, point.linePosition.y); context.stroke(); } _raycast(event) { const rect = this.domElement.getBoundingClientRect(); const x = event.clientX - rect.left; const y = event.clientY - rect.top; for (let i = this._points.length - 1; i >= 0; i--) { const _point = this._points[i]; const distance = _point.position.distanceTo(_vec3_1.set(x, y, _point.position.z)); if (distance <= this.pointRadius) { return _point; } } return null; } _prepareAnimationData(axisIndex) { const camera = this.camera; const target = this.target; const up = this.up; const targetPosition = this._targetPosition; const targetQuaternion = this._targetQuaternion; const q1 = this._q1; const q2 = this._q2; targetPosition.copy(_axisPoints[axisIndex].direction); targetQuaternion.setFromEuler(_rotationTargets[axisIndex]); const radius = camera.position.distanceTo(target); targetPosition.multiplyScalar(radius).add(target); dummy.position.copy(target); dummy.lookAt(camera.position, up); q1.copy(dummy.quaternion); dummy.lookAt(targetPosition, up); q2.copy(dummy.quaternion); } } const _axisPoints = [ { name: 'x', color: '#ff3653', direction: new Vector3(1, 0, 0) }, { name: '-x', color: '#ff3653', direction: new Vector3(-1, 0, 0) }, { name: 'y', color: '#8adb00', direction: new Vector3(0, 1, 0) }, { name: '-y', color: '#8adb00', direction: new Vector3(0, -1, 0) }, { name: 'z', color: '#2c8fff', direction: new Vector3(0, 0, 1) }, { name: '-z', color: '#2c8fff', direction: new Vector3(0, 0, -1) } ]; const _rotationTargets = [ new Euler(0, Math.PI * 0.5, 0), new Euler(0, -Math.PI * 0.5, 0), new Euler(-Math.PI * 0.5, 0, 0), new Euler(Math.PI * 0.5, 0, 0), new Euler(), new Euler(0, Math.PI, 0) ]; const twoPI = Math.PI * 2; const _vec3_1 = new Vector3(); const _quat_1 = new Quaternion(); function depthSort(a, b) { return a.position.z - b.position.z; } const dummy = new Object3D(); function rotateTowards(q, step, target) { const angle = angleTo(target, q); if (angle === 0) return target; const t = Math.min(1, step / angle); target.slerpQuaternions(target, q, t); return target; } function angleTo(q1, q2) { return 2 * Math.acos(Math.abs(MathUtils.clamp(q1.dot(q2), -1, 1))); } export { ViewControls }; ================================================ FILE: examples/jsm/exporters/DRACOExporter.js ================================================ /** * Export draco compressed files from t3d geometry objects. * * Draco files are compressed and usually are smaller than conventional 3D file formats. * * The exporter receives a options object containing * - pointCloud, indicates if the geometry is a point cloud or a mesh * - decodeSpeed, indicates how to tune the encoder regarding decode speed (0 gives better speed but worst quality) * - encodeSpeed, indicates how to tune the encoder parameters (0 gives better speed but worst quality) * - encoderMethod * - quantization, indicates the presision of each type of data stored in the draco file in the order (POSITION, NORMAL, COLOR, TEX_COORD, GENERIC) */ class DRACOExporter { parse(geometry, options = {}) { options = Object.assign({ pointCloud: false, decodeSpeed: 5, encodeSpeed: 5, encoderMethod: ENCODER_METHOD.EDGEBREAKER, quantization: [16, 8, 8, 8, 8] }, options); if (DracoEncoderModule === undefined) { throw new Error('DRACOExporter: required the draco_encoder to work.'); } const dracoEncoder = DracoEncoderModule(); const encoder = new dracoEncoder.Encoder(); let builder; let dracoObject; const dracoAttributes = {}; let darcoAttributeID = 0; const positionAttribute = geometry.getAttribute('a_Position'); const positionBuffer = positionAttribute.buffer; if (options.pointCloud === true) { builder = new dracoEncoder.PointCloudBuilder(); dracoObject = new dracoEncoder.PointCloud(); } else { builder = new dracoEncoder.MeshBuilder(); dracoObject = new dracoEncoder.Mesh(); const faceAttribute = geometry.index; if (faceAttribute !== null) { const faceBuffer = faceAttribute.buffer; builder.AddFacesToMesh(dracoObject, faceBuffer.count / 3, faceBuffer.array); } else { const faces = new (positionBuffer.count > 65535 ? Uint32Array : Uint16Array)(positionBuffer.count); for (let i = 0; i < faces.length; i++) { faces[i] = i; } builder.AddFacesToMesh(dracoObject, positionBuffer.count, faces); } } builder.AddFloatAttribute(dracoObject, dracoEncoder.POSITION, positionBuffer.count, positionAttribute.size, positionBuffer.array); dracoAttributes.POSITION = darcoAttributeID++; for (const attributeName in geometry.attributes) { if (attributeName === 'a_Position') continue; const gltfAttributeName = ATTRIBUTE_NAME_TO_GLTF[attributeName] || attributeName; // Skip custom attributes if (validVertexAttributes.test(gltfAttributeName) === false) continue; let attributeType; if (attributeName === 'a_Normal') attributeType = dracoEncoder.NORMAL; else if (attributeName === 'a_Color') attributeType = dracoEncoder.COLOR; else if (attributeName.startsWith('a_Uv')) attributeType = dracoEncoder.TEX_COORD; else attributeType = dracoEncoder.GENERIC; const attribute = geometry.attributes[attributeName]; const buffer = attribute.buffer; if (buffer.array instanceof Float32Array) { builder.AddFloatAttribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array); } else if (buffer.array instanceof Uint32Array) { builder.AddUInt32Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array); } else if (buffer.array instanceof Uint16Array) { builder.AddUInt16Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array); } else if (buffer.array instanceof Uint8Array) { builder.AddUInt8Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array); } else if (buffer.array instanceof Int32Array) { builder.AddInt32Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array); } else if (buffer.array instanceof Int16Array) { builder.AddInt16Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array); } else if (buffer.array instanceof Int8Array) { builder.AddInt8Attribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array); } else { builder.AddFloatAttribute(dracoObject, attributeType, buffer.count, attribute.size, buffer.array); } dracoAttributes[gltfAttributeName] = darcoAttributeID++; } // Compress using draco encoder const encodedData = new dracoEncoder.DracoInt8Array(); // Sets the desired encoding and decoding speed for the given options from 0 (slowest speed, but the best compression) to 10 (fastest, but the worst compression). const { encodeSpeed, decodeSpeed } = options; encoder.SetSpeedOptions(encodeSpeed, decodeSpeed); // Sets the desired encoding method for a given geometry. encoder.SetEncodingMethod(options.encoderMethod); // Sets the quantization (number of bits used to represent) compression options for a named attribute. // The attribute values will be quantized in a box defined by the maximum extent of the attribute values. for (let i = 0; i < 5; i++) { if (options.quantization[i] !== undefined) { encoder.SetAttributeQuantization(i, options.quantization[i]); } } let length; if (options.pointCloud === true) { length = encoder.EncodePointCloudToDracoBuffer(dracoObject, true, encodedData); } else { length = encoder.EncodeMeshToDracoBuffer(dracoObject, encodedData); } dracoEncoder.destroy(dracoObject); if (length === 0) { throw new Error('DRACOExporter: Draco encoding failed.'); } // Copy encoded data to buffer. const outputData = new Int8Array(new ArrayBuffer(length)); for (let i = 0; i < length; i++) { outputData[i] = encodedData.GetValue(i); } dracoEncoder.destroy(encodedData); dracoEncoder.destroy(encoder); dracoEncoder.destroy(builder); return { buffer: outputData, attributes: dracoAttributes }; } } /* global DracoEncoderModule */ const ENCODER_METHOD = { EDGEBREAKER: 1, SEQUENTIAL: 0 }; const ATTRIBUTE_NAME_TO_GLTF = { a_Position: 'POSITION', a_Normal: 'NORMAL', a_Tangent: 'TANGENT', a_Uv: 'TEXCOORD_0', a_Uv2: 'TEXCOORD_1', a_Uv3: 'TEXCOORD_2', a_Uv4: 'TEXCOORD_3', a_Uv5: 'TEXCOORD_4', a_Uv6: 'TEXCOORD_5', a_Uv7: 'TEXCOORD_6', a_Uv8: 'TEXCOORD_7', a_Color: 'COLOR_0', skinWeight: 'WEIGHTS_0', skinIndex: 'JOINTS_0' }; // Prefix all geometry attributes except the ones specifically // listed in the spec; non-spec attributes are considered custom. const validVertexAttributes = /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/; export { DRACOExporter, ENCODER_METHOD }; ================================================ FILE: examples/jsm/exporters/GLTFExporter.js ================================================ import { Attribute, Buffer, CubicSplineInterpolant, DRAW_MODE, DRAW_SIDE, MATERIAL_TYPE, Matrix4, Object3D, PIXEL_FORMAT, Quaternion, QuaternionCubicSplineInterpolant, StepInterpolant, TEXEL_ENCODING_TYPE, TEXTURE_FILTER, TEXTURE_WRAP, Vector3 } from 't3d'; /** * GLTF Exporter * ref: https://github.com/mrdoob/three.js/blob/master/examples/jsm/exporters/GLTFExporter.js * more: * - add wrapRoot option * - add draco compression option * - add support for `GLTF_SEPARATE` format * - add support for ignoreForExport flag on Object3D * todo: * - export cameras * - support compressed texture * - support GLTFMaterialsClearcoatExtension * - support GLTFMaterialsSpecularExtension */ class GLTFExporter { constructor() { this.extensions = []; this.dracoOptions = {}; this._dracoExporter = null; this.register(GLTFMaterialsUnlitExtension); this.register(GLTFMeshGpuInstancingExtension); } register(extension) { if (this.extensions.indexOf(extension) === -1) { this.extensions.push(extension); } return this; } unregister(extension) { const index = this.extensions.indexOf(extension); if (index !== -1) { this.extensions.splice(index, 1); } return this; } setDRACOExporter(dracoExporter) { this._dracoExporter = dracoExporter; return this; } getDRACOExporter() { return this._dracoExporter; } /** * Parse input root object(s) and generate GLTF output * @param {Object3D|Object3D[]} input root object(s) * @param {Function} onDone Callback on completed * @param {Function} onError Callback on errors * @param {object} options options */ parse(input, onDone, onError, options) { const writer = new GLTFWriter(); const plugins = this.extensions.map(_ext => new _ext(writer)); writer.setPlugins(plugins); writer.dracoOptions = this.dracoOptions; writer.setDRACOExporter(this._dracoExporter); writer.writeAsync(input, onDone, options).catch(onError); } parseAsync(input, options) { return new Promise((resolve, reject) => { this.parse(input, resolve, reject, options); }); } } // ------------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------------ const GLTF_FORMAT = { GLTF: 'GLTF', GLTF_SEPARATE: 'GLTF_SEPARATE', GLB: 'GLB' }; const GLTF_CONSTANTS = { BYTE: 0x1400, UNSIGNED_BYTE: 0x1401, SHORT: 0x1402, UNSIGNED_SHORT: 0x1403, INT: 0x1404, UNSIGNED_INT: 0x1405, FLOAT: 0x1406, ARRAY_BUFFER: 0x8892, ELEMENT_ARRAY_BUFFER: 0x8893, NEAREST: 0x2600, LINEAR: 0x2601, NEAREST_MIPMAP_NEAREST: 0x2700, LINEAR_MIPMAP_NEAREST: 0x2701, NEAREST_MIPMAP_LINEAR: 0x2702, LINEAR_MIPMAP_LINEAR: 0x2703, CLAMP_TO_EDGE: 33071, MIRRORED_REPEAT: 33648, REPEAT: 10497 }; const DRAW_MODE_TO_GLTF = { [DRAW_MODE.POINTS]: 0, [DRAW_MODE.LINES]: 1, [DRAW_MODE.LINE_LOOP]: 2, [DRAW_MODE.LINE_STRIP]: 3, [DRAW_MODE.TRIANGLES]: 4, [DRAW_MODE.TRIANGLE_STRIP]: 5, [DRAW_MODE.TRIANGLE_FAN]: 6 }; const ATTRIBUTE_NAME_TO_GLTF = { a_Position: 'POSITION', a_Normal: 'NORMAL', a_Tangent: 'TANGENT', a_Uv: 'TEXCOORD_0', a_Uv2: 'TEXCOORD_1', a_Uv3: 'TEXCOORD_2', a_Uv4: 'TEXCOORD_3', a_Uv5: 'TEXCOORD_4', a_Uv6: 'TEXCOORD_5', a_Uv7: 'TEXCOORD_6', a_Uv8: 'TEXCOORD_7', a_Color: 'COLOR_0', skinWeight: 'WEIGHTS_0', skinIndex: 'JOINTS_0' }; const INTERPOLANT_TO_GLTF = new WeakMap([ [QuaternionCubicSplineInterpolant, 'CUBICSPLINE'], [CubicSplineInterpolant, 'CUBICSPLINE'], [StepInterpolant, 'STEP'] ]); // Prefix all geometry attributes except the ones specifically // listed in the spec; non-spec attributes are considered custom. const validVertexAttributes = /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/; const KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization'; // The KHR_mesh_quantization extension allows these extra attribute component types // https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes const KHR_mesh_quantization_ExtraAttrTypes = { POSITION: [ 'byte', 'byte normalized', 'unsigned byte', 'unsigned byte normalized', 'short', 'short normalized', 'unsigned short', 'unsigned short normalized' ], NORMAL: [ 'byte normalized', 'short normalized' ], TANGENT: [ 'byte normalized', 'short normalized' ], TEXCOORD: [ 'byte', 'byte normalized', 'unsigned byte', 'short', 'short normalized', 'unsigned short' ] }; const PATH_PROPERTIES = { scale: 'scale', position: 'translation', quaternion: 'rotation', morphTargetInfluences: 'weights' }; const T3D_TO_GLTF = {}; T3D_TO_GLTF[TEXTURE_FILTER.NEAREST] = GLTF_CONSTANTS.NEAREST; T3D_TO_GLTF[TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST] = GLTF_CONSTANTS.NEAREST_MIPMAP_NEAREST; T3D_TO_GLTF[TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR] = GLTF_CONSTANTS.NEAREST_MIPMAP_LINEAR; T3D_TO_GLTF[TEXTURE_FILTER.LINEAR] = GLTF_CONSTANTS.LINEAR; T3D_TO_GLTF[TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST] = GLTF_CONSTANTS.LINEAR_MIPMAP_NEAREST; T3D_TO_GLTF[TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR] = GLTF_CONSTANTS.LINEAR_MIPMAP_LINEAR; T3D_TO_GLTF[TEXTURE_WRAP.CLAMP_TO_EDGE] = GLTF_CONSTANTS.CLAMP_TO_EDGE; T3D_TO_GLTF[TEXTURE_WRAP.REPEAT] = GLTF_CONSTANTS.REPEAT; T3D_TO_GLTF[TEXTURE_WRAP.MIRRORED_REPEAT] = GLTF_CONSTANTS.MIRRORED_REPEAT; // GLB constants // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification const GLB_HEADER_BYTES = 12; const GLB_HEADER_MAGIC = 0x46546C67; const GLB_VERSION = 2; const GLB_CHUNK_PREFIX_BYTES = 8; const GLB_CHUNK_TYPE_JSON = 0x4E4F534A; const GLB_CHUNK_TYPE_BIN = 0x004E4942; // ------------------------------------------------------------------------------ // Utility functions // ------------------------------------------------------------------------------ function createAttributesKey(attributes) { let attributesKey = ''; const keys = Object.keys(attributes).sort(); for (let i = 0, il = keys.length; i < il; i++) { attributesKey += keys[i] + ':' + attributes[keys[i]] + ';'; } return attributesKey; } function decompose(matrix3) { const tx = matrix3.elements[2]; const ty = matrix3.elements[5]; const sx = Math.sqrt(matrix3.elements[0] * matrix3.elements[0] + matrix3.elements[1] * matrix3.elements[1]); const sy = Math.sqrt(matrix3.elements[3] * matrix3.elements[3] + matrix3.elements[4] * matrix3.elements[4]); const rotation = Math.atan2(matrix3.elements[1], matrix3.elements[0]); const cx = 0; const cy = 0; return { tx, ty, sx, sy, rotation, cx, cy }; } /** * Compare two arrays * @param {Array} array1 Array 1 to compare * @param {Array} array2 Array 2 to compare * @returns {boolean} Returns true if both arrays are equal */ function equalArray(array1, array2) { return (array1.length === array2.length) && array1.every(function(element, index) { return element === array2[index]; }); } /** * Converts a string to an ArrayBuffer. * @param {string} text * @returns {ArrayBuffer} */ function stringToArrayBuffer(text) { return new TextEncoder().encode(text).buffer; } /** * Is identity matrix * @param {Matrix4} matrix * @returns {boolean} Returns true, if parameter is identity matrix */ function isIdentityMatrix(matrix) { return equalArray(matrix.elements, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); } /** * Get the min and max vectors from the given attribute * @param {Attribute} attribute Attribute to find the min/max in range from start to start + count * @param {Integer} start * @param {Integer} count * @returns {object} Object containing the `min` and `max` values (As an array of attribute.size components) */ function getMinMax(attribute, start, count) { const output = { min: new Array(attribute.size).fill(Number.POSITIVE_INFINITY), max: new Array(attribute.size).fill(Number.NEGATIVE_INFINITY) }; for (let i = start; i < start + count; i++) { for (let a = 0; a < attribute.size; a++) { const value = attribute.buffer.array[i * attribute.size + a]; output.min[a] = Math.min(output.min[a], value); output.max[a] = Math.max(output.max[a], value); } } return output; } /** * Get the required size + padding for a buffer, rounded to the next 4-byte boundary. * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment * @param {Integer} bufferSize The size the original buffer. * @returns {Integer} new buffer size with required padding. */ function getPaddedBufferSize(bufferSize) { return Math.ceil(bufferSize / 4) * 4; } /** * Returns a buffer aligned to 4-byte boundary. * @param {ArrayBuffer} arrayBuffer Buffer to pad * @param {Integer} paddingByte (Optional) * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer */ function getPaddedArrayBuffer(arrayBuffer, paddingByte = 0) { const paddedLength = getPaddedBufferSize(arrayBuffer.byteLength); if (paddedLength !== arrayBuffer.byteLength) { const array = new Uint8Array(paddedLength); array.set(new Uint8Array(arrayBuffer)); if (paddingByte !== 0) { for (let i = arrayBuffer.byteLength; i < paddedLength; i++) { array[i] = paddingByte; } } return array.buffer; } return arrayBuffer; } function getCanvas() { if (typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined') { return new OffscreenCanvas(1, 1); } return document.createElement('canvas'); } function getToBlobPromise(canvas, mimeType) { if (canvas.toBlob !== undefined) { return new Promise(resolve => canvas.toBlob(resolve, mimeType)); } let quality; // Blink's implementation of convertToBlob seems to default to a quality level of 100% // Use the Blink default quality levels of toBlob instead so that file sizes are comparable. if (mimeType === 'image/jpeg') { quality = 0.92; } else if (mimeType === 'image/webp') { quality = 0.8; } return canvas.convertToBlob({ type: mimeType, quality: quality }); } /** * Writer */ class GLTFWriter { constructor() { this.plugins = []; this.options = {}; this.pending = []; this.buffers = []; this.byteOffset = 0; this.buffers = []; this.nodeMap = new Map(); this.skins = []; this.extensionsUsed = {}; this.extensionsRequired = {}; this.uids = new Map(); this.uid = 0; this.json = { asset: { version: '2.0', generator: 'T3D GLTFExporter' } }; this.cache = { meshes: new Map(), attributes: new Map(), bufferViews: new Map(), materials: new Map(), textures: new Map(), images: new Map() }; this.resources = []; // Track file names, to ensure no duplicates this.fileNamesUsed = {}; this.dracoOptions = null; this.dracoExporter = null; } setPlugins(plugins) { this.plugins = plugins; } setDRACOExporter(dracoExporter) { this.dracoExporter = dracoExporter; } /** * Parse input root object(s) and generate GLTF output * @param {Object3D|Object3D[]} input root object(s) * @param {Function} onDone Callback on completed * @param {object} options options */ async writeAsync(input, onDone, options) { this.options = Object.assign({ // Export format format: GLTF_FORMAT.GLTF, // Draco compression draco: false, // Resource directory, defualt is './' resourcePath: './', // Export position, rotation and scale instead of matrix per node. Default is false trs: false, // Export only visible objects. onlyVisible: true, // Restricts the image maximum size (both width and height) to the given value. maxTextureSize: Infinity, // Array. List of animations to be included in the export. animations: [], // Export custom glTF extensions defined on an object's userData.gltfExtensions property. includeCustomExtensions: false, // If true, wrap the root object(s) with an Object3D named "AuxRoot". // Otherwise, directly export the root object(s) as glTF scene(s). // It is recommended to set this to true if the root object(s) have transformations. wrapRoot: false }, options); if (this.options.draco && this.dracoExporter === null) { console.warn('GLTFExporter: DRACOExporter is not set but options.draco is true. Ignoring Draco compression.'); this.options.draco = false; } if (this.options.animations.length > 0) { // Only TRS properties, and not matrices, may be targeted by animation. this.options.trs = true; } await this.processInputAsync(input); await Promise.all(this.pending); const writer = this; const buffers = writer.buffers; const json = writer.json; options = writer.options; const extensionsUsed = writer.extensionsUsed; const extensionsRequired = writer.extensionsRequired; // Merge buffers. const blob = new Blob(buffers, { type: 'application/octet-stream' }); // Declare extensions. const extensionsUsedList = Object.keys(extensionsUsed); const extensionsRequiredList = Object.keys(extensionsRequired); if (extensionsUsedList.length > 0) json.extensionsUsed = extensionsUsedList; if (extensionsRequiredList.length > 0) json.extensionsRequired = extensionsRequiredList; if (extensionsUsedList.length > 0) json.extensionsUsed = extensionsUsedList; if (extensionsRequiredList.length > 0) json.extensionsRequired = extensionsRequiredList; // Update bytelength of the single buffer. if (json.buffers && json.buffers.length > 0) json.buffers[0].byteLength = blob.size; if (options.format === GLTF_FORMAT.GLB) { // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification const reader = new FileReader(); reader.readAsArrayBuffer(blob); reader.onloadend = function() { // Binary chunk. const binaryChunk = getPaddedArrayBuffer(reader.result); const binaryChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES)); binaryChunkPrefix.setUint32(0, binaryChunk.byteLength, true); binaryChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_BIN, true); // JSON chunk. const jsonChunk = getPaddedArrayBuffer(stringToArrayBuffer(JSON.stringify(json)), 0x20); const jsonChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES)); jsonChunkPrefix.setUint32(0, jsonChunk.byteLength, true); jsonChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_JSON, true); // GLB header. const header = new ArrayBuffer(GLB_HEADER_BYTES); const headerView = new DataView(header); headerView.setUint32(0, GLB_HEADER_MAGIC, true); headerView.setUint32(4, GLB_VERSION, true); const totalByteLength = GLB_HEADER_BYTES + jsonChunkPrefix.byteLength + jsonChunk.byteLength + binaryChunkPrefix.byteLength + binaryChunk.byteLength; headerView.setUint32(8, totalByteLength, true); const glbBlob = new Blob([ header, jsonChunkPrefix, jsonChunk, binaryChunkPrefix, binaryChunk ], { type: 'application/octet-stream' }); const glbReader = new FileReader(); glbReader.readAsArrayBuffer(glbBlob); glbReader.onloadend = function() { onDone(glbReader.result); }; }; } else if (options.format === GLTF_FORMAT.GLTF_SEPARATE) { const reader = new FileReader(); reader.readAsArrayBuffer(blob); reader.onloadend = function() { const resources = writer.resources; const ext = 'bin'; const name = writer.getUniqueFileName('all', ext); resources.push({ name, ext, content: getPaddedArrayBuffer(reader.result) }); json.buffers[0].uri = options.resourcePath + name + '.' + ext; onDone({ json, resources }); }; } else { if (json.buffers && json.buffers.length > 0) { const reader = new FileReader(); reader.readAsDataURL(blob); reader.onloadend = function() { const base64data = reader.result; json.buffers[0].uri = base64data; onDone(json); }; } else { onDone(json); } } } /** * @param {Object3D|Array} input */ async processInputAsync(input) { const options = this.options; input = input instanceof Array ? input : [input]; await this._invokeAllAsync(function(ext) { ext.beforeParse && ext.beforeParse(input); }); const roots = []; if (options.wrapRoot) { const root = new Object3D(); root.name = 'AuxRoot'; for (let i = 0; i < input.length; i++) { // We push directly to children instead of calling `add` to prevent // modify the .parent and break its original root and hierarchy root.children.push(input[i]); } roots.push(root); } else { roots.push(...input); } for (let i = 0; i < roots.length; i++) { roots[i].updateMatrix(); // ensure matrix is up to date await this.processSceneAsync(roots[i]); } for (let i = 0; i < this.skins.length; ++i) { this.processSkin(this.skins[i]); } for (let i = 0; i < options.animations.length; ++i) { this.processAnimation(options.animations[i]); } await this._invokeAllAsync(function(ext) { ext.afterParse && ext.afterParse(input); }); } /** * Process Scene * @param {Object3D} root Root object to process */ async processSceneAsync(root) { const json = this.json; const options = this.options; if (!json.scenes) { json.scenes = []; json.scene = 0; } const sceneDef = {}; if (root.name !== '') sceneDef.name = root.name; json.scenes.push(sceneDef); const nodes = []; for (let i = 0, l = root.children.length; i < l; i++) { const child = root.children[i]; if ((child.visible || options.onlyVisible === false) && !child.ignoreForExport) { const nodeIndex = await this.processNodeAsync(child); if (nodeIndex !== null) nodes.push(nodeIndex); } } if (nodes.length > 0) sceneDef.nodes = nodes; this.serializeUserData(root, sceneDef); } /** * Process Object3D node * @param {Object3D} object Object3D to processNodeAsync * @returns {Integer} Index of the node in the nodes list */ async processNodeAsync(object) { const json = this.json; const options = this.options; const nodeMap = this.nodeMap; if (!json.nodes) json.nodes = []; const nodeDef = {}; if (options.trs) { const rotation = object.quaternion.toArray(); const position = object.position.toArray(); const scale = object.scale.toArray(); if (!equalArray(rotation, [0, 0, 0, 1])) { nodeDef.rotation = rotation; } if (!equalArray(position, [0, 0, 0])) { nodeDef.translation = position; } if (!equalArray(scale, [1, 1, 1])) { nodeDef.scale = scale; } } else { if (isIdentityMatrix(object.matrix) === false) { nodeDef.matrix = object.matrix.elements; } } // We don't export empty strings name. if (object.name !== '') nodeDef.name = String(object.name); this.serializeUserData(object, nodeDef); if (object.isMesh) { const meshIndex = await this.processMeshAsync(object); if (meshIndex !== null) nodeDef.mesh = meshIndex; } if (object.isSkinnedMesh) this.skins.push(object); if (object.children.length > 0) { const children = []; for (let i = 0, l = object.children.length; i < l; i++) { const child = object.children[i]; if ((child.visible || options.onlyVisible === false) && !child.ignoreForExport) { const nodeIndex = await this.processNodeAsync(child); if (nodeIndex !== null) children.push(nodeIndex); } } if (children.length > 0) nodeDef.children = children; } await this._invokeAllAsync(function(ext) { ext.writeNode && ext.writeNode(object, nodeDef); }); const nodeIndex = json.nodes.push(nodeDef) - 1; nodeMap.set(object, nodeIndex); return nodeIndex; } /** * Process mesh * @param {Mesh} mesh Mesh to process * @returns {Integer|null} Index of the processed mesh in the "meshes" array */ async processMeshAsync(mesh) { const cache = this.cache; const json = this.json; const meshCacheKeyParts = [mesh.geometry.uuid]; if (Array.isArray(mesh.material)) { for (let i = 0, l = mesh.material.length; i < l; i++) { meshCacheKeyParts.push(mesh.material[i].uuid); } } else { meshCacheKeyParts.push(mesh.material.uuid); } const meshCacheKey = meshCacheKeyParts.join(':'); if (cache.meshes.has(meshCacheKey)) return cache.meshes.get(meshCacheKey); const geometry = mesh.geometry; // If material is an array, we only get drawMode from the first material for now const drawMode = Array.isArray(mesh.material) ? mesh.material[0].drawMode : mesh.material.drawMode; const mode = DRAW_MODE_TO_GLTF[drawMode]; const morphTargets = mesh.morphTargetInfluences !== null && mesh.morphTargetInfluences.length > 0; // KHR_draco_mesh_compression // Only TRIANGLES and TRIANGLE_STRIP are supported. // Morph targets are not supported because glTF does not support Draco compression with morph targets. const draco = this.options.draco && (drawMode === DRAW_MODE.TRIANGLES || drawMode === DRAW_MODE.TRIANGLE_STRIP) && !morphTargets; const meshDef = {}; const attributes = {}; const primitives = []; const targets = []; for (let attributeName in geometry.attributes) { const attribute = geometry.attributes[attributeName]; attributeName = ATTRIBUTE_NAME_TO_GLTF[attributeName] || attributeName; // Skip custom attributes if (validVertexAttributes.test(attributeName) === false) { continue; } if (cache.attributes.has(this.getUID(attribute))) { attributes[attributeName] = cache.attributes.get(this.getUID(attribute)); continue; } // TODO Enforce glTF vertex attribute requirements: // - JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT // - Only custom attributes may be INT or UNSIGNED_INT const accessor = this.processAccessor(attribute, geometry, undefined, undefined, draco); if (accessor !== null) { this.detectMeshQuantization(attributeName, attribute); attributes[attributeName] = accessor; cache.attributes.set(this.getUID(attribute), accessor); } } // Skip if no exportable attributes found if (Object.keys(attributes).length === 0) return null; // Morph targets if (morphTargets) { // glTF 2.0 Specification: // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets const weights = []; for (let i = 0; i < mesh.morphTargetInfluences.length; ++i) { const target = {}; let warned = false; for (const attributeName in geometry.morphAttributes) { // glTF 2.0 morph supports only POSITION/NORMAL/TANGENT. // t3d doesn't support TANGENT yet. if (attributeName !== 'position' && attributeName !== 'normal') { if (!warned) { console.warn('GLTFExporter: Only POSITION and NORMAL morph are supported.'); warned = true; } continue; } const attribute = geometry.morphAttributes[attributeName][i]; const gltfAttributeName = attributeName.toUpperCase(); target[gltfAttributeName] = this.processAccessor(attribute, geometry); cache.attributes.set(this.getUID(attribute), target[gltfAttributeName]); } targets.push(target); weights.push(mesh.morphTargetInfluences[i]); } meshDef.weights = weights; } const isMultiMaterial = Array.isArray(mesh.material); if (isMultiMaterial && geometry.groups.length === 0) return null; const materials = isMultiMaterial ? mesh.material : [mesh.material]; const groups = isMultiMaterial ? geometry.groups : [{ materialIndex: 0, start: undefined, count: undefined }]; let extensions; if (draco) { let dracoBufferView; const attributesKey = createAttributesKey(attributes); if (cache.bufferViews.has(attributesKey)) { dracoBufferView = cache.bufferViews.get(attributesKey); } else { dracoBufferView = this.processDracoBufferView(geometry); cache.bufferViews.set(attributesKey, dracoBufferView); } extensions = { KHR_draco_mesh_compression: dracoBufferView }; } for (let i = 0, il = groups.length; i < il; i++) { const primitive = { mode: mode, attributes: attributes }; this.serializeUserData(geometry, primitive); if (targets.length > 0) primitive.targets = targets; if (extensions) primitive.extensions = extensions; if (geometry.index !== null) { let cacheKey = this.getUID(geometry.index); if (groups[i].start !== undefined || groups[i].count !== undefined) { cacheKey += ':' + groups[i].start + ':' + groups[i].count; } if (cache.attributes.has(cacheKey)) { primitive.indices = cache.attributes.get(cacheKey); } else { primitive.indices = this.processAccessor(geometry.index, geometry, groups[i].start, groups[i].count); cache.attributes.set(cacheKey, primitive.indices); } if (primitive.indices === null) delete primitive.indices; } const material = await this.processMaterialAsync(materials[groups[i].materialIndex]); if (material !== null) primitive.material = material; primitives.push(primitive); } meshDef.primitives = primitives; if (!json.meshes) json.meshes = []; await this._invokeAllAsync(function(ext) { ext.writeMesh && ext.writeMesh(mesh, meshDef); }); const index = json.meshes.push(meshDef) - 1; cache.meshes.set(meshCacheKey, index); return index; } /** * Process attribute to generate an accessor * @param {Attribute} attribute Attribute to process * @param {Geometry} geometry (Optional) Geometry used for truncated draw range * @param {Integer} start (Optional) * @param {Integer} count (Optional) * @param {boolean} skipBufferView (Optional) Skip creating a bufferView and return the accessor * @returns {Integer|null} Index of the processed accessor on the "accessors" array */ processAccessor(attribute, geometry, start, count, skipBufferView = false) { const json = this.json; const types = { 1: 'SCALAR', 2: 'VEC2', 3: 'VEC3', 4: 'VEC4', 9: 'MAT3', 16: 'MAT4' }; let componentType; // Detect the component type of the attribute array if (attribute.buffer.array.constructor === Float32Array) { componentType = GLTF_CONSTANTS.FLOAT; } else if (attribute.buffer.array.constructor === Int32Array) { componentType = GLTF_CONSTANTS.INT; } else if (attribute.buffer.array.constructor === Uint32Array) { componentType = GLTF_CONSTANTS.UNSIGNED_INT; } else if (attribute.buffer.array.constructor === Int16Array) { componentType = GLTF_CONSTANTS.SHORT; } else if (attribute.buffer.array.constructor === Uint16Array) { componentType = GLTF_CONSTANTS.UNSIGNED_SHORT; } else if (attribute.buffer.array.constructor === Int8Array) { componentType = GLTF_CONSTANTS.BYTE; } else if (attribute.buffer.array.constructor === Uint8Array) { componentType = GLTF_CONSTANTS.UNSIGNED_BYTE; } else { throw new Error('GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.buffer.array.constructor.name); } if (start === undefined) start = 0; if (count === undefined || count === Infinity) count = attribute.buffer.count; // Skip creating an accessor if the attribute doesn't have data to export if (count === 0) return null; const minMax = getMinMax(attribute, start, count); const accessorDef = { componentType: componentType, count: count, max: minMax.max, min: minMax.min, type: types[attribute.size] }; if (!skipBufferView) { let bufferViewTarget; // If geometry isn't provided, don't infer the target usage of the bufferView. For // animation samplers, target must not be set. if (geometry !== undefined) { bufferViewTarget = attribute === geometry.index ? GLTF_CONSTANTS.ELEMENT_ARRAY_BUFFER : GLTF_CONSTANTS.ARRAY_BUFFER; } accessorDef.bufferView = this.processBufferView(attribute, componentType, start, count, bufferViewTarget); // accessorDef.byteOffset = 0; } if (attribute.normalized === true) accessorDef.normalized = true; if (!json.accessors) json.accessors = []; return json.accessors.push(accessorDef) - 1; } /** * Process and generate a BufferView * @param {Attribute} attribute * @param {number} componentType * @param {number} start * @param {number} count * @param {number} target (Optional) Target usage of the BufferView * @returns {Integer|null} Index of the processed BufferView on the "bufferViews" array */ processBufferView(attribute, componentType, start, count, target) { const json = this.json; if (!json.bufferViews) json.bufferViews = []; // Create a new dataview and dump the attribute's array into it let componentSize; switch (componentType) { case GLTF_CONSTANTS.BYTE: case GLTF_CONSTANTS.UNSIGNED_BYTE: componentSize = 1; break; case GLTF_CONSTANTS.SHORT: case GLTF_CONSTANTS.UNSIGNED_SHORT: componentSize = 2; break; default: componentSize = 4; } let byteStride = attribute.size * componentSize; if (target === GLTF_CONSTANTS.ARRAY_BUFFER) { // Each element of a vertex attribute MUST be aligned to 4-byte boundaries // inside a bufferView byteStride = Math.ceil(byteStride / 4) * 4; } const byteLength = getPaddedBufferSize(count * byteStride); const dataView = new DataView(new ArrayBuffer(byteLength)); let offset = 0; for (let i = start; i < start + count; i++) { for (let a = 0; a < attribute.size; a++) { const value = attribute.buffer.array[i * attribute.size + a]; if (componentType === GLTF_CONSTANTS.FLOAT) { dataView.setFloat32(offset, value, true); } else if (componentType === GLTF_CONSTANTS.INT) { dataView.setInt32(offset, value, true); } else if (componentType === GLTF_CONSTANTS.UNSIGNED_INT) { dataView.setUint32(offset, value, true); } else if (componentType === GLTF_CONSTANTS.SHORT) { dataView.setInt16(offset, value, true); } else if (componentType === GLTF_CONSTANTS.UNSIGNED_SHORT) { dataView.setUint16(offset, value, true); } else if (componentType === GLTF_CONSTANTS.BYTE) { dataView.setInt8(offset, value); } else if (componentType === GLTF_CONSTANTS.UNSIGNED_BYTE) { dataView.setUint8(offset, value); } offset += componentSize; } if ((offset % byteStride) !== 0) { offset += byteStride - (offset % byteStride); } } const bufferViewDef = { buffer: this.processBuffer(dataView.buffer), byteOffset: this.byteOffset, byteLength: byteLength }; if (target !== undefined) bufferViewDef.target = target; if (target === GLTF_CONSTANTS.ARRAY_BUFFER) { // Only define byteStride for vertex attributes. bufferViewDef.byteStride = byteStride; } this.byteOffset += byteLength; return json.bufferViews.push(bufferViewDef) - 1; } /** * Process and generate a draco compressed BufferView * @param {Geometry} geometry * @returns {object} */ processDracoBufferView(geometry) { const json = this.json; if (!json.bufferViews) json.bufferViews = []; const { buffer, attributes } = this.dracoExporter.parse(geometry, this.dracoOptions); const paddedBuffer = getPaddedArrayBuffer(buffer); const byteLength = paddedBuffer.byteLength; const bufferViewDef = { buffer: this.processBuffer(paddedBuffer), byteOffset: this.byteOffset, byteLength: byteLength }; this.byteOffset += byteLength; this.extensionsUsed['KHR_draco_mesh_compression'] = true; this.extensionsRequired['KHR_draco_mesh_compression'] = true; return { bufferView: json.bufferViews.push(bufferViewDef) - 1, attributes }; } /** * Process a buffer to append to the default one. * @param {ArrayBuffer} buffer * @returns {Integer} */ processBuffer(buffer) { const json = this.json; const buffers = this.buffers; if (!json.buffers) json.buffers = [{ byteLength: 0 }]; // All buffers are merged before export. buffers.push(buffer); return 0; } /** * Process material * @param {Material} material Material to process * @returns {Integer|null} Index of the processed material in the "materials" array */ async processMaterialAsync(material) { const cache = this.cache; const json = this.json; if (cache.materials.has(material)) return cache.materials.get(material); if (!json.materials) json.materials = []; const materialDef = { pbrMetallicRoughness: {} }; // pbrMetallicRoughness.baseColorFactor const color = material.diffuse.toArray().concat([material.opacity]); if (!equalArray(color, [1, 1, 1, 1])) { materialDef.pbrMetallicRoughness.baseColorFactor = color; } materialDef.pbrMetallicRoughness.metallicFactor = material.metalness !== undefined ? material.metalness : 0; materialDef.pbrMetallicRoughness.roughnessFactor = material.roughness !== undefined ? material.roughness : 1; // pbrMetallicRoughness.metallicRoughnessTexture if (material.metalnessMap || material.roughnessMap) { const metalRoughTexture = await this.buildMetalRoughTextureAsync(material.metalnessMap, material.roughnessMap); const metalRoughMapDef = { index: await this.processTextureAsync(metalRoughTexture) }; materialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef; } // pbrMetallicRoughness.baseColorTexture if (material.diffuseMap) { const baseColorMapDef = { index: await this.processTextureAsync(material.diffuseMap), texCoord: material.diffuseMapCoord }; this.applyTextureTransform(baseColorMapDef, material.diffuseMapTransform); materialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef; } if (material.emissive) { const emissive = material.emissive; const maxEmissiveComponent = Math.max(emissive.r, emissive.g, emissive.b); if (maxEmissiveComponent > 0) { materialDef.emissiveFactor = material.emissive.toArray(); } // emissiveTexture if (material.emissiveMap) { const emissiveMapDef = { index: await this.processTextureAsync(material.emissiveMap), texCoord: material.emissiveMapCoord }; this.applyTextureTransform(emissiveMapDef, material.emissiveMapTransform); materialDef.emissiveTexture = emissiveMapDef; } } // normalTexture if (material.normalMap) { const normalMapDef = { index: await this.processTextureAsync(material.normalMap) }; if (material.normalScale && material.normalScale.x !== 1) { // glTF normal scale is univariate. Ignore `y`, which may be flipped. normalMapDef.scale = material.normalScale.x; } materialDef.normalTexture = normalMapDef; } // occlusionTexture if (material.aoMap) { const occlusionMapDef = { index: await this.processTextureAsync(material.aoMap), texCoord: material.aoMapCoord }; if (material.aoMapIntensity !== 1.0) { occlusionMapDef.strength = material.aoMapIntensity; } this.applyTextureTransform(occlusionMapDef, material.aoMapTransform); materialDef.occlusionTexture = occlusionMapDef; } // alphaMode if (material.transparent) { materialDef.alphaMode = 'BLEND'; } else { if (material.alphaTest > 0.0) { materialDef.alphaMode = 'MASK'; materialDef.alphaCutoff = material.alphaTest; } } // doubleSided. // Since BackSide is not a valid glTF value, it is currently ignored. // TODO: Implement opposite drawing indices order for backface rendering. if (material.side === DRAW_SIDE.DOUBLE) materialDef.doubleSided = true; if (material.name !== '') materialDef.name = material.name; this.serializeUserData(material, materialDef); await this._invokeAllAsync(async function(ext) { ext.writeMaterialAsync && await ext.writeMaterialAsync(material, materialDef); }); const index = json.materials.push(materialDef) - 1; cache.materials.set(material, index); return index; } /** * Process texture * @param {TextureBase} map Map to process * @returns {Integer} Index of the processed texture in the "textures" array */ async processTextureAsync(map) { const cache = this.cache; const json = this.json; if (cache.textures.has(map)) return cache.textures.get(map); if (!json.textures) json.textures = []; // TODO compressed texture let mimeType = map.userData.mimeType; if (mimeType === 'image/webp') mimeType = 'image/png'; const textureDef = { sampler: this.processSampler(map), source: this.processImage(map.image, map.format, map.flipY, mimeType) }; if (map.name) textureDef.name = map.name; await this._invokeAllAsync(async function(ext) { ext.writeTexture && await ext.writeTexture(map, textureDef); }); const index = json.textures.push(textureDef) - 1; cache.textures.set(map, index); return index; } /** * Process image * @param {Image} image to process * @param {Integer} format of the image (RGBAFormat) * @param {boolean} flipY before writing out the image * @param {string} mimeType export format * @returns {Integer} Index of the processed texture in the "images" array */ processImage(image, format, flipY, mimeType = 'image/png') { if (image === null) { throw new Error('GLTFExporter: No valid image data found. Unable to process texture.'); } const cache = this.cache; const json = this.json; const options = this.options; const pending = this.pending; if (!cache.images.has(image)) cache.images.set(image, {}); const cachedImages = cache.images.get(image); const key = mimeType + ':flipY/' + flipY.toString(); if (cachedImages[key] !== undefined) return cachedImages[key]; if (!json.images) json.images = []; const imageDef = { mimeType: mimeType }; if (image.__name) imageDef.name = image.__name; const canvas = getCanvas(); canvas.width = Math.min(image.width, options.maxTextureSize); canvas.height = Math.min(image.height, options.maxTextureSize); const ctx = canvas.getContext('2d', { willReadFrequently: true }); if (flipY === true) { ctx.translate(0, canvas.height); ctx.scale(1, -1); } if (image.data !== undefined) { if (format !== PIXEL_FORMAT.RGBA) { console.error('GLTFExporter: Only RGBA Format is supported.', format); } if (image.width > options.maxTextureSize || image.height > options.maxTextureSize) { console.warn('GLTFExporter: Image size is bigger than maxTextureSize', image); } const data = new Uint8ClampedArray(image.height * image.width * 4); for (let i = 0; i < data.length; i += 4) { data[i + 0] = image.data[i + 0]; data[i + 1] = image.data[i + 1]; data[i + 2] = image.data[i + 2]; data[i + 3] = image.data[i + 3]; } ctx.putImageData(new ImageData(data, image.width, image.height), 0, 0); } else { if ((typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) || (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap) || (typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas)) { ctx.drawImage(image, 0, 0, canvas.width, canvas.height); } else { throw new Error('GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.'); } } if (options.format === GLTF_FORMAT.GLB) { pending.push( getToBlobPromise(canvas, mimeType) .then(blob => this.processBufferViewImage(blob)) .then(bufferViewIndex => { imageDef.bufferView = bufferViewIndex; }) ); } else { if (canvas.toDataURL !== undefined) { const dataURL = canvas.toDataURL(mimeType); this.setImageUri(imageDef, dataURL); } else { pending.push( getToBlobPromise(canvas, mimeType) .then(blob => new FileReader().readAsDataURL(blob)) .then(dataURL => { this.setImageUri(imageDef, dataURL); }) ); } } const index = json.images.push(imageDef) - 1; cachedImages[key] = index; return index; } /** * Process sampler * @param {Texture} map Texture to process * @returns {Integer} Index of the processed texture in the "samplers" array */ processSampler(map) { const json = this.json; if (!json.samplers) json.samplers = []; const samplerDef = { magFilter: T3D_TO_GLTF[map.magFilter], minFilter: T3D_TO_GLTF[map.minFilter], wrapS: T3D_TO_GLTF[map.wrapS], wrapT: T3D_TO_GLTF[map.wrapT] }; return json.samplers.push(samplerDef) - 1; } /** * Process and generate a BufferView from an image Blob. * @param {Blob} blob * @returns {Promise} */ processBufferViewImage(blob) { const writer = this; const json = writer.json; if (!json.bufferViews) json.bufferViews = []; return new Promise(function(resolve) { const reader = new FileReader(); reader.readAsArrayBuffer(blob); reader.onloadend = function() { const buffer = getPaddedArrayBuffer(reader.result); const bufferViewDef = { buffer: writer.processBuffer(buffer), byteOffset: writer.byteOffset, byteLength: buffer.byteLength }; writer.byteOffset += buffer.byteLength; resolve(json.bufferViews.push(bufferViewDef) - 1); }; }); } /** * @param {Object3D} object * @returns {number|null} */ processSkin(object) { const json = this.json; const nodeMap = this.nodeMap; const node = json.nodes[nodeMap.get(object)]; const skeleton = object.skeleton; if (skeleton === undefined) return null; const rootJoint = object.skeleton.bones[0]; if (rootJoint === undefined) return null; const joints = []; const inverseBindMatrices = new Float32Array(skeleton.bones.length * 16); const temporaryBoneInverse = new Matrix4(); for (let i = 0; i < skeleton.bones.length; ++i) { joints.push(nodeMap.get(skeleton.bones[i])); temporaryBoneInverse.copy(skeleton.boneInverses[i]); temporaryBoneInverse.multiply(object.bindMatrix).toArray(inverseBindMatrices, i * 16); } if (json.skins === undefined) json.skins = []; json.skins.push({ inverseBindMatrices: this.processAccessor(new Attribute(new Buffer(new Float32Array(inverseBindMatrices), 16))), joints: joints, skeleton: nodeMap.get(rootJoint) }); const skinIndex = node.skin = json.skins.length - 1; return skinIndex; } /** * Creates glTF animation entry from AnimationClip object. * * Status: * - Only properties listed in PATH_PROPERTIES may be animated. * @param {AnimationClip} clip * @returns {number|null} */ processAnimation(clip) { const json = this.json; const nodeMap = this.nodeMap; if (!json.animations) json.animations = []; const tracks = clip.tracks; const channels = []; const samplers = []; for (let i = 0; i < tracks.length; ++i) { const track = tracks[i]; const trackNode = track.target; const trackProperty = PATH_PROPERTIES[track.propertyPath]; if (!trackNode || !trackProperty) { console.warn('GLTFExporter: Could not export animation track "%s".', track.name); return null; } const inputItemSize = 1; let outputItemSize = track.valueSize; if (trackProperty === PATH_PROPERTIES.morphTargetInfluences) { outputItemSize = 1; } const interpolation = INTERPOLANT_TO_GLTF.get(track.interpolant.constructor) || 'LINEAR'; samplers.push({ input: this.processAccessor(new Attribute(new Buffer(new Float32Array(track.times), inputItemSize))), output: this.processAccessor(new Attribute(new Buffer(new Float32Array(track.values), outputItemSize))), interpolation: interpolation }); channels.push({ sampler: samplers.length - 1, target: { node: nodeMap.get(trackNode), path: trackProperty } }); } json.animations.push({ name: clip.name || 'clip_' + json.animations.length, samplers: samplers, channels: channels }); return json.animations.length - 1; } applyTextureTransform(mapDef, matrix) { let didTransform = false; const transformDef = {}; const { tx, ty, sx, sy, rotation } = decompose(matrix); if (tx !== 0 || ty !== 0) { transformDef.offset = [tx, ty]; didTransform = true; } if (rotation !== 0) { transformDef.rotation = rotation; didTransform = true; } if (sx !== 1 || sy !== 1) { transformDef.scale = [sx, sy]; didTransform = true; } if (didTransform) { mapDef.extensions = mapDef.extensions || {}; mapDef.extensions['KHR_texture_transform'] = transformDef; this.extensionsUsed['KHR_texture_transform'] = true; } } async buildMetalRoughTextureAsync(metalnessMap, roughnessMap) { if (metalnessMap === roughnessMap) return metalnessMap; function getEncodingConversion(map) { if (map.encoding === TEXEL_ENCODING_TYPE.SRGB) { return function SRGBToLinear(c) { return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4); }; } return function LinearToLinear(c) { return c; }; } const metalness = metalnessMap ? metalnessMap.image : null; const roughness = roughnessMap ? roughnessMap.image : null; const width = Math.max(metalness ? metalness.width : 0, roughness ? roughness.width : 0); const height = Math.max(metalness ? metalness.height : 0, roughness ? roughness.height : 0); const canvas = getCanvas(); canvas.width = width; canvas.height = height; const context = canvas.getContext('2d', { willReadFrequently: true }); context.fillStyle = '#00ffff'; context.fillRect(0, 0, width, height); const composite = context.getImageData(0, 0, width, height); if (metalness) { context.drawImage(metalness, 0, 0, width, height); const convert = getEncodingConversion(metalnessMap); const data = context.getImageData(0, 0, width, height).data; for (let i = 2; i < data.length; i += 4) { composite.data[i] = convert(data[i] / 256) * 256; } } if (roughness) { context.drawImage(roughness, 0, 0, width, height); const convert = getEncodingConversion(roughnessMap); const data = context.getImageData(0, 0, width, height).data; for (let i = 1; i < data.length; i += 4) { composite.data[i] = convert(data[i] / 256) * 256; } } context.putImageData(composite, 0, 0); // const reference = metalnessMap || roughnessMap; const texture = reference.clone(); texture.image = canvas; texture.encoding = TEXEL_ENCODING_TYPE.LINEAR; console.warn('GLTFExporter: Merged metalnessMap and roughnessMap textures.'); return texture; } /** * Serializes a userData. * @param {Object3D|Material} object * @param {object} objectDef */ serializeUserData(object, objectDef) { if (!object.userData) return; if (Object.keys(object.userData).length === 0) return; const options = this.options; const extensionsUsed = this.extensionsUsed; const json = JSON.parse(JSON.stringify(object.userData)); if (options.includeCustomExtensions && json.gltfExtensions) { if (objectDef.extensions === undefined) objectDef.extensions = {}; for (const extensionName in json.gltfExtensions) { objectDef.extensions[extensionName] = json.gltfExtensions[extensionName]; extensionsUsed[extensionName] = true; } delete json.gltfExtensions; } if (Object.keys(json).length > 0) objectDef.extras = json; } /** * Returns ids for buffer attributes. * @param {object} attribute * @returns {Integer} */ getUID(attribute) { if (this.uids.has(attribute) === false) { this.uids.set(attribute, this.uid++); } return this.uids.get(attribute); } /** * Returns unique file names. * @param {string} originalName * @param {string} ext * @returns {string} unique name */ getUniqueFileName(originalName, ext) { if (!this.fileNamesUsed[ext]) this.fileNamesUsed[ext] = {}; const namesUsed = this.fileNamesUsed[ext]; if (originalName in namesUsed) { return originalName + '_' + (++namesUsed[originalName]); } else { namesUsed[originalName] = 0; return originalName; } } /** * Set uri to imageDef by dataURL. * @param {object} imageDef * @param {string} dataURL */ setImageUri(imageDef, dataURL) { const options = this.options; if (options.format !== GLTF_FORMAT.GLTF_SEPARATE) { imageDef.uri = dataURL; return; } const ext = imageDef.mimeType === 'image/jpeg' ? 'jpg' : 'png'; const name = this.getUniqueFileName(imageDef.name || 'image', ext); this.resources.push({ name, ext, content: dataURL }); imageDef.uri = options.resourcePath + name + '.' + ext; } /** * If a vertex attribute with a * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview) * is used, it is checked whether it is a valid data type according to the * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md) * extension. * In this case the extension is automatically added to the list of used extensions. * @param {string} attributeName * @param {Attribute} attribute */ detectMeshQuantization(attributeName, attribute) { if (this.extensionsUsed[KHR_MESH_QUANTIZATION]) return; let attrType = undefined; switch (attribute.buffer.array.constructor) { case Int8Array: attrType = 'byte'; break; case Uint8Array: attrType = 'unsigned byte'; break; case Int16Array: attrType = 'short'; break; case Uint16Array: attrType = 'unsigned short'; break; default: return; } if (attribute.normalized) attrType += ' normalized'; const attrNamePrefix = attributeName.split('_', 1)[0]; if (KHR_mesh_quantization_ExtraAttrTypes[attrNamePrefix] && KHR_mesh_quantization_ExtraAttrTypes[attrNamePrefix].includes(attrType)) { this.extensionsUsed[KHR_MESH_QUANTIZATION] = true; this.extensionsRequired[KHR_MESH_QUANTIZATION] = true; } } async _invokeAllAsync(func) { for (let i = 0, il = this.plugins.length; i < il; i++) { await func(this.plugins[i]); } } } /** * Punctual Lights Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual */ class GLTFLightExtension { constructor(writer) { this.writer = writer; this.name = 'KHR_lights_punctual'; } writeNode(light, nodeDef) { if (!light.isLight) return; if (!light.isDirectionalLight && !light.isPointLight && !light.isSpotLight) { console.warn('GLTFExporter: Only directional, point, and spot lights are supported.', light); return; } const writer = this.writer; const json = writer.json; const extensionsUsed = writer.extensionsUsed; const lightDef = {}; if (light.name) lightDef.name = light.name; lightDef.color = light.color.toArray(); lightDef.intensity = light.intensity; if (light.isDirectionalLight) { lightDef.type = 'directional'; } else if (light.isPointLight) { lightDef.type = 'point'; if (light.distance > 0) lightDef.range = light.distance; } else if (light.isSpotLight) { lightDef.type = 'spot'; if (light.distance > 0) lightDef.range = light.distance; lightDef.spot = {}; lightDef.spot.innerConeAngle = (1.0 - light.penumbra) * light.angle; lightDef.spot.outerConeAngle = light.angle; } if (light.decay !== undefined && light.decay !== 2) { console.warn('GLTFExporter: Light decay may be lost. glTF is physically-based, ' + 'and expects light.decay=2.'); } if (!extensionsUsed[this.name]) { json.extensions = json.extensions || {}; json.extensions[this.name] = { lights: [] }; extensionsUsed[this.name] = true; } const lights = json.extensions[this.name].lights; lights.push(lightDef); nodeDef.extensions = nodeDef.extensions || {}; nodeDef.extensions[this.name] = { light: lights.length - 1 }; } } /** * Unlit Materials Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit */ class GLTFMaterialsUnlitExtension { constructor(writer) { this.writer = writer; this.name = 'KHR_materials_unlit'; } async writeMaterialAsync(material, materialDef) { if (material.type !== MATERIAL_TYPE.BASIC) return; const writer = this.writer; const extensionsUsed = writer.extensionsUsed; materialDef.extensions = materialDef.extensions || {}; materialDef.extensions[this.name] = {}; extensionsUsed[this.name] = true; materialDef.pbrMetallicRoughness.metallicFactor = 0.0; materialDef.pbrMetallicRoughness.roughnessFactor = 0.9; } } /** * GPU Instancing Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing */ class GLTFMeshGpuInstancingExtension { constructor(writer) { this.writer = writer; this.name = 'EXT_mesh_gpu_instancing'; } writeNode(object, nodeDef) { if (!object.isMesh) return; const geometry = object.geometry; if (geometry.instanceCount === -1) return; const instanceMatrixAttribute = geometry.attributes.instanceMatrix; if (!instanceMatrixAttribute || instanceMatrixAttribute.divisor === 0) return; const writer = this.writer; const count = geometry.instanceCount; const translationAttr = new Float32Array(count * 3); const rotationAttr = new Float32Array(count * 4); const scaleAttr = new Float32Array(count * 3); const matrix = new Matrix4(); const position = new Vector3(); const quaternion = new Quaternion(); const scale = new Vector3(); for (let i = 0; i < count; i++) { matrix.fromArray(instanceMatrixAttribute.buffer.array, i * 16); matrix.decompose(position, quaternion, scale); position.toArray(translationAttr, i * 3); quaternion.toArray(rotationAttr, i * 4); scale.toArray(scaleAttr, i * 3); } const attributes = { TRANSLATION: writer.processAccessor(new Attribute(new Buffer(translationAttr, 3))), ROTATION: writer.processAccessor(new Attribute(new Buffer(rotationAttr, 4))), SCALE: writer.processAccessor(new Attribute(new Buffer(scaleAttr, 3))) }; nodeDef.extensions = nodeDef.extensions || {}; nodeDef.extensions[this.name] = { attributes }; writer.extensionsUsed[this.name] = true; writer.extensionsRequired[this.name] = true; } } export { GLTFExporter, GLTF_FORMAT, GLTFMaterialsUnlitExtension, GLTFMeshGpuInstancingExtension, GLTFLightExtension }; ================================================ FILE: examples/jsm/geometries/BitmapTextGeometry.js ================================================ import { Geometry, Buffer, Attribute } from 't3d'; /** * BitmapTextGeometry - generates a geometry for a bitmap text * reference: https://github.com/leochocolat/three-msdf-text-utils/blob/main/src/MSDFTextGeometry/index.js */ class BitmapTextGeometry extends Geometry { /** * @param {object | string} options - the options or text string to render * @param {string} options.text - the text to layout. Newline characters (\n) will cause line breaks * @param {object} options.font - the BMFont definition which holds chars, kernings, etc * @param {number} [options.width] - the desired width of the text box, causes word-wrapping and clipping in "pre" mode. Leave as undefined to remove * @param {string} [options.mode] - a mode for word-wrapper; can be 'pre' (maintain spacing), or 'nowrap' (collapse whitespace but only break on newline characters), otherwise assumes normal word-wrap behaviour (collapse whitespace, break at width or newlines) * @param {string} [options.align='left'] - can be "left", "center" or "right" * @param {number} [options.letterSpacing=0] - the letter spacing in pixels * @param {number} [options.tabSize=4] - the number of spaces to use in a single tab * @param {number} [options.baseline=font.common.base] - the baseline height in pixels * @param {number} [options.lineHeight=font.common.lineHeight] - the line height in pixels * @param {boolean} [options.flipY=true] - whether the texture will be Y-flipped (default true) * @param {number} [options.centerX=0.5] - the center of the text in X axis, 0.5 is center, 0 is left, 1 is right * @param {number} [options.centerY=0.5] - the center of the text in Y axis, 0.5 is center, 0 is top, 1 is bottom */ constructor(options) { super(); // Set text as object property if (typeof options === 'string') options = { text: options }; // use these as default values for any subsequent // calls to update() this._options = Object.assign({}, options); this._layout = null; this._visibleGlyphs = []; this.update(this._options); } get layout() { return this._layout; } get visibleGlyphs() { return this._visibleGlyphs; } update(options) { this.dispose(); options = this._validateOptions(options); if (!options) return; this._layout = new TextLayout(options); // get vec2 texcoords const flipY = options.flipY !== false; // the desired BMFont data const font = options.font; // determine texture size from font file const texWidth = font.common.scaleW; const texHeight = font.common.scaleH; // get visible glyphs const glyphs = this._layout.glyphs.filter(glyph => { const bitmap = glyph.data; return bitmap.width * bitmap.height > 0; }); // provide visible glyphs for convenience this._visibleGlyphs = glyphs; // get vertex data const attributes = generateAttributes(glyphs, texWidth, texHeight, flipY, font.info.size); const numIndices = glyphs.length * 6; const indices = new Array(numIndices); for (let i = 0, j = 0; i < numIndices; i += 6, j += 4) { indices[i + 0] = j + 0; indices[i + 1] = j + 1; indices[i + 2] = j + 2; indices[i + 3] = j + 0; indices[i + 4] = j + 2; indices[i + 5] = j + 3; } // set vertex data this.addAttribute('a_Position', new Attribute(new Buffer(attributes.positions, 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(attributes.uvs, 2))); this.addAttribute('a_Size', new Attribute(new Buffer(attributes.sizes, 2))); this.setIndex(indices); this.computeBoundingBox(); const centerX = options.centerX !== undefined ? options.centerX : 0.5; const centerY = options.centerY !== undefined ? (1 - options.centerY) : 0.5; if (centerX !== 0 || centerY !== 0) { const xOffset = (this.boundingBox.max.x - this.boundingBox.min.x) * centerX; const yOffset = (this.boundingBox.max.y - this.boundingBox.min.y) * centerY; const positions = this.attributes.a_Position.buffer.array; for (let i = 0, l = positions.length; i < l; i += 3) { positions[i] -= xOffset; positions[i + 1] -= yOffset; } this.computeBoundingBox(); } this.computeBoundingSphere(); } _validateOptions(options) { // Set text as object property if (typeof options === 'string') options = { text: options }; // Use constructor defaults options = Object.assign({}, this._options, options); // Check for font property if (!options.font) throw new TypeError('must specify a { font } in options'); return options; } } function generateAttributes(glyphs, texWidth, texHeight, flipY, fontSize) { const uvs = new Float32Array(glyphs.length * 4 * 2); const positions = new Float32Array(glyphs.length * 4 * 3); const sizes = new Float32Array(glyphs.length * 4 * 2); let i = 0; let j = 0; let k = 0; glyphs.forEach(function(glyph) { const bitmap = glyph.data; // UV: texture coordinates const bw = (bitmap.x + bitmap.width); const bh = (bitmap.y + bitmap.height); // top left position const u0 = bitmap.x / texWidth; let v1 = bitmap.y / texHeight; const u1 = bw / texWidth; let v0 = bh / texHeight; if (flipY) { v1 = (texHeight - bitmap.y) / texHeight; v0 = (texHeight - bh) / texHeight; } // BL uvs[i++] = u0; uvs[i++] = v1; // TL uvs[i++] = u0; uvs[i++] = v0; // TR uvs[i++] = u1; uvs[i++] = v0; // BR uvs[i++] = u1; uvs[i++] = v1; // Position: the position of the quad vertices // bottom left position const x = glyph.position[0] + bitmap.xoffset; const y = glyph.position[1] + bitmap.yoffset; // quad size const w = bitmap.width; const h = bitmap.height; // BL positions[j++] = x; positions[j++] = -y; positions[j++] = 0; // TL positions[j++] = x; positions[j++] = -(y + h); positions[j++] = 0; // TR positions[j++] = x + w; positions[j++] = -(y + h); positions[j++] = 0; // BR positions[j++] = x + w; positions[j++] = -y; positions[j++] = 0; // Size: The size in the unit of 1,0,0 for the standard size of the text. // Currently used to measure the anti-aliasing scaling ratio in the shader. // BL sizes[k++] = 0; sizes[k++] = 0; // TL sizes[k++] = 0; sizes[k++] = h / fontSize; // TR sizes[k++] = w / fontSize; sizes[k++] = h / fontSize; // BR sizes[k++] = w / fontSize; sizes[k++] = 0; }); return { uvs, positions, sizes }; } /** ***************************************************************** * TextLayout - https://github.com/leochocolat/three-msdf-text-utils/blob/main/src/MSDFTextGeometry/TextLayout.js * Dependencies: Word Wrapping ***************************************************************** */ const X_HEIGHTS = ['x', 'e', 'a', 'o', 'n', 's', 'r', 'c', 'u', 'm', 'v', 'w', 'z']; const M_WIDTHS = ['m', 'w']; const CAP_HEIGHTS = ['H', 'I', 'N', 'E', 'F', 'K', 'L', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; const TAB_ID = '\t'.charCodeAt(0); const SPACE_ID = ' '.charCodeAt(0); const ALIGN_LEFT = 0; const ALIGN_CENTER = 1; const ALIGN_RIGHT = 2; class TextLayout { constructor(options = {}) { this.glyphs = []; this._measure = this.computeMetrics.bind(this); this.update(options); } get width() { return this._width; } get height() { return this._height; } get descender() { return this._descender; } get ascender() { return this._ascender; } get xHeight() { return this._xHeight; } get baseline() { return this._baseline; } get capHeight() { return this._capHeight; } get lineHeight() { return this._lineHeight; } get linesTotal() { return this._linesTotal; } get lettersTotal() { return this._lettersTotal; } get wordsTotal() { return this._wordsTotal; } update(options) { options = Object.assign({ measure: this._measure }, options); this._options = options; this._options.tabSize = number(this._options.tabSize, 4); if (!options.font) { throw new Error('must provide a valid bitmap font') } const glyphs = this.glyphs; const text = options.text || ''; const font = options.font; this._setupSpaceGlyphs(font); const lines = wordwrap(text, options); const minWidth = options.width || 0; const wordsTotal = text.split(' ').filter(word => word !== '\n').length; const lettersTotal = text.split('').filter(char => char !== '\n' && char !== ' ').length; // clear glyphs glyphs.length = 0; // get max line width const maxLineWidth = lines.reduce(function(prev, line) { return Math.max(prev, line.width, minWidth); }, 0); // the pen position let x = 0; let y = 0; const lineHeight = number(options.lineHeight, font.common.lineHeight); const baseline = number(options.baseline, font.common.base); const descender = lineHeight - baseline; const letterSpacing = options.letterSpacing || 0; const height = lineHeight * lines.length - descender; const align = getAlignType(this._options.align); // draw text along baseline y -= height; // the metrics for this text layout this._width = maxLineWidth; this._height = height; this._descender = lineHeight - baseline; this._baseline = baseline; this._xHeight = getXHeight(font); this._capHeight = getCapHeight(font); this._lineHeight = lineHeight; this._ascender = lineHeight - descender - this._xHeight; let wordIndex = 0; let letterIndex = 0; // layout each glyph lines.forEach((line, lineIndex) => { const start = line.start; const end = line.end; const lineWidth = line.width; const lineString = text.slice(start, end); const lineWordsTotal = lineString.split(' ').filter(item => item !== '').length; const lineLettersTotal = text.slice(start, end).split(' ').join('').length; let lineLetterIndex = 0; let lineWordIndex = 0; let lastGlyph; // for each glyph in that line... for (let i = start; i < end; i++) { const id = text.charCodeAt(i); const glyph = this.getGlyph(font, id); if (glyph) { if (lastGlyph) { x += getKerning(font, lastGlyph.id, glyph.id); } let tx = x; if (align === ALIGN_CENTER) { tx += (maxLineWidth - lineWidth) / 2; } else if (align === ALIGN_RIGHT) { tx += (maxLineWidth - lineWidth); } glyphs.push({ position: [tx, y], data: glyph, index: i, // Line linesTotal: lines.length, lineIndex, lineLettersTotal, lineLetterIndex, lineWordsTotal, lineWordIndex, // Word wordsTotal, wordIndex, // Letter lettersTotal, letterIndex }); if (glyph.id === SPACE_ID && (!lastGlyph || lastGlyph.id !== SPACE_ID)) { lineWordIndex++; wordIndex++; } if (glyph.id !== SPACE_ID) { lineLetterIndex++; letterIndex++; } // move pen forward x += glyph.xadvance + letterSpacing; lastGlyph = glyph; } } // next line down y += lineHeight; x = 0; }); this._lettersTotal = lettersTotal; this._wordsTotal = wordsTotal; this._linesTotal = lines.length; } getGlyph(font, id) { const glyph = getGlyphById(font, id); if (glyph) { return glyph; } else if (id === TAB_ID) { return this._fallbackTabGlyph; } else if (id === SPACE_ID) { return this._fallbackSpaceGlyph; } return null; } computeMetrics(text, start, end, width) { const letterSpacing = this._options.letterSpacing || 0; const font = this._options.font; let curPen = 0; let curWidth = 0; let count = 0; let glyph; let lastGlyph; if (!font.chars || font.chars.length === 0) { return { start, end: start, width: 0 }; } end = Math.min(text.length, end); for (let i = start; i < end; i++) { const id = text.charCodeAt(i); glyph = this.getGlyph(font, id); if (glyph) { glyph.char = text[i]; // move pen forward const kern = lastGlyph ? getKerning(font, lastGlyph.id, glyph.id) : 0; curPen += kern; const nextPen = curPen + glyph.xadvance + letterSpacing; const nextWidth = curPen + glyph.width; // we've hit our limit; we can't move onto the next glyph if (nextWidth >= width || nextPen >= width) { break } // otherwise continue along our line curPen = nextPen; curWidth = nextWidth; lastGlyph = glyph; } count++; } // make sure rightmost edge lines up with rendered glyphs if (lastGlyph) { curWidth += lastGlyph.xoffset } return { start, end: start + count, width: curWidth }; } _setupSpaceGlyphs(font) { // These are fallbacks, when the font doesn't include // ' ' or '\t' glyphs this._fallbackSpaceGlyph = null; this._fallbackTabGlyph = null; if (!font.chars || font.chars.length === 0) return; // try to get space glyph // then fall back to the 'm' or 'w' glyphs // then fall back to the first glyph available const space = getGlyphById(font, SPACE_ID) || getMGlyph(font) || font.chars[0]; // and create a fallback for tab const tabWidth = this._options.tabSize * space.xadvance; this._fallbackSpaceGlyph = space; const spaceClone = Object.assign({}, space); this._fallbackTabGlyph = Object.assign(spaceClone, { x: 0, y: 0, xadvance: tabWidth, id: TAB_ID, xoffset: 0, yoffset: 0, width: 0, height: 0 }); } } function getGlyphById(font, id) { if (!font.chars || font.chars.length === 0) { return null } const glyphIdx = findChar(font.chars, id); if (glyphIdx >= 0) { const glyph = font.chars[glyphIdx]; return glyph; } return null; } function getXHeight(font) { for (let i = 0; i < X_HEIGHTS.length; i++) { const id = X_HEIGHTS[i].charCodeAt(0); const idx = findChar(font.chars, id); if (idx >= 0) { return font.chars[idx].height } } return 0; } function getMGlyph(font) { for (let i = 0; i < M_WIDTHS.length; i++) { const id = M_WIDTHS[i].charCodeAt(0); const idx = findChar(font.chars, id); if (idx >= 0) { return font.chars[idx] } } return 0; } function getCapHeight(font) { for (let i = 0; i < CAP_HEIGHTS.length; i++) { const id = CAP_HEIGHTS[i].charCodeAt(0); const idx = findChar(font.chars, id); if (idx >= 0) { return font.chars[idx].height } } return 0; } function getKerning(font, left, right) { if (!font.kernings || font.kernings.length === 0) { return 0 } const table = font.kernings; for (let i = 0; i < table.length; i++) { const kern = table[i]; if (kern.first === left && kern.second === right) { return kern.amount } } return 0; } function getAlignType(align) { if (align === 'center') { return ALIGN_CENTER } else if (align === 'right') { return ALIGN_RIGHT } return ALIGN_LEFT; } function findChar(array, value, start) { start = start || 0; for (let i = start; i < array.length; i++) { if (array[i].id === value) { return i; } } return -1; } function number(num, def) { return typeof num === 'number' ? num : (typeof def === 'number' ? def : 0); } /** ***************************************************************** * Word Wrapping - https://github.com/mattdesl/word-wrapper * Modified to support chinese characters ***************************************************************** */ const newline = /\n/; const newlineChar = '\n'; const whitespace = /\s/; const letter = /[a-zA-Z]/; function wordwrap(text, opt = {}) { // zero width results in nothing visible if (opt.width === 0 && opt.mode !== 'nowrap') { return []; } text = text || ''; const width = typeof opt.width === 'number' ? opt.width : Number.MAX_VALUE; const start = Math.max(0, opt.start || 0); const end = typeof opt.end === 'number' ? opt.end : text.length; const mode = opt.mode; const measure = opt.measure || monospace; if (mode === 'pre') { return pre(measure, text, start, end, width); } else { return greedy(measure, text, start, end, width, mode); } } function idxOf(text, chr, start, end) { const idx = text.indexOf(chr, start); if (idx === -1 || idx > end) { return end; } return idx; } function isWhitespace(chr) { return whitespace.test(chr); } function pre(measure, text, start, end, width) { const lines = []; let lineStart = start; for (let i = start; i < end && i < text.length; i++) { const chr = text.charAt(i); const isNewline = newline.test(chr); // If we've reached a newline, then step down a line // Or if we've reached the EOF if (isNewline || i === end - 1) { const lineEnd = isNewline ? i : i + 1; const measured = measure(text, lineStart, lineEnd, width); lines.push(measured); lineStart = i + 1; } } return lines; } function greedy(measure, text, start, end, width, mode) { // A greedy word wrapper based on LibGDX algorithm // https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/BitmapFontCache.java const lines = []; let testWidth = width; // if 'nowrap' is specified, we only wrap on newline chars if (mode === 'nowrap') { testWidth = Number.MAX_VALUE; } let newParagraph = start; while (start < end && start < text.length) { // get next newline position const newLine = idxOf(text, newlineChar, start, end); // eat whitespace at start of line while (start < newLine) { if (!isWhitespace(text.charAt(start))) { break; } if (start === newParagraph) { break; } start++; } newParagraph = newLine + 1; // determine visible # of glyphs for the available width const measured = measure(text, start, newLine, testWidth); let lineEnd = start + (measured.end - measured.start); let nextStart = lineEnd + newlineChar.length; // if we had to cut the line before the next newline... if (lineEnd < newLine) { // find char to break on while (lineEnd > start) { if (!letter.test(text.charAt(lineEnd))) { // if not a letter, break break; } lineEnd--; } if (lineEnd === start) { if (nextStart > start + newlineChar.length) { nextStart--; } lineEnd = nextStart; // If no characters to break, show all. } else { nextStart = lineEnd; // eat whitespace at end of line while (lineEnd > start) { if (!isWhitespace(text.charAt(lineEnd - newlineChar.length))) { break; } lineEnd--; } } } if (lineEnd >= start) { const result = measure(text, start, lineEnd, testWidth); lines.push(result); } start = nextStart; } return lines; } // determines the visible number of glyphs within a given width function monospace(text, start, end, width) { const glyphs = Math.min(width, end - start); return { start: start, end: start + glyphs }; } export { BitmapTextGeometry }; ================================================ FILE: examples/jsm/geometries/CapsuleGeometry.js ================================================ import { Geometry, Attribute, Buffer, Vector3 } from 't3d'; /** * A geometry class for representing a capsule. */ class CapsuleGeometry extends Geometry { /** * Constructs a new capsule geometry. * @param {number} [radius=1] - Radius of the capsule. * @param {number} [height=1] - Height of the middle section. * @param {number} [capSegments=4] - Number of curve segments used to build each cap. * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3. * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1. */ constructor(radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1) { super(); height = Math.max(0, height); capSegments = Math.max(1, Math.floor(capSegments)); radialSegments = Math.max(3, Math.floor(radialSegments)); heightSegments = Math.max(1, Math.floor(heightSegments)); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables const halfHeight = height / 2; const capArcLength = (Math.PI / 2) * radius; const cylinderPartLength = height; const totalArcLength = 2 * capArcLength + cylinderPartLength; const numVerticalSegments = capSegments * 2 + heightSegments; const verticesPerRow = radialSegments + 1; const normal = new Vector3(); const vertex = new Vector3(); // generate vertices, normals, and uvs for (let iy = 0; iy <= numVerticalSegments; iy++) { let currentArcLength = 0; let profileY = 0; let profileRadius = 0; let normalYComponent = 0; if (iy <= capSegments) { // bottom cap const segmentProgress = iy / capSegments; const angle = (segmentProgress * Math.PI) / 2; profileY = -halfHeight - radius * Math.cos(angle); profileRadius = radius * Math.sin(angle); normalYComponent = -radius * Math.cos(angle); currentArcLength = segmentProgress * capArcLength; } else if (iy <= capSegments + heightSegments) { // middle section const segmentProgress = (iy - capSegments) / heightSegments; profileY = -halfHeight + segmentProgress * height; profileRadius = radius; normalYComponent = 0; currentArcLength = capArcLength + segmentProgress * cylinderPartLength; } else { // top cap const segmentProgress = (iy - capSegments - heightSegments) / capSegments; const angle = (segmentProgress * Math.PI) / 2; profileY = halfHeight + radius * Math.sin(angle); profileRadius = radius * Math.cos(angle); normalYComponent = radius * Math.sin(angle); currentArcLength = capArcLength + cylinderPartLength + segmentProgress * capArcLength; } const v = Math.max(0, Math.min(1, currentArcLength / totalArcLength)); // special case for the poles let uOffset = 0; if (iy === 0) { uOffset = 0.5 / radialSegments; } else if (iy === numVerticalSegments) { uOffset = -0.5 / radialSegments; } for (let ix = 0; ix <= radialSegments; ix++) { const u = ix / radialSegments; const theta = u * Math.PI * 2; const sinTheta = Math.sin(theta); const cosTheta = Math.cos(theta); // vertex vertex.x = -profileRadius * cosTheta; vertex.y = profileY; vertex.z = profileRadius * sinTheta; vertices.push(vertex.x, vertex.y, vertex.z); // normal normal.set( -profileRadius * cosTheta, normalYComponent, profileRadius * sinTheta ); normal.normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(u + uOffset, v); } if (iy > 0) { const prevIndexRow = (iy - 1) * verticesPerRow; for (let ix = 0; ix < radialSegments; ix++) { const i1 = prevIndexRow + ix; const i2 = prevIndexRow + ix + 1; const i3 = iy * verticesPerRow + ix; const i4 = iy * verticesPerRow + ix + 1; indices.push(i1, i2, i3); indices.push(i2, i4, i3); } } } // build geometry this.setIndex( new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1)) ); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); } } export { CapsuleGeometry }; ================================================ FILE: examples/jsm/geometries/CircleGeometry.js ================================================ import { Geometry, Attribute, Buffer, Vector2, Vector3 } from 't3d'; class CircleGeometry extends Geometry { constructor(radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2) { super(); segments = Math.max(3, segments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables const vertex = new Vector3(); const uv = new Vector2(); // center point vertices.push(0, 0, 0); normals.push(0, 0, 1); uvs.push(0.5, 0.5); for (let s = 0, i = 3; s <= segments; s++, i += 3) { const segment = thetaStart + (s / segments) * thetaLength; // vertex vertex.x = radius * Math.cos(segment); vertex.y = radius * Math.sin(segment); vertices.push(vertex.x, vertex.y, vertex.z); // normal normals.push(0, 0, 1); // uvs uv.x = (vertices[i] / radius + 1) / 2; uv.y = (vertices[i + 1] / radius + 1) / 2; uvs.push(uv.x, uv.y); } // indices for (let i = 1; i <= segments; i++) { indices.push(i, i + 1, 0); } // build geometry this.setIndex( new Attribute(new Buffer(vertices.length / 3 > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1)) ); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); } } export { CircleGeometry }; ================================================ FILE: examples/jsm/geometries/GeometryUtils.js ================================================ import { Attribute, Buffer, Geometry, Matrix3, Vector2, Vector3 } from 't3d'; class GeometryUtils { /** * @param {Geometry} geometry */ static computeNormals(geometry) { const index = geometry.index; const attributes = geometry.attributes; const positionAttribute = attributes.a_Position; if (positionAttribute === undefined) { return; } let normalAttribute = attributes.a_Normal; if (normalAttribute === undefined) { normalAttribute = new Attribute(new Buffer(new Float32Array(positionAttribute.buffer.count * 3), 3)); geometry.addAttribute('a_Normal', normalAttribute); } else { for (let i = 0; i < normalAttribute.buffer.array.length; i++) { normalAttribute.buffer.array[i] = 0; // reset existing normals to zero } normalAttribute.buffer.version++; } const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); const nA = new Vector3(), nB = new Vector3(), nC = new Vector3(); const cb = new Vector3(), ab = new Vector3(); if (index) { // indexed elements for (let i = 0, il = index.buffer.count; i < il; i += 3) { const vA = index.buffer.array[i + 0]; const vB = index.buffer.array[i + 1]; const vC = index.buffer.array[i + 2]; pA.fromArray(positionAttribute.buffer.array, vA * 3); pB.fromArray(positionAttribute.buffer.array, vB * 3); pC.fromArray(positionAttribute.buffer.array, vC * 3); cb.subVectors(pC, pB); ab.subVectors(pA, pB); cb.cross(ab); nA.fromArray(normalAttribute.buffer.array, vA * 3); nB.fromArray(normalAttribute.buffer.array, vB * 3); nC.fromArray(normalAttribute.buffer.array, vC * 3); nA.add(cb); nB.add(cb); nC.add(cb); nA.toArray(normalAttribute.buffer.array, vA * 3); nB.toArray(normalAttribute.buffer.array, vB * 3); nC.toArray(normalAttribute.buffer.array, vC * 3); } } else { // non-indexed elements (unconnected triangle soup) for (let i = 0, il = positionAttribute.buffer.count * 3; i < il; i += 9) { pA.fromArray(positionAttribute.buffer.array, i + 0); pB.fromArray(positionAttribute.buffer.array, i + 3); pC.fromArray(positionAttribute.buffer.array, i + 6); cb.subVectors(pC, pB); ab.subVectors(pA, pB); cb.cross(ab); cb.toArray(normalAttribute.buffer.array, i + 0); cb.toArray(normalAttribute.buffer.array, i + 3); cb.toArray(normalAttribute.buffer.array, i + 6); } } this.normalizeNormals(geometry); } /** * @param {Geometry} geometry */ static normalizeNormals(geometry) { const normals = geometry.attributes.a_Normal.buffer; for (let i = 0; i < normals.array.length; i += 3) { _vec3_1.fromArray(normals.array, i); _vec3_1.normalize(); _vec3_1.toArray(normals.array, i); } } /** * @param {Geometry} geometry */ static computeTangents(geometry) { const index = geometry.index; const attributes = geometry.attributes; // based on http://www.terathon.com/code/tangent.html // (per vertex tangents) if (index === null || attributes.a_Position === undefined || attributes.a_Normal === undefined || attributes.a_Uv === undefined) { console.warn('GeometryUtils: .computeTangents() failed. Missing required attributes (index, a_Position, a_Normal or a_Uv)'); return; } const indices = index.buffer.array; const positions = attributes.a_Position.buffer.array; const normals = attributes.a_Normal.buffer.array; const uvs = attributes.a_Uv.buffer.array; const nVertices = positions.length / 3; if (!attributes.a_Tangent) { geometry.addAttribute('a_Tangent', new Attribute(new Buffer(new Float32Array(4 * nVertices), 4))); } const tangents = attributes.a_Tangent.buffer.array; const tan1 = [], tan2 = []; for (let i = 0; i < nVertices; i++) { tan1[i] = new Vector3(); tan2[i] = new Vector3(); } const vA = new Vector3(), vB = new Vector3(), vC = new Vector3(), uvA = new Vector2(), uvB = new Vector2(), uvC = new Vector2(), sdir = new Vector3(), tdir = new Vector3(); function handleTriangle(a, b, c) { vA.fromArray(positions, a * 3); vB.fromArray(positions, b * 3); vC.fromArray(positions, c * 3); uvA.fromArray(uvs, a * 2); uvB.fromArray(uvs, b * 2); uvC.fromArray(uvs, c * 2); vB.sub(vA); vC.sub(vA); uvB.sub(uvA); uvC.sub(uvA); const r = 1.0 / (uvB.x * uvC.y - uvC.x * uvB.y); // silently ignore degenerate uv triangles having coincident or colinear vertices if (!isFinite(r)) return; sdir.copy(vB).multiplyScalar(uvC.y).addScaledVector(vC, -uvB.y).multiplyScalar(r); tdir.copy(vC).multiplyScalar(uvB.x).addScaledVector(vB, -uvC.x).multiplyScalar(r); tan1[a].add(sdir); tan1[b].add(sdir); tan1[c].add(sdir); tan2[a].add(tdir); tan2[b].add(tdir); tan2[c].add(tdir); } let groups = geometry.groups; if (groups.length === 0) { groups = [{ start: 0, count: indices.length }]; } for (let i = 0, il = groups.length; i < il; i++) { const group = groups[i]; const start = group.start; const count = group.count; for (let j = start, jl = start + count; j < jl; j += 3) { handleTriangle( indices[j + 0], indices[j + 1], indices[j + 2] ); } } const tmp = new Vector3(), tmp2 = new Vector3(); const n = new Vector3(), n2 = new Vector3(); function handleVertex(v) { n.fromArray(normals, v * 3); n2.copy(n); const t = tan1[v]; // Gram-Schmidt orthogonalize tmp.copy(t); tmp.sub(n.multiplyScalar(n.dot(t))).normalize(); // Calculate handedness tmp2.crossVectors(n2, t); const test = tmp2.dot(tan2[v]); const w = (test < 0.0) ? -1.0 : 1.0; tangents[v * 4] = tmp.x; tangents[v * 4 + 1] = tmp.y; tangents[v * 4 + 2] = tmp.z; tangents[v * 4 + 3] = -w; // why negative? } for (let i = 0, il = groups.length; i < il; i++) { const group = groups[i]; const start = group.start; const count = group.count; for (let j = start, jl = start + count; j < jl; j += 3) { handleVertex(indices[j + 0]); handleVertex(indices[j + 1]); handleVertex(indices[j + 2]); } } } /** * @param {Array} geometries * @param {boolean} useGroups * @returns {Geometry} */ static mergeGeometries(geometries, useGroups = false) { const isIndexed = geometries[0].index !== null; const attributesUsed = new Set(Object.keys(geometries[0].attributes)); const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes)); const attributes = {}; const morphAttributes = {}; const mergedGeometry = new Geometry(); let offset = 0; for (let i = 0; i < geometries.length; i++) { const geometry = geometries[i]; // ensure that all geometries are indexed, or none if (isIndexed !== (geometry.index !== null)) { console.error('GeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.'); return null; } // gather attributes, exit early if they're different for (const name in geometry.attributes) { if (!attributesUsed.has(name)) { console.error('GeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure "' + name + '" attribute exists among all geometries, or in none of them.'); return null; } if (attributes[name] === undefined) attributes[name] = []; attributes[name].push(geometry.attributes[name]); } // gather morph attributes, exit early they're different for (const name in geometry.morphAttributes) { if (!morphAttributesUsed.has(name)) { console.error('GeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.'); return null; } if (morphAttributes[name] === undefined) morphAttributes[name] = []; morphAttributes[name].push(geometry.morphAttributes[name]); } if (useGroups) { let count; if (isIndexed) { count = geometry.index.buffer.count; } else if (geometry.attributes.a_Position !== undefined) { count = geometry.attributes.a_Position.buffer.count; } else { console.error('GeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or an a_Position attribute'); return null; } mergedGeometry.addGroup(offset, count, i); offset += count; } } // merge indices if (isIndexed) { let indexOffset = 0; const mergedIndex = []; for (let i = 0; i < geometries.length; i++) { const index = geometries[i].index; for (let j = 0; j < index.buffer.count; j++) { mergedIndex.push(index.buffer.array[j] + indexOffset); } indexOffset += geometries[i].attributes.a_Position.buffer.count; } mergedGeometry.setIndex(mergedIndex); } // merge attributes for (const name in attributes) { const mergedAttribute = this.mergeAttributes(attributes[name]); if (!mergedAttribute) { console.error('GeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.'); return null; } mergedGeometry.addAttribute(name, mergedAttribute); } // merge morph attributes for (const name in morphAttributes) { const numMorphTargets = morphAttributes[name][0].length; if (numMorphTargets === 0) break; mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {}; mergedGeometry.morphAttributes[name] = []; for (let i = 0; i < numMorphTargets; i++) { const morphAttributesToMerge = []; for (let j = 0; j < morphAttributes[name].length; j++) { morphAttributesToMerge.push(morphAttributes[name][j][i]); } const mergedMorphAttribute = this.mergeAttributes(morphAttributesToMerge); if (!mergedMorphAttribute) { console.error('GeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.'); return null; } mergedGeometry.morphAttributes[name].push(mergedMorphAttribute); } } return mergedGeometry; } /** * @param {Array} attributes * @returns {Attribute} */ static mergeAttributes(attributes) { let TypedArray; let size; let normalized; let arrayLength = 0; for (let i = 0; i < attributes.length; i++) { const attribute = attributes[i]; if (attribute.buffer.stride !== attribute.size) { console.error('GeometryUtils: .mergeAttributes() failed. Interleaved buffer attributes are not supported.'); return null; } if (TypedArray === undefined) TypedArray = attribute.buffer.array.constructor; if (TypedArray !== attribute.buffer.array.constructor) { console.error('GeometryUtils: .mergeAttributes() failed. Buffer.array must be of consistent array types across matching attributes.'); return null; } if (size === undefined) size = attribute.size; if (size !== attribute.size) { console.error('GeometryUtils: .mergeAttributes() failed. Attribute.size must be consistent across matching attributes.'); return null; } if (normalized === undefined) normalized = attribute.normalized; if (normalized !== attribute.normalized) { console.error('GeometryUtils: .mergeAttributes() failed. Attribute.normalized must be consistent across matching attributes.'); return null; } arrayLength += attribute.buffer.array.length; } const array = new TypedArray(arrayLength); let offset = 0; for (let i = 0; i < attributes.length; i++) { array.set(attributes[i].buffer.array, offset); offset += attributes[i].buffer.array.length; } return new Attribute(new Buffer(array, size), size, 0, normalized); } /** * @param {Geometry} geometry * @param {Matrix4} matrix * @param {boolean} updateBoundings * @returns {Geometry} */ static applyMatrix4(geometry, matrix, updateBoundings) { let array, count, offset; const position = geometry.attributes['a_Position']; if (position !== undefined) { array = position.buffer.array; count = position.buffer.count; offset = position.offset; for (let i = 0; i < count; i++) { _vec3_1.fromArray(array, i * 3 + offset); _vec3_1.applyMatrix4(matrix); _vec3_1.toArray(array, i * 3 + offset); } position.buffer.version++; } const normal = geometry.attributes['a_Normal']; if (normal !== undefined) { array = normal.buffer.array; count = normal.buffer.count; offset = normal.offset; const normalMatrix = _mat3_1.setFromMatrix4(matrix).invert().transpose(); for (let i = 0; i < count; i++) { _vec3_1.fromArray(array, i * 3 + offset); _vec3_1.applyMatrix3(normalMatrix).normalize(); _vec3_1.toArray(array, i * 3 + offset); } normal.buffer.version++; } const tangent = geometry.attributes['a_Tangent']; if (tangent !== undefined) { array = tangent.buffer.array; count = tangent.buffer.count; offset = tangent.offset; for (let i = 0; i < count; i++) { _vec3_1.fromArray(array, i * 3 + offset); _vec3_1.transformDirection(matrix); _vec3_1.toArray(array, i * 3 + offset); } tangent.buffer.version++; } if (geometry.boundingBox !== null && updateBoundings) { geometry.computeBoundingBox(); } if (geometry.boundingSphere !== null && updateBoundings) { geometry.computeBoundingSphere(); } return geometry; } /** * @param {Geometry} geometry * @returns {Attribute} */ static getWireframeAttribute(geometry) { const indices = []; const geometryIndex = geometry.index; const geometryPosition = geometry.attributes.a_Position; if (!geometryPosition) { console.error('GeometryUtils: .getWireframeAttribute() failed. The geometry must have an a_Position attribute'); return null; } if (geometryIndex !== null) { const array = geometryIndex.buffer.array; for (let i = 0, l = array.length; i < l; i += 3) { const a = array[i + 0]; const b = array[i + 1]; const c = array[i + 2]; indices.push(a, b, b, c, c, a); } } else { const array = geometryPosition.buffer.array; for (let i = 0, l = (array.length / 3) - 1; i < l; i += 3) { const a = i + 0; const b = i + 1; const c = i + 2; indices.push(a, b, b, c, c, a); } } return new Attribute(new Buffer( (geometryPosition.buffer.array.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 )); } } const _vec3_1 = new Vector3(); const _mat3_1 = new Matrix3(); export { GeometryUtils }; ================================================ FILE: examples/jsm/geometries/builders/Earcut.js ================================================ /** * Port from https://github.com/mapbox/earcut (v2.2.2) */ const Earcut = { triangulate: function(data, holeIndices, dim) { dim = dim || 2; const hasHoles = holeIndices && holeIndices.length; const outerLen = hasHoles ? holeIndices[0] * dim : data.length; let outerNode = linkedList(data, 0, outerLen, dim, true); const triangles = []; if (!outerNode || outerNode.next === outerNode.prev) return triangles; let minX, minY, maxX, maxY, x, y, invSize; if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox if (data.length > 80 * dim) { minX = maxX = data[0]; minY = maxY = data[1]; for (let i = dim; i < outerLen; i += dim) { x = data[i]; y = data[i + 1]; if (x < minX) minX = x; if (y < minY) minY = y; if (x > maxX) maxX = x; if (y > maxY) maxY = y; } // minX, minY and invSize are later used to transform coords into integers for z-order calculation invSize = Math.max(maxX - minX, maxY - minY); invSize = invSize !== 0 ? 1 / invSize : 0; } earcutLinked(outerNode, triangles, dim, minX, minY, invSize); return triangles; } }; // create a circular doubly linked list from polygon points in the specified winding order function linkedList(data, start, end, dim, clockwise) { let i, last; if (clockwise === (signedArea(data, start, end, dim) > 0)) { for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); } else { for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); } if (last && equals(last, last.next)) { removeNode(last); last = last.next; } return last; } // eliminate colinear or duplicate points function filterPoints(start, end) { if (!start) return start; if (!end) end = start; let p = start, again; do { again = false; if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { removeNode(p); p = end = p.prev; if (p === p.next) break; again = true; } else { p = p.next; } } while (again || p !== end); return end; } // main ear slicing loop which triangulates a polygon (given as a linked list) function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { if (!ear) return; // interlink polygon nodes in z-order if (!pass && invSize) indexCurve(ear, minX, minY, invSize); let stop = ear, prev, next; // iterate through ears, slicing them one by one while (ear.prev !== ear.next) { prev = ear.prev; next = ear.next; if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { // cut off the triangle triangles.push(prev.i / dim); triangles.push(ear.i / dim); triangles.push(next.i / dim); removeNode(ear); // skipping the next vertex leads to less sliver triangles ear = next.next; stop = next.next; continue; } ear = next; // if we looped through the whole remaining polygon and can't find any more ears if (ear === stop) { // try filtering points and slicing again if (!pass) { earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); // if this didn't work, try curing all small self-intersections locally } else if (pass === 1) { ear = cureLocalIntersections(filterPoints(ear), triangles, dim); earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); // as a last resort, try splitting the remaining polygon into two } else if (pass === 2) { splitEarcut(ear, triangles, dim, minX, minY, invSize); } break; } } } // check whether a polygon node forms a valid ear with adjacent nodes function isEar(ear) { const a = ear.prev, b = ear, c = ear.next; if (area(a, b, c) >= 0) return false; // reflex, can't be an ear // now make sure we don't have other points inside the potential ear let p = ear.next.next; while (p !== ear.prev) { if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.next; } return true; } function isEarHashed(ear, minX, minY, invSize) { const a = ear.prev, b = ear, c = ear.next; if (area(a, b, c) >= 0) return false; // reflex, can't be an ear // triangle bbox; min & max are calculated like this for speed const minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); // z-order range for the current triangle bbox; const minZ = zOrder(minTX, minTY, minX, minY, invSize), maxZ = zOrder(maxTX, maxTY, minX, minY, invSize); let p = ear.prevZ, n = ear.nextZ; // look for points inside the triangle in both directions while (p && p.z >= minZ && n && n.z <= maxZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.prevZ; if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; n = n.nextZ; } // look for remaining points in decreasing z-order while (p && p.z >= minZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.prevZ; } // look for remaining points in increasing z-order while (n && n.z <= maxZ) { if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; n = n.nextZ; } return true; } // go through all polygon nodes and cure small local self-intersections function cureLocalIntersections(start, triangles, dim) { let p = start; do { const a = p.prev, b = p.next.next; if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { triangles.push(a.i / dim); triangles.push(p.i / dim); triangles.push(b.i / dim); // remove two nodes involved removeNode(p); removeNode(p.next); p = start = b; } p = p.next; } while (p !== start); return filterPoints(p); } // try splitting polygon into two and triangulate them independently function splitEarcut(start, triangles, dim, minX, minY, invSize) { // look for a valid diagonal that divides the polygon into two let a = start; do { let b = a.next.next; while (b !== a.prev) { if (a.i !== b.i && isValidDiagonal(a, b)) { // split the polygon in two by the diagonal let c = splitPolygon(a, b); // filter colinear points around the cuts a = filterPoints(a, a.next); c = filterPoints(c, c.next); // run earcut on each half earcutLinked(a, triangles, dim, minX, minY, invSize); earcutLinked(c, triangles, dim, minX, minY, invSize); return; } b = b.next; } a = a.next; } while (a !== start); } // link every hole into the outer loop, producing a single-ring polygon without holes function eliminateHoles(data, holeIndices, outerNode, dim) { const queue = []; let i, len, start, end, list; for (i = 0, len = holeIndices.length; i < len; i++) { start = holeIndices[i] * dim; end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; list = linkedList(data, start, end, dim, false); if (list === list.next) list.steiner = true; queue.push(getLeftmost(list)); } queue.sort(compareX); // process holes from left to right for (i = 0; i < queue.length; i++) { eliminateHole(queue[i], outerNode); outerNode = filterPoints(outerNode, outerNode.next); } return outerNode; } function compareX(a, b) { return a.x - b.x; } // find a bridge between vertices that connects hole with an outer ring and and link it function eliminateHole(hole, outerNode) { outerNode = findHoleBridge(hole, outerNode); if (outerNode) { const b = splitPolygon(outerNode, hole); // filter collinear points around the cuts filterPoints(outerNode, outerNode.next); filterPoints(b, b.next); } } // David Eberly's algorithm for finding a bridge between hole and outer polygon function findHoleBridge(hole, outerNode) { let p = outerNode; const hx = hole.x; const hy = hole.y; let qx = -Infinity, m; // find a segment intersected by a ray from the hole's leftmost point to the left; // segment's endpoint with lesser x will be potential connection point do { if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); if (x <= hx && x > qx) { qx = x; if (x === hx) { if (hy === p.y) return p; if (hy === p.next.y) return p.next; } m = p.x < p.next.x ? p : p.next; } } p = p.next; } while (p !== outerNode); if (!m) return null; if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint // look for points inside the triangle of hole point, segment intersection and endpoint; // if there are no points found, we have a valid connection; // otherwise choose the point of the minimum angle with the ray as connection point const stop = m, mx = m.x, my = m.y; let tanMin = Infinity, tan; p = m; do { if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { tan = Math.abs(hy - p.y) / (hx - p.x); // tangential if (locallyInside(p, hole) && (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) { m = p; tanMin = tan; } } p = p.next; } while (p !== stop); return m; } // whether sector in vertex m contains sector in vertex p in the same coordinates function sectorContainsSector(m, p) { return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; } // interlink polygon nodes in z-order function indexCurve(start, minX, minY, invSize) { let p = start; do { if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize); p.prevZ = p.prev; p.nextZ = p.next; p = p.next; } while (p !== start); p.prevZ.nextZ = null; p.prevZ = null; sortLinked(p); } // Simon Tatham's linked list merge sort algorithm // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html function sortLinked(list) { let i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; do { p = list; list = null; tail = null; numMerges = 0; while (p) { numMerges++; q = p; pSize = 0; for (i = 0; i < inSize; i++) { pSize++; q = q.nextZ; if (!q) break; } qSize = inSize; while (pSize > 0 || (qSize > 0 && q)) { if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { e = p; p = p.nextZ; pSize--; } else { e = q; q = q.nextZ; qSize--; } if (tail) tail.nextZ = e; else list = e; e.prevZ = tail; tail = e; } p = q; } tail.nextZ = null; inSize *= 2; } while (numMerges > 1); return list; } // z-order of a point given coords and inverse of the longer side of data bbox function zOrder(x, y, minX, minY, invSize) { // coords are transformed into non-negative 15-bit integer range x = 32767 * (x - minX) * invSize; y = 32767 * (y - minY) * invSize; x = (x | (x << 8)) & 0x00FF00FF; x = (x | (x << 4)) & 0x0F0F0F0F; x = (x | (x << 2)) & 0x33333333; x = (x | (x << 1)) & 0x55555555; y = (y | (y << 8)) & 0x00FF00FF; y = (y | (y << 4)) & 0x0F0F0F0F; y = (y | (y << 2)) & 0x33333333; y = (y | (y << 1)) & 0x55555555; return x | (y << 1); } // find the leftmost node of a polygon ring function getLeftmost(start) { let p = start, leftmost = start; do { if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p; p = p.next; } while (p !== start); return leftmost; } // check if a point lies within a convex triangle function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; } // check if a diagonal between two polygon nodes is valid (lies in polygon interior) function isValidDiagonal(a, b) { return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case } // signed area of a triangle function area(p, q, r) { return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); } // check if two points are equal function equals(p1, p2) { return p1.x === p2.x && p1.y === p2.y; } // check if two segments intersect function intersects(p1, q1, p2, q2) { const o1 = sign(area(p1, q1, p2)); const o2 = sign(area(p1, q1, q2)); const o3 = sign(area(p2, q2, p1)); const o4 = sign(area(p2, q2, q1)); if (o1 !== o2 && o3 !== o4) return true; // general case if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 return false; } // for collinear points p, q, r, check if point q lies on segment pr function onSegment(p, q, r) { return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); } function sign(num) { return num > 0 ? 1 : num < 0 ? -1 : 0; } // check if a polygon diagonal intersects any polygon segments function intersectsPolygon(a, b) { let p = a; do { if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true; p = p.next; } while (p !== a); return false; } // check if a polygon diagonal is locally inside the polygon function locallyInside(a, b) { return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; } // check if the middle point of a polygon diagonal is inside the polygon function middleInside(a, b) { let p = a, inside = false; const px = (a.x + b.x) / 2, py = (a.y + b.y) / 2; do { if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) { inside = !inside } p = p.next; } while (p !== a); return inside; } // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; // if one belongs to the outer ring and another to a hole, it merges it into a single ring function splitPolygon(a, b) { const a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev; a.next = b; b.prev = a; a2.next = an; an.prev = a2; b2.next = a2; a2.prev = b2; bp.next = b2; b2.prev = bp; return b2; } // create a node and optionally link it with previous one (in a circular doubly linked list) function insertNode(i, x, y, last) { const p = new Node(i, x, y); if (!last) { p.prev = p; p.next = p; } else { p.next = last.next; p.prev = last; last.next.prev = p; last.next = p; } return p; } function removeNode(p) { p.next.prev = p.prev; p.prev.next = p.next; if (p.prevZ) p.prevZ.nextZ = p.nextZ; if (p.nextZ) p.nextZ.prevZ = p.prevZ; } function Node(i, x, y) { // vertex index in coordinates array this.i = i; // vertex coordinates this.x = x; this.y = y; // previous and next vertex nodes in a polygon ring this.prev = null; this.next = null; // z-order curve value this.z = null; // previous and next nodes in z-order this.prevZ = null; this.nextZ = null; // indicates whether this is a steiner point this.steiner = false; } function signedArea(data, start, end, dim) { let sum = 0; for (let i = start, j = end - dim; i < end; i += dim) { sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); j = i; } return sum; } export { Earcut }; ================================================ FILE: examples/jsm/geometries/builders/EdgesBuilder.js ================================================ /** * EdgesBuilder is a helper for building edges geometry from given triangles data. */ const EdgesBuilder = { /** * @param {Array} bufferArray - Flat buffer array containing vertex positions. * @param {Array} [indices] - Flat buffer array of indices, must be multiple of 3. * @param {object} [options={}] - The options object. * @param {number} [options.thresholdAngle=1] - An edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. * @param {number} [options.stride=3] - The number of values of the array that should be associated with a particular vertex. * @param {number} [options.offset=0] - The offset in the buffer array where the position starts. * @returns {object} - The edges geometry data. */ getGeometryData: function(bufferArray, indices, options = {}) { const thresholdAngle = options.thresholdAngle !== undefined ? options.thresholdAngle : 1; const stride = options.stride !== undefined ? options.stride : 3; const offset = options.offset !== undefined ? options.offset : 0; let i, j, l, key, face; const result = []; /** merge vertices */ const verticesMap = {}; const unique = [], changes = []; const precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 const precision = Math.pow(10, precisionPoints); let offsetIndex, x, y, z; l = bufferArray.length / stride; for (i = 0; i < l; i++) { offsetIndex = i * stride + offset; x = bufferArray[offsetIndex + 0]; y = bufferArray[offsetIndex + 1]; z = bufferArray[offsetIndex + 2]; key = Math.round(x * precision) + '_' + Math.round(y * precision) + '_' + Math.round(z * precision); if (verticesMap[key] === undefined) { verticesMap[key] = i; unique.push(x, y, z); changes[i] = unique.length / 3 - 1; } else { changes[i] = changes[verticesMap[key]]; } } /** get faces (vertices and normal) */ const faces = []; if (indices) { l = indices.length / 3; for (i = 0; i < l; i++) { face = { i: [0, 0, 0], n: [1, 1, 1] }; face.i[0] = changes[indices[i * 3 + 0]]; face.i[1] = changes[indices[i * 3 + 1]]; face.i[2] = changes[indices[i * 3 + 2]]; computeFaceNormal(face, unique); faces.push(face); } } else { for (i = 0; i < l; i++) { face = { i: [0, 0, 0], n: [1, 1, 1] }; face.i[0] = changes[i * 3 + 0]; face.i[1] = changes[i * 3 + 1]; face.i[2] = changes[i * 3 + 2]; computeFaceNormal(face, unique); faces.push(face); } } /** * get edges { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined } */ let edge1, edge2; const edge = [0, 0], edges = {}; for (i = 0, l = faces.length; i < l; i++) { face = faces[i]; for (j = 0; j < 3; j++) { edge1 = face.i[j]; edge2 = face.i[(j + 1) % 3]; edge[0] = Math.min(edge1, edge2); edge[1] = Math.max(edge1, edge2); key = edge[0] + ',' + edge[1]; if (edges[key] === undefined) { edges[key] = { index1: edge[0], index2: edge[1], face1: i, face2: undefined }; } else { edges[key].face2 = i; } } } /** edges filter */ const thresholdDot = Math.cos(DEG2RAD * thresholdAngle); for (key in edges) { const e = edges[key]; // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. if (e.face2 === undefined || dot(faces[e.face1].n, faces[e.face2].n) <= thresholdDot) { result.push( unique[e.index1 * 3 + 0], unique[e.index1 * 3 + 1], unique[e.index1 * 3 + 2], unique[e.index2 * 3 + 0], unique[e.index2 * 3 + 1], unique[e.index2 * 3 + 2] ); } } /** return */ return { positions: result }; } }; function dot(v1, v2) { return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; } function computeFaceNormal(face, buffer) { const vAX = buffer[face.i[0] * 3 + 0]; const vAY = buffer[face.i[0] * 3 + 1]; const vAZ = buffer[face.i[0] * 3 + 2]; const vBX = buffer[face.i[1] * 3 + 0]; const vBY = buffer[face.i[1] * 3 + 1]; const vBZ = buffer[face.i[1] * 3 + 2]; const vCX = buffer[face.i[2] * 3 + 0]; const vCY = buffer[face.i[2] * 3 + 1]; const vCZ = buffer[face.i[2] * 3 + 2]; const cbX = vCX - vBX; // ax const cbY = vCY - vBY; // ay const cbZ = vCZ - vBZ; // az const abX = vAX - vBX; // bx const abY = vAY - vBY; // by const abZ = vAZ - vBZ; // bz let nX = cbY * abZ - cbZ * abY; let nY = cbZ * abX - cbX * abZ; let nZ = cbX * abY - cbY * abX; const nLen = Math.sqrt(nX * nX + nY * nY + nZ * nZ); nX /= nLen; nY /= nLen; nZ /= nLen; face.n[0] = nX; face.n[1] = nY; face.n[2] = nZ; } const DEG2RAD = Math.PI / 180; export { EdgesBuilder }; ================================================ FILE: examples/jsm/geometries/builders/ExtrudeShapeBuilder.js ================================================ import { Vector3 } from 't3d'; import { Earcut } from './Earcut.js'; import { GeometryBuilderUtils } from './GeometryBuilderUtils.js'; /** * ExtrudeShapeBuilder */ const ExtrudeShapeBuilder = { /** * @param {object} shape - The shape. * @param {Array} shape.contour - The holes of this shape, for example: [[0, 0], [0, 5], [5, 5], [5, 0]] * @param {Array} shape.holes - The holes of this shape, for example: [[[1, 3], [1, 4], [4, 4], [4, 3]], [[1, 1], [1, 2], [4, 1]]] * @param {Array} [shape.depth=1] - The depth of this shape. If it is a negative number, extrude in the positive direction of the z-axis, otherwise, extrude in the negative direction of the z-axis. * @param {boolean} [shape.generateTop=true] - Whether to generate the top face. * @param {boolean} [shape.generateBottom=true] - Whether to generate the bottom face. * @param {object} [shape.pathFrames] - The path frames data. If it is not undefined, the shape will be extruded along the path. * @returns {object} The geometry data. */ getGeometryData: function(shape) { const depth = (shape.depth !== undefined) ? shape.depth : 1; const generateTop = (shape.generateTop !== undefined) ? shape.generateTop : true; const generateBottom = (shape.generateBottom !== undefined) ? shape.generateBottom : true; const pathFrames = shape.pathFrames; let negativeDepth = false; if (!pathFrames) { negativeDepth = depth < 0; } const vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] const holeIndices = []; // array of hole indices GeometryBuilderUtils.convertShapeDataToEarcut(shape, vertices, holeIndices); const faces = Earcut.triangulate(vertices, holeIndices); // build vertex data const positions = []; const uvs = []; const indices = []; let vertexCount = 0; // top if (generateTop) { for (let i = 0, l = vertices.length; i < l; i += 2) { if (pathFrames) { setPositionByPathFrames(pathFrames, 0, vertices[i], vertices[i + 1], positions); } else { positions.push(vertices[i], vertices[i + 1], 0); // x-y plane } uvs.push(negativeDepth ? -vertices[i] : vertices[i], vertices[i + 1]); // world uvs } for (let i = 0, l = faces.length; i < l; i += 3) { if (negativeDepth) { indices.push(faces[i + 0], faces[i + 2], faces[i + 1]); } else { indices.push(faces[i + 0], faces[i + 1], faces[i + 2]); } } } // bottom if (generateBottom) { vertexCount = positions.length / 3; for (let i = 0, l = vertices.length; i < l; i += 2) { if (pathFrames) { setPositionByPathFrames(pathFrames, pathFrames.points.length - 1, vertices[i], vertices[i + 1], positions); } else { positions.push(vertices[i], vertices[i + 1], -depth); // x-y plane } uvs.push(negativeDepth ? vertices[i] : -vertices[i], vertices[i + 1]); // world uvs } for (let i = 0, l = faces.length; i < l; i += 3) { if (negativeDepth) { indices.push(vertexCount + faces[i + 1], vertexCount + faces[i + 2], vertexCount + faces[i + 0]); } else { indices.push(vertexCount + faces[i + 2], vertexCount + faces[i + 1], vertexCount + faces[i + 0]); } } } // side vertexCount = positions.length / 3; const hasHoles = holeIndices.length; const loop = []; if (hasHoles) { loop.push([0, holeIndices[0] * 2]); for (let i = 0; i < holeIndices.length - 1; i++) { loop.push([holeIndices[i] * 2, holeIndices[i + 1] * 2]); } loop.push([holeIndices[holeIndices.length - 1] * 2, vertices.length]); } else { loop.push([0, vertices.length]); } const steps = pathFrames ? pathFrames.points.length - 1 : 1; for (let i = 0; i < loop.length; i++) { let dist = 0; const sideStart = loop[i][0]; const sideFinish = loop[i][1]; for (let j = sideStart; j < sideFinish; j += 2) { const _index1 = j; const _index2 = (j + 2 >= sideFinish) ? sideStart : (j + 2); const _dist1 = dist; const _dist2 = dist - getLength(vertices[_index1 + 0], vertices[_index1 + 1], vertices[_index2 + 0], vertices[_index2 + 1]); dist = _dist2; for (let s = 0; s <= steps; s++) { if (pathFrames) { setPositionByPathFrames(pathFrames, s, vertices[_index1 + 0], vertices[_index1 + 1], positions); setPositionByPathFrames(pathFrames, s, vertices[_index2 + 0], vertices[_index2 + 1], positions); uvs.push(_dist1, -pathFrames.lengths[s]); uvs.push(_dist2, -pathFrames.lengths[s]); } else { const _depth = -depth / steps * s; positions.push(vertices[_index1 + 0], vertices[_index1 + 1], _depth); positions.push(vertices[_index2 + 0], vertices[_index2 + 1], _depth); uvs.push(_dist1, _depth); uvs.push(_dist2, _depth); } if (s > 0) { if (negativeDepth) { indices.push(vertexCount - 2, vertexCount + 0, vertexCount - 1); indices.push(vertexCount - 1, vertexCount + 0, vertexCount + 1); } else { indices.push(vertexCount - 2, vertexCount - 1, vertexCount + 0); indices.push(vertexCount - 1, vertexCount + 1, vertexCount + 0); } } vertexCount += 2; } } } // return return { positions, uvs, indices }; } }; function getLength(x0, y0, x1, y1) { const x = x1 - x0; const y = y1 - y0; return Math.sqrt(x * x + y * y); } const normal = new Vector3(); const binormal = new Vector3(); const position = new Vector3(); function setPositionByPathFrames(frames, index, x, y, positions) { normal.copy(frames.normals[index]).multiplyScalar(y); binormal.copy(frames.binormals[index]).multiplyScalar(x); position.copy(normal).add(binormal); if (frames.sharps[index]) { position.scaleAlong(frames.bisectors[index], frames.widthScales[index]); } position.add(frames.points[index]); positions.push(position.x, position.y, position.z); } export { ExtrudeShapeBuilder }; ================================================ FILE: examples/jsm/geometries/builders/Font.js ================================================ import { Vector2 } from 't3d'; import { CubicBezierCurve2 } from '../../math/curves/CubicBezierCurve2.js'; import { CurvePath3 } from '../../math/curves/CurvePath3.js'; import { LineCurve2 } from '../../math/curves/LineCurve2.js'; import { QuadraticBezierCurve2 } from '../../math/curves/QuadraticBezierCurve2.js'; class Font { constructor(data) { this.data = data; } generateShapes(text, size = 100) { const shapes = []; const paths = createPaths(text, size, this.data); // curvePath3 for (let p = 0, pl = paths.length; p < pl; p++) { getShapes(paths[p], shapes); } return shapes; } } function createPaths(text, size, data) { const chars = Array.from(text); const scale = size / data.resolution; const line_height = (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale; const paths = []; let offsetX = 0, offsetY = 0; for (let i = 0; i < chars.length; i++) { const char = chars[i]; if (char === '\n') { offsetX = 0; offsetY -= line_height; } else { const ret = createPath(char, scale, offsetX, offsetY, data); offsetX += ret.offsetX; paths.push(ret.path); } } return paths; } function createPath(char, scale, offsetX, offsetY, data) { const glyph = data.glyphs[char] || data.glyphs['?']; if (!glyph) { console.error('Font: character "' + char + '" does not exists in font family ' + data.familyName + '.'); return; } let count = -1; const path = []; let x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2; if (glyph.o) { const outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' ')); const currentPoint = [0, 0]; for (let i = 0, l = outline.length; i < l;) { const action = outline[i++]; switch (action) { case 'm': { // move points count++; path[count] = new CurvePath3(); x = outline[i++] * scale + offsetX; y = outline[i++] * scale + offsetY; currentPoint[0] = x; currentPoint[1] = y; break; } case 'l': { // line x = outline[i++] * scale + offsetX; y = outline[i++] * scale + offsetY; const lineCurve = new LineCurve2(new Vector2(currentPoint[0], currentPoint[1]), new Vector2(x, y)); path[count].curves.push(lineCurve); currentPoint[0] = x; currentPoint[1] = y; break; } case 'q': { // quadraticCurve cpx = outline[i++] * scale + offsetX; cpy = outline[i++] * scale + offsetY; cpx1 = outline[i++] * scale + offsetX; cpy1 = outline[i++] * scale + offsetY; const quadraticBezierCurve = new QuadraticBezierCurve2(new Vector2(currentPoint[0], currentPoint[1]), new Vector2(cpx1, cpy1), new Vector2(cpx, cpy)); path[count].curves.push(quadraticBezierCurve); currentPoint[0] = cpx; currentPoint[1] = cpy; break; } case 'b': { // bezierCurve cpx = outline[i++] * scale + offsetX; cpy = outline[i++] * scale + offsetY; cpx1 = outline[i++] * scale + offsetX; cpy1 = outline[i++] * scale + offsetY; cpx2 = outline[i++] * scale + offsetX; cpy2 = outline[i++] * scale + offsetY; const cubicBezierCurve = new CubicBezierCurve2(new Vector2(currentPoint[0], currentPoint[1]), new Vector2(cpx1, cpy1), new Vector2(cpx2, cpy2), new Vector2(cpx, cpy)); path[count].curves.push(cubicBezierCurve); currentPoint[0] = cpx; currentPoint[1] = cpy; break; } } } } return { offsetX: glyph.ha * scale, path: path }; } function getShapes(curvePaths, shapes = []) { if (curvePaths.length === 0) return []; let tmpPath, tmpShape, tempPoints; if (curvePaths.length === 1) { tmpPath = curvePaths[0]; tempPoints = tmpPath.getPoints(); tmpShape = { contour: vectorsToArray(tempPoints), holes: [] }; shapes.push(tmpShape); return shapes; } const holesFirst = !isClockWise(curvePaths[0].getPoints()); const newShapes = []; const newShapeHoles = []; let mainIdx = 0; let tmpPoints; newShapes[mainIdx] = undefined; newShapeHoles[mainIdx] = []; for (let i = 0, l = curvePaths.length; i < l; i++) { tmpPath = curvePaths[i]; tmpPoints = tmpPath.getPoints(); const solid = isClockWise(tmpPoints); if (solid) { if ((!holesFirst) && (newShapes[mainIdx])) mainIdx++; newShapes[mainIdx] = { contour: vectorsToArray(tmpPoints), holes: [] }; if (holesFirst) mainIdx++; newShapeHoles[mainIdx] = []; } else { newShapeHoles[mainIdx].push({ l: tmpPath, p: tmpPoints[0] }); } } let tmpHoles; for (let i = 0, il = newShapes.length; i < il; i++) { tmpShape = newShapes[i]; shapes.push(tmpShape); tmpHoles = newShapeHoles[i]; for (let j = 0, jl = tmpHoles.length; j < jl; j++) { tmpShape.holes.push(vectorsToArray(tmpHoles[j].l.getPoints())); } } return shapes; } // change vector2 to to two-dimensional array function vectorsToArray(vectors) { const target = []; for (let i = 0; i < vectors.length; i++) { target.push([vectors[i].x, vectors[i].y]); } return target; } function isClockWise(contour) { const n = contour.length; let a = 0.0; for (let p = n - 1, q = 0; q < n; p = q++) { a += contour[p].x * contour[q].y - contour[q].x * contour[p].y; } return a * 0.5 < 0; } export { Font }; ================================================ FILE: examples/jsm/geometries/builders/GeometryBuilderUtils.js ================================================ /** * Geometry Builder Utils */ const GeometryBuilderUtils = { convertShapeDataToEarcut: function(shape, vertices, holeIndices) { let contour = shape.contour; const holes = shape.holes; // check directions of shape contour and holes if (!isClockWise(contour)) { contour = contour.reverse(); } if (holes) { for (let i = 0, l = holes.length; i < l; i++) { const hole = holes[i]; if (isClockWise(hole)) { holes[i] = hole.reverse(); } } } // triangulate shape by Earcut vertices = vertices || []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] holeIndices = holeIndices || []; // array of hole indices removeDupEndPts(contour); addContour(vertices, contour); if (holes) { let holeIndex = contour.length; holes.forEach(removeDupEndPts); for (let i = 0; i < holes.length; i++) { holeIndices.push(holeIndex); holeIndex += holes[i].length; addContour(vertices, holes[i]); } } } }; function area(contour) { const n = contour.length; let a = 0.0; for (let p = n - 1, q = 0; q < n; p = q++) { a += contour[p][0] * contour[q][1] - contour[q][0] * contour[p][1]; } return a * 0.5; } function isClockWise(contour) { return area(contour) < 0; } function removeDupEndPts(contour) { const l = contour.length; if (l > 2 && isArrayEquals(contour[l - 1], contour[0])) { contour.pop(); } } function isArrayEquals(a1, a2) { if (a1.length !== a2.length) { return false; } for (let i = 0, l = a1.length; i < l; i++) { if (a1[i] !== a2[i]) { return false; } } return true; } function addContour(vertices, contour) { for (let i = 0; i < contour.length; i++) { vertices.push(contour[i][0]); vertices.push(contour[i][1]); } } export { GeometryBuilderUtils }; ================================================ FILE: examples/jsm/geometries/builders/LatheBuilder.js ================================================ import { Vector2, Vector3, MathUtils } from 't3d'; /** * LatheBuilder */ const LatheBuilder = { /** * @param {Array} points - The points of the lathe, for example: [[0, -0.5], [0.5, 0], [0, 0.5]] * @param {number} [segments=12] - The number of circumference segments to generate * @param {number} [phiStart=0] - The starting angle in radians * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section, less than 2PI is a portion * @returns {object} The geometry data. */ getGeometryData: function(points, segments = 12, phiStart = 0, phiLength = Math.PI * 2) { segments = Math.floor(segments); // clamp phiLength so it's in range of [ 0, 2PI ] phiLength = MathUtils.clamp(phiLength, 0, Math.PI * 2); // buffers const indices = []; const positions = []; const uvs = []; const initNormals = []; const normals = []; // helper variables const inverseSegments = 1.0 / segments; const vertex = new Vector3(); const uv = new Vector2(); const normal = new Vector3(); const curNormal = new Vector3(); const prevNormal = new Vector3(); let dx = 0; let dy = 0; // pre-compute normals for initial "meridian" for (let j = 0; j <= (points.length - 1); j++) { switch (j) { case 0: // special handling for 1st vertex on path dx = points[j + 1][0] - points[j][0]; dy = points[j + 1][1] - points[j][1]; normal.x = dy * 1.0; normal.y = -dx; normal.z = dy * 0.0; prevNormal.copy(normal); normal.normalize(); initNormals.push(normal.x, normal.y, normal.z); break; case points.length - 1: // special handling for last Vertex on path initNormals.push(prevNormal.x, prevNormal.y, prevNormal.z); break; default: // default handling for all positions in between dx = points[j + 1][0] - points[j][0]; dy = points[j + 1][1] - points[j][1]; normal.x = dy * 1.0; normal.y = -dx; normal.z = dy * 0.0; curNormal.copy(normal); normal.x += prevNormal.x; normal.y += prevNormal.y; normal.z += prevNormal.z; normal.normalize(); initNormals.push(normal.x, normal.y, normal.z); prevNormal.copy(curNormal); } } // generate positions, uvs and normals for (let i = 0; i <= segments; i++) { const phi = phiStart + i * inverseSegments * phiLength; const sin = Math.sin(phi); const cos = Math.cos(phi); for (let j = 0; j <= (points.length - 1); j++) { // vertex vertex.x = points[j][0] * sin; vertex.y = points[j][1]; vertex.z = points[j][0] * cos; positions.push(vertex.x, vertex.y, vertex.z); // uv uv.x = i / segments; uv.y = j / (points.length - 1); uvs.push(uv.x, uv.y); // normal const x = initNormals[3 * j + 0] * sin; const y = initNormals[3 * j + 1]; const z = initNormals[3 * j + 0] * cos; normals.push(x, y, z); } } // indices for (let i = 0; i < segments; i++) { for (let j = 0; j < points.length - 1; j++) { const base = j + i * points.length; const a = base; const b = base + points.length; const c = base + points.length + 1; const d = base + 1; // faces indices.push(a, b, d); indices.push(c, d, b); } } // return return { positions, normals, uvs, indices }; } }; export { LatheBuilder }; ================================================ FILE: examples/jsm/geometries/builders/PolygonBuilder.js ================================================ import { Earcut } from './Earcut.js'; import { GeometryBuilderUtils } from './GeometryBuilderUtils.js'; /** * PolygonBuilder */ const PolygonBuilder = { /** * @param {object} shape - The shape. * @param {Array} shape.contour - The holes of this shape, for example: [[0, 0], [0, 5], [5, 5], [5, 0]] * @param {Array} shape.holes - The holes of this shape, for example: [[[1, 3], [1, 4], [4, 4], [4, 3]], [[1, 1], [1, 2], [4, 1]]] * @returns {object} The geometry data. */ getGeometryData: function(shape) { const vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ] const holeIndices = []; // array of hole indices GeometryBuilderUtils.convertShapeDataToEarcut(shape, vertices, holeIndices); const indices = Earcut.triangulate(vertices, holeIndices); // build vertex data const positions = []; const normals = []; const uvs = []; for (let i = 0, l = vertices.length; i < l; i += 2) { positions.push(vertices[i], vertices[i + 1], 0); // x-y plane normals.push(0, 0, 1); // positive z uvs.push(vertices[i], vertices[i + 1]); // world uvs } // return return { positions, normals, uvs, indices }; } }; export { PolygonBuilder }; ================================================ FILE: examples/jsm/geometries/builders/PolyhedronBuilder.js ================================================ import { Vector3, Vector2 } from 't3d'; class PolyhedronBuilder { static getGeometryData(vertices, indices, radius = 1, detail = 0) { // default buffer data const vertexBuffer = []; const uvBuffer = []; // the subdivision creates the vertex buffer data subdivide(detail); // all vertices should lie on a conceptual sphere with a given radius applyRadius(radius); // finally, create the uv data generateUVs(); // helper functions function subdivide(detail) { const a = new Vector3(); const b = new Vector3(); const c = new Vector3(); // iterate over all faces and apply a subdivision with the given detail value for (let i = 0; i < indices.length; i += 3) { // get the vertices of the face getVertexByIndex(indices[i + 0], a); getVertexByIndex(indices[i + 1], b); getVertexByIndex(indices[i + 2], c); // perform subdivision subdivideFace(a, b, c, detail); } } function subdivideFace(a, b, c, detail) { const cols = detail + 1; // we use this multidimensional array as a data structure for creating the subdivision const v = []; // construct all of the vertices for this subdivision for (let i = 0; i <= cols; i++) { v[i] = []; const aj = a.clone().lerp(c, i / cols); const bj = b.clone().lerp(c, i / cols); const rows = cols - i; for (let j = 0; j <= rows; j++) { if (j === 0 && i === cols) { v[i][j] = aj; } else { v[i][j] = aj.clone().lerp(bj, j / rows); } } } // construct all of the faces for (let i = 0; i < cols; i++) { for (let j = 0; j < 2 * (cols - i) - 1; j++) { const k = Math.floor(j / 2); if (j % 2 === 0) { pushVertex(v[i][k + 1]); pushVertex(v[i + 1][k]); pushVertex(v[i][k]); } else { pushVertex(v[i][k + 1]); pushVertex(v[i + 1][k + 1]); pushVertex(v[i + 1][k]); } } } } function applyRadius(radius) { const vertex = new Vector3(); // iterate over the entire buffer and apply the radius to each vertex for (let i = 0; i < vertexBuffer.length; i += 3) { vertex.x = vertexBuffer[i + 0]; vertex.y = vertexBuffer[i + 1]; vertex.z = vertexBuffer[i + 2]; vertex.normalize().multiplyScalar(radius); vertexBuffer[i + 0] = vertex.x; vertexBuffer[i + 1] = vertex.y; vertexBuffer[i + 2] = vertex.z; } } function generateUVs() { const vertex = new Vector3(); for (let i = 0; i < vertexBuffer.length; i += 3) { vertex.x = vertexBuffer[i + 0]; vertex.y = vertexBuffer[i + 1]; vertex.z = vertexBuffer[i + 2]; const u = azimuth(vertex) / 2 / Math.PI + 0.5; const v = inclination(vertex) / Math.PI + 0.5; uvBuffer.push(u, 1 - v); } correctUVs(); correctSeam(); } function correctSeam() { // handle case when face straddles the seam, see #3269 for (let i = 0; i < uvBuffer.length; i += 6) { // uv data of a single face const x0 = uvBuffer[i + 0]; const x1 = uvBuffer[i + 2]; const x2 = uvBuffer[i + 4]; const max = Math.max(x0, x1, x2); const min = Math.min(x0, x1, x2); // 0.9 is somewhat arbitrary if (max > 0.9 && min < 0.1) { if (x0 < 0.2) uvBuffer[i + 0] += 1; if (x1 < 0.2) uvBuffer[i + 2] += 1; if (x2 < 0.2) uvBuffer[i + 4] += 1; } } } function pushVertex(vertex) { vertexBuffer.push(vertex.x, vertex.y, vertex.z); } function getVertexByIndex(index, vertex) { const stride = index * 3; vertex.x = vertices[stride + 0]; vertex.y = vertices[stride + 1]; vertex.z = vertices[stride + 2]; } function correctUVs() { const a = new Vector3(); const b = new Vector3(); const c = new Vector3(); const centroid = new Vector3(); const uvA = new Vector2(); const uvB = new Vector2(); const uvC = new Vector2(); for (let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6) { a.set(vertexBuffer[i + 0], vertexBuffer[i + 1], vertexBuffer[i + 2]); b.set(vertexBuffer[i + 3], vertexBuffer[i + 4], vertexBuffer[i + 5]); c.set(vertexBuffer[i + 6], vertexBuffer[i + 7], vertexBuffer[i + 8]); uvA.set(uvBuffer[j + 0], uvBuffer[j + 1]); uvB.set(uvBuffer[j + 2], uvBuffer[j + 3]); uvC.set(uvBuffer[j + 4], uvBuffer[j + 5]); centroid.copy(a).add(b).add(c).multiplyScalar(1 / 3); const azi = azimuth(centroid); correctUV(uvA, j + 0, a, azi); correctUV(uvB, j + 2, b, azi); correctUV(uvC, j + 4, c, azi); } } function correctUV(uv, stride, vector, azimuth) { if ((azimuth < 0) && (uv.x === 1)) { uvBuffer[stride] = uv.x - 1; } if ((vector.x === 0) && (vector.z === 0)) { uvBuffer[stride] = azimuth / 2 / Math.PI + 0.5; } } // Angle around the Y axis, counter-clockwise when looking from above. function azimuth(vector) { return Math.atan2(vector.z, -vector.x); } // Angle above the XZ plane. function inclination(vector) { return Math.atan2(-vector.y, Math.sqrt((vector.x * vector.x) + (vector.z * vector.z))); } return { positions: vertexBuffer, uvs: uvBuffer }; } static getTetrahedronGeometryData(radius = 1, detail = 0) { const vertices = [ 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1 ]; const indices = [ 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 ]; return this.getGeometryData(vertices, indices, radius, detail); } static getOctahedronGeometryData(radius = 1, detail = 0) { const vertices = [ 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1 ]; const indices = [ 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 ]; return this.getGeometryData(vertices, indices, radius, detail); } static getIcosahedronGeometryData(radius = 1, detail = 0) { const t = (1 + Math.sqrt(5)) / 2; const vertices = [ -1, t, 0, 1, t, 0, -1, -t, 0, 1, -t, 0, 0, -1, t, 0, 1, t, 0, -1, -t, 0, 1, -t, t, 0, -1, t, 0, 1, -t, 0, -1, -t, 0, 1 ]; const indices = [ 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 ]; return this.getGeometryData(vertices, indices, radius, detail); } static getDodecahedronGeometryData(radius = 1, detail = 0) { const t = (1 + Math.sqrt(5)) / 2; const r = 1 / t; const vertices = [ // (±1, ±1, ±1) -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, // (0, ±1/φ, ±φ) 0, -r, -t, 0, -r, t, 0, r, -t, 0, r, t, // (±1/φ, ±φ, 0) -r, -t, 0, -r, t, 0, r, -t, 0, r, t, 0, // (±φ, 0, ±1/φ) -t, 0, -r, t, 0, -r, -t, 0, r, t, 0, r ]; const indices = [ 3, 11, 7, 3, 7, 15, 3, 15, 13, 7, 19, 17, 7, 17, 6, 7, 6, 15, 17, 4, 8, 17, 8, 10, 17, 10, 6, 8, 0, 16, 8, 16, 2, 8, 2, 10, 0, 12, 1, 0, 1, 18, 0, 18, 16, 6, 10, 2, 6, 2, 13, 6, 13, 15, 2, 16, 18, 2, 18, 3, 2, 3, 13, 18, 1, 9, 18, 9, 11, 18, 11, 3, 4, 14, 12, 4, 12, 0, 4, 0, 8, 11, 9, 5, 11, 5, 19, 11, 19, 7, 19, 5, 14, 19, 14, 4, 19, 4, 17, 1, 12, 14, 1, 14, 5, 1, 5, 9 ]; return this.getGeometryData(vertices, indices, radius, detail); } } export { PolyhedronBuilder }; ================================================ FILE: examples/jsm/geometries/builders/RouteBuilder.js ================================================ import { Vector3 } from 't3d'; /** * RouteBuilder */ const RouteBuilder = { /** * @param {object} frames * @param {object} [options={}] * @param {number} [options.width=0.1] * @param {boolean} [options.arrow=true] * @param {string} [options.side='both'] - 'both' / 'left' / 'right' * @param {boolean} [options.sharp=false] * @returns {object} - The geometry data. */ getGeometryData: function(frames, options = {}) { const width = options.width !== undefined ? options.width : 0.1; const arrow = options.arrow !== undefined ? options.arrow : true; const side = options.side !== undefined ? options.side : 'both'; const sharp = options.sharp !== undefined ? options.sharp : false; // build vertex data const positions = []; const normals = []; const uvs = []; const uvs2 = []; const indices = []; const frameLength = frames.points.length; const lastIndex = frameLength - 1; const halfWidth = width / 2; const sideWidth = (side !== 'both' ? width / 2 : width); const totalLength = frames.lengths[lastIndex]; // for sharp corners const sharpUvOffset = halfWidth / sideWidth; const sharpUvOffset2 = halfWidth / totalLength; const leftOffset = new Vector3(); const rightOffset = new Vector3(); const tempPoint1 = new Vector3(); const tempPoint2 = new Vector3(); const left = new Vector3(); const right = new Vector3(); let verticesCount = 0; for (let i = 0; i < frameLength; i++) { const uvDist = frames.lengths[i] / sideWidth; const uvDist2 = frames.lengths[i] / totalLength; if (side !== 'left') { right.copy(frames.binormals[i]).multiplyScalar(halfWidth * frames.widthScales[i]); } else { right.set(0, 0, 0); } if (side !== 'right') { left.copy(frames.binormals[i]).multiplyScalar(-halfWidth * frames.widthScales[i]); } else { left.set(0, 0, 0); } const normal = frames.normals[i]; right.add(frames.points[i]); left.add(frames.points[i]); if (sharp && frames.sharps[i]) { // sharp corners rightOffset.fromArray(positions, positions.length - 3).sub(right); leftOffset.fromArray(positions, positions.length - 6).sub(left); const rightDist = rightOffset.getLength(); const leftDist = leftOffset.getLength(); const sideOffset = leftDist - rightDist; let longerOffset, longEdge; if (sideOffset > 0) { longerOffset = leftOffset; longEdge = left; } else { longerOffset = rightOffset; longEdge = right; } tempPoint1.copy(longerOffset).normalize(Math.abs(sideOffset)).add(longEdge); const _cos = tempPoint2.copy(longEdge).sub(tempPoint1).normalize().dot(frames.tangents[i]); const _len = tempPoint2.copy(longEdge).sub(tempPoint1).getLength(); const _dist = _cos * _len * 2; tempPoint2.copy(frames.tangents[i]).normalize(_dist).add(tempPoint1); if (sideOffset > 0) { positions.push( tempPoint1.x, tempPoint1.y, tempPoint1.z, // 6 right.x, right.y, right.z, // 5 left.x, left.y, left.z, // 4 right.x, right.y, right.z, // 3 tempPoint2.x, tempPoint2.y, tempPoint2.z, // 2 right.x, right.y, right.z // 1 ); verticesCount += 6; indices.push( verticesCount - 6, verticesCount - 8, verticesCount - 7, verticesCount - 6, verticesCount - 7, verticesCount - 5, verticesCount - 4, verticesCount - 6, verticesCount - 5, verticesCount - 2, verticesCount - 4, verticesCount - 1 ); } else { positions.push( left.x, left.y, left.z, // 6 tempPoint1.x, tempPoint1.y, tempPoint1.z, // 5 left.x, left.y, left.z, // 4 right.x, right.y, right.z, // 3 left.x, left.y, left.z, // 2 tempPoint2.x, tempPoint2.y, tempPoint2.z // 1 ); verticesCount += 6; indices.push( verticesCount - 6, verticesCount - 8, verticesCount - 7, verticesCount - 6, verticesCount - 7, verticesCount - 5, verticesCount - 6, verticesCount - 5, verticesCount - 3, verticesCount - 2, verticesCount - 3, verticesCount - 1 ); } normals.push( normal.x, normal.y, normal.z, normal.x, normal.y, normal.z, normal.x, normal.y, normal.z, normal.x, normal.y, normal.z, normal.x, normal.y, normal.z, normal.x, normal.y, normal.z ); uvs.push( uvDist - sharpUvOffset, 0, uvDist - sharpUvOffset, 1, uvDist, 0, uvDist, 1, uvDist + sharpUvOffset, 0, uvDist + sharpUvOffset, 1 ); uvs2.push( uvDist2 - sharpUvOffset2, 0, uvDist2 - sharpUvOffset2, 1, uvDist2, 0, uvDist2, 1, uvDist2 + sharpUvOffset2, 0, uvDist2 + sharpUvOffset2, 1 ); } else { positions.push( left.x, left.y, left.z, right.x, right.y, right.z ); normals.push( normal.x, normal.y, normal.z, normal.x, normal.y, normal.z ); uvs.push( uvDist, 0, uvDist, 1 ); uvs2.push( uvDist2, 0, uvDist2, 1 ); verticesCount += 2; if (i > 0) { indices.push( verticesCount - 2, verticesCount - 4, verticesCount - 3, verticesCount - 2, verticesCount - 3, verticesCount - 1 ); } } } if (arrow) { const uvDist = frames.lengths[lastIndex] / sideWidth; const uvDist2 = frames.lengths[lastIndex] / totalLength; const normal = frames.normals[lastIndex]; if (side !== 'left') { right.copy(frames.binormals[lastIndex]).multiplyScalar(halfWidth * 2); } else { right.set(0, 0, 0); } if (side !== 'right') { left.copy(frames.binormals[lastIndex]).multiplyScalar(-halfWidth * 2); } else { left.set(0, 0, 0); } const sharp = tempPoint1.copy(frames.tangents[lastIndex]).normalize(halfWidth * 3); right.add(frames.points[lastIndex]); left.add(frames.points[lastIndex]); sharp.add(frames.points[lastIndex]); positions.push( left.x, left.y, left.z, right.x, right.y, right.z, sharp.x, sharp.y, sharp.z ); normals.push( normal.x, normal.y, normal.z, normal.x, normal.y, normal.z, normal.x, normal.y, normal.z ); uvs.push( uvDist, side !== 'both' ? (side !== 'right' ? -2 : 0) : -0.5, uvDist, side !== 'both' ? (side !== 'left' ? 2 : 0) : 1.5, uvDist + 1.5, side !== 'both' ? 0 : 0.5 ); uvs2.push( uvDist2, side !== 'both' ? (side !== 'right' ? -2 : 0) : -0.5, uvDist2, side !== 'both' ? (side !== 'left' ? 2 : 0) : 1.5, uvDist2 + (1.5 * width / totalLength), side !== 'both' ? 0 : 0.5 ); verticesCount += 3; indices.push( verticesCount - 1, verticesCount - 3, verticesCount - 2 ); } // return return { positions, normals, uvs, uvs2, indices }; } }; export { RouteBuilder }; ================================================ FILE: examples/jsm/geometries/builders/TorusBuilder.js ================================================ import { Vector3 } from 't3d'; /** * TorusBuilder */ const TorusBuilder = { getGeometryData: function(radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2) { radialSegments = Math.floor(radialSegments); tubularSegments = Math.floor(tubularSegments); const indices = []; const positions = []; const normals = []; const uvs = []; const center = new Vector3(); const vertex = new Vector3(); const normal = new Vector3(); for (let j = 0; j <= radialSegments; j++) { for (let i = 0; i <= tubularSegments; i++) { const u = i / tubularSegments * arc; const v = j / radialSegments * Math.PI * 2; // vertex vertex.x = (radius + tube * Math.cos(v)) * Math.cos(u); vertex.y = (radius + tube * Math.cos(v)) * Math.sin(u); vertex.z = tube * Math.sin(v); positions.push(vertex.x, vertex.y, vertex.z); // normal center.x = radius * Math.cos(u); center.y = radius * Math.sin(u); normal.subVectors(vertex, center).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(i / tubularSegments); uvs.push(j / radialSegments); } } // generate indices for (let j = 1; j <= radialSegments; j++) { for (let i = 1; i <= tubularSegments; i++) { // indices const a = (tubularSegments + 1) * j + i - 1; const b = (tubularSegments + 1) * (j - 1) + i - 1; const c = (tubularSegments + 1) * (j - 1) + i; const d = (tubularSegments + 1) * j + i; // faces indices.push(a, b, d); indices.push(b, c, d); } } // return return { positions, normals, uvs, indices }; } }; export { TorusBuilder }; ================================================ FILE: examples/jsm/geometries/builders/TubeBuilder.js ================================================ import { Vector3, Quaternion } from 't3d'; /** * TubeBuilder */ const TubeBuilder = { /** * @param {object} frames * @param {object} [options={}] * @param {number} [options.radius=0.1] * @param {number} [options.radialSegments=8] * @param {number} [options.startRad=0] * @param {boolean} [options.generateStartCap=false] - Whether to generate the start cap. * @param {boolean} [options.generateEndCap=false] - Whether to generate the end cap. * @returns {object} - The geometry data. */ getGeometryData: function(frames, options = {}) { const radius = options.radius !== undefined ? options.radius : 0.1; const radialSegments = Math.max(2, options.radialSegments !== undefined ? options.radialSegments : 8); const startRad = options.startRad !== undefined ? options.startRad : 0; const generateStartCap = (options.generateStartCap !== undefined) ? options.generateStartCap : false; const generateEndCap = (options.generateEndCap !== undefined) ? options.generateEndCap : false; // build side vertex data const positions = []; const normals = []; const uvs = []; const uvs2 = []; const indices = []; const frameLength = frames.points.length; const lastIndex = frameLength - 1; const circum = radius * 2 * Math.PI; const totalLength = frames.lengths[lastIndex]; const quaternion = new Quaternion(); const segmentVector = new Vector3(); const normalVector = new Vector3(); const offsetVector = new Vector3(); let verticesCount = 0; for (let i = 0; i < frameLength; i++) { const uvDist = frames.lengths[i] / circum; const uvDist2 = frames.lengths[i] / totalLength; const sharp = frames.sharps[i]; const widthScale = frames.widthScales[i]; for (let r = 0; r <= radialSegments; r++) { let _r = r; if (_r == radialSegments) { _r = 0; } segmentVector.copy(frames.normals[i]); quaternion.setFromAxisAngle(frames.tangents[i], startRad + Math.PI * 2 * _r / radialSegments); segmentVector.applyQuaternion(quaternion).normalize(); if (sharp) { // At sharp corners, the cross-section is not a circle, but an ellipse. // Here, we stretch the cross-section according to the direction of the angle bisector. offsetVector.copy(segmentVector) .scaleAlong(frames.bisectors[i], widthScale) .multiplyScalar(radius).add(frames.points[i]); normalVector.copy(segmentVector) .scaleAlong(frames.bisectors[i], 1 / widthScale) .normalize(); } else { // fallback to simple calculation, because the angle is not obvious, // the benefit of precise stretching is not obvious offsetVector.copy(segmentVector).multiplyScalar(radius * widthScale).add(frames.points[i]); normalVector.copy(segmentVector); } positions.push(offsetVector.x, offsetVector.y, offsetVector.z); normals.push(normalVector.x, normalVector.y, normalVector.z); uvs.push(uvDist, r / radialSegments); uvs2.push(uvDist2, r / radialSegments); verticesCount++; } if (i > 0) { const begin1 = verticesCount - (radialSegments + 1) * 2; const begin2 = verticesCount - (radialSegments + 1); for (let i = 0; i < radialSegments; i++) { indices.push( begin2 + i, begin1 + i, begin1 + i + 1, begin2 + i, begin1 + i + 1, begin2 + i + 1 ); } } } // end cap if (radialSegments >= 3 && generateEndCap) { normalVector.copy(frames.tangents[lastIndex]); normalVector.normalize(); for (let r = verticesCount - radialSegments, l = verticesCount; r < l; r++) { positions.push(positions[r * 3], positions[r * 3 + 1], positions[r * 3 + 2]); uvs.push(uvs[r * 2], uvs[r * 2 + 1]); uvs2.push(uvs2[r * 2], uvs2[r * 2 + 1]); normals.push(normalVector.x, normalVector.y, normalVector.z); verticesCount++; } const index = verticesCount - radialSegments; for (let i = 0; i < radialSegments - 2; i++) { indices.push(index, index + i + 1, index + i + 2); } } // start cap if (radialSegments >= 3 && generateStartCap) { normalVector.copy(frames.tangents[0]); normalVector.normalize(); for (let r = 0; r < radialSegments; r++) { positions.push(positions[r * 3], positions[r * 3 + 1], positions[r * 3 + 2]); normals.push(-normalVector.x, -normalVector.y, -normalVector.z); uvs.push(uvs[r * 2], uvs[r * 2 + 1]); uvs2.push(uvs2[r * 2], uvs2[r * 2 + 1]); verticesCount++; } const index = verticesCount - radialSegments; for (let i = 0; i < radialSegments - 2; i++) { indices.push(index, index + i + 2, index + i + 1); } } // return return { positions, normals, uvs, uvs2, indices }; } }; export { TubeBuilder }; ================================================ FILE: examples/jsm/impostor/OctahedralImpostor.js ================================================ import { Mesh, PlaneGeometry } from 't3d'; import { ShaderLib, PBRMaterial, MATERIAL_TYPE, DepthMaterial } from 't3d'; // https://github.com/agargaro/octahedral-impostor export class OctahedralImpostor extends Mesh { constructor() { super(new PlaneGeometry(), new OctahedralImpostorMaterial()); this.frustumCulled = false; } } export class OctahedralImpostorMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'oct_impostor_pbr'; this.vertexShader = vertexShader; this.fragmentShader = fragmentShader; this.defines.EZ_USE_HEMI_OCTAHEDRON = true; this.uniforms.impostorTransform = new Float32Array([ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]); this.uniforms.spritesPerSide = 32; this.uniforms.alphaClamp = 0.5; this.uniforms.octahedralWeightSharpness = 1.5; } } let fragmentShader = ShaderLib.pbr_frag; let vertexShader = ShaderLib.pbr_vert; const octahedral_pars_vert = ` #if defined USE_INSTANCING attribute mat4 instanceMatrix; #endif uniform mat4 impostorTransform; uniform float spritesPerSide; varying vec2 vSpriteUV1; varying vec2 vSpriteUV2; varying vec2 vSpriteUV3; varying mat4 v_normalMatrix; flat varying vec4 vSpritesWeight; flat varying vec2 vSprite1; flat varying vec2 vSprite2; flat varying vec2 vSprite3; vec2 encodeDirection(vec3 direction) { #ifdef EZ_USE_HEMI_OCTAHEDRON vec3 octahedron = direction / dot(direction, sign(direction)); return vec2(1.0 + octahedron.x + octahedron.z, 1.0 + octahedron.z - octahedron.x) * 0.5; #else // TODO: Implement full octahedral encoding #endif } vec3 decodeDirection(vec2 gridIndex, vec2 spriteCountMinusOne) { vec2 gridUV = gridIndex / spriteCountMinusOne; #ifdef EZ_USE_HEMI_OCTAHEDRON vec3 position = vec3(gridUV.x - gridUV.y, 0.0, -1.0 + gridUV.x + gridUV.y); position.y = 1.0 - abs(position.x) - abs(position.z); #else // TODO: Implement full octahedral decoding #endif return normalize(position); } void computePlaneBasis(vec3 normal, out vec3 tangent, out vec3 bitangent) { vec3 up = vec3(0.0, 1.0, 0.0); if(normal.y > 0.9999) up = vec3(-1.0, 0.0, 0.0); #ifndef EZ_USE_HEMI_OCTAHEDRON if(normal.y < -0.9999) up = vec3(1.0, 0.0, 0.0); #endif tangent = normalize(cross(up, normal)); bitangent = cross(normal, tangent); } vec3 projectVertex(vec3 normal) { vec3 x, y; computePlaneBasis(normal, x, y); return x * a_Position.z + y * a_Position.x; } void computeSpritesWeight(vec2 gridFract) { vSpritesWeight = vec4(min(1.0 - gridFract.x, 1.0 - gridFract.y), abs(gridFract.x - gridFract.y), min(gridFract.x, gridFract.y), ceil(gridFract.x - gridFract.y)); } vec2 projectToPlaneUV(vec3 normal, vec3 tangent, vec3 bitangent, vec3 cameraPosition, vec3 viewDir) { float denom = dot(viewDir, normal); float t = -dot(cameraPosition, normal) / denom; vec3 hit = cameraPosition + viewDir * t; vec2 uv = vec2(dot(tangent, hit), dot(bitangent, hit)); return uv + 0.5; } vec3 projectDirectionToBasis(vec3 dir, vec3 normal, vec3 tangent, vec3 bitangent) { return vec3(dot(dir, tangent), dot(dir, bitangent), dot(dir, normal)); } `; const octahedral_vertex = ` vec2 spritesMinusOne = vec2(spritesPerSide - 1.0); #if defined USE_INSTANCING mat4 transformedInstanceMatrix = instanceMatrix; vec3 cameraPosLocal = (inverse(transformedInstanceMatrix * u_Model) * vec4(u_CameraPosition, 1.0)).xyz; #else vec3 cameraPosLocal = (inverse( u_Model) * vec4(u_CameraPosition, 1.0)).xyz; #endif vec3 cameraDir = normalize(cameraPosLocal); vec3 projectedVertex = projectVertex(cameraDir); vec3 viewDirLocal = normalize(projectedVertex - cameraPosLocal); vec2 grid = encodeDirection(cameraDir) * spritesMinusOne; vec2 gridFloor = min(floor(grid), spritesMinusOne); vec2 gridFract = fract(grid); computeSpritesWeight(gridFract); vSprite1 = gridFloor; vSprite2 = min(vSprite1 + mix(vec2(0.0, 1.0), vec2(1.0, 0.0), vSpritesWeight.w), spritesMinusOne); vSprite3 = min(vSprite1 + vec2(1.0), spritesMinusOne); vec3 spriteNormal1 = decodeDirection(vSprite1, spritesMinusOne); vec3 spriteNormal2 = decodeDirection(vSprite2, spritesMinusOne); vec3 spriteNormal3 = decodeDirection(vSprite3, spritesMinusOne); vec3 planeX1, planeY1, planeX2, planeY2, planeX3, planeY3; computePlaneBasis(spriteNormal1, planeX1, planeY1); computePlaneBasis(spriteNormal2, planeX2, planeY2); computePlaneBasis(spriteNormal3, planeX3, planeY3); vSpriteUV1 = projectToPlaneUV(spriteNormal1, planeX1, planeY1, cameraPosLocal, viewDirLocal); vSpriteUV2 = projectToPlaneUV(spriteNormal2, planeX2, planeY2, cameraPosLocal, viewDirLocal); vSpriteUV3 = projectToPlaneUV(spriteNormal3, planeX3, planeY3, cameraPosLocal, viewDirLocal); vec4 mvPosition = vec4(projectedVertex, 1.0); #if defined USE_INSTANCING mvPosition = transformedInstanceMatrix * impostorTransform * mvPosition; #else mvPosition = impostorTransform * mvPosition; #endif transformed = mvPosition.xyz; vec4 worldPosition = u_Model * vec4(transformed, 1.0); v_normalMatrix = inverse(u_View); gl_Position = u_ProjectionView * worldPosition; `; const octahedral_pars_frag = ` uniform float spritesPerSide; uniform float alphaClamp; uniform float octahedralWeightSharpness; uniform mat4 transformedInstanceMatrix; uniform mat4 impostorTransform; flat varying vec4 vSpritesWeight; flat varying vec2 vSprite1; flat varying vec2 vSprite2; flat varying vec2 vSprite3; varying vec2 vSpriteUV1; varying vec2 vSpriteUV2; varying vec2 vSpriteUV3; varying mat4 v_normalMatrix; vec3 octahedronToUnitVector(vec2 p) { vec3 v = vec3(p.x, 1.0 - dot(abs(p), vec2(1.0)), p.y); v.xz = mix(v.xz, (1.0 - abs(v.zx)) * sign(v.xz), step(0.0, -v.y)); return normalize(v); } vec3 blendNormals(vec2 uv1, vec2 uv2, vec2 uv3, out vec2 roughnessMetalness) { vec4 value1 = texture2D(normalMap, uv1); vec4 value2 = texture2D(normalMap, uv2); vec4 value3 = texture2D(normalMap, uv3); vec3 normal1 = octahedronToUnitVector(value1.rg * 2.0 - 1.0); // we're reading twice if parallax enabled vec3 normal2 = octahedronToUnitVector(value2.rg * 2.0 - 1.0); vec3 normal3 = octahedronToUnitVector(value3.rg * 2.0 - 1.0); vec2 roughnessMetalness1 = value1.ab; vec2 roughnessMetalness2 = value2.ab; vec2 roughnessMetalness3 = value3.ab; float w1 = vSpritesWeight.x; float w2 = vSpritesWeight.y; float w3 = vSpritesWeight.z; w1 = pow(w1, octahedralWeightSharpness); w2 = pow(w2, octahedralWeightSharpness); w3 = pow(w3, octahedralWeightSharpness); float sumW = max(w1 + w2 + w3, 1e-6); w1 /= sumW; w2 /= sumW; w3 /= sumW; // Blend roughnessMetalness roughnessMetalness = roughnessMetalness1 * w1 + roughnessMetalness2 * w2 + roughnessMetalness3 * w3; // Fix normal if blended bad return normalize(normal1.xyz * w1 + normal2.xyz * w2 + normal3.xyz * w3); // return normalize(normal1.xyz ); } vec2 getUV(vec2 uv_f, vec2 frame, float frame_size) { uv_f = clamp(uv_f, vec2(0), vec2(1)); vec2 uv_quad = frame_size * (frame + uv_f); uv_f = frame_size * (frame + uv_f); return clamp(uv_f, vec2(0), vec2(1)); } `; const octahedral_map_frag = ` float spriteSize = 1.0 / spritesPerSide; // todo remove if we want parallax vec2 uv1 = getUV(vSpriteUV1, vSprite1, spriteSize); vec2 uv2 = getUV(vSpriteUV2, vSprite2, spriteSize); vec2 uv3 = getUV(vSpriteUV3, vSprite3, spriteSize); vec4 sprite1, sprite2, sprite3; float test = 1.0 - alphaClamp; if (vSpritesWeight.x >= test) { sprite1 = texture2D(diffuseMap, uv1); if (sprite1.a <= alphaClamp) discard; sprite2 = texture2D(diffuseMap, uv2); sprite3 = texture2D(diffuseMap, uv3); } else if (vSpritesWeight.y >= test) { sprite2 = texture2D(diffuseMap, uv2); if (sprite2.a <= alphaClamp) discard; sprite1 = texture2D(diffuseMap, uv1); sprite3 = texture2D(diffuseMap, uv3); } else if (vSpritesWeight.z >= test) { sprite3 = texture2D(diffuseMap, uv3); if (sprite3.a <= alphaClamp) discard; sprite1 = texture2D(diffuseMap, uv1); sprite2 = texture2D(diffuseMap, uv2); } else { sprite1 = texture2D(diffuseMap, uv1); sprite2 = texture2D(diffuseMap, uv2); sprite3 = texture2D(diffuseMap, uv3); } // vec4 blendedColor = sprite1 * vSpritesWeight.x + sprite2 * vSpritesWeight.y + sprite3 * vSpritesWeight.z; float w1 = vSpritesWeight.x; float w2 = vSpritesWeight.y; float w3 = vSpritesWeight.z; w1 = pow(w1, octahedralWeightSharpness); w2 = pow(w2, octahedralWeightSharpness); w3 = pow(w3, octahedralWeightSharpness); float sumW = max(w1 + w2 + w3, 1e-6); w1 /= sumW; w2 /= sumW; w3 /= sumW; vec4 blendedColor = sprite1 * w1 + sprite2 * w2 + sprite3 * w3; if (blendedColor.a <= alphaClamp) discard; #ifndef EZ_TRANSPARENT blendedColor = vec4(vec3(blendedColor.rgb) / blendedColor.a, 1.0); #endif outColor = blendedColor; `; const octahedral_normal_begin_frag = ` vec2 roughnessMetalness; vec3 N = blendNormals(uv1, uv2, uv3, roughnessMetalness); vec3 geometryNormal = N; `; vertexShader = vertexShader.replace('#include ', ` #include ${octahedral_pars_vert} `); vertexShader = vertexShader.replace('#include ', ` ${octahedral_vertex} `); fragmentShader = fragmentShader.replace('#include ', ` #include ${octahedral_pars_frag} `); fragmentShader = fragmentShader.replace('#include ', ` ${octahedral_map_frag} `); fragmentShader = fragmentShader.replace('#include ', ` ${octahedral_normal_begin_frag} `); fragmentShader = fragmentShader.replace('float roughnessFactor = u_Roughness;', 'float roughnessFactor = roughnessMetalness.x;' ); fragmentShader = fragmentShader.replace('float metalnessFactor = u_Metalness;', 'float metalnessFactor = roughnessMetalness.y;' ); export class OctahedralImpostorDepthMaterial extends DepthMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'oct_impostor_depth'; this.vertexShader = depth_vert; this.fragmentShader = depth_frag; this.defines.EZ_USE_HEMI_OCTAHEDRON = true; this.uniforms.impostorTransform = new Float32Array([ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]); this.uniforms.spritesPerSide = 32; this.uniforms.alphaClamp = 0.3; } } let depth_vert = ShaderLib.depth_vert; const depth_frag = ` uniform float spritesPerSide; uniform sampler2D diffuseMap; uniform mat4 u_ProjectionView; uniform float alphaClamp; flat varying vec2 vSprite1; flat varying vec2 vSprite2; flat varying vec2 vSprite3; varying vec2 vSpriteUV1; varying vec2 vSpriteUV2; varying vec2 vSpriteUV3; flat varying vec4 vSpritesWeight; vec2 getUV(vec2 uv_f, vec2 frame, float frame_size) { uv_f = clamp(uv_f, vec2(0), vec2(1)); vec2 uv_quad = frame_size * (frame + uv_f); uv_f = frame_size * (frame + uv_f); return clamp(uv_f, vec2(0), vec2(1)); } const float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1) const float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1) const vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. ); const vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. ); const float ShiftRight8 = 1. / 256.; vec4 packDepthToRGBA( const in float v ) { vec4 r = vec4( fract( v * PackFactors ), v ); r.yzw -= r.xyz * ShiftRight8; // tidy overflow return r * PackUpscale; } void main() { float spriteSize = 1.0 / spritesPerSide; vec2 uv1 = getUV(vSpriteUV1, vSprite1, spriteSize); float depth1 = texture2D(diffuseMap, uv1).a; if(depth1 <= alphaClamp) discard; gl_FragColor = packDepthToRGBA(gl_FragCoord.z); } `; depth_vert = vertexShader.replace('#include ', ` #include ${octahedral_pars_vert} `); depth_vert = vertexShader.replace('#include ', ` ${octahedral_vertex} `); ================================================ FILE: examples/jsm/impostor/OctahedralTextureGenerator.js ================================================ import { Scene, Texture2D, PBRMaterial, ShaderLib, Sphere, Camera, OffscreenRenderTarget, ATTACHMENT, TEXTURE_FILTER, MATERIAL_TYPE, Vector2, Vector3, Matrix4 } from 't3d'; import { SceneUtils } from '../SceneUtils.js'; // https://github.com/agargaro/octahedral-impostor class OctahedralTextureGenerator { /** * Constructor of OctahedralTextureGenerator. * @param {number} [atlasSize = 4096] - The size of the atlas texture. * @param {number} [countPerSide = 16] - The number of sprites per side of the atlas. * @param {number} [cameraFactor = 1] - The factor to adjust the camera view size. * @param {boolean} [useHemiOctahedron = true] - Whether to use hemi-octahedron mapping. */ constructor(atlasSize = 2048, countPerSide = 16, cameraFactor = 1, useHemiOctahedron = true) { this.countPerSide = countPerSide; this.atlasSize = atlasSize; this.cameraFactor = cameraFactor; this.useHemiOctahedron = useHemiOctahedron; this.countPerSideMinusOne = countPerSide - 1; this.spriteSize = atlasSize / countPerSide; this._renderTarget = OffscreenRenderTarget.create2D(atlasSize, atlasSize); this._albedoTexture = this._renderTarget.texture; this._albedoTexture.magFilter = TEXTURE_FILTER.LINEAR; this._albedoTexture.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; this._infoTexture = new Texture2D(); this._infoTexture.magFilter = TEXTURE_FILTER.NEAREST; this._infoTexture.minFilter = TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST; this._renderTarget.attach(this._infoTexture, ATTACHMENT.COLOR_ATTACHMENT1); this._camera = new Camera(); this._dummyScene = new Scene(); } render(renderer, source) { this._dummyScene.add(source); this._dummyScene.updateMatrix(true); const boundingBox = SceneUtils.setBox3FromObject(source); const boundingSphere = new Sphere(); boundingBox.getBoundingSphere(boundingSphere); this._camera.setOrtho( -boundingSphere.radius, boundingSphere.radius, -boundingSphere.radius, boundingSphere.radius, 0.00001, boundingSphere.radius * 2 + 0.00001 ); const materialMap = new Map(); const renderOption = { getMaterial: function(renderable) { if (materialMap.has(renderable.material)) { return materialMap.get(renderable.material); } else { const material = renderable.material; const impostorMaterial = new OctahedralBakeMaterial(material); materialMap.set(material, impostorMaterial); return impostorMaterial; } } }; this._renderTarget.setColorClearValue(0, 0, 0, 1).setClear(false, false, false); for (let row = 0; row < this.countPerSide; row++) { for (let col = 0; col < this.countPerSide; col++) { this._renderView(col, row, boundingSphere, renderer, renderOption); } } materialMap.forEach(mat => mat.dispose()); renderer.generateMipmaps(this._albedoTexture); renderer.generateMipmaps(this._infoTexture); const transform = new Matrix4(); const scale = boundingSphere.radius * 2; transform.makeScale(scale, scale, scale).setPosition(boundingSphere.center); return { transform: transform, albedoTexture: this._albedoTexture, infoTexture: this._infoTexture }; } _renderView(col, row, sphere, renderer, renderOption) { _coords.set(col / (this.countPerSideMinusOne), row / (this.countPerSideMinusOne)); if (this.useHemiOctahedron) { hemiOctaGridToDir(_coords, this._camera.position); } else { octaGridToDir(_coords, this._camera.position); } this._camera.position.normalize().multiplyScalar(sphere.radius * this.cameraFactor).add(sphere.center); this._camera.lookAt(sphere.center, new Vector3(0, 1, 0)); const xNorm = col / this.countPerSide; const yNorm = row / this.countPerSide; const wNorm = 1 / this.countPerSide; const hNorm = 1 / this.countPerSide; this._camera.rect.set(xNorm, yNorm, xNorm + wNorm, yNorm + hNorm); this._camera.updateMatrix(); this._dummyScene.updateRenderStates(this._camera); this._dummyScene.updateRenderQueue(this._camera); renderer.renderScene(this._dummyScene, this._camera, this._renderTarget, renderOption); } } const _coords = new Vector2(); function hemiOctaGridToDir(grid, target = new Vector3()) { target.set(grid.x - grid.y, 0, -1 + grid.x + grid.y); target.y = 1 - Math.abs(target.x) - Math.abs(target.z); return target; } const absolute = new Vector3(); function octaGridToDir(grid, target = new Vector3()) { target.set(2 * (grid.x - 0.5), 0, 2 * (grid.y - 0.5)); absolute.set(Math.abs(target.x), 0, Math.abs(target.z)); target.y = 1 - absolute.x - absolute.z; if (target.y < 0) { target.x = Math.sign(target.x) * (1 - absolute.z); target.z = Math.sign(target.z) * (1 - absolute.x); } return target; } class OctahedralBakeMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'oct_bake'; this.vertexShader = ShaderLib.pbr_vert; this.fragmentShader = octahedral_impostor_frag; } } const octahedral_impostor_frag = ` #extension GL_EXT_draw_buffers : require #include uniform float u_Metalness; #ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; #endif uniform float u_Roughness; #ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; #endif uniform vec3 emissive; #include #include #include #include #include #include #include #include #include #include #include #include #include vec2 unitVectorToOctahedron(vec3 v) { vec2 up = v.xz / dot(vec3(1.0), abs(v)); vec2 down = (1.0 - abs(up.yx)) * sign(up.xy); return mix(up, down, step(0.0, -v.y)); } void main() { #include #include #include #include #include #include #include #include vec4 info = vec4(.0) ; info.rg = unitVectorToOctahedron(N) * 0.5 + 0.5; float roughnessFactor = u_Roughness; #ifdef USE_ROUGHNESSMAP vec4 texelRoughness = texture2D(roughnessMap, v_Uv); // reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture roughnessFactor *= texelRoughness.g; #endif float metalnessFactor = u_Metalness; #ifdef USE_METALNESSMAP vec4 texelMetalness = texture2D(metalnessMap, v_Uv); // reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture metalnessFactor *= texelMetalness.b; #endif info.ba = vec2(metalnessFactor, roughnessFactor); gl_FragData[0] = outColor; gl_FragData[1] = info; } `; export { OctahedralTextureGenerator, OctahedralBakeMaterial }; ================================================ FILE: examples/jsm/lights/LightShadowAdapter.js ================================================ import { Box3, Matrix3, Matrix4, Plane, Spherical, Vector3, Vector2 } from 't3d'; import { OBB } from '../math/OBB.js'; /** * LightShadowAdapter is a tool to help you calculate the shadow range of the light source. * It can automatically calculate the shadow range based on the bounding box of the object and the camera, * and update the light source and shadow range in real time. */ export class LightShadowAdapter { /** * Create a LightShadowAdapter instance. * @param {DirectionalLight} light - The light source to be adapted. */ constructor(light) { this.light = light; // The direction of the light source, which is used to calculate the position of the light source. this.direction = new LightDirection(); // Whether to automatically correct the up direction of the light source to keep the y+ direction of the shadow map always facing the camera far away. // This is only valid when the bindCamera is not empty. this.autoCorrectUp = true; // If autoCorrectUp is false, you can set the up direction of the light source manually, // which is used to calculate the orientation of the light source. this.up = new Vector3(0, 1, 0); // The oriented bounding box of the object to be adapted. this.bindBox = new OBB(); // The camera to be adapted. this.bindCamera = null; // The distance from the camera to the shadow range. // When bindBox is not empty, the distance starts from the nearest point of the bounding box to the camera near plane. this.bindCameraDistance = 500; // In most cases, the shadow range should just wrap the object, so the default shadow range calculation function is like this. // But in some specific scenarios, we want the shadow range to be larger, // such as wanting objects outside the camera to cast shadows, // then you need to customize the shadow range calculation function this.shadowSizeFunction = function(size) { return size * 1.05 }; this.shadowDepthFunction = function(depth, size) { return Math.max(depth * 1.1, size * 0.8) }; this.shadowNearFunction = function(depth) { return depth * 0.1 }; // The center offset factor of the shadow range to thinShadowBox. // If set to (0, 0), the shadow box center will be the same as the thinShadowBox center. this.shadowOffsetFactor = new Vector2(0.5, 0.25); this._polygonPool = new PolygonPool(); // Some stats for debugging this.stats = { type: 0, // 1: box + camera, 2: box, 3: camera, 4: null bindBoxRotated: false, bindAABB: new Box3(), bindAABBTransform: new Matrix4(), lightUp: new Vector3(), shadowBox: new Box3(), thinShadowBox: new Box3().copy(UNIT_BOX3), shadowBoxRotation: new Matrix3(), shadowBoxRotationInverse: new Matrix3(), boundaryPoints: [], // when type is 2 or 3 polygons: new Polygons(this._polygonPool) // when type is 1 }; // fill boundaryPoints with Vector3 for (let i = 0; i < 8; i++) { this.stats.boundaryPoints.push(new Vector3()); } } update() { this._setUpdateType(); this._setShadowBoxRotation(); const { type, thinShadowBox } = this.stats; if (type === SHADOW_UPDATE_TYPE.BOX_CAMERA) { this._setShadowBoxByBoxCamera(); } else if (type === SHADOW_UPDATE_TYPE.BOX) { this._setShadowBoxByBox(); } else if (type === SHADOW_UPDATE_TYPE.CAMERA) { this._setShadowBoxByCamera(); } else { thinShadowBox.copy(UNIT_BOX3); } this._updateLight(); } _setUpdateType() { const { bindBox, bindCamera, stats } = this; const hasBindBox = !bindBox.isEmpty(); const hasBindCamera = !!bindCamera; const bindBoxRotated = !bindBox.rotation.isIdentity(); if (hasBindBox && hasBindCamera) { stats.type = SHADOW_UPDATE_TYPE.BOX_CAMERA; } else if (hasBindBox) { stats.type = SHADOW_UPDATE_TYPE.BOX; } else if (hasBindCamera) { stats.type = SHADOW_UPDATE_TYPE.CAMERA; } else { stats.type = SHADOW_UPDATE_TYPE.NULL; } stats.bindBoxRotated = bindBoxRotated; if (!hasBindBox) { stats.bindAABB.makeEmpty(); stats.bindAABBTransform.identity(); } else if (bindBoxRotated) { bindBox.toBoundingBoxAndTransform(stats.bindAABB, stats.bindAABBTransform); } else { stats.bindAABB.max.copy(bindBox.center).add(bindBox.halfSize); stats.bindAABB.min.copy(bindBox.center).sub(bindBox.halfSize); stats.bindAABBTransform.identity(); } } _setShadowBoxRotation() { const { direction, autoCorrectUp, up, bindCamera, stats } = this; const { lightUp, shadowBoxRotation, shadowBoxRotationInverse } = stats; if (autoCorrectUp && !!bindCamera) { _vec3_1.setFromMatrixColumn(bindCamera.worldMatrix, 0).normalize(); _vec3_2.copy(direction).normalize(); lightUp.crossVectors(_vec3_2, _vec3_1); } else { lightUp.copy(up); } lightUp.normalize(); _vec3_1.copy(direction).normalize().negate().toArray(shadowBoxRotation.elements, 6); // axis-z _vec3_2.crossVectors(lightUp, _vec3_1).normalize().toArray(shadowBoxRotation.elements, 0); // axis-x _vec3_1.cross(_vec3_2).toArray(shadowBoxRotation.elements, 3); // axis-y shadowBoxRotationInverse.copy(shadowBoxRotation).invert(); } _setShadowBoxByBoxCamera() { const { bindBox, bindCamera, bindCameraDistance, stats, _polygonPool } = this; const { bindBoxRotated, bindAABB, thinShadowBox, shadowBoxRotationInverse, boundaryPoints, polygons } = stats; const frustumIntersectsBox = bindBoxRotated ? bindBox.intersectsFrustum(bindCamera.frustum) : bindCamera.frustum.intersectsBox(bindAABB); if (!frustumIntersectsBox) return; // Reset polygons _polygonPool.reset(); polygons.clear(); // Set the polygons by box const points = bindBoxRotated ? bindBox.getPoints(boundaryPoints) : bindAABB.getPoints(boundaryPoints); polygons.setFromBoxPoints(points); // Clip the polygons using the frustum (not including the near and far planes) const frustumPlanes = bindCamera.frustum.planes; for (let i = 0, l = frustumPlanes.length - 2; i < l; i++) { const plane = frustumPlanes[i]; polygons.clipByPlane(plane); } const cameraInsideBox = bindBox.containsPoint(_vec3_1.setFromMatrixPosition(bindCamera.worldMatrix)); const { near } = extractCameraNearFar(bindCamera); let minZ = cameraInsideBox ? near : -Infinity; if (!cameraInsideBox) { // Convert the intersection point to view space and find the closest intersection point to the camera polygons.polygons.forEach(polygon => { for (let i = 0, l = polygon.verticesIndex; i < l; i++) { _vec3_1.copy(polygon.vertices[i]).applyMatrix4(bindCamera.viewMatrix); minZ = Math.max(minZ, _vec3_1.z); } }); minZ = Math.max(Math.abs(minZ), near); } // Based on the nearest intersection point of the near plane, // push back the length of distance, determine the position of the far plane, // and convert the far plane to the world coordinate system. _plane_1.constant = minZ + bindCameraDistance; _plane_1.normal.set(0, 0, 1); _plane_1.applyMatrix4(bindCamera.worldMatrix); // Using the far plane determined in the previous step, cut the curPolygons. polygons.clipByPlane(_plane_1); // Calculate shadow box by polygon vertices thinShadowBox.makeEmpty(); polygons.polygons.forEach(polygon => { for (let i = 0, l = polygon.verticesIndex; i < l; i++) { _vec3_1.copy(polygon.vertices[i]).applyMatrix3(shadowBoxRotationInverse); thinShadowBox.expandByPoint(_vec3_1); } }); // Polygons.clipByPlane does not add new polygon for the newly generated sections, // so when the camera is inside the bind box, result will be incorrect. // The current solution is to extend shadow box by the camera's near plane vertices. if (cameraInsideBox) { clipVertices.near.forEach(v => { _vec3_1.copy(v).unproject(bindCamera).applyMatrix3(shadowBoxRotationInverse); thinShadowBox.expandByPoint(_vec3_1); }); } } _setShadowBoxByBox() { const { bindBox, stats } = this; const { bindBoxRotated, bindAABB, thinShadowBox, shadowBoxRotationInverse, boundaryPoints } = stats; const points = bindBoxRotated ? bindBox.getPoints(boundaryPoints) : bindAABB.getPoints(boundaryPoints); thinShadowBox.makeEmpty(); points.forEach(point => { _vec3_1.copy(point).applyMatrix3(shadowBoxRotationInverse); thinShadowBox.expandByPoint(_vec3_1); }); } _setShadowBoxByCamera() { const { bindCamera, bindCameraDistance, stats } = this; const { thinShadowBox, shadowBoxRotationInverse, boundaryPoints } = stats; const { near, far } = extractCameraNearFar(bindCamera); // Get the vertices of the frustum in view space, considering the bindCameraDistance getClipedViewVertices(bindCamera, near, Math.min(near + bindCameraDistance, far), boundaryPoints); // Convert vertices to world space boundaryPoints.forEach(point => point.applyMatrix4(bindCamera.worldMatrix)); thinShadowBox.makeEmpty(); boundaryPoints.forEach(point => { _vec3_1.copy(point).applyMatrix3(shadowBoxRotationInverse); thinShadowBox.expandByPoint(_vec3_1); }); } _updateLight() { const { light, direction, shadowSizeFunction, shadowDepthFunction, shadowNearFunction, shadowOffsetFactor, stats } = this; const { lightUp, shadowBox, thinShadowBox, shadowBoxRotation } = stats; const boxCenter = thinShadowBox.getCenter(_vec3_1); const boxSize = thinShadowBox.getSize(_vec3_2); const shadowSize = shadowSizeFunction(Math.max(boxSize.x, boxSize.y)); const shadowDepth = shadowDepthFunction(boxSize.z, shadowSize); const shadowNear = shadowNearFunction(shadowDepth); const { min, max } = shadowBox; min.x = boxCenter.x - shadowSize * 0.5; max.x = boxCenter.x + shadowSize * 0.5; min.y = boxCenter.y - shadowSize * 0.5; max.y = boxCenter.y + shadowSize * 0.5; min.z = boxCenter.z - shadowDepth * 0.5; max.z = boxCenter.z + shadowDepth * 0.5; if (shadowOffsetFactor.x > 0) { const maxOffsetY = (shadowSize - boxSize.y) * 0.5; min.y += maxOffsetY * shadowOffsetFactor.x; max.y += maxOffsetY * shadowOffsetFactor.x; } if (shadowOffsetFactor.y > 0) { const maxOffsetZ = (shadowDepth - boxSize.z) * 0.5; min.z += maxOffsetZ * shadowOffsetFactor.y; max.z += maxOffsetZ * shadowOffsetFactor.y; } // light shadow range light.shadow.windowSize = shadowSize; light.shadow.cameraNear = shadowNear; light.shadow.cameraFar = shadowNear + shadowDepth; // light position shadowBox.getCenter(light.position); light.position.z = min.z - shadowNear; light.position.applyMatrix3(shadowBoxRotation); // light rotation const target = _vec3_1.copy(light.position).sub(direction); light.lookAt(target, lightUp); } } const _vec3_1 = new Vector3(); const _vec3_2 = new Vector3(); const _plane_1 = new Plane(); const EPSILON = 1e-5; const UNIT_BOX3 = new Box3(new Vector3(-0.5, -0.5, -0.5), new Vector3(0.5, 0.5, 0.5)); const SHADOW_UPDATE_TYPE = { BOX_CAMERA: 1, BOX: 2, CAMERA: 3, NULL: 4 }; function isPerspectiveMatrix(m) { return m.elements[11] === -1.0; } const frustumNearFar = { near: 0, far: 0 }; function extractCameraNearFar(camera) { const projectionMatrix = camera.projectionMatrix; if (isPerspectiveMatrix(projectionMatrix)) { frustumNearFar.near = projectionMatrix.elements[14] / (projectionMatrix.elements[10] - 1); frustumNearFar.far = projectionMatrix.elements[14] / (projectionMatrix.elements[10] + 1); } else { frustumNearFar.near = (projectionMatrix.elements[14] + 1) / projectionMatrix.elements[10]; frustumNearFar.far = (projectionMatrix.elements[14] - 1) / projectionMatrix.elements[10]; } return frustumNearFar; } // LightDirection class const _spherical = new Spherical(); class LightDirection extends Vector3 { setFromSphericalAngles(phi, theta) { _spherical.phi = phi; _spherical.theta = theta; _spherical.radius = 1; // normalize this.setFromSpherical(_spherical); } } // 3 --- 0 clipVertices.near/far order // | | // 2 --- 1 // clip space spans from [-1, 1] const clipVertices = { near: [ new Vector3(1, 1, -1), new Vector3(1, -1, -1), new Vector3(-1, -1, -1), new Vector3(-1, 1, -1) ], far: [ new Vector3(1, 1, 1), new Vector3(1, -1, 1), new Vector3(-1, -1, 1), new Vector3(-1, 1, 1) ] }; function getClipedViewVertices(camera, clipNear, clipFar, points) { const projectionMatrix = camera.projectionMatrix; const projectionMatrixInverse = camera.projectionMatrixInverse; const isOrthographic = projectionMatrix.elements[2 * 4 + 3] === 0; clipVertices.near.forEach((v, i) => { const point = points[i]; point.copy(v).applyMatrix4(projectionMatrixInverse); const absZ = Math.abs(point.z); if (isOrthographic) { point.z *= Math.min(clipNear / absZ, 1.0); } else { point.multiplyScalar(Math.min(clipNear / absZ, 1.0)); } }); clipVertices.far.forEach((v, i) => { const point = points[4 + i]; point.copy(v).applyMatrix4(projectionMatrixInverse); const absZ = Math.abs(point.z); if (isOrthographic) { point.z *= Math.min(clipFar / absZ, 1.0); } else { point.multiplyScalar(Math.min(clipFar / absZ, 1.0)); } }); return points; } // Polygon classes class Polygons { constructor(pool) { this.polygons = []; this._pool = pool; this._tempPolygons = []; } clear() { this.polygons.length = 0; } setFromBoxPoints(points) { const { polygons, _pool } = this; polygons[0] = _pool.allocate().begin().pushVertex(points[0]).pushVertex(points[1]).pushVertex(points[2]).pushVertex(points[3]).end(); polygons[1] = _pool.allocate().begin().pushVertex(points[4]).pushVertex(points[7]).pushVertex(points[6]).pushVertex(points[5]).end(); polygons[2] = _pool.allocate().begin().pushVertex(points[0]).pushVertex(points[3]).pushVertex(points[7]).pushVertex(points[4]).end(); polygons[3] = _pool.allocate().begin().pushVertex(points[1]).pushVertex(points[2]).pushVertex(points[6]).pushVertex(points[5]).end(); polygons[4] = _pool.allocate().begin().pushVertex(points[0]).pushVertex(points[4]).pushVertex(points[5]).pushVertex(points[1]).end(); polygons[5] = _pool.allocate().begin().pushVertex(points[3]).pushVertex(points[7]).pushVertex(points[6]).pushVertex(points[2]).end(); } clipByPlane(plane) { for (const polygon of this.polygons) { splitPolygon(plane, polygon, this._tempPolygons, this._pool); } this.polygons = this._tempPolygons; this._tempPolygons = []; } } const COPLANAR = 0; const FRONT = 1; const BACK = 2; const SPANNING = 3; const types = []; function splitPolygon(plane, polygon, outPolygons, pool) { // Classify each point as well as the entire polygon into one of the above // four classes. let polygonType = 0; types.length = 0; for (let i = 0; i < polygon.verticesIndex; i++) { const t = plane.normal.dot(polygon.vertices[i]) + plane.constant; const type = t < -EPSILON ? BACK : t > EPSILON ? FRONT : COPLANAR; polygonType |= type; types.push(type); } // Put the polygon in the correct list, splitting it when necessary. switch (polygonType) { case COPLANAR: if (plane.normal.dot(polygon.plane.normal) > 0) { outPolygons.push(polygon); } break; case FRONT: outPolygons.push(polygon); break; case SPANNING: { const _polygon = pool.allocate(); _polygon.begin(); for (let i = 0; i < polygon.verticesIndex; i++) { const j = (i + 1) % polygon.verticesIndex; const ti = types[i], tj = types[j]; const vi = polygon.vertices[i], vj = polygon.vertices[j]; if (ti != BACK) _polygon.pushVertex(vi); if ((ti | tj) == SPANNING) { const t = -(plane.constant + plane.normal.dot(vi)) / plane.normal.dot(_vec3_1.copy(vj).sub(vi)); const v = _vec3_1.lerpVectors(vi, vj, t); _polygon.pushVertex(v); } } if (_polygon.verticesIndex >= 3) { _polygon.end(); outPolygons.push(_polygon); } else { pool.deallocate(); } break; } default: break; } } class PolygonPool { constructor() { this.polygons = []; this.headIndex = 0; } allocate() { let polygon = this.polygons[this.headIndex]; if (!polygon) { polygon = new Polygon(); this.polygons[this.headIndex] = polygon; } this.headIndex++; return polygon; } deallocate() { this.headIndex--; } reset() { this.headIndex = 0; } } class Polygon { constructor() { this.plane = new Plane(); this.vertices = []; this.verticesIndex = 0; } begin() { this.verticesIndex = 0; return this; } pushVertex(vector3) { let vertex = this.vertices[this.verticesIndex]; if (!vertex) { vertex = new Vector3(); this.vertices[this.verticesIndex] = vertex; } vertex.copy(vector3); this.verticesIndex++; return this; } end() { const plane = this.plane; const vertices = this.vertices; plane.normal.copy(vertices[1]).sub(vertices[0]).cross(_vec3_1.copy(vertices[2]).sub(vertices[0])).normalize(); plane.constant = plane.normal.dot(vertices[0]); return this; } } ================================================ FILE: examples/jsm/lights/RectAreaLightLTC.js ================================================ import { Texture2D, TEXTURE_WRAP, TEXTURE_FILTER, PIXEL_FORMAT, PIXEL_TYPE } from 't3d'; // Real-Time Polygonal-Light Shading with Linearly Transformed Cosines // by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt // code: https://github.com/selfshadow/ltc_code/ /** * LTC (Linearly Transformed Cosines) Textures for real-time RectAreaLight. * * NOTE: This is a temporary location for the BRDF approximation texture data * based off of Eric Heitz's work (see citation below). BRDF data for * RectAreaLight is currently approximated using a precomputed texture * of roughly 80kb in size. The hope is to find a better way to include * the large texture data before including the full RectAreaLight implementation * in the main build files. * * TODO: figure out a way to compress the LTC BRDF data */ class RectAreaLightLTC { static getLTC1() { // source: https://github.com/selfshadow/ltc_code/tree/master/fit/results/ltc.js const LTC_MAT_1 = [1, 0, 0, 2e-05, 1, 0, 0, 0.000503905, 1, 0, 0, 0.00201562, 1, 0, 0, 0.00453516, 1, 0, 0, 0.00806253, 1, 0, 0, 0.0125978, 1, 0, 0, 0.018141, 1, 0, 0, 0.0246924, 1, 0, 0, 0.0322525, 1, 0, 0, 0.0408213, 1, 0, 0, 0.0503999, 1, 0, 0, 0.0609894, 1, 0, 0, 0.0725906, 1, 0, 0, 0.0852058, 1, 0, 0, 0.0988363, 1, 0, 0, 0.113484, 1, 0, 0, 0.129153, 1, 0, 0, 0.145839, 1, 0, 0, 0.163548, 1, 0, 0, 0.182266, 1, 0, 0, 0.201942, 1, 0, 0, 0.222314, 1, 0, 0, 0.241906, 1, 0, 0, 0.262314, 1, 0, 0, 0.285754, 1, 0, 0, 0.310159, 1, 0, 0, 0.335426, 1, 0, 0, 0.361341, 1, 0, 0, 0.387445, 1, 0, 0, 0.412784, 1, 0, 0, 0.438197, 1, 0, 0, 0.466966, 1, 0, 0, 0.49559, 1, 0, 0, 0.523448, 1, 0, 0, 0.549938, 1, 0, 0, 0.57979, 1, 0, 0, 0.608746, 1, 0, 0, 0.636185, 1, 0, 0, 0.664748, 1, 0, 0, 0.69313, 1, 0, 0, 0.71966, 1, 0, 0, 0.747662, 1, 0, 0, 0.774023, 1, 0, 0, 0.799775, 1, 0, 0, 0.825274, 1, 0, 0, 0.849156, 1, 0, 0, 0.873248, 1, 0, 0, 0.89532, 1, 0, 0, 0.917565, 1, 0, 0, 0.937863, 1, 0, 0, 0.958139, 1, 0, 0, 0.976563, 1, 0, 0, 0.994658, 1, 0, 0, 1.0112, 1, 0, 0, 1.02712, 1, 0, 0, 1.04189, 1, 0, 0, 1.05568, 1, 0, 0, 1.06877, 1, 0, 0, 1.08058, 1, 0, 0, 1.09194, 1, 0, 0, 1.10191, 1, 0, 0, 1.11161, 1, 0, 0, 1.1199, 1, 0, 0, 1.12813, 0.999547, -4.48815e-07, 0.0224417, 1.99902e-05, 0.999495, -1.13079e-05, 0.0224406, 0.000503651, 0.999496, -4.52317e-05, 0.0224406, 0.00201461, 0.999496, -0.000101772, 0.0224406, 0.00453287, 0.999495, -0.000180928, 0.0224406, 0.00805845, 0.999497, -0.000282702, 0.0224406, 0.0125914, 0.999496, -0.000407096, 0.0224406, 0.0181319, 0.999498, -0.000554114, 0.0224406, 0.02468, 0.999499, -0.000723768, 0.0224406, 0.0322363, 0.999495, -0.000916058, 0.0224405, 0.0408009, 0.999499, -0.00113101, 0.0224408, 0.050375, 0.999494, -0.00136863, 0.0224405, 0.0609586, 0.999489, -0.00162896, 0.0224401, 0.0725537, 0.999489, -0.00191201, 0.0224414, 0.0851619, 0.999498, -0.00221787, 0.0224413, 0.0987867, 0.999492, -0.00254642, 0.0224409, 0.113426, 0.999507, -0.00289779, 0.0224417, 0.129088, 0.999494, -0.0032716, 0.0224386, 0.145767, 0.999546, -0.0036673, 0.0224424, 0.163472, 0.999543, -0.00408166, 0.0224387, 0.182182, 0.999499, -0.00450056, 0.0224338, 0.201843, 0.999503, -0.00483661, 0.0224203, 0.222198, 0.999546, -0.00452928, 0.022315, 0.241714, 0.999508, -0.00587403, 0.0224329, 0.262184, 0.999509, -0.00638806, 0.0224271, 0.285609, 0.999501, -0.00691028, 0.0224166, 0.309998, 0.999539, -0.00741979, 0.0223989, 0.335262, 0.999454, -0.00786282, 0.0223675, 0.361154, 0.999529, -0.00811928, 0.0222828, 0.387224, 0.999503, -0.00799941, 0.0221063, 0.41252, 0.999561, -0.00952753, 0.0223057, 0.438006, 0.999557, -0.0099134, 0.0222065, 0.466735, 0.999541, -0.0100935, 0.0220402, 0.495332, 0.999562, -0.00996821, 0.0218067, 0.523197, 0.999556, -0.0105031, 0.0217096, 0.550223, 0.999561, -0.0114191, 0.0217215, 0.579498, 0.999588, -0.0111818, 0.0213357, 0.608416, 0.999633, -0.0107725, 0.0208689, 0.635965, 0.999527, -0.0121671, 0.0210149, 0.664476, 0.999508, -0.0116005, 0.020431, 0.692786, 0.999568, -0.0115604, 0.0199791, 0.719709, 0.999671, -0.0121117, 0.0197415, 0.74737, 0.999688, -0.0110769, 0.0188846, 0.773692, 0.99962, -0.0122368, 0.0188452, 0.799534, 0.999823, -0.0110325, 0.0178001, 0.825046, 0.999599, -0.0114923, 0.0174221, 0.849075, 0.999619, -0.0105923, 0.0164345, 0.872999, 0.999613, -0.0105988, 0.0158227, 0.895371, 0.99964, -0.00979861, 0.0148131, 0.917364, 0.99977, -0.00967238, 0.0140721, 0.938002, 0.999726, -0.00869175, 0.0129543, 0.957917, 0.99973, -0.00866872, 0.0122329, 0.976557, 0.999773, -0.00731956, 0.0108958, 0.994459, 0.999811, -0.00756027, 0.0102715, 1.01118, 0.999862, -0.00583732, 0.00878781, 1.02701, 0.999835, -0.00631438, 0.00827529, 1.04186, 0.999871, -0.00450785, 0.00674583, 1.05569, 0.999867, -0.00486079, 0.00621041, 1.06861, 0.999939, -0.00322072, 0.00478301, 1.08064, 0.999918, -0.00318199, 0.00406395, 1.09181, 1.00003, -0.00193348, 0.00280682, 1.10207, 0.999928, -0.00153729, 0.00198741, 1.11152, 0.999933, -0.000623666, 0.000917714, 1.12009, 1, -1.02387e-06, 9.07581e-07, 1.12813, 0.997866, -8.96716e-07, 0.0448334, 1.99584e-05, 0.997987, -2.25945e-05, 0.0448389, 0.000502891, 0.997987, -9.03781e-05, 0.0448388, 0.00201156, 0.997985, -0.000203351, 0.0448388, 0.00452602, 0.997986, -0.000361514, 0.0448388, 0.00804629, 0.997987, -0.00056487, 0.0448389, 0.0125724, 0.997988, -0.000813423, 0.0448389, 0.0181045, 0.997984, -0.00110718, 0.0448387, 0.0246427, 0.997985, -0.00144616, 0.0448388, 0.0321875, 0.997987, -0.00183038, 0.044839, 0.0407392, 0.997983, -0.00225987, 0.0448387, 0.0502986, 0.997991, -0.00273467, 0.0448389, 0.0608667, 0.997984, -0.00325481, 0.0448384, 0.0724444, 0.998002, -0.00382043, 0.044839, 0.0850348, 0.997997, -0.00443145, 0.0448396, 0.0986372, 0.998007, -0.00508796, 0.0448397, 0.113255, 0.998008, -0.00578985, 0.04484, 0.128891, 0.998003, -0.00653683, 0.0448384, 0.145548, 0.997983, -0.00732713, 0.0448358, 0.163221, 0.997985, -0.00815454, 0.0448358, 0.181899, 0.998005, -0.00898985, 0.0448286, 0.201533, 0.998026, -0.00964404, 0.0447934, 0.221821, 0.998055, -0.00922677, 0.044611, 0.241282, 0.99804, -0.0117361, 0.0448245, 0.261791, 0.998048, -0.0127628, 0.0448159, 0.285181, 0.998088, -0.0138055, 0.0447996, 0.30954, 0.998058, -0.0148206, 0.0447669, 0.334751, 0.998099, -0.0156998, 0.044697, 0.36061, 0.998116, -0.0161976, 0.0445122, 0.386603, 0.998195, -0.015945, 0.0441711, 0.411844, 0.998168, -0.0183947, 0.0444255, 0.43773, 0.998184, -0.0197913, 0.0443809, 0.466009, 0.998251, -0.0201426, 0.0440689, 0.494574, 0.998305, -0.0198847, 0.0435632, 0.522405, 0.998273, -0.0210577, 0.043414, 0.549967, 0.998254, -0.0227901, 0.0433943, 0.578655, 0.998349, -0.0223108, 0.0426529, 0.60758, 0.99843, -0.0223088, 0.042, 0.635524, 0.998373, -0.0241141, 0.0418987, 0.663621, 0.998425, -0.0231446, 0.0408118, 0.691906, 0.998504, -0.0233684, 0.0400565, 0.719339, 0.998443, -0.0241652, 0.0394634, 0.74643, 0.99848, -0.0228715, 0.0380002, 0.773086, 0.998569, -0.023519, 0.0372322, 0.798988, 0.998619, -0.0223108, 0.0356468, 0.824249, 0.998594, -0.0223105, 0.034523, 0.848808, 0.998622, -0.0213426, 0.0328887, 0.87227, 0.998669, -0.0207912, 0.0314374, 0.895157, 0.998705, -0.0198416, 0.0296925, 0.916769, 0.998786, -0.0189168, 0.0279634, 0.937773, 0.998888, -0.0178811, 0.0261597, 0.957431, 0.99906, -0.0166845, 0.0242159, 0.976495, 0.999038, -0.0155464, 0.0222638, 0.994169, 0.999237, -0.0141349, 0.0201967, 1.01112, 0.999378, -0.0129324, 0.0181744, 1.02692, 0.999433, -0.0113192, 0.0159898, 1.04174, 0.999439, -0.0101244, 0.0140385, 1.05559, 0.999614, -0.00837456, 0.0117826, 1.06852, 0.999722, -0.00721769, 0.00983745, 1.08069, 0.999817, -0.00554067, 0.00769002, 1.09176, 0.99983, -0.00426961, 0.005782, 1.10211, 0.999964, -0.00273904, 0.00374503, 1.11152, 1.00001, -0.00136739, 0.00187176, 1.12031, 0.999946, 3.93227e-05, -2.8919e-05, 1.12804, 0.995847, -1.3435e-06, 0.0671785, 1.9916e-05, 0.995464, -3.38387e-05, 0.0671527, 0.000501622, 0.99547, -0.000135355, 0.0671531, 0.00200649, 0.995471, -0.00030455, 0.0671532, 0.00451461, 0.99547, -0.000541423, 0.0671531, 0.008026, 0.995471, -0.00084598, 0.0671531, 0.0125407, 0.99547, -0.00121823, 0.0671531, 0.0180589, 0.99547, -0.00165817, 0.0671531, 0.0245806, 0.995463, -0.00216583, 0.0671526, 0.0321062, 0.995468, -0.00274127, 0.0671527, 0.0406366, 0.995474, -0.00338447, 0.0671534, 0.0501717, 0.995473, -0.00409554, 0.0671533, 0.0607131, 0.995478, -0.00487451, 0.0671531, 0.0722618, 0.995476, -0.00572148, 0.0671532, 0.0848191, 0.995477, -0.00663658, 0.0671539, 0.0983882, 0.995498, -0.00761986, 0.0671541, 0.112972, 0.995509, -0.00867094, 0.0671542, 0.128568, 0.995509, -0.00978951, 0.0671531, 0.145183, 0.995503, -0.0109725, 0.0671491, 0.162808, 0.995501, -0.012211, 0.0671465, 0.181441, 0.99553, -0.0134565, 0.0671371, 0.201015, 0.99555, -0.014391, 0.0670831, 0.221206, 0.99558, -0.014351, 0.0668883, 0.240813, 0.995577, -0.0173997, 0.0671055, 0.261257, 0.995602, -0.0191111, 0.0671178, 0.284467, 0.995623, -0.0206705, 0.0670946, 0.308765, 0.995658, -0.022184, 0.0670472, 0.333905, 0.995705, -0.0234832, 0.0669417, 0.359677, 0.995719, -0.0241933, 0.0666714, 0.385554, 0.995786, -0.0243539, 0.066266, 0.410951, 0.995887, -0.0271866, 0.0664367, 0.437163, 0.995944, -0.0296012, 0.0664931, 0.464842, 0.996004, -0.0301045, 0.0660105, 0.49332, 0.996128, -0.0298311, 0.0652694, 0.521131, 0.996253, -0.0316426, 0.0650739, 0.549167, 0.996244, -0.0339043, 0.0649433, 0.57737, 0.996309, -0.033329, 0.0638926, 0.606073, 0.996417, -0.0338935, 0.0630849, 0.634527, 0.996372, -0.0353104, 0.0625083, 0.66256, 0.996542, -0.0348942, 0.0611986, 0.690516, 0.996568, -0.0351614, 0.060069, 0.718317, 0.996711, -0.0354317, 0.0588522, 0.74528, 0.996671, -0.0349513, 0.0571902, 0.772061, 0.996865, -0.0345622, 0.0555321, 0.798089, 0.996802, -0.0342566, 0.0537816, 0.823178, 0.996992, -0.0330862, 0.0516095, 0.847949, 0.996944, -0.0324666, 0.0495537, 0.871431, 0.997146, -0.0309544, 0.0470302, 0.894357, 0.997189, -0.0299372, 0.0446043, 0.916142, 0.997471, -0.0281389, 0.0418812, 0.937193, 0.997515, -0.0268702, 0.0391823, 0.957, 0.997812, -0.0247166, 0.0361338, 0.975936, 0.998027, -0.0233525, 0.0333945, 0.99391, 0.998233, -0.0209839, 0.0301917, 1.01075, 0.998481, -0.0194309, 0.027271, 1.02669, 0.998859, -0.0169728, 0.0240162, 1.04173, 0.99894, -0.0152322, 0.0210517, 1.05551, 0.999132, -0.0127497, 0.0178632, 1.06856, 0.999369, -0.0108282, 0.014787, 1.08054, 0.999549, -0.00845886, 0.0116185, 1.09185, 0.999805, -0.0063937, 0.00867209, 1.10207, 0.99985, -0.00414582, 0.00566823, 1.1117, 0.999912, -0.00207443, 0.00277562, 1.12022, 1.00001, 8.70226e-05, -5.3766e-05, 1.12832, 0.991943, -1.78672e-06, 0.0893382, 1.98384e-05, 0.991952, -4.50183e-05, 0.089339, 0.000499849, 0.991956, -0.000180074, 0.0893394, 0.0019994, 0.991955, -0.000405167, 0.0893393, 0.00449867, 0.991953, -0.000720298, 0.0893391, 0.00799764, 0.991955, -0.00112548, 0.0893393, 0.0124964, 0.991957, -0.0016207, 0.0893395, 0.0179951, 0.991958, -0.00220601, 0.0893396, 0.0244939, 0.991947, -0.00288137, 0.0893385, 0.0319929, 0.991962, -0.00364693, 0.0893399, 0.0404933, 0.991965, -0.00450264, 0.0893399, 0.049995, 0.99198, -0.00544862, 0.0893411, 0.0604995, 0.99197, -0.00648491, 0.0893397, 0.0720074, 0.991976, -0.00761164, 0.089341, 0.0845207, 0.99198, -0.00882891, 0.0893405, 0.0980413, 0.991982, -0.0101367, 0.0893396, 0.112571, 0.992008, -0.011535, 0.0893415, 0.128115, 0.992026, -0.0130228, 0.0893414, 0.144672, 0.992064, -0.0145966, 0.0893418, 0.162241, 0.992041, -0.0162421, 0.0893359, 0.180801, 0.992086, -0.0178888, 0.0893214, 0.200302, 0.992157, -0.0190368, 0.0892401, 0.220332, 0.992181, -0.0195584, 0.0890525, 0.240144, 0.992175, -0.0227257, 0.0892153, 0.260728, 0.99221, -0.0254195, 0.089304, 0.283473, 0.99222, -0.0274883, 0.0892703, 0.307673, 0.992317, -0.0294905, 0.0892027, 0.332729, 0.992374, -0.0311861, 0.0890577, 0.358387, 0.992505, -0.0320656, 0.0886994, 0.384102, 0.992568, -0.0329715, 0.0883198, 0.409767, 0.992675, -0.036006, 0.0883602, 0.436145, 0.992746, -0.0392897, 0.0884591, 0.463217, 0.992873, -0.0399337, 0.0878287, 0.491557, 0.992934, -0.040231, 0.0870108, 0.519516, 0.993091, -0.0422013, 0.0865857, 0.547741, 0.993259, -0.0443503, 0.0861937, 0.575792, 0.993455, -0.0446368, 0.0851187, 0.604233, 0.993497, -0.0454299, 0.0840576, 0.632925, 0.993694, -0.0463296, 0.0829671, 0.660985, 0.993718, -0.0470619, 0.0817185, 0.688714, 0.993973, -0.0468838, 0.0800294, 0.716743, 0.994207, -0.046705, 0.0781286, 0.74377, 0.994168, -0.0469698, 0.0763337, 0.77042, 0.9945, -0.0456816, 0.0738184, 0.796659, 0.994356, -0.0455518, 0.0715545, 0.821868, 0.994747, -0.0439488, 0.0686085, 0.846572, 0.994937, -0.0430056, 0.065869, 0.870435, 0.995142, -0.0413414, 0.0626446, 0.893272, 0.995451, -0.0396521, 0.05929, 0.915376, 0.995445, -0.0378453, 0.0558503, 0.936196, 0.995967, -0.0355219, 0.0520949, 0.956376, 0.996094, -0.0335146, 0.048377, 0.975327, 0.996622, -0.030682, 0.0442575, 0.993471, 0.996938, -0.0285504, 0.0404693, 1.01052, 0.997383, -0.0253399, 0.0360903, 1.02637, 0.997714, -0.0231651, 0.0322176, 1.04139, 0.998249, -0.0198138, 0.0278433, 1.05542, 0.998596, -0.0174337, 0.0238759, 1.06846, 0.998946, -0.0141349, 0.0195944, 1.08056, 0.99928, -0.0115603, 0.0156279, 1.09181, 0.999507, -0.00839065, 0.0114607, 1.10213, 0.999697, -0.005666, 0.00763325, 1.11169, 0.999869, -0.00269902, 0.00364946, 1.12042, 1.00001, 6.23836e-05, -3.19288e-05, 1.12832, 0.987221, -2.22675e-06, 0.111332, 1.97456e-05, 0.98739, -5.61116e-05, 0.111351, 0.000497563, 0.987448, -0.000224453, 0.111357, 0.00199031, 0.987441, -0.000505019, 0.111357, 0.0044782, 0.987442, -0.000897816, 0.111357, 0.00796129, 0.987442, -0.00140284, 0.111357, 0.0124396, 0.987444, -0.00202012, 0.111357, 0.0179132, 0.987442, -0.00274964, 0.111357, 0.0243824, 0.987446, -0.00359147, 0.111357, 0.0318474, 0.987435, -0.00454562, 0.111356, 0.0403086, 0.987461, -0.00561225, 0.111358, 0.0497678, 0.987458, -0.00679125, 0.111358, 0.0602239, 0.987443, -0.0080828, 0.111356, 0.0716792, 0.987476, -0.0094872, 0.111358, 0.0841364, 0.98749, -0.0110044, 0.111361, 0.097597, 0.987508, -0.0126344, 0.111362, 0.112062, 0.987494, -0.0143767, 0.111357, 0.127533, 0.987526, -0.0162307, 0.111359, 0.144015, 0.987558, -0.0181912, 0.111361, 0.161502, 0.987602, -0.0202393, 0.111355, 0.179979, 0.987692, -0.022273, 0.111346, 0.199386, 0.987702, -0.0235306, 0.111215, 0.219183, 0.987789, -0.0247628, 0.111061, 0.239202, 0.987776, -0.0280668, 0.111171, 0.259957, 0.987856, -0.0316751, 0.111327, 0.282198, 0.987912, -0.0342468, 0.111282, 0.306294, 0.988, -0.0367205, 0.111198, 0.331219, 0.988055, -0.0387766, 0.110994, 0.356708, 0.988241, -0.0397722, 0.110547, 0.382234, 0.988399, -0.0416076, 0.110198, 0.408227, 0.988539, -0.0448192, 0.110137, 0.434662, 0.988661, -0.0483793, 0.110143, 0.461442, 0.988967, -0.0495895, 0.109453, 0.489318, 0.989073, -0.0506797, 0.108628, 0.517516, 0.989274, -0.0526953, 0.108003, 0.545844, 0.989528, -0.054578, 0.107255, 0.573823, 0.989709, -0.0561503, 0.106294, 0.601944, 0.989991, -0.056866, 0.104896, 0.630855, 0.990392, -0.0572914, 0.103336, 0.658925, 0.990374, -0.0586224, 0.10189, 0.686661, 0.990747, -0.0584764, 0.099783, 0.714548, 0.991041, -0.0582662, 0.0974309, 0.74186, 0.991236, -0.0584118, 0.0951678, 0.768422, 0.991585, -0.0573055, 0.0921581, 0.794817, 0.991984, -0.0564241, 0.0891167, 0.820336, 0.9921, -0.0553608, 0.085805, 0.84493, 0.992749, -0.0533816, 0.0820354, 0.868961, 0.99288, -0.0518661, 0.0782181, 0.891931, 0.993511, -0.0492492, 0.0738935, 0.914186, 0.993617, -0.0471956, 0.0696402, 0.93532, 0.99411, -0.044216, 0.0649659, 0.95543, 0.994595, -0.0416654, 0.0603177, 0.974685, 0.994976, -0.0384314, 0.0553493, 0.992807, 0.995579, -0.0353491, 0.0503942, 1.00996, 0.996069, -0.0319787, 0.0452123, 1.02606, 0.996718, -0.028472, 0.0400112, 1.04114, 0.997173, -0.0250789, 0.0349456, 1.05517, 0.997818, -0.0213326, 0.029653, 1.0683, 0.998318, -0.0178509, 0.024549, 1.0805, 0.998853, -0.0141118, 0.0194197, 1.09177, 0.999218, -0.0105914, 0.0143869, 1.1022, 0.999594, -0.00693474, 0.00943517, 1.11175, 0.99975, -0.00340478, 0.00464051, 1.12056, 1.00001, 0.000109172, -0.000112821, 1.12853, 0.983383, -2.66524e-06, 0.133358, 1.96534e-05, 0.981942, -6.71009e-05, 0.133162, 0.000494804, 0.981946, -0.000268405, 0.133163, 0.00197923, 0.981944, -0.000603912, 0.133163, 0.00445326, 0.981941, -0.00107362, 0.133162, 0.00791693, 0.981946, -0.00167755, 0.133163, 0.0123703, 0.981944, -0.00241569, 0.133162, 0.0178135, 0.981945, -0.00328807, 0.133163, 0.0242466, 0.981945, -0.00429472, 0.133162, 0.03167, 0.981955, -0.00543573, 0.133164, 0.0400846, 0.981951, -0.00671105, 0.133163, 0.0494901, 0.981968, -0.00812092, 0.133165, 0.0598886, 0.981979, -0.00966541, 0.133166, 0.0712811, 0.981996, -0.0113446, 0.133168, 0.083669, 0.982014, -0.0131585, 0.133169, 0.0970533, 0.982011, -0.0151073, 0.133167, 0.111438, 0.982062, -0.0171906, 0.133172, 0.126826, 0.9821, -0.0194067, 0.133175, 0.143215, 0.982149, -0.0217502, 0.133176, 0.160609, 0.982163, -0.0241945, 0.133173, 0.178981, 0.982247, -0.0265907, 0.133148, 0.198249, 0.982291, -0.027916, 0.132974, 0.217795, 0.982396, -0.0299663, 0.132868, 0.238042, 0.982456, -0.0334544, 0.132934, 0.258901, 0.982499, -0.0378636, 0.133137, 0.280639, 0.982617, -0.0409274, 0.133085, 0.304604, 0.98274, -0.0438523, 0.132985, 0.329376, 0.982944, -0.0462288, 0.132728, 0.354697, 0.98308, -0.0475995, 0.132228, 0.380102, 0.983391, -0.0501901, 0.131924, 0.406256, 0.983514, -0.0535899, 0.131737, 0.432735, 0.98373, -0.0571858, 0.131567, 0.459359, 0.984056, -0.0592353, 0.130932, 0.486637, 0.984234, -0.0610488, 0.130092, 0.51509, 0.984748, -0.0630758, 0.12923, 0.543461, 0.985073, -0.0647398, 0.128174, 0.571376, 0.985195, -0.0671941, 0.127133, 0.599414, 0.985734, -0.0681345, 0.125576, 0.628134, 0.986241, -0.0686089, 0.123639, 0.656399, 0.986356, -0.0698511, 0.121834, 0.684258, 0.986894, -0.0700931, 0.119454, 0.711818, 0.987382, -0.0698321, 0.116718, 0.739511, 0.988109, -0.0693975, 0.113699, 0.766267, 0.988363, -0.0689584, 0.110454, 0.792456, 0.989112, -0.0672353, 0.106602, 0.81813, 0.989241, -0.0662034, 0.10267, 0.842889, 0.990333, -0.0638938, 0.0981381, 0.867204, 0.990591, -0.0618534, 0.0935388, 0.89038, 0.991106, -0.0593117, 0.088553, 0.912576, 0.991919, -0.0562676, 0.0832187, 0.934118, 0.992111, -0.0534085, 0.0778302, 0.954254, 0.992997, -0.0495459, 0.0720453, 0.973722, 0.993317, -0.0463707, 0.0663458, 0.991949, 0.994133, -0.0421245, 0.0601883, 1.00936, 0.994705, -0.0384977, 0.0542501, 1.02559, 0.995495, -0.0340956, 0.0479862, 1.04083, 0.996206, -0.030105, 0.041887, 1.05497, 0.996971, -0.0256095, 0.0355355, 1.06824, 0.997796, -0.0213932, 0.0293655, 1.08056, 0.998272, -0.0169612, 0.0232926, 1.09182, 0.998857, -0.0126756, 0.0172786, 1.10219, 0.99939, -0.00832486, 0.0113156, 1.11192, 0.999752, -0.00410826, 0.00557892, 1.12075, 1, 0.000150957, -0.000119101, 1.12885, 0.975169, -3.09397e-06, 0.154669, 1.95073e-05, 0.975439, -7.79608e-05, 0.154712, 0.000491534, 0.975464, -0.000311847, 0.154716, 0.00196617, 0.975464, -0.000701656, 0.154716, 0.00442387, 0.975462, -0.0012474, 0.154715, 0.0078647, 0.975461, -0.00194906, 0.154715, 0.0122886, 0.975464, -0.00280667, 0.154715, 0.0176959, 0.975468, -0.00382025, 0.154716, 0.0240867, 0.975471, -0.00498985, 0.154716, 0.0314612, 0.975472, -0.00631541, 0.154717, 0.0398199, 0.975486, -0.00779719, 0.154718, 0.0491639, 0.975489, -0.00943505, 0.154718, 0.0594932, 0.975509, -0.0112295, 0.154721, 0.0708113, 0.97554, -0.0131802, 0.154724, 0.0831176, 0.975557, -0.0152876, 0.154726, 0.096415, 0.975585, -0.0175512, 0.154728, 0.110705, 0.975605, -0.0199713, 0.154729, 0.125992, 0.975645, -0.0225447, 0.154729, 0.142272, 0.975711, -0.0252649, 0.154735, 0.159549, 0.975788, -0.0280986, 0.154736, 0.177805, 0.975872, -0.0308232, 0.154704, 0.196911, 0.975968, -0.0324841, 0.154525, 0.216324, 0.976063, -0.0351281, 0.154432, 0.236628, 0.976157, -0.0388618, 0.15446, 0.257539, 0.976204, -0.0437704, 0.154665, 0.278975, 0.976358, -0.047514, 0.154652, 0.302606, 0.976571, -0.0508638, 0.154535, 0.327204, 0.976725, -0.0534995, 0.154221, 0.352276, 0.977013, -0.0555547, 0.153737, 0.377696, 0.977294, -0.0586728, 0.153403, 0.403855, 0.977602, -0.0622715, 0.15312, 0.430333, 0.977932, -0.0658166, 0.152755, 0.456855, 0.978241, -0.0689877, 0.152233, 0.483668, 0.978602, -0.0712805, 0.15132, 0.512097, 0.979234, -0.0732775, 0.150235, 0.540455, 0.97977, -0.075163, 0.148978, 0.568486, 0.979995, -0.0778026, 0.147755, 0.596524, 0.98078, -0.0791854, 0.146019, 0.624825, 0.981628, -0.0799666, 0.143906, 0.653403, 0.982067, -0.0808532, 0.141561, 0.681445, 0.98271, -0.0816024, 0.139025, 0.708918, 0.983734, -0.0812511, 0.135764, 0.736594, 0.98431, -0.0806201, 0.132152, 0.763576, 0.985071, -0.0801605, 0.12846, 0.789797, 0.98618, -0.0784208, 0.124084, 0.815804, 0.986886, -0.0766643, 0.1193, 0.840869, 0.987485, -0.0747744, 0.114236, 0.864952, 0.988431, -0.0716701, 0.108654, 0.888431, 0.988886, -0.0691609, 0.102994, 0.910963, 0.990024, -0.0654048, 0.0967278, 0.932629, 0.990401, -0.0619765, 0.090384, 0.95313, 0.991093, -0.0579296, 0.0837885, 0.972587, 0.992018, -0.0536576, 0.0770171, 0.991184, 0.992536, -0.0493719, 0.0701486, 1.00863, 0.993421, -0.0444813, 0.062953, 1.02494, 0.993928, -0.040008, 0.0560455, 1.04017, 0.994994, -0.0347982, 0.04856, 1.05463, 0.995866, -0.0301017, 0.0416152, 1.06807, 0.996916, -0.0248225, 0.0342597, 1.08039, 0.997766, -0.0199229, 0.0271668, 1.09177, 0.998479, -0.0147422, 0.0201387, 1.10235, 0.99921, -0.00980173, 0.0131944, 1.11206, 0.999652, -0.0047426, 0.00640712, 1.12104, 0.999998, 8.91673e-05, -0.00010379, 1.12906, 0.967868, -3.51885e-06, 0.175947, 1.93569e-05, 0.968001, -8.86733e-05, 0.175972, 0.000487782, 0.96801, -0.000354697, 0.175973, 0.00195115, 0.968012, -0.000798063, 0.175974, 0.00439006, 0.968011, -0.00141879, 0.175973, 0.00780461, 0.968011, -0.00221686, 0.175973, 0.0121948, 0.968016, -0.00319231, 0.175974, 0.0175607, 0.968019, -0.00434515, 0.175974, 0.0239027, 0.968018, -0.00567538, 0.175974, 0.0312208, 0.968033, -0.00718308, 0.175977, 0.0395158, 0.968049, -0.00886836, 0.175979, 0.0487885, 0.968047, -0.0107312, 0.175978, 0.0590394, 0.968072, -0.0127719, 0.175981, 0.0702705, 0.968108, -0.0149905, 0.175986, 0.0824836, 0.968112, -0.0173866, 0.175985, 0.0956783, 0.968173, -0.0199611, 0.175993, 0.109862, 0.96827, -0.0227128, 0.176008, 0.125033, 0.968292, -0.025639, 0.17601, 0.141193, 0.968339, -0.0287299, 0.176007, 0.158336, 0.968389, -0.0319399, 0.176001, 0.176441, 0.968501, -0.034941, 0.175962, 0.195359, 0.968646, -0.0370812, 0.175793, 0.214686, 0.968789, -0.0402329, 0.175708, 0.234973, 0.96886, -0.0442601, 0.1757, 0.255871, 0.969013, -0.049398, 0.175876, 0.277238, 0.969242, -0.0539932, 0.17594, 0.300326, 0.969419, -0.0577299, 0.175781, 0.324702, 0.969763, -0.0605643, 0.175432, 0.349527, 0.970093, -0.0634488, 0.174992, 0.374976, 0.970361, -0.0670589, 0.174611, 0.401097, 0.970825, -0.0708246, 0.174226, 0.427496, 0.971214, -0.0742871, 0.173684, 0.453858, 0.971622, -0.0782608, 0.173186, 0.480637, 0.972175, -0.0813151, 0.172288, 0.508655, 0.972944, -0.0832678, 0.170979, 0.536973, 0.973595, -0.0855964, 0.169573, 0.565138, 0.974345, -0.0882163, 0.168152, 0.593222, 0.975233, -0.0901671, 0.166314, 0.621201, 0.976239, -0.0912111, 0.163931, 0.649919, 0.977289, -0.0916959, 0.161106, 0.678011, 0.978076, -0.0927061, 0.158272, 0.705717, 0.979533, -0.0925562, 0.15475, 0.733228, 0.980335, -0.0918159, 0.150638, 0.760454, 0.981808, -0.0908508, 0.146201, 0.786918, 0.983061, -0.0896172, 0.141386, 0.812953, 0.984148, -0.0871588, 0.135837, 0.838281, 0.985047, -0.0850624, 0.130135, 0.862594, 0.986219, -0.0818541, 0.123882, 0.88633, 0.987043, -0.0784523, 0.117126, 0.908952, 0.988107, -0.0749601, 0.110341, 0.930744, 0.988955, -0.0703548, 0.102885, 0.951728, 0.989426, -0.0662798, 0.0954167, 0.971166, 0.990421, -0.0610834, 0.0876331, 0.989984, 0.991032, -0.0562936, 0.0797785, 1.00765, 0.992041, -0.0508154, 0.0718166, 1.02434, 0.992794, -0.0454045, 0.0637125, 1.03976, 0.993691, -0.0398194, 0.0555338, 1.05418, 0.994778, -0.0341482, 0.0473388, 1.06772, 0.995915, -0.028428, 0.0391016, 1.08028, 0.997109, -0.022642, 0.0309953, 1.09185, 0.998095, -0.0168738, 0.0230288, 1.10247, 0.998985, -0.0111274, 0.0150722, 1.11229, 0.999581, -0.00543881, 0.00740605, 1.12131, 1.00003, 0.000162239, -0.000105549, 1.12946, 0.959505, -3.93734e-06, 0.196876, 1.91893e-05, 0.959599, -9.92157e-05, 0.196895, 0.000483544, 0.959641, -0.000396868, 0.196903, 0.0019342, 0.959599, -0.000892948, 0.196895, 0.00435193, 0.959603, -0.00158747, 0.196896, 0.0077368, 0.959604, -0.00248042, 0.196896, 0.0120888, 0.959605, -0.00357184, 0.196896, 0.0174082, 0.959605, -0.00486169, 0.196896, 0.0236949, 0.959613, -0.00635008, 0.196897, 0.0309497, 0.959619, -0.00803696, 0.196898, 0.0391725, 0.959636, -0.00992255, 0.196901, 0.0483649, 0.959634, -0.0120067, 0.1969, 0.0585266, 0.959675, -0.0142898, 0.196906, 0.0696609, 0.959712, -0.0167717, 0.196911, 0.0817678, 0.959752, -0.0194524, 0.196918, 0.0948494, 0.959807, -0.0223321, 0.196925, 0.10891, 0.959828, -0.0254091, 0.196924, 0.123947, 0.959906, -0.0286815, 0.196934, 0.139968, 0.960005, -0.0321371, 0.196944, 0.156968, 0.960071, -0.0357114, 0.196936, 0.17491, 0.960237, -0.0389064, 0.196882, 0.193597, 0.960367, -0.041623, 0.196731, 0.21285, 0.960562, -0.0452655, 0.196654, 0.233075, 0.960735, -0.0496207, 0.196643, 0.253941, 0.960913, -0.0549379, 0.196774, 0.275278, 0.961121, -0.0603414, 0.196893, 0.297733, 0.96139, -0.0644244, 0.196717, 0.321877, 0.961818, -0.067556, 0.196314, 0.346476, 0.962175, -0.0712709, 0.195917, 0.371907, 0.96255, -0.0752848, 0.1955, 0.397916, 0.963164, -0.0792073, 0.195026, 0.424229, 0.963782, -0.0828225, 0.194424, 0.450637, 0.964306, -0.0873119, 0.193831, 0.477288, 0.964923, -0.0911051, 0.192973, 0.504716, 0.966048, -0.093251, 0.19151, 0.533053, 0.967024, -0.0958983, 0.190013, 0.561366, 0.968038, -0.09835, 0.188253, 0.589464, 0.969152, -0.100754, 0.186257, 0.617433, 0.970557, -0.102239, 0.183775, 0.645801, 0.972104, -0.102767, 0.180645, 0.674278, 0.973203, -0.103492, 0.177242, 0.702004, 0.975123, -0.103793, 0.17345, 0.729529, 0.97641, -0.102839, 0.168886, 0.756712, 0.978313, -0.101687, 0.163892, 0.783801, 0.980036, -0.100314, 0.158439, 0.809671, 0.981339, -0.097836, 0.152211, 0.835402, 0.982794, -0.0950006, 0.145679, 0.860081, 0.984123, -0.0920994, 0.138949, 0.883757, 0.984918, -0.0878641, 0.131283, 0.90685, 0.985999, -0.083939, 0.123464, 0.928786, 0.987151, -0.0791234, 0.115324, 0.94983, 0.987827, -0.0739332, 0.106854, 0.96962, 0.988806, -0.0688088, 0.0982691, 0.98861, 0.989588, -0.0628962, 0.0893456, 1.00667, 0.990438, -0.0573146, 0.0805392, 1.02344, 0.991506, -0.0509433, 0.0713725, 1.03933, 0.992492, -0.0448724, 0.0623732, 1.05378, 0.993663, -0.0383497, 0.0530838, 1.06747, 0.994956, -0.0319593, 0.0439512, 1.08007, 0.99634, -0.025401, 0.0347803, 1.09182, 0.99761, -0.0189687, 0.0257954, 1.1025, 0.99863, -0.0124441, 0.0169893, 1.11247, 0.99947, -0.00614003, 0.00829498, 1.12151, 1.00008, 0.000216624, -0.000146107, 1.12993, 0.950129, -4.34955e-06, 0.217413, 1.90081e-05, 0.950264, -0.00010957, 0.217444, 0.00047884, 0.9503, -0.000438299, 0.217451, 0.00191543, 0.950246, -0.000986124, 0.21744, 0.00430951, 0.950246, -0.00175311, 0.21744, 0.00766137, 0.950245, -0.00273923, 0.21744, 0.011971, 0.950253, -0.00394453, 0.217441, 0.0172385, 0.950258, -0.00536897, 0.217442, 0.0234641, 0.950267, -0.00701262, 0.217444, 0.030648, 0.950277, -0.00887551, 0.217446, 0.038791, 0.950284, -0.0109576, 0.217446, 0.0478931, 0.950312, -0.0132591, 0.217451, 0.0579568, 0.950334, -0.01578, 0.217454, 0.0689821, 0.950378, -0.0185204, 0.217462, 0.0809714, 0.950417, -0.0214803, 0.217467, 0.0939265, 0.950488, -0.0246594, 0.217479, 0.10785, 0.950534, -0.0280565, 0.217483, 0.122743, 0.950633, -0.0316685, 0.217498, 0.138611, 0.950698, -0.0354787, 0.217499, 0.155442, 0.950844, -0.0394003, 0.217507, 0.173208, 0.950999, -0.0426812, 0.217419, 0.191605, 0.951221, -0.0461302, 0.217317, 0.21084, 0.951412, -0.0502131, 0.217238, 0.230945, 0.951623, -0.0549183, 0.21722, 0.251745, 0.951867, -0.0604493, 0.217306, 0.273001, 0.952069, -0.0665189, 0.217466, 0.294874, 0.952459, -0.0709179, 0.217266, 0.318732, 0.952996, -0.0746112, 0.216891, 0.34318, 0.953425, -0.0789252, 0.216503, 0.36849, 0.953885, -0.0833293, 0.216042, 0.394373, 0.954617, -0.087371, 0.215469, 0.420505, 0.955429, -0.0914054, 0.214802, 0.446907, 0.956068, -0.0961671, 0.214146, 0.473522, 0.957094, -0.10048, 0.213286, 0.50052, 0.958372, -0.103248, 0.211796, 0.528715, 0.959654, -0.106033, 0.21016, 0.557065, 0.961305, -0.108384, 0.208149, 0.585286, 0.962785, -0.111122, 0.206024, 0.613334, 0.964848, -0.112981, 0.203442, 0.641334, 0.966498, -0.113717, 0.19996, 0.669955, 0.968678, -0.114121, 0.196105, 0.698094, 0.970489, -0.114524, 0.191906, 0.725643, 0.972903, -0.113792, 0.186963, 0.752856, 0.974701, -0.112406, 0.181343, 0.780013, 0.976718, -0.110685, 0.175185, 0.806268, 0.978905, -0.108468, 0.168535, 0.832073, 0.980267, -0.105061, 0.161106, 0.857149, 0.981967, -0.101675, 0.153387, 0.881145, 0.983063, -0.0974492, 0.145199, 0.904255, 0.984432, -0.0925815, 0.136527, 0.926686, 0.985734, -0.0877983, 0.127584, 0.947901, 0.986228, -0.081884, 0.118125, 0.968111, 0.98719, -0.0761208, 0.108594, 0.98719, 0.988228, -0.0698196, 0.0989996, 1.00559, 0.989046, -0.0632739, 0.0890074, 1.02246, 0.990242, -0.056522, 0.0790832, 1.03841, 0.991252, -0.0495272, 0.0689182, 1.05347, 0.992542, -0.0425373, 0.0588592, 1.06724, 0.994096, -0.0353198, 0.0486833, 1.08009, 0.995593, -0.028235, 0.0385977, 1.09177, 0.99711, -0.0209511, 0.0286457, 1.10274, 0.998263, -0.0139289, 0.0188497, 1.11262, 0.999254, -0.0067359, 0.009208, 1.12191, 0.999967, 0.000141846, -6.57764e-05, 1.13024, 0.935608, -4.74692e-06, 0.236466, 1.87817e-05, 0.93996, -0.00011971, 0.237568, 0.000473646, 0.939959, -0.000478845, 0.237567, 0.0018946, 0.939954, -0.0010774, 0.237566, 0.00426284, 0.939956, -0.00191538, 0.237566, 0.00757842, 0.939954, -0.00299277, 0.237566, 0.0118413, 0.93996, -0.00430961, 0.237567, 0.0170518, 0.939969, -0.00586589, 0.237569, 0.02321, 0.939982, -0.00766166, 0.237572, 0.0303164, 0.939987, -0.00969686, 0.237572, 0.0383711, 0.939997, -0.0119715, 0.237574, 0.0473751, 0.940031, -0.0144858, 0.237581, 0.0573298, 0.940073, -0.0172399, 0.237589, 0.0682366, 0.94012, -0.0202335, 0.237598, 0.080097, 0.940162, -0.0234663, 0.237604, 0.0929116, 0.940237, -0.0269387, 0.237615, 0.106686, 0.940328, -0.0306489, 0.237632, 0.121421, 0.940419, -0.0345917, 0.237645, 0.137115, 0.940522, -0.0387481, 0.237654, 0.153766, 0.940702, -0.0429906, 0.237661, 0.17133, 0.940871, -0.0465089, 0.237561, 0.189502, 0.941103, -0.050531, 0.23748, 0.208616, 0.941369, -0.0550657, 0.237423, 0.228595, 0.941641, -0.0601337, 0.237399, 0.249287, 0.941903, -0.0658804, 0.237443, 0.270467, 0.942224, -0.0722674, 0.237597, 0.292024, 0.942633, -0.0771788, 0.237419, 0.315272, 0.943172, -0.0815623, 0.237068, 0.339579, 0.943691, -0.0863973, 0.236682, 0.364717, 0.944382, -0.0911536, 0.236213, 0.390435, 0.945392, -0.0952967, 0.235562, 0.416425, 0.946185, -0.0998948, 0.234832, 0.442772, 0.947212, -0.104796, 0.234114, 0.469347, 0.948778, -0.10928, 0.233222, 0.496162, 0.950149, -0.113081, 0.231845, 0.523978, 0.951989, -0.115893, 0.230005, 0.552295, 0.953921, -0.11846, 0.227862, 0.580569, 0.955624, -0.12115, 0.225439, 0.608698, 0.958234, -0.123373, 0.222635, 0.636696, 0.960593, -0.124519, 0.219093, 0.665208, 0.963201, -0.124736, 0.214749, 0.693557, 0.965642, -0.125012, 0.210059, 0.721334, 0.968765, -0.124661, 0.204935, 0.748613, 0.971753, -0.122996, 0.198661, 0.776224, 0.973751, -0.120998, 0.191823, 0.802461, 0.976709, -0.118583, 0.184359, 0.828399, 0.977956, -0.115102, 0.176437, 0.853693, 0.979672, -0.111077, 0.167681, 0.877962, 0.981816, -0.10688, 0.158872, 0.901564, 0.98238, -0.101469, 0.149398, 0.924057, 0.983964, -0.0960013, 0.139436, 0.945751, 0.984933, -0.0899626, 0.12943, 0.966272, 0.985694, -0.0832973, 0.11894, 0.985741, 0.986822, -0.0767082, 0.108349, 1.00407, 0.987725, -0.0693614, 0.0976026, 1.02154, 0.98877, -0.06211, 0.086652, 1.03757, 0.990129, -0.0544143, 0.0756182, 1.05296, 0.991337, -0.046744, 0.0645753, 1.06683, 0.992978, -0.0387931, 0.0534683, 1.0798, 0.994676, -0.030973, 0.0424137, 1.09181, 0.99645, -0.0230311, 0.0314035, 1.10286, 0.997967, -0.0152065, 0.0206869, 1.11291, 0.99922, -0.00744837, 0.010155, 1.12237, 1.00002, 0.000240209, -7.52767e-05, 1.13089, 0.922948, -5.15351e-06, 0.255626, 1.86069e-05, 0.928785, -0.000129623, 0.257244, 0.000468009, 0.928761, -0.00051849, 0.257237, 0.00187202, 0.928751, -0.0011666, 0.257235, 0.00421204, 0.928751, -0.00207395, 0.257234, 0.0074881, 0.928754, -0.00324055, 0.257235, 0.0117002, 0.92876, -0.00466639, 0.257236, 0.0168486, 0.928763, -0.00635149, 0.257237, 0.0229334, 0.928774, -0.00829584, 0.257239, 0.029955, 0.928791, -0.0104995, 0.257243, 0.0379139, 0.928804, -0.0129623, 0.257245, 0.0468108, 0.928847, -0.0156846, 0.257255, 0.0566473, 0.92889, -0.0186661, 0.257263, 0.0674246, 0.928924, -0.0219067, 0.257268, 0.0791433, 0.928989, -0.0254066, 0.257282, 0.0918076, 0.92909, -0.0291651, 0.257301, 0.105419, 0.92918, -0.0331801, 0.257316, 0.119978, 0.92929, -0.0374469, 0.257332, 0.135491, 0.929453, -0.041939, 0.257357, 0.151948, 0.929586, -0.0464612, 0.257347, 0.169275, 0.929858, -0.0503426, 0.257269, 0.187257, 0.930125, -0.0548409, 0.257199, 0.206204, 0.930403, -0.0598063, 0.257149, 0.22601, 0.930726, -0.0652437, 0.257122, 0.246561, 0.931098, -0.0712376, 0.257153, 0.267618, 0.931396, -0.0777506, 0.257237, 0.288993, 0.931947, -0.0832374, 0.257124, 0.311527, 0.932579, -0.0883955, 0.25683, 0.335697, 0.933194, -0.0937037, 0.256444, 0.360634, 0.934013, -0.0987292, 0.255939, 0.386126, 0.935307, -0.103215, 0.255282, 0.412018, 0.936374, -0.108234, 0.254538, 0.438292, 0.93776, -0.113234, 0.253728, 0.464805, 0.939599, -0.118013, 0.25275, 0.491464, 0.941036, -0.122661, 0.251404, 0.518751, 0.94337, -0.125477, 0.249435, 0.547133, 0.945318, -0.128374, 0.247113, 0.575456, 0.947995, -0.130996, 0.244441, 0.60372, 0.950818, -0.133438, 0.241352, 0.63174, 0.954378, -0.135004, 0.237849, 0.659971, 0.957151, -0.135313, 0.233188, 0.688478, 0.960743, -0.13521, 0.228001, 0.716767, 0.964352, -0.135007, 0.222249, 0.744349, 0.967273, -0.133523, 0.21542, 0.771786, 0.969767, -0.131155, 0.208039, 0.798639, 0.973195, -0.128492, 0.200076, 0.824774, 0.975557, -0.125094, 0.191451, 0.850222, 0.977692, -0.120578, 0.18184, 0.874761, 0.98026, -0.115882, 0.172102, 0.898497, 0.981394, -0.110372, 0.161859, 0.921636, 0.982386, -0.10415, 0.15108, 0.943467, 0.983783, -0.0978128, 0.140407, 0.964045, 0.98422, -0.0906171, 0.129058, 0.98398, 0.985447, -0.0832921, 0.117614, 1.00276, 0.986682, -0.0754412, 0.10585, 1.02047, 0.987326, -0.0673885, 0.0940943, 1.03678, 0.988707, -0.0592565, 0.0822093, 1.05218, 0.990185, -0.050717, 0.070192, 1.06652, 0.991866, -0.0423486, 0.0582081, 1.07965, 0.993897, -0.0336118, 0.0460985, 1.09188, 0.995841, -0.0252178, 0.0342737, 1.10307, 0.997605, -0.0164893, 0.0224829, 1.11324, 0.999037, -0.00817112, 0.0110647, 1.12262, 1.00003, 0.000291686, -0.000168673, 1.13139, 0.915304, -5.52675e-06, 0.275999, 1.83285e-05, 0.91668, -0.000139285, 0.276414, 0.000461914, 0.916664, -0.00055713, 0.276409, 0.00184763, 0.916653, -0.00125354, 0.276406, 0.00415715, 0.916651, -0.00222851, 0.276405, 0.00739053, 0.916655, -0.00348205, 0.276406, 0.0115478, 0.916653, -0.00501414, 0.276405, 0.0166291, 0.916667, -0.00682478, 0.276409, 0.0226346, 0.91668, -0.00891398, 0.276412, 0.0295648, 0.91669, -0.0112817, 0.276413, 0.0374199, 0.916727, -0.013928, 0.276422, 0.0462016, 0.916759, -0.0168528, 0.276429, 0.0559101, 0.916793, -0.0200558, 0.276436, 0.0665466, 0.916849, -0.0235373, 0.276448, 0.0781139, 0.916964, -0.0272973, 0.276474, 0.0906156, 0.917047, -0.0313344, 0.276491, 0.104051, 0.917152, -0.0356465, 0.276511, 0.118424, 0.917286, -0.0402271, 0.276533, 0.133736, 0.917469, -0.0450408, 0.276564, 0.149978, 0.917686, -0.0497872, 0.276563, 0.167057, 0.917953, -0.0540937, 0.276493, 0.184846, 0.918228, -0.0590709, 0.276437, 0.203614, 0.918572, -0.0644277, 0.276398, 0.223212, 0.918918, -0.0702326, 0.276362, 0.243584, 0.919356, -0.076484, 0.276383, 0.264465, 0.919842, -0.0830808, 0.276434, 0.285701, 0.920451, -0.0892972, 0.276407, 0.307559, 0.921113, -0.095016, 0.276128, 0.331501, 0.921881, -0.100771, 0.275754, 0.356207, 0.923027, -0.106029, 0.275254, 0.381477, 0.924364, -0.111029, 0.274595, 0.40722, 0.925818, -0.116345, 0.273841, 0.433385, 0.92746, -0.121424, 0.272913, 0.459848, 0.929167, -0.12657, 0.271837, 0.486493, 0.931426, -0.131581, 0.270575, 0.513432, 0.934001, -0.135038, 0.268512, 0.541502, 0.936296, -0.138039, 0.266135, 0.569658, 0.939985, -0.140687, 0.263271, 0.598375, 0.943516, -0.143247, 0.260058, 0.626563, 0.94782, -0.145135, 0.256138, 0.654711, 0.951023, -0.145733, 0.251154, 0.683285, 0.955338, -0.145554, 0.245562, 0.711831, 0.959629, -0.145008, 0.239265, 0.739573, 0.963123, -0.144003, 0.232064, 0.767027, 0.966742, -0.141289, 0.224036, 0.794359, 0.969991, -0.138247, 0.215305, 0.820361, 0.973403, -0.134786, 0.206051, 0.846548, 0.975317, -0.129966, 0.195914, 0.871541, 0.977647, -0.12471, 0.185184, 0.895313, 0.980137, -0.119086, 0.174161, 0.918398, 0.981031, -0.112297, 0.162792, 0.940679, 0.982037, -0.105372, 0.150952, 0.961991, 0.983164, -0.097821, 0.138921, 0.981913, 0.983757, -0.0897245, 0.126611, 1.00109, 0.985036, -0.0815974, 0.114228, 1.01902, 0.986289, -0.0727725, 0.101389, 1.03604, 0.987329, -0.0639323, 0.0886476, 1.05149, 0.989193, -0.0548109, 0.0756837, 1.06619, 0.990716, -0.045687, 0.0627581, 1.07948, 0.992769, -0.0364315, 0.0498337, 1.09172, 0.99524, -0.0271761, 0.0370305, 1.1033, 0.997154, -0.0179609, 0.0243959, 1.11353, 0.998845, -0.00878063, 0.0119567, 1.12319, 1.00002, 0.000259038, -0.000108146, 1.13177, 0.903945, -5.91681e-06, 0.295126, 1.81226e-05, 0.903668, -0.000148672, 0.295037, 0.000455367, 0.903677, -0.000594683, 0.29504, 0.00182145, 0.903673, -0.00133805, 0.295039, 0.00409831, 0.903666, -0.00237872, 0.295036, 0.00728584, 0.903668, -0.00371676, 0.295037, 0.0113842, 0.903679, -0.00535212, 0.29504, 0.0163936, 0.903684, -0.00728479, 0.295041, 0.0223141, 0.903698, -0.00951473, 0.295044, 0.0291462, 0.903718, -0.0120419, 0.295049, 0.0368904, 0.903754, -0.0148664, 0.295058, 0.0455477, 0.903801, -0.017988, 0.29507, 0.0551194, 0.903851, -0.0214064, 0.295082, 0.0656058, 0.903921, -0.0251219, 0.295097, 0.0770109, 0.904002, -0.0291337, 0.295116, 0.0893354, 0.904111, -0.033441, 0.29514, 0.102583, 0.904246, -0.0380415, 0.295169, 0.116755, 0.904408, -0.0429258, 0.295202, 0.131853, 0.904637, -0.0480468, 0.295245, 0.147869, 0.904821, -0.0529208, 0.295214, 0.164658, 0.905163, -0.0577748, 0.295185, 0.182274, 0.905469, -0.0631763, 0.295143, 0.200828, 0.905851, -0.068917, 0.295112, 0.2202, 0.906322, -0.0750861, 0.295104, 0.240372, 0.906761, -0.0815855, 0.295086, 0.261082, 0.90735, -0.0882138, 0.295095, 0.282123, 0.908087, -0.095082, 0.295139, 0.303563, 0.908826, -0.101488, 0.29492, 0.327028, 0.909832, -0.107577, 0.294577, 0.351464, 0.911393, -0.113033, 0.294115, 0.376497, 0.912804, -0.118629, 0.293446, 0.402115, 0.914081, -0.124232, 0.292581, 0.428111, 0.91637, -0.129399, 0.29166, 0.454442, 0.91814, -0.134892, 0.290422, 0.481024, 0.921179, -0.140069, 0.289194, 0.507924, 0.924544, -0.144431, 0.287421, 0.535557, 0.927995, -0.147498, 0.284867, 0.563984, 0.931556, -0.150197, 0.281722, 0.5923, 0.935777, -0.152711, 0.278207, 0.620832, 0.940869, -0.154836, 0.274148, 0.649069, 0.945994, -0.155912, 0.269057, 0.677746, 0.949634, -0.155641, 0.262799, 0.706293, 0.955032, -0.154809, 0.256097, 0.734278, 0.95917, -0.153678, 0.248618, 0.761751, 0.962931, -0.151253, 0.239794, 0.789032, 0.966045, -0.147625, 0.230281, 0.815422, 0.96971, -0.143964, 0.220382, 0.841787, 0.972747, -0.139464, 0.209846, 0.867446, 0.975545, -0.133459, 0.198189, 0.892004, 0.978381, -0.127424, 0.186362, 0.915458, 0.979935, -0.120506, 0.173964, 0.937948, 0.980948, -0.11282, 0.161429, 0.959732, 0.982234, -0.104941, 0.148557, 0.980118, 0.982767, -0.0962905, 0.135508, 0.999463, 0.983544, -0.0873625, 0.122338, 1.01756, 0.984965, -0.0783447, 0.108669, 1.03492, 0.986233, -0.0684798, 0.0949911, 1.05087, 0.987796, -0.0590867, 0.0811386, 1.0656, 0.989885, -0.0489145, 0.0673099, 1.0794, 0.991821, -0.0391, 0.0535665, 1.09174, 0.99448, -0.029087, 0.0397529, 1.10341, 0.996769, -0.019114, 0.0261463, 1.11383, 0.998641, -0.00947007, 0.0128731, 1.1237, 0.999978, 0.000446316, -0.000169093, 1.13253, 0.888362, -6.27064e-06, 0.312578, 1.78215e-05, 0.889988, -0.000157791, 0.313148, 0.000448451, 0.889825, -0.000631076, 0.313092, 0.00179356, 0.88984, -0.00141994, 0.313097, 0.00403554, 0.889828, -0.0025243, 0.313092, 0.00717429, 0.889831, -0.00394421, 0.313093, 0.0112099, 0.889831, -0.00567962, 0.313093, 0.0161425, 0.889844, -0.00773051, 0.313096, 0.0219724, 0.889858, -0.0100968, 0.3131, 0.0286999, 0.889882, -0.0127786, 0.313106, 0.0363256, 0.889918, -0.0157757, 0.313116, 0.0448509, 0.889967, -0.0190878, 0.313129, 0.0542758, 0.89003, -0.022715, 0.313145, 0.0646032, 0.890108, -0.0266566, 0.313165, 0.0758339, 0.890218, -0.0309131, 0.313193, 0.0879729, 0.890351, -0.0354819, 0.313226, 0.101019, 0.89051, -0.0403613, 0.313263, 0.114979, 0.890672, -0.0455385, 0.313294, 0.129848, 0.890882, -0.0509444, 0.313333, 0.145616, 0.891189, -0.0559657, 0.313324, 0.162122, 0.891457, -0.0613123, 0.313281, 0.179524, 0.891856, -0.0671488, 0.313281, 0.197855, 0.892312, -0.0732732, 0.313268, 0.216991, 0.892819, -0.0797865, 0.313263, 0.236924, 0.893369, -0.0865269, 0.313247, 0.257433, 0.894045, -0.0931592, 0.313205, 0.278215, 0.894884, -0.100532, 0.313276, 0.299467, 0.895832, -0.107716, 0.313205, 0.322276, 0.897043, -0.114099, 0.312873, 0.34642, 0.898515, -0.119941, 0.312331, 0.371187, 0.900191, -0.126044, 0.311731, 0.396656, 0.90188, -0.131808, 0.310859, 0.422488, 0.904359, -0.137289, 0.309857, 0.448744, 0.906923, -0.142991, 0.308714, 0.475239, 0.910634, -0.148253, 0.307465, 0.501983, 0.914502, -0.153332, 0.305774, 0.529254, 0.919046, -0.156646, 0.303156, 0.557709, 0.923194, -0.159612, 0.299928, 0.586267, 0.928858, -0.162027, 0.296245, 0.614925, 0.934464, -0.164203, 0.291832, 0.643187, 0.939824, -0.165602, 0.286565, 0.671601, 0.944582, -0.165383, 0.280073, 0.700213, 0.949257, -0.164439, 0.272891, 0.728432, 0.954389, -0.162953, 0.264771, 0.756082, 0.958595, -0.161007, 0.255927, 0.78369, 0.962138, -0.157243, 0.245769, 0.810769, 0.966979, -0.152872, 0.235127, 0.836999, 0.969566, -0.148209, 0.22347, 0.862684, 0.972372, -0.142211, 0.211147, 0.887847, 0.975916, -0.135458, 0.198606, 0.911843, 0.978026, -0.128398, 0.185498, 0.934795, 0.979686, -0.120313, 0.17171, 0.956787, 0.980748, -0.11166, 0.158159, 0.978046, 0.981622, -0.103035, 0.144399, 0.997693, 0.982356, -0.0930328, 0.13001, 1.01642, 0.983308, -0.0834627, 0.115778, 1.03366, 0.985037, -0.0732249, 0.101327, 1.05014, 0.986493, -0.0628145, 0.086554, 1.06507, 0.988484, -0.0526556, 0.0720413, 1.07907, 0.991051, -0.0415744, 0.0571151, 1.09189, 0.993523, -0.0314275, 0.0426643, 1.10369, 0.99628, -0.0203603, 0.0279325, 1.11423, 0.998344, -0.0102446, 0.0138182, 1.12421, 0.999997, 0.00042612, -0.000193628, 1.1333, 0.871555, -6.60007e-06, 0.329176, 1.74749e-05, 0.875255, -0.000166579, 0.330571, 0.000441051, 0.875644, -0.000666394, 0.330718, 0.00176441, 0.875159, -0.00149903, 0.330536, 0.00396899, 0.87516, -0.00266493, 0.330536, 0.007056, 0.875158, -0.00416393, 0.330535, 0.0110251, 0.87516, -0.00599598, 0.330535, 0.0158764, 0.875163, -0.00816108, 0.330536, 0.0216101, 0.875174, -0.0106591, 0.330538, 0.0282266, 0.875199, -0.0134899, 0.330545, 0.0357266, 0.875257, -0.0166538, 0.330563, 0.0441117, 0.875304, -0.0201501, 0.330575, 0.0533821, 0.875373, -0.0239785, 0.330595, 0.0635395, 0.875464, -0.0281389, 0.330619, 0.0745872, 0.875565, -0.0326301, 0.330645, 0.0865255, 0.875691, -0.0374516, 0.330676, 0.0993599, 0.875897, -0.0425993, 0.330733, 0.113093, 0.876091, -0.0480576, 0.330776, 0.127722, 0.876353, -0.0537216, 0.330826, 0.143227, 0.876649, -0.0589807, 0.330809, 0.159462, 0.877034, -0.0647865, 0.330819, 0.176642, 0.877443, -0.0709789, 0.330817, 0.194702, 0.877956, -0.0774782, 0.330832, 0.213577, 0.878499, -0.0843175, 0.330822, 0.233246, 0.879144, -0.0912714, 0.330804, 0.253512, 0.879982, -0.0980824, 0.330766, 0.274137, 0.88097, -0.105823, 0.330864, 0.295209, 0.882051, -0.113671, 0.330896, 0.317226, 0.883397, -0.120303, 0.330545, 0.341068, 0.884987, -0.12667, 0.330068, 0.365613, 0.886789, -0.133118, 0.329418, 0.390807, 0.889311, -0.139024, 0.328683, 0.416494, 0.891995, -0.144971, 0.327729, 0.442618, 0.895106, -0.150747, 0.326521, 0.469131, 0.899527, -0.156283, 0.325229, 0.495921, 0.90504, -0.161707, 0.32378, 0.523162, 0.909875, -0.165661, 0.32122, 0.55092, 0.91561, -0.168755, 0.317942, 0.579928, 0.921225, -0.171193, 0.313983, 0.608539, 0.927308, -0.17319, 0.309636, 0.636854, 0.933077, -0.174819, 0.304262, 0.66523, 0.938766, -0.175002, 0.297563, 0.693609, 0.943667, -0.173946, 0.289613, 0.722157, 0.949033, -0.172221, 0.281227, 0.750021, 0.953765, -0.169869, 0.271545, 0.777466, 0.95804, -0.166578, 0.261034, 0.804853, 0.962302, -0.161761, 0.249434, 0.831569, 0.966544, -0.156636, 0.237484, 0.857779, 0.969372, -0.150784, 0.224395, 0.883051, 0.972486, -0.143672, 0.210786, 0.907864, 0.975853, -0.135772, 0.196556, 0.931223, 0.977975, -0.127942, 0.182307, 0.954061, 0.979122, -0.118347, 0.167607, 0.97531, 0.980719, -0.109112, 0.152739, 0.995666, 0.981223, -0.0991789, 0.137932, 1.01475, 0.98216, -0.0883553, 0.122692, 1.03253, 0.983379, -0.0780825, 0.107493, 1.04917, 0.985434, -0.0665646, 0.0917791, 1.06464, 0.987332, -0.0557714, 0.0764949, 1.07896, 0.990004, -0.0442805, 0.060721, 1.09199, 0.992975, -0.0331676, 0.0452284, 1.10393, 0.995811, -0.0219547, 0.0297934, 1.11476, 0.9982, -0.0107613, 0.0146415, 1.12484, 1.00002, 0.000248678, -0.00014555, 1.13413, 0.859519, -6.93595e-06, 0.347264, 1.71673e-05, 0.859843, -0.00017503, 0.347394, 0.000433219, 0.859656, -0.000700076, 0.347319, 0.00173277, 0.859671, -0.00157517, 0.347325, 0.00389875, 0.859669, -0.00280028, 0.347324, 0.00693112, 0.85967, -0.0043754, 0.347324, 0.01083, 0.859665, -0.00630049, 0.347321, 0.0155954, 0.859685, -0.0085755, 0.347328, 0.0212278, 0.859694, -0.0112003, 0.347329, 0.0277273, 0.859718, -0.0141747, 0.347336, 0.0350946, 0.85976, -0.0174988, 0.347348, 0.0433314, 0.85982, -0.0211722, 0.347366, 0.0524384, 0.859892, -0.0251941, 0.347387, 0.0624168, 0.860006, -0.0295649, 0.347422, 0.0732708, 0.860122, -0.0342825, 0.347453, 0.0849999, 0.860282, -0.0393462, 0.347499, 0.0976102, 0.860482, -0.0447513, 0.347554, 0.111104, 0.860719, -0.0504775, 0.347614, 0.125479, 0.860998, -0.0563577, 0.347666, 0.140703, 0.861322, -0.0619473, 0.347662, 0.156681, 0.861724, -0.0681277, 0.347684, 0.173597, 0.862198, -0.0746567, 0.347709, 0.191371, 0.862733, -0.0815234, 0.347727, 0.209976, 0.863371, -0.0886643, 0.347744, 0.229351, 0.86414, -0.0957908, 0.347734, 0.24934, 0.865138, -0.102912, 0.34772, 0.269797, 0.866182, -0.110924, 0.3478, 0.290654, 0.867436, -0.119223, 0.347911, 0.312074, 0.869087, -0.126197, 0.347649, 0.335438, 0.870859, -0.133145, 0.347222, 0.359732, 0.872997, -0.139869, 0.346645, 0.38467, 0.875939, -0.146089, 0.345935, 0.41019, 0.879012, -0.152334, 0.345012, 0.436218, 0.883353, -0.15821, 0.343924, 0.462641, 0.888362, -0.164097, 0.342636, 0.489449, 0.895026, -0.169528, 0.341351, 0.516629, 0.900753, -0.174408, 0.339115, 0.544109, 0.906814, -0.17751, 0.335809, 0.572857, 0.912855, -0.180101, 0.331597, 0.601554, 0.919438, -0.182116, 0.32698, 0.630198, 0.925962, -0.183494, 0.321449, 0.658404, 0.931734, -0.184159, 0.314595, 0.686625, 0.93762, -0.18304, 0.306462, 0.71531, 0.943858, -0.181323, 0.297514, 0.744272, 0.948662, -0.178683, 0.287447, 0.771462, 0.953299, -0.175379, 0.276166, 0.798593, 0.957346, -0.170395, 0.263758, 0.8256, 0.962565, -0.165042, 0.251019, 0.852575, 0.966075, -0.158655, 0.237011, 0.878316, 0.969048, -0.151707, 0.222518, 0.90329, 0.972423, -0.143271, 0.207848, 0.927745, 0.975833, -0.134824, 0.192463, 0.950859, 0.977629, -0.125444, 0.1768, 0.972947, 0.978995, -0.114949, 0.161033, 0.993263, 0.980533, -0.104936, 0.145523, 1.01337, 0.980745, -0.0935577, 0.129799, 1.03128, 0.981814, -0.0822956, 0.113486, 1.04825, 0.983943, -0.0710082, 0.0972925, 1.06405, 0.986141, -0.0587931, 0.0808138, 1.0785, 0.988878, -0.0472755, 0.0644915, 1.09204, 0.992132, -0.0349128, 0.0478128, 1.10413, 0.9953, -0.0232407, 0.031621, 1.11527, 0.998117, -0.0112713, 0.0154935, 1.12551, 1.00003, 0.000339743, -0.000195763, 1.13504, 0.845441, -7.29126e-06, 0.364305, 1.69208e-05, 0.843588, -0.000183164, 0.363506, 0.000425067, 0.843412, -0.00073253, 0.36343, 0.00169999, 0.843401, -0.00164818, 0.363426, 0.00382495, 0.843399, -0.00293008, 0.363425, 0.00679993, 0.843401, -0.00457822, 0.363425, 0.010625, 0.843394, -0.00659249, 0.363421, 0.0153002, 0.843398, -0.00897282, 0.363421, 0.0208258, 0.843415, -0.0117191, 0.363426, 0.0272024, 0.843438, -0.0148312, 0.363432, 0.0344305, 0.843483, -0.018309, 0.363447, 0.0425116, 0.84356, -0.0221521, 0.363472, 0.0514471, 0.843646, -0.0263597, 0.363499, 0.061238, 0.843743, -0.0309315, 0.363527, 0.0718873, 0.84388, -0.0358658, 0.363569, 0.0833969, 0.844079, -0.0411624, 0.363631, 0.0957742, 0.844279, -0.0468128, 0.363688, 0.109015, 0.844549, -0.0527923, 0.363761, 0.123124, 0.844858, -0.0588204, 0.363817, 0.138044, 0.84522, -0.0647573, 0.36383, 0.153755, 0.845669, -0.0713181, 0.363879, 0.170394, 0.846155, -0.0781697, 0.363908, 0.187861, 0.846789, -0.0853913, 0.363969, 0.206176, 0.847502, -0.0928086, 0.363999, 0.225244, 0.8484, -0.10005, 0.363997, 0.244926, 0.849461, -0.107615, 0.364008, 0.265188, 0.850562, -0.115814, 0.364055, 0.28587, 0.851962, -0.124334, 0.364179, 0.306926, 0.854326, -0.131995, 0.364233, 0.329605, 0.856295, -0.139338, 0.363856, 0.35359, 0.858857, -0.146346, 0.363347, 0.37831, 0.862428, -0.152994, 0.362807, 0.403722, 0.866203, -0.159463, 0.361963, 0.429537, 0.871629, -0.165623, 0.36112, 0.456, 0.877365, -0.171649, 0.359917, 0.482773, 0.883744, -0.177151, 0.35848, 0.509705, 0.890693, -0.182381, 0.356523, 0.537215, 0.897278, -0.186076, 0.3533, 0.565493, 0.903958, -0.188602, 0.349095, 0.594293, 0.910908, -0.190755, 0.344215, 0.623165, 0.918117, -0.192063, 0.338606, 0.651573, 0.924644, -0.192758, 0.331544, 0.679869, 0.931054, -0.192238, 0.323163, 0.708668, 0.937303, -0.190035, 0.313529, 0.737201, 0.943387, -0.187162, 0.303152, 0.764977, 0.948494, -0.183876, 0.29146, 0.792683, 0.952546, -0.178901, 0.277917, 0.819228, 0.958077, -0.173173, 0.264753, 0.846559, 0.962462, -0.16645, 0.25002, 0.872962, 0.966569, -0.159452, 0.234873, 0.898729, 0.969108, -0.15074, 0.218752, 0.923126, 0.973072, -0.141523, 0.202673, 0.947278, 0.975452, -0.132075, 0.186326, 0.969938, 0.977784, -0.121257, 0.169396, 0.991325, 0.97899, -0.110182, 0.153044, 1.01123, 0.979777, -0.0989634, 0.136485, 1.0299, 0.980865, -0.0865894, 0.119343, 1.04727, 0.982432, -0.0746115, 0.102452, 1.06341, 0.984935, -0.0621822, 0.0852423, 1.07834, 0.987776, -0.0495694, 0.0678546, 1.092, 0.99103, -0.0372386, 0.0506917, 1.1043, 0.99474, -0.0244353, 0.0333316, 1.11576, 0.997768, -0.0121448, 0.0164348, 1.12617, 1.00003, 0.00031774, -0.000169504, 1.13598, 0.825551, -7.56799e-06, 0.378425, 1.65099e-05, 0.82664, -0.000190922, 0.378923, 0.000416504, 0.826323, -0.000763495, 0.378779, 0.0016656, 0.826359, -0.00171789, 0.378795, 0.00374768, 0.82636, -0.00305402, 0.378795, 0.00666259, 0.826368, -0.00477185, 0.378798, 0.0104104, 0.826364, -0.00687131, 0.378795, 0.0149912, 0.826368, -0.00935232, 0.378795, 0.0204054, 0.826376, -0.0122146, 0.378797, 0.0266532, 0.826399, -0.0154581, 0.378803, 0.0337355, 0.82646, -0.0190825, 0.378824, 0.0416537, 0.826525, -0.0230873, 0.378846, 0.0504091, 0.826614, -0.0274719, 0.378876, 0.0600032, 0.82674, -0.0322355, 0.378917, 0.0704393, 0.826888, -0.0373766, 0.378964, 0.0817195, 0.827078, -0.0428936, 0.379024, 0.0938492, 0.827318, -0.0487778, 0.379099, 0.106828, 0.82764, -0.0549935, 0.379199, 0.120659, 0.827926, -0.0611058, 0.379227, 0.13526, 0.828325, -0.0675054, 0.379275, 0.150713, 0.828801, -0.0743455, 0.379332, 0.167034, 0.8294, -0.0815523, 0.379415, 0.184209, 0.830094, -0.0890779, 0.379495, 0.202203, 0.8309, -0.096736, 0.379555, 0.220945, 0.831943, -0.104135, 0.379577, 0.240306, 0.833037, -0.112106, 0.379604, 0.260317, 0.834278, -0.120554, 0.379668, 0.2808, 0.836192, -0.129128, 0.3799, 0.301654, 0.838671, -0.137541, 0.380109, 0.323502, 0.840939, -0.14523, 0.379809, 0.347176, 0.844575, -0.15248, 0.379593, 0.371706, 0.848379, -0.159607, 0.37909, 0.39688, 0.853616, -0.166267, 0.378617, 0.422702, 0.858921, -0.172698, 0.377746, 0.448919, 0.865324, -0.178823, 0.376749, 0.475661, 0.872207, -0.184542, 0.375363, 0.502599, 0.880018, -0.189836, 0.373657, 0.529914, 0.88694, -0.194294, 0.370673, 0.557683, 0.894779, -0.197022, 0.36662, 0.586848, 0.902242, -0.199108, 0.36138, 0.615831, 0.909914, -0.200398, 0.355434, 0.644478, 0.917088, -0.20094, 0.348173, 0.672905, 0.923888, -0.200671, 0.339482, 0.701327, 0.930495, -0.198773, 0.32956, 0.730101, 0.937247, -0.195394, 0.318363, 0.758383, 0.943108, -0.191956, 0.306323, 0.786539, 0.948296, -0.187227, 0.292576, 0.813637, 0.953472, -0.181165, 0.278234, 0.840793, 0.958485, -0.174119, 0.263054, 0.867712, 0.962714, -0.166564, 0.246756, 0.893635, 0.966185, -0.158181, 0.229945, 0.919028, 0.970146, -0.148275, 0.212633, 0.943413, 0.973491, -0.138157, 0.195229, 0.966627, 0.975741, -0.127574, 0.178048, 0.988817, 0.977238, -0.11554, 0.160312, 1.00924, 0.978411, -0.10364, 0.142857, 1.02845, 0.979811, -0.0913122, 0.125317, 1.04648, 0.98116, -0.0782558, 0.107627, 1.06284, 0.983543, -0.0655957, 0.0895862, 1.07798, 0.986789, -0.0520411, 0.0713756, 1.092, 0.990292, -0.0389727, 0.053228, 1.10484, 0.994187, -0.025808, 0.0351945, 1.11642, 0.997499, -0.0126071, 0.0173198, 1.12703, 0.999999, 0.000275604, -0.000148602, 1.13674, 0.81075, -7.8735e-06, 0.394456, 1.61829e-05, 0.808692, -0.000198293, 0.393453, 0.000407564, 0.80846, -0.000792877, 0.39334, 0.00162965, 0.808595, -0.00178416, 0.393407, 0.00366711, 0.808597, -0.00317182, 0.393408, 0.00651934, 0.808598, -0.00495589, 0.393408, 0.0101866, 0.808591, -0.00713627, 0.393403, 0.0146689, 0.808592, -0.00971285, 0.393402, 0.0199667, 0.80861, -0.0126855, 0.393407, 0.0260803, 0.808633, -0.0160538, 0.393413, 0.0330107, 0.80868, -0.0198175, 0.393429, 0.0407589, 0.808748, -0.0239758, 0.393453, 0.0493264, 0.808854, -0.0285286, 0.39349, 0.0587161, 0.808992, -0.0334748, 0.39354, 0.0689304, 0.809141, -0.0388116, 0.393588, 0.0799707, 0.809352, -0.0445375, 0.39366, 0.0918432, 0.809608, -0.0506427, 0.393742, 0.104549, 0.809915, -0.0570708, 0.393834, 0.118085, 0.810253, -0.0633526, 0.393885, 0.132377, 0.810687, -0.0700966, 0.393953, 0.147537, 0.811233, -0.0772274, 0.394047, 0.163543, 0.811865, -0.0847629, 0.394148, 0.180394, 0.812648, -0.0925663, 0.394265, 0.198051, 0.813583, -0.100416, 0.394363, 0.216443, 0.814683, -0.108119, 0.394402, 0.235502, 0.815948, -0.11644, 0.394489, 0.255242, 0.817278, -0.125036, 0.394542, 0.275441, 0.819605, -0.133655, 0.39486, 0.296094, 0.822256, -0.142682, 0.395248, 0.317309, 0.825349, -0.150756, 0.395241, 0.340516, 0.829605, -0.158392, 0.395285, 0.364819, 0.83391, -0.165801, 0.394922, 0.389736, 0.839808, -0.172677, 0.394691, 0.415409, 0.845708, -0.179448, 0.394006, 0.441546, 0.853025, -0.185746, 0.393279, 0.46832, 0.859666, -0.191684, 0.391655, 0.495302, 0.86789, -0.197146, 0.390068, 0.52262, 0.875845, -0.201904, 0.38727, 0.550336, 0.882634, -0.205023, 0.382688, 0.578825, 0.891076, -0.207098, 0.377543, 0.608103, 0.900589, -0.208474, 0.371752, 0.63723, 0.90791, -0.209068, 0.364016, 0.665769, 0.915971, -0.208655, 0.355593, 0.694428, 0.923455, -0.20729, 0.345439, 0.723224, 0.931514, -0.203821, 0.334099, 0.751925, 0.937885, -0.19986, 0.321069, 0.780249, 0.943136, -0.194993, 0.306571, 0.8077, 0.948818, -0.189132, 0.291556, 0.83497, 0.954433, -0.181617, 0.275745, 0.86188, 0.959078, -0.173595, 0.258695, 0.888562, 0.962705, -0.164855, 0.240825, 0.914008, 0.966753, -0.155129, 0.22268, 0.939145, 0.970704, -0.144241, 0.204542, 0.963393, 0.973367, -0.133188, 0.185927, 0.985983, 0.975984, -0.121146, 0.167743, 1.00704, 0.976994, -0.108366, 0.149218, 1.02715, 0.978485, -0.0956746, 0.13131, 1.0455, 0.980074, -0.0820733, 0.112513, 1.06221, 0.98225, -0.0684061, 0.0938323, 1.07782, 0.98553, -0.0549503, 0.0749508, 1.09199, 0.989529, -0.0407857, 0.055848, 1.10508, 0.993536, -0.0271978, 0.0368581, 1.11684, 0.997247, -0.0132716, 0.0181845, 1.12789, 1, 0.000431817, -0.000198809, 1.13792, 0.785886, -8.12608e-06, 0.405036, 1.57669e-05, 0.790388, -0.000205278, 0.407355, 0.000398297, 0.790145, -0.000820824, 0.407231, 0.00159263, 0.790135, -0.00184681, 0.407226, 0.00358336, 0.790119, -0.00328316, 0.407218, 0.00637039, 0.790126, -0.00512988, 0.40722, 0.0099539, 0.79013, -0.00738684, 0.407221, 0.0143339, 0.790135, -0.0100538, 0.407221, 0.0195107, 0.790134, -0.0131306, 0.407217, 0.0254848, 0.79016, -0.0166169, 0.407224, 0.0322572, 0.790197, -0.020512, 0.407236, 0.0398284, 0.790273, -0.0248157, 0.407263, 0.0482014, 0.790381, -0.029527, 0.407304, 0.0573777, 0.790521, -0.0346446, 0.407355, 0.0673602, 0.790704, -0.0401665, 0.40742, 0.0781522, 0.790925, -0.0460896, 0.407499, 0.0897582, 0.791195, -0.0524017, 0.407589, 0.10218, 0.791522, -0.0590121, 0.407691, 0.11541, 0.791878, -0.0654876, 0.407748, 0.12939, 0.792361, -0.0725207, 0.407849, 0.144237, 0.792942, -0.0799844, 0.407963, 0.159924, 0.79362, -0.0877896, 0.408087, 0.176425, 0.794529, -0.0958451, 0.408259, 0.193733, 0.795521, -0.103827, 0.408362, 0.211756, 0.796778, -0.111937, 0.408482, 0.230524, 0.798027, -0.120521, 0.408547, 0.249967, 0.799813, -0.129242, 0.408721, 0.269926, 0.802387, -0.138048, 0.409148, 0.290338, 0.805279, -0.147301, 0.409641, 0.311193, 0.809251, -0.155895, 0.410154, 0.333611, 0.813733, -0.163942, 0.410297, 0.357615, 0.819081, -0.171666, 0.410373, 0.382339, 0.825427, -0.178905, 0.410348, 0.407828, 0.83172, -0.185812, 0.409486, 0.434034, 0.83877, -0.192318, 0.408776, 0.460493, 0.845817, -0.198249, 0.407176, 0.487346, 0.854664, -0.204034, 0.405719, 0.514832, 0.863495, -0.208908, 0.403282, 0.542401, 0.871883, -0.212765, 0.399293, 0.570683, 0.88065, -0.214911, 0.393803, 0.599947, 0.89004, -0.216214, 0.387536, 0.62932, 0.898476, -0.216745, 0.379846, 0.658319, 0.906738, -0.216387, 0.370625, 0.687138, 0.914844, -0.215053, 0.360139, 0.71601, 0.923877, -0.212007, 0.348849, 0.745124, 0.931925, -0.207481, 0.335639, 0.773366, 0.938054, -0.202418, 0.320798, 0.801636, 0.943895, -0.196507, 0.304772, 0.829055, 0.949468, -0.189009, 0.288033, 0.856097, 0.955152, -0.180539, 0.270532, 0.88301, 0.959403, -0.171437, 0.251639, 0.909296, 0.963309, -0.161661, 0.232563, 0.934868, 0.967399, -0.150425, 0.213231, 0.959662, 0.972009, -0.138659, 0.194247, 0.98302, 0.97433, -0.126595, 0.174718, 1.00517, 0.975823, -0.113205, 0.155518, 1.02566, 0.976371, -0.0996096, 0.136709, 1.04418, 0.978705, -0.0860754, 0.117571, 1.06146, 0.981477, -0.0714438, 0.0980046, 1.07777, 0.984263, -0.0572304, 0.0782181, 1.09214, 0.988423, -0.0428875, 0.0584052, 1.10553, 0.993, -0.0282442, 0.038522, 1.11758, 0.99704, -0.0140183, 0.0190148, 1.12864, 0.999913, 0.000369494, -0.000145203, 1.13901, 0.777662, -8.4153e-06, 0.423844, 1.54403e-05, 0.770458, -0.000211714, 0.419915, 0.00038845, 0.770716, -0.000846888, 0.420055, 0.00155386, 0.770982, -0.00190567, 0.420202, 0.00349653, 0.770981, -0.00338782, 0.420201, 0.00621606, 0.77098, -0.00529338, 0.4202, 0.00971274, 0.770983, -0.00762223, 0.4202, 0.0139867, 0.770985, -0.0103741, 0.420198, 0.0190381, 0.770996, -0.0135489, 0.4202, 0.0248677, 0.771029, -0.0171461, 0.420212, 0.0314764, 0.771052, -0.0211647, 0.420215, 0.0388648, 0.771131, -0.0256048, 0.420245, 0.047036, 0.771235, -0.0304647, 0.420284, 0.0559911, 0.771383, -0.0357436, 0.420341, 0.0657346, 0.771591, -0.0414392, 0.420423, 0.0762694, 0.771819, -0.0475462, 0.420506, 0.0875984, 0.772123, -0.0540506, 0.420617, 0.099727, 0.772464, -0.060797, 0.42072, 0.112637, 0.772855, -0.0675393, 0.420799, 0.126313, 0.773317, -0.0748323, 0.420893, 0.140824, 0.773981, -0.0825681, 0.421058, 0.15617, 0.774746, -0.0906307, 0.421226, 0.172322, 0.77566, -0.0988982, 0.421397, 0.189253, 0.776837, -0.106994, 0.421569, 0.206912, 0.778097, -0.115528, 0.421704, 0.225359, 0.779588, -0.124317, 0.421849, 0.24447, 0.781574, -0.133139, 0.422097, 0.264156, 0.784451, -0.142179, 0.422615, 0.284318, 0.787682, -0.15165, 0.423269, 0.304902, 0.792433, -0.160771, 0.424396, 0.3265, 0.797359, -0.169166, 0.424772, 0.35014, 0.803986, -0.177149, 0.425475, 0.374768, 0.809504, -0.184745, 0.424996, 0.399928, 0.815885, -0.19173, 0.424247, 0.425796, 0.823513, -0.198525, 0.423515, 0.452287, 0.832549, -0.204709, 0.422787, 0.479321, 0.841653, -0.210447, 0.421187, 0.506718, 0.850401, -0.215501, 0.418519, 0.53432, 0.859854, -0.219752, 0.414715, 0.56242, 0.869364, -0.222305, 0.409462, 0.591558, 0.878837, -0.223744, 0.402926, 0.621074, 0.888636, -0.224065, 0.395043, 0.650538, 0.898132, -0.223742, 0.38564, 0.679538, 0.907181, -0.222308, 0.375378, 0.708674, 0.915621, -0.219837, 0.363212, 0.737714, 0.9239, -0.215233, 0.349313, 0.767014, 0.931644, -0.209592, 0.334162, 0.795133, 0.938887, -0.203644, 0.317943, 0.823228, 0.945282, -0.196349, 0.300581, 0.850822, 0.950758, -0.18742, 0.282195, 0.877594, 0.956146, -0.177879, 0.262481, 0.904564, 0.960355, -0.167643, 0.242487, 0.930741, 0.965256, -0.156671, 0.222668, 0.955868, 0.968029, -0.144123, 0.201907, 0.979869, 0.97251, -0.131305, 0.18202, 1.00291, 0.974925, -0.118335, 0.161909, 1.02392, 0.975402, -0.103714, 0.142129, 1.0433, 0.976987, -0.089415, 0.122447, 1.06089, 0.979677, -0.0748858, 0.102248, 1.07713, 0.983184, -0.0596086, 0.0814851, 1.09218, 0.987466, -0.0447671, 0.0609484, 1.10585, 0.992348, -0.0295217, 0.0401835, 1.11829, 0.996674, -0.0143917, 0.0198163, 1.12966, 1.00003, 0.000321364, -0.000149983, 1.1402, 0.757901, -8.69074e-06, 0.436176, 1.51011e-05, 0.751195, -0.000217848, 0.432317, 0.000378533, 0.751178, -0.000871373, 0.432307, 0.0015141, 0.751195, -0.00196061, 0.432317, 0.0034068, 0.751198, -0.00348552, 0.432318, 0.00605659, 0.751195, -0.00544599, 0.432315, 0.00946353, 0.751207, -0.00784203, 0.43232, 0.013628, 0.751213, -0.0106732, 0.43232, 0.0185499, 0.751221, -0.0139393, 0.432319, 0.0242302, 0.751244, -0.0176398, 0.432325, 0.0306694, 0.7513, -0.0217743, 0.432348, 0.0378698, 0.751358, -0.0263412, 0.432367, 0.0458321, 0.751458, -0.0313396, 0.432404, 0.0545587, 0.751608, -0.0367682, 0.432464, 0.0640543, 0.7518, -0.0426246, 0.43254, 0.0743222, 0.752065, -0.0489031, 0.432645, 0.0853668, 0.752376, -0.0555828, 0.432762, 0.0971911, 0.752715, -0.0623861, 0.432859, 0.109768, 0.753137, -0.069415, 0.432958, 0.123126, 0.753676, -0.0770039, 0.433099, 0.137308, 0.754345, -0.084971, 0.433272, 0.15229, 0.755235, -0.0932681, 0.433504, 0.168075, 0.756186, -0.10171, 0.433693, 0.184625, 0.757363, -0.110019, 0.433857, 0.201897, 0.75884, -0.11887, 0.434102, 0.220014, 0.760467, -0.127881, 0.434306, 0.238778, 0.762969, -0.136766, 0.434751, 0.258172, 0.765823, -0.14612, 0.43529, 0.278062, 0.769676, -0.15566, 0.436236, 0.298437, 0.774909, -0.165177, 0.437754, 0.319532, 0.77994, -0.17402, 0.438343, 0.342505, 0.785757, -0.182201, 0.438609, 0.366693, 0.792487, -0.190104, 0.438762, 0.391668, 0.80038, -0.197438, 0.438795, 0.417494, 0.808494, -0.204365, 0.438226, 0.443933, 0.817695, -0.210714, 0.437283, 0.470929, 0.828111, -0.216651, 0.436087, 0.498569, 0.837901, -0.221804, 0.433717, 0.526165, 0.847813, -0.226318, 0.430133, 0.554155, 0.858314, -0.229297, 0.425213, 0.582822, 0.868891, -0.230999, 0.418576, 0.612847, 0.878941, -0.231155, 0.410405, 0.642445, 0.888809, -0.230935, 0.400544, 0.672024, 0.898089, -0.229343, 0.389613, 0.701366, 0.908081, -0.226886, 0.377197, 0.730763, 0.916819, -0.222676, 0.363397, 0.759642, 0.924968, -0.216835, 0.347437, 0.788775, 0.932906, -0.210245, 0.32995, 0.817135, 0.940025, -0.202992, 0.312262, 0.844912, 0.946101, -0.19436, 0.293313, 0.872164, 0.952835, -0.184125, 0.273638, 0.899443, 0.957347, -0.173657, 0.252385, 0.926389, 0.961434, -0.162204, 0.231038, 0.951947, 0.965522, -0.14979, 0.209834, 0.976751, 0.969412, -0.136307, 0.188821, 1.00022, 0.973902, -0.122527, 0.168013, 1.02229, 0.974045, -0.108213, 0.147634, 1.04199, 0.975775, -0.0927397, 0.12705, 1.06019, 0.978383, -0.0778212, 0.106309, 1.07711, 0.98211, -0.0621216, 0.0849279, 1.09245, 0.986517, -0.0463847, 0.0633519, 1.10651, 0.991696, -0.0309353, 0.0419698, 1.11903, 0.996349, -0.0150914, 0.0206272, 1.13073, 1.00003, 0.000442449, -0.000231396, 1.14146, 0.727498, -8.85074e-06, 0.441528, 1.45832e-05, 0.730897, -0.000223525, 0.443589, 0.000368298, 0.730796, -0.000893996, 0.443528, 0.00147303, 0.730805, -0.00201149, 0.443533, 0.00331433, 0.730814, -0.00357596, 0.443538, 0.00589222, 0.730815, -0.00558734, 0.443538, 0.00920678, 0.730822, -0.00804544, 0.44354, 0.0132582, 0.730836, -0.0109501, 0.443545, 0.0180468, 0.730848, -0.0143008, 0.443546, 0.0235732, 0.730871, -0.0180969, 0.443552, 0.0298382, 0.730915, -0.022338, 0.443567, 0.0368438, 0.730982, -0.0270225, 0.443591, 0.044591, 0.731076, -0.0321491, 0.443627, 0.0530831, 0.731245, -0.0377166, 0.443699, 0.0623243, 0.73144, -0.0437216, 0.443777, 0.0723181, 0.7317, -0.0501576, 0.443881, 0.0830691, 0.732034, -0.0569942, 0.444014, 0.0945809, 0.732388, -0.0638756, 0.444113, 0.106825, 0.732853, -0.071203, 0.444247, 0.119859, 0.733473, -0.0790076, 0.444442, 0.13369, 0.734195, -0.0871937, 0.444645, 0.148304, 0.735069, -0.095696, 0.444877, 0.163702, 0.736169, -0.10426, 0.445133, 0.179861, 0.73747, -0.112853, 0.44537, 0.196778, 0.738991, -0.12199, 0.445651, 0.214496, 0.740865, -0.131153, 0.445958, 0.232913, 0.743637, -0.140245, 0.446548, 0.251977, 0.746797, -0.149722, 0.447246, 0.271551, 0.751517, -0.159341, 0.448656, 0.291774, 0.756156, -0.169106, 0.449866, 0.312455, 0.761519, -0.178436, 0.450919, 0.334552, 0.768295, -0.186904, 0.451776, 0.358491, 0.776613, -0.195117, 0.452832, 0.383446, 0.783966, -0.202695, 0.45249, 0.408945, 0.793542, -0.20985, 0.452587, 0.435364, 0.803192, -0.216403, 0.451852, 0.462336, 0.813892, -0.22251, 0.450708, 0.48987, 0.824968, -0.227676, 0.4486, 0.517697, 0.835859, -0.232443, 0.445156, 0.545975, 0.846825, -0.235775, 0.440351, 0.574483, 0.858085, -0.237897, 0.433641, 0.604246, 0.868825, -0.238074, 0.425354, 0.634101, 0.879638, -0.237661, 0.415383, 0.664201, 0.889966, -0.236186, 0.404136, 0.693918, 0.899479, -0.233599, 0.390917, 0.723481, 0.908769, -0.229737, 0.376352, 0.75258, 0.917966, -0.223836, 0.360372, 0.781764, 0.926304, -0.217067, 0.342551, 0.811139, 0.934626, -0.209309, 0.324238, 0.839585, 0.941841, -0.20071, 0.304484, 0.867044, 0.94789, -0.190602, 0.283607, 0.894579, 0.954196, -0.179253, 0.262205, 0.921743, 0.958383, -0.167646, 0.239847, 0.948026, 0.963119, -0.155073, 0.218078, 0.973296, 0.966941, -0.141426, 0.195899, 0.998135, 0.970836, -0.126849, 0.174121, 1.02021, 0.973301, -0.112296, 0.153052, 1.04085, 0.97448, -0.0964965, 0.131733, 1.05946, 0.977045, -0.080489, 0.10997, 1.07693, 0.980751, -0.064844, 0.0881657, 1.09254, 0.985475, -0.0481938, 0.0657987, 1.10697, 0.991089, -0.0319185, 0.0435215, 1.12004, 0.996122, -0.0158088, 0.0214779, 1.13173, 1.00001, 0.000372455, -0.000200295, 1.14291, 0.708622, -9.07597e-06, 0.45304, 1.41962e-05, 0.711162, -0.000228911, 0.454662, 0.000358052, 0.709812, -0.000914446, 0.453797, 0.00143034, 0.709865, -0.00205819, 0.453834, 0.00321935, 0.709864, -0.00365894, 0.453833, 0.00572331, 0.709855, -0.00571692, 0.453826, 0.00894278, 0.709862, -0.00823201, 0.453828, 0.012878, 0.709875, -0.011204, 0.453832, 0.0175295, 0.709896, -0.0146323, 0.453839, 0.0228978, 0.709925, -0.0185163, 0.453847, 0.0289839, 0.709974, -0.0228551, 0.453866, 0.0357894, 0.710045, -0.0276473, 0.453892, 0.0433161, 0.710133, -0.032891, 0.453924, 0.0515665, 0.710292, -0.0385851, 0.453992, 0.0605458, 0.710485, -0.0447254, 0.45407, 0.0702574, 0.710769, -0.0513051, 0.454192, 0.0807077, 0.711106, -0.0582733, 0.454329, 0.091896, 0.711516, -0.0652866, 0.45446, 0.103814, 0.712071, -0.0728426, 0.454653, 0.116508, 0.712676, -0.0808307, 0.45484, 0.129968, 0.713476, -0.0892216, 0.455096, 0.144206, 0.714377, -0.0979047, 0.455346, 0.159212, 0.715579, -0.106531, 0.455647, 0.174973, 0.716977, -0.115492, 0.455961, 0.191504, 0.71862, -0.124821, 0.456315, 0.208835, 0.72084, -0.134079, 0.4568, 0.226869, 0.723786, -0.143427, 0.457521, 0.245582, 0.727464, -0.153061, 0.458475, 0.264957, 0.732771, -0.162768, 0.460239, 0.284948, 0.736515, -0.172627, 0.460899, 0.30522, 0.743519, -0.182487, 0.463225, 0.326717, 0.750041, -0.191295, 0.464027, 0.350113, 0.758589, -0.199746, 0.465227, 0.374782, 0.767703, -0.207584, 0.465877, 0.400226, 0.777484, -0.214973, 0.465996, 0.426442, 0.788792, -0.221796, 0.466019, 0.453688, 0.800194, -0.228038, 0.465083, 0.481246, 0.811234, -0.233346, 0.462506, 0.509086, 0.822859, -0.238073, 0.459257, 0.537338, 0.835082, -0.241764, 0.454863, 0.566108, 0.846332, -0.244241, 0.448163, 0.595126, 0.858355, -0.244736, 0.439709, 0.625574, 0.87034, -0.244278, 0.429837, 0.65617, 0.881027, -0.24255, 0.418002, 0.686029, 0.891007, -0.239912, 0.404325, 0.716039, 0.900874, -0.236133, 0.389222, 0.745518, 0.911072, -0.230672, 0.373269, 0.775026, 0.920359, -0.22356, 0.355083, 0.804521, 0.928604, -0.215591, 0.335533, 0.834045, 0.937175, -0.206503, 0.315278, 0.861612, 0.942825, -0.196684, 0.293653, 0.889131, 0.949805, -0.185116, 0.271503, 0.916853, 0.955535, -0.172703, 0.248821, 0.943541, 0.959843, -0.159978, 0.225591, 0.970132, 0.964393, -0.146375, 0.202719, 0.994709, 0.968008, -0.131269, 0.179928, 1.0186, 0.971013, -0.11569, 0.158007, 1.03928, 0.973334, -0.1003, 0.13624, 1.05887, 0.975775, -0.0833352, 0.1138, 1.07652, 0.979579, -0.0668981, 0.0913141, 1.09297, 0.984323, -0.0500902, 0.0683051, 1.10734, 0.990351, -0.0332377, 0.0451771, 1.12084, 0.995823, -0.0161491, 0.0221705, 1.13296, 1.0001, 0.000234083, -0.000108712, 1.14441, 0.683895, -9.24677e-06, 0.46015, 1.37429e-05, 0.68833, -0.000233383, 0.463134, 0.000346865, 0.688368, -0.000933547, 0.463159, 0.00138748, 0.688367, -0.00210049, 0.463159, 0.00312187, 0.688369, -0.00373415, 0.463159, 0.00555004, 0.688377, -0.00583449, 0.463163, 0.00867216, 0.688386, -0.00840128, 0.463166, 0.0124884, 0.688398, -0.0114343, 0.463169, 0.0169993, 0.688418, -0.0149329, 0.463175, 0.0222054, 0.688453, -0.0188964, 0.463188, 0.028108, 0.688515, -0.0233239, 0.463214, 0.0347085, 0.68857, -0.0282136, 0.463231, 0.0420091, 0.688679, -0.033564, 0.463276, 0.0500132, 0.688854, -0.0393733, 0.463356, 0.0587255, 0.689038, -0.0456354, 0.46343, 0.0681476, 0.689321, -0.0523433, 0.463553, 0.0782897, 0.689662, -0.059412, 0.463693, 0.0891501, 0.690188, -0.0665736, 0.4639, 0.100735, 0.690755, -0.0743106, 0.464107, 0.113074, 0.691405, -0.0824722, 0.464329, 0.126161, 0.692198, -0.0910484, 0.464585, 0.140007, 0.693196, -0.0998778, 0.464893, 0.154612, 0.69454, -0.108651, 0.465285, 0.169984, 0.695921, -0.117855, 0.465596, 0.186106, 0.697749, -0.12734, 0.466056, 0.203034, 0.700375, -0.136714, 0.466771, 0.220703, 0.703395, -0.146386, 0.467579, 0.239062, 0.707904, -0.156096, 0.469067, 0.258188, 0.711673, -0.165904, 0.469851, 0.277759, 0.717489, -0.175812, 0.471815, 0.297935, 0.724051, -0.185931, 0.47389, 0.318916, 0.731965, -0.195238, 0.47587, 0.341591, 0.741151, -0.204021, 0.477523, 0.366062, 0.751416, -0.212113, 0.478881, 0.391396, 0.761848, -0.21979, 0.479226, 0.417599, 0.771886, -0.2267, 0.478495, 0.444401, 0.783998, -0.232991, 0.477622, 0.472084, 0.796523, -0.238645, 0.475833, 0.500193, 0.808851, -0.243396, 0.472568, 0.52865, 0.821191, -0.247226, 0.467857, 0.557362, 0.834261, -0.250102, 0.461871, 0.586768, 0.846762, -0.251056, 0.453543, 0.617085, 0.859867, -0.250604, 0.443494, 0.647659, 0.871948, -0.248783, 0.431711, 0.678119, 0.882967, -0.245855, 0.417911, 0.708399, 0.892826, -0.242168, 0.401993, 0.738256, 0.90332, -0.237062, 0.385371, 0.767999, 0.913633, -0.22997, 0.366837, 0.798191, 0.922774, -0.221687, 0.346372, 0.827756, 0.931371, -0.212345, 0.325682, 0.856425, 0.938929, -0.20206, 0.303665, 0.884299, 0.944821, -0.190981, 0.280786, 0.912023, 0.951792, -0.178065, 0.2573, 0.939669, 0.957712, -0.164634, 0.233448, 0.96655, 0.961912, -0.150863, 0.209504, 0.992366, 0.966382, -0.13577, 0.18597, 1.01633, 0.969588, -0.119593, 0.162905, 1.03843, 0.971777, -0.103203, 0.14053, 1.05841, 0.97433, -0.0865888, 0.117909, 1.07632, 0.978686, -0.0690829, 0.0944101, 1.09326, 0.983281, -0.0516568, 0.0705671, 1.10796, 0.989562, -0.034558, 0.0468592, 1.12182, 0.995465, -0.0167808, 0.0229846, 1.1342, 0.999991, 0.000373016, -0.000235606, 1.1459, 0.662251, -9.39016e-06, 0.468575, 1.32714e-05, 0.666634, -0.000237624, 0.471675, 0.000335842, 0.666411, -0.000950385, 0.471516, 0.00134321, 0.666399, -0.00213833, 0.471509, 0.00302221, 0.666386, -0.0038014, 0.471499, 0.00537283, 0.666405, -0.00593958, 0.471511, 0.00839533, 0.666406, -0.00855253, 0.471508, 0.0120898, 0.666428, -0.0116401, 0.471519, 0.0164569, 0.666444, -0.0152015, 0.471522, 0.0214971, 0.66649, -0.0192362, 0.471543, 0.027212, 0.666537, -0.0237428, 0.471558, 0.033603, 0.666617, -0.0287198, 0.471591, 0.0406728, 0.666718, -0.0341647, 0.471631, 0.0484238, 0.666889, -0.0400759, 0.47171, 0.0568621, 0.667104, -0.0464479, 0.471805, 0.0659915, 0.667374, -0.0532677, 0.471923, 0.0758178, 0.667772, -0.0603805, 0.472098, 0.0863425, 0.668371, -0.0677392, 0.472363, 0.0975917, 0.668971, -0.0756028, 0.472596, 0.109567, 0.669696, -0.0839293, 0.472869, 0.122272, 0.670481, -0.0926683, 0.473126, 0.135718, 0.6715, -0.1016, 0.473442, 0.149914, 0.672911, -0.110566, 0.47389, 0.164882, 0.674512, -0.119984, 0.474354, 0.180602, 0.67651, -0.129574, 0.474922, 0.19711, 0.679292, -0.139106, 0.475764, 0.214371, 0.682798, -0.148993, 0.476886, 0.232405, 0.686955, -0.158737, 0.478179, 0.251153, 0.691406, -0.168754, 0.479432, 0.270436, 0.697438, -0.178703, 0.481481, 0.290374, 0.704761, -0.188955, 0.484143, 0.311044, 0.713599, -0.198814, 0.487007, 0.333003, 0.723194, -0.207869, 0.488962, 0.357144, 0.732601, -0.216189, 0.489815, 0.382169, 0.744193, -0.22398, 0.490888, 0.408227, 0.754907, -0.231156, 0.490355, 0.434928, 0.767403, -0.23747, 0.489548, 0.462599, 0.78107, -0.243503, 0.488274, 0.490908, 0.793893, -0.248114, 0.484843, 0.519421, 0.807296, -0.25222, 0.4803, 0.548561, 0.820529, -0.255265, 0.474097, 0.577772, 0.833716, -0.256741, 0.466041, 0.607782, 0.848403, -0.25637, 0.456547, 0.638807, 0.860755, -0.254804, 0.443946, 0.670058, 0.874012, -0.251834, 0.430852, 0.700749, 0.885619, -0.247867, 0.414903, 0.731446, 0.896069, -0.242634, 0.397276, 0.761191, 0.906266, -0.236093, 0.378535, 0.791053, 0.916759, -0.227543, 0.358038, 0.821298, 0.92523, -0.21783, 0.335705, 0.850747, 0.93436, -0.207534, 0.313797, 0.879258, 0.941631, -0.195983, 0.289671, 0.907734, 0.947564, -0.183567, 0.265319, 0.935206, 0.953681, -0.169345, 0.240815, 0.962739, 0.960008, -0.154909, 0.216119, 0.989227, 0.964145, -0.140161, 0.192096, 1.01465, 0.968171, -0.123411, 0.167855, 1.03737, 0.969859, -0.106525, 0.144817, 1.05767, 0.972666, -0.0891023, 0.12149, 1.0761, 0.977055, -0.0718094, 0.0975306, 1.09336, 0.982527, -0.0534213, 0.0730217, 1.10878, 0.989001, -0.0355579, 0.0483366, 1.12285, 0.99512, -0.0176383, 0.023938, 1.13548, 1.00007, 0.000368831, -0.000211581, 1.14744, 0.651047, -9.60845e-06, 0.484101, 1.2922e-05, 0.644145, -0.000241347, 0.478968, 0.000324578, 0.64396, -0.000965142, 0.478831, 0.00129798, 0.64396, -0.00217154, 0.47883, 0.00292046, 0.643968, -0.00386049, 0.478835, 0.00519202, 0.643974, -0.00603186, 0.478838, 0.0081128, 0.643977, -0.0086854, 0.478836, 0.011683, 0.643982, -0.0118207, 0.478834, 0.0159031, 0.644024, -0.0154374, 0.478856, 0.0207743, 0.644059, -0.0195343, 0.478868, 0.0262975, 0.644122, -0.0241103, 0.478896, 0.0324747, 0.644207, -0.0291638, 0.478933, 0.039309, 0.64432, -0.0346919, 0.478981, 0.0468029, 0.644481, -0.0406919, 0.479053, 0.0549614, 0.644722, -0.047159, 0.479169, 0.0637909, 0.645013, -0.0540748, 0.479302, 0.0732974, 0.645503, -0.0612001, 0.479541, 0.0834898, 0.646117, -0.0687303, 0.479829, 0.0943873, 0.646707, -0.0767846, 0.480061, 0.105991, 0.647431, -0.0852465, 0.480343, 0.11831, 0.64831, -0.0940719, 0.48066, 0.131348, 0.649486, -0.103056, 0.481083, 0.14514, 0.650864, -0.112261, 0.481528, 0.159676, 0.652604, -0.121852, 0.482102, 0.174979, 0.654825, -0.131505, 0.482813, 0.191079, 0.657876, -0.141189, 0.483876, 0.207927, 0.661339, -0.151239, 0.48499, 0.225586, 0.665463, -0.161091, 0.486279, 0.243947, 0.670542, -0.171235, 0.487968, 0.262957, 0.677361, -0.181347, 0.49053, 0.282781, 0.685672, -0.191679, 0.493862, 0.303311, 0.694551, -0.201781, 0.49699, 0.324607, 0.703753, -0.211164, 0.498884, 0.347916, 0.713703, -0.219675, 0.500086, 0.372628, 0.725911, -0.227836, 0.501554, 0.398694, 0.73862, -0.23533, 0.502193, 0.425529, 0.752118, -0.241786, 0.501811, 0.453209, 0.76579, -0.247865, 0.500185, 0.481381, 0.779568, -0.252696, 0.497159, 0.51011, 0.793991, -0.256802, 0.492765, 0.539322, 0.808182, -0.259942, 0.486827, 0.569078, 0.821698, -0.261703, 0.478386, 0.598818, 0.836009, -0.262006, 0.468772, 0.629762, 0.849824, -0.260333, 0.456352, 0.661366, 0.863888, -0.257398, 0.442533, 0.69295, 0.876585, -0.253264, 0.426573, 0.723608, 0.888665, -0.248026, 0.408964, 0.754378, 0.899537, -0.241487, 0.389677, 0.784761, 0.9094, -0.233463, 0.368516, 0.814688, 0.920166, -0.223397, 0.346624, 0.845009, 0.928899, -0.21255, 0.322717, 0.874431, 0.937156, -0.200869, 0.298698, 0.902922, 0.943861, -0.188387, 0.273491, 0.931356, 0.949557, -0.174341, 0.247866, 0.958854, 0.955862, -0.158994, 0.222496, 0.986098, 0.961721, -0.143664, 0.197522, 1.01229, 0.965976, -0.127412, 0.17302, 1.03571, 0.968652, -0.109798, 0.148954, 1.05699, 0.971084, -0.0916787, 0.125044, 1.07587, 0.975584, -0.0739634, 0.100577, 1.09372, 0.98122, -0.055322, 0.0753666, 1.10948, 0.988253, -0.0366825, 0.0498899, 1.12394, 0.99482, -0.0180389, 0.024611, 1.13694, 1.00001, 0.000229839, -0.000188283, 1.14919, 0.613867, -9.64198e-06, 0.479449, 1.23452e-05, 0.621485, -0.000244534, 0.485399, 0.000313091, 0.621429, -0.000978202, 0.485353, 0.00125245, 0.62112, -0.00220004, 0.485114, 0.00281687, 0.621119, -0.0039111, 0.485112, 0.00500783, 0.621122, -0.00611091, 0.485112, 0.00782498, 0.621133, -0.00879922, 0.485117, 0.0112687, 0.621152, -0.0119756, 0.485125, 0.0153394, 0.621183, -0.0156396, 0.485139, 0.0200382, 0.621227, -0.0197898, 0.485158, 0.0253663, 0.621298, -0.0244253, 0.485192, 0.0313261, 0.621388, -0.0295441, 0.485233, 0.0379204, 0.621507, -0.0351432, 0.485286, 0.0451523, 0.621693, -0.0412198, 0.485378, 0.0530277, 0.621933, -0.0477673, 0.485495, 0.0615522, 0.622232, -0.0547574, 0.485635, 0.0707316, 0.622809, -0.0619417, 0.485943, 0.0805883, 0.623407, -0.069625, 0.486232, 0.0911267, 0.62406, -0.077796, 0.486516, 0.102354, 0.624835, -0.0863731, 0.486838, 0.114279, 0.625758, -0.095251, 0.487188, 0.126902, 0.627043, -0.104299, 0.487695, 0.140285, 0.628438, -0.113724, 0.488163, 0.154397, 0.630325, -0.123417, 0.488858, 0.169267, 0.632801, -0.133137, 0.489754, 0.184941, 0.635784, -0.143052, 0.490815, 0.20136, 0.639406, -0.153132, 0.492048, 0.218643, 0.643872, -0.163143, 0.49363, 0.236615, 0.6499, -0.17333, 0.496009, 0.255449, 0.657201, -0.183622, 0.498994, 0.275006, 0.666221, -0.194019, 0.502888, 0.295354, 0.674419, -0.204192, 0.505459, 0.316244, 0.683729, -0.21406, 0.507771, 0.33849, 0.695584, -0.222854, 0.510245, 0.363166, 0.708583, -0.231315, 0.512293, 0.389071, 0.721233, -0.238911, 0.512747, 0.415737, 0.735134, -0.245657, 0.512482, 0.443331, 0.750179, -0.251879, 0.511526, 0.471891, 0.765073, -0.256911, 0.508935, 0.500892, 0.779794, -0.261144, 0.504341, 0.530294, 0.794801, -0.264316, 0.498515, 0.560144, 0.810339, -0.266276, 0.491015, 0.590213, 0.824818, -0.266981, 0.481126, 0.620865, 0.839375, -0.265778, 0.468685, 0.652687, 0.853043, -0.262748, 0.453925, 0.684759, 0.867335, -0.258474, 0.437912, 0.716209, 0.88037, -0.253187, 0.419648, 0.747508, 0.891711, -0.246476, 0.39982, 0.77797, 0.902896, -0.238735, 0.37879, 0.808586, 0.913601, -0.22885, 0.355891, 0.838843, 0.923019, -0.217656, 0.331773, 0.869014, 0.933432, -0.205539, 0.307356, 0.898512, 0.939691, -0.192595, 0.281321, 0.9269, 0.946938, -0.178945, 0.255441, 0.955297, 0.952372, -0.163587, 0.229013, 0.983231, 0.95909, -0.147214, 0.203179, 1.00971, 0.963675, -0.13064, 0.17792, 1.03438, 0.968247, -0.113121, 0.152898, 1.05625, 0.97001, -0.0945824, 0.128712, 1.07598, 0.974458, -0.0755648, 0.103349, 1.094, 0.980168, -0.0571998, 0.0776731, 1.1104, 0.987295, -0.0377994, 0.0514445, 1.12491, 0.994432, -0.0186417, 0.025429, 1.13851, 0.999975, 0.000542714, -0.000282356, 1.15108, 0.592656, -9.80249e-06, 0.486018, 1.19532e-05, 0.598467, -0.000247275, 0.490781, 0.000301531, 0.597934, -0.000988317, 0.490343, 0.00120517, 0.597903, -0.00222366, 0.490319, 0.0027116, 0.597913, -0.00395315, 0.490327, 0.00482077, 0.597919, -0.00617653, 0.490329, 0.00753264, 0.597936, -0.00889375, 0.490339, 0.0108478, 0.597956, -0.0121043, 0.490347, 0.0147668, 0.597992, -0.0158073, 0.490365, 0.0192905, 0.598032, -0.0200017, 0.490382, 0.0244204, 0.598109, -0.0246865, 0.49042, 0.0301593, 0.598215, -0.0298594, 0.490474, 0.03651, 0.59833, -0.0355167, 0.490524, 0.0434757, 0.598525, -0.0416559, 0.490624, 0.0510629, 0.598778, -0.0482692, 0.490753, 0.0592781, 0.599135, -0.0553114, 0.49094, 0.0681304, 0.599802, -0.062542, 0.491328, 0.0776467, 0.600361, -0.0703638, 0.491598, 0.0878184, 0.60101, -0.0786256, 0.491882, 0.0986573, 0.601811, -0.0872962, 0.492232, 0.11018, 0.602861, -0.0962284, 0.492684, 0.1224, 0.604167, -0.10538, 0.493213, 0.135354, 0.605693, -0.114896, 0.493799, 0.149034, 0.607682, -0.124654, 0.494576, 0.163469, 0.610672, -0.13456, 0.4959, 0.178747, 0.613313, -0.144581, 0.496713, 0.194723, 0.617603, -0.154703, 0.498499, 0.211617, 0.622174, -0.16489, 0.500188, 0.229183, 0.628855, -0.175164, 0.503072, 0.247786, 0.636963, -0.185565, 0.506798, 0.267116, 0.644866, -0.195911, 0.509719, 0.28702, 0.653741, -0.206104, 0.512776, 0.307763, 0.664942, -0.216447, 0.516812, 0.329631, 0.67633, -0.22552, 0.519181, 0.353515, 0.690012, -0.234316, 0.521681, 0.379226, 0.704243, -0.242032, 0.523129, 0.405901, 0.719396, -0.249172, 0.523768, 0.433585, 0.734471, -0.255543, 0.522541, 0.462085, 0.750539, -0.260697, 0.520217, 0.491233, 0.766365, -0.26501, 0.516293, 0.521094, 0.781677, -0.268409, 0.509708, 0.551014, 0.797132, -0.270399, 0.501944, 0.581463, 0.812655, -0.271247, 0.492025, 0.612402, 0.828592, -0.270708, 0.480424, 0.643798, 0.844044, -0.268085, 0.465955, 0.67682, 0.857305, -0.263459, 0.448425, 0.708496, 0.87114, -0.258151, 0.430243, 0.74046, 0.884936, -0.251171, 0.410578, 0.771583, 0.895772, -0.243305, 0.38862, 0.802234, 0.906961, -0.234037, 0.365214, 0.833179, 0.917775, -0.222714, 0.34116, 0.86353, 0.927883, -0.210175, 0.31572, 0.893557, 0.936617, -0.196925, 0.289159, 0.922976, 0.943384, -0.182788, 0.261996, 0.951606, 0.949713, -0.167965, 0.235324, 0.979958, 0.955818, -0.151109, 0.208408, 1.00765, 0.961344, -0.133834, 0.182591, 1.03329, 0.965469, -0.115987, 0.156958, 1.0557, 0.968693, -0.09746, 0.132239, 1.07583, 0.973165, -0.0778514, 0.106195, 1.09451, 0.979387, -0.0585067, 0.0797669, 1.11137, 0.98671, -0.0390409, 0.0530263, 1.12643, 0.994093, -0.019408, 0.0263163, 1.14016, 1.00002, 0.000540029, -0.000194487, 1.15299, 0.574483, -9.89066e-06, 0.494533, 1.14896e-05, 0.574478, -0.000249127, 0.494528, 0.000289403, 0.574607, -0.000996811, 0.494637, 0.00115797, 0.574396, -0.00224241, 0.494458, 0.00260498, 0.574377, -0.00398632, 0.49444, 0.00463102, 0.574386, -0.00622836, 0.494445, 0.00723623, 0.574401, -0.0089683, 0.494453, 0.010421, 0.574419, -0.0122056, 0.49446, 0.0141859, 0.574459, -0.0159396, 0.494481, 0.0185322, 0.574525, -0.0201692, 0.49452, 0.0234617, 0.574587, -0.0248924, 0.494547, 0.0289762, 0.574697, -0.0301074, 0.494604, 0.0350797, 0.574853, -0.0358114, 0.494688, 0.0417767, 0.575027, -0.041999, 0.494772, 0.0490718, 0.575294, -0.0486618, 0.494915, 0.0569728, 0.575733, -0.0557148, 0.495173, 0.0654955, 0.576356, -0.0630489, 0.495537, 0.0746612, 0.576944, -0.0709285, 0.495836, 0.0844615, 0.57765, -0.0792723, 0.496177, 0.0949142, 0.578491, -0.0880167, 0.496563, 0.10603, 0.579639, -0.0969462, 0.497096, 0.117841, 0.580989, -0.10622, 0.497684, 0.130367, 0.582587, -0.115861, 0.498337, 0.143609, 0.584951, -0.125605, 0.499414, 0.157625, 0.587602, -0.135608, 0.500518, 0.172413, 0.59076, -0.145742, 0.501767, 0.187999, 0.594992, -0.155934, 0.503542, 0.20445, 0.600656, -0.166303, 0.506135, 0.221764, 0.607816, -0.176681, 0.509542, 0.24002, 0.61522, -0.187071, 0.51263, 0.258992, 0.623702, -0.197465, 0.516021, 0.278773, 0.634192, -0.207816, 0.520422, 0.299377, 0.644936, -0.218183, 0.524073, 0.320802, 0.657888, -0.2278, 0.528049, 0.34384, 0.670666, -0.236747, 0.52986, 0.36916, 0.685626, -0.24484, 0.531892, 0.395867, 0.701304, -0.252071, 0.532727, 0.423488, 0.717727, -0.258714, 0.532146, 0.452201, 0.733914, -0.264211, 0.529883, 0.481579, 0.750529, -0.26859, 0.5259, 0.511558, 0.76747, -0.272046, 0.51999, 0.542042, 0.785189, -0.274225, 0.513083, 0.572799, 0.800954, -0.275189, 0.502936, 0.603816, 0.816962, -0.274946, 0.490921, 0.635461, 0.83336, -0.272695, 0.47684, 0.6676, 0.848143, -0.268223, 0.459405, 0.70051, 0.861818, -0.262768, 0.440319, 0.732902, 0.876828, -0.255872, 0.420123, 0.765084, 0.889312, -0.247703, 0.398379, 0.796391, 0.900412, -0.238381, 0.374496, 0.827333, 0.912251, -0.227783, 0.349874, 0.858385, 0.921792, -0.214832, 0.323181, 0.888652, 0.931273, -0.200949, 0.296624, 0.917763, 0.940295, -0.186537, 0.269211, 0.947878, 0.946812, -0.171538, 0.241447, 0.977016, 0.953588, -0.155254, 0.213829, 1.00501, 0.958841, -0.137156, 0.186807, 1.03179, 0.963746, -0.118699, 0.160706, 1.05502, 0.966468, -0.0998358, 0.135504, 1.07568, 0.971178, -0.0805186, 0.109131, 1.09479, 0.97831, -0.0599348, 0.0818293, 1.1123, 0.985886, -0.0399661, 0.0545872, 1.12771, 0.994021, -0.0198682, 0.0269405, 1.14186, 1.00009, 0.000271022, -0.00012989, 1.15514, 0.538716, -9.90918e-06, 0.486732, 1.09675e-05, 0.550656, -0.000250642, 0.497518, 0.000277412, 0.55057, -0.00100265, 0.497441, 0.00110974, 0.550903, -0.00225672, 0.497733, 0.00249779, 0.550568, -0.00401046, 0.497438, 0.00443906, 0.550574, -0.00626613, 0.49744, 0.00693637, 0.550591, -0.0090226, 0.497449, 0.00998921, 0.550623, -0.0122795, 0.497469, 0.0135984, 0.550667, -0.0160361, 0.497495, 0.0177654, 0.550724, -0.0202908, 0.497526, 0.0224915, 0.550792, -0.0250421, 0.497557, 0.0277795, 0.550918, -0.0302878, 0.49763, 0.0336334, 0.551058, -0.0360241, 0.497701, 0.0400573, 0.551276, -0.0422473, 0.497824, 0.0470585, 0.551551, -0.0489441, 0.497977, 0.0546433, 0.552074, -0.0559596, 0.498312, 0.0628367, 0.552681, -0.0633978, 0.498679, 0.071646, 0.553324, -0.0713176, 0.499031, 0.0810746, 0.554011, -0.0797268, 0.499365, 0.091129, 0.55488, -0.0885238, 0.499779, 0.101837, 0.556171, -0.0974417, 0.500444, 0.113239, 0.557498, -0.106841, 0.501025, 0.125316, 0.559299, -0.116533, 0.501864, 0.138128, 0.561647, -0.126298, 0.502967, 0.151695, 0.564347, -0.136388, 0.504129, 0.16604, 0.567863, -0.146576, 0.505713, 0.181207, 0.572569, -0.156832, 0.507953, 0.197259, 0.578919, -0.167323, 0.511186, 0.214258, 0.585387, -0.177712, 0.514042, 0.232038, 0.593134, -0.188184, 0.517484, 0.250733, 0.603295, -0.198717, 0.522345, 0.270454, 0.613854, -0.209177, 0.526751, 0.290807, 0.626092, -0.219644, 0.531595, 0.312202, 0.637868, -0.229494, 0.534721, 0.334435, 0.652458, -0.238718, 0.538304, 0.359184, 0.666985, -0.247061, 0.539875, 0.385637, 0.683301, -0.254652, 0.541042, 0.41328, 0.69998, -0.261376, 0.540735, 0.441903, 0.717824, -0.267085, 0.539139, 0.471609, 0.734617, -0.271465, 0.534958, 0.501446, 0.753663, -0.27528, 0.53032, 0.532571, 0.770512, -0.277617, 0.522134, 0.563641, 0.787356, -0.278525, 0.51206, 0.595067, 0.806252, -0.278512, 0.50119, 0.627226, 0.822061, -0.277023, 0.486791, 0.659402, 0.838959, -0.273175, 0.470467, 0.692874, 0.85379, -0.267238, 0.450688, 0.725702, 0.868268, -0.260327, 0.429741, 0.75832, 0.881994, -0.251946, 0.407223, 0.790189, 0.893885, -0.242432, 0.383214, 0.821625, 0.905118, -0.231904, 0.357297, 0.853011, 0.916045, -0.219545, 0.330733, 0.883773, 0.927614, -0.205378, 0.303916, 0.914435, 0.936005, -0.190388, 0.275941, 0.944502, 0.944533, -0.1749, 0.247493, 0.974439, 0.950758, -0.158588, 0.218996, 1.00286, 0.957078, -0.141027, 0.191559, 1.0304, 0.962448, -0.121507, 0.164457, 1.05466, 0.964993, -0.102068, 0.138636, 1.0761, 0.970017, -0.0822598, 0.111861, 1.09541, 0.97661, -0.062033, 0.0843438, 1.11317, 0.985073, -0.0409832, 0.0558496, 1.12911, 0.993515, -0.020146, 0.0275331, 1.1438, 1.00006, 0.00027329, -0.000107883, 1.15736, 0.525324, -9.99341e-06, 0.498153, 1.05385e-05, 0.526513, -0.000251605, 0.499277, 0.000265329, 0.526517, -0.00100641, 0.499282, 0.0010613, 0.526588, -0.00226466, 0.499337, 0.00238823, 0.526539, -0.0040255, 0.499302, 0.00424535, 0.526547, -0.00628954, 0.499306, 0.00663364, 0.526561, -0.00905628, 0.499313, 0.00955337, 0.526593, -0.0123253, 0.499334, 0.0130054, 0.526642, -0.0160957, 0.499365, 0.0169911, 0.5267, -0.0203661, 0.499396, 0.0215122, 0.526792, -0.0251347, 0.499451, 0.0265718, 0.526904, -0.0303985, 0.499511, 0.0321732, 0.527079, -0.0361554, 0.499617, 0.0383231, 0.527285, -0.0423982, 0.499731, 0.045026, 0.527602, -0.0491121, 0.499924, 0.0522936, 0.528166, -0.0561127, 0.500306, 0.0601528, 0.52879, -0.0635988, 0.5007, 0.0686059, 0.529421, -0.071581, 0.501048, 0.0776518, 0.530144, -0.0799854, 0.501421, 0.0873148, 0.531062, -0.0888032, 0.501884, 0.0976084, 0.532374, -0.0977643, 0.50259, 0.108588, 0.533828, -0.107197, 0.50329, 0.120234, 0.53581, -0.116887, 0.504312, 0.132602, 0.538063, -0.126755, 0.505365, 0.145721, 0.5409, -0.136819, 0.506668, 0.159617, 0.544882, -0.147117, 0.508731, 0.174369, 0.550238, -0.157446, 0.511601, 0.190028, 0.556038, -0.167988, 0.514431, 0.206587, 0.563031, -0.178364, 0.517808, 0.224046, 0.571543, -0.189007, 0.521937, 0.242503, 0.582255, -0.199546, 0.527415, 0.261977, 0.59272, -0.210084, 0.531682, 0.282162, 0.605648, -0.220448, 0.537123, 0.303426, 0.61785, -0.230593, 0.540664, 0.325323, 0.632223, -0.240238, 0.544467, 0.348993, 0.648819, -0.24887, 0.547594, 0.375462, 0.665825, -0.256657, 0.54912, 0.403024, 0.683389, -0.263711, 0.549294, 0.431773, 0.701495, -0.269666, 0.547649, 0.461494, 0.719197, -0.274169, 0.543786, 0.491623, 0.737906, -0.278124, 0.538644, 0.522994, 0.756652, -0.280632, 0.531057, 0.554775, 0.775279, -0.281741, 0.521972, 0.586441, 0.792688, -0.281652, 0.509613, 0.618596, 0.811894, -0.280345, 0.496497, 0.651462, 0.827938, -0.277128, 0.47968, 0.684023, 0.844837, -0.271646, 0.460688, 0.718024, 0.859239, -0.264397, 0.438872, 0.751207, 0.874088, -0.256144, 0.41577, 0.784232, 0.887693, -0.246311, 0.391369, 0.816191, 0.899402, -0.235497, 0.365872, 0.847828, 0.910973, -0.223631, 0.338618, 0.87934, 0.92204, -0.209874, 0.310803, 0.910325, 0.930987, -0.194265, 0.281802, 0.940695, 0.94, -0.178125, 0.252836, 0.970958, 0.948018, -0.161479, 0.224239, 1.00078, 0.955141, -0.144038, 0.195857, 1.0288, 0.960513, -0.124915, 0.168487, 1.05371, 0.963964, -0.104284, 0.141495, 1.07596, 0.968713, -0.0838732, 0.114437, 1.09628, 0.975524, -0.0635579, 0.0863105, 1.11448, 0.98431, -0.042291, 0.0574774, 1.13069, 0.992916, -0.0209131, 0.0284343, 1.14568, 0.999926, 0.000743097, -0.000379265, 1.15955, 0.501042, -9.98428e-06, 0.498726, 1.00306e-05, 0.502992, -0.000252112, 0.500665, 0.000253283, 0.502417, -0.00100791, 0.500092, 0.00101259, 0.502965, -0.00226919, 0.500621, 0.00227978, 0.502318, -0.00403109, 0.499994, 0.00405011, 0.502333, -0.00629832, 0.500005, 0.00632868, 0.502362, -0.00906907, 0.500027, 0.00911446, 0.502369, -0.0123423, 0.500023, 0.0124078, 0.50243, -0.0161178, 0.500066, 0.016211, 0.502493, -0.0203937, 0.500103, 0.0205256, 0.502592, -0.0251684, 0.500166, 0.0253548, 0.502707, -0.0304389, 0.50023, 0.0307029, 0.502881, -0.0362015, 0.500335, 0.0365753, 0.503124, -0.0424507, 0.500488, 0.0429798, 0.503443, -0.0491582, 0.500686, 0.0499268, 0.504083, -0.0561476, 0.501155, 0.0574541, 0.504668, -0.0636846, 0.501524, 0.0655408, 0.505319, -0.0716834, 0.501904, 0.0742072, 0.50609, -0.0800925, 0.502321, 0.0834699, 0.507122, -0.0888425, 0.502896, 0.0933603, 0.508414, -0.097855, 0.503603, 0.10391, 0.509955, -0.107304, 0.504416, 0.115113, 0.512061, -0.116921, 0.505565, 0.127054, 0.514419, -0.12689, 0.506732, 0.139709, 0.517529, -0.136934, 0.508338, 0.153173, 0.522085, -0.147327, 0.510987, 0.167528, 0.526986, -0.157612, 0.513527, 0.182708, 0.533122, -0.168213, 0.516717, 0.198881, 0.540807, -0.178688, 0.520832, 0.215986, 0.550687, -0.189511, 0.52632, 0.234335, 0.560567, -0.199998, 0.531009, 0.253375, 0.571698, -0.210652, 0.535839, 0.273499, 0.584364, -0.220917, 0.541091, 0.294355, 0.599066, -0.23137, 0.546875, 0.316525, 0.614148, -0.241206, 0.551306, 0.339671, 0.631157, -0.250379, 0.555187, 0.36531, 0.647919, -0.258397, 0.556595, 0.392767, 0.666112, -0.265528, 0.556949, 0.421397, 0.686158, -0.271827, 0.556617, 0.451433, 0.704838, -0.27674, 0.552975, 0.482131, 0.723957, -0.280733, 0.547814, 0.513458, 0.74262, -0.283359, 0.53997, 0.545446, 0.762009, -0.284541, 0.530422, 0.57775, 0.781314, -0.284507, 0.518546, 0.610434, 0.799116, -0.283309, 0.504178, 0.643178, 0.817604, -0.280378, 0.48843, 0.676248, 0.83459, -0.275619, 0.469457, 0.709698, 0.850974, -0.26856, 0.447698, 0.744245, 0.866747, -0.260094, 0.424791, 0.777695, 0.881412, -0.249929, 0.399913, 0.810392, 0.8936, -0.239137, 0.37308, 0.842872, 0.905943, -0.226818, 0.345705, 0.874677, 0.916408, -0.213699, 0.31706, 0.906257, 0.927215, -0.198428, 0.288444, 0.936881, 0.935625, -0.181643, 0.258329, 0.96795, 0.944076, -0.164386, 0.228488, 0.998216, 0.951229, -0.146339, 0.199763, 1.02689, 0.958793, -0.127709, 0.172153, 1.0535, 0.963219, -0.107244, 0.144989, 1.07646, 0.967562, -0.0857764, 0.11685, 1.09675, 0.974866, -0.0645377, 0.0880571, 1.11576, 0.983353, -0.0431732, 0.0587352, 1.13227, 0.992503, -0.0218356, 0.0294181, 1.1478, 1.00003, 0.000605203, -0.000231013, 1.16207, 0.482935, -1.01177e-05, 0.504695, 9.68142e-06, 0.477554, -0.000251521, 0.499071, 0.000240676, 0.477904, -0.00100683, 0.499436, 0.00096342, 0.478368, -0.00226636, 0.499899, 0.0021687, 0.477977, -0.00402719, 0.499513, 0.00385384, 0.477993, -0.00629226, 0.499525, 0.0060221, 0.478011, -0.00906011, 0.499536, 0.00867289, 0.478051, -0.0123305, 0.499566, 0.0118074, 0.478089, -0.016102, 0.499587, 0.0154269, 0.478171, -0.0203736, 0.499645, 0.0195341, 0.478254, -0.025143, 0.499692, 0.0241318, 0.47839, -0.0304071, 0.499779, 0.0292247, 0.478588, -0.0361631, 0.499911, 0.0348196, 0.478812, -0.0424023, 0.500046, 0.0409231, 0.479208, -0.0490724, 0.500326, 0.047552, 0.479841, -0.0560722, 0.500805, 0.0547377, 0.480392, -0.0636125, 0.501152, 0.0624607, 0.481068, -0.0716134, 0.501561, 0.0707473, 0.481898, -0.0800062, 0.502054, 0.0796118, 0.483022, -0.0886568, 0.502728, 0.0890974, 0.484332, -0.0977553, 0.503479, 0.0992099, 0.486126, -0.107173, 0.504546, 0.10999, 0.488066, -0.11677, 0.50557, 0.121476, 0.490521, -0.126725, 0.506849, 0.133672, 0.494232, -0.136793, 0.50911, 0.146731, 0.498302, -0.147116, 0.511345, 0.160577, 0.503565, -0.157446, 0.514344, 0.175335, 0.510902, -0.168121, 0.518824, 0.191207, 0.519263, -0.178799, 0.523666, 0.208058, 0.528204, -0.189407, 0.528296, 0.225875, 0.538854, -0.200145, 0.533724, 0.244782, 0.551278, -0.210701, 0.539833, 0.264753, 0.565222, -0.221303, 0.546131, 0.285745, 0.579403, -0.231688, 0.551496, 0.307592, 0.595469, -0.241718, 0.556809, 0.330582, 0.610929, -0.250992, 0.559641, 0.354995, 0.629433, -0.259602, 0.562379, 0.382471, 0.648504, -0.267038, 0.563676, 0.411126, 0.66756, -0.273388, 0.562092, 0.440924, 0.689143, -0.278788, 0.560807, 0.472118, 0.709056, -0.282783, 0.555701, 0.503774, 0.729855, -0.285836, 0.548698, 0.536364, 0.748954, -0.287078, 0.538544, 0.56895, 0.768373, -0.287133, 0.526711, 0.601991, 0.78827, -0.285839, 0.512511, 0.635403, 0.807465, -0.283238, 0.496323, 0.668797, 0.825194, -0.27906, 0.477638, 0.702584, 0.842203, -0.272286, 0.456253, 0.736393, 0.857749, -0.263854, 0.432412, 0.77096, 0.874799, -0.253943, 0.407806, 0.80489, 0.887497, -0.24237, 0.38033, 0.83771, 0.89966, -0.230278, 0.352446, 0.870376, 0.911753, -0.21646, 0.323268, 0.902256, 0.923011, -0.202071, 0.294314, 0.933306, 0.932375, -0.185519, 0.264104, 0.965177, 0.940537, -0.167604, 0.234035, 0.996303, 0.948904, -0.149068, 0.20412, 1.0261, 0.955263, -0.129539, 0.175431, 1.05304, 0.960303, -0.109932, 0.148116, 1.07617, 0.965512, -0.0880572, 0.119693, 1.09742, 0.973466, -0.0660548, 0.0901619, 1.11721, 0.98284, -0.0439228, 0.0599875, 1.13436, 0.992216, -0.0219588, 0.0298975, 1.15006, 0.999946, 0.000119402, -2.08547e-05, 1.16471, 0.447827, -1.00414e-05, 0.491543, 9.14833e-06, 0.454778, -0.000251257, 0.499172, 0.00022891, 0.453519, -0.00100342, 0.497787, 0.000914184, 0.45357, -0.00225776, 0.497847, 0.00205701, 0.453578, -0.00401371, 0.497855, 0.00365705, 0.45357, -0.00627107, 0.497841, 0.00571453, 0.453598, -0.00902968, 0.497864, 0.00823019, 0.453627, -0.0122888, 0.497882, 0.0112049, 0.453684, -0.0160475, 0.497923, 0.0146405, 0.453764, -0.0203044, 0.49798, 0.0185394, 0.453866, -0.0250576, 0.498049, 0.0229054, 0.453996, -0.0303028, 0.49813, 0.0277424, 0.454196, -0.0360379, 0.498267, 0.0330587, 0.454457, -0.0422521, 0.498445, 0.0388613, 0.454926, -0.0488393, 0.498812, 0.0451767, 0.455525, -0.0558653, 0.499272, 0.0520153, 0.456074, -0.0633772, 0.499625, 0.0593754, 0.456752, -0.0713606, 0.500049, 0.0672751, 0.457648, -0.07971, 0.500615, 0.0757447, 0.458849, -0.0883032, 0.501399, 0.0848231, 0.46029, -0.0974095, 0.502293, 0.0945135, 0.462, -0.106729, 0.503301, 0.104848, 0.464121, -0.116354, 0.504533, 0.115884, 0.466889, -0.126214, 0.506172, 0.127652, 0.470744, -0.136324, 0.508667, 0.14024, 0.47488, -0.146595, 0.510995, 0.153673, 0.480845, -0.157027, 0.514832, 0.168053, 0.488262, -0.167658, 0.519506, 0.183508, 0.496547, -0.178343, 0.524347, 0.199948, 0.506254, -0.188916, 0.52983, 0.217503, 0.517961, -0.199975, 0.536357, 0.236272, 0.531484, -0.210624, 0.543641, 0.256096, 0.545496, -0.221227, 0.550048, 0.277085, 0.559497, -0.231568, 0.555076, 0.298615, 0.575752, -0.241698, 0.560541, 0.321547, 0.591999, -0.251172, 0.564156, 0.345602, 0.610654, -0.260178, 0.567607, 0.371851, 0.630484, -0.268094, 0.56923, 0.40076, 0.651807, -0.274661, 0.569779, 0.430801, 0.67239, -0.280331, 0.566791, 0.461939, 0.693024, -0.284501, 0.562007, 0.493854, 0.715473, -0.287852, 0.555791, 0.526992, 0.736323, -0.28929, 0.546345, 0.560102, 0.755771, -0.289405, 0.534, 0.593543, 0.775424, -0.2881, 0.519114, 0.627256, 0.795447, -0.285562, 0.502543, 0.661464, 0.815319, -0.281416, 0.484773, 0.695206, 0.831769, -0.275523, 0.463445, 0.729044, 0.849464, -0.267516, 0.440269, 0.764069, 0.866775, -0.257584, 0.415049, 0.799089, 0.881252, -0.245817, 0.388049, 0.831948, 0.894209, -0.233127, 0.35889, 0.865526, 0.906922, -0.219579, 0.329915, 0.89818, 0.919686, -0.204491, 0.300441, 0.930013, 0.929044, -0.188962, 0.269445, 0.962061, 0.938393, -0.171079, 0.238402, 0.994214, 0.94661, -0.15199, 0.208204, 1.02533, 0.953095, -0.131953, 0.178653, 1.0529, 0.958644, -0.111233, 0.150684, 1.0771, 0.963925, -0.0903098, 0.122359, 1.09855, 0.971995, -0.0680505, 0.0923342, 1.11874, 0.981658, -0.0448512, 0.0614195, 1.13635, 0.991649, -0.0221931, 0.0303582, 1.15238, 0.999985, 0.000393403, -0.000111086, 1.16772, 0.396806, -9.71563e-06, 0.457671, 8.42355e-06, 0.429186, -0.000249421, 0.495017, 0.00021625, 0.429324, -0.000998052, 0.495173, 0.000865322, 0.429175, -0.00224487, 0.494999, 0.00194637, 0.429129, -0.00399041, 0.494952, 0.00346004, 0.429153, -0.00623476, 0.494974, 0.00540684, 0.429168, -0.0089773, 0.494983, 0.00778714, 0.429207, -0.0122175, 0.495012, 0.0106022, 0.429257, -0.0159542, 0.495047, 0.0138535, 0.429338, -0.0201864, 0.495106, 0.0175443, 0.429431, -0.0249104, 0.495165, 0.0216774, 0.429587, -0.0301252, 0.495279, 0.0262594, 0.429796, -0.0358249, 0.495432, 0.0312968, 0.430065, -0.0419972, 0.495621, 0.0367985, 0.430588, -0.0485144, 0.496061, 0.042798, 0.43113, -0.0555028, 0.496472, 0.0492914, 0.431743, -0.0629852, 0.496904, 0.0562907, 0.432448, -0.0709256, 0.497369, 0.0638056, 0.433414, -0.0791942, 0.498032, 0.071885, 0.434638, -0.0877346, 0.498854, 0.0805517, 0.43611, -0.0968056, 0.499812, 0.0898047, 0.437859, -0.106002, 0.500891, 0.0997142, 0.440017, -0.115648, 0.502198, 0.110289, 0.443236, -0.125427, 0.504389, 0.121644, 0.44697, -0.135492, 0.506809, 0.133769, 0.451689, -0.145746, 0.509858, 0.146787, 0.45811, -0.156219, 0.514247, 0.160793, 0.465305, -0.166834, 0.518816, 0.175791, 0.474085, -0.177546, 0.524331, 0.191906, 0.484808, -0.188262, 0.53104, 0.209199, 0.49732, -0.199346, 0.538511, 0.227825, 0.509693, -0.209951, 0.544554, 0.247269, 0.524367, -0.220533, 0.551616, 0.267978, 0.539228, -0.231082, 0.557368, 0.289672, 0.55644, -0.241342, 0.563782, 0.31268, 0.574204, -0.250964, 0.568851, 0.33651, 0.593388, -0.260306, 0.57312, 0.362219, 0.613358, -0.268667, 0.574916, 0.390322, 0.634512, -0.275591, 0.575053, 0.420478, 0.65563, -0.281328, 0.572404, 0.451614, 0.678265, -0.285948, 0.568893, 0.484112, 0.70011, -0.289408, 0.561878, 0.517348, 0.723005, -0.291328, 0.55359, 0.551355, 0.743744, -0.291418, 0.541099, 0.585109, 0.763949, -0.290252, 0.526489, 0.619487, 0.784186, -0.287648, 0.509496, 0.65404, 0.804304, -0.283782, 0.491484, 0.688649, 0.823629, -0.278067, 0.470517, 0.723133, 0.84094, -0.270588, 0.44705, 0.757163, 0.857852, -0.261188, 0.421252, 0.792816, 0.874934, -0.249313, 0.394191, 0.827248, 0.888709, -0.236492, 0.365359, 0.861074, 0.902589, -0.222185, 0.336016, 0.894417, 0.914201, -0.207314, 0.30527, 0.926825, 0.925978, -0.191146, 0.274532, 0.9595, 0.93512, -0.174135, 0.243393, 0.991583, 0.943656, -0.155231, 0.212414, 1.02356, 0.951719, -0.134403, 0.182005, 1.05239, 0.957164, -0.113023, 0.153043, 1.07754, 0.962656, -0.0914493, 0.124186, 1.09984, 0.970695, -0.0694179, 0.0941654, 1.12, 0.980749, -0.0466199, 0.0629671, 1.13849, 0.991205, -0.0227032, 0.0311146, 1.15494, 0.999884, 0.000632388, -0.000254483, 1.1706, 0.379821, -9.57289e-06, 0.460637, 7.89337e-06, 0.405188, -0.000247483, 0.491396, 0.000204064, 0.404796, -0.000989434, 0.490914, 0.000815853, 0.40483, -0.00222607, 0.490949, 0.00183559, 0.40473, -0.00395723, 0.49084, 0.00326332, 0.404731, -0.00618287, 0.490836, 0.00509945, 0.404768, -0.00890258, 0.490871, 0.00734463, 0.404791, -0.0121156, 0.490883, 0.00999992, 0.404857, -0.0158214, 0.490938, 0.0130676, 0.404943, -0.0200178, 0.491004, 0.0165503, 0.405059, -0.0247027, 0.491093, 0.0204521, 0.405213, -0.0298729, 0.491205, 0.0247788, 0.405399, -0.0355226, 0.491333, 0.0295373, 0.405731, -0.0416352, 0.491604, 0.034741, 0.406303, -0.0480807, 0.492116, 0.0404255, 0.406814, -0.0550458, 0.492506, 0.0465732, 0.407404, -0.0624652, 0.492926, 0.0532058, 0.408149, -0.0702958, 0.493442, 0.0603442, 0.409128, -0.0784623, 0.494136, 0.0680297, 0.410408, -0.087007, 0.495054, 0.0762786, 0.411813, -0.0959639, 0.495962, 0.0851046, 0.413735, -0.105075, 0.497257, 0.0945878, 0.416137, -0.114646, 0.498882, 0.104725, 0.41934, -0.124394, 0.501132, 0.11563, 0.423326, -0.134328, 0.503883, 0.127325, 0.428419, -0.14458, 0.50747, 0.139911, 0.43484, -0.154979, 0.511964, 0.153481, 0.442641, -0.165628, 0.517328, 0.168114, 0.452511, -0.176365, 0.524258, 0.183995, 0.463473, -0.187298, 0.531248, 0.200953, 0.475564, -0.198244, 0.538367, 0.219176, 0.488664, -0.208938, 0.545175, 0.238514, 0.504073, -0.219599, 0.553227, 0.259129, 0.520832, -0.230378, 0.560653, 0.280997, 0.538455, -0.240703, 0.567523, 0.303821, 0.55709, -0.250548, 0.573287, 0.327948, 0.576646, -0.259964, 0.577795, 0.353362, 0.596705, -0.268721, 0.580077, 0.380336, 0.618053, -0.276054, 0.58018, 0.4101, 0.640303, -0.282176, 0.578747, 0.44161, 0.662365, -0.286931, 0.574294, 0.474106, 0.684542, -0.290521, 0.567035, 0.507549, 0.707984, -0.292672, 0.558687, 0.541853, 0.730913, -0.293189, 0.547606, 0.576581, 0.752948, -0.292199, 0.533471, 0.61172, 0.773452, -0.289508, 0.516395, 0.646339, 0.794715, -0.285716, 0.497873, 0.682131, 0.814251, -0.280051, 0.476845, 0.716396, 0.833057, -0.272873, 0.453449, 0.751503, 0.84959, -0.263982, 0.427857, 0.786085, 0.867022, -0.252745, 0.400335, 0.821355, 0.882277, -0.239655, 0.371304, 0.85646, 0.895375, -0.225386, 0.340397, 0.890828, 0.909347, -0.209587, 0.310005, 0.923532, 0.921885, -0.193433, 0.2796, 0.956419, 0.932127, -0.176135, 0.247276, 0.989445, 0.941869, -0.157872, 0.216186, 1.02221, 0.949735, -0.137577, 0.185602, 1.05195, 0.956617, -0.115285, 0.155767, 1.07822, 0.961974, -0.0928418, 0.126103, 1.10149, 0.96972, -0.0700592, 0.0956758, 1.12207, 0.98012, -0.0474671, 0.0643269, 1.1408, 0.990825, -0.0238113, 0.0320863, 1.1577, 0.999876, 0.000381574, -8.12203e-05, 1.17403, 0.367636, -9.61342e-06, 0.469176, 7.53287e-06, 0.380377, -0.000244772, 0.485434, 0.000191797, 0.380416, -0.000978857, 0.485475, 0.000767015, 0.380376, -0.00220165, 0.485435, 0.00172522, 0.380419, -0.00391408, 0.485487, 0.00306734, 0.380438, -0.00611549, 0.485505, 0.00479332, 0.380462, -0.00880558, 0.485525, 0.00690391, 0.380496, -0.0119837, 0.485551, 0.00940039, 0.38056, -0.0156487, 0.485605, 0.0122848, 0.38064, -0.0197988, 0.485666, 0.0155601, 0.380767, -0.0244324, 0.48577, 0.0192313, 0.380909, -0.0295444, 0.485871, 0.0233032, 0.381142, -0.0351321, 0.48606, 0.0277861, 0.381472, -0.0411535, 0.486336, 0.0326939, 0.382015, -0.0475408, 0.486833, 0.0380565, 0.382523, -0.0544395, 0.487231, 0.0438615, 0.383129, -0.061784, 0.487683, 0.0501332, 0.383952, -0.0695085, 0.488313, 0.0568996, 0.38498, -0.0775819, 0.489077, 0.0641952, 0.386331, -0.0860443, 0.490113, 0.0720324, 0.387788, -0.0948406, 0.491099, 0.0804379, 0.389808, -0.103899, 0.492566, 0.0894899, 0.39252, -0.113313, 0.494601, 0.0992098, 0.395493, -0.123007, 0.496619, 0.109641, 0.399826, -0.132859, 0.499912, 0.120919, 0.405341, -0.143077, 0.504061, 0.133107, 0.411932, -0.153465, 0.508905, 0.146263, 0.420591, -0.164108, 0.515482, 0.160544, 0.43101, -0.174893, 0.523191, 0.176123, 0.441881, -0.185839, 0.53026, 0.192757, 0.453919, -0.196633, 0.537295, 0.210535, 0.468715, -0.207611, 0.546156, 0.229886, 0.485182, -0.218517, 0.555173, 0.250543, 0.501926, -0.229249, 0.562728, 0.27221, 0.51785, -0.239481, 0.567494, 0.294892, 0.536947, -0.249395, 0.573889, 0.318987, 0.557115, -0.259, 0.578831, 0.344348, 0.577966, -0.268075, 0.582055, 0.371223, 0.599489, -0.276115, 0.583307, 0.399834, 0.62479, -0.282523, 0.583902, 0.431415, 0.647504, -0.287663, 0.57953, 0.464301, 0.670601, -0.291538, 0.573103, 0.498123, 0.693539, -0.293842, 0.563731, 0.532662, 0.717385, -0.294681, 0.553169, 0.567925, 0.741533, -0.293717, 0.539908, 0.603502, 0.762142, -0.291156, 0.521902, 0.639074, 0.783014, -0.28719, 0.502815, 0.674439, 0.805158, -0.281773, 0.482598, 0.710497, 0.823646, -0.274682, 0.458949, 0.7456, 0.841879, -0.266184, 0.433129, 0.781085, 0.859515, -0.255682, 0.406064, 0.816, 0.875335, -0.242849, 0.376509, 0.851074, 0.890147, -0.228329, 0.345502, 0.886473, 0.903144, -0.212491, 0.31428, 0.920751, 0.916618, -0.195695, 0.282994, 0.954606, 0.927953, -0.178267, 0.251091, 0.988402, 0.937414, -0.159549, 0.219107, 1.02141, 0.946823, -0.140022, 0.18896, 1.05167, 0.954651, -0.118154, 0.158667, 1.07819, 0.959955, -0.0946636, 0.128808, 1.1025, 0.96858, -0.0711792, 0.0973787, 1.12391, 0.97938, -0.0475046, 0.0650965, 1.14322, 0.990498, -0.024059, 0.0326267, 1.16077, 0.999844, -5.12408e-05, 0.000112444, 1.17727, 0.316912, -9.34977e-06, 0.425996, 6.95559e-06, 0.356423, -0.000241372, 0.479108, 0.000179562, 0.356272, -0.000965292, 0.478897, 0.00071811, 0.356262, -0.00217182, 0.478894, 0.00161574, 0.356265, -0.00386092, 0.478895, 0.00287261, 0.356278, -0.0060324, 0.478905, 0.00448907, 0.356293, -0.00868565, 0.478914, 0.00646572, 0.356346, -0.0118207, 0.478965, 0.00880438, 0.356395, -0.0154355, 0.479001, 0.0115066, 0.356484, -0.019529, 0.479075, 0.0145762, 0.356609, -0.0240991, 0.47918, 0.018018, 0.356766, -0.0291413, 0.479305, 0.0218379, 0.357009, -0.0346498, 0.479512, 0.0260454, 0.357424, -0.0405462, 0.479909, 0.0306657, 0.357899, -0.0468825, 0.480337, 0.0357054, 0.358424, -0.0536887, 0.480771, 0.0411728, 0.359041, -0.0609416, 0.481242, 0.0470841, 0.359903, -0.0685239, 0.481943, 0.0534831, 0.360932, -0.0764883, 0.482741, 0.0603795, 0.362196, -0.0848364, 0.483688, 0.0678028, 0.363847, -0.0935002, 0.484947, 0.0758086, 0.365972, -0.102471, 0.486588, 0.0844173, 0.368741, -0.111751, 0.488787, 0.0937199, 0.372146, -0.121334, 0.491405, 0.103732, 0.377114, -0.131147, 0.495604, 0.114608, 0.38226, -0.141213, 0.499436, 0.126345, 0.389609, -0.151632, 0.505334, 0.139116, 0.397925, -0.162073, 0.51168, 0.152995, 0.407824, -0.172819, 0.518876, 0.168071, 0.420014, -0.183929, 0.527639, 0.184495, 0.434266, -0.195032, 0.537588, 0.20232, 0.447352, -0.205792, 0.544379, 0.221189, 0.463726, -0.216704, 0.553422, 0.241616, 0.481406, -0.227531, 0.562074, 0.263298, 0.498707, -0.238017, 0.568227, 0.286116, 0.518039, -0.247936, 0.574473, 0.3101, 0.538277, -0.257437, 0.579191, 0.335401, 0.561166, -0.266829, 0.584807, 0.362246, 0.583189, -0.275329, 0.586476, 0.390609, 0.606024, -0.28234, 0.585578, 0.420998, 0.632419, -0.287924, 0.584496, 0.454357, 0.656128, -0.291972, 0.577766, 0.488233, 0.679953, -0.29456, 0.56875, 0.523248, 0.704654, -0.295816, 0.558388, 0.559168, 0.729016, -0.295157, 0.544826, 0.595326, 0.752062, -0.292779, 0.528273, 0.631864, 0.773138, -0.288681, 0.508482, 0.667793, 0.794869, -0.283358, 0.487341, 0.704035, 0.815101, -0.27608, 0.46354, 0.739925, 0.834212, -0.26767, 0.438672, 0.775539, 0.852368, -0.257397, 0.411239, 0.810895, 0.870207, -0.245689, 0.3829, 0.846472, 0.884063, -0.231452, 0.351496, 0.881788, 0.898284, -0.215561, 0.31895, 0.917438, 0.912964, -0.198208, 0.287367, 0.952422, 0.924666, -0.180426, 0.254487, 0.987551, 0.934429, -0.161525, 0.222226, 1.02142, 0.943485, -0.141197, 0.191143, 1.05218, 0.9521, -0.120085, 0.161112, 1.07937, 0.957876, -0.0975881, 0.130982, 1.10403, 0.966943, -0.0726842, 0.0990553, 1.12616, 0.978313, -0.0483705, 0.0662818, 1.14619, 0.990048, -0.0239072, 0.0329243, 1.16413, 0.999984, 0.000461885, -7.72859e-05, 1.18099, 0.321287, -9.35049e-06, 0.455413, 6.59662e-06, 0.332595, -0.000237513, 0.471437, 0.000167562, 0.332729, -0.000949964, 0.471618, 0.000670192, 0.332305, -0.00213618, 0.471028, 0.00150712, 0.332326, -0.00379765, 0.471055, 0.00267959, 0.332344, -0.00593353, 0.471072, 0.00418751, 0.332356, -0.00854349, 0.471077, 0.00603172, 0.332403, -0.0116268, 0.471121, 0.00821362, 0.332461, -0.0151824, 0.47117, 0.0107357, 0.332552, -0.0192088, 0.471251, 0.0136014, 0.332657, -0.0237024, 0.47133, 0.0168152, 0.332835, -0.0286615, 0.471487, 0.0203853, 0.333083, -0.0340765, 0.471708, 0.0243212, 0.333547, -0.0398563, 0.47219, 0.0286518, 0.333989, -0.0460916, 0.472587, 0.0333763, 0.334532, -0.0527897, 0.473054, 0.0385084, 0.335167, -0.0599284, 0.473568, 0.0440638, 0.33608, -0.0673514, 0.474362, 0.0500962, 0.337146, -0.0752237, 0.475231, 0.0566022, 0.338462, -0.083418, 0.476282, 0.0636272, 0.34014, -0.0919382, 0.477615, 0.0712153, 0.342341, -0.100741, 0.479404, 0.079417, 0.345088, -0.109905, 0.481618, 0.0882631, 0.349049, -0.119369, 0.485081, 0.0978851, 0.353939, -0.129033, 0.489317, 0.108336, 0.359893, -0.139038, 0.494309, 0.119698, 0.366945, -0.149411, 0.499983, 0.132024, 0.375814, -0.159843, 0.507185, 0.145558, 0.387112, -0.170664, 0.516392, 0.160433, 0.40023, -0.181897, 0.526519, 0.176648, 0.412555, -0.192785, 0.53423, 0.193922, 0.427023, -0.203663, 0.542741, 0.212662, 0.443685, -0.214695, 0.552066, 0.232944, 0.461499, -0.225561, 0.560762, 0.254495, 0.480975, -0.236257, 0.569421, 0.277531, 0.501, -0.24639, 0.576101, 0.301724, 0.521691, -0.256101, 0.581493, 0.327112, 0.543478, -0.265289, 0.585221, 0.353917, 0.566094, -0.273938, 0.587614, 0.381941, 0.589578, -0.281679, 0.587991, 0.41172, 0.614583, -0.287655, 0.585928, 0.444148, 0.641813, -0.292228, 0.582092, 0.478617, 0.666189, -0.295172, 0.57398, 0.51397, 0.690475, -0.29648, 0.561676, 0.550118, 0.715543, -0.296203, 0.548758, 0.586933, 0.740405, -0.293999, 0.532792, 0.62384, 0.762183, -0.28998, 0.512735, 0.660723, 0.786069, -0.28478, 0.492402, 0.69807, 0.806812, -0.277568, 0.469058, 0.734422, 0.826987, -0.268951, 0.443017, 0.770946, 0.844588, -0.259049, 0.415501, 0.80699, 0.863725, -0.2471, 0.387328, 0.842107, 0.879137, -0.234157, 0.356108, 0.878078, 0.894634, -0.218719, 0.324315, 0.914058, 0.909162, -0.201293, 0.291813, 0.949922, 0.92072, -0.18267, 0.258474, 0.985337, 0.93158, -0.163212, 0.225593, 1.0205, 0.941238, -0.142771, 0.193986, 1.05273, 0.949293, -0.120956, 0.163392, 1.08075, 0.956226, -0.0985743, 0.132934, 1.10559, 0.96546, -0.075118, 0.101255, 1.12823, 0.977403, -0.0497921, 0.0675441, 1.149, 0.989648, -0.0241574, 0.0334681, 1.16765, 1.00001, 0.0005762, -0.000184807, 1.18519, 0.303474, -9.16603e-06, 0.4542, 6.1243e-06, 0.308894, -0.000232869, 0.462306, 0.000155592, 0.309426, -0.000931661, 0.463093, 0.000622499, 0.308643, -0.0020949, 0.461933, 0.00139979, 0.308651, -0.0037242, 0.461941, 0.00248874, 0.308662, -0.00581873, 0.46195, 0.00388933, 0.308687, -0.00837818, 0.461974, 0.00560247, 0.308728, -0.0114016, 0.462011, 0.00762948, 0.308789, -0.0148884, 0.462067, 0.00997326, 0.308882, -0.0188369, 0.462151, 0.0126375, 0.309007, -0.0232436, 0.462263, 0.0156271, 0.30918, -0.0281054, 0.462417, 0.0189498, 0.309442, -0.0334065, 0.462667, 0.0226167, 0.309901, -0.0390589, 0.463162, 0.0266614, 0.310331, -0.0452042, 0.463555, 0.0310715, 0.310858, -0.0517735, 0.464019, 0.0358698, 0.311576, -0.0587359, 0.464669, 0.0410848, 0.312436, -0.0660383, 0.465406, 0.0467453, 0.313526, -0.0737266, 0.466339, 0.0528718, 0.314903, -0.0817574, 0.467504, 0.0595039, 0.316814, -0.090167, 0.469226, 0.0666888, 0.318965, -0.0987555, 0.470981, 0.0744658, 0.322077, -0.107792, 0.473814, 0.082912, 0.325947, -0.117098, 0.477241, 0.0920846, 0.331008, -0.126602, 0.48184, 0.102137, 0.337893, -0.136619, 0.488334, 0.113135, 0.345106, -0.146838, 0.494415, 0.12511, 0.355111, -0.157357, 0.503275, 0.138356, 0.365095, -0.167955, 0.510966, 0.152686, 0.378344, -0.179157, 0.521508, 0.16856, 0.391599, -0.190143, 0.530455, 0.18561, 0.407786, -0.20123, 0.541275, 0.204308, 0.425294, -0.212456, 0.551784, 0.224623, 0.444021, -0.223568, 0.561493, 0.246172, 0.463418, -0.234154, 0.569886, 0.268979, 0.484077, -0.244546, 0.577116, 0.293411, 0.505513, -0.254301, 0.582914, 0.318936, 0.527672, -0.263564, 0.587208, 0.345856, 0.550565, -0.272332, 0.589277, 0.374054, 0.573656, -0.280011, 0.588426, 0.403276, 0.59827, -0.286924, 0.587504, 0.43474, 0.624731, -0.291994, 0.583401, 0.468767, 0.652396, -0.295159, 0.576997, 0.504411, 0.67732, -0.296954, 0.565863, 0.54114, 0.703147, -0.296877, 0.552316, 0.57816, 0.728715, -0.295147, 0.536773, 0.616124, 0.752448, -0.291275, 0.51771, 0.653885, 0.775169, -0.285905, 0.496087, 0.691537, 0.799307, -0.279064, 0.474232, 0.729251, 0.819482, -0.270294, 0.447676, 0.766267, 0.837659, -0.260032, 0.419656, 0.802616, 0.856903, -0.248497, 0.391328, 0.838583, 0.873325, -0.235252, 0.360285, 0.874711, 0.889788, -0.221126, 0.329215, 0.91077, 0.904486, -0.204304, 0.296392, 0.94653, 0.917711, -0.185562, 0.262159, 0.983828, 0.928969, -0.165635, 0.229142, 1.01955, 0.939707, -0.14442, 0.19673, 1.05317, 0.948167, -0.122147, 0.165095, 1.0823, 0.955222, -0.099098, 0.13451, 1.10791, 0.964401, -0.0755332, 0.102476, 1.1312, 0.976605, -0.0513817, 0.0689667, 1.15218, 0.989085, -0.0258499, 0.034506, 1.17129, 0.999908, 0.000617773, -0.000271268, 1.18961, 0.285803, -9.05752e-06, 0.452348, 5.72272e-06, 0.284689, -0.00022732, 0.450581, 0.000143626, 0.285263, -0.000910214, 0.451482, 0.000575099, 0.285302, -0.00204784, 0.451553, 0.00129395, 0.285318, -0.00364057, 0.451574, 0.0023006, 0.28533, -0.00568813, 0.451585, 0.00359547, 0.285361, -0.00819001, 0.451618, 0.00517934, 0.285397, -0.0111458, 0.45165, 0.007054, 0.285447, -0.0145536, 0.451688, 0.00922167, 0.285527, -0.0184127, 0.451758, 0.0116869, 0.285688, -0.0227207, 0.451929, 0.0144555, 0.28584, -0.0274712, 0.452055, 0.0175341, 0.286136, -0.0326278, 0.452369, 0.0209406, 0.286574, -0.0381792, 0.452853, 0.0246965, 0.287012, -0.0441879, 0.453272, 0.0287996, 0.287542, -0.0506096, 0.453752, 0.033268, 0.288299, -0.0573634, 0.454488, 0.0381504, 0.289186, -0.0645458, 0.455294, 0.0434447, 0.290302, -0.0720405, 0.456301, 0.0491973, 0.291776, -0.0799046, 0.457648, 0.0554453, 0.29372, -0.088117, 0.459483, 0.0622311, 0.296052, -0.0965328, 0.461571, 0.0695992, 0.299563, -0.105409, 0.465085, 0.077658, 0.30335, -0.114553, 0.468506, 0.0864176, 0.309167, -0.123917, 0.474423, 0.0961078, 0.31529, -0.13381, 0.47995, 0.106643, 0.324163, -0.144021, 0.488592, 0.118322, 0.333272, -0.154382, 0.496461, 0.131133, 0.344224, -0.165015, 0.50562, 0.145208, 0.357733, -0.176168, 0.516719, 0.16073, 0.373046, -0.187468, 0.528513, 0.177807, 0.38788, -0.198488, 0.537713, 0.196072, 0.405133, -0.209545, 0.547999, 0.21605, 0.423845, -0.220724, 0.55759, 0.237484, 0.443777, -0.231518, 0.566246, 0.26039, 0.464824, -0.242035, 0.574326, 0.284835, 0.486635, -0.251898, 0.58037, 0.310518, 0.51012, -0.261304, 0.58568, 0.337678, 0.535301, -0.270384, 0.590197, 0.366242, 0.559193, -0.27841, 0.590569, 0.395873, 0.583544, -0.285325, 0.588161, 0.426857, 0.608834, -0.291113, 0.584249, 0.459477, 0.635753, -0.294882, 0.57763, 0.494734, 0.664367, -0.297088, 0.569479, 0.532023, 0.689688, -0.297364, 0.555064, 0.569629, 0.715732, -0.295949, 0.539522, 0.608124, 0.741307, -0.292259, 0.521613, 0.646231, 0.764949, -0.287063, 0.49969, 0.684938, 0.788599, -0.28012, 0.476747, 0.723548, 0.81048, -0.27153, 0.45116, 0.761135, 0.831372, -0.261289, 0.424101, 0.798916, 0.850092, -0.249559, 0.39443, 0.835952, 0.867777, -0.236348, 0.363849, 0.871606, 0.884632, -0.221569, 0.332477, 0.907843, 0.90047, -0.20618, 0.300667, 0.944187, 0.914524, -0.188771, 0.266552, 0.981371, 0.926892, -0.168362, 0.232349, 1.01841, 0.937951, -0.146761, 0.199359, 1.05308, 0.947236, -0.123813, 0.1675, 1.0839, 0.954367, -0.099984, 0.136166, 1.11047, 0.963907, -0.0759278, 0.103808, 1.13414, 0.976218, -0.0511367, 0.0697061, 1.15575, 0.988772, -0.0267415, 0.0352529, 1.17531, 0.999888, -0.000520778, 0.000289926, 1.19389, 0.263546, -8.83274e-06, 0.441896, 5.26783e-06, 0.262352, -0.000221849, 0.439889, 0.000132311, 0.262325, -0.000886683, 0.439848, 0.000528824, 0.26228, -0.00199476, 0.439765, 0.00118975, 0.262372, -0.00354671, 0.439922, 0.00211568, 0.26239, -0.00554141, 0.439941, 0.00330652, 0.262412, -0.00797888, 0.439961, 0.00476346, 0.262453, -0.0108584, 0.440002, 0.00648818, 0.262528, -0.0141788, 0.440085, 0.0084835, 0.262615, -0.017938, 0.440166, 0.0107533, 0.262744, -0.0221346, 0.440291, 0.0133044, 0.262939, -0.026762, 0.440493, 0.0161445, 0.263277, -0.0317573, 0.440889, 0.0192974, 0.26368, -0.0371832, 0.441338, 0.0227699, 0.264106, -0.0430371, 0.441753, 0.0265698, 0.264624, -0.0493035, 0.442227, 0.0307178, 0.265378, -0.0558669, 0.442985, 0.0352616, 0.266253, -0.0628718, 0.443795, 0.0401968, 0.267478, -0.0701569, 0.445008, 0.04559, 0.269062, -0.077845, 0.446599, 0.0514539, 0.270926, -0.0857941, 0.448349, 0.0578382, 0.273693, -0.0940773, 0.451221, 0.0648363, 0.276746, -0.102704, 0.454097, 0.0724389, 0.281693, -0.111735, 0.459517, 0.0808744, 0.287335, -0.121004, 0.46531, 0.0901551, 0.29448, -0.130734, 0.472605, 0.100371, 0.30257, -0.140777, 0.480251, 0.111644, 0.312465, -0.15111, 0.489444, 0.124111, 0.324856, -0.16189, 0.500919, 0.137979, 0.33774, -0.172946, 0.511317, 0.153163, 0.35255, -0.184152, 0.522684, 0.169817, 0.367786, -0.19522, 0.53248, 0.187886, 0.385474, -0.20632, 0.543326, 0.207634, 0.404976, -0.217744, 0.554109, 0.229165, 0.425203, -0.228691, 0.563395, 0.252068, 0.446704, -0.239299, 0.571565, 0.276471, 0.468951, -0.249348, 0.577935, 0.302323, 0.493487, -0.258933, 0.584309, 0.329882, 0.517861, -0.268009, 0.58773, 0.358525, 0.543309, -0.276238, 0.589612, 0.388585, 0.569704, -0.28356, 0.589294, 0.419787, 0.594871, -0.289497, 0.585137, 0.452114, 0.622555, -0.294452, 0.580356, 0.486466, 0.651167, -0.296918, 0.57185, 0.523079, 0.677332, -0.297647, 0.558428, 0.5611, 0.703718, -0.296321, 0.542232, 0.599592, 0.730262, -0.293339, 0.524541, 0.639138, 0.754304, -0.288036, 0.502691, 0.677978, 0.778051, -0.281018, 0.479212, 0.716537, 0.801557, -0.272414, 0.454071, 0.75586, 0.822559, -0.262419, 0.425952, 0.794477, 0.843051, -0.250702, 0.397313, 0.832664, 0.86232, -0.237264, 0.366534, 0.869876, 0.879044, -0.222716, 0.334816, 0.906973, 0.896362, -0.206827, 0.303143, 0.943558, 0.910342, -0.189659, 0.269699, 0.979759, 0.924119, -0.171108, 0.236411, 1.01718, 0.935374, -0.149579, 0.202224, 1.05289, 0.944295, -0.126295, 0.16989, 1.08496, 0.952227, -0.101511, 0.138089, 1.11256, 0.962041, -0.0766392, 0.105053, 1.1375, 0.97528, -0.0511967, 0.070329, 1.15983, 0.988476, -0.025463, 0.0351268, 1.17987, 0.999962, 2.86808e-05, 1.45564e-05, 1.19901, 0.227089, -8.41413e-06, 0.404216, 4.72707e-06, 0.239725, -0.000215083, 0.426708, 0.000120833, 0.239904, -0.000860718, 0.427028, 0.000483555, 0.239911, -0.00193661, 0.427039, 0.00108806, 0.239914, -0.00344276, 0.42704, 0.00193457, 0.239933, -0.00537907, 0.427064, 0.00302363, 0.239944, -0.00774482, 0.427065, 0.00435604, 0.239993, -0.01054, 0.427122, 0.00593398, 0.240052, -0.0137626, 0.427179, 0.00775987, 0.240148, -0.0174115, 0.427279, 0.00983854, 0.240278, -0.021484, 0.42741, 0.0121763, 0.240472, -0.0259729, 0.427618, 0.0147827, 0.240839, -0.0308131, 0.428086, 0.0176837, 0.241201, -0.0360893, 0.428482, 0.0208775, 0.241626, -0.0417723, 0.428907, 0.0243821, 0.242207, -0.0478337, 0.42952, 0.0282228, 0.24298, -0.0542199, 0.430332, 0.0324333, 0.243881, -0.0610015, 0.431222, 0.0370252, 0.245123, -0.0680874, 0.432512, 0.0420535, 0.24667, -0.0755482, 0.434088, 0.0475414, 0.248779, -0.0832873, 0.436323, 0.0535542, 0.251665, -0.0913546, 0.439509, 0.0601716, 0.255305, -0.0998489, 0.443478, 0.0674282, 0.260049, -0.108576, 0.448713, 0.0754673, 0.266192, -0.117754, 0.455524, 0.084339, 0.273158, -0.127294, 0.4627, 0.0941683, 0.282131, -0.137311, 0.472068, 0.10515, 0.293332, -0.147736, 0.483565, 0.117402, 0.304667, -0.158357, 0.493702, 0.130824, 0.317785, -0.169274, 0.504708, 0.145724, 0.333245, -0.180595, 0.517107, 0.16215, 0.349843, -0.191892, 0.528849, 0.180149, 0.367944, -0.203168, 0.540301, 0.199746, 0.387579, -0.214443, 0.551514, 0.221047, 0.408247, -0.225624, 0.560906, 0.243981, 0.43014, -0.236422, 0.56959, 0.268513, 0.452669, -0.24654, 0.576098, 0.294409, 0.476196, -0.256157, 0.580925, 0.322002, 0.501157, -0.265289, 0.584839, 0.351052, 0.527632, -0.273671, 0.587614, 0.3812, 0.555754, -0.281254, 0.589119, 0.412994, 0.581682, -0.287448, 0.585204, 0.445498, 0.608196, -0.292614, 0.579006, 0.479505, 0.635661, -0.296068, 0.571297, 0.514643, 0.664999, -0.297395, 0.560855, 0.552213, 0.691039, -0.296645, 0.544525, 0.591365, 0.7179, -0.293785, 0.526535, 0.630883, 0.744059, -0.289089, 0.50545, 0.670932, 0.76863, -0.282239, 0.482514, 0.710904, 0.793273, -0.273688, 0.457246, 0.750259, 0.814731, -0.26328, 0.428872, 0.78948, 0.835603, -0.251526, 0.399384, 0.828597, 0.85489, -0.238339, 0.368811, 0.866892, 0.872828, -0.223607, 0.336617, 0.90563, 0.889462, -0.207538, 0.303997, 0.943538, 0.904929, -0.190297, 0.270812, 0.980591, 0.919101, -0.172034, 0.237453, 1.01935, 0.930536, -0.152058, 0.204431, 1.05498, 0.941223, -0.129515, 0.172495, 1.08717, 0.94982, -0.104263, 0.140175, 1.11551, 0.960592, -0.0781944, 0.106465, 1.14098, 0.974629, -0.051688, 0.0711592, 1.16418, 0.98811, -0.0253929, 0.0354432, 1.18465, 1.00004, 0.000804378, -0.000330876, 1.20462, 0.214668, -8.21282e-06, 0.406619, 4.33582e-06, 0.218053, -0.000208144, 0.413025, 0.000109887, 0.217987, -0.000832212, 0.412901, 0.000439362, 0.217971, -0.00187246, 0.412876, 0.000988623, 0.217968, -0.00332855, 0.41286, 0.00175772, 0.217985, -0.00520055, 0.412882, 0.00274729, 0.218014, -0.00748814, 0.412916, 0.00395842, 0.218054, -0.0101901, 0.412957, 0.00539274, 0.218106, -0.0133057, 0.413005, 0.00705348, 0.218217, -0.0168342, 0.413139, 0.00894581, 0.218338, -0.0207707, 0.413258, 0.0110754, 0.21855, -0.0251001, 0.413509, 0.0134551, 0.218913, -0.0297861, 0.413992, 0.0161081, 0.219265, -0.0348956, 0.414383, 0.0190307, 0.219696, -0.0403909, 0.414839, 0.0222458, 0.220329, -0.0462003, 0.415567, 0.025792, 0.220989, -0.0524208, 0.41621, 0.0296637, 0.222027, -0.058948, 0.417385, 0.0339323, 0.223301, -0.0658208, 0.418779, 0.0386055, 0.224988, -0.0730347, 0.420665, 0.0437355, 0.227211, -0.0805274, 0.423198, 0.0493844, 0.230131, -0.088395, 0.426566, 0.0556135, 0.233908, -0.0966208, 0.43091, 0.0624829, 0.239092, -0.105223, 0.437148, 0.0701636, 0.245315, -0.11424, 0.444302, 0.0786949, 0.253166, -0.12368, 0.453262, 0.0882382, 0.262374, -0.133569, 0.463211, 0.0988682, 0.273145, -0.143836, 0.474271, 0.110727, 0.285512, -0.154577, 0.4863, 0.123945, 0.299512, -0.165501, 0.498817, 0.138581, 0.314287, -0.176698, 0.510341, 0.154676, 0.331083, -0.188066, 0.522583, 0.172459, 0.349615, -0.199597, 0.534879, 0.191979, 0.369318, -0.210843, 0.546083, 0.21309, 0.390377, -0.222068, 0.5562, 0.235998, 0.412411, -0.233059, 0.564704, 0.260518, 0.435715, -0.24357, 0.572314, 0.286795, 0.461196, -0.253356, 0.579395, 0.314559, 0.485587, -0.262362, 0.581985, 0.343581, 0.511908, -0.270895, 0.584347, 0.374367, 0.539798, -0.278452, 0.58505, 0.406015, 0.567974, -0.284877, 0.583344, 0.439168, 0.594303, -0.290124, 0.577348, 0.473005, 0.622951, -0.294183, 0.570751, 0.508534, 0.652404, -0.296389, 0.561541, 0.544764, 0.679291, -0.296605, 0.546426, 0.582927, 0.706437, -0.294095, 0.528599, 0.622681, 0.734485, -0.28978, 0.508676, 0.663567, 0.758841, -0.283363, 0.484768, 0.704092, 0.78537, -0.275015, 0.460434, 0.745101, 0.807315, -0.264689, 0.432166, 0.784712, 0.8271, -0.252597, 0.401807, 0.824241, 0.849191, -0.239154, 0.371458, 0.863803, 0.867046, -0.224451, 0.338873, 0.903063, 0.8852, -0.208342, 0.306175, 0.942763, 0.901771, -0.190684, 0.272759, 0.981559, 0.915958, -0.172105, 0.239306, 1.02048, 0.928046, -0.152214, 0.206071, 1.05765, 0.939961, -0.130247, 0.17367, 1.08999, 0.948711, -0.10672, 0.142201, 1.11829, 0.959305, -0.0808688, 0.108454, 1.14467, 0.973009, -0.0539145, 0.0728109, 1.16839, 0.987631, -0.0262947, 0.0360625, 1.19004, 0.999978, 0.00132758, -0.000559424, 1.21058, 0.193925, -7.93421e-06, 0.391974, 3.92537e-06, 0.196746, -0.000200315, 0.397675, 9.91033e-05, 0.19667, -0.000801099, 0.397521, 0.000396342, 0.196633, -0.00180246, 0.397445, 0.000891829, 0.196654, -0.00320443, 0.397482, 0.00158582, 0.196659, -0.00500647, 0.39748, 0.00247867, 0.196683, -0.0072086, 0.397506, 0.00357167, 0.196728, -0.00981001, 0.397562, 0.00486675, 0.196792, -0.0128096, 0.397633, 0.00636707, 0.19689, -0.0162055, 0.397746, 0.00807752, 0.197017, -0.0199943, 0.397884, 0.0100052, 0.19729, -0.024139, 0.39827, 0.0121691, 0.197583, -0.0286671, 0.398639, 0.0145755, 0.197927, -0.0335858, 0.399034, 0.0172355, 0.198383, -0.0388806, 0.399554, 0.0201718, 0.199002, -0.0444736, 0.400289, 0.0234194, 0.199739, -0.0504583, 0.401111, 0.026984, 0.200784, -0.056729, 0.402349, 0.0309217, 0.202075, -0.0633643, 0.403841, 0.0352496, 0.203898, -0.0703247, 0.406076, 0.0400313, 0.206199, -0.0775565, 0.408841, 0.0453282, 0.209252, -0.085184, 0.41259, 0.0511794, 0.213638, -0.0931994, 0.418288, 0.0577459, 0.21881, -0.101617, 0.424681, 0.0650508, 0.225642, -0.11052, 0.433429, 0.0732759, 0.233717, -0.119772, 0.442897, 0.0824683, 0.242823, -0.129505, 0.452888, 0.0927484, 0.254772, -0.139906, 0.466407, 0.104417, 0.266603, -0.150402, 0.477413, 0.117211, 0.28073, -0.161395, 0.490519, 0.131598, 0.295399, -0.172465, 0.50201, 0.147407, 0.312705, -0.183982, 0.515311, 0.165031, 0.331335, -0.195532, 0.52786, 0.184336, 0.351037, -0.206971, 0.5392, 0.205361, 0.372175, -0.218117, 0.54941, 0.228043, 0.394548, -0.229327, 0.558642, 0.25267, 0.419598, -0.240052, 0.567861, 0.279071, 0.443922, -0.249937, 0.573332, 0.306882, 0.471495, -0.259407, 0.58013, 0.33661, 0.496769, -0.267749, 0.580564, 0.367328, 0.524951, -0.275524, 0.581696, 0.399753, 0.55318, -0.282148, 0.579885, 0.433134, 0.581577, -0.287533, 0.575471, 0.467534, 0.609231, -0.291612, 0.567445, 0.502943, 0.637478, -0.293911, 0.557657, 0.53871, 0.667795, -0.295096, 0.546535, 0.576568, 0.694272, -0.294073, 0.529561, 0.614929, 0.722937, -0.290386, 0.510561, 0.655909, 0.749682, -0.284481, 0.487846, 0.697663, 0.774754, -0.276188, 0.462487, 0.738515, 0.799301, -0.266215, 0.43481, 0.779802, 0.820762, -0.254116, 0.404879, 0.820045, 0.843231, -0.240393, 0.374559, 0.860294, 0.861857, -0.225503, 0.341582, 0.900965, 0.880815, -0.209382, 0.308778, 0.941727, 0.89766, -0.19155, 0.275232, 0.980916, 0.912926, -0.172346, 0.240938, 1.02162, 0.926391, -0.151799, 0.207223, 1.0597, 0.938429, -0.129968, 0.17484, 1.09291, 0.947834, -0.10651, 0.142984, 1.12248, 0.958432, -0.0824098, 0.109902, 1.149, 0.972402, -0.0565242, 0.0744454, 1.1733, 0.987191, -0.028427, 0.0373794, 1.19538, 0.999975, 3.85685e-05, -4.203e-05, 1.21676, 0.178114, -7.66075e-06, 0.385418, 3.54027e-06, 0.176074, -0.000191966, 0.381002, 8.87135e-05, 0.17601, -0.000767549, 0.380861, 0.000354715, 0.17598, -0.00172696, 0.380798, 0.000798168, 0.175994, -0.00307012, 0.380824, 0.00141928, 0.176017, -0.00479684, 0.380858, 0.00221859, 0.176019, -0.00690648, 0.380839, 0.00319714, 0.176072, -0.00939888, 0.380913, 0.0043572, 0.176131, -0.0122726, 0.380979, 0.005702, 0.176239, -0.0155264, 0.38112, 0.00723689, 0.176371, -0.0191551, 0.381272, 0.00896907, 0.176638, -0.023117, 0.381669, 0.0109194, 0.176912, -0.0274633, 0.382015, 0.0130903, 0.177279, -0.032173, 0.382476, 0.0154949, 0.17774, -0.0372219, 0.383041, 0.0181669, 0.178344, -0.0426132, 0.38378, 0.0211209, 0.179153, -0.0483309, 0.384773, 0.0243899, 0.180197, -0.0543447, 0.386076, 0.0280062, 0.181581, -0.0607122, 0.387809, 0.032004, 0.18344, -0.0673855, 0.390205, 0.036453, 0.186139, -0.0743989, 0.393944, 0.0414162, 0.189432, -0.0817731, 0.39832, 0.0469394, 0.193795, -0.0895464, 0.404188, 0.0531442, 0.199641, -0.0978264, 0.4121, 0.0601374, 0.206679, -0.106499, 0.421425, 0.0680078, 0.214865, -0.115654, 0.431504, 0.076919, 0.224406, -0.125268, 0.442526, 0.0868835, 0.235876, -0.135475, 0.455465, 0.0981875, 0.248335, -0.146023, 0.4681, 0.110759, 0.262868, -0.157016, 0.482069, 0.124885, 0.278962, -0.168245, 0.496182, 0.140645, 0.295082, -0.17958, 0.507401, 0.157838, 0.313738, -0.191227, 0.520252, 0.17695, 0.333573, -0.202718, 0.531708, 0.197817, 0.356433, -0.214424, 0.544509, 0.220785, 0.378853, -0.225492, 0.55373, 0.245306, 0.402717, -0.236236, 0.561348, 0.271593, 0.428375, -0.246568, 0.568538, 0.299776, 0.454724, -0.255941, 0.573462, 0.329433, 0.482291, -0.264511, 0.576356, 0.360598, 0.509706, -0.272129, 0.576446, 0.393204, 0.538805, -0.278979, 0.575298, 0.427227, 0.568919, -0.284528, 0.572154, 0.462157, 0.596804, -0.288801, 0.564691, 0.497997, 0.625987, -0.291334, 0.555134, 0.534467, 0.656414, -0.292722, 0.545051, 0.571736, 0.683916, -0.292185, 0.528813, 0.610158, 0.711809, -0.290043, 0.51106, 0.649061, 0.739547, -0.285246, 0.490103, 0.690081, 0.766914, -0.277647, 0.465523, 0.732554, 0.791375, -0.267603, 0.437718, 0.773982, 0.814772, -0.256109, 0.40882, 0.81609, 0.836691, -0.242281, 0.377823, 0.856849, 0.856984, -0.227155, 0.34496, 0.898363, 0.876332, -0.210395, 0.311335, 0.939471, 0.894988, -0.192612, 0.277703, 0.980799, 0.911113, -0.173236, 0.243019, 1.02215, 0.924092, -0.152258, 0.209037, 1.06139, 0.936828, -0.129575, 0.175909, 1.09635, 0.946869, -0.10594, 0.143852, 1.12707, 0.958284, -0.081318, 0.110289, 1.15419, 0.972325, -0.0556133, 0.0747232, 1.17909, 0.986878, -0.0297899, 0.0383149, 1.20163, 0.999936, -0.00197169, 0.000912402, 1.22338, 0.151174, -7.20365e-06, 0.351531, 3.09789e-06, 0.155594, -0.00018279, 0.361806, 7.8608e-05, 0.156099, -0.000731569, 0.362982, 0.000314615, 0.156053, -0.00164578, 0.362869, 0.000707845, 0.156093, -0.0029261, 0.362961, 0.00125884, 0.156099, -0.00457155, 0.362959, 0.00196783, 0.15612, -0.00658224, 0.362982, 0.00283622, 0.156168, -0.00895774, 0.363048, 0.00386625, 0.156221, -0.0116962, 0.363101, 0.00506109, 0.156324, -0.0147973, 0.363241, 0.00642675, 0.156476, -0.0182503, 0.363448, 0.00797175, 0.156731, -0.0220266, 0.36384, 0.00971484, 0.156994, -0.026176, 0.364179, 0.0116575, 0.157341, -0.0306701, 0.36462, 0.0138207, 0.157867, -0.0354591, 0.365364, 0.0162356, 0.15846, -0.0406141, 0.366111, 0.0189092, 0.159308, -0.0460519, 0.367248, 0.021885, 0.160426, -0.0518096, 0.368767, 0.0252004, 0.161877, -0.0578906, 0.370745, 0.0288825, 0.163995, -0.0642812, 0.373831, 0.0330139, 0.16655, -0.0710067, 0.377366, 0.0376283, 0.170237, -0.0781522, 0.382799, 0.0428493, 0.175096, -0.0857172, 0.389915, 0.0487324, 0.181069, -0.0938025, 0.398487, 0.0554214, 0.188487, -0.102363, 0.408799, 0.0630189, 0.197029, -0.111343, 0.419991, 0.071634, 0.206684, -0.120812, 0.431455, 0.0812797, 0.218698, -0.131033, 0.445746, 0.0923651, 0.230726, -0.141373, 0.457471, 0.104545, 0.245516, -0.152387, 0.472388, 0.118449, 0.261551, -0.163628, 0.486671, 0.133923, 0.277437, -0.174814, 0.49762, 0.150849, 0.296662, -0.186713, 0.51162, 0.169924, 0.31795, -0.198513, 0.525435, 0.190848, 0.339422, -0.210119, 0.536267, 0.213504, 0.362143, -0.221354, 0.545982, 0.237947, 0.387198, -0.23224, 0.555364, 0.264427, 0.412349, -0.24257, 0.561489, 0.292519, 0.439274, -0.252284, 0.566903, 0.322561, 0.466779, -0.261023, 0.569614, 0.353952, 0.496011, -0.26899, 0.571589, 0.387278, 0.524964, -0.275498, 0.570325, 0.421356, 0.556518, -0.281449, 0.568792, 0.457314, 0.584363, -0.285526, 0.560268, 0.493199, 0.614214, -0.28844, 0.55205, 0.530276, 0.645684, -0.289777, 0.541906, 0.56855, 0.673446, -0.289722, 0.526464, 0.606927, 0.701924, -0.287792, 0.509872, 0.645945, 0.73037, -0.284315, 0.490649, 0.685564, 0.757405, -0.278804, 0.467964, 0.726511, 0.784025, -0.269543, 0.441468, 0.768601, 0.808255, -0.258117, 0.41216, 0.811321, 0.830739, -0.244728, 0.380606, 0.853496, 0.851914, -0.229428, 0.348111, 0.895374, 0.872586, -0.212508, 0.314732, 0.937674, 0.891581, -0.194025, 0.280338, 0.979869, 0.907641, -0.174711, 0.245203, 1.02253, 0.922233, -0.153509, 0.21077, 1.06371, 0.935878, -0.130418, 0.177399, 1.09972, 0.946338, -0.105558, 0.144507, 1.13124, 0.957265, -0.080059, 0.110508, 1.15973, 0.971668, -0.0539766, 0.0742311, 1.18515, 0.9866, -0.0277101, 0.0375224, 1.20858, 1.00021, -0.000515531, 0.000135226, 1.23135, 0.137468, -6.86011e-06, 0.345041, 2.73315e-06, 0.13703, -0.000173378, 0.343936, 6.90761e-05, 0.136986, -0.000693048, 0.34383, 0.000276126, 0.136964, -0.00155931, 0.343761, 0.000621337, 0.137003, -0.00277211, 0.343863, 0.00110494, 0.137012, -0.00433103, 0.343868, 0.00172744, 0.137043, -0.00623606, 0.343916, 0.00249022, 0.13709, -0.0084868, 0.343986, 0.00339559, 0.137145, -0.0110814, 0.344045, 0.00444687, 0.137242, -0.0140187, 0.344177, 0.00565007, 0.137431, -0.0172713, 0.344491, 0.00701868, 0.137644, -0.0208605, 0.344805, 0.00856042, 0.13791, -0.024792, 0.345172, 0.0102863, 0.138295, -0.0290461, 0.345734, 0.0122185, 0.138764, -0.0335957, 0.346371, 0.0143771, 0.139415, -0.038467, 0.347298, 0.0167894, 0.140272, -0.0436176, 0.348527, 0.0194895, 0.141457, -0.0491016, 0.350276, 0.0225043, 0.14303, -0.0548764, 0.352646, 0.0258962, 0.145289, -0.0610096, 0.356206, 0.0297168, 0.148502, -0.0674777, 0.361488, 0.0340562, 0.152188, -0.074345, 0.367103, 0.0389534, 0.157359, -0.0817442, 0.375247, 0.0445541, 0.16379, -0.0896334, 0.385064, 0.0509535, 0.171376, -0.098005, 0.396082, 0.0582611, 0.179901, -0.106817, 0.407418, 0.06654, 0.189892, -0.116239, 0.420031, 0.075994, 0.201838, -0.12627, 0.434321, 0.0867239, 0.214311, -0.136701, 0.447631, 0.0987517, 0.228902, -0.147616, 0.462046, 0.112353, 0.245107, -0.158871, 0.476942, 0.127605, 0.262292, -0.170261, 0.490285, 0.144469, 0.281215, -0.182017, 0.503783, 0.163282, 0.301058, -0.193729, 0.515505, 0.183873, 0.322752, -0.205512, 0.52682, 0.206466, 0.347547, -0.217214, 0.539473, 0.231194, 0.370969, -0.227966, 0.546625, 0.257288, 0.397533, -0.238555, 0.55472, 0.285789, 0.42398, -0.248278, 0.559468, 0.315746, 0.452928, -0.257422, 0.564095, 0.347724, 0.482121, -0.265306, 0.565426, 0.380922, 0.510438, -0.272043, 0.563205, 0.415639, 0.541188, -0.277614, 0.561087, 0.451702, 0.571667, -0.281927, 0.554922, 0.48845, 0.602432, -0.285015, 0.546838, 0.526442, 0.634126, -0.286512, 0.537415, 0.564896, 0.662816, -0.286388, 0.522906, 0.604037, 0.692411, -0.284734, 0.507003, 0.643795, 0.720946, -0.281297, 0.488398, 0.68298, 0.748293, -0.276262, 0.466353, 0.723466, 0.776931, -0.269978, 0.443573, 0.764565, 0.801065, -0.260305, 0.415279, 0.805838, 0.825843, -0.247426, 0.384773, 0.849985, 0.84807, -0.232437, 0.352555, 0.893174, 0.869122, -0.215806, 0.318642, 0.936564, 0.888963, -0.197307, 0.28381, 0.980253, 0.905547, -0.177203, 0.247888, 1.02463, 0.918554, -0.155542, 0.212904, 1.06714, 0.931395, -0.131948, 0.1787, 1.10451, 0.941749, -0.106723, 0.145902, 1.13694, 0.954551, -0.0804939, 0.111193, 1.1666, 0.970279, -0.0534239, 0.0744697, 1.19249, 0.986117, -0.0257452, 0.0368788, 1.21665, 0.999938, 0.00190634, -0.0010291, 1.23981, 0.118493, -6.47439e-06, 0.32272, 2.3772e-06, 0.118765, -0.000163023, 0.323456, 5.98573e-05, 0.118772, -0.00065212, 0.323477, 0.000239447, 0.118843, -0.00146741, 0.323657, 0.000538881, 0.118804, -0.00260846, 0.323553, 0.00095826, 0.118826, -0.00407576, 0.323595, 0.00149845, 0.118846, -0.00586826, 0.323617, 0.00216047, 0.118886, -0.00798578, 0.32367, 0.00294679, 0.118947, -0.0104273, 0.323753, 0.00386124, 0.119055, -0.0131909, 0.323922, 0.00490999, 0.119241, -0.0162444, 0.324251, 0.00610804, 0.11944, -0.0196339, 0.324544, 0.00745805, 0.119739, -0.0233378, 0.325026, 0.00897805, 0.12011, -0.0273179, 0.325586, 0.0106895, 0.120571, -0.0316143, 0.326231, 0.0126073, 0.12124, -0.0361939, 0.327264, 0.0147654, 0.122162, -0.0410511, 0.328733, 0.0172001, 0.123378, -0.0462233, 0.330659, 0.0199375, 0.125183, -0.0517109, 0.333754, 0.0230498, 0.127832, -0.0575652, 0.338507, 0.026597, 0.130909, -0.0637441, 0.343666, 0.0306345, 0.135221, -0.0704302, 0.351063, 0.035273, 0.14082, -0.0776364, 0.360604, 0.0406137, 0.146781, -0.0852293, 0.369638, 0.0466788, 0.155121, -0.0935351, 0.3827, 0.0537628, 0.16398, -0.102234, 0.39522, 0.0617985, 0.173926, -0.111465, 0.40793, 0.07097, 0.185137, -0.121296, 0.42105, 0.0813426, 0.19826, -0.13169, 0.435735, 0.0931596, 0.212938, -0.142614, 0.450932, 0.106547, 0.229046, -0.153884, 0.465726, 0.121575, 0.246246, -0.165382, 0.479461, 0.138286, 0.264637, -0.176806, 0.492106, 0.15666, 0.284959, -0.188793, 0.504774, 0.17728, 0.308157, -0.200763, 0.518805, 0.19988, 0.330951, -0.21239, 0.528231, 0.224293, 0.3549, -0.223521, 0.536376, 0.250541, 0.381502, -0.234169, 0.544846, 0.278902, 0.409529, -0.244077, 0.551717, 0.309227, 0.437523, -0.253363, 0.55517, 0.341426, 0.467624, -0.261659, 0.557772, 0.37518, 0.497268, -0.268498, 0.556442, 0.41007, 0.528294, -0.274018, 0.553915, 0.446445, 0.559053, -0.278169, 0.549153, 0.483779, 0.589329, -0.281229, 0.539878, 0.522249, 0.622503, -0.282902, 0.53162, 0.561754, 0.652382, -0.282815, 0.518119, 0.601544, 0.681847, -0.281247, 0.502187, 0.641574, 0.712285, -0.277986, 0.484824, 0.682633, 0.740094, -0.273017, 0.463483, 0.723426, 0.768478, -0.266692, 0.441299, 0.763747, 0.794556, -0.258358, 0.415238, 0.805565, 0.819408, -0.248807, 0.386912, 0.847254, 0.843411, -0.236214, 0.356165, 0.891091, 0.862397, -0.219794, 0.320562, 0.936174, 0.883113, -0.201768, 0.285322, 0.982562, 0.90023, -0.181672, 0.249713, 1.02862, 0.915192, -0.159279, 0.214546, 1.07163, 0.928458, -0.134725, 0.180285, 1.10995, 0.94069, -0.10913, 0.147119, 1.14354, 0.953409, -0.0821315, 0.112492, 1.17372, 0.969537, -0.0542677, 0.0752014, 1.20043, 0.985612, -0.0259096, 0.0370361, 1.22528, 0.999835, 0.00298198, -0.00151801, 1.24959, 0.10097, -6.02574e-06, 0.300277, 2.02619e-06, 0.101577, -0.000152164, 0.302077, 5.11662e-05, 0.101572, -0.000608889, 0.302066, 0.000204751, 0.101566, -0.00136997, 0.302047, 0.000460753, 0.101592, -0.00243557, 0.302114, 0.000819497, 0.101608, -0.0038053, 0.30214, 0.00128154, 0.101627, -0.00547906, 0.30216, 0.0018483, 0.101669, -0.00745647, 0.302224, 0.00252223, 0.101732, -0.00973615, 0.302318, 0.00330716, 0.101844, -0.0123097, 0.302513, 0.00421061, 0.102025, -0.0151681, 0.30285, 0.00524481, 0.102224, -0.0183334, 0.303166, 0.0064154, 0.102515, -0.0217819, 0.303654, 0.00774063, 0.102886, -0.0255067, 0.304243, 0.0092398, 0.103395, -0.029514, 0.305089, 0.0109339, 0.104109, -0.0337912, 0.306301, 0.0128561, 0.105074, -0.0383565, 0.30798, 0.0150338, 0.10654, -0.0432132, 0.310726, 0.0175228, 0.108478, -0.0484244, 0.314351, 0.0203648, 0.111015, -0.0539339, 0.319032, 0.0236325, 0.114682, -0.0598885, 0.32605, 0.0274188, 0.11911, -0.0663375, 0.334109, 0.0317905, 0.124736, -0.0733011, 0.344013, 0.0368502, 0.131479, -0.0807744, 0.355358, 0.0427104, 0.139283, -0.0888204, 0.367614, 0.0494788, 0.148054, -0.0973394, 0.380072, 0.0572367, 0.159037, -0.10665, 0.395678, 0.0662704, 0.169794, -0.116221, 0.40795, 0.0763192, 0.18314, -0.126632, 0.423546, 0.087956, 0.197515, -0.137383, 0.438213, 0.101042, 0.213514, -0.148641, 0.453248, 0.115827, 0.23065, -0.160117, 0.46688, 0.132283, 0.249148, -0.171807, 0.479962, 0.150644, 0.270219, -0.183695, 0.494618, 0.171073, 0.292338, -0.195574, 0.506937, 0.193378, 0.314999, -0.207205, 0.516463, 0.217585, 0.340991, -0.218955, 0.528123, 0.24428, 0.367982, -0.229917, 0.537025, 0.272784, 0.39432, -0.239737, 0.541627, 0.302742, 0.423364, -0.249048, 0.546466, 0.335112, 0.453751, -0.257329, 0.549466, 0.369032, 0.48416, -0.264623, 0.549503, 0.404577, 0.515262, -0.270411, 0.547008, 0.441337, 0.547036, -0.274581, 0.542249, 0.479162, 0.576614, -0.277266, 0.533015, 0.517904, 0.611143, -0.279144, 0.525512, 0.558508, 0.640989, -0.279001, 0.51154, 0.598995, 0.671182, -0.277324, 0.495641, 0.639935, 0.700848, -0.273908, 0.477526, 0.681017, 0.729862, -0.269063, 0.457955, 0.722764, 0.758273, -0.262282, 0.434846, 0.764349, 0.784121, -0.254281, 0.409203, 0.806206, 0.809798, -0.24505, 0.382694, 0.848617, 0.834953, -0.233861, 0.354034, 0.892445, 0.856817, -0.221308, 0.321764, 0.936263, 0.877609, -0.205996, 0.288118, 0.982401, 0.897489, -0.186702, 0.253277, 1.02975, 0.913792, -0.164618, 0.217963, 1.07488, 0.92785, -0.140023, 0.183221, 1.11487, 0.940378, -0.11328, 0.149385, 1.14947, 0.95273, -0.0853958, 0.114152, 1.1807, 0.969059, -0.0568698, 0.0769845, 1.20912, 0.985574, -0.0276502, 0.0381186, 1.23498, 0.999943, 0.00239052, -0.00126861, 1.25987, 0.0852715, -5.60067e-06, 0.279021, 1.71162e-06, 0.0854143, -0.000140871, 0.279483, 4.30516e-05, 0.0854191, -0.000563385, 0.2795, 0.000172184, 0.0854188, -0.00126753, 0.279493, 0.000387464, 0.0854229, -0.00225337, 0.279501, 0.00068918, 0.0854443, -0.00352086, 0.279549, 0.00107803, 0.0854697, -0.00506962, 0.279591, 0.00155536, 0.0855093, -0.00689873, 0.279652, 0.00212354, 0.0855724, -0.00900821, 0.279752, 0.00278703, 0.0856991, -0.0113799, 0.280011, 0.0035551, 0.085855, -0.0140314, 0.280297, 0.00443449, 0.0860682, -0.016963, 0.280682, 0.00543636, 0.086344, -0.0201438, 0.281159, 0.0065788, 0.0867426, -0.0235999, 0.281886, 0.00787977, 0.087239, -0.0273069, 0.282745, 0.0093606, 0.0879815, -0.031269, 0.284139, 0.011056, 0.0891258, -0.035531, 0.28647, 0.0130065, 0.0906909, -0.0400947, 0.289708, 0.0152495, 0.0927624, -0.0449638, 0.293904, 0.0178454, 0.0958376, -0.0502427, 0.300471, 0.0208915, 0.0995827, -0.0559514, 0.30806, 0.0244247, 0.104526, -0.0622152, 0.317874, 0.0285721, 0.110532, -0.0690046, 0.329332, 0.0334227, 0.117385, -0.0763068, 0.341217, 0.0390466, 0.12522, -0.084184, 0.353968, 0.0455786, 0.134037, -0.0925248, 0.366797, 0.0530773, 0.144014, -0.101487, 0.380209, 0.0617424, 0.156013, -0.111273, 0.395956, 0.071777, 0.168872, -0.121431, 0.41053, 0.0830905, 0.183089, -0.132105, 0.425073, 0.0959341, 0.198763, -0.143286, 0.439833, 0.110448, 0.216159, -0.154841, 0.454507, 0.126769, 0.234859, -0.166588, 0.468368, 0.14495, 0.255879, -0.178626, 0.482846, 0.165233, 0.27677, -0.190218, 0.493489, 0.187217, 0.301184, -0.202227, 0.506549, 0.211659, 0.325852, -0.213764, 0.5158, 0.237922, 0.352824, -0.22487, 0.525442, 0.26632, 0.380882, -0.235246, 0.532487, 0.296691, 0.410137, -0.244847, 0.537703, 0.329179, 0.439787, -0.253122, 0.540361, 0.363135, 0.472291, -0.260517, 0.542734, 0.399222, 0.501856, -0.266519, 0.538826, 0.436352, 0.534816, -0.270905, 0.535152, 0.474505, 0.565069, -0.273826, 0.525979, 0.513988, 0.597154, -0.275333, 0.516394, 0.554852, 0.630473, -0.275314, 0.506206, 0.596592, 0.660574, -0.273323, 0.489769, 0.638117, 0.692015, -0.270008, 0.472578, 0.680457, 0.720647, -0.265001, 0.452134, 0.723008, 0.750528, -0.258311, 0.430344, 0.765954, 0.777568, -0.250046, 0.405624, 0.809012, 0.80387, -0.240114, 0.378339, 0.852425, 0.828439, -0.228737, 0.349877, 0.895346, 0.851472, -0.216632, 0.318968, 0.940695, 0.873906, -0.202782, 0.287489, 0.987235, 0.89467, -0.187059, 0.254394, 1.03348, 0.912281, -0.168818, 0.221294, 1.07812, 0.927358, -0.146494, 0.18675, 1.11928, 0.940385, -0.120009, 0.152322, 1.15609, 0.952672, -0.0917183, 0.117514, 1.18875, 0.968496, -0.0620321, 0.0797405, 1.21821, 0.985236, -0.0314945, 0.0402383, 1.24523, 0.99998, -0.000575153, 0.000110644, 1.27133, 0.0702429, -5.12222e-06, 0.255273, 1.40947e-06, 0.0702981, -0.000128826, 0.255469, 3.54488e-05, 0.0703691, -0.000515562, 0.255727, 0.000141874, 0.0703805, -0.00116, 0.255754, 0.00031929, 0.0703961, -0.00206224, 0.255813, 0.000567999, 0.0704102, -0.00322223, 0.255839, 0.00088871, 0.0704298, -0.00463928, 0.255863, 0.00128272, 0.0704759, -0.00631375, 0.255953, 0.00175283, 0.0705434, -0.00824317, 0.256079, 0.00230342, 0.0706693, -0.010412, 0.25636, 0.0029443, 0.0708189, -0.0128439, 0.256647, 0.00368031, 0.0710364, -0.0155177, 0.257084, 0.00452614, 0.0713223, -0.0184374, 0.257637, 0.00549706, 0.0717182, -0.0216002, 0.258416, 0.00661246, 0.072321, -0.0249966, 0.259699, 0.00790147, 0.0731446, -0.0286566, 0.261475, 0.0093884, 0.0743352, -0.0325888, 0.264132, 0.0111186, 0.0760676, -0.036843, 0.26815, 0.013145, 0.078454, -0.0414292, 0.273636, 0.0155251, 0.0818618, -0.0464634, 0.281653, 0.0183525, 0.0857382, -0.0519478, 0.289992, 0.0216642, 0.0908131, -0.0579836, 0.30066, 0.0255956, 0.0967512, -0.0645124, 0.312204, 0.0301954, 0.103717, -0.0716505, 0.325001, 0.0356017, 0.111596, -0.0793232, 0.338129, 0.041896, 0.120933, -0.087645, 0.352853, 0.0492447, 0.130787, -0.096492, 0.366192, 0.0576749, 0.142311, -0.105973, 0.380864, 0.0673969, 0.155344, -0.116182, 0.396575, 0.0785899, 0.169535, -0.126815, 0.411443, 0.0912377, 0.185173, -0.138015, 0.426256, 0.105607, 0.201755, -0.149325, 0.439607, 0.121551, 0.221334, -0.161207, 0.455467, 0.139608, 0.241461, -0.173162, 0.469096, 0.159591, 0.26294, -0.18504, 0.481014, 0.18156, 0.286776, -0.196881, 0.493291, 0.205781, 0.311596, -0.208311, 0.503556, 0.231819, 0.338667, -0.219671, 0.513268, 0.260274, 0.366021, -0.230451, 0.519414, 0.290862, 0.395875, -0.240131, 0.526766, 0.323196, 0.425564, -0.248566, 0.52905, 0.357071, 0.457094, -0.256195, 0.530796, 0.393262, 0.488286, -0.262331, 0.528703, 0.430797, 0.522291, -0.267141, 0.52727, 0.470231, 0.554172, -0.270411, 0.519848, 0.510477, 0.586427, -0.271986, 0.510307, 0.551594, 0.619638, -0.27192, 0.499158, 0.593849, 0.650656, -0.269817, 0.483852, 0.636314, 0.68284, -0.266267, 0.467515, 0.679679, 0.714356, -0.26113, 0.44931, 0.723884, 0.742717, -0.254067, 0.425789, 0.767245, 0.770894, -0.245652, 0.401144, 0.811819, 0.797358, -0.235554, 0.374224, 0.856315, 0.823377, -0.223896, 0.346167, 0.901077, 0.847456, -0.210865, 0.316056, 0.946502, 0.870697, -0.196574, 0.284503, 0.993711, 0.891068, -0.180814, 0.251628, 1.04134, 0.909267, -0.163314, 0.219065, 1.08609, 0.925653, -0.143304, 0.186446, 1.12702, 0.940017, -0.121322, 0.153416, 1.16371, 0.952398, -0.0973872, 0.120334, 1.19712, 0.967568, -0.0698785, 0.08352, 1.22791, 0.984772, -0.0390031, 0.0439209, 1.25672, 1.00026, -0.0070087, 0.00315668, 1.28428, 0.0556653, -4.59654e-06, 0.227325, 1.12556e-06, 0.0565238, -0.000116382, 0.230826, 2.84985e-05, 0.0565717, -0.000465666, 0.231026, 0.000114036, 0.0565859, -0.00104773, 0.231079, 0.000256656, 0.0565761, -0.00186255, 0.231025, 0.00045663, 0.0565913, -0.00291002, 0.231058, 0.000714664, 0.0566108, -0.00418998, 0.231085, 0.00103224, 0.0566532, -0.00570206, 0.231169, 0.00141202, 0.0567473, -0.00743666, 0.231417, 0.00186018, 0.0568567, -0.00940298, 0.231661, 0.00238264, 0.0569859, -0.0115991, 0.231895, 0.00298699, 0.0572221, -0.0140096, 0.232456, 0.00368957, 0.057519, -0.0166508, 0.233096, 0.00450303, 0.0579534, -0.01951, 0.234094, 0.00544945, 0.0585922, -0.0225991, 0.235629, 0.00655564, 0.0595647, -0.0259416, 0.238106, 0.00785724, 0.0609109, -0.0295661, 0.241557, 0.00939127, 0.0628751, -0.0335126, 0.246652, 0.0112198, 0.0656908, -0.0378604, 0.254091, 0.0134168, 0.0691347, -0.0426543, 0.262666, 0.0160374, 0.0732165, -0.0478967, 0.272029, 0.0191514, 0.0782863, -0.0536716, 0.283007, 0.0228597, 0.0843973, -0.0600683, 0.295732, 0.0272829, 0.0913598, -0.0670095, 0.308779, 0.032484, 0.0994407, -0.0745516, 0.322886, 0.0385886, 0.108189, -0.082712, 0.336408, 0.0457133, 0.118574, -0.0914927, 0.351692, 0.0539832, 0.129989, -0.100854, 0.366502, 0.0635162, 0.142722, -0.110837, 0.381675, 0.0744386, 0.156654, -0.121353, 0.3963, 0.0868483, 0.172151, -0.132414, 0.411477, 0.100963, 0.188712, -0.143809, 0.42508, 0.116795, 0.208093, -0.155765, 0.441328, 0.134715, 0.227936, -0.167608, 0.454328, 0.154396, 0.249495, -0.179579, 0.467235, 0.176179, 0.27362, -0.191488, 0.480248, 0.200193, 0.296371, -0.202618, 0.487886, 0.225775, 0.324234, -0.214133, 0.499632, 0.25441, 0.353049, -0.225212, 0.509532, 0.285077, 0.381785, -0.234875, 0.514265, 0.317047, 0.414038, -0.244205, 0.521282, 0.351874, 0.445251, -0.252145, 0.522931, 0.388279, 0.476819, -0.258433, 0.520947, 0.425825, 0.509209, -0.263411, 0.517669, 0.465104, 0.542759, -0.266732, 0.512841, 0.505741, 0.574822, -0.268263, 0.503317, 0.547611, 0.609324, -0.268489, 0.493035, 0.590953, 0.641772, -0.266941, 0.478816, 0.63488, 0.674049, -0.263297, 0.462863, 0.679072, 0.705071, -0.257618, 0.442931, 0.723487, 0.734709, -0.250625, 0.421299, 0.768708, 0.763704, -0.24179, 0.397085, 0.814375, 0.791818, -0.231115, 0.370577, 0.859907, 0.817439, -0.21922, 0.34232, 0.906715, 0.843202, -0.205658, 0.312627, 0.953943, 0.866639, -0.190563, 0.280933, 1.00185, 0.888129, -0.173978, 0.248393, 1.05105, 0.907239, -0.155485, 0.216007, 1.09704, 0.923893, -0.134782, 0.183233, 1.13857, 0.938882, -0.11249, 0.150376, 1.17539, 0.952464, -0.0890706, 0.117177, 1.20924, 0.968529, -0.0646523, 0.0813095, 1.24055, 0.984763, -0.038606, 0.0439378, 1.27018, 1.00053, -0.01238, 0.00598668, 1.29873, 0.0437928, -4.09594e-06, 0.204012, 8.79224e-07, 0.0440166, -0.000103395, 0.205049, 2.21946e-05, 0.0440529, -0.000413633, 0.205225, 8.87981e-05, 0.0440493, -0.000930594, 0.2052, 0.000199858, 0.0439884, -0.00165352, 0.204901, 0.000355495, 0.0440716, -0.0025849, 0.205255, 0.000556983, 0.0440968, -0.00372222, 0.205311, 0.000805326, 0.0441359, -0.00506478, 0.205391, 0.00110333, 0.0442231, -0.00660384, 0.205638, 0.00145768, 0.0443254, -0.00835246, 0.205877, 0.00187275, 0.0444832, -0.0102992, 0.20627, 0.00235938, 0.0447001, -0.0124449, 0.206796, 0.0029299, 0.0450168, -0.0147935, 0.207593, 0.0036005, 0.0454816, -0.017336, 0.208819, 0.00439246, 0.0462446, -0.0201156, 0.211036, 0.00533864, 0.0473694, -0.0231568, 0.214388, 0.00646984, 0.0490191, -0.0264941, 0.219357, 0.00783856, 0.0512776, -0.030184, 0.226061, 0.00950182, 0.0541279, -0.0342661, 0.234094, 0.0115156, 0.0578989, -0.0388539, 0.244297, 0.0139687, 0.0620835, -0.0438735, 0.254457, 0.0169015, 0.0673497, -0.04951, 0.266706, 0.0204554, 0.0731759, -0.0556263, 0.278753, 0.0246606, 0.0803937, -0.0624585, 0.29309, 0.0297126, 0.0879287, -0.0697556, 0.305856, 0.0355868, 0.0970669, -0.0778795, 0.321059, 0.0425768, 0.106508, -0.0863541, 0.333873, 0.05056, 0.11776, -0.0955935, 0.349008, 0.0598972, 0.130081, -0.105438, 0.363776, 0.0706314, 0.144454, -0.115899, 0.380112, 0.0828822, 0.1596, -0.126827, 0.394843, 0.0967611, 0.176097, -0.138161, 0.409033, 0.112381, 0.194726, -0.149904, 0.424257, 0.129952, 0.213944, -0.161675, 0.436945, 0.149333, 0.235516, -0.173659, 0.450176, 0.170892, 0.260564, -0.185963, 0.466305, 0.194984, 0.285183, -0.197582, 0.477328, 0.220805, 0.311095, -0.208697, 0.486566, 0.248694, 0.338924, -0.219519, 0.494811, 0.279015, 0.369757, -0.229766, 0.504065, 0.311725, 0.3996, -0.238879, 0.507909, 0.345844, 0.430484, -0.246802, 0.509805, 0.381749, 0.46413, -0.253924, 0.511436, 0.420251, 0.497077, -0.259319, 0.508787, 0.459957, 0.530434, -0.263297, 0.50394, 0.501356, 0.565725, -0.265619, 0.49804, 0.544252, 0.599254, -0.265842, 0.487346, 0.587856, 0.631251, -0.263978, 0.472975, 0.631969, 0.663972, -0.26043, 0.457135, 0.677471, 0.697724, -0.255358, 0.439844, 0.723744, 0.727725, -0.248308, 0.417872, 0.770653, 0.756417, -0.239181, 0.39273, 0.817357, 0.785419, -0.22814, 0.367839, 0.864221, 0.81266, -0.215681, 0.339449, 0.912701, 0.839391, -0.201623, 0.309279, 0.962419, 0.86366, -0.185624, 0.278029, 1.0122, 0.885028, -0.16797, 0.245294, 1.06186, 0.904639, -0.148336, 0.212689, 1.10934, 0.922048, -0.12637, 0.179616, 1.15063, 0.936952, -0.102928, 0.146749, 1.18885, 0.951895, -0.0785268, 0.112733, 1.22352, 0.967198, -0.0530153, 0.0760056, 1.25681, 0.984405, -0.02649, 0.0383183, 1.28762, 1.00021, 0.00070019, -0.00020039, 1.31656, 0.0325964, -3.55447e-06, 0.176706, 6.55682e-07, 0.0329333, -8.99174e-05, 0.178527, 1.65869e-05, 0.0329181, -0.000359637, 0.178453, 6.63498e-05, 0.0329085, -0.000808991, 0.178383, 0.000149332, 0.0329181, -0.00143826, 0.178394, 0.000265873, 0.0329425, -0.00224678, 0.178517, 0.000416597, 0.0329511, -0.00323575, 0.17849, 0.000603299, 0.033011, -0.00439875, 0.178695, 0.000829422, 0.0330733, -0.00574059, 0.178843, 0.00109908, 0.0331857, -0.00725896, 0.179176, 0.00141933, 0.0333445, -0.00895289, 0.179618, 0.0017999, 0.0335674, -0.0108219, 0.180238, 0.00225316, 0.033939, -0.0128687, 0.181417, 0.00279765, 0.0345239, -0.015114, 0.183395, 0.0034564, 0.0354458, -0.017596, 0.186616, 0.00425864, 0.0368313, -0.0203524, 0.191547, 0.00524936, 0.0386115, -0.0234105, 0.197508, 0.00647033, 0.0410303, -0.0268509, 0.205395, 0.00798121, 0.0442245, -0.0307481, 0.215365, 0.0098557, 0.0478659, -0.0350863, 0.225595, 0.0121417, 0.0522416, -0.0399506, 0.236946, 0.0149385, 0.0574513, -0.045357, 0.249442, 0.0183189, 0.0631208, -0.0512863, 0.261222, 0.0223644, 0.0701124, -0.0579273, 0.275418, 0.0272418, 0.0777331, -0.0650652, 0.288989, 0.0329458, 0.0862709, -0.0728813, 0.302546, 0.0396819, 0.096103, -0.081363, 0.317164, 0.04757, 0.106976, -0.0904463, 0.331733, 0.0567012, 0.119175, -0.100105, 0.34661, 0.067202, 0.132919, -0.110375, 0.362249, 0.0792588, 0.147727, -0.121115, 0.376978, 0.0928672, 0.163618, -0.132299, 0.390681, 0.108228, 0.182234, -0.143887, 0.406571, 0.125502, 0.201809, -0.155827, 0.42042, 0.144836, 0.225041, -0.168357, 0.438411, 0.166706, 0.247621, -0.18004, 0.450368, 0.189909, 0.27097, -0.191536, 0.460083, 0.215251, 0.296658, -0.203024, 0.469765, 0.243164, 0.325892, -0.214056, 0.481837, 0.273388, 0.35406, -0.224104, 0.487474, 0.305344, 0.384372, -0.233489, 0.492773, 0.339741, 0.41749, -0.241874, 0.498451, 0.376287, 0.45013, -0.248834, 0.499632, 0.414195, 0.481285, -0.254658, 0.495233, 0.454077, 0.519183, -0.259367, 0.496401, 0.496352, 0.551544, -0.261818, 0.487686, 0.538798, 0.587349, -0.262964, 0.479453, 0.583626, 0.621679, -0.262128, 0.467709, 0.629451, 0.654991, -0.258998, 0.452123, 0.67566, 0.686873, -0.254119, 0.433495, 0.723248, 0.719801, -0.246946, 0.413657, 0.771156, 0.750355, -0.237709, 0.390366, 0.81989, 0.780033, -0.226549, 0.364947, 0.868601, 0.809254, -0.214186, 0.337256, 0.920034, 0.836576, -0.199639, 0.307395, 0.971706, 0.861774, -0.183169, 0.275431, 1.02479, 0.885707, -0.165111, 0.243431, 1.07837, 0.904742, -0.144363, 0.210921, 1.12783, 0.915604, -0.121305, 0.17647, 1.17254, 0.930959, -0.0962119, 0.143106, 1.21012, 0.948404, -0.069969, 0.108112, 1.24474, 0.967012, -0.0427586, 0.0708478, 1.27718, 0.984183, -0.0147043, 0.032335, 1.3083, 0.999577, 0.0142165, -0.00726867, 1.3382, 0.0229227, -2.99799e-06, 0.148623, 4.62391e-07, 0.0232194, -7.58796e-05, 0.15054, 1.17033e-05, 0.0232315, -0.000303636, 0.15063, 4.68397e-05, 0.0232354, -0.000683189, 0.150624, 0.000105472, 0.0232092, -0.0012136, 0.150445, 0.000187744, 0.0232523, -0.00189765, 0.150679, 0.000294847, 0.0232828, -0.00273247, 0.150789, 0.000428013, 0.0233371, -0.00371287, 0.150995, 0.000591134, 0.0234015, -0.00484794, 0.15118, 0.000787642, 0.023514, -0.00612877, 0.151562, 0.00102547, 0.023679, -0.00756125, 0.152116, 0.00131351, 0.0239559, -0.00914651, 0.153162, 0.00166594, 0.0244334, -0.010904, 0.155133, 0.00210182, 0.025139, -0.0128615, 0.158035, 0.00264406, 0.0262598, -0.0150628, 0.162751, 0.00332923, 0.0277875, -0.0175532, 0.168944, 0.00419773, 0.0298472, -0.0203981, 0.176835, 0.00530034, 0.0325444, -0.023655, 0.186686, 0.00669777, 0.0355581, -0.0272982, 0.196248, 0.00842661, 0.0392841, -0.0314457, 0.207352, 0.0105854, 0.0436815, -0.0361157, 0.219279, 0.0132458, 0.0485272, -0.0412932, 0.230728, 0.0164736, 0.0541574, -0.0470337, 0.242994, 0.0203715, 0.0609479, -0.0535002, 0.257042, 0.0250953, 0.0685228, -0.0605409, 0.27102, 0.0306856, 0.0768042, -0.0680553, 0.28406, 0.037193, 0.0864844, -0.0765011, 0.299186, 0.0449795, 0.0969415, -0.0852674, 0.3132, 0.0538316, 0.108478, -0.0947333, 0.327138, 0.0641149, 0.121705, -0.10481, 0.342345, 0.0759185, 0.136743, -0.115474, 0.358472, 0.0894116, 0.152986, -0.126536, 0.374067, 0.104562, 0.170397, -0.138061, 0.388267, 0.121632, 0.191392, -0.150203, 0.406467, 0.140996, 0.211566, -0.161751, 0.418641, 0.161696, 0.233567, -0.173407, 0.430418, 0.184557, 0.257769, -0.185397, 0.44277, 0.210092, 0.28531, -0.197048, 0.457191, 0.237827, 0.311726, -0.20784, 0.464712, 0.267253, 0.340537, -0.218345, 0.472539, 0.299332, 0.372921, -0.228306, 0.482331, 0.333988, 0.402924, -0.236665, 0.484378, 0.369722, 0.434475, -0.244097, 0.484717, 0.407836, 0.469736, -0.250547, 0.487093, 0.448465, 0.505045, -0.25511, 0.485575, 0.490263, 0.540262, -0.258444, 0.481225, 0.534495, 0.576347, -0.259903, 0.473481, 0.579451, 0.608656, -0.259572, 0.4603, 0.625604, 0.646679, -0.257908, 0.450341, 0.674511, 0.679902, -0.253663, 0.431561, 0.723269, 0.714159, -0.247419, 0.412684, 0.773263, 0.745345, -0.239122, 0.389388, 0.824182, 0.778248, -0.228837, 0.365361, 0.876634, 0.807208, -0.216197, 0.337667, 0.92945, 0.835019, -0.201772, 0.307197, 0.985261, 0.860261, -0.185291, 0.274205, 1.04299, 0.877601, -0.165809, 0.240178, 1.09816, 0.898211, -0.143897, 0.207571, 1.14694, 0.915789, -0.119513, 0.174904, 1.19008, 0.931831, -0.0932919, 0.141423, 1.2297, 0.949244, -0.0656528, 0.105603, 1.26553, 0.967527, -0.0370262, 0.0679551, 1.29986, 0.984139, -0.00730117, 0.0283133, 1.33252, 0.999713, 0.0234648, -0.0121785, 1.36397, 0.0152135, -2.45447e-06, 0.122795, 3.04092e-07, 0.0151652, -6.15778e-05, 0.122399, 7.6292e-06, 0.0151181, -0.000245948, 0.122023, 3.04802e-05, 0.0151203, -0.000553394, 0.12203, 6.86634e-05, 0.015125, -0.000983841, 0.122037, 0.000122463, 0.0151427, -0.00153774, 0.12214, 0.000192706, 0.0151708, -0.0022103, 0.122237, 0.000281219, 0.0152115, -0.00300741, 0.12238, 0.000390804, 0.0152877, -0.00392494, 0.1227, 0.000526317, 0.015412, -0.00496597, 0.123244, 0.00069443, 0.0156201, -0.00613314, 0.124228, 0.00090547, 0.0159658, -0.00744113, 0.125945, 0.0011732, 0.0165674, -0.00892546, 0.129098, 0.00151888, 0.017487, -0.010627, 0.133865, 0.00197007, 0.018839, -0.0126043, 0.140682, 0.0025637, 0.020554, -0.0148814, 0.148534, 0.00333637, 0.0226727, -0.0175123, 0.157381, 0.00433738, 0.0251879, -0.0205266, 0.166685, 0.00561664, 0.0283635, -0.0240319, 0.177796, 0.00725563, 0.0318694, -0.0279432, 0.188251, 0.00928811, 0.0361044, -0.0324313, 0.200038, 0.011835, 0.0406656, -0.0373527, 0.210685, 0.0149146, 0.0463846, -0.0430132, 0.224182, 0.0187254, 0.0525696, -0.0491013, 0.23634, 0.0232283, 0.0598083, -0.0559175, 0.250013, 0.0286521, 0.0679437, -0.0633657, 0.263981, 0.0350634, 0.0771181, -0.0714602, 0.278072, 0.0425882, 0.0881273, -0.0803502, 0.29511, 0.0514487, 0.0996628, -0.0896903, 0.309976, 0.0615766, 0.112702, -0.099644, 0.325611, 0.0732139, 0.126488, -0.109829, 0.339321, 0.0862324, 0.142625, -0.120859, 0.35574, 0.101275, 0.15953, -0.131956, 0.369845, 0.117892, 0.176991, -0.143145, 0.38146, 0.136205, 0.199715, -0.155292, 0.40052, 0.157252, 0.220787, -0.167066, 0.412055, 0.179966, 0.243697, -0.178396, 0.423133, 0.204418, 0.272106, -0.190433, 0.439524, 0.232141, 0.297637, -0.201265, 0.447041, 0.261109, 0.325273, -0.211834, 0.454488, 0.292627, 0.357219, -0.221889, 0.465004, 0.326669, 0.387362, -0.230729, 0.468527, 0.362426, 0.423131, -0.23924, 0.475836, 0.401533, 0.45543, -0.246067, 0.475017, 0.441902, 0.493393, -0.251557, 0.478017, 0.484239, 0.526253, -0.255571, 0.4709, 0.528586, 0.560554, -0.257752, 0.463167, 0.574346, 0.599306, -0.258076, 0.456452, 0.621655, 0.634541, -0.256471, 0.443725, 0.670492, 0.668907, -0.253283, 0.428719, 0.721943, 0.705619, -0.247562, 0.411348, 0.772477, 0.739034, -0.240626, 0.388939, 0.8264, 0.771408, -0.231493, 0.36425, 0.881702, 0.803312, -0.220125, 0.337321, 0.9385, 0.828457, -0.206645, 0.305364, 0.997437, 0.854819, -0.190664, 0.273715, 1.05693, 0.878666, -0.171429, 0.242218, 1.11251, 0.898404, -0.149235, 0.209556, 1.16398, 0.917416, -0.12435, 0.176863, 1.21014, 0.933133, -0.0972703, 0.142775, 1.25178, 0.95066, -0.0683607, 0.106735, 1.29028, 0.968589, -0.0378724, 0.0681609, 1.32703, 0.984776, -0.00605712, 0.0273966, 1.36158, 0.99994, 0.0263276, -0.0138124, 1.3943, 0.00867437, -1.86005e-06, 0.0928979, 1.73682e-07, 0.00864003, -4.66389e-05, 0.0925237, 4.35505e-06, 0.00864593, -0.000186594, 0.0925806, 1.74322e-05, 0.00864095, -0.000419639, 0.0924903, 3.92862e-05, 0.00863851, -0.000746272, 0.0924589, 7.02598e-05, 0.00868531, -0.00116456, 0.0929, 0.000111188, 0.00869667, -0.00167711, 0.0928529, 0.000163867, 0.00874332, -0.00228051, 0.0930914, 0.00023104, 0.00882709, -0.00297864, 0.0935679, 0.00031741, 0.00898874, -0.00377557, 0.0946165, 0.000430186, 0.00929346, -0.00469247, 0.0967406, 0.000580383, 0.00978271, -0.00575491, 0.100084, 0.000783529, 0.0105746, -0.00701514, 0.105447, 0.00106304, 0.0116949, -0.00851797, 0.112494, 0.00144685, 0.0130419, -0.0102757, 0.119876, 0.00196439, 0.0148375, -0.012381, 0.129034, 0.00266433, 0.0168725, -0.01482, 0.137812, 0.00358364, 0.0193689, -0.0176563, 0.147696, 0.00478132, 0.0222691, -0.0209211, 0.157795, 0.00631721, 0.0256891, -0.0246655, 0.168431, 0.00826346, 0.0294686, -0.0288597, 0.178587, 0.0106714, 0.0340412, -0.0336441, 0.190251, 0.0136629, 0.0393918, -0.039033, 0.202999, 0.0173272, 0.0453947, -0.0450087, 0.215655, 0.0217448, 0.0521936, -0.0515461, 0.228686, 0.0269941, 0.0600279, -0.058817, 0.242838, 0.033272, 0.0692398, -0.0667228, 0.258145, 0.0406457, 0.0793832, -0.0752401, 0.273565, 0.0492239, 0.0902297, -0.0841851, 0.287735, 0.0590105, 0.102014, -0.0936479, 0.301161, 0.0702021, 0.116054, -0.103967, 0.317438, 0.0832001, 0.13191, -0.114622, 0.334166, 0.0977951, 0.148239, -0.125452, 0.348192, 0.113985, 0.165809, -0.136453, 0.361094, 0.131928, 0.184616, -0.147648, 0.373534, 0.151811, 0.207491, -0.159607, 0.39101, 0.174476, 0.230106, -0.171119, 0.402504, 0.198798, 0.257036, -0.182906, 0.418032, 0.225796, 0.281172, -0.193605, 0.425468, 0.254027, 0.312034, -0.204771, 0.440379, 0.285713, 0.340402, -0.214988, 0.445406, 0.319196, 0.370231, -0.224711, 0.44968, 0.35537, 0.407105, -0.233516, 0.460747, 0.393838, 0.439037, -0.240801, 0.460624, 0.433747, 0.47781, -0.24762, 0.465957, 0.477234, 0.510655, -0.251823, 0.460054, 0.52044, 0.550584, -0.255552, 0.459172, 0.567853, 0.585872, -0.257036, 0.450311, 0.615943, 0.620466, -0.257535, 0.437763, 0.667693, 0.660496, -0.255248, 0.426639, 0.718988, 0.695578, -0.251141, 0.409185, 0.772503, 0.732176, -0.244718, 0.39015, 0.827023, 0.760782, -0.236782, 0.362594, 0.885651, 0.79422, -0.225923, 0.33711, 0.943756, 0.824521, -0.213855, 0.308272, 1.00874, 0.854964, -0.197723, 0.278529, 1.06764, 0.878065, -0.179209, 0.246208, 1.12836, 0.899834, -0.157569, 0.21329, 1.18318, 0.918815, -0.133206, 0.181038, 1.23161, 0.934934, -0.106545, 0.146993, 1.27644, 0.952115, -0.0780574, 0.111175, 1.31842, 0.96906, -0.0478279, 0.0728553, 1.35839, 0.985178, -0.0160014, 0.032579, 1.39697, 1.00039, 0.0173126, -0.0095256, 1.43312, 0.00384146, -1.24311e-06, 0.0613583, 7.78271e-08, 0.00390023, -3.14043e-05, 0.0622919, 1.96626e-06, 0.00389971, -0.000125622, 0.0622632, 7.87379e-06, 0.00389491, -0.000282352, 0.0620659, 1.778e-05, 0.00391618, -0.000502512, 0.0624687, 3.20918e-05, 0.00392662, -0.000784458, 0.0625113, 5.15573e-05, 0.00396053, -0.00112907, 0.0628175, 7.78668e-05, 0.00401911, -0.00153821, 0.0633286, 0.000113811, 0.00414994, -0.0020208, 0.0646443, 0.00016445, 0.00441223, -0.00260007, 0.0673886, 0.000237734, 0.00484427, -0.0033097, 0.0716528, 0.000345929, 0.00549109, -0.00418966, 0.0774998, 0.000505987, 0.00636293, -0.00527331, 0.0844758, 0.000739208, 0.00746566, -0.00660428, 0.0921325, 0.00107347, 0.00876625, -0.00818826, 0.0997067, 0.00153691, 0.0103125, -0.0100811, 0.107433, 0.00217153, 0.0123309, -0.0123643, 0.117088, 0.00303427, 0.0146274, -0.0150007, 0.126438, 0.00416018, 0.0172295, -0.0180531, 0.135672, 0.00561513, 0.0204248, -0.0215962, 0.146244, 0.007478, 0.0241597, -0.0256234, 0.157481, 0.00981046, 0.0284693, -0.0302209, 0.169125, 0.0127148, 0.033445, -0.0353333, 0.181659, 0.0162453, 0.0391251, -0.0410845, 0.1944, 0.0205417, 0.0454721, -0.0473451, 0.207082, 0.0256333, 0.0530983, -0.0542858, 0.221656, 0.0317036, 0.0615356, -0.0618384, 0.236036, 0.0388319, 0.0703363, -0.0697631, 0.248398, 0.046974, 0.0810391, -0.0784757, 0.263611, 0.0565246, 0.0920144, -0.0873488, 0.275857, 0.0671724, 0.105584, -0.0973652, 0.292555, 0.0798105, 0.119506, -0.107271, 0.306333, 0.0935945, 0.134434, -0.117608, 0.318888, 0.109106, 0.153399, -0.128938, 0.337552, 0.127074, 0.171258, -0.139944, 0.349955, 0.14643, 0.191059, -0.151288, 0.361545, 0.168, 0.215069, -0.163018, 0.378421, 0.192082, 0.237838, -0.174226, 0.38879, 0.217838, 0.266965, -0.186063, 0.405857, 0.246931, 0.292827, -0.196909, 0.414146, 0.277505, 0.324352, -0.207473, 0.426955, 0.310711, 0.354427, -0.217713, 0.433429, 0.346794, 0.389854, -0.227183, 0.443966, 0.385237, 0.420749, -0.235131, 0.44471, 0.424955, 0.459597, -0.242786, 0.451729, 0.468446, 0.495316, -0.248767, 0.45072, 0.513422, 0.534903, -0.253351, 0.450924, 0.560618, 0.572369, -0.256277, 0.445266, 0.609677, 0.612383, -0.2576, 0.438798, 0.660995, 0.644037, -0.256931, 0.421693, 0.713807, 0.686749, -0.254036, 0.4109, 0.767616, 0.719814, -0.249785, 0.390151, 0.82533, 0.754719, -0.244283, 0.367847, 0.888311, 0.792022, -0.235076, 0.345013, 0.948177, 0.822404, -0.225061, 0.316193, 1.01661, 0.853084, -0.211113, 0.287013, 1.08075, 0.879871, -0.19449, 0.255424, 1.14501, 0.901655, -0.174023, 0.222879, 1.20203, 0.919957, -0.1509, 0.18989, 1.25698, 0.938412, -0.124923, 0.15606, 1.30588, 0.953471, -0.0968139, 0.120512, 1.3529, 0.970451, -0.066734, 0.0828515, 1.3986, 0.985522, -0.034734, 0.0424458, 1.44148, 1.00099, -0.00102222, 0.000678929, 1.48398, 0.000965494, -6.27338e-07, 0.0306409, 1.97672e-08, 0.00099168, -1.58573e-05, 0.0314638, 4.99803e-07, 0.000991068, -6.34012e-05, 0.031363, 2.00682e-06, 0.000974567, -0.00014144, 0.03036, 4.57312e-06, 0.000998079, -0.000252812, 0.031496, 8.60131e-06, 0.00102243, -0.000396506, 0.0319955, 1.48288e-05, 0.00107877, -0.000577593, 0.0331376, 2.49141e-05, 0.00121622, -0.000816816, 0.0359396, 4.23011e-05, 0.0014455, -0.00113761, 0.0399652, 7.24613e-05, 0.00178791, -0.00156959, 0.0450556, 0.000123929, 0.00225668, -0.00214064, 0.0508025, 0.000208531, 0.00285627, -0.00287655, 0.0568443, 0.000341969, 0.0035991, -0.00380271, 0.0630892, 0.000544158, 0.00455524, -0.00496264, 0.0702204, 0.000842423, 0.00569143, -0.0063793, 0.0773426, 0.00126704, 0.00716928, -0.00813531, 0.0860839, 0.00186642, 0.00885307, -0.0101946, 0.0944079, 0.00267014, 0.0109316, -0.0126386, 0.103951, 0.00374033, 0.0133704, -0.0154876, 0.113786, 0.0051304, 0.0161525, -0.0187317, 0.123477, 0.00688858, 0.0194267, -0.0224652, 0.133986, 0.00910557, 0.0230967, -0.0265976, 0.143979, 0.0118074, 0.0273627, -0.0312848, 0.154645, 0.0151266, 0.0323898, -0.0365949, 0.166765, 0.0191791, 0.0379225, -0.0422914, 0.177932, 0.0239236, 0.0447501, -0.0487469, 0.19167, 0.0296568, 0.0519391, -0.0556398, 0.203224, 0.0362924, 0.0599464, -0.0631646, 0.215652, 0.0440585, 0.0702427, -0.0714308, 0.232089, 0.0531619, 0.0806902, -0.0800605, 0.245258, 0.0634564, 0.0923194, -0.0892815, 0.258609, 0.0752481, 0.106938, -0.09931, 0.276654, 0.0888914, 0.121238, -0.109575, 0.289847, 0.104055, 0.138817, -0.120461, 0.307566, 0.121266, 0.15595, -0.131209, 0.320117, 0.139944, 0.178418, -0.143049, 0.339677, 0.161591, 0.197875, -0.154074, 0.349886, 0.184303, 0.224368, -0.166307, 0.369352, 0.210669, 0.252213, -0.178051, 0.386242, 0.238895, 0.277321, -0.189335, 0.395294, 0.269182, 0.310332, -0.200683, 0.412148, 0.302508, 0.338809, -0.210856, 0.418266, 0.337264, 0.372678, -0.220655, 0.428723, 0.374881, 0.405632, -0.230053, 0.433887, 0.415656, 0.442293, -0.237993, 0.439911, 0.457982, 0.477256, -0.244897, 0.440175, 0.502831, 0.515592, -0.250657, 0.441079, 0.550277, 0.550969, -0.255459, 0.435219, 0.601102, 0.592883, -0.257696, 0.432882, 0.651785, 0.629092, -0.259894, 0.421054, 0.708961, 0.672033, -0.258592, 0.41177, 0.763806, 0.709147, -0.256525, 0.395267, 0.824249, 0.745367, -0.254677, 0.375013, 0.8951, 0.784715, -0.247892, 0.353906, 0.959317, 0.818107, -0.240162, 0.327801, 1.03153, 0.847895, -0.229741, 0.298821, 1.10601, 0.879603, -0.213084, 0.269115, 1.164, 0.902605, -0.195242, 0.236606, 1.22854, 0.922788, -0.174505, 0.203442, 1.29017, 0.944831, -0.150169, 0.169594, 1.34157, 0.959656, -0.124099, 0.135909, 1.3956, 0.972399, -0.0960626, 0.0990563, 1.45128, 0.986549, -0.0657097, 0.0602348, 1.50312, 1.00013, -0.0333558, 0.0186694, 1.55364, 6.19747e-06, -1e-07, 0.00778326, 7.96756e-11, 2.37499e-08, -9.99999e-08, 2.82592e-05, 1.14596e-10, 1.00292e-06, -1.66369e-06, 0.000250354, 6.77492e-09, 3.50752e-06, -6.37769e-06, 0.000357289, 6.31655e-08, 8.26445e-06, -1.74689e-05, 0.000516179, 3.1851e-07, 2.42481e-05, -4.50868e-05, 0.0010223, 1.30577e-06, 4.55631e-05, -8.9044e-05, 0.00144302, 3.74587e-06, 9.71222e-05, -0.000178311, 0.00241912, 1.02584e-05, 0.000171403, -0.000313976, 0.00354938, 2.36481e-05, 0.000292747, -0.000520026, 0.00513765, 4.96014e-05, 0.000789827, -0.00118187, 0.0238621, 0.000139056, 0.00114093, -0.00171827, 0.0286691, 0.000244093, 0.00176119, -0.00249667, 0.0368565, 0.000420623, 0.0022233, -0.00333742, 0.0400469, 0.00065673, 0.00343382, -0.00481976, 0.0535751, 0.00109323, 0.00427602, -0.00600755, 0.057099, 0.00155268, 0.00461435, -0.00737637, 0.0551084, 0.00215031, 0.00695698, -0.00971401, 0.0715767, 0.00316529, 0.00867619, -0.0120943, 0.0793314, 0.00436995, 0.0106694, -0.0148202, 0.0869391, 0.0058959, 0.0140351, -0.0183501, 0.101572, 0.00798757, 0.0168939, -0.022006, 0.11018, 0.0104233, 0.020197, -0.0261568, 0.119041, 0.0134167, 0.0254702, -0.0312778, 0.135404, 0.0173009, 0.0298384, -0.0362469, 0.1437, 0.0215428, 0.035159, -0.042237, 0.15512, 0.0268882, 0.0427685, -0.0488711, 0.17128, 0.033235, 0.0494848, -0.0557997, 0.181813, 0.0404443, 0.0592394, -0.0635578, 0.198745, 0.0490043, 0.0681463, -0.071838, 0.210497, 0.0588239, 0.0804753, -0.0809297, 0.228864, 0.0702835, 0.0942205, -0.0906488, 0.247008, 0.0834012, 0.106777, -0.100216, 0.258812, 0.0975952, 0.124471, -0.110827, 0.278617, 0.114162, 0.138389, -0.121193, 0.287049, 0.131983, 0.159543, -0.13253, 0.307151, 0.152541, 0.176432, -0.143611, 0.31564, 0.174673, 0.201723, -0.15548, 0.33538, 0.199842, 0.229721, -0.167166, 0.355256, 0.227097, 0.250206, -0.178238, 0.360047, 0.256014, 0.282118, -0.189905, 0.378761, 0.28855, 0.312821, -0.201033, 0.39181, 0.323348, 0.341482, -0.211584, 0.397716, 0.360564, 0.377368, -0.221314, 0.410141, 0.400004, 0.418229, -0.230474, 0.423485, 0.442371, 0.444881, -0.239443, 0.418874, 0.488796, 0.488899, -0.245987, 0.427545, 0.535012, 0.520317, -0.253948, 0.422147, 0.589678, 0.568566, -0.256616, 0.42719, 0.637683, 0.599607, -0.26376, 0.415114, 0.703363, 0.64222, -0.268687, 0.408715, 0.771363, 0.685698, -0.2694, 0.399722, 0.83574, 0.732327, -0.266642, 0.388651, 0.897764, 0.769873, -0.267712, 0.369198, 0.983312, 0.806733, -0.263479, 0.346802, 1.06222, 0.843466, -0.254575, 0.321368, 1.13477, 0.873008, -0.242749, 0.29211, 1.20712, 0.908438, -0.22725, 0.262143, 1.27465, 0.936321, -0.207621, 0.228876, 1.33203, 0.950353, -0.187932, 0.19484, 1.40439, 0.96442, -0.165154, 0.163178, 1.4732, 0.979856, -0.139302, 0.127531, 1.53574, 0.982561, -0.11134, 0.0903457, 1.59982, 0.996389, -0.0808124, 0.0489007, 1.6577]; const ltc_float_1 = new Float32Array(LTC_MAT_1); return RectAreaLightLTC._createTexture(ltc_float_1); } static getLTC2() { // source: https://github.com/selfshadow/ltc_code/tree/master/fit/results/ltc.js const LTC_MAT_2 = [1, 0, 0, 0, 1, 7.91421e-31, 0, 0, 1, 1.04392e-24, 0, 0, 1, 3.49405e-21, 0, 0, 1, 1.09923e-18, 0, 0, 1, 9.47414e-17, 0, 0, 1, 3.59627e-15, 0, 0, 1, 7.72053e-14, 0, 0, 1, 1.08799e-12, 0, 0, 1, 1.10655e-11, 0, 0, 1, 8.65818e-11, 0, 0, 0.999998, 5.45037e-10, 0, 0, 0.999994, 2.85095e-09, 0, 0, 0.999989, 1.26931e-08, 0, 0, 0.999973, 4.89938e-08, 0, 0, 0.999947, 1.66347e-07, 0, 0, 0.999894, 5.02694e-07, 0, 0, 0.999798, 1.36532e-06, 0, 0, 0.999617, 3.35898e-06, 0, 0, 0.999234, 7.52126e-06, 0, 0, 0.998258, 1.52586e-05, 0, 0, 0.99504, 2.66207e-05, 0, 0, 0.980816, 2.36802e-05, 0, 0, 0.967553, 2.07684e-06, 0, 0, 0.966877, 4.03733e-06, 0, 0, 0.965752, 7.41174e-06, 0, 0, 0.96382, 1.27746e-05, 0, 0, 0.960306, 2.02792e-05, 0, 0, 0.953619, 2.80232e-05, 0, 0, 0.941103, 2.78816e-05, 0, 0, 0.926619, 1.60221e-05, 0, 0, 0.920983, 2.35164e-05, 0, 0, 0.912293, 3.11924e-05, 0, 0.0158731, 0.899277, 3.48118e-05, 0, 0.0476191, 0.880884, 2.6041e-05, 0, 0.0793651, 0.870399, 3.38726e-05, 0, 0.111111, 0.856138, 3.92906e-05, 0, 0.142857, 0.837436, 3.72874e-05, 0, 0.174603, 0.820973, 3.92558e-05, 0, 0.206349, 0.803583, 4.34658e-05, 0, 0.238095, 0.782168, 4.0256e-05, 0, 0.269841, 0.764107, 4.48159e-05, 0, 0.301587, 0.743092, 4.57627e-05, 0, 0.333333, 0.721626, 4.55314e-05, 0, 0.365079, 0.700375, 4.77335e-05, 0, 0.396825, 0.677334, 4.61072e-05, 0, 0.428571, 0.655702, 4.84393e-05, 0, 0.460317, 0.632059, 4.64583e-05, 0, 0.492064, 0.610125, 4.83923e-05, 0, 0.52381, 0.58653, 4.64342e-05, 0, 0.555556, 0.564508, 4.77033e-05, 0, 0.587302, 0.541405, 4.59263e-05, 0, 0.619048, 0.519556, 4.6412e-05, 0, 0.650794, 0.497292, 4.48913e-05, 0, 0.68254, 0.475898, 4.45789e-05, 0, 0.714286, 0.454722, 4.33496e-05, 0, 0.746032, 0.434042, 4.23054e-05, 0, 0.777778, 0.414126, 4.13737e-05, 0, 0.809524, 0.394387, 3.97265e-05, 0, 0.84127, 0.375841, 3.90709e-05, 0, 0.873016, 0.357219, 3.69938e-05, 0, 0.904762, 0.340084, 3.65618e-05, 0, 0.936508, 0.322714, 3.42533e-05, 0, 0.968254, 0.306974, 3.39596e-05, 0, 1, 1, 1.01524e-18, 0, 0, 1, 1.0292e-18, 0, 0, 1, 1.30908e-18, 0, 0, 1, 4.73331e-18, 0, 0, 1, 6.25319e-17, 0, 0, 1, 1.07932e-15, 0, 0, 1, 1.63779e-14, 0, 0, 1, 2.03198e-13, 0, 0, 1, 2.04717e-12, 0, 0, 0.999999, 1.68995e-11, 0, 0, 0.999998, 1.15855e-10, 0, 0, 0.999996, 6.6947e-10, 0, 0, 0.999991, 3.30863e-09, 0, 0, 0.999983, 1.41737e-08, 0, 0, 0.999968, 5.32626e-08, 0, 0, 0.99994, 1.77431e-07, 0, 0, 0.999891, 5.28835e-07, 0, 0, 0.999797, 1.42169e-06, 0, 0, 0.999617, 3.47057e-06, 0, 0, 0.999227, 7.7231e-06, 0, 0, 0.998239, 1.55753e-05, 0, 0, 0.994937, 2.68495e-05, 0, 0, 0.980225, 2.13742e-05, 0, 0, 0.967549, 2.1631e-06, 0, 0, 0.966865, 4.17989e-06, 0, 0, 0.965739, 7.63341e-06, 0, 0, 0.963794, 1.30892e-05, 0, 0, 0.960244, 2.06456e-05, 0, 0, 0.953495, 2.82016e-05, 0, 0.000148105, 0.940876, 2.71581e-05, 0, 0.002454, 0.926569, 1.64159e-05, 0, 0.00867491, 0.920905, 2.39521e-05, 0, 0.01956, 0.912169, 3.15127e-05, 0, 0.035433, 0.899095, 3.46626e-05, 0, 0.056294, 0.882209, 2.90223e-05, 0, 0.0818191, 0.870272, 3.42992e-05, 0, 0.111259, 0.855977, 3.94164e-05, 0, 0.142857, 0.837431, 3.72343e-05, 0, 0.174603, 0.820826, 3.96691e-05, 0, 0.206349, 0.803408, 4.35395e-05, 0, 0.238095, 0.782838, 4.19579e-05, 0, 0.269841, 0.763941, 4.50953e-05, 0, 0.301587, 0.742904, 4.55847e-05, 0, 0.333333, 0.721463, 4.58833e-05, 0, 0.365079, 0.700197, 4.77159e-05, 0, 0.396825, 0.677501, 4.70641e-05, 0, 0.428571, 0.655527, 4.84732e-05, 0, 0.460317, 0.6324, 4.76834e-05, 0, 0.492064, 0.609964, 4.84213e-05, 0, 0.52381, 0.586839, 4.75541e-05, 0, 0.555556, 0.564353, 4.76951e-05, 0, 0.587302, 0.541589, 4.67611e-05, 0, 0.619048, 0.519413, 4.63493e-05, 0, 0.650794, 0.497337, 4.53994e-05, 0, 0.68254, 0.475797, 4.45308e-05, 0, 0.714286, 0.454659, 4.35787e-05, 0, 0.746032, 0.434065, 4.24839e-05, 0, 0.777778, 0.414018, 4.1436e-05, 0, 0.809524, 0.39455, 4.01902e-05, 0, 0.84127, 0.375742, 3.90813e-05, 0, 0.873016, 0.357501, 3.77116e-05, 0, 0.904762, 0.339996, 3.6535e-05, 0, 0.936508, 0.323069, 3.51265e-05, 0, 0.968254, 0.306897, 3.39112e-05, 0, 1, 1, 1.0396e-15, 0, 0, 1, 1.04326e-15, 0, 0, 1, 1.10153e-15, 0, 0, 1, 1.44668e-15, 0, 0, 1, 3.4528e-15, 0, 0, 1, 1.75958e-14, 0, 0, 1, 1.2627e-13, 0, 0, 1, 9.36074e-13, 0, 0, 1, 6.45742e-12, 0, 0, 0.999998, 4.01228e-11, 0, 0, 0.999997, 2.22338e-10, 0, 0, 0.999995, 1.0967e-09, 0, 0, 0.999991, 4.82132e-09, 0, 0, 0.999981, 1.89434e-08, 0, 0, 0.999967, 6.67716e-08, 0, 0, 0.999938, 2.12066e-07, 0, 0, 0.999886, 6.0977e-07, 0, 0, 0.999792, 1.59504e-06, 0, 0, 0.999608, 3.81191e-06, 0, 0, 0.999209, 8.33727e-06, 0, 0, 0.998179, 1.65288e-05, 0, 0, 0.994605, 2.74387e-05, 0, 0, 0.979468, 1.67316e-05, 0, 0, 0.967529, 2.42877e-06, 0, 0, 0.966836, 4.61696e-06, 0, 0, 0.96569, 8.30977e-06, 0, 0, 0.963706, 1.40427e-05, 0, 2.44659e-06, 0.960063, 2.17353e-05, 0, 0.000760774, 0.953113, 2.86606e-05, 0, 0.00367261, 0.940192, 2.47691e-05, 0, 0.00940263, 0.927731, 1.95814e-05, 0, 0.018333, 0.920669, 2.52531e-05, 0, 0.0306825, 0.911799, 3.24277e-05, 0, 0.0465556, 0.89857, 3.40982e-05, 0, 0.0659521, 0.883283, 3.19622e-05, 0, 0.0887677, 0.86989, 3.5548e-05, 0, 0.114784, 0.855483, 3.97143e-05, 0, 0.143618, 0.837987, 3.91665e-05, 0, 0.174606, 0.820546, 4.11306e-05, 0, 0.206349, 0.802878, 4.36753e-05, 0, 0.238095, 0.783402, 4.44e-05, 0, 0.269841, 0.763439, 4.58726e-05, 0, 0.301587, 0.742925, 4.67097e-05, 0, 0.333333, 0.721633, 4.78887e-05, 0, 0.365079, 0.69985, 4.81251e-05, 0, 0.396825, 0.67783, 4.91811e-05, 0, 0.428571, 0.655126, 4.88199e-05, 0, 0.460318, 0.632697, 4.96025e-05, 0, 0.492064, 0.609613, 4.8829e-05, 0, 0.52381, 0.587098, 4.92754e-05, 0, 0.555556, 0.564119, 4.82625e-05, 0, 0.587302, 0.541813, 4.82807e-05, 0, 0.619048, 0.519342, 4.71552e-05, 0, 0.650794, 0.497514, 4.66765e-05, 0, 0.68254, 0.475879, 4.55582e-05, 0, 0.714286, 0.454789, 4.46007e-05, 0, 0.746032, 0.434217, 4.35382e-05, 0, 0.777778, 0.414086, 4.21753e-05, 0, 0.809524, 0.394744, 4.12093e-05, 0, 0.84127, 0.375782, 3.96634e-05, 0, 0.873016, 0.357707, 3.86419e-05, 0, 0.904762, 0.340038, 3.70345e-05, 0, 0.936508, 0.323284, 3.59725e-05, 0, 0.968254, 0.306954, 3.436e-05, 0, 1, 1, 5.99567e-14, 0, 0, 1, 6.00497e-14, 0, 0, 1, 6.14839e-14, 0, 0, 1, 6.86641e-14, 0, 0, 1, 9.72658e-14, 0, 0, 1, 2.21271e-13, 0, 0, 1, 8.33195e-13, 0, 0, 1, 4.03601e-12, 0, 0, 0.999999, 2.06001e-11, 0, 0, 0.999998, 1.01739e-10, 0, 0, 0.999997, 4.70132e-10, 0, 0, 0.999993, 2.00436e-09, 0, 0, 0.999988, 7.83682e-09, 0, 0, 0.999979, 2.80338e-08, 0, 0, 0.999962, 9.17033e-08, 0, 0, 0.999933, 2.74514e-07, 0, 0, 0.999881, 7.53201e-07, 0, 0, 0.999783, 1.89826e-06, 0, 0, 0.999594, 4.40279e-06, 0, 0, 0.999178, 9.3898e-06, 0, 0, 0.998073, 1.81265e-05, 0, 0, 0.993993, 2.80487e-05, 0, 0, 0.979982, 1.49422e-05, 0, 0, 0.968145, 3.78481e-06, 0, 0, 0.966786, 5.3771e-06, 0, 0, 0.965611, 9.47508e-06, 0, 3.88934e-05, 0.963557, 1.56616e-05, 0, 0.0009693, 0.959752, 2.35144e-05, 0, 0.00370329, 0.952461, 2.91568e-05, 0, 0.00868428, 0.940193, 2.40102e-05, 0, 0.0161889, 0.929042, 2.31235e-05, 0, 0.0263948, 0.920266, 2.73968e-05, 0, 0.0394088, 0.911178, 3.37915e-05, 0, 0.0552818, 0.897873, 3.33629e-05, 0, 0.0740138, 0.884053, 3.51405e-05, 0, 0.0955539, 0.869455, 3.78034e-05, 0, 0.119795, 0.854655, 3.99378e-05, 0, 0.14656, 0.838347, 4.19108e-05, 0, 0.175573, 0.820693, 4.40831e-05, 0, 0.206388, 0.802277, 4.45599e-05, 0, 0.238095, 0.783634, 4.72691e-05, 0, 0.269841, 0.763159, 4.76984e-05, 0, 0.301587, 0.742914, 4.91487e-05, 0, 0.333333, 0.721662, 5.02312e-05, 0, 0.365079, 0.699668, 5.02817e-05, 0, 0.396825, 0.677839, 5.1406e-05, 0, 0.428571, 0.655091, 5.11095e-05, 0, 0.460317, 0.632665, 5.16067e-05, 0, 0.492064, 0.609734, 5.12255e-05, 0, 0.52381, 0.587043, 5.10263e-05, 0, 0.555556, 0.564298, 5.0565e-05, 0, 0.587302, 0.541769, 4.97951e-05, 0, 0.619048, 0.519529, 4.92698e-05, 0, 0.650794, 0.497574, 4.82066e-05, 0, 0.68254, 0.476028, 4.73689e-05, 0, 0.714286, 0.454961, 4.61941e-05, 0, 0.746032, 0.434341, 4.50618e-05, 0, 0.777778, 0.414364, 4.38355e-05, 0, 0.809524, 0.394832, 4.24196e-05, 0, 0.84127, 0.376109, 4.12563e-05, 0, 0.873016, 0.35779, 3.96226e-05, 0, 0.904762, 0.340379, 3.84886e-05, 0, 0.936508, 0.323385, 3.68214e-05, 0, 0.968254, 0.307295, 3.56636e-05, 0, 1, 1, 1.06465e-12, 0, 0, 1, 1.06555e-12, 0, 0, 1, 1.07966e-12, 0, 0, 1, 1.14601e-12, 0, 0, 1, 1.37123e-12, 0, 0, 1, 2.1243e-12, 0, 0, 0.999999, 4.89653e-12, 0, 0, 0.999999, 1.60283e-11, 0, 0, 0.999998, 6.2269e-11, 0, 0, 0.999997, 2.51859e-10, 0, 0, 0.999996, 9.96192e-10, 0, 0, 0.999992, 3.74531e-09, 0, 0, 0.999986, 1.32022e-08, 0, 0, 0.999975, 4.33315e-08, 0, 0, 0.999959, 1.31956e-07, 0, 0, 0.999927, 3.72249e-07, 0, 0, 0.999871, 9.72461e-07, 0, 0, 0.999771, 2.35343e-06, 0, 0, 0.999572, 5.2768e-06, 0, 0, 0.999133, 1.09237e-05, 0, 0, 0.997912, 2.03675e-05, 0, 0, 0.993008, 2.79396e-05, 0, 0, 0.980645, 1.39604e-05, 0, 0, 0.970057, 6.46596e-06, 0, 0, 0.966717, 6.5089e-06, 0, 4.74145e-05, 0.965497, 1.11863e-05, 0, 0.00089544, 0.96334, 1.79857e-05, 0, 0.0032647, 0.959294, 2.59045e-05, 0, 0.0075144, 0.951519, 2.92327e-05, 0, 0.0138734, 0.940517, 2.49769e-05, 0, 0.0224952, 0.93014, 2.6803e-05, 0, 0.0334828, 0.91972, 3.03656e-05, 0, 0.0468973, 0.910294, 3.53323e-05, 0, 0.0627703, 0.897701, 3.51002e-05, 0, 0.0811019, 0.884522, 3.88104e-05, 0, 0.10186, 0.869489, 4.12932e-05, 0, 0.124985, 0.853983, 4.15781e-05, 0, 0.150372, 0.838425, 4.54066e-05, 0, 0.177868, 0.820656, 4.71624e-05, 0, 0.207245, 0.801875, 4.75243e-05, 0, 0.238143, 0.783521, 5.05621e-05, 0, 0.269841, 0.763131, 5.0721e-05, 0, 0.301587, 0.74261, 5.23293e-05, 0, 0.333333, 0.72148, 5.28699e-05, 0, 0.365079, 0.699696, 5.38677e-05, 0, 0.396825, 0.677592, 5.39255e-05, 0, 0.428571, 0.65525, 5.46367e-05, 0, 0.460317, 0.632452, 5.41348e-05, 0, 0.492064, 0.609903, 5.44976e-05, 0, 0.52381, 0.586928, 5.36201e-05, 0, 0.555556, 0.564464, 5.35185e-05, 0, 0.587302, 0.541801, 5.24949e-05, 0, 0.619048, 0.519681, 5.1812e-05, 0, 0.650794, 0.497685, 5.07687e-05, 0, 0.68254, 0.47622, 4.96243e-05, 0, 0.714286, 0.455135, 4.85714e-05, 0, 0.746032, 0.4346, 4.71847e-05, 0, 0.777778, 0.414564, 4.59294e-05, 0, 0.809524, 0.395165, 4.44705e-05, 0, 0.84127, 0.376333, 4.30772e-05, 0, 0.873016, 0.358197, 4.16229e-05, 0, 0.904762, 0.34064, 4.01019e-05, 0, 0.936508, 0.323816, 3.86623e-05, 0, 0.968254, 0.307581, 3.70933e-05, 0, 1, 1, 9.91541e-12, 0, 0, 1, 9.92077e-12, 0, 0, 1, 1.00041e-11, 0, 0, 1, 1.0385e-11, 0, 0, 1, 1.15777e-11, 0, 0, 1, 1.50215e-11, 0, 0, 0.999999, 2.54738e-11, 0, 0, 0.999999, 5.98822e-11, 0, 0, 0.999998, 1.79597e-10, 0, 0, 0.999997, 6.02367e-10, 0, 0, 0.999994, 2.06835e-09, 0, 0, 0.99999, 6.94952e-09, 0, 0, 0.999984, 2.23363e-08, 0, 0, 0.999972, 6.78578e-08, 0, 0, 0.999952, 1.93571e-07, 0, 0, 0.999919, 5.16594e-07, 0, 0, 0.99986, 1.28739e-06, 0, 0, 0.999753, 2.99298e-06, 0, 0, 0.999546, 6.48258e-06, 0, 0, 0.999074, 1.29985e-05, 0, 0, 0.997671, 2.32176e-05, 0, 0, 0.991504, 2.56701e-05, 0, 0, 0.981148, 1.31141e-05, 0, 0, 0.971965, 8.69048e-06, 0, 2.80182e-05, 0.966624, 8.08301e-06, 0, 0.000695475, 0.965344, 1.35235e-05, 0, 0.00265522, 0.963048, 2.10592e-05, 0, 0.00622975, 0.958673, 2.87473e-05, 0, 0.0116234, 0.950262, 2.81379e-05, 0, 0.018976, 0.940836, 2.71089e-05, 0, 0.0283844, 0.930996, 3.0926e-05, 0, 0.0399151, 0.919848, 3.48359e-05, 0, 0.0536063, 0.909136, 3.66092e-05, 0, 0.0694793, 0.897554, 3.84162e-05, 0, 0.0875342, 0.884691, 4.30971e-05, 0, 0.107749, 0.869414, 4.47803e-05, 0, 0.130087, 0.853462, 4.52858e-05, 0, 0.154481, 0.838187, 4.95769e-05, 0, 0.180833, 0.820381, 5.02709e-05, 0, 0.209005, 0.801844, 5.22713e-05, 0, 0.238791, 0.783061, 5.41505e-05, 0, 0.269869, 0.763205, 5.53712e-05, 0, 0.301587, 0.742362, 5.64909e-05, 0, 0.333333, 0.721393, 5.72646e-05, 0, 0.365079, 0.699676, 5.81012e-05, 0, 0.396825, 0.677395, 5.8096e-05, 0, 0.428571, 0.655208, 5.85766e-05, 0, 0.460317, 0.632451, 5.83602e-05, 0, 0.492064, 0.609839, 5.80234e-05, 0, 0.52381, 0.587093, 5.77161e-05, 0, 0.555556, 0.564467, 5.68447e-05, 0, 0.587302, 0.542043, 5.63166e-05, 0, 0.619048, 0.519826, 5.5156e-05, 0, 0.650794, 0.497952, 5.41682e-05, 0, 0.68254, 0.476477, 5.28971e-05, 0, 0.714286, 0.455412, 5.14952e-05, 0, 0.746032, 0.434926, 5.02222e-05, 0, 0.777778, 0.4149, 4.85779e-05, 0, 0.809524, 0.395552, 4.72242e-05, 0, 0.84127, 0.376712, 4.54891e-05, 0, 0.873016, 0.358622, 4.40924e-05, 0, 0.904762, 0.341048, 4.22984e-05, 0, 0.936508, 0.324262, 4.08582e-05, 0, 0.968254, 0.308013, 3.90839e-05, 0, 1, 1, 6.13913e-11, 0, 0, 1, 6.14145e-11, 0, 0, 1, 6.17708e-11, 0, 0, 1, 6.33717e-11, 0, 0, 1, 6.81648e-11, 0, 0, 1, 8.08291e-11, 0, 0, 1, 1.14608e-10, 0, 0, 0.999998, 2.10507e-10, 0, 0, 0.999997, 4.99595e-10, 0, 0, 0.999995, 1.39897e-09, 0, 0, 0.999994, 4.19818e-09, 0, 0, 0.999988, 1.27042e-08, 0, 0, 0.999979, 3.75153e-08, 0, 0, 0.999965, 1.06206e-07, 0, 0, 0.999945, 2.85381e-07, 0, 0, 0.999908, 7.23611e-07, 0, 0, 0.999846, 1.7255e-06, 0, 0, 0.999733, 3.86104e-06, 0, 0, 0.999511, 8.08493e-06, 0, 0, 0.998993, 1.56884e-05, 0, 0, 0.997326, 2.65538e-05, 0, 0, 0.989706, 2.06466e-05, 0, 0, 0.981713, 1.30756e-05, 0, 7.0005e-06, 0.973636, 1.06473e-05, 0, 0.000464797, 0.966509, 1.0194e-05, 0, 0.00201743, 0.965149, 1.65881e-05, 0, 0.00497549, 0.962669, 2.49147e-05, 0, 0.00953262, 0.95786, 3.17449e-05, 0, 0.0158211, 0.949334, 2.81045e-05, 0, 0.0239343, 0.941041, 3.03263e-05, 0, 0.0339372, 0.931575, 3.56754e-05, 0, 0.0458738, 0.920102, 3.97075e-05, 0, 0.059772, 0.908002, 3.84886e-05, 0, 0.075645, 0.897269, 4.3027e-05, 0, 0.0934929, 0.884559, 4.79925e-05, 0, 0.113302, 0.869161, 4.8246e-05, 0, 0.135045, 0.853342, 5.09505e-05, 0, 0.158678, 0.837633, 5.42846e-05, 0, 0.184136, 0.820252, 5.54139e-05, 0, 0.211325, 0.801872, 5.81412e-05, 0, 0.240113, 0.782418, 5.85535e-05, 0, 0.270306, 0.7631, 6.10923e-05, 0, 0.301594, 0.742183, 6.13678e-05, 0, 0.333333, 0.721098, 6.27275e-05, 0, 0.365079, 0.699512, 6.29413e-05, 0, 0.396825, 0.677372, 6.36351e-05, 0, 0.428571, 0.655059, 6.33555e-05, 0, 0.460317, 0.632567, 6.36513e-05, 0, 0.492064, 0.609784, 6.28965e-05, 0, 0.52381, 0.587237, 6.25546e-05, 0, 0.555556, 0.564525, 6.15825e-05, 0, 0.587302, 0.542181, 6.05048e-05, 0, 0.619048, 0.520017, 5.96329e-05, 0, 0.650794, 0.498204, 5.81516e-05, 0, 0.68254, 0.476742, 5.69186e-05, 0, 0.714286, 0.455803, 5.53833e-05, 0, 0.746032, 0.435251, 5.37807e-05, 0, 0.777778, 0.415374, 5.22025e-05, 0, 0.809524, 0.395921, 5.03421e-05, 0, 0.84127, 0.377253, 4.88211e-05, 0, 0.873016, 0.359021, 4.68234e-05, 0, 0.904762, 0.341637, 4.53269e-05, 0, 0.936508, 0.3247, 4.33014e-05, 0, 0.968254, 0.308625, 4.18007e-05, 0, 1, 1, 2.86798e-10, 0, 0, 1, 2.86877e-10, 0, 0, 1, 2.88094e-10, 0, 0, 1, 2.93506e-10, 0, 0, 1, 3.09262e-10, 0, 0, 0.999999, 3.48593e-10, 0, 0, 0.999999, 4.44582e-10, 0, 0, 0.999998, 6.88591e-10, 0, 0, 0.999996, 1.34391e-09, 0, 0, 0.999993, 3.17438e-09, 0, 0, 0.999989, 8.35609e-09, 0, 0, 0.999983, 2.28677e-08, 0, 0, 0.999974, 6.23361e-08, 0, 0, 0.999959, 1.65225e-07, 0, 0, 0.999936, 4.19983e-07, 0, 0, 0.999896, 1.01546e-06, 0, 0, 0.99983, 2.32376e-06, 0, 0, 0.999709, 5.0156e-06, 0, 0, 0.999469, 1.0167e-05, 0, 0, 0.998886, 1.90775e-05, 0, 0, 0.996819, 3.00511e-05, 0, 0, 0.988837, 1.85092e-05, 0, 1.68222e-07, 0.982178, 1.34622e-05, 0, 0.000259622, 0.975017, 1.25961e-05, 0, 0.00142595, 0.967101, 1.3507e-05, 0, 0.00382273, 0.964905, 2.05003e-05, 0, 0.00764164, 0.96218, 2.9546e-05, 0, 0.0130121, 0.956821, 3.43738e-05, 0, 0.0200253, 0.948829, 3.05063e-05, 0, 0.0287452, 0.941092, 3.46487e-05, 0, 0.039218, 0.931883, 4.12061e-05, 0, 0.0514748, 0.920211, 4.44651e-05, 0, 0.0655351, 0.907307, 4.31252e-05, 0, 0.0814082, 0.89684, 4.90382e-05, 0, 0.0990939, 0.884119, 5.3334e-05, 0, 0.118583, 0.869148, 5.4114e-05, 0, 0.139856, 0.853377, 5.78536e-05, 0, 0.162882, 0.836753, 5.92285e-05, 0, 0.187615, 0.820063, 6.22787e-05, 0, 0.213991, 0.801694, 6.45492e-05, 0, 0.241918, 0.782116, 6.5353e-05, 0, 0.271267, 0.762673, 6.74344e-05, 0, 0.301847, 0.742133, 6.82788e-05, 0, 0.333333, 0.720779, 6.91959e-05, 0, 0.365079, 0.699386, 6.96817e-05, 0, 0.396826, 0.67732, 6.99583e-05, 0, 0.428572, 0.654888, 6.98447e-05, 0, 0.460318, 0.632499, 6.94063e-05, 0, 0.492064, 0.609825, 6.91612e-05, 0, 0.52381, 0.587287, 6.81576e-05, 0, 0.555556, 0.564743, 6.74138e-05, 0, 0.587302, 0.542409, 6.61617e-05, 0, 0.619048, 0.520282, 6.47785e-05, 0, 0.650794, 0.498506, 6.33836e-05, 0, 0.68254, 0.477102, 6.15905e-05, 0, 0.714286, 0.456167, 6.01013e-05, 0, 0.746032, 0.435728, 5.81457e-05, 0, 0.777778, 0.415809, 5.64215e-05, 0, 0.809524, 0.396517, 5.44997e-05, 0, 0.84127, 0.377737, 5.25061e-05, 0, 0.873016, 0.359698, 5.06831e-05, 0, 0.904762, 0.342164, 4.8568e-05, 0, 0.936508, 0.325417, 4.67826e-05, 0, 0.968254, 0.309186, 4.46736e-05, 0, 1, 1, 1.09018e-09, 0, 0, 1, 1.0904e-09, 0, 0, 1, 1.09393e-09, 0, 0, 1, 1.1095e-09, 0, 0, 1, 1.154e-09, 0, 0, 1, 1.26089e-09, 0, 0, 0.999999, 1.5059e-09, 0, 0, 0.999997, 2.07899e-09, 0, 0, 0.999994, 3.48164e-09, 0, 0, 0.999993, 7.05728e-09, 0, 0, 0.999987, 1.63692e-08, 0, 0, 0.999981, 4.06033e-08, 0, 0, 0.999969, 1.0245e-07, 0, 0, 0.999953, 2.55023e-07, 0, 0, 0.999925, 6.1511e-07, 0, 0, 0.999881, 1.42218e-06, 0, 0, 0.99981, 3.13086e-06, 0, 0, 0.99968, 6.53119e-06, 0, 0, 0.999418, 1.2832e-05, 0, 0, 0.998748, 2.32497e-05, 0, 0, 0.996066, 3.29522e-05, 0, 0, 0.988379, 1.79613e-05, 0, 0.000108799, 0.982567, 1.43715e-05, 0, 0.000921302, 0.976097, 1.48096e-05, 0, 0.00280738, 0.968475, 1.78905e-05, 0, 0.00596622, 0.964606, 2.53921e-05, 0, 0.0105284, 0.961564, 3.48623e-05, 0, 0.0165848, 0.955517, 3.57612e-05, 0, 0.0242, 0.948381, 3.43493e-05, 0, 0.03342, 0.941095, 4.05849e-05, 0, 0.0442777, 0.931923, 4.75394e-05, 0, 0.0567958, 0.91996, 4.84328e-05, 0, 0.0709879, 0.907419, 5.02146e-05, 0, 0.086861, 0.89618, 5.61654e-05, 0, 0.104415, 0.88337, 5.87612e-05, 0, 0.123643, 0.869046, 6.18057e-05, 0, 0.144531, 0.853278, 6.57392e-05, 0, 0.167057, 0.836091, 6.6303e-05, 0, 0.191188, 0.819644, 7.04445e-05, 0, 0.216878, 0.801246, 7.14071e-05, 0, 0.244062, 0.782031, 7.40093e-05, 0, 0.272649, 0.762066, 7.4685e-05, 0, 0.302509, 0.741964, 7.66647e-05, 0, 0.333442, 0.720554, 7.66328e-05, 0, 0.365079, 0.699098, 7.77857e-05, 0, 0.396826, 0.677189, 7.74633e-05, 0, 0.428572, 0.65484, 7.76235e-05, 0, 0.460318, 0.632496, 7.70316e-05, 0, 0.492064, 0.609908, 7.62669e-05, 0, 0.52381, 0.587312, 7.53972e-05, 0, 0.555556, 0.564938, 7.39994e-05, 0, 0.587302, 0.542577, 7.28382e-05, 0, 0.619048, 0.52062, 7.1112e-05, 0, 0.650794, 0.498819, 6.94004e-05, 0, 0.68254, 0.477555, 6.75575e-05, 0, 0.714286, 0.456568, 6.53449e-05, 0, 0.746032, 0.436278, 6.36068e-05, 0, 0.777778, 0.41637, 6.13466e-05, 0, 0.809524, 0.397144, 5.94177e-05, 0, 0.84127, 0.378412, 5.70987e-05, 0, 0.873016, 0.360376, 5.50419e-05, 0, 0.904762, 0.342906, 5.27422e-05, 0, 0.936508, 0.326136, 5.06544e-05, 0, 0.968254, 0.30997, 4.84307e-05, 0, 1, 1, 3.54014e-09, 0, 0, 1, 3.54073e-09, 0, 0, 1, 3.54972e-09, 0, 0, 1, 3.58929e-09, 0, 0, 1, 3.70093e-09, 0, 0, 0.999999, 3.96194e-09, 0, 0, 0.999998, 4.53352e-09, 0, 0, 0.999997, 5.78828e-09, 0, 0, 0.999994, 8.63812e-09, 0, 0, 0.999991, 1.53622e-08, 0, 0, 0.999985, 3.16356e-08, 0, 0, 0.999977, 7.12781e-08, 0, 0, 0.999964, 1.66725e-07, 0, 0, 0.999945, 3.90501e-07, 0, 0, 0.999912, 8.95622e-07, 0, 0, 0.999866, 1.98428e-06, 0, 0, 0.999786, 4.21038e-06, 0, 0, 0.999647, 8.50239e-06, 0, 0, 0.999356, 1.62059e-05, 0, 0, 0.998563, 2.82652e-05, 0, 0, 0.994928, 3.36309e-05, 0, 2.44244e-05, 0.987999, 1.78458e-05, 0, 0.000523891, 0.982893, 1.59162e-05, 0, 0.00194729, 0.977044, 1.78056e-05, 0, 0.00451099, 0.969972, 2.30624e-05, 0, 0.00835132, 0.964237, 3.13922e-05, 0, 0.013561, 0.960791, 4.06145e-05, 0, 0.0202056, 0.954292, 3.72796e-05, 0, 0.0283321, 0.948052, 4.03199e-05, 0, 0.0379739, 0.940938, 4.79537e-05, 0, 0.0491551, 0.931689, 5.45292e-05, 0, 0.0618918, 0.91987, 5.4038e-05, 0, 0.0761941, 0.907665, 5.89909e-05, 0, 0.0920672, 0.895281, 6.42651e-05, 0, 0.109511, 0.882621, 6.59707e-05, 0, 0.12852, 0.86873, 7.09973e-05, 0, 0.149085, 0.853008, 7.42221e-05, 0, 0.171189, 0.835944, 7.61754e-05, 0, 0.194809, 0.818949, 7.97052e-05, 0, 0.21991, 0.800951, 8.12434e-05, 0, 0.246447, 0.781847, 8.38075e-05, 0, 0.274352, 0.761649, 8.4501e-05, 0, 0.303535, 0.74152, 8.60258e-05, 0, 0.333857, 0.720495, 8.66233e-05, 0, 0.365104, 0.698742, 8.68326e-05, 0, 0.396826, 0.677096, 8.7133e-05, 0, 0.428572, 0.654782, 8.63497e-05, 0, 0.460318, 0.632335, 8.60206e-05, 0, 0.492064, 0.610031, 8.49337e-05, 0, 0.52381, 0.587457, 8.38279e-05, 0, 0.555556, 0.56513, 8.2309e-05, 0, 0.587302, 0.542877, 8.03542e-05, 0, 0.619048, 0.5209, 7.86928e-05, 0, 0.650794, 0.499291, 7.65171e-05, 0, 0.68254, 0.477971, 7.44753e-05, 0, 0.714286, 0.457221, 7.2209e-05, 0, 0.746032, 0.436803, 6.97448e-05, 0, 0.777778, 0.417083, 6.75333e-05, 0, 0.809524, 0.397749, 6.48058e-05, 0, 0.84127, 0.379177, 6.25759e-05, 0, 0.873016, 0.361061, 5.98584e-05, 0, 0.904762, 0.343713, 5.75797e-05, 0, 0.936508, 0.326894, 5.49999e-05, 0, 0.968254, 0.310816, 5.27482e-05, 0, 1, 1, 1.0153e-08, 0, 0, 1, 1.01544e-08, 0, 0, 1, 1.01751e-08, 0, 0, 1, 1.02662e-08, 0, 0, 1, 1.0521e-08, 0, 0, 0.999999, 1.11049e-08, 0, 0, 0.999999, 1.23408e-08, 0, 0, 0.999996, 1.4924e-08, 0, 0, 0.999992, 2.04471e-08, 0, 0, 0.999989, 3.26539e-08, 0, 0, 0.99998, 6.03559e-08, 0, 0, 0.999971, 1.23936e-07, 0, 0, 0.999955, 2.69058e-07, 0, 0, 0.999933, 5.93604e-07, 0, 0, 0.999901, 1.29633e-06, 0, 0, 0.999847, 2.75621e-06, 0, 0, 0.999761, 5.64494e-06, 0, 0, 0.999607, 1.10485e-05, 0, 0, 0.999282, 2.04388e-05, 0, 0, 0.99831, 3.41084e-05, 0, 2.2038e-07, 0.993288, 2.94949e-05, 0, 0.000242388, 0.987855, 1.92736e-05, 0, 0.0012503, 0.983167, 1.82383e-05, 0, 0.0032745, 0.977908, 2.18633e-05, 0, 0.00646321, 0.971194, 2.90662e-05, 0, 0.0109133, 0.963867, 3.86401e-05, 0, 0.0166927, 0.95982, 4.62827e-05, 0, 0.0238494, 0.953497, 4.20705e-05, 0, 0.0324178, 0.947621, 4.77743e-05, 0, 0.0424225, 0.940611, 5.68258e-05, 0, 0.0538808, 0.931174, 6.18061e-05, 0, 0.0668047, 0.919919, 6.27098e-05, 0, 0.0812014, 0.907856, 6.94714e-05, 0, 0.0970745, 0.894509, 7.35008e-05, 0, 0.114424, 0.881954, 7.63369e-05, 0, 0.133246, 0.868309, 8.21896e-05, 0, 0.153534, 0.852511, 8.3769e-05, 0, 0.175275, 0.835821, 8.81615e-05, 0, 0.198453, 0.817981, 8.96368e-05, 0, 0.223042, 0.800504, 9.30906e-05, 0, 0.249009, 0.78141, 9.45056e-05, 0, 0.276304, 0.761427, 9.63605e-05, 0, 0.304862, 0.74094, 9.68088e-05, 0, 0.334584, 0.720233, 9.81481e-05, 0, 0.365322, 0.698592, 9.79122e-05, 0, 0.396826, 0.676763, 9.81057e-05, 0, 0.428571, 0.654808, 9.73956e-05, 0, 0.460318, 0.632326, 9.62619e-05, 0, 0.492064, 0.610049, 9.52996e-05, 0, 0.52381, 0.58763, 9.33334e-05, 0, 0.555556, 0.565261, 9.17573e-05, 0, 0.587302, 0.543244, 8.96636e-05, 0, 0.619048, 0.521273, 8.73304e-05, 0, 0.650794, 0.499818, 8.52648e-05, 0, 0.68254, 0.478536, 8.23961e-05, 0, 0.714286, 0.457826, 7.9939e-05, 0, 0.746032, 0.437549, 7.7126e-05, 0, 0.777778, 0.41776, 7.43043e-05, 0, 0.809524, 0.39863, 7.16426e-05, 0, 0.84127, 0.379954, 6.86456e-05, 0, 0.873016, 0.362025, 6.60514e-05, 0, 0.904762, 0.344581, 6.30755e-05, 0, 0.936508, 0.327909, 6.05439e-05, 0, 0.968254, 0.311736, 5.76345e-05, 0, 1, 1, 2.63344e-08, 0, 0, 1, 2.63373e-08, 0, 0, 1, 2.63815e-08, 0, 0, 1, 2.65753e-08, 0, 0, 1, 2.71132e-08, 0, 0, 0.999999, 2.83279e-08, 0, 0, 0.999997, 3.0833e-08, 0, 0, 0.999995, 3.58711e-08, 0, 0, 0.999992, 4.61266e-08, 0, 0, 0.999985, 6.7574e-08, 0, 0, 0.999977, 1.1358e-07, 0, 0, 0.999966, 2.13657e-07, 0, 0, 0.999948, 4.31151e-07, 0, 0, 0.999923, 8.96656e-07, 0, 0, 0.999884, 1.86603e-06, 0, 0, 0.999826, 3.81115e-06, 0, 0, 0.999732, 7.54184e-06, 0, 0, 0.999561, 1.43192e-05, 0, 0, 0.999191, 2.57061e-05, 0, 0, 0.997955, 4.05724e-05, 0, 7.44132e-05, 0.992228, 2.76537e-05, 0, 0.000716477, 0.987638, 2.08885e-05, 0, 0.0022524, 0.983395, 2.15226e-05, 0, 0.00484816, 0.978614, 2.70795e-05, 0, 0.00860962, 0.972389, 3.65282e-05, 0, 0.0136083, 0.964392, 4.74747e-05, 0, 0.0198941, 0.95861, 5.09141e-05, 0, 0.0275023, 0.952806, 4.8963e-05, 0, 0.0364584, 0.94712, 5.71119e-05, 0, 0.04678, 0.940104, 6.71704e-05, 0, 0.0584799, 0.930398, 6.87586e-05, 0, 0.0715665, 0.919866, 7.38161e-05, 0, 0.086045, 0.907853, 8.13235e-05, 0, 0.101918, 0.894078, 8.34582e-05, 0, 0.119186, 0.881177, 8.92093e-05, 0, 0.137845, 0.867575, 9.44548e-05, 0, 0.157891, 0.852107, 9.69607e-05, 0, 0.179316, 0.835502, 0.000101456, 0, 0.202106, 0.81756, 0.000103256, 0, 0.226243, 0.79984, 0.000106954, 0, 0.251704, 0.780998, 0.000108066, 0, 0.278451, 0.761132, 0.000110111, 0, 0.306436, 0.740429, 0.000110459, 0, 0.335586, 0.719836, 0.000111219, 0, 0.365796, 0.698467, 0.00011145, 0, 0.3969, 0.676446, 0.000110393, 0, 0.428571, 0.654635, 0.000110035, 0, 0.460318, 0.632411, 0.000108548, 0, 0.492064, 0.609986, 0.000106963, 0, 0.52381, 0.587872, 0.000105238, 0, 0.555556, 0.565528, 0.000102665, 0, 0.587302, 0.543563, 0.000100543, 0, 0.619048, 0.52176, 9.76182e-05, 0, 0.650794, 0.500188, 9.47099e-05, 0, 0.68254, 0.479204, 9.19929e-05, 0, 0.714286, 0.458413, 8.86139e-05, 0, 0.746032, 0.438314, 8.57839e-05, 0, 0.777778, 0.418573, 8.2411e-05, 0, 0.809524, 0.39947, 7.92211e-05, 0, 0.84127, 0.380892, 7.59546e-05, 0, 0.873016, 0.362953, 7.27571e-05, 0, 0.904762, 0.345601, 6.95738e-05, 0, 0.936508, 0.328895, 6.64907e-05, 0, 0.968254, 0.312808, 6.34277e-05, 0, 1, 1, 6.28647e-08, 0, 0, 1, 6.28705e-08, 0, 0, 1, 6.29587e-08, 0, 0, 1, 6.33441e-08, 0, 0, 0.999999, 6.44087e-08, 0, 0, 0.999998, 6.67856e-08, 0, 0, 0.999997, 7.15889e-08, 0, 0, 0.999995, 8.09577e-08, 0, 0, 0.999989, 9.92764e-08, 0, 0, 0.999983, 1.35834e-07, 0, 0, 0.999974, 2.10482e-07, 0, 0, 0.999959, 3.65215e-07, 0, 0, 0.999939, 6.86693e-07, 0, 0, 0.999911, 1.3472e-06, 0, 0, 0.999868, 2.6731e-06, 0, 0, 0.999804, 5.24756e-06, 0, 0, 0.9997, 1.00403e-05, 0, 0, 0.99951, 1.85019e-05, 0, 0, 0.999078, 3.22036e-05, 0, 6.20676e-06, 0.997428, 4.70002e-05, 0, 0.000341552, 0.99162, 2.87123e-05, 0, 0.00143727, 0.987479, 2.34706e-05, 0, 0.00349201, 0.983582, 2.60083e-05, 0, 0.0066242, 0.979186, 3.37927e-05, 0, 0.0109113, 0.97325, 4.54689e-05, 0, 0.0164064, 0.965221, 5.73759e-05, 0, 0.0231463, 0.957262, 5.44114e-05, 0, 0.0311571, 0.952211, 5.87006e-05, 0, 0.0404572, 0.946631, 6.92256e-05, 0, 0.0510592, 0.939391, 7.87819e-05, 0, 0.0629723, 0.929795, 7.92368e-05, 0, 0.0762025, 0.91965, 8.75075e-05, 0, 0.090753, 0.907737, 9.50903e-05, 0, 0.106626, 0.893899, 9.72963e-05, 0, 0.123822, 0.880239, 0.00010459, 0, 0.142337, 0.866562, 0.000107689, 0, 0.16217, 0.85164, 0.000113081, 0, 0.183314, 0.835021, 0.000116636, 0, 0.20576, 0.817311, 0.000120074, 0, 0.229496, 0.798845, 0.000121921, 0, 0.254502, 0.780479, 0.00012475, 0, 0.280753, 0.760694, 0.000125255, 0, 0.308212, 0.740142, 0.000126719, 0, 0.336825, 0.719248, 0.00012636, 0, 0.366517, 0.698209, 0.000126712, 0, 0.397167, 0.676398, 0.000125769, 0, 0.428578, 0.654378, 0.000124432, 0, 0.460318, 0.632484, 0.000123272, 0, 0.492064, 0.610113, 0.00012085, 0, 0.52381, 0.587931, 0.000118411, 0, 0.555556, 0.565872, 0.00011569, 0, 0.587302, 0.543814, 0.000112521, 0, 0.619048, 0.522265, 0.000109737, 0, 0.650794, 0.500835, 0.000106228, 0, 0.68254, 0.479818, 0.000102591, 0, 0.714286, 0.459258, 9.91288e-05, 0, 0.746032, 0.439061, 9.52325e-05, 0, 0.777778, 0.419552, 9.1895e-05, 0, 0.809524, 0.400399, 8.79051e-05, 0, 0.84127, 0.381976, 8.44775e-05, 0, 0.873016, 0.364009, 8.06316e-05, 0, 0.904762, 0.346761, 7.71848e-05, 0, 0.936508, 0.330049, 7.35429e-05, 0, 0.968254, 0.314018, 7.02103e-05, 0, 1, 1, 1.39968e-07, 0, 0, 1, 1.39979e-07, 0, 0, 1, 1.40145e-07, 0, 0, 1, 1.4087e-07, 0, 0, 0.999999, 1.42865e-07, 0, 0, 0.999998, 1.47279e-07, 0, 0, 0.999997, 1.56057e-07, 0, 0, 0.999992, 1.7276e-07, 0, 0, 0.999989, 2.04352e-07, 0, 0, 0.99998, 2.6494e-07, 0, 0, 0.999969, 3.83435e-07, 0, 0, 0.999953, 6.18641e-07, 0, 0, 0.999929, 1.08755e-06, 0, 0, 0.999898, 2.01497e-06, 0, 0, 0.999849, 3.81346e-06, 0, 0, 0.999778, 7.19815e-06, 0, 0, 0.999661, 1.33215e-05, 0, 0, 0.999451, 2.38313e-05, 0, 0, 0.998936, 4.01343e-05, 0, 0.000113724, 0.99662, 5.17346e-05, 0, 0.000820171, 0.991094, 3.04323e-05, 0, 0.00238143, 0.987487, 2.81757e-05, 0, 0.00493527, 0.983731, 3.20048e-05, 0, 0.00856859, 0.979647, 4.23905e-05, 0, 0.0133393, 0.973837, 5.62935e-05, 0, 0.0192863, 0.96584, 6.77442e-05, 0, 0.0264369, 0.956309, 6.23073e-05, 0, 0.03481, 0.951523, 7.04131e-05, 0, 0.0444184, 0.946003, 8.36594e-05, 0, 0.0552713, 0.938454, 9.11736e-05, 0, 0.0673749, 0.929279, 9.38264e-05, 0, 0.0807329, 0.919239, 0.000103754, 0, 0.0953479, 0.907293, 0.000109928, 0, 0.111221, 0.893936, 0.000115257, 0, 0.128352, 0.879674, 0.000122265, 0, 0.14674, 0.865668, 0.000125733, 0, 0.166382, 0.850998, 0.000132305, 0, 0.187276, 0.834498, 0.000134844, 0, 0.209413, 0.816903, 0.000139276, 0, 0.232786, 0.798235, 0.000140984, 0, 0.257382, 0.779724, 0.00014378, 0, 0.283181, 0.760251, 0.000144623, 0, 0.310156, 0.739808, 0.000145228, 0, 0.338269, 0.718762, 0.00014539, 0, 0.367461, 0.697815, 0.000144432, 0, 0.397646, 0.67631, 0.000143893, 0, 0.428685, 0.654278, 0.000141846, 0, 0.460318, 0.632347, 0.00013935, 0, 0.492064, 0.610296, 0.000137138, 0, 0.52381, 0.588039, 0.000133806, 0, 0.555556, 0.566218, 0.000130755, 0, 0.587302, 0.544346, 0.000127128, 0, 0.619048, 0.522701, 0.000123002, 0, 0.650794, 0.501542, 0.000119443, 0, 0.68254, 0.480508, 0.000115055, 0, 0.714286, 0.460092, 0.000111032, 0, 0.746032, 0.440021, 0.000106635, 0, 0.777778, 0.420446, 0.000102162, 0, 0.809524, 0.401512, 9.8184e-05, 0, 0.84127, 0.38299, 9.36497e-05, 0, 0.873016, 0.365232, 8.9813e-05, 0, 0.904762, 0.347865, 8.53073e-05, 0, 0.936508, 0.331342, 8.17068e-05, 0, 0.968254, 0.315202, 7.73818e-05, 0, 1, 1, 2.9368e-07, 0, 0, 1, 2.937e-07, 0, 0, 1, 2.93998e-07, 0, 0, 1, 2.95298e-07, 0, 0, 0.999999, 2.98865e-07, 0, 0, 0.999998, 3.067e-07, 0, 0, 0.999995, 3.22082e-07, 0, 0, 0.999992, 3.50767e-07, 0, 0, 0.999986, 4.03538e-07, 0, 0, 0.999976, 5.01372e-07, 0, 0, 0.999964, 6.8562e-07, 0, 0, 0.999945, 1.0374e-06, 0, 0, 0.999919, 1.71269e-06, 0, 0, 0.999882, 3.00175e-06, 0, 0, 0.999829, 5.42144e-06, 0, 0, 0.999749, 9.84182e-06, 0, 0, 0.99962, 1.76213e-05, 0, 0, 0.999382, 3.05995e-05, 0, 1.38418e-05, 0.998751, 4.96686e-05, 0, 0.000389844, 0.995344, 5.10733e-05, 0, 0.00150343, 0.990768, 3.45829e-05, 0, 0.00352451, 0.987464, 3.42841e-05, 0, 0.00655379, 0.983846, 3.99072e-05, 0, 0.0106554, 0.980007, 5.33219e-05, 0, 0.0158723, 0.974494, 6.96992e-05, 0, 0.0222333, 0.96622, 7.76754e-05, 0, 0.029758, 0.956273, 7.47718e-05, 0, 0.0384596, 0.950952, 8.64611e-05, 0, 0.0483473, 0.945215, 0.000100464, 0, 0.0594266, 0.937287, 0.000103729, 0, 0.0717019, 0.928649, 0.000111665, 0, 0.0851752, 0.918791, 0.00012353, 0, 0.0998479, 0.906685, 0.000127115, 0, 0.115721, 0.893706, 0.00013628, 0, 0.132794, 0.879248, 0.000142427, 0, 0.151067, 0.864685, 0.000148091, 0, 0.170538, 0.850032, 0.000153517, 0, 0.191204, 0.833853, 0.000157322, 0, 0.213063, 0.816353, 0.000161086, 0, 0.236107, 0.797834, 0.000164111, 0, 0.260329, 0.778831, 0.000165446, 0, 0.285714, 0.759756, 0.000167492, 0, 0.312243, 0.739419, 0.000166928, 0, 0.339887, 0.718491, 0.000167, 0, 0.368604, 0.697392, 0.000165674, 0, 0.398329, 0.676102, 0.000163815, 0, 0.428961, 0.654243, 0.000162003, 0, 0.460331, 0.632176, 0.000158831, 0, 0.492064, 0.610407, 0.000155463, 0, 0.52381, 0.588394, 0.000152062, 0, 0.555556, 0.56645, 0.000147665, 0, 0.587302, 0.5449, 0.00014375, 0, 0.619048, 0.523276, 0.000138905, 0, 0.650794, 0.502179, 0.000134189, 0, 0.68254, 0.481359, 0.000129392, 0, 0.714286, 0.46092, 0.000124556, 0, 0.746032, 0.441084, 0.00011957, 0, 0.777778, 0.421517, 0.000114652, 0, 0.809524, 0.402721, 0.000109688, 0, 0.84127, 0.384222, 0.000104667, 0, 0.873016, 0.366534, 9.99633e-05, 0, 0.904762, 0.349205, 9.50177e-05, 0, 0.936508, 0.332702, 9.07301e-05, 0, 0.968254, 0.316599, 8.59769e-05, 0, 1, 1, 5.85473e-07, 0, 0, 1, 5.85507e-07, 0, 0, 1, 5.8602e-07, 0, 0, 0.999999, 5.88259e-07, 0, 0, 0.999999, 5.94381e-07, 0, 0, 0.999998, 6.07754e-07, 0, 0, 0.999995, 6.33729e-07, 0, 0, 0.99999, 6.8137e-07, 0, 0, 0.999984, 7.67003e-07, 0, 0, 0.999973, 9.21212e-07, 0, 0, 0.999959, 1.20218e-06, 0, 0, 0.999936, 1.72024e-06, 0, 0, 0.999907, 2.68088e-06, 0, 0, 0.999866, 4.45512e-06, 0, 0, 0.999806, 7.68481e-06, 0, 0, 0.999716, 1.342e-05, 0, 0, 0.999576, 2.32473e-05, 0, 0, 0.9993, 3.91694e-05, 0, 0.000129917, 0.998498, 6.08429e-05, 0, 0.000845035, 0.994132, 4.89743e-05, 0, 0.00237616, 0.99031, 3.84644e-05, 0, 0.00484456, 0.987409, 4.21768e-05, 0, 0.00832472, 0.983981, 5.04854e-05, 0, 0.0128643, 0.980268, 6.71028e-05, 0, 0.0184947, 0.974875, 8.52749e-05, 0, 0.025237, 0.966063, 8.5531e-05, 0, 0.0331046, 0.956779, 9.00588e-05, 0, 0.0421067, 0.950259, 0.00010577, 0, 0.0522487, 0.944239, 0.000119458, 0, 0.0635343, 0.936341, 0.000122164, 0, 0.0759654, 0.928047, 0.000134929, 0, 0.0895434, 0.918065, 0.000145544, 0, 0.104269, 0.906267, 0.000150531, 0, 0.120142, 0.893419, 0.000161652, 0, 0.137163, 0.878758, 0.00016593, 0, 0.15533, 0.863699, 0.000174014, 0, 0.174645, 0.848876, 0.000177877, 0, 0.195106, 0.833032, 0.000184049, 0, 0.21671, 0.815557, 0.000186088, 0, 0.239454, 0.797323, 0.00019054, 0, 0.263332, 0.778124, 0.000191765, 0, 0.288336, 0.758929, 0.000192535, 0, 0.314451, 0.738979, 0.000192688, 0, 0.341658, 0.718213, 0.000191522, 0, 0.369924, 0.696947, 0.000190491, 0, 0.399202, 0.675807, 0.000187913, 0, 0.429416, 0.654147, 0.000184451, 0, 0.460447, 0.63229, 0.000181442, 0, 0.492064, 0.610499, 0.000177139, 0, 0.523809, 0.588747, 0.000172596, 0, 0.555555, 0.566783, 0.000167457, 0, 0.587301, 0.545359, 0.000162518, 0, 0.619048, 0.523984, 0.000156818, 0, 0.650794, 0.502917, 0.000151884, 0, 0.68254, 0.482294, 0.000145514, 0, 0.714286, 0.461945, 0.000140199, 0, 0.746032, 0.442133, 0.000134101, 0, 0.777778, 0.422705, 0.000128374, 0, 0.809524, 0.403916, 0.000122996, 0, 0.84127, 0.38554, 0.000116808, 0, 0.873016, 0.367909, 0.000111973, 0, 0.904762, 0.350651, 0.000105938, 0, 0.936508, 0.334208, 0.000101355, 0, 0.968254, 0.318123, 9.57629e-05, 0, 1, 1, 1.11633e-06, 0, 0, 1, 1.11639e-06, 0, 0, 1, 1.11725e-06, 0, 0, 1, 1.12096e-06, 0, 0, 0.999999, 1.1311e-06, 0, 0, 0.999997, 1.15315e-06, 0, 0, 0.999995, 1.1956e-06, 0, 0, 0.999989, 1.27239e-06, 0, 0, 0.999981, 1.40772e-06, 0, 0, 0.999969, 1.64541e-06, 0, 0, 0.999952, 2.06607e-06, 0, 0, 0.999928, 2.81783e-06, 0, 0, 0.999895, 4.16835e-06, 0, 0, 0.999848, 6.58728e-06, 0, 0, 0.999781, 1.08648e-05, 0, 0, 0.999682, 1.82579e-05, 0, 0, 0.999523, 3.06003e-05, 0, 1.59122e-05, 0.999205, 4.99862e-05, 0, 0.000391184, 0.998131, 7.3306e-05, 0, 0.00147534, 0.993334, 5.13229e-05, 0, 0.0034227, 0.99016, 4.67783e-05, 0, 0.00632232, 0.987321, 5.23413e-05, 0, 0.0102295, 0.984099, 6.4267e-05, 0, 0.0151794, 0.980432, 8.43042e-05, 0, 0.0211947, 0.974976, 0.000102819, 0, 0.0282899, 0.966429, 9.96234e-05, 0, 0.0364739, 0.957633, 0.000111074, 0, 0.0457522, 0.949422, 0.000128644, 0, 0.0561278, 0.943045, 0.000140076, 0, 0.0676023, 0.935448, 0.000146349, 0, 0.0801762, 0.927225, 0.000161854, 0, 0.0938499, 0.917033, 0.000169135, 0, 0.108623, 0.905762, 0.000179987, 0, 0.124496, 0.892879, 0.000189832, 0, 0.141469, 0.878435, 0.000195881, 0, 0.159541, 0.863114, 0.00020466, 0, 0.178713, 0.84776, 0.000209473, 0, 0.198985, 0.832084, 0.000214861, 0, 0.220355, 0.814915, 0.000217695, 0, 0.242823, 0.796711, 0.000220313, 0, 0.266385, 0.777603, 0.00022313, 0, 0.291036, 0.757991, 0.000222471, 0, 0.316767, 0.738371, 0.000222869, 0, 0.343563, 0.717872, 0.000221243, 0, 0.371402, 0.696619, 0.000218089, 0, 0.400248, 0.675379, 0.00021562, 0, 0.430047, 0.65411, 0.00021169, 0, 0.460709, 0.63241, 0.000206947, 0, 0.492079, 0.61046, 0.000201709, 0, 0.52381, 0.58903, 0.000196753, 0, 0.555556, 0.567267, 0.000189637, 0, 0.587302, 0.545886, 0.000184735, 0, 0.619048, 0.524714, 0.000177257, 0, 0.650794, 0.503789, 0.000171424, 0, 0.68254, 0.483204, 0.000164688, 0, 0.714286, 0.462976, 0.000157172, 0, 0.746032, 0.443294, 0.000151341, 0, 0.777778, 0.423988, 0.000143737, 0, 0.809524, 0.405325, 0.000138098, 0, 0.84127, 0.386981, 0.000130698, 0, 0.873016, 0.369436, 0.000125276, 0, 0.904762, 0.35219, 0.000118349, 0, 0.936508, 0.335804, 0.00011312, 0, 0.968254, 0.319749, 0.000106687, 0, 1, 1, 2.04685e-06, 0, 0, 1, 2.04694e-06, 0, 0, 1, 2.04831e-06, 0, 0, 0.999999, 2.05428e-06, 0, 0, 0.999999, 2.07056e-06, 0, 0, 0.999997, 2.10581e-06, 0, 0, 0.999993, 2.1732e-06, 0, 0, 0.999987, 2.29365e-06, 0, 0, 0.999979, 2.50243e-06, 0, 0, 0.999965, 2.86127e-06, 0, 0, 0.999947, 3.48028e-06, 0, 0, 0.999918, 4.55588e-06, 0, 0, 0.999881, 6.43303e-06, 0, 0, 0.999828, 9.70064e-06, 0, 0, 0.999753, 1.53233e-05, 0, 0, 0.999642, 2.4793e-05, 0, 0, 0.999464, 4.02032e-05, 0, 0.000122947, 0.999089, 6.35852e-05, 0, 0.000807414, 0.997567, 8.57026e-05, 0, 0.00227206, 0.992903, 5.94912e-05, 0, 0.00462812, 0.990011, 5.78515e-05, 0, 0.00794162, 0.987192, 6.5399e-05, 0, 0.0122534, 0.98418, 8.19675e-05, 0, 0.0175888, 0.980491, 0.000105514, 0, 0.0239635, 0.974779, 0.000121532, 0, 0.031387, 0.96675, 0.000119144, 0, 0.0398644, 0.958248, 0.000136125, 0, 0.0493982, 0.948884, 0.000155408, 0, 0.0599896, 0.941673, 0.000162281, 0, 0.0716382, 0.934521, 0.000176754, 0, 0.0843437, 0.926205, 0.000192873, 0, 0.0981056, 0.916089, 0.000200038, 0, 0.112923, 0.904963, 0.000213624, 0, 0.128796, 0.892089, 0.000221834, 0, 0.145725, 0.878028, 0.000232619, 0, 0.163709, 0.86249, 0.000238632, 0, 0.182749, 0.846587, 0.000247002, 0, 0.202847, 0.830988, 0.000250702, 0, 0.224001, 0.814165, 0.000255562, 0, 0.246214, 0.796135, 0.000257505, 0, 0.269482, 0.777052, 0.000258625, 0, 0.293805, 0.757201, 0.000258398, 0, 0.319176, 0.737655, 0.000256714, 0, 0.345587, 0.717477, 0.000255187, 0, 0.373021, 0.696433, 0.000251792, 0, 0.401454, 0.675084, 0.000247223, 0, 0.430844, 0.653907, 0.000242213, 0, 0.461125, 0.632561, 0.000237397, 0, 0.492187, 0.610658, 0.000229313, 0, 0.52381, 0.589322, 0.000224402, 0, 0.555556, 0.567857, 0.000216116, 0, 0.587302, 0.54652, 0.000209124, 0, 0.619048, 0.525433, 0.000201601, 0, 0.650794, 0.504679, 0.000192957, 0, 0.68254, 0.484203, 0.000186052, 0, 0.714286, 0.464203, 0.000177672, 0, 0.746032, 0.444549, 0.000170005, 0, 0.777778, 0.425346, 0.000162401, 0, 0.809524, 0.406706, 0.0001544, 0, 0.84127, 0.388576, 0.000147437, 0, 0.873016, 0.37094, 0.000139493, 0, 0.904762, 0.353996, 0.000133219, 0, 0.936508, 0.337391, 0.000125573, 0, 0.968254, 0.321648, 0.000119867, 0, 1, 1, 3.62511e-06, 0, 0, 1, 3.62525e-06, 0, 0, 1, 3.62739e-06, 0, 0, 0.999999, 3.63673e-06, 0, 0, 0.999998, 3.66214e-06, 0, 0, 0.999996, 3.71698e-06, 0, 0, 0.999992, 3.82116e-06, 0, 0, 0.999986, 4.00554e-06, 0, 0, 0.999976, 4.32058e-06, 0, 0, 0.999961, 4.85194e-06, 0, 0, 0.999938, 5.74808e-06, 0, 0, 0.999908, 7.26643e-06, 0, 0, 0.999865, 9.84707e-06, 0, 0, 0.999807, 1.42217e-05, 0, 0, 0.999723, 2.15581e-05, 0, 0, 0.999602, 3.36114e-05, 0, 1.19113e-05, 0.999398, 5.27353e-05, 0, 0.000355813, 0.998946, 8.05809e-05, 0, 0.00137768, 0.996647, 9.42908e-05, 0, 0.00322469, 0.992298, 6.68733e-05, 0, 0.00597897, 0.989802, 7.16564e-05, 0, 0.00968903, 0.987019, 8.21355e-05, 0, 0.0143845, 0.984219, 0.000104555, 0, 0.0200831, 0.980425, 0.000131245, 0, 0.0267948, 0.974241, 0.000139613, 0, 0.034525, 0.967006, 0.000145931, 0, 0.0432757, 0.95893, 0.000167153, 0, 0.0530471, 0.949157, 0.000188146, 0, 0.0638386, 0.94062, 0.000194625, 0, 0.0756487, 0.933509, 0.000213721, 0, 0.0884762, 0.925088, 0.000229616, 0, 0.10232, 0.915178, 0.000239638, 0, 0.117178, 0.904093, 0.000254814, 0, 0.133051, 0.891337, 0.000263685, 0, 0.149939, 0.877326, 0.000274789, 0, 0.167841, 0.861794, 0.000280534, 0, 0.18676, 0.845758, 0.000289534, 0, 0.206696, 0.829792, 0.000294446, 0, 0.22765, 0.813037, 0.000296877, 0, 0.249625, 0.795285, 0.000300217, 0, 0.27262, 0.776323, 0.000299826, 0, 0.296636, 0.756673, 0.000299787, 0, 0.321671, 0.736856, 0.000297867, 0, 0.347718, 0.716883, 0.000294052, 0, 0.374768, 0.696089, 0.000289462, 0, 0.402804, 0.67505, 0.000285212, 0, 0.431796, 0.653509, 0.00027653, 0, 0.461695, 0.63258, 0.000271759, 0, 0.49242, 0.61104, 0.000262811, 0, 0.523822, 0.589567, 0.000255151, 0, 0.555556, 0.568322, 0.000246434, 0, 0.587302, 0.547235, 0.000237061, 0, 0.619048, 0.52616, 0.000228343, 0, 0.650794, 0.505716, 0.000219236, 0, 0.68254, 0.485274, 0.000209595, 0, 0.714286, 0.465411, 0.000201011, 0, 0.746032, 0.445854, 0.00019109, 0, 0.777778, 0.426911, 0.000182897, 0, 0.809524, 0.408222, 0.000173569, 0, 0.84127, 0.390307, 0.000165496, 0, 0.873016, 0.372624, 0.000156799, 0, 0.904762, 0.355804, 0.00014917, 0, 0.936508, 0.33924, 0.000140907, 0, 0.968254, 0.323534, 0.000134062, 0, 1, 1, 6.22487e-06, 0, 0, 1, 6.2251e-06, 0, 0, 1, 6.22837e-06, 0, 0, 0.999999, 6.24259e-06, 0, 0, 0.999998, 6.28127e-06, 0, 0, 0.999996, 6.36451e-06, 0, 0, 0.999991, 6.5218e-06, 0, 0, 0.999984, 6.79782e-06, 0, 0, 0.999973, 7.26361e-06, 0, 0, 0.999955, 8.03644e-06, 0, 0, 0.999931, 9.31397e-06, 0, 0, 0.999896, 1.14299e-05, 0, 0, 0.999847, 1.49402e-05, 0, 0, 0.999784, 2.07461e-05, 0, 0, 0.999692, 3.02493e-05, 0, 0, 0.999554, 4.54957e-05, 0, 9.97275e-05, 0.999326, 6.90762e-05, 0, 0.000724813, 0.998757, 0.000101605, 0, 0.0020972, 0.995367, 9.58745e-05, 0, 0.00432324, 0.99209, 8.32808e-05, 0, 0.00746347, 0.989517, 8.87601e-05, 0, 0.0115534, 0.987008, 0.00010564, 0, 0.0166134, 0.98421, 0.000133179, 0, 0.0226552, 0.98021, 0.000161746, 0, 0.0296838, 0.973676, 0.000161821, 0, 0.0377016, 0.967052, 0.000178635, 0, 0.0467079, 0.959385, 0.000206765, 0, 0.0567013, 0.949461, 0.00022476, 0, 0.0676796, 0.939578, 0.00023574, 0, 0.0796403, 0.932416, 0.00025893, 0, 0.0925812, 0.923759, 0.000271228, 0, 0.106501, 0.914223, 0.000289165, 0, 0.121397, 0.902942, 0.000301156, 0, 0.13727, 0.890419, 0.000313852, 0, 0.15412, 0.876639, 0.000324408, 0, 0.171946, 0.861316, 0.00033249, 0, 0.190751, 0.84496, 0.000338497, 0, 0.210537, 0.828427, 0.000345861, 0, 0.231305, 0.811871, 0.000347863, 0, 0.253057, 0.794397, 0.000350225, 0, 0.275797, 0.775726, 0.000349915, 0, 0.299525, 0.75617, 0.000347297, 0, 0.324242, 0.736091, 0.000344232, 0, 0.349947, 0.716213, 0.000340835, 0, 0.376633, 0.695736, 0.000332369, 0, 0.404289, 0.674961, 0.000327943, 0, 0.432895, 0.653518, 0.000318533, 0, 0.462415, 0.632574, 0.000310391, 0, 0.492788, 0.61134, 0.000300755, 0, 0.523909, 0.590017, 0.000290506, 0, 0.555556, 0.568752, 0.000280446, 0, 0.587302, 0.548061, 0.000269902, 0, 0.619048, 0.52711, 0.000258815, 0, 0.650794, 0.506682, 0.000248481, 0, 0.68254, 0.486524, 0.000237141, 0, 0.714286, 0.466812, 0.000226872, 0, 0.746032, 0.44732, 0.000216037, 0, 0.777778, 0.428473, 0.000205629, 0, 0.809524, 0.409921, 0.000195691, 0, 0.84127, 0.392028, 0.000185457, 0, 0.873016, 0.374606, 0.000176436, 0, 0.904762, 0.357601, 0.000166508, 0, 0.936508, 0.341348, 0.000158385, 0, 0.968254, 0.32542, 0.000149203, 0, 1, 1, 1.03967e-05, 0, 0, 1, 1.0397e-05, 0, 0, 1, 1.04019e-05, 0, 0, 0.999999, 1.04231e-05, 0, 0, 0.999998, 1.04806e-05, 0, 0, 0.999995, 1.06042e-05, 0, 0, 0.999991, 1.08366e-05, 0, 0, 0.999982, 1.12415e-05, 0, 0, 0.999968, 1.19174e-05, 0, 0, 0.99995, 1.30227e-05, 0, 0, 0.999922, 1.48176e-05, 0, 0, 0.999884, 1.77303e-05, 0, 0, 0.99983, 2.24564e-05, 0, 0, 0.999758, 3.00966e-05, 0, 0, 0.999654, 4.23193e-05, 0, 5.49083e-06, 0.999503, 6.14848e-05, 0, 0.000296087, 0.999237, 9.03576e-05, 0, 0.00123144, 0.998491, 0.0001271, 0, 0.00295954, 0.994594, 0.000107754, 0, 0.00555829, 0.99178, 0.000103025, 0, 0.00907209, 0.989265, 0.00011154, 0, 0.0135257, 0.986998, 0.000136296, 0, 0.0189327, 0.984137, 0.000169154, 0, 0.0252993, 0.979798, 0.000196671, 0, 0.0326272, 0.97337, 0.000196678, 0, 0.0409157, 0.967239, 0.000223121, 0, 0.0501623, 0.959543, 0.000253809, 0, 0.0603638, 0.949466, 0.000265972, 0, 0.0715171, 0.939074, 0.000288372, 0, 0.0836187, 0.931118, 0.000310983, 0, 0.0966657, 0.922525, 0.000325561, 0, 0.110656, 0.912983, 0.000345725, 0, 0.125588, 0.901617, 0.0003556, 0, 0.141461, 0.889487, 0.000374012, 0, 0.158275, 0.875787, 0.000383445, 0, 0.176031, 0.860654, 0.000393972, 0, 0.19473, 0.844417, 0.000400311, 0, 0.214374, 0.82741, 0.000405004, 0, 0.234967, 0.810545, 0.000407378, 0, 0.256512, 0.793312, 0.000407351, 0, 0.279011, 0.774847, 0.000406563, 0, 0.302468, 0.755621, 0.000404903, 0, 0.326887, 0.735511, 0.000397486, 0, 0.352266, 0.715435, 0.00039357, 0, 0.378605, 0.695403, 0.000384739, 0, 0.405897, 0.674681, 0.000376108, 0, 0.43413, 0.65359, 0.000365997, 0, 0.463277, 0.632471, 0.000354957, 0, 0.493295, 0.61151, 0.000343593, 0, 0.524106, 0.59064, 0.000331841, 0, 0.555561, 0.569386, 0.000318891, 0, 0.587302, 0.548785, 0.0003072, 0, 0.619048, 0.528146, 0.00029361, 0, 0.650794, 0.507872, 0.000281709, 0, 0.68254, 0.487805, 0.000268627, 0, 0.714286, 0.468196, 0.000255887, 0, 0.746032, 0.448922, 0.000243997, 0, 0.777778, 0.430093, 0.000231662, 0, 0.809524, 0.411845, 0.000220339, 0, 0.84127, 0.393808, 0.000208694, 0, 0.873016, 0.376615, 0.000198045, 0, 0.904762, 0.359655, 0.000187375, 0, 0.936508, 0.343452, 0.000177371, 0, 0.968254, 0.32765, 0.000167525, 0, 1, 1, 1.69351e-05, 0, 0, 1, 1.69356e-05, 0, 0, 1, 1.69427e-05, 0, 0, 0.999999, 1.69736e-05, 0, 0, 0.999998, 1.70575e-05, 0, 0, 0.999995, 1.72372e-05, 0, 0, 0.99999, 1.75739e-05, 0, 0, 0.999979, 1.81568e-05, 0, 0, 0.999966, 1.91206e-05, 0, 0, 0.999944, 2.0677e-05, 0, 0, 0.999912, 2.31644e-05, 0, 0, 0.999869, 2.71268e-05, 0, 0, 0.999811, 3.34272e-05, 0, 0, 0.99973, 4.33979e-05, 0, 0, 0.999617, 5.90083e-05, 0, 6.80315e-05, 0.999445, 8.29497e-05, 0, 0.000612796, 0.999138, 0.000118019, 0, 0.00187408, 0.998095, 0.000156712, 0, 0.00395791, 0.993919, 0.000125054, 0, 0.00692144, 0.991333, 0.000126091, 0, 0.0107962, 0.989226, 0.000144912, 0, 0.0155986, 0.986954, 0.000175737, 0, 0.0213364, 0.983982, 0.000213883, 0, 0.0280114, 0.979128, 0.000234526, 0, 0.0356226, 0.973327, 0.000243725, 0, 0.0441668, 0.967416, 0.0002773, 0, 0.0536399, 0.959729, 0.000308799, 0, 0.0640376, 0.949758, 0.000322447, 0, 0.0753554, 0.939173, 0.000350021, 0, 0.0875893, 0.9296, 0.000370089, 0, 0.100736, 0.921181, 0.000391365, 0, 0.114793, 0.91164, 0.000413636, 0, 0.129759, 0.900435, 0.000427068, 0, 0.145632, 0.888183, 0.000441046, 0, 0.162412, 0.874772, 0.000454968, 0, 0.180101, 0.859566, 0.000461882, 0, 0.1987, 0.843579, 0.000471556, 0, 0.218213, 0.826453, 0.000474335, 0, 0.238641, 0.809164, 0.000477078, 0, 0.259989, 0.792179, 0.00047755, 0, 0.282262, 0.773866, 0.000472573, 0, 0.305464, 0.754944, 0.000469765, 0, 0.329599, 0.735133, 0.000462371, 0, 0.35467, 0.714858, 0.000453674, 0, 0.380678, 0.694829, 0.000443888, 0, 0.407622, 0.674453, 0.000432052, 0, 0.435493, 0.653685, 0.000420315, 0, 0.464275, 0.632666, 0.000406829, 0, 0.493938, 0.611676, 0.000392234, 0, 0.524422, 0.591193, 0.000379208, 0, 0.555624, 0.570145, 0.00036319, 0, 0.587302, 0.549566, 0.000349111, 0, 0.619048, 0.529278, 0.000334166, 0, 0.650794, 0.509026, 0.000318456, 0, 0.68254, 0.489186, 0.00030449, 0, 0.714286, 0.469662, 0.000289051, 0, 0.746032, 0.450691, 0.000275494, 0, 0.777778, 0.431841, 0.000261437, 0, 0.809524, 0.413752, 0.000247846, 0, 0.84127, 0.395951, 0.000235085, 0, 0.873016, 0.378633, 0.000222245, 0, 0.904762, 0.36194, 0.000210533, 0, 0.936508, 0.345599, 0.000198494, 0, 0.968254, 0.329999, 0.000188133, 0, 1, 1, 2.69663e-05, 0, 0, 1, 2.6967e-05, 0, 0, 1, 2.69772e-05, 0, 0, 0.999999, 2.70214e-05, 0, 0, 0.999998, 2.71415e-05, 0, 0, 0.999994, 2.7398e-05, 0, 0, 0.999988, 2.78771e-05, 0, 0, 0.999977, 2.87019e-05, 0, 0, 0.999961, 3.00544e-05, 0, 0, 0.999937, 3.22138e-05, 0, 0, 0.999904, 3.56163e-05, 0, 0, 0.999854, 4.09465e-05, 0, 0, 0.99979, 4.92651e-05, 0, 0, 0.999699, 6.21722e-05, 0, 8.8288e-07, 0.999572, 8.19715e-05, 0, 0.000223369, 0.999381, 0.000111689, 0, 0.00105414, 0.999016, 0.000153862, 0, 0.0026493, 0.997437, 0.000187667, 0, 0.00508608, 0.993545, 0.000155672, 0, 0.00840554, 0.991135, 0.000161455, 0, 0.012629, 0.989157, 0.000188241, 0, 0.0177661, 0.986874, 0.000226229, 0, 0.0238198, 0.983714, 0.000268668, 0, 0.0307887, 0.978301, 0.000277109, 0, 0.0386688, 0.973227, 0.000303446, 0, 0.0474554, 0.967317, 0.000341851, 0, 0.0571428, 0.959477, 0.000370885, 0, 0.0677256, 0.950012, 0.000392753, 0, 0.0791988, 0.939484, 0.00042781, 0, 0.0915576, 0.928135, 0.000443866, 0, 0.104798, 0.919819, 0.000472959, 0, 0.118918, 0.910049, 0.000491551, 0, 0.133915, 0.899181, 0.000512616, 0, 0.149788, 0.886881, 0.000523563, 0, 0.166537, 0.87359, 0.000540183, 0, 0.184164, 0.858613, 0.000547386, 0, 0.202669, 0.842809, 0.000554809, 0, 0.222056, 0.825727, 0.000558316, 0, 0.242329, 0.808086, 0.000557824, 0, 0.263492, 0.790728, 0.000556346, 0, 0.285551, 0.772987, 0.000552672, 0, 0.30851, 0.7541, 0.000543738, 0, 0.332376, 0.734669, 0.000536107, 0, 0.357153, 0.714411, 0.000523342, 0, 0.382845, 0.694196, 0.000512238, 0, 0.409454, 0.674252, 0.000497465, 0, 0.436977, 0.65357, 0.000481096, 0, 0.465404, 0.632999, 0.000467054, 0, 0.494713, 0.611994, 0.000448771, 0, 0.524864, 0.591604, 0.000431889, 0, 0.555779, 0.571134, 0.000415238, 0, 0.587302, 0.550528, 0.000396369, 0, 0.619048, 0.530292, 0.000379477, 0, 0.650794, 0.510364, 0.000361488, 0, 0.68254, 0.490749, 0.000343787, 0, 0.714286, 0.471266, 0.000327822, 0, 0.746032, 0.452462, 0.000310626, 0, 0.777778, 0.433907, 0.000295352, 0, 0.809524, 0.415659, 0.000279179, 0, 0.84127, 0.398138, 0.000264685, 0, 0.873016, 0.380833, 0.000249905, 0, 0.904762, 0.364247, 0.000236282, 0, 0.936508, 0.348041, 0.000222905, 0, 0.968254, 0.332389, 0.000210522, 0, 1, 1, 4.20604e-05, 0, 0, 1, 4.20614e-05, 0, 0, 1, 4.20757e-05, 0, 0, 0.999999, 4.2138e-05, 0, 0, 0.999997, 4.23067e-05, 0, 0, 0.999993, 4.26668e-05, 0, 0, 0.999986, 4.33372e-05, 0, 0, 0.999974, 4.44857e-05, 0, 0, 0.999956, 4.63554e-05, 0, 0, 0.99993, 4.93105e-05, 0, 0, 0.999892, 5.39077e-05, 0, 0, 0.999838, 6.10005e-05, 0, 0, 0.999767, 7.18822e-05, 0, 0, 0.999666, 8.84581e-05, 0, 3.65471e-05, 0.999525, 0.000113398, 0, 0.000485623, 0.999311, 0.000150043, 0, 0.00162096, 0.998865, 0.000200063, 0, 0.00355319, 0.996278, 0.000211014, 0, 0.00633818, 0.992956, 0.000189672, 0, 0.0100043, 0.991017, 0.000210262, 0, 0.0145648, 0.989055, 0.000244292, 0, 0.0200237, 0.986741, 0.000290481, 0, 0.0263798, 0.983288, 0.000334303, 0, 0.033629, 0.977784, 0.000340307, 0, 0.0417652, 0.973037, 0.000377864, 0, 0.0507821, 0.967181, 0.0004239, 0, 0.060673, 0.958971, 0.000443854, 0, 0.0714314, 0.950093, 0.000483039, 0, 0.0830518, 0.939552, 0.000517934, 0, 0.0955288, 0.927678, 0.000539449, 0, 0.108859, 0.918278, 0.000568604, 0, 0.123038, 0.908449, 0.000588505, 0, 0.138065, 0.897713, 0.000612473, 0, 0.153938, 0.885533, 0.000625575, 0, 0.170657, 0.872131, 0.00063854, 0, 0.188224, 0.857517, 0.000647034, 0, 0.20664, 0.841796, 0.00065209, 0, 0.225909, 0.824726, 0.0006544, 0, 0.246035, 0.807297, 0.000655744, 0, 0.267022, 0.789058, 0.000646716, 0, 0.288878, 0.77189, 0.000643898, 0, 0.311607, 0.753082, 0.000629973, 0, 0.335216, 0.7341, 0.000621564, 0, 0.359713, 0.714094, 0.000605171, 0, 0.385103, 0.693839, 0.000588752, 0, 0.41139, 0.673891, 0.000573294, 0, 0.438576, 0.653565, 0.000552682, 0, 0.466656, 0.633326, 0.000533446, 0, 0.495617, 0.612582, 0.000514635, 0, 0.525431, 0.59205, 0.00049303, 0, 0.556041, 0.571918, 0.000471842, 0, 0.587338, 0.551572, 0.000451713, 0, 0.619048, 0.531553, 0.000430049, 0, 0.650794, 0.51175, 0.000410445, 0, 0.68254, 0.49238, 0.000390098, 0, 0.714286, 0.473143, 0.000370033, 0, 0.746032, 0.45423, 0.000351205, 0, 0.777778, 0.435963, 0.000332049, 0, 0.809524, 0.41787, 0.000315021, 0, 0.84127, 0.400387, 0.000297315, 0, 0.873016, 0.383332, 0.000281385, 0, 0.904762, 0.366665, 0.000265397, 0, 0.936508, 0.350633, 0.000250601, 0, 0.968254, 0.334964, 0.00023589, 0, 1, 1, 6.43736e-05, 0, 0, 1, 6.4375e-05, 0, 0, 1, 6.43947e-05, 0, 0, 0.999999, 6.4481e-05, 0, 0, 0.999997, 6.47143e-05, 0, 0, 0.999994, 6.52119e-05, 0, 0, 0.999985, 6.61359e-05, 0, 0, 0.999972, 6.77116e-05, 0, 0, 0.999952, 7.02599e-05, 0, 0, 0.999922, 7.42517e-05, 0, 0, 0.99988, 8.03906e-05, 0, 0, 0.99982, 8.97315e-05, 0, 0, 0.999741, 0.000103838, 0, 0, 0.999629, 0.00012496, 0, 0.000149024, 0.999474, 0.000156161, 0, 0.000861027, 0.999229, 0.000201034, 0, 0.00231198, 0.998662, 0.000259069, 0, 0.00458147, 0.995299, 0.000245439, 0, 0.00770895, 0.992732, 0.00024498, 0, 0.0117126, 0.990847, 0.000273211, 0, 0.0165989, 0.988911, 0.000316492, 0, 0.0223674, 0.98654, 0.00037161, 0, 0.0290135, 0.982636, 0.000410352, 0, 0.0365309, 0.977346, 0.000421756, 0, 0.0449117, 0.972909, 0.000475578, 0, 0.0541481, 0.966821, 0.000522482, 0, 0.0642326, 0.958686, 0.000545008, 0, 0.075158, 0.949754, 0.000589286, 0, 0.0869181, 0.939184, 0.000619995, 0, 0.0995074, 0.927505, 0.000654266, 0, 0.112922, 0.916606, 0.000682362, 0, 0.127157, 0.906707, 0.000704286, 0, 0.142212, 0.895937, 0.000725909, 0, 0.158085, 0.883913, 0.000743939, 0, 0.174776, 0.870642, 0.000755157, 0, 0.192287, 0.856241, 0.000764387, 0, 0.210619, 0.84069, 0.000771032, 0, 0.229775, 0.823728, 0.000765906, 0, 0.249761, 0.806481, 0.000767604, 0, 0.270582, 0.787924, 0.000754385, 0, 0.292243, 0.770588, 0.000749668, 0, 0.314753, 0.751991, 0.000731613, 0, 0.338118, 0.733407, 0.000717655, 0, 0.362347, 0.713688, 0.000700604, 0, 0.387447, 0.693595, 0.000678765, 0, 0.413424, 0.673426, 0.000657042, 0, 0.440284, 0.65359, 0.000635892, 0, 0.468027, 0.633576, 0.000611569, 0, 0.496645, 0.613144, 0.000586011, 0, 0.526122, 0.592711, 0.000563111, 0, 0.556417, 0.572722, 0.000537699, 0, 0.587451, 0.552762, 0.000512556, 0, 0.619048, 0.532985, 0.000489757, 0, 0.650794, 0.513219, 0.000464139, 0, 0.68254, 0.493992, 0.000442193, 0, 0.714286, 0.47509, 0.000418629, 0, 0.746032, 0.456287, 0.000397045, 0, 0.777778, 0.438152, 0.000375504, 0, 0.809524, 0.420294, 0.00035492, 0, 0.84127, 0.402749, 0.000335327, 0, 0.873016, 0.385879, 0.000316422, 0, 0.904762, 0.369352, 0.000298333, 0, 0.936508, 0.353301, 0.000281417, 0, 0.968254, 0.337781, 0.000265203, 0, 1, 1, 9.68267e-05, 0, 0, 1, 9.68284e-05, 0, 0, 1, 9.68556e-05, 0, 0, 0.999999, 9.69733e-05, 0, 0, 0.999997, 9.72913e-05, 0, 0, 0.999993, 9.79688e-05, 0, 0, 0.999984, 9.92239e-05, 0, 0, 0.999969, 0.000101356, 0, 0, 0.999946, 0.000104784, 0, 0, 0.999913, 0.000110111, 0, 0, 0.999868, 0.000118217, 0, 0, 0.999801, 0.000130396, 0, 0, 0.999712, 0.000148523, 0, 1.24907e-05, 0.999589, 0.000175233, 0, 0.000355405, 0.999416, 0.000213999, 0, 0.0013528, 0.999136, 0.000268529, 0, 0.00312557, 0.998367, 0.000333088, 0, 0.00573045, 0.994701, 0.000304757, 0, 0.00919397, 0.992497, 0.000318031, 0, 0.0135261, 0.990608, 0.000353863, 0, 0.0187278, 0.988715, 0.000409044, 0, 0.0247947, 0.986241, 0.000472967, 0, 0.0317196, 0.981696, 0.000495104, 0, 0.039494, 0.977097, 0.000532873, 0, 0.0481087, 0.972583, 0.000594447, 0, 0.0575549, 0.966142, 0.000636867, 0, 0.0678242, 0.95823, 0.000669899, 0, 0.0789089, 0.949677, 0.000719499, 0, 0.0908023, 0.939226, 0.000750584, 0, 0.103499, 0.927501, 0.000793183, 0, 0.116993, 0.915199, 0.00081995, 0, 0.131282, 0.90498, 0.000847654, 0, 0.146364, 0.894243, 0.000868929, 0, 0.162237, 0.882154, 0.000884278, 0, 0.178902, 0.869161, 0.000898108, 0, 0.196358, 0.854751, 0.000901254, 0, 0.21461, 0.839368, 0.00090679, 0, 0.23366, 0.822874, 0.000901541, 0, 0.253512, 0.805514, 0.000897297, 0, 0.274174, 0.78716, 0.000881856, 0, 0.29565, 0.769061, 0.000870032, 0, 0.31795, 0.751, 0.000851719, 0, 0.341081, 0.732614, 0.000830671, 0, 0.365053, 0.713171, 0.000806569, 0, 0.389874, 0.693472, 0.00078338, 0, 0.415553, 0.673528, 0.000756404, 0, 0.442098, 0.653397, 0.000726872, 0, 0.469512, 0.633781, 0.000700494, 0, 0.497794, 0.613877, 0.00067105, 0, 0.526935, 0.593506, 0.000640361, 0, 0.556908, 0.573667, 0.000613502, 0, 0.587657, 0.553932, 0.000583177, 0, 0.61906, 0.534345, 0.000554375, 0, 0.650794, 0.515042, 0.000527811, 0, 0.68254, 0.495674, 0.000499367, 0, 0.714286, 0.477132, 0.00047429, 0, 0.746032, 0.458609, 0.000447726, 0, 0.777778, 0.440354, 0.000424205, 0, 0.809524, 0.422765, 0.000399549, 0, 0.84127, 0.405472, 0.000378315, 0, 0.873016, 0.388482, 0.000355327, 0, 0.904762, 0.372191, 0.000336122, 0, 0.936508, 0.356099, 0.000315247, 0, 0.968254, 0.340737, 0.00029794, 0, 1, 1, 0.000143327, 0, 0, 1, 0.00014333, 0, 0, 1, 0.000143366, 0, 0, 0.999999, 0.000143524, 0, 0, 0.999996, 0.000143952, 0, 0, 0.999991, 0.000144862, 0, 0, 0.999981, 0.000146544, 0, 0, 0.999966, 0.000149391, 0, 0, 0.999941, 0.000153946, 0, 0, 0.999905, 0.000160971, 0, 0, 0.999852, 0.000171562, 0, 0, 0.99978, 0.00018729, 0, 0, 0.999681, 0.000210386, 0, 8.26239e-05, 0.999546, 0.000243906, 0, 0.000664807, 0.999352, 0.000291739, 0, 0.00196192, 0.999027, 0.000357419, 0, 0.00405941, 0.997886, 0.000422349, 0, 0.00699664, 0.99419, 0.000385008, 0, 0.0107896, 0.99214, 0.000409775, 0, 0.0154415, 0.990274, 0.000456418, 0, 0.0209488, 0.988455, 0.000527008, 0, 0.0273037, 0.985804, 0.000597685, 0, 0.0344969, 0.98103, 0.000613124, 0, 0.0425183, 0.976674, 0.000668321, 0, 0.0513575, 0.972021, 0.000736985, 0, 0.0610046, 0.965274, 0.000773789, 0, 0.0714508, 0.958046, 0.000830852, 0, 0.0826877, 0.949333, 0.000875766, 0, 0.0947085, 0.939135, 0.000917088, 0, 0.107507, 0.927119, 0.000952244, 0, 0.121078, 0.91469, 0.000990626, 0, 0.135419, 0.903006, 0.00101304, 0, 0.150526, 0.892368, 0.00103834, 0, 0.166399, 0.880231, 0.00105002, 0, 0.183038, 0.867432, 0.00106331, 0, 0.200443, 0.853208, 0.00106783, 0, 0.218618, 0.837956, 0.00106458, 0, 0.237566, 0.821772, 0.00105945, 0, 0.257291, 0.804328, 0.00104685, 0, 0.2778, 0.786465, 0.00103178, 0, 0.2991, 0.768004, 0.00101077, 0, 0.321199, 0.74972, 0.000985504, 0, 0.344106, 0.731682, 0.000962893, 0, 0.36783, 0.712813, 0.000932146, 0, 0.392383, 0.693139, 0.00089871, 0, 0.417774, 0.673566, 0.000869678, 0, 0.444013, 0.653483, 0.000835525, 0, 0.471107, 0.633891, 0.000799853, 0, 0.49906, 0.614433, 0.000766838, 0, 0.527869, 0.594586, 0.000732227, 0, 0.557517, 0.574769, 0.000696442, 0, 0.587966, 0.555149, 0.000663935, 0, 0.61913, 0.535898, 0.000629826, 0, 0.650794, 0.516753, 0.000596486, 0, 0.68254, 0.497816, 0.000567078, 0, 0.714286, 0.479034, 0.000534399, 0, 0.746032, 0.460975, 0.000507013, 0, 0.777778, 0.442935, 0.000477421, 0, 0.809524, 0.425263, 0.000451101, 0, 0.84127, 0.408248, 0.000424964, 0, 0.873016, 0.391339, 0.00039993, 0, 0.904762, 0.37513, 0.000377619, 0, 0.936508, 0.359172, 0.000354418, 0, 0.968254, 0.343876, 0.000334823, 0, 1, 1, 0.000209042, 0, 0, 1, 0.000209045, 0, 0, 1, 0.000209093, 0, 0, 0.999999, 0.000209304, 0, 0, 0.999996, 0.000209871, 0, 0, 0.999991, 0.000211078, 0, 0, 0.999979, 0.000213304, 0, 0, 0.999963, 0.000217061, 0, 0, 0.999933, 0.000223042, 0, 0, 0.999894, 0.000232206, 0, 0, 0.999837, 0.000245901, 0, 0, 0.999756, 0.000266023, 0, 1.02927e-06, 0.999648, 0.000295204, 0, 0.000233468, 0.999499, 0.000336958, 0, 0.00108237, 0.999283, 0.000395563, 0, 0.00268832, 0.998896, 0.000473785, 0, 0.00511138, 0.997006, 0.000520008, 0, 0.00837705, 0.993819, 0.000497261, 0, 0.0124928, 0.991632, 0.000523722, 0, 0.0174561, 0.989875, 0.000587258, 0, 0.0232596, 0.988109, 0.000676329, 0, 0.0298932, 0.985155, 0.000747701, 0, 0.0373453, 0.980479, 0.000768803, 0, 0.0456045, 0.976271, 0.000841054, 0, 0.0546593, 0.971347, 0.000911469, 0, 0.0644994, 0.964528, 0.000953057, 0, 0.0751152, 0.957632, 0.00102221, 0, 0.0864981, 0.948681, 0.00106122, 0, 0.0986407, 0.938716, 0.00111857, 0, 0.111537, 0.926629, 0.00114762, 0, 0.125182, 0.914025, 0.00118995, 0, 0.139571, 0.901026, 0.00121228, 0, 0.154703, 0.890358, 0.00123946, 0, 0.170576, 0.878283, 0.0012527, 0, 0.18719, 0.865459, 0.00125536, 0, 0.204547, 0.851407, 0.00126134, 0, 0.222648, 0.836276, 0.00124759, 0, 0.241498, 0.820436, 0.00124443, 0, 0.261101, 0.803253, 0.00122071, 0, 0.281465, 0.785562, 0.00120107, 0, 0.302595, 0.76718, 0.00117762, 0, 0.324501, 0.748551, 0.00114289, 0, 0.347192, 0.730564, 0.00110872, 0, 0.370679, 0.712253, 0.00107636, 0, 0.394973, 0.692867, 0.00103646, 0, 0.420085, 0.673695, 0.000996793, 0, 0.446027, 0.653912, 0.00095675, 0, 0.47281, 0.634129, 0.000916739, 0, 0.500441, 0.615004, 0.000874401, 0, 0.528921, 0.595587, 0.000833411, 0, 0.558244, 0.575965, 0.000794556, 0, 0.588384, 0.5566, 0.00075196, 0, 0.619281, 0.537428, 0.000716381, 0, 0.650795, 0.518623, 0.000676558, 0, 0.68254, 0.499964, 0.00064074, 0, 0.714286, 0.481356, 0.000605984, 0, 0.746032, 0.463279, 0.000570256, 0, 0.777778, 0.445673, 0.000540138, 0, 0.809524, 0.428032, 0.000507299, 0, 0.84127, 0.411112, 0.000479553, 0, 0.873016, 0.394444, 0.000450737, 0, 0.904762, 0.378247, 0.000424269, 0, 0.936508, 0.362415, 0.000399111, 0, 0.968254, 0.347103, 0.000375274, 0, 1, 1, 0.000300729, 0, 0, 1, 0.000300733, 0, 0, 1, 0.000300797, 0, 0, 0.999998, 0.000301072, 0, 0, 0.999996, 0.000301817, 0, 0, 0.999989, 0.000303398, 0, 0, 0.999977, 0.000306309, 0, 0, 0.999958, 0.000311209, 0, 0, 0.999927, 0.000318975, 0, 0, 0.999884, 0.000330804, 0, 0, 0.99982, 0.00034834, 0, 0, 0.999733, 0.000373854, 0, 3.26995e-05, 0.999613, 0.000410424, 0, 0.000477174, 0.999447, 0.000462047, 0, 0.00161099, 0.999204, 0.000533322, 0, 0.00353153, 0.998725, 0.000624964, 0, 0.00627965, 0.995871, 0.000631786, 0, 0.0098693, 0.993194, 0.000632017, 0, 0.0143011, 0.991541, 0.00068923, 0, 0.019568, 0.989773, 0.000766892, 0, 0.0256593, 0.987647, 0.000863668, 0, 0.0325625, 0.984193, 0.000922089, 0, 0.0402647, 0.980016, 0.000970749, 0, 0.0487532, 0.975859, 0.00106027, 0, 0.058016, 0.970514, 0.00112239, 0, 0.0680419, 0.963625, 0.00117212, 0, 0.0788208, 0.956959, 0.00125211, 0, 0.0903439, 0.947956, 0.00129411, 0, 0.102604, 0.93809, 0.00135879, 0, 0.115594, 0.92659, 0.00139309, 0, 0.129309, 0.913829, 0.00143253, 0, 0.143745, 0.90005, 0.00145809, 0, 0.158901, 0.888129, 0.0014748, 0, 0.174774, 0.87607, 0.00148756, 0, 0.191365, 0.863461, 0.00148714, 0, 0.208674, 0.849594, 0.00148892, 0, 0.226705, 0.834531, 0.00146496, 0, 0.245461, 0.81903, 0.0014579, 0, 0.264947, 0.802122, 0.00143039, 0, 0.28517, 0.78445, 0.00139717, 0, 0.306137, 0.766434, 0.00136312, 0, 0.327857, 0.747816, 0.00132597, 0, 0.350341, 0.729519, 0.00128323, 0, 0.373598, 0.711454, 0.00123803, 0, 0.397642, 0.692699, 0.00119097, 0, 0.422485, 0.673723, 0.00114565, 0, 0.448139, 0.654386, 0.00109552, 0, 0.474619, 0.634673, 0.00104553, 0, 0.501933, 0.615554, 0.00099985, 0, 0.530089, 0.596462, 0.000948207, 0, 0.559087, 0.577385, 0.000902299, 0, 0.588913, 0.558257, 0.000856448, 0, 0.619525, 0.5392, 0.000810395, 0, 0.650826, 0.520543, 0.000768558, 0, 0.68254, 0.502206, 0.0007239, 0, 0.714286, 0.48402, 0.000685794, 0, 0.746032, 0.465779, 0.00064471, 0, 0.777778, 0.448455, 0.000609583, 0, 0.809524, 0.431091, 0.00057227, 0, 0.84127, 0.414147, 0.00054042, 0, 0.873016, 0.39765, 0.000506545, 0, 0.904762, 0.381576, 0.000477635, 0, 0.936508, 0.365881, 0.000448446, 0, 0.968254, 0.350582, 0.000421424, 0, 1, 1, 0.000427144, 0, 0, 1, 0.000427151, 0, 0, 1, 0.000427232, 0, 0, 0.999998, 0.00042759, 0, 0, 0.999995, 0.000428555, 0, 0, 0.999988, 0.000430603, 0, 0, 0.999976, 0.000434368, 0, 0, 0.999952, 0.000440688, 0, 0, 0.999919, 0.000450667, 0, 0, 0.999871, 0.00046578, 0, 0, 0.999801, 0.000488024, 0, 0, 0.999704, 0.000520092, 0, 0.000129791, 0.999572, 0.000565553, 0, 0.000821056, 0.999389, 0.000628906, 0, 0.00225241, 0.999114, 0.000714911, 0, 0.00449109, 0.998488, 0.000819218, 0, 0.00756249, 0.995234, 0.00080415, 0, 0.0114716, 0.993021, 0.000830181, 0, 0.0162131, 0.991407, 0.000902645, 0, 0.021776, 0.989625, 0.000996934, 0, 0.0281471, 0.987064, 0.00109707, 0, 0.0353118, 0.983265, 0.00114353, 0, 0.0432562, 0.979535, 0.0012272, 0, 0.0519665, 0.975224, 0.00132642, 0, 0.0614298, 0.969574, 0.00138092, 0, 0.0716348, 0.963021, 0.00145896, 0, 0.0825709, 0.956046, 0.00152834, 0, 0.094229, 0.947136, 0.00158217, 0, 0.106602, 0.937313, 0.0016347, 0, 0.119682, 0.926073, 0.00168383, 0, 0.133465, 0.913121, 0.00171627, 0, 0.147947, 0.899165, 0.00174229, 0, 0.163125, 0.885891, 0.00176137, 0, 0.178998, 0.873783, 0.00176406, 0, 0.195566, 0.861331, 0.00176156, 0, 0.21283, 0.847569, 0.00175346, 0, 0.230793, 0.832785, 0.00172753, 0, 0.249459, 0.817442, 0.00170204, 0, 0.268832, 0.800613, 0.00166576, 0, 0.28892, 0.783597, 0.00162909, 0, 0.30973, 0.76571, 0.0015826, 0, 0.331271, 0.747021, 0.00153106, 0, 0.353554, 0.728593, 0.00148036, 0, 0.37659, 0.710661, 0.00142808, 0, 0.400391, 0.692426, 0.00136906, 0, 0.424973, 0.673623, 0.00131066, 0, 0.450347, 0.65494, 0.00125569, 0, 0.476531, 0.635448, 0.00119517, 0, 0.503535, 0.616221, 0.00113828, 0, 0.531372, 0.597531, 0.0010816, 0, 0.560047, 0.578795, 0.00102673, 0, 0.589554, 0.559892, 0.000970985, 0, 0.619869, 0.541307, 0.000919773, 0, 0.650923, 0.522608, 0.000868479, 0, 0.68254, 0.504484, 0.00082137, 0, 0.714286, 0.486603, 0.000772916, 0, 0.746032, 0.468802, 0.000730353, 0, 0.777778, 0.451172, 0.000684955, 0, 0.809524, 0.434348, 0.000647565, 0, 0.84127, 0.417445, 0.000605863, 0, 0.873016, 0.401077, 0.000571885, 0, 0.904762, 0.385039, 0.000536034, 0, 0.936508, 0.369483, 0.000504227, 0, 0.968254, 0.354272, 0.000473165, 0, 1, 1, 0.000599525, 0, 0, 1, 0.000599533, 0, 0, 1, 0.000599639, 0, 0, 0.999998, 0.000600097, 0, 0, 0.999994, 0.000601336, 0, 0, 0.999987, 0.000603958, 0, 0, 0.999972, 0.000608775, 0, 0, 0.999949, 0.000616842, 0, 0, 0.999912, 0.000629534, 0, 0, 0.999857, 0.000648658, 0, 0, 0.999781, 0.000676615, 0, 5.38873e-06, 0.999674, 0.000716574, 0, 0.000308602, 0.999528, 0.000772641, 0, 0.00127003, 0.999326, 0.000849806, 0, 0.00300783, 0.999009, 0.000952682, 0, 0.00556637, 0.998112, 0.00106394, 0, 0.00895889, 0.994496, 0.00102228, 0, 0.0131827, 0.992806, 0.00108586, 0, 0.0182277, 0.991211, 0.0011759, 0, 0.0240795, 0.989415, 0.00128955, 0, 0.030723, 0.986499, 0.00139038, 0, 0.0381418, 0.982679, 0.00144539, 0, 0.046321, 0.978839, 0.00153954, 0, 0.0552459, 0.974295, 0.00164417, 0, 0.0649034, 0.968784, 0.00171517, 0, 0.0752814, 0.962324, 0.00180282, 0, 0.0863693, 0.954956, 0.00186387, 0, 0.0981578, 0.94624, 0.00193817, 0, 0.110639, 0.936517, 0.00198156, 0, 0.123806, 0.925186, 0.00203042, 0, 0.137655, 0.91252, 0.0020664, 0, 0.15218, 0.898441, 0.00207822, 0, 0.16738, 0.884394, 0.0020992, 0, 0.183253, 0.871273, 0.00208748, 0, 0.199799, 0.859057, 0.00208686, 0, 0.21702, 0.845243, 0.00205519, 0, 0.234918, 0.830723, 0.00202868, 0, 0.253496, 0.815801, 0.00199501, 0, 0.272761, 0.79914, 0.00194193, 0, 0.292719, 0.782372, 0.00188824, 0, 0.313377, 0.76482, 0.00183695, 0, 0.334745, 0.746586, 0.00177418, 0, 0.356833, 0.7281, 0.00170628, 0, 0.379654, 0.709842, 0.00164063, 0, 0.403221, 0.692019, 0.00157355, 0, 0.427548, 0.67364, 0.00150262, 0, 0.452651, 0.655277, 0.00143473, 0, 0.478545, 0.636438, 0.00136371, 0, 0.505246, 0.617364, 0.00129911, 0, 0.532768, 0.598603, 0.00123014, 0, 0.561122, 0.580195, 0.00116587, 0, 0.590309, 0.561786, 0.00110398, 0, 0.620318, 0.543377, 0.00104148, 0, 0.651102, 0.525093, 0.000983984, 0, 0.682545, 0.506791, 0.00092667, 0, 0.714286, 0.489291, 0.000874326, 0, 0.746032, 0.471811, 0.000821734, 0, 0.777778, 0.454435, 0.000774698, 0, 0.809524, 0.437493, 0.000727302, 0, 0.84127, 0.420977, 0.000684039, 0, 0.873016, 0.404729, 0.00064373, 0, 0.904762, 0.388756, 0.00060285, 0, 0.936508, 0.373344, 0.00056765, 0, 0.968254, 0.358191, 0.000531929, 0, 1, 1, 0.000832169, 0, 0, 1, 0.000832178, 0, 0, 1, 0.00083231, 0, 0, 0.999998, 0.000832893, 0, 0, 0.999995, 0.000834465, 0, 0, 0.999985, 0.000837791, 0, 0, 0.999969, 0.000843893, 0, 0, 0.999944, 0.000854086, 0, 0, 0.999903, 0.000870071, 0, 0, 0.999843, 0.000894042, 0, 0, 0.999759, 0.000928865, 0, 5.31805e-05, 0.999643, 0.000978242, 0, 0.000579365, 0.99948, 0.00104684, 0, 0.00182774, 0.999255, 0.00114012, 0, 0.00387804, 0.998885, 0.00126188, 0, 0.00675709, 0.997405, 0.00135888, 0, 0.010468, 0.99424, 0.00133626, 0, 0.0150018, 0.992458, 0.00140905, 0, 0.0203443, 0.990929, 0.00152305, 0, 0.0264786, 0.989116, 0.00165882, 0, 0.0333875, 0.985624, 0.00174128, 0, 0.0410536, 0.982003, 0.00182108, 0, 0.0494609, 0.978336, 0.00194498, 0, 0.0585941, 0.973184, 0.00202708, 0, 0.0684396, 0.9678, 0.00212166, 0, 0.0789851, 0.961348, 0.00221366, 0, 0.0902199, 0.953841, 0.00228219, 0, 0.102134, 0.94534, 0.00235662, 0, 0.114721, 0.935552, 0.00240572, 0, 0.127972, 0.924064, 0.00244405, 0, 0.141884, 0.911827, 0.00247557, 0, 0.156451, 0.897731, 0.00248374, 0, 0.171672, 0.883409, 0.00249863, 0, 0.187545, 0.868625, 0.00246688, 0, 0.20407, 0.856529, 0.00246523, 0, 0.221249, 0.842999, 0.00242368, 0, 0.239083, 0.828505, 0.00237354, 0, 0.257578, 0.813825, 0.00232588, 0, 0.276738, 0.797813, 0.00226731, 0, 0.296569, 0.781097, 0.00219704, 0, 0.31708, 0.764038, 0.00212394, 0, 0.338281, 0.746067, 0.00204786, 0, 0.360181, 0.727687, 0.00196728, 0, 0.382794, 0.709571, 0.00188779, 0, 0.406133, 0.691503, 0.00180532, 0, 0.430213, 0.673673, 0.00171849, 0, 0.45505, 0.655732, 0.00164147, 0, 0.480662, 0.637399, 0.00155858, 0, 0.507065, 0.618616, 0.00147641, 0, 0.534278, 0.60005, 0.00140125, 0, 0.562313, 0.581713, 0.00132441, 0, 0.59118, 0.563546, 0.00125014, 0, 0.620875, 0.545605, 0.00118249, 0, 0.651373, 0.527559, 0.0011116, 0, 0.682593, 0.509764, 0.00104979, 0, 0.714286, 0.49193, 0.000985977, 0, 0.746032, 0.475011, 0.000928592, 0, 0.777778, 0.457878, 0.000873466, 0, 0.809524, 0.440979, 0.000819585, 0, 0.84127, 0.424613, 0.000772365, 0, 0.873016, 0.408549, 0.000722195, 0, 0.904762, 0.392771, 0.000680014, 0, 0.936508, 0.377317, 0.000636797, 0, 0.968254, 0.362352, 0.000598318, 0, 1, 1, 0.00114313, 0, 0, 1, 0.00114314, 0, 0, 0.999999, 0.00114331, 0, 0, 0.999998, 0.00114404, 0, 0, 0.999994, 0.00114601, 0, 0, 0.999984, 0.00115019, 0, 0, 0.999967, 0.00115784, 0, 0, 0.999937, 0.0011706, 0, 0, 0.999894, 0.00119054, 0, 0, 0.999828, 0.00122031, 0, 0, 0.999735, 0.00126331, 0, 0.000169263, 0.999606, 0.00132382, 0, 0.000949167, 0.999426, 0.0014071, 0, 0.00249668, 0.999173, 0.00151895, 0, 0.00486392, 0.99873, 0.00166102, 0, 0.00806323, 0.996243, 0.0017023, 0, 0.0120895, 0.993779, 0.00172782, 0, 0.0169288, 0.9919, 0.0018108, 0, 0.0225633, 0.990524, 0.00196028, 0, 0.028974, 0.98868, 0.00212014, 0, 0.036142, 0.984663, 0.00217598, 0, 0.044049, 0.981457, 0.00230563, 0, 0.0526781, 0.977608, 0.00243966, 0, 0.0620137, 0.972215, 0.00251336, 0, 0.0720418, 0.966798, 0.0026285, 0, 0.0827499, 0.960241, 0.00271409, 0, 0.0941271, 0.952489, 0.00278381, 0, 0.106164, 0.944127, 0.00285399, 0, 0.118852, 0.934282, 0.00290994, 0, 0.132185, 0.923271, 0.00294558, 0, 0.146157, 0.910803, 0.00296269, 0, 0.160766, 0.896705, 0.00296803, 0, 0.176007, 0.88238, 0.00296637, 0, 0.19188, 0.867116, 0.00293163, 0, 0.208385, 0.853636, 0.00289418, 0, 0.225523, 0.840469, 0.00284663, 0, 0.243296, 0.82639, 0.00278594, 0, 0.261709, 0.811759, 0.00271618, 0, 0.280767, 0.796113, 0.00263187, 0, 0.300476, 0.779518, 0.00254589, 0, 0.320845, 0.763142, 0.00246003, 0, 0.341883, 0.745464, 0.00236529, 0, 0.363601, 0.727491, 0.00226536, 0, 0.386011, 0.709414, 0.00216375, 0, 0.409128, 0.691396, 0.00207127, 0, 0.432967, 0.67368, 0.00197106, 0, 0.457545, 0.656049, 0.00187022, 0, 0.482881, 0.638188, 0.00177605, 0, 0.508992, 0.620177, 0.00168482, 0, 0.535899, 0.601506, 0.00158909, 0, 0.563619, 0.58362, 0.00150583, 0, 0.592165, 0.565496, 0.00141791, 0, 0.621544, 0.54789, 0.00133693, 0, 0.651743, 0.530323, 0.00126038, 0, 0.682709, 0.512795, 0.00118556, 0, 0.714286, 0.495199, 0.00111527, 0, 0.746032, 0.478101, 0.0010489, 0, 0.777778, 0.461511, 0.000984264, 0, 0.809524, 0.444879, 0.00092591, 0, 0.84127, 0.428424, 0.000866582, 0, 0.873016, 0.412495, 0.000814463, 0, 0.904762, 0.396975, 0.000764498, 0, 0.936508, 0.381614, 0.000715967, 0, 0.968254, 0.366732, 0.000672483, 0, 1, 1, 0.00155501, 0, 0, 1, 0.00155503, 0, 0, 1, 0.00155524, 0, 0, 0.999998, 0.00155615, 0, 0, 0.999994, 0.0015586, 0, 0, 0.999983, 0.00156379, 0, 0, 0.999963, 0.0015733, 0, 0, 0.999932, 0.00158911, 0, 0, 0.999882, 0.00161376, 0, 0, 0.99981, 0.00165041, 0, 1.00875e-05, 0.999708, 0.00170304, 0, 0.000367658, 0.999565, 0.00177658, 0, 0.0014234, 0.999368, 0.00187688, 0, 0.00327939, 0.999081, 0.00200989, 0, 0.00596629, 0.99852, 0.00217177, 0, 0.0094852, 0.99549, 0.0021745, 0, 0.013824, 0.993252, 0.00222357, 0, 0.0189642, 0.991727, 0.00235022, 0, 0.0248856, 0.989951, 0.00250561, 0, 0.0315669, 0.988029, 0.00268829, 0, 0.0389882, 0.984029, 0.0027496, 0, 0.0471302, 0.980683, 0.00289793, 0, 0.0559754, 0.976554, 0.00303315, 0, 0.0655081, 0.97139, 0.00313257, 0, 0.0757138, 0.965544, 0.00323656, 0, 0.08658, 0.95912, 0.00333432, 0, 0.0980954, 0.951183, 0.0034039, 0, 0.110251, 0.942974, 0.00347515, 0, 0.123038, 0.932642, 0.00350381, 0, 0.13645, 0.922158, 0.00354519, 0, 0.150482, 0.909404, 0.00353851, 0, 0.165129, 0.896071, 0.0035435, 0, 0.18039, 0.881206, 0.00349936, 0, 0.196263, 0.866077, 0.00347256, 0, 0.212748, 0.85093, 0.003415, 0, 0.229847, 0.837703, 0.00333367, 0, 0.247561, 0.823878, 0.003249, 0, 0.265895, 0.809449, 0.00316347, 0, 0.284854, 0.794379, 0.00306351, 0, 0.304445, 0.778138, 0.0029499, 0, 0.324675, 0.761997, 0.00284099, 0, 0.345555, 0.744938, 0.00272104, 0, 0.367095, 0.727212, 0.00260715, 0, 0.389309, 0.709549, 0.00248855, 0, 0.41221, 0.691704, 0.00236783, 0, 0.435814, 0.673689, 0.00225178, 0, 0.460138, 0.656453, 0.00213765, 0, 0.485203, 0.639128, 0.00202178, 0, 0.511028, 0.621512, 0.00191443, 0, 0.537634, 0.603598, 0.00180977, 0, 0.565041, 0.58559, 0.00170456, 0, 0.593268, 0.567852, 0.00160927, 0, 0.622327, 0.5503, 0.00151395, 0, 0.652217, 0.533033, 0.00142499, 0, 0.682907, 0.515942, 0.00133955, 0, 0.714296, 0.498814, 0.0012602, 0, 0.746032, 0.481595, 0.00118188, 0, 0.777778, 0.465117, 0.00111171, 0, 0.809524, 0.448865, 0.00104091, 0, 0.84127, 0.432711, 0.000976618, 0, 0.873016, 0.416822, 0.00091859, 0, 0.904762, 0.401272, 0.000857704, 0, 0.936508, 0.386226, 0.000807172, 0, 0.968254, 0.371321, 0.00075464, 0, 1, 1, 0.00209596, 0, 0, 1, 0.00209598, 0, 0, 1, 0.00209624, 0, 0, 0.999997, 0.00209736, 0, 0, 0.999991, 0.00210039, 0, 0, 0.999979, 0.00210678, 0, 0, 0.999959, 0.00211847, 0, 0, 0.999925, 0.0021379, 0, 0, 0.99987, 0.00216809, 0, 0, 0.999791, 0.00221281, 0, 6.81487e-05, 0.999677, 0.00227669, 0, 0.000658161, 0.999521, 0.00236533, 0, 0.00200635, 0.999301, 0.00248514, 0, 0.0041779, 0.998977, 0.00264185, 0, 0.00718648, 0.998191, 0.00281695, 0, 0.0110239, 0.994801, 0.00278518, 0, 0.015672, 0.993091, 0.00288774, 0, 0.0211091, 0.991571, 0.00303931, 0, 0.0273123, 0.9897, 0.00321643, 0, 0.034259, 0.987023, 0.00337332, 0, 0.0419282, 0.983289, 0.00346146, 0, 0.0502998, 0.979892, 0.00363704, 0, 0.0593562, 0.975111, 0.00373601, 0, 0.069081, 0.970351, 0.0038842, 0, 0.0794598, 0.964131, 0.00397053, 0, 0.0904798, 0.957747, 0.00408078, 0, 0.10213, 0.949536, 0.00413533, 0, 0.1144, 0.941372, 0.00420305, 0, 0.127284, 0.931049, 0.00422815, 0, 0.140772, 0.920647, 0.00425048, 0, 0.154862, 0.908033, 0.0042281, 0, 0.169548, 0.895028, 0.00422026, 0, 0.184828, 0.879968, 0.00415042, 0, 0.200701, 0.864875, 0.00408821, 0, 0.217167, 0.84918, 0.00400909, 0, 0.234227, 0.834934, 0.00391178, 0, 0.251884, 0.821397, 0.00380066, 0, 0.270141, 0.807135, 0.00367974, 0, 0.289004, 0.792363, 0.00355172, 0, 0.308479, 0.776661, 0.003411, 0, 0.328575, 0.760705, 0.00328123, 0, 0.349301, 0.744408, 0.00314003, 0, 0.370668, 0.726994, 0.0029906, 0, 0.392689, 0.709598, 0.00285034, 0, 0.415379, 0.692112, 0.00271179, 0, 0.438754, 0.674435, 0.00257185, 0, 0.46283, 0.65676, 0.00243425, 0, 0.48763, 0.639982, 0.00230351, 0, 0.513173, 0.622983, 0.0021777, 0, 0.539482, 0.605471, 0.00204991, 0, 0.566579, 0.58796, 0.00193759, 0, 0.594488, 0.570463, 0.00181976, 0, 0.623226, 0.553058, 0.00171497, 0, 0.6528, 0.535894, 0.00161109, 0, 0.683198, 0.519089, 0.00151394, 0, 0.714354, 0.502454, 0.00142122, 0, 0.746032, 0.485681, 0.00133488, 0, 0.777778, 0.468935, 0.00124975, 0, 0.809524, 0.452951, 0.00117309, 0, 0.84127, 0.437139, 0.00110155, 0, 0.873016, 0.421446, 0.00103124, 0, 0.904762, 0.405951, 0.000966387, 0, 0.936508, 0.391003, 0.000908119, 0, 0.968254, 0.376198, 0.000848057, 0, 1, 1, 0.00280076, 0, 0, 1, 0.00280078, 0, 0, 0.999999, 0.00280109, 0, 0, 0.999997, 0.00280246, 0, 0, 0.999992, 0.00280616, 0, 0, 0.999979, 0.00281396, 0, 0, 0.999956, 0.00282822, 0, 0, 0.999916, 0.00285186, 0, 0, 0.999857, 0.0028885, 0, 0, 0.999768, 0.00294259, 0, 0.000196026, 0.999645, 0.00301946, 0, 0.00104842, 0.99947, 0.00312541, 0, 0.00270199, 0.999229, 0.00326733, 0, 0.00519449, 0.998852, 0.00344992, 0, 0.00852602, 0.997558, 0.00361052, 0, 0.0126804, 0.994417, 0.0035898, 0, 0.017635, 0.992824, 0.00372393, 0, 0.023365, 0.991344, 0.00390695, 0, 0.0298456, 0.989337, 0.00410392, 0, 0.0370529, 0.985811, 0.00420987, 0, 0.0449651, 0.982772, 0.00437488, 0, 0.0535615, 0.979001, 0.00455069, 0, 0.0628243, 0.974102, 0.00464462, 0, 0.0727368, 0.969197, 0.00480577, 0, 0.0832844, 0.962759, 0.00487818, 0, 0.0944545, 0.956207, 0.00498176, 0, 0.106236, 0.947909, 0.00503392, 0, 0.118619, 0.939596, 0.00507474, 0, 0.131595, 0.929642, 0.00509798, 0, 0.145159, 0.918807, 0.00508476, 0, 0.159305, 0.906921, 0.00505634, 0, 0.174028, 0.893312, 0.00498845, 0, 0.189327, 0.878933, 0.0049133, 0, 0.2052, 0.863986, 0.0048259, 0, 0.221647, 0.847936, 0.00470848, 0, 0.23867, 0.832253, 0.00456889, 0, 0.25627, 0.818619, 0.00442726, 0, 0.274453, 0.804788, 0.00427677, 0, 0.293222, 0.790241, 0.00411906, 0, 0.312585, 0.775162, 0.00394833, 0, 0.33255, 0.759463, 0.00377366, 0, 0.353126, 0.743598, 0.00361026, 0, 0.374324, 0.72697, 0.00343627, 0, 0.396158, 0.709646, 0.00326422, 0, 0.418641, 0.69277, 0.00309717, 0, 0.44179, 0.675371, 0.0029356, 0, 0.465624, 0.657863, 0.00277712, 0, 0.490163, 0.640772, 0.00261738, 0, 0.515429, 0.624441, 0.0024737, 0, 0.541445, 0.607497, 0.00233125, 0, 0.568236, 0.590438, 0.00218994, 0, 0.595828, 0.573224, 0.0020664, 0, 0.624242, 0.556168, 0.00193526, 0, 0.653496, 0.539232, 0.00182463, 0, 0.683588, 0.522352, 0.00170735, 0, 0.714482, 0.506172, 0.00160555, 0, 0.746032, 0.489842, 0.00150451, 0, 0.777778, 0.473463, 0.00140938, 0, 0.809524, 0.457266, 0.00132568, 0, 0.84127, 0.441609, 0.0012376, 0, 0.873016, 0.426348, 0.00116265, 0, 0.904762, 0.411002, 0.00108935, 0, 0.936508, 0.396045, 0.00101946, 0, 0.968254, 0.381448, 0.000955665, 0, 1, 1, 0.0037121, 0, 0, 1, 0.00371213, 0, 0, 1, 0.00371251, 0, 0, 0.999997, 0.00371417, 0, 0, 0.99999, 0.00371863, 0, 0, 0.999977, 0.00372807, 0, 0, 0.99995, 0.00374529, 0, 0, 0.999908, 0.0037738, 0, 0, 0.999843, 0.00381789, 0, 1.23596e-05, 0.999745, 0.00388273, 0, 0.000407442, 0.999608, 0.00397443, 0, 0.0015447, 0.999415, 0.00409998, 0, 0.00351385, 0.999143, 0.00426662, 0, 0.0063316, 0.9987, 0.00447625, 0, 0.00998679, 0.996363, 0.00455323, 0, 0.0144569, 0.994021, 0.00461052, 0, 0.0197151, 0.992372, 0.00476359, 0, 0.0257344, 0.991007, 0.00499101, 0, 0.0324882, 0.988767, 0.0051972, 0, 0.0399517, 0.984872, 0.00528407, 0, 0.0481022, 0.982004, 0.00548926, 0, 0.0569191, 0.977714, 0.00564385, 0, 0.0663839, 0.973076, 0.0057693, 0, 0.0764801, 0.967565, 0.0058924, 0, 0.0871928, 0.961384, 0.00599629, 0, 0.0985095, 0.954435, 0.00605998, 0, 0.110419, 0.946303, 0.0061133, 0, 0.122912, 0.937662, 0.00612028, 0, 0.13598, 0.927867, 0.00612209, 0, 0.149617, 0.916475, 0.00604813, 0, 0.163817, 0.90541, 0.00603088, 0, 0.178577, 0.891591, 0.00592218, 0, 0.193894, 0.877573, 0.00578854, 0, 0.209767, 0.862511, 0.00566648, 0, 0.226196, 0.846861, 0.00551481, 0, 0.243182, 0.83068, 0.00533754, 0, 0.260728, 0.815725, 0.00515487, 0, 0.278837, 0.802321, 0.0049655, 0, 0.297515, 0.787826, 0.00475421, 0, 0.316768, 0.773454, 0.00456002, 0, 0.336605, 0.758224, 0.00434727, 0, 0.357034, 0.74265, 0.00414444, 0, 0.378067, 0.726729, 0.00393738, 0, 0.399717, 0.710155, 0.00373575, 0, 0.421998, 0.693312, 0.00353736, 0, 0.444928, 0.67653, 0.00334368, 0, 0.468523, 0.659444, 0.00315981, 0, 0.492806, 0.642051, 0.00297809, 0, 0.517798, 0.625758, 0.00280592, 0, 0.543525, 0.609615, 0.00264254, 0, 0.570012, 0.592919, 0.00248459, 0, 0.597288, 0.576298, 0.00233327, 0, 0.625379, 0.559489, 0.00219519, 0, 0.654307, 0.542891, 0.00205441, 0, 0.684084, 0.526255, 0.00193385, 0, 0.714693, 0.509853, 0.00180745, 0, 0.746044, 0.494131, 0.00169817, 0, 0.777778, 0.478114, 0.0015913, 0, 0.809524, 0.462274, 0.00148981, 0, 0.84127, 0.446412, 0.00139537, 0, 0.873016, 0.431274, 0.00130984, 0, 0.904762, 0.41635, 0.00122403, 0, 0.936508, 0.401476, 0.00114809, 0, 0.968254, 0.386993, 0.00107563, 0, 1, 1, 0.00488216, 0, 0, 1, 0.0048822, 0, 0, 1, 0.00488265, 0, 0, 0.999997, 0.00488463, 0, 0, 0.999988, 0.00488999, 0, 0, 0.999974, 0.00490129, 0, 0, 0.999946, 0.00492191, 0, 0, 0.999897, 0.00495598, 0, 0, 0.999825, 0.00500855, 0, 7.44791e-05, 0.999718, 0.00508559, 0, 0.000712744, 0.999565, 0.005194, 0, 0.00215249, 0.999352, 0.00534147, 0, 0.00444576, 0.999046, 0.00553523, 0, 0.00759218, 0.998492, 0.00577016, 0, 0.0115714, 0.995564, 0.00578487, 0, 0.0163557, 0.993339, 0.00586414, 0, 0.021915, 0.991834, 0.00606002, 0, 0.0282201, 0.990496, 0.00633312, 0, 0.0352433, 0.987826, 0.00651941, 0, 0.042959, 0.98383, 0.00660842, 0, 0.0513439, 0.98109, 0.00685523, 0, 0.0603772, 0.976131, 0.00695778, 0, 0.0700402, 0.971922, 0.00714236, 0, 0.0803163, 0.965901, 0.00721437, 0, 0.0911908, 0.959606, 0.00732017, 0, 0.102651, 0.952504, 0.00735788, 0, 0.114686, 0.944365, 0.00738493, 0, 0.127286, 0.935652, 0.00737969, 0, 0.140443, 0.925813, 0.00733612, 0, 0.154151, 0.914397, 0.00723094, 0, 0.168405, 0.903257, 0.00714002, 0, 0.183201, 0.890015, 0.00700149, 0, 0.198536, 0.876014, 0.00682813, 0, 0.214409, 0.861436, 0.00665567, 0, 0.23082, 0.845752, 0.00644526, 0, 0.24777, 0.829169, 0.00621635, 0, 0.265263, 0.813435, 0.00597789, 0, 0.283301, 0.799701, 0.00575694, 0, 0.301889, 0.785726, 0.00549866, 0, 0.321035, 0.77152, 0.0052503, 0, 0.340746, 0.75683, 0.00499619, 0, 0.361032, 0.741951, 0.0047543, 0, 0.381904, 0.726367, 0.0045084, 0, 0.403374, 0.710537, 0.00426784, 0, 0.425457, 0.693965, 0.00403487, 0, 0.448169, 0.677724, 0.0038075, 0, 0.47153, 0.66117, 0.00359431, 0, 0.495561, 0.644274, 0.00338354, 0, 0.520284, 0.627449, 0.00318163, 0, 0.545725, 0.611645, 0.00299672, 0, 0.571911, 0.595614, 0.00281016, 0, 0.598873, 0.579426, 0.00264252, 0, 0.62664, 0.563016, 0.00247509, 0, 0.655239, 0.546728, 0.00232647, 0, 0.684692, 0.530539, 0.00217803, 0, 0.714999, 0.514164, 0.00204216, 0, 0.746106, 0.498344, 0.00191403, 0, 0.777778, 0.482957, 0.00179203, 0, 0.809524, 0.467336, 0.00167695, 0, 0.84127, 0.451994, 0.00157567, 0, 0.873016, 0.436514, 0.00147113, 0, 0.904762, 0.42178, 0.00138034, 0, 0.936508, 0.407271, 0.00129219, 0, 0.968254, 0.392822, 0.0012098, 0, 1, 1, 0.00637427, 0, 0, 1, 0.00637431, 0, 0, 0.999999, 0.00637485, 0, 0, 0.999996, 0.00637721, 0, 0, 0.999987, 0.00638357, 0, 0, 0.999971, 0.006397, 0, 0, 0.999939, 0.00642142, 0, 0, 0.999888, 0.00646177, 0, 0, 0.999807, 0.00652387, 0, 0.000207916, 0.999689, 0.00661454, 0, 0.00112051, 0.99952, 0.00674155, 0, 0.00287719, 0.999283, 0.00691313, 0, 0.00550145, 0.998936, 0.00713598, 0, 0.00897928, 0.998165, 0.00738501, 0, 0.0132829, 0.994847, 0.00734388, 0, 0.01838, 0.993182, 0.00749991, 0, 0.0242381, 0.991665, 0.0077246, 0, 0.030826, 0.989708, 0.00797579, 0, 0.0381152, 0.986663, 0.00813011, 0, 0.0460794, 0.983288, 0.00830365, 0, 0.0546951, 0.980104, 0.00853496, 0, 0.0639411, 0.974855, 0.00861045, 0, 0.0737988, 0.97045, 0.00879133, 0, 0.0842516, 0.964509, 0.00886377, 0, 0.0952848, 0.957594, 0.00890346, 0, 0.106886, 0.950546, 0.00893289, 0, 0.119044, 0.942225, 0.00890074, 0, 0.131749, 0.933365, 0.00886826, 0, 0.144994, 0.923202, 0.0087316, 0, 0.158772, 0.912605, 0.00863082, 0, 0.173078, 0.901099, 0.00847403, 0, 0.187908, 0.888177, 0.00825838, 0, 0.203261, 0.873955, 0.00801834, 0, 0.219134, 0.860091, 0.00779026, 0, 0.235527, 0.84434, 0.00752478, 0, 0.252443, 0.828517, 0.00724074, 0, 0.269883, 0.81239, 0.00693769, 0, 0.287851, 0.79721, 0.00664817, 0, 0.306352, 0.783489, 0.00634763, 0, 0.325393, 0.769514, 0.00604221, 0, 0.344981, 0.755419, 0.00573568, 0, 0.365126, 0.741083, 0.00544359, 0, 0.385839, 0.726059, 0.00515515, 0, 0.407132, 0.710809, 0.00487139, 0, 0.42902, 0.695052, 0.00459846, 0, 0.45152, 0.678886, 0.00433412, 0, 0.474651, 0.663042, 0.00407981, 0, 0.498433, 0.646634, 0.00384264, 0, 0.52289, 0.630117, 0.00360897, 0, 0.548048, 0.613804, 0.00338863, 0, 0.573936, 0.598338, 0.00318486, 0, 0.600584, 0.582687, 0.00298377, 0, 0.628027, 0.566809, 0.00280082, 0, 0.656295, 0.550817, 0.00262255, 0, 0.685417, 0.534937, 0.00245835, 0, 0.715406, 0.519151, 0.00230574, 0, 0.74624, 0.503118, 0.0021549, 0, 0.777778, 0.487723, 0.00202008, 0, 0.809524, 0.472725, 0.00189355, 0, 0.84127, 0.457599, 0.00177108, 0, 0.873016, 0.442558, 0.00165843, 0, 0.904762, 0.427624, 0.00155494, 0, 0.936508, 0.413171, 0.00145273, 0, 0.968254, 0.399122, 0.00136454, 0, 1, 1, 0.00826496, 0, 0, 1, 0.00826499, 0, 0, 1, 0.00826564, 0, 0, 0.999996, 0.00826842, 0, 0, 0.999987, 0.00827589, 0, 0, 0.999967, 0.00829167, 0, 0, 0.999933, 0.00832037, 0, 0, 0.999876, 0.00836768, 0, 1.09338e-05, 0.999786, 0.00844031, 0, 0.000427145, 0.999655, 0.00854603, 0, 0.0016384, 0.999468, 0.00869337, 0, 0.00372392, 0.999203, 0.008891, 0, 0.00668513, 0.998803, 0.00914387, 0, 0.0104968, 0.99748, 0.00935838, 0, 0.015125, 0.994446, 0.00933309, 0, 0.0205338, 0.99292, 0.00953084, 0, 0.0266884, 0.991414, 0.0097893, 0, 0.0335565, 0.989049, 0.0100228, 0, 0.0411086, 0.98582, 0.0101664, 0, 0.0493181, 0.982441, 0.0103582, 0, 0.0581613, 0.978595, 0.0105292, 0, 0.0676169, 0.973495, 0.0106274, 0, 0.0776661, 0.968405, 0.0107261, 0, 0.0882926, 0.962717, 0.0108234, 0, 0.0994817, 0.955478, 0.0108102, 0, 0.111221, 0.948275, 0.0107914, 0, 0.123499, 0.940006, 0.0107161, 0, 0.136308, 0.930831, 0.0106309, 0, 0.149639, 0.920648, 0.0104083, 0, 0.163485, 0.910205, 0.0102312, 0, 0.177843, 0.898445, 0.0100051, 0, 0.192707, 0.885986, 0.00971928, 0, 0.208077, 0.872204, 0.00940747, 0, 0.22395, 0.858436, 0.0091085, 0, 0.240326, 0.843454, 0.00876595, 0, 0.257208, 0.827437, 0.00839794, 0, 0.274596, 0.811488, 0.00803692, 0, 0.292496, 0.796039, 0.00767352, 0, 0.310911, 0.781083, 0.0073097, 0, 0.329849, 0.767642, 0.00694032, 0, 0.349316, 0.753901, 0.00657476, 0, 0.369323, 0.740131, 0.00622699, 0, 0.38988, 0.725845, 0.0058838, 0, 0.410999, 0.710991, 0.00555586, 0, 0.432696, 0.696002, 0.00523089, 0, 0.454987, 0.680461, 0.00492494, 0, 0.47789, 0.664875, 0.00463464, 0, 0.501426, 0.649273, 0.00435422, 0, 0.52562, 0.63302, 0.0040875, 0, 0.550498, 0.61705, 0.00384075, 0, 0.576089, 0.601154, 0.00359557, 0, 0.602427, 0.586008, 0.00337636, 0, 0.629544, 0.570699, 0.00316019, 0, 0.657479, 0.555166, 0.00296033, 0, 0.686264, 0.539645, 0.00277552, 0, 0.715924, 0.524159, 0.00259499, 0, 0.746459, 0.508682, 0.00243257, 0, 0.777789, 0.493163, 0.00227851, 0, 0.809524, 0.478004, 0.00213083, 0, 0.84127, 0.46347, 0.00199502, 0, 0.873016, 0.448778, 0.00186967, 0, 0.904762, 0.434105, 0.00174732, 0, 0.936508, 0.419576, 0.00163861, 0, 0.968254, 0.405541, 0.00153341, 0, 1, 1, 0.0106462, 0, 0, 1, 0.0106462, 0, 0, 0.999999, 0.010647, 0, 0, 0.999995, 0.0106502, 0, 0, 0.999985, 0.0106589, 0, 0, 0.999964, 0.0106773, 0, 0, 0.999925, 0.0107106, 0, 0, 0.999861, 0.0107655, 0, 7.12986e-05, 0.999763, 0.0108497, 0, 0.000743959, 0.999616, 0.0109716, 0, 0.00227361, 0.999408, 0.0111408, 0, 0.0046983, 0.999112, 0.0113659, 0, 0.00800158, 0.998637, 0.0116475, 0, 0.0121493, 0.996223, 0.0117231, 0, 0.0171023, 0.994006, 0.0118064, 0, 0.0228218, 0.992444, 0.0120254, 0, 0.0292711, 0.991028, 0.0123314, 0, 0.036417, 0.98803, 0.0124954, 0, 0.0442295, 0.984816, 0.0126538, 0, 0.0526815, 0.981399, 0.0128537, 0, 0.0617492, 0.977085, 0.0129694, 0, 0.0714114, 0.972154, 0.013091, 0, 0.0816495, 0.966617, 0.0131166, 0, 0.0924472, 0.960628, 0.0131583, 0, 0.10379, 0.953295, 0.0131094, 0, 0.115665, 0.94575, 0.0129966, 0, 0.128062, 0.937654, 0.0128796, 0, 0.140972, 0.927716, 0.0126477, 0, 0.154387, 0.917932, 0.0123889, 0, 0.168301, 0.907719, 0.012131, 0, 0.182709, 0.89584, 0.0118013, 0, 0.197608, 0.883526, 0.0114145, 0, 0.212994, 0.870301, 0.0110075, 0, 0.228867, 0.856272, 0.0106019, 0, 0.245227, 0.842251, 0.0101938, 0, 0.262074, 0.826466, 0.00973254, 0, 0.279412, 0.810859, 0.0092846, 0, 0.297244, 0.795051, 0.00883304, 0, 0.315575, 0.780053, 0.00840272, 0, 0.334412, 0.76575, 0.00796438, 0, 0.35376, 0.752298, 0.00752526, 0, 0.373631, 0.739153, 0.00711486, 0, 0.394034, 0.725514, 0.00670361, 0, 0.414983, 0.711473, 0.00632656, 0, 0.436491, 0.696936, 0.00595206, 0, 0.458575, 0.682126, 0.00559191, 0, 0.481253, 0.667027, 0.00525362, 0, 0.504547, 0.651875, 0.00493805, 0, 0.528481, 0.636463, 0.00462848, 0, 0.553081, 0.620641, 0.00433936, 0, 0.578377, 0.604931, 0.00407, 0, 0.604404, 0.589549, 0.00380864, 0, 0.631197, 0.574712, 0.00357049, 0, 0.658795, 0.559775, 0.00334466, 0, 0.687238, 0.544514, 0.00312505, 0, 0.716559, 0.529555, 0.00293199, 0, 0.746776, 0.514402, 0.00274204, 0, 0.777849, 0.499302, 0.00256647, 0, 0.809524, 0.484114, 0.00239901, 0, 0.84127, 0.469308, 0.00225148, 0, 0.873016, 0.455133, 0.00210178, 0, 0.904762, 0.440939, 0.0019727, 0, 0.936508, 0.426627, 0.00184382, 0, 0.968254, 0.412509, 0.00172548, 0, 1, 1, 0.013628, 0, 0, 1, 0.0136281, 0, 0, 0.999999, 0.0136289, 0, 0, 0.999995, 0.0136327, 0, 0, 0.999983, 0.0136427, 0, 0, 0.99996, 0.0136638, 0, 0, 0.999917, 0.0137022, 0, 0, 0.999846, 0.0137652, 0, 0.000204597, 0.999736, 0.0138615, 0, 0.00116837, 0.999573, 0.0140007, 0, 0.00303325, 0.99934, 0.0141927, 0, 0.00580613, 0.999004, 0.0144457, 0, 0.00945626, 0.998407, 0.0147489, 0, 0.0139421, 0.995464, 0.014731, 0, 0.0192202, 0.993328, 0.0148283, 0, 0.0252495, 0.991799, 0.0150797, 0, 0.0319921, 0.990397, 0.0154316, 0, 0.0394138, 0.986835, 0.0155005, 0, 0.0474843, 0.983938, 0.0157308, 0, 0.0561763, 0.980154, 0.0158753, 0, 0.0654661, 0.975659, 0.0159581, 0, 0.0753326, 0.970171, 0.0159832, 0, 0.0857571, 0.964803, 0.0160084, 0, 0.0967236, 0.958366, 0.0159484, 0, 0.108218, 0.950613, 0.0158001, 0, 0.120227, 0.942874, 0.0155845, 0, 0.132741, 0.935005, 0.0154292, 0, 0.145751, 0.924991, 0.0150742, 0, 0.159249, 0.914814, 0.0146757, 0, 0.17323, 0.904743, 0.0143097, 0, 0.187687, 0.893216, 0.0138695, 0, 0.202619, 0.880769, 0.0133706, 0, 0.218021, 0.868136, 0.0128606, 0, 0.233894, 0.85469, 0.0123403, 0, 0.250238, 0.840593, 0.0118091, 0, 0.267052, 0.825808, 0.011253, 0, 0.284341, 0.81009, 0.0107099, 0, 0.302106, 0.79504, 0.0101636, 0, 0.320354, 0.779757, 0.00964041, 0, 0.33909, 0.764697, 0.00911896, 0, 0.358322, 0.750913, 0.00859533, 0, 0.378059, 0.738175, 0.00811592, 0, 0.398311, 0.725242, 0.00764504, 0, 0.41909, 0.711864, 0.00718885, 0, 0.440412, 0.698009, 0.00675843, 0, 0.462292, 0.683841, 0.00634984, 0, 0.484748, 0.669391, 0.00595502, 0, 0.507802, 0.654731, 0.00558671, 0, 0.531477, 0.639805, 0.00523578, 0, 0.555802, 0.624789, 0.00490834, 0, 0.580805, 0.609325, 0.00459448, 0, 0.606522, 0.593975, 0.00430342, 0, 0.63299, 0.578983, 0.00403019, 0, 0.66025, 0.564442, 0.0037707, 0, 0.688346, 0.549835, 0.0035316, 0, 0.717319, 0.535039, 0.00330255, 0, 0.7472, 0.520403, 0.00308932, 0, 0.777982, 0.505687, 0.00289335, 0, 0.809524, 0.490939, 0.00270818, 0, 0.84127, 0.476233, 0.0025343, 0, 0.873016, 0.461624, 0.00237097, 0, 0.904762, 0.447833, 0.00222065, 0, 0.936508, 0.433992, 0.00207561, 0, 0.968254, 0.420147, 0.00194955, 0, 1, 1, 0.0173415, 0, 0, 1, 0.0173416, 0, 0, 0.999999, 0.0173426, 0, 0, 0.999995, 0.0173468, 0, 0, 0.999983, 0.0173582, 0, 0, 0.999954, 0.0173822, 0, 0, 0.999908, 0.0174258, 0, 6.69501e-06, 0.999828, 0.0174973, 0, 0.000427399, 0.999705, 0.0176063, 0, 0.00171019, 0.999524, 0.0177631, 0, 0.0039248, 0.999263, 0.0179781, 0, 0.00705382, 0.998878, 0.018258, 0, 0.0110552, 0.998012, 0.0185551, 0, 0.0158812, 0.994614, 0.0184264, 0, 0.0214852, 0.993132, 0.0186385, 0, 0.0278239, 0.991563, 0.0189067, 0, 0.0348585, 0.989298, 0.0191577, 0, 0.0425544, 0.986036, 0.0192522, 0, 0.050881, 0.982558, 0.0194063, 0, 0.059811, 0.978531, 0.019486, 0, 0.0693209, 0.974198, 0.0195847, 0, 0.0793895, 0.968148, 0.0194749, 0, 0.0899984, 0.962565, 0.0194277, 0, 0.101132, 0.956041, 0.0192991, 0, 0.112775, 0.947749, 0.0189893, 0, 0.124917, 0.94018, 0.018704, 0, 0.137547, 0.93165, 0.0183458, 0, 0.150655, 0.921798, 0.0178775, 0, 0.164236, 0.911573, 0.0173618, 0, 0.178281, 0.901569, 0.0168482, 0, 0.192788, 0.890341, 0.016265, 0, 0.207752, 0.877835, 0.0156199, 0, 0.223171, 0.865472, 0.0149516, 0, 0.239044, 0.852905, 0.0143274, 0, 0.255371, 0.838906, 0.0136643, 0, 0.272153, 0.824888, 0.0129903, 0, 0.289393, 0.809977, 0.0123218, 0, 0.307093, 0.794697, 0.0116572, 0, 0.325259, 0.780028, 0.0110307, 0, 0.343896, 0.765124, 0.0104236, 0, 0.363012, 0.750411, 0.0098219, 0, 0.382617, 0.737264, 0.00924397, 0, 0.402719, 0.724799, 0.00868719, 0, 0.423332, 0.712253, 0.00816476, 0, 0.444469, 0.699267, 0.00767262, 0, 0.466146, 0.685618, 0.00719746, 0, 0.488383, 0.671736, 0.00673916, 0, 0.511199, 0.657777, 0.00631937, 0, 0.534618, 0.643497, 0.00592411, 0, 0.558668, 0.62889, 0.00553928, 0, 0.58338, 0.614299, 0.0051934, 0, 0.608787, 0.599197, 0.00485985, 0, 0.634929, 0.584175, 0.00454357, 0, 0.661849, 0.569541, 0.00425787, 0, 0.689594, 0.555193, 0.00397905, 0, 0.718211, 0.540947, 0.00372364, 0, 0.747742, 0.526593, 0.00348599, 0, 0.778205, 0.512335, 0.00326103, 0, 0.80953, 0.498017, 0.00305137, 0, 0.84127, 0.483609, 0.00285485, 0, 0.873016, 0.469368, 0.00267472, 0, 0.904762, 0.455037, 0.00249945, 0, 0.936508, 0.441493, 0.00234792, 0, 0.968254, 0.428147, 0.00219936, 0, 1, 1, 0.0219422, 0, 0, 1, 0.0219423, 0, 0, 0.999998, 0.0219434, 0, 0, 0.999993, 0.0219481, 0, 0, 0.999981, 0.021961, 0, 0, 0.999949, 0.0219879, 0, 0, 0.999896, 0.0220367, 0, 5.93194e-05, 0.999808, 0.0221167, 0, 0.00075364, 0.99967, 0.0222383, 0, 0.00237884, 0.999466, 0.0224125, 0, 0.00495612, 0.999174, 0.0226495, 0, 0.00844887, 0.998725, 0.0229525, 0, 0.0128058, 0.996979, 0.0231123, 0, 0.0179742, 0.994317, 0.0230742, 0, 0.0239047, 0.992781, 0.0232895, 0, 0.0305526, 0.991191, 0.0235734, 0, 0.0378786, 0.987787, 0.0236152, 0, 0.0458475, 0.985092, 0.0237994, 0, 0.0544287, 0.981121, 0.0238553, 0, 0.0635952, 0.976924, 0.0238706, 0, 0.0733233, 0.97218, 0.0238704, 0, 0.0835922, 0.965956, 0.0236598, 0, 0.0943839, 0.959998, 0.0234735, 0, 0.105682, 0.953245, 0.0232277, 0, 0.117474, 0.944445, 0.0226973, 0, 0.129747, 0.937087, 0.0223527, 0, 0.142491, 0.928341, 0.0218144, 0, 0.155697, 0.9184, 0.0211516, 0, 0.169358, 0.907959, 0.0204553, 0, 0.183469, 0.89808, 0.0197673, 0, 0.198024, 0.887047, 0.0189915, 0, 0.21302, 0.875221, 0.0182082, 0, 0.228455, 0.86269, 0.0173584, 0, 0.244329, 0.850735, 0.0165718, 0, 0.260639, 0.837545, 0.0157524, 0, 0.277389, 0.823639, 0.0149482, 0, 0.29458, 0.809699, 0.0141431, 0, 0.312216, 0.794797, 0.0133527, 0, 0.3303, 0.780578, 0.0126193, 0, 0.34884, 0.766019, 0.0118914, 0, 0.367842, 0.751447, 0.0111839, 0, 0.387315, 0.737275, 0.010514, 0, 0.40727, 0.724545, 0.00987277, 0, 0.427717, 0.712644, 0.00926569, 0, 0.448671, 0.700432, 0.00869029, 0, 0.470149, 0.687664, 0.00814691, 0, 0.492167, 0.674288, 0.00763012, 0, 0.514746, 0.660966, 0.00714437, 0, 0.537911, 0.647264, 0.00668457, 0, 0.561688, 0.633431, 0.00626581, 0, 0.586108, 0.619133, 0.00585593, 0, 0.611206, 0.604935, 0.00548188, 0, 0.637022, 0.590236, 0.00513288, 0, 0.663599, 0.575473, 0.0047906, 0, 0.690989, 0.561228, 0.00448895, 0, 0.719242, 0.547054, 0.00420233, 0, 0.748411, 0.533175, 0.00392869, 0, 0.778531, 0.519163, 0.00367445, 0, 0.809583, 0.505328, 0.00344097, 0, 0.84127, 0.491446, 0.00322003, 0, 0.873016, 0.477356, 0.00301283, 0, 0.904762, 0.46356, 0.00282592, 0, 0.936508, 0.449623, 0.00264956, 0, 0.968254, 0.436068, 0.00246956, 0, 1, 1, 0.0276135, 0, 0, 1, 0.0276136, 0, 0, 0.999998, 0.0276148, 0, 0, 0.999993, 0.0276201, 0, 0, 0.999976, 0.0276342, 0, 0, 0.999945, 0.027664, 0, 0, 0.999884, 0.0277179, 0, 0.00018679, 0.999784, 0.027806, 0, 0.00119607, 0.99963, 0.0279394, 0, 0.00318407, 0.999401, 0.0281295, 0, 0.00613601, 0.999066, 0.0283858, 0, 0.00999963, 0.998524, 0.0287027, 0, 0.0147164, 0.995702, 0.0286256, 0, 0.0202295, 0.993593, 0.0286733, 0, 0.0264876, 0.992067, 0.0288989, 0, 0.0334452, 0.990548, 0.0292135, 0, 0.0410621, 0.986775, 0.0291296, 0, 0.0493032, 0.984054, 0.0293099, 0, 0.0581381, 0.979481, 0.0291881, 0, 0.0675397, 0.975297, 0.0291598, 0, 0.0774848, 0.96981, 0.028954, 0, 0.0879528, 0.963524, 0.028628, 0, 0.0989258, 0.957398, 0.0283135, 0, 0.110388, 0.950088, 0.0278469, 0, 0.122327, 0.941538, 0.0271798, 0, 0.134729, 0.933332, 0.0265388, 0, 0.147587, 0.924392, 0.0257776, 0, 0.160889, 0.914581, 0.024916, 0, 0.174631, 0.904347, 0.0240242, 0, 0.188806, 0.894324, 0.0231229, 0, 0.203409, 0.883724, 0.022153, 0, 0.218437, 0.872207, 0.0211355, 0, 0.233888, 0.859927, 0.0201048, 0, 0.249761, 0.848373, 0.0191263, 0, 0.266056, 0.836023, 0.0181306, 0, 0.282774, 0.82289, 0.0171718, 0, 0.299917, 0.809324, 0.0162196, 0, 0.317488, 0.795361, 0.0152622, 0, 0.335493, 0.781253, 0.01439, 0, 0.353936, 0.767338, 0.013533, 0, 0.372825, 0.753156, 0.0127244, 0, 0.392168, 0.739122, 0.0119454, 0, 0.411976, 0.725358, 0.0112054, 0, 0.432259, 0.712949, 0.010487, 0, 0.453032, 0.701621, 0.00984032, 0, 0.47431, 0.689703, 0.00921495, 0, 0.496111, 0.677216, 0.00862492, 0, 0.518456, 0.664217, 0.00806882, 0, 0.541367, 0.65137, 0.00755922, 0, 0.564872, 0.638, 0.00705705, 0, 0.589001, 0.62453, 0.00661266, 0, 0.613789, 0.610601, 0.00618432, 0, 0.639277, 0.59676, 0.00578033, 0, 0.66551, 0.582433, 0.00540927, 0, 0.692539, 0.568026, 0.00506104, 0, 0.720422, 0.55414, 0.0047353, 0, 0.749216, 0.540178, 0.00442889, 0, 0.778974, 0.526513, 0.00414363, 0, 0.809711, 0.512954, 0.00388237, 0, 0.84127, 0.499403, 0.00362875, 0, 0.873016, 0.486026, 0.00340827, 0, 0.904762, 0.472345, 0.00318598, 0, 0.936508, 0.458828, 0.00297635, 0, 0.968254, 0.445379, 0.00279447, 0, 1, 1, 0.0345716, 0, 0, 1, 0.0345717, 0, 0, 0.999999, 0.034573, 0, 0, 0.999991, 0.0345787, 0, 0, 0.999974, 0.0345941, 0, 0, 0.999937, 0.0346263, 0, 1.88589e-06, 0.999869, 0.0346847, 0, 0.000409238, 0.999757, 0.0347798, 0, 0.0017674, 0.999582, 0.0349233, 0, 0.00413658, 0.999322, 0.0351265, 0, 0.00747408, 0.998939, 0.0353967, 0, 0.0117157, 0.998219, 0.0357018, 0, 0.0167966, 0.994974, 0.0354726, 0, 0.0226572, 0.993201, 0.0355621, 0, 0.0292445, 0.991573, 0.0357641, 0, 0.0365123, 0.989301, 0.0359252, 0, 0.0444203, 0.985712, 0.0358017, 0, 0.0529334, 0.982411, 0.0358353, 0, 0.0620214, 0.977827, 0.035617, 0, 0.0716574, 0.973278, 0.0354398, 0, 0.0818186, 0.967397, 0.0350483, 0, 0.0924846, 0.960696, 0.0344795, 0, 0.103638, 0.954349, 0.0339861, 0, 0.115263, 0.946066, 0.0331323, 0, 0.127348, 0.938012, 0.032359, 0, 0.13988, 0.929413, 0.0314413, 0, 0.152849, 0.920355, 0.0304103, 0, 0.166248, 0.910586, 0.0292785, 0, 0.18007, 0.900609, 0.0281391, 0, 0.194308, 0.890093, 0.0269103, 0, 0.208958, 0.880013, 0.0257269, 0, 0.224018, 0.869001, 0.0244671, 0, 0.239485, 0.85751, 0.0232252, 0, 0.255359, 0.84582, 0.0220117, 0, 0.271638, 0.834383, 0.0208274, 0, 0.288324, 0.822158, 0.0196628, 0, 0.305419, 0.809056, 0.0185306, 0, 0.322927, 0.795832, 0.0174174, 0, 0.340851, 0.782547, 0.0163758, 0, 0.359199, 0.7689, 0.015391, 0, 0.377975, 0.755526, 0.0144488, 0, 0.397189, 0.741681, 0.0135372, 0, 0.416851, 0.728178, 0.0126957, 0, 0.436971, 0.714642, 0.0118812, 0, 0.457564, 0.702756, 0.0111165, 0, 0.478644, 0.69175, 0.0104145, 0, 0.500229, 0.680159, 0.00974439, 0, 0.522339, 0.668073, 0.00911926, 0, 0.544997, 0.655405, 0.00851393, 0, 0.56823, 0.642921, 0.00797637, 0, 0.592068, 0.629993, 0.00745119, 0, 0.616546, 0.616828, 0.00696972, 0, 0.641705, 0.603305, 0.00652425, 0, 0.66759, 0.589833, 0.00610188, 0, 0.694255, 0.575945, 0.00570834, 0, 0.72176, 0.561745, 0.00533384, 0, 0.750168, 0.548277, 0.00500001, 0, 0.779545, 0.534467, 0.00467582, 0, 0.809933, 0.521032, 0.00438092, 0, 0.841272, 0.507877, 0.00410348, 0, 0.873016, 0.494654, 0.00383618, 0, 0.904762, 0.481592, 0.00358699, 0, 0.936508, 0.468509, 0.00337281, 0, 0.968254, 0.455293, 0.00316196, 0, 1, 1, 0.0430698, 0, 0, 1, 0.0430699, 0, 0, 0.999998, 0.0430713, 0, 0, 0.999991, 0.0430773, 0, 0, 0.99997, 0.0430936, 0, 0, 0.999928, 0.0431277, 0, 4.06396e-05, 0.999852, 0.0431893, 0, 0.000744376, 0.999724, 0.0432895, 0, 0.0024806, 0.999527, 0.0434397, 0, 0.00524779, 0.99923, 0.0436507, 0, 0.00898164, 0.998783, 0.0439255, 0, 0.0136083, 0.997507, 0.0441104, 0, 0.0190582, 0.994418, 0.0438225, 0, 0.0252694, 0.992864, 0.0439396, 0, 0.0321879, 0.991127, 0.0440962, 0, 0.039767, 0.987331, 0.0438408, 0, 0.0479667, 0.984819, 0.0438991, 0, 0.056752, 0.980384, 0.0435906, 0, 0.0660929, 0.975846, 0.0432543, 0, 0.075963, 0.970748, 0.0428293, 0, 0.0863398, 0.964303, 0.042153, 0, 0.0972035, 0.95772, 0.0414111, 0, 0.108537, 0.950747, 0.0405893, 0, 0.120325, 0.942533, 0.0394887, 0, 0.132554, 0.934045, 0.0383544, 0, 0.145215, 0.924942, 0.037057, 0, 0.158296, 0.915811, 0.0356993, 0, 0.17179, 0.90612, 0.0342401, 0, 0.185691, 0.896434, 0.0328078, 0, 0.199993, 0.886021, 0.031288, 0, 0.214691, 0.876081, 0.0297776, 0, 0.229782, 0.865608, 0.0282334, 0, 0.245265, 0.854924, 0.026749, 0, 0.261138, 0.843607, 0.02526, 0, 0.277401, 0.832456, 0.0238214, 0, 0.294056, 0.821342, 0.0224682, 0, 0.311104, 0.809303, 0.0211297, 0, 0.328548, 0.796468, 0.0198387, 0, 0.346394, 0.784046, 0.0186227, 0, 0.364645, 0.771262, 0.0174561, 0, 0.38331, 0.758118, 0.0163806, 0, 0.402396, 0.745075, 0.0153287, 0, 0.421912, 0.731926, 0.0143647, 0, 0.44187, 0.71863, 0.0134363, 0, 0.462283, 0.705414, 0.0125603, 0, 0.483165, 0.693792, 0.0117508, 0, 0.504535, 0.683108, 0.0110016, 0, 0.52641, 0.67183, 0.0102757, 0, 0.548816, 0.66015, 0.00962044, 0, 0.571776, 0.647907, 0.00898031, 0, 0.595323, 0.635734, 0.00840811, 0, 0.619489, 0.623208, 0.00786211, 0, 0.644317, 0.610438, 0.00734953, 0, 0.669852, 0.597345, 0.00687688, 0, 0.696148, 0.584138, 0.00643469, 0, 0.723267, 0.5707, 0.00602236, 0, 0.75128, 0.556966, 0.0056324, 0, 0.780258, 0.543607, 0.00528277, 0, 0.810268, 0.530213, 0.00493999, 0, 0.841311, 0.516912, 0.00462265, 0, 0.873016, 0.503916, 0.0043307, 0, 0.904762, 0.491146, 0.00406858, 0, 0.936508, 0.478439, 0.00381436, 0, 0.968254, 0.465834, 0.00358003, 0, 1, 1, 0.0534039, 0, 0, 1, 0.053404, 0, 0, 0.999998, 0.0534055, 0, 0, 0.999989, 0.0534116, 0, 0, 0.999968, 0.0534283, 0, 0, 0.999918, 0.0534633, 0, 0.000155895, 0.99983, 0.0535262, 0, 0.00120914, 0.999685, 0.0536281, 0, 0.00334944, 0.999461, 0.0537799, 0, 0.00653077, 0.999119, 0.0539902, 0, 0.0106718, 0.998582, 0.0542524, 0, 0.0156907, 0.995919, 0.0540318, 0, 0.0215147, 0.993735, 0.0538914, 0, 0.0280801, 0.992126, 0.0539557, 0, 0.0353323, 0.990266, 0.0540401, 0, 0.0432247, 0.986317, 0.0536064, 0, 0.0517172, 0.983213, 0.0534425, 0, 0.0607754, 0.978303, 0.0528622, 0, 0.0703698, 0.973665, 0.0523363, 0, 0.0804742, 0.968091, 0.0516165, 0, 0.0910667, 0.961026, 0.0505434, 0, 0.102128, 0.954333, 0.049523, 0, 0.113641, 0.946372, 0.0481698, 0, 0.125591, 0.938254, 0.0467674, 0, 0.137965, 0.929516, 0.0452341, 0, 0.150754, 0.920106, 0.0435083, 0, 0.163947, 0.910899, 0.0417399, 0, 0.177537, 0.901532, 0.0399389, 0, 0.191516, 0.891919, 0.0380901, 0, 0.205881, 0.882006, 0.0362341, 0, 0.220626, 0.871965, 0.0343444, 0, 0.235749, 0.862145, 0.0324832, 0, 0.251248, 0.852058, 0.0306681, 0, 0.267121, 0.84161, 0.0289097, 0, 0.283368, 0.830806, 0.0272079, 0, 0.299992, 0.820476, 0.0256089, 0, 0.316992, 0.809514, 0.0240394, 0, 0.334374, 0.797865, 0.0225379, 0, 0.35214, 0.785621, 0.0211235, 0, 0.370296, 0.773765, 0.0197908, 0, 0.388849, 0.761629, 0.0185235, 0, 0.407807, 0.748891, 0.0173358, 0, 0.427178, 0.736437, 0.0162305, 0, 0.446974, 0.723707, 0.0151778, 0, 0.467207, 0.710606, 0.0141791, 0, 0.487892, 0.698019, 0.0132592, 0, 0.509046, 0.686203, 0.0123887, 0, 0.530687, 0.675692, 0.0115976, 0, 0.552839, 0.664826, 0.0108325, 0, 0.575527, 0.65349, 0.0101348, 0, 0.59878, 0.641774, 0.00947756, 0, 0.622634, 0.629794, 0.00886058, 0, 0.647128, 0.617647, 0.00828526, 0, 0.672308, 0.60534, 0.00775312, 0, 0.698231, 0.592718, 0.00726033, 0, 0.724958, 0.579746, 0.00679731, 0, 0.752563, 0.566763, 0.00636111, 0, 0.781127, 0.553515, 0.00595228, 0, 0.810733, 0.540118, 0.00556876, 0, 0.841426, 0.527325, 0.00523051, 0, 0.873016, 0.514265, 0.00490712, 0, 0.904762, 0.501406, 0.00460297, 0, 0.936508, 0.488922, 0.00431247, 0, 0.968254, 0.476541, 0.0040472, 0, 1, 1, 0.0659184, 0, 0, 1, 0.0659185, 0, 0, 0.999998, 0.06592, 0, 0, 0.999988, 0.0659259, 0, 0, 0.999963, 0.0659423, 0, 0, 0.999907, 0.0659764, 0, 0.000374198, 0.999806, 0.0660376, 0, 0.00182071, 0.999639, 0.0661361, 0, 0.0043894, 0.999378, 0.0662814, 0, 0.00800055, 0.998985, 0.0664779, 0, 0.0125594, 0.998285, 0.0666914, 0, 0.0179786, 0.995071, 0.0661989, 0, 0.0241822, 0.993172, 0.0660454, 0, 0.031106, 0.991438, 0.0660105, 0, 0.0386952, 0.988428, 0.0656875, 0, 0.0469032, 0.985218, 0.0652913, 0, 0.0556905, 0.981128, 0.0647107, 0, 0.065023, 0.976015, 0.0638491, 0, 0.0748717, 0.97097, 0.062993, 0, 0.0852112, 0.964582, 0.0617927, 0, 0.0960199, 0.957383, 0.0603626, 0, 0.107279, 0.949969, 0.0588128, 0, 0.118971, 0.941843, 0.0570274, 0, 0.131084, 0.933624, 0.0551885, 0, 0.143604, 0.924543, 0.053122, 0, 0.156521, 0.914919, 0.0508897, 0, 0.169825, 0.905773, 0.0486418, 0, 0.18351, 0.896434, 0.0463364, 0, 0.197569, 0.887195, 0.0440623, 0, 0.211997, 0.877706, 0.0417799, 0, 0.226789, 0.867719, 0.03945, 0, 0.241944, 0.858587, 0.037243, 0, 0.257458, 0.849317, 0.0350956, 0, 0.273331, 0.839585, 0.0329852, 0, 0.289563, 0.829856, 0.0310028, 0, 0.306154, 0.819589, 0.0290953, 0, 0.323108, 0.809714, 0.0272738, 0, 0.340426, 0.79934, 0.0255631, 0, 0.358113, 0.788224, 0.0239175, 0, 0.376175, 0.776619, 0.0223831, 0, 0.394616, 0.76521, 0.0209298, 0, 0.413445, 0.753716, 0.0195786, 0, 0.432671, 0.741564, 0.0183001, 0, 0.452305, 0.729413, 0.0171259, 0, 0.472358, 0.717146, 0.0159933, 0, 0.492845, 0.70436, 0.0149495, 0, 0.513783, 0.69219, 0.0139681, 0, 0.535189, 0.680289, 0.0130577, 0, 0.557087, 0.669611, 0.0122198, 0, 0.5795, 0.659113, 0.0114174, 0, 0.602459, 0.648148, 0.0106729, 0, 0.625997, 0.636905, 0.00998997, 0, 0.650154, 0.625154, 0.00934313, 0, 0.674976, 0.613481, 0.00874839, 0, 0.700518, 0.60154, 0.00818265, 0, 0.726845, 0.58943, 0.00766889, 0, 0.754032, 0.576828, 0.00717153, 0, 0.782167, 0.564194, 0.00672696, 0, 0.811344, 0.551501, 0.00630863, 0, 0.841644, 0.538635, 0.00592177, 0, 0.873016, 0.525724, 0.00554888, 0, 0.904762, 0.513209, 0.00520225, 0, 0.936508, 0.500457, 0.00488231, 0, 0.968254, 0.48799, 0.00457153, 0, 1, 1, 0.0810131, 0, 0, 1, 0.0810133, 0, 0, 0.999997, 0.0810145, 0, 0, 0.999985, 0.08102, 0, 0, 0.999956, 0.0810347, 0, 1.95026e-05, 0.999893, 0.0810656, 0, 0.000719316, 0.999777, 0.0811205, 0, 0.00259774, 0.999583, 0.081208, 0, 0.00561807, 0.999281, 0.0813343, 0, 0.00967472, 0.998813, 0.0814969, 0, 0.0146627, 0.997597, 0.0815217, 0, 0.0204902, 0.994379, 0.0808502, 0, 0.0270802, 0.992744, 0.0806792, 0, 0.0343674, 0.990745, 0.0804589, 0, 0.0422974, 0.986646, 0.0796107, 0, 0.0508242, 0.983611, 0.0790913, 0, 0.0599087, 0.978869, 0.0780746, 0, 0.0695175, 0.973475, 0.0768218, 0, 0.0796223, 0.967845, 0.0754926, 0, 0.0901983, 0.960778, 0.0737063, 0, 0.101224, 0.953333, 0.0718052, 0, 0.112682, 0.945274, 0.0695946, 0, 0.124555, 0.936955, 0.0672492, 0, 0.136831, 0.928319, 0.0647732, 0, 0.149496, 0.919075, 0.0620947, 0, 0.162542, 0.909114, 0.0591816, 0, 0.175958, 0.900137, 0.0563917, 0, 0.189739, 0.891069, 0.0535392, 0, 0.203877, 0.882262, 0.0507642, 0, 0.218368, 0.873232, 0.0479793, 0, 0.233208, 0.864042, 0.045226, 0, 0.248393, 0.855002, 0.0425413, 0, 0.263923, 0.846569, 0.0400126, 0, 0.279796, 0.837714, 0.0375269, 0, 0.296012, 0.828918, 0.0352027, 0, 0.312573, 0.819783, 0.0330011, 0, 0.329479, 0.810129, 0.0308908, 0, 0.346734, 0.800866, 0.0289112, 0, 0.364342, 0.79093, 0.0270255, 0, 0.382307, 0.780593, 0.0252758, 0, 0.400637, 0.769511, 0.0236178, 0, 0.419337, 0.758558, 0.0220652, 0, 0.438418, 0.747632, 0.0206289, 0, 0.457889, 0.736146, 0.0192873, 0, 0.477761, 0.724093, 0.0180333, 0, 0.49805, 0.71234, 0.0168264, 0, 0.51877, 0.700201, 0.015746, 0, 0.53994, 0.687949, 0.0147027, 0, 0.561581, 0.676163, 0.0137512, 0, 0.583718, 0.665001, 0.0128655, 0, 0.60638, 0.65472, 0.0120366, 0, 0.629599, 0.644213, 0.0112604, 0, 0.653415, 0.633382, 0.0105413, 0, 0.677874, 0.62212, 0.00986498, 0, 0.70303, 0.610631, 0.00923308, 0, 0.728948, 0.599078, 0.00864206, 0, 0.755706, 0.587519, 0.00811784, 0, 0.783396, 0.575505, 0.00761237, 0, 0.812121, 0.563148, 0.00713949, 0, 0.841989, 0.550828, 0.00668379, 0, 0.873035, 0.538458, 0.00627715, 0, 0.904762, 0.525905, 0.00588336, 0, 0.936508, 0.513517, 0.00552687, 0, 0.968254, 0.501395, 0.00519681, 0, 1, 1, 0.0991506, 0, 0, 1, 0.0991504, 0, 0, 0.999996, 0.0991515, 0, 0, 0.999984, 0.0991558, 0, 0, 0.999947, 0.0991672, 0, 0.000114389, 0.999874, 0.0991912, 0, 0.00121503, 0.999739, 0.0992331, 0, 0.00356108, 0.999514, 0.0992983, 0, 0.00705578, 0.999159, 0.0993877, 0, 0.011574, 0.998586, 0.0994837, 0, 0.017003, 0.995731, 0.0988425, 0, 0.0232484, 0.993384, 0.098276, 0, 0.0302318, 0.991615, 0.0979269, 0, 0.0378884, 0.989029, 0.0973432, 0, 0.0461641, 0.985373, 0.0963539, 0, 0.0550136, 0.981278, 0.0952306, 0, 0.0643988, 0.975777, 0.0936233, 0, 0.0742868, 0.970526, 0.0920219, 0, 0.0846501, 0.963755, 0.0898912, 0, 0.0954644, 0.956676, 0.0876064, 0, 0.106709, 0.948099, 0.0847751, 0, 0.118367, 0.939718, 0.0818638, 0, 0.130423, 0.931305, 0.078857, 0, 0.142862, 0.922342, 0.0756127, 0, 0.155674, 0.912842, 0.0721473, 0, 0.168849, 0.903304, 0.0686195, 0, 0.182378, 0.89411, 0.0650589, 0, 0.196255, 0.885512, 0.0616022, 0, 0.210473, 0.877193, 0.0582434, 0, 0.225027, 0.86877, 0.0548979, 0, 0.239915, 0.860267, 0.0516095, 0, 0.255132, 0.851915, 0.048468, 0, 0.270678, 0.843912, 0.0454447, 0, 0.286551, 0.83604, 0.0425612, 0, 0.302751, 0.828245, 0.0398752, 0, 0.31928, 0.820159, 0.0373198, 0, 0.336138, 0.81167, 0.034916, 0, 0.35333, 0.802659, 0.0326402, 0, 0.370858, 0.793921, 0.0304901, 0, 0.388728, 0.784713, 0.0284857, 0, 0.406944, 0.774946, 0.0266186, 0, 0.425515, 0.76448, 0.0248593, 0, 0.444449, 0.753793, 0.0232114, 0, 0.463756, 0.743506, 0.0217039, 0, 0.483447, 0.732555, 0.0202841, 0, 0.503535, 0.720965, 0.0189648, 0, 0.524036, 0.709422, 0.0177189, 0, 0.544968, 0.697756, 0.0165626, 0, 0.56635, 0.685565, 0.015483, 0, 0.588208, 0.673987, 0.0144892, 0, 0.610569, 0.66244, 0.0135607, 0, 0.633466, 0.651675, 0.0126956, 0, 0.656936, 0.641598, 0.0118788, 0, 0.681025, 0.63121, 0.0111261, 0, 0.705788, 0.620514, 0.010437, 0, 0.731289, 0.609366, 0.00978747, 0, 0.757606, 0.598137, 0.00917257, 0, 0.784834, 0.586966, 0.00859778, 0, 0.813085, 0.575549, 0.00806803, 0, 0.842485, 0.563797, 0.00757294, 0, 0.87313, 0.551758, 0.00710592, 0, 0.904762, 0.539894, 0.0066841, 0, 0.936508, 0.527901, 0.00627901, 0, 0.968254, 0.515819, 0.00590506, 0, 1, 1, 0.120864, 0, 0, 1, 0.120864, 0, 0, 0.999996, 0.120864, 0, 0, 0.99998, 0.120867, 0, 0, 0.99994, 0.120872, 0, 0.000323781, 0.999852, 0.120884, 0, 0.00188693, 0.999693, 0.120903, 0, 0.00473489, 0.999426, 0.120929, 0, 0.00872704, 0.999002, 0.120955, 0, 0.0137237, 0.998235, 0.120918, 0, 0.0196068, 0.994608, 0.119764, 0, 0.0262803, 0.992997, 0.119265, 0, 0.0336657, 0.990968, 0.11863, 0, 0.0416987, 0.987002, 0.117261, 0, 0.0503261, 0.983524, 0.116009, 0, 0.0595035, 0.97875, 0.114252, 0, 0.0691935, 0.972652, 0.11193, 0, 0.0793645, 0.966613, 0.109555, 0, 0.0899894, 0.959275, 0.106612, 0, 0.101045, 0.951272, 0.103375, 0, 0.112512, 0.942323, 0.0996594, 0, 0.124372, 0.933679, 0.0958841, 0, 0.136611, 0.924822, 0.0919265, 0, 0.149216, 0.915742, 0.0878061, 0, 0.162176, 0.906348, 0.0834894, 0, 0.175482, 0.896883, 0.079085, 0, 0.189125, 0.88774, 0.0746745, 0, 0.203098, 0.87986, 0.0705773, 0, 0.217396, 0.871998, 0.0665005, 0, 0.232015, 0.864325, 0.0625413, 0, 0.24695, 0.856685, 0.0586781, 0, 0.2622, 0.84925, 0.0550063, 0, 0.277761, 0.841719, 0.0514727, 0, 0.293634, 0.834755, 0.0481398, 0, 0.309819, 0.827853, 0.0450172, 0, 0.326315, 0.820888, 0.0420969, 0, 0.343126, 0.813616, 0.0393702, 0, 0.360254, 0.805767, 0.0367771, 0, 0.377701, 0.797338, 0.0343274, 0, 0.395474, 0.789122, 0.0320529, 0, 0.413577, 0.780601, 0.0299485, 0, 0.432018, 0.771424, 0.0279812, 0, 0.450804, 0.761502, 0.0261054, 0, 0.469944, 0.751166, 0.0243942, 0, 0.489451, 0.741276, 0.0228087, 0, 0.509337, 0.730898, 0.0213265, 0, 0.529617, 0.719878, 0.0199307, 0, 0.550307, 0.708379, 0.0186574, 0, 0.571428, 0.697165, 0.0174446, 0, 0.593003, 0.685554, 0.0163144, 0, 0.615059, 0.673631, 0.015276, 0, 0.637628, 0.662385, 0.0143003, 0, 0.660746, 0.651059, 0.0134112, 0, 0.68446, 0.640451, 0.0125794, 0, 0.70882, 0.630536, 0.011793, 0, 0.733893, 0.620316, 0.0110547, 0, 0.759756, 0.609722, 0.0103668, 0, 0.786505, 0.598804, 0.00973009, 0, 0.814259, 0.587871, 0.00912812, 0, 0.843157, 0.577121, 0.00858916, 0, 0.87334, 0.566019, 0.00807333, 0, 0.904762, 0.554664, 0.00759687, 0, 0.936508, 0.543101, 0.00714759, 0, 0.968254, 0.531558, 0.00673418, 0, 1, 1, 0.146767, 0, 0, 1, 0.146767, 0, 0, 0.999997, 0.146767, 0, 0, 0.999977, 0.146765, 0, 3.20658e-06, 0.999929, 0.146762, 0, 0.000682576, 0.999823, 0.146753, 0, 0.00276402, 0.999633, 0.146735, 0, 0.00614771, 0.999314, 0.146699, 0, 0.0106613, 0.998796, 0.14662, 0, 0.0161546, 0.997124, 0.146107, 0, 0.0225063, 0.994062, 0.144857, 0, 0.0296198, 0.992154, 0.144011, 0, 0.037417, 0.989186, 0.142712, 0, 0.0458348, 0.985279, 0.140926, 0, 0.0548211, 0.980826, 0.13885, 0, 0.0643326, 0.975056, 0.136168, 0, 0.074333, 0.969005, 0.133217, 0, 0.0847917, 0.961554, 0.12959, 0, 0.0956828, 0.954206, 0.125886, 0, 0.106984, 0.945046, 0.121335, 0, 0.118675, 0.935678, 0.116492, 0, 0.130741, 0.926748, 0.111635, 0, 0.143166, 0.917764, 0.106625, 0, 0.155939, 0.908358, 0.101325, 0, 0.169049, 0.899219, 0.0960249, 0, 0.182487, 0.890089, 0.0906527, 0, 0.196245, 0.881488, 0.0853905, 0, 0.210317, 0.874031, 0.0804177, 0, 0.224697, 0.866932, 0.0756005, 0, 0.23938, 0.859976, 0.0709019, 0, 0.254364, 0.853375, 0.0664391, 0, 0.269646, 0.846971, 0.0622012, 0, 0.285223, 0.840483, 0.058129, 0, 0.301096, 0.833969, 0.0542762, 0, 0.317265, 0.82806, 0.0507042, 0, 0.333729, 0.822128, 0.047368, 0, 0.350491, 0.815989, 0.044272, 0, 0.367554, 0.809336, 0.0413444, 0, 0.38492, 0.802177, 0.038601, 0, 0.402594, 0.79441, 0.0360227, 0, 0.420582, 0.786573, 0.0336383, 0, 0.438891, 0.778619, 0.0314321, 0, 0.457527, 0.77, 0.029362, 0, 0.476499, 0.760698, 0.0274102, 0, 0.49582, 0.750932, 0.0256146, 0, 0.5155, 0.740993, 0.023974, 0, 0.535555, 0.731159, 0.0224182, 0, 0.556, 0.720836, 0.0209889, 0, 0.576855, 0.709913, 0.0196411, 0, 0.598143, 0.698415, 0.0183824, 0, 0.619888, 0.68745, 0.0172222, 0, 0.642123, 0.676154, 0.0161509, 0, 0.664883, 0.664383, 0.0151397, 0, 0.688211, 0.6533, 0.0141873, 0, 0.71216, 0.642072, 0.0133105, 0, 0.736792, 0.631412, 0.0124932, 0, 0.762186, 0.621622, 0.0117408, 0, 0.788439, 0.611681, 0.0110358, 0, 0.815672, 0.60142, 0.0103775, 0, 0.844034, 0.59083, 0.00975623, 0, 0.873699, 0.580254, 0.00918084, 0, 0.904765, 0.569841, 0.00864721, 0, 0.936508, 0.559224, 0.00815731, 0, 0.968254, 0.548315, 0.00767924, 0, 1, 1, 0.177563, 0, 0, 1, 0.177563, 0, 0, 0.999994, 0.177562, 0, 0, 0.999972, 0.177555, 0, 6.64171e-05, 0.999914, 0.177536, 0, 0.0012276, 0.999787, 0.177496, 0, 0.00388025, 0.999556, 0.17742, 0, 0.00783463, 0.999165, 0.177285, 0, 0.0128953, 0.9985, 0.177037, 0, 0.0189053, 0.995388, 0.175634, 0, 0.025742, 0.993102, 0.174375, 0, 0.033309, 0.990992, 0.173121, 0, 0.0415298, 0.986932, 0.170896, 0, 0.0503425, 0.982786, 0.16847, 0, 0.0596964, 0.977592, 0.165455, 0, 0.0695498, 0.971075, 0.161676, 0, 0.0798676, 0.963967, 0.157458, 0, 0.0906201, 0.956397, 0.152836, 0, 0.101783, 0.947489, 0.147467, 0, 0.113333, 0.937564, 0.14145, 0, 0.125254, 0.928182, 0.135383, 0, 0.137529, 0.919027, 0.129212, 0, 0.150144, 0.909618, 0.12276, 0, 0.163088, 0.900492, 0.116273, 0, 0.176351, 0.891671, 0.1098, 0, 0.189924, 0.883146, 0.103362, 0, 0.203799, 0.875151, 0.0970799, 0, 0.21797, 0.868338, 0.0911732, 0, 0.232433, 0.862033, 0.0854966, 0, 0.247182, 0.856107, 0.0800691, 0, 0.262216, 0.850644, 0.0749618, 0, 0.27753, 0.845261, 0.070079, 0, 0.293124, 0.839885, 0.0654321, 0, 0.308997, 0.834609, 0.0610975, 0, 0.325149, 0.829083, 0.0569741, 0, 0.341581, 0.82404, 0.0531736, 0, 0.358294, 0.818968, 0.049665, 0, 0.37529, 0.813496, 0.0463856, 0, 0.392573, 0.807533, 0.0433217, 0, 0.410148, 0.80099, 0.0404402, 0, 0.428019, 0.793891, 0.0377578, 0, 0.446192, 0.786281, 0.0352616, 0, 0.464676, 0.778773, 0.0329577, 0, 0.483478, 0.770737, 0.030808, 0, 0.502608, 0.762094, 0.0287964, 0, 0.522079, 0.752898, 0.0269254, 0, 0.541905, 0.743306, 0.0251926, 0, 0.5621, 0.733416, 0.023595, 0, 0.582684, 0.723742, 0.0221155, 0, 0.603677, 0.713542, 0.0207435, 0, 0.625106, 0.702755, 0.019434, 0, 0.646998, 0.691484, 0.0182046, 0, 0.66939, 0.680531, 0.0170771, 0, 0.692324, 0.66953, 0.0160339, 0, 0.715849, 0.658126, 0.0150677, 0, 0.740028, 0.646933, 0.0141551, 0, 0.764937, 0.636107, 0.0133179, 0, 0.790673, 0.625271, 0.0125284, 0, 0.817358, 0.615225, 0.0117937, 0, 0.84515, 0.605678, 0.0111181, 0, 0.874244, 0.59583, 0.0104759, 0, 0.904828, 0.585704, 0.00986672, 0, 0.936508, 0.575413, 0.00929712, 0, 0.968254, 0.565373, 0.00876713, 0, 1, 1, 0.214058, 0, 0, 0.999999, 0.214058, 0, 0, 0.999994, 0.214055, 0, 0, 0.999966, 0.214039, 0, 0.000259642, 0.999893, 0.213998, 0, 0.00200075, 0.999737, 0.21391, 0, 0.00527775, 0.999449, 0.213745, 0, 0.00983959, 0.99896, 0.213458, 0, 0.0154755, 0.9979, 0.212855, 0, 0.0220249, 0.994278, 0.210779, 0, 0.0293654, 0.992254, 0.20926, 0, 0.0374021, 0.98881, 0.206908, 0, 0.0460604, 0.984715, 0.204009, 0, 0.0552802, 0.979738, 0.200471, 0, 0.0650127, 0.972884, 0.195813, 0, 0.0752175, 0.965996, 0.190856, 0, 0.0858612, 0.957974, 0.185077, 0, 0.0969155, 0.949155, 0.17868, 0, 0.108356, 0.939288, 0.171513, 0, 0.120163, 0.928996, 0.163838, 0, 0.132319, 0.919563, 0.156246, 0, 0.144808, 0.910004, 0.148359, 0, 0.157618, 0.900791, 0.140417, 0, 0.170737, 0.892135, 0.132569, 0, 0.184155, 0.883803, 0.124741, 0, 0.197866, 0.876034, 0.117091, 0, 0.211861, 0.869219, 0.109835, 0, 0.226134, 0.863062, 0.102859, 0, 0.240682, 0.857795, 0.0962928, 0, 0.255499, 0.853009, 0.0900725, 0, 0.270583, 0.848603, 0.0842101, 0, 0.285931, 0.844335, 0.0786527, 0, 0.301542, 0.840208, 0.0734397, 0, 0.317415, 0.836035, 0.0685334, 0, 0.33355, 0.83172, 0.0639275, 0, 0.349948, 0.827135, 0.0595909, 0, 0.36661, 0.822797, 0.0556204, 0, 0.383539, 0.818387, 0.0519394, 0, 0.400738, 0.813565, 0.0485317, 0, 0.41821, 0.808142, 0.0453138, 0, 0.435961, 0.802212, 0.0423354, 0, 0.453997, 0.79573, 0.0395553, 0, 0.472324, 0.788741, 0.036988, 0, 0.490951, 0.781093, 0.0345688, 0, 0.509887, 0.773597, 0.0323297, 0, 0.529144, 0.765622, 0.0302719, 0, 0.548735, 0.757083, 0.0283477, 0, 0.568674, 0.747992, 0.0265562, 0, 0.588979, 0.738591, 0.0248844, 0, 0.609671, 0.728719, 0.0233342, 0, 0.630773, 0.719146, 0.0219081, 0, 0.652314, 0.709165, 0.0205711, 0, 0.674328, 0.69875, 0.0193248, 0, 0.696854, 0.687884, 0.0181582, 0, 0.719942, 0.676818, 0.0170746, 0, 0.743651, 0.666247, 0.0160718, 0, 0.768057, 0.655284, 0.0151262, 0, 0.793253, 0.64401, 0.0142561, 0, 0.819363, 0.633353, 0.0134327, 0, 0.846547, 0.622674, 0.012653, 0, 0.875017, 0.612265, 0.0119354, 0, 0.905021, 0.602455, 0.0112533, 0, 0.936508, 0.593147, 0.0106234, 0, 0.968254, 0.583592, 0.0100213, 0, 1, 1, 0.25717, 0, 0, 1, 0.25717, 0, 0, 0.999992, 0.257164, 0, 0, 0.999958, 0.257135, 0, 0.000641715, 0.999864, 0.25706, 0, 0.00305314, 0.999666, 0.256897, 0, 0.00700975, 0.999302, 0.256596, 0, 0.0122194, 0.998663, 0.25607, 0, 0.0184622, 0.995607, 0.254123, 0, 0.0255773, 0.993094, 0.252081, 0, 0.0334439, 0.9907, 0.249867, 0, 0.0419696, 0.98594, 0.246118, 0, 0.0510823, 0.981214, 0.242049, 0, 0.0607242, 0.974966, 0.236869, 0, 0.0708486, 0.967589, 0.230724, 0, 0.081417, 0.95915, 0.223635, 0, 0.0923974, 0.950257, 0.21596, 0, 0.103763, 0.940165, 0.207296, 0, 0.115491, 0.929396, 0.197901, 0, 0.127562, 0.919288, 0.188437, 0, 0.13996, 0.909428, 0.178762, 0, 0.15267, 0.900105, 0.169072, 0, 0.165679, 0.891418, 0.159478, 0, 0.178979, 0.883347, 0.15002, 0, 0.192558, 0.875992, 0.140813, 0, 0.20641, 0.869466, 0.13196, 0, 0.220529, 0.863699, 0.123501, 0, 0.234907, 0.858553, 0.115436, 0, 0.249542, 0.854379, 0.107901, 0, 0.264428, 0.850894, 0.10088, 0, 0.279564, 0.847632, 0.0942296, 0, 0.294947, 0.844571, 0.0879861, 0, 0.310575, 0.84163, 0.0821534, 0, 0.326448, 0.838542, 0.0766409, 0, 0.342566, 0.835412, 0.0715322, 0, 0.358929, 0.831899, 0.0666883, 0, 0.37554, 0.828177, 0.0622175, 0, 0.392399, 0.82416, 0.0580452, 0, 0.409511, 0.820393, 0.054267, 0, 0.426878, 0.816068, 0.0507172, 0, 0.444506, 0.811201, 0.0474041, 0, 0.4624, 0.805785, 0.0443174, 0, 0.480566, 0.799878, 0.0414562, 0, 0.499013, 0.793469, 0.0388147, 0, 0.517749, 0.786473, 0.0363453, 0, 0.536785, 0.778874, 0.0340225, 0, 0.556134, 0.771277, 0.0318599, 0, 0.575809, 0.763426, 0.0298859, 0, 0.595827, 0.755044, 0.0280357, 0, 0.616207, 0.746161, 0.0262979, 0, 0.636973, 0.737124, 0.0247295, 0, 0.65815, 0.72761, 0.0232514, 0, 0.679772, 0.717822, 0.0218755, 0, 0.701876, 0.708279, 0.0205942, 0, 0.724509, 0.698333, 0.0193947, 0, 0.74773, 0.68802, 0.0182717, 0, 0.771609, 0.677321, 0.0172044, 0, 0.79624, 0.666504, 0.0162122, 0, 0.821743, 0.656184, 0.0152924, 0, 0.84828, 0.64556, 0.0144326, 0, 0.876069, 0.634636, 0.0136157, 0, 0.905404, 0.624124, 0.0128612, 0, 0.936508, 0.613914, 0.0121435, 0, 0.968254, 0.603589, 0.0114887, 0, 1, 1, 0.307946, 0, 0, 0.999999, 0.307945, 0, 0, 0.999988, 0.307934, 0, 2.04479e-05, 0.999944, 0.307886, 0, 0.00127833, 0.999824, 0.307756, 0, 0.00445047, 0.999565, 0.30748, 0, 0.00914673, 0.999085, 0.306966, 0, 0.0150498, 0.998103, 0.306004, 0, 0.0219367, 0.994249, 0.303028, 0, 0.0296485, 0.991807, 0.300435, 0, 0.038068, 0.987773, 0.296554, 0, 0.0471062, 0.982673, 0.2916, 0, 0.0566942, 0.976623, 0.285641, 0, 0.0667768, 0.968757, 0.27815, 0, 0.0773099, 0.959849, 0.269529, 0, 0.088257, 0.950663, 0.260248, 0, 0.0995879, 0.940129, 0.249704, 0, 0.111277, 0.92895, 0.238291, 0, 0.123304, 0.917996, 0.226501, 0, 0.13565, 0.907813, 0.214669, 0, 0.148299, 0.898305, 0.202835, 0, 0.161237, 0.889626, 0.191158, 0, 0.174455, 0.88175, 0.179695, 0, 0.187941, 0.874715, 0.168548, 0, 0.201687, 0.868746, 0.15792, 0, 0.215687, 0.863703, 0.147807, 0, 0.229933, 0.859315, 0.138149, 0, 0.24442, 0.855538, 0.128993, 0, 0.259145, 0.852428, 0.120414, 0, 0.274103, 0.850168, 0.112498, 0, 0.289293, 0.848132, 0.105054, 0, 0.304711, 0.846291, 0.0981087, 0, 0.320357, 0.844431, 0.0915942, 0, 0.33623, 0.842493, 0.0855056, 0, 0.35233, 0.840368, 0.0798204, 0, 0.368658, 0.83798, 0.0745097, 0, 0.385214, 0.83523, 0.0695424, 0, 0.402002, 0.832091, 0.0649092, 0, 0.419023, 0.828667, 0.0606291, 0, 0.436282, 0.824805, 0.0566523, 0, 0.453782, 0.820988, 0.0530229, 0, 0.471529, 0.816635, 0.0496364, 0, 0.489528, 0.811725, 0.0464658, 0, 0.507788, 0.806316, 0.0435082, 0, 0.526317, 0.800469, 0.0407873, 0, 0.545124, 0.794107, 0.038255, 0, 0.564221, 0.787218, 0.0358825, 0, 0.583621, 0.779872, 0.0336785, 0, 0.603341, 0.772097, 0.0316379, 0, 0.623397, 0.764484, 0.0297379, 0, 0.643812, 0.756428, 0.0279581, 0, 0.664611, 0.748022, 0.0263153, 0, 0.685824, 0.739268, 0.0247799, 0, 0.707488, 0.73024, 0.0233385, 0, 0.729646, 0.720893, 0.0220035, 0, 0.752354, 0.71119, 0.0207555, 0, 0.77568, 0.701791, 0.0195843, 0, 0.799715, 0.692184, 0.0184891, 0, 0.824574, 0.682258, 0.0174541, 0, 0.850417, 0.67206, 0.0164873, 0, 0.877466, 0.661717, 0.0155959, 0, 0.90604, 0.651462, 0.0147519, 0, 0.936528, 0.641467, 0.0139727, 0, 0.968254, 0.631229, 0.0132363, 0, 1, 1, 0.367573, 0, 0, 0.999999, 0.367571, 0, 0, 0.999984, 0.367553, 0, 0.000183382, 0.999925, 0.367473, 0, 0.00225254, 0.999759, 0.367259, 0, 0.00628165, 0.99941, 0.366801, 0, 0.0117858, 0.998739, 0.365946, 0, 0.0184359, 0.995529, 0.363191, 0, 0.0260114, 0.992875, 0.360171, 0, 0.0343581, 0.989135, 0.355981, 0, 0.0433637, 0.984166, 0.350401, 0, 0.0529438, 0.977871, 0.343348, 0, 0.0630334, 0.96951, 0.334341, 0, 0.0735805, 0.959964, 0.323862, 0, 0.0845437, 0.950162, 0.312521, 0, 0.095889, 0.938882, 0.299577, 0, 0.107588, 0.926992, 0.285573, 0, 0.119617, 0.915589, 0.271212, 0, 0.131957, 0.904791, 0.256611, 0, 0.144591, 0.895177, 0.242224, 0, 0.157503, 0.886403, 0.227952, 0, 0.170682, 0.878957, 0.214192, 0, 0.184117, 0.872418, 0.200795, 0, 0.197799, 0.867029, 0.188015, 0, 0.21172, 0.862835, 0.175975, 0, 0.225873, 0.859411, 0.164526, 0, 0.240253, 0.856655, 0.153693, 0, 0.254854, 0.854519, 0.14352, 0, 0.269673, 0.852828, 0.13397, 0, 0.284707, 0.851412, 0.124984, 0, 0.299953, 0.850609, 0.116748, 0, 0.315408, 0.849855, 0.10905, 0, 0.331073, 0.849017, 0.101839, 0, 0.346946, 0.848079, 0.0951359, 0, 0.363028, 0.846911, 0.0888774, 0, 0.379318, 0.845445, 0.0830375, 0, 0.395818, 0.84362, 0.0775844, 0, 0.41253, 0.841411, 0.0725054, 0, 0.429457, 0.838768, 0.0677691, 0, 0.446602, 0.835801, 0.0634016, 0, 0.463968, 0.832341, 0.0593095, 0, 0.481561, 0.828424, 0.0555121, 0, 0.499386, 0.824312, 0.052024, 0, 0.51745, 0.819918, 0.0487865, 0, 0.535761, 0.815072, 0.0457801, 0, 0.554328, 0.809863, 0.0430184, 0, 0.573162, 0.804164, 0.0404245, 0, 0.592275, 0.798034, 0.0380146, 0, 0.611681, 0.791436, 0.0357436, 0, 0.631398, 0.784498, 0.0336475, 0, 0.651445, 0.777125, 0.0316666, 0, 0.671845, 0.769365, 0.0298122, 0, 0.692628, 0.761579, 0.0281001, 0, 0.713827, 0.753746, 0.0265049, 0, 0.735484, 0.745573, 0.0250067, 0, 0.75765, 0.737083, 0.0236026, 0, 0.78039, 0.728545, 0.0223302, 0, 0.803789, 0.719691, 0.0211243, 0, 0.82796, 0.710569, 0.0199983, 0, 0.853056, 0.701216, 0.0189569, 0, 0.879298, 0.692094, 0.0179702, 0, 0.907014, 0.682909, 0.0170418, 0, 0.936691, 0.673509, 0.0161732, 0, 0.968254, 0.663863, 0.0153406, 0, 1, 1, 0.437395, 0, 0, 0.999998, 0.437394, 0, 0, 0.99998, 0.437363, 0, 0.000616704, 0.999891, 0.437232, 0, 0.00367925, 0.999656, 0.436877, 0, 0.00867446, 0.999148, 0.436121, 0, 0.0150679, 0.997959, 0.434564, 0, 0.022531, 0.993464, 0.430134, 0, 0.0308507, 0.990606, 0.426077, 0, 0.0398805, 0.985027, 0.419397, 0, 0.0495148, 0.978491, 0.41118, 0, 0.0596749, 0.969643, 0.40048, 0, 0.0703001, 0.959189, 0.38769, 0, 0.0813427, 0.948223, 0.373575, 0, 0.0927641, 0.935955, 0.357622, 0, 0.104533, 0.923237, 0.34043, 0, 0.116624, 0.911074, 0.322735, 0, 0.129015, 0.899724, 0.30479, 0, 0.141687, 0.890189, 0.287392, 0, 0.154626, 0.881796, 0.270248, 0, 0.167818, 0.874781, 0.253659, 0, 0.181252, 0.869166, 0.237786, 0, 0.194918, 0.864725, 0.222618, 0, 0.208807, 0.861565, 0.208356, 0, 0.222913, 0.859284, 0.194867, 0, 0.237229, 0.857677, 0.18212, 0, 0.25175, 0.856714, 0.17018, 0, 0.266473, 0.856155, 0.158969, 0, 0.281392, 0.8558, 0.148413, 0, 0.296505, 0.855672, 0.138578, 0, 0.311811, 0.855538, 0.129345, 0, 0.327306, 0.855689, 0.120861, 0, 0.342991, 0.855767, 0.112969, 0, 0.358864, 0.855618, 0.105593, 0, 0.374925, 0.85525, 0.0987451, 0, 0.391176, 0.854583, 0.0923727, 0, 0.407616, 0.853534, 0.0864143, 0, 0.424249, 0.852061, 0.0808338, 0, 0.441076, 0.850253, 0.0756771, 0, 0.4581, 0.848004, 0.0708612, 0, 0.475324, 0.845333, 0.0663784, 0, 0.492754, 0.842376, 0.0622631, 0, 0.510394, 0.838956, 0.0584112, 0, 0.528251, 0.835121, 0.0548328, 0, 0.546331, 0.830842, 0.0514838, 0, 0.564644, 0.826212, 0.048355, 0, 0.583198, 0.821522, 0.0454714, 0, 0.602005, 0.816551, 0.0428263, 0, 0.621078, 0.811211, 0.0403612, 0, 0.640434, 0.805479, 0.038039, 0, 0.660089, 0.799409, 0.0358739, 0, 0.680066, 0.79306, 0.0338727, 0, 0.70039, 0.786395, 0.0319985, 0, 0.721094, 0.779416, 0.030241, 0, 0.742215, 0.77214, 0.0285951, 0, 0.7638, 0.764636, 0.0270747, 0, 0.785912, 0.756836, 0.0256354, 0, 0.808628, 0.749315, 0.0243027, 0, 0.832055, 0.741561, 0.0230497, 0, 0.856338, 0.733589, 0.0218801, 0, 0.88169, 0.725479, 0.020784, 0, 0.908441, 0.717255, 0.0197702, 0, 0.937125, 0.708829, 0.0188168, 0, 0.968254, 0.700191, 0.0179113, 0, 1, 1, 0.518937, 0, 0, 0.999998, 0.518933, 0, 0, 0.999967, 0.518883, 0, 0.00147741, 0.999832, 0.51866, 0, 0.00573221, 0.999466, 0.518057, 0, 0.011826, 0.998644, 0.516752, 0, 0.0192116, 0.994458, 0.512347, 0, 0.027573, 0.991223, 0.507675, 0, 0.0367099, 0.985515, 0.500188, 0, 0.046487, 0.978308, 0.490408, 0, 0.0568071, 0.968359, 0.477357, 0, 0.0675984, 0.95682, 0.461752, 0, 0.0788059, 0.943929, 0.443796, 0, 0.090386, 0.930224, 0.423893, 0, 0.102304, 0.916514, 0.402682, 0, 0.114532, 0.903653, 0.380914, 0, 0.127047, 0.892315, 0.359212, 0, 0.139828, 0.882942, 0.338102, 0, 0.152861, 0.875438, 0.31773, 0, 0.16613, 0.869642, 0.298186, 0, 0.179624, 0.865304, 0.279491, 0, 0.193332, 0.862382, 0.261804, 0, 0.207247, 0.860666, 0.245146, 0, 0.22136, 0.859788, 0.229406, 0, 0.235666, 0.859608, 0.214605, 0, 0.250158, 0.859912, 0.200691, 0, 0.264832, 0.86053, 0.187623, 0, 0.279684, 0.861368, 0.17539, 0, 0.294711, 0.862237, 0.163901, 0, 0.309911, 0.863127, 0.153175, 0, 0.32528, 0.863923, 0.143147, 0, 0.340819, 0.864567, 0.133781, 0, 0.356524, 0.865013, 0.125042, 0, 0.372397, 0.86539, 0.116952, 0, 0.388438, 0.865591, 0.109476, 0, 0.404645, 0.865517, 0.102542, 0, 0.421022, 0.865084, 0.0960688, 0, 0.437569, 0.864309, 0.0900499, 0, 0.454287, 0.863151, 0.0844328, 0, 0.471181, 0.861649, 0.0792218, 0, 0.488253, 0.859742, 0.0743482, 0, 0.505507, 0.857446, 0.0697963, 0, 0.522947, 0.854757, 0.0655364, 0, 0.54058, 0.851783, 0.061608, 0, 0.558412, 0.848516, 0.0579701, 0, 0.576449, 0.844897, 0.0545742, 0, 0.594701, 0.840956, 0.0514167, 0, 0.613178, 0.836676, 0.0484598, 0, 0.631892, 0.832075, 0.0456934, 0, 0.650856, 0.827191, 0.0431178, 0, 0.670088, 0.822295, 0.0407718, 0, 0.689606, 0.817294, 0.0386032, 0, 0.709434, 0.812013, 0.0365675, 0, 0.7296, 0.806465, 0.0346547, 0, 0.750138, 0.800691, 0.0328717, 0, 0.771093, 0.794709, 0.031211, 0, 0.792519, 0.788493, 0.0296504, 0, 0.814488, 0.782049, 0.0281782, 0, 0.837097, 0.775403, 0.0267965, 0, 0.860481, 0.76857, 0.0255002, 0, 0.884842, 0.761536, 0.0242759, 0, 0.910494, 0.754303, 0.0231142, 0, 0.937985, 0.74692, 0.0220305, 0, 0.968254, 0.739745, 0.0210192, 0, 1, 1, 0.613914, 0, 0, 0.999996, 0.613907, 0, 9.63597e-05, 0.999942, 0.613814, 0, 0.00301247, 0.999704, 0.613407, 0, 0.00870385, 0.999046, 0.612302, 0, 0.0160714, 0.995516, 0.608266, 0, 0.0245899, 0.991726, 0.602863, 0, 0.0339681, 0.985157, 0.593956, 0, 0.0440254, 0.97642, 0.581748, 0, 0.0546409, 0.964404, 0.565183, 0, 0.0657284, 0.950601, 0.545273, 0, 0.0772246, 0.935158, 0.522129, 0, 0.0890812, 0.919364, 0.496782, 0, 0.10126, 0.904754, 0.470571, 0, 0.113731, 0.89176, 0.444037, 0, 0.126469, 0.881492, 0.418322, 0, 0.139454, 0.873656, 0.393522, 0, 0.15267, 0.868053, 0.369795, 0, 0.166101, 0.864336, 0.347171, 0, 0.179736, 0.862259, 0.325737, 0, 0.193565, 0.861556, 0.305532, 0, 0.207578, 0.861776, 0.286416, 0, 0.221769, 0.862661, 0.268355, 0, 0.23613, 0.864015, 0.251334, 0, 0.250656, 0.865711, 0.235352, 0, 0.265343, 0.867519, 0.220302, 0, 0.280187, 0.869351, 0.206161, 0, 0.295183, 0.871144, 0.192908, 0, 0.31033, 0.872839, 0.180505, 0, 0.325624, 0.874307, 0.168848, 0, 0.341065, 0.875667, 0.158021, 0, 0.35665, 0.876758, 0.147877, 0, 0.37238, 0.87764, 0.138441, 0, 0.388253, 0.878237, 0.129627, 0, 0.404269, 0.878563, 0.121415, 0, 0.42043, 0.878572, 0.113741, 0, 0.436735, 0.87842, 0.106652, 0, 0.453187, 0.878057, 0.100097, 0, 0.469786, 0.877413, 0.0940128, 0, 0.486536, 0.87646, 0.0883462, 0, 0.503439, 0.875233, 0.0830924, 0, 0.520498, 0.8737, 0.0781975, 0, 0.537717, 0.871873, 0.07364, 0, 0.555102, 0.86978, 0.0694103, 0, 0.572657, 0.867405, 0.0654696, 0, 0.59039, 0.864751, 0.0617914, 0, 0.608307, 0.861818, 0.0583491, 0, 0.626419, 0.858645, 0.0551443, 0, 0.644733, 0.855307, 0.0521894, 0, 0.663264, 0.851736, 0.0494334, 0, 0.682025, 0.847927, 0.0468504, 0, 0.701032, 0.843888, 0.0444261, 0, 0.720308, 0.839629, 0.0421497, 0, 0.739875, 0.835158, 0.0400082, 0, 0.759764, 0.830509, 0.0380076, 0, 0.780014, 0.825714, 0.0361488, 0, 0.800673, 0.820729, 0.0343956, 0, 0.821803, 0.815751, 0.0327781, 0, 0.843492, 0.810752, 0.031275, 0, 0.86586, 0.805587, 0.0298542, 0, 0.889087, 0.800317, 0.0285397, 0, 0.913466, 0.79489, 0.0272948, 0, 0.93952, 0.789314, 0.0261139, 0, 0.96835, 0.783593, 0.0249938, 0, 1, 1, 0.724258, 0, 0, 0.999992, 0.724243, 0, 0.000726889, 0.99987, 0.724044, 0, 0.00569574, 0.999336, 0.72317, 0, 0.0131702, 0.996271, 0.719432, 0, 0.0220738, 0.991159, 0.712576, 0, 0.0319405, 0.982465, 0.700927, 0, 0.0425202, 0.97049, 0.684297, 0, 0.0536599, 0.953973, 0.661244, 0, 0.065258, 0.935546, 0.633804, 0, 0.0772427, 0.916596, 0.603071, 0, 0.0895616, 0.899353, 0.57105, 0, 0.102175, 0.885216, 0.539206, 0, 0.11505, 0.875076, 0.508714, 0, 0.128164, 0.868334, 0.479571, 0, 0.141495, 0.864414, 0.451796, 0, 0.155026, 0.862678, 0.425328, 0, 0.168745, 0.862835, 0.400352, 0, 0.182639, 0.864067, 0.376532, 0, 0.196699, 0.866086, 0.35391, 0, 0.210915, 0.868557, 0.332424, 0, 0.225282, 0.871271, 0.312053, 0, 0.239792, 0.874058, 0.292764, 0, 0.25444, 0.8768, 0.27453, 0, 0.269223, 0.87939, 0.257297, 0, 0.284135, 0.8819, 0.24114, 0, 0.299174, 0.884187, 0.225934, 0, 0.314337, 0.886262, 0.211669, 0, 0.329622, 0.888119, 0.198311, 0, 0.345026, 0.889709, 0.185783, 0, 0.360549, 0.891054, 0.174063, 0, 0.376189, 0.892196, 0.163143, 0, 0.391946, 0.893101, 0.152952, 0, 0.407819, 0.893803, 0.143475, 0, 0.423808, 0.894277, 0.134647, 0, 0.439914, 0.894532, 0.126434, 0, 0.456137, 0.894576, 0.1188, 0, 0.472479, 0.894393, 0.111694, 0, 0.48894, 0.893976, 0.105069, 0, 0.505523, 0.893346, 0.0989077, 0, 0.52223, 0.892502, 0.0931724, 0, 0.539064, 0.891441, 0.0878276, 0, 0.556028, 0.890276, 0.082903, 0, 0.573125, 0.888972, 0.0783505, 0, 0.590361, 0.887469, 0.0741083, 0, 0.607741, 0.885785, 0.0701633, 0, 0.62527, 0.883914, 0.0664835, 0, 0.642957, 0.881872, 0.0630567, 0, 0.660809, 0.879651, 0.0598527, 0, 0.678836, 0.877267, 0.0568615, 0, 0.69705, 0.874717, 0.05406, 0, 0.715465, 0.872012, 0.0514378, 0, 0.734098, 0.869157, 0.0489805, 0, 0.752968, 0.866155, 0.0466727, 0, 0.772101, 0.863014, 0.0445056, 0, 0.791529, 0.859748, 0.0424733, 0, 0.81129, 0.856416, 0.0405957, 0, 0.831438, 0.852958, 0.0388273, 0, 0.852044, 0.849382, 0.0371619, 0, 0.87321, 0.845694, 0.0355959, 0, 0.89509, 0.841893, 0.0341155, 0, 0.917932, 0.837981, 0.0327141, 0, 0.942204, 0.833963, 0.0313856, 0, 0.968981, 0.829847, 0.0301275, 0, 1, 1, 0.85214, 0, 0, 0.999969, 0.852095, 0, 0.00279627, 0.999483, 0.851408, 0, 0.0107635, 0.994545, 0.84579, 0, 0.0206454, 0.986188, 0.835231, 0, 0.0315756, 0.969847, 0.814687, 0, 0.0432021, 0.945951, 0.783735, 0, 0.0553396, 0.91917, 0.746074, 0, 0.0678766, 0.895488, 0.706938, 0, 0.0807395, 0.878232, 0.669534, 0, 0.0938767, 0.868252, 0.635168, 0, 0.10725, 0.863873, 0.603069, 0, 0.120832, 0.863369, 0.572514, 0, 0.134598, 0.86545, 0.543169, 0, 0.148533, 0.868803, 0.514578, 0, 0.16262, 0.872794, 0.486762, 0, 0.176849, 0.87702, 0.459811, 0, 0.19121, 0.881054, 0.433654, 0, 0.205694, 0.884974, 0.408574, 0, 0.220294, 0.888587, 0.384525, 0, 0.235005, 0.891877, 0.36156, 0, 0.24982, 0.894793, 0.339661, 0, 0.264737, 0.89743, 0.318913, 0, 0.279751, 0.899796, 0.299302, 0, 0.294859, 0.901943, 0.280843, 0, 0.310058, 0.903858, 0.263481, 0, 0.325346, 0.905574, 0.247197, 0, 0.340721, 0.907069, 0.231915, 0, 0.356181, 0.908379, 0.217614, 0, 0.371725, 0.90952, 0.20425, 0, 0.387353, 0.910483, 0.191758, 0, 0.403063, 0.91128, 0.180092, 0, 0.418854, 0.911936, 0.169222, 0, 0.434727, 0.912454, 0.159098, 0, 0.450682, 0.912835, 0.149668, 0, 0.466718, 0.913078, 0.140884, 0, 0.482837, 0.913192, 0.132709, 0, 0.499038, 0.913175, 0.125095, 0, 0.515324, 0.91304, 0.118012, 0, 0.531695, 0.912781, 0.111417, 0, 0.548153, 0.91241, 0.105281, 0, 0.5647, 0.911924, 0.0995691, 0, 0.581338, 0.911331, 0.0942531, 0, 0.59807, 0.910637, 0.0893076, 0, 0.6149, 0.90984, 0.0846998, 0, 0.63183, 0.908941, 0.0804044, 0, 0.648865, 0.907944, 0.0763984, 0, 0.666011, 0.906857, 0.0726638, 0, 0.683273, 0.90568, 0.0691783, 0, 0.700659, 0.904416, 0.0659222, 0, 0.718176, 0.903067, 0.0628782, 0, 0.735834, 0.901637, 0.0600307, 0, 0.753646, 0.900128, 0.0573647, 0, 0.771625, 0.898544, 0.0548668, 0, 0.78979, 0.89689, 0.052527, 0, 0.808162, 0.895165, 0.0503306, 0, 0.826771, 0.893371, 0.0482668, 0, 0.845654, 0.891572, 0.0463605, 0, 0.864863, 0.889763, 0.0445998, 0, 0.884472, 0.887894, 0.0429451, 0, 0.904592, 0.885967, 0.0413884, 0, 0.925407, 0.883984, 0.0399225, 0, 0.947271, 0.881945, 0.0385405, 0, 0.97105, 0.879854, 0.0372362, 0, 1, 0.999804, 0.995833, 0, 0, 0.938155, 0.933611, 0, 0.0158731, 0.864755, 0.854311, 0, 0.0317461, 0.888594, 0.865264, 0, 0.0476191, 0.905575, 0.863922, 0, 0.0634921, 0.915125, 0.850558, 0, 0.0793651, 0.920665, 0.829254, 0, 0.0952381, 0.924073, 0.802578, 0, 0.111111, 0.926304, 0.772211, 0, 0.126984, 0.927829, 0.739366, 0, 0.142857, 0.928924, 0.705033, 0, 0.15873, 0.92973, 0.670019, 0, 0.174603, 0.930339, 0.634993, 0, 0.190476, 0.930811, 0.600485, 0, 0.206349, 0.931191, 0.566897, 0, 0.222222, 0.93149, 0.534485, 0, 0.238095, 0.931737, 0.503429, 0, 0.253968, 0.931939, 0.473811, 0, 0.269841, 0.932108, 0.445668, 0, 0.285714, 0.93225, 0.418993, 0, 0.301587, 0.932371, 0.393762, 0, 0.31746, 0.932474, 0.369939, 0, 0.333333, 0.932562, 0.347479, 0, 0.349206, 0.932638, 0.326336, 0, 0.365079, 0.932703, 0.306462, 0, 0.380952, 0.93276, 0.287805, 0, 0.396825, 0.932809, 0.270313, 0, 0.412698, 0.932851, 0.253933, 0, 0.428571, 0.932887, 0.23861, 0, 0.444444, 0.932917, 0.224289, 0, 0.460317, 0.932943, 0.210917, 0, 0.47619, 0.932965, 0.19844, 0, 0.492063, 0.932982, 0.186807, 0, 0.507937, 0.932995, 0.175966, 0, 0.52381, 0.933005, 0.165869, 0, 0.539683, 0.933011, 0.156468, 0, 0.555556, 0.933013, 0.147719, 0, 0.571429, 0.933013, 0.139579, 0, 0.587302, 0.93301, 0.132007, 0, 0.603175, 0.933004, 0.124965, 0, 0.619048, 0.932994, 0.118416, 0, 0.634921, 0.932982, 0.112326, 0, 0.650794, 0.932968, 0.106663, 0, 0.666667, 0.93295, 0.101397, 0, 0.68254, 0.932931, 0.0964993, 0, 0.698413, 0.932908, 0.0919438, 0, 0.714286, 0.932883, 0.0877057, 0, 0.730159, 0.932856, 0.0837623, 0, 0.746032, 0.932827, 0.0800921, 0, 0.761905, 0.932796, 0.0766754, 0, 0.777778, 0.932762, 0.0734936, 0, 0.793651, 0.932727, 0.0705296, 0, 0.809524, 0.932689, 0.0677676, 0, 0.825397, 0.93265, 0.0651929, 0, 0.84127, 0.932609, 0.0627917, 0, 0.857143, 0.932565, 0.0605515, 0, 0.873016, 0.932521, 0.0584606, 0, 0.888889, 0.932474, 0.0565082, 0, 0.904762, 0.932427, 0.0546841, 0, 0.920635, 0.932377, 0.0529793, 0, 0.936508, 0.932326, 0.0513851, 0, 0.952381, 0.932274, 0.0498936, 0, 0.968254, 0.93222, 0.0484975, 0, 0.984127, 0.932164, 0.0471899, 0, 1]; const ltc_float_2 = new Float32Array(LTC_MAT_2); return RectAreaLightLTC._createTexture(ltc_float_2); } static _createTexture(data) { const texture = new Texture2D(); texture.image = { data, width: 64, height: 64 }; texture.internalformat = PIXEL_FORMAT.RGBA32F; texture.type = PIXEL_TYPE.FLOAT; texture.wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE; texture.wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE; texture.minFilter = TEXTURE_FILTER.NEAREST; texture.generateMipmaps = false; texture.flipY = false; texture.version++; return texture; } } export { RectAreaLightLTC }; ================================================ FILE: examples/jsm/loaders/AssimpJsonLoader.js ================================================ import { AnimationAction, AnimationMixer, Attribute, Bone, Buffer, FileLoader, Geometry, KeyframeClip, Matrix4, Mesh, Object3D, PhongMaterial, QuaternionKeyframeTrack, Skeleton, SkinnedMesh, VectorKeyframeTrack, TEXTURE_WRAP } from 't3d'; import { Texture2DLoader } from '../loaders/Texture2DLoader.js'; /** * AssimpJsonLoader * @class * * Loader for models imported with Open Asset Import Library (http://assimp.sf.net) * through assimp2json (https://github.com/acgessler/assimp2json). * * Supports any input format that assimp supports, including 3ds, obj, dae, blend, * fbx, x, ms3d, lwo (and many more). */ class AssimpJsonLoader { constructor() { this.texturePath = './'; this.textureLoader = new Texture2DLoader(); } load(url, onLoad, onProgress, onError) { this.texturePath = this.extractUrlBase(url); const loader = new FileLoader(); loader.setResponseType('json').load(url, json => { const result = this.parse(json); onLoad(result.object, result.animation); }, onProgress, onError); } parse(json) { const nodeTree = this.parseNodeTree(json.rootnode); const meshes = this.parseList(json.meshes, this.parseMesh); const materials = this.parseList(json.materials, this.parseMaterial); const boneMap = {}; const skeletons = {}; for (let i = 0; i < json.meshes.length; i++) { if (json.meshes[i].bones) { skeletons[i] = this.parseSkeleton(json.meshes[i].name, json.meshes[i].bones, nodeTree, boneMap); } } let animation; if (json.animations) { animation = this.parseAnimations(json.animations, boneMap); } return { object: this.parseObject(json, json.rootnode, meshes, materials, skeletons), animation: animation }; } parseNodeTree(node) { const object = new Object3D(); object.name = node.name; // save local matrix object.matrix.fromArray(node.transformation).transpose(); if (node.children) { for (let i = 0; i < node.children.length; i++) { const child = this.parseNodeTree(node.children[i]); object.add(child); } } return object; } parseList(json, handler) { const arrays = new Array(json.length); for (let i = 0; i < json.length; i++) { arrays[i] = handler.call(this, json[i]); } return arrays; } parseSkeleton(meshName, bonesInfo, nodeTree, boneMap) { const meshParents = []; let mesh = nodeTree.getObjectByName(meshName); while (mesh.parent) { meshParents.push(mesh.parent.name); mesh = mesh.parent; } meshParents.push(mesh); // mark all of its parents as root until 1) find the mesh's node or 2) the parent of the mesh's node function getRoot(name) { let node = nodeTree.getObjectByName(name); let parent; while (node.parent) { parent = node.parent; if (meshParents.indexOf(parent.name) > -1) { break; } else { node = parent; } } return node.name; } const allbones = []; const boneInverses = []; const rootBones = []; let rootNode = nodeTree.getObjectByName(getRoot(bonesInfo[0].name)); let rootBone = this.cloneNodeToBones(rootNode, boneMap); rootBones.push(rootBone); for (let i = 0; i < bonesInfo.length; i++) { const boneInfo = bonesInfo[i]; // get bone & push let bone = rootBone.getObjectByName(boneInfo.name); if (!bone) { rootNode = nodeTree.getObjectByName(boneInfo.name); rootBone = this.cloneNodeToBones(rootNode, boneMap); rootBones.push(rootBone); bone = rootBone.getObjectByName(boneInfo.name); } const offset = new Matrix4(); offset.fromArray(bonesInfo[i].offsetmatrix).transpose(); boneInverses.push(offset); allbones.push(bone); } return { skeleton: new Skeleton(allbones, boneInverses), rootBones: rootBones }; } cloneNodeToBones(node, boneMap) { const bone = new Bone(); bone.name = node.name; bone.matrix.copy(node.matrix); bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); if (!boneMap[node.name]) { boneMap[node.name] = []; } boneMap[node.name].push(bone); if (node.children) { for (let i = 0; i < node.children.length; i++) { const child = this.cloneNodeToBones(node.children[i], boneMap); bone.add(child); } } return bone; } parseAnimations(json, boneMap) { const animation = new AnimationMixer(); for (let i = 0; i < json.length; i++) { const anim = json[i]; const name = anim.name; const channels = anim.channels; const tracks = []; let duration = 0; for (let j = 0; j < channels.length; j++) { const channel = channels[j]; const boneName = channel.name; if (!boneMap[boneName]) { console.log(boneName); continue; } for (let n = 0; n < boneMap[boneName].length; n++) { const bone = boneMap[boneName][n]; const times_p = [], values_p = []; for (let k = 0; k < channel.positionkeys.length; k++) { const frame = channel.positionkeys[k]; times_p.push(frame[0]); values_p.push(frame[1][0], frame[1][1], frame[1][2]); if (frame[0] > duration) { duration = frame[0]; } } const positionTrack = new VectorKeyframeTrack(bone, 'position', times_p, values_p); tracks.push(positionTrack); const times_r = [], values_r = []; for (let k = 0; k < channel.rotationkeys.length; k++) { const frame = channel.rotationkeys[k]; times_r.push(frame[0]); values_r.push(frame[1][1], frame[1][2], frame[1][3], frame[1][0]); if (frame[0] > duration) { duration = frame[0]; } } const rotationTrack = new QuaternionKeyframeTrack(bone, 'quaternion', times_r, values_r); tracks.push(rotationTrack); const times_s = [], values_s = []; for (let k = 0; k < channel.scalingkeys.length; k++) { const frame = channel.scalingkeys[k]; times_s.push(frame[0]); values_s.push(frame[1][0], frame[1][1], frame[1][2]); if (frame[0] > duration) { duration = frame[0]; } } const scalingTrack = new VectorKeyframeTrack(bone, 'scale', times_s, values_s); tracks.push(scalingTrack); } } const clip = new KeyframeClip(name, tracks, duration); const action = new AnimationAction(clip); animation.addAction(action); } return animation; } parseObject(json, node, meshes, materials, skeletons) { const group = new Object3D(); group.name = node.name || ''; group.matrix.fromArray(node.transformation).transpose(); group.matrix.decompose(group.position, group.quaternion, group.scale); for (let i = 0, mesh; node.meshes && i < node.meshes.length; i++) { const idx = node.meshes[i]; const material = materials[json.meshes[idx].materialindex]; if (skeletons[idx]) { mesh = new SkinnedMesh(meshes[idx], material); const rootBones = skeletons[idx].rootBones; for (let j = 0, l = rootBones.length; j < l; j++) { group.add(rootBones[j]); } mesh.bind(skeletons[idx].skeleton, mesh.worldMatrix); } else { mesh = new Mesh(meshes[idx], material); } mesh.frustumCulled = false; group.add(mesh); } for (let i = 0; node.children && i < node.children.length; i++) { group.add(this.parseObject(json, node.children[i], meshes, materials, skeletons)); } return group; } parseMaterial(json) { const material = new PhongMaterial(); let diffuseMap = null; let normalMap = null; let prop; for (const key in json.properties) { prop = json.properties[key]; if (prop.key === '$tex.file') { // prop.semantic gives the type of the texture // 1: diffuse // 2: specular map // 3: ambient map // 4: emissive map // 5: height map (bumps) // 6: normal map // 7: shininess(glow) map // 8: opacity map // 9: displacement map // 10: light map // 11: reflection map // 12: unknown map if (prop.semantic == 1) { let material_url = this.texturePath + prop.value; material_url = material_url.replace(/.\\/g, ''); diffuseMap = this.textureLoader.load(material_url); // TODO: read texture settings from assimp. // Wrapping is the default, though. diffuseMap.wrapS = diffuseMap.wrapT = TEXTURE_WRAP.REPEAT; } else if (prop.semantic == 2) { // TODO } else if (prop.semantic == 5) { // TODO } else if (prop.semantic == 6) { let material_url = this.texturePath + prop.value; material_url = material_url.replace(/.\\/g, ''); normalMap = this.textureLoader.load(material_url); // TODO: read texture settings from assimp. // Wrapping is the default, though. normalMap.wrapS = normalMap.wrapT = TEXTURE_WRAP.REPEAT; } } else if (prop.key === '?mat.name') { // TODO } else if (prop.key === '$clr.ambient') { // TODO } else if (prop.key === '$clr.diffuse') { material.diffuse.fromArray(prop.value); } else if (prop.key === '$clr.specular') { material.specular.fromArray(prop.value); } else if (prop.key === '$clr.emissive') { material.emissive.fromArray(prop.value); } else if (prop.key === '$mat.opacity') { material.transparent = prop.value < 1; material.opacity = prop.value; } else if (prop.key === '$mat.shadingm') { // Flat shading? if (prop.value === 1) { // TODO } } else if (prop.key === '$mat.shininess') { material.shininess = prop.value; } } material.diffuseMap = diffuseMap; material.normalMap = normalMap; return material; } parseMesh(json) { const geometry = new Geometry(); const faces = json.faces; const vertices = json.vertices; const normals = json.normals; const texturecoords = json.texturecoords && json.texturecoords[0]; const verticesCount = vertices.length / 3; const g_v = []; // bones const bones = json.bones; const bind = []; if (bones) { for (let i = 0; i < verticesCount; i++) { bind[i] = []; } let bone, weights, weight; for (let i = 0; i < bones.length; i++) { bone = bones[i]; weights = bone.weights; for (let j = 0; j < weights.length; j++) { weight = weights[j]; bind[weight[0]].push({ index: i, weight: weight[1] }); } } // every vertex bind 4 bones for (let i = 0; i < verticesCount; i++) { const ver = bind[i]; ver.sort(function(a, b) { return b.weight - a.weight; }); // identify let w1 = ver[0] ? ver[0].weight : 0; let w2 = ver[1] ? ver[1].weight : 0; let w3 = ver[2] ? ver[2].weight : 0; let w4 = ver[3] ? ver[3].weight : 0; const sum = w1 + w2 + w3 + w4; if (sum > 0) { w1 = w1 / sum; w2 = w2 / sum; w3 = w3 / sum; w4 = w4 / sum; } ver[0] && (ver[0].weight = w1); ver[1] && (ver[1].weight = w2); ver[2] && (ver[2].weight = w3); ver[3] && (ver[3].weight = w4); } } for (let i = 0; i < verticesCount; i++) { g_v.push(vertices[i * 3 + 0]); g_v.push(vertices[i * 3 + 1]); g_v.push(vertices[i * 3 + 2]); g_v.push(normals[i * 3 + 0]); g_v.push(normals[i * 3 + 1]); g_v.push(normals[i * 3 + 2]); g_v.push(0); g_v.push(0); g_v.push(0); if (bones) { const ver = bind[i]; // bones index for (let k = 0; k < 4; k++) { if (ver[k]) { g_v.push(ver[k].index); } else { g_v.push(0); } } } else { // v color g_v.push(1); g_v.push(1); g_v.push(1); g_v.push(1); } // uv1 if (texturecoords) { g_v.push(texturecoords[i * 2 + 0]); g_v.push(texturecoords[i * 2 + 1]); } else { g_v.push(0); g_v.push(0); } if (bones) { // bones weight const ver = bind[i]; // bones index for (let k = 0; k < 4; k++) { if (ver[k]) { g_v.push(ver[k].weight); } else { g_v.push(0); } } } else { // uv2 g_v.push(0); g_v.push(0); } } if (bones) { const buffer = new Buffer(new Float32Array(g_v), 19); let attribute; attribute = new Attribute(buffer, 3, 0); geometry.addAttribute('a_Position', attribute); attribute = new Attribute(buffer, 3, 3); geometry.addAttribute('a_Normal', attribute); attribute = new Attribute(buffer, 4, 9); geometry.addAttribute('skinIndex', attribute); attribute = new Attribute(buffer, 4, 15); geometry.addAttribute('skinWeight', attribute); attribute = new Attribute(buffer, 2, 13); geometry.addAttribute('a_Uv', attribute); } else { const buffer = new Buffer(new Float32Array(g_v), 17); let attribute; attribute = new Attribute(buffer, 3, 0); geometry.addAttribute('a_Position', attribute); attribute = new Attribute(buffer, 3, 3); geometry.addAttribute('a_Normal', attribute); attribute = new Attribute(buffer, 4, 9); geometry.addAttribute('a_Color', attribute); attribute = new Attribute(buffer, 2, 13); geometry.addAttribute('a_Uv', attribute); } const g_i = []; for (let i = 0; i < faces.length; i++) { g_i.push(faces[i][0]); g_i.push(faces[i][1]); g_i.push(faces[i][2]); } geometry.setIndex(g_i); geometry.computeBoundingBox(); geometry.computeBoundingSphere(); return geometry; } extractUrlBase(url) { const parts = url.split('/'); parts.pop(); return (parts.length < 1 ? '.' : parts.join('/')) + '/'; } } export { AssimpJsonLoader }; ================================================ FILE: examples/jsm/loaders/DDSLoader.js ================================================ import { Loader, FileLoader, PIXEL_FORMAT, TextureCube, Texture2D, TEXTURE_FILTER } from 't3d'; class DDSLoader extends Loader { load(url, onLoad, onProgress, onError) { new FileLoader(this.manager) .setResponseType('arraybuffer') .setRequestHeader(this.requestHeader) .setPath(this.path) .setWithCredentials(this.withCredentials) .load(url, buffer => { onLoad && onLoad(this.parse(buffer, true)); }, onProgress, onError); } parse(buffer, loadMipmaps) { const dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1, isCubemap: false }; // Adapted from @toji's DDS utils // https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js // All values and structures referenced from: // http://msdn.microsoft.com/en-us/library/bb943991.aspx/ const DDS_MAGIC = 0x20534444; // const DDSD_CAPS = 0x1; // const DDSD_HEIGHT = 0x2; // const DDSD_WIDTH = 0x4; // const DDSD_PITCH = 0x8; // const DDSD_PIXELFORMAT = 0x1000; const DDSD_MIPMAPCOUNT = 0x20000; // const DDSD_LINEARSIZE = 0x80000; // const DDSD_DEPTH = 0x800000; // const DDSCAPS_COMPLEX = 0x8; // const DDSCAPS_MIPMAP = 0x400000; // const DDSCAPS_TEXTURE = 0x1000; const DDSCAPS2_CUBEMAP = 0x200; const DDSCAPS2_CUBEMAP_POSITIVEX = 0x400; const DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800; const DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000; const DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000; const DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000; const DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000; // const DDSCAPS2_VOLUME = 0x200000; // const DDPF_ALPHAPIXELS = 0x1; // const DDPF_ALPHA = 0x2; // const DDPF_FOURCC = 0x4; // const DDPF_RGB = 0x40; // const DDPF_YUV = 0x200; // const DDPF_LUMINANCE = 0x20000; // TODO: support DXGI formats // const DXGI_FORMAT_BC6H_UF16 = 95; // const DXGI_FORMAT_BC6H_SF16 = 96; function fourCCToInt32(value) { return value.charCodeAt(0) + (value.charCodeAt(1) << 8) + (value.charCodeAt(2) << 16) + (value.charCodeAt(3) << 24); } function int32ToFourCC(value) { return String.fromCharCode( value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >> 24) & 0xff ); } function loadARGBMip(buffer, dataOffset, width, height) { const dataLength = width * height * 4; const srcBuffer = new Uint8Array(buffer, dataOffset, dataLength); const byteArray = new Uint8Array(dataLength); let dst = 0; let src = 0; for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { const b = srcBuffer[src]; src++; const g = srcBuffer[src]; src++; const r = srcBuffer[src]; src++; const a = srcBuffer[src]; src++; byteArray[dst] = r; dst++; // r byteArray[dst] = g; dst++; // g byteArray[dst] = b; dst++; // b byteArray[dst] = a; dst++; // a } } return byteArray; } const FOURCC_DXT1 = fourCCToInt32('DXT1'); const FOURCC_DXT3 = fourCCToInt32('DXT3'); const FOURCC_DXT5 = fourCCToInt32('DXT5'); const FOURCC_ETC1 = fourCCToInt32('ETC1'); const headerLengthInt = 31; // The header length in 32 bit ints // Offsets into the header array const off_magic = 0; const off_size = 1; const off_flags = 2; const off_height = 3; const off_width = 4; const off_mipmapCount = 7; // const off_pfFlags = 20; const off_pfFourCC = 21; const off_RGBBitCount = 22; const off_RBitMask = 23; const off_GBitMask = 24; const off_BBitMask = 25; const off_ABitMask = 26; // const off_caps = 27; const off_caps2 = 28; // const off_caps3 = 29; // const off_caps4 = 30; // Parse header const header = new Int32Array(buffer, 0, headerLengthInt); if (header[off_magic] !== DDS_MAGIC) { console.error('DDSLoader.parse: Invalid magic number in DDS header.'); return dds; } let blockBytes; const fourCC = header[off_pfFourCC]; let isRGBAUncompressed = false; switch (fourCC) { case FOURCC_DXT1: blockBytes = 8; dds.format = PIXEL_FORMAT.RGB_S3TC_DXT1; break; case FOURCC_DXT3: blockBytes = 16; dds.format = PIXEL_FORMAT.RGBA_S3TC_DXT3; break; case FOURCC_DXT5: blockBytes = 16; dds.format = PIXEL_FORMAT.RGBA_S3TC_DXT5; break; case FOURCC_ETC1: blockBytes = 8; dds.format = PIXEL_FORMAT.RGB_ETC1; break; default: if (header[off_RGBBitCount] === 32 && header[off_RBitMask] & 0xff0000 && header[off_GBitMask] & 0xff00 && header[off_BBitMask] & 0xff && header[off_ABitMask] & 0xff000000) { isRGBAUncompressed = true; blockBytes = 64; dds.format = PIXEL_FORMAT.RGBA; } else { console.error('DDSLoader.parse: Unsupported FourCC code ', int32ToFourCC(fourCC)); return dds; } } dds.mipmapCount = 1; if (header[off_flags] & DDSD_MIPMAPCOUNT && loadMipmaps !== false) { dds.mipmapCount = Math.max(1, header[off_mipmapCount]); } const caps2 = header[off_caps2]; dds.isCubemap = caps2 & DDSCAPS2_CUBEMAP ? true : false; if (dds.isCubemap && ( !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) || !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) || !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) || !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) || !(caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) || !(caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) )) { console.error('DDSLoader.parse: Incomplete cubemap faces'); return dds; } dds.width = header[off_width]; dds.height = header[off_height]; let dataOffset = header[off_size] + 4; // Extract mipmaps buffers const faces = dds.isCubemap ? 6 : 1; for (let face = 0; face < faces; face++) { let width = dds.width; let height = dds.height; for (let i = 0; i < dds.mipmapCount; i++) { let byteArray, dataLength; if (isRGBAUncompressed) { byteArray = loadARGBMip(buffer, dataOffset, width, height); dataLength = byteArray.length; } else { dataLength = Math.max(4, width) / 4 * Math.max(4, height) / 4 * blockBytes; byteArray = new Uint8Array(buffer, dataOffset, dataLength); } const mipmap = { 'data': byteArray, 'width': width, 'height': height }; dds.mipmaps.push(mipmap); dataOffset += dataLength; width = Math.max(width >> 1, 1); height = Math.max(height >> 1, 1); } } return dds; } } class DDSTextureLoader extends DDSLoader { load(url, onLoad, onProgress, onError) { super.load(url, textureData => { const { mipmaps, width, height, format, mipmapCount, isCubemap } = textureData; let texture; if (isCubemap) { texture = new TextureCube(); const faces = mipmaps.length / mipmapCount; for (let f = 0; f < faces; f++) { texture.images[f] = { data: mipmaps[f * mipmapCount], width, height, isCompressed: format !== PIXEL_FORMAT.RGBA }; } for (let i = 0; i < mipmapCount; i++) { texture.mipmaps[i] = []; for (let f = 0; f < faces; f++) { texture.mipmaps[i].push(mipmaps[f * mipmapCount + i]); } } } else { texture = new Texture2D(); texture.image = { data: mipmaps[0].data, width, height, isCompressed: format !== PIXEL_FORMAT.RGBA }; texture.mipmaps = mipmaps; } texture.minFilter = mipmapCount === 1 ? TEXTURE_FILTER.LINEAR : TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; texture.magFilter = TEXTURE_FILTER.LINEAR; texture.format = format; // no flipping for cube textures // (also flipping doesn't work for compressed textures ) texture.flipY = false; // can't generate mipmaps for compressed textures // mips must be embedded in DDS files texture.generateMipmaps = false; texture.version++; onLoad && onLoad(texture); }, onProgress, onError); } } export { DDSLoader, DDSTextureLoader }; ================================================ FILE: examples/jsm/loaders/DRACOLoader.js ================================================ import { Attribute, Geometry, Buffer, FileLoader, Loader, Color3 } from 't3d'; const _taskCache = new WeakMap(); const SRGBColorSpace = 'srgb'; const LinearSRGBColorSpace = 'srgb-linear'; class DRACOLoader extends Loader { constructor(manager) { super(manager); this.decoderPath = ''; this.decoderConfig = {}; this.decoderBinary = null; this.decoderPending = null; this.workerLimit = 4; this.workerPool = []; this.workerNextTaskID = 1; this.workerSourceURL = ''; this.defaultAttributeIDs = { 'a_Position': 'POSITION', 'a_Normal': 'NORMAL', 'a_Color': 'COLOR', 'a_Uv': 'TEX_COORD' }; this.defaultAttributeTypes = { 'a_Position': 'Float32Array', 'a_Normal': 'Float32Array', 'a_Color': 'Float32Array', 'a_Uv': 'Float32Array' }; } setDecoderPath(path) { this.decoderPath = path; return this; } setDecoderConfig(config) { this.decoderConfig = config; return this; } setWorkerLimit(workerLimit) { this.workerLimit = workerLimit; return this; } load(url, onLoad, onProgress, onError) { const loader = new FileLoader(this.manager); loader.setPath(this.path); loader.setResponseType('arraybuffer'); loader.setRequestHeader(this.requestHeader); loader.setWithCredentials(this.withCredentials); loader.load(url, buffer => { this.parse(buffer, onLoad, onError); }, onProgress, onError); } parse(buffer, onLoad, onError) { this.decodeDracoFile(buffer, onLoad, null, null, SRGBColorSpace).catch(onError); } decodeDracoFile(buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace) { const taskConfig = { attributeIDs: attributeIDs || this.defaultAttributeIDs, attributeTypes: attributeTypes || this.defaultAttributeTypes, useUniqueIDs: !!attributeIDs, vertexColorSpace: vertexColorSpace }; return this.decodeGeometry(buffer, taskConfig).then(callback); } decodeGeometry(buffer, taskConfig) { const taskKey = JSON.stringify(taskConfig); if (_taskCache.has(buffer)) { const cachedTask = _taskCache.get(buffer); if (cachedTask.key === taskKey) { return cachedTask.promise; } else if (buffer.byteLength === 0) { throw new Error( 'DRACOLoader: Unable to re-decode a buffer with different ' + 'settings. Buffer has already been transferred.' ); } } let worker; const taskID = this.workerNextTaskID++; const taskCost = buffer.byteLength; const geometryPending = this._getWorker(taskID, taskCost) .then(_worker => { worker = _worker; return new Promise((resolve, reject) => { worker._callbacks[taskID] = { resolve, reject }; worker.postMessage({ type: 'decode', id: taskID, taskConfig, buffer }, [buffer]); }); }) .then(message => this._createGeometry(message.geometry)); geometryPending .catch(() => true) .then(() => { if (worker && taskID) { this._releaseTask(worker, taskID); } }); _taskCache.set(buffer, { key: taskKey, promise: geometryPending }); return geometryPending; } _createGeometry(geometryData) { const geometry = new Geometry(); if (geometryData.index) { geometry.setIndex(new Attribute(new Buffer(geometryData.index.array, 1))); } for (let i = 0; i < geometryData.attributes.length; i++) { const result = geometryData.attributes[i]; const name = result.name; const array = result.array; const itemSize = result.itemSize; const attribute = new Attribute(new Buffer(array, itemSize)); if (name === 'a_color') { assignVertexColorSpace(attribute, result.vertexColorSpace); } geometry.addAttribute(name, attribute); } return geometry; } _loadLibrary(url, responseType) { const loader = new FileLoader(this.manager); loader.setPath(this.decoderPath || DRACOLoader.decoderPath); loader.setResponseType(responseType); loader.setWithCredentials(this.withCredentials); return new Promise((resolve, reject) => { loader.load(url, resolve, undefined, reject); }); } preload() { this._initDecoder(); return this; } _initDecoder() { if (this.decoderPending) return this.decoderPending; const config = this.decoderConfig || DRACOLoader.decoderConfig; const useJS = typeof WebAssembly !== 'object' || config.type === 'js'; const librariesPending = []; if (useJS) { librariesPending.push(this._loadLibrary('draco_decoder.js', 'text')); } else { librariesPending.push(this._loadLibrary('draco_wasm_wrapper.js', 'text')); librariesPending.push(this._loadLibrary('draco_decoder.wasm', 'arraybuffer')); } this.decoderPending = Promise.all(librariesPending) .then(libraries => { const jsContent = libraries[0]; if (!useJS) { config.wasmBinary = libraries[1]; } const fn = DRACOWorker.toString(); const body = [ '/* draco decoder */', jsContent, '', '/* worker */', fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}')) ].join('\n'); this.workerSourceURL = URL.createObjectURL(new Blob([body])); }); return this.decoderPending; } _getWorker(taskID, taskCost) { return this._initDecoder().then(() => { if (this.workerPool.length < this.workerLimit) { const worker = new Worker(this.workerSourceURL); worker._callbacks = {}; worker._taskCosts = {}; worker._taskLoad = 0; worker.postMessage({ type: 'init', decoderConfig: this.decoderConfig || DRACOLoader.decoderConfig }); worker.onmessage = function(e) { const message = e.data; switch (message.type) { case 'decode': worker._callbacks[message.id].resolve(message); break; case 'error': worker._callbacks[message.id].reject(message); break; default: console.error('DRACOLoader: Unexpected message, "' + message.type + '"'); } }; this.workerPool.push(worker); } else { this.workerPool.sort(function(a, b) { return a._taskLoad > b._taskLoad ? -1 : 1; }); } const worker = this.workerPool[this.workerPool.length - 1]; worker._taskCosts[taskID] = taskCost; worker._taskLoad += taskCost; return worker; }); } _releaseTask(worker, taskID) { worker._taskLoad -= worker._taskCosts[taskID]; delete worker._callbacks[taskID]; delete worker._taskCosts[taskID]; } debug() { console.log('Task load: ', this.workerPool.map(worker => worker._taskLoad)); } dispose() { for (let i = 0; i < this.workerPool.length; ++i) { this.workerPool[i].terminate(); } this.workerPool.length = 0; if (this.workerSourceURL !== '') { URL.revokeObjectURL(this.workerSourceURL); } return this; } } /* Deprecated */ DRACOLoader.decoderPath = './'; DRACOLoader.decoderConfig = {}; DRACOLoader.setDecoderPath = function(path) { console.warn('DRACOLoader.setDecoderPath has been deprecated, use new DRACOLoader().setDecoderPath instead.'); DRACOLoader.decoderPath = path; }; DRACOLoader.setDecoderConfig = function(config) { console.warn('DRACOLoader.setDecoderConfig has been deprecated, use new DRACOLoader().setDecoderConfig instead.'); const wasmBinary = DRACOLoader.decoderConfig.wasmBinary; DRACOLoader.decoderConfig = config || {}; if (wasmBinary) DRACOLoader.decoderConfig.wasmBinary = wasmBinary; // Reuse WASM binary. }; DRACOLoader.releaseDecoderModule = function() { console.warn('DRACOLoader.releaseDecoderModule has been removed.'); }; /* Helpers */ function assignVertexColorSpace(attribute, inputColorSpace) { if (inputColorSpace !== SRGBColorSpace) return; const _color = new Color3(); for (let i = 0, il = attribute.buffer.count; i < il; i++) { _color.fromArray( attribute.buffer.array, i * attribute.buffer.stride + attribute.offset, attribute.normalized ); _color.convertSRGBToLinear(); _color.toArray( attribute.buffer.array, i * attribute.buffer.stride + attribute.offset, attribute.normalized ); } } /* WEB WORKER */ function DRACOWorker() { let decoderConfig; let decoderPending; onmessage = function(e) { const message = e.data; switch (message.type) { case 'init': { decoderConfig = message.decoderConfig; decoderPending = new Promise(function(resolve/* , reject */) { decoderConfig.onModuleLoaded = function(draco) { resolve({ draco: draco }); }; // eslint-disable-next-line DracoDecoderModule(decoderConfig); }); break; } case 'decode': { const buffer = message.buffer; const taskConfig = message.taskConfig; decoderPending.then(module => { const draco = module.draco; const decoder = new draco.Decoder(); try { const geometry = decodeGeometry(draco, decoder, new Int8Array(buffer), taskConfig); const buffers = geometry.attributes.map(attr => attr.array.buffer); if (geometry.index) buffers.push(geometry.index.array.buffer); self.postMessage({ type: 'decode', id: message.id, geometry }, buffers); } catch (error) { console.error(error); self.postMessage({ type: 'error', id: message.id, error: error.message }); } finally { draco.destroy(decoder); } }); break; } } }; function decodeGeometry(draco, decoder, array, taskConfig) { const attributeIDs = taskConfig.attributeIDs; const attributeTypes = taskConfig.attributeTypes; let dracoGeometry; let decodingStatus; const geometryType = decoder.GetEncodedGeometryType(array); if (geometryType === draco.TRIANGULAR_MESH) { dracoGeometry = new draco.Mesh(); decodingStatus = decoder.DecodeArrayToMesh(array, array.byteLength, dracoGeometry); } else if (geometryType === draco.POINT_CLOUD) { dracoGeometry = new draco.PointCloud(); decodingStatus = decoder.DecodeArrayToPointCloud(array, array.byteLength, dracoGeometry); } else { throw new Error('DRACOLoader: Unexpected geometry type.'); } if (!decodingStatus.ok() || dracoGeometry.ptr === 0) { throw new Error('DRACOLoader: Decoding failed: ' + decodingStatus.error_msg()); } const geometry = { index: null, attributes: [] }; for (const attributeName in attributeIDs) { const attributeType = self[attributeTypes[attributeName]] || Float32Array; let attribute; let attributeID; if (taskConfig.useUniqueIDs) { attributeID = attributeIDs[attributeName]; attribute = decoder.GetAttributeByUniqueId(dracoGeometry, attributeID); } else { attributeID = decoder.GetAttributeId(dracoGeometry, draco[attributeIDs[attributeName]]); if (attributeID === -1) continue; attribute = decoder.GetAttribute(dracoGeometry, attributeID); } const attributeResult = decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute); if (attributeName === 'a_color') { attributeResult.vertexColorSpace = taskConfig.vertexColorSpace; } geometry.attributes.push(attributeResult); } if (geometryType === draco.TRIANGULAR_MESH) { geometry.index = decodeIndex(draco, decoder, dracoGeometry); } draco.destroy(dracoGeometry); return geometry; } function decodeIndex(draco, decoder, dracoGeometry) { const numFaces = dracoGeometry.num_faces(); const numIndices = numFaces * 3; const byteLength = numIndices * 4; const ptr = draco._malloc(byteLength); decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr); const index = new Uint32Array(draco.HEAPF32.buffer, ptr, numIndices).slice(); draco._free(ptr); return { array: index, itemSize: 1 }; } function decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute) { const numComponents = attribute.num_components(); const numPoints = dracoGeometry.num_points(); const numValues = numPoints * numComponents; const byteLength = numValues * attributeType.BYTES_PER_ELEMENT; const dataType = getDracoDataType(draco, attributeType); const ptr = draco._malloc(byteLength); decoder.GetAttributeDataArrayForAllPoints(dracoGeometry, attribute, dataType, byteLength, ptr); const array = new attributeType(draco.HEAPF32.buffer, ptr, numValues).slice(); // eslint-disable-line draco._free(ptr); return { name: attributeName, array: array, itemSize: numComponents }; } function getDracoDataType(draco, attributeType) { switch (attributeType) { case Float32Array: return draco.DT_FLOAT32; case Int8Array: return draco.DT_INT8; case Int16Array: return draco.DT_INT16; case Int32Array: return draco.DT_INT32; case Uint8Array: return draco.DT_UINT8; case Uint16Array: return draco.DT_UINT16; case Uint32Array: return draco.DT_UINT32; } } } export { DRACOLoader }; ================================================ FILE: examples/jsm/loaders/EXRLoader.js ================================================ import { Loader, FileLoader, PIXEL_TYPE, PIXEL_FORMAT, TEXTURE_FILTER, TEXEL_ENCODING_TYPE, Texture2D, MathUtils } from 't3d'; /** * OpenEXR loader currently supports uncompressed, ZIP(S), RLE, PIZ and DWA/B compression. * Supports reading as UnsignedByte, HalfFloat and Float type data texture. * * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita * implementation, so I have preserved their copyright notices. */ // /* // Copyright (c) 2014 - 2017, Syoyo Fujita // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of the Syoyo Fujita nor the // names of its contributors may be used to endorse or promote products // derived from this software without specific prior written permission. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // */ // // TinyEXR contains some OpenEXR code, which is licensed under ------------ // /////////////////////////////////////////////////////////////////////////// // // // // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas // // Digital Ltd. LLC // // // // All rights reserved. // // // // Redistribution and use in source and binary forms, with or without // // modification, are permitted provided that the following conditions are // // met: // // * Redistributions of source code must retain the above copyright // // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above // // copyright notice, this list of conditions and the following disclaimer // // in the documentation and/or other materials provided with the // // distribution. // // * Neither the name of Industrial Light & Magic nor the names of // // its contributors may be used to endorse or promote products derived // // from this software without specific prior written permission. // // // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // // /////////////////////////////////////////////////////////////////////////// // // End of OpenEXR license ------------------------------------------------- let _fflate; class EXRLoader extends Loader { constructor(manager) { super(manager); this.type = PIXEL_TYPE.HALF_FLOAT; } static setfflate(fflate) { _fflate = fflate; } load(url, onLoad, onProgress, onError) { new FileLoader(this.manager) .setResponseType('arraybuffer') .setRequestHeader(this.requestHeader) .setPath(this.path) .setWithCredentials(this.withCredentials) .load(url, buffer => { onLoad && onLoad(this.parse(buffer)); }, onProgress, onError); } parse(buffer) { const USHORT_RANGE = (1 << 16); const BITMAP_SIZE = (USHORT_RANGE >> 3); const HUF_ENCBITS = 16; // literal (value) bit length const HUF_DECBITS = 14; // decoding bit size (>= 8) const HUF_ENCSIZE = (1 << HUF_ENCBITS) + 1; // encoding table size const HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size const HUF_DECMASK = HUF_DECSIZE - 1; const NBITS = 16; const A_OFFSET = 1 << (NBITS - 1); const MOD_MASK = (1 << NBITS) - 1; const SHORT_ZEROCODE_RUN = 59; const LONG_ZEROCODE_RUN = 63; const SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN; const ULONG_SIZE = 8; const FLOAT32_SIZE = 4; const INT32_SIZE = 4; const INT16_SIZE = 2; const INT8_SIZE = 1; const STATIC_HUFFMAN = 0; const DEFLATE = 1; const UNKNOWN = 0; const LOSSY_DCT = 1; const RLE = 2; const logBase = Math.pow(2.7182818, 2.2); function reverseLutFromBitmap(bitmap, lut) { let k = 0; for (let i = 0; i < USHORT_RANGE; ++i) { if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) { lut[k++] = i; } } const n = k - 1; while (k < USHORT_RANGE) lut[k++] = 0; return n; } function hufClearDecTable(hdec) { for (let i = 0; i < HUF_DECSIZE; i++) { hdec[i] = {}; hdec[i].len = 0; hdec[i].lit = 0; hdec[i].p = null; } } const getBitsReturn = { l: 0, c: 0, lc: 0 }; function getBits(nBits, c, lc, uInt8Array, inOffset) { while (lc < nBits) { c = (c << 8) | parseUint8Array(uInt8Array, inOffset); lc += 8; } lc -= nBits; getBitsReturn.l = (c >> lc) & ((1 << nBits) - 1); getBitsReturn.c = c; getBitsReturn.lc = lc; } const hufTableBuffer = new Array(59); function hufCanonicalCodeTable(hcode) { for (let i = 0; i <= 58; ++i) hufTableBuffer[i] = 0; for (let i = 0; i < HUF_ENCSIZE; ++i) hufTableBuffer[hcode[i]] += 1; let c = 0; for (let i = 58; i > 0; --i) { const nc = ((c + hufTableBuffer[i]) >> 1); hufTableBuffer[i] = c; c = nc; } for (let i = 0; i < HUF_ENCSIZE; ++i) { const l = hcode[i]; if (l > 0) hcode[i] = l | (hufTableBuffer[l]++ << 6); } } function hufUnpackEncTable(uInt8Array, inOffset, ni, im, iM, hcode) { const p = inOffset; let c = 0; let lc = 0; for (; im <= iM; im++) { if (p.value - inOffset.value > ni) return false; getBits(6, c, lc, uInt8Array, p); const l = getBitsReturn.l; c = getBitsReturn.c; lc = getBitsReturn.lc; hcode[im] = l; if (l == LONG_ZEROCODE_RUN) { if (p.value - inOffset.value > ni) { throw new Error('Something wrong with hufUnpackEncTable'); } getBits(8, c, lc, uInt8Array, p); let zerun = getBitsReturn.l + SHORTEST_LONG_RUN; c = getBitsReturn.c; lc = getBitsReturn.lc; if (im + zerun > iM + 1) { throw new Error('Something wrong with hufUnpackEncTable'); } while (zerun--) hcode[im++] = 0; im--; } else if (l >= SHORT_ZEROCODE_RUN) { let zerun = l - SHORT_ZEROCODE_RUN + 2; if (im + zerun > iM + 1) { throw new Error('Something wrong with hufUnpackEncTable'); } while (zerun--) hcode[im++] = 0; im--; } } hufCanonicalCodeTable(hcode); } function hufLength(code) { return code & 63; } function hufCode(code) { return code >> 6; } function hufBuildDecTable(hcode, im, iM, hdecod) { for (; im <= iM; im++) { const c = hufCode(hcode[im]); const l = hufLength(hcode[im]); if (c >> l) { throw new Error('Invalid table entry'); } if (l > HUF_DECBITS) { const pl = hdecod[(c >> (l - HUF_DECBITS))]; if (pl.len) { throw new Error('Invalid table entry'); } pl.lit++; if (pl.p) { const p = pl.p; pl.p = new Array(pl.lit); for (let i = 0; i < pl.lit - 1; ++i) { pl.p[i] = p[i]; } } else { pl.p = new Array(1); } pl.p[pl.lit - 1] = im; } else if (l) { let plOffset = 0; for (let i = 1 << (HUF_DECBITS - l); i > 0; i--) { const pl = hdecod[(c << (HUF_DECBITS - l)) + plOffset]; if (pl.len || pl.p) { throw new Error('Invalid table entry'); } pl.len = l; pl.lit = im; plOffset++; } } } return true; } const getCharReturn = { c: 0, lc: 0 }; function getChar(c, lc, uInt8Array, inOffset) { c = (c << 8) | parseUint8Array(uInt8Array, inOffset); lc += 8; getCharReturn.c = c; getCharReturn.lc = lc; } const getCodeReturn = { c: 0, lc: 0 }; function getCode(po, rlc, c, lc, uInt8Array, inOffset, outBuffer, outBufferOffset, outBufferEndOffset) { if (po == rlc) { if (lc < 8) { getChar(c, lc, uInt8Array, inOffset); c = getCharReturn.c; lc = getCharReturn.lc; } lc -= 8; let cs = (c >> lc); cs = new Uint8Array([cs])[0]; if (outBufferOffset.value + cs > outBufferEndOffset) { return false; } const s = outBuffer[outBufferOffset.value - 1]; while (cs-- > 0) { outBuffer[outBufferOffset.value++] = s; } } else if (outBufferOffset.value < outBufferEndOffset) { outBuffer[outBufferOffset.value++] = po; } else { return false; } getCodeReturn.c = c; getCodeReturn.lc = lc; } function UInt16(value) { return (value & 0xFFFF); } function Int16(value) { const ref = UInt16(value); return (ref > 0x7FFF) ? ref - 0x10000 : ref; } const wdec14Return = { a: 0, b: 0 }; function wdec14(l, h) { const ls = Int16(l); const hs = Int16(h); const hi = hs; const ai = ls + (hi & 1) + (hi >> 1); const as = ai; const bs = ai - hi; wdec14Return.a = as; wdec14Return.b = bs; } function wdec16(l, h) { const m = UInt16(l); const d = UInt16(h); const bb = (m - (d >> 1)) & MOD_MASK; const aa = (d + bb - A_OFFSET) & MOD_MASK; wdec14Return.a = aa; wdec14Return.b = bb; } function wav2Decode(buffer, j, nx, ox, ny, oy, mx) { const w14 = mx < (1 << 14); const n = (nx > ny) ? ny : nx; let p = 1; let p2; let py; while (p <= n) p <<= 1; p >>= 1; p2 = p; p >>= 1; while (p >= 1) { py = 0; const ey = py + oy * (ny - p2); const oy1 = oy * p; const oy2 = oy * p2; const ox1 = ox * p; const ox2 = ox * p2; let i00, i01, i10, i11; for (; py <= ey; py += oy2) { let px = py; const ex = py + ox * (nx - p2); for (; px <= ex; px += ox2) { const p01 = px + ox1; const p10 = px + oy1; const p11 = p10 + ox1; if (w14) { wdec14(buffer[px + j], buffer[p10 + j]); i00 = wdec14Return.a; i10 = wdec14Return.b; wdec14(buffer[p01 + j], buffer[p11 + j]); i01 = wdec14Return.a; i11 = wdec14Return.b; wdec14(i00, i01); buffer[px + j] = wdec14Return.a; buffer[p01 + j] = wdec14Return.b; wdec14(i10, i11); buffer[p10 + j] = wdec14Return.a; buffer[p11 + j] = wdec14Return.b; } else { wdec16(buffer[px + j], buffer[p10 + j]); i00 = wdec14Return.a; i10 = wdec14Return.b; wdec16(buffer[p01 + j], buffer[p11 + j]); i01 = wdec14Return.a; i11 = wdec14Return.b; wdec16(i00, i01); buffer[px + j] = wdec14Return.a; buffer[p01 + j] = wdec14Return.b; wdec16(i10, i11); buffer[p10 + j] = wdec14Return.a; buffer[p11 + j] = wdec14Return.b; } } if (nx & p) { const p10 = px + oy1; if (w14) { wdec14(buffer[px + j], buffer[p10 + j]) } else { wdec16(buffer[px + j], buffer[p10 + j]) } i00 = wdec14Return.a; buffer[p10 + j] = wdec14Return.b; buffer[px + j] = i00; } } if (ny & p) { let px = py; const ex = py + ox * (nx - p2); for (; px <= ex; px += ox2) { const p01 = px + ox1; if (w14) { wdec14(buffer[px + j], buffer[p01 + j]) } else { wdec16(buffer[px + j], buffer[p01 + j]) } i00 = wdec14Return.a; buffer[p01 + j] = wdec14Return.b; buffer[px + j] = i00; } } p2 = p; p >>= 1; } return py; } function hufDecode(encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset) { let c = 0; let lc = 0; const outBufferEndOffset = no; const inOffsetEnd = Math.trunc(inOffset.value + (ni + 7) / 8); while (inOffset.value < inOffsetEnd) { getChar(c, lc, uInt8Array, inOffset); c = getCharReturn.c; lc = getCharReturn.lc; while (lc >= HUF_DECBITS) { const index = (c >> (lc - HUF_DECBITS)) & HUF_DECMASK; const pl = decodingTable[index]; if (pl.len) { lc -= pl.len; getCode(pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset); c = getCodeReturn.c; lc = getCodeReturn.lc; } else { if (!pl.p) { throw new Error('hufDecode issues'); } let j; for (j = 0; j < pl.lit; j++) { const l = hufLength(encodingTable[pl.p[j]]); while (lc < l && inOffset.value < inOffsetEnd) { getChar(c, lc, uInt8Array, inOffset); c = getCharReturn.c; lc = getCharReturn.lc; } if (lc >= l && (hufCode(encodingTable[pl.p[j]]) == ((c >> (lc - l)) & ((1 << l) - 1)))) { lc -= l; getCode(pl.p[j], rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset); c = getCodeReturn.c; lc = getCodeReturn.lc; break; } } if (j == pl.lit) { throw new Error('hufDecode issues'); } } } } const i = (8 - ni) & 7; c >>= i; lc -= i; while (lc > 0) { const pl = decodingTable[(c << (HUF_DECBITS - lc)) & HUF_DECMASK]; if (pl.len) { lc -= pl.len; getCode(pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset); c = getCodeReturn.c; lc = getCodeReturn.lc; } else { throw new Error('hufDecode issues'); } } return true; } function hufUncompress(uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw) { const outOffset = { value: 0 }; const initialInOffset = inOffset.value; const im = parseUint32(inDataView, inOffset); const iM = parseUint32(inDataView, inOffset); inOffset.value += 4; const nBits = parseUint32(inDataView, inOffset); inOffset.value += 4; if (im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE) { throw new Error('Something wrong with HUF_ENCSIZE'); } const freq = new Array(HUF_ENCSIZE); const hdec = new Array(HUF_DECSIZE); hufClearDecTable(hdec); const ni = nCompressed - (inOffset.value - initialInOffset); hufUnpackEncTable(uInt8Array, inOffset, ni, im, iM, freq); if (nBits > 8 * (nCompressed - (inOffset.value - initialInOffset))) { throw new Error('Something wrong with hufUncompress'); } hufBuildDecTable(freq, im, iM, hdec); hufDecode(freq, hdec, uInt8Array, inOffset, nBits, iM, nRaw, outBuffer, outOffset); } function applyLut(lut, data, nData) { for (let i = 0; i < nData; ++i) { data[i] = lut[data[i]]; } } function predictor(source) { for (let t = 1; t < source.length; t++) { const d = source[t - 1] + source[t] - 128; source[t] = d; } } function interleaveScalar(source, out) { let t1 = 0; let t2 = Math.floor((source.length + 1) / 2); let s = 0; const stop = source.length - 1; while (true) { if (s > stop) break; out[s++] = source[t1++]; if (s > stop) break; out[s++] = source[t2++]; } } function decodeRunLength(source) { let size = source.byteLength; const out = new Array(); let p = 0; const reader = new DataView(source); while (size > 0) { const l = reader.getInt8(p++); if (l < 0) { const count = -l; size -= count + 1; for (let i = 0; i < count; i++) { out.push(reader.getUint8(p++)); } } else { const count = l; size -= 2; const value = reader.getUint8(p++); for (let i = 0; i < count + 1; i++) { out.push(value); } } } return out; } function lossyDctDecode(cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer) { let dataView = new DataView(outBuffer.buffer); const width = channelData[cscSet.idx[0]].width; const height = channelData[cscSet.idx[0]].height; const numComp = 3; const numFullBlocksX = Math.floor(width / 8.0); const numBlocksX = Math.ceil(width / 8.0); const numBlocksY = Math.ceil(height / 8.0); const leftoverX = width - (numBlocksX - 1) * 8; const leftoverY = height - (numBlocksY - 1) * 8; const currAcComp = { value: 0 }; const currDcComp = new Array(numComp); const dctData = new Array(numComp); const halfZigBlock = new Array(numComp); const rowBlock = new Array(numComp); const rowOffsets = new Array(numComp); for (let comp = 0; comp < numComp; ++comp) { rowOffsets[comp] = rowPtrs[cscSet.idx[comp]]; currDcComp[comp] = (comp < 1) ? 0 : currDcComp[comp - 1] + numBlocksX * numBlocksY; dctData[comp] = new Float32Array(64); halfZigBlock[comp] = new Uint16Array(64); rowBlock[comp] = new Uint16Array(numBlocksX * 64); } for (let blocky = 0; blocky < numBlocksY; ++blocky) { let maxY = 8; if (blocky == numBlocksY - 1) { maxY = leftoverY } let maxX = 8; for (let blockx = 0; blockx < numBlocksX; ++blockx) { if (blockx == numBlocksX - 1) { maxX = leftoverX } for (let comp = 0; comp < numComp; ++comp) { halfZigBlock[comp].fill(0); // set block DC component halfZigBlock[comp][0] = dcBuffer[currDcComp[comp]++]; // set block AC components unRleAC(currAcComp, acBuffer, halfZigBlock[comp]); // UnZigZag block to float unZigZag(halfZigBlock[comp], dctData[comp]); // decode float dct dctInverse(dctData[comp]); } if (numComp == 3) { csc709Inverse(dctData); } for (let comp = 0; comp < numComp; ++comp) { convertToHalf(dctData[comp], rowBlock[comp], blockx * 64); } } // blockx let offset = 0; for (let comp = 0; comp < numComp; ++comp) { const type = channelData[cscSet.idx[comp]].type; for (let y = 8 * blocky; y < 8 * blocky + maxY; ++y) { offset = rowOffsets[comp][y]; for (let blockx = 0; blockx < numFullBlocksX; ++blockx) { const src = blockx * 64 + ((y & 0x7) * 8); dataView.setUint16(offset + 0 * INT16_SIZE * type, rowBlock[comp][src + 0], true); dataView.setUint16(offset + 1 * INT16_SIZE * type, rowBlock[comp][src + 1], true); dataView.setUint16(offset + 2 * INT16_SIZE * type, rowBlock[comp][src + 2], true); dataView.setUint16(offset + 3 * INT16_SIZE * type, rowBlock[comp][src + 3], true); dataView.setUint16(offset + 4 * INT16_SIZE * type, rowBlock[comp][src + 4], true); dataView.setUint16(offset + 5 * INT16_SIZE * type, rowBlock[comp][src + 5], true); dataView.setUint16(offset + 6 * INT16_SIZE * type, rowBlock[comp][src + 6], true); dataView.setUint16(offset + 7 * INT16_SIZE * type, rowBlock[comp][src + 7], true); offset += 8 * INT16_SIZE * type; } } // handle partial X blocks if (numFullBlocksX != numBlocksX) { for (let y = 8 * blocky; y < 8 * blocky + maxY; ++y) { const offset = rowOffsets[comp][y] + 8 * numFullBlocksX * INT16_SIZE * type; const src = numFullBlocksX * 64 + ((y & 0x7) * 8); for (let x = 0; x < maxX; ++x) { dataView.setUint16(offset + x * INT16_SIZE * type, rowBlock[comp][src + x], true); } } } } // comp } // blocky const halfRow = new Uint16Array(width); dataView = new DataView(outBuffer.buffer); // convert channels back to float, if needed for (let comp = 0; comp < numComp; ++comp) { channelData[cscSet.idx[comp]].decoded = true; const type = channelData[cscSet.idx[comp]].type; if (channelData[comp].type != 2) continue; for (let y = 0; y < height; ++y) { const offset = rowOffsets[comp][y]; for (let x = 0; x < width; ++x) { halfRow[x] = dataView.getUint16(offset + x * INT16_SIZE * type, true); } for (let x = 0; x < width; ++x) { dataView.setFloat32(offset + x * INT16_SIZE * type, decodeFloat16(halfRow[x]), true); } } } } function unRleAC(currAcComp, acBuffer, halfZigBlock) { let acValue; let dctComp = 1; while (dctComp < 64) { acValue = acBuffer[currAcComp.value]; if (acValue == 0xff00) { dctComp = 64; } else if (acValue >> 8 == 0xff) { dctComp += acValue & 0xff; } else { halfZigBlock[dctComp] = acValue; dctComp++; } currAcComp.value++; } } function unZigZag(src, dst) { dst[0] = decodeFloat16(src[0]); dst[1] = decodeFloat16(src[1]); dst[2] = decodeFloat16(src[5]); dst[3] = decodeFloat16(src[6]); dst[4] = decodeFloat16(src[14]); dst[5] = decodeFloat16(src[15]); dst[6] = decodeFloat16(src[27]); dst[7] = decodeFloat16(src[28]); dst[8] = decodeFloat16(src[2]); dst[9] = decodeFloat16(src[4]); dst[10] = decodeFloat16(src[7]); dst[11] = decodeFloat16(src[13]); dst[12] = decodeFloat16(src[16]); dst[13] = decodeFloat16(src[26]); dst[14] = decodeFloat16(src[29]); dst[15] = decodeFloat16(src[42]); dst[16] = decodeFloat16(src[3]); dst[17] = decodeFloat16(src[8]); dst[18] = decodeFloat16(src[12]); dst[19] = decodeFloat16(src[17]); dst[20] = decodeFloat16(src[25]); dst[21] = decodeFloat16(src[30]); dst[22] = decodeFloat16(src[41]); dst[23] = decodeFloat16(src[43]); dst[24] = decodeFloat16(src[9]); dst[25] = decodeFloat16(src[11]); dst[26] = decodeFloat16(src[18]); dst[27] = decodeFloat16(src[24]); dst[28] = decodeFloat16(src[31]); dst[29] = decodeFloat16(src[40]); dst[30] = decodeFloat16(src[44]); dst[31] = decodeFloat16(src[53]); dst[32] = decodeFloat16(src[10]); dst[33] = decodeFloat16(src[19]); dst[34] = decodeFloat16(src[23]); dst[35] = decodeFloat16(src[32]); dst[36] = decodeFloat16(src[39]); dst[37] = decodeFloat16(src[45]); dst[38] = decodeFloat16(src[52]); dst[39] = decodeFloat16(src[54]); dst[40] = decodeFloat16(src[20]); dst[41] = decodeFloat16(src[22]); dst[42] = decodeFloat16(src[33]); dst[43] = decodeFloat16(src[38]); dst[44] = decodeFloat16(src[46]); dst[45] = decodeFloat16(src[51]); dst[46] = decodeFloat16(src[55]); dst[47] = decodeFloat16(src[60]); dst[48] = decodeFloat16(src[21]); dst[49] = decodeFloat16(src[34]); dst[50] = decodeFloat16(src[37]); dst[51] = decodeFloat16(src[47]); dst[52] = decodeFloat16(src[50]); dst[53] = decodeFloat16(src[56]); dst[54] = decodeFloat16(src[59]); dst[55] = decodeFloat16(src[61]); dst[56] = decodeFloat16(src[35]); dst[57] = decodeFloat16(src[36]); dst[58] = decodeFloat16(src[48]); dst[59] = decodeFloat16(src[49]); dst[60] = decodeFloat16(src[57]); dst[61] = decodeFloat16(src[58]); dst[62] = decodeFloat16(src[62]); dst[63] = decodeFloat16(src[63]); } function dctInverse(data) { const a = 0.5 * Math.cos(3.14159 / 4.0); const b = 0.5 * Math.cos(3.14159 / 16.0); const c = 0.5 * Math.cos(3.14159 / 8.0); const d = 0.5 * Math.cos(3.0 * 3.14159 / 16.0); const e = 0.5 * Math.cos(5.0 * 3.14159 / 16.0); const f = 0.5 * Math.cos(3.0 * 3.14159 / 8.0); const g = 0.5 * Math.cos(7.0 * 3.14159 / 16.0); const alpha = new Array(4); const beta = new Array(4); const theta = new Array(4); const gamma = new Array(4); for (let row = 0; row < 8; ++row) { const rowPtr = row * 8; alpha[0] = c * data[rowPtr + 2]; alpha[1] = f * data[rowPtr + 2]; alpha[2] = c * data[rowPtr + 6]; alpha[3] = f * data[rowPtr + 6]; beta[0] = b * data[rowPtr + 1] + d * data[rowPtr + 3] + e * data[rowPtr + 5] + g * data[rowPtr + 7]; beta[1] = d * data[rowPtr + 1] - g * data[rowPtr + 3] - b * data[rowPtr + 5] - e * data[rowPtr + 7]; beta[2] = e * data[rowPtr + 1] - b * data[rowPtr + 3] + g * data[rowPtr + 5] + d * data[rowPtr + 7]; beta[3] = g * data[rowPtr + 1] - e * data[rowPtr + 3] + d * data[rowPtr + 5] - b * data[rowPtr + 7]; theta[0] = a * (data[rowPtr + 0] + data[rowPtr + 4]); theta[3] = a * (data[rowPtr + 0] - data[rowPtr + 4]); theta[1] = alpha[0] + alpha[3]; theta[2] = alpha[1] - alpha[2]; gamma[0] = theta[0] + theta[1]; gamma[1] = theta[3] + theta[2]; gamma[2] = theta[3] - theta[2]; gamma[3] = theta[0] - theta[1]; data[rowPtr + 0] = gamma[0] + beta[0]; data[rowPtr + 1] = gamma[1] + beta[1]; data[rowPtr + 2] = gamma[2] + beta[2]; data[rowPtr + 3] = gamma[3] + beta[3]; data[rowPtr + 4] = gamma[3] - beta[3]; data[rowPtr + 5] = gamma[2] - beta[2]; data[rowPtr + 6] = gamma[1] - beta[1]; data[rowPtr + 7] = gamma[0] - beta[0]; } for (let column = 0; column < 8; ++column) { alpha[0] = c * data[16 + column]; alpha[1] = f * data[16 + column]; alpha[2] = c * data[48 + column]; alpha[3] = f * data[48 + column]; beta[0] = b * data[8 + column] + d * data[24 + column] + e * data[40 + column] + g * data[56 + column]; beta[1] = d * data[8 + column] - g * data[24 + column] - b * data[40 + column] - e * data[56 + column]; beta[2] = e * data[8 + column] - b * data[24 + column] + g * data[40 + column] + d * data[56 + column]; beta[3] = g * data[8 + column] - e * data[24 + column] + d * data[40 + column] - b * data[56 + column]; theta[0] = a * (data[column] + data[32 + column]); theta[3] = a * (data[column] - data[32 + column]); theta[1] = alpha[0] + alpha[3]; theta[2] = alpha[1] - alpha[2]; gamma[0] = theta[0] + theta[1]; gamma[1] = theta[3] + theta[2]; gamma[2] = theta[3] - theta[2]; gamma[3] = theta[0] - theta[1]; data[0 + column] = gamma[0] + beta[0]; data[8 + column] = gamma[1] + beta[1]; data[16 + column] = gamma[2] + beta[2]; data[24 + column] = gamma[3] + beta[3]; data[32 + column] = gamma[3] - beta[3]; data[40 + column] = gamma[2] - beta[2]; data[48 + column] = gamma[1] - beta[1]; data[56 + column] = gamma[0] - beta[0]; } } function csc709Inverse(data) { for (let i = 0; i < 64; ++i) { const y = data[0][i]; const cb = data[1][i]; const cr = data[2][i]; data[0][i] = y + 1.5747 * cr; data[1][i] = y - 0.1873 * cb - 0.4682 * cr; data[2][i] = y + 1.8556 * cb; } } function convertToHalf(src, dst, idx) { for (let i = 0; i < 64; ++i) { dst[idx + i] = MathUtils.toHalfFloat(toLinear(src[i])); } } function toLinear(float) { if (float <= 1) { return Math.sign(float) * Math.pow(Math.abs(float), 2.2); } else { return Math.sign(float) * Math.pow(logBase, Math.abs(float) - 1.0); } } function uncompressRAW(info) { return new DataView(info.array.buffer, info.offset.value, info.size); } function uncompressRLE(info) { const compressed = info.viewer.buffer.slice(info.offset.value, info.offset.value + info.size); const rawBuffer = new Uint8Array(decodeRunLength(compressed)); const tmpBuffer = new Uint8Array(rawBuffer.length); predictor(rawBuffer); // revert predictor interleaveScalar(rawBuffer, tmpBuffer); // interleave pixels return new DataView(tmpBuffer.buffer); } function uncompressZIP(info) { const compressed = info.array.slice(info.offset.value, info.offset.value + info.size); const rawBuffer = _fflate.unzlibSync(compressed); const tmpBuffer = new Uint8Array(rawBuffer.length); predictor(rawBuffer); // revert predictor interleaveScalar(rawBuffer, tmpBuffer); // interleave pixels return new DataView(tmpBuffer.buffer); } function uncompressPIZ(info) { const inDataView = info.viewer; const inOffset = { value: info.offset.value }; const outBuffer = new Uint16Array(info.width * info.scanlineBlockSize * (info.channels * info.type)); const bitmap = new Uint8Array(BITMAP_SIZE); // Setup channel info let outBufferEnd = 0; const pizChannelData = new Array(info.channels); for (let i = 0; i < info.channels; i++) { pizChannelData[i] = {}; pizChannelData[i]['start'] = outBufferEnd; pizChannelData[i]['end'] = pizChannelData[i]['start']; pizChannelData[i]['nx'] = info.width; pizChannelData[i]['ny'] = info.lines; pizChannelData[i]['size'] = info.type; outBufferEnd += pizChannelData[i].nx * pizChannelData[i].ny * pizChannelData[i].size; } // Read range compression data const minNonZero = parseUint16(inDataView, inOffset); const maxNonZero = parseUint16(inDataView, inOffset); if (maxNonZero >= BITMAP_SIZE) { throw new Error('Something is wrong with PIZ_COMPRESSION BITMAP_SIZE'); } if (minNonZero <= maxNonZero) { for (let i = 0; i < maxNonZero - minNonZero + 1; i++) { bitmap[i + minNonZero] = parseUint8(inDataView, inOffset); } } // Reverse LUT const lut = new Uint16Array(USHORT_RANGE); const maxValue = reverseLutFromBitmap(bitmap, lut); const length = parseUint32(inDataView, inOffset); // Huffman decoding hufUncompress(info.array, inDataView, inOffset, length, outBuffer, outBufferEnd); // Wavelet decoding for (let i = 0; i < info.channels; ++i) { const cd = pizChannelData[i]; for (let j = 0; j < pizChannelData[i].size; ++j) { wav2Decode( outBuffer, cd.start + j, cd.nx, cd.size, cd.ny, cd.nx * cd.size, maxValue ); } } // Expand the pixel data to their original range applyLut(lut, outBuffer, outBufferEnd); // Rearrange the pixel data into the format expected by the caller. let tmpOffset = 0; const tmpBuffer = new Uint8Array(outBuffer.buffer.byteLength); for (let y = 0; y < info.lines; y++) { for (let c = 0; c < info.channels; c++) { const cd = pizChannelData[c]; const n = cd.nx * cd.size; const cp = new Uint8Array(outBuffer.buffer, cd.end * INT16_SIZE, n * INT16_SIZE); tmpBuffer.set(cp, tmpOffset); tmpOffset += n * INT16_SIZE; cd.end += n; } } return new DataView(tmpBuffer.buffer); } function uncompressPXR(info) { const compressed = info.array.slice(info.offset.value, info.offset.value + info.size); const rawBuffer = _fflate.unzlibSync(compressed); const sz = info.lines * info.channels * info.width; const tmpBuffer = (info.type == 1) ? new Uint16Array(sz) : new Uint32Array(sz); let tmpBufferEnd = 0; let writePtr = 0; const ptr = new Array(4); for (let y = 0; y < info.lines; y++) { for (let c = 0; c < info.channels; c++) { let pixel = 0; switch (info.type) { case 1: ptr[0] = tmpBufferEnd; ptr[1] = ptr[0] + info.width; tmpBufferEnd = ptr[1] + info.width; for (let j = 0; j < info.width; ++j) { const diff = (rawBuffer[ptr[0]++] << 8) | rawBuffer[ptr[1]++]; pixel += diff; tmpBuffer[writePtr] = pixel; writePtr++; } break; case 2: ptr[0] = tmpBufferEnd; ptr[1] = ptr[0] + info.width; ptr[2] = ptr[1] + info.width; tmpBufferEnd = ptr[2] + info.width; for (let j = 0; j < info.width; ++j) { const diff = (rawBuffer[ptr[0]++] << 24) | (rawBuffer[ptr[1]++] << 16) | (rawBuffer[ptr[2]++] << 8); pixel += diff; tmpBuffer[writePtr] = pixel; writePtr++; } break; } } } return new DataView(tmpBuffer.buffer); } function uncompressDWA(info) { const inDataView = info.viewer; const inOffset = { value: info.offset.value }; const outBuffer = new Uint8Array(info.width * info.lines * (info.channels * info.type * INT16_SIZE)); // Read compression header information const dwaHeader = { version: parseInt64(inDataView, inOffset), unknownUncompressedSize: parseInt64(inDataView, inOffset), unknownCompressedSize: parseInt64(inDataView, inOffset), acCompressedSize: parseInt64(inDataView, inOffset), dcCompressedSize: parseInt64(inDataView, inOffset), rleCompressedSize: parseInt64(inDataView, inOffset), rleUncompressedSize: parseInt64(inDataView, inOffset), rleRawSize: parseInt64(inDataView, inOffset), totalAcUncompressedCount: parseInt64(inDataView, inOffset), totalDcUncompressedCount: parseInt64(inDataView, inOffset), acCompression: parseInt64(inDataView, inOffset) }; if (dwaHeader.version < 2) { throw new Error('EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported') } // Read channel ruleset information const channelRules = new Array(); let ruleSize = parseUint16(inDataView, inOffset) - INT16_SIZE; while (ruleSize > 0) { const name = parseNullTerminatedString(inDataView.buffer, inOffset); const value = parseUint8(inDataView, inOffset); const compression = (value >> 2) & 3; const csc = (value >> 4) - 1; const index = new Int8Array([csc])[0]; const type = parseUint8(inDataView, inOffset); channelRules.push({ name: name, index: index, type: type, compression: compression }); ruleSize -= name.length + 3; } // Classify channels const channels = EXRHeader.channels; const channelData = new Array(info.channels); for (let i = 0; i < info.channels; ++i) { const cd = channelData[i] = {}; const channel = channels[i]; cd.name = channel.name; cd.compression = UNKNOWN; cd.decoded = false; cd.type = channel.pixelType; cd.pLinear = channel.pLinear; cd.width = info.width; cd.height = info.lines; } const cscSet = { idx: new Array(3) }; for (let offset = 0; offset < info.channels; ++offset) { const cd = channelData[offset]; for (let i = 0; i < channelRules.length; ++i) { const rule = channelRules[i]; if (cd.name == rule.name) { cd.compression = rule.compression; if (rule.index >= 0) { cscSet.idx[rule.index] = offset; } cd.offset = offset; } } } let acBuffer, dcBuffer, rleBuffer; // Read DCT - AC component data if (dwaHeader.acCompressedSize > 0) { switch (dwaHeader.acCompression) { case STATIC_HUFFMAN: { acBuffer = new Uint16Array(dwaHeader.totalAcUncompressedCount); hufUncompress(info.array, inDataView, inOffset, dwaHeader.acCompressedSize, acBuffer, dwaHeader.totalAcUncompressedCount); break; } case DEFLATE: { const compressed = info.array.slice(inOffset.value, inOffset.value + dwaHeader.totalAcUncompressedCount); const data = _fflate.unzlibSync(compressed); acBuffer = new Uint16Array(data.buffer); inOffset.value += dwaHeader.totalAcUncompressedCount; break; } } } // Read DCT - DC component data if (dwaHeader.dcCompressedSize > 0) { const zlibInfo = { array: info.array, offset: inOffset, size: dwaHeader.dcCompressedSize }; dcBuffer = new Uint16Array(uncompressZIP(zlibInfo).buffer); inOffset.value += dwaHeader.dcCompressedSize; } // Read RLE compressed data if (dwaHeader.rleRawSize > 0) { const compressed = info.array.slice(inOffset.value, inOffset.value + dwaHeader.rleCompressedSize); const data = _fflate.unzlibSync(compressed); rleBuffer = decodeRunLength(data.buffer); inOffset.value += dwaHeader.rleCompressedSize; } // Prepare outbuffer data offset let outBufferEnd = 0; const rowOffsets = new Array(channelData.length); for (let i = 0; i < rowOffsets.length; ++i) { rowOffsets[i] = new Array(); } for (let y = 0; y < info.lines; ++y) { for (let chan = 0; chan < channelData.length; ++chan) { rowOffsets[chan].push(outBufferEnd); outBufferEnd += channelData[chan].width * info.type * INT16_SIZE; } } // Lossy DCT decode RGB channels lossyDctDecode(cscSet, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer); // Decode other channels for (let i = 0; i < channelData.length; ++i) { const cd = channelData[i]; if (cd.decoded) continue; switch (cd.compression) { case RLE: { let row = 0; let rleOffset = 0; for (let y = 0; y < info.lines; ++y) { let rowOffsetBytes = rowOffsets[i][row]; for (let x = 0; x < cd.width; ++x) { for (let byte = 0; byte < INT16_SIZE * cd.type; ++byte) { outBuffer[rowOffsetBytes++] = rleBuffer[rleOffset + byte * cd.width * cd.height]; } rleOffset++; } row++; } break; } case LOSSY_DCT: // skip default: throw new Error('EXRLoader.parse: unsupported channel compression'); } } return new DataView(outBuffer.buffer); } function parseNullTerminatedString(buffer, offset) { const uintBuffer = new Uint8Array(buffer); let endOffset = 0; while (uintBuffer[offset.value + endOffset] != 0) { endOffset += 1; } const stringValue = new TextDecoder().decode( uintBuffer.slice(offset.value, offset.value + endOffset) ); offset.value = offset.value + endOffset + 1; return stringValue; } function parseFixedLengthString(buffer, offset, size) { const stringValue = new TextDecoder().decode( new Uint8Array(buffer).slice(offset.value, offset.value + size) ); offset.value = offset.value + size; return stringValue; } function parseRational(dataView, offset) { const x = parseInt32(dataView, offset); const y = parseUint32(dataView, offset); return [x, y]; } function parseTimecode(dataView, offset) { const x = parseUint32(dataView, offset); const y = parseUint32(dataView, offset); return [x, y]; } function parseInt32(dataView, offset) { const Int32 = dataView.getInt32(offset.value, true); offset.value = offset.value + INT32_SIZE; return Int32; } function parseUint32(dataView, offset) { const Uint32 = dataView.getUint32(offset.value, true); offset.value = offset.value + INT32_SIZE; return Uint32; } function parseUint8Array(uInt8Array, offset) { const Uint8 = uInt8Array[offset.value]; offset.value = offset.value + INT8_SIZE; return Uint8; } function parseUint8(dataView, offset) { const Uint8 = dataView.getUint8(offset.value); offset.value = offset.value + INT8_SIZE; return Uint8; } const parseInt64 = function(dataView, offset) { let int; if ('getBigInt64' in DataView.prototype) { int = Number(dataView.getBigInt64(offset.value, true)); } else { int = dataView.getUint32(offset.value + 4, true) + Number(dataView.getUint32(offset.value, true) << 32); } offset.value += ULONG_SIZE; return int; }; function parseFloat32(dataView, offset) { const float = dataView.getFloat32(offset.value, true); offset.value += FLOAT32_SIZE; return float; } function decodeFloat32(dataView, offset) { return MathUtils.toHalfFloat(parseFloat32(dataView, offset)); } // https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript function decodeFloat16(binary) { const exponent = (binary & 0x7C00) >> 10, fraction = binary & 0x03FF; return (binary >> 15 ? -1 : 1) * ( exponent ? ( exponent === 0x1F ? fraction ? NaN : Infinity : Math.pow(2, exponent - 15) * (1 + fraction / 0x400) ) : 6.103515625e-5 * (fraction / 0x400) ); } function parseUint16(dataView, offset) { const Uint16 = dataView.getUint16(offset.value, true); offset.value += INT16_SIZE; return Uint16; } function parseFloat16(buffer, offset) { return decodeFloat16(parseUint16(buffer, offset)); } function parseChlist(dataView, buffer, offset, size) { const startOffset = offset.value; const channels = []; while (offset.value < (startOffset + size - 1)) { const name = parseNullTerminatedString(buffer, offset); const pixelType = parseInt32(dataView, offset); const pLinear = parseUint8(dataView, offset); offset.value += 3; // reserved, three chars const xSampling = parseInt32(dataView, offset); const ySampling = parseInt32(dataView, offset); channels.push({ name: name, pixelType: pixelType, pLinear: pLinear, xSampling: xSampling, ySampling: ySampling }); } offset.value += 1; return channels; } function parseChromaticities(dataView, offset) { const redX = parseFloat32(dataView, offset); const redY = parseFloat32(dataView, offset); const greenX = parseFloat32(dataView, offset); const greenY = parseFloat32(dataView, offset); const blueX = parseFloat32(dataView, offset); const blueY = parseFloat32(dataView, offset); const whiteX = parseFloat32(dataView, offset); const whiteY = parseFloat32(dataView, offset); return { redX: redX, redY: redY, greenX: greenX, greenY: greenY, blueX: blueX, blueY: blueY, whiteX: whiteX, whiteY: whiteY }; } function parseCompression(dataView, offset) { const compressionCodes = [ 'NO_COMPRESSION', 'RLE_COMPRESSION', 'ZIPS_COMPRESSION', 'ZIP_COMPRESSION', 'PIZ_COMPRESSION', 'PXR24_COMPRESSION', 'B44_COMPRESSION', 'B44A_COMPRESSION', 'DWAA_COMPRESSION', 'DWAB_COMPRESSION' ]; const compression = parseUint8(dataView, offset); return compressionCodes[compression]; } function parseBox2i(dataView, offset) { const xMin = parseUint32(dataView, offset); const yMin = parseUint32(dataView, offset); const xMax = parseUint32(dataView, offset); const yMax = parseUint32(dataView, offset); return { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax }; } function parseLineOrder(dataView, offset) { const lineOrders = [ 'INCREASING_Y' ]; const lineOrder = parseUint8(dataView, offset); return lineOrders[lineOrder]; } function parseV2f(dataView, offset) { const x = parseFloat32(dataView, offset); const y = parseFloat32(dataView, offset); return [x, y]; } function parseV3f(dataView, offset) { const x = parseFloat32(dataView, offset); const y = parseFloat32(dataView, offset); const z = parseFloat32(dataView, offset); return [x, y, z]; } function parseValue(dataView, buffer, offset, type, size) { if (type === 'string' || type === 'stringvector' || type === 'iccProfile') { return parseFixedLengthString(buffer, offset, size); } else if (type === 'chlist') { return parseChlist(dataView, buffer, offset, size); } else if (type === 'chromaticities') { return parseChromaticities(dataView, offset); } else if (type === 'compression') { return parseCompression(dataView, offset); } else if (type === 'box2i') { return parseBox2i(dataView, offset); } else if (type === 'lineOrder') { return parseLineOrder(dataView, offset); } else if (type === 'float') { return parseFloat32(dataView, offset); } else if (type === 'v2f') { return parseV2f(dataView, offset); } else if (type === 'v3f') { return parseV3f(dataView, offset); } else if (type === 'int') { return parseInt32(dataView, offset); } else if (type === 'rational') { return parseRational(dataView, offset); } else if (type === 'timecode') { return parseTimecode(dataView, offset); } else if (type === 'preview') { offset.value += size; return 'skipped'; } else { offset.value += size; return undefined; } } function parseHeader(dataView, buffer, offset) { const EXRHeader = {}; if (dataView.getUint32(0, true) != 20000630) { // magic throw new Error('EXRLoader: provided file doesn\'t appear to be in OpenEXR format.'); } EXRHeader.version = dataView.getUint8(4); const spec = dataView.getUint8(5); // fullMask EXRHeader.spec = { singleTile: !!(spec & 2), longName: !!(spec & 4), deepFormat: !!(spec & 8), multiPart: !!(spec & 16) }; // start of header offset.value = 8; // start at 8 - after pre-amble let keepReading = true; while (keepReading) { const attributeName = parseNullTerminatedString(buffer, offset); if (attributeName == 0) { keepReading = false; } else { const attributeType = parseNullTerminatedString(buffer, offset); const attributeSize = parseUint32(dataView, offset); const attributeValue = parseValue(dataView, buffer, offset, attributeType, attributeSize); if (attributeValue === undefined) { console.warn(`EXRLoader.parse: skipped unknown header attribute type '${attributeType}'.`); } else { EXRHeader[attributeName] = attributeValue; } } } if ((spec & ~0x04) != 0) { // unsupported tiled, deep-image, multi-part console.error('EXRHeader:', EXRHeader); throw new Error('EXRLoader: provided file is currently unsupported.'); } return EXRHeader; } function setupDecoder(EXRHeader, dataView, uInt8Array, offset, outputType) { const EXRDecoder = { size: 0, viewer: dataView, array: uInt8Array, offset: offset, width: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1, height: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1, channels: EXRHeader.channels.length, bytesPerLine: null, lines: null, inputSize: null, type: EXRHeader.channels[0].pixelType, uncompress: null, getter: null, format: null, encoding: TEXEL_ENCODING_TYPE.LINEAR }; switch (EXRHeader.compression) { case 'NO_COMPRESSION': EXRDecoder.lines = 1; EXRDecoder.uncompress = uncompressRAW; break; case 'RLE_COMPRESSION': EXRDecoder.lines = 1; EXRDecoder.uncompress = uncompressRLE; break; case 'ZIPS_COMPRESSION': EXRDecoder.lines = 1; EXRDecoder.uncompress = uncompressZIP; break; case 'ZIP_COMPRESSION': EXRDecoder.lines = 16; EXRDecoder.uncompress = uncompressZIP; break; case 'PIZ_COMPRESSION': EXRDecoder.lines = 32; EXRDecoder.uncompress = uncompressPIZ; break; case 'PXR24_COMPRESSION': EXRDecoder.lines = 16; EXRDecoder.uncompress = uncompressPXR; break; case 'DWAA_COMPRESSION': EXRDecoder.lines = 32; EXRDecoder.uncompress = uncompressDWA; break; case 'DWAB_COMPRESSION': EXRDecoder.lines = 256; EXRDecoder.uncompress = uncompressDWA; break; default: throw new Error('EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported'); } EXRDecoder.scanlineBlockSize = EXRDecoder.lines; if (EXRDecoder.type == 1) { // half switch (outputType) { case PIXEL_TYPE.FLOAT: EXRDecoder.getter = parseFloat16; EXRDecoder.inputSize = INT16_SIZE; break; case PIXEL_TYPE.HALF_FLOAT: EXRDecoder.getter = parseUint16; EXRDecoder.inputSize = INT16_SIZE; break; } } else if (EXRDecoder.type == 2) { // float switch (outputType) { case PIXEL_TYPE.FLOAT: EXRDecoder.getter = parseFloat32; EXRDecoder.inputSize = FLOAT32_SIZE; break; case PIXEL_TYPE.HALF_FLOAT: EXRDecoder.getter = decodeFloat32; EXRDecoder.inputSize = FLOAT32_SIZE; } } else { throw new Error('EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.'); } EXRDecoder.blockCount = (EXRHeader.dataWindow.yMax + 1) / EXRDecoder.scanlineBlockSize; for (let i = 0; i < EXRDecoder.blockCount; i++) { parseInt64(dataView, offset) } // scanlineOffset // we should be passed the scanline offset table, ready to start reading pixel data. // RGB images will be converted to RGBA format, preventing software emulation in select devices. EXRDecoder.outputChannels = ((EXRDecoder.channels == 3) ? 4 : EXRDecoder.channels); const size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels; switch (outputType) { case PIXEL_TYPE.FLOAT: EXRDecoder.byteArray = new Float32Array(size); // Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten if (EXRDecoder.channels < EXRDecoder.outputChannels) { EXRDecoder.byteArray.fill(1, 0, size) } break; case PIXEL_TYPE.HALF_FLOAT: EXRDecoder.byteArray = new Uint16Array(size); if (EXRDecoder.channels < EXRDecoder.outputChannels) { EXRDecoder.byteArray.fill(0x3C00, 0, size) } // Uint16Array holds half float data, 0x3C00 is 1 break; default: console.error('EXRLoader: unsupported type: ', outputType); break; } EXRDecoder.bytesPerLine = EXRDecoder.width * EXRDecoder.inputSize * EXRDecoder.channels; if (EXRDecoder.outputChannels == 4) { EXRDecoder.format = PIXEL_FORMAT.RGBA; EXRDecoder.colorSpace = TEXEL_ENCODING_TYPE.LINEAR; } else { EXRDecoder.format = PIXEL_FORMAT.RED; EXRDecoder.colorSpace = TEXEL_ENCODING_TYPE.LINEAR; } return EXRDecoder; } // start parsing file [START] const bufferDataView = new DataView(buffer); const uInt8Array = new Uint8Array(buffer); const offset = { value: 0 }; // get header information and validate format. const EXRHeader = parseHeader(bufferDataView, buffer, offset); // get input compression information and prepare decoding. const EXRDecoder = setupDecoder(EXRHeader, bufferDataView, uInt8Array, offset, this.type); const tmpOffset = { value: 0 }; const channelOffsets = { R: 0, G: 1, B: 2, A: 3, Y: 0 }; for (let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.scanlineBlockSize; scanlineBlockIdx++) { const line = parseUint32(bufferDataView, offset); // line_no EXRDecoder.size = parseUint32(bufferDataView, offset); // data_len EXRDecoder.lines = ((line + EXRDecoder.scanlineBlockSize > EXRDecoder.height) ? (EXRDecoder.height - line) : EXRDecoder.scanlineBlockSize); const isCompressed = EXRDecoder.size < EXRDecoder.lines * EXRDecoder.bytesPerLine; const viewer = isCompressed ? EXRDecoder.uncompress(EXRDecoder) : uncompressRAW(EXRDecoder); offset.value += EXRDecoder.size; for (let line_y = 0; line_y < EXRDecoder.scanlineBlockSize; line_y++) { const true_y = line_y + scanlineBlockIdx * EXRDecoder.scanlineBlockSize; if (true_y >= EXRDecoder.height) break; for (let channelID = 0; channelID < EXRDecoder.channels; channelID++) { const cOff = channelOffsets[EXRHeader.channels[channelID].name]; for (let x = 0; x < EXRDecoder.width; x++) { tmpOffset.value = (line_y * (EXRDecoder.channels * EXRDecoder.width) + channelID * EXRDecoder.width + x) * EXRDecoder.inputSize; const outIndex = (EXRDecoder.height - 1 - true_y) * (EXRDecoder.width * EXRDecoder.outputChannels) + x * EXRDecoder.outputChannels + cOff; EXRDecoder.byteArray[outIndex] = EXRDecoder.getter(viewer, tmpOffset); } } } } return { header: EXRHeader, width: EXRDecoder.width, height: EXRDecoder.height, data: EXRDecoder.byteArray, type: this.type, format: EXRDecoder.format, generateMipmaps: false, flipY: false, minFilter: TEXTURE_FILTER.LINEAR, magFilter: TEXTURE_FILTER.LINEAR, encoding: EXRDecoder.colorSpace, colorSpace: EXRDecoder.colorSpace // deprecated }; } } class EXRTexture2DLoader extends EXRLoader { load(url, onLoad, onProgress, onError) { const texture = new Texture2D(); super.load(url, textureData => { const { header, data, width, height, type, format, generateMipmaps, flipY, magFilter, minFilter, encoding } = textureData; texture.image = { data, width, height }; texture.type = type; texture.format = format; texture.generateMipmaps = generateMipmaps; texture.flipY = flipY; texture.magFilter = magFilter; texture.minFilter = minFilter; texture.encoding = encoding; texture.userData.exrInfo = { header }; texture.version++; onLoad && onLoad(texture); }, onProgress, onError); return texture; } } export { EXRLoader, EXRTexture2DLoader }; ================================================ FILE: examples/jsm/loaders/EnvLoader.js ================================================ import { Loader, FileLoader, TextureCube, ImageLoader, PIXEL_TYPE, PIXEL_FORMAT } from 't3d'; import { ImageBitmapLoader } from './ImageBitmapLoader.js'; import { RGBDDecoder } from '../textures/RGBDDecoder.js'; class EnvLoader extends Loader { constructor(manager) { super(manager); this._fileLoader = new FileLoader(manager); const userAgent = navigator.userAgent; const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent) === true; const safariMatch = userAgent.match(/Version\/(\d+)/); const safariVersion = isSafari && safariMatch ? parseInt(safariMatch[1], 10) : -1; const isFirefox = userAgent.indexOf('Firefox') > -1; const firefoxVersion = isFirefox ? userAgent.match(/Firefox\/([0-9]+)\./)[1] : -1; if (typeof createImageBitmap === 'undefined' || (isSafari && safariVersion < 17) || (isFirefox && firefoxVersion < 98)) { this._imageLoader = new ImageLoader(manager); } else { this._imageLoader = new ImageBitmapLoader(manager); } } load(url, onLoad, onProgress, onError) { this._fileLoader .setResponseType('arraybuffer') .setRequestHeader(this.requestHeader) .setPath(this.path) .setWithCredentials(this.withCredentials) .load(url, buffer => { this.parse(buffer).then(envData => { onLoad && onLoad(envData); }).catch(err => { onError && onError(err); }); }, onProgress, onError); } parse(buffer) { const headerByteLength = 8; const bufferView = new DataView(buffer); const version = bufferView.getUint32(0); const jsonByteLength = bufferView.getUint32(4); const jsonString = new TextDecoder().decode(buffer.slice(headerByteLength, headerByteLength + jsonByteLength)); const jsonData = JSON.parse(jsonString); const { imageSize, mipmaps } = jsonData; // Double checks the mipmaps length let mipmapsCount = Math.log(imageSize) * Math.LOG2E; mipmapsCount = Math.round(mipmapsCount) + 1; if (mipmaps.length !== 6 * mipmapsCount) { throw new Error(`EnvLoader: Unsupported mipmaps number "${mipmaps.length}".`); } const promises = mipmaps.map(mipmap => { const mipmapBuffer = new Uint8Array( buffer, headerByteLength + jsonByteLength + mipmap.position, mipmap.length ); const blob = new Blob([mipmapBuffer], { type: 'image/png' }); const url = URL.createObjectURL(blob); return this._imageLoader.loadAsync(url).then(image => { URL.revokeObjectURL(url); return image; }); }); return Promise.all(promises).then(images => ({ version, json: jsonData, images })); } } class EnvTextureCubeLoader extends EnvLoader { constructor(manager) { super(manager); this._rgbdDecoder = new RGBDDecoder(); this._renderer = null; } setRenderer(renderer) { this._renderer = renderer; return this; } load(url, onLoad, onProgress, onError) { const rgbdDecoder = this._rgbdDecoder; const renderer = this._renderer; if (!renderer) { throw new Error('EnvTextureCubeLoader: Renderer is not set.'); } const texture = new TextureCube(); super.load(url, ({ version, json, images }) => { const tempCubeTexture = new TextureCube(); tempCubeTexture.type = PIXEL_TYPE.UNSIGNED_BYTE; tempCubeTexture.format = PIXEL_FORMAT.RGBA; tempCubeTexture.generateMipmaps = false; const mipmapCount = images.length / 6; for (let level = 0; level < mipmapCount; level++) { const subImages = images.slice(level * 6, level * 6 + 6); if (level === 0) { tempCubeTexture.images = subImages; } tempCubeTexture.mipmaps.push(subImages); } tempCubeTexture.version++; rgbdDecoder.decode(renderer, tempCubeTexture, texture); tempCubeTexture.dispose(); // Attach the environment information to the texture texture.userData.envInfo = { version, json }; onLoad && onLoad(texture); }, onProgress, onError); return texture; } } export { EnvLoader, EnvTextureCubeLoader }; ================================================ FILE: examples/jsm/loaders/ImageBitmapLoader.js ================================================ import { Loader } from 't3d'; class ImageBitmapLoader extends Loader { constructor(manager) { super(manager); if (typeof createImageBitmap === 'undefined') { console.warn('ImageBitmapLoader: createImageBitmap() not supported.'); } if (typeof fetch === 'undefined') { console.warn('ImageBitmapLoader: fetch() not supported.'); } this.options = { premultiplyAlpha: 'none' }; } setOptions(options) { this.options = options; return this; } load(url, onLoad, _onProgress, onError) { if (url === undefined) url = ''; if (this.path !== undefined) url = this.path + url; url = this.manager.resolveURL(url); const scope = this; const fetchOptions = {}; fetchOptions.credentials = (this.crossOrigin === 'anonymous') ? 'same-origin' : 'include'; fetchOptions.headers = this.requestHeader; fetch(url, fetchOptions).then(function(res) { return res.blob(); }).then(function(blob) { return createImageBitmap(blob, Object.assign(scope.options, { colorSpaceConversion: 'none' })); }).then(function(imageBitmap) { if (onLoad) onLoad(imageBitmap); scope.manager.itemEnd(url); }).catch(function(e) { if (onError) onError(e); scope.manager.itemError(url); scope.manager.itemEnd(url); }); scope.manager.itemStart(url); } } export { ImageBitmapLoader }; ================================================ FILE: examples/jsm/loaders/KTX2Loader.js ================================================ import { Loader, FileLoader, TEXTURE_FILTER, PIXEL_FORMAT, PIXEL_TYPE, TEXEL_ENCODING_TYPE, Texture2D } from 't3d'; import { WorkerPool } from '../WorkerPool.js'; const _taskCache = new WeakMap(); let _activeLoaders = 0; let _ktxParser; let _zstdDecoder; let _zstd; class KTX2Loader extends Loader { constructor(manager) { super(manager); this.transcoderPath = ''; this.transcoderBinary = null; this.transcoderPending = null; this.workerPool = new WorkerPool(); this.workerSourceURL = ''; this.workerConfig = null; } static setKTXParser(ktxParser) { _ktxParser = ktxParser; setFORMAT_MAP(); setTYPE_MAP(); return this; } static setZSTDDecoder(zstdDecoder) { _zstdDecoder = zstdDecoder; return this; } setTranscoderPath(path) { this.transcoderPath = path; return this; } setWorkerLimit(num) { this.workerPool.setWorkerLimit(num); return this; } detectSupport(renderer) { const capabilities = renderer.capabilities; this.workerConfig = { astcSupported: capabilities.getExtension('WEBGL_compressed_texture_astc') ? true : false, astcHDRSupported: capabilities.getExtension('WEBGL_compressed_texture_astc') ? true : false, etc1Supported: capabilities.getExtension('WEBGL_compressed_texture_etc1') ? true : false, etc2Supported: capabilities.getExtension('WEBGL_compressed_texture_etc') ? true : false, dxtSupported: capabilities.getExtension('WEBGL_compressed_texture_s3tc') ? true : false, bptcSupported: capabilities.getExtension('EXT_texture_compression_bptc') ? true : false, pvrtcSupported: capabilities.getExtension('WEBGL_compressed_texture_pvrtc') ? true : false }; return this; } init() { if (!this.transcoderPending) { // Load transcoder wrapper. const jsLoader = new FileLoader(this.manager); jsLoader.setPath(this.transcoderPath); jsLoader.setWithCredentials(this.withCredentials); const jsContent = jsLoader.loadAsync('basis_transcoder.js'); // Load transcoder WASM binary. const binaryLoader = new FileLoader(this.manager); binaryLoader.setPath(this.transcoderPath); binaryLoader.setResponseType('arraybuffer'); binaryLoader.setWithCredentials(this.withCredentials); const binaryContent = binaryLoader.loadAsync('basis_transcoder.wasm'); this.transcoderPending = Promise.all([jsContent, binaryContent]) .then(([jsContent, binaryContent]) => { const fn = KTX2Loader.BasisWorker.toString(); const body = [ '/* constants */', 'let _EngineFormat = ' + JSON.stringify(KTX2Loader.EngineFormat), 'let _EngineType = ' + JSON.stringify(KTX2Loader.EngineType), 'let _TranscoderFormat = ' + JSON.stringify(KTX2Loader.TranscoderFormat), 'let _BasisFormat = ' + JSON.stringify(KTX2Loader.BasisFormat), '/* basis_transcoder.js */', jsContent, '/* worker */', fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}')) ].join('\n'); this.workerSourceURL = URL.createObjectURL(new Blob([body])); this.transcoderBinary = binaryContent; this.workerPool.setWorkerCreator(() => { const worker = new Worker(this.workerSourceURL); const transcoderBinary = this.transcoderBinary.slice(0); worker.postMessage({ type: 'init', config: this.workerConfig, transcoderBinary }, [transcoderBinary]); return worker; }); }); if (_activeLoaders > 0) { // Each instance loads a transcoder and allocates workers, increasing network and memory cost. console.warn( 'KTX2Loader: Multiple active KTX2 loaders may cause performance issues.' + ' Use a single KTX2Loader instance, or call .dispose() on old instances.' ); } _activeLoaders++; } return this.transcoderPending; } load(url, onLoad, onProgress, onError) { if (this.workerConfig === null) { throw new Error('KTX2Loader: Missing initialization with `.detectSupport(renderer)`.'); } const loader = new FileLoader(this.manager); loader.setResponseType('arraybuffer'); loader.setWithCredentials(this.withCredentials); loader.load(url, buffer => { // Check for an existing task using this buffer. A transferred buffer cannot be transferred // again from this thread. if (_taskCache.has(buffer)) { const cachedTask = _taskCache.get(buffer); return cachedTask.promise.then(onLoad).catch(onError); } this._createTextureData(buffer) .then(textureData => onLoad ? onLoad(textureData) : null) .catch(onError); }, onProgress, onError); } /** * @param {ArrayBuffer} buffer * @param {object?} config * @returns {Promise} */ async _createTextureData(buffer, config = {}) { const { read, VK_FORMAT_UNDEFINED, KHR_DF_FLAG_ALPHA_PREMULTIPLIED } = _ktxParser; const container = read(new Uint8Array(buffer)); const isBasisHDR = FORMAT_MAP[container.vkFormat] && container.dataFormatDescriptor[0].colorModel === 0xA7; const needsTranscoder = container.vkFormat === VK_FORMAT_UNDEFINED || isBasisHDR && !this.workerConfig.astcHDRSupported; if (!needsTranscoder) { return createTextureData(container); } const taskConfig = config; const texturePending = this.init().then(() => { return this.workerPool.postMessage({ type: 'transcode', buffer, taskConfig: taskConfig }, [buffer]); }).then(e => { const { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = e.data; if (messageType === 'error') return Promise.reject(error); const mipmaps = faces[0].mipmaps; const textureData = {}; textureData.faces = faces; textureData.layerCount = container.layerCount; textureData.image = container.layerCount > 1 ? { data: null, isCompressed: true, width: width, height: height, depth: container.layerCount } : { data: null, isCompressed: true, width: width, height: height }; textureData.mipmaps = mipmaps; textureData.format = format; textureData.type = type; textureData.minFilter = mipmaps.length === 1 ? TEXTURE_FILTER.LINEAR : TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; textureData.magFilter = TEXTURE_FILTER.LINEAR; textureData.generateMipmaps = false; textureData.encoding = parseTextureEncoding(container); textureData.premultiplyAlpha = !!(dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED); return textureData; }); // Cache the task result. _taskCache.set(buffer, { promise: texturePending }); return texturePending; } dispose() { this.workerPool.dispose(); if (this.workerSourceURL) URL.revokeObjectURL(this.workerSourceURL); _activeLoaders--; return this; } } /* CONSTANTS */ KTX2Loader.BasisFormat = { ETC1S: 0, UASTC_HDR: 2, UASTC_4x4: 1 }; KTX2Loader.TranscoderFormat = { ETC1: 0, ETC2: 1, BC1: 2, BC3: 3, BC4: 4, BC5: 5, BC7_M6_OPAQUE_ONLY: 6, BC7_M5: 7, PVRTC1_4_RGB: 8, PVRTC1_4_RGBA: 9, ASTC_4x4: 10, ATC_RGB: 11, ATC_RGBA_INTERPOLATED_ALPHA: 12, RGBA32: 13, RGB565: 14, BGR565: 15, RGBA4444: 16, BC6H: 22, RGB_HALF: 24, RGBA_HALF: 25 }; KTX2Loader.EngineFormat = { RGBAFormat: PIXEL_FORMAT.RGBA, RGBA_ASTC_4x4_Format: PIXEL_FORMAT.RGBA_ASTC_4x4, RGBA_BPTC_Format: PIXEL_FORMAT.RGBA_BPTC, // RGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format, TODO RGBA_PVRTC_4BPPV1_Format: PIXEL_FORMAT.RGBA_PVRTC_4BPPV1, RGBA_S3TC_DXT5_Format: PIXEL_FORMAT.RGBA_S3TC_DXT5, RGB_ETC1_Format: PIXEL_FORMAT.RGB_ETC1, // RGB_ETC2_Format: RGB_ETC2_Format, TODO RGB_PVRTC_4BPPV1_Format: PIXEL_FORMAT.RGB_PVRTC_4BPPV1, RGB_S3TC_DXT1_Format: PIXEL_FORMAT.RGB_S3TC_DXT1, RGB_BPTC_UNSIGNED_Format: PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT }; KTX2Loader.EngineType = { FloatType: 1507, HalfFloatType: 1508, UnsignedByteType: 1500 }; /* WEB WORKER */ KTX2Loader.BasisWorker = function() { let config; let transcoderPending; let BasisModule; const EngineFormat = _EngineFormat; // eslint-disable-line no-undef const TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef const BasisFormat = _BasisFormat; // eslint-disable-line no-undef const EngineType = _EngineType; // eslint-disable-line no-undef self.addEventListener('message', function(e) { const message = e.data; switch (message.type) { case 'init': config = message.config; init(message.transcoderBinary); break; case 'transcode': transcoderPending.then(() => { try { const { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode(message.buffer); self.postMessage({ type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers); } catch (error) { console.error(error); self.postMessage({ type: 'error', id: message.id, error: error.message }); } }); break; } }); function init(wasmBinary) { transcoderPending = new Promise(resolve => { BasisModule = { wasmBinary, onRuntimeInitialized: resolve }; BASIS(BasisModule); // eslint-disable-line no-undef }).then(() => { BasisModule.initializeBasis(); if (BasisModule.KTX2File === undefined) { console.warn('KTX2Loader: Please update Basis Universal transcoder.'); } }); } function transcode(buffer) { const ktx2File = new BasisModule.KTX2File(new Uint8Array(buffer)); function cleanup() { ktx2File.close(); ktx2File.delete(); } if (!ktx2File.isValid()) { cleanup(); throw new Error('KTX2Loader: Invalid or unsupported .ktx2 file'); } let basisFormat; if (ktx2File.isUASTC()) { basisFormat = BasisFormat.UASTC_4x4; } else if (ktx2File.isETC1S()) { basisFormat = BasisFormat.ETC1S; } else if (ktx2File.isHDR()) { basisFormat = BasisFormat.UASTC_HDR; } else { throw new Error('T3D.KTX2Loader: Unknown Basis encoding'); } const width = ktx2File.getWidth(); const height = ktx2File.getHeight(); const layerCount = ktx2File.getLayers() || 1; const levelCount = ktx2File.getLevels(); const faceCount = ktx2File.getFaces(); const hasAlpha = ktx2File.getHasAlpha(); const dfdFlags = ktx2File.getDFDFlags(); const { transcoderFormat, engineFormat, engineType } = getTranscoderFormat(basisFormat, width, height, hasAlpha); if (!width || !height || !levelCount) { cleanup(); throw new Error('KTX2Loader: Invalid texture'); } if (!ktx2File.startTranscoding()) { cleanup(); throw new Error('KTX2Loader: .startTranscoding failed'); } const faces = []; const buffers = []; for (let face = 0; face < faceCount; face++) { const mipmaps = []; for (let mip = 0; mip < levelCount; mip++) { const layerMips = []; let mipWidth, mipHeight; for (let layer = 0; layer < layerCount; layer++) { const levelInfo = ktx2File.getImageLevelInfo(mip, layer, face); if (face === 0 && mip === 0 && layer === 0 && (levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0)) { console.warn('KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.'); } if (levelCount > 1) { mipWidth = levelInfo.origWidth; mipHeight = levelInfo.origHeight; } else { // refer to: github.com/mrdoob/three.js/issues/25908 mipWidth = levelInfo.width; mipHeight = levelInfo.height; } let dst = new Uint8Array(ktx2File.getImageTranscodedSizeInBytes(mip, layer, 0, transcoderFormat)); const status = ktx2File.transcodeImage(dst, mip, layer, face, transcoderFormat, 0, -1, -1); if (engineType === EngineType.HalfFloatType) { dst = new Uint16Array(dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT); } if (!status) { cleanup(); throw new Error('KTX2Loader: .transcodeImage failed.'); } layerMips.push(dst); } const mipData = concat(layerMips); mipmaps.push({ data: mipData, width: mipWidth, height: mipHeight }); buffers.push(mipData.buffer); } faces.push({ mipmaps, width, height, format: engineFormat, type: engineType }); } cleanup(); return { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType }; } // // Optimal choice of a transcoder target format depends on the Basis format (ETC1S or UASTC), // device capabilities, and texture dimensions. The list below ranks the formats separately // for ETC1S and UASTC. // // In some cases, transcoding UASTC to RGBA32 might be preferred for higher quality (at // significant memory cost) compared to ETC1/2, BC1/3, and PVRTC. The transcoder currently // chooses RGBA32 only as a last resort and does not expose that option to the caller. const FORMAT_OPTIONS = [ { if: 'astcSupported', basisFormat: [BasisFormat.UASTC_4x4], transcoderFormat: [TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4], engineFormat: [EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format], engineType: [EngineType.UnsignedByteType], priorityETC1S: Infinity, priorityUASTC: 1, needsPowerOfTwo: false }, { if: 'bptcSupported', basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4], transcoderFormat: [TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5], engineFormat: [EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format], engineType: [EngineType.UnsignedByteType], priorityETC1S: 3, priorityUASTC: 2, needsPowerOfTwo: false }, { if: 'dxtSupported', basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4], transcoderFormat: [TranscoderFormat.BC1, TranscoderFormat.BC3], engineFormat: [EngineFormat.RGB_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format], engineType: [EngineType.UnsignedByteType], priorityETC1S: 4, priorityUASTC: 5, needsPowerOfTwo: false }, { if: 'etc2Supported', basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4], transcoderFormat: [TranscoderFormat.ETC1, TranscoderFormat.ETC2], engineFormat: [EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format], engineType: [EngineType.UnsignedByteType], priorityETC1S: 1, priorityUASTC: 3, needsPowerOfTwo: false }, { if: 'etc1Supported', basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4], transcoderFormat: [TranscoderFormat.ETC1], engineFormat: [EngineFormat.RGB_ETC1_Format], engineType: [EngineType.UnsignedByteType], priorityETC1S: 2, priorityUASTC: 4, needsPowerOfTwo: false }, { if: 'pvrtcSupported', basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4], transcoderFormat: [TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA], engineFormat: [EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format], engineType: [EngineType.HalfFloatType], priorityETC1S: 5, priorityUASTC: 6, needsPowerOfTwo: true }, { if: 'bptcSupported', basisFormat: [BasisFormat.UASTC_HDR], transcoderFormat: [TranscoderFormat.BC6H], engineFormat: [EngineFormat.RGB_BPTC_UNSIGNED_Format], engineType: [EngineType.HalfFloatType], priorityHDR: 1, needsPowerOfTwo: false }, // Uncompressed fallbacks. { basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4], transcoderFormat: [TranscoderFormat.RGBA32, TranscoderFormat.RGBA32], engineFormat: [EngineFormat.RGBAFormat, EngineFormat.RGBAFormat], engineType: [EngineType.UnsignedByteType, EngineType.UnsignedByteType], priorityETC1S: 100, priorityUASTC: 100, needsPowerOfTwo: false } ]; const OPTIONS = { [BasisFormat.ETC1S]: FORMAT_OPTIONS .filter(opt => opt.basisFormat.includes(BasisFormat.ETC1S)) .sort((a, b) => a.priorityETC1S - b.priorityETC1S), [BasisFormat.UASTC_4x4]: FORMAT_OPTIONS .filter(opt => opt.basisFormat.includes(BasisFormat.UASTC_4x4)) .sort((a, b) => a.priorityUASTC - b.priorityUASTC), [BasisFormat.UASTC_HDR]: FORMAT_OPTIONS .filter(opt => opt.basisFormat.includes(BasisFormat.UASTC_HDR)) .sort((a, b) => a.priorityHDR - b.priorityHDR) }; function getTranscoderFormat(basisFormat, width, height, hasAlpha) { let transcoderFormat; let engineFormat; let engineType; const options = OPTIONS[basisFormat]; for (let i = 0; i < options.length; i++) { const opt = options[i]; if (opt.if && !config[opt.if]) continue; if (!opt.basisFormat.includes(basisFormat)) continue; if (hasAlpha && opt.transcoderFormat.length < 2) continue; if (opt.needsPowerOfTwo && !(isPowerOfTwo(width) && isPowerOfTwo(height))) continue; transcoderFormat = opt.transcoderFormat[hasAlpha ? 1 : 0]; engineFormat = opt.engineFormat[hasAlpha ? 1 : 0]; engineType = opt.engineType[0]; return { transcoderFormat, engineFormat, engineType }; } console.warn('KTX2Loader: No suitable compressed texture format found. Decoding to RGBA32.'); transcoderFormat = TranscoderFormat.RGBA32; engineFormat = EngineFormat.RGBAFormat; engineType = EngineType.UnsignedByteType; return { transcoderFormat, engineFormat, engineType }; } function isPowerOfTwo(value) { if (value <= 2) return true; return (value & (value - 1)) === 0 && value !== 0; } // Concatenates N byte arrays. function concat(arrays) { if (arrays.length === 1) return arrays[0]; let totalByteLength = 0; for (const array of arrays) { totalByteLength += array.byteLength; } const result = new Uint8Array(totalByteLength); let byteOffset = 0; for (const array of arrays) { result.set(array, byteOffset); byteOffset += array.byteLength; } return result; } }; // // Parsing for non-Basis textures. These textures are may have supercompression // like Zstd, but they do not require transcoding. const UNCOMPRESSED_FORMATS = new Set([PIXEL_FORMAT.RGBA, PIXEL_FORMAT.RG, PIXEL_FORMAT.Red]); let FORMAT_MAP = {}; function setFORMAT_MAP() { FORMAT_MAP = { [_ktxParser.VK_FORMAT_R32G32B32A32_SFLOAT]: PIXEL_FORMAT.RGBA, [_ktxParser.VK_FORMAT_R16G16B16A16_SFLOAT]: PIXEL_FORMAT.RGBA, [_ktxParser.VK_FORMAT_R8G8B8A8_UNORM]: PIXEL_FORMAT.RGBA, [_ktxParser.VK_FORMAT_R8G8B8A8_SRGB]: PIXEL_FORMAT.RGBA, [_ktxParser.VK_FORMAT_R32G32_SFLOAT]: PIXEL_FORMAT.RG, [_ktxParser.VK_FORMAT_R16G16_SFLOAT]: PIXEL_FORMAT.RG, [_ktxParser.VK_FORMAT_R8G8_UNORM]: PIXEL_FORMAT.RG, [_ktxParser.VK_FORMAT_R8G8_SRGB]: PIXEL_FORMAT.RG, [_ktxParser.VK_FORMAT_R32_SFLOAT]: PIXEL_FORMAT.Red, [_ktxParser.VK_FORMAT_R16_SFLOAT]: PIXEL_FORMAT.Red, [_ktxParser.VK_FORMAT_R8_SRGB]: PIXEL_FORMAT.Red, [_ktxParser.VK_FORMAT_R8_UNORM]: PIXEL_FORMAT.Red, [_ktxParser.VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT]: PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT // TODO: support ASTC formats }; } let TYPE_MAP = {}; function setTYPE_MAP() { TYPE_MAP = { [_ktxParser.VK_FORMAT_R32G32B32A32_SFLOAT]: PIXEL_TYPE.FLOAT, [_ktxParser.VK_FORMAT_R16G16B16A16_SFLOAT]: PIXEL_TYPE.HALF_FLOAT, [_ktxParser.VK_FORMAT_R8G8B8A8_UNORM]: PIXEL_TYPE.UNSIGNED_BYTE, [_ktxParser.VK_FORMAT_R8G8B8A8_SRGB]: PIXEL_TYPE.UNSIGNED_BYTE, [_ktxParser.VK_FORMAT_R32G32_SFLOAT]: PIXEL_TYPE.FLOAT, [_ktxParser.VK_FORMAT_R16G16_SFLOAT]: PIXEL_TYPE.HALF_FLOAT, [_ktxParser.VK_FORMAT_R8G8_UNORM]: PIXEL_TYPE.UNSIGNED_BYTE, [_ktxParser.VK_FORMAT_R8G8_SRGB]: PIXEL_TYPE.UNSIGNED_BYTE, [_ktxParser.VK_FORMAT_R32_SFLOAT]: PIXEL_TYPE.FLOAT, [_ktxParser.VK_FORMAT_R16_SFLOAT]: PIXEL_TYPE.HALF_FLOAT, [_ktxParser.VK_FORMAT_R8_SRGB]: PIXEL_TYPE.UNSIGNED_BYTE, [_ktxParser.VK_FORMAT_R8_UNORM]: PIXEL_TYPE.UNSIGNED_BYTE, [_ktxParser.VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT]: PIXEL_TYPE.HALF_FLOAT }; } async function createTextureData(container) { const { vkFormat, pixelWidth, pixelHeight, pixelDepth } = container; if (FORMAT_MAP[vkFormat] === undefined) { throw new Error('KTX2Loader: Unsupported vkFormat.'); } let isCompressed = true; if (UNCOMPRESSED_FORMATS.has(FORMAT_MAP[vkFormat])) { isCompressed = false; } // if (container.supercompressionScheme === _ktxParser.KHR_SUPERCOMPRESSION_ZSTD) { if (!_zstd) { if (!_zstdDecoder) { throw new Error('KTX2Loader: ZSTDDecoder not set.'); } _zstd = new _zstdDecoder(); await _zstd.init(); } } // const mipmaps = []; for (let levelIndex = 0; levelIndex < container.levels.length; levelIndex++) { const levelWidth = Math.max(1, pixelWidth >> levelIndex); const levelHeight = Math.max(1, pixelHeight >> levelIndex); const levelDepth = pixelDepth ? Math.max(1, pixelDepth >> levelIndex) : 0; const level = container.levels[levelIndex]; let levelData; if (container.supercompressionScheme === _ktxParser.KHR_SUPERCOMPRESSION_NONE) { levelData = level.levelData; } else if (container.supercompressionScheme === _ktxParser.KHR_SUPERCOMPRESSION_ZSTD) { levelData = _zstd.decode(level.levelData, level.uncompressedByteLength); } else { throw new Error('KTX2Loader: Unsupported supercompressionScheme.'); } let data; if (TYPE_MAP[vkFormat] === PIXEL_TYPE.FLOAT) { data = new Float32Array( levelData.buffer, levelData.byteOffset, levelData.byteLength / Float32Array.BYTES_PER_ELEMENT ); } else if (TYPE_MAP[vkFormat] === PIXEL_TYPE.HALF_FLOAT) { data = new Uint16Array( levelData.buffer, levelData.byteOffset, levelData.byteLength / Uint16Array.BYTES_PER_ELEMENT ); } else { data = levelData; } mipmaps.push({ data, isCompressed, width: levelWidth, height: levelHeight, depth: levelDepth }); } const textureData = {}; textureData.image = mipmaps[0]; textureData.mipmaps = mipmaps.length > 1 ? mipmaps : []; textureData.type = TYPE_MAP[vkFormat]; textureData.format = FORMAT_MAP[vkFormat]; textureData.minFilter = mipmaps.length > 1 ? TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR : TEXTURE_FILTER.LINEAR; textureData.magFilter = TEXTURE_FILTER.LINEAR; textureData.generateMipmaps = false; textureData.encoding = parseTextureEncoding(container); textureData.premultiplyAlpha = false; return Promise.resolve(textureData); } function parseTextureEncoding(container) { const { KHR_DF_PRIMARIES_BT709, KHR_DF_TRANSFER_SRGB, KHR_DF_PRIMARIES_DISPLAYP3, KHR_DF_PRIMARIES_UNSPECIFIED } = _ktxParser; const dfd = container.dataFormatDescriptor[0]; if (dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709) { return dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? TEXEL_ENCODING_TYPE.SRGB : TEXEL_ENCODING_TYPE.LINEAR; } else if (dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3) { console.warn('KTX2Loader: DisplayP3 encoding is not supported.'); return dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? TEXEL_ENCODING_TYPE.SRGB : TEXEL_ENCODING_TYPE.LINEAR; } else if (dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED) { return TEXEL_ENCODING_TYPE.LINEAR; } else { console.warn(`KTX2Loader: Unsupported color primaries, "${dfd.colorPrimaries}"`); return TEXEL_ENCODING_TYPE.LINEAR; } } class KTX2TextureLoader extends KTX2Loader { constructor(manager) { super(manager); } load(url, onLoad, onProgress, onError) { super.load(url, textureData => { const texture = new Texture2D(); // TODO Texture3D or Texture2DArray // TODO TextureCube texture.image = textureData.image; texture.mipmaps = textureData.mipmaps; texture.type = textureData.type; texture.format = textureData.format; texture.minFilter = textureData.minFilter; texture.magFilter = textureData.magFilter; texture.generateMipmaps = textureData.generateMipmaps; texture.encoding = textureData.encoding; texture.premultiplyAlpha = textureData.premultiplyAlpha; texture.flipY = false; texture.version++; onLoad && onLoad(texture); }, onProgress, onError); } } export { KTX2Loader, KTX2TextureLoader }; ================================================ FILE: examples/jsm/loaders/PVRLoader.js ================================================ import { Loader, FileLoader, PIXEL_FORMAT, Texture2D, TEXTURE_FILTER, TextureCube } from 't3d'; class PVRLoader extends Loader { load(url, onLoad, onProgress, onError) { new FileLoader(this.manager) .setResponseType('arraybuffer') .setRequestHeader(this.requestHeader) .setPath(this.path) .setWithCredentials(this.withCredentials) .load(url, buffer => { onLoad && onLoad(this.parse(buffer, true)); }, onProgress, onError); } parse(buffer, loadMipmaps) { const headerLengthInt = 13; const header = new Uint32Array(buffer, 0, headerLengthInt); const pvrDatas = { buffer: buffer, header: header, loadMipmaps: loadMipmaps }; if (header[0] === 0x03525650) { // PVR v3 return _parseV3(pvrDatas); } else if (header[11] === 0x21525650) { // PVR v2 return _parseV2(pvrDatas); } else { console.error('PVRLoader: Unknown PVR format.'); } } } function _parseV3(pvrDatas) { const header = pvrDatas.header; let bpp, format; const metaLen = header[12], pixelFormat = header[2], height = header[6], width = header[7], // numSurfs = header[ 9 ], numFaces = header[10], numMipmaps = header[11]; switch (pixelFormat) { case 0: // PVRTC 2bpp RGB bpp = 2; format = PIXEL_FORMAT.RGB_PVRTC_2BPPV1; break; case 1: // PVRTC 2bpp RGBA bpp = 2; format = PIXEL_FORMAT.RGBA_PVRTC_2BPPV1; break; case 2: // PVRTC 4bpp RGB bpp = 4; format = PIXEL_FORMAT.RGB_PVRTC_4BPPV1; break; case 3: // PVRTC 4bpp RGBA bpp = 4; format = PIXEL_FORMAT.RGBA_PVRTC_4BPPV1; break; default: console.error('PVRLoader: Unsupported PVR format:', pixelFormat); } pvrDatas.dataPtr = 52 + metaLen; pvrDatas.bpp = bpp; pvrDatas.format = format; pvrDatas.width = width; pvrDatas.height = height; pvrDatas.numSurfaces = numFaces; pvrDatas.numMipmaps = numMipmaps; pvrDatas.isCubemap = (numFaces === 6); return _extract(pvrDatas); } function _parseV2(pvrDatas) { const header = pvrDatas.header; const headerLength = header[0], height = header[1], width = header[2], numMipmaps = header[3], flags = header[4], // dataLength = header[ 5 ], // bpp = header[ 6 ], // bitmaskRed = header[ 7 ], // bitmaskGreen = header[ 8 ], // bitmaskBlue = header[ 9 ], bitmaskAlpha = header[10], // pvrTag = header[ 11 ], numSurfs = header[12]; const TYPE_MASK = 0xff; const PVRTC_2 = 24, PVRTC_4 = 25; const formatFlags = flags & TYPE_MASK; let bpp, format; const _hasAlpha = bitmaskAlpha > 0; if (formatFlags === PVRTC_4) { format = _hasAlpha ? PIXEL_FORMAT.RGBA_PVRTC_4BPPV1 : PIXEL_FORMAT.RGB_PVRTC_4BPPV1; bpp = 4; } else if (formatFlags === PVRTC_2) { format = _hasAlpha ? PIXEL_FORMAT.RGBA_PVRTC_2BPPV1 : PIXEL_FORMAT.RGB_PVRTC_2BPPV1; bpp = 2; } else { console.error('PVRLoader: Unknown PVR format:', formatFlags); } pvrDatas.dataPtr = headerLength; pvrDatas.bpp = bpp; pvrDatas.format = format; pvrDatas.width = width; pvrDatas.height = height; pvrDatas.numSurfaces = numSurfs; pvrDatas.numMipmaps = numMipmaps + 1; // guess cubemap type seems tricky in v2 // it juste a pvr containing 6 surface (no explicit cubemap type) pvrDatas.isCubemap = (numSurfs === 6); return _extract(pvrDatas); } function _extract(pvrDatas) { const pvr = { mipmaps: [], width: pvrDatas.width, height: pvrDatas.height, format: pvrDatas.format, mipmapCount: pvrDatas.numMipmaps, isCubemap: pvrDatas.isCubemap }; const buffer = pvrDatas.buffer; let dataOffset = pvrDatas.dataPtr, dataSize = 0, blockSize = 0, blockWidth = 0, blockHeight = 0, widthBlocks = 0, heightBlocks = 0; const bpp = pvrDatas.bpp, numSurfs = pvrDatas.numSurfaces; if (bpp === 2) { blockWidth = 8; blockHeight = 4; } else { blockWidth = 4; blockHeight = 4; } blockSize = (blockWidth * blockHeight) * bpp / 8; pvr.mipmaps.length = pvrDatas.numMipmaps * numSurfs; let mipLevel = 0; while (mipLevel < pvrDatas.numMipmaps) { const sWidth = pvrDatas.width >> mipLevel, sHeight = pvrDatas.height >> mipLevel; widthBlocks = sWidth / blockWidth; heightBlocks = sHeight / blockHeight; // Clamp to minimum number of blocks if (widthBlocks < 2) widthBlocks = 2; if (heightBlocks < 2) heightBlocks = 2; dataSize = widthBlocks * heightBlocks * blockSize; for (let surfIndex = 0; surfIndex < numSurfs; surfIndex++) { const byteArray = new Uint8Array(buffer, dataOffset, dataSize); const mipmap = { data: byteArray, width: sWidth, height: sHeight }; pvr.mipmaps[surfIndex * pvrDatas.numMipmaps + mipLevel] = mipmap; dataOffset += dataSize; } mipLevel++; } return pvr; } class PVRTextureLoader extends PVRLoader { load(url, onLoad, onProgress, onError) { super.load(url, textureData => { const { mipmaps, width, height, format, mipmapCount, isCubemap } = textureData; let texture; if (isCubemap) { texture = new TextureCube(); const faces = mipmaps.length / mipmapCount; for (let f = 0; f < faces; f++) { texture.images[f] = { data: mipmaps[f * mipmapCount], width, height, isCompressed: true }; } for (let i = 0; i < mipmapCount; i++) { texture.mipmaps[i] = []; for (let f = 0; f < faces; f++) { texture.mipmaps[i].push(mipmaps[f * mipmapCount + i]); } } } else { texture = new Texture2D(); texture.image = { data: mipmaps[0].data, width, height, isCompressed: true }; texture.mipmaps = mipmaps; } texture.minFilter = mipmapCount === 1 ? TEXTURE_FILTER.LINEAR : TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; texture.magFilter = TEXTURE_FILTER.LINEAR; texture.format = format; // no flipping for cube textures // (also flipping doesn't work for compressed textures ) texture.flipY = false; // can't generate mipmaps for compressed textures // mips must be embedded in DDS files texture.generateMipmaps = false; texture.version++; onLoad && onLoad(texture); }, onProgress, onError); } } export { PVRLoader, PVRTextureLoader }; ================================================ FILE: examples/jsm/loaders/RGBELoader.js ================================================ import { Loader, FileLoader, PIXEL_TYPE, PIXEL_FORMAT, TEXTURE_FILTER, Texture2D, TextureCube, MathUtils } from 't3d'; class RGBELoader extends Loader { constructor(manager) { super(manager); this.type = PIXEL_TYPE.HALF_FLOAT; } load(url, onLoad, onProgress, onError) { new FileLoader(this.manager) .setResponseType('arraybuffer') .setRequestHeader(this.requestHeader) .setPath(this.path) .setWithCredentials(this.withCredentials) .load(url, buffer => { onLoad && onLoad(this.parse(buffer)); }, onProgress, onError); } // adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html parse(buffer) { const byteArray = new Uint8Array(buffer); byteArray.pos = 0; const rgbe_header_info = RGBE_ReadHeader(byteArray); const w = rgbe_header_info.width, h = rgbe_header_info.height, image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h); let data, type; let numElements; if (this.type === PIXEL_TYPE.FLOAT) { numElements = image_rgba_data.length / 4; const floatArray = new Float32Array(numElements * 4); for (let j = 0; j < numElements; j++) { RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4); } data = floatArray; type = PIXEL_TYPE.FLOAT; } else if (this.type === PIXEL_TYPE.HALF_FLOAT) { numElements = image_rgba_data.length / 4; const halfArray = new Uint16Array(numElements * 4); for (let j = 0; j < numElements; j++) { RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4); } data = halfArray; type = PIXEL_TYPE.HALF_FLOAT; } else if (this.type === PIXEL_TYPE.UNSIGNED_BYTE) { data = image_rgba_data; // just copy type = PIXEL_TYPE.UNSIGNED_BYTE; } else { console.error('RGBELoader: unsupported type: ', this.type); } const floatType = (type === PIXEL_TYPE.FLOAT) || (type === PIXEL_TYPE.HALF_FLOAT); return { header: rgbe_header_info.string, gamma: rgbe_header_info.gamma, exposure: rgbe_header_info.exposure, width: w, height: h, data: data, type: type, generateMipmaps: !floatType, flipY: floatType, minFilter: floatType ? TEXTURE_FILTER.LINEAR : TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR, magFilter: TEXTURE_FILTER.LINEAR, format: PIXEL_FORMAT.RGBA, // deprecated internalformat: null // deprecated }; } } const /* default error routine. change this to change error handling */ rgbe_read_error = 1, rgbe_write_error = 2, rgbe_format_error = 3, rgbe_memory_error = 4, rgbe_error = function(rgbe_error_code, msg) { switch (rgbe_error_code) { case rgbe_read_error: throw new Error('RGBELoader: Read Error: ' + (msg || '')); case rgbe_write_error: throw new Error('RGBELoader: Write Error: ' + (msg || '')); case rgbe_format_error: throw new Error('RGBELoader: Bad File Format: ' + (msg || '')); default: case rgbe_memory_error: throw new Error('RGBELoader: Memory Error: ' + (msg || '')); } }, /* offsets to red, green, and blue components in a data (float) pixel */ // RGBE_DATA_RED = 0, // RGBE_DATA_GREEN = 1, // RGBE_DATA_BLUE = 2, /* number of floats per pixel, use 4 since stored in rgba image format */ // RGBE_DATA_SIZE = 4, /* flags indicating which fields in an rgbe_header_info are valid */ RGBE_VALID_PROGRAMTYPE = 1, RGBE_VALID_FORMAT = 2, RGBE_VALID_DIMENSIONS = 4, NEWLINE = '\n', fgets = function(buffer, lineLimit, consume) { const chunkSize = 128; lineLimit = !lineLimit ? 1024 : lineLimit; let p = buffer.pos, i = -1, len = 0, s = '', chunk = String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize))); while ((0 > (i = chunk.indexOf(NEWLINE))) && (len < lineLimit) && (p < buffer.byteLength)) { s += chunk; len += chunk.length; p += chunkSize; chunk += String.fromCharCode.apply(null, new Uint16Array(buffer.subarray(p, p + chunkSize))); } if (-1 < i) { /* for (i=l-1; i>=0; i--) { byteCode = m.charCodeAt(i); if (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++; else if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2; if (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate } */ if (false !== consume) buffer.pos += len + i + 1; return s + chunk.slice(0, i); } return false; }, /* minimal header reading. modify if you want to parse more information */ RGBE_ReadHeader = function(buffer) { // regexes to parse header info fields const magic_token_re = /^#\?(\S+)$/, gamma_re = /^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/, exposure_re = /^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/, format_re = /^\s*FORMAT=(\S+)\s*$/, dimensions_re = /^\s*-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/, // RGBE format header struct header = { valid: 0, /* indicate which fields are valid */ string: '', /* the actual header string */ comments: '', /* comments found in header */ programtype: 'RGBE', /* listed at beginning of file to identify it after "#?". defaults to "RGBE" */ format: '', /* RGBE format, default 32-bit_rle_rgbe */ gamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */ exposure: 1.0, /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */ width: 0, height: 0 /* image dimensions, width/height */ }; let line, match; if (buffer.pos >= buffer.byteLength || !(line = fgets(buffer))) { return rgbe_error(rgbe_read_error, 'no header found'); } /* if you want to require the magic token then uncomment the next line */ if (!(match = line.match(magic_token_re))) { return rgbe_error(rgbe_format_error, 'bad initial token'); } header.valid |= RGBE_VALID_PROGRAMTYPE; header.programtype = match[1]; header.string += line + '\n'; while (true) { line = fgets(buffer); if (false === line) break; header.string += line + '\n'; if ('#' === line.charAt(0)) { header.comments += line + '\n'; continue; // comment line } match = line.match(gamma_re); if (match) { header.gamma = parseFloat(match[1]); } match = line.match(exposure_re); if (match) { header.exposure = parseFloat(match[1]); } match = line.match(format_re); if (match) { header.valid |= RGBE_VALID_FORMAT; header.format = match[1];// '32-bit_rle_rgbe'; } match = line.match(dimensions_re); if (match) { header.valid |= RGBE_VALID_DIMENSIONS; header.height = parseInt(match[1], 10); header.width = parseInt(match[2], 10); } if ((header.valid & RGBE_VALID_FORMAT) && (header.valid & RGBE_VALID_DIMENSIONS)) break; } if (!(header.valid & RGBE_VALID_FORMAT)) { return rgbe_error(rgbe_format_error, 'missing format specifier'); } if (!(header.valid & RGBE_VALID_DIMENSIONS)) { return rgbe_error(rgbe_format_error, 'missing image size specifier'); } return header; }, RGBE_ReadPixels_RLE = function(buffer, w, h) { const scanline_width = w; if ( // run length encoding is not allowed so read flat ((scanline_width < 8) || (scanline_width > 0x7fff)) || // this file is not run length encoded ((2 !== buffer[0]) || (2 !== buffer[1]) || (buffer[2] & 0x80)) ) { // return the flat buffer return new Uint8Array(buffer); } if (scanline_width !== ((buffer[2] << 8) | buffer[3])) { return rgbe_error(rgbe_format_error, 'wrong scanline width'); } const data_rgba = new Uint8Array(4 * w * h); if (!data_rgba.length) { return rgbe_error(rgbe_memory_error, 'unable to allocate buffer space'); } let offset = 0, pos = 0; const ptr_end = 4 * scanline_width; const rgbeStart = new Uint8Array(4); const scanline_buffer = new Uint8Array(ptr_end); let num_scanlines = h; // read in each successive scanline while ((num_scanlines > 0) && (pos < buffer.byteLength)) { if (pos + 4 > buffer.byteLength) { return rgbe_error(rgbe_read_error); } rgbeStart[0] = buffer[pos++]; rgbeStart[1] = buffer[pos++]; rgbeStart[2] = buffer[pos++]; rgbeStart[3] = buffer[pos++]; if ((2 != rgbeStart[0]) || (2 != rgbeStart[1]) || (((rgbeStart[2] << 8) | rgbeStart[3]) != scanline_width)) { return rgbe_error(rgbe_format_error, 'bad rgbe scanline format'); } // read each of the four channels for the scanline into the buffer // first red, then green, then blue, then exponent let ptr = 0, count; while ((ptr < ptr_end) && (pos < buffer.byteLength)) { count = buffer[pos++]; const isEncodedRun = count > 128; if (isEncodedRun) count -= 128; if ((0 === count) || (ptr + count > ptr_end)) { return rgbe_error(rgbe_format_error, 'bad scanline data'); } if (isEncodedRun) { // a (encoded) run of the same value const byteValue = buffer[pos++]; for (let i = 0; i < count; i++) { scanline_buffer[ptr++] = byteValue; } // ptr += count; } else { // a literal-run scanline_buffer.set(buffer.subarray(pos, pos + count), ptr); ptr += count; pos += count; } } // now convert data from buffer into rgba // first red, then green, then blue, then exponent (alpha) const l = scanline_width; // scanline_buffer.byteLength; for (let i = 0; i < l; i++) { let off = 0; data_rgba[offset] = scanline_buffer[i + off]; off += scanline_width; // 1; data_rgba[offset + 1] = scanline_buffer[i + off]; off += scanline_width; // 1; data_rgba[offset + 2] = scanline_buffer[i + off]; off += scanline_width; // 1; data_rgba[offset + 3] = scanline_buffer[i + off]; offset += 4; } num_scanlines--; } return data_rgba; }; const RGBEByteToRGBFloat = function(sourceArray, sourceOffset, destArray, destOffset) { const e = sourceArray[sourceOffset + 3]; const scale = Math.pow(2.0, e - 128.0) / 255.0; destArray[destOffset + 0] = sourceArray[sourceOffset + 0] * scale; destArray[destOffset + 1] = sourceArray[sourceOffset + 1] * scale; destArray[destOffset + 2] = sourceArray[sourceOffset + 2] * scale; destArray[destOffset + 3] = 1; }; const RGBEByteToRGBHalf = function(sourceArray, sourceOffset, destArray, destOffset) { const e = sourceArray[sourceOffset + 3]; const scale = Math.pow(2.0, e - 128.0) / 255.0; // clamping to 65504, the maximum representable value in float16 destArray[destOffset + 0] = MathUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 0] * scale, 65504)); destArray[destOffset + 1] = MathUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 1] * scale, 65504)); destArray[destOffset + 2] = MathUtils.toHalfFloat(Math.min(sourceArray[sourceOffset + 2] * scale, 65504)); destArray[destOffset + 3] = MathUtils.toHalfFloat(1); }; class RGBETexture2DLoader extends RGBELoader { load(url, onLoad, onProgress, onError) { const texture = new Texture2D(); super.load(url, textureData => { const { header, gamma, exposure, data, width, height, type, generateMipmaps, flipY, magFilter, minFilter } = textureData; texture.image = { data, width, height }; texture.type = type; texture.generateMipmaps = generateMipmaps; texture.flipY = flipY; texture.magFilter = magFilter; texture.minFilter = minFilter; texture.userData.rgbeInfo = { header, gamma, exposure }; texture.version++; onLoad && onLoad(texture); }, onProgress, onError); return texture; } } class RGBETextureCubeLoader extends RGBELoader { load(urls, onLoad, _onProgress, onError) { const texture = new TextureCube(); const promiseArray = []; for (let i = 0; i < 6; i++) { promiseArray.push(new Promise((resolve, reject) => { super.load(urls[i], resolve, undefined, reject); })); } Promise.all(promiseArray).then(textureDatas => { for (let i = 0; i < 6; i++) { texture.images.push({ data: textureDatas[i].data, width: textureDatas[i].width, height: textureDatas[i].height }); } const { type, generateMipmaps, magFilter, minFilter } = textureDatas[0]; texture.type = type; texture.generateMipmaps = generateMipmaps; // texture.flipY = flipY; texture.magFilter = magFilter; texture.minFilter = minFilter; texture.version++; onLoad && onLoad(texture); }).catch(e => { onError && onError(e); }); return texture; } } export { RGBELoader, RGBETexture2DLoader, RGBETextureCubeLoader }; ================================================ FILE: examples/jsm/loaders/TGALoader.js ================================================ import { Loader, FileLoader, TEXTURE_FILTER, Texture2D, TextureCube } from 't3d'; class TGALoader extends Loader { load(url, onLoad, onProgress, onError) { new FileLoader(this.manager) .setResponseType('arraybuffer') .setRequestHeader(this.requestHeader) .setPath(this.path) .setWithCredentials(this.withCredentials) .load(url, buffer => { onLoad && onLoad(this.parse(buffer, true)); }, onProgress, onError); } parse(buffer) { // reference from vthibault, https://github.com/vthibault/roBrowser/blob/master/src/Loaders/Targa.js function tgaCheckHeader(header) { switch (header.image_type) { // Check indexed type case TGA_TYPE_INDEXED: case TGA_TYPE_RLE_INDEXED: if (header.colormap_length > 256 || header.colormap_size !== 24 || header.colormap_type !== 1) { console.error('TGALoader: Invalid type colormap data for indexed type.'); } break; // Check colormap type case TGA_TYPE_RGB: case TGA_TYPE_GREY: case TGA_TYPE_RLE_RGB: case TGA_TYPE_RLE_GREY: if (header.colormap_type) { console.error('TGALoader: Invalid type colormap data for colormap type.'); } break; // What the need of a file without data ? case TGA_TYPE_NO_DATA: console.error('TGALoader: No data.'); break; // Invalid type ? default: console.error('TGALoader: Invalid type ' + header.image_type); } // Check image width and height if (header.width <= 0 || header.height <= 0) { console.error('TGALoader: Invalid image size.'); } // Check image pixel size if (header.pixel_size !== 8 && header.pixel_size !== 16 && header.pixel_size !== 24 && header.pixel_size !== 32) { console.error('TGALoader: Invalid pixel size ' + header.pixel_size); } } // Parse tga image buffer function tgaParse(use_rle, use_pal, header, offset, data) { let pixel_data, palettes; const pixel_size = header.pixel_size >> 3; const pixel_total = header.width * header.height * pixel_size; // Read palettes if (use_pal) { palettes = data.subarray(offset, offset += header.colormap_length * (header.colormap_size >> 3)); } // Read RLE if (use_rle) { pixel_data = new Uint8Array(pixel_total); let c, count, i; let shift = 0; const pixels = new Uint8Array(pixel_size); while (shift < pixel_total) { c = data[offset++]; count = (c & 0x7f) + 1; // RLE pixels. if (c & 0x80) { // Bind pixel tmp array for (i = 0; i < pixel_size; ++i) { pixels[i] = data[offset++]; } // Copy pixel array for (i = 0; i < count; ++i) { pixel_data.set(pixels, shift + i * pixel_size); } shift += pixel_size * count; } else { // Raw pixels. count *= pixel_size; for (i = 0; i < count; ++i) { pixel_data[shift + i] = data[offset++]; } shift += count; } } } else { // RAW Pixels pixel_data = data.subarray( offset, offset += (use_pal ? header.width * header.height : pixel_total) ); } return { pixel_data: pixel_data, palettes: palettes }; } function tgaGetImageData8bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image, palettes) { const colormap = palettes; let color, i = 0, x, y; const width = header.width; for (y = y_start; y !== y_end; y += y_step) { for (x = x_start; x !== x_end; x += x_step, i++) { color = image[i]; imageData[(x + width * y) * 4 + 3] = 255; imageData[(x + width * y) * 4 + 2] = colormap[(color * 3) + 0]; imageData[(x + width * y) * 4 + 1] = colormap[(color * 3) + 1]; imageData[(x + width * y) * 4 + 0] = colormap[(color * 3) + 2]; } } return imageData; } function tgaGetImageData16bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { let color, i = 0, x, y; const width = header.width; for (y = y_start; y !== y_end; y += y_step) { for (x = x_start; x !== x_end; x += x_step, i += 2) { color = image[i + 0] + (image[i + 1] << 8); imageData[(x + width * y) * 4 + 0] = (color & 0x7C00) >> 7; imageData[(x + width * y) * 4 + 1] = (color & 0x03E0) >> 2; imageData[(x + width * y) * 4 + 2] = (color & 0x001F) >> 3; imageData[(x + width * y) * 4 + 3] = (color & 0x8000) ? 0 : 255; } } return imageData; } function tgaGetImageData24bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { let i = 0, x, y; const width = header.width; for (y = y_start; y !== y_end; y += y_step) { for (x = x_start; x !== x_end; x += x_step, i += 3) { imageData[(x + width * y) * 4 + 3] = 255; imageData[(x + width * y) * 4 + 2] = image[i + 0]; imageData[(x + width * y) * 4 + 1] = image[i + 1]; imageData[(x + width * y) * 4 + 0] = image[i + 2]; } } return imageData; } function tgaGetImageData32bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { let i = 0, x, y; const width = header.width; for (y = y_start; y !== y_end; y += y_step) { for (x = x_start; x !== x_end; x += x_step, i += 4) { imageData[(x + width * y) * 4 + 2] = image[i + 0]; imageData[(x + width * y) * 4 + 1] = image[i + 1]; imageData[(x + width * y) * 4 + 0] = image[i + 2]; imageData[(x + width * y) * 4 + 3] = image[i + 3]; } } return imageData; } function tgaGetImageDataGrey8bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { let color, i = 0, x, y; const width = header.width; for (y = y_start; y !== y_end; y += y_step) { for (x = x_start; x !== x_end; x += x_step, i++) { color = image[i]; imageData[(x + width * y) * 4 + 0] = color; imageData[(x + width * y) * 4 + 1] = color; imageData[(x + width * y) * 4 + 2] = color; imageData[(x + width * y) * 4 + 3] = 255; } } return imageData; } function tgaGetImageDataGrey16bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { let i = 0, x, y; const width = header.width; for (y = y_start; y !== y_end; y += y_step) { for (x = x_start; x !== x_end; x += x_step, i += 2) { imageData[(x + width * y) * 4 + 0] = image[i + 0]; imageData[(x + width * y) * 4 + 1] = image[i + 0]; imageData[(x + width * y) * 4 + 2] = image[i + 0]; imageData[(x + width * y) * 4 + 3] = image[i + 1]; } } return imageData; } function getTgaRGBA(data, width, height, image, palette) { let x_start, y_start, x_step, y_step, x_end, y_end; switch ((header.flags & TGA_ORIGIN_MASK) >> TGA_ORIGIN_SHIFT) { case TGA_ORIGIN_BL: x_start = 0; x_step = 1; x_end = width; y_start = height - 1; y_step = -1; y_end = -1; break; case TGA_ORIGIN_UR: x_start = width - 1; x_step = -1; x_end = -1; y_start = 0; y_step = 1; y_end = height; break; case TGA_ORIGIN_BR: x_start = width - 1; x_step = -1; x_end = -1; y_start = height - 1; y_step = -1; y_end = -1; break; case TGA_ORIGIN_UL: default: x_start = 0; x_step = 1; x_end = width; y_start = 0; y_step = 1; y_end = height; break; } if (use_grey) { switch (header.pixel_size) { case 8: tgaGetImageDataGrey8bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image); break; case 16: tgaGetImageDataGrey16bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image); break; default: console.error('TGALoader: Format not supported.'); break; } } else { switch (header.pixel_size) { case 8: tgaGetImageData8bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image, palette); break; case 16: tgaGetImageData16bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image); break; case 24: tgaGetImageData24bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image); break; case 32: tgaGetImageData32bits(data, y_start, y_step, y_end, x_start, x_step, x_end, image); break; default: console.error('TGALoader: Format not supported.'); break; } } // Load image data according to specific method // const func = 'tgaGetImageData' + (use_grey ? 'Grey' : '') + (header.pixel_size) + 'bits'; // func(data, y_start, y_step, y_end, x_start, x_step, x_end, width, image, palette ); return data; } // TGA Constants const TGA_TYPE_NO_DATA = 0, TGA_TYPE_INDEXED = 1, TGA_TYPE_RGB = 2, TGA_TYPE_GREY = 3, TGA_TYPE_RLE_INDEXED = 9, TGA_TYPE_RLE_RGB = 10, TGA_TYPE_RLE_GREY = 11, TGA_ORIGIN_MASK = 0x30, TGA_ORIGIN_SHIFT = 0x04, TGA_ORIGIN_BL = 0x00, TGA_ORIGIN_BR = 0x01, TGA_ORIGIN_UL = 0x02, TGA_ORIGIN_UR = 0x03; if (buffer.length < 19) { console.error('TGALoader: Not enough data to contain header.'); } let offset = 0; const content = new Uint8Array(buffer), header = { id_length: content[offset++], colormap_type: content[offset++], image_type: content[offset++], colormap_index: content[offset++] | content[offset++] << 8, colormap_length: content[offset++] | content[offset++] << 8, colormap_size: content[offset++], origin: [ content[offset++] | content[offset++] << 8, content[offset++] | content[offset++] << 8 ], width: content[offset++] | content[offset++] << 8, height: content[offset++] | content[offset++] << 8, pixel_size: content[offset++], flags: content[offset++] }; // Check tga if it is valid format tgaCheckHeader(header); if (header.id_length + offset > buffer.length) { console.error('TGALoader: No data.'); } // Skip the needn't data offset += header.id_length; // Get targa information about RLE compression and palette let use_rle = false, use_pal = false, use_grey = false; switch (header.image_type) { case TGA_TYPE_RLE_INDEXED: use_rle = true; use_pal = true; break; case TGA_TYPE_INDEXED: use_pal = true; break; case TGA_TYPE_RLE_RGB: use_rle = true; break; case TGA_TYPE_RGB: break; case TGA_TYPE_RLE_GREY: use_rle = true; use_grey = true; break; case TGA_TYPE_GREY: use_grey = true; break; } const imageData = new Uint8Array(header.width * header.height * 4); const result = tgaParse(use_rle, use_pal, header, offset, content); getTgaRGBA(imageData, header.width, header.height, result.pixel_data, result.palettes); return { data: imageData, width: header.width, height: header.height, flipY: true, generateMipmaps: true, minFilter: TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR }; } } class TGATexture2DLoader extends TGALoader { load(url, onLoad, onProgress, onError) { const texture = new Texture2D(); super.load(url, textureData => { const { data, width, height, flipY, generateMipmaps, minFilter } = textureData; texture.image = { data, width, height }; texture.flipY = flipY; texture.generateMipmaps = generateMipmaps; texture.minFilter = minFilter; texture.version++; onLoad && onLoad(texture); }, onProgress, onError); return texture; } } class TGATextureCubeLoader extends TGALoader { load(urls, onLoad, _onProgress, onError) { const texture = new TextureCube(); const promiseArray = []; for (let i = 0; i < 6; i++) { promiseArray.push(new Promise((resolve, reject) => { super.load(urls[i], resolve, undefined, reject); })); } Promise.all(promiseArray).then(textureDatas => { for (let i = 0; i < 6; i++) { texture.images.push({ data: textureDatas[i].data, width: textureDatas[i].width, height: textureDatas[i].height }); } const { generateMipmaps, minFilter } = textureDatas[0]; texture.generateMipmaps = generateMipmaps; texture.minFilter = minFilter; texture.version++; onLoad && onLoad(texture); }).catch(e => { onError && onError(e); }); return texture; } } export { TGALoader, TGATexture2DLoader, TGATextureCubeLoader }; ================================================ FILE: examples/jsm/loaders/Texture2DLoader.js ================================================ import { Loader, ImageLoader, Texture2D } from 't3d'; class Texture2DLoader extends Loader { constructor(manager) { super(manager); } load(url, onLoad, onProgress, onError) { const texture = new Texture2D(); const loader = new ImageLoader(this.manager); loader.setCrossOrigin(this.crossOrigin); loader.setPath(this.path); loader.load(url, function(image) { texture.image = image; texture.version++; if (onLoad) onLoad(texture); }, onProgress, onError); return texture; } } export { Texture2DLoader }; ================================================ FILE: examples/jsm/loaders/TextureCubeLoader.js ================================================ import { Loader, ImageLoader, TextureCube } from 't3d'; class TextureCubeLoader extends Loader { constructor(manager) { super(manager); } load(urls, onLoad, _onProgress, onError) { const texture = new TextureCube(); const loader = new ImageLoader(this.manager); loader.setCrossOrigin(this.crossOrigin); loader.setPath(this.path); const promiseArray = []; for (let i = 0; i < 6; i++) { promiseArray.push(loader.loadAsync(urls[i])); } Promise.all(promiseArray).then(function(images) { texture.images = images; texture.version++; if (onLoad) onLoad(texture); }).catch(function(e) { if (onError) onError(e); }); return texture; } } export { TextureCubeLoader }; ================================================ FILE: examples/jsm/loaders/glTF/Constants.js ================================================ import { TEXTURE_FILTER, TEXTURE_WRAP } from 't3d'; export const ATTRIBUTES = { POSITION: 'a_Position', NORMAL: 'a_Normal', TANGENT: 'a_Tangent', TEXCOORD_0: 'a_Uv', TEXCOORD_1: 'a_Uv2', TEXCOORD_2: 'a_Uv3', TEXCOORD_3: 'a_Uv4', TEXCOORD_4: 'a_Uv5', TEXCOORD_5: 'a_Uv6', TEXCOORD_6: 'a_Uv7', TEXCOORD_7: 'a_Uv8', COLOR_0: 'a_Color', WEIGHTS_0: 'skinWeight', JOINTS_0: 'skinIndex', TEXCOORD0: 'a_Uv', // deprecated TEXCOORD: 'a_Uv', // deprecated COLOR0: 'a_Color', // deprecated COLOR: 'a_Color', // deprecated WEIGHT: 'skinWeight', // deprecated JOINT: 'skinIndex' // deprecated }; export const ALPHA_MODES = { OPAQUE: 'OPAQUE', MASK: 'MASK', BLEND: 'BLEND' }; export const ACCESSOR_TYPE_SIZES = { 'SCALAR': 1, 'VEC2': 2, 'VEC3': 3, 'VEC4': 4, 'MAT2': 4, 'MAT3': 9, 'MAT4': 16 }; export const ACCESSOR_COMPONENT_TYPES = { 5120: Int8Array, 5121: Uint8Array, 5122: Int16Array, 5123: Uint16Array, 5125: Uint32Array, 5126: Float32Array }; export const WEBGL_FILTERS = { 9728: TEXTURE_FILTER.NEAREST, 9729: TEXTURE_FILTER.LINEAR, 9984: TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST, 9985: TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST, 9986: TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR, 9987: TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR }; export const WEBGL_WRAPPINGS = { 33071: TEXTURE_WRAP.CLAMP_TO_EDGE, 33648: TEXTURE_WRAP.MIRRORED_REPEAT, 10497: TEXTURE_WRAP.REPEAT }; export const WEBGL_DRAW_MODES = { POINTS: 0, LINES: 1, LINE_LOOP: 2, LINE_STRIP: 3, TRIANGLES: 4, TRIANGLE_STRIP: 5, TRIANGLE_FAN: 6 }; ================================================ FILE: examples/jsm/loaders/glTF/GLTFLoader.js ================================================ import { DefaultLoadingManager, FileLoader, ImageLoader } from 't3d'; import { ImageBitmapLoader } from '../ImageBitmapLoader.js'; import { IndexParser } from './parsers/IndexParser.js'; import { ReferenceParser } from './parsers/ReferenceParser.js'; import { Validator } from './parsers/Validator.js'; import { BufferParser } from './parsers/BufferParser.js'; import { BufferViewParser } from './parsers/BufferViewParser.js'; import { ImageParser } from './parsers/ImageParser.js'; import { TextureParser } from './parsers/TextureParser.js'; import { MaterialParser } from './parsers/MaterialParser.js'; import { AccessorParser } from './parsers/AccessorParser.js'; import { PrimitiveParser } from './parsers/PrimitiveParser.js'; import { NodeParser } from './parsers/NodeParser.js'; import { SkinParser } from './parsers/SkinParser.js'; import { SceneParser } from './parsers/SceneParser.js'; import { AnimationParser } from './parsers/AnimationParser.js'; import { GLTFResource } from './GLTFResource.js'; import { GLTFUtils } from './GLTFUtils.js'; import { EXT_meshopt_compression } from './extensions/EXT_meshopt_compression.js'; import { KHR_draco_mesh_compression } from './extensions/KHR_draco_mesh_compression.js'; import { KHR_lights_punctual } from './extensions/KHR_lights_punctual.js'; import { KHR_materials_clearcoat } from './extensions/KHR_materials_clearcoat.js'; import { KHR_materials_pbrSpecularGlossiness } from './extensions/KHR_materials_pbrSpecularGlossiness.js'; import { KHR_materials_unlit } from './extensions/KHR_materials_unlit.js'; import { KHR_texture_basisu } from './extensions/KHR_texture_basisu.js'; import { KHR_texture_transform } from './extensions/KHR_texture_transform.js'; import { KHR_animation_pointer } from './extensions/KHR_animation_pointer.js'; const DefaultParsePipeline = [ IndexParser, ReferenceParser, Validator, BufferParser, BufferViewParser, ImageParser, TextureParser, MaterialParser, AccessorParser, PrimitiveParser, NodeParser, SkinParser, SceneParser, AnimationParser ]; const DefaultExtensions = new Map([ ['EXT_meshopt_compression', EXT_meshopt_compression], ['KHR_draco_mesh_compression', KHR_draco_mesh_compression], ['KHR_lights_punctual', KHR_lights_punctual], ['KHR_materials_clearcoat', KHR_materials_clearcoat], ['KHR_materials_pbrSpecularGlossiness', KHR_materials_pbrSpecularGlossiness], ['KHR_materials_unlit', KHR_materials_unlit], ['KHR_mesh_quantization', {}], // This is supported by default ['KHR_texture_basisu', KHR_texture_basisu], ['KHR_texture_transform', KHR_texture_transform], ['KHR_animation_pointer', KHR_animation_pointer] ]); export class GLTFLoader { constructor(manager = DefaultLoadingManager, parsers = DefaultParsePipeline, extensions = DefaultExtensions) { this.manager = manager; // If ture, loading manager will dispatch progress for every buffer and image. // otherwise, loading manager will only dispatch progress for the whole gltf resource. this.detailLoadProgress = true; // If set false, need add Promise.catch to catch errors. this.autoLogError = true; this.extensions = new Map(extensions); // Indicate which extensions can be parsed in a uniform way. this.autoParseConfig = { materials: ['KHR_materials_clearcoat', 'KHR_materials_pbrSpecularGlossiness', 'KHR_materials_unlit', 'KHR_materials_transmission', 'KHR_materials_ior', 'KHR_materials_volume', 'KHR_materials_dispersion'] }; this._parsers = parsers.slice(0); this._dracoLoader = null; this._meshoptDecoder = null; this._ktx2Loader = null; this._fileLoader = new FileLoader(); const userAgent = navigator.userAgent; const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent) === true; const safariMatch = userAgent.match(/Version\/(\d+)/); const safariVersion = isSafari && safariMatch ? parseInt(safariMatch[1], 10) : -1; const isFirefox = userAgent.indexOf('Firefox') > -1; const firefoxVersion = isFirefox ? userAgent.match(/Firefox\/([0-9]+)\./)[1] : -1; if (typeof createImageBitmap === 'undefined' || (isSafari && safariVersion < 17) || (isFirefox && firefoxVersion < 98)) { this._imageLoader = new ImageLoader(); } else { this._imageLoader = new ImageBitmapLoader(); } } load(url, options = {}) { this.manager.itemStart(url); return new Promise((resolve, reject) => { const resource = new GLTFResource(); resource.url = url; resource.path = GLTFUtils.extractUrlBase(url); resource.options = options; this._parse(resource) .then(resolve) .then(() => this.manager.itemEnd(url)) .catch(e => { if (this.autoLogError) { console.error(e); } if (this.detailLoadProgress && resource.loadItems) { resource.loadItems.forEach(item => { this.manager.itemEnd(item); }); } this.manager.itemError(url); this.manager.itemEnd(url); reject(`Error loading glTF model from ${url} .`); }); }); } _parse(context) { let lastParser; return new Promise((resolve, reject) => { this._parsers.forEach(parser => { if (lastParser) { lastParser = lastParser.then(() => parser.parse(context, this)); } else { lastParser = parser.parse(context, this); } }); if (lastParser) { lastParser.then(() => resolve(context)).catch(reject); } else { resolve(context); } }); } setDRACOLoader(dracoLoader) { this._dracoLoader = dracoLoader; return this; } getDRACOLoader() { return this._dracoLoader; } setMeshoptDecoder(meshoptDecoder) { this._meshoptDecoder = meshoptDecoder; return this; } getMeshoptDecoder() { return this._meshoptDecoder; } setKTX2Loader(ktx2Loader) { this._ktx2Loader = ktx2Loader; return this; } getKTX2Loader() { return this._ktx2Loader; } loadFile(url, type = 'json') { this._fileLoader.setResponseType(type); return new Promise((resolve, reject) => { url = this.manager.resolveURL(url); this._fileLoader.load(url, resolve, undefined, reject); }); } loadImage(url) { return new Promise((resolve, reject) => { url = this.manager.resolveURL(url); this._imageLoader.load(url, resolve, undefined, reject); }); } insertParser(parser, index) { this._parsers.splice(index, 0, parser); } replaceParser(parser, index) { this._parsers.splice(index, 1, parser); } } ================================================ FILE: examples/jsm/loaders/glTF/GLTFResource.js ================================================ let resourceId = 0; export class GLTFResource { constructor() { this.id = ++resourceId; this.url = ''; // url string this.path = ''; // path string this.options = null; // load options this.gltf = null; // gltf json after IndexParser this.loadItems = null; // String[] after IndexParser. Store all urls that need to load. this.buffers = null; // ArrayBuffer[] after BufferParser this.bufferViews = null; // ArrayBuffer[] after BufferViewParser this.images = null; // Image[] after ImageParser this.textures = null; // Texture2D[] after TextureParser this.materials = null; // Material[] after MaterialParser this.accessors = null; // Attribute[] after AccessorParser this.primitives = null; // { mode, geometry, material, weights, skinned }[] after PrimitiveParser this.nodes = null; // Object3D[] after NodeParser this.cameras = null; // Camera[] after NodeParser this.lights = null; // Light[] after NodeParser this.skins = null; // Skeleton[] after SkinParser this.root = null; // root after SceneParser this.roots = null; // root[] after SceneParser this.animations = null; // KeyframeClip[] after AnimationParser } } ================================================ FILE: examples/jsm/loaders/glTF/GLTFUtils.js ================================================ import { Vector4 } from 't3d'; const _vec4_1 = new Vector4(); export class GLTFUtils { constructor() {} static extractUrlBase(url) { const parts = url.split('/'); parts.pop(); return (parts.length < 1 ? '.' : parts.join('/')) + '/'; } // url: aa.bin ; path:example/resource/model/ (for example)example/resource/model/aa.bin static resolveURL(url, path) { // Invalid URL if (typeof url !== 'string' || url === '') return ''; // Absolute URL http://,https://,// if (/^(https?:)?\/\//i.test(url)) return url; // Data URI if (/^data:/i.test(url)) return url; // Blob URL if (/^blob:/i.test(url)) return url; // Relative URL return path + url; } static decodeText(array) { if (typeof TextDecoder !== 'undefined') { return new TextDecoder().decode(array); } // Avoid the String.fromCharCode.apply(null, array) shortcut, which // throws a "maximum call stack size exceeded" error for large arrays. let s = ''; for (let i = 0, il = array.length; i < il; i++) { // Implicitly assumes little-endian. s += String.fromCharCode(array[i]); } try { // merges multi-byte utf-8 characters. return decodeURIComponent(escape(s)); } catch (e) { // see #16358 return s; } } static parseGLB(glb) { const UINT32_LENGTH = 4; const GLB_HEADER_MAGIC = 0x46546C67; // 'glTF' const GLB_HEADER_LENGTH = 12; const GLB_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; const dataView = new DataView(glb); const header = { magic: dataView.getUint32(0, true), version: dataView.getUint32(UINT32_LENGTH, true), length: dataView.getUint32(2 * UINT32_LENGTH, true) }; if (header.magic !== GLB_HEADER_MAGIC) { console.error('Invalid glb magic number. Expected 0x46546C67, found 0x' + header.magic.toString(16)); return null; } else if (header.version < 2.0) { console.error('GLTFLoader: Legacy binary file detected.'); } let chunkLength = dataView.getUint32(GLB_HEADER_LENGTH, true); let chunkType = dataView.getUint32(GLB_HEADER_LENGTH + UINT32_LENGTH, true); if (chunkType !== GLB_CHUNK_TYPES.JSON) { console.error('Invalid glb chunk type. Expected 0x4E4F534A, found 0x' + chunkType.toString(16)); return null; } const glTFData = new Uint8Array(glb, GLB_HEADER_LENGTH + 2 * UINT32_LENGTH, chunkLength); const gltf = JSON.parse(GLTFUtils.decodeText(glTFData)); const buffers = []; let byteOffset = GLB_HEADER_LENGTH + 2 * UINT32_LENGTH + chunkLength; while (byteOffset < header.length) { chunkLength = dataView.getUint32(byteOffset, true); chunkType = dataView.getUint32(byteOffset + UINT32_LENGTH, true); if (chunkType !== GLB_CHUNK_TYPES.BIN) { console.error('Invalid glb chunk type. Expected 0x004E4942, found 0x' + chunkType.toString(16)); return null; } const currentOffset = byteOffset + 2 * UINT32_LENGTH; const buffer = glb.slice(currentOffset, currentOffset + chunkLength); buffers.push(buffer); byteOffset += chunkLength + 2 * UINT32_LENGTH; } return { gltf, buffers }; } // Reference: github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data static getNormalizedComponentScale(constructor) { if (constructor === Int8Array) { return 1 / 127; } else if (constructor === Uint8Array) { return 1 / 255; } else if (constructor === Int16Array) { return 1 / 32767; } else if (constructor === Uint16Array) { return 1 / 65535; } else { throw new Error('Unsupported normalized accessor component type.'); } } static normalizeSkinWeights(skinWeight) { const offset = skinWeight.offset; const buffer = skinWeight.buffer; const stride = buffer.stride; for (let i = 0, l = buffer.count; i < l; i++) { _vec4_1.fromArray(buffer.array, i * stride + offset); const scale = 1.0 / _vec4_1.getManhattanLength(); if (scale !== Infinity) { _vec4_1.multiplyScalar(scale); } else { _vec4_1.set(1, 0, 0, 0); // do something reasonable } _vec4_1.toArray(buffer.array, i * stride + offset); } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/EXT_mesh_gpu_instancing.js ================================================ import { Object3D, Mesh, SkinnedMesh, Matrix4, Vector3, Quaternion, Attribute, Buffer, MATERIAL_TYPE } from 't3d'; import { GLTFUtils } from '../GLTFUtils.js'; import { InstancedPBRMaterial, InstancedBasicMaterial } from '../../../materials/InstancedMaterial.js'; /** * EXT_mesh_gpu_instancing * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/README.md */ export class EXT_mesh_gpu_instancing { static getInstancedMesh(context, gltfNode) { const { primitives, accessors } = context; const { mesh: meshID, skin: skinID, extensions } = gltfNode; const { EXT_mesh_gpu_instancing } = extensions; const meshes = primitives[meshID].map(primitive => { const { geometry, material, weights } = primitive; const instancedGeometry = geometry.clone(); setInstancedAttributes(instancedGeometry, EXT_mesh_gpu_instancing, accessors); let instancedMaterial; if (material.type === MATERIAL_TYPE.BASIC) { instancedMaterial = new InstancedBasicMaterial(material); } else { instancedMaterial = new InstancedPBRMaterial(material); } let mesh; if (skinID !== undefined) { mesh = new SkinnedMesh(instancedGeometry, instancedMaterial); if (geometry.attributes.skinWeight && !geometry.attributes.skinWeight.normalized) { GLTFUtils.normalizeSkinWeights(geometry.attributes.skinWeight); } } else { mesh = new Mesh(instancedGeometry, instancedMaterial); if (weights) { mesh.morphTargetInfluences = weights.slice(); } } mesh.frustumCulled = false; return mesh; }); if (meshes.length > 1) { const parent = new Object3D(); meshes.forEach(mesh => parent.add(mesh)); return parent; } else { return meshes[0]; } } } const m = new Matrix4(); const p = new Vector3(); const q = new Quaternion(); const s = new Vector3(1, 1, 1); function setInstancedAttributes(geometry, instancingDef, accessors) { const { attributes: attributesDef } = instancingDef; // get instance count // all attributes should have the same count const attributes = {}; let count = 0; for (const key in attributesDef) { attributes[key] = accessors[attributesDef[key]]; count = attributes[key].buffer.count; } if (count < 1) return; const matrices = new Array(count * 16); m.identity(); p.set(0, 0, 0); q.set(0, 0, 0, 1); s.set(1, 1, 1); const { TRANSLATION, ROTATION, SCALE } = attributes; for (let i = 0; i < count; i++) { if (TRANSLATION) { p.fromArray( TRANSLATION.buffer.array, i * TRANSLATION.buffer.stride + TRANSLATION.offset, TRANSLATION.normalized ); } if (ROTATION) { q.fromArray( ROTATION.buffer.array, i * ROTATION.buffer.stride + ROTATION.offset, ROTATION.normalized ); } if (SCALE) { s.fromArray( SCALE.buffer.array, i * SCALE.buffer.stride + SCALE.offset, SCALE.normalized ); } m.compose(p, q, s).toArray(matrices, i * 16); } const instanceMatrixAttribute = new Attribute(new Buffer(new Float32Array(matrices), 16)); instanceMatrixAttribute.divisor = 1; geometry.addAttribute('instanceMatrix', instanceMatrixAttribute); geometry.instanceCount = count; return geometry; } ================================================ FILE: examples/jsm/loaders/glTF/extensions/EXT_meshopt_compression.js ================================================ /** * meshopt BufferView Compression Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression */ export class EXT_meshopt_compression { static loadBufferView(extensionDef, buffers, meshoptDecoder) { const buffer = buffers[extensionDef.buffer]; if (!meshoptDecoder || !meshoptDecoder.supported) { throw new Error('GLTFLoader: setMeshoptDecoder must be called before loading compressed files.'); } const byteOffset = extensionDef.byteOffset || 0; const byteLength = extensionDef.byteLength || 0; const count = extensionDef.count; const stride = extensionDef.byteStride; const source = new Uint8Array(buffer, byteOffset, byteLength); if (meshoptDecoder.decodeGltfBufferAsync) { return meshoptDecoder.decodeGltfBufferAsync(count, stride, source, extensionDef.mode, extensionDef.filter).then(res => res.buffer); } else { // Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync return meshoptDecoder.ready.then(() => { const result = new ArrayBuffer(count * stride); meshoptDecoder.decodeGltfBuffer(new Uint8Array(result), count, stride, source, extensionDef.mode, extensionDef.filter); return result; }); } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_animation_pointer.js ================================================ import { QuaternionKeyframeTrack, NumberKeyframeTrack, VectorKeyframeTrack, ColorKeyframeTrack } from 't3d'; export class KHR_animation_pointer { static getTrackInfos(context, extensionDef, input, output, interpolation, trackInfos) { const { pointer } = extensionDef; const segments = pointer.replace(/^\//, '').split('/'); const type = segments[0]; const index = parseInt(segments[1]); const property = segments[segments.length - 1]; const searchArray = context[type]; if (!searchArray) return; const target = searchArray[index]; if (!target) return; let TypedKeyframeTrack, propertyPath, TypedKeyframeTrack2, propertyPath2; if (property === 'rotation') { TypedKeyframeTrack = QuaternionKeyframeTrack; propertyPath = 'quaternion'; } else if (property === 'weights') { TypedKeyframeTrack = NumberKeyframeTrack; propertyPath = 'morphTargetInfluences'; } else if (property === 'translation') { TypedKeyframeTrack = VectorKeyframeTrack; propertyPath = 'position'; } else if (property === 'scale') { TypedKeyframeTrack = VectorKeyframeTrack; propertyPath = 'scale'; } else if (property === 'baseColorFactor') { TypedKeyframeTrack = ColorKeyframeTrack; propertyPath = 'diffuse'; TypedKeyframeTrack2 = NumberKeyframeTrack; propertyPath2 = 'opacity'; } else if (property === 'metallicFactor') { TypedKeyframeTrack = NumberKeyframeTrack; propertyPath = 'metalness'; } else if (property === 'roughnessFactor') { TypedKeyframeTrack = NumberKeyframeTrack; propertyPath = 'roughness'; } else if (property === 'emissiveFactor') { TypedKeyframeTrack = VectorKeyframeTrack; propertyPath = 'emissive'; } else if (segments[segments.length - 2] === 'KHR_texture_transform') { TypedKeyframeTrack = VectorKeyframeTrack; const textureProperty = segments[segments.length - 4]; if (textureProperty === 'baseColorTexture') { propertyPath = 'diffuseMapTransform.' + property; } else if (textureProperty === 'emissiveTexture') { propertyPath = 'emissiveMapTransform.' + property; } else { return; } } else { return; } if (property === 'baseColorFactor') { // Separate the alpha channel from the color const color3Output = new Float32Array(output.length / 4 * 3); const alphaOutput = new Float32Array(output.length / 4); for (let i = 0; i < output.length / 4; i++) { color3Output[i * 3] = output[i * 4]; color3Output[i * 3 + 1] = output[i * 4 + 1]; color3Output[i * 3 + 2] = output[i * 4 + 2]; alphaOutput[i] = output[i * 4 + 3]; } trackInfos.push({ TypedKeyframeTrack, target, propertyPath, times: input, values: color3Output, interpolation }); trackInfos.push({ TypedKeyframeTrack: TypedKeyframeTrack2, target, propertyPath: propertyPath2, times: input, values: alphaOutput, interpolation }); } else { trackInfos.push({ TypedKeyframeTrack, target, propertyPath, times: input, values: output, interpolation }); } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_draco_mesh_compression.js ================================================ import { ATTRIBUTES, ACCESSOR_COMPONENT_TYPES } from '../Constants.js'; /** * KHR_draco_mesh_compression extension * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression */ export class KHR_draco_mesh_compression { static getGeometry(params, bufferViews, attributes, accessors, dracoLoader) { const { bufferView: bufferViewIndex, attributes: gltfAttributeMap } = params; if (!dracoLoader) { throw new Error('GLTFLoader: No DRACOLoader instance provided.'); } const attributeMap = {}; for (const attributeSemantic in gltfAttributeMap) { const attributeName = ATTRIBUTES[attributeSemantic] === undefined ? attributeSemantic : ATTRIBUTES[attributeSemantic]; attributeMap[attributeName] = gltfAttributeMap[attributeSemantic]; } const attributeNormalizedMap = {}; const attributeTypeMap = {}; for (const attributeNameItem in attributes) { const attributeName = ATTRIBUTES[attributeNameItem] || attributeNameItem.toLowerCase(); if (gltfAttributeMap[attributeNameItem] !== undefined) { const accessorDef = accessors[attributes[attributeNameItem]]; const componentType = ACCESSOR_COMPONENT_TYPES[accessorDef.componentType]; attributeTypeMap[attributeName] = componentType.name; attributeNormalizedMap[attributeName] = accessorDef.normalized === true; } } const bufferView = bufferViews[bufferViewIndex]; return new Promise(function(resolve) { dracoLoader.decodeDracoFile(bufferView, function(geometry) { for (const attributeName in geometry.attributes) { const attribute = geometry.attributes[attributeName]; const normalized = attributeNormalizedMap[attributeName]; if (normalized !== undefined) attribute.normalized = normalized; } resolve(geometry); }, attributeMap, attributeTypeMap); }); } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_lights_punctual.js ================================================ import { DirectionalLight, PointLight, SpotLight } from 't3d'; /** * KHR_lights_punctual extension * https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md */ export class KHR_lights_punctual { static getLight(params) { const { color, intensity = 1, type, range, spot } = params; let lightNode; if (type === 'directional') { lightNode = new DirectionalLight(); } else if (type === 'point') { lightNode = new PointLight(); if (range !== undefined) { lightNode.distance = range; } // https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property // lightNode.decay = 2; } else if (type === 'spot') { lightNode = new SpotLight(); if (range !== undefined) { lightNode.distance = range; } // https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md#range-property // lightNode.decay = 2; if (spot) { const { innerConeAngle = 0, outerConeAngle = Math.PI / 4 } = spot; lightNode.angle = outerConeAngle; lightNode.penumbra = 1.0 - innerConeAngle / outerConeAngle; } } else { throw new Error('Unexpected light type: ' + type); } if (color) { lightNode.color.fromArray(color); } lightNode.intensity = intensity; return lightNode; } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_materials_clearcoat.js ================================================ import { PBRMaterial, Vector2 } from 't3d'; /** * KHR_materials_clearcoat extension * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat */ export class KHR_materials_clearcoat { static getMaterial() { return new PBRMaterial(); } static parseParams(material, extension, textures) { if (material.constructor !== PBRMaterial) return; const { clearcoatFactor, clearcoatTexture, clearcoatRoughnessFactor, clearcoatRoughnessTexture, clearcoatNormalTexture } = extension; if (clearcoatFactor) { material.clearcoat = clearcoatFactor; } if (clearcoatTexture) { material.clearcoatMap = textures[clearcoatTexture.index]; // material does not yet support the transform of clearcoatMap. // parseTextureTransform(material, 'clearcoatMap', clearcoatTexture.extensions); } if (clearcoatRoughnessFactor) { material.clearcoatRoughness = clearcoatRoughnessFactor; } if (clearcoatRoughnessTexture) { material.clearcoatRoughnessMap = textures[clearcoatRoughnessTexture.index]; // material does not yet support the transform of clearcoatRoughnessMap. // parseTextureTransform(material, 'clearcoatRoughnessMap', clearcoatRoughnessTexture.extensions); } if (clearcoatNormalTexture) { material.clearcoatNormalMap = textures[clearcoatNormalTexture.index]; // material does not yet support the transform of clearcoatNormalMap. // parseTextureTransform(material, 'clearcoatNormalMap', clearcoatNormalTexture.extensions); if (clearcoatNormalTexture.scale) { const scale = clearcoatNormalTexture.scale; material.clearcoatNormalScale = new Vector2(scale, scale); } } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_materials_dispersion.js ================================================ import { TransmissionPBRMaterial } from '../../../materials/TransmissionPBRMaterial.js'; /** * KHR_materials_dispersion extension * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion */ export class KHR_materials_dispersion { static getMaterial() { return new TransmissionPBRMaterial(); } static parseParams(material, extension) { if (material.constructor !== TransmissionPBRMaterial) return; const { dispersion } = extension; if (dispersion !== undefined) { material.uniforms.dispersion = dispersion; material.defines.USE_DISPERSION = true; } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_materials_ior.js ================================================ import { TransmissionPBRMaterial } from '../../../materials/TransmissionPBRMaterial.js'; /** * KHR_materials_ior extension * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior */ export class KHR_materials_ior { static getMaterial() { return new TransmissionPBRMaterial(); } static parseParams(material, extension) { if (material.constructor !== TransmissionPBRMaterial) return; const { ior } = extension; if (ior !== undefined) { material.uniforms.ior = ior; } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_materials_pbrSpecularGlossiness.js ================================================ import { TEXEL_ENCODING_TYPE, PBR2Material } from 't3d'; /** * KHR_materials_pbrSpecularGlossiness extension * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/README.md */ export class KHR_materials_pbrSpecularGlossiness { static getMaterial() { return new PBR2Material(); } static parseParams(material, params, textures, transformExt) { if (material.constructor !== PBR2Material) return; const { diffuseFactor, diffuseTexture, specularFactor, glossinessFactor, specularGlossinessTexture } = params; if (Array.isArray(diffuseFactor)) { material.diffuse.fromArray(diffuseFactor); material.opacity = diffuseFactor[3] || 1; } if (diffuseTexture) { material.diffuseMap = textures[diffuseTexture.index]; material.diffuseMapCoord = diffuseTexture.texCoord || 0; if (material.diffuseMap) { material.diffuseMap.encoding = TEXEL_ENCODING_TYPE.SRGB; transformExt && transformExt.handleMaterialMap(material, 'diffuseMap', diffuseTexture); } } material.glossiness = glossinessFactor !== undefined ? glossinessFactor : 1.0; if (Array.isArray(specularFactor)) { material.specular.fromArray(specularFactor); } if (specularGlossinessTexture) { material.glossinessMap = textures[specularGlossinessTexture.index]; material.specularMap = textures[specularGlossinessTexture.index]; // specularGlossinessTexture transform not supported yet } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_materials_transmission.js ================================================ import { TransmissionPBRMaterial } from '../../../materials/TransmissionPBRMaterial.js'; /** * KHR_materials_transmission extension * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission * Draft: https://github.com/KhronosGroup/glTF/pull/1698 */ export class KHR_materials_transmission { static getMaterial() { return new TransmissionPBRMaterial(); } static parseParams(material, extension, textures) { if (material.constructor !== TransmissionPBRMaterial) return; const { transmissionFactor, transmissionTexture } = extension; if (transmissionFactor !== undefined) { material.uniforms.transmission = transmissionFactor; } if (transmissionTexture !== undefined) { material.uniforms.transmissionMap = textures[transmissionTexture.index]; material.defines.USE_TRANSMISSIONMAP = true; material.extUvCoordMask = material.extUvCoordMask | (1 << 0); } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_materials_unlit.js ================================================ import { BasicMaterial } from 't3d'; /** * KHR_materials_unlit extension * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit */ export class KHR_materials_unlit { static getMaterial() { return new BasicMaterial(); } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_materials_volume.js ================================================ import { TransmissionPBRMaterial } from '../../../materials/TransmissionPBRMaterial.js'; /** * KHR_materials_volume extension * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume */ export class KHR_materials_volume { static parseParams(material, extension, textures) { if (material.constructor !== TransmissionPBRMaterial) return; const { thicknessFactor, thicknessTexture, attenuationDistance, attenuationColor } = extension; if (thicknessFactor !== undefined) { material.uniforms.thickness = thicknessFactor; } if (thicknessTexture !== undefined) { material.uniforms.thicknessMap = textures[thicknessTexture.index]; material.defines.USE_THICKNESSMAP = true; material.extUvCoordMask = material.extUvCoordMask | (1 << 0); } if (attenuationDistance !== undefined) { material.uniforms.attenuationDistance = attenuationDistance; } if (attenuationColor !== undefined) { material.uniforms.attenuationColor = attenuationColor; } } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_texture_basisu.js ================================================ /** * BasisU Texture Extension * * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu */ export class KHR_texture_basisu { static loadTextureData(url, ktx2Loader) { return new Promise((resolve, reject) => { ktx2Loader.load(url, resolve, undefined, reject); }); } } ================================================ FILE: examples/jsm/loaders/glTF/extensions/KHR_texture_transform.js ================================================ /** * KHR_texture_transform extension * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform */ export class KHR_texture_transform { static handleMaterialMap(material, mapType, textureDef) { if (!textureDef.extensions) return; const extDef = textureDef.extensions.KHR_texture_transform; if (!extDef) return; // If texCoord is present, it overrides the texture's texCoord if (extDef.texCoord !== undefined) { material[mapType + 'Coord'] = extDef.texCoord; } const transform = material[mapType + 'Transform']; if (!transform) return; if (extDef.offset !== undefined) { transform.offset.fromArray(extDef.offset); } if (extDef.rotation !== undefined) { transform.rotation = extDef.rotation; } if (extDef.scale !== undefined) { transform.scale.fromArray(extDef.scale); } transform.updateMatrix(); } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/AccessorParser.js ================================================ import { Attribute, Buffer } from 't3d'; import { ACCESSOR_COMPONENT_TYPES, ACCESSOR_TYPE_SIZES } from '../Constants.js'; export class AccessorParser { static parse(context) { const { bufferViews, gltf } = context; if (!gltf.accessors) return; const interleavedBufferCache = new Map(); const accessors = gltf.accessors.map(accessor => { const { bufferView: bufferViewIndex, type, componentType, count, byteOffset = 0, normalized = false, sparse } = accessor; if (bufferViewIndex === undefined && sparse === undefined) { // Ignore empty accessors, which may be used to declare runtime // information about attributes coming from another source (e.g. Draco compression extension). return null; } // Get buffer view infos const bufferView = bufferViewIndex !== undefined ? bufferViews[bufferViewIndex] : null; const byteStride = bufferViewIndex !== undefined ? gltf.bufferViews[bufferViewIndex].byteStride : undefined; // Get accessor infos const itemSize = ACCESSOR_TYPE_SIZES[type]; const TypedArray = ACCESSOR_COMPONENT_TYPES[componentType]; const elementBytes = TypedArray.BYTES_PER_ELEMENT; const itemBytes = elementBytes * itemSize; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. let array, attribute; if (byteStride && byteStride !== itemBytes) { // The buffer is interleaved // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer // This makes sure that IBA.count reflects accessor.count properly const ibSlice = Math.floor(byteOffset / byteStride); const ibCacheKey = 'Buffer:' + bufferViewIndex + ':' + componentType + ':' + ibSlice + ':' + count; let ib = interleavedBufferCache.get(ibCacheKey); if (!ib) { // Use the full buffer if it's interleaved. array = new TypedArray(bufferView, ibSlice * byteStride, count * byteStride / elementBytes); // Integer parameters to IB/IBA are in array elements, not bytes. ib = new Buffer(array, byteStride / elementBytes); interleavedBufferCache.set(ibCacheKey, ib); } attribute = new Attribute(ib, itemSize, (byteOffset % byteStride) / elementBytes, normalized); } else { if (bufferView === null) { array = new TypedArray(count * itemSize); } else { array = new TypedArray(bufferView, byteOffset, count * itemSize); } attribute = new Attribute(new Buffer(array, itemSize), itemSize, 0, normalized); } // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors if (sparse) { const itemSizeIndices = ACCESSOR_TYPE_SIZES.SCALAR; const TypedArrayIndices = ACCESSOR_COMPONENT_TYPES[sparse.indices.componentType]; const byteOffsetIndices = sparse.indices.byteOffset || 0; const byteOffsetValues = sparse.values.byteOffset || 0; const sparseIndices = new TypedArrayIndices(bufferViews[sparse.indices.bufferView], byteOffsetIndices, sparse.count * itemSizeIndices); const sparseValues = new TypedArray(bufferViews[sparse.values.bufferView], byteOffsetValues, sparse.count * itemSize); if (bufferView !== null) { // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. attribute = new Attribute(attribute.buffer.clone(), attribute.size, attribute.offset, attribute.normalized); } const buffer = attribute.buffer; for (let i = 0, il = sparseIndices.length; i < il; i++) { const index = sparseIndices[i]; buffer.array[index * attribute.size] = sparseValues[i * itemSize]; if (itemSize >= 2) buffer.array[index * attribute.size + 1] = sparseValues[i * itemSize + 1]; if (itemSize >= 3) buffer.array[index * attribute.size + 2] = sparseValues[i * itemSize + 2]; if (itemSize >= 4) buffer.array[index * attribute.size + 3] = sparseValues[i * itemSize + 3]; if (itemSize >= 5) throw new Error('Unsupported itemSize in sparse Attribute.'); } } return attribute; }); interleavedBufferCache.clear(); context.accessors = accessors; } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/AnimationParser.js ================================================ import { QuaternionKeyframeTrack, NumberKeyframeTrack, VectorKeyframeTrack, KeyframeClip, StepInterpolant, LinearInterpolant, CubicSplineInterpolant, QuaternionLinearInterpolant, QuaternionCubicSplineInterpolant } from 't3d'; import { GLTFUtils } from '../GLTFUtils.js'; export class AnimationParser { static parse(context, loader) { const { gltf, nodes, accessors } = context; const { animations } = gltf; if (!animations) return; const pointerExt = loader.extensions.get('KHR_animation_pointer'); const animationClips = animations.map((gltfAnimation, index) => { const { channels, samplers, name = `animation_${index}` } = gltfAnimation; const trackInfos = []; let duration = 0; for (let i = 0; i < channels.length; i++) { const gltfChannel = channels[i]; const gltfSampler = samplers[gltfChannel.sampler]; if (!gltfSampler) continue; const targetDef = gltfChannel.target; const inputAccessor = accessors[gltfSampler.input]; const input = new inputAccessor.buffer.array.constructor(inputAccessor.buffer.array); const outputAccessor = accessors[gltfSampler.output]; const output = new Float32Array(outputAccessor.buffer.array); if (outputAccessor.normalized) { const scale = GLTFUtils.getNormalizedComponentScale(outputAccessor.buffer.array.constructor); for (let j = 0, jl = output.length; j < jl; j++) { output[j] *= scale; } } duration = Math.max(duration, input[input.length - 1]); if (pointerExt && targetDef.extensions && targetDef.extensions['KHR_animation_pointer']) { pointerExt.getTrackInfos( context, targetDef.extensions['KHR_animation_pointer'], input, output, gltfSampler.interpolation, trackInfos ); } else { const target = nodes[targetDef.node !== undefined ? targetDef.node : targetDef.id]; // Note: targetDef.id is deprecated. if (!target) continue; let TypedKeyframeTrack, propertyPath; if (targetDef.path === 'rotation') { TypedKeyframeTrack = QuaternionKeyframeTrack; propertyPath = 'quaternion'; } else if (targetDef.path === 'weights') { TypedKeyframeTrack = NumberKeyframeTrack; propertyPath = 'morphTargetInfluences'; } else if (targetDef.path === 'translation') { TypedKeyframeTrack = VectorKeyframeTrack; propertyPath = 'position'; } else if (targetDef.path === 'scale') { TypedKeyframeTrack = VectorKeyframeTrack; propertyPath = 'scale'; } else { continue; } trackInfos.push({ TypedKeyframeTrack, target, propertyPath, times: input, values: output, interpolation: gltfSampler.interpolation }); } } const tracks = []; trackInfos.forEach(trackInfo => { const { TypedKeyframeTrack, target, propertyPath, times, values, interpolation } = trackInfo; const interpolant = getInterpolant(interpolation, TypedKeyframeTrack === QuaternionKeyframeTrack); if (propertyPath === 'morphTargetInfluences') { // node may be a Object3D (glTF mesh with several primitives) or a Mesh. target.traverse(object => { if (object.isMesh && object.morphTargetInfluences) { const track = new TypedKeyframeTrack(object, propertyPath, times, values, interpolant); tracks.push(track); } }); } else { const track = new TypedKeyframeTrack(target, propertyPath, times, values, interpolant); tracks.push(track); } }); return new KeyframeClip(name, tracks, duration); }); context.animations = animationClips; } } function getInterpolant(type, quaternion) { switch (type) { case 'STEP': return StepInterpolant; case 'CUBICSPLINE': return quaternion ? QuaternionCubicSplineInterpolant : CubicSplineInterpolant; case 'LINEAR': default: return quaternion ? QuaternionLinearInterpolant : LinearInterpolant; } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/BufferParser.js ================================================ import { GLTFUtils } from '../GLTFUtils.js'; export class BufferParser { static parse(context, loader) { const { gltf, loadItems } = context; if (context.buffers !== null) { // buffers have been parsed return null; } else { return Promise.all( gltf.buffers.map(buffer => { const bufferUrl = GLTFUtils.resolveURL(buffer.uri, context.path); if (loader.detailLoadProgress) { loadItems.delete(bufferUrl); } const promise = loader.loadFile(bufferUrl, 'arraybuffer').then(buffer => { if (loader.detailLoadProgress) { loader.manager.itemEnd(bufferUrl); } return buffer; }); if (loader.detailLoadProgress) { promise.catch(() => loader.manager.itemEnd(bufferUrl)); } return promise; }) ).then(buffers => { context.buffers = buffers; }); } } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/BufferViewParser.js ================================================ export class BufferViewParser { static parse(context, loader) { const { buffers, gltf } = context; if (!gltf.bufferViews) return; const meshoptExt = loader.extensions.get('EXT_meshopt_compression'); return Promise.all( gltf.bufferViews.map(bufferView => { const { buffer, byteOffset = 0, byteLength = 0 } = bufferView; if (bufferView.extensions) { const { EXT_meshopt_compression } = bufferView.extensions; if (EXT_meshopt_compression && meshoptExt) { return meshoptExt.loadBufferView(EXT_meshopt_compression, buffers, loader.getMeshoptDecoder()); } } const arrayBuffer = buffers[buffer]; return arrayBuffer.slice(byteOffset, byteOffset + byteLength); }) ).then(bufferViews => { context.bufferViews = bufferViews; }); } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/ImageParser.js ================================================ import { GLTFUtils } from '../GLTFUtils.js'; export class ImageParser { static parse(context, loader) { const { gltf, bufferViews, path, loadItems } = context; if (!gltf.images) return; const basisuExt = loader.extensions.get('KHR_texture_basisu'); return Promise.all( gltf.images.map((params, index) => { const { uri, bufferView: bufferViewIndex, mimeType, name: imageName } = params; let isObjectURL = false; let sourceUrl = uri || ''; if (bufferViewIndex !== undefined) { const bufferViewData = bufferViews[bufferViewIndex]; const blob = new Blob([bufferViewData], { type: mimeType }); sourceUrl = URL.createObjectURL(blob); isObjectURL = true; } const imageUrl = GLTFUtils.resolveURL(sourceUrl, path); if (loader.detailLoadProgress) { loadItems.delete(imageUrl); } let promise; if (mimeType && mimeType.includes('ktx2') && basisuExt) { promise = basisuExt.loadTextureData(imageUrl, loader.getKTX2Loader()).then(transcodeResult => { if (loader.detailLoadProgress) { if (isObjectURL) { loader.manager.itemEnd(GLTFUtils.resolveURL('blob<' + index + '>', path)); } else { loader.manager.itemEnd(imageUrl); } } return transcodeResult; }); } else { const param = { loader, imageUrl, imageName, isObjectURL, sourceUrl, index, path }; if (mimeType && (mimeType.includes('avif') || mimeType.includes('webp'))) { promise = detectSupport(mimeType).then(isSupported => { if (isSupported) return loadImage(param); throw new Error('GLTFLoader: WebP or AVIF required by asset but unsupported.'); }); } else { return loadImage(param); } } if (loader.detailLoadProgress) { promise.catch(() => loader.manager.itemEnd(imageUrl)); } return promise; }) ).then(images => { context.images = images; }); } } function detectSupport(mimeType) { const isSupported = new Promise(resolve => { // Lossy test image. const image = new Image(); if (mimeType.includes('avif')) { image.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI='; } else { image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'; } image.onload = () => { resolve(image.height === 1); }; }); return isSupported; } function loadImage(param) { const { loader, imageUrl, imageName, isObjectURL, sourceUrl, index, path } = param; const promise = loader.loadImage(imageUrl).then(image => { image.__name = imageName; if (isObjectURL === true) { URL.revokeObjectURL(sourceUrl); } if (loader.detailLoadProgress) { if (isObjectURL) { loader.manager.itemEnd(GLTFUtils.resolveURL('blob<' + index + '>', path)); } else { loader.manager.itemEnd(imageUrl); } } return image; }); return promise; } ================================================ FILE: examples/jsm/loaders/glTF/parsers/IndexParser.js ================================================ import { GLTFUtils } from '../GLTFUtils.js'; export class IndexParser { static parse(context, loader) { const { url } = context; return loader.loadFile(url, 'arraybuffer').then(data => { const magic = GLTFUtils.decodeText(new Uint8Array(data, 0, 4)); if (magic === 'glTF') { const glbData = GLTFUtils.parseGLB(data); context.gltf = glbData.gltf; context.buffers = glbData.buffers; } else { const gltfString = GLTFUtils.decodeText(new Uint8Array(data)); context.gltf = JSON.parse(gltfString); } }); } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/MaterialParser.js ================================================ import { PBRMaterial, DRAW_SIDE, TEXEL_ENCODING_TYPE } from 't3d'; import { ALPHA_MODES } from '../Constants.js'; export class MaterialParser { static parse(context, loader) { const { gltf, textures } = context; if (!gltf.materials) return; const transformExt = loader.extensions.get('KHR_texture_transform'); const materials = []; for (let i = 0; i < gltf.materials.length; i++) { const { extensions = {}, pbrMetallicRoughness, normalTexture, occlusionTexture, emissiveTexture, emissiveFactor, alphaMode, alphaCutoff, doubleSided, name = '' } = gltf.materials[i]; let material = null; const materialExtNames = loader.autoParseConfig.materials; // TODO: refactor invoke method for (let j = 0; j < materialExtNames.length; j++) { const extName = materialExtNames[j]; const extParams = extensions[extName]; const ext = loader.extensions.get(extName); if (extParams && ext && ext.getMaterial) { material = ext.getMaterial(); break; } } material = material || new PBRMaterial(); material.name = name; for (let j = 0; j < materialExtNames.length; j++) { const extName = materialExtNames[j]; const extParams = extensions[extName]; const ext = loader.extensions.get(extName); if (extParams && ext && ext.parseParams) { ext.parseParams(material, extParams, textures, transformExt); } } const { KHR_materials_unlit, KHR_materials_pbrSpecularGlossiness } = extensions; if (pbrMetallicRoughness) { const { baseColorFactor, baseColorTexture, metallicFactor, roughnessFactor, metallicRoughnessTexture } = pbrMetallicRoughness; if (Array.isArray(baseColorFactor)) { material.diffuse.fromArray(baseColorFactor); material.opacity = (baseColorFactor[3] !== undefined) ? baseColorFactor[3] : 1; } if (baseColorTexture) { material.diffuseMap = textures[baseColorTexture.index]; material.diffuseMapCoord = baseColorTexture.texCoord || 0; if (material.diffuseMap) { material.diffuseMap.encoding = TEXEL_ENCODING_TYPE.SRGB; transformExt && transformExt.handleMaterialMap(material, 'diffuseMap', baseColorTexture); } } if (!KHR_materials_unlit && !KHR_materials_pbrSpecularGlossiness) { material.metalness = metallicFactor !== undefined ? metallicFactor : 1; material.roughness = roughnessFactor !== undefined ? roughnessFactor : 1; if (metallicRoughnessTexture) { material.metalnessMap = textures[metallicRoughnessTexture.index]; material.roughnessMap = textures[metallicRoughnessTexture.index]; // metallicRoughnessTexture transform not supported yet } } } if (emissiveFactor) { material.emissive.fromArray(emissiveFactor); } if (emissiveTexture) { material.emissiveMap = textures[emissiveTexture.index]; material.emissiveMapCoord = emissiveTexture.texCoord || 0; if (material.emissiveMap) { material.emissiveMap.encoding = TEXEL_ENCODING_TYPE.SRGB; transformExt && transformExt.handleMaterialMap(material, 'emissiveMap', emissiveTexture); } } if (occlusionTexture) { material.aoMap = textures[occlusionTexture.index]; material.aoMapCoord = occlusionTexture.texCoord || 0; if (occlusionTexture.strength !== undefined) { material.aoMapIntensity = occlusionTexture.strength; } if (material.aoMap) { transformExt && transformExt.handleMaterialMap(material, 'aoMap', occlusionTexture); } } if (!KHR_materials_unlit) { if (normalTexture) { material.normalMap = textures[normalTexture.index]; material.normalScale.set(1, -1); if (normalTexture.scale !== undefined) { // fix flip y for normal map // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 material.normalScale.set(normalTexture.scale, -normalTexture.scale); } // normal map transform not supported yet } } material.side = doubleSided === true ? DRAW_SIDE.DOUBLE : DRAW_SIDE.FRONT; if (alphaMode === ALPHA_MODES.BLEND) { material.transparent = true; } else { material.transparent = false; if (alphaMode === ALPHA_MODES.MASK) { material.alphaTest = alphaCutoff !== undefined ? alphaCutoff : 0.5; } } materials[i] = material; } context.materials = materials; } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/NodeParser.js ================================================ import { Bone, Camera, Object3D, Mesh, SkinnedMesh } from 't3d'; import { GLTFUtils } from '../GLTFUtils.js'; export class NodeParser { static parse(context, loader) { const { gltf: { nodes: gltfNodes, cameras: gltfCameras, extensions: gltfExtensions } } = context; if (!gltfNodes) return; const lightsExt = loader.extensions.get('KHR_lights_punctual'); const instancingExt = loader.extensions.get('EXT_mesh_gpu_instancing'); const cameras = []; const lights = []; const nodes = gltfNodes.map(gltfNode => { const { matrix, translation, rotation, scale, camera: cameraID, mesh: meshID, extensions = {} } = gltfNode; const { KHR_lights_punctual, EXT_mesh_gpu_instancing } = extensions; let node = null; if (gltfNode.isBone) { // .isBone isn't in glTF spec. Marked in IndexParser node = new Bone(); } else if (meshID !== undefined) { if (EXT_mesh_gpu_instancing && instancingExt) { node = instancingExt.getInstancedMesh(context, gltfNode); } else { node = createMesh(context, gltfNode); } } else if (cameraID !== undefined) { node = createCamera(gltfCameras[cameraID]); cameras.push(node); } else if (KHR_lights_punctual && lightsExt) { const lightIndex = KHR_lights_punctual.light; const gltfLights = gltfExtensions.KHR_lights_punctual.lights; node = lightsExt.getLight(gltfLights[lightIndex]); lights.push(node); } else { node = new Object3D(); } node.name = gltfNode.name || ''; if (!!node.name && node.children.length > 0) { for (let i = 0; i < node.children.length; i++) { node.children[i].name = node.name + '_' + i; } } if (matrix !== undefined) { node.matrix.fromArray(matrix); node.matrix.decompose(node.position, node.quaternion, node.scale); } else { if (translation !== undefined) { node.position.fromArray(translation); } if (rotation !== undefined) { node.quaternion.fromArray(rotation); } if (scale !== undefined) { node.scale.fromArray(scale); } } return node; }); context.nodes = nodes; context.cameras = cameras; context.lights = lights; } } function createCamera(cameraDef) { const { orthographic, perspective, type } = cameraDef; const camera = new Camera(); if (type == 'perspective') { const { aspectRatio, yfov, zfar, znear } = perspective; camera.setPerspective(yfov, aspectRatio || 1, znear || 1, zfar || 2e6); } else if (type == 'orthographic') { const { xmag, ymag, zfar, znear } = orthographic; // https:// github.com/KhronosGroup/glTF/issues/1663 camera.setOrtho(-xmag, xmag, -ymag, ymag, znear || 1, zfar || 2e6); } return camera; } function createMesh(context, gltfNode) { const { primitives } = context; const { mesh: meshID, skin: skinID } = gltfNode; const meshes = primitives[meshID].map(primitive => { const { geometry, material, weights } = primitive; let mesh; if (skinID !== undefined) { mesh = new SkinnedMesh(geometry, material); if (geometry.attributes.skinWeight && !geometry.attributes.skinWeight.normalized) { GLTFUtils.normalizeSkinWeights(geometry.attributes.skinWeight); } } else { mesh = new Mesh(geometry, material); if (weights) { mesh.morphTargetInfluences = weights.slice(); } } return mesh; }); if (meshes.length > 1) { const parent = new Object3D(); meshes.forEach(mesh => parent.add(mesh)); return parent; } else { return meshes[0]; } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/PrimitiveParser.js ================================================ import { Geometry, PBRMaterial, VERTEX_COLOR, SHADING_TYPE, PointsMaterial, Material, BasicMaterial } from 't3d'; import { GLTFUtils } from '../GLTFUtils.js'; import { ATTRIBUTES, ACCESSOR_COMPONENT_TYPES, WEBGL_DRAW_MODES } from '../Constants.js'; export class PrimitiveParser { static parse(context, loader) { const { gltf, accessors, materials, bufferViews } = context; if (!gltf.meshes) return; const dracoExt = loader.extensions.get('KHR_draco_mesh_compression'); const materialCache = new Map(); const geometryPromiseCache = new Map(); const meshPromises = []; for (let i = 0; i < gltf.meshes.length; i++) { const gltfMesh = gltf.meshes[i]; const primitivePromises = []; for (let j = 0; j < gltfMesh.primitives.length; j++) { const gltfPrimitive = gltfMesh.primitives[j]; const { extensions = {}, mode, material } = gltfPrimitive; const { KHR_draco_mesh_compression } = extensions; let geometryPromise; const geometryKey = createGeometryKey(gltfPrimitive); if (geometryPromiseCache.has(geometryKey)) { geometryPromise = geometryPromiseCache.get(geometryKey); } else { if (KHR_draco_mesh_compression && dracoExt) { geometryPromise = dracoExt.getGeometry(KHR_draco_mesh_compression, bufferViews, gltfPrimitive.attributes, gltf.accessors, loader.getDRACOLoader()); } else { geometryPromise = Promise.resolve(new Geometry()); } geometryPromise = geometryPromise.then(geometry => { parseGeometryFromGLTFPrimitive(geometry, gltfPrimitive, gltf, accessors); return geometry; }); geometryPromiseCache.set(geometryKey, geometryPromise); } const primitivePromise = geometryPromise.then(geometry => { const primitive = { mode, geometry, material: material === undefined ? new PBRMaterial() : materials[material], weights: (Object.keys(geometry.morphAttributes).length > 0 && gltfMesh.weights) ? gltfMesh.weights.slice(0) : undefined, skinned: gltfMesh.isSkinned }; assignFinalMaterial(primitive, materialCache); return primitive; }); primitivePromises.push(primitivePromise); } meshPromises.push(Promise.all(primitivePromises)); } materialCache.clear(); geometryPromiseCache.clear(); return Promise.all(meshPromises).then(primitives => { context.primitives = primitives; }); } } function parseGeometryFromGLTFPrimitive(geometry, gltfPrimitive, gltf, accessors) { const { attributes, indices, targets } = gltfPrimitive; // set attributes for (const attributeSemantic in attributes) { const accessorIdx = attributes[attributeSemantic]; const attributeName = ATTRIBUTES[attributeSemantic] === undefined ? attributeSemantic : ATTRIBUTES[attributeSemantic]; // Skip attributes already provided by e.g. Draco extension. if (attributeName in geometry.attributes) continue; geometry.addAttribute(attributeName, accessors[accessorIdx]); } // set index if (indices !== undefined && !geometry.index) { geometry.setIndex(accessors[indices]); } // compute bounds const { boundingBox, boundingSphere } = geometry; if (attributes.POSITION !== undefined) { const accessorIdx = attributes.POSITION; const accessor = gltf.accessors[accessorIdx]; if (accessor.min && accessor.max) { boundingBox.min.fromArray(accessor.min); boundingBox.max.fromArray(accessor.max); if (accessor.normalized) { const boxScale = GLTFUtils.getNormalizedComponentScale(ACCESSOR_COMPONENT_TYPES[accessor.componentType]); boundingBox.min.multiplyScalar(boxScale); boundingBox.max.multiplyScalar(boxScale); } } else { geometry.computeBoundingBox(); } } else { geometry.computeBoundingBox(); } boundingBox.getCenter(boundingSphere.center); boundingSphere.radius = boundingBox.min.distanceTo(boundingBox.max) / 2; // set morph targets if (targets) { let hasMorphPosition = false; let hasMorphNormal = false; for (let i = 0, il = targets.length; i < il; i++) { const target = targets[i]; if (target.POSITION !== undefined) hasMorphPosition = true; if (target.NORMAL !== undefined) hasMorphNormal = true; if (hasMorphPosition && hasMorphNormal) break; } if (hasMorphPosition || hasMorphNormal) { const morphPositions = []; const morphNormals = []; for (let i = 0, il = targets.length; i < il; i++) { const target = targets[i]; if (hasMorphPosition) { morphPositions.push(target.POSITION !== undefined ? accessors[target.POSITION] : geometry.attributes[ATTRIBUTES.POSITION]); } if (hasMorphNormal) { morphNormals.push(target.NORMAL !== undefined ? accessors[target.NORMAL] : geometry.attributes[ATTRIBUTES.NORMAL]); } } if (hasMorphPosition) { geometry.morphAttributes.position = morphPositions; } if (hasMorphNormal) { geometry.morphAttributes.normal = morphNormals; } } } return geometry; } function assignFinalMaterial(primitive, materialCache) { let { geometry, material, skinned, mode } = primitive; // If the material will be modified later on, clone it now. const useVertexTangents = geometry.attributes[ATTRIBUTES.TANGENT] !== undefined; const useVertexColors = geometry.attributes[ATTRIBUTES.COLOR_0] !== undefined; const useFlatShading = geometry.attributes[ATTRIBUTES.NORMAL] === undefined; const useSkinning = skinned; if (mode === WEBGL_DRAW_MODES.POINTS) { const cacheKey = 'PointsMaterial:' + material.id; let pointsMaterial = materialCache.get(cacheKey); if (!pointsMaterial) { pointsMaterial = new PointsMaterial(); Material.prototype.copy.call(pointsMaterial, material); pointsMaterial.diffuse.copy(material.diffuse); pointsMaterial.diffuseMap = material.map; pointsMaterial.drawMode = mode; pointsMaterial.acceptLight = false; // PointsMaterial doesn't support lights yet materialCache.set(cacheKey, pointsMaterial); } material = pointsMaterial; } else if (mode === WEBGL_DRAW_MODES.LINES || mode === WEBGL_DRAW_MODES.LINE_STRIP || mode === WEBGL_DRAW_MODES.LINE_LOOP) { const cacheKey = 'BasicMaterial:' + material.id; let basicMaterial = materialCache.get(cacheKey); if (!basicMaterial) { basicMaterial = new BasicMaterial(); basicMaterial.envMap = undefined; // force close env map basicMaterial.diffuse.copy(material.diffuse); basicMaterial.diffuseMap = material.diffuseMap; basicMaterial.drawMode = mode; materialCache.set(cacheKey, basicMaterial); } material = basicMaterial; } else if (mode === WEBGL_DRAW_MODES.TRIANGLE_STRIP) { // TODO console.warn('TRIANGLE_STRIP will be removed later.'); material.drawMode = WEBGL_DRAW_MODES.TRIANGLE_STRIP; } else if (mode === WEBGL_DRAW_MODES.TRIANGLE_FAN) { // TODO console.warn('TRIANGLE_FAN will be removed later.'); material.drawMode = WEBGL_DRAW_MODES.TRIANGLE_FAN; } if (useVertexTangents || useVertexColors || useFlatShading || useSkinning) { let cacheKey = 'ClonedMaterial:' + material.id + ':'; if (useVertexTangents) cacheKey += 'vertex-tangents:'; if (useVertexColors) { if (geometry.attributes[ATTRIBUTES.COLOR_0].size === 3) { cacheKey += 'vertex-colors-rgb:'; } else if (geometry.attributes[ATTRIBUTES.COLOR_0].size === 4) { cacheKey += 'vertex-colors-rgba:'; } } if (useFlatShading) cacheKey += 'flat-shading:'; let cachedMaterial = materialCache.get(cacheKey); if (!cachedMaterial) { cachedMaterial = material.clone(); if (useVertexTangents) { cachedMaterial.vertexTangents = true; // revert flip y fix for tangents // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 if (cachedMaterial.normalMap) { cachedMaterial.normalScale.y *= -1; } } if (useVertexColors) { if (geometry.attributes[ATTRIBUTES.COLOR_0].size === 3) { cachedMaterial.vertexColors = VERTEX_COLOR.RGB; } else if (geometry.attributes[ATTRIBUTES.COLOR_0].size === 4) { cachedMaterial.vertexColors = VERTEX_COLOR.RGBA; } else { console.warn('Illegal vertex color size: ' + geometry.attributes[ATTRIBUTES.COLOR_0].size); } } if (useFlatShading) { cachedMaterial.shading = SHADING_TYPE.FLAT_SHADING; } } material = cachedMaterial; } primitive.material = material; } function createGeometryKey(primitive) { const dracoExtension = primitive.extensions && primitive.extensions.KHR_draco_mesh_compression; let geometryKey; if (dracoExtension) { geometryKey = 'draco:' + dracoExtension.bufferView + ':' + dracoExtension.indices + ':' + createAttributesKey(dracoExtension.attributes); } else { geometryKey = primitive.indices + ':' + createAttributesKey(primitive.attributes) + ':' + primitive.mode; } if (primitive.targets) { for (let i = 0, il = primitive.targets.length; i < il; i++) { geometryKey += ':' + createAttributesKey(primitive.targets[i]); } } return geometryKey; } function createAttributesKey(attributes) { let attributesKey = ''; const keys = Object.keys(attributes).sort(); for (let i = 0, il = keys.length; i < il; i++) { attributesKey += keys[i] + ':' + attributes[keys[i]] + ';'; } return attributesKey; } ================================================ FILE: examples/jsm/loaders/glTF/parsers/ReferenceParser.js ================================================ import { GLTFUtils } from '../GLTFUtils.js'; // Marks the special nodes/meshes in json for efficient parse. export class ReferenceParser { static parse(context, loader) { const { gltf, path } = context; const { nodes = [], skins = [], meshes = [], buffers, images } = gltf; // Nothing in the node definition indicates whether it is a Bone or an // Object3D. Use the skins' joint references to mark bones. skins.forEach(skin => { const { joints = [] } = skin; joints.forEach(joint => { nodes[joint].isBone = true; }); }); // Nothing in the mesh definition indicates whether it is // a SkinnedMesh or Mesh. Use the node's mesh reference // to mark SkinnedMesh if node has skin. nodes.forEach(node => { if (node.mesh !== undefined) { if (node.skin !== undefined) { meshes[node.mesh].isSkinned = true; } } }); // setup loading list for detail load progress if (loader.detailLoadProgress) { const loadItems = new Set(); if (buffers) { buffers.forEach(buffer => { if (!buffer.uri) { // glb or other return; } const bufferUrl = GLTFUtils.resolveURL(buffer.uri, path); loadItems.add(bufferUrl); }); } if (images) { images.forEach((image, index) => { const { uri, bufferView: bufferViewIndex } = image; let imageUrl = uri; if (bufferViewIndex !== undefined) { imageUrl = 'blob<' + index + '>'; // fake url for blob image } imageUrl = GLTFUtils.resolveURL(imageUrl, path); loadItems.add(imageUrl); }); } loadItems.forEach(item => loader.manager.itemStart(item)); context.loadItems = loadItems; } } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/SceneParser.js ================================================ import { Object3D } from 't3d'; export class SceneParser { static parse(context) { const { gltf, nodes } = context; const roots = gltf.scenes.map(sceneDef => { const { name: sceneName = '', nodes: nodeIds = [] } = sceneDef; const group = new Object3D(); group.name = sceneName; for (let i = 0; i < nodeIds.length; i++) { buildNodeHierachy(nodeIds[i], group, gltf.nodes, nodes); } return group; }); context.roots = roots; context.root = roots[gltf.scene || 0]; } } function buildNodeHierachy(nodeId, parentNode, gltfNodes, nodes) { const node = nodes[nodeId]; const nodeDef = gltfNodes[nodeId]; parentNode.add(node); if (nodeDef.children) { const children = nodeDef.children; for (let i = 0, il = children.length; i < il; i++) { const child = children[i]; buildNodeHierachy(child, node, gltfNodes, nodes); } } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/SkinParser.js ================================================ import { Matrix4, Skeleton } from 't3d'; export class SkinParser { static parse(context) { const { gltf, accessors, nodes } = context; const gltfSkins = gltf.skins; if (!gltfSkins) return; const skins = gltfSkins.map(skin => { const { inverseBindMatrices, joints } = skin; const attribute = accessors[inverseBindMatrices]; const bones = []; const boneInverses = []; joints.forEach((jointId, index) => { const jointNode = nodes[jointId]; if (jointNode) { bones.push(jointNode); const boneInverse = new Matrix4(); if (attribute) { boneInverse.fromArray(attribute.buffer.array, index * 16); } boneInverses.push(boneInverse); } else { console.warn('Joint ' + jointId + ' could not be found.'); } }); return new Skeleton(bones, boneInverses); }); context.skins = skins; // Bind all skined meshes nodes.forEach((node, index) => { const { skin: skinID } = gltf.nodes[index]; if (skinID !== undefined) { node.traverse(function(mesh) { if (!mesh.isSkinnedMesh) return; mesh.bind(skins[skinID], mesh.worldMatrix); // TODO need updateMatrix ? }); } }); } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/TextureParser.js ================================================ import { Texture2D, TEXTURE_FILTER, TEXTURE_WRAP } from 't3d'; import { WEBGL_WRAPPINGS, WEBGL_FILTERS } from '../Constants.js'; export class TextureParser { static parse(context) { const { gltf, images } = context; if (!gltf.textures) return; const textureCache = new Map(); return Promise.all( gltf.textures.map((params, index) => { const { sampler, source = 0, name: textureName } = params; let sourceIndex = source, isTextureData = false; if (params.extensions) { const { KHR_texture_basisu } = params.extensions; if (KHR_texture_basisu) { sourceIndex = KHR_texture_basisu.source; isTextureData = true; } else if (Object.values(params.extensions).length && Object.values(params.extensions)[0].hasOwnProperty('source')) { sourceIndex = Object.values(params.extensions)[0].source; } else { console.warn('GLTFLoader: unknown texture extension'); } } const cacheKey = sourceIndex + ':' + sampler; if (textureCache.has(cacheKey)) { return textureCache.get(cacheKey); } const texture = new Texture2D(); if (isTextureData) { const { image, mipmaps, type, format, minFilter, magFilter, generateMipmaps, encoding, premultiplyAlpha } = images[sourceIndex]; texture.image = image; texture.mipmaps = mipmaps; texture.type = type; texture.format = format; texture.minFilter = minFilter; texture.magFilter = magFilter; texture.generateMipmaps = generateMipmaps; texture.encoding = encoding; texture.premultiplyAlpha = premultiplyAlpha; } else { texture.image = images[sourceIndex]; } texture.version++; texture.name = textureName || texture.image.__name || `texture_${index}`; texture.flipY = false; const { mimeType, uri } = gltf.images[sourceIndex]; texture.userData.mimeType = mimeType || getImageURIMimeType(uri); const samplers = gltf.samplers || {}; parseSampler(texture, samplers[sampler]); textureCache.set(cacheKey, texture); return texture; }) ).then(textures => { context.textures = textures; textureCache.clear(); }); } } function parseSampler(texture, sampler = {}) { const { magFilter, minFilter, wrapS, wrapT } = sampler; texture.magFilter = WEBGL_FILTERS[magFilter] || TEXTURE_FILTER.LINEAR; texture.minFilter = WEBGL_FILTERS[minFilter] || TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; texture.wrapS = WEBGL_WRAPPINGS[wrapS] || TEXTURE_WRAP.REPEAT; texture.wrapT = WEBGL_WRAPPINGS[wrapT] || TEXTURE_WRAP.REPEAT; } // only for jpeg, png, webp // because other should get mimeType from glTF image object function getImageURIMimeType(uri) { if (uri.startsWith('data:image/')) { // early return for data URIs if (uri.startsWith('data:image/jpeg')) return 'image/jpeg'; if (uri.startsWith('data:image/webp')) return 'image/webp'; return 'image/png'; } else { if (uri.search(/\.jpe?g($|\?)/i) > 0) return 'image/jpeg'; if (uri.search(/\.webp($|\?)/i) > 0) return 'image/webp'; return 'image/png'; } } ================================================ FILE: examples/jsm/loaders/glTF/parsers/Validator.js ================================================ export class Validator { static parse(context) { const { gltf: { asset: { version } } } = context; const gltfVersion = Number(version); if (!(gltfVersion >= 2 && gltfVersion < 3)) { throw 'Only support gltf 2.x.'; } } } ================================================ FILE: examples/jsm/materials/AlphaHashedPBRMaterial.js ================================================ import { ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d'; export class AlphaHashedPBRMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'AlphaHashedPBR'; this.vertexShader = ShaderLib.pbr_vert; this.fragmentShader = fragmentShader; this.defines.USE_ALPHAHASH = true; } } let fragmentShader = ShaderLib.pbr_frag; /** * See: https://casual-effects.com/research/Wyman2017Hashed/index.html */ const alphahash_pars_fragment = ` #ifdef USE_ALPHAHASH const float ALPHA_HASH_SCALE = 0.05; // Derived from trials only, and may be changed. float hash2D(vec2 value) { return fract(1.0e4 * sin(17.0 * value.x + 0.1 * value.y) * (0.1 + abs(sin(13.0 * value.y + value.x)))); } float hash3D(vec3 value) { return hash2D(vec2(hash2D(value.xy), value.z)); } float getAlphaHashThreshold(vec3 position) { // Find the discretized derivatives of our coordinates float maxDeriv = max( length(dFdx(position.xyz)), length(dFdy(position.xyz)) ); float pixScale = 1.0 / (ALPHA_HASH_SCALE * maxDeriv); // Find two nearest log-discretized noise scales vec2 pixScales = vec2( exp2(floor(log2(pixScale))), exp2(ceil(log2(pixScale))) ); // Compute alpha thresholds at our two noise scales vec2 alpha = vec2( hash3D(floor(pixScales.x * position.xyz)), hash3D(floor(pixScales.y * position.xyz)) ); // Factor to interpolate lerp with float lerpFactor = fract(log2(pixScale)); // Interpolate alpha threshold from noise at two scales float x = (1.0 - lerpFactor) * alpha.x + lerpFactor * alpha.y; // Pass into CDF to compute uniformly distrib threshold float a = min(lerpFactor, 1.0 - lerpFactor); vec3 cases = vec3( x * x / (2.0 * a * (1.0 - a)), (x - 0.5 * a) / (1.0 - a), 1.0 - ((1.0 - x) * (1.0 - x) / (2.0 * a * (1.0 - a))) ); // Find our final, uniformly distributed alpha threshold (ατ) float threshold = (x < (1.0 - a)) ? ((x < a) ? cases.x : cases.y) : cases.z; // Avoids ατ == 0. Could also do ατ =1-ατ return clamp(threshold , 1.0e-6, 1.0); } #endif `; const alphamap_fragment = ` #ifdef USE_ALPHAHASH if (outColor.a < getAlphaHashThreshold(v_modelPos)) discard; #endif `; fragmentShader = fragmentShader.replace('#include ', ` #include ${alphahash_pars_fragment} `); fragmentShader = fragmentShader.replace('#include ', ` #include ${alphamap_fragment} `); ================================================ FILE: examples/jsm/materials/AttenuationMaterial.js ================================================ import { MATERIAL_TYPE, PBRMaterial, ShaderLib } from 't3d'; const fresnel_pars_frag = ` #include #include #ifdef FRESNEL uniform float fresnelPower; uniform bool fresnelInverse; #endif `; const fresnel_frag = ` #ifdef FRESNEL vec3 normal = (transposeMat4(inverseMat4(u_View)) * vec4(N, 0.0)).xyz; normal = normalize(normal); if (fresnelInverse) { gl_FragColor.a *= pow(abs(dot(normal, vec3(0., 0., 1.))), fresnelPower); } else { gl_FragColor.a *= pow(1.0 - abs(dot(normal, vec3(0., 0., 1.))), fresnelPower); } #endif `; let pbr_frag = ShaderLib.pbr_frag; pbr_frag = pbr_frag.replace('#include ', ` #include ${fresnel_pars_frag} `); pbr_frag = pbr_frag.replace('#include ', ` #include ${fresnel_frag} `); class AttenuationPBRMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'AttenuationPBR'; this.vertexShader = ShaderLib.pbr_vert; this.fragmentShader = pbr_frag; this.defines.FRESNEL = true; this.uniforms.fresnelPower = 0.9; this.uniforms.fresnelInverse = false; this.transparent = true; } } export { AttenuationPBRMaterial, fresnel_pars_frag, fresnel_frag }; ================================================ FILE: examples/jsm/materials/BatchedMaterial.js ================================================ import { ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d'; const batching_pars_vert = ` #ifdef USE_BATCHING #extension GL_ANGLE_multi_draw: require uniform usampler2D batchingIdTexture; uniform sampler2D batchingTexture; float getIndirectIndex(const in int i) { int size = textureSize(batchingIdTexture, 0).x; int x = i % size; int y = i / size; return float(texelFetch(batchingIdTexture, ivec2(x, y), 0).r); } mat4 getBatchingMatrix(const in float i) { int size = textureSize(batchingTexture, 0).x; int j = int(i) * 4; int x = j % size; int y = j / size; vec4 v1 = texelFetch(batchingTexture, ivec2(x, y), 0); vec4 v2 = texelFetch(batchingTexture, ivec2(x + 1, y), 0); vec4 v3 = texelFetch(batchingTexture, ivec2(x + 2, y), 0); vec4 v4 = texelFetch(batchingTexture, ivec2(x + 3, y), 0); return mat4(v1, v2, v3, v4); } #ifdef USE_BATCHING_COLOR uniform sampler2D batchingColorTexture; vec4 getBatchingColor(const in float i) { int size = textureSize(batchingColorTexture, 0).x; int j = int(i); int x = j % size; int y = j / size; return texelFetch(batchingColorTexture, ivec2(x, y), 0); } varying vec4 v_BatchingColor; #endif #endif `; const batching_position_vert = ` #ifdef USE_BATCHING mat4 batchingMatrix = getBatchingMatrix(getIndirectIndex(gl_DrawID)); vec4 worldPosition = u_Model * batchingMatrix * vec4(transformed, 1.0); #else vec4 worldPosition = u_Model * vec4(transformed, 1.0); #endif gl_Position = u_ProjectionView * worldPosition; `; const batching_normal_vert = ` #ifdef USE_BATCHING mat4 batchingNormalMatrix = transposeMat4(inverseMat4(batchingMatrix)); objectNormal = (batchingNormalMatrix * vec4(objectNormal, 0.0)).xyz; #ifdef USE_TANGENT objectTangent = (batchingNormalMatrix * vec4(objectTangent, 0.0)).xyz; #endif #endif `; const batching_color_vert = ` #if defined(USE_BATCHING) && defined(USE_BATCHING_COLOR) v_BatchingColor = getBatchingColor(getIndirectIndex(gl_DrawID)); #endif `; const batching_pars_frag = ` #if defined(USE_BATCHING) && defined(USE_BATCHING_COLOR) varying vec4 v_BatchingColor; #endif `; const batching_color_frag = ` #if defined(USE_BATCHING) && defined(USE_BATCHING_COLOR) outColor *= v_BatchingColor; #endif `; // BatchedPBRMaterial let pbr_vert = ShaderLib.pbr_vert; pbr_vert = pbr_vert.replace('#include ', ` #include ${batching_pars_vert} `); pbr_vert = pbr_vert.replace('#include ', batching_position_vert); pbr_vert = pbr_vert.replace('#include ', ` ${batching_normal_vert} #include `); pbr_vert = pbr_vert.replace('#include ', ` #include ${batching_color_vert} `); let pbr_frag = ShaderLib.pbr_frag; pbr_frag = pbr_frag.replace('#include ', ` #include ${batching_pars_frag} `); pbr_frag = pbr_frag.replace('#include ', ` #include ${batching_color_frag} `); class BatchedPBRMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'BatchedPBR'; this.vertexShader = pbr_vert; this.fragmentShader = pbr_frag; this.defines.USE_BATCHING = true; this.defines.USE_BATCHING_COLOR = false; this.uniforms.batchingIdTexture = null; this.uniforms.batchingTexture = null; this.uniforms.batchingColorTexture = null; } } // TODO BatchedDepthMaterial export { BatchedPBRMaterial, batching_pars_vert, batching_position_vert, batching_normal_vert, batching_color_vert, batching_pars_frag, batching_color_frag }; ================================================ FILE: examples/jsm/materials/BatchedPBRMaterial.js ================================================ // deprecated since v0.4.0 console.warn('BatchedPBRMaterial has been moved to t3d/addons/material/BatchedMaterial.js'); export { BatchedPBRMaterial } from './BatchedMaterial.js'; ================================================ FILE: examples/jsm/materials/BitmapTextMaterial.js ================================================ import { ShaderMaterial } from 't3d'; class BitmapTextMaterial extends ShaderMaterial { constructor() { super(BitmapTextShader); this.transparent = true; } } const BitmapTextShader = { name: 'bitmap_text', defines: { BILLBOARD: false, SIZEATTENUATION: true, BITMAP_TYPE: 1, SHADOW: false, OUTLINE: false }, uniforms: { rotation: 0, center: [0.5, 0.5], gamma: 1, halo: 0.75, shadowColor: [0.3, 0.3, 0.3], shadowOffset: [0.001, -0.001], shadowGamma: 1, outlineColor: [1, 0, 0], outlineWidth: 0.05, outlineGamma: 1 }, vertexShader: ` #include #include attribute vec2 a_Uv; attribute vec2 a_Size; uniform mat3 uvTransform; #ifdef BILLBOARD uniform float rotation; uniform vec2 center; #endif varying vec2 v_Uv; varying vec2 v_Size; void main() { #ifdef BILLBOARD vec4 mvPosition = u_View * u_Model * vec4( 0.0, 0.0, 0.0, 1.0 ); vec2 scale; scale.x = length(vec3(u_Model[0].x, u_Model[0].y, u_Model[0].z)); scale.y = length(vec3(u_Model[1].x, u_Model[1].y, u_Model[1].z)); #ifndef SIZEATTENUATION bool isPerspective = isPerspectiveMatrix(u_Projection); if (isPerspective) scale *= - mvPosition.z; #endif vec2 alignedPosition = (a_Position.xy - (center - vec2(0.5))) * scale; vec2 rotatedPosition; rotatedPosition.x = cos(rotation) * alignedPosition.x - sin(rotation) * alignedPosition.y; rotatedPosition.y = sin(rotation) * alignedPosition.x + cos(rotation) * alignedPosition.y; mvPosition.xy += rotatedPosition; gl_Position = u_Projection * mvPosition; #else gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); #endif v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy; v_Size = a_Size; #include } `, fragmentShader: ` uniform vec3 u_Color; uniform float u_Opacity; uniform sampler2D diffuseMap; uniform float halo; uniform float gamma; #ifdef SHADOW uniform vec3 shadowColor; uniform vec2 shadowOffset; uniform float shadowGamma; #endif #ifdef OUTLINE uniform vec3 outlineColor; uniform float outlineWidth; uniform float outlineGamma; #endif varying vec2 v_Uv; varying vec2 v_Size; vec4 blendColors(vec4 src, vec4 dst) { return vec4(src.rgb * src.a + dst.rgb * (1.0 - src.a), src.a + dst.a * (1.0 - src.a)); } float getAlpha(float dist, float halo, float gamma) { return smoothstep(halo - gamma, halo + gamma, dist); } #if BITMAP_TYPE == 1 float getSDFDist(vec2 uv) { return texture2D(diffuseMap, uv).r; } #elif BITMAP_TYPE == 2 float median(float r, float g, float b) { return max(min(r, g), min(max(r, g), b)); } float getSDFDist(vec2 uv) { vec3 cannels = texture2D(diffuseMap, uv).rgb; return median(cannels.r, cannels.g, cannels.b); } #endif #include #include void main() { #include #if BITMAP_TYPE == 0 gl_FragColor = texture2D(diffuseMap, v_Uv); #else float dist = getSDFDist(v_Uv); float gammaScalar = 1.5 * length(fwidth(v_Size)); vec4 resultColor = vec4(0.0); #ifdef SHADOW float shadowDist = getSDFDist(v_Uv - shadowOffset); float shadowAlpha = getAlpha(shadowDist, halo, shadowGamma * gammaScalar); resultColor = blendColors(vec4(shadowColor, shadowAlpha), resultColor); #endif #ifdef OUTLINE float outlineAlpha = getAlpha(dist, halo - outlineWidth, outlineGamma * gammaScalar); resultColor = blendColors(vec4(outlineColor, outlineAlpha), resultColor); #endif float textAlpha = getAlpha(dist, halo, gamma * gammaScalar); resultColor = blendColors(vec4(u_Color, textAlpha), resultColor); resultColor.rgb /= resultColor.a; resultColor.a *= u_Opacity; gl_FragColor = resultColor; #endif #include } ` }; export { BitmapTextMaterial, BitmapTextShader }; ================================================ FILE: examples/jsm/materials/InstancedBasicMaterial.js ================================================ // deprecated since v0.3.1, add warning since v0.4.0 console.warn('InstancedBasicMaterial has been moved to t3d/addons/material/InstancedMaterial.js'); export { InstancedBasicMaterial } from './InstancedMaterial.js'; ================================================ FILE: examples/jsm/materials/InstancedMaterial.js ================================================ import { ShaderLib, PBRMaterial, BasicMaterial, DepthMaterial, MATERIAL_TYPE } from 't3d'; const instancing_pars_vert = ` #ifdef USE_INSTANCING attribute mat4 instanceMatrix; uniform mat4 instanceOffset; #endif `; const instancing_position_vert = ` #ifdef USE_INSTANCING mat4 instancingMatrix = inverseMat4(instanceOffset) * instanceMatrix * instanceOffset; transformed = (instancingMatrix * vec4(transformed, 1.0)).xyz; #endif `; const instancing_normal_vert = ` #ifdef USE_INSTANCING mat3 im = mat3(instancingMatrix); // mirrored? (determinant sign: -1 or +1) float detSign = (dot(im[0], cross(im[1], im[2])) < 0.0) ? -1.0 : 1.0; // squared scale per basis (for non-uniform scale correction) vec3 invScale = vec3(dot(im[0], im[0]), dot(im[1], im[1]), dot(im[2], im[2])); objectNormal = (im * (objectNormal / invScale)) * detSign; #ifdef USE_TANGENT objectTangent = (im * (objectTangent / invScale)) * detSign; #endif #endif `; // InstancedPBRMaterial let pbr_vert = ShaderLib.pbr_vert; pbr_vert = pbr_vert.replace('#include ', ` #include ${instancing_pars_vert} `); pbr_vert = pbr_vert.replace('#include ', ` ${instancing_position_vert} #include `); pbr_vert = pbr_vert.replace('#include ', ` ${instancing_normal_vert} #include `); class InstancedPBRMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'InstancedPBR'; this.vertexShader = pbr_vert; this.fragmentShader = ShaderLib.pbr_frag; this.defines.USE_INSTANCING = true; this.uniforms.instanceOffset = new Float32Array([ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]); } } // InstancedBasicMaterial let basic_vert = ShaderLib.basic_vert; basic_vert = basic_vert.replace('#include ', ` #include ${instancing_pars_vert} `); basic_vert = basic_vert.replace('#include ', ` ${instancing_position_vert} #include `); class InstancedBasicMaterial extends BasicMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'InstancedBasic'; this.vertexShader = basic_vert; this.fragmentShader = ShaderLib.basic_frag; this.defines.USE_INSTANCING = true; this.uniforms.instanceOffset = new Float32Array([ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]); } } // InstancedDepthMaterial let depth_vert = ShaderLib.depth_vert; depth_vert = depth_vert.replace('#include ', ` #include ${instancing_pars_vert} `); depth_vert = depth_vert.replace('#include ', ` ${instancing_position_vert} #include `); class InstancedDepthMaterial extends DepthMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'InstancedDepth'; this.vertexShader = depth_vert; this.fragmentShader = ShaderLib.depth_frag; this.defines.USE_INSTANCING = true; this.uniforms.instanceOffset = new Float32Array([ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]); } } export { InstancedPBRMaterial, InstancedBasicMaterial, InstancedDepthMaterial, instancing_pars_vert, instancing_position_vert, instancing_normal_vert }; ================================================ FILE: examples/jsm/materials/InstancedPBRMaterial.js ================================================ // deprecated since v0.3.1, add warning since v0.4.0 console.warn('InstancedPBRMaterial has been moved to t3d/addons/material/InstancedMaterial.js'); export { InstancedPBRMaterial } from './InstancedMaterial.js'; ================================================ FILE: examples/jsm/materials/PlanarReflectionMaterial.js ================================================ import { ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d'; export class PlanarReflectionMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'PlanarReflection'; this.vertexShader = vertexShader; this.fragmentShader = fragmentShader; this.defines.USE_PLANAR_REFLECT = true; this.uniforms.reflectIntensity = 1.0; this.uniforms.reflectTexture = null; this.uniforms.reflectTextureMatrix = new Float32Array(16); this.uniforms.reflectNormalScale = 1.0; } } const reflection_pars_vertex = ` #ifdef USE_PLANAR_REFLECT uniform mat4 reflectTextureMatrix; varying vec4 v_reflectionUV; #endif `; const reflection_vertex = ` #ifdef USE_PLANAR_REFLECT v_reflectionUV = reflectTextureMatrix * vec4(worldPosition.xyz, 1.0); #endif `; const reflection_pars_fragment = ` #ifdef USE_PLANAR_REFLECT uniform sampler2D reflectTexture; uniform float reflectIntensity; #ifdef USE_NORMAL_MAP uniform float reflectNormalScale; #endif varying vec4 v_reflectionUV; #endif `; const reflection_fragment = ` #ifdef USE_PLANAR_REFLECT vec4 reflectionUV = v_reflectionUV; reflectionUV.xyz = reflectionUV.xyz / reflectionUV.w; #ifdef USE_NORMAL_MAP reflectionUV.xyz += ((texture2D(normalMap, v_Uv).rgb - 0.5) * reflectNormalScale) / 50.; #endif vec4 reflectionColor = sRGBToLinear(texture2D(reflectTexture, reflectionUV.xy)); float refectFactor = clamp(1.0 - reflectIntensity * reflectionColor.a, 0.0, 1.0); outColor.rgb = mix(reflectionColor.rgb, outColor.rgb, refectFactor); #endif `; let fragmentShader = ShaderLib.pbr_frag; let vertexShader = ShaderLib.pbr_vert; fragmentShader = fragmentShader.replace('#include ', ` #include ${reflection_pars_fragment} `); fragmentShader = fragmentShader.replace('#include ', ` #include ${reflection_fragment} `); vertexShader = vertexShader.replace('#include ', ` #include ${reflection_pars_vertex} `); vertexShader = vertexShader.replace('#include ', ` #include ${reflection_vertex} `); ================================================ FILE: examples/jsm/materials/TransmissionPBRMaterial.js ================================================ import { ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d'; export class TransmissionPBRMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.shaderName = 'TransmissionPBR'; this.vertexShader = ShaderLib.pbr_vert; this.fragmentShader = fragmentShader; // KHR_materials_transmission this.uniforms.transmission = 0; this.uniforms.transmissionMap = null; this.uniforms.transmissionSamplerMap = null; this.uniforms.transmissionSamplerSize = [512, 512]; this.defines.USE_TRANSMISSIONMAP = false; this.defines.SAMPLERMAP_SRGB = true; // KHR_materials_volume this.uniforms.thickness = 0; this.uniforms.thicknessMap = null; this.uniforms.attenuationColor = [1, 1, 1]; this.uniforms.attenuationDistance = Infinity; this.defines.USE_THICKNESSMAP = false; // KHR_materials_ior this.uniforms.ior = 1.5; // KHR_materials_dispersion this.uniforms.dispersion = 0; this.defines.USE_DISPERSION = false; } } // Transmission code is based on glTF-Sampler-Viewer // https://github.com/KhronosGroup/glTF-Sample-Viewer const transmission_pars_frag = ` uniform float transmission; uniform float thickness; uniform float attenuationDistance; uniform vec3 attenuationColor; #ifdef USE_TRANSMISSIONMAP uniform sampler2D transmissionMap; #endif #ifdef USE_THICKNESSMAP uniform sampler2D thicknessMap; #endif uniform float dispersion; uniform float ior; uniform vec2 transmissionSamplerSize; uniform sampler2D transmissionSamplerMap; uniform mat4 u_Model; uniform mat4 u_Projection; #ifdef SAMPLERMAP_SRGB vec4 samplerTexelToLinear(vec4 value) { return sRGBToLinear(value); } #else vec4 samplerTexelToLinear(vec4 value) { return value; } #endif struct TransmissionParams { float specularF90; vec3 specularColor; float ior; float transmission; float transmissionAlpha; float thickness; float attenuationDistance; vec3 attenuationColor; }; TransmissionParams transParams; // Mipped Bicubic Texture Filtering by N8 // https://www.shadertoy.com/view/Dl2SDW float w0(float a) { return(1.0 / 6.0) * (a * (a * (-a + 3.0) - 3.0) + 1.0); } float w1(float a) { return (1.0 / 6.0) * (a * a * (3.0 * a - 6.0) + 4.0); } float w2(float a){ return (1.0 / 6.0) * (a * (a * (-3.0 * a + 3.0) + 3.0) + 1.0); } float w3(float a) { return (1.0 / 6.0) * (a * a * a); } // g0 and g1 are the two amplitude functions float g0(float a) { return w0(a) + w1(a); } float g1(float a) { return w2(a) + w3(a); } // h0 and h1 are the two offset functions float h0(float a) { return - 1.0 + w1(a) / (w0(a) + w1(a)); } float h1(float a) { return 1.0 + w3(a) / (w2(a) + w3(a)); } vec4 bicubic(sampler2D tex, vec2 uv, vec4 texelSize, float lod) { uv = uv * texelSize.zw + 0.5; vec2 iuv = floor(uv); vec2 fuv = fract(uv); float g0x = g0(fuv.x); float g1x = g1(fuv.x); float h0x = h0(fuv.x); float h1x = h1(fuv.x); float h0y = h0(fuv.y); float h1y = h1(fuv.y); vec2 p0 = (vec2(iuv.x + h0x, iuv.y + h0y) - 0.5) * texelSize.xy; vec2 p1 = (vec2(iuv.x + h1x, iuv.y + h0y) - 0.5) * texelSize.xy; vec2 p2 = (vec2(iuv.x + h0x, iuv.y + h1y) - 0.5) * texelSize.xy; vec2 p3 = (vec2(iuv.x + h1x, iuv.y + h1y) - 0.5) * texelSize.xy; return g0(fuv.y) * (g0x * textureLod(tex, p0, lod) + g1x * textureLod(tex, p1, lod)) + g1(fuv.y) * (g0x * textureLod(tex, p2, lod) + g1x * textureLod(tex, p3, lod)); } vec4 textureBicubic(sampler2D sampler, vec2 uv, float lod) { vec2 fLodSize = vec2(textureSize(sampler, int(lod))); vec2 cLodSize = vec2(textureSize(sampler, int(lod + 1.0))); vec2 fLodSizeInv = 1.0 / fLodSize; vec2 cLodSizeInv = 1.0 / cLodSize; vec4 fSample = bicubic(sampler, uv, vec4(fLodSizeInv, fLodSize), floor(lod)); vec4 cSample = bicubic(sampler, uv, vec4(cLodSizeInv, cLodSize), ceil(lod)); return mix(fSample, cSample, fract(lod)); } vec3 getVolumeTransmissionRay(const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix) { // Direction of refracted light. vec3 refractionVector = refract(-v, normalize(n), 1.0 / ior); // Compute rotation-independant scaling of the model matrix. vec3 modelScale; modelScale.x = length(vec3(modelMatrix[0].xyz)); modelScale.y = length(vec3(modelMatrix[1].xyz)); modelScale.z = length(vec3(modelMatrix[2].xyz)); // The thickness is specified in local space. return normalize(refractionVector) * thickness * modelScale; } float applyIorToRoughness(const in float roughness, const in float ior) { // Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and // an IOR of 1.5 results in the default amount of microfacet refraction. return roughness * clamp(ior * 2.0 - 2.0, 0.0, 1.0); } vec4 getTransmissionSample(const in vec2 fragCoord, const in float roughness, const in float ior) { float lod = log2(transmissionSamplerSize.x) * applyIorToRoughness(roughness, ior); return samplerTexelToLinear(textureBicubic(transmissionSamplerMap, fragCoord.xy, lod)); } vec3 volumeAttenuation(const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance) { if (isinf(attenuationDistance)) { // Attenuation distance is +∞, i.e. the transmitted color is not attenuated at all. return vec3(1.0); } else { // Compute light attenuation using Beer's law. vec3 attenuationCoefficient = -log(attenuationColor) / attenuationDistance; vec3 transmittance = exp(-attenuationCoefficient * transmissionDistance); // Beer's law return transmittance; } } vec2 DFGApprox(const in vec3 normal, const in vec3 viewDir, const in float roughness) { float dotNV = saturate(dot(normal, viewDir)); const vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022); const vec4 c1 = vec4(1, 0.0425, 1.04, - 0.04); vec4 r = roughness * c0 + c1; float a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y; vec2 fab = vec2(-1.04, 1.04) * a004 + r.zw; return fab; } vec3 EnvironmentBRDF(const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness) { vec2 fab = DFGApprox(normal, viewDir, roughness); return specularColor * fab.x + specularF90 * fab.y; } vec4 getIBLVolumeRefraction(const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor, const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix, const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness, const in vec3 attenuationColor, const in float attenuationDistance) { vec4 transmittedLight; vec3 transmittance; #ifdef USE_DISPERSION float halfSpread = (ior - 1.0) * 0.025 * dispersion; vec3 iors = vec3(ior - halfSpread, ior, ior + halfSpread); for (int i = 0; i < 3; i ++) { vec3 transmissionRay = getVolumeTransmissionRay(n, v, thickness, iors[i], modelMatrix); vec3 refractedRayExit = position + transmissionRay; // Project refracted vector on the framebuffer, while mapping to normalized device coordinates. vec4 ndcPos = projMatrix * viewMatrix * vec4(refractedRayExit, 1.0); vec2 refractionCoords = ndcPos.xy / ndcPos.w; refractionCoords += 1.0; refractionCoords /= 2.0; // Sample framebuffer to get pixel the refracted ray hits. vec4 transmissionSample = getTransmissionSample(refractionCoords, roughness, iors[i]); transmittedLight[i] = transmissionSample[i]; transmittedLight.a += transmissionSample.a; transmittance[i] = diffuseColor[i] * volumeAttenuation(length(transmissionRay), attenuationColor, attenuationDistance)[i]; } transmittedLight.a /= 3.0; #else vec3 transmissionRay = getVolumeTransmissionRay(n, v, thickness, ior, modelMatrix); vec3 refractedRayExit = position + transmissionRay; // Project refracted vector on the framebuffer, while mapping to normalized device coordinates. vec4 ndcPos = projMatrix * viewMatrix * vec4(refractedRayExit, 1.0); vec2 refractionCoords = ndcPos.xy / ndcPos.w; refractionCoords += 1.0; refractionCoords /= 2.0; // Sample framebuffer to get pixel the refracted ray hits. transmittedLight = getTransmissionSample(refractionCoords, roughness, ior); transmittance = diffuseColor * volumeAttenuation(length(transmissionRay), attenuationColor, attenuationDistance); #endif vec3 attenuatedColor = transmittance * transmittedLight.rgb; // Get the specular component. vec3 F = EnvironmentBRDF(n, v, specularColor, specularF90, roughness); // As less light is transmitted, the opacity should be increased. This simple approximation does a decent job // of modulating a CSS background, and has no effect when the buffer is opaque, due to a solid object or clear color. float transmittanceFactor = (transmittance.r + transmittance.g + transmittance.b) / 3.0; return vec4((1.0 - F) * attenuatedColor, 1.0 - (1.0 - transmittedLight.a) * transmittanceFactor); } `; const transmission_frag = ` vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular; transParams.ior = ior; float specularIntensityFactor = 1.0; vec3 specularColorFactor = vec3(1.0); transParams.specularF90 = 1.0; transParams.specularColor = mix(min(pow2((transParams.ior - 1.0) / (transParams.ior + 1.0)) * specularColorFactor, vec3(1.0)) * specularIntensityFactor, u_Color.rgb, metalnessFactor); transParams.transmission = transmission; transParams.transmissionAlpha = 1.0; transParams.thickness = thickness; transParams.attenuationDistance = attenuationDistance; transParams.attenuationColor = attenuationColor; #ifdef USE_TRANSMISSIONMAP transParams.transmission *= texture2D(transmissionMap, v_Uv).r; #endif #ifdef USE_THICKNESSMAP transParams.thickness *= texture2D(thicknessMap, v_Uv).g; #endif vec3 pos = v_modelPos; vec3 v = normalize(u_CameraPosition - pos); vec3 n = N; vec4 transmitted = getIBLVolumeRefraction( n, v,roughness, u_Color, specularColor, transParams.specularF90, pos, u_Model, u_View, u_Projection, dispersion, transParams.ior, transParams.thickness, transParams.attenuationColor, transParams.attenuationDistance); transParams.transmissionAlpha = mix(transParams.transmissionAlpha, transmitted.a, transParams.transmission); totalDiffuse = mix(totalDiffuse, transmitted.rgb, transParams.transmission); outColor.xyz = totalDiffuse + totalSpecular; outColor.a = outColor.a * transParams.transmissionAlpha; `; let fragmentShader = ShaderLib.pbr_frag; fragmentShader = fragmentShader.replace( '#include ', `#include ${transmission_pars_frag}` ); fragmentShader = fragmentShader.replace( 'outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular;', transmission_frag ); ================================================ FILE: examples/jsm/math/ColorGradient.js ================================================ import { Color3 } from 't3d'; class ColorGradient { constructor() { this._colorStops = []; this._sortDirty = false; } addColorStop(position, color) { this._colorStops.push({ position, color }); this._sortDirty = true; return this; } removeColorStop(position) { for (let i = 0; i < this._colorStops.length; i++) { if (this._colorStops[i].position === position) { this._colorStops.splice(i, 1); this._sortDirty = true; break; } } return this; } clear() { this._colorStops = []; return this; } getColor(position, target = new Color3()) { this._sort(); const colorStops = this._colorStops; target.copy(colorStops[0].color); if (position > 0) { let prevPosition = 0; for (let i = 0; i < colorStops.length; i++) { const colorStop = colorStops[i]; if (colorStop.position < position) { target.copy(colorStop.color); prevPosition = colorStop.position; } else { const t = (position - prevPosition) / (colorStop.position - prevPosition); target.lerp(colorStop.color, t); break; } } } return target; } getUint8Array(steps, target = new Uint8Array(steps * 4)) { this._sort(); const colorStops = this._colorStops; const prevColor = _tempColor1, color = _tempColor2; prevColor.copy(colorStops[0].color); let prevPosition = 0, colorStopIndex = 0; for (let i = 0; i < steps; i++) { const position = i / (steps - 1); if (position > 0) { while (colorStopIndex < colorStops.length) { const colorStop = colorStops[colorStopIndex]; if (colorStop.position < position) { prevColor.copy(colorStop.color); color.copy(prevColor); prevPosition = colorStop.position; } else { const t = (position - prevPosition) / (colorStop.position - prevPosition); color.lerpColors(prevColor, colorStop.color, t); break; } colorStopIndex++; } } else { color.copy(prevColor); } const offset = i * 4; target[offset] = color.r * 255; target[offset + 1] = color.g * 255; target[offset + 2] = color.b * 255; target[offset + 3] = 255; } return target; } _sort() { if (this._sortDirty) { this._colorStops.sort((a, b) => a.position - b.position); this._sortDirty = false; } } } const _tempColor1 = new Color3(); const _tempColor2 = new Color3(); export { ColorGradient }; ================================================ FILE: examples/jsm/math/DistanceTransform.js ================================================ /** * DistanceTransform is a class for creating distance fields from image data. * ref: https://github.com/mapbox/tiny-sdf */ class DistanceTransform { /** * Create a new DistanceTransform instance. * @param {number} [maxPixelCount=64*64] - The maximum pixel count to handle. * @param {number} [maxGridSize=64] - The maximum grid size to handle. */ constructor(maxPixelCount = 64 * 64, maxGridSize = 64) { this._gridOuter = new Float64Array(maxPixelCount); this._gridInner = new Float64Array(maxPixelCount); this._f = new Float64Array(maxGridSize); this._z = new Float64Array(maxGridSize + 1); this._v = new Uint16Array(maxGridSize); this._uint8Clamper = new Uint8ClampedArray(1); this._maxPixelCount = maxPixelCount; this._maxGridSize = maxGridSize; } /** * Transform an image data to a distance field, which is stored in a Uint8Array. * @param {object} imageData - The image data to transform. * @param {Uint8Array|Uint8ClampedArray} imageData.data - The pixel data. * @param {number} imageData.width - The width of the image. * @param {number} imageData.height - The height of the image. * @param {object} [options] - The options. * @param {number} [options.radius=8] - The radius of the distance field. * @param {number} [options.cutoff=0.25] - The cutoff value. * @param {number} [options.inputChannel=3] - The input channel to use. * @param {number} [options.targetArray] - The target array to store the result. * @returns {Uint8Array} */ transform(imageData, options = {}) { const { data, width, height } = imageData; const pixelCount = width * height; if (pixelCount > this._maxPixelCount || Math.max(width, height) > this._maxGridSize) { console.warn('DistanceTransform: Max pixel count or max grid size exceeded.'); return null; } const pixelSize = data.length / pixelCount; const { radius = 8, cutoff = 0.25, inputChannel = 3, targetArray = new Uint8Array(pixelCount) } = options; const gridOuter = this._gridOuter; const gridInner = this._gridInner; const f = this._f; const z = this._z; const v = this._v; const uint8Clamper = this._uint8Clamper; gridOuter.fill(INF, 0, pixelCount); gridInner.fill(0, 0, pixelCount); for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { const a = data[(y * width + x) * pixelSize + inputChannel] / 255; // alpha value if (a === 0) continue; // empty pixels const i = y * width + x; if (a === 1) { // fully drawn pixels gridOuter[i] = 0; gridInner[i] = INF; } else { // aliased pixels const d = 0.5 - a; gridOuter[i] = d > 0 ? d * d : 0; gridInner[i] = d < 0 ? d * d : 0; } } } edt(gridOuter, 0, 0, width, height, width, f, v, z); edt(gridInner, 0, 0, width, height, width, f, v, z); for (let i = 0; i < pixelCount; i++) { const d = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]); uint8Clamper[0] = Math.round(255 - 255 * (d / radius + cutoff)); targetArray[i] = uint8Clamper[0]; } return targetArray; } } const INF = 1e20; // 2D Euclidean squared distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf function edt(data, x0, y0, width, height, gridSize, f, v, z) { for (let x = x0; x < x0 + width; x++) edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z); for (let y = y0; y < y0 + height; y++) edt1d(data, y * gridSize + x0, 1, width, f, v, z); } // 1D squared distance transform function edt1d(grid, offset, stride, length, f, v, z) { v[0] = 0; z[0] = -INF; z[1] = INF; f[0] = grid[offset]; for (let q = 1, k = 0, s = 0; q < length; q++) { f[q] = grid[offset + q * stride]; const q2 = q * q; do { const r = v[k]; s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2; } while (s <= z[k] && --k > -1); k++; v[k] = q; z[k] = s; z[k + 1] = INF; } for (let q = 0, k = 0; q < length; q++) { while (z[k + 1] < q) k++; const r = v[k]; const qr = q - r; grid[offset + q * stride] = f[r] + qr * qr; } } export { DistanceTransform }; ================================================ FILE: examples/jsm/math/OBB.js ================================================ import { MathUtils, Ray, Box3, Matrix3, Matrix4, Vector3, Frustum } from 't3d'; /** * An oriented bounding box (OBB) is a box that is aligned with the object's * local coordinate system. The OBB is defined by its center, halfSize and * rotation. The rotation matrix is a 3x3 matrix that defines the orientation * of the OBB. The halfSize vector defines the dimensions of the box along * each of its local axes. * @memberof t3d */ class OBB { /** * Create an oriented bounding box. * @param {Vector3} [center] - The center of the OBB. * @param {Vector3} [halfSize] - The half size of the OBB. * @param {Matrix3} [rotation] - The rotation of the OBB. */ constructor(center = new Vector3(), halfSize = new Vector3(), rotation = new Matrix3()) { this.center = center; this.halfSize = halfSize; this.rotation = rotation; } /** * Set the center, half size and rotation of the OBB. * @param {Vector3} center - The center of the OBB. * @param {Vector3} halfSize - The half size of the OBB. * @param {Matrix3} rotation - The rotation of the OBB. * @returns {OBB} */ set(center, halfSize, rotation) { this.center = center; this.halfSize = halfSize; this.rotation = rotation; return this; } /** * Copy the values from the given OBB. * @param {OBB} obb - The OBB to copy. * @returns {OBB} */ copy(obb) { this.center.copy(obb.center); this.halfSize.copy(obb.halfSize); this.rotation.copy(obb.rotation); return this; } /** * Clone this OBB. * @returns {OBB} */ clone() { return new this.constructor().copy(this); } /** * Get the size of the OBB. * @param {Vector3} result - The result vector. * @returns {Vector3} The size of the OBB. */ getSize(result) { return result.copy(this.halfSize).multiplyScalar(2); } /** * Check if the OBB is empty. * @returns {boolean} Whether the OBB is empty. */ isEmpty() { return this.halfSize.x <= 0 || this.halfSize.y <= 0 || this.halfSize.z <= 0; } /** * Make the OBB empty. * @returns {OBB} */ makeEmpty() { this.center.set(0, 0, 0); this.halfSize.set(0, 0, 0); this.rotation.identity(); return this; } /** * Get the closest point on the OBB to the given point. * Reference: Closest Point on OBB to Point in Real-Time Collision Detection * by Christer Ericson (chapter 5.1.4) * @param {Vector3} point - The point. * @param {Vector3} result - The result vector. * @returns {Vector3} The closest point on the OBB. */ clampPoint(point, result) { const halfSize = this.halfSize; v1.subVectors(point, this.center); this.rotation.extractBasis(xAxis, yAxis, zAxis); // start at the center position of the OBB result.copy(this.center); // project the target onto the OBB axes and walk towards that point const x = MathUtils.clamp(v1.dot(xAxis), -halfSize.x, halfSize.x); result.add(xAxis.multiplyScalar(x)); const y = MathUtils.clamp(v1.dot(yAxis), -halfSize.y, halfSize.y); result.add(yAxis.multiplyScalar(y)); const z = MathUtils.clamp(v1.dot(zAxis), -halfSize.z, halfSize.z); result.add(zAxis.multiplyScalar(z)); return result; } /** * Check if the OBB contains the given point. * @param {Vector3} point - The point. * @returns {boolean} Whether the OBB contains the point. */ containsPoint(point) { v1.subVectors(point, this.center); this.rotation.extractBasis(xAxis, yAxis, zAxis); // project v1 onto each axis and check if these points lie inside the OBB return Math.abs(v1.dot(xAxis)) <= this.halfSize.x && Math.abs(v1.dot(yAxis)) <= this.halfSize.y && Math.abs(v1.dot(zAxis)) <= this.halfSize.z; } /** * Check if the OBB intersects the given Box3. * @param {Box3} box3 - The Box3. * @returns {boolean} Whether the OBB intersects the Box3. */ intersectsBox3(box3) { return this.intersectsOBB(obb.fromBox3(box3)); } /** * Check if the OBB intersects the given sphere. * @param {Sphere} sphere - The sphere. * @returns {boolean} Whether the OBB intersects the sphere. */ intersectsSphere(sphere) { // find the point on the OBB closest to the sphere center this.clampPoint(sphere.center, closestPoint); // if that point is inside the sphere, the OBB and sphere intersect return closestPoint.distanceToSquared(sphere.center) <= (sphere.radius * sphere.radius); } /** * Check if the OBB intersects the given OBB. * Reference: OBB-OBB Intersection in Real-Time Collision Detection * by Christer Ericson (chapter 4.4.1) * @param {OBB} obb - The OBB. * @param {number} [epsilon=Number.EPSILON] - A small number to counteract arithmetic errors. * @returns {boolean} Whether the OBB intersects the OBB. */ intersectsOBB(obb, epsilon = Number.EPSILON) { // prepare data structures (the code uses the same nomenclature like the reference) a.c = this.center; a.e[0] = this.halfSize.x; a.e[1] = this.halfSize.y; a.e[2] = this.halfSize.z; this.rotation.extractBasis(a.u[0], a.u[1], a.u[2]); b.c = obb.center; b.e[0] = obb.halfSize.x; b.e[1] = obb.halfSize.y; b.e[2] = obb.halfSize.z; obb.rotation.extractBasis(b.u[0], b.u[1], b.u[2]); // compute rotation matrix expressing b in a's coordinate frame for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { R[i][j] = a.u[i].dot(b.u[j]); } } // compute translation vector v1.subVectors(b.c, a.c); // bring translation into a's coordinate frame t[0] = v1.dot(a.u[0]); t[1] = v1.dot(a.u[1]); t[2] = v1.dot(a.u[2]); // compute common subexpressions. Add in an epsilon term to // counteract arithmetic errors when two edges are parallel and // their cross product is (near) null for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { AbsR[i][j] = Math.abs(R[i][j]) + epsilon; } } let ra, rb; // test axes L = A0, L = A1, L = A2 for (let i = 0; i < 3; i++) { ra = a.e[i]; rb = b.e[0] * AbsR[i][0] + b.e[1] * AbsR[i][1] + b.e[2] * AbsR[i][2]; if (Math.abs(t[i]) > ra + rb) return false; } // test axes L = B0, L = B1, L = B2 for (let i = 0; i < 3; i++) { ra = a.e[0] * AbsR[0][i] + a.e[1] * AbsR[1][i] + a.e[2] * AbsR[2][i]; rb = b.e[i]; if (Math.abs(t[0] * R[0][i] + t[1] * R[1][i] + t[2] * R[2][i]) > ra + rb) return false; } // test axis L = A0 x B0 ra = a.e[1] * AbsR[2][0] + a.e[2] * AbsR[1][0]; rb = b.e[1] * AbsR[0][2] + b.e[2] * AbsR[0][1]; if (Math.abs(t[2] * R[1][0] - t[1] * R[2][0]) > ra + rb) return false; // test axis L = A0 x B1 ra = a.e[1] * AbsR[2][1] + a.e[2] * AbsR[1][1]; rb = b.e[0] * AbsR[0][2] + b.e[2] * AbsR[0][0]; if (Math.abs(t[2] * R[1][1] - t[1] * R[2][1]) > ra + rb) return false; // test axis L = A0 x B2 ra = a.e[1] * AbsR[2][2] + a.e[2] * AbsR[1][2]; rb = b.e[0] * AbsR[0][1] + b.e[1] * AbsR[0][0]; if (Math.abs(t[2] * R[1][2] - t[1] * R[2][2]) > ra + rb) return false; // test axis L = A1 x B0 ra = a.e[0] * AbsR[2][0] + a.e[2] * AbsR[0][0]; rb = b.e[1] * AbsR[1][2] + b.e[2] * AbsR[1][1]; if (Math.abs(t[0] * R[2][0] - t[2] * R[0][0]) > ra + rb) return false; // test axis L = A1 x B1 ra = a.e[0] * AbsR[2][1] + a.e[2] * AbsR[0][1]; rb = b.e[0] * AbsR[1][2] + b.e[2] * AbsR[1][0]; if (Math.abs(t[0] * R[2][1] - t[2] * R[0][1]) > ra + rb) return false; // test axis L = A1 x B2 ra = a.e[0] * AbsR[2][2] + a.e[2] * AbsR[0][2]; rb = b.e[0] * AbsR[1][1] + b.e[1] * AbsR[1][0]; if (Math.abs(t[0] * R[2][2] - t[2] * R[0][2]) > ra + rb) return false; // test axis L = A2 x B0 ra = a.e[0] * AbsR[1][0] + a.e[1] * AbsR[0][0]; rb = b.e[1] * AbsR[2][2] + b.e[2] * AbsR[2][1]; if (Math.abs(t[1] * R[0][0] - t[0] * R[1][0]) > ra + rb) return false; // test axis L = A2 x B1 ra = a.e[0] * AbsR[1][1] + a.e[1] * AbsR[0][1]; rb = b.e[0] * AbsR[2][2] + b.e[2] * AbsR[2][0]; if (Math.abs(t[1] * R[0][1] - t[0] * R[1][1]) > ra + rb) return false; // test axis L = A2 x B2 ra = a.e[0] * AbsR[1][2] + a.e[1] * AbsR[0][2]; rb = b.e[0] * AbsR[2][1] + b.e[1] * AbsR[2][0]; if (Math.abs(t[1] * R[0][2] - t[0] * R[1][2]) > ra + rb) return false; // since no separating axis is found, the OBBs must be intersecting return true; } /** * Check if the OBB intersects the given plane. * Reference: Testing Box Against Plane in Real-Time Collision Detection * by Christer Ericson (chapter 5.2.3) * @param {Plane} plane - The plane. * @returns {boolean} Whether the OBB intersects the plane. */ intersectsPlane(plane) { this.rotation.extractBasis(xAxis, yAxis, zAxis); // compute the projection interval radius of this OBB onto L(t) = this->center + t * p.normal; const r = this.halfSize.x * Math.abs(plane.normal.dot(xAxis)) + this.halfSize.y * Math.abs(plane.normal.dot(yAxis)) + this.halfSize.z * Math.abs(plane.normal.dot(zAxis)); // compute distance of the OBB's center from the plane const d = plane.normal.dot(this.center) - plane.constant; // Intersection occurs when distance d falls within [-r,+r] interval return Math.abs(d) <= r; } /** * Performs a ray/OBB intersection test and stores the intersection point * to the given 3D vector. If no intersection is detected, *null* is returned. * @param {Ray} ray - The ray. * @param {Vector3} result - The result vector. * @returns {Vector3 | null} The intersection point or *null*. */ intersectRay(ray, result) { // the idea is to perform the intersection test in the local space // of the OBB. this.toBoundingBoxAndTransform(aabb, matrix); // transform ray to the local space of the OBB localRay.copy(ray).applyMatrix4(inverse.copy(matrix).invert()); // perform ray <-> AABB intersection test if (localRay.intersectBox(aabb, result)) { // transform the intersection point back to world space return result.applyMatrix4(matrix); } else { return null; } } /** * Performs a ray/OBB intersection test. Returns either true or false if * there is a intersection or not. * @param {Ray} ray - The ray. * @returns {boolean} Whether the ray intersects the OBB. */ intersectsRay(ray) { return this.intersectRay(ray, v1) !== null; } /** * Set the OBB from a Box3, the OBB will be axis-aligned. * @param {Box3} box3 - The Box3. * @returns {OBB} */ fromBox3(box3) { box3.getCenter(this.center); box3.getSize(this.halfSize).multiplyScalar(0.5); this.rotation.identity(); return this; } /** * Check if this OBB equals the given OBB. * @param {OBB} obb - The OBB to check against. * @returns {boolean} Whether this OBB equals */ equals(obb) { return obb.center.equals(this.center) && obb.halfSize.equals(this.halfSize) && obb.rotation.equals(this.rotation); } /** * Apply a 4x4 transformation matrix to the OBB. * @param {Matrix4} matrix - The transformation matrix. * @returns {OBB} */ applyMatrix4(matrix) { const e = matrix.elements; let sx = v1.set(e[0], e[1], e[2]).getLength(); const sy = v1.set(e[4], e[5], e[6]).getLength(); const sz = v1.set(e[8], e[9], e[10]).getLength(); const det = matrix.determinant(); if (det < 0) sx = -sx; rotationMatrix.setFromMatrix4(matrix); const invSX = 1 / sx; const invSY = 1 / sy; const invSZ = 1 / sz; rotationMatrix.elements[0] *= invSX; rotationMatrix.elements[1] *= invSX; rotationMatrix.elements[2] *= invSX; rotationMatrix.elements[3] *= invSY; rotationMatrix.elements[4] *= invSY; rotationMatrix.elements[5] *= invSY; rotationMatrix.elements[6] *= invSZ; rotationMatrix.elements[7] *= invSZ; rotationMatrix.elements[8] *= invSZ; this.rotation.multiply(rotationMatrix); this.halfSize.x *= sx; this.halfSize.y *= sy; this.halfSize.z *= sz; // https://github.com/mrdoob/three.js/issues/21753 this.center.applyMatrix4(matrix); return this; } /** * Set the OBB from center point and axis vectors. * @param {Vector3} center - The center of the OBB. * @param {Vector3} axisX - The x-axis of the OBB. * @param {Vector3} axisY - The y-axis of the OBB. * @param {Vector3} axisZ - The z-axis of the OBB. * @returns {OBB} */ setFromCenterAndAxes(center, axisX, axisY, axisZ) { xAxis.copy(axisX); yAxis.copy(axisY); zAxis.copy(axisZ); const scaleX = xAxis.getLength(); const scaleY = yAxis.getLength(); const scaleZ = zAxis.getLength(); xAxis.normalize(); yAxis.normalize(); zAxis.normalize(); // handle the case where the box has a dimension of 0 in one axis if (scaleX === 0) { xAxis.crossVectors(yAxis, zAxis); } if (scaleY === 0) { yAxis.crossVectors(xAxis, zAxis); } if (scaleZ === 0) { zAxis.crossVectors(xAxis, yAxis); } this.rotation.set( xAxis.x, yAxis.x, zAxis.x, xAxis.y, yAxis.y, zAxis.y, xAxis.z, yAxis.z, zAxis.z ); this.center.copy(center); this.halfSize.set(scaleX, scaleY, scaleZ); return this; } /** * Get the axis-aligned bounding box (AABB) and transformation matrix of the OBB, * the bounding box center is always at (0, 0, 0) because center offset is stored in the Matrix4. * @param {Box3} box3 - The Box3. * @param {Matrix4} matrix - The Matrix4. * @returns {OBB} */ toBoundingBoxAndTransform(box3, matrix) { box3.min.copy(this.halfSize).negate(); box3.max.copy(this.halfSize); matrix.setFromMatrix3(this.rotation); this.center.toArray(matrix.elements, 12); return this; } /** * Get the 8 corner points of the OBB, the order is same as Box3.getPoints(). * @param {Vector3[]} points - The array to store the points. * @returns {Vector3[]} The array of points. */ getPoints(points) { this.toBoundingBoxAndTransform(aabb, matrix); aabb.getPoints(points); for (let i = 0; i < 8; i++) { points[i].applyMatrix4(matrix); } return points; } /** * Get the 6 planes of the OBB. * @param {Plane[]} planes - The array to store the planes. * @returns {Plane[]} The array of planes. */ getPlanes(planes) { this.toBoundingBoxAndTransform(aabb, matrix); const worldMin = aabb.min.applyMatrix4(matrix); const worldMax = aabb.max.applyMatrix4(matrix); v1.set(0, 0, 1).applyMatrix3(this.rotation).normalize(); planes[0].setFromNormalAndCoplanarPoint(v1, worldMin); planes[1].setFromNormalAndCoplanarPoint(v1, worldMax); planes[1].normal.negate(); planes[1].constant *= -1; v1.set(0, 1, 0).applyMatrix3(this.rotation).normalize(); planes[2].setFromNormalAndCoplanarPoint(v1, worldMin); planes[3].setFromNormalAndCoplanarPoint(v1, worldMax); planes[3].normal.negate(); planes[3].constant *= -1; v1.set(1, 0, 0).applyMatrix3(this.rotation).normalize(); planes[4].setFromNormalAndCoplanarPoint(v1, worldMin); planes[5].setFromNormalAndCoplanarPoint(v1, worldMax); planes[5].normal.negate(); planes[5].constant *= -1; return planes; } /** * Check if the OBB intersects the given frustum. * @param {Frustum} frustum - The frustum. * @returns {boolean} Whether the OBB intersects the frustum. */ intersectsFrustum(frustum) { // the idea is to perform the intersection test in the local space // of the OBB. this.toBoundingBoxAndTransform(aabb, matrix); localFrustum.copy(frustum).applyMatrix4(inverse.copy(matrix).invert()); return localFrustum.intersectsBox(aabb); } } OBB.prototype.isOBB = true; // helper variables const a = { c: null, // center u: [new Vector3(), new Vector3(), new Vector3()], // basis vectors e: [] // half width }; const b = { c: null, // center u: [new Vector3(), new Vector3(), new Vector3()], // basis vectors e: [] // half width }; const R = [[], [], []]; const AbsR = [[], [], []]; const t = []; const xAxis = new Vector3(); const yAxis = new Vector3(); const zAxis = new Vector3(); const v1 = new Vector3(); const closestPoint = new Vector3(); const rotationMatrix = new Matrix3(); const aabb = new Box3(); const matrix = new Matrix4(); const inverse = new Matrix4(); const localRay = new Ray(); const localFrustum = new Frustum(); const obb = new OBB(); export { OBB }; ================================================ FILE: examples/jsm/math/Octree.js ================================================ import { Vector3, Box3 } from 't3d'; class Octree { constructor(box = new Box3(), depth = 0) { this.box = box; this.depth = depth; this.subTrees = []; this.elements = []; this.elementTest = function(box, element) { return box.containsPoint(element); }; } isEmpty() { return this.elements.length === 0 && this.subTrees.length === 0; } divideElements(maxDepth = 5, capacity = 8) { const { depth, subTrees, elements, elementTest } = this; if (depth >= maxDepth || elements.length <= capacity) return; this.subdivide(); // distribute elements to subTrees let element = this.elements.pop(); while (element) { for (let i = 0; i < subTrees.length; i++) { if (elementTest(subTrees[i].box, element)) { subTrees[i].elements.push(element); } } element = this.elements.pop(); } // recursive call subTrees.forEach(subTree => subTree.divideElements(maxDepth, capacity)); } addElement(element, maxDepth = 5, capacity = 8) { const { box, depth, subTrees, elements, elementTest } = this; if (!elementTest(box, element)) { return false; } if (subTrees.length === 0) { elements.push(element); if (elements.length > capacity && depth < maxDepth) { this.divideElements(maxDepth, capacity); } return true; } for (let i = 0; i < subTrees.length; i++) { if (subTrees[i].addElement(element, maxDepth, capacity)) { return true; } } } removeElement(element) { const elements = this.elements; const index = elements.indexOf(element); if (index !== -1) { elements.splice(index, 1); return true; } const subTrees = this.subTrees; for (let i = 0; i < subTrees.length; i++) { if (subTrees[i].removeElement(element)) { return true; } } return false; } subdivide() { const halfSize = _vec3_1.copy(this.box.max).sub(this.box.min).multiplyScalar(0.5); _subdivideArray.forEach((v, i) => { const box = new Box3(); box.min.copy(this.box.min).add(_vec3_2.copy(v).multiply(halfSize)); box.max.copy(box.min).add(halfSize); this.subTrees[i] = new this.constructor(box, this.depth + 1); }); } count() { let count = 1; for (let i = 0; i < this.subTrees.length; i++) { count += this.subTrees[i].count(); } return count; } dispose() { this.subTrees.forEach(subTree => subTree.dispose()); this.subTrees.length = 0; this.elements.length = 0; } } const _subdivideArray = [ new Vector3(0, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0), new Vector3(0, 1, 1), new Vector3(1, 0, 0), new Vector3(1, 0, 1), new Vector3(1, 1, 0), new Vector3(1, 1, 1) ]; const _vec3_1 = new Vector3(); const _vec3_2 = new Vector3(); export { Octree }; ================================================ FILE: examples/jsm/math/TriangleSoup.js ================================================ import { Vector3, DRAW_MODE, MathUtils } from 't3d'; /** * TriangleSoup - A data structure for storing and manipulating triangle geometry * Useful for physics engines, navigation mesh generation, and other applications * that require raw triangle data with efficient operations. */ class TriangleSoup { /** * Create a new TriangleSoup instance */ constructor() { /** * Array of vertex positions [x1,y1,z1, x2,y2,z2, ...] * @type {Array} */ this.positions = []; /** * Array of vertex indices, each triplet forms a triangle * @type {Array} */ this.indices = []; } /** * Add a mesh to the TriangleSoup * @param {Mesh} mesh - The mesh to add * @param {Matrix4} [matrix=mesh.worldMatrix] - The transformation matrix to apply to the vertices * @returns {TriangleSoup} - The TriangleSoup instance */ addMesh(mesh, matrix = mesh.worldMatrix) { const { positions, indices } = this; const material = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material; const isTriangleMesh = material && material.drawMode === DRAW_MODE.TRIANGLES; if (!isTriangleMesh) return; const geometry = mesh.geometry; const positionAttribute = geometry.attributes.a_Position; if (!positionAttribute) return; const positionArray = positionAttribute.buffer.array; const positionStart = positions.length; for (let i = 0, l = positionArray.length; i < l; i += 3) { _vec3_1.fromArray(positionArray, i, positionAttribute.normalized); _vec3_1.applyMatrix4(matrix); _vec3_1.toArray(positions, positionStart + i); } const indexAttribute = geometry.index; if (indexAttribute) { const indexArray = indexAttribute.buffer.array; for (let i = 0, l = indexArray.length; i < l; i++) { const copyIndex = indexAttribute.normalized ? MathUtils.denormalize(indexArray[i], indexArray) : indexArray[i]; indices.push(positionStart / 3 + copyIndex); } } else { for (let i = 0, l = positionArray.length / 3; i < l; i++) { indices.push(positionStart / 3 + i); } } return this; } /** * Merge vertices in the TriangleSoup * @param {number} [tolerance=1e-4] - The tolerance for merging vertices * @returns {TriangleSoup} - The TriangleSoup instance */ mergeVertices(tolerance = 1e-4) { tolerance = Math.max(tolerance, Number.EPSILON); const { positions, indices } = this; const hashToIndex = {}; const newPositions = []; const newIndices = []; const halfTolerance = tolerance * 0.5; const exponent = Math.log10(1 / tolerance); const hashMultiplier = Math.pow(10, exponent); const hashAdditive = halfTolerance * hashMultiplier; for (let i = 0; i < indices.length; i++) { const index = indices[i]; _vec3_1.fromArray(positions, index * 3); let hash = ''; hash += `${~~(_vec3_1.x * hashMultiplier + hashAdditive)},`; hash += `${~~(_vec3_1.y * hashMultiplier + hashAdditive)},`; hash += `${~~(_vec3_1.z * hashMultiplier + hashAdditive)},`; if (hash in hashToIndex) { newIndices.push(hashToIndex[hash]); } else { const newIndex = newPositions.length / 3; newPositions.push(_vec3_1.x, _vec3_1.y, _vec3_1.z); hashToIndex[hash] = newIndex; newIndices.push(newIndex); } } this.positions = newPositions; this.indices = newIndices; return this; } /** * Clear the TriangleSoup */ clear() { this.positions.length = 0; this.indices.length = 0; } } const _vec3_1 = new Vector3(); export { TriangleSoup }; ================================================ FILE: examples/jsm/math/TrianglesOctree.js ================================================ import { Vector3, Box3, Triangle } from 't3d'; import { Octree } from './Octree.js'; class TrianglesOctree extends Octree { static fromNode(node, maxDepth = 5, capacity = 8) { const triangles = [], box = new Box3(); function addTriangle(triangle) { box.min.x = Math.min(box.min.x, triangle.a.x, triangle.b.x, triangle.c.x); box.min.y = Math.min(box.min.y, triangle.a.y, triangle.b.y, triangle.c.y); box.min.z = Math.min(box.min.z, triangle.a.z, triangle.b.z, triangle.c.z); box.max.x = Math.max(box.max.x, triangle.a.x, triangle.b.x, triangle.c.x); box.max.y = Math.max(box.max.y, triangle.a.y, triangle.b.y, triangle.c.y); box.max.z = Math.max(box.max.z, triangle.a.z, triangle.b.z, triangle.c.z); triangles.push(triangle); } node.traverse(child => { if (child.isMesh) { const geometry = child.geometry; const isIndexed = !!geometry.index; const positionBuffer = geometry.getAttribute('a_Position').buffer; const positionArray = positionBuffer.array; if (isIndexed) { const indexArray = geometry.index.buffer.array; for (let i = 0; i < indexArray.length; i += 3) { const a = indexArray[i]; const b = indexArray[i + 1]; const c = indexArray[i + 2]; const v1 = new Vector3().fromArray(positionArray, a * 3); const v2 = new Vector3().fromArray(positionArray, b * 3); const v3 = new Vector3().fromArray(positionArray, c * 3); v1.applyMatrix4(child.worldMatrix); v2.applyMatrix4(child.worldMatrix); v3.applyMatrix4(child.worldMatrix); const triangle = new Triangle(v1, v2, v3); triangle.belong = child; addTriangle(triangle); } } else { for (let i = 0; i < positionBuffer.count; i += 3) { const v1 = new Vector3().fromArray(positionArray, i * 3); const v2 = new Vector3().fromArray(positionArray, (i + 1) * 3); const v3 = new Vector3().fromArray(positionArray, (i + 2) * 3); v1.applyMatrix4(child.worldMatrix); v2.applyMatrix4(child.worldMatrix); v3.applyMatrix4(child.worldMatrix); const triangle = new Triangle(v1, v2, v3); triangle.belong = child; addTriangle(triangle); } } } }); // offset small amount to account for regular grid box.min.x -= 0.01; box.min.y -= 0.01; box.min.z -= 0.01; const octree = new TrianglesOctree(box); octree.elements = triangles; octree.divideElements(maxDepth, capacity); return octree; } constructor(box, depth) { super(box, depth); this.elementTest = function(box, triangle) { return box.intersectsTriangle(triangle); }; } getRayTriangles(ray, triangles) { const subTrees = this.subTrees; for (let i = 0; i < subTrees.length; i++) { const subTree = subTrees[i]; if (!ray.intersectsBox(subTree.box)) continue; if (subTree.elements.length > 0) { for (let j = 0; j < subTree.elements.length; j++) { if (triangles.indexOf(subTree.elements[j]) === -1) triangles.push(subTree.elements[j]); } } else { subTree.getRayTriangles(ray, triangles); } } return triangles; } rayIntersect(ray) { if (ray.direction.getLength() === 0) return; const triangles = []; let triangle, position, distance = 1e100; this.getRayTriangles(ray, triangles); for (let i = 0; i < triangles.length; i++) { const result = ray.intersectTriangle(triangles[i].a, triangles[i].b, triangles[i].c, true, _vec3_1); if (result) { const tempDistnce = result.sub(ray.origin).getLength(); if (distance > tempDistnce) { position = result.clone().add(ray.origin); distance = tempDistnce; triangle = triangles[i]; } } } return distance < 1e100 ? { distance: distance, triangle: triangle, position: position, target: triangle.belong } : null; } } const _vec3_1 = new Vector3(); export { TrianglesOctree }; ================================================ FILE: examples/jsm/math/VirtualGroup.js ================================================ import { Matrix4, Box3, Vector3 } from 't3d'; /** * This is a virtual group for objects. * With this, you can manipulate all objects as if they were a single object. */ class VirtualGroup { constructor() { this._objects = []; this._anchorType = 'center'; // 'center' or 'pivot' this._coordinateType = 'local'; // 'local' or 'global' this._dirtyFlag = DirtyFlag.All; this._worldMatrix = new Matrix4(); } set anchorType(value) { if (this._anchorType === value) return; this._anchorType = value; this._dirtyFlag |= DirtyFlag.AnchorDirty; } get anchorType() { return this._anchorType; } set coordinateType(value) { if (this._coordinateType === value) return; this._coordinateType = value; this._dirtyFlag |= DirtyFlag.CoordinateDirty; } get coordinateType() { return this._coordinateType; } get objects() { return this._objects; } addObject(object, checkRelationship = false) { let canAdd = true; for (let i = this._objects.length - 1; i >= 0; i--) { const existingObject = this._objects[i]; if (existingObject === object) { canAdd = false; break; } if (checkRelationship) { if (isChildOf(existingObject, object)) { canAdd = false; break; } else if (isChildOf(object, existingObject)) { this.deleteObject(existingObject); } } } if (canAdd) { this._objects.push(object); this._dirtyFlag |= DirtyFlag.All; } return canAdd; } deleteObject(object) { const index = this._objects.indexOf(object); if (index === -1) return false; this._objects.splice(index, 1); this._dirtyFlag |= DirtyFlag.All; return true; } reset() { this._objects = []; this._dirtyFlag |= DirtyFlag.All; } dirty(anchor = true, coordinate = true) { if (anchor) this._dirtyFlag |= DirtyFlag.AnchorDirty; if (coordinate) this._dirtyFlag |= DirtyFlag.CoordinateDirty; } getWorldMatrix(matrix) { const e = this._worldMatrix.elements; if (this._objects.length === 0) { this._worldMatrix.identity(); return matrix.copy(this._worldMatrix); } if (this._dirtyFlag & DirtyFlag.AnchorDirty) { this._anchorDirty = false; if (this._anchorType === 'center') { this._getCenter(_vec3_1); } else if (this._anchorType === 'pivot') { this._getPivot(_vec3_1); } e[12] = _vec3_1.x; e[13] = _vec3_1.y; e[14] = _vec3_1.z; this._dirtyFlag &= ~DirtyFlag.AnchorDirty; } if (this._dirtyFlag & DirtyFlag.CoordinateDirty) { if (this._coordinateType === 'local') { // align to first entity const wE = this._objects[0].worldMatrix.elements; const sx = 1 / Math.sqrt(wE[0] * wE[0] + wE[1] * wE[1] + wE[2] * wE[2]); const sy = 1 / Math.sqrt(wE[4] * wE[4] + wE[5] * wE[5] + wE[6] * wE[6]); const sz = 1 / Math.sqrt(wE[8] * wE[8] + wE[9] * wE[9] + wE[10] * wE[10]); e[0] = wE[0] * sx; e[4] = wE[4] * sy; e[8] = wE[8] * sz; e[1] = wE[1] * sx; e[5] = wE[5] * sy; e[9] = wE[9] * sz; e[2] = wE[2] * sx; e[6] = wE[6] * sy; e[10] = wE[10] * sz; } else if (this._coordinateType === 'global') { e[0] = 1; e[4] = 0; e[8] = 0; e[1] = 0; e[5] = 1; e[9] = 0; e[2] = 0; e[6] = 0; e[10] = 1; } this._dirtyFlag &= ~DirtyFlag.CoordinateDirty; } return matrix.copy(this._worldMatrix); } setWorldMatrix(matrix) { const worldMatrixInverse = this.getWorldMatrix(_mat4_1).invert(); this._worldMatrix.copy(matrix); const offsetMatrix = _mat4_2.multiplyMatrices(matrix, worldMatrixInverse); this._objects.forEach(object => { object.worldMatrix.multiplyMatrices(offsetMatrix, object.worldMatrix); const parentMatrixInverse = _mat4_1.copy(object.parent.worldMatrix).invert(); object.matrix.multiplyMatrices(parentMatrixInverse, object.worldMatrix); object.matrix.decompose(object.position, object.quaternion, object.scale); }); this._dirtyFlag = DirtyFlag.None; } _getCenter(center) { _box3_1.makeEmpty(); this._objects.forEach(object => { object.traverse(child => { if (child.isMesh) { _box3_2.copy(child.geometry.boundingBox); _box3_2.applyMatrix4(child.worldMatrix); _box3_1.expandByBox3(_box3_2); } else { _vec3_1.setFromMatrixPosition(child.worldMatrix); _box3_1.expandByPoint(_vec3_1); } }); }); return _box3_1.getCenter(center); } _getPivot(pivot) { _box3_1.makeEmpty(); this._objects.forEach(object => { _vec3_1.setFromMatrixPosition(object.worldMatrix); _box3_1.expandByPoint(_vec3_1); }); return _box3_1.getCenter(pivot); } } const DirtyFlag = { None: 0, AnchorDirty: 1, CoordinateDirty: 2, All: 3 }; const _vec3_1 = new Vector3(); const _box3_1 = new Box3(); const _box3_2 = new Box3(); const _mat4_1 = new Matrix4(); const _mat4_2 = new Matrix4(); function isChildOf(parent, child) { while (child.parent) { if (parent === child.parent) return true; child = child.parent; } return false; } export { VirtualGroup }; ================================================ FILE: examples/jsm/math/curves/CubicBezierCurve2.js ================================================ /** * CubicBezierCurve2 */ import { Vector2 } from 't3d'; import { Curve } from './Curve.js'; import { CurveUtils } from './CurveUtils.js'; class CubicBezierCurve2 extends Curve { constructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2()) { super(); this.v0 = v0; this.v1 = v1; this.v2 = v2; this.v3 = v3; } getPoint(t, optionalTarget = new Vector2()) { const point = optionalTarget; const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; point.set( CurveUtils.cubicBezier(t, v0.x, v1.x, v2.x, v3.x), CurveUtils.cubicBezier(t, v0.y, v1.y, v2.y, v3.y) ); return point; } } CubicBezierCurve2.prototype.isCubicBezierCurve2 = true; export { CubicBezierCurve2 }; ================================================ FILE: examples/jsm/math/curves/CubicBezierCurve3.js ================================================ /** * CubicBezierCurve3 */ import { Vector3 } from 't3d'; import { Curve } from './Curve.js'; import { CurveUtils } from './CurveUtils.js'; class CubicBezierCurve3 extends Curve { constructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3()) { super(); this.v0 = v0; this.v1 = v1; this.v2 = v2; this.v3 = v3; } getPoint(t, optionalTarget = new Vector3()) { const point = optionalTarget; const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; point.set( CurveUtils.cubicBezier(t, v0.x, v1.x, v2.x, v3.x), CurveUtils.cubicBezier(t, v0.y, v1.y, v2.y, v3.y), CurveUtils.cubicBezier(t, v0.z, v1.z, v2.z, v3.z) ); return point; } } CubicBezierCurve3.prototype.isCubicBezierCurve3 = true; export { CubicBezierCurve3 }; ================================================ FILE: examples/jsm/math/curves/Curve.js ================================================ /** * Curve */ class Curve { constructor() { this.arcLengthDivisions = 200; this.cacheArcLengths = null; this.needsUpdate = true; } getPoint(/* t, optionalTarget */) { console.warn('Curve: .getPoint() not implemented.'); return null; } getPointAt(u, optionalTarget) { const t = this.getUtoTmapping(u); return this.getPoint(t, optionalTarget); } getPoints(divisions = 5) { const points = []; for (let i = 0; i <= divisions; i++) { points.push(this.getPoint(i / divisions)); } return points; } getSpacedPoints(divisions = 5) { const points = []; for (let i = 0; i <= divisions; i++) { points.push(this.getPointAt(i / divisions)); } return points; } getLength() { const lengths = this.getLengths(); return lengths[lengths.length - 1]; } getLengths(divisions = this.arcLengthDivisions) { if (this.cacheArcLengths && (this.cacheArcLengths.length === divisions + 1) && !this.needsUpdate) { return this.cacheArcLengths; } this.needsUpdate = false; const cache = []; let current, last = this.getPoint(0); let sum = 0; cache.push(0); for (let p = 1; p <= divisions; p++) { current = this.getPoint(p / divisions); sum += current.distanceTo(last); cache.push(sum); last = current; } this.cacheArcLengths = cache; return cache; } updateArcLengths() { this.needsUpdate = true; this.getLengths(); } getUtoTmapping(u, distance) { const arcLengths = this.getLengths(); let i = 0; const il = arcLengths.length; let targetArcLength; // The targeted u distance value to get if (distance) { targetArcLength = distance; } else { targetArcLength = u * arcLengths[il - 1]; } // binary search for the index with largest value smaller than target u distance let low = 0, high = il - 1, comparison; while (low <= high) { i = Math.floor(low + (high - low) / 2); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats comparison = arcLengths[i] - targetArcLength; if (comparison < 0) { low = i + 1; } else if (comparison > 0) { high = i - 1; } else { high = i; break; // DONE } } i = high; if (arcLengths[i] === targetArcLength) { return i / (il - 1); } // we could get finer grain at lengths, or use simple interpolation between two points const lengthBefore = arcLengths[i]; const lengthAfter = arcLengths[i + 1]; const segmentLength = lengthAfter - lengthBefore; // determine where we are between the 'before' and 'after' points const segmentFraction = (targetArcLength - lengthBefore) / segmentLength; // add that fractional amount to t const t = (i + segmentFraction) / (il - 1); return t; } } Curve.prototype.isCurve = true; export { Curve }; ================================================ FILE: examples/jsm/math/curves/CurvePath.js ================================================ import { Vector2, Vector3 } from 't3d'; import { LineCurve2 } from './LineCurve2.js'; import { LineCurve3 } from './LineCurve3.js'; import { QuadraticBezierCurve2 } from './QuadraticBezierCurve2.js'; import { QuadraticBezierCurve3 } from './QuadraticBezierCurve3.js'; import { CubicBezierCurve2 } from './CubicBezierCurve2.js'; import { CubicBezierCurve3 } from './CubicBezierCurve3.js'; /** * CurvePath holds a series of curves that are connected end to end. */ class CurvePath { /** * Constructs a new CurvePath. */ constructor() { this.curves = []; this.cacheLengths = null; this.needsUpdate = true; if (new.target === CurvePath) { console.error('CurvePath: Abstract classes can not be instantiated.'); } } /** * Constructs a smooth curved path from an array of path points using cubic Bezier curves. * Ensures that all input points lie on the curve; inflection points should represent local extrema. * Control points are computed to satisfy these conditions. * @param {Vector2[]|Vector3[]} points - An array of path points. * @param {object} [options={}] - Options object. * @param {number} [options.smooth=0.3] - Smoothness factor; higher values yield a smoother curve. */ setSmoothCurves(points, options = {}) { const smooth = options.smooth || 0; const isCurvePath2 = this.isCurvePath2; if (points.length < 2) { console.warn(`CurvePath${isCurvePath2 ? 2 : 3}.setSmoothCurves: points length less than 2.`); return; } // Fall back to a polyline if smooth is 0. if (smooth === 0 || points.length === 2) { this.setPolylines(points, options); return; } const curves = this.curves; curves.length = 0; const CubicBezierCurve = isCurvePath2 ? CubicBezierCurve2 : CubicBezierCurve3; const Vector = isCurvePath2 ? Vector2 : Vector3; const cp0 = new Vector(); const cp1 = new Vector(); const prev = new Vector(); const next = new Vector(); const nextCp0 = new Vector(); const _vec_1 = new Vector(); const _vec_2 = new Vector(); for (let i = 0, l = points.length; i < l; i++) { const current = points[i]; if (i === 0) { cp0.copy(points[i]); } else if (i == l - 1) { const bezierCurve = new CubicBezierCurve(); bezierCurve.v0.copy(points[i - 1]); bezierCurve.v1.copy(cp0); bezierCurve.v2.copy(current); bezierCurve.v3.copy(current); curves.push(bezierCurve); } else { next.copy(points[i + 1]); prev.copy(points[i - 1]); const lenPrevSeg = _vec_1.subVectors(current, prev).getLength(); const lenNextSeg = _vec_2.subVectors(next, current).getLength(); const ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); _vec_1.subVectors(next, prev); cp1.subVectors(current, _vec_2.copy(_vec_1).multiplyScalar(smooth * (1 - ratioNextSeg))); nextCp0.addVectors(current, _vec_2.copy(_vec_1).multiplyScalar(smooth * ratioNextSeg)); nextCp0.min(_vec_1.copy(next).max(current)); nextCp0.max(_vec_1.copy(next).min(current)); _vec_1.subVectors(nextCp0, current); cp1.subVectors(current, _vec_1.multiplyScalar(lenPrevSeg / lenNextSeg)); cp1.min(_vec_1.copy(prev).max(current)); cp1.max(_vec_1.copy(prev).min(current)); _vec_1.subVectors(current, cp1); nextCp0.addVectors(current, _vec_1.multiplyScalar(lenNextSeg / lenPrevSeg)); const bezierCurve = new CubicBezierCurve(); bezierCurve.v0.copy(prev); bezierCurve.v1.copy(cp0); bezierCurve.v2.copy(cp1); bezierCurve.v3.copy(current); curves.push(bezierCurve); cp0.copy(nextCp0); } } } /** * Constructs a smooth curved path from an array of points using Quadratic Bezier curves and straight lines. * At right-angle turns, it applies quadratic Bezier curves with inflection points serving as control points. * @param {Vector2[]|Vector3[]} points - An array of path points. * @param {object} [options={}] - Options. * @param {number} [options.bevelRadius=0] - The bevel radius. * @param {boolean} [options.close=false] - Whether to automatically close the path. */ setBeveledCurves(points, options = {}) { const bevelRadius = options.bevelRadius || 0; const close = options.close || false; const isCurvePath2 = this.isCurvePath2; if (points.length < 2) { console.warn(`CurvePath${isCurvePath2 ? 2 : 3}.setBeveledCurves: points length less than 2.`); return; } // Fall back to a polyline if bevelRadius is 0. if (bevelRadius === 0 || points.length === 2) { this.setPolylines(points, options); return; } const lastIndex = points.length - 1; // If closing is needed and first and last points are different, add a segment connecting last to first. const segments = close && !points[0].equals(points[lastIndex]) ? points.length : lastIndex; const curves = this.curves; curves.length = 0; const LineCurve = isCurvePath2 ? LineCurve2 : LineCurve3; const QuadraticBezierCurve = isCurvePath2 ? QuadraticBezierCurve2 : QuadraticBezierCurve3; const Vector = isCurvePath2 ? Vector2 : Vector3; const p0 = new Vector().copy(points[0]); const _vec_1 = new Vector(); const _vec_2 = new Vector(); for (let i = 0; i < segments; i++) { const p1 = points[(i + 1) % (lastIndex + 1)]; const p2 = points[(i + 2) % (lastIndex + 1)]; // The last open segment is a straight line. if (i === (segments - 1) && !close) { const lineCurve = new LineCurve(); lineCurve.v1.copy(p0); lineCurve.v2.copy(p1); curves.push(lineCurve); p0.copy(p1); break; } const lastDir = _vec_1.subVectors(p1, p0); const nextDir = _vec_2.subVectors(p2, p1); const lastDirLength = lastDir.getLength(); const nextDirLength = nextDir.getLength(); const v0Dist = Math.min((i === 0 ? lastDirLength / 2 : lastDirLength) * 0.999999, bevelRadius); // fix const v2Dist = Math.min(nextDirLength / 2 * 0.999999, bevelRadius); lastDir.normalize(); nextDir.normalize(); const lineCurve = new LineCurve(); lineCurve.v1.copy(p0); lineCurve.v2.copy(p1).sub(lastDir.multiplyScalar(v0Dist)); curves.push(lineCurve); const bezierCurve = new QuadraticBezierCurve(); bezierCurve.v0.copy(lineCurve.v2); bezierCurve.v1.copy(p1); bezierCurve.v2.copy(p1).add(nextDir.multiplyScalar(v2Dist)); curves.push(bezierCurve); p0.copy(bezierCurve.v2); } // If closing is needed, fix the first point to the last. if (close) curves[0].v1.copy(p0); } /** * Constructs a polyline from an array of path points using straight segments. * This method creates a continuous series of line segments and optionally closes the path. * @param {Vector2[]|Vector3[]} points - An array of path points. * @param {object} [options={}] - Options. * @param {boolean} [options.close=false] - Whether to automatically close the path. */ setPolylines(points, options = {}) { const close = options.close === true; const isCurvePath2 = this.isCurvePath2; if (points.length < 2) { console.warn(`CurvePath${isCurvePath2 ? 2 : 3}.setPolylines: points length less than 2.`); return; } const lastIndex = points.length - 1; // If closing is needed and first and last points are different, add a segment connecting last to first. const segments = close && !points[0].equals(points[lastIndex]) ? points.length : lastIndex; const curves = this.curves; curves.length = 0; const LineCurve = isCurvePath2 ? LineCurve2 : LineCurve3; for (let i = 0; i < segments; i++) { const lineCurve = new LineCurve(); lineCurve.v1.copy(points[i]); lineCurve.v2.copy(i === lastIndex ? points[0] : points[i + 1]); curves.push(lineCurve); } } /** * Returns an array of points representing a sequence of curves. * The division parameter defines the number of pieces each curve is divided into. * However, for optimization and quality purposes, the actual sampling resolution for each curve depends on its type. * For example, for a LineCurve, the returned number of points is always just 2. * @param {number} [divisions=12] - Number of pieces to divide the curve into. * @returns {Vector2[]|Vector3[]} - An array of points representing the curve. */ getPoints(divisions = 12) { const points = []; for (let i = 0, curves = this.curves; i < curves.length; i++) { const curve = curves[i]; const resolution = (curve.isLineCurve2 || curve.isLineCurve3) ? 1 : divisions; const pts = curve.getPoints(resolution); const isLast = i === (curves.length - 1); for (let j = 0, l = isLast ? pts.length : pts.length - 1; j < l; j++) { const point = pts[j]; points.push(point); } } return points; } /** * This method returns a point for the given interpolation factor. * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range [0,1]. * @param {Vector2|Vector3} [optionalTarget] - An optional target point. * @returns {Vector2|Vector3} - The resulting point. */ getPoint(t, optionalTarget) { const d = t * this.getLength(); const curveLengths = this.getLengths(); let i = 0; while (i < curveLengths.length) { if (curveLengths[i] >= d) { const diff = curveLengths[i] - d; const curve = this.curves[i]; const segmentLength = curve.getLength(); const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; return curve.getPointAt(u, optionalTarget); } i++; } return this.curves[this.curves.length - 1].getPointAt(1, optionalTarget); } /** * Return total curve path length. * @returns {number} The total length. */ getLength() { const lengths = this.getLengths(); return lengths[lengths.length - 1]; } /** * Returns list of cumulative curve lengths of the defined curves. * @returns {number[]} The curve lengths. */ getLengths() { if (this.cacheLengths && this.cacheLengths.length === this.curves.length && !this.needsUpdate) { return this.cacheLengths; } this.needsUpdate = false; const lengths = []; let sums = 0; for (let i = 0, l = this.curves.length; i < l; i++) { sums += this.curves[i].getLength(); lengths.push(sums); } this.cacheLengths = lengths; return lengths; } /** * Updates the cumulative curve lengths of the defined curves. */ updateArcLengths() { this.needsUpdate = true; this.cacheLengths = null; this.getLengths(); } } CurvePath.prototype.isCurvePath = true; export { CurvePath }; ================================================ FILE: examples/jsm/math/curves/CurvePath2.js ================================================ import { CurvePath } from './CurvePath.js'; class CurvePath2 extends CurvePath {} CurvePath2.prototype.isCurvePath2 = true; export { CurvePath2 }; ================================================ FILE: examples/jsm/math/curves/CurvePath3.js ================================================ import { Vector3, Matrix4, MathUtils } from 't3d'; import { CurvePath } from './CurvePath.js'; class CurvePath3 extends CurvePath { /** * Computes the frames data of the path. * TODO: move this to CurvePath. * @param {object} [options={}] - Options object. * @param {Vector3|null} [options.up=null] - The input up vector. * @param {number} [options.divisions=12] - The number of divisions. * @param {boolean} [options.frenet=true] - Whether to use Frenet frames. * @param {boolean} [options.fixLine=true] - Whether to fix line tangent types. * @param {boolean} [options.close=false] - Whether auto-close the path. * @returns {object} - The frames data. */ computeFrames(options = {}) { const up = options.up; const divisions = options.divisions !== undefined ? options.divisions : 12; const frenet = options.frenet !== undefined ? options.frenet : true; const fixLine = options.fixLine !== undefined ? options.fixLine : true; const close = options.close !== undefined ? options.close : false; const points = []; const tangents = []; const normals = []; const binormals = []; const bisectors = []; const lengths = []; const widthScales = []; const sharps = []; const tangentTypes = []; // get points let tangentType = 0; for (let i = 0, curves = this.curves; i < curves.length; i++) { const curve = curves[i]; const isLine = curve.isLineCurve2 || curve.isLineCurve3; const resolution = isLine ? 1 : divisions; const pts = curve.getPoints(resolution); const isLast = i === (curves.length - 1); if (fixLine && isLine && !isLast) { const nextCurve = curves[i + 1]; const isNextLine = nextCurve.isLineCurve2 || nextCurve.isLineCurve3; if (!isNextLine) { tangentType = 1; } } for (let j = 0, l = isLast ? pts.length : pts.length - 1; j < l; j++) { const point = pts[j]; points.push(point); tangentTypes.push(tangentType); if (tangentType === 1) { tangentType++; } else { if (tangentType === 2) { tangentType = 0; } } } } // first point tangents[0] = new Vector3(); normals[0] = new Vector3(); binormals[0] = new Vector3(); bisectors[0] = new Vector3(); tangents[0].subVectors(points[1], points[0]).normalize(); if (up) { normals[0].copy(up); } else { // select an initial normal vector perpendicular to the first tangent vector, // and in the direction of the minimum tangent xyz component let min = Number.MAX_VALUE; const tx = Math.abs(tangents[0].x); const ty = Math.abs(tangents[0].y); const tz = Math.abs(tangents[0].z); if (tx < min) { min = tx; normals[0].set(1, 0, 0); } if (ty < min) { min = ty; normals[0].set(0, 1, 0); } if (tz < min) { normals[0].set(0, 0, 1); } } binormals[0].crossVectors(tangents[0], normals[0]).normalize(); normals[0].crossVectors(binormals[0], tangents[0]).normalize(); bisectors[0].copy(binormals[0]); lengths[0] = 0; widthScales[0] = 1; sharps[0] = false; // other points const lastDir = new Vector3(); const nextDir = new Vector3(); for (let i = 1; i < points.length - 1; i++) { const tangent = new Vector3(); const normal = new Vector3(); const binormal = new Vector3(); const bisector = new Vector3(); lastDir.subVectors(points[i], points[i - 1]); nextDir.subVectors(points[i + 1], points[i]); const lastLength = lastDir.getLength(); lastDir.normalize(); nextDir.normalize(); bisector.subVectors(nextDir, lastDir).normalize(); const tangentType = tangentTypes[i]; if (tangentType === 1) { tangent.copy(nextDir); } else if (tangentType === 2) { tangent.copy(lastDir); } else { tangent.addVectors(lastDir, nextDir).normalize(); } if (frenet) { normal.copy(normals[i - 1]); const vec = binormal.crossVectors(tangents[i - 1], tangent); if (vec.getLength() > Number.EPSILON) { vec.normalize(); const theta = Math.acos(MathUtils.clamp(tangents[i - 1].dot(tangent), -1, 1)); // clamp for floating pt errors normal.applyMatrix4(_mat4_1.makeRotationAxis(vec, theta)); } binormal.crossVectors(tangent, normal).normalize(); } else { normal.copy(up || normals[i - 1]); if (tangent.dot(normal) === 1) { binormal.crossVectors(nextDir, normal).normalize(); } else { binormal.crossVectors(tangent, normal).normalize(); } normal.crossVectors(binormal, tangent).normalize(); } tangents[i] = tangent; normals[i] = normal; binormals[i] = binormal; bisectors[i] = bisector; const _cos = lastDir.dot(nextDir); lengths[i] = lengths[i - 1] + lastLength; widthScales[i] = Math.min(1 / Math.sqrt((1 + _cos) / 2), 1.415) || 1; sharps[i] = (Math.abs(_cos - 1) > 0.05); } // last point const lastIndex = points.length - 1; const tangent = new Vector3(); const normal = new Vector3(); const binormal = new Vector3(); const bisector = new Vector3(); tangent.subVectors(points[lastIndex], points[lastIndex - 1]); const dist = tangent.getLength(); if (close) { tangent.copy(tangents[0]); } else { tangent.normalize(); } normal.copy(normals[lastIndex - 1]); const vec = binormal.crossVectors(tangents[lastIndex - 1], tangent); if (vec.getLength() > Number.EPSILON) { // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf vec.normalize(); const theta = Math.acos(MathUtils.clamp(tangents[lastIndex - 1].dot(tangent), -1, 1)); // clamp for floating pt errors normal.applyMatrix4(_mat4_1.makeRotationAxis(vec, theta)); } binormal.crossVectors(tangent, normal).normalize(); bisector.copy(binormal); tangents[lastIndex] = tangent; normals[lastIndex] = normal; binormals[lastIndex] = binormal; bisectors[lastIndex] = bisector; lengths[lastIndex] = lengths[lastIndex - 1] + dist; widthScales[lastIndex] = 1; sharps[lastIndex] = false; // fix first if close if (close) { tangents[0].copy(tangent); normals[0].copy(normal); binormals[0].copy(binormal); bisectors[0].copy(bisector); } return { points, tangents, normals, binormals, bisectors, lengths, widthScales, sharps, tangentTypes }; } // deprecated since 0.4.0 setFromPoints(points, options = {}) { console.warn('CurvePath3: setFromPoints() has been deprecated. Use setBeveledCurves() instead.'); super.setBeveledCurves(points, options); } } CurvePath3.prototype.isCurvePath3 = true; const _mat4_1 = new Matrix4(); export { CurvePath3 }; ================================================ FILE: examples/jsm/math/curves/CurveUtils.js ================================================ import { Vector3 } from 't3d'; /** * CurveUtils */ class CurveUtils { /** * Generates 2D-Coordinates in a very fast way. * Based on work by: * @see http://www.openprocessing.org/sketch/15493 * @param {Vector3} center Center of Hilbert curve. * @param {number} size Total width of Hilbert curve. * @param {number} iterations Number of subdivisions. * @param {number} v0 Corner index -X, -Z. * @param {number} v1 Corner index -X, +Z. * @param {number} v2 Corner index +X, +Z. * @param {number} v3 Corner index +X, -Z. * @returns {Vector3[]} Array of Vector */ static hilbert2D(center = new Vector3(0, 0, 0), size = 10, iterations = 1, v0 = 0, v1 = 1, v2 = 2, v3 = 3) { const half = size / 2; const vec_s = [ new Vector3(center.x - half, center.y, center.z - half), new Vector3(center.x - half, center.y, center.z + half), new Vector3(center.x + half, center.y, center.z + half), new Vector3(center.x + half, center.y, center.z - half) ]; const vec = [ vec_s[v0], vec_s[v1], vec_s[v2], vec_s[v3] ]; // Recurse iterations if (0 <= --iterations) { const tmp = []; Array.prototype.push.apply(tmp, this.hilbert2D(vec[0], half, iterations, v0, v3, v2, v1)); Array.prototype.push.apply(tmp, this.hilbert2D(vec[1], half, iterations, v0, v1, v2, v3)); Array.prototype.push.apply(tmp, this.hilbert2D(vec[2], half, iterations, v0, v1, v2, v3)); Array.prototype.push.apply(tmp, this.hilbert2D(vec[3], half, iterations, v2, v1, v0, v3)); // Return recursive call return tmp; } // Return complete Hilbert Curve. return vec; } /** * Generates 3D-Coordinates in a very fast way. * Based on work by: * @see http://www.openprocessing.org/visuals/?visualID=15599 * @param {Vector3} center Center of Hilbert curve. * @param {number} size Total width of Hilbert curve. * @param {number} iterations Number of subdivisions. * @param {number} v0 Corner index -X, +Y, -Z. * @param {number} v1 Corner index -X, +Y, +Z. * @param {number} v2 Corner index -X, -Y, +Z. * @param {number} v3 Corner index -X, -Y, -Z. * @param {number} v4 Corner index +X, -Y, -Z. * @param {number} v5 Corner index +X, -Y, +Z. * @param {number} v6 Corner index +X, +Y, +Z. * @param {number} v7 Corner index +X, +Y, -Z. * @returns {Vector3[]} Array of Vector3. */ static hilbert3D(center = new Vector3(0, 0, 0), size = 10, iterations = 1, v0 = 0, v1 = 1, v2 = 2, v3 = 3, v4 = 4, v5 = 5, v6 = 6, v7 = 7) { // Default Vars const half = size / 2; const vec_s = [ new Vector3(center.x - half, center.y + half, center.z - half), new Vector3(center.x - half, center.y + half, center.z + half), new Vector3(center.x - half, center.y - half, center.z + half), new Vector3(center.x - half, center.y - half, center.z - half), new Vector3(center.x + half, center.y - half, center.z - half), new Vector3(center.x + half, center.y - half, center.z + half), new Vector3(center.x + half, center.y + half, center.z + half), new Vector3(center.x + half, center.y + half, center.z - half) ]; const vec = [ vec_s[v0], vec_s[v1], vec_s[v2], vec_s[v3], vec_s[v4], vec_s[v5], vec_s[v6], vec_s[v7] ]; // Recurse iterations if (--iterations >= 0) { const tmp = []; Array.prototype.push.apply(tmp, this.hilbert3D(vec[0], half, iterations, v0, v3, v4, v7, v6, v5, v2, v1)); Array.prototype.push.apply(tmp, this.hilbert3D(vec[1], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3)); Array.prototype.push.apply(tmp, this.hilbert3D(vec[2], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3)); Array.prototype.push.apply(tmp, this.hilbert3D(vec[3], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5)); Array.prototype.push.apply(tmp, this.hilbert3D(vec[4], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5)); Array.prototype.push.apply(tmp, this.hilbert3D(vec[5], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7)); Array.prototype.push.apply(tmp, this.hilbert3D(vec[6], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7)); Array.prototype.push.apply(tmp, this.hilbert3D(vec[7], half, iterations, v6, v5, v2, v1, v0, v3, v4, v7)); // Return recursive call return tmp; } // Return complete Hilbert Curve. return vec; } static quadraticBezier(t, p0, p1, p2) { return quadraticBezierP0(t, p0) + quadraticBezierP1(t, p1) + quadraticBezierP2(t, p2); } static cubicBezier(t, p0, p1, p2, p3) { return cubicBezierP0(t, p0) + cubicBezierP1(t, p1) + cubicBezierP2(t, p2) + cubicBezierP3(t, p3); } } function quadraticBezierP0(t, p) { const k = 1 - t; return k * k * p; } function quadraticBezierP1(t, p) { return 2 * (1 - t) * t * p; } function quadraticBezierP2(t, p) { return t * t * p; } function cubicBezierP0(t, p) { const k = 1 - t; return k * k * k * p; } function cubicBezierP1(t, p) { const k = 1 - t; return 3 * k * k * t * p; } function cubicBezierP2(t, p) { return 3 * (1 - t) * t * t * p; } function cubicBezierP3(t, p) { return t * t * t * p; } export { CurveUtils }; ================================================ FILE: examples/jsm/math/curves/Curves.js ================================================ export { Curve } from './Curve.js'; export { LineCurve2 } from './LineCurve2.js'; export { LineCurve3 } from './LineCurve3.js'; export { QuadraticBezierCurve2 } from './QuadraticBezierCurve2.js'; export { QuadraticBezierCurve3 } from './QuadraticBezierCurve3.js'; export { CubicBezierCurve2 } from './CubicBezierCurve2.js'; export { CubicBezierCurve3 } from './CubicBezierCurve3.js'; export { CurvePath2 } from './CurvePath2.js'; export { CurvePath3 } from './CurvePath3.js'; ================================================ FILE: examples/jsm/math/curves/LineCurve2.js ================================================ /** * LineCurve2 */ import { Vector2 } from 't3d'; import { Curve } from './Curve.js'; class LineCurve2 extends Curve { constructor(v1 = new Vector2(), v2 = new Vector2()) { super(); this.arcLengthDivisions = 1; this.v1 = v1; this.v2 = v2; } getPoint(t, optionalTarget = new Vector2()) { const point = optionalTarget; if (t === 1) { point.copy(this.v2); } else { point.copy(this.v2).sub(this.v1); point.multiplyScalar(t).add(this.v1); } return point; } // Line curve is linear, so we can overwrite default getPointAt getPointAt(u, optionalTarget) { return this.getPoint(u, optionalTarget); } } LineCurve2.prototype.isLineCurve2 = true; export { LineCurve2 }; ================================================ FILE: examples/jsm/math/curves/LineCurve3.js ================================================ /** * LineCurve3 */ import { Vector3 } from 't3d'; import { Curve } from './Curve.js'; class LineCurve3 extends Curve { constructor(v1 = new Vector3(), v2 = new Vector3()) { super(); this.arcLengthDivisions = 1; this.v1 = v1; this.v2 = v2; } getPoint(t, optionalTarget = new Vector3()) { const point = optionalTarget; if (t === 1) { point.copy(this.v2); } else { point.copy(this.v2).sub(this.v1); point.multiplyScalar(t).add(this.v1); } return point; } // Line curve is linear, so we can overwrite default getPointAt getPointAt(u, optionalTarget) { return this.getPoint(u, optionalTarget); } } LineCurve3.prototype.isLineCurve3 = true; export { LineCurve3 }; ================================================ FILE: examples/jsm/math/curves/QuadraticBezierCurve2.js ================================================ /** * QuadraticBezierCurve2 */ import { Vector2 } from 't3d'; import { Curve } from './Curve.js'; import { CurveUtils } from './CurveUtils.js'; class QuadraticBezierCurve2 extends Curve { constructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2()) { super(); this.v0 = v0; this.v1 = v1; this.v2 = v2; } getPoint(t, optionalTarget = new Vector2()) { const point = optionalTarget; const v0 = this.v0, v1 = this.v1, v2 = this.v2; point.set( CurveUtils.quadraticBezier(t, v0.x, v1.x, v2.x), CurveUtils.quadraticBezier(t, v0.y, v1.y, v2.y) ); return point; } } QuadraticBezierCurve2.prototype.isQuadraticBezierCurve2 = true; export { QuadraticBezierCurve2 }; ================================================ FILE: examples/jsm/math/curves/QuadraticBezierCurve3.js ================================================ /** * QuadraticBezierCurve3 */ import { Vector3 } from 't3d'; import { Curve } from './Curve.js'; import { CurveUtils } from './CurveUtils.js'; class QuadraticBezierCurve3 extends Curve { constructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3()) { super(); this.v0 = v0; this.v1 = v1; this.v2 = v2; } getPoint(t, optionalTarget = new Vector3()) { const point = optionalTarget; const v0 = this.v0, v1 = this.v1, v2 = this.v2; point.set( CurveUtils.quadraticBezier(t, v0.x, v1.x, v2.x), CurveUtils.quadraticBezier(t, v0.y, v1.y, v2.y), CurveUtils.quadraticBezier(t, v0.z, v1.z, v2.z) ); return point; } } QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true; export { QuadraticBezierCurve3 }; ================================================ FILE: examples/jsm/misc/OcclusionProxyManager.js ================================================ import { QuerySet, QUERYSET_TYPE, Mesh } from 't3d'; export class OcclusionProxyManager { constructor(count = 2048) { this.querySet = new QuerySet(QUERYSET_TYPE.OCCLUSION, count); this.occludedArray = new Array(count).fill(0); this.proxies = []; this.indices = new IndicesManager(count); this.isReading = false; } addProxy(proxy) { const index = this.indices.getIndex(); if (index === -1) { console.warn('OcclusionProxyManager: Reached the max count of occlusion proxies.'); return; } proxy.$activate(index); this.proxies.push(proxy); } removeProxy(proxy) { const i = this.proxies.indexOf(proxy); if (i !== -1) { this.proxies.splice(i, 1); this.indices.freeIndex(proxy.$deactivate()); } } update(renderer) { if (!this.isReading) { renderer.readQuerySetResults( this.querySet, this.occludedArray, 0, this.indices.maxIndex + 1 ).then(results => { this.proxies.forEach(proxy => { proxy.$syncOcclusion(results); }); this.isReading = false; }); this.isReading = true; } } } export class OcclusionProxy extends Mesh { constructor(geometry, material) { super(geometry, material); // Set renderLayer to 1 by default. // This can be changed by user // to make sure the occlusion tester is rendered after other objects. this.renderLayer = 1; this.onOcclusionChange = null; this._index = -1; this._occluded = false; } get active() { return this._index !== -1; } get index() { return this._index; } get occluded() { return this._occluded; } $activate(index) { this._index = index; } $deactivate() { const index = this._index; this._index = -1; this._occluded = false; return index; } $syncOcclusion(occludedArray) { if (this._index === -1) return; const occluded = !occludedArray[this._index]; if (this._occluded !== occluded) { this._occluded = occluded; this.onOcclusionChange && this.onOcclusionChange(occluded); } } } OcclusionProxy.prototype.isOcclusionProxy = true; class IndicesManager { constructor(maxCount) { this.maxIndex = -1; this.freeIndices = []; this.maxCount = maxCount; } getIndex() { let index; if (this.freeIndices.length > 0) { // Get the smallest index from freeIndices index = this.freeIndices.pop(); } else { if (this.maxIndex + 1 >= this.maxCount) { // Reached the max count of occlusion proxies. return -1; } index = ++this.maxIndex; } return index; } freeIndex(index) { if (index < 0 || index > this.maxIndex) { return; } if (index === this.maxIndex) { this.maxIndex--; } // Insert index back to freeIndices, keeping the array sorted in descending order let left = 0, right = this.freeIndices.length; while (left < right) { const mid = Math.floor((left + right) / 2); if (this.freeIndices[mid] > index) { left = mid + 1; } else { right = mid; } } this.freeIndices.splice(left, 0, index); } } export const OcclusionRenderOptions = { ifRender: function(renderable) { return renderable.object.active; }, beforeRender: function(renderable) { this.beginOcclusionQuery(renderable.object.index); }, afterRender: function() { this.endOcclusionQuery(); } }; ================================================ FILE: examples/jsm/misc/Timer.js ================================================ // Reference: github.com/mrdoob/three.js/pull/17912 class Timer { constructor() { this._previousTime = 0; this._currentTime = 0; this._startTime = now(); this._delta = 0; this._elapsed = 0; // use Page Visibility API to avoid large time delta values this._usePageVisibilityAPI = (typeof document !== 'undefined' && document.hidden !== undefined); if (this._usePageVisibilityAPI === true) { this._pageVisibilityHandler = handleVisibilityChange.bind(this); document.addEventListener('visibilitychange', this._pageVisibilityHandler, false); } } getDelta() { return this._delta / 1000; } getElapsed() { return this._elapsed / 1000; } reset() { this._currentTime = now() - this._startTime; return this; } dispose() { if (this._usePageVisibilityAPI === true) { document.removeEventListener('visibilitychange', this._pageVisibilityHandler); } return this; } update(timestamp) { if (this._usePageVisibilityAPI === true && document.hidden === true) { this._delta = 0; } else { this._previousTime = this._currentTime; this._currentTime = (timestamp !== undefined ? timestamp : now()) - this._startTime; this._delta = this._currentTime - this._previousTime; this._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas } return this; } } class FixedTimer extends Timer { constructor(fps = 60) { super(); this._delta = (1 / fps) * 1000; } update() { this._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas return this; } } function now() { return performance.now(); } function handleVisibilityChange() { if (document.hidden === false) this.reset(); } export { Timer, FixedTimer }; ================================================ FILE: examples/jsm/navigation/AStar.js ================================================ // javascript-astar // http://github.com/bgrins/javascript-astar // Freely distributable under the MIT License. // Implements the astar search algorithm in javascript using a binary heap. class AStar { static init(graph) { for (let x = 0; x < graph.length; x++) { const node = graph[x]; node.f = 0; node.g = 0; node.h = 0; node.cost = 1.0; node.visited = false; node.closed = false; node.parent = null; } } static cleanUp(graph) { for (let x = 0; x < graph.length; x++) { const node = graph[x]; delete node.f; delete node.g; delete node.h; delete node.cost; delete node.visited; delete node.closed; delete node.parent; } } static search(graph, start, end) { this.init(graph); const openHeap = new BinaryHeap(function(node) { return node.f; }); openHeap.push(start); while (openHeap.size() > 0) { // Grab the lowest f(x) to process next. Heap keeps this sorted for us. const currentNode = openHeap.pop(); // End case -- result has been found, return the traced path. if (currentNode === end) { let curr = currentNode; const ret = []; while (curr.parent) { ret.push(curr); curr = curr.parent; } this.cleanUp(ret); return ret.reverse(); } // Normal case -- move currentNode from open to closed, process each of its neighbours. currentNode.closed = true; // Find all neighbours for the current node. Optionally find diagonal neighbours as well (false by default). const neighbours = this.neighbours(graph, currentNode); for (let i = 0, il = neighbours.length; i < il; i++) { const neighbour = neighbours[i]; if (neighbour.closed) { // Not a valid node to process, skip to next neighbour. continue; } // The g score is the shortest distance from start to current node. // We need to check if the path we have arrived at this neighbour is the shortest one we have seen yet. const gScore = currentNode.g + neighbour.cost; const beenVisited = neighbour.visited; if (!beenVisited || gScore < neighbour.g) { // Found an optimal (so far) path to this node. Take score for node to see how good it is. neighbour.visited = true; neighbour.parent = currentNode; if (!neighbour.centroid || !end.centroid) { throw new Error('Unexpected state'); } neighbour.h = neighbour.h || neighbour.centroid.distanceToSquared(end.centroid); neighbour.g = gScore; neighbour.f = neighbour.g + neighbour.h; if (!beenVisited) { // Pushing to heap will put it in proper place based on the 'f' value. openHeap.push(neighbour); } else { // Already seen the node, but since it has been rescored we need to reorder it in the heap openHeap.rescoreElement(neighbour); } } } } // No result was found - empty array signifies failure to find path. return []; } static neighbours(graph, node) { const ret = []; for (let e = 0; e < node.neighbours.length; e++) { ret.push(graph[node.neighbours[e]]); } return ret; } } class BinaryHeap { constructor(scoreFunction) { this.content = []; this.scoreFunction = scoreFunction; } push(element) { // Add the new element to the end of the array. this.content.push(element); // Allow it to sink down. this.sinkDown(this.content.length - 1); } pop() { // Store the first element so we can return it later. const result = this.content[0]; // Get the element at the end of the array. const end = this.content.pop(); // If there are any elements left, put the end element at the // start, and let it bubble up. if (this.content.length > 0) { this.content[0] = end; this.bubbleUp(0); } return result; } remove(node) { const i = this.content.indexOf(node); // When it is found, the process seen in 'pop' is repeated // to fill up the hole. const end = this.content.pop(); if (i !== this.content.length - 1) { this.content[i] = end; if (this.scoreFunction(end) < this.scoreFunction(node)) { this.sinkDown(i); } else { this.bubbleUp(i); } } } size() { return this.content.length; } rescoreElement(node) { this.sinkDown(this.content.indexOf(node)); } sinkDown(n) { // Fetch the element that has to be sunk. const element = this.content[n]; // When at 0, an element can not sink any further. while (n > 0) { // Compute the parent element's index, and fetch it. const parentN = ((n + 1) >> 1) - 1; const parent = this.content[parentN]; if (this.scoreFunction(element) < this.scoreFunction(parent)) { // Swap the elements if the parent is greater. this.content[parentN] = element; this.content[n] = parent; // Update 'n' to continue at the new position. n = parentN; } else { // Found a parent that is less, no need to sink any further. break; } } } bubbleUp(n) { // Look up the target element and its score. const length = this.content.length, element = this.content[n], elemScore = this.scoreFunction(element); while (true) { // Compute the indices of the child elements. const child2N = (n + 1) << 1, child1N = child2N - 1; // This is used to store the new position of the element, // if any. let swap = null; let child1Score; // If the first child exists (is inside the array)... if (child1N < length) { // Look it up and compute its score. const child1 = this.content[child1N]; child1Score = this.scoreFunction(child1); // If the score is less than our element's, we need to swap. if (child1Score < elemScore) { swap = child1N; } } // Do the same checks for the other child. if (child2N < length) { const child2 = this.content[child2N], child2Score = this.scoreFunction(child2); if (child2Score < (swap === null ? elemScore : child1Score)) { swap = child2N; } } if (swap !== null) { // If the element needs to be moved, swap it, and continue. this.content[n] = this.content[swap]; this.content[swap] = element; n = swap; } else { // Otherwise, we are done. break; } } } } export { AStar }; ================================================ FILE: examples/jsm/navigation/Pathfinding.js ================================================ import { Vector3 } from 't3d'; import { AStar } from './AStar.js'; import { isPointInPoly, triarea2, vequal } from './Utils.js'; class Pathfinding { // Returns a path between given start and end points. If a complete path // cannot be found, will return the nearest endpoint available. static findPath(startPosition, targetPosition, zone) { if (!zone) return; const groupID = zone.getGroup(startPosition); const nodes = zone.groups[groupID]; const vertices = zone.vertices; if (!nodes || !vertices) return; // maybe stuck when its true const closestNode = getClosestNode(startPosition, nodes, vertices, true); const farthestNode = getClosestNode(targetPosition, nodes, vertices, true); // If we can't find any node, just go straight to the target if (!closestNode || !farthestNode) { return null; } const paths = AStar.search(nodes, closestNode, farthestNode); const getPortalFromTo = function(a, b) { for (let i = 0; i < a.neighbours.length; i++) { if (a.neighbours[i] === b.id) { return a.portals[i]; } } }; // We have the corridor, now pull the rope. const channel = new Channel(); channel.push(startPosition); for (let i = 0; i < paths.length; i++) { const polygon = paths[i]; const nextPolygon = paths[i + 1]; if (nextPolygon) { const portals = getPortalFromTo(polygon, nextPolygon); channel.push(vertices[portals[0]], vertices[portals[1]]); } } channel.push(targetPosition); channel.stringPull(); // Return the path, omitting first position (which is already known). const path = channel.path.map(c => new Vector3(c.x, c.y, c.z)); path.shift(); return path; } } export { Pathfinding }; class Channel { constructor() { this.portals = []; } push(p1, p2) { if (p2 === undefined) p2 = p1; this.portals.push({ left: p1, right: p2 }); } stringPull() { const portals = this.portals; const pts = []; // Init scan state let portalApex, portalLeft, portalRight; let apexIndex = 0; let leftIndex = 0; let rightIndex = 0; portalApex = portals[0].left; portalLeft = portals[0].left; portalRight = portals[0].right; // Add start point. pts.push(portalApex); for (let i = 1; i < portals.length; i++) { const left = portals[i].left; const right = portals[i].right; // Update right vertex. if (triarea2(portalApex, portalRight, right) <= 0.0) { if (vequal(portalApex, portalRight) || triarea2(portalApex, portalLeft, right) > 0.0) { // Tighten the funnel. portalRight = right; // rightIndex = i; } else { // Right over left, insert left to path and restart scan from portal left point. pts.push(portalLeft); // Make current left the new apex. portalApex = portalLeft; apexIndex = leftIndex; // Reset portal portalRight = portalApex; rightIndex = apexIndex; // Restart scan i = apexIndex; continue; } } // Update left vertex. if (triarea2(portalApex, portalLeft, left) >= 0.0) { if (vequal(portalApex, portalLeft) || triarea2(portalApex, portalRight, left) < 0.0) { // Tighten the funnel. portalLeft = left; leftIndex = i; } else { // Left over right, insert right to path and restart scan from portal right point. pts.push(portalRight); // Make current right the new apex. portalApex = portalRight; apexIndex = rightIndex; // Reset portal portalLeft = portalApex; leftIndex = apexIndex; // Restart scan i = apexIndex; continue; } } } if ( pts.length === 0 || !vequal(pts[pts.length - 1], portals[portals.length - 1].left) ) { // Append last point to path. pts.push(portals[portals.length - 1].left); } this.path = pts; return pts; } } // Returns the closest node to the target position. function getClosestNode(position, nodes, vertices, checkPolygon = false) { let closestNode = null; let closestDistance = Infinity; nodes.forEach(node => { const distance = node.centroid.distanceToSquared(position); if (distance < closestDistance && (!checkPolygon || isVectorInPolygon(position, node, vertices))) { closestNode = node; closestDistance = distance; } }); return closestNode; } function isVectorInPolygon(vector, polygon, vertices) { // reference point will be the centroid of the polygon // We need to rotate the vector as well as all the points which the polygon uses let lowestPoint = 100000; let highestPoint = -100000; const polygonVertices = []; polygon.vertexIds.forEach(vId => { lowestPoint = Math.min(vertices[vId].y, lowestPoint); highestPoint = Math.max(vertices[vId].y, highestPoint); polygonVertices.push(vertices[vId]); }); if ( vector.y < highestPoint + 0.5 && vector.y > lowestPoint - 0.5 && isPointInPoly(polygonVertices, vector) ) { return true; } return false; } ================================================ FILE: examples/jsm/navigation/PathfindingHelper.js ================================================ import { BoxGeometry, SphereGeometry, BasicMaterial, LineMaterial, Mesh, Object3D, Geometry, Buffer, Attribute, DRAW_MODE } from 't3d'; // Helper for debugging pathfinding behavior. class PathfindingHelper extends Object3D { constructor() { super(); const playerMaterial = new BasicMaterial(); playerMaterial.diffuse.setHex(0x00FF00); this._playerMarker = new Mesh(new SphereGeometry(0.23, 32, 32), playerMaterial); const targetMaterial = new BasicMaterial(); targetMaterial.diffuse.setHex(0xFFA500); this._targetMarker = new Mesh(new BoxGeometry(0.3, 0.3, 0.3), targetMaterial); this._pathMarker = new Object3D(); this._pathLineMaterial = new LineMaterial(); this._pathLineMaterial.diffuse.setHex(0x0000ff); this._pathLineMaterial.lineWidth = 1; this._pathLineMaterial.transparent = true; this._pathLineMaterial.opacity = 0.5; this._pathLineMaterial.drawMode = DRAW_MODE.LINE_STRIP; this._pathPointMaterial = new BasicMaterial(); this._pathPointMaterial.diffuse.setHex(0x0000ff); this._pathPointGeometry = new SphereGeometry(0.08); this._markers = [ this._playerMarker, this._targetMarker, this._pathMarker ]; this._markers.forEach(marker => { marker.visible = false; this.add(marker); }); } setPath(path) { while (this._pathMarker.children.length) { this._pathMarker.children[0].visible = false; this._pathMarker.remove(this._pathMarker.children[0]); } path = [this._playerMarker.position].concat(path); // Draw debug lines const geometry = new Geometry(); const buffer = new Buffer(new Float32Array(path.length * 3), 3); geometry.addAttribute('a_Position', new Attribute(buffer, 3, 0)); for (let i = 0; i < path.length; i++) { const index = i * 3; buffer.array[index + 0] = path[i].x; buffer.array[index + 1] = path[i].y + OFFSET; buffer.array[index + 2] = path[i].z; } const lineMesh = new Mesh(geometry, this._pathLineMaterial); this._pathMarker.add(lineMesh); for (let i = 0; i < path.length - 1; i++) { const node = new Mesh(this._pathPointGeometry, this._pathPointMaterial); node.position.copy(path[i]); node.position.y += OFFSET; this._pathMarker.add(node); } this._pathMarker.visible = true; return this; } setPlayerPosition(position) { this._playerMarker.position.copy(position); this._playerMarker.visible = true; return this; } setTargetPosition(position) { this._targetMarker.position.copy(position); this._targetMarker.visible = true; return this; } // Hides all markers. reset() { while (this._pathMarker.children.length) { this._pathMarker.children[0].geometry.dispose(); this._pathMarker.remove(this._pathMarker.children[0]); } this._markers.forEach(marker => { marker.visible = false; }); return this; } } export { PathfindingHelper }; const OFFSET = 0.2; ================================================ FILE: examples/jsm/navigation/Utils.js ================================================ // + Jonas Raoni Soares Silva // @ http://jsfromhell.com/math/is-point-in-poly [rev. #0] export function isPointInPoly(poly, pt) { let c = false; for (let i = -1, l = poly.length, j = l - 1; ++i < l; j = i) { ((poly[i].z <= pt.z && pt.z < poly[j].z) || (poly[j].z <= pt.z && pt.z < poly[i].z)) && (pt.x < (poly[j].x - poly[i].x) * (pt.z - poly[i].z) / (poly[j].z - poly[i].z) + poly[i].x) && (c = !c); } return c; } export function triarea2(a, b, c) { const ax = b.x - a.x; const az = b.z - a.z; const bx = c.x - a.x; const bz = c.z - a.z; return bx * az - ax * bz; } export function vequal(a, b) { return a.distanceToSquared(b) < 0.00001; } ================================================ FILE: examples/jsm/navigation/Zone.js ================================================ import { Vector3, Plane, Matrix4, DRAW_MODE } from 't3d'; import { isPointInPoly } from './Utils.js'; import { TriangleSoup } from '../math/TriangleSoup.js'; class Zone { static createFromTriangleSoup(triangleSoup) { const navMesh = _buildPolygonsFromTriangleSoup(triangleSoup); const zone = new Zone(); navMesh.vertices.forEach(v => { v.x = roundNumber(v.x, 2); v.y = roundNumber(v.y, 2); v.z = roundNumber(v.z, 2); }); zone.vertices = navMesh.vertices; const groups = _buildPolygonGroups(navMesh); // TODO: This block represents a large portion of navigation mesh construction time // and could probably be optimized. For example, construct portals while // determining the neighbor graph. zone.groups = new Array(groups.length); groups.forEach((group, groupIndex) => { const indexByPolygon = new Map(); // { polygon: index in group } group.forEach((poly, polyIndex) => { indexByPolygon.set(poly, polyIndex); }); const newGroup = new Array(group.length); group.forEach((poly, polyIndex) => { const neighbourIndices = []; poly.neighbours.forEach(n => neighbourIndices.push(indexByPolygon.get(n)) ); // Build a portal list to each neighbour const portals = []; poly.neighbours.forEach(n => portals.push(_getSharedVerticesInOrder(poly, n)) ); const centroid = new Vector3(0, 0, 0); centroid.add(zone.vertices[poly.vertexIds[0]]); centroid.add(zone.vertices[poly.vertexIds[1]]); centroid.add(zone.vertices[poly.vertexIds[2]]); centroid.multiplyScalar(1 / 3); centroid.x = roundNumber(centroid.x, 2); centroid.y = roundNumber(centroid.y, 2); centroid.z = roundNumber(centroid.z, 2); newGroup[polyIndex] = { id: polyIndex, neighbours: neighbourIndices, vertexIds: poly.vertexIds, centroid: centroid, portals: portals }; }); zone.groups[groupIndex] = newGroup; }); return zone; } // deprecated since v0.4.1 static createFromGeometry(geometry, tolerance = 1e-4) { console.warn('Zone.createFromGeometry has been deprecated, use Zone.createFromTriangleSoup instead.'); const fakeMesh = { geometry, material: { drawMode: DRAW_MODE.TRIANGLES } }; const triangleSoup = new TriangleSoup(); triangleSoup.addMesh(fakeMesh, new Matrix4()); triangleSoup.mergeVertices(tolerance); return this.createFromTriangleSoup(triangleSoup); } constructor() { this.vertices = []; this.groups = []; } // Returns closest node group ID for given position. getGroup(position, checkPolygon = false) { let closestNodeGroup = null; let distance = Math.pow(50, 2); // Is the distance too large here? for (let i = 0; i < this.groups.length; i++) { const group = this.groups[i]; for (const node of group) { if (checkPolygon) { const a = this.vertices[node.vertexIds[0]]; const b = this.vertices[node.vertexIds[1]]; const c = this.vertices[node.vertexIds[2]]; // setFromCoplanarPointsToPlane const normal = _vector1.subVectors(c, b).cross(_vector2.subVectors(a, b)).normalize(); _plane.setFromNormalAndCoplanarPoint(normal, a); if (Math.abs(_plane.distanceToPoint(position)) < 0.01) { const poly = [a, b, c]; if (isPointInPoly(poly, position)) { return i; } } } const measuredDistance = node.centroid.distanceToSquared(position); if (measuredDistance < distance) { closestNodeGroup = i; distance = measuredDistance; } } } return closestNodeGroup; } } export { Zone }; const _vector1 = new Vector3(); const _vector2 = new Vector3(); const _plane = new Plane(); function _buildPolygonsFromTriangleSoup(triangleSoup) { const polygons = []; const vertices = []; const { positions, indices } = triangleSoup; // Constructing the neighbor graph brute force is O(n²). To avoid that, // create a map from vertices to the polygons that contain them, and use it // while connecting polygons. This reduces complexity to O(n*m), where 'm' // is related to connectivity of the mesh. /** Array of polygon objects by vertex index. */ const vertexPolygonMap = []; for (let i = 0, l = positions.length; i < l; i += 3) { const vertex = new Vector3(); vertex.fromArray(positions, i); vertices.push(vertex); vertexPolygonMap[i / 3] = []; } // Convert the faces into a custom format that supports more than 3 vertices for (let i = 0, l = indices.length; i < l; i += 3) { _vector1.fromArray(indices, i); const a = _vector1.x; const b = _vector1.y; const c = _vector1.z; const poly = { vertexIds: [a, b, c], neighbours: null }; polygons.push(poly); vertexPolygonMap[a].push(poly); vertexPolygonMap[b].push(poly); vertexPolygonMap[c].push(poly); } // Build a list of adjacent polygons polygons.forEach(polygon => { polygon.neighbours = _buildPolygonNeighbours(polygon, vertexPolygonMap); }); return { polygons: polygons, vertices: vertices }; } function _buildPolygonNeighbours(polygon, vertexPolygonMap) { const neighbours = new Set(); const groupA = vertexPolygonMap[polygon.vertexIds[0]]; const groupB = vertexPolygonMap[polygon.vertexIds[1]]; const groupC = vertexPolygonMap[polygon.vertexIds[2]]; // It's only necessary to iterate groups A and B. Polygons contained only // in group C cannot share a >1 vertex with this polygon. // IMPORTANT: Bublé cannot compile for-of loops. groupA.forEach(candidate => { if (candidate === polygon) return; if (groupB.includes(candidate) || groupC.includes(candidate)) { neighbours.add(candidate); } }); groupB.forEach(candidate => { if (candidate === polygon) return; if (groupC.includes(candidate)) { neighbours.add(candidate); } }); return neighbours; } function _buildPolygonGroups(navigationMesh) { const polygons = navigationMesh.polygons; const polygonGroups = []; polygons.forEach(polygon => { if (polygon.group !== undefined) { // this polygon is already part of a group polygonGroups[polygon.group].push(polygon); } else { // we need to make a new group and spread its ID to neighbors polygon.group = polygonGroups.length; _spreadGroupId(polygon); polygonGroups.push([polygon]); } }); return polygonGroups; } function _spreadGroupId(seed) { let nextBatch = new Set([seed]); while (nextBatch.size > 0) { const batch = nextBatch; nextBatch = new Set(); batch.forEach(polygon => { polygon.group = seed.group; polygon.neighbours.forEach(neighbour => { if (neighbour.group === undefined) { nextBatch.add(neighbour); } }); }); } } function _getSharedVerticesInOrder(a, b) { const aList = a.vertexIds; const a0 = aList[0]; const a1 = aList[1]; const a2 = aList[2]; const bList = b.vertexIds; const shared0 = bList.includes(a0); const shared1 = bList.includes(a1); const shared2 = bList.includes(a2); // it seems that we shouldn't have an a and b with <2 shared vertices here unless there's a bug // in the neighbor identification code, or perhaps a malformed input geometry; 3 shared vertices // is a kind of embarrassing but possible geometry we should handle if (shared0 && shared1 && shared2) { return Array.from(aList); } else if (shared0 && shared1) { return [a0, a1]; } else if (shared1 && shared2) { return [a1, a2]; } else if (shared0 && shared2) { return [a2, a0]; // this ordering will affect the string pull algorithm later, not clear if significant } else { console.warn( 'Error processing navigation mesh neighbors; neighbors with <2 shared vertices found.' ); return []; } } function roundNumber(value, decimals) { const factor = Math.pow(10, decimals); return Math.round(value * factor) / factor; } ================================================ FILE: examples/jsm/objects/AxisHelper.js ================================================ import { Attribute, Buffer, Color3, Geometry, LineMaterial, Mesh, VERTEX_COLOR } from 't3d'; class AxisHelper extends Mesh { constructor(size = 1) { const vertices = [ 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size ]; const colors = [ 1, 0, 0, 1, 1, 0.6, 0, 1, 0, 1, 0, 1, 0.6, 1, 0, 1, 0, 0, 1, 1, 0, 0.6, 1, 1 ]; const geometry = new Geometry(); geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); geometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 4))); // Skip update bounding box // Because we may not want to consider the helper's bounding box geometry.computeBoundingSphere(); const material = new LineMaterial(); material.vertexColors = VERTEX_COLOR.RGBA; super(geometry, material); } setColors(xAxisColor, yAxisColor, zAxisColor) { const array = this.geometry.attributes.a_Color.buffer.array; _col_1.setHex(xAxisColor); _col_1.toArray(array, 0); _col_1.toArray(array, 3); _col_1.setHex(yAxisColor); _col_1.toArray(array, 6); _col_1.toArray(array, 9); _col_1.setHex(zAxisColor); _col_1.toArray(array, 12); _col_1.toArray(array, 15); this.geometry.attributes.a_Color.buffer.version++; return this; } dispose() { this.geometry.dispose(); this.material.dispose(); } } AxisHelper.prototype.isAxisHelper = true; const _col_1 = new Color3(); export { AxisHelper }; ================================================ FILE: examples/jsm/objects/Background.js ================================================ import { Quaternion, Euler, PlaneGeometry, Mesh, ShaderMaterial } from 't3d'; import { GeometryUtils } from '../geometries/GeometryUtils.js'; class Background extends Mesh { constructor(texture = null, layout = BACKGROUND_LAYOUT.Fill, screenAspect = 1, textureAspect = 1) { const geometry = new PlaneGeometry(2, 2); GeometryUtils.applyMatrix4(geometry, _mat4, true); const material = new ShaderMaterial(BackgroundShader); super(geometry, material); this.frustumCulled = false; this.material.diffuseMap = texture; this._layout = layout; this._screenAspect = screenAspect; this._textureAspect = textureAspect; this._update(); } get gamma() { return this.material.defines.GAMMA; } set gamma(value) { this.material.defines.GAMMA = value; this.material.needsUpdate = true; } get texture() { return this.material.diffuseMap; } set texture(value) { if (value.isTexture2D) { this.material.diffuseMap = value; this.material.needsUpdate = true; } else { console.error('Background: texture must be a Texture2D'); } } set layout(type) { this._layout = type; this._update(); } get layout() { return this._layout; } set textureAspect(aspect) { this._textureAspect = aspect; this._update(); } get textureAspect() { return this._textureAspect; } set screenAspect(aspect) { this._screenAspect = aspect; this._update(); } get screenAspect() { return this._screenAspect; } _fill() { this.material.diffuseMapTransform.setUvTransform(0, 0, 1, 1, 0, 0, 0); } _contain() { const textureAspect = this._textureAspect, screenAspect = this._screenAspect; let repeatX, repeatY, offsetX, offsetY; if (textureAspect > screenAspect) { repeatX = 1; repeatY = textureAspect / screenAspect; offsetX = 0; offsetY = (1 - repeatY) / 2; } else { repeatX = screenAspect / textureAspect; repeatY = 1; offsetX = (1 - repeatX) / 2; offsetY = 0; } this.material.diffuseMapTransform.setUvTransform(offsetX, offsetY, repeatX, repeatY, 0, 0, 0); } _cover() { const textureAspect = this._textureAspect, screenAspect = this._screenAspect; let repeatX, repeatY, offsetX, offsetY; if (textureAspect > screenAspect) { repeatX = screenAspect / textureAspect; repeatY = 1; offsetX = (1 - repeatX) / 2; offsetY = 0; } else { repeatX = 1; repeatY = textureAspect / screenAspect; offsetX = 0; offsetY = (1 - repeatY) / 2; } this.material.diffuseMapTransform.setUvTransform(offsetX, offsetY, repeatX, repeatY, 0, 0, 0); } _update() { if (!this.texture) return; switch (this._layout) { case BACKGROUND_LAYOUT.Fill: this._fill(); break; case BACKGROUND_LAYOUT.Contain: this._contain(); break; case BACKGROUND_LAYOUT.Cover: this._cover(); break; } } } Background.prototype.isBackground = true; const _mat4 = new Quaternion().setFromEuler(new Euler(Math.PI / 2, 0, 0)).toMatrix4(); const BACKGROUND_LAYOUT = { Fill: 'fill', Contain: 'contain', Cover: 'cover' }; const BackgroundShader = { name: 'background', defines: { 'GAMMA': false }, uniforms: {}, vertexShader: ` attribute vec2 a_Uv; attribute vec3 a_Position; uniform mat3 uvTransform; varying vec2 v_Uv; void main() { v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy; gl_Position = vec4(a_Position.xy, 1.0, 1.0); } `, fragmentShader: ` uniform sampler2D diffuseMap; varying vec2 v_Uv; void main() { gl_FragColor = mapTexelToLinear(texture2D(diffuseMap, v_Uv)); #ifdef GAMMA #include #endif }` }; export { Background, BACKGROUND_LAYOUT, BackgroundShader }; ================================================ FILE: examples/jsm/objects/BatchedMesh.js ================================================ import { Mesh, Geometry, Attribute, Buffer, Box3, Sphere, Matrix4, Texture2D, PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_FILTER, Frustum, Vector3, Color4, MathUtils } from 't3d'; /** * A special version of a mesh with multi draw batch rendering support. Use * this class if you have to render a large number of objects with the same * material but with different geometries or world transformations. The usage of * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall * rendering performance in your application. * reference: https://github.com/mrdoob/three.js/blob/dev/examples/jsm/objects/BatchedMesh.js * @extends Mesh */ class BatchedMesh extends Mesh { /** * Constructs a new batched mesh. * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered. * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries. * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries. * @param {Material} material - The mesh material. */ constructor(maxInstanceCount, maxVertexCount, maxIndexCount, material) { super(new Geometry(), [material]); /** * When set to `true`, the individual objects of a batch are frustum culled. * @type {boolean} * @default true */ this.perObjectFrustumCulled = true; /** * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts. * If the material is marked as "transparent" objects are rendered back to front and if not then they are * rendered front to back. * @type {boolean} * @default true */ this.sortObjects = true; /** * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}. * @type {Box3} * @default Box3() */ this.boundingBox = new Box3(); /** * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}. * @type {Sphere} * @default Sphere() */ this.boundingSphere = new Sphere(); /** * Takes a sort a function that is run before render. The function takes a list of instances to * sort and a camera. The objects in the list include a "z" field to perform a depth-ordered * sort with. * @type {Function|null} * @default null */ this.customSort = null; // stores visible, active, and geometry id per instance and reserved buffer ranges for geometries this._instanceInfo = []; this._geometryInfo = []; // instance, geometry ids that have been set as inactive, and are available to be overwritten this._availableInstanceIds = []; this._availableGeometryIds = []; // used to track where the next point is that geometry should be inserted this._nextIndexStart = 0; this._nextVertexStart = 0; // flags this._visibilityChanged = true; this._geometryInitialized = false; // cached user options this._maxInstanceCount = maxInstanceCount; this._maxVertexCount = maxVertexCount; this._maxIndexCount = maxIndexCount; // init geometry this.geometry.groups = [{ multiDrawStarts: new Int32Array(maxInstanceCount), multiDrawCounts: new Int32Array(maxInstanceCount), multiDrawCount: 0, materialIndex: 0 }]; // init material material.uniforms.batchingTexture = new BatchingTexture(maxInstanceCount); material.uniforms.batchingIdTexture = new BatchingIdTexture(maxInstanceCount); } /** * The maximum number of individual instances that can be stored in the batch. * @type {number} * @readonly */ get maxInstanceCount() { return this._maxInstanceCount; } /** * The instance count. * @type {number} * @readonly */ get instanceCount() { return this._instanceInfo.length - this._availableInstanceIds.length; } /** * The number of unused vertices. * @type {number} * @readonly */ get unusedVertexCount() { return this._maxVertexCount - this._nextVertexStart; } /** * The number of unused indices. * @type {number} * @readonly */ get unusedIndexCount() { return this._maxIndexCount - this._nextIndexStart; } /** * Adds the given geometry to the batch and returns the associated * geometry id referring to it to be used in other functions. * @param {Geometry} geometry - The geometry to add. * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of * vertex buffer space to reserve for the added geometry. This is necessary if it is planned * to set a new geometry at this index at a later time that is larger than the original geometry. * Defaults to the length of the given geometry vertex buffer. * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index * buffer space to reserve for the added geometry. This is necessary if it is planned to set a * new geometry at this index at a later time that is larger than the original geometry. Defaults to * the length of the given geometry index buffer. * @returns {number} The geometry ID, or -1 on failure. */ addGeometry(geometry, reservedVertexCount = -1, reservedIndexCount = -1) { this._initializeGeometry(geometry); if (!this._validateGeometry(geometry)) { return -1; } reservedVertexCount = reservedVertexCount === -1 ? geometry.attributes.a_Position.buffer.count : reservedVertexCount; reservedIndexCount = reservedIndexCount === -1 ? (geometry.index ? geometry.index.buffer.count : 0) : reservedIndexCount; // validate space if (this._nextVertexStart + reservedVertexCount > this._maxVertexCount || this._nextIndexStart + reservedIndexCount > this._maxIndexCount) { console.error('BatchedMesh: Reserved space request exceeds the maximum buffer size.'); return -1; } const hasIndex = !!this.geometry.index; // setup geometry info const geometryInfo = { vertexStart: this._nextVertexStart, vertexCount: geometry.attributes.a_Position.buffer.count, reservedVertexCount: reservedVertexCount, indexStart: hasIndex ? this._nextIndexStart : -1, indexCount: hasIndex ? geometry.index.buffer.count : -1, reservedIndexCount: reservedIndexCount, drawStart: -1, drawCount: -1, boundingBox: new Box3(), boundingSphere: new Sphere(), active: true }; let geometryId; if (this._availableGeometryIds.length > 0) { // this._availableGeometryIds.sort(ascIdSort); geometryId = this._availableGeometryIds.shift(); this._geometryInfo[geometryId] = geometryInfo; } else { geometryId = this._geometryInfo.length; this._geometryInfo.push(geometryInfo); } this._copyGeometryData(geometry, geometryId); // update offsets this._nextVertexStart += reservedVertexCount; this._nextIndexStart += reservedIndexCount; return geometryId; } /** * Deletes the geometry defined by the given ID from this batch. Any instances referencing * this geometry will also be removed as a side effect. * @param {number} geometryId - The ID of the geomtry to remove from the batch. * @returns {BatchedMesh} A reference to this batched mesh. */ deleteGeometry(geometryId) { if (!this._validateGeometryId(geometryId)) { return this; } this._geometryInfo[geometryId].active = false; for (let i = 0; i < this._instanceInfo.length; i++) { const instanceInfo = this._instanceInfo[i]; if (instanceInfo && instanceInfo.geometryId === geometryId) { this.deleteInstance(i); } } this._availableGeometryIds.push(geometryId); this._visibilityChanged = true; return this; } /** * Replaces the geometry at the given ID with the provided geometry. Throws an error if there * is not enough space reserved for geometry. Calling this will change all instances that are * rendering that geometry. * @param {number} geometryId - The ID of the geomtry that should be replaced with the given geometry. * @param {Geometry} geometry - The new geometry. * @returns {number} The geometry ID, or -1 on failure. */ setGeometryAt(geometryId, geometry) { if (!this._geometryInfo[geometryId]) { console.error('BatchedMesh: Maximum geometry count reached.'); return -1; } if (!this._validateGeometry(geometry)) { return -1; } const batchGeometry = this.geometry; const hasIndex = !!batchGeometry.index; const srcIndex = geometry.index; const geometryInfo = this._geometryInfo[geometryId]; const srcVertexCount = geometry.attributes.a_Position.buffer.count; const srcIndexCount = hasIndex ? srcIndex.buffer.count : -1; if ( hasIndex && srcIndexCount > geometryInfo.reservedIndexCount || srcVertexCount > geometryInfo.reservedVertexCount ) { console.error('BatchedMesh: Reserved space not large enough for provided geometry.'); return -1; } // update geometry info geometryInfo.vertexCount = srcVertexCount; geometryInfo.indexCount = srcIndexCount; this._copyGeometryData(geometry, geometryId); this._visibilityChanged = true; return geometryId; } /** * Get the range representing the subset of triangles related to the attached geometry, * indicating the starting offset and count, or `null` if invalid. * @param {number} geometryId - The id of the geometry to get the range of. * @param {object} [target] - The target object that is used to store the method's result. * @returns {{ * vertexStart:number,vertexCount:number,reservedVertexCount:number, * indexStart:number,indexCount:number,reservedIndexCount:number, * drawStart:number,drawCount:number * }|null} The result object with range data. */ getGeometryRangeAt(geometryId, target = {}) { if (!this._validateGeometryId(geometryId)) { return null; } const geometryInfo = this._geometryInfo[geometryId]; target.vertexStart = geometryInfo.vertexStart; target.vertexCount = geometryInfo.vertexCount; target.reservedVertexCount = geometryInfo.reservedVertexCount; target.indexStart = geometryInfo.indexStart; target.indexCount = geometryInfo.indexCount; target.reservedIndexCount = geometryInfo.reservedIndexCount; target.drawStart = geometryInfo.drawStart; target.drawCount = geometryInfo.drawCount; return target; } /** * Adds a new instance to the batch using the geometry of the given ID and returns * a new id referring to the new instance to be used by other functions. * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}. * @returns {number} The instance ID, or -1 on failure. */ addInstance(geometryId) { if (!this._validateGeometryId(geometryId)) { return -1; } const availableInstanceIds = this._availableInstanceIds; // If instance count exceeds max instance count, return error if ((this._instanceInfo.length >= this._maxInstanceCount) && availableInstanceIds.length === 0) { console.error('BatchedMesh: Maximum item count reached.'); return -1; } const instanceInfo = { geometryId: geometryId, visible: true, active: true }; let instanceId; if (availableInstanceIds.length > 0) { // availableInstanceIds.sort(ascIdSort); instanceId = availableInstanceIds.shift(); this._instanceInfo[instanceId] = instanceInfo; } else { instanceId = this._instanceInfo.length; this._instanceInfo.push(instanceInfo); } const batchingTexture = this.material[0].uniforms.batchingTexture; batchingTexture.setInstanceData(instanceId, _mat4_1.identity()); const batchingColorTexture = this.material[0].uniforms.batchingColorTexture; if (batchingColorTexture) { batchingColorTexture.setInstanceData(instanceId, _whiteColor); } this._visibilityChanged = true; return instanceId; } /** * Deletes an existing instance from the batch using the given ID. * @param {number} instanceId - The ID of the instance to remove from the batch. * @returns {BatchedMesh} A reference to this batched mesh. */ deleteInstance(instanceId) { if (!this._validateInstanceId(instanceId)) { return this; } this._instanceInfo[instanceId].active = false; this._availableInstanceIds.push(instanceId); this._visibilityChanged = true; return this; } /** * Sets the given local transformation matrix to the defined instance. * Negatively scaled matrices are not supported. * @param {number} instanceId - The ID of an instance to set the matrix of. * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance. * @returns {BatchedMesh} A reference to this batched mesh. */ setMatrixAt(instanceId, matrix) { if (!this._validateInstanceId(instanceId)) { return this; } const batchingTexture = this.material[0].uniforms.batchingTexture; batchingTexture.setInstanceData(instanceId, matrix); return this; } /** * Returns the local transformation matrix of the defined instance. * @param {number} instanceId - The ID of an instance to get the matrix of. * @param {Matrix4} matrix - The target object that is used to store the method's result. * @returns {Matrix4|null} The instance's local transformation matrix. */ getMatrixAt(instanceId, matrix) { if (!this._validateInstanceId(instanceId)) { return null; } const batchingTexture = this.material[0].uniforms.batchingTexture; batchingTexture.getInstanceData(instanceId, matrix); return matrix; } /** * Sets the given color to the defined instance. * @param {number} instanceId - The ID of an instance to set the color of. * @param {Color3|Color4} color - The color to set the instance to. * @returns {BatchedMesh} A reference to this batched mesh. */ setColorAt(instanceId, color) { if (!this._validateInstanceId(instanceId)) { return this; } let batchingColorTexture = this.material[0].uniforms.batchingColorTexture; if (!batchingColorTexture) { batchingColorTexture = new BatchingColorTexture(this._maxInstanceCount); this.material[0].uniforms.batchingColorTexture = batchingColorTexture; this.material[0].defines.USE_BATCHING_COLOR = true; this.material[0].needsUpdate = true; } batchingColorTexture.setInstanceData(instanceId, color); return this; } /** * Returns the color of the defined instance. * @param {number} instanceId - The ID of an instance to get the color of. * @param {Color3|Color4} color - The target object that is used to store the method's result. * @returns {Color3|Color4|null} The instance's color. */ getColorAt(instanceId, color) { if (!this._validateInstanceId(instanceId)) { return null; } const batchingColorTexture = this.material[0].uniforms.batchingColorTexture; if (!batchingColorTexture) { return null; } batchingColorTexture.getInstanceData(instanceId, color); return color; } /** * Sets the visibility of the instance. * @param {number} instanceId - The id of the instance to set the visibility of. * @param {boolean} visible - Whether the instance is visible or not. * @returns {BatchedMesh} A reference to this batched mesh. */ setVisibleAt(instanceId, visible) { if (!this._validateInstanceId(instanceId)) { return this; } const instanceInfo = this._instanceInfo[instanceId]; if (instanceInfo.visible === visible) { return this; } instanceInfo.visible = visible; this._visibilityChanged = true; return this; } /** * Returns the visibility state of the defined instance. * @param {number} instanceId - The ID of an instance to get the visibility state of. * @returns {boolean} Whether the instance is visible or not. */ getVisibleAt(instanceId) { if (!this._validateInstanceId(instanceId)) { return false; } return this._instanceInfo[instanceId].visible; } /** * Sets the geometry ID of the instance at the given index. * @param {number} instanceId - The ID of the instance to set the geometry ID of. * @param {number} geometryId - The geometry ID to be use by the instance. * @returns {BatchedMesh} A reference to this batched mesh. */ setGeometryIdAt(instanceId, geometryId) { if (!this._validateInstanceId(instanceId)) { return this; } if (!this._validateGeometryId(geometryId)) { return this; } this._instanceInfo[instanceId].geometryId = geometryId; return this; } /** * Returns the geometry ID of the defined instance. * @param {number} instanceId - The ID of an instance to get the geometry ID of. * @returns {number} The instance's geometry ID, or -1 if invalid. */ getGeometryIdAt(instanceId) { if (!this._validateInstanceId(instanceId)) { return -1; } return this._instanceInfo[instanceId].geometryId; } /** * Returns the bounding box of the instance at the given index. * @param {number} instanceId - The ID of the instance to return the bounding box for. * @param {Box3} target - The target object that is used to store the method's result. * @returns {Box3|null} The instance's bounding box. Returns `null` if no geometry has been found for the given ID. */ getBoundingBoxAt(instanceId, target) { if (!this._validateInstanceId(instanceId)) { return null; } const geometryId = this._instanceInfo[instanceId].geometryId; if (!this._validateGeometryId(geometryId)) { return null; } const geometryInfo = this._geometryInfo[geometryId]; const batchingTexture = this.material[0].uniforms.batchingTexture; batchingTexture.getInstanceData(instanceId, _mat4_1); return target.copy(geometryInfo.boundingBox).applyMatrix4(_mat4_1); } /** * Returns the bounding sphere of the instance at the given index. * @param {number} instanceId - The ID of the instance to return the bounding sphere for. * @param {Sphere} target - The target object that is used to store the method's result. * @returns {Sphere|null} The instance's bounding sphere. Returns `null` if no geometry has been found for the given ID. */ getBoundingSphereAt(instanceId, target) { if (!this._validateInstanceId(instanceId)) { return null; } const geometryId = this._instanceInfo[instanceId].geometryId; if (!this._validateGeometryId(geometryId)) { return null; } const geometryInfo = this._geometryInfo[geometryId]; const batchingTexture = this.material[0].uniforms.batchingTexture; batchingTexture.getInstanceData(instanceId, _mat4_1); return target.copy(geometryInfo.boundingSphere).applyMatrix4(_mat4_1); } /** * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes. * If the provided arguments shrink the geometry buffers but there is not enough unused space at the * end of the geometry attributes then an error is thrown. * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to. * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to. */ setGeometrySize(maxVertexCount, maxIndexCount) { if (maxVertexCount < this._nextVertexStart || maxIndexCount < this._nextIndexStart) { console.error('BatchedMesh: New size is too small for existing geometry.'); return; } // dispose of the previous geometry const oldGeometry = this.geometry; oldGeometry.dispose(); // recreate the geometry needed based on the previous variant this._maxVertexCount = maxVertexCount; this._maxIndexCount = maxIndexCount; if (this._geometryInitialized) { this._geometryInitialized = false; this.geometry = new Geometry(); this.geometry.groups = oldGeometry.groups; this._initializeGeometry(oldGeometry); } // copy data from the previous geometry const geometry = this.geometry; if (oldGeometry.index) { copyArrayContents(oldGeometry.index.buffer.array, geometry.index.buffer.array); } for (const name in oldGeometry.attributes) { copyArrayContents(oldGeometry.attributes[name].buffer.array, geometry.attributes[name].buffer.array); } } /** * Resizes the necessary buffers to support the provided number of instances. * If the provided arguments shrink the number of instances but there are not enough * unused Ids at the end of the list then an error is thrown. * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch. */ setInstanceCount(maxInstanceCount) { if (maxInstanceCount === this._maxInstanceCount) { return; } // shrink the available instances as much as possible const availableInstanceIds = this._availableInstanceIds; const instanceInfo = this._instanceInfo; availableInstanceIds.sort(ascIdSort); while (availableInstanceIds[availableInstanceIds.length - 1] === instanceInfo.length) { instanceInfo.pop(); availableInstanceIds.pop(); } if (maxInstanceCount < instanceInfo.length) { console.error(`BatchedMesh: Instance ids outside the range ${maxInstanceCount} are being used. Cannot shrink instance count.`); return; } // copy the multi draw counts const multiDrawCounts = new Int32Array(maxInstanceCount); const multiDrawStarts = new Int32Array(maxInstanceCount); const geometryGroup = this.geometry.groups[0]; copyArrayContents(geometryGroup.multiDrawCounts, multiDrawCounts); copyArrayContents(geometryGroup.multiDrawStarts, multiDrawStarts); geometryGroup.multiDrawCounts = multiDrawCounts; geometryGroup.multiDrawStarts = multiDrawStarts; this._maxInstanceCount = maxInstanceCount; const batchingTexture = this.material[0].uniforms.batchingTexture; const batchingData = batchingTexture.image.data; batchingTexture.setInstanceCount(maxInstanceCount); copyArrayContents(batchingData, batchingTexture.image.data); batchingTexture.version++; const batchingIdTexture = this.material[0].uniforms.batchingIdTexture; const batchingIdData = batchingIdTexture.image.data; batchingIdTexture.setInstanceCount(maxInstanceCount); copyArrayContents(batchingIdData, batchingIdTexture.image.data); batchingIdTexture.version++; const batchingColorTexture = this.material[0].uniforms.batchingColorTexture; if (batchingColorTexture) { const batchingColorData = batchingColorTexture.image.data; batchingColorTexture.setInstanceCount(maxInstanceCount); copyArrayContents(batchingColorData, batchingColorTexture.image.data); batchingColorTexture.version++; } } /** * Disposes of the batched mesh and its associated resources. */ dispose() { this.geometry.dispose(); const material = this.material[0]; material.uniforms.batchingTexture.dispose(); material.uniforms.batchingIdTexture.dispose(); if (material.uniforms.batchingColorTexture) { material.uniforms.batchingColorTexture.dispose(); } } /** * Updates the batch for rendering * Performs visibility checks, frustum culling, and sorting if enabled * @param {Camera} camera - Camera used for frustum culling and sorting */ update(camera) { const sortObjects = this.sortObjects; const perObjectFrustumCulled = this.perObjectFrustumCulled; const visibleChanged = this._visibilityChanged; // if visibility has not changed and frustum culling and object sorting is not required // then skip iterating over all items if (!visibleChanged && !sortObjects && !perObjectFrustumCulled) { return; } const geometry = this.geometry; const material = this.material[0]; const index = geometry.index; const bytesPerElement = index === null ? 1 : index.buffer.array.BYTES_PER_ELEMENT; const instanceInfo = this._instanceInfo; const geometryInfo = this._geometryInfo; const batchingIdTexture = material.uniforms.batchingIdTexture; const indirectData = batchingIdTexture.image.data; // prepare the frustum in the local frame if (perObjectFrustumCulled) { _mat4_1.multiplyMatrices(camera.projectionMatrix, camera.viewMatrix).multiply(this.worldMatrix); _frustum.setFromMatrix(_mat4_1); } let multiDrawCount = 0; const { multiDrawStarts, multiDrawCounts } = geometry.groups[0]; if (sortObjects) { // get the camera position in the local frame _mat4_1.copy(this.worldMatrix).invert(); _vec3_1.setFromMatrixPosition(camera.worldMatrix).applyMatrix4(_mat4_1); _vec3_2.set(0, 0, -1).transformDirection(camera.worldMatrix).transformDirection(_mat4_1); for (let i = 0, l = instanceInfo.length; i < l; i++) { if (!instanceInfo[i].active || !instanceInfo[i].visible) continue; this.getBoundingSphereAt(i, _sphere_1); // determine whether the batched geometry is within the frustum let culled = false; if (perObjectFrustumCulled) { culled = !_frustum.intersectsSphere(_sphere_1); } if (!culled) { // get the distance from camera used for sorting const z = _vec3_3.subVectors(_sphere_1.center, _vec3_1).dot(_vec3_2); const { drawStart, drawCount } = geometryInfo[instanceInfo[i].geometryId]; _renderList.push(drawStart, drawCount, z, i); } } // sort the draw ranges and prep for rendering const list = _renderList.list; const customSort = this.customSort; if (customSort) { customSort.call(this, list, camera); } else { list.sort(material.transparent ? sortTransparent : sortOpaque); } for (let i = 0; i < list.length; i++) { const item = list[i]; multiDrawStarts[multiDrawCount] = item.start * bytesPerElement; multiDrawCounts[multiDrawCount] = item.count; indirectData[multiDrawCount] = item.index; multiDrawCount++; } _renderList.reset(); } else { for (let i = 0, l = instanceInfo.length; i < l; i++) { if (!instanceInfo[i].active || !instanceInfo[i].visible) continue; let culled = false; if (perObjectFrustumCulled) { this.getBoundingSphereAt(i, _sphere_1); culled = !_frustum.intersectsSphere(_sphere_1); } if (!culled) { const { drawStart, drawCount } = geometryInfo[instanceInfo[i].geometryId]; multiDrawStarts[multiDrawCount] = drawStart * bytesPerElement; multiDrawCounts[multiDrawCount] = drawCount; indirectData[multiDrawCount] = i; multiDrawCount++; } } } batchingIdTexture.version++; this._visibilityChanged = false; geometry.groups[0].multiDrawCount = multiDrawCount; } /** * Takes a sort a function that is run before render. The function takes a list of instances to * sort and a camera. The objects in the list include a "z" field to perform a depth-ordered sort with. * @param {Function} func - The custom sort function. * @returns {BatchedMesh} A reference to this batched mesh. */ setCustomSort(func) { this.customSort = func; return this; } /** * Repacks the sub geometries in [name] to remove any unused space remaining from * previously deleted geometry, freeing up space to add new geometry. * @returns {BatchedMesh} A reference to this batched mesh. */ optimize() { // track the next indices to copy data to let nextVertexStart = 0; let nextIndexStart = 0; // Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest // in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order. const geometryInfo = this._geometryInfo; const indices = geometryInfo.map((_, i) => i).sort((a, b) => { return geometryInfo[a].vertexStart - geometryInfo[b].vertexStart; }); const geometry = this.geometry; const hasIndex = !!geometry.index; for (let i = 0; i < this._geometryInfo.length; i++) { const index = indices[i]; const geometryInfo = this._geometryInfo[index]; if (!geometryInfo || !geometryInfo.active) { continue; } // if a geometry contains an index buffer then shift it, as well if (hasIndex) { if (geometryInfo.indexStart !== nextIndexStart) { const { indexStart, vertexStart, reservedIndexCount } = geometryInfo; const array = geometry.index.buffer.array; // shift the index pointers based on how the vertex data will shift // adjusting the index must happen first so the original vertex start value is available const elementDelta = nextVertexStart - vertexStart; for (let j = 0; j < reservedIndexCount; j++) { array[nextIndexStart + j] = array[indexStart + j] + elementDelta; } updateBufferRange(geometry.index.buffer, nextIndexStart, reservedIndexCount); geometryInfo.indexStart = nextIndexStart; } nextIndexStart += geometryInfo.reservedIndexCount; } // if a geometry needs to be moved then copy attribute data to overwrite unused space if (geometryInfo.vertexStart !== nextVertexStart) { const { vertexStart, reservedVertexCount } = geometryInfo; const attributes = geometry.attributes; for (const name in attributes) { const attribute = attributes[name]; const itemSize = attribute.size; const array = attribute.buffer.array; for (let j = 0; j < reservedVertexCount * itemSize; j++) { array[nextVertexStart * itemSize + j] = array[vertexStart * itemSize + j]; } updateBufferRange(attribute.buffer, nextVertexStart * itemSize, reservedVertexCount * itemSize); } geometryInfo.vertexStart = nextVertexStart; } nextVertexStart += geometryInfo.reservedVertexCount; geometryInfo.drawStart = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart; } this._nextVertexStart = nextVertexStart; this._nextIndexStart = nextIndexStart; this._visibilityChanged = true; return this; } /** * Computes the bounding box, updating {@link BatchedMesh#boundingBox}. * Bounding boxes aren't computed by default. They need to be explicitly computed, * otherwise they are empty. */ computeBoundingBox() { const boundingBox = this.boundingBox; const instanceInfo = this._instanceInfo; boundingBox.makeEmpty(); for (let i = 0, l = instanceInfo.length; i < l; i++) { if (!instanceInfo[i].active) continue; this.getBoundingBoxAt(i, _box3_1); boundingBox.union(_box3_1); } } /** * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}. * Bounding spheres aren't computed by default. They need to be explicitly computed, * otherwise they are empty. */ computeBoundingSphere() { const boundingSphere = this.boundingSphere; const instanceInfo = this._instanceInfo; boundingSphere.makeEmpty(); for (let i = 0, l = instanceInfo.length; i < l; i++) { if (!instanceInfo[i].active) continue; this.getBoundingSphereAt(i, _sphere_1); boundingSphere.union(_sphere_1); } } raycast(ray, intersects) { const instanceInfo = this._instanceInfo; const geometryInfoList = this._geometryInfo; const wolrdMatrix = this.worldMatrix; const batchGeometry = this.geometry; // iterate over each instance _mesh.material = this.material; _mesh.geometry.index = batchGeometry.index; _mesh.geometry.attributes = batchGeometry.attributes; for (let i = 0, il = instanceInfo.length; i < il; i++) { if (!instanceInfo[i].active || !instanceInfo[i].visible) continue; const geometryInfo = geometryInfoList[instanceInfo[i].geometryId]; _mesh.geometry.groups[0].start = geometryInfo.drawStart; _mesh.geometry.groups[0].count = geometryInfo.drawCount; this.getMatrixAt(i, _mesh.worldMatrix).premultiply(wolrdMatrix); _mesh.geometry.boundingBox.copy(geometryInfo.boundingBox); _mesh.geometry.boundingSphere.copy(geometryInfo.boundingSphere); _mesh.raycast(ray, _batchIntersects); // add batch id to the intersects for (let j = 0, jl = _batchIntersects.length; j < jl; j++) { const intersect = _batchIntersects[j]; intersect.object = this; intersect.batchId = i; intersects.push(intersect); } _batchIntersects.length = 0; } _mesh.material = null; _mesh.geometry.index = null; _mesh.geometry.attributes = {}; _mesh.geometry.groups[0].start = 0; _mesh.geometry.groups[0].count = Infinity; } // Initializes the geometry based on an input geometry _initializeGeometry(reference) { if (this._geometryInitialized) return; const geometry = this.geometry; const maxVertexCount = this._maxVertexCount; const maxIndexCount = this._maxIndexCount; for (const attributeName in reference.attributes) { const srcAttribute = reference.getAttribute(attributeName); const { size, normalized, buffer } = srcAttribute; const { array } = buffer; const dstArray = new array.constructor(maxVertexCount * size); // splite shared buffer here const dstAttribute = new Attribute(new Buffer(dstArray, size), size, 0, normalized); geometry.addAttribute(attributeName, dstAttribute); } if (reference.index) { const indexArray = maxVertexCount > 65535 ? new Uint32Array(maxIndexCount) : new Uint16Array(maxIndexCount); geometry.index = new Attribute(new Buffer(indexArray, 1)); } this._geometryInitialized = true; } // Make sure the geometry is compatible with the existing combined geometry attributes _validateGeometry(geometry) { const batchGeometry = this.geometry; if (!!batchGeometry.index !== !!geometry.index) { console.error('BatchedMesh: All geometries must consistently have "index"'); return false; } for (const attributeName in batchGeometry.attributes) { if (!geometry.attributes[attributeName]) { console.error(`BatchedMesh: Added geometry missing "${attributeName}". All geometries must have consistent attributes.`); return false; } const srcAttribute = geometry.getAttribute(attributeName); const dstAttribute = batchGeometry.getAttribute(attributeName); if (srcAttribute.size !== dstAttribute.size || srcAttribute.normalized !== dstAttribute.normalized) { console.error('BatchedMesh: All attributes must have a consistent itemSize and normalized value.'); return false; } } return true; } // Copies geometry data from source to the batch _copyGeometryData(geometry, geometryId) { const info = this._geometryInfo[geometryId]; const batchGeometry = this.geometry; const vertexStart = info.vertexStart; const reservedVertexCount = info.reservedVertexCount; const indexStart = info.indexStart; const reservedIndexCount = info.reservedIndexCount; for (const name in geometry.attributes) { const srcAttribute = geometry.attributes[name]; const dstAttribute = batchGeometry.attributes[name]; const itemSize = srcAttribute.size; const vertexCount = srcAttribute.buffer.count; const srcOffset = srcAttribute.offset; const srcStride = srcAttribute.buffer.stride; const dstArray = dstAttribute.buffer.array; const srcArray = srcAttribute.buffer.array; // copy attribute data for (let i = 0; i < vertexCount; i++) { const dstIndex = (vertexStart + i) * itemSize; const srcIndex = i * srcStride + srcOffset; for (let j = 0; j < itemSize; j++) { dstArray[dstIndex + j] = srcArray[srcIndex + j]; } } // fill the rest in with zeroes for (let i = vertexCount; i < reservedVertexCount; i++) { const dstIndex = (vertexStart + i) * itemSize; for (let j = 0; j < itemSize; j++) { dstArray[dstIndex + j] = 0; } } // update buffer's update range updateBufferRange(dstAttribute.buffer, vertexStart * itemSize, reservedVertexCount * itemSize); } if (indexStart !== -1) { const srcIndex = geometry.index; const dstIndex = batchGeometry.index; const indexCount = srcIndex.buffer.count; const srcOffset = srcIndex.offset; const srcStride = srcIndex.buffer.stride; const dstArray = dstIndex.buffer.array; const srcArray = srcIndex.buffer.array; // copy index data for (let i = 0; i < indexCount; i++) { const sourceIndex = i * srcStride + srcOffset; dstArray[indexStart + i] = srcArray[sourceIndex] + vertexStart; } // fill the rest in with zeroes for (let i = indexCount; i < reservedIndexCount; i++) { dstArray[indexStart + i] = vertexStart; } // update buffer's update range updateBufferRange(dstIndex.buffer, indexStart, reservedIndexCount); } info.drawStart = indexStart !== -1 ? indexStart : vertexStart; info.drawCount = indexStart !== -1 ? info.indexCount : info.vertexCount; // copy bounding volumes info.boundingBox.copy(geometry.boundingBox); info.boundingSphere.copy(geometry.boundingSphere); } // Validates the geometry defined by the given ID _validateGeometryId(geometryId) { const geometryInfo = this._geometryInfo[geometryId]; if (!geometryInfo || !geometryInfo.active) { console.error(`BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.`); return false; } return true; } // Validates the instance defined by the given ID _validateInstanceId(instanceId) { const instanceInfo = this._instanceInfo[instanceId]; if (!instanceInfo || !instanceInfo.active) { console.error(`BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.`); return false; } return true; } } const _vec3_1 = new Vector3(); const _vec3_2 = new Vector3(); const _vec3_3 = new Vector3(); const _mat4_1 = new Matrix4(); const _box3_1 = new Box3(); const _sphere_1 = new Sphere(); const _frustum = new Frustum(); const _whiteColor = new Color4(1, 1, 1, 1); const _mesh = new Mesh(new Geometry(), undefined); _mesh.geometry.addGroup(0, 0, 0); const _batchIntersects = []; class MultiDrawRenderList { constructor() { this.index = 0; this.pool = []; this.list = []; } push(start, count, z, index) { const pool = this.pool; const list = this.list; if (this.index >= pool.length) { pool.push({ start: -1, count: -1, z: -1, index: -1 }); } const item = pool[this.index]; list.push(item); this.index++; item.start = start; item.count = count; item.z = z; item.index = index; } reset() { this.list.length = 0; this.index = 0; } } const _renderList = new MultiDrawRenderList(); // Sort function to arrange IDs in ascending order function ascIdSort(a, b) { return a - b; } // Sort function for opaque objects (front-to-back) function sortOpaque(a, b) { return a.z - b.z; } // Sort function for transparent objects (back-to-front) function sortTransparent(a, b) { return b.z - a.z; } function updateBufferRange(buffer, offset, count) { const updateRange = buffer.updateRange; if (updateRange.count === -1) { updateRange.offset = offset; updateRange.count = count; return; } const start = updateRange.offset; const end = start + updateRange.count; updateRange.offset = Math.min(start, offset); updateRange.count = Math.max(end, offset + count) - updateRange.offset; buffer.version++; } // safely copies array contents to a potentially smaller array function copyArrayContents(src, target) { if (src.constructor !== target.constructor) { // if arrays are of a different type (eg due to index size increasing) then data must be per-element copied const len = Math.min(src.length, target.length); for (let i = 0; i < len; i++) { target[i] = src[i]; } } else { const len = Math.min(src.length, target.length); target.set(new src.constructor(src.buffer, 0, len)); } } class BatchingTexture extends Texture2D { constructor(maxInstanceCount) { super(); this.format = PIXEL_FORMAT.RGBA; this.type = PIXEL_TYPE.FLOAT; this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; this.setInstanceCount(maxInstanceCount); } setInstanceCount(maxInstanceCount) { let size = MathUtils.nextPowerOfTwoSquareSize(maxInstanceCount * 4); // 4 pixels needed for 1 matrix size = Math.max(size, 4); this.image = { data: new Float32Array(size * size * 4), width: size, height: size }; } setInstanceData(instanceId, matrix) { matrix.toArray(this.image.data, instanceId * 16); this.version++; } getInstanceData(instanceId, matrix) { matrix.fromArray(this.image.data, instanceId * 16); } } class BatchingIdTexture extends Texture2D { constructor(maxInstanceCount) { super(); this.format = PIXEL_FORMAT.RED_INTEGER; this.internalformat = 'R32UI'; this.type = PIXEL_TYPE.UNSIGNED_INT; this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; this.setInstanceCount(maxInstanceCount); } setInstanceCount(maxInstanceCount) { let size = MathUtils.nextPowerOfTwoSquareSize(maxInstanceCount); size = Math.max(size, 4); this.image = { data: new Uint32Array(size * size), width: size, height: size }; } } class BatchingColorTexture extends Texture2D { constructor(maxInstanceCount) { super(); this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; this.setInstanceCount(maxInstanceCount); } setInstanceCount(maxInstanceCount) { let size = MathUtils.nextPowerOfTwoSquareSize(maxInstanceCount); size = Math.max(size, 4); this.image = { data: new Uint8Array(size * size * 4).fill(255), width: size, height: size }; } setInstanceData(instanceId, color) { color.toArray(this.image.data, instanceId * 4, true); this.version++; } getInstanceData(instanceId, color) { color.fromArray(this.image.data, instanceId * 4, true); } } export { BatchedMesh }; ================================================ FILE: examples/jsm/objects/Box3Helper.js ================================================ import { Attribute, Buffer, Geometry, LineMaterial, Mesh } from 't3d'; class Box3Helper extends Mesh { constructor(box, color = 0xffff00) { const indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]); const positions = [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1]; const geometry = new Geometry(); geometry.setIndex(new Attribute(new Buffer(indices, 1))); geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3))); // Skip update bounding box // Because we may not want to consider Box3Helper's bounding box geometry.computeBoundingSphere(); const material = new LineMaterial(); material.diffuse.setHex(color); super(geometry, material); this.box = box; } updateMatrix(force) { const box = this.box; box.getCenter(this.position); if (box.isEmpty()) { this.scale.multiplyScalar(0); } else { box.getSize(this.scale); this.scale.multiplyScalar(0.5); } super.updateMatrix(force); } } Box3Helper.prototype.isBox3Helper = true; export { Box3Helper }; ================================================ FILE: examples/jsm/objects/BoxHelper.js ================================================ import { Attribute, Buffer, Geometry, LineMaterial, Mesh, Box3 } from 't3d'; import { SceneUtils } from '../SceneUtils.js'; class BoxHelper extends Mesh { constructor(object, color = 0xffff00) { const indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]); const positions = new Float32Array(8 * 3); const geometry = new Geometry(); geometry.setIndex(new Attribute(new Buffer(indices, 1))); geometry.addAttribute('a_Position', new Attribute(new Buffer(positions, 3))); const material = new LineMaterial(); material.diffuse.setHex(color); super(geometry, material); this.object = object; this.worldMatrix = this.object.worldMatrix; this.update(); } update(object) { if (object !== undefined) { console.warn('BoxHelper: .update() has no longer arguments.'); } if (this.object !== undefined) { SceneUtils.setBox3FromObject(this.object, this.object, _box3_1); } if (_box3_1.isEmpty()) return; const min = _box3_1.min; const max = _box3_1.max; const position = this.geometry.attributes.a_Position.buffer; const array = position.array; array[0] = max.x; array[1] = max.y; array[2] = max.z; array[3] = min.x; array[4] = max.y; array[5] = max.z; array[6] = min.x; array[7] = min.y; array[8] = max.z; array[9] = max.x; array[10] = min.y; array[11] = max.z; array[12] = max.x; array[13] = max.y; array[14] = min.z; array[15] = min.x; array[16] = max.y; array[17] = min.z; array[18] = min.x; array[19] = min.y; array[20] = min.z; array[21] = max.x; array[22] = min.y; array[23] = min.z; position.version++; // Skip update bounding box // Because we may not want to consider BoxHelper's bounding box this.geometry.computeBoundingSphere(); } setFromObject(object) { this.object = object; this.worldMatrix = this.object.worldMatrix; this.update(); return this; } updateMatrix(force) { // Remove matrix updating // Need decompose worldMatrix to matrix and RST ? const children = this.children; for (let i = 0, l = children.length; i < l; i++) { children[i].updateMatrix(force); } } copy(source, recursive) { super.copy(source, recursive); this.object = source.object; return this; } } BoxHelper.prototype.isBoxHelper = true; const _box3_1 = new Box3(); export { BoxHelper }; ================================================ FILE: examples/jsm/objects/CameraHelper.js ================================================ import { Attribute, Buffer, Geometry, LineMaterial, Mesh, Color3, Matrix4, Vector3, VERTEX_COLOR } from 't3d'; class CameraHelper extends Mesh { constructor(camera) { const geometry = new Geometry(); const material = new LineMaterial(); material.vertexColors = VERTEX_COLOR.RGB; const vertices = []; const colors = []; const pointsMap = {}; const colorFrustum = new Color3(0xffaa00); const colorCone = new Color3(0xff0000); const colorUp = new Color3(0x00aaff); const colorTarget = new Color3(0xffffff); const colorCross = new Color3(0x333333); // near addLine('n1', 'n2', colorFrustum); addLine('n2', 'n4', colorFrustum); addLine('n4', 'n3', colorFrustum); addLine('n3', 'n1', colorFrustum); // far addLine('f1', 'f2', colorFrustum); addLine('f2', 'f4', colorFrustum); addLine('f4', 'f3', colorFrustum); addLine('f3', 'f1', colorFrustum); // sides addLine('n1', 'f1', colorFrustum); addLine('n2', 'f2', colorFrustum); addLine('n3', 'f3', colorFrustum); addLine('n4', 'f4', colorFrustum); // cone addLine('p', 'n1', colorCone); addLine('p', 'n2', colorCone); addLine('p', 'n3', colorCone); addLine('p', 'n4', colorCone); // up addLine('u1', 'u2', colorUp); addLine('u2', 'u3', colorUp); addLine('u3', 'u1', colorUp); // target addLine('c', 't', colorTarget); addLine('p', 'c', colorTarget); // cross addLine('cn1', 'cn2', colorCross); addLine('cn3', 'cn4', colorCross); addLine('cf1', 'cf2', colorCross); addLine('cf3', 'cf4', colorCross); function addLine(a, b, color) { addPoint(a, color); addPoint(b, color); } function addPoint(id, color) { if (pointsMap[id] === undefined) { pointsMap[id] = []; } pointsMap[id].push(vertices.length); vertices.push(0, 0, 0); colors.push(color.r, color.g, color.b); } geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); geometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 3))); super(geometry, material); this.camera = camera; this.pointsMap = pointsMap; this.update(); } update() { const geometry = this.geometry; _mat4.copy(this.camera.projectionMatrixInverse); const positionBuffer = this.geometry.attributes.a_Position.buffer; const w = 1, h = 1; // center / target this._setPoint('c', positionBuffer, _mat4, 0, 0, -1); this._setPoint('t', positionBuffer, _mat4, 0, 0, 1); // near this._setPoint('n1', positionBuffer, _mat4, -w, -h, -1); this._setPoint('n2', positionBuffer, _mat4, w, -h, -1); this._setPoint('n3', positionBuffer, _mat4, -w, h, -1); this._setPoint('n4', positionBuffer, _mat4, w, h, -1); // far this._setPoint('f1', positionBuffer, _mat4, -w, -h, 1); this._setPoint('f2', positionBuffer, _mat4, w, -h, 1); this._setPoint('f3', positionBuffer, _mat4, -w, h, 1); this._setPoint('f4', positionBuffer, _mat4, w, h, 1); // up this._setPoint('u1', positionBuffer, _mat4, w * 0.7, h * 1.1, -1); this._setPoint('u2', positionBuffer, _mat4, -w * 0.7, h * 1.1, -1); this._setPoint('u3', positionBuffer, _mat4, 0, h * 2, -1); // cross this._setPoint('cf1', positionBuffer, _mat4, -w, 0, 1); this._setPoint('cf2', positionBuffer, _mat4, w, 0, 1); this._setPoint('cf3', positionBuffer, _mat4, 0, -h, 1); this._setPoint('cf4', positionBuffer, _mat4, 0, h, 1); this._setPoint('cn1', positionBuffer, _mat4, -w, 0, -1); this._setPoint('cn2', positionBuffer, _mat4, w, 0, -1); this._setPoint('cn3', positionBuffer, _mat4, 0, -h, -1); this._setPoint('cn4', positionBuffer, _mat4, 0, h, -1); positionBuffer.version++; geometry.computeBoundingBox(); geometry.computeBoundingSphere(); } _setPoint(point, position, projectionMatrixInverse, x, y, z) { _vec3.set(x, y, z).applyMatrix4(projectionMatrixInverse); const points = this.pointsMap[point]; if (points !== undefined) { const array = position.array; for (let i = 0, l = points.length; i < l; i++) { const index = points[i]; array[index] = _vec3.x; array[index + 1] = _vec3.y; array[index + 2] = _vec3.z; } } } } CameraHelper.prototype.isCameraHelper = true; const _vec3 = new Vector3(); const _mat4 = new Matrix4(); export { CameraHelper }; ================================================ FILE: examples/jsm/objects/DirectionalLightHelper.js ================================================ import { Attribute, Buffer, DRAW_MODE, Geometry, LineMaterial, Mesh, Object3D } from 't3d'; class DirectionalLightHelper extends Object3D { constructor(light, size = 1, color) { super(); this.light = light; this.color = color; const planeGeometry = new Geometry(); planeGeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([ -size, size, 0, size, size, 0, size, -size, 0, -size, -size, 0, -size, size, 0 ]), 3))); planeGeometry.computeBoundingBox(); planeGeometry.computeBoundingSphere(); const planeMaterial = new LineMaterial(); planeMaterial.drawMode = DRAW_MODE.LINE_LOOP; this.lightPlane = new Mesh(planeGeometry, planeMaterial); this.add(this.lightPlane); const lineGeometry = new Geometry(); lineGeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([ 0, 0, 0, 0, 0, -1 ]), 3))); lineGeometry.computeBoundingBox(); lineGeometry.computeBoundingSphere(); const lineMaterial = new LineMaterial(); lineMaterial.drawMode = DRAW_MODE.LINE_LOOP; this.targetLine = new Mesh(lineGeometry, lineMaterial); this.targetLine.scale.z = size * 5; this.add(this.targetLine); this.update(); } update() { if (this.color !== undefined) { this.lightPlane.material.diffuse.setHex(this.color); this.targetLine.material.diffuse.setHex(this.color); } else { this.lightPlane.material.diffuse.copy(this.light.color); this.targetLine.material.diffuse.copy(this.light.color); } } } export { DirectionalLightHelper }; ================================================ FILE: examples/jsm/objects/GradientSky.js ================================================ import { BoxGeometry, DRAW_SIDE, Mesh, ShaderMaterial } from 't3d'; class GradientSky extends Mesh { constructor() { const geometry = new BoxGeometry(1, 1, 1); const material = new ShaderMaterial(GradientSky.GradientSkyShader); material.side = DRAW_SIDE.BACK; super(geometry, material); this.frustumCulled = false; } } GradientSky.GradientSkyShader = { name: 'gradient_sky', defines: {}, uniforms: { topColor: [93 / 255, 163 / 255, 254 / 255], middleColor: [181 / 255, 222 / 255, 247 / 255], bottomColor: [208 / 255, 189 / 255, 93 / 255], diffusion: 1.0 }, vertexShader: ` #include varying vec3 vDir; mat4 clearMat4Translate(mat4 m) { mat4 outMatrix = m; outMatrix[3].xyz = vec3(0., 0., 0.); return outMatrix; } void main() { mat4 modelMatrix = clearMat4Translate(u_Model); mat4 viewMatrix = clearMat4Translate(u_View); vDir = normalize((modelMatrix * vec4(a_Position, 0.0)).xyz); gl_Position = u_Projection * viewMatrix * modelMatrix * vec4(a_Position, 1.0); gl_Position.z = gl_Position.w; } `, fragmentShader: ` #include uniform vec3 topColor; uniform vec3 bottomColor; uniform vec3 middleColor; uniform float diffusion; varying vec3 vDir; void main() { vec3 viewDir = normalize(vDir); vec3 mixColor = step(0.0, viewDir.y) * topColor + step(viewDir.y, 0.0) * bottomColor; vec3 color = mix(mixColor, middleColor, 1.0 - abs(viewDir.y) * diffusion); gl_FragColor = vec4(color, 1.0); } ` }; export { GradientSky }; ================================================ FILE: examples/jsm/objects/GridHelper.js ================================================ import { Attribute, Buffer, Color3, Geometry, LineMaterial, Mesh, VERTEX_COLOR } from 't3d'; class GridHelper extends Mesh { constructor(size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888) { color1 = new Color3(color1); color2 = new Color3(color2); const center = divisions / 2; const step = size / divisions; const halfSize = size / 2; const vertices = [], colors = []; for (let i = 0, j = 0, k = -halfSize; i <= divisions; i++, k += step) { vertices.push(-halfSize, 0, k, halfSize, 0, k); vertices.push(k, 0, -halfSize, k, 0, halfSize); const color = i === center ? color1 : color2; color.toArray(colors, j); colors[j + 3] = 1; j += 4; color.toArray(colors, j); colors[j + 3] = 1; j += 4; color.toArray(colors, j); colors[j + 3] = 1; j += 4; color.toArray(colors, j); colors[j + 3] = 1; j += 4; } const geometry = new Geometry(); geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); geometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 4))); // Skip update bounding box // Because we may not want to consider the helper's bounding box geometry.computeBoundingSphere(); const material = new LineMaterial(); material.vertexColors = VERTEX_COLOR.RGBA; super(geometry, material); } } export { GridHelper }; ================================================ FILE: examples/jsm/objects/HemisphereLightHelper.js ================================================ import { LineMaterial, Mesh, SphereGeometry, VERTEX_COLOR, Attribute, Buffer, Color3 } from 't3d'; const _color3_1 = new Color3(); class HemisphereLightHelper extends Mesh { constructor(light, sphereSize, color) { const geometry = new SphereGeometry(sphereSize, 4, 2); const positions = geometry.getAttribute('a_Position'); const colorArray = new Float32Array(positions.buffer.array.length); for (let i = 0, l = colorArray.length; i < l; i++) { colorArray[i] = 1; } const colors = new Attribute(new Buffer(colorArray, 3)); geometry.addAttribute('a_Color', colors); const material = new LineMaterial(); material.vertexColors = VERTEX_COLOR.RGB; super(geometry, material); this.light = light; this.color = color; this.update(); } update() { if (this.color !== undefined) { this.material.diffuse.setHex(this.color); } else { _color3_1.lerpColors(this.light.color, this.light.groundColor, 0.5); const colors = this.geometry.getAttribute('a_Color'); const array = colors.buffer.array; for (let i = 0, l = array.length; i < l; i += 3) { if (i < 5 * 3) { this.light.color.toArray(array, i); } else if (i < 10 * 3) { _color3_1.toArray(array, i); } else { this.light.groundColor.toArray(array, i); } } colors.buffer.version++; } } } export { HemisphereLightHelper }; ================================================ FILE: examples/jsm/objects/InstancedLine.js ================================================ /** * InstancedLine */ import { Mesh, Geometry, Vector3, Attribute, Buffer, ShaderMaterial } from 't3d'; export class InstancedLine extends Mesh { constructor() { const geometry = new InstancedLineGeometry(); const material = new InstancedLineMaterial(); super(geometry, material); } raycast() { } } InstancedLine.prototype.isInstancedLine = true; const positions = [ -1, 1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ]; const uvs = [ 0, 1, 1, 1, 0, 0, 1, 0 ]; const index = [ 0, 2, 1, 2, 3, 1 ]; const _vec3_1 = new Vector3(); const _vec3_2 = new Vector3(); function setBox3FromBuffer(box, buffer) { let minX = +Infinity; let minY = +Infinity; let minZ = +Infinity; let maxX = -Infinity; let maxY = -Infinity; let maxZ = -Infinity; for (let i = 0, l = buffer.count + 2; i < l; i++) { const x = buffer.array[i * buffer.stride + 0]; const y = buffer.array[i * buffer.stride + 1]; const z = buffer.array[i * buffer.stride + 2]; if (x < minX) minX = x; if (y < minY) minY = y; if (z < minZ) minZ = z; if (x > maxX) maxX = x; if (y > maxY) maxY = y; if (z > maxZ) maxZ = z; } box.min.set(minX, minY, minZ); box.max.set(maxX, maxY, maxZ); return box; } export class InstancedLineGeometry extends Geometry { constructor() { super(); this.setIndex(new Attribute(new Buffer(new Uint16Array(index), 1))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); } setFromPoints(points, breakIndices) { // Convert to flat array and add start/end point // 0 0---1---2---3---4 4 const useBreak = breakIndices && breakIndices.length > 0; const bufferArray = []; const length = points.length; const isVectorArray = points[0] && (points[0].x !== undefined); let dist = 0, breakIndex = 0; points.forEach((p, i) => { const point = isVectorArray ? p : _vec3_1.fromArray(p); if (i > 0) { const prevPoint = isVectorArray ? points[i - 1] : _vec3_2.fromArray(points[i - 1]); dist += point.distanceTo(prevPoint); } if (useBreak) { let breakState = 0; if (breakIndices[breakIndex] === i) { // next segments start breakState = 1; breakIndex++; dist = 0; } else if (breakIndices[breakIndex] === (i + 1)) { // current segments end breakState = 1; } bufferArray.push(point.x, point.y, point.z, dist, breakState); if (i === 0 || i === length - 1) { bufferArray.push(point.x, point.y, point.z, dist, breakState); } } else { bufferArray.push(point.x, point.y, point.z, dist); if (i === 0 || i === length - 1) { bufferArray.push(point.x, point.y, point.z, dist); } } }); // Convert to instance buffer // prev2---prev1---next1---next2 const stride = useBreak ? 5 : 4; const instanceBuffer = new Buffer(new Float32Array(bufferArray), stride, 1); instanceBuffer.count = Math.max(0, instanceBuffer.count - 3); // fix count let attribute; attribute = new Attribute(instanceBuffer, 3, stride * 0); attribute.divisor = 1; this.addAttribute('instancePrev2', attribute); attribute = new Attribute(instanceBuffer, 3, stride * 1); attribute.divisor = 1; this.addAttribute('instancePrev1', attribute); attribute = new Attribute(instanceBuffer, 3, stride * 2); attribute.divisor = 1; this.addAttribute('instanceNext1', attribute); attribute = new Attribute(instanceBuffer, 3, stride * 3); attribute.divisor = 1; this.addAttribute('instanceNext2', attribute); attribute = new Attribute(instanceBuffer, 1, stride * 1 + 3); attribute.divisor = 1; this.addAttribute('instancePrevDist', attribute); attribute = new Attribute(instanceBuffer, 1, stride * 2 + 3); attribute.divisor = 1; this.addAttribute('instanceNextDist', attribute); if (useBreak) { attribute = new Attribute(instanceBuffer, 1, stride * 1 + 4); attribute.divisor = 1; this.addAttribute('instancePrevBreak', attribute); attribute = new Attribute(instanceBuffer, 1, stride * 2 + 4); attribute.divisor = 1; this.addAttribute('instanceNextBreak', attribute); } this.version++; this.instanceCount = instanceBuffer.count; this.computeBoundingBox(); this.computeBoundingSphere(); return this; } computeBoundingBox() { const instancePrev1 = this.attributes.instancePrev1; if (instancePrev1 !== undefined && instancePrev1.buffer.count > 0) { setBox3FromBuffer(this.boundingBox, instancePrev1.buffer); } else { this.boundingBox.makeEmpty(); } } computeBoundingSphere() { this.computeBoundingBox(); const instancePrev1 = this.attributes.instancePrev1; if (instancePrev1 !== undefined && instancePrev1.buffer.count > 0) { const center = this.boundingSphere.center; this.boundingBox.getCenter(center); let maxRadiusSq = 0; for (let i = 0, il = instancePrev1.buffer.count + 2; i < il; i++) { _vec3_1.fromArray(instancePrev1.buffer.array, i * instancePrev1.buffer.stride); maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vec3_1)); } this.boundingSphere.radius = Math.sqrt(maxRadiusSq); if (isNaN(this.boundingSphere.radius)) { console.error('InstancedLineGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this); } } else { this.boundingSphere.makeEmpty(); } } } const instancedLineShader = { name: 'instanced_line', defines: { LINE_BREAK: false, DISABLE_CORNER_BROKEN: false, FLAT_W: false, SWAP_UV: false, SIMPLE_UV: false, SCREEN_UV: false // TODO }, uniforms: { lineWidth: 5, cornerThreshold: 0.4 }, vertexShader: ` #include #include #ifdef USE_FOG varying float vDepth; #endif attribute vec2 a_Uv; #ifdef USE_DIFFUSE_MAP varying vec2 v_Uv; uniform mat3 uvTransform; #endif #include attribute vec3 instancePrev2; attribute vec3 instancePrev1; attribute vec3 instanceNext1; attribute vec3 instanceNext2; attribute float instancePrevDist; attribute float instanceNextDist; #ifdef LINE_BREAK attribute float instancePrevBreak; attribute float instanceNextBreak; varying float vDiscard; #endif uniform float lineWidth; uniform vec2 u_RenderTargetSize; uniform float cornerThreshold; void trimSegment(const in vec4 start, inout vec4 end) { // trim end segment so it terminates between the camera plane and the near plane // conservative estimate of the near plane float a = u_Projection[2][2]; // 3nd entry in 3th column float b = u_Projection[3][2]; // 3nd entry in 4th column float nearEstimate = -0.5 * b / a; float alpha = (nearEstimate - start.z) / (end.z - start.z); end.xyz = mix(start.xyz, end.xyz, alpha); } void main() { vec3 position = a_Position; mat4 modelViewMatrix = u_View * u_Model; float aspect = u_RenderTargetSize.x / u_RenderTargetSize.y; float flagY = position.y * 0.5 + 0.5; // camera space vec4 prev = modelViewMatrix * vec4(mix(instancePrev2, instancePrev1, flagY), 1.0); vec4 curr = modelViewMatrix * vec4(mix(instancePrev1, instanceNext1, flagY), 1.0); vec4 next = modelViewMatrix * vec4(mix(instanceNext1, instanceNext2, flagY), 1.0); #ifdef LINE_BREAK vDiscard = instancePrevBreak * instanceNextBreak; if (position.y > 0.0 && instanceNextBreak > 0.5) { next = curr; } else if (position.y < 0.0 && instancePrevBreak > 0.5) { prev = curr; } #endif // special case for perspective projection, and segments that terminate either in, or behind, the camera plane bool perspective = (u_Projection[2][3] == -1.0); // 4th entry in the 3rd column if (perspective) { if (position.y < 0.) { if (curr.z < 0.0 && next.z >= 0.0) { trimSegment(curr, next); } else if (next.z < 0.0 && curr.z >= 0.0) { trimSegment(next, curr); } if (prev.z < 0.0 && curr.z >= 0.0) { trimSegment(prev, curr); } else if (curr.z < 0.0 && prev.z >= 0.0) { trimSegment(curr, prev); } } else { if (prev.z < 0.0 && curr.z >= 0.0) { trimSegment(prev, curr); } else if (curr.z < 0.0 && prev.z >= 0.0) { trimSegment(curr, prev); } if (curr.z < 0.0 && next.z >= 0.0) { trimSegment(curr, next); } else if (next.z < 0.0 && curr.z >= 0.0) { trimSegment(next, curr); } } } // clip space vec4 clipPrev = u_Projection * prev; vec4 clipCurr = u_Projection * curr; vec4 clipNext = u_Projection * next; // ndc space vec2 ndcPrev = clipPrev.xy / clipPrev.w; vec2 ndcCurr = clipCurr.xy / clipCurr.w; vec2 ndcNext = clipNext.xy / clipNext.w; // direction vec2 dir, dir1, dir2; float w = 1.0; if (prev == curr || ndcPrev == ndcCurr) { dir = ndcNext - ndcCurr; dir.x *= aspect; dir = normalize(dir); } else if(curr == next || ndcCurr == ndcNext) { dir = ndcCurr - ndcPrev; dir.x *= aspect; dir = normalize(dir); } else { dir1 = ndcCurr - ndcPrev; dir1.x *= aspect; dir2 = ndcNext - ndcCurr; dir2.x *= aspect; dir1 = normalize(dir1); dir2 = normalize(dir2); dir = normalize(dir1 + dir2); w = dot(dir1, dir); #ifdef DISABLE_CORNER_BROKEN w = 1.0 / max(w, cornerThreshold); #else float flagT = step(w, cornerThreshold); w = 1.0 / mix(w, 1.0, flagT); dir = mix(dir, mix(dir2, dir1, flagY), flagT); #endif } // perpendicular to dir vec2 offset = vec2(dir.y, -dir.x); // undo aspect ratio adjustment offset.x /= aspect; // sign flip offset *= float(sign(position.x)); // adjust for lineWidth offset *= lineWidth * w; // adjust for clip-space to screen-space conversion // maybe this should be based on viewport ... offset /= u_RenderTargetSize.y; // select end vec4 clip = clipCurr; // back to clip space offset *= clip.w; clip.xy += offset; gl_Position = clip; #ifdef USE_FOG vDepth = -curr.z; #endif #ifdef USE_LOGDEPTHBUF #ifdef USE_LOGDEPTHBUF_EXT vFragDepth = 1.0 + gl_Position.w - logDepthCameraNear; // vIsPerspective = float( isPerspectiveMatrix( u_Projection ) ); vIsPerspective = isPerspectiveMatrix( u_Projection ) ? 1.0 : 0.0; #else if ( isPerspectiveMatrix( u_Projection ) ) { gl_Position.z = log2( max( EPSILON, gl_Position.w - logDepthCameraNear + 1.0 ) ) * logDepthBufFC - 1.0; gl_Position.z *= gl_Position.w; } #endif #endif #ifdef FLAT_W if (gl_Position.w > -1.0) { gl_Position.xyz /= gl_Position.w; gl_Position.w = 1.0; } #endif // uv // TODO trim uv vec2 tUv = vec2(0.0, 0.0); #ifdef SIMPLE_UV tUv = a_Uv; #else #ifdef SCREEN_UV tUv = a_Uv; #else tUv.x = a_Uv.x; tUv.y = mix(instancePrevDist, instanceNextDist, flagY); #endif #endif #ifdef SWAP_UV tUv = tUv.yx; #endif #ifdef USE_DIFFUSE_MAP v_Uv = (uvTransform * vec3(tUv, 1.)).xy; #endif #ifdef USE_ALPHA_MAP vAlphaMapUV = (alphaMapUVTransform * vec3(tUv, 1.)).xy; #endif } `, fragmentShader: ` #include #ifdef USE_DIFFUSE_MAP varying vec2 v_Uv; uniform sampler2D diffuseMap; #endif #include #ifdef USE_FOG varying float vDepth; #endif #include #include #ifdef LINE_BREAK varying float vDiscard; #endif void main() { #ifdef LINE_BREAK if (vDiscard > 0.5) { discard; } #endif vec4 outColor = vec4(u_Color, u_Opacity); #ifdef USE_DIFFUSE_MAP outColor *= texture2D(diffuseMap, v_Uv); #endif #ifdef USE_ALPHA_MAP outColor.a *= texture2D(alphaMap, vAlphaMapUV).g; #endif gl_FragColor = outColor; #ifdef USE_FOG float depth = vDepth; #ifdef USE_EXP2_FOG float fogFactor = whiteCompliment( exp2( - u_FogDensity * u_FogDensity * depth * depth * LOG2 ) ); #else float fogFactor = smoothstep( u_FogNear, u_FogFar, depth ); #endif gl_FragColor.rgb = mix( gl_FragColor.rgb, u_FogColor, fogFactor ); #endif #include } ` }; export class InstancedLineMaterial extends ShaderMaterial { constructor() { super(instancedLineShader); } } ================================================ FILE: examples/jsm/objects/LayeredVolumeMesh.js ================================================ import { PlaneGeometry, Attribute, Buffer, Mesh, ShaderMaterial, DRAW_SIDE } from 't3d'; class LayeredVolumeMesh extends Mesh { constructor(options = {}) { const layer = options.layer || 10; const layers = []; for (let i = 0; i < layer; i++) { layers.push(i / (layer - 1)); } const geometry = new PlaneGeometry(); geometry.instanceCount = layer; const volumeLayerAttribute = new Attribute(new Buffer(new Float32Array(layers), 1)); volumeLayerAttribute.divisor = 1; geometry.addAttribute('a_VolumeLayer', volumeLayerAttribute); const material = new ShaderMaterial(LayeredVolumeShader); material.transparent = true; material.depthTest = false; material.side = DRAW_SIDE.DOUBLE; material.uniforms.densityTexture = options.densityTexture || null; material.uniforms.platteTexture = options.platteTexture || null; material.uniforms.volumeDepth = options.depth || 1; material.uniforms.diskSize = options.diskSize || 0.018; material.uniforms.diskSpacing = options.diskSpacing || 0.002; super(geometry, material); this.scale.set(options.width || 1, 1, options.height || 1); this.frustumCulled = false; } } const LayeredVolumeShader = { name: 'layered_volume', defines: { 'LAYER_RANDOM': 0.01 }, uniforms: { densityTexture: null, platteTexture: null, volumeDepth: 1, diskSize: 0.018, diskSpacing: 0.002 }, vertexShader: ` #include attribute vec2 a_Uv; attribute float a_VolumeLayer; uniform float volumeDepth; varying vec2 v_Uv; varying float v_VolumeLayer; void main() { vec3 position = a_Position.xyz; position.y = volumeDepth * a_VolumeLayer; gl_Position = u_ProjectionView * u_Model * vec4(position, 1.0); v_Uv = a_Uv; v_VolumeLayer = a_VolumeLayer; } `, fragmentShader: ` precision highp sampler3D; uniform sampler3D densityTexture; uniform sampler2D platteTexture; uniform float u_Opacity; uniform float diskSize; uniform float diskSpacing; varying vec2 v_Uv; varying float v_VolumeLayer; void main() { vec2 uv = v_Uv; #ifdef LAYER_RANDOM uv += sin(v_VolumeLayer * 43758.5453123) * vec2(LAYER_RANDOM); #endif float gridSize = diskSize + diskSpacing; vec2 diskCenter = (floor(uv / gridSize) + 0.5) * gridSize; float diskMask = 1.0 - step(diskSize * 0.5, length(uv - diskCenter)); float intensity = texture(densityTexture, vec3(diskCenter, 1. - v_VolumeLayer)).r; vec4 color = texture2D(platteTexture, vec2(intensity, 0.5)); float finalOpacity = intensity * u_Opacity * diskMask; gl_FragColor = vec4(color.rgb , finalOpacity); } ` }; export { LayeredVolumeMesh, LayeredVolumeShader }; ================================================ FILE: examples/jsm/objects/LegacySkeletonHelper.js ================================================ import { Attribute, Buffer, Color3, Geometry, LineMaterial, Matrix4, Mesh, VERTEX_COLOR, Vector3 } from 't3d'; class SkeletonHelper extends Mesh { constructor(object) { const bones = getBoneList(object); const geometry = new Geometry(); const vertices = []; const colors = []; const color1 = new Color3(0, 0, 1); const color2 = new Color3(0, 1, 0); for (let i = 0; i < bones.length; i++) { const bone = bones[i]; if (bone.parent && bone.parent.isBone) { vertices.push(0, 0, 0); vertices.push(0, 0, 0); colors.push(color1.r, color1.g, color1.b, 1); colors.push(color2.r, color2.g, color2.b, 1); } } geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); geometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 4))); const material = new LineMaterial(); material.vertexColors = VERTEX_COLOR.RGBA; material.depthTest = false; material.depthWrite = false; material.transparent = true; super(geometry, material); this.frustumCulled = false; this.root = object; this.bones = bones; } updateMatrix(force) { const bones = this.bones; const geometry = this.geometry; const position = geometry.getAttribute('a_Position'); worldMatrixInv.copy(this.root.worldMatrix).invert(); for (let i = 0, j = 0; i < bones.length; i++) { const bone = bones[i]; if (bone.parent && bone.parent.isBone) { boneMatrix.multiplyMatrices(worldMatrixInv, bone.worldMatrix); vector.setFromMatrixPosition(boneMatrix); position.buffer.array[j * position.size + 0] = vector.x; position.buffer.array[j * position.size + 1] = vector.y; position.buffer.array[j * position.size + 2] = vector.z; boneMatrix.multiplyMatrices(worldMatrixInv, bone.parent.worldMatrix); vector.setFromMatrixPosition(boneMatrix); position.buffer.array[(j + 1) * position.size + 0] = vector.x; position.buffer.array[(j + 1) * position.size + 1] = vector.y; position.buffer.array[(j + 1) * position.size + 2] = vector.z; j += 2; } } position.buffer.version++; super.updateMatrix(force); } } const vector = new Vector3(); const boneMatrix = new Matrix4(); const worldMatrixInv = new Matrix4(); function getBoneList(object) { const boneList = []; if (object.isBone) { boneList.push(object); } for (let i = 0; i < object.children.length; i++) { boneList.push.apply(boneList, getBoneList(object.children[i])); } return boneList; } export { SkeletonHelper }; ================================================ FILE: examples/jsm/objects/LightShadowAdapterHelper.js ================================================ import { BasicMaterial, Matrix4, Mesh, Object3D, SphereGeometry } from 't3d'; import { Box3Helper } from './Box3Helper.js'; export class LightShadowAdapterHelper extends Object3D { constructor(adapter) { super(); this.adapter = adapter; this.box3HelperContainer = new Object3D(); this.add(this.box3HelperContainer); this.thinBoxHelper = new Box3Helper(adapter.stats.thinShadowBox, 0x00ffff); this.box3HelperContainer.add(this.thinBoxHelper); this.shadowBoxHelper = new Box3Helper(adapter.stats.shadowBox); this.box3HelperContainer.add(this.shadowBoxHelper); this.pointsHelper = new Object3D(); this.add(this.pointsHelper); this.pointGeometry = new SphereGeometry(1, 8, 6); this.pointMaterial = new BasicMaterial(); this.pointMaterial.diffuse.setHex(0xff0000); } updateMatrix(force) { const { adapter, pointsHelper, pointGeometry, pointMaterial } = this; const { type, shadowBox, shadowBoxRotation, boundaryPoints, polygons } = adapter.stats; // shadow box helper this.box3HelperContainer.quaternion.setFromRotationMatrix(_mat4_1.setFromMatrix3(shadowBoxRotation)); // points helper const sizeScalar = shadowBox.max.distanceTo(shadowBox.min) / 500; pointsHelper.children.forEach(point => point.visible = false); if (type === 1) { let pointIndex = 0; polygons.polygons.forEach(polygon => { for (let i = 0; i < polygon.verticesIndex; i++) { let point = pointsHelper.children[pointIndex]; if (!point) { point = new Mesh(pointGeometry, pointMaterial); pointsHelper.add(point); } point.position.copy(polygon.vertices[i]); point.scale.setScalar(sizeScalar); point.visible = true; pointIndex++; } }); } else if (type === 2 || type === 3) { let pointIndex = 0; for (let i = 0; i < boundaryPoints.length; i++) { let point = pointsHelper.children[pointIndex]; if (!point) { point = new Mesh(pointGeometry, pointMaterial); pointsHelper.add(point); } point.position.copy(boundaryPoints[i]); point.scale.setScalar(sizeScalar); point.visible = true; pointIndex++; } } super.updateMatrix(force); } } const _mat4_1 = new Matrix4(); ================================================ FILE: examples/jsm/objects/LineChartFillMesh.js ================================================ import { Attribute, Vector2, Buffer, DRAW_SIDE, Mesh, Geometry, ShaderMaterial, Texture2D, TEXTURE_FILTER, PIXEL_TYPE, Vector3, MathUtils } from 't3d'; import { CurvePath2 } from '../math/curves/CurvePath2.js'; class LineChartFillMesh extends Mesh { constructor() { const geometry = new Geometry(); const material = new ShaderMaterial(LineChartFillShader); material.transparent = true; material.side = DRAW_SIDE.DOUBLE; super(geometry, material); this.curvePath = new CurvePath2(); } /** * @param {Vector3[]} points - Base points(x axis) of this chart in 3D space. * @param {number[]} values - Values of each point in the path, which should be in the range of [0, 1]. * @param {object} [options={}] - Options object. * @param {Vector3[]|Vector3} [options.up=Vector3(0, 1, 0)] - Up direction of each point in the path, or a single up for all points. * @param {number} [options.height=1] - The height of the chart. * @param {number} [options.smooth=0.3] - The smoothness of the lines. */ setPositionAndValue(points, values, options = {}) { this.clear(); const { up = _defaultUp, height = 1, smooth = 0.3 } = options; const xCoords = calculateCumulativeDistances(points, 1 / height); const useUpArray = Array.isArray(up); // Set geometry const geometry = this.geometry; const positions = []; const uvs = []; const indices = []; const pids = []; points.forEach((point, i) => { const upVector = useUpArray ? up[i] : up; const topPoint = _vec3_1.copy(point).addScaledVector(upVector, height); positions.push(point.x, point.y, point.z); positions.push(topPoint.x, topPoint.y, topPoint.z); uvs.push(xCoords[i], 0); uvs.push(xCoords[i], 1); pids.push(i + 1, i + 1); }); for (let i = 0, l = points.length - 1; i < l; i++) { const offset = i * 2; indices.push(offset, offset + 1, offset + 2); indices.push(offset + 2, offset + 1, offset + 3); } const positionBuffer = new Buffer(new Float32Array(positions), 3); const uvBuffer = new Buffer(new Float32Array(uvs), 2); const pidBuffer = new Buffer(new Float32Array(pids), 1); const indexBuffer = new Buffer(new Uint16Array(indices), 1); geometry.addAttribute('a_Position', new Attribute(positionBuffer)); geometry.addAttribute('a_Uv', new Attribute(uvBuffer)); geometry.addAttribute('a_Info', new Attribute(pidBuffer)); geometry.setIndex(new Attribute(indexBuffer)); geometry.computeBoundingBox(); geometry.computeBoundingSphere(); // Set curve path const curvePath = this.curvePath; const curvePts = xCoords.map((xCoord, i) => new Vector2(xCoord, values[i])); curvePath.setSmoothCurves(curvePts, { smooth }); // Set material const infoMap = createCurveTexture(curvePath); this.material.uniforms.infoMap = infoMap; this.material.defines.INFO_TEXTURE_SIZE = infoMap.image.width; } clear() { this.geometry.dispose(); if (this.material.uniforms.infoMap) { this.material.uniforms.infoMap.dispose(); } this.material.dispose(); this.curvePath.curves.length = 0; } } const _defaultUp = new Vector3(0, 1, 0); const _vec3_1 = new Vector3(); const LineChartFillShader = { name: 'line_chart_fill', defines: { INFO_TEXTURE_SIZE: 32, UV_TYPE: 0, EDGE_GAMMA: 0.003 }, uniforms: { infoMap: null }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; attribute float a_Info; varying vec2 v_Uv; varying float v_Info; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); v_Uv = a_Uv; v_Info = a_Info; } `, fragmentShader: ` uniform float u_Opacity; uniform vec3 u_Color; #ifdef USE_DIFFUSE_MAP uniform sampler2D diffuseMap; #endif #ifdef USE_ALPHA_MAP uniform sampler2D alphaMap; #endif uniform sampler2D infoMap; varying vec2 v_Uv; varying float v_Info; vec2 Cubic(float t, vec2 p0, vec2 p1, vec2 p2, vec2 p3) { float k = 1.0 - t; float k2 = k * k; float k3 = k2 * k; float t2 = t * t; float t3 = t2 * t; return k3 * p0 + 3.0 * k2 * t * p1 + 3.0 * k * t2 * p2 + t3 * p3; } vec2 CubicDerivative(float t, vec2 p0, vec2 p1, vec2 p2, vec2 p3) { float k = 1.0 - t; return 3.0 * k * k * (p1 - p0) + 6.0 * k * t * (p2 - p1) + 3.0 * t * t * (p3 - p2); } float findTforCoord(float target, float p0, float p1, float p2, float p3) { float a = -p0 + 3.0 * p1 - 3.0 * p2 + p3; float b = 3.0 * p0 - 6.0 * p1 + 3.0 * p2; float c = -3.0 * p0 + 3.0 * p1; float d = p0 - target; float t = 0.5; for(int i = 0; i < 3; i++) { float ft = ((a * t + b) * t + c) * t + d; // f(t) float ft_prime = (3.0 * a * t + 2.0 * b) * t + c; // f'(t) if(abs(ft_prime) < 1e-6) break; t = t - ft / ft_prime; t = clamp(t, 0.0, 1.0); } return t; } vec4 getCurveInfo(int index) { return texelFetch(infoMap, ivec2((index % INFO_TEXTURE_SIZE), index / INFO_TEXTURE_SIZE), 0); } void main() { int index = int(v_Info); float u = fract(v_Info); vec4 info1 = getCurveInfo(index - 1); vec4 info2 = getCurveInfo(index); vec2 coord = vec2(mix(info1.x, info2.x, u), v_Uv.y); if(coord.y > max(info1.y, info2.y)) { discard; } vec4 outColor = vec4(u_Color, u_Opacity); #ifdef USE_ALPHA_MAP outColor.a *= texture2D(alphaMap, vec2(v_Uv.y, 0.5)).g; #endif #if defined(USE_DIFFUSE_MAP) && UV_TYPE == 0 outColor *= texture2D(diffuseMap, v_Uv.yx); #endif #if !defined(USE_DIFFUSE_MAP) || UV_TYPE == 0 if(coord.y < min(info1.y, info2.y)) { gl_FragColor = outColor; return; } #endif vec2 pos1 = info1.xy; vec2 pos2 = info2.xy; vec4 info0 = getCurveInfo(index - 2); vec2 pos0 = info0.xy; vec2 v11 = info1.zw; vec2 v22 = info2.zw; vec2 p0 = info1.xy; vec2 p3 = info2.xy; float ctrlLength1 = length(pos1 - pos0); float ctrlLength2 = length(pos2 - pos1); vec2 p1 = p0 + (p0 - v11) * ctrlLength2 / ctrlLength1; vec2 p2 = v22; float t = findTforCoord(coord.x, p0.x, p1.x, p2.x, p3.x); vec2 curvePoint = Cubic(t, p0, p1, p2, p3); #if defined(USE_DIFFUSE_MAP) && UV_TYPE == 1 outColor *= texture2D(diffuseMap, vec2(curvePoint.y, 0.5)); #endif float gamma = EDGE_GAMMA * abs(info1.y - info2.y); float fillAlpha = 1.0 - smoothstep(curvePoint.y - gamma, curvePoint.y + gamma, coord.y); if(fillAlpha < 0.001) { discard; } gl_FragColor = vec4(outColor.rgb, outColor.a * fillAlpha); } ` }; function createCurveTexture(curvePath) { const curveData = []; const firstCurve = curvePath.curves[0]; if (firstCurve.isLineCurve2) { curveData.push( curvePath.curves[0].v1.x, curvePath.curves[0].v1.y, curvePath.curves[0].v1.x, curvePath.curves[0].v1.y ); } else { curveData.push( curvePath.curves[0].v0.x, curvePath.curves[0].v0.y, curvePath.curves[0].v0.x, curvePath.curves[0].v0.y ); } curvePath.curves.forEach(curve => { if (curve.isLineCurve2) { curveData.push( curve.v2.x, curve.v2.y, curve.v2.x, curve.v2.y ); } else { curveData.push( curve.v3.x, curve.v3.y, curve.v2.x, curve.v2.y ); } }); const size = MathUtils.nextPowerOfTwoSquareSize(curveData.length / 4); const data = new Float32Array(size * size * 4); data.set(curveData); const texture = new Texture2D(); texture.generateMipmaps = false; texture.magFilter = TEXTURE_FILTER.NEAREST; texture.minFilter = TEXTURE_FILTER.NEAREST; texture.flipY = false; texture.image = { data, width: size, height: size }; texture.type = PIXEL_TYPE.FLOAT; return texture; } function calculateCumulativeDistances(points, scalar = 1) { let totalDist = 0; return points.map((point, i, arr) => { if (i > 0) totalDist += point.distanceTo(arr[i - 1]); return totalDist * scalar; }); } export { LineChartFillMesh }; ================================================ FILE: examples/jsm/objects/OcclusionTester.js ================================================ import { Mesh, Query, QUERY_TYPE } from 't3d'; // deprecated since v0.4.4 // console.warn('OcclusionTester has been deprecated. Use addons/misc/OcclusionProxyManager instead.'); class OcclusionTester extends Mesh { constructor(geometry, material) { super(geometry, material); // Set renderLayer to 1 by default. // This can be changed by user // to make sure the occlusion tester is rendered after other objects. this.renderLayer = 1; this.queryType = QUERY_TYPE.ANY_SAMPLES_PASSED_CONSERVATIVE; this.onOcclusionChange = null; this.$query = new Query(); this.$inProgress = false; this.$occluded = false; } get occluded() { return this.$occluded; } update(renderer) { if (!this.$inProgress) { return; } if (!renderer.isQueryResultAvailable(this.$query)) { return; } this.$inProgress = false; const occluded = !renderer.getQueryResult(this.$query); if (this.$occluded !== occluded) { this.$occluded = occluded; this.onOcclusionChange && this.onOcclusionChange(occluded); } } dispose() { this.$query.dispose(); this.$occluded = false; this.$inProgress = false; } } function OcclusionIfRender(renderable) { return !renderable.object.$inProgress; } function OcclusionBeforeRender(renderable) { const tester = renderable.object; this.beginQuery(tester.$query, tester.queryType); } function OcclusionAfterRender(renderable) { const tester = renderable.object; this.endQuery(tester.$query); tester.$inProgress = true; } export { OcclusionTester, OcclusionIfRender, OcclusionBeforeRender, OcclusionAfterRender }; ================================================ FILE: examples/jsm/objects/OctreeHelper.js ================================================ import { Mesh, Geometry, BasicMaterial, DRAW_MODE, BLEND_TYPE, Attribute, Buffer } from 't3d'; class OctreeHelper extends Mesh { constructor(color = 0x000900) { const geometry = new Geometry(); const material = new BasicMaterial(); material.drawMode = DRAW_MODE.LINES; material.transparent = true; material.blending = BLEND_TYPE.ADD; material.diffuse.setHex(color); material.envMap = undefined; material.fog = false; super(geometry, material); } update(octree, updateBoundings = true) { const vertices = []; const traverse = tree => { for (let i = 0; i < tree.length; i++) { if (tree[i].isEmpty()) continue; const min = tree[i].box.min; const max = tree[i].box.max; vertices.push(max.x, max.y, max.z); vertices.push(min.x, max.y, max.z); // 0, 1 vertices.push(min.x, max.y, max.z); vertices.push(min.x, min.y, max.z); // 1, 2 vertices.push(min.x, min.y, max.z); vertices.push(max.x, min.y, max.z); // 2, 3 vertices.push(max.x, min.y, max.z); vertices.push(max.x, max.y, max.z); // 3, 0 vertices.push(max.x, max.y, min.z); vertices.push(min.x, max.y, min.z); // 4, 5 vertices.push(min.x, max.y, min.z); vertices.push(min.x, min.y, min.z); // 5, 6 vertices.push(min.x, min.y, min.z); vertices.push(max.x, min.y, min.z); // 6, 7 vertices.push(max.x, min.y, min.z); vertices.push(max.x, max.y, min.z); // 7, 4 vertices.push(max.x, max.y, max.z); vertices.push(max.x, max.y, min.z); // 0, 4 vertices.push(min.x, max.y, max.z); vertices.push(min.x, max.y, min.z); // 1, 5 vertices.push(min.x, min.y, max.z); vertices.push(min.x, min.y, min.z); // 2, 6 vertices.push(max.x, min.y, max.z); vertices.push(max.x, min.y, min.z); // 3, 7 traverse(tree[i].subTrees); } }; traverse(octree.subTrees); this.geometry.dispose(); this.geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); if (updateBoundings) { this.geometry.computeBoundingSphere(); this.geometry.computeBoundingBox(); } this.geometry.version++; } } export { OctreeHelper }; ================================================ FILE: examples/jsm/objects/ParticleContainer.js ================================================ import { Attribute, BLEND_TYPE, BUFFER_USAGE, Buffer, Color3, DRAW_MODE, Geometry, Mesh, ShaderMaterial, Vector3 } from 't3d'; /* * A particle container * reference three.js - flimshaw - Charlie Hoey - http://charliehoey.com */ class ParticleContainer extends Mesh { constructor(options = {}) { super(new Geometry(), new ShaderMaterial(ParticleContainer.GPUParticleShader)); this.maxParticleCount = options.maxParticleCount || 10000; this.particleNoiseTex = options.particleNoiseTex || null; this.particleSpriteTex = options.particleSpriteTex || null; const vertices = []; for (let i = 0; i < this.maxParticleCount; i++) { vertices[i * 8 + 0] = 100; // x vertices[i * 8 + 1] = 0; // y vertices[i * 8 + 2] = 0; // z vertices[i * 8 + 3] = 0.0; // startTime vertices[i * 8 + 4] = decodeFloat(128, 128, 0, 0); // vel vertices[i * 8 + 5] = decodeFloat(0, 254, 0, 254); // color vertices[i * 8 + 6] = 1.0; // size vertices[i * 8 + 7] = 0.0; // lifespan } const buffer = new Buffer(new Float32Array(vertices), 8); buffer.usage = BUFFER_USAGE.DYNAMIC_DRAW; let attribute; attribute = new Attribute(buffer, 3, 0); this.geometry.addAttribute('a_Position', attribute); attribute = new Attribute(buffer, 4, 0); this.geometry.addAttribute('particlePositionsStartTime', attribute); attribute = new Attribute(buffer, 4, 4); this.geometry.addAttribute('particleVelColSizeLife', attribute); this.particleCursor = 0; this.material.uniforms['tSprite'] = this.particleSpriteTex; this.material.uniforms['tNoise'] = this.particleNoiseTex; this.material.transparent = true; this.material.blending = BLEND_TYPE.ADD; this.material.depthTest = true; this.material.depthWrite = false; this.material.drawMode = DRAW_MODE.POINTS; this.frustumCulled = false; } update(time) { this.material.uniforms.uTime = time; } spawn(options = {}) { position = options.position !== undefined ? position.copy(options.position) : position.set(0., 0., 0.); velocity = options.velocity !== undefined ? velocity.copy(options.velocity) : velocity.set(0., 0., 0.); positionRandomness = options.positionRandomness !== undefined ? options.positionRandomness : 0.0; velocityRandomness = options.velocityRandomness !== undefined ? options.velocityRandomness : 0.0; color = options.color !== undefined ? color.copy(options.color) : color.setRGB(1, 1, 1); colorRandomness = options.colorRandomness !== undefined ? options.colorRandomness : 1.0; turbulence = options.turbulence !== undefined ? options.turbulence : 1.0; lifetime = options.lifetime !== undefined ? options.lifetime : 5.0; size = options.size !== undefined ? options.size : 10; sizeRandomness = options.sizeRandomness !== undefined ? options.sizeRandomness : 0.0; const cursor = this.particleCursor; const particlePositionsStartTimeAttribute = this.geometry.getAttribute('particlePositionsStartTime'); const buffer = particlePositionsStartTimeAttribute.buffer; const vertices = buffer.array; const vertexSize = buffer.stride; vertices[cursor * vertexSize + 0] = position.x + (Math.random() - 0.5) * positionRandomness; // x vertices[cursor * vertexSize + 1] = position.y + (Math.random() - 0.5) * positionRandomness; // y vertices[cursor * vertexSize + 2] = position.z + (Math.random() - 0.5) * positionRandomness; // z vertices[cursor * vertexSize + 3] = this.material.uniforms.uTime + (Math.random() - 0.5) * 2e-2; // startTime let velX = velocity.x + (Math.random() - 0.5) * velocityRandomness; let velY = velocity.y + (Math.random() - 0.5) * velocityRandomness; let velZ = velocity.z + (Math.random() - 0.5) * velocityRandomness; // convert turbulence rating to something we can pack into a vec4 turbulence = Math.floor(turbulence * 254); // clamp our value to between 0. and 1. velX = Math.floor(maxSource * ((velX - -maxVel) / (maxVel - -maxVel))); velY = Math.floor(maxSource * ((velY - -maxVel) / (maxVel - -maxVel))); velZ = Math.floor(maxSource * ((velZ - -maxVel) / (maxVel - -maxVel))); vertices[cursor * vertexSize + 4] = decodeFloat(velX, velY, velZ, turbulence); // velocity let r = color.r * 254 + (Math.random() - 0.5) * colorRandomness * 254; let g = color.g * 254 + (Math.random() - 0.5) * colorRandomness * 254; let b = color.b * 254 + (Math.random() - 0.5) * colorRandomness * 254; if (r > 254) r = 254; if (r < 0) r = 0; if (g > 254) g = 254; if (g < 0) g = 0; if (b > 254) b = 254; if (b < 0) b = 0; vertices[cursor * vertexSize + 5] = decodeFloat(r, g, b, 254); // color vertices[cursor * vertexSize + 6] = size + (Math.random() - 0.5) * sizeRandomness; // size vertices[cursor * vertexSize + 7] = lifetime; // lifespan this.particleCursor++; if (this.particleCursor >= this.maxParticleCount) { this.particleCursor = 0; buffer.version++; buffer.updateRange.offset = 0; buffer.updateRange.count = -1; } else { buffer.version++; if (buffer.updateRange.count > -1) { buffer.updateRange.count = this.particleCursor * vertexSize - buffer.updateRange.offset; } else { buffer.updateRange.offset = cursor * vertexSize; buffer.updateRange.count = vertexSize; } } } } let position = new Vector3(); let velocity = new Vector3(); let positionRandomness = 0; let velocityRandomness = 0; let color = new Color3(); let colorRandomness = 0; let turbulence = 0; let lifetime = 0; let size = 0; let sizeRandomness = 0; const maxVel = 2; const maxSource = 250; // construct a couple small arrays used for packing variables into floats etc const UINT8_VIEW = new Uint8Array(4); const FLOAT_VIEW = new Float32Array(UINT8_VIEW.buffer); function decodeFloat(x, y, z, w) { UINT8_VIEW[0] = Math.floor(w); UINT8_VIEW[1] = Math.floor(z); UINT8_VIEW[2] = Math.floor(y); UINT8_VIEW[3] = Math.floor(x); return FLOAT_VIEW[0]; } ParticleContainer.GPUParticleShader = { name: 'particle_container', uniforms: { tSprite: null, tNoise: null, uTime: 0, uScale: 1 }, vertexShader: [ 'const vec4 bitSh = vec4(256. * 256. * 256., 256. * 256., 256., 1.);', 'const vec4 bitMsk = vec4(0.,vec3(1./256.0));', 'const vec4 bitShifts = vec4(1.) / bitSh;', '#define FLOAT_MAX 1.70141184e38', '#define FLOAT_MIN 1.17549435e-38', 'lowp vec4 encode_float(highp float v) {', ' highp float av = abs(v);', // Handle special cases ' if(av < FLOAT_MIN) {', ' return vec4(0.0, 0.0, 0.0, 0.0);', ' } else if(v > FLOAT_MAX) {', ' return vec4(127.0, 128.0, 0.0, 0.0) / 255.0;', ' } else if(v < -FLOAT_MAX) {', ' return vec4(255.0, 128.0, 0.0, 0.0) / 255.0;', ' }', ' highp vec4 c = vec4(0,0,0,0);', // Compute exponent and mantissa ' highp float e = floor(log2(av));', ' highp float m = av * pow(2.0, -e) - 1.0;', // Unpack mantissa ' c[1] = floor(128.0 * m);', ' m -= c[1] / 128.0;', ' c[2] = floor(32768.0 * m);', ' m -= c[2] / 32768.0;', ' c[3] = floor(8388608.0 * m);', // Unpack exponent ' highp float ebias = e + 127.0;', ' c[0] = floor(ebias / 2.0);', ' ebias -= c[0] * 2.0;', ' c[1] += floor(ebias) * 128.0;', // Unpack sign bit ' c[0] += 128.0 * step(0.0, -v);', // Scale back to range ' return c / 255.0;', '}', 'vec4 pack(const in float depth)', '{', ' const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);', ' const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);', ' vec4 res = mod(depth*bit_shift*vec4(255), vec4(256))/vec4(255);', ' res -= res.xxyz * bit_mask;', ' return res;', '}', 'float unpack(const in vec4 rgba_depth)', '{', ' const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);', ' float depth = dot(rgba_depth, bit_shift);', ' return depth;', '}', 'uniform float uTime;', 'uniform float uScale;', 'uniform sampler2D tNoise;', 'uniform mat4 u_ProjectionView;', 'uniform mat4 u_Model;', 'attribute vec4 particlePositionsStartTime;', 'attribute vec4 particleVelColSizeLife;', 'varying vec4 vColor;', 'varying float lifeLeft;', 'void main() {', ' // unpack things from our attributes', ' vColor = encode_float( particleVelColSizeLife.y );', ' // convert our velocity back into a value we can use', ' vec4 velTurb = encode_float( particleVelColSizeLife.x );', ' vec3 velocity = vec3( velTurb.xyz );', ' float turbulence = velTurb.w;', ' vec3 newPosition;', ' float timeElapsed = uTime - particlePositionsStartTime.a;', ' lifeLeft = 1. - (timeElapsed / particleVelColSizeLife.w);', ' gl_PointSize = ( uScale * particleVelColSizeLife.z ) * lifeLeft;', ' velocity.x = ( velocity.x - .5 ) * 3.;', ' velocity.y = ( velocity.y - .5 ) * 3.;', ' velocity.z = ( velocity.z - .5 ) * 3.;', ' newPosition = particlePositionsStartTime.xyz + ( velocity * 10. ) * ( uTime - particlePositionsStartTime.a );', ' vec3 noise = texture2D( tNoise, vec2( newPosition.x * .015 + (uTime * .05), newPosition.y * .02 + (uTime * .015) )).rgb;', ' vec3 noiseVel = ( noise.rgb - .5 ) * 30.;', ' newPosition = mix(newPosition, newPosition + vec3(noiseVel * ( turbulence * 5. ) ), (timeElapsed / particleVelColSizeLife.a) );', ' if( velocity.y > 0. && velocity.y < .05 ) {', ' lifeLeft = 0.;', ' }', ' if( velocity.x < -1.45 ) {', ' lifeLeft = 0.;', ' }', ' if( timeElapsed > 0. ) {', ' gl_Position = u_ProjectionView * u_Model * vec4( newPosition, 1.0 );', ' } else {', ' gl_Position = u_ProjectionView * u_Model * vec4( particlePositionsStartTime.xyz, 1.0 );', ' lifeLeft = 0.;', ' gl_PointSize = 0.;', ' }', '}' ].join('\n'), fragmentShader: [ 'float scaleLinear(float value, vec2 valueDomain) {', ' return (value - valueDomain.x) / (valueDomain.y - valueDomain.x);', '}', 'float scaleLinear(float value, vec2 valueDomain, vec2 valueRange) {', ' return mix(valueRange.x, valueRange.y, scaleLinear(value, valueDomain));', '}', 'varying vec4 vColor;', 'varying float lifeLeft;', 'uniform sampler2D tSprite;', 'void main() {', 'float alpha = 0.;', ' if( lifeLeft > .995 ) {', ' alpha = scaleLinear( lifeLeft, vec2(1., .995), vec2(0., 1.));', ' //mix( 0., 1., ( lifeLeft - .95 ) * 100. ) * .75;', ' } else {', ' alpha = lifeLeft * .75;', ' }', ' vec4 tex = texture2D( tSprite, gl_PointCoord );', ' gl_FragColor = vec4( vColor.rgb * tex.a, alpha * tex.a );', '}' ].join('\n') }; export { ParticleContainer }; ================================================ FILE: examples/jsm/objects/PointLightHelper.js ================================================ import { LineMaterial, Mesh, SphereGeometry } from 't3d'; class PointLightHelper extends Mesh { constructor(light, sphereSize, color) { const geometry = new SphereGeometry(sphereSize, 4, 2); const material = new LineMaterial(); super(geometry, material); this.light = light; this.color = color; this.update(); } update() { if (this.color !== undefined) { this.material.diffuse.setHex(this.color); } else { this.material.diffuse.copy(this.light.color); } } } export { PointLightHelper }; ================================================ FILE: examples/jsm/objects/PolarGridHelper.js ================================================ import { Attribute, Buffer, Color3, Geometry, LineMaterial, Mesh, VERTEX_COLOR } from 't3d'; class PolarGridHelper extends Mesh { constructor(radius, sectors, rings, divisions, color1, color2) { radius = radius || 10; sectors = sectors || 16; rings = rings || 8; divisions = divisions || 64; color1 = new Color3(color1 !== undefined ? color1 : 0x444444); color2 = new Color3(color2 !== undefined ? color2 : 0x888888); const vertices = []; const colors = []; // create the sectors if (sectors > 1) { for (let i = 0; i < sectors; i++) { const v = (i / sectors) * (Math.PI * 2); const x = Math.sin(v) * radius; const z = Math.cos(v) * radius; vertices.push(0, 0, 0); vertices.push(x, 0, z); const color = (i & 1) ? color1 : color2; colors.push(color.r, color.g, color.b, 1); colors.push(color.r, color.g, color.b, 1); } } // create the rings for (let i = 0; i < rings; i++) { const color = (i & 1) ? color1 : color2; const r = radius - (radius / rings * i); for (let j = 0; j < divisions; j++) { // first vertex let v = (j / divisions) * (Math.PI * 2); let x = Math.sin(v) * r; let z = Math.cos(v) * r; vertices.push(x, 0, z); colors.push(color.r, color.g, color.b, 1); // second vertex v = ((j + 1) / divisions) * (Math.PI * 2); x = Math.sin(v) * r; z = Math.cos(v) * r; vertices.push(x, 0, z); colors.push(color.r, color.g, color.b, 1); } } const geometry = new Geometry(); geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); geometry.addAttribute('a_Color', new Attribute(new Buffer(new Float32Array(colors), 4))); // Skip update bounding box // Because we may not want to consider the helper's bounding box geometry.computeBoundingSphere(); const material = new LineMaterial(); material.vertexColors = VERTEX_COLOR.RGBA; super(geometry, material); } } PolarGridHelper.prototype.isPolarGridHelper = true; export { PolarGridHelper }; ================================================ FILE: examples/jsm/objects/RectAreaLightHelper.js ================================================ import { Attribute, Buffer, DRAW_MODE, Geometry, BasicMaterial, Mesh, Object3D } from 't3d'; class RectAreaLightHelper extends Object3D { constructor(light, color) { super(); this.light = light; this.color = color; this.width = light.width; this.height = light.height; const planeGeometry = new Geometry(); planeGeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([ -this.width / 2, this.height / 2, 0, this.width / 2, this.height / 2, 0, this.width / 2, -this.height / 2, 0, -this.width / 2, -this.height / 2, 0, -this.width / 2, this.height / 2, 0, this.width / 2, this.height / 2, 0, -this.width / 2, this.height / 2, 0, this.width / 2, -this.height / 2, 0, -this.width / 2, -this.height / 2, 0, this.width / 2, this.height / 2, 0 ]), 3))); planeGeometry.computeBoundingBox(); planeGeometry.computeBoundingSphere(); const lineGeometry = new Geometry(); lineGeometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([ 0, 0, 0, 0, 0, -1 ]), 3))); lineGeometry.computeBoundingBox(); lineGeometry.computeBoundingSphere(); const material = new BasicMaterial(); material.drawMode = DRAW_MODE.LINE_LOOP; this.lightPlane = new Mesh(planeGeometry, material); this.add(this.lightPlane); this.targetLine = new Mesh(lineGeometry, material); this.targetLine.scale.z = (this.height + this.width) / 10; this.add(this.targetLine); this.update(); } update() { if (this.color !== undefined) { this.lightPlane.material.diffuse.setHex(this.color); this.targetLine.material.diffuse.setHex(this.color); } else { this.lightPlane.material.diffuse.copy(this.light.color); this.targetLine.material.diffuse.copy(this.light.color); } } } export { RectAreaLightHelper }; ================================================ FILE: examples/jsm/objects/SkeletonHelper.js ================================================ import { Attribute, Buffer, Geometry, Matrix4, Mesh, Object3D, SphereGeometry, ShaderMaterial, Vector3 } from 't3d'; class SkeletonHelper extends Object3D { constructor(object) { super(); const bones = getBoneList(object); this.root = object; this.bones = bones; this._midStep = 0.25; this.midWidthScale = 0.1; this.ballScale = 0.4; // create bone spheres and connectors const material = new ShaderMaterial(skeletonShader); material.depthTest = false; material.depthWrite = false; this._material = material; this._sphereGeometry = new SphereGeometry(0.25, 16, 12); this._connectorGeometry = new ConnectorGeometry(); this._distanceMap = new WeakMap(); for (let i = 0; i < bones.length; i++) { const bone = bones[i]; if (bone.parent && bone.parent.isBone) { const boneSphere = new Mesh(this._sphereGeometry, this._material); boneSphere.receiveShadows = false; boneSphere.castShadows = false; boneSphere.renderOrder = 1; this.add(boneSphere); const boneConnector = new Mesh(this._connectorGeometry, this._material); boneConnector.receiveShadows = false; boneConnector.castShadows = false; this.add(boneConnector); this._distanceMap.set(bone.parent, 0); } } } set midStep(value) { this._midStep = value; this._connectorGeometry.updateMidStep(value); } get midStep() { return this._midStep; } set colorMin(value) { this._material.uniforms.u_colorMin = value; } get colorMin() { return this._material.uniforms.u_colorMin; } set colorMax(value) { this._material.uniforms.u_colorMax = value; } get colorMax() { return this._material.uniforms.u_colorMax; } updateMatrix(force) { const bones = this.bones; const midWidthScale = this.midWidthScale; const ballScale = this.ballScale; const distanceMap = this._distanceMap; _worldMatrixInv.copy(this.root.worldMatrix).invert(); for (let i = 0, j = 0; i < bones.length; i++) { const bone = bones[i]; if (bone.parent && bone.parent.isBone) { _boneEndMatrix.multiplyMatrices(_worldMatrixInv, bone.worldMatrix); _boneStartMatrix.multiplyMatrices(_worldMatrixInv, bone.parent.worldMatrix); _boneEnd.setFromMatrixPosition(_boneEndMatrix); _boneStart.setFromMatrixPosition(_boneStartMatrix); _boneDirection.subVectors(_boneEnd, _boneStart); const boneDistance = _boneDirection.getLength(); _boneDirection.normalize(); bone._distance = boneDistance; distanceMap.set(bone, boneDistance); let minDistance = boneDistance; const parentDistance = distanceMap.get(bone.parent); if (parentDistance) { minDistance = Math.min(minDistance, parentDistance); } const sphere = this.children[j]; sphere.position.copy(_boneStart); sphere.scale.set(1, 1, 1).multiplyScalar(minDistance * ballScale); const connector = this.children[j + 1]; connector.position.copy(_boneStart); connector.scale.set(midWidthScale, midWidthScale, 1).multiplyScalar(boneDistance); connector.quaternion.setFromUnitVectors(new Vector3(0, 0, -1), _boneDirection); j += 2; } } super.updateMatrix(force); } } const _worldMatrixInv = new Matrix4(); const _boneStartMatrix = new Matrix4(); const _boneEndMatrix = new Matrix4(); const _boneStart = new Vector3(); const _boneEnd = new Vector3(); const _boneDirection = new Vector3(); function getBoneList(object) { const boneList = []; if (object.isBone) { boneList.push(object); } for (let i = 0; i < object.children.length; i++) { boneList.push.apply(boneList, getBoneList(object.children[i])); } return boneList; } class ConnectorGeometry extends Geometry { constructor(midStep = 0.25) { super(); const vertexs = [ new Vector3(0, 0, 0), new Vector3(1, -1, -midStep), new Vector3(1, 1, -midStep), new Vector3(-1, 1, -midStep), new Vector3(-1, -1, -midStep), new Vector3(1, -1, -midStep), new Vector3(0, 0, -1) ]; const normal = [ new Vector3(1, 0, 1), new Vector3(0, 1, 1), new Vector3(-1, 0, 1), new Vector3(0, -1, 1), new Vector3(1, 0, -1), new Vector3(0, 1, -1), new Vector3(-1, 0, -1), new Vector3(0, -1, -1) ]; const positions = []; const normals = []; for (let i = 0; i < 4; i++) { positions.push(vertexs[0].x, vertexs[0].y, vertexs[0].z); positions.push(vertexs[i + 1].x, vertexs[i + 1].y, vertexs[i + 1].z); positions.push(vertexs[i + 2].x, vertexs[i + 2].y, vertexs[i + 2].z); normals.push(normal[i].x, normal[i].y, normal[i].z); normals.push(normal[i].x, normal[i].y, normal[i].z); normals.push(normal[i].x, normal[i].y, normal[i].z); positions.push(vertexs[6].x, vertexs[6].y, vertexs[6].z); positions.push(vertexs[i + 2].x, vertexs[i + 2].y, vertexs[i + 2].z); positions.push(vertexs[i + 1].x, vertexs[i + 1].y, vertexs[i + 1].z); normals.push(normal[i + 4].x, normal[i + 4].y, normal[i + 4].z); normals.push(normal[i + 4].x, normal[i + 4].y, normal[i + 4].z); normals.push(normal[i + 4].x, normal[i + 4].y, normal[i + 4].z); } this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.computeBoundingSphere(); this.computeBoundingBox(); } updateMidStep(midStep) { const positions = this.getAttribute('a_Position').buffer.array; for (let i = 0; i < 8; i++) { positions[i * 9 + 5] = -midStep; positions[i * 9 + 8] = -midStep; } this.getAttribute('a_Position').buffer.version++; // boundings are not needed to be updated } } const skeletonShader = { name: 'skeleton_shader', uniforms: { 'u_colorMin': [0.35, 0.35, 0.35], 'u_colorMax': [0.7, 0.7, 0.7] }, vertexShader: ` #include varying vec3 v_Normal; void main() { v_Normal = (transposeMat4(inverseMat4(u_Model)) * vec4(a_Normal, 0.0)).xyz; gl_Position = u_Projection * u_View * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include uniform vec3 u_colorMin; uniform vec3 u_colorMax; varying vec3 v_Normal; void main() { vec3 N = normalize(v_Normal); float ndl = dot(N, vec3(0, 1, 0)) * 0.5 + 0.5; vec3 diffuse = mix(u_colorMin, u_colorMax, ndl); gl_FragColor = vec4(diffuse, 1.0); } ` }; export { SkeletonHelper }; ================================================ FILE: examples/jsm/objects/Sky.js ================================================ import { BoxGeometry, DRAW_SIDE, Mesh, ShaderMaterial } from 't3d'; /** * Based on "A Practical Analytic Model for Daylight" * aka The Preetham Model, the de facto standard analytic skydome model * http://www.cs.utah.edu/~shirley/papers/sunsky/sunsky.pdf * * First implemented by Simon Wallner * http://www.simonwallner.at/projects/atmospheric-scattering * * Improved by Martin Upitis * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR * * Three.js integration by zz85 http://twitter.com/blurspline */ class Sky extends Mesh { constructor(cubeTexture) { const geometry = new BoxGeometry(1, 1, 1); const material = new ShaderMaterial(Sky.SkyShader); material.side = DRAW_SIDE.BACK; material.cubeMap = cubeTexture; super(geometry, material); this.frustumCulled = false; } } Sky.SkyShader = { name: 'shader_sky', uniforms: { luminance: 1, turbidity: 2, rayleigh: 1, mieCoefficient: 0.005, mieDirectionalG: 0.8, sunPosition: [0, 0, 0] }, vertexShader: ` #include uniform vec3 sunPosition; uniform float rayleigh; uniform float turbidity; uniform float mieCoefficient; varying vec3 vWorldPosition; varying vec3 vSunDirection; varying float vSunfade; varying vec3 vBetaR; varying vec3 vBetaM; varying float vSunE; const vec3 up = vec3( 0.0, 1.0, 0.0 ); // constants for atmospheric scattering const float e = 2.71828182845904523536028747135266249775724709369995957; const float pi = 3.141592653589793238462643383279502884197169; // wavelength of used primaries, according to preetham const vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 ); // this pre-calcuation replaces older TotalRayleigh(vec3 lambda) function: // (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn)) const vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 ); // mie stuff // K coefficient for the primaries const float v = 4.0; const vec3 K = vec3( 0.686, 0.678, 0.666 ); // MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K const vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 ); // earth shadow hack // cutoffAngle = pi / 1.95; const float cutoffAngle = 1.6110731556870734; const float steepness = 1.5; const float EE = 1000.0; float sunIntensity( float zenithAngleCos ) { zenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 ); return EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) ); } vec3 totalMie( float T ) { float c = ( 0.2 * T ) * 10E-18; return 0.434 * c * MieConst; } void main() { mat4 modelMatrix = u_Model; mat4 viewMatrix = u_View; vec3 zero = vec3(0., 0., 0.); modelMatrix[3].xyz = zero; viewMatrix[3].xyz = zero; vec4 worldPosition = modelMatrix * vec4(a_Position, 0.0); vWorldPosition = worldPosition.xyz; gl_Position = u_Projection * viewMatrix * modelMatrix * vec4(a_Position, 1.0); gl_Position.z = gl_Position.w; // set z to camera.far vSunDirection = normalize( sunPosition ); vSunE = sunIntensity( dot( vSunDirection, up ) ); vSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 ); float rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) ); // extinction (absorbtion + out scattering) // rayleigh coefficients vBetaR = totalRayleigh * rayleighCoefficient; // mie coefficients vBetaM = totalMie( turbidity ) * mieCoefficient; } `, fragmentShader: ` varying vec3 vWorldPosition; varying vec3 vSunDirection; varying float vSunfade; varying vec3 vBetaR; varying vec3 vBetaM; varying float vSunE; uniform float luminance; uniform float mieDirectionalG; const vec3 cameraPos = vec3( 0.0, 0.0, 0.0 ); // constants for atmospheric scattering const float pi = 3.141592653589793238462643383279502884197169; const float n = 1.0003; // refractive index of air const float N = 2.545E25; // number of molecules per unit volume for air at // 288.15K and 1013mb (sea level -45 celsius) // optical length at zenith for molecules const float rayleighZenithLength = 8.4E3; const float mieZenithLength = 1.25E3; const vec3 up = vec3( 0.0, 1.0, 0.0 ); // 66 arc seconds -> degrees, and the cosine of that const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324; // 3.0 / ( 16.0 * pi ) const float THREE_OVER_SIXTEENPI = 0.05968310365946075; // 1.0 / ( 4.0 * pi ) const float ONE_OVER_FOURPI = 0.07957747154594767; float rayleighPhase( float cosTheta ) { return THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) ); } float hgPhase( float cosTheta, float g ) { float g2 = pow( g, 2.0 ); float inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 ); return ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse ); } // Filmic ToneMapping http://filmicgames.com/archives/75 const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float whiteScale = 1.0748724675633854; // 1.0 / Uncharted2Tonemap(1000.0) vec3 Uncharted2Tonemap( vec3 x ) { return ( ( x * ( A * x + C * B ) + D * E ) / ( x * ( A * x + B ) + D * F ) ) - E / F; } void main() { // optical length // cutoff angle at 90 to avoid singularity in next formula. float zenithAngle = acos( max( 0.0, dot( up, normalize( vWorldPosition - cameraPos ) ) ) ); float inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) ); float sR = rayleighZenithLength * inverse; float sM = mieZenithLength * inverse; // combined extinction factor vec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) ); // in scattering float cosTheta = dot( normalize( vWorldPosition - cameraPos ), vSunDirection ); float rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 ); vec3 betaRTheta = vBetaR * rPhase; float mPhase = hgPhase( cosTheta, mieDirectionalG ); vec3 betaMTheta = vBetaM * mPhase; vec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) ); Lin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) ); // nightsky vec3 direction = normalize( vWorldPosition - cameraPos ); float theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2] float phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2] vec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 ); vec3 L0 = vec3( 0.1 ) * Fex; // composition + solar disc float sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta ); L0 += ( vSunE * 19000.0 * Fex ) * sundisk; vec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 ); vec3 curr = Uncharted2Tonemap( ( log2( 2.0 / pow( luminance, 4.0 ) ) ) * texColor ); vec3 color = curr * whiteScale; vec3 retColor = pow( color, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) ); gl_FragColor = vec4( retColor, 1.0 ); } ` }; export { Sky }; ================================================ FILE: examples/jsm/objects/SkyBox.js ================================================ import { BoxGeometry, DRAW_SIDE, Mesh, ShaderMaterial } from 't3d'; class SkyBox extends Mesh { constructor(texture) { const geometry = new BoxGeometry(1, 1, 1); const material = new ShaderMaterial(SkyBox.SkyBoxShader); material.side = DRAW_SIDE.BACK; super(geometry, material); this.material = material; if (texture) { this.texture = texture; } this.frustumCulled = false; } set level(val) { this.material.uniforms.level = val; } get level() { return this.material.uniforms.level; } set gamma(val) { this.material.defines.GAMMA = val; this.material.needsUpdate = true; } get gamma() { return this.material.defines.GAMMA; } set texture(val) { if (val.isTextureCube) { this.material.cubeMap = val; this.material.uniforms.flip = (val.images[0] && val.images[0].rtt) ? 1 : -1; this.material.defines['PANORAMA'] = false; } else { this.material.diffuseMap = val; this.material.uniforms.flip = -1; this.material.defines['PANORAMA'] = ''; } this.material.needsUpdate = true; } get texture() { return this.material.diffuseMap || this.material.cubeMap; } get fog() { return this.material.defines.SKYFOG; } set fog(val) { this.material.defines.SKYFOG = val; this.material.needsUpdate = true; } } SkyBox.SkyBoxShader = { name: 'skybox', defines: { 'GAMMA': false, 'PANORAMA': false, 'SKYFOG': false }, uniforms: { 'level': 0, 'flip': -1, 'fogColor': [1, 1, 1], 'fogStart': 0.0, // value from -0.5 to 0.5 'fogHeight': 0.1 }, vertexShader: ` #include varying vec3 vDir; #ifdef SKYFOG varying vec3 vPosition; #endif mat4 clearMat4Translate(mat4 m) { mat4 outMatrix = m; outMatrix[3].xyz = vec3(0., 0., 0.); return outMatrix; } void main() { mat4 modelMatrix = clearMat4Translate(u_Model); mat4 viewMatrix = clearMat4Translate(u_View); vDir = normalize((modelMatrix * vec4(a_Position, 0.0)).xyz); #ifdef SKYFOG vPosition = a_Position.xyz; #endif gl_Position = u_Projection * viewMatrix * modelMatrix * vec4(a_Position, 1.0); gl_Position.z = gl_Position.w; } `, fragmentShader: ` #include #ifdef PANORAMA uniform sampler2D diffuseMap; #else uniform samplerCube cubeMap; #endif uniform float flip; uniform float level; #ifdef SKYFOG uniform vec3 fogColor; uniform float fogStart; uniform float fogHeight; #endif varying vec3 vDir; #ifdef SKYFOG varying vec3 vPosition; #endif void main() { #include vec3 V = normalize(vDir); #ifdef PANORAMA float phi = acos(V.y); // consistent with cubemap. // atan(y, x) is same with atan2 ? float theta = flip * atan(V.x, V.z) + PI * 0.5; vec2 uv = vec2(theta / 2.0 / PI, -phi / PI); #ifdef TEXTURE_LOD_EXT outColor *= mapTexelToLinear(texture2DLodEXT(diffuseMap, fract(uv), level)); #else outColor *= mapTexelToLinear(texture2D(diffuseMap, fract(uv), level)); #endif #else vec3 coordVec = vec3(flip * V.x, V.yz); #ifdef TEXTURE_LOD_EXT outColor *= mapTexelToLinear(textureCubeLodEXT(cubeMap, coordVec, level)); #else outColor *= mapTexelToLinear(textureCube(cubeMap, coordVec, level)); #endif #endif #include #ifdef GAMMA #include #endif #ifdef SKYFOG float alpha = clamp((vPosition.y - fogStart) / fogHeight, 0.0, 1.0); gl_FragColor.rgb = mix(fogColor, gl_FragColor.rgb, alpha); #endif } ` }; export { SkyBox }; ================================================ FILE: examples/jsm/objects/SphereHelper.js ================================================ import { Geometry, Buffer, Attribute, Mesh, LineMaterial, Vector3 } from 't3d'; class SphereHelper extends Mesh { constructor(sphere, color = 0xffff00, angleSteps = 40) { const positions = []; for (let i = 0; i < 3; i++) { const axis1 = axes[i]; const axis2 = axes[(i + 1) % 3]; _vector.set(0, 0, 0); for (let a = 0; a < angleSteps; a++) { let angle; angle = 2 * Math.PI * a / (angleSteps - 1); _vector[axis1] = Math.sin(angle); _vector[axis2] = Math.cos(angle); positions.push(_vector.x, _vector.y, _vector.z); angle = 2 * Math.PI * (a + 1) / (angleSteps - 1); _vector[axis1] = Math.sin(angle); _vector[axis2] = Math.cos(angle); positions.push(_vector.x, _vector.y, _vector.z); } } const geometry = new Geometry(); geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3))); geometry.computeBoundingSphere(); const lineMaterial = new LineMaterial(); lineMaterial.diffuse.setHex(color); super(geometry, lineMaterial); this.sphere = sphere; } updateMatrix(force) { const sphere = this.sphere; this.position.copy(sphere.center); if (sphere.isEmpty()) { this.scale.setScalar(0); } else { this.scale.setScalar(sphere.radius); } super.updateMatrix(force); } } SphereHelper.prototype.isSphereHelper = true; const _vector = new Vector3(); const axes = ['x', 'y', 'z']; export { SphereHelper }; ================================================ FILE: examples/jsm/objects/SpotLightHelper.js ================================================ import { Attribute, Buffer, Geometry, LineMaterial, Mesh, Object3D } from 't3d'; class SpotLightHelper extends Object3D { constructor(light, color) { super(); this.light = light; this.color = color; const geometry = new Geometry(); const positions = [ 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, -1 ]; for (let i = 0, j = 1, l = 32; i < l; i++, j++) { const p1 = (i / l) * Math.PI * 2; const p2 = (j / l) * Math.PI * 2; positions.push( Math.cos(p1), Math.sin(p1), -1, Math.cos(p2), Math.sin(p2), -1 ); } geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(positions), 3))); geometry.computeBoundingBox(); geometry.computeBoundingSphere(); const material = new LineMaterial(); this.cone = new Mesh(geometry, material); this.add(this.cone); this.update(); } update() { const coneLength = this.light.distance ? this.light.distance : 1000; const coneWidth = coneLength * Math.tan(this.light.angle); this.cone.scale.set(coneWidth, coneWidth, coneLength); if (this.color !== undefined) { this.cone.material.diffuse.setHex(this.color); } else { this.cone.material.diffuse.copy(this.light.color); } } } export { SpotLightHelper }; ================================================ FILE: examples/jsm/objects/Sprite.js ================================================ /** * Sprite */ import { Attribute, Buffer, Geometry, Mesh, ShaderMaterial } from 't3d'; class Sprite extends Mesh { constructor() { super(sharedGeometry, new ShaderMaterial(spriteShader)); this.frustumCulled = false; } set rotation(value) { this.material.uniforms['rotation'] = value; } get rotation() { return this.material.uniforms['rotation']; } } const sharedGeometry = new Geometry(); const array = new Float32Array([ -0.5, -0.5, 0, 0, 0.5, -0.5, 1, 0, 0.5, 0.5, 1, 1, -0.5, 0.5, 0, 1 ]); const buffer = new Buffer(array, 4); sharedGeometry.addAttribute('position', new Attribute(buffer, 2, 0)); sharedGeometry.addAttribute('uv', new Attribute(buffer, 2, 2)); sharedGeometry.setIndex( new Attribute(new Buffer(new Uint16Array([ 0, 1, 2, 0, 2, 3 ]), 1)) ); sharedGeometry.computeBoundingBox(); sharedGeometry.computeBoundingSphere(); const spriteShader = { defines: { USE_SIZEATTENUATION: true }, uniforms: { rotation: 0, center: [0.5, 0.5] }, vertexShader: ` #include #include attribute vec2 position; attribute vec2 uv; uniform float rotation; uniform vec2 center; #ifdef USE_DIFFUSE_MAP varying vec2 vUV; uniform mat3 uvTransform; #endif void main() { #ifdef USE_DIFFUSE_MAP vUV = (uvTransform * vec3(uv, 1.)).xy; #endif vec4 mvPosition = u_View * u_Model * vec4( 0.0, 0.0, 0.0, 1.0 ); vec2 scale; scale.x = length(vec3(u_Model[0].x, u_Model[0].y, u_Model[0].z)); scale.y = length(vec3(u_Model[1].x, u_Model[1].y, u_Model[1].z)); #ifndef USE_SIZEATTENUATION bool isPerspective = isPerspectiveMatrix(u_Projection); if (isPerspective) scale *= - mvPosition.z; #endif vec2 alignedPosition = (position.xy - (center - vec2(0.5))) * scale; vec2 rotatedPosition; rotatedPosition.x = cos(rotation) * alignedPosition.x - sin(rotation) * alignedPosition.y; rotatedPosition.y = sin(rotation) * alignedPosition.x + cos(rotation) * alignedPosition.y; mvPosition.xy += rotatedPosition; gl_Position = u_Projection * mvPosition; #include } `, fragmentShader: ` uniform vec3 u_Color; uniform float u_Opacity; #ifdef USE_DIFFUSE_MAP uniform sampler2D diffuseMap; varying vec2 vUV; #endif #include #include #include void main() { #include vec4 outColor = vec4(u_Color, u_Opacity); #ifdef USE_DIFFUSE_MAP outColor *= texture2D(diffuseMap, vUV); #endif #include gl_FragColor = outColor; #include } ` }; Sprite.SpriteGeometry = sharedGeometry; Sprite.SpriteShader = spriteShader; export { Sprite }; ================================================ FILE: examples/jsm/objects/Terrain.js ================================================ import { PlaneGeometry, Mesh, LambertMaterial, MATERIAL_TYPE, cloneUniforms } from 't3d'; // Reference: github.com/IceCreamYou/THREE.Terrains class Terrain extends Mesh { constructor(options = {}) { const width = options.width || 1024; const height = options.height || 1024; const widthSegments = options.widthSegments || 63; const heightSegments = options.heightSegments || 63; const maxHeight = options.maxHeight || 100; const minHeight = options.minHeight || -100; const material = options.material || new TerrainMaterial(); const geometry = new PlaneGeometry(width, height, widthSegments, heightSegments); super(geometry, material); this.width = width; this.height = height; this.widthSegments = widthSegments; this.heightSegments = heightSegments; this.maxHeight = maxHeight; this.minHeight = minHeight; this.heightmap = options.heightmap; this._fromHeightMap(); } // url or image _fromHeightMap() { const vertices = this.geometry.getAttribute('a_Position').buffer.array; const canvas = document.createElement('canvas'), context = canvas.getContext('2d'), cols = this.widthSegments + 1, rows = this.heightSegments + 1, spread = this.maxHeight - this.minHeight; canvas.width = cols; canvas.height = rows; context.drawImage(this.heightmap, 0, 0, canvas.width, canvas.height); const data = context.getImageData(0, 0, canvas.width, canvas.height).data; for (let row = 0; row < rows; row++) { for (let col = 0; col < cols; col++) { const i = row * cols + col, idx = i * 4; vertices[i * 3 + 1] = (data[idx] + data[idx + 1] + data[idx + 2]) / 765 * spread + this.minHeight; } } this.geometry.getAttribute('a_Position').buffer.version++; this.geometry.computeBoundingBox(); this.geometry.computeBoundingSphere(); } getHeightAt(x, z) { // transform coordinate origin x += this.width / 2; z += this.height / 2; const vertices = this.geometry.getAttribute('a_Position').buffer.array; const widthScalar = this.width / this.widthSegments; const heightScalar = this.height / this.heightSegments; const xS = x / widthScalar; const yS = z / heightScalar; if (x < 0 || x >= this.width || z < 0 || z >= this.height) { console.error('point outside of terrain boundary'); } const ix = Math.floor(xS); const iz = Math.floor(yS); const rx = xS - ix; const rz = yS - iz; const wi = this.widthSegments + 1; const a = vertices[(iz * wi + ix) * 3 + 1]; const b = vertices[(iz * wi + (ix + +1)) * 3 + 1]; const c = vertices[((iz + 1) * wi + (ix + 1)) * 3 + 1]; const d = vertices[((iz + 1) * wi + ix) * 3 + 1]; // Interpolate const e = (a * (1 - rx) + b * rx); const f = (c * rx + d * (1 - rx)); const y = (e * (1 - rz) + f * rz); return y; } } class TerrainMaterial extends LambertMaterial { constructor() { super(); this.type = MATERIAL_TYPE.SHADER; this.shaderName = terrainShader.name; this.vertexShader = terrainShader.vertexShader; this.fragmentShader = terrainShader.fragmentShader; this.uniforms = cloneUniforms(terrainShader.uniforms); } } const terrainShader = { name: 'terrain', uniforms: { texture_0: null, texture_1: null, texture_2: null, texture_3: null, texture_4: null }, vertexShader: ` #define USE_UV1 varying vec2 MyvUv; varying vec3 vPosition; varying vec3 myNormal; #include #include #include #include #include #include #include #include void main() { #include #include #include #include MyvUv = a_Uv; vPosition = a_Position; myNormal = a_Normal; #include #include #include #include #include } `, fragmentShader: ` varying vec2 MyvUv; varying vec3 vPosition; varying vec3 myNormal; uniform sampler2D texture_0; uniform sampler2D texture_1; uniform sampler2D texture_2; uniform sampler2D texture_3; uniform sampler2D texture_4; #include #include uniform vec3 emissive; #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include float slope = acos(max(min(dot(myNormal, vec3(0.0, 1.0, 0.0)), 1.0), -1.0)); vec4 color = texture2D( texture_0, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ); // base color = mix( texture2D( texture_1, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ), color, max(min(1.0 - smoothstep(-80.0, -35.0, vPosition.y) + smoothstep(20.0, 50.0, vPosition.y), 1.0), 0.0)); color = mix( texture2D( texture_2, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ), color, max(min(1.0 - smoothstep(20.0, 50.0, vPosition.y) + smoothstep(60.0, 85.0, vPosition.y), 1.0), 0.0)); color = mix( texture2D( texture_3, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ), color, max(min(1.0 - smoothstep(65.0 + smoothstep(-256.0, 256.0, vPosition.x) * 10.0, 80.0, vPosition.y), 1.0), 0.0)); color = mix( texture2D( texture_4, MyvUv * vec2( 1.0, 1.0 ) + vec2( 0.0, 0.0 ) ), color, max(min(slope > 0.7853981633974483 ? 0.2 : 1.0 - smoothstep(0.47123889803846897, 0.7853981633974483, slope) + 0.2, 1.0), 0.0)); outColor *= color; #include #include ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)); #include #include outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; #include vec3 totalEmissiveRadiance = emissive; outColor.xyz += totalEmissiveRadiance; #include #include #include #include #include } ` }; export { Terrain }; ================================================ FILE: examples/jsm/objects/TriangleSoupHelper.js ================================================ import { Attribute, Geometry, Buffer, Mesh, BasicMaterial, DRAW_MODE, Object3D } from 't3d'; import { GeometryUtils } from '../geometries/GeometryUtils.js'; /** * TriangleSoupHelper */ export class TriangleSoupHelper extends Object3D { constructor(triangleSoup) { super(); this.triangleSoup = triangleSoup; const geometry = new Geometry(); const material = new BasicMaterial(); material.diffuse.setRGB(0.0, 0.5, 1.0); material.transparent = true; material.opacity = 0.5; material.depthWrite = false; material.envMap = undefined; this.mesh = new Mesh(geometry, material); this.add(this.mesh); this.wireframeMesh = null; this.update(); } wireframe(value) { if (value === !!this.wireframeMesh) return this; if (value) { const geometry = this.mesh.geometry.clone(); geometry.index = GeometryUtils.getWireframeAttribute(geometry); geometry.computeBoundingBox(); geometry.computeBoundingSphere(); const material = new BasicMaterial(); material.diffuse.setRGB(0.08, 0.08, 0.08); material.drawMode = DRAW_MODE.LINES; material.transparent = true; material.opacity = 0.8; material.envMap = undefined; const wireframeMesh = new Mesh(geometry, material); this.add(wireframeMesh); this.wireframeMesh = wireframeMesh; } else { this.wireframeMesh.geometry.dispose(); this.wireframeMesh.material.dispose(); this.remove(this.wireframeMesh); this.wireframeMesh = null; } return this; } update() { const { positions, indices } = this.triangleSoup; const { geometry } = this.mesh; geometry.dispose(); geometry.addAttribute( 'a_Position', new Attribute(new Buffer(new Float32Array(positions), 3)) ); geometry.setIndex(new Attribute(new Buffer((new Uint32Array(indices)), 1))); geometry.computeBoundingBox(); geometry.computeBoundingSphere(); // Rebuild wireframe if it exists if (this.wireframeMesh) { this.wireframe(false).wireframe(true); } return this; } dispose() { this.mesh.geometry.dispose(); this.mesh.material.dispose(); if (this.wireframeMesh) { this.wireframeMesh.geometry.dispose(); this.wireframeMesh.material.dispose(); } return this; } } ================================================ FILE: examples/jsm/objects/VertexNormalsHelper.js ================================================ import { Attribute, Buffer, Geometry, LineMaterial, Mesh, Matrix3, Vector3 } from 't3d'; const _v1 = new Vector3(); const _v2 = new Vector3(); const _normalMatrix = new Matrix3(); class VertexNormalsHelper extends Mesh { constructor(object, size = 1, color = 0xff0000) { const geometry = new Geometry(); const nNormals = object.geometry.attributes.a_Normal.buffer.count; const positions = new Attribute(new Buffer(new Float32Array(nNormals * 2 * 3), 3)); geometry.addAttribute('a_Position', positions); const material = new LineMaterial(); material.diffuse.setHex(color); super(geometry, material); this.object = object; this.size = size; this.update(); } update() { this.object.updateMatrix(true); const objGeometry = this.object.geometry; if (objGeometry) { _normalMatrix.setFromMatrix4(this.object.worldMatrix).invert().transpose(); const matrixWorld = this.object.worldMatrix; const positionBuffer = this.geometry.attributes.a_Position.buffer; const objPos = objGeometry.attributes.a_Position.buffer; const objNorm = objGeometry.attributes.a_Normal.buffer; let idx = 0; for (let j = 0, jl = objPos.count; j < jl; j++) { _v1.fromArray(objPos.array, j * 3).applyMatrix4(matrixWorld); _v2.fromArray(objNorm.array, j * 3); _v2.applyMatrix3(_normalMatrix).normalize().multiplyScalar(this.size).add(_v1); positionBuffer.array[idx++] = _v1.x; positionBuffer.array[idx++] = _v1.y; positionBuffer.array[idx++] = _v1.z; positionBuffer.array[idx++] = _v2.x; positionBuffer.array[idx++] = _v2.y; positionBuffer.array[idx++] = _v2.z; } // Skip update bounding box // Because we may not want to consider the helper's bounding box this.geometry.computeBoundingSphere(); positionBuffer.version++; } } } VertexNormalsHelper.prototype.isVertexNormalsHelper = true; export { VertexNormalsHelper }; ================================================ FILE: examples/jsm/objects/VertexTangentsHelper.js ================================================ import { Attribute, Buffer, Geometry, LineMaterial, Mesh, Vector3 } from 't3d'; const _v1 = new Vector3(); const _v2 = new Vector3(); class VertexTangentsHelper extends Mesh { constructor(object, size = 1, color = 0x00ffff) { const geometry = new Geometry(); const nTangents = object.geometry.attributes.a_Tangent.buffer.count; const positions = new Attribute(new Buffer(new Float32Array(nTangents * 2 * 3), 3)); geometry.addAttribute('a_Position', positions); const material = new LineMaterial(); material.diffuse.setHex(color); super(geometry, material); this.object = object; this.size = size; this.update(); } update() { this.object.updateMatrix(true); const objGeometry = this.object.geometry; if (objGeometry) { const matrixWorld = this.object.worldMatrix; const position = this.geometry.attributes.a_Position.buffer; const objPos = objGeometry.attributes.a_Position.buffer; const objTan = objGeometry.attributes.a_Tangent.buffer; let idx = 0; for (let j = 0, jl = objPos.count; j < jl; j++) { _v1.fromArray(objPos.array, j * 3).applyMatrix4(matrixWorld); _v2.fromArray(objTan.array, j * 3); _v2.transformDirection(matrixWorld).multiplyScalar(this.size).add(_v1); position.array[idx++] = _v1.x; position.array[idx++] = _v1.y; position.array[idx++] = _v1.z; position.array[idx++] = _v2.x; position.array[idx++] = _v2.y; position.array[idx++] = _v2.z; } // Skip update bounding box // Because we may not want to consider the helper's bounding box this.geometry.computeBoundingSphere(); position.version++; } } } VertexTangentsHelper.prototype.isVertexTangentsHelper = true; export { VertexTangentsHelper }; ================================================ FILE: examples/jsm/objects/Water.js ================================================ import { Color3, DRAW_SIDE, Mesh, ShaderMaterial, Vector3 } from 't3d'; import { PlanarReflectionProbe } from '../probes/PlanarReflectionProbe.js'; /** * @author jbouny / https://github.com/jbouny * * Work based on : * @author Slayvin / http://slayvin.net : Flat mirror for three.js * @author Stemkoski / http://www.adelphi.edu/~stemkoski : An implementation of water shader based on the flat mirror * @author Jonas Wagner / http://29a.ch/ && http://29a.ch/slides/2012/webglwater/ : Water shader explanations in WebGL */ class Water extends Mesh { constructor(geometry, options = {}) { const alpha = options.alpha !== undefined ? options.alpha : 1.0; const time = options.time !== undefined ? options.time : 0.0; const normalSampler = options.waterNormals !== undefined ? options.waterNormals : null; const sunDirection = options.sunDirection !== undefined ? options.sunDirection : new Vector3(0.70707, 0.70707, 0.0); const sunColor = new Color3(options.sunColor !== undefined ? options.sunColor : 0xffffff); const waterColor = new Color3(options.waterColor !== undefined ? options.waterColor : 0x7F7F7F); const distortionScale = options.distortionScale !== undefined ? options.distortionScale : 20.0; const side = options.side !== undefined ? options.side : DRAW_SIDE.FRONT; const material = new ShaderMaterial(mirrorShader); material.side = side; material.uniforms['alpha'] = alpha; material.uniforms['time'] = time; material.uniforms['normalSampler'] = normalSampler; material.uniforms['sunColor'] = sunColor.toArray(); material.uniforms['waterColor'] = waterColor.toArray(); material.uniforms['sunDirection'] = sunDirection.toArray(); material.uniforms['distortionScale'] = distortionScale; super(geometry, material); const planarReflectionProbe = new PlanarReflectionProbe(); material.uniforms['mirrorSampler'] = planarReflectionProbe.renderTarget.texture; material.uniforms['textureMatrix'] = planarReflectionProbe.textureMatrix.elements; this.skipReflectionProbe = true; const planeNormal = new Vector3(0, 1, 0); const coplanarPoint = new Vector3(); const scope = this; scope.updateReflect = function(renderer, scene, camera) { planeNormal.setFromMatrixColumn(scope.worldMatrix, 1).normalize(); coplanarPoint.setFromMatrixPosition(scope.worldMatrix); planarReflectionProbe.plane.setFromNormalAndCoplanarPoint(planeNormal, coplanarPoint); planarReflectionProbe.render(renderer, scene, camera); }; } } const mirrorShader = { name: 'water_mirror', uniforms: { u_FogColor: [1, 1, 1], u_FogDensity: 0.2, u_FogNear: 0.1, u_FogFar: 1000, normalSampler: null, mirrorSampler: null, alpha: 1.0, time: 0.0, size: 1.0, distortionScale: 20.0, textureMatrix: new Float32Array(16), sunColor: [0.8, 0.8, 0.8], sunDirection: [0.70707, 0.70707, 0], waterColor: [0.4, 0.4, 0.4] }, vertexShader: [ 'uniform mat4 textureMatrix;', 'uniform float time;', 'varying vec4 mirrorCoord;', 'varying vec4 worldPosition;', '#include ', 'void main() {', ' mirrorCoord = u_Model * vec4(a_Position, 1.0);', ' worldPosition = mirrorCoord.xyzw;', ' mirrorCoord = textureMatrix * mirrorCoord;', ' gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0);', '}' ].join('\n'), fragmentShader: [ 'uniform sampler2D mirrorSampler;', 'uniform float alpha;', 'uniform float time;', 'uniform float size;', 'uniform float distortionScale;', 'uniform sampler2D normalSampler;', 'uniform vec3 sunColor;', 'uniform vec3 sunDirection;', 'uniform vec3 u_CameraPosition;', 'uniform vec3 waterColor;', 'varying vec4 mirrorCoord;', 'varying vec4 worldPosition;', 'vec4 getNoise( vec2 uv ) {', ' vec2 uv0 = ( uv / 103.0 ) + vec2(time / 17.0, time / 29.0);', ' vec2 uv1 = uv / 107.0-vec2( time / -19.0, time / 31.0 );', ' vec2 uv2 = uv / vec2( 8907.0, 9803.0 ) + vec2( time / 101.0, time / 97.0 );', ' vec2 uv3 = uv / vec2( 1091.0, 1027.0 ) - vec2( time / 109.0, time / -113.0 );', ' vec4 noise = texture2D( normalSampler, uv0 ) +', ' texture2D( normalSampler, uv1 ) +', ' texture2D( normalSampler, uv2 ) +', ' texture2D( normalSampler, uv3 );', ' return noise * 0.5 - 1.0;', '}', 'void sunLight( const vec3 surfaceNormal, const vec3 eyeDirection, float shiny, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor ) {', ' vec3 reflection = normalize( reflect( -sunDirection, surfaceNormal ) );', ' float direction = max( 0.0, dot( eyeDirection, reflection ) );', ' specularColor += pow( direction, shiny ) * sunColor * spec;', ' diffuseColor += max( dot( sunDirection, surfaceNormal ), 0.0 ) * sunColor * diffuse;', '}', '#include ', 'void main() {', ' vec4 noise = getNoise( worldPosition.xz * size );', ' vec3 surfaceNormal = normalize( noise.xzy * vec3( 1.5, 1.0, 1.5 ) );', ' vec3 diffuseLight = vec3(0.0);', ' vec3 specularLight = vec3(0.0);', ' vec3 worldToEye = u_CameraPosition - worldPosition.xyz;', ' vec3 eyeDirection = normalize( worldToEye );', ' sunLight( surfaceNormal, eyeDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight );', ' float distance = length(worldToEye);', ' vec2 distortion = surfaceNormal.xz * ( 0.001 + 1.0 / distance ) * distortionScale;', ' vec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.w + distortion ) );', ' float theta = max( dot( eyeDirection, surfaceNormal ), 0.0 );', ' float rf0 = 0.3;', ' float reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 );', ' vec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor;', ' vec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ), ( vec3( 0.1 ) + reflectionSample * 0.9 + reflectionSample * specularLight ), reflectance);', ' vec3 outgoingLight = albedo;', ' gl_FragColor = vec4( outgoingLight, alpha );', ' #include ', '}' ].join('\n') }; export { Water }; ================================================ FILE: examples/jsm/ocean/Butterfly.js ================================================ // Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fbutterfly.ts import { Vector4 } from 't3d'; const eix = x => [Math.cos(x), Math.sin(x)]; export const reverseBits = (v, width) => { return parseInt(v.toString(2).padStart(width, '0').split('').reverse().join(''), 2); }; export const createButterflyTexture = size => { const width = Math.log2(size); const height = size; const texture = new Float32Array(width * height * 4); const w = (2.0 * Math.PI) / size; const bitReversed = [...Array(size).keys()].map(v => reverseBits(v, width)); const texel = new Vector4(); for (let j = 0; j < width; j++) { for (let i = 0; i < height; i++) { const k = i * (size >> (j + 1)); const twiddle = eix(k * w); const span = 2 ** j; const wing = i % 2 ** (j + 1) < span ? 0 : 1; // 0 - top wing, 1 - bottom wing if (j === 0) { if (wing === 0) { texel.set(twiddle[0], twiddle[1], bitReversed[i], bitReversed[i + 1]); } else { texel.set(twiddle[0], twiddle[1], bitReversed[i - 1], bitReversed[i]); } } else { if (wing === 0) { texel.set(twiddle[0], twiddle[1], i, i + span); } else { texel.set(twiddle[0], twiddle[1], i - span, i); } } texture[(width * i + j) * 4] = texel.x; texture[(width * i + j) * 4 + 1] = texel.y; texture[(width * i + j) * 4 + 2] = texel.z; texture[(width * i + j) * 4 + 3] = texel.w; } } return texture; }; ================================================ FILE: examples/jsm/ocean/OceanField.js ================================================ // Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Focean-field.ts import { OffscreenRenderTarget, TEXTURE_FILTER, ShaderPostPass, ATTACHMENT } from 't3d'; import { HkShader } from './shaders/HkShader.js'; import { FFT2HShader } from './shaders/FFT2HShader.js'; import { FFT2VShader } from './shaders/FFT2VShader.js'; import { PostFFT2Shader } from './shaders/PostFFT2Shader.js'; import { createFloat4Texture } from './Utils.js'; export class OceanField { constructor(renderer, h0Textures, butterflyTexture, params) { this.spectrumTextures; this.pingPongTextures; this.ifftTextures; this._dataMaps; this.spectrumRenderTarget; this.pingPongRenderTarget; this.postIfft2RenderTarget; this.hkPass; this.fft2hPass; this.fft2vPass; this.postfft2Pass; this.renderer = renderer; this.h0Textures = h0Textures; this.butterflyTexture = butterflyTexture; this.params = params; this.createTextures(); this.createRenderTargets(); this.createFFTPasses(); } get dataMaps() { return this._dataMaps; } update(time) { this.generateSpectrum(time); this.ifft2(); this.postIfft2(); } dispose() { this.hkPass.dispose(); this.fft2hPass.dispose(); this.fft2vPass.dispose(); this.postfft2Pass.dispose(); this.spectrumRenderTarget.dispose(); this.pingPongRenderTarget.dispose(); this.postIfft2RenderTarget.dispose(); this.h0Textures.forEach(texture => texture.dispose()); this.spectrumTextures.forEach(texture => texture.dispose()); this.pingPongTextures.forEach(texture => texture.dispose()); this.ifftTextures && this.ifftTextures.forEach(texture => texture.dispose()); this._dataMaps.forEach(texture => texture.dispose()); } createFFTPasses() { this.hkPass = new ShaderPostPass(HkShader); this.hkPass.material.uniforms.resolution = this.params.resolution; for (let i = 0; i < this.params.cascades.length; i++) { this.hkPass.material.uniforms.sizes[i] = this.params.cascades[i].size; } this.fft2hPass = new ShaderPostPass(FFT2HShader); this.fft2vPass = new ShaderPostPass(FFT2VShader); this.postfft2Pass = new ShaderPostPass(PostFFT2Shader); this.postfft2Pass.material.uniforms['N2'] = this.params.resolution * this.params.resolution; } createTextures() { this.spectrumTextures = Array.from({ length: 6 }, () => createFloat4Texture(this.params.resolution, this.params.resolution) ); this.pingPongTextures = Array.from({ length: 6 }, () => createFloat4Texture(this.params.resolution, this.params.resolution) ); this._dataMaps = Array.from({ length: 6 }, () => createFloat4Texture(this.params.resolution, this.params.resolution, TEXTURE_FILTER.LINEAR) ); } createRenderTargets() { this.spectrumRenderTarget = new OffscreenRenderTarget(this.params.resolution, this.params.resolution); this.spectrumRenderTarget.setClear(false, false, false); for (let slot = 0; slot < this.spectrumTextures.length; slot++) { this.spectrumRenderTarget.attach(this.spectrumTextures[slot], ATTACHMENT.COLOR_ATTACHMENT0 + slot); } this.pingPongRenderTarget = new OffscreenRenderTarget(this.params.resolution, this.params.resolution); this.pingPongRenderTarget.setClear(false, false, false); for (let slot = 0; slot < this.pingPongTextures.length; slot++) { this.pingPongRenderTarget.attach(this.pingPongTextures[slot], ATTACHMENT.COLOR_ATTACHMENT0 + slot); } this.postIfft2RenderTarget = new OffscreenRenderTarget(this.params.resolution, this.params.resolution); this.postIfft2RenderTarget.setClear(false, false, false); for (let slot = 0; slot < this._dataMaps.length; slot++) { this.postIfft2RenderTarget.attach(this._dataMaps[slot], ATTACHMENT.COLOR_ATTACHMENT0 + slot); } } generateSpectrum(time) { this.hkPass.uniforms.h0Texture0 = this.h0Textures[0]; this.hkPass.uniforms.h0Texture1 = this.h0Textures[1]; this.hkPass.uniforms.h0Texture2 = this.h0Textures[2]; this.hkPass.uniforms.t = time; this.hkPass.render(this.renderer, this.spectrumRenderTarget); } ifft2() { const phases = Math.log2(this.params.resolution); const pingPongTextures = [this.spectrumTextures, this.pingPongTextures]; const pingPongRenderTargets = [this.pingPongRenderTarget, this.spectrumRenderTarget]; // horizontal ifft let pingPong = 0; this.fft2hPass.material.uniforms['butterfly'] = this.butterflyTexture; for (let phase = 0; phase < phases; phase++) { this.fft2hPass.uniforms.phase = phase; this.fft2hPass.uniforms.spectrum0 = pingPongTextures[pingPong][0]; this.fft2hPass.uniforms.spectrum1 = pingPongTextures[pingPong][1]; this.fft2hPass.uniforms.spectrum2 = pingPongTextures[pingPong][2]; this.fft2hPass.uniforms.spectrum3 = pingPongTextures[pingPong][3]; this.fft2hPass.uniforms.spectrum4 = pingPongTextures[pingPong][4]; this.fft2hPass.uniforms.spectrum5 = pingPongTextures[pingPong][5]; this.fft2hPass.render(this.renderer, pingPongRenderTargets[pingPong]); pingPong = (pingPong + 1) % 2; } // vertical ifft this.fft2vPass.material.uniforms['butterfly'] = this.butterflyTexture; for (let phase = 0; phase < phases; phase++) { this.fft2vPass.uniforms.phase = phase; this.fft2vPass.uniforms.spectrum0 = pingPongTextures[pingPong][0]; this.fft2vPass.uniforms.spectrum1 = pingPongTextures[pingPong][1]; this.fft2vPass.uniforms.spectrum2 = pingPongTextures[pingPong][2]; this.fft2vPass.uniforms.spectrum3 = pingPongTextures[pingPong][3]; this.fft2vPass.uniforms.spectrum4 = pingPongTextures[pingPong][4]; this.fft2vPass.uniforms.spectrum5 = pingPongTextures[pingPong][5]; this.fft2vPass.render(this.renderer, pingPongRenderTargets[pingPong]); pingPong = (pingPong + 1) % 2; } this.ifftTextures = pingPongTextures[pingPong]; } postIfft2() { this.postfft2Pass.uniforms.ifft0 = this.ifftTextures[0]; this.postfft2Pass.uniforms.ifft1 = this.ifftTextures[1]; this.postfft2Pass.uniforms.ifft2 = this.ifftTextures[2]; this.postfft2Pass.uniforms.ifft3 = this.ifftTextures[3]; this.postfft2Pass.uniforms.ifft4 = this.ifftTextures[4]; this.postfft2Pass.uniforms.ifft5 = this.ifftTextures[5]; this.postfft2Pass.render(this.renderer, this.postIfft2RenderTarget); } } ================================================ FILE: examples/jsm/ocean/OceanFieldBuilder.js ================================================ // Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Focean-field-builder.ts import { OffscreenRenderTarget, ATTACHMENT, TEXTURE_FILTER, TEXTURE_WRAP, ShaderPostPass } from 't3d'; import { createButterflyTexture } from './Butterfly.js'; import { OceanField } from './OceanField.js'; import { H0Shader } from './shaders/H0Shader.js'; import { createFloat2Texture, createFloat4Texture } from './Utils.js'; export class OceanFieldBuilder { constructor(renderer) { this.renderer = renderer; this.renderTarget = OffscreenRenderTarget.create2D(4, 4); this.renderTarget.setClear(false, false, false); this.butterflyTexture = new Map(); this.noiseTexture = new Map(); this.h0Pass = new ShaderPostPass(H0Shader); } build(params = {}) { const _params = { ...defaultBuildParams, ...params }; const h0Textures = this.createH0Textures(_params.resolution); this.generateInitialSpectrum(h0Textures, _params); const butterflyTexture = this.getButterflyTexture(_params.resolution); return new OceanField( this.renderer, h0Textures, butterflyTexture, _params ); } update(field, params = {}) { const _params = { ...defaultBuildParams, ...params }; this.generateInitialSpectrum(field['h0Textures'], _params); this.updateField(field, _params); Object.assign(field, { params: _params }); } updateField(field, params) { if (params.resolution !== field.params.resolution) { field.hkPass.uniforms.resolution = params.resolution; field.postfft2Pass.uniforms.N2 = params.resolution * params.resolution; } for (let i = 0; i < params.cascades.length; i++) { if (params.cascades[i].size !== field.hkPass.uniforms.sizes[i]) { field.hkPass.uniforms.sizes[i] = params.cascades[i].size; } } } createH0Textures(size) { return [ createFloat4Texture(size, size), createFloat4Texture(size, size), createFloat4Texture(size, size) ]; } generateInitialSpectrum(h0Textures, params) { for (let slot = 0; slot < h0Textures.length; slot++) { this.renderTarget.attach(h0Textures[slot], ATTACHMENT.COLOR_ATTACHMENT0 + slot); } this.renderTarget.resize(params.resolution, params.resolution); this.h0Pass.uniforms.noise = this.getNoiseTexture(params.resolution, params.randomSeed); this.h0Pass.uniforms.resolution = params.resolution; this.h0Pass.uniforms.wind = params.wind; this.h0Pass.uniforms.alignment = params.alignment; for (let i = 0; i < params.cascades.length; i++) { this.h0Pass.uniforms.cascades[i].size = params.cascades[i].size; this.h0Pass.uniforms.cascades[i].strength = (params.cascades[i].strength * 0.081) / params.cascades[i].size ** 2; this.h0Pass.uniforms.cascades[i].minK = 2.0 * Math.PI / params.cascades[i].maxWave; this.h0Pass.uniforms.cascades[i].maxK = 2.0 * Math.PI / params.cascades[i].minWave; } this.h0Pass.render(this.renderer, this.renderTarget); } getNoiseTexture(size, randomSeed) { if (!this.noiseTexture.has(size)) { this.noiseTexture.set( size, createFloat2Texture( size, size, TEXTURE_FILTER.NEAREST, TEXTURE_WRAP.REPEAT ) ); } const texture = this.noiseTexture.get(size); texture.image.data = this.getNoise2d(size, randomSeed); texture.version++; return texture; } getButterflyTexture(size) { if (!this.butterflyTexture.has(size)) { const texture = createFloat4Texture(Math.log2(size), size); texture.image.data = createButterflyTexture(size); texture.version++; this.butterflyTexture.set(size, texture); } return this.butterflyTexture.get(size); } getNoise2d(size, randomSeed) { const mulberry32 = a => { return () => { let t = (a += 0x6d2b79f5); t = Math.imul(t ^ (t >>> 15), t | 1); t ^= t + Math.imul(t ^ (t >>> 7), t | 61); return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; }; const random = mulberry32(randomSeed); return Float32Array.from([...Array(size * size * 2)].map(() => random())); } dispose() { this.butterflyTexture.forEach(texture => texture.dispose()); this.butterflyTexture.clear(); this.noiseTexture.forEach(texture => texture.dispose()); this.noiseTexture.clear(); this.renderTarget.dispose(); this.h0Pass.dispose(); } } const defaultBuildParams = { cascades: [ { size: 100.0, strength: 2.0, croppiness: -1.5, minWave: 1.0e-6, maxWave: 1.0e6 }, { size: 60.0, strength: 2.0, croppiness: -1.5, minWave: 1.0e-6, maxWave: 1.0e6 }, { size: 6.0, strength: 2.0, croppiness: -1.5, minWave: 1.0e-6, maxWave: 1.0e6 } ], resolution: 256, wind: [4.5, 2.5], alignment: 1.0, randomSeed: 0 }; ================================================ FILE: examples/jsm/ocean/OceanMaterial.js ================================================ import { ShaderMaterial } from 't3d'; export class OceanMaterial extends ShaderMaterial { constructor() { super(OceanShader); this.defines.SHORELINE = false; } setOceanField(oceanField) { const uniforms = this.uniforms; const cascades = oceanField.params.cascades; const dataMaps = oceanField.dataMaps; uniforms.sizes[0] = cascades[0].size; uniforms.sizes[1] = cascades[1].size; uniforms.sizes[2] = cascades[2].size; uniforms.croppinesses[0] = cascades[0].croppiness; uniforms.croppinesses[1] = cascades[1].croppiness; uniforms.croppinesses[2] = cascades[2].croppiness; uniforms.dx_hy_dz_dxdz0 = dataMaps[0]; uniforms.sx_sz_dxdx_dzdz0 = dataMaps[1]; uniforms.dx_hy_dz_dxdz1 = dataMaps[2]; uniforms.sx_sz_dxdx_dzdz1 = dataMaps[3]; uniforms.dx_hy_dz_dxdz2 = dataMaps[4]; uniforms.sx_sz_dxdx_dzdz2 = dataMaps[5]; } } export const OceanShader = { name: 'ocean', defines: {}, uniforms: { dx_hy_dz_dxdz0: null, sx_sz_dxdx_dzdz0: null, dx_hy_dz_dxdz1: null, sx_sz_dxdx_dzdz1: null, dx_hy_dz_dxdz2: null, sx_sz_dxdx_dzdz2: null, sizes: [0, 0, 0], croppinesses: [0, 0, 0], foamSpreading: 1.2, foamContrast: 7.2, // for shoreline tDepth: null, tNoise: null }, vertexShader: /* glsl */` attribute vec3 a_Position; uniform mat4 u_Model; uniform mat4 u_ProjectionView; #include #include #include uniform sampler2D dx_hy_dz_dxdz0; uniform sampler2D sx_sz_dxdx_dzdz0; uniform sampler2D dx_hy_dz_dxdz1; uniform sampler2D sx_sz_dxdx_dzdz1; uniform sampler2D dx_hy_dz_dxdz2; uniform sampler2D sx_sz_dxdx_dzdz2; uniform float sizes[3]; uniform float croppinesses[3]; uniform float foamSpreading; uniform float foamContrast; varying vec3 _position; varying vec2 _xz; vec3 getDisplacement(in vec2 xz) { vec2 uv0 = xz / sizes[0]; vec2 uv1 = xz / sizes[1]; vec2 uv2 = xz / sizes[2]; return texture2D(dx_hy_dz_dxdz0, uv0).xyz * vec3(croppinesses[0], 1.0, croppinesses[0]) + texture2D(dx_hy_dz_dxdz1, uv1).xyz * vec3(croppinesses[1], 1.0, croppinesses[1]) + texture2D(dx_hy_dz_dxdz2, uv2).xyz * vec3(croppinesses[2], 1.0, croppinesses[2]); } void main() { vec4 worldPosition = u_Model * vec4(a_Position, 1.0); _xz = worldPosition.xz; _position = worldPosition.xyz + getDisplacement(_xz); gl_Position = u_ProjectionView * vec4(_position, 1.0); #include } `, fragmentShader: /* glsl */` uniform vec3 u_CameraPosition; uniform samplerCube envMap; #include uniform sampler2D dx_hy_dz_dxdz0; uniform sampler2D sx_sz_dxdx_dzdz0; uniform sampler2D dx_hy_dz_dxdz1; uniform sampler2D sx_sz_dxdx_dzdz1; uniform sampler2D dx_hy_dz_dxdz2; uniform sampler2D sx_sz_dxdx_dzdz2; uniform float sizes[3]; uniform float croppinesses[3]; uniform float foamSpreading; uniform float foamContrast; #ifdef SHORELINE uniform mat4 u_Projection; uniform sampler2D tNoise; uniform sampler2D tDepth; #endif varying vec3 _position; varying vec2 _xz; vec4 jacobian(float dxdx, float dxdz, float dzdz) { float Jxx = 1.0 + dxdx; float Jxz = dxdz; float Jzz = 1.0 + dzdz; return vec4(Jxx, Jxz, Jxz, Jzz); } float det(vec4 jacobian) { return jacobian.x * jacobian.w - jacobian.y * jacobian.z; } vec3 getNormal(vec2 xz) { vec2 uv0 = xz / sizes[0]; vec2 uv1 = xz / sizes[1]; vec2 uv2 = xz / sizes[2]; vec4 _sx_sz_dxdx_dzdz0 = texture2D(sx_sz_dxdx_dzdz0, uv0).xyzw; vec4 _sx_sz_dxdx_dzdz1 = texture2D(sx_sz_dxdx_dzdz1, uv1).xyzw; vec4 _sx_sz_dxdx_dzdz2 = texture2D(sx_sz_dxdx_dzdz2, uv2).xyzw; float sx = _sx_sz_dxdx_dzdz0.x + _sx_sz_dxdx_dzdz1.x + _sx_sz_dxdx_dzdz2.x; float sz = _sx_sz_dxdx_dzdz0.y + _sx_sz_dxdx_dzdz1.y + _sx_sz_dxdx_dzdz2.y; float dxdx = _sx_sz_dxdx_dzdz0.z * croppinesses[0] + _sx_sz_dxdx_dzdz1.z * croppinesses[1] + _sx_sz_dxdx_dzdz2.z * croppinesses[2]; float dzdz = _sx_sz_dxdx_dzdz0.w * croppinesses[0] + _sx_sz_dxdx_dzdz1.w * croppinesses[1] + _sx_sz_dxdx_dzdz2.w * croppinesses[2]; vec2 slope = vec2(sx / (1.0 + dxdx), sz / (1.0 + dzdz)); return normalize(vec3(-slope.x, 1.0, -slope.y)); } float getFoam(vec2 xz) { vec2 uv0 = xz / sizes[0]; vec2 uv1 = xz / sizes[1]; vec2 uv2 = xz / sizes[2]; vec2 dxdx_dzdz0 = texture2D(sx_sz_dxdx_dzdz0, uv0).zw; vec2 dxdx_dzdz1 = texture2D(sx_sz_dxdx_dzdz1, uv1).zw; vec2 dxdx_dzdz2 = texture2D(sx_sz_dxdx_dzdz2, uv2).zw; float dxdz0 = texture2D(dx_hy_dz_dxdz0, uv0).w; float dxdz1 = texture2D(dx_hy_dz_dxdz1, uv1).w; float dxdz2 = texture2D(dx_hy_dz_dxdz2, uv2).w; vec2 dxdx_dzdz = dxdx_dzdz0 * croppinesses[0] + dxdx_dzdz1 * croppinesses[1] + dxdx_dzdz2 * croppinesses[2]; float dxdz = dxdz0 * croppinesses[0] + dxdz1 * croppinesses[1] + dxdz2 * croppinesses[2]; float val = det(jacobian(dxdx_dzdz.x, dxdz, dxdx_dzdz.y)); return abs(pow(-min(0.0, val - foamSpreading), foamContrast)); } vec3 gammaCorrection(const vec3 color) { return pow(color, vec3(1.0f / 2.2f)); } vec3 ACESFilm(vec3 x){ return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0); } float fresnelSchlick(vec3 view, vec3 normal){ float cosTheta = dot(normal, normalize(view)); float F0 = 0.02; return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); } vec3 surface(in vec3 normal, in vec3 view) { const vec3 upwelling = vec3(0.0, 0.2, 0.3); const vec3 mist = vec3(0.34, 0.42, 0.5); const float nShell = 1.34f; const float kDiffuse = 1.0f; const vec3 sunIndensity = vec3(0.42f, 0.39f, 0.19f) * 1.0e2; vec3 sunDir = normalize(vec3(1.0f, 1.0f, -10.0f)); vec3 ref = reflect(-view, normal); ref.y = max(ref.y, 1.0e-0); ref = normalize(ref); vec3 sky = ACESFilm(textureLod(envMap, ref, 0.0f).rgb) + pow(max(dot(ref, sunDir), 0.0f), 500.0f) * sunIndensity; sky = gammaCorrection(sky); // sky = vec3(0.69, 0.84, 1.0); float reflectivity; float costhetai = abs(dot(normal, normalize(view))); float thetai = acos(costhetai); float sinthetat = sin(thetai) / nShell; float thetat = asin(sinthetat); if(thetai == 0.0) { reflectivity = (nShell - 1.0f) / (nShell + 1.0f); reflectivity = reflectivity * reflectivity; } else { float fs = sin(thetat - thetai) / sin(thetat + thetai); float ts = tan(thetat - thetai) / tan(thetat + thetai); reflectivity = 0.5 * (fs * fs + ts * ts ); } // reflectivity = fresnelSchlick(view,normal); float falloff = 1.0f; // min(exp(-(length(view) - 1000.0f) * 1.0e-2), 1.0f) * kDiffuse; vec3 surf = reflectivity * sky + (1.0f - reflectivity) * upwelling; return falloff * surf + (1.0f - falloff) * mist; } void main() { float f = getFoam(_xz); vec3 n = getNormal(_xz); float a = 1.0; #ifdef SHORELINE mat4 projectionInv = inverseMat4(u_Projection); ivec2 depthSize = textureSize(tDepth, 0); vec2 screenUV = gl_FragCoord.xy / vec2(depthSize); float depth = texture2D(tDepth, screenUV).r * 2.0 - 1.0; vec4 projectedPos = vec4(screenUV * 2.0 - 1.0, depth, 1.0); vec4 pos = projectionInv * projectedPos; vec3 rayOrigin = pos.xyz / pos.w; vec4 waterProjectedPos = vec4(screenUV * 2.0 - 1.0, gl_FragCoord.z * 2.0 - 1.0, 1.0); vec4 waterPos = projectionInv * waterProjectedPos; vec3 waterViewPos = waterPos.xyz / waterPos.w; float realDist = distance(rayOrigin, waterViewPos); // Shore Waves vec3 dPosDx = dFdx(_position); vec3 dPosDy = dFdy(_position); float dDistDx = dFdx(realDist); float dDistDy = dFdy(realDist); vec3 rawGrad = dPosDx * dDistDx + dPosDy * dDistDy; vec3 distGrad = length(rawGrad) > 1e-5 ? normalize(rawGrad) : vec3(0.0); float _uTime = 0.0; float shoreWaveSpeed = 1.0; float phase = 2.0 * pow(max(realDist, 0.0), 0.8) + _uTime * shoreWaveSpeed; float waveVal = sin(phase); float dPhase = 1.6 * pow(max(realDist, 0.1), -0.2); float waveHeight = exp(waveVal - 1.0); float waveSlope = waveHeight * cos(phase) * dPhase; float shoreMask = 1.0 - smoothstep(0.0, 30.0, realDist); vec3 waveNormal = -distGrad * waveSlope * 0.8 * shoreMask; n = normalize(n + waveNormal); float _NoiseScale = 3.0; float _EdgeSpeed = 0.9; float _EdgeAmount = 1.0; float _EdgeFoamDepth = 8.0; vec2 samplerUV = vec2(_uTime * 0.1, 0.0); float distortNoise = texture2D(tNoise, _xz / _NoiseScale + samplerUV).r * 2.3; float edgeFoamMask = 1.0 - smoothstep(0.0, _EdgeFoamDepth, realDist); edgeFoamMask = clamp(sin((edgeFoamMask - _uTime * _EdgeSpeed) * 3.14159 * _EdgeAmount), 0.0, 1.0) * edgeFoamMask * distortNoise; f = max(f, edgeFoamMask); float _DepthDensity = 0.1; a = 1.0 - exp(-_DepthDensity * realDist); a = mix(a, 1.0, clamp(f, 0.0, 0.4)); #endif const vec3 foam = vec3(1.0f); vec3 water = surface(n, u_CameraPosition - _position); gl_FragColor = vec4(mix(water, foam, f), a); } ` }; ================================================ FILE: examples/jsm/ocean/Utils.js ================================================ import { Texture2D, PIXEL_TYPE, TEXTURE_WRAP, TEXTURE_FILTER, PIXEL_FORMAT } from 't3d'; export function createFloat4Texture(width, height, filtering = TEXTURE_FILTER.NEAREST, mode = TEXTURE_WRAP.REPEAT) { const texture = new Texture2D(); texture.image = { width, height, data: null }; texture.minFilter = filtering; texture.magFilter = filtering; texture.wrapS = mode; texture.wrapT = mode; texture.type = PIXEL_TYPE.FLOAT; texture.format = PIXEL_FORMAT.RGBA; texture.internalformat = PIXEL_FORMAT.RGBA32F; texture.generateMipmaps = false; texture.flipY = false; return texture; } export function createFloat2Texture(width, height, filtering = TEXTURE_FILTER.NEAREST, mode = TEXTURE_WRAP.REPEAT) { const texture = new Texture2D(); texture.image = { width, height, data: null }; texture.minFilter = filtering; texture.magFilter = filtering; texture.wrapS = mode; texture.wrapT = mode; texture.type = PIXEL_TYPE.FLOAT; texture.format = PIXEL_FORMAT.RG; texture.internalformat = PIXEL_FORMAT.RG32F; texture.generateMipmaps = false; texture.flipY = false; texture.unpackAlignment = 1; return texture; } ================================================ FILE: examples/jsm/ocean/index.js ================================================ export { OceanFieldBuilder } from './OceanFieldBuilder.js'; export * from './OceanMaterial.js'; ================================================ FILE: examples/jsm/ocean/shaders/FFT2HShader.js ================================================ // Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Ffft2-h.ts export const FFT2HShader = { name: 'ocean_fft2_h', defines: {}, uniforms: { spectrum0: null, spectrum1: null, spectrum2: null, spectrum3: null, spectrum4: null, spectrum5: null, butterfly: null, phase: 0 }, vertexShader: /* glsl */` attribute vec3 a_Position; void main() { gl_Position = vec4(a_Position, 1.0); } `, fragmentShader: /* glsl */` uniform sampler2D spectrum0; uniform sampler2D spectrum1; uniform sampler2D spectrum2; uniform sampler2D spectrum3; uniform sampler2D spectrum4; uniform sampler2D spectrum5; uniform sampler2D butterfly; uniform int phase; struct complex { float re; float im; }; complex add(complex a, complex b) { return complex(a.re + b.re, a.im + b.im); } complex mult(complex a, complex b) { return complex(a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re); } complex scale(complex a, float v) { return complex(a.re * v, a.im * v); } vec2 twiddleXY(in sampler2D source, in vec4 texelButt) { vec4 texelA = texelFetch(source, ivec2(texelButt.b, gl_FragCoord.y), 0).xyzw; vec4 texelB = texelFetch(source, ivec2(texelButt.a, gl_FragCoord.y), 0).xyzw; complex a = complex(texelA.x, texelA.y); complex b = complex(texelB.x, texelB.y); complex w = complex(texelButt.r, texelButt.g); complex r = scale(add(a, mult(b, w)), 0.5); return vec2(r.re, r.im); } vec2 twiddleZW(in sampler2D source, in vec4 texelButt) { vec4 texelA = texelFetch(source, ivec2(texelButt.b, gl_FragCoord.y), 0).xyzw; vec4 texelB = texelFetch(source, ivec2(texelButt.a, gl_FragCoord.y), 0).xyzw; complex a = complex(texelA.z, texelA.w); complex b = complex(texelB.z, texelB.w); complex w = complex(texelButt.r, texelButt.g); complex r = scale(add(a, mult(b, w)), 0.5); return vec2(r.re, r.im); } void main() { vec4 texelButt = texelFetch(butterfly, ivec2(phase, gl_FragCoord.x), 0).rgba; gl_FragData[0] = vec4(twiddleXY(spectrum0, texelButt), twiddleZW(spectrum0, texelButt)); //ifft0 gl_FragData[1] = vec4(twiddleXY(spectrum1, texelButt), twiddleZW(spectrum1, texelButt)); //ifft1 gl_FragData[2] = vec4(twiddleXY(spectrum2, texelButt), twiddleZW(spectrum2, texelButt)); //ifft2 gl_FragData[3] = vec4(twiddleXY(spectrum3, texelButt), twiddleZW(spectrum3, texelButt)); //ifft3 gl_FragData[4] = vec4(twiddleXY(spectrum4, texelButt), twiddleZW(spectrum4, texelButt)); //ifft4 gl_FragData[5] = vec4(twiddleXY(spectrum5, texelButt), twiddleZW(spectrum5, texelButt)); //ifft5 } ` }; ================================================ FILE: examples/jsm/ocean/shaders/FFT2VShader.js ================================================ // Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Ffft2-v.ts export const FFT2VShader = { name: 'ocean_fft2_v', defines: {}, uniforms: { spectrum0: null, spectrum1: null, spectrum2: null, spectrum3: null, spectrum4: null, spectrum5: null, butterfly: null, phase: 0 }, vertexShader: /* glsl */` attribute vec3 a_Position; void main() { gl_Position = vec4(a_Position, 1.0); } `, fragmentShader: /* glsl */` uniform sampler2D spectrum0; uniform sampler2D spectrum1; uniform sampler2D spectrum2; uniform sampler2D spectrum3; uniform sampler2D spectrum4; uniform sampler2D spectrum5; uniform sampler2D butterfly; uniform int phase; struct complex { float re; float im; }; complex add(complex a, complex b) { return complex(a.re + b.re, a.im + b.im); } complex mult(complex a, complex b) { return complex(a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re); } complex scale(complex a, float v) { return complex(a.re * v, a.im * v); } vec2 twiddleXY(in sampler2D source, in vec4 texelButt) { vec4 texelA = texelFetch(source, ivec2(gl_FragCoord.x, texelButt.b), 0).xyzw; vec4 texelB = texelFetch(source, ivec2(gl_FragCoord.x, texelButt.a), 0).xyzw; complex a = complex(texelA.x, texelA.y); complex b = complex(texelB.x, texelB.y); complex w = complex(texelButt.r, texelButt.g); complex r = scale(add(a, mult(b, w)), 0.5); return vec2(r.re, r.im); } vec2 twiddleZW(in sampler2D source, in vec4 texelButt) { vec4 texelA = texelFetch(source, ivec2(gl_FragCoord.x, texelButt.b), 0).xyzw; vec4 texelB = texelFetch(source, ivec2(gl_FragCoord.x, texelButt.a), 0).xyzw; complex a = complex(texelA.z, texelA.w); complex b = complex(texelB.z, texelB.w); complex w = complex(texelButt.r, texelButt.g); complex r = scale(add(a, mult(b, w)), 0.5); return vec2(r.re, r.im); } void main() { vec4 texelButt = texelFetch(butterfly, ivec2(phase, gl_FragCoord.y), 0).rgba; gl_FragData[0] = vec4(twiddleXY(spectrum0, texelButt), twiddleZW(spectrum0, texelButt)); //ifft0 gl_FragData[1] = vec4(twiddleXY(spectrum1, texelButt), twiddleZW(spectrum1, texelButt)); //ifft1 gl_FragData[2] = vec4(twiddleXY(spectrum2, texelButt), twiddleZW(spectrum2, texelButt)); //ifft2 gl_FragData[3] = vec4(twiddleXY(spectrum3, texelButt), twiddleZW(spectrum3, texelButt)); //ifft3 gl_FragData[4] = vec4(twiddleXY(spectrum4, texelButt), twiddleZW(spectrum4, texelButt)); //ifft4 gl_FragData[5] = vec4(twiddleXY(spectrum5, texelButt), twiddleZW(spectrum5, texelButt)); //ifft5 } ` }; ================================================ FILE: examples/jsm/ocean/shaders/H0Shader.js ================================================ // Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Fh0.ts export const H0Shader = { name: 'ocean_fft_h0', defines: {}, uniforms: { noise: null, resolution: 0, wind: [0, 0], alignment: 0, cascades: [ { size: 0, strength: 0, minK: 0, maxK: 0 }, { size: 0, strength: 0, minK: 0, maxK: 0 }, { size: 0, strength: 0, minK: 0, maxK: 0 } ] }, vertexShader: /* glsl */` attribute vec3 a_Position; void main() { gl_Position = vec4(a_Position, 1.0); } `, fragmentShader: /* glsl */` #define PI2 6.2831853071 #define g 9.81 uniform sampler2D noise; uniform int resolution; // N uniform vec2 wind; uniform float alignment; uniform struct FieldCascade { float size; float strength; float minK; float maxK; } cascades[3]; vec4 gauss() { vec2 uv = vec2(ivec2(gl_FragCoord.xy)) / float(resolution); vec2 noise0 = texture2D(noise, uv).rg; vec2 noise1 = texture2D(noise, -uv).rg; float u0 = 2.0 * PI * noise0.x; float v0 = sqrt(-2.0 * log(noise0.y)); float u1 = 2.0 * PI * noise1.x; float v1 = sqrt(-2.0 * log(noise1.y)); return vec4(v0 * cos(u0), v0 * sin(u0), v1 * cos(u1), -v1 * sin(u1)); } vec4 phillips(in vec2 k, float A, float minK, float maxK) { float k2 = dot(k, k); if(k2 <= minK * minK || k2 >= maxK * maxK) { return vec4(0.0); } float L = dot(wind, wind) / g; float L2 = L * L; float h0k = (A / k2 / k2) * exp(-1.0 / (k2 * L2)) * 0.5, h0mk = h0k; if(alignment > 0.0) { h0k *= pow(max(0.0, dot(normalize(wind), normalize(k))), alignment); h0mk *= pow(max(0.0, dot(normalize(wind), normalize(-k))), alignment); } return sqrt(vec4(h0k, h0k, h0mk, h0mk)); } void main() { vec2 x = vec2(ivec2(gl_FragCoord.xy) - ivec2(resolution / 2)); // [-N/2, N/2] vec2 k = vec2(PI2) * x; vec4 rnd = gauss(); gl_FragData[0] = phillips(k / cascades[0].size, cascades[0].strength, cascades[0].minK, cascades[0].maxK) * rnd; gl_FragData[1] = phillips(k / cascades[1].size, cascades[1].strength, cascades[1].minK, cascades[1].maxK) * rnd; gl_FragData[2] = phillips(k / cascades[2].size, cascades[2].strength, cascades[2].minK, cascades[2].maxK) * rnd; } ` }; ================================================ FILE: examples/jsm/ocean/shaders/HkShader.js ================================================ // Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Fhk.ts export const HkShader = { name: 'ocean_fft_hk', defines: {}, uniforms: { resolution: 256, sizes: [0, 0, 0] }, vertexShader: /* glsl */` attribute vec3 a_Position; void main() { gl_Position = vec4(a_Position, 1.0); } `, fragmentShader: /* glsl */` #define g 9.81 uniform int resolution; // N uniform float sizes[3]; // L uniform float t; uniform sampler2D h0Texture0; uniform sampler2D h0Texture1; uniform sampler2D h0Texture2; // -- struct complex { float re; float im; }; const complex i = complex(0.0, 1.0); complex add(complex a, complex b) { return complex(a.re + b.re, a.im + b.im); } complex mult(complex a, complex b) { return complex(a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re); } complex eix(float x) { return complex(cos(x), sin(x)); } complex conj(complex a) { return complex(a.re, -a.im); } complex scale(complex v, float s) { return complex(v.re * s, v.im * s); } complex negate(complex v) { return complex(-v.re, -v.im); } const float RATIO = 0.618033989036; // -- struct spectrum { complex dx; complex hy; complex dz; complex sx; complex sz; complex dxdx; complex dxdz; complex dzdz; }; spectrum getSpectrum(in sampler2D h0Texture, in vec2 x, float size) { complex hy = complex(0.0, 0.0); complex sx = complex(0.0, 0.0); complex sz = complex(0.0, 0.0); complex dx = complex(0.0, 0.0); complex dz = complex(0.0, 0.0); complex dxdx = complex(0.0, 0.0); complex dzdz = complex(0.0, 0.0); complex dxdz = complex(0.0, 0.0); if(size <= 1.0e-3) { return spectrum(dx, hy, dz, sx, sz, dxdx, dxdz, dzdz); } vec2 k = vec2(2.0 * PI * x.x / size, 2.0 * PI * x.y / size); float kLen = length(k); if(kLen > 1.0e-6) { float w = sqrt(g * kLen); vec4 h0Texel = texelFetch(h0Texture, ivec2(gl_FragCoord.xy), 0).rgba; complex e = eix(w * t); complex h0 = complex(h0Texel.x, h0Texel.y); complex h0MinConj = complex(h0Texel.z, h0Texel.w); hy = add(mult(h0, e), mult(h0MinConj, conj(e))); if(int(gl_FragCoord.x) != 0) { sx = mult(complex(0.0, k.x), hy); dx = mult(complex(0.0, -k.x / kLen), hy); dxdx = scale(hy, k.x * k.x / kLen); } if(int(gl_FragCoord.y) != 0) { sz = mult(complex(0.0, k.y), hy); dz = mult(complex(0.0, -k.y / kLen), hy); dzdz = scale(hy, k.y * k.y / kLen); if(int(gl_FragCoord.x) != 0) { dxdz = scale(hy, k.y * k.x / kLen); } } } return spectrum(dx, hy, dz, sx, sz, dxdx, dxdz, dzdz); } void compressSpectrum(in spectrum spec, out vec4 part0, out vec4 part1) { complex dx_hy = add(spec.dx, mult(i, spec.hy)); complex dz_dxdz = add(spec.dz, mult(i, spec.dxdz)); complex sx_sz = add(spec.sx, mult(i, spec.sz)); complex dxdx_dzdz = add(spec.dxdx, mult(i, spec.dzdz)); part0 = vec4(dx_hy.re, dx_hy.im, dz_dxdz.re, dz_dxdz.im); part1 = vec4(sx_sz.re, sx_sz.im, dxdx_dzdz.re, dxdx_dzdz.im); } void main() { vec2 x = vec2(ivec2(gl_FragCoord.xy) - ivec2(resolution / 2)); // [-N/2, N/2) spectrum spec0 = getSpectrum(h0Texture0, x, sizes[0]); spectrum spec1 = getSpectrum(h0Texture1, x, sizes[1]); spectrum spec2 = getSpectrum(h0Texture2, x, sizes[2]); compressSpectrum(spec0, gl_FragData[0], gl_FragData[1]); compressSpectrum(spec1, gl_FragData[2], gl_FragData[3]); compressSpectrum(spec2, gl_FragData[4], gl_FragData[5]); } ` }; ================================================ FILE: examples/jsm/ocean/shaders/PostFFT2Shader.js ================================================ // Reference: https://stackblitz.com/edit/fft-2d?file=ocean%2Fprograms%2Fpost-fft2.ts export const PostFFT2Shader = { name: 'ocean_fft2_post', defines: {}, uniforms: { N2: 1.0, ifft0: null, ifft1: null, ifft2: null, ifft3: null, ifft4: null, ifft5: null }, vertexShader: /* glsl */` attribute vec3 a_Position; void main() { gl_Position = vec4(a_Position, 1.0); } `, fragmentShader: /* glsl */` uniform float N2; uniform sampler2D ifft0; // dx_hy_dz_dxdz uniform sampler2D ifft1; // sx_sz_dxdx_dzdz uniform sampler2D ifft2; // dx_hy_dz_dxdz uniform sampler2D ifft3; // sx_sz_dxdx_dzdz uniform sampler2D ifft4; // dx_hy_dz_dxdz uniform sampler2D ifft5; // sx_sz_dxdx_dzdz void main() { const float sign[] = float[2](1.0, -1.0); float p = float(int(gl_FragCoord.x) + int(gl_FragCoord.y)); float s = sign[int(mod(p, 2.0))]; float m = s * N2; ivec2 uv = ivec2(gl_FragCoord.xy); gl_FragData[0] = texelFetch(ifft0, uv, 0).rgba * m; //dx_hy_dz_dxdz0 gl_FragData[1] = texelFetch(ifft1, uv, 0).rgba * m; //sx_sz_dxdx_dzdz0 gl_FragData[2] = texelFetch(ifft2, uv, 0).rgba * m; //dx_hy_dz_dxdz1 gl_FragData[3] = texelFetch(ifft3, uv, 0).rgba * m; //sx_sz_dxdx_dzdz1 gl_FragData[4] = texelFetch(ifft4, uv, 0).rgba * m; //dx_hy_dz_dxdz2 gl_FragData[5] = texelFetch(ifft5, uv, 0).rgba * m; //sx_sz_dxdx_dzdz2 } ` }; ================================================ FILE: examples/jsm/pass/BlurPass.js ================================================ import { ShaderPostPass } from 't3d'; import { BlurShader } from '../shaders/BlurShader.js'; class BlurPass extends ShaderPostPass { constructor() { super(BlurShader); this.setKernelSize(5); } setKernelSize(val) { if (val == 13) { this.material.defines['KERNEL_SIZE_INT'] = 13; this.material.defines['KERNEL_SIZE_FLOAT'] = '13.0'; this.uniforms['kernel'] = [0.02, 0.03, 0.06, 0.08, 0.11, 0.13, 0.14, 0.13, 0.11, 0.08, 0.06, 0.03, 0.02]; } else if (val == 9) { this.material.defines['KERNEL_SIZE_INT'] = 9; this.material.defines['KERNEL_SIZE_FLOAT'] = '9.0'; this.uniforms['kernel'] = [0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07]; } else { this.material.defines['KERNEL_SIZE_INT'] = 5; this.material.defines['KERNEL_SIZE_FLOAT'] = '5.0'; this.uniforms['kernel'] = [0.122581, 0.233062, 0.288713, 0.233062, 0.122581]; } } } export { BlurPass }; ================================================ FILE: examples/jsm/pass/DepthPeelingOITPass.js ================================================ import { ShaderPostPass, OffscreenRenderTarget, Texture2D, ATTACHMENT, TEXTURE_FILTER, PIXEL_TYPE, BLEND_FACTOR, BLEND_TYPE, BLEND_EQUATION, ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d'; // TODO: Share depth attachment with opaque render target class DepthPeelingOITPass { constructor(width, height) { this._renderTarget1 = OffscreenRenderTarget.create2D(width, height); this._renderTarget2 = OffscreenRenderTarget.create2D(width, height); // 0: depth range, 1: front color, 2: back color this._renderTarget1.attach(createFloatColorTexture(), ATTACHMENT.COLOR_ATTACHMENT0); this._renderTarget1.attach(createFloatColorTexture(PIXEL_TYPE.HALF_FLOAT), ATTACHMENT.COLOR_ATTACHMENT1); this._renderTarget1.attach(createFloatColorTexture(PIXEL_TYPE.HALF_FLOAT), ATTACHMENT.COLOR_ATTACHMENT2); this._renderTarget2.attach(createFloatColorTexture(), ATTACHMENT.COLOR_ATTACHMENT0); this._renderTarget2.attach(createFloatColorTexture(PIXEL_TYPE.HALF_FLOAT), ATTACHMENT.COLOR_ATTACHMENT1); this._renderTarget2.attach(createFloatColorTexture(PIXEL_TYPE.HALF_FLOAT), ATTACHMENT.COLOR_ATTACHMENT2); this._depthClearRenderTarget1 = OffscreenRenderTarget.create2D(width, height); this._depthClearRenderTarget1.attach(this._renderTarget1._attachments[ATTACHMENT.COLOR_ATTACHMENT0], ATTACHMENT.COLOR_ATTACHMENT0); this._depthClearRenderTarget1.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this._depthClearRenderTarget2 = OffscreenRenderTarget.create2D(width, height); this._depthClearRenderTarget2.attach(this._renderTarget2._attachments[ATTACHMENT.COLOR_ATTACHMENT0], ATTACHMENT.COLOR_ATTACHMENT0); this._depthClearRenderTarget2.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this._backBlendRenderTarget = OffscreenRenderTarget.create2D(width, height); this._backBlendPass = new ShaderPostPass(DepthPeelingBackBlendShader); this._backBlendPass.material.transparent = true; this._backBlendPass.material.blending = BLEND_TYPE.CUSTOM; this._backBlendPass.material.blendEquationAlpha = BLEND_EQUATION.ADD; this._backBlendPass.material.blendEquation = BLEND_EQUATION.ADD; this._backBlendPass.material.blendSrc = BLEND_FACTOR.SRC_ALPHA; this._backBlendPass.material.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; this._backBlendPass.material.blendSrcAlpha = BLEND_FACTOR.ONE; this._backBlendPass.material.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; this._mixPass = new ShaderPostPass(DepthPeelingMixShader); this._mixPass.material.transparent = true; this._mixPass.material.blending = BLEND_TYPE.CUSTOM; this._mixPass.material.blendEquationAlpha = BLEND_EQUATION.ADD; this._mixPass.material.blendEquation = BLEND_EQUATION.ADD; this._mixPass.material.blendSrc = BLEND_FACTOR.ONE; this._mixPass.material.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; this._mixPass.material.blendSrcAlpha = BLEND_FACTOR.ONE; this._mixPass.material.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; this._mixPass.uniforms.uFrontColor = this._renderTarget2._attachments[ATTACHMENT.COLOR_ATTACHMENT1]; this._mixPass.uniforms.uBackColor = this._backBlendRenderTarget._attachments[ATTACHMENT.COLOR_ATTACHMENT0]; const renderInfos = { index: 0, frontColorTexture: null, depthPeelingTexture: null }; this._renderInfos = renderInfos; this._renderOptions = { getMaterial: function(renderable) { const material = renderable.material; material.uniforms.frist = renderInfos.index + 1; material.uniforms.uFrontColor = renderInfos.frontColorTexture; material.uniforms.uDepth = renderInfos.depthPeelingTexture; return material; } }; this.loop = 4; } setOutputEncoding(encoidng) { this._renderTarget1.texture.encoding = encoidng; this._renderTarget2.texture.encoding = encoidng; } resize(width, height) { this._renderTarget1.resize(width, height); this._renderTarget2.resize(width, height); this._depthClearRenderTarget1.resize(width, height); this._depthClearRenderTarget2.resize(width, height); this._backBlendRenderTarget.resize(width, height); } dispose() { this._renderTarget1.dispose(); this._renderTarget2.dispose(); this._depthClearRenderTarget1.dispose(); this._depthClearRenderTarget2.dispose(); this._backBlendRenderTarget.dispose(); this._backBlendPass.dispose(); this._mixPass.dispose(); } renderBuffer(renderer, scene, camera) { this._renderTarget1 .setColorClearValue(0, 0, 0, 0) .setClear(true, false, false); renderer.beginRender(this._renderTarget1); renderer.endRender(); this._renderTarget2 .setColorClearValue(0, 0, 0, 0) .setClear(true, false, false); renderer.beginRender(this._renderTarget2); renderer.endRender(); this._depthClearRenderTarget1 .setColorClearValue(-99999, -99999, 0, 0) .setClear(true, false, false); renderer.beginRender(this._depthClearRenderTarget1); renderer.endRender(); this._depthClearRenderTarget2 .setColorClearValue(-99999, -99999, 0, 0) .setClear(true, false, false); renderer.beginRender(this._depthClearRenderTarget2); renderer.endRender(); for (let i = 0; i < this.loop; i++) { const writeRenderTarget = i % 2 === 0 ? this._renderTarget1 : this._renderTarget2; const depthClearRenderTarget = i % 2 === 0 ? this._depthClearRenderTarget1 : this._depthClearRenderTarget2; const readRenderTarget = i % 2 === 0 ? this._renderTarget2 : this._renderTarget1; // clear write render target writeRenderTarget.setClear(true, false, false); renderer.beginRender(writeRenderTarget); renderer.endRender(); renderer.beginRender(depthClearRenderTarget); renderer.endRender(); // render write render target const renderStates = scene.getRenderStates(camera); const renderQueue = scene.getRenderQueue(camera); const renderOptions = this._renderOptions; this._renderInfos.index = i; this._renderInfos.frontColorTexture = readRenderTarget._attachments[ATTACHMENT.COLOR_ATTACHMENT1]; this._renderInfos.depthPeelingTexture = readRenderTarget._attachments[ATTACHMENT.COLOR_ATTACHMENT0]; writeRenderTarget.setClear(false, false, false); renderer.beginRender(writeRenderTarget); let renderQueueLayer; for (let j = 0, l = renderQueue.layerList.length; j < l; j++) { renderQueueLayer = renderQueue.layerList[j]; renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions); } renderer.endRender(); // accumulate back color this._backBlendPass.uniforms.uBackColor = writeRenderTarget._attachments[ATTACHMENT.COLOR_ATTACHMENT2]; this._backBlendRenderTarget.setClear(i === 0, false, false); this._backBlendPass.render(renderer, this._backBlendRenderTarget); } } render(renderer, renderTarget) { this._mixPass.render(renderer, renderTarget); } } function createFloatColorTexture(type = PIXEL_TYPE.FLOAT) { const texture = new Texture2D(); texture.type = type; texture.minFilter = TEXTURE_FILTER.NEAREST; texture.magFilter = TEXTURE_FILTER.NEAREST; texture.generateMipmaps = false; return texture; } /** Shaders */ const DepthPeelingBackBlendShader = { name: 'dp_oit_back_blend', uniforms: { uBackColor: null }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D uBackColor; varying vec2 v_Uv; void main() { gl_FragColor = texture2D(uBackColor, v_Uv); if (gl_FragColor.a == 0.0) { discard; } } ` }; const DepthPeelingMixShader = { name: 'dp_oit_mix', uniforms: { uFrontColor: null, uBackColor: null }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D uFrontColor; uniform sampler2D uBackColor; varying vec2 v_Uv; void main() { vec4 frontColor = texture2D(uFrontColor, v_Uv); vec4 backColor = texture2D(uBackColor, v_Uv); float alphaMultiplier = 1.0 - frontColor.a; gl_FragColor = vec4(frontColor.rgb + alphaMultiplier * backColor.rgb, frontColor.a + backColor.a); } ` }; /** DepthPeelingOITMaterial */ class DepthPeelingOITMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.depthTest = false; this.depthWrite = false; this.transparent = true; this.blending = BLEND_TYPE.CUSTOM; this.blendEquationAlpha = BLEND_EQUATION.MAX; this.blendEquation = BLEND_EQUATION.MAX; this.blendSrc = BLEND_FACTOR.ONE; this.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; this.blendSrcAlpha = BLEND_FACTOR.ONE; this.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; this.shaderName = 'dp_oit_mat'; this.vertexShader = ShaderLib.pbr_vert; this.fragmentShader = fragmentShader; this.uniforms = { uFrontColor: null, uDepth: null, frist: 1 }; } } let fragmentShader = ShaderLib.pbr_frag; fragmentShader = fragmentShader.replace( '#include ', ` #include uniform sampler2D uDepth; uniform sampler2D uFrontColor; uniform float frist; #define MAX_DEPTH 99999.0 ` ); fragmentShader = fragmentShader.replace( '#include ', ` ivec2 fragCoord = ivec2(gl_FragCoord.xy); vec2 lastDepth; if (frist == 1.0) { lastDepth = vec2(0., 1.0); }else{ lastDepth = texelFetch(uDepth, fragCoord, 0).rg; } vec4 lastFrontColor = texelFetch(uFrontColor, fragCoord, 0); // depth value always increases // so we can use MAX blend equation gl_FragData[0].rg = vec2(-MAX_DEPTH); // front color always increases // so we can use MAX blend equation gl_FragData[1] = lastFrontColor; // back color is separately blend afterwards each pass gl_FragData[2] = vec4(0.0); float nearestDepth = -lastDepth.x; float furthestDepth = lastDepth.y; float alphaMultiplier = 1.0 - lastFrontColor.a; if (gl_FragCoord.z < nearestDepth || gl_FragCoord.z > furthestDepth) { // Skip this depth since it's been peeled. return; } if (gl_FragCoord.z > nearestDepth && gl_FragCoord.z < furthestDepth) { // This needs to be peeled. // The ones remaining after MAX blended for // all need-to-peel will be peeled next pass. pc_fragData0 = vec4(-gl_FragCoord.z, gl_FragCoord.z, 0.0, 1.0); return; } #include ` ); fragmentShader = fragmentShader.replace( '#include ', ` vec4 gl_FragColor = outColor; ` ); fragmentShader = fragmentShader.replace( '#include ', ` #include // dual depth peeling // write to back and front color buffer if (gl_FragCoord.z == nearestDepth) { pc_fragData1.rgb += gl_FragColor.rgb * gl_FragColor.a * alphaMultiplier; pc_fragData1.a = 1.0 - alphaMultiplier * (1.0 - gl_FragColor.a); } else { pc_fragData2 += gl_FragColor; } ` ); export { DepthPeelingOITPass, DepthPeelingOITMaterial }; ================================================ FILE: examples/jsm/pass/SSAOPass.js ================================================ import { ShaderPostPass, Texture2D, Vector3, PIXEL_TYPE, TEXTURE_FILTER, TEXTURE_WRAP } from 't3d'; import { SSAOShader } from '../shaders/SSAOShader.js'; class SSAOPass extends ShaderPostPass { constructor() { super(SSAOShader); this._kernels = {}; this.setNoiseSize(4); this.setKernelSize(12); // 12 } setKernelSize(size, offset) { offset = (offset !== undefined) ? offset : 0; const code = size + '_' + offset; if (!this._kernels[code]) { this._kernels[code] = generateKernel(size, offset * size); } this.material.defines['KERNEL_SIZE'] = size; this.material.uniforms['kernel'] = this._kernels[code]; } setNoiseSize(size) { let texture = this.material.uniforms['noiseTex']; if (!texture) { texture = generateNoiseTexture(size); this.material.uniforms['noiseTex'] = texture; } else { texture.image.data = generateNoiseData(size); texture.image.width = size; texture.image.height = size; texture.version++; } this.material.uniforms['noiseTexSize'] = [size, size]; } } function generateNoiseData(size) { const data = new Uint8Array(size * size * 4); let n = 0; const v3 = new Vector3(); for (let i = 0; i < size; i++) { for (let j = 0; j < size; j++) { v3.set(Math.random() * 2 - 1, Math.random() * 2 - 1, 0).normalize(); data[n++] = (v3.x * 0.5 + 0.5) * 255; data[n++] = (v3.y * 0.5 + 0.5) * 255; data[n++] = 0; data[n++] = 255; } } return data; } function generateNoiseTexture(size) { const texture = new Texture2D(); texture.image = { data: generateNoiseData(size), width: size, height: size }; texture.type = PIXEL_TYPE.UNSIGNED_BYTE; texture.magFilter = TEXTURE_FILTER.NEAREST; texture.minFilter = TEXTURE_FILTER.NEAREST; texture.wrapS = TEXTURE_WRAP.REPEAT; texture.wrapT = TEXTURE_WRAP.REPEAT; texture.generateMipmaps = false; texture.flipY = false; texture.version++; return texture; } // https://en.wikipedia.org/wiki/Halton_sequence halton sequence. function halton(index, base) { let result = 0; let f = 1 / base; let i = index; while (i > 0) { result = result + f * (i % base); i = Math.floor(i / base); f = f / base; } return result; } function generateKernel(size, offset) { const kernel = new Float32Array(size * 3); offset = offset || 0; for (let i = 0; i < size; i++) { const phi = halton(i + offset, 2) * Math.PI; const theta = halton(i + offset, 3) * Math.PI; const r = Math.random(); const x = Math.cos(phi) * Math.sin(theta) * r; const y = Math.cos(theta) * r; const z = Math.sin(phi) * Math.sin(theta) * r; kernel[i * 3] = x; kernel[i * 3 + 1] = y; kernel[i * 3 + 2] = z; } return kernel; } export { SSAOPass }; ================================================ FILE: examples/jsm/pass/UnrealBloomPass.js ================================================ import { BLEND_TYPE, ShaderPostPass, OffscreenRenderTarget, TEXTURE_FILTER, PIXEL_TYPE, PIXEL_FORMAT, ATTACHMENT } from 't3d'; import { CopyShader } from '../shaders/CopyShader.js'; import { LuminosityHighPassShader } from '../shaders/LuminosityHighPassShader.js'; /** * UnrealBloomPass is inspired by the bloom pass of Unreal Engine. It creates a * mip map chain of bloom textures and blurs them with different radii. Because * of the weighted combination of mips, and because larger blurs are done on * higher mips, this effect provides good quality and performance. * * Reference: * - https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/ */ class UnrealBloomPass { constructor(width, height) { this.tDiffuse = null; this.threshold = 0; this.strength = 1; this.radius = 0; this.toneMappingExposure = 1.; this.highlightPass = new ShaderPostPass(LuminosityHighPassShader); this.tempRenderTarget = createTempRenderTarget(width, height); // this.separableBlurPasses = []; for (let i = 0; i < 5; i++) { const kernelRadius = kernelSizeArray[i]; const seperableBlurPass = new ShaderPostPass(seperableBlurShader); seperableBlurPass.material.defines.KERNEL_RADIUS = kernelRadius; for (let i = 0; i < kernelRadius; i++) { seperableBlurPass.uniforms.gaussianCoefficients.push( 0.39894 * Math.exp(-0.5 * i * i / (kernelRadius * kernelRadius)) / kernelRadius ); } this.separableBlurPasses.push(seperableBlurPass); } this.renderTargetsHorizontal = []; this.renderTargetsVertical = []; let resx = Math.round(width / 2); let resy = Math.round(height / 2); for (let i = 0; i < 5; i++) { const renderTargetHorizonal = createTempRenderTarget(resx, resy); this.renderTargetsHorizontal.push(renderTargetHorizonal); const renderTargetVertical = createTempRenderTarget(resx, resy); this.renderTargetsVertical.push(renderTargetVertical); this.separableBlurPasses[i].uniforms.invSize[0] = 1 / resx; this.separableBlurPasses[i].uniforms.invSize[1] = 1 / resy; resx = Math.round(resx / 2); resy = Math.round(resy / 2); } this.compositePass = new ShaderPostPass(compositeShader); this.compositePass.uniforms.blurTexture1 = this.renderTargetsVertical[0].texture; this.compositePass.uniforms.blurTexture2 = this.renderTargetsVertical[1].texture; this.compositePass.uniforms.blurTexture3 = this.renderTargetsVertical[2].texture; this.compositePass.uniforms.blurTexture4 = this.renderTargetsVertical[3].texture; this.compositePass.uniforms.blurTexture5 = this.renderTargetsVertical[4].texture; this.copyPass = new ShaderPostPass(CopyShader); this.copyPass.material.blending = BLEND_TYPE.ADD; this.copyPass.material.transparent = true; this.copyPass.material.premultipliedAlpha = true; this.copyPass.material.depthTest = false; this.copyPass.material.depthWrite = false; this.toneMappingPass = new ShaderPostPass(toneMappingShader); } update(renderer, sceneRenderTarget, outputRenderTarget) { // Step 1: highlight this.highlightPass.uniforms.luminosityThreshold = this.threshold; this.highlightPass.uniforms.tDiffuse = sceneRenderTarget.texture; this.highlightPass.render(renderer, this.tempRenderTarget); // Step 2: blur let inputRenderTarget = this.tempRenderTarget; for (let i = 0; i < 5; i++) { this.separableBlurPasses[i].uniforms.colorTexture = inputRenderTarget.texture; this.separableBlurPasses[i].uniforms.direction[0] = 1; this.separableBlurPasses[i].uniforms.direction[1] = 0; this.separableBlurPasses[i].render(renderer, this.renderTargetsHorizontal[i]); this.separableBlurPasses[i].uniforms.colorTexture = this.renderTargetsHorizontal[i].texture; this.separableBlurPasses[i].uniforms.direction[0] = 0; this.separableBlurPasses[i].uniforms.direction[1] = 1; this.separableBlurPasses[i].render(renderer, this.renderTargetsVertical[i]); inputRenderTarget = this.renderTargetsVertical[i]; } // Step 3: composite all the mips this.compositePass.uniforms.bloomRadius = this.radius; this.compositePass.uniforms.strength = this.strength; this.compositePass.render(renderer, this.renderTargetsHorizontal[0]); // Step 4: blend it additively const oldInputClearColor = sceneRenderTarget.clearColor; const oldInputClearDepth = sceneRenderTarget.clearDepth; const oldInputClearStencil = sceneRenderTarget.clearStencil; this.copyPass.uniforms.tDiffuse = this.renderTargetsHorizontal[0].texture; sceneRenderTarget.setClear(false, false, false); // avoid clear this.copyPass.render(renderer, sceneRenderTarget); sceneRenderTarget.setClear(oldInputClearColor, oldInputClearDepth, oldInputClearStencil); // Step 5: color mapping over the output render target this.toneMappingPass.uniforms.tDiffuse = sceneRenderTarget.texture; this.toneMappingPass.uniforms.toneMappingExposure = this.toneMappingExposure; this.toneMappingPass.render(renderer, outputRenderTarget); } dispose() { this.tempRenderTarget.dispose(); for (let i = 0; i < this.renderTargetsHorizontal.length; i++) { this.renderTargetsHorizontal[i].dispose(); } for (let i = 0; i < this.renderTargetsVertical.length; i++) { this.renderTargetsVertical[i].dispose(); } for (let i = 0; i < this.separableBlurPasses.length; i++) { this.separableBlurPasses[i].dispose(); } this.highlightPass.dispose(); this.compositePass.dispose(); this.copyPass.dispose(); } resize(width, height) { this.tempRenderTarget.resize(width, height); let resx = Math.round(width / 2); let resy = Math.round(height / 2); for (let i = 0; i < 5; i++) { this.renderTargetsHorizontal[i].resize(resx, resy); this.renderTargetsVertical[i].resize(resx, resy); this.separableBlurPasses[i].uniforms.invSize = [1 / resx, 1 / resy]; resx = Math.round(resx / 2); resy = Math.round(resy / 2); } } } UnrealBloomPass.supportWebGL1 = false; const kernelSizeArray = [3, 5, 7, 9, 11]; function createTempRenderTarget(width, height) { const renderTarget = OffscreenRenderTarget.create2D(width, height); renderTarget.texture.type = PIXEL_TYPE.HALF_FLOAT; if (!UnrealBloomPass.supportWebGL1) { renderTarget.texture.format = PIXEL_FORMAT.RGB; renderTarget.texture.internalformat = PIXEL_FORMAT.R11F_G11F_B10F; } renderTarget.texture.minFilter = TEXTURE_FILTER.LINEAR; renderTarget.texture.generateMipmaps = false; renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); renderTarget.setClear(true, false, false); return renderTarget; } const seperableBlurShader = { name: 'seperableBlur', defines: { KERNEL_RADIUS: 5 }, uniforms: { colorTexture: null, invSize: [1 / 512, 1 / 512], // inverse texture size direction: [0.5, 0.5], gaussianCoefficients: [] // precomputed Gaussian Coefficients }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D colorTexture; uniform vec2 invSize; uniform vec2 direction; uniform float gaussianCoefficients[KERNEL_RADIUS]; varying vec2 v_Uv; void main() { float weightSum = gaussianCoefficients[0]; vec3 diffuseSum = texture2D(colorTexture, v_Uv).rgb * weightSum; for(int i = 1; i < KERNEL_RADIUS; i ++) { float x = float(i); float w = gaussianCoefficients[i]; vec2 uvOffset = direction * invSize * x; vec3 sample1 = texture2D(colorTexture, v_Uv + uvOffset).rgb; vec3 sample2 = texture2D(colorTexture, v_Uv - uvOffset).rgb; diffuseSum += (sample1 + sample2) * w; weightSum += 2.0 * w; } gl_FragColor = vec4(diffuseSum / weightSum, 0.0); } ` }; const compositeShader = { name: 'composite', defines: {}, uniforms: { blurTexture1: null, blurTexture2: null, blurTexture3: null, blurTexture4: null, blurTexture5: null, bloomFactors: [1., 0.8, 0.6, 0.4, 0.2], bloomRadius: 0.0, strength: 1 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D blurTexture1; uniform sampler2D blurTexture2; uniform sampler2D blurTexture3; uniform sampler2D blurTexture4; uniform sampler2D blurTexture5; uniform float strength; uniform float bloomRadius; uniform float bloomFactors[5]; varying vec2 v_Uv; float lerpBloomFactor(const in float factor) { float mirrorFactor = 1.2 - factor; return mix(factor, mirrorFactor, bloomRadius); } void main() { float factor0 = lerpBloomFactor(bloomFactors[0]); float factor1 = lerpBloomFactor(bloomFactors[1]); float factor2 = lerpBloomFactor(bloomFactors[2]); float factor3 = lerpBloomFactor(bloomFactors[3]); float factor4 = lerpBloomFactor(bloomFactors[4]); gl_FragColor = strength * (factor0 * texture2D(blurTexture1, v_Uv) + factor1 * texture2D(blurTexture2, v_Uv) + factor2 * texture2D(blurTexture3, v_Uv) + factor3 * texture2D(blurTexture4, v_Uv) + factor4 * texture2D(blurTexture5, v_Uv)); } ` }; const toneMappingShader = { name: 'toneMapping', defines: {}, uniforms: { tDiffuse: null, opacity: 1.0, toneMappingExposure: 1. }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D tDiffuse; uniform float opacity; uniform float toneMappingExposure; varying vec2 v_Uv; vec3 RRTAndODTFit(vec3 v) { vec3 a = v * (v + 0.0245786) - 0.000090537; vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081; return a / b; } vec3 ReinhardToneMapping(vec3 color) { color *= toneMappingExposure; return saturate(color / (vec3(1.0) + color)); } void main() { gl_FragColor = texture2D(tDiffuse, v_Uv) * opacity; gl_FragColor.rgb = ReinhardToneMapping(gl_FragColor.rgb); gl_FragColor = LinearTosRGB(gl_FragColor); } ` }; export { UnrealBloomPass }; ================================================ FILE: examples/jsm/pass/WeightedBlendedOITPass.js ================================================ import { ShaderPostPass, OffscreenRenderTarget, Texture2D, ATTACHMENT, TEXTURE_FILTER, PIXEL_TYPE, BLEND_FACTOR, BLEND_TYPE, ShaderLib, PBRMaterial, MATERIAL_TYPE } from 't3d'; // TODO: Share depth attachment with opaque render target class WeightedBlendedOITPass { constructor(width, height) { this._renderTarget = OffscreenRenderTarget.create2D(width, height); this._renderTarget.texture.type = PIXEL_TYPE.FLOAT; this._renderTarget.texture.minFilter = TEXTURE_FILTER.NEAREST; this._renderTarget.texture.magFilter = TEXTURE_FILTER.NEAREST; this._renderTarget.texture.generateMipmaps = false; const accumulateAlphaTexture = new Texture2D(); accumulateAlphaTexture.type = PIXEL_TYPE.FLOAT; accumulateAlphaTexture.minFilter = TEXTURE_FILTER.NEAREST; accumulateAlphaTexture.magFilter = TEXTURE_FILTER.NEAREST; accumulateAlphaTexture.generateMipmaps = false; this._renderTarget.attach(accumulateAlphaTexture, ATTACHMENT.COLOR_ATTACHMENT1); this._renderTarget .setColorClearValue(0, 0, 0, 1) .setClear(true, false, false); this._mixPass = new ShaderPostPass(WeightedBlendedMixShader); this._mixPass.material.transparent = true; this._mixPass.material.blending = BLEND_TYPE.CUSTOM; this._mixPass.material.blendEquationAlpha = BLEND_FACTOR.ADD; this._mixPass.material.blendSrc = BLEND_FACTOR.ONE; this._mixPass.material.blendDst = BLEND_FACTOR.ONE; this._mixPass.material.blendSrcAlpha = BLEND_FACTOR.ZERO; this._mixPass.material.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; this._mixPass.uniforms['uAccumulate'] = this._renderTarget.texture; this._mixPass.uniforms['uAccumulateAlpha'] = accumulateAlphaTexture; const cameraInfos = { far: 1000, near: 0.1 }; this._cameraInfos = cameraInfos; this._renderOptions = { getMaterial: function(renderable) { const material = renderable.material; material.uniforms.cameraFar = cameraInfos.far; material.uniforms.cameraNear = cameraInfos.near; return material; } }; } setOutputEncoding(encoidng) { this._renderTarget.texture.encoding = encoidng; } resize(width, height) { this._renderTarget.resize(width, height); } dispose() { this._renderTarget.dispose(); this._mixPass.dispose(); } renderBuffer(renderer, scene, camera) { const renderStates = scene.getRenderStates(camera); const renderQueue = scene.getRenderQueue(camera); this._cameraInfos.far = renderStates.camera.far; this._cameraInfos.near = renderStates.camera.near; const renderOptions = this._renderOptions; renderer.beginRender(this._renderTarget); let renderQueueLayer; for (let i = 0, l = renderQueue.layerList.length; i < l; i++) { renderQueueLayer = renderQueue.layerList[i]; renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions); } renderer.endRender(); } render(renderer, renderTarget) { this._mixPass.render(renderer, renderTarget); } } const WeightedBlendedMixShader = { name: 'wb_oit_mix', uniforms: { 'uAccumulate': null, 'uAccumulateAlpha': null }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D uAccumulate; uniform sampler2D uAccumulateAlpha; varying vec2 v_Uv; void main() { vec4 accum = texture2D(uAccumulate, v_Uv); float r = texture2D(uAccumulateAlpha, v_Uv).r; vec4 transparent = vec4(accum.rgb / clamp(r, 1e-4, 5e4), accum.a); gl_FragColor = (1.0 - transparent.a) * transparent; } ` }; class WeightedBlendedOITMaterial extends PBRMaterial { constructor(sourceMaterial) { super(); this.type = MATERIAL_TYPE.SHADER; if (sourceMaterial) { this.copy(sourceMaterial); } this.depthTest = false; this.depthWrite = true; this.transparent = true; this.blending = BLEND_TYPE.CUSTOM; this.blendEquationAlpha = BLEND_FACTOR.ADD; this.blendSrc = BLEND_FACTOR.ONE; this.blendDst = BLEND_FACTOR.ONE; this.blendSrcAlpha = BLEND_FACTOR.ZERO; this.blendDstAlpha = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; this.shaderName = 'wb_oit_mat'; this.vertexShader = ShaderLib.pbr_vert; this.fragmentShader = fragmentShader; this.uniforms = { cameraFar: 1000, cameraNear: 0.1 }; } } let fragmentShader = ShaderLib.pbr_frag; fragmentShader = fragmentShader.replace( '#include ', ` #include uniform float cameraFar; uniform float cameraNear; float weight(float a) { return clamp(pow(min(1.0, a * 10.0) + 0.01, 3.0) * 1e8 * pow(1.0 - gl_FragCoord.z * 0.9, 3.0), 1e-2, 3e3); } float alphaWeight(float a) { float z = (gl_FragCoord.z - (cameraFar + cameraNear) / 2.) / ((cameraFar - cameraNear) / 2.); // See Weighted Blended Order-Independent Transparency for examples of different weighting functions: // http://jcgt.org/published/0002/02/09/ return pow(a + 0.01, 4.0) + max(1e-2, min(3.0 * 1e3, 0.003 / (1e-5 + pow(abs(z) / 200.0, 4.0)))); } ` ); fragmentShader = fragmentShader.replace( '#include ', ` vec4 gl_FragColor = outColor; ` ); fragmentShader = fragmentShader.replace( '#include ', ` #include gl_FragColor.rgb *= gl_FragColor.a; float w = alphaWeight(gl_FragColor.a); gl_FragData[0] = vec4(gl_FragColor.rgb * w, gl_FragColor.a); gl_FragData[1] = vec4(gl_FragColor.a * w); ` ); export { WeightedBlendedOITPass, WeightedBlendedOITMaterial }; ================================================ FILE: examples/jsm/probes/PlanarReflectionProbe.js ================================================ import { Camera, OffscreenRenderTarget, Vector3, Vector4, Plane, Matrix4, TEXTURE_FILTER } from 't3d'; /** * A planar reflection probe. */ class PlanarReflectionProbe { /** * @param {OffscreenRenderTarget} [renderTarget] - The reflection render is done to the renderTarget (if specified). */ constructor(renderTarget) { this.plane = new Plane(); if (!renderTarget) { renderTarget = OffscreenRenderTarget.create2D(1024, 1024); renderTarget.texture.minFilter = TEXTURE_FILTER.LINEAR; renderTarget.texture.generateMipmaps = false; } this.renderTarget = renderTarget; this.renderTexture = renderTarget.texture; this.textureMatrix = new Matrix4(); this.clipBias = 0.0; this.mirrorCamera = new Camera(); this.renderOption = { ifRender: function(renderable) { return !renderable.object.skipReflectionProbe; } }; } /** * Render the reflection. * Need update scene data and collect light data before calling this method. * @param {ThinRenderer} renderer * @param {Scene} scene * @param {Camera} camera */ render(renderer, scene, camera) { const mirrorCamera = this.mirrorCamera; // Calculate the mirror camera transformation cameraPosition.setFromMatrixPosition(camera.worldMatrix); this.plane.mirrorPoint(cameraPosition, mirrorCameraPosition); cameraTarget.setFromMatrixColumn(camera.worldMatrix, 2).normalize().negate().add(cameraPosition); this.plane.mirrorPoint(cameraTarget, mirrorCameraTarget); mirrorCameraUp.setFromMatrixColumn(camera.worldMatrix, 1).normalize().reflect(this.plane.normal); mirrorCamera.position.copy(mirrorCameraPosition); mirrorCamera.lookAt(mirrorCameraTarget, mirrorCameraUp); // Copy projection matrix to the mirror camera mirrorCamera.projectionMatrix.copy(camera.projectionMatrix); mirrorCamera.updateMatrix(); // Copy other camera properties mirrorCamera.outputEncoding = camera.outputEncoding; // Update the texture matrix this.textureMatrix.set( 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 ); this.textureMatrix.multiply(mirrorCamera.projectionViewMatrix); // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf mirrorPlane.copy(this.plane); mirrorPlane.applyMatrix4(mirrorCamera.viewMatrix); clipPlane.set(mirrorPlane.normal.x, mirrorPlane.normal.y, mirrorPlane.normal.z, mirrorPlane.constant); const projectionMatrix = mirrorCamera.projectionMatrix; q.x = (Math.sign(clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0]; q.y = (Math.sign(clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5]; q.z = -1.0; q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14]; // Calculate the scaled plane vector clipPlane.multiplyScalar(2.0 / clipPlane.dot(q)); // Replacing the third row of the projection matrix projectionMatrix.elements[2] = clipPlane.x; projectionMatrix.elements[6] = clipPlane.y; projectionMatrix.elements[10] = clipPlane.z + 1.0 - this.clipBias; projectionMatrix.elements[14] = clipPlane.w; // Render const renderStates = scene.updateRenderStates(mirrorCamera, false); const renderQueue = scene.updateRenderQueue(mirrorCamera, false, false); renderer.beginRender(this.renderTarget); let renderQueueLayer; for (let i = 0, l = renderQueue.layerList.length; i < l; i++) { renderQueueLayer = renderQueue.layerList[i]; renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, this.renderOption); renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, this.renderOption); } renderer.endRender(); renderer.generateMipmaps(this.renderTarget.texture); } } const cameraPosition = new Vector3(); const mirrorCameraPosition = new Vector3(); const cameraTarget = new Vector3(); const mirrorCameraTarget = new Vector3(); const mirrorCameraUp = new Vector3(); const mirrorPlane = new Plane(); const q = new Vector4(); const clipPlane = new Vector4(); export { PlanarReflectionProbe }; ================================================ FILE: examples/jsm/probes/ReflectionProbe.js ================================================ import { TEXTURE_FILTER, Camera, Vector3, OffscreenRenderTarget } from 't3d'; /** * A Reflection Probe is rather like a camera that captures a spherical view of its surroundings in all directions. * The captured image is then stored as a Cubemap that can be used by objects with environment map. */ class ReflectionProbe { /** * @param {OffscreenRenderTarget} [renderTarget] - The reflection render is done to the renderTarget (if specified). */ constructor(renderTarget) { this.camera = new Camera(); this.targets = [ new Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1) ]; this.ups = [ new Vector3(0, -1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(0, -1, 0) ]; this.camera.setPerspective(90 / 180 * Math.PI, 1, 1, 1000); this.position = new Vector3(); this.lookTarget = new Vector3(); this.renderTarget = renderTarget || OffscreenRenderTarget.createCube(512, 512); this.renderTexture = this.renderTarget.texture; this.renderTexture.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; this.renderOption = { ifRender: function(renderable) { return !renderable.object.skipReflectionProbe; } }; } /** * Render the reflection. * Need update scene data and collect light data before calling this method. * @param {ThinRenderer} renderer * @param {Scene} scene */ render(renderer, scene) { this.camera.position.copy(this.position); for (let i = 0; i < 6; i++) { this.lookTarget.set(this.targets[i].x + this.camera.position.x, this.targets[i].y + this.camera.position.y, this.targets[i].z + this.camera.position.z); this.camera.lookAt(this.lookTarget, this.ups[i]); this.camera.updateMatrix(); const renderStates = scene.updateRenderStates(this.camera, false); const renderQueue = scene.updateRenderQueue(this.camera, false, false); this.renderTarget.activeLayer = i; renderer.beginRender(this.renderTarget); let renderQueueLayer; for (let i = 0, l = renderQueue.layerList.length; i < l; i++) { renderQueueLayer = renderQueue.layerList[i]; renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, this.renderOption); renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, this.renderOption); } renderer.endRender(); renderer.generateMipmaps(this.renderTarget.texture); } } } export { ReflectionProbe }; ================================================ FILE: examples/jsm/render/DeferredRenderer.js ================================================ import { BLEND_TYPE, Matrix4, ScreenRenderTarget, ShaderPostPass, ShadowMapPass, Vector3, WebGLRenderer } from 't3d'; import { GBuffer } from '../GBuffer.js'; const matProjViewInverse = new Matrix4(); const eyePosition = new Vector3(); const defaultContextParams = { antialias: true, // antialias alpha: false, // effect performance, default false // premultipliedAlpha: false, // effect performance, default false stencil: true }; /** * Deferred WebGL Renderer */ class DeferredRenderer extends WebGLRenderer { constructor(view, options = defaultContextParams) { const gl = view.getContext('webgl2', options) || view.getContext('webgl', options); super(gl); if (this.capabilities.version < 2) { console.info('DeferredRenderer use WebGL1 because of your browser not support WebGL2.'); } this.shadowMapPass = new ShadowMapPass(); this.screenRenderTarget = new ScreenRenderTarget(view); const width = view.width; const height = view.height; this.gBuffer = new GBuffer(width, height); const directionalLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.directionalLight); directionalLightPass.material.transparent = true; directionalLightPass.material.blending = BLEND_TYPE.ADD; directionalLightPass.material.depthWrite = false; directionalLightPass.material.depthTest = false; this.directionalLightPass = directionalLightPass; const directionalShadowLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.directionalLight); directionalShadowLightPass.material.transparent = true; directionalShadowLightPass.material.blending = BLEND_TYPE.ADD; directionalShadowLightPass.material.depthWrite = false; directionalShadowLightPass.material.depthTest = false; directionalShadowLightPass.material.defines['SHADOW'] = 1; this.directionalShadowLightPass = directionalShadowLightPass; const pointLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.pointLight); pointLightPass.material.transparent = true; pointLightPass.material.blending = BLEND_TYPE.ADD; pointLightPass.material.depthWrite = false; pointLightPass.material.depthTest = false; this.pointLightPass = pointLightPass; const pointShadowLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.pointLight); pointShadowLightPass.material.transparent = true; pointShadowLightPass.material.blending = BLEND_TYPE.ADD; pointShadowLightPass.material.depthWrite = false; pointShadowLightPass.material.depthTest = false; pointShadowLightPass.material.defines['SHADOW'] = 1; this.pointShadowLightPass = pointShadowLightPass; const spotLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.spotLight); spotLightPass.material.transparent = true; spotLightPass.material.blending = BLEND_TYPE.ADD; spotLightPass.material.depthWrite = false; spotLightPass.material.depthTest = false; this.spotLightPass = spotLightPass; const spotShadowLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.spotLight); spotShadowLightPass.material.transparent = true; spotShadowLightPass.material.blending = BLEND_TYPE.ADD; spotShadowLightPass.material.depthWrite = false; spotShadowLightPass.material.depthTest = false; spotShadowLightPass.material.defines['SHADOW'] = 1; this.spotShadowLightPass = spotShadowLightPass; const ambientCubemapLightPass = new ShaderPostPass(DeferredRenderer.DeferredShader.ambientCubemapLight); ambientCubemapLightPass.material.transparent = true; ambientCubemapLightPass.material.blending = BLEND_TYPE.ADD; ambientCubemapLightPass.material.depthWrite = false; ambientCubemapLightPass.material.depthTest = false; this.ambientCubemapLightPass = ambientCubemapLightPass; this.ambientCubemap = null; this.ambientCubemapIntensity = 1.0; } // deprecated since 0.5.0 set backRenderTarget(value) { this.screenRenderTarget = value; } get backRenderTarget() { return this.screenRenderTarget; } resize(width, height) { this.screenRenderTarget.resize(width, height); this.gBuffer.resize(width, height); } render(scene, camera, renderTarget) { renderTarget = renderTarget || this.screenRenderTarget; const oldClearColor = renderTarget.clearColor; const gBuffer = this.gBuffer; const width = renderTarget.width; const height = renderTarget.height; scene.updateMatrix(); const renderStates = scene.updateRenderStates(camera); scene.updateRenderQueue(camera); this.shadowMapPass.render(this, scene); // Step 1: update GBuffer gBuffer.update(this, scene, camera); // Step 2: light accum matProjViewInverse.copy(renderStates.camera.projectionViewMatrix).invert(); eyePosition.copy(renderStates.camera.position); function uploadCommonUniforms(pass) { pass.uniforms['normalGlossinessTexture'] = gBuffer.getNormalGlossinessTexture(); pass.uniforms['depthTexture'] = gBuffer.getDepthTexture(); pass.uniforms['albedoMetalnessTexture'] = gBuffer.getAlbedoMetalnessTexture(); pass.uniforms['windowSize'][0] = width; pass.uniforms['windowSize'][1] = height; pass.uniforms['matProjViewInverse'].set(matProjViewInverse.elements); pass.uniforms['eyePosition'][0] = eyePosition.x; pass.uniforms['eyePosition'][1] = eyePosition.y; pass.uniforms['eyePosition'][2] = eyePosition.z; } let lights, shadows, count, shadowCount; const lightingGroup = renderStates.lighting.getGroup(0); // directional lights = lightingGroup.directional; shadows = lightingGroup.directionalShadow; count = lightingGroup.directsNum; shadowCount = lightingGroup.directShadowNum; for (let i = 0; i < count; i++) { const light = lights[i]; const pass = i < shadowCount ? this.directionalShadowLightPass : this.directionalLightPass; uploadCommonUniforms(pass); pass.uniforms['lightColor'] = [light.color[0], light.color[1], light.color[2]]; pass.uniforms['lightDirection'] = [light.direction[0], light.direction[1], light.direction[2]]; if (i < shadowCount) { const shadow = shadows[i]; pass.uniforms['shadowBias'][0] = shadow.shadowBias[0]; pass.uniforms['shadowBias'][1] = shadow.shadowBias[1]; pass.uniforms['shadowParams'][0] = shadow.shadowParams[0]; pass.uniforms['shadowParams'][1] = shadow.shadowParams[1]; pass.uniforms['shadowMapSize'][0] = shadow.shadowMapSize[0]; pass.uniforms['shadowMapSize'][1] = shadow.shadowMapSize[1]; pass.uniforms['shadowMap'] = this.capabilities.version >= 2 ? lightingGroup.directionalShadowDepthMap[i] : lightingGroup.directionalShadowMap[i]; pass.uniforms['shadowMatrix'].set(lightingGroup.directionalShadowMatrix, i * 16); } pass.render(this, renderTarget); } renderTarget.clearColor = false; // point lights = lightingGroup.point; shadows = lightingGroup.pointShadow; count = lightingGroup.pointsNum; shadowCount = lightingGroup.pointShadowNum; for (let i = 0; i < count; i++) { const light = lights[i]; const pass = i < shadowCount ? this.pointShadowLightPass : this.pointLightPass; uploadCommonUniforms(pass); pass.uniforms['lightColor'] = [light.color[0], light.color[1], light.color[2]]; pass.uniforms['lightPosition'] = [light.position[0], light.position[1], light.position[2]]; pass.uniforms['lightRange'] = light.distance; // pass.uniforms["attenuationFactor"] = light.decay; 5.0? if (i < shadowCount) { const shadow = shadows[i]; pass.uniforms['shadowBias'][0] = shadow.shadowBias[0]; pass.uniforms['shadowBias'][1] = shadow.shadowBias[1]; pass.uniforms['shadowParams'][0] = shadow.shadowParams[0]; pass.uniforms['shadowParams'][1] = shadow.shadowParams[1]; pass.uniforms['shadowMapSize'][0] = shadow.shadowMapSize[0]; pass.uniforms['shadowMapSize'][1] = shadow.shadowMapSize[1]; pass.uniforms['shadowMap'] = lightingGroup.pointShadowMap[i]; pass.uniforms['shadowCameraRange'][0] = shadow.shadowCameraRange[0]; pass.uniforms['shadowCameraRange'][1] = shadow.shadowCameraRange[1]; } pass.render(this, renderTarget); } // spot lights = lightingGroup.spot; shadows = lightingGroup.spotShadow; count = lightingGroup.spotsNum; shadowCount = lightingGroup.spotShadowNum; for (let i = 0; i < count; i++) { const light = lights[i]; const pass = i < shadowCount ? this.spotShadowLightPass : this.spotLightPass; uploadCommonUniforms(pass); pass.uniforms['lightColor'] = [light.color[0], light.color[1], light.color[2]]; pass.uniforms['lightPosition'] = [light.position[0], light.position[1], light.position[2]]; pass.uniforms['lightDirection'] = [light.direction[0], light.direction[1], light.direction[2]]; pass.uniforms['lightConeCos'] = light.coneCos; pass.uniforms['lightPenumbraCos'] = light.penumbraCos; pass.uniforms['lightRange'] = light.distance; // pass.uniforms["attenuationFactor"] = light.decay; 5.0? if (i < shadowCount) { const shadow = shadows[i]; pass.uniforms['shadowBias'][0] = shadow.shadowBias[0]; pass.uniforms['shadowBias'][1] = shadow.shadowBias[1]; pass.uniforms['shadowParams'][0] = shadow.shadowParams[0]; pass.uniforms['shadowParams'][1] = shadow.shadowParams[1]; pass.uniforms['shadowMapSize'][0] = shadow.shadowMapSize[0]; pass.uniforms['shadowMapSize'][1] = shadow.shadowMapSize[1]; pass.uniforms['shadowMap'] = this.capabilities.version >= 2 ? lightingGroup.spotShadowDepthMap[i] : lightingGroup.spotShadowMap[i]; pass.uniforms['shadowMatrix'].set(lightingGroup.spotShadowMatrix, i * 16); } pass.render(this, renderTarget); } // ambientCubemap if (this.ambientCubemap) { const pass = this.ambientCubemapLightPass; uploadCommonUniforms(pass); pass.uniforms['cubeMap'] = this.ambientCubemap; pass.uniforms['intensity'] = this.ambientCubemapIntensity; pass.render(this, renderTarget); } // restore renderTarget.clearColor = oldClearColor; } } const DeferredShaderChunk = { light_vertex: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, light_head: ` uniform sampler2D normalGlossinessTexture; uniform sampler2D depthTexture; uniform sampler2D albedoMetalnessTexture; uniform vec2 windowSize; uniform mat4 matProjViewInverse; `, // Extract // - N, z, position // - albedo, metalness, specularColor, diffuseColor gbuffer_read: ` vec2 texCoord = gl_FragCoord.xy / windowSize; vec4 texel1 = texture2D(normalGlossinessTexture, texCoord); vec4 texel3 = texture2D(albedoMetalnessTexture, texCoord); // Is empty if (dot(texel1.rgb, vec3(1.0)) == 0.0) { discard; } float glossiness = texel1.a; float metalness = texel3.a; vec3 N = texel1.rgb * 2.0 - 1.0; // Depth buffer range is 0.0 - 1.0 float z = texture2D(depthTexture, texCoord).r * 2.0 - 1.0; vec2 xy = texCoord * 2.0 - 1.0; vec4 projectedPos = vec4(xy, z, 1.0); vec4 p4 = matProjViewInverse * projectedPos; vec3 position = p4.xyz / p4.w; vec3 albedo = texel3.rgb; vec3 diffuseColor = albedo * (1.0 - metalness); vec3 specularColor = mix(vec3(0.04), albedo, metalness); `, calculate_attenuation: ` uniform float attenuationFactor; float lightAttenuation(float dist, float range) { float attenuation = 1.0; attenuation = dist * dist / (range * range + 1.0); float att_s = attenuationFactor; attenuation = 1.0 / (attenuation * att_s + 1.0); att_s = 1.0 / (att_s + 1.0); attenuation = attenuation - att_s; attenuation /= 1.0 - att_s; return clamp(attenuation, 0.0, 1.0); } `, light_equation: ` float D_Phong(in float g, in float ndh) { // from black ops 2 float a = pow(8192.0, g); return (a + 2.0) / 8.0 * pow(ndh, a); } float D_GGX(in float g, in float ndh) { float r = 1.0 - g; float a = r * r; float tmp = ndh * ndh * (a - 1.0) + 1.0; return a / (3.1415926 * tmp * tmp); } // Fresnel vec3 F_Schlick(in float ndv, vec3 spec) { return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0); } vec3 lightEquation( in vec3 lightColor, in vec3 diffuseColor, in vec3 specularColor, in float ndl, in float ndh, in float ndv, in float g ) { return ndl * PI * lightColor * (diffuseColor + D_Phong(g, ndh) * F_Schlick(ndv, specularColor)); } ` }; DeferredRenderer.DeferredShader = { directionalLight: { name: 'deferred_directionallight', defines: { 'SHADOW': 0 }, uniforms: { normalGlossinessTexture: null, depthTexture: null, albedoMetalnessTexture: null, windowSize: [800, 600], matProjViewInverse: new Float32Array(16), lightColor: [0, 0, 0], lightDirection: [0, 1, 0], eyePosition: [0, 1, 0], shadowMatrix: new Float32Array(16), shadowMap: null, shadowBias: [0, 0], shadowParams: [1, 0], shadowMapSize: [1024, 1024] }, vertexShader: DeferredShaderChunk.light_vertex, fragmentShader: ` ${DeferredShaderChunk.light_head} ${DeferredShaderChunk.light_equation} uniform vec3 lightDirection; uniform vec3 lightColor; uniform vec3 eyePosition; #if SHADOW == 1 uniform sampler2DShadow shadowMap; uniform mat4 shadowMatrix; uniform vec2 shadowBias; uniform vec2 shadowParams; uniform vec2 shadowMapSize; #include #include #endif void main() { ${DeferredShaderChunk.gbuffer_read} vec3 L = -normalize(lightDirection); vec3 V = normalize(eyePosition - position); vec3 H = normalize(L + V); float ndl = clamp(dot(N, L), 0.0, 1.0); float ndh = clamp(dot(N, H), 0.0, 1.0); float ndv = clamp(dot(N, V), 0.0, 1.0); gl_FragColor.rgb = lightEquation(lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness); #if SHADOW == 1 float shadowContrib = getShadow(shadowMap, shadowMatrix * vec4(position, 1.), shadowMapSize, shadowBias, shadowParams); gl_FragColor.rgb *= shadowContrib; #endif gl_FragColor.a = 1.0; } ` }, pointLight: { name: 'deferred_pointlight', defines: { 'SHADOW': 0 }, uniforms: { normalGlossinessTexture: null, depthTexture: null, albedoMetalnessTexture: null, windowSize: [800, 600], matProjViewInverse: new Float32Array(16), lightColor: [0, 0, 0], lightPosition: [0, 1, 0], lightRange: 1, attenuationFactor: 5.0, eyePosition: [0, 1, 0], shadowMap: null, shadowBias: [0, 0], shadowParams: [1, 0], shadowMapSize: [1024, 1024], shadowCameraRange: [1, 100] }, vertexShader: DeferredShaderChunk.light_vertex, fragmentShader: ` ${DeferredShaderChunk.light_head} ${DeferredShaderChunk.calculate_attenuation} ${DeferredShaderChunk.light_equation} uniform vec3 lightPosition; uniform vec3 lightColor; uniform float lightRange; uniform vec3 eyePosition; #if SHADOW == 1 uniform samplerCube shadowMap; uniform vec2 shadowBias; uniform vec2 shadowParams; uniform vec2 shadowMapSize; uniform vec2 shadowCameraRange; #include #include #endif void main() { ${DeferredShaderChunk.gbuffer_read} vec3 L = lightPosition - position; vec3 V = normalize(eyePosition - position); float dist = length(L); L /= dist; vec3 H = normalize(L + V); float ndl = clamp(dot(N, L), 0.0, 1.0); float ndh = clamp(dot(N, H), 0.0, 1.0); float ndv = clamp(dot(N, V), 0.0, 1.0); float attenuation = lightAttenuation(dist, lightRange); // Diffuse term gl_FragColor.rgb = attenuation * lightEquation(lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness); #if SHADOW == 1 float shadowContrib = getPointShadow(shadowMap, vec4(-L * dist, 1.0), shadowMapSize, shadowBias, shadowParams, shadowCameraRange); gl_FragColor.rgb *= clamp(shadowContrib, 0.0, 1.0); #endif gl_FragColor.a = 1.0; } ` }, spotLight: { name: 'deferred_spotlight', defines: { 'SHADOW': 0 }, uniforms: { normalGlossinessTexture: null, depthTexture: null, albedoMetalnessTexture: null, windowSize: [800, 600], matProjViewInverse: new Float32Array(16), lightColor: [0, 0, 0], lightPosition: [0, 1, 0], lightDirection: [0, 1, 0], lightConeCos: 1, lightPenumbraCos: 1, lightRange: 1, falloffFactor: 1., attenuationFactor: 5.0, eyePosition: [0, 1, 0], shadowMatrix: new Float32Array(16), shadowMap: null, shadowBias: [0, 0], shadowParams: [1, 0], shadowMapSize: [1024, 1024] }, vertexShader: DeferredShaderChunk.light_vertex, fragmentShader: ` ${DeferredShaderChunk.light_head} ${DeferredShaderChunk.calculate_attenuation} ${DeferredShaderChunk.light_equation} uniform vec3 lightPosition; uniform vec3 lightDirection; uniform vec3 lightColor; uniform float lightConeCos; uniform float lightPenumbraCos; uniform float lightRange; uniform float falloffFactor; uniform vec3 eyePosition; #if SHADOW == 1 uniform sampler2DShadow shadowMap; uniform mat4 shadowMatrix; uniform vec2 shadowBias; uniform vec2 shadowParams; uniform vec2 shadowMapSize; #include #include #endif void main() { ${DeferredShaderChunk.gbuffer_read} vec3 L = lightPosition - position; vec3 V = normalize(eyePosition - position); float dist = length(L); L /= dist; float attenuation = lightAttenuation(dist, lightRange); float angleCos = dot(-normalize(lightDirection), L); if (angleCos <= lightConeCos) discard; if (dist > lightRange) discard; float spotEffect = smoothstep(lightConeCos, lightPenumbraCos, angleCos); vec3 H = normalize(L + V); float ndl = clamp(dot(N, L), 0.0, 1.0); float ndh = clamp(dot(N, H), 0.0, 1.0); float ndv = clamp(dot(N, V), 0.0, 1.0); // Diffuse term gl_FragColor.rgb = spotEffect * attenuation * lightEquation(lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness); #if SHADOW == 1 float shadowContrib = getShadow(shadowMap, shadowMatrix * vec4(position, 1.), shadowMapSize, shadowBias, shadowParams); gl_FragColor.rgb *= shadowContrib; #endif gl_FragColor.a = 1.0; } ` }, ambientCubemapLight: { name: 'deferred_ambientcubemaplight', defines: {}, uniforms: { normalGlossinessTexture: null, depthTexture: null, albedoMetalnessTexture: null, windowSize: [800, 600], matProjViewInverse: new Float32Array(16), cubeMap: null, intensity: 1.0, eyePosition: [0, 1, 0] }, vertexShader: DeferredShaderChunk.light_vertex, fragmentShader: ` ${DeferredShaderChunk.light_head} ${DeferredShaderChunk.light_equation} uniform samplerCube cubeMap; uniform float intensity; uniform vec3 eyePosition; void main() { ${DeferredShaderChunk.gbuffer_read} vec3 V = normalize(eyePosition - position); vec3 L = reflect(-V, N); vec3 H = normalize(L + V); float ndv = clamp(dot(N, V), 0.0, 1.0); float ndh = clamp(dot(N, H), 0.0, 1.0); float rough = clamp(1.0 - glossiness, 0.0, 1.0); // FIXME fixed maxMipmapLevel ? float level = rough * 5.0; #ifdef TEXTURE_LOD_EXT vec4 cubeMapColor1 = textureCubeLodEXT(cubeMap, L, 8.); vec4 cubeMapColor2 = textureCubeLodEXT(cubeMap, L, level); #else // force the bias high to get the last LOD level as it is the most blurred. vec4 cubeMapColor1 = textureCubeLodEXT(cubeMap, L, 8.); vec4 cubeMapColor2 = textureCube(cubeMap, L, level); #endif // Diffuse term // TODO gl_FragColor.rgb = intensity * (cubeMapColor2.xyz * F_Schlick(ndv, specularColor) + cubeMapColor1.xyz * diffuseColor / PI); gl_FragColor.a = 1.0; } ` } }; export { DeferredRenderer }; ================================================ FILE: examples/jsm/render/ForwardRenderer.js ================================================ import { ScreenRenderTarget, ShadowMapPass, WebGLRenderer } from 't3d'; /** * A simple Forward WebGL Renderer. * @memberof t3d */ class ForwardRenderer extends WebGLRenderer { /** * @param {HTMLCanvasElement} view - The canvas elements. * @param {object} [options] - The {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext options for webgl context}. */ constructor(view, options) { const defaultContextParams = { antialias: true, // antialias alpha: false, // effect performance, default false // premultipliedAlpha: false, // effect performance, default false stencil: true }; const gl = view.getContext('webgl2', options || defaultContextParams) || view.getContext('webgl', options || defaultContextParams); super(gl); if (this.capabilities.version < 2) { console.info('ForwardRenderer use WebGL1 because of your browser not support WebGL2.'); } this.screenRenderTarget = new ScreenRenderTarget(view); this.shadowMapPass = new ShadowMapPass(); /** * Defines whether the shadow pass should automatically update. * @type {boolean} * @default true */ this.shadowAutoUpdate = true; /** * If {@link ForwardRenderer.shadowAutoUpdate} is set true and this set true, shadow will update and set this to false automatically. * @type {boolean} * @default true */ this.shadowNeedsUpdate = true; /** * Defines whether the scene should automatically update its matrix. * @type {boolean} * @default true */ this.matrixAutoUpdate = true; /** * Defines whether the scene should automatically update its render states. * @type {boolean} * @default true */ this.renderStatesAutoUpdate = true; /** * Defines whether the scene should automatically update its render queue. * @type {boolean} * @default true */ this.renderQueueAutoUpdate = true; } set autoClear(value) { console.warn('ForwardRenderer: autoClear has been deprecated. Use renderTarget.setClear(...) instead.'); } get autoClear() { console.warn('ForwardRenderer: autoClear has been deprecated. Use renderTarget.setClear(...) instead.'); return true; } // deprecated since 0.5.0 set backRenderTarget(value) { this.screenRenderTarget = value; } get backRenderTarget() { return this.screenRenderTarget; } /** * Render a scene using a camera. * The render is done to the renderTarget (if specified) or to the canvas as usual. * @param {Scene} scene - The scene. * @param {Camera} camera - The camera. * @param {RenderTargetBase} [renderTarget] - The render is done to the renderTarget (if specified) or to the canvas as usual. * @param {boolean} [forceClear=false] - Deprecated. Whether to clear the output before rendering. Use renderTarget.setClear(...) instead. */ render(scene, camera, renderTarget, forceClear) { if (forceClear !== undefined) { console.warn('The fourth parameter forceClear has been deprecated. Use renderTarget.setClear(...) instead.'); } this.matrixAutoUpdate && scene.updateMatrix(); this.renderStatesAutoUpdate && scene.updateRenderStates(camera); this.renderQueueAutoUpdate && scene.updateRenderQueue(camera); if (this.shadowAutoUpdate || this.shadowNeedsUpdate) { this.shadowMapPass.render(this, scene); this.shadowNeedsUpdate = false; } if (renderTarget === undefined) { renderTarget = this.screenRenderTarget; } this.renderScene(scene, camera, renderTarget); if (renderTarget.texture) { this.generateMipmaps(renderTarget.texture); } } } export { ForwardRenderer }; ================================================ FILE: examples/jsm/shaders/BlendShader.js ================================================ /** * Blend Shader. */ const BlendShader = { name: 'blend', uniforms: { 'tDiffuse1': null, 'tDiffuse2': null, 'opacity1': 1.0, 'opacity2': 1.0 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform float opacity1; uniform float opacity2; uniform sampler2D tDiffuse1; uniform sampler2D tDiffuse2; varying vec2 v_Uv; void main() { vec4 texel = vec4(0.); texel += texture2D(tDiffuse1, v_Uv) * opacity1; texel += texture2D(tDiffuse2, v_Uv) * opacity2; gl_FragColor = texel; } ` }; export { BlendShader }; ================================================ FILE: examples/jsm/shaders/BlurShader.js ================================================ /** * Blur Shader */ const BlurShader = { name: 'blur', defines: { 'NORMALTEX_ENABLED': 0, 'DEPTHTEX_ENABLED': 0, 'DEPTH_PACKING': 0, 'KERNEL_SIZE_INT': '5', 'KERNEL_SIZE_FLOAT': '5.0' }, uniforms: { 'tDiffuse': null, 'textureSize': [512, 512], 'direction': 0, // 0 horizontal, 1 vertical 'blurSize': 1, 'kernel': [0.122581, 0.233062, 0.288713, 0.233062, 0.122581], 'normalTex': null, 'depthTex': null, 'projection': new Float32Array(16), 'viewInverseTranspose': new Float32Array(16), 'depthRange': 1 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` varying vec2 v_Uv; uniform sampler2D tDiffuse; uniform vec2 textureSize; // 0 horizontal, 1 vertical uniform int direction; uniform float blurSize; uniform float kernel[KERNEL_SIZE_INT]; #if NORMALTEX_ENABLED == 1 uniform sampler2D normalTex; uniform mat4 viewInverseTranspose; vec3 getViewNormal( const in vec2 screenPosition ) { vec3 normal = texture2D( normalTex, screenPosition ).xyz * 2.0 - 1.0; // Convert to view space return (viewInverseTranspose * vec4(normal, 0.0)).xyz; } #endif #if DEPTHTEX_ENABLED == 1 #if DEPTH_PACKING == 1 #include #endif uniform sampler2D depthTex; uniform mat4 projection; uniform float depthRange; float getDepth( const in vec2 screenPosition ) { #if DEPTH_PACKING == 1 return unpackRGBAToDepth( texture2D( depthTex, screenPosition ) ); #else return texture2D( depthTex, screenPosition ).r; #endif } float getLinearDepth(vec2 coord) { float depth = getDepth(coord) * 2.0 - 1.0; return projection[3][2] / (depth * projection[2][3] - projection[2][2]); } #endif void main() { // float kernel[5]; // kernel[0] = 0.122581; // kernel[1] = 0.233062; // kernel[2] = 0.288713; // kernel[3] = 0.233062; // kernel[4] = 0.122581; vec2 off = vec2(0.0); if (direction == 0) { off[0] = blurSize / textureSize.x; } else { off[1] = blurSize / textureSize.y; } vec4 sum = vec4(0.0); float weightAll = 0.0; #if NORMALTEX_ENABLED == 1 vec3 centerNormal = getViewNormal(v_Uv); #endif #if DEPTHTEX_ENABLED == 1 float centerDepth = getLinearDepth(v_Uv); #endif for (int i = 0; i < KERNEL_SIZE_INT; i++) { vec2 coord = clamp(v_Uv + vec2(float(i) - (KERNEL_SIZE_FLOAT - 1.) / 2.) * off, vec2(0.0), vec2(1.0)); float w = kernel[i]; #if NORMALTEX_ENABLED == 1 vec3 normal = getViewNormal(coord); w *= clamp(dot(normal, centerNormal), 0.0, 1.0); #endif #if DEPTHTEX_ENABLED == 1 float d = getLinearDepth(coord); // PENDING Better equation? // w *= (1.0 - smoothstep(abs(centerDepth - d) / depthRange, 0.0, 1.0)); w *= (1.0 - smoothstep(0.0, 1.0, abs(centerDepth - d) / depthRange)); #endif weightAll += w; sum += w * texture2D(tDiffuse, coord); } gl_FragColor = sum / weightAll; } ` }; export { BlurShader }; ================================================ FILE: examples/jsm/shaders/BokehShader.js ================================================ /** * Bokeh Shader */ const BokehShader = { name: 'bokeh', defines: { 'RINGS': 3, 'SAMPLES': 4 }, uniforms: { 'tColor': null, 'tDepth': null, 'znear': 0.1, 'zfar': 100, 'focalDepth': 1.0, 'focalLength': 24, 'fstop': 0.9, 'maxblur': 1.0, 'threshold': 0.5, 'gain': 2.0, 'bias': 0.5, 'dithering': 0.0001 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` varying vec2 v_Uv; uniform sampler2D tColor; uniform sampler2D tDepth; uniform vec2 u_RenderTargetSize; uniform float znear; uniform float zfar; uniform float focalDepth; uniform float focalLength; uniform float fstop; uniform float maxblur; // clamp value of max blur (0.0 = no blur, 1.0 default) uniform float threshold; // highlight threshold uniform float gain; // highlight gain uniform float bias; // bokeh edge bias uniform float dithering; const int samples = SAMPLES; const int rings = RINGS; const int maxringsamples = rings * samples; float CoC = 0.03; // circle of confusion size in mm (35mm film = 0.03mm) vec3 color(vec2 coords, float blur) { vec3 col = texture2D(tColor, coords).rgb; vec3 lumcoeff = vec3(0.299,0.587,0.114); float lum = dot(col.rgb, lumcoeff); float thresh = max((lum - threshold) * gain, 0.0); return col + mix(vec3(0.0), col, thresh * blur); } float linearize(float depth) { return -zfar * znear / (depth * (zfar - znear) - zfar); } float gather(float i, float j, int ringsamples, inout vec3 col, float w, float h, float blur) { float rings2 = float(rings); float step = PI * 2.0 / float(ringsamples); float pw = cos(j * step) * i; float ph = sin(j * step) * i; col += color(v_Uv + vec2(pw * w, ph * h), blur) * mix(1.0, i / rings2, bias); return mix(1.0, i / rings2, bias); } void main() { float depth = linearize(texture2D(tDepth, v_Uv).x); float fDepth = focalDepth; // dof blur factor calculation float f = focalLength; // focal length in mm float d = fDepth * 1000.; // focal plane in mm float o = depth * 1000.; // depth in mm float a = (o * f) / (o - f); float b = (d * f) / (d - f); float c = (d - f) / (d * fstop * CoC); float blur = abs(a - b) * c; blur = clamp(blur, 0.0, 1.0); // calculation of pattern for dithering vec2 noise = vec2(rand(v_Uv), rand(v_Uv + vec2(0.4, 0.6))) * dithering * blur; // getting blur x and y step factor vec2 pixelSize = 1.0 / u_RenderTargetSize; float w = pixelSize.x * blur * maxblur + noise.x; float h = pixelSize.y * blur * maxblur + noise.y; // calculation of final color vec3 col = vec3(0.0); if (blur < 0.05) { col = texture2D(tColor, v_Uv).rgb; } else { col = texture2D(tColor, v_Uv).rgb; float s = 1.0; int ringsamples; for(int i = 1; i <= rings; i++) { ringsamples = i * samples; for (int j = 0; j < maxringsamples; j++) { if (j >= ringsamples) break; s += gather(float(i), float(j), ringsamples, col, w, h, blur); } } col /= s; // divide by sample count } gl_FragColor = vec4(col, 1.0); } ` }; export { BokehShader }; ================================================ FILE: examples/jsm/shaders/ClusteredDebugShader.js ================================================ const ClusteredDebugShader = { name: 'clustered_debug', vertexShader: ` #include #include #include #include #include void main() { #include #include #include #include #include #include } `, fragmentShader: ` #include #include #include #include #include void main() { #include #include gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); #ifdef USE_CLUSTERED_LIGHTS vec4 positionView = u_View * vec4(v_modelPos, 1.0); float perspectiveFactor = step(0.0, cellsTransformFactors.z); float halfFrustumHeight = -cellsTransformFactors.z * mix(1.0, positionView.z, perspectiveFactor); float halfFrustumWidth = halfFrustumHeight * cellsTransformFactors.w; vec3 cellCoords; cellCoords.z = floor(log(-positionView.z) * cellsTransformFactors.x + cellsTransformFactors.y); cellCoords.y = floor((positionView.y / (2.0 * halfFrustumHeight) + 0.5) * cells.y); cellCoords.x = floor((positionView.x / (2.0 * halfFrustumWidth) + 0.5) * cells.x); if(!(any(lessThan(cellCoords, vec3(0.0))) || any(greaterThanEqual(cellCoords, cells)))) { float cellIndex = dot(cellsDotData, cellCoords); float clusterV = floor(cellIndex * cellsTextureSize.y); float clusterU = cellIndex - (clusterV * cellsTextureSize.x); int size = textureSize(lightsTexture, 0).x; ClusteredPointLight clusteredPointLight; ClusteredSpotLight clusteredSpotLight; vec3 clusteredLightColor; float clusteredLightDistance; float clusteredAngleCos; vec3 debugColor = vec3(0.0); for (int lightCellIndex = 0; lightCellIndex < maxLightsPerCell; lightCellIndex++) { float lightIndex = texelFetch(cellsTexture, ivec2(int(clusterU) + lightCellIndex, clusterV), 0).x; if (lightIndex <= 0.0) break; debugColor = mix(vec3(0., 0., 1.), vec3(1., 0., 0.), float(lightCellIndex + 1) / float(maxLightsPerCell)); } gl_FragColor = vec4(debugColor, 1.0); } #endif } ` }; export { ClusteredDebugShader }; ================================================ FILE: examples/jsm/shaders/ColorAdjustShader.js ================================================ /** * Color Adjust Shader */ const ColorAdjustShader = { name: 'color_adjust', uniforms: { 'tDiffuse': null, 'brightness': 0.0, 'contrast': 1.0, 'exposure': 0.0, 'gamma': 1.0, 'saturation': 1.0 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform float brightness; uniform float contrast; uniform float exposure; uniform float gamma; uniform float saturation; uniform sampler2D tDiffuse; varying vec2 v_Uv; // Values from "Graphics Shaders: Theory and Practice" by Bailey and Cunningham const vec3 w = vec3(0.2125, 0.7154, 0.0721); void main() { vec4 tex = texture2D(tDiffuse, v_Uv); // brightness vec3 color = clamp(tex.rgb + vec3(brightness), 0.0, 1.0); // contrast color = clamp((color-vec3(0.5)) * contrast+vec3(0.5), 0.0, 1.0); // exposure color = clamp(color * pow(2.0, exposure), 0.0, 1.0); // gamma color = clamp(pow(color, vec3(gamma)), 0.0, 1.0); // saturation float luminance = dot(color, w); color = mix(vec3(luminance), color, saturation); gl_FragColor = vec4(color, tex.a); } ` }; export { ColorAdjustShader }; ================================================ FILE: examples/jsm/shaders/CopyShader.js ================================================ /** * Copy Shader */ const CopyShader = { name: 'copy', uniforms: { 'tDiffuse': null, 'opacity': 1.0 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform float opacity; uniform sampler2D tDiffuse; varying vec2 v_Uv; void main() { vec4 texel = texture2D(tDiffuse, v_Uv); gl_FragColor = opacity * texel; } ` }; export { CopyShader }; ================================================ FILE: examples/jsm/shaders/DeferredShader.js ================================================ /** * shaders for deferred renderer */ const DeferredShaderChunk = { packVector3: ` float vec3_to_float(vec3 data) { const float unit = 254.0 / 256.0; // todo 255.0 / 256.0 error, why ? highp float compressed = fract(data.x * unit) + floor(data.y * unit * 255.0) + floor(data.z * unit * 255.0) * 255.0; return compressed; } `, unpackFloat: ` vec3 float_to_vec3(float data) { const float unit = 255.0; vec3 uncompressed; uncompressed.x = fract(data); float zInt = floor(data / unit); uncompressed.z = fract(zInt / unit); uncompressed.y = fract(floor(data - (zInt * unit)) / unit); return uncompressed; } `, // Refer to http://aras-p.info/texts/CompactNormalStorage.html packNormal: ` vec2 normal_to_vec2(vec3 normal) { return normal.xy / sqrt(normal.z * 8.0 + 8.0) + 0.5; } `, unpackVector2: ` vec3 vec2_to_normal(vec2 data) { vec2 fenc = data * 4.0 - 2.0; float f = dot(fenc, fenc); float g = sqrt(1.0 - f / 4.0); vec3 normal; normal.xy = fenc * g; normal.z = 1.0 - f / 2.0; return normal; } `, computeTextureCoord: ` vec2 texCoord = gl_FragCoord.xy / vec2(viewWidth, viewHeight); `, packNormalDepth: ` vec4 packedNormalDepth; packedNormalDepth.xyz = normal * 0.5 + 0.5; packedNormalDepth.w = position.z / position.w; `, unpackNormalDepth: ` vec4 normalDepthMap = texture2D(samplerNormalDepth, texCoord); float depth = normalDepthMap.w; if (depth == 0.0) discard; vec3 normal = normalDepthMap.xyz * 2.0 - 1.0; `, packNormalDepthShininess: ` vec4 packedNormalDepthShininess; packedNormalDepthShininess.xy = normal_to_vec2(normal); packedNormalDepthShininess.z = shininess; packedNormalDepthShininess.w = position.z / position.w; `, unpackNormalDepthShininess: ` vec4 normalDepthMap = texture2D(samplerNormalDepthShininess, texCoord); float depth = normalDepthMap.w; if (depth == 0.0) discard; vec3 normal = vec2_to_normal(normalDepthMap.xy); float shininess = normalDepthMap.z; `, packColor: ` vec4 packedColor; packedColor.x = vec3_to_float(diffuseColor.rgb); packedColor.y = vec3_to_float(emissiveColor); packedColor.z = vec3_to_float(specularColor); packedColor.w = shininess; `, unpackColor: ` vec4 colorMap = texture2D(samplerColor, texCoord); vec3 diffuseColor = float_to_vec3(colorMap.x); vec3 emissiveColor = float_to_vec3(colorMap.y); vec3 specularColor = float_to_vec3(colorMap.z); float shininess = colorMap.w; `, packLight: ` vec4 packedLight; packedLight.xyz = lightIntensity * PI * lightColor * max(dot(lightVector, normal), 0.0) * attenuation; packedLight.w = lightIntensity * PI * specular * max(dot(lightVector, normal), 0.0); `, computeVertexPositionVS: ` vec2 xy = texCoord * 2.0 - 1.0; vec4 vertexPositionProjected = vec4(xy, depth, 1.0); vec4 vertexPositionVS = matProjViewInverse * vertexPositionProjected; vertexPositionVS.xyz /= vertexPositionVS.w; vertexPositionVS.w = 1.0; `, // TODO: calculate schlick computeSpecular: ` vec3 halfVector = normalize(lightVector + viewVector); float dotNormalHalf = max(dot(normal, halfVector), 0.0); float specular = D_BlinnPhong(shininess, dotNormalHalf); `, combine: ` gl_FragColor = vec4(lightIntensity * PI * lightColor * max(dot(lightVector, normal), 0.0) * (diffuseColor + specular * specularColor) * attenuation, 1.0); ` }; const DeferredShader = { // rgb: normal, a: depth normalDepth: { name: 'deferred_normaldepth', vertexShader: ` #include #include #include #include #include varying vec4 vPosition; void main() { #include #include #include #include #include #include #include #include vPosition = gl_Position; } `, fragmentShader: ` #include #include #include #include #include #include varying vec4 vPosition; void main() { #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST) vec4 texelColor = texture2D(diffuseMap, v_Uv); float alpha = texelColor.a * u_Opacity; if(alpha < u_AlphaTest) discard; #endif vec3 normal = normalize(v_Normal); vec4 position = vPosition; ${DeferredShaderChunk.packNormalDepth} gl_FragColor = packedNormalDepth; } ` }, // r: diffuse, g: emissive, b: speculer, a: shininess color: { name: 'deferred_color', uniforms: { specular: [1, 1, 1], shininess: 30 }, vertexShader: ` #include #include #include #include #include #include void main() { #include #include #include #include #include #include } `, fragmentShader: ` uniform vec3 u_Color; uniform vec3 emissive; uniform vec3 specular; uniform float shininess; #include #include ${DeferredShaderChunk.packVector3} void main() { vec4 outColor = vec4(u_Color, 1.0); #include vec4 diffuseColor = outColor; vec3 emissiveColor = emissive; vec3 specularColor = specular; ${DeferredShaderChunk.packColor} gl_FragColor = packedColor; } ` }, emissiveLight: { name: 'deferred_emissivelight', uniforms: { samplerColor: null, viewWidth: 800, viewHeight: 600 }, vertexShader: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D samplerColor; uniform float viewHeight; uniform float viewWidth; ${DeferredShaderChunk.unpackFloat} void main() { ${DeferredShaderChunk.computeTextureCoord} ${DeferredShaderChunk.unpackColor} gl_FragColor = vec4(emissiveColor, 1.0); } ` }, directionalLight: { name: 'deferred_directionallight', defines: { 'SHADOW': 0 }, uniforms: { samplerNormalDepth: null, samplerColor: null, lightColor: [0, 0, 0], lightDirectionVS: [0, 1, 0], lightIntensity: 1, shadowMatrix: new Float32Array(16), shadowMap: null, shadowBias: 0, shadowRadius: 1, shadowMapSize: [1024, 1024], viewWidth: 800, viewHeight: 600, matProjViewInverse: new Float32Array(16), cameraPos: [0, 0, 0] }, vertexShader: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include uniform sampler2D samplerNormalDepth; uniform sampler2D samplerColor; uniform float viewHeight; uniform float viewWidth; uniform vec3 lightColor; uniform vec3 lightDirectionVS; uniform float lightIntensity; #if SHADOW == 1 uniform sampler2D shadowMap; uniform mat4 shadowMatrix; uniform float shadowBias; uniform float shadowRadius; uniform vec2 shadowMapSize; #include #include #endif uniform mat4 matProjViewInverse; uniform vec3 cameraPos; ${DeferredShaderChunk.unpackFloat} void main() { ${DeferredShaderChunk.computeTextureCoord} ${DeferredShaderChunk.unpackNormalDepth} ${DeferredShaderChunk.computeVertexPositionVS} ${DeferredShaderChunk.unpackColor} vec3 lightVector = normalize(lightDirectionVS); vec3 viewVector = normalize(cameraPos - vertexPositionVS.xyz); ${DeferredShaderChunk.computeSpecular} float attenuation = 1.0 / PI; #if SHADOW == 1 attenuation *= getShadow(shadowMap, shadowMatrix * vertexPositionVS, shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.)); #endif ${DeferredShaderChunk.combine} } ` }, pointLight: { name: 'deferred_pointlight', defines: { 'SHADOW': 0 }, uniforms: { samplerNormalDepth: null, samplerColor: null, lightColor: [0, 0, 0], lightPositionVS: [0, 1, 0], lightRadius: 1, lightDecay: 1, lightIntensity: 1, shadowMap: null, shadowBias: 0, shadowRadius: 1, shadowMapSize: [1024, 1024], shadowCameraNear: 1, shadowCameraFar: 100, viewWidth: 800, viewHeight: 600, matProjViewInverse: new Float32Array(16), cameraPos: [0, 0, 0] }, vertexShader: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include uniform sampler2D samplerNormalDepth; uniform sampler2D samplerColor; uniform float viewHeight; uniform float viewWidth; uniform vec3 lightColor; uniform vec3 lightPositionVS; uniform float lightRadius; uniform float lightDecay; uniform float lightIntensity; #if SHADOW == 1 uniform samplerCube shadowMap; uniform float shadowBias; uniform float shadowRadius; uniform vec2 shadowMapSize; uniform float shadowCameraNear; uniform float shadowCameraFar; #include #include #endif uniform mat4 matProjViewInverse; uniform vec3 cameraPos; ${DeferredShaderChunk.unpackFloat} void main() { ${DeferredShaderChunk.computeTextureCoord} ${DeferredShaderChunk.unpackNormalDepth} ${DeferredShaderChunk.computeVertexPositionVS} vec3 lightVector = lightPositionVS - vertexPositionVS.xyz; float distance = length(lightVector); if (distance > lightRadius) discard; lightVector = normalize(lightVector); vec3 viewVector = normalize(cameraPos - vertexPositionVS.xyz); ${DeferredShaderChunk.unpackColor} ${DeferredShaderChunk.computeSpecular} float attenuation = pow(clamp(1. - distance / lightRadius, 0.0, 1.0), lightDecay) / PI; #if SHADOW == 1 attenuation *= getPointShadow(shadowMap, vec4(vertexPositionVS.xyz - lightPositionVS, 1.0), shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.), vec2(shadowCameraNear, shadowCameraFar)); #endif ${DeferredShaderChunk.combine} } ` }, spotLight: { name: 'deferred_spotlight', defines: { 'SHADOW': 0 }, uniforms: { samplerNormalDepth: null, samplerColor: null, lightColor: [0, 0, 0], lightDirectionVS: [0, 1, 0], lightPositionVS: [0, 0, 0], lightConeCos: 1, lightPenumbraCos: 1, lightRadius: 1, lightDecay: 1, lightIntensity: 1, shadowMatrix: new Float32Array(16), shadowMap: null, shadowBias: 0, shadowRadius: 1, shadowMapSize: [1024, 1024], viewWidth: 800, viewHeight: 600, matProjViewInverse: new Float32Array(16), cameraPos: [0, 0, 0] }, vertexShader: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include uniform sampler2D samplerNormalDepth; uniform sampler2D samplerColor; uniform float viewHeight; uniform float viewWidth; uniform vec3 lightColor; uniform vec3 lightPositionVS; uniform vec3 lightDirectionVS; uniform float lightConeCos; uniform float lightPenumbraCos; uniform float lightRadius; uniform float lightDecay; uniform float lightIntensity; #if SHADOW == 1 uniform sampler2D shadowMap; uniform mat4 shadowMatrix; uniform float shadowBias; uniform float shadowRadius; uniform vec2 shadowMapSize; #include #include #endif uniform mat4 matProjViewInverse; uniform vec3 cameraPos; ${DeferredShaderChunk.unpackFloat} void main() { ${DeferredShaderChunk.computeTextureCoord} ${DeferredShaderChunk.unpackNormalDepth} ${DeferredShaderChunk.computeVertexPositionVS} ${DeferredShaderChunk.unpackColor} vec3 lightVector = lightPositionVS.xyz - vertexPositionVS.xyz; float distance = length( lightVector ); lightVector = normalize( lightVector ); float angleCos = dot( lightDirectionVS, lightVector ); if ( angleCos <= lightConeCos ) discard; if ( distance > lightRadius ) discard; float spotEffect = smoothstep( lightConeCos, lightPenumbraCos, angleCos ); float dist = pow(clamp(1. - distance / lightRadius, 0.0, 1.0), lightDecay); float spot = dist * spotEffect; diffuseColor *= spot; vec3 viewVector = normalize( cameraPos - vertexPositionVS.xyz ); ${DeferredShaderChunk.computeSpecular} float attenuation = 1.0 / PI; #if SHADOW == 1 attenuation *= getShadow(shadowMap, shadowMatrix * vertexPositionVS, shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.)); #endif ${DeferredShaderChunk.combine} } ` }, normalDepthShininess: { name: 'deferred_normaldepthshininess', uniforms: { shininess: 30 }, vertexShader: ` #include #include #include #include #include varying vec4 vPosition; void main() { #include #include #include #include #include #include #include #include vPosition = gl_Position; // need this, but not gl_FragCoord.z / gl_FragCoord.w ? } `, fragmentShader: ` #include #include #include #include #include #include varying vec4 vPosition; uniform float shininess; ${DeferredShaderChunk.packNormal} void main() { #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST) vec4 texelColor = texture2D(diffuseMap, v_Uv); float alpha = texelColor.a * u_Opacity; if(alpha < u_AlphaTest) discard; #endif vec3 normal = normalize(v_Normal); vec4 position = vPosition; ${DeferredShaderChunk.packNormalDepthShininess} gl_FragColor = packedNormalDepthShininess; } ` }, pointLightPre: { name: 'deferred_pointlightpre', defines: { 'SHADOW': 0 }, uniforms: { samplerNormalDepthShininess: null, lightColor: [0, 0, 0], lightPositionVS: [0, 0, 0], lightRadius: 1, lightDecay: 1, lightIntensity: 1, shadowMap: null, shadowBias: 0, shadowRadius: 1, shadowMapSize: [1024, 1024], shadowCameraNear: 1, shadowCameraFar: 100, viewWidth: 800, viewHeight: 600, matProjViewInverse: new Float32Array(16), cameraPos: [0, 0, 0] }, vertexShader: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include uniform sampler2D samplerNormalDepthShininess; uniform float viewHeight; uniform float viewWidth; uniform vec3 lightColor; uniform vec3 lightPositionVS; uniform float lightRadius; uniform float lightDecay; uniform float lightIntensity; #if SHADOW == 1 uniform samplerCube shadowMap; uniform float shadowBias; uniform float shadowRadius; uniform vec2 shadowMapSize; uniform float shadowCameraNear; uniform float shadowCameraFar; #include #include #endif uniform mat4 matProjViewInverse; uniform vec3 cameraPos; ${DeferredShaderChunk.unpackFloat} ${DeferredShaderChunk.unpackVector2} void main() { ${DeferredShaderChunk.computeTextureCoord} ${DeferredShaderChunk.unpackNormalDepthShininess} ${DeferredShaderChunk.computeVertexPositionVS} vec3 lightVector = lightPositionVS - vertexPositionVS.xyz; float distance = length(lightVector); if (distance > lightRadius) discard; lightVector = normalize(lightVector); vec3 viewVector = normalize(cameraPos - vertexPositionVS.xyz); ${DeferredShaderChunk.computeSpecular} float attenuation = pow(clamp(1. - distance / lightRadius, 0.0, 1.0), lightDecay) / PI; #if SHADOW == 1 attenuation *= getPointShadow(shadowMap, vec4(vertexPositionVS.xyz - lightPositionVS, 1.0), shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.), vec2(shadowCameraNear, shadowCameraFar)); #endif ${DeferredShaderChunk.packLight} gl_FragColor = packedLight; } ` }, spotLightPre: { name: 'deferred_spotlightpre', defines: { 'SHADOW': 0 }, uniforms: { samplerNormalDepth: null, lightColor: [0, 0, 0], lightDirectionVS: [0, 1, 0], lightPositionVS: [0, 0, 0], lightConeCos: 1, lightPenumbraCos: 1, lightRadius: 1, lightDecay: 1, lightIntensity: 1, shadowMatrix: new Float32Array(16), shadowMap: null, shadowBias: 0, shadowRadius: 1, shadowMapSize: [1024, 1024], viewWidth: 800, viewHeight: 600, matProjViewInverse: new Float32Array(16), cameraPos: [0, 0, 0] }, vertexShader: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include uniform sampler2D samplerNormalDepthShininess; uniform float viewHeight; uniform float viewWidth; uniform vec3 lightColor; uniform vec3 lightPositionVS; uniform vec3 lightDirectionVS; uniform float lightConeCos; uniform float lightPenumbraCos; uniform float lightRadius; uniform float lightDecay; uniform float lightIntensity; #if SHADOW == 1 uniform sampler2D shadowMap; uniform mat4 shadowMatrix; uniform float shadowBias; uniform float shadowRadius; uniform vec2 shadowMapSize; #include #include #endif uniform mat4 matProjViewInverse; uniform vec3 cameraPos; ${DeferredShaderChunk.unpackFloat} ${DeferredShaderChunk.unpackVector2} void main() { ${DeferredShaderChunk.computeTextureCoord} ${DeferredShaderChunk.unpackNormalDepthShininess} ${DeferredShaderChunk.computeVertexPositionVS} vec3 lightVector = lightPositionVS.xyz - vertexPositionVS.xyz; float distance = length(lightVector); lightVector = normalize(lightVector); float angleCos = dot(lightDirectionVS, lightVector); if (angleCos <= lightConeCos) discard; if (distance > lightRadius) discard; float spotEffect = smoothstep(lightConeCos, lightPenumbraCos, angleCos); float dist = pow(clamp(1. - distance / lightRadius, 0.0, 1.0), lightDecay); float spot = dist * spotEffect; vec3 viewVector = normalize( cameraPos - vertexPositionVS.xyz ); ${DeferredShaderChunk.computeSpecular} float attenuation = 1.0 / PI; #if SHADOW == 1 attenuation *= getShadow(shadowMap, shadowMatrix * vertexPositionVS, shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.)); #endif ${DeferredShaderChunk.packLight} gl_FragColor = spot * packedLight; } ` }, directionalLightPre: { name: 'deferred_directionallightpre', defines: { 'SHADOW': 0 }, uniforms: { samplerNormalDepthShininess: null, lightColor: [0, 0, 0], lightDirectionVS: [0, 1, 0], lightIntensity: 1, shadowMatrix: new Float32Array(16), shadowMap: null, shadowBias: 0, shadowRadius: 1, shadowMapSize: [1024, 1024], viewWidth: 800, viewHeight: 600, matProjViewInverse: new Float32Array(16), cameraPos: [0, 0, 0] }, vertexShader: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include uniform sampler2D samplerNormalDepthShininess; uniform float viewHeight; uniform float viewWidth; uniform vec3 lightColor; uniform vec3 lightDirectionVS; uniform float lightIntensity; #if SHADOW == 1 uniform sampler2D shadowMap; uniform mat4 shadowMatrix; uniform float shadowBias; uniform float shadowRadius; uniform vec2 shadowMapSize; #include #include #endif uniform mat4 matProjViewInverse; uniform vec3 cameraPos; ${DeferredShaderChunk.unpackFloat} ${DeferredShaderChunk.unpackVector2} void main() { ${DeferredShaderChunk.computeTextureCoord} ${DeferredShaderChunk.unpackNormalDepthShininess} ${DeferredShaderChunk.computeVertexPositionVS} vec3 lightVector = normalize(lightDirectionVS); vec3 viewVector = normalize(cameraPos - vertexPositionVS.xyz); ${DeferredShaderChunk.computeSpecular} float attenuation = 1.0 / PI; #if SHADOW == 1 attenuation *= getShadow(shadowMap, shadowMatrix * vertexPositionVS, shadowMapSize, vec2(shadowBias, 0.), vec2(shadowRadius, 0.)); #endif ${DeferredShaderChunk.packLight} gl_FragColor = packedLight; } ` }, reconstruction: { name: 'deferred_reconstruction', uniforms: { samplerLight: null, specular: [0, 0, 0], shininess: 30, viewWidth: 800, viewHeight: 600 }, vertexShader: ` #include #include #include #include #include void main() { #include #include #include #include #include } `, fragmentShader: ` uniform sampler2D samplerLight; uniform vec3 u_Color; uniform vec3 emissive; uniform vec3 specular; uniform float shininess; uniform float viewHeight; uniform float viewWidth; #include #include ${DeferredShaderChunk.unpackFloat} void main() { vec4 outColor = vec4(u_Color, 1.0); vec3 emissiveColor = emissive; vec3 specularColor = specular; ${DeferredShaderChunk.computeTextureCoord} vec4 light = texture2D(samplerLight, texCoord); #include vec4 diffuseColor = outColor; vec3 diffuseFinal = diffuseColor.rgb * light.rgb; vec3 emissiveFinal = emissiveColor; vec3 specularFinal = specularColor * light.rgb * light.a; gl_FragColor = vec4(diffuseFinal + emissiveFinal + specularFinal, 1.0); } ` } }; export { DeferredShader }; ================================================ FILE: examples/jsm/shaders/DepthLinearShader.js ================================================ /** * Depth Linear Shader */ const DepthLinearShader = { name: 'depth_linear', defines: {}, uniforms: { 'depthTex': null, 'cameraNear': 1.0, 'cameraFar': 1000.0 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` float perspectiveDepthToViewZ(const in float invClipZ, const in float near, const in float far) { return (near * far) / ((far - near) * invClipZ - far); } float viewZToOrthographicDepth(const in float viewZ, const in float near, const in float far) { return (viewZ + near) / (near - far); } uniform sampler2D depthTex; uniform float cameraNear; uniform float cameraFar; varying vec2 v_Uv; void main() { vec4 texel = texture2D(depthTex, v_Uv); float depth = perspectiveDepthToViewZ(texel.r, cameraNear, cameraFar); gl_FragColor = vec4(vec3(1. - viewZToOrthographicDepth(depth, cameraNear, cameraFar)), 1.); } ` }; export { DepthLinearShader }; ================================================ FILE: examples/jsm/shaders/FXAAShader.js ================================================ /** * NVIDIA FXAA by Timothy Lottes * http://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html * - WebGL port by \@supereggbert * http://www.glge.org/demos/fxaa/ */ const FXAAShader = { name: 'fxaa', uniforms: { 'tDiffuse': null }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D tDiffuse; varying vec2 v_Uv; uniform vec2 u_RenderTargetSize; // FXAA 3.11 implementation by NVIDIA, ported to WebGL by Agost Biro (biro@archilogic.com) //---------------------------------------------------------------------------------- // File: es3-kepler/FXAA/assets/shaders/FXAA_DefaultES.frag // SDK Version: v3.00 // Email: gameworks@nvidia.com // Site: http://developer.nvidia.com/ // // Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of NVIDIA CORPORATION nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //---------------------------------------------------------------------------------- #define FXAA_PC 1 #define FXAA_GLSL_100 1 #define FXAA_QUALITY_PRESET 39 #define FXAA_GREEN_AS_LUMA 1 /*--------------------------------------------------------------------------*/ #ifndef FXAA_PC_CONSOLE // // The console algorithm for PC is included // for developers targeting really low spec machines. // Likely better to just run FXAA_PC, and use a really low preset. // #define FXAA_PC_CONSOLE 0 #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_GLSL_120 #define FXAA_GLSL_120 0 #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_GLSL_130 #define FXAA_GLSL_130 0 #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_HLSL_3 #define FXAA_HLSL_3 0 #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_HLSL_4 #define FXAA_HLSL_4 0 #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_HLSL_5 #define FXAA_HLSL_5 0 #endif /*==========================================================================*/ #ifndef FXAA_GREEN_AS_LUMA // // For those using non-linear color, // and either not able to get luma in alpha, or not wanting to, // this enables FXAA to run using green as a proxy for luma. // So with this enabled, no need to pack luma in alpha. // // This will turn off AA on anything which lacks some amount of green. // Pure red and blue or combination of only R and B, will get no AA. // // Might want to lower the settings for both, // fxaaConsoleEdgeThresholdMin // fxaaQualityEdgeThresholdMin // In order to insure AA does not get turned off on colors // which contain a minor amount of green. // // 1 = On. // 0 = Off. // #define FXAA_GREEN_AS_LUMA 0 #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_EARLY_EXIT // // Controls algorithm's early exit path. // On PS3 turning this ON adds 2 cycles to the shader. // On 360 turning this OFF adds 10ths of a millisecond to the shader. // Turning this off on console will result in a more blurry image. // So this defaults to on. // // 1 = On. // 0 = Off. // #define FXAA_EARLY_EXIT 1 #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_DISCARD // // Only valid for PC OpenGL currently. // Probably will not work when FXAA_GREEN_AS_LUMA = 1. // // 1 = Use discard on pixels which don't need AA. // For APIs which enable concurrent TEX+ROP from same surface. // 0 = Return unchanged color on pixels which don't need AA. // #define FXAA_DISCARD 0 #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_FAST_PIXEL_OFFSET // // Used for GLSL 120 only. // // 1 = GL API supports fast pixel offsets // 0 = do not use fast pixel offsets // #ifdef GL_EXT_gpu_shader4 #define FXAA_FAST_PIXEL_OFFSET 1 #endif #ifdef GL_NV_gpu_shader5 #define FXAA_FAST_PIXEL_OFFSET 1 #endif #ifdef GL_ARB_gpu_shader5 #define FXAA_FAST_PIXEL_OFFSET 1 #endif #ifndef FXAA_FAST_PIXEL_OFFSET #define FXAA_FAST_PIXEL_OFFSET 0 #endif #endif /*--------------------------------------------------------------------------*/ #ifndef FXAA_GATHER4_ALPHA // // 1 = API supports gather4 on alpha channel. // 0 = API does not support gather4 on alpha channel. // #if (FXAA_HLSL_5 == 1) #define FXAA_GATHER4_ALPHA 1 #endif #ifdef GL_ARB_gpu_shader5 #define FXAA_GATHER4_ALPHA 1 #endif #ifdef GL_NV_gpu_shader5 #define FXAA_GATHER4_ALPHA 1 #endif #ifndef FXAA_GATHER4_ALPHA #define FXAA_GATHER4_ALPHA 0 #endif #endif /*============================================================================ FXAA QUALITY - TUNING KNOBS ------------------------------------------------------------------------------ NOTE the other tuning knobs are now in the shader function inputs! ============================================================================*/ #ifndef FXAA_QUALITY_PRESET // // Choose the quality preset. // This needs to be compiled into the shader as it effects code. // Best option to include multiple presets is to // in each shader define the preset, then include this file. // // OPTIONS // ----------------------------------------------------------------------- // 10 to 15 - default medium dither (10=fastest, 15=highest quality) // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality) // 39 - no dither, very expensive // // NOTES // ----------------------------------------------------------------------- // 12 = slightly faster then FXAA 3.9 and higher edge quality (default) // 13 = about same speed as FXAA 3.9 and better than 12 // 23 = closest to FXAA 3.9 visually and performance wise // _ = the lowest digit is directly related to performance // _ = the highest digit is directly related to style // #define FXAA_QUALITY_PRESET 12 #endif /*============================================================================ FXAA QUALITY - PRESETS ============================================================================*/ /*============================================================================ FXAA QUALITY - MEDIUM DITHER PRESETS ============================================================================*/ #if (FXAA_QUALITY_PRESET == 10) #define FXAA_QUALITY_PS 3 #define FXAA_QUALITY_P0 1.5 #define FXAA_QUALITY_P1 3.0 #define FXAA_QUALITY_P2 12.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 11) #define FXAA_QUALITY_PS 4 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 3.0 #define FXAA_QUALITY_P3 12.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 12) #define FXAA_QUALITY_PS 5 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 4.0 #define FXAA_QUALITY_P4 12.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 13) #define FXAA_QUALITY_PS 6 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 4.0 #define FXAA_QUALITY_P5 12.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 14) #define FXAA_QUALITY_PS 7 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 4.0 #define FXAA_QUALITY_P6 12.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 15) #define FXAA_QUALITY_PS 8 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 4.0 #define FXAA_QUALITY_P7 12.0 #endif /*============================================================================ FXAA QUALITY - LOW DITHER PRESETS ============================================================================*/ #if (FXAA_QUALITY_PRESET == 20) #define FXAA_QUALITY_PS 3 #define FXAA_QUALITY_P0 1.5 #define FXAA_QUALITY_P1 2.0 #define FXAA_QUALITY_P2 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 21) #define FXAA_QUALITY_PS 4 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 22) #define FXAA_QUALITY_PS 5 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 23) #define FXAA_QUALITY_PS 6 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 24) #define FXAA_QUALITY_PS 7 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 3.0 #define FXAA_QUALITY_P6 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 25) #define FXAA_QUALITY_PS 8 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 4.0 #define FXAA_QUALITY_P7 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 26) #define FXAA_QUALITY_PS 9 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 4.0 #define FXAA_QUALITY_P8 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 27) #define FXAA_QUALITY_PS 10 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 4.0 #define FXAA_QUALITY_P9 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 28) #define FXAA_QUALITY_PS 11 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 4.0 #define FXAA_QUALITY_P10 8.0 #endif /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PRESET == 29) #define FXAA_QUALITY_PS 12 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.5 #define FXAA_QUALITY_P2 2.0 #define FXAA_QUALITY_P3 2.0 #define FXAA_QUALITY_P4 2.0 #define FXAA_QUALITY_P5 2.0 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 2.0 #define FXAA_QUALITY_P10 4.0 #define FXAA_QUALITY_P11 8.0 #endif /*============================================================================ FXAA QUALITY - EXTREME QUALITY ============================================================================*/ #if (FXAA_QUALITY_PRESET == 39) #define FXAA_QUALITY_PS 12 #define FXAA_QUALITY_P0 1.0 #define FXAA_QUALITY_P1 1.0 #define FXAA_QUALITY_P2 1.0 #define FXAA_QUALITY_P3 1.0 #define FXAA_QUALITY_P4 1.0 #define FXAA_QUALITY_P5 1.5 #define FXAA_QUALITY_P6 2.0 #define FXAA_QUALITY_P7 2.0 #define FXAA_QUALITY_P8 2.0 #define FXAA_QUALITY_P9 2.0 #define FXAA_QUALITY_P10 4.0 #define FXAA_QUALITY_P11 8.0 #endif /*============================================================================ API PORTING ============================================================================*/ #if (FXAA_GLSL_100 == 1) || (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1) #define FxaaBool bool #define FxaaDiscard discard #define FxaaFloat float #define FxaaFloat2 vec2 #define FxaaFloat3 vec3 #define FxaaFloat4 vec4 #define FxaaHalf float #define FxaaHalf2 vec2 #define FxaaHalf3 vec3 #define FxaaHalf4 vec4 #define FxaaInt2 ivec2 #define FxaaSat(x) clamp(x, 0.0, 1.0) #define FxaaTex sampler2D #else #define FxaaBool bool #define FxaaDiscard clip(-1) #define FxaaFloat float #define FxaaFloat2 float2 #define FxaaFloat3 float3 #define FxaaFloat4 float4 #define FxaaHalf half #define FxaaHalf2 half2 #define FxaaHalf3 half3 #define FxaaHalf4 half4 #define FxaaSat(x) saturate(x) #endif /*--------------------------------------------------------------------------*/ #if (FXAA_GLSL_100 == 1) #define FxaaTexTop(t, p) texture2D(t, p, 0.0) #define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), 0.0) #endif /*--------------------------------------------------------------------------*/ #if (FXAA_GLSL_120 == 1) // Requires, // #version 120 // And at least, // #extension GL_EXT_gpu_shader4 : enable // (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9) #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0) #if (FXAA_FAST_PIXEL_OFFSET == 1) #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o) #else #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0) #endif #if (FXAA_GATHER4_ALPHA == 1) // use #extension GL_ARB_gpu_shader5 : enable #define FxaaTexAlpha4(t, p) textureGather(t, p, 3) #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3) #define FxaaTexGreen4(t, p) textureGather(t, p, 1) #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1) #endif #endif /*--------------------------------------------------------------------------*/ #if (FXAA_GLSL_130 == 1) // Requires '#version 130' or better #define FxaaTexTop(t, p) textureLod(t, p, 0.0) #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o) #if (FXAA_GATHER4_ALPHA == 1) // use #extension GL_ARB_gpu_shader5 : enable #define FxaaTexAlpha4(t, p) textureGather(t, p, 3) #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3) #define FxaaTexGreen4(t, p) textureGather(t, p, 1) #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1) #endif #endif /*--------------------------------------------------------------------------*/ #if (FXAA_HLSL_3 == 1) #define FxaaInt2 float2 #define FxaaTex sampler2D #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0)) #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0)) #endif /*--------------------------------------------------------------------------*/ #if (FXAA_HLSL_4 == 1) #define FxaaInt2 int2 struct FxaaTex { SamplerState smpl; Texture2D tex; }; #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) #endif /*--------------------------------------------------------------------------*/ #if (FXAA_HLSL_5 == 1) #define FxaaInt2 int2 struct FxaaTex { SamplerState smpl; Texture2D tex; }; #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) #define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p) #define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o) #define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p) #define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o) #endif /*============================================================================ GREEN AS LUMA OPTION SUPPORT FUNCTION ============================================================================*/ #if (FXAA_GREEN_AS_LUMA == 0) FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; } #else FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; } #endif /*============================================================================ FXAA3 QUALITY - PC ============================================================================*/ #if (FXAA_PC == 1) /*--------------------------------------------------------------------------*/ FxaaFloat4 FxaaPixelShader( // // Use noperspective interpolation here (turn off perspective interpolation). // {xy} = center of pixel FxaaFloat2 pos, // // Used only for FXAA Console, and not used on the 360 version. // Use noperspective interpolation here (turn off perspective interpolation). // {xy_} = upper left of pixel // {_zw} = lower right of pixel FxaaFloat4 fxaaConsolePosPos, // // Input color texture. // {rgb_} = color in linear or perceptual color space // if (FXAA_GREEN_AS_LUMA == 0) // {__a} = luma in perceptual color space (not linear) FxaaTex tex, // // Only used on the optimized 360 version of FXAA Console. // For everything but 360, just use the same input here as for 'tex'. // For 360, same diffuseMap, just alias with a 2nd sampler. // This sampler needs to have an exponent bias of -1. FxaaTex fxaaConsole360TexExpBiasNegOne, // // Only used on the optimized 360 version of FXAA Console. // For everything but 360, just use the same input here as for 'tex'. // For 360, same diffuseMap, just alias with a 3nd sampler. // This sampler needs to have an exponent bias of -2. FxaaTex fxaaConsole360TexExpBiasNegTwo, // // Only used on FXAA Quality. // This must be from a constant/uniform. // {x_} = 1.0/screenWidthInPixels // {_y} = 1.0/screenHeightInPixels FxaaFloat2 fxaaQualityRcpFrame, // // Only used on FXAA Console. // This must be from a constant/uniform. // This effects sub-pixel AA quality and inversely sharpness. // Where N ranges between, // N = 0.50 (default) // N = 0.33 (sharper) // {x__} = -N/screenWidthInPixels // {_y_} = -N/screenHeightInPixels // {_z_} = N/screenWidthInPixels // {__w} = N/screenHeightInPixels FxaaFloat4 fxaaConsoleRcpFrameOpt, // // Only used on FXAA Console. // Not used on 360, but used on PS3 and PC. // This must be from a constant/uniform. // {x__} = -2.0/screenWidthInPixels // {_y_} = -2.0/screenHeightInPixels // {_z_} = 2.0/screenWidthInPixels // {__w} = 2.0/screenHeightInPixels FxaaFloat4 fxaaConsoleRcpFrameOpt2, // // Only used on FXAA Console. // Only used on 360 in place of fxaaConsoleRcpFrameOpt2. // This must be from a constant/uniform. // {x__} = 8.0/screenWidthInPixels // {_y_} = 8.0/screenHeightInPixels // {_z_} = -4.0/screenWidthInPixels // {__w} = -4.0/screenHeightInPixels FxaaFloat4 fxaaConsole360RcpFrameOpt2, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_SUBPIX define. // It is here now to allow easier tuning. // Choose the amount of sub-pixel aliasing removal. // This can effect sharpness. // 1.00 - upper limit (softer) // 0.75 - default amount of filtering // 0.50 - lower limit (sharper, less sub-pixel aliasing removal) // 0.25 - almost off // 0.00 - completely off FxaaFloat fxaaQualitySubpix, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_EDGE_THRESHOLD define. // It is here now to allow easier tuning. // The minimum amount of local contrast required to apply algorithm. // 0.333 - too little (faster) // 0.250 - low quality // 0.166 - default // 0.125 - high quality // 0.063 - overkill (slower) FxaaFloat fxaaQualityEdgeThreshold, // // Only used on FXAA Quality. // This used to be the FXAA_QUALITY_EDGE_THRESHOLD_MIN define. // It is here now to allow easier tuning. // Trims the algorithm from processing darks. // 0.0833 - upper limit (default, the start of visible unfiltered edges) // 0.0625 - high quality (faster) // 0.0312 - visible limit (slower) // Special notes when using FXAA_GREEN_AS_LUMA, // Likely want to set this to zero. // As colors that are mostly not-green // will appear very dark in the green channel! // Tune by looking at mostly non-green content, // then start at zero and increase until aliasing is a problem. FxaaFloat fxaaQualityEdgeThresholdMin, // // Only used on FXAA Console. // This used to be the FXAA_CONSOLE_EDGE_SHARPNESS define. // It is here now to allow easier tuning. // This does not effect PS3, as this needs to be compiled in. // Use FXAA_CONSOLE_PS3_EDGE_SHARPNESS for PS3. // Due to the PS3 being ALU bound, // there are only three safe values here: 2 and 4 and 8. // These options use the shaders ability to a free *|/ by 2|4|8. // For all other platforms can be a non-power of two. // 8.0 is sharper (default!!!) // 4.0 is softer // 2.0 is really soft (good only for vector graphics inputs) FxaaFloat fxaaConsoleEdgeSharpness, // // Only used on FXAA Console. // This used to be the FXAA_CONSOLE_EDGE_THRESHOLD define. // It is here now to allow easier tuning. // This does not effect PS3, as this needs to be compiled in. // Use FXAA_CONSOLE_PS3_EDGE_THRESHOLD for PS3. // Due to the PS3 being ALU bound, // there are only two safe values here: 1/4 and 1/8. // These options use the shaders ability to a free *|/ by 2|4|8. // The console setting has a different mapping than the quality setting. // Other platforms can use other values. // 0.125 leaves less aliasing, but is softer (default!!!) // 0.25 leaves more aliasing, and is sharper FxaaFloat fxaaConsoleEdgeThreshold, // // Only used on FXAA Console. // This used to be the FXAA_CONSOLE_EDGE_THRESHOLD_MIN define. // It is here now to allow easier tuning. // Trims the algorithm from processing darks. // The console setting has a different mapping than the quality setting. // This only applies when FXAA_EARLY_EXIT is 1. // This does not apply to PS3, // PS3 was simplified to avoid more shader instructions. // 0.06 - faster but more aliasing in darks // 0.05 - default // 0.04 - slower and less aliasing in darks // Special notes when using FXAA_GREEN_AS_LUMA, // Likely want to set this to zero. // As colors that are mostly not-green // will appear very dark in the green channel! // Tune by looking at mostly non-green content, // then start at zero and increase until aliasing is a problem. FxaaFloat fxaaConsoleEdgeThresholdMin, // // Extra constants for 360 FXAA Console only. // Use zeros or anything else for other platforms. // These must be in physical constant registers and NOT immedates. // Immedates will result in compiler un-optimizing. // {xyzw} = float4(1.0, -1.0, 0.25, -0.25) FxaaFloat4 fxaaConsole360ConstDir ) { /*--------------------------------------------------------------------------*/ FxaaFloat2 posM; posM.x = pos.x; posM.y = pos.y; #if (FXAA_GATHER4_ALPHA == 1) #if (FXAA_DISCARD == 0) FxaaFloat4 rgbyM = FxaaTexTop(tex, posM); #if (FXAA_GREEN_AS_LUMA == 0) #define lumaM rgbyM.w #else #define lumaM rgbyM.y #endif #endif #if (FXAA_GREEN_AS_LUMA == 0) FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM); FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1)); #else FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM); FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1)); #endif #if (FXAA_DISCARD == 1) #define lumaM luma4A.w #endif #define lumaE luma4A.z #define lumaS luma4A.x #define lumaSE luma4A.y #define lumaNW luma4B.w #define lumaN luma4B.z #define lumaW luma4B.x #else FxaaFloat4 rgbyM = FxaaTexTop(tex, posM); #if (FXAA_GREEN_AS_LUMA == 0) #define lumaM rgbyM.w #else #define lumaM rgbyM.y #endif #if (FXAA_GLSL_100 == 1) FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 0.0, 1.0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0, 0.0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 0.0,-1.0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 0.0), fxaaQualityRcpFrame.xy)); #else FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy)); #endif #endif /*--------------------------------------------------------------------------*/ FxaaFloat maxSM = max(lumaS, lumaM); FxaaFloat minSM = min(lumaS, lumaM); FxaaFloat maxESM = max(lumaE, maxSM); FxaaFloat minESM = min(lumaE, minSM); FxaaFloat maxWN = max(lumaN, lumaW); FxaaFloat minWN = min(lumaN, lumaW); FxaaFloat rangeMax = max(maxWN, maxESM); FxaaFloat rangeMin = min(minWN, minESM); FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold; FxaaFloat range = rangeMax - rangeMin; FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled); FxaaBool earlyExit = range < rangeMaxClamped; /*--------------------------------------------------------------------------*/ if(earlyExit) #if (FXAA_DISCARD == 1) FxaaDiscard; #else return rgbyM; #endif /*--------------------------------------------------------------------------*/ #if (FXAA_GATHER4_ALPHA == 0) #if (FXAA_GLSL_100 == 1) FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0,-1.0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0, 1.0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2( 1.0,-1.0), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaFloat2(-1.0, 1.0), fxaaQualityRcpFrame.xy)); #else FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy)); #endif #else FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy)); FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy)); #endif /*--------------------------------------------------------------------------*/ FxaaFloat lumaNS = lumaN + lumaS; FxaaFloat lumaWE = lumaW + lumaE; FxaaFloat subpixRcpRange = 1.0/range; FxaaFloat subpixNSWE = lumaNS + lumaWE; FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS; FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE; /*--------------------------------------------------------------------------*/ FxaaFloat lumaNESE = lumaNE + lumaSE; FxaaFloat lumaNWNE = lumaNW + lumaNE; FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE; FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE; /*--------------------------------------------------------------------------*/ FxaaFloat lumaNWSW = lumaNW + lumaSW; FxaaFloat lumaSWSE = lumaSW + lumaSE; FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE; FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4; FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4; /*--------------------------------------------------------------------------*/ FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE; FxaaFloat lengthSign = fxaaQualityRcpFrame.x; FxaaBool horzSpan = edgeHorz >= edgeVert; FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; /*--------------------------------------------------------------------------*/ if(!horzSpan) lumaN = lumaW; if(!horzSpan) lumaS = lumaE; if(horzSpan) lengthSign = fxaaQualityRcpFrame.y; FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM; /*--------------------------------------------------------------------------*/ FxaaFloat gradientN = lumaN - lumaM; FxaaFloat gradientS = lumaS - lumaM; FxaaFloat lumaNN = lumaN + lumaM; FxaaFloat lumaSS = lumaS + lumaM; FxaaBool pairN = abs(gradientN) >= abs(gradientS); FxaaFloat gradient = max(abs(gradientN), abs(gradientS)); if(pairN) lengthSign = -lengthSign; FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); /*--------------------------------------------------------------------------*/ FxaaFloat2 posB; posB.x = posM.x; posB.y = posM.y; FxaaFloat2 offNP; offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x; offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y; if(!horzSpan) posB.x += lengthSign * 0.5; if( horzSpan) posB.y += lengthSign * 0.5; /*--------------------------------------------------------------------------*/ FxaaFloat2 posN; posN.x = posB.x - offNP.x * FXAA_QUALITY_P0; posN.y = posB.y - offNP.y * FXAA_QUALITY_P0; FxaaFloat2 posP; posP.x = posB.x + offNP.x * FXAA_QUALITY_P0; posP.y = posB.y + offNP.y * FXAA_QUALITY_P0; FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0; FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); FxaaFloat subpixE = subpixC * subpixC; FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); /*--------------------------------------------------------------------------*/ if(!pairN) lumaNN = lumaSS; FxaaFloat gradientScaled = gradient * 1.0/4.0; FxaaFloat lumaMM = lumaM - lumaNN * 0.5; FxaaFloat subpixF = subpixD * subpixE; FxaaBool lumaMLTZero = lumaMM < 0.0; /*--------------------------------------------------------------------------*/ lumaEndN -= lumaNN * 0.5; lumaEndP -= lumaNN * 0.5; FxaaBool doneN = abs(lumaEndN) >= gradientScaled; FxaaBool doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1; FxaaBool doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1; /*--------------------------------------------------------------------------*/ if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 3) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 4) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 5) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 6) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 7) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 8) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 9) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 10) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 11) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11; /*--------------------------------------------------------------------------*/ #if (FXAA_QUALITY_PS > 12) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; doneN = abs(lumaEndN) >= gradientScaled; doneP = abs(lumaEndP) >= gradientScaled; if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12; if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12; doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12; if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12; /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } #endif /*--------------------------------------------------------------------------*/ } /*--------------------------------------------------------------------------*/ FxaaFloat dstN = posM.x - posN.x; FxaaFloat dstP = posP.x - posM.x; if(!horzSpan) dstN = posM.y - posN.y; if(!horzSpan) dstP = posP.y - posM.y; /*--------------------------------------------------------------------------*/ FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; FxaaFloat spanLength = (dstP + dstN); FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; FxaaFloat spanLengthRcp = 1.0/spanLength; /*--------------------------------------------------------------------------*/ FxaaBool directionN = dstN < dstP; FxaaFloat dst = min(dstN, dstP); FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP; FxaaFloat subpixG = subpixF * subpixF; FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5; FxaaFloat subpixH = subpixG * fxaaQualitySubpix; /*--------------------------------------------------------------------------*/ FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0; FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH); if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; #if (FXAA_DISCARD == 1) return FxaaTexTop(tex, posM); #else return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM); #endif } /*==========================================================================*/ #endif void main() { gl_FragColor = FxaaPixelShader( v_Uv, vec4(0.0), tDiffuse, tDiffuse, tDiffuse, 1.0 / u_RenderTargetSize, vec4(0.0), vec4(0.0), vec4(0.0), 0.75, 0.166, 0.0833, 0.0, 0.0, 0.0, vec4(0.0) ); // TODO avoid querying texture twice for same texel gl_FragColor.a = texture2D(tDiffuse, v_Uv).a; } ` }; export { FXAAShader }; ================================================ FILE: examples/jsm/shaders/FastGaussianBlurShader.js ================================================ /** * Fast Gaussian blur shader * ref: https://github.com/Jam3/glsl-fast-gaussian-blur * ref: http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/ */ const FastGaussianBlurShader = { name: 'fast_gaussian_blur', defines: { 'SAMPLERS': 9 }, uniforms: { 'tDiffuse': null, 'direction': [1, 0] }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D tDiffuse; uniform vec2 u_RenderTargetSize; uniform vec2 direction; varying vec2 v_Uv; #if (SAMPLERS == 5) vec4 blur(sampler2D image, vec2 uv, vec2 pixelSize, vec2 direction) { vec4 color = vec4(0.0); vec2 off1 = vec2(1.3333333333333333) * direction; color += texture2D(image, uv) * 0.29411764705882354; color += texture2D(image, uv + (off1 * pixelSize)) * 0.35294117647058826; color += texture2D(image, uv - (off1 * pixelSize)) * 0.35294117647058826; return color; } #endif #if (SAMPLERS == 9) vec4 blur(sampler2D image, vec2 uv, vec2 pixelSize, vec2 direction) { vec4 color = vec4(0.0); vec2 off1 = vec2(1.3846153846) * direction; vec2 off2 = vec2(3.2307692308) * direction; color += texture2D(image, uv) * 0.2270270270; color += texture2D(image, uv + (off1 * pixelSize)) * 0.3162162162; color += texture2D(image, uv - (off1 * pixelSize)) * 0.3162162162; color += texture2D(image, uv + (off2 * pixelSize)) * 0.0702702703; color += texture2D(image, uv - (off2 * pixelSize)) * 0.0702702703; return color; } #endif #if (SAMPLERS == 13) vec4 blur(sampler2D image, vec2 uv, vec2 pixelSize, vec2 direction) { vec4 color = vec4(0.0); vec2 off1 = vec2(1.411764705882353) * direction; vec2 off2 = vec2(3.2941176470588234) * direction; vec2 off3 = vec2(5.176470588235294) * direction; color += texture2D(image, uv) * 0.1964825501511404; color += texture2D(image, uv + (off1 * pixelSize)) * 0.2969069646728344; color += texture2D(image, uv - (off1 * pixelSize)) * 0.2969069646728344; color += texture2D(image, uv + (off2 * pixelSize)) * 0.09447039785044732; color += texture2D(image, uv - (off2 * pixelSize)) * 0.09447039785044732; color += texture2D(image, uv + (off3 * pixelSize)) * 0.010381362401148057; color += texture2D(image, uv - (off3 * pixelSize)) * 0.010381362401148057; return color; } #endif void main() { gl_FragColor = blur(tDiffuse, v_Uv, 1.0 / u_RenderTargetSize, direction); } ` }; export { FastGaussianBlurShader }; ================================================ FILE: examples/jsm/shaders/FilmShader.js ================================================ /** * Film Shader */ const FilmShader = { name: 'film', uniforms: { 'tDiffuse': null, 'time': 0.0, 'nIntensity': 0.8, 'sIntensity': 0.3, 'sCount': 4096, 'grayscale': 0 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` // control parameter uniform float time; uniform bool grayscale; // noise effect intensity value (0 = no effect, 1 = full effect) uniform float nIntensity; // scanlines effect intensity value (0 = no effect, 1 = full effect) uniform float sIntensity; // scanlines effect count value (0 = no effect, 4096 = full effect) uniform float sCount; uniform sampler2D tDiffuse; varying vec2 v_Uv; void main() { // sample the source vec4 cTextureScreen = texture2D(tDiffuse, v_Uv); // make some noise float dx = rand(v_Uv + time); // add noise vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp(0.1 + dx, 0.0, 1.0); // get us a sine and cosine vec2 sc = vec2(sin(v_Uv.y * sCount), cos(v_Uv.y * sCount)); // add scanlines cResult += cTextureScreen.rgb * vec3(sc.x, sc.y, sc.x) * sIntensity; // interpolate between source and result by intensity cResult = cTextureScreen.rgb + clamp(nIntensity, 0.0, 1.0) * (cResult - cTextureScreen.rgb); // convert to grayscale if desired if(grayscale) { cResult = vec3(cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11); } gl_FragColor = vec4(cResult, cTextureScreen.a); } ` }; export { FilmShader }; ================================================ FILE: examples/jsm/shaders/GroundProjectedSkyboxShader.js ================================================ const GroundProjectedSkyboxShader = { name: 'ground_projected_skybox', defines: { GAMMA: false, PANORAMA: false }, uniforms: { level: 0, flip: -1, height: 15, radius: 100 }, vertexShader: ` #include varying vec3 vDir; mat4 clearMat4Translate(mat4 m) { mat4 outMatrix = m; outMatrix[3].xyz = vec3(0., 0., 0.); return outMatrix; } void main() { mat4 modelMatrix = clearMat4Translate(u_Model); mat4 viewMatrix = clearMat4Translate(u_View); vDir = normalize((modelMatrix * vec4(a_Position, 0.0)).xyz); gl_Position = u_Projection * viewMatrix * modelMatrix * vec4(a_Position, 1.0); gl_Position.z = gl_Position.w; } `, fragmentShader: ` #include #ifdef PANORAMA uniform sampler2D diffuseMap; #else uniform samplerCube cubeMap; #endif uniform float flip; uniform float level; varying vec3 vDir; uniform float radius; uniform float height; // From: https://www.shadertoy.com/view/4tsBD7 float diskIntersectWithBackFaceCulling(vec3 ro, vec3 rd, vec3 c, vec3 n, float r) { float d = dot (rd, n); if(d > 0.0) { return 1e6; } vec3 o = ro - c; float t = - dot(n, o) / d; vec3 q = o + rd * t; return (dot(q, q) < r * r) ? t : 1e6; } // From: https://www.iquilezles.org/www/articles/intersectors/intersectors.htm float sphereIntersect(vec3 ro, vec3 rd, vec3 ce, float ra) { vec3 oc = ro - ce; float b = dot(oc, rd); float c = dot(oc, oc) - ra * ra; float h = b * b - c; if(h < 0.0) { return -1.0; } h = sqrt(h); return - b + h; } vec3 project() { vec3 p = normalize(vDir); vec3 camPos = u_CameraPosition; camPos.y -= height; float intersection = sphereIntersect(camPos, p, vec3(0.0), radius); if (intersection > 0.0) { vec3 h = vec3(0.0, - height, 0.0); float intersection2 = diskIntersectWithBackFaceCulling(camPos, p, h, vec3(0.0, 1.0, 0.0), radius); p = (camPos + min(intersection, intersection2) * p) / radius; } else { p = vec3(0.0, 0.0, 0.0); } return p; } void main() { #include vec3 projectedWorldPosition = project(); vec3 V = normalize(projectedWorldPosition); #ifdef PANORAMA float phi = acos(V.y); // consistent with cubemap. // atan(y, x) is same with atan2 ? float theta = flip * atan(V.x, V.z) + PI * 0.5; vec2 uv = vec2(theta / 2.0 / PI, -phi / PI); #ifdef TEXTURE_LOD_EXT outColor *= mapTexelToLinear(texture2DLodEXT(diffuseMap, fract(uv), level)); #else outColor *= mapTexelToLinear(texture2D(diffuseMap, fract(uv), level)); #endif #else vec3 coordVec = vec3(flip * V.x, V.yz); #ifdef TEXTURE_LOD_EXT outColor *= mapTexelToLinear(textureCubeLodEXT(cubeMap, coordVec, level)); #else outColor *= mapTexelToLinear(textureCube(cubeMap, coordVec, level)); #endif #endif #include #ifdef GAMMA #include #endif } ` }; export { GroundProjectedSkyboxShader }; ================================================ FILE: examples/jsm/shaders/InfiniteGridShader.js ================================================ // ref: https://github.com/galacean/engine-toolkit/blob/main/packages/custom-material/src/grid/Grid.shader const InfiniteGridShader = { name: 'infinite_grid', defines: { USE_LINEARFADE: true }, uniforms: { flipProgress: 0.0, axisIntensity: 0.7, gridIntensity: 0.2, primaryScale: 5, secondaryScale: 1, primaryFade: 0.7, secondaryFade: 0.4, start: 30, end: 100 }, vertexShader: ` #include varying vec3 nearPoint; varying vec3 farPoint; vec3 unprojectPoint(float x, float y, float z, mat4 pvmInverse) { vec4 unprojectedPoint = pvmInverse * vec4(x, y, z, 1.0); return unprojectedPoint.xyz / unprojectedPoint.w; } void main() { mat4 pvmInverse = inverseMat4(u_Projection * u_View * u_Model); nearPoint = unprojectPoint(a_Position.x, a_Position.y, -1.0, pvmInverse); // unprojecting on the near plane farPoint = unprojectPoint(a_Position.x, a_Position.y, 1.0, pvmInverse); // unprojecting on the far plane gl_Position = vec4(a_Position, 1.0); // using directly the clipped coordinates } `, fragmentShader: ` uniform mat4 u_ProjectionView; uniform mat4 u_View; uniform mat4 u_Model; uniform float flipProgress; uniform float axisIntensity; uniform float gridIntensity; uniform float primaryScale; uniform float secondaryScale; uniform float primaryFade; uniform float secondaryFade; uniform float start; uniform float end; varying vec3 nearPoint; varying vec3 farPoint; vec4 grid(vec3 fragPos3D, float scale, float alpha) { vec2 coord = mix(fragPos3D.xz, fragPos3D.xy, flipProgress) / scale; // use the scale variable to set the distance between the lines vec2 derivative = fwidth(coord); vec2 grid = abs(fract(coord - 0.5) - 0.5) / derivative; float line = min(grid.x, grid.y); float minimumz = min(derivative.y, 1.0); float minimumx = min(derivative.x, 1.0); vec4 color = vec4(gridIntensity, gridIntensity, gridIntensity, 1.0 - min(line, 1.0)); // z axis if(fragPos3D.x >= -axisIntensity * minimumx && fragPos3D.x <= axisIntensity * minimumx) { color *= vec4(0.0, 0.0, 4.0, 1.0); color.b = clamp(color.b, 0.0, 1.0); } // x axis and y axis float xy = mix(fragPos3D.z, fragPos3D.y, flipProgress); if(xy >= -axisIntensity * minimumz && xy <= axisIntensity * minimumz) { color *= vec4(4.0, 0.0, 0.0, 1.0); color.r = clamp(color.r, 0.0, 1.0); } color.a *= alpha; return color; } float computeDepth(vec3 pos) { vec4 clip_space_pos = u_ProjectionView * u_Model * vec4(pos.xyz, 1.0); return (clip_space_pos.z / clip_space_pos.w) * 0.5 + 0.5; } float computeLinearDepth(vec3 pos) { vec4 view_space_pos = u_View * u_Model * vec4(pos.xyz, 1.0); float view_space_depth = abs(view_space_pos.z) / view_space_pos.w; float linearDepth = max(0., view_space_depth - start) / (end - start); return linearDepth; } void main() { float ty = -nearPoint.y / (farPoint.y - nearPoint.y); float tz = -nearPoint.z / (farPoint.z - nearPoint.z); float t = mix(ty, tz, flipProgress); vec3 fragPos3D = nearPoint + t * (farPoint - nearPoint); gl_FragDepthEXT = computeDepth(fragPos3D); gl_FragColor = (grid(fragPos3D, primaryScale, primaryFade) + grid(fragPos3D, secondaryScale, secondaryFade)) * float(t > 0.0); #ifdef USE_LINEARFADE float linearDepth = computeLinearDepth(fragPos3D); gl_FragColor.a *= max(0.0, 1.0 - linearDepth); #endif } ` }; export { InfiniteGridShader }; ================================================ FILE: examples/jsm/shaders/LineDashedShader.js ================================================ /** * Line Dashed Shader */ const LineDashedShader = { name: 'line_dashed', uniforms: { 'scale': 1, // The scale of the dashed part of a line. 'dashSize': 2, // The size of the dash. This is both the gap with the stroke. 'totalSize': 4 // The size of the gap. }, vertexShader: ` #include uniform float scale; attribute float lineDistance; varying float vLineDistance; void main() { vLineDistance = scale * lineDistance; vec3 transformed = vec3(a_Position); #include } `, fragmentShader: ` #include #include uniform float dashSize; uniform float totalSize; varying float vLineDistance; void main() { if (mod(vLineDistance, totalSize) > dashSize) { discard; } #include #include #include #include } ` }; export { LineDashedShader }; ================================================ FILE: examples/jsm/shaders/LuminosityHighPassShader.js ================================================ // ref: github.com/mrdoob/three.js/blob/dev/examples/jsm/shaders/LuminosityHighPassShader.js const LuminosityHighPassShader = { name: 'luminosityHighPass', uniforms: { 'tDiffuse': null, 'luminosityThreshold': 1.0, 'smoothWidth': 0.01, 'defaultColor': [0, 0, 0], 'defaultOpacity': 0.0 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4( a_Position, 1.0 ); } `, fragmentShader: ` uniform sampler2D tDiffuse; uniform vec3 defaultColor; uniform float defaultOpacity; uniform float luminosityThreshold; uniform float smoothWidth; varying vec2 v_Uv; void main() { vec4 texel = texture2D(tDiffuse, v_Uv); vec3 luma = vec3(0.299, 0.587, 0.114); float v = dot(texel.xyz, luma); vec4 outputColor = vec4(defaultColor.rgb, defaultOpacity); float alpha = smoothstep(luminosityThreshold, luminosityThreshold + smoothWidth, v); gl_FragColor = mix(outputColor, texel, alpha); } ` }; export { LuminosityHighPassShader }; ================================================ FILE: examples/jsm/shaders/MSDFTextShader.js ================================================ console.warn('MSDFTextShader has been deprecated since v0.4.1.'); // reference - https://github.com/leochocolat/three-msdf-text-utils/tree/main/src/MSDFTextMaterial/shaders const MSDFTextShader = { name: 'msdf_text', defines: { IS_SMALL: false, IS_STOKED: false }, uniforms: { uMap: null, uAlphaTest: 0.01, uStrokeColor: [1, 0, 0], uStrokeOutsetWidth: 0, uStrokeInsetWidth: 0.3, uThreshold: 0.05 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); v_Uv = a_Uv; } `, fragmentShader: ` uniform vec3 u_Color; uniform float u_Opacity; uniform sampler2D uMap; uniform float uAlphaTest; uniform vec3 uStrokeColor; uniform float uStrokeOutsetWidth; uniform float uStrokeInsetWidth; uniform float uThreshold; varying vec2 v_Uv; float median(float r, float g, float b) { return max(min(r, g), min(max(r, g), b)); } void main() { vec3 s = texture2D(uMap, v_Uv).rgb; float sigDist = median(s.r, s.g, s.b) - 0.5; float afwidth = 1.4142135623730951 / 2.0; #ifdef IS_SMALL float alpha = smoothstep(uThreshold - afwidth, uThreshold + afwidth, sigDist); #else float alpha = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0); #endif if(alpha < uAlphaTest) discard; #ifdef IS_STOKED float sigDistOutset = sigDist + uStrokeOutsetWidth * 0.5; float sigDistInset = sigDist - uStrokeInsetWidth * 0.5; #ifdef IS_SMALL float outset = smoothstep(uThreshold-afwidth, uThreshold+afwidth, sigDistOutset); float inset = 1.0-smoothstep(uThreshold-afwidth, uThreshold+afwidth, sigDistInset); #else float outset = clamp(sigDistOutset/fwidth(sigDistOutset)+0.5, 0.0, 1.0); float inset = 1.0-clamp(sigDistInset/fwidth(sigDistInset)+0.5, 0.0, 1.0); #endif float border = outset * inset; gl_FragColor = vec4(uStrokeColor, u_Opacity * border); #else gl_FragColor = vec4(u_Color, u_Opacity * alpha); #endif } ` }; export { MSDFTextShader }; ================================================ FILE: examples/jsm/shaders/MatcapShader.js ================================================ const MatcapShader = { name: 'matcap', defines: { MATCAP_SRGB: false }, uniforms: { mapcap: null }, vertexShader: ` varying vec3 vViewPosition; #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include #include #include #include #include vec4 mvPosition = u_View * worldPosition; vViewPosition = - mvPosition.xyz; } `, fragmentShader: ` uniform sampler2D matcap; varying vec3 vViewPosition; #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include vec3 viewDir = normalize(vViewPosition); vec3 x = normalize(vec3(viewDir.z, 0.0, -viewDir.x)); vec3 y = cross(viewDir, x); vec3 viewN = (u_View * vec4(N, 0.0)).xyz; vec2 uv = vec2(dot(x, viewN), dot(y, viewN)) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks vec4 matcapColor = texture2D(matcap, uv); #ifdef MATCAP_SRGB matcapColor = sRGBToLinear(matcapColor); #endif outColor.rgb *= matcapColor.rgb; #include #include #include #include #include } ` }; export { MatcapShader }; ================================================ FILE: examples/jsm/shaders/MotionBlur2Shader.js ================================================ const MotionBlur2Shader = { name: 'motion_blur2', uniforms: { 'tMotion': null, 'tColor': null, 'velocityFactor': 1.0 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; uniform mat4 u_View; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #define SAMPLES 64.0 varying vec2 v_Uv; uniform sampler2D tMotion; uniform sampler2D tColor; uniform float velocityFactor; uniform vec2 u_RenderTargetSize; void main() { vec2 texelSize = 1.0 / u_RenderTargetSize; vec4 velocityColor = texture2D(tMotion, v_Uv); velocityColor.rg = velocityColor.rg * 2.0 - vec2(1.0); vec2 velocity = vec2(velocityColor.r, velocityColor.g) * velocityColor.a; velocity *= velocityFactor; float speed = length(velocity / texelSize); int samplesCount = int(clamp(speed, 1.0, SAMPLES)); velocity = normalize(velocity) * texelSize; float hlim = float(-samplesCount) * 0.5 + 0.5; vec4 result = texture2D(tColor, v_Uv); for (int i = 1; i < int(SAMPLES); ++i) { if (i >= samplesCount) { break; } vec2 offset = v_Uv+velocity * (hlim + float(i)); result += texture2D(tColor, offset); } gl_FragColor = result / float(samplesCount); gl_FragColor.a = result.a; } ` }; export { MotionBlur2Shader }; ================================================ FILE: examples/jsm/shaders/MotionBlurShader.js ================================================ const MotionBlurShader = { name: 'motion_blur', uniforms: { 'tDepth': null, 'tColor': null, 'velocityFactor': 1.0, 'delta': 16.67, 'clipToWorldMatrix': new Float32Array(16), 'worldToClipMatrix': new Float32Array(16), 'previousWorldToClipMatrix': new Float32Array(16), 'cameraMove': [0, 0, 0] }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` varying vec2 v_Uv; uniform sampler2D tDepth; uniform sampler2D tColor; uniform mat4 u_Projection; uniform mat4 clipToWorldMatrix; uniform mat4 worldToClipMatrix; uniform mat4 previousWorldToClipMatrix; uniform vec3 cameraMove; uniform float velocityFactor; uniform float delta; void main() { float zOverW = texture2D(tDepth, v_Uv).x; // clipPosition is the viewport position at this pixel in the range -1 to 1. vec4 clipPosition = vec4(v_Uv.x * 2. - 1., v_Uv.y * 2. - 1., zOverW * 2. - 1., 1.); vec4 worldPosition = clipToWorldMatrix * clipPosition; worldPosition /= worldPosition.w; vec4 previousWorldPosition = worldPosition; previousWorldPosition.xyz -= cameraMove; vec4 previousClipPosition = previousWorldToClipMatrix * worldPosition; previousClipPosition /= previousClipPosition.w; vec4 translatedClipPosition = worldToClipMatrix * previousWorldPosition; translatedClipPosition /= translatedClipPosition.w; vec2 velocity = velocityFactor * (clipPosition - previousClipPosition).xy / delta * 16.67; velocity *= clamp(zOverW, 0., 1.); velocity += velocityFactor * (clipPosition - translatedClipPosition).xy / delta * 16.67; vec4 finalColor = vec4(0.); vec2 offset = vec2(0.); float weight = 0.; const int samples = 20; for (int i = 0; i < samples; i++) { offset = velocity * (float(i) / (float(samples) - 1.) - .5); finalColor += texture2D(tColor, v_Uv + offset); } finalColor /= float(samples); gl_FragColor = vec4(finalColor.rgb, 1.); // debug: view velocity values // gl_FragColor = vec4(abs(velocity), 0., 1.); } ` }; export { MotionBlurShader }; ================================================ FILE: examples/jsm/shaders/OutputShader.js ================================================ const OutputShader = { name: 'output', defines: { 'SRGB_COLOR_SPACE': true }, uniforms: { 'tDiffuse': null, 'toneMappingExposure': 1 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D tDiffuse; varying vec2 v_Uv; uniform float toneMappingExposure; // exposure only vec3 LinearToneMapping(vec3 color) { return saturate(toneMappingExposure * color); } // source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf vec3 ReinhardToneMapping(vec3 color) { color *= toneMappingExposure; return saturate(color / (vec3(1.0) + color)); } // source: http://filmicworlds.com/blog/filmic-tonemapping-operators/ vec3 OptimizedCineonToneMapping(vec3 color) { // optimized filmic operator by Jim Hejl and Richard Burgess-Dawson color *= toneMappingExposure; color = max(vec3(0.0), color - 0.004); return pow((color * (6.2 * color + 0.5)) / (color * (6.2 * color + 1.7) + 0.06), vec3(2.2)); } // source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs vec3 RRTAndODTFit(vec3 v) { vec3 a = v * (v + 0.0245786) - 0.000090537; vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081; return a / b; } // this implementation of ACES is modified to accommodate a brighter viewing environment. // the scale factor of 1/0.6 is subjective. see discussion in https://github.com/mrdoob/three.js/pull/19621. vec3 ACESFilmicToneMapping(vec3 color) { // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT const mat3 ACESInputMat = mat3( vec3(0.59719, 0.07600, 0.02840), // transposed from source vec3(0.35458, 0.90834, 0.13383), vec3(0.04823, 0.01566, 0.83777) ); // ODT_SAT => XYZ => D60_2_D65 => sRGB const mat3 ACESOutputMat = mat3( vec3( 1.60475, -0.10208, -0.00327), // transposed from source vec3(-0.53108, 1.10813, -0.07276), vec3(-0.07367, -0.00605, 1.07602) ); color *= toneMappingExposure / 0.6; color = ACESInputMat * color; // Apply RRT and ODT color = RRTAndODTFit(color); color = ACESOutputMat * color; // Clamp to [0, 1] return saturate(color); } void main() { gl_FragColor = texture2D(tDiffuse, v_Uv); // tone mapping #ifdef LINEAR_TONE_MAPPING gl_FragColor.rgb = LinearToneMapping(gl_FragColor.rgb); #elif defined(REINHARD_TONE_MAPPING) gl_FragColor.rgb = ReinhardToneMapping(gl_FragColor.rgb); #elif defined(CINEON_TONE_MAPPING) gl_FragColor.rgb = OptimizedCineonToneMapping(gl_FragColor.rgb); #elif defined(ACES_FILMIC_TONE_MAPPING) gl_FragColor.rgb = ACESFilmicToneMapping(gl_FragColor.rgb); #endif // color space #ifdef SRGB_COLOR_SPACE gl_FragColor = LinearTosRGB(gl_FragColor); #endif } ` }; export { OutputShader }; ================================================ FILE: examples/jsm/shaders/PlanarShadowShader.js ================================================ const PlanarShadowShader = { name: 'planar_shadow', defines: {}, uniforms: { lightDir: [1, 1, 1], shadowColor: [0, 0, 0], shadowFalloff: 0.02, height: 0.1 }, vertexShader: ` attribute vec3 a_Position; uniform mat4 u_ProjectionView; uniform mat4 u_Model; uniform vec3 lightDir; uniform vec3 shadowColor; uniform float shadowFalloff; uniform float height; varying vec4 v_Color; vec3 shadowProjectPos(vec4 pos) { vec3 worldPos = (u_Model * pos).xyz; vec3 shadowPos; vec3 lightDir = normalize(lightDir); shadowPos.xz = worldPos.xz - lightDir.xz * max(0.0, worldPos.y - height) / lightDir.y; shadowPos.y = min(worldPos.y, height); return shadowPos; } void main() { vec4 position = vec4(a_Position, 1.0); vec3 shadowPos = shadowProjectPos(position); vec3 center = vec3(u_Model[3].x, height, u_Model[3].z); float falloff = 1.0 - clamp(distance(shadowPos , center) * shadowFalloff, 0.0, 1.0); v_Color = vec4(shadowColor, falloff); gl_Position = u_ProjectionView * vec4(shadowPos, 1.0); } `, fragmentShader: ` varying vec4 v_Color; void main() { gl_FragColor = v_Color; } ` }; export { PlanarShadowShader }; ================================================ FILE: examples/jsm/shaders/SDFTextShader.js ================================================ const SDFTextShader = { name: 'sdf_text', defines: { DEBUG: false, SHADOW: false, OUTLINE: false }, uniforms: { gamma: 1, halo: 0.75, shadowColor: [0.3, 0.3, 0.3], shadowOffset: [0.016, -0.016], shadowGamma: 1, outlineColor: [1, 0, 0], outlineWidth: 0.04, outlineGamma: 1 }, vertexShader: ` #include attribute vec2 a_Uv; uniform mat3 uvTransform; varying vec2 v_Uv; varying float v_gammaScale; void main() { gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); v_gammaScale = gl_Position.w; v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy; } `, fragmentShader: ` uniform vec3 u_Color; uniform float u_Opacity; uniform sampler2D diffuseMap; uniform float halo; uniform float gamma; #ifdef SHADOW uniform vec3 shadowColor; uniform vec2 shadowOffset; uniform float shadowGamma; #endif #ifdef OUTLINE uniform vec3 outlineColor; uniform float outlineWidth; uniform float outlineGamma; #endif varying vec2 v_Uv; varying float v_gammaScale; void main() { float dist = texture2D(diffuseMap, v_Uv).r; float gammaSize = gamma * 0.00003 * v_gammaScale; float alpha = smoothstep(halo - gammaSize, halo + gammaSize, dist); vec4 textColor = vec4(u_Color, alpha * u_Opacity); #ifdef OUTLINE float outlineAlpha = smoothstep(halo - outlineWidth - outlineGamma * 0.046, halo - outlineWidth + outlineGamma * 0.046, dist); vec4 outlineColor4 = vec4(outlineColor, outlineAlpha * u_Opacity); textColor = mix(outlineColor4, textColor, textColor.a); #endif #ifdef SHADOW float shadowDist = texture2D(diffuseMap, v_Uv - shadowOffset).r; float shadowAlpha = smoothstep(halo - shadowGamma * 0.05, halo + shadowGamma * 0.05, shadowDist); vec4 shadowColor4 = vec4(shadowColor, shadowAlpha * u_Opacity); textColor = mix(shadowColor4, textColor, textColor.a); #endif #ifdef DEBUG gl_FragColor = vec4(dist, dist, dist, 1.0); #else gl_FragColor = textColor; #endif } ` }; export { SDFTextShader }; ================================================ FILE: examples/jsm/shaders/SSAOShader.js ================================================ /** * SSAO Shader */ const SSAOShader = { name: 'ssao', defines: { 'DEPTH_PACKING': 0 }, uniforms: { 'normalTex': null, 'depthTex': null, 'texSize': [512, 512], 'noiseTex': null, 'noiseTexSize': [4, 4], 'projection': new Float32Array(16), 'projectionInv': new Float32Array(16), 'viewInverseTranspose': new Float32Array(16), 'kernel': null, 'radius': 0.2, 'power': 1, 'bias': 0.0001, 'intensity': 1 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include varying vec2 v_Uv; uniform sampler2D normalTex; uniform sampler2D depthTex; uniform vec2 texSize; uniform sampler2D noiseTex; uniform vec2 noiseTexSize; uniform mat4 projection; uniform mat4 projectionInv; uniform mat4 viewInverseTranspose; uniform vec3 kernel[KERNEL_SIZE]; uniform float radius; uniform float power; uniform float bias; uniform float intensity; float getDepth(const in vec2 screenPosition) { #if DEPTH_PACKING == 1 return unpackRGBAToDepth(texture2D(depthTex, screenPosition)); #else return texture2D(depthTex, screenPosition).r; #endif } vec3 getViewNormal(const in vec2 screenPosition) { vec3 normal = texture2D(normalTex, screenPosition).xyz * 2.0 - 1.0; // Convert to view space return (viewInverseTranspose * vec4(normal, 0.0)).xyz; } float ssaoEstimator(in mat3 kernelBasis, in vec3 originPos, in vec3 N) { float occlusion = 0.0; for (int i = 0; i < KERNEL_SIZE; i++) { vec3 samplePos = kernel[i]; samplePos = kernelBasis * samplePos; samplePos = samplePos * radius + originPos; vec4 texCoord = projection * vec4(samplePos, 1.0); texCoord.xy /= texCoord.w; texCoord.xy = texCoord.xy * 0.5 + 0.5; float sampleDepth = getDepth(texCoord.xy); float z = sampleDepth * 2.0 - 1.0; #ifdef ALCHEMY // todo not work vec4 projectedPos = vec4(texCoord.xy * 2.0 - 1.0, z, 1.0); vec4 p4 = projectionInv * projectedPos; p4.xyz /= p4.w; vec3 cDir = p4.xyz - originPos; float vv = dot(cDir, cDir); float vn = dot(cDir, N); float radius2 = radius * radius; vn = max(vn + p4.z * bias, 0.0); float f = max(radius2 - vv, 0.0) / radius2; occlusion += f * f * f * max(vn / (0.01 + vv), 0.0); #else // just for perspective camera if (projection[3][3] == 0.0) { z = projection[3][2] / (z * projection[2][3] - projection[2][2]); } else { z = (z - projection[3][2]) / projection[2][2]; } float factor = step(samplePos.z, z - bias); float rangeCheck = smoothstep(0.0, 1.0, radius / abs(originPos.z - z)); occlusion += rangeCheck * factor; #endif } occlusion = 1.0 - occlusion / float(KERNEL_SIZE); // occlusion = 1.0 - clamp((occlusion / float(KERNEL_SIZE) - 0.6) * 2.5, 0.0, 1.0); return pow(occlusion, power); } void main() { float centerDepth = getDepth(v_Uv); if(centerDepth >= (1.0 - EPSILON)) { discard; } vec3 N = getViewNormal(v_Uv); vec2 noiseTexCoord = texSize / vec2(noiseTexSize) * v_Uv; vec3 rvec = texture2D(noiseTex, noiseTexCoord).rgb * 2.0 - 1.0; // Tangent vec3 T = normalize(rvec - N * dot(rvec, N)); // Bitangent vec3 BT = normalize(cross(N, T)); mat3 kernelBasis = mat3(T, BT, N); // view position float z = centerDepth * 2.0 - 1.0; vec4 projectedPos = vec4(v_Uv * 2.0 - 1.0, z, 1.0); vec4 p4 = projectionInv * projectedPos; vec3 position = p4.xyz / p4.w; float ao = ssaoEstimator(kernelBasis, position, N); ao = clamp(1.0 - (1.0 - ao) * intensity, 0.0, 1.0); gl_FragColor = vec4(vec3(ao), 1.0); } ` }; export { SSAOShader }; ================================================ FILE: examples/jsm/shaders/SSRShader.js ================================================ /** * SSR Shader * https://github.com/pissang/claygl/blob/master/example/shader/ssr.glsl * http://casual-effects.blogspot.jp/2014/08/screen-space-ray-tracing.html */ const SSRShader = { name: 'effect_ssr', defines: { MAX_ITERATION: 50, MAX_BINARY_SEARCH_ITERATION: 5 }, uniforms: { colorTex: null, gBufferTexture1: null, gBufferTexture2: null, projection: new Float32Array(16), projectionInv: new Float32Array(16), viewInverseTranspose: new Float32Array(16), pixelStride: 8, maxRayDistance: 200, enablePixelStrideZCutoff: 1.0, pixelStrideZCutoff: 50, screenEdgeFadeStart: 0.9, eyeFadeStart: 0.99, eyeFadeEnd: 1, minGlossiness: 0.2, nearZ: 0.1, zThicknessThreshold: 0.1, jitterOffset: 0, viewportSize: [512, 512] }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` varying vec2 v_Uv; uniform sampler2D colorTex; uniform sampler2D gBufferTexture1; uniform sampler2D gBufferTexture2; uniform mat4 projection; uniform mat4 projectionInv; uniform mat4 viewInverseTranspose; uniform float maxRayDistance; uniform float pixelStride; // ray origin Z at this distance will have a pixel stride of 1.0 uniform float pixelStrideZCutoff; // distance to screen edge that ray hits will start to fade (0.0 -> 1.0) uniform float screenEdgeFadeStart; // ray direction's Z that ray hits will start to fade (0.0 -> 1.0) uniform float eyeFadeStart; // ray direction's Z that ray hits will be cut (0.0 -> 1.0) uniform float eyeFadeEnd; // Object larger than minGlossiness will have ssr effect uniform float minGlossiness; uniform float zThicknessThreshold; uniform float jitterOffset; uniform float nearZ; uniform vec2 viewportSize; uniform float maxMipmapLevel; uniform float enablePixelStrideZCutoff; float fetchDepth(sampler2D depthTexture, vec2 uv) { vec4 depthTexel = texture2D(depthTexture, uv); return depthTexel.r * 2.0 - 1.0; } float linearDepth(float depth) { return projection[3][2] / (depth * projection[2][3] - projection[2][2]); } bool rayIntersectDepth(float rayZNear, float rayZFar, vec2 hitPixel) { // Swap if bigger if (rayZFar > rayZNear) { float t = rayZFar; rayZFar = rayZNear; rayZNear = t; } float cameraZ = linearDepth(fetchDepth(gBufferTexture2, hitPixel)); // float cameraBackZ = linearDepth(fetchDepth(backDepthTex, hitPixel)); // Cross z return rayZFar <= cameraZ && rayZNear >= cameraZ - zThicknessThreshold; } // Trace a ray in screenspace from rayOrigin (in camera space) pointing in rayDir (in camera space) // // With perspective correct interpolation // // Returns true if the ray hits a pixel in the depth buffer // and outputs the hitPixel (in UV space), the hitPoint (in camera space) and the number // of iterations it took to get there. // // Based on Morgan McGuire & Mike Mara's GLSL implementation: // http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html bool traceScreenSpaceRay(vec3 rayOrigin, vec3 rayDir, float jitter, out vec2 hitPixel, out vec3 hitPoint, out float iterationCount) { // Clip to the near plane float rayLength = ((rayOrigin.z + rayDir.z * maxRayDistance) > -nearZ) ? (-nearZ - rayOrigin.z) / rayDir.z : maxRayDistance; vec3 rayEnd = rayOrigin + rayDir * rayLength; // Project into homogeneous clip space vec4 H0 = projection * vec4(rayOrigin, 1.0); vec4 H1 = projection * vec4(rayEnd, 1.0); float k0 = 1.0 / H0.w, k1 = 1.0 / H1.w; // The interpolated homogeneous version of the camera space points vec3 Q0 = rayOrigin * k0, Q1 = rayEnd * k1; // Screen space endpoints // PENDING viewportSize ? vec2 P0 = (H0.xy * k0 * 0.5 + 0.5) * viewportSize; vec2 P1 = (H1.xy * k1 * 0.5 + 0.5) * viewportSize; // If the line is degenerate, make it cover at least one pixel to avoid handling // zero-pixel extent as a special case later P1 += dot(P1 - P0, P1 - P0) < 0.0001 ? 0.01 : 0.0; vec2 delta = P1 - P0; // Permute so that the primary iteration is in x to collapse // all quadrant-specific DDA case later bool permute = false; if (abs(delta.x) < abs(delta.y)) { // More vertical line permute = true; delta = delta.yx; P0 = P0.yx; P1 = P1.yx; } float stepDir = sign(delta.x); float invdx = stepDir / delta.x; // Track the derivatives of Q and K vec3 dQ = (Q1 - Q0) * invdx; float dk = (k1 - k0) * invdx; vec2 dP = vec2(stepDir, delta.y * invdx); // Calculate pixel stride based on distance of ray origin from camera. // Since perspective means distant objects will be smaller in screen space // we can use this to have higher quality reflections for far away objects // while still using a large pixel stride for near objects (and increase performance) // this also helps mitigate artifacts on distant reflections when we use a large // pixel stride. float strideScaler = 1.0 - min(1.0, -rayOrigin.z / pixelStrideZCutoff); float pixStride = mix(pixelStride, 1.0 + strideScaler * pixelStride, enablePixelStrideZCutoff); // Scale derivatives by the desired pixel stride and the offset the starting values by the jitter fraction dP *= pixStride; dQ *= pixStride; dk *= pixStride; // Track ray step and derivatives in a vec4 to parallelize vec4 pqk = vec4(P0, Q0.z, k0); vec4 dPQK = vec4(dP, dQ.z, dk); pqk += dPQK * jitter; float rayZFar = (dPQK.z * 0.5 + pqk.z) / (dPQK.w * 0.5 + pqk.w); float rayZNear; bool intersect = false; vec2 texelSize = 1.0 / viewportSize; iterationCount = 0.0; float end = P1.x * stepDir; for (int i = 0; i < MAX_ITERATION; i++) { pqk += dPQK; if ((pqk.x * stepDir) >= end) { break; } rayZNear = rayZFar; rayZFar = (dPQK.z * 0.5 + pqk.z) / (dPQK.w * 0.5 + pqk.w); hitPixel = permute ? pqk.yx : pqk.xy; hitPixel *= texelSize; intersect = rayIntersectDepth(rayZNear, rayZFar, hitPixel); iterationCount += 1.0; // PENDING Right on all platforms? if (intersect) { break; } } // Binary search refinement // FIXME If intersect in first iteration binary search may easily lead to the pixel of reflect object it self if (pixStride > 1.0 && intersect && iterationCount > 1.0) { // Roll back pqk -= dPQK; dPQK /= pixStride; float originalStride = pixStride * 0.5; float stride = originalStride; rayZNear = pqk.z / pqk.w; rayZFar = rayZNear; for (int j = 0; j < MAX_BINARY_SEARCH_ITERATION; j++) { pqk += dPQK * stride; rayZNear = rayZFar; rayZFar = (dPQK.z * -0.5 + pqk.z) / (dPQK.w * -0.5 + pqk.w); hitPixel = permute ? pqk.yx : pqk.xy; hitPixel *= texelSize; originalStride *= 0.5; stride = rayIntersectDepth(rayZNear, rayZFar, hitPixel) ? -originalStride : originalStride; } } Q0.xy += dQ.xy * iterationCount; Q0.z = pqk.z; hitPoint = Q0 / pqk.w; return intersect; } float calculateAlpha(float iterationCount, float reflectivity, vec2 hitPixel, vec3 hitPoint, float dist, vec3 rayDir) { float alpha = clamp(reflectivity, 0.0, 1.0); // Fade ray hits that approach the maximum iterations alpha *= 1.0 - (iterationCount / float(MAX_ITERATION)); // Fade ray hits that approach the screen edge vec2 hitPixelNDC = hitPixel * 2.0 - 1.0; float maxDimension = min(1.0, max(abs(hitPixelNDC.x), abs(hitPixelNDC.y))); alpha *= 1.0 - max(0.0, maxDimension - screenEdgeFadeStart) / (1.0 - screenEdgeFadeStart); // Fade ray hits base on how much they face the camera float _eyeFadeStart = eyeFadeStart; float _eyeFadeEnd = eyeFadeEnd; if (_eyeFadeStart > _eyeFadeEnd) { float tmp = _eyeFadeEnd; _eyeFadeEnd = _eyeFadeStart; _eyeFadeStart = tmp; } float eyeDir = clamp(rayDir.z, _eyeFadeStart, _eyeFadeEnd); alpha *= 1.0 - (eyeDir - _eyeFadeStart) / (_eyeFadeEnd - _eyeFadeStart); // Fade ray hits based on distance from ray origin alpha *= 1.0 - clamp(dist / maxRayDistance, 0.0, 1.0); return alpha; } void main() { vec4 normalAndGloss = texture2D(gBufferTexture1, v_Uv); if (dot(normalAndGloss.rgb, vec3(1.0)) == 0.0) { discard; } float g = normalAndGloss.a; if (g <= minGlossiness) { discard; } float reflectivity = g; vec3 N = normalAndGloss.rgb * 2.0 - 1.0; N = normalize((viewInverseTranspose * vec4(N, 0.0)).xyz); // Position in view vec4 projectedPos = vec4(v_Uv * 2.0 - 1.0, fetchDepth(gBufferTexture2, v_Uv), 1.0); vec4 pos = projectionInv * projectedPos; vec3 rayOrigin = pos.xyz / pos.w; vec3 rayDir = normalize(reflect(normalize(rayOrigin), N)); vec2 hitPixel; vec3 hitPoint; float iterationCount; // Get jitter vec2 uv2 = v_Uv * viewportSize; float jitter = fract((uv2.x + uv2.y) * 0.25); bool intersect = traceScreenSpaceRay(rayOrigin, rayDir, jitter, hitPixel, hitPoint, iterationCount); // Is empty if (!intersect) { discard; } float dist = distance(rayOrigin, hitPoint); float alpha = calculateAlpha(iterationCount, reflectivity, hitPixel, hitPoint, dist, rayDir) * float(intersect); vec3 hitNormal = texture2D(gBufferTexture1, hitPixel).rgb * 2.0 - 1.0; hitNormal = normalize((viewInverseTranspose * vec4(hitNormal, 0.0)).xyz); // Ignore the pixel not face the ray // TODO fadeout ? // PENDING Can be configured? if (dot(hitNormal, rayDir) >= 0.0) { discard; } vec4 color = texture2D(colorTex, hitPixel); gl_FragColor = vec4(color.rgb * alpha, color.a); } ` }; export { SSRShader }; ================================================ FILE: examples/jsm/shaders/ShadowShader.js ================================================ const ShadowShader = { name: 'shadow_shader', defines: {}, uniforms: {}, vertexShader: ` #include #include #include #include #include void main() { #include #include #include #include #include #include } `, fragmentShader: ` #include #include #include #include #include float getShadowMask() { float shadow = 1.0; #if NUM_DIR_LIGHTS > 0 #pragma unroll_loop_start for (int i = 0; i < NUM_DIR_LIGHTS; i++) { #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_DIR_SHADOWS) #ifdef USE_PCSS_SOFT_SHADOW shadow *= getShadowWithPCSS(directionalDepthMap[i], directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams); #else shadow *= getShadow(directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams); #endif #endif } #pragma unroll_loop_end #endif #if NUM_POINT_LIGHTS > 0 #pragma unroll_loop_start for (int i = 0; i < NUM_POINT_LIGHTS; i++) { #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_POINT_SHADOWS) shadow *= getPointShadow(pointShadowMap[i], vPointShadowCoord[i], u_PointShadow[i].shadowMapSize, u_PointShadow[i].shadowBias, u_PointShadow[i].shadowParams, u_PointShadow[i].shadowCameraRange); #endif } #pragma unroll_loop_end #endif #if NUM_SPOT_LIGHTS > 0 float lightDistance; float angleCos; #pragma unroll_loop_start for (int i = 0; i < NUM_SPOT_LIGHTS; i++) { vec3 L = u_Spot[i].position - v_modelPos; lightDistance = length(L); L = normalize(L); angleCos = dot(L, -normalize(u_Spot[i].direction)); if(all(bvec2(angleCos > u_Spot[i].coneCos, lightDistance < u_Spot[i].distance))) { #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_SPOT_SHADOWS) #ifdef USE_PCSS_SOFT_SHADOW shadow *= getShadowWithPCSS(spotDepthMap[i], spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams); #else shadow *= getShadow(spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams); #endif #endif } } #pragma unroll_loop_end #endif return shadow; } void main() { gl_FragColor = vec4(u_Color, u_Opacity * (1.0 - getShadowMask())); #include } ` }; export { ShadowShader }; ================================================ FILE: examples/jsm/shaders/SketchShader.js ================================================ /** * Sketch Shader */ const SketchShader = { name: 'sketch', defines: {}, uniforms: { normalTexture: null, depthTexture: null, uThreshold: 0.55, uContrast: 0.5, matProjViewInverse: new Float32Array(16), uColor: [0, 0, 0] }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` varying vec2 v_Uv; uniform sampler2D normalTexture; uniform sampler2D depthTexture; uniform vec2 u_RenderTargetSize; uniform float uThreshold; uniform float uContrast; uniform mat4 matProjViewInverse; void getNormalPosition(in vec2 coord, out vec3 position, out vec3 normal) { normal.xyz = texture2D(normalTexture, coord).xyz * 2.0 - 1.0; float z = texture2D(depthTexture, coord).r * 2.0 - 1.0; vec2 xy = coord * 2.0 - 1.0; vec4 p4 = vec4(xy, z, 1.0); p4 = matProjViewInverse * p4; p4.xyz /= p4.w; position.xyz = p4.xyz; } float planeDistance(vec3 posA, vec3 norA, vec3 posB, vec3 norB) { vec3 posDelta = normalize(posB - posA); float planeDist = max(abs(dot(posDelta, norA)), abs(dot(posDelta, norB))); float normalDist = max(1.0 - dot(norA, norB), 0.0); float test = dot(norA, vec3(1.0)) + dot(norB, vec3(1.0)); return max(planeDist, normalDist) * step(-5.9, test); } uniform vec3 uColor; vec4 shade() { vec2 vFragCoord = v_Uv; vec2 pixelSize = 1.0 / u_RenderTargetSize; vec2 coordUp = vFragCoord - vec2(0.0, pixelSize.y); vec2 coordDown = vFragCoord + vec2(0.0, pixelSize.y); vec2 coordLeft = vFragCoord - vec2(pixelSize.x, 0.0); vec2 coordRight = vFragCoord + vec2(pixelSize.x, 0.0); vec3 posUp, norUp; vec3 posDown, norDown; vec3 posLeft, norLeft; vec3 posRight, norRight; getNormalPosition(coordUp, posUp, norUp); getNormalPosition(coordDown, posDown, norDown); getNormalPosition(coordLeft, posLeft, norLeft); getNormalPosition(coordRight, posRight, norRight); vec2 planeDist = vec2(planeDistance(posLeft, norLeft, posRight, norRight), planeDistance(posUp, norUp, posDown, norDown)); float edge = length(planeDist); float sketch = step(edge, uThreshold); sketch = clamp(uContrast * (1.0 - sketch), 0.0, 1.0); return vec4(uColor, sketch); } void main() { gl_FragColor = shade(); } ` }; export { SketchShader }; ================================================ FILE: examples/jsm/shaders/SkyShader.js ================================================ // https://www.shadertoy.com/view/MllBR2 export const SkyShader = { name: 'sky_bg', defines: { SAMPLES_NUMS: 16, DISPLAY_SUN: false }, uniforms: { sunU: 1.55, sunV: 0.65, eyePos: 1500, sunRadius: 500.0, // = 500.0; sunRadiance: 10.0, // = 20.0; mieG: 0.96, // = 0.76; mieHeight: 1200, // = 1200; sunBrightness: 1.0 // = 1.0; }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform float sunU; uniform float sunV; uniform float eyePos; uniform float sunRadius; uniform float sunRadiance; uniform float mieG; uniform float mieHeight; uniform float sunBrightness; varying vec2 v_Uv; struct ScatteringParams { float sunRadius; float sunRadiance; float mieG; float mieHeight; float rayleighHeight; vec3 waveLambdaMie; vec3 waveLambdaOzone; vec3 waveLambdaRayleigh; float earthRadius; float earthAtmTopRadius; vec3 earthCenter; }; vec3 transmittance; vec3 insctrMie; vec3 insctrRayleigh; vec3 ComputeSphereNormal(vec2 coord, float phiStart, float phiLength, float thetaStart, float thetaLength){ vec3 normal = vec3(1.0); normal.x = -sin(thetaStart + coord.y * thetaLength) * sin(phiStart + coord.x * phiLength); normal.y = -cos(thetaStart + coord.y * thetaLength); normal.z = -sin(thetaStart + coord.y * thetaLength) * cos(phiStart + coord.x * phiLength); return normalize(normal); } vec2 ComputeRaySphereIntersection(vec3 position, vec3 dir, vec3 center, float radius) { vec3 origin = position - center; float B = dot(origin, dir); float C = dot(origin, origin) - radius * radius; float D = B * B - C; vec2 minimaxIntersections; if (D < 0.0) { minimaxIntersections = vec2(-1.0, -1.0); } else { D = sqrt(D); minimaxIntersections = vec2(-B - D, -B + D); } return minimaxIntersections; } vec3 ComputeWaveLambdaRayleigh(vec3 lambda) { float n = 1.0003; float N = 2.545E25; float pn = 0.035; float n2 = n * n; float pi3 = PI * PI * PI; float rayleighConst = (8.0 * pi3 * pow(n2 - 1.0,2.0)) / (3.0 * N) * ((6.0 + 3.0 * pn) / (6.0 - 7.0 * pn)); return vec3(rayleighConst) / (lambda * lambda * lambda * lambda); } float ComputePhaseMie(float theta, float g) { float g2 = g * g; return (1.0 - g2) / pow(1.0 + g2 - 2.0 * g * saturate(theta), 1.5) / (4.0 * PI); } float ComputePhaseRayleigh(float theta) { float theta2 = theta * theta; return (theta2 * 0.75 + 0.75) / (4.0 * PI); } float ChapmanApproximation(float X, float h, float cosZenith) { float c = sqrt(X + h); float c_exp_h = c * exp(-h); if (cosZenith >= 0.0) { return c_exp_h / (c * cosZenith + 1.0); } else { float x0 = sqrt(1.0 - cosZenith * cosZenith) * (X + h); float c0 = sqrt(x0); return 2.0 * c0 * exp(X - x0) - c_exp_h / (1.0 - c * cosZenith); } } float GetOpticalDepthSchueler(float h, float H, float earthRadius, float cosZenith) { return H * ChapmanApproximation(earthRadius / H, h / H, cosZenith); } vec3 GetTransmittance(ScatteringParams setting, vec3 L, vec3 V) { float ch = GetOpticalDepthSchueler(L.y, setting.rayleighHeight, setting.earthRadius, V.y); return exp(-(setting.waveLambdaMie + setting.waveLambdaRayleigh) * ch); } vec2 ComputeOpticalDepth(ScatteringParams setting, vec3 samplePoint, vec3 V, vec3 L, float neg) { float rl = length(samplePoint); float h = rl - setting.earthRadius; vec3 r = samplePoint / rl; float cos_chi_sun = dot(r, L); float cos_chi_ray = dot(r, V * neg); float opticalDepthSun = GetOpticalDepthSchueler(h, setting.rayleighHeight, setting.earthRadius, cos_chi_sun); float opticalDepthCamera = GetOpticalDepthSchueler(h, setting.rayleighHeight, setting.earthRadius, cos_chi_ray) * neg; return vec2(opticalDepthSun, opticalDepthCamera); } void AerialPerspective(ScatteringParams setting, vec3 start, vec3 end, vec3 V, vec3 L, int infinite) { float inf_neg = 1.0; if(infinite == 0){ inf_neg = -1.0; } int a1 = SAMPLES_NUMS; float a= float(a1); vec3 sampleStep = (end - start) / a * 1.0; vec3 samplePoint = end - sampleStep; vec3 sampleLambda = setting.waveLambdaMie + setting.waveLambdaRayleigh + setting.waveLambdaOzone; float sampleLength = length(sampleStep); vec3 scattering = vec3(0.0); vec2 lastOpticalDepth = ComputeOpticalDepth(setting, end, V, L, inf_neg); for (int i = 1; i < a1; i = i + 1) { vec2 opticalDepth = ComputeOpticalDepth(setting, samplePoint, V, L, inf_neg); vec3 segment_s = exp(-sampleLambda * (opticalDepth.x + lastOpticalDepth.x)); vec3 segment_t = exp(-sampleLambda * (opticalDepth.y - lastOpticalDepth.y)); transmittance *= segment_t; scattering = scattering * segment_t; scattering += exp(-(length(samplePoint) - setting.earthRadius) / setting.rayleighHeight) * segment_s; lastOpticalDepth = opticalDepth; samplePoint = samplePoint - sampleStep; } insctrMie = scattering * setting.waveLambdaMie * sampleLength; insctrRayleigh = scattering * setting.waveLambdaRayleigh * sampleLength; } float ComputeSkyboxChapman(ScatteringParams setting, vec3 eye, vec3 V, vec3 L) { int neg = 1; vec2 outerIntersections = ComputeRaySphereIntersection(eye, V, setting.earthCenter, setting.earthAtmTopRadius); if (outerIntersections.y < 0.0){ return 0.0; } vec2 innerIntersections = ComputeRaySphereIntersection(eye, V, setting.earthCenter, setting.earthRadius); if (innerIntersections.x > 0.0) { neg = 0; outerIntersections.y = innerIntersections.x; } vec3 eye0 = eye - setting.earthCenter; vec3 start = eye0 + V * max(0.0, outerIntersections.x); vec3 end = eye0 + V * outerIntersections.y; AerialPerspective(setting, start, end, V, L, neg); //bool intersectionTest = innerIntersections.x < 0.0 && innerIntersections.y < 0.0; //return intersectionTest ? 1.0 : 0.0; if(innerIntersections.x < 0.0 && innerIntersections.y < 0.0){ return 1.0; } return 0.0; } vec4 ComputeSkyInscattering(ScatteringParams setting, vec3 eye, vec3 V, vec3 L) { transmittance = vec3(1.0); insctrMie = vec3(0.0); insctrRayleigh = vec3(0.0); float intersectionTest = ComputeSkyboxChapman(setting, eye, V, L); float phaseTheta = dot(V, L); float phaseMie = ComputePhaseMie(phaseTheta, setting.mieG); float phaseRayleigh = ComputePhaseRayleigh(phaseTheta); float phaseNight = 1.0 - saturate(transmittance.x * 0.00001); vec3 insctrTotalMie = insctrMie * phaseMie; vec3 insctrTotalRayleigh = insctrRayleigh * phaseRayleigh; vec3 sky = (insctrTotalMie + insctrTotalRayleigh) * setting.sunRadiance; #ifdef DISPLAY_SUN float angle = saturate((1.0 - phaseTheta) * setting.sunRadius); float cosAngle = cos(angle * PI * 0.5); float edge= 0.0; if(angle >= 0.9){ edge = smoothstep(0.9, 1.0, angle); } vec3 limbDarkening = GetTransmittance(setting, -L, V); limbDarkening *= pow(vec3(cosAngle), vec3(0.420, 0.503, 0.652)) * mix(vec3(1.0), vec3(1.2, 0.9, 0.5), edge) * intersectionTest; sky += limbDarkening * sunBrightness; #endif return vec4(sky, phaseNight * intersectionTest); } void main() { float eyePosition = eyePos; vec2 sun = vec2(sunU, sunV); float fpi = float(PI); float fpi2 = 2. * PI; vec3 V = ComputeSphereNormal(v_Uv, 0.0, fpi2, 0.0, fpi); vec3 L = ComputeSphereNormal(vec2(sun.x, sun.y), 0.0, fpi, 0.0, PI); ScatteringParams setting; setting.sunRadius = sunRadius; setting.sunRadiance = sunRadiance; setting.mieG = mieG; setting.mieHeight = mieHeight; setting.rayleighHeight = 8000.0; setting.earthRadius = 6360000.0; setting.earthAtmTopRadius = 6420000.0; setting.earthCenter = vec3(0, -setting.earthRadius, 0); setting.waveLambdaMie = vec3(0.0000002); // wavelength with 680nm, 550nm, 450nm setting.waveLambdaRayleigh = ComputeWaveLambdaRayleigh(vec3(0.000000680, 0.000000550, 0.000000450)); setting.waveLambdaOzone = vec3(1.36820899679147, 3.31405330400124, 0.13601728252538)* 0.0000006 * 2.504; vec3 eye = vec3(0,eyePosition, 0); vec4 sky0 = ComputeSkyInscattering(setting, eye, V, L); vec3 sky = vec3(sky0.rgb); sky = pow(sky.rgb, vec3(1.0 / 2.2)); // gamma gl_FragColor = vec4(sky.rgb, 1.0); } ` }; ================================================ FILE: examples/jsm/shaders/TAAShader.js ================================================ /** * TAA Shader * Modified from https://github.com/Unity-Technologies/PostProcessing/blob/v2/PostProcessing/Shaders/Builtins/TemporalAntialiasing.shader */ const TAAShader = { name: 'taa', uniforms: { prevTex: null, currTex: null, velocityTex: null, depthTex: null, texelSize: [1 / 512, 1 / 512], still: true, stillBlending: 0.95, motionBlending: 0.85 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D prevTex; uniform sampler2D currTex; uniform sampler2D velocityTex; uniform sampler2D depthTex; uniform vec2 texelSize; uniform bool still; uniform float stillBlending; uniform float motionBlending; varying vec2 v_Uv; float luminance(vec4 color) { return dot(color.rgb, vec3(0.2125, 0.7154, 0.0721)); } // Tonemap and untonmap from "High Quality Temporal Supersampling" vec4 tonemap(vec4 color) { return vec4(color.rgb / (luminance(color) + 1.0), color.a); } vec4 untonemap(vec4 color) { return vec4(color.rgb / max(1.0 - luminance(color), 0.0001), color.a); } float compareDepth(float a, float b) { return step(a, b); } vec2 getClosestFragment(vec2 uv) { vec2 k = texelSize.xy; vec4 neighborhood = vec4( texture2D(depthTex, uv - k).r, texture2D(depthTex, uv + vec2(k.x, -k.y)).r, texture2D(depthTex, uv + vec2(-k.x, k.y)).r, texture2D(depthTex, uv + k).r ); vec3 result = vec3(0.0, 0.0, texture2D(depthTex, uv)); result = mix(result, vec3(-1.0, -1.0, neighborhood.x), compareDepth(neighborhood.x, result.z)); result = mix(result, vec3( 1.0, -1.0, neighborhood.y), compareDepth(neighborhood.y, result.z)); result = mix(result, vec3(-1.0, 1.0, neighborhood.z), compareDepth(neighborhood.z, result.z)); result = mix(result, vec3( 1.0, 1.0, neighborhood.w), compareDepth(neighborhood.w, result.z)); return (uv + result.xy * k); } vec4 clipToAABB(vec4 color, vec3 minimum, vec3 maximum) { // Note: only clips towards aabb center (but fast!) vec3 center = 0.5 * (maximum + minimum); vec3 extents = 0.5 * (maximum - minimum); // This is actually "distance", however the keyword is reserved vec3 offset = color.rgb - center; vec3 ts = abs(extents / (offset + 0.0001)); float t = clamp(min(min(ts.x, ts.y), ts.z), 0.0, 1.0); color.rgb = center + offset * t; return color; } void main() { if (still) { gl_FragColor = mix(texture2D(currTex, v_Uv), texture2D(prevTex, v_Uv), stillBlending); return; } vec2 closest = getClosestFragment(v_Uv); vec4 motionTexel = texture2D(velocityTex, closest); if (motionTexel.a < 0.1) { gl_FragColor = texture2D(currTex, v_Uv); return; } vec2 motion = motionTexel.rg - 0.5; float motionLength = length(motion); vec4 color = texture2D(currTex, v_Uv); vec4 history = texture2D(prevTex, v_Uv - motion); // handle ghosting, clip history color to AABB vec2 k = texelSize.xy; vec4 topLeft = texture2D(currTex, v_Uv - k * 0.5); vec4 bottomRight = texture2D(currTex, v_Uv + k * 0.5); vec4 corners = 4.0 * (topLeft + bottomRight) - 2.0 * color; vec4 average = (corners + color) * 0.142857; vec2 luma = vec2(luminance(average), luminance(color)); float nudge = 4.0 * abs(luma.x - luma.y); // float nudge = mix(4.0, 0.25, clamp(motionLength * 100.0, 0.0, 1.0)) * abs(luma.x - luma.y); vec4 minimum = min(bottomRight, topLeft) - nudge; vec4 maximum = max(topLeft, bottomRight) + nudge; history = clipToAABB(history, minimum.xyz, maximum.xyz); // blend weight float weight = clamp( mix(stillBlending, motionBlending, motionLength * 6000.), motionBlending, stillBlending ); // float weight = motionBlending; // mix after tonemap color = mix(tonemap(color), tonemap(history), weight); gl_FragColor = untonemap(color); // color = mix(color, history, motionBlending); // gl_FragColor = color; } ` }; export { TAAShader }; ================================================ FILE: examples/jsm/shaders/TextureVariationShader.js ================================================ /** * TextureVariation Shader * Modified from https://www.shadertoy.com/view/Xtl3zf */ const TextureVariationShader = { name: 'texture_variation', uniforms: { map: null, randomMap: null, factor: 0.4, scaleFactor: 10, noiseFactor: 0.05 }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; vec4 worldPosition = u_Model * vec4(a_Position, 1.0); gl_Position = u_ProjectionView * worldPosition; } `, fragmentShader: ` uniform sampler2D map; uniform sampler2D randomMap; uniform float factor; uniform float scaleFactor; uniform float noiseFactor; varying vec2 v_Uv; float sum(vec3 v) { return v.x + v.y + v.z; } vec3 textureNoTile(in vec2 x, float v) { // sample variation pattern float k = texture(randomMap, noiseFactor * x).x; // cheap (cache friendly) lookup // compute index float index = k * 8.0; float i = floor(index); float f = fract(index); // offsets for the different virtual patterns vec2 offa = sin(vec2(3.0, 7.0) * (i + 0.0)); // can replace with any other hash vec2 offb = sin(vec2(3.0, 7.0) * (i + 1.0)); // can replace with any other hash // compute derivatives for mip-mapping vec2 dx = dFdx(x), dy = dFdy(x); // sample the two closest virtual patterns vec3 cola = textureGrad(map, x + v * offa, dx, dy).xyz; vec3 colb = textureGrad(map, x + v * offb, dx, dy).xyz; // interpolate between the two virtual patterns return mix(cola, colb, smoothstep(0.2, 0.8, f - 0.1 * sum(cola - colb))); } void main() { vec3 col = textureNoTile(scaleFactor * v_Uv, factor); gl_FragColor = vec4(col, 1.0); } ` }; export { TextureVariationShader }; ================================================ FILE: examples/jsm/shaders/VolumeShader.js ================================================ /** * volume shader * refer: https://github.com/modelo/API_samples/tree/master/samples/volume-rendering */ const VolumeShader = { name: 'volume', defines: {}, uniforms: { platteTexture: null, densityTexture: null, uInvTransform: new Float32Array(16), uAlphaCorrection: 0.09 }, vertexShader: ` #include #include #include #include void main() { #include #include #include #include #include } `, fragmentShader: ` precision highp sampler3D; #include #include uniform sampler2D platteTexture; uniform sampler3D densityTexture; uniform mat4 uInvTransform; uniform float uAlphaCorrection; const float STEP = 1.73205081 / 256.0; // http://iquilezles.org/www/articles/intersectors/intersectors.htm // axis aligned box centered at the origin, with size boxSize vec2 boxIntersection(vec3 ro, vec3 rd, vec3 boxSize) { vec3 m = 1.0 / rd; // can precompute if traversing a set of aligned boxes vec3 n = m * ro; // can precompute if traversing a set of aligned boxes vec3 k = abs(m) * boxSize; vec3 t1 = -n - k; vec3 t2 = -n + k; float tN = max(max(t1.x, t1.y), t1.z); float tF = min(min(t2.x, t2.y), t2.z); if (tN > tF || tF < 0.0) return vec2(-1.0); // no intersection return vec2(tN, tF); } vec4 getColor(float intensity) { // makes the volume looks brighter; intensity = min(0.46, intensity) / 0.46; vec2 _uv = vec2(intensity, 0); vec4 color = texture2D(platteTexture, _uv); float alpha = intensity; if (alpha < 0.03) { alpha = 0.01; } return vec4(color.r, color.g, color.b, alpha); } vec4 sampleAs3DTexture(vec3 texCoord) { texCoord += vec3(0.5); return getColor(texture(densityTexture, texCoord).r); } vec3 shade(inout float transparent, in vec3 P, in vec3 V) { // Transform to model space. vec3 frontPos = (uInvTransform * vec4(P.xyz, 1.0)).xyz; vec3 cameraPos = (uInvTransform * vec4(u_CameraPosition.xyz, 1.0)).xyz; vec3 rayDir = normalize(frontPos - cameraPos); vec3 backPos = frontPos; vec2 t = boxIntersection(cameraPos, rayDir, vec3(0.5)); if (t.x > -1.0 && t.y > -1.0) { backPos = cameraPos + rayDir * t.y; } float rayLength = length(backPos - frontPos); int steps = int(max(1.0, floor(rayLength / STEP))); // Calculate how long to increment in each step. float delta = rayLength / float(steps); // The increment in each direction for each step. vec3 deltaDirection = rayDir * delta; // Start the ray casting from the front position. vec3 currentPosition = frontPos; // The color accumulator. vec4 accumulatedColor = vec4(0.0); // The alpha value accumulated so far. float accumulatedAlpha = 0.0; vec4 colorSample; float alphaSample; // Perform the ray marching iterations for (int i = 0; i < steps; i++) { colorSample = sampleAs3DTexture(currentPosition); alphaSample = colorSample.a * uAlphaCorrection; alphaSample *= (1.0 - accumulatedAlpha); // Perform the composition. accumulatedColor += colorSample * alphaSample; // Store the alpha accumulated so far. accumulatedAlpha += alphaSample; // Advance the ray. currentPosition += deltaDirection; } transparent = accumulatedAlpha; return accumulatedColor.xyz; } void main() { vec3 V = normalize(v_modelPos - u_CameraPosition); vec3 P = v_modelPos; float transparent; vec3 color = shade(transparent, P, V); gl_FragColor = vec4(color, transparent); } ` }; export { VolumeShader }; ================================================ FILE: examples/jsm/shaders/WaterShader.js ================================================ const WaterShader = { name: 'water', uniforms: { 'normalMap': null, 'opacity': 1.0, 'size': [0.3, 0.3], 'distortionScale': 15.0, 'sunColor': [1, 1, 1], 'LightPosition': [0.70707, 0.70707, 0], 'time': 0.0, 'offset': [0, 0], 'waterColor': [0, 0.3, 0.5], 'waveStrength': 1.0, 'reflectWeight': 1.0, 'envMap': null, 'envMapFlip': -1, 'envQuaternion': [0, 0, 0, 1] }, vertexShader: ` #include attribute vec2 a_Uv; varying vec2 vUv; varying vec3 vObjectNormal; varying vec3 vNormal; varying vec3 vViewPosition; #include void main() { vUv=a_Uv; vec3 transformedNormal = normalize(a_Normal); vObjectNormal = transformedNormal; transformedNormal = (transposeMat4(inverseMat4(u_View * u_Model)) * vec4(vObjectNormal, 0.0)).xyz; vNormal= transformedNormal; vec4 mvPosition = u_View * u_Model * vec4(a_Position, 1.0); vViewPosition = mvPosition.xyz; gl_Position = u_Projection * mvPosition; #include } `, fragmentShader: ` #include uniform vec3 waterColor; uniform float opacity; uniform vec2 size; uniform float distortionScale; uniform float waveStrength; uniform float time; uniform vec2 offset; uniform sampler2D normalMap; uniform samplerCube envMap; uniform float envMapFlip; uniform vec4 envQuaternion; uniform float reflectWeight; uniform vec3 sunColor; uniform vec3 LightPosition; uniform mat4 u_Model; varying vec2 vUv; varying vec3 vObjectNormal; varying vec3 vNormal; varying vec3 vViewPosition; #include #include vec3 inverseTransformDirection(in vec3 dir, in mat4 matrix) { // dir can be either a direction vector or a normal vector // upper-left 3x3 of matrix is assumed to be orthogonal return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz ); } vec4 getNoise(vec2 uv) { vec2 uv0 = (uv / 103.0) + vec2(time / 17.0, time / 29.0); vec2 uv1 = uv / 107.0 - vec2(time / -19.0, time / 31.0); vec2 uv2 = uv / vec2(8907.0, 9803.0) + vec2(time / 101.0, time / 97.0); vec2 uv3 = uv / vec2(1091.0, 1027.0) - vec2(time / 109.0, time / -113.0); vec4 noise = texture2D(normalMap, uv0) + texture2D(normalMap, uv1) + texture2D(normalMap, uv2) + texture2D(normalMap, uv3); return noise * 0.5 - 1.0; } void sunLight(const vec3 surfaceNormal, const vec3 eyeDirection, const vec3 sunDirection, float Shininess, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor) { vec3 reflection = normalize(reflect(-sunDirection, surfaceNormal)); float direction = max(0.0, dot(eyeDirection, reflection)); specularColor += pow(direction, Shininess) * spec; diffuseColor += max(dot(sunDirection, surfaceNormal), 0.0) * diffuse; } vec3 applyQuaternionV3 (vec3 v, vec4 q) { float ix = q.w * v.x + q.y * v.z - q.z * v.y; float iy = q.w * v.y + q.z * v.x - q.x * v.z; float iz = q.w * v.z + q.x * v.y - q.y * v.x; float iw = - q.x * v.x - q.y * v.y - q.z * v.z; return vec3( ix * q.w + iw * ( -q.x ) + iy * ( -q.z ) - iz * ( -q.y ), iy * q.w + iw * ( -q.y ) + iz * ( -q.x ) - ix * ( -q.z ), iz * q.w + iw * ( -q.z ) + ix * ( -q.y ) - iy * ( -q.x ) ); } void main() { #include // Get noise normal from normal map. // TODO: remove magic number? vec4 noise = getNoise(vUv * size + offset); vec3 surfaceNormal = normalize(noise.xzy * vec3(3.5, 1.0, 3.5)); // Use waveStrength to control water face peaceful or not. surfaceNormal = mix(vObjectNormal, surfaceNormal.xzy, waveStrength); // Sun light vec3 diffuseLight = vec3(0.0); vec3 specularLight = vec3(0.0); vec3 LightPosition2=(u_View * u_Model * vec4(LightPosition,0.)).xyz; vec3 sunDirection = normalize(LightPosition2 - vViewPosition); vec3 eyeDirection = normalize(-vViewPosition); sunLight(surfaceNormal, eyeDirection, sunDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight); // Get reflect color float distance = length(vViewPosition); vec2 distortion = surfaceNormal.xy * (0.001 + 1.0 / distance) * distortionScale; vec3 reflectVec = reflect(normalize(vViewPosition), normalize(vNormal)); reflectVec = inverseTransformDirection(reflectVec, u_View); reflectVec = vec3(envMapFlip * reflectVec.x, reflectVec.yz + distortion); reflectVec = applyQuaternionV3(reflectVec, envQuaternion); vec4 reflectColor = textureCube(envMap, reflectVec); // Output float theta = max(dot(eyeDirection, surfaceNormal), 0.0); float reflectance = 0.3 + 0.7 * pow((1.0 - theta), 5.0); vec3 scatter = theta * waterColor; vec3 albedo = mix((sunColor * diffuseLight * 0.3 + scatter) , (vec3(0.1) + reflectColor.rgb * 0.9 + reflectColor.rgb * specularLight), reflectance * reflectWeight); gl_FragColor = vec4(albedo, opacity); #include } ` }; export { WaterShader }; ================================================ FILE: examples/jsm/shaders/XRayShader.js ================================================ const XRayShader = { name: 'xray', defines: {}, uniforms: { power: 1.0, glowInverse: false, glowColor: [0, 200 / 255, 1] }, vertexShader: ` #include #include uniform float power; uniform bool glowInverse; varying float intensity; void main() { #include #include #include #include mat4 normalMatrix = transposeMat4(inverseMat4(u_View * u_Model)); vec3 viewSpaceNormal = normalize((normalMatrix * vec4(objectNormal, 0.0)).xyz); float normalFactor = abs(dot(viewSpaceNormal, vec3(0, 0, 1.))); if (glowInverse) { intensity = pow(normalFactor, power); } else { intensity = pow(1.0 - normalFactor, power); } } `, fragmentShader: ` uniform float u_Opacity; uniform vec3 glowColor; varying float intensity; void main() { gl_FragColor = vec4(glowColor, intensity * u_Opacity); } ` }; export { XRayShader }; ================================================ FILE: examples/jsm/stereo/AnaglyphRenderer.js ================================================ import { TEXTURE_FILTER, OffscreenRenderTarget, Matrix4, Matrix3, ShaderPostPass } from 't3d'; import { ForwardRenderer } from '../render/ForwardRenderer.js'; class AnaglyphRenderer extends ForwardRenderer { constructor(view, options) { super(view, options); const _colorMatrixLeft = new Matrix3().fromArray([ 0.456100, -0.0400822, -0.0152161, 0.500484, -0.0378246, -0.0205971, 0.176381, -0.0157589, -0.00546856 ]); const _colorMatrixRight = new Matrix3().fromArray([ -0.0434706, 0.378476, -0.0721527, -0.0879388, 0.73364, -0.112961, -0.00155529, -0.0184503, 1.2264 ]); this.eyeSep = 0.064; this.focus = 10; this._cache = { projection: new Matrix4(), eyeSep: null, focus: null }; const width = view.width; const height = view.height; const _renderTargetL = this._renderTargetL = OffscreenRenderTarget.create2D(width, height); _renderTargetL.texture.minFilter = TEXTURE_FILTER.LINEAR; _renderTargetL.texture.magFilter = TEXTURE_FILTER.NEAREST; const _renderTargetR = this._renderTargetR = OffscreenRenderTarget.create2D(width, height); _renderTargetR.texture.minFilter = TEXTURE_FILTER.LINEAR; _renderTargetR.texture.magFilter = TEXTURE_FILTER.NEAREST; const _shaderPostPass = this._shaderPostPass = new ShaderPostPass(AnaglyphShader); _shaderPostPass.uniforms.mapLeft = _renderTargetL.texture; _shaderPostPass.uniforms.mapRight = _renderTargetR.texture; _shaderPostPass.uniforms.colorMatrixLeft = _colorMatrixLeft.elements; _shaderPostPass.uniforms.colorMatrixRight = _colorMatrixRight.elements; _shaderPostPass.material.transparent = true; } resize(width, height) { this._renderTargetL.resize(width, height); this._renderTargetR.resize(width, height); } render(scene, camera, stereoCamera) { const cameraL = stereoCamera.cameraL; const cameraR = stereoCamera.cameraR; this.matrixAutoUpdate && scene.updateMatrix(); this.updateCamera(camera, stereoCamera); scene.updateRenderStates(cameraL); scene.updateRenderQueue(cameraL); if (this.shadowAutoUpdate || this.shadowNeedsUpdate) { this.shadowMapPass.render(this, scene); this.shadowNeedsUpdate = false; } this.renderScene(scene, cameraL, this._renderTargetL); scene.updateRenderStates(cameraR, false); scene.updateRenderQueue(cameraR, false, false); this.renderScene(scene, cameraR, this._renderTargetR); if (this._renderTargetL.texture) { this.generateMipmaps(this._renderTargetL.texture); } if (this._renderTargetR.texture) { this.generateMipmaps(this._renderTargetR.texture); } this._shaderPostPass.render(this, this.screenRenderTarget); } updateCamera(camera, stereoCamera) { const cameraL = stereoCamera.cameraL; const cameraR = stereoCamera.cameraR; const needsUpdate = !this._cache.projection.equals(camera.projectionMatrix) || this._cache.eyeSep !== this.eyeSep || this._cache.focus !== this.focus; if (needsUpdate) { this._cache.projection.copy(camera.projectionMatrix); this._cache.eyeSep = this.eyeSep; this._cache.focus = this.focus; const focus = this.focus; const eyeSep = this.eyeSep; const fov = getFov(camera.projectionMatrix); const aspect = getAspect(camera.projectionMatrix); const near = getNear(camera.projectionMatrix); // Off-axis stereoscopic effect based on // http://paulbourke.net/stereographics/stereorender/ _projectionMatrix.copy(camera.projectionMatrix); const eyeSepHalf = eyeSep / 2; const eyeSepOnProjection = eyeSepHalf * near / focus; const ymax = near * Math.tan(fov / 180 * Math.PI * 0.5); let xmin, xmax; // translate xOffset _eyeLeft.elements[12] = -eyeSepHalf; _eyeRight.elements[12] = eyeSepHalf; // for left eye xmin = -ymax * aspect + eyeSepOnProjection; xmax = ymax * aspect + eyeSepOnProjection; _projectionMatrix.elements[0] = 2 * near / (xmax - xmin); _projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin); cameraL.projectionMatrix.copy(_projectionMatrix); // for right eye xmin = -ymax * aspect - eyeSepOnProjection; xmax = ymax * aspect - eyeSepOnProjection; _projectionMatrix.elements[0] = 2 * near / (xmax - xmin); _projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin); cameraR.projectionMatrix.copy(_projectionMatrix); } updateStereoCamera(camera, cameraL, _eyeLeft); updateStereoCamera(camera, cameraR, _eyeRight); } dispose() { this._renderTargetL.dispose(); this._renderTargetR.dispose(); this._shaderPostPass.dispose(); } } const _eyeRight = new Matrix4(); const _eyeLeft = new Matrix4(); const _projectionMatrix = new Matrix4(); function getFov(mat4) { return 180 / Math.PI * (2 * Math.atan(1 / mat4.elements[5])); } function getNear(mat4) { return mat4.elements[14] / (mat4.elements[13] - 1); } function getAspect(mat4) { return mat4.elements[5] / mat4.elements[0]; } function updateStereoCamera(camera, stereoCamera, offsetMat) { stereoCamera.worldMatrix.copy(camera.worldMatrix); stereoCamera.worldMatrix.multiply(offsetMat); stereoCamera.viewMatrix.copy(stereoCamera.worldMatrix).invert(); stereoCamera.projectionMatrixInverse.copy(stereoCamera.projectionMatrix).invert(); stereoCamera.projectionViewMatrix.multiplyMatrices(stereoCamera.projectionMatrix, stereoCamera.viewMatrix); stereoCamera.frustum.setFromMatrix(stereoCamera.projectionViewMatrix); } const AnaglyphShader = { name: 'stereo_anaglyph', uniforms: { 'mapLeft': null, 'mapRight': null, 'colorMatrixLeft': new Float32Array(9), 'colorMatrixRight': new Float32Array(9) }, vertexShader: ` attribute vec3 a_Position; attribute vec2 a_Uv; uniform mat4 u_ProjectionView; uniform mat4 u_Model; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4( a_Position, 1.0 ); }`, fragmentShader: ` uniform sampler2D mapLeft; uniform sampler2D mapRight; varying vec2 v_Uv; uniform mat3 colorMatrixLeft; uniform mat3 colorMatrixRight; // These functions implement sRGB linearization and gamma correction float lin( float c ) { return c <= 0.04045 ? c * 0.0773993808 : pow( c * 0.9478672986 + 0.0521327014, 2.4 ); } vec4 lin( vec4 c ) { return vec4( lin( c.r ), lin( c.g ), lin( c.b ), c.a ); } float dev( float c ) { return c <= 0.0031308 ? c * 12.92 : pow( c, 0.41666 ) * 1.055 - 0.055; } void main() { vec2 uv = v_Uv; vec4 colorL = lin( texture2D( mapLeft, uv ) ); vec4 colorR = lin( texture2D( mapRight, uv ) ); vec3 color = clamp( colorMatrixLeft * colorL.rgb + colorMatrixRight * colorR.rgb, 0., 1. ); gl_FragColor = vec4( dev( color.r ), dev( color.g ), dev( color.b ), max( colorL.a, colorR.a ) ); } ` }; export { AnaglyphRenderer }; ================================================ FILE: examples/jsm/stereo/StereoCamera.js ================================================ import { Camera, Object3D, TEXEL_ENCODING_TYPE } from 't3d'; class StereoCamera extends Object3D { constructor() { super(); this.cameraL = new Camera(); this.cameraR = new Camera(); this.near = 1; this.far = 1000; } } Object.defineProperties(StereoCamera.prototype, { gammaFactor: { get: function() { return this.cameraL.gammaFactor; }, set: function(value) { this.cameraL.gammaFactor = value; this.cameraR.gammaFactor = value; } }, gammaInput: { configurable: true, get: function() { console.warn('StereoCamera: .gammaInput has been removed. Use texture.encoding instead.'); return false; }, set: function(value) { console.warn('StereoCamera: .gammaInput has been removed. Use texture.encoding instead.'); } }, gammaOutput: { configurable: true, get: function() { console.warn('StereoCamera: .gammaOutput has been removed. Use .outputEncoding or renderTarget.texture.encoding instead.'); return this.cameraL.outputEncoding == TEXEL_ENCODING_TYPE.GAMMA; }, set: function(value) { console.warn('StereoCamera: .gammaOutput has been removed. Use .outputEncoding or renderTarget.texture.encoding instead.'); if (value) { this.cameraL.outputEncoding = TEXEL_ENCODING_TYPE.GAMMA; this.cameraR.outputEncoding = TEXEL_ENCODING_TYPE.GAMMA; } else { this.cameraL.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR; this.cameraR.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR; } } }, outputEncoding: { get: function() { return this.cameraL.outputEncoding; }, set: function(value) { this.cameraL.outputEncoding = value; this.cameraR.outputEncoding = value; } } }); export { StereoCamera }; ================================================ FILE: examples/jsm/stereo/StereoRenderer.js ================================================ import { ForwardRenderer } from '../render/ForwardRenderer.js'; class StereoRenderer extends ForwardRenderer { constructor(view, options) { super(view, options); } render(scene, camera, renderTarget) { const cameraL = camera.cameraL; const cameraR = camera.cameraR; this.matrixAutoUpdate && scene.updateMatrix(); scene.updateRenderStates(cameraL); scene.updateRenderQueue(cameraL); // TODO generate render queue by combined camera if (this.shadowAutoUpdate || this.shadowNeedsUpdate) { this.shadowMapPass.render(this, scene); this.shadowNeedsUpdate = false; } renderTarget = renderTarget || this.screenRenderTarget; this.renderScene(scene, cameraL, renderTarget); scene.updateRenderStates(cameraR, false); scene.updateRenderQueue(cameraR, false, false); const oldClearColor = renderTarget.clearColor; const oldClearDepth = renderTarget.clearDepth; const oldClearStencil = renderTarget.clearStencil; renderTarget.setClear(false, false, false); this.renderScene(scene, cameraR, renderTarget); renderTarget.setClear(oldClearColor, oldClearDepth, oldClearStencil); } } export { StereoRenderer }; ================================================ FILE: examples/jsm/stereo/WebVRControls.js ================================================ class WebVRControl { constructor(camera) { this.camera = camera; this._vrDisplay = null; this._frameData = null; this._currentDepthNear = 0; this._currentDepthFar = 0; } enter() { if (navigator.getVRDisplays) { return navigator.getVRDisplays().then(displays => { if (displays.length > 0) { this._vrDisplay = displays[0]; return Promise.resolve(); } else { return Promise.reject('WebVRControl: displays.length = 0.'); } }).then(() => { if ('VRFrameData' in window) { this._frameData = new window.VRFrameData(); return Promise.resolve(this._vrDisplay); } else { return Promise.reject('WebVRControl: VRFrameData not exist in global.'); } }); } else { return Promise.reject('WebVRControl: getVRDisplays not exist in navigator.'); } } exit() { this._vrDisplay = null; this._frameData = null; } update() { const camera = this.camera; const vrDisplay = this._vrDisplay; const frameData = this._frameData; if (!vrDisplay || !frameData) { return; } const cameraL = camera.cameraL; const cameraR = camera.cameraR; if (this._currentDepthNear !== camera.near || this._currentDepthFar !== camera.far) { // read from camera vrDisplay.depthNear = camera.near; vrDisplay.depthFar = camera.far; this._currentDepthNear = camera.near; this._currentDepthFar = camera.far; } vrDisplay.getFrameData(frameData); // set Left Camera cameraL.projectionMatrix.elements = frameData.leftProjectionMatrix; cameraL.viewMatrix.elements = frameData.leftViewMatrix; cameraL.viewMatrix.invert().decompose(cameraL.position, cameraL.quaternion, cameraL.scale); cameraL.position.add(camera.position); cameraL.updateMatrix(); cameraL.rect.set(0, 0, 0.5, 1); // set Right Camera cameraR.projectionMatrix.elements = frameData.leftProjectionMatrix; cameraR.viewMatrix.elements = frameData.rightViewMatrix; cameraR.viewMatrix.invert().decompose(cameraR.position, cameraR.quaternion, cameraR.scale); cameraR.position.add(camera.position); cameraR.updateMatrix(); cameraR.rect.set(0.5, 0, 1, 1); } getContext() { return this._vrDisplay; } submit() { if (this._vrDisplay) { this._vrDisplay.submitFrame(); } } } export { WebVRControl }; ================================================ FILE: examples/jsm/stereo/WebXRControls.js ================================================ class WebXRControl { constructor(camera) { this.camera = camera; this._session = null; this._referenceSpace = null; this._currentDepthNear = 0; this._currentDepthFar = 0; } enter(gl, type = 'immersive-vr') { if (navigator.xr) { const sessionInit = { optionalFeatures: ['local-floor', 'bounded-floor'] }; return navigator.xr.isSessionSupported(type) .then(supported => { if (supported) { return Promise.resolve(); } else { return Promise.reject('WebXR: ' + type + ' is not supported'); } }) .then(() => { return navigator.xr.requestSession(type, sessionInit); }) .then(session => { this._session = session; const attributes = gl.getContextAttributes(); const layerInit = { antialias: attributes.antialias, alpha: attributes.alpha, depth: attributes.depth, stencil: attributes.stencil, framebufferScaleFactor: 1.0 }; const baseLayer = new XRWebGLLayer(session, gl, layerInit); session.updateRenderState({ baseLayer }); return session.requestReferenceSpace('local-floor'); }) .then(referenceSpace => { this._referenceSpace = referenceSpace; return Promise.resolve(this._session); }); } else { return Promise.reject('xr not exist in navigator'); } } exit() { // todo } update(frame, width, height) { const camera = this.camera; const session = this._session; const referenceSpace = this._referenceSpace; const cameraL = camera.cameraL; const cameraR = camera.cameraR; if (this._currentDepthNear !== camera.near || this._currentDepthFar !== camera.far) { // the new renderState won't apply until the next frame session.updateRenderState({ depthNear: camera.near, depthFar: camera.far }); this._currentDepthNear = camera.near; this._currentDepthFar = camera.far; } const pose = frame.getViewerPose(referenceSpace); if (pose !== null) { const views = pose.views; const baseLayer = session.renderState.baseLayer; // set cameras for (let i = 0; i < views.length; i++) { const view = views[i]; const viewport = baseLayer.getViewport(view); const _camera = i === 0 ? cameraL : cameraR; _camera.matrix.fromArray(view.transform.matrix); _camera.matrix.decompose(_camera.position, _camera.quaternion, _camera.scale); _camera.position.add(camera.position); _camera.updateMatrix(); _camera.projectionMatrix.fromArray(view.projectionMatrix); _camera.projectionMatrixInverse.copy(_camera.projectionMatrix).invert(); const x = viewport.x / width; const y = viewport.y / height; const _width = viewport.width / width; const _height = viewport.height / height; _camera.rect.set(x, y, x + _width, y + _height); } } } getContext() { return this._session; } getFramebuffer() { return this._session.renderState.baseLayer.framebuffer; } } export { WebXRControl }; ================================================ FILE: examples/jsm/textures/GradientTextureGenerator.js ================================================ import { Texture2D, TEXTURE_FILTER } from 't3d'; class GradientTextureGenerator { constructor(width = 256) { const texture = new Texture2D(); texture.image = { data: null, width: width, height: 1 }; texture.magFilter = texture.minFilter = TEXTURE_FILTER.LINEAR; texture.generateMipmaps = false; this._texture = texture; } gradient(colorGradient) { const texture = this._texture; texture.image.data = colorGradient.getUint8Array(texture.image.width); texture.version++; return this; } getTexture() { return this._texture; } } export { GradientTextureGenerator }; ================================================ FILE: examples/jsm/textures/HeatmapGenerator.js ================================================ import { Scene, Geometry, Mesh, Camera, DRAW_MODE, BLEND_TYPE, ShaderMaterial, OffscreenRenderTarget, Attribute, Buffer, ShaderPostPass, ATTACHMENT } from 't3d'; /** * This class is used to generate heatmap textures. */ class HeatmapGenerator { /** * Create a heatmap generator. * @param {number} [width=1024] The initial width of the heatmap textures. * @param {number} [height=1024] The initial height of the heatmap textures. */ constructor(width = 1024, height = 1024) { // Gray pass this._grayRenderTarget = OffscreenRenderTarget.create2D(width, height); this._grayRenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this._grayRenderTarget .setColorClearValue(0, 0, 0, 1) .setClear(true, false, false); const scene = new Scene(); const pointsGeometry = new Geometry(); pointsGeometry.computeBoundingBox = function() {}; // hack for bounding box pointsGeometry.computeBoundingSphere = function() {}; // hack for bounding sphere const pointsMaterial = new ShaderMaterial(heatmapPointsShader); pointsMaterial.transparent = true; pointsMaterial.blending = BLEND_TYPE.ADD; pointsMaterial.drawMode = DRAW_MODE.POINTS; pointsMaterial.depthTest = false; pointsMaterial.depthWrite = false; const points = new Mesh(pointsGeometry, pointsMaterial); points.raycast = function raycast() { return null }; // hack for raycast points.frustumCulled = false; scene.add(points); const camera = new Camera(); camera.frustumCulled = false; scene.add(camera); scene.updateMatrix(); this._renderStates = scene.updateRenderStates(camera); const renderQueue = scene.updateRenderQueue(camera, false, false); this._renderQueueLayer = renderQueue.layerList[0]; this._points = points; // Colorize pass this._colorizeRenderTarget = OffscreenRenderTarget.create2D(width, height); this._colorizeRenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this._colorizeRenderTarget .setColorClearValue(0, 0, 0, 0) .setClear(true, false, false); this._colorizePass = new ShaderPostPass(heatmapColorizeShader); this._colorizePass.material.depthTest = false; this._colorizePass.material.depthWrite = false; this._colorizePass.material.uniforms.tDiffuse = this._grayRenderTarget.texture; } /** * Resize heatmap textures. * The heatmap texture size only affects the image resolution, and generally does not affect the drawing results. * Note: resize will clear the content in the texture, so you need to re-execute rendering after resize. * @param {number} width * @param {number} height * @returns {HeatmapGenerator} this */ resize(width, height) { this._grayRenderTarget.resize(width, height); this._colorizeRenderTarget.resize(width, height); return this; } /** * To render a grayscale heatmap. * This method needs to be executed before executing colorize to generate the final heatmap. * @param {ThinRenderer} renderer * @param {Array} data [[x0, y0, value0], [x1, y1, value1], ...] * @param {object} options * @param {Array} options.size Dimensions in the data coordinate system with the origin at the center. * @param {number} options.radius The diffusion radius of the data point, the unit is 1 in the data coordinate system. * @param {string} options.interpolation (Optional) The interpolation method of the spread of data points, 'gaussian'(default) | 'linear' | 'cos'. * @param {number} options.gaussianSigma (Optional) Only effective in Gaussian interpolation mode. default is 0.158. * @param {Array} options.range (Optional) The range of data values, default is [0, 1]. * @returns {HeatmapGenerator} this */ render(renderer, data, options = {}) { const size = options.size; const radius = options.radius || 1; const interpolation = options.interpolation || 'gaussian'; const gaussianSigma = options.gaussianSigma !== undefined ? options.gaussianSigma : 0.158; const rangeMin = options.range !== undefined ? options.range[0] : 0; const rangeMax = options.range !== undefined ? options.range[1] : 1; const rangeDist = rangeMax - rangeMin; const pixelWidth = this._grayRenderTarget.width; const pixelHeight = this._grayRenderTarget.height; const pointSizeX = radius / size[0] * pixelWidth * 2; const pointSizeY = radius / size[1] * pixelHeight * 2; const pointSize = Math.max(pointSizeX, pointSizeY); // When the width and height of the size are different, // in order to ensure that the spread is circular, // the following variables need to be introduced: const xAxisFactor = Math.min(pointSizeX / pointSizeY, 1.0); const yAxisFactor = Math.min(pointSizeY / pointSizeX, 1.0); // Update points geometry const pointsGeometry = this._points.geometry; const dataLength = data.length; let attribute = pointsGeometry.getAttribute('a_Position'); let typedArray; if (attribute && attribute.buffer.count === dataLength) { typedArray = attribute.buffer.array; attribute.buffer.version++; } else { pointsGeometry.dispose(); typedArray = new Float32Array(dataLength * 3); attribute = new Attribute(new Buffer(typedArray, 3)); pointsGeometry.addAttribute('a_Position', attribute); pointsGeometry.version++; } for (let i = 0; i < dataLength; i++) { typedArray[i * 3 + 0] = data[i][0] / size[0] * 2; typedArray[i * 3 + 1] = data[i][1] / size[1] * 2; typedArray[i * 3 + 2] = (data[i][2] - rangeMin) / rangeDist; } // Update points material const pointsMaterial = this._points.material; pointsMaterial.uniforms.pointSize = pointSize; pointsMaterial.uniforms.axisFactors[0] = xAxisFactor; pointsMaterial.uniforms.axisFactors[1] = yAxisFactor; pointsMaterial.uniforms.gaussianSigma = gaussianSigma; const defines = pointsMaterial.defines; for (const key in defines) { defines[key] = (key === interpolationMap[interpolation]); pointsMaterial.needsUpdate = true; } // Render gray texture // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.getClearColor().toArray(_tempClearColor); renderer.beginRender(this._grayRenderTarget); renderer.renderRenderableList(this._renderQueueLayer.transparent, this._renderStates); renderer.endRender(); renderer.generateMipmaps(this._grayRenderTarget.texture); // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.setClearColor(..._tempClearColor); return this; } /** * Colorize the grayscale texture according to the color gradient ribbon map. * @param {ThinRenderer} renderer * @param {Texture2D} gradientTexture * @param {object} options (Optional) * @param {boolean} options.alpha (Optional) Whether to generate images with alpha gradients, default is false. * @returns {HeatmapGenerator} this */ colorize(renderer, gradientTexture, options = {}) { // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.getClearColor().toArray(_tempClearColor); this._colorizePass.material.uniforms.colormap = gradientTexture; this._colorizePass.material.uniforms.alphaLerp = options.alpha ? 1 : 0; this._colorizePass.render(renderer, this._colorizeRenderTarget); renderer.generateMipmaps(this._colorizeRenderTarget.texture); // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.setClearColor(..._tempClearColor); return this; } /** * Get heatmap gray texture. * @returns {Texture2D} */ getGrayTexture() { return this._grayRenderTarget.texture; } /** * Get the colored heatmap texture. * @returns {Texture2D} */ getTexture() { return this._colorizeRenderTarget.texture; } /** * Release the heatmap generator, including the textures it holds. */ dispose() { this._grayRenderTarget.dispose(); this._colorizeRenderTarget.dispose(); this._colorizePass.dispose(); this._points.geometry.dispose(); this._points.material.dispose(); } } const _tempClearColor = [0, 0, 0, 1]; const interpolationMap = { 'gaussian': 'INTERPOLATION_GAUSSIAN', 'linear': 'INTERPOLATION_LINEAR', 'cos': 'INTERPOLATION_COS' }; const heatmapPointsShader = { name: 'heatmap_points', defines: { INTERPOLATION_GAUSSIAN: true, INTERPOLATION_LINEAR: false, INTERPOLATION_COS: false }, uniforms: { pointSize: 1, axisFactors: [1, 1], gaussianSigma: 0.158 }, vertexShader: ` attribute vec3 a_Position; uniform float pointSize; varying float v_Strength; void main() { v_Strength = clamp(a_Position.z, 0.0, 1.0); gl_Position = vec4(a_Position.xy, 0.5, 1.0); gl_PointSize = pointSize; } `, fragmentShader: ` uniform vec2 axisFactors; uniform float gaussianSigma; varying float v_Strength; void main() { float gray = v_Strength; float dx = gl_PointCoord.x - 0.5; float dy = gl_PointCoord.y - 0.5; dx /= axisFactors.x; dy /= axisFactors.y; #if defined(INTERPOLATION_GAUSSIAN) float sigma = gaussianSigma; float sigmaSquare = sigma * sigma; float gaussianKernel = exp(- (dx * dx + dy * dy) / (2. * sigmaSquare)); gray *= gaussianKernel; #elif defined(INTERPOLATION_LINEAR) float rate = clamp(1.0 - 2.0 * sqrt(dx * dx + dy * dy), 0.0, 1.0); gray *= rate; #elif defined(INTERPOLATION_COS) float rate = clamp(1.0 - 2.0 * sqrt(dx * dx + dy * dy), 0.0, 1.0); gray *= 1. - cos(rate * 3.141592653 / 2.); #endif gl_FragColor = vec4(gray, gray, gray, 1.0); } ` }; const heatmapColorizeShader = { name: 'heatmap_colorize', uniforms: { alphaLerp: 0, tDiffuse: null, colormap: null }, vertexShader: ` #include attribute vec2 a_Uv; varying vec2 vUv; void main() { vUv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform float alphaLerp; uniform sampler2D tDiffuse; uniform sampler2D colormap; varying vec2 vUv; void main() { float value = texture2D(tDiffuse, vUv).r; vec3 color = texture2D(colormap, vec2(value, 0.5)).rgb; float alpha = max(1.0 - alphaLerp, min(value * 2.0, 1.0)); gl_FragColor = vec4(color, alpha); } ` }; export { HeatmapGenerator }; ================================================ FILE: examples/jsm/textures/IDWMapGenerator.js ================================================ import { OffscreenRenderTarget, ShaderPostPass, Texture2D, TEXTURE_FILTER, PIXEL_TYPE, PIXEL_FORMAT, ATTACHMENT, MathUtils } from 't3d'; /** * This class is used to generate idwmap textures. */ class IDWMapGenerator { /** * Create a idwmap generator. * @param {number} [width=1024] The initial width of the idwmap textures. * @param {number} [height=1024] The initial height of the idwmap textures. */ constructor(width = 1024, height = 1024) { // Gray pass this._grayRenderTarget = OffscreenRenderTarget.create2D(width, height); this._grayRenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this._grayRenderTarget .setColorClearValue(0, 0, 0, 1) .setClear(true, false, false); const pointTexture = new Texture2D(); pointTexture.type = PIXEL_TYPE.FLOAT; pointTexture.magFilter = TEXTURE_FILTER.NEAREST; pointTexture.minFilter = TEXTURE_FILTER.NEAREST; pointTexture.generateMipmaps = false; pointTexture.format = PIXEL_FORMAT.RGBA; pointTexture.flipY = false; this._grayPass = new ShaderPostPass(idwmapPointsShader); this._grayPass.material.depthTest = false; this._grayPass.material.depthWrite = false; this._grayPass.material.uniforms.pointTexture = pointTexture; this._pointTexture = pointTexture; this._dataLength = 0; this._pointTextureSize = 0; // Colorize pass this._colorizeRenderTarget = OffscreenRenderTarget.create2D(width, height); this._colorizeRenderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this._colorizeRenderTarget .setColorClearValue(0, 0, 0, 0) .setClear(true, false, false); this._colorizePass = new ShaderPostPass(idwmapColorizeShader); this._colorizePass.material.depthTest = false; this._colorizePass.material.depthWrite = false; this._colorizePass.material.uniforms.tDiffuse = this._grayRenderTarget.texture; // this._capabilitiesChecked = false; } _checkCapabilities(capabilities) { if (this._capabilitiesChecked) return; const isWebGL2 = capabilities.version > 1; let type; if (isWebGL2) { if (capabilities.getExtension('EXT_color_buffer_float') && capabilities.getExtension('OES_texture_float_linear')) { type = PIXEL_TYPE.FLOAT; } else { type = PIXEL_TYPE.HALF_FLOAT; } } else { if (capabilities.getExtension('OES_texture_float') && capabilities.getExtension('OES_texture_float_linear')) { type = PIXEL_TYPE.FLOAT; } else if (capabilities.getExtension('OES_texture_half_float') && capabilities.getExtension('OES_texture_half_float_linear')) { type = PIXEL_TYPE.HALF_FLOAT; } else { type = PIXEL_TYPE.UNSIGNED_BYTE; } } this._grayRenderTarget.texture.type = type; if (!isWebGL2 && !capabilities.getExtension('OES_texture_float')) { this._pointTexture.type = PIXEL_TYPE.HALF_FLOAT; } this._capabilitiesChecked = true; } /** * Resize idwmap textures. * The idwmap texture size only affects the image resolution, and generally does not affect the drawing results. * Note: resize will clear the content in the texture, so you need to re-execute rendering after resize. * @param {number} width * @param {number} height * @returns {IDWMapGenerator} this */ resize(width, height) { this._grayRenderTarget.resize(width, height); this._colorizeRenderTarget.resize(width, height); return this; } /** * To render a grayscale idwmap. * This method needs to be executed before executing colorize to generate the final idwmap. * @param {ThinRenderer} renderer * @param {Array} data [[x0, y0, value0], [x1, y1, value1], ...] * @param {object} options * @param {Array} options.size Dimensions in the data coordinate system with the origin at the center. * @param {string} options.exponent (Optional) The exponent for idwmap, default is 2. * @param {Array} options.range (Optional) The range of data values, default is [0, 1]. * @returns {IDWMapGenerator} this */ render(renderer, data, options = {}) { this._checkCapabilities(renderer.capabilities); const size = options.size; const exponent = options.exponent || 2; const rangeMin = options.range !== undefined ? options.range[0] : 0; const rangeMax = options.range !== undefined ? options.range[1] : 1; const rangeDist = rangeMax - rangeMin; const dataLength = data.length; let textureSize = this._pointTextureSize; if (this._dataLength !== dataLength) { this._dataLength = dataLength; textureSize = Math.sqrt(dataLength); textureSize = MathUtils.nextPowerOfTwo(Math.ceil(textureSize)); textureSize = Math.max(4, textureSize); this._pointTextureSize = textureSize; } let pointMatrices; if (this._pointTexture.type === PIXEL_TYPE.FLOAT) { pointMatrices = new Float32Array(textureSize * textureSize * 4); for (let i = 0; i < dataLength; i++) { pointMatrices[4 * i] = data[i][0] / size[0]; pointMatrices[4 * i + 1] = data[i][1] / size[1]; pointMatrices[4 * i + 2] = (data[i][2] - rangeMin) / rangeDist; pointMatrices[4 * i + 3] = 1; } } else { pointMatrices = new Uint16Array(textureSize * textureSize * 4); for (let i = 0; i < dataLength; i++) { pointMatrices[4 * i] = toHalf(data[i][0] / size[0]); pointMatrices[4 * i + 1] = toHalf(data[i][1] / size[1]); pointMatrices[4 * i + 2] = toHalf((data[i][2] - rangeMin) / rangeDist); pointMatrices[4 * i + 3] = toHalf(1); } } this._pointTexture.image = { data: pointMatrices, width: textureSize, height: textureSize }; this._pointTexture.version++; // Render gray texture // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.getClearColor().toArray(_tempClearColor); if (this._grayPass.material.defines.POINTS_NUM !== dataLength) { this._grayPass.material.defines.POINTS_NUM = dataLength; this._grayPass.material.needsUpdate = true; } this._grayPass.material.uniforms.pointTexture = this._pointTexture; this._grayPass.material.uniforms.idw_exponent = exponent; this._grayPass.material.uniforms.pointTextureSize = textureSize; this._grayPass.render(renderer, this._grayRenderTarget); renderer.generateMipmaps(this._grayRenderTarget.texture); // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.setClearColor(..._tempClearColor); return this; } /** * Colorize the grayscale texture according to the color gradient ribbon map. * @param {ThinRenderer} renderer * @param {Texture2D} gradientTexture * @param {object} options (Optional) * @param {boolean} options.isoline (Optional) Whether to show isoline, default is false. * @returns {IDWMapGenerator} this */ colorize(renderer, gradientTexture, options = {}) { // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.getClearColor().toArray(_tempClearColor); if (this._colorizePass.material.defines.ISOLINE !== !!options.isoline) { this._colorizePass.material.defines.ISOLINE = !!options.isoline; this._colorizePass.material.needsUpdate = true; } this._colorizePass.material.uniforms.colormap = gradientTexture; this._colorizePass.render(renderer, this._colorizeRenderTarget); renderer.generateMipmaps(this._colorizeRenderTarget.texture); // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.setClearColor(..._tempClearColor); return this; } /** * Get idwmap gray texture. * @returns {Texture2D} */ getGrayTexture() { return this._grayRenderTarget.texture; } /** * Get the colored idwmap texture. * @returns {Texture2D} */ getTexture() { return this._colorizeRenderTarget.texture; } /** * Release the idwmap generator, including the textures it holds. */ dispose() { this._grayRenderTarget.dispose(); this._colorizeRenderTarget.dispose(); this._grayPass.dispose(); this._colorizePass.dispose(); this._pointTexture.dispose(); } } const _tempClearColor = [0, 0, 0, 1]; const idwmapPointsShader = { name: 'idwmap_points', defines: { POINTS_NUM: 0 }, uniforms: { idw_exponent: 2, pointTexture: null, pointTextureSize: 1 }, vertexShader: ` #include attribute vec2 a_Uv; varying vec2 v_Uv; void main() { v_Uv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` #include uniform float idw_exponent; uniform sampler2D pointTexture; uniform float pointTextureSize; varying vec2 v_Uv; struct Accumulator { float m_sumOfWeightedValues; float m_sumOfWeights; }; float GetWeightedAverage(Accumulator acc) { return acc.m_sumOfWeightedValues / acc.m_sumOfWeights; } void main() { float exactThreshold = 0.01; // if we are very close to a point then avoid a divide by zero and set to exact weight of the point Accumulator acc = Accumulator(0.0, 0.0); vec2 fragCoord = v_Uv; fragCoord.x -= 0.5; fragCoord.y -= 0.5; float interpolatedValue = 0.; for (int i = 0; i < POINTS_NUM; ++i) { float i_float = float(i); float j = i_float * 1.0; float x = mod(j, pointTextureSize); float y = floor(j / pointTextureSize); float dx = 1.0 / pointTextureSize; float dy = 1.0 / pointTextureSize; vec4 pointSampler = texture2D(pointTexture, vec2(dx * (x + 0.5), dy * (y + 0.5))); float dist = max(exactThreshold, length(fragCoord.xy - pointSampler.xy)); float weight = 1.0 / pow(dist, idw_exponent); acc.m_sumOfWeights += weight; acc.m_sumOfWeightedValues += weight * pointSampler.z; } interpolatedValue = GetWeightedAverage(acc); interpolatedValue = clamp(interpolatedValue, 0.0, 1.0); gl_FragColor = vec4(interpolatedValue, interpolatedValue, interpolatedValue, 1.0); } ` }; const idwmapColorizeShader = { name: 'idwmap_colorize', defines: { ISOLINE: false }, uniforms: { tDiffuse: null, colormap: null }, vertexShader: ` #include attribute vec2 a_Uv; varying vec2 vUv; void main() { vUv = a_Uv; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); } `, fragmentShader: ` uniform sampler2D tDiffuse; uniform sampler2D colormap; varying vec2 vUv; #ifdef ISOLINE float isoline(float val, float lg, float ref, float pas, float thickness) { float v = abs(mod(val - ref + pas * .5, pas) - pas * .5) / lg - .1 * thickness; return smoothstep(.2, .8, v); } #endif void main() { float value = texture2D(tDiffuse, vUv).r; vec3 color = texture2D(colormap, vec2(value, 0.5)).rgb; #ifdef ISOLINE float lg = 2. * length(vec2(dFdx(value), dFdy(value))); float k1 = isoline(value, lg, .0, .2, 1.); float k2 = isoline(value, lg, .0, .05, .1); if (lg > 0.0001) { color *= step(0.0001, lg) * (.3 + (k1 * .7)); color *= step(0.0001, lg) * (.7 + (k2 * .3)); } #endif gl_FragColor = vec4(color, 1.0); } ` }; const floatView = new Float32Array(1); const int32View = new Int32Array(floatView.buffer); // stackoverflow.com/questions/32633585/how-do-you-convert-to-half-floats-in-javascript function toHalf(fval) { floatView[0] = fval; const fbits = int32View[0]; const sign = (fbits >> 16) & 0x8000; // sign only let val = (fbits & 0x7fffffff) + 0x1000; // rounded value if (val >= 0x47800000) { // might be or become NaN/Inf if ((fbits & 0x7fffffff) >= 0x47800000) { // is or must become NaN/Inf if (val < 0x7f800000) { // was value but too large return sign | 0x7c00; // make it +/-Inf } return sign | 0x7c00 | // remains +/-Inf or NaN (fbits & 0x007fffff) >> 13; // keep NaN (and Inf) bits } return sign | 0x7bff; // unrounded not quite Inf } if (val >= 0x38800000) { // remains normalized value return sign | val - 0x38000000 >> 13; // exp - 127 + 15 } if (val < 0x33000000) { // too small for subnormal return sign; // becomes +/-0 } val = (fbits & 0x7fffffff) >> 23; // tmp exp for subnormal calc return sign | ((fbits & 0x7fffff | 0x800000) // add subnormal bit + (0x800000 >>> val - 102) // round depending on cut off >> 126 - val); // div by 2^(1-(exp-127+15)) and >> 13 | exp=0 } export { IDWMapGenerator }; ================================================ FILE: examples/jsm/textures/PMREMGenerator.js ================================================ import { BoxGeometry, DRAW_SIDE, Mesh, OffscreenRenderTarget, Scene, ShaderMaterial, Texture2D, TextureCube, Euler, Quaternion, PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_FILTER, ATTACHMENT } from 't3d'; import { ReflectionProbe } from '../probes/ReflectionProbe.js'; /** * This class generates a Prefiltered, Mipmapped Radiance Environment Map. * Reference to: * http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html * https://github.com/pissang/claygl/blob/master/src/util/cubemap.js * https://github.com/mrdoob/three.js/blob/dev/src/extras/PMREMGenerator.js * https://threejs.org/examples/?q=mipmap#webgl_materials_cubemap_render_to_mipmaps */ class PMREMGenerator { /** * Constructs a new PMREMGenerator. * @param {number} [sampleSize=512] - The sample size for the normal distribution. */ constructor(sampleSize = 512) { /** * Add rotation to the environment map. * @type {Euler} */ this.rotation = new Euler(); /** * Whether to use the legacy(webgl1) method to generate PMREM. * @type {boolean} * @default false */ this.legacy = true; // init const geometry = new BoxGeometry(1, 1, 1); const material = new ShaderMaterial(prefilterShader); material.side = DRAW_SIDE.BACK; material.uniforms.normalDistribution = this._generateNormalDistribution(256, sampleSize); material.defines.SAMPLE_NUMBER = sampleSize; const envMesh = new Mesh(geometry, material); envMesh.frustumCulled = false; const dummyScene = new Scene(); dummyScene.add(envMesh); const quaternion = new Quaternion(); this.rotation.onChange(() => { // auto sync rotation to dummyScene quaternion.setFromEuler(this.rotation); quaternion.toMatrix4(dummyScene.anchorMatrix); }); this._envMesh = envMesh; this._dummyScene = dummyScene; } /** * Generate a PMREM from a cubeMap or equirectangular environment texture. * @param {ThinRenderer} renderer - The renderer. * @param {TextureCube|Texture2D} source - The environment map. * @param {TextureCube} [target] - The output texture. If not provided, a new cube texture will be created. * @returns {TextureCube} */ prefilter(renderer, source, target = new TextureCube()) { // Check capabilities const capabilities = renderer.capabilities; const isWebGL2 = capabilities.version > 1; if (isWebGL2) { capabilities.getExtension('EXT_color_buffer_float'); } else { capabilities.getExtension('OES_texture_half_float'); capabilities.getExtension('OES_texture_half_float_linear'); } capabilities.getExtension('OES_texture_float_linear'); capabilities.getExtension('EXT_color_buffer_half_float'); const legacy = this.legacy || !isWebGL2; // Calculate mipmaps number and cube size let cubeSize; if (source.isTextureCube) { cubeSize = source.images.length === 0 ? 16 : source.images[0].width; } else { cubeSize = source.image.width / 4; } const mipmapNum = Math.floor(Math.log2(cubeSize)); cubeSize = Math.pow(2, mipmapNum); // Prepare the target texture target.type = PIXEL_TYPE.HALF_FLOAT; target.format = PIXEL_FORMAT.RGBA; target.generateMipmaps = false; let mipmapSize = cubeSize; for (let i = 0; i < mipmapNum + 1; i++) { target.mipmaps[i] = []; for (let j = 0; j < 6; j++) { target.mipmaps[i].push({ width: mipmapSize, height: mipmapSize, data: null }); } mipmapSize = mipmapSize / 2; } // Prepare render target const renderTarget = OffscreenRenderTarget.createCube(cubeSize, cubeSize); renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); if (legacy) { renderTarget.texture.type = PIXEL_TYPE.HALF_FLOAT; renderTarget.texture.format = PIXEL_FORMAT.RGBA; renderTarget.texture.generateMipmaps = false; } else { renderTarget.attach(target, ATTACHMENT.COLOR_ATTACHMENT0); } // Prepare render stuff const reflectionProbe = new ReflectionProbe(renderTarget); this._dummyScene.add(reflectionProbe.camera); let envMapFlip = 1; if (source.isTextureCube && source.images[0] && source.images[0].rtt) { envMapFlip = -1; } if (!legacy) { envMapFlip *= -1; } this._envMesh.material.cubeMap = source; this._envMesh.material.uniforms.environmentMap = source; this._envMesh.material.uniforms.envMapFlip = envMapFlip; if (this._envMesh.material.defines.PANORAMA !== !source.isTextureCube) { this._envMesh.material.defines.PANORAMA = !source.isTextureCube; this._envMesh.material.needsUpdate = true; } // Render mipmaps this._dummyScene.updateRenderStates(reflectionProbe.camera); for (let i = 0; i < mipmapNum + 1; i++) { this._envMesh.material.uniforms.roughness = Math.max(i - 1, 0) / mipmapNum; if (legacy) { reflectionProbe.render(renderer, this._dummyScene); for (let j = 0; j < 6; j++) { const mipmapData = target.mipmaps[i][j]; mipmapData.data = new Uint16Array(mipmapData.width * mipmapData.height * 4); renderer.readTexturePixelsSync( renderTarget.texture, 0, 0, mipmapData.width, mipmapData.height, mipmapData.data, j ); if (i === 0) { target.images[j] = mipmapData; } } renderTarget.resize(renderTarget.width / 2, renderTarget.height / 2); } else { renderTarget.activeMipmapLevel = i; reflectionProbe.render(renderer, this._dummyScene); reflectionProbe.camera.rect.z /= 2; reflectionProbe.camera.rect.w /= 2; } } legacy && target.version++; // Clear render stuff !legacy && renderTarget.detach(ATTACHMENT.COLOR_ATTACHMENT0); renderTarget.dispose(); this._dummyScene.remove(reflectionProbe.camera); // Return the target texture return target; } /** * Dispose of the PMREMGenerator. */ dispose() { this._envMesh.material.uniforms.normalDistribution.dispose(); this._envMesh.geometry.dispose(); this._envMesh.material.dispose(); } _generateNormalDistribution(roughnessLevels = 256, sampleSize = 1024) { const pixels = new Float32Array(sampleSize * roughnessLevels * 4); const tmp = []; for (let j = 0; j < roughnessLevels; j++) { const roughness = j / roughnessLevels; const a = roughness * roughness; for (let i = 0; i < sampleSize; i++) { // http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators // http://stackoverflow.com/questions/1908492/unsigned-integer-in-javascript // http://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-it let y = (i << 16 | i >>> 16) >>> 0; y = ((y & 1431655765) << 1 | (y & 2863311530) >>> 1) >>> 0; y = ((y & 858993459) << 2 | (y & 3435973836) >>> 2) >>> 0; y = ((y & 252645135) << 4 | (y & 4042322160) >>> 4) >>> 0; y = (((y & 16711935) << 8 | (y & 4278255360) >>> 8) >>> 0) / 4294967296; // CDF const cosTheta = Math.sqrt((1 - y) / (1 + (a * a - 1.0) * y)); tmp[i] = cosTheta; } for (let i = 0; i < sampleSize; i++) { const offset = (i * roughnessLevels + j) * 4; const cosTheta = tmp[i]; const sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta); const x = i / sampleSize; const phi = 2.0 * Math.PI * x; pixels[offset] = sinTheta * Math.cos(phi); pixels[offset + 1] = cosTheta; pixels[offset + 2] = sinTheta * Math.sin(phi); pixels[offset + 3] = 1.0; } } const normalDistribution = new Texture2D(); normalDistribution.image = { width: roughnessLevels, height: sampleSize, data: pixels }; normalDistribution.type = PIXEL_TYPE.FLOAT; normalDistribution.minFilter = TEXTURE_FILTER.NEAREST; normalDistribution.magFilter = TEXTURE_FILTER.NEAREST; normalDistribution.generateMipmaps = false; normalDistribution.version++; return normalDistribution; } } const prefilterShader = { name: 'pmrem', defines: { PANORAMA: false, SAMPLE_NUMBER: 1024 }, uniforms: { environmentMap: null, normalDistribution: null, roughness: 0.5, envMapFlip: 1 }, vertexShader: ` #include varying vec3 vDir; void main() { vDir = (u_Model * vec4(a_Position, 0.0)).xyz; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); gl_Position.z = gl_Position.w; // set z to camera.far } `, fragmentShader: ` #include #ifdef PANORAMA uniform sampler2D environmentMap; #else uniform samplerCube environmentMap; #endif uniform sampler2D normalDistribution; uniform float roughness; uniform float envMapFlip; varying vec3 vDir; vec3 importanceSampleNormal(float i, float roughness, vec3 N) { vec3 H = texture2D(normalDistribution, vec2(roughness, i)).rgb; vec3 upVector = abs(N.y) > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0); vec3 tangentX = normalize(cross(N, upVector)); vec3 tangentZ = cross(N, tangentX); // Tangent to world space return normalize(tangentX * H.x + N * H.y + tangentZ * H.z); } void main() { vec3 V = normalize(vDir); vec3 N = V; vec3 prefilteredColor = vec3(0.0); float totalWeight = 0.0; float fMaxSampleNumber = float(SAMPLE_NUMBER); for (int i = 0; i < SAMPLE_NUMBER; i++) { vec3 H = importanceSampleNormal(float(i) / fMaxSampleNumber, roughness, N); vec3 L = reflect(-V, H); float NoL = clamp(dot(N, L), 0.0, 1.0); if (NoL > 0.0) { #ifdef PANORAMA float phi = acos(L.y); float theta = envMapFlip * atan(L.x, L.z) + PI * 0.5; vec2 uv = vec2(theta / 2.0 / PI, -phi / PI); prefilteredColor += mapTexelToLinear(texture2D(environmentMap, fract(uv))).rgb * NoL; #else prefilteredColor += mapTexelToLinear(textureCube(environmentMap, vec3(envMapFlip * L.x, L.yz))).rgb * NoL; #endif totalWeight += NoL; } } gl_FragColor = vec4(prefilteredColor / totalWeight, 1.0); #include } ` }; export { PMREMGenerator }; ================================================ FILE: examples/jsm/textures/RGBDDecoder.js ================================================ import { ATTACHMENT, BoxGeometry, DRAW_SIDE, Mesh, PIXEL_FORMAT, PIXEL_TYPE, OffscreenRenderTarget, Scene, ShaderMaterial, TextureCube } from 't3d'; import { ReflectionProbe } from '../probes/ReflectionProbe.js'; /** * RGBD decoder decodes RGBD cube texture to linear color space. */ export class RGBDDecoder { /** * Constructs a new RGBD decoder. */ constructor() { const geometry = new BoxGeometry(1, 1, 1); const material = new ShaderMaterial(decodeShader); material.side = DRAW_SIDE.BACK; const envMesh = new Mesh(geometry, material); envMesh.frustumCulled = false; const dummyScene = new Scene(); dummyScene.add(envMesh); this._envMesh = envMesh; this._dummyScene = dummyScene; } /** * Decode the RGBD cube texture (in sRGB color space) to linear color space. * @param {ThinRenderer} renderer - The renderer. * @param {TextureCube} source - The source RGBD cube texture. * @param {TextureCube} target - The target cube texture to store the decoded result. * @returns {TextureCube | null} The target cube texture. This is a render texture, so you can't get the data from the mipmaps attribute directly. */ decode(renderer, source, target = new TextureCube()) { if (!source.isTextureCube) { console.error('RGBDDecoder: The source texture is not a cube texture.'); return null; } // Check capabilities const capabilities = renderer.capabilities; const isWebGL2 = capabilities.version > 1; if (isWebGL2) { capabilities.getExtension('EXT_color_buffer_float'); } else { capabilities.getExtension('OES_texture_half_float'); capabilities.getExtension('OES_texture_half_float_linear'); } capabilities.getExtension('OES_texture_float_linear'); capabilities.getExtension('EXT_color_buffer_half_float'); // Calculate mipmaps number and cube size let cubeSize = source.images.length === 0 ? 16 : source.images[0].width; const mipmapNum = Math.floor(Math.log2(cubeSize)); cubeSize = Math.pow(2, mipmapNum); // Prepare the target texture target.type = PIXEL_TYPE.HALF_FLOAT; target.format = PIXEL_FORMAT.RGBA; target.generateMipmaps = false; let mipmapSize = cubeSize; for (let i = 0; i < mipmapNum + 1; i++) { target.mipmaps[i] = []; for (let j = 0; j < 6; j++) { target.mipmaps[i].push({ width: mipmapSize, height: mipmapSize, data: null }); } mipmapSize = mipmapSize / 2; } // Prepare render target const renderTarget = OffscreenRenderTarget.createCube(cubeSize, cubeSize); renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); renderTarget.attach(target, ATTACHMENT.COLOR_ATTACHMENT0); // Prepare render stuff const reflectionProbe = new ReflectionProbe(renderTarget); this._dummyScene.add(reflectionProbe.camera); let envMapFlip = 1; if (source.images[0] && source.images[0].rtt) { envMapFlip = -1; } envMapFlip *= -1; this._envMesh.material.cubeMap = source; this._envMesh.material.uniforms.environmentMap = source; this._envMesh.material.uniforms.envMapFlip = envMapFlip; // Render mipmaps this._dummyScene.updateRenderStates(reflectionProbe.camera); for (let i = 0; i < mipmapNum + 1; i++) { this._envMesh.material.uniforms.level = i; renderTarget.activeMipmapLevel = i; reflectionProbe.render(renderer, this._dummyScene); reflectionProbe.camera.rect.z /= 2; reflectionProbe.camera.rect.w /= 2; } // Clear render stuff renderTarget.detach(ATTACHMENT.COLOR_ATTACHMENT0); renderTarget.dispose(); this._dummyScene.remove(reflectionProbe.camera); // Return the target texture return target; } } const decodeShader = { name: 'rgbd_decode', defines: {}, uniforms: { environmentMap: null, envMapFlip: -1, level: 0 }, vertexShader: ` #include varying vec3 vDir; void main() { vDir = (u_Model * vec4(a_Position, 0.0)).xyz; gl_Position = u_ProjectionView * u_Model * vec4(a_Position, 1.0); gl_Position.z = gl_Position.w; // set z to camera.far } `, fragmentShader: ` #include uniform samplerCube environmentMap; uniform float level; uniform float envMapFlip; varying vec3 vDir; vec3 RGBDToLinear(vec4 rgbd) { rgbd = sRGBToLinear(rgbd); return rgbd.rgb / rgbd.a; } void main() { vec3 dir = normalize(vDir); vec3 coordVec = vec3(envMapFlip * dir.x, dir.yz); vec3 color; #ifdef TEXTURE_LOD_EXT color = RGBDToLinear(textureCubeLodEXT(environmentMap, coordVec, level)); #else color = RGBDToLinear(textureCube(environmentMap, coordVec, level)); #endif gl_FragColor = vec4(color, 1.0); } ` }; ================================================ FILE: examples/lab_clouds.html ================================================ t3d - clouds
t3d - clouds
================================================ FILE: examples/lab_clouds_shader.html ================================================ t3d - clouds shader
t3d - clouds shader
Original shader by stubbe on ShaderToy
================================================ FILE: examples/lab_earth.html ================================================ t3d - earth
t3d - earth
================================================ FILE: examples/lab_geometry_grass.html ================================================ t3d grass
t3d grass
Inspired by James-Smyth/three-grass-demo
================================================ FILE: examples/lab_geometry_images.html ================================================ t3d - geometry images
t3d - geometry images
reference to hhoppe.com/proj/gim/
================================================ FILE: examples/lab_gltf_grass.html ================================================ t3d grass - gltf
t3d gltf grass
Inspired by robertlong/three-instanced-grass
================================================ FILE: examples/lab_ground.html ================================================ t3d - ground
t3d - ground
================================================ FILE: examples/lab_histogram.html ================================================ t3d - lab histogram
t3d - 3D histogram example
================================================ FILE: examples/lab_ik.html ================================================ t3d - lab ik
t3d - lab ik
This model is based on "Gilberto A Robot Arm"
by GilbertoA licensed under CC-BY-4.0
================================================ FILE: examples/lab_impostor_octahedral.html ================================================ t3d - octahedral impostor
t3d - octahedral impostor
================================================ FILE: examples/lab_impostor_octahedral_instancing.html ================================================ t3d - octahedral impostor instancing
t3d - octahedral impostor instancing (200k)
================================================ FILE: examples/lab_linechart_fill.html ================================================ t3d - linechart fill
t3d - linechart fill
Available only for WebGL 2.0
================================================ FILE: examples/lab_ocean.html ================================================ t3d - ocean
t3d - ocean
================================================ FILE: examples/lab_ocean_fft.html ================================================ t3d - fft ocean
t3d - fft ocean, referrence to "Ocean generator"
"Lighthouse on Island" model by spaceexpert (CC BY 4.0) - modified: water surface removed
================================================ FILE: examples/lab_terrain.html ================================================ t3d - geometry heightMap terrain
t3d - HeightMap Terrain
Click: lock mouse to rotate; SPACE: jump; WASD: move
================================================ FILE: examples/lab_texture_variation.html ================================================ t3d - texture variation
t3d - texture variation
================================================ FILE: examples/lab_water_simulation.html ================================================ t3d - water simulation
water simulation refer to Evan Wallace's webgl-water demo
"Model Pool" modified by ATD-London, CC Attribution
================================================ FILE: examples/libs/ammo.wasm.js ================================================ // This is ammo.js, a port of Bullet Physics to JavaScript. zlib licensed. var Ammo = (function() { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( function(Ammo) { Ammo = Ammo || {}; var b;b||(b=typeof Ammo !== 'undefined' ? Ammo : {});var ba;b.ready=new Promise(function(a){ba=a});var ca={},da;for(da in b)b.hasOwnProperty(da)&&(ca[da]=b[da]);var ea=!1,fa=!1,ha=!1,ia=!1;ea="object"===typeof window;fa="function"===typeof importScripts;ha="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;ia=!ea&&!ha&&!fa;var ja="",ka,la,ma,na; if(ha)ja=fa?require("path").dirname(ja)+"/":__dirname+"/",ka=function(a,c){ma||(ma=require("fs"));na||(na=require("path"));a=na.normalize(a);return ma.readFileSync(a,c?null:"utf8")},la=function(a){a=ka(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a},1>=2;d=za[a++];)Xa.push(105>d?Ca[++c>>1]:Aa[c]),++c;return Xa}var Za={f:function(){oa()},c:function(a,c,d){c=Ya(c,d);return Va[a].apply(null,c)},a:function(a,c,d){c=Ya(c,d);return Va[a].apply(null,c)},d:function(a,c,d){za.copyWithin(a,c,c+d)},e:function(){oa("OOM")},b:function(a){var c=Date.now();Aa[a>>2]=c/1E3|0;Aa[a+4>>2]=c%1E3*1E3|0;return 0},memory:sa,table:ua}; (function(){function a(g){b.asm=g.exports;Ma--;b.monitorRunDependencies&&b.monitorRunDependencies(Ma);0==Ma&&(null!==Na&&(clearInterval(Na),Na=null),Oa&&(g=Oa,Oa=null,g()))}function c(g){a(g.instance)}function d(g){return Ua().then(function(n){return WebAssembly.instantiate(n,e)}).then(g,function(n){qa("failed to asynchronously prepare wasm: "+n);oa(n)})}var e={a:Za};Ma++;b.monitorRunDependencies&&b.monitorRunDependencies(Ma);if(b.instantiateWasm)try{return b.instantiateWasm(e,a)}catch(g){return qa("Module.instantiateWasm callback failed with error: "+ g),!1}(function(){if(ra||"function"!==typeof WebAssembly.instantiateStreaming||Ra()||Pa("file://")||"function"!==typeof fetch)return d(c);fetch(Qa,{credentials:"same-origin"}).then(function(g){return WebAssembly.instantiateStreaming(g,e).then(c,function(n){qa("wasm streaming compile failed: "+n);qa("falling back to ArrayBuffer instantiation");return d(c)})})})();return{}})();var Wa=b.___wasm_call_ctors=function(){return(Wa=b.___wasm_call_ctors=b.asm.g).apply(null,arguments)}; b.___em_js__array_bounds_check_error=function(){return(b.___em_js__array_bounds_check_error=b.asm.h).apply(null,arguments)}; var $a=b._emscripten_bind_btCollisionWorld_getDispatcher_0=function(){return($a=b._emscripten_bind_btCollisionWorld_getDispatcher_0=b.asm.i).apply(null,arguments)},ab=b._emscripten_bind_btCollisionWorld_rayTest_3=function(){return(ab=b._emscripten_bind_btCollisionWorld_rayTest_3=b.asm.j).apply(null,arguments)},bb=b._emscripten_bind_btCollisionWorld_getPairCache_0=function(){return(bb=b._emscripten_bind_btCollisionWorld_getPairCache_0=b.asm.k).apply(null,arguments)},cb=b._emscripten_bind_btCollisionWorld_getDispatchInfo_0= function(){return(cb=b._emscripten_bind_btCollisionWorld_getDispatchInfo_0=b.asm.l).apply(null,arguments)},db=b._emscripten_bind_btCollisionWorld_addCollisionObject_1=function(){return(db=b._emscripten_bind_btCollisionWorld_addCollisionObject_1=b.asm.m).apply(null,arguments)},eb=b._emscripten_bind_btCollisionWorld_addCollisionObject_2=function(){return(eb=b._emscripten_bind_btCollisionWorld_addCollisionObject_2=b.asm.n).apply(null,arguments)},fb=b._emscripten_bind_btCollisionWorld_addCollisionObject_3= function(){return(fb=b._emscripten_bind_btCollisionWorld_addCollisionObject_3=b.asm.o).apply(null,arguments)},gb=b._emscripten_bind_btCollisionWorld_removeCollisionObject_1=function(){return(gb=b._emscripten_bind_btCollisionWorld_removeCollisionObject_1=b.asm.p).apply(null,arguments)},hb=b._emscripten_bind_btCollisionWorld_getBroadphase_0=function(){return(hb=b._emscripten_bind_btCollisionWorld_getBroadphase_0=b.asm.q).apply(null,arguments)},ib=b._emscripten_bind_btCollisionWorld_convexSweepTest_5= function(){return(ib=b._emscripten_bind_btCollisionWorld_convexSweepTest_5=b.asm.r).apply(null,arguments)},jb=b._emscripten_bind_btCollisionWorld_contactPairTest_3=function(){return(jb=b._emscripten_bind_btCollisionWorld_contactPairTest_3=b.asm.s).apply(null,arguments)},kb=b._emscripten_bind_btCollisionWorld_contactTest_2=function(){return(kb=b._emscripten_bind_btCollisionWorld_contactTest_2=b.asm.t).apply(null,arguments)},lb=b._emscripten_bind_btCollisionWorld_updateSingleAabb_1=function(){return(lb= b._emscripten_bind_btCollisionWorld_updateSingleAabb_1=b.asm.u).apply(null,arguments)},mb=b._emscripten_bind_btCollisionWorld_setDebugDrawer_1=function(){return(mb=b._emscripten_bind_btCollisionWorld_setDebugDrawer_1=b.asm.v).apply(null,arguments)},nb=b._emscripten_bind_btCollisionWorld_getDebugDrawer_0=function(){return(nb=b._emscripten_bind_btCollisionWorld_getDebugDrawer_0=b.asm.w).apply(null,arguments)},ob=b._emscripten_bind_btCollisionWorld_debugDrawWorld_0=function(){return(ob=b._emscripten_bind_btCollisionWorld_debugDrawWorld_0= b.asm.x).apply(null,arguments)},pb=b._emscripten_bind_btCollisionWorld_debugDrawObject_3=function(){return(pb=b._emscripten_bind_btCollisionWorld_debugDrawObject_3=b.asm.y).apply(null,arguments)},qb=b._emscripten_bind_btCollisionWorld___destroy___0=function(){return(qb=b._emscripten_bind_btCollisionWorld___destroy___0=b.asm.z).apply(null,arguments)},rb=b._emscripten_bind_btCollisionShape_setLocalScaling_1=function(){return(rb=b._emscripten_bind_btCollisionShape_setLocalScaling_1=b.asm.A).apply(null, arguments)},sb=b._emscripten_bind_btCollisionShape_getLocalScaling_0=function(){return(sb=b._emscripten_bind_btCollisionShape_getLocalScaling_0=b.asm.B).apply(null,arguments)},tb=b._emscripten_bind_btCollisionShape_calculateLocalInertia_2=function(){return(tb=b._emscripten_bind_btCollisionShape_calculateLocalInertia_2=b.asm.C).apply(null,arguments)},ub=b._emscripten_bind_btCollisionShape_setMargin_1=function(){return(ub=b._emscripten_bind_btCollisionShape_setMargin_1=b.asm.D).apply(null,arguments)}, vb=b._emscripten_bind_btCollisionShape_getMargin_0=function(){return(vb=b._emscripten_bind_btCollisionShape_getMargin_0=b.asm.E).apply(null,arguments)},wb=b._emscripten_bind_btCollisionShape___destroy___0=function(){return(wb=b._emscripten_bind_btCollisionShape___destroy___0=b.asm.F).apply(null,arguments)},xb=b._emscripten_bind_btCollisionObject_setAnisotropicFriction_2=function(){return(xb=b._emscripten_bind_btCollisionObject_setAnisotropicFriction_2=b.asm.G).apply(null,arguments)},yb=b._emscripten_bind_btCollisionObject_getCollisionShape_0= function(){return(yb=b._emscripten_bind_btCollisionObject_getCollisionShape_0=b.asm.H).apply(null,arguments)},zb=b._emscripten_bind_btCollisionObject_setContactProcessingThreshold_1=function(){return(zb=b._emscripten_bind_btCollisionObject_setContactProcessingThreshold_1=b.asm.I).apply(null,arguments)},Ab=b._emscripten_bind_btCollisionObject_setActivationState_1=function(){return(Ab=b._emscripten_bind_btCollisionObject_setActivationState_1=b.asm.J).apply(null,arguments)},Bb=b._emscripten_bind_btCollisionObject_forceActivationState_1= function(){return(Bb=b._emscripten_bind_btCollisionObject_forceActivationState_1=b.asm.K).apply(null,arguments)},Cb=b._emscripten_bind_btCollisionObject_activate_0=function(){return(Cb=b._emscripten_bind_btCollisionObject_activate_0=b.asm.L).apply(null,arguments)},Db=b._emscripten_bind_btCollisionObject_activate_1=function(){return(Db=b._emscripten_bind_btCollisionObject_activate_1=b.asm.M).apply(null,arguments)},Eb=b._emscripten_bind_btCollisionObject_isActive_0=function(){return(Eb=b._emscripten_bind_btCollisionObject_isActive_0= b.asm.N).apply(null,arguments)},Fb=b._emscripten_bind_btCollisionObject_isKinematicObject_0=function(){return(Fb=b._emscripten_bind_btCollisionObject_isKinematicObject_0=b.asm.O).apply(null,arguments)},Gb=b._emscripten_bind_btCollisionObject_isStaticObject_0=function(){return(Gb=b._emscripten_bind_btCollisionObject_isStaticObject_0=b.asm.P).apply(null,arguments)},Hb=b._emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0=function(){return(Hb=b._emscripten_bind_btCollisionObject_isStaticOrKinematicObject_0= b.asm.Q).apply(null,arguments)},Ib=b._emscripten_bind_btCollisionObject_getRestitution_0=function(){return(Ib=b._emscripten_bind_btCollisionObject_getRestitution_0=b.asm.R).apply(null,arguments)},Jb=b._emscripten_bind_btCollisionObject_getFriction_0=function(){return(Jb=b._emscripten_bind_btCollisionObject_getFriction_0=b.asm.S).apply(null,arguments)},Kb=b._emscripten_bind_btCollisionObject_getRollingFriction_0=function(){return(Kb=b._emscripten_bind_btCollisionObject_getRollingFriction_0=b.asm.T).apply(null, arguments)},Lb=b._emscripten_bind_btCollisionObject_setRestitution_1=function(){return(Lb=b._emscripten_bind_btCollisionObject_setRestitution_1=b.asm.U).apply(null,arguments)},Mb=b._emscripten_bind_btCollisionObject_setFriction_1=function(){return(Mb=b._emscripten_bind_btCollisionObject_setFriction_1=b.asm.V).apply(null,arguments)},Nb=b._emscripten_bind_btCollisionObject_setRollingFriction_1=function(){return(Nb=b._emscripten_bind_btCollisionObject_setRollingFriction_1=b.asm.W).apply(null,arguments)}, Ob=b._emscripten_bind_btCollisionObject_getWorldTransform_0=function(){return(Ob=b._emscripten_bind_btCollisionObject_getWorldTransform_0=b.asm.X).apply(null,arguments)},Pb=b._emscripten_bind_btCollisionObject_getCollisionFlags_0=function(){return(Pb=b._emscripten_bind_btCollisionObject_getCollisionFlags_0=b.asm.Y).apply(null,arguments)},Qb=b._emscripten_bind_btCollisionObject_setCollisionFlags_1=function(){return(Qb=b._emscripten_bind_btCollisionObject_setCollisionFlags_1=b.asm.Z).apply(null,arguments)}, Sb=b._emscripten_bind_btCollisionObject_setWorldTransform_1=function(){return(Sb=b._emscripten_bind_btCollisionObject_setWorldTransform_1=b.asm._).apply(null,arguments)},Tb=b._emscripten_bind_btCollisionObject_setCollisionShape_1=function(){return(Tb=b._emscripten_bind_btCollisionObject_setCollisionShape_1=b.asm.$).apply(null,arguments)},Ub=b._emscripten_bind_btCollisionObject_setCcdMotionThreshold_1=function(){return(Ub=b._emscripten_bind_btCollisionObject_setCcdMotionThreshold_1=b.asm.aa).apply(null, arguments)},Vb=b._emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1=function(){return(Vb=b._emscripten_bind_btCollisionObject_setCcdSweptSphereRadius_1=b.asm.ba).apply(null,arguments)},Wb=b._emscripten_bind_btCollisionObject_getUserIndex_0=function(){return(Wb=b._emscripten_bind_btCollisionObject_getUserIndex_0=b.asm.ca).apply(null,arguments)},Xb=b._emscripten_bind_btCollisionObject_setUserIndex_1=function(){return(Xb=b._emscripten_bind_btCollisionObject_setUserIndex_1=b.asm.da).apply(null, arguments)},Yb=b._emscripten_bind_btCollisionObject_getUserPointer_0=function(){return(Yb=b._emscripten_bind_btCollisionObject_getUserPointer_0=b.asm.ea).apply(null,arguments)},Zb=b._emscripten_bind_btCollisionObject_setUserPointer_1=function(){return(Zb=b._emscripten_bind_btCollisionObject_setUserPointer_1=b.asm.fa).apply(null,arguments)},$b=b._emscripten_bind_btCollisionObject_getBroadphaseHandle_0=function(){return($b=b._emscripten_bind_btCollisionObject_getBroadphaseHandle_0=b.asm.ga).apply(null, arguments)},ac=b._emscripten_bind_btCollisionObject___destroy___0=function(){return(ac=b._emscripten_bind_btCollisionObject___destroy___0=b.asm.ha).apply(null,arguments)},bc=b._emscripten_bind_btDynamicsWorld_addAction_1=function(){return(bc=b._emscripten_bind_btDynamicsWorld_addAction_1=b.asm.ia).apply(null,arguments)},cc=b._emscripten_bind_btDynamicsWorld_removeAction_1=function(){return(cc=b._emscripten_bind_btDynamicsWorld_removeAction_1=b.asm.ja).apply(null,arguments)},dc=b._emscripten_bind_btDynamicsWorld_getSolverInfo_0= function(){return(dc=b._emscripten_bind_btDynamicsWorld_getSolverInfo_0=b.asm.ka).apply(null,arguments)},ec=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_1=function(){return(ec=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_1=b.asm.la).apply(null,arguments)},fc=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_2=function(){return(fc=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_2=b.asm.ma).apply(null,arguments)},hc=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_3= function(){return(hc=b._emscripten_bind_btDynamicsWorld_setInternalTickCallback_3=b.asm.na).apply(null,arguments)},ic=b._emscripten_bind_btDynamicsWorld_getDispatcher_0=function(){return(ic=b._emscripten_bind_btDynamicsWorld_getDispatcher_0=b.asm.oa).apply(null,arguments)},jc=b._emscripten_bind_btDynamicsWorld_rayTest_3=function(){return(jc=b._emscripten_bind_btDynamicsWorld_rayTest_3=b.asm.pa).apply(null,arguments)},kc=b._emscripten_bind_btDynamicsWorld_getPairCache_0=function(){return(kc=b._emscripten_bind_btDynamicsWorld_getPairCache_0= b.asm.qa).apply(null,arguments)},lc=b._emscripten_bind_btDynamicsWorld_getDispatchInfo_0=function(){return(lc=b._emscripten_bind_btDynamicsWorld_getDispatchInfo_0=b.asm.ra).apply(null,arguments)},mc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_1=function(){return(mc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_1=b.asm.sa).apply(null,arguments)},nc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_2=function(){return(nc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_2= b.asm.ta).apply(null,arguments)},oc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_3=function(){return(oc=b._emscripten_bind_btDynamicsWorld_addCollisionObject_3=b.asm.ua).apply(null,arguments)},pc=b._emscripten_bind_btDynamicsWorld_removeCollisionObject_1=function(){return(pc=b._emscripten_bind_btDynamicsWorld_removeCollisionObject_1=b.asm.va).apply(null,arguments)},qc=b._emscripten_bind_btDynamicsWorld_getBroadphase_0=function(){return(qc=b._emscripten_bind_btDynamicsWorld_getBroadphase_0= b.asm.wa).apply(null,arguments)},rc=b._emscripten_bind_btDynamicsWorld_convexSweepTest_5=function(){return(rc=b._emscripten_bind_btDynamicsWorld_convexSweepTest_5=b.asm.xa).apply(null,arguments)},sc=b._emscripten_bind_btDynamicsWorld_contactPairTest_3=function(){return(sc=b._emscripten_bind_btDynamicsWorld_contactPairTest_3=b.asm.ya).apply(null,arguments)},tc=b._emscripten_bind_btDynamicsWorld_contactTest_2=function(){return(tc=b._emscripten_bind_btDynamicsWorld_contactTest_2=b.asm.za).apply(null, arguments)},uc=b._emscripten_bind_btDynamicsWorld_updateSingleAabb_1=function(){return(uc=b._emscripten_bind_btDynamicsWorld_updateSingleAabb_1=b.asm.Aa).apply(null,arguments)},vc=b._emscripten_bind_btDynamicsWorld_setDebugDrawer_1=function(){return(vc=b._emscripten_bind_btDynamicsWorld_setDebugDrawer_1=b.asm.Ba).apply(null,arguments)},wc=b._emscripten_bind_btDynamicsWorld_getDebugDrawer_0=function(){return(wc=b._emscripten_bind_btDynamicsWorld_getDebugDrawer_0=b.asm.Ca).apply(null,arguments)},xc= b._emscripten_bind_btDynamicsWorld_debugDrawWorld_0=function(){return(xc=b._emscripten_bind_btDynamicsWorld_debugDrawWorld_0=b.asm.Da).apply(null,arguments)},yc=b._emscripten_bind_btDynamicsWorld_debugDrawObject_3=function(){return(yc=b._emscripten_bind_btDynamicsWorld_debugDrawObject_3=b.asm.Ea).apply(null,arguments)},zc=b._emscripten_bind_btDynamicsWorld___destroy___0=function(){return(zc=b._emscripten_bind_btDynamicsWorld___destroy___0=b.asm.Fa).apply(null,arguments)},Ac=b._emscripten_bind_btTypedConstraint_enableFeedback_1= function(){return(Ac=b._emscripten_bind_btTypedConstraint_enableFeedback_1=b.asm.Ga).apply(null,arguments)},Bc=b._emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0=function(){return(Bc=b._emscripten_bind_btTypedConstraint_getBreakingImpulseThreshold_0=b.asm.Ha).apply(null,arguments)},Cc=b._emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1=function(){return(Cc=b._emscripten_bind_btTypedConstraint_setBreakingImpulseThreshold_1=b.asm.Ia).apply(null,arguments)},Dc=b._emscripten_bind_btTypedConstraint_getParam_2= function(){return(Dc=b._emscripten_bind_btTypedConstraint_getParam_2=b.asm.Ja).apply(null,arguments)},Ec=b._emscripten_bind_btTypedConstraint_setParam_3=function(){return(Ec=b._emscripten_bind_btTypedConstraint_setParam_3=b.asm.Ka).apply(null,arguments)},Fc=b._emscripten_bind_btTypedConstraint___destroy___0=function(){return(Fc=b._emscripten_bind_btTypedConstraint___destroy___0=b.asm.La).apply(null,arguments)},Gc=b._emscripten_bind_btConcaveShape_setLocalScaling_1=function(){return(Gc=b._emscripten_bind_btConcaveShape_setLocalScaling_1= b.asm.Ma).apply(null,arguments)},Hc=b._emscripten_bind_btConcaveShape_getLocalScaling_0=function(){return(Hc=b._emscripten_bind_btConcaveShape_getLocalScaling_0=b.asm.Na).apply(null,arguments)},Ic=b._emscripten_bind_btConcaveShape_calculateLocalInertia_2=function(){return(Ic=b._emscripten_bind_btConcaveShape_calculateLocalInertia_2=b.asm.Oa).apply(null,arguments)},Jc=b._emscripten_bind_btConcaveShape___destroy___0=function(){return(Jc=b._emscripten_bind_btConcaveShape___destroy___0=b.asm.Pa).apply(null, arguments)},Kc=b._emscripten_bind_btCapsuleShape_btCapsuleShape_2=function(){return(Kc=b._emscripten_bind_btCapsuleShape_btCapsuleShape_2=b.asm.Qa).apply(null,arguments)},Lc=b._emscripten_bind_btCapsuleShape_setMargin_1=function(){return(Lc=b._emscripten_bind_btCapsuleShape_setMargin_1=b.asm.Ra).apply(null,arguments)},Mc=b._emscripten_bind_btCapsuleShape_getMargin_0=function(){return(Mc=b._emscripten_bind_btCapsuleShape_getMargin_0=b.asm.Sa).apply(null,arguments)},Nc=b._emscripten_bind_btCapsuleShape_getUpAxis_0= function(){return(Nc=b._emscripten_bind_btCapsuleShape_getUpAxis_0=b.asm.Ta).apply(null,arguments)},Oc=b._emscripten_bind_btCapsuleShape_getRadius_0=function(){return(Oc=b._emscripten_bind_btCapsuleShape_getRadius_0=b.asm.Ua).apply(null,arguments)},Pc=b._emscripten_bind_btCapsuleShape_getHalfHeight_0=function(){return(Pc=b._emscripten_bind_btCapsuleShape_getHalfHeight_0=b.asm.Va).apply(null,arguments)},Qc=b._emscripten_bind_btCapsuleShape_setLocalScaling_1=function(){return(Qc=b._emscripten_bind_btCapsuleShape_setLocalScaling_1= b.asm.Wa).apply(null,arguments)},Rc=b._emscripten_bind_btCapsuleShape_getLocalScaling_0=function(){return(Rc=b._emscripten_bind_btCapsuleShape_getLocalScaling_0=b.asm.Xa).apply(null,arguments)},Sc=b._emscripten_bind_btCapsuleShape_calculateLocalInertia_2=function(){return(Sc=b._emscripten_bind_btCapsuleShape_calculateLocalInertia_2=b.asm.Ya).apply(null,arguments)},Tc=b._emscripten_bind_btCapsuleShape___destroy___0=function(){return(Tc=b._emscripten_bind_btCapsuleShape___destroy___0=b.asm.Za).apply(null, arguments)},Uc=b._emscripten_bind_btIDebugDraw_drawLine_3=function(){return(Uc=b._emscripten_bind_btIDebugDraw_drawLine_3=b.asm._a).apply(null,arguments)},Vc=b._emscripten_bind_btIDebugDraw_drawContactPoint_5=function(){return(Vc=b._emscripten_bind_btIDebugDraw_drawContactPoint_5=b.asm.$a).apply(null,arguments)},Wc=b._emscripten_bind_btIDebugDraw_reportErrorWarning_1=function(){return(Wc=b._emscripten_bind_btIDebugDraw_reportErrorWarning_1=b.asm.ab).apply(null,arguments)},Xc=b._emscripten_bind_btIDebugDraw_draw3dText_2= function(){return(Xc=b._emscripten_bind_btIDebugDraw_draw3dText_2=b.asm.bb).apply(null,arguments)},Yc=b._emscripten_bind_btIDebugDraw_setDebugMode_1=function(){return(Yc=b._emscripten_bind_btIDebugDraw_setDebugMode_1=b.asm.cb).apply(null,arguments)},Zc=b._emscripten_bind_btIDebugDraw_getDebugMode_0=function(){return(Zc=b._emscripten_bind_btIDebugDraw_getDebugMode_0=b.asm.db).apply(null,arguments)},$c=b._emscripten_bind_btIDebugDraw___destroy___0=function(){return($c=b._emscripten_bind_btIDebugDraw___destroy___0= b.asm.eb).apply(null,arguments)},ad=b._emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0=function(){return(ad=b._emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_0=b.asm.fb).apply(null,arguments)},bd=b._emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1=function(){return(bd=b._emscripten_bind_btDefaultCollisionConfiguration_btDefaultCollisionConfiguration_1=b.asm.gb).apply(null,arguments)},cd=b._emscripten_bind_btDefaultCollisionConfiguration___destroy___0= function(){return(cd=b._emscripten_bind_btDefaultCollisionConfiguration___destroy___0=b.asm.hb).apply(null,arguments)},dd=b._emscripten_bind_btTriangleMeshShape_setLocalScaling_1=function(){return(dd=b._emscripten_bind_btTriangleMeshShape_setLocalScaling_1=b.asm.ib).apply(null,arguments)},ed=b._emscripten_bind_btTriangleMeshShape_getLocalScaling_0=function(){return(ed=b._emscripten_bind_btTriangleMeshShape_getLocalScaling_0=b.asm.jb).apply(null,arguments)},fd=b._emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2= function(){return(fd=b._emscripten_bind_btTriangleMeshShape_calculateLocalInertia_2=b.asm.kb).apply(null,arguments)},gd=b._emscripten_bind_btTriangleMeshShape___destroy___0=function(){return(gd=b._emscripten_bind_btTriangleMeshShape___destroy___0=b.asm.lb).apply(null,arguments)},hd=b._emscripten_bind_btGhostObject_btGhostObject_0=function(){return(hd=b._emscripten_bind_btGhostObject_btGhostObject_0=b.asm.mb).apply(null,arguments)},id=b._emscripten_bind_btGhostObject_getNumOverlappingObjects_0=function(){return(id= b._emscripten_bind_btGhostObject_getNumOverlappingObjects_0=b.asm.nb).apply(null,arguments)},jd=b._emscripten_bind_btGhostObject_getOverlappingObject_1=function(){return(jd=b._emscripten_bind_btGhostObject_getOverlappingObject_1=b.asm.ob).apply(null,arguments)},kd=b._emscripten_bind_btGhostObject_setAnisotropicFriction_2=function(){return(kd=b._emscripten_bind_btGhostObject_setAnisotropicFriction_2=b.asm.pb).apply(null,arguments)},ld=b._emscripten_bind_btGhostObject_getCollisionShape_0=function(){return(ld= b._emscripten_bind_btGhostObject_getCollisionShape_0=b.asm.qb).apply(null,arguments)},md=b._emscripten_bind_btGhostObject_setContactProcessingThreshold_1=function(){return(md=b._emscripten_bind_btGhostObject_setContactProcessingThreshold_1=b.asm.rb).apply(null,arguments)},nd=b._emscripten_bind_btGhostObject_setActivationState_1=function(){return(nd=b._emscripten_bind_btGhostObject_setActivationState_1=b.asm.sb).apply(null,arguments)},od=b._emscripten_bind_btGhostObject_forceActivationState_1=function(){return(od= b._emscripten_bind_btGhostObject_forceActivationState_1=b.asm.tb).apply(null,arguments)},pd=b._emscripten_bind_btGhostObject_activate_0=function(){return(pd=b._emscripten_bind_btGhostObject_activate_0=b.asm.ub).apply(null,arguments)},qd=b._emscripten_bind_btGhostObject_activate_1=function(){return(qd=b._emscripten_bind_btGhostObject_activate_1=b.asm.vb).apply(null,arguments)},rd=b._emscripten_bind_btGhostObject_isActive_0=function(){return(rd=b._emscripten_bind_btGhostObject_isActive_0=b.asm.wb).apply(null, arguments)},sd=b._emscripten_bind_btGhostObject_isKinematicObject_0=function(){return(sd=b._emscripten_bind_btGhostObject_isKinematicObject_0=b.asm.xb).apply(null,arguments)},td=b._emscripten_bind_btGhostObject_isStaticObject_0=function(){return(td=b._emscripten_bind_btGhostObject_isStaticObject_0=b.asm.yb).apply(null,arguments)},ud=b._emscripten_bind_btGhostObject_isStaticOrKinematicObject_0=function(){return(ud=b._emscripten_bind_btGhostObject_isStaticOrKinematicObject_0=b.asm.zb).apply(null,arguments)}, vd=b._emscripten_bind_btGhostObject_getRestitution_0=function(){return(vd=b._emscripten_bind_btGhostObject_getRestitution_0=b.asm.Ab).apply(null,arguments)},wd=b._emscripten_bind_btGhostObject_getFriction_0=function(){return(wd=b._emscripten_bind_btGhostObject_getFriction_0=b.asm.Bb).apply(null,arguments)},xd=b._emscripten_bind_btGhostObject_getRollingFriction_0=function(){return(xd=b._emscripten_bind_btGhostObject_getRollingFriction_0=b.asm.Cb).apply(null,arguments)},yd=b._emscripten_bind_btGhostObject_setRestitution_1= function(){return(yd=b._emscripten_bind_btGhostObject_setRestitution_1=b.asm.Db).apply(null,arguments)},zd=b._emscripten_bind_btGhostObject_setFriction_1=function(){return(zd=b._emscripten_bind_btGhostObject_setFriction_1=b.asm.Eb).apply(null,arguments)},Ad=b._emscripten_bind_btGhostObject_setRollingFriction_1=function(){return(Ad=b._emscripten_bind_btGhostObject_setRollingFriction_1=b.asm.Fb).apply(null,arguments)},Bd=b._emscripten_bind_btGhostObject_getWorldTransform_0=function(){return(Bd=b._emscripten_bind_btGhostObject_getWorldTransform_0= b.asm.Gb).apply(null,arguments)},Cd=b._emscripten_bind_btGhostObject_getCollisionFlags_0=function(){return(Cd=b._emscripten_bind_btGhostObject_getCollisionFlags_0=b.asm.Hb).apply(null,arguments)},Dd=b._emscripten_bind_btGhostObject_setCollisionFlags_1=function(){return(Dd=b._emscripten_bind_btGhostObject_setCollisionFlags_1=b.asm.Ib).apply(null,arguments)},Ed=b._emscripten_bind_btGhostObject_setWorldTransform_1=function(){return(Ed=b._emscripten_bind_btGhostObject_setWorldTransform_1=b.asm.Jb).apply(null, arguments)},Fd=b._emscripten_bind_btGhostObject_setCollisionShape_1=function(){return(Fd=b._emscripten_bind_btGhostObject_setCollisionShape_1=b.asm.Kb).apply(null,arguments)},Gd=b._emscripten_bind_btGhostObject_setCcdMotionThreshold_1=function(){return(Gd=b._emscripten_bind_btGhostObject_setCcdMotionThreshold_1=b.asm.Lb).apply(null,arguments)},Hd=b._emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1=function(){return(Hd=b._emscripten_bind_btGhostObject_setCcdSweptSphereRadius_1=b.asm.Mb).apply(null, arguments)},Id=b._emscripten_bind_btGhostObject_getUserIndex_0=function(){return(Id=b._emscripten_bind_btGhostObject_getUserIndex_0=b.asm.Nb).apply(null,arguments)},Jd=b._emscripten_bind_btGhostObject_setUserIndex_1=function(){return(Jd=b._emscripten_bind_btGhostObject_setUserIndex_1=b.asm.Ob).apply(null,arguments)},Kd=b._emscripten_bind_btGhostObject_getUserPointer_0=function(){return(Kd=b._emscripten_bind_btGhostObject_getUserPointer_0=b.asm.Pb).apply(null,arguments)},Ld=b._emscripten_bind_btGhostObject_setUserPointer_1= function(){return(Ld=b._emscripten_bind_btGhostObject_setUserPointer_1=b.asm.Qb).apply(null,arguments)},Md=b._emscripten_bind_btGhostObject_getBroadphaseHandle_0=function(){return(Md=b._emscripten_bind_btGhostObject_getBroadphaseHandle_0=b.asm.Rb).apply(null,arguments)},Nd=b._emscripten_bind_btGhostObject___destroy___0=function(){return(Nd=b._emscripten_bind_btGhostObject___destroy___0=b.asm.Sb).apply(null,arguments)},Od=b._emscripten_bind_btConeShape_btConeShape_2=function(){return(Od=b._emscripten_bind_btConeShape_btConeShape_2= b.asm.Tb).apply(null,arguments)},Pd=b._emscripten_bind_btConeShape_setLocalScaling_1=function(){return(Pd=b._emscripten_bind_btConeShape_setLocalScaling_1=b.asm.Ub).apply(null,arguments)},Qd=b._emscripten_bind_btConeShape_getLocalScaling_0=function(){return(Qd=b._emscripten_bind_btConeShape_getLocalScaling_0=b.asm.Vb).apply(null,arguments)},Rd=b._emscripten_bind_btConeShape_calculateLocalInertia_2=function(){return(Rd=b._emscripten_bind_btConeShape_calculateLocalInertia_2=b.asm.Wb).apply(null,arguments)}, Sd=b._emscripten_bind_btConeShape___destroy___0=function(){return(Sd=b._emscripten_bind_btConeShape___destroy___0=b.asm.Xb).apply(null,arguments)},Td=b._emscripten_bind_btActionInterface_updateAction_2=function(){return(Td=b._emscripten_bind_btActionInterface_updateAction_2=b.asm.Yb).apply(null,arguments)},Ud=b._emscripten_bind_btActionInterface___destroy___0=function(){return(Ud=b._emscripten_bind_btActionInterface___destroy___0=b.asm.Zb).apply(null,arguments)},Vd=b._emscripten_bind_btVector3_btVector3_0= function(){return(Vd=b._emscripten_bind_btVector3_btVector3_0=b.asm._b).apply(null,arguments)},Wd=b._emscripten_bind_btVector3_btVector3_3=function(){return(Wd=b._emscripten_bind_btVector3_btVector3_3=b.asm.$b).apply(null,arguments)},Xd=b._emscripten_bind_btVector3_length_0=function(){return(Xd=b._emscripten_bind_btVector3_length_0=b.asm.ac).apply(null,arguments)},Yd=b._emscripten_bind_btVector3_x_0=function(){return(Yd=b._emscripten_bind_btVector3_x_0=b.asm.bc).apply(null,arguments)},Zd=b._emscripten_bind_btVector3_y_0= function(){return(Zd=b._emscripten_bind_btVector3_y_0=b.asm.cc).apply(null,arguments)},$d=b._emscripten_bind_btVector3_z_0=function(){return($d=b._emscripten_bind_btVector3_z_0=b.asm.dc).apply(null,arguments)},ae=b._emscripten_bind_btVector3_setX_1=function(){return(ae=b._emscripten_bind_btVector3_setX_1=b.asm.ec).apply(null,arguments)},be=b._emscripten_bind_btVector3_setY_1=function(){return(be=b._emscripten_bind_btVector3_setY_1=b.asm.fc).apply(null,arguments)},ce=b._emscripten_bind_btVector3_setZ_1= function(){return(ce=b._emscripten_bind_btVector3_setZ_1=b.asm.gc).apply(null,arguments)},de=b._emscripten_bind_btVector3_setValue_3=function(){return(de=b._emscripten_bind_btVector3_setValue_3=b.asm.hc).apply(null,arguments)},ee=b._emscripten_bind_btVector3_normalize_0=function(){return(ee=b._emscripten_bind_btVector3_normalize_0=b.asm.ic).apply(null,arguments)},fe=b._emscripten_bind_btVector3_rotate_2=function(){return(fe=b._emscripten_bind_btVector3_rotate_2=b.asm.jc).apply(null,arguments)},ge= b._emscripten_bind_btVector3_dot_1=function(){return(ge=b._emscripten_bind_btVector3_dot_1=b.asm.kc).apply(null,arguments)},he=b._emscripten_bind_btVector3_op_mul_1=function(){return(he=b._emscripten_bind_btVector3_op_mul_1=b.asm.lc).apply(null,arguments)},ie=b._emscripten_bind_btVector3_op_add_1=function(){return(ie=b._emscripten_bind_btVector3_op_add_1=b.asm.mc).apply(null,arguments)},je=b._emscripten_bind_btVector3_op_sub_1=function(){return(je=b._emscripten_bind_btVector3_op_sub_1=b.asm.nc).apply(null, arguments)},ke=b._emscripten_bind_btVector3___destroy___0=function(){return(ke=b._emscripten_bind_btVector3___destroy___0=b.asm.oc).apply(null,arguments)},le=b._emscripten_bind_btVehicleRaycaster_castRay_3=function(){return(le=b._emscripten_bind_btVehicleRaycaster_castRay_3=b.asm.pc).apply(null,arguments)},me=b._emscripten_bind_btVehicleRaycaster___destroy___0=function(){return(me=b._emscripten_bind_btVehicleRaycaster___destroy___0=b.asm.qc).apply(null,arguments)},ne=b._emscripten_bind_btQuadWord_x_0= function(){return(ne=b._emscripten_bind_btQuadWord_x_0=b.asm.rc).apply(null,arguments)},oe=b._emscripten_bind_btQuadWord_y_0=function(){return(oe=b._emscripten_bind_btQuadWord_y_0=b.asm.sc).apply(null,arguments)},pe=b._emscripten_bind_btQuadWord_z_0=function(){return(pe=b._emscripten_bind_btQuadWord_z_0=b.asm.tc).apply(null,arguments)},qe=b._emscripten_bind_btQuadWord_w_0=function(){return(qe=b._emscripten_bind_btQuadWord_w_0=b.asm.uc).apply(null,arguments)},re=b._emscripten_bind_btQuadWord_setX_1= function(){return(re=b._emscripten_bind_btQuadWord_setX_1=b.asm.vc).apply(null,arguments)},se=b._emscripten_bind_btQuadWord_setY_1=function(){return(se=b._emscripten_bind_btQuadWord_setY_1=b.asm.wc).apply(null,arguments)},te=b._emscripten_bind_btQuadWord_setZ_1=function(){return(te=b._emscripten_bind_btQuadWord_setZ_1=b.asm.xc).apply(null,arguments)},ue=b._emscripten_bind_btQuadWord_setW_1=function(){return(ue=b._emscripten_bind_btQuadWord_setW_1=b.asm.yc).apply(null,arguments)},ve=b._emscripten_bind_btQuadWord___destroy___0= function(){return(ve=b._emscripten_bind_btQuadWord___destroy___0=b.asm.zc).apply(null,arguments)},we=b._emscripten_bind_btCylinderShape_btCylinderShape_1=function(){return(we=b._emscripten_bind_btCylinderShape_btCylinderShape_1=b.asm.Ac).apply(null,arguments)},xe=b._emscripten_bind_btCylinderShape_setMargin_1=function(){return(xe=b._emscripten_bind_btCylinderShape_setMargin_1=b.asm.Bc).apply(null,arguments)},ye=b._emscripten_bind_btCylinderShape_getMargin_0=function(){return(ye=b._emscripten_bind_btCylinderShape_getMargin_0= b.asm.Cc).apply(null,arguments)},ze=b._emscripten_bind_btCylinderShape_setLocalScaling_1=function(){return(ze=b._emscripten_bind_btCylinderShape_setLocalScaling_1=b.asm.Dc).apply(null,arguments)},Ae=b._emscripten_bind_btCylinderShape_getLocalScaling_0=function(){return(Ae=b._emscripten_bind_btCylinderShape_getLocalScaling_0=b.asm.Ec).apply(null,arguments)},Be=b._emscripten_bind_btCylinderShape_calculateLocalInertia_2=function(){return(Be=b._emscripten_bind_btCylinderShape_calculateLocalInertia_2= b.asm.Fc).apply(null,arguments)},Ce=b._emscripten_bind_btCylinderShape___destroy___0=function(){return(Ce=b._emscripten_bind_btCylinderShape___destroy___0=b.asm.Gc).apply(null,arguments)},De=b._emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4=function(){return(De=b._emscripten_bind_btDiscreteDynamicsWorld_btDiscreteDynamicsWorld_4=b.asm.Hc).apply(null,arguments)},Ee=b._emscripten_bind_btDiscreteDynamicsWorld_setGravity_1=function(){return(Ee=b._emscripten_bind_btDiscreteDynamicsWorld_setGravity_1= b.asm.Ic).apply(null,arguments)},Fe=b._emscripten_bind_btDiscreteDynamicsWorld_getGravity_0=function(){return(Fe=b._emscripten_bind_btDiscreteDynamicsWorld_getGravity_0=b.asm.Jc).apply(null,arguments)},Ge=b._emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1=function(){return(Ge=b._emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_1=b.asm.Kc).apply(null,arguments)},He=b._emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3=function(){return(He=b._emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_3= b.asm.Lc).apply(null,arguments)},Ie=b._emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1=function(){return(Ie=b._emscripten_bind_btDiscreteDynamicsWorld_removeRigidBody_1=b.asm.Mc).apply(null,arguments)},Je=b._emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1=function(){return(Je=b._emscripten_bind_btDiscreteDynamicsWorld_addConstraint_1=b.asm.Nc).apply(null,arguments)},Ke=b._emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2=function(){return(Ke=b._emscripten_bind_btDiscreteDynamicsWorld_addConstraint_2= b.asm.Oc).apply(null,arguments)},Le=b._emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1=function(){return(Le=b._emscripten_bind_btDiscreteDynamicsWorld_removeConstraint_1=b.asm.Pc).apply(null,arguments)},Me=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1=function(){return(Me=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_1=b.asm.Qc).apply(null,arguments)},Ne=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2=function(){return(Ne=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_2= b.asm.Rc).apply(null,arguments)},Oe=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3=function(){return(Oe=b._emscripten_bind_btDiscreteDynamicsWorld_stepSimulation_3=b.asm.Sc).apply(null,arguments)},Pe=b._emscripten_bind_btDiscreteDynamicsWorld_setContactAddedCallback_1=function(){return(Pe=b._emscripten_bind_btDiscreteDynamicsWorld_setContactAddedCallback_1=b.asm.Tc).apply(null,arguments)},Qe=b._emscripten_bind_btDiscreteDynamicsWorld_setContactProcessedCallback_1=function(){return(Qe= b._emscripten_bind_btDiscreteDynamicsWorld_setContactProcessedCallback_1=b.asm.Uc).apply(null,arguments)},Re=b._emscripten_bind_btDiscreteDynamicsWorld_setContactDestroyedCallback_1=function(){return(Re=b._emscripten_bind_btDiscreteDynamicsWorld_setContactDestroyedCallback_1=b.asm.Vc).apply(null,arguments)},Se=b._emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0=function(){return(Se=b._emscripten_bind_btDiscreteDynamicsWorld_getDispatcher_0=b.asm.Wc).apply(null,arguments)},Te=b._emscripten_bind_btDiscreteDynamicsWorld_rayTest_3= function(){return(Te=b._emscripten_bind_btDiscreteDynamicsWorld_rayTest_3=b.asm.Xc).apply(null,arguments)},Ue=b._emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0=function(){return(Ue=b._emscripten_bind_btDiscreteDynamicsWorld_getPairCache_0=b.asm.Yc).apply(null,arguments)},Ve=b._emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0=function(){return(Ve=b._emscripten_bind_btDiscreteDynamicsWorld_getDispatchInfo_0=b.asm.Zc).apply(null,arguments)},We=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1= function(){return(We=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_1=b.asm._c).apply(null,arguments)},Xe=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2=function(){return(Xe=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_2=b.asm.$c).apply(null,arguments)},Ye=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3=function(){return(Ye=b._emscripten_bind_btDiscreteDynamicsWorld_addCollisionObject_3=b.asm.ad).apply(null,arguments)},Ze=b._emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1= function(){return(Ze=b._emscripten_bind_btDiscreteDynamicsWorld_removeCollisionObject_1=b.asm.bd).apply(null,arguments)},$e=b._emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0=function(){return($e=b._emscripten_bind_btDiscreteDynamicsWorld_getBroadphase_0=b.asm.cd).apply(null,arguments)},af=b._emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5=function(){return(af=b._emscripten_bind_btDiscreteDynamicsWorld_convexSweepTest_5=b.asm.dd).apply(null,arguments)},bf=b._emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3= function(){return(bf=b._emscripten_bind_btDiscreteDynamicsWorld_contactPairTest_3=b.asm.ed).apply(null,arguments)},cf=b._emscripten_bind_btDiscreteDynamicsWorld_contactTest_2=function(){return(cf=b._emscripten_bind_btDiscreteDynamicsWorld_contactTest_2=b.asm.fd).apply(null,arguments)},df=b._emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1=function(){return(df=b._emscripten_bind_btDiscreteDynamicsWorld_updateSingleAabb_1=b.asm.gd).apply(null,arguments)},ef=b._emscripten_bind_btDiscreteDynamicsWorld_setDebugDrawer_1= function(){return(ef=b._emscripten_bind_btDiscreteDynamicsWorld_setDebugDrawer_1=b.asm.hd).apply(null,arguments)},ff=b._emscripten_bind_btDiscreteDynamicsWorld_getDebugDrawer_0=function(){return(ff=b._emscripten_bind_btDiscreteDynamicsWorld_getDebugDrawer_0=b.asm.id).apply(null,arguments)},gf=b._emscripten_bind_btDiscreteDynamicsWorld_debugDrawWorld_0=function(){return(gf=b._emscripten_bind_btDiscreteDynamicsWorld_debugDrawWorld_0=b.asm.jd).apply(null,arguments)},hf=b._emscripten_bind_btDiscreteDynamicsWorld_debugDrawObject_3= function(){return(hf=b._emscripten_bind_btDiscreteDynamicsWorld_debugDrawObject_3=b.asm.kd).apply(null,arguments)},jf=b._emscripten_bind_btDiscreteDynamicsWorld_addAction_1=function(){return(jf=b._emscripten_bind_btDiscreteDynamicsWorld_addAction_1=b.asm.ld).apply(null,arguments)},kf=b._emscripten_bind_btDiscreteDynamicsWorld_removeAction_1=function(){return(kf=b._emscripten_bind_btDiscreteDynamicsWorld_removeAction_1=b.asm.md).apply(null,arguments)},lf=b._emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0= function(){return(lf=b._emscripten_bind_btDiscreteDynamicsWorld_getSolverInfo_0=b.asm.nd).apply(null,arguments)},mf=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_1=function(){return(mf=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_1=b.asm.od).apply(null,arguments)},nf=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_2=function(){return(nf=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_2=b.asm.pd).apply(null,arguments)}, of=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_3=function(){return(of=b._emscripten_bind_btDiscreteDynamicsWorld_setInternalTickCallback_3=b.asm.qd).apply(null,arguments)},pf=b._emscripten_bind_btDiscreteDynamicsWorld___destroy___0=function(){return(pf=b._emscripten_bind_btDiscreteDynamicsWorld___destroy___0=b.asm.rd).apply(null,arguments)},qf=b._emscripten_bind_btConvexShape_setLocalScaling_1=function(){return(qf=b._emscripten_bind_btConvexShape_setLocalScaling_1=b.asm.sd).apply(null, arguments)},rf=b._emscripten_bind_btConvexShape_getLocalScaling_0=function(){return(rf=b._emscripten_bind_btConvexShape_getLocalScaling_0=b.asm.td).apply(null,arguments)},sf=b._emscripten_bind_btConvexShape_calculateLocalInertia_2=function(){return(sf=b._emscripten_bind_btConvexShape_calculateLocalInertia_2=b.asm.ud).apply(null,arguments)},tf=b._emscripten_bind_btConvexShape_setMargin_1=function(){return(tf=b._emscripten_bind_btConvexShape_setMargin_1=b.asm.vd).apply(null,arguments)},uf=b._emscripten_bind_btConvexShape_getMargin_0= function(){return(uf=b._emscripten_bind_btConvexShape_getMargin_0=b.asm.wd).apply(null,arguments)},vf=b._emscripten_bind_btConvexShape___destroy___0=function(){return(vf=b._emscripten_bind_btConvexShape___destroy___0=b.asm.xd).apply(null,arguments)},wf=b._emscripten_bind_btDispatcher_getNumManifolds_0=function(){return(wf=b._emscripten_bind_btDispatcher_getNumManifolds_0=b.asm.yd).apply(null,arguments)},xf=b._emscripten_bind_btDispatcher_getManifoldByIndexInternal_1=function(){return(xf=b._emscripten_bind_btDispatcher_getManifoldByIndexInternal_1= b.asm.zd).apply(null,arguments)},yf=b._emscripten_bind_btDispatcher___destroy___0=function(){return(yf=b._emscripten_bind_btDispatcher___destroy___0=b.asm.Ad).apply(null,arguments)},zf=b._emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3=function(){return(zf=b._emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_3=b.asm.Bd).apply(null,arguments)},Af=b._emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5=function(){return(Af=b._emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_5= b.asm.Cd).apply(null,arguments)},Bf=b._emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1=function(){return(Bf=b._emscripten_bind_btGeneric6DofConstraint_setLinearLowerLimit_1=b.asm.Dd).apply(null,arguments)},Cf=b._emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1=function(){return(Cf=b._emscripten_bind_btGeneric6DofConstraint_setLinearUpperLimit_1=b.asm.Ed).apply(null,arguments)},Df=b._emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1=function(){return(Df=b._emscripten_bind_btGeneric6DofConstraint_setAngularLowerLimit_1= b.asm.Fd).apply(null,arguments)},Ef=b._emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1=function(){return(Ef=b._emscripten_bind_btGeneric6DofConstraint_setAngularUpperLimit_1=b.asm.Gd).apply(null,arguments)},Ff=b._emscripten_bind_btGeneric6DofConstraint_getFrameOffsetA_0=function(){return(Ff=b._emscripten_bind_btGeneric6DofConstraint_getFrameOffsetA_0=b.asm.Hd).apply(null,arguments)},Gf=b._emscripten_bind_btGeneric6DofConstraint_enableFeedback_1=function(){return(Gf=b._emscripten_bind_btGeneric6DofConstraint_enableFeedback_1= b.asm.Id).apply(null,arguments)},Hf=b._emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0=function(){return(Hf=b._emscripten_bind_btGeneric6DofConstraint_getBreakingImpulseThreshold_0=b.asm.Jd).apply(null,arguments)},If=b._emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1=function(){return(If=b._emscripten_bind_btGeneric6DofConstraint_setBreakingImpulseThreshold_1=b.asm.Kd).apply(null,arguments)},Jf=b._emscripten_bind_btGeneric6DofConstraint_getParam_2=function(){return(Jf= b._emscripten_bind_btGeneric6DofConstraint_getParam_2=b.asm.Ld).apply(null,arguments)},Kf=b._emscripten_bind_btGeneric6DofConstraint_setParam_3=function(){return(Kf=b._emscripten_bind_btGeneric6DofConstraint_setParam_3=b.asm.Md).apply(null,arguments)},Lf=b._emscripten_bind_btGeneric6DofConstraint___destroy___0=function(){return(Lf=b._emscripten_bind_btGeneric6DofConstraint___destroy___0=b.asm.Nd).apply(null,arguments)},Mf=b._emscripten_bind_btStridingMeshInterface_setScaling_1=function(){return(Mf= b._emscripten_bind_btStridingMeshInterface_setScaling_1=b.asm.Od).apply(null,arguments)},Nf=b._emscripten_bind_btStridingMeshInterface___destroy___0=function(){return(Nf=b._emscripten_bind_btStridingMeshInterface___destroy___0=b.asm.Pd).apply(null,arguments)},Of=b._emscripten_bind_btMotionState_getWorldTransform_1=function(){return(Of=b._emscripten_bind_btMotionState_getWorldTransform_1=b.asm.Qd).apply(null,arguments)},Pf=b._emscripten_bind_btMotionState_setWorldTransform_1=function(){return(Pf=b._emscripten_bind_btMotionState_setWorldTransform_1= b.asm.Rd).apply(null,arguments)},Qf=b._emscripten_bind_btMotionState___destroy___0=function(){return(Qf=b._emscripten_bind_btMotionState___destroy___0=b.asm.Sd).apply(null,arguments)},Rf=b._emscripten_bind_ConvexResultCallback_hasHit_0=function(){return(Rf=b._emscripten_bind_ConvexResultCallback_hasHit_0=b.asm.Td).apply(null,arguments)},Sf=b._emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0=function(){return(Sf=b._emscripten_bind_ConvexResultCallback_get_m_collisionFilterGroup_0= b.asm.Ud).apply(null,arguments)},Tf=b._emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1=function(){return(Tf=b._emscripten_bind_ConvexResultCallback_set_m_collisionFilterGroup_1=b.asm.Vd).apply(null,arguments)},Uf=b._emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0=function(){return(Uf=b._emscripten_bind_ConvexResultCallback_get_m_collisionFilterMask_0=b.asm.Wd).apply(null,arguments)},Vf=b._emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1=function(){return(Vf= b._emscripten_bind_ConvexResultCallback_set_m_collisionFilterMask_1=b.asm.Xd).apply(null,arguments)},Wf=b._emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0=function(){return(Wf=b._emscripten_bind_ConvexResultCallback_get_m_closestHitFraction_0=b.asm.Yd).apply(null,arguments)},Xf=b._emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1=function(){return(Xf=b._emscripten_bind_ConvexResultCallback_set_m_closestHitFraction_1=b.asm.Zd).apply(null,arguments)},Yf=b._emscripten_bind_ConvexResultCallback___destroy___0= function(){return(Yf=b._emscripten_bind_ConvexResultCallback___destroy___0=b.asm._d).apply(null,arguments)},Zf=b._emscripten_bind_ContactResultCallback_addSingleResult_7=function(){return(Zf=b._emscripten_bind_ContactResultCallback_addSingleResult_7=b.asm.$d).apply(null,arguments)},$f=b._emscripten_bind_ContactResultCallback___destroy___0=function(){return($f=b._emscripten_bind_ContactResultCallback___destroy___0=b.asm.ae).apply(null,arguments)},ag=b._emscripten_bind_btSoftBodySolver___destroy___0= function(){return(ag=b._emscripten_bind_btSoftBodySolver___destroy___0=b.asm.be).apply(null,arguments)},bg=b._emscripten_bind_RayResultCallback_hasHit_0=function(){return(bg=b._emscripten_bind_RayResultCallback_hasHit_0=b.asm.ce).apply(null,arguments)},cg=b._emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0=function(){return(cg=b._emscripten_bind_RayResultCallback_get_m_collisionFilterGroup_0=b.asm.de).apply(null,arguments)},dg=b._emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1= function(){return(dg=b._emscripten_bind_RayResultCallback_set_m_collisionFilterGroup_1=b.asm.ee).apply(null,arguments)},eg=b._emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0=function(){return(eg=b._emscripten_bind_RayResultCallback_get_m_collisionFilterMask_0=b.asm.fe).apply(null,arguments)},fg=b._emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1=function(){return(fg=b._emscripten_bind_RayResultCallback_set_m_collisionFilterMask_1=b.asm.ge).apply(null,arguments)},gg=b._emscripten_bind_RayResultCallback_get_m_closestHitFraction_0= function(){return(gg=b._emscripten_bind_RayResultCallback_get_m_closestHitFraction_0=b.asm.he).apply(null,arguments)},hg=b._emscripten_bind_RayResultCallback_set_m_closestHitFraction_1=function(){return(hg=b._emscripten_bind_RayResultCallback_set_m_closestHitFraction_1=b.asm.ie).apply(null,arguments)},ig=b._emscripten_bind_RayResultCallback_get_m_collisionObject_0=function(){return(ig=b._emscripten_bind_RayResultCallback_get_m_collisionObject_0=b.asm.je).apply(null,arguments)},jg=b._emscripten_bind_RayResultCallback_set_m_collisionObject_1= function(){return(jg=b._emscripten_bind_RayResultCallback_set_m_collisionObject_1=b.asm.ke).apply(null,arguments)},kg=b._emscripten_bind_RayResultCallback___destroy___0=function(){return(kg=b._emscripten_bind_RayResultCallback___destroy___0=b.asm.le).apply(null,arguments)},lg=b._emscripten_bind_btMatrix3x3_setEulerZYX_3=function(){return(lg=b._emscripten_bind_btMatrix3x3_setEulerZYX_3=b.asm.me).apply(null,arguments)},mg=b._emscripten_bind_btMatrix3x3_getRotation_1=function(){return(mg=b._emscripten_bind_btMatrix3x3_getRotation_1= b.asm.ne).apply(null,arguments)},ng=b._emscripten_bind_btMatrix3x3_getRow_1=function(){return(ng=b._emscripten_bind_btMatrix3x3_getRow_1=b.asm.oe).apply(null,arguments)},og=b._emscripten_bind_btMatrix3x3___destroy___0=function(){return(og=b._emscripten_bind_btMatrix3x3___destroy___0=b.asm.pe).apply(null,arguments)},pg=b._emscripten_bind_btScalarArray_size_0=function(){return(pg=b._emscripten_bind_btScalarArray_size_0=b.asm.qe).apply(null,arguments)},qg=b._emscripten_bind_btScalarArray_at_1=function(){return(qg= b._emscripten_bind_btScalarArray_at_1=b.asm.re).apply(null,arguments)},rg=b._emscripten_bind_btScalarArray___destroy___0=function(){return(rg=b._emscripten_bind_btScalarArray___destroy___0=b.asm.se).apply(null,arguments)},sg=b._emscripten_bind_Material_get_m_kLST_0=function(){return(sg=b._emscripten_bind_Material_get_m_kLST_0=b.asm.te).apply(null,arguments)},tg=b._emscripten_bind_Material_set_m_kLST_1=function(){return(tg=b._emscripten_bind_Material_set_m_kLST_1=b.asm.ue).apply(null,arguments)},ug= b._emscripten_bind_Material_get_m_kAST_0=function(){return(ug=b._emscripten_bind_Material_get_m_kAST_0=b.asm.ve).apply(null,arguments)},vg=b._emscripten_bind_Material_set_m_kAST_1=function(){return(vg=b._emscripten_bind_Material_set_m_kAST_1=b.asm.we).apply(null,arguments)},wg=b._emscripten_bind_Material_get_m_kVST_0=function(){return(wg=b._emscripten_bind_Material_get_m_kVST_0=b.asm.xe).apply(null,arguments)},xg=b._emscripten_bind_Material_set_m_kVST_1=function(){return(xg=b._emscripten_bind_Material_set_m_kVST_1= b.asm.ye).apply(null,arguments)},yg=b._emscripten_bind_Material_get_m_flags_0=function(){return(yg=b._emscripten_bind_Material_get_m_flags_0=b.asm.ze).apply(null,arguments)},zg=b._emscripten_bind_Material_set_m_flags_1=function(){return(zg=b._emscripten_bind_Material_set_m_flags_1=b.asm.Ae).apply(null,arguments)},Ag=b._emscripten_bind_Material___destroy___0=function(){return(Ag=b._emscripten_bind_Material___destroy___0=b.asm.Be).apply(null,arguments)},Bg=b._emscripten_bind_btDispatcherInfo_get_m_timeStep_0= function(){return(Bg=b._emscripten_bind_btDispatcherInfo_get_m_timeStep_0=b.asm.Ce).apply(null,arguments)},Cg=b._emscripten_bind_btDispatcherInfo_set_m_timeStep_1=function(){return(Cg=b._emscripten_bind_btDispatcherInfo_set_m_timeStep_1=b.asm.De).apply(null,arguments)},Dg=b._emscripten_bind_btDispatcherInfo_get_m_stepCount_0=function(){return(Dg=b._emscripten_bind_btDispatcherInfo_get_m_stepCount_0=b.asm.Ee).apply(null,arguments)},Eg=b._emscripten_bind_btDispatcherInfo_set_m_stepCount_1=function(){return(Eg= b._emscripten_bind_btDispatcherInfo_set_m_stepCount_1=b.asm.Fe).apply(null,arguments)},Fg=b._emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0=function(){return(Fg=b._emscripten_bind_btDispatcherInfo_get_m_dispatchFunc_0=b.asm.Ge).apply(null,arguments)},Gg=b._emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1=function(){return(Gg=b._emscripten_bind_btDispatcherInfo_set_m_dispatchFunc_1=b.asm.He).apply(null,arguments)},Hg=b._emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0=function(){return(Hg= b._emscripten_bind_btDispatcherInfo_get_m_timeOfImpact_0=b.asm.Ie).apply(null,arguments)},Ig=b._emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1=function(){return(Ig=b._emscripten_bind_btDispatcherInfo_set_m_timeOfImpact_1=b.asm.Je).apply(null,arguments)},Jg=b._emscripten_bind_btDispatcherInfo_get_m_useContinuous_0=function(){return(Jg=b._emscripten_bind_btDispatcherInfo_get_m_useContinuous_0=b.asm.Ke).apply(null,arguments)},Kg=b._emscripten_bind_btDispatcherInfo_set_m_useContinuous_1=function(){return(Kg= b._emscripten_bind_btDispatcherInfo_set_m_useContinuous_1=b.asm.Le).apply(null,arguments)},Lg=b._emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0=function(){return(Lg=b._emscripten_bind_btDispatcherInfo_get_m_enableSatConvex_0=b.asm.Me).apply(null,arguments)},Mg=b._emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1=function(){return(Mg=b._emscripten_bind_btDispatcherInfo_set_m_enableSatConvex_1=b.asm.Ne).apply(null,arguments)},Ng=b._emscripten_bind_btDispatcherInfo_get_m_enableSPU_0= function(){return(Ng=b._emscripten_bind_btDispatcherInfo_get_m_enableSPU_0=b.asm.Oe).apply(null,arguments)},Og=b._emscripten_bind_btDispatcherInfo_set_m_enableSPU_1=function(){return(Og=b._emscripten_bind_btDispatcherInfo_set_m_enableSPU_1=b.asm.Pe).apply(null,arguments)},Pg=b._emscripten_bind_btDispatcherInfo_get_m_useEpa_0=function(){return(Pg=b._emscripten_bind_btDispatcherInfo_get_m_useEpa_0=b.asm.Qe).apply(null,arguments)},Qg=b._emscripten_bind_btDispatcherInfo_set_m_useEpa_1=function(){return(Qg= b._emscripten_bind_btDispatcherInfo_set_m_useEpa_1=b.asm.Re).apply(null,arguments)},Rg=b._emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0=function(){return(Rg=b._emscripten_bind_btDispatcherInfo_get_m_allowedCcdPenetration_0=b.asm.Se).apply(null,arguments)},Sg=b._emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1=function(){return(Sg=b._emscripten_bind_btDispatcherInfo_set_m_allowedCcdPenetration_1=b.asm.Te).apply(null,arguments)},Tg=b._emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0= function(){return(Tg=b._emscripten_bind_btDispatcherInfo_get_m_useConvexConservativeDistanceUtil_0=b.asm.Ue).apply(null,arguments)},Ug=b._emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1=function(){return(Ug=b._emscripten_bind_btDispatcherInfo_set_m_useConvexConservativeDistanceUtil_1=b.asm.Ve).apply(null,arguments)},Vg=b._emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0=function(){return(Vg=b._emscripten_bind_btDispatcherInfo_get_m_convexConservativeDistanceThreshold_0= b.asm.We).apply(null,arguments)},Wg=b._emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1=function(){return(Wg=b._emscripten_bind_btDispatcherInfo_set_m_convexConservativeDistanceThreshold_1=b.asm.Xe).apply(null,arguments)},Xg=b._emscripten_bind_btDispatcherInfo___destroy___0=function(){return(Xg=b._emscripten_bind_btDispatcherInfo___destroy___0=b.asm.Ye).apply(null,arguments)},Yg=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0=function(){return(Yg= b._emscripten_bind_btWheelInfoConstructionInfo_get_m_chassisConnectionCS_0=b.asm.Ze).apply(null,arguments)},Zg=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1=function(){return(Zg=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_chassisConnectionCS_1=b.asm._e).apply(null,arguments)},$g=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0=function(){return($g=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelDirectionCS_0=b.asm.$e).apply(null, arguments)},ah=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1=function(){return(ah=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelDirectionCS_1=b.asm.af).apply(null,arguments)},bh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0=function(){return(bh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelAxleCS_0=b.asm.bf).apply(null,arguments)},ch=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1=function(){return(ch=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelAxleCS_1= b.asm.cf).apply(null,arguments)},dh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0=function(){return(dh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionRestLength_0=b.asm.df).apply(null,arguments)},eh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1=function(){return(eh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionRestLength_1=b.asm.ef).apply(null,arguments)},fh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0= function(){return(fh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionTravelCm_0=b.asm.ff).apply(null,arguments)},gh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1=function(){return(gh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionTravelCm_1=b.asm.gf).apply(null,arguments)},hh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0=function(){return(hh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelRadius_0=b.asm.hf).apply(null, arguments)},ih=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1=function(){return(ih=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelRadius_1=b.asm.jf).apply(null,arguments)},jh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0=function(){return(jh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_suspensionStiffness_0=b.asm.kf).apply(null,arguments)},kh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1=function(){return(kh= b._emscripten_bind_btWheelInfoConstructionInfo_set_m_suspensionStiffness_1=b.asm.lf).apply(null,arguments)},lh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0=function(){return(lh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingCompression_0=b.asm.mf).apply(null,arguments)},mh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1=function(){return(mh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingCompression_1= b.asm.nf).apply(null,arguments)},nh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0=function(){return(nh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_wheelsDampingRelaxation_0=b.asm.of).apply(null,arguments)},oh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1=function(){return(oh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_wheelsDampingRelaxation_1=b.asm.pf).apply(null,arguments)},ph=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0= function(){return(ph=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_frictionSlip_0=b.asm.qf).apply(null,arguments)},qh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1=function(){return(qh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_frictionSlip_1=b.asm.rf).apply(null,arguments)},rh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0=function(){return(rh=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_maxSuspensionForce_0=b.asm.sf).apply(null, arguments)},sh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1=function(){return(sh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_maxSuspensionForce_1=b.asm.tf).apply(null,arguments)},th=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0=function(){return(th=b._emscripten_bind_btWheelInfoConstructionInfo_get_m_bIsFrontWheel_0=b.asm.uf).apply(null,arguments)},uh=b._emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1=function(){return(uh= b._emscripten_bind_btWheelInfoConstructionInfo_set_m_bIsFrontWheel_1=b.asm.vf).apply(null,arguments)},vh=b._emscripten_bind_btWheelInfoConstructionInfo___destroy___0=function(){return(vh=b._emscripten_bind_btWheelInfoConstructionInfo___destroy___0=b.asm.wf).apply(null,arguments)},wh=b._emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1=function(){return(wh=b._emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_1=b.asm.xf).apply(null,arguments)},xh=b._emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2= function(){return(xh=b._emscripten_bind_btConvexTriangleMeshShape_btConvexTriangleMeshShape_2=b.asm.yf).apply(null,arguments)},yh=b._emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1=function(){return(yh=b._emscripten_bind_btConvexTriangleMeshShape_setLocalScaling_1=b.asm.zf).apply(null,arguments)},zh=b._emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0=function(){return(zh=b._emscripten_bind_btConvexTriangleMeshShape_getLocalScaling_0=b.asm.Af).apply(null,arguments)},Ah=b._emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2= function(){return(Ah=b._emscripten_bind_btConvexTriangleMeshShape_calculateLocalInertia_2=b.asm.Bf).apply(null,arguments)},Bh=b._emscripten_bind_btConvexTriangleMeshShape_setMargin_1=function(){return(Bh=b._emscripten_bind_btConvexTriangleMeshShape_setMargin_1=b.asm.Cf).apply(null,arguments)},Ch=b._emscripten_bind_btConvexTriangleMeshShape_getMargin_0=function(){return(Ch=b._emscripten_bind_btConvexTriangleMeshShape_getMargin_0=b.asm.Df).apply(null,arguments)},Dh=b._emscripten_bind_btConvexTriangleMeshShape___destroy___0= function(){return(Dh=b._emscripten_bind_btConvexTriangleMeshShape___destroy___0=b.asm.Ef).apply(null,arguments)},Eh=b._emscripten_bind_btBroadphaseInterface_getOverlappingPairCache_0=function(){return(Eh=b._emscripten_bind_btBroadphaseInterface_getOverlappingPairCache_0=b.asm.Ff).apply(null,arguments)},Fh=b._emscripten_bind_btBroadphaseInterface___destroy___0=function(){return(Fh=b._emscripten_bind_btBroadphaseInterface___destroy___0=b.asm.Gf).apply(null,arguments)},Gh=b._emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3= function(){return(Gh=b._emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_3=b.asm.Hf).apply(null,arguments)},Hh=b._emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4=function(){return(Hh=b._emscripten_bind_btRigidBodyConstructionInfo_btRigidBodyConstructionInfo_4=b.asm.If).apply(null,arguments)},Ih=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0=function(){return(Ih=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_linearDamping_0= b.asm.Jf).apply(null,arguments)},Jh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1=function(){return(Jh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_linearDamping_1=b.asm.Kf).apply(null,arguments)},Kh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0=function(){return(Kh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_angularDamping_0=b.asm.Lf).apply(null,arguments)},Lh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1=function(){return(Lh= b._emscripten_bind_btRigidBodyConstructionInfo_set_m_angularDamping_1=b.asm.Mf).apply(null,arguments)},Mh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0=function(){return(Mh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_friction_0=b.asm.Nf).apply(null,arguments)},Nh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1=function(){return(Nh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_friction_1=b.asm.Of).apply(null,arguments)},Oh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0= function(){return(Oh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_rollingFriction_0=b.asm.Pf).apply(null,arguments)},Ph=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1=function(){return(Ph=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_rollingFriction_1=b.asm.Qf).apply(null,arguments)},Qh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0=function(){return(Qh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_restitution_0=b.asm.Rf).apply(null, arguments)},Rh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1=function(){return(Rh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_restitution_1=b.asm.Sf).apply(null,arguments)},Sh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0=function(){return(Sh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_linearSleepingThreshold_0=b.asm.Tf).apply(null,arguments)},Th=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1=function(){return(Th= b._emscripten_bind_btRigidBodyConstructionInfo_set_m_linearSleepingThreshold_1=b.asm.Uf).apply(null,arguments)},Uh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0=function(){return(Uh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_angularSleepingThreshold_0=b.asm.Vf).apply(null,arguments)},Vh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1=function(){return(Vh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_angularSleepingThreshold_1= b.asm.Wf).apply(null,arguments)},Wh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0=function(){return(Wh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDamping_0=b.asm.Xf).apply(null,arguments)},Xh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1=function(){return(Xh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDamping_1=b.asm.Yf).apply(null,arguments)},Yh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0= function(){return(Yh=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalDampingFactor_0=b.asm.Zf).apply(null,arguments)},Zh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1=function(){return(Zh=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalDampingFactor_1=b.asm._f).apply(null,arguments)},$h=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0=function(){return($h=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalLinearDampingThresholdSqr_0= b.asm.$f).apply(null,arguments)},ai=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1=function(){return(ai=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalLinearDampingThresholdSqr_1=b.asm.ag).apply(null,arguments)},bi=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0=function(){return(bi=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingThresholdSqr_0=b.asm.bg).apply(null, arguments)},ci=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1=function(){return(ci=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingThresholdSqr_1=b.asm.cg).apply(null,arguments)},di=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0=function(){return(di=b._emscripten_bind_btRigidBodyConstructionInfo_get_m_additionalAngularDampingFactor_0=b.asm.dg).apply(null,arguments)},ei=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1= function(){return(ei=b._emscripten_bind_btRigidBodyConstructionInfo_set_m_additionalAngularDampingFactor_1=b.asm.eg).apply(null,arguments)},fi=b._emscripten_bind_btRigidBodyConstructionInfo___destroy___0=function(){return(fi=b._emscripten_bind_btRigidBodyConstructionInfo___destroy___0=b.asm.fg).apply(null,arguments)},gi=b._emscripten_bind_btCollisionConfiguration___destroy___0=function(){return(gi=b._emscripten_bind_btCollisionConfiguration___destroy___0=b.asm.gg).apply(null,arguments)},hi=b._emscripten_bind_btPersistentManifold_btPersistentManifold_0= function(){return(hi=b._emscripten_bind_btPersistentManifold_btPersistentManifold_0=b.asm.hg).apply(null,arguments)},ii=b._emscripten_bind_btPersistentManifold_getBody0_0=function(){return(ii=b._emscripten_bind_btPersistentManifold_getBody0_0=b.asm.ig).apply(null,arguments)},ji=b._emscripten_bind_btPersistentManifold_getBody1_0=function(){return(ji=b._emscripten_bind_btPersistentManifold_getBody1_0=b.asm.jg).apply(null,arguments)},ki=b._emscripten_bind_btPersistentManifold_getNumContacts_0=function(){return(ki= b._emscripten_bind_btPersistentManifold_getNumContacts_0=b.asm.kg).apply(null,arguments)},li=b._emscripten_bind_btPersistentManifold_getContactPoint_1=function(){return(li=b._emscripten_bind_btPersistentManifold_getContactPoint_1=b.asm.lg).apply(null,arguments)},mi=b._emscripten_bind_btPersistentManifold___destroy___0=function(){return(mi=b._emscripten_bind_btPersistentManifold___destroy___0=b.asm.mg).apply(null,arguments)},ni=b._emscripten_bind_btCompoundShape_btCompoundShape_0=function(){return(ni= b._emscripten_bind_btCompoundShape_btCompoundShape_0=b.asm.ng).apply(null,arguments)},oi=b._emscripten_bind_btCompoundShape_btCompoundShape_1=function(){return(oi=b._emscripten_bind_btCompoundShape_btCompoundShape_1=b.asm.og).apply(null,arguments)},pi=b._emscripten_bind_btCompoundShape_addChildShape_2=function(){return(pi=b._emscripten_bind_btCompoundShape_addChildShape_2=b.asm.pg).apply(null,arguments)},qi=b._emscripten_bind_btCompoundShape_removeChildShape_1=function(){return(qi=b._emscripten_bind_btCompoundShape_removeChildShape_1= b.asm.qg).apply(null,arguments)},ri=b._emscripten_bind_btCompoundShape_removeChildShapeByIndex_1=function(){return(ri=b._emscripten_bind_btCompoundShape_removeChildShapeByIndex_1=b.asm.rg).apply(null,arguments)},si=b._emscripten_bind_btCompoundShape_getNumChildShapes_0=function(){return(si=b._emscripten_bind_btCompoundShape_getNumChildShapes_0=b.asm.sg).apply(null,arguments)},ti=b._emscripten_bind_btCompoundShape_getChildShape_1=function(){return(ti=b._emscripten_bind_btCompoundShape_getChildShape_1= b.asm.tg).apply(null,arguments)},ui=b._emscripten_bind_btCompoundShape_updateChildTransform_2=function(){return(ui=b._emscripten_bind_btCompoundShape_updateChildTransform_2=b.asm.ug).apply(null,arguments)},vi=b._emscripten_bind_btCompoundShape_updateChildTransform_3=function(){return(vi=b._emscripten_bind_btCompoundShape_updateChildTransform_3=b.asm.vg).apply(null,arguments)},wi=b._emscripten_bind_btCompoundShape_setMargin_1=function(){return(wi=b._emscripten_bind_btCompoundShape_setMargin_1=b.asm.wg).apply(null, arguments)},xi=b._emscripten_bind_btCompoundShape_getMargin_0=function(){return(xi=b._emscripten_bind_btCompoundShape_getMargin_0=b.asm.xg).apply(null,arguments)},yi=b._emscripten_bind_btCompoundShape_setLocalScaling_1=function(){return(yi=b._emscripten_bind_btCompoundShape_setLocalScaling_1=b.asm.yg).apply(null,arguments)},zi=b._emscripten_bind_btCompoundShape_getLocalScaling_0=function(){return(zi=b._emscripten_bind_btCompoundShape_getLocalScaling_0=b.asm.zg).apply(null,arguments)},Ai=b._emscripten_bind_btCompoundShape_calculateLocalInertia_2= function(){return(Ai=b._emscripten_bind_btCompoundShape_calculateLocalInertia_2=b.asm.Ag).apply(null,arguments)},Bi=b._emscripten_bind_btCompoundShape___destroy___0=function(){return(Bi=b._emscripten_bind_btCompoundShape___destroy___0=b.asm.Bg).apply(null,arguments)},Ci=b._emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2=function(){return(Ci=b._emscripten_bind_ClosestConvexResultCallback_ClosestConvexResultCallback_2=b.asm.Cg).apply(null,arguments)},Di=b._emscripten_bind_ClosestConvexResultCallback_hasHit_0= function(){return(Di=b._emscripten_bind_ClosestConvexResultCallback_hasHit_0=b.asm.Dg).apply(null,arguments)},Ei=b._emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0=function(){return(Ei=b._emscripten_bind_ClosestConvexResultCallback_get_m_convexFromWorld_0=b.asm.Eg).apply(null,arguments)},Fi=b._emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1=function(){return(Fi=b._emscripten_bind_ClosestConvexResultCallback_set_m_convexFromWorld_1=b.asm.Fg).apply(null,arguments)}, Gi=b._emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0=function(){return(Gi=b._emscripten_bind_ClosestConvexResultCallback_get_m_convexToWorld_0=b.asm.Gg).apply(null,arguments)},Hi=b._emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1=function(){return(Hi=b._emscripten_bind_ClosestConvexResultCallback_set_m_convexToWorld_1=b.asm.Hg).apply(null,arguments)},Ii=b._emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0=function(){return(Ii=b._emscripten_bind_ClosestConvexResultCallback_get_m_hitNormalWorld_0= b.asm.Ig).apply(null,arguments)},Ji=b._emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1=function(){return(Ji=b._emscripten_bind_ClosestConvexResultCallback_set_m_hitNormalWorld_1=b.asm.Jg).apply(null,arguments)},Ki=b._emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0=function(){return(Ki=b._emscripten_bind_ClosestConvexResultCallback_get_m_hitPointWorld_0=b.asm.Kg).apply(null,arguments)},Li=b._emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1=function(){return(Li= b._emscripten_bind_ClosestConvexResultCallback_set_m_hitPointWorld_1=b.asm.Lg).apply(null,arguments)},Mi=b._emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0=function(){return(Mi=b._emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterGroup_0=b.asm.Mg).apply(null,arguments)},Ni=b._emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1=function(){return(Ni=b._emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterGroup_1=b.asm.Ng).apply(null, arguments)},Oi=b._emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0=function(){return(Oi=b._emscripten_bind_ClosestConvexResultCallback_get_m_collisionFilterMask_0=b.asm.Og).apply(null,arguments)},Pi=b._emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1=function(){return(Pi=b._emscripten_bind_ClosestConvexResultCallback_set_m_collisionFilterMask_1=b.asm.Pg).apply(null,arguments)},Qi=b._emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0= function(){return(Qi=b._emscripten_bind_ClosestConvexResultCallback_get_m_closestHitFraction_0=b.asm.Qg).apply(null,arguments)},Ri=b._emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1=function(){return(Ri=b._emscripten_bind_ClosestConvexResultCallback_set_m_closestHitFraction_1=b.asm.Rg).apply(null,arguments)},Si=b._emscripten_bind_ClosestConvexResultCallback___destroy___0=function(){return(Si=b._emscripten_bind_ClosestConvexResultCallback___destroy___0=b.asm.Sg).apply(null,arguments)}, Ti=b._emscripten_bind_AllHitsRayResultCallback_AllHitsRayResultCallback_2=function(){return(Ti=b._emscripten_bind_AllHitsRayResultCallback_AllHitsRayResultCallback_2=b.asm.Tg).apply(null,arguments)},Ui=b._emscripten_bind_AllHitsRayResultCallback_hasHit_0=function(){return(Ui=b._emscripten_bind_AllHitsRayResultCallback_hasHit_0=b.asm.Ug).apply(null,arguments)},Vi=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionObjects_0=function(){return(Vi=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionObjects_0= b.asm.Vg).apply(null,arguments)},Wi=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionObjects_1=function(){return(Wi=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionObjects_1=b.asm.Wg).apply(null,arguments)},Xi=b._emscripten_bind_AllHitsRayResultCallback_get_m_rayFromWorld_0=function(){return(Xi=b._emscripten_bind_AllHitsRayResultCallback_get_m_rayFromWorld_0=b.asm.Xg).apply(null,arguments)},Yi=b._emscripten_bind_AllHitsRayResultCallback_set_m_rayFromWorld_1=function(){return(Yi= b._emscripten_bind_AllHitsRayResultCallback_set_m_rayFromWorld_1=b.asm.Yg).apply(null,arguments)},Zi=b._emscripten_bind_AllHitsRayResultCallback_get_m_rayToWorld_0=function(){return(Zi=b._emscripten_bind_AllHitsRayResultCallback_get_m_rayToWorld_0=b.asm.Zg).apply(null,arguments)},$i=b._emscripten_bind_AllHitsRayResultCallback_set_m_rayToWorld_1=function(){return($i=b._emscripten_bind_AllHitsRayResultCallback_set_m_rayToWorld_1=b.asm._g).apply(null,arguments)},aj=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitNormalWorld_0= function(){return(aj=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitNormalWorld_0=b.asm.$g).apply(null,arguments)},bj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitNormalWorld_1=function(){return(bj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitNormalWorld_1=b.asm.ah).apply(null,arguments)},cj=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitPointWorld_0=function(){return(cj=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitPointWorld_0=b.asm.bh).apply(null,arguments)}, dj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitPointWorld_1=function(){return(dj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitPointWorld_1=b.asm.ch).apply(null,arguments)},ej=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitFractions_0=function(){return(ej=b._emscripten_bind_AllHitsRayResultCallback_get_m_hitFractions_0=b.asm.dh).apply(null,arguments)},fj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitFractions_1=function(){return(fj=b._emscripten_bind_AllHitsRayResultCallback_set_m_hitFractions_1= b.asm.eh).apply(null,arguments)},gj=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionFilterGroup_0=function(){return(gj=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionFilterGroup_0=b.asm.fh).apply(null,arguments)},hj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionFilterGroup_1=function(){return(hj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionFilterGroup_1=b.asm.gh).apply(null,arguments)},ij=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionFilterMask_0= function(){return(ij=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionFilterMask_0=b.asm.hh).apply(null,arguments)},jj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionFilterMask_1=function(){return(jj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionFilterMask_1=b.asm.ih).apply(null,arguments)},kj=b._emscripten_bind_AllHitsRayResultCallback_get_m_closestHitFraction_0=function(){return(kj=b._emscripten_bind_AllHitsRayResultCallback_get_m_closestHitFraction_0=b.asm.jh).apply(null, arguments)},lj=b._emscripten_bind_AllHitsRayResultCallback_set_m_closestHitFraction_1=function(){return(lj=b._emscripten_bind_AllHitsRayResultCallback_set_m_closestHitFraction_1=b.asm.kh).apply(null,arguments)},mj=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionObject_0=function(){return(mj=b._emscripten_bind_AllHitsRayResultCallback_get_m_collisionObject_0=b.asm.lh).apply(null,arguments)},nj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionObject_1=function(){return(nj=b._emscripten_bind_AllHitsRayResultCallback_set_m_collisionObject_1= b.asm.mh).apply(null,arguments)},oj=b._emscripten_bind_AllHitsRayResultCallback___destroy___0=function(){return(oj=b._emscripten_bind_AllHitsRayResultCallback___destroy___0=b.asm.nh).apply(null,arguments)},pj=b._emscripten_bind_tMaterialArray_size_0=function(){return(pj=b._emscripten_bind_tMaterialArray_size_0=b.asm.oh).apply(null,arguments)},qj=b._emscripten_bind_tMaterialArray_at_1=function(){return(qj=b._emscripten_bind_tMaterialArray_at_1=b.asm.ph).apply(null,arguments)},rj=b._emscripten_bind_tMaterialArray___destroy___0= function(){return(rj=b._emscripten_bind_tMaterialArray___destroy___0=b.asm.qh).apply(null,arguments)},sj=b._emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1=function(){return(sj=b._emscripten_bind_btDefaultVehicleRaycaster_btDefaultVehicleRaycaster_1=b.asm.rh).apply(null,arguments)},tj=b._emscripten_bind_btDefaultVehicleRaycaster_castRay_3=function(){return(tj=b._emscripten_bind_btDefaultVehicleRaycaster_castRay_3=b.asm.sh).apply(null,arguments)},uj=b._emscripten_bind_btDefaultVehicleRaycaster___destroy___0= function(){return(uj=b._emscripten_bind_btDefaultVehicleRaycaster___destroy___0=b.asm.th).apply(null,arguments)},vj=b._emscripten_bind_btEmptyShape_btEmptyShape_0=function(){return(vj=b._emscripten_bind_btEmptyShape_btEmptyShape_0=b.asm.uh).apply(null,arguments)},wj=b._emscripten_bind_btEmptyShape_setLocalScaling_1=function(){return(wj=b._emscripten_bind_btEmptyShape_setLocalScaling_1=b.asm.vh).apply(null,arguments)},xj=b._emscripten_bind_btEmptyShape_getLocalScaling_0=function(){return(xj=b._emscripten_bind_btEmptyShape_getLocalScaling_0= b.asm.wh).apply(null,arguments)},yj=b._emscripten_bind_btEmptyShape_calculateLocalInertia_2=function(){return(yj=b._emscripten_bind_btEmptyShape_calculateLocalInertia_2=b.asm.xh).apply(null,arguments)},zj=b._emscripten_bind_btEmptyShape___destroy___0=function(){return(zj=b._emscripten_bind_btEmptyShape___destroy___0=b.asm.yh).apply(null,arguments)},Aj=b._emscripten_bind_btConstraintSetting_btConstraintSetting_0=function(){return(Aj=b._emscripten_bind_btConstraintSetting_btConstraintSetting_0=b.asm.zh).apply(null, arguments)},Bj=b._emscripten_bind_btConstraintSetting_get_m_tau_0=function(){return(Bj=b._emscripten_bind_btConstraintSetting_get_m_tau_0=b.asm.Ah).apply(null,arguments)},Cj=b._emscripten_bind_btConstraintSetting_set_m_tau_1=function(){return(Cj=b._emscripten_bind_btConstraintSetting_set_m_tau_1=b.asm.Bh).apply(null,arguments)},Dj=b._emscripten_bind_btConstraintSetting_get_m_damping_0=function(){return(Dj=b._emscripten_bind_btConstraintSetting_get_m_damping_0=b.asm.Ch).apply(null,arguments)},Ej=b._emscripten_bind_btConstraintSetting_set_m_damping_1= function(){return(Ej=b._emscripten_bind_btConstraintSetting_set_m_damping_1=b.asm.Dh).apply(null,arguments)},Fj=b._emscripten_bind_btConstraintSetting_get_m_impulseClamp_0=function(){return(Fj=b._emscripten_bind_btConstraintSetting_get_m_impulseClamp_0=b.asm.Eh).apply(null,arguments)},Gj=b._emscripten_bind_btConstraintSetting_set_m_impulseClamp_1=function(){return(Gj=b._emscripten_bind_btConstraintSetting_set_m_impulseClamp_1=b.asm.Fh).apply(null,arguments)},Hj=b._emscripten_bind_btConstraintSetting___destroy___0= function(){return(Hj=b._emscripten_bind_btConstraintSetting___destroy___0=b.asm.Gh).apply(null,arguments)},Ij=b._emscripten_bind_LocalShapeInfo_get_m_shapePart_0=function(){return(Ij=b._emscripten_bind_LocalShapeInfo_get_m_shapePart_0=b.asm.Hh).apply(null,arguments)},Jj=b._emscripten_bind_LocalShapeInfo_set_m_shapePart_1=function(){return(Jj=b._emscripten_bind_LocalShapeInfo_set_m_shapePart_1=b.asm.Ih).apply(null,arguments)},Kj=b._emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0=function(){return(Kj= b._emscripten_bind_LocalShapeInfo_get_m_triangleIndex_0=b.asm.Jh).apply(null,arguments)},Lj=b._emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1=function(){return(Lj=b._emscripten_bind_LocalShapeInfo_set_m_triangleIndex_1=b.asm.Kh).apply(null,arguments)},Mj=b._emscripten_bind_LocalShapeInfo___destroy___0=function(){return(Mj=b._emscripten_bind_LocalShapeInfo___destroy___0=b.asm.Lh).apply(null,arguments)},Nj=b._emscripten_bind_btRigidBody_btRigidBody_1=function(){return(Nj=b._emscripten_bind_btRigidBody_btRigidBody_1= b.asm.Mh).apply(null,arguments)},Oj=b._emscripten_bind_btRigidBody_getCenterOfMassTransform_0=function(){return(Oj=b._emscripten_bind_btRigidBody_getCenterOfMassTransform_0=b.asm.Nh).apply(null,arguments)},Pj=b._emscripten_bind_btRigidBody_setCenterOfMassTransform_1=function(){return(Pj=b._emscripten_bind_btRigidBody_setCenterOfMassTransform_1=b.asm.Oh).apply(null,arguments)},Qj=b._emscripten_bind_btRigidBody_setSleepingThresholds_2=function(){return(Qj=b._emscripten_bind_btRigidBody_setSleepingThresholds_2= b.asm.Ph).apply(null,arguments)},Rj=b._emscripten_bind_btRigidBody_getLinearDamping_0=function(){return(Rj=b._emscripten_bind_btRigidBody_getLinearDamping_0=b.asm.Qh).apply(null,arguments)},Sj=b._emscripten_bind_btRigidBody_getAngularDamping_0=function(){return(Sj=b._emscripten_bind_btRigidBody_getAngularDamping_0=b.asm.Rh).apply(null,arguments)},Tj=b._emscripten_bind_btRigidBody_setDamping_2=function(){return(Tj=b._emscripten_bind_btRigidBody_setDamping_2=b.asm.Sh).apply(null,arguments)},Uj=b._emscripten_bind_btRigidBody_setMassProps_2= function(){return(Uj=b._emscripten_bind_btRigidBody_setMassProps_2=b.asm.Th).apply(null,arguments)},Vj=b._emscripten_bind_btRigidBody_getLinearFactor_0=function(){return(Vj=b._emscripten_bind_btRigidBody_getLinearFactor_0=b.asm.Uh).apply(null,arguments)},Wj=b._emscripten_bind_btRigidBody_setLinearFactor_1=function(){return(Wj=b._emscripten_bind_btRigidBody_setLinearFactor_1=b.asm.Vh).apply(null,arguments)},Xj=b._emscripten_bind_btRigidBody_applyTorque_1=function(){return(Xj=b._emscripten_bind_btRigidBody_applyTorque_1= b.asm.Wh).apply(null,arguments)},Yj=b._emscripten_bind_btRigidBody_applyLocalTorque_1=function(){return(Yj=b._emscripten_bind_btRigidBody_applyLocalTorque_1=b.asm.Xh).apply(null,arguments)},Zj=b._emscripten_bind_btRigidBody_applyForce_2=function(){return(Zj=b._emscripten_bind_btRigidBody_applyForce_2=b.asm.Yh).apply(null,arguments)},ak=b._emscripten_bind_btRigidBody_applyCentralForce_1=function(){return(ak=b._emscripten_bind_btRigidBody_applyCentralForce_1=b.asm.Zh).apply(null,arguments)},bk=b._emscripten_bind_btRigidBody_applyCentralLocalForce_1= function(){return(bk=b._emscripten_bind_btRigidBody_applyCentralLocalForce_1=b.asm._h).apply(null,arguments)},ck=b._emscripten_bind_btRigidBody_applyTorqueImpulse_1=function(){return(ck=b._emscripten_bind_btRigidBody_applyTorqueImpulse_1=b.asm.$h).apply(null,arguments)},dk=b._emscripten_bind_btRigidBody_applyImpulse_2=function(){return(dk=b._emscripten_bind_btRigidBody_applyImpulse_2=b.asm.ai).apply(null,arguments)},ek=b._emscripten_bind_btRigidBody_applyCentralImpulse_1=function(){return(ek=b._emscripten_bind_btRigidBody_applyCentralImpulse_1= b.asm.bi).apply(null,arguments)},fk=b._emscripten_bind_btRigidBody_updateInertiaTensor_0=function(){return(fk=b._emscripten_bind_btRigidBody_updateInertiaTensor_0=b.asm.ci).apply(null,arguments)},gk=b._emscripten_bind_btRigidBody_getLinearVelocity_0=function(){return(gk=b._emscripten_bind_btRigidBody_getLinearVelocity_0=b.asm.di).apply(null,arguments)},hk=b._emscripten_bind_btRigidBody_getAngularVelocity_0=function(){return(hk=b._emscripten_bind_btRigidBody_getAngularVelocity_0=b.asm.ei).apply(null, arguments)},ik=b._emscripten_bind_btRigidBody_setLinearVelocity_1=function(){return(ik=b._emscripten_bind_btRigidBody_setLinearVelocity_1=b.asm.fi).apply(null,arguments)},jk=b._emscripten_bind_btRigidBody_setAngularVelocity_1=function(){return(jk=b._emscripten_bind_btRigidBody_setAngularVelocity_1=b.asm.gi).apply(null,arguments)},kk=b._emscripten_bind_btRigidBody_getMotionState_0=function(){return(kk=b._emscripten_bind_btRigidBody_getMotionState_0=b.asm.hi).apply(null,arguments)},lk=b._emscripten_bind_btRigidBody_setMotionState_1= function(){return(lk=b._emscripten_bind_btRigidBody_setMotionState_1=b.asm.ii).apply(null,arguments)},mk=b._emscripten_bind_btRigidBody_getAngularFactor_0=function(){return(mk=b._emscripten_bind_btRigidBody_getAngularFactor_0=b.asm.ji).apply(null,arguments)},nk=b._emscripten_bind_btRigidBody_setAngularFactor_1=function(){return(nk=b._emscripten_bind_btRigidBody_setAngularFactor_1=b.asm.ki).apply(null,arguments)},ok=b._emscripten_bind_btRigidBody_upcast_1=function(){return(ok=b._emscripten_bind_btRigidBody_upcast_1= b.asm.li).apply(null,arguments)},pk=b._emscripten_bind_btRigidBody_getAabb_2=function(){return(pk=b._emscripten_bind_btRigidBody_getAabb_2=b.asm.mi).apply(null,arguments)},qk=b._emscripten_bind_btRigidBody_applyGravity_0=function(){return(qk=b._emscripten_bind_btRigidBody_applyGravity_0=b.asm.ni).apply(null,arguments)},rk=b._emscripten_bind_btRigidBody_getGravity_0=function(){return(rk=b._emscripten_bind_btRigidBody_getGravity_0=b.asm.oi).apply(null,arguments)},sk=b._emscripten_bind_btRigidBody_setGravity_1= function(){return(sk=b._emscripten_bind_btRigidBody_setGravity_1=b.asm.pi).apply(null,arguments)},tk=b._emscripten_bind_btRigidBody_getBroadphaseProxy_0=function(){return(tk=b._emscripten_bind_btRigidBody_getBroadphaseProxy_0=b.asm.qi).apply(null,arguments)},uk=b._emscripten_bind_btRigidBody_clearForces_0=function(){return(uk=b._emscripten_bind_btRigidBody_clearForces_0=b.asm.ri).apply(null,arguments)},vk=b._emscripten_bind_btRigidBody_setAnisotropicFriction_2=function(){return(vk=b._emscripten_bind_btRigidBody_setAnisotropicFriction_2= b.asm.si).apply(null,arguments)},wk=b._emscripten_bind_btRigidBody_getCollisionShape_0=function(){return(wk=b._emscripten_bind_btRigidBody_getCollisionShape_0=b.asm.ti).apply(null,arguments)},xk=b._emscripten_bind_btRigidBody_setContactProcessingThreshold_1=function(){return(xk=b._emscripten_bind_btRigidBody_setContactProcessingThreshold_1=b.asm.ui).apply(null,arguments)},yk=b._emscripten_bind_btRigidBody_setActivationState_1=function(){return(yk=b._emscripten_bind_btRigidBody_setActivationState_1= b.asm.vi).apply(null,arguments)},zk=b._emscripten_bind_btRigidBody_forceActivationState_1=function(){return(zk=b._emscripten_bind_btRigidBody_forceActivationState_1=b.asm.wi).apply(null,arguments)},Ak=b._emscripten_bind_btRigidBody_activate_0=function(){return(Ak=b._emscripten_bind_btRigidBody_activate_0=b.asm.xi).apply(null,arguments)},Bk=b._emscripten_bind_btRigidBody_activate_1=function(){return(Bk=b._emscripten_bind_btRigidBody_activate_1=b.asm.yi).apply(null,arguments)},Ck=b._emscripten_bind_btRigidBody_isActive_0= function(){return(Ck=b._emscripten_bind_btRigidBody_isActive_0=b.asm.zi).apply(null,arguments)},Dk=b._emscripten_bind_btRigidBody_isKinematicObject_0=function(){return(Dk=b._emscripten_bind_btRigidBody_isKinematicObject_0=b.asm.Ai).apply(null,arguments)},Ek=b._emscripten_bind_btRigidBody_isStaticObject_0=function(){return(Ek=b._emscripten_bind_btRigidBody_isStaticObject_0=b.asm.Bi).apply(null,arguments)},Fk=b._emscripten_bind_btRigidBody_isStaticOrKinematicObject_0=function(){return(Fk=b._emscripten_bind_btRigidBody_isStaticOrKinematicObject_0= b.asm.Ci).apply(null,arguments)},Gk=b._emscripten_bind_btRigidBody_getRestitution_0=function(){return(Gk=b._emscripten_bind_btRigidBody_getRestitution_0=b.asm.Di).apply(null,arguments)},Hk=b._emscripten_bind_btRigidBody_getFriction_0=function(){return(Hk=b._emscripten_bind_btRigidBody_getFriction_0=b.asm.Ei).apply(null,arguments)},Ik=b._emscripten_bind_btRigidBody_getRollingFriction_0=function(){return(Ik=b._emscripten_bind_btRigidBody_getRollingFriction_0=b.asm.Fi).apply(null,arguments)},Jk=b._emscripten_bind_btRigidBody_setRestitution_1= function(){return(Jk=b._emscripten_bind_btRigidBody_setRestitution_1=b.asm.Gi).apply(null,arguments)},Kk=b._emscripten_bind_btRigidBody_setFriction_1=function(){return(Kk=b._emscripten_bind_btRigidBody_setFriction_1=b.asm.Hi).apply(null,arguments)},Lk=b._emscripten_bind_btRigidBody_setRollingFriction_1=function(){return(Lk=b._emscripten_bind_btRigidBody_setRollingFriction_1=b.asm.Ii).apply(null,arguments)},Mk=b._emscripten_bind_btRigidBody_getWorldTransform_0=function(){return(Mk=b._emscripten_bind_btRigidBody_getWorldTransform_0= b.asm.Ji).apply(null,arguments)},Nk=b._emscripten_bind_btRigidBody_getCollisionFlags_0=function(){return(Nk=b._emscripten_bind_btRigidBody_getCollisionFlags_0=b.asm.Ki).apply(null,arguments)},Ok=b._emscripten_bind_btRigidBody_setCollisionFlags_1=function(){return(Ok=b._emscripten_bind_btRigidBody_setCollisionFlags_1=b.asm.Li).apply(null,arguments)},Pk=b._emscripten_bind_btRigidBody_setWorldTransform_1=function(){return(Pk=b._emscripten_bind_btRigidBody_setWorldTransform_1=b.asm.Mi).apply(null,arguments)}, Qk=b._emscripten_bind_btRigidBody_setCollisionShape_1=function(){return(Qk=b._emscripten_bind_btRigidBody_setCollisionShape_1=b.asm.Ni).apply(null,arguments)},Rk=b._emscripten_bind_btRigidBody_setCcdMotionThreshold_1=function(){return(Rk=b._emscripten_bind_btRigidBody_setCcdMotionThreshold_1=b.asm.Oi).apply(null,arguments)},Sk=b._emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1=function(){return(Sk=b._emscripten_bind_btRigidBody_setCcdSweptSphereRadius_1=b.asm.Pi).apply(null,arguments)},Tk=b._emscripten_bind_btRigidBody_getUserIndex_0= function(){return(Tk=b._emscripten_bind_btRigidBody_getUserIndex_0=b.asm.Qi).apply(null,arguments)},Uk=b._emscripten_bind_btRigidBody_setUserIndex_1=function(){return(Uk=b._emscripten_bind_btRigidBody_setUserIndex_1=b.asm.Ri).apply(null,arguments)},Vk=b._emscripten_bind_btRigidBody_getUserPointer_0=function(){return(Vk=b._emscripten_bind_btRigidBody_getUserPointer_0=b.asm.Si).apply(null,arguments)},Wk=b._emscripten_bind_btRigidBody_setUserPointer_1=function(){return(Wk=b._emscripten_bind_btRigidBody_setUserPointer_1= b.asm.Ti).apply(null,arguments)},Xk=b._emscripten_bind_btRigidBody_getBroadphaseHandle_0=function(){return(Xk=b._emscripten_bind_btRigidBody_getBroadphaseHandle_0=b.asm.Ui).apply(null,arguments)},Yk=b._emscripten_bind_btRigidBody___destroy___0=function(){return(Yk=b._emscripten_bind_btRigidBody___destroy___0=b.asm.Vi).apply(null,arguments)},Zk=b._emscripten_bind_btIndexedMeshArray_size_0=function(){return(Zk=b._emscripten_bind_btIndexedMeshArray_size_0=b.asm.Wi).apply(null,arguments)},$k=b._emscripten_bind_btIndexedMeshArray_at_1= function(){return($k=b._emscripten_bind_btIndexedMeshArray_at_1=b.asm.Xi).apply(null,arguments)},al=b._emscripten_bind_btIndexedMeshArray___destroy___0=function(){return(al=b._emscripten_bind_btIndexedMeshArray___destroy___0=b.asm.Yi).apply(null,arguments)},bl=b._emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0=function(){return(bl=b._emscripten_bind_btDbvtBroadphase_btDbvtBroadphase_0=b.asm.Zi).apply(null,arguments)},cl=b._emscripten_bind_btDbvtBroadphase___destroy___0=function(){return(cl=b._emscripten_bind_btDbvtBroadphase___destroy___0= b.asm._i).apply(null,arguments)},dl=b._emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9=function(){return(dl=b._emscripten_bind_btHeightfieldTerrainShape_btHeightfieldTerrainShape_9=b.asm.$i).apply(null,arguments)},el=b._emscripten_bind_btHeightfieldTerrainShape_setMargin_1=function(){return(el=b._emscripten_bind_btHeightfieldTerrainShape_setMargin_1=b.asm.aj).apply(null,arguments)},fl=b._emscripten_bind_btHeightfieldTerrainShape_getMargin_0=function(){return(fl=b._emscripten_bind_btHeightfieldTerrainShape_getMargin_0= b.asm.bj).apply(null,arguments)},gl=b._emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1=function(){return(gl=b._emscripten_bind_btHeightfieldTerrainShape_setLocalScaling_1=b.asm.cj).apply(null,arguments)},hl=b._emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0=function(){return(hl=b._emscripten_bind_btHeightfieldTerrainShape_getLocalScaling_0=b.asm.dj).apply(null,arguments)},il=b._emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2=function(){return(il=b._emscripten_bind_btHeightfieldTerrainShape_calculateLocalInertia_2= b.asm.ej).apply(null,arguments)},jl=b._emscripten_bind_btHeightfieldTerrainShape___destroy___0=function(){return(jl=b._emscripten_bind_btHeightfieldTerrainShape___destroy___0=b.asm.fj).apply(null,arguments)},kl=b._emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0=function(){return(kl=b._emscripten_bind_btDefaultSoftBodySolver_btDefaultSoftBodySolver_0=b.asm.gj).apply(null,arguments)},ll=b._emscripten_bind_btDefaultSoftBodySolver___destroy___0=function(){return(ll=b._emscripten_bind_btDefaultSoftBodySolver___destroy___0= b.asm.hj).apply(null,arguments)},ml=b._emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1=function(){return(ml=b._emscripten_bind_btCollisionDispatcher_btCollisionDispatcher_1=b.asm.ij).apply(null,arguments)},nl=b._emscripten_bind_btCollisionDispatcher_getNumManifolds_0=function(){return(nl=b._emscripten_bind_btCollisionDispatcher_getNumManifolds_0=b.asm.jj).apply(null,arguments)},ol=b._emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1=function(){return(ol=b._emscripten_bind_btCollisionDispatcher_getManifoldByIndexInternal_1= b.asm.kj).apply(null,arguments)},pl=b._emscripten_bind_btCollisionDispatcher___destroy___0=function(){return(pl=b._emscripten_bind_btCollisionDispatcher___destroy___0=b.asm.lj).apply(null,arguments)},ql=b._emscripten_bind_btAxisSweep3_btAxisSweep3_2=function(){return(ql=b._emscripten_bind_btAxisSweep3_btAxisSweep3_2=b.asm.mj).apply(null,arguments)},rl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_3=function(){return(rl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_3=b.asm.nj).apply(null,arguments)}, sl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_4=function(){return(sl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_4=b.asm.oj).apply(null,arguments)},tl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_5=function(){return(tl=b._emscripten_bind_btAxisSweep3_btAxisSweep3_5=b.asm.pj).apply(null,arguments)},ul=b._emscripten_bind_btAxisSweep3___destroy___0=function(){return(ul=b._emscripten_bind_btAxisSweep3___destroy___0=b.asm.qj).apply(null,arguments)},vl=b._emscripten_bind_VoidPtr___destroy___0=function(){return(vl= b._emscripten_bind_VoidPtr___destroy___0=b.asm.rj).apply(null,arguments)},wl=b._emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0=function(){return(wl=b._emscripten_bind_btSoftBodyWorldInfo_btSoftBodyWorldInfo_0=b.asm.sj).apply(null,arguments)},xl=b._emscripten_bind_btSoftBodyWorldInfo_get_air_density_0=function(){return(xl=b._emscripten_bind_btSoftBodyWorldInfo_get_air_density_0=b.asm.tj).apply(null,arguments)},yl=b._emscripten_bind_btSoftBodyWorldInfo_set_air_density_1=function(){return(yl= b._emscripten_bind_btSoftBodyWorldInfo_set_air_density_1=b.asm.uj).apply(null,arguments)},zl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_density_0=function(){return(zl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_density_0=b.asm.vj).apply(null,arguments)},Al=b._emscripten_bind_btSoftBodyWorldInfo_set_water_density_1=function(){return(Al=b._emscripten_bind_btSoftBodyWorldInfo_set_water_density_1=b.asm.wj).apply(null,arguments)},Bl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0= function(){return(Bl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_offset_0=b.asm.xj).apply(null,arguments)},Cl=b._emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1=function(){return(Cl=b._emscripten_bind_btSoftBodyWorldInfo_set_water_offset_1=b.asm.yj).apply(null,arguments)},Dl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0=function(){return(Dl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_maxDisplacement_0=b.asm.zj).apply(null,arguments)},El=b._emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1= function(){return(El=b._emscripten_bind_btSoftBodyWorldInfo_set_m_maxDisplacement_1=b.asm.Aj).apply(null,arguments)},Fl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0=function(){return(Fl=b._emscripten_bind_btSoftBodyWorldInfo_get_water_normal_0=b.asm.Bj).apply(null,arguments)},Gl=b._emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1=function(){return(Gl=b._emscripten_bind_btSoftBodyWorldInfo_set_water_normal_1=b.asm.Cj).apply(null,arguments)},Hl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0= function(){return(Hl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_broadphase_0=b.asm.Dj).apply(null,arguments)},Il=b._emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1=function(){return(Il=b._emscripten_bind_btSoftBodyWorldInfo_set_m_broadphase_1=b.asm.Ej).apply(null,arguments)},Jl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0=function(){return(Jl=b._emscripten_bind_btSoftBodyWorldInfo_get_m_dispatcher_0=b.asm.Fj).apply(null,arguments)},Kl=b._emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1= function(){return(Kl=b._emscripten_bind_btSoftBodyWorldInfo_set_m_dispatcher_1=b.asm.Gj).apply(null,arguments)},Ll=b._emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0=function(){return(Ll=b._emscripten_bind_btSoftBodyWorldInfo_get_m_gravity_0=b.asm.Hj).apply(null,arguments)},Ml=b._emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1=function(){return(Ml=b._emscripten_bind_btSoftBodyWorldInfo_set_m_gravity_1=b.asm.Ij).apply(null,arguments)},Nl=b._emscripten_bind_btSoftBodyWorldInfo___destroy___0= function(){return(Nl=b._emscripten_bind_btSoftBodyWorldInfo___destroy___0=b.asm.Jj).apply(null,arguments)},Ol=b._emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2=function(){return(Ol=b._emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_2=b.asm.Kj).apply(null,arguments)},Pl=b._emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4=function(){return(Pl=b._emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_4=b.asm.Lj).apply(null,arguments)},Ql=b._emscripten_bind_btConeTwistConstraint_setLimit_2= function(){return(Ql=b._emscripten_bind_btConeTwistConstraint_setLimit_2=b.asm.Mj).apply(null,arguments)},Rl=b._emscripten_bind_btConeTwistConstraint_setAngularOnly_1=function(){return(Rl=b._emscripten_bind_btConeTwistConstraint_setAngularOnly_1=b.asm.Nj).apply(null,arguments)},Sl=b._emscripten_bind_btConeTwistConstraint_setDamping_1=function(){return(Sl=b._emscripten_bind_btConeTwistConstraint_setDamping_1=b.asm.Oj).apply(null,arguments)},Tl=b._emscripten_bind_btConeTwistConstraint_enableMotor_1= function(){return(Tl=b._emscripten_bind_btConeTwistConstraint_enableMotor_1=b.asm.Pj).apply(null,arguments)},Ul=b._emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1=function(){return(Ul=b._emscripten_bind_btConeTwistConstraint_setMaxMotorImpulse_1=b.asm.Qj).apply(null,arguments)},Vl=b._emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1=function(){return(Vl=b._emscripten_bind_btConeTwistConstraint_setMaxMotorImpulseNormalized_1=b.asm.Rj).apply(null,arguments)},Wl=b._emscripten_bind_btConeTwistConstraint_setMotorTarget_1= function(){return(Wl=b._emscripten_bind_btConeTwistConstraint_setMotorTarget_1=b.asm.Sj).apply(null,arguments)},Xl=b._emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1=function(){return(Xl=b._emscripten_bind_btConeTwistConstraint_setMotorTargetInConstraintSpace_1=b.asm.Tj).apply(null,arguments)},Yl=b._emscripten_bind_btConeTwistConstraint_enableFeedback_1=function(){return(Yl=b._emscripten_bind_btConeTwistConstraint_enableFeedback_1=b.asm.Uj).apply(null,arguments)},Zl=b._emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0= function(){return(Zl=b._emscripten_bind_btConeTwistConstraint_getBreakingImpulseThreshold_0=b.asm.Vj).apply(null,arguments)},$l=b._emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1=function(){return($l=b._emscripten_bind_btConeTwistConstraint_setBreakingImpulseThreshold_1=b.asm.Wj).apply(null,arguments)},am=b._emscripten_bind_btConeTwistConstraint_getParam_2=function(){return(am=b._emscripten_bind_btConeTwistConstraint_getParam_2=b.asm.Xj).apply(null,arguments)},bm=b._emscripten_bind_btConeTwistConstraint_setParam_3= function(){return(bm=b._emscripten_bind_btConeTwistConstraint_setParam_3=b.asm.Yj).apply(null,arguments)},cm=b._emscripten_bind_btConeTwistConstraint___destroy___0=function(){return(cm=b._emscripten_bind_btConeTwistConstraint___destroy___0=b.asm.Zj).apply(null,arguments)},dm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_2=function(){return(dm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_2=b.asm._j).apply(null,arguments)},em=b._emscripten_bind_btHingeConstraint_btHingeConstraint_3= function(){return(em=b._emscripten_bind_btHingeConstraint_btHingeConstraint_3=b.asm.$j).apply(null,arguments)},fm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_4=function(){return(fm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_4=b.asm.ak).apply(null,arguments)},gm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_5=function(){return(gm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_5=b.asm.bk).apply(null,arguments)},hm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_6= function(){return(hm=b._emscripten_bind_btHingeConstraint_btHingeConstraint_6=b.asm.ck).apply(null,arguments)},im=b._emscripten_bind_btHingeConstraint_btHingeConstraint_7=function(){return(im=b._emscripten_bind_btHingeConstraint_btHingeConstraint_7=b.asm.dk).apply(null,arguments)},jm=b._emscripten_bind_btHingeConstraint_setLimit_4=function(){return(jm=b._emscripten_bind_btHingeConstraint_setLimit_4=b.asm.ek).apply(null,arguments)},km=b._emscripten_bind_btHingeConstraint_setLimit_5=function(){return(km= b._emscripten_bind_btHingeConstraint_setLimit_5=b.asm.fk).apply(null,arguments)},lm=b._emscripten_bind_btHingeConstraint_enableAngularMotor_3=function(){return(lm=b._emscripten_bind_btHingeConstraint_enableAngularMotor_3=b.asm.gk).apply(null,arguments)},mm=b._emscripten_bind_btHingeConstraint_setAngularOnly_1=function(){return(mm=b._emscripten_bind_btHingeConstraint_setAngularOnly_1=b.asm.hk).apply(null,arguments)},nm=b._emscripten_bind_btHingeConstraint_enableMotor_1=function(){return(nm=b._emscripten_bind_btHingeConstraint_enableMotor_1= b.asm.ik).apply(null,arguments)},om=b._emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1=function(){return(om=b._emscripten_bind_btHingeConstraint_setMaxMotorImpulse_1=b.asm.jk).apply(null,arguments)},pm=b._emscripten_bind_btHingeConstraint_setMotorTarget_2=function(){return(pm=b._emscripten_bind_btHingeConstraint_setMotorTarget_2=b.asm.kk).apply(null,arguments)},qm=b._emscripten_bind_btHingeConstraint_enableFeedback_1=function(){return(qm=b._emscripten_bind_btHingeConstraint_enableFeedback_1= b.asm.lk).apply(null,arguments)},rm=b._emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0=function(){return(rm=b._emscripten_bind_btHingeConstraint_getBreakingImpulseThreshold_0=b.asm.mk).apply(null,arguments)},sm=b._emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1=function(){return(sm=b._emscripten_bind_btHingeConstraint_setBreakingImpulseThreshold_1=b.asm.nk).apply(null,arguments)},tm=b._emscripten_bind_btHingeConstraint_getParam_2=function(){return(tm=b._emscripten_bind_btHingeConstraint_getParam_2= b.asm.ok).apply(null,arguments)},um=b._emscripten_bind_btHingeConstraint_setParam_3=function(){return(um=b._emscripten_bind_btHingeConstraint_setParam_3=b.asm.pk).apply(null,arguments)},wm=b._emscripten_bind_btHingeConstraint___destroy___0=function(){return(wm=b._emscripten_bind_btHingeConstraint___destroy___0=b.asm.qk).apply(null,arguments)},xm=b._emscripten_bind_btConeShapeZ_btConeShapeZ_2=function(){return(xm=b._emscripten_bind_btConeShapeZ_btConeShapeZ_2=b.asm.rk).apply(null,arguments)},ym=b._emscripten_bind_btConeShapeZ_setLocalScaling_1= function(){return(ym=b._emscripten_bind_btConeShapeZ_setLocalScaling_1=b.asm.sk).apply(null,arguments)},zm=b._emscripten_bind_btConeShapeZ_getLocalScaling_0=function(){return(zm=b._emscripten_bind_btConeShapeZ_getLocalScaling_0=b.asm.tk).apply(null,arguments)},Am=b._emscripten_bind_btConeShapeZ_calculateLocalInertia_2=function(){return(Am=b._emscripten_bind_btConeShapeZ_calculateLocalInertia_2=b.asm.uk).apply(null,arguments)},Bm=b._emscripten_bind_btConeShapeZ___destroy___0=function(){return(Bm=b._emscripten_bind_btConeShapeZ___destroy___0= b.asm.vk).apply(null,arguments)},Cm=b._emscripten_bind_btConeShapeX_btConeShapeX_2=function(){return(Cm=b._emscripten_bind_btConeShapeX_btConeShapeX_2=b.asm.wk).apply(null,arguments)},Dm=b._emscripten_bind_btConeShapeX_setLocalScaling_1=function(){return(Dm=b._emscripten_bind_btConeShapeX_setLocalScaling_1=b.asm.xk).apply(null,arguments)},Em=b._emscripten_bind_btConeShapeX_getLocalScaling_0=function(){return(Em=b._emscripten_bind_btConeShapeX_getLocalScaling_0=b.asm.yk).apply(null,arguments)},Fm= b._emscripten_bind_btConeShapeX_calculateLocalInertia_2=function(){return(Fm=b._emscripten_bind_btConeShapeX_calculateLocalInertia_2=b.asm.zk).apply(null,arguments)},Gm=b._emscripten_bind_btConeShapeX___destroy___0=function(){return(Gm=b._emscripten_bind_btConeShapeX___destroy___0=b.asm.Ak).apply(null,arguments)},Hm=b._emscripten_bind_btTriangleMesh_btTriangleMesh_0=function(){return(Hm=b._emscripten_bind_btTriangleMesh_btTriangleMesh_0=b.asm.Bk).apply(null,arguments)},Im=b._emscripten_bind_btTriangleMesh_btTriangleMesh_1= function(){return(Im=b._emscripten_bind_btTriangleMesh_btTriangleMesh_1=b.asm.Ck).apply(null,arguments)},Jm=b._emscripten_bind_btTriangleMesh_btTriangleMesh_2=function(){return(Jm=b._emscripten_bind_btTriangleMesh_btTriangleMesh_2=b.asm.Dk).apply(null,arguments)},Km=b._emscripten_bind_btTriangleMesh_addTriangle_3=function(){return(Km=b._emscripten_bind_btTriangleMesh_addTriangle_3=b.asm.Ek).apply(null,arguments)},Lm=b._emscripten_bind_btTriangleMesh_addTriangle_4=function(){return(Lm=b._emscripten_bind_btTriangleMesh_addTriangle_4= b.asm.Fk).apply(null,arguments)},Mm=b._emscripten_bind_btTriangleMesh_findOrAddVertex_2=function(){return(Mm=b._emscripten_bind_btTriangleMesh_findOrAddVertex_2=b.asm.Gk).apply(null,arguments)},Nm=b._emscripten_bind_btTriangleMesh_addIndex_1=function(){return(Nm=b._emscripten_bind_btTriangleMesh_addIndex_1=b.asm.Hk).apply(null,arguments)},Om=b._emscripten_bind_btTriangleMesh_getIndexedMeshArray_0=function(){return(Om=b._emscripten_bind_btTriangleMesh_getIndexedMeshArray_0=b.asm.Ik).apply(null,arguments)}, Pm=b._emscripten_bind_btTriangleMesh_setScaling_1=function(){return(Pm=b._emscripten_bind_btTriangleMesh_setScaling_1=b.asm.Jk).apply(null,arguments)},Qm=b._emscripten_bind_btTriangleMesh___destroy___0=function(){return(Qm=b._emscripten_bind_btTriangleMesh___destroy___0=b.asm.Kk).apply(null,arguments)},Rm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_0=function(){return(Rm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_0=b.asm.Lk).apply(null,arguments)},Sm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_1= function(){return(Sm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_1=b.asm.Mk).apply(null,arguments)},Tm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_2=function(){return(Tm=b._emscripten_bind_btConvexHullShape_btConvexHullShape_2=b.asm.Nk).apply(null,arguments)},Um=b._emscripten_bind_btConvexHullShape_addPoint_1=function(){return(Um=b._emscripten_bind_btConvexHullShape_addPoint_1=b.asm.Ok).apply(null,arguments)},Vm=b._emscripten_bind_btConvexHullShape_addPoint_2=function(){return(Vm= b._emscripten_bind_btConvexHullShape_addPoint_2=b.asm.Pk).apply(null,arguments)},Wm=b._emscripten_bind_btConvexHullShape_setMargin_1=function(){return(Wm=b._emscripten_bind_btConvexHullShape_setMargin_1=b.asm.Qk).apply(null,arguments)},Xm=b._emscripten_bind_btConvexHullShape_getMargin_0=function(){return(Xm=b._emscripten_bind_btConvexHullShape_getMargin_0=b.asm.Rk).apply(null,arguments)},Ym=b._emscripten_bind_btConvexHullShape_getNumVertices_0=function(){return(Ym=b._emscripten_bind_btConvexHullShape_getNumVertices_0= b.asm.Sk).apply(null,arguments)},Zm=b._emscripten_bind_btConvexHullShape_initializePolyhedralFeatures_1=function(){return(Zm=b._emscripten_bind_btConvexHullShape_initializePolyhedralFeatures_1=b.asm.Tk).apply(null,arguments)},$m=b._emscripten_bind_btConvexHullShape_recalcLocalAabb_0=function(){return($m=b._emscripten_bind_btConvexHullShape_recalcLocalAabb_0=b.asm.Uk).apply(null,arguments)},an=b._emscripten_bind_btConvexHullShape_getConvexPolyhedron_0=function(){return(an=b._emscripten_bind_btConvexHullShape_getConvexPolyhedron_0= b.asm.Vk).apply(null,arguments)},bn=b._emscripten_bind_btConvexHullShape_setLocalScaling_1=function(){return(bn=b._emscripten_bind_btConvexHullShape_setLocalScaling_1=b.asm.Wk).apply(null,arguments)},cn=b._emscripten_bind_btConvexHullShape_getLocalScaling_0=function(){return(cn=b._emscripten_bind_btConvexHullShape_getLocalScaling_0=b.asm.Xk).apply(null,arguments)},dn=b._emscripten_bind_btConvexHullShape_calculateLocalInertia_2=function(){return(dn=b._emscripten_bind_btConvexHullShape_calculateLocalInertia_2= b.asm.Yk).apply(null,arguments)},en=b._emscripten_bind_btConvexHullShape___destroy___0=function(){return(en=b._emscripten_bind_btConvexHullShape___destroy___0=b.asm.Zk).apply(null,arguments)},fn=b._emscripten_bind_btVehicleTuning_btVehicleTuning_0=function(){return(fn=b._emscripten_bind_btVehicleTuning_btVehicleTuning_0=b.asm._k).apply(null,arguments)},gn=b._emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0=function(){return(gn=b._emscripten_bind_btVehicleTuning_get_m_suspensionStiffness_0= b.asm.$k).apply(null,arguments)},hn=b._emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1=function(){return(hn=b._emscripten_bind_btVehicleTuning_set_m_suspensionStiffness_1=b.asm.al).apply(null,arguments)},jn=b._emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0=function(){return(jn=b._emscripten_bind_btVehicleTuning_get_m_suspensionCompression_0=b.asm.bl).apply(null,arguments)},kn=b._emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1=function(){return(kn=b._emscripten_bind_btVehicleTuning_set_m_suspensionCompression_1= b.asm.cl).apply(null,arguments)},ln=b._emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0=function(){return(ln=b._emscripten_bind_btVehicleTuning_get_m_suspensionDamping_0=b.asm.dl).apply(null,arguments)},mn=b._emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1=function(){return(mn=b._emscripten_bind_btVehicleTuning_set_m_suspensionDamping_1=b.asm.el).apply(null,arguments)},nn=b._emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0=function(){return(nn=b._emscripten_bind_btVehicleTuning_get_m_maxSuspensionTravelCm_0= b.asm.fl).apply(null,arguments)},on=b._emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1=function(){return(on=b._emscripten_bind_btVehicleTuning_set_m_maxSuspensionTravelCm_1=b.asm.gl).apply(null,arguments)},pn=b._emscripten_bind_btVehicleTuning_get_m_frictionSlip_0=function(){return(pn=b._emscripten_bind_btVehicleTuning_get_m_frictionSlip_0=b.asm.hl).apply(null,arguments)},qn=b._emscripten_bind_btVehicleTuning_set_m_frictionSlip_1=function(){return(qn=b._emscripten_bind_btVehicleTuning_set_m_frictionSlip_1= b.asm.il).apply(null,arguments)},rn=b._emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0=function(){return(rn=b._emscripten_bind_btVehicleTuning_get_m_maxSuspensionForce_0=b.asm.jl).apply(null,arguments)},sn=b._emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1=function(){return(sn=b._emscripten_bind_btVehicleTuning_set_m_maxSuspensionForce_1=b.asm.kl).apply(null,arguments)},tn=b._emscripten_bind_btCollisionObjectWrapper_getWorldTransform_0=function(){return(tn=b._emscripten_bind_btCollisionObjectWrapper_getWorldTransform_0= b.asm.ll).apply(null,arguments)},un=b._emscripten_bind_btCollisionObjectWrapper_getCollisionObject_0=function(){return(un=b._emscripten_bind_btCollisionObjectWrapper_getCollisionObject_0=b.asm.ml).apply(null,arguments)},vn=b._emscripten_bind_btCollisionObjectWrapper_getCollisionShape_0=function(){return(vn=b._emscripten_bind_btCollisionObjectWrapper_getCollisionShape_0=b.asm.nl).apply(null,arguments)},wn=b._emscripten_bind_btShapeHull_btShapeHull_1=function(){return(wn=b._emscripten_bind_btShapeHull_btShapeHull_1= b.asm.ol).apply(null,arguments)},xn=b._emscripten_bind_btShapeHull_buildHull_1=function(){return(xn=b._emscripten_bind_btShapeHull_buildHull_1=b.asm.pl).apply(null,arguments)},yn=b._emscripten_bind_btShapeHull_numVertices_0=function(){return(yn=b._emscripten_bind_btShapeHull_numVertices_0=b.asm.ql).apply(null,arguments)},zn=b._emscripten_bind_btShapeHull_getVertexPointer_0=function(){return(zn=b._emscripten_bind_btShapeHull_getVertexPointer_0=b.asm.rl).apply(null,arguments)},An=b._emscripten_bind_btShapeHull___destroy___0= function(){return(An=b._emscripten_bind_btShapeHull___destroy___0=b.asm.sl).apply(null,arguments)},Bn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_0=function(){return(Bn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_0=b.asm.tl).apply(null,arguments)},Cn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_1=function(){return(Cn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_1=b.asm.ul).apply(null,arguments)},Dn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_2= function(){return(Dn=b._emscripten_bind_btDefaultMotionState_btDefaultMotionState_2=b.asm.vl).apply(null,arguments)},En=b._emscripten_bind_btDefaultMotionState_getWorldTransform_1=function(){return(En=b._emscripten_bind_btDefaultMotionState_getWorldTransform_1=b.asm.wl).apply(null,arguments)},Fn=b._emscripten_bind_btDefaultMotionState_setWorldTransform_1=function(){return(Fn=b._emscripten_bind_btDefaultMotionState_setWorldTransform_1=b.asm.xl).apply(null,arguments)},Gn=b._emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0= function(){return(Gn=b._emscripten_bind_btDefaultMotionState_get_m_graphicsWorldTrans_0=b.asm.yl).apply(null,arguments)},Hn=b._emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1=function(){return(Hn=b._emscripten_bind_btDefaultMotionState_set_m_graphicsWorldTrans_1=b.asm.zl).apply(null,arguments)},In=b._emscripten_bind_btDefaultMotionState___destroy___0=function(){return(In=b._emscripten_bind_btDefaultMotionState___destroy___0=b.asm.Al).apply(null,arguments)},Jn=b._emscripten_bind_btWheelInfo_btWheelInfo_1= function(){return(Jn=b._emscripten_bind_btWheelInfo_btWheelInfo_1=b.asm.Bl).apply(null,arguments)},Kn=b._emscripten_bind_btWheelInfo_getSuspensionRestLength_0=function(){return(Kn=b._emscripten_bind_btWheelInfo_getSuspensionRestLength_0=b.asm.Cl).apply(null,arguments)},Ln=b._emscripten_bind_btWheelInfo_updateWheel_2=function(){return(Ln=b._emscripten_bind_btWheelInfo_updateWheel_2=b.asm.Dl).apply(null,arguments)},Mn=b._emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0=function(){return(Mn=b._emscripten_bind_btWheelInfo_get_m_suspensionStiffness_0= b.asm.El).apply(null,arguments)},Nn=b._emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1=function(){return(Nn=b._emscripten_bind_btWheelInfo_set_m_suspensionStiffness_1=b.asm.Fl).apply(null,arguments)},On=b._emscripten_bind_btWheelInfo_get_m_frictionSlip_0=function(){return(On=b._emscripten_bind_btWheelInfo_get_m_frictionSlip_0=b.asm.Gl).apply(null,arguments)},Pn=b._emscripten_bind_btWheelInfo_set_m_frictionSlip_1=function(){return(Pn=b._emscripten_bind_btWheelInfo_set_m_frictionSlip_1=b.asm.Hl).apply(null, arguments)},Qn=b._emscripten_bind_btWheelInfo_get_m_engineForce_0=function(){return(Qn=b._emscripten_bind_btWheelInfo_get_m_engineForce_0=b.asm.Il).apply(null,arguments)},Rn=b._emscripten_bind_btWheelInfo_set_m_engineForce_1=function(){return(Rn=b._emscripten_bind_btWheelInfo_set_m_engineForce_1=b.asm.Jl).apply(null,arguments)},Sn=b._emscripten_bind_btWheelInfo_get_m_rollInfluence_0=function(){return(Sn=b._emscripten_bind_btWheelInfo_get_m_rollInfluence_0=b.asm.Kl).apply(null,arguments)},Tn=b._emscripten_bind_btWheelInfo_set_m_rollInfluence_1= function(){return(Tn=b._emscripten_bind_btWheelInfo_set_m_rollInfluence_1=b.asm.Ll).apply(null,arguments)},Un=b._emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0=function(){return(Un=b._emscripten_bind_btWheelInfo_get_m_suspensionRestLength1_0=b.asm.Ml).apply(null,arguments)},Vn=b._emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1=function(){return(Vn=b._emscripten_bind_btWheelInfo_set_m_suspensionRestLength1_1=b.asm.Nl).apply(null,arguments)},Wn=b._emscripten_bind_btWheelInfo_get_m_wheelsRadius_0= function(){return(Wn=b._emscripten_bind_btWheelInfo_get_m_wheelsRadius_0=b.asm.Ol).apply(null,arguments)},Xn=b._emscripten_bind_btWheelInfo_set_m_wheelsRadius_1=function(){return(Xn=b._emscripten_bind_btWheelInfo_set_m_wheelsRadius_1=b.asm.Pl).apply(null,arguments)},Yn=b._emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0=function(){return(Yn=b._emscripten_bind_btWheelInfo_get_m_wheelsDampingCompression_0=b.asm.Ql).apply(null,arguments)},Zn=b._emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1= function(){return(Zn=b._emscripten_bind_btWheelInfo_set_m_wheelsDampingCompression_1=b.asm.Rl).apply(null,arguments)},$n=b._emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0=function(){return($n=b._emscripten_bind_btWheelInfo_get_m_wheelsDampingRelaxation_0=b.asm.Sl).apply(null,arguments)},ao=b._emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1=function(){return(ao=b._emscripten_bind_btWheelInfo_set_m_wheelsDampingRelaxation_1=b.asm.Tl).apply(null,arguments)},bo=b._emscripten_bind_btWheelInfo_get_m_steering_0= function(){return(bo=b._emscripten_bind_btWheelInfo_get_m_steering_0=b.asm.Ul).apply(null,arguments)},co=b._emscripten_bind_btWheelInfo_set_m_steering_1=function(){return(co=b._emscripten_bind_btWheelInfo_set_m_steering_1=b.asm.Vl).apply(null,arguments)},eo=b._emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0=function(){return(eo=b._emscripten_bind_btWheelInfo_get_m_maxSuspensionForce_0=b.asm.Wl).apply(null,arguments)},fo=b._emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1=function(){return(fo= b._emscripten_bind_btWheelInfo_set_m_maxSuspensionForce_1=b.asm.Xl).apply(null,arguments)},go=b._emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0=function(){return(go=b._emscripten_bind_btWheelInfo_get_m_maxSuspensionTravelCm_0=b.asm.Yl).apply(null,arguments)},ho=b._emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1=function(){return(ho=b._emscripten_bind_btWheelInfo_set_m_maxSuspensionTravelCm_1=b.asm.Zl).apply(null,arguments)},io=b._emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0= function(){return(io=b._emscripten_bind_btWheelInfo_get_m_wheelsSuspensionForce_0=b.asm._l).apply(null,arguments)},jo=b._emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1=function(){return(jo=b._emscripten_bind_btWheelInfo_set_m_wheelsSuspensionForce_1=b.asm.$l).apply(null,arguments)},ko=b._emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0=function(){return(ko=b._emscripten_bind_btWheelInfo_get_m_bIsFrontWheel_0=b.asm.am).apply(null,arguments)},lo=b._emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1= function(){return(lo=b._emscripten_bind_btWheelInfo_set_m_bIsFrontWheel_1=b.asm.bm).apply(null,arguments)},mo=b._emscripten_bind_btWheelInfo_get_m_raycastInfo_0=function(){return(mo=b._emscripten_bind_btWheelInfo_get_m_raycastInfo_0=b.asm.cm).apply(null,arguments)},no=b._emscripten_bind_btWheelInfo_set_m_raycastInfo_1=function(){return(no=b._emscripten_bind_btWheelInfo_set_m_raycastInfo_1=b.asm.dm).apply(null,arguments)},oo=b._emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0=function(){return(oo= b._emscripten_bind_btWheelInfo_get_m_chassisConnectionPointCS_0=b.asm.em).apply(null,arguments)},po=b._emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1=function(){return(po=b._emscripten_bind_btWheelInfo_set_m_chassisConnectionPointCS_1=b.asm.fm).apply(null,arguments)},qo=b._emscripten_bind_btWheelInfo_get_m_worldTransform_0=function(){return(qo=b._emscripten_bind_btWheelInfo_get_m_worldTransform_0=b.asm.gm).apply(null,arguments)},ro=b._emscripten_bind_btWheelInfo_set_m_worldTransform_1= function(){return(ro=b._emscripten_bind_btWheelInfo_set_m_worldTransform_1=b.asm.hm).apply(null,arguments)},so=b._emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0=function(){return(so=b._emscripten_bind_btWheelInfo_get_m_wheelDirectionCS_0=b.asm.im).apply(null,arguments)},to=b._emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1=function(){return(to=b._emscripten_bind_btWheelInfo_set_m_wheelDirectionCS_1=b.asm.jm).apply(null,arguments)},uo=b._emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0=function(){return(uo= b._emscripten_bind_btWheelInfo_get_m_wheelAxleCS_0=b.asm.km).apply(null,arguments)},vo=b._emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1=function(){return(vo=b._emscripten_bind_btWheelInfo_set_m_wheelAxleCS_1=b.asm.lm).apply(null,arguments)},wo=b._emscripten_bind_btWheelInfo_get_m_rotation_0=function(){return(wo=b._emscripten_bind_btWheelInfo_get_m_rotation_0=b.asm.mm).apply(null,arguments)},xo=b._emscripten_bind_btWheelInfo_set_m_rotation_1=function(){return(xo=b._emscripten_bind_btWheelInfo_set_m_rotation_1= b.asm.nm).apply(null,arguments)},yo=b._emscripten_bind_btWheelInfo_get_m_deltaRotation_0=function(){return(yo=b._emscripten_bind_btWheelInfo_get_m_deltaRotation_0=b.asm.om).apply(null,arguments)},zo=b._emscripten_bind_btWheelInfo_set_m_deltaRotation_1=function(){return(zo=b._emscripten_bind_btWheelInfo_set_m_deltaRotation_1=b.asm.pm).apply(null,arguments)},Ao=b._emscripten_bind_btWheelInfo_get_m_brake_0=function(){return(Ao=b._emscripten_bind_btWheelInfo_get_m_brake_0=b.asm.qm).apply(null,arguments)}, Bo=b._emscripten_bind_btWheelInfo_set_m_brake_1=function(){return(Bo=b._emscripten_bind_btWheelInfo_set_m_brake_1=b.asm.rm).apply(null,arguments)},Co=b._emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0=function(){return(Co=b._emscripten_bind_btWheelInfo_get_m_clippedInvContactDotSuspension_0=b.asm.sm).apply(null,arguments)},Do=b._emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1=function(){return(Do=b._emscripten_bind_btWheelInfo_set_m_clippedInvContactDotSuspension_1= b.asm.tm).apply(null,arguments)},Eo=b._emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0=function(){return(Eo=b._emscripten_bind_btWheelInfo_get_m_suspensionRelativeVelocity_0=b.asm.um).apply(null,arguments)},Fo=b._emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1=function(){return(Fo=b._emscripten_bind_btWheelInfo_set_m_suspensionRelativeVelocity_1=b.asm.vm).apply(null,arguments)},Go=b._emscripten_bind_btWheelInfo_get_m_skidInfo_0=function(){return(Go=b._emscripten_bind_btWheelInfo_get_m_skidInfo_0= b.asm.wm).apply(null,arguments)},Ho=b._emscripten_bind_btWheelInfo_set_m_skidInfo_1=function(){return(Ho=b._emscripten_bind_btWheelInfo_set_m_skidInfo_1=b.asm.xm).apply(null,arguments)},Io=b._emscripten_bind_btWheelInfo___destroy___0=function(){return(Io=b._emscripten_bind_btWheelInfo___destroy___0=b.asm.ym).apply(null,arguments)},Jo=b._emscripten_bind_btVector4_btVector4_0=function(){return(Jo=b._emscripten_bind_btVector4_btVector4_0=b.asm.zm).apply(null,arguments)},Ko=b._emscripten_bind_btVector4_btVector4_4= function(){return(Ko=b._emscripten_bind_btVector4_btVector4_4=b.asm.Am).apply(null,arguments)},Lo=b._emscripten_bind_btVector4_w_0=function(){return(Lo=b._emscripten_bind_btVector4_w_0=b.asm.Bm).apply(null,arguments)},Mo=b._emscripten_bind_btVector4_setValue_4=function(){return(Mo=b._emscripten_bind_btVector4_setValue_4=b.asm.Cm).apply(null,arguments)},No=b._emscripten_bind_btVector4_length_0=function(){return(No=b._emscripten_bind_btVector4_length_0=b.asm.Dm).apply(null,arguments)},Oo=b._emscripten_bind_btVector4_x_0= function(){return(Oo=b._emscripten_bind_btVector4_x_0=b.asm.Em).apply(null,arguments)},Po=b._emscripten_bind_btVector4_y_0=function(){return(Po=b._emscripten_bind_btVector4_y_0=b.asm.Fm).apply(null,arguments)},Qo=b._emscripten_bind_btVector4_z_0=function(){return(Qo=b._emscripten_bind_btVector4_z_0=b.asm.Gm).apply(null,arguments)},Ro=b._emscripten_bind_btVector4_setX_1=function(){return(Ro=b._emscripten_bind_btVector4_setX_1=b.asm.Hm).apply(null,arguments)},So=b._emscripten_bind_btVector4_setY_1= function(){return(So=b._emscripten_bind_btVector4_setY_1=b.asm.Im).apply(null,arguments)},To=b._emscripten_bind_btVector4_setZ_1=function(){return(To=b._emscripten_bind_btVector4_setZ_1=b.asm.Jm).apply(null,arguments)},Uo=b._emscripten_bind_btVector4_normalize_0=function(){return(Uo=b._emscripten_bind_btVector4_normalize_0=b.asm.Km).apply(null,arguments)},Vo=b._emscripten_bind_btVector4_rotate_2=function(){return(Vo=b._emscripten_bind_btVector4_rotate_2=b.asm.Lm).apply(null,arguments)},Wo=b._emscripten_bind_btVector4_dot_1= function(){return(Wo=b._emscripten_bind_btVector4_dot_1=b.asm.Mm).apply(null,arguments)},Xo=b._emscripten_bind_btVector4_op_mul_1=function(){return(Xo=b._emscripten_bind_btVector4_op_mul_1=b.asm.Nm).apply(null,arguments)},Yo=b._emscripten_bind_btVector4_op_add_1=function(){return(Yo=b._emscripten_bind_btVector4_op_add_1=b.asm.Om).apply(null,arguments)},Zo=b._emscripten_bind_btVector4_op_sub_1=function(){return(Zo=b._emscripten_bind_btVector4_op_sub_1=b.asm.Pm).apply(null,arguments)},$o=b._emscripten_bind_btVector4___destroy___0= function(){return($o=b._emscripten_bind_btVector4___destroy___0=b.asm.Qm).apply(null,arguments)},ap=b._emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0=function(){return(ap=b._emscripten_bind_btDefaultCollisionConstructionInfo_btDefaultCollisionConstructionInfo_0=b.asm.Rm).apply(null,arguments)},bp=b._emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0=function(){return(bp=b._emscripten_bind_btDefaultCollisionConstructionInfo___destroy___0=b.asm.Sm).apply(null, arguments)},cp=b._emscripten_bind_Anchor_get_m_node_0=function(){return(cp=b._emscripten_bind_Anchor_get_m_node_0=b.asm.Tm).apply(null,arguments)},dp=b._emscripten_bind_Anchor_set_m_node_1=function(){return(dp=b._emscripten_bind_Anchor_set_m_node_1=b.asm.Um).apply(null,arguments)},ep=b._emscripten_bind_Anchor_get_m_local_0=function(){return(ep=b._emscripten_bind_Anchor_get_m_local_0=b.asm.Vm).apply(null,arguments)},fp=b._emscripten_bind_Anchor_set_m_local_1=function(){return(fp=b._emscripten_bind_Anchor_set_m_local_1= b.asm.Wm).apply(null,arguments)},gp=b._emscripten_bind_Anchor_get_m_body_0=function(){return(gp=b._emscripten_bind_Anchor_get_m_body_0=b.asm.Xm).apply(null,arguments)},hp=b._emscripten_bind_Anchor_set_m_body_1=function(){return(hp=b._emscripten_bind_Anchor_set_m_body_1=b.asm.Ym).apply(null,arguments)},ip=b._emscripten_bind_Anchor_get_m_influence_0=function(){return(ip=b._emscripten_bind_Anchor_get_m_influence_0=b.asm.Zm).apply(null,arguments)},jp=b._emscripten_bind_Anchor_set_m_influence_1=function(){return(jp= b._emscripten_bind_Anchor_set_m_influence_1=b.asm._m).apply(null,arguments)},kp=b._emscripten_bind_Anchor_get_m_c0_0=function(){return(kp=b._emscripten_bind_Anchor_get_m_c0_0=b.asm.$m).apply(null,arguments)},lp=b._emscripten_bind_Anchor_set_m_c0_1=function(){return(lp=b._emscripten_bind_Anchor_set_m_c0_1=b.asm.an).apply(null,arguments)},mp=b._emscripten_bind_Anchor_get_m_c1_0=function(){return(mp=b._emscripten_bind_Anchor_get_m_c1_0=b.asm.bn).apply(null,arguments)},np=b._emscripten_bind_Anchor_set_m_c1_1= function(){return(np=b._emscripten_bind_Anchor_set_m_c1_1=b.asm.cn).apply(null,arguments)},op=b._emscripten_bind_Anchor_get_m_c2_0=function(){return(op=b._emscripten_bind_Anchor_get_m_c2_0=b.asm.dn).apply(null,arguments)},pp=b._emscripten_bind_Anchor_set_m_c2_1=function(){return(pp=b._emscripten_bind_Anchor_set_m_c2_1=b.asm.en).apply(null,arguments)},qp=b._emscripten_bind_Anchor___destroy___0=function(){return(qp=b._emscripten_bind_Anchor___destroy___0=b.asm.fn).apply(null,arguments)},rp=b._emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0= function(){return(rp=b._emscripten_bind_btVehicleRaycasterResult_get_m_hitPointInWorld_0=b.asm.gn).apply(null,arguments)},sp=b._emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1=function(){return(sp=b._emscripten_bind_btVehicleRaycasterResult_set_m_hitPointInWorld_1=b.asm.hn).apply(null,arguments)},tp=b._emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0=function(){return(tp=b._emscripten_bind_btVehicleRaycasterResult_get_m_hitNormalInWorld_0=b.asm.jn).apply(null,arguments)}, up=b._emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1=function(){return(up=b._emscripten_bind_btVehicleRaycasterResult_set_m_hitNormalInWorld_1=b.asm.kn).apply(null,arguments)},vp=b._emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0=function(){return(vp=b._emscripten_bind_btVehicleRaycasterResult_get_m_distFraction_0=b.asm.ln).apply(null,arguments)},wp=b._emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1=function(){return(wp=b._emscripten_bind_btVehicleRaycasterResult_set_m_distFraction_1= b.asm.mn).apply(null,arguments)},xp=b._emscripten_bind_btVehicleRaycasterResult___destroy___0=function(){return(xp=b._emscripten_bind_btVehicleRaycasterResult___destroy___0=b.asm.nn).apply(null,arguments)},yp=b._emscripten_bind_btVector3Array_size_0=function(){return(yp=b._emscripten_bind_btVector3Array_size_0=b.asm.on).apply(null,arguments)},zp=b._emscripten_bind_btVector3Array_at_1=function(){return(zp=b._emscripten_bind_btVector3Array_at_1=b.asm.pn).apply(null,arguments)},Ap=b._emscripten_bind_btVector3Array___destroy___0= function(){return(Ap=b._emscripten_bind_btVector3Array___destroy___0=b.asm.qn).apply(null,arguments)},Bp=b._emscripten_bind_btConstraintSolver___destroy___0=function(){return(Bp=b._emscripten_bind_btConstraintSolver___destroy___0=b.asm.rn).apply(null,arguments)},Cp=b._emscripten_bind_btRaycastVehicle_btRaycastVehicle_3=function(){return(Cp=b._emscripten_bind_btRaycastVehicle_btRaycastVehicle_3=b.asm.sn).apply(null,arguments)},Dp=b._emscripten_bind_btRaycastVehicle_applyEngineForce_2=function(){return(Dp= b._emscripten_bind_btRaycastVehicle_applyEngineForce_2=b.asm.tn).apply(null,arguments)},Ep=b._emscripten_bind_btRaycastVehicle_setSteeringValue_2=function(){return(Ep=b._emscripten_bind_btRaycastVehicle_setSteeringValue_2=b.asm.un).apply(null,arguments)},Fp=b._emscripten_bind_btRaycastVehicle_getWheelTransformWS_1=function(){return(Fp=b._emscripten_bind_btRaycastVehicle_getWheelTransformWS_1=b.asm.vn).apply(null,arguments)},Gp=b._emscripten_bind_btRaycastVehicle_updateWheelTransform_2=function(){return(Gp= b._emscripten_bind_btRaycastVehicle_updateWheelTransform_2=b.asm.wn).apply(null,arguments)},Hp=b._emscripten_bind_btRaycastVehicle_addWheel_7=function(){return(Hp=b._emscripten_bind_btRaycastVehicle_addWheel_7=b.asm.xn).apply(null,arguments)},Ip=b._emscripten_bind_btRaycastVehicle_getNumWheels_0=function(){return(Ip=b._emscripten_bind_btRaycastVehicle_getNumWheels_0=b.asm.yn).apply(null,arguments)},Jp=b._emscripten_bind_btRaycastVehicle_getRigidBody_0=function(){return(Jp=b._emscripten_bind_btRaycastVehicle_getRigidBody_0= b.asm.zn).apply(null,arguments)},Kp=b._emscripten_bind_btRaycastVehicle_getWheelInfo_1=function(){return(Kp=b._emscripten_bind_btRaycastVehicle_getWheelInfo_1=b.asm.An).apply(null,arguments)},Lp=b._emscripten_bind_btRaycastVehicle_setBrake_2=function(){return(Lp=b._emscripten_bind_btRaycastVehicle_setBrake_2=b.asm.Bn).apply(null,arguments)},Mp=b._emscripten_bind_btRaycastVehicle_setCoordinateSystem_3=function(){return(Mp=b._emscripten_bind_btRaycastVehicle_setCoordinateSystem_3=b.asm.Cn).apply(null, arguments)},Np=b._emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0=function(){return(Np=b._emscripten_bind_btRaycastVehicle_getCurrentSpeedKmHour_0=b.asm.Dn).apply(null,arguments)},Op=b._emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0=function(){return(Op=b._emscripten_bind_btRaycastVehicle_getChassisWorldTransform_0=b.asm.En).apply(null,arguments)},Pp=b._emscripten_bind_btRaycastVehicle_rayCast_1=function(){return(Pp=b._emscripten_bind_btRaycastVehicle_rayCast_1=b.asm.Fn).apply(null, arguments)},Qp=b._emscripten_bind_btRaycastVehicle_updateVehicle_1=function(){return(Qp=b._emscripten_bind_btRaycastVehicle_updateVehicle_1=b.asm.Gn).apply(null,arguments)},Rp=b._emscripten_bind_btRaycastVehicle_resetSuspension_0=function(){return(Rp=b._emscripten_bind_btRaycastVehicle_resetSuspension_0=b.asm.Hn).apply(null,arguments)},Sp=b._emscripten_bind_btRaycastVehicle_getSteeringValue_1=function(){return(Sp=b._emscripten_bind_btRaycastVehicle_getSteeringValue_1=b.asm.In).apply(null,arguments)}, Tp=b._emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1=function(){return(Tp=b._emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_1=b.asm.Jn).apply(null,arguments)},Up=b._emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2=function(){return(Up=b._emscripten_bind_btRaycastVehicle_updateWheelTransformsWS_2=b.asm.Kn).apply(null,arguments)},Vp=b._emscripten_bind_btRaycastVehicle_setPitchControl_1=function(){return(Vp=b._emscripten_bind_btRaycastVehicle_setPitchControl_1=b.asm.Ln).apply(null, arguments)},Wp=b._emscripten_bind_btRaycastVehicle_updateSuspension_1=function(){return(Wp=b._emscripten_bind_btRaycastVehicle_updateSuspension_1=b.asm.Mn).apply(null,arguments)},Xp=b._emscripten_bind_btRaycastVehicle_updateFriction_1=function(){return(Xp=b._emscripten_bind_btRaycastVehicle_updateFriction_1=b.asm.Nn).apply(null,arguments)},Yp=b._emscripten_bind_btRaycastVehicle_getRightAxis_0=function(){return(Yp=b._emscripten_bind_btRaycastVehicle_getRightAxis_0=b.asm.On).apply(null,arguments)}, Zp=b._emscripten_bind_btRaycastVehicle_getUpAxis_0=function(){return(Zp=b._emscripten_bind_btRaycastVehicle_getUpAxis_0=b.asm.Pn).apply(null,arguments)},$p=b._emscripten_bind_btRaycastVehicle_getForwardAxis_0=function(){return($p=b._emscripten_bind_btRaycastVehicle_getForwardAxis_0=b.asm.Qn).apply(null,arguments)},aq=b._emscripten_bind_btRaycastVehicle_getForwardVector_0=function(){return(aq=b._emscripten_bind_btRaycastVehicle_getForwardVector_0=b.asm.Rn).apply(null,arguments)},bq=b._emscripten_bind_btRaycastVehicle_getUserConstraintType_0= function(){return(bq=b._emscripten_bind_btRaycastVehicle_getUserConstraintType_0=b.asm.Sn).apply(null,arguments)},cq=b._emscripten_bind_btRaycastVehicle_setUserConstraintType_1=function(){return(cq=b._emscripten_bind_btRaycastVehicle_setUserConstraintType_1=b.asm.Tn).apply(null,arguments)},dq=b._emscripten_bind_btRaycastVehicle_setUserConstraintId_1=function(){return(dq=b._emscripten_bind_btRaycastVehicle_setUserConstraintId_1=b.asm.Un).apply(null,arguments)},eq=b._emscripten_bind_btRaycastVehicle_getUserConstraintId_0= function(){return(eq=b._emscripten_bind_btRaycastVehicle_getUserConstraintId_0=b.asm.Vn).apply(null,arguments)},fq=b._emscripten_bind_btRaycastVehicle_updateAction_2=function(){return(fq=b._emscripten_bind_btRaycastVehicle_updateAction_2=b.asm.Wn).apply(null,arguments)},gq=b._emscripten_bind_btRaycastVehicle___destroy___0=function(){return(gq=b._emscripten_bind_btRaycastVehicle___destroy___0=b.asm.Xn).apply(null,arguments)},hq=b._emscripten_bind_btCylinderShapeX_btCylinderShapeX_1=function(){return(hq= b._emscripten_bind_btCylinderShapeX_btCylinderShapeX_1=b.asm.Yn).apply(null,arguments)},iq=b._emscripten_bind_btCylinderShapeX_setMargin_1=function(){return(iq=b._emscripten_bind_btCylinderShapeX_setMargin_1=b.asm.Zn).apply(null,arguments)},jq=b._emscripten_bind_btCylinderShapeX_getMargin_0=function(){return(jq=b._emscripten_bind_btCylinderShapeX_getMargin_0=b.asm._n).apply(null,arguments)},kq=b._emscripten_bind_btCylinderShapeX_setLocalScaling_1=function(){return(kq=b._emscripten_bind_btCylinderShapeX_setLocalScaling_1= b.asm.$n).apply(null,arguments)},lq=b._emscripten_bind_btCylinderShapeX_getLocalScaling_0=function(){return(lq=b._emscripten_bind_btCylinderShapeX_getLocalScaling_0=b.asm.ao).apply(null,arguments)},mq=b._emscripten_bind_btCylinderShapeX_calculateLocalInertia_2=function(){return(mq=b._emscripten_bind_btCylinderShapeX_calculateLocalInertia_2=b.asm.bo).apply(null,arguments)},nq=b._emscripten_bind_btCylinderShapeX___destroy___0=function(){return(nq=b._emscripten_bind_btCylinderShapeX___destroy___0=b.asm.co).apply(null, arguments)},oq=b._emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1=function(){return(oq=b._emscripten_bind_btCylinderShapeZ_btCylinderShapeZ_1=b.asm.eo).apply(null,arguments)},pq=b._emscripten_bind_btCylinderShapeZ_setMargin_1=function(){return(pq=b._emscripten_bind_btCylinderShapeZ_setMargin_1=b.asm.fo).apply(null,arguments)},qq=b._emscripten_bind_btCylinderShapeZ_getMargin_0=function(){return(qq=b._emscripten_bind_btCylinderShapeZ_getMargin_0=b.asm.go).apply(null,arguments)},rq=b._emscripten_bind_btCylinderShapeZ_setLocalScaling_1= function(){return(rq=b._emscripten_bind_btCylinderShapeZ_setLocalScaling_1=b.asm.ho).apply(null,arguments)},sq=b._emscripten_bind_btCylinderShapeZ_getLocalScaling_0=function(){return(sq=b._emscripten_bind_btCylinderShapeZ_getLocalScaling_0=b.asm.io).apply(null,arguments)},tq=b._emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2=function(){return(tq=b._emscripten_bind_btCylinderShapeZ_calculateLocalInertia_2=b.asm.jo).apply(null,arguments)},uq=b._emscripten_bind_btCylinderShapeZ___destroy___0= function(){return(uq=b._emscripten_bind_btCylinderShapeZ___destroy___0=b.asm.ko).apply(null,arguments)},vq=b._emscripten_bind_btConvexPolyhedron_get_m_vertices_0=function(){return(vq=b._emscripten_bind_btConvexPolyhedron_get_m_vertices_0=b.asm.lo).apply(null,arguments)},wq=b._emscripten_bind_btConvexPolyhedron_set_m_vertices_1=function(){return(wq=b._emscripten_bind_btConvexPolyhedron_set_m_vertices_1=b.asm.mo).apply(null,arguments)},xq=b._emscripten_bind_btConvexPolyhedron_get_m_faces_0=function(){return(xq= b._emscripten_bind_btConvexPolyhedron_get_m_faces_0=b.asm.no).apply(null,arguments)},yq=b._emscripten_bind_btConvexPolyhedron_set_m_faces_1=function(){return(yq=b._emscripten_bind_btConvexPolyhedron_set_m_faces_1=b.asm.oo).apply(null,arguments)},zq=b._emscripten_bind_btConvexPolyhedron___destroy___0=function(){return(zq=b._emscripten_bind_btConvexPolyhedron___destroy___0=b.asm.po).apply(null,arguments)},Aq=b._emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0= function(){return(Aq=b._emscripten_bind_btSequentialImpulseConstraintSolver_btSequentialImpulseConstraintSolver_0=b.asm.qo).apply(null,arguments)},Bq=b._emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0=function(){return(Bq=b._emscripten_bind_btSequentialImpulseConstraintSolver___destroy___0=b.asm.ro).apply(null,arguments)},Cq=b._emscripten_bind_tAnchorArray_size_0=function(){return(Cq=b._emscripten_bind_tAnchorArray_size_0=b.asm.so).apply(null,arguments)},Dq=b._emscripten_bind_tAnchorArray_at_1= function(){return(Dq=b._emscripten_bind_tAnchorArray_at_1=b.asm.to).apply(null,arguments)},Eq=b._emscripten_bind_tAnchorArray_clear_0=function(){return(Eq=b._emscripten_bind_tAnchorArray_clear_0=b.asm.uo).apply(null,arguments)},Fq=b._emscripten_bind_tAnchorArray_push_back_1=function(){return(Fq=b._emscripten_bind_tAnchorArray_push_back_1=b.asm.vo).apply(null,arguments)},Gq=b._emscripten_bind_tAnchorArray_pop_back_0=function(){return(Gq=b._emscripten_bind_tAnchorArray_pop_back_0=b.asm.wo).apply(null, arguments)},Hq=b._emscripten_bind_tAnchorArray___destroy___0=function(){return(Hq=b._emscripten_bind_tAnchorArray___destroy___0=b.asm.xo).apply(null,arguments)},Iq=b._emscripten_bind_RaycastInfo_get_m_contactNormalWS_0=function(){return(Iq=b._emscripten_bind_RaycastInfo_get_m_contactNormalWS_0=b.asm.yo).apply(null,arguments)},Jq=b._emscripten_bind_RaycastInfo_set_m_contactNormalWS_1=function(){return(Jq=b._emscripten_bind_RaycastInfo_set_m_contactNormalWS_1=b.asm.zo).apply(null,arguments)},Kq=b._emscripten_bind_RaycastInfo_get_m_contactPointWS_0= function(){return(Kq=b._emscripten_bind_RaycastInfo_get_m_contactPointWS_0=b.asm.Ao).apply(null,arguments)},Lq=b._emscripten_bind_RaycastInfo_set_m_contactPointWS_1=function(){return(Lq=b._emscripten_bind_RaycastInfo_set_m_contactPointWS_1=b.asm.Bo).apply(null,arguments)},Mq=b._emscripten_bind_RaycastInfo_get_m_suspensionLength_0=function(){return(Mq=b._emscripten_bind_RaycastInfo_get_m_suspensionLength_0=b.asm.Co).apply(null,arguments)},Nq=b._emscripten_bind_RaycastInfo_set_m_suspensionLength_1= function(){return(Nq=b._emscripten_bind_RaycastInfo_set_m_suspensionLength_1=b.asm.Do).apply(null,arguments)},Oq=b._emscripten_bind_RaycastInfo_get_m_hardPointWS_0=function(){return(Oq=b._emscripten_bind_RaycastInfo_get_m_hardPointWS_0=b.asm.Eo).apply(null,arguments)},Pq=b._emscripten_bind_RaycastInfo_set_m_hardPointWS_1=function(){return(Pq=b._emscripten_bind_RaycastInfo_set_m_hardPointWS_1=b.asm.Fo).apply(null,arguments)},Qq=b._emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0=function(){return(Qq= b._emscripten_bind_RaycastInfo_get_m_wheelDirectionWS_0=b.asm.Go).apply(null,arguments)},Rq=b._emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1=function(){return(Rq=b._emscripten_bind_RaycastInfo_set_m_wheelDirectionWS_1=b.asm.Ho).apply(null,arguments)},Sq=b._emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0=function(){return(Sq=b._emscripten_bind_RaycastInfo_get_m_wheelAxleWS_0=b.asm.Io).apply(null,arguments)},Tq=b._emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1=function(){return(Tq=b._emscripten_bind_RaycastInfo_set_m_wheelAxleWS_1= b.asm.Jo).apply(null,arguments)},Uq=b._emscripten_bind_RaycastInfo_get_m_isInContact_0=function(){return(Uq=b._emscripten_bind_RaycastInfo_get_m_isInContact_0=b.asm.Ko).apply(null,arguments)},Vq=b._emscripten_bind_RaycastInfo_set_m_isInContact_1=function(){return(Vq=b._emscripten_bind_RaycastInfo_set_m_isInContact_1=b.asm.Lo).apply(null,arguments)},Wq=b._emscripten_bind_RaycastInfo_get_m_groundObject_0=function(){return(Wq=b._emscripten_bind_RaycastInfo_get_m_groundObject_0=b.asm.Mo).apply(null,arguments)}, Xq=b._emscripten_bind_RaycastInfo_set_m_groundObject_1=function(){return(Xq=b._emscripten_bind_RaycastInfo_set_m_groundObject_1=b.asm.No).apply(null,arguments)},Yq=b._emscripten_bind_RaycastInfo___destroy___0=function(){return(Yq=b._emscripten_bind_RaycastInfo___destroy___0=b.asm.Oo).apply(null,arguments)},Zq=b._emscripten_bind_btMultiSphereShape_btMultiSphereShape_3=function(){return(Zq=b._emscripten_bind_btMultiSphereShape_btMultiSphereShape_3=b.asm.Po).apply(null,arguments)},$q=b._emscripten_bind_btMultiSphereShape_setLocalScaling_1= function(){return($q=b._emscripten_bind_btMultiSphereShape_setLocalScaling_1=b.asm.Qo).apply(null,arguments)},ar=b._emscripten_bind_btMultiSphereShape_getLocalScaling_0=function(){return(ar=b._emscripten_bind_btMultiSphereShape_getLocalScaling_0=b.asm.Ro).apply(null,arguments)},br=b._emscripten_bind_btMultiSphereShape_calculateLocalInertia_2=function(){return(br=b._emscripten_bind_btMultiSphereShape_calculateLocalInertia_2=b.asm.So).apply(null,arguments)},cr=b._emscripten_bind_btMultiSphereShape___destroy___0= function(){return(cr=b._emscripten_bind_btMultiSphereShape___destroy___0=b.asm.To).apply(null,arguments)},dr=b._emscripten_bind_btSoftBody_btSoftBody_4=function(){return(dr=b._emscripten_bind_btSoftBody_btSoftBody_4=b.asm.Uo).apply(null,arguments)},er=b._emscripten_bind_btSoftBody_checkLink_2=function(){return(er=b._emscripten_bind_btSoftBody_checkLink_2=b.asm.Vo).apply(null,arguments)},fr=b._emscripten_bind_btSoftBody_checkFace_3=function(){return(fr=b._emscripten_bind_btSoftBody_checkFace_3=b.asm.Wo).apply(null, arguments)},gr=b._emscripten_bind_btSoftBody_appendMaterial_0=function(){return(gr=b._emscripten_bind_btSoftBody_appendMaterial_0=b.asm.Xo).apply(null,arguments)},hr=b._emscripten_bind_btSoftBody_appendNode_2=function(){return(hr=b._emscripten_bind_btSoftBody_appendNode_2=b.asm.Yo).apply(null,arguments)},ir=b._emscripten_bind_btSoftBody_appendLink_4=function(){return(ir=b._emscripten_bind_btSoftBody_appendLink_4=b.asm.Zo).apply(null,arguments)},jr=b._emscripten_bind_btSoftBody_appendFace_4=function(){return(jr= b._emscripten_bind_btSoftBody_appendFace_4=b.asm._o).apply(null,arguments)},kr=b._emscripten_bind_btSoftBody_appendTetra_5=function(){return(kr=b._emscripten_bind_btSoftBody_appendTetra_5=b.asm.$o).apply(null,arguments)},lr=b._emscripten_bind_btSoftBody_appendAnchor_4=function(){return(lr=b._emscripten_bind_btSoftBody_appendAnchor_4=b.asm.ap).apply(null,arguments)},mr=b._emscripten_bind_btSoftBody_addForce_1=function(){return(mr=b._emscripten_bind_btSoftBody_addForce_1=b.asm.bp).apply(null,arguments)}, nr=b._emscripten_bind_btSoftBody_addForce_2=function(){return(nr=b._emscripten_bind_btSoftBody_addForce_2=b.asm.cp).apply(null,arguments)},or=b._emscripten_bind_btSoftBody_addAeroForceToNode_2=function(){return(or=b._emscripten_bind_btSoftBody_addAeroForceToNode_2=b.asm.dp).apply(null,arguments)},pr=b._emscripten_bind_btSoftBody_getTotalMass_0=function(){return(pr=b._emscripten_bind_btSoftBody_getTotalMass_0=b.asm.ep).apply(null,arguments)},qr=b._emscripten_bind_btSoftBody_setTotalMass_2=function(){return(qr= b._emscripten_bind_btSoftBody_setTotalMass_2=b.asm.fp).apply(null,arguments)},rr=b._emscripten_bind_btSoftBody_setMass_2=function(){return(rr=b._emscripten_bind_btSoftBody_setMass_2=b.asm.gp).apply(null,arguments)},sr=b._emscripten_bind_btSoftBody_transform_1=function(){return(sr=b._emscripten_bind_btSoftBody_transform_1=b.asm.hp).apply(null,arguments)},tr=b._emscripten_bind_btSoftBody_translate_1=function(){return(tr=b._emscripten_bind_btSoftBody_translate_1=b.asm.ip).apply(null,arguments)},ur=b._emscripten_bind_btSoftBody_rotate_1= function(){return(ur=b._emscripten_bind_btSoftBody_rotate_1=b.asm.jp).apply(null,arguments)},vr=b._emscripten_bind_btSoftBody_scale_1=function(){return(vr=b._emscripten_bind_btSoftBody_scale_1=b.asm.kp).apply(null,arguments)},wr=b._emscripten_bind_btSoftBody_generateClusters_1=function(){return(wr=b._emscripten_bind_btSoftBody_generateClusters_1=b.asm.lp).apply(null,arguments)},xr=b._emscripten_bind_btSoftBody_generateClusters_2=function(){return(xr=b._emscripten_bind_btSoftBody_generateClusters_2= b.asm.mp).apply(null,arguments)},yr=b._emscripten_bind_btSoftBody_generateBendingConstraints_2=function(){return(yr=b._emscripten_bind_btSoftBody_generateBendingConstraints_2=b.asm.np).apply(null,arguments)},zr=b._emscripten_bind_btSoftBody_upcast_1=function(){return(zr=b._emscripten_bind_btSoftBody_upcast_1=b.asm.op).apply(null,arguments)},Ar=b._emscripten_bind_btSoftBody_setAnisotropicFriction_2=function(){return(Ar=b._emscripten_bind_btSoftBody_setAnisotropicFriction_2=b.asm.pp).apply(null,arguments)}, Br=b._emscripten_bind_btSoftBody_getCollisionShape_0=function(){return(Br=b._emscripten_bind_btSoftBody_getCollisionShape_0=b.asm.qp).apply(null,arguments)},Cr=b._emscripten_bind_btSoftBody_setContactProcessingThreshold_1=function(){return(Cr=b._emscripten_bind_btSoftBody_setContactProcessingThreshold_1=b.asm.rp).apply(null,arguments)},Dr=b._emscripten_bind_btSoftBody_setActivationState_1=function(){return(Dr=b._emscripten_bind_btSoftBody_setActivationState_1=b.asm.sp).apply(null,arguments)},Er=b._emscripten_bind_btSoftBody_forceActivationState_1= function(){return(Er=b._emscripten_bind_btSoftBody_forceActivationState_1=b.asm.tp).apply(null,arguments)},Fr=b._emscripten_bind_btSoftBody_activate_0=function(){return(Fr=b._emscripten_bind_btSoftBody_activate_0=b.asm.up).apply(null,arguments)},Gr=b._emscripten_bind_btSoftBody_activate_1=function(){return(Gr=b._emscripten_bind_btSoftBody_activate_1=b.asm.vp).apply(null,arguments)},Hr=b._emscripten_bind_btSoftBody_isActive_0=function(){return(Hr=b._emscripten_bind_btSoftBody_isActive_0=b.asm.wp).apply(null, arguments)},Ir=b._emscripten_bind_btSoftBody_isKinematicObject_0=function(){return(Ir=b._emscripten_bind_btSoftBody_isKinematicObject_0=b.asm.xp).apply(null,arguments)},Jr=b._emscripten_bind_btSoftBody_isStaticObject_0=function(){return(Jr=b._emscripten_bind_btSoftBody_isStaticObject_0=b.asm.yp).apply(null,arguments)},Kr=b._emscripten_bind_btSoftBody_isStaticOrKinematicObject_0=function(){return(Kr=b._emscripten_bind_btSoftBody_isStaticOrKinematicObject_0=b.asm.zp).apply(null,arguments)},Lr=b._emscripten_bind_btSoftBody_getRestitution_0= function(){return(Lr=b._emscripten_bind_btSoftBody_getRestitution_0=b.asm.Ap).apply(null,arguments)},Mr=b._emscripten_bind_btSoftBody_getFriction_0=function(){return(Mr=b._emscripten_bind_btSoftBody_getFriction_0=b.asm.Bp).apply(null,arguments)},Nr=b._emscripten_bind_btSoftBody_getRollingFriction_0=function(){return(Nr=b._emscripten_bind_btSoftBody_getRollingFriction_0=b.asm.Cp).apply(null,arguments)},Or=b._emscripten_bind_btSoftBody_setRestitution_1=function(){return(Or=b._emscripten_bind_btSoftBody_setRestitution_1= b.asm.Dp).apply(null,arguments)},Pr=b._emscripten_bind_btSoftBody_setFriction_1=function(){return(Pr=b._emscripten_bind_btSoftBody_setFriction_1=b.asm.Ep).apply(null,arguments)},Qr=b._emscripten_bind_btSoftBody_setRollingFriction_1=function(){return(Qr=b._emscripten_bind_btSoftBody_setRollingFriction_1=b.asm.Fp).apply(null,arguments)},Rr=b._emscripten_bind_btSoftBody_getWorldTransform_0=function(){return(Rr=b._emscripten_bind_btSoftBody_getWorldTransform_0=b.asm.Gp).apply(null,arguments)},Sr=b._emscripten_bind_btSoftBody_getCollisionFlags_0= function(){return(Sr=b._emscripten_bind_btSoftBody_getCollisionFlags_0=b.asm.Hp).apply(null,arguments)},Tr=b._emscripten_bind_btSoftBody_setCollisionFlags_1=function(){return(Tr=b._emscripten_bind_btSoftBody_setCollisionFlags_1=b.asm.Ip).apply(null,arguments)},Ur=b._emscripten_bind_btSoftBody_setWorldTransform_1=function(){return(Ur=b._emscripten_bind_btSoftBody_setWorldTransform_1=b.asm.Jp).apply(null,arguments)},Vr=b._emscripten_bind_btSoftBody_setCollisionShape_1=function(){return(Vr=b._emscripten_bind_btSoftBody_setCollisionShape_1= b.asm.Kp).apply(null,arguments)},Wr=b._emscripten_bind_btSoftBody_setCcdMotionThreshold_1=function(){return(Wr=b._emscripten_bind_btSoftBody_setCcdMotionThreshold_1=b.asm.Lp).apply(null,arguments)},Xr=b._emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1=function(){return(Xr=b._emscripten_bind_btSoftBody_setCcdSweptSphereRadius_1=b.asm.Mp).apply(null,arguments)},Yr=b._emscripten_bind_btSoftBody_getUserIndex_0=function(){return(Yr=b._emscripten_bind_btSoftBody_getUserIndex_0=b.asm.Np).apply(null, arguments)},Zr=b._emscripten_bind_btSoftBody_setUserIndex_1=function(){return(Zr=b._emscripten_bind_btSoftBody_setUserIndex_1=b.asm.Op).apply(null,arguments)},$r=b._emscripten_bind_btSoftBody_getUserPointer_0=function(){return($r=b._emscripten_bind_btSoftBody_getUserPointer_0=b.asm.Pp).apply(null,arguments)},as=b._emscripten_bind_btSoftBody_setUserPointer_1=function(){return(as=b._emscripten_bind_btSoftBody_setUserPointer_1=b.asm.Qp).apply(null,arguments)},bs=b._emscripten_bind_btSoftBody_getBroadphaseHandle_0= function(){return(bs=b._emscripten_bind_btSoftBody_getBroadphaseHandle_0=b.asm.Rp).apply(null,arguments)},cs=b._emscripten_bind_btSoftBody_get_m_cfg_0=function(){return(cs=b._emscripten_bind_btSoftBody_get_m_cfg_0=b.asm.Sp).apply(null,arguments)},ds=b._emscripten_bind_btSoftBody_set_m_cfg_1=function(){return(ds=b._emscripten_bind_btSoftBody_set_m_cfg_1=b.asm.Tp).apply(null,arguments)},es=b._emscripten_bind_btSoftBody_get_m_nodes_0=function(){return(es=b._emscripten_bind_btSoftBody_get_m_nodes_0=b.asm.Up).apply(null, arguments)},gs=b._emscripten_bind_btSoftBody_set_m_nodes_1=function(){return(gs=b._emscripten_bind_btSoftBody_set_m_nodes_1=b.asm.Vp).apply(null,arguments)},hs=b._emscripten_bind_btSoftBody_get_m_faces_0=function(){return(hs=b._emscripten_bind_btSoftBody_get_m_faces_0=b.asm.Wp).apply(null,arguments)},is=b._emscripten_bind_btSoftBody_set_m_faces_1=function(){return(is=b._emscripten_bind_btSoftBody_set_m_faces_1=b.asm.Xp).apply(null,arguments)},js=b._emscripten_bind_btSoftBody_get_m_materials_0=function(){return(js= b._emscripten_bind_btSoftBody_get_m_materials_0=b.asm.Yp).apply(null,arguments)},ks=b._emscripten_bind_btSoftBody_set_m_materials_1=function(){return(ks=b._emscripten_bind_btSoftBody_set_m_materials_1=b.asm.Zp).apply(null,arguments)},ls=b._emscripten_bind_btSoftBody_get_m_anchors_0=function(){return(ls=b._emscripten_bind_btSoftBody_get_m_anchors_0=b.asm._p).apply(null,arguments)},ms=b._emscripten_bind_btSoftBody_set_m_anchors_1=function(){return(ms=b._emscripten_bind_btSoftBody_set_m_anchors_1=b.asm.$p).apply(null, arguments)},ns=b._emscripten_bind_btSoftBody___destroy___0=function(){return(ns=b._emscripten_bind_btSoftBody___destroy___0=b.asm.aq).apply(null,arguments)},ps=b._emscripten_bind_btIntArray_size_0=function(){return(ps=b._emscripten_bind_btIntArray_size_0=b.asm.bq).apply(null,arguments)},qs=b._emscripten_bind_btIntArray_at_1=function(){return(qs=b._emscripten_bind_btIntArray_at_1=b.asm.cq).apply(null,arguments)},rs=b._emscripten_bind_btIntArray___destroy___0=function(){return(rs=b._emscripten_bind_btIntArray___destroy___0= b.asm.dq).apply(null,arguments)},ss=b._emscripten_bind_Config_get_kVCF_0=function(){return(ss=b._emscripten_bind_Config_get_kVCF_0=b.asm.eq).apply(null,arguments)},ts=b._emscripten_bind_Config_set_kVCF_1=function(){return(ts=b._emscripten_bind_Config_set_kVCF_1=b.asm.fq).apply(null,arguments)},us=b._emscripten_bind_Config_get_kDP_0=function(){return(us=b._emscripten_bind_Config_get_kDP_0=b.asm.gq).apply(null,arguments)},vs=b._emscripten_bind_Config_set_kDP_1=function(){return(vs=b._emscripten_bind_Config_set_kDP_1= b.asm.hq).apply(null,arguments)},xs=b._emscripten_bind_Config_get_kDG_0=function(){return(xs=b._emscripten_bind_Config_get_kDG_0=b.asm.iq).apply(null,arguments)},ys=b._emscripten_bind_Config_set_kDG_1=function(){return(ys=b._emscripten_bind_Config_set_kDG_1=b.asm.jq).apply(null,arguments)},zs=b._emscripten_bind_Config_get_kLF_0=function(){return(zs=b._emscripten_bind_Config_get_kLF_0=b.asm.kq).apply(null,arguments)},As=b._emscripten_bind_Config_set_kLF_1=function(){return(As=b._emscripten_bind_Config_set_kLF_1= b.asm.lq).apply(null,arguments)},Bs=b._emscripten_bind_Config_get_kPR_0=function(){return(Bs=b._emscripten_bind_Config_get_kPR_0=b.asm.mq).apply(null,arguments)},Cs=b._emscripten_bind_Config_set_kPR_1=function(){return(Cs=b._emscripten_bind_Config_set_kPR_1=b.asm.nq).apply(null,arguments)},Ds=b._emscripten_bind_Config_get_kVC_0=function(){return(Ds=b._emscripten_bind_Config_get_kVC_0=b.asm.oq).apply(null,arguments)},Es=b._emscripten_bind_Config_set_kVC_1=function(){return(Es=b._emscripten_bind_Config_set_kVC_1= b.asm.pq).apply(null,arguments)},Fs=b._emscripten_bind_Config_get_kDF_0=function(){return(Fs=b._emscripten_bind_Config_get_kDF_0=b.asm.qq).apply(null,arguments)},Gs=b._emscripten_bind_Config_set_kDF_1=function(){return(Gs=b._emscripten_bind_Config_set_kDF_1=b.asm.rq).apply(null,arguments)},Hs=b._emscripten_bind_Config_get_kMT_0=function(){return(Hs=b._emscripten_bind_Config_get_kMT_0=b.asm.sq).apply(null,arguments)},Is=b._emscripten_bind_Config_set_kMT_1=function(){return(Is=b._emscripten_bind_Config_set_kMT_1= b.asm.tq).apply(null,arguments)},Js=b._emscripten_bind_Config_get_kCHR_0=function(){return(Js=b._emscripten_bind_Config_get_kCHR_0=b.asm.uq).apply(null,arguments)},Ks=b._emscripten_bind_Config_set_kCHR_1=function(){return(Ks=b._emscripten_bind_Config_set_kCHR_1=b.asm.vq).apply(null,arguments)},Ls=b._emscripten_bind_Config_get_kKHR_0=function(){return(Ls=b._emscripten_bind_Config_get_kKHR_0=b.asm.wq).apply(null,arguments)},Ms=b._emscripten_bind_Config_set_kKHR_1=function(){return(Ms=b._emscripten_bind_Config_set_kKHR_1= b.asm.xq).apply(null,arguments)},Ns=b._emscripten_bind_Config_get_kSHR_0=function(){return(Ns=b._emscripten_bind_Config_get_kSHR_0=b.asm.yq).apply(null,arguments)},Os=b._emscripten_bind_Config_set_kSHR_1=function(){return(Os=b._emscripten_bind_Config_set_kSHR_1=b.asm.zq).apply(null,arguments)},Ps=b._emscripten_bind_Config_get_kAHR_0=function(){return(Ps=b._emscripten_bind_Config_get_kAHR_0=b.asm.Aq).apply(null,arguments)},Qs=b._emscripten_bind_Config_set_kAHR_1=function(){return(Qs=b._emscripten_bind_Config_set_kAHR_1= b.asm.Bq).apply(null,arguments)},Rs=b._emscripten_bind_Config_get_kSRHR_CL_0=function(){return(Rs=b._emscripten_bind_Config_get_kSRHR_CL_0=b.asm.Cq).apply(null,arguments)},Ss=b._emscripten_bind_Config_set_kSRHR_CL_1=function(){return(Ss=b._emscripten_bind_Config_set_kSRHR_CL_1=b.asm.Dq).apply(null,arguments)},Ts=b._emscripten_bind_Config_get_kSKHR_CL_0=function(){return(Ts=b._emscripten_bind_Config_get_kSKHR_CL_0=b.asm.Eq).apply(null,arguments)},Us=b._emscripten_bind_Config_set_kSKHR_CL_1=function(){return(Us= b._emscripten_bind_Config_set_kSKHR_CL_1=b.asm.Fq).apply(null,arguments)},Vs=b._emscripten_bind_Config_get_kSSHR_CL_0=function(){return(Vs=b._emscripten_bind_Config_get_kSSHR_CL_0=b.asm.Gq).apply(null,arguments)},Ws=b._emscripten_bind_Config_set_kSSHR_CL_1=function(){return(Ws=b._emscripten_bind_Config_set_kSSHR_CL_1=b.asm.Hq).apply(null,arguments)},Xs=b._emscripten_bind_Config_get_kSR_SPLT_CL_0=function(){return(Xs=b._emscripten_bind_Config_get_kSR_SPLT_CL_0=b.asm.Iq).apply(null,arguments)},Ys=b._emscripten_bind_Config_set_kSR_SPLT_CL_1= function(){return(Ys=b._emscripten_bind_Config_set_kSR_SPLT_CL_1=b.asm.Jq).apply(null,arguments)},Zs=b._emscripten_bind_Config_get_kSK_SPLT_CL_0=function(){return(Zs=b._emscripten_bind_Config_get_kSK_SPLT_CL_0=b.asm.Kq).apply(null,arguments)},$s=b._emscripten_bind_Config_set_kSK_SPLT_CL_1=function(){return($s=b._emscripten_bind_Config_set_kSK_SPLT_CL_1=b.asm.Lq).apply(null,arguments)},at=b._emscripten_bind_Config_get_kSS_SPLT_CL_0=function(){return(at=b._emscripten_bind_Config_get_kSS_SPLT_CL_0=b.asm.Mq).apply(null, arguments)},bt=b._emscripten_bind_Config_set_kSS_SPLT_CL_1=function(){return(bt=b._emscripten_bind_Config_set_kSS_SPLT_CL_1=b.asm.Nq).apply(null,arguments)},ct=b._emscripten_bind_Config_get_maxvolume_0=function(){return(ct=b._emscripten_bind_Config_get_maxvolume_0=b.asm.Oq).apply(null,arguments)},dt=b._emscripten_bind_Config_set_maxvolume_1=function(){return(dt=b._emscripten_bind_Config_set_maxvolume_1=b.asm.Pq).apply(null,arguments)},et=b._emscripten_bind_Config_get_timescale_0=function(){return(et= b._emscripten_bind_Config_get_timescale_0=b.asm.Qq).apply(null,arguments)},ft=b._emscripten_bind_Config_set_timescale_1=function(){return(ft=b._emscripten_bind_Config_set_timescale_1=b.asm.Rq).apply(null,arguments)},gt=b._emscripten_bind_Config_get_viterations_0=function(){return(gt=b._emscripten_bind_Config_get_viterations_0=b.asm.Sq).apply(null,arguments)},ht=b._emscripten_bind_Config_set_viterations_1=function(){return(ht=b._emscripten_bind_Config_set_viterations_1=b.asm.Tq).apply(null,arguments)}, it=b._emscripten_bind_Config_get_piterations_0=function(){return(it=b._emscripten_bind_Config_get_piterations_0=b.asm.Uq).apply(null,arguments)},jt=b._emscripten_bind_Config_set_piterations_1=function(){return(jt=b._emscripten_bind_Config_set_piterations_1=b.asm.Vq).apply(null,arguments)},kt=b._emscripten_bind_Config_get_diterations_0=function(){return(kt=b._emscripten_bind_Config_get_diterations_0=b.asm.Wq).apply(null,arguments)},lt=b._emscripten_bind_Config_set_diterations_1=function(){return(lt= b._emscripten_bind_Config_set_diterations_1=b.asm.Xq).apply(null,arguments)},mt=b._emscripten_bind_Config_get_citerations_0=function(){return(mt=b._emscripten_bind_Config_get_citerations_0=b.asm.Yq).apply(null,arguments)},nt=b._emscripten_bind_Config_set_citerations_1=function(){return(nt=b._emscripten_bind_Config_set_citerations_1=b.asm.Zq).apply(null,arguments)},ot=b._emscripten_bind_Config_get_collisions_0=function(){return(ot=b._emscripten_bind_Config_get_collisions_0=b.asm._q).apply(null,arguments)}, pt=b._emscripten_bind_Config_set_collisions_1=function(){return(pt=b._emscripten_bind_Config_set_collisions_1=b.asm.$q).apply(null,arguments)},qt=b._emscripten_bind_Config___destroy___0=function(){return(qt=b._emscripten_bind_Config___destroy___0=b.asm.ar).apply(null,arguments)},rt=b._emscripten_bind_Node_get_m_x_0=function(){return(rt=b._emscripten_bind_Node_get_m_x_0=b.asm.br).apply(null,arguments)},st=b._emscripten_bind_Node_set_m_x_1=function(){return(st=b._emscripten_bind_Node_set_m_x_1=b.asm.cr).apply(null, arguments)},tt=b._emscripten_bind_Node_get_m_q_0=function(){return(tt=b._emscripten_bind_Node_get_m_q_0=b.asm.dr).apply(null,arguments)},ut=b._emscripten_bind_Node_set_m_q_1=function(){return(ut=b._emscripten_bind_Node_set_m_q_1=b.asm.er).apply(null,arguments)},vt=b._emscripten_bind_Node_get_m_v_0=function(){return(vt=b._emscripten_bind_Node_get_m_v_0=b.asm.fr).apply(null,arguments)},wt=b._emscripten_bind_Node_set_m_v_1=function(){return(wt=b._emscripten_bind_Node_set_m_v_1=b.asm.gr).apply(null,arguments)}, xt=b._emscripten_bind_Node_get_m_f_0=function(){return(xt=b._emscripten_bind_Node_get_m_f_0=b.asm.hr).apply(null,arguments)},yt=b._emscripten_bind_Node_set_m_f_1=function(){return(yt=b._emscripten_bind_Node_set_m_f_1=b.asm.ir).apply(null,arguments)},zt=b._emscripten_bind_Node_get_m_n_0=function(){return(zt=b._emscripten_bind_Node_get_m_n_0=b.asm.jr).apply(null,arguments)},At=b._emscripten_bind_Node_set_m_n_1=function(){return(At=b._emscripten_bind_Node_set_m_n_1=b.asm.kr).apply(null,arguments)},Bt= b._emscripten_bind_Node_get_m_im_0=function(){return(Bt=b._emscripten_bind_Node_get_m_im_0=b.asm.lr).apply(null,arguments)},Ct=b._emscripten_bind_Node_set_m_im_1=function(){return(Ct=b._emscripten_bind_Node_set_m_im_1=b.asm.mr).apply(null,arguments)},Dt=b._emscripten_bind_Node_get_m_area_0=function(){return(Dt=b._emscripten_bind_Node_get_m_area_0=b.asm.nr).apply(null,arguments)},Et=b._emscripten_bind_Node_set_m_area_1=function(){return(Et=b._emscripten_bind_Node_set_m_area_1=b.asm.or).apply(null, arguments)},Ft=b._emscripten_bind_Node___destroy___0=function(){return(Ft=b._emscripten_bind_Node___destroy___0=b.asm.pr).apply(null,arguments)},Gt=b._emscripten_bind_btGhostPairCallback_btGhostPairCallback_0=function(){return(Gt=b._emscripten_bind_btGhostPairCallback_btGhostPairCallback_0=b.asm.qr).apply(null,arguments)},Ht=b._emscripten_bind_btGhostPairCallback___destroy___0=function(){return(Ht=b._emscripten_bind_btGhostPairCallback___destroy___0=b.asm.rr).apply(null,arguments)},It=b._emscripten_bind_btOverlappingPairCallback___destroy___0= function(){return(It=b._emscripten_bind_btOverlappingPairCallback___destroy___0=b.asm.sr).apply(null,arguments)},Jt=b._emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3=function(){return(Jt=b._emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_3=b.asm.tr).apply(null,arguments)},Kt=b._emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4=function(){return(Kt=b._emscripten_bind_btKinematicCharacterController_btKinematicCharacterController_4= b.asm.ur).apply(null,arguments)},Lt=b._emscripten_bind_btKinematicCharacterController_setUpAxis_1=function(){return(Lt=b._emscripten_bind_btKinematicCharacterController_setUpAxis_1=b.asm.vr).apply(null,arguments)},Mt=b._emscripten_bind_btKinematicCharacterController_setWalkDirection_1=function(){return(Mt=b._emscripten_bind_btKinematicCharacterController_setWalkDirection_1=b.asm.wr).apply(null,arguments)},Nt=b._emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2=function(){return(Nt= b._emscripten_bind_btKinematicCharacterController_setVelocityForTimeInterval_2=b.asm.xr).apply(null,arguments)},Ot=b._emscripten_bind_btKinematicCharacterController_warp_1=function(){return(Ot=b._emscripten_bind_btKinematicCharacterController_warp_1=b.asm.yr).apply(null,arguments)},Pt=b._emscripten_bind_btKinematicCharacterController_preStep_1=function(){return(Pt=b._emscripten_bind_btKinematicCharacterController_preStep_1=b.asm.zr).apply(null,arguments)},Qt=b._emscripten_bind_btKinematicCharacterController_playerStep_2= function(){return(Qt=b._emscripten_bind_btKinematicCharacterController_playerStep_2=b.asm.Ar).apply(null,arguments)},Rt=b._emscripten_bind_btKinematicCharacterController_setFallSpeed_1=function(){return(Rt=b._emscripten_bind_btKinematicCharacterController_setFallSpeed_1=b.asm.Br).apply(null,arguments)},St=b._emscripten_bind_btKinematicCharacterController_setJumpSpeed_1=function(){return(St=b._emscripten_bind_btKinematicCharacterController_setJumpSpeed_1=b.asm.Cr).apply(null,arguments)},Tt=b._emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1= function(){return(Tt=b._emscripten_bind_btKinematicCharacterController_setMaxJumpHeight_1=b.asm.Dr).apply(null,arguments)},Ut=b._emscripten_bind_btKinematicCharacterController_canJump_0=function(){return(Ut=b._emscripten_bind_btKinematicCharacterController_canJump_0=b.asm.Er).apply(null,arguments)},Vt=b._emscripten_bind_btKinematicCharacterController_jump_0=function(){return(Vt=b._emscripten_bind_btKinematicCharacterController_jump_0=b.asm.Fr).apply(null,arguments)},Wt=b._emscripten_bind_btKinematicCharacterController_setGravity_1= function(){return(Wt=b._emscripten_bind_btKinematicCharacterController_setGravity_1=b.asm.Gr).apply(null,arguments)},Xt=b._emscripten_bind_btKinematicCharacterController_getGravity_0=function(){return(Xt=b._emscripten_bind_btKinematicCharacterController_getGravity_0=b.asm.Hr).apply(null,arguments)},Yt=b._emscripten_bind_btKinematicCharacterController_setMaxSlope_1=function(){return(Yt=b._emscripten_bind_btKinematicCharacterController_setMaxSlope_1=b.asm.Ir).apply(null,arguments)},Zt=b._emscripten_bind_btKinematicCharacterController_getMaxSlope_0= function(){return(Zt=b._emscripten_bind_btKinematicCharacterController_getMaxSlope_0=b.asm.Jr).apply(null,arguments)},$t=b._emscripten_bind_btKinematicCharacterController_getGhostObject_0=function(){return($t=b._emscripten_bind_btKinematicCharacterController_getGhostObject_0=b.asm.Kr).apply(null,arguments)},au=b._emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1=function(){return(au=b._emscripten_bind_btKinematicCharacterController_setUseGhostSweepTest_1=b.asm.Lr).apply(null,arguments)}, bu=b._emscripten_bind_btKinematicCharacterController_onGround_0=function(){return(bu=b._emscripten_bind_btKinematicCharacterController_onGround_0=b.asm.Mr).apply(null,arguments)},cu=b._emscripten_bind_btKinematicCharacterController_setUpInterpolate_1=function(){return(cu=b._emscripten_bind_btKinematicCharacterController_setUpInterpolate_1=b.asm.Nr).apply(null,arguments)},du=b._emscripten_bind_btKinematicCharacterController_updateAction_2=function(){return(du=b._emscripten_bind_btKinematicCharacterController_updateAction_2= b.asm.Or).apply(null,arguments)},eu=b._emscripten_bind_btKinematicCharacterController___destroy___0=function(){return(eu=b._emscripten_bind_btKinematicCharacterController___destroy___0=b.asm.Pr).apply(null,arguments)},fu=b._emscripten_bind_btSoftBodyArray_size_0=function(){return(fu=b._emscripten_bind_btSoftBodyArray_size_0=b.asm.Qr).apply(null,arguments)},gu=b._emscripten_bind_btSoftBodyArray_at_1=function(){return(gu=b._emscripten_bind_btSoftBodyArray_at_1=b.asm.Rr).apply(null,arguments)},hu=b._emscripten_bind_btSoftBodyArray___destroy___0= function(){return(hu=b._emscripten_bind_btSoftBodyArray___destroy___0=b.asm.Sr).apply(null,arguments)},iu=b._emscripten_bind_btFaceArray_size_0=function(){return(iu=b._emscripten_bind_btFaceArray_size_0=b.asm.Tr).apply(null,arguments)},ju=b._emscripten_bind_btFaceArray_at_1=function(){return(ju=b._emscripten_bind_btFaceArray_at_1=b.asm.Ur).apply(null,arguments)},ku=b._emscripten_bind_btFaceArray___destroy___0=function(){return(ku=b._emscripten_bind_btFaceArray___destroy___0=b.asm.Vr).apply(null,arguments)}, lu=b._emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2=function(){return(lu=b._emscripten_bind_btStaticPlaneShape_btStaticPlaneShape_2=b.asm.Wr).apply(null,arguments)},mu=b._emscripten_bind_btStaticPlaneShape_setLocalScaling_1=function(){return(mu=b._emscripten_bind_btStaticPlaneShape_setLocalScaling_1=b.asm.Xr).apply(null,arguments)},nu=b._emscripten_bind_btStaticPlaneShape_getLocalScaling_0=function(){return(nu=b._emscripten_bind_btStaticPlaneShape_getLocalScaling_0=b.asm.Yr).apply(null, arguments)},ou=b._emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2=function(){return(ou=b._emscripten_bind_btStaticPlaneShape_calculateLocalInertia_2=b.asm.Zr).apply(null,arguments)},pu=b._emscripten_bind_btStaticPlaneShape___destroy___0=function(){return(pu=b._emscripten_bind_btStaticPlaneShape___destroy___0=b.asm._r).apply(null,arguments)},qu=b._emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1=function(){return(qu=b._emscripten_bind_btOverlappingPairCache_setInternalGhostPairCallback_1= b.asm.$r).apply(null,arguments)},ru=b._emscripten_bind_btOverlappingPairCache_getNumOverlappingPairs_0=function(){return(ru=b._emscripten_bind_btOverlappingPairCache_getNumOverlappingPairs_0=b.asm.as).apply(null,arguments)},su=b._emscripten_bind_btOverlappingPairCache___destroy___0=function(){return(su=b._emscripten_bind_btOverlappingPairCache___destroy___0=b.asm.bs).apply(null,arguments)},tu=b._emscripten_bind_btIndexedMesh_get_m_numTriangles_0=function(){return(tu=b._emscripten_bind_btIndexedMesh_get_m_numTriangles_0= b.asm.cs).apply(null,arguments)},uu=b._emscripten_bind_btIndexedMesh_set_m_numTriangles_1=function(){return(uu=b._emscripten_bind_btIndexedMesh_set_m_numTriangles_1=b.asm.ds).apply(null,arguments)},vu=b._emscripten_bind_btIndexedMesh___destroy___0=function(){return(vu=b._emscripten_bind_btIndexedMesh___destroy___0=b.asm.es).apply(null,arguments)},wu=b._emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5=function(){return(wu=b._emscripten_bind_btSoftRigidDynamicsWorld_btSoftRigidDynamicsWorld_5= b.asm.fs).apply(null,arguments)},xu=b._emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3=function(){return(xu=b._emscripten_bind_btSoftRigidDynamicsWorld_addSoftBody_3=b.asm.gs).apply(null,arguments)},yu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1=function(){return(yu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeSoftBody_1=b.asm.hs).apply(null,arguments)},zu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1=function(){return(zu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeCollisionObject_1= b.asm.is).apply(null,arguments)},Au=b._emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0=function(){return(Au=b._emscripten_bind_btSoftRigidDynamicsWorld_getWorldInfo_0=b.asm.js).apply(null,arguments)},Bu=b._emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0=function(){return(Bu=b._emscripten_bind_btSoftRigidDynamicsWorld_getSoftBodyArray_0=b.asm.ks).apply(null,arguments)},Cu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0=function(){return(Cu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDispatcher_0= b.asm.ls).apply(null,arguments)},Du=b._emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3=function(){return(Du=b._emscripten_bind_btSoftRigidDynamicsWorld_rayTest_3=b.asm.ms).apply(null,arguments)},Eu=b._emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0=function(){return(Eu=b._emscripten_bind_btSoftRigidDynamicsWorld_getPairCache_0=b.asm.ns).apply(null,arguments)},Fu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0=function(){return(Fu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDispatchInfo_0= b.asm.os).apply(null,arguments)},Gu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1=function(){return(Gu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_1=b.asm.ps).apply(null,arguments)},Hu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2=function(){return(Hu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_2=b.asm.qs).apply(null,arguments)},Iu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3=function(){return(Iu=b._emscripten_bind_btSoftRigidDynamicsWorld_addCollisionObject_3= b.asm.rs).apply(null,arguments)},Ju=b._emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0=function(){return(Ju=b._emscripten_bind_btSoftRigidDynamicsWorld_getBroadphase_0=b.asm.ss).apply(null,arguments)},Ku=b._emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5=function(){return(Ku=b._emscripten_bind_btSoftRigidDynamicsWorld_convexSweepTest_5=b.asm.ts).apply(null,arguments)},Lu=b._emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3=function(){return(Lu=b._emscripten_bind_btSoftRigidDynamicsWorld_contactPairTest_3= b.asm.us).apply(null,arguments)},Mu=b._emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2=function(){return(Mu=b._emscripten_bind_btSoftRigidDynamicsWorld_contactTest_2=b.asm.vs).apply(null,arguments)},Nu=b._emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1=function(){return(Nu=b._emscripten_bind_btSoftRigidDynamicsWorld_updateSingleAabb_1=b.asm.ws).apply(null,arguments)},Ou=b._emscripten_bind_btSoftRigidDynamicsWorld_setDebugDrawer_1=function(){return(Ou=b._emscripten_bind_btSoftRigidDynamicsWorld_setDebugDrawer_1= b.asm.xs).apply(null,arguments)},Pu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDebugDrawer_0=function(){return(Pu=b._emscripten_bind_btSoftRigidDynamicsWorld_getDebugDrawer_0=b.asm.ys).apply(null,arguments)},Qu=b._emscripten_bind_btSoftRigidDynamicsWorld_debugDrawWorld_0=function(){return(Qu=b._emscripten_bind_btSoftRigidDynamicsWorld_debugDrawWorld_0=b.asm.zs).apply(null,arguments)},Ru=b._emscripten_bind_btSoftRigidDynamicsWorld_debugDrawObject_3=function(){return(Ru=b._emscripten_bind_btSoftRigidDynamicsWorld_debugDrawObject_3= b.asm.As).apply(null,arguments)},Su=b._emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1=function(){return(Su=b._emscripten_bind_btSoftRigidDynamicsWorld_setGravity_1=b.asm.Bs).apply(null,arguments)},Tu=b._emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0=function(){return(Tu=b._emscripten_bind_btSoftRigidDynamicsWorld_getGravity_0=b.asm.Cs).apply(null,arguments)},Uu=b._emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1=function(){return(Uu=b._emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_1= b.asm.Ds).apply(null,arguments)},Vu=b._emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3=function(){return(Vu=b._emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_3=b.asm.Es).apply(null,arguments)},Wu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1=function(){return(Wu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeRigidBody_1=b.asm.Fs).apply(null,arguments)},Xu=b._emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1=function(){return(Xu=b._emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_1= b.asm.Gs).apply(null,arguments)},Yu=b._emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2=function(){return(Yu=b._emscripten_bind_btSoftRigidDynamicsWorld_addConstraint_2=b.asm.Hs).apply(null,arguments)},Zu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1=function(){return(Zu=b._emscripten_bind_btSoftRigidDynamicsWorld_removeConstraint_1=b.asm.Is).apply(null,arguments)},$u=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1=function(){return($u=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_1= b.asm.Js).apply(null,arguments)},av=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2=function(){return(av=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_2=b.asm.Ks).apply(null,arguments)},bv=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3=function(){return(bv=b._emscripten_bind_btSoftRigidDynamicsWorld_stepSimulation_3=b.asm.Ls).apply(null,arguments)},cv=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactAddedCallback_1=function(){return(cv=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactAddedCallback_1= b.asm.Ms).apply(null,arguments)},dv=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactProcessedCallback_1=function(){return(dv=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactProcessedCallback_1=b.asm.Ns).apply(null,arguments)},ev=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactDestroyedCallback_1=function(){return(ev=b._emscripten_bind_btSoftRigidDynamicsWorld_setContactDestroyedCallback_1=b.asm.Os).apply(null,arguments)},fv=b._emscripten_bind_btSoftRigidDynamicsWorld_addAction_1= function(){return(fv=b._emscripten_bind_btSoftRigidDynamicsWorld_addAction_1=b.asm.Ps).apply(null,arguments)},gv=b._emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1=function(){return(gv=b._emscripten_bind_btSoftRigidDynamicsWorld_removeAction_1=b.asm.Qs).apply(null,arguments)},hv=b._emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0=function(){return(hv=b._emscripten_bind_btSoftRigidDynamicsWorld_getSolverInfo_0=b.asm.Rs).apply(null,arguments)},iv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_1= function(){return(iv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_1=b.asm.Ss).apply(null,arguments)},jv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_2=function(){return(jv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_2=b.asm.Ts).apply(null,arguments)},kv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_3=function(){return(kv=b._emscripten_bind_btSoftRigidDynamicsWorld_setInternalTickCallback_3=b.asm.Us).apply(null, arguments)},lv=b._emscripten_bind_btSoftRigidDynamicsWorld___destroy___0=function(){return(lv=b._emscripten_bind_btSoftRigidDynamicsWorld___destroy___0=b.asm.Vs).apply(null,arguments)},mv=b._emscripten_bind_btFixedConstraint_btFixedConstraint_4=function(){return(mv=b._emscripten_bind_btFixedConstraint_btFixedConstraint_4=b.asm.Ws).apply(null,arguments)},nv=b._emscripten_bind_btFixedConstraint_enableFeedback_1=function(){return(nv=b._emscripten_bind_btFixedConstraint_enableFeedback_1=b.asm.Xs).apply(null, arguments)},ov=b._emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0=function(){return(ov=b._emscripten_bind_btFixedConstraint_getBreakingImpulseThreshold_0=b.asm.Ys).apply(null,arguments)},pv=b._emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1=function(){return(pv=b._emscripten_bind_btFixedConstraint_setBreakingImpulseThreshold_1=b.asm.Zs).apply(null,arguments)},qv=b._emscripten_bind_btFixedConstraint_getParam_2=function(){return(qv=b._emscripten_bind_btFixedConstraint_getParam_2= b.asm._s).apply(null,arguments)},rv=b._emscripten_bind_btFixedConstraint_setParam_3=function(){return(rv=b._emscripten_bind_btFixedConstraint_setParam_3=b.asm.$s).apply(null,arguments)},sv=b._emscripten_bind_btFixedConstraint___destroy___0=function(){return(sv=b._emscripten_bind_btFixedConstraint___destroy___0=b.asm.at).apply(null,arguments)},tv=b._emscripten_bind_btTransform_btTransform_0=function(){return(tv=b._emscripten_bind_btTransform_btTransform_0=b.asm.bt).apply(null,arguments)},uv=b._emscripten_bind_btTransform_btTransform_2= function(){return(uv=b._emscripten_bind_btTransform_btTransform_2=b.asm.ct).apply(null,arguments)},vv=b._emscripten_bind_btTransform_setIdentity_0=function(){return(vv=b._emscripten_bind_btTransform_setIdentity_0=b.asm.dt).apply(null,arguments)},wv=b._emscripten_bind_btTransform_setOrigin_1=function(){return(wv=b._emscripten_bind_btTransform_setOrigin_1=b.asm.et).apply(null,arguments)},xv=b._emscripten_bind_btTransform_setRotation_1=function(){return(xv=b._emscripten_bind_btTransform_setRotation_1= b.asm.ft).apply(null,arguments)},yv=b._emscripten_bind_btTransform_getOrigin_0=function(){return(yv=b._emscripten_bind_btTransform_getOrigin_0=b.asm.gt).apply(null,arguments)},zv=b._emscripten_bind_btTransform_getRotation_0=function(){return(zv=b._emscripten_bind_btTransform_getRotation_0=b.asm.ht).apply(null,arguments)},Av=b._emscripten_bind_btTransform_getBasis_0=function(){return(Av=b._emscripten_bind_btTransform_getBasis_0=b.asm.it).apply(null,arguments)},Bv=b._emscripten_bind_btTransform_setFromOpenGLMatrix_1= function(){return(Bv=b._emscripten_bind_btTransform_setFromOpenGLMatrix_1=b.asm.jt).apply(null,arguments)},Cv=b._emscripten_bind_btTransform_inverse_0=function(){return(Cv=b._emscripten_bind_btTransform_inverse_0=b.asm.kt).apply(null,arguments)},Dv=b._emscripten_bind_btTransform_op_mul_1=function(){return(Dv=b._emscripten_bind_btTransform_op_mul_1=b.asm.lt).apply(null,arguments)},Ev=b._emscripten_bind_btTransform___destroy___0=function(){return(Ev=b._emscripten_bind_btTransform___destroy___0=b.asm.mt).apply(null, arguments)},Fv=b._emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2=function(){return(Fv=b._emscripten_bind_ClosestRayResultCallback_ClosestRayResultCallback_2=b.asm.nt).apply(null,arguments)},Gv=b._emscripten_bind_ClosestRayResultCallback_hasHit_0=function(){return(Gv=b._emscripten_bind_ClosestRayResultCallback_hasHit_0=b.asm.ot).apply(null,arguments)},Hv=b._emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0=function(){return(Hv=b._emscripten_bind_ClosestRayResultCallback_get_m_rayFromWorld_0= b.asm.pt).apply(null,arguments)},Iv=b._emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1=function(){return(Iv=b._emscripten_bind_ClosestRayResultCallback_set_m_rayFromWorld_1=b.asm.qt).apply(null,arguments)},Jv=b._emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0=function(){return(Jv=b._emscripten_bind_ClosestRayResultCallback_get_m_rayToWorld_0=b.asm.rt).apply(null,arguments)},Kv=b._emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1=function(){return(Kv=b._emscripten_bind_ClosestRayResultCallback_set_m_rayToWorld_1= b.asm.st).apply(null,arguments)},Lv=b._emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0=function(){return(Lv=b._emscripten_bind_ClosestRayResultCallback_get_m_hitNormalWorld_0=b.asm.tt).apply(null,arguments)},Mv=b._emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1=function(){return(Mv=b._emscripten_bind_ClosestRayResultCallback_set_m_hitNormalWorld_1=b.asm.ut).apply(null,arguments)},Nv=b._emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0=function(){return(Nv= b._emscripten_bind_ClosestRayResultCallback_get_m_hitPointWorld_0=b.asm.vt).apply(null,arguments)},Ov=b._emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1=function(){return(Ov=b._emscripten_bind_ClosestRayResultCallback_set_m_hitPointWorld_1=b.asm.wt).apply(null,arguments)},Pv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0=function(){return(Pv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterGroup_0=b.asm.xt).apply(null,arguments)},Qv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1= function(){return(Qv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterGroup_1=b.asm.yt).apply(null,arguments)},Rv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0=function(){return(Rv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionFilterMask_0=b.asm.zt).apply(null,arguments)},Sv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1=function(){return(Sv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionFilterMask_1=b.asm.At).apply(null, arguments)},Tv=b._emscripten_bind_ClosestRayResultCallback_get_m_closestHitFraction_0=function(){return(Tv=b._emscripten_bind_ClosestRayResultCallback_get_m_closestHitFraction_0=b.asm.Bt).apply(null,arguments)},Uv=b._emscripten_bind_ClosestRayResultCallback_set_m_closestHitFraction_1=function(){return(Uv=b._emscripten_bind_ClosestRayResultCallback_set_m_closestHitFraction_1=b.asm.Ct).apply(null,arguments)},Vv=b._emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0=function(){return(Vv= b._emscripten_bind_ClosestRayResultCallback_get_m_collisionObject_0=b.asm.Dt).apply(null,arguments)},Wv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1=function(){return(Wv=b._emscripten_bind_ClosestRayResultCallback_set_m_collisionObject_1=b.asm.Et).apply(null,arguments)},Xv=b._emscripten_bind_ClosestRayResultCallback___destroy___0=function(){return(Xv=b._emscripten_bind_ClosestRayResultCallback___destroy___0=b.asm.Ft).apply(null,arguments)},Yv=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0= function(){return(Yv=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_0=b.asm.Gt).apply(null,arguments)},Zv=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1=function(){return(Zv=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration_btSoftBodyRigidBodyCollisionConfiguration_1=b.asm.Ht).apply(null,arguments)},$v=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0= function(){return($v=b._emscripten_bind_btSoftBodyRigidBodyCollisionConfiguration___destroy___0=b.asm.It).apply(null,arguments)},aw=b._emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0=function(){return(aw=b._emscripten_bind_ConcreteContactResultCallback_ConcreteContactResultCallback_0=b.asm.Jt).apply(null,arguments)},bw=b._emscripten_bind_ConcreteContactResultCallback_addSingleResult_7=function(){return(bw=b._emscripten_bind_ConcreteContactResultCallback_addSingleResult_7= b.asm.Kt).apply(null,arguments)},cw=b._emscripten_bind_ConcreteContactResultCallback___destroy___0=function(){return(cw=b._emscripten_bind_ConcreteContactResultCallback___destroy___0=b.asm.Lt).apply(null,arguments)},dw=b._emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2=function(){return(dw=b._emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_2=b.asm.Mt).apply(null,arguments)},ew=b._emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3=function(){return(ew=b._emscripten_bind_btBvhTriangleMeshShape_btBvhTriangleMeshShape_3= b.asm.Nt).apply(null,arguments)},fw=b._emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1=function(){return(fw=b._emscripten_bind_btBvhTriangleMeshShape_setLocalScaling_1=b.asm.Ot).apply(null,arguments)},gw=b._emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0=function(){return(gw=b._emscripten_bind_btBvhTriangleMeshShape_getLocalScaling_0=b.asm.Pt).apply(null,arguments)},hw=b._emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2=function(){return(hw=b._emscripten_bind_btBvhTriangleMeshShape_calculateLocalInertia_2= b.asm.Qt).apply(null,arguments)},iw=b._emscripten_bind_btBvhTriangleMeshShape___destroy___0=function(){return(iw=b._emscripten_bind_btBvhTriangleMeshShape___destroy___0=b.asm.Rt).apply(null,arguments)},jw=b._emscripten_bind_btConstCollisionObjectArray_size_0=function(){return(jw=b._emscripten_bind_btConstCollisionObjectArray_size_0=b.asm.St).apply(null,arguments)},kw=b._emscripten_bind_btConstCollisionObjectArray_at_1=function(){return(kw=b._emscripten_bind_btConstCollisionObjectArray_at_1=b.asm.Tt).apply(null, arguments)},lw=b._emscripten_bind_btConstCollisionObjectArray___destroy___0=function(){return(lw=b._emscripten_bind_btConstCollisionObjectArray___destroy___0=b.asm.Ut).apply(null,arguments)},mw=b._emscripten_bind_btSliderConstraint_btSliderConstraint_3=function(){return(mw=b._emscripten_bind_btSliderConstraint_btSliderConstraint_3=b.asm.Vt).apply(null,arguments)},nw=b._emscripten_bind_btSliderConstraint_btSliderConstraint_5=function(){return(nw=b._emscripten_bind_btSliderConstraint_btSliderConstraint_5= b.asm.Wt).apply(null,arguments)},ow=b._emscripten_bind_btSliderConstraint_setLowerLinLimit_1=function(){return(ow=b._emscripten_bind_btSliderConstraint_setLowerLinLimit_1=b.asm.Xt).apply(null,arguments)},pw=b._emscripten_bind_btSliderConstraint_setUpperLinLimit_1=function(){return(pw=b._emscripten_bind_btSliderConstraint_setUpperLinLimit_1=b.asm.Yt).apply(null,arguments)},qw=b._emscripten_bind_btSliderConstraint_setLowerAngLimit_1=function(){return(qw=b._emscripten_bind_btSliderConstraint_setLowerAngLimit_1= b.asm.Zt).apply(null,arguments)},rw=b._emscripten_bind_btSliderConstraint_setUpperAngLimit_1=function(){return(rw=b._emscripten_bind_btSliderConstraint_setUpperAngLimit_1=b.asm._t).apply(null,arguments)},sw=b._emscripten_bind_btSliderConstraint_enableFeedback_1=function(){return(sw=b._emscripten_bind_btSliderConstraint_enableFeedback_1=b.asm.$t).apply(null,arguments)},tw=b._emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0=function(){return(tw=b._emscripten_bind_btSliderConstraint_getBreakingImpulseThreshold_0= b.asm.au).apply(null,arguments)},uw=b._emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1=function(){return(uw=b._emscripten_bind_btSliderConstraint_setBreakingImpulseThreshold_1=b.asm.bu).apply(null,arguments)},vw=b._emscripten_bind_btSliderConstraint_getParam_2=function(){return(vw=b._emscripten_bind_btSliderConstraint_getParam_2=b.asm.cu).apply(null,arguments)},ww=b._emscripten_bind_btSliderConstraint_setParam_3=function(){return(ww=b._emscripten_bind_btSliderConstraint_setParam_3= b.asm.du).apply(null,arguments)},xw=b._emscripten_bind_btSliderConstraint___destroy___0=function(){return(xw=b._emscripten_bind_btSliderConstraint___destroy___0=b.asm.eu).apply(null,arguments)},yw=b._emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0=function(){return(yw=b._emscripten_bind_btPairCachingGhostObject_btPairCachingGhostObject_0=b.asm.fu).apply(null,arguments)},zw=b._emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2=function(){return(zw=b._emscripten_bind_btPairCachingGhostObject_setAnisotropicFriction_2= b.asm.gu).apply(null,arguments)},Aw=b._emscripten_bind_btPairCachingGhostObject_getCollisionShape_0=function(){return(Aw=b._emscripten_bind_btPairCachingGhostObject_getCollisionShape_0=b.asm.hu).apply(null,arguments)},Bw=b._emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1=function(){return(Bw=b._emscripten_bind_btPairCachingGhostObject_setContactProcessingThreshold_1=b.asm.iu).apply(null,arguments)},Cw=b._emscripten_bind_btPairCachingGhostObject_setActivationState_1=function(){return(Cw= b._emscripten_bind_btPairCachingGhostObject_setActivationState_1=b.asm.ju).apply(null,arguments)},Dw=b._emscripten_bind_btPairCachingGhostObject_forceActivationState_1=function(){return(Dw=b._emscripten_bind_btPairCachingGhostObject_forceActivationState_1=b.asm.ku).apply(null,arguments)},Ew=b._emscripten_bind_btPairCachingGhostObject_activate_0=function(){return(Ew=b._emscripten_bind_btPairCachingGhostObject_activate_0=b.asm.lu).apply(null,arguments)},Fw=b._emscripten_bind_btPairCachingGhostObject_activate_1= function(){return(Fw=b._emscripten_bind_btPairCachingGhostObject_activate_1=b.asm.mu).apply(null,arguments)},Gw=b._emscripten_bind_btPairCachingGhostObject_isActive_0=function(){return(Gw=b._emscripten_bind_btPairCachingGhostObject_isActive_0=b.asm.nu).apply(null,arguments)},Hw=b._emscripten_bind_btPairCachingGhostObject_isKinematicObject_0=function(){return(Hw=b._emscripten_bind_btPairCachingGhostObject_isKinematicObject_0=b.asm.ou).apply(null,arguments)},Iw=b._emscripten_bind_btPairCachingGhostObject_isStaticObject_0= function(){return(Iw=b._emscripten_bind_btPairCachingGhostObject_isStaticObject_0=b.asm.pu).apply(null,arguments)},Jw=b._emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0=function(){return(Jw=b._emscripten_bind_btPairCachingGhostObject_isStaticOrKinematicObject_0=b.asm.qu).apply(null,arguments)},Kw=b._emscripten_bind_btPairCachingGhostObject_getRestitution_0=function(){return(Kw=b._emscripten_bind_btPairCachingGhostObject_getRestitution_0=b.asm.ru).apply(null,arguments)},Lw=b._emscripten_bind_btPairCachingGhostObject_getFriction_0= function(){return(Lw=b._emscripten_bind_btPairCachingGhostObject_getFriction_0=b.asm.su).apply(null,arguments)},Mw=b._emscripten_bind_btPairCachingGhostObject_getRollingFriction_0=function(){return(Mw=b._emscripten_bind_btPairCachingGhostObject_getRollingFriction_0=b.asm.tu).apply(null,arguments)},Nw=b._emscripten_bind_btPairCachingGhostObject_setRestitution_1=function(){return(Nw=b._emscripten_bind_btPairCachingGhostObject_setRestitution_1=b.asm.uu).apply(null,arguments)},Ow=b._emscripten_bind_btPairCachingGhostObject_setFriction_1= function(){return(Ow=b._emscripten_bind_btPairCachingGhostObject_setFriction_1=b.asm.vu).apply(null,arguments)},Pw=b._emscripten_bind_btPairCachingGhostObject_setRollingFriction_1=function(){return(Pw=b._emscripten_bind_btPairCachingGhostObject_setRollingFriction_1=b.asm.wu).apply(null,arguments)},Qw=b._emscripten_bind_btPairCachingGhostObject_getWorldTransform_0=function(){return(Qw=b._emscripten_bind_btPairCachingGhostObject_getWorldTransform_0=b.asm.xu).apply(null,arguments)},Rw=b._emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0= function(){return(Rw=b._emscripten_bind_btPairCachingGhostObject_getCollisionFlags_0=b.asm.yu).apply(null,arguments)},Sw=b._emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1=function(){return(Sw=b._emscripten_bind_btPairCachingGhostObject_setCollisionFlags_1=b.asm.zu).apply(null,arguments)},Tw=b._emscripten_bind_btPairCachingGhostObject_setWorldTransform_1=function(){return(Tw=b._emscripten_bind_btPairCachingGhostObject_setWorldTransform_1=b.asm.Au).apply(null,arguments)},Uw=b._emscripten_bind_btPairCachingGhostObject_setCollisionShape_1= function(){return(Uw=b._emscripten_bind_btPairCachingGhostObject_setCollisionShape_1=b.asm.Bu).apply(null,arguments)},Vw=b._emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1=function(){return(Vw=b._emscripten_bind_btPairCachingGhostObject_setCcdMotionThreshold_1=b.asm.Cu).apply(null,arguments)},Ww=b._emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1=function(){return(Ww=b._emscripten_bind_btPairCachingGhostObject_setCcdSweptSphereRadius_1=b.asm.Du).apply(null,arguments)}, Xw=b._emscripten_bind_btPairCachingGhostObject_getUserIndex_0=function(){return(Xw=b._emscripten_bind_btPairCachingGhostObject_getUserIndex_0=b.asm.Eu).apply(null,arguments)},Yw=b._emscripten_bind_btPairCachingGhostObject_setUserIndex_1=function(){return(Yw=b._emscripten_bind_btPairCachingGhostObject_setUserIndex_1=b.asm.Fu).apply(null,arguments)},Zw=b._emscripten_bind_btPairCachingGhostObject_getUserPointer_0=function(){return(Zw=b._emscripten_bind_btPairCachingGhostObject_getUserPointer_0=b.asm.Gu).apply(null, arguments)},$w=b._emscripten_bind_btPairCachingGhostObject_setUserPointer_1=function(){return($w=b._emscripten_bind_btPairCachingGhostObject_setUserPointer_1=b.asm.Hu).apply(null,arguments)},ax=b._emscripten_bind_btPairCachingGhostObject_getBroadphaseHandle_0=function(){return(ax=b._emscripten_bind_btPairCachingGhostObject_getBroadphaseHandle_0=b.asm.Iu).apply(null,arguments)},bx=b._emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0=function(){return(bx=b._emscripten_bind_btPairCachingGhostObject_getNumOverlappingObjects_0= b.asm.Ju).apply(null,arguments)},cx=b._emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1=function(){return(cx=b._emscripten_bind_btPairCachingGhostObject_getOverlappingObject_1=b.asm.Ku).apply(null,arguments)},dx=b._emscripten_bind_btPairCachingGhostObject___destroy___0=function(){return(dx=b._emscripten_bind_btPairCachingGhostObject___destroy___0=b.asm.Lu).apply(null,arguments)},ex=b._emscripten_bind_btManifoldPoint_getPositionWorldOnA_0=function(){return(ex=b._emscripten_bind_btManifoldPoint_getPositionWorldOnA_0= b.asm.Mu).apply(null,arguments)},fx=b._emscripten_bind_btManifoldPoint_getPositionWorldOnB_0=function(){return(fx=b._emscripten_bind_btManifoldPoint_getPositionWorldOnB_0=b.asm.Nu).apply(null,arguments)},gx=b._emscripten_bind_btManifoldPoint_getAppliedImpulse_0=function(){return(gx=b._emscripten_bind_btManifoldPoint_getAppliedImpulse_0=b.asm.Ou).apply(null,arguments)},hx=b._emscripten_bind_btManifoldPoint_getDistance_0=function(){return(hx=b._emscripten_bind_btManifoldPoint_getDistance_0=b.asm.Pu).apply(null, arguments)},ix=b._emscripten_bind_btManifoldPoint_get_m_localPointA_0=function(){return(ix=b._emscripten_bind_btManifoldPoint_get_m_localPointA_0=b.asm.Qu).apply(null,arguments)},jx=b._emscripten_bind_btManifoldPoint_set_m_localPointA_1=function(){return(jx=b._emscripten_bind_btManifoldPoint_set_m_localPointA_1=b.asm.Ru).apply(null,arguments)},kx=b._emscripten_bind_btManifoldPoint_get_m_localPointB_0=function(){return(kx=b._emscripten_bind_btManifoldPoint_get_m_localPointB_0=b.asm.Su).apply(null, arguments)},lx=b._emscripten_bind_btManifoldPoint_set_m_localPointB_1=function(){return(lx=b._emscripten_bind_btManifoldPoint_set_m_localPointB_1=b.asm.Tu).apply(null,arguments)},mx=b._emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0=function(){return(mx=b._emscripten_bind_btManifoldPoint_get_m_positionWorldOnB_0=b.asm.Uu).apply(null,arguments)},nx=b._emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1=function(){return(nx=b._emscripten_bind_btManifoldPoint_set_m_positionWorldOnB_1=b.asm.Vu).apply(null, arguments)},ox=b._emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0=function(){return(ox=b._emscripten_bind_btManifoldPoint_get_m_positionWorldOnA_0=b.asm.Wu).apply(null,arguments)},px=b._emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1=function(){return(px=b._emscripten_bind_btManifoldPoint_set_m_positionWorldOnA_1=b.asm.Xu).apply(null,arguments)},qx=b._emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0=function(){return(qx=b._emscripten_bind_btManifoldPoint_get_m_normalWorldOnB_0= b.asm.Yu).apply(null,arguments)},rx=b._emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1=function(){return(rx=b._emscripten_bind_btManifoldPoint_set_m_normalWorldOnB_1=b.asm.Zu).apply(null,arguments)},sx=b._emscripten_bind_btManifoldPoint_get_m_userPersistentData_0=function(){return(sx=b._emscripten_bind_btManifoldPoint_get_m_userPersistentData_0=b.asm._u).apply(null,arguments)},tx=b._emscripten_bind_btManifoldPoint_set_m_userPersistentData_1=function(){return(tx=b._emscripten_bind_btManifoldPoint_set_m_userPersistentData_1= b.asm.$u).apply(null,arguments)},ux=b._emscripten_bind_btManifoldPoint___destroy___0=function(){return(ux=b._emscripten_bind_btManifoldPoint___destroy___0=b.asm.av).apply(null,arguments)},vx=b._emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2=function(){return(vx=b._emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_2=b.asm.bv).apply(null,arguments)},wx=b._emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4=function(){return(wx=b._emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_4= b.asm.cv).apply(null,arguments)},xx=b._emscripten_bind_btPoint2PointConstraint_setPivotA_1=function(){return(xx=b._emscripten_bind_btPoint2PointConstraint_setPivotA_1=b.asm.dv).apply(null,arguments)},yx=b._emscripten_bind_btPoint2PointConstraint_setPivotB_1=function(){return(yx=b._emscripten_bind_btPoint2PointConstraint_setPivotB_1=b.asm.ev).apply(null,arguments)},zx=b._emscripten_bind_btPoint2PointConstraint_getPivotInA_0=function(){return(zx=b._emscripten_bind_btPoint2PointConstraint_getPivotInA_0= b.asm.fv).apply(null,arguments)},Ax=b._emscripten_bind_btPoint2PointConstraint_getPivotInB_0=function(){return(Ax=b._emscripten_bind_btPoint2PointConstraint_getPivotInB_0=b.asm.gv).apply(null,arguments)},Bx=b._emscripten_bind_btPoint2PointConstraint_enableFeedback_1=function(){return(Bx=b._emscripten_bind_btPoint2PointConstraint_enableFeedback_1=b.asm.hv).apply(null,arguments)},Cx=b._emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0=function(){return(Cx=b._emscripten_bind_btPoint2PointConstraint_getBreakingImpulseThreshold_0= b.asm.iv).apply(null,arguments)},Dx=b._emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1=function(){return(Dx=b._emscripten_bind_btPoint2PointConstraint_setBreakingImpulseThreshold_1=b.asm.jv).apply(null,arguments)},Ex=b._emscripten_bind_btPoint2PointConstraint_getParam_2=function(){return(Ex=b._emscripten_bind_btPoint2PointConstraint_getParam_2=b.asm.kv).apply(null,arguments)},Fx=b._emscripten_bind_btPoint2PointConstraint_setParam_3=function(){return(Fx=b._emscripten_bind_btPoint2PointConstraint_setParam_3= b.asm.lv).apply(null,arguments)},Gx=b._emscripten_bind_btPoint2PointConstraint_get_m_setting_0=function(){return(Gx=b._emscripten_bind_btPoint2PointConstraint_get_m_setting_0=b.asm.mv).apply(null,arguments)},Hx=b._emscripten_bind_btPoint2PointConstraint_set_m_setting_1=function(){return(Hx=b._emscripten_bind_btPoint2PointConstraint_set_m_setting_1=b.asm.nv).apply(null,arguments)},Ix=b._emscripten_bind_btPoint2PointConstraint___destroy___0=function(){return(Ix=b._emscripten_bind_btPoint2PointConstraint___destroy___0= b.asm.ov).apply(null,arguments)},Jx=b._emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0=function(){return(Jx=b._emscripten_bind_btSoftBodyHelpers_btSoftBodyHelpers_0=b.asm.pv).apply(null,arguments)},Kx=b._emscripten_bind_btSoftBodyHelpers_CreateRope_5=function(){return(Kx=b._emscripten_bind_btSoftBodyHelpers_CreateRope_5=b.asm.qv).apply(null,arguments)},Lx=b._emscripten_bind_btSoftBodyHelpers_CreatePatch_9=function(){return(Lx=b._emscripten_bind_btSoftBodyHelpers_CreatePatch_9=b.asm.rv).apply(null, arguments)},Mx=b._emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10=function(){return(Mx=b._emscripten_bind_btSoftBodyHelpers_CreatePatchUV_10=b.asm.sv).apply(null,arguments)},Nx=b._emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4=function(){return(Nx=b._emscripten_bind_btSoftBodyHelpers_CreateEllipsoid_4=b.asm.tv).apply(null,arguments)},Ox=b._emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5=function(){return(Ox=b._emscripten_bind_btSoftBodyHelpers_CreateFromTriMesh_5=b.asm.uv).apply(null, arguments)},Px=b._emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4=function(){return(Px=b._emscripten_bind_btSoftBodyHelpers_CreateFromConvexHull_4=b.asm.vv).apply(null,arguments)},Qx=b._emscripten_bind_btSoftBodyHelpers___destroy___0=function(){return(Qx=b._emscripten_bind_btSoftBodyHelpers___destroy___0=b.asm.wv).apply(null,arguments)},Rx=b._emscripten_bind_btBroadphaseProxy_get_m_collisionFilterGroup_0=function(){return(Rx=b._emscripten_bind_btBroadphaseProxy_get_m_collisionFilterGroup_0= b.asm.xv).apply(null,arguments)},Sx=b._emscripten_bind_btBroadphaseProxy_set_m_collisionFilterGroup_1=function(){return(Sx=b._emscripten_bind_btBroadphaseProxy_set_m_collisionFilterGroup_1=b.asm.yv).apply(null,arguments)},Tx=b._emscripten_bind_btBroadphaseProxy_get_m_collisionFilterMask_0=function(){return(Tx=b._emscripten_bind_btBroadphaseProxy_get_m_collisionFilterMask_0=b.asm.zv).apply(null,arguments)},Ux=b._emscripten_bind_btBroadphaseProxy_set_m_collisionFilterMask_1=function(){return(Ux=b._emscripten_bind_btBroadphaseProxy_set_m_collisionFilterMask_1= b.asm.Av).apply(null,arguments)},Vx=b._emscripten_bind_btBroadphaseProxy___destroy___0=function(){return(Vx=b._emscripten_bind_btBroadphaseProxy___destroy___0=b.asm.Bv).apply(null,arguments)},Wx=b._emscripten_bind_tNodeArray_size_0=function(){return(Wx=b._emscripten_bind_tNodeArray_size_0=b.asm.Cv).apply(null,arguments)},Xx=b._emscripten_bind_tNodeArray_at_1=function(){return(Xx=b._emscripten_bind_tNodeArray_at_1=b.asm.Dv).apply(null,arguments)},Yx=b._emscripten_bind_tNodeArray___destroy___0=function(){return(Yx= b._emscripten_bind_tNodeArray___destroy___0=b.asm.Ev).apply(null,arguments)},Zx=b._emscripten_bind_btBoxShape_btBoxShape_1=function(){return(Zx=b._emscripten_bind_btBoxShape_btBoxShape_1=b.asm.Fv).apply(null,arguments)},$x=b._emscripten_bind_btBoxShape_setMargin_1=function(){return($x=b._emscripten_bind_btBoxShape_setMargin_1=b.asm.Gv).apply(null,arguments)},ay=b._emscripten_bind_btBoxShape_getMargin_0=function(){return(ay=b._emscripten_bind_btBoxShape_getMargin_0=b.asm.Hv).apply(null,arguments)}, by=b._emscripten_bind_btBoxShape_setLocalScaling_1=function(){return(by=b._emscripten_bind_btBoxShape_setLocalScaling_1=b.asm.Iv).apply(null,arguments)},cy=b._emscripten_bind_btBoxShape_getLocalScaling_0=function(){return(cy=b._emscripten_bind_btBoxShape_getLocalScaling_0=b.asm.Jv).apply(null,arguments)},dy=b._emscripten_bind_btBoxShape_calculateLocalInertia_2=function(){return(dy=b._emscripten_bind_btBoxShape_calculateLocalInertia_2=b.asm.Kv).apply(null,arguments)},ey=b._emscripten_bind_btBoxShape___destroy___0= function(){return(ey=b._emscripten_bind_btBoxShape___destroy___0=b.asm.Lv).apply(null,arguments)},fy=b._emscripten_bind_btFace_get_m_indices_0=function(){return(fy=b._emscripten_bind_btFace_get_m_indices_0=b.asm.Mv).apply(null,arguments)},gy=b._emscripten_bind_btFace_set_m_indices_1=function(){return(gy=b._emscripten_bind_btFace_set_m_indices_1=b.asm.Nv).apply(null,arguments)},hy=b._emscripten_bind_btFace_get_m_plane_1=function(){return(hy=b._emscripten_bind_btFace_get_m_plane_1=b.asm.Ov).apply(null, arguments)},iy=b._emscripten_bind_btFace_set_m_plane_2=function(){return(iy=b._emscripten_bind_btFace_set_m_plane_2=b.asm.Pv).apply(null,arguments)},jy=b._emscripten_bind_btFace___destroy___0=function(){return(jy=b._emscripten_bind_btFace___destroy___0=b.asm.Qv).apply(null,arguments)},ky=b._emscripten_bind_DebugDrawer_DebugDrawer_0=function(){return(ky=b._emscripten_bind_DebugDrawer_DebugDrawer_0=b.asm.Rv).apply(null,arguments)},ly=b._emscripten_bind_DebugDrawer_drawLine_3=function(){return(ly=b._emscripten_bind_DebugDrawer_drawLine_3= b.asm.Sv).apply(null,arguments)},my=b._emscripten_bind_DebugDrawer_drawContactPoint_5=function(){return(my=b._emscripten_bind_DebugDrawer_drawContactPoint_5=b.asm.Tv).apply(null,arguments)},ny=b._emscripten_bind_DebugDrawer_reportErrorWarning_1=function(){return(ny=b._emscripten_bind_DebugDrawer_reportErrorWarning_1=b.asm.Uv).apply(null,arguments)},oy=b._emscripten_bind_DebugDrawer_draw3dText_2=function(){return(oy=b._emscripten_bind_DebugDrawer_draw3dText_2=b.asm.Vv).apply(null,arguments)},py=b._emscripten_bind_DebugDrawer_setDebugMode_1= function(){return(py=b._emscripten_bind_DebugDrawer_setDebugMode_1=b.asm.Wv).apply(null,arguments)},qy=b._emscripten_bind_DebugDrawer_getDebugMode_0=function(){return(qy=b._emscripten_bind_DebugDrawer_getDebugMode_0=b.asm.Xv).apply(null,arguments)},ry=b._emscripten_bind_DebugDrawer___destroy___0=function(){return(ry=b._emscripten_bind_DebugDrawer___destroy___0=b.asm.Yv).apply(null,arguments)},sy=b._emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2=function(){return(sy=b._emscripten_bind_btCapsuleShapeX_btCapsuleShapeX_2= b.asm.Zv).apply(null,arguments)},ty=b._emscripten_bind_btCapsuleShapeX_setMargin_1=function(){return(ty=b._emscripten_bind_btCapsuleShapeX_setMargin_1=b.asm._v).apply(null,arguments)},uy=b._emscripten_bind_btCapsuleShapeX_getMargin_0=function(){return(uy=b._emscripten_bind_btCapsuleShapeX_getMargin_0=b.asm.$v).apply(null,arguments)},vy=b._emscripten_bind_btCapsuleShapeX_getUpAxis_0=function(){return(vy=b._emscripten_bind_btCapsuleShapeX_getUpAxis_0=b.asm.aw).apply(null,arguments)},wy=b._emscripten_bind_btCapsuleShapeX_getRadius_0= function(){return(wy=b._emscripten_bind_btCapsuleShapeX_getRadius_0=b.asm.bw).apply(null,arguments)},xy=b._emscripten_bind_btCapsuleShapeX_getHalfHeight_0=function(){return(xy=b._emscripten_bind_btCapsuleShapeX_getHalfHeight_0=b.asm.cw).apply(null,arguments)},yy=b._emscripten_bind_btCapsuleShapeX_setLocalScaling_1=function(){return(yy=b._emscripten_bind_btCapsuleShapeX_setLocalScaling_1=b.asm.dw).apply(null,arguments)},zy=b._emscripten_bind_btCapsuleShapeX_getLocalScaling_0=function(){return(zy=b._emscripten_bind_btCapsuleShapeX_getLocalScaling_0= b.asm.ew).apply(null,arguments)},Ay=b._emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2=function(){return(Ay=b._emscripten_bind_btCapsuleShapeX_calculateLocalInertia_2=b.asm.fw).apply(null,arguments)},By=b._emscripten_bind_btCapsuleShapeX___destroy___0=function(){return(By=b._emscripten_bind_btCapsuleShapeX___destroy___0=b.asm.gw).apply(null,arguments)},Cy=b._emscripten_bind_btQuaternion_btQuaternion_4=function(){return(Cy=b._emscripten_bind_btQuaternion_btQuaternion_4=b.asm.hw).apply(null, arguments)},Dy=b._emscripten_bind_btQuaternion_setValue_4=function(){return(Dy=b._emscripten_bind_btQuaternion_setValue_4=b.asm.iw).apply(null,arguments)},Ey=b._emscripten_bind_btQuaternion_setEulerZYX_3=function(){return(Ey=b._emscripten_bind_btQuaternion_setEulerZYX_3=b.asm.jw).apply(null,arguments)},Fy=b._emscripten_bind_btQuaternion_setRotation_2=function(){return(Fy=b._emscripten_bind_btQuaternion_setRotation_2=b.asm.kw).apply(null,arguments)},Gy=b._emscripten_bind_btQuaternion_normalize_0=function(){return(Gy= b._emscripten_bind_btQuaternion_normalize_0=b.asm.lw).apply(null,arguments)},Hy=b._emscripten_bind_btQuaternion_length2_0=function(){return(Hy=b._emscripten_bind_btQuaternion_length2_0=b.asm.mw).apply(null,arguments)},Iy=b._emscripten_bind_btQuaternion_length_0=function(){return(Iy=b._emscripten_bind_btQuaternion_length_0=b.asm.nw).apply(null,arguments)},Jy=b._emscripten_bind_btQuaternion_dot_1=function(){return(Jy=b._emscripten_bind_btQuaternion_dot_1=b.asm.ow).apply(null,arguments)},Ky=b._emscripten_bind_btQuaternion_normalized_0= function(){return(Ky=b._emscripten_bind_btQuaternion_normalized_0=b.asm.pw).apply(null,arguments)},Ly=b._emscripten_bind_btQuaternion_getAxis_0=function(){return(Ly=b._emscripten_bind_btQuaternion_getAxis_0=b.asm.qw).apply(null,arguments)},My=b._emscripten_bind_btQuaternion_inverse_0=function(){return(My=b._emscripten_bind_btQuaternion_inverse_0=b.asm.rw).apply(null,arguments)},Ny=b._emscripten_bind_btQuaternion_getAngle_0=function(){return(Ny=b._emscripten_bind_btQuaternion_getAngle_0=b.asm.sw).apply(null, arguments)},Oy=b._emscripten_bind_btQuaternion_getAngleShortestPath_0=function(){return(Oy=b._emscripten_bind_btQuaternion_getAngleShortestPath_0=b.asm.tw).apply(null,arguments)},Py=b._emscripten_bind_btQuaternion_angle_1=function(){return(Py=b._emscripten_bind_btQuaternion_angle_1=b.asm.uw).apply(null,arguments)},Qy=b._emscripten_bind_btQuaternion_angleShortestPath_1=function(){return(Qy=b._emscripten_bind_btQuaternion_angleShortestPath_1=b.asm.vw).apply(null,arguments)},Ry=b._emscripten_bind_btQuaternion_op_add_1= function(){return(Ry=b._emscripten_bind_btQuaternion_op_add_1=b.asm.ww).apply(null,arguments)},Sy=b._emscripten_bind_btQuaternion_op_sub_1=function(){return(Sy=b._emscripten_bind_btQuaternion_op_sub_1=b.asm.xw).apply(null,arguments)},Ty=b._emscripten_bind_btQuaternion_op_mul_1=function(){return(Ty=b._emscripten_bind_btQuaternion_op_mul_1=b.asm.yw).apply(null,arguments)},Uy=b._emscripten_bind_btQuaternion_op_mulq_1=function(){return(Uy=b._emscripten_bind_btQuaternion_op_mulq_1=b.asm.zw).apply(null, arguments)},Vy=b._emscripten_bind_btQuaternion_op_div_1=function(){return(Vy=b._emscripten_bind_btQuaternion_op_div_1=b.asm.Aw).apply(null,arguments)},Wy=b._emscripten_bind_btQuaternion_x_0=function(){return(Wy=b._emscripten_bind_btQuaternion_x_0=b.asm.Bw).apply(null,arguments)},Xy=b._emscripten_bind_btQuaternion_y_0=function(){return(Xy=b._emscripten_bind_btQuaternion_y_0=b.asm.Cw).apply(null,arguments)},Yy=b._emscripten_bind_btQuaternion_z_0=function(){return(Yy=b._emscripten_bind_btQuaternion_z_0= b.asm.Dw).apply(null,arguments)},Zy=b._emscripten_bind_btQuaternion_w_0=function(){return(Zy=b._emscripten_bind_btQuaternion_w_0=b.asm.Ew).apply(null,arguments)},$y=b._emscripten_bind_btQuaternion_setX_1=function(){return($y=b._emscripten_bind_btQuaternion_setX_1=b.asm.Fw).apply(null,arguments)},az=b._emscripten_bind_btQuaternion_setY_1=function(){return(az=b._emscripten_bind_btQuaternion_setY_1=b.asm.Gw).apply(null,arguments)},bz=b._emscripten_bind_btQuaternion_setZ_1=function(){return(bz=b._emscripten_bind_btQuaternion_setZ_1= b.asm.Hw).apply(null,arguments)},cz=b._emscripten_bind_btQuaternion_setW_1=function(){return(cz=b._emscripten_bind_btQuaternion_setW_1=b.asm.Iw).apply(null,arguments)},dz=b._emscripten_bind_btQuaternion___destroy___0=function(){return(dz=b._emscripten_bind_btQuaternion___destroy___0=b.asm.Jw).apply(null,arguments)},ez=b._emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2=function(){return(ez=b._emscripten_bind_btCapsuleShapeZ_btCapsuleShapeZ_2=b.asm.Kw).apply(null,arguments)},fz=b._emscripten_bind_btCapsuleShapeZ_setMargin_1= function(){return(fz=b._emscripten_bind_btCapsuleShapeZ_setMargin_1=b.asm.Lw).apply(null,arguments)},gz=b._emscripten_bind_btCapsuleShapeZ_getMargin_0=function(){return(gz=b._emscripten_bind_btCapsuleShapeZ_getMargin_0=b.asm.Mw).apply(null,arguments)},hz=b._emscripten_bind_btCapsuleShapeZ_getUpAxis_0=function(){return(hz=b._emscripten_bind_btCapsuleShapeZ_getUpAxis_0=b.asm.Nw).apply(null,arguments)},iz=b._emscripten_bind_btCapsuleShapeZ_getRadius_0=function(){return(iz=b._emscripten_bind_btCapsuleShapeZ_getRadius_0= b.asm.Ow).apply(null,arguments)},jz=b._emscripten_bind_btCapsuleShapeZ_getHalfHeight_0=function(){return(jz=b._emscripten_bind_btCapsuleShapeZ_getHalfHeight_0=b.asm.Pw).apply(null,arguments)},kz=b._emscripten_bind_btCapsuleShapeZ_setLocalScaling_1=function(){return(kz=b._emscripten_bind_btCapsuleShapeZ_setLocalScaling_1=b.asm.Qw).apply(null,arguments)},lz=b._emscripten_bind_btCapsuleShapeZ_getLocalScaling_0=function(){return(lz=b._emscripten_bind_btCapsuleShapeZ_getLocalScaling_0=b.asm.Rw).apply(null, arguments)},mz=b._emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2=function(){return(mz=b._emscripten_bind_btCapsuleShapeZ_calculateLocalInertia_2=b.asm.Sw).apply(null,arguments)},nz=b._emscripten_bind_btCapsuleShapeZ___destroy___0=function(){return(nz=b._emscripten_bind_btCapsuleShapeZ___destroy___0=b.asm.Tw).apply(null,arguments)},oz=b._emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0=function(){return(oz=b._emscripten_bind_btContactSolverInfo_get_m_splitImpulse_0=b.asm.Uw).apply(null, arguments)},pz=b._emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1=function(){return(pz=b._emscripten_bind_btContactSolverInfo_set_m_splitImpulse_1=b.asm.Vw).apply(null,arguments)},qz=b._emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0=function(){return(qz=b._emscripten_bind_btContactSolverInfo_get_m_splitImpulsePenetrationThreshold_0=b.asm.Ww).apply(null,arguments)},rz=b._emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1=function(){return(rz= b._emscripten_bind_btContactSolverInfo_set_m_splitImpulsePenetrationThreshold_1=b.asm.Xw).apply(null,arguments)},sz=b._emscripten_bind_btContactSolverInfo_get_m_numIterations_0=function(){return(sz=b._emscripten_bind_btContactSolverInfo_get_m_numIterations_0=b.asm.Yw).apply(null,arguments)},tz=b._emscripten_bind_btContactSolverInfo_set_m_numIterations_1=function(){return(tz=b._emscripten_bind_btContactSolverInfo_set_m_numIterations_1=b.asm.Zw).apply(null,arguments)},uz=b._emscripten_bind_btContactSolverInfo___destroy___0= function(){return(uz=b._emscripten_bind_btContactSolverInfo___destroy___0=b.asm._w).apply(null,arguments)},vz=b._emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3=function(){return(vz=b._emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_3=b.asm.$w).apply(null,arguments)},wz=b._emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5=function(){return(wz=b._emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_5= b.asm.ax).apply(null,arguments)},xz=b._emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2=function(){return(xz=b._emscripten_bind_btGeneric6DofSpringConstraint_enableSpring_2=b.asm.bx).apply(null,arguments)},yz=b._emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2=function(){return(yz=b._emscripten_bind_btGeneric6DofSpringConstraint_setStiffness_2=b.asm.cx).apply(null,arguments)},zz=b._emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2=function(){return(zz=b._emscripten_bind_btGeneric6DofSpringConstraint_setDamping_2= b.asm.dx).apply(null,arguments)},Az=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_0=function(){return(Az=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_0=b.asm.ex).apply(null,arguments)},Bz=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_1=function(){return(Bz=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_1=b.asm.fx).apply(null,arguments)},Cz=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_2= function(){return(Cz=b._emscripten_bind_btGeneric6DofSpringConstraint_setEquilibriumPoint_2=b.asm.gx).apply(null,arguments)},Dz=b._emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1=function(){return(Dz=b._emscripten_bind_btGeneric6DofSpringConstraint_setLinearLowerLimit_1=b.asm.hx).apply(null,arguments)},Ez=b._emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1=function(){return(Ez=b._emscripten_bind_btGeneric6DofSpringConstraint_setLinearUpperLimit_1=b.asm.ix).apply(null, arguments)},Fz=b._emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1=function(){return(Fz=b._emscripten_bind_btGeneric6DofSpringConstraint_setAngularLowerLimit_1=b.asm.jx).apply(null,arguments)},Gz=b._emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1=function(){return(Gz=b._emscripten_bind_btGeneric6DofSpringConstraint_setAngularUpperLimit_1=b.asm.kx).apply(null,arguments)},Hz=b._emscripten_bind_btGeneric6DofSpringConstraint_getFrameOffsetA_0=function(){return(Hz= b._emscripten_bind_btGeneric6DofSpringConstraint_getFrameOffsetA_0=b.asm.lx).apply(null,arguments)},Iz=b._emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1=function(){return(Iz=b._emscripten_bind_btGeneric6DofSpringConstraint_enableFeedback_1=b.asm.mx).apply(null,arguments)},Jz=b._emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0=function(){return(Jz=b._emscripten_bind_btGeneric6DofSpringConstraint_getBreakingImpulseThreshold_0=b.asm.nx).apply(null,arguments)}, Kz=b._emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1=function(){return(Kz=b._emscripten_bind_btGeneric6DofSpringConstraint_setBreakingImpulseThreshold_1=b.asm.ox).apply(null,arguments)},Lz=b._emscripten_bind_btGeneric6DofSpringConstraint_getParam_2=function(){return(Lz=b._emscripten_bind_btGeneric6DofSpringConstraint_getParam_2=b.asm.px).apply(null,arguments)},Mz=b._emscripten_bind_btGeneric6DofSpringConstraint_setParam_3=function(){return(Mz=b._emscripten_bind_btGeneric6DofSpringConstraint_setParam_3= b.asm.qx).apply(null,arguments)},Nz=b._emscripten_bind_btGeneric6DofSpringConstraint___destroy___0=function(){return(Nz=b._emscripten_bind_btGeneric6DofSpringConstraint___destroy___0=b.asm.rx).apply(null,arguments)},Oz=b._emscripten_bind_btSphereShape_btSphereShape_1=function(){return(Oz=b._emscripten_bind_btSphereShape_btSphereShape_1=b.asm.sx).apply(null,arguments)},Pz=b._emscripten_bind_btSphereShape_setMargin_1=function(){return(Pz=b._emscripten_bind_btSphereShape_setMargin_1=b.asm.tx).apply(null, arguments)},Qz=b._emscripten_bind_btSphereShape_getMargin_0=function(){return(Qz=b._emscripten_bind_btSphereShape_getMargin_0=b.asm.ux).apply(null,arguments)},Rz=b._emscripten_bind_btSphereShape_setLocalScaling_1=function(){return(Rz=b._emscripten_bind_btSphereShape_setLocalScaling_1=b.asm.vx).apply(null,arguments)},Sz=b._emscripten_bind_btSphereShape_getLocalScaling_0=function(){return(Sz=b._emscripten_bind_btSphereShape_getLocalScaling_0=b.asm.wx).apply(null,arguments)},Tz=b._emscripten_bind_btSphereShape_calculateLocalInertia_2= function(){return(Tz=b._emscripten_bind_btSphereShape_calculateLocalInertia_2=b.asm.xx).apply(null,arguments)},Uz=b._emscripten_bind_btSphereShape___destroy___0=function(){return(Uz=b._emscripten_bind_btSphereShape___destroy___0=b.asm.yx).apply(null,arguments)},Vz=b._emscripten_bind_Face_get_m_n_1=function(){return(Vz=b._emscripten_bind_Face_get_m_n_1=b.asm.zx).apply(null,arguments)},Wz=b._emscripten_bind_Face_set_m_n_2=function(){return(Wz=b._emscripten_bind_Face_set_m_n_2=b.asm.Ax).apply(null,arguments)}, Xz=b._emscripten_bind_Face_get_m_normal_0=function(){return(Xz=b._emscripten_bind_Face_get_m_normal_0=b.asm.Bx).apply(null,arguments)},Yz=b._emscripten_bind_Face_set_m_normal_1=function(){return(Yz=b._emscripten_bind_Face_set_m_normal_1=b.asm.Cx).apply(null,arguments)},Zz=b._emscripten_bind_Face_get_m_ra_0=function(){return(Zz=b._emscripten_bind_Face_get_m_ra_0=b.asm.Dx).apply(null,arguments)},$z=b._emscripten_bind_Face_set_m_ra_1=function(){return($z=b._emscripten_bind_Face_set_m_ra_1=b.asm.Ex).apply(null, arguments)},aA=b._emscripten_bind_Face___destroy___0=function(){return(aA=b._emscripten_bind_Face___destroy___0=b.asm.Fx).apply(null,arguments)},bA=b._emscripten_bind_tFaceArray_size_0=function(){return(bA=b._emscripten_bind_tFaceArray_size_0=b.asm.Gx).apply(null,arguments)},cA=b._emscripten_bind_tFaceArray_at_1=function(){return(cA=b._emscripten_bind_tFaceArray_at_1=b.asm.Hx).apply(null,arguments)},dA=b._emscripten_bind_tFaceArray___destroy___0=function(){return(dA=b._emscripten_bind_tFaceArray___destroy___0= b.asm.Ix).apply(null,arguments)},eA=b._emscripten_bind_LocalConvexResult_LocalConvexResult_5=function(){return(eA=b._emscripten_bind_LocalConvexResult_LocalConvexResult_5=b.asm.Jx).apply(null,arguments)},fA=b._emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0=function(){return(fA=b._emscripten_bind_LocalConvexResult_get_m_hitCollisionObject_0=b.asm.Kx).apply(null,arguments)},gA=b._emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1=function(){return(gA=b._emscripten_bind_LocalConvexResult_set_m_hitCollisionObject_1= b.asm.Lx).apply(null,arguments)},hA=b._emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0=function(){return(hA=b._emscripten_bind_LocalConvexResult_get_m_localShapeInfo_0=b.asm.Mx).apply(null,arguments)},iA=b._emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1=function(){return(iA=b._emscripten_bind_LocalConvexResult_set_m_localShapeInfo_1=b.asm.Nx).apply(null,arguments)},jA=b._emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0=function(){return(jA=b._emscripten_bind_LocalConvexResult_get_m_hitNormalLocal_0= b.asm.Ox).apply(null,arguments)},kA=b._emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1=function(){return(kA=b._emscripten_bind_LocalConvexResult_set_m_hitNormalLocal_1=b.asm.Px).apply(null,arguments)},lA=b._emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0=function(){return(lA=b._emscripten_bind_LocalConvexResult_get_m_hitPointLocal_0=b.asm.Qx).apply(null,arguments)},mA=b._emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1=function(){return(mA=b._emscripten_bind_LocalConvexResult_set_m_hitPointLocal_1= b.asm.Rx).apply(null,arguments)},nA=b._emscripten_bind_LocalConvexResult_get_m_hitFraction_0=function(){return(nA=b._emscripten_bind_LocalConvexResult_get_m_hitFraction_0=b.asm.Sx).apply(null,arguments)},oA=b._emscripten_bind_LocalConvexResult_set_m_hitFraction_1=function(){return(oA=b._emscripten_bind_LocalConvexResult_set_m_hitFraction_1=b.asm.Tx).apply(null,arguments)},pA=b._emscripten_bind_LocalConvexResult___destroy___0=function(){return(pA=b._emscripten_bind_LocalConvexResult___destroy___0= b.asm.Ux).apply(null,arguments)},qA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP=function(){return(qA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_ERP=b.asm.Vx).apply(null,arguments)},rA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP=function(){return(rA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_ERP=b.asm.Wx).apply(null,arguments)},sA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM=function(){return(sA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_CFM= b.asm.Xx).apply(null,arguments)},tA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM=function(){return(tA=b._emscripten_enum_btConstraintParams_BT_CONSTRAINT_STOP_CFM=b.asm.Yx).apply(null,arguments)},uA=b._emscripten_enum_PHY_ScalarType_PHY_FLOAT=function(){return(uA=b._emscripten_enum_PHY_ScalarType_PHY_FLOAT=b.asm.Zx).apply(null,arguments)},vA=b._emscripten_enum_PHY_ScalarType_PHY_DOUBLE=function(){return(vA=b._emscripten_enum_PHY_ScalarType_PHY_DOUBLE=b.asm._x).apply(null,arguments)}, wA=b._emscripten_enum_PHY_ScalarType_PHY_INTEGER=function(){return(wA=b._emscripten_enum_PHY_ScalarType_PHY_INTEGER=b.asm.$x).apply(null,arguments)},xA=b._emscripten_enum_PHY_ScalarType_PHY_SHORT=function(){return(xA=b._emscripten_enum_PHY_ScalarType_PHY_SHORT=b.asm.ay).apply(null,arguments)},yA=b._emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88=function(){return(yA=b._emscripten_enum_PHY_ScalarType_PHY_FIXEDPOINT88=b.asm.by).apply(null,arguments)},zA=b._emscripten_enum_PHY_ScalarType_PHY_UCHAR=function(){return(zA= b._emscripten_enum_PHY_ScalarType_PHY_UCHAR=b.asm.cy).apply(null,arguments)};b._malloc=function(){return(b._malloc=b.asm.dy).apply(null,arguments)};b._free=function(){return(b._free=b.asm.ey).apply(null,arguments)};b.dynCall_vi=function(){return(b.dynCall_vi=b.asm.fy).apply(null,arguments)};b.dynCall_v=function(){return(b.dynCall_v=b.asm.gy).apply(null,arguments)}; b.UTF8ToString=function(a,c){if(a){var d=a+c;for(c=a;za[c]&&!(c>=d);)++c;if(16e?d+=String.fromCharCode(e):(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023))}}else d+=String.fromCharCode(e)}a=d}}else a="";return a};var AA; Oa=function BA(){AA||CA();AA||(Oa=BA)}; function CA(){function a(){if(!AA&&(AA=!0,b.calledRun=!0,!va)){Ka=!0;Fa(Ha);Fa(Ia);ba(b);if(b.onRuntimeInitialized)b.onRuntimeInitialized();if(b.postRun)for("function"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var c=b.postRun.shift();Ja.unshift(c)}Fa(Ja)}}if(!(0=EA?(assert(0>>=0;switch(c.BYTES_PER_ELEMENT){case 2:d>>>=1;break;case 4:d>>>=2;break;case 8:d>>>=3}for(var e=0;e=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++d)&1023);127>=e?++c:c=2047>=e?c+2:65535>=e?c+3:c+4}c=Array(c+1);e=c.length;d=0;if(0=n){var F=a.charCodeAt(++g);n=65536+((n&1023)<<10)|F&1023}if(127>=n){if(d>=e)break;c[d++]=n}else{if(2047>=n){if(d+1>=e)break;c[d++]=192|n>>6}else{if(65535>=n){if(d+2>=e)break;c[d++]=224| n>>12}else{if(d+3>=e)break;c[d++]=240|n>>18;c[d++]=128|n>>12&63}c[d++]=128|n>>6&63}c[d++]=128|n&63}}c[d]=0}a=JA(c,ya);KA(c,ya,a)}return a}function MA(a){if("object"===typeof a){var c=JA(a,Ba);KA(a,Ba,c);return c}return a}function NA(){throw"cannot construct a btCollisionWorld, no constructor in IDL";}NA.prototype=Object.create(f.prototype);NA.prototype.constructor=NA;NA.prototype.iy=NA;NA.jy={};b.btCollisionWorld=NA;NA.prototype.getDispatcher=function(){return k($a(this.hy),OA)}; NA.prototype.rayTest=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);ab(e,a,c,d)};NA.prototype.getPairCache=function(){return k(bb(this.hy),PA)};NA.prototype.getDispatchInfo=function(){return k(cb(this.hy),l)}; NA.prototype.addCollisionObject=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?db(e,a):void 0===d?eb(e,a,c):fb(e,a,c,d)};NA.prototype.removeCollisionObject=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);gb(c,a)};NA.prototype.getBroadphase=function(){return k(hb(this.hy),QA)}; NA.prototype.convexSweepTest=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);ib(n,a,c,d,e,g)};NA.prototype.contactPairTest=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);jb(e,a,c,d)}; NA.prototype.contactTest=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);kb(d,a,c)};NA.prototype.updateSingleAabb=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);lb(c,a)};NA.prototype.setDebugDrawer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);mb(c,a)};NA.prototype.getDebugDrawer=function(){return k(nb(this.hy),RA)};NA.prototype.debugDrawWorld=function(){ob(this.hy)}; NA.prototype.debugDrawObject=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);pb(e,a,c,d)};NA.prototype.__destroy__=function(){qb(this.hy)};function m(){throw"cannot construct a btCollisionShape, no constructor in IDL";}m.prototype=Object.create(f.prototype);m.prototype.constructor=m;m.prototype.iy=m;m.jy={};b.btCollisionShape=m; m.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);rb(c,a)};m.prototype.getLocalScaling=function(){return k(sb(this.hy),p)};m.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);tb(d,a,c)};m.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ub(c,a)};m.prototype.getMargin=function(){return vb(this.hy)};m.prototype.__destroy__=function(){wb(this.hy)}; function q(){throw"cannot construct a btCollisionObject, no constructor in IDL";}q.prototype=Object.create(f.prototype);q.prototype.constructor=q;q.prototype.iy=q;q.jy={};b.btCollisionObject=q;q.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);xb(d,a,c)};q.prototype.getCollisionShape=function(){return k(yb(this.hy),m)}; q.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);zb(c,a)};q.prototype.setActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ab(c,a)};q.prototype.forceActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Bb(c,a)};q.prototype.activate=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);void 0===a?Cb(c):Db(c,a)};q.prototype.isActive=function(){return!!Eb(this.hy)};q.prototype.isKinematicObject=function(){return!!Fb(this.hy)}; q.prototype.isStaticObject=function(){return!!Gb(this.hy)};q.prototype.isStaticOrKinematicObject=function(){return!!Hb(this.hy)};q.prototype.getRestitution=function(){return Ib(this.hy)};q.prototype.getFriction=function(){return Jb(this.hy)};q.prototype.getRollingFriction=function(){return Kb(this.hy)};q.prototype.setRestitution=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Lb(c,a)};q.prototype.setFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Mb(c,a)}; q.prototype.setRollingFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Nb(c,a)};q.prototype.getWorldTransform=function(){return k(Ob(this.hy),r)};q.prototype.getCollisionFlags=function(){return Pb(this.hy)};q.prototype.setCollisionFlags=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qb(c,a)};q.prototype.setWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Sb(c,a)}; q.prototype.setCollisionShape=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Tb(c,a)};q.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ub(c,a)};q.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vb(c,a)};q.prototype.getUserIndex=function(){return Wb(this.hy)};q.prototype.setUserIndex=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xb(c,a)}; q.prototype.getUserPointer=function(){return k(Yb(this.hy),SA)};q.prototype.setUserPointer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Zb(c,a)};q.prototype.getBroadphaseHandle=function(){return k($b(this.hy),t)};q.prototype.__destroy__=function(){ac(this.hy)};function u(){throw"cannot construct a btDynamicsWorld, no constructor in IDL";}u.prototype=Object.create(NA.prototype);u.prototype.constructor=u;u.prototype.iy=u;u.jy={};b.btDynamicsWorld=u; u.prototype.addAction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);bc(c,a)};u.prototype.removeAction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);cc(c,a)};u.prototype.getSolverInfo=function(){return k(dc(this.hy),v)};u.prototype.setInternalTickCallback=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?ec(e,a):void 0===d?fc(e,a,c):hc(e,a,c,d)}; u.prototype.getDispatcher=function(){return k(ic(this.hy),OA)};u.prototype.rayTest=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);jc(e,a,c,d)};u.prototype.getPairCache=function(){return k(kc(this.hy),PA)};u.prototype.getDispatchInfo=function(){return k(lc(this.hy),l)}; u.prototype.addCollisionObject=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?mc(e,a):void 0===d?nc(e,a,c):oc(e,a,c,d)};u.prototype.removeCollisionObject=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);pc(c,a)};u.prototype.getBroadphase=function(){return k(qc(this.hy),QA)}; u.prototype.convexSweepTest=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);rc(n,a,c,d,e,g)};u.prototype.contactPairTest=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);sc(e,a,c,d)}; u.prototype.contactTest=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);tc(d,a,c)};u.prototype.updateSingleAabb=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);uc(c,a)};u.prototype.setDebugDrawer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);vc(c,a)};u.prototype.getDebugDrawer=function(){return k(wc(this.hy),RA)};u.prototype.debugDrawWorld=function(){xc(this.hy)}; u.prototype.debugDrawObject=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);yc(e,a,c,d)};u.prototype.__destroy__=function(){zc(this.hy)};function TA(){throw"cannot construct a btTypedConstraint, no constructor in IDL";}TA.prototype=Object.create(f.prototype);TA.prototype.constructor=TA;TA.prototype.iy=TA;TA.jy={};b.btTypedConstraint=TA; TA.prototype.enableFeedback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ac(c,a)};TA.prototype.getBreakingImpulseThreshold=function(){return Bc(this.hy)};TA.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Cc(c,a)};TA.prototype.getParam=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return Dc(d,a,c)}; TA.prototype.setParam=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Ec(e,a,c,d)};TA.prototype.__destroy__=function(){Fc(this.hy)};function UA(){throw"cannot construct a btConcaveShape, no constructor in IDL";}UA.prototype=Object.create(m.prototype);UA.prototype.constructor=UA;UA.prototype.iy=UA;UA.jy={};b.btConcaveShape=UA; UA.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Gc(c,a)};UA.prototype.getLocalScaling=function(){return k(Hc(this.hy),p)};UA.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Ic(d,a,c)};UA.prototype.__destroy__=function(){Jc(this.hy)};function VA(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=Kc(a,c);h(VA)[this.hy]=this}VA.prototype=Object.create(m.prototype); VA.prototype.constructor=VA;VA.prototype.iy=VA;VA.jy={};b.btCapsuleShape=VA;VA.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Lc(c,a)};VA.prototype.getMargin=function(){return Mc(this.hy)};VA.prototype.getUpAxis=function(){return Nc(this.hy)};VA.prototype.getRadius=function(){return Oc(this.hy)};VA.prototype.getHalfHeight=function(){return Pc(this.hy)};VA.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qc(c,a)}; VA.prototype.getLocalScaling=function(){return k(Rc(this.hy),p)};VA.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Sc(d,a,c)};VA.prototype.__destroy__=function(){Tc(this.hy)};function RA(){throw"cannot construct a btIDebugDraw, no constructor in IDL";}RA.prototype=Object.create(f.prototype);RA.prototype.constructor=RA;RA.prototype.iy=RA;RA.jy={};b.btIDebugDraw=RA; RA.prototype.drawLine=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Uc(e,a,c,d)};RA.prototype.drawContactPoint=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);Vc(n,a,c,d,e,g)}; RA.prototype.reportErrorWarning=function(a){var c=this.hy;IA();a=a&&"object"===typeof a?a.hy:LA(a);Wc(c,a)};RA.prototype.draw3dText=function(a,c){var d=this.hy;IA();a&&"object"===typeof a&&(a=a.hy);c=c&&"object"===typeof c?c.hy:LA(c);Xc(d,a,c)};RA.prototype.setDebugMode=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Yc(c,a)};RA.prototype.getDebugMode=function(){return Zc(this.hy)};RA.prototype.__destroy__=function(){$c(this.hy)}; function WA(a){a&&"object"===typeof a&&(a=a.hy);this.hy=void 0===a?ad():bd(a);h(WA)[this.hy]=this}WA.prototype=Object.create(f.prototype);WA.prototype.constructor=WA;WA.prototype.iy=WA;WA.jy={};b.btDefaultCollisionConfiguration=WA;WA.prototype.__destroy__=function(){cd(this.hy)};function XA(){throw"cannot construct a btTriangleMeshShape, no constructor in IDL";}XA.prototype=Object.create(UA.prototype);XA.prototype.constructor=XA;XA.prototype.iy=XA;XA.jy={};b.btTriangleMeshShape=XA; XA.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);dd(c,a)};XA.prototype.getLocalScaling=function(){return k(ed(this.hy),p)};XA.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);fd(d,a,c)};XA.prototype.__destroy__=function(){gd(this.hy)};function w(){this.hy=hd();h(w)[this.hy]=this}w.prototype=Object.create(q.prototype);w.prototype.constructor=w;w.prototype.iy=w;w.jy={}; b.btGhostObject=w;w.prototype.getNumOverlappingObjects=function(){return id(this.hy)};w.prototype.getOverlappingObject=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(jd(c,a),q)};w.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);kd(d,a,c)};w.prototype.getCollisionShape=function(){return k(ld(this.hy),m)}; w.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);md(c,a)};w.prototype.setActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);nd(c,a)};w.prototype.forceActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);od(c,a)};w.prototype.activate=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);void 0===a?pd(c):qd(c,a)};w.prototype.isActive=function(){return!!rd(this.hy)};w.prototype.isKinematicObject=function(){return!!sd(this.hy)}; w.prototype.isStaticObject=function(){return!!td(this.hy)};w.prototype.isStaticOrKinematicObject=function(){return!!ud(this.hy)};w.prototype.getRestitution=function(){return vd(this.hy)};w.prototype.getFriction=function(){return wd(this.hy)};w.prototype.getRollingFriction=function(){return xd(this.hy)};w.prototype.setRestitution=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yd(c,a)};w.prototype.setFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);zd(c,a)}; w.prototype.setRollingFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ad(c,a)};w.prototype.getWorldTransform=function(){return k(Bd(this.hy),r)};w.prototype.getCollisionFlags=function(){return Cd(this.hy)};w.prototype.setCollisionFlags=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Dd(c,a)};w.prototype.setWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ed(c,a)}; w.prototype.setCollisionShape=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Fd(c,a)};w.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Gd(c,a)};w.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Hd(c,a)};w.prototype.getUserIndex=function(){return Id(this.hy)};w.prototype.setUserIndex=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Jd(c,a)}; w.prototype.getUserPointer=function(){return k(Kd(this.hy),SA)};w.prototype.setUserPointer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ld(c,a)};w.prototype.getBroadphaseHandle=function(){return k(Md(this.hy),t)};w.prototype.__destroy__=function(){Nd(this.hy)};function YA(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=Od(a,c);h(YA)[this.hy]=this}YA.prototype=Object.create(m.prototype);YA.prototype.constructor=YA;YA.prototype.iy=YA;YA.jy={}; b.btConeShape=YA;YA.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pd(c,a)};YA.prototype.getLocalScaling=function(){return k(Qd(this.hy),p)};YA.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Rd(d,a,c)};YA.prototype.__destroy__=function(){Sd(this.hy)};function ZA(){throw"cannot construct a btActionInterface, no constructor in IDL";}ZA.prototype=Object.create(f.prototype); ZA.prototype.constructor=ZA;ZA.prototype.iy=ZA;ZA.jy={};b.btActionInterface=ZA;ZA.prototype.updateAction=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Td(d,a,c)};ZA.prototype.__destroy__=function(){Ud(this.hy)}; function p(a,c,d){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);this.hy=void 0===a?Vd():void 0===c?_emscripten_bind_btVector3_btVector3_1(a):void 0===d?_emscripten_bind_btVector3_btVector3_2(a,c):Wd(a,c,d);h(p)[this.hy]=this}p.prototype=Object.create(f.prototype);p.prototype.constructor=p;p.prototype.iy=p;p.jy={};b.btVector3=p;p.prototype.length=p.prototype.length=function(){return Xd(this.hy)};p.prototype.x=p.prototype.x=function(){return Yd(this.hy)}; p.prototype.y=p.prototype.y=function(){return Zd(this.hy)};p.prototype.z=p.prototype.z=function(){return $d(this.hy)};p.prototype.setX=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ae(c,a)};p.prototype.setY=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);be(c,a)};p.prototype.setZ=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ce(c,a)}; p.prototype.setValue=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);de(e,a,c,d)};p.prototype.normalize=p.prototype.normalize=function(){ee(this.hy)};p.prototype.rotate=p.prototype.rotate=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return k(fe(d,a,c),p)};p.prototype.dot=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return ge(c,a)}; p.prototype.op_mul=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(he(c,a),p)};p.prototype.op_add=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(ie(c,a),p)};p.prototype.op_sub=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(je(c,a),p)};p.prototype.__destroy__=function(){ke(this.hy)};function $A(){throw"cannot construct a btVehicleRaycaster, no constructor in IDL";}$A.prototype=Object.create(f.prototype);$A.prototype.constructor=$A; $A.prototype.iy=$A;$A.jy={};b.btVehicleRaycaster=$A;$A.prototype.castRay=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);le(e,a,c,d)};$A.prototype.__destroy__=function(){me(this.hy)};function aB(){throw"cannot construct a btQuadWord, no constructor in IDL";}aB.prototype=Object.create(f.prototype);aB.prototype.constructor=aB;aB.prototype.iy=aB;aB.jy={};b.btQuadWord=aB;aB.prototype.x=aB.prototype.x=function(){return ne(this.hy)}; aB.prototype.y=aB.prototype.y=function(){return oe(this.hy)};aB.prototype.z=aB.prototype.z=function(){return pe(this.hy)};aB.prototype.w=function(){return qe(this.hy)};aB.prototype.setX=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);re(c,a)};aB.prototype.setY=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);se(c,a)};aB.prototype.setZ=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);te(c,a)}; aB.prototype.setW=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ue(c,a)};aB.prototype.__destroy__=function(){ve(this.hy)};function bB(a){a&&"object"===typeof a&&(a=a.hy);this.hy=we(a);h(bB)[this.hy]=this}bB.prototype=Object.create(m.prototype);bB.prototype.constructor=bB;bB.prototype.iy=bB;bB.jy={};b.btCylinderShape=bB;bB.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);xe(c,a)};bB.prototype.getMargin=function(){return ye(this.hy)}; bB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ze(c,a)};bB.prototype.getLocalScaling=function(){return k(Ae(this.hy),p)};bB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Be(d,a,c)};bB.prototype.__destroy__=function(){Ce(this.hy)}; function x(a,c,d,e){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);this.hy=De(a,c,d,e);h(x)[this.hy]=this}x.prototype=Object.create(u.prototype);x.prototype.constructor=x;x.prototype.iy=x;x.jy={};b.btDiscreteDynamicsWorld=x;x.prototype.setGravity=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ee(c,a)};x.prototype.getGravity=function(){return k(Fe(this.hy),p)}; x.prototype.addRigidBody=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?Ge(e,a):void 0===d?_emscripten_bind_btDiscreteDynamicsWorld_addRigidBody_2(e,a,c):He(e,a,c,d)};x.prototype.removeRigidBody=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ie(c,a)}; x.prototype.addConstraint=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);void 0===c?Je(d,a):Ke(d,a,c)};x.prototype.removeConstraint=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Le(c,a)};x.prototype.stepSimulation=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);return void 0===c?Me(e,a):void 0===d?Ne(e,a,c):Oe(e,a,c,d)}; x.prototype.setContactAddedCallback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pe(c,a)};x.prototype.setContactProcessedCallback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qe(c,a)};x.prototype.setContactDestroyedCallback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Re(c,a)};x.prototype.getDispatcher=function(){return k(Se(this.hy),OA)}; x.prototype.rayTest=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Te(e,a,c,d)};x.prototype.getPairCache=function(){return k(Ue(this.hy),PA)};x.prototype.getDispatchInfo=function(){return k(Ve(this.hy),l)};x.prototype.addCollisionObject=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?We(e,a):void 0===d?Xe(e,a,c):Ye(e,a,c,d)}; x.prototype.removeCollisionObject=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ze(c,a)};x.prototype.getBroadphase=function(){return k($e(this.hy),QA)};x.prototype.convexSweepTest=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);af(n,a,c,d,e,g)}; x.prototype.contactPairTest=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);bf(e,a,c,d)};x.prototype.contactTest=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);cf(d,a,c)};x.prototype.updateSingleAabb=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);df(c,a)};x.prototype.setDebugDrawer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ef(c,a)}; x.prototype.getDebugDrawer=function(){return k(ff(this.hy),RA)};x.prototype.debugDrawWorld=function(){gf(this.hy)};x.prototype.debugDrawObject=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);hf(e,a,c,d)};x.prototype.addAction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);jf(c,a)};x.prototype.removeAction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);kf(c,a)}; x.prototype.getSolverInfo=function(){return k(lf(this.hy),v)};x.prototype.setInternalTickCallback=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?mf(e,a):void 0===d?nf(e,a,c):of(e,a,c,d)};x.prototype.__destroy__=function(){pf(this.hy)};function cB(){throw"cannot construct a btConvexShape, no constructor in IDL";}cB.prototype=Object.create(m.prototype);cB.prototype.constructor=cB;cB.prototype.iy=cB;cB.jy={}; b.btConvexShape=cB;cB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);qf(c,a)};cB.prototype.getLocalScaling=function(){return k(rf(this.hy),p)};cB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);sf(d,a,c)};cB.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);tf(c,a)};cB.prototype.getMargin=function(){return uf(this.hy)};cB.prototype.__destroy__=function(){vf(this.hy)}; function OA(){throw"cannot construct a btDispatcher, no constructor in IDL";}OA.prototype=Object.create(f.prototype);OA.prototype.constructor=OA;OA.prototype.iy=OA;OA.jy={};b.btDispatcher=OA;OA.prototype.getNumManifolds=function(){return wf(this.hy)};OA.prototype.getManifoldByIndexInternal=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(xf(c,a),dB)};OA.prototype.__destroy__=function(){yf(this.hy)}; function eB(a,c,d,e,g){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);this.hy=void 0===e?zf(a,c,d):void 0===g?_emscripten_bind_btGeneric6DofConstraint_btGeneric6DofConstraint_4(a,c,d,e):Af(a,c,d,e,g);h(eB)[this.hy]=this}eB.prototype=Object.create(TA.prototype);eB.prototype.constructor=eB;eB.prototype.iy=eB;eB.jy={};b.btGeneric6DofConstraint=eB; eB.prototype.setLinearLowerLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Bf(c,a)};eB.prototype.setLinearUpperLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Cf(c,a)};eB.prototype.setAngularLowerLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Df(c,a)};eB.prototype.setAngularUpperLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ef(c,a)};eB.prototype.getFrameOffsetA=function(){return k(Ff(this.hy),r)}; eB.prototype.enableFeedback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Gf(c,a)};eB.prototype.getBreakingImpulseThreshold=function(){return Hf(this.hy)};eB.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);If(c,a)};eB.prototype.getParam=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return Jf(d,a,c)}; eB.prototype.setParam=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Kf(e,a,c,d)};eB.prototype.__destroy__=function(){Lf(this.hy)};function fB(){throw"cannot construct a btStridingMeshInterface, no constructor in IDL";}fB.prototype=Object.create(f.prototype);fB.prototype.constructor=fB;fB.prototype.iy=fB;fB.jy={};b.btStridingMeshInterface=fB; fB.prototype.setScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Mf(c,a)};fB.prototype.__destroy__=function(){Nf(this.hy)};function gB(){throw"cannot construct a btMotionState, no constructor in IDL";}gB.prototype=Object.create(f.prototype);gB.prototype.constructor=gB;gB.prototype.iy=gB;gB.jy={};b.btMotionState=gB;gB.prototype.getWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Of(c,a)}; gB.prototype.setWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pf(c,a)};gB.prototype.__destroy__=function(){Qf(this.hy)};function y(){throw"cannot construct a ConvexResultCallback, no constructor in IDL";}y.prototype=Object.create(f.prototype);y.prototype.constructor=y;y.prototype.iy=y;y.jy={};b.ConvexResultCallback=y;y.prototype.hasHit=function(){return!!Rf(this.hy)};y.prototype.get_m_collisionFilterGroup=y.prototype.ky=function(){return Sf(this.hy)}; y.prototype.set_m_collisionFilterGroup=y.prototype.my=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Tf(c,a)};Object.defineProperty(y.prototype,"m_collisionFilterGroup",{get:y.prototype.ky,set:y.prototype.my});y.prototype.get_m_collisionFilterMask=y.prototype.ly=function(){return Uf(this.hy)};y.prototype.set_m_collisionFilterMask=y.prototype.ny=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vf(c,a)}; Object.defineProperty(y.prototype,"m_collisionFilterMask",{get:y.prototype.ly,set:y.prototype.ny});y.prototype.get_m_closestHitFraction=y.prototype.oy=function(){return Wf(this.hy)};y.prototype.set_m_closestHitFraction=y.prototype.py=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xf(c,a)};Object.defineProperty(y.prototype,"m_closestHitFraction",{get:y.prototype.oy,set:y.prototype.py});y.prototype.__destroy__=function(){Yf(this.hy)}; function hB(){throw"cannot construct a ContactResultCallback, no constructor in IDL";}hB.prototype=Object.create(f.prototype);hB.prototype.constructor=hB;hB.prototype.iy=hB;hB.jy={};b.ContactResultCallback=hB; hB.prototype.addSingleResult=function(a,c,d,e,g,n,F){var aa=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);n&&"object"===typeof n&&(n=n.hy);F&&"object"===typeof F&&(F=F.hy);return Zf(aa,a,c,d,e,g,n,F)};hB.prototype.__destroy__=function(){$f(this.hy)};function iB(){throw"cannot construct a btSoftBodySolver, no constructor in IDL";}iB.prototype=Object.create(f.prototype); iB.prototype.constructor=iB;iB.prototype.iy=iB;iB.jy={};b.btSoftBodySolver=iB;iB.prototype.__destroy__=function(){ag(this.hy)};function z(){throw"cannot construct a RayResultCallback, no constructor in IDL";}z.prototype=Object.create(f.prototype);z.prototype.constructor=z;z.prototype.iy=z;z.jy={};b.RayResultCallback=z;z.prototype.hasHit=function(){return!!bg(this.hy)};z.prototype.get_m_collisionFilterGroup=z.prototype.ky=function(){return cg(this.hy)}; z.prototype.set_m_collisionFilterGroup=z.prototype.my=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);dg(c,a)};Object.defineProperty(z.prototype,"m_collisionFilterGroup",{get:z.prototype.ky,set:z.prototype.my});z.prototype.get_m_collisionFilterMask=z.prototype.ly=function(){return eg(this.hy)};z.prototype.set_m_collisionFilterMask=z.prototype.ny=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);fg(c,a)}; Object.defineProperty(z.prototype,"m_collisionFilterMask",{get:z.prototype.ly,set:z.prototype.ny});z.prototype.get_m_closestHitFraction=z.prototype.oy=function(){return gg(this.hy)};z.prototype.set_m_closestHitFraction=z.prototype.py=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);hg(c,a)};Object.defineProperty(z.prototype,"m_closestHitFraction",{get:z.prototype.oy,set:z.prototype.py});z.prototype.get_m_collisionObject=z.prototype.qy=function(){return k(ig(this.hy),q)}; z.prototype.set_m_collisionObject=z.prototype.xy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);jg(c,a)};Object.defineProperty(z.prototype,"m_collisionObject",{get:z.prototype.qy,set:z.prototype.xy});z.prototype.__destroy__=function(){kg(this.hy)};function jB(){throw"cannot construct a btMatrix3x3, no constructor in IDL";}jB.prototype=Object.create(f.prototype);jB.prototype.constructor=jB;jB.prototype.iy=jB;jB.jy={};b.btMatrix3x3=jB; jB.prototype.setEulerZYX=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);lg(e,a,c,d)};jB.prototype.getRotation=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);mg(c,a)};jB.prototype.getRow=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(ng(c,a),p)};jB.prototype.__destroy__=function(){og(this.hy)};function kB(){throw"cannot construct a btScalarArray, no constructor in IDL";}kB.prototype=Object.create(f.prototype); kB.prototype.constructor=kB;kB.prototype.iy=kB;kB.jy={};b.btScalarArray=kB;kB.prototype.size=kB.prototype.size=function(){return pg(this.hy)};kB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return qg(c,a)};kB.prototype.__destroy__=function(){rg(this.hy)};function A(){throw"cannot construct a Material, no constructor in IDL";}A.prototype=Object.create(f.prototype);A.prototype.constructor=A;A.prototype.iy=A;A.jy={};b.Material=A;A.prototype.get_m_kLST=A.prototype.vA=function(){return sg(this.hy)}; A.prototype.set_m_kLST=A.prototype.bD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);tg(c,a)};Object.defineProperty(A.prototype,"m_kLST",{get:A.prototype.vA,set:A.prototype.bD});A.prototype.get_m_kAST=A.prototype.uA=function(){return ug(this.hy)};A.prototype.set_m_kAST=A.prototype.aD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);vg(c,a)};Object.defineProperty(A.prototype,"m_kAST",{get:A.prototype.uA,set:A.prototype.aD});A.prototype.get_m_kVST=A.prototype.wA=function(){return wg(this.hy)}; A.prototype.set_m_kVST=A.prototype.cD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);xg(c,a)};Object.defineProperty(A.prototype,"m_kVST",{get:A.prototype.wA,set:A.prototype.cD});A.prototype.get_m_flags=A.prototype.cA=function(){return yg(this.hy)};A.prototype.set_m_flags=A.prototype.JC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);zg(c,a)};Object.defineProperty(A.prototype,"m_flags",{get:A.prototype.cA,set:A.prototype.JC});A.prototype.__destroy__=function(){Ag(this.hy)}; function l(){throw"cannot construct a btDispatcherInfo, no constructor in IDL";}l.prototype=Object.create(f.prototype);l.prototype.constructor=l;l.prototype.iy=l;l.jy={};b.btDispatcherInfo=l;l.prototype.get_m_timeStep=l.prototype.jB=function(){return Bg(this.hy)};l.prototype.set_m_timeStep=l.prototype.QD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Cg(c,a)};Object.defineProperty(l.prototype,"m_timeStep",{get:l.prototype.jB,set:l.prototype.QD}); l.prototype.get_m_stepCount=l.prototype.aB=function(){return Dg(this.hy)};l.prototype.set_m_stepCount=l.prototype.HD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Eg(c,a)};Object.defineProperty(l.prototype,"m_stepCount",{get:l.prototype.aB,set:l.prototype.HD});l.prototype.get_m_dispatchFunc=l.prototype.Wz=function(){return Fg(this.hy)};l.prototype.set_m_dispatchFunc=l.prototype.CC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Gg(c,a)}; Object.defineProperty(l.prototype,"m_dispatchFunc",{get:l.prototype.Wz,set:l.prototype.CC});l.prototype.get_m_timeOfImpact=l.prototype.iB=function(){return Hg(this.hy)};l.prototype.set_m_timeOfImpact=l.prototype.PD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ig(c,a)};Object.defineProperty(l.prototype,"m_timeOfImpact",{get:l.prototype.iB,set:l.prototype.PD});l.prototype.get_m_useContinuous=l.prototype.lB=function(){return!!Jg(this.hy)}; l.prototype.set_m_useContinuous=l.prototype.SD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Kg(c,a)};Object.defineProperty(l.prototype,"m_useContinuous",{get:l.prototype.lB,set:l.prototype.SD});l.prototype.get_m_enableSatConvex=l.prototype.$z=function(){return!!Lg(this.hy)};l.prototype.set_m_enableSatConvex=l.prototype.GC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Mg(c,a)};Object.defineProperty(l.prototype,"m_enableSatConvex",{get:l.prototype.$z,set:l.prototype.GC}); l.prototype.get_m_enableSPU=l.prototype.Zz=function(){return!!Ng(this.hy)};l.prototype.set_m_enableSPU=l.prototype.FC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Og(c,a)};Object.defineProperty(l.prototype,"m_enableSPU",{get:l.prototype.Zz,set:l.prototype.FC});l.prototype.get_m_useEpa=l.prototype.nB=function(){return!!Pg(this.hy)};l.prototype.set_m_useEpa=l.prototype.UD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qg(c,a)}; Object.defineProperty(l.prototype,"m_useEpa",{get:l.prototype.nB,set:l.prototype.UD});l.prototype.get_m_allowedCcdPenetration=l.prototype.zz=function(){return Rg(this.hy)};l.prototype.set_m_allowedCcdPenetration=l.prototype.fC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Sg(c,a)};Object.defineProperty(l.prototype,"m_allowedCcdPenetration",{get:l.prototype.zz,set:l.prototype.fC});l.prototype.get_m_useConvexConservativeDistanceUtil=l.prototype.mB=function(){return!!Tg(this.hy)}; l.prototype.set_m_useConvexConservativeDistanceUtil=l.prototype.TD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ug(c,a)};Object.defineProperty(l.prototype,"m_useConvexConservativeDistanceUtil",{get:l.prototype.mB,set:l.prototype.TD});l.prototype.get_m_convexConservativeDistanceThreshold=l.prototype.Rz=function(){return Vg(this.hy)};l.prototype.set_m_convexConservativeDistanceThreshold=l.prototype.xC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wg(c,a)}; Object.defineProperty(l.prototype,"m_convexConservativeDistanceThreshold",{get:l.prototype.Rz,set:l.prototype.xC});l.prototype.__destroy__=function(){Xg(this.hy)};function B(){throw"cannot construct a btWheelInfoConstructionInfo, no constructor in IDL";}B.prototype=Object.create(f.prototype);B.prototype.constructor=B;B.prototype.iy=B;B.jy={};b.btWheelInfoConstructionInfo=B;B.prototype.get_m_chassisConnectionCS=B.prototype.Lz=function(){return k(Yg(this.hy),p)}; B.prototype.set_m_chassisConnectionCS=B.prototype.rC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Zg(c,a)};Object.defineProperty(B.prototype,"m_chassisConnectionCS",{get:B.prototype.Lz,set:B.prototype.rC});B.prototype.get_m_wheelDirectionCS=B.prototype.Ly=function(){return k($g(this.hy),p)};B.prototype.set_m_wheelDirectionCS=B.prototype.Uy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ah(c,a)};Object.defineProperty(B.prototype,"m_wheelDirectionCS",{get:B.prototype.Ly,set:B.prototype.Uy}); B.prototype.get_m_wheelAxleCS=B.prototype.Ky=function(){return k(bh(this.hy),p)};B.prototype.set_m_wheelAxleCS=B.prototype.Ty=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ch(c,a)};Object.defineProperty(B.prototype,"m_wheelAxleCS",{get:B.prototype.Ky,set:B.prototype.Ty});B.prototype.get_m_suspensionRestLength=B.prototype.fB=function(){return dh(this.hy)};B.prototype.set_m_suspensionRestLength=B.prototype.MD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);eh(c,a)}; Object.defineProperty(B.prototype,"m_suspensionRestLength",{get:B.prototype.fB,set:B.prototype.MD});B.prototype.get_m_maxSuspensionTravelCm=B.prototype.vy=function(){return fh(this.hy)};B.prototype.set_m_maxSuspensionTravelCm=B.prototype.Cy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);gh(c,a)};Object.defineProperty(B.prototype,"m_maxSuspensionTravelCm",{get:B.prototype.vy,set:B.prototype.Cy});B.prototype.get_m_wheelRadius=B.prototype.tB=function(){return hh(this.hy)}; B.prototype.set_m_wheelRadius=B.prototype.$D=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ih(c,a)};Object.defineProperty(B.prototype,"m_wheelRadius",{get:B.prototype.tB,set:B.prototype.$D});B.prototype.get_m_suspensionStiffness=B.prototype.wy=function(){return jh(this.hy)};B.prototype.set_m_suspensionStiffness=B.prototype.Dy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);kh(c,a)};Object.defineProperty(B.prototype,"m_suspensionStiffness",{get:B.prototype.wy,set:B.prototype.Dy}); B.prototype.get_m_wheelsDampingCompression=B.prototype.My=function(){return lh(this.hy)};B.prototype.set_m_wheelsDampingCompression=B.prototype.Vy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);mh(c,a)};Object.defineProperty(B.prototype,"m_wheelsDampingCompression",{get:B.prototype.My,set:B.prototype.Vy});B.prototype.get_m_wheelsDampingRelaxation=B.prototype.Ny=function(){return nh(this.hy)}; B.prototype.set_m_wheelsDampingRelaxation=B.prototype.Wy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);oh(c,a)};Object.defineProperty(B.prototype,"m_wheelsDampingRelaxation",{get:B.prototype.Ny,set:B.prototype.Wy});B.prototype.get_m_frictionSlip=B.prototype.ry=function(){return ph(this.hy)};B.prototype.set_m_frictionSlip=B.prototype.yy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);qh(c,a)};Object.defineProperty(B.prototype,"m_frictionSlip",{get:B.prototype.ry,set:B.prototype.yy}); B.prototype.get_m_maxSuspensionForce=B.prototype.uy=function(){return rh(this.hy)};B.prototype.set_m_maxSuspensionForce=B.prototype.By=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);sh(c,a)};Object.defineProperty(B.prototype,"m_maxSuspensionForce",{get:B.prototype.uy,set:B.prototype.By});B.prototype.get_m_bIsFrontWheel=B.prototype.Fy=function(){return!!th(this.hy)};B.prototype.set_m_bIsFrontWheel=B.prototype.Oy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);uh(c,a)}; Object.defineProperty(B.prototype,"m_bIsFrontWheel",{get:B.prototype.Fy,set:B.prototype.Oy});B.prototype.__destroy__=function(){vh(this.hy)};function lB(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=void 0===c?wh(a):xh(a,c);h(lB)[this.hy]=this}lB.prototype=Object.create(cB.prototype);lB.prototype.constructor=lB;lB.prototype.iy=lB;lB.jy={};b.btConvexTriangleMeshShape=lB;lB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yh(c,a)}; lB.prototype.getLocalScaling=function(){return k(zh(this.hy),p)};lB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Ah(d,a,c)};lB.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Bh(c,a)};lB.prototype.getMargin=function(){return Ch(this.hy)};lB.prototype.__destroy__=function(){Dh(this.hy)};function QA(){throw"cannot construct a btBroadphaseInterface, no constructor in IDL";}QA.prototype=Object.create(f.prototype); QA.prototype.constructor=QA;QA.prototype.iy=QA;QA.jy={};b.btBroadphaseInterface=QA;QA.prototype.getOverlappingPairCache=function(){return k(Eh(this.hy),PA)};QA.prototype.__destroy__=function(){Fh(this.hy)};function C(a,c,d,e){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);this.hy=void 0===e?Gh(a,c,d):Hh(a,c,d,e);h(C)[this.hy]=this}C.prototype=Object.create(f.prototype);C.prototype.constructor=C;C.prototype.iy=C; C.jy={};b.btRigidBodyConstructionInfo=C;C.prototype.get_m_linearDamping=C.prototype.xA=function(){return Ih(this.hy)};C.prototype.set_m_linearDamping=C.prototype.dD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Jh(c,a)};Object.defineProperty(C.prototype,"m_linearDamping",{get:C.prototype.xA,set:C.prototype.dD});C.prototype.get_m_angularDamping=C.prototype.Bz=function(){return Kh(this.hy)}; C.prototype.set_m_angularDamping=C.prototype.hC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Lh(c,a)};Object.defineProperty(C.prototype,"m_angularDamping",{get:C.prototype.Bz,set:C.prototype.hC});C.prototype.get_m_friction=C.prototype.dA=function(){return Mh(this.hy)};C.prototype.set_m_friction=C.prototype.KC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Nh(c,a)};Object.defineProperty(C.prototype,"m_friction",{get:C.prototype.dA,set:C.prototype.KC}); C.prototype.get_m_rollingFriction=C.prototype.TA=function(){return Oh(this.hy)};C.prototype.set_m_rollingFriction=C.prototype.zD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ph(c,a)};Object.defineProperty(C.prototype,"m_rollingFriction",{get:C.prototype.TA,set:C.prototype.zD});C.prototype.get_m_restitution=C.prototype.RA=function(){return Qh(this.hy)};C.prototype.set_m_restitution=C.prototype.xD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Rh(c,a)}; Object.defineProperty(C.prototype,"m_restitution",{get:C.prototype.RA,set:C.prototype.xD});C.prototype.get_m_linearSleepingThreshold=C.prototype.yA=function(){return Sh(this.hy)};C.prototype.set_m_linearSleepingThreshold=C.prototype.eD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Th(c,a)};Object.defineProperty(C.prototype,"m_linearSleepingThreshold",{get:C.prototype.yA,set:C.prototype.eD});C.prototype.get_m_angularSleepingThreshold=C.prototype.Cz=function(){return Uh(this.hy)}; C.prototype.set_m_angularSleepingThreshold=C.prototype.iC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vh(c,a)};Object.defineProperty(C.prototype,"m_angularSleepingThreshold",{get:C.prototype.Cz,set:C.prototype.iC});C.prototype.get_m_additionalDamping=C.prototype.wz=function(){return!!Wh(this.hy)};C.prototype.set_m_additionalDamping=C.prototype.cC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xh(c,a)}; Object.defineProperty(C.prototype,"m_additionalDamping",{get:C.prototype.wz,set:C.prototype.cC});C.prototype.get_m_additionalDampingFactor=C.prototype.xz=function(){return Yh(this.hy)};C.prototype.set_m_additionalDampingFactor=C.prototype.dC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Zh(c,a)};Object.defineProperty(C.prototype,"m_additionalDampingFactor",{get:C.prototype.xz,set:C.prototype.dC});C.prototype.get_m_additionalLinearDampingThresholdSqr=C.prototype.yz=function(){return $h(this.hy)}; C.prototype.set_m_additionalLinearDampingThresholdSqr=C.prototype.eC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ai(c,a)};Object.defineProperty(C.prototype,"m_additionalLinearDampingThresholdSqr",{get:C.prototype.yz,set:C.prototype.eC});C.prototype.get_m_additionalAngularDampingThresholdSqr=C.prototype.vz=function(){return bi(this.hy)};C.prototype.set_m_additionalAngularDampingThresholdSqr=C.prototype.bC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ci(c,a)}; Object.defineProperty(C.prototype,"m_additionalAngularDampingThresholdSqr",{get:C.prototype.vz,set:C.prototype.bC});C.prototype.get_m_additionalAngularDampingFactor=C.prototype.uz=function(){return di(this.hy)};C.prototype.set_m_additionalAngularDampingFactor=C.prototype.aC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ei(c,a)};Object.defineProperty(C.prototype,"m_additionalAngularDampingFactor",{get:C.prototype.uz,set:C.prototype.aC});C.prototype.__destroy__=function(){fi(this.hy)}; function mB(){throw"cannot construct a btCollisionConfiguration, no constructor in IDL";}mB.prototype=Object.create(f.prototype);mB.prototype.constructor=mB;mB.prototype.iy=mB;mB.jy={};b.btCollisionConfiguration=mB;mB.prototype.__destroy__=function(){gi(this.hy)};function dB(){this.hy=hi();h(dB)[this.hy]=this}dB.prototype=Object.create(f.prototype);dB.prototype.constructor=dB;dB.prototype.iy=dB;dB.jy={};b.btPersistentManifold=dB;dB.prototype.getBody0=function(){return k(ii(this.hy),q)}; dB.prototype.getBody1=function(){return k(ji(this.hy),q)};dB.prototype.getNumContacts=function(){return ki(this.hy)};dB.prototype.getContactPoint=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(li(c,a),D)};dB.prototype.__destroy__=function(){mi(this.hy)};function nB(a){a&&"object"===typeof a&&(a=a.hy);this.hy=void 0===a?ni():oi(a);h(nB)[this.hy]=this}nB.prototype=Object.create(m.prototype);nB.prototype.constructor=nB;nB.prototype.iy=nB;nB.jy={};b.btCompoundShape=nB; nB.prototype.addChildShape=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);pi(d,a,c)};nB.prototype.removeChildShape=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);qi(c,a)};nB.prototype.removeChildShapeByIndex=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ri(c,a)};nB.prototype.getNumChildShapes=function(){return si(this.hy)};nB.prototype.getChildShape=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(ti(c,a),m)}; nB.prototype.updateChildTransform=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===d?ui(e,a,c):vi(e,a,c,d)};nB.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);wi(c,a)};nB.prototype.getMargin=function(){return xi(this.hy)};nB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yi(c,a)};nB.prototype.getLocalScaling=function(){return k(zi(this.hy),p)}; nB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Ai(d,a,c)};nB.prototype.__destroy__=function(){Bi(this.hy)};function E(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=Ci(a,c);h(E)[this.hy]=this}E.prototype=Object.create(y.prototype);E.prototype.constructor=E;E.prototype.iy=E;E.jy={};b.ClosestConvexResultCallback=E;E.prototype.hasHit=function(){return!!Di(this.hy)}; E.prototype.get_m_convexFromWorld=E.prototype.Sz=function(){return k(Ei(this.hy),p)};E.prototype.set_m_convexFromWorld=E.prototype.yC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Fi(c,a)};Object.defineProperty(E.prototype,"m_convexFromWorld",{get:E.prototype.Sz,set:E.prototype.yC});E.prototype.get_m_convexToWorld=E.prototype.Tz=function(){return k(Gi(this.hy),p)};E.prototype.set_m_convexToWorld=E.prototype.zC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Hi(c,a)}; Object.defineProperty(E.prototype,"m_convexToWorld",{get:E.prototype.Tz,set:E.prototype.zC});E.prototype.get_m_hitNormalWorld=E.prototype.sy=function(){return k(Ii(this.hy),p)};E.prototype.set_m_hitNormalWorld=E.prototype.zy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ji(c,a)};Object.defineProperty(E.prototype,"m_hitNormalWorld",{get:E.prototype.sy,set:E.prototype.zy});E.prototype.get_m_hitPointWorld=E.prototype.ty=function(){return k(Ki(this.hy),p)}; E.prototype.set_m_hitPointWorld=E.prototype.Ay=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Li(c,a)};Object.defineProperty(E.prototype,"m_hitPointWorld",{get:E.prototype.ty,set:E.prototype.Ay});E.prototype.get_m_collisionFilterGroup=E.prototype.ky=function(){return Mi(this.hy)};E.prototype.set_m_collisionFilterGroup=E.prototype.my=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ni(c,a)};Object.defineProperty(E.prototype,"m_collisionFilterGroup",{get:E.prototype.ky,set:E.prototype.my}); E.prototype.get_m_collisionFilterMask=E.prototype.ly=function(){return Oi(this.hy)};E.prototype.set_m_collisionFilterMask=E.prototype.ny=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pi(c,a)};Object.defineProperty(E.prototype,"m_collisionFilterMask",{get:E.prototype.ly,set:E.prototype.ny});E.prototype.get_m_closestHitFraction=E.prototype.oy=function(){return Qi(this.hy)}; E.prototype.set_m_closestHitFraction=E.prototype.py=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ri(c,a)};Object.defineProperty(E.prototype,"m_closestHitFraction",{get:E.prototype.oy,set:E.prototype.py});E.prototype.__destroy__=function(){Si(this.hy)};function G(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=Ti(a,c);h(G)[this.hy]=this}G.prototype=Object.create(z.prototype);G.prototype.constructor=G;G.prototype.iy=G;G.jy={};b.AllHitsRayResultCallback=G; G.prototype.hasHit=function(){return!!Ui(this.hy)};G.prototype.get_m_collisionObjects=G.prototype.Oz=function(){return k(Vi(this.hy),oB)};G.prototype.set_m_collisionObjects=G.prototype.uC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wi(c,a)};Object.defineProperty(G.prototype,"m_collisionObjects",{get:G.prototype.Oz,set:G.prototype.uC});G.prototype.get_m_rayFromWorld=G.prototype.Iy=function(){return k(Xi(this.hy),p)}; G.prototype.set_m_rayFromWorld=G.prototype.Ry=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Yi(c,a)};Object.defineProperty(G.prototype,"m_rayFromWorld",{get:G.prototype.Iy,set:G.prototype.Ry});G.prototype.get_m_rayToWorld=G.prototype.Jy=function(){return k(Zi(this.hy),p)};G.prototype.set_m_rayToWorld=G.prototype.Sy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);$i(c,a)};Object.defineProperty(G.prototype,"m_rayToWorld",{get:G.prototype.Jy,set:G.prototype.Sy}); G.prototype.get_m_hitNormalWorld=G.prototype.sy=function(){return k(aj(this.hy),pB)};G.prototype.set_m_hitNormalWorld=G.prototype.zy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);bj(c,a)};Object.defineProperty(G.prototype,"m_hitNormalWorld",{get:G.prototype.sy,set:G.prototype.zy});G.prototype.get_m_hitPointWorld=G.prototype.ty=function(){return k(cj(this.hy),pB)};G.prototype.set_m_hitPointWorld=G.prototype.Ay=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);dj(c,a)}; Object.defineProperty(G.prototype,"m_hitPointWorld",{get:G.prototype.ty,set:G.prototype.Ay});G.prototype.get_m_hitFractions=G.prototype.kA=function(){return k(ej(this.hy),kB)};G.prototype.set_m_hitFractions=G.prototype.RC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);fj(c,a)};Object.defineProperty(G.prototype,"m_hitFractions",{get:G.prototype.kA,set:G.prototype.RC});G.prototype.get_m_collisionFilterGroup=G.prototype.ky=function(){return gj(this.hy)}; G.prototype.set_m_collisionFilterGroup=G.prototype.my=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);hj(c,a)};Object.defineProperty(G.prototype,"m_collisionFilterGroup",{get:G.prototype.ky,set:G.prototype.my});G.prototype.get_m_collisionFilterMask=G.prototype.ly=function(){return ij(this.hy)};G.prototype.set_m_collisionFilterMask=G.prototype.ny=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);jj(c,a)}; Object.defineProperty(G.prototype,"m_collisionFilterMask",{get:G.prototype.ly,set:G.prototype.ny});G.prototype.get_m_closestHitFraction=G.prototype.oy=function(){return kj(this.hy)};G.prototype.set_m_closestHitFraction=G.prototype.py=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);lj(c,a)};Object.defineProperty(G.prototype,"m_closestHitFraction",{get:G.prototype.oy,set:G.prototype.py});G.prototype.get_m_collisionObject=G.prototype.qy=function(){return k(mj(this.hy),q)}; G.prototype.set_m_collisionObject=G.prototype.xy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);nj(c,a)};Object.defineProperty(G.prototype,"m_collisionObject",{get:G.prototype.qy,set:G.prototype.xy});G.prototype.__destroy__=function(){oj(this.hy)};function qB(){throw"cannot construct a tMaterialArray, no constructor in IDL";}qB.prototype=Object.create(f.prototype);qB.prototype.constructor=qB;qB.prototype.iy=qB;qB.jy={};b.tMaterialArray=qB;qB.prototype.size=qB.prototype.size=function(){return pj(this.hy)}; qB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(qj(c,a),A)};qB.prototype.__destroy__=function(){rj(this.hy)};function rB(a){a&&"object"===typeof a&&(a=a.hy);this.hy=sj(a);h(rB)[this.hy]=this}rB.prototype=Object.create($A.prototype);rB.prototype.constructor=rB;rB.prototype.iy=rB;rB.jy={};b.btDefaultVehicleRaycaster=rB; rB.prototype.castRay=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);tj(e,a,c,d)};rB.prototype.__destroy__=function(){uj(this.hy)};function sB(){this.hy=vj();h(sB)[this.hy]=this}sB.prototype=Object.create(UA.prototype);sB.prototype.constructor=sB;sB.prototype.iy=sB;sB.jy={};b.btEmptyShape=sB;sB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);wj(c,a)}; sB.prototype.getLocalScaling=function(){return k(xj(this.hy),p)};sB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);yj(d,a,c)};sB.prototype.__destroy__=function(){zj(this.hy)};function H(){this.hy=Aj();h(H)[this.hy]=this}H.prototype=Object.create(f.prototype);H.prototype.constructor=H;H.prototype.iy=H;H.jy={};b.btConstraintSetting=H;H.prototype.get_m_tau=H.prototype.hB=function(){return Bj(this.hy)}; H.prototype.set_m_tau=H.prototype.OD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Cj(c,a)};Object.defineProperty(H.prototype,"m_tau",{get:H.prototype.hB,set:H.prototype.OD});H.prototype.get_m_damping=H.prototype.Uz=function(){return Dj(this.hy)};H.prototype.set_m_damping=H.prototype.AC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ej(c,a)};Object.defineProperty(H.prototype,"m_damping",{get:H.prototype.Uz,set:H.prototype.AC}); H.prototype.get_m_impulseClamp=H.prototype.qA=function(){return Fj(this.hy)};H.prototype.set_m_impulseClamp=H.prototype.XC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Gj(c,a)};Object.defineProperty(H.prototype,"m_impulseClamp",{get:H.prototype.qA,set:H.prototype.XC});H.prototype.__destroy__=function(){Hj(this.hy)};function tB(){throw"cannot construct a LocalShapeInfo, no constructor in IDL";}tB.prototype=Object.create(f.prototype);tB.prototype.constructor=tB;tB.prototype.iy=tB; tB.jy={};b.LocalShapeInfo=tB;tB.prototype.get_m_shapePart=tB.prototype.WA=function(){return Ij(this.hy)};tB.prototype.set_m_shapePart=tB.prototype.CD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Jj(c,a)};Object.defineProperty(tB.prototype,"m_shapePart",{get:tB.prototype.WA,set:tB.prototype.CD});tB.prototype.get_m_triangleIndex=tB.prototype.kB=function(){return Kj(this.hy)}; tB.prototype.set_m_triangleIndex=tB.prototype.RD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Lj(c,a)};Object.defineProperty(tB.prototype,"m_triangleIndex",{get:tB.prototype.kB,set:tB.prototype.RD});tB.prototype.__destroy__=function(){Mj(this.hy)};function I(a){a&&"object"===typeof a&&(a=a.hy);this.hy=Nj(a);h(I)[this.hy]=this}I.prototype=Object.create(q.prototype);I.prototype.constructor=I;I.prototype.iy=I;I.jy={};b.btRigidBody=I; I.prototype.getCenterOfMassTransform=function(){return k(Oj(this.hy),r)};I.prototype.setCenterOfMassTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pj(c,a)};I.prototype.setSleepingThresholds=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Qj(d,a,c)};I.prototype.getLinearDamping=function(){return Rj(this.hy)};I.prototype.getAngularDamping=function(){return Sj(this.hy)}; I.prototype.setDamping=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Tj(d,a,c)};I.prototype.setMassProps=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Uj(d,a,c)};I.prototype.getLinearFactor=function(){return k(Vj(this.hy),p)};I.prototype.setLinearFactor=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wj(c,a)}; I.prototype.applyTorque=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xj(c,a)};I.prototype.applyLocalTorque=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Yj(c,a)};I.prototype.applyForce=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Zj(d,a,c)};I.prototype.applyCentralForce=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ak(c,a)}; I.prototype.applyCentralLocalForce=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);bk(c,a)};I.prototype.applyTorqueImpulse=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ck(c,a)};I.prototype.applyImpulse=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);dk(d,a,c)};I.prototype.applyCentralImpulse=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ek(c,a)};I.prototype.updateInertiaTensor=function(){fk(this.hy)}; I.prototype.getLinearVelocity=function(){return k(gk(this.hy),p)};I.prototype.getAngularVelocity=function(){return k(hk(this.hy),p)};I.prototype.setLinearVelocity=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ik(c,a)};I.prototype.setAngularVelocity=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);jk(c,a)};I.prototype.getMotionState=function(){return k(kk(this.hy),gB)};I.prototype.setMotionState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);lk(c,a)}; I.prototype.getAngularFactor=function(){return k(mk(this.hy),p)};I.prototype.setAngularFactor=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);nk(c,a)};I.prototype.upcast=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(ok(c,a),I)};I.prototype.getAabb=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);pk(d,a,c)};I.prototype.applyGravity=function(){qk(this.hy)};I.prototype.getGravity=function(){return k(rk(this.hy),p)}; I.prototype.setGravity=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);sk(c,a)};I.prototype.getBroadphaseProxy=function(){return k(tk(this.hy),t)};I.prototype.clearForces=function(){uk(this.hy)};I.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);vk(d,a,c)};I.prototype.getCollisionShape=function(){return k(wk(this.hy),m)}; I.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);xk(c,a)};I.prototype.setActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yk(c,a)};I.prototype.forceActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);zk(c,a)};I.prototype.activate=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);void 0===a?Ak(c):Bk(c,a)};I.prototype.isActive=function(){return!!Ck(this.hy)};I.prototype.isKinematicObject=function(){return!!Dk(this.hy)}; I.prototype.isStaticObject=function(){return!!Ek(this.hy)};I.prototype.isStaticOrKinematicObject=function(){return!!Fk(this.hy)};I.prototype.getRestitution=function(){return Gk(this.hy)};I.prototype.getFriction=function(){return Hk(this.hy)};I.prototype.getRollingFriction=function(){return Ik(this.hy)};I.prototype.setRestitution=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Jk(c,a)};I.prototype.setFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Kk(c,a)}; I.prototype.setRollingFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Lk(c,a)};I.prototype.getWorldTransform=function(){return k(Mk(this.hy),r)};I.prototype.getCollisionFlags=function(){return Nk(this.hy)};I.prototype.setCollisionFlags=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ok(c,a)};I.prototype.setWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pk(c,a)}; I.prototype.setCollisionShape=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qk(c,a)};I.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Rk(c,a)};I.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Sk(c,a)};I.prototype.getUserIndex=function(){return Tk(this.hy)};I.prototype.setUserIndex=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Uk(c,a)}; I.prototype.getUserPointer=function(){return k(Vk(this.hy),SA)};I.prototype.setUserPointer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wk(c,a)};I.prototype.getBroadphaseHandle=function(){return k(Xk(this.hy),t)};I.prototype.__destroy__=function(){Yk(this.hy)};function uB(){throw"cannot construct a btIndexedMeshArray, no constructor in IDL";}uB.prototype=Object.create(f.prototype);uB.prototype.constructor=uB;uB.prototype.iy=uB;uB.jy={};b.btIndexedMeshArray=uB; uB.prototype.size=uB.prototype.size=function(){return Zk(this.hy)};uB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k($k(c,a),vB)};uB.prototype.__destroy__=function(){al(this.hy)};function wB(){this.hy=bl();h(wB)[this.hy]=this}wB.prototype=Object.create(f.prototype);wB.prototype.constructor=wB;wB.prototype.iy=wB;wB.jy={};b.btDbvtBroadphase=wB;wB.prototype.__destroy__=function(){cl(this.hy)}; function xB(a,c,d,e,g,n,F,aa,ta){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);n&&"object"===typeof n&&(n=n.hy);F&&"object"===typeof F&&(F=F.hy);aa&&"object"===typeof aa&&(aa=aa.hy);ta&&"object"===typeof ta&&(ta=ta.hy);this.hy=dl(a,c,d,e,g,n,F,aa,ta);h(xB)[this.hy]=this}xB.prototype=Object.create(UA.prototype);xB.prototype.constructor=xB;xB.prototype.iy=xB;xB.jy={}; b.btHeightfieldTerrainShape=xB;xB.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);el(c,a)};xB.prototype.getMargin=function(){return fl(this.hy)};xB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);gl(c,a)};xB.prototype.getLocalScaling=function(){return k(hl(this.hy),p)};xB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);il(d,a,c)}; xB.prototype.__destroy__=function(){jl(this.hy)};function yB(){this.hy=kl();h(yB)[this.hy]=this}yB.prototype=Object.create(iB.prototype);yB.prototype.constructor=yB;yB.prototype.iy=yB;yB.jy={};b.btDefaultSoftBodySolver=yB;yB.prototype.__destroy__=function(){ll(this.hy)};function zB(a){a&&"object"===typeof a&&(a=a.hy);this.hy=ml(a);h(zB)[this.hy]=this}zB.prototype=Object.create(OA.prototype);zB.prototype.constructor=zB;zB.prototype.iy=zB;zB.jy={};b.btCollisionDispatcher=zB; zB.prototype.getNumManifolds=function(){return nl(this.hy)};zB.prototype.getManifoldByIndexInternal=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(ol(c,a),dB)};zB.prototype.__destroy__=function(){pl(this.hy)}; function AB(a,c,d,e,g){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);this.hy=void 0===d?ql(a,c):void 0===e?rl(a,c,d):void 0===g?sl(a,c,d,e):tl(a,c,d,e,g);h(AB)[this.hy]=this}AB.prototype=Object.create(f.prototype);AB.prototype.constructor=AB;AB.prototype.iy=AB;AB.jy={};b.btAxisSweep3=AB;AB.prototype.__destroy__=function(){ul(this.hy)}; function SA(){throw"cannot construct a VoidPtr, no constructor in IDL";}SA.prototype=Object.create(f.prototype);SA.prototype.constructor=SA;SA.prototype.iy=SA;SA.jy={};b.VoidPtr=SA;SA.prototype.__destroy__=function(){vl(this.hy)};function J(){this.hy=wl();h(J)[this.hy]=this}J.prototype=Object.create(f.prototype);J.prototype.constructor=J;J.prototype.iy=J;J.jy={};b.btSoftBodyWorldInfo=J;J.prototype.get_air_density=J.prototype.Yy=function(){return xl(this.hy)}; J.prototype.set_air_density=J.prototype.FB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yl(c,a)};Object.defineProperty(J.prototype,"air_density",{get:J.prototype.Yy,set:J.prototype.FB});J.prototype.get_water_density=J.prototype.CB=function(){return zl(this.hy)};J.prototype.set_water_density=J.prototype.iE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Al(c,a)};Object.defineProperty(J.prototype,"water_density",{get:J.prototype.CB,set:J.prototype.iE}); J.prototype.get_water_offset=J.prototype.EB=function(){return Bl(this.hy)};J.prototype.set_water_offset=J.prototype.kE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Cl(c,a)};Object.defineProperty(J.prototype,"water_offset",{get:J.prototype.EB,set:J.prototype.kE});J.prototype.get_m_maxDisplacement=J.prototype.EA=function(){return Dl(this.hy)};J.prototype.set_m_maxDisplacement=J.prototype.kD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);El(c,a)}; Object.defineProperty(J.prototype,"m_maxDisplacement",{get:J.prototype.EA,set:J.prototype.kD});J.prototype.get_water_normal=J.prototype.DB=function(){return k(Fl(this.hy),p)};J.prototype.set_water_normal=J.prototype.jE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Gl(c,a)};Object.defineProperty(J.prototype,"water_normal",{get:J.prototype.DB,set:J.prototype.jE});J.prototype.get_m_broadphase=J.prototype.Gz=function(){return k(Hl(this.hy),QA)}; J.prototype.set_m_broadphase=J.prototype.mC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Il(c,a)};Object.defineProperty(J.prototype,"m_broadphase",{get:J.prototype.Gz,set:J.prototype.mC});J.prototype.get_m_dispatcher=J.prototype.Xz=function(){return k(Jl(this.hy),OA)};J.prototype.set_m_dispatcher=J.prototype.DC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Kl(c,a)};Object.defineProperty(J.prototype,"m_dispatcher",{get:J.prototype.Xz,set:J.prototype.DC}); J.prototype.get_m_gravity=J.prototype.fA=function(){return k(Ll(this.hy),p)};J.prototype.set_m_gravity=J.prototype.MC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ml(c,a)};Object.defineProperty(J.prototype,"m_gravity",{get:J.prototype.fA,set:J.prototype.MC});J.prototype.__destroy__=function(){Nl(this.hy)}; function BB(a,c,d,e){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);this.hy=void 0===d?Ol(a,c):void 0===e?_emscripten_bind_btConeTwistConstraint_btConeTwistConstraint_3(a,c,d):Pl(a,c,d,e);h(BB)[this.hy]=this}BB.prototype=Object.create(TA.prototype);BB.prototype.constructor=BB;BB.prototype.iy=BB;BB.jy={};b.btConeTwistConstraint=BB; BB.prototype.setLimit=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Ql(d,a,c)};BB.prototype.setAngularOnly=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Rl(c,a)};BB.prototype.setDamping=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Sl(c,a)};BB.prototype.enableMotor=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Tl(c,a)}; BB.prototype.setMaxMotorImpulse=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ul(c,a)};BB.prototype.setMaxMotorImpulseNormalized=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vl(c,a)};BB.prototype.setMotorTarget=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wl(c,a)};BB.prototype.setMotorTargetInConstraintSpace=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xl(c,a)}; BB.prototype.enableFeedback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Yl(c,a)};BB.prototype.getBreakingImpulseThreshold=function(){return Zl(this.hy)};BB.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);$l(c,a)};BB.prototype.getParam=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return am(d,a,c)}; BB.prototype.setParam=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);bm(e,a,c,d)};BB.prototype.__destroy__=function(){cm(this.hy)}; function CB(a,c,d,e,g,n,F){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);n&&"object"===typeof n&&(n=n.hy);F&&"object"===typeof F&&(F=F.hy);this.hy=void 0===d?dm(a,c):void 0===e?em(a,c,d):void 0===g?fm(a,c,d,e):void 0===n?gm(a,c,d,e,g):void 0===F?hm(a,c,d,e,g,n):im(a,c,d,e,g,n,F);h(CB)[this.hy]=this}CB.prototype=Object.create(TA.prototype);CB.prototype.constructor=CB; CB.prototype.iy=CB;CB.jy={};b.btHingeConstraint=CB;CB.prototype.setLimit=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);void 0===g?jm(n,a,c,d,e):km(n,a,c,d,e,g)};CB.prototype.enableAngularMotor=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);lm(e,a,c,d)}; CB.prototype.setAngularOnly=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);mm(c,a)};CB.prototype.enableMotor=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);nm(c,a)};CB.prototype.setMaxMotorImpulse=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);om(c,a)};CB.prototype.setMotorTarget=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);pm(d,a,c)}; CB.prototype.enableFeedback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);qm(c,a)};CB.prototype.getBreakingImpulseThreshold=function(){return rm(this.hy)};CB.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);sm(c,a)};CB.prototype.getParam=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return tm(d,a,c)}; CB.prototype.setParam=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);um(e,a,c,d)};CB.prototype.__destroy__=function(){wm(this.hy)};function DB(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=xm(a,c);h(DB)[this.hy]=this}DB.prototype=Object.create(YA.prototype);DB.prototype.constructor=DB;DB.prototype.iy=DB;DB.jy={};b.btConeShapeZ=DB; DB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ym(c,a)};DB.prototype.getLocalScaling=function(){return k(zm(this.hy),p)};DB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Am(d,a,c)};DB.prototype.__destroy__=function(){Bm(this.hy)};function EB(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=Cm(a,c);h(EB)[this.hy]=this}EB.prototype=Object.create(YA.prototype); EB.prototype.constructor=EB;EB.prototype.iy=EB;EB.jy={};b.btConeShapeX=EB;EB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Dm(c,a)};EB.prototype.getLocalScaling=function(){return k(Em(this.hy),p)};EB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Fm(d,a,c)};EB.prototype.__destroy__=function(){Gm(this.hy)}; function FB(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=void 0===a?Hm():void 0===c?Im(a):Jm(a,c);h(FB)[this.hy]=this}FB.prototype=Object.create(fB.prototype);FB.prototype.constructor=FB;FB.prototype.iy=FB;FB.jy={};b.btTriangleMesh=FB;FB.prototype.addTriangle=function(a,c,d,e){var g=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);void 0===e?Km(g,a,c,d):Lm(g,a,c,d,e)}; FB.prototype.findOrAddVertex=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return Mm(d,a,c)};FB.prototype.addIndex=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Nm(c,a)};FB.prototype.getIndexedMeshArray=function(){return k(Om(this.hy),uB)};FB.prototype.setScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pm(c,a)};FB.prototype.__destroy__=function(){Qm(this.hy)}; function GB(a,c){IA();"object"==typeof a&&(a=MA(a));c&&"object"===typeof c&&(c=c.hy);this.hy=void 0===a?Rm():void 0===c?Sm(a):Tm(a,c);h(GB)[this.hy]=this}GB.prototype=Object.create(m.prototype);GB.prototype.constructor=GB;GB.prototype.iy=GB;GB.jy={};b.btConvexHullShape=GB;GB.prototype.addPoint=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);void 0===c?Um(d,a):Vm(d,a,c)}; GB.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wm(c,a)};GB.prototype.getMargin=function(){return Xm(this.hy)};GB.prototype.getNumVertices=function(){return Ym(this.hy)};GB.prototype.initializePolyhedralFeatures=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return!!Zm(c,a)};GB.prototype.recalcLocalAabb=function(){$m(this.hy)};GB.prototype.getConvexPolyhedron=function(){return k(an(this.hy),HB)}; GB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);bn(c,a)};GB.prototype.getLocalScaling=function(){return k(cn(this.hy),p)};GB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);dn(d,a,c)};GB.prototype.__destroy__=function(){en(this.hy)};function K(){this.hy=fn();h(K)[this.hy]=this}K.prototype=Object.create(f.prototype);K.prototype.constructor=K;K.prototype.iy=K;K.jy={}; b.btVehicleTuning=K;K.prototype.get_m_suspensionStiffness=K.prototype.wy=function(){return gn(this.hy)};K.prototype.set_m_suspensionStiffness=K.prototype.Dy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);hn(c,a)};Object.defineProperty(K.prototype,"m_suspensionStiffness",{get:K.prototype.wy,set:K.prototype.Dy});K.prototype.get_m_suspensionCompression=K.prototype.bB=function(){return jn(this.hy)}; K.prototype.set_m_suspensionCompression=K.prototype.ID=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);kn(c,a)};Object.defineProperty(K.prototype,"m_suspensionCompression",{get:K.prototype.bB,set:K.prototype.ID});K.prototype.get_m_suspensionDamping=K.prototype.cB=function(){return ln(this.hy)};K.prototype.set_m_suspensionDamping=K.prototype.JD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);mn(c,a)}; Object.defineProperty(K.prototype,"m_suspensionDamping",{get:K.prototype.cB,set:K.prototype.JD});K.prototype.get_m_maxSuspensionTravelCm=K.prototype.vy=function(){return nn(this.hy)};K.prototype.set_m_maxSuspensionTravelCm=K.prototype.Cy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);on(c,a)};Object.defineProperty(K.prototype,"m_maxSuspensionTravelCm",{get:K.prototype.vy,set:K.prototype.Cy});K.prototype.get_m_frictionSlip=K.prototype.ry=function(){return pn(this.hy)}; K.prototype.set_m_frictionSlip=K.prototype.yy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);qn(c,a)};Object.defineProperty(K.prototype,"m_frictionSlip",{get:K.prototype.ry,set:K.prototype.yy});K.prototype.get_m_maxSuspensionForce=K.prototype.uy=function(){return rn(this.hy)};K.prototype.set_m_maxSuspensionForce=K.prototype.By=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);sn(c,a)};Object.defineProperty(K.prototype,"m_maxSuspensionForce",{get:K.prototype.uy,set:K.prototype.By}); function IB(){throw"cannot construct a btCollisionObjectWrapper, no constructor in IDL";}IB.prototype=Object.create(f.prototype);IB.prototype.constructor=IB;IB.prototype.iy=IB;IB.jy={};b.btCollisionObjectWrapper=IB;IB.prototype.getWorldTransform=function(){return k(tn(this.hy),r)};IB.prototype.getCollisionObject=function(){return k(un(this.hy),q)};IB.prototype.getCollisionShape=function(){return k(vn(this.hy),m)};function JB(a){a&&"object"===typeof a&&(a=a.hy);this.hy=wn(a);h(JB)[this.hy]=this} JB.prototype=Object.create(f.prototype);JB.prototype.constructor=JB;JB.prototype.iy=JB;JB.jy={};b.btShapeHull=JB;JB.prototype.buildHull=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return!!xn(c,a)};JB.prototype.numVertices=function(){return yn(this.hy)};JB.prototype.getVertexPointer=function(){return k(zn(this.hy),p)};JB.prototype.__destroy__=function(){An(this.hy)}; function KB(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=void 0===a?Bn():void 0===c?Cn(a):Dn(a,c);h(KB)[this.hy]=this}KB.prototype=Object.create(gB.prototype);KB.prototype.constructor=KB;KB.prototype.iy=KB;KB.jy={};b.btDefaultMotionState=KB;KB.prototype.getWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);En(c,a)};KB.prototype.setWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Fn(c,a)}; KB.prototype.get_m_graphicsWorldTrans=KB.prototype.eA=function(){return k(Gn(this.hy),r)};KB.prototype.set_m_graphicsWorldTrans=KB.prototype.LC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Hn(c,a)};Object.defineProperty(KB.prototype,"m_graphicsWorldTrans",{get:KB.prototype.eA,set:KB.prototype.LC});KB.prototype.__destroy__=function(){In(this.hy)};function L(a){a&&"object"===typeof a&&(a=a.hy);this.hy=Jn(a);h(L)[this.hy]=this}L.prototype=Object.create(f.prototype); L.prototype.constructor=L;L.prototype.iy=L;L.jy={};b.btWheelInfo=L;L.prototype.getSuspensionRestLength=function(){return Kn(this.hy)};L.prototype.updateWheel=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Ln(d,a,c)};L.prototype.get_m_suspensionStiffness=L.prototype.wy=function(){return Mn(this.hy)};L.prototype.set_m_suspensionStiffness=L.prototype.Dy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Nn(c,a)}; Object.defineProperty(L.prototype,"m_suspensionStiffness",{get:L.prototype.wy,set:L.prototype.Dy});L.prototype.get_m_frictionSlip=L.prototype.ry=function(){return On(this.hy)};L.prototype.set_m_frictionSlip=L.prototype.yy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pn(c,a)};Object.defineProperty(L.prototype,"m_frictionSlip",{get:L.prototype.ry,set:L.prototype.yy});L.prototype.get_m_engineForce=L.prototype.aA=function(){return Qn(this.hy)}; L.prototype.set_m_engineForce=L.prototype.HC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Rn(c,a)};Object.defineProperty(L.prototype,"m_engineForce",{get:L.prototype.aA,set:L.prototype.HC});L.prototype.get_m_rollInfluence=L.prototype.SA=function(){return Sn(this.hy)};L.prototype.set_m_rollInfluence=L.prototype.yD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Tn(c,a)};Object.defineProperty(L.prototype,"m_rollInfluence",{get:L.prototype.SA,set:L.prototype.yD}); L.prototype.get_m_suspensionRestLength1=L.prototype.gB=function(){return Un(this.hy)};L.prototype.set_m_suspensionRestLength1=L.prototype.ND=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vn(c,a)};Object.defineProperty(L.prototype,"m_suspensionRestLength1",{get:L.prototype.gB,set:L.prototype.ND});L.prototype.get_m_wheelsRadius=L.prototype.uB=function(){return Wn(this.hy)};L.prototype.set_m_wheelsRadius=L.prototype.aE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xn(c,a)}; Object.defineProperty(L.prototype,"m_wheelsRadius",{get:L.prototype.uB,set:L.prototype.aE});L.prototype.get_m_wheelsDampingCompression=L.prototype.My=function(){return Yn(this.hy)};L.prototype.set_m_wheelsDampingCompression=L.prototype.Vy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Zn(c,a)};Object.defineProperty(L.prototype,"m_wheelsDampingCompression",{get:L.prototype.My,set:L.prototype.Vy});L.prototype.get_m_wheelsDampingRelaxation=L.prototype.Ny=function(){return $n(this.hy)}; L.prototype.set_m_wheelsDampingRelaxation=L.prototype.Wy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ao(c,a)};Object.defineProperty(L.prototype,"m_wheelsDampingRelaxation",{get:L.prototype.Ny,set:L.prototype.Wy});L.prototype.get_m_steering=L.prototype.$A=function(){return bo(this.hy)};L.prototype.set_m_steering=L.prototype.GD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);co(c,a)};Object.defineProperty(L.prototype,"m_steering",{get:L.prototype.$A,set:L.prototype.GD}); L.prototype.get_m_maxSuspensionForce=L.prototype.uy=function(){return eo(this.hy)};L.prototype.set_m_maxSuspensionForce=L.prototype.By=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);fo(c,a)};Object.defineProperty(L.prototype,"m_maxSuspensionForce",{get:L.prototype.uy,set:L.prototype.By});L.prototype.get_m_maxSuspensionTravelCm=L.prototype.vy=function(){return go(this.hy)}; L.prototype.set_m_maxSuspensionTravelCm=L.prototype.Cy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ho(c,a)};Object.defineProperty(L.prototype,"m_maxSuspensionTravelCm",{get:L.prototype.vy,set:L.prototype.Cy});L.prototype.get_m_wheelsSuspensionForce=L.prototype.vB=function(){return io(this.hy)};L.prototype.set_m_wheelsSuspensionForce=L.prototype.bE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);jo(c,a)}; Object.defineProperty(L.prototype,"m_wheelsSuspensionForce",{get:L.prototype.vB,set:L.prototype.bE});L.prototype.get_m_bIsFrontWheel=L.prototype.Fy=function(){return!!ko(this.hy)};L.prototype.set_m_bIsFrontWheel=L.prototype.Oy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);lo(c,a)};Object.defineProperty(L.prototype,"m_bIsFrontWheel",{get:L.prototype.Fy,set:L.prototype.Oy});L.prototype.get_m_raycastInfo=L.prototype.QA=function(){return k(mo(this.hy),M)}; L.prototype.set_m_raycastInfo=L.prototype.wD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);no(c,a)};Object.defineProperty(L.prototype,"m_raycastInfo",{get:L.prototype.QA,set:L.prototype.wD});L.prototype.get_m_chassisConnectionPointCS=L.prototype.Mz=function(){return k(oo(this.hy),p)};L.prototype.set_m_chassisConnectionPointCS=L.prototype.sC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);po(c,a)}; Object.defineProperty(L.prototype,"m_chassisConnectionPointCS",{get:L.prototype.Mz,set:L.prototype.sC});L.prototype.get_m_worldTransform=L.prototype.wB=function(){return k(qo(this.hy),r)};L.prototype.set_m_worldTransform=L.prototype.cE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ro(c,a)};Object.defineProperty(L.prototype,"m_worldTransform",{get:L.prototype.wB,set:L.prototype.cE});L.prototype.get_m_wheelDirectionCS=L.prototype.Ly=function(){return k(so(this.hy),p)}; L.prototype.set_m_wheelDirectionCS=L.prototype.Uy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);to(c,a)};Object.defineProperty(L.prototype,"m_wheelDirectionCS",{get:L.prototype.Ly,set:L.prototype.Uy});L.prototype.get_m_wheelAxleCS=L.prototype.Ky=function(){return k(uo(this.hy),p)};L.prototype.set_m_wheelAxleCS=L.prototype.Ty=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);vo(c,a)};Object.defineProperty(L.prototype,"m_wheelAxleCS",{get:L.prototype.Ky,set:L.prototype.Ty}); L.prototype.get_m_rotation=L.prototype.UA=function(){return wo(this.hy)};L.prototype.set_m_rotation=L.prototype.AD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);xo(c,a)};Object.defineProperty(L.prototype,"m_rotation",{get:L.prototype.UA,set:L.prototype.AD});L.prototype.get_m_deltaRotation=L.prototype.Vz=function(){return yo(this.hy)};L.prototype.set_m_deltaRotation=L.prototype.BC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);zo(c,a)}; Object.defineProperty(L.prototype,"m_deltaRotation",{get:L.prototype.Vz,set:L.prototype.BC});L.prototype.get_m_brake=L.prototype.Fz=function(){return Ao(this.hy)};L.prototype.set_m_brake=L.prototype.lC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Bo(c,a)};Object.defineProperty(L.prototype,"m_brake",{get:L.prototype.Fz,set:L.prototype.lC});L.prototype.get_m_clippedInvContactDotSuspension=L.prototype.Nz=function(){return Co(this.hy)}; L.prototype.set_m_clippedInvContactDotSuspension=L.prototype.tC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Do(c,a)};Object.defineProperty(L.prototype,"m_clippedInvContactDotSuspension",{get:L.prototype.Nz,set:L.prototype.tC});L.prototype.get_m_suspensionRelativeVelocity=L.prototype.eB=function(){return Eo(this.hy)};L.prototype.set_m_suspensionRelativeVelocity=L.prototype.LD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Fo(c,a)}; Object.defineProperty(L.prototype,"m_suspensionRelativeVelocity",{get:L.prototype.eB,set:L.prototype.LD});L.prototype.get_m_skidInfo=L.prototype.XA=function(){return Go(this.hy)};L.prototype.set_m_skidInfo=L.prototype.DD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ho(c,a)};Object.defineProperty(L.prototype,"m_skidInfo",{get:L.prototype.XA,set:L.prototype.DD});L.prototype.__destroy__=function(){Io(this.hy)}; function N(a,c,d,e){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);this.hy=void 0===a?Jo():void 0===c?_emscripten_bind_btVector4_btVector4_1(a):void 0===d?_emscripten_bind_btVector4_btVector4_2(a,c):void 0===e?_emscripten_bind_btVector4_btVector4_3(a,c,d):Ko(a,c,d,e);h(N)[this.hy]=this}N.prototype=Object.create(p.prototype);N.prototype.constructor=N;N.prototype.iy=N;N.jy={};b.btVector4=N;N.prototype.w=function(){return Lo(this.hy)}; N.prototype.setValue=function(a,c,d,e){var g=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);Mo(g,a,c,d,e)};N.prototype.length=N.prototype.length=function(){return No(this.hy)};N.prototype.x=N.prototype.x=function(){return Oo(this.hy)};N.prototype.y=N.prototype.y=function(){return Po(this.hy)};N.prototype.z=N.prototype.z=function(){return Qo(this.hy)}; N.prototype.setX=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ro(c,a)};N.prototype.setY=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);So(c,a)};N.prototype.setZ=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);To(c,a)};N.prototype.normalize=N.prototype.normalize=function(){Uo(this.hy)};N.prototype.rotate=N.prototype.rotate=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return k(Vo(d,a,c),p)}; N.prototype.dot=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return Wo(c,a)};N.prototype.op_mul=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Xo(c,a),p)};N.prototype.op_add=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Yo(c,a),p)};N.prototype.op_sub=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Zo(c,a),p)};N.prototype.__destroy__=function(){$o(this.hy)};function LB(){this.hy=ap();h(LB)[this.hy]=this}LB.prototype=Object.create(f.prototype); LB.prototype.constructor=LB;LB.prototype.iy=LB;LB.jy={};b.btDefaultCollisionConstructionInfo=LB;LB.prototype.__destroy__=function(){bp(this.hy)};function O(){throw"cannot construct a Anchor, no constructor in IDL";}O.prototype=Object.create(f.prototype);O.prototype.constructor=O;O.prototype.iy=O;O.jy={};b.Anchor=O;O.prototype.get_m_node=O.prototype.FA=function(){return k(cp(this.hy),Node)};O.prototype.set_m_node=O.prototype.lD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);dp(c,a)}; Object.defineProperty(O.prototype,"m_node",{get:O.prototype.FA,set:O.prototype.lD});O.prototype.get_m_local=O.prototype.zA=function(){return k(ep(this.hy),p)};O.prototype.set_m_local=O.prototype.fD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);fp(c,a)};Object.defineProperty(O.prototype,"m_local",{get:O.prototype.zA,set:O.prototype.fD});O.prototype.get_m_body=O.prototype.Ez=function(){return k(gp(this.hy),I)}; O.prototype.set_m_body=O.prototype.kC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);hp(c,a)};Object.defineProperty(O.prototype,"m_body",{get:O.prototype.Ez,set:O.prototype.kC});O.prototype.get_m_influence=O.prototype.sA=function(){return ip(this.hy)};O.prototype.set_m_influence=O.prototype.ZC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);jp(c,a)};Object.defineProperty(O.prototype,"m_influence",{get:O.prototype.sA,set:O.prototype.ZC}); O.prototype.get_m_c0=O.prototype.Hz=function(){return k(kp(this.hy),jB)};O.prototype.set_m_c0=O.prototype.nC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);lp(c,a)};Object.defineProperty(O.prototype,"m_c0",{get:O.prototype.Hz,set:O.prototype.nC});O.prototype.get_m_c1=O.prototype.Iz=function(){return k(mp(this.hy),p)};O.prototype.set_m_c1=O.prototype.oC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);np(c,a)};Object.defineProperty(O.prototype,"m_c1",{get:O.prototype.Iz,set:O.prototype.oC}); O.prototype.get_m_c2=O.prototype.Jz=function(){return op(this.hy)};O.prototype.set_m_c2=O.prototype.pC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);pp(c,a)};Object.defineProperty(O.prototype,"m_c2",{get:O.prototype.Jz,set:O.prototype.pC});O.prototype.__destroy__=function(){qp(this.hy)};function P(){throw"cannot construct a btVehicleRaycasterResult, no constructor in IDL";}P.prototype=Object.create(f.prototype);P.prototype.constructor=P;P.prototype.iy=P;P.jy={}; b.btVehicleRaycasterResult=P;P.prototype.get_m_hitPointInWorld=P.prototype.nA=function(){return k(rp(this.hy),p)};P.prototype.set_m_hitPointInWorld=P.prototype.UC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);sp(c,a)};Object.defineProperty(P.prototype,"m_hitPointInWorld",{get:P.prototype.nA,set:P.prototype.UC});P.prototype.get_m_hitNormalInWorld=P.prototype.lA=function(){return k(tp(this.hy),p)}; P.prototype.set_m_hitNormalInWorld=P.prototype.SC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);up(c,a)};Object.defineProperty(P.prototype,"m_hitNormalInWorld",{get:P.prototype.lA,set:P.prototype.SC});P.prototype.get_m_distFraction=P.prototype.Yz=function(){return vp(this.hy)};P.prototype.set_m_distFraction=P.prototype.EC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);wp(c,a)};Object.defineProperty(P.prototype,"m_distFraction",{get:P.prototype.Yz,set:P.prototype.EC}); P.prototype.__destroy__=function(){xp(this.hy)};function pB(){throw"cannot construct a btVector3Array, no constructor in IDL";}pB.prototype=Object.create(f.prototype);pB.prototype.constructor=pB;pB.prototype.iy=pB;pB.jy={};b.btVector3Array=pB;pB.prototype.size=pB.prototype.size=function(){return yp(this.hy)};pB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(zp(c,a),p)};pB.prototype.__destroy__=function(){Ap(this.hy)}; function MB(){throw"cannot construct a btConstraintSolver, no constructor in IDL";}MB.prototype=Object.create(f.prototype);MB.prototype.constructor=MB;MB.prototype.iy=MB;MB.jy={};b.btConstraintSolver=MB;MB.prototype.__destroy__=function(){Bp(this.hy)};function Q(a,c,d){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);this.hy=Cp(a,c,d);h(Q)[this.hy]=this}Q.prototype=Object.create(ZA.prototype);Q.prototype.constructor=Q;Q.prototype.iy=Q;Q.jy={}; b.btRaycastVehicle=Q;Q.prototype.applyEngineForce=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Dp(d,a,c)};Q.prototype.setSteeringValue=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Ep(d,a,c)};Q.prototype.getWheelTransformWS=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Fp(c,a),r)}; Q.prototype.updateWheelTransform=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Gp(d,a,c)};Q.prototype.addWheel=function(a,c,d,e,g,n,F){var aa=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);n&&"object"===typeof n&&(n=n.hy);F&&"object"===typeof F&&(F=F.hy);return k(Hp(aa,a,c,d,e,g,n,F),L)};Q.prototype.getNumWheels=function(){return Ip(this.hy)}; Q.prototype.getRigidBody=function(){return k(Jp(this.hy),I)};Q.prototype.getWheelInfo=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Kp(c,a),L)};Q.prototype.setBrake=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Lp(d,a,c)};Q.prototype.setCoordinateSystem=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Mp(e,a,c,d)};Q.prototype.getCurrentSpeedKmHour=function(){return Np(this.hy)}; Q.prototype.getChassisWorldTransform=function(){return k(Op(this.hy),r)};Q.prototype.rayCast=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return Pp(c,a)};Q.prototype.updateVehicle=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qp(c,a)};Q.prototype.resetSuspension=function(){Rp(this.hy)};Q.prototype.getSteeringValue=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return Sp(c,a)}; Q.prototype.updateWheelTransformsWS=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);void 0===c?Tp(d,a):Up(d,a,c)};Q.prototype.setPitchControl=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vp(c,a)};Q.prototype.updateSuspension=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wp(c,a)};Q.prototype.updateFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xp(c,a)};Q.prototype.getRightAxis=function(){return Yp(this.hy)}; Q.prototype.getUpAxis=function(){return Zp(this.hy)};Q.prototype.getForwardAxis=function(){return $p(this.hy)};Q.prototype.getForwardVector=function(){return k(aq(this.hy),p)};Q.prototype.getUserConstraintType=function(){return bq(this.hy)};Q.prototype.setUserConstraintType=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);cq(c,a)};Q.prototype.setUserConstraintId=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);dq(c,a)};Q.prototype.getUserConstraintId=function(){return eq(this.hy)}; Q.prototype.updateAction=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);fq(d,a,c)};Q.prototype.__destroy__=function(){gq(this.hy)};function NB(a){a&&"object"===typeof a&&(a=a.hy);this.hy=hq(a);h(NB)[this.hy]=this}NB.prototype=Object.create(bB.prototype);NB.prototype.constructor=NB;NB.prototype.iy=NB;NB.jy={};b.btCylinderShapeX=NB;NB.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);iq(c,a)};NB.prototype.getMargin=function(){return jq(this.hy)}; NB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);kq(c,a)};NB.prototype.getLocalScaling=function(){return k(lq(this.hy),p)};NB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);mq(d,a,c)};NB.prototype.__destroy__=function(){nq(this.hy)};function OB(a){a&&"object"===typeof a&&(a=a.hy);this.hy=oq(a);h(OB)[this.hy]=this}OB.prototype=Object.create(bB.prototype);OB.prototype.constructor=OB; OB.prototype.iy=OB;OB.jy={};b.btCylinderShapeZ=OB;OB.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);pq(c,a)};OB.prototype.getMargin=function(){return qq(this.hy)};OB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);rq(c,a)};OB.prototype.getLocalScaling=function(){return k(sq(this.hy),p)};OB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);tq(d,a,c)}; OB.prototype.__destroy__=function(){uq(this.hy)};function HB(){throw"cannot construct a btConvexPolyhedron, no constructor in IDL";}HB.prototype=Object.create(f.prototype);HB.prototype.constructor=HB;HB.prototype.iy=HB;HB.jy={};b.btConvexPolyhedron=HB;HB.prototype.get_m_vertices=HB.prototype.qB=function(){return k(vq(this.hy),pB)};HB.prototype.set_m_vertices=HB.prototype.XD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);wq(c,a)}; Object.defineProperty(HB.prototype,"m_vertices",{get:HB.prototype.qB,set:HB.prototype.XD});HB.prototype.get_m_faces=HB.prototype.Gy=function(){return k(xq(this.hy),PB)};HB.prototype.set_m_faces=HB.prototype.Py=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yq(c,a)};Object.defineProperty(HB.prototype,"m_faces",{get:HB.prototype.Gy,set:HB.prototype.Py});HB.prototype.__destroy__=function(){zq(this.hy)};function QB(){this.hy=Aq();h(QB)[this.hy]=this}QB.prototype=Object.create(f.prototype); QB.prototype.constructor=QB;QB.prototype.iy=QB;QB.jy={};b.btSequentialImpulseConstraintSolver=QB;QB.prototype.__destroy__=function(){Bq(this.hy)};function RB(){throw"cannot construct a tAnchorArray, no constructor in IDL";}RB.prototype=Object.create(f.prototype);RB.prototype.constructor=RB;RB.prototype.iy=RB;RB.jy={};b.tAnchorArray=RB;RB.prototype.size=RB.prototype.size=function(){return Cq(this.hy)};RB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Dq(c,a),O)}; RB.prototype.clear=RB.prototype.clear=function(){Eq(this.hy)};RB.prototype.push_back=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Fq(c,a)};RB.prototype.pop_back=function(){Gq(this.hy)};RB.prototype.__destroy__=function(){Hq(this.hy)};function M(){throw"cannot construct a RaycastInfo, no constructor in IDL";}M.prototype=Object.create(f.prototype);M.prototype.constructor=M;M.prototype.iy=M;M.jy={};b.RaycastInfo=M; M.prototype.get_m_contactNormalWS=M.prototype.Pz=function(){return k(Iq(this.hy),p)};M.prototype.set_m_contactNormalWS=M.prototype.vC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Jq(c,a)};Object.defineProperty(M.prototype,"m_contactNormalWS",{get:M.prototype.Pz,set:M.prototype.vC});M.prototype.get_m_contactPointWS=M.prototype.Qz=function(){return k(Kq(this.hy),p)};M.prototype.set_m_contactPointWS=M.prototype.wC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Lq(c,a)}; Object.defineProperty(M.prototype,"m_contactPointWS",{get:M.prototype.Qz,set:M.prototype.wC});M.prototype.get_m_suspensionLength=M.prototype.dB=function(){return Mq(this.hy)};M.prototype.set_m_suspensionLength=M.prototype.KD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Nq(c,a)};Object.defineProperty(M.prototype,"m_suspensionLength",{get:M.prototype.dB,set:M.prototype.KD});M.prototype.get_m_hardPointWS=M.prototype.hA=function(){return k(Oq(this.hy),p)}; M.prototype.set_m_hardPointWS=M.prototype.OC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pq(c,a)};Object.defineProperty(M.prototype,"m_hardPointWS",{get:M.prototype.hA,set:M.prototype.OC});M.prototype.get_m_wheelDirectionWS=M.prototype.sB=function(){return k(Qq(this.hy),p)};M.prototype.set_m_wheelDirectionWS=M.prototype.ZD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Rq(c,a)};Object.defineProperty(M.prototype,"m_wheelDirectionWS",{get:M.prototype.sB,set:M.prototype.ZD}); M.prototype.get_m_wheelAxleWS=M.prototype.rB=function(){return k(Sq(this.hy),p)};M.prototype.set_m_wheelAxleWS=M.prototype.YD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Tq(c,a)};Object.defineProperty(M.prototype,"m_wheelAxleWS",{get:M.prototype.rB,set:M.prototype.YD});M.prototype.get_m_isInContact=M.prototype.tA=function(){return!!Uq(this.hy)};M.prototype.set_m_isInContact=M.prototype.$C=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vq(c,a)}; Object.defineProperty(M.prototype,"m_isInContact",{get:M.prototype.tA,set:M.prototype.$C});M.prototype.get_m_groundObject=M.prototype.gA=function(){return Wq(this.hy)};M.prototype.set_m_groundObject=M.prototype.NC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xq(c,a)};Object.defineProperty(M.prototype,"m_groundObject",{get:M.prototype.gA,set:M.prototype.NC});M.prototype.__destroy__=function(){Yq(this.hy)}; function SB(a,c,d){IA();a&&"object"===typeof a&&(a=a.hy);"object"==typeof c&&(c=MA(c));d&&"object"===typeof d&&(d=d.hy);this.hy=Zq(a,c,d);h(SB)[this.hy]=this}SB.prototype=Object.create(m.prototype);SB.prototype.constructor=SB;SB.prototype.iy=SB;SB.jy={};b.btMultiSphereShape=SB;SB.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);$q(c,a)};SB.prototype.getLocalScaling=function(){return k(ar(this.hy),p)}; SB.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);br(d,a,c)};SB.prototype.__destroy__=function(){cr(this.hy)};function R(a,c,d,e){IA();a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);"object"==typeof e&&(e=MA(e));this.hy=dr(a,c,d,e);h(R)[this.hy]=this}R.prototype=Object.create(q.prototype);R.prototype.constructor=R;R.prototype.iy=R;R.jy={};b.btSoftBody=R; R.prototype.checkLink=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return!!er(d,a,c)};R.prototype.checkFace=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);return!!fr(e,a,c,d)};R.prototype.appendMaterial=function(){return k(gr(this.hy),A)};R.prototype.appendNode=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);hr(d,a,c)}; R.prototype.appendLink=function(a,c,d,e){var g=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);ir(g,a,c,d,e)};R.prototype.appendFace=function(a,c,d,e){var g=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);jr(g,a,c,d,e)}; R.prototype.appendTetra=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);kr(n,a,c,d,e,g)};R.prototype.appendAnchor=function(a,c,d,e){var g=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);lr(g,a,c,d,e)}; R.prototype.addForce=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);void 0===c?mr(d,a):nr(d,a,c)};R.prototype.addAeroForceToNode=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);or(d,a,c)};R.prototype.getTotalMass=function(){return pr(this.hy)};R.prototype.setTotalMass=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);qr(d,a,c)}; R.prototype.setMass=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);rr(d,a,c)};R.prototype.transform=R.prototype.transform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);sr(c,a)};R.prototype.translate=R.prototype.translate=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);tr(c,a)};R.prototype.rotate=R.prototype.rotate=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ur(c,a)}; R.prototype.scale=R.prototype.scale=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);vr(c,a)};R.prototype.generateClusters=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return void 0===c?wr(d,a):xr(d,a,c)};R.prototype.generateBendingConstraints=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return yr(d,a,c)}; R.prototype.upcast=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(zr(c,a),R)};R.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Ar(d,a,c)};R.prototype.getCollisionShape=function(){return k(Br(this.hy),m)};R.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Cr(c,a)}; R.prototype.setActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Dr(c,a)};R.prototype.forceActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Er(c,a)};R.prototype.activate=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);void 0===a?Fr(c):Gr(c,a)};R.prototype.isActive=function(){return!!Hr(this.hy)};R.prototype.isKinematicObject=function(){return!!Ir(this.hy)};R.prototype.isStaticObject=function(){return!!Jr(this.hy)}; R.prototype.isStaticOrKinematicObject=function(){return!!Kr(this.hy)};R.prototype.getRestitution=function(){return Lr(this.hy)};R.prototype.getFriction=function(){return Mr(this.hy)};R.prototype.getRollingFriction=function(){return Nr(this.hy)};R.prototype.setRestitution=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Or(c,a)};R.prototype.setFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pr(c,a)}; R.prototype.setRollingFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qr(c,a)};R.prototype.getWorldTransform=function(){return k(Rr(this.hy),r)};R.prototype.getCollisionFlags=function(){return Sr(this.hy)};R.prototype.setCollisionFlags=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Tr(c,a)};R.prototype.setWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ur(c,a)}; R.prototype.setCollisionShape=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vr(c,a)};R.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wr(c,a)};R.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Xr(c,a)};R.prototype.getUserIndex=function(){return Yr(this.hy)};R.prototype.setUserIndex=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Zr(c,a)}; R.prototype.getUserPointer=function(){return k($r(this.hy),SA)};R.prototype.setUserPointer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);as(c,a)};R.prototype.getBroadphaseHandle=function(){return k(bs(this.hy),t)};R.prototype.get_m_cfg=R.prototype.Kz=function(){return k(cs(this.hy),S)};R.prototype.set_m_cfg=R.prototype.qC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ds(c,a)};Object.defineProperty(R.prototype,"m_cfg",{get:R.prototype.Kz,set:R.prototype.qC}); R.prototype.get_m_nodes=R.prototype.GA=function(){return k(es(this.hy),TB)};R.prototype.set_m_nodes=R.prototype.mD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);gs(c,a)};Object.defineProperty(R.prototype,"m_nodes",{get:R.prototype.GA,set:R.prototype.mD});R.prototype.get_m_faces=R.prototype.Gy=function(){return k(hs(this.hy),UB)};R.prototype.set_m_faces=R.prototype.Py=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);is(c,a)}; Object.defineProperty(R.prototype,"m_faces",{get:R.prototype.Gy,set:R.prototype.Py});R.prototype.get_m_materials=R.prototype.DA=function(){return k(js(this.hy),qB)};R.prototype.set_m_materials=R.prototype.jD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ks(c,a)};Object.defineProperty(R.prototype,"m_materials",{get:R.prototype.DA,set:R.prototype.jD});R.prototype.get_m_anchors=R.prototype.Az=function(){return k(ls(this.hy),RB)}; R.prototype.set_m_anchors=R.prototype.gC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ms(c,a)};Object.defineProperty(R.prototype,"m_anchors",{get:R.prototype.Az,set:R.prototype.gC});R.prototype.__destroy__=function(){ns(this.hy)};function VB(){throw"cannot construct a btIntArray, no constructor in IDL";}VB.prototype=Object.create(f.prototype);VB.prototype.constructor=VB;VB.prototype.iy=VB;VB.jy={};b.btIntArray=VB;VB.prototype.size=VB.prototype.size=function(){return ps(this.hy)}; VB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return qs(c,a)};VB.prototype.__destroy__=function(){rs(this.hy)};function S(){throw"cannot construct a Config, no constructor in IDL";}S.prototype=Object.create(f.prototype);S.prototype.constructor=S;S.prototype.iy=S;S.jy={};b.Config=S;S.prototype.get_kVCF=S.prototype.sz=function(){return ss(this.hy)};S.prototype.set_kVCF=S.prototype.$B=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ts(c,a)}; Object.defineProperty(S.prototype,"kVCF",{get:S.prototype.sz,set:S.prototype.$B});S.prototype.get_kDP=S.prototype.fz=function(){return us(this.hy)};S.prototype.set_kDP=S.prototype.NB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);vs(c,a)};Object.defineProperty(S.prototype,"kDP",{get:S.prototype.fz,set:S.prototype.NB});S.prototype.get_kDG=S.prototype.ez=function(){return xs(this.hy)};S.prototype.set_kDG=S.prototype.MB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ys(c,a)}; Object.defineProperty(S.prototype,"kDG",{get:S.prototype.ez,set:S.prototype.MB});S.prototype.get_kLF=S.prototype.hz=function(){return zs(this.hy)};S.prototype.set_kLF=S.prototype.PB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);As(c,a)};Object.defineProperty(S.prototype,"kLF",{get:S.prototype.hz,set:S.prototype.PB});S.prototype.get_kPR=S.prototype.jz=function(){return Bs(this.hy)};S.prototype.set_kPR=S.prototype.RB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Cs(c,a)}; Object.defineProperty(S.prototype,"kPR",{get:S.prototype.jz,set:S.prototype.RB});S.prototype.get_kVC=S.prototype.rz=function(){return Ds(this.hy)};S.prototype.set_kVC=S.prototype.ZB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Es(c,a)};Object.defineProperty(S.prototype,"kVC",{get:S.prototype.rz,set:S.prototype.ZB});S.prototype.get_kDF=S.prototype.dz=function(){return Fs(this.hy)};S.prototype.set_kDF=S.prototype.LB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Gs(c,a)}; Object.defineProperty(S.prototype,"kDF",{get:S.prototype.dz,set:S.prototype.LB});S.prototype.get_kMT=S.prototype.iz=function(){return Hs(this.hy)};S.prototype.set_kMT=S.prototype.QB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Is(c,a)};Object.defineProperty(S.prototype,"kMT",{get:S.prototype.iz,set:S.prototype.QB});S.prototype.get_kCHR=S.prototype.cz=function(){return Js(this.hy)};S.prototype.set_kCHR=S.prototype.KB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ks(c,a)}; Object.defineProperty(S.prototype,"kCHR",{get:S.prototype.cz,set:S.prototype.KB});S.prototype.get_kKHR=S.prototype.gz=function(){return Ls(this.hy)};S.prototype.set_kKHR=S.prototype.OB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ms(c,a)};Object.defineProperty(S.prototype,"kKHR",{get:S.prototype.gz,set:S.prototype.OB});S.prototype.get_kSHR=S.prototype.kz=function(){return Ns(this.hy)}; S.prototype.set_kSHR=S.prototype.SB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Os(c,a)};Object.defineProperty(S.prototype,"kSHR",{get:S.prototype.kz,set:S.prototype.SB});S.prototype.get_kAHR=S.prototype.bz=function(){return Ps(this.hy)};S.prototype.set_kAHR=S.prototype.JB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qs(c,a)};Object.defineProperty(S.prototype,"kAHR",{get:S.prototype.bz,set:S.prototype.JB});S.prototype.get_kSRHR_CL=S.prototype.nz=function(){return Rs(this.hy)}; S.prototype.set_kSRHR_CL=S.prototype.VB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ss(c,a)};Object.defineProperty(S.prototype,"kSRHR_CL",{get:S.prototype.nz,set:S.prototype.VB});S.prototype.get_kSKHR_CL=S.prototype.lz=function(){return Ts(this.hy)};S.prototype.set_kSKHR_CL=S.prototype.TB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Us(c,a)};Object.defineProperty(S.prototype,"kSKHR_CL",{get:S.prototype.lz,set:S.prototype.TB});S.prototype.get_kSSHR_CL=S.prototype.pz=function(){return Vs(this.hy)}; S.prototype.set_kSSHR_CL=S.prototype.XB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ws(c,a)};Object.defineProperty(S.prototype,"kSSHR_CL",{get:S.prototype.pz,set:S.prototype.XB});S.prototype.get_kSR_SPLT_CL=S.prototype.oz=function(){return Xs(this.hy)};S.prototype.set_kSR_SPLT_CL=S.prototype.WB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ys(c,a)};Object.defineProperty(S.prototype,"kSR_SPLT_CL",{get:S.prototype.oz,set:S.prototype.WB}); S.prototype.get_kSK_SPLT_CL=S.prototype.mz=function(){return Zs(this.hy)};S.prototype.set_kSK_SPLT_CL=S.prototype.UB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);$s(c,a)};Object.defineProperty(S.prototype,"kSK_SPLT_CL",{get:S.prototype.mz,set:S.prototype.UB});S.prototype.get_kSS_SPLT_CL=S.prototype.qz=function(){return at(this.hy)};S.prototype.set_kSS_SPLT_CL=S.prototype.YB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);bt(c,a)}; Object.defineProperty(S.prototype,"kSS_SPLT_CL",{get:S.prototype.qz,set:S.prototype.YB});S.prototype.get_maxvolume=S.prototype.yB=function(){return ct(this.hy)};S.prototype.set_maxvolume=S.prototype.eE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);dt(c,a)};Object.defineProperty(S.prototype,"maxvolume",{get:S.prototype.yB,set:S.prototype.eE});S.prototype.get_timescale=S.prototype.AB=function(){return et(this.hy)}; S.prototype.set_timescale=S.prototype.gE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ft(c,a)};Object.defineProperty(S.prototype,"timescale",{get:S.prototype.AB,set:S.prototype.gE});S.prototype.get_viterations=S.prototype.BB=function(){return gt(this.hy)};S.prototype.set_viterations=S.prototype.hE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ht(c,a)};Object.defineProperty(S.prototype,"viterations",{get:S.prototype.BB,set:S.prototype.hE}); S.prototype.get_piterations=S.prototype.zB=function(){return it(this.hy)};S.prototype.set_piterations=S.prototype.fE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);jt(c,a)};Object.defineProperty(S.prototype,"piterations",{get:S.prototype.zB,set:S.prototype.fE});S.prototype.get_diterations=S.prototype.az=function(){return kt(this.hy)};S.prototype.set_diterations=S.prototype.IB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);lt(c,a)}; Object.defineProperty(S.prototype,"diterations",{get:S.prototype.az,set:S.prototype.IB});S.prototype.get_citerations=S.prototype.Zy=function(){return mt(this.hy)};S.prototype.set_citerations=S.prototype.GB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);nt(c,a)};Object.defineProperty(S.prototype,"citerations",{get:S.prototype.Zy,set:S.prototype.GB});S.prototype.get_collisions=S.prototype.$y=function(){return ot(this.hy)}; S.prototype.set_collisions=S.prototype.HB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);pt(c,a)};Object.defineProperty(S.prototype,"collisions",{get:S.prototype.$y,set:S.prototype.HB});S.prototype.__destroy__=function(){qt(this.hy)};function Node(){throw"cannot construct a Node, no constructor in IDL";}Node.prototype=Object.create(f.prototype);Node.prototype.constructor=Node;Node.prototype.iy=Node;Node.jy={};b.Node=Node; Node.prototype.get_m_x=Node.prototype.xB=function(){return k(rt(this.hy),p)};Node.prototype.set_m_x=Node.prototype.dE=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);st(c,a)};Object.defineProperty(Node.prototype,"m_x",{get:Node.prototype.xB,set:Node.prototype.dE});Node.prototype.get_m_q=Node.prototype.OA=function(){return k(tt(this.hy),p)};Node.prototype.set_m_q=Node.prototype.uD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ut(c,a)}; Object.defineProperty(Node.prototype,"m_q",{get:Node.prototype.OA,set:Node.prototype.uD});Node.prototype.get_m_v=Node.prototype.pB=function(){return k(vt(this.hy),p)};Node.prototype.set_m_v=Node.prototype.WD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);wt(c,a)};Object.defineProperty(Node.prototype,"m_v",{get:Node.prototype.pB,set:Node.prototype.WD});Node.prototype.get_m_f=Node.prototype.bA=function(){return k(xt(this.hy),p)}; Node.prototype.set_m_f=Node.prototype.IC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yt(c,a)};Object.defineProperty(Node.prototype,"m_f",{get:Node.prototype.bA,set:Node.prototype.IC});Node.prototype.get_m_n=Node.prototype.Hy=function(){return k(zt(this.hy),p)};Node.prototype.set_m_n=Node.prototype.Qy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);At(c,a)};Object.defineProperty(Node.prototype,"m_n",{get:Node.prototype.Hy,set:Node.prototype.Qy}); Node.prototype.get_m_im=Node.prototype.pA=function(){return Bt(this.hy)};Node.prototype.set_m_im=Node.prototype.WC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ct(c,a)};Object.defineProperty(Node.prototype,"m_im",{get:Node.prototype.pA,set:Node.prototype.WC});Node.prototype.get_m_area=Node.prototype.Dz=function(){return Dt(this.hy)};Node.prototype.set_m_area=Node.prototype.jC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Et(c,a)}; Object.defineProperty(Node.prototype,"m_area",{get:Node.prototype.Dz,set:Node.prototype.jC});Node.prototype.__destroy__=function(){Ft(this.hy)};function WB(){this.hy=Gt();h(WB)[this.hy]=this}WB.prototype=Object.create(f.prototype);WB.prototype.constructor=WB;WB.prototype.iy=WB;WB.jy={};b.btGhostPairCallback=WB;WB.prototype.__destroy__=function(){Ht(this.hy)};function XB(){throw"cannot construct a btOverlappingPairCallback, no constructor in IDL";}XB.prototype=Object.create(f.prototype); XB.prototype.constructor=XB;XB.prototype.iy=XB;XB.jy={};b.btOverlappingPairCallback=XB;XB.prototype.__destroy__=function(){It(this.hy)};function T(a,c,d,e){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);this.hy=void 0===e?Jt(a,c,d):Kt(a,c,d,e);h(T)[this.hy]=this}T.prototype=Object.create(ZA.prototype);T.prototype.constructor=T;T.prototype.iy=T;T.jy={};b.btKinematicCharacterController=T; T.prototype.setUpAxis=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Lt(c,a)};T.prototype.setWalkDirection=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Mt(c,a)};T.prototype.setVelocityForTimeInterval=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Nt(d,a,c)};T.prototype.warp=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ot(c,a)};T.prototype.preStep=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pt(c,a)}; T.prototype.playerStep=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Qt(d,a,c)};T.prototype.setFallSpeed=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Rt(c,a)};T.prototype.setJumpSpeed=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);St(c,a)};T.prototype.setMaxJumpHeight=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Tt(c,a)};T.prototype.canJump=function(){return!!Ut(this.hy)};T.prototype.jump=function(){Vt(this.hy)}; T.prototype.setGravity=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wt(c,a)};T.prototype.getGravity=function(){return Xt(this.hy)};T.prototype.setMaxSlope=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Yt(c,a)};T.prototype.getMaxSlope=function(){return Zt(this.hy)};T.prototype.getGhostObject=function(){return k($t(this.hy),U)};T.prototype.setUseGhostSweepTest=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);au(c,a)};T.prototype.onGround=function(){return!!bu(this.hy)}; T.prototype.setUpInterpolate=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);cu(c,a)};T.prototype.updateAction=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);du(d,a,c)};T.prototype.__destroy__=function(){eu(this.hy)};function YB(){throw"cannot construct a btSoftBodyArray, no constructor in IDL";}YB.prototype=Object.create(f.prototype);YB.prototype.constructor=YB;YB.prototype.iy=YB;YB.jy={};b.btSoftBodyArray=YB; YB.prototype.size=YB.prototype.size=function(){return fu(this.hy)};YB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(gu(c,a),R)};YB.prototype.__destroy__=function(){hu(this.hy)};function PB(){throw"cannot construct a btFaceArray, no constructor in IDL";}PB.prototype=Object.create(f.prototype);PB.prototype.constructor=PB;PB.prototype.iy=PB;PB.jy={};b.btFaceArray=PB;PB.prototype.size=PB.prototype.size=function(){return iu(this.hy)}; PB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(ju(c,a),ZB)};PB.prototype.__destroy__=function(){ku(this.hy)};function $B(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=lu(a,c);h($B)[this.hy]=this}$B.prototype=Object.create(UA.prototype);$B.prototype.constructor=$B;$B.prototype.iy=$B;$B.jy={};b.btStaticPlaneShape=$B;$B.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);mu(c,a)}; $B.prototype.getLocalScaling=function(){return k(nu(this.hy),p)};$B.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);ou(d,a,c)};$B.prototype.__destroy__=function(){pu(this.hy)};function PA(){throw"cannot construct a btOverlappingPairCache, no constructor in IDL";}PA.prototype=Object.create(f.prototype);PA.prototype.constructor=PA;PA.prototype.iy=PA;PA.jy={};b.btOverlappingPairCache=PA; PA.prototype.setInternalGhostPairCallback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);qu(c,a)};PA.prototype.getNumOverlappingPairs=function(){return ru(this.hy)};PA.prototype.__destroy__=function(){su(this.hy)};function vB(){throw"cannot construct a btIndexedMesh, no constructor in IDL";}vB.prototype=Object.create(f.prototype);vB.prototype.constructor=vB;vB.prototype.iy=vB;vB.jy={};b.btIndexedMesh=vB;vB.prototype.get_m_numTriangles=vB.prototype.KA=function(){return tu(this.hy)}; vB.prototype.set_m_numTriangles=vB.prototype.qD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);uu(c,a)};Object.defineProperty(vB.prototype,"m_numTriangles",{get:vB.prototype.KA,set:vB.prototype.qD});vB.prototype.__destroy__=function(){vu(this.hy)};function V(a,c,d,e,g){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);this.hy=wu(a,c,d,e,g);h(V)[this.hy]=this}V.prototype=Object.create(x.prototype); V.prototype.constructor=V;V.prototype.iy=V;V.jy={};b.btSoftRigidDynamicsWorld=V;V.prototype.addSoftBody=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);xu(e,a,c,d)};V.prototype.removeSoftBody=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yu(c,a)};V.prototype.removeCollisionObject=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);zu(c,a)};V.prototype.getWorldInfo=function(){return k(Au(this.hy),J)}; V.prototype.getSoftBodyArray=function(){return k(Bu(this.hy),YB)};V.prototype.getDispatcher=function(){return k(Cu(this.hy),OA)};V.prototype.rayTest=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Du(e,a,c,d)};V.prototype.getPairCache=function(){return k(Eu(this.hy),PA)};V.prototype.getDispatchInfo=function(){return k(Fu(this.hy),l)}; V.prototype.addCollisionObject=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?Gu(e,a):void 0===d?Hu(e,a,c):Iu(e,a,c,d)};V.prototype.getBroadphase=function(){return k(Ju(this.hy),QA)}; V.prototype.convexSweepTest=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);Ku(n,a,c,d,e,g)};V.prototype.contactPairTest=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Lu(e,a,c,d)}; V.prototype.contactTest=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Mu(d,a,c)};V.prototype.updateSingleAabb=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Nu(c,a)};V.prototype.setDebugDrawer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ou(c,a)};V.prototype.getDebugDrawer=function(){return k(Pu(this.hy),RA)};V.prototype.debugDrawWorld=function(){Qu(this.hy)}; V.prototype.debugDrawObject=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Ru(e,a,c,d)};V.prototype.setGravity=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Su(c,a)};V.prototype.getGravity=function(){return k(Tu(this.hy),p)}; V.prototype.addRigidBody=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?Uu(e,a):void 0===d?_emscripten_bind_btSoftRigidDynamicsWorld_addRigidBody_2(e,a,c):Vu(e,a,c,d)};V.prototype.removeRigidBody=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wu(c,a)}; V.prototype.addConstraint=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);void 0===c?Xu(d,a):Yu(d,a,c)};V.prototype.removeConstraint=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Zu(c,a)};V.prototype.stepSimulation=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);return void 0===c?$u(e,a):void 0===d?av(e,a,c):bv(e,a,c,d)}; V.prototype.setContactAddedCallback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);cv(c,a)};V.prototype.setContactProcessedCallback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);dv(c,a)};V.prototype.setContactDestroyedCallback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ev(c,a)};V.prototype.addAction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);fv(c,a)};V.prototype.removeAction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);gv(c,a)}; V.prototype.getSolverInfo=function(){return k(hv(this.hy),v)};V.prototype.setInternalTickCallback=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);void 0===c?iv(e,a):void 0===d?jv(e,a,c):kv(e,a,c,d)};V.prototype.__destroy__=function(){lv(this.hy)}; function aC(a,c,d,e){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);this.hy=mv(a,c,d,e);h(aC)[this.hy]=this}aC.prototype=Object.create(TA.prototype);aC.prototype.constructor=aC;aC.prototype.iy=aC;aC.jy={};b.btFixedConstraint=aC;aC.prototype.enableFeedback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);nv(c,a)};aC.prototype.getBreakingImpulseThreshold=function(){return ov(this.hy)}; aC.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);pv(c,a)};aC.prototype.getParam=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return qv(d,a,c)};aC.prototype.setParam=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);rv(e,a,c,d)};aC.prototype.__destroy__=function(){sv(this.hy)}; function r(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=void 0===a?tv():void 0===c?_emscripten_bind_btTransform_btTransform_1(a):uv(a,c);h(r)[this.hy]=this}r.prototype=Object.create(f.prototype);r.prototype.constructor=r;r.prototype.iy=r;r.jy={};b.btTransform=r;r.prototype.setIdentity=function(){vv(this.hy)};r.prototype.setOrigin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);wv(c,a)}; r.prototype.setRotation=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);xv(c,a)};r.prototype.getOrigin=function(){return k(yv(this.hy),p)};r.prototype.getRotation=function(){return k(zv(this.hy),W)};r.prototype.getBasis=function(){return k(Av(this.hy),jB)};r.prototype.setFromOpenGLMatrix=function(a){var c=this.hy;IA();"object"==typeof a&&(a=MA(a));Bv(c,a)};r.prototype.inverse=r.prototype.inverse=function(){return k(Cv(this.hy),r)}; r.prototype.op_mul=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Dv(c,a),r)};r.prototype.__destroy__=function(){Ev(this.hy)};function X(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=Fv(a,c);h(X)[this.hy]=this}X.prototype=Object.create(z.prototype);X.prototype.constructor=X;X.prototype.iy=X;X.jy={};b.ClosestRayResultCallback=X;X.prototype.hasHit=function(){return!!Gv(this.hy)}; X.prototype.get_m_rayFromWorld=X.prototype.Iy=function(){return k(Hv(this.hy),p)};X.prototype.set_m_rayFromWorld=X.prototype.Ry=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Iv(c,a)};Object.defineProperty(X.prototype,"m_rayFromWorld",{get:X.prototype.Iy,set:X.prototype.Ry});X.prototype.get_m_rayToWorld=X.prototype.Jy=function(){return k(Jv(this.hy),p)};X.prototype.set_m_rayToWorld=X.prototype.Sy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Kv(c,a)}; Object.defineProperty(X.prototype,"m_rayToWorld",{get:X.prototype.Jy,set:X.prototype.Sy});X.prototype.get_m_hitNormalWorld=X.prototype.sy=function(){return k(Lv(this.hy),p)};X.prototype.set_m_hitNormalWorld=X.prototype.zy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Mv(c,a)};Object.defineProperty(X.prototype,"m_hitNormalWorld",{get:X.prototype.sy,set:X.prototype.zy});X.prototype.get_m_hitPointWorld=X.prototype.ty=function(){return k(Nv(this.hy),p)}; X.prototype.set_m_hitPointWorld=X.prototype.Ay=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ov(c,a)};Object.defineProperty(X.prototype,"m_hitPointWorld",{get:X.prototype.ty,set:X.prototype.Ay});X.prototype.get_m_collisionFilterGroup=X.prototype.ky=function(){return Pv(this.hy)};X.prototype.set_m_collisionFilterGroup=X.prototype.my=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Qv(c,a)};Object.defineProperty(X.prototype,"m_collisionFilterGroup",{get:X.prototype.ky,set:X.prototype.my}); X.prototype.get_m_collisionFilterMask=X.prototype.ly=function(){return Rv(this.hy)};X.prototype.set_m_collisionFilterMask=X.prototype.ny=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Sv(c,a)};Object.defineProperty(X.prototype,"m_collisionFilterMask",{get:X.prototype.ly,set:X.prototype.ny});X.prototype.get_m_closestHitFraction=X.prototype.oy=function(){return Tv(this.hy)}; X.prototype.set_m_closestHitFraction=X.prototype.py=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Uv(c,a)};Object.defineProperty(X.prototype,"m_closestHitFraction",{get:X.prototype.oy,set:X.prototype.py});X.prototype.get_m_collisionObject=X.prototype.qy=function(){return k(Vv(this.hy),q)};X.prototype.set_m_collisionObject=X.prototype.xy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Wv(c,a)};Object.defineProperty(X.prototype,"m_collisionObject",{get:X.prototype.qy,set:X.prototype.xy}); X.prototype.__destroy__=function(){Xv(this.hy)};function bC(a){a&&"object"===typeof a&&(a=a.hy);this.hy=void 0===a?Yv():Zv(a);h(bC)[this.hy]=this}bC.prototype=Object.create(WA.prototype);bC.prototype.constructor=bC;bC.prototype.iy=bC;bC.jy={};b.btSoftBodyRigidBodyCollisionConfiguration=bC;bC.prototype.__destroy__=function(){$v(this.hy)};function cC(){this.hy=aw();h(cC)[this.hy]=this}cC.prototype=Object.create(hB.prototype);cC.prototype.constructor=cC;cC.prototype.iy=cC;cC.jy={}; b.ConcreteContactResultCallback=cC;cC.prototype.addSingleResult=function(a,c,d,e,g,n,F){var aa=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);n&&"object"===typeof n&&(n=n.hy);F&&"object"===typeof F&&(F=F.hy);return bw(aa,a,c,d,e,g,n,F)};cC.prototype.__destroy__=function(){cw(this.hy)}; function dC(a,c,d){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);this.hy=void 0===d?dw(a,c):ew(a,c,d);h(dC)[this.hy]=this}dC.prototype=Object.create(XA.prototype);dC.prototype.constructor=dC;dC.prototype.iy=dC;dC.jy={};b.btBvhTriangleMeshShape=dC;dC.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);fw(c,a)};dC.prototype.getLocalScaling=function(){return k(gw(this.hy),p)}; dC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);hw(d,a,c)};dC.prototype.__destroy__=function(){iw(this.hy)};function oB(){throw"cannot construct a btConstCollisionObjectArray, no constructor in IDL";}oB.prototype=Object.create(f.prototype);oB.prototype.constructor=oB;oB.prototype.iy=oB;oB.jy={};b.btConstCollisionObjectArray=oB;oB.prototype.size=oB.prototype.size=function(){return jw(this.hy)}; oB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(kw(c,a),q)};oB.prototype.__destroy__=function(){lw(this.hy)};function eC(a,c,d,e,g){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);this.hy=void 0===e?mw(a,c,d):void 0===g?_emscripten_bind_btSliderConstraint_btSliderConstraint_4(a,c,d,e):nw(a,c,d,e,g);h(eC)[this.hy]=this}eC.prototype=Object.create(TA.prototype); eC.prototype.constructor=eC;eC.prototype.iy=eC;eC.jy={};b.btSliderConstraint=eC;eC.prototype.setLowerLinLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ow(c,a)};eC.prototype.setUpperLinLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);pw(c,a)};eC.prototype.setLowerAngLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);qw(c,a)};eC.prototype.setUpperAngLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);rw(c,a)}; eC.prototype.enableFeedback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);sw(c,a)};eC.prototype.getBreakingImpulseThreshold=function(){return tw(this.hy)};eC.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);uw(c,a)};eC.prototype.getParam=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return vw(d,a,c)}; eC.prototype.setParam=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);ww(e,a,c,d)};eC.prototype.__destroy__=function(){xw(this.hy)};function U(){this.hy=yw();h(U)[this.hy]=this}U.prototype=Object.create(w.prototype);U.prototype.constructor=U;U.prototype.iy=U;U.jy={};b.btPairCachingGhostObject=U; U.prototype.setAnisotropicFriction=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);zw(d,a,c)};U.prototype.getCollisionShape=function(){return k(Aw(this.hy),m)};U.prototype.setContactProcessingThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Bw(c,a)};U.prototype.setActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Cw(c,a)}; U.prototype.forceActivationState=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Dw(c,a)};U.prototype.activate=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);void 0===a?Ew(c):Fw(c,a)};U.prototype.isActive=function(){return!!Gw(this.hy)};U.prototype.isKinematicObject=function(){return!!Hw(this.hy)};U.prototype.isStaticObject=function(){return!!Iw(this.hy)};U.prototype.isStaticOrKinematicObject=function(){return!!Jw(this.hy)};U.prototype.getRestitution=function(){return Kw(this.hy)}; U.prototype.getFriction=function(){return Lw(this.hy)};U.prototype.getRollingFriction=function(){return Mw(this.hy)};U.prototype.setRestitution=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Nw(c,a)};U.prototype.setFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ow(c,a)};U.prototype.setRollingFriction=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pw(c,a)};U.prototype.getWorldTransform=function(){return k(Qw(this.hy),r)};U.prototype.getCollisionFlags=function(){return Rw(this.hy)}; U.prototype.setCollisionFlags=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Sw(c,a)};U.prototype.setWorldTransform=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Tw(c,a)};U.prototype.setCollisionShape=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Uw(c,a)};U.prototype.setCcdMotionThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Vw(c,a)};U.prototype.setCcdSweptSphereRadius=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ww(c,a)}; U.prototype.getUserIndex=function(){return Xw(this.hy)};U.prototype.setUserIndex=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Yw(c,a)};U.prototype.getUserPointer=function(){return k(Zw(this.hy),SA)};U.prototype.setUserPointer=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);$w(c,a)};U.prototype.getBroadphaseHandle=function(){return k(ax(this.hy),t)};U.prototype.getNumOverlappingObjects=function(){return bx(this.hy)}; U.prototype.getOverlappingObject=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(cx(c,a),q)};U.prototype.__destroy__=function(){dx(this.hy)};function D(){throw"cannot construct a btManifoldPoint, no constructor in IDL";}D.prototype=Object.create(f.prototype);D.prototype.constructor=D;D.prototype.iy=D;D.jy={};b.btManifoldPoint=D;D.prototype.getPositionWorldOnA=function(){return k(ex(this.hy),p)};D.prototype.getPositionWorldOnB=function(){return k(fx(this.hy),p)}; D.prototype.getAppliedImpulse=function(){return gx(this.hy)};D.prototype.getDistance=function(){return hx(this.hy)};D.prototype.get_m_localPointA=D.prototype.AA=function(){return k(ix(this.hy),p)};D.prototype.set_m_localPointA=D.prototype.gD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);jx(c,a)};Object.defineProperty(D.prototype,"m_localPointA",{get:D.prototype.AA,set:D.prototype.gD});D.prototype.get_m_localPointB=D.prototype.BA=function(){return k(kx(this.hy),p)}; D.prototype.set_m_localPointB=D.prototype.hD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);lx(c,a)};Object.defineProperty(D.prototype,"m_localPointB",{get:D.prototype.BA,set:D.prototype.hD});D.prototype.get_m_positionWorldOnB=D.prototype.NA=function(){return k(mx(this.hy),p)};D.prototype.set_m_positionWorldOnB=D.prototype.tD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);nx(c,a)};Object.defineProperty(D.prototype,"m_positionWorldOnB",{get:D.prototype.NA,set:D.prototype.tD}); D.prototype.get_m_positionWorldOnA=D.prototype.MA=function(){return k(ox(this.hy),p)};D.prototype.set_m_positionWorldOnA=D.prototype.sD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);px(c,a)};Object.defineProperty(D.prototype,"m_positionWorldOnA",{get:D.prototype.MA,set:D.prototype.sD});D.prototype.get_m_normalWorldOnB=D.prototype.IA=function(){return k(qx(this.hy),p)};D.prototype.set_m_normalWorldOnB=D.prototype.oD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);rx(c,a)}; Object.defineProperty(D.prototype,"m_normalWorldOnB",{get:D.prototype.IA,set:D.prototype.oD});D.prototype.get_m_userPersistentData=D.prototype.oB=function(){return sx(this.hy)};D.prototype.set_m_userPersistentData=D.prototype.VD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);tx(c,a)};Object.defineProperty(D.prototype,"m_userPersistentData",{get:D.prototype.oB,set:D.prototype.VD});D.prototype.__destroy__=function(){ux(this.hy)}; function fC(a,c,d,e){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);this.hy=void 0===d?vx(a,c):void 0===e?_emscripten_bind_btPoint2PointConstraint_btPoint2PointConstraint_3(a,c,d):wx(a,c,d,e);h(fC)[this.hy]=this}fC.prototype=Object.create(TA.prototype);fC.prototype.constructor=fC;fC.prototype.iy=fC;fC.jy={};b.btPoint2PointConstraint=fC; fC.prototype.setPivotA=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);xx(c,a)};fC.prototype.setPivotB=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yx(c,a)};fC.prototype.getPivotInA=function(){return k(zx(this.hy),p)};fC.prototype.getPivotInB=function(){return k(Ax(this.hy),p)};fC.prototype.enableFeedback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Bx(c,a)};fC.prototype.getBreakingImpulseThreshold=function(){return Cx(this.hy)}; fC.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Dx(c,a)};fC.prototype.getParam=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return Ex(d,a,c)};fC.prototype.setParam=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Fx(e,a,c,d)};fC.prototype.get_m_setting=fC.prototype.VA=function(){return k(Gx(this.hy),H)}; fC.prototype.set_m_setting=fC.prototype.BD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Hx(c,a)};Object.defineProperty(fC.prototype,"m_setting",{get:fC.prototype.VA,set:fC.prototype.BD});fC.prototype.__destroy__=function(){Ix(this.hy)};function gC(){this.hy=Jx();h(gC)[this.hy]=this}gC.prototype=Object.create(f.prototype);gC.prototype.constructor=gC;gC.prototype.iy=gC;gC.jy={};b.btSoftBodyHelpers=gC; gC.prototype.CreateRope=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);return k(Kx(n,a,c,d,e,g),R)}; gC.prototype.CreatePatch=function(a,c,d,e,g,n,F,aa,ta){var Rb=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);n&&"object"===typeof n&&(n=n.hy);F&&"object"===typeof F&&(F=F.hy);aa&&"object"===typeof aa&&(aa=aa.hy);ta&&"object"===typeof ta&&(ta=ta.hy);return k(Lx(Rb,a,c,d,e,g,n,F,aa,ta),R)}; gC.prototype.CreatePatchUV=function(a,c,d,e,g,n,F,aa,ta,Rb){var nC=this.hy;IA();a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);n&&"object"===typeof n&&(n=n.hy);F&&"object"===typeof F&&(F=F.hy);aa&&"object"===typeof aa&&(aa=aa.hy);ta&&"object"===typeof ta&&(ta=ta.hy);"object"==typeof Rb&&(Rb=MA(Rb));return k(Mx(nC,a,c,d,e,g,n,F,aa,ta,Rb),R)}; gC.prototype.CreateEllipsoid=function(a,c,d,e){var g=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);return k(Nx(g,a,c,d,e),R)}; gC.prototype.CreateFromTriMesh=function(a,c,d,e,g){var n=this.hy;IA();a&&"object"===typeof a&&(a=a.hy);"object"==typeof c&&(c=MA(c));if("object"==typeof d&&"object"===typeof d){var F=JA(d,Aa);KA(d,Aa,F);d=F}e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);return k(Ox(n,a,c,d,e,g),R)}; gC.prototype.CreateFromConvexHull=function(a,c,d,e){var g=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);return k(Px(g,a,c,d,e),R)};gC.prototype.__destroy__=function(){Qx(this.hy)};function t(){throw"cannot construct a btBroadphaseProxy, no constructor in IDL";}t.prototype=Object.create(f.prototype);t.prototype.constructor=t;t.prototype.iy=t;t.jy={};b.btBroadphaseProxy=t; t.prototype.get_m_collisionFilterGroup=t.prototype.ky=function(){return Rx(this.hy)};t.prototype.set_m_collisionFilterGroup=t.prototype.my=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Sx(c,a)};Object.defineProperty(t.prototype,"m_collisionFilterGroup",{get:t.prototype.ky,set:t.prototype.my});t.prototype.get_m_collisionFilterMask=t.prototype.ly=function(){return Tx(this.hy)}; t.prototype.set_m_collisionFilterMask=t.prototype.ny=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ux(c,a)};Object.defineProperty(t.prototype,"m_collisionFilterMask",{get:t.prototype.ly,set:t.prototype.ny});t.prototype.__destroy__=function(){Vx(this.hy)};function TB(){throw"cannot construct a tNodeArray, no constructor in IDL";}TB.prototype=Object.create(f.prototype);TB.prototype.constructor=TB;TB.prototype.iy=TB;TB.jy={};b.tNodeArray=TB;TB.prototype.size=TB.prototype.size=function(){return Wx(this.hy)}; TB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Xx(c,a),Node)};TB.prototype.__destroy__=function(){Yx(this.hy)};function hC(a){a&&"object"===typeof a&&(a=a.hy);this.hy=Zx(a);h(hC)[this.hy]=this}hC.prototype=Object.create(m.prototype);hC.prototype.constructor=hC;hC.prototype.iy=hC;hC.jy={};b.btBoxShape=hC;hC.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);$x(c,a)};hC.prototype.getMargin=function(){return ay(this.hy)}; hC.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);by(c,a)};hC.prototype.getLocalScaling=function(){return k(cy(this.hy),p)};hC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);dy(d,a,c)};hC.prototype.__destroy__=function(){ey(this.hy)};function ZB(){throw"cannot construct a btFace, no constructor in IDL";}ZB.prototype=Object.create(f.prototype);ZB.prototype.constructor=ZB; ZB.prototype.iy=ZB;ZB.jy={};b.btFace=ZB;ZB.prototype.get_m_indices=ZB.prototype.rA=function(){return k(fy(this.hy),VB)};ZB.prototype.set_m_indices=ZB.prototype.YC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);gy(c,a)};Object.defineProperty(ZB.prototype,"m_indices",{get:ZB.prototype.rA,set:ZB.prototype.YC});ZB.prototype.get_m_plane=ZB.prototype.LA=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return hy(c,a)}; ZB.prototype.set_m_plane=ZB.prototype.rD=function(a,c){var d=this.hy;IA();a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);iy(d,a,c)};Object.defineProperty(ZB.prototype,"m_plane",{get:ZB.prototype.LA,set:ZB.prototype.rD});ZB.prototype.__destroy__=function(){jy(this.hy)};function iC(){this.hy=ky();h(iC)[this.hy]=this}iC.prototype=Object.create(RA.prototype);iC.prototype.constructor=iC;iC.prototype.iy=iC;iC.jy={};b.DebugDrawer=iC; iC.prototype.drawLine=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);ly(e,a,c,d)};iC.prototype.drawContactPoint=function(a,c,d,e,g){var n=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);my(n,a,c,d,e,g)}; iC.prototype.reportErrorWarning=function(a){var c=this.hy;IA();a=a&&"object"===typeof a?a.hy:LA(a);ny(c,a)};iC.prototype.draw3dText=function(a,c){var d=this.hy;IA();a&&"object"===typeof a&&(a=a.hy);c=c&&"object"===typeof c?c.hy:LA(c);oy(d,a,c)};iC.prototype.setDebugMode=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);py(c,a)};iC.prototype.getDebugMode=function(){return qy(this.hy)};iC.prototype.__destroy__=function(){ry(this.hy)}; function jC(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=sy(a,c);h(jC)[this.hy]=this}jC.prototype=Object.create(VA.prototype);jC.prototype.constructor=jC;jC.prototype.iy=jC;jC.jy={};b.btCapsuleShapeX=jC;jC.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);ty(c,a)};jC.prototype.getMargin=function(){return uy(this.hy)};jC.prototype.getUpAxis=function(){return vy(this.hy)};jC.prototype.getRadius=function(){return wy(this.hy)}; jC.prototype.getHalfHeight=function(){return xy(this.hy)};jC.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);yy(c,a)};jC.prototype.getLocalScaling=function(){return k(zy(this.hy),p)};jC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Ay(d,a,c)};jC.prototype.__destroy__=function(){By(this.hy)}; function W(a,c,d,e){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);this.hy=Cy(a,c,d,e);h(W)[this.hy]=this}W.prototype=Object.create(aB.prototype);W.prototype.constructor=W;W.prototype.iy=W;W.jy={};b.btQuaternion=W;W.prototype.setValue=function(a,c,d,e){var g=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);Dy(g,a,c,d,e)}; W.prototype.setEulerZYX=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Ey(e,a,c,d)};W.prototype.setRotation=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Fy(d,a,c)};W.prototype.normalize=W.prototype.normalize=function(){Gy(this.hy)};W.prototype.length2=function(){return Hy(this.hy)};W.prototype.length=W.prototype.length=function(){return Iy(this.hy)}; W.prototype.dot=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return Jy(c,a)};W.prototype.normalized=function(){return k(Ky(this.hy),W)};W.prototype.getAxis=function(){return k(Ly(this.hy),p)};W.prototype.inverse=W.prototype.inverse=function(){return k(My(this.hy),W)};W.prototype.getAngle=function(){return Ny(this.hy)};W.prototype.getAngleShortestPath=function(){return Oy(this.hy)}; W.prototype.angle=W.prototype.angle=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return Py(c,a)};W.prototype.angleShortestPath=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return Qy(c,a)};W.prototype.op_add=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Ry(c,a),W)};W.prototype.op_sub=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Sy(c,a),W)}; W.prototype.op_mul=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Ty(c,a),W)};W.prototype.op_mulq=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Uy(c,a),W)};W.prototype.op_div=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Vy(c,a),W)};W.prototype.x=W.prototype.x=function(){return Wy(this.hy)};W.prototype.y=W.prototype.y=function(){return Xy(this.hy)};W.prototype.z=W.prototype.z=function(){return Yy(this.hy)};W.prototype.w=function(){return Zy(this.hy)}; W.prototype.setX=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);$y(c,a)};W.prototype.setY=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);az(c,a)};W.prototype.setZ=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);bz(c,a)};W.prototype.setW=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);cz(c,a)};W.prototype.__destroy__=function(){dz(this.hy)}; function kC(a,c){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);this.hy=ez(a,c);h(kC)[this.hy]=this}kC.prototype=Object.create(VA.prototype);kC.prototype.constructor=kC;kC.prototype.iy=kC;kC.jy={};b.btCapsuleShapeZ=kC;kC.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);fz(c,a)};kC.prototype.getMargin=function(){return gz(this.hy)};kC.prototype.getUpAxis=function(){return hz(this.hy)};kC.prototype.getRadius=function(){return iz(this.hy)}; kC.prototype.getHalfHeight=function(){return jz(this.hy)};kC.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);kz(c,a)};kC.prototype.getLocalScaling=function(){return k(lz(this.hy),p)};kC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);mz(d,a,c)};kC.prototype.__destroy__=function(){nz(this.hy)};function v(){throw"cannot construct a btContactSolverInfo, no constructor in IDL";} v.prototype=Object.create(f.prototype);v.prototype.constructor=v;v.prototype.iy=v;v.jy={};b.btContactSolverInfo=v;v.prototype.get_m_splitImpulse=v.prototype.YA=function(){return!!oz(this.hy)};v.prototype.set_m_splitImpulse=v.prototype.ED=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);pz(c,a)};Object.defineProperty(v.prototype,"m_splitImpulse",{get:v.prototype.YA,set:v.prototype.ED});v.prototype.get_m_splitImpulsePenetrationThreshold=v.prototype.ZA=function(){return qz(this.hy)}; v.prototype.set_m_splitImpulsePenetrationThreshold=v.prototype.FD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);rz(c,a)};Object.defineProperty(v.prototype,"m_splitImpulsePenetrationThreshold",{get:v.prototype.ZA,set:v.prototype.FD});v.prototype.get_m_numIterations=v.prototype.JA=function(){return sz(this.hy)};v.prototype.set_m_numIterations=v.prototype.pD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);tz(c,a)}; Object.defineProperty(v.prototype,"m_numIterations",{get:v.prototype.JA,set:v.prototype.pD});v.prototype.__destroy__=function(){uz(this.hy)};function lC(a,c,d,e,g){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);this.hy=void 0===e?vz(a,c,d):void 0===g?_emscripten_bind_btGeneric6DofSpringConstraint_btGeneric6DofSpringConstraint_4(a,c,d,e):wz(a,c,d,e,g);h(lC)[this.hy]=this} lC.prototype=Object.create(eB.prototype);lC.prototype.constructor=lC;lC.prototype.iy=lC;lC.jy={};b.btGeneric6DofSpringConstraint=lC;lC.prototype.enableSpring=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);xz(d,a,c)};lC.prototype.setStiffness=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);yz(d,a,c)}; lC.prototype.setDamping=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);zz(d,a,c)};lC.prototype.setEquilibriumPoint=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);void 0===a?Az(d):void 0===c?Bz(d,a):Cz(d,a,c)};lC.prototype.setLinearLowerLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Dz(c,a)}; lC.prototype.setLinearUpperLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Ez(c,a)};lC.prototype.setAngularLowerLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Fz(c,a)};lC.prototype.setAngularUpperLimit=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Gz(c,a)};lC.prototype.getFrameOffsetA=function(){return k(Hz(this.hy),r)};lC.prototype.enableFeedback=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Iz(c,a)}; lC.prototype.getBreakingImpulseThreshold=function(){return Jz(this.hy)};lC.prototype.setBreakingImpulseThreshold=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Kz(c,a)};lC.prototype.getParam=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);return Lz(d,a,c)};lC.prototype.setParam=function(a,c,d){var e=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);Mz(e,a,c,d)}; lC.prototype.__destroy__=function(){Nz(this.hy)};function mC(a){a&&"object"===typeof a&&(a=a.hy);this.hy=Oz(a);h(mC)[this.hy]=this}mC.prototype=Object.create(m.prototype);mC.prototype.constructor=mC;mC.prototype.iy=mC;mC.jy={};b.btSphereShape=mC;mC.prototype.setMargin=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Pz(c,a)};mC.prototype.getMargin=function(){return Qz(this.hy)};mC.prototype.setLocalScaling=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Rz(c,a)}; mC.prototype.getLocalScaling=function(){return k(Sz(this.hy),p)};mC.prototype.calculateLocalInertia=function(a,c){var d=this.hy;a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Tz(d,a,c)};mC.prototype.__destroy__=function(){Uz(this.hy)};function Y(){throw"cannot construct a Face, no constructor in IDL";}Y.prototype=Object.create(f.prototype);Y.prototype.constructor=Y;Y.prototype.iy=Y;Y.jy={};b.Face=Y; Y.prototype.get_m_n=Y.prototype.Hy=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(Vz(c,a),Node)};Y.prototype.set_m_n=Y.prototype.Qy=function(a,c){var d=this.hy;IA();a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);Wz(d,a,c)};Object.defineProperty(Y.prototype,"m_n",{get:Y.prototype.Hy,set:Y.prototype.Qy});Y.prototype.get_m_normal=Y.prototype.HA=function(){return k(Xz(this.hy),p)}; Y.prototype.set_m_normal=Y.prototype.nD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);Yz(c,a)};Object.defineProperty(Y.prototype,"m_normal",{get:Y.prototype.HA,set:Y.prototype.nD});Y.prototype.get_m_ra=Y.prototype.PA=function(){return Zz(this.hy)};Y.prototype.set_m_ra=Y.prototype.vD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);$z(c,a)};Object.defineProperty(Y.prototype,"m_ra",{get:Y.prototype.PA,set:Y.prototype.vD});Y.prototype.__destroy__=function(){aA(this.hy)}; function UB(){throw"cannot construct a tFaceArray, no constructor in IDL";}UB.prototype=Object.create(f.prototype);UB.prototype.constructor=UB;UB.prototype.iy=UB;UB.jy={};b.tFaceArray=UB;UB.prototype.size=UB.prototype.size=function(){return bA(this.hy)};UB.prototype.at=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);return k(cA(c,a),Y)};UB.prototype.__destroy__=function(){dA(this.hy)}; function Z(a,c,d,e,g){a&&"object"===typeof a&&(a=a.hy);c&&"object"===typeof c&&(c=c.hy);d&&"object"===typeof d&&(d=d.hy);e&&"object"===typeof e&&(e=e.hy);g&&"object"===typeof g&&(g=g.hy);this.hy=eA(a,c,d,e,g);h(Z)[this.hy]=this}Z.prototype=Object.create(f.prototype);Z.prototype.constructor=Z;Z.prototype.iy=Z;Z.jy={};b.LocalConvexResult=Z;Z.prototype.get_m_hitCollisionObject=Z.prototype.iA=function(){return k(fA(this.hy),q)}; Z.prototype.set_m_hitCollisionObject=Z.prototype.PC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);gA(c,a)};Object.defineProperty(Z.prototype,"m_hitCollisionObject",{get:Z.prototype.iA,set:Z.prototype.PC});Z.prototype.get_m_localShapeInfo=Z.prototype.CA=function(){return k(hA(this.hy),tB)};Z.prototype.set_m_localShapeInfo=Z.prototype.iD=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);iA(c,a)};Object.defineProperty(Z.prototype,"m_localShapeInfo",{get:Z.prototype.CA,set:Z.prototype.iD}); Z.prototype.get_m_hitNormalLocal=Z.prototype.mA=function(){return k(jA(this.hy),p)};Z.prototype.set_m_hitNormalLocal=Z.prototype.TC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);kA(c,a)};Object.defineProperty(Z.prototype,"m_hitNormalLocal",{get:Z.prototype.mA,set:Z.prototype.TC});Z.prototype.get_m_hitPointLocal=Z.prototype.oA=function(){return k(lA(this.hy),p)};Z.prototype.set_m_hitPointLocal=Z.prototype.VC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);mA(c,a)}; Object.defineProperty(Z.prototype,"m_hitPointLocal",{get:Z.prototype.oA,set:Z.prototype.VC});Z.prototype.get_m_hitFraction=Z.prototype.jA=function(){return nA(this.hy)};Z.prototype.set_m_hitFraction=Z.prototype.QC=function(a){var c=this.hy;a&&"object"===typeof a&&(a=a.hy);oA(c,a)};Object.defineProperty(Z.prototype,"m_hitFraction",{get:Z.prototype.jA,set:Z.prototype.QC});Z.prototype.__destroy__=function(){pA(this.hy)}; (function(){function a(){b.BT_CONSTRAINT_ERP=qA();b.BT_CONSTRAINT_STOP_ERP=rA();b.BT_CONSTRAINT_CFM=sA();b.BT_CONSTRAINT_STOP_CFM=tA();b.PHY_FLOAT=uA();b.PHY_DOUBLE=vA();b.PHY_INTEGER=wA();b.PHY_SHORT=xA();b.PHY_FIXEDPOINT88=yA();b.PHY_UCHAR=zA()}Ka?a():Ia.unshift(a)})();this.Ammo=b; return Ammo.ready } ); })(); if (typeof exports === 'object' && typeof module === 'object') module.exports = Ammo; else if (typeof define === 'function' && define['amd']) define([], function() { return Ammo; }); else if (typeof exports === 'object') exports["Ammo"] = Ammo; ================================================ FILE: examples/libs/basis/README.md ================================================ # Basis Universal GPU Texture Compression Basis Universal is a "[supercompressed](http://gamma.cs.unc.edu/GST/gst.pdf)" GPU texture and texture video compression system that outputs a highly compressed intermediate file format (.basis) that can be quickly transcoded to a wide variety of GPU texture compression formats. [GitHub](https://github.com/BinomialLLC/basis_universal) ## Transcoders Basis Universal texture data may be used in two different file formats: `.basis` and `.ktx2`, where `ktx2` is a standardized wrapper around basis texture data. For further documentation about the Basis compressor and transcoder, refer to the [Basis GitHub repository](https://github.com/BinomialLLC/basis_universal). The folder contains two files required for transcoding `.basis` or `.ktx2` textures: * `basis_transcoder.js` — JavaScript wrapper for the WebAssembly transcoder. * `basis_transcoder.wasm` — WebAssembly transcoder. Both are dependencies of `KTX2Loader`: ```js const ktx2Loader = new KTX2Loader(); ktx2Loader.setTranscoderPath( 'examples/jsm/libs/basis/' ); ktx2Loader.detectSupport( renderer ); ktx2Loader.load( 'diffuse.ktx2', function ( texture ) { const material = new THREE.MeshStandardMaterial( { map: texture } ); }, function () { console.log( 'onProgress' ); }, function ( e ) { console.error( e ); } ); ``` ## License [Apache License 2.0](https://github.com/BinomialLLC/basis_universal/blob/master/LICENSE) ================================================ FILE: examples/libs/basis/basis_transcoder.js ================================================ var BASIS = (() => { var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; if (typeof __filename != 'undefined') _scriptName ||= __filename; return ( function(moduleArg = {}) { var moduleRtn; var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);var ret=fs.readFileSync(filename);return ret};readAsync=(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return new Promise((resolve,reject)=>{fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)reject(err);else resolve(binary?data.buffer:data)})})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>{if(isFileURI(url)){return new Promise((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response)}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}return fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){var f="basis_transcoder.wasm";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["L"];updateMemoryViews();wasmTable=wasmExports["P"];addOnInit(wasmExports["M"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}get_exception_ptr(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var __abort_js=()=>{abort("")};var structRegistrations={};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function readPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var InternalError;var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}};var __embind_finalize_value_object=structType=>{var reg=structRegistrations[structType];delete structRegistrations[structType];var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var fieldRecords=reg.fields;var fieldTypes=fieldRecords.map(field=>field.getterReturnType).concat(fieldRecords.map(field=>field.setterArgumentType));whenDependentTypesAreResolved([structType],fieldTypes,fieldTypes=>{var fields={};fieldRecords.forEach((field,i)=>{var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:ptr=>getterReturnType["fromWireType"](getter(getterContext,ptr)),write:(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,fromWireType:ptr=>{var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},toWireType:(destructors,o)=>{for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError(`Missing field: "${fieldName}"`)}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction:rawDestructor}]})};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{};var embind_init_charCodes=()=>{var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes};var embind_charCodes;var readLatin1String=ptr=>{var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret};var BindingError;var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type "${name}" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}return sharedRegisterType(rawType,registeredInstance,options)}var GenericWireTypeSize=8;var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:function(wt){return!!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},argPackAdvance:GenericWireTypeSize,readValueFromPointer:function(pointer){return this["fromWireType"](HEAPU8[pointer])},destructorFunction:null})};var shallowCopyInternalPointer=o=>({count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType});var throwInstanceAlreadyDeleted=obj=>{function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")};var finalizationRegistry=false;var detachFinalizer=handle=>{};var runDestructor=$$=>{if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}};var releaseClassHandle=$$=>{$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}};var downcastPointer=(ptr,ptrClass,desiredClass)=>{if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)};var registeredPointers={};var getInheritedInstanceCount=()=>Object.keys(registeredInstances).length;var getLiveInheritedInstances=()=>{var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv};var deletionQueue=[];var flushPendingDeletes=()=>{while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}};var delayFunction;var setDelayFunction=fn=>{delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}};var init_embind=()=>{Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction};var registeredInstances={};var getBasestPointer=(class_,ptr)=>{if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr};var getInheritedInstance=(class_,ptr)=>{ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]};var makeClassHandle=(prototype,record)=>{if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record,writable:true}}))};function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}var attachFinalizer=handle=>{if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)};var init_ClassHandle=()=>{Object.assign(ClassHandle.prototype,{isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;other.$$=other.$$;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right},clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}},delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}},isDeleted(){return!this.$$.ptr},deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}})};function ClassHandle(){}var createNamedFunction=(name,body)=>Object.defineProperty(body,"name",{value:name});var ensureOverloadTable=(proto,methodName,humanName)=>{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}};var char_0=48;var char_9=57;var makeLegalFunctionName=name=>{if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return`_${name}`}return name};function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}var upcastPointer=(ptr,ptrClass,desiredClass)=>{while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr};function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle||!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(()=>clonedHandle["delete"]()));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}var init_RegisteredPointer=()=>{Object.assign(RegisteredPointer.prototype,{getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr},destructor(ptr){this.rawDestructor?.(ptr)},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,fromWireType:RegisteredPointer_fromWireType})};function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistent public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var dynCallLegacy=(sig,ptr,args)=>{sig=sig.replace(/p/g,"i");var f=Module["dynCall_"+sig];return f(ptr,...args)};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var dynCall=(sig,ptr,args=[])=>{if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr)(...args);return rtn};var getDynCaller=(sig,ptr)=>(...args)=>dynCall(sig,ptr,args);var embind__requireFunction=(signature,rawFunction)=>{signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};var extendError=(baseErrorType,errorName)=>{var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return`${this.name}: ${this.message}`}};return errorClass};var UnboundTypeError;var getTypeName=type=>{var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([", "]))};var __embind_register_class=(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor)=>{name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);upcast&&=embind__requireFunction(upcastSignature,upcast);downcast&&=embind__requireFunction(downcastSignature,downcast);rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError(`Cannot construct ${name} due to unbound types`,[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],base=>{base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(name,function(...args){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[args.length];if(undefined===body){throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${args.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`)}return body.apply(this,args)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);if(registeredClass.baseClass){registeredClass.baseClass.__derivedClasses??=[];registeredClass.baseClass.__derivedClasses.push(registeredClass)}var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i>2])}return array};function usesDestructorStack(argTypes){for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns||isAsync?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`constructor ${classType.name}`;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError(`Cannot register multiple constructors with identical number of parameters (${argCount-1}) for class '${classType.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`)}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`,rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf("(");if(argsIndex!==-1){return signature.substr(0,argsIndex)}else{return signature}};var __embind_register_class_function=(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual,isAsync)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);methodName=getFunctionName(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`${classType.name}.${methodName}`;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`,rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context,isAsync);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})};var __embind_register_constant=(name,type,value)=>{name=readLatin1String(name);whenDependentTypesAreResolved([],[type],type=>{type=type[0];Module[name]=type["fromWireType"](value);return[]})};var emval_freelist=[];var emval_handles=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){emval_handles[handle]=undefined;emval_freelist.push(handle)}};var count_emval_handles=()=>emval_handles.length/2-5-emval_freelist.length;var init_emval=()=>{emval_handles.push(0,1,undefined,1,null,1,true,1,false,1);Module["count_emval_handles"]=count_emval_handles};var Emval={toValue:handle=>{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:"emscripten::val",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var enumReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?function(pointer){return this["fromWireType"](HEAP8[pointer])}:function(pointer){return this["fromWireType"](HEAPU8[pointer])};case 2:return signed?function(pointer){return this["fromWireType"](HEAP16[pointer>>1])}:function(pointer){return this["fromWireType"](HEAPU16[pointer>>1])};case 4:return signed?function(pointer){return this["fromWireType"](HEAP32[pointer>>2])}:function(pointer){return this["fromWireType"](HEAPU32[pointer>>2])};default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_enum=(rawType,name,size,isSigned)=>{name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,fromWireType:function(c){return this.constructor.values[c]},toWireType:(destructors,c)=>c.value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:enumReadValueFromPointer(name,size,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)};var requireRegisteredType=(rawType,humanName)=>{var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(`${humanName} has unknown type ${getTypeName(rawType)}`)}return impl};var __embind_register_enum_value=(rawEnumType,name,enumValue)=>{var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(`${enumType.name}_${name}`,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value};var embindRepr=v=>{if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}};var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 8:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:value=>value,toWireType:(destructors,value)=>value,argPackAdvance:GenericWireTypeSize,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null})};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,fromWireType:fromWireType,toWireType:toWireType,argPackAdvance:GenericWireTypeSize,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,fromWireType:decodeMemoryView,argPackAdvance:GenericWireTypeSize,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true})};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var __embind_register_std_string=(rawType,name)=>{name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;i{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=readLatin1String(name);var decodeString,encodeString,readCharAt,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;readCharAt=pointer=>HEAPU16[pointer>>1]}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;readCharAt=pointer=>HEAPU32[pointer>>2]}registerType(rawType,{name:name,fromWireType:value=>{var length=HEAPU32[value>>2];var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||readCharAt(currentBytePtr)==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value=="string")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},argPackAdvance:GenericWireTypeSize,readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_value_object=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor)=>{structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}};var __embind_register_value_object_field=(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})};var __embind_register_void=(rawType,name)=>{name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,argPackAdvance:0,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined})};var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var emval_returnValue=(returnType,destructorsRef,handle)=>{var destructors=[];var result=returnType["toWireType"](destructors,handle);if(destructors.length){HEAPU32[destructorsRef>>2]=Emval.toHandle(destructors)}return result};var __emval_as=(handle,returnType,destructorsRef)=>{handle=Emval.toValue(handle);returnType=requireRegisteredType(returnType,"emval::as");return emval_returnValue(returnType,destructorsRef,handle)};var emval_methodCallers=[];var __emval_call=(caller,handle,destructorsRef,args)=>{caller=emval_methodCallers[caller];handle=Emval.toValue(handle);return caller(null,handle,destructorsRef,args)};var emval_symbols={};var getStringOrSymbol=address=>{var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}return symbol};var __emval_call_method=(caller,objHandle,methodName,destructorsRef,args)=>{caller=emval_methodCallers[caller];objHandle=Emval.toValue(objHandle);methodName=getStringOrSymbol(methodName);return caller(objHandle,objHandle[methodName],destructorsRef,args)};var emval_get_global=()=>{if(typeof globalThis=="object"){return globalThis}return function(){return Function}()("return this")()};var __emval_get_global=name=>{if(name===0){return Emval.toHandle(emval_get_global())}else{name=getStringOrSymbol(name);return Emval.toHandle(emval_get_global()[name])}};var emval_addMethodCaller=caller=>{var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id};var emval_lookupTypes=(argCount,argTypes)=>{var a=new Array(argCount);for(var i=0;i>2],"parameter "+i)}return a};var reflectConstruct=Reflect.construct;var __emval_get_method_caller=(argCount,argTypes,kind)=>{var types=emval_lookupTypes(argCount,argTypes);var retType=types.shift();argCount--;var functionBody=`return function (obj, func, destructorsRef, args) {\n`;var offset=0;var argsList=[];if(kind===0){argsList.push("obj")}var params=["retType"];var args=[retType];for(var i=0;it.name).join(", ")}) => ${retType.name}>`;return emval_addMethodCaller(createNamedFunction(functionName,invokerFunction))};var __emval_get_module_property=name=>{name=getStringOrSymbol(name);return Emval.toHandle(Module[name])};var __emval_get_property=(handle,key)=>{handle=Emval.toValue(handle);key=Emval.toValue(key);return Emval.toHandle(handle[key])};var __emval_incref=handle=>{if(handle>9){emval_handles[handle+1]+=1}};var __emval_new_cstring=v=>Emval.toHandle(getStringOrSymbol(v));var __emval_run_destructors=handle=>{var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle)};var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var _fd_close=fd=>52;var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};InternalError=Module["InternalError"]=class InternalError extends Error{constructor(message){super(message);this.name="InternalError"}};embind_init_charCodes();BindingError=Module["BindingError"]=class BindingError extends Error{constructor(message){super(message);this.name="BindingError"}};init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var wasmImports={K:___cxa_throw,G:__abort_js,s:__embind_finalize_value_object,C:__embind_register_bigint,I:__embind_register_bool,w:__embind_register_class,v:__embind_register_class_constructor,d:__embind_register_class_function,m:__embind_register_constant,H:__embind_register_emval,o:__embind_register_enum,a:__embind_register_enum_value,A:__embind_register_float,i:__embind_register_function,l:__embind_register_integer,f:__embind_register_memory_view,z:__embind_register_std_string,u:__embind_register_std_wstring,t:__embind_register_value_object,c:__embind_register_value_object_field,J:__embind_register_void,F:__emscripten_memcpy_js,n:__emval_as,q:__emval_call,p:__emval_call_method,b:__emval_decref,x:__emval_get_global,j:__emval_get_method_caller,r:__emval_get_module_property,g:__emval_get_property,k:__emval_incref,h:__emval_new_cstring,e:__emval_run_destructors,D:_emscripten_resize_heap,E:_fd_close,B:_fd_seek,y:_fd_write};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["M"])();var ___getTypeName=a0=>(___getTypeName=wasmExports["N"])(a0);var _malloc=a0=>(_malloc=wasmExports["O"])(a0);var _free=a0=>(_free=wasmExports["Q"])(a0);var ___cxa_is_pointer_type=a0=>(___cxa_is_pointer_type=wasmExports["R"])(a0);var dynCall_jiji=Module["dynCall_jiji"]=(a0,a1,a2,a3,a4)=>(dynCall_jiji=Module["dynCall_jiji"]=wasmExports["S"])(a0,a1,a2,a3,a4);var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; return moduleRtn; } ); })(); if (typeof exports === 'object' && typeof module === 'object') module.exports = BASIS; else if (typeof define === 'function' && define['amd']) define([], () => BASIS); ================================================ FILE: examples/libs/cannon.js ================================================ /* * Copyright (c) 2015 cannon.js Authors * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&false)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.CANNON=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o (http://steffe.se)", "keywords": [ "cannon.js", "cannon", "physics", "engine", "3d" ], "main": "./build/cannon.js", "engines": { "node": "*" }, "repository": { "type": "git", "url": "https://github.com/schteppe/cannon.js.git" }, "bugs": { "url": "https://github.com/schteppe/cannon.js/issues" }, "licenses": [ { "type": "MIT" } ], "devDependencies": { "jshint": "latest", "uglify-js": "latest", "nodeunit": "^0.9.0", "grunt": "~0.4.0", "grunt-contrib-jshint": "~0.1.1", "grunt-contrib-nodeunit": "^0.4.1", "grunt-contrib-concat": "~0.1.3", "grunt-contrib-uglify": "^0.5.1", "grunt-browserify": "^2.1.4", "grunt-contrib-yuidoc": "^0.5.2", "browserify": "*" }, "dependencies": {} } },{}],2:[function(_dereq_,module,exports){ // Export classes module.exports = { version : _dereq_('../package.json').version, AABB : _dereq_('./collision/AABB'), ArrayCollisionMatrix : _dereq_('./collision/ArrayCollisionMatrix'), Body : _dereq_('./objects/Body'), Box : _dereq_('./shapes/Box'), Broadphase : _dereq_('./collision/Broadphase'), Constraint : _dereq_('./constraints/Constraint'), ContactEquation : _dereq_('./equations/ContactEquation'), Narrowphase : _dereq_('./world/Narrowphase'), ConeTwistConstraint : _dereq_('./constraints/ConeTwistConstraint'), ContactMaterial : _dereq_('./material/ContactMaterial'), ConvexPolyhedron : _dereq_('./shapes/ConvexPolyhedron'), Cylinder : _dereq_('./shapes/Cylinder'), DistanceConstraint : _dereq_('./constraints/DistanceConstraint'), Equation : _dereq_('./equations/Equation'), EventTarget : _dereq_('./utils/EventTarget'), FrictionEquation : _dereq_('./equations/FrictionEquation'), GSSolver : _dereq_('./solver/GSSolver'), GridBroadphase : _dereq_('./collision/GridBroadphase'), Heightfield : _dereq_('./shapes/Heightfield'), HingeConstraint : _dereq_('./constraints/HingeConstraint'), LockConstraint : _dereq_('./constraints/LockConstraint'), Mat3 : _dereq_('./math/Mat3'), Material : _dereq_('./material/Material'), NaiveBroadphase : _dereq_('./collision/NaiveBroadphase'), ObjectCollisionMatrix : _dereq_('./collision/ObjectCollisionMatrix'), Pool : _dereq_('./utils/Pool'), Particle : _dereq_('./shapes/Particle'), Plane : _dereq_('./shapes/Plane'), PointToPointConstraint : _dereq_('./constraints/PointToPointConstraint'), Quaternion : _dereq_('./math/Quaternion'), Ray : _dereq_('./collision/Ray'), RaycastVehicle : _dereq_('./objects/RaycastVehicle'), RaycastResult : _dereq_('./collision/RaycastResult'), RigidVehicle : _dereq_('./objects/RigidVehicle'), RotationalEquation : _dereq_('./equations/RotationalEquation'), RotationalMotorEquation : _dereq_('./equations/RotationalMotorEquation'), SAPBroadphase : _dereq_('./collision/SAPBroadphase'), SPHSystem : _dereq_('./objects/SPHSystem'), Shape : _dereq_('./shapes/Shape'), Solver : _dereq_('./solver/Solver'), Sphere : _dereq_('./shapes/Sphere'), SplitSolver : _dereq_('./solver/SplitSolver'), Spring : _dereq_('./objects/Spring'), Trimesh : _dereq_('./shapes/Trimesh'), Vec3 : _dereq_('./math/Vec3'), Vec3Pool : _dereq_('./utils/Vec3Pool'), World : _dereq_('./world/World'), }; },{"../package.json":1,"./collision/AABB":3,"./collision/ArrayCollisionMatrix":4,"./collision/Broadphase":5,"./collision/GridBroadphase":6,"./collision/NaiveBroadphase":7,"./collision/ObjectCollisionMatrix":8,"./collision/Ray":9,"./collision/RaycastResult":10,"./collision/SAPBroadphase":11,"./constraints/ConeTwistConstraint":12,"./constraints/Constraint":13,"./constraints/DistanceConstraint":14,"./constraints/HingeConstraint":15,"./constraints/LockConstraint":16,"./constraints/PointToPointConstraint":17,"./equations/ContactEquation":19,"./equations/Equation":20,"./equations/FrictionEquation":21,"./equations/RotationalEquation":22,"./equations/RotationalMotorEquation":23,"./material/ContactMaterial":24,"./material/Material":25,"./math/Mat3":27,"./math/Quaternion":28,"./math/Vec3":30,"./objects/Body":31,"./objects/RaycastVehicle":32,"./objects/RigidVehicle":33,"./objects/SPHSystem":34,"./objects/Spring":35,"./shapes/Box":37,"./shapes/ConvexPolyhedron":38,"./shapes/Cylinder":39,"./shapes/Heightfield":40,"./shapes/Particle":41,"./shapes/Plane":42,"./shapes/Shape":43,"./shapes/Sphere":44,"./shapes/Trimesh":45,"./solver/GSSolver":46,"./solver/Solver":47,"./solver/SplitSolver":48,"./utils/EventTarget":49,"./utils/Pool":51,"./utils/Vec3Pool":54,"./world/Narrowphase":55,"./world/World":56}],3:[function(_dereq_,module,exports){ var Vec3 = _dereq_('../math/Vec3'); var Utils = _dereq_('../utils/Utils'); module.exports = AABB; /** * Axis aligned bounding box class. * @class AABB * @constructor * @param {Object} [options] * @param {Vec3} [options.upperBound] * @param {Vec3} [options.lowerBound] */ function AABB(options){ options = options || {}; /** * The lower bound of the bounding box. * @property lowerBound * @type {Vec3} */ this.lowerBound = new Vec3(); if(options.lowerBound){ this.lowerBound.copy(options.lowerBound); } /** * The upper bound of the bounding box. * @property upperBound * @type {Vec3} */ this.upperBound = new Vec3(); if(options.upperBound){ this.upperBound.copy(options.upperBound); } } var tmp = new Vec3(); /** * Set the AABB bounds from a set of points. * @method setFromPoints * @param {Array} points An array of Vec3's. * @param {Vec3} position * @param {Quaternion} quaternion * @param {number} skinSize * @return {AABB} The self object */ AABB.prototype.setFromPoints = function(points, position, quaternion, skinSize){ var l = this.lowerBound, u = this.upperBound, q = quaternion; // Set to the first point l.copy(points[0]); if(q){ q.vmult(l, l); } u.copy(l); for(var i = 1; i u.x){ u.x = p.x; } if(p.x < l.x){ l.x = p.x; } if(p.y > u.y){ u.y = p.y; } if(p.y < l.y){ l.y = p.y; } if(p.z > u.z){ u.z = p.z; } if(p.z < l.z){ l.z = p.z; } } // Add offset if (position) { position.vadd(l, l); position.vadd(u, u); } if(skinSize){ l.x -= skinSize; l.y -= skinSize; l.z -= skinSize; u.x += skinSize; u.y += skinSize; u.z += skinSize; } return this; }; /** * Copy bounds from an AABB to this AABB * @method copy * @param {AABB} aabb Source to copy from * @return {AABB} The this object, for chainability */ AABB.prototype.copy = function(aabb){ this.lowerBound.copy(aabb.lowerBound); this.upperBound.copy(aabb.upperBound); return this; }; /** * Clone an AABB * @method clone */ AABB.prototype.clone = function(){ return new AABB().copy(this); }; /** * Extend this AABB so that it covers the given AABB too. * @method extend * @param {AABB} aabb */ AABB.prototype.extend = function(aabb){ // Extend lower bound var l = aabb.lowerBound.x; if(this.lowerBound.x > l){ this.lowerBound.x = l; } // Upper var u = aabb.upperBound.x; if(this.upperBound.x < u){ this.upperBound.x = u; } // Extend lower bound var l = aabb.lowerBound.y; if(this.lowerBound.y > l){ this.lowerBound.y = l; } // Upper var u = aabb.upperBound.y; if(this.upperBound.y < u){ this.upperBound.y = u; } // Extend lower bound var l = aabb.lowerBound.z; if(this.lowerBound.z > l){ this.lowerBound.z = l; } // Upper var u = aabb.upperBound.z; if(this.upperBound.z < u){ this.upperBound.z = u; } }; /** * Returns true if the given AABB overlaps this AABB. * @method overlaps * @param {AABB} aabb * @return {Boolean} */ AABB.prototype.overlaps = function(aabb){ var l1 = this.lowerBound, u1 = this.upperBound, l2 = aabb.lowerBound, u2 = aabb.upperBound; // l2 u2 // |---------| // |--------| // l1 u1 return ((l2.x <= u1.x && u1.x <= u2.x) || (l1.x <= u2.x && u2.x <= u1.x)) && ((l2.y <= u1.y && u1.y <= u2.y) || (l1.y <= u2.y && u2.y <= u1.y)) && ((l2.z <= u1.z && u1.z <= u2.z) || (l1.z <= u2.z && u2.z <= u1.z)); }; /** * Returns true if the given AABB is fully contained in this AABB. * @method contains * @param {AABB} aabb * @return {Boolean} */ AABB.prototype.contains = function(aabb){ var l1 = this.lowerBound, u1 = this.upperBound, l2 = aabb.lowerBound, u2 = aabb.upperBound; // l2 u2 // |---------| // |---------------| // l1 u1 return ( (l1.x <= l2.x && u1.x >= u2.x) && (l1.y <= l2.y && u1.y >= u2.y) && (l1.z <= l2.z && u1.z >= u2.z) ); }; /** * @method getCorners * @param {Vec3} a * @param {Vec3} b * @param {Vec3} c * @param {Vec3} d * @param {Vec3} e * @param {Vec3} f * @param {Vec3} g * @param {Vec3} h */ AABB.prototype.getCorners = function(a, b, c, d, e, f, g, h){ var l = this.lowerBound, u = this.upperBound; a.copy(l); b.set( u.x, l.y, l.z ); c.set( u.x, u.y, l.z ); d.set( l.x, u.y, u.z ); e.set( u.x, l.y, l.z ); f.set( l.x, u.y, l.z ); g.set( l.x, l.y, u.z ); h.copy(u); }; var transformIntoFrame_corners = [ new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3() ]; /** * Get the representation of an AABB in another frame. * @method toLocalFrame * @param {Transform} frame * @param {AABB} target * @return {AABB} The "target" AABB object. */ AABB.prototype.toLocalFrame = function(frame, target){ var corners = transformIntoFrame_corners; var a = corners[0]; var b = corners[1]; var c = corners[2]; var d = corners[3]; var e = corners[4]; var f = corners[5]; var g = corners[6]; var h = corners[7]; // Get corners in current frame this.getCorners(a, b, c, d, e, f, g, h); // Transform them to new local frame for(var i=0; i !== 8; i++){ var corner = corners[i]; frame.pointToLocal(corner, corner); } return target.setFromPoints(corners); }; /** * Get the representation of an AABB in the global frame. * @method toWorldFrame * @param {Transform} frame * @param {AABB} target * @return {AABB} The "target" AABB object. */ AABB.prototype.toWorldFrame = function(frame, target){ var corners = transformIntoFrame_corners; var a = corners[0]; var b = corners[1]; var c = corners[2]; var d = corners[3]; var e = corners[4]; var f = corners[5]; var g = corners[6]; var h = corners[7]; // Get corners in current frame this.getCorners(a, b, c, d, e, f, g, h); // Transform them to new local frame for(var i=0; i !== 8; i++){ var corner = corners[i]; frame.pointToWorld(corner, corner); } return target.setFromPoints(corners); }; },{"../math/Vec3":30,"../utils/Utils":53}],4:[function(_dereq_,module,exports){ module.exports = ArrayCollisionMatrix; /** * Collision "matrix". It's actually a triangular-shaped array of whether two bodies are touching this step, for reference next step * @class ArrayCollisionMatrix * @constructor */ function ArrayCollisionMatrix() { /** * The matrix storage * @property matrix * @type {Array} */ this.matrix = []; } /** * Get an element * @method get * @param {Number} i * @param {Number} j * @return {Number} */ ArrayCollisionMatrix.prototype.get = function(i, j) { i = i.index; j = j.index; if (j > i) { var temp = j; j = i; i = temp; } return this.matrix[(i*(i + 1)>>1) + j-1]; }; /** * Set an element * @method set * @param {Number} i * @param {Number} j * @param {Number} value */ ArrayCollisionMatrix.prototype.set = function(i, j, value) { i = i.index; j = j.index; if (j > i) { var temp = j; j = i; i = temp; } this.matrix[(i*(i + 1)>>1) + j-1] = value ? 1 : 0; }; /** * Sets all elements to zero * @method reset */ ArrayCollisionMatrix.prototype.reset = function() { for (var i=0, l=this.matrix.length; i!==l; i++) { this.matrix[i]=0; } }; /** * Sets the max number of objects * @method setNumObjects * @param {Number} n */ ArrayCollisionMatrix.prototype.setNumObjects = function(n) { this.matrix.length = n*(n-1)>>1; }; },{}],5:[function(_dereq_,module,exports){ var Body = _dereq_('../objects/Body'); var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var Shape = _dereq_('../shapes/Shape'); var Plane = _dereq_('../shapes/Plane'); module.exports = Broadphase; /** * Base class for broadphase implementations * @class Broadphase * @constructor * @author schteppe */ function Broadphase(){ /** * The world to search for collisions in. * @property world * @type {World} */ this.world = null; /** * If set to true, the broadphase uses bounding boxes for intersection test, else it uses bounding spheres. * @property useBoundingBoxes * @type {Boolean} */ this.useBoundingBoxes = false; /** * Set to true if the objects in the world moved. * @property {Boolean} dirty */ this.dirty = true; } /** * Get the collision pairs from the world * @method collisionPairs * @param {World} world The world to search in * @param {Array} p1 Empty array to be filled with body objects * @param {Array} p2 Empty array to be filled with body objects */ Broadphase.prototype.collisionPairs = function(world,p1,p2){ throw new Error("collisionPairs not implemented for this BroadPhase class!"); }; /** * Check if a body pair needs to be intersection tested at all. * @method needBroadphaseCollision * @param {Body} bodyA * @param {Body} bodyB * @return {bool} */ var Broadphase_needBroadphaseCollision_STATIC_OR_KINEMATIC = Body.STATIC | Body.KINEMATIC; Broadphase.prototype.needBroadphaseCollision = function(bodyA,bodyB){ // Check collision filter masks if( (bodyA.collisionFilterGroup & bodyB.collisionFilterMask)===0 || (bodyB.collisionFilterGroup & bodyA.collisionFilterMask)===0){ return false; } // Check types if(((bodyA.type & Broadphase_needBroadphaseCollision_STATIC_OR_KINEMATIC)!==0 || bodyA.sleepState === Body.SLEEPING) && ((bodyB.type & Broadphase_needBroadphaseCollision_STATIC_OR_KINEMATIC)!==0 || bodyB.sleepState === Body.SLEEPING)) { // Both bodies are static, kinematic or sleeping. Skip. return false; } return true; }; /** * Check if the bounding volumes of two bodies intersect. * @method intersectionTest * @param {Body} bodyA * @param {Body} bodyB * @param {array} pairs1 * @param {array} pairs2 */ Broadphase.prototype.intersectionTest = function(bodyA, bodyB, pairs1, pairs2){ if(this.useBoundingBoxes){ this.doBoundingBoxBroadphase(bodyA,bodyB,pairs1,pairs2); } else { this.doBoundingSphereBroadphase(bodyA,bodyB,pairs1,pairs2); } }; /** * Check if the bounding spheres of two bodies are intersecting. * @method doBoundingSphereBroadphase * @param {Body} bodyA * @param {Body} bodyB * @param {Array} pairs1 bodyA is appended to this array if intersection * @param {Array} pairs2 bodyB is appended to this array if intersection */ var Broadphase_collisionPairs_r = new Vec3(), // Temp objects Broadphase_collisionPairs_normal = new Vec3(), Broadphase_collisionPairs_quat = new Quaternion(), Broadphase_collisionPairs_relpos = new Vec3(); Broadphase.prototype.doBoundingSphereBroadphase = function(bodyA,bodyB,pairs1,pairs2){ var r = Broadphase_collisionPairs_r; bodyB.position.vsub(bodyA.position,r); var boundingRadiusSum2 = Math.pow(bodyA.boundingRadius + bodyB.boundingRadius, 2); var norm2 = r.norm2(); if(norm2 < boundingRadiusSum2){ pairs1.push(bodyA); pairs2.push(bodyB); } }; /** * Check if the bounding boxes of two bodies are intersecting. * @method doBoundingBoxBroadphase * @param {Body} bodyA * @param {Body} bodyB * @param {Array} pairs1 * @param {Array} pairs2 */ Broadphase.prototype.doBoundingBoxBroadphase = function(bodyA,bodyB,pairs1,pairs2){ if(bodyA.aabbNeedsUpdate){ bodyA.computeAABB(); } if(bodyB.aabbNeedsUpdate){ bodyB.computeAABB(); } // Check AABB / AABB if(bodyA.aabb.overlaps(bodyB.aabb)){ pairs1.push(bodyA); pairs2.push(bodyB); } }; /** * Removes duplicate pairs from the pair arrays. * @method makePairsUnique * @param {Array} pairs1 * @param {Array} pairs2 */ var Broadphase_makePairsUnique_temp = { keys:[] }, Broadphase_makePairsUnique_p1 = [], Broadphase_makePairsUnique_p2 = []; Broadphase.prototype.makePairsUnique = function(pairs1,pairs2){ var t = Broadphase_makePairsUnique_temp, p1 = Broadphase_makePairsUnique_p1, p2 = Broadphase_makePairsUnique_p2, N = pairs1.length; for(var i=0; i!==N; i++){ p1[i] = pairs1[i]; p2[i] = pairs2[i]; } pairs1.length = 0; pairs2.length = 0; for(var i=0; i!==N; i++){ var id1 = p1[i].id, id2 = p2[i].id; var key = id1 < id2 ? id1+","+id2 : id2+","+id1; t[key] = i; t.keys.push(key); } for(var i=0; i!==t.keys.length; i++){ var key = t.keys.pop(), pairIndex = t[key]; pairs1.push(p1[pairIndex]); pairs2.push(p2[pairIndex]); delete t[key]; } }; /** * To be implemented by subcasses * @method setWorld * @param {World} world */ Broadphase.prototype.setWorld = function(world){ }; /** * Check if the bounding spheres of two bodies overlap. * @method boundingSphereCheck * @param {Body} bodyA * @param {Body} bodyB * @return {boolean} */ var bsc_dist = new Vec3(); Broadphase.boundingSphereCheck = function(bodyA,bodyB){ var dist = bsc_dist; bodyA.position.vsub(bodyB.position,dist); return Math.pow(bodyA.shape.boundingSphereRadius + bodyB.shape.boundingSphereRadius,2) > dist.norm2(); }; /** * Returns all the bodies within the AABB. * @method aabbQuery * @param {World} world * @param {AABB} aabb * @param {array} result An array to store resulting bodies in. * @return {array} */ Broadphase.prototype.aabbQuery = function(world, aabb, result){ console.warn('.aabbQuery is not implemented in this Broadphase subclass.'); return []; }; },{"../math/Quaternion":28,"../math/Vec3":30,"../objects/Body":31,"../shapes/Plane":42,"../shapes/Shape":43}],6:[function(_dereq_,module,exports){ module.exports = GridBroadphase; var Broadphase = _dereq_('./Broadphase'); var Vec3 = _dereq_('../math/Vec3'); var Shape = _dereq_('../shapes/Shape'); /** * Axis aligned uniform grid broadphase. * @class GridBroadphase * @constructor * @extends Broadphase * @todo Needs support for more than just planes and spheres. * @param {Vec3} aabbMin * @param {Vec3} aabbMax * @param {Number} nx Number of boxes along x * @param {Number} ny Number of boxes along y * @param {Number} nz Number of boxes along z */ function GridBroadphase(aabbMin,aabbMax,nx,ny,nz){ Broadphase.apply(this); this.nx = nx || 10; this.ny = ny || 10; this.nz = nz || 10; this.aabbMin = aabbMin || new Vec3(100,100,100); this.aabbMax = aabbMax || new Vec3(-100,-100,-100); var nbins = this.nx * this.ny * this.nz; if (nbins <= 0) { throw "GridBroadphase: Each dimension's n must be >0"; } this.bins = []; this.binLengths = []; //Rather than continually resizing arrays (thrashing the memory), just record length and allow them to grow this.bins.length = nbins; this.binLengths.length = nbins; for (var i=0;i= nx) { xoff0 = nx - 1; } if (yoff0 < 0) { yoff0 = 0; } else if (yoff0 >= ny) { yoff0 = ny - 1; } if (zoff0 < 0) { zoff0 = 0; } else if (zoff0 >= nz) { zoff0 = nz - 1; } if (xoff1 < 0) { xoff1 = 0; } else if (xoff1 >= nx) { xoff1 = nx - 1; } if (yoff1 < 0) { yoff1 = 0; } else if (yoff1 >= ny) { yoff1 = ny - 1; } if (zoff1 < 0) { zoff1 = 0; } else if (zoff1 >= nz) { zoff1 = nz - 1; } xoff0 *= xstep; yoff0 *= ystep; zoff0 *= zstep; xoff1 *= xstep; yoff1 *= ystep; zoff1 *= zstep; for (var xoff = xoff0; xoff <= xoff1; xoff += xstep) { for (var yoff = yoff0; yoff <= yoff1; yoff += ystep) { for (var zoff = zoff0; zoff <= zoff1; zoff += zstep) { var idx = xoff+yoff+zoff; bins[idx][binLengths[idx]++] = bi; } } } } // Put all bodies into the bins for(var i=0; i!==N; i++){ var bi = bodies[i]; var si = bi.shape; switch(si.type){ case SPHERE: // Put in bin // check if overlap with other bins var x = bi.position.x, y = bi.position.y, z = bi.position.z; var r = si.radius; addBoxToBins(x-r, y-r, z-r, x+r, y+r, z+r, bi); break; case PLANE: if(si.worldNormalNeedsUpdate){ si.computeWorldNormal(bi.quaternion); } var planeNormal = si.worldNormal; //Relative position from origin of plane object to the first bin //Incremented as we iterate through the bins var xreset = xmin + binsizeX*0.5 - bi.position.x, yreset = ymin + binsizeY*0.5 - bi.position.y, zreset = zmin + binsizeZ*0.5 - bi.position.z; var d = GridBroadphase_collisionPairs_d; d.set(xreset, yreset, zreset); for (var xi = 0, xoff = 0; xi !== nx; xi++, xoff += xstep, d.y = yreset, d.x += binsizeX) { for (var yi = 0, yoff = 0; yi !== ny; yi++, yoff += ystep, d.z = zreset, d.y += binsizeY) { for (var zi = 0, zoff = 0; zi !== nz; zi++, zoff += zstep, d.z += binsizeZ) { if (d.dot(planeNormal) < binRadius) { var idx = xoff + yoff + zoff; bins[idx][binLengths[idx]++] = bi; } } } } break; default: if (bi.aabbNeedsUpdate) { bi.computeAABB(); } addBoxToBins( bi.aabb.lowerBound.x, bi.aabb.lowerBound.y, bi.aabb.lowerBound.z, bi.aabb.upperBound.x, bi.aabb.upperBound.y, bi.aabb.upperBound.z, bi); break; } } // Check each bin for(var i=0; i!==Nbins; i++){ var binLength = binLengths[i]; //Skip bins with no potential collisions if (binLength > 1) { var bin = bins[i]; // Do N^2 broadphase inside for(var xi=0; xi!==binLength; xi++){ var bi = bin[xi]; for(var yi=0; yi!==xi; yi++){ var bj = bin[yi]; if(this.needBroadphaseCollision(bi,bj)){ this.intersectionTest(bi,bj,pairs1,pairs2); } } } } } // for (var zi = 0, zoff=0; zi < nz; zi++, zoff+= zstep) { // console.log("layer "+zi); // for (var yi = 0, yoff=0; yi < ny; yi++, yoff += ystep) { // var row = ''; // for (var xi = 0, xoff=0; xi < nx; xi++, xoff += xstep) { // var idx = xoff + yoff + zoff; // row += ' ' + binLengths[idx]; // } // console.log(row); // } // } this.makePairsUnique(pairs1,pairs2); }; },{"../math/Vec3":30,"../shapes/Shape":43,"./Broadphase":5}],7:[function(_dereq_,module,exports){ module.exports = NaiveBroadphase; var Broadphase = _dereq_('./Broadphase'); var AABB = _dereq_('./AABB'); /** * Naive broadphase implementation, used in lack of better ones. * @class NaiveBroadphase * @constructor * @description The naive broadphase looks at all possible pairs without restriction, therefore it has complexity N^2 (which is bad) * @extends Broadphase */ function NaiveBroadphase(){ Broadphase.apply(this); } NaiveBroadphase.prototype = new Broadphase(); NaiveBroadphase.prototype.constructor = NaiveBroadphase; /** * Get all the collision pairs in the physics world * @method collisionPairs * @param {World} world * @param {Array} pairs1 * @param {Array} pairs2 */ NaiveBroadphase.prototype.collisionPairs = function(world,pairs1,pairs2){ var bodies = world.bodies, n = bodies.length, i,j,bi,bj; // Naive N^2 ftw! for(i=0; i!==n; i++){ for(j=0; j!==i; j++){ bi = bodies[i]; bj = bodies[j]; if(!this.needBroadphaseCollision(bi,bj)){ continue; } this.intersectionTest(bi,bj,pairs1,pairs2); } } }; var tmpAABB = new AABB(); /** * Returns all the bodies within an AABB. * @method aabbQuery * @param {World} world * @param {AABB} aabb * @param {array} result An array to store resulting bodies in. * @return {array} */ NaiveBroadphase.prototype.aabbQuery = function(world, aabb, result){ result = result || []; for(var i = 0; i < world.bodies.length; i++){ var b = world.bodies[i]; if(b.aabbNeedsUpdate){ b.computeAABB(); } // Ugly hack until Body gets aabb if(b.aabb.overlaps(aabb)){ result.push(b); } } return result; }; },{"./AABB":3,"./Broadphase":5}],8:[function(_dereq_,module,exports){ module.exports = ObjectCollisionMatrix; /** * Records what objects are colliding with each other * @class ObjectCollisionMatrix * @constructor */ function ObjectCollisionMatrix() { /** * The matrix storage * @property matrix * @type {Object} */ this.matrix = {}; } /** * @method get * @param {Number} i * @param {Number} j * @return {Number} */ ObjectCollisionMatrix.prototype.get = function(i, j) { i = i.id; j = j.id; if (j > i) { var temp = j; j = i; i = temp; } return i+'-'+j in this.matrix; }; /** * @method set * @param {Number} i * @param {Number} j * @param {Number} value */ ObjectCollisionMatrix.prototype.set = function(i, j, value) { i = i.id; j = j.id; if (j > i) { var temp = j; j = i; i = temp; } if (value) { this.matrix[i+'-'+j] = true; } else { delete this.matrix[i+'-'+j]; } }; /** * Empty the matrix * @method reset */ ObjectCollisionMatrix.prototype.reset = function() { this.matrix = {}; }; /** * Set max number of objects * @method setNumObjects * @param {Number} n */ ObjectCollisionMatrix.prototype.setNumObjects = function(n) { }; },{}],9:[function(_dereq_,module,exports){ module.exports = Ray; var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var Transform = _dereq_('../math/Transform'); var ConvexPolyhedron = _dereq_('../shapes/ConvexPolyhedron'); var Box = _dereq_('../shapes/Box'); var RaycastResult = _dereq_('../collision/RaycastResult'); var Shape = _dereq_('../shapes/Shape'); var AABB = _dereq_('../collision/AABB'); /** * A line in 3D space that intersects bodies and return points. * @class Ray * @constructor * @param {Vec3} from * @param {Vec3} to */ function Ray(from, to){ /** * @property {Vec3} from */ this.from = from ? from.clone() : new Vec3(); /** * @property {Vec3} to */ this.to = to ? to.clone() : new Vec3(); /** * @private * @property {Vec3} _direction */ this._direction = new Vec3(); /** * The precision of the ray. Used when checking parallelity etc. * @property {Number} precision */ this.precision = 0.0001; /** * Set to true if you want the Ray to take .collisionResponse flags into account on bodies and shapes. * @property {Boolean} checkCollisionResponse */ this.checkCollisionResponse = true; /** * If set to true, the ray skips any hits with normal.dot(rayDirection) < 0. * @property {Boolean} skipBackfaces */ this.skipBackfaces = false; /** * @property {number} collisionFilterMask * @default -1 */ this.collisionFilterMask = -1; /** * @property {number} collisionFilterGroup * @default -1 */ this.collisionFilterGroup = -1; /** * The intersection mode. Should be Ray.ANY, Ray.ALL or Ray.CLOSEST. * @property {number} mode */ this.mode = Ray.ANY; /** * Current result object. * @property {RaycastResult} result */ this.result = new RaycastResult(); /** * Will be set to true during intersectWorld() if the ray hit anything. * @property {Boolean} hasHit */ this.hasHit = false; /** * Current, user-provided result callback. Will be used if mode is Ray.ALL. * @property {Function} callback */ this.callback = function(result){}; } Ray.prototype.constructor = Ray; Ray.CLOSEST = 1; Ray.ANY = 2; Ray.ALL = 4; var tmpAABB = new AABB(); var tmpArray = []; /** * Do itersection against all bodies in the given World. * @method intersectWorld * @param {World} world * @param {object} options * @return {Boolean} True if the ray hit anything, otherwise false. */ Ray.prototype.intersectWorld = function (world, options) { this.mode = options.mode || Ray.ANY; this.result = options.result || new RaycastResult(); this.skipBackfaces = !!options.skipBackfaces; this.collisionFilterMask = typeof(options.collisionFilterMask) !== 'undefined' ? options.collisionFilterMask : -1; this.collisionFilterGroup = typeof(options.collisionFilterGroup) !== 'undefined' ? options.collisionFilterGroup : -1; if(options.from){ this.from.copy(options.from); } if(options.to){ this.to.copy(options.to); } this.callback = options.callback || function(){}; this.hasHit = false; this.result.reset(); this._updateDirection(); this.getAABB(tmpAABB); tmpArray.length = 0; world.broadphase.aabbQuery(world, tmpAABB, tmpArray); this.intersectBodies(tmpArray); return this.hasHit; }; var v1 = new Vec3(), v2 = new Vec3(); /* * As per "Barycentric Technique" as named here http://www.blackpawn.com/texts/pointinpoly/default.html But without the division */ Ray.pointInTriangle = pointInTriangle; function pointInTriangle(p, a, b, c) { c.vsub(a,v0); b.vsub(a,v1); p.vsub(a,v2); var dot00 = v0.dot( v0 ); var dot01 = v0.dot( v1 ); var dot02 = v0.dot( v2 ); var dot11 = v1.dot( v1 ); var dot12 = v1.dot( v2 ); var u,v; return ( (u = dot11 * dot02 - dot01 * dot12) >= 0 ) && ( (v = dot00 * dot12 - dot01 * dot02) >= 0 ) && ( u + v < ( dot00 * dot11 - dot01 * dot01 ) ); } /** * Shoot a ray at a body, get back information about the hit. * @method intersectBody * @private * @param {Body} body * @param {RaycastResult} [result] Deprecated - set the result property of the Ray instead. */ var intersectBody_xi = new Vec3(); var intersectBody_qi = new Quaternion(); Ray.prototype.intersectBody = function (body, result) { if(result){ this.result = result; this._updateDirection(); } var checkCollisionResponse = this.checkCollisionResponse; if(checkCollisionResponse && !body.collisionResponse){ return; } if((this.collisionFilterGroup & body.collisionFilterMask)===0 || (body.collisionFilterGroup & this.collisionFilterMask)===0){ return; } var xi = intersectBody_xi; var qi = intersectBody_qi; for (var i = 0, N = body.shapes.length; i < N; i++) { var shape = body.shapes[i]; if(checkCollisionResponse && !shape.collisionResponse){ continue; // Skip } body.quaternion.mult(body.shapeOrientations[i], qi); body.quaternion.vmult(body.shapeOffsets[i], xi); xi.vadd(body.position, xi); this.intersectShape( shape, qi, xi, body ); if(this.result._shouldStop){ break; } } }; /** * @method intersectBodies * @param {Array} bodies An array of Body objects. * @param {RaycastResult} [result] Deprecated */ Ray.prototype.intersectBodies = function (bodies, result) { if(result){ this.result = result; this._updateDirection(); } for ( var i = 0, l = bodies.length; !this.result._shouldStop && i < l; i ++ ) { this.intersectBody(bodies[i]); } }; /** * Updates the _direction vector. * @private * @method _updateDirection */ Ray.prototype._updateDirection = function(){ this.to.vsub(this.from, this._direction); this._direction.normalize(); }; /** * @method intersectShape * @private * @param {Shape} shape * @param {Quaternion} quat * @param {Vec3} position * @param {Body} body */ Ray.prototype.intersectShape = function(shape, quat, position, body){ var from = this.from; // Checking boundingSphere var distance = distanceFromIntersection(from, this._direction, position); if ( distance > shape.boundingSphereRadius ) { return; } var intersectMethod = this[shape.type]; if(intersectMethod){ intersectMethod.call(this, shape, quat, position, body); } }; var vector = new Vec3(); var normal = new Vec3(); var intersectPoint = new Vec3(); var a = new Vec3(); var b = new Vec3(); var c = new Vec3(); var d = new Vec3(); var tmpRaycastResult = new RaycastResult(); /** * @method intersectBox * @private * @param {Shape} shape * @param {Quaternion} quat * @param {Vec3} position * @param {Body} body */ Ray.prototype.intersectBox = function(shape, quat, position, body){ return this.intersectConvex(shape.convexPolyhedronRepresentation, quat, position, body); }; Ray.prototype[Shape.types.BOX] = Ray.prototype.intersectBox; /** * @method intersectPlane * @private * @param {Shape} shape * @param {Quaternion} quat * @param {Vec3} position * @param {Body} body */ Ray.prototype.intersectPlane = function(shape, quat, position, body){ var from = this.from; var to = this.to; var direction = this._direction; // Get plane normal var worldNormal = new Vec3(0, 0, 1); quat.vmult(worldNormal, worldNormal); var len = new Vec3(); from.vsub(position, len); var planeToFrom = len.dot(worldNormal); to.vsub(position, len); var planeToTo = len.dot(worldNormal); if(planeToFrom * planeToTo > 0){ // "from" and "to" are on the same side of the plane... bail out return; } if(from.distanceTo(to) < planeToFrom){ return; } var n_dot_dir = worldNormal.dot(direction); if (Math.abs(n_dot_dir) < this.precision) { // No intersection return; } var planePointToFrom = new Vec3(); var dir_scaled_with_t = new Vec3(); var hitPointWorld = new Vec3(); from.vsub(position, planePointToFrom); var t = -worldNormal.dot(planePointToFrom) / n_dot_dir; direction.scale(t, dir_scaled_with_t); from.vadd(dir_scaled_with_t, hitPointWorld); this.reportIntersection(worldNormal, hitPointWorld, shape, body, -1); }; Ray.prototype[Shape.types.PLANE] = Ray.prototype.intersectPlane; /** * Get the world AABB of the ray. * @method getAABB * @param {AABB} aabb */ Ray.prototype.getAABB = function(result){ var to = this.to; var from = this.from; result.lowerBound.x = Math.min(to.x, from.x); result.lowerBound.y = Math.min(to.y, from.y); result.lowerBound.z = Math.min(to.z, from.z); result.upperBound.x = Math.max(to.x, from.x); result.upperBound.y = Math.max(to.y, from.y); result.upperBound.z = Math.max(to.z, from.z); }; var intersectConvexOptions = { faceList: [0] }; /** * @method intersectHeightfield * @private * @param {Shape} shape * @param {Quaternion} quat * @param {Vec3} position * @param {Body} body */ Ray.prototype.intersectHeightfield = function(shape, quat, position, body){ var data = shape.data, w = shape.elementSize, worldPillarOffset = new Vec3(); // Convert the ray to local heightfield coordinates var localRay = new Ray(this.from, this.to); Transform.pointToLocalFrame(position, quat, localRay.from, localRay.from); Transform.pointToLocalFrame(position, quat, localRay.to, localRay.to); // Get the index of the data points to test against var index = []; var iMinX = null; var iMinY = null; var iMaxX = null; var iMaxY = null; var inside = shape.getIndexOfPosition(localRay.from.x, localRay.from.y, index, false); if(inside){ iMinX = index[0]; iMinY = index[1]; iMaxX = index[0]; iMaxY = index[1]; } inside = shape.getIndexOfPosition(localRay.to.x, localRay.to.y, index, false); if(inside){ if (iMinX === null || index[0] < iMinX) { iMinX = index[0]; } if (iMaxX === null || index[0] > iMaxX) { iMaxX = index[0]; } if (iMinY === null || index[1] < iMinY) { iMinY = index[1]; } if (iMaxY === null || index[1] > iMaxY) { iMaxY = index[1]; } } if(iMinX === null){ return; } var minMax = []; shape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax); var min = minMax[0]; var max = minMax[1]; // // Bail out if the ray can't touch the bounding box // // TODO // var aabb = new AABB(); // this.getAABB(aabb); // if(aabb.intersects()){ // return; // } for(var i = iMinX; i <= iMaxX; i++){ for(var j = iMinY; j <= iMaxY; j++){ if(this.result._shouldStop){ return; } // Lower triangle shape.getConvexTrianglePillar(i, j, false); Transform.pointToWorldFrame(position, quat, shape.pillarOffset, worldPillarOffset); this.intersectConvex(shape.pillarConvex, quat, worldPillarOffset, body, intersectConvexOptions); if(this.result._shouldStop){ return; } // Upper triangle shape.getConvexTrianglePillar(i, j, true); Transform.pointToWorldFrame(position, quat, shape.pillarOffset, worldPillarOffset); this.intersectConvex(shape.pillarConvex, quat, worldPillarOffset, body, intersectConvexOptions); } } }; Ray.prototype[Shape.types.HEIGHTFIELD] = Ray.prototype.intersectHeightfield; var Ray_intersectSphere_intersectionPoint = new Vec3(); var Ray_intersectSphere_normal = new Vec3(); /** * @method intersectSphere * @private * @param {Shape} shape * @param {Quaternion} quat * @param {Vec3} position * @param {Body} body */ Ray.prototype.intersectSphere = function(shape, quat, position, body){ var from = this.from, to = this.to, r = shape.radius; var a = Math.pow(to.x - from.x, 2) + Math.pow(to.y - from.y, 2) + Math.pow(to.z - from.z, 2); var b = 2 * ((to.x - from.x) * (from.x - position.x) + (to.y - from.y) * (from.y - position.y) + (to.z - from.z) * (from.z - position.z)); var c = Math.pow(from.x - position.x, 2) + Math.pow(from.y - position.y, 2) + Math.pow(from.z - position.z, 2) - Math.pow(r, 2); var delta = Math.pow(b, 2) - 4 * a * c; var intersectionPoint = Ray_intersectSphere_intersectionPoint; var normal = Ray_intersectSphere_normal; if(delta < 0){ // No intersection return; } else if(delta === 0){ // single intersection point from.lerp(to, delta, intersectionPoint); intersectionPoint.vsub(position, normal); normal.normalize(); this.reportIntersection(normal, intersectionPoint, shape, body, -1); } else { var d1 = (- b - Math.sqrt(delta)) / (2 * a); var d2 = (- b + Math.sqrt(delta)) / (2 * a); if(d1 >= 0 && d1 <= 1){ from.lerp(to, d1, intersectionPoint); intersectionPoint.vsub(position, normal); normal.normalize(); this.reportIntersection(normal, intersectionPoint, shape, body, -1); } if(this.result._shouldStop){ return; } if(d2 >= 0 && d2 <= 1){ from.lerp(to, d2, intersectionPoint); intersectionPoint.vsub(position, normal); normal.normalize(); this.reportIntersection(normal, intersectionPoint, shape, body, -1); } } }; Ray.prototype[Shape.types.SPHERE] = Ray.prototype.intersectSphere; var intersectConvex_normal = new Vec3(); var intersectConvex_minDistNormal = new Vec3(); var intersectConvex_minDistIntersect = new Vec3(); var intersectConvex_vector = new Vec3(); /** * @method intersectConvex * @private * @param {Shape} shape * @param {Quaternion} quat * @param {Vec3} position * @param {Body} body * @param {object} [options] * @param {array} [options.faceList] */ Ray.prototype.intersectConvex = function intersectConvex( shape, quat, position, body, options ){ var minDistNormal = intersectConvex_minDistNormal; var normal = intersectConvex_normal; var vector = intersectConvex_vector; var minDistIntersect = intersectConvex_minDistIntersect; var faceList = (options && options.faceList) || null; // Checking faces var faces = shape.faces, vertices = shape.vertices, normals = shape.faceNormals; var direction = this._direction; var from = this.from; var to = this.to; var fromToDistance = from.distanceTo(to); var minDist = -1; var Nfaces = faceList ? faceList.length : faces.length; var result = this.result; for (var j = 0; !result._shouldStop && j < Nfaces; j++) { var fi = faceList ? faceList[j] : j; var face = faces[fi]; var faceNormal = normals[fi]; var q = quat; var x = position; // determine if ray intersects the plane of the face // note: this works regardless of the direction of the face normal // Get plane point in world coordinates... vector.copy(vertices[face[0]]); q.vmult(vector,vector); vector.vadd(x,vector); // ...but make it relative to the ray from. We'll fix this later. vector.vsub(from,vector); // Get plane normal q.vmult(faceNormal,normal); // If this dot product is negative, we have something interesting var dot = direction.dot(normal); // Bail out if ray and plane are parallel if ( Math.abs( dot ) < this.precision ){ continue; } // calc distance to plane var scalar = normal.dot(vector) / dot; // if negative distance, then plane is behind ray if (scalar < 0){ continue; } // if (dot < 0) { // Intersection point is from + direction * scalar direction.mult(scalar,intersectPoint); intersectPoint.vadd(from,intersectPoint); // a is the point we compare points b and c with. a.copy(vertices[face[0]]); q.vmult(a,a); x.vadd(a,a); for(var i = 1; !result._shouldStop && i < face.length - 1; i++){ // Transform 3 vertices to world coords b.copy(vertices[face[i]]); c.copy(vertices[face[i+1]]); q.vmult(b,b); q.vmult(c,c); x.vadd(b,b); x.vadd(c,c); var distance = intersectPoint.distanceTo(from); if(!(pointInTriangle(intersectPoint, a, b, c) || pointInTriangle(intersectPoint, b, a, c)) || distance > fromToDistance){ continue; } this.reportIntersection(normal, intersectPoint, shape, body, fi); } // } } }; Ray.prototype[Shape.types.CONVEXPOLYHEDRON] = Ray.prototype.intersectConvex; var intersectTrimesh_normal = new Vec3(); var intersectTrimesh_localDirection = new Vec3(); var intersectTrimesh_localFrom = new Vec3(); var intersectTrimesh_localTo = new Vec3(); var intersectTrimesh_worldNormal = new Vec3(); var intersectTrimesh_worldIntersectPoint = new Vec3(); var intersectTrimesh_localAABB = new AABB(); var intersectTrimesh_triangles = []; var intersectTrimesh_treeTransform = new Transform(); /** * @method intersectTrimesh * @private * @param {Shape} shape * @param {Quaternion} quat * @param {Vec3} position * @param {Body} body * @param {object} [options] * @todo Optimize by transforming the world to local space first. * @todo Use Octree lookup */ Ray.prototype.intersectTrimesh = function intersectTrimesh( mesh, quat, position, body, options ){ var normal = intersectTrimesh_normal; var triangles = intersectTrimesh_triangles; var treeTransform = intersectTrimesh_treeTransform; var minDistNormal = intersectConvex_minDistNormal; var vector = intersectConvex_vector; var minDistIntersect = intersectConvex_minDistIntersect; var localAABB = intersectTrimesh_localAABB; var localDirection = intersectTrimesh_localDirection; var localFrom = intersectTrimesh_localFrom; var localTo = intersectTrimesh_localTo; var worldIntersectPoint = intersectTrimesh_worldIntersectPoint; var worldNormal = intersectTrimesh_worldNormal; var faceList = (options && options.faceList) || null; // Checking faces var indices = mesh.indices, vertices = mesh.vertices, normals = mesh.faceNormals; var from = this.from; var to = this.to; var direction = this._direction; var minDist = -1; treeTransform.position.copy(position); treeTransform.quaternion.copy(quat); // Transform ray to local space! Transform.vectorToLocalFrame(position, quat, direction, localDirection); //body.vectorToLocalFrame(direction, localDirection); Transform.pointToLocalFrame(position, quat, from, localFrom); //body.pointToLocalFrame(from, localFrom); Transform.pointToLocalFrame(position, quat, to, localTo); //body.pointToLocalFrame(to, localTo); var fromToDistanceSquared = localFrom.distanceSquared(localTo); mesh.tree.rayQuery(this, treeTransform, triangles); for (var i = 0, N = triangles.length; !this.result._shouldStop && i !== N; i++) { var trianglesIndex = triangles[i]; mesh.getNormal(trianglesIndex, normal); // determine if ray intersects the plane of the face // note: this works regardless of the direction of the face normal // Get plane point in world coordinates... mesh.getVertex(indices[trianglesIndex * 3], a); // ...but make it relative to the ray from. We'll fix this later. a.vsub(localFrom,vector); // Get plane normal // quat.vmult(normal, normal); // If this dot product is negative, we have something interesting var dot = localDirection.dot(normal); // Bail out if ray and plane are parallel // if (Math.abs( dot ) < this.precision){ // continue; // } // calc distance to plane var scalar = normal.dot(vector) / dot; // if negative distance, then plane is behind ray if (scalar < 0){ continue; } // Intersection point is from + direction * scalar localDirection.scale(scalar,intersectPoint); intersectPoint.vadd(localFrom,intersectPoint); // Get triangle vertices mesh.getVertex(indices[trianglesIndex * 3 + 1], b); mesh.getVertex(indices[trianglesIndex * 3 + 2], c); var squaredDistance = intersectPoint.distanceSquared(localFrom); if(!(pointInTriangle(intersectPoint, b, a, c) || pointInTriangle(intersectPoint, a, b, c)) || squaredDistance > fromToDistanceSquared){ continue; } // transform intersectpoint and normal to world Transform.vectorToWorldFrame(quat, normal, worldNormal); //body.vectorToWorldFrame(normal, worldNormal); Transform.pointToWorldFrame(position, quat, intersectPoint, worldIntersectPoint); //body.pointToWorldFrame(intersectPoint, worldIntersectPoint); this.reportIntersection(worldNormal, worldIntersectPoint, mesh, body, trianglesIndex); } triangles.length = 0; }; Ray.prototype[Shape.types.TRIMESH] = Ray.prototype.intersectTrimesh; /** * @method reportIntersection * @private * @param {Vec3} normal * @param {Vec3} hitPointWorld * @param {Shape} shape * @param {Body} body * @return {boolean} True if the intersections should continue */ Ray.prototype.reportIntersection = function(normal, hitPointWorld, shape, body, hitFaceIndex){ var from = this.from; var to = this.to; var distance = from.distanceTo(hitPointWorld); var result = this.result; // Skip back faces? if(this.skipBackfaces && normal.dot(this._direction) > 0){ return; } result.hitFaceIndex = typeof(hitFaceIndex) !== 'undefined' ? hitFaceIndex : -1; switch(this.mode){ case Ray.ALL: this.hasHit = true; result.set( from, to, normal, hitPointWorld, shape, body, distance ); result.hasHit = true; this.callback(result); break; case Ray.CLOSEST: // Store if closer than current closest if(distance < result.distance || !result.hasHit){ this.hasHit = true; result.hasHit = true; result.set( from, to, normal, hitPointWorld, shape, body, distance ); } break; case Ray.ANY: // Report and stop. this.hasHit = true; result.hasHit = true; result.set( from, to, normal, hitPointWorld, shape, body, distance ); result._shouldStop = true; break; } }; var v0 = new Vec3(), intersect = new Vec3(); function distanceFromIntersection(from, direction, position) { // v0 is vector from from to position position.vsub(from,v0); var dot = v0.dot(direction); // intersect = direction*dot + from direction.mult(dot,intersect); intersect.vadd(from,intersect); var distance = position.distanceTo(intersect); return distance; } },{"../collision/AABB":3,"../collision/RaycastResult":10,"../math/Quaternion":28,"../math/Transform":29,"../math/Vec3":30,"../shapes/Box":37,"../shapes/ConvexPolyhedron":38,"../shapes/Shape":43}],10:[function(_dereq_,module,exports){ var Vec3 = _dereq_('../math/Vec3'); module.exports = RaycastResult; /** * Storage for Ray casting data. * @class RaycastResult * @constructor */ function RaycastResult(){ /** * @property {Vec3} rayFromWorld */ this.rayFromWorld = new Vec3(); /** * @property {Vec3} rayToWorld */ this.rayToWorld = new Vec3(); /** * @property {Vec3} hitNormalWorld */ this.hitNormalWorld = new Vec3(); /** * @property {Vec3} hitPointWorld */ this.hitPointWorld = new Vec3(); /** * @property {boolean} hasHit */ this.hasHit = false; /** * The hit shape, or null. * @property {Shape} shape */ this.shape = null; /** * The hit body, or null. * @property {Body} body */ this.body = null; /** * The index of the hit triangle, if the hit shape was a trimesh. * @property {number} hitFaceIndex * @default -1 */ this.hitFaceIndex = -1; /** * Distance to the hit. Will be set to -1 if there was no hit. * @property {number} distance * @default -1 */ this.distance = -1; /** * If the ray should stop traversing the bodies. * @private * @property {Boolean} _shouldStop * @default false */ this._shouldStop = false; } /** * Reset all result data. * @method reset */ RaycastResult.prototype.reset = function () { this.rayFromWorld.setZero(); this.rayToWorld.setZero(); this.hitNormalWorld.setZero(); this.hitPointWorld.setZero(); this.hasHit = false; this.shape = null; this.body = null; this.hitFaceIndex = -1; this.distance = -1; this._shouldStop = false; }; /** * @method abort */ RaycastResult.prototype.abort = function(){ this._shouldStop = true; }; /** * @method set * @param {Vec3} rayFromWorld * @param {Vec3} rayToWorld * @param {Vec3} hitNormalWorld * @param {Vec3} hitPointWorld * @param {Shape} shape * @param {Body} body * @param {number} distance */ RaycastResult.prototype.set = function( rayFromWorld, rayToWorld, hitNormalWorld, hitPointWorld, shape, body, distance ){ this.rayFromWorld.copy(rayFromWorld); this.rayToWorld.copy(rayToWorld); this.hitNormalWorld.copy(hitNormalWorld); this.hitPointWorld.copy(hitPointWorld); this.shape = shape; this.body = body; this.distance = distance; }; },{"../math/Vec3":30}],11:[function(_dereq_,module,exports){ var Shape = _dereq_('../shapes/Shape'); var Broadphase = _dereq_('../collision/Broadphase'); module.exports = SAPBroadphase; /** * Sweep and prune broadphase along one axis. * * @class SAPBroadphase * @constructor * @param {World} [world] * @extends Broadphase */ function SAPBroadphase(world){ Broadphase.apply(this); /** * List of bodies currently in the broadphase. * @property axisList * @type {Array} */ this.axisList = []; /** * The world to search in. * @property world * @type {World} */ this.world = null; /** * Axis to sort the bodies along. Set to 0 for x axis, and 1 for y axis. For best performance, choose an axis that the bodies are spread out more on. * @property axisIndex * @type {Number} */ this.axisIndex = 0; var axisList = this.axisList; this._addBodyHandler = function(e){ axisList.push(e.body); }; this._removeBodyHandler = function(e){ var idx = axisList.indexOf(e.body); if(idx !== -1){ axisList.splice(idx,1); } }; if(world){ this.setWorld(world); } } SAPBroadphase.prototype = new Broadphase(); /** * Change the world * @method setWorld * @param {World} world */ SAPBroadphase.prototype.setWorld = function(world){ // Clear the old axis array this.axisList.length = 0; // Add all bodies from the new world for(var i=0; i=0;j--) { if(a[j].aabb.lowerBound.x <= v.aabb.lowerBound.x){ break; } a[j+1] = a[j]; } a[j+1] = v; } return a; }; /** * @static * @method insertionSortY * @param {Array} a * @return {Array} */ SAPBroadphase.insertionSortY = function(a) { for(var i=1,l=a.length;i=0;j--) { if(a[j].aabb.lowerBound.y <= v.aabb.lowerBound.y){ break; } a[j+1] = a[j]; } a[j+1] = v; } return a; }; /** * @static * @method insertionSortZ * @param {Array} a * @return {Array} */ SAPBroadphase.insertionSortZ = function(a) { for(var i=1,l=a.length;i=0;j--) { if(a[j].aabb.lowerBound.z <= v.aabb.lowerBound.z){ break; } a[j+1] = a[j]; } a[j+1] = v; } return a; }; /** * Collect all collision pairs * @method collisionPairs * @param {World} world * @param {Array} p1 * @param {Array} p2 */ SAPBroadphase.prototype.collisionPairs = function(world,p1,p2){ var bodies = this.axisList, N = bodies.length, axisIndex = this.axisIndex, i, j; if(this.dirty){ this.sortList(); this.dirty = false; } // Look through the list for(i=0; i !== N; i++){ var bi = bodies[i]; for(j=i+1; j < N; j++){ var bj = bodies[j]; if(!this.needBroadphaseCollision(bi,bj)){ continue; } if(!SAPBroadphase.checkBounds(bi,bj,axisIndex)){ break; } this.intersectionTest(bi,bj,p1,p2); } } }; SAPBroadphase.prototype.sortList = function(){ var axisList = this.axisList; var axisIndex = this.axisIndex; var N = axisList.length; // Update AABBs for(var i = 0; i!==N; i++){ var bi = axisList[i]; if(bi.aabbNeedsUpdate){ bi.computeAABB(); } } // Sort the list if(axisIndex === 0){ SAPBroadphase.insertionSortX(axisList); } else if(axisIndex === 1){ SAPBroadphase.insertionSortY(axisList); } else if(axisIndex === 2){ SAPBroadphase.insertionSortZ(axisList); } }; /** * Check if the bounds of two bodies overlap, along the given SAP axis. * @static * @method checkBounds * @param {Body} bi * @param {Body} bj * @param {Number} axisIndex * @return {Boolean} */ SAPBroadphase.checkBounds = function(bi, bj, axisIndex){ var biPos; var bjPos; if(axisIndex === 0){ biPos = bi.position.x; bjPos = bj.position.x; } else if(axisIndex === 1){ biPos = bi.position.y; bjPos = bj.position.y; } else if(axisIndex === 2){ biPos = bi.position.z; bjPos = bj.position.z; } var ri = bi.boundingRadius, rj = bj.boundingRadius, boundA1 = biPos - ri, boundA2 = biPos + ri, boundB1 = bjPos - rj, boundB2 = bjPos + rj; return boundB1 < boundA2; }; /** * Computes the variance of the body positions and estimates the best * axis to use. Will automatically set property .axisIndex. * @method autoDetectAxis */ SAPBroadphase.prototype.autoDetectAxis = function(){ var sumX=0, sumX2=0, sumY=0, sumY2=0, sumZ=0, sumZ2=0, bodies = this.axisList, N = bodies.length, invN=1/N; for(var i=0; i!==N; i++){ var b = bodies[i]; var centerX = b.position.x; sumX += centerX; sumX2 += centerX*centerX; var centerY = b.position.y; sumY += centerY; sumY2 += centerY*centerY; var centerZ = b.position.z; sumZ += centerZ; sumZ2 += centerZ*centerZ; } var varianceX = sumX2 - sumX*sumX*invN, varianceY = sumY2 - sumY*sumY*invN, varianceZ = sumZ2 - sumZ*sumZ*invN; if(varianceX > varianceY){ if(varianceX > varianceZ){ this.axisIndex = 0; } else{ this.axisIndex = 2; } } else if(varianceY > varianceZ){ this.axisIndex = 1; } else{ this.axisIndex = 2; } }; /** * Returns all the bodies within an AABB. * @method aabbQuery * @param {World} world * @param {AABB} aabb * @param {array} result An array to store resulting bodies in. * @return {array} */ SAPBroadphase.prototype.aabbQuery = function(world, aabb, result){ result = result || []; if(this.dirty){ this.sortList(); this.dirty = false; } var axisIndex = this.axisIndex, axis = 'x'; if(axisIndex === 1){ axis = 'y'; } if(axisIndex === 2){ axis = 'z'; } var axisList = this.axisList; var lower = aabb.lowerBound[axis]; var upper = aabb.upperBound[axis]; for(var i = 0; i < axisList.length; i++){ var b = axisList[i]; if(b.aabbNeedsUpdate){ b.computeAABB(); } if(b.aabb.overlaps(aabb)){ result.push(b); } } return result; }; },{"../collision/Broadphase":5,"../shapes/Shape":43}],12:[function(_dereq_,module,exports){ module.exports = ConeTwistConstraint; var Constraint = _dereq_('./Constraint'); var PointToPointConstraint = _dereq_('./PointToPointConstraint'); var ConeEquation = _dereq_('../equations/ConeEquation'); var RotationalEquation = _dereq_('../equations/RotationalEquation'); var ContactEquation = _dereq_('../equations/ContactEquation'); var Vec3 = _dereq_('../math/Vec3'); /** * @class ConeTwistConstraint * @constructor * @author schteppe * @param {Body} bodyA * @param {Body} bodyB * @param {object} [options] * @param {Vec3} [options.pivotA] * @param {Vec3} [options.pivotB] * @param {Vec3} [options.axisA] * @param {Vec3} [options.axisB] * @param {Number} [options.maxForce=1e6] * @extends PointToPointConstraint */ function ConeTwistConstraint(bodyA, bodyB, options){ options = options || {}; var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6; // Set pivot point in between var pivotA = options.pivotA ? options.pivotA.clone() : new Vec3(); var pivotB = options.pivotB ? options.pivotB.clone() : new Vec3(); this.axisA = options.axisA ? options.axisA.clone() : new Vec3(); this.axisB = options.axisB ? options.axisB.clone() : new Vec3(); PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce); this.collideConnected = !!options.collideConnected; this.angle = typeof(options.angle) !== 'undefined' ? options.angle : 0; /** * @property {ConeEquation} coneEquation */ var c = this.coneEquation = new ConeEquation(bodyA,bodyB,options); /** * @property {RotationalEquation} twistEquation */ var t = this.twistEquation = new RotationalEquation(bodyA,bodyB,options); this.twistAngle = typeof(options.twistAngle) !== 'undefined' ? options.twistAngle : 0; // Make the cone equation push the bodies toward the cone axis, not outward c.maxForce = 0; c.minForce = -maxForce; // Make the twist equation add torque toward the initial position t.maxForce = 0; t.minForce = -maxForce; this.equations.push(c, t); } ConeTwistConstraint.prototype = new PointToPointConstraint(); ConeTwistConstraint.constructor = ConeTwistConstraint; var ConeTwistConstraint_update_tmpVec1 = new Vec3(); var ConeTwistConstraint_update_tmpVec2 = new Vec3(); ConeTwistConstraint.prototype.update = function(){ var bodyA = this.bodyA, bodyB = this.bodyB, cone = this.coneEquation, twist = this.twistEquation; PointToPointConstraint.prototype.update.call(this); // Update the axes to the cone constraint bodyA.vectorToWorldFrame(this.axisA, cone.axisA); bodyB.vectorToWorldFrame(this.axisB, cone.axisB); // Update the world axes in the twist constraint this.axisA.tangents(twist.axisA, twist.axisA); bodyA.vectorToWorldFrame(twist.axisA, twist.axisA); this.axisB.tangents(twist.axisB, twist.axisB); bodyB.vectorToWorldFrame(twist.axisB, twist.axisB); cone.angle = this.angle; twist.maxAngle = this.twistAngle; }; },{"../equations/ConeEquation":18,"../equations/ContactEquation":19,"../equations/RotationalEquation":22,"../math/Vec3":30,"./Constraint":13,"./PointToPointConstraint":17}],13:[function(_dereq_,module,exports){ module.exports = Constraint; var Utils = _dereq_('../utils/Utils'); /** * Constraint base class * @class Constraint * @author schteppe * @constructor * @param {Body} bodyA * @param {Body} bodyB * @param {object} [options] * @param {boolean} [options.collideConnected=true] * @param {boolean} [options.wakeUpBodies=true] */ function Constraint(bodyA, bodyB, options){ options = Utils.defaults(options,{ collideConnected : true, wakeUpBodies : true, }); /** * Equations to be solved in this constraint * @property equations * @type {Array} */ this.equations = []; /** * @property {Body} bodyA */ this.bodyA = bodyA; /** * @property {Body} bodyB */ this.bodyB = bodyB; /** * @property {Number} id */ this.id = Constraint.idCounter++; /** * Set to true if you want the bodies to collide when they are connected. * @property collideConnected * @type {boolean} */ this.collideConnected = options.collideConnected; if(options.wakeUpBodies){ if(bodyA){ bodyA.wakeUp(); } if(bodyB){ bodyB.wakeUp(); } } } /** * Update all the equations with data. * @method update */ Constraint.prototype.update = function(){ throw new Error("method update() not implmemented in this Constraint subclass!"); }; /** * Enables all equations in the constraint. * @method enable */ Constraint.prototype.enable = function(){ var eqs = this.equations; for(var i=0; i // G = [0 axisA 0 -axisB] GA.rotational.copy(axisA); axisB.negate(GB.rotational); var GW = this.computeGW() - this.targetVelocity, GiMf = this.computeGiMf(); var B = - GW * b - h * GiMf; return B; }; },{"../math/Mat3":27,"../math/Vec3":30,"./Equation":20}],24:[function(_dereq_,module,exports){ var Utils = _dereq_('../utils/Utils'); module.exports = ContactMaterial; /** * Defines what happens when two materials meet. * @class ContactMaterial * @constructor * @param {Material} m1 * @param {Material} m2 * @param {object} [options] * @param {Number} [options.friction=0.3] * @param {Number} [options.restitution=0.3] * @param {number} [options.contactEquationStiffness=1e7] * @param {number} [options.contactEquationRelaxation=3] * @param {number} [options.frictionEquationStiffness=1e7] * @param {Number} [options.frictionEquationRelaxation=3] */ function ContactMaterial(m1, m2, options){ options = Utils.defaults(options, { friction: 0.3, restitution: 0.3, contactEquationStiffness: 1e7, contactEquationRelaxation: 3, frictionEquationStiffness: 1e7, frictionEquationRelaxation: 3 }); /** * Identifier of this material * @property {Number} id */ this.id = ContactMaterial.idCounter++; /** * Participating materials * @property {Array} materials * @todo Should be .materialA and .materialB instead */ this.materials = [m1, m2]; /** * Friction coefficient * @property {Number} friction */ this.friction = options.friction; /** * Restitution coefficient * @property {Number} restitution */ this.restitution = options.restitution; /** * Stiffness of the produced contact equations * @property {Number} contactEquationStiffness */ this.contactEquationStiffness = options.contactEquationStiffness; /** * Relaxation time of the produced contact equations * @property {Number} contactEquationRelaxation */ this.contactEquationRelaxation = options.contactEquationRelaxation; /** * Stiffness of the produced friction equations * @property {Number} frictionEquationStiffness */ this.frictionEquationStiffness = options.frictionEquationStiffness; /** * Relaxation time of the produced friction equations * @property {Number} frictionEquationRelaxation */ this.frictionEquationRelaxation = options.frictionEquationRelaxation; } ContactMaterial.idCounter = 0; },{"../utils/Utils":53}],25:[function(_dereq_,module,exports){ module.exports = Material; /** * Defines a physics material. * @class Material * @constructor * @param {object} [options] * @author schteppe */ function Material(options){ var name = ''; options = options || {}; // Backwards compatibility fix if(typeof(options) === 'string'){ name = options; options = {}; } else if(typeof(options) === 'object') { name = ''; } /** * @property name * @type {String} */ this.name = name; /** * material id. * @property id * @type {number} */ this.id = Material.idCounter++; /** * Friction for this material. If non-negative, it will be used instead of the friction given by ContactMaterials. If there's no matching ContactMaterial, the value from .defaultContactMaterial in the World will be used. * @property {number} friction */ this.friction = typeof(options.friction) !== 'undefined' ? options.friction : -1; /** * Restitution for this material. If non-negative, it will be used instead of the restitution given by ContactMaterials. If there's no matching ContactMaterial, the value from .defaultContactMaterial in the World will be used. * @property {number} restitution */ this.restitution = typeof(options.restitution) !== 'undefined' ? options.restitution : -1; } Material.idCounter = 0; },{}],26:[function(_dereq_,module,exports){ module.exports = JacobianElement; var Vec3 = _dereq_('./Vec3'); /** * An element containing 6 entries, 3 spatial and 3 rotational degrees of freedom. * @class JacobianElement * @constructor */ function JacobianElement(){ /** * @property {Vec3} spatial */ this.spatial = new Vec3(); /** * @property {Vec3} rotational */ this.rotational = new Vec3(); } /** * Multiply with other JacobianElement * @method multiplyElement * @param {JacobianElement} element * @return {Number} */ JacobianElement.prototype.multiplyElement = function(element){ return element.spatial.dot(this.spatial) + element.rotational.dot(this.rotational); }; /** * Multiply with two vectors * @method multiplyVectors * @param {Vec3} spatial * @param {Vec3} rotational * @return {Number} */ JacobianElement.prototype.multiplyVectors = function(spatial,rotational){ return spatial.dot(this.spatial) + rotational.dot(this.rotational); }; },{"./Vec3":30}],27:[function(_dereq_,module,exports){ module.exports = Mat3; var Vec3 = _dereq_('./Vec3'); /** * A 3x3 matrix. * @class Mat3 * @constructor * @param array elements Array of nine elements. Optional. * @author schteppe / http://github.com/schteppe */ function Mat3(elements){ /** * A vector of length 9, containing all matrix elements * @property {Array} elements */ if(elements){ this.elements = elements; } else { this.elements = [0,0,0,0,0,0,0,0,0]; } } /** * Sets the matrix to identity * @method identity * @todo Should perhaps be renamed to setIdentity() to be more clear. * @todo Create another function that immediately creates an identity matrix eg. eye() */ Mat3.prototype.identity = function(){ var e = this.elements; e[0] = 1; e[1] = 0; e[2] = 0; e[3] = 0; e[4] = 1; e[5] = 0; e[6] = 0; e[7] = 0; e[8] = 1; }; /** * Set all elements to zero * @method setZero */ Mat3.prototype.setZero = function(){ var e = this.elements; e[0] = 0; e[1] = 0; e[2] = 0; e[3] = 0; e[4] = 0; e[5] = 0; e[6] = 0; e[7] = 0; e[8] = 0; }; /** * Sets the matrix diagonal elements from a Vec3 * @method setTrace * @param {Vec3} vec3 */ Mat3.prototype.setTrace = function(vec3){ var e = this.elements; e[0] = vec3.x; e[4] = vec3.y; e[8] = vec3.z; }; /** * Gets the matrix diagonal elements * @method getTrace * @return {Vec3} */ Mat3.prototype.getTrace = function(target){ var target = target || new Vec3(); var e = this.elements; target.x = e[0]; target.y = e[4]; target.z = e[8]; }; /** * Matrix-Vector multiplication * @method vmult * @param {Vec3} v The vector to multiply with * @param {Vec3} target Optional, target to save the result in. */ Mat3.prototype.vmult = function(v,target){ target = target || new Vec3(); var e = this.elements, x = v.x, y = v.y, z = v.z; target.x = e[0]*x + e[1]*y + e[2]*z; target.y = e[3]*x + e[4]*y + e[5]*z; target.z = e[6]*x + e[7]*y + e[8]*z; return target; }; /** * Matrix-scalar multiplication * @method smult * @param {Number} s */ Mat3.prototype.smult = function(s){ for(var i=0; i1 acos and sqrt will produce errors, this cant happen if quaternion is normalised var angle = 2 * Math.acos(this.w); var s = Math.sqrt(1-this.w*this.w); // assuming quaternion normalised then w is less than 1, so term always positive. if (s < 0.001) { // test to avoid divide by zero, s is always positive due to sqrt // if s close to zero then direction of axis not important targetAxis.x = this.x; // if it is important that axis is normalised then replace with x=1; y=z=0; targetAxis.y = this.y; targetAxis.z = this.z; } else { targetAxis.x = this.x / s; // normalise axis targetAxis.y = this.y / s; targetAxis.z = this.z / s; } return [targetAxis,angle]; }; var sfv_t1 = new Vec3(), sfv_t2 = new Vec3(); /** * Set the quaternion value given two vectors. The resulting rotation will be the needed rotation to rotate u to v. * @method setFromVectors * @param {Vec3} u * @param {Vec3} v */ Quaternion.prototype.setFromVectors = function(u,v){ if(u.isAntiparallelTo(v)){ var t1 = sfv_t1; var t2 = sfv_t2; u.tangents(t1,t2); this.setFromAxisAngle(t1,Math.PI); } else { var a = u.cross(v); this.x = a.x; this.y = a.y; this.z = a.z; this.w = Math.sqrt(Math.pow(u.norm(),2) * Math.pow(v.norm(),2)) + u.dot(v); this.normalize(); } }; /** * Quaternion multiplication * @method mult * @param {Quaternion} q * @param {Quaternion} target Optional. * @return {Quaternion} */ var Quaternion_mult_va = new Vec3(); var Quaternion_mult_vb = new Vec3(); var Quaternion_mult_vaxvb = new Vec3(); Quaternion.prototype.mult = function(q,target){ target = target || new Quaternion(); var w = this.w, va = Quaternion_mult_va, vb = Quaternion_mult_vb, vaxvb = Quaternion_mult_vaxvb; va.set(this.x,this.y,this.z); vb.set(q.x,q.y,q.z); target.w = w*q.w - va.dot(vb); va.cross(vb,vaxvb); target.x = w * vb.x + q.w*va.x + vaxvb.x; target.y = w * vb.y + q.w*va.y + vaxvb.y; target.z = w * vb.z + q.w*va.z + vaxvb.z; return target; }; /** * Get the inverse quaternion rotation. * @method inverse * @param {Quaternion} target * @return {Quaternion} */ Quaternion.prototype.inverse = function(target){ var x = this.x, y = this.y, z = this.z, w = this.w; target = target || new Quaternion(); this.conjugate(target); var inorm2 = 1/(x*x + y*y + z*z + w*w); target.x *= inorm2; target.y *= inorm2; target.z *= inorm2; target.w *= inorm2; return target; }; /** * Get the quaternion conjugate * @method conjugate * @param {Quaternion} target * @return {Quaternion} */ Quaternion.prototype.conjugate = function(target){ target = target || new Quaternion(); target.x = -this.x; target.y = -this.y; target.z = -this.z; target.w = this.w; return target; }; /** * Normalize the quaternion. Note that this changes the values of the quaternion. * @method normalize */ Quaternion.prototype.normalize = function(){ var l = Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w); if ( l === 0 ) { this.x = 0; this.y = 0; this.z = 0; this.w = 0; } else { l = 1 / l; this.x *= l; this.y *= l; this.z *= l; this.w *= l; } }; /** * Approximation of quaternion normalization. Works best when quat is already almost-normalized. * @method normalizeFast * @see http://jsperf.com/fast-quaternion-normalization * @author unphased, https://github.com/unphased */ Quaternion.prototype.normalizeFast = function () { var f = (3.0-(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w))/2.0; if ( f === 0 ) { this.x = 0; this.y = 0; this.z = 0; this.w = 0; } else { this.x *= f; this.y *= f; this.z *= f; this.w *= f; } }; /** * Multiply the quaternion by a vector * @method vmult * @param {Vec3} v * @param {Vec3} target Optional * @return {Vec3} */ Quaternion.prototype.vmult = function(v,target){ target = target || new Vec3(); var x = v.x, y = v.y, z = v.z; var qx = this.x, qy = this.y, qz = this.z, qw = this.w; // q*v var ix = qw * x + qy * z - qz * y, iy = qw * y + qz * x - qx * z, iz = qw * z + qx * y - qy * x, iw = -qx * x - qy * y - qz * z; target.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; target.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; target.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; return target; }; /** * Copies value of source to this quaternion. * @method copy * @param {Quaternion} source * @return {Quaternion} this */ Quaternion.prototype.copy = function(source){ this.x = source.x; this.y = source.y; this.z = source.z; this.w = source.w; return this; }; /** * Convert the quaternion to euler angle representation. Order: YZX, as this page describes: http://www.euclideanspace.com/maths/standards/index.htm * @method toEuler * @param {Vec3} target * @param string order Three-character string e.g. "YZX", which also is default. */ Quaternion.prototype.toEuler = function(target,order){ order = order || "YZX"; var heading, attitude, bank; var x = this.x, y = this.y, z = this.z, w = this.w; switch(order){ case "YZX": var test = x*y + z*w; if (test > 0.499) { // singularity at north pole heading = 2 * Math.atan2(x,w); attitude = Math.PI/2; bank = 0; } if (test < -0.499) { // singularity at south pole heading = -2 * Math.atan2(x,w); attitude = - Math.PI/2; bank = 0; } if(isNaN(heading)){ var sqx = x*x; var sqy = y*y; var sqz = z*z; heading = Math.atan2(2*y*w - 2*x*z , 1 - 2*sqy - 2*sqz); // Heading attitude = Math.asin(2*test); // attitude bank = Math.atan2(2*x*w - 2*y*z , 1 - 2*sqx - 2*sqz); // bank } break; default: throw new Error("Euler order "+order+" not supported yet."); } target.y = heading; target.z = attitude; target.x = bank; }; /** * See http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m * @method setFromEuler * @param {Number} x * @param {Number} y * @param {Number} z * @param {String} order The order to apply angles: 'XYZ' or 'YXZ' or any other combination */ Quaternion.prototype.setFromEuler = function ( x, y, z, order ) { order = order || "XYZ"; var c1 = Math.cos( x / 2 ); var c2 = Math.cos( y / 2 ); var c3 = Math.cos( z / 2 ); var s1 = Math.sin( x / 2 ); var s2 = Math.sin( y / 2 ); var s3 = Math.sin( z / 2 ); if ( order === 'XYZ' ) { this.x = s1 * c2 * c3 + c1 * s2 * s3; this.y = c1 * s2 * c3 - s1 * c2 * s3; this.z = c1 * c2 * s3 + s1 * s2 * c3; this.w = c1 * c2 * c3 - s1 * s2 * s3; } else if ( order === 'YXZ' ) { this.x = s1 * c2 * c3 + c1 * s2 * s3; this.y = c1 * s2 * c3 - s1 * c2 * s3; this.z = c1 * c2 * s3 - s1 * s2 * c3; this.w = c1 * c2 * c3 + s1 * s2 * s3; } else if ( order === 'ZXY' ) { this.x = s1 * c2 * c3 - c1 * s2 * s3; this.y = c1 * s2 * c3 + s1 * c2 * s3; this.z = c1 * c2 * s3 + s1 * s2 * c3; this.w = c1 * c2 * c3 - s1 * s2 * s3; } else if ( order === 'ZYX' ) { this.x = s1 * c2 * c3 - c1 * s2 * s3; this.y = c1 * s2 * c3 + s1 * c2 * s3; this.z = c1 * c2 * s3 - s1 * s2 * c3; this.w = c1 * c2 * c3 + s1 * s2 * s3; } else if ( order === 'YZX' ) { this.x = s1 * c2 * c3 + c1 * s2 * s3; this.y = c1 * s2 * c3 + s1 * c2 * s3; this.z = c1 * c2 * s3 - s1 * s2 * c3; this.w = c1 * c2 * c3 - s1 * s2 * s3; } else if ( order === 'XZY' ) { this.x = s1 * c2 * c3 - c1 * s2 * s3; this.y = c1 * s2 * c3 - s1 * c2 * s3; this.z = c1 * c2 * s3 + s1 * s2 * c3; this.w = c1 * c2 * c3 + s1 * s2 * s3; } return this; }; Quaternion.prototype.clone = function(){ return new Quaternion(this.x, this.y, this.z, this.w); }; },{"./Vec3":30}],29:[function(_dereq_,module,exports){ var Vec3 = _dereq_('./Vec3'); var Quaternion = _dereq_('./Quaternion'); module.exports = Transform; /** * @class Transform * @constructor */ function Transform(options) { options = options || {}; /** * @property {Vec3} position */ this.position = new Vec3(); if(options.position){ this.position.copy(options.position); } /** * @property {Quaternion} quaternion */ this.quaternion = new Quaternion(); if(options.quaternion){ this.quaternion.copy(options.quaternion); } } var tmpQuat = new Quaternion(); /** * @static * @method pointToLocaFrame * @param {Vec3} position * @param {Quaternion} quaternion * @param {Vec3} worldPoint * @param {Vec3} result */ Transform.pointToLocalFrame = function(position, quaternion, worldPoint, result){ var result = result || new Vec3(); worldPoint.vsub(position, result); quaternion.conjugate(tmpQuat); tmpQuat.vmult(result, result); return result; }; /** * Get a global point in local transform coordinates. * @method pointToLocal * @param {Vec3} point * @param {Vec3} result * @return {Vec3} The "result" vector object */ Transform.prototype.pointToLocal = function(worldPoint, result){ return Transform.pointToLocalFrame(this.position, this.quaternion, worldPoint, result); }; /** * @static * @method pointToWorldFrame * @param {Vec3} position * @param {Vec3} quaternion * @param {Vec3} localPoint * @param {Vec3} result */ Transform.pointToWorldFrame = function(position, quaternion, localPoint, result){ var result = result || new Vec3(); quaternion.vmult(localPoint, result); result.vadd(position, result); return result; }; /** * Get a local point in global transform coordinates. * @method pointToWorld * @param {Vec3} point * @param {Vec3} result * @return {Vec3} The "result" vector object */ Transform.prototype.pointToWorld = function(localPoint, result){ return Transform.pointToWorldFrame(this.position, this.quaternion, localPoint, result); }; Transform.prototype.vectorToWorldFrame = function(localVector, result){ var result = result || new Vec3(); this.quaternion.vmult(localVector, result); return result; }; Transform.vectorToWorldFrame = function(quaternion, localVector, result){ quaternion.vmult(localVector, result); return result; }; Transform.vectorToLocalFrame = function(position, quaternion, worldVector, result){ var result = result || new Vec3(); quaternion.w *= -1; quaternion.vmult(worldVector, result); quaternion.w *= -1; return result; }; },{"./Quaternion":28,"./Vec3":30}],30:[function(_dereq_,module,exports){ module.exports = Vec3; var Mat3 = _dereq_('./Mat3'); /** * 3-dimensional vector * @class Vec3 * @constructor * @param {Number} x * @param {Number} y * @param {Number} z * @author schteppe * @example * var v = new Vec3(1, 2, 3); * console.log('x=' + v.x); // x=1 */ function Vec3(x,y,z){ /** * @property x * @type {Number} */ this.x = x||0.0; /** * @property y * @type {Number} */ this.y = y||0.0; /** * @property z * @type {Number} */ this.z = z||0.0; } /** * @static * @property {Vec3} ZERO */ Vec3.ZERO = new Vec3(0, 0, 0); /** * @static * @property {Vec3} UNIT_X */ Vec3.UNIT_X = new Vec3(1, 0, 0); /** * @static * @property {Vec3} UNIT_Y */ Vec3.UNIT_Y = new Vec3(0, 1, 0); /** * @static * @property {Vec3} UNIT_Z */ Vec3.UNIT_Z = new Vec3(0, 0, 1); /** * Vector cross product * @method cross * @param {Vec3} v * @param {Vec3} target Optional. Target to save in. * @return {Vec3} */ Vec3.prototype.cross = function(v,target){ var vx=v.x, vy=v.y, vz=v.z, x=this.x, y=this.y, z=this.z; target = target || new Vec3(); target.x = (y * vz) - (z * vy); target.y = (z * vx) - (x * vz); target.z = (x * vy) - (y * vx); return target; }; /** * Set the vectors' 3 elements * @method set * @param {Number} x * @param {Number} y * @param {Number} z * @return Vec3 */ Vec3.prototype.set = function(x,y,z){ this.x = x; this.y = y; this.z = z; return this; }; /** * Set all components of the vector to zero. * @method setZero */ Vec3.prototype.setZero = function(){ this.x = this.y = this.z = 0; }; /** * Vector addition * @method vadd * @param {Vec3} v * @param {Vec3} target Optional. * @return {Vec3} */ Vec3.prototype.vadd = function(v,target){ if(target){ target.x = v.x + this.x; target.y = v.y + this.y; target.z = v.z + this.z; } else { return new Vec3(this.x + v.x, this.y + v.y, this.z + v.z); } }; /** * Vector subtraction * @method vsub * @param {Vec3} v * @param {Vec3} target Optional. Target to save in. * @return {Vec3} */ Vec3.prototype.vsub = function(v,target){ if(target){ target.x = this.x - v.x; target.y = this.y - v.y; target.z = this.z - v.z; } else { return new Vec3(this.x-v.x, this.y-v.y, this.z-v.z); } }; /** * Get the cross product matrix a_cross from a vector, such that a x b = a_cross * b = c * @method crossmat * @see http://www8.cs.umu.se/kurser/TDBD24/VT06/lectures/Lecture6.pdf * @return {Mat3} */ Vec3.prototype.crossmat = function(){ return new Mat3([ 0, -this.z, this.y, this.z, 0, -this.x, -this.y, this.x, 0]); }; /** * Normalize the vector. Note that this changes the values in the vector. * @method normalize * @return {Number} Returns the norm of the vector */ Vec3.prototype.normalize = function(){ var x=this.x, y=this.y, z=this.z; var n = Math.sqrt(x*x + y*y + z*z); if(n>0.0){ var invN = 1/n; this.x *= invN; this.y *= invN; this.z *= invN; } else { // Make something up this.x = 0; this.y = 0; this.z = 0; } return n; }; /** * Get the version of this vector that is of length 1. * @method unit * @param {Vec3} target Optional target to save in * @return {Vec3} Returns the unit vector */ Vec3.prototype.unit = function(target){ target = target || new Vec3(); var x=this.x, y=this.y, z=this.z; var ninv = Math.sqrt(x*x + y*y + z*z); if(ninv>0.0){ ninv = 1.0/ninv; target.x = x * ninv; target.y = y * ninv; target.z = z * ninv; } else { target.x = 1; target.y = 0; target.z = 0; } return target; }; /** * Get the length of the vector * @method norm * @return {Number} * @deprecated Use .length() instead */ Vec3.prototype.norm = function(){ var x=this.x, y=this.y, z=this.z; return Math.sqrt(x*x + y*y + z*z); }; /** * Get the length of the vector * @method length * @return {Number} */ Vec3.prototype.length = Vec3.prototype.norm; /** * Get the squared length of the vector * @method norm2 * @return {Number} * @deprecated Use .lengthSquared() instead. */ Vec3.prototype.norm2 = function(){ return this.dot(this); }; /** * Get the squared length of the vector. * @method lengthSquared * @return {Number} */ Vec3.prototype.lengthSquared = Vec3.prototype.norm2; /** * Get distance from this point to another point * @method distanceTo * @param {Vec3} p * @return {Number} */ Vec3.prototype.distanceTo = function(p){ var x=this.x, y=this.y, z=this.z; var px=p.x, py=p.y, pz=p.z; return Math.sqrt((px-x)*(px-x)+ (py-y)*(py-y)+ (pz-z)*(pz-z)); }; /** * Get squared distance from this point to another point * @method distanceSquared * @param {Vec3} p * @return {Number} */ Vec3.prototype.distanceSquared = function(p){ var x=this.x, y=this.y, z=this.z; var px=p.x, py=p.y, pz=p.z; return (px-x)*(px-x) + (py-y)*(py-y) + (pz-z)*(pz-z); }; /** * Multiply all the components of the vector with a scalar. * @deprecated Use .scale instead * @method mult * @param {Number} scalar * @param {Vec3} target The vector to save the result in. * @return {Vec3} * @deprecated Use .scale() instead */ Vec3.prototype.mult = function(scalar,target){ target = target || new Vec3(); var x = this.x, y = this.y, z = this.z; target.x = scalar * x; target.y = scalar * y; target.z = scalar * z; return target; }; /** * Multiply the vector with a scalar. * @method scale * @param {Number} scalar * @param {Vec3} target * @return {Vec3} */ Vec3.prototype.scale = Vec3.prototype.mult; /** * Calculate dot product * @method dot * @param {Vec3} v * @return {Number} */ Vec3.prototype.dot = function(v){ return this.x * v.x + this.y * v.y + this.z * v.z; }; /** * @method isZero * @return bool */ Vec3.prototype.isZero = function(){ return this.x===0 && this.y===0 && this.z===0; }; /** * Make the vector point in the opposite direction. * @method negate * @param {Vec3} target Optional target to save in * @return {Vec3} */ Vec3.prototype.negate = function(target){ target = target || new Vec3(); target.x = -this.x; target.y = -this.y; target.z = -this.z; return target; }; /** * Compute two artificial tangents to the vector * @method tangents * @param {Vec3} t1 Vector object to save the first tangent in * @param {Vec3} t2 Vector object to save the second tangent in */ var Vec3_tangents_n = new Vec3(); var Vec3_tangents_randVec = new Vec3(); Vec3.prototype.tangents = function(t1,t2){ var norm = this.norm(); if(norm>0.0){ var n = Vec3_tangents_n; var inorm = 1/norm; n.set(this.x*inorm,this.y*inorm,this.z*inorm); var randVec = Vec3_tangents_randVec; if(Math.abs(n.x) < 0.9){ randVec.set(1,0,0); n.cross(randVec,t1); } else { randVec.set(0,1,0); n.cross(randVec,t1); } n.cross(t1,t2); } else { // The normal length is zero, make something up t1.set(1, 0, 0); t2.set(0, 1, 0); } }; /** * Converts to a more readable format * @method toString * @return string */ Vec3.prototype.toString = function(){ return this.x+","+this.y+","+this.z; }; /** * Converts to an array * @method toArray * @return Array */ Vec3.prototype.toArray = function(){ return [this.x, this.y, this.z]; }; /** * Copies value of source to this vector. * @method copy * @param {Vec3} source * @return {Vec3} this */ Vec3.prototype.copy = function(source){ this.x = source.x; this.y = source.y; this.z = source.z; return this; }; /** * Do a linear interpolation between two vectors * @method lerp * @param {Vec3} v * @param {Number} t A number between 0 and 1. 0 will make this function return u, and 1 will make it return v. Numbers in between will generate a vector in between them. * @param {Vec3} target */ Vec3.prototype.lerp = function(v,t,target){ var x=this.x, y=this.y, z=this.z; target.x = x + (v.x-x)*t; target.y = y + (v.y-y)*t; target.z = z + (v.z-z)*t; }; /** * Check if a vector equals is almost equal to another one. * @method almostEquals * @param {Vec3} v * @param {Number} precision * @return bool */ Vec3.prototype.almostEquals = function(v,precision){ if(precision===undefined){ precision = 1e-6; } if( Math.abs(this.x-v.x)>precision || Math.abs(this.y-v.y)>precision || Math.abs(this.z-v.z)>precision){ return false; } return true; }; /** * Check if a vector is almost zero * @method almostZero * @param {Number} precision */ Vec3.prototype.almostZero = function(precision){ if(precision===undefined){ precision = 1e-6; } if( Math.abs(this.x)>precision || Math.abs(this.y)>precision || Math.abs(this.z)>precision){ return false; } return true; }; var antip_neg = new Vec3(); /** * Check if the vector is anti-parallel to another vector. * @method isAntiparallelTo * @param {Vec3} v * @param {Number} precision Set to zero for exact comparisons * @return {Boolean} */ Vec3.prototype.isAntiparallelTo = function(v,precision){ this.negate(antip_neg); return antip_neg.almostEquals(v,precision); }; /** * Clone the vector * @method clone * @return {Vec3} */ Vec3.prototype.clone = function(){ return new Vec3(this.x, this.y, this.z); }; },{"./Mat3":27}],31:[function(_dereq_,module,exports){ module.exports = Body; var EventTarget = _dereq_('../utils/EventTarget'); var Shape = _dereq_('../shapes/Shape'); var Vec3 = _dereq_('../math/Vec3'); var Mat3 = _dereq_('../math/Mat3'); var Quaternion = _dereq_('../math/Quaternion'); var Material = _dereq_('../material/Material'); var AABB = _dereq_('../collision/AABB'); var Box = _dereq_('../shapes/Box'); /** * Base class for all body types. * @class Body * @constructor * @extends EventTarget * @param {object} [options] * @param {Vec3} [options.position] * @param {Vec3} [options.velocity] * @param {Vec3} [options.angularVelocity] * @param {Quaternion} [options.quaternion] * @param {number} [options.mass] * @param {Material} [options.material] * @param {number} [options.type] * @param {number} [options.linearDamping=0.01] * @param {number} [options.angularDamping=0.01] * @param {boolean} [options.allowSleep=true] * @param {number} [options.sleepSpeedLimit=0.1] * @param {number} [options.sleepTimeLimit=1] * @param {number} [options.collisionFilterGroup=1] * @param {number} [options.collisionFilterMask=1] * @param {boolean} [options.fixedRotation=false] * @param {Body} [options.shape] * @example * var body = new Body({ * mass: 1 * }); * var shape = new Sphere(1); * body.addShape(shape); * world.add(body); */ function Body(options){ options = options || {}; EventTarget.apply(this); this.id = Body.idCounter++; /** * Reference to the world the body is living in * @property world * @type {World} */ this.world = null; /** * Callback function that is used BEFORE stepping the system. Use it to apply forces, for example. Inside the function, "this" will refer to this Body object. * @property preStep * @type {Function} * @deprecated Use World events instead */ this.preStep = null; /** * Callback function that is used AFTER stepping the system. Inside the function, "this" will refer to this Body object. * @property postStep * @type {Function} * @deprecated Use World events instead */ this.postStep = null; this.vlambda = new Vec3(); /** * @property {Number} collisionFilterGroup */ this.collisionFilterGroup = typeof(options.collisionFilterGroup) === 'number' ? options.collisionFilterGroup : 1; /** * @property {Number} collisionFilterMask */ this.collisionFilterMask = typeof(options.collisionFilterMask) === 'number' ? options.collisionFilterMask : 1; /** * Whether to produce contact forces when in contact with other bodies. Note that contacts will be generated, but they will be disabled. * @property {Number} collisionResponse */ this.collisionResponse = true; /** * @property position * @type {Vec3} */ this.position = new Vec3(); if(options.position){ this.position.copy(options.position); } /** * @property {Vec3} previousPosition */ this.previousPosition = new Vec3(); /** * Initial position of the body * @property initPosition * @type {Vec3} */ this.initPosition = new Vec3(); /** * @property velocity * @type {Vec3} */ this.velocity = new Vec3(); if(options.velocity){ this.velocity.copy(options.velocity); } /** * @property initVelocity * @type {Vec3} */ this.initVelocity = new Vec3(); /** * Linear force on the body * @property force * @type {Vec3} */ this.force = new Vec3(); var mass = typeof(options.mass) === 'number' ? options.mass : 0; /** * @property mass * @type {Number} * @default 0 */ this.mass = mass; /** * @property invMass * @type {Number} */ this.invMass = mass > 0 ? 1.0 / mass : 0; /** * @property material * @type {Material} */ this.material = options.material || null; /** * @property linearDamping * @type {Number} */ this.linearDamping = typeof(options.linearDamping) === 'number' ? options.linearDamping : 0.01; /** * One of: Body.DYNAMIC, Body.STATIC and Body.KINEMATIC. * @property type * @type {Number} */ this.type = (mass <= 0.0 ? Body.STATIC : Body.DYNAMIC); if(typeof(options.type) === typeof(Body.STATIC)){ this.type = options.type; } /** * If true, the body will automatically fall to sleep. * @property allowSleep * @type {Boolean} * @default true */ this.allowSleep = typeof(options.allowSleep) !== 'undefined' ? options.allowSleep : true; /** * Current sleep state. * @property sleepState * @type {Number} */ this.sleepState = 0; /** * If the speed (the norm of the velocity) is smaller than this value, the body is considered sleepy. * @property sleepSpeedLimit * @type {Number} * @default 0.1 */ this.sleepSpeedLimit = typeof(options.sleepSpeedLimit) !== 'undefined' ? options.sleepSpeedLimit : 0.1; /** * If the body has been sleepy for this sleepTimeLimit seconds, it is considered sleeping. * @property sleepTimeLimit * @type {Number} * @default 1 */ this.sleepTimeLimit = typeof(options.sleepTimeLimit) !== 'undefined' ? options.sleepTimeLimit : 1; this.timeLastSleepy = 0; this._wakeUpAfterNarrowphase = false; /** * Rotational force on the body, around center of mass * @property {Vec3} torque */ this.torque = new Vec3(); /** * Orientation of the body * @property quaternion * @type {Quaternion} */ this.quaternion = new Quaternion(); if(options.quaternion){ this.quaternion.copy(options.quaternion); } /** * @property initQuaternion * @type {Quaternion} */ this.initQuaternion = new Quaternion(); /** * @property angularVelocity * @type {Vec3} */ this.angularVelocity = new Vec3(); if(options.angularVelocity){ this.angularVelocity.copy(options.angularVelocity); } /** * @property initAngularVelocity * @type {Vec3} */ this.initAngularVelocity = new Vec3(); this.interpolatedPosition = new Vec3(); this.interpolatedQuaternion = new Quaternion(); /** * @property shapes * @type {array} */ this.shapes = []; /** * @property shapeOffsets * @type {array} */ this.shapeOffsets = []; /** * @property shapeOrientations * @type {array} */ this.shapeOrientations = []; /** * @property inertia * @type {Vec3} */ this.inertia = new Vec3(); /** * @property {Vec3} invInertia */ this.invInertia = new Vec3(); /** * @property {Mat3} invInertiaWorld */ this.invInertiaWorld = new Mat3(); this.invMassSolve = 0; /** * @property {Vec3} invInertiaSolve */ this.invInertiaSolve = new Vec3(); /** * @property {Mat3} invInertiaWorldSolve */ this.invInertiaWorldSolve = new Mat3(); /** * Set to true if you don't want the body to rotate. Make sure to run .updateMassProperties() after changing this. * @property {Boolean} fixedRotation * @default false */ this.fixedRotation = typeof(options.fixedRotation) !== "undefined" ? options.fixedRotation : false; /** * @property {Number} angularDamping */ this.angularDamping = typeof(options.angularDamping) !== 'undefined' ? options.angularDamping : 0.01; /** * @property aabb * @type {AABB} */ this.aabb = new AABB(); /** * Indicates if the AABB needs to be updated before use. * @property aabbNeedsUpdate * @type {Boolean} */ this.aabbNeedsUpdate = true; this.wlambda = new Vec3(); if(options.shape){ this.addShape(options.shape); } this.updateMassProperties(); } Body.prototype = new EventTarget(); Body.prototype.constructor = Body; /** * A dynamic body is fully simulated. Can be moved manually by the user, but normally they move according to forces. A dynamic body can collide with all body types. A dynamic body always has finite, non-zero mass. * @static * @property DYNAMIC * @type {Number} */ Body.DYNAMIC = 1; /** * A static body does not move during simulation and behaves as if it has infinite mass. Static bodies can be moved manually by setting the position of the body. The velocity of a static body is always zero. Static bodies do not collide with other static or kinematic bodies. * @static * @property STATIC * @type {Number} */ Body.STATIC = 2; /** * A kinematic body moves under simulation according to its velocity. They do not respond to forces. They can be moved manually, but normally a kinematic body is moved by setting its velocity. A kinematic body behaves as if it has infinite mass. Kinematic bodies do not collide with other static or kinematic bodies. * @static * @property KINEMATIC * @type {Number} */ Body.KINEMATIC = 4; /** * @static * @property AWAKE * @type {number} */ Body.AWAKE = 0; /** * @static * @property SLEEPY * @type {number} */ Body.SLEEPY = 1; /** * @static * @property SLEEPING * @type {number} */ Body.SLEEPING = 2; Body.idCounter = 0; /** * Wake the body up. * @method wakeUp */ Body.prototype.wakeUp = function(){ var s = this.sleepState; this.sleepState = 0; if(s === Body.SLEEPING){ this.dispatchEvent({type:"wakeup"}); } }; /** * Force body sleep * @method sleep */ Body.prototype.sleep = function(){ this.sleepState = Body.SLEEPING; this.velocity.set(0,0,0); this.angularVelocity.set(0,0,0); }; Body.sleepyEvent = { type: "sleepy" }; Body.sleepEvent = { type: "sleep" }; /** * Called every timestep to update internal sleep timer and change sleep state if needed. * @method sleepTick * @param {Number} time The world time in seconds */ Body.prototype.sleepTick = function(time){ if(this.allowSleep){ var sleepState = this.sleepState; var speedSquared = this.velocity.norm2() + this.angularVelocity.norm2(); var speedLimitSquared = Math.pow(this.sleepSpeedLimit,2); if(sleepState===Body.AWAKE && speedSquared < speedLimitSquared){ this.sleepState = Body.SLEEPY; // Sleepy this.timeLastSleepy = time; this.dispatchEvent(Body.sleepyEvent); } else if(sleepState===Body.SLEEPY && speedSquared > speedLimitSquared){ this.wakeUp(); // Wake up } else if(sleepState===Body.SLEEPY && (time - this.timeLastSleepy ) > this.sleepTimeLimit){ this.sleep(); // Sleeping this.dispatchEvent(Body.sleepEvent); } } }; /** * If the body is sleeping, it should be immovable / have infinite mass during solve. We solve it by having a separate "solve mass". * @method updateSolveMassProperties */ Body.prototype.updateSolveMassProperties = function(){ if(this.sleepState === Body.SLEEPING || this.type === Body.KINEMATIC){ this.invMassSolve = 0; this.invInertiaSolve.setZero(); this.invInertiaWorldSolve.setZero(); } else { this.invMassSolve = this.invMass; this.invInertiaSolve.copy(this.invInertia); this.invInertiaWorldSolve.copy(this.invInertiaWorld); } }; /** * Convert a world point to local body frame. * @method pointToLocalFrame * @param {Vec3} worldPoint * @param {Vec3} result * @return {Vec3} */ Body.prototype.pointToLocalFrame = function(worldPoint,result){ var result = result || new Vec3(); worldPoint.vsub(this.position,result); this.quaternion.conjugate().vmult(result,result); return result; }; /** * Convert a world vector to local body frame. * @method vectorToLocalFrame * @param {Vec3} worldPoint * @param {Vec3} result * @return {Vec3} */ Body.prototype.vectorToLocalFrame = function(worldVector, result){ var result = result || new Vec3(); this.quaternion.conjugate().vmult(worldVector,result); return result; }; /** * Convert a local body point to world frame. * @method pointToWorldFrame * @param {Vec3} localPoint * @param {Vec3} result * @return {Vec3} */ Body.prototype.pointToWorldFrame = function(localPoint,result){ var result = result || new Vec3(); this.quaternion.vmult(localPoint,result); result.vadd(this.position,result); return result; }; /** * Convert a local body point to world frame. * @method vectorToWorldFrame * @param {Vec3} localVector * @param {Vec3} result * @return {Vec3} */ Body.prototype.vectorToWorldFrame = function(localVector, result){ var result = result || new Vec3(); this.quaternion.vmult(localVector, result); return result; }; var tmpVec = new Vec3(); var tmpQuat = new Quaternion(); /** * Add a shape to the body with a local offset and orientation. * @method addShape * @param {Shape} shape * @param {Vec3} offset * @param {Quaternion} quaternion * @return {Body} The body object, for chainability. */ Body.prototype.addShape = function(shape, _offset, _orientation){ var offset = new Vec3(); var orientation = new Quaternion(); if(_offset){ offset.copy(_offset); } if(_orientation){ orientation.copy(_orientation); } this.shapes.push(shape); this.shapeOffsets.push(offset); this.shapeOrientations.push(orientation); this.updateMassProperties(); this.updateBoundingRadius(); this.aabbNeedsUpdate = true; return this; }; /** * Update the bounding radius of the body. Should be done if any of the shapes are changed. * @method updateBoundingRadius */ Body.prototype.updateBoundingRadius = function(){ var shapes = this.shapes, shapeOffsets = this.shapeOffsets, N = shapes.length, radius = 0; for(var i=0; i!==N; i++){ var shape = shapes[i]; shape.updateBoundingSphereRadius(); var offset = shapeOffsets[i].norm(), r = shape.boundingSphereRadius; if(offset + r > radius){ radius = offset + r; } } this.boundingRadius = radius; }; var computeAABB_shapeAABB = new AABB(); /** * Updates the .aabb * @method computeAABB * @todo rename to updateAABB() */ Body.prototype.computeAABB = function(){ var shapes = this.shapes, shapeOffsets = this.shapeOffsets, shapeOrientations = this.shapeOrientations, N = shapes.length, offset = tmpVec, orientation = tmpQuat, bodyQuat = this.quaternion, aabb = this.aabb, shapeAABB = computeAABB_shapeAABB; for(var i=0; i!==N; i++){ var shape = shapes[i]; // Get shape world quaternion shapeOrientations[i].mult(bodyQuat, orientation); // Get shape world position orientation.vmult(shapeOffsets[i], offset); offset.vadd(this.position, offset); // vec2.rotate(offset, shapeOffsets[i], bodyAngle); // vec2.add(offset, offset, this.position); // Get shape AABB shape.calculateWorldAABB(offset, orientation, shapeAABB.lowerBound, shapeAABB.upperBound); if(i === 0){ aabb.copy(shapeAABB); } else { aabb.extend(shapeAABB); } } this.aabbNeedsUpdate = false; }; var uiw_m1 = new Mat3(), uiw_m2 = new Mat3(), uiw_m3 = new Mat3(); /** * Update .inertiaWorld and .invInertiaWorld * @method updateInertiaWorld */ Body.prototype.updateInertiaWorld = function(force){ var I = this.invInertia; if (I.x === I.y && I.y === I.z && !force) { // If inertia M = s*I, where I is identity and s a scalar, then // R*M*R' = R*(s*I)*R' = s*R*I*R' = s*R*R' = s*I = M // where R is the rotation matrix. // In other words, we don't have to transform the inertia if all // inertia diagonal entries are equal. } else { var m1 = uiw_m1, m2 = uiw_m2, m3 = uiw_m3; m1.setRotationFromQuaternion(this.quaternion); m1.transpose(m2); m1.scale(I,m1); m1.mmult(m2,this.invInertiaWorld); //m3.getTrace(this.invInertiaWorld); } /* this.quaternion.vmult(this.inertia,this.inertiaWorld); this.quaternion.vmult(this.invInertia,this.invInertiaWorld); */ }; /** * Apply force to a world point. This could for example be a point on the Body surface. Applying force this way will add to Body.force and Body.torque. * @method applyForce * @param {Vec3} force The amount of force to add. * @param {Vec3} worldPoint A world point to apply the force on. */ var Body_applyForce_r = new Vec3(); var Body_applyForce_rotForce = new Vec3(); Body.prototype.applyForce = function(force,worldPoint){ if(this.type !== Body.DYNAMIC){ return; } // Compute point position relative to the body center var r = Body_applyForce_r; worldPoint.vsub(this.position,r); // Compute produced rotational force var rotForce = Body_applyForce_rotForce; r.cross(force,rotForce); // Add linear force this.force.vadd(force,this.force); // Add rotational force this.torque.vadd(rotForce,this.torque); }; /** * Apply force to a local point in the body. * @method applyLocalForce * @param {Vec3} force The force vector to apply, defined locally in the body frame. * @param {Vec3} localPoint A local point in the body to apply the force on. */ var Body_applyLocalForce_worldForce = new Vec3(); var Body_applyLocalForce_worldPoint = new Vec3(); Body.prototype.applyLocalForce = function(localForce, localPoint){ if(this.type !== Body.DYNAMIC){ return; } var worldForce = Body_applyLocalForce_worldForce; var worldPoint = Body_applyLocalForce_worldPoint; // Transform the force vector to world space this.vectorToWorldFrame(localForce, worldForce); this.pointToWorldFrame(localPoint, worldPoint); this.applyForce(worldForce, worldPoint); }; /** * Apply impulse to a world point. This could for example be a point on the Body surface. An impulse is a force added to a body during a short period of time (impulse = force * time). Impulses will be added to Body.velocity and Body.angularVelocity. * @method applyImpulse * @param {Vec3} impulse The amount of impulse to add. * @param {Vec3} worldPoint A world point to apply the force on. */ var Body_applyImpulse_r = new Vec3(); var Body_applyImpulse_velo = new Vec3(); var Body_applyImpulse_rotVelo = new Vec3(); Body.prototype.applyImpulse = function(impulse, worldPoint){ if(this.type !== Body.DYNAMIC){ return; } // Compute point position relative to the body center var r = Body_applyImpulse_r; worldPoint.vsub(this.position,r); // Compute produced central impulse velocity var velo = Body_applyImpulse_velo; velo.copy(impulse); velo.mult(this.invMass,velo); // Add linear impulse this.velocity.vadd(velo, this.velocity); // Compute produced rotational impulse velocity var rotVelo = Body_applyImpulse_rotVelo; r.cross(impulse,rotVelo); /* rotVelo.x *= this.invInertia.x; rotVelo.y *= this.invInertia.y; rotVelo.z *= this.invInertia.z; */ this.invInertiaWorld.vmult(rotVelo,rotVelo); // Add rotational Impulse this.angularVelocity.vadd(rotVelo, this.angularVelocity); }; /** * Apply locally-defined impulse to a local point in the body. * @method applyLocalImpulse * @param {Vec3} force The force vector to apply, defined locally in the body frame. * @param {Vec3} localPoint A local point in the body to apply the force on. */ var Body_applyLocalImpulse_worldImpulse = new Vec3(); var Body_applyLocalImpulse_worldPoint = new Vec3(); Body.prototype.applyLocalImpulse = function(localImpulse, localPoint){ if(this.type !== Body.DYNAMIC){ return; } var worldImpulse = Body_applyLocalImpulse_worldImpulse; var worldPoint = Body_applyLocalImpulse_worldPoint; // Transform the force vector to world space this.vectorToWorldFrame(localImpulse, worldImpulse); this.pointToWorldFrame(localPoint, worldPoint); this.applyImpulse(worldImpulse, worldPoint); }; var Body_updateMassProperties_halfExtents = new Vec3(); /** * Should be called whenever you change the body shape or mass. * @method updateMassProperties */ Body.prototype.updateMassProperties = function(){ var halfExtents = Body_updateMassProperties_halfExtents; this.invMass = this.mass > 0 ? 1.0 / this.mass : 0; var I = this.inertia; var fixed = this.fixedRotation; // Approximate with AABB box this.computeAABB(); halfExtents.set( (this.aabb.upperBound.x-this.aabb.lowerBound.x) / 2, (this.aabb.upperBound.y-this.aabb.lowerBound.y) / 2, (this.aabb.upperBound.z-this.aabb.lowerBound.z) / 2 ); Box.calculateInertia(halfExtents, this.mass, I); this.invInertia.set( I.x > 0 && !fixed ? 1.0 / I.x : 0, I.y > 0 && !fixed ? 1.0 / I.y : 0, I.z > 0 && !fixed ? 1.0 / I.z : 0 ); this.updateInertiaWorld(true); }; /** * Get world velocity of a point in the body. * @method getVelocityAtWorldPoint * @param {Vec3} worldPoint * @param {Vec3} result * @return {Vec3} The result vector. */ Body.prototype.getVelocityAtWorldPoint = function(worldPoint, result){ var r = new Vec3(); worldPoint.vsub(this.position, r); this.angularVelocity.cross(r, result); this.velocity.vadd(result, result); return result; }; },{"../collision/AABB":3,"../material/Material":25,"../math/Mat3":27,"../math/Quaternion":28,"../math/Vec3":30,"../shapes/Box":37,"../shapes/Shape":43,"../utils/EventTarget":49}],32:[function(_dereq_,module,exports){ var Body = _dereq_('./Body'); var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var RaycastResult = _dereq_('../collision/RaycastResult'); var Ray = _dereq_('../collision/Ray'); var WheelInfo = _dereq_('../objects/WheelInfo'); module.exports = RaycastVehicle; /** * Vehicle helper class that casts rays from the wheel positions towards the ground and applies forces. * @class RaycastVehicle * @constructor * @param {object} [options] * @param {Body} [options.chassisBody] The car chassis body. * @param {integer} [options.indexRightAxis] Axis to use for right. x=0, y=1, z=2 * @param {integer} [options.indexLeftAxis] * @param {integer} [options.indexUpAxis] */ function RaycastVehicle(options){ /** * @property {Body} chassisBody */ this.chassisBody = options.chassisBody; /** * An array of WheelInfo objects. * @property {array} wheelInfos */ this.wheelInfos = []; /** * Will be set to true if the car is sliding. * @property {boolean} sliding */ this.sliding = false; /** * @property {World} world */ this.world = null; /** * Index of the right axis, 0=x, 1=y, 2=z * @property {integer} indexRightAxis * @default 1 */ this.indexRightAxis = typeof(options.indexRightAxis) !== 'undefined' ? options.indexRightAxis : 1; /** * Index of the forward axis, 0=x, 1=y, 2=z * @property {integer} indexForwardAxis * @default 0 */ this.indexForwardAxis = typeof(options.indexForwardAxis) !== 'undefined' ? options.indexForwardAxis : 0; /** * Index of the up axis, 0=x, 1=y, 2=z * @property {integer} indexUpAxis * @default 2 */ this.indexUpAxis = typeof(options.indexUpAxis) !== 'undefined' ? options.indexUpAxis : 2; } var tmpVec1 = new Vec3(); var tmpVec2 = new Vec3(); var tmpVec3 = new Vec3(); var tmpVec4 = new Vec3(); var tmpVec5 = new Vec3(); var tmpVec6 = new Vec3(); var tmpRay = new Ray(); /** * Add a wheel. For information about the options, see WheelInfo. * @method addWheel * @param {object} [options] */ RaycastVehicle.prototype.addWheel = function(options){ options = options || {}; var info = new WheelInfo(options); var index = this.wheelInfos.length; this.wheelInfos.push(info); return index; }; /** * Set the steering value of a wheel. * @method setSteeringValue * @param {number} value * @param {integer} wheelIndex */ RaycastVehicle.prototype.setSteeringValue = function(value, wheelIndex){ var wheel = this.wheelInfos[wheelIndex]; wheel.steering = value; }; var torque = new Vec3(); /** * Set the wheel force to apply on one of the wheels each time step * @method applyEngineForce * @param {number} value * @param {integer} wheelIndex */ RaycastVehicle.prototype.applyEngineForce = function(value, wheelIndex){ this.wheelInfos[wheelIndex].engineForce = value; }; /** * Set the braking force of a wheel * @method setBrake * @param {number} brake * @param {integer} wheelIndex */ RaycastVehicle.prototype.setBrake = function(brake, wheelIndex){ this.wheelInfos[wheelIndex].brake = brake; }; /** * Add the vehicle including its constraints to the world. * @method addToWorld * @param {World} world */ RaycastVehicle.prototype.addToWorld = function(world){ var constraints = this.constraints; world.add(this.chassisBody); var that = this; this.preStepCallback = function(){ that.updateVehicle(world.dt); }; world.addEventListener('preStep', this.preStepCallback); this.world = world; }; /** * Get one of the wheel axles, world-oriented. * @private * @method getVehicleAxisWorld * @param {integer} axisIndex * @param {Vec3} result */ RaycastVehicle.prototype.getVehicleAxisWorld = function(axisIndex, result){ result.set( axisIndex === 0 ? 1 : 0, axisIndex === 1 ? 1 : 0, axisIndex === 2 ? 1 : 0 ); this.chassisBody.vectorToWorldFrame(result, result); }; RaycastVehicle.prototype.updateVehicle = function(timeStep){ var wheelInfos = this.wheelInfos; var numWheels = wheelInfos.length; var chassisBody = this.chassisBody; for (var i = 0; i < numWheels; i++) { this.updateWheelTransform(i); } this.currentVehicleSpeedKmHour = 3.6 * chassisBody.velocity.norm(); var forwardWorld = new Vec3(); this.getVehicleAxisWorld(this.indexForwardAxis, forwardWorld); if (forwardWorld.dot(chassisBody.velocity) < 0){ this.currentVehicleSpeedKmHour *= -1; } // simulate suspension for (var i = 0; i < numWheels; i++) { this.castRay(wheelInfos[i]); } this.updateSuspension(timeStep); var impulse = new Vec3(); var relpos = new Vec3(); for (var i = 0; i < numWheels; i++) { //apply suspension force var wheel = wheelInfos[i]; var suspensionForce = wheel.suspensionForce; if (suspensionForce > wheel.maxSuspensionForce) { suspensionForce = wheel.maxSuspensionForce; } wheel.raycastResult.hitNormalWorld.scale(suspensionForce * timeStep, impulse); wheel.raycastResult.hitPointWorld.vsub(chassisBody.position, relpos); chassisBody.applyImpulse(impulse, wheel.raycastResult.hitPointWorld/*relpos*/); } this.updateFriction(timeStep); var hitNormalWorldScaledWithProj = new Vec3(); var fwd = new Vec3(); var vel = new Vec3(); for (i = 0; i < numWheels; i++) { var wheel = wheelInfos[i]; //var relpos = new Vec3(); //wheel.chassisConnectionPointWorld.vsub(chassisBody.position, relpos); chassisBody.getVelocityAtWorldPoint(wheel.chassisConnectionPointWorld, vel); // Hack to get the rotation in the correct direction var m = 1; switch(this.indexUpAxis){ case 1: m = -1; break; } if (wheel.isInContact) { this.getVehicleAxisWorld(this.indexForwardAxis, fwd); var proj = fwd.dot(wheel.raycastResult.hitNormalWorld); wheel.raycastResult.hitNormalWorld.scale(proj, hitNormalWorldScaledWithProj); fwd.vsub(hitNormalWorldScaledWithProj, fwd); var proj2 = fwd.dot(vel); wheel.deltaRotation = m * proj2 * timeStep / wheel.radius; } if((wheel.sliding || !wheel.isInContact) && wheel.engineForce !== 0 && wheel.useCustomSlidingRotationalSpeed){ // Apply custom rotation when accelerating and sliding wheel.deltaRotation = (wheel.engineForce > 0 ? 1 : -1) * wheel.customSlidingRotationalSpeed * timeStep; } // Lock wheels if(Math.abs(wheel.brake) > Math.abs(wheel.engineForce)){ wheel.deltaRotation = 0; } wheel.rotation += wheel.deltaRotation; // Use the old value wheel.deltaRotation *= 0.99; // damping of rotation when not in contact } }; RaycastVehicle.prototype.updateSuspension = function(deltaTime) { var chassisBody = this.chassisBody; var chassisMass = chassisBody.mass; var wheelInfos = this.wheelInfos; var numWheels = wheelInfos.length; for (var w_it = 0; w_it < numWheels; w_it++){ var wheel = wheelInfos[w_it]; if (wheel.isInContact){ var force; // Spring var susp_length = wheel.suspensionRestLength; var current_length = wheel.suspensionLength; var length_diff = (susp_length - current_length); force = wheel.suspensionStiffness * length_diff * wheel.clippedInvContactDotSuspension; // Damper var projected_rel_vel = wheel.suspensionRelativeVelocity; var susp_damping; if (projected_rel_vel < 0) { susp_damping = wheel.dampingCompression; } else { susp_damping = wheel.dampingRelaxation; } force -= susp_damping * projected_rel_vel; wheel.suspensionForce = force * chassisMass; if (wheel.suspensionForce < 0) { wheel.suspensionForce = 0; } } else { wheel.suspensionForce = 0; } } }; /** * Remove the vehicle including its constraints from the world. * @method removeFromWorld * @param {World} world */ RaycastVehicle.prototype.removeFromWorld = function(world){ var constraints = this.constraints; world.remove(this.chassisBody); world.removeEventListener('preStep', this.preStepCallback); this.world = null; }; var castRay_rayvector = new Vec3(); var castRay_target = new Vec3(); RaycastVehicle.prototype.castRay = function(wheel) { var rayvector = castRay_rayvector; var target = castRay_target; this.updateWheelTransformWorld(wheel); var chassisBody = this.chassisBody; var depth = -1; var raylen = wheel.suspensionRestLength + wheel.radius; wheel.directionWorld.scale(raylen, rayvector); var source = wheel.chassisConnectionPointWorld; source.vadd(rayvector, target); var raycastResult = wheel.raycastResult; var param = 0; raycastResult.reset(); // Turn off ray collision with the chassis temporarily var oldState = chassisBody.collisionResponse; chassisBody.collisionResponse = false; // Cast ray against world this.world.rayTest(source, target, raycastResult); chassisBody.collisionResponse = oldState; var object = raycastResult.body; wheel.raycastResult.groundObject = 0; if (object) { depth = raycastResult.distance; wheel.raycastResult.hitNormalWorld = raycastResult.hitNormalWorld; wheel.isInContact = true; var hitDistance = raycastResult.distance; wheel.suspensionLength = hitDistance - wheel.radius; // clamp on max suspension travel var minSuspensionLength = wheel.suspensionRestLength - wheel.maxSuspensionTravel; var maxSuspensionLength = wheel.suspensionRestLength + wheel.maxSuspensionTravel; if (wheel.suspensionLength < minSuspensionLength) { wheel.suspensionLength = minSuspensionLength; } if (wheel.suspensionLength > maxSuspensionLength) { wheel.suspensionLength = maxSuspensionLength; wheel.raycastResult.reset(); } var denominator = wheel.raycastResult.hitNormalWorld.dot(wheel.directionWorld); var chassis_velocity_at_contactPoint = new Vec3(); chassisBody.getVelocityAtWorldPoint(wheel.raycastResult.hitPointWorld, chassis_velocity_at_contactPoint); var projVel = wheel.raycastResult.hitNormalWorld.dot( chassis_velocity_at_contactPoint ); if (denominator >= -0.1) { wheel.suspensionRelativeVelocity = 0; wheel.clippedInvContactDotSuspension = 1 / 0.1; } else { var inv = -1 / denominator; wheel.suspensionRelativeVelocity = projVel * inv; wheel.clippedInvContactDotSuspension = inv; } } else { //put wheel info as in rest position wheel.suspensionLength = wheel.suspensionRestLength + 0 * wheel.maxSuspensionTravel; wheel.suspensionRelativeVelocity = 0.0; wheel.directionWorld.scale(-1, wheel.raycastResult.hitNormalWorld); wheel.clippedInvContactDotSuspension = 1.0; } return depth; }; RaycastVehicle.prototype.updateWheelTransformWorld = function(wheel){ wheel.isInContact = false; var chassisBody = this.chassisBody; chassisBody.pointToWorldFrame(wheel.chassisConnectionPointLocal, wheel.chassisConnectionPointWorld); chassisBody.vectorToWorldFrame(wheel.directionLocal, wheel.directionWorld); chassisBody.vectorToWorldFrame(wheel.axleLocal, wheel.axleWorld); }; /** * Update one of the wheel transform. * Note when rendering wheels: during each step, wheel transforms are updated BEFORE the chassis; ie. their position becomes invalid after the step. Thus when you render wheels, you must update wheel transforms before rendering them. See raycastVehicle demo for an example. * @method updateWheelTransform * @param {integer} wheelIndex The wheel index to update. */ RaycastVehicle.prototype.updateWheelTransform = function(wheelIndex){ var up = tmpVec4; var right = tmpVec5; var fwd = tmpVec6; var wheel = this.wheelInfos[wheelIndex]; this.updateWheelTransformWorld(wheel); wheel.directionLocal.scale(-1, up); right.copy(wheel.axleLocal); up.cross(right, fwd); fwd.normalize(); right.normalize(); // Rotate around steering over the wheelAxle var steering = wheel.steering; var steeringOrn = new Quaternion(); steeringOrn.setFromAxisAngle(up, steering); var rotatingOrn = new Quaternion(); rotatingOrn.setFromAxisAngle(right, wheel.rotation); // World rotation of the wheel var q = wheel.worldTransform.quaternion; this.chassisBody.quaternion.mult(steeringOrn, q); q.mult(rotatingOrn, q); q.normalize(); // world position of the wheel var p = wheel.worldTransform.position; p.copy(wheel.directionWorld); p.scale(wheel.suspensionLength, p); p.vadd(wheel.chassisConnectionPointWorld, p); }; var directions = [ new Vec3(1, 0, 0), new Vec3(0, 1, 0), new Vec3(0, 0, 1) ]; /** * Get the world transform of one of the wheels * @method getWheelTransformWorld * @param {integer} wheelIndex * @return {Transform} */ RaycastVehicle.prototype.getWheelTransformWorld = function(wheelIndex) { return this.wheelInfos[wheelIndex].worldTransform; }; var updateFriction_surfNormalWS_scaled_proj = new Vec3(); var updateFriction_axle = []; var updateFriction_forwardWS = []; var sideFrictionStiffness2 = 1; RaycastVehicle.prototype.updateFriction = function(timeStep) { var surfNormalWS_scaled_proj = updateFriction_surfNormalWS_scaled_proj; //calculate the impulse, so that the wheels don't move sidewards var wheelInfos = this.wheelInfos; var numWheels = wheelInfos.length; var chassisBody = this.chassisBody; var forwardWS = updateFriction_forwardWS; var axle = updateFriction_axle; var numWheelsOnGround = 0; for (var i = 0; i < numWheels; i++) { var wheel = wheelInfos[i]; var groundObject = wheel.raycastResult.body; if (groundObject){ numWheelsOnGround++; } wheel.sideImpulse = 0; wheel.forwardImpulse = 0; if(!forwardWS[i]){ forwardWS[i] = new Vec3(); } if(!axle[i]){ axle[i] = new Vec3(); } } for (var i = 0; i < numWheels; i++){ var wheel = wheelInfos[i]; var groundObject = wheel.raycastResult.body; if (groundObject) { var axlei = axle[i]; var wheelTrans = this.getWheelTransformWorld(i); // Get world axle wheelTrans.vectorToWorldFrame(directions[this.indexRightAxis], axlei); var surfNormalWS = wheel.raycastResult.hitNormalWorld; var proj = axlei.dot(surfNormalWS); surfNormalWS.scale(proj, surfNormalWS_scaled_proj); axlei.vsub(surfNormalWS_scaled_proj, axlei); axlei.normalize(); surfNormalWS.cross(axlei, forwardWS[i]); forwardWS[i].normalize(); wheel.sideImpulse = resolveSingleBilateral( chassisBody, wheel.raycastResult.hitPointWorld, groundObject, wheel.raycastResult.hitPointWorld, axlei ); wheel.sideImpulse *= sideFrictionStiffness2; } } var sideFactor = 1; var fwdFactor = 0.5; this.sliding = false; for (var i = 0; i < numWheels; i++) { var wheel = wheelInfos[i]; var groundObject = wheel.raycastResult.body; var rollingFriction = 0; wheel.slipInfo = 1; if (groundObject) { var defaultRollingFrictionImpulse = 0; var maxImpulse = wheel.brake ? wheel.brake : defaultRollingFrictionImpulse; // btWheelContactPoint contactPt(chassisBody,groundObject,wheelInfraycastInfo.hitPointWorld,forwardWS[wheel],maxImpulse); // rollingFriction = calcRollingFriction(contactPt); rollingFriction = calcRollingFriction(chassisBody, groundObject, wheel.raycastResult.hitPointWorld, forwardWS[i], maxImpulse); rollingFriction += wheel.engineForce * timeStep; // rollingFriction = 0; var factor = maxImpulse / rollingFriction; wheel.slipInfo *= factor; } //switch between active rolling (throttle), braking and non-active rolling friction (nthrottle/break) wheel.forwardImpulse = 0; wheel.skidInfo = 1; if (groundObject) { wheel.skidInfo = 1; var maximp = wheel.suspensionForce * timeStep * wheel.frictionSlip; var maximpSide = maximp; var maximpSquared = maximp * maximpSide; wheel.forwardImpulse = rollingFriction;//wheelInfo.engineForce* timeStep; var x = wheel.forwardImpulse * fwdFactor; var y = wheel.sideImpulse * sideFactor; var impulseSquared = x * x + y * y; wheel.sliding = false; if (impulseSquared > maximpSquared) { this.sliding = true; wheel.sliding = true; var factor = maximp / Math.sqrt(impulseSquared); wheel.skidInfo *= factor; } } } if (this.sliding) { for (var i = 0; i < numWheels; i++) { var wheel = wheelInfos[i]; if (wheel.sideImpulse !== 0) { if (wheel.skidInfo < 1){ wheel.forwardImpulse *= wheel.skidInfo; wheel.sideImpulse *= wheel.skidInfo; } } } } // apply the impulses for (var i = 0; i < numWheels; i++) { var wheel = wheelInfos[i]; var rel_pos = new Vec3(); //wheel.raycastResult.hitPointWorld.vsub(chassisBody.position, rel_pos); // cannons applyimpulse is using world coord for the position rel_pos.copy(wheel.raycastResult.hitPointWorld); if (wheel.forwardImpulse !== 0) { var impulse = new Vec3(); forwardWS[i].scale(wheel.forwardImpulse, impulse); chassisBody.applyImpulse(impulse, rel_pos); } if (wheel.sideImpulse !== 0){ var groundObject = wheel.raycastResult.body; var rel_pos2 = new Vec3(); //wheel.raycastResult.hitPointWorld.vsub(groundObject.position, rel_pos2); rel_pos2.copy(wheel.raycastResult.hitPointWorld); var sideImp = new Vec3(); axle[i].scale(wheel.sideImpulse, sideImp); // Scale the relative position in the up direction with rollInfluence. // If rollInfluence is 1, the impulse will be applied on the hitPoint (easy to roll over), if it is zero it will be applied in the same plane as the center of mass (not easy to roll over). chassisBody.pointToLocalFrame(rel_pos, rel_pos); rel_pos['xyz'[this.indexUpAxis]] *= wheel.rollInfluence; chassisBody.pointToWorldFrame(rel_pos, rel_pos); chassisBody.applyImpulse(sideImp, rel_pos); //apply friction impulse on the ground sideImp.scale(-1, sideImp); groundObject.applyImpulse(sideImp, rel_pos2); } } }; var calcRollingFriction_vel1 = new Vec3(); var calcRollingFriction_vel2 = new Vec3(); var calcRollingFriction_vel = new Vec3(); function calcRollingFriction(body0, body1, frictionPosWorld, frictionDirectionWorld, maxImpulse) { var j1 = 0; var contactPosWorld = frictionPosWorld; // var rel_pos1 = new Vec3(); // var rel_pos2 = new Vec3(); var vel1 = calcRollingFriction_vel1; var vel2 = calcRollingFriction_vel2; var vel = calcRollingFriction_vel; // contactPosWorld.vsub(body0.position, rel_pos1); // contactPosWorld.vsub(body1.position, rel_pos2); body0.getVelocityAtWorldPoint(contactPosWorld, vel1); body1.getVelocityAtWorldPoint(contactPosWorld, vel2); vel1.vsub(vel2, vel); var vrel = frictionDirectionWorld.dot(vel); var denom0 = computeImpulseDenominator(body0, frictionPosWorld, frictionDirectionWorld); var denom1 = computeImpulseDenominator(body1, frictionPosWorld, frictionDirectionWorld); var relaxation = 1; var jacDiagABInv = relaxation / (denom0 + denom1); // calculate j that moves us to zero relative velocity j1 = -vrel * jacDiagABInv; if (maxImpulse < j1) { j1 = maxImpulse; } if (j1 < -maxImpulse) { j1 = -maxImpulse; } return j1; } var computeImpulseDenominator_r0 = new Vec3(); var computeImpulseDenominator_c0 = new Vec3(); var computeImpulseDenominator_vec = new Vec3(); var computeImpulseDenominator_m = new Vec3(); function computeImpulseDenominator(body, pos, normal) { var r0 = computeImpulseDenominator_r0; var c0 = computeImpulseDenominator_c0; var vec = computeImpulseDenominator_vec; var m = computeImpulseDenominator_m; pos.vsub(body.position, r0); r0.cross(normal, c0); body.invInertiaWorld.vmult(c0, m); m.cross(r0, vec); return body.invMass + normal.dot(vec); } var resolveSingleBilateral_vel1 = new Vec3(); var resolveSingleBilateral_vel2 = new Vec3(); var resolveSingleBilateral_vel = new Vec3(); //bilateral constraint between two dynamic objects function resolveSingleBilateral(body1, pos1, body2, pos2, normal, impulse){ var normalLenSqr = normal.norm2(); if (normalLenSqr > 1.1){ return 0; // no impulse } // var rel_pos1 = new Vec3(); // var rel_pos2 = new Vec3(); // pos1.vsub(body1.position, rel_pos1); // pos2.vsub(body2.position, rel_pos2); var vel1 = resolveSingleBilateral_vel1; var vel2 = resolveSingleBilateral_vel2; var vel = resolveSingleBilateral_vel; body1.getVelocityAtWorldPoint(pos1, vel1); body2.getVelocityAtWorldPoint(pos2, vel2); vel1.vsub(vel2, vel); var rel_vel = normal.dot(vel); var contactDamping = 0.2; var massTerm = 1 / (body1.invMass + body2.invMass); var impulse = - contactDamping * rel_vel * massTerm; return impulse; } },{"../collision/Ray":9,"../collision/RaycastResult":10,"../math/Quaternion":28,"../math/Vec3":30,"../objects/WheelInfo":36,"./Body":31}],33:[function(_dereq_,module,exports){ var Body = _dereq_('./Body'); var Sphere = _dereq_('../shapes/Sphere'); var Box = _dereq_('../shapes/Box'); var Vec3 = _dereq_('../math/Vec3'); var HingeConstraint = _dereq_('../constraints/HingeConstraint'); module.exports = RigidVehicle; /** * Simple vehicle helper class with spherical rigid body wheels. * @class RigidVehicle * @constructor * @param {Body} [options.chassisBody] */ function RigidVehicle(options){ this.wheelBodies = []; /** * @property coordinateSystem * @type {Vec3} */ this.coordinateSystem = typeof(options.coordinateSystem)==='undefined' ? new Vec3(1, 2, 3) : options.coordinateSystem.clone(); /** * @property {Body} chassisBody */ this.chassisBody = options.chassisBody; if(!this.chassisBody){ // No chassis body given. Create it! var chassisShape = new Box(new Vec3(5, 2, 0.5)); this.chassisBody = new Body(1, chassisShape); } /** * @property constraints * @type {Array} */ this.constraints = []; this.wheelAxes = []; this.wheelForces = []; } /** * Add a wheel * @method addWheel * @param {object} options * @param {boolean} [options.isFrontWheel] * @param {Vec3} [options.position] Position of the wheel, locally in the chassis body. * @param {Vec3} [options.direction] Slide direction of the wheel along the suspension. * @param {Vec3} [options.axis] Axis of rotation of the wheel, locally defined in the chassis. * @param {Body} [options.body] The wheel body. */ RigidVehicle.prototype.addWheel = function(options){ options = options || {}; var wheelBody = options.body; if(!wheelBody){ wheelBody = new Body(1, new Sphere(1.2)); } this.wheelBodies.push(wheelBody); this.wheelForces.push(0); // Position constrain wheels var zero = new Vec3(); var position = typeof(options.position) !== 'undefined' ? options.position.clone() : new Vec3(); // Set position locally to the chassis var worldPosition = new Vec3(); this.chassisBody.pointToWorldFrame(position, worldPosition); wheelBody.position.set(worldPosition.x, worldPosition.y, worldPosition.z); // Constrain wheel var axis = typeof(options.axis) !== 'undefined' ? options.axis.clone() : new Vec3(0, 1, 0); this.wheelAxes.push(axis); var hingeConstraint = new HingeConstraint(this.chassisBody, wheelBody, { pivotA: position, axisA: axis, pivotB: Vec3.ZERO, axisB: axis, collideConnected: false }); this.constraints.push(hingeConstraint); return this.wheelBodies.length - 1; }; /** * Set the steering value of a wheel. * @method setSteeringValue * @param {number} value * @param {integer} wheelIndex * @todo check coordinateSystem */ RigidVehicle.prototype.setSteeringValue = function(value, wheelIndex){ // Set angle of the hinge axis var axis = this.wheelAxes[wheelIndex]; var c = Math.cos(value), s = Math.sin(value), x = axis.x, y = axis.y; this.constraints[wheelIndex].axisA.set( c*x -s*y, s*x +c*y, 0 ); }; /** * Set the target rotational speed of the hinge constraint. * @method setMotorSpeed * @param {number} value * @param {integer} wheelIndex */ RigidVehicle.prototype.setMotorSpeed = function(value, wheelIndex){ var hingeConstraint = this.constraints[wheelIndex]; hingeConstraint.enableMotor(); hingeConstraint.motorTargetVelocity = value; }; /** * Set the target rotational speed of the hinge constraint. * @method disableMotor * @param {number} value * @param {integer} wheelIndex */ RigidVehicle.prototype.disableMotor = function(wheelIndex){ var hingeConstraint = this.constraints[wheelIndex]; hingeConstraint.disableMotor(); }; var torque = new Vec3(); /** * Set the wheel force to apply on one of the wheels each time step * @method setWheelForce * @param {number} value * @param {integer} wheelIndex */ RigidVehicle.prototype.setWheelForce = function(value, wheelIndex){ this.wheelForces[wheelIndex] = value; }; /** * Apply a torque on one of the wheels. * @method applyWheelForce * @param {number} value * @param {integer} wheelIndex */ RigidVehicle.prototype.applyWheelForce = function(value, wheelIndex){ var axis = this.wheelAxes[wheelIndex]; var wheelBody = this.wheelBodies[wheelIndex]; var bodyTorque = wheelBody.torque; axis.scale(value, torque); wheelBody.vectorToWorldFrame(torque, torque); bodyTorque.vadd(torque, bodyTorque); }; /** * Add the vehicle including its constraints to the world. * @method addToWorld * @param {World} world */ RigidVehicle.prototype.addToWorld = function(world){ var constraints = this.constraints; var bodies = this.wheelBodies.concat([this.chassisBody]); for (var i = 0; i < bodies.length; i++) { world.add(bodies[i]); } for (var i = 0; i < constraints.length; i++) { world.addConstraint(constraints[i]); } world.addEventListener('preStep', this._update.bind(this)); }; RigidVehicle.prototype._update = function(){ var wheelForces = this.wheelForces; for (var i = 0; i < wheelForces.length; i++) { this.applyWheelForce(wheelForces[i], i); } }; /** * Remove the vehicle including its constraints from the world. * @method removeFromWorld * @param {World} world */ RigidVehicle.prototype.removeFromWorld = function(world){ var constraints = this.constraints; var bodies = this.wheelBodies.concat([this.chassisBody]); for (var i = 0; i < bodies.length; i++) { world.remove(bodies[i]); } for (var i = 0; i < constraints.length; i++) { world.removeConstraint(constraints[i]); } }; var worldAxis = new Vec3(); /** * Get current rotational velocity of a wheel * @method getWheelSpeed * @param {integer} wheelIndex */ RigidVehicle.prototype.getWheelSpeed = function(wheelIndex){ var axis = this.wheelAxes[wheelIndex]; var wheelBody = this.wheelBodies[wheelIndex]; var w = wheelBody.angularVelocity; this.chassisBody.vectorToWorldFrame(axis, worldAxis); return w.dot(worldAxis); }; },{"../constraints/HingeConstraint":15,"../math/Vec3":30,"../shapes/Box":37,"../shapes/Sphere":44,"./Body":31}],34:[function(_dereq_,module,exports){ module.exports = SPHSystem; var Shape = _dereq_('../shapes/Shape'); var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var Particle = _dereq_('../shapes/Particle'); var Body = _dereq_('../objects/Body'); var Material = _dereq_('../material/Material'); /** * Smoothed-particle hydrodynamics system * @class SPHSystem * @constructor */ function SPHSystem(){ this.particles = []; /** * Density of the system (kg/m3). * @property {number} density */ this.density = 1; /** * Distance below which two particles are considered to be neighbors. * It should be adjusted so there are about 15-20 neighbor particles within this radius. * @property {number} smoothingRadius */ this.smoothingRadius = 1; this.speedOfSound = 1; /** * Viscosity of the system. * @property {number} viscosity */ this.viscosity = 0.01; this.eps = 0.000001; // Stuff Computed per particle this.pressures = []; this.densities = []; this.neighbors = []; } /** * Add a particle to the system. * @method add * @param {Body} particle */ SPHSystem.prototype.add = function(particle){ this.particles.push(particle); if(this.neighbors.length < this.particles.length){ this.neighbors.push([]); } }; /** * Remove a particle from the system. * @method remove * @param {Body} particle */ SPHSystem.prototype.remove = function(particle){ var idx = this.particles.indexOf(particle); if(idx !== -1){ this.particles.splice(idx,1); if(this.neighbors.length > this.particles.length){ this.neighbors.pop(); } } }; /** * Get neighbors within smoothing volume, save in the array neighbors * @method getNeighbors * @param {Body} particle * @param {Array} neighbors */ var SPHSystem_getNeighbors_dist = new Vec3(); SPHSystem.prototype.getNeighbors = function(particle,neighbors){ var N = this.particles.length, id = particle.id, R2 = this.smoothingRadius * this.smoothingRadius, dist = SPHSystem_getNeighbors_dist; for(var i=0; i!==N; i++){ var p = this.particles[i]; p.position.vsub(particle.position,dist); if(id!==p.id && dist.norm2() < R2){ neighbors.push(p); } } }; // Temp vectors for calculation var SPHSystem_update_dist = new Vec3(), SPHSystem_update_a_pressure = new Vec3(), SPHSystem_update_a_visc = new Vec3(), SPHSystem_update_gradW = new Vec3(), SPHSystem_update_r_vec = new Vec3(), SPHSystem_update_u = new Vec3(); // Relative velocity SPHSystem.prototype.update = function(){ var N = this.particles.length, dist = SPHSystem_update_dist, cs = this.speedOfSound, eps = this.eps; for(var i=0; i!==N; i++){ var p = this.particles[i]; // Current particle var neighbors = this.neighbors[i]; // Get neighbors neighbors.length = 0; this.getNeighbors(p,neighbors); neighbors.push(this.particles[i]); // Add current too var numNeighbors = neighbors.length; // Accumulate density for the particle var sum = 0.0; for(var j=0; j!==numNeighbors; j++){ //printf("Current particle has position %f %f %f\n",objects[id].pos.x(),objects[id].pos.y(),objects[id].pos.z()); p.position.vsub(neighbors[j].position, dist); var len = dist.norm(); var weight = this.w(len); sum += neighbors[j].mass * weight; } // Save this.densities[i] = sum; this.pressures[i] = cs * cs * (this.densities[i] - this.density); } // Add forces // Sum to these accelerations var a_pressure= SPHSystem_update_a_pressure; var a_visc = SPHSystem_update_a_visc; var gradW = SPHSystem_update_gradW; var r_vec = SPHSystem_update_r_vec; var u = SPHSystem_update_u; for(var i=0; i!==N; i++){ var particle = this.particles[i]; a_pressure.set(0,0,0); a_visc.set(0,0,0); // Init vars var Pij; var nabla; var Vij; // Sum up for all other neighbors var neighbors = this.neighbors[i]; var numNeighbors = neighbors.length; //printf("Neighbors: "); for(var j=0; j!==numNeighbors; j++){ var neighbor = neighbors[j]; //printf("%d ",nj); // Get r once for all.. particle.position.vsub(neighbor.position,r_vec); var r = r_vec.norm(); // Pressure contribution Pij = -neighbor.mass * (this.pressures[i] / (this.densities[i]*this.densities[i] + eps) + this.pressures[j] / (this.densities[j]*this.densities[j] + eps)); this.gradw(r_vec, gradW); // Add to pressure acceleration gradW.mult(Pij , gradW); a_pressure.vadd(gradW, a_pressure); // Viscosity contribution neighbor.velocity.vsub(particle.velocity, u); u.mult( 1.0 / (0.0001+this.densities[i] * this.densities[j]) * this.viscosity * neighbor.mass , u ); nabla = this.nablaw(r); u.mult(nabla,u); // Add to viscosity acceleration a_visc.vadd( u, a_visc ); } // Calculate force a_visc.mult(particle.mass, a_visc); a_pressure.mult(particle.mass, a_pressure); // Add force to particles particle.force.vadd(a_visc, particle.force); particle.force.vadd(a_pressure, particle.force); } }; // Calculate the weight using the W(r) weightfunction SPHSystem.prototype.w = function(r){ // 315 var h = this.smoothingRadius; return 315.0/(64.0*Math.PI*Math.pow(h,9)) * Math.pow(h*h-r*r,3); }; // calculate gradient of the weight function SPHSystem.prototype.gradw = function(rVec,resultVec){ var r = rVec.norm(), h = this.smoothingRadius; rVec.mult(945.0/(32.0*Math.PI*Math.pow(h,9)) * Math.pow((h*h-r*r),2) , resultVec); }; // Calculate nabla(W) SPHSystem.prototype.nablaw = function(r){ var h = this.smoothingRadius; var nabla = 945.0/(32.0*Math.PI*Math.pow(h,9)) * (h*h-r*r)*(7*r*r - 3*h*h); return nabla; }; },{"../material/Material":25,"../math/Quaternion":28,"../math/Vec3":30,"../objects/Body":31,"../shapes/Particle":41,"../shapes/Shape":43}],35:[function(_dereq_,module,exports){ var Vec3 = _dereq_('../math/Vec3'); module.exports = Spring; /** * A spring, connecting two bodies. * * @class Spring * @constructor * @param {Body} bodyA * @param {Body} bodyB * @param {Object} [options] * @param {number} [options.restLength] A number > 0. Default: 1 * @param {number} [options.stiffness] A number >= 0. Default: 100 * @param {number} [options.damping] A number >= 0. Default: 1 * @param {Vec3} [options.worldAnchorA] Where to hook the spring to body A, in world coordinates. * @param {Vec3} [options.worldAnchorB] * @param {Vec3} [options.localAnchorA] Where to hook the spring to body A, in local body coordinates. * @param {Vec3} [options.localAnchorB] */ function Spring(bodyA,bodyB,options){ options = options || {}; /** * Rest length of the spring. * @property restLength * @type {number} */ this.restLength = typeof(options.restLength) === "number" ? options.restLength : 1; /** * Stiffness of the spring. * @property stiffness * @type {number} */ this.stiffness = options.stiffness || 100; /** * Damping of the spring. * @property damping * @type {number} */ this.damping = options.damping || 1; /** * First connected body. * @property bodyA * @type {Body} */ this.bodyA = bodyA; /** * Second connected body. * @property bodyB * @type {Body} */ this.bodyB = bodyB; /** * Anchor for bodyA in local bodyA coordinates. * @property localAnchorA * @type {Vec3} */ this.localAnchorA = new Vec3(); /** * Anchor for bodyB in local bodyB coordinates. * @property localAnchorB * @type {Vec3} */ this.localAnchorB = new Vec3(); if(options.localAnchorA){ this.localAnchorA.copy(options.localAnchorA); } if(options.localAnchorB){ this.localAnchorB.copy(options.localAnchorB); } if(options.worldAnchorA){ this.setWorldAnchorA(options.worldAnchorA); } if(options.worldAnchorB){ this.setWorldAnchorB(options.worldAnchorB); } } /** * Set the anchor point on body A, using world coordinates. * @method setWorldAnchorA * @param {Vec3} worldAnchorA */ Spring.prototype.setWorldAnchorA = function(worldAnchorA){ this.bodyA.pointToLocalFrame(worldAnchorA,this.localAnchorA); }; /** * Set the anchor point on body B, using world coordinates. * @method setWorldAnchorB * @param {Vec3} worldAnchorB */ Spring.prototype.setWorldAnchorB = function(worldAnchorB){ this.bodyB.pointToLocalFrame(worldAnchorB,this.localAnchorB); }; /** * Get the anchor point on body A, in world coordinates. * @method getWorldAnchorA * @param {Vec3} result The vector to store the result in. */ Spring.prototype.getWorldAnchorA = function(result){ this.bodyA.pointToWorldFrame(this.localAnchorA,result); }; /** * Get the anchor point on body B, in world coordinates. * @method getWorldAnchorB * @param {Vec3} result The vector to store the result in. */ Spring.prototype.getWorldAnchorB = function(result){ this.bodyB.pointToWorldFrame(this.localAnchorB,result); }; var applyForce_r = new Vec3(), applyForce_r_unit = new Vec3(), applyForce_u = new Vec3(), applyForce_f = new Vec3(), applyForce_worldAnchorA = new Vec3(), applyForce_worldAnchorB = new Vec3(), applyForce_ri = new Vec3(), applyForce_rj = new Vec3(), applyForce_ri_x_f = new Vec3(), applyForce_rj_x_f = new Vec3(), applyForce_tmp = new Vec3(); /** * Apply the spring force to the connected bodies. * @method applyForce */ Spring.prototype.applyForce = function(){ var k = this.stiffness, d = this.damping, l = this.restLength, bodyA = this.bodyA, bodyB = this.bodyB, r = applyForce_r, r_unit = applyForce_r_unit, u = applyForce_u, f = applyForce_f, tmp = applyForce_tmp; var worldAnchorA = applyForce_worldAnchorA, worldAnchorB = applyForce_worldAnchorB, ri = applyForce_ri, rj = applyForce_rj, ri_x_f = applyForce_ri_x_f, rj_x_f = applyForce_rj_x_f; // Get world anchors this.getWorldAnchorA(worldAnchorA); this.getWorldAnchorB(worldAnchorB); // Get offset points worldAnchorA.vsub(bodyA.position,ri); worldAnchorB.vsub(bodyB.position,rj); // Compute distance vector between world anchor points worldAnchorB.vsub(worldAnchorA,r); var rlen = r.norm(); r_unit.copy(r); r_unit.normalize(); // Compute relative velocity of the anchor points, u bodyB.velocity.vsub(bodyA.velocity,u); // Add rotational velocity bodyB.angularVelocity.cross(rj,tmp); u.vadd(tmp,u); bodyA.angularVelocity.cross(ri,tmp); u.vsub(tmp,u); // F = - k * ( x - L ) - D * ( u ) r_unit.mult(-k*(rlen-l) - d*u.dot(r_unit), f); // Add forces to bodies bodyA.force.vsub(f,bodyA.force); bodyB.force.vadd(f,bodyB.force); // Angular force ri.cross(f,ri_x_f); rj.cross(f,rj_x_f); bodyA.torque.vsub(ri_x_f,bodyA.torque); bodyB.torque.vadd(rj_x_f,bodyB.torque); }; },{"../math/Vec3":30}],36:[function(_dereq_,module,exports){ var Vec3 = _dereq_('../math/Vec3'); var Transform = _dereq_('../math/Transform'); var RaycastResult = _dereq_('../collision/RaycastResult'); var Utils = _dereq_('../utils/Utils'); module.exports = WheelInfo; /** * @class WheelInfo * @constructor * @param {Object} [options] * * @param {Vec3} [options.chassisConnectionPointLocal] * @param {Vec3} [options.chassisConnectionPointWorld] * @param {Vec3} [options.directionLocal] * @param {Vec3} [options.directionWorld] * @param {Vec3} [options.axleLocal] * @param {Vec3} [options.axleWorld] * @param {number} [options.suspensionRestLength=1] * @param {number} [options.suspensionMaxLength=2] * @param {number} [options.radius=1] * @param {number} [options.suspensionStiffness=100] * @param {number} [options.dampingCompression=10] * @param {number} [options.dampingRelaxation=10] * @param {number} [options.frictionSlip=10000] * @param {number} [options.steering=0] * @param {number} [options.rotation=0] * @param {number} [options.deltaRotation=0] * @param {number} [options.rollInfluence=0.01] * @param {number} [options.maxSuspensionForce] * @param {boolean} [options.isFrontWheel=true] * @param {number} [options.clippedInvContactDotSuspension=1] * @param {number} [options.suspensionRelativeVelocity=0] * @param {number} [options.suspensionForce=0] * @param {number} [options.skidInfo=0] * @param {number} [options.suspensionLength=0] * @param {number} [options.maxSuspensionTravel=1] * @param {boolean} [options.useCustomSlidingRotationalSpeed=false] * @param {number} [options.customSlidingRotationalSpeed=-0.1] */ function WheelInfo(options){ options = Utils.defaults(options, { chassisConnectionPointLocal: new Vec3(), chassisConnectionPointWorld: new Vec3(), directionLocal: new Vec3(), directionWorld: new Vec3(), axleLocal: new Vec3(), axleWorld: new Vec3(), suspensionRestLength: 1, suspensionMaxLength: 2, radius: 1, suspensionStiffness: 100, dampingCompression: 10, dampingRelaxation: 10, frictionSlip: 10000, steering: 0, rotation: 0, deltaRotation: 0, rollInfluence: 0.01, maxSuspensionForce: Number.MAX_VALUE, isFrontWheel: true, clippedInvContactDotSuspension: 1, suspensionRelativeVelocity: 0, suspensionForce: 0, skidInfo: 0, suspensionLength: 0, maxSuspensionTravel: 1, useCustomSlidingRotationalSpeed: false, customSlidingRotationalSpeed: -0.1 }); /** * Max travel distance of the suspension, in meters. * @property {number} maxSuspensionTravel */ this.maxSuspensionTravel = options.maxSuspensionTravel; /** * Speed to apply to the wheel rotation when the wheel is sliding. * @property {number} customSlidingRotationalSpeed */ this.customSlidingRotationalSpeed = options.customSlidingRotationalSpeed; /** * If the customSlidingRotationalSpeed should be used. * @property {Boolean} useCustomSlidingRotationalSpeed */ this.useCustomSlidingRotationalSpeed = options.useCustomSlidingRotationalSpeed; /** * @property {Boolean} sliding */ this.sliding = false; /** * Connection point, defined locally in the chassis body frame. * @property {Vec3} chassisConnectionPointLocal */ this.chassisConnectionPointLocal = options.chassisConnectionPointLocal.clone(); /** * @property {Vec3} chassisConnectionPointWorld */ this.chassisConnectionPointWorld = options.chassisConnectionPointWorld.clone(); /** * @property {Vec3} directionLocal */ this.directionLocal = options.directionLocal.clone(); /** * @property {Vec3} directionWorld */ this.directionWorld = options.directionWorld.clone(); /** * @property {Vec3} axleLocal */ this.axleLocal = options.axleLocal.clone(); /** * @property {Vec3} axleWorld */ this.axleWorld = options.axleWorld.clone(); /** * @property {number} suspensionRestLength */ this.suspensionRestLength = options.suspensionRestLength; /** * @property {number} suspensionMaxLength */ this.suspensionMaxLength = options.suspensionMaxLength; /** * @property {number} radius */ this.radius = options.radius; /** * @property {number} suspensionStiffness */ this.suspensionStiffness = options.suspensionStiffness; /** * @property {number} dampingCompression */ this.dampingCompression = options.dampingCompression; /** * @property {number} dampingRelaxation */ this.dampingRelaxation = options.dampingRelaxation; /** * @property {number} frictionSlip */ this.frictionSlip = options.frictionSlip; /** * @property {number} steering */ this.steering = 0; /** * Rotation value, in radians. * @property {number} rotation */ this.rotation = 0; /** * @property {number} deltaRotation */ this.deltaRotation = 0; /** * @property {number} rollInfluence */ this.rollInfluence = options.rollInfluence; /** * @property {number} maxSuspensionForce */ this.maxSuspensionForce = options.maxSuspensionForce; /** * @property {number} engineForce */ this.engineForce = 0; /** * @property {number} brake */ this.brake = 0; /** * @property {number} isFrontWheel */ this.isFrontWheel = options.isFrontWheel; /** * @property {number} clippedInvContactDotSuspension */ this.clippedInvContactDotSuspension = 1; /** * @property {number} suspensionRelativeVelocity */ this.suspensionRelativeVelocity = 0; /** * @property {number} suspensionForce */ this.suspensionForce = 0; /** * @property {number} skidInfo */ this.skidInfo = 0; /** * @property {number} suspensionLength */ this.suspensionLength = 0; /** * @property {number} sideImpulse */ this.sideImpulse = 0; /** * @property {number} forwardImpulse */ this.forwardImpulse = 0; /** * The result from raycasting * @property {RaycastResult} raycastResult */ this.raycastResult = new RaycastResult(); /** * Wheel world transform * @property {Transform} worldTransform */ this.worldTransform = new Transform(); /** * @property {boolean} isInContact */ this.isInContact = false; } var chassis_velocity_at_contactPoint = new Vec3(); var relpos = new Vec3(); var chassis_velocity_at_contactPoint = new Vec3(); WheelInfo.prototype.updateWheel = function(chassis){ var raycastResult = this.raycastResult; if (this.isInContact){ var project= raycastResult.hitNormalWorld.dot(raycastResult.directionWorld); raycastResult.hitPointWorld.vsub(chassis.position, relpos); chassis.getVelocityAtWorldPoint(relpos, chassis_velocity_at_contactPoint); var projVel = raycastResult.hitNormalWorld.dot( chassis_velocity_at_contactPoint ); if (project >= -0.1) { this.suspensionRelativeVelocity = 0.0; this.clippedInvContactDotSuspension = 1.0 / 0.1; } else { var inv = -1 / project; this.suspensionRelativeVelocity = projVel * inv; this.clippedInvContactDotSuspension = inv; } } else { // Not in contact : position wheel in a nice (rest length) position raycastResult.suspensionLength = this.suspensionRestLength; this.suspensionRelativeVelocity = 0.0; raycastResult.directionWorld.scale(-1, raycastResult.hitNormalWorld); this.clippedInvContactDotSuspension = 1.0; } }; },{"../collision/RaycastResult":10,"../math/Transform":29,"../math/Vec3":30,"../utils/Utils":53}],37:[function(_dereq_,module,exports){ module.exports = Box; var Shape = _dereq_('./Shape'); var Vec3 = _dereq_('../math/Vec3'); var ConvexPolyhedron = _dereq_('./ConvexPolyhedron'); /** * A 3d box shape. * @class Box * @constructor * @param {Vec3} halfExtents * @author schteppe * @extends Shape */ function Box(halfExtents){ Shape.call(this); this.type = Shape.types.BOX; /** * @property halfExtents * @type {Vec3} */ this.halfExtents = halfExtents; /** * Used by the contact generator to make contacts with other convex polyhedra for example * @property convexPolyhedronRepresentation * @type {ConvexPolyhedron} */ this.convexPolyhedronRepresentation = null; this.updateConvexPolyhedronRepresentation(); this.updateBoundingSphereRadius(); } Box.prototype = new Shape(); Box.prototype.constructor = Box; /** * Updates the local convex polyhedron representation used for some collisions. * @method updateConvexPolyhedronRepresentation */ Box.prototype.updateConvexPolyhedronRepresentation = function(){ var sx = this.halfExtents.x; var sy = this.halfExtents.y; var sz = this.halfExtents.z; var V = Vec3; var vertices = [ new V(-sx,-sy,-sz), new V( sx,-sy,-sz), new V( sx, sy,-sz), new V(-sx, sy,-sz), new V(-sx,-sy, sz), new V( sx,-sy, sz), new V( sx, sy, sz), new V(-sx, sy, sz) ]; var indices = [ [3,2,1,0], // -z [4,5,6,7], // +z [5,4,0,1], // -y [2,3,7,6], // +y [0,4,7,3], // -x [1,2,6,5], // +x ]; var axes = [ new V(0, 0, 1), new V(0, 1, 0), new V(1, 0, 0) ]; var h = new ConvexPolyhedron(vertices, indices); this.convexPolyhedronRepresentation = h; h.material = this.material; }; /** * @method calculateLocalInertia * @param {Number} mass * @param {Vec3} target * @return {Vec3} */ Box.prototype.calculateLocalInertia = function(mass,target){ target = target || new Vec3(); Box.calculateInertia(this.halfExtents, mass, target); return target; }; Box.calculateInertia = function(halfExtents,mass,target){ var e = halfExtents; target.x = 1.0 / 12.0 * mass * ( 2*e.y*2*e.y + 2*e.z*2*e.z ); target.y = 1.0 / 12.0 * mass * ( 2*e.x*2*e.x + 2*e.z*2*e.z ); target.z = 1.0 / 12.0 * mass * ( 2*e.y*2*e.y + 2*e.x*2*e.x ); }; /** * Get the box 6 side normals * @method getSideNormals * @param {array} sixTargetVectors An array of 6 vectors, to store the resulting side normals in. * @param {Quaternion} quat Orientation to apply to the normal vectors. If not provided, the vectors will be in respect to the local frame. * @return {array} */ Box.prototype.getSideNormals = function(sixTargetVectors,quat){ var sides = sixTargetVectors; var ex = this.halfExtents; sides[0].set( ex.x, 0, 0); sides[1].set( 0, ex.y, 0); sides[2].set( 0, 0, ex.z); sides[3].set( -ex.x, 0, 0); sides[4].set( 0, -ex.y, 0); sides[5].set( 0, 0, -ex.z); if(quat!==undefined){ for(var i=0; i!==sides.length; i++){ quat.vmult(sides[i],sides[i]); } } return sides; }; Box.prototype.volume = function(){ return 8.0 * this.halfExtents.x * this.halfExtents.y * this.halfExtents.z; }; Box.prototype.updateBoundingSphereRadius = function(){ this.boundingSphereRadius = this.halfExtents.norm(); }; var worldCornerTempPos = new Vec3(); var worldCornerTempNeg = new Vec3(); Box.prototype.forEachWorldCorner = function(pos,quat,callback){ var e = this.halfExtents; var corners = [[ e.x, e.y, e.z], [ -e.x, e.y, e.z], [ -e.x, -e.y, e.z], [ -e.x, -e.y, -e.z], [ e.x, -e.y, -e.z], [ e.x, e.y, -e.z], [ -e.x, e.y, -e.z], [ e.x, -e.y, e.z]]; for(var i=0; i max.x){ max.x = x; } if(y > max.y){ max.y = y; } if(z > max.z){ max.z = z; } if(x < min.x){ min.x = x; } if(y < min.y){ min.y = y; } if(z < min.z){ min.z = z; } } // Get each axis max // min.set(Infinity,Infinity,Infinity); // max.set(-Infinity,-Infinity,-Infinity); // this.forEachWorldCorner(pos,quat,function(x,y,z){ // if(x > max.x){ // max.x = x; // } // if(y > max.y){ // max.y = y; // } // if(z > max.z){ // max.z = z; // } // if(x < min.x){ // min.x = x; // } // if(y < min.y){ // min.y = y; // } // if(z < min.z){ // min.z = z; // } // }); }; },{"../math/Vec3":30,"./ConvexPolyhedron":38,"./Shape":43}],38:[function(_dereq_,module,exports){ module.exports = ConvexPolyhedron; var Shape = _dereq_('./Shape'); var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var Transform = _dereq_('../math/Transform'); /** * A set of polygons describing a convex shape. * @class ConvexPolyhedron * @constructor * @extends Shape * @description The shape MUST be convex for the code to work properly. No polygons may be coplanar (contained * in the same 3D plane), instead these should be merged into one polygon. * * @param {array} points An array of Vec3's * @param {array} faces Array of integer arrays, describing which vertices that is included in each face. * * @author qiao / https://github.com/qiao (original author, see https://github.com/qiao/three.js/commit/85026f0c769e4000148a67d45a9e9b9c5108836f) * @author schteppe / https://github.com/schteppe * @see http://www.altdevblogaday.com/2011/05/13/contact-generation-between-3d-convex-meshes/ * @see http://bullet.googlecode.com/svn/trunk/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp * * @todo Move the clipping functions to ContactGenerator? * @todo Automatically merge coplanar polygons in constructor. */ function ConvexPolyhedron(points, faces, uniqueAxes) { var that = this; Shape.call(this); this.type = Shape.types.CONVEXPOLYHEDRON; /** * Array of Vec3 * @property vertices * @type {Array} */ this.vertices = points||[]; this.worldVertices = []; // World transformed version of .vertices this.worldVerticesNeedsUpdate = true; /** * Array of integer arrays, indicating which vertices each face consists of * @property faces * @type {Array} */ this.faces = faces||[]; /** * Array of Vec3 * @property faceNormals * @type {Array} */ this.faceNormals = []; this.computeNormals(); this.worldFaceNormalsNeedsUpdate = true; this.worldFaceNormals = []; // World transformed version of .faceNormals /** * Array of Vec3 * @property uniqueEdges * @type {Array} */ this.uniqueEdges = []; /** * If given, these locally defined, normalized axes are the only ones being checked when doing separating axis check. * @property {Array} uniqueAxes */ this.uniqueAxes = uniqueAxes ? uniqueAxes.slice() : null; this.computeEdges(); this.updateBoundingSphereRadius(); } ConvexPolyhedron.prototype = new Shape(); ConvexPolyhedron.prototype.constructor = ConvexPolyhedron; var computeEdges_tmpEdge = new Vec3(); /** * Computes uniqueEdges * @method computeEdges */ ConvexPolyhedron.prototype.computeEdges = function(){ var faces = this.faces; var vertices = this.vertices; var nv = vertices.length; var edges = this.uniqueEdges; edges.length = 0; var edge = computeEdges_tmpEdge; for(var i=0; i !== faces.length; i++){ var face = faces[i]; var numVertices = face.length; for(var j = 0; j !== numVertices; j++){ var k = ( j+1 ) % numVertices; vertices[face[j]].vsub(vertices[face[k]], edge); edge.normalize(); var found = false; for(var p=0; p !== edges.length; p++){ if (edges[p].almostEquals(edge) || edges[p].almostEquals(edge)){ found = true; break; } } if (!found){ edges.push(edge.clone()); } } } }; /** * Compute the normals of the faces. Will reuse existing Vec3 objects in the .faceNormals array if they exist. * @method computeNormals */ ConvexPolyhedron.prototype.computeNormals = function(){ this.faceNormals.length = this.faces.length; // Generate normals for(var i=0; i dmax){ dmax = d; closestFaceB = face; } } var worldVertsB1 = []; var polyB = hullB.faces[closestFaceB]; var numVertices = polyB.length; for(var e0=0; e0=0){ this.clipFaceAgainstHull(separatingNormal, posA, quatA, worldVertsB1, minDist, maxDist, result); } }; /** * Find the separating axis between this hull and another * @method findSeparatingAxis * @param {ConvexPolyhedron} hullB * @param {Vec3} posA * @param {Quaternion} quatA * @param {Vec3} posB * @param {Quaternion} quatB * @param {Vec3} target The target vector to save the axis in * @return {bool} Returns false if a separation is found, else true */ var fsa_faceANormalWS3 = new Vec3(), fsa_Worldnormal1 = new Vec3(), fsa_deltaC = new Vec3(), fsa_worldEdge0 = new Vec3(), fsa_worldEdge1 = new Vec3(), fsa_Cross = new Vec3(); ConvexPolyhedron.prototype.findSeparatingAxis = function(hullB,posA,quatA,posB,quatB,target, faceListA, faceListB){ var faceANormalWS3 = fsa_faceANormalWS3, Worldnormal1 = fsa_Worldnormal1, deltaC = fsa_deltaC, worldEdge0 = fsa_worldEdge0, worldEdge1 = fsa_worldEdge1, Cross = fsa_Cross; var dmin = Number.MAX_VALUE; var hullA = this; var curPlaneTests=0; if(!hullA.uniqueAxes){ var numFacesA = faceListA ? faceListA.length : hullA.faces.length; // Test face normals from hullA for(var i=0; i0.0){ target.negate(target); } return true; }; var maxminA=[], maxminB=[]; /** * Test separating axis against two hulls. Both hulls are projected onto the axis and the overlap size is returned if there is one. * @method testSepAxis * @param {Vec3} axis * @param {ConvexPolyhedron} hullB * @param {Vec3} posA * @param {Quaternion} quatA * @param {Vec3} posB * @param {Quaternion} quatB * @return {number} The overlap depth, or FALSE if no penetration. */ ConvexPolyhedron.prototype.testSepAxis = function(axis, hullB, posA, quatA, posB, quatB){ var hullA=this; ConvexPolyhedron.project(hullA, axis, posA, quatA, maxminA); ConvexPolyhedron.project(hullB, axis, posB, quatB, maxminB); var maxA = maxminA[0]; var minA = maxminA[1]; var maxB = maxminB[0]; var minB = maxminB[1]; if(maxA= 0, so output intersection var newv = new Vec3(); firstVertex.lerp(lastVertex, n_dot_first / (n_dot_first - n_dot_last), newv); outVertices.push(newv); } } else { if(n_dot_last<0){ // Start >= 0, end < 0 so output intersection and end var newv = new Vec3(); firstVertex.lerp(lastVertex, n_dot_first / (n_dot_first - n_dot_last), newv); outVertices.push(newv); outVertices.push(lastVertex); } } firstVertex = lastVertex; n_dot_first = n_dot_last; } return outVertices; }; // Updates .worldVertices and sets .worldVerticesNeedsUpdate to false. ConvexPolyhedron.prototype.computeWorldVertices = function(position,quat){ var N = this.vertices.length; while(this.worldVertices.length < N){ this.worldVertices.push( new Vec3() ); } var verts = this.vertices, worldVerts = this.worldVertices; for(var i=0; i!==N; i++){ quat.vmult( verts[i] , worldVerts[i] ); position.vadd( worldVerts[i] , worldVerts[i] ); } this.worldVerticesNeedsUpdate = false; }; var computeLocalAABB_worldVert = new Vec3(); ConvexPolyhedron.prototype.computeLocalAABB = function(aabbmin,aabbmax){ var n = this.vertices.length, vertices = this.vertices, worldVert = computeLocalAABB_worldVert; aabbmin.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); aabbmax.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); for(var i=0; i aabbmax.x){ aabbmax.x = v.x; } if (v.y < aabbmin.y){ aabbmin.y = v.y; } else if(v.y > aabbmax.y){ aabbmax.y = v.y; } if (v.z < aabbmin.z){ aabbmin.z = v.z; } else if(v.z > aabbmax.z){ aabbmax.z = v.z; } } }; /** * Updates .worldVertices and sets .worldVerticesNeedsUpdate to false. * @method computeWorldFaceNormals * @param {Quaternion} quat */ ConvexPolyhedron.prototype.computeWorldFaceNormals = function(quat){ var N = this.faceNormals.length; while(this.worldFaceNormals.length < N){ this.worldFaceNormals.push( new Vec3() ); } var normals = this.faceNormals, worldNormals = this.worldFaceNormals; for(var i=0; i!==N; i++){ quat.vmult( normals[i] , worldNormals[i] ); } this.worldFaceNormalsNeedsUpdate = false; }; /** * @method updateBoundingSphereRadius */ ConvexPolyhedron.prototype.updateBoundingSphereRadius = function(){ // Assume points are distributed with local (0,0,0) as center var max2 = 0; var verts = this.vertices; for(var i=0, N=verts.length; i!==N; i++) { var norm2 = verts[i].norm2(); if(norm2 > max2){ max2 = norm2; } } this.boundingSphereRadius = Math.sqrt(max2); }; var tempWorldVertex = new Vec3(); /** * @method calculateWorldAABB * @param {Vec3} pos * @param {Quaternion} quat * @param {Vec3} min * @param {Vec3} max */ ConvexPolyhedron.prototype.calculateWorldAABB = function(pos,quat,min,max){ var n = this.vertices.length, verts = this.vertices; var minx,miny,minz,maxx,maxy,maxz; for(var i=0; i maxx || maxx===undefined){ maxx = v.x; } if (v.y < miny || miny===undefined){ miny = v.y; } else if(v.y > maxy || maxy===undefined){ maxy = v.y; } if (v.z < minz || minz===undefined){ minz = v.z; } else if(v.z > maxz || maxz===undefined){ maxz = v.z; } } min.set(minx,miny,minz); max.set(maxx,maxy,maxz); }; /** * Get approximate convex volume * @method volume * @return {Number} */ ConvexPolyhedron.prototype.volume = function(){ return 4.0 * Math.PI * this.boundingSphereRadius / 3.0; }; /** * Get an average of all the vertices positions * @method getAveragePointLocal * @param {Vec3} target * @return {Vec3} */ ConvexPolyhedron.prototype.getAveragePointLocal = function(target){ target = target || new Vec3(); var n = this.vertices.length, verts = this.vertices; for(var i=0; i0) || (r1>0 && r2<0)){ return false; // Encountered some other sign. Exit. } else { } } // If we got here, all dot products were of the same sign. return positiveResult ? 1 : -1; }; /** * Get max and min dot product of a convex hull at position (pos,quat) projected onto an axis. Results are saved in the array maxmin. * @static * @method project * @param {ConvexPolyhedron} hull * @param {Vec3} axis * @param {Vec3} pos * @param {Quaternion} quat * @param {array} result result[0] and result[1] will be set to maximum and minimum, respectively. */ var project_worldVertex = new Vec3(); var project_localAxis = new Vec3(); var project_localOrigin = new Vec3(); ConvexPolyhedron.project = function(hull, axis, pos, quat, result){ var n = hull.vertices.length, worldVertex = project_worldVertex, localAxis = project_localAxis, max = 0, min = 0, localOrigin = project_localOrigin, vs = hull.vertices; localOrigin.setZero(); // Transform the axis to local Transform.vectorToLocalFrame(pos, quat, axis, localAxis); Transform.pointToLocalFrame(pos, quat, localOrigin, localOrigin); var add = localOrigin.dot(localAxis); min = max = vs[0].dot(localAxis); for(var i = 1; i < n; i++){ var val = vs[i].dot(localAxis); if(val > max){ max = val; } if(val < min){ min = val; } } min -= add; max -= add; if(min > max){ // Inconsistent - swap var temp = min; min = max; max = temp; } // Output result[0] = max; result[1] = min; }; },{"../math/Quaternion":28,"../math/Transform":29,"../math/Vec3":30,"./Shape":43}],39:[function(_dereq_,module,exports){ module.exports = Cylinder; var Shape = _dereq_('./Shape'); var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var ConvexPolyhedron = _dereq_('./ConvexPolyhedron'); /** * @class Cylinder * @constructor * @extends ConvexPolyhedron * @author schteppe / https://github.com/schteppe * @param {Number} radiusTop * @param {Number} radiusBottom * @param {Number} height * @param {Number} numSegments The number of segments to build the cylinder out of */ function Cylinder( radiusTop, radiusBottom, height , numSegments ) { var N = numSegments, verts = [], axes = [], faces = [], bottomface = [], topface = [], cos = Math.cos, sin = Math.sin; // First bottom point verts.push(new Vec3(radiusBottom*cos(0), radiusBottom*sin(0), -height*0.5)); bottomface.push(0); // First top point verts.push(new Vec3(radiusTop*cos(0), radiusTop*sin(0), height*0.5)); topface.push(1); for(var i=0; i { convex: ..., offset: ... } // for example: // _cachedPillars["0_2_1"] this._cachedPillars = {}; } Heightfield.prototype = new Shape(); /** * Call whenever you change the data array. * @method update */ Heightfield.prototype.update = function(){ this._cachedPillars = {}; }; /** * Update the .minValue property * @method updateMinValue */ Heightfield.prototype.updateMinValue = function(){ var data = this.data; var minValue = data[0][0]; for(var i=0; i !== data.length; i++){ for(var j=0; j !== data[i].length; j++){ var v = data[i][j]; if(v < minValue){ minValue = v; } } } this.minValue = minValue; }; /** * Update the .maxValue property * @method updateMaxValue */ Heightfield.prototype.updateMaxValue = function(){ var data = this.data; var maxValue = data[0][0]; for(var i=0; i !== data.length; i++){ for(var j=0; j !== data[i].length; j++){ var v = data[i][j]; if(v > maxValue){ maxValue = v; } } } this.maxValue = maxValue; }; /** * Set the height value at an index. Don't forget to update maxValue and minValue after you're done. * @method setHeightValueAtIndex * @param {integer} xi * @param {integer} yi * @param {number} value */ Heightfield.prototype.setHeightValueAtIndex = function(xi, yi, value){ var data = this.data; data[xi][yi] = value; // Invalidate cache this.clearCachedConvexTrianglePillar(xi, yi, false); if(xi > 0){ this.clearCachedConvexTrianglePillar(xi - 1, yi, true); this.clearCachedConvexTrianglePillar(xi - 1, yi, false); } if(yi > 0){ this.clearCachedConvexTrianglePillar(xi, yi - 1, true); this.clearCachedConvexTrianglePillar(xi, yi - 1, false); } if(yi > 0 && xi > 0){ this.clearCachedConvexTrianglePillar(xi - 1, yi - 1, true); } }; /** * Get max/min in a rectangle in the matrix data * @method getRectMinMax * @param {integer} iMinX * @param {integer} iMinY * @param {integer} iMaxX * @param {integer} iMaxY * @param {array} [result] An array to store the results in. * @return {array} The result array, if it was passed in. Minimum will be at position 0 and max at 1. */ Heightfield.prototype.getRectMinMax = function (iMinX, iMinY, iMaxX, iMaxY, result) { result = result || []; // Get max and min of the data var data = this.data, max = this.minValue; // Set first value for(var i = iMinX; i <= iMaxX; i++){ for(var j = iMinY; j <= iMaxY; j++){ var height = data[i][j]; if(height > max){ max = height; } } } result[0] = this.minValue; result[1] = max; }; /** * Get the index of a local position on the heightfield. The indexes indicate the rectangles, so if your terrain is made of N x N height data points, you will have rectangle indexes ranging from 0 to N-1. * @method getIndexOfPosition * @param {number} x * @param {number} y * @param {array} result Two-element array * @param {boolean} clamp If the position should be clamped to the heightfield edge. * @return {boolean} */ Heightfield.prototype.getIndexOfPosition = function (x, y, result, clamp) { // Get the index of the data points to test against var w = this.elementSize; var data = this.data; var xi = Math.floor(x / w); var yi = Math.floor(y / w); result[0] = xi; result[1] = yi; if(clamp){ // Clamp index to edges if(xi < 0){ xi = 0; } if(yi < 0){ yi = 0; } if(xi >= data.length - 1){ xi = data.length - 1; } if(yi >= data[0].length - 1){ yi = data[0].length - 1; } } // Bail out if we are out of the terrain if(xi < 0 || yi < 0 || xi >= data.length-1 || yi >= data[0].length-1){ return false; } return true; }; Heightfield.prototype.getHeightAt = function(x, y, edgeClamp){ var idx = []; this.getIndexOfPosition(x, y, idx, edgeClamp); // TODO: get upper or lower triangle, then use barycentric interpolation to get the height in the triangle. var minmax = []; this.getRectMinMax(idx[0], idx[1] + 1, idx[0], idx[1] + 1, minmax); return (minmax[0] + minmax[1]) / 2; // average }; Heightfield.prototype.getCacheConvexTrianglePillarKey = function(xi, yi, getUpperTriangle){ return xi + '_' + yi + '_' + (getUpperTriangle ? 1 : 0); }; Heightfield.prototype.getCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle){ return this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)]; }; Heightfield.prototype.setCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle, convex, offset){ this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)] = { convex: convex, offset: offset }; }; Heightfield.prototype.clearCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle){ delete this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)]; }; /** * Get a triangle in the terrain in the form of a triangular convex shape. * @method getConvexTrianglePillar * @param {integer} i * @param {integer} j * @param {boolean} getUpperTriangle */ Heightfield.prototype.getConvexTrianglePillar = function(xi, yi, getUpperTriangle){ var result = this.pillarConvex; var offsetResult = this.pillarOffset; if(this.cacheEnabled){ var data = this.getCachedConvexTrianglePillar(xi, yi, getUpperTriangle); if(data){ this.pillarConvex = data.convex; this.pillarOffset = data.offset; return; } result = new ConvexPolyhedron(); offsetResult = new Vec3(); this.pillarConvex = result; this.pillarOffset = offsetResult; } var data = this.data; var elementSize = this.elementSize; var faces = result.faces; // Reuse verts if possible result.vertices.length = 6; for (var i = 0; i < 6; i++) { if(!result.vertices[i]){ result.vertices[i] = new Vec3(); } } // Reuse faces if possible faces.length = 5; for (var i = 0; i < 5; i++) { if(!faces[i]){ faces[i] = []; } } var verts = result.vertices; var h = (Math.min( data[xi][yi], data[xi+1][yi], data[xi][yi+1], data[xi+1][yi+1] ) - this.minValue ) / 2 + this.minValue; if (!getUpperTriangle) { // Center of the triangle pillar - all polygons are given relative to this one offsetResult.set( (xi + 0.25) * elementSize, // sort of center of a triangle (yi + 0.25) * elementSize, h // vertical center ); // Top triangle verts verts[0].set( -0.25 * elementSize, -0.25 * elementSize, data[xi][yi] - h ); verts[1].set( 0.75 * elementSize, -0.25 * elementSize, data[xi + 1][yi] - h ); verts[2].set( -0.25 * elementSize, 0.75 * elementSize, data[xi][yi + 1] - h ); // bottom triangle verts verts[3].set( -0.25 * elementSize, -0.25 * elementSize, -h-1 ); verts[4].set( 0.75 * elementSize, -0.25 * elementSize, -h-1 ); verts[5].set( -0.25 * elementSize, 0.75 * elementSize, -h-1 ); // top triangle faces[0][0] = 0; faces[0][1] = 1; faces[0][2] = 2; // bottom triangle faces[1][0] = 5; faces[1][1] = 4; faces[1][2] = 3; // -x facing quad faces[2][0] = 0; faces[2][1] = 2; faces[2][2] = 5; faces[2][3] = 3; // -y facing quad faces[3][0] = 1; faces[3][1] = 0; faces[3][2] = 3; faces[3][3] = 4; // +xy facing quad faces[4][0] = 4; faces[4][1] = 5; faces[4][2] = 2; faces[4][3] = 1; } else { // Center of the triangle pillar - all polygons are given relative to this one offsetResult.set( (xi + 0.75) * elementSize, // sort of center of a triangle (yi + 0.75) * elementSize, h // vertical center ); // Top triangle verts verts[0].set( 0.25 * elementSize, 0.25 * elementSize, data[xi + 1][yi + 1] - h ); verts[1].set( -0.75 * elementSize, 0.25 * elementSize, data[xi][yi + 1] - h ); verts[2].set( 0.25 * elementSize, -0.75 * elementSize, data[xi + 1][yi] - h ); // bottom triangle verts verts[3].set( 0.25 * elementSize, 0.25 * elementSize, - h-1 ); verts[4].set( -0.75 * elementSize, 0.25 * elementSize, - h-1 ); verts[5].set( 0.25 * elementSize, -0.75 * elementSize, - h-1 ); // Top triangle faces[0][0] = 0; faces[0][1] = 1; faces[0][2] = 2; // bottom triangle faces[1][0] = 5; faces[1][1] = 4; faces[1][2] = 3; // +x facing quad faces[2][0] = 2; faces[2][1] = 5; faces[2][2] = 3; faces[2][3] = 0; // +y facing quad faces[3][0] = 3; faces[3][1] = 4; faces[3][2] = 1; faces[3][3] = 0; // -xy facing quad faces[4][0] = 1; faces[4][1] = 4; faces[4][2] = 5; faces[4][3] = 2; } result.computeNormals(); result.computeEdges(); result.updateBoundingSphereRadius(); this.setCachedConvexTrianglePillar(xi, yi, getUpperTriangle, result, offsetResult); }; Heightfield.prototype.calculateLocalInertia = function(mass, target){ target = target || new Vec3(); target.set(0, 0, 0); return target; }; Heightfield.prototype.volume = function(){ return Number.MAX_VALUE; // The terrain is infinite }; Heightfield.prototype.calculateWorldAABB = function(pos, quat, min, max){ // TODO: do it properly min.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE); max.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); }; Heightfield.prototype.updateBoundingSphereRadius = function(){ // Use the bounding box of the min/max values var data = this.data, s = this.elementSize; this.boundingSphereRadius = new Vec3(data.length * s, data[0].length * s, Math.max(Math.abs(this.maxValue), Math.abs(this.minValue))).norm(); }; },{"../math/Vec3":30,"../utils/Utils":53,"./ConvexPolyhedron":38,"./Shape":43}],41:[function(_dereq_,module,exports){ module.exports = Particle; var Shape = _dereq_('./Shape'); var Vec3 = _dereq_('../math/Vec3'); /** * Particle shape. * @class Particle * @constructor * @author schteppe * @extends Shape */ function Particle(){ Shape.call(this); this.type = Shape.types.PARTICLE; } Particle.prototype = new Shape(); Particle.prototype.constructor = Particle; /** * @method calculateLocalInertia * @param {Number} mass * @param {Vec3} target * @return {Vec3} */ Particle.prototype.calculateLocalInertia = function(mass,target){ target = target || new Vec3(); target.set(0, 0, 0); return target; }; Particle.prototype.volume = function(){ return 0; }; Particle.prototype.updateBoundingSphereRadius = function(){ this.boundingSphereRadius = 0; }; Particle.prototype.calculateWorldAABB = function(pos,quat,min,max){ // Get each axis max min.copy(pos); max.copy(pos); }; },{"../math/Vec3":30,"./Shape":43}],42:[function(_dereq_,module,exports){ module.exports = Plane; var Shape = _dereq_('./Shape'); var Vec3 = _dereq_('../math/Vec3'); /** * A plane, facing in the Z direction. The plane has its surface at z=0 and everything below z=0 is assumed to be solid plane. To make the plane face in some other direction than z, you must put it inside a RigidBody and rotate that body. See the demos. * @class Plane * @constructor * @extends Shape * @author schteppe */ function Plane(){ Shape.call(this); this.type = Shape.types.PLANE; // World oriented normal this.worldNormal = new Vec3(); this.worldNormalNeedsUpdate = true; this.boundingSphereRadius = Number.MAX_VALUE; } Plane.prototype = new Shape(); Plane.prototype.constructor = Plane; Plane.prototype.computeWorldNormal = function(quat){ var n = this.worldNormal; n.set(0,0,1); quat.vmult(n,n); this.worldNormalNeedsUpdate = false; }; Plane.prototype.calculateLocalInertia = function(mass,target){ target = target || new Vec3(); return target; }; Plane.prototype.volume = function(){ return Number.MAX_VALUE; // The plane is infinite... }; var tempNormal = new Vec3(); Plane.prototype.calculateWorldAABB = function(pos, quat, min, max){ // The plane AABB is infinite, except if the normal is pointing along any axis tempNormal.set(0,0,1); // Default plane normal is z quat.vmult(tempNormal,tempNormal); var maxVal = Number.MAX_VALUE; min.set(-maxVal, -maxVal, -maxVal); max.set(maxVal, maxVal, maxVal); if(tempNormal.x === 1){ max.x = pos.x; } if(tempNormal.y === 1){ max.y = pos.y; } if(tempNormal.z === 1){ max.z = pos.z; } if(tempNormal.x === -1){ min.x = pos.x; } if(tempNormal.y === -1){ min.y = pos.y; } if(tempNormal.z === -1){ min.z = pos.z; } }; Plane.prototype.updateBoundingSphereRadius = function(){ this.boundingSphereRadius = Number.MAX_VALUE; }; },{"../math/Vec3":30,"./Shape":43}],43:[function(_dereq_,module,exports){ module.exports = Shape; var Shape = _dereq_('./Shape'); var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var Material = _dereq_('../material/Material'); /** * Base class for shapes * @class Shape * @constructor * @author schteppe * @todo Should have a mechanism for caching bounding sphere radius instead of calculating it each time */ function Shape(){ /** * Identifyer of the Shape. * @property {number} id */ this.id = Shape.idCounter++; /** * The type of this shape. Must be set to an int > 0 by subclasses. * @property type * @type {Number} * @see Shape.types */ this.type = 0; /** * The local bounding sphere radius of this shape. * @property {Number} boundingSphereRadius */ this.boundingSphereRadius = 0; /** * Whether to produce contact forces when in contact with other bodies. Note that contacts will be generated, but they will be disabled. * @property {boolean} collisionResponse */ this.collisionResponse = true; /** * @property {Material} material */ this.material = null; } Shape.prototype.constructor = Shape; /** * Computes the bounding sphere radius. The result is stored in the property .boundingSphereRadius * @method updateBoundingSphereRadius * @return {Number} */ Shape.prototype.updateBoundingSphereRadius = function(){ throw "computeBoundingSphereRadius() not implemented for shape type "+this.type; }; /** * Get the volume of this shape * @method volume * @return {Number} */ Shape.prototype.volume = function(){ throw "volume() not implemented for shape type "+this.type; }; /** * Calculates the inertia in the local frame for this shape. * @method calculateLocalInertia * @return {Vec3} * @see http://en.wikipedia.org/wiki/List_of_moments_of_inertia */ Shape.prototype.calculateLocalInertia = function(mass,target){ throw "calculateLocalInertia() not implemented for shape type "+this.type; }; Shape.idCounter = 0; /** * The available shape types. * @static * @property types * @type {Object} */ Shape.types = { SPHERE:1, PLANE:2, BOX:4, COMPOUND:8, CONVEXPOLYHEDRON:16, HEIGHTFIELD:32, PARTICLE:64, CYLINDER:128, TRIMESH:256 }; },{"../material/Material":25,"../math/Quaternion":28,"../math/Vec3":30,"./Shape":43}],44:[function(_dereq_,module,exports){ module.exports = Sphere; var Shape = _dereq_('./Shape'); var Vec3 = _dereq_('../math/Vec3'); /** * Spherical shape * @class Sphere * @constructor * @extends Shape * @param {Number} radius The radius of the sphere, a non-negative number. * @author schteppe / http://github.com/schteppe */ function Sphere(radius){ Shape.call(this); /** * @property {Number} radius */ this.radius = radius!==undefined ? Number(radius) : 1.0; this.type = Shape.types.SPHERE; if(this.radius < 0){ throw new Error('The sphere radius cannot be negative.'); } this.updateBoundingSphereRadius(); } Sphere.prototype = new Shape(); Sphere.prototype.constructor = Sphere; Sphere.prototype.calculateLocalInertia = function(mass,target){ target = target || new Vec3(); var I = 2.0*mass*this.radius*this.radius/5.0; target.x = I; target.y = I; target.z = I; return target; }; Sphere.prototype.volume = function(){ return 4.0 * Math.PI * this.radius / 3.0; }; Sphere.prototype.updateBoundingSphereRadius = function(){ this.boundingSphereRadius = this.radius; }; Sphere.prototype.calculateWorldAABB = function(pos,quat,min,max){ var r = this.radius; var axes = ['x','y','z']; for(var i=0; i u.x){ u.x = v.x; } if(v.y < l.y){ l.y = v.y; } else if(v.y > u.y){ u.y = v.y; } if(v.z < l.z){ l.z = v.z; } else if(v.z > u.z){ u.z = v.z; } } }; /** * Update the .aabb property * @method updateAABB */ Trimesh.prototype.updateAABB = function(){ this.computeLocalAABB(this.aabb); }; /** * Will update the .boundingSphereRadius property * @method updateBoundingSphereRadius */ Trimesh.prototype.updateBoundingSphereRadius = function(){ // Assume points are distributed with local (0,0,0) as center var max2 = 0; var vertices = this.vertices; var v = new Vec3(); for(var i=0, N=vertices.length / 3; i !== N; i++) { this.getVertex(i, v); var norm2 = v.norm2(); if(norm2 > max2){ max2 = norm2; } } this.boundingSphereRadius = Math.sqrt(max2); }; var tempWorldVertex = new Vec3(); var calculateWorldAABB_frame = new Transform(); var calculateWorldAABB_aabb = new AABB(); /** * @method calculateWorldAABB * @param {Vec3} pos * @param {Quaternion} quat * @param {Vec3} min * @param {Vec3} max */ Trimesh.prototype.calculateWorldAABB = function(pos,quat,min,max){ /* var n = this.vertices.length / 3, verts = this.vertices; var minx,miny,minz,maxx,maxy,maxz; var v = tempWorldVertex; for(var i=0; i maxx || maxx===undefined){ maxx = v.x; } if (v.y < miny || miny===undefined){ miny = v.y; } else if(v.y > maxy || maxy===undefined){ maxy = v.y; } if (v.z < minz || minz===undefined){ minz = v.z; } else if(v.z > maxz || maxz===undefined){ maxz = v.z; } } min.set(minx,miny,minz); max.set(maxx,maxy,maxz); */ // Faster approximation using local AABB var frame = calculateWorldAABB_frame; var result = calculateWorldAABB_aabb; frame.position = pos; frame.quaternion = quat; this.aabb.toWorldFrame(frame, result); min.copy(result.lowerBound); max.copy(result.upperBound); }; /** * Get approximate volume * @method volume * @return {Number} */ Trimesh.prototype.volume = function(){ return 4.0 * Math.PI * this.boundingSphereRadius / 3.0; }; /** * Create a Trimesh instance, shaped as a torus. * @static * @method createTorus * @param {number} [radius=1] * @param {number} [tube=0.5] * @param {number} [radialSegments=8] * @param {number} [tubularSegments=6] * @param {number} [arc=6.283185307179586] * @return {Trimesh} A torus */ Trimesh.createTorus = function (radius, tube, radialSegments, tubularSegments, arc) { radius = radius || 1; tube = tube || 0.5; radialSegments = radialSegments || 8; tubularSegments = tubularSegments || 6; arc = arc || Math.PI * 2; var vertices = []; var indices = []; for ( var j = 0; j <= radialSegments; j ++ ) { for ( var i = 0; i <= tubularSegments; i ++ ) { var u = i / tubularSegments * arc; var v = j / radialSegments * Math.PI * 2; var x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); var y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); var z = tube * Math.sin( v ); vertices.push( x, y, z ); } } for ( var j = 1; j <= radialSegments; j ++ ) { for ( var i = 1; i <= tubularSegments; i ++ ) { var a = ( tubularSegments + 1 ) * j + i - 1; var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; var d = ( tubularSegments + 1 ) * j + i; indices.push(a, b, d); indices.push(b, c, d); } } return new Trimesh(vertices, indices); }; },{"../collision/AABB":3,"../math/Quaternion":28,"../math/Transform":29,"../math/Vec3":30,"../utils/Octree":50,"./Shape":43}],46:[function(_dereq_,module,exports){ module.exports = GSSolver; var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var Solver = _dereq_('./Solver'); /** * Constraint equation Gauss-Seidel solver. * @class GSSolver * @constructor * @todo The spook parameters should be specified for each constraint, not globally. * @author schteppe / https://github.com/schteppe * @see https://www8.cs.umu.se/kurser/5DV058/VT09/lectures/spooknotes.pdf * @extends Solver */ function GSSolver(){ Solver.call(this); /** * The number of solver iterations determines quality of the constraints in the world. The more iterations, the more correct simulation. More iterations need more computations though. If you have a large gravity force in your world, you will need more iterations. * @property iterations * @type {Number} * @todo write more about solver and iterations in the wiki */ this.iterations = 10; /** * When tolerance is reached, the system is assumed to be converged. * @property tolerance * @type {Number} */ this.tolerance = 1e-7; } GSSolver.prototype = new Solver(); var GSSolver_solve_lambda = []; // Just temporary number holders that we want to reuse each solve. var GSSolver_solve_invCs = []; var GSSolver_solve_Bs = []; GSSolver.prototype.solve = function(dt,world){ var iter = 0, maxIter = this.iterations, tolSquared = this.tolerance*this.tolerance, equations = this.equations, Neq = equations.length, bodies = world.bodies, Nbodies = bodies.length, h = dt, q, B, invC, deltalambda, deltalambdaTot, GWlambda, lambdaj; // Update solve mass if(Neq !== 0){ for(var i=0; i!==Nbodies; i++){ bodies[i].updateSolveMassProperties(); } } // Things that does not change during iteration can be computed once var invCs = GSSolver_solve_invCs, Bs = GSSolver_solve_Bs, lambda = GSSolver_solve_lambda; invCs.length = Neq; Bs.length = Neq; lambda.length = Neq; for(var i=0; i!==Neq; i++){ var c = equations[i]; lambda[i] = 0.0; Bs[i] = c.computeB(h); invCs[i] = 1.0 / c.computeC(); } if(Neq !== 0){ // Reset vlambda for(var i=0; i!==Nbodies; i++){ var b=bodies[i], vlambda=b.vlambda, wlambda=b.wlambda; vlambda.set(0,0,0); if(wlambda){ wlambda.set(0,0,0); } } // Iterate over equations for(iter=0; iter!==maxIter; iter++){ // Accumulate the total error for each iteration. deltalambdaTot = 0.0; for(var j=0; j!==Neq; j++){ var c = equations[j]; // Compute iteration B = Bs[j]; invC = invCs[j]; lambdaj = lambda[j]; GWlambda = c.computeGWlambda(); deltalambda = invC * ( B - GWlambda - c.eps * lambdaj ); // Clamp if we are not within the min/max interval if(lambdaj + deltalambda < c.minForce){ deltalambda = c.minForce - lambdaj; } else if(lambdaj + deltalambda > c.maxForce){ deltalambda = c.maxForce - lambdaj; } lambda[j] += deltalambda; deltalambdaTot += deltalambda > 0.0 ? deltalambda : -deltalambda; // abs(deltalambda) c.addToWlambda(deltalambda); } // If the total error is small enough - stop iterate if(deltalambdaTot*deltalambdaTot < tolSquared){ break; } } // Add result to velocity for(var i=0; i!==Nbodies; i++){ var b=bodies[i], v=b.velocity, w=b.angularVelocity; v.vadd(b.vlambda, v); if(w){ w.vadd(b.wlambda, w); } } } return iter; }; },{"../math/Quaternion":28,"../math/Vec3":30,"./Solver":47}],47:[function(_dereq_,module,exports){ module.exports = Solver; /** * Constraint equation solver base class. * @class Solver * @constructor * @author schteppe / https://github.com/schteppe */ function Solver(){ /** * All equations to be solved * @property {Array} equations */ this.equations = []; } /** * Should be implemented in subclasses! * @method solve * @param {Number} dt * @param {World} world */ Solver.prototype.solve = function(dt,world){ // Should return the number of iterations done! return 0; }; /** * Add an equation * @method addEquation * @param {Equation} eq */ Solver.prototype.addEquation = function(eq){ if (eq.enabled) { this.equations.push(eq); } }; /** * Remove an equation * @method removeEquation * @param {Equation} eq */ Solver.prototype.removeEquation = function(eq){ var eqs = this.equations; var i = eqs.indexOf(eq); if(i !== -1){ eqs.splice(i,1); } }; /** * Add all equations * @method removeAllEquations */ Solver.prototype.removeAllEquations = function(){ this.equations.length = 0; }; },{}],48:[function(_dereq_,module,exports){ module.exports = SplitSolver; var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var Solver = _dereq_('./Solver'); var Body = _dereq_('../objects/Body'); /** * Splits the equations into islands and solves them independently. Can improve performance. * @class SplitSolver * @constructor * @extends Solver * @param {Solver} subsolver */ function SplitSolver(subsolver){ Solver.call(this); this.iterations = 10; this.tolerance = 1e-7; this.subsolver = subsolver; this.nodes = []; this.nodePool = []; // Create needed nodes, reuse if possible while(this.nodePool.length < 128){ this.nodePool.push(this.createNode()); } } SplitSolver.prototype = new Solver(); // Returns the number of subsystems var SplitSolver_solve_nodes = []; // All allocated node objects var SplitSolver_solve_nodePool = []; // All allocated node objects var SplitSolver_solve_eqs = []; // Temp array var SplitSolver_solve_bds = []; // Temp array var SplitSolver_solve_dummyWorld = {bodies:[]}; // Temp object var STATIC = Body.STATIC; function getUnvisitedNode(nodes){ var Nnodes = nodes.length; for(var i=0; i!==Nnodes; i++){ var node = nodes[i]; if(!node.visited && !(node.body.type & STATIC)){ return node; } } return false; } var queue = []; function bfs(root,visitFunc,bds,eqs){ queue.push(root); root.visited = true; visitFunc(root,bds,eqs); while(queue.length) { var node = queue.pop(); // Loop over unvisited child nodes var child; while((child = getUnvisitedNode(node.children))) { child.visited = true; visitFunc(child,bds,eqs); queue.push(child); } } } function visitFunc(node,bds,eqs){ bds.push(node.body); var Neqs = node.eqs.length; for(var i=0; i!==Neqs; i++){ var eq = node.eqs[i]; if(eqs.indexOf(eq) === -1){ eqs.push(eq); } } } SplitSolver.prototype.createNode = function(){ return { body:null, children:[], eqs:[], visited:false }; }; /** * Solve the subsystems * @method solve * @param {Number} dt * @param {World} world */ SplitSolver.prototype.solve = function(dt,world){ var nodes=SplitSolver_solve_nodes, nodePool=this.nodePool, bodies=world.bodies, equations=this.equations, Neq=equations.length, Nbodies=bodies.length, subsolver=this.subsolver; // Create needed nodes, reuse if possible while(nodePool.length < Nbodies){ nodePool.push(this.createNode()); } nodes.length = Nbodies; for (var i = 0; i < Nbodies; i++) { nodes[i] = nodePool[i]; } // Reset node values for(var i=0; i!==Nbodies; i++){ var node = nodes[i]; node.body = bodies[i]; node.children.length = 0; node.eqs.length = 0; node.visited = false; } for(var k=0; k!==Neq; k++){ var eq=equations[k], i=bodies.indexOf(eq.bi), j=bodies.indexOf(eq.bj), ni=nodes[i], nj=nodes[j]; ni.children.push(nj); ni.eqs.push(eq); nj.children.push(ni); nj.eqs.push(eq); } var child, n=0, eqs=SplitSolver_solve_eqs; subsolver.tolerance = this.tolerance; subsolver.iterations = this.iterations; var dummyWorld = SplitSolver_solve_dummyWorld; while((child = getUnvisitedNode(nodes))){ eqs.length = 0; dummyWorld.bodies.length = 0; bfs(child, visitFunc, dummyWorld.bodies, eqs); var Neqs = eqs.length; eqs = eqs.sort(sortById); for(var i=0; i!==Neqs; i++){ subsolver.addEquation(eqs[i]); } var iter = subsolver.solve(dt,dummyWorld); subsolver.removeAllEquations(); n++; } return n; }; function sortById(a, b){ return b.id - a.id; } },{"../math/Quaternion":28,"../math/Vec3":30,"../objects/Body":31,"./Solver":47}],49:[function(_dereq_,module,exports){ /** * Base class for objects that dispatches events. * @class EventTarget * @constructor */ var EventTarget = function () { }; module.exports = EventTarget; EventTarget.prototype = { constructor: EventTarget, /** * Add an event listener * @method addEventListener * @param {String} type * @param {Function} listener * @return {EventTarget} The self object, for chainability. */ addEventListener: function ( type, listener ) { if ( this._listeners === undefined ){ this._listeners = {}; } var listeners = this._listeners; if ( listeners[ type ] === undefined ) { listeners[ type ] = []; } if ( listeners[ type ].indexOf( listener ) === - 1 ) { listeners[ type ].push( listener ); } return this; }, /** * Check if an event listener is added * @method hasEventListener * @param {String} type * @param {Function} listener * @return {Boolean} */ hasEventListener: function ( type, listener ) { if ( this._listeners === undefined ){ return false; } var listeners = this._listeners; if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) { return true; } return false; }, /** * Remove an event listener * @method removeEventListener * @param {String} type * @param {Function} listener * @return {EventTarget} The self object, for chainability. */ removeEventListener: function ( type, listener ) { if ( this._listeners === undefined ){ return this; } var listeners = this._listeners; if ( listeners[type] === undefined ){ return this; } var index = listeners[ type ].indexOf( listener ); if ( index !== - 1 ) { listeners[ type ].splice( index, 1 ); } return this; }, /** * Emit an event. * @method dispatchEvent * @param {Object} event * @param {String} event.type * @return {EventTarget} The self object, for chainability. */ dispatchEvent: function ( event ) { if ( this._listeners === undefined ){ return this; } var listeners = this._listeners; var listenerArray = listeners[ event.type ]; if ( listenerArray !== undefined ) { event.target = this; for ( var i = 0, l = listenerArray.length; i < l; i ++ ) { listenerArray[ i ].call( this, event ); } } return this; } }; },{}],50:[function(_dereq_,module,exports){ var AABB = _dereq_('../collision/AABB'); var Vec3 = _dereq_('../math/Vec3'); module.exports = Octree; /** * @class OctreeNode * @param {object} [options] * @param {Octree} [options.root] * @param {AABB} [options.aabb] */ function OctreeNode(options){ options = options || {}; /** * The root node * @property {OctreeNode} root */ this.root = options.root || null; /** * Boundary of this node * @property {AABB} aabb */ this.aabb = options.aabb ? options.aabb.clone() : new AABB(); /** * Contained data at the current node level. * @property {Array} data */ this.data = []; /** * Children to this node * @property {Array} children */ this.children = []; } /** * @class Octree * @param {AABB} aabb The total AABB of the tree * @param {object} [options] * @param {number} [options.maxDepth=8] * @extends OctreeNode */ function Octree(aabb, options){ options = options || {}; options.root = null; options.aabb = aabb; OctreeNode.call(this, options); /** * Maximum subdivision depth * @property {number} maxDepth */ this.maxDepth = typeof(options.maxDepth) !== 'undefined' ? options.maxDepth : 8; } Octree.prototype = new OctreeNode(); OctreeNode.prototype.reset = function(aabb, options){ this.children.length = this.data.length = 0; }; /** * Insert data into this node * @method insert * @param {AABB} aabb * @param {object} elementData * @return {boolean} True if successful, otherwise false */ OctreeNode.prototype.insert = function(aabb, elementData, level){ var nodeData = this.data; level = level || 0; // Ignore objects that do not belong in this node if (!this.aabb.contains(aabb)){ return false; // object cannot be added } var children = this.children; if(level < (this.maxDepth || this.root.maxDepth)){ // Subdivide if there are no children yet var subdivided = false; if (!children.length){ this.subdivide(); subdivided = true; } // add to whichever node will accept it for (var i = 0; i !== 8; i++) { if (children[i].insert(aabb, elementData, level + 1)){ return true; } } if(subdivided){ // No children accepted! Might as well just remove em since they contain none children.length = 0; } } // Too deep, or children didnt want it. add it in current node nodeData.push(elementData); return true; }; var halfDiagonal = new Vec3(); /** * Create 8 equally sized children nodes and put them in the .children array. * @method subdivide */ OctreeNode.prototype.subdivide = function() { var aabb = this.aabb; var l = aabb.lowerBound; var u = aabb.upperBound; var children = this.children; children.push( new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,0,0) }) }), new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,0,0) }) }), new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,1,0) }) }), new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,1,1) }) }), new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,1,1) }) }), new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,0,1) }) }), new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,0,1) }) }), new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,1,0) }) }) ); u.vsub(l, halfDiagonal); halfDiagonal.scale(0.5, halfDiagonal); var root = this.root || this; for (var i = 0; i !== 8; i++) { var child = children[i]; // Set current node as root child.root = root; // Compute bounds var lowerBound = child.aabb.lowerBound; lowerBound.x *= halfDiagonal.x; lowerBound.y *= halfDiagonal.y; lowerBound.z *= halfDiagonal.z; lowerBound.vadd(l, lowerBound); // Upper bound is always lower bound + halfDiagonal lowerBound.vadd(halfDiagonal, child.aabb.upperBound); } }; /** * Get all data, potentially within an AABB * @method aabbQuery * @param {AABB} aabb * @param {array} result * @return {array} The "result" object */ OctreeNode.prototype.aabbQuery = function(aabb, result) { var nodeData = this.data; // abort if the range does not intersect this node // if (!this.aabb.overlaps(aabb)){ // return result; // } // Add objects at this level // Array.prototype.push.apply(result, nodeData); // Add child data // @todo unwrap recursion into a queue / loop, that's faster in JS var children = this.children; // for (var i = 0, N = this.children.length; i !== N; i++) { // children[i].aabbQuery(aabb, result); // } var queue = [this]; while (queue.length) { var node = queue.pop(); if (node.aabb.overlaps(aabb)){ Array.prototype.push.apply(result, node.data); } Array.prototype.push.apply(queue, node.children); } return result; }; var tmpAABB = new AABB(); /** * Get all data, potentially intersected by a ray. * @method rayQuery * @param {Ray} ray * @param {Transform} treeTransform * @param {array} result * @return {array} The "result" object */ OctreeNode.prototype.rayQuery = function(ray, treeTransform, result) { // Use aabb query for now. // @todo implement real ray query which needs less lookups ray.getAABB(tmpAABB); tmpAABB.toLocalFrame(treeTransform, tmpAABB); this.aabbQuery(tmpAABB, result); return result; }; /** * @method removeEmptyNodes */ OctreeNode.prototype.removeEmptyNodes = function() { var queue = [this]; while (queue.length) { var node = queue.pop(); for (var i = node.children.length - 1; i >= 0; i--) { if(!node.children[i].data.length){ node.children.splice(i, 1); } } Array.prototype.push.apply(queue, node.children); } }; },{"../collision/AABB":3,"../math/Vec3":30}],51:[function(_dereq_,module,exports){ module.exports = Pool; /** * For pooling objects that can be reused. * @class Pool * @constructor */ function Pool(){ /** * The pooled objects * @property {Array} objects */ this.objects = []; /** * Constructor of the objects * @property {mixed} type */ this.type = Object; } /** * Release an object after use * @method release * @param {Object} obj */ Pool.prototype.release = function(){ var Nargs = arguments.length; for(var i=0; i!==Nargs; i++){ this.objects.push(arguments[i]); } }; /** * Get an object * @method get * @return {mixed} */ Pool.prototype.get = function(){ if(this.objects.length===0){ return this.constructObject(); } else { return this.objects.pop(); } }; /** * Construct an object. Should be implmented in each subclass. * @method constructObject * @return {mixed} */ Pool.prototype.constructObject = function(){ throw new Error("constructObject() not implemented in this Pool subclass yet!"); }; },{}],52:[function(_dereq_,module,exports){ module.exports = TupleDictionary; /** * @class TupleDictionary * @constructor */ function TupleDictionary() { /** * The data storage * @property data * @type {Object} */ this.data = { keys:[] }; } /** * @method get * @param {Number} i * @param {Number} j * @return {Number} */ TupleDictionary.prototype.get = function(i, j) { if (i > j) { // swap var temp = j; j = i; i = temp; } return this.data[i+'-'+j]; }; /** * @method set * @param {Number} i * @param {Number} j * @param {Number} value */ TupleDictionary.prototype.set = function(i, j, value) { if (i > j) { var temp = j; j = i; i = temp; } var key = i+'-'+j; // Check if key already exists if(!this.get(i,j)){ this.data.keys.push(key); } this.data[key] = value; }; /** * @method reset */ TupleDictionary.prototype.reset = function() { var data = this.data, keys = data.keys; while(keys.length > 0){ var key = keys.pop(); delete data[key]; } }; },{}],53:[function(_dereq_,module,exports){ function Utils(){} module.exports = Utils; /** * Extend an options object with default values. * @static * @method defaults * @param {object} options The options object. May be falsy: in this case, a new object is created and returned. * @param {object} defaults An object containing default values. * @return {object} The modified options object. */ Utils.defaults = function(options, defaults){ options = options || {}; for(var key in defaults){ if(!(key in options)){ options[key] = defaults[key]; } } return options; }; },{}],54:[function(_dereq_,module,exports){ module.exports = Vec3Pool; var Vec3 = _dereq_('../math/Vec3'); var Pool = _dereq_('./Pool'); /** * @class Vec3Pool * @constructor * @extends Pool */ function Vec3Pool(){ Pool.call(this); this.type = Vec3; } Vec3Pool.prototype = new Pool(); /** * Construct a vector * @method constructObject * @return {Vec3} */ Vec3Pool.prototype.constructObject = function(){ return new Vec3(); }; },{"../math/Vec3":30,"./Pool":51}],55:[function(_dereq_,module,exports){ module.exports = Narrowphase; var AABB = _dereq_('../collision/AABB'); var Shape = _dereq_('../shapes/Shape'); var Ray = _dereq_('../collision/Ray'); var Vec3 = _dereq_('../math/Vec3'); var Transform = _dereq_('../math/Transform'); var ConvexPolyhedron = _dereq_('../shapes/ConvexPolyhedron'); var Quaternion = _dereq_('../math/Quaternion'); var Solver = _dereq_('../solver/Solver'); var Vec3Pool = _dereq_('../utils/Vec3Pool'); var ContactEquation = _dereq_('../equations/ContactEquation'); var FrictionEquation = _dereq_('../equations/FrictionEquation'); /** * Helper class for the World. Generates ContactEquations. * @class Narrowphase * @constructor * @todo Sphere-ConvexPolyhedron contacts * @todo Contact reduction * @todo should move methods to prototype */ function Narrowphase(world){ /** * Internal storage of pooled contact points. * @property {Array} contactPointPool */ this.contactPointPool = []; this.frictionEquationPool = []; this.result = []; this.frictionResult = []; /** * Pooled vectors. * @property {Vec3Pool} v3pool */ this.v3pool = new Vec3Pool(); this.world = world; this.currentContactMaterial = null; /** * @property {Boolean} enableFrictionReduction */ this.enableFrictionReduction = false; } /** * Make a contact object, by using the internal pool or creating a new one. * @method createContactEquation * @return {ContactEquation} */ Narrowphase.prototype.createContactEquation = function(bi, bj, si, sj, rsi, rsj){ var c; if(this.contactPointPool.length){ c = this.contactPointPool.pop(); c.bi = bi; c.bj = bj; } else { c = new ContactEquation(bi, bj); } c.enabled = bi.collisionResponse && bj.collisionResponse && si.collisionResponse && sj.collisionResponse; var cm = this.currentContactMaterial; c.restitution = cm.restitution; c.setSpookParams( cm.contactEquationStiffness, cm.contactEquationRelaxation, this.world.dt ); var matA = si.material || bi.material; var matB = sj.material || bj.material; if(matA && matB && matA.restitution >= 0 && matB.restitution >= 0){ c.restitution = matA.restitution * matB.restitution; } c.si = rsi || si; c.sj = rsj || sj; return c; }; Narrowphase.prototype.createFrictionEquationsFromContact = function(contactEquation, outArray){ var bodyA = contactEquation.bi; var bodyB = contactEquation.bj; var shapeA = contactEquation.si; var shapeB = contactEquation.sj; var world = this.world; var cm = this.currentContactMaterial; // If friction or restitution were specified in the material, use them var friction = cm.friction; var matA = shapeA.material || bodyA.material; var matB = shapeB.material || bodyB.material; if(matA && matB && matA.friction >= 0 && matB.friction >= 0){ friction = matA.friction * matB.friction; } if(friction > 0){ // Create 2 tangent equations var mug = friction * world.gravity.length(); var reducedMass = (bodyA.invMass + bodyB.invMass); if(reducedMass > 0){ reducedMass = 1/reducedMass; } var pool = this.frictionEquationPool; var c1 = pool.length ? pool.pop() : new FrictionEquation(bodyA,bodyB,mug*reducedMass); var c2 = pool.length ? pool.pop() : new FrictionEquation(bodyA,bodyB,mug*reducedMass); c1.bi = c2.bi = bodyA; c1.bj = c2.bj = bodyB; c1.minForce = c2.minForce = -mug*reducedMass; c1.maxForce = c2.maxForce = mug*reducedMass; // Copy over the relative vectors c1.ri.copy(contactEquation.ri); c1.rj.copy(contactEquation.rj); c2.ri.copy(contactEquation.ri); c2.rj.copy(contactEquation.rj); // Construct tangents contactEquation.ni.tangents(c1.t, c2.t); // Set spook params c1.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, world.dt); c2.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, world.dt); c1.enabled = c2.enabled = contactEquation.enabled; outArray.push(c1, c2); return true; } return false; }; var averageNormal = new Vec3(); var averageContactPointA = new Vec3(); var averageContactPointB = new Vec3(); // Take the average N latest contact point on the plane. Narrowphase.prototype.createFrictionFromAverage = function(numContacts){ // The last contactEquation var c = this.result[this.result.length - 1]; // Create the result: two "average" friction equations if (!this.createFrictionEquationsFromContact(c, this.frictionResult) || numContacts === 1) { return; } var f1 = this.frictionResult[this.frictionResult.length - 2]; var f2 = this.frictionResult[this.frictionResult.length - 1]; averageNormal.setZero(); averageContactPointA.setZero(); averageContactPointB.setZero(); var bodyA = c.bi; var bodyB = c.bj; for(var i=0; i!==numContacts; i++){ c = this.result[this.result.length - 1 - i]; if(c.bodyA !== bodyA){ averageNormal.vadd(c.ni, averageNormal); // vec2.add(eq.t, eq.t, c.normalA); averageContactPointA.vadd(c.ri, averageContactPointA); // vec2.add(eq.contactPointA, eq.contactPointA, c.contactPointA); averageContactPointB.vadd(c.rj, averageContactPointB); } else { averageNormal.vsub(c.ni, averageNormal); // vec2.sub(eq.t, eq.t, c.normalA); averageContactPointA.vadd(c.rj, averageContactPointA); // vec2.add(eq.contactPointA, eq.contactPointA, c.contactPointA); averageContactPointB.vadd(c.ri, averageContactPointB); } } var invNumContacts = 1 / numContacts; averageContactPointA.scale(invNumContacts, f1.ri); // vec2.scale(eq.contactPointA, eq.contactPointA, invNumContacts); averageContactPointB.scale(invNumContacts, f1.rj); // vec2.scale(eq.contactPointB, eq.contactPointB, invNumContacts); f2.ri.copy(f1.ri); // Should be the same f2.rj.copy(f1.rj); averageNormal.normalize(); averageNormal.tangents(f1.t, f2.t); // return eq; }; var tmpVec1 = new Vec3(); var tmpVec2 = new Vec3(); var tmpQuat1 = new Quaternion(); var tmpQuat2 = new Quaternion(); /** * Generate all contacts between a list of body pairs * @method getContacts * @param {array} p1 Array of body indices * @param {array} p2 Array of body indices * @param {World} world * @param {array} result Array to store generated contacts * @param {array} oldcontacts Optional. Array of reusable contact objects */ Narrowphase.prototype.getContacts = function(p1, p2, world, result, oldcontacts, frictionResult, frictionPool){ // Save old contact objects this.contactPointPool = oldcontacts; this.frictionEquationPool = frictionPool; this.result = result; this.frictionResult = frictionResult; var qi = tmpQuat1; var qj = tmpQuat2; var xi = tmpVec1; var xj = tmpVec2; for(var k=0, N=p1.length; k!==N; k++){ // Get current collision bodies var bi = p1[k], bj = p2[k]; // Get contact material var bodyContactMaterial = null; if(bi.material && bj.material){ bodyContactMaterial = world.getContactMaterial(bi.material,bj.material) || null; } for (var i = 0; i < bi.shapes.length; i++) { bi.quaternion.mult(bi.shapeOrientations[i], qi); bi.quaternion.vmult(bi.shapeOffsets[i], xi); xi.vadd(bi.position, xi); var si = bi.shapes[i]; for (var j = 0; j < bj.shapes.length; j++) { // Compute world transform of shapes bj.quaternion.mult(bj.shapeOrientations[j], qj); bj.quaternion.vmult(bj.shapeOffsets[j], xj); xj.vadd(bj.position, xj); var sj = bj.shapes[j]; if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){ continue; } // Get collision material var shapeContactMaterial = null; if(si.material && sj.material){ shapeContactMaterial = world.getContactMaterial(si.material,sj.material) || null; } this.currentContactMaterial = shapeContactMaterial || bodyContactMaterial || world.defaultContactMaterial; // Get contacts var resolver = this[si.type | sj.type]; if(resolver){ if (si.type < sj.type) { resolver.call(this, si, sj, xi, xj, qi, qj, bi, bj, si, sj); } else { resolver.call(this, sj, si, xj, xi, qj, qi, bj, bi, si, sj); } } } } } }; var numWarnings = 0; var maxWarnings = 10; function warn(msg){ if(numWarnings > maxWarnings){ return; } numWarnings++; console.warn(msg); } Narrowphase.prototype[Shape.types.BOX | Shape.types.BOX] = Narrowphase.prototype.boxBox = function(si,sj,xi,xj,qi,qj,bi,bj){ si.convexPolyhedronRepresentation.material = si.material; sj.convexPolyhedronRepresentation.material = sj.material; si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse; sj.convexPolyhedronRepresentation.collisionResponse = sj.collisionResponse; this.convexConvex(si.convexPolyhedronRepresentation,sj.convexPolyhedronRepresentation,xi,xj,qi,qj,bi,bj,si,sj); }; Narrowphase.prototype[Shape.types.BOX | Shape.types.CONVEXPOLYHEDRON] = Narrowphase.prototype.boxConvex = function(si,sj,xi,xj,qi,qj,bi,bj){ si.convexPolyhedronRepresentation.material = si.material; si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse; this.convexConvex(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj); }; Narrowphase.prototype[Shape.types.BOX | Shape.types.PARTICLE] = Narrowphase.prototype.boxParticle = function(si,sj,xi,xj,qi,qj,bi,bj){ si.convexPolyhedronRepresentation.material = si.material; si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse; this.convexParticle(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj); }; /** * @method sphereSphere * @param {Shape} si * @param {Shape} sj * @param {Vec3} xi * @param {Vec3} xj * @param {Quaternion} qi * @param {Quaternion} qj * @param {Body} bi * @param {Body} bj */ Narrowphase.prototype[Shape.types.SPHERE] = Narrowphase.prototype.sphereSphere = function(si,sj,xi,xj,qi,qj,bi,bj){ // We will have only one contact in this case var r = this.createContactEquation(bi,bj,si,sj); // Contact normal xj.vsub(xi, r.ni); r.ni.normalize(); // Contact point locations r.ri.copy(r.ni); r.rj.copy(r.ni); r.ri.mult(si.radius, r.ri); r.rj.mult(-sj.radius, r.rj); r.ri.vadd(xi, r.ri); r.ri.vsub(bi.position, r.ri); r.rj.vadd(xj, r.rj); r.rj.vsub(bj.position, r.rj); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); }; /** * @method planeTrimesh * @param {Shape} si * @param {Shape} sj * @param {Vec3} xi * @param {Vec3} xj * @param {Quaternion} qi * @param {Quaternion} qj * @param {Body} bi * @param {Body} bj */ var planeTrimesh_normal = new Vec3(); var planeTrimesh_relpos = new Vec3(); var planeTrimesh_projected = new Vec3(); Narrowphase.prototype[Shape.types.PLANE | Shape.types.TRIMESH] = Narrowphase.prototype.planeTrimesh = function( planeShape, trimeshShape, planePos, trimeshPos, planeQuat, trimeshQuat, planeBody, trimeshBody ){ // Make contacts! var v = new Vec3(); var normal = planeTrimesh_normal; normal.set(0,0,1); planeQuat.vmult(normal,normal); // Turn normal according to plane for(var i=0; i 0 && positionAlongEdgeB < 0){ // Now check the orthogonal distance from edge to sphere center localSpherePos.vsub(edgeVertexA, tmp); edgeVectorUnit.copy(edgeVector); edgeVectorUnit.normalize(); positionAlongEdgeA = tmp.dot(edgeVectorUnit); edgeVectorUnit.scale(positionAlongEdgeA, tmp); tmp.vadd(edgeVertexA, tmp); // tmp is now the sphere center position projected to the edge, defined locally in the trimesh frame var dist = tmp.distanceTo(localSpherePos); if(dist < sphereShape.radius){ var r = this.createContactEquation(sphereBody, trimeshBody, sphereShape, trimeshShape); tmp.vsub(localSpherePos, r.ni); r.ni.normalize(); r.ni.scale(sphereShape.radius, r.ri); Transform.pointToWorldFrame(trimeshPos, trimeshQuat, tmp, tmp); tmp.vsub(trimeshBody.position, r.rj); Transform.vectorToWorldFrame(trimeshQuat, r.ni, r.ni); Transform.vectorToWorldFrame(trimeshQuat, r.ri, r.ri); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); } } } } // Triangle faces var va = sphereTrimesh_va; var vb = sphereTrimesh_vb; var vc = sphereTrimesh_vc; var normal = sphereTrimesh_normal; for(var i=0, N = triangles.length; i !== N; i++){ trimeshShape.getTriangleVertices(triangles[i], va, vb, vc); trimeshShape.getNormal(triangles[i], normal); localSpherePos.vsub(va, tmp); var dist = tmp.dot(normal); normal.scale(dist, tmp); localSpherePos.vsub(tmp, tmp); // tmp is now the sphere position projected to the triangle plane dist = tmp.distanceTo(localSpherePos); if(Ray.pointInTriangle(tmp, va, vb, vc) && dist < sphereShape.radius){ var r = this.createContactEquation(sphereBody, trimeshBody, sphereShape, trimeshShape); tmp.vsub(localSpherePos, r.ni); r.ni.normalize(); r.ni.scale(sphereShape.radius, r.ri); Transform.pointToWorldFrame(trimeshPos, trimeshQuat, tmp, tmp); tmp.vsub(trimeshBody.position, r.rj); Transform.vectorToWorldFrame(trimeshQuat, r.ni, r.ni); Transform.vectorToWorldFrame(trimeshQuat, r.ri, r.ri); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); } } triangles.length = 0; }; var point_on_plane_to_sphere = new Vec3(); var plane_to_sphere_ortho = new Vec3(); /** * @method spherePlane * @param {Shape} si * @param {Shape} sj * @param {Vec3} xi * @param {Vec3} xj * @param {Quaternion} qi * @param {Quaternion} qj * @param {Body} bi * @param {Body} bj */ Narrowphase.prototype[Shape.types.SPHERE | Shape.types.PLANE] = Narrowphase.prototype.spherePlane = function(si,sj,xi,xj,qi,qj,bi,bj){ // We will have one contact in this case var r = this.createContactEquation(bi,bj,si,sj); // Contact normal r.ni.set(0,0,1); qj.vmult(r.ni, r.ni); r.ni.negate(r.ni); // body i is the sphere, flip normal r.ni.normalize(); // Needed? // Vector from sphere center to contact point r.ni.mult(si.radius, r.ri); // Project down sphere on plane xi.vsub(xj, point_on_plane_to_sphere); r.ni.mult(r.ni.dot(point_on_plane_to_sphere), plane_to_sphere_ortho); point_on_plane_to_sphere.vsub(plane_to_sphere_ortho,r.rj); // The sphere position projected to plane if(-point_on_plane_to_sphere.dot(r.ni) <= si.radius){ // Make it relative to the body var ri = r.ri; var rj = r.rj; ri.vadd(xi, ri); ri.vsub(bi.position, ri); rj.vadd(xj, rj); rj.vsub(bj.position, rj); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); } }; // See http://bulletphysics.com/Bullet/BulletFull/SphereTriangleDetector_8cpp_source.html var pointInPolygon_edge = new Vec3(); var pointInPolygon_edge_x_normal = new Vec3(); var pointInPolygon_vtp = new Vec3(); function pointInPolygon(verts, normal, p){ var positiveResult = null; var N = verts.length; for(var i=0; i!==N; i++){ var v = verts[i]; // Get edge to the next vertex var edge = pointInPolygon_edge; verts[(i+1) % (N)].vsub(v,edge); // Get cross product between polygon normal and the edge var edge_x_normal = pointInPolygon_edge_x_normal; //var edge_x_normal = new Vec3(); edge.cross(normal,edge_x_normal); // Get vector between point and current vertex var vertex_to_p = pointInPolygon_vtp; p.vsub(v,vertex_to_p); // This dot product determines which side of the edge the point is var r = edge_x_normal.dot(vertex_to_p); // If all such dot products have same sign, we are inside the polygon. if(positiveResult===null || (r>0 && positiveResult===true) || (r<=0 && positiveResult===false)){ if(positiveResult===null){ positiveResult = r>0; } continue; } else { return false; // Encountered some other sign. Exit. } } // If we got here, all dot products were of the same sign. return true; } var box_to_sphere = new Vec3(); var sphereBox_ns = new Vec3(); var sphereBox_ns1 = new Vec3(); var sphereBox_ns2 = new Vec3(); var sphereBox_sides = [new Vec3(),new Vec3(),new Vec3(),new Vec3(),new Vec3(),new Vec3()]; var sphereBox_sphere_to_corner = new Vec3(); var sphereBox_side_ns = new Vec3(); var sphereBox_side_ns1 = new Vec3(); var sphereBox_side_ns2 = new Vec3(); /** * @method sphereBox * @param {Shape} si * @param {Shape} sj * @param {Vec3} xi * @param {Vec3} xj * @param {Quaternion} qi * @param {Quaternion} qj * @param {Body} bi * @param {Body} bj */ Narrowphase.prototype[Shape.types.SPHERE | Shape.types.BOX] = Narrowphase.prototype.sphereBox = function(si,sj,xi,xj,qi,qj,bi,bj){ var v3pool = this.v3pool; // we refer to the box as body j var sides = sphereBox_sides; xi.vsub(xj,box_to_sphere); sj.getSideNormals(sides,qj); var R = si.radius; var penetrating_sides = []; // Check side (plane) intersections var found = false; // Store the resulting side penetration info var side_ns = sphereBox_side_ns; var side_ns1 = sphereBox_side_ns1; var side_ns2 = sphereBox_side_ns2; var side_h = null; var side_penetrations = 0; var side_dot1 = 0; var side_dot2 = 0; var side_distance = null; for(var idx=0,nsides=sides.length; idx!==nsides && found===false; idx++){ // Get the plane side normal (ns) var ns = sphereBox_ns; ns.copy(sides[idx]); var h = ns.norm(); ns.normalize(); // The normal/distance dot product tells which side of the plane we are var dot = box_to_sphere.dot(ns); if(dot0){ // Intersects plane. Now check the other two dimensions var ns1 = sphereBox_ns1; var ns2 = sphereBox_ns2; ns1.copy(sides[(idx+1)%3]); ns2.copy(sides[(idx+2)%3]); var h1 = ns1.norm(); var h2 = ns2.norm(); ns1.normalize(); ns2.normalize(); var dot1 = box_to_sphere.dot(ns1); var dot2 = box_to_sphere.dot(ns2); if(dot1

-h1 && dot2

-h2){ var dist = Math.abs(dot-h-R); if(side_distance===null || dist < side_distance){ side_distance = dist; side_dot1 = dot1; side_dot2 = dot2; side_h = h; side_ns.copy(ns); side_ns1.copy(ns1); side_ns2.copy(ns2); side_penetrations++; } } } } if(side_penetrations){ found = true; var r = this.createContactEquation(bi,bj,si,sj); side_ns.mult(-R,r.ri); // Sphere r r.ni.copy(side_ns); r.ni.negate(r.ni); // Normal should be out of sphere side_ns.mult(side_h,side_ns); side_ns1.mult(side_dot1,side_ns1); side_ns.vadd(side_ns1,side_ns); side_ns2.mult(side_dot2,side_ns2); side_ns.vadd(side_ns2,r.rj); // Make relative to bodies r.ri.vadd(xi, r.ri); r.ri.vsub(bi.position, r.ri); r.rj.vadd(xj, r.rj); r.rj.vsub(bj.position, r.rj); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); } // Check corners var rj = v3pool.get(); var sphere_to_corner = sphereBox_sphere_to_corner; for(var j=0; j!==2 && !found; j++){ for(var k=0; k!==2 && !found; k++){ for(var l=0; l!==2 && !found; l++){ rj.set(0,0,0); if(j){ rj.vadd(sides[0],rj); } else { rj.vsub(sides[0],rj); } if(k){ rj.vadd(sides[1],rj); } else { rj.vsub(sides[1],rj); } if(l){ rj.vadd(sides[2],rj); } else { rj.vsub(sides[2],rj); } // World position of corner xj.vadd(rj,sphere_to_corner); sphere_to_corner.vsub(xi,sphere_to_corner); if(sphere_to_corner.norm2() < R*R){ found = true; var r = this.createContactEquation(bi,bj,si,sj); r.ri.copy(sphere_to_corner); r.ri.normalize(); r.ni.copy(r.ri); r.ri.mult(R,r.ri); r.rj.copy(rj); // Make relative to bodies r.ri.vadd(xi, r.ri); r.ri.vsub(bi.position, r.ri); r.rj.vadd(xj, r.rj); r.rj.vsub(bj.position, r.rj); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); } } } } v3pool.release(rj); rj = null; // Check edges var edgeTangent = v3pool.get(); var edgeCenter = v3pool.get(); var r = v3pool.get(); // r = edge center to sphere center var orthogonal = v3pool.get(); var dist = v3pool.get(); var Nsides = sides.length; for(var j=0; j!==Nsides && !found; j++){ for(var k=0; k!==Nsides && !found; k++){ if(j%3 !== k%3){ // Get edge tangent sides[k].cross(sides[j],edgeTangent); edgeTangent.normalize(); sides[j].vadd(sides[k], edgeCenter); r.copy(xi); r.vsub(edgeCenter,r); r.vsub(xj,r); var orthonorm = r.dot(edgeTangent); // distance from edge center to sphere center in the tangent direction edgeTangent.mult(orthonorm,orthogonal); // Vector from edge center to sphere center in the tangent direction // Find the third side orthogonal to this one var l = 0; while(l===j%3 || l===k%3){ l++; } // vec from edge center to sphere projected to the plane orthogonal to the edge tangent dist.copy(xi); dist.vsub(orthogonal,dist); dist.vsub(edgeCenter,dist); dist.vsub(xj,dist); // Distances in tangent direction and distance in the plane orthogonal to it var tdist = Math.abs(orthonorm); var ndist = dist.norm(); if(tdist < sides[l].norm() && ndist si.boundingSphereRadius + sj.boundingSphereRadius){ // return; // } // Check corners for(var i=0; i!==verts.length; i++){ var v = verts[i]; // World position of corner var worldCorner = sphereConvex_worldCorner; qj.vmult(v,worldCorner); xj.vadd(worldCorner,worldCorner); var sphere_to_corner = sphereConvex_sphereToCorner; worldCorner.vsub(xi, sphere_to_corner); if(sphere_to_corner.norm2() < R * R){ found = true; var r = this.createContactEquation(bi,bj,si,sj); r.ri.copy(sphere_to_corner); r.ri.normalize(); r.ni.copy(r.ri); r.ri.mult(R,r.ri); worldCorner.vsub(xj,r.rj); // Should be relative to the body. r.ri.vadd(xi, r.ri); r.ri.vsub(bi.position, r.ri); // Should be relative to the body. r.rj.vadd(xj, r.rj); r.rj.vsub(bj.position, r.rj); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); return; } } // Check side (plane) intersections var found = false; for(var i=0, nfaces=faces.length; i!==nfaces && found===false; i++){ var normal = normals[i]; var face = faces[i]; // Get world-transformed normal of the face var worldNormal = sphereConvex_worldNormal; qj.vmult(normal,worldNormal); // Get a world vertex from the face var worldPoint = sphereConvex_worldPoint; qj.vmult(verts[face[0]],worldPoint); worldPoint.vadd(xj,worldPoint); // Get a point on the sphere, closest to the face normal var worldSpherePointClosestToPlane = sphereConvex_worldSpherePointClosestToPlane; worldNormal.mult(-R, worldSpherePointClosestToPlane); xi.vadd(worldSpherePointClosestToPlane, worldSpherePointClosestToPlane); // Vector from a face point to the closest point on the sphere var penetrationVec = sphereConvex_penetrationVec; worldSpherePointClosestToPlane.vsub(worldPoint,penetrationVec); // The penetration. Negative value means overlap. var penetration = penetrationVec.dot(worldNormal); var worldPointToSphere = sphereConvex_sphereToWorldPoint; xi.vsub(worldPoint, worldPointToSphere); if(penetration < 0 && worldPointToSphere.dot(worldNormal)>0){ // Intersects plane. Now check if the sphere is inside the face polygon var faceVerts = []; // Face vertices, in world coords for(var j=0, Nverts=face.length; j!==Nverts; j++){ var worldVertex = v3pool.get(); qj.vmult(verts[face[j]], worldVertex); xj.vadd(worldVertex,worldVertex); faceVerts.push(worldVertex); } if(pointInPolygon(faceVerts,worldNormal,xi)){ // Is the sphere center in the face polygon? found = true; var r = this.createContactEquation(bi,bj,si,sj); worldNormal.mult(-R, r.ri); // Contact offset, from sphere center to contact worldNormal.negate(r.ni); // Normal pointing out of sphere var penetrationVec2 = v3pool.get(); worldNormal.mult(-penetration, penetrationVec2); var penetrationSpherePoint = v3pool.get(); worldNormal.mult(-R, penetrationSpherePoint); //xi.vsub(xj).vadd(penetrationSpherePoint).vadd(penetrationVec2 , r.rj); xi.vsub(xj,r.rj); r.rj.vadd(penetrationSpherePoint,r.rj); r.rj.vadd(penetrationVec2 , r.rj); // Should be relative to the body. r.rj.vadd(xj, r.rj); r.rj.vsub(bj.position, r.rj); // Should be relative to the body. r.ri.vadd(xi, r.ri); r.ri.vsub(bi.position, r.ri); v3pool.release(penetrationVec2); v3pool.release(penetrationSpherePoint); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); // Release world vertices for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){ v3pool.release(faceVerts[j]); } return; // We only expect *one* face contact } else { // Edge? for(var j=0; j!==face.length; j++){ // Get two world transformed vertices var v1 = v3pool.get(); var v2 = v3pool.get(); qj.vmult(verts[face[(j+1)%face.length]], v1); qj.vmult(verts[face[(j+2)%face.length]], v2); xj.vadd(v1, v1); xj.vadd(v2, v2); // Construct edge vector var edge = sphereConvex_edge; v2.vsub(v1,edge); // Construct the same vector, but normalized var edgeUnit = sphereConvex_edgeUnit; edge.unit(edgeUnit); // p is xi projected onto the edge var p = v3pool.get(); var v1_to_xi = v3pool.get(); xi.vsub(v1, v1_to_xi); var dot = v1_to_xi.dot(edgeUnit); edgeUnit.mult(dot, p); p.vadd(v1, p); // Compute a vector from p to the center of the sphere var xi_to_p = v3pool.get(); p.vsub(xi, xi_to_p); // Collision if the edge-sphere distance is less than the radius // AND if p is in between v1 and v2 if(dot > 0 && dot*dot si.boundingSphereRadius + sj.boundingSphereRadius){ return; } if(si.findSeparatingAxis(sj,xi,qi,xj,qj,sepAxis,faceListA,faceListB)){ var res = []; var q = convexConvex_q; si.clipAgainstHull(xi,qi,sj,xj,qj,sepAxis,-100,100,res); var numContacts = 0; for(var j = 0; j !== res.length; j++){ var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj), ri = r.ri, rj = r.rj; sepAxis.negate(r.ni); res[j].normal.negate(q); q.mult(res[j].depth, q); res[j].point.vadd(q, ri); rj.copy(res[j].point); // Contact points are in world coordinates. Transform back to relative ri.vsub(xi,ri); rj.vsub(xj,rj); // Make relative to bodies ri.vadd(xi, ri); ri.vsub(bi.position, ri); rj.vadd(xj, rj); rj.vsub(bj.position, rj); this.result.push(r); numContacts++; if(!this.enableFrictionReduction){ this.createFrictionEquationsFromContact(r, this.frictionResult); } } if(this.enableFrictionReduction && numContacts){ this.createFrictionFromAverage(numContacts); } } }; /** * @method convexTrimesh * @param {Array} result * @param {Shape} si * @param {Shape} sj * @param {Vec3} xi * @param {Vec3} xj * @param {Quaternion} qi * @param {Quaternion} qj * @param {Body} bi * @param {Body} bj */ // Narrowphase.prototype[Shape.types.CONVEXPOLYHEDRON | Shape.types.TRIMESH] = // Narrowphase.prototype.convexTrimesh = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,faceListA,faceListB){ // var sepAxis = convexConvex_sepAxis; // if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){ // return; // } // // Construct a temp hull for each triangle // var hullB = new ConvexPolyhedron(); // hullB.faces = [[0,1,2]]; // var va = new Vec3(); // var vb = new Vec3(); // var vc = new Vec3(); // hullB.vertices = [ // va, // vb, // vc // ]; // for (var i = 0; i < sj.indices.length / 3; i++) { // var triangleNormal = new Vec3(); // sj.getNormal(i, triangleNormal); // hullB.faceNormals = [triangleNormal]; // sj.getTriangleVertices(i, va, vb, vc); // var d = si.testSepAxis(triangleNormal, hullB, xi, qi, xj, qj); // if(!d){ // triangleNormal.scale(-1, triangleNormal); // d = si.testSepAxis(triangleNormal, hullB, xi, qi, xj, qj); // if(!d){ // continue; // } // } // var res = []; // var q = convexConvex_q; // si.clipAgainstHull(xi,qi,hullB,xj,qj,triangleNormal,-100,100,res); // for(var j = 0; j !== res.length; j++){ // var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj), // ri = r.ri, // rj = r.rj; // r.ni.copy(triangleNormal); // r.ni.negate(r.ni); // res[j].normal.negate(q); // q.mult(res[j].depth, q); // res[j].point.vadd(q, ri); // rj.copy(res[j].point); // // Contact points are in world coordinates. Transform back to relative // ri.vsub(xi,ri); // rj.vsub(xj,rj); // // Make relative to bodies // ri.vadd(xi, ri); // ri.vsub(bi.position, ri); // rj.vadd(xj, rj); // rj.vsub(bj.position, rj); // result.push(r); // } // } // }; var particlePlane_normal = new Vec3(); var particlePlane_relpos = new Vec3(); var particlePlane_projected = new Vec3(); /** * @method particlePlane * @param {Array} result * @param {Shape} si * @param {Shape} sj * @param {Vec3} xi * @param {Vec3} xj * @param {Quaternion} qi * @param {Quaternion} qj * @param {Body} bi * @param {Body} bj */ Narrowphase.prototype[Shape.types.PLANE | Shape.types.PARTICLE] = Narrowphase.prototype.planeParticle = function(sj,si,xj,xi,qj,qi,bj,bi){ var normal = particlePlane_normal; normal.set(0,0,1); bj.quaternion.vmult(normal,normal); // Turn normal according to plane orientation var relpos = particlePlane_relpos; xi.vsub(bj.position,relpos); var dot = normal.dot(relpos); if(dot <= 0.0){ var r = this.createContactEquation(bi,bj,si,sj); r.ni.copy(normal); // Contact normal is the plane normal r.ni.negate(r.ni); r.ri.set(0,0,0); // Center of particle // Get particle position projected on plane var projected = particlePlane_projected; normal.mult(normal.dot(xi),projected); xi.vsub(projected,projected); //projected.vadd(bj.position,projected); // rj is now the projected world position minus plane position r.rj.copy(projected); this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); } }; var particleSphere_normal = new Vec3(); /** * @method particleSphere * @param {Array} result * @param {Shape} si * @param {Shape} sj * @param {Vec3} xi * @param {Vec3} xj * @param {Quaternion} qi * @param {Quaternion} qj * @param {Body} bi * @param {Body} bj */ Narrowphase.prototype[Shape.types.PARTICLE | Shape.types.SPHERE] = Narrowphase.prototype.sphereParticle = function(sj,si,xj,xi,qj,qi,bj,bi){ // The normal is the unit vector from sphere center to particle center var normal = particleSphere_normal; normal.set(0,0,1); xi.vsub(xj,normal); var lengthSquared = normal.norm2(); if(lengthSquared <= sj.radius * sj.radius){ var r = this.createContactEquation(bi,bj,si,sj); normal.normalize(); r.rj.copy(normal); r.rj.mult(sj.radius,r.rj); r.ni.copy(normal); // Contact normal r.ni.negate(r.ni); r.ri.set(0,0,0); // Center of particle this.result.push(r); this.createFrictionEquationsFromContact(r, this.frictionResult); } }; // WIP var cqj = new Quaternion(); var convexParticle_local = new Vec3(); var convexParticle_normal = new Vec3(); var convexParticle_penetratedFaceNormal = new Vec3(); var convexParticle_vertexToParticle = new Vec3(); var convexParticle_worldPenetrationVec = new Vec3(); /** * @method convexParticle * @param {Array} result * @param {Shape} si * @param {Shape} sj * @param {Vec3} xi * @param {Vec3} xj * @param {Quaternion} qi * @param {Quaternion} qj * @param {Body} bi * @param {Body} bj */ Narrowphase.prototype[Shape.types.PARTICLE | Shape.types.CONVEXPOLYHEDRON] = Narrowphase.prototype.convexParticle = function(sj,si,xj,xi,qj,qi,bj,bi){ var penetratedFaceIndex = -1; var penetratedFaceNormal = convexParticle_penetratedFaceNormal; var worldPenetrationVec = convexParticle_worldPenetrationVec; var minPenetration = null; var numDetectedFaces = 0; // Convert particle position xi to local coords in the convex var local = convexParticle_local; local.copy(xi); local.vsub(xj,local); // Convert position to relative the convex origin qj.conjugate(cqj); cqj.vmult(local,local); if(sj.pointIsInside(local)){ if(sj.worldVerticesNeedsUpdate){ sj.computeWorldVertices(xj,qj); } if(sj.worldFaceNormalsNeedsUpdate){ sj.computeWorldFaceNormals(qj); } // For each world polygon in the polyhedra for(var i=0,nfaces=sj.faces.length; i!==nfaces; i++){ // Construct world face vertices var verts = [ sj.worldVertices[ sj.faces[i][0] ] ]; var normal = sj.worldFaceNormals[i]; // Check how much the particle penetrates the polygon plane. xi.vsub(verts[0],convexParticle_vertexToParticle); var penetration = -normal.dot(convexParticle_vertexToParticle); if(minPenetration===null || Math.abs(penetration) data.length || iMinY > data[0].length){ return; } // Clamp index to edges if(iMinX < 0){ iMinX = 0; } if(iMaxX < 0){ iMaxX = 0; } if(iMinY < 0){ iMinY = 0; } if(iMaxY < 0){ iMaxY = 0; } if(iMinX >= data.length){ iMinX = data.length - 1; } if(iMaxX >= data.length){ iMaxX = data.length - 1; } if(iMaxY >= data[0].length){ iMaxY = data[0].length - 1; } if(iMinY >= data[0].length){ iMinY = data[0].length - 1; } var minMax = []; hfShape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax); var min = minMax[0]; var max = minMax[1]; // Bail out if we're cant touch the bounding height box if(localConvexPos.z - radius > max || localConvexPos.z + radius < min){ return; } for(var i = iMinX; i < iMaxX; i++){ for(var j = iMinY; j < iMaxY; j++){ // Lower triangle hfShape.getConvexTrianglePillar(i, j, false); Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset); if (convexPos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + convexShape.boundingSphereRadius) { this.convexConvex(convexShape, hfShape.pillarConvex, convexPos, worldPillarOffset, convexQuat, hfQuat, convexBody, hfBody, null, null, faceList, null); } // Upper triangle hfShape.getConvexTrianglePillar(i, j, true); Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset); if (convexPos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + convexShape.boundingSphereRadius) { this.convexConvex(convexShape, hfShape.pillarConvex, convexPos, worldPillarOffset, convexQuat, hfQuat, convexBody, hfBody, null, null, faceList, null); } } } }; var sphereHeightfield_tmp1 = new Vec3(); var sphereHeightfield_tmp2 = new Vec3(); /** * @method sphereHeightfield */ Narrowphase.prototype[Shape.types.SPHERE | Shape.types.HEIGHTFIELD] = Narrowphase.prototype.sphereHeightfield = function ( sphereShape, hfShape, spherePos, hfPos, sphereQuat, hfQuat, sphereBody, hfBody ){ var data = hfShape.data, radius = sphereShape.radius, w = hfShape.elementSize, worldPillarOffset = sphereHeightfield_tmp2; // Get sphere position to heightfield local! var localSpherePos = sphereHeightfield_tmp1; Transform.pointToLocalFrame(hfPos, hfQuat, spherePos, localSpherePos); // Get the index of the data points to test against var iMinX = Math.floor((localSpherePos.x - radius) / w) - 1, iMaxX = Math.ceil((localSpherePos.x + radius) / w) + 1, iMinY = Math.floor((localSpherePos.y - radius) / w) - 1, iMaxY = Math.ceil((localSpherePos.y + radius) / w) + 1; // Bail out if we are out of the terrain if(iMaxX < 0 || iMaxY < 0 || iMinX > data.length || iMaxY > data[0].length){ return; } // Clamp index to edges if(iMinX < 0){ iMinX = 0; } if(iMaxX < 0){ iMaxX = 0; } if(iMinY < 0){ iMinY = 0; } if(iMaxY < 0){ iMaxY = 0; } if(iMinX >= data.length){ iMinX = data.length - 1; } if(iMaxX >= data.length){ iMaxX = data.length - 1; } if(iMaxY >= data[0].length){ iMaxY = data[0].length - 1; } if(iMinY >= data[0].length){ iMinY = data[0].length - 1; } var minMax = []; hfShape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax); var min = minMax[0]; var max = minMax[1]; // Bail out if we're cant touch the bounding height box if(localSpherePos.z - radius > max || localSpherePos.z + radius < min){ return; } var result = this.result; for(var i = iMinX; i < iMaxX; i++){ for(var j = iMinY; j < iMaxY; j++){ var numContactsBefore = result.length; // Lower triangle hfShape.getConvexTrianglePillar(i, j, false); Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset); if (spherePos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + sphereShape.boundingSphereRadius) { this.sphereConvex(sphereShape, hfShape.pillarConvex, spherePos, worldPillarOffset, sphereQuat, hfQuat, sphereBody, hfBody); } // Upper triangle hfShape.getConvexTrianglePillar(i, j, true); Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset); if (spherePos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + sphereShape.boundingSphereRadius) { this.sphereConvex(sphereShape, hfShape.pillarConvex, spherePos, worldPillarOffset, sphereQuat, hfQuat, sphereBody, hfBody); } var numContacts = result.length - numContactsBefore; if(numContacts > 2){ return; } /* // Skip all but 1 for (var k = 0; k < numContacts - 1; k++) { result.pop(); } */ } } }; },{"../collision/AABB":3,"../collision/Ray":9,"../equations/ContactEquation":19,"../equations/FrictionEquation":21,"../math/Quaternion":28,"../math/Transform":29,"../math/Vec3":30,"../shapes/ConvexPolyhedron":38,"../shapes/Shape":43,"../solver/Solver":47,"../utils/Vec3Pool":54}],56:[function(_dereq_,module,exports){ /* global performance */ module.exports = World; var Shape = _dereq_('../shapes/Shape'); var Vec3 = _dereq_('../math/Vec3'); var Quaternion = _dereq_('../math/Quaternion'); var GSSolver = _dereq_('../solver/GSSolver'); var Vec3Pool = _dereq_('../utils/Vec3Pool'); var ContactEquation = _dereq_('../equations/ContactEquation'); var FrictionEquation = _dereq_('../equations/FrictionEquation'); var Narrowphase = _dereq_('./Narrowphase'); var EventTarget = _dereq_('../utils/EventTarget'); var ArrayCollisionMatrix = _dereq_('../collision/ArrayCollisionMatrix'); var Material = _dereq_('../material/Material'); var ContactMaterial = _dereq_('../material/ContactMaterial'); var Body = _dereq_('../objects/Body'); var TupleDictionary = _dereq_('../utils/TupleDictionary'); var RaycastResult = _dereq_('../collision/RaycastResult'); var AABB = _dereq_('../collision/AABB'); var Ray = _dereq_('../collision/Ray'); var NaiveBroadphase = _dereq_('../collision/NaiveBroadphase'); /** * The physics world * @class World * @constructor * @extends EventTarget */ function World(){ EventTarget.apply(this); /** * Currently / last used timestep. Is set to -1 if not available. This value is updated before each internal step, which means that it is "fresh" inside event callbacks. * @property {Number} dt */ this.dt = -1; /** * Makes bodies go to sleep when they've been inactive * @property allowSleep * @type {Boolean} */ this.allowSleep = false; /** * All the current contacts (instances of ContactEquation) in the world. * @property contacts * @type {Array} */ this.contacts = []; this.frictionEquations = []; /** * How often to normalize quaternions. Set to 0 for every step, 1 for every second etc.. A larger value increases performance. If bodies tend to explode, set to a smaller value (zero to be sure nothing can go wrong). * @property quatNormalizeSkip * @type {Number} */ this.quatNormalizeSkip = 0; /** * Set to true to use fast quaternion normalization. It is often enough accurate to use. If bodies tend to explode, set to false. * @property quatNormalizeFast * @type {Boolean} * @see Quaternion.normalizeFast * @see Quaternion.normalize */ this.quatNormalizeFast = false; /** * The wall-clock time since simulation start * @property time * @type {Number} */ this.time = 0.0; /** * Number of timesteps taken since start * @property stepnumber * @type {Number} */ this.stepnumber = 0; /// Default and last timestep sizes this.default_dt = 1/60; this.nextId = 0; /** * @property gravity * @type {Vec3} */ this.gravity = new Vec3(); /** * @property broadphase * @type {Broadphase} */ this.broadphase = new NaiveBroadphase(); /** * @property bodies * @type {Array} */ this.bodies = []; /** * @property solver * @type {Solver} */ this.solver = new GSSolver(); /** * @property constraints * @type {Array} */ this.constraints = []; /** * @property narrowphase * @type {Narrowphase} */ this.narrowphase = new Narrowphase(this); /** * @property {ArrayCollisionMatrix} collisionMatrix * @type {ArrayCollisionMatrix} */ this.collisionMatrix = new ArrayCollisionMatrix(); /** * CollisionMatrix from the previous step. * @property {ArrayCollisionMatrix} collisionMatrixPrevious * @type {ArrayCollisionMatrix} */ this.collisionMatrixPrevious = new ArrayCollisionMatrix(); /** * All added materials * @property materials * @type {Array} */ this.materials = []; /** * @property contactmaterials * @type {Array} */ this.contactmaterials = []; /** * Used to look up a ContactMaterial given two instances of Material. * @property {TupleDictionary} contactMaterialTable */ this.contactMaterialTable = new TupleDictionary(); this.defaultMaterial = new Material("default"); /** * This contact material is used if no suitable contactmaterial is found for a contact. * @property defaultContactMaterial * @type {ContactMaterial} */ this.defaultContactMaterial = new ContactMaterial(this.defaultMaterial, this.defaultMaterial, { friction: 0.3, restitution: 0.0 }); /** * @property doProfiling * @type {Boolean} */ this.doProfiling = false; /** * @property profile * @type {Object} */ this.profile = { solve:0, makeContactConstraints:0, broadphase:0, integrate:0, narrowphase:0, }; /** * @property subsystems * @type {Array} */ this.subsystems = []; this.addBodyEvent = { type:"addBody", body : null, }; this.removeBodyEvent = { type:"removeBody", body : null, }; } World.prototype = new EventTarget(); // Temp stuff var tmpAABB1 = new AABB(); var tmpArray1 = []; var tmpRay = new Ray(); /** * Get the contact material between materials m1 and m2 * @method getContactMaterial * @param {Material} m1 * @param {Material} m2 * @return {ContactMaterial} The contact material if it was found. */ World.prototype.getContactMaterial = function(m1,m2){ return this.contactMaterialTable.get(m1.id,m2.id); //this.contactmaterials[this.mats2cmat[i+j*this.materials.length]]; }; /** * Get number of objects in the world. * @method numObjects * @return {Number} * @deprecated */ World.prototype.numObjects = function(){ return this.bodies.length; }; /** * Store old collision state info * @method collisionMatrixTick */ World.prototype.collisionMatrixTick = function(){ var temp = this.collisionMatrixPrevious; this.collisionMatrixPrevious = this.collisionMatrix; this.collisionMatrix = temp; this.collisionMatrix.reset(); }; /** * Add a rigid body to the simulation. * @method add * @param {Body} body * @todo If the simulation has not yet started, why recrete and copy arrays for each body? Accumulate in dynamic arrays in this case. * @todo Adding an array of bodies should be possible. This would save some loops too * @deprecated Use .addBody instead */ World.prototype.add = World.prototype.addBody = function(body){ if(this.bodies.indexOf(body) !== -1){ return; } body.index = this.bodies.length; this.bodies.push(body); body.world = this; body.initPosition.copy(body.position); body.initVelocity.copy(body.velocity); body.timeLastSleepy = this.time; if(body instanceof Body){ body.initAngularVelocity.copy(body.angularVelocity); body.initQuaternion.copy(body.quaternion); } this.collisionMatrix.setNumObjects(this.bodies.length); this.addBodyEvent.body = body; this.dispatchEvent(this.addBodyEvent); }; /** * Add a constraint to the simulation. * @method addConstraint * @param {Constraint} c */ World.prototype.addConstraint = function(c){ this.constraints.push(c); }; /** * Removes a constraint * @method removeConstraint * @param {Constraint} c */ World.prototype.removeConstraint = function(c){ var idx = this.constraints.indexOf(c); if(idx!==-1){ this.constraints.splice(idx,1); } }; /** * Raycast test * @method rayTest * @param {Vec3} from * @param {Vec3} to * @param {Function|RaycastResult} result * @deprecated Use .raycastAll, .raycastClosest or .raycastAny instead. */ World.prototype.rayTest = function(from, to, result){ if(result instanceof RaycastResult){ // Do raycastclosest this.raycastClosest(from, to, { skipBackfaces: true }, result); } else { // Do raycastAll this.raycastAll(from, to, { skipBackfaces: true }, result); } }; /** * Ray cast against all bodies. The provided callback will be executed for each hit with a RaycastResult as single argument. * @method raycastAll * @param {Vec3} from * @param {Vec3} to * @param {Object} options * @param {number} [options.collisionFilterMask=-1] * @param {number} [options.collisionFilterGroup=-1] * @param {boolean} [options.skipBackfaces=false] * @param {boolean} [options.checkCollisionResponse=true] * @param {Function} callback * @return {boolean} True if any body was hit. */ World.prototype.raycastAll = function(from, to, options, callback){ options.mode = Ray.ALL; options.from = from; options.to = to; options.callback = callback; return tmpRay.intersectWorld(this, options); }; /** * Ray cast, and stop at the first result. Note that the order is random - but the method is fast. * @method raycastAny * @param {Vec3} from * @param {Vec3} to * @param {Object} options * @param {number} [options.collisionFilterMask=-1] * @param {number} [options.collisionFilterGroup=-1] * @param {boolean} [options.skipBackfaces=false] * @param {boolean} [options.checkCollisionResponse=true] * @param {RaycastResult} result * @return {boolean} True if any body was hit. */ World.prototype.raycastAny = function(from, to, options, result){ options.mode = Ray.ANY; options.from = from; options.to = to; options.result = result; return tmpRay.intersectWorld(this, options); }; /** * Ray cast, and return information of the closest hit. * @method raycastClosest * @param {Vec3} from * @param {Vec3} to * @param {Object} options * @param {number} [options.collisionFilterMask=-1] * @param {number} [options.collisionFilterGroup=-1] * @param {boolean} [options.skipBackfaces=false] * @param {boolean} [options.checkCollisionResponse=true] * @param {RaycastResult} result * @return {boolean} True if any body was hit. */ World.prototype.raycastClosest = function(from, to, options, result){ options.mode = Ray.CLOSEST; options.from = from; options.to = to; options.result = result; return tmpRay.intersectWorld(this, options); }; /** * Remove a rigid body from the simulation. * @method remove * @param {Body} body * @deprecated Use .removeBody instead */ World.prototype.remove = function(body){ body.world = null; var n = this.bodies.length-1, bodies = this.bodies, idx = bodies.indexOf(body); if(idx !== -1){ bodies.splice(idx, 1); // Todo: should use a garbage free method // Recompute index for(var i=0; i!==bodies.length; i++){ bodies[i].index = i; } this.collisionMatrix.setNumObjects(n); this.removeBodyEvent.body = body; this.dispatchEvent(this.removeBodyEvent); } }; /** * Remove a rigid body from the simulation. * @method removeBody * @param {Body} body */ World.prototype.removeBody = World.prototype.remove; /** * Adds a material to the World. * @method addMaterial * @param {Material} m * @todo Necessary? */ World.prototype.addMaterial = function(m){ this.materials.push(m); }; /** * Adds a contact material to the World * @method addContactMaterial * @param {ContactMaterial} cmat */ World.prototype.addContactMaterial = function(cmat) { // Add contact material this.contactmaterials.push(cmat); // Add current contact material to the material table this.contactMaterialTable.set(cmat.materials[0].id,cmat.materials[1].id,cmat); }; // performance.now() if(typeof performance === 'undefined'){ performance = {}; } if(!performance.now){ var nowOffset = Date.now(); if (performance.timing && performance.timing.navigationStart){ nowOffset = performance.timing.navigationStart; } performance.now = function(){ return Date.now() - nowOffset; }; } var step_tmp1 = new Vec3(); /** * Step the physics world forward in time. * * There are two modes. The simple mode is fixed timestepping without interpolation. In this case you only use the first argument. The second case uses interpolation. In that you also provide the time since the function was last used, as well as the maximum fixed timesteps to take. * * @method step * @param {Number} dt The fixed time step size to use. * @param {Number} [timeSinceLastCalled] The time elapsed since the function was last called. * @param {Number} [maxSubSteps=10] Maximum number of fixed steps to take per function call. * * @example * // fixed timestepping without interpolation * world.step(1/60); * * @see http://bulletphysics.org/mediawiki-1.5.8/index.php/Stepping_The_World */ World.prototype.step = function(dt, timeSinceLastCalled, maxSubSteps){ maxSubSteps = maxSubSteps || 10; timeSinceLastCalled = timeSinceLastCalled || 0; if(timeSinceLastCalled === 0){ // Fixed, simple stepping this.internalStep(dt); // Increment time this.time += dt; } else { // Compute the number of fixed steps we should have taken since the last step var internalSteps = Math.floor((this.time + timeSinceLastCalled) / dt) - Math.floor(this.time / dt); internalSteps = Math.min(internalSteps,maxSubSteps); // Do some fixed steps to catch up var t0 = performance.now(); for(var i=0; i!==internalSteps; i++){ this.internalStep(dt); if(performance.now() - t0 > dt * 1000){ // We are slower than real-time. Better bail out. break; } } // Increment internal clock this.time += timeSinceLastCalled; // Compute "Left over" time step var h = this.time % dt; var h_div_dt = h / dt; var interpvelo = step_tmp1; var bodies = this.bodies; for(var j=0; j !== bodies.length; j++){ var b = bodies[j]; if(b.type !== Body.STATIC && b.sleepState !== Body.SLEEPING){ // Interpolate b.position.vsub(b.previousPosition, interpvelo); interpvelo.scale(h_div_dt, interpvelo); b.position.vadd(interpvelo, b.interpolatedPosition); // TODO: interpolate quaternion // b.interpolatedAngle = b.angle + (b.angle - b.previousAngle) * h_div_dt; } else { // For static bodies, just copy. Who else will do it? b.interpolatedPosition.copy(b.position); b.interpolatedQuaternion.copy(b.quaternion); } } } }; /** * Step the simulation * @method step * @param {Number} dt */ var World_step_postStepEvent = {type:"postStep"}, // Reusable event objects to save memory World_step_preStepEvent = {type:"preStep"}, World_step_collideEvent = {type:"collide", body:null, contact:null }, World_step_oldContacts = [], // Pools for unused objects World_step_frictionEquationPool = [], World_step_p1 = [], // Reusable arrays for collision pairs World_step_p2 = [], World_step_gvec = new Vec3(), // Temporary vectors and quats World_step_vi = new Vec3(), World_step_vj = new Vec3(), World_step_wi = new Vec3(), World_step_wj = new Vec3(), World_step_t1 = new Vec3(), World_step_t2 = new Vec3(), World_step_rixn = new Vec3(), World_step_rjxn = new Vec3(), World_step_step_q = new Quaternion(), World_step_step_w = new Quaternion(), World_step_step_wq = new Quaternion(), invI_tau_dt = new Vec3(); World.prototype.internalStep = function(dt){ this.dt = dt; var world = this, that = this, contacts = this.contacts, p1 = World_step_p1, p2 = World_step_p2, N = this.numObjects(), bodies = this.bodies, solver = this.solver, gravity = this.gravity, doProfiling = this.doProfiling, profile = this.profile, DYNAMIC = Body.DYNAMIC, profilingStart, constraints = this.constraints, frictionEquationPool = World_step_frictionEquationPool, gnorm = gravity.norm(), gx = gravity.x, gy = gravity.y, gz = gravity.z, i=0; if(doProfiling){ profilingStart = performance.now(); } // Add gravity to all objects for(i=0; i!==N; i++){ var bi = bodies[i]; if(bi.type & DYNAMIC){ // Only for dynamic bodies var f = bi.force, m = bi.mass; f.x += m*gx; f.y += m*gy; f.z += m*gz; } } // Update subsystems for(var i=0, Nsubsystems=this.subsystems.length; i!==Nsubsystems; i++){ this.subsystems[i].update(); } // Collision detection if(doProfiling){ profilingStart = performance.now(); } p1.length = 0; // Clean up pair arrays from last step p2.length = 0; this.broadphase.collisionPairs(this,p1,p2); if(doProfiling){ profile.broadphase = performance.now() - profilingStart; } // Remove constrained pairs with collideConnected == false var Nconstraints = constraints.length; for(i=0; i!==Nconstraints; i++){ var c = constraints[i]; if(!c.collideConnected){ for(var j = p1.length-1; j>=0; j-=1){ if( (c.bodyA === p1[j] && c.bodyB === p2[j]) || (c.bodyB === p1[j] && c.bodyA === p2[j])){ p1.splice(j, 1); p2.splice(j, 1); } } } } this.collisionMatrixTick(); // Generate contacts if(doProfiling){ profilingStart = performance.now(); } var oldcontacts = World_step_oldContacts; var NoldContacts = contacts.length; for(i=0; i!==NoldContacts; i++){ oldcontacts.push(contacts[i]); } contacts.length = 0; // Transfer FrictionEquation from current list to the pool for reuse var NoldFrictionEquations = this.frictionEquations.length; for(i=0; i!==NoldFrictionEquations; i++){ frictionEquationPool.push(this.frictionEquations[i]); } this.frictionEquations.length = 0; this.narrowphase.getContacts( p1, p2, this, contacts, oldcontacts, // To be reused this.frictionEquations, frictionEquationPool ); if(doProfiling){ profile.narrowphase = performance.now() - profilingStart; } // Loop over all collisions if(doProfiling){ profilingStart = performance.now(); } // Add all friction eqs for (var i = 0; i < this.frictionEquations.length; i++) { solver.addEquation(this.frictionEquations[i]); } var ncontacts = contacts.length; for(var k=0; k!==ncontacts; k++){ // Current contact var c = contacts[k]; // Get current collision indeces var bi = c.bi, bj = c.bj, si = c.si, sj = c.sj; // Get collision properties var cm; if(bi.material && bj.material){ cm = this.getContactMaterial(bi.material,bj.material) || this.defaultContactMaterial; } else { cm = this.defaultContactMaterial; } // c.enabled = bi.collisionResponse && bj.collisionResponse && si.collisionResponse && sj.collisionResponse; var mu = cm.friction; // c.restitution = cm.restitution; // If friction or restitution were specified in the material, use them if(bi.material && bj.material){ if(bi.material.friction >= 0 && bj.material.friction >= 0){ mu = bi.material.friction * bj.material.friction; } if(bi.material.restitution >= 0 && bj.material.restitution >= 0){ c.restitution = bi.material.restitution * bj.material.restitution; } } // c.setSpookParams( // cm.contactEquationStiffness, // cm.contactEquationRelaxation, // dt // ); solver.addEquation(c); // // Add friction constraint equation // if(mu > 0){ // // Create 2 tangent equations // var mug = mu * gnorm; // var reducedMass = (bi.invMass + bj.invMass); // if(reducedMass > 0){ // reducedMass = 1/reducedMass; // } // var pool = frictionEquationPool; // var c1 = pool.length ? pool.pop() : new FrictionEquation(bi,bj,mug*reducedMass); // var c2 = pool.length ? pool.pop() : new FrictionEquation(bi,bj,mug*reducedMass); // this.frictionEquations.push(c1, c2); // c1.bi = c2.bi = bi; // c1.bj = c2.bj = bj; // c1.minForce = c2.minForce = -mug*reducedMass; // c1.maxForce = c2.maxForce = mug*reducedMass; // // Copy over the relative vectors // c1.ri.copy(c.ri); // c1.rj.copy(c.rj); // c2.ri.copy(c.ri); // c2.rj.copy(c.rj); // // Construct tangents // c.ni.tangents(c1.t, c2.t); // // Set spook params // c1.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, dt); // c2.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, dt); // c1.enabled = c2.enabled = c.enabled; // // Add equations to solver // solver.addEquation(c1); // solver.addEquation(c2); // } if( bi.allowSleep && bi.type === Body.DYNAMIC && bi.sleepState === Body.SLEEPING && bj.sleepState === Body.AWAKE && bj.type !== Body.STATIC ){ var speedSquaredB = bj.velocity.norm2() + bj.angularVelocity.norm2(); var speedLimitSquaredB = Math.pow(bj.sleepSpeedLimit,2); if(speedSquaredB >= speedLimitSquaredB*2){ bi._wakeUpAfterNarrowphase = true; } } if( bj.allowSleep && bj.type === Body.DYNAMIC && bj.sleepState === Body.SLEEPING && bi.sleepState === Body.AWAKE && bi.type !== Body.STATIC ){ var speedSquaredA = bi.velocity.norm2() + bi.angularVelocity.norm2(); var speedLimitSquaredA = Math.pow(bi.sleepSpeedLimit,2); if(speedSquaredA >= speedLimitSquaredA*2){ bj._wakeUpAfterNarrowphase = true; } } // Now we know that i and j are in contact. Set collision matrix state this.collisionMatrix.set(bi, bj, true); if (!this.collisionMatrixPrevious.get(bi, bj)) { // First contact! // We reuse the collideEvent object, otherwise we will end up creating new objects for each new contact, even if there's no event listener attached. World_step_collideEvent.body = bj; World_step_collideEvent.contact = c; bi.dispatchEvent(World_step_collideEvent); World_step_collideEvent.body = bi; bj.dispatchEvent(World_step_collideEvent); } } if(doProfiling){ profile.makeContactConstraints = performance.now() - profilingStart; profilingStart = performance.now(); } // Wake up bodies for(i=0; i!==N; i++){ var bi = bodies[i]; if(bi._wakeUpAfterNarrowphase){ bi.wakeUp(); bi._wakeUpAfterNarrowphase = false; } } // Add user-added constraints var Nconstraints = constraints.length; for(i=0; i!==Nconstraints; i++){ var c = constraints[i]; c.update(); for(var j=0, Neq=c.equations.length; j!==Neq; j++){ var eq = c.equations[j]; solver.addEquation(eq); } } // Solve the constrained system solver.solve(dt,this); if(doProfiling){ profile.solve = performance.now() - profilingStart; } // Remove all contacts from solver solver.removeAllEquations(); // Apply damping, see http://code.google.com/p/bullet/issues/detail?id=74 for details var pow = Math.pow; for(i=0; i!==N; i++){ var bi = bodies[i]; if(bi.type & DYNAMIC){ // Only for dynamic bodies var ld = pow(1.0 - bi.linearDamping,dt); var v = bi.velocity; v.mult(ld,v); var av = bi.angularVelocity; if(av){ var ad = pow(1.0 - bi.angularDamping,dt); av.mult(ad,av); } } } this.dispatchEvent(World_step_preStepEvent); // Invoke pre-step callbacks for(i=0; i!==N; i++){ var bi = bodies[i]; if(bi.preStep){ bi.preStep.call(bi); } } // Leap frog // vnew = v + h*f/m // xnew = x + h*vnew if(doProfiling){ profilingStart = performance.now(); } var q = World_step_step_q; var w = World_step_step_w; var wq = World_step_step_wq; var stepnumber = this.stepnumber; var DYNAMIC_OR_KINEMATIC = Body.DYNAMIC | Body.KINEMATIC; var quatNormalize = stepnumber % (this.quatNormalizeSkip+1) === 0; var quatNormalizeFast = this.quatNormalizeFast; var half_dt = dt * 0.5; var PLANE = Shape.types.PLANE, CONVEX = Shape.types.CONVEXPOLYHEDRON; for(i=0; i!==N; i++){ var b = bodies[i], force = b.force, tau = b.torque; if((b.type & DYNAMIC_OR_KINEMATIC) && b.sleepState !== Body.SLEEPING){ // Only for dynamic var velo = b.velocity, angularVelo = b.angularVelocity, pos = b.position, quat = b.quaternion, invMass = b.invMass, invInertia = b.invInertiaWorld; velo.x += force.x * invMass * dt; velo.y += force.y * invMass * dt; velo.z += force.z * invMass * dt; if(b.angularVelocity){ invInertia.vmult(tau,invI_tau_dt); invI_tau_dt.mult(dt,invI_tau_dt); invI_tau_dt.vadd(angularVelo,angularVelo); } // Use new velocity - leap frog pos.x += velo.x * dt; pos.y += velo.y * dt; pos.z += velo.z * dt; if(b.angularVelocity){ w.set(angularVelo.x, angularVelo.y, angularVelo.z, 0); w.mult(quat,wq); quat.x += half_dt * wq.x; quat.y += half_dt * wq.y; quat.z += half_dt * wq.z; quat.w += half_dt * wq.w; if(quatNormalize){ if(quatNormalizeFast){ quat.normalizeFast(); } else { quat.normalize(); } } } if(b.aabb){ b.aabbNeedsUpdate = true; } // Update world inertia if(b.updateInertiaWorld){ b.updateInertiaWorld(); } } } this.clearForces(); this.broadphase.dirty = true; if(doProfiling){ profile.integrate = performance.now() - profilingStart; } // Update world time this.time += dt; this.stepnumber += 1; this.dispatchEvent(World_step_postStepEvent); // Invoke post-step callbacks for(i=0; i!==N; i++){ var bi = bodies[i]; var postStep = bi.postStep; if(postStep){ postStep.call(bi); } } // Sleeping update if(this.allowSleep){ for(i=0; i!==N; i++){ bodies[i].sleepTick(this.time); } } }; /** * Sets all body forces in the world to zero. * @method clearForces */ World.prototype.clearForces = function(){ var bodies = this.bodies; var N = bodies.length; for(var i=0; i !== N; i++){ var b = bodies[i], force = b.force, tau = b.torque; b.force.set(0,0,0); b.torque.set(0,0,0); } }; },{"../collision/AABB":3,"../collision/ArrayCollisionMatrix":4,"../collision/NaiveBroadphase":7,"../collision/Ray":9,"../collision/RaycastResult":10,"../equations/ContactEquation":19,"../equations/FrictionEquation":21,"../material/ContactMaterial":24,"../material/Material":25,"../math/Quaternion":28,"../math/Vec3":30,"../objects/Body":31,"../shapes/Shape":43,"../solver/GSSolver":46,"../utils/EventTarget":49,"../utils/TupleDictionary":52,"../utils/Vec3Pool":54,"./Narrowphase":55}]},{},[2]) (2) }); ================================================ FILE: examples/libs/draco/README.md ================================================ # Draco 3D Data Compression Draco is an open-source library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics. [Website](https://google.github.io/draco/) | [GitHub](https://github.com/google/draco) ## Contents This folder contains three utilities: * `draco_decoder.js` — Emscripten-compiled decoder, compatible with any modern browser. * `draco_decoder.wasm` — WebAssembly decoder, compatible with newer browsers and devices. * `draco_wasm_wrapper.js` — JavaScript wrapper for the WASM decoder. Each file is provided in two variations: * **Default:** Latest stable builds, tracking the project's [master branch](https://github.com/google/draco). * **glTF:** Builds targeted by the [glTF mesh compression extension](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression), tracking the [corresponding Draco branch](https://github.com/google/draco/tree/gltf_2.0_draco_extension). Either variation may be used with `DRACOLoader`: ```js const dracoLoader = new DRACOLoader(); dracoLoader.setDecoderPath('path/to/decoders/'); dracoLoader.setDecoderConfig({type: 'js'}); // (Optional) Override detection of WASM support. ``` Further [documentation on GitHub](https://github.com/google/draco/tree/master/javascript/example#static-loading-javascript-decoder). ## License [Apache License 2.0](https://github.com/google/draco/blob/master/LICENSE) ================================================ FILE: examples/libs/draco/draco_decoder.js ================================================ var DracoDecoderModule = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( function(DracoDecoderModule = {}) { var Module=typeof DracoDecoderModule!="undefined"?DracoDecoderModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var isRuntimeInitialized=false;var isModuleParsed=false;Module["onRuntimeInitialized"]=function(){isRuntimeInitialized=true;if(isModuleParsed){if(typeof Module["onModuleLoaded"]==="function"){Module["onModuleLoaded"](Module)}}};Module["onModuleParsed"]=function(){isModuleParsed=true;if(isRuntimeInitialized){if(typeof Module["onModuleLoaded"]==="function"){Module["onModuleLoaded"](Module)}}};function isVersionSupported(versionString){if(typeof versionString!=="string")return false;const version=versionString.split(".");if(version.length<2||version.length>3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=5)return true;if(version[0]!=0||version[1]>10)return false;return true}Module["isVersionSupported"]=isVersionSupported;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( // EMSCRIPTEN_START_ASM function instantiate(na){function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return this[a]};return d}var e;var f=new Uint8Array(123);for(var a=25;a>=0;--a){f[48+a]=52+a;f[65+a]=a;f[97+a]=26+a}f[43]=62;f[47]=63;function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]=="=")-(o[j-1]=="=");for(;a>4;if(i>2;if(i>2];s=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;a:{b:{c:{if(g>>>0>k>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break c}d=e+H[b>>2]|0;H[a>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[a>>2]>31){break c}s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;H[a+4>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;H[a+12>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;d=H[a+20>>2];x=H[a+12>>2];if((x|0)!=(d|0)?d:0){break c}s=H[b+8>>2];y=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>s>>>0&(d|0)>=(y|0)|(d|0)>(y|0)){break c}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[a+16>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(e>>>0>=7){H[B>>2]=e;Qd(1713,B);break c}H[B+664>>2]=c;d:{if(!x){break d}e:{k=H[c>>2];if(x>>>0<=(H[c+8>>2]-k|0)/12>>>0){break e}if(x>>>0<357913942){l=H[c+4>>2];d=N(x,12);e=pa(d);g=d+e|0;e=e+N((l-k|0)/12|0,12)|0;d=e;if((k|0)!=(l|0)){while(1){d=d-12|0;l=l-12|0;H[d>>2]=H[l>>2];H[d+4>>2]=H[l+4>>2];H[d+8>>2]=H[l+8>>2];if((k|0)!=(l|0)){continue}break}}H[c+8>>2]=g;H[c+4>>2]=e;H[c>>2]=d;if(!k){break e}oa(k);break e}break b}f:{switch(H[a+16>>2]){case 0:i=wb(B+8|0,3);z=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;g:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break g}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break g}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break g}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break g}H[i+8>>2]=0;if(!ua(i+16|0,b)){break g}if(!ua(i+36|0,b)){break g}if(!ua(i+56|0,b)){break g}if(!ua(i+76|0,b)){break g}A=H[i+4>>2];d=0;g=0;f=ca-32|0;ca=f;m=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(m){if(m>>>0>=1073741824){break b}b=m<<2;g=pa(b);H[f+8>>2]=g;d=b+g|0;H[f+16>>2]=d;ra(g,0,b);H[f+12>>2]=d}e=H[i+120>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);m=H[i+12>>2];g=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=g;H[e+8>>2]=H[f+16>>2];g=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;h:{if(m){if(m>>>0>=1073741824){break b}b=m<<2;w=pa(b);H[f+8>>2]=w;g=b+w|0;H[f+16>>2]=g;ra(w,0,b);H[f+12>>2]=g}d=H[i+132>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);w=H[f+8>>2];g=H[f+12>>2]}H[d+4>>2]=g;H[d>>2]=w;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=A;m=H[f+28>>2]+1|0;H[f+28>>2]=m;i:{if(!m){break i}y=i+96|0;while(1){n=H[f+12>>2];g=H[f+24>>2];e=m-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[n+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;o=H[b+8>>2];k=H[b+4>>2];t=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(g+m|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}b=0;if(t>>>0>A>>>0){break i}d=H[i+12>>2];m=(k|0)!=(d-1|0)?k+1|0:0;if(m>>>0>=d>>>0){break i}q=N(o,12);p=q+H[i+132>>2]|0;l=q+H[i+120>>2]|0;g=H[i>>2];r=m<<2;e=H[r+H[p>>2]>>2];j:{k:{if((g|0)==(e|0)){if(!t){break k}while(1){d=H[l>>2];x=H[d+8>>2];s=H[d+4>>2];n=H[d>>2];q=H[z>>2];m=H[q+4>>2];d=H[q+8>>2];l:{if(m>>>0>>0){H[m+8>>2]=x;H[m+4>>2]=s;H[m>>2]=n;H[q+4>>2]=m+12;break l}r=H[q>>2];g=(m-r|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(d-r|0)/12|0;d=e<<1;k=e>>>0>=178956970?357913941:d>>>0>k>>>0?d:k;if(k){if(k>>>0>=357913942){break a}d=pa(N(k,12))}else{d=0}w=d+N(g,12)|0;H[w+8>>2]=x;H[w+4>>2]=s;H[w>>2]=n;e=w+12|0;if((m|0)!=(r|0)){while(1){w=w-12|0;m=m-12|0;H[w>>2]=H[m>>2];H[w+4>>2]=H[m+4>>2];H[w+8>>2]=H[m+8>>2];if((m|0)!=(r|0)){continue}break}}H[q+8>>2]=d+N(k,12);H[q+4>>2]=e;H[q>>2]=w;if(!r){break l}oa(r)}H[i+8>>2]=H[i+8>>2]+1;b=b+1|0;if((t|0)!=(b|0)){continue}break}break k}m:{n:{o:{p:{if(t>>>0<=2){d=H[i+108>>2];H[d>>2]=m;w=1;g=H[i+12>>2];if(g>>>0>1){break p}break m}if(K[i+8>>2]>K[i+4>>2]){break i}b=H[i+120>>2];s=o+1|0;x=N(s,12);d=b+x|0;if((d|0)!=(l|0)){Aa(d,H[l>>2],H[l+4>>2]);b=H[i+120>>2]}b=r+H[b+x>>2]|0;H[b>>2]=H[b>>2]+(1<>2];e=32-k|0;q:{if((n|0)<=(e|0)){e=H[i+28>>2];if((e|0)==H[i+20>>2]){break o}d=H[e>>2];b=k+n|0;H[i+32>>2]=b;w=d<>>32-n|0;if((b|0)!=32){break q}H[i+32>>2]=0;H[i+28>>2]=e+4;break q}g=H[i+28>>2];b=g+4|0;if((b|0)==H[i+20>>2]){break o}d=H[g>>2];H[i+28>>2]=b;b=n-e|0;H[i+32>>2]=b;w=H[g+4>>2]>>>32-b|d<>>32-n}d=t>>>1|0;if(w>>>0>d>>>0){break i}break n}while(1){m=(g-1|0)!=(m|0)?m+1|0:0;H[d+(w<<2)>>2]=m;g=H[i+12>>2];w=w+1|0;if(g>>>0>w>>>0){continue}break}break m}d=t>>>1|0;w=0}r:{s:{e=d-w|0;b=t-e|0;t:{if((b|0)==(e|0)){b=e;break t}n=H[i+88>>2];if((n|0)==H[i+80>>2]){break s}k=H[n>>2];g=H[i+92>>2];d=g+1|0;H[i+92>>2]=d;g=k&-2147483648>>>g;u:{if((d|0)==32){H[i+92>>2]=0;H[i+88>>2]=n+4;if(g){break u}break s}if(!g){break s}}}d=b;b=e;break r}d=e}n=H[i+132>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+x|0,g,H[k+4>>2]);if(b){g=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];w=H[f+12>>2];if((g|0)==(((e|0)!=(w|0)?N(e-w>>2,341)-1|0:0)|0)){xa(f+8|0);w=H[f+12>>2];g=H[f+24>>2]+H[f+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+w>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=m;H[e>>2]=b;H[f+28>>2]=H[f+28>>2]+1}if(!d){break k}g=H[f+28>>2]+H[f+24>>2]|0;b=H[f+16>>2];w=H[f+12>>2];if((g|0)==(((b|0)!=(w|0)?N(b-w>>2,341)-1|0:0)|0)){xa(f+8|0);w=H[f+12>>2];g=H[f+24>>2]+H[f+28>>2]|0}b=(g>>>0)/341|0;b=H[(b<<2)+w>>2]+N(g-N(b,341)|0,12)|0;H[b+8>>2]=s;H[b+4>>2]=m;H[b>>2]=d;m=H[f+28>>2]+1|0;H[f+28>>2]=m;break j}if(!t){break k}while(1){if(H[i+12>>2]){o=H[i+40>>2];n=H[p>>2];w=H[i+96>>2];k=H[i+108>>2];m=0;while(1){q=k+(m<<2)|0;H[w+(H[q>>2]<<2)>>2]=0;g=H[i>>2];e=H[q>>2]<<2;d=H[e+n>>2];v:{if((g|0)==(d|0)){break v}r=e+w|0;u=g-d|0;x=H[i+52>>2];g=32-x|0;if((u|0)<=(g|0)){e=H[i+48>>2];if((e|0)==(o|0)){break i}H[r>>2]=H[e>>2]<>>32-u;d=u+H[i+52>>2]|0;H[i+52>>2]=d;if((d|0)!=32){break v}H[i+52>>2]=0;H[i+48>>2]=e+4;break v}s=H[i+48>>2];d=s+4|0;if((d|0)==(o|0)){break i}e=H[s>>2];H[i+48>>2]=d;d=u-g|0;H[i+52>>2]=d;H[r>>2]=H[s+4>>2]>>>32-d|e<>>32-u}e=H[q>>2]<<2;d=e+w|0;H[d>>2]=H[d>>2]|H[e+H[l>>2]>>2];m=m+1|0;if(m>>>0>2]){continue}break}}jb(z,y);H[i+8>>2]=H[i+8>>2]+1;b=b+1|0;if((t|0)!=(b|0)){continue}break}}m=H[f+28>>2]}if(m){continue}break}}H[f+28>>2]=0;w=H[f+16>>2];m=H[f+12>>2];g=w-m|0;if(g>>>0>=9){while(1){oa(H[m>>2]);m=H[f+12>>2]+4|0;H[f+12>>2]=m;w=H[f+16>>2];g=w-m|0;if(g>>>0>8){continue}break}}b=170;w:{switch((g>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break w}}x:{if((m|0)==(w|0)){break x}while(1){oa(H[m>>2]);m=m+4|0;if((w|0)!=(m|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break x}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break h}}xb(i);break d;case 1:i=wb(B+8|0,3);A=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;y:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break y}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break y}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break y}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break y}H[i+8>>2]=0;if(!ua(i+16|0,b)){break y}if(!ua(i+36|0,b)){break y}if(!ua(i+56|0,b)){break y}if(!ua(i+76|0,b)){break y}p=H[i+4>>2];d=0;f=ca-32|0;ca=f;m=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(m){if(m>>>0>=1073741824){break b}b=m<<2;t=pa(b);H[f+8>>2]=t;d=b+t|0;H[f+16>>2]=d;ra(t,0,b);H[f+12>>2]=d}e=H[i+120>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);m=H[i+12>>2];t=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=t;H[e+8>>2]=H[f+16>>2];t=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;z:{if(m){if(m>>>0>=1073741824){break b}b=m<<2;o=pa(b);H[f+8>>2]=o;t=b+o|0;H[f+16>>2]=t;ra(o,0,b);H[f+12>>2]=t}d=H[i+132>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);t=H[f+12>>2];o=H[f+8>>2]}H[d+4>>2]=t;H[d>>2]=o;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=p;m=H[f+28>>2]+1|0;H[f+28>>2]=m;A:{if(!m){break A}s=i+96|0;while(1){k=H[f+12>>2];g=H[f+24>>2];e=m-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[k+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;q=H[b+8>>2];d=H[b+4>>2];l=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(k|0)?N(b-k>>2,341)-1|0:0)-(g+m|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}if(l>>>0>p>>>0){break A}b=H[i+12>>2];m=(d|0)!=(b-1|0)?d+1|0:0;if(m>>>0>=b>>>0){break A}b=H[i+120>>2];r=N(q,12);u=b+r|0;e=H[i>>2];x=m<<2;n=r+H[i+132>>2]|0;d=H[x+H[n>>2]>>2];B:{C:{if((e|0)==(d|0)){x=0;if(!l){break C}while(1){b=H[u>>2];y=H[b+8>>2];n=H[b+4>>2];k=H[b>>2];q=H[A>>2];m=H[q+4>>2];b=H[q+8>>2];D:{if(m>>>0>>0){H[m+8>>2]=y;H[m+4>>2]=n;H[m>>2]=k;H[q+4>>2]=m+12;break D}r=H[q>>2];e=(m-r|0)/12|0;g=e+1|0;if(g>>>0>=357913942){break b}d=(b-r|0)/12|0;b=d<<1;g=d>>>0>=178956970?357913941:b>>>0>g>>>0?b:g;if(g){if(g>>>0>=357913942){break a}b=pa(N(g,12))}else{b=0}o=b+N(e,12)|0;H[o+8>>2]=y;H[o+4>>2]=n;H[o>>2]=k;d=o+12|0;if((m|0)!=(r|0)){while(1){o=o-12|0;m=m-12|0;H[o>>2]=H[m>>2];H[o+4>>2]=H[m+4>>2];H[o+8>>2]=H[m+8>>2];if((m|0)!=(r|0)){continue}break}}H[q+8>>2]=b+N(g,12);H[q+4>>2]=d;H[q>>2]=o;if(!r){break D}oa(r)}H[i+8>>2]=H[i+8>>2]+1;x=x+1|0;if((l|0)!=(x|0)){continue}break}break C}E:{F:{G:{H:{if(l>>>0<=2){b=H[i+108>>2];H[b>>2]=m;o=1;t=H[i+12>>2];if(t>>>0>1){break H}break E}if(K[i+8>>2]>K[i+4>>2]){break A}k=b;b=r+12|0;Aa(k+b|0,H[u>>2],H[u+4>>2]);b=x+H[b+H[i+120>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<>2];e=32-k|0;I:{if((n|0)<=(e|0)){e=H[i+28>>2];if((e|0)==H[i+20>>2]){break G}d=H[e>>2];b=k+n|0;H[i+32>>2]=b;d=d<>>32-n|0;if((b|0)!=32){break I}H[i+32>>2]=0;H[i+28>>2]=e+4;break I}g=H[i+28>>2];b=g+4|0;if((b|0)==H[i+20>>2]){break G}d=H[g>>2];H[i+28>>2]=b;b=n-e|0;H[i+32>>2]=b;d=H[g+4>>2]>>>32-b|d<>>32-n}o=l>>>1|0;if(o>>>0>>0){break A}break F}while(1){m=(t-1|0)!=(m|0)?m+1|0:0;H[b+(o<<2)>>2]=m;o=o+1|0;t=H[i+12>>2];if(o>>>0>>0){continue}break}break E}o=l>>>1|0;d=0}y=q+1|0;J:{K:{e=o-d|0;d=l-e|0;L:{if((d|0)==(e|0)){b=e;break L}n=H[i+88>>2];if((n|0)==H[i+80>>2]){break K}k=H[n>>2];g=H[i+92>>2];b=g+1|0;H[i+92>>2]=b;g=k&-2147483648>>>g;M:{if((b|0)==32){H[i+92>>2]=0;H[i+88>>2]=n+4;if(g){break M}break K}if(!g){break K}}b=d}d=e;break J}b=e}n=H[i+132>>2];k=n+r|0;g=H[k>>2];e=g+x|0;H[e>>2]=H[e>>2]+1;Aa(n+N(y,12)|0,g,H[k+4>>2]);if(d){t=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];o=H[f+12>>2];if((t|0)==(((e|0)!=(o|0)?N(e-o>>2,341)-1|0:0)|0)){xa(f+8|0);t=H[f+24>>2]+H[f+28>>2]|0;o=H[f+12>>2]}e=(t>>>0)/341|0;e=H[o+(e<<2)>>2]+N(t-N(e,341)|0,12)|0;H[e+8>>2]=q;H[e+4>>2]=m;H[e>>2]=d;H[f+28>>2]=H[f+28>>2]+1}if(!b){break C}t=H[f+28>>2]+H[f+24>>2]|0;d=H[f+16>>2];o=H[f+12>>2];if((t|0)==(((d|0)!=(o|0)?N(d-o>>2,341)-1|0:0)|0)){xa(f+8|0);t=H[f+24>>2]+H[f+28>>2]|0;o=H[f+12>>2]}d=(t>>>0)/341|0;d=H[o+(d<<2)>>2]+N(t-N(d,341)|0,12)|0;H[d+8>>2]=y;H[d+4>>2]=m;H[d>>2]=b;m=H[f+28>>2]+1|0;H[f+28>>2]=m;break B}t=0;if(!l){break C}while(1){if(H[i+12>>2]){o=H[i+40>>2];k=H[n>>2];z=H[i+96>>2];g=H[i+108>>2];m=0;while(1){q=g+(m<<2)|0;H[z+(H[q>>2]<<2)>>2]=0;e=H[i>>2];d=H[q>>2]<<2;b=H[d+k>>2];N:{if((e|0)==(b|0)){break N}r=d+z|0;w=e-b|0;x=H[i+52>>2];e=32-x|0;if((w|0)<=(e|0)){d=H[i+48>>2];if((d|0)==(o|0)){break A}H[r>>2]=H[d>>2]<>>32-w;b=w+H[i+52>>2]|0;H[i+52>>2]=b;if((b|0)!=32){break N}H[i+52>>2]=0;H[i+48>>2]=d+4;break N}y=H[i+48>>2];b=y+4|0;if((b|0)==(o|0)){break A}d=H[y>>2];H[i+48>>2]=b;b=w-e|0;H[i+52>>2]=b;H[r>>2]=H[y+4>>2]>>>32-b|d<>>32-w}d=H[q>>2]<<2;b=d+z|0;H[b>>2]=H[b>>2]|H[d+H[u>>2]>>2];m=m+1|0;if(m>>>0>2]){continue}break}}jb(A,s);H[i+8>>2]=H[i+8>>2]+1;t=t+1|0;if((l|0)!=(t|0)){continue}break}}m=H[f+28>>2]}if(m){continue}break}}H[f+28>>2]=0;o=H[f+16>>2];m=H[f+12>>2];t=o-m|0;if(t>>>0>=9){while(1){oa(H[m>>2]);m=H[f+12>>2]+4|0;H[f+12>>2]=m;o=H[f+16>>2];t=o-m|0;if(t>>>0>8){continue}break}}b=170;O:{switch((t>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break O}}P:{if((m|0)==(o|0)){break P}while(1){oa(H[m>>2]);m=m+4|0;if((o|0)!=(m|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break P}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break z}}xb(i);break d;case 2:f=ub(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Q:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Q}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Q}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Q}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Q}H[f+8>>2]=0;if(!ta(f+16|0,b)){break Q}if(!ua(f+32|0,b)){break Q}if(!ua(f+52|0,b)){break Q}if(!ua(f+72|0,b)){break Q}z=H[f+4>>2];g=0;b=0;h=ca-32|0;ca=h;j=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(j){if(j>>>0>=1073741824){break b}d=j<<2;g=pa(d);H[h+8>>2]=g;b=d+g|0;H[h+16>>2]=b;ra(g,0,d);H[h+12>>2]=b}e=H[f+116>>2];d=H[e>>2];if(d){H[e+4>>2]=d;oa(d);j=H[f+12>>2];g=H[h+8>>2];b=H[h+12>>2]}H[e+4>>2]=b;H[e>>2]=g;H[e+8>>2]=H[h+16>>2];g=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;R:{if(j){if(j>>>0>=1073741824){break b}b=j<<2;u=pa(b);H[h+8>>2]=u;g=b+u|0;H[h+16>>2]=g;ra(u,0,b);H[h+12>>2]=g}d=H[f+128>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);u=H[h+8>>2];g=H[h+12>>2]}H[d+4>>2]=g;H[d>>2]=u;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;j=H[h+28>>2]+1|0;H[h+28>>2]=j;S:{if(!j){break S}x=f+92|0;y=f+16|0;while(1){n=H[h+12>>2];g=H[h+24>>2];e=j-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[n+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;p=H[b+8>>2];k=H[b+4>>2];i=H[b>>2];H[h+28>>2]=e;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(g+j|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}d=0;if(i>>>0>z>>>0){break S}b=H[f+12>>2];j=(k|0)!=(b-1|0)?k+1|0:0;if(j>>>0>=b>>>0){break S}o=N(p,12);A=o+H[f+128>>2]|0;t=o+H[f+116>>2]|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];T:{if((g|0)==(e|0)){if(!i){break T}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];o=H[w>>2];j=H[o+4>>2];b=H[o+8>>2];U:{if(j>>>0>>0){H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;H[o+4>>2]=j+12;break U}q=H[o>>2];g=(j-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}u=b+N(g,12)|0;H[u+8>>2]=r;H[u+4>>2]=s;H[u>>2]=n;e=u+12|0;if((j|0)!=(q|0)){while(1){u=u-12|0;j=j-12|0;H[u>>2]=H[j>>2];H[u+4>>2]=H[j+4>>2];H[u+8>>2]=H[j+8>>2];if((j|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(k,12);H[o+4>>2]=e;H[o>>2]=u;if(!q){break U}oa(q)}H[f+8>>2]=H[f+8>>2]+1;d=d+1|0;if((i|0)!=(d|0)){continue}break}break T}V:{W:{X:{Y:{if(i>>>0<=2){b=H[f+104>>2];H[b>>2]=j;u=1;g=H[f+12>>2];if(g>>>0>1){break Y}break V}if(K[f+8>>2]>K[f+4>>2]){break S}b=H[f+116>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+116>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<>2]=0;pc(y,Q(i)^31,h+4|0);d=i>>>1|0;b=H[h+4>>2];if(d>>>0>>0){break S}e=d-b|0;d=i-e|0;Z:{if((d|0)==(e|0)){b=e;break Z}n=H[f+84>>2];if((n|0)==H[f+76>>2]){break X}k=H[n>>2];g=H[f+88>>2];b=g+1|0;H[f+88>>2]=b;g=k&-2147483648>>>g;_:{if((b|0)==32){H[f+88>>2]=0;H[f+84>>2]=n+4;if(g){break _}break X}if(!g){break X}}b=d}d=e;break W}while(1){j=(g-1|0)!=(j|0)?j+1|0:0;H[b+(u<<2)>>2]=j;g=H[f+12>>2];u=u+1|0;if(g>>>0>u>>>0){continue}break}break V}b=e}n=H[f+128>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];u=H[h+12>>2];if((g|0)==(((e|0)!=(u|0)?N(e-u>>2,341)-1|0:0)|0)){xa(h+8|0);u=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+u>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break T}g=H[h+28>>2]+H[h+24>>2]|0;d=H[h+16>>2];u=H[h+12>>2];if((g|0)==(((d|0)!=(u|0)?N(d-u>>2,341)-1|0:0)|0)){xa(h+8|0);u=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}d=(g>>>0)/341|0;d=H[(d<<2)+u>>2]+N(g-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;H[h+28>>2]=H[h+28>>2]+1;break T}if(!i){break T}while(1){if(H[f+12>>2]){p=H[f+36>>2];n=H[A>>2];u=H[f+92>>2];k=H[f+104>>2];j=0;while(1){o=k+(j<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];$:{if((g|0)==(b|0)){break $}q=e+u|0;l=g-b|0;r=H[f+48>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+44>>2];if((e|0)==(p|0)){break S}H[q>>2]=H[e>>2]<>>32-l;b=l+H[f+48>>2]|0;H[f+48>>2]=b;if((b|0)!=32){break $}H[f+48>>2]=0;H[f+44>>2]=e+4;break $}s=H[f+44>>2];b=s+4|0;if((b|0)==(p|0)){break S}e=H[s>>2];H[f+44>>2]=b;b=l-g|0;H[f+48>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];j=j+1|0;if(j>>>0>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;d=d+1|0;if((i|0)!=(d|0)){continue}break}}j=H[h+28>>2];if(j){continue}break}}H[h+28>>2]=0;u=H[h+16>>2];j=H[h+12>>2];g=u-j|0;if(g>>>0>=9){while(1){oa(H[j>>2]);j=H[h+12>>2]+4|0;H[h+12>>2]=j;u=H[h+16>>2];g=u-j|0;if(g>>>0>8){continue}break}}b=170;aa:{switch((g>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break aa}}ba:{if((j|0)==(u|0)){break ba}while(1){oa(H[j>>2]);j=j+4|0;if((u|0)!=(j|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break ba}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break R}}vb(f);break d;case 3:i=ub(B+8|0,3);z=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;ca:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break ca}d=e+H[b>>2]|0;H[i>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[i>>2]>32){break ca}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break ca}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break ca}H[i+8>>2]=0;if(!ta(i+16|0,b)){break ca}if(!ua(i+32|0,b)){break ca}if(!ua(i+52|0,b)){break ca}if(!ua(i+72|0,b)){break ca}A=H[i+4>>2];d=0;f=ca-32|0;ca=f;j=H[i+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;if(j){if(j>>>0>=1073741824){break b}b=j<<2;m=pa(b);H[f+8>>2]=m;d=b+m|0;H[f+16>>2]=d;ra(m,0,b);H[f+12>>2]=d}e=H[i+116>>2];b=H[e>>2];if(b){H[e+4>>2]=b;oa(b);j=H[i+12>>2];m=H[f+8>>2];d=H[f+12>>2]}H[e+4>>2]=d;H[e>>2]=m;H[e+8>>2]=H[f+16>>2];m=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;da:{if(j){if(j>>>0>=1073741824){break b}b=j<<2;p=pa(b);H[f+8>>2]=p;m=b+p|0;H[f+16>>2]=m;ra(p,0,b);H[f+12>>2]=m}d=H[i+128>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);m=H[f+12>>2];p=H[f+8>>2]}H[d+4>>2]=m;H[d>>2]=p;H[d+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);d=H[f+24>>2]+H[f+28>>2]|0;b=(d>>>0)/341|0;b=H[H[f+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=A;j=H[f+28>>2]+1|0;H[f+28>>2]=j;ea:{if(!j){break ea}y=i+92|0;s=i+16|0;while(1){k=H[f+12>>2];g=H[f+24>>2];e=j-1|0;d=g+e|0;b=(d>>>0)/341|0;b=H[k+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;o=H[b+8>>2];d=H[b+4>>2];t=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(k|0)?N(b-k>>2,341)-1|0:0)-(g+j|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}if(t>>>0>A>>>0){break ea}b=H[i+12>>2];j=(d|0)!=(b-1|0)?d+1|0:0;if(j>>>0>=b>>>0){break ea}b=H[i+116>>2];q=N(o,12);l=b+q|0;e=H[i>>2];r=j<<2;n=q+H[i+128>>2]|0;d=H[r+H[n>>2]>>2];fa:{if((e|0)==(d|0)){r=0;if(!t){break fa}while(1){b=H[l>>2];x=H[b+8>>2];n=H[b+4>>2];k=H[b>>2];o=H[z>>2];j=H[o+4>>2];b=H[o+8>>2];ga:{if(j>>>0>>0){H[j+8>>2]=x;H[j+4>>2]=n;H[j>>2]=k;H[o+4>>2]=j+12;break ga}q=H[o>>2];e=(j-q|0)/12|0;g=e+1|0;if(g>>>0>=357913942){break b}d=(b-q|0)/12|0;b=d<<1;g=d>>>0>=178956970?357913941:b>>>0>g>>>0?b:g;if(g){if(g>>>0>=357913942){break a}b=pa(N(g,12))}else{b=0}p=b+N(e,12)|0;H[p+8>>2]=x;H[p+4>>2]=n;H[p>>2]=k;d=p+12|0;if((j|0)!=(q|0)){while(1){p=p-12|0;j=j-12|0;H[p>>2]=H[j>>2];H[p+4>>2]=H[j+4>>2];H[p+8>>2]=H[j+8>>2];if((j|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(g,12);H[o+4>>2]=d;H[o>>2]=p;if(!q){break ga}oa(q)}H[i+8>>2]=H[i+8>>2]+1;r=r+1|0;if((t|0)!=(r|0)){continue}break}break fa}ha:{ia:{ja:{ka:{if(t>>>0<=2){b=H[i+104>>2];H[b>>2]=j;p=1;m=H[i+12>>2];if(m>>>0>1){break ka}break ha}if(K[i+8>>2]>K[i+4>>2]){break ea}k=b;b=q+12|0;Aa(k+b|0,H[l>>2],H[l+4>>2]);b=r+H[b+H[i+116>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<>2]=0;pc(s,Q(t)^31,f+4|0);d=t>>>1|0;b=H[f+4>>2];if(d>>>0>>0){break ea}x=o+1|0;e=d-b|0;d=t-e|0;la:{if((d|0)==(e|0)){b=e;break la}n=H[i+84>>2];if((n|0)==H[i+76>>2]){break ja}k=H[n>>2];g=H[i+88>>2];b=g+1|0;H[i+88>>2]=b;g=k&-2147483648>>>g;ma:{if((b|0)==32){H[i+88>>2]=0;H[i+84>>2]=n+4;if(g){break ma}break ja}if(!g){break ja}}b=d}d=e;break ia}while(1){j=(m-1|0)!=(j|0)?j+1|0:0;H[b+(p<<2)>>2]=j;m=H[i+12>>2];p=p+1|0;if(m>>>0>p>>>0){continue}break}break ha}b=e}n=H[i+128>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+N(x,12)|0,g,H[k+4>>2]);if(d){m=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];p=H[f+12>>2];if((m|0)==(((e|0)!=(p|0)?N(e-p>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;p=H[f+12>>2]}e=(m>>>0)/341|0;e=H[p+(e<<2)>>2]+N(m-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=j;H[e>>2]=d;H[f+28>>2]=H[f+28>>2]+1}if(!b){break fa}m=H[f+28>>2]+H[f+24>>2]|0;d=H[f+16>>2];p=H[f+12>>2];if((m|0)==(((d|0)!=(p|0)?N(d-p>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;p=H[f+12>>2]}d=(m>>>0)/341|0;d=H[p+(d<<2)>>2]+N(m-N(d,341)|0,12)|0;H[d+8>>2]=x;H[d+4>>2]=j;H[d>>2]=b;H[f+28>>2]=H[f+28>>2]+1;break fa}m=0;if(!t){break fa}while(1){if(H[i+12>>2]){p=H[i+36>>2];k=H[n>>2];w=H[i+92>>2];g=H[i+104>>2];j=0;while(1){o=g+(j<<2)|0;H[w+(H[o>>2]<<2)>>2]=0;e=H[i>>2];d=H[o>>2]<<2;b=H[d+k>>2];na:{if((e|0)==(b|0)){break na}q=d+w|0;u=e-b|0;r=H[i+48>>2];e=32-r|0;if((u|0)<=(e|0)){d=H[i+44>>2];if((d|0)==(p|0)){break ea}H[q>>2]=H[d>>2]<>>32-u;b=u+H[i+48>>2]|0;H[i+48>>2]=b;if((b|0)!=32){break na}H[i+48>>2]=0;H[i+44>>2]=d+4;break na}x=H[i+44>>2];b=x+4|0;if((b|0)==(p|0)){break ea}d=H[x>>2];H[i+44>>2]=b;b=u-e|0;H[i+48>>2]=b;H[q>>2]=H[x+4>>2]>>>32-b|d<>>32-u}d=H[o>>2]<<2;b=d+w|0;H[b>>2]=H[b>>2]|H[d+H[l>>2]>>2];j=j+1|0;if(j>>>0>2]){continue}break}}jb(z,y);H[i+8>>2]=H[i+8>>2]+1;m=m+1|0;if((t|0)!=(m|0)){continue}break}}j=H[f+28>>2];if(j){continue}break}}H[f+28>>2]=0;p=H[f+16>>2];j=H[f+12>>2];m=p-j|0;if(m>>>0>=9){while(1){oa(H[j>>2]);j=H[f+12>>2]+4|0;H[f+12>>2]=j;p=H[f+16>>2];m=p-j|0;if(m>>>0>8){continue}break}}b=170;oa:{switch((m>>>2|0)-1|0){case 1:b=341;case 0:H[f+24>>2]=b;break;default:break oa}}pa:{if((j|0)==(p|0)){break pa}while(1){oa(H[j>>2]);j=j+4|0;if((p|0)!=(j|0)){continue}break}d=H[f+16>>2];b=H[f+12>>2];if((d|0)==(b|0)){break pa}H[f+16>>2]=d+((b-d|0)+3&-4)}b=H[f+8>>2];if(b){oa(b)}ca=f+32|0;break da}}vb(i);break d;case 4:f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;qa:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break qa}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break qa}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break qa}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break qa}H[f+8>>2]=0;if(!sb(f+16|0,b)){break qa}if(!ua(f+544|0,b)){break qa}if(!ua(f+564|0,b)){break qa}if(!ua(f+584|0,b)){break qa}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;ra:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;j=pa(b);H[h+8>>2]=j;l=b+j|0;H[h+16>>2]=l;ra(j,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);j=H[h+8>>2];l=H[h+12>>2]}H[d+4>>2]=l;H[d>>2]=j;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;sa:{if(!d){break sa}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;p=H[b+8>>2];e=H[b+4>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break sa}b=H[f+12>>2];j=(e|0)!=(b-1|0)?e+1|0:0;if(j>>>0>=b>>>0){break sa}o=N(p,12);A=o+H[f+640>>2]|0;t=o+H[f+628>>2]|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];ta:{ua:{if((g|0)==(e|0)){o=0;if(!i){break ua}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];p=H[w>>2];d=H[p+4>>2];b=H[p+8>>2];va:{if(d>>>0>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[p+4>>2]=d+12;break va}q=H[p>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}j=b+N(g,12)|0;H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;e=j+12|0;if((d|0)!=(q|0)){while(1){j=j-12|0;d=d-12|0;H[j>>2]=H[d>>2];H[j+4>>2]=H[d+4>>2];H[j+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[p+8>>2]=b+N(k,12);H[p+4>>2]=e;H[p>>2]=j;if(!q){break va}oa(q)}H[f+8>>2]=H[f+8>>2]+1;o=o+1|0;if((i|0)!=(o|0)){continue}break}break ua}wa:{xa:{ya:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=j;d=1;l=H[f+12>>2];if(l>>>0>1){break ya}break wa}if(K[f+8>>2]>K[f+4>>2]){break sa}b=H[f+628>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+628>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<>>1|0;break xa}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break xa}break sa}while(1){j=(l-1|0)!=(j|0)?j+1|0:0;H[b+(d<<2)>>2]=j;d=d+1|0;l=H[f+12>>2];if(d>>>0>>0){continue}break}break wa}za:{Aa:{e=d-l|0;d=i-e|0;Ba:{if((d|0)==(e|0)){b=e;break Ba}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break Aa}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;Ca:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break Ca}break Aa}if(!g){break Aa}}b=d}d=e;break za}b=e}n=H[f+640>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((g|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+l>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break ua}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break ta}j=0;if(!i){break ua}while(1){if(H[f+12>>2]){p=H[f+548>>2];n=H[A>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){o=k+(d<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];Da:{if((g|0)==(b|0)){break Da}q=e+u|0;l=g-b|0;r=H[f+560>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(p|0)){break sa}H[q>>2]=H[e>>2]<>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break Da}H[f+560>>2]=0;H[f+556>>2]=e+4;break Da}s=H[f+556>>2];b=s+4|0;if((b|0)==(p|0)){break sa}e=H[s>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;j=j+1|0;if((i|0)!=(j|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;j=H[h+16>>2];d=H[h+12>>2];l=j-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;j=H[h+16>>2];l=j-d|0;if(l>>>0>8){continue}break}}b=170;Ea:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break Ea}}Fa:{if((d|0)==(j|0)){break Fa}while(1){oa(H[d>>2]);d=d+4|0;if((j|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break Fa}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break ra}}ab(f);break d;case 5:f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Ga:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Ga}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Ga}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Ga}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Ga}H[f+8>>2]=0;if(!sb(f+16|0,b)){break Ga}if(!ua(f+544|0,b)){break Ga}if(!ua(f+564|0,b)){break Ga}if(!ua(f+584|0,b)){break Ga}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;Ha:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;p=pa(b);H[h+8>>2]=p;l=b+p|0;H[h+16>>2]=l;ra(p,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);l=H[h+12>>2];p=H[h+8>>2]}H[d+4>>2]=l;H[d>>2]=p;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;Ia:{if(!d){break Ia}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;o=H[b+8>>2];e=H[b+4>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break Ia}m=0;b=H[f+12>>2];p=(e|0)!=(b-1|0)?e+1|0:0;if(p>>>0>=b>>>0){break Ia}b=H[f+628>>2];q=N(o,12);t=b+q|0;e=H[f>>2];r=p<<2;s=q+H[f+640>>2]|0;d=H[r+H[s>>2]>>2];Ja:{Ka:{if((e|0)==(d|0)){if(!i){break Ka}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];o=H[w>>2];d=H[o+4>>2];b=H[o+8>>2];La:{if(d>>>0>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[o+4>>2]=d+12;break La}q=H[o>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}p=b+N(g,12)|0;H[p+8>>2]=r;H[p+4>>2]=s;H[p>>2]=n;e=p+12|0;if((d|0)!=(q|0)){while(1){p=p-12|0;d=d-12|0;H[p>>2]=H[d>>2];H[p+4>>2]=H[d+4>>2];H[p+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[o+8>>2]=b+N(k,12);H[o+4>>2]=e;H[o>>2]=p;if(!q){break La}oa(q)}H[f+8>>2]=H[f+8>>2]+1;m=m+1|0;if((i|0)!=(m|0)){continue}break}break Ka}Ma:{Na:{Oa:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=p;d=1;l=H[f+12>>2];if(l>>>0>1){break Oa}break Ma}if(K[f+8>>2]>K[f+4>>2]){break Ia}k=b;b=q+12|0;Aa(k+b|0,H[t>>2],H[t+4>>2]);b=r+H[b+H[f+628>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<>>1|0;break Na}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break Na}break Ia}while(1){p=(l-1|0)!=(p|0)?p+1|0:0;H[b+(d<<2)>>2]=p;d=d+1|0;l=H[f+12>>2];if(d>>>0>>0){continue}break}break Ma}s=o+1|0;Pa:{Qa:{e=d-l|0;d=i-e|0;Ra:{if((d|0)==(e|0)){b=e;break Ra}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break Qa}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;Sa:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break Sa}break Qa}if(!g){break Qa}}b=d}d=e;break Pa}b=e}n=H[f+640>>2];k=n+q|0;g=H[k>>2];e=g+r|0;H[e>>2]=H[e>>2]+1;Aa(n+N(s,12)|0,g,H[k+4>>2]);if(d){m=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((m|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);m=H[h+24>>2]+H[h+28>>2]|0;l=H[h+12>>2]}e=(m>>>0)/341|0;e=H[l+(e<<2)>>2]+N(m-N(e,341)|0,12)|0;H[e+8>>2]=o;H[e+4>>2]=p;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break Ka}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=p;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break Ja}if(!i){break Ka}while(1){if(H[f+12>>2]){A=H[f+548>>2];n=H[s>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){p=k+(d<<2)|0;H[u+(H[p>>2]<<2)>>2]=0;g=H[f>>2];e=H[p>>2]<<2;b=H[e+n>>2];Ta:{if((g|0)==(b|0)){break Ta}o=e+u|0;l=g-b|0;q=H[f+560>>2];g=32-q|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(A|0)){break Ia}H[o>>2]=H[e>>2]<>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break Ta}H[f+560>>2]=0;H[f+556>>2]=e+4;break Ta}r=H[f+556>>2];b=r+4|0;if((b|0)==(A|0)){break Ia}e=H[r>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[o>>2]=H[r+4>>2]>>>32-b|e<>>32-l}e=H[p>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;m=m+1|0;if((i|0)!=(m|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;p=H[h+16>>2];d=H[h+12>>2];l=p-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;p=H[h+16>>2];l=p-d|0;if(l>>>0>8){continue}break}}b=170;Ua:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break Ua}}Va:{if((d|0)==(p|0)){break Va}while(1){oa(H[d>>2]);d=d+4|0;if((p|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break Va}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break Ha}}ab(f);break d;case 6:break f;default:break c}}f=$a(B+8|0,3);w=B+664|0;k=H[b+8>>2];n=H[b+12>>2];d=H[b+20>>2];e=H[b+16>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;Wa:{if(g>>>0>k>>>0&(d|0)>=(n|0)|(d|0)>(n|0)){break Wa}d=e+H[b>>2]|0;H[f>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[b+20>>2];k=d;g=H[b+16>>2];e=g+4|0;d=e>>>0<4?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;if(K[f>>2]>32){break Wa}n=H[b+8>>2];s=H[b+12>>2];d=k;g=g+8|0;d=g>>>0<8?d+1|0:d;if(g>>>0>n>>>0&(d|0)>=(s|0)|(d|0)>(s|0)){break Wa}d=e+H[b>>2]|0;e=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[f+4>>2]=e;g=H[b+20>>2];d=H[b+16>>2]+4|0;g=d>>>0<4?g+1|0:g;H[b+16>>2]=d;H[b+20>>2]=g;if(!e){break Wa}H[f+8>>2]=0;if(!sb(f+16|0,b)){break Wa}if(!ua(f+544|0,b)){break Wa}if(!ua(f+564|0,b)){break Wa}if(!ua(f+584|0,b)){break Wa}z=H[f+4>>2];l=0;b=0;h=ca-32|0;ca=h;d=H[f+12>>2];H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;if(d){if(d>>>0>=1073741824){break b}e=d<<2;l=pa(e);H[h+8>>2]=l;b=e+l|0;H[h+16>>2]=b;ra(l,0,e);H[h+12>>2]=b}g=H[f+628>>2];e=H[g>>2];if(e){H[g+4>>2]=e;oa(e);d=H[f+12>>2];l=H[h+8>>2];b=H[h+12>>2]}H[g+4>>2]=b;H[g>>2]=l;H[g+8>>2]=H[h+16>>2];l=0;H[h+16>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;Xa:{if(d){if(d>>>0>=1073741824){break b}b=d<<2;j=pa(b);H[h+8>>2]=j;l=b+j|0;H[h+16>>2]=l;ra(j,0,b);H[h+12>>2]=l}d=H[f+640>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b);j=H[h+8>>2];l=H[h+12>>2]}H[d+4>>2]=l;H[d>>2]=j;H[d+8>>2]=H[h+16>>2];H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h+8>>2]=0;H[h+12>>2]=0;xa(h+8|0);d=H[h+24>>2]+H[h+28>>2]|0;b=(d>>>0)/341|0;b=H[H[h+12>>2]+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;H[b+4>>2]=0;H[b+8>>2]=0;H[b>>2]=z;d=H[h+28>>2]+1|0;H[h+28>>2]=d;Ya:{if(!d){break Ya}x=f+604|0;y=f+16|0;while(1){n=H[h+12>>2];k=H[h+24>>2];g=d-1|0;e=k+g|0;b=(e>>>0)/341|0;b=H[n+(b<<2)>>2]+N(e-N(b,341)|0,12)|0;p=H[b+8>>2];i=H[b>>2];H[h+28>>2]=g;b=H[h+16>>2];if((((b|0)!=(n|0)?N(b-n>>2,341)-1|0:0)-(d+k|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[h+16>>2]=H[h+16>>2]-4}if(i>>>0>z>>>0){break Ya}b=H[f+628>>2];o=N(p,12);A=o+H[f+640>>2]|0;j=Vd(f,i,A);if(j>>>0>=K[f+12>>2]){break Ya}t=b+o|0;g=H[f>>2];q=j<<2;e=H[q+H[A>>2]>>2];Za:{_a:{if((g|0)==(e|0)){o=0;if(!i){break _a}while(1){b=H[t>>2];r=H[b+8>>2];s=H[b+4>>2];n=H[b>>2];p=H[w>>2];d=H[p+4>>2];b=H[p+8>>2];$a:{if(d>>>0>>0){H[d+8>>2]=r;H[d+4>>2]=s;H[d>>2]=n;H[p+4>>2]=d+12;break $a}q=H[p>>2];g=(d-q|0)/12|0;k=g+1|0;if(k>>>0>=357913942){break b}e=(b-q|0)/12|0;b=e<<1;k=e>>>0>=178956970?357913941:b>>>0>k>>>0?b:k;if(k){if(k>>>0>=357913942){break a}b=pa(N(k,12))}else{b=0}j=b+N(g,12)|0;H[j+8>>2]=r;H[j+4>>2]=s;H[j>>2]=n;e=j+12|0;if((d|0)!=(q|0)){while(1){j=j-12|0;d=d-12|0;H[j>>2]=H[d>>2];H[j+4>>2]=H[d+4>>2];H[j+8>>2]=H[d+8>>2];if((d|0)!=(q|0)){continue}break}}H[p+8>>2]=b+N(k,12);H[p+4>>2]=e;H[p>>2]=j;if(!q){break $a}oa(q)}H[f+8>>2]=H[f+8>>2]+1;o=o+1|0;if((i|0)!=(o|0)){continue}break}break _a}ab:{bb:{cb:{if(i>>>0<=2){b=H[f+616>>2];H[b>>2]=j;d=1;l=H[f+12>>2];if(l>>>0>1){break cb}break ab}if(K[f+8>>2]>K[f+4>>2]){break Ya}b=H[f+628>>2];s=p+1|0;r=N(s,12);d=b+r|0;if((d|0)!=(t|0)){Aa(d,H[t>>2],H[t+4>>2]);b=H[f+628>>2]}b=q+H[b+r>>2]|0;H[b>>2]=H[b>>2]+(1<>>1|0;break bb}while(1){l=Ba(y+(d<<4)|0)|l<<1;d=d+1|0;if((b|0)!=(d|0)){continue}break}d=i>>>1|0;if(l>>>0<=d>>>0){break bb}break Ya}while(1){j=(l-1|0)!=(j|0)?j+1|0:0;H[b+(d<<2)>>2]=j;d=d+1|0;l=H[f+12>>2];if(d>>>0>>0){continue}break}break ab}db:{eb:{e=d-l|0;d=i-e|0;fb:{if((d|0)==(e|0)){b=e;break fb}n=H[f+596>>2];if((n|0)==H[f+588>>2]){break eb}k=H[n>>2];g=H[f+600>>2];b=g+1|0;H[f+600>>2]=b;g=k&-2147483648>>>g;gb:{if((b|0)==32){H[f+600>>2]=0;H[f+596>>2]=n+4;if(g){break gb}break eb}if(!g){break eb}}b=d}d=e;break db}b=e}n=H[f+640>>2];k=n+o|0;g=H[k>>2];e=g+q|0;H[e>>2]=H[e>>2]+1;Aa(n+r|0,g,H[k+4>>2]);if(d){g=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];l=H[h+12>>2];if((g|0)==(((e|0)!=(l|0)?N(e-l>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+12>>2];g=H[h+24>>2]+H[h+28>>2]|0}e=(g>>>0)/341|0;e=H[(e<<2)+l>>2]+N(g-N(e,341)|0,12)|0;H[e+8>>2]=p;H[e+4>>2]=j;H[e>>2]=d;H[h+28>>2]=H[h+28>>2]+1}if(!b){break _a}l=H[h+28>>2]+H[h+24>>2]|0;e=H[h+16>>2];d=H[h+12>>2];if((l|0)==(((d|0)!=(e|0)?N(e-d>>2,341)-1|0:0)|0)){xa(h+8|0);l=H[h+24>>2]+H[h+28>>2]|0;e=H[h+12>>2]}else{e=d}d=(l>>>0)/341|0;d=H[e+(d<<2)>>2]+N(l-N(d,341)|0,12)|0;H[d+8>>2]=s;H[d+4>>2]=j;H[d>>2]=b;d=H[h+28>>2]+1|0;H[h+28>>2]=d;break Za}j=0;if(!i){break _a}while(1){if(H[f+12>>2]){p=H[f+548>>2];n=H[A>>2];u=H[f+604>>2];k=H[f+616>>2];d=0;while(1){o=k+(d<<2)|0;H[u+(H[o>>2]<<2)>>2]=0;g=H[f>>2];e=H[o>>2]<<2;b=H[e+n>>2];hb:{if((g|0)==(b|0)){break hb}q=e+u|0;l=g-b|0;r=H[f+560>>2];g=32-r|0;if((l|0)<=(g|0)){e=H[f+556>>2];if((e|0)==(p|0)){break Ya}H[q>>2]=H[e>>2]<>>32-l;b=l+H[f+560>>2]|0;H[f+560>>2]=b;if((b|0)!=32){break hb}H[f+560>>2]=0;H[f+556>>2]=e+4;break hb}s=H[f+556>>2];b=s+4|0;if((b|0)==(p|0)){break Ya}e=H[s>>2];H[f+556>>2]=b;b=l-g|0;H[f+560>>2]=b;H[q>>2]=H[s+4>>2]>>>32-b|e<>>32-l}e=H[o>>2]<<2;b=e+u|0;H[b>>2]=H[b>>2]|H[e+H[t>>2]>>2];d=d+1|0;if(d>>>0>2]){continue}break}}jb(w,x);H[f+8>>2]=H[f+8>>2]+1;j=j+1|0;if((i|0)!=(j|0)){continue}break}}d=H[h+28>>2]}if(d){continue}break}}H[h+28>>2]=0;j=H[h+16>>2];d=H[h+12>>2];l=j-d|0;if(l>>>0>=9){while(1){oa(H[d>>2]);d=H[h+12>>2]+4|0;H[h+12>>2]=d;j=H[h+16>>2];l=j-d|0;if(l>>>0>8){continue}break}}b=170;ib:{switch((l>>>2|0)-1|0){case 1:b=341;case 0:H[h+24>>2]=b;break;default:break ib}}jb:{if((d|0)==(j|0)){break jb}while(1){oa(H[d>>2]);d=d+4|0;if((j|0)!=(d|0)){continue}break}d=H[h+16>>2];b=H[h+12>>2];if((d|0)==(b|0)){break jb}H[h+16>>2]=d+((b-d|0)+3&-4)}b=H[h+8>>2];if(b){oa(b)}ca=h+32|0;break Xa}}ab(f)}n=H[a+12>>2]==((H[c+4>>2]-H[c>>2]|0)/12|0)}ca=B+672|0;return n}sa();v()}wa();v()}function kd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;if(!a){return 1}e=H[c+20>>2];g=H[c+12>>2];i=H[c+16>>2];a:{if((e|0)>=(g|0)&i>>>0>=K[c+8>>2]|(e|0)>(g|0)){break a}g=I[i+H[c>>2]|0];i=i+1|0;e=i?e:e+1|0;H[c+16>>2]=i;H[c+20>>2]=e;b:{switch(g|0){case 0:e=a;f=b;i=d;a=0;d=0;m=ca+-64|0;ca=m;H[m+56>>2]=0;H[m+48>>2]=0;H[m+52>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0;H[m+32>>2]=0;H[m+36>>2]=0;H[m+24>>2]=0;H[m+28>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;H[m+8>>2]=0;H[m+12>>2]=0;c:{if(!Ne(m+8|0,c)){break c}if(!Me(m+8|0,c)|(H[m+20>>2]?0:e)){break c}Db(c,0,0);if(e){s=f<<2;t=H[m+36>>2];w=H[m+48>>2];x=H[m+24>>2];l=H[m+56>>2];j=H[m+52>>2];while(1){d:{if(l>>>0>16383){break d}while(1){if((j|0)<=0){break d}j=j-1|0;H[m+52>>2]=j;l=I[j+w|0]|l<<8;H[m+56>>2]=l;if(l>>>0<16384){continue}break}}a=l&4095;r=H[(a<<2)+x>>2];b=(r<<3)+t|0;l=(N(H[b>>2],l>>>12|0)+a|0)-H[b+4>>2]|0;H[m+56>>2]=l;if((f|0)>0){a=0;if(!I[c+36|0]|r>>>0>32){break c}g=d+f|0;e:{if(!r){ra(i+(d<<2)|0,0,s);break e}y=r&-2;z=r&1;b=H[c+32>>2];h=H[c+28>>2];n=H[c+24>>2];while(1){k=0;a=b;o=0;q=0;if((r|0)!=1){while(1){p=n+(a>>>3|0)|0;f:{if(p>>>0>=h>>>0){p=0;break f}p=I[p|0];b=a+1|0;H[c+32>>2]=b;p=p>>>(a&7)&1;a=b}p=p<>>3|0)|0;if(u>>>0>>0){o=I[u|0];b=a+1|0;H[c+32>>2]=b;o=o>>>(a&7)&1;a=b}u=k|1;k=k+2|0;o=p|o<>>3|0)|0;if(p>>>0>>0){p=I[p|0];b=a+1|0;H[c+32>>2]=b;a=p>>>(a&7)&1}else{a=0}o=a<>2]=o;d=d+1|0;if((g|0)!=(d|0)){continue}break}}d=g}v=f+v|0;if(e>>>0>v>>>0){continue}break}}F[c+36|0]=0;b=H[c+20>>2];e=0;d=H[c+32>>2]+7|0;e=d>>>0<7?1:e;d=(e&7)<<29|d>>>3;a=d+H[c+16>>2]|0;e=(e>>>3|0)+b|0;H[c+16>>2]=a;H[c+20>>2]=a>>>0>>0?e+1|0:e;a=1}b=H[m+36>>2];if(b){H[m+40>>2]=b;oa(b)}b=H[m+24>>2];if(b){H[m+28>>2]=b;oa(b)}b=H[m+8>>2];if(b){H[m+12>>2]=b;oa(b)}ca=m- -64|0;return a;case 1:break b;default:break a}}b=0;e=H[c+20>>2];g=H[c+12>>2];i=H[c+16>>2];g:{if((e|0)>=(g|0)&i>>>0>=K[c+8>>2]|(e|0)>(g|0)){break g}g=I[i+H[c>>2]|0];i=i+1|0;e=i?e:e+1|0;H[c+16>>2]=i;H[c+20>>2]=e;h:{switch(g-1|0){case 8:g=a;r=d;i=ca+-64|0;ca=i;H[i+56>>2]=0;H[i+48>>2]=0;H[i+52>>2]=0;H[i+40>>2]=0;H[i+44>>2]=0;H[i+32>>2]=0;H[i+36>>2]=0;H[i+24>>2]=0;H[i+28>>2]=0;H[i+16>>2]=0;H[i+20>>2]=0;H[i+8>>2]=0;H[i+12>>2]=0;j=i+8|0;a=J[c+38>>1];i:{j:{if(!a){break j}k:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break j}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break k}if(!hb(1,j+12|0,c)){break j}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0>>0)+e|0)|0;if(d>>>0>>6>>>0&(a|0)<=0|(a|0)<0){break j}b=H[j>>2];a=H[j+4>>2]-b>>2;l:{if(a>>>0>>0){ya(j,h-a|0);h=H[j+12>>2];break l}if(a>>>0<=h>>>0){break l}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break i}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];m=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=m>>>0|(e|0)>(n|0)){break i}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;m:{n:{o:{p:{t=p&3;switch(t|0){case 0:break n;case 3:break p;default:break o}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break i}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break m}while(1){if((f|0)==(m|0)&(e|0)==(n|0)){break j}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;q:{if(b>>>0<=32767){ya(a,8192-(b>>>2|0)|0);break q}if((b|0)==32768){break q}H[j+20>>2]=d+32768}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;r:{if(f>>>0>>0){ob(d,h-f|0);b=H[d>>2];break r}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break j}}m=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>8192){break j}s:{if(a>>>0>=d>>>0){break s}l=0;j=e&7;if(j){while(1){H[m+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break s}while(1){e=m+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==8192}d=k}t:{if(!d|(H[i+20>>2]?0:g)){break t}d=0;m=ca-16|0;ca=m;u:{v:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break u}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break v}if(!gb(1,m+8|0,c)){break u}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[m+8>>2];k=H[m+12>>2]}j=b-f|0;b=h-((b>>>0>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>j>>>0|b>>>0>>0){break u}e=e+k|0;b=a+f|0;e=b>>>0>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break u}b=H[c>>2]+f|0;H[i+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];w:{if(e>>>0<=63){H[i+52>>2]=c;a=I[f|0]&63;break w}x:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break u}a=a-2|0;H[i+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break w;case 1:if(a>>>0<3){break u}a=a-3|0;H[i+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break w;default:break x}}a=a-4|0;H[i+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[i+56>>2]=a+32768;d=a>>>0<8355840}ca=m+16|0;if(!d){break t}if(!g){o=1;break t}b=H[i+52>>2];a=H[i+56>>2];c=H[i+36>>2];d=H[i+48>>2];f=H[i+24>>2];while(1){y:{if(a>>>0>32767){break y}while(1){if((b|0)<=0){break y}b=b-1|0;H[i+52>>2]=b;a=I[b+d|0]|a<<8;H[i+56>>2]=a;if(a>>>0<32768){continue}break}}e=a&8191;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>13|0)+e|0)-H[k+4>>2]|0;H[i+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((g|0)!=(q|0)){continue}break}}a=H[i+36>>2];if(a){H[i+40>>2]=a;oa(a)}a=H[i+24>>2];if(a){H[i+28>>2]=a;oa(a)}a=H[i+8>>2];if(a){H[i+12>>2]=a;oa(a)}ca=i- -64|0;b=o;break g;case 9:m=a;r=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;a=J[c+38>>1];z:{A:{if(!a){break A}B:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break A}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break B}if(!hb(1,j+12|0,c)){break A}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0>>0)+e|0)|0;if(d>>>0>>6>>>0&(a|0)<=0|(a|0)<0){break A}b=H[j>>2];a=H[j+4>>2]-b>>2;C:{if(a>>>0>>0){ya(j,h-a|0);h=H[j+12>>2];break C}if(a>>>0<=h>>>0){break C}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break z}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];i=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=i>>>0|(e|0)>(n|0)){break z}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;D:{E:{F:{G:{t=p&3;switch(t|0){case 0:break E;case 3:break G;default:break F}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break z}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break D}while(1){if((f|0)==(i|0)&(e|0)==(n|0)){break A}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;H:{if(b>>>0<=131071){ya(a,32768-(b>>>2|0)|0);break H}if((b|0)==131072){break H}H[j+20>>2]=d+131072}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;I:{if(f>>>0>>0){ob(d,h-f|0);b=H[d>>2];break I}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break A}}i=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>32768){break A}J:{if(a>>>0>=d>>>0){break J}l=0;j=e&7;if(j){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break J}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==32768}d=k}K:{if(!d|(H[g+20>>2]?0:m)){break K}d=0;j=ca-16|0;ca=j;L:{M:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break L}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break M}if(!gb(1,j+8|0,c)){break L}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[j+8>>2];k=H[j+12>>2]}i=b-f|0;b=h-((b>>>0>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>i>>>0|b>>>0>>0){break L}i=e+k|0;b=a+f|0;i=b>>>0>>0?i+1|0:i;H[c+16>>2]=b;H[c+20>>2]=i;if((a|0)<=0){break L}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];N:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break N}O:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break L}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break N;case 1:if(a>>>0<3){break L}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break N;default:break O}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a+131072;d=a>>>0<33423360}ca=j+16|0;if(!d){break K}if(!m){o=1;break K}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){P:{if(a>>>0>131071){break P}while(1){if((b|0)<=0){break P}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<131072){continue}break}}e=a&32767;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>15|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 10:m=a;j=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;n=g+8|0;a=J[c+38>>1];Q:{R:{if(!a){break R}S:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break R}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[n+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break S}if(!hb(1,n+12|0,c)){break R}f=H[c+16>>2];e=H[c+20>>2];h=H[n+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0>>0)+e|0)|0;if(d>>>0>>6>>>0&(a|0)<=0|(a|0)<0){break R}b=H[n>>2];a=H[n+4>>2]-b>>2;T:{if(a>>>0>>0){ya(n,h-a|0);h=H[n+12>>2];break T}if(a>>>0<=h>>>0){break T}H[n+4>>2]=b+(h<<2)}d=1;if(!h){break Q}f=H[c+16>>2];e=H[c+20>>2];t=H[n>>2];r=H[c+8>>2];p=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(p|0)&f>>>0>=r>>>0|(e|0)>(p|0)){break Q}d=H[c>>2];s=I[d+f|0];f=f+1|0;i=f?e:e+1|0;H[c+16>>2]=f;e=i;H[c+20>>2]=e;a=s>>>2|0;l=0;U:{V:{W:{X:{i=s&3;switch(i|0){case 0:break V;case 3:break X;default:break W}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break Q}ra(t+(b<<2)|0,0,(s&252)+4|0);b=a;break U}while(1){if((f|0)==(r|0)&(e|0)==(p|0)){break R}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((i|0)!=(l|0)){continue}break}}H[t+(b<<2)>>2]=a}b=b+1|0;h=H[n+12>>2];if(b>>>0>>0){continue}break}a=n+16|0;r=H[n>>2];d=H[n+16>>2];b=H[n+20>>2]-d|0;Y:{if(b>>>0<=262143){ya(a,65536-(b>>>2|0)|0);break Y}if((b|0)==262144){break Y}H[n+20>>2]=d+262144}d=n+28|0;b=H[d>>2];f=H[n+32>>2]-b>>3;Z:{if(f>>>0>>0){ob(d,h-f|0);b=H[d>>2];break Z}if(f>>>0>h>>>0){H[n+32>>2]=(h<<3)+b}if(!h){break R}}i=H[a>>2];f=0;d=0;while(1){e=r+(f<<2)|0;l=H[e>>2];n=(f<<3)+b|0;a=d;H[n+4>>2]=a;H[n>>2]=l;e=H[e>>2];d=e+a|0;if(d>>>0>65536){break R}_:{if(a>>>0>=d>>>0){break _}l=0;n=e&7;if(n){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((n|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break _}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==65536}d=k}$:{if(!d|(H[g+20>>2]?0:m)){break $}d=0;i=ca-16|0;ca=i;aa:{ba:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break aa}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break ba}if(!gb(1,i+8|0,c)){break aa}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[i+8>>2];k=H[i+12>>2]}r=b-f|0;b=h-((b>>>0>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>r>>>0|b>>>0>>0){break aa}e=e+k|0;b=a+f|0;e=b>>>0>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break aa}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];ca:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break ca}da:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break aa}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break ca;case 1:if(a>>>0<3){break aa}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break ca;default:break da}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a+262144;d=a>>>0<66846720}ca=i+16|0;if(!d){break $}if(!m){o=1;break $}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){ea:{if(a>>>0>262143){break ea}while(1){if((b|0)<=0){break ea}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<262144){continue}break}}e=a&65535;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>16|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[j+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 11:m=a;r=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;a=J[c+38>>1];fa:{ga:{if(!a){break ga}ha:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];e=H[c+20>>2];a=H[c+16>>2];f=a+4|0;e=f>>>0<4?e+1|0:e;if(d>>>0>>0&(b|0)<=(e|0)|(b|0)<(e|0)){break ga}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;i=H[c+20>>2];f=H[c+16>>2]+4|0;i=f>>>0<4?i+1|0:i;H[c+16>>2]=f;e=i;H[c+20>>2]=e;break ha}if(!hb(1,j+12|0,c)){break ga}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0>>0)+e|0)|0;if(d>>>0>>6>>>0&(a|0)<=0|(a|0)<0){break ga}b=H[j>>2];a=H[j+4>>2]-b>>2;ia:{if(a>>>0>>0){ya(j,h-a|0);h=H[j+12>>2];break ia}if(a>>>0<=h>>>0){break ia}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break fa}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];i=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=i>>>0|(e|0)>(n|0)){break fa}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;ja:{ka:{la:{ma:{t=p&3;switch(t|0){case 0:break ka;case 3:break ma;default:break la}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break fa}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break ja}while(1){if((f|0)==(i|0)&(e|0)==(n|0)){break ga}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;na:{if(b>>>0<=1048575){ya(a,262144-(b>>>2|0)|0);break na}if((b|0)==1048576){break na}H[j+20>>2]=d- -1048576}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;oa:{if(f>>>0>>0){ob(d,h-f|0);b=H[d>>2];break oa}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break ga}}i=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>262144){break ga}pa:{if(a>>>0>=d>>>0){break pa}l=0;j=e&7;if(j){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break pa}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==262144}d=k}qa:{if(!d|(H[g+20>>2]?0:m)){break qa}d=0;j=ca-16|0;ca=j;ra:{sa:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;i=H[c+20>>2];k=H[c+16>>2];f=k+8|0;i=f>>>0<8?i+1|0:i;e=i;if(b>>>0>>0&(e|0)>=(a|0)|(a|0)<(e|0)){break ra}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break sa}if(!gb(1,j+8|0,c)){break ra}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[j+8>>2];k=H[j+12>>2]}i=b-f|0;b=h-((b>>>0>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>i>>>0|b>>>0>>0){break ra}e=e+k|0;b=a+f|0;e=b>>>0>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break ra}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];ta:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break ta}ua:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break ra}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break ta;case 1:if(a>>>0<3){break ra}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break ta;default:break ua}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a- -1048576;d=a>>>0<267386880}ca=j+16|0;if(!d){break qa}if(!m){o=1;break qa}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){va:{if(a>>>0>1048575){break va}while(1){if((b|0)<=0){break va}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<1048576){continue}break}}e=a&262143;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>18|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 12:m=a;r=d;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;a=J[c+38>>1];wa:{xa:{if(!a){break xa}ya:{if(a>>>0<=511){d=H[c+8>>2];b=H[c+12>>2];i=H[c+20>>2];a=H[c+16>>2];f=a+4|0;i=f>>>0<4?i+1|0:i;if(d>>>0>>0&(b|0)<=(i|0)|(b|0)<(i|0)){break xa}a=a+H[c>>2]|0;h=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);H[j+12>>2]=h;e=H[c+20>>2];f=H[c+16>>2]+4|0;e=f>>>0<4?e+1|0:e;H[c+16>>2]=f;H[c+20>>2]=e;break ya}if(!hb(1,j+12|0,c)){break xa}f=H[c+16>>2];e=H[c+20>>2];h=H[j+12>>2]}a=H[c+8>>2];d=a-f|0;a=H[c+12>>2]-((a>>>0>>0)+e|0)|0;if(d>>>0>>6>>>0&(a|0)<=0|(a|0)<0){break xa}b=H[j>>2];a=H[j+4>>2]-b>>2;za:{if(a>>>0>>0){ya(j,h-a|0);h=H[j+12>>2];break za}if(a>>>0<=h>>>0){break za}H[j+4>>2]=b+(h<<2)}d=1;if(!h){break wa}f=H[c+16>>2];e=H[c+20>>2];s=H[j>>2];i=H[c+8>>2];n=H[c+12>>2];b=0;while(1){d=0;if((e|0)>=(n|0)&f>>>0>=i>>>0|(e|0)>(n|0)){break wa}d=H[c>>2];p=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=p>>>2|0;l=0;Aa:{Ba:{Ca:{Da:{t=p&3;switch(t|0){case 0:break Ba;case 3:break Da;default:break Ca}}a=a+b|0;d=0;if(a>>>0>=h>>>0){break wa}ra(s+(b<<2)|0,0,(p&252)+4|0);b=a;break Aa}while(1){if((f|0)==(i|0)&(e|0)==(n|0)){break xa}h=I[d+f|0];f=f+1|0;e=f?e:e+1|0;H[c+16>>2]=f;H[c+20>>2]=e;a=h<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}H[s+(b<<2)>>2]=a}b=b+1|0;h=H[j+12>>2];if(b>>>0>>0){continue}break}a=j+16|0;n=H[j>>2];d=H[j+16>>2];b=H[j+20>>2]-d|0;Ea:{if(b>>>0<=2097151){ya(a,524288-(b>>>2|0)|0);break Ea}if((b|0)==2097152){break Ea}H[j+20>>2]=d+2097152}d=j+28|0;b=H[d>>2];f=H[j+32>>2]-b>>3;Fa:{if(f>>>0>>0){ob(d,h-f|0);b=H[d>>2];break Fa}if(f>>>0>h>>>0){H[j+32>>2]=(h<<3)+b}if(!h){break xa}}i=H[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;j=H[e>>2];l=(f<<3)+b|0;a=d;H[l+4>>2]=a;H[l>>2]=j;e=H[e>>2];d=e+a|0;if(d>>>0>524288){break xa}Ga:{if(a>>>0>=d>>>0){break Ga}l=0;j=e&7;if(j){while(1){H[i+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((j|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break Ga}while(1){e=i+(a<<2)|0;H[e>>2]=f;H[e+28>>2]=f;H[e+24>>2]=f;H[e+20>>2]=f;H[e+16>>2]=f;H[e+12>>2]=f;H[e+8>>2]=f;H[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((h|0)!=(f|0)){continue}break}k=(d|0)==524288}d=k}Ha:{if(!d|(H[g+20>>2]?0:m)){break Ha}d=0;i=ca-16|0;ca=i;Ia:{Ja:{if(J[c+38>>1]<=511){b=H[c+8>>2];a=H[c+12>>2];h=a;e=H[c+20>>2];k=H[c+16>>2];f=k+8|0;e=f>>>0<8?e+1|0:e;if(b>>>0>>0&(a|0)<=(e|0)|(a|0)<(e|0)){break Ia}k=k+H[c>>2]|0;a=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[c+16>>2]=f;H[c+20>>2]=e;break Ja}if(!gb(1,i+8|0,c)){break Ia}f=H[c+16>>2];e=H[c+20>>2];b=H[c+8>>2];h=H[c+12>>2];a=H[i+8>>2];k=H[i+12>>2]}j=b-f|0;b=h-((b>>>0>>0)+e|0)|0;if((b|0)==(k|0)&a>>>0>j>>>0|b>>>0>>0){break Ia}e=e+k|0;b=a+f|0;e=b>>>0>>0?e+1|0:e;H[c+16>>2]=b;H[c+20>>2]=e;if((a|0)<=0){break Ia}b=H[c>>2]+f|0;H[g+48>>2]=b;c=a-1|0;f=c+b|0;e=I[f|0];Ka:{if(e>>>0<=63){H[g+52>>2]=c;a=I[f|0]&63;break Ka}La:{switch((e>>>6|0)-1|0){case 0:if(a>>>0<2){break Ia}a=a-2|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8&16128|I[a|0];break Ka;case 1:if(a>>>0<3){break Ia}a=a-3|0;H[g+52>>2]=a;a=a+b|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];break Ka;default:break La}}a=a-4|0;H[g+52>>2]=a;a=a+b|0;a=(I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24))&1073741823}H[g+56>>2]=a+2097152;d=a>>>0<534773760}ca=i+16|0;if(!d){break Ha}if(!m){o=1;break Ha}b=H[g+52>>2];a=H[g+56>>2];c=H[g+36>>2];d=H[g+48>>2];f=H[g+24>>2];while(1){Ma:{if(a>>>0>2097151){break Ma}while(1){if((b|0)<=0){break Ma}b=b-1|0;H[g+52>>2]=b;a=I[b+d|0]|a<<8;H[g+56>>2]=a;if(a>>>0<2097152){continue}break}}e=a&524287;o=H[f+(e<<2)>>2];k=c+(o<<3)|0;a=(N(H[k>>2],a>>>19|0)+e|0)-H[k+4>>2]|0;H[g+56>>2]=a;H[r+(q<<2)>>2]=o;o=1;q=q+1|0;if((m|0)!=(q|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;b=o;break g;case 17:b=Le(a,c,d);break g;case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:b=ca+-64|0;ca=b;H[b+56>>2]=0;H[b+48>>2]=0;H[b+52>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0;H[b+32>>2]=0;H[b+36>>2]=0;H[b+24>>2]=0;H[b+28>>2]=0;H[b+16>>2]=0;H[b+20>>2]=0;H[b+8>>2]=0;H[b+12>>2]=0;Na:{if(!Ne(b+8|0,c)|(H[b+20>>2]?0:a)){break Na}if(!Me(b+8|0,c)){break Na}if(!a){f=1;break Na}e=H[b+52>>2];c=H[b+56>>2];k=H[b+36>>2];i=H[b+48>>2];g=H[b+24>>2];while(1){Oa:{if(c>>>0>16383){break Oa}while(1){if((e|0)<=0){break Oa}e=e-1|0;H[b+52>>2]=e;c=I[e+i|0]|c<<8;H[b+56>>2]=c;if(c>>>0<16384){continue}break}}f=c&4095;m=H[g+(f<<2)>>2];r=k+(m<<3)|0;c=(N(H[r>>2],c>>>12|0)+f|0)-H[r+4>>2]|0;H[b+56>>2]=c;H[(o<<2)+d>>2]=m;f=1;o=o+1|0;if((o|0)!=(a|0)){continue}break}}a=H[b+36>>2];if(a){H[b+40>>2]=a;oa(a)}a=H[b+24>>2];if(a){H[b+28>>2]=a;oa(a)}a=H[b+8>>2];if(a){H[b+12>>2]=a;oa(a)}ca=b- -64|0;b=f;break g;case 13:case 14:case 15:case 16:break h;default:break g}}b=Le(a,c,d)}f=b}return f}function gi(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,L=0,M=0,O=0,P=0,Q=0,R=0;s=ca+-64|0;ca=s;H[a+132>>2]=0;if(H[a+148>>2]){c=H[a+144>>2];if(c){while(1){d=H[c>>2];oa(c);c=d;if(c){continue}break}}c=0;H[a+144>>2]=0;d=H[a+140>>2];a:{if(!d){break a}if(d>>>0>=4){g=d&-4;while(1){e=c<<2;H[e+H[a+136>>2]>>2]=0;H[H[a+136>>2]+(e|4)>>2]=0;H[H[a+136>>2]+(e|8)>>2]=0;H[H[a+136>>2]+(e|12)>>2]=0;c=c+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}b=d&3;if(!b){break a}while(1){H[H[a+136>>2]+(c<<2)>>2]=0;c=c+1|0;u=u+1|0;if((b|0)!=(u|0)){continue}break}}H[a+148>>2]=0}b:{c:{d:{c=H[a+4>>2];u=I[c+36|0];b=u<<8|I[c+37|0];if(b>>>0<=513){i=H[c+32>>2];e:{if(b>>>0<=511){b=H[i+20>>2];e=H[i+16>>2];d=e+4|0;b=d>>>0<4?b+1|0:b;g=b;h=H[i+12>>2];if(K[i+8>>2]>>0&(b|0)>=(h|0)|(b|0)>(h|0)){break d}b=e+H[i>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[i+16>>2]=d;H[i+20>>2]=g;break e}if(!Ea(1,s,i)){break d}c=H[a+4>>2];u=I[c+36|0];b=H[s>>2]}H[a+132>>2]=b}g=H[c+32>>2];f:{g:{h:{if((u&255)>>>0<=1){u=0;d=H[g+20>>2];e=H[g+16>>2];b=e+4|0;d=b>>>0<4?d+1|0:d;i=H[g+12>>2];if(K[g+8>>2]>>0&(i|0)<=(d|0)|(d|0)>(i|0)){break c}e=e+H[g>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[s+60>>2]=e;H[g+16>>2]=b;H[g+20>>2]=d;H[a+156>>2]=e;n=a+156|0;break h}u=0;if(!Ea(1,s+60|0,g)){break c}c=H[a+4>>2];b=I[c+36|0];H[a+156>>2]=H[s+60>>2];n=a+156|0;if(b>>>0>1){break g}}g=H[c+32>>2];h=H[g+8>>2];i=H[g+12>>2];c=H[g+20>>2];d=H[g+16>>2];b=d+4|0;c=b>>>0<4?c+1|0:c;e=b;if(b>>>0>h>>>0&(c|0)>=(i|0)|(c|0)>(i|0)){break c}b=d+H[g>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[s+56>>2]=b;H[g+16>>2]=e;H[g+20>>2]=c;break f}if(!Ea(1,s+56|0,H[c+32>>2])){break c}b=H[s+56>>2]}if(b>>>0>1431655765|K[n>>2]>N(b,3)>>>0){break c}f=H[a+4>>2];g=H[f+32>>2];c=g;e=H[c+8>>2];i=H[c+16>>2];j=H[c+12>>2];d=H[c+20>>2];c=d;if((j|0)<=(c|0)&e>>>0<=i>>>0|(c|0)>(j|0)){break c}n=H[g>>2];o=I[n+i|0];h=i+1|0;c=h?c:c+1|0;H[g+16>>2]=h;H[g+20>>2]=c;i:{if(I[f+36|0]<=1){f=e;c=j;e=i+5|0;d=e>>>0<5?d+1|0:d;if((c|0)<=(d|0)&e>>>0>f>>>0|(c|0)<(d|0)){break c}c=h+n|0;n=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[s+52>>2]=n;H[g+16>>2]=e;H[g+20>>2]=d;break i}if(!Ea(1,s+52|0,g)){break c}n=H[s+52>>2]}if(b>>>0>>0|((n>>>0)/3|0)+n>>>0>>0){break c}c=H[a+4>>2];i=H[c+32>>2];j:{if(I[c+36|0]<=1){c=H[i+20>>2];e=H[i+16>>2];d=e+4|0;c=d>>>0<4?c+1|0:c;g=d;f=K[i+8>>2]>>0;d=H[i+12>>2];if(f&(d|0)<=(c|0)|(c|0)>(d|0)){break c}d=e+H[i>>2]|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[s+48>>2]=d;H[i+16>>2]=g;H[i+20>>2]=c;break j}if(!Ea(1,s+48|0,i)){break c}d=H[s+48>>2]}if(d>>>0>n>>>0){break c}H[a+28>>2]=H[a+24>>2];e=$b(pa(88));c=H[a+8>>2];H[a+8>>2]=e;if(c){cb(c);if(!H[a+8>>2]){break c}}H[a+164>>2]=H[a+160>>2];Jb(a+160|0,b);H[a+176>>2]=H[a+172>>2];Jb(a+172|0,b);H[a- -64>>2]=0;H[a+92>>2]=-1;H[a+84>>2]=-1;H[a+88>>2]=-1;H[a+40>>2]=H[a+36>>2];H[a+52>>2]=H[a+48>>2];H[a+76>>2]=H[a+72>>2];B=a+216|0;ed(B);dd(B,o);if(!Lc(H[a+8>>2],b,H[a+156>>2]+d|0)){break c}c=H[a+156>>2];F[s|0]=1;Oa(a+120|0,c+d|0,s);c=H[a+4>>2];b=J[c+36>>1];b=(b<<8|b>>>8)&65535;k:{if(b>>>0<=513){i=H[c+32>>2];l:{if(b>>>0<=511){b=H[i+20>>2];e=H[i+16>>2];c=e+4|0;b=c>>>0<4?b+1|0:b;g=b;h=H[i+12>>2];if(K[i+8>>2]>>0&(b|0)>=(h|0)|(b|0)>(h|0)){break c}b=e+H[i>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[i+16>>2]=c;H[i+20>>2]=g;break l}if(!Ea(1,s+44|0,i)){break c}b=H[s+44>>2]}if(!b){break c}c=H[H[a+4>>2]+32>>2];e=H[c+8>>2];g=H[c+16>>2];i=e-g|0;c=H[c+12>>2]-(H[c+20>>2]+(e>>>0>>0)|0)|0;if((c|0)<=0&b>>>0>i>>>0|(c|0)<0){break c}c=Ha(s);e=H[H[a+4>>2]+32>>2];g=H[e+16>>2];i=(g+H[e>>2]|0)+b|0;g=H[e+8>>2]-g|0;G[c+38>>1]=J[e+38>>1];H[c>>2]=i;H[c+16>>2]=0;H[c+20>>2]=0;H[c+8>>2]=g-b;H[c+12>>2]=0;C=Ib(a,c);if((C|0)==-1){break c}M=C>>31;break k}C=-1;M=-1;if((Ib(a,H[c+32>>2])|0)==-1){break c}}e=a+232|0;Ee(e,a);H[a+372>>2]=o;H[a+384>>2]=H[a+156>>2]+d;O=Ha(s);g=O;b=0;j=ca-16|0;ca=j;m:{n:{c=H[e+144>>2];c=J[(ea[H[H[c>>2]+32>>2]](c)|0)+36>>1];if(((c<<8|c>>>8)&65535)>>>0<=513){c=H[e+4>>2];H[e+40>>2]=H[e>>2];H[e+44>>2]=c;c=H[e+36>>2];H[e+72>>2]=H[e+32>>2];H[e+76>>2]=c;d=H[e+28>>2];c=e- -64|0;H[c>>2]=H[e+24>>2];H[c+4>>2]=d;c=H[e+20>>2];H[e+56>>2]=H[e+16>>2];H[e+60>>2]=c;c=H[e+12>>2];H[e+48>>2]=H[e+8>>2];H[e+52>>2]=c;if(!Db(e+40|0,1,j+8|0)){break n}c=H[e+44>>2];H[e>>2]=H[e+40>>2];H[e+4>>2]=c;c=H[e+76>>2];H[e+32>>2]=H[e+72>>2];H[e+36>>2]=c;c=H[e+68>>2];H[e+24>>2]=H[e+64>>2];H[e+28>>2]=c;c=H[e+60>>2];h=c;d=H[e+56>>2];H[e+16>>2]=d;H[e+20>>2]=c;i=H[e+52>>2];f=i;c=H[e+48>>2];H[e+8>>2]=c;H[e+12>>2]=f;o=c-d|0;k=H[j+12>>2];c=f-((c>>>0>>0)+h|0)|0;i=H[j+8>>2];if((k|0)==(c|0)&o>>>0>>0|c>>>0>>0){break n}c=h+k|0;f=d;d=d+i|0;c=f>>>0>d>>>0?c+1|0:c;H[e+16>>2]=d;H[e+20>>2]=c}o:{if(J[e+38>>1]<=513){c=H[e+4>>2];H[e+96>>2]=H[e>>2];H[e+100>>2]=c;c=H[e+36>>2];H[e+128>>2]=H[e+32>>2];H[e+132>>2]=c;c=H[e+28>>2];H[e+120>>2]=H[e+24>>2];H[e+124>>2]=c;c=H[e+20>>2];H[e+112>>2]=H[e+16>>2];H[e+116>>2]=c;c=H[e+12>>2];H[e+104>>2]=H[e+8>>2];H[e+108>>2]=c;if(!Db(e+96|0,1,j+8|0)){break n}c=H[e+100>>2];H[e>>2]=H[e+96>>2];H[e+4>>2]=c;c=H[e+132>>2];H[e+32>>2]=H[e+128>>2];H[e+36>>2]=c;c=H[e+124>>2];H[e+24>>2]=H[e+120>>2];H[e+28>>2]=c;d=H[e+116>>2];h=d;c=H[e+112>>2];H[e+16>>2]=c;H[e+20>>2]=d;i=H[e+108>>2];f=i;d=H[e+104>>2];H[e+8>>2]=d;H[e+12>>2]=f;o=d-c|0;k=H[j+12>>2];d=f-((c>>>0>d>>>0)+h|0)|0;i=H[j+8>>2];if((k|0)==(d|0)&o>>>0>>0|d>>>0>>0){break n}d=h+k|0;f=c;c=c+i|0;d=f>>>0>c>>>0?d+1|0:d;H[e+16>>2]=c;H[e+20>>2]=d;break o}if(!ta(e+80|0,e)){break m}}if(!Fe(e)){break m}c=H[e+4>>2];H[g>>2]=H[e>>2];H[g+4>>2]=c;c=H[e+36>>2];H[g+32>>2]=H[e+32>>2];H[g+36>>2]=c;c=H[e+28>>2];H[g+24>>2]=H[e+24>>2];H[g+28>>2]=c;c=H[e+20>>2];H[g+16>>2]=H[e+16>>2];H[g+20>>2]=c;c=H[e+12>>2];H[g+8>>2]=H[e+8>>2];H[g+12>>2]=c;c=H[e+144>>2];c=J[(ea[H[H[c>>2]+32>>2]](c)|0)+36>>1];p:{if(((c<<8|c>>>8)&65535)>>>0<=513){c=H[e+144>>2];q:{if(I[(ea[H[H[c>>2]+32>>2]](c)|0)+36|0]<=1){c=H[g+20>>2];i=H[g+16>>2];d=i+4|0;c=d>>>0<4?c+1|0:c;h=d;f=K[g+8>>2]>>0;d=H[g+12>>2];if(f&(d|0)<=(c|0)|(c|0)>(d|0)){break m}d=i+H[g>>2]|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[g+16>>2]=h;H[g+20>>2]=c;break q}if(!Ea(1,j+8|0,g)){break m}d=H[j+8>>2]}c=H[e+152>>2];if(d>>>0>=c>>>0){break m}d=H[g+20>>2];h=H[g+12>>2];i=H[g+16>>2];if((d|0)>=(h|0)&i>>>0>=K[g+8>>2]|(d|0)>(h|0)){break m}h=I[i+H[g>>2]|0];i=i+1|0;d=i?d:d+1|0;H[g+16>>2]=i;H[g+20>>2]=d;if(h){break m}H[e+176>>2]=2;H[e+180>>2]=7;break p}H[e+176>>2]=2;H[e+180>>2]=7;c=H[e+152>>2]}if((c|0)<0){break m}H[j+8>>2]=0;b=2;h=H[e+156>>2];i=H[e+160>>2]-h>>2;r:{if(i>>>0>>0){Pa(e+156|0,c-i|0,j+8|0);b=H[e+176>>2];d=H[e+180>>2];break r}d=7;if(c>>>0>=i>>>0){break r}H[e+160>>2]=h+(c<<2)}i=e+184|0;b=(d-b|0)+1|0;c=H[e+188>>2];h=H[e+184>>2];d=(c-h|0)/12|0;s:{if(b>>>0>d>>>0){o=0;d=b-d|0;f=H[i+8>>2];c=H[i+4>>2];t:{if(d>>>0<=(f-c|0)/12>>>0){if(d){b=c;c=N(d,12)-12|0;c=(c-((c>>>0)%12|0)|0)+12|0;c=ra(b,0,c)+c|0}H[i+4>>2]=c;break t}u:{v:{w:{h=H[i>>2];k=(c-h|0)/12|0;b=k+d|0;if(b>>>0<357913942){f=(f-h|0)/12|0;l=f<<1;f=f>>>0>=178956970?357913941:b>>>0>>0?l:b;if(f){if(f>>>0>=357913942){break w}o=pa(N(f,12))}b=N(k,12)+o|0;d=N(d,12)-12|0;k=(d-((d>>>0)%12|0)|0)+12|0;d=ra(b,0,k);k=d+k|0;f=N(f,12)+o|0;if((c|0)==(h|0)){break v}while(1){b=b-12|0;c=c-12|0;H[b>>2]=H[c>>2];H[b+4>>2]=H[c+4>>2];H[b+8>>2]=H[c+8>>2];H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;if((c|0)!=(h|0)){continue}break}H[i+8>>2]=f;d=H[i+4>>2];H[i+4>>2]=k;c=H[i>>2];H[i>>2]=b;if((c|0)==(d|0)){break u}while(1){b=d-12|0;h=H[b>>2];if(h){H[d-8>>2]=h;oa(h)}d=b;if((b|0)!=(c|0)){continue}break}break u}break b}wa();v()}H[i+8>>2]=f;H[i+4>>2]=k;H[i>>2]=d}if(c){oa(c)}}d=H[e+188>>2];break s}if(b>>>0>=d>>>0){d=c;break s}d=h+N(b,12)|0;if((d|0)!=(c|0)){while(1){b=c-12|0;h=H[b>>2];if(h){H[c-8>>2]=h;oa(h)}c=b;if((d|0)!=(b|0)){continue}break}}H[e+188>>2]=d}f=e+196|0;b=H[e+184>>2];c=(d-b|0)/12|0;o=H[e+196>>2];h=H[e+200>>2]-o>>2;x:{if(c>>>0>h>>>0){ya(f,c-h|0);b=H[e+184>>2];d=H[e+188>>2];break x}if(c>>>0>=h>>>0){break x}H[e+200>>2]=o+(c<<2)}if((b|0)==(d|0)){b=1;break m}c=0;while(1){if(!Ea(1,j+8|0,g)){break n}b=H[e+148>>2];d=(H[b+4>>2]-H[b>>2]>>2>>>0)/3|0;b=H[j+8>>2];if(d>>>0>>0){break n}if(b){k=N(c,12);h=k+H[i>>2]|0;d=H[h>>2];o=H[h+4>>2]-d>>2;y:{if(o>>>0>>0){ya(h,b-o|0);d=H[k+H[i>>2]>>2];break y}if(b>>>0>=o>>>0){break y}H[h+4>>2]=(b<<2)+d}kd(b,1,g,d);H[H[f>>2]+(c<<2)>>2]=b}b=1;c=c+1|0;if(c>>>0<(H[e+188>>2]-H[e+184>>2]|0)/12>>>0){continue}break}break m}b=0}ca=j+16|0;z:{if(!b){break z}d=0;c=0;g=0;i=0;o=0;l=ca-96|0;ca=l;H[l+72>>2]=0;H[l+64>>2]=0;H[l+68>>2]=0;H[l+48>>2]=0;H[l+52>>2]=0;H[l+40>>2]=0;H[l+44>>2]=0;H[l+56>>2]=1065353216;H[l+32>>2]=0;H[l+24>>2]=0;H[l+28>>2]=0;j=a;L=H[a+124>>2];A:{B:{C:{D:{E:{if((n|0)<=0){break E}r=j+232|0;P=H[j+216>>2]!=H[j+220>>2];D=1;while(1){h=i;i=h+1|0;a=H[r+172>>2];F:{G:{if((a|0)!=-1){b=H[r+196>>2]+(a<<2)|0;f=H[b>>2];a=f-1|0;H[b>>2]=a;b=9;if((f|0)<=0){break F}a=H[H[H[r+184>>2]+N(H[r+172>>2],12)>>2]+(a<<2)>>2];if(a>>>0>4){break F}b=H[(a<<2)+12144>>2];break G}b=7;a=H[r+144>>2];a=J[(ea[H[H[a>>2]+32>>2]](a)|0)+36>>1];if(((a<<8|a>>>8)&65535)>>>0>513|!I[r+76|0]){break G}b=0;m=H[r- -64>>2];k=H[r+72>>2];a=m+(k>>>3|0)|0;p=H[r+68>>2];if(a>>>0>=p>>>0){break G}f=I[a|0];a=k+1|0;H[r+72>>2]=a;f=f>>>(k&7)&1;if(!f){break G}q=a>>>3|0;b=m+q|0;H:{if(b>>>0>=p>>>0){b=a;a=0;break H}t=I[b|0];b=k+2|0;H[r+72>>2]=b;q=b>>>3|0;a=t>>>(a&7)&1}k=m+q|0;if(k>>>0

>>0){k=I[k|0];H[r+72>>2]=b+1;b=k>>>(b&7)<<1&2}else{b=0}b=(a|b)<<1|f}H[r+168>>2]=b}a=b;I:{J:{if(!a){if((c|0)==(g|0)){b=-1;break D}d=-1;m=H[j+8>>2];t=H[m+24>>2];D=c-4|0;f=H[D>>2];a=-1;K:{if((f|0)==-1){break K}k=f+1|0;k=(k>>>0)%3|0?k:f-2|0;a=-1;if((k|0)==-1){break K}a=H[H[m>>2]+(k<<2)>>2]}b=H[t+(a<<2)>>2];if((b|0)!=-1){d=b+1|0;d=(d>>>0)%3|0?d:b-2|0}if((d|0)==(f|0)){b=-1;break D}if((f|0)!=-1){b=-1;if(H[H[m+12>>2]+(f<<2)>>2]!=-1){break D}}k=H[m+12>>2];if((d|0)!=-1){b=-1;if(H[k+(d<<2)>>2]!=-1){break D}}p=N(h,3);b=p+1|0;H[k+(f<<2)>>2]=b;w=b<<2;H[w+k>>2]=f;q=p+2|0;H[k+(d<<2)>>2]=q;y=q<<2;H[y+k>>2]=d;k=-1;h=-1;L:{if((f|0)==-1){break L}M:{if((f>>>0)%3|0){b=f-1|0;break M}b=f+2|0;h=-1;if((b|0)==-1){break L}}h=H[H[m>>2]+(b<<2)>>2]}N:{if((d|0)==-1){break N}b=d+1|0;b=(b>>>0)%3|0?b:d-2|0;if((b|0)==-1){break N}k=H[H[m>>2]+(b<<2)>>2]}b=-1;if((a|0)==(h|0)|(a|0)==(k|0)){break D}b=H[m>>2];H[b+(p<<2)>>2]=a;H[b+w>>2]=k;H[b+y>>2]=h;if((h|0)!=-1){H[t+(h<<2)>>2]=q}b=H[j+120>>2]+(a>>>3&536870908)|0;d=H[b>>2];Q=b,R=Vj(a)&d,H[Q>>2]=R;H[D>>2]=p;k=H[c-4>>2];break J}b=-1;O:{P:{Q:{R:{S:{T:{U:{V:{W:{switch(a-1|0){case 2:case 4:if((c|0)==(g|0)){break D}t=c-4|0;d=H[t>>2];f=H[j+8>>2];m=H[f+12>>2];if((d|0)!=-1&H[m+(d<<2)>>2]!=-1){break D}k=N(h,3);p=(a|0)==5;q=k+(p?2:1)|0;w=q<<2;H[w+m>>2]=d;H[m+(d<<2)>>2]=q;Ka(f+24|0,11424);a=H[j+8>>2];m=H[a+24>>2];if(H[a+28>>2]-m>>2>(L|0)){break D}a=H[a>>2];y=a+w|0;b=H[f+28>>2];f=H[f+24>>2];w=(b-f>>2)-1|0;H[y>>2]=w;if((b|0)!=(f|0)){H[m+(w<<2)>>2]=q}b=p?k:k+2|0;q=a+(k+p<<2)|0;X:{if((d|0)==-1){H[a+(b<<2)>>2]=-1;b=-1;break X}Y:{Z:{_:{if((d>>>0)%3|0){f=d-1|0;break _}f=d+2|0;if((f|0)==-1){break Z}}f=H[a+(f<<2)>>2];H[a+(b<<2)>>2]=f;if((f|0)==-1){break Y}H[m+(f<<2)>>2]=b;break Y}H[a+(b<<2)>>2]=-1}f=d+1|0;d=(f>>>0)%3|0?f:d-2|0;b=-1;if((d|0)==-1){break X}b=H[a+(d<<2)>>2]}H[q>>2]=b;H[t>>2]=k;break V;case 0:if((c|0)==(d|0)){break D}a=c-4|0;m=H[a>>2];H[l+68>>2]=a;p=H[l+44>>2];$:{if(!p){c=a;break $}f=H[l+40>>2];q=Uj(p)>>>0>1;b=h&p+2147483647;aa:{if(!q){break aa}b=h;if(b>>>0

>>0){break aa}b=(h>>>0)%(p>>>0)|0}k=b;b=H[f+(k<<2)>>2];if(!b){c=a;break $}b=H[b>>2];if(!b){c=a;break $}ba:{if(!q){f=p-1|0;while(1){p=H[b+4>>2];ca:{if((p|0)!=(h|0)){if((k|0)==(f&p)){break ca}c=a;break $}if((h|0)==H[b+8>>2]){break ba}}b=H[b>>2];if(b){continue}break}c=a;break $}while(1){f=H[b+4>>2];da:{if((f|0)!=(h|0)){if(f>>>0>=p>>>0){f=(f>>>0)%(p>>>0)|0}if((f|0)==(k|0)){break da}c=a;break $}if((h|0)==H[b+8>>2]){break ba}}b=H[b>>2];if(b){continue}break}c=a;break $}if((a|0)!=(x|0)){H[a>>2]=H[b+12>>2];H[l+68>>2]=c;break $}a=x-d|0;g=a>>2;c=g+1|0;if(c>>>0>=1073741824){break b}f=a>>>1|0;f=a>>>0>=2147483644?1073741823:c>>>0>>0?f:c;if(f){if(f>>>0>=1073741824){break B}a=pa(f<<2)}else{a=0}g=a+(g<<2)|0;H[g>>2]=H[b+12>>2];c=g+4|0;if((d|0)!=(x|0)){while(1){g=g-4|0;x=x-4|0;H[g>>2]=H[x>>2];if((d|0)!=(x|0)){continue}break}}x=a+(f<<2)|0;H[l+72>>2]=x;H[l+68>>2]=c;H[l+64>>2]=g;if(d){oa(d)}}if((c|0)==(g|0)){break P}w=c-4|0;a=H[w>>2];if((a|0)==(m|0)){break P}b=(a|0)==-1;p=H[j+8>>2];if(!b&H[H[p+12>>2]+(a<<2)>>2]!=-1){break P}q=H[p+12>>2];if((m|0)!=-1&H[q+(m<<2)>>2]!=-1){break P}k=N(h,3);t=k+2|0;H[q+(a<<2)>>2]=t;h=t<<2;H[h+q>>2]=a;d=k+1|0;H[q+(m<<2)>>2]=d;y=d<<2;H[y+q>>2]=m;if(b){break T}if((a>>>0)%3|0){f=a-1|0;break S}f=a+2|0;if((f|0)!=-1){break S}d=H[p>>2];f=-1;break R;case 6:break W;default:break D}}k=H[j+8>>2];Ka(k+24|0,11424);f=H[j+8>>2];a=N(h,3);m=H[k+28>>2];p=H[k+24>>2];q=m-p|0;k=q>>2;t=k-1|0;H[H[f>>2]+(a<<2)>>2]=t;Ka(f+24|0,11424);w=a+1|0;H[H[f>>2]+(w<<2)>>2]=(H[f+28>>2]-H[f+24>>2]>>2)-1;f=H[j+8>>2];Ka(f+24|0,11424);y=a+2|0;H[H[f>>2]+(y<<2)>>2]=(H[f+28>>2]-H[f+24>>2]>>2)-1;E=H[j+8>>2];f=H[E+24>>2];if(H[E+28>>2]-f>>2>(L|0)){break D}ea:{fa:{if((m|0)!=(p|0)){H[f+(t<<2)>>2]=a;b=0;if((q|0)==-4){break fa}}H[f+(k<<2)>>2]=w;b=k+1|0;if((b|0)==-1){break ea}}H[f+(b<<2)>>2]=y}if((c|0)!=(x|0)){H[c>>2]=a;c=c+4|0;H[l+68>>2]=c;break U}b=c-d|0;k=b>>2;g=k+1|0;if(g>>>0>=1073741824){break b}f=b>>>1|0;b=b>>>0>=2147483644?1073741823:g>>>0>>0?f:g;if(b){if(b>>>0>=1073741824){break B}f=pa(b<<2)}else{f=0}g=f+(k<<2)|0;H[g>>2]=a;x=f+(b<<2)|0;a=g+4|0;if((c|0)!=(d|0)){while(1){g=g-4|0;c=c-4|0;H[g>>2]=H[c>>2];if((c|0)!=(d|0)){continue}break}}H[l+72>>2]=x;H[l+68>>2]=a;H[l+64>>2]=g;if(d){oa(d)}c=a}d=g}Ce(r,H[c-4>>2]);a=H[j+40>>2];if((a|0)==H[j+36>>2]){break I}b=a-12|0;f=H[b+4>>2];h=(h^-1)+n|0;if(f>>>0>h>>>0){break P}if((f|0)!=(h|0)){break I}k=I[a-4|0];f=H[b>>2];H[j+40>>2]=b;if((f|0)<0){break P}m=c-4|0;a=H[m>>2];H[l+20>>2]=(f^-1)+n;b=l+20|0;H[l+88>>2]=b;Gb(l,l+40|0,b,l+88|0);f=H[l>>2];ga:{if(k&1){b=-1;if((a|0)==-1){break ga}b=a+1|0;b=(b>>>0)%3|0?b:a-2|0;break ga}b=-1;if((a|0)==-1){break ga}b=a-1|0;if((a>>>0)%3|0){break ga}b=a+2|0}H[f+12>>2]=b;b=H[j+40>>2];if((b|0)==H[j+36>>2]){break I}while(1){a=b-12|0;f=H[a+4>>2];if(f>>>0>h>>>0){break P}if((f|0)!=(h|0)){break I}f=I[b-4|0];b=H[a>>2];H[j+40>>2]=a;if((b|0)<0){break P}a=H[m>>2];H[l+20>>2]=(b^-1)+n;b=l+20|0;H[l+88>>2]=b;Gb(l,l+40|0,b,l+88|0);k=H[l>>2];ha:{if(f&1){b=-1;if((a|0)==-1){break ha}b=a+1|0;b=(b>>>0)%3|0?b:a-2|0;break ha}b=-1;if((a|0)==-1){break ha}b=a-1|0;if((a>>>0)%3|0){break ha}b=a+2|0}H[k+12>>2]=b;b=H[j+40>>2];if((b|0)!=H[j+36>>2]){continue}break}break I}f=-1;d=H[p>>2];H[d+(k<<2)>>2]=-1;b=-1;break Q}d=H[p>>2];f=H[d+(f<<2)>>2]}H[(k<<2)+d>>2]=f;E=a+1|0;a=(E>>>0)%3|0?E:a-2|0;b=-1;if((a|0)==-1){break Q}b=H[(a<<2)+d>>2]}H[d+y>>2]=b;ia:{if((m|0)==-1){H[d+h>>2]=-1;t=-1;a=-1;break ia}ja:{ka:{la:{if((m>>>0)%3|0){b=m-1|0;break la}b=m+2|0;if((b|0)==-1){break ka}}a=H[(b<<2)+d>>2];H[d+h>>2]=a;if((a|0)==-1){break ja}H[H[p+24>>2]+(a<<2)>>2]=t;break ja}H[d+h>>2]=-1}t=-1;b=m+1|0;b=(b>>>0)%3|0?b:m-2|0;a=-1;if((b|0)==-1){break ia}t=H[(b<<2)+d>>2];a=b}b=H[j+388>>2];h=f<<2;m=b+h|0;y=b;b=t<<2;H[m>>2]=H[m>>2]+H[y+b>>2];m=b;b=H[p+24>>2];m=m+b|0;if((f|0)!=-1){H[b+h>>2]=H[m>>2]}b=a;while(1){if((b|0)==-1){break O}H[(b<<2)+d>>2]=f;p=b+1|0;b=(p>>>0)%3|0?p:b-2|0;h=-1;ma:{if((b|0)==-1){break ma}b=H[q+(b<<2)>>2];h=-1;if((b|0)==-1){break ma}h=b+1|0;h=(h>>>0)%3|0?h:b-2|0}b=h;if((a|0)!=(b|0)){continue}break}}b=-1;if(!D){break E}break D}H[m>>2]=-1;na:{if(P){break na}if((z|0)!=(A|0)){H[A>>2]=t;A=A+4|0;H[l+28>>2]=A;break na}a=z-o|0;h=a>>2;b=h+1|0;if(b>>>0>=1073741824){break b}d=a>>>1|0;d=a>>>0>=2147483644?1073741823:b>>>0>>0?d:b;if(d){if(d>>>0>=1073741824){break B}a=pa(d<<2)}else{a=0}b=a+(h<<2)|0;H[b>>2]=t;A=b+4|0;if((o|0)!=(z|0)){while(1){b=b-4|0;z=z-4|0;H[b>>2]=H[z>>2];if((o|0)!=(z|0)){continue}break}}z=a+(d<<2)|0;H[l+32>>2]=z;H[l+28>>2]=A;H[l+24>>2]=b;if(o){oa(o)}o=b}H[w>>2]=k}Ce(r,k);d=g}D=(i|0)<(n|0);if((i|0)!=(n|0)){continue}break}i=n}b=-1;d=H[j+8>>2];if(H[d+28>>2]-H[d+24>>2]>>2>(L|0)){break D}if((c|0)!=(g|0)){x=j+72|0;h=j+60|0;p=j+312|0;while(1){c=c-4|0;o=H[c>>2];H[l+68>>2]=c;oa:{pa:{qa:{if(J[j+270>>1]<=513){if(!I[j+364|0]){break pa}a=H[j+360>>2];b=H[j+352>>2]+(a>>>3|0)|0;if(b>>>0>=K[j+356>>2]){break qa}b=I[b|0];H[j+360>>2]=a+1;if(!(b>>>(a&7)&1)){break qa}break pa}if(Ba(p)){break pa}}b=H[j+64>>2];a=H[j+68>>2];if((b|0)==a<<5){if((b+1|0)<0){break b}if(b>>>0<=1073741822){a=a<<6;b=(b&-32)+32|0;a=a>>>0>b>>>0?a:b}else{a=2147483647}pb(h,a);b=H[j+64>>2]}H[j+64>>2]=b+1;a=H[j+60>>2]+(b>>>3&536870908)|0;d=H[a>>2];Q=a,R=Vj(b)&d,H[Q>>2]=R;b=H[j+76>>2];if((b|0)!=H[j+80>>2]){H[b>>2]=o;H[j+76>>2]=b+4;break oa}d=H[x>>2];a=b-d|0;k=a>>2;f=k+1|0;if(f>>>0<1073741824){n=a>>>1|0;n=a>>>0>=2147483644?1073741823:f>>>0>>0?n:f;if(n){if(n>>>0>=1073741824){break B}a=pa(n<<2)}else{a=0}f=a+(k<<2)|0;H[f>>2]=o;o=f+4|0;if((b|0)!=(d|0)){while(1){f=f-4|0;b=b-4|0;H[f>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[j+80>>2]=a+(n<<2);H[j+76>>2]=o;H[j+72>>2]=f;if(!d){break oa}oa(d);break oa}break b}m=H[j+8>>2];r=H[m>>2];if(((H[m+4>>2]-r>>2>>>0)/3|0)<=(i|0)){b=-1;break D}d=-1;q=H[m+24>>2];n=-1;ra:{if((o|0)==-1){break ra}g=o+1|0;g=(g>>>0)%3|0?g:o-2|0;n=-1;if((g|0)==-1){break ra}n=H[r+(g<<2)>>2]}a=H[q+(n<<2)>>2];sa:{if((a|0)==-1){k=1;f=-1;break sa}k=1;f=-1;b=a+1|0;a=(b>>>0)%3|0?b:a-2|0;if((a|0)==-1){break sa}k=0;d=a;b=a+1|0;b=(b>>>0)%3|0?b:a-2|0;if((b|0)!=-1){f=H[r+(b<<2)>>2]}}b=-1;g=-1;a=H[q+(f<<2)>>2];if((a|0)!=-1){g=a+1|0;g=(g>>>0)%3|0?g:a-2|0}if((d|0)==(o|0)|(g|0)==(o|0)|((o|0)!=-1&H[H[m+12>>2]+(o<<2)>>2]!=-1|(d|0)==(g|0))){break D}if(!k&H[H[m+12>>2]+(d<<2)>>2]!=-1){break D}k=-1;a=H[m+12>>2];m=-1;ta:{if((g|0)==-1){break ta}if(H[a+(g<<2)>>2]!=-1){break D}b=g+1|0;b=(b>>>0)%3|0?b:g-2|0;m=-1;if((b|0)==-1){break ta}m=H[r+(b<<2)>>2]}b=N(i,3);H[l>>2]=b;H[a+(b<<2)>>2]=o;H[a+(o<<2)>>2]=b;b=H[l>>2]+1|0;H[a+(b<<2)>>2]=d;H[a+(d<<2)>>2]=b;b=H[l>>2]+2|0;H[a+(b<<2)>>2]=g;H[a+(g<<2)>>2]=b;a=H[l>>2];H[r+(a<<2)>>2]=f;b=a+1|0;d=r+(b<<2)|0;H[d>>2]=m;g=a+2|0;o=r+(g<<2)|0;H[o>>2]=n;a=H[j+120>>2];f=b?f:-1;n=a+(f>>>3&536870908)|0;r=H[n>>2];Q=n,R=Vj(f)&r,H[Q>>2]=R;k=(b|0)!=-1?H[d>>2]:k;b=a+(k>>>3&536870908)|0;d=H[b>>2];Q=b,R=Vj(k)&d,H[Q>>2]=R;b=-1;b=(g|0)!=-1?H[o>>2]:b;a=a+(b>>>3&536870908)|0;d=H[a>>2];Q=a,R=Vj(b)&d,H[Q>>2]=R;F[l+88|0]=1;_c(h,l+88|0);Ka(x,l);i=i+1|0;g=H[l+64>>2]}if((c|0)!=(g|0)){continue}break}d=H[j+8>>2]}b=-1;if(((H[d+4>>2]-H[d>>2]>>2>>>0)/3|0)!=(i|0)){break D}b=H[d+28>>2]-H[d+24>>2]>>2;i=H[l+24>>2];f=H[l+28>>2];if((i|0)==(f|0)){break C}while(1){a=H[i>>2];h=H[d+24>>2];c=b-1|0;g=h+(c<<2)|0;if(H[g>>2]==-1){while(1){c=b-2|0;b=b-1|0;g=h+(c<<2)|0;if(H[g>>2]==-1){continue}break}}if(a>>>0<=c>>>0){H[l>>2]=d;g=H[g>>2];F[l+12|0]=1;H[l+8>>2]=g;H[l+4>>2]=g;if((g|0)!=-1){while(1){d=H[H[j+8>>2]>>2]+(g<<2)|0;if(H[d>>2]!=(c|0)){b=-1;break D}H[d>>2]=a;uc(l);g=H[l+8>>2];if((g|0)!=-1){continue}break}d=H[j+8>>2]}h=H[d+24>>2];g=h+(c<<2)|0;if((a|0)!=-1){H[h+(a<<2)>>2]=H[g>>2]}H[g>>2]=-1;g=1<>2];a=h+(a>>>3&536870908)|0;h=h+(c>>>3&536870908)|0;c=1<>2]&c){g=g|H[a>>2]}else{g=H[a>>2]&(g^-1)}H[a>>2]=g;H[h>>2]=H[h>>2]&(c^-1);b=b-1|0}i=i+4|0;if((f|0)!=(i|0)){continue}break}}i=H[l+24>>2]}if(i){oa(i)}a=H[l+48>>2];if(a){while(1){c=H[a>>2];oa(a);a=c;if(a){continue}break}}a=H[l+40>>2];H[l+40>>2]=0;if(a){oa(a)}a=H[l+64>>2];if(a){H[l+68>>2]=a;oa(a)}ca=l+96|0;break A}wa();v()}if((b|0)==-1){break z}a=O;c=H[a+16>>2];d=c+H[a>>2]|0;c=H[a+8>>2]-c|0;a=H[H[j+4>>2]+32>>2];G[a+38>>1]=J[a+38>>1];H[a>>2]=d;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=c;H[a+12>>2]=0;a=H[j+4>>2];c=J[a+36>>1];g=c<<8|c>>>8;if((g&65535)>>>0<=513){a=H[a+32>>2];c=H[a+16>>2];d=M+H[a+20>>2]|0;c=c+C|0;d=c>>>0>>0?d+1|0:d;H[a+16>>2]=c;H[a+20>>2]=d}ua:{if(H[j+216>>2]==H[j+220>>2]){break ua}c=H[j+8>>2];a=H[c>>2];c=H[c+4>>2];va:{if((g&65535)>>>0>=513){if((a|0)==(c|0)){break ua}c=0;break va}if((a|0)==(c|0)){break ua}c=0;while(1){if(cd(j,c)){c=c+3|0;a=H[j+8>>2];if(c>>>0>2]-H[a>>2]>>2>>>0){continue}break ua}break}break z}while(1){if(bd(j,c)){c=c+3|0;a=H[j+8>>2];if(c>>>0>2]-H[a>>2]>>2>>>0){continue}break ua}break}break z}ad(e);c=H[j+216>>2];if((c|0)!=H[j+220>>2]){n=0;while(1){d=N(n,144);Jc((d+c|0)+4|0,H[j+8>>2]);a=H[B>>2];e=a+d|0;c=H[e+132>>2];e=H[e+136>>2];if((c|0)!=(e|0)){while(1){Hc((d+H[B>>2]|0)+4|0,H[c>>2]);c=c+4|0;if((e|0)!=(c|0)){continue}break}a=H[B>>2]}if(!Ic((a+d|0)+4|0)){break z}n=n+1|0;c=H[j+216>>2];if(n>>>0<(H[j+220>>2]-c|0)/144>>>0){continue}break}}a=H[j+8>>2];Hb(j+184|0,H[a+28>>2]-H[a+24>>2]>>2);u=H[j+216>>2];if((u|0)!=H[j+220>>2]){c=0;while(1){a=N(c,144)+u|0;d=H[a+60>>2]-H[a+56>>2]>>2;f=a+104|0;a=H[j+8>>2];a=H[a+28>>2]-H[a+24>>2]>>2;Hb(f,(a|0)<(d|0)?d:a);c=c+1|0;u=H[j+216>>2];if(c>>>0<(H[j+220>>2]-u|0)/144>>>0){continue}break}}u=$c(j,b)}break c}u=0}ca=s- -64|0;return u|0}sa();v()}function ii(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0;u=ca+-64|0;ca=u;H[a+132>>2]=0;if(H[a+148>>2]){c=H[a+144>>2];if(c){while(1){b=H[c>>2];oa(c);c=b;if(b){continue}break}}c=0;H[a+144>>2]=0;l=H[a+140>>2];a:{if(!l){break a}if(l>>>0>=4){b=l&-4;while(1){e=c<<2;H[e+H[a+136>>2]>>2]=0;H[H[a+136>>2]+(e|4)>>2]=0;H[H[a+136>>2]+(e|8)>>2]=0;H[H[a+136>>2]+(e|12)>>2]=0;c=c+4|0;f=f+4|0;if((b|0)!=(f|0)){continue}break}}b=l&3;if(!b){break a}while(1){H[H[a+136>>2]+(c<<2)>>2]=0;c=c+1|0;w=w+1|0;if((b|0)!=(w|0)){continue}break}}H[a+148>>2]=0}b:{c:{c=H[a+4>>2];w=I[c+36|0];b=w<<8|I[c+37|0];if(b>>>0<=513){g=H[c+32>>2];d:{if(b>>>0<=511){f=H[g+20>>2];l=H[g+16>>2];e=l+4|0;f=e>>>0<4?f+1|0:f;b=f;d=H[g+12>>2];if(K[g+8>>2]>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break c}f=l+H[g>>2]|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[g+16>>2]=e;H[g+20>>2]=b;break d}if(!Ea(1,u,g)){break c}c=H[a+4>>2];w=I[c+36|0];f=H[u>>2]}H[a+132>>2]=f}d=H[c+32>>2];e:{f:{g:{if((w&255)>>>0<=1){w=0;b=H[d+20>>2];e=H[d+16>>2];f=e+4|0;b=f>>>0<4?b+1|0:b;l=H[d+12>>2];if(K[d+8>>2]>>0&(l|0)<=(b|0)|(b|0)>(l|0)){break b}e=e+H[d>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[u+60>>2]=e;H[d+16>>2]=f;H[d+20>>2]=b;H[a+156>>2]=e;t=a+156|0;break g}w=0;if(!Ea(1,u+60|0,d)){break b}c=H[a+4>>2];b=I[c+36|0];H[a+156>>2]=H[u+60>>2];t=a+156|0;if(b>>>0>1){break f}}d=H[c+32>>2];e=H[d+8>>2];l=H[d+12>>2];c=H[d+20>>2];f=H[d+16>>2];b=f+4|0;c=b>>>0<4?c+1|0:c;if(b>>>0>e>>>0&(c|0)>=(l|0)|(c|0)>(l|0)){break b}f=f+H[d>>2]|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[u+56>>2]=f;H[d+16>>2]=b;H[d+20>>2]=c;break e}if(!Ea(1,u+56|0,H[c+32>>2])){break b}f=H[u+56>>2]}if(f>>>0>1431655765|K[t>>2]>N(f,3)>>>0){break b}E=H[a+4>>2];x=H[E+32>>2];c=H[x+8>>2];d=H[x+12>>2];b=H[x+20>>2];h=H[x+16>>2];if((d|0)<=(b|0)&h>>>0>=c>>>0|(b|0)>(d|0)){break b}j=H[x>>2];k=I[j+h|0];e=x;l=h+1|0;g=l?b:b+1|0;H[e+16>>2]=l;H[e+20>>2]=g;h:{if(I[E+36|0]<=1){e=c;c=h+5|0;b=c>>>0<5?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break b}e=j+l|0;t=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[u+52>>2]=t;H[x+16>>2]=c;H[x+20>>2]=b;break h}if(!Ea(1,u+52|0,x)){break b}t=H[u+52>>2]}if(f>>>0>>0|((t>>>0)/3|0)+t>>>0>>0){break b}c=H[a+4>>2];d=H[c+32>>2];i:{if(I[c+36|0]<=1){c=H[d+20>>2];b=H[d+16>>2];e=b+4|0;c=e>>>0<4?c+1|0:c;l=H[d+12>>2];if(K[d+8>>2]>>0&(l|0)<=(c|0)|(c|0)>(l|0)){break b}b=b+H[d>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[u+48>>2]=b;H[d+16>>2]=e;H[d+20>>2]=c;break i}if(!Ea(1,u+48|0,d)){break b}b=H[u+48>>2]}if(b>>>0>t>>>0){break b}H[a+28>>2]=H[a+24>>2];c=$b(pa(88));e=H[a+8>>2];H[a+8>>2]=c;if(e){cb(e);if(!H[a+8>>2]){break b}}H[a+164>>2]=H[a+160>>2];Jb(a+160|0,f);H[a+176>>2]=H[a+172>>2];Jb(a+172|0,f);H[a- -64>>2]=0;H[a+92>>2]=-1;H[a+84>>2]=-1;H[a+88>>2]=-1;H[a+40>>2]=H[a+36>>2];H[a+52>>2]=H[a+48>>2];H[a+76>>2]=H[a+72>>2];M=a+216|0;ed(M);dd(M,k);if(!Lc(H[a+8>>2],f,H[a+156>>2]+b|0)){break b}c=H[a+156>>2];F[u|0]=1;Oa(a+120|0,b+c|0,u);f=H[a+4>>2];c=J[f+36>>1];c=(c<<8|c>>>8)&65535;j:{if(c>>>0<=513){g=H[f+32>>2];k:{if(c>>>0<=511){f=H[g+20>>2];l=H[g+16>>2];e=l+4|0;f=e>>>0<4?f+1|0:f;c=f;d=H[g+12>>2];if(K[g+8>>2]>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break b}f=l+H[g>>2]|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[g+16>>2]=e;H[g+20>>2]=c;break k}if(!Ea(1,u+44|0,g)){break b}f=H[u+44>>2]}if(!f){break b}d=H[H[a+4>>2]+32>>2];l=H[d+8>>2];c=H[d+16>>2];e=l-c|0;c=H[d+12>>2]-(H[d+20>>2]+(c>>>0>l>>>0)|0)|0;if((c|0)<=0&f>>>0>e>>>0|(c|0)<0){break b}g=Ha(u);d=H[H[a+4>>2]+32>>2];l=H[d+16>>2];e=(l+H[d>>2]|0)+f|0;c=H[d+8>>2]-l|0;G[g+38>>1]=J[d+38>>1];H[g>>2]=e;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=c-f;H[g+12>>2]=0;c=Ib(a,g);if((c|0)==-1){break b}E=c;P=c>>31;break j}E=-1;P=-1;if((Ib(a,H[f+32>>2])|0)==-1){break b}}B=a+232|0;Ee(B,a);H[a+372>>2]=k;H[a+384>>2]=H[a+156>>2]+b;x=Ha(u);g=x;d=0;l=ca-16|0;ca=l;l:{if(!Ge(B,g)){break l}b=H[g+20>>2];f=H[g+16>>2];c=f+4|0;b=c>>>0<4?b+1|0:b;e=H[g+12>>2];if(K[g+8>>2]>>0&(e|0)<=(b|0)|(b|0)>(e|0)){break l}f=f+H[g>>2]|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[g+16>>2]=c;H[g+20>>2]=b;if((f|0)<0){break l}b=f;f=H[B+152>>2];if((b|0)>=(f|0)){break l}H[l+12>>2]=0;c=H[B+156>>2];b=H[B+160>>2]-c>>2;m:{if(b>>>0>>0){Pa(B+156|0,f-b|0,l+12|0);break m}if(b>>>0<=f>>>0){break m}H[B+160>>2]=c+(f<<2)}d=ta(B+168|0,g)}ca=l+16|0;n:{if(!d){break n}d=0;c=0;f=0;l=0;i=ca-96|0;ca=i;H[i+72>>2]=0;H[i+64>>2]=0;H[i+68>>2]=0;H[i+48>>2]=0;H[i+52>>2]=0;H[i+40>>2]=0;H[i+44>>2]=0;H[i+56>>2]=1065353216;H[i+32>>2]=0;H[i+24>>2]=0;H[i+28>>2]=0;g=a;O=H[a+124>>2];o:{p:{q:{r:{s:{t:{if((t|0)<=0){break t}z=g+400|0;Q=g+232|0;C=H[g+216>>2]!=H[g+220>>2];y=1;while(1){e=l;l=e+1|0;u:{v:{w:{x:{y:{if(H[g+420>>2]!=-1){if(Ba(z)){break y}}if(!I[g+308|0]){break x}z:{o=H[g+296>>2];r=H[g+304>>2];a=o+(r>>>3|0)|0;k=H[g+300>>2];if(a>>>0>=k>>>0){break z}b=I[a|0];a=r+1|0;H[g+304>>2]=a;h=b>>>(r&7)&1;if(!h){break z}n=a>>>3|0;b=o+n|0;A:{if(b>>>0>=k>>>0){b=a;a=0;break A}j=I[b|0];b=r+2|0;H[g+304>>2]=b;n=b>>>3|0;a=j>>>(a&7)&1}j=n+o|0;if(j>>>0>>0){j=I[j|0];H[g+304>>2]=b+1;b=j>>>(b&7)<<1&2}else{b=0}p=(a|b)<<1|h;H[g+416>>2]=p;break w}H[g+416>>2]=0;break x}p=H[g+420>>2];H[g+416>>2]=p;if(p){break w}}if((c|0)==(f|0)){b=-1;break s}p=-1;n=H[g+8>>2];o=H[n+24>>2];j=c-4|0;m=H[j>>2];d=-1;B:{if((m|0)==-1){break B}b=m+1|0;b=(b>>>0)%3|0?b:m-2|0;d=-1;if((b|0)==-1){break B}d=H[H[n>>2]+(b<<2)>>2]}b=H[o+(d<<2)>>2];if((b|0)!=-1){a=b+1|0;p=(a>>>0)%3|0?a:b-2|0}if((m|0)==(p|0)){b=-1;break s}if((m|0)!=-1){b=-1;if(H[H[n+12>>2]+(m<<2)>>2]!=-1){break s}}k=H[n+12>>2];if((p|0)!=-1){b=-1;if(H[k+(p<<2)>>2]!=-1){break s}}q=N(e,3);a=q+1|0;H[k+(m<<2)>>2]=a;h=a<<2;H[h+k>>2]=m;r=q+2|0;H[k+(p<<2)>>2]=r;e=r<<2;H[e+k>>2]=p;k=-1;a=-1;C:{if((m|0)==-1){break C}D:{if((m>>>0)%3|0){b=m-1|0;break D}b=m+2|0;a=-1;if((b|0)==-1){break C}}a=H[H[n>>2]+(b<<2)>>2]}E:{if((p|0)==-1){break E}b=p+1|0;b=(b>>>0)%3|0?b:p-2|0;if((b|0)==-1){break E}k=H[H[n>>2]+(b<<2)>>2]}b=-1;if((a|0)==(d|0)|(d|0)==(k|0)){break s}b=H[n>>2];H[b+(q<<2)>>2]=d;H[b+h>>2]=k;H[b+e>>2]=a;if((a|0)!=-1){H[o+(a<<2)>>2]=r}b=H[g+120>>2]+(d>>>3&536870908)|0;a=H[b>>2];R=b,S=Vj(d)&a,H[R>>2]=S;H[j>>2]=q;p=H[c-4>>2];break v}b=-1;F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{switch(p-1|0){case 2:case 4:if((c|0)==(f|0)){break s}h=c-4|0;m=H[h>>2];r=H[g+8>>2];d=H[r+12>>2];if((m|0)!=-1&H[d+(m<<2)>>2]!=-1){break s}q=N(e,3);k=(p|0)==5;j=q+(k?2:1)|0;a=j<<2;H[a+d>>2]=m;H[d+(m<<2)>>2]=j;Ka(r+24|0,11424);d=H[g+8>>2];o=H[d+24>>2];if(H[d+28>>2]-o>>2>(O|0)){break s}n=H[d>>2];p=n+a|0;d=H[r+28>>2];b=H[r+24>>2];a=(d-b>>2)-1|0;H[p>>2]=a;if((b|0)!=(d|0)){H[o+(a<<2)>>2]=j}d=k?q:q+2|0;j=n+(k+q<<2)|0;Q:{if((m|0)==-1){H[n+(d<<2)>>2]=-1;b=-1;break Q}R:{S:{T:{if((m>>>0)%3|0){a=m-1|0;break T}a=m+2|0;if((a|0)==-1){break S}}a=H[n+(a<<2)>>2];H[n+(d<<2)>>2]=a;if((a|0)==-1){break R}H[o+(a<<2)>>2]=d;break R}H[n+(d<<2)>>2]=-1}a=m+1|0;a=(a>>>0)%3|0?a:m-2|0;b=-1;if((a|0)==-1){break Q}b=H[n+(a<<2)>>2]}H[j>>2]=b;H[h>>2]=q;break O;case 0:if((c|0)==(d|0)){break s}a=c-4|0;m=H[a>>2];H[i+68>>2]=a;k=H[i+44>>2];U:{if(!k){c=a;break U}o=H[i+40>>2];h=Uj(k)>>>0>1;b=e&k+2147483647;V:{if(!h){break V}b=e;if(b>>>0>>0){break V}b=(e>>>0)%(k>>>0)|0}j=b;b=H[o+(j<<2)>>2];if(!b){c=a;break U}b=H[b>>2];if(!b){c=a;break U}W:{if(!h){k=k-1|0;while(1){h=H[b+4>>2];X:{if((h|0)!=(e|0)){if((j|0)==(h&k)){break X}c=a;break U}if((e|0)==H[b+8>>2]){break W}}b=H[b>>2];if(b){continue}break}c=a;break U}while(1){h=H[b+4>>2];Y:{if((h|0)!=(e|0)){if(h>>>0>=k>>>0){h=(h>>>0)%(k>>>0)|0}if((h|0)==(j|0)){break Y}c=a;break U}if((e|0)==H[b+8>>2]){break W}}b=H[b>>2];if(b){continue}break}c=a;break U}if((a|0)!=(A|0)){H[a>>2]=H[b+12>>2];H[i+68>>2]=c;break U}h=A-d|0;c=h>>2;f=c+1|0;if(f>>>0>=1073741824){break M}a=h>>>1|0;h=h>>>0>=2147483644?1073741823:a>>>0>f>>>0?a:f;if(h){if(h>>>0>=1073741824){break p}a=pa(h<<2)}else{a=0}f=a+(c<<2)|0;H[f>>2]=H[b+12>>2];c=f+4|0;if((d|0)!=(A|0)){while(1){f=f-4|0;A=A-4|0;H[f>>2]=H[A>>2];if((d|0)!=(A|0)){continue}break}}A=a+(h<<2)|0;H[i+72>>2]=A;H[i+68>>2]=c;H[i+64>>2]=f;if(d){oa(d)}}if((c|0)==(f|0)){break G}j=c-4|0;n=H[j>>2];if((n|0)==(m|0)){break G}d=(n|0)==-1;q=H[g+8>>2];if(!d&H[H[q+12>>2]+(n<<2)>>2]!=-1){break G}r=H[q+12>>2];if((m|0)!=-1&H[r+(m<<2)>>2]!=-1){break G}p=N(e,3);e=p+2|0;H[r+(n<<2)>>2]=e;o=e<<2;H[o+r>>2]=n;a=p+1|0;H[r+(m<<2)>>2]=a;b=a<<2;H[b+r>>2]=m;if(d){break L}if((n>>>0)%3|0){k=n-1|0;break J}k=n+2|0;if((k|0)!=-1){break J}d=H[q>>2];a=-1;break I;case 6:break P;default:break s}}a=H[g+8>>2];Ka(a+24|0,11424);h=H[g+8>>2];p=N(e,3);q=H[a+28>>2];r=H[a+24>>2];o=q-r|0;n=o>>2;k=n-1|0;H[H[h>>2]+(p<<2)>>2]=k;Ka(h+24|0,11424);j=p+1|0;H[H[h>>2]+(j<<2)>>2]=(H[h+28>>2]-H[h+24>>2]>>2)-1;a=H[g+8>>2];Ka(a+24|0,11424);h=p+2|0;H[H[a>>2]+(h<<2)>>2]=(H[a+28>>2]-H[a+24>>2]>>2)-1;a=H[g+8>>2];m=H[a+24>>2];if(H[a+28>>2]-m>>2>(O|0)){break s}Z:{_:{if((q|0)!=(r|0)){H[m+(k<<2)>>2]=p;b=0;if((o|0)==-4){break _}}H[m+(n<<2)>>2]=j;b=n+1|0;if((b|0)==-1){break Z}}H[m+(b<<2)>>2]=h}if((c|0)!=(A|0)){H[c>>2]=p;c=c+4|0;H[i+68>>2]=c;break N}h=c-d|0;b=h>>2;f=b+1|0;if(f>>>0>=1073741824){break K}a=h>>>1|0;h=h>>>0>=2147483644?1073741823:a>>>0>f>>>0?a:f;if(h){if(h>>>0>=1073741824){break p}a=pa(h<<2)}else{a=0}f=a+(b<<2)|0;H[f>>2]=p;A=a+(h<<2)|0;a=f+4|0;if((c|0)!=(d|0)){while(1){f=f-4|0;c=c-4|0;H[f>>2]=H[c>>2];if((c|0)!=(d|0)){continue}break}}H[i+72>>2]=A;H[i+68>>2]=a;H[i+64>>2]=f;if(d){oa(d)}c=a}d=f}De(Q,H[c-4>>2]);h=H[g+40>>2];if((h|0)==H[g+36>>2]){break u}b=h-12|0;a=H[b+4>>2];k=(e^-1)+t|0;if(a>>>0>k>>>0){break G}if((a|0)!=(k|0)){break u}e=I[h-4|0];a=H[b>>2];H[g+40>>2]=b;if((a|0)<0){break G}h=c-4|0;j=H[h>>2];H[i+20>>2]=(a^-1)+t;a=i+20|0;H[i+88>>2]=a;Gb(i,i+40|0,a,i+88|0);b=H[i>>2];$:{if(e&1){a=-1;if((j|0)==-1){break $}a=j+1|0;a=(a>>>0)%3|0?a:j-2|0;break $}a=-1;if((j|0)==-1){break $}a=j-1|0;if((j>>>0)%3|0){break $}a=j+2|0}H[b+12>>2]=a;b=H[g+40>>2];if((b|0)==H[g+36>>2]){break u}while(1){j=b-12|0;a=H[j+4>>2];if(a>>>0>k>>>0){break G}if((a|0)!=(k|0)){break u}e=I[b-4|0];a=H[j>>2];H[g+40>>2]=j;if((a|0)<0){break G}j=H[h>>2];H[i+20>>2]=(a^-1)+t;a=i+20|0;H[i+88>>2]=a;Gb(i,i+40|0,a,i+88|0);b=H[i>>2];aa:{if(e&1){a=-1;if((j|0)==-1){break aa}a=j+1|0;a=(a>>>0)%3|0?a:j-2|0;break aa}a=-1;if((j|0)==-1){break aa}a=j-1|0;if((j>>>0)%3|0){break aa}a=j+2|0}H[b+12>>2]=a;b=H[g+40>>2];if((b|0)!=H[g+36>>2]){continue}break}break u}sa();v()}k=-1;d=H[q>>2];H[d+(p<<2)>>2]=-1;h=-1;break H}sa();v()}d=H[q>>2];a=H[d+(k<<2)>>2]}k=a;H[(p<<2)+d>>2]=a;a=n+1|0;a=(a>>>0)%3|0?a:n-2|0;h=-1;if((a|0)==-1){break H}h=H[(a<<2)+d>>2]}H[b+d>>2]=h;ba:{if((m|0)==-1){H[d+o>>2]=-1;n=-1;a=-1;break ba}ca:{da:{ea:{if((m>>>0)%3|0){b=m-1|0;break ea}b=m+2|0;if((b|0)==-1){break da}}a=H[(b<<2)+d>>2];H[d+o>>2]=a;if((a|0)==-1){break ca}H[H[q+24>>2]+(a<<2)>>2]=e;break ca}H[d+o>>2]=-1}n=-1;b=m+1|0;b=(b>>>0)%3|0?b:m-2|0;a=-1;if((b|0)==-1){break ba}n=H[(b<<2)+d>>2];a=b}h=H[g+388>>2];e=k<<2;b=h+e|0;o=b;m=H[b>>2];b=n<<2;H[o>>2]=m+H[b+h>>2];h=b;b=H[q+24>>2];o=h+b|0;if((k|0)!=-1){H[b+e>>2]=H[o>>2]}b=a;while(1){if((b|0)==-1){break F}H[(b<<2)+d>>2]=k;h=b+1|0;b=(h>>>0)%3|0?h:b-2|0;e=-1;fa:{if((b|0)==-1){break fa}h=H[r+(b<<2)>>2];e=-1;if((h|0)==-1){break fa}b=h+1|0;e=(b>>>0)%3|0?b:h-2|0}b=e;if((a|0)!=(b|0)){continue}break}}b=-1;if(!(y&1)){break t}break s}H[o>>2]=-1;ga:{if(C){break ga}if((D|0)!=(L|0)){H[L>>2]=n;L=L+4|0;H[i+28>>2]=L;break ga}d=D-s|0;b=d>>2;e=b+1|0;if(e>>>0>=1073741824){break q}a=d>>>1|0;e=d>>>0>=2147483644?1073741823:a>>>0>e>>>0?a:e;if(e){if(e>>>0>=1073741824){break p}a=pa(e<<2)}else{a=0}b=a+(b<<2)|0;H[b>>2]=n;L=b+4|0;if((s|0)!=(D|0)){while(1){b=b-4|0;D=D-4|0;H[b>>2]=H[D>>2];if((s|0)!=(D|0)){continue}break}}D=a+(e<<2)|0;H[i+32>>2]=D;H[i+28>>2]=L;H[i+24>>2]=b;if(s){oa(s)}s=b}H[j>>2]=p}De(Q,p);d=f}y=(l|0)<(t|0);if((l|0)!=(t|0)){continue}break}l=t}b=-1;y=H[g+8>>2];if(H[y+28>>2]-H[y+24>>2]>>2>(O|0)){break s}if((c|0)!=(f|0)){r=g+72|0;j=g+60|0;t=g+312|0;while(1){c=c-4|0;z=H[c>>2];H[i+68>>2]=c;ha:{ia:{ja:{if(J[g+270>>1]<=513){if(!I[g+364|0]){break ia}b=H[g+360>>2];a=H[g+352>>2]+(b>>>3|0)|0;if(a>>>0>=K[g+356>>2]){break ja}a=I[a|0];H[g+360>>2]=b+1;if(!(a>>>(b&7)&1)){break ja}break ia}if(Ba(t)){break ia}}ka:{la:{b=H[g+64>>2];e=H[g+68>>2];if((b|0)==e<<5){if((b+1|0)<0){break la}if(b>>>0<=1073741822){e=e<<6;b=(b&-32)+32|0;a=b>>>0>>0?e:b}else{a=2147483647}pb(j,a);b=H[g+64>>2]}H[g+64>>2]=b+1;e=H[g+60>>2]+(b>>>3&536870908)|0;a=H[e>>2];R=e,S=Vj(b)&a,H[R>>2]=S;b=H[g+76>>2];if((b|0)!=H[g+80>>2]){H[b>>2]=z;H[g+76>>2]=b+4;break ha}s=H[r>>2];h=b-s|0;e=h>>2;d=e+1|0;if(d>>>0>=1073741824){break ka}a=h>>>1|0;h=h>>>0>=2147483644?1073741823:a>>>0>d>>>0?a:d;if(h){if(h>>>0>=1073741824){break p}a=pa(h<<2)}else{a=0}d=a+(e<<2)|0;H[d>>2]=z;e=d+4|0;if((b|0)!=(s|0)){while(1){d=d-4|0;b=b-4|0;H[d>>2]=H[b>>2];if((b|0)!=(s|0)){continue}break}}H[g+80>>2]=a+(h<<2);H[g+76>>2]=e;H[g+72>>2]=d;if(!s){break ha}oa(s);break ha}sa();v()}sa();v()}q=H[g+8>>2];C=H[q>>2];if(((H[q+4>>2]-C>>2>>>0)/3|0)<=(l|0)){b=-1;break s}f=-1;b=-1;d=-1;s=H[q+24>>2];e=-1;ma:{if((z|0)==-1){break ma}a=z+1|0;a=(a>>>0)%3|0?a:z-2|0;e=-1;if((a|0)==-1){break ma}e=H[C+(a<<2)>>2]}o=H[s+(e<<2)>>2];na:{if((o|0)==-1){k=1;a=-1;break na}k=1;h=o+1|0;h=(h>>>0)%3|0?h:o-2|0;a=-1;if((h|0)==-1){break na}k=0;a=h+1|0;f=h;a=(a>>>0)%3|0?a:f-2|0;if((a|0)!=-1){a=H[C+(a<<2)>>2]}else{a=-1}}h=H[(a<<2)+s>>2];if((h|0)!=-1){d=h+1|0;d=(d>>>0)%3|0?d:h-2|0}if((f|0)==(z|0)|(d|0)==(z|0)|((z|0)!=-1&H[H[q+12>>2]+(z<<2)>>2]!=-1|(d|0)==(f|0))){break s}if(!k&H[H[q+12>>2]+(f<<2)>>2]!=-1){break s}k=-1;s=H[q+12>>2];h=-1;oa:{if((d|0)==-1){break oa}if(H[s+(d<<2)>>2]!=-1){break s}b=d+1|0;b=(b>>>0)%3|0?b:d-2|0;h=-1;if((b|0)==-1){break oa}h=H[C+(b<<2)>>2]}b=N(l,3);H[i>>2]=b;H[s+(b<<2)>>2]=z;H[s+(z<<2)>>2]=b;b=H[i>>2]+1|0;H[s+(b<<2)>>2]=f;H[s+(f<<2)>>2]=b;b=H[i>>2]+2|0;H[s+(b<<2)>>2]=d;H[s+(d<<2)>>2]=b;b=H[i>>2];H[C+(b<<2)>>2]=a;o=b+1|0;s=C+(o<<2)|0;H[s>>2]=h;h=b+2|0;d=C+(h<<2)|0;H[d>>2]=e;e=H[g+120>>2];f=o?a:-1;b=e+(f>>>3&536870908)|0;a=H[b>>2];R=b,S=Vj(f)&a,H[R>>2]=S;k=(o|0)!=-1?H[s>>2]:k;b=e+(k>>>3&536870908)|0;a=H[b>>2];R=b,S=Vj(k)&a,H[R>>2]=S;b=-1;b=(h|0)!=-1?H[d>>2]:b;f=e+(b>>>3&536870908)|0;a=H[f>>2];R=f,S=Vj(b)&a,H[R>>2]=S;F[i+88|0]=1;_c(j,i+88|0);Ka(r,i);l=l+1|0;f=H[i+64>>2]}if((c|0)!=(f|0)){continue}break}y=H[g+8>>2]}b=-1;if(((H[y+4>>2]-H[y>>2]>>2>>>0)/3|0)!=(l|0)){break s}b=H[y+28>>2]-H[y+24>>2]>>2;l=H[i+24>>2];e=H[i+28>>2];if((l|0)==(e|0)){break r}while(1){j=H[l>>2];a=H[y+24>>2];c=b-1|0;d=a+(c<<2)|0;if(H[d>>2]==-1){while(1){c=b-2|0;b=b-1|0;d=a+(c<<2)|0;if(H[d>>2]==-1){continue}break}}if(c>>>0>=j>>>0){H[i>>2]=y;d=H[d>>2];F[i+12|0]=1;H[i+8>>2]=d;H[i+4>>2]=d;if((d|0)!=-1){while(1){a=H[H[g+8>>2]>>2]+(d<<2)|0;if(H[a>>2]!=(c|0)){b=-1;break s}H[a>>2]=j;uc(i);d=H[i+8>>2];if((d|0)!=-1){continue}break}y=H[g+8>>2]}a=H[y+24>>2];f=a+(c<<2)|0;if((j|0)!=-1){H[a+(j<<2)>>2]=H[f>>2]}H[f>>2]=-1;h=1<>2];f=a+(j>>>3&536870908)|0;d=a+(c>>>3&536870908)|0;a=1<>2]&a){c=h|H[f>>2]}else{c=H[f>>2]&(h^-1)}H[f>>2]=c;H[d>>2]=H[d>>2]&(a^-1);b=b-1|0}l=l+4|0;if((e|0)!=(l|0)){continue}break}}l=H[i+24>>2]}if(l){oa(l)}a=H[i+48>>2];if(a){while(1){c=H[a>>2];oa(a);a=c;if(a){continue}break}}a=H[i+40>>2];H[i+40>>2]=0;if(a){oa(a)}a=H[i+64>>2];if(a){H[i+68>>2]=a;oa(a)}ca=i+96|0;break o}sa();v()}wa();v()}f=b;if((b|0)==-1){break n}b=H[x+16>>2];c=b+H[x>>2]|0;a=H[x+8>>2]-b|0;b=H[H[g+4>>2]+32>>2];G[b+38>>1]=J[b+38>>1];H[b>>2]=c;H[b+16>>2]=0;H[b+20>>2]=0;H[b+8>>2]=a;H[b+12>>2]=0;b=H[g+4>>2];a=J[b+36>>1];c=a<<8|a>>>8;if((c&65535)>>>0<=513){b=H[b+32>>2];e=b;a=H[b+16>>2];b=P+H[b+20>>2]|0;a=a+E|0;b=a>>>0>>0?b+1|0:b;H[e+16>>2]=a;H[e+20>>2]=b}pa:{if(H[g+216>>2]==H[g+220>>2]){break pa}a=H[g+8>>2];b=H[a>>2];a=H[a+4>>2];qa:{if((c&65535)>>>0>=513){if((a|0)==(b|0)){break pa}c=0;break qa}if((a|0)==(b|0)){break pa}c=0;while(1){if(cd(g,c)){c=c+3|0;a=H[g+8>>2];if(c>>>0>2]-H[a>>2]>>2>>>0){continue}break pa}break}break n}while(1){if(bd(g,c)){c=c+3|0;a=H[g+8>>2];if(c>>>0>2]-H[a>>2]>>2>>>0){continue}break pa}break}break n}ad(B);c=H[g+216>>2];if((c|0)!=H[g+220>>2]){t=0;while(1){e=N(t,144);Jc((e+c|0)+4|0,H[g+8>>2]);a=H[M>>2];b=a+e|0;c=H[b+132>>2];b=H[b+136>>2];if((c|0)!=(b|0)){while(1){Hc((e+H[M>>2]|0)+4|0,H[c>>2]);c=c+4|0;if((b|0)!=(c|0)){continue}break}a=H[M>>2]}if(!Ic((a+e|0)+4|0)){break n}t=t+1|0;c=H[g+216>>2];if(t>>>0<(H[g+220>>2]-c|0)/144>>>0){continue}break}}a=H[g+8>>2];Hb(g+184|0,H[a+28>>2]-H[a+24>>2]>>2);w=H[g+216>>2];if((w|0)!=H[g+220>>2]){c=0;while(1){a=N(c,144)+w|0;b=H[a+60>>2]-H[a+56>>2]>>2;e=a+104|0;a=H[g+8>>2];a=H[a+28>>2]-H[a+24>>2]>>2;Hb(e,(a|0)<(b|0)?b:a);c=c+1|0;w=H[g+216>>2];if(c>>>0<(H[g+220>>2]-w|0)/144>>>0){continue}break}}w=$c(g,f)}break b}w=0}ca=u- -64|0;return w|0}function ki(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,L=0,M=0,O=0,P=0,Q=0;t=ca+-64|0;ca=t;H[a+132>>2]=0;if(H[a+148>>2]){d=H[a+144>>2];if(d){while(1){b=H[d>>2];oa(d);d=b;if(b){continue}break}}d=0;H[a+144>>2]=0;k=H[a+140>>2];a:{if(!k){break a}if(k>>>0>=4){b=k&-4;while(1){c=d<<2;H[c+H[a+136>>2]>>2]=0;H[H[a+136>>2]+(c|4)>>2]=0;H[H[a+136>>2]+(c|8)>>2]=0;H[H[a+136>>2]+(c|12)>>2]=0;d=d+4|0;e=e+4|0;if((b|0)!=(e|0)){continue}break}}b=k&3;if(!b){break a}while(1){H[H[a+136>>2]+(d<<2)>>2]=0;d=d+1|0;x=x+1|0;if((b|0)!=(x|0)){continue}break}}H[a+148>>2]=0}b:{c:{d=H[a+4>>2];x=I[d+36|0];b=x<<8|I[d+37|0];if(b>>>0<=513){f=H[d+32>>2];d:{if(b>>>0<=511){b=H[f+20>>2];e=H[f+16>>2];c=e+4|0;b=c>>>0<4?b+1|0:b;k=H[f+12>>2];if(K[f+8>>2]>>0&(k|0)<=(b|0)|(b|0)>(k|0)){break c}e=e+H[f>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[f+16>>2]=c;H[f+20>>2]=b;break d}if(!Ea(1,t,f)){break c}d=H[a+4>>2];x=I[d+36|0];e=H[t>>2]}H[a+132>>2]=e}f=H[d+32>>2];e:{f:{g:{if((x&255)>>>0<=1){x=0;b=H[f+20>>2];c=H[f+16>>2];e=c+4|0;b=e>>>0<4?b+1|0:b;k=H[f+12>>2];if(K[f+8>>2]>>0&(k|0)<=(b|0)|(b|0)>(k|0)){break b}c=c+H[f>>2]|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[t+60>>2]=c;H[f+16>>2]=e;H[f+20>>2]=b;H[a+156>>2]=c;l=a+156|0;break g}x=0;if(!Ea(1,t+60|0,f)){break b}d=H[a+4>>2];b=I[d+36|0];H[a+156>>2]=H[t+60>>2];l=a+156|0;if(b>>>0>1){break f}}f=H[d+32>>2];c=H[f+8>>2];k=H[f+12>>2];d=H[f+20>>2];e=H[f+16>>2];b=e+4|0;d=b>>>0<4?d+1|0:d;if(b>>>0>c>>>0&(d|0)>=(k|0)|(d|0)>(k|0)){break b}e=e+H[f>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[t+56>>2]=e;H[f+16>>2]=b;H[f+20>>2]=d;break e}if(!Ea(1,t+56|0,H[d+32>>2])){break b}e=H[t+56>>2]}if(e>>>0>1431655765|K[l>>2]>N(e,3)>>>0){break b}j=H[a+4>>2];y=H[j+32>>2];d=H[y+8>>2];f=H[y+12>>2];b=H[y+20>>2];m=H[y+16>>2];if((f|0)<=(b|0)&m>>>0>=d>>>0|(b|0)>(f|0)){break b}l=H[y>>2];g=I[l+m|0];c=y;k=m+1|0;C=k?b:b+1|0;H[c+16>>2]=k;H[c+20>>2]=C;h:{if(I[j+36|0]<=1){c=d;d=m+5|0;b=d>>>0<5?b+1|0:b;if(c>>>0>>0&(b|0)>=(f|0)|(b|0)>(f|0)){break b}c=k+l|0;l=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[t+52>>2]=l;H[y+16>>2]=d;H[y+20>>2]=b;break h}if(!Ea(1,t+52|0,y)){break b}l=H[t+52>>2]}if(e>>>0>>0|((l>>>0)/3|0)+l>>>0>>0){break b}d=H[a+4>>2];f=H[d+32>>2];i:{if(I[d+36|0]<=1){d=H[f+20>>2];b=H[f+16>>2];c=b+4|0;d=c>>>0<4?d+1|0:d;k=H[f+12>>2];if(K[f+8>>2]>>0&(k|0)<=(d|0)|(d|0)>(k|0)){break b}b=b+H[f>>2]|0;b=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[t+48>>2]=b;H[f+16>>2]=c;H[f+20>>2]=d;break i}if(!Ea(1,t+48|0,f)){break b}b=H[t+48>>2]}if(b>>>0>l>>>0){break b}H[a+28>>2]=H[a+24>>2];d=$b(pa(88));c=H[a+8>>2];H[a+8>>2]=d;if(c){cb(c);if(!H[a+8>>2]){break b}}H[a+164>>2]=H[a+160>>2];Jb(a+160|0,e);H[a+176>>2]=H[a+172>>2];Jb(a+172|0,e);H[a- -64>>2]=0;H[a+92>>2]=-1;H[a+84>>2]=-1;H[a+88>>2]=-1;H[a+40>>2]=H[a+36>>2];H[a+52>>2]=H[a+48>>2];H[a+76>>2]=H[a+72>>2];E=a+216|0;ed(E);dd(E,g);if(!Lc(H[a+8>>2],e,H[a+156>>2]+b|0)){break b}d=H[a+156>>2];F[t|0]=1;Oa(a+120|0,b+d|0,t);b=H[a+4>>2];d=J[b+36>>1];d=(d<<8|d>>>8)&65535;j:{if(d>>>0<=513){k=H[b+32>>2];k:{if(d>>>0<=511){b=H[k+20>>2];e=H[k+16>>2];d=e+4|0;b=d>>>0<4?b+1|0:b;c=H[k+12>>2];if(K[k+8>>2]>>0&(c|0)<=(b|0)|(b|0)>(c|0)){break b}e=e+H[k>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[k+16>>2]=d;H[k+20>>2]=b;break k}if(!Ea(1,t+44|0,k)){break b}e=H[t+44>>2]}if(!e){break b}k=H[H[a+4>>2]+32>>2];c=H[k+8>>2];d=H[k+16>>2];b=c-d|0;d=H[k+12>>2]-(H[k+20>>2]+(c>>>0>>0)|0)|0;if(b>>>0>>0&(d|0)<=0|(d|0)<0){break b}f=Ha(t);k=H[H[a+4>>2]+32>>2];c=H[k+16>>2];b=(c+H[k>>2]|0)+e|0;d=H[k+8>>2]-c|0;G[f+38>>1]=J[k+38>>1];H[f>>2]=b;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=d-e;H[f+12>>2]=0;d=Ib(a,f);if((d|0)==-1){break b}y=d;M=d>>31;break j}y=-1;M=-1;if((Ib(a,H[b+32>>2])|0)==-1){break b}}O=a+232|0;e=O;H[e+144>>2]=a;d=H[(ea[H[H[a>>2]+32>>2]](a)|0)+32>>2];b=H[d>>2]+H[d+16>>2]|0;d=H[(ea[H[H[a>>2]+32>>2]](a)|0)+32>>2];d=H[d+8>>2]-H[d+16>>2]|0;P=e,Q=J[H[(ea[H[H[a>>2]+32>>2]](a)|0)+32>>2]+38>>1],G[P+38>>1]=Q;H[e>>2]=b;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=d;H[e+12>>2]=0;H[a+372>>2]=g;C=Ha(t);l:{if(!Ge(e,C)){break l}b=0;d=0;e=0;k=0;i=ca-96|0;ca=i;H[i+72>>2]=0;H[i+64>>2]=0;H[i+68>>2]=0;H[i+48>>2]=0;H[i+52>>2]=0;H[i+40>>2]=0;H[i+44>>2]=0;H[i+56>>2]=1065353216;H[i+32>>2]=0;H[i+24>>2]=0;H[i+28>>2]=0;h=a;L=H[a+124>>2];m:{n:{o:{p:{q:{r:{if((l|0)<=0){break r}A=H[h+216>>2]!=H[h+220>>2];s=1;while(1){f=k;k=f+1|0;s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{if(!I[h+308|0]){break G}u=H[h+296>>2];g=H[h+304>>2];a=u+(g>>>3|0)|0;p=H[h+300>>2];if(a>>>0>=p>>>0){break G}c=I[a|0];a=g+1|0;H[h+304>>2]=a;m=c>>>(g&7)&1;if(!m){break G}n=0;j=a>>>3|0;c=u+j|0;H:{if(c>>>0>=p>>>0){g=a;a=0;break H}c=I[c|0];g=g+2|0;H[h+304>>2]=g;j=g>>>3|0;a=c>>>(a&7)&1}c=j+u|0;if(c>>>0

>>0){c=I[c|0];H[h+304>>2]=g+1;n=c>>>(g&7)<<1&2}j=-1;a=m|(a|n)<<1;switch(a-1|0){case 6:break D;case 0:break E;case 2:case 4:break F;default:break q}}if((d|0)==(e|0)){j=-1;break q}g=-1;q=H[h+8>>2];u=H[q+24>>2];p=d-4|0;s=H[p>>2];c=-1;I:{if((s|0)==-1){break I}b=s+1|0;b=(b>>>0)%3|0?b:s-2|0;c=-1;if((b|0)==-1){break I}c=H[H[q>>2]+(b<<2)>>2]}b=H[u+(c<<2)>>2];if((b|0)!=-1){a=b+1|0;g=(a>>>0)%3|0?a:b-2|0}if((g|0)==(s|0)){j=-1;break q}if((s|0)!=-1){j=-1;if(H[H[q+12>>2]+(s<<2)>>2]!=-1){break q}}b=H[q+12>>2];if((g|0)!=-1){j=-1;if(H[b+(g<<2)>>2]!=-1){break q}}n=N(f,3);a=n+1|0;H[b+(s<<2)>>2]=a;m=a<<2;H[m+b>>2]=s;r=n+2|0;H[b+(g<<2)>>2]=r;f=r<<2;H[f+b>>2]=g;o=-1;a=-1;J:{if((s|0)==-1){break J}K:{if((s>>>0)%3|0){b=s-1|0;break K}b=s+2|0;a=-1;if((b|0)==-1){break J}}a=H[H[q>>2]+(b<<2)>>2]}L:{if((g|0)==-1){break L}b=g+1|0;b=(b>>>0)%3|0?b:g-2|0;if((b|0)==-1){break L}o=H[H[q>>2]+(b<<2)>>2]}j=-1;if((a|0)==(c|0)|(c|0)==(o|0)){break q}b=H[q>>2];H[b+(n<<2)>>2]=c;H[b+m>>2]=o;H[b+f>>2]=a;if((a|0)!=-1){H[u+(a<<2)>>2]=r}b=H[h+120>>2]+(c>>>3&536870908)|0;a=H[b>>2];P=b,Q=Vj(c)&a,H[P>>2]=Q;H[p>>2]=n;b=e;break s}if((d|0)==(e|0)){break q}m=d-4|0;n=H[m>>2];r=H[h+8>>2];b=H[r+12>>2];if((n|0)!=-1&H[b+(n<<2)>>2]!=-1){break q}o=N(f,3);p=(a|0)==5;g=o+(p?2:1)|0;a=g<<2;H[a+b>>2]=n;H[b+(n<<2)>>2]=g;Ka(r+24|0,11424);b=H[h+8>>2];u=H[b+24>>2];if(H[b+28>>2]-u>>2>(L|0)){break q}j=H[b>>2];q=j+a|0;c=H[r+28>>2];b=H[r+24>>2];a=(c-b>>2)-1|0;H[q>>2]=a;if((b|0)!=(c|0)){H[u+(a<<2)>>2]=g}c=p?o:o+2|0;g=j+(o+p<<2)|0;M:{if((n|0)==-1){H[j+(c<<2)>>2]=-1;b=-1;break M}N:{O:{P:{if((n>>>0)%3|0){a=n-1|0;break P}a=n+2|0;if((a|0)==-1){break O}}a=H[j+(a<<2)>>2];H[j+(c<<2)>>2]=a;if((a|0)==-1){break N}H[u+(a<<2)>>2]=c;break N}H[j+(c<<2)>>2]=-1}a=n+1|0;a=(a>>>0)%3|0?a:n-2|0;b=-1;if((a|0)==-1){break M}b=H[j+(a<<2)>>2]}H[g>>2]=b;H[m>>2]=o;b=e;break y}if((b|0)==(d|0)){break q}a=d-4|0;q=H[a>>2];H[i+68>>2]=a;p=H[i+44>>2];Q:{if(!p){d=a;break Q}g=H[i+40>>2];j=Uj(p)>>>0>1;c=f&p+2147483647;R:{if(!j){break R}c=f;if(c>>>0

>>0){break R}c=(f>>>0)%(p>>>0)|0}m=c;c=H[g+(m<<2)>>2];if(!c){d=a;break Q}g=H[c>>2];if(!g){d=a;break Q}S:{if(!j){j=p-1|0;while(1){c=H[g+4>>2];T:{if((c|0)!=(f|0)){if((m|0)==(c&j)){break T}d=a;break Q}if((f|0)==H[g+8>>2]){break S}}g=H[g>>2];if(g){continue}break}d=a;break Q}while(1){c=H[g+4>>2];U:{if((c|0)!=(f|0)){if(c>>>0>=p>>>0){c=(c>>>0)%(p>>>0)|0}if((c|0)==(m|0)){break U}d=a;break Q}if((f|0)==H[g+8>>2]){break S}}g=H[g>>2];if(g){continue}break}d=a;break Q}if((a|0)!=(z|0)){H[a>>2]=H[g+12>>2];H[i+68>>2]=d;break Q}c=z-b|0;d=c>>2;e=d+1|0;if(e>>>0>=1073741824){break C}a=c>>>1|0;c=c>>>0>=2147483644?1073741823:a>>>0>e>>>0?a:e;if(c){if(c>>>0>=1073741824){break n}a=pa(c<<2)}else{a=0}e=a+(d<<2)|0;H[e>>2]=H[g+12>>2];d=e+4|0;if((b|0)!=(z|0)){while(1){e=e-4|0;z=z-4|0;H[e>>2]=H[z>>2];if((b|0)!=(z|0)){continue}break}}z=a+(c<<2)|0;H[i+72>>2]=z;H[i+68>>2]=d;H[i+64>>2]=e;if(b){oa(b)}}if((d|0)==(e|0)){break u}g=d-4|0;n=H[g>>2];if((n|0)==(q|0)){break u}b=(n|0)==-1;o=H[h+8>>2];if(!b&H[H[o+12>>2]+(n<<2)>>2]!=-1){break u}r=H[o+12>>2];if((q|0)!=-1&H[r+(q<<2)>>2]!=-1){break u}u=N(f,3);f=u+2|0;H[r+(n<<2)>>2]=f;p=f<<2;H[p+r>>2]=n;a=u+1|0;H[r+(q<<2)>>2]=a;c=a<<2;H[c+r>>2]=q;if(b){break B}if((n>>>0)%3|0){m=n-1|0;break x}m=n+2|0;if((m|0)!=-1){break x}a=H[o>>2];b=-1;break w}a=H[h+8>>2];Ka(a+24|0,11424);c=H[h+8>>2];q=N(f,3);r=H[a+28>>2];u=H[a+24>>2];p=r-u|0;o=p>>2;g=o-1|0;H[H[c>>2]+(q<<2)>>2]=g;Ka(c+24|0,11424);m=q+1|0;H[H[c>>2]+(m<<2)>>2]=(H[c+28>>2]-H[c+24>>2]>>2)-1;a=H[h+8>>2];Ka(a+24|0,11424);c=q+2|0;H[H[a>>2]+(c<<2)>>2]=(H[a+28>>2]-H[a+24>>2]>>2)-1;a=H[h+8>>2];n=H[a+24>>2];if(H[a+28>>2]-n>>2>(L|0)){break q}V:{W:{if((r|0)!=(u|0)){H[n+(g<<2)>>2]=q;j=0;if((p|0)==-4){break W}}H[n+(o<<2)>>2]=m;j=o+1|0;if((j|0)==-1){break V}}H[n+(j<<2)>>2]=c}if((d|0)!=(z|0)){H[d>>2]=q;d=d+4|0;H[i+68>>2]=d;break y}m=d-b|0;e=m>>2;c=e+1|0;if(c>>>0>=1073741824){break A}a=m>>>1|0;c=m>>>0>=2147483644?1073741823:a>>>0>c>>>0?a:c;if(c){if(c>>>0>=1073741824){break n}a=pa(c<<2)}else{a=0}e=a+(e<<2)|0;H[e>>2]=q;z=a+(c<<2)|0;a=e+4|0;if((b|0)!=(d|0)){while(1){e=e-4|0;d=d-4|0;H[e>>2]=H[d>>2];if((b|0)!=(d|0)){continue}break}}H[i+72>>2]=z;H[i+68>>2]=a;H[i+64>>2]=e;if(!b){break z}oa(b);break z}sa();v()}m=-1;a=H[o>>2];H[a+(u<<2)>>2]=-1;j=-1;break v}sa();v()}d=a;b=e}m=H[h+40>>2];if((m|0)==H[h+36>>2]){break s}c=m-12|0;a=H[c+4>>2];j=(f^-1)+l|0;if(a>>>0>j>>>0){break u}if((a|0)!=(j|0)){break s}f=I[m-4|0];a=H[c>>2];H[h+40>>2]=c;if((a|0)<0){break u}m=d-4|0;g=H[m>>2];H[i+20>>2]=(a^-1)+l;a=i+20|0;H[i+88>>2]=a;Gb(i,i+40|0,a,i+88|0);c=H[i>>2];X:{if(f&1){a=-1;if((g|0)==-1){break X}a=g+1|0;a=(a>>>0)%3|0?a:g-2|0;break X}a=-1;if((g|0)==-1){break X}a=g-1|0;if((g>>>0)%3|0){break X}a=g+2|0}H[c+12>>2]=a;g=H[h+40>>2];if((g|0)==H[h+36>>2]){break s}while(1){c=g-12|0;a=H[c+4>>2];if(a>>>0>j>>>0){break u}if((a|0)!=(j|0)){break s}f=I[g-4|0];a=H[c>>2];H[h+40>>2]=c;if((a|0)<0){break u}g=H[m>>2];H[i+20>>2]=(a^-1)+l;a=i+20|0;H[i+88>>2]=a;Gb(i,i+40|0,a,i+88|0);c=H[i>>2];Y:{if(f&1){a=-1;if((g|0)==-1){break Y}a=g+1|0;a=(a>>>0)%3|0?a:g-2|0;break Y}a=-1;if((g|0)==-1){break Y}a=g-1|0;if((g>>>0)%3|0){break Y}a=g+2|0}H[c+12>>2]=a;g=H[h+40>>2];if((g|0)!=H[h+36>>2]){continue}break}break s}a=H[o>>2];b=H[a+(m<<2)>>2]}m=b;H[(u<<2)+a>>2]=b;b=n+1|0;b=(b>>>0)%3|0?b:n-2|0;j=-1;if((b|0)==-1){break v}j=H[(b<<2)+a>>2]}H[a+c>>2]=j;Z:{if((q|0)==-1){H[a+p>>2]=-1;n=-1;c=-1;break Z}_:{$:{aa:{if((q>>>0)%3|0){b=q-1|0;break aa}b=q+2|0;if((b|0)==-1){break $}}b=H[(b<<2)+a>>2];H[a+p>>2]=b;if((b|0)==-1){break _}H[H[o+24>>2]+(b<<2)>>2]=f;break _}H[a+p>>2]=-1}n=-1;b=q+1|0;b=(b>>>0)%3|0?b:q-2|0;c=-1;if((b|0)==-1){break Z}n=H[(b<<2)+a>>2];c=b}b=H[o+24>>2];p=b+(n<<2)|0;if((m|0)!=-1){H[b+(m<<2)>>2]=H[p>>2]}b=c;while(1){if((b|0)==-1){break t}H[(b<<2)+a>>2]=m;j=b+1|0;b=(j>>>0)%3|0?j:b-2|0;f=-1;ba:{if((b|0)==-1){break ba}j=H[r+(b<<2)>>2];f=-1;if((j|0)==-1){break ba}b=j+1|0;f=(b>>>0)%3|0?b:j-2|0}b=f;if((c|0)!=(b|0)){continue}break}}j=-1;if(!(s&1)){break r}break q}H[p>>2]=-1;ca:{if(A){break ca}if((B|0)!=(D|0)){H[D>>2]=n;D=D+4|0;H[i+28>>2]=D;break ca}f=B-w|0;b=f>>2;c=b+1|0;if(c>>>0>=1073741824){break o}a=f>>>1|0;c=f>>>0>=2147483644?1073741823:a>>>0>c>>>0?a:c;if(c){if(c>>>0>=1073741824){break n}a=pa(c<<2)}else{a=0}b=a+(b<<2)|0;H[b>>2]=n;D=b+4|0;if((w|0)!=(B|0)){while(1){b=b-4|0;B=B-4|0;H[b>>2]=H[B>>2];if((w|0)!=(B|0)){continue}break}}B=a+(c<<2)|0;H[i+32>>2]=B;H[i+28>>2]=D;H[i+24>>2]=b;if(w){oa(w)}w=b}H[g>>2]=u;b=e}s=(k|0)<(l|0);if((k|0)!=(l|0)){continue}break}k=l}j=-1;a=H[h+8>>2];if(H[a+28>>2]-H[a+24>>2]>>2>(L|0)){break q}if((d|0)!=(e|0)){u=h+72|0;m=h+60|0;p=h+312|0;while(1){d=d-4|0;o=H[d>>2];H[i+68>>2]=d;da:{ea:{fa:{if(J[h+270>>1]<=513){if(!I[h+364|0]){break ea}b=H[h+360>>2];a=H[h+352>>2]+(b>>>3|0)|0;if(a>>>0>=K[h+356>>2]){break fa}a=I[a|0];H[h+360>>2]=b+1;if(!(a>>>(b&7)&1)){break fa}break ea}if(Ba(p)){break ea}}ga:{ha:{b=H[h+64>>2];c=H[h+68>>2];if((b|0)==c<<5){if((b+1|0)<0){break ha}if(b>>>0<=1073741822){c=c<<6;b=(b&-32)+32|0;a=b>>>0>>0?c:b}else{a=2147483647}pb(m,a);b=H[h+64>>2]}H[h+64>>2]=b+1;c=H[h+60>>2]+(b>>>3&536870908)|0;a=H[c>>2];P=c,Q=Vj(b)&a,H[P>>2]=Q;b=H[h+76>>2];if((b|0)!=H[h+80>>2]){H[b>>2]=o;H[h+76>>2]=b+4;break da}l=H[u>>2];w=b-l|0;c=w>>2;f=c+1|0;if(f>>>0>=1073741824){break ga}a=w>>>1|0;f=w>>>0>=2147483644?1073741823:a>>>0>f>>>0?a:f;if(f){if(f>>>0>=1073741824){break n}a=pa(f<<2)}else{a=0}g=a+(c<<2)|0;H[g>>2]=o;c=g+4|0;if((b|0)!=(l|0)){while(1){g=g-4|0;b=b-4|0;H[g>>2]=H[b>>2];if((b|0)!=(l|0)){continue}break}}H[h+80>>2]=a+(f<<2);H[h+76>>2]=c;H[h+72>>2]=g;if(!l){break da}oa(l);break da}sa();v()}sa();v()}r=H[h+8>>2];A=H[r>>2];if(((H[r+4>>2]-A>>2>>>0)/3|0)<=(k|0)){j=-1;break q}a=-1;j=-1;b=-1;w=H[r+24>>2];f=-1;ia:{if((o|0)==-1){break ia}e=o+1|0;e=(e>>>0)%3|0?e:o-2|0;f=-1;if((e|0)==-1){break ia}f=H[A+(e<<2)>>2]}l=H[w+(f<<2)>>2];ja:{if((l|0)==-1){g=1;e=-1;break ja}g=1;c=l+1|0;c=(c>>>0)%3|0?c:l-2|0;e=-1;if((c|0)==-1){break ja}g=0;a=c;e=a+1|0;e=(e>>>0)%3|0?e:a-2|0;if((e|0)!=-1){e=H[A+(e<<2)>>2]}else{e=-1}}c=H[(e<<2)+w>>2];if((c|0)!=-1){b=c+1|0;b=(b>>>0)%3|0?b:c-2|0}if((a|0)==(o|0)|(b|0)==(o|0)|((o|0)!=-1&H[H[r+12>>2]+(o<<2)>>2]!=-1|(a|0)==(b|0))){break q}if(!g&H[H[r+12>>2]+(a<<2)>>2]!=-1){break q}g=-1;l=H[r+12>>2];w=-1;ka:{if((b|0)==-1){break ka}if(H[l+(b<<2)>>2]!=-1){break q}c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;w=-1;if((c|0)==-1){break ka}w=H[A+(c<<2)>>2]}c=N(k,3);H[i>>2]=c;H[l+(c<<2)>>2]=o;H[l+(o<<2)>>2]=c;c=H[i>>2]+1|0;H[l+(c<<2)>>2]=a;H[l+(a<<2)>>2]=c;a=H[i>>2]+2|0;H[l+(a<<2)>>2]=b;H[l+(b<<2)>>2]=a;a=H[i>>2];H[A+(a<<2)>>2]=e;j=a+1|0;l=A+(j<<2)|0;H[l>>2]=w;w=a+2|0;c=A+(w<<2)|0;H[c>>2]=f;f=H[h+120>>2];e=j?e:-1;b=f+(e>>>3&536870908)|0;a=H[b>>2];P=b,Q=Vj(e)&a,H[P>>2]=Q;g=(j|0)!=-1?H[l>>2]:g;b=f+(g>>>3&536870908)|0;a=H[b>>2];P=b,Q=Vj(g)&a,H[P>>2]=Q;b=-1;b=(w|0)!=-1?H[c>>2]:b;e=f+(b>>>3&536870908)|0;a=H[e>>2];P=e,Q=Vj(b)&a,H[P>>2]=Q;F[i+88|0]=1;_c(m,i+88|0);Ka(u,i);k=k+1|0;e=H[i+64>>2]}if((d|0)!=(e|0)){continue}break}a=H[h+8>>2]}j=-1;if(((H[a+4>>2]-H[a>>2]>>2>>>0)/3|0)!=(k|0)){break q}j=H[a+28>>2]-H[a+24>>2]>>2;s=H[i+24>>2];c=H[i+28>>2];if((s|0)==(c|0)){break p}while(1){k=H[s>>2];d=H[a+24>>2];b=j-1|0;g=d+(b<<2)|0;if(H[g>>2]==-1){while(1){b=j-2|0;j=j-1|0;g=d+(b<<2)|0;if(H[g>>2]==-1){continue}break}}if(b>>>0>=k>>>0){H[i>>2]=a;g=H[g>>2];F[i+12|0]=1;H[i+8>>2]=g;H[i+4>>2]=g;if((g|0)!=-1){while(1){a=H[H[h+8>>2]>>2]+(g<<2)|0;if(H[a>>2]!=(b|0)){j=-1;break q}H[a>>2]=k;uc(i);g=H[i+8>>2];if((g|0)!=-1){continue}break}a=H[h+8>>2]}d=H[a+24>>2];e=d+(b<<2)|0;if((k|0)!=-1){H[d+(k<<2)>>2]=H[e>>2]}H[e>>2]=-1;f=1<>2];e=d+(k>>>3&536870908)|0;k=d+(b>>>3&536870908)|0;d=1<>2]&d){b=f|H[e>>2]}else{b=H[e>>2]&(f^-1)}H[e>>2]=b;H[k>>2]=H[k>>2]&(d^-1);j=j-1|0}s=s+4|0;if((c|0)!=(s|0)){continue}break}}s=H[i+24>>2]}if(s){oa(s)}a=H[i+48>>2];if(a){while(1){d=H[a>>2];oa(a);a=d;if(a){continue}break}}a=H[i+40>>2];H[i+40>>2]=0;if(a){oa(a)}a=H[i+64>>2];if(a){H[i+68>>2]=a;oa(a)}ca=i+96|0;a=j;break m}sa();v()}wa();v()}e=a;if((a|0)==-1){break l}b=H[C+16>>2];d=b+H[C>>2]|0;a=H[C+8>>2]-b|0;b=H[H[h+4>>2]+32>>2];G[b+38>>1]=J[b+38>>1];H[b>>2]=d;H[b+16>>2]=0;H[b+20>>2]=0;H[b+8>>2]=a;H[b+12>>2]=0;b=H[h+4>>2];a=J[b+36>>1];d=a<<8|a>>>8;if((d&65535)>>>0<=513){b=H[b+32>>2];c=b;a=H[b+16>>2];b=M+H[b+20>>2]|0;a=a+y|0;b=a>>>0>>0?b+1|0:b;H[c+16>>2]=a;H[c+20>>2]=b}la:{if(H[h+216>>2]==H[h+220>>2]){break la}a=H[h+8>>2];b=H[a>>2];a=H[a+4>>2];ma:{if((d&65535)>>>0>=513){if((a|0)==(b|0)){break la}d=0;break ma}if((a|0)==(b|0)){break la}d=0;while(1){if(cd(h,d)){d=d+3|0;a=H[h+8>>2];if(d>>>0>2]-H[a>>2]>>2>>>0){continue}break la}break}break l}while(1){if(bd(h,d)){d=d+3|0;a=H[h+8>>2];if(d>>>0>2]-H[a>>2]>>2>>>0){continue}break la}break}break l}ad(O);d=H[h+216>>2];if((d|0)!=H[h+220>>2]){l=0;while(1){c=N(l,144);Jc((c+d|0)+4|0,H[h+8>>2]);a=H[E>>2];b=a+c|0;d=H[b+132>>2];b=H[b+136>>2];if((d|0)!=(b|0)){while(1){Hc((c+H[E>>2]|0)+4|0,H[d>>2]);d=d+4|0;if((b|0)!=(d|0)){continue}break}a=H[E>>2]}if(!Ic((a+c|0)+4|0)){break l}l=l+1|0;d=H[h+216>>2];if(l>>>0<(H[h+220>>2]-d|0)/144>>>0){continue}break}}a=H[h+8>>2];Hb(h+184|0,H[a+28>>2]-H[a+24>>2]>>2);x=H[h+216>>2];if((x|0)!=H[h+220>>2]){d=0;while(1){a=N(d,144)+x|0;b=H[a+60>>2]-H[a+56>>2]>>2;c=a+104|0;a=H[h+8>>2];a=H[a+28>>2]-H[a+24>>2]>>2;Hb(c,(a|0)<(b|0)?b:a);d=d+1|0;x=H[h+216>>2];if(d>>>0<(H[h+220>>2]-x|0)/144>>>0){continue}break}}x=$c(h,e)}break b}x=0}ca=t- -64|0;return x|0}function Bg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,J=0,K=0,L=0,M=0,O=0;B=c;c=0;m=ca-96|0;ca=m;l=m+16|0;ra(l,0,76);H[m+92>>2]=-1;H[m+8>>2]=0;H[m>>2]=0;H[m+4>>2]=0;r=ca-16|0;ca=r;H[l+68>>2]=0;H[l+72>>2]=0;H[l>>2]=b;s=ca-16|0;ca=s;u=b;a=H[b+20>>2];a:{if((H[b+24>>2]-a|0)<=0){break a}a=H[a>>2];if((a|0)==-1){break a}c=H[H[u+8>>2]+(a<<2)>>2]}b:{c:{d:{if(!c){a=0;break d}a=H[u+100>>2];e=H[u+96>>2];H[s+8>>2]=0;H[s>>2]=0;H[s+4>>2]=0;f=a-e|0;b=(f|0)/12|0;e:{if((a|0)==(e|0)){break e}if(b>>>0>=357913942){break c}d=pa(f);H[s>>2]=d;H[s+8>>2]=d+N(b,12);a=0;n=d;f=f-12|0;d=(f-((f>>>0)%12|0)|0)+12|0;f=ra(n,0,d);H[s+4>>2]=d+f;if(I[c+84|0]){c=b>>>0<=1?1:b;h=c&1;if(b>>>0>=2){g=c&-2;c=0;while(1){d=N(a,12);b=d+e|0;i=H[b+4>>2];j=H[b>>2];d=d+f|0;H[d+8>>2]=H[b+8>>2];H[d>>2]=j;H[d+4>>2]=i;d=N(a|1,12);b=d+e|0;i=H[b+4>>2];j=H[b>>2];d=d+f|0;H[d+8>>2]=H[b+8>>2];H[d>>2]=j;H[d+4>>2]=i;a=a+2|0;c=c+2|0;if((g|0)!=(c|0)){continue}break}}if(!h){break e}b=N(a,12);a=b+e|0;c=H[a+4>>2];e=H[a>>2];b=b+f|0;H[b+8>>2]=H[a+8>>2];H[b>>2]=e;H[b+4>>2]=c;break e}h=b>>>0<=1?1:b;a=H[c+68>>2];c=0;while(1){d=N(c,12);b=d+e|0;g=H[a+(H[b>>2]<<2)>>2];i=H[a+(H[b+4>>2]<<2)>>2];d=d+f|0;H[d+8>>2]=H[a+(H[b+8>>2]<<2)>>2];H[d+4>>2]=i;H[d>>2]=g;c=c+1|0;if((h|0)!=(c|0)){continue}break}}d=0;E=ca-16|0;ca=E;h=pa(88);$b(h);C=ca-16|0;ca=C;H[h+80>>2]=0;H[h+84>>2]=0;a=H[h+76>>2];H[h+76>>2]=0;if(a){oa(a)}H[h+68>>2]=0;H[h+72>>2]=0;b=h- -64|0;a=H[b>>2];H[b>>2]=0;if(a){oa(a)}g=H[s+4>>2];b=H[s>>2];c=(g-b|0)/12|0;a=N(c,3);f=H[h>>2];e=H[h+4>>2]-f>>2;f:{if(a>>>0>e>>>0){ue(h,a-e|0);g=H[s+4>>2];b=H[s>>2];c=(g-b|0)/12|0;break f}if(a>>>0>=e>>>0){break f}H[h+4>>2]=f+(a<<2)}g:{if((b|0)==(g|0)){break g}e=c>>>0<=1?1:c;g=e&1;a=H[h>>2];if(c>>>0>=2){i=e&-2;c=0;while(1){e=N(d,12);j=e+a|0;f=b+e|0;H[j>>2]=H[f>>2];H[a+(e|4)>>2]=H[f+4>>2];H[j+8>>2]=H[f+8>>2];f=N(d|1,12);e=f+a|0;f=b+f|0;H[e>>2]=H[f>>2];H[e+4>>2]=H[f+4>>2];H[e+8>>2]=H[f+8>>2];d=d+2|0;c=c+2|0;if((i|0)!=(c|0)){continue}break}}if(!g){break g}c=N(d,12);a=c+a|0;b=b+c|0;H[a>>2]=H[b>>2];H[a+4>>2]=H[b+4>>2];H[a+8>>2]=H[b+8>>2]}H[C+12>>2]=-1;a=0;e=0;g=0;f=ca-32|0;ca=f;h:{i:{w=C+12|0;j:{if(!w){break j}c=H[h+4>>2];j=H[h>>2];d=c-j|0;i=d>>2;n=H[h+12>>2];b=H[h+16>>2]-n>>2;k:{if(i>>>0>b>>>0){qb(h+12|0,i-b|0,13652);c=H[h+4>>2];j=H[h>>2];d=c-j|0;i=d>>2;break k}if(b>>>0<=i>>>0){break k}H[h+16>>2]=n+(i<<2)}H[f+24>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;b=(c|0)==(j|0);if(!b){if((d|0)<0){break i}e=pa(d);H[f+20>>2]=e;H[f+16>>2]=e;H[f+24>>2]=(i<<2)+e}l:{m:{n:{o:{p:{if(d){while(1){i=H[(a<<2)+j>>2];b=H[f+20>>2]-e>>2;q:{if(i>>>0>>0){break q}H[f>>2]=0;d=i+1|0;if(d>>>0>b>>>0){Pa(f+16|0,d-b|0,f);j=H[h>>2];c=H[h+4>>2];e=H[f+16>>2];break q}if(b>>>0<=d>>>0){break q}H[f+20>>2]=(d<<2)+e}b=(i<<2)+e|0;H[b>>2]=H[b>>2]+1;a=a+1|0;d=c-j|0;i=d>>2;if(a>>>0>>0){continue}break}break p}d=0;if(!b){break o}break n}if((c|0)==(j|0)){d=0;break n}if(d>>>0>=2147483645){break m}}d=pa(d<<1);ra(d,255,i<<3)}H[f+8>>2]=0;H[f>>2]=0;H[f+4>>2]=0;b=H[f+20>>2];a=b-e|0;t=a>>2;r:{s:{if((b|0)==(e|0)){break s}if((a|0)<0){break r}q=pa(a);H[f>>2]=q;H[f+8>>2]=(t<<2)+q;b=ra(q,0,a);H[f+4>>2]=b+a;c=t>>>0<=1?1:t;n=c&3;a=0;if(c-1>>>0>=3){o=c&-4;while(1){c=g<<2;H[c+b>>2]=a;x=c|4;a=H[c+e>>2]+a|0;H[x+b>>2]=a;y=c|8;a=a+H[e+x>>2]|0;H[y+b>>2]=a;c=c|12;a=a+H[e+y>>2]|0;H[c+b>>2]=a;a=a+H[c+e>>2]|0;g=g+4|0;p=p+4|0;if((o|0)!=(p|0)){continue}break}}if(!n){break s}while(1){c=g<<2;H[c+b>>2]=a;g=g+1|0;a=H[c+e>>2]+a|0;k=k+1|0;if((n|0)!=(k|0)){continue}break}}if(!i){break l}x=H[h+40>>2];y=H[h+12>>2];n=0;while(1){G=n<<2;a=G+j|0;k=-1;c=n+1|0;b=(c>>>0)%3|0?c:n-2|0;if((b|0)!=-1){k=H[(b<<2)+j>>2]}b=H[a>>2];t:{u:{if(!((n>>>0)%3|0)){p=-1;a=n+2|0;if((a|0)!=-1){p=H[(a<<2)+j>>2]}if(!((b|0)==(k|0)|(b|0)==(p|0))&(k|0)!=(p|0)){break u}x=x+1|0;H[h+40>>2]=x;c=n+3|0;break t}p=H[a-4>>2]}a=p<<2;A=H[a+e>>2];v:{w:{if((A|0)<=0){break w}a=H[a+q>>2];g=0;while(1){o=(a<<3)+d|0;z=H[o>>2];if((z|0)==-1){break w}x:{if((k|0)!=(z|0)){break x}o=H[o+4>>2];if((o|0)!=-1){z=H[(o<<2)+j>>2]}else{z=-1}if((z|0)==(b|0)){break x}while(1){y:{b=a;g=g+1|0;if((A|0)<=(g|0)){break y}a=b+1|0;J=(a<<3)+d|0;z=H[J>>2];K=(b<<3)+d|0;H[K+4>>2]=H[J+4>>2];H[K>>2]=z;if((z|0)!=-1){continue}}break}H[(b<<3)+d>>2]=-1;if((o|0)==-1){break w}H[y+G>>2]=o;H[y+(o<<2)>>2]=n;break v}a=a+1|0;g=g+1|0;if((A|0)!=(g|0)){continue}break}}a=k<<2;k=H[a+e>>2];if((k|0)<=0){break v}a=H[a+q>>2];g=0;while(1){b=(a<<3)+d|0;if(H[b>>2]==-1){H[b>>2]=p;H[b+4>>2]=n;break v}a=a+1|0;g=g+1|0;if((k|0)!=(g|0)){continue}break}}}n=c;if(n>>>0>>0){continue}break}break l}break i}sa();v()}H[w>>2]=t;if(q){oa(q)}if(d){oa(d)}a=H[f+16>>2];if(!a){break j}H[f+20>>2]=a;oa(a)}ca=f+32|0;x=(w|0)!=0;if(x){k=ca-32|0;ca=k;a=H[h>>2];g=H[h+4>>2];H[k+24>>2]=0;H[k+16>>2]=0;H[k+20>>2]=0;if((a|0)==(g|0)){c=g}else{a=g-a|0;if((a|0)<0){break i}a=a>>2;b=(a-1>>>5|0)+1|0;c=pa(b<<2);H[k+24>>2]=b;H[k+20>>2]=0;H[k+16>>2]=c;Mc(k+16|0,a);g=H[h>>2];c=H[h+4>>2]}H[k+8>>2]=0;H[k>>2]=0;while(1){z:{o=0;i=0;if((c|0)==(g|0)){break z}while(1){b=H[k+16>>2];A:{if(H[b+(i>>>3&536870908)>>2]>>>i&1){break A}c=H[k>>2];H[k+4>>2]=c;e=H[h+12>>2];a=i;while(1){B:{f=a+1|0;d=a;a=(f>>>0)%3|0?f:a-2|0;if((a|0)==-1){break B}a=H[e+(a<<2)>>2];if((a|0)==-1){break B}f=a+1|0;a=(f>>>0)%3|0?f:a-2|0;if((i|0)==(a|0)|(a|0)==-1){break B}if(!(H[b+(a>>>3&536870908)>>2]>>>a&1)){continue}}break}j=d;C:{D:{E:{while(1){a=H[k+16>>2]+(j>>>3&536870908)|0;H[a>>2]=H[a>>2]|1<>>0)%3|0?a:j-2|0;g=H[h>>2];y=(j>>>0)%3|0;b=(y?-1:2)+j|0;n=H[k>>2];A=(n|0)==(c|0);F:{if(A){break F}w=H[(f<<2)+g>>2];q=H[h+12>>2];a=n;if((b|0)!=-1){e=q+(b<<2)|0;while(1){G:{if((w|0)!=H[a>>2]){break G}p=H[a+4>>2];t=H[e>>2];if((p|0)==(t|0)){break G}e=b;c=-1;a=-1;if((p|0)==-1){break C}break D}a=a+8|0;if((c|0)!=(a|0)){continue}break}break F}while(1){if((w|0)==H[a>>2]){t=-1;e=-1;p=H[a+4>>2];if((p|0)!=-1){break D}}a=a+8|0;if((c|0)!=(a|0)){continue}break}}b=H[(b<<2)+g>>2];H:{if(H[k+8>>2]!=(c|0)){H[c>>2]=b;H[c+4>>2]=f;c=c+8|0;H[k+4>>2]=c;break H}a=c-n|0;p=a>>3;e=p+1|0;if(e>>>0>=536870912){break i}g=a>>>2|0;g=a>>>0>=2147483640?536870911:e>>>0>>0?g:e;if(g){if(g>>>0>=536870912){break E}e=pa(g<<3)}else{e=0}a=e+(p<<3)|0;H[a>>2]=b;H[a+4>>2]=f;b=a+8|0;if(!A){while(1){c=c-8|0;f=H[c+4>>2];a=a-8|0;H[a>>2]=H[c>>2];H[a+4>>2]=f;if((c|0)!=(n|0)){continue}break}c=H[k>>2]}H[k+8>>2]=e+(g<<3);H[k+4>>2]=b;H[k>>2]=a;if(c){oa(c)}c=b}I:{J:{if(y){a=j-1|0;break J}a=j+2|0;if((a|0)==-1){break I}}a=H[H[h+12>>2]+(a<<2)>>2];if((a|0)==-1){break I}j=a+((a>>>0)%3|0?-1:2)|0;if((d|0)==(j|0)){break I}if((j|0)!=-1){continue}}break}g=H[h>>2];break A}wa();v()}c=H[q+(p<<2)>>2];b=e;a=p}if((t|0)!=-1){H[q+(t<<2)>>2]=-1}if((c|0)!=-1){H[q+(c<<2)>>2]=-1}H[q+(b<<2)>>2]=-1;H[q+(a<<2)>>2]=-1;o=1}i=i+1|0;c=H[h+4>>2];if(i>>>0>2>>>0){continue}break}if(o){continue}}break}a=H[k>>2];if(a){oa(a)}a=H[k+16>>2];if(a){oa(a)}ca=k+32|0;n=0;g=ca-32|0;ca=g;e=H[C+12>>2];H[h+36>>2]=e;p=h+24|0;b=H[h+24>>2];a=H[h+28>>2]-b>>2;K:{L:{if(a>>>0>>0){qb(p,e-a|0,13652);H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;break L}if(a>>>0>e>>>0){H[h+28>>2]=b+(e<<2)}H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;if(!e){break K}}if((e|0)<0){break i}a=(e-1>>>5|0)+1|0;b=pa(a<<2);H[g+24>>2]=a;H[g+20>>2]=0;H[g+16>>2]=b;Mc(g+16|0,e)}a=H[h>>2];b=H[h+4>>2];H[g+8>>2]=0;H[g>>2]=0;H[g+4>>2]=0;M:{if((a|0)==(b|0)){a=b}else{a=b-a|0;if((a|0)<0){break i}a=a>>2;b=(a-1>>>5|0)+1|0;c=pa(b<<2);H[g+8>>2]=b;H[g+4>>2]=0;H[g>>2]=c;Mc(g,a);b=H[h>>2];a=H[h+4>>2]}if(a-b>>>0<12){break M}N:{while(1){q=N(n,3);d=(q<<2)+b|0;f=H[d>>2];c=-1;i=q+1|0;if((i|0)!=-1){c=H[(i<<2)+b>>2]}O:{if((c|0)==(f|0)){break O}i=f;f=H[d+8>>2];if((i|0)==(f|0)|(c|0)==(f|0)){break O}k=0;i=H[g>>2];while(1){f=k+q|0;if(!(H[(f>>>3&536870908)+i>>2]>>>f&1)){a=H[(f<<2)+b>>2];c=1<>2];b=a>>>5|0;i=H[d+(b<<2)>>2];t=c&i;if(t){c=H[h+28>>2];P:{if((c|0)!=H[h+32>>2]){H[c>>2]=-1;H[h+28>>2]=c+4;break P}i=H[p>>2];b=c-i|0;o=b>>2;d=o+1|0;if(d>>>0>=1073741824){break i}j=b>>>1|0;j=b>>>0>=2147483644?1073741823:d>>>0>>0?j:d;if(j){if(j>>>0>=1073741824){break N}b=pa(j<<2)}else{b=0}d=b+(o<<2)|0;H[d>>2]=-1;o=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;H[d>>2]=H[c>>2];if((c|0)!=(i|0)){continue}break}}H[h+32>>2]=b+(j<<2);H[h+28>>2]=o;H[h+24>>2]=d;if(!i){break P}oa(i)}c=H[h+52>>2];Q:{if((c|0)!=H[h+56>>2]){H[c>>2]=a;H[h+52>>2]=c+4;break Q}i=H[h+48>>2];b=c-i|0;o=b>>2;d=o+1|0;if(d>>>0>=1073741824){break i}j=b>>>1|0;j=b>>>0>=2147483644?1073741823:d>>>0>>0?j:d;if(j){if(j>>>0>=1073741824){break N}b=pa(j<<2)}else{b=0}d=b+(o<<2)|0;H[d>>2]=a;a=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;H[d>>2]=H[c>>2];if((c|0)!=(i|0)){continue}break}}H[h+56>>2]=b+(j<<2);H[h+52>>2]=a;H[h+48>>2]=d;if(!i){break Q}oa(i)}c=H[g+20>>2];a=H[g+24>>2];if((c|0)==a<<5){if((c+1|0)<0){break i}b=g+16|0;if(c>>>0<=1073741822){a=a<<6;c=(c&-32)+32|0;a=a>>>0>c>>>0?a:c}else{a=2147483647}pb(b,a);c=H[g+20>>2]}H[g+20>>2]=c+1;d=H[g+16>>2];a=d+(c>>>3&536870908)|0;b=H[a>>2];M=a,O=Vj(c)&b,H[M>>2]=O;c=1<>>5|0;i=H[(b<<2)+d>>2];a=e;e=a+1|0}H[(b<<2)+d>>2]=c|i;o=H[h+24>>2]+(a<<2)|0;j=H[h+12>>2];b=H[h>>2];i=H[g>>2];c=f;R:{S:{T:{while(1){if((c|0)==-1){break T}d=(c>>>3&536870908)+i|0;H[d>>2]=H[d>>2]|1<>2]=c;if(t){H[(c<<2)+b>>2]=a}w=c+1|0;c=(w>>>0)%3|0?w:c-2|0;d=-1;U:{if((c|0)==-1){break U}c=H[j+(c<<2)>>2];d=-1;if((c|0)==-1){break U}d=c+1|0;d=(d>>>0)%3|0?d:c-2|0}c=d;if((f|0)!=(c|0)){continue}break}if((f|0)!=-1){break R}c=1;break S}if((f>>>0)%3|0){c=f-1|0;break S}c=f+2|0;if((c|0)==-1){break R}}c=H[j+(c<<2)>>2];if((c|0)==-1){break R}V:{if((c>>>0)%3|0){c=c-1|0;break V}c=c+2|0;if((c|0)==-1){break R}}f=H[h+12>>2];b=H[h>>2];while(1){d=(c>>>3&536870908)+i|0;H[d>>2]=H[d>>2]|1<>2]=a}W:{if((c>>>0)%3|0){c=c-1|0;break W}c=c+2|0;if((c|0)==-1){break R}}c=H[f+(c<<2)>>2];if((c|0)==-1){break R}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)!=-1){continue}break}}}k=k+1|0;if((k|0)!=3){continue}break}b=H[h>>2];a=H[h+4>>2]}n=n+1|0;if(n>>>0<(a-b>>2>>>0)/3>>>0){continue}break}break M}wa();v()}c=0;H[h+44>>2]=0;a=H[g+16>>2];b=H[g+20>>2];if(b){e=b&31;b=(b>>>3&536870908)+a|0;d=a;i=0;while(1){if(!(H[d>>2]>>>c&1)){i=i+1|0;H[h+44>>2]=i}f=(c|0)==31;c=f?0:c+1|0;d=(f<<2)+d|0;if((b|0)!=(d|0)|(c|0)!=(e|0)){continue}break}}b=H[g>>2];if(b){oa(b);a=H[g+16>>2]}if(a){oa(a)}ca=g+32|0}ca=C+16|0;if(!x){H[E+8>>2]=0;cb(h);h=0}ca=E+16|0;a=h;break h}sa();v()}b=H[s>>2];if(!b){break d}H[s+4>>2]=b;oa(b)}ca=s+16|0;break b}sa();v()}c=H[l+4>>2];b=a;H[l+4>>2]=a;if(c){cb(c);b=H[l+4>>2]}X:{if(!b){break X}a=H[u+100>>2];c=H[u+96>>2];F[r+12|0]=0;Oa(l+56|0,(a-c|0)/12|0,r+12|0);a=H[u+100>>2];c=H[u+96>>2];if((a|0)==(c|0)){break X}while(1){if(!(H[H[l+56>>2]+(D>>>3&536870908)>>2]>>>D&1)){a=N(D,3);Gc(l,0,a);c=H[l+8>>2];e=H[l+12>>2];Gc(l,1,a+1|0);f=H[l+20>>2];d=H[l+24>>2];Gc(l,2,a+2|0);n=(c|0)==(e|0)?-1:0;a=d-f>>2;c=e-c>>2;e=a>>>0>c>>>0;c=H[l+36>>2]-H[l+32>>2]>>2>>>0>(e?a:c)>>>0?2:e?1:n;Y:{if(H[l+68>>2]<=0){break Y}H[r+12>>2]=H[l+76>>2];H[r+8>>2]=m;bb(r+8|0,r+12|0);a=H[((c<<2)+l|0)+44>>2];if((a|0)<0){a=-1}else{e=(a>>>0)/3|0;a=H[(H[H[l>>2]+96>>2]+N(e,12)|0)+(a-N(e,3)<<2)>>2]}H[r+12>>2]=a;H[r+8>>2]=m;bb(r+8|0,r+12|0);e=H[l+72>>2];H[l+72>>2]=e+2;if(!(e&1)){break Y}H[r+12>>2]=a;H[r+8>>2]=m;bb(r+8|0,r+12|0);H[l+72>>2]=H[l+72>>2]+1}d=0;e=ca-16|0;ca=e;H[l+68>>2]=H[l+68>>2]+1;a=N(c,12)+l|0;a=H[a+12>>2]-H[a+8>>2]|0;if((a|0)>0){a=a>>>2|0;h=a>>>0<=1?1:a;c=H[((c<<2)+l|0)+44>>2];while(1){a=c;f=(a>>>0)/3|0;c=(a|0)==-1;g=c?-1:f;i=H[l+56>>2]+(g>>>3&536870908)|0;H[i>>2]=H[i>>2]|1<>2]=H[l+72>>2]+1;Z:{_:{$:{aa:{ba:{if(!d){ca:{if((a|0)>=0){H[e+12>>2]=H[(H[H[l>>2]+96>>2]+N(f,12)|0)+((a>>>0)%3<<2)>>2];H[e+8>>2]=m;bb(e+8|0,e+12|0);break ca}H[e+12>>2]=-1;H[e+8>>2]=m;bb(e+8|0,e+12|0);if(c){break ba}}c=-1;f=a+1|0;f=(f>>>0)%3|0?f:a-2|0;if((f|0)>=0){g=(f>>>0)/3|0;f=H[(H[H[l>>2]+96>>2]+N(g,12)|0)+(f-N(g,3)<<2)>>2]}else{f=-1}H[e+12>>2]=f;H[e+8>>2]=m;bb(e+8|0,e+12|0);f=((a>>>0)%3|0?-1:2)+a|0;if((f|0)<0){break aa}c=(f>>>0)/3|0;c=H[(H[H[l>>2]+96>>2]+N(c,12)|0)+(f-N(c,3)<<2)>>2];break aa}c=(a|0)<0?-1:H[(H[H[l>>2]+96>>2]+N(f,12)|0)+((a>>>0)%3<<2)>>2];H[l+76>>2]=c;H[e+12>>2]=c;H[e+8>>2]=m;bb(e+8|0,e+12|0);if(d&1){c=-1;if((a|0)==-1){break Z}if((N(f,3)|0)!=(a|0)){a=a-1|0;break _}a=a+2|0;break $}c=-1;if((a|0)==-1){break Z}c=a+1|0;a=(c>>>0)%3|0?c:a-2|0;break $}c=-1;H[e+12>>2]=-1;H[e+8>>2]=m;bb(e+8|0,e+12|0)}H[l+76>>2]=c;H[e+12>>2]=c;H[e+8>>2]=m;bb(e+8|0,e+12|0)}c=-1;if((a|0)==-1){break Z}}c=H[H[H[l+4>>2]+12>>2]+(a<<2)>>2]}d=d+1|0;if((h|0)!=(d|0)){continue}break}}ca=e+16|0;c=H[u+96>>2];a=H[u+100>>2]}D=D+1|0;if(D>>>0<(a-c|0)/12>>>0){continue}break}}ca=r+16|0;da:{if(b){a=H[B>>2];if(a){H[B+4>>2]=a;oa(a)}H[B>>2]=H[m>>2];H[B+4>>2]=H[m+4>>2];H[B+8>>2]=H[m+8>>2];L=H[m+84>>2];break da}a=H[m>>2];if(!a){break da}H[m+4>>2]=a;oa(a)}a=H[m+72>>2];if(a){oa(a)}a=H[m+48>>2];if(a){H[m+52>>2]=a;oa(a)}a=H[m+36>>2];if(a){H[m+40>>2]=a;oa(a)}a=H[m+24>>2];if(a){H[m+28>>2]=a;oa(a)}a=H[m+20>>2];H[m+20>>2]=0;if(a){cb(a)}ca=m+96|0;return L|0}function qg(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=b;a=0;b=0;a:{b:{switch(d-1|0){case 0:j=H[i+80>>2];h=I[c+24|0];c:{if((N(j,h)|0)!=(e|0)){break c}d=H[c+28>>2]!=1;b=I[c+84|0];if(!(d|!b)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);b=1;break c}if(h){a=pa(h);ra(a,0,h)}d:{if(!j){b=1;break d}if(!d){if(h){d=0;e=0;while(1){i=d+f|0;k=H[H[c>>2]>>2];m=H[c+48>>2];g=H[c+40>>2];b=Rj(g,H[c+44>>2],I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],0);n=b;b=b+m|0;qa(i,qa(a,b+k|0,g),h);d=d+h|0;b=1;e=e+1|0;if((j|0)!=(e|0)){continue}break}break d}if(b){b=1;h=H[c>>2];e=H[c+48>>2];f=H[c+40>>2];i=H[c+44>>2];if((j|0)!=1){g=j&-2;c=0;d=0;while(1){k=H[h>>2];m=Rj(f,i,c,0)+e|0;k=qa(a,k+m|0,f);m=H[h>>2];n=Rj(f,i,c|1,0)+e|0;qa(k,m+n|0,f);c=c+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}g=c}if(!(j&1)){break d}c=H[h>>2];d=Rj(g,0,f,i)+e|0;qa(a,c+d|0,f);break d}b=1;h=H[c>>2];e=H[c+48>>2];g=H[c+68>>2];f=H[c+40>>2];i=H[c+44>>2];c=0;if((j|0)!=1){k=j&-2;d=0;while(1){m=H[h>>2];n=c<<2;l=Rj(f,i,H[n+g>>2],0)+e|0;m=qa(a,m+l|0,f);l=H[h>>2];n=Rj(f,i,H[g+(n|4)>>2],0)+e|0;qa(m,l+n|0,f);c=c+2|0;d=d+2|0;if((k|0)!=(d|0)){continue}break}}if(!(j&1)){break d}d=H[h>>2];c=Rj(f,i,H[g+(c<<2)>>2],0)+e|0;qa(a,c+d|0,f);break d}b=0;if(!h){d=0;while(1){if(!ic(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],a)){break d}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break d}d=0;e=0;while(1){if(!ic(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break d}qa(d+f|0,a,h);d=d+h|0;e=e+1|0;b=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}}if(!a){break c}oa(a)}break a;case 2:n=I[c+24|0];l=n<<1;j=H[i+80>>2];e:{if((N(l,j)|0)!=(e|0)){break e}i=H[c+28>>2]!=3;d=I[c+84|0];if(!(i|!d)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);a=1;break e}f:{if(!n){e=0;break f}e=pa(l);ra(e,0,l)}g:{if(!j){a=1;break g}if(!i){o=H[c+68>>2];k=H[c>>2];b=H[c+48>>2];i=H[c+40>>2];m=H[c+44>>2];if(n){if(!d){c=0;d=0;while(1){a=1;g=H[k>>2];p=Rj(i,m,H[o+(d<<2)>>2],0)+b|0;qa((c<<1)+f|0,qa(e,g+p|0,i),l);c=c+n|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break g}c=0;while(1){a=1;o=H[k>>2];p=Rj(g,h,i,m)+b|0;qa((c<<1)+f|0,qa(e,o+p|0,i),l);c=c+n|0;d=h;g=g+1|0;d=g?d:d+1|0;h=d;if((j|0)!=(g|0)|d){continue}break}break g}if(!d){a=1;c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=H[k>>2];g=c<<2;n=Rj(i,m,H[g+o>>2],0)+b|0;h=qa(e,h+n|0,i);n=H[k>>2];g=Rj(i,m,H[o+(g|4)>>2],0)+b|0;qa(h,g+n|0,i);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break g}d=H[k>>2];b=Rj(i,m,H[o+(c<<2)>>2],0)+b|0;qa(e,b+d|0,i);break g}n=j&1;a=1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){d=H[k>>2];l=Rj(g,h,i,m)+b|0;d=qa(e,d+l|0,i);l=H[k>>2];o=Rj(i,m,g|1,h)+b|0;qa(d,l+o|0,i);g=g+2|0;h=g>>>0<2?h+1|0:h;f=f+2|0;d=f>>>0<2?c+1|0:c;c=d;if((f|0)!=(j|0)|c){continue}break}}if(!n){break g}c=H[k>>2];b=Rj(g,h,i,m)+b|0;qa(e,b+c|0,i);break g}if(!n){d=0;while(1){if(!gc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break g}d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break g}d=0;while(1){if(!gc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break g}qa((b<<1)+f|0,e,l);b=b+n|0;d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break e}oa(e)}b=a;break a;case 4:l=I[c+24|0];o=l<<2;j=H[i+80>>2];h:{if((N(o,j)|0)!=(e|0)){break h}i=H[c+28>>2]!=5;d=I[c+84|0];if(!(i|!d)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);b=1;break h}i:{if(!l){e=0;break i}e=pa(o);ra(e,0,o)}b=1;j:{if(!j){break j}if(!i){a=H[c+68>>2];m=H[c>>2];i=H[c+48>>2];k=H[c+40>>2];n=H[c+44>>2];if(l){if(!d){c=0;d=0;while(1){g=H[m>>2];p=Rj(k,n,H[a+(d<<2)>>2],0)+i|0;qa((c<<2)+f|0,qa(e,g+p|0,k),o);c=c+l|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break j}c=0;while(1){d=H[m>>2];p=Rj(g,h,k,n)+i|0;qa((c<<2)+f|0,qa(e,d+p|0,k),o);c=c+l|0;g=g+1|0;a=g?h:h+1|0;h=a;if((j|0)!=(g|0)|h){continue}break}break j}if(!d){c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=H[m>>2];g=c<<2;l=Rj(k,n,H[g+a>>2],0)+i|0;h=qa(e,h+l|0,k);l=H[m>>2];g=Rj(k,n,H[a+(g|4)>>2],0)+i|0;qa(h,g+l|0,k);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break j}d=H[m>>2];a=Rj(k,n,H[a+(c<<2)>>2],0)+i|0;qa(e,a+d|0,k);break j}l=j&1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){a=H[m>>2];d=Rj(g,h,k,n)+i|0;a=qa(e,a+d|0,k);d=H[m>>2];o=Rj(k,n,g|1,h)+i|0;qa(a,d+o|0,k);d=h;g=g+2|0;h=g>>>0<2?d+1|0:d;f=f+2|0;a=f>>>0<2?c+1|0:c;c=a;if((f|0)!=(j|0)|c){continue}break}}if(!l){break j}a=H[m>>2];c=Rj(g,h,k,n)+i|0;qa(e,a+c|0,k);break j}b=0;if(!l){d=0;while(1){if(!ec(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break j}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break j}d=0;while(1){if(!ec(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break j}qa((a<<2)+f|0,e,o);a=a+l|0;d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break h}oa(e)}break a;case 1:j=H[i+80>>2];h=I[c+24|0];k:{if((N(j,h)|0)!=(e|0)){break k}d=H[c+28>>2]!=2;b=I[c+84|0];if(!(d|!b)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);b=1;break k}if(h){a=pa(h);ra(a,0,h)}l:{if(!j){b=1;break l}if(!d){if(h){d=0;e=0;while(1){i=d+f|0;k=H[H[c>>2]>>2];m=H[c+48>>2];g=H[c+40>>2];b=Rj(g,H[c+44>>2],I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],0);n=b;b=b+m|0;qa(i,qa(a,b+k|0,g),h);d=d+h|0;b=1;e=e+1|0;if((j|0)!=(e|0)){continue}break}break l}if(b){b=1;h=H[c>>2];e=H[c+48>>2];f=H[c+40>>2];i=H[c+44>>2];if((j|0)!=1){g=j&-2;c=0;d=0;while(1){k=H[h>>2];m=Rj(f,i,c,0)+e|0;k=qa(a,k+m|0,f);m=H[h>>2];n=Rj(f,i,c|1,0)+e|0;qa(k,m+n|0,f);c=c+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}g=c}if(!(j&1)){break l}c=H[h>>2];d=Rj(g,0,f,i)+e|0;qa(a,c+d|0,f);break l}b=1;h=H[c>>2];e=H[c+48>>2];g=H[c+68>>2];f=H[c+40>>2];i=H[c+44>>2];c=0;if((j|0)!=1){k=j&-2;d=0;while(1){m=H[h>>2];n=c<<2;l=Rj(f,i,H[n+g>>2],0)+e|0;m=qa(a,m+l|0,f);l=H[h>>2];n=Rj(f,i,H[g+(n|4)>>2],0)+e|0;qa(m,l+n|0,f);c=c+2|0;d=d+2|0;if((k|0)!=(d|0)){continue}break}}if(!(j&1)){break l}d=H[h>>2];c=Rj(f,i,H[g+(c<<2)>>2],0)+e|0;qa(a,c+d|0,f);break l}b=0;if(!h){d=0;while(1){if(!hc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],a)){break l}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break l}d=0;e=0;while(1){if(!hc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break l}qa(d+f|0,a,h);d=d+h|0;e=e+1|0;b=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}}if(!a){break k}oa(a)}break a;case 3:n=I[c+24|0];l=n<<1;j=H[i+80>>2];m:{if((N(l,j)|0)!=(e|0)){break m}i=H[c+28>>2]!=4;d=I[c+84|0];if(!(i|!d)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);a=1;break m}n:{if(!n){e=0;break n}e=pa(l);ra(e,0,l)}o:{if(!j){a=1;break o}if(!i){o=H[c+68>>2];k=H[c>>2];b=H[c+48>>2];i=H[c+40>>2];m=H[c+44>>2];if(n){if(!d){c=0;d=0;while(1){a=1;g=H[k>>2];p=Rj(i,m,H[o+(d<<2)>>2],0)+b|0;qa((c<<1)+f|0,qa(e,g+p|0,i),l);c=c+n|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break o}c=0;while(1){a=1;o=H[k>>2];p=Rj(g,h,i,m)+b|0;qa((c<<1)+f|0,qa(e,o+p|0,i),l);c=c+n|0;d=h;g=g+1|0;d=g?d:d+1|0;h=d;if((j|0)!=(g|0)|d){continue}break}break o}if(!d){a=1;c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=H[k>>2];g=c<<2;n=Rj(i,m,H[g+o>>2],0)+b|0;h=qa(e,h+n|0,i);n=H[k>>2];g=Rj(i,m,H[o+(g|4)>>2],0)+b|0;qa(h,g+n|0,i);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break o}d=H[k>>2];b=Rj(i,m,H[o+(c<<2)>>2],0)+b|0;qa(e,b+d|0,i);break o}n=j&1;a=1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){d=H[k>>2];l=Rj(g,h,i,m)+b|0;d=qa(e,d+l|0,i);l=H[k>>2];o=Rj(i,m,g|1,h)+b|0;qa(d,l+o|0,i);g=g+2|0;h=g>>>0<2?h+1|0:h;f=f+2|0;d=f>>>0<2?c+1|0:c;c=d;if((f|0)!=(j|0)|c){continue}break}}if(!n){break o}c=H[k>>2];b=Rj(g,h,i,m)+b|0;qa(e,b+c|0,i);break o}if(!n){d=0;while(1){if(!fc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break o}d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break o}d=0;while(1){if(!fc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break o}qa((b<<1)+f|0,e,l);b=b+n|0;d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break m}oa(e)}b=a;break a;case 5:l=I[c+24|0];o=l<<2;j=H[i+80>>2];p:{if((N(o,j)|0)!=(e|0)){break p}i=H[c+28>>2]!=6;d=I[c+84|0];if(!(i|!d)){qa(f,H[H[c>>2]>>2]+H[c+48>>2]|0,e);b=1;break p}q:{if(!l){e=0;break q}e=pa(o);ra(e,0,o)}b=1;r:{if(!j){break r}if(!i){a=H[c+68>>2];m=H[c>>2];i=H[c+48>>2];k=H[c+40>>2];n=H[c+44>>2];if(l){if(!d){c=0;d=0;while(1){g=H[m>>2];p=Rj(k,n,H[a+(d<<2)>>2],0)+i|0;qa((c<<2)+f|0,qa(e,g+p|0,k),o);c=c+l|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break r}c=0;while(1){d=H[m>>2];p=Rj(g,h,k,n)+i|0;qa((c<<2)+f|0,qa(e,d+p|0,k),o);c=c+l|0;g=g+1|0;a=g?h:h+1|0;h=a;if((j|0)!=(g|0)|h){continue}break}break r}if(!d){c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=H[m>>2];g=c<<2;l=Rj(k,n,H[g+a>>2],0)+i|0;h=qa(e,h+l|0,k);l=H[m>>2];g=Rj(k,n,H[a+(g|4)>>2],0)+i|0;qa(h,g+l|0,k);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break r}d=H[m>>2];a=Rj(k,n,H[a+(c<<2)>>2],0)+i|0;qa(e,a+d|0,k);break r}l=j&1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){a=H[m>>2];d=Rj(g,h,k,n)+i|0;a=qa(e,a+d|0,k);d=H[m>>2];o=Rj(k,n,g|1,h)+i|0;qa(a,d+o|0,k);d=h;g=g+2|0;h=g>>>0<2?d+1|0:d;f=f+2|0;a=f>>>0<2?c+1|0:c;c=a;if((f|0)!=(j|0)|c){continue}break}}if(!l){break r}a=H[m>>2];c=Rj(g,h,k,n)+i|0;qa(e,a+c|0,k);break r}b=0;if(!l){d=0;while(1){if(!dc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break r}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break r}d=0;while(1){if(!dc(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],e)){break r}qa((a<<2)+f|0,e,o);a=a+l|0;d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break p}oa(e)}break a;case 8:p=I[c+24|0];q=p<<2;k=H[i+80>>2];s:{if((N(q,k)|0)!=(e|0)){break s}i=H[c+28>>2];t:{if(!p){break t}a=pa(q);d=a;m=q-4|0;l=(m>>>2|0)+1&7;if(l){e=0;while(1){H[d>>2]=-1073741824;d=d+4|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}if(m>>>0<28){break t}e=(p<<2)+a|0;while(1){H[d+24>>2]=-1073741824;H[d+28>>2]=-1073741824;H[d+16>>2]=-1073741824;H[d+20>>2]=-1073741824;H[d+8>>2]=-1073741824;H[d+12>>2]=-1073741824;H[d>>2]=-1073741824;H[d+4>>2]=-1073741824;d=d+32|0;if((e|0)!=(d|0)){continue}break}}u:{if(!k){b=1;break u}if((i|0)==9){r=H[c+68>>2];l=H[c>>2];i=H[c+48>>2];s=I[c+84|0];m=H[c+44>>2];c=H[c+40>>2];o=c;if(p){e=0;d=0;while(1){h=(e<<2)+f|0;g=H[l>>2];b=Rj(c,m,s?d:H[r+(d<<2)>>2],0)+i|0;qa(h,qa(a,b+g|0,o),q);e=e+p|0;b=1;d=d+1|0;if((k|0)!=(d|0)){continue}break}break u}if(!s){b=1;d=0;if((k|0)!=1){f=k&-2;e=0;while(1){h=H[l>>2];g=d<<2;j=Rj(c,m,H[g+r>>2],0)+i|0;h=qa(a,h+j|0,o);j=H[l>>2];g=Rj(c,m,H[r+(g|4)>>2],0)+i|0;qa(h,j+g|0,o);d=d+2|0;e=e+2|0;if((f|0)!=(e|0)){continue}break}}if(!(k&1)){break u}e=H[l>>2];c=Rj(c,m,H[r+(d<<2)>>2],0)+i|0;qa(a,c+e|0,o);break u}f=k&1;b=1;if((k|0)!=1){k=k&-2;while(1){d=H[l>>2];e=Rj(g,h,c,m)+i|0;d=qa(a,d+e|0,o);e=H[l>>2];p=Rj(c,m,g|1,h)+i|0;qa(d,e+p|0,o);g=g+2|0;h=g>>>0<2?h+1|0:h;d=j;e=n+2|0;d=e>>>0<2?d+1|0:d;n=e;j=d;if((e|0)!=(k|0)|d){continue}break}}if(!f){break u}d=H[l>>2];c=Rj(g,h,c,m)+i|0;qa(a,c+d|0,o);break u}if(!p){d=0;while(1){if(!Va(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],a)){break u}d=d+1|0;b=k>>>0<=d>>>0;if((d|0)!=(k|0)){continue}break}break u}e=0;d=0;while(1){if(!Va(c,I[c+84|0]?d:H[H[c+68>>2]+(d<<2)>>2],F[c+24|0],a)){break u}qa((e<<2)+f|0,a,q);e=e+p|0;d=d+1|0;b=k>>>0<=d>>>0;if((d|0)!=(k|0)){continue}break}}if(!a){break s}oa(a)}a=b;break;default:break b}}b=a}return b|0}function ef(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=ca-48|0;ca=i;a:{b:{if((c|0)!=1){break b}c=H[a+4>>2];g=H[a+12>>2];H[i+40>>2]=0;a=i;H[a+32>>2]=0;H[a+36>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;e=a+8|0;c:{if((b|0)==-2){break c}l=H[H[H[c+4>>2]+8>>2]+(g<<2)>>2];if((ea[H[H[c>>2]+8>>2]](c)|0)==1){a=J[c+36>>1];j=(a<<8|a>>>8)&65535;a=0;h=ca-32|0;ca=h;d=H[H[H[c+4>>2]+8>>2]+(g<<2)>>2];d:{if((ea[H[H[c>>2]+8>>2]](c)|0)!=1|b-1>>>0>5){break d}k=ea[H[H[c>>2]+36>>2]](c)|0;f=ea[H[H[c>>2]+44>>2]](c,g)|0;if(!k|!f){break d}a=ea[H[H[c>>2]+40>>2]](c,g)|0;if(a){c=H[c+44>>2];H[h+12>>2]=a;H[h+8>>2]=c;H[h+20>>2]=f;H[h+16>>2]=f+12;c=h+8|0;a=0;e:{f:{switch(b-1|0){case 0:a=pa(60);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a>>2]=2564;break e;case 1:a=pa(60);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a>>2]=3328;break e;case 3:a=pa(112);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=3564;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=0;H[a+92>>2]=0;H[a+96>>2]=0;H[a+100>>2]=0;H[a+104>>2]=0;H[a+108>>2]=0;break e;case 2:a=pa(92);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=3812;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=j;break e;case 4:a=pa(104);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+84>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=4040;b=H[c+4>>2];H[a+88>>2]=H[c>>2];H[a+92>>2]=b;b=H[c+12>>2];H[a+96>>2]=H[c+8>>2];H[a+100>>2]=b;break e;case 5:break f;default:break e}}a=pa(128);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;g:{b=H[e+28>>2];d=H[e+24>>2];if((b|0)!=(d|0)){d=b-d|0;if((d|0)<0){break a}b=pa(d);H[a+36>>2]=b;H[a+32>>2]=b;H[a+40>>2]=(d&-4)+b;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}}H[a+36>>2]=b}H[a>>2]=3216;b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;b=a- -64|0;H[b>>2]=0;H[b+4>>2]=0;H[a+60>>2]=4904;H[a>>2]=4276;b=H[c+4>>2];H[a+72>>2]=H[c>>2];H[a+76>>2]=b;b=H[c+12>>2];H[a+80>>2]=H[c+8>>2];H[a+84>>2]=b;H[a+104>>2]=1065353216;H[a+108>>2]=-1;H[a+96>>2]=-1;H[a+100>>2]=-1;H[a+88>>2]=1;H[a+92>>2]=-1;H[a+60>>2]=4512;H[a+112>>2]=0;H[a+116>>2]=0;F[a+117|0]=0;F[a+118|0]=0;F[a+119|0]=0;F[a+120|0]=0;F[a+121|0]=0;F[a+122|0]=0;F[a+123|0]=0;F[a+124|0]=0;break g}}break d}a=H[c+44>>2];H[h+12>>2]=k;H[h+8>>2]=a;H[h+20>>2]=f;H[h+16>>2]=f+12;c=h+8|0;a=0;h:{i:{switch(b-1|0){case 0:a=pa(60);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a>>2]=4932;break h;case 1:a=pa(60);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a>>2]=5356;break h;case 3:a=pa(112);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=5580;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=0;H[a+92>>2]=0;H[a+96>>2]=0;H[a+100>>2]=0;H[a+104>>2]=0;H[a+108>>2]=0;break h;case 2:a=pa(92);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=5816;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=j;break h;case 4:a=pa(104);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){g=f-d|0;if((g|0)<0){break a}b=pa(g);H[a+32>>2]=b;H[a+40>>2]=(g&-4)+b;while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}H[a+36>>2]=b}b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;H[a+84>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+60>>2]=0;H[a+64>>2]=0;H[a>>2]=6032;b=H[c+4>>2];H[a+88>>2]=H[c>>2];H[a+92>>2]=b;b=H[c+12>>2];H[a+96>>2]=H[c+8>>2];H[a+100>>2]=b;break h;case 5:break i;default:break h}}a=pa(128);H[a+4>>2]=d;H[a>>2]=3272;b=H[e+4>>2];H[a+8>>2]=H[e>>2];H[a+12>>2]=b;b=H[e+12>>2];H[a+16>>2]=H[e+8>>2];H[a+20>>2]=b;b=H[e+20>>2];H[a+24>>2]=H[e+16>>2];H[a+28>>2]=b;H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;j:{b=H[e+28>>2];d=H[e+24>>2];if((b|0)!=(d|0)){d=b-d|0;if((d|0)<0){break a}b=pa(d);H[a+36>>2]=b;H[a+32>>2]=b;H[a+40>>2]=(d&-4)+b;d=H[e+24>>2];f=H[e+28>>2];if((d|0)!=(f|0)){while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}}H[a+36>>2]=b}H[a>>2]=5300;b=H[c+4>>2];H[a+44>>2]=H[c>>2];H[a+48>>2]=b;b=H[c+12>>2];H[a+52>>2]=H[c+8>>2];H[a+56>>2]=b;b=a- -64|0;H[b>>2]=0;H[b+4>>2]=0;H[a+60>>2]=6840;H[a>>2]=6256;b=H[c+4>>2];H[a+72>>2]=H[c>>2];H[a+76>>2]=b;b=H[c+12>>2];H[a+80>>2]=H[c+8>>2];H[a+84>>2]=b;H[a+104>>2]=1065353216;H[a+108>>2]=-1;H[a+96>>2]=-1;H[a+100>>2]=-1;H[a+88>>2]=1;H[a+92>>2]=-1;H[a+60>>2]=6476;H[a+112>>2]=0;H[a+116>>2]=0;F[a+117|0]=0;F[a+118|0]=0;F[a+119|0]=0;F[a+120|0]=0;F[a+121|0]=0;F[a+122|0]=0;F[a+123|0]=0;F[a+124|0]=0;break j}}}ca=h+32|0;d=a;if(a){break c}}d=pa(44);H[d+4>>2]=l;H[d>>2]=3272;a=H[e+4>>2];H[d+8>>2]=H[e>>2];H[d+12>>2]=a;a=H[e+12>>2];H[d+16>>2]=H[e+8>>2];H[d+20>>2]=a;a=H[e+20>>2];H[d+24>>2]=H[e+16>>2];H[d+28>>2]=a;H[d+40>>2]=0;H[d+32>>2]=0;H[d+36>>2]=0;c=H[e+24>>2];a=H[e+28>>2];if((c|0)!=(a|0)){b=a-c|0;if((b|0)<0){break a}e=pa(b);H[d+32>>2]=e;H[d+40>>2]=(b&-4)+e;while(1){H[e>>2]=H[c>>2];e=e+4|0;c=c+4|0;if((a|0)!=(c|0)){continue}break}H[d+36>>2]=e}H[d>>2]=6868;break c}e=d;a=H[i+32>>2];if(!a){break b}H[i+36>>2]=a;oa(a)}ca=i+48|0;return e|0}sa();v()}function Ec(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=ca-16|0;ca=l;a:{b:{c:{d:{e:{f:{g:{h:{i:{if(a>>>0<=244){g=H[4298];h=a>>>0<11?16:a+11&-8;c=h>>>3|0;b=g>>>c|0;if(b&3){c=c+((b^-1)&1)|0;a=c<<3;b=a+17232|0;d=H[a+17240>>2];a=H[d+8>>2];j:{if((b|0)==(a|0)){m=17192,n=Vj(c)&g,H[m>>2]=n;break j}H[a+12>>2]=b;H[b+8>>2]=a}a=d+8|0;b=c<<3;H[d+4>>2]=b|3;b=b+d|0;H[b+4>>2]=H[b+4>>2]|1;break a}k=H[4300];if(k>>>0>=h>>>0){break i}if(b){a=2<>2];a=H[e+8>>2];k:{if((b|0)==(a|0)){g=Vj(d)&g;H[4298]=g;break k}H[a+12>>2]=b;H[b+8>>2]=a}H[e+4>>2]=h|3;c=e+h|0;a=d<<3;d=a-h|0;H[c+4>>2]=d|1;H[a+e>>2]=d;if(k){b=(k&-8)+17232|0;f=H[4303];a=1<<(k>>>3);l:{if(!(a&g)){H[4298]=a|g;a=b;break l}a=H[b+8>>2]}H[b+8>>2]=f;H[a+12>>2]=f;H[f+12>>2]=b;H[f+8>>2]=a}a=e+8|0;H[4303]=c;H[4300]=d;break a}j=H[4299];if(!j){break i}c=H[(Qj(0-j&j)<<2)+17496>>2];f=(H[c+4>>2]&-8)-h|0;b=c;while(1){m:{a=H[b+16>>2];if(!a){a=H[b+20>>2];if(!a){break m}}b=(H[a+4>>2]&-8)-h|0;d=b>>>0>>0;f=d?b:f;c=d?a:c;b=a;continue}break}i=H[c+24>>2];d=H[c+12>>2];if((d|0)!=(c|0)){a=H[c+8>>2];H[a+12>>2]=d;H[d+8>>2]=a;break b}b=c+20|0;a=H[b>>2];if(!a){a=H[c+16>>2];if(!a){break h}b=c+16|0}while(1){e=b;d=a;b=a+20|0;a=H[b>>2];if(a){continue}b=d+16|0;a=H[d+16>>2];if(a){continue}break}H[e>>2]=0;break b}h=-1;if(a>>>0>4294967231){break i}a=a+11|0;h=a&-8;j=H[4299];if(!j){break i}f=0-h|0;g=0;n:{if(h>>>0<256){break n}g=31;if(h>>>0>16777215){break n}a=Q(a>>>8|0);g=((h>>>38-a&1)-(a<<1)|0)+62|0}b=H[(g<<2)+17496>>2];o:{p:{q:{if(!b){a=0;break q}a=0;c=h<<((g|0)!=31?25-(g>>>1|0)|0:0);while(1){r:{e=(H[b+4>>2]&-8)-h|0;if(e>>>0>=f>>>0){break r}d=b;f=e;if(e){break r}f=0;a=b;break p}e=H[b+20>>2];b=H[((c>>>29&4)+b|0)+16>>2];a=e?(e|0)==(b|0)?a:e:a;c=c<<1;if(b){continue}break}}if(!(a|d)){d=0;a=2<>2]}if(!a){break o}}while(1){b=(H[a+4>>2]&-8)-h|0;c=b>>>0>>0;f=c?b:f;d=c?a:d;b=H[a+16>>2];if(b){a=b}else{a=H[a+20>>2]}if(a){continue}break}}if(!d|H[4300]-h>>>0<=f>>>0){break i}g=H[d+24>>2];c=H[d+12>>2];if((d|0)!=(c|0)){a=H[d+8>>2];H[a+12>>2]=c;H[c+8>>2]=a;break c}b=d+20|0;a=H[b>>2];if(!a){a=H[d+16>>2];if(!a){break g}b=d+16|0}while(1){e=b;c=a;b=a+20|0;a=H[b>>2];if(a){continue}b=c+16|0;a=H[c+16>>2];if(a){continue}break}H[e>>2]=0;break c}a=H[4300];if(a>>>0>=h>>>0){d=H[4303];b=a-h|0;s:{if(b>>>0>=16){c=d+h|0;H[c+4>>2]=b|1;H[a+d>>2]=b;H[d+4>>2]=h|3;break s}H[d+4>>2]=a|3;a=a+d|0;H[a+4>>2]=H[a+4>>2]|1;c=0;b=0}H[4300]=b;H[4303]=c;a=d+8|0;break a}i=H[4301];if(i>>>0>h>>>0){b=i-h|0;H[4301]=b;c=H[4304];a=c+h|0;H[4304]=a;H[a+4>>2]=b|1;H[c+4>>2]=h|3;a=c+8|0;break a}a=0;j=h+47|0;if(H[4416]){c=H[4418]}else{H[4419]=-1;H[4420]=-1;H[4417]=4096;H[4418]=4096;H[4416]=l+12&-16^1431655768;H[4421]=0;H[4409]=0;c=4096}e=j+c|0;f=0-c|0;b=e&f;if(b>>>0<=h>>>0){break a}d=H[4408];if(d){c=H[4406];g=c+b|0;if(d>>>0>>0|c>>>0>=g>>>0){break a}}t:{if(!(I[17636]&4)){u:{v:{w:{x:{d=H[4304];if(d){a=17640;while(1){c=H[a>>2];if(c>>>0<=d>>>0&d>>>0>2]>>>0){break x}a=H[a+8>>2];if(a){continue}break}}c=zb(0);if((c|0)==-1){break u}g=b;d=H[4417];a=d-1|0;if(a&c){g=(b-c|0)+(a+c&0-d)|0}if(g>>>0<=h>>>0){break u}d=H[4408];if(d){a=H[4406];f=a+g|0;if(d>>>0>>0|a>>>0>=f>>>0){break u}}a=zb(g);if((c|0)!=(a|0)){break w}break t}g=f&e-i;c=zb(g);if((c|0)==(H[a>>2]+H[a+4>>2]|0)){break v}a=c}if((a|0)==-1){break u}if(h+48>>>0<=g>>>0){c=a;break t}c=H[4418];c=c+(j-g|0)&0-c;if((zb(c)|0)==-1){break u}g=c+g|0;c=a;break t}if((c|0)!=-1){break t}}H[4409]=H[4409]|4}c=zb(b);a=zb(0);if((c|0)==-1|(a|0)==-1|a>>>0<=c>>>0){break d}g=a-c|0;if(g>>>0<=h+40>>>0){break d}}a=H[4406]+g|0;H[4406]=a;if(a>>>0>K[4407]){H[4407]=a}y:{e=H[4304];if(e){a=17640;while(1){d=H[a>>2];b=H[a+4>>2];if((d+b|0)==(c|0)){break y}a=H[a+8>>2];if(a){continue}break}break f}a=H[4302];if(!(a>>>0<=c>>>0?a:0)){H[4302]=c}a=0;H[4411]=g;H[4410]=c;H[4306]=-1;H[4307]=H[4416];H[4413]=0;while(1){d=a<<3;b=d+17232|0;H[d+17240>>2]=b;H[d+17244>>2]=b;a=a+1|0;if((a|0)!=32){continue}break}d=g-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;H[4301]=b;a=a+c|0;H[4304]=a;H[a+4>>2]=b|1;H[(c+d|0)+4>>2]=40;H[4305]=H[4420];break e}if(I[a+12|0]&8|d>>>0>e>>>0|c>>>0<=e>>>0){break f}H[a+4>>2]=b+g;a=e+8&7?-8-e&7:0;c=a+e|0;H[4304]=c;b=H[4301]+g|0;a=b-a|0;H[4301]=a;H[c+4>>2]=a|1;H[(b+e|0)+4>>2]=40;H[4305]=H[4420];break e}d=0;break b}c=0;break c}if(K[4302]>c>>>0){H[4302]=c}b=c+g|0;a=17640;z:{A:{B:{C:{D:{E:{while(1){if((b|0)!=H[a>>2]){a=H[a+8>>2];if(a){continue}break E}break}if(!(I[a+12|0]&8)){break D}}a=17640;while(1){b=H[a>>2];if(b>>>0<=e>>>0){f=b+H[a+4>>2]|0;if(f>>>0>e>>>0){break C}}a=H[a+8>>2];continue}}H[a>>2]=c;H[a+4>>2]=H[a+4>>2]+g;j=(c+8&7?-8-c&7:0)+c|0;H[j+4>>2]=h|3;g=b+(b+8&7?-8-b&7:0)|0;i=h+j|0;a=g-i|0;if((e|0)==(g|0)){H[4304]=i;a=H[4301]+a|0;H[4301]=a;H[i+4>>2]=a|1;break A}if(H[4303]==(g|0)){H[4303]=i;a=H[4300]+a|0;H[4300]=a;H[i+4>>2]=a|1;H[a+i>>2]=a;break A}f=H[g+4>>2];if((f&3)==1){e=f&-8;F:{if(f>>>0<=255){d=H[g+8>>2];b=f>>>3|0;c=H[g+12>>2];if((c|0)==(d|0)){m=17192,n=H[4298]&Vj(b),H[m>>2]=n;break F}H[d+12>>2]=c;H[c+8>>2]=d;break F}h=H[g+24>>2];c=H[g+12>>2];G:{if((g|0)!=(c|0)){b=H[g+8>>2];H[b+12>>2]=c;H[c+8>>2]=b;break G}H:{f=g+20|0;b=H[f>>2];if(b){break H}f=g+16|0;b=H[f>>2];if(b){break H}c=0;break G}while(1){d=f;c=b;f=c+20|0;b=H[f>>2];if(b){continue}f=c+16|0;b=H[c+16>>2];if(b){continue}break}H[d>>2]=0}if(!h){break F}d=H[g+28>>2];b=(d<<2)+17496|0;I:{if(H[b>>2]==(g|0)){H[b>>2]=c;if(c){break I}m=17196,n=H[4299]&Vj(d),H[m>>2]=n;break F}H[h+(H[h+16>>2]==(g|0)?16:20)>>2]=c;if(!c){break F}}H[c+24>>2]=h;b=H[g+16>>2];if(b){H[c+16>>2]=b;H[b+24>>2]=c}b=H[g+20>>2];if(!b){break F}H[c+20>>2]=b;H[b+24>>2]=c}g=e+g|0;f=H[g+4>>2];a=a+e|0}H[g+4>>2]=f&-2;H[i+4>>2]=a|1;H[a+i>>2]=a;if(a>>>0<=255){b=(a&-8)+17232|0;c=H[4298];a=1<<(a>>>3);J:{if(!(c&a)){H[4298]=a|c;a=b;break J}a=H[b+8>>2]}H[b+8>>2]=i;H[a+12>>2]=i;H[i+12>>2]=b;H[i+8>>2]=a;break A}f=31;if(a>>>0<=16777215){b=Q(a>>>8|0);f=((a>>>38-b&1)-(b<<1)|0)+62|0}H[i+28>>2]=f;H[i+16>>2]=0;H[i+20>>2]=0;b=(f<<2)+17496|0;d=H[4299];c=1<>2]=i;break K}f=a<<((f|0)!=31?25-(f>>>1|0)|0:0);c=H[b>>2];while(1){b=c;if((H[c+4>>2]&-8)==(a|0)){break B}c=f>>>29|0;f=f<<1;d=(c&4)+b|0;c=H[d+16>>2];if(c){continue}break}H[d+16>>2]=i}H[i+24>>2]=b;H[i+12>>2]=i;H[i+8>>2]=i;break A}d=g-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;H[4301]=b;a=a+c|0;H[4304]=a;H[a+4>>2]=b|1;H[(c+d|0)+4>>2]=40;H[4305]=H[4420];a=(f+(f-39&7?39-f&7:0)|0)-47|0;d=a>>>0>>0?e:a;H[d+4>>2]=27;a=H[4413];H[d+16>>2]=H[4412];H[d+20>>2]=a;a=H[4411];H[d+8>>2]=H[4410];H[d+12>>2]=a;H[4412]=d+8;H[4411]=g;H[4410]=c;H[4413]=0;a=d+24|0;while(1){H[a+4>>2]=7;b=a+8|0;a=a+4|0;if(b>>>0>>0){continue}break}if((d|0)==(e|0)){break e}H[d+4>>2]=H[d+4>>2]&-2;f=d-e|0;H[e+4>>2]=f|1;H[d>>2]=f;if(f>>>0<=255){b=(f&-8)+17232|0;c=H[4298];a=1<<(f>>>3);L:{if(!(c&a)){H[4298]=a|c;a=b;break L}a=H[b+8>>2]}H[b+8>>2]=e;H[a+12>>2]=e;H[e+12>>2]=b;H[e+8>>2]=a;break e}a=31;if(f>>>0<=16777215){a=Q(f>>>8|0);a=((f>>>38-a&1)-(a<<1)|0)+62|0}H[e+28>>2]=a;H[e+16>>2]=0;H[e+20>>2]=0;b=(a<<2)+17496|0;d=H[4299];c=1<>2]=e;break M}a=f<<((a|0)!=31?25-(a>>>1|0)|0:0);d=H[b>>2];while(1){b=d;if((f|0)==(H[b+4>>2]&-8)){break z}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;d=H[c+16>>2];if(d){continue}break}H[c+16>>2]=e}H[e+24>>2]=b;H[e+12>>2]=e;H[e+8>>2]=e;break e}a=H[b+8>>2];H[a+12>>2]=i;H[b+8>>2]=i;H[i+24>>2]=0;H[i+12>>2]=b;H[i+8>>2]=a}a=j+8|0;break a}a=H[b+8>>2];H[a+12>>2]=e;H[b+8>>2]=e;H[e+24>>2]=0;H[e+12>>2]=b;H[e+8>>2]=a}a=H[4301];if(a>>>0<=h>>>0){break d}b=a-h|0;H[4301]=b;c=H[4304];a=c+h|0;H[4304]=a;H[a+4>>2]=b|1;H[c+4>>2]=h|3;a=c+8|0;break a}H[3992]=48;a=0;break a}N:{if(!g){break N}b=H[d+28>>2];a=(b<<2)+17496|0;O:{if(H[a>>2]==(d|0)){H[a>>2]=c;if(c){break O}j=Vj(b)&j;H[4299]=j;break N}H[g+(H[g+16>>2]==(d|0)?16:20)>>2]=c;if(!c){break N}}H[c+24>>2]=g;a=H[d+16>>2];if(a){H[c+16>>2]=a;H[a+24>>2]=c}a=H[d+20>>2];if(!a){break N}H[c+20>>2]=a;H[a+24>>2]=c}P:{if(f>>>0<=15){a=f+h|0;H[d+4>>2]=a|3;a=a+d|0;H[a+4>>2]=H[a+4>>2]|1;break P}H[d+4>>2]=h|3;e=d+h|0;H[e+4>>2]=f|1;H[e+f>>2]=f;if(f>>>0<=255){b=(f&-8)+17232|0;c=H[4298];a=1<<(f>>>3);Q:{if(!(c&a)){H[4298]=a|c;a=b;break Q}a=H[b+8>>2]}H[b+8>>2]=e;H[a+12>>2]=e;H[e+12>>2]=b;H[e+8>>2]=a;break P}a=31;if(f>>>0<=16777215){a=Q(f>>>8|0);a=((f>>>38-a&1)-(a<<1)|0)+62|0}H[e+28>>2]=a;H[e+16>>2]=0;H[e+20>>2]=0;b=(a<<2)+17496|0;R:{c=1<>2]=e;break S}a=f<<((a|0)!=31?25-(a>>>1|0)|0:0);h=H[b>>2];while(1){b=h;if((H[b+4>>2]&-8)==(f|0)){break R}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;h=H[c+16>>2];if(h){continue}break}H[c+16>>2]=e}H[e+24>>2]=b;H[e+12>>2]=e;H[e+8>>2]=e;break P}a=H[b+8>>2];H[a+12>>2]=e;H[b+8>>2]=e;H[e+24>>2]=0;H[e+12>>2]=b;H[e+8>>2]=a}a=d+8|0;break a}T:{if(!i){break T}b=H[c+28>>2];a=(b<<2)+17496|0;U:{if(H[a>>2]==(c|0)){H[a>>2]=d;if(d){break U}m=17196,n=Vj(b)&j,H[m>>2]=n;break T}H[i+(H[i+16>>2]==(c|0)?16:20)>>2]=d;if(!d){break T}}H[d+24>>2]=i;a=H[c+16>>2];if(a){H[d+16>>2]=a;H[a+24>>2]=d}a=H[c+20>>2];if(!a){break T}H[d+20>>2]=a;H[a+24>>2]=d}V:{if(f>>>0<=15){a=f+h|0;H[c+4>>2]=a|3;a=a+c|0;H[a+4>>2]=H[a+4>>2]|1;break V}H[c+4>>2]=h|3;d=c+h|0;H[d+4>>2]=f|1;H[d+f>>2]=f;if(k){b=(k&-8)+17232|0;e=H[4303];a=1<<(k>>>3);W:{if(!(a&g)){H[4298]=a|g;a=b;break W}a=H[b+8>>2]}H[b+8>>2]=e;H[a+12>>2]=e;H[e+12>>2]=b;H[e+8>>2]=a}H[4303]=d;H[4300]=f}a=c+8|0}ca=l+16|0;return a|0}function ce(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;m=ca-32|0;ca=m;o=pa(12);H[o+8>>2]=0;H[o+4>>2]=b;H[o>>2]=0;s=o+12|0;b=s;a:{b:{c:{while(1){b=b-12|0;w=H[b+8>>2];j=H[b+4>>2];t=H[b>>2];if(t){if((w|0)>1e3){break a}H[m+24>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;d=1;c=H[a>>2];e=H[c+8>>2];h=H[c+12>>2];g=H[c+20>>2];f=H[c+16>>2];d:{if((h|0)<=(g|0)&f>>>0>=e>>>0|(g|0)>(h|0)){break d}e=I[f+H[c>>2]|0];h=c;c=g;f=f+1|0;c=f?c:c+1|0;H[h+16>>2]=f;H[h+20>>2]=c;Cc(m+16|0,e);if(e){c=H[a>>2];n=Dc(m+16|0);p=H[c+8>>2];g=H[c+12>>2];h=H[c+20>>2];f=H[c+16>>2];k=f+e|0;h=k>>>0>>0?h+1|0:h;if((g|0)<=(h|0)&k>>>0>p>>>0|(g|0)<(h|0)){break d}qa(n,f+H[c>>2]|0,e);d=H[c+20>>2];f=e;e=e+H[c+16>>2]|0;d=f>>>0>e>>>0?d+1|0:d;H[c+16>>2]=e;H[c+20>>2]=d}j=pa(24);c=j;H[c+4>>2]=0;H[c+8>>2]=0;c=c+16|0;H[c>>2]=0;H[c+4>>2]=0;H[j>>2]=j+4;H[j+12>>2]=c;e=ca-32|0;ca=e;h=t+12|0;c=m+16|0;u=nb(h,c);i=t+16|0;e:{if((u|0)==(i|0)){H[e+16>>2]=c;f:{g:{d=H[h+4>>2];h:{if(!d){f=h+4|0;c=f;break h}f=I[c+11|0];g=f<<24>>24<0;n=g?H[c>>2]:c;g=g?H[c+4>>2]:f;while(1){c=d;d=I[c+27|0];f=d<<24>>24<0;d=f?H[c+20>>2]:d;p=d>>>0>>0;i:{j:{k:{l:{k=p?d:g;m:{if(k){f=f?H[c+16>>2]:c+16|0;q=Fa(n,f,k);if(!q){if(d>>>0>g>>>0){break m}break l}if((q|0)>=0){break l}break m}if(d>>>0<=g>>>0){break k}}f=c;d=H[c>>2];if(d){continue}break h}d=Fa(f,n,k);if(d){break j}}if(p){break i}break g}if((d|0)>=0){break g}}d=H[c+4>>2];if(d){continue}break}f=c+4|0}d=pa(32);n=d+16|0;g=H[e+16>>2];n:{if(F[g+11|0]>=0){p=H[g+4>>2];H[n>>2]=H[g>>2];H[n+4>>2]=p;H[n+8>>2]=H[g+8>>2];break n}za(n,H[g>>2],H[g+4>>2])}H[d+8>>2]=c;H[d>>2]=0;H[d+4>>2]=0;H[d+28>>2]=0;H[f>>2]=d;c=d;g=H[H[h>>2]>>2];if(g){H[h>>2]=g;c=H[f>>2]}Sb(H[h+4>>2],c);H[h+8>>2]=H[h+8>>2]+1;c=1;break f}d=c;c=0}F[e+28|0]=c;H[e+24>>2]=d;d=H[e+24>>2];c=H[d+28>>2];H[d+28>>2]=j;if(!c){break e}Ra(c+12|0,H[c+16>>2]);Qa(c,H[c+4>>2]);oa(c);break e}if(!j){break e}Ra(j+12|0,H[j+16>>2]);Qa(j,H[j+4>>2]);oa(j)}ca=e+32|0;d=(i|0)!=(u|0)}if(F[m+27|0]<0){oa(H[m+16>>2])}if(d){break a}}if(!j){break a}H[m+16>>2]=0;if(!Bb(1,m+16|0,H[a>>2])){break a}q=0;x=H[m+16>>2];if(x){while(1){d=0;i=ca-32|0;ca=i;H[i+24>>2]=0;H[i+16>>2]=0;H[i+20>>2]=0;c=H[a>>2];f=H[c+8>>2];o:{p:{h=H[c+12>>2];g=H[c+20>>2];e=H[c+16>>2];q:{if((h|0)<=(g|0)&e>>>0>=f>>>0|(g|0)>(h|0)){break q}f=I[e+H[c>>2]|0];h=c;c=g;e=e+1|0;c=e?c:c+1|0;H[h+16>>2]=e;H[h+20>>2]=c;Cc(i+16|0,f);if(f){e=H[a>>2];n=Dc(i+16|0);p=H[e+8>>2];g=H[e+12>>2];c=H[e+20>>2];h=H[e+16>>2];k=h+f|0;c=k>>>0>>0?c+1|0:c;if(k>>>0>p>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break q}qa(n,h+H[e>>2]|0,f);c=H[e+20>>2];g=f;f=f+H[e+16>>2]|0;c=g>>>0>f>>>0?c+1|0:c;H[e+16>>2]=f;H[e+20>>2]=c}H[i+12>>2]=0;if(!Bb(1,i+12|0,H[a>>2])){break q}f=H[i+12>>2];if(!f){break q}e=H[a>>2];c=H[e+8>>2];h=H[e+16>>2];g=c-h|0;c=H[e+12>>2]-(H[e+20>>2]+(c>>>0>>0)|0)|0;if((c|0)<=0&f>>>0>g>>>0|(c|0)<0){break q}H[i+8>>2]=0;H[i>>2]=0;H[i+4>>2]=0;if((f|0)<0){break p}d=pa(f);H[i>>2]=d;c=d+f|0;H[i+8>>2]=c;l=ra(d,0,f);H[i+4>>2]=c;h=H[e+12>>2];y=h;p=H[e+8>>2];c=H[e+20>>2];k=H[e+16>>2];g=f+k|0;c=g>>>0>>0?c+1|0:c;u=g;n=c;r:{if((c|0)<=(h|0)&g>>>0<=p>>>0|(c|0)<(h|0)){qa(l,H[e>>2]+k|0,f);d=H[e+20>>2];c=f+H[e+16>>2]|0;d=c>>>0>>0?d+1|0:d;H[e+16>>2]=c;H[e+20>>2]=d;h=ca-48|0;ca=h;e=nb(j,i+16|0);if((e|0)!=(j+4|0)){c=H[e+4>>2];s:{if(!c){c=e;while(1){d=H[c+8>>2];f=H[d>>2]!=(c|0);c=d;if(f){continue}break}break s}while(1){d=c;c=H[c>>2];if(c){continue}break}}if((e|0)==H[j>>2]){H[j>>2]=d}H[j+8>>2]=H[j+8>>2]-1;f=H[j+4>>2];t:{u:{g=e;d=e;e=H[d>>2];if(e){c=H[g+4>>2];if(!c){break u}while(1){d=c;c=H[c>>2];if(c){continue}break}}e=H[d+4>>2];if(e){break u}e=0;k=1;break t}H[e+8>>2]=H[d+8>>2];k=0}l=H[d+8>>2];c=H[l>>2];v:{if((d|0)==(c|0)){H[l>>2]=e;if((d|0)==(f|0)){c=0;f=e;break v}c=H[l+4>>2];break v}H[l+4>>2]=e}r=!I[d+12|0];if((d|0)!=(g|0)){l=H[g+8>>2];H[d+8>>2]=l;H[l+(((g|0)!=H[H[g+8>>2]>>2])<<2)>>2]=d;l=H[g>>2];H[d>>2]=l;H[l+8>>2]=d;l=H[g+4>>2];H[d+4>>2]=l;if(l){H[l+8>>2]=d}F[d+12|0]=I[g+12|0];f=(f|0)==(g|0)?d:f}w:{if(r|!f){break w}if(k){while(1){e=I[c+12|0];x:{d=H[c+8>>2];if(H[d>>2]!=(c|0)){if(!e){F[c+12|0]=1;F[d+12|0]=0;e=H[d+4>>2];k=H[e>>2];H[d+4>>2]=k;if(k){H[k+8>>2]=d}H[e+8>>2]=H[d+8>>2];k=H[d+8>>2];H[(((d|0)!=H[k>>2])<<2)+k>>2]=e;H[e>>2]=d;H[d+8>>2]=e;d=c;c=H[c>>2];f=(c|0)==(f|0)?d:f;c=H[c+4>>2]}y:{z:{d=H[c>>2];A:{if(!(I[d+12|0]?0:d)){e=H[c+4>>2];if(I[e+12|0]?0:e){break A}F[c+12|0]=0;c=H[c+8>>2];B:{if((f|0)==(c|0)){c=f;break B}if(I[c+12|0]){break x}}F[c+12|0]=1;break w}e=H[c+4>>2];if(!e){break z}}if(I[e+12|0]){break z}d=c;break y}F[d+12|0]=1;F[c+12|0]=0;e=H[d+4>>2];H[c>>2]=e;if(e){H[e+8>>2]=c}H[d+8>>2]=H[c+8>>2];e=H[c+8>>2];H[((H[e>>2]!=(c|0))<<2)+e>>2]=d;H[d+4>>2]=c;H[c+8>>2]=d;e=c}c=H[d+8>>2];F[d+12|0]=I[c+12|0];F[c+12|0]=1;F[e+12|0]=1;d=H[c+4>>2];e=H[d>>2];H[c+4>>2]=e;if(e){H[e+8>>2]=c}H[d+8>>2]=H[c+8>>2];e=H[c+8>>2];H[(((c|0)!=H[e>>2])<<2)+e>>2]=d;H[d>>2]=c;H[c+8>>2]=d;break w}if(!e){F[c+12|0]=1;F[d+12|0]=0;e=H[c+4>>2];H[d>>2]=e;if(e){H[e+8>>2]=d}H[c+8>>2]=H[d+8>>2];e=H[d+8>>2];H[(((d|0)!=H[e>>2])<<2)+e>>2]=c;H[c+4>>2]=d;H[d+8>>2]=c;f=(d|0)==(f|0)?c:f;c=H[d>>2]}e=H[c>>2];C:{if(!(!e|I[e+12|0])){d=c;break C}d=H[c+4>>2];if(!(I[d+12|0]?0:d)){F[c+12|0]=0;c=H[c+8>>2];if((c|0)!=(f|0)?I[c+12|0]:0){break x}F[c+12|0]=1;break w}if(e){if(!I[e+12|0]){d=c;break C}d=H[c+4>>2]}F[d+12|0]=1;F[c+12|0]=0;e=H[d>>2];H[c+4>>2]=e;if(e){H[e+8>>2]=c}H[d+8>>2]=H[c+8>>2];e=H[c+8>>2];H[((H[e>>2]!=(c|0))<<2)+e>>2]=d;H[d>>2]=c;H[c+8>>2]=d;e=c}c=H[d+8>>2];F[d+12|0]=I[c+12|0];F[c+12|0]=1;F[e+12|0]=1;d=H[c>>2];e=H[d+4>>2];H[c>>2]=e;if(e){H[e+8>>2]=c}H[d+8>>2]=H[c+8>>2];e=H[c+8>>2];H[(((c|0)!=H[e>>2])<<2)+e>>2]=d;H[d+4>>2]=c;H[c+8>>2]=d;break w}d=c;c=H[c+8>>2];c=H[(((d|0)==H[c>>2])<<2)+c>>2];continue}}F[e+12|0]=1}c=H[g+28>>2];if(c){H[g+32>>2]=c;oa(c)}if(F[g+27|0]<0){oa(H[g+16>>2])}oa(g)}H[h+8>>2]=0;H[h>>2]=0;H[h+4>>2]=0;c=H[i+4>>2];d=H[i>>2];f=c-d|0;e=0;D:{E:{if((c|0)!=(d|0)){if((f|0)<0){break E}e=pa(f);c=ra(e,0,f);g=c+f|0;H[h+8>>2]=g;H[h+4>>2]=g;H[h>>2]=c;c=d}qa(e,c,f);F:{if(F[i+27|0]>=0){H[h+24>>2]=H[i+24>>2];c=H[i+20>>2];H[h+16>>2]=H[i+16>>2];H[h+20>>2]=c;break F}za(h+16|0,H[i+16>>2],H[i+20>>2])}ae(h+28|0,h);f=h+16|0;c=f;G:{H:{d=H[j+4>>2];I:{if(!d){e=j+4|0;c=e;break I}e=I[c+11|0];g=e<<24>>24<0;k=g?H[c>>2]:c;g=g?H[c+4>>2]:e;while(1){c=d;d=I[c+27|0];e=d<<24>>24<0;d=e?H[c+20>>2]:d;l=d>>>0>>0;J:{K:{L:{M:{r=l?d:g;N:{if(r){e=e?H[c+16>>2]:c+16|0;z=Fa(k,e,r);if(!z){if(d>>>0>g>>>0){break N}break M}if((z|0)>=0){break M}break N}if(d>>>0<=g>>>0){break L}}e=c;d=H[c>>2];if(d){continue}break I}d=Fa(e,k,r);if(d){break K}}if(l){break J}break H}if((d|0)>=0){break H}}d=H[c+4>>2];if(d){continue}break}e=c+4|0}d=pa(40);H[d+24>>2]=H[f+8>>2];g=H[f+4>>2];H[d+16>>2]=H[f>>2];H[d+20>>2]=g;H[f>>2]=0;H[f+4>>2]=0;H[f+8>>2]=0;ae(d+28|0,f+12|0);H[d+8>>2]=c;H[d>>2]=0;H[d+4>>2]=0;H[e>>2]=d;c=d;f=H[H[j>>2]>>2];if(f){H[j>>2]=f;c=H[e>>2]}Sb(H[j+4>>2],c);H[j+8>>2]=H[j+8>>2]+1;c=1;break G}d=c;c=0}F[h+44|0]=c;H[h+40>>2]=d;c=H[h+28>>2];if(c){H[h+32>>2]=c;oa(c)}if(F[h+27|0]<0){oa(H[h+16>>2])}c=H[h>>2];if(c){H[h+4>>2]=c;oa(c)}ca=h+48|0;break D}sa();v()}d=H[i>>2];if(!d){break r}}H[i+4>>2]=d;oa(d)}d=(n|0)<=(y|0)&p>>>0>=u>>>0|(n|0)<(y|0)}if(F[i+27|0]<0){oa(H[i+16>>2])}ca=i+32|0;break o}sa();v()}if(!d){break a}q=q+1|0;if((x|0)!=(q|0)){continue}break}}H[m+12>>2]=0;if(!Bb(1,m+12|0,H[a>>2])){break a}c=H[a>>2];e=H[c+8>>2];f=H[c+16>>2];h=e-f|0;d=H[m+12>>2];c=H[c+12>>2]-(H[c+20>>2]+(e>>>0>>0)|0)|0;if(h>>>0>>0&(c|0)<=0|(c|0)<0){break a}if(d){q=0;h=((t|0)!=0)+w|0;while(1){O:{if(b>>>0>>0){H[b+8>>2]=h;H[b+4>>2]=0;H[b>>2]=j;b=b+12|0;d=H[m+12>>2];break O}c=b-o|0;g=(c|0)/12|0;b=g+1|0;if(b>>>0>=357913942){break c}e=(s-o|0)/12|0;f=e<<1;e=e>>>0>=178956970?357913941:b>>>0>>0?f:b;if(e){if(e>>>0>=357913942){break b}f=pa(N(e,12))}else{f=0}b=f+N(g,12)|0;H[b+8>>2]=h;H[b+4>>2]=0;H[b>>2]=j;c=va(b+N((c|0)/-12|0,12)|0,o,c);s=f+N(e,12)|0;b=b+12|0;if(o){oa(o)}o=c}q=q+1|0;if(q>>>0>>0){continue}break}}if((b|0)!=(o|0)){continue}break}A=1;break a}sa();v()}wa();v()}if(o){oa(o)}ca=m+32|0;return A}function Af(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=O(0),q=0,r=0;e=ca-720|0;ca=e;a:{b:{c:{d:{e:{f:{g:{h:{i:{if(J[b+38>>1]>=515){H[e+680>>2]=0;H[e+672>>2]=0;H[e+676>>2]=0;if((ea[H[H[a>>2]+24>>2]](a)|0)<=0){break d}while(1){c=ea[H[H[a>>2]+20>>2]](a,n)|0;d=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];if(H[d+28>>2]==9){f=H[e+672>>2];c=H[e+676>>2]-f>>2;k=I[d+24|0];j:{if(c>>>0>>0){ya(e+672|0,k-c|0);break j}if(c>>>0<=k>>>0){break j}H[e+676>>2]=f+(k<<2)}j=0;i=H[b+8>>2];h=H[b+12>>2];c=H[b+20>>2];d=k<<2;f=H[b+16>>2];l=f+d|0;c=d>>>0>l>>>0?c+1|0:c;if(i>>>0>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break b}qa(H[e+672>>2],f+H[b>>2]|0,d);c=H[b+20>>2];f=d;d=d+H[b+16>>2]|0;c=f>>>0>d>>>0?c+1|0:c;i=d;H[b+16>>2]=d;H[b+20>>2]=c;l=H[b+12>>2];g=H[b+8>>2];h=d+4|0;f=h>>>0<4?c+1|0:c;d=f;if(g>>>0>>0&(d|0)>=(l|0)|(d|0)>(l|0)){break b}o=H[b>>2];f=o+i|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=h;H[b+20>>2]=d;if(g>>>0<=h>>>0&(d|0)>=(l|0)|(d|0)>(l|0)){break b}d=I[h+o|0];h=i+5|0;c=h>>>0<5?c+1|0:c;H[b+16>>2]=h;H[b+20>>2]=c;if(d>>>0>31){break b}p=(A(2,f),B());H[e+20>>2]=-1;H[e+16>>2]=1832;H[e+32>>2]=0;H[e+36>>2]=0;H[e+24>>2]=0;H[e+28>>2]=0;c=H[e+672>>2];o=d-1|0;if(o>>>0<=29){H[e+20>>2]=d;k:{h=c+(k<<2)|0;l=h-c|0;f=l>>2;i=H[e+32>>2];d=H[e+24>>2];if(f>>>0<=i-d>>2>>>0){i=H[e+28>>2]-d|0;l=i>>2;i=f>>>0>l>>>0?c+i|0:h;g=i-c|0;if((c|0)!=(i|0)){va(d,c,g)}if(f>>>0>l>>>0){c=h-i|0;d=H[e+28>>2];if((h|0)!=(i|0)){va(d,i,c)}H[e+28>>2]=c+d;break k}H[e+28>>2]=d+g;break k}if(d){H[e+28>>2]=d;oa(d);H[e+32>>2]=0;H[e+24>>2]=0;H[e+28>>2]=0;i=0}l:{if((l|0)<0){break l}d=i>>>1|0;d=i>>>0>=2147483644?1073741823:d>>>0>f>>>0?d:f;if(d>>>0>=1073741824){break l}i=d<<2;d=pa(i);H[e+28>>2]=d;H[e+24>>2]=d;H[e+32>>2]=d+i;if((c|0)!=(h|0)){qa(d,c,l)}H[e+28>>2]=d+(f<<2);break k}sa();v()}L[e+36>>2]=p}m:{if(o>>>0>=30){break m}if(!Xc(e+16|0,H[H[a+60>>2]+((H[a+40>>2]-H[a+36>>2]|0)/24<<2)>>2])){break m}c=H[a+40>>2];n:{if((c|0)!=H[a+44>>2]){H[c>>2]=1832;d=H[e+20>>2];H[c+16>>2]=0;H[c+8>>2]=0;H[c+12>>2]=0;H[c+4>>2]=d;d=H[e+28>>2];f=H[e+24>>2];if((d|0)!=(f|0)){d=d-f|0;if((d|0)<0){break i}g=pa(d);H[c+12>>2]=g;H[c+8>>2]=g;H[c+16>>2]=(d&-4)+g;k=H[e+24>>2];d=H[e+28>>2];if((k|0)!=(d|0)){while(1){L[g>>2]=L[k>>2];g=g+4|0;k=k+4|0;if((d|0)!=(k|0)){continue}break}}H[c+12>>2]=g}L[c+20>>2]=L[e+36>>2];H[a+40>>2]=c+24;break n}d=0;o:{p:{q:{r:{j=H[a+40>>2];f=H[a+36>>2];i=(j-f|0)/24|0;c=i+1|0;if(c>>>0<178956971){h=(H[a+44>>2]-f|0)/24|0;l=h<<1;h=h>>>0>=89478485?178956970:c>>>0>>0?l:c;if(h){if(h>>>0>=178956971){break r}d=pa(N(h,24))}g=N(i,24)+d|0;H[g>>2]=1832;c=H[e+20>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;H[g+4>>2]=c;c=H[e+24>>2];i=H[e+28>>2];if((c|0)!=(i|0)){l=i-c|0;if((l|0)<0){break q}k=pa(l);H[g+8>>2]=k;H[g+16>>2]=(l&-4)+k;while(1){L[k>>2]=L[c>>2];k=k+4|0;c=c+4|0;if((i|0)!=(c|0)){continue}break}H[g+12>>2]=k}c=N(h,24)+d|0;L[g+20>>2]=L[e+36>>2];d=g+24|0;if((f|0)==(j|0)){break p}while(1){g=g-24|0;H[g>>2]=1832;j=j-24|0;H[g+4>>2]=H[j+4>>2];H[g+8>>2]=H[j+8>>2];H[g+12>>2]=H[j+12>>2];H[g+16>>2]=H[j+16>>2];H[j+16>>2]=0;H[j+8>>2]=0;H[j+12>>2]=0;L[g+20>>2]=L[j+20>>2];if((f|0)!=(j|0)){continue}break}H[a+44>>2]=c;k=H[a+40>>2];H[a+40>>2]=d;j=H[a+36>>2];H[a+36>>2]=g;if((j|0)==(k|0)){break o}while(1){k=k-24|0;ea[H[H[k>>2]>>2]](k)|0;if((j|0)!=(k|0)){continue}break}break o}sa();v()}wa();v()}sa();v()}H[a+44>>2]=c;H[a+40>>2]=d;H[a+36>>2]=g}if(j){oa(j)}}j=1}H[e+16>>2]=1832;c=H[e+24>>2];if(c){H[e+28>>2]=c;oa(c)}if(!j){break c}}n=n+1|0;if((ea[H[H[a>>2]+24>>2]](a)|0)>(n|0)){continue}break}break d}k=ea[H[H[a>>2]+24>>2]](a)|0;H[e+712>>2]=0;H[e+704>>2]=0;H[e+708>>2]=0;if(k){if(k>>>0>=214748365){break h}c=N(k,20);d=pa(c);H[e+704>>2]=d;H[e+712>>2]=c+d;c=c-20|0;c=(c-((c>>>0)%20|0)|0)+20|0;q=e,r=ra(d,0,c)+c|0,H[q+708>>2]=r;while(1){c=ea[H[H[a>>2]+20>>2]](a,m)|0;d=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];f=H[d+28>>2];c=f-1|0;if(c>>>0<=10){c=H[(c<<2)+13584>>2]}else{c=-1}h=(c|0)>0?c:0;if(h>>>0>4){break f}c=H[e+704>>2]+N(m,20)|0;i=I[d+24|0];H[c+16>>2]=i;H[c+12>>2]=h;H[c+8>>2]=f;H[c+4>>2]=g;H[c>>2]=d;g=g+i|0;m=m+1|0;if((k|0)!=(m|0)){continue}break}}c=ea[H[H[a>>2]+20>>2]](a,0)|0;m=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];F[m+84|0]=1;H[m+72>>2]=H[m+68>>2];h=H[b+12>>2];c=h;d=H[b+20>>2];f=H[b+8>>2];i=H[b+16>>2];if((c|0)<=(d|0)&f>>>0<=i>>>0|(c|0)<(d|0)){break f}n=H[b>>2];o=I[n+i|0];c=d;l=i+1|0;c=l?c:c+1|0;H[b+16>>2]=l;H[b+20>>2]=c;s:{switch(o|0){case 0:a=H[e+704>>2];if((H[e+708>>2]-a|0)!=20){break e}if(H[a+16>>2]!=3){break f}t:{if(f>>>0<=l>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break t}c=d;a=i+2|0;c=a>>>0<2?c+1|0:c;l=a;H[b+16>>2]=a;H[b+20>>2]=c;c=d;a=i+6|0;c=a>>>0<6?c+1|0:c;if(a>>>0>f>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break t}d=l+n|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=a;H[b+20>>2]=c;mb(m,d);j=e+672|0;H[j+20>>2]=0;H[j+12>>2]=0;H[j+16>>2]=0;H[j>>2]=0;H[j+4>>2]=0;H[j+20>>2]=d;d=Ac(e+16|0,e+704|0);k=0;g=ca-32|0;ca=g;H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;f=H[b+12>>2];m=f;i=H[b+8>>2];c=H[b+20>>2];l=c;h=H[b+16>>2];a=h+4|0;c=a>>>0<4?c+1|0:c;u:{if(a>>>0>i>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break u}n=H[b>>2];f=n+h|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=a;H[b+20>>2]=c;v:{w:{switch(f-2|0){case 1:if((c|0)>=(m|0)&a>>>0>=i>>>0|(c|0)>(m|0)){break u}a=F[a+n|0];c=l;f=h+5|0;c=f>>>0<5?c+1|0:c;H[b+16>>2]=f;H[b+20>>2]=c;H[j+8>>2]=a;if((a|0)==1){if(Ud(j,b,g+16|0)){break v}break u}Rd(1799,23,H[3443]);break u;default:Rd(1774,24,H[3443]);break u;case 0:break w}}if(!Ud(j,b,g+16|0)){break u}}H[g+8>>2]=H[g+16>>2];H[g>>2]=H[g+20>>2];c=ca-32|0;ca=c;a=H[j>>2];p=L[j+4>>2];H[c+24>>2]=1065353216;h=-1<0){L[c+24>>2]=p/O(a|0)}m=H[g+8>>2];n=H[g>>2];if((m|0)!=(n|0)){a=H[d+28>>2];while(1){b=H[m>>2];f=H[m+4>>2];p=L[c+24>>2];L[c+16>>2]=p*O(H[m+8>>2]-h|0);L[c+12>>2]=p*O(f-h|0);L[c+8>>2]=p*O(b-h|0);b=a;i=H[d+16>>2];f=H[i>>2];if(!I[f+84|0]){b=H[H[f+68>>2]+(a<<2)>>2]}if(K[f+80>>2]>b>>>0){a=H[f+40>>2];qa(H[H[f>>2]>>2]+N(a,b)|0,(c+8|0)+(H[i+4>>2]<<2)|0,a);n=H[g>>2];a=H[d+28>>2]}a=a+1|0;H[d+28>>2]=a;m=m+12|0;if((n|0)!=(m|0)){continue}break}}ca=c+32|0;k=1}a=H[g+16>>2];if(a){H[g+20>>2]=a;oa(a)}ca=g+32|0;yc(d);j=1;if(k){break f}}j=0;break f;case 1:break s;default:break f}}if(f>>>0<=l>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break f}o=I[l+n|0];c=d;l=i+2|0;c=l>>>0<2?c+1|0:c;H[b+16>>2]=l;H[b+20>>2]=c;if(o>>>0>=7){H[e>>2]=o;Qd(1651,e);break f}c=d;d=i+6|0;c=d>>>0<6?c+1|0:c;if(d>>>0>f>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break f}f=l+n|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=d;H[b+20>>2]=c;if(k){m=0;while(1){c=ea[H[H[a>>2]+20>>2]](a,m)|0;c=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];mb(c,f);F[c+84|0]=1;H[c+72>>2]=H[c+68>>2];m=m+1|0;if((k|0)!=(m|0)){continue}break}}a=Ac(e+672|0,e+704|0);x:{y:{switch(o|0){case 1:c=wb(e+16|0,g);b=zd(c,b,a,-1);xb(c);if(!b){break g}break x;case 2:c=ub(e+16|0,g);b=yd(c,b,a,-1);vb(c);if(!b){break g}break x;case 3:c=ub(e+16|0,g);b=xd(c,b,a,-1);vb(c);if(!b){break g}break x;case 4:c=$a(e+16|0,g);b=wd(c,b,a,-1);ab(c);if(!b){break g}break x;case 5:c=$a(e+16|0,g);b=vd(c,b,a,-1);ab(c);if(!b){break g}break x;case 6:c=$a(e+16|0,g);b=ud(c,b,a,-1);ab(c);if(b){break x}break g;case 0:break y;default:break g}}c=wb(e+16|0,g);b=Bd(c,b,a,-1);xb(c);if(!b){break g}}yc(a);j=1;break f}sa();v()}sa();v()}yc(a)}a=H[e+704>>2]}if(!a){break a}H[e+708>>2]=a;oa(a);break a}j=1;if(H[a+52>>2]==H[a+48>>2]){break b}while(1){if(!td(1,e+16|0,b)){break c}c=H[a+48>>2];d=H[e+16>>2];H[c+(m<<2)>>2]=d>>>1^0-(d&1);m=m+1|0;if(m>>>0>2]-c>>2>>>0){continue}break}break b}j=0}a=H[e+672>>2];if(!a){break a}H[e+676>>2]=a;oa(a)}ca=e+720|0;return j|0}function te(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=ca-32|0;ca=h;H[b+32>>2]=d;H[b+40>>2]=c;H[b+4>>2]=e;nc(a,d,h+16|0);a:{if(H[a>>2]){break a}if(F[a+15|0]<0){oa(H[a+4>>2])}d=I[h+23|0];if((ea[H[H[b>>2]+8>>2]](b)|0)!=(d|0)){b=pa(64);F[b+50|0]=0;c=I[1314]|I[1315]<<8;F[b+48|0]=c;F[b+49|0]=c>>>8;c=I[1310]|I[1311]<<8|(I[1312]<<16|I[1313]<<24);d=I[1306]|I[1307]<<8|(I[1308]<<16|I[1309]<<24);F[b+40|0]=d;F[b+41|0]=d>>>8;F[b+42|0]=d>>>16;F[b+43|0]=d>>>24;F[b+44|0]=c;F[b+45|0]=c>>>8;F[b+46|0]=c>>>16;F[b+47|0]=c>>>24;c=I[1302]|I[1303]<<8|(I[1304]<<16|I[1305]<<24);d=I[1298]|I[1299]<<8|(I[1300]<<16|I[1301]<<24);F[b+32|0]=d;F[b+33|0]=d>>>8;F[b+34|0]=d>>>16;F[b+35|0]=d>>>24;F[b+36|0]=c;F[b+37|0]=c>>>8;F[b+38|0]=c>>>16;F[b+39|0]=c>>>24;c=I[1294]|I[1295]<<8|(I[1296]<<16|I[1297]<<24);d=I[1290]|I[1291]<<8|(I[1292]<<16|I[1293]<<24);F[b+24|0]=d;F[b+25|0]=d>>>8;F[b+26|0]=d>>>16;F[b+27|0]=d>>>24;F[b+28|0]=c;F[b+29|0]=c>>>8;F[b+30|0]=c>>>16;F[b+31|0]=c>>>24;c=I[1286]|I[1287]<<8|(I[1288]<<16|I[1289]<<24);d=I[1282]|I[1283]<<8|(I[1284]<<16|I[1285]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1278]|I[1279]<<8|(I[1280]<<16|I[1281]<<24);d=I[1274]|I[1275]<<8|(I[1276]<<16|I[1277]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1270]|I[1271]<<8|(I[1272]<<16|I[1273]<<24);d=I[1266]|I[1267]<<8|(I[1268]<<16|I[1269]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,b,50);oa(b);break a}c=I[h+21|0];F[b+36|0]=c;e=I[h+22|0];F[b+37|0]=e;if((c-3&255)>>>0<=253){b=pa(32);F[b+22|0]=0;c=I[1427]|I[1428]<<8|(I[1429]<<16|I[1430]<<24);d=I[1423]|I[1424]<<8|(I[1425]<<16|I[1426]<<24);F[b+14|0]=d;F[b+15|0]=d>>>8;F[b+16|0]=d>>>16;F[b+17|0]=d>>>24;F[b+18|0]=c;F[b+19|0]=c>>>8;F[b+20|0]=c>>>16;F[b+21|0]=c>>>24;c=I[1421]|I[1422]<<8|(I[1423]<<16|I[1424]<<24);d=I[1417]|I[1418]<<8|(I[1419]<<16|I[1420]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1413]|I[1414]<<8|(I[1415]<<16|I[1416]<<24);d=I[1409]|I[1410]<<8|(I[1411]<<16|I[1412]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-5;za(a+4|0,b,22);oa(b);break a}if(!((c|0)!=2|e>>>0<=(d?2:3)>>>0)){b=pa(32);F[b+22|0]=0;c=I[1404]|I[1405]<<8|(I[1406]<<16|I[1407]<<24);d=I[1400]|I[1401]<<8|(I[1402]<<16|I[1403]<<24);F[b+14|0]=d;F[b+15|0]=d>>>8;F[b+16|0]=d>>>16;F[b+17|0]=d>>>24;F[b+18|0]=c;F[b+19|0]=c>>>8;F[b+20|0]=c>>>16;F[b+21|0]=c>>>24;c=I[1398]|I[1399]<<8|(I[1400]<<16|I[1401]<<24);d=I[1394]|I[1395]<<8|(I[1396]<<16|I[1397]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1390]|I[1391]<<8|(I[1392]<<16|I[1393]<<24);d=I[1386]|I[1387]<<8|(I[1388]<<16|I[1389]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-5;za(a+4|0,b,22);oa(b);break a}c=e|c<<8;G[H[b+32>>2]+38>>1]=c;b:{if((c&65535)>>>0<259|G[h+26>>1]>=0){break b}i=ca-16|0;ca=i;e=pa(36);c=e;H[c+4>>2]=0;H[c+8>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;c=c+16|0;H[c>>2]=0;H[c+4>>2]=0;H[e>>2]=e+4;H[e+32>>2]=0;H[e+12>>2]=c;H[i>>2]=0;d=H[b+32>>2];j=ca-16|0;ca=j;c=0;c:{if(!e){break c}H[i>>2]=d;H[j+12>>2]=0;c=0;if(!Bb(1,j+12|0,d)){break c}m=H[j+12>>2];if(m){while(1){d:{if(Bb(1,j+8|0,H[i>>2])){c=pa(28);H[c+4>>2]=0;H[c+8>>2]=0;d=c+16|0;H[d>>2]=0;H[d+4>>2]=0;H[c>>2]=c+4;H[c+12>>2]=d;H[c+24>>2]=H[j+8>>2];if(ce(i,c)){break d}Ra(c+12|0,H[c+16>>2]);Qa(c,H[c+4>>2]);oa(c)}c=0;break c}f=ca-16|0;ca=f;H[f+8>>2]=c;e:{if(!c){break e}d=H[e+28>>2];f:{if(d>>>0>2]){H[f+8>>2]=0;H[d>>2]=c;H[e+28>>2]=d+4;break f}d=0;g:{h:{i:{g=H[e+24>>2];l=H[e+28>>2]-g>>2;c=l+1|0;if(c>>>0<1073741824){g=H[e+32>>2]-g|0;k=g>>>1|0;g=g>>>0>=2147483644?1073741823:c>>>0>>0?k:c;if(g){if(g>>>0>=1073741824){break i}d=pa(g<<2)}k=H[f+8>>2];H[f+8>>2]=0;c=(l<<2)+d|0;H[c>>2]=k;g=(g<<2)+d|0;l=c+4|0;d=H[e+28>>2];k=H[e+24>>2];if((d|0)==(k|0)){break h}while(1){d=d-4|0;o=H[d>>2];H[d>>2]=0;c=c-4|0;H[c>>2]=o;if((d|0)!=(k|0)){continue}break}H[e+32>>2]=g;g=H[e+28>>2];H[e+28>>2]=l;d=H[e+24>>2];H[e+24>>2]=c;if((d|0)==(g|0)){break g}while(1){g=g-4|0;c=H[g>>2];H[g>>2]=0;if(c){Ra(c+12|0,H[c+16>>2]);Qa(c,H[c+4>>2]);oa(c)}if((d|0)!=(g|0)){continue}break}break g}sa();v()}wa();v()}H[e+32>>2]=g;H[e+28>>2]=l;H[e+24>>2]=c}if(d){oa(d)}}c=H[f+8>>2];H[f+8>>2]=0;if(!c){break e}Ra(c+12|0,H[c+16>>2]);Qa(c,H[c+4>>2]);oa(c)}ca=f+16|0;n=n+1|0;if((m|0)!=(n|0)){continue}break}}c=ce(i,e)}ca=j+16|0;j:{if(c){d=H[b+4>>2];c=H[d+4>>2];H[d+4>>2]=e;if(c){Uc(c)}H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;break j}c=pa(32);F[c+26|0]=0;d=I[1579]|I[1580]<<8;F[c+24|0]=d;F[c+25|0]=d>>>8;d=I[1575]|I[1576]<<8|(I[1577]<<16|I[1578]<<24);f=I[1571]|I[1572]<<8|(I[1573]<<16|I[1574]<<24);F[c+16|0]=f;F[c+17|0]=f>>>8;F[c+18|0]=f>>>16;F[c+19|0]=f>>>24;F[c+20|0]=d;F[c+21|0]=d>>>8;F[c+22|0]=d>>>16;F[c+23|0]=d>>>24;d=I[1567]|I[1568]<<8|(I[1569]<<16|I[1570]<<24);f=I[1563]|I[1564]<<8|(I[1565]<<16|I[1566]<<24);F[c+8|0]=f;F[c+9|0]=f>>>8;F[c+10|0]=f>>>16;F[c+11|0]=f>>>24;F[c+12|0]=d;F[c+13|0]=d>>>8;F[c+14|0]=d>>>16;F[c+15|0]=d>>>24;d=I[1559]|I[1560]<<8|(I[1561]<<16|I[1562]<<24);f=I[1555]|I[1556]<<8|(I[1557]<<16|I[1558]<<24);F[c|0]=f;F[c+1|0]=f>>>8;F[c+2|0]=f>>>16;F[c+3|0]=f>>>24;F[c+4|0]=d;F[c+5|0]=d>>>8;F[c+6|0]=d>>>16;F[c+7|0]=d>>>24;H[a>>2]=-1;za(a+4|0,c,26);oa(c);H[i+8>>2]=0;Uc(e)}ca=i+16|0;if(H[a>>2]){break a}if(F[a+15|0]>=0){break b}oa(H[a+4>>2])}if(!(ea[H[H[b>>2]+12>>2]](b)|0)){b=pa(48);F[b+33|0]=0;F[b+32|0]=I[1384];c=I[1380]|I[1381]<<8|(I[1382]<<16|I[1383]<<24);d=I[1376]|I[1377]<<8|(I[1378]<<16|I[1379]<<24);F[b+24|0]=d;F[b+25|0]=d>>>8;F[b+26|0]=d>>>16;F[b+27|0]=d>>>24;F[b+28|0]=c;F[b+29|0]=c>>>8;F[b+30|0]=c>>>16;F[b+31|0]=c>>>24;c=I[1372]|I[1373]<<8|(I[1374]<<16|I[1375]<<24);d=I[1368]|I[1369]<<8|(I[1370]<<16|I[1371]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1364]|I[1365]<<8|(I[1366]<<16|I[1367]<<24);d=I[1360]|I[1361]<<8|(I[1362]<<16|I[1363]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1356]|I[1357]<<8|(I[1358]<<16|I[1359]<<24);d=I[1352]|I[1353]<<8|(I[1354]<<16|I[1355]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,b,33);oa(b);break a}if(!(ea[H[H[b>>2]+20>>2]](b)|0)){b=mc(h,1582);H[a>>2]=-1;a=a+4|0;if(F[b+11|0]>=0){c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];break a}za(a,H[b>>2],H[b+4>>2]);if(F[b+11|0]>=0){break a}oa(H[b>>2]);break a}if(!(ea[H[H[b>>2]+24>>2]](b)|0)){b=mc(h,1317);H[a>>2]=-1;a=a+4|0;if(F[b+11|0]>=0){c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];break a}za(a,H[b>>2],H[b+4>>2]);if(F[b+11|0]>=0){break a}oa(H[b>>2]);break a}H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0}ca=h+32|0}function pg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;m=ca-16|0;ca=m;H[m+12>>2]=b;b=pa(32);H[m>>2]=b;H[m+4>>2]=24;H[m+8>>2]=-2147483616;c=I[1206]|I[1207]<<8|(I[1208]<<16|I[1209]<<24);d=I[1202]|I[1203]<<8|(I[1204]<<16|I[1205]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1198]|I[1199]<<8|(I[1200]<<16|I[1201]<<24);d=I[1194]|I[1195]<<8|(I[1196]<<16|I[1197]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1190]|I[1191]<<8|(I[1192]<<16|I[1193]<<24);d=I[1186]|I[1187]<<8|(I[1188]<<16|I[1189]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;F[b+24|0]=0;l=ca-48|0;ca=l;f=H[m+12>>2];d=a;a=a+16|0;b=H[a>>2];a:{b:{if(!b){break b}c=a;while(1){e=(f|0)>H[b+16>>2];c=e?c:b;b=H[(e?b+4|0:b)>>2];if(b){continue}break}if((a|0)==(c|0)){break b}if((f|0)>=H[c+16>>2]){break a}}H[l+28>>2]=0;H[l+32>>2]=0;y=l+24|0;H[l+24>>2]=y|4;a=l+16|0;H[a>>2]=0;H[a+4>>2]=0;H[l+8>>2]=f;H[l+12>>2]=a;t=l+8|0;a=t;x=ca-16|0;ca=x;u=d+12|0;c=H[u+4>>2];c:{d:{if(!c){o=u+4|0;d=o;break d}a=H[a>>2];while(1){d=c;b=H[c+16>>2];if((b|0)>(a|0)){o=d;c=H[d>>2];if(c){continue}break d}if((a|0)<=(b|0)){g=d;a=0;break c}c=H[d+4>>2];if(c){continue}break}o=d+4|0}g=pa(32);b=H[t>>2];q=g+24|0;a=q;H[a>>2]=0;H[a+4>>2]=0;H[g+16>>2]=b;r=g+20|0;H[r>>2]=a;c=H[t+4>>2];z=t+8|0;if((c|0)!=(z|0)){while(1){p=ca-16|0;ca=p;a=p+8|0;k=c+16|0;e:{f:{g:{h:{i:{j:{k:{f=q;e=r+4|0;l:{if((f|0)==(e|0)){break l}b=I[f+27|0];h=b<<24>>24<0;i=I[k+11|0];n=i<<24>>24;j=(n|0)<0;i=j?H[k+4>>2]:i;b=h?H[f+20>>2]:b;s=i>>>0>b>>>0;w=s?b:i;if(w){j=j?H[k>>2]:k;h=h?H[f+16>>2]:f+16|0;A=Fa(j,h,w);if(!A){if(b>>>0>i>>>0){break l}break k}if((A|0)>=0){break k}break l}if(b>>>0<=i>>>0){break j}}h=H[f>>2];m:{a=f;n:{if((a|0)==H[r>>2]){break n}o:{if(!h){b=f;while(1){a=H[b+8>>2];i=H[a>>2]==(b|0);b=a;if(i){continue}break}break o}b=h;while(1){a=b;b=H[b+4>>2];if(b){continue}break}}i=I[k+11|0];s=i<<24>>24;b=(s|0)<0;j=I[a+27|0];n=j<<24>>24<0;p:{i=b?H[k+4>>2]:i;j=n?H[a+20>>2]:j;w=i>>>0>>0?i:j;if(w){b=Fa(n?H[a+16>>2]:a+16|0,b?H[k>>2]:k,w);if(b){break p}}if(i>>>0>j>>>0){break n}break m}if((b|0)>=0){break m}}if(!h){H[p+12>>2]=f;a=f;break e}H[p+12>>2]=a;a=a+4|0;break e}b=H[e>>2];if(!b){H[p+12>>2]=e;a=e;break e}h=(s|0)<0?H[k>>2]:k;f=e;while(1){a=b;b=I[b+27|0];e=b<<24>>24<0;b=e?H[a+20>>2]:b;k=b>>>0>>0;q:{r:{s:{t:{n=k?b:i;u:{if(n){e=e?H[a+16>>2]:a+16|0;j=Fa(h,e,n);if(!j){if(b>>>0>i>>>0){break u}break t}if((j|0)>=0){break t}break u}if(b>>>0<=i>>>0){break s}}f=a;b=H[a>>2];if(b){continue}break g}b=Fa(e,h,n);if(b){break r}}if(k){break q}break g}if((b|0)>=0){break g}}f=a+4|0;b=H[a+4>>2];if(b){continue}break}break g}b=Fa(h,j,w);if(b){break i}}if(s){break h}break f}if((b|0)>=0){break f}}h=H[f+4>>2];v:{if(!h){b=f;while(1){a=H[b+8>>2];j=H[a>>2]!=(b|0);b=a;if(j){continue}break}break v}b=h;while(1){a=b;b=H[b>>2];if(b){continue}break}}w:{x:{if((a|0)==(e|0)){break x}j=I[a+27|0];b=j<<24>>24<0;y:{j=b?H[a+20>>2]:j;s=i>>>0>j>>>0?j:i;if(s){b=Fa((n|0)<0?H[k>>2]:k,b?H[a+16>>2]:a+16|0,s);if(b){break y}}if(i>>>0>>0){break x}break w}if((b|0)>=0){break w}}if(!h){H[p+12>>2]=f;a=f+4|0;break e}H[p+12>>2]=a;break e}b=H[e>>2];if(!b){H[p+12>>2]=e;a=e;break e}h=(n|0)<0?H[k>>2]:k;f=e;while(1){a=b;b=I[b+27|0];e=b<<24>>24<0;b=e?H[a+20>>2]:b;k=b>>>0>>0;z:{A:{B:{C:{n=k?b:i;D:{if(n){e=e?H[a+16>>2]:a+16|0;j=Fa(h,e,n);if(!j){if(b>>>0>i>>>0){break D}break C}if((j|0)>=0){break C}break D}if(b>>>0<=i>>>0){break B}}f=a;b=H[a>>2];if(b){continue}break g}b=Fa(e,h,n);if(b){break A}}if(k){break z}break g}if((b|0)>=0){break g}}f=a+4|0;b=H[a+4>>2];if(b){continue}break}}H[p+12>>2]=a;a=f;break e}H[p+12>>2]=f;H[a>>2]=f}f=a;a=H[a>>2];if(a){b=0}else{a=pa(40);b=a+16|0;E:{if(F[c+27|0]>=0){e=H[c+20>>2];H[b>>2]=H[c+16>>2];H[b+4>>2]=e;H[b+8>>2]=H[c+24>>2];break E}za(b,H[c+16>>2],H[c+20>>2])}b=a+28|0;F:{if(F[c+39|0]>=0){e=H[c+32>>2];H[b>>2]=H[c+28>>2];H[b+4>>2]=e;H[b+8>>2]=H[c+36>>2];break F}za(b,H[c+28>>2],H[c+32>>2])}H[a+8>>2]=H[p+12>>2];H[a>>2]=0;H[a+4>>2]=0;H[f>>2]=a;b=a;e=H[H[r>>2]>>2];if(e){H[r>>2]=e;b=H[f>>2]}Sb(H[r+4>>2],b);H[r+8>>2]=H[r+8>>2]+1;b=1}F[x+12|0]=b;H[x+8>>2]=a;ca=p+16|0;b=H[c+4>>2];G:{if(b){while(1){c=b;b=H[b>>2];if(b){continue}break G}}while(1){a=c;c=H[c+8>>2];if((a|0)!=H[c>>2]){continue}break}}if((c|0)!=(z|0)){continue}break}}H[g+8>>2]=d;H[g>>2]=0;H[g+4>>2]=0;H[o>>2]=g;c=g;a=H[H[u>>2]>>2];if(a){H[u>>2]=a;c=H[o>>2]}Sb(H[u+4>>2],c);H[u+8>>2]=H[u+8>>2]+1;a=1}F[l+44|0]=a;H[l+40>>2]=g;ca=x+16|0;c=H[l+40>>2];Kb(t|4,H[l+16>>2]);Kb(y,H[l+28>>2])}f=ca-48|0;ca=f;d=f+8|0;g=ca-32|0;ca=g;o=g+32|0;b=o;a=g+21|0;H:{if((b|0)==(a|0)){break H}}e=b-a|0;I:{if((e|0)<=9){h=61;if((e|0)<(K[3660]<=1|0)){break I}}F[a|0]=49;b=a+1|0;h=0}H[g+12>>2]=h;H[g+8>>2]=b;h=ca-16|0;ca=h;e=ca-16|0;ca=e;J:{q=H[g+8>>2];g=q-a|0;if(g>>>0<=2147483631){K:{if(g>>>0<11){F[d+11|0]=g|I[d+11|0]&128;F[d+11|0]=I[d+11|0]&127;b=d;break K}t=e+8|0;if(g>>>0>=11){k=g+16&-16;b=k-1|0;b=(b|0)==11?k:b}else{b=10}Zb(t,b+1|0);b=H[e+8>>2];H[d>>2]=b;H[d+8>>2]=H[d+8>>2]&-2147483648|H[e+12>>2]&2147483647;H[d+8>>2]=H[d+8>>2]|-2147483648;H[d+4>>2]=g}while(1){if((a|0)!=(q|0)){F[b|0]=I[a|0];b=b+1|0;a=a+1|0;continue}break}F[e+7|0]=0;F[b|0]=I[e+7|0];ca=e+16|0;break J}Na();v()}ca=h+16|0;ca=o;H[f+32>>2]=m;L:{M:{a=c+20|0;d=H[a+4>>2];N:{if(!d){g=a+4|0;c=g;break N}b=I[m+11|0];c=b<<24>>24<0;e=c?H[m>>2]:m;b=c?H[m+4>>2]:b;while(1){c=d;d=I[c+27|0];g=d<<24>>24<0;d=g?H[c+20>>2]:d;o=d>>>0>>0;O:{P:{Q:{R:{h=o?d:b;S:{if(h){g=g?H[c+16>>2]:c+16|0;q=Fa(e,g,h);if(!q){if(b>>>0>>0){break S}break R}if((q|0)>=0){break R}break S}if(b>>>0>=d>>>0){break Q}}g=c;d=H[c>>2];if(d){continue}break N}d=Fa(g,e,h);if(d){break P}}if(o){break O}break M}if((d|0)>=0){break M}}d=H[c+4>>2];if(d){continue}break}g=c+4|0}d=pa(40);e=d+16|0;b=H[f+32>>2];T:{if(F[b+11|0]>=0){o=H[b+4>>2];H[e>>2]=H[b>>2];H[e+4>>2]=o;H[e+8>>2]=H[b+8>>2];break T}za(e,H[b>>2],H[b+4>>2])}H[d+8>>2]=c;H[d>>2]=0;H[d+4>>2]=0;H[d+36>>2]=0;H[d+28>>2]=0;H[d+32>>2]=0;H[g>>2]=d;c=d;b=H[H[a>>2]>>2];if(b){H[a>>2]=b;c=H[g>>2]}Sb(H[a+4>>2],c);H[a+8>>2]=H[a+8>>2]+1;a=1;break L}d=c;a=0}F[f+44|0]=a;H[f+40>>2]=d;a=H[f+40>>2];if(F[a+39|0]<0){oa(H[a+28>>2])}b=H[f+12>>2];H[a+28>>2]=H[f+8>>2];H[a+32>>2]=b;H[a+36>>2]=H[f+16>>2];ca=f+48|0;ca=l+48|0;if(F[m+11|0]<0){oa(H[m>>2])}ca=m+16|0}function Bd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=H[b+8>>2];e=H[b+12>>2];g=H[b+20>>2];h=H[b+16>>2];k=h+4|0;g=k>>>0<4?g+1|0:g;a:{if(j>>>0>>0&(e|0)<=(g|0)|(e|0)<(g|0)){break a}h=h+H[b>>2]|0;H[a>>2]=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);h=H[b+20>>2];e=h;j=H[b+16>>2];g=j+4|0;h=g>>>0<4?e+1|0:e;H[b+16>>2]=g;H[b+20>>2]=h;if(K[a>>2]>32){break a}l=H[b+8>>2];k=H[b+12>>2];h=e;e=j+8|0;h=e>>>0<8?h+1|0:h;if(e>>>0>l>>>0&(h|0)>=(k|0)|(h|0)>(k|0)){break a}h=H[b>>2]+g|0;g=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);H[a+4>>2]=g;h=H[b+20>>2];e=H[b+16>>2]+4|0;h=e>>>0<4?h+1|0:h;H[b+16>>2]=e;H[b+20>>2]=h;if(!g){return 1}if(d>>>0>>0){break a}H[a+8>>2]=0;if(!ua(a+16|0,b)){break a}if(!ua(a+36|0,b)){break a}if(!ua(a+56|0,b)){break a}if(!ua(a+76|0,b)){break a}s=H[a+4>>2];h=c;b=0;g=0;e=ca-32|0;ca=e;d=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}c=a<<2;b=pa(c);H[e+8>>2]=b;g=b+c|0;H[e+16>>2]=g;ra(b,0,c);H[e+12>>2]=g}c=H[d+120>>2];i=H[c>>2];if(i){H[c+4>>2]=i;oa(i);g=H[e+12>>2];b=H[e+8>>2];a=H[d+12>>2]}H[c+4>>2]=g;H[c>>2]=b;H[c+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;f=pa(a);H[e+8>>2]=f;b=a+f|0;H[e+16>>2]=b;ra(f,0,a);H[e+12>>2]=b}a=H[d+132>>2];c=H[a>>2];if(c){H[a+4>>2]=c;oa(c);f=H[e+8>>2];b=H[e+12>>2]}H[a+4>>2]=b;H[a>>2]=f;H[a+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);a=H[e+24>>2]+H[e+28>>2]|0;b=(a>>>0)/341|0;a=H[H[e+12>>2]+(b<<2)>>2]+N(a-N(b,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=s;c=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}while(1){b=H[e+12>>2];f=H[e+24>>2];k=a-1|0;c=f+k|0;i=(c>>>0)/341|0;c=H[b+(i<<2)>>2]+N(c-N(i,341)|0,12)|0;g=H[c+8>>2];i=H[c+4>>2];j=H[c>>2];H[e+28>>2]=k;c=H[e+16>>2];if((((b|0)!=(c|0)?N(c-b>>2,341)-1|0:0)-(a+f|0)|0)+1>>>0>=682){oa(H[c-4>>2]);H[e+16>>2]=H[e+16>>2]-4}c=0;if(j>>>0>s>>>0){break e}b=H[d+12>>2];a=(b-1|0)!=(i|0)?i+1|0:0;if(a>>>0>=b>>>0){break e}f=N(g,12);o=f+H[d+132>>2]|0;k=f+H[d+120>>2]|0;i=H[d>>2];l=a<<2;m=H[l+H[o>>2]>>2];f:{g:{if((i|0)==(m|0)){if(!j){break g}o=0;b=H[h+20>>2];g=H[h+16>>2];if((b|0)==(g|0)){a=H[d+8>>2];H[h+28>>2]=j+H[h+28>>2];H[d+8>>2]=a+j;break g}while(1){c=(b|0)==(g|0);a=b;i=0;b=g;h:{if(c){break h}while(1){f=H[h+28>>2];b=a;c=N(i,20)+g|0;l=H[c>>2];if(!I[l+84|0]){f=H[H[l+68>>2]+(f<<2)>>2]}if(K[l+80>>2]<=f>>>0){break h}m=H[k>>2]+(H[c+4>>2]<<2)|0;g=H[c+12>>2];b=m;i:{if(g>>>0>3){break i}a=0;b=H[h+12>>2];if(!H[c+16>>2]){break i}while(1){b=qa(b,m+(a<<2)|0,g);g=H[c+12>>2];b=b+g|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[h+12>>2]}a=H[l+40>>2];qa(H[H[l>>2]>>2]+N(a,f)|0,b,a);i=i+1|0;a=H[h+20>>2];b=a;g=H[h+16>>2];if(i>>>0<(b-g|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[d+8>>2]=H[d+8>>2]+1;o=o+1|0;if((j|0)!=(o|0)){continue}break}break g}j:{k:{l:{m:{if(j>>>0<=2){c=H[d+108>>2];H[c>>2]=a;f=1;b=H[d+12>>2];if(b>>>0>1){break m}break j}if(K[d+8>>2]>K[d+4>>2]){break e}b=H[d+120>>2];n=g+1|0;o=N(n,12);p=b+o|0;if((p|0)!=(k|0)){Aa(p,H[k>>2],H[k+4>>2]);b=H[d+120>>2]}b=l+H[b+o>>2]|0;H[b>>2]=H[b>>2]+(1<>2];m=32-i|0;n:{if((b|0)<=(m|0)){k=H[d+28>>2];if((k|0)==H[d+20>>2]){break l}m=H[k>>2];p=b+i|0;H[d+32>>2]=p;b=m<>>32-b|0;if((p|0)!=32){break n}H[d+32>>2]=0;H[d+28>>2]=k+4;break n}k=H[d+28>>2];p=k+4|0;if((p|0)==H[d+20>>2]){break l}r=H[k>>2];H[d+28>>2]=p;m=b-m|0;H[d+32>>2]=m;b=H[k+4>>2]>>>32-m|r<>>32-b}i=j>>>1|0;if(i>>>0>>0){break e}break k}while(1){a=(b-1|0)!=(a|0)?a+1|0:0;H[c+(f<<2)>>2]=a;b=H[d+12>>2];f=f+1|0;if(b>>>0>f>>>0){continue}break}break j}i=j>>>1|0;b=0}o:{p:{b=i-b|0;c=j-b|0;q:{if((c|0)==(b|0)){c=b;break q}i=H[d+88>>2];if((i|0)==H[d+80>>2]){break p}j=H[i>>2];k=H[d+92>>2];m=k+1|0;H[d+92>>2]=m;j=j&-2147483648>>>k;r:{if((m|0)==32){H[d+92>>2]=0;H[d+88>>2]=i+4;if(j){break r}break p}if(!j){break p}}}i=c;c=b;break o}i=b}b=H[d+132>>2];j=b+f|0;f=H[j>>2];k=f+l|0;H[k>>2]=H[k>>2]+1;Aa(b+o|0,f,H[j+4>>2]);if(c){b=H[e+28>>2]+H[e+24>>2]|0;j=H[e+16>>2];f=H[e+12>>2];if((b|0)==(((f|0)!=(j|0)?N(j-f>>2,341)-1|0:0)|0)){xa(e+8|0);f=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}j=(b>>>0)/341|0;b=H[(j<<2)+f>>2]+N(b-N(j,341)|0,12)|0;H[b+8>>2]=g;H[b+4>>2]=a;H[b>>2]=c;H[e+28>>2]=H[e+28>>2]+1}if(!i){break g}b=H[e+28>>2]+H[e+24>>2]|0;c=H[e+16>>2];f=H[e+12>>2];if((b|0)==(((c|0)!=(f|0)?N(c-f>>2,341)-1|0:0)|0)){xa(e+8|0);f=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}c=(b>>>0)/341|0;b=H[(c<<2)+f>>2]+N(b-N(c,341)|0,12)|0;H[b+8>>2]=n;H[b+4>>2]=a;H[b>>2]=i;a=H[e+28>>2]+1|0;H[e+28>>2]=a;break f}m=0;if(!j){break g}while(1){if(H[d+12>>2]){i=H[d+40>>2];p=H[o>>2];c=H[d+96>>2];r=H[d+108>>2];a=0;while(1){g=r+(a<<2)|0;H[c+(H[g>>2]<<2)>>2]=0;b=H[d>>2];f=H[g>>2]<<2;l=H[f+p>>2];s:{if((b|0)==(l|0)){break s}f=c+f|0;b=b-l|0;l=H[d+52>>2];q=32-l|0;if((b|0)<=(q|0)){n=H[d+48>>2];if((n|0)==(i|0)){c=0;break e}H[f>>2]=H[n>>2]<>>32-b;b=b+H[d+52>>2]|0;H[d+52>>2]=b;if((b|0)!=32){break s}H[d+52>>2]=0;H[d+48>>2]=n+4;break s}n=H[d+48>>2];t=n+4|0;if((i|0)==(t|0)){c=0;break e}u=H[n>>2];H[d+48>>2]=t;q=b-q|0;H[d+52>>2]=q;H[f>>2]=H[n+4>>2]>>>32-q|u<>>32-b}b=H[g>>2]<<2;g=b+c|0;H[g>>2]=H[g>>2]|H[b+H[k>>2]>>2];a=a+1|0;if(a>>>0>2]){continue}break}}i=0;a=H[h+16>>2];t:{if((a|0)==H[h+20>>2]){break t}while(1){f=H[h+28>>2];c=N(i,20)+a|0;l=H[c>>2];if(!I[l+84|0]){f=H[H[l+68>>2]+(f<<2)>>2]}if(K[l+80>>2]<=f>>>0){break t}n=H[d+96>>2]+(H[c+4>>2]<<2)|0;g=H[c+12>>2];b=n;u:{if(g>>>0>3){break u}a=0;b=H[h+12>>2];if(!H[c+16>>2]){break u}while(1){b=qa(b,n+(a<<2)|0,g);g=H[c+12>>2];b=b+g|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[h+12>>2]}a=H[l+40>>2];qa(H[H[l>>2]>>2]+N(a,f)|0,b,a);i=i+1|0;a=H[h+16>>2];if(i>>>0<(H[h+20>>2]-a|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[d+8>>2]=H[d+8>>2]+1;m=m+1|0;if((j|0)!=(m|0)){continue}break}}a=H[e+28>>2]}if(a){continue}break}c=1}H[e+28>>2]=0;f=H[e+16>>2];a=H[e+12>>2];b=f-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;f=H[e+16>>2];b=f-a|0;if(b>>>0>8){continue}break}}g=170;v:{switch((b>>>2|0)-1|0){case 1:g=341;case 0:H[e+24>>2]=g;break;default:break v}}w:{if((a|0)==(f|0)){break w}while(1){oa(H[a>>2]);a=a+4|0;if((f|0)!=(a|0)){continue}break}a=H[e+16>>2];b=H[e+12>>2];if((a|0)==(b|0)){break w}H[e+16>>2]=a+((b-a|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;break b}sa();v()}sa();v()}i=c}return i}function zd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=H[b+8>>2];l=H[b+12>>2];k=H[b+20>>2];i=H[b+16>>2];f=i+4|0;k=f>>>0<4?k+1|0:k;a:{if(f>>>0>j>>>0&(k|0)>=(l|0)|(k|0)>(l|0)){break a}i=i+H[b>>2]|0;H[a>>2]=I[i|0]|I[i+1|0]<<8|(I[i+2|0]<<16|I[i+3|0]<<24);i=H[b+20>>2];j=i;f=H[b+16>>2];i=f+4|0;l=i>>>0<4?j+1|0:j;H[b+16>>2]=i;H[b+20>>2]=l;if(K[a>>2]>32){break a}l=H[b+8>>2];k=H[b+12>>2];f=f+8|0;j=f>>>0<8?j+1|0:j;if((k|0)<=(j|0)&f>>>0>l>>>0|(k|0)<(j|0)){break a}i=H[b>>2]+i|0;f=I[i|0]|I[i+1|0]<<8|(I[i+2|0]<<16|I[i+3|0]<<24);H[a+4>>2]=f;j=H[b+20>>2];i=H[b+16>>2]+4|0;j=i>>>0<4?j+1|0:j;H[b+16>>2]=i;H[b+20>>2]=j;if(!f){return 1}if(d>>>0>>0){break a}H[a+8>>2]=0;if(!ua(a+16|0,b)){break a}if(!ua(a+36|0,b)){break a}if(!ua(a+56|0,b)){break a}if(!ua(a+76|0,b)){break a}t=H[a+4>>2];i=c;b=0;c=0;e=ca-32|0;ca=e;f=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}d=a<<2;b=pa(d);H[e+8>>2]=b;c=b+d|0;H[e+16>>2]=c;ra(b,0,d);H[e+12>>2]=c}g=H[f+120>>2];d=H[g>>2];if(d){H[g+4>>2]=d;oa(d);c=H[e+12>>2];b=H[e+8>>2];a=H[f+12>>2]}H[g+4>>2]=c;H[g>>2]=b;H[g+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;h=pa(a);H[e+8>>2]=h;b=a+h|0;H[e+16>>2]=b;ra(h,0,a);H[e+12>>2]=b}c=H[f+132>>2];a=H[c>>2];if(a){H[c+4>>2]=a;oa(a);h=H[e+8>>2];b=H[e+12>>2]}H[c+4>>2]=b;H[c>>2]=h;H[c+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);b=H[e+24>>2]+H[e+28>>2]|0;a=(b>>>0)/341|0;a=H[H[e+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=t;d=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}while(1){j=H[e+12>>2];g=H[e+24>>2];d=a-1|0;c=g+d|0;b=(c>>>0)/341|0;b=H[j+(b<<2)>>2]+N(c-N(b,341)|0,12)|0;n=H[b+8>>2];c=H[b+4>>2];m=H[b>>2];H[e+28>>2]=d;b=H[e+16>>2];if((((b|0)!=(j|0)?N(b-j>>2,341)-1|0:0)-(a+g|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[e+16>>2]=H[e+16>>2]-4}if(m>>>0>t>>>0){d=0;break e}d=0;b=H[f+12>>2];a=(c|0)!=(b-1|0)?c+1|0:0;if(a>>>0>=b>>>0){break e}b=H[f+120>>2];o=N(n,12);q=b+o|0;g=H[f>>2];h=a<<2;l=o+H[f+132>>2]|0;c=H[h+H[l>>2]>>2];f:{g:{if((g|0)==(c|0)){if(!m){break g}h=0;b=H[i+20>>2];c=H[i+16>>2];if((b|0)==(c|0)){a=H[f+8>>2];H[i+28>>2]=m+H[i+28>>2];H[f+8>>2]=a+m;break g}while(1){d=(b|0)==(c|0);a=b;g=0;b=c;h:{if(d){break h}while(1){d=H[i+28>>2];b=a;k=N(g,20)+c|0;l=H[k>>2];if(!I[l+84|0]){d=H[H[l+68>>2]+(d<<2)>>2]}if(K[l+80>>2]<=d>>>0){break h}j=H[q>>2]+(H[k+4>>2]<<2)|0;c=H[k+12>>2];b=j;i:{if(c>>>0>3){break i}a=0;b=H[i+12>>2];if(!H[k+16>>2]){break i}while(1){b=qa(b,j+(a<<2)|0,c);c=H[k+12>>2];b=b+c|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[i+12>>2]}a=H[l+40>>2];qa(H[H[l>>2]>>2]+N(a,d)|0,b,a);g=g+1|0;a=H[i+20>>2];b=a;c=H[i+16>>2];if(g>>>0<(b-c|0)/20>>>0){continue}break}}H[i+28>>2]=H[i+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;h=h+1|0;if((m|0)!=(h|0)){continue}break}break g}j:{k:{l:{m:{if(m>>>0<=2){c=H[f+108>>2];H[c>>2]=a;h=1;b=H[f+12>>2];if(b>>>0>1){break m}break j}if(K[f+8>>2]>K[f+4>>2]){break e}j=b;b=o+12|0;Aa(j+b|0,H[q>>2],H[q+4>>2]);b=h+H[b+H[f+120>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<>2];g=32-l|0;n:{if((k|0)<=(g|0)){g=H[f+28>>2];if((g|0)==H[f+20>>2]){break l}c=H[g>>2];b=k+l|0;H[f+32>>2]=b;c=c<>>32-k|0;if((b|0)!=32){break n}H[f+32>>2]=0;H[f+28>>2]=g+4;break n}j=H[f+28>>2];b=j+4|0;if((b|0)==H[f+20>>2]){break l}c=H[j>>2];H[f+28>>2]=b;b=k-g|0;H[f+32>>2]=b;c=H[j+4>>2]>>>32-b|c<>>32-k}g=m>>>1|0;if(g>>>0>>0){break e}break k}while(1){a=(b-1|0)!=(a|0)?a+1|0:0;H[c+(h<<2)>>2]=a;b=H[f+12>>2];h=h+1|0;if(b>>>0>h>>>0){continue}break}break j}g=m>>>1|0;c=0}k=n+1|0;o:{p:{b=g-c|0;c=m-b|0;q:{if((c|0)==(b|0)){c=b;break q}l=H[f+88>>2];if((l|0)==H[f+80>>2]){break p}j=H[l>>2];g=H[f+92>>2];d=g+1|0;H[f+92>>2]=d;g=j&-2147483648>>>g;r:{if((d|0)==32){H[f+92>>2]=0;H[f+88>>2]=l+4;if(g){break r}break p}if(!g){break p}}}g=c;c=b;break o}g=b}l=H[f+132>>2];j=l+o|0;d=H[j>>2];b=d+h|0;H[b>>2]=H[b>>2]+1;Aa(l+N(k,12)|0,d,H[j+4>>2]);if(c){b=H[e+28>>2]+H[e+24>>2]|0;d=H[e+16>>2];h=H[e+12>>2];if((b|0)==(((d|0)!=(h|0)?N(d-h>>2,341)-1|0:0)|0)){xa(e+8|0);h=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}d=(b>>>0)/341|0;b=H[(d<<2)+h>>2]+N(b-N(d,341)|0,12)|0;H[b+8>>2]=n;H[b+4>>2]=a;H[b>>2]=c;H[e+28>>2]=H[e+28>>2]+1}if(!g){break g}b=H[e+28>>2]+H[e+24>>2]|0;c=H[e+16>>2];h=H[e+12>>2];if((b|0)==(((c|0)!=(h|0)?N(c-h>>2,341)-1|0:0)|0)){xa(e+8|0);h=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}c=(b>>>0)/341|0;b=H[(c<<2)+h>>2]+N(b-N(c,341)|0,12)|0;H[b+8>>2]=k;H[b+4>>2]=a;H[b>>2]=g;a=H[e+28>>2]+1|0;H[e+28>>2]=a;break f}r=0;if(!m){break g}while(1){if(H[f+12>>2]){u=H[f+40>>2];j=H[l>>2];s=H[f+96>>2];g=H[f+108>>2];a=0;while(1){n=(a<<2)+g|0;H[s+(H[n>>2]<<2)>>2]=0;d=H[f>>2];c=H[n>>2]<<2;b=H[c+j>>2];s:{if((d|0)==(b|0)){break s}o=c+s|0;p=d-b|0;h=H[f+52>>2];d=32-h|0;if((p|0)<=(d|0)){c=H[f+48>>2];if((c|0)==(u|0)){d=0;break e}H[o>>2]=H[c>>2]<>>32-p;b=p+H[f+52>>2]|0;H[f+52>>2]=b;if((b|0)!=32){break s}H[f+52>>2]=0;H[f+48>>2]=c+4;break s}k=H[f+48>>2];b=k+4|0;if((u|0)==(b|0)){d=0;break e}c=H[k>>2];H[f+48>>2]=b;b=p-d|0;H[f+52>>2]=b;H[o>>2]=H[k+4>>2]>>>32-b|c<>>32-p}c=H[n>>2]<<2;b=c+s|0;H[b>>2]=H[b>>2]|H[c+H[q>>2]>>2];a=a+1|0;if(a>>>0>2]){continue}break}}g=0;a=H[i+16>>2];t:{if((a|0)==H[i+20>>2]){break t}while(1){d=H[i+28>>2];h=N(g,20)+a|0;k=H[h>>2];if(!I[k+84|0]){d=H[H[k+68>>2]+(d<<2)>>2]}if(K[k+80>>2]<=d>>>0){break t}j=H[f+96>>2]+(H[h+4>>2]<<2)|0;c=H[h+12>>2];b=j;u:{if(c>>>0>3){break u}a=0;b=H[i+12>>2];if(!H[h+16>>2]){break u}while(1){b=qa(b,j+(a<<2)|0,c);c=H[h+12>>2];b=b+c|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[i+12>>2]}a=H[k+40>>2];qa(H[H[k>>2]>>2]+N(a,d)|0,b,a);g=g+1|0;a=H[i+16>>2];if(g>>>0<(H[i+20>>2]-a|0)/20>>>0){continue}break}}H[i+28>>2]=H[i+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;r=r+1|0;if((m|0)!=(r|0)){continue}break}}a=H[e+28>>2]}if(a){continue}break}d=1}H[e+28>>2]=0;h=H[e+16>>2];a=H[e+12>>2];b=h-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;h=H[e+16>>2];b=h-a|0;if(b>>>0>8){continue}break}}c=170;v:{switch((b>>>2|0)-1|0){case 1:c=341;case 0:H[e+24>>2]=c;break;default:break v}}w:{if((a|0)==(h|0)){break w}while(1){oa(H[a>>2]);a=a+4|0;if((h|0)!=(a|0)){continue}break}b=H[e+16>>2];a=H[e+12>>2];if((b|0)==(a|0)){break w}H[e+16>>2]=b+((a-b|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;g=d;break b}sa();v()}sa();v()}}return g}function wd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;i=H[b+8>>2];j=H[b+12>>2];n=H[b+20>>2];e=H[b+16>>2];h=e+4|0;n=h>>>0<4?n+1|0:n;a:{if(i>>>0>>0&(j|0)<=(n|0)|(j|0)<(n|0)){break a}e=e+H[b>>2]|0;H[a>>2]=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);e=H[b+20>>2];i=e;h=H[b+16>>2];e=h+4|0;j=e>>>0<4?i+1|0:i;H[b+16>>2]=e;H[b+20>>2]=j;if(K[a>>2]>32){break a}j=H[b+8>>2];n=H[b+12>>2];h=h+8|0;i=h>>>0<8?i+1|0:i;if(h>>>0>j>>>0&(i|0)>=(n|0)|(i|0)>(n|0)){break a}e=H[b>>2]+e|0;h=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[a+4>>2]=h;i=H[b+20>>2];e=H[b+16>>2]+4|0;i=e>>>0<4?i+1|0:i;H[b+16>>2]=e;H[b+20>>2]=i;if(!h){return 1}if(d>>>0>>0){break a}H[a+8>>2]=0;if(!sb(a+16|0,b)){break a}if(!ua(a+544|0,b)){break a}if(!ua(a+564|0,b)){break a}if(!ua(a+584|0,b)){break a}u=H[a+4>>2];d=c;b=0;c=0;f=ca-32|0;ca=f;g=a;a=H[a+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}e=a<<2;b=pa(e);H[f+8>>2]=b;c=b+e|0;H[f+16>>2]=c;ra(b,0,e);H[f+12>>2]=c}h=H[g+628>>2];e=H[h>>2];if(e){H[h+4>>2]=e;oa(e);c=H[f+12>>2];b=H[f+8>>2];a=H[g+12>>2]}H[h+4>>2]=c;H[h>>2]=b;H[h+8>>2]=H[f+16>>2];b=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;k=pa(a);H[f+8>>2]=k;b=a+k|0;H[f+16>>2]=b;ra(k,0,a);H[f+12>>2]=b}c=H[g+640>>2];a=H[c>>2];if(a){H[c+4>>2]=a;oa(a);k=H[f+8>>2];b=H[f+12>>2]}H[c+4>>2]=b;H[c>>2]=k;H[c+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);b=H[f+24>>2]+H[f+28>>2]|0;a=(b>>>0)/341|0;a=H[H[f+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=u;c=1;a=H[f+28>>2]+1|0;H[f+28>>2]=a;e:{if(!a){break e}n=g+16|0;while(1){j=H[f+12>>2];h=H[f+24>>2];e=a-1|0;c=h+e|0;b=(c>>>0)/341|0;b=H[j+(b<<2)>>2]+N(c-N(b,341)|0,12)|0;q=H[b+8>>2];i=H[b+4>>2];o=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(j|0)?N(b-j>>2,341)-1|0:0)-(a+h|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}c=0;if(o>>>0>u>>>0){break e}a=H[g+12>>2];k=(i|0)!=(a-1|0)?i+1|0:0;if(k>>>0>=a>>>0){break e}p=N(q,12);w=p+H[g+640>>2]|0;r=p+H[g+628>>2]|0;h=H[g>>2];l=k<<2;e=H[l+H[w>>2]>>2];f:{g:{if((h|0)==(e|0)){if(!o){break g}c=H[d+16>>2];b=H[d+20>>2];m=0;while(1){e=(b|0)==(c|0);a=b;j=0;b=c;h:{if(e){break h}while(1){l=H[d+28>>2];b=a;i=N(j,20)+c|0;h=H[i>>2];if(!I[h+84|0]){l=H[H[h+68>>2]+(l<<2)>>2]}if(K[h+80>>2]<=l>>>0){break h}e=H[r>>2]+(H[i+4>>2]<<2)|0;c=H[i+12>>2];b=e;i:{if(c>>>0>3){break i}a=0;b=H[d+12>>2];if(!H[i+16>>2]){break i}while(1){b=qa(b,e+(a<<2)|0,c);c=H[i+12>>2];b=b+c|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[d+12>>2]}a=H[h+40>>2];qa(H[H[h>>2]>>2]+N(a,l)|0,b,a);a=H[d+20>>2];b=a;j=j+1|0;c=H[d+16>>2];if(j>>>0<(a-c|0)/20>>>0){continue}break}}H[d+28>>2]=H[d+28>>2]+1;H[g+8>>2]=H[g+8>>2]+1;m=m+1|0;if((o|0)!=(m|0)){continue}break}break g}j:{k:{l:{if(o>>>0<=2){c=H[g+616>>2];H[c>>2]=k;a=1;b=H[g+12>>2];if(b>>>0>1){break l}break j}if(K[g+8>>2]>K[g+4>>2]){break e}a=H[g+628>>2];j=q+1|0;m=N(j,12);b=a+m|0;if((b|0)!=(r|0)){Aa(b,H[r>>2],H[r+4>>2]);a=H[g+628>>2]}a=l+H[a+m>>2]|0;H[a>>2]=H[a>>2]+(1<>>1|0;break k}while(1){b=Ba((a<<4)+n|0)|b<<1;a=a+1|0;if((c|0)!=(a|0)){continue}break}a=o>>>1|0;if(b>>>0<=a>>>0){break k}c=0;break e}while(1){k=(b-1|0)!=(k|0)?k+1|0:0;H[c+(a<<2)>>2]=k;a=a+1|0;b=H[g+12>>2];if(a>>>0>>0){continue}break}break j}m:{n:{b=a-b|0;a=o-b|0;o:{if((a|0)==(b|0)){a=b;break o}i=H[g+596>>2];if((i|0)==H[g+588>>2]){break n}h=H[i>>2];e=H[g+600>>2];c=e+1|0;H[g+600>>2]=c;e=h&-2147483648>>>e;p:{if((c|0)==32){H[g+600>>2]=0;H[g+596>>2]=i+4;if(e){break p}break n}if(!e){break n}}}c=a;a=b;break m}c=b}i=H[g+640>>2];h=i+p|0;e=H[h>>2];b=e+l|0;H[b>>2]=H[b>>2]+1;Aa(i+m|0,e,H[h+4>>2]);if(a){m=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];b=H[f+12>>2];if((m|0)==(((b|0)!=(e|0)?N(e-b>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;e=H[f+12>>2]}else{e=b}b=(m>>>0)/341|0;b=H[e+(b<<2)>>2]+N(m-N(b,341)|0,12)|0;H[b+8>>2]=q;H[b+4>>2]=k;H[b>>2]=a;H[f+28>>2]=H[f+28>>2]+1}if(!c){break g}b=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];a=H[f+12>>2];if((b|0)==(((a|0)!=(e|0)?N(e-a>>2,341)-1|0:0)|0)){xa(f+8|0);b=H[f+24>>2]+H[f+28>>2]|0;e=H[f+12>>2]}else{e=a}a=(b>>>0)/341|0;a=H[e+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+8>>2]=j;H[a+4>>2]=k;H[a>>2]=c;a=H[f+28>>2]+1|0;H[f+28>>2]=a;break f}k=0;if(!o){break g}while(1){if(H[g+12>>2]){q=H[g+548>>2];i=H[w>>2];t=H[g+604>>2];h=H[g+616>>2];a=0;while(1){p=(a<<2)+h|0;H[t+(H[p>>2]<<2)>>2]=0;e=H[g>>2];c=H[p>>2]<<2;b=H[c+i>>2];q:{if((e|0)==(b|0)){break q}l=c+t|0;s=e-b|0;m=H[g+560>>2];e=32-m|0;if((s|0)<=(e|0)){c=H[g+556>>2];if((c|0)==(q|0)){c=0;break e}H[l>>2]=H[c>>2]<>>32-s;b=s+H[g+560>>2]|0;H[g+560>>2]=b;if((b|0)!=32){break q}H[g+560>>2]=0;H[g+556>>2]=c+4;break q}j=H[g+556>>2];b=j+4|0;if((q|0)==(b|0)){c=0;break e}c=H[j>>2];H[g+556>>2]=b;b=s-e|0;H[g+560>>2]=b;H[l>>2]=H[j+4>>2]>>>32-b|c<>>32-s}c=H[p>>2]<<2;b=c+t|0;H[b>>2]=H[b>>2]|H[c+H[r>>2]>>2];a=a+1|0;if(a>>>0>2]){continue}break}}j=0;a=H[d+16>>2];r:{if((a|0)==H[d+20>>2]){break r}while(1){l=H[d+28>>2];i=N(j,20)+a|0;h=H[i>>2];if(!I[h+84|0]){l=H[H[h+68>>2]+(l<<2)>>2]}if(K[h+80>>2]<=l>>>0){break r}e=H[g+604>>2]+(H[i+4>>2]<<2)|0;c=H[i+12>>2];b=e;s:{if(c>>>0>3){break s}a=0;b=H[d+12>>2];if(!H[i+16>>2]){break s}while(1){b=qa(b,e+(a<<2)|0,c);c=H[i+12>>2];b=b+c|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[d+12>>2]}a=H[h+40>>2];qa(H[H[h>>2]>>2]+N(a,l)|0,b,a);j=j+1|0;a=H[d+16>>2];if(j>>>0<(H[d+20>>2]-a|0)/20>>>0){continue}break}}H[d+28>>2]=H[d+28>>2]+1;H[g+8>>2]=H[g+8>>2]+1;k=k+1|0;if((o|0)!=(k|0)){continue}break}}a=H[f+28>>2]}if(a){continue}break}c=1}H[f+28>>2]=0;k=H[f+16>>2];a=H[f+12>>2];b=k-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[f+12>>2]+4|0;H[f+12>>2]=a;k=H[f+16>>2];b=k-a|0;if(b>>>0>8){continue}break}}d=170;t:{switch((b>>>2|0)-1|0){case 1:d=341;case 0:H[f+24>>2]=d;break;default:break t}}u:{if((a|0)==(k|0)){break u}while(1){oa(H[a>>2]);a=a+4|0;if((k|0)!=(a|0)){continue}break}b=H[f+16>>2];a=H[f+12>>2];if((b|0)==(a|0)){break u}H[f+16>>2]=b+((a-b|0)+3&-4)}a=H[f+8>>2];if(a){oa(a)}ca=f+32|0;break b}sa();v()}sa();v()}g=c}return g}function ud(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;i=H[b+8>>2];k=H[b+12>>2];o=H[b+20>>2];e=H[b+16>>2];h=e+4|0;o=h>>>0<4?o+1|0:o;a:{if(i>>>0>>0&(k|0)<=(o|0)|(k|0)<(o|0)){break a}e=e+H[b>>2]|0;H[a>>2]=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);e=H[b+20>>2];i=e;h=H[b+16>>2];e=h+4|0;k=e>>>0<4?i+1|0:i;H[b+16>>2]=e;H[b+20>>2]=k;if(K[a>>2]>32){break a}k=H[b+8>>2];o=H[b+12>>2];h=h+8|0;i=h>>>0<8?i+1|0:i;if(h>>>0>k>>>0&(i|0)>=(o|0)|(i|0)>(o|0)){break a}e=H[b>>2]+e|0;h=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[a+4>>2]=h;i=H[b+20>>2];e=H[b+16>>2]+4|0;i=e>>>0<4?i+1|0:i;H[b+16>>2]=e;H[b+20>>2]=i;if(!h){return 1}if(d>>>0>>0){break a}H[a+8>>2]=0;if(!sb(a+16|0,b)){break a}if(!ua(a+544|0,b)){break a}if(!ua(a+564|0,b)){break a}if(!ua(a+584|0,b)){break a}w=H[a+4>>2];d=c;b=0;c=0;f=ca-32|0;ca=f;g=a;a=H[a+12>>2];H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}e=a<<2;b=pa(e);H[f+8>>2]=b;c=b+e|0;H[f+16>>2]=c;ra(b,0,e);H[f+12>>2]=c}h=H[g+628>>2];e=H[h>>2];if(e){H[h+4>>2]=e;oa(e);c=H[f+12>>2];b=H[f+8>>2];a=H[g+12>>2]}H[h+4>>2]=c;H[h>>2]=b;H[h+8>>2]=H[f+16>>2];b=0;H[f+16>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;j=pa(a);H[f+8>>2]=j;b=a+j|0;H[f+16>>2]=b;ra(j,0,a);H[f+12>>2]=b}c=H[g+640>>2];a=H[c>>2];if(a){H[c+4>>2]=a;oa(a);j=H[f+8>>2];b=H[f+12>>2]}H[c+4>>2]=b;H[c>>2]=j;H[c+8>>2]=H[f+16>>2];H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;xa(f+8|0);b=H[f+24>>2]+H[f+28>>2]|0;a=(b>>>0)/341|0;a=H[H[f+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=w;c=1;a=H[f+28>>2]+1|0;H[f+28>>2]=a;e:{if(!a){break e}o=g+16|0;while(1){i=H[f+12>>2];h=H[f+24>>2];e=a-1|0;c=h+e|0;b=(c>>>0)/341|0;b=H[i+(b<<2)>>2]+N(c-N(b,341)|0,12)|0;q=H[b+8>>2];n=H[b>>2];H[f+28>>2]=e;b=H[f+16>>2];if((((b|0)!=(i|0)?N(b-i>>2,341)-1|0:0)-(a+h|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[f+16>>2]=H[f+16>>2]-4}c=0;if(n>>>0>w>>>0){break e}a=H[g+628>>2];p=N(q,12);t=p+H[g+640>>2]|0;j=Vd(g,n,t);if(j>>>0>=K[g+12>>2]){break e}r=a+p|0;h=H[g>>2];l=j<<2;e=H[l+H[t>>2]>>2];f:{g:{if((h|0)==(e|0)){if(!n){break g}c=H[d+16>>2];b=H[d+20>>2];m=0;while(1){e=(b|0)==(c|0);a=b;k=0;b=c;h:{if(e){break h}while(1){l=H[d+28>>2];b=a;i=N(k,20)+c|0;h=H[i>>2];if(!I[h+84|0]){l=H[H[h+68>>2]+(l<<2)>>2]}if(K[h+80>>2]<=l>>>0){break h}e=H[r>>2]+(H[i+4>>2]<<2)|0;c=H[i+12>>2];b=e;i:{if(c>>>0>3){break i}a=0;b=H[d+12>>2];if(!H[i+16>>2]){break i}while(1){b=qa(b,e+(a<<2)|0,c);c=H[i+12>>2];b=b+c|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[d+12>>2]}a=H[h+40>>2];qa(H[H[h>>2]>>2]+N(a,l)|0,b,a);a=H[d+20>>2];b=a;k=k+1|0;c=H[d+16>>2];if(k>>>0<(a-c|0)/20>>>0){continue}break}}H[d+28>>2]=H[d+28>>2]+1;H[g+8>>2]=H[g+8>>2]+1;m=m+1|0;if((n|0)!=(m|0)){continue}break}break g}j:{k:{l:{if(n>>>0<=2){c=H[g+616>>2];H[c>>2]=j;a=1;b=H[g+12>>2];if(b>>>0>1){break l}break j}if(K[g+8>>2]>K[g+4>>2]){break e}a=H[g+628>>2];k=q+1|0;m=N(k,12);b=a+m|0;if((b|0)!=(r|0)){Aa(b,H[r>>2],H[r+4>>2]);a=H[g+628>>2]}a=l+H[a+m>>2]|0;H[a>>2]=H[a>>2]+(1<>>1|0;break k}while(1){b=Ba((a<<4)+o|0)|b<<1;a=a+1|0;if((c|0)!=(a|0)){continue}break}a=n>>>1|0;if(b>>>0<=a>>>0){break k}c=0;break e}while(1){j=(b-1|0)!=(j|0)?j+1|0:0;H[c+(a<<2)>>2]=j;a=a+1|0;b=H[g+12>>2];if(a>>>0>>0){continue}break}break j}m:{n:{b=a-b|0;a=n-b|0;o:{if((a|0)==(b|0)){a=b;break o}i=H[g+596>>2];if((i|0)==H[g+588>>2]){break n}h=H[i>>2];e=H[g+600>>2];c=e+1|0;H[g+600>>2]=c;e=h&-2147483648>>>e;p:{if((c|0)==32){H[g+600>>2]=0;H[g+596>>2]=i+4;if(e){break p}break n}if(!e){break n}}}c=a;a=b;break m}c=b}i=H[g+640>>2];h=i+p|0;e=H[h>>2];b=e+l|0;H[b>>2]=H[b>>2]+1;Aa(i+m|0,e,H[h+4>>2]);if(a){m=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];b=H[f+12>>2];if((m|0)==(((b|0)!=(e|0)?N(e-b>>2,341)-1|0:0)|0)){xa(f+8|0);m=H[f+24>>2]+H[f+28>>2]|0;e=H[f+12>>2]}else{e=b}b=(m>>>0)/341|0;b=H[e+(b<<2)>>2]+N(m-N(b,341)|0,12)|0;H[b+8>>2]=q;H[b+4>>2]=j;H[b>>2]=a;H[f+28>>2]=H[f+28>>2]+1}if(!c){break g}b=H[f+28>>2]+H[f+24>>2]|0;e=H[f+16>>2];a=H[f+12>>2];if((b|0)==(((a|0)!=(e|0)?N(e-a>>2,341)-1|0:0)|0)){xa(f+8|0);b=H[f+24>>2]+H[f+28>>2]|0;e=H[f+12>>2]}else{e=a}a=(b>>>0)/341|0;a=H[e+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+8>>2]=k;H[a+4>>2]=j;H[a>>2]=c;a=H[f+28>>2]+1|0;H[f+28>>2]=a;break f}j=0;if(!n){break g}while(1){if(H[g+12>>2]){q=H[g+548>>2];i=H[t>>2];u=H[g+604>>2];h=H[g+616>>2];a=0;while(1){p=(a<<2)+h|0;H[u+(H[p>>2]<<2)>>2]=0;e=H[g>>2];c=H[p>>2]<<2;b=H[c+i>>2];q:{if((e|0)==(b|0)){break q}l=c+u|0;s=e-b|0;m=H[g+560>>2];e=32-m|0;if((s|0)<=(e|0)){c=H[g+556>>2];if((c|0)==(q|0)){c=0;break e}H[l>>2]=H[c>>2]<>>32-s;b=s+H[g+560>>2]|0;H[g+560>>2]=b;if((b|0)!=32){break q}H[g+560>>2]=0;H[g+556>>2]=c+4;break q}k=H[g+556>>2];b=k+4|0;if((q|0)==(b|0)){c=0;break e}c=H[k>>2];H[g+556>>2]=b;b=s-e|0;H[g+560>>2]=b;H[l>>2]=H[k+4>>2]>>>32-b|c<>>32-s}c=H[p>>2]<<2;b=c+u|0;H[b>>2]=H[b>>2]|H[c+H[r>>2]>>2];a=a+1|0;if(a>>>0>2]){continue}break}}k=0;a=H[d+16>>2];r:{if((a|0)==H[d+20>>2]){break r}while(1){l=H[d+28>>2];i=N(k,20)+a|0;h=H[i>>2];if(!I[h+84|0]){l=H[H[h+68>>2]+(l<<2)>>2]}if(K[h+80>>2]<=l>>>0){break r}e=H[g+604>>2]+(H[i+4>>2]<<2)|0;c=H[i+12>>2];b=e;s:{if(c>>>0>3){break s}a=0;b=H[d+12>>2];if(!H[i+16>>2]){break s}while(1){b=qa(b,e+(a<<2)|0,c);c=H[i+12>>2];b=b+c|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[d+12>>2]}a=H[h+40>>2];qa(H[H[h>>2]>>2]+N(a,l)|0,b,a);k=k+1|0;a=H[d+16>>2];if(k>>>0<(H[d+20>>2]-a|0)/20>>>0){continue}break}}H[d+28>>2]=H[d+28>>2]+1;H[g+8>>2]=H[g+8>>2]+1;j=j+1|0;if((n|0)!=(j|0)){continue}break}}a=H[f+28>>2]}if(a){continue}break}c=1}H[f+28>>2]=0;j=H[f+16>>2];a=H[f+12>>2];b=j-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[f+12>>2]+4|0;H[f+12>>2]=a;j=H[f+16>>2];b=j-a|0;if(b>>>0>8){continue}break}}d=170;t:{switch((b>>>2|0)-1|0){case 1:d=341;case 0:H[f+24>>2]=d;break;default:break t}}u:{if((a|0)==(j|0)){break u}while(1){oa(H[a>>2]);a=a+4|0;if((j|0)!=(a|0)){continue}break}b=H[f+16>>2];a=H[f+12>>2];if((b|0)==(a|0)){break u}H[f+16>>2]=b+((a-b|0)+3&-4)}a=H[f+8>>2];if(a){oa(a)}ca=f+32|0;break b}sa();v()}sa();v()}g=c}return g}function vd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;i=H[b+8>>2];k=H[b+12>>2];m=H[b+20>>2];f=H[b+16>>2];h=f+4|0;m=h>>>0<4?m+1|0:m;a:{if(i>>>0>>0&(k|0)<=(m|0)|(k|0)<(m|0)){break a}f=f+H[b>>2]|0;H[a>>2]=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);f=H[b+20>>2];i=f;h=H[b+16>>2];f=h+4|0;k=f>>>0<4?i+1|0:i;H[b+16>>2]=f;H[b+20>>2]=k;if(K[a>>2]>32){break a}k=H[b+8>>2];m=H[b+12>>2];h=h+8|0;i=h>>>0<8?i+1|0:i;if(h>>>0>k>>>0&(i|0)>=(m|0)|(i|0)>(m|0)){break a}f=f+H[b>>2]|0;h=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[a+4>>2]=h;i=H[b+20>>2];f=H[b+16>>2]+4|0;i=f>>>0<4?i+1|0:i;H[b+16>>2]=f;H[b+20>>2]=i;if(!h){return 1}if(d>>>0>>0){break a}H[a+8>>2]=0;if(!sb(a+16|0,b)){break a}if(!ua(a+544|0,b)){break a}if(!ua(a+564|0,b)){break a}if(!ua(a+584|0,b)){break a}u=H[a+4>>2];b=0;e=ca-32|0;ca=e;f=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}d=a<<2;b=pa(d);H[e+8>>2]=b;g=b+d|0;H[e+16>>2]=g;ra(b,0,d);H[e+12>>2]=g}h=H[f+628>>2];d=H[h>>2];if(d){H[h+4>>2]=d;oa(d);g=H[e+12>>2];b=H[e+8>>2];a=H[f+12>>2]}H[h+4>>2]=g;H[h>>2]=b;H[h+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;j=pa(a);H[e+8>>2]=j;b=a+j|0;H[e+16>>2]=b;ra(j,0,a);H[e+12>>2]=b}d=H[f+640>>2];a=H[d>>2];if(a){H[d+4>>2]=a;oa(a);j=H[e+8>>2];b=H[e+12>>2]}H[d+4>>2]=b;H[d>>2]=j;H[d+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);b=H[e+24>>2]+H[e+28>>2]|0;a=(b>>>0)/341|0;a=H[H[e+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=u;d=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}m=f+16|0;while(1){k=H[e+12>>2];h=H[e+24>>2];g=a-1|0;d=h+g|0;b=(d>>>0)/341|0;b=H[k+(b<<2)>>2]+N(d-N(b,341)|0,12)|0;q=H[b+8>>2];i=H[b+4>>2];n=H[b>>2];H[e+28>>2]=g;b=H[e+16>>2];if((((b|0)!=(k|0)?N(b-k>>2,341)-1|0:0)-(a+h|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[e+16>>2]=H[e+16>>2]-4}if(n>>>0>u>>>0){d=0;break e}d=0;a=H[f+12>>2];j=(i|0)!=(a-1|0)?i+1|0:0;if(j>>>0>=a>>>0){break e}a=H[f+628>>2];o=N(q,12);s=a+o|0;g=H[f>>2];l=j<<2;k=o+H[f+640>>2]|0;b=H[l+H[k>>2]>>2];f:{g:{if((g|0)==(b|0)){if(!n){break g}g=H[c+16>>2];b=H[c+20>>2];p=0;while(1){d=(b|0)==(g|0);a=b;j=0;b=g;h:{if(d){break h}while(1){d=H[c+28>>2];b=a;k=N(j,20)+g|0;i=H[k>>2];if(!I[i+84|0]){d=H[H[i+68>>2]+(d<<2)>>2]}if(K[i+80>>2]<=d>>>0){break h}h=H[s>>2]+(H[k+4>>2]<<2)|0;g=H[k+12>>2];b=h;i:{if(g>>>0>3){break i}a=0;b=H[c+12>>2];if(!H[k+16>>2]){break i}while(1){b=qa(b,h+(a<<2)|0,g);g=H[k+12>>2];b=b+g|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[c+12>>2]}a=H[i+40>>2];qa(H[H[i>>2]>>2]+N(a,d)|0,b,a);a=H[c+20>>2];b=a;j=j+1|0;g=H[c+16>>2];if(j>>>0<(a-g|0)/20>>>0){continue}break}}H[c+28>>2]=H[c+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;p=p+1|0;if((p|0)!=(n|0)){continue}break}break g}j:{k:{l:{if(n>>>0<=2){d=H[f+616>>2];H[d>>2]=j;a=1;b=H[f+12>>2];if(b>>>0>1){break l}break j}if(K[f+8>>2]>K[f+4>>2]){break e}d=a;a=o+12|0;Aa(d+a|0,H[s>>2],H[s+4>>2]);a=l+H[a+H[f+628>>2]>>2]|0;H[a>>2]=H[a>>2]+(1<>>1|0;break k}while(1){b=Ba((a<<4)+m|0)|b<<1;a=a+1|0;if((d|0)!=(a|0)){continue}break}a=n>>>1|0;if(b>>>0<=a>>>0){break k}d=0;break e}while(1){j=(b-1|0)!=(j|0)?j+1|0:0;H[d+(a<<2)>>2]=j;a=a+1|0;b=H[f+12>>2];if(a>>>0>>0){continue}break}break j}k=q+1|0;m:{n:{b=a-b|0;a=n-b|0;o:{if((a|0)==(b|0)){a=b;break o}i=H[f+596>>2];if((i|0)==H[f+588>>2]){break n}h=H[i>>2];g=H[f+600>>2];d=g+1|0;H[f+600>>2]=d;g=h&-2147483648>>>g;p:{if((d|0)==32){H[f+600>>2]=0;H[f+596>>2]=i+4;if(g){break p}break n}if(!g){break n}}}d=a;a=b;break m}d=b}i=H[f+640>>2];h=i+o|0;g=H[h>>2];b=g+l|0;H[b>>2]=H[b>>2]+1;Aa(i+N(k,12)|0,g,H[h+4>>2]);if(a){h=H[e+28>>2]+H[e+24>>2]|0;g=H[e+16>>2];b=H[e+12>>2];if((h|0)==(((b|0)!=(g|0)?N(g-b>>2,341)-1|0:0)|0)){xa(e+8|0);h=H[e+24>>2]+H[e+28>>2]|0;g=H[e+12>>2]}else{g=b}b=(h>>>0)/341|0;b=H[g+(b<<2)>>2]+N(h-N(b,341)|0,12)|0;H[b+8>>2]=q;H[b+4>>2]=j;H[b>>2]=a;H[e+28>>2]=H[e+28>>2]+1}if(!d){break g}b=H[e+28>>2]+H[e+24>>2]|0;g=H[e+16>>2];a=H[e+12>>2];if((b|0)==(((a|0)!=(g|0)?N(g-a>>2,341)-1|0:0)|0)){xa(e+8|0);b=H[e+24>>2]+H[e+28>>2]|0;g=H[e+12>>2]}else{g=a}a=(b>>>0)/341|0;a=H[g+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+8>>2]=k;H[a+4>>2]=j;H[a>>2]=d;a=H[e+28>>2]+1|0;H[e+28>>2]=a;break f}p=0;if(!n){break g}while(1){if(H[f+12>>2]){w=H[f+548>>2];i=H[k>>2];t=H[f+604>>2];h=H[f+616>>2];a=0;while(1){j=h+(a<<2)|0;H[(H[j>>2]<<2)+t>>2]=0;g=H[f>>2];d=H[j>>2]<<2;b=H[d+i>>2];q:{if((g|0)==(b|0)){break q}q=d+t|0;r=g-b|0;o=H[f+560>>2];g=32-o|0;if((r|0)<=(g|0)){d=H[f+556>>2];if((d|0)==(w|0)){d=0;break e}H[q>>2]=H[d>>2]<>>32-r;b=H[f+560>>2]+r|0;H[f+560>>2]=b;if((b|0)!=32){break q}H[f+560>>2]=0;H[f+556>>2]=d+4;break q}l=H[f+556>>2];b=l+4|0;if((b|0)==(w|0)){d=0;break e}d=H[l>>2];H[f+556>>2]=b;b=r-g|0;H[f+560>>2]=b;H[q>>2]=H[l+4>>2]>>>32-b|d<>>32-r}d=H[j>>2]<<2;b=d+t|0;H[b>>2]=H[b>>2]|H[d+H[s>>2]>>2];a=a+1|0;if(a>>>0>2]){continue}break}}j=0;a=H[c+16>>2];r:{if((a|0)==H[c+20>>2]){break r}while(1){d=H[c+28>>2];l=N(j,20)+a|0;i=H[l>>2];if(!I[i+84|0]){d=H[H[i+68>>2]+(d<<2)>>2]}if(K[i+80>>2]<=d>>>0){break r}h=H[f+604>>2]+(H[l+4>>2]<<2)|0;g=H[l+12>>2];b=h;s:{if(g>>>0>3){break s}a=0;b=H[c+12>>2];if(!H[l+16>>2]){break s}while(1){b=qa(b,h+(a<<2)|0,g);g=H[l+12>>2];b=b+g|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[c+12>>2]}a=H[i+40>>2];qa(H[H[i>>2]>>2]+N(a,d)|0,b,a);j=j+1|0;a=H[c+16>>2];if(j>>>0<(H[c+20>>2]-a|0)/20>>>0){continue}break}}H[c+28>>2]=H[c+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;p=p+1|0;if((p|0)!=(n|0)){continue}break}}a=H[e+28>>2]}if(a){continue}break}d=1}H[e+28>>2]=0;j=H[e+16>>2];a=H[e+12>>2];b=j-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;j=H[e+16>>2];b=j-a|0;if(b>>>0>8){continue}break}}g=170;t:{switch((b>>>2|0)-1|0){case 1:g=341;case 0:H[e+24>>2]=g;break;default:break t}}u:{if((a|0)==(j|0)){break u}while(1){oa(H[a>>2]);a=a+4|0;if((j|0)!=(a|0)){continue}break}b=H[e+16>>2];a=H[e+12>>2];if((b|0)==(a|0)){break u}H[e+16>>2]=b+((a-b|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;break b}sa();v()}sa();v()}g=d}return g}function yd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;j=H[b+8>>2];e=H[b+12>>2];g=H[b+20>>2];h=H[b+16>>2];l=h+4|0;g=l>>>0<4?g+1|0:g;a:{if(j>>>0>>0&(e|0)<=(g|0)|(e|0)<(g|0)){break a}h=h+H[b>>2]|0;H[a>>2]=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);h=H[b+20>>2];e=h;j=H[b+16>>2];g=j+4|0;h=g>>>0<4?e+1|0:e;H[b+16>>2]=g;H[b+20>>2]=h;if(K[a>>2]>32){break a}k=H[b+8>>2];l=H[b+12>>2];h=e;e=j+8|0;h=e>>>0<8?h+1|0:h;if(e>>>0>k>>>0&(h|0)>=(l|0)|(h|0)>(l|0)){break a}h=H[b>>2]+g|0;g=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);H[a+4>>2]=g;h=H[b+20>>2];e=H[b+16>>2]+4|0;h=e>>>0<4?h+1|0:h;H[b+16>>2]=e;H[b+20>>2]=h;if(!g){return 1}if(d>>>0>>0){break a}H[a+8>>2]=0;if(!ta(a+16|0,b)){break a}if(!ua(a+32|0,b)){break a}if(!ua(a+52|0,b)){break a}if(!ua(a+72|0,b)){break a}r=H[a+4>>2];h=c;b=0;g=0;e=ca-32|0;ca=e;d=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}c=a<<2;b=pa(c);H[e+8>>2]=b;g=b+c|0;H[e+16>>2]=g;ra(b,0,c);H[e+12>>2]=g}c=H[d+116>>2];i=H[c>>2];if(i){H[c+4>>2]=i;oa(i);g=H[e+12>>2];b=H[e+8>>2];a=H[d+12>>2]}H[c+4>>2]=g;H[c>>2]=b;H[c+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;f=pa(a);H[e+8>>2]=f;b=a+f|0;H[e+16>>2]=b;ra(f,0,a);H[e+12>>2]=b}a=H[d+128>>2];c=H[a>>2];if(c){H[a+4>>2]=c;oa(c);f=H[e+8>>2];b=H[e+12>>2]}H[a+4>>2]=b;H[a>>2]=f;H[a+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);a=H[e+24>>2]+H[e+28>>2]|0;b=(a>>>0)/341|0;a=H[H[e+12>>2]+(b<<2)>>2]+N(a-N(b,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=r;c=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}t=d+16|0;while(1){b=H[e+12>>2];f=H[e+24>>2];l=a-1|0;c=f+l|0;i=(c>>>0)/341|0;c=H[b+(i<<2)>>2]+N(c-N(i,341)|0,12)|0;g=H[c+8>>2];i=H[c+4>>2];j=H[c>>2];H[e+28>>2]=l;c=H[e+16>>2];if((((b|0)!=(c|0)?N(c-b>>2,341)-1|0:0)-(a+f|0)|0)+1>>>0>=682){oa(H[c-4>>2]);H[e+16>>2]=H[e+16>>2]-4}c=0;if(j>>>0>r>>>0){break e}b=H[d+12>>2];a=(b-1|0)!=(i|0)?i+1|0:0;if(a>>>0>=b>>>0){break e}f=N(g,12);o=f+H[d+128>>2]|0;l=f+H[d+116>>2]|0;i=H[d>>2];k=a<<2;n=H[k+H[o>>2]>>2];f:{if((i|0)==(n|0)){if(!j){break f}o=0;b=H[h+20>>2];g=H[h+16>>2];if((b|0)==(g|0)){a=H[d+8>>2];H[h+28>>2]=j+H[h+28>>2];H[d+8>>2]=a+j;break f}while(1){c=(b|0)==(g|0);a=b;i=0;b=g;g:{if(c){break g}while(1){f=H[h+28>>2];b=a;c=N(i,20)+g|0;k=H[c>>2];if(!I[k+84|0]){f=H[H[k+68>>2]+(f<<2)>>2]}if(K[k+80>>2]<=f>>>0){break g}n=H[l>>2]+(H[c+4>>2]<<2)|0;g=H[c+12>>2];b=n;h:{if(g>>>0>3){break h}a=0;b=H[h+12>>2];if(!H[c+16>>2]){break h}while(1){b=qa(b,n+(a<<2)|0,g);g=H[c+12>>2];b=b+g|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[h+12>>2]}a=H[k+40>>2];qa(H[H[k>>2]>>2]+N(a,f)|0,b,a);i=i+1|0;a=H[h+20>>2];b=a;g=H[h+16>>2];if(i>>>0<(b-g|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[d+8>>2]=H[d+8>>2]+1;o=o+1|0;if((j|0)!=(o|0)){continue}break}break f}i:{j:{k:{l:{if(j>>>0<=2){c=H[d+104>>2];H[c>>2]=a;f=1;b=H[d+12>>2];if(b>>>0>1){break l}break i}if(K[d+8>>2]>K[d+4>>2]){break e}b=H[d+116>>2];m=g+1|0;o=N(m,12);q=b+o|0;if((q|0)!=(l|0)){Aa(q,H[l>>2],H[l+4>>2]);b=H[d+116>>2]}b=k+H[b+o>>2]|0;H[b>>2]=H[b>>2]+(1<>2]=0;pc(t,Q(j)^31,e+4|0);b=j>>>1|0;i=H[e+4>>2];if(b>>>0>>0){break e}b=b-i|0;c=j-b|0;m:{if((c|0)==(b|0)){c=b;break m}i=H[d+84>>2];if((i|0)==H[d+76>>2]){break k}j=H[i>>2];l=H[d+88>>2];n=l+1|0;H[d+88>>2]=n;j=j&-2147483648>>>l;n:{if((n|0)==32){H[d+88>>2]=0;H[d+84>>2]=i+4;if(j){break n}break k}if(!j){break k}}}i=c;c=b;break j}while(1){a=(b-1|0)!=(a|0)?a+1|0:0;H[c+(f<<2)>>2]=a;b=H[d+12>>2];f=f+1|0;if(b>>>0>f>>>0){continue}break}break i}i=b}b=H[d+128>>2];j=b+f|0;f=H[j>>2];l=f+k|0;H[l>>2]=H[l>>2]+1;Aa(b+o|0,f,H[j+4>>2]);if(c){b=H[e+28>>2]+H[e+24>>2]|0;j=H[e+16>>2];f=H[e+12>>2];if((b|0)==(((f|0)!=(j|0)?N(j-f>>2,341)-1|0:0)|0)){xa(e+8|0);f=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}j=(b>>>0)/341|0;b=H[(j<<2)+f>>2]+N(b-N(j,341)|0,12)|0;H[b+8>>2]=g;H[b+4>>2]=a;H[b>>2]=c;H[e+28>>2]=H[e+28>>2]+1}if(!i){break f}b=H[e+28>>2]+H[e+24>>2]|0;c=H[e+16>>2];f=H[e+12>>2];if((b|0)==(((c|0)!=(f|0)?N(c-f>>2,341)-1|0:0)|0)){xa(e+8|0);f=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}c=(b>>>0)/341|0;b=H[(c<<2)+f>>2]+N(b-N(c,341)|0,12)|0;H[b+8>>2]=m;H[b+4>>2]=a;H[b>>2]=i;H[e+28>>2]=H[e+28>>2]+1;break f}n=0;if(!j){break f}while(1){if(H[d+12>>2]){i=H[d+36>>2];q=H[o>>2];c=H[d+92>>2];u=H[d+104>>2];a=0;while(1){g=(a<<2)+u|0;H[c+(H[g>>2]<<2)>>2]=0;b=H[d>>2];f=H[g>>2]<<2;k=H[f+q>>2];o:{if((b|0)==(k|0)){break o}f=c+f|0;b=b-k|0;k=H[d+48>>2];p=32-k|0;if((b|0)<=(p|0)){m=H[d+44>>2];if((m|0)==(i|0)){c=0;break e}H[f>>2]=H[m>>2]<>>32-b;b=b+H[d+48>>2]|0;H[d+48>>2]=b;if((b|0)!=32){break o}H[d+48>>2]=0;H[d+44>>2]=m+4;break o}m=H[d+44>>2];s=m+4|0;if((i|0)==(s|0)){c=0;break e}w=H[m>>2];H[d+44>>2]=s;p=b-p|0;H[d+48>>2]=p;H[f>>2]=H[m+4>>2]>>>32-p|w<>>32-b}b=H[g>>2]<<2;g=b+c|0;H[g>>2]=H[g>>2]|H[b+H[l>>2]>>2];a=a+1|0;if(a>>>0>2]){continue}break}}i=0;a=H[h+16>>2];p:{if((a|0)==H[h+20>>2]){break p}while(1){f=H[h+28>>2];c=N(i,20)+a|0;k=H[c>>2];if(!I[k+84|0]){f=H[H[k+68>>2]+(f<<2)>>2]}if(K[k+80>>2]<=f>>>0){break p}m=H[d+92>>2]+(H[c+4>>2]<<2)|0;g=H[c+12>>2];b=m;q:{if(g>>>0>3){break q}a=0;b=H[h+12>>2];if(!H[c+16>>2]){break q}while(1){b=qa(b,m+(a<<2)|0,g);g=H[c+12>>2];b=b+g|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[h+12>>2]}a=H[k+40>>2];qa(H[H[k>>2]>>2]+N(a,f)|0,b,a);i=i+1|0;a=H[h+16>>2];if(i>>>0<(H[h+20>>2]-a|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[d+8>>2]=H[d+8>>2]+1;n=n+1|0;if((j|0)!=(n|0)){continue}break}}a=H[e+28>>2];if(a){continue}break}c=1}H[e+28>>2]=0;f=H[e+16>>2];a=H[e+12>>2];b=f-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;f=H[e+16>>2];b=f-a|0;if(b>>>0>8){continue}break}}g=170;r:{switch((b>>>2|0)-1|0){case 1:g=341;case 0:H[e+24>>2]=g;break;default:break r}}s:{if((a|0)==(f|0)){break s}while(1){oa(H[a>>2]);a=a+4|0;if((f|0)!=(a|0)){continue}break}a=H[e+16>>2];b=H[e+12>>2];if((a|0)==(b|0)){break s}H[e+16>>2]=a+((b-a|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;break b}sa();v()}sa();v()}i=c}return i}function xd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;i=H[b+8>>2];k=H[b+12>>2];n=H[b+20>>2];h=H[b+16>>2];f=h+4|0;n=f>>>0<4?n+1|0:n;a:{if((k|0)<=(n|0)&f>>>0>i>>>0|(k|0)<(n|0)){break a}h=h+H[b>>2]|0;H[a>>2]=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);h=H[b+20>>2];i=h;f=H[b+16>>2];h=f+4|0;k=h>>>0<4?i+1|0:i;H[b+16>>2]=h;H[b+20>>2]=k;if(K[a>>2]>32){break a}k=H[b+8>>2];n=H[b+12>>2];f=f+8|0;i=f>>>0<8?i+1|0:i;if(f>>>0>k>>>0&(i|0)>=(n|0)|(i|0)>(n|0)){break a}h=H[b>>2]+h|0;f=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);H[a+4>>2]=f;i=H[b+20>>2];h=H[b+16>>2]+4|0;i=h>>>0<4?i+1|0:i;H[b+16>>2]=h;H[b+20>>2]=i;if(!f){return 1}if(d>>>0>>0){break a}H[a+8>>2]=0;if(!ta(a+16|0,b)){break a}if(!ua(a+32|0,b)){break a}if(!ua(a+52|0,b)){break a}if(!ua(a+72|0,b)){break a}u=H[a+4>>2];h=c;b=0;c=0;e=ca-32|0;ca=e;f=a;a=H[a+12>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;b:{c:{if(a){if(a>>>0>=1073741824){break c}d=a<<2;b=pa(d);H[e+8>>2]=b;c=b+d|0;H[e+16>>2]=c;ra(b,0,d);H[e+12>>2]=c}j=H[f+116>>2];d=H[j>>2];if(d){H[j+4>>2]=d;oa(d);c=H[e+12>>2];b=H[e+8>>2];a=H[f+12>>2]}H[j+4>>2]=c;H[j>>2]=b;H[j+8>>2]=H[e+16>>2];b=0;H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;d:{if(a){if(a>>>0>=1073741824){break d}a=a<<2;g=pa(a);H[e+8>>2]=g;b=a+g|0;H[e+16>>2]=b;ra(g,0,a);H[e+12>>2]=b}c=H[f+128>>2];a=H[c>>2];if(a){H[c+4>>2]=a;oa(a);g=H[e+8>>2];b=H[e+12>>2]}H[c+4>>2]=b;H[c>>2]=g;H[c+8>>2]=H[e+16>>2];H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;xa(e+8|0);b=H[e+24>>2]+H[e+28>>2]|0;a=(b>>>0)/341|0;a=H[H[e+12>>2]+(a<<2)>>2]+N(b-N(a,341)|0,12)|0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=u;d=1;a=H[e+28>>2]+1|0;H[e+28>>2]=a;e:{if(!a){break e}n=f+16|0;while(1){i=H[e+12>>2];j=H[e+24>>2];d=a-1|0;c=j+d|0;b=(c>>>0)/341|0;b=H[i+(b<<2)>>2]+N(c-N(b,341)|0,12)|0;o=H[b+8>>2];c=H[b+4>>2];m=H[b>>2];H[e+28>>2]=d;b=H[e+16>>2];if((((b|0)!=(i|0)?N(b-i>>2,341)-1|0:0)-(a+j|0)|0)+1>>>0>=682){oa(H[b-4>>2]);H[e+16>>2]=H[e+16>>2]-4}if(m>>>0>u>>>0){d=0;break e}d=0;b=H[f+12>>2];a=(c|0)!=(b-1|0)?c+1|0:0;if(a>>>0>=b>>>0){break e}b=H[f+116>>2];p=N(o,12);r=b+p|0;j=H[f>>2];g=a<<2;k=p+H[f+128>>2]|0;c=H[g+H[k>>2]>>2];f:{if((j|0)==(c|0)){if(!m){break f}b=H[h+20>>2];c=H[h+16>>2];if((b|0)==(c|0)){a=H[f+8>>2];H[h+28>>2]=m+H[h+28>>2];H[f+8>>2]=a+m;break f}while(1){i=(b|0)==(c|0);a=b;j=0;b=c;g:{if(i){break g}while(1){g=H[h+28>>2];b=a;l=N(j,20)+c|0;k=H[l>>2];if(!I[k+84|0]){g=H[H[k+68>>2]+(g<<2)>>2]}if(K[k+80>>2]<=g>>>0){break g}i=H[r>>2]+(H[l+4>>2]<<2)|0;c=H[l+12>>2];b=i;h:{if(c>>>0>3){break h}a=0;b=H[h+12>>2];if(!H[l+16>>2]){break h}while(1){b=qa(b,i+(a<<2)|0,c);c=H[l+12>>2];b=b+c|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[h+12>>2]}a=H[k+40>>2];qa(H[H[k>>2]>>2]+N(a,g)|0,b,a);j=j+1|0;a=H[h+20>>2];b=a;c=H[h+16>>2];if(j>>>0<(b-c|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;d=d+1|0;if((m|0)!=(d|0)){continue}break}break f}i:{j:{k:{l:{if(m>>>0<=2){c=H[f+104>>2];H[c>>2]=a;g=1;b=H[f+12>>2];if(b>>>0>1){break l}break i}if(K[f+8>>2]>K[f+4>>2]){break e}i=b;b=p+12|0;Aa(i+b|0,H[r>>2],H[r+4>>2]);b=g+H[b+H[f+116>>2]>>2]|0;H[b>>2]=H[b>>2]+(1<>2]=0;pc(n,Q(m)^31,e+4|0);c=m>>>1|0;b=H[e+4>>2];if(c>>>0>>0){break e}l=o+1|0;b=c-b|0;c=m-b|0;m:{if((c|0)==(b|0)){c=b;break m}k=H[f+84>>2];if((k|0)==H[f+76>>2]){break k}i=H[k>>2];j=H[f+88>>2];d=j+1|0;H[f+88>>2]=d;j=i&-2147483648>>>j;n:{if((d|0)==32){H[f+88>>2]=0;H[f+84>>2]=k+4;if(j){break n}break k}if(!j){break k}}}j=c;c=b;break j}while(1){a=(b-1|0)!=(a|0)?a+1|0:0;H[c+(g<<2)>>2]=a;b=H[f+12>>2];g=g+1|0;if(b>>>0>g>>>0){continue}break}break i}j=b}k=H[f+128>>2];i=k+p|0;d=H[i>>2];b=d+g|0;H[b>>2]=H[b>>2]+1;Aa(k+N(l,12)|0,d,H[i+4>>2]);if(c){b=H[e+28>>2]+H[e+24>>2]|0;d=H[e+16>>2];g=H[e+12>>2];if((b|0)==(((d|0)!=(g|0)?N(d-g>>2,341)-1|0:0)|0)){xa(e+8|0);g=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}d=(b>>>0)/341|0;b=H[(d<<2)+g>>2]+N(b-N(d,341)|0,12)|0;H[b+8>>2]=o;H[b+4>>2]=a;H[b>>2]=c;H[e+28>>2]=H[e+28>>2]+1}if(!j){break f}b=H[e+28>>2]+H[e+24>>2]|0;c=H[e+16>>2];g=H[e+12>>2];if((b|0)==(((c|0)!=(g|0)?N(c-g>>2,341)-1|0:0)|0)){xa(e+8|0);g=H[e+12>>2];b=H[e+24>>2]+H[e+28>>2]|0}c=(b>>>0)/341|0;b=H[(c<<2)+g>>2]+N(b-N(c,341)|0,12)|0;H[b+8>>2]=l;H[b+4>>2]=a;H[b>>2]=j;H[e+28>>2]=H[e+28>>2]+1;break f}s=0;if(!m){break f}while(1){if(H[f+12>>2]){w=H[f+36>>2];i=H[k>>2];t=H[f+92>>2];j=H[f+104>>2];a=0;while(1){o=(a<<2)+j|0;H[t+(H[o>>2]<<2)>>2]=0;d=H[f>>2];c=H[o>>2]<<2;b=H[c+i>>2];o:{if((d|0)==(b|0)){break o}p=c+t|0;q=d-b|0;g=H[f+48>>2];d=32-g|0;if((q|0)<=(d|0)){c=H[f+44>>2];if((c|0)==(w|0)){d=0;break e}H[p>>2]=H[c>>2]<>>32-q;b=q+H[f+48>>2]|0;H[f+48>>2]=b;if((b|0)!=32){break o}H[f+48>>2]=0;H[f+44>>2]=c+4;break o}l=H[f+44>>2];b=l+4|0;if((w|0)==(b|0)){d=0;break e}c=H[l>>2];H[f+44>>2]=b;b=q-d|0;H[f+48>>2]=b;H[p>>2]=H[l+4>>2]>>>32-b|c<>>32-q}c=H[o>>2]<<2;b=c+t|0;H[b>>2]=H[b>>2]|H[c+H[r>>2]>>2];a=a+1|0;if(a>>>0>2]){continue}break}}j=0;a=H[h+16>>2];p:{if((a|0)==H[h+20>>2]){break p}while(1){g=H[h+28>>2];l=N(j,20)+a|0;i=H[l>>2];if(!I[i+84|0]){g=H[H[i+68>>2]+(g<<2)>>2]}if(K[i+80>>2]<=g>>>0){break p}d=H[f+92>>2]+(H[l+4>>2]<<2)|0;c=H[l+12>>2];b=d;q:{if(c>>>0>3){break q}a=0;b=H[h+12>>2];if(!H[l+16>>2]){break q}while(1){b=qa(b,d+(a<<2)|0,c);c=H[l+12>>2];b=b+c|0;a=a+1|0;if(a>>>0>2]){continue}break}b=H[h+12>>2]}a=H[i+40>>2];qa(H[H[i>>2]>>2]+N(a,g)|0,b,a);j=j+1|0;a=H[h+16>>2];if(j>>>0<(H[h+20>>2]-a|0)/20>>>0){continue}break}}H[h+28>>2]=H[h+28>>2]+1;H[f+8>>2]=H[f+8>>2]+1;s=s+1|0;if((m|0)!=(s|0)){continue}break}}a=H[e+28>>2];if(a){continue}break}d=1}H[e+28>>2]=0;g=H[e+16>>2];a=H[e+12>>2];b=g-a|0;if(b>>>0>=9){while(1){oa(H[a>>2]);a=H[e+12>>2]+4|0;H[e+12>>2]=a;g=H[e+16>>2];b=g-a|0;if(b>>>0>8){continue}break}}c=170;r:{switch((b>>>2|0)-1|0){case 1:c=341;case 0:H[e+24>>2]=c;break;default:break r}}s:{if((a|0)==(g|0)){break s}while(1){oa(H[a>>2]);a=a+4|0;if((g|0)!=(a|0)){continue}break}b=H[e+16>>2];a=H[e+12>>2];if((b|0)==(a|0)){break s}H[e+16>>2]=b+((a-b|0)+3&-4)}a=H[e+8>>2];if(a){oa(a)}ca=e+32|0;j=d;break b}sa();v()}sa();v()}}return j}function $c(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;h=ca-32|0;ca=h;g=H[H[a+4>>2]+44>>2];c=H[a+8>>2];d=H[c>>2];c=H[c+4>>2];H[h+24>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;d=(c-d>>2>>>0)/3|0;c=H[g+96>>2];f=(H[g+100>>2]-c|0)/12|0;a:{if(d>>>0>f>>>0){e=d-f|0;i=H[g+104>>2];c=H[g+100>>2];if(e>>>0<=(i-c|0)/12>>>0){b:{if(!e){break b}d=c;f=N(e,12)-12|0;i=((f>>>0)/12|0)+1&3;if(i){while(1){l=H[h+20>>2];H[d>>2]=H[h+16>>2];H[d+4>>2]=l;H[d+8>>2]=H[h+24>>2];d=d+12|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}c=N(e,12)+c|0;if(f>>>0<36){break b}while(1){f=H[h+20>>2];H[d>>2]=H[h+16>>2];H[d+4>>2]=f;H[d+8>>2]=H[h+24>>2];H[d+20>>2]=H[h+24>>2];f=H[h+20>>2];H[d+12>>2]=H[h+16>>2];H[d+16>>2]=f;H[d+32>>2]=H[h+24>>2];f=H[h+20>>2];H[d+24>>2]=H[h+16>>2];H[d+28>>2]=f;f=H[h+20>>2];H[d+36>>2]=H[h+16>>2];H[d+40>>2]=f;H[d+44>>2]=H[h+24>>2];d=d+48|0;if((d|0)!=(c|0)){continue}break}}H[g+100>>2]=c;break a}c:{f=H[g+96>>2];n=(c-f|0)/12|0;d=n+e|0;if(d>>>0<357913942){f=(i-f|0)/12|0;i=f<<1;i=f>>>0>=178956970?357913941:d>>>0>>0?i:d;if(i){if(i>>>0>=357913942){break c}l=pa(N(i,12))}f=N(n,12)+l|0;d=f;e=N(e,12);n=e-12|0;q=((n>>>0)/12|0)+1&3;if(q){while(1){r=H[h+20>>2];H[d>>2]=H[h+16>>2];H[d+4>>2]=r;H[d+8>>2]=H[h+24>>2];d=d+12|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}e=e+f|0;if(n>>>0>=36){while(1){j=H[h+20>>2];H[d>>2]=H[h+16>>2];H[d+4>>2]=j;H[d+8>>2]=H[h+24>>2];H[d+20>>2]=H[h+24>>2];j=H[h+20>>2];H[d+12>>2]=H[h+16>>2];H[d+16>>2]=j;H[d+32>>2]=H[h+24>>2];j=H[h+20>>2];H[d+24>>2]=H[h+16>>2];H[d+28>>2]=j;j=H[h+20>>2];H[d+36>>2]=H[h+16>>2];H[d+40>>2]=j;H[d+44>>2]=H[h+24>>2];d=d+48|0;if((e|0)!=(d|0)){continue}break}}j=H[g+96>>2];if((j|0)!=(c|0)){while(1){c=c-12|0;n=H[c+4>>2];f=f-12|0;d=f;H[d>>2]=H[c>>2];H[d+4>>2]=n;H[d+8>>2]=H[c+8>>2];if((c|0)!=(j|0)){continue}break}c=H[g+96>>2]}H[g+104>>2]=N(i,12)+l;H[g+100>>2]=e;H[g+96>>2]=f;if(c){oa(c)}break a}sa();v()}wa();v()}if(d>>>0>=f>>>0){break a}H[g+100>>2]=c+N(d,12)}d:{if(H[a+216>>2]==H[a+220>>2]){j=H[a+4>>2];c=H[j+44>>2];d=H[c+100>>2];f=H[c+96>>2];if((d|0)!=(f|0)){c=(d-f|0)/12|0;o=c>>>0<=1?1:c;c=0;while(1){d=H[a+8>>2];i=f+N(c,12)|0;g=N(c,3);e:{f:{if((g|0)==-1){e=H[(H[d>>2]+(g<<2)|0)+4>>2];k=-1;g=1;break f}e=-1;k=H[H[d>>2]+(g<<2)>>2];l=g+1|0;if((l|0)==-1){g=0;break f}e=H[H[d>>2]+(l<<2)>>2];g=g+2|0;m=-1;if((g|0)==-1){break e}}m=H[H[d>>2]+(g<<2)>>2]}H[i+8>>2]=m;H[i+4>>2]=e;H[i>>2]=k;c=c+1|0;if((o|0)!=(c|0)){continue}break}}H[H[j+4>>2]+80>>2]=b;c=1;break d}d=0;H[h+24>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;l=H[a+8>>2];c=H[l>>2];g=H[l+4>>2];H[h+8>>2]=0;H[h>>2]=0;H[h+4>>2]=0;b=0;g:{h:{i:{j:{k:{l:{if((c|0)!=(g|0)){c=g-c|0;if((c|0)<0){break l}b=pa(c);H[h>>2]=b;H[h+8>>2]=(c&-4)+b;u=h,w=ra(b,0,c)+c|0,H[u+4>>2]=w}c=H[l+24>>2];if((H[l+28>>2]-c|0)<4){break h}f=0;while(1){g=H[(p<<2)+c>>2];m:{if((g|0)==-1){break m}n:{if(H[H[a+120>>2]+(p>>>3&536870908)>>2]>>>p&1){break n}n=H[a+216>>2];c=H[a+220>>2];if((n|0)==(c|0)){break n}e=g+2|0;i=(g>>>0)%3|0;q=i?g-1|0:e;c=(c-n|0)/144|0;r=c>>>0<=1?1:c;j=0;t=(i|0)!=0|(e|0)!=-1;while(1){s=g<<2;i=N(j,144)+n|0;c=H[s+H[H[i+68>>2]>>2]>>2];o:{if(!(H[H[i+16>>2]+(c>>>3&536870908)>>2]>>>c&1)){break o}c=-1;p:{if(!t){break p}e=H[H[l+12>>2]+(q<<2)>>2];c=-1;if((e|0)==-1){break p}c=e-1|0;if((e>>>0)%3|0){break p}c=e+2|0}if((g|0)==(c|0)){break o}e=s;s=H[i+32>>2];i=H[e+s>>2];while(1){e=0;if((c|0)==-1){break g}if((i|0)!=H[s+(c<<2)>>2]){g=c;break n}q:{r:{if((c>>>0)%3|0){e=c-1|0;break r}e=c+2|0;m=-1;if((e|0)==-1){break q}}c=H[H[l+12>>2]+(e<<2)>>2];m=-1;if((c|0)==-1){break q}m=c-1|0;if((c>>>0)%3|0){break q}m=c+2|0}c=m;if((g|0)!=(c|0)){continue}break}}j=j+1|0;if((r|0)!=(j|0)){continue}break}}i=k-f|0;e=i>>2;H[(g<<2)+b>>2]=e;s:{if(k>>>0>>0){H[k>>2]=g;k=k+4|0;H[h+20>>2]=k;break s}c=e+1|0;if(c>>>0>=1073741824){break k}d=o-f|0;k=d>>>1|0;c=d>>>0>=2147483644?1073741823:c>>>0>>0?k:c;if(c){if(c>>>0>=1073741824){break j}d=pa(c<<2)}else{d=0}e=d+(e<<2)|0;H[e>>2]=g;m=c<<2;c=va(d,f,i);o=m+c|0;H[h+24>>2]=o;k=e+4|0;H[h+20>>2]=k;H[h+16>>2]=c;if(f){oa(f);l=H[a+8>>2]}f=c}if((g|0)==-1){break m}t:{if((g>>>0)%3|0){c=g-1|0;break t}c=g+2|0;if((c|0)==-1){break m}}c=H[H[l+12>>2]+(c<<2)>>2];if((c|0)==-1){break m}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)==-1){break m}e=g;if((c|0)==(g|0)){break m}while(1){i=c;u:{v:{c=H[a+220>>2];j=H[a+216>>2];if((c|0)==(j|0)){break v}c=(c-j|0)/144|0;n=c>>>0<=1?1:c;c=0;while(1){q=H[(j+N(c,144)|0)+32>>2];r=i<<2;if(H[q+r>>2]==H[q+(e<<2)>>2]){c=c+1|0;if((n|0)!=(c|0)){continue}break v}break}j=k-d|0;e=j>>2;H[b+r>>2]=e;if(k>>>0>>0){H[k>>2]=i;k=k+4|0;H[h+20>>2]=k;f=d;break u}c=e+1|0;if(c>>>0>=1073741824){break i}f=o-d|0;k=f>>>1|0;c=f>>>0>=2147483644?1073741823:c>>>0>>0?k:c;if(c){if(c>>>0>=1073741824){break j}f=pa(c<<2)}else{f=0}e=f+(e<<2)|0;H[e>>2]=i;m=c<<2;c=va(f,d,j);o=m+c|0;H[h+24>>2]=o;k=e+4|0;H[h+20>>2]=k;H[h+16>>2]=c;if(!d){d=c;break u}oa(d);l=H[a+8>>2];d=c;break u}H[(i<<2)+b>>2]=H[(e<<2)+b>>2]}if((i|0)==-1){break m}w:{if((i>>>0)%3|0){c=i-1|0;break w}c=i+2|0;if((c|0)==-1){break m}}c=H[H[l+12>>2]+(c<<2)>>2];if((c|0)==-1){break m}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)==-1){break m}e=i;if((c|0)!=(g|0)){continue}break}}p=p+1|0;c=H[l+24>>2];if((p|0)>2]-c>>2){continue}break}break h}sa();v()}sa();v()}wa();v()}sa();v()}i=H[a+4>>2];a=H[i+44>>2];c=H[a+100>>2];a=H[a+96>>2];x:{if((c|0)==(a|0)){break x}g=(c-a|0)/12|0;f=g>>>0<=1?1:g;l=f&1;c=0;if(g>>>0>=2){j=f&-2;g=0;while(1){e=N(c,12);f=e+b|0;o=H[f>>2];p=H[f+4>>2];e=a+e|0;H[e+8>>2]=H[f+8>>2];H[e>>2]=o;H[e+4>>2]=p;e=N(c|1,12);f=e+b|0;o=H[f>>2];p=H[f+4>>2];e=a+e|0;H[e+8>>2]=H[f+8>>2];H[e>>2]=o;H[e+4>>2]=p;c=c+2|0;g=g+2|0;if((j|0)!=(g|0)){continue}break}}if(!l){break x}g=N(c,12);c=g+b|0;f=H[c>>2];e=H[c+4>>2];a=a+g|0;H[a+8>>2]=H[c+8>>2];H[a>>2]=f;H[a+4>>2]=e}H[H[i+4>>2]+80>>2]=k-d>>2;e=1}c=e;if(b){oa(b)}if(!d){break d}H[h+20>>2]=d;oa(d)}ca=h+32|0;return c}function Fj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,O=0,P=0;g=ca+-64|0;ca=g;H[a+8>>2]=e;y=a+32|0;f=H[y>>2];d=H[a+36>>2]-f>>2;a:{b:{if(d>>>0>>0){ya(y,e-d|0);H[g+56>>2]=0;H[g+60>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g>>2]=0;break b}if(d>>>0>e>>>0){H[a+36>>2]=f+(e<<2)}H[g+56>>2]=0;H[g+60>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g>>2]=0;d=0;if(!e){break a}}Pa(g+16|0,e,g);h=H[g+28>>2];d=H[g+32>>2]}H[g>>2]=0;d=d-h>>2;c:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break c}H[g+32>>2]=(e<<2)+h;break c}Pa(g+16|12,e-d|0,g)}H[g>>2]=0;f=H[g+40>>2];d=H[g+44>>2]-f>>2;d:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break d}H[g+44>>2]=f+(e<<2);break d}Pa(g+40|0,e-d|0,g)}H[g>>2]=0;f=H[g+52>>2];d=H[g+56>>2]-f>>2;e:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break e}H[g+56>>2]=f+(e<<2);break e}Pa(g+52|0,e-d|0,g)}f:{if(H[a+8>>2]<=0){break f}i=H[g+16>>2];j=H[a+32>>2];h=0;while(1){d=h<<2;f=H[d+i>>2];m=H[a+16>>2];g:{if((f|0)>(m|0)){H[d+j>>2]=m;break g}d=d+j|0;m=H[a+12>>2];if((m|0)>(f|0)){H[d>>2]=m;break g}H[d>>2]=f}h=h+1|0;d=H[a+8>>2];if((h|0)<(d|0)){continue}break}if((d|0)<=0){break f}d=0;while(1){i=d<<2;f=i+c|0;i=H[b+i>>2]+H[j+i>>2]|0;H[f>>2]=i;h:{if((i|0)>H[a+16>>2]){i=i-H[a+20>>2]|0}else{if((i|0)>=H[a+12>>2]){break h}i=i+H[a+20>>2]|0}H[f>>2]=i}d=d+1|0;if((d|0)>2]){continue}break}}G=H[a+52>>2];t=H[a+48>>2];z=pa(16);d=z;H[d>>2]=0;H[d+4>>2]=0;H[d+8>>2]=0;H[d+12>>2]=0;H[g+8>>2]=0;H[g>>2]=0;H[g+4>>2]=0;i:{if(e){if(e>>>0>=1073741824){break i}d=e<<2;r=pa(d);H[g>>2]=r;H[g+8>>2]=d+r;ra(r,0,d)}A=1;d=H[a+56>>2];B=H[d>>2];d=H[d+4>>2]-B|0;j:{if((d|0)<8){break j}w=d>>2;I=(w|0)<=2?2:w;J=w>>>0<=1?1:w;C=e&-2;D=e&1;K=e&-4;E=e&3;F=e-1|0;L=e<<2;M=e>>>0<4;A=0;m=1;while(1){k:{l:{m:{n:{if((m|0)!=(J|0)){o:{p:{f=H[(m<<2)+B>>2];if((f|0)==-1){break p}k=1;d=f+2|0;j=(f>>>0)%3|0;x=j?f-1|0:d;s=1<>2];O=n+(x>>>3&536870908)|0;i=0;P=(j|0)!=0|(d|0)!=-1;d=f;q:{while(1){r:{if(H[n+(d>>>3&536870908)>>2]>>>d&1){break r}j=H[H[H[t+64>>2]+12>>2]+(d<<2)>>2];if((j|0)==-1){break r}l=H[G>>2];h=H[t+28>>2];p=H[l+(H[h+(j<<2)>>2]<<2)>>2];if((p|0)>=(m|0)){break r}q=j+1|0;q=H[l+(H[h+(((q>>>0)%3|0?q:j-2|0)<<2)>>2]<<2)>>2];if((q|0)>=(m|0)){break r}h=H[l+(H[h+(j+((j>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((h|0)>=(m|0)){break r}s:{if(!e){break s}j=H[(g+16|0)+N(i,12)>>2];l=N(e,h);q=N(e,q);p=N(e,p);h=0;o=0;if(F){while(1){H[j+(h<<2)>>2]=(H[(h+l<<2)+c>>2]+H[(h+q<<2)+c>>2]|0)-H[(h+p<<2)+c>>2];u=h|1;H[j+(u<<2)>>2]=(H[(l+u<<2)+c>>2]+H[(q+u<<2)+c>>2]|0)-H[(p+u<<2)+c>>2];h=h+2|0;o=o+2|0;if((C|0)!=(o|0)){continue}break}}if(!D){break s}H[j+(h<<2)>>2]=(H[(h+l<<2)+c>>2]+H[(h+q<<2)+c>>2]|0)-H[(h+p<<2)+c>>2]}j=4;i=i+1|0;if((i|0)==4){break q}}t:{if(k&1){h=d-2|0;j=d+1|0;d=-1;j=(j>>>0)%3|0?j:h;if((j|0)==-1|H[n+(j>>>3&536870908)>>2]>>>j&1){break t}j=H[H[H[t+64>>2]+12>>2]+(j<<2)>>2];if((j|0)==-1){break t}d=j+1|0;d=(d>>>0)%3|0?d:j-2|0;break t}u:{if((d>>>0)%3|0){h=d-1|0;break u}h=d+2|0;d=-1;if((h|0)==-1){break t}}d=-1;if(H[n+(h>>>3&536870908)>>2]>>>h&1){break t}j=H[H[H[t+64>>2]+12>>2]+(h<<2)>>2];if((j|0)==-1){break t}if((j>>>0)%3|0){d=j-1|0;break t}d=j+2|0}v:{if((d|0)==(f|0)){break v}if((d|0)==-1&k){if(!P|s&H[O>>2]){break v}d=H[H[H[t+64>>2]+12>>2]+(x<<2)>>2];if((d|0)==-1){break v}k=0;d=(d>>>0)%3|0?d-1|0:d+2|0}if((d|0)!=-1){continue}}break}j=i;if((j|0)<=0){break p}}if(e){ra(r,0,L)}d=j-1|0;q=(d<<2)+z|0;d=N(d,12)+a|0;u=d;x=H[d- -64>>2];k=0;d=H[g>>2];f=0;while(1){i=H[q>>2];H[q>>2]=i+1;if(i>>>0>=x>>>0){break j}w:{if(H[H[u+60>>2]+(i>>>3&536870908)>>2]>>>i&1){break w}f=f+1|0;if(!e){break w}n=H[(g+16|0)+N(k,12)>>2];i=0;h=0;p=0;if(!M){while(1){l=h<<2;o=l+d|0;H[o>>2]=H[l+n>>2]+H[o>>2];o=l|4;s=o+d|0;H[s>>2]=H[n+o>>2]+H[s>>2];o=l|8;s=o+d|0;H[s>>2]=H[n+o>>2]+H[s>>2];l=l|12;o=l+d|0;H[o>>2]=H[l+n>>2]+H[o>>2];h=h+4|0;p=p+4|0;if((K|0)!=(p|0)){continue}break}}if(!E){break w}while(1){l=h<<2;p=l+d|0;H[p>>2]=H[l+n>>2]+H[p>>2];h=h+1|0;i=i+1|0;if((E|0)!=(i|0)){continue}break}}k=k+1|0;if((k|0)!=(j|0)){continue}break}i=N(e,m);if(!f){break o}if(!e){break l}h=0;d=0;if(F){break n}break m}i=N(e,m)}if(H[a+8>>2]<=0){break k}k=(N(m-1|0,e)<<2)+c|0;j=H[y>>2];h=0;while(1){d=h<<2;f=H[d+k>>2];n=H[a+16>>2];x:{if((f|0)>(n|0)){H[d+j>>2]=n;break x}d=d+j|0;n=H[a+12>>2];if((n|0)>(f|0)){H[d>>2]=n;break x}H[d>>2]=f}h=h+1|0;f=H[a+8>>2];if((h|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=i<<2;h=f+c|0;k=b+f|0;while(1){i=d<<2;f=i+h|0;i=H[i+k>>2]+H[j+i>>2]|0;H[f>>2]=i;y:{if((i|0)>H[a+16>>2]){i=i-H[a+20>>2]|0}else{if((i|0)>=H[a+12>>2]){break y}i=i+H[a+20>>2]|0}H[f>>2]=i}d=d+1|0;if((d|0)>2]){continue}break}break k}Ca();v()}while(1){j=h<<2;k=j+r|0;H[k>>2]=H[k>>2]/(f|0);j=(j|4)+r|0;H[j>>2]=H[j>>2]/(f|0);h=h+2|0;d=d+2|0;if((C|0)!=(d|0)){continue}break}}if(!D){break l}d=(h<<2)+r|0;H[d>>2]=H[d>>2]/(f|0)}if(H[a+8>>2]<=0){break k}j=H[y>>2];h=0;while(1){d=h<<2;f=H[d+r>>2];k=H[a+16>>2];z:{if((f|0)>(k|0)){H[d+j>>2]=k;break z}d=d+j|0;k=H[a+12>>2];if((k|0)>(f|0)){H[d>>2]=k;break z}H[d>>2]=f}h=h+1|0;f=H[a+8>>2];if((h|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=i<<2;h=f+c|0;k=b+f|0;while(1){i=d<<2;f=i+h|0;i=H[i+k>>2]+H[j+i>>2]|0;H[f>>2]=i;A:{if((i|0)>H[a+16>>2]){i=i-H[a+20>>2]|0}else{if((i|0)>=H[a+12>>2]){break A}i=i+H[a+20>>2]|0}H[f>>2]=i}d=d+1|0;if((d|0)>2]){continue}break}}m=m+1|0;A=(w|0)<=(m|0);if((m|0)!=(I|0)){continue}break}}a=H[g>>2];if(a){oa(a)}oa(z);a=H[g+52>>2];if(a){H[g+56>>2]=a;oa(a)}a=H[g+40>>2];if(a){H[g+44>>2]=a;oa(a)}a=H[g+28>>2];if(a){H[g+32>>2]=a;oa(a)}a=H[g+16>>2];if(a){H[g+20>>2]=a;oa(a)}ca=g- -64|0;return A|0}sa();v()}function oj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0;h=ca+-64|0;ca=h;H[a+8>>2]=e;x=a+32|0;f=H[x>>2];d=H[a+36>>2]-f>>2;a:{b:{if(d>>>0>>0){ya(x,e-d|0);H[h+56>>2]=0;H[h+60>>2]=0;H[h+48>>2]=0;H[h+52>>2]=0;H[h+40>>2]=0;H[h+44>>2]=0;H[h+32>>2]=0;H[h+36>>2]=0;H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h>>2]=0;break b}if(d>>>0>e>>>0){H[a+36>>2]=f+(e<<2)}H[h+56>>2]=0;H[h+60>>2]=0;H[h+48>>2]=0;H[h+52>>2]=0;H[h+40>>2]=0;H[h+44>>2]=0;H[h+32>>2]=0;H[h+36>>2]=0;H[h+24>>2]=0;H[h+28>>2]=0;H[h+16>>2]=0;H[h+20>>2]=0;H[h>>2]=0;d=0;if(!e){break a}}Pa(h+16|0,e,h);i=H[h+28>>2];d=H[h+32>>2]}H[h>>2]=0;d=d-i>>2;c:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break c}H[h+32>>2]=(e<<2)+i;break c}Pa(h+16|12,e-d|0,h)}H[h>>2]=0;f=H[h+40>>2];d=H[h+44>>2]-f>>2;d:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break d}H[h+44>>2]=f+(e<<2);break d}Pa(h+40|0,e-d|0,h)}H[h>>2]=0;f=H[h+52>>2];d=H[h+56>>2]-f>>2;e:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break e}H[h+56>>2]=f+(e<<2);break e}Pa(h+52|0,e-d|0,h)}f:{if(H[a+8>>2]<=0){break f}g=H[h+16>>2];j=H[a+32>>2];i=0;while(1){d=i<<2;f=H[d+g>>2];m=H[a+16>>2];g:{if((f|0)>(m|0)){H[d+j>>2]=m;break g}d=d+j|0;m=H[a+12>>2];if((m|0)>(f|0)){H[d>>2]=m;break g}H[d>>2]=f}i=i+1|0;d=H[a+8>>2];if((i|0)<(d|0)){continue}break}if((d|0)<=0){break f}d=0;while(1){g=d<<2;f=g+c|0;g=H[b+g>>2]+H[g+j>>2]|0;H[f>>2]=g;h:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break h}g=g+H[a+20>>2]|0}H[f>>2]=g}d=d+1|0;if((d|0)>2]){continue}break}}G=H[a+52>>2];A=H[a+48>>2];y=pa(16);d=y;H[d>>2]=0;H[d+4>>2]=0;H[d+8>>2]=0;H[d+12>>2]=0;H[h+8>>2]=0;H[h>>2]=0;H[h+4>>2]=0;i:{if(e){if(e>>>0>=1073741824){break i}d=e<<2;t=pa(d);H[h>>2]=t;H[h+8>>2]=d+t;ra(t,0,d)}z=1;d=H[a+56>>2];B=H[d>>2];d=H[d+4>>2]-B|0;j:{if((d|0)<8){break j}w=d>>2;I=(w|0)<=2?2:w;J=w>>>0<=1?1:w;C=e&-2;D=e&1;K=e&-4;E=e&3;F=e-1|0;L=e<<2;M=e>>>0<4;z=0;m=1;while(1){k:{l:{m:{n:{if((m|0)!=(J|0)){o:{p:{f=H[(m<<2)+B>>2];if((f|0)==-1){break p}n=H[A+12>>2];d=f+2|0;g=(f>>>0)%3|0;q=n+((g?f-1|0:d)<<2)|0;j=0;u=(g|0)!=0|(d|0)!=-1;k=1;d=f;q:{while(1){g=H[n+(d<<2)>>2];r:{if((g|0)==-1){break r}l=-1;p=H[G>>2];r=H[A>>2];i=p+(H[r+(g<<2)>>2]<<2)|0;o=g+1|0;o=(o>>>0)%3|0?o:g-2|0;if((o|0)!=-1){l=H[r+(o<<2)>>2]}o=H[i>>2];s:{t:{if((g>>>0)%3|0){i=g-1|0;break t}i=g+2|0;s=-1;if((i|0)==-1){break s}}s=H[r+(i<<2)>>2]}if((m|0)<=(o|0)){break r}i=H[p+(l<<2)>>2];if((i|0)>=(m|0)){break r}l=H[p+(s<<2)>>2];if((l|0)>=(m|0)){break r}g=H[(h+16|0)+N(j,12)>>2];u:{if(!e){break u}l=N(e,l);r=N(e,i);p=N(e,o);i=0;s=0;if(F){while(1){H[g+(i<<2)>>2]=(H[(i+l<<2)+c>>2]+H[(i+r<<2)+c>>2]|0)-H[(i+p<<2)+c>>2];o=i|1;H[g+(o<<2)>>2]=(H[(l+o<<2)+c>>2]+H[(o+r<<2)+c>>2]|0)-H[(o+p<<2)+c>>2];i=i+2|0;s=s+2|0;if((C|0)!=(s|0)){continue}break}}if(!D){break u}H[g+(i<<2)>>2]=(H[(i+l<<2)+c>>2]+H[(i+r<<2)+c>>2]|0)-H[(i+p<<2)+c>>2]}g=4;j=j+1|0;if((j|0)==4){break q}}v:{if(k&1){i=d+1|0;d=(i>>>0)%3|0?i:d-2|0;g=-1;if((d|0)==-1){break v}d=H[n+(d<<2)>>2];g=-1;if((d|0)==-1){break v}g=d+1|0;g=(g>>>0)%3|0?g:d-2|0;break v}w:{if((d>>>0)%3|0){i=d-1|0;break w}i=d+2|0;g=-1;if((i|0)==-1){break v}}d=H[n+(i<<2)>>2];g=-1;if((d|0)==-1){break v}g=d-1|0;if((d>>>0)%3|0){break v}g=d+2|0}d=g;x:{if((f|0)==(d|0)){break x}if((d|0)==-1&k){if(!u){break x}d=H[q>>2];if((d|0)==-1){break x}k=0;d=(d>>>0)%3|0?d-1|0:d+2|0}if((d|0)!=-1){continue}}break}g=j;if((g|0)<=0){break p}}if(e){ra(t,0,L)}d=g-1|0;r=(d<<2)+y|0;d=N(d,12)+a|0;o=d;s=H[d- -64>>2];k=0;d=H[h>>2];f=0;while(1){j=H[r>>2];H[r>>2]=j+1;if(j>>>0>=s>>>0){break j}y:{if(H[H[o+60>>2]+(j>>>3&536870908)>>2]>>>j&1){break y}f=f+1|0;if(!e){break y}j=H[(h+16|0)+N(k,12)>>2];l=0;i=0;p=0;if(!M){while(1){n=i<<2;q=n+d|0;H[q>>2]=H[j+n>>2]+H[q>>2];q=n|4;u=q+d|0;H[u>>2]=H[j+q>>2]+H[u>>2];q=n|8;u=q+d|0;H[u>>2]=H[j+q>>2]+H[u>>2];n=n|12;q=n+d|0;H[q>>2]=H[j+n>>2]+H[q>>2];i=i+4|0;p=p+4|0;if((K|0)!=(p|0)){continue}break}}if(!E){break y}while(1){n=i<<2;p=n+d|0;H[p>>2]=H[j+n>>2]+H[p>>2];i=i+1|0;l=l+1|0;if((E|0)!=(l|0)){continue}break}}k=k+1|0;if((k|0)!=(g|0)){continue}break}g=N(e,m);if(!f){break o}if(!e){break l}i=0;d=0;if(F){break n}break m}g=N(e,m)}if(H[a+8>>2]<=0){break k}k=(N(m-1|0,e)<<2)+c|0;j=H[x>>2];i=0;while(1){d=i<<2;f=H[d+k>>2];l=H[a+16>>2];z:{if((f|0)>(l|0)){H[d+j>>2]=l;break z}d=d+j|0;l=H[a+12>>2];if((l|0)>(f|0)){H[d>>2]=l;break z}H[d>>2]=f}i=i+1|0;f=H[a+8>>2];if((i|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=g<<2;i=f+c|0;k=b+f|0;while(1){g=d<<2;f=g+i|0;g=H[g+k>>2]+H[g+j>>2]|0;H[f>>2]=g;A:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break A}g=g+H[a+20>>2]|0}H[f>>2]=g}d=d+1|0;if((d|0)>2]){continue}break}break k}Ca();v()}while(1){j=i<<2;k=j+t|0;H[k>>2]=H[k>>2]/(f|0);j=(j|4)+t|0;H[j>>2]=H[j>>2]/(f|0);i=i+2|0;d=d+2|0;if((C|0)!=(d|0)){continue}break}}if(!D){break l}d=(i<<2)+t|0;H[d>>2]=H[d>>2]/(f|0)}if(H[a+8>>2]<=0){break k}j=H[x>>2];i=0;while(1){d=i<<2;f=H[d+t>>2];k=H[a+16>>2];B:{if((f|0)>(k|0)){H[d+j>>2]=k;break B}d=d+j|0;k=H[a+12>>2];if((k|0)>(f|0)){H[d>>2]=k;break B}H[d>>2]=f}i=i+1|0;f=H[a+8>>2];if((i|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=g<<2;i=f+c|0;k=b+f|0;while(1){g=d<<2;f=g+i|0;g=H[g+k>>2]+H[g+j>>2]|0;H[f>>2]=g;C:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break C}g=g+H[a+20>>2]|0}H[f>>2]=g}d=d+1|0;if((d|0)>2]){continue}break}}m=m+1|0;z=(w|0)<=(m|0);if((m|0)!=(I|0)){continue}break}}a=H[h>>2];if(a){oa(a)}oa(y);a=H[h+52>>2];if(a){H[h+56>>2]=a;oa(a)}a=H[h+40>>2];if(a){H[h+44>>2]=a;oa(a)}a=H[h+28>>2];if(a){H[h+32>>2]=a;oa(a)}a=H[h+16>>2];if(a){H[h+20>>2]=a;oa(a)}ca=h- -64|0;return z|0}sa();v()}function Od(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;i=ca-80|0;ca=i;H[i+76>>2]=b;y=i+55|0;r=i+56|0;a:{b:{c:{d:{e:while(1){h=b;if((o^2147483647)<(f|0)){break d}o=f+o|0;f:{g:{h:{f=h;g=I[f|0];if(g){while(1){i:{b=g&255;j:{if(!b){b=f;break j}if((b|0)!=37){break i}g=f;while(1){if(I[g+1|0]!=37){b=g;break j}f=f+1|0;j=I[g+2|0];b=g+2|0;g=b;if((j|0)==37){continue}break}}f=f-h|0;x=o^2147483647;if((f|0)>(x|0)){break d}if(a){Ab(a,h,f)}if(f){continue e}H[i+76>>2]=b;f=b+1|0;p=-1;if(!(I[b+2|0]!=36|F[b+1|0]-48>>>0>=10)){p=F[b+1|0]-48|0;s=1;f=b+3|0}H[i+76>>2]=f;n=0;g=F[f|0];b=g-32|0;k:{if(b>>>0>31){k=f;break k}k=f;b=1<>2]=k;n=b|n;g=F[f+1|0];b=g-32|0;if(b>>>0>=32){break k}f=k;b=1<>>0>=10)){H[((F[k+1|0]<<2)+e|0)-192>>2]=10;g=k+3|0;s=1;b=H[((F[k+1|0]<<3)+d|0)-384>>2];break m}if(s){break h}g=k+1|0;if(!a){H[i+76>>2]=g;s=0;q=0;break l}b=H[c>>2];H[c>>2]=b+4;s=0;b=H[b>>2]}H[i+76>>2]=g;q=b;if((b|0)>=0){break l}q=0-q|0;n=n|8192;break l}q=Nd(i+76|0);if((q|0)<0){break d}g=H[i+76>>2]}f=0;m=-1;n:{if(I[g|0]!=46){b=g;u=0;break n}if(I[g+1|0]==42){o:{if(!(I[g+3|0]!=36|F[g+2|0]-48>>>0>=10)){H[((F[g+2|0]<<2)+e|0)-192>>2]=10;b=g+4|0;m=H[((F[g+2|0]<<3)+d|0)-384>>2];break o}if(s){break h}b=g+2|0;m=0;if(!a){break o}j=H[c>>2];H[c>>2]=j+4;m=H[j>>2]}H[i+76>>2]=b;u=(m^-1)>>>31|0;break n}H[i+76>>2]=g+1;m=Nd(i+76|0);b=H[i+76>>2];u=1}while(1){g=f;k=28;l=b;f=F[b|0];if(f-123>>>0<4294967238){break c}b=l+1|0;f=I[(f+N(g,58)|0)+13711|0];if(f-1>>>0<8){continue}break}H[i+76>>2]=b;p:{q:{if((f|0)!=27){if(!f){break c}if((p|0)>=0){H[(p<<2)+e>>2]=f;j=(p<<3)+d|0;f=H[j+4>>2];H[i+64>>2]=H[j>>2];H[i+68>>2]=f;break q}if(!a){break f}Md(i- -64|0,f,c);break p}if((p|0)>=0){break c}}f=0;if(!a){continue e}}j=n&-65537;n=n&8192?j:n;p=0;t=1132;k=r;r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{f=F[l|0];f=g?(f&15)==3?f&-33:f:f;switch(f-88|0){case 11:break r;case 9:case 13:case 14:case 15:break s;case 27:break x;case 12:case 17:break A;case 23:break B;case 0:case 32:break C;case 24:break D;case 22:break E;case 29:break F;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break g;default:break G}}H:{switch(f-65|0){case 0:case 4:case 5:case 6:break s;case 2:break v;case 1:case 3:break g;default:break H}}if((f|0)==83){break w}break g}l=H[i+64>>2];j=H[i+68>>2];t=1132;break z}f=0;I:{switch(g&255){case 0:H[H[i+64>>2]>>2]=o;continue e;case 1:H[H[i+64>>2]>>2]=o;continue e;case 2:h=H[i+64>>2];H[h>>2]=o;H[h+4>>2]=o>>31;continue e;case 3:G[H[i+64>>2]>>1]=o;continue e;case 4:F[H[i+64>>2]]=o;continue e;case 6:H[H[i+64>>2]>>2]=o;continue e;case 7:break I;default:continue e}}h=H[i+64>>2];H[h>>2]=o;H[h+4>>2]=o>>31;continue e}m=m>>>0<=8?8:m;n=n|8;f=120}h=r;l=H[i+64>>2];j=H[i+68>>2];if(l|j){z=f&32;while(1){h=h-1|0;F[h|0]=z|I[(l&15)+14240|0];w=!j&l>>>0>15|(j|0)!=0;g=j;j=g>>>4|0;l=(g&15)<<28|l>>>4;if(w){continue}break}}if(!(H[i+64>>2]|H[i+68>>2])|!(n&8)){break y}t=(f>>>4|0)+1132|0;p=2;break y}f=r;h=H[i+68>>2];j=h;l=H[i+64>>2];if(h|l){while(1){f=f-1|0;F[f|0]=l&7|48;g=!j&l>>>0>7|(j|0)!=0;h=j;j=h>>>3|0;l=(h&7)<<29|l>>>3;if(g){continue}break}}h=f;if(!(n&8)){break y}f=r-h|0;m=(f|0)<(m|0)?m:f+1|0;break y}l=H[i+64>>2];h=H[i+68>>2];j=h;if((h|0)<0){f=0-(((l|0)!=0)+j|0)|0;j=f;l=0-l|0;H[i+64>>2]=l;H[i+68>>2]=f;p=1;t=1132;break z}if(n&2048){p=1;t=1133;break z}p=n&1;t=p?1134:1132}g=r;if(j){while(1){g=g-1|0;f=j;w=Tj(l,f,10,0);h=da;A=g,B=l-Rj(w,h,10,0)|48,F[A|0]=B;l=w;j=h;if(f>>>0>9){continue}break}}h=l;if(h){while(1){g=g-1|0;f=(h>>>0)/10|0;F[g|0]=h-N(f,10)|48;j=h>>>0>9;h=f;if(j){continue}break}}h=g}if((m|0)<0?u:0){break d}n=u?n&-65537:n;f=H[i+64>>2];j=H[i+68>>2];if(!(m|(f|j)!=0)){h=r;m=0;break g}f=!(f|j)+(r-h|0)|0;m=(f|0)<(m|0)?m:f;break g}g=m>>>0>=2147483647?2147483647:m;k=g;n=(g|0)!=0;h=H[i+64>>2];h=h?h:1614;f=h;J:{K:{L:{M:{if(!(f&3)|!g){break M}while(1){if(!I[f|0]){break L}k=k-1|0;n=(k|0)!=0;f=f+1|0;if(!(f&3)){break M}if(k){continue}break}}if(!n){break K}if(!(!I[f|0]|k>>>0<4)){while(1){l=H[f>>2];if((l^-1)&l-16843009&-2139062144){break L}f=f+4|0;k=k-4|0;if(k>>>0>3){continue}break}}if(!k){break K}}while(1){if(!I[f|0]){break J}f=f+1|0;k=k-1|0;if(k){continue}break}}f=0}f=f?f-h|0:g;k=f+h|0;if((m|0)>=0){n=j;m=f;break g}n=j;m=f;if(I[k|0]){break d}break g}if(m){g=H[i+64>>2];break u}f=0;ib(a,32,q,0,n);break t}H[i+12>>2]=0;H[i+8>>2]=H[i+64>>2];g=i+8|0;H[i+64>>2]=g;m=-1}f=0;N:{while(1){h=H[g>>2];if(!h){break N}j=Ld(i+4|0,h);h=(j|0)<0;if(!(h|j>>>0>m-f>>>0)){g=g+4|0;f=f+j|0;if(m>>>0>f>>>0){continue}break N}break}if(h){break b}}k=61;if((f|0)<0){break c}ib(a,32,q,f,n);if(!f){f=0;break t}k=0;g=H[i+64>>2];while(1){h=H[g>>2];if(!h){break t}h=Ld(i+4|0,h);k=h+k|0;if(k>>>0>f>>>0){break t}Ab(a,i+4|0,h);g=g+4|0;if(f>>>0>k>>>0){continue}break}}ib(a,32,q,f,n^8192);f=(f|0)<(q|0)?q:f;continue e}if((m|0)<0?u:0){break d}v()}F[i+55|0]=H[i+64>>2];m=1;h=y;n=j;break g}g=I[f+1|0];f=f+1|0;continue}}if(a){break a}if(!s){break f}f=1;while(1){a=H[(f<<2)+e>>2];if(a){Md((f<<3)+d|0,a,c);o=1;f=f+1|0;if((f|0)!=10){continue}break a}break}o=1;if(f>>>0>=10){break a}while(1){if(H[(f<<2)+e>>2]){break h}f=f+1|0;if((f|0)!=10){continue}break}break a}k=28;break c}l=k-h|0;j=(m|0)>(l|0)?m:l;if((j|0)>(p^2147483647)){break d}k=61;g=j+p|0;f=(g|0)<(q|0)?q:g;if((x|0)<(f|0)){break c}ib(a,32,f,g,n);Ab(a,t,p);ib(a,48,f,g,n^65536);ib(a,48,j,l,0);Ab(a,h,l);ib(a,32,f,g,n^8192);continue}break}o=0;break a}k=61}H[3992]=k}o=-1}ca=i+80|0;return o}function hj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;a:{b:{if((e|0)!=2){break b}H[a+8>>2]=2;H[a- -64>>2]=f;M=a+32|0;e=H[M>>2];d=H[a+36>>2]-e|0;c:{if(d>>>0<=7){ya(M,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}H[a+36>>2]=e+8}i=1;d=H[a+56>>2];d=H[d+4>>2]-H[d>>2]|0;if((d|0)<=0){break b}o=a+60|0;d=d>>>2|0;X=d>>>0<=1?1:d;Y=a+68|0;d=0;while(1){f=H[a+56>>2];e=H[f>>2];if(H[f+4>>2]-e>>2>>>0<=d>>>0){break a}k=ca-80|0;ca=k;f=-1;d:{e:{e=H[e+(d<<2)>>2];if((e|0)==-1){break e}i=H[o+32>>2];g=e+1|0;g=(g>>>0)%3|0?g:e-2|0;if((g|0)!=-1){f=H[H[i>>2]+(g<<2)>>2]}p=-1;e=e+((e>>>0)%3|0?-1:2)|0;if((e|0)!=-1){p=H[H[i>>2]+(e<<2)>>2]}i=H[o+36>>2];e=H[i>>2];i=H[i+4>>2]-e>>2;if(i>>>0<=f>>>0|i>>>0<=p>>>0){break e}f:{g:{h:{i:{j:{k:{j=H[e+(p<<2)>>2];f=H[e+(f<<2)>>2];if((j|0)>=(d|0)|(f|0)>=(d|0)){break k}i=(j<<3)+c|0;w=H[i+4>>2];g=(f<<3)+c|0;e=H[g+4>>2];l=H[i>>2];i=H[g>>2];if(!((l|0)!=(i|0)|(e|0)!=(w|0))){H[o+8>>2]=i;H[o+12>>2]=e;break j}p=H[H[o+4>>2]+(d<<2)>>2];H[k+72>>2]=0;H[k+76>>2]=0;g=k- -64|0;H[g>>2]=0;H[g+4>>2]=0;H[k+56>>2]=0;H[k+60>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+56|0);p=H[H[o+4>>2]+(f<<2)>>2];H[k+48>>2]=0;H[k+52>>2]=0;H[k+40>>2]=0;H[k+44>>2]=0;H[k+32>>2]=0;H[k+36>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+32|0);p=H[H[o+4>>2]+(j<<2)>>2];H[k+24>>2]=0;H[k+28>>2]=0;H[k+16>>2]=0;H[k+20>>2]=0;H[k+8>>2]=0;H[k+12>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+8|0);g=H[k+16>>2];n=H[k+40>>2];x=g-n|0;N=H[k+44>>2];g=H[k+20>>2]-(N+(g>>>0>>0)|0)|0;E=g;j=Rj(x,g,x,g);q=da;g=H[k+8>>2];z=H[k+32>>2];A=g-z|0;O=H[k+36>>2];g=H[k+12>>2]-(O+(g>>>0>>0)|0)|0;G=g;h=j;j=Rj(A,g,A,g);g=h+j|0;h=da+q|0;h=g>>>0>>0?h+1|0:h;j=H[k+24>>2];B=H[k+48>>2];C=j-B|0;P=H[k+52>>2];j=H[k+28>>2]-(P+(j>>>0>>0)|0)|0;J=j;m=g;g=Rj(C,j,C,j);r=m+g|0;h=da+h|0;s=g>>>0>r>>>0?h+1|0:h;if(!(s|r)){break k}p=0;D=Tj(-1,2147483647,r,s);f=i>>31;R=f;h=f>>31;Q=i;g=h;q=i^g;i=q-g|0;f=(f^g)-((g>>>0>q>>>0)+g|0)|0;g=f;f=e>>31;S=f;K=e;e=f>>31;q=K^e;m=q-e|0;h=f>>31;e=(h^f)-((e>>>0>q>>>0)+h|0)|0;f=(g|0)==(e|0)&i>>>0>m>>>0|e>>>0>>0;i=f?i:m;j=da;e=f?g:e;if((j|0)==(e|0)&i>>>0>D>>>0|e>>>0>j>>>0){break f}i=H[k+64>>2];T=H[k+68>>2];e=Rj(i-n|0,T-((i>>>0>>0)+N|0)|0,x,E);f=da;g=H[k+56>>2];U=H[k+60>>2];j=Rj(g-z|0,U-((g>>>0>>0)+O|0)|0,A,G);e=j+e|0;h=da+f|0;h=e>>>0>>0?h+1|0:h;f=e;m=H[k+72>>2];V=H[k+76>>2];e=Rj(m-B|0,V-((m>>>0>>0)+P|0)|0,C,J);j=f+e|0;f=da+h|0;q=e>>>0>j>>>0?f+1|0:f;e=l;D=e-Q|0;e=(e>>31)-((e>>>0>>0)+R|0)|0;W=e;l=e>>31;y=l^D;f=y-l|0;h=e>>31;e=(h^e)-((l>>>0>y>>>0)+h|0)|0;h=e;y=w-K|0;e=(w>>31)-((w>>>0>>0)+S|0)|0;w=e;l=f;t=e>>31;u=t^y;L=u-t|0;f=e>>31;e=(f^e)-((t>>>0>u>>>0)+f|0)|0;f=(h|0)==(e|0)&l>>>0>L>>>0|e>>>0>>0;f=Tj(-1,2147483647,f?l:L,f?h:e)>>>0>>0;e=da;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break f}e=G>>31;f=e;l=e^A;e=l-e|0;f=(f^G)-((f>>>0>l>>>0)+f|0)|0;h=E>>31;t=h^x;u=t-h|0;l=(h^E)-((h>>>0>t>>>0)+h|0)|0;h=(f|0)==(l|0)&e>>>0>u>>>0|f>>>0>l>>>0;e=h?e:u;f=h?f:l;h=J>>31;L=e;t=h^C;u=t-h|0;l=(h^J)-((h>>>0>t>>>0)+h|0)|0;e=(f|0)==(l|0)&e>>>0>u>>>0|f>>>0>l>>>0;f=Tj(-1,2147483647,e?L:u,e?f:l)>>>0>>0;e=da;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break f}l=1;e=0;f=n;n=Sj(Rj(j,q,x,E),da,r,s);f=f+n|0;h=da+N|0;h=f>>>0>>0?h+1|0:h;n=i-f|0;f=T-((f>>>0>i>>>0)+h|0)|0;n=Rj(n,f,n,f);x=da;f=g;h=Sj(Rj(j,q,A,G),da,r,s);i=h+z|0;g=da+O|0;g=h>>>0>i>>>0?g+1|0:g;h=f-i|0;f=U-((f>>>0>>0)+g|0)|0;g=Rj(h,f,h,f);i=g+n|0;f=da+x|0;f=g>>>0>i>>>0?f+1|0:f;n=i;g=Sj(Rj(j,q,C,J),da,r,s);i=g+B|0;h=da+P|0;h=g>>>0>i>>>0?h+1|0:h;g=m-i|0;i=V-((i>>>0>m>>>0)+h|0)|0;m=Rj(g,i,g,i);i=m+n|0;g=da+f|0;f=Rj(i,i>>>0>>0?g+1|0:g,r,s);i=da;m=i;if(!i&f>>>0<=1){break i}h=f;while(1){g=e<<1|l>>>31;l=l<<1;e=g;n=!i&h>>>0>7|(i|0)!=0;h=(i&3)<<30|h>>>2;i=i>>>2|0;if(n){continue}break}break h}if((d|0)>(f|0)){e=f<<1}else{if((d|0)<=0){H[o+8>>2]=0;H[o+12>>2]=0;break j}e=(d<<1)-2|0}e=(e<<2)+c|0;H[o+8>>2]=H[e>>2];H[o+12>>2]=H[e+4>>2]}p=1;break f}e=m;l=f;if(f-1|0){break g}}while(1){i=Tj(f,m,l,e);h=e+da|0;e=i+l|0;h=e>>>0>>0?h+1|0:h;l=(h&1)<<31|e>>>1;e=h>>>1|0;i=Rj(l,e,l,e);g=da;if((m|0)==(g|0)&f>>>0>>0|g>>>0>m>>>0){continue}break}}f=H[o+20>>2];if(!f){break f}g=f-1|0;h=H[H[o+16>>2]+(g>>>3&536870908)>>2];H[o+20>>2]=g;p=1;f=Rj(j,q,y,w);i=da;n=Rj(r,s,K,S);m=n+f|0;f=da+i|0;f=m>>>0>>0?f+1|0:f;i=Rj(l,e,D,W);g=h>>>g&1;h=g?0-i|0:i;m=h+m|0;n=f;f=da;i=n+(g?0-(f+((i|0)!=0)|0)|0:f)|0;Z=o,_=Sj(m,h>>>0>m>>>0?i+1|0:i,r,s),H[Z+12>>2]=_;f=Rj(j,q,D,W);i=da;j=Rj(r,s,Q,R);f=j+f|0;h=da+i|0;e=Rj(l,e,y,w);i=0-e|0;l=da;h=(f>>>0>>0?h+1|0:h)+(g?l:0-(((e|0)!=0)+l|0)|0)|0;i=g?e:i;f=i+f|0;Z=o,_=Sj(f,f>>>0>>0?h+1|0:h,r,s),H[Z+8>>2]=_}ca=k+80|0;e=p;break d}Ca();v()}i=e;if(!e){return 0}l:{if(H[a+8>>2]<=0){break l}l=H[M>>2];e=0;while(1){f=e<<2;g=H[f+Y>>2];j=H[a+16>>2];m:{if((g|0)>(j|0)){H[f+l>>2]=j;break m}f=f+l|0;j=H[a+12>>2];if((j|0)>(g|0)){H[f>>2]=j;break m}H[f>>2]=g}e=e+1|0;g=H[a+8>>2];if((e|0)<(g|0)){continue}break}f=0;if((g|0)<=0){break l}e=d<<3;j=e+c|0;q=b+e|0;while(1){g=f<<2;e=g+j|0;g=H[g+q>>2]+H[g+l>>2]|0;H[e>>2]=g;n:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break n}g=g+H[a+20>>2]|0}H[e>>2]=g}f=f+1|0;if((f|0)>2]){continue}break}}d=d+1|0;if((X|0)!=(d|0)){continue}break}}return i|0}Ca();v()}function xj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;a:{b:{if((e|0)!=2){break b}H[a+8>>2]=2;H[a- -64>>2]=f;M=a+32|0;e=H[M>>2];d=H[a+36>>2]-e|0;c:{if(d>>>0<=7){ya(M,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}H[a+36>>2]=e+8}p=1;d=H[a+56>>2];d=H[d+4>>2]-H[d>>2]|0;if((d|0)<=0){break b}o=a+60|0;d=d>>>2|0;X=d>>>0<=1?1:d;Y=a+68|0;d=0;while(1){e=H[a+56>>2];h=H[e>>2];if(H[e+4>>2]-h>>2>>>0<=d>>>0){break a}k=ca-80|0;ca=k;f=-1;h=H[h+(d<<2)>>2];e=-1;d:{if((h|0)==-1){break d}e=h+1|0;f=(e>>>0)%3|0?e:h-2|0;e=h-1|0;if((h>>>0)%3|0){break d}e=h+2|0}g=H[o+36>>2];h=H[g>>2];e:{f:{g:{h:{i:{g=H[g+4>>2]-h>>2;i=f<<2;f=H[H[o+32>>2]+28>>2];j=H[i+f>>2];if(g>>>0<=j>>>0){break i}e=H[f+(e<<2)>>2];if(e>>>0>=g>>>0){break i}j:{k:{l=H[h+(e<<2)>>2];f=H[h+(j<<2)>>2];if((l|0)>=(d|0)|(f|0)>=(d|0)){break k}h=(l<<3)+c|0;w=H[h+4>>2];g=(f<<3)+c|0;e=H[g+4>>2];j=H[h>>2];h=H[g>>2];if(!((j|0)!=(h|0)|(e|0)!=(w|0))){H[o+8>>2]=h;H[o+12>>2]=e;break j}p=H[H[o+4>>2]+(d<<2)>>2];H[k+72>>2]=0;H[k+76>>2]=0;g=k- -64|0;H[g>>2]=0;H[g+4>>2]=0;H[k+56>>2]=0;H[k+60>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+56|0);p=H[H[o+4>>2]+(f<<2)>>2];H[k+48>>2]=0;H[k+52>>2]=0;H[k+40>>2]=0;H[k+44>>2]=0;H[k+32>>2]=0;H[k+36>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+32|0);p=H[H[o+4>>2]+(l<<2)>>2];H[k+24>>2]=0;H[k+28>>2]=0;H[k+16>>2]=0;H[k+20>>2]=0;H[k+8>>2]=0;H[k+12>>2]=0;g=H[o>>2];if(!I[g+84|0]){p=H[H[g+68>>2]+(p<<2)>>2]}Sa(g,p,F[g+24|0],k+8|0);g=H[k+16>>2];n=H[k+40>>2];x=g-n|0;N=H[k+44>>2];g=H[k+20>>2]-(N+(g>>>0>>0)|0)|0;E=g;l=Rj(x,g,x,g);q=da;g=H[k+8>>2];z=H[k+32>>2];A=g-z|0;O=H[k+36>>2];g=H[k+12>>2]-(O+(g>>>0>>0)|0)|0;G=g;i=l;l=Rj(A,g,A,g);g=i+l|0;i=da+q|0;i=g>>>0>>0?i+1|0:i;l=H[k+24>>2];B=H[k+48>>2];C=l-B|0;P=H[k+52>>2];l=H[k+28>>2]-(P+(l>>>0>>0)|0)|0;J=l;m=g;g=Rj(C,l,C,l);r=m+g|0;i=da+i|0;s=g>>>0>r>>>0?i+1|0:i;if(!(s|r)){break k}p=0;D=Tj(-1,2147483647,r,s);f=h>>31;R=f;i=f>>31;Q=h;g=i;q=h^g;h=q-g|0;f=(f^g)-((g>>>0>q>>>0)+g|0)|0;g=f;f=e>>31;S=f;K=e;e=f>>31;q=K^e;m=q-e|0;i=f>>31;e=(i^f)-((e>>>0>q>>>0)+i|0)|0;f=(g|0)==(e|0)&h>>>0>m>>>0|e>>>0>>0;h=f?h:m;l=da;e=f?g:e;if((l|0)==(e|0)&h>>>0>D>>>0|e>>>0>l>>>0){break e}h=H[k+64>>2];T=H[k+68>>2];e=Rj(h-n|0,T-((h>>>0>>0)+N|0)|0,x,E);f=da;g=H[k+56>>2];U=H[k+60>>2];l=Rj(g-z|0,U-((g>>>0>>0)+O|0)|0,A,G);e=l+e|0;i=da+f|0;i=e>>>0>>0?i+1|0:i;f=e;m=H[k+72>>2];V=H[k+76>>2];e=Rj(m-B|0,V-((m>>>0>>0)+P|0)|0,C,J);l=f+e|0;f=da+i|0;q=e>>>0>l>>>0?f+1|0:f;e=j;D=e-Q|0;e=(e>>31)-((e>>>0>>0)+R|0)|0;W=e;j=e>>31;y=j^D;f=y-j|0;i=e>>31;e=(i^e)-((j>>>0>y>>>0)+i|0)|0;i=e;y=w-K|0;e=(w>>31)-((w>>>0>>0)+S|0)|0;w=e;j=f;t=e>>31;u=t^y;L=u-t|0;f=e>>31;e=(f^e)-((t>>>0>u>>>0)+f|0)|0;f=(i|0)==(e|0)&j>>>0>L>>>0|e>>>0>>0;f=Tj(-1,2147483647,f?j:L,f?i:e)>>>0>>0;e=da;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break e}e=G>>31;f=e;j=e^A;e=j-e|0;f=(f^G)-((f>>>0>j>>>0)+f|0)|0;i=E>>31;t=i^x;u=t-i|0;j=(i^E)-((i>>>0>t>>>0)+i|0)|0;i=(f|0)==(j|0)&e>>>0>u>>>0|f>>>0>j>>>0;e=i?e:u;f=i?f:j;i=J>>31;L=e;t=i^C;u=t-i|0;j=(i^J)-((i>>>0>t>>>0)+i|0)|0;e=(f|0)==(j|0)&e>>>0>u>>>0|f>>>0>j>>>0;f=Tj(-1,2147483647,e?L:u,e?f:j)>>>0>>0;e=da;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break e}j=1;e=0;f=n;n=Sj(Rj(l,q,x,E),da,r,s);f=f+n|0;i=da+N|0;i=f>>>0>>0?i+1|0:i;n=h-f|0;f=T-((f>>>0>h>>>0)+i|0)|0;n=Rj(n,f,n,f);x=da;f=g;i=Sj(Rj(l,q,A,G),da,r,s);h=i+z|0;g=da+O|0;g=h>>>0>>0?g+1|0:g;i=f-h|0;f=U-((f>>>0>>0)+g|0)|0;g=Rj(i,f,i,f);h=g+n|0;f=da+x|0;f=h>>>0>>0?f+1|0:f;n=h;g=Sj(Rj(l,q,C,J),da,r,s);h=g+B|0;i=da+P|0;i=h>>>0>>0?i+1|0:i;g=m-h|0;h=V-((h>>>0>m>>>0)+i|0)|0;m=Rj(g,h,g,h);h=m+n|0;g=da+f|0;f=Rj(h,h>>>0>>0?g+1|0:g,r,s);h=da;m=h;if(!h&f>>>0<=1){break h}i=f;while(1){g=e<<1|j>>>31;j=j<<1;e=g;n=!h&i>>>0>7|(h|0)!=0;i=(h&3)<<30|i>>>2;h=h>>>2|0;if(n){continue}break}break g}if((d|0)>(f|0)){e=f<<1}else{if((d|0)<=0){H[o+8>>2]=0;H[o+12>>2]=0;break j}e=(d<<1)-2|0}e=(e<<2)+c|0;H[o+8>>2]=H[e>>2];H[o+12>>2]=H[e+4>>2]}p=1;break e}Ca();v()}e=m;j=f;if(f-1|0){break f}}while(1){h=Tj(f,m,j,e);i=e+da|0;e=h+j|0;i=e>>>0>>0?i+1|0:i;j=(i&1)<<31|e>>>1;e=i>>>1|0;h=Rj(j,e,j,e);g=da;if((m|0)==(g|0)&f>>>0>>0|g>>>0>m>>>0){continue}break}}f=H[o+20>>2];if(!f){break e}g=f-1|0;i=H[H[o+16>>2]+(g>>>3&536870908)>>2];H[o+20>>2]=g;p=1;f=Rj(l,q,y,w);h=da;n=Rj(r,s,K,S);m=n+f|0;f=da+h|0;f=m>>>0>>0?f+1|0:f;h=Rj(j,e,D,W);g=i>>>g&1;i=g?0-h|0:h;m=i+m|0;n=f;f=da;h=n+(g?0-(f+((h|0)!=0)|0)|0:f)|0;Z=o,_=Sj(m,i>>>0>m>>>0?h+1|0:h,r,s),H[Z+12>>2]=_;f=Rj(l,q,D,W);h=da;l=Rj(r,s,Q,R);f=l+f|0;i=da+h|0;e=Rj(j,e,y,w);h=0-e|0;j=da;i=(f>>>0>>0?i+1|0:i)+(g?j:0-(((e|0)!=0)+j|0)|0)|0;h=g?e:h;f=h+f|0;Z=o,_=Sj(f,f>>>0>>0?i+1|0:i,r,s),H[Z+8>>2]=_}ca=k+80|0;if(!p){return 0}l:{if(H[a+8>>2]<=0){break l}g=H[M>>2];e=0;while(1){f=e<<2;h=H[f+Y>>2];j=H[a+16>>2];m:{if((h|0)>(j|0)){H[f+g>>2]=j;break m}f=f+g|0;j=H[a+12>>2];if((j|0)>(h|0)){H[f>>2]=j;break m}H[f>>2]=h}e=e+1|0;h=H[a+8>>2];if((e|0)<(h|0)){continue}break}f=0;if((h|0)<=0){break l}e=d<<3;j=e+c|0;l=b+e|0;while(1){h=f<<2;e=h+j|0;h=H[h+l>>2]+H[h+g>>2]|0;H[e>>2]=h;n:{if((h|0)>H[a+16>>2]){i=h-H[a+20>>2]|0}else{if((h|0)>=H[a+12>>2]){break n}i=h+H[a+20>>2]|0}H[e>>2]=i}f=f+1|0;if((f|0)>2]){continue}break}}d=d+1|0;if((X|0)!=(d|0)){continue}break}}return p|0}Ca();v()}function $a(a,b){var c=0,d=0,e=0,f=0,g=0;e=ca-16|0;ca=e;H[a+12>>2]=b;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d=a+16|0;H[d>>2]=0;H[d+4>>2]=0;F[d+5|0]=0;F[d+6|0]=0;F[d+7|0]=0;F[d+8|0]=0;F[d+9|0]=0;F[d+10|0]=0;F[d+11|0]=0;F[d+12|0]=0;c=d+16|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+32|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+48|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d- -64|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+80|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+96|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+112|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+128|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+144|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+160|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+176|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+192|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+208|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+224|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+240|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+256|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+272|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+288|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+304|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+320|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+336|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+352|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+368|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+384|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+400|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+416|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+432|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+448|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+464|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c=d+480|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;d=d+496|0;H[d>>2]=0;H[d+4>>2]=0;F[d+5|0]=0;F[d+6|0]=0;F[d+7|0]=0;F[d+8|0]=0;F[d+9|0]=0;F[d+10|0]=0;F[d+11|0]=0;F[d+12|0]=0;H[a+528>>2]=0;H[a+532>>2]=0;F[a+533|0]=0;F[a+534|0]=0;F[a+535|0]=0;F[a+536|0]=0;F[a+537|0]=0;F[a+538|0]=0;F[a+539|0]=0;F[a+540|0]=0;H[a+544>>2]=0;H[a+548>>2]=0;H[a+560>>2]=0;H[a+552>>2]=0;H[a+556>>2]=0;H[a+564>>2]=0;H[a+568>>2]=0;H[a+580>>2]=0;H[a+572>>2]=0;H[a+576>>2]=0;H[a+584>>2]=0;H[a+588>>2]=0;H[a+600>>2]=0;H[a+592>>2]=0;H[a+596>>2]=0;H[a+612>>2]=0;H[a+604>>2]=0;H[a+608>>2]=0;g=a+628|0;a:{b:{if(b){if(b>>>0<1073741824){break b}sa();v()}H[a+616>>2]=0;H[a+620>>2]=0;H[a+624>>2]=0;H[e+8>>2]=0;H[e>>2]=0;H[e+4>>2]=0;d=1;break a}d=b<<2;c=pa(d);H[a+604>>2]=c;f=c+d|0;H[a+612>>2]=f;ra(c,0,d);H[a+624>>2]=0;H[a+616>>2]=0;H[a+620>>2]=0;H[a+608>>2]=f;c=pa(d);H[a+616>>2]=c;f=c+d|0;H[a+624>>2]=f;ra(c,0,d);H[a+620>>2]=f;c=pa(d);H[e>>2]=c;f=c+d|0;H[e+8>>2]=f;ra(c,0,d);H[e+4>>2]=f;d=b<<5|1}tb(g,d,e);c=H[e>>2];if(c){H[e+4>>2]=c;oa(c)}H[e+8>>2]=0;H[e>>2]=0;H[e+4>>2]=0;if(b){b=b<<2;c=pa(b);H[e>>2]=c;f=b+c|0;H[e+8>>2]=f;ra(c,0,b);H[e+4>>2]=f}tb(a+640|0,d,e);b=H[e>>2];if(b){H[e+4>>2]=b;oa(b)}ca=e+16|0;return a}function gc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=O(0),n=O(0),o=0;a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=F[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=J[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=G[b>>1];if((e|0)<0){break b}G[(g<<1)+d>>1]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(e+32768>>>0>65535){break b}G[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(e>>>0>32767){break b}G[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;k=H[e+4>>2];while(1){if(b>>>0>=k>>>0){break b}h=H[b+4>>2];e=H[b>>2];i=e+32768|0;h=i>>>0<32768?h+1|0:h;if(!h&i>>>0>65535|h){break b}G[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=H[b+4>>2];e=H[b>>2];if(!k&e>>>0>32767|k){break b}G[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=H[a>>2];j=H[e>>2];g=j;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-j|0;if(!I[a+32|0]){j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(32767)|m>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(32767)|mO(1)){break d}e=(b<<1)+d|0;l=T(+m*32767+.5);f:{if(P(l)<2147483648){i=~~l;break f}i=-2147483648}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=1;if(c>>>0<=e>>>0){break d}ra((e<<1)+d|0,0,c-e<<1)}return j;case 9:g:{h:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=H[a>>2];j=H[e>>2];g=j;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-j|0;if(!I[a+32|0]){j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=M[g>>3];if(l>=32767|l<-32768|l!=l){break g}o=P(l);if(o==Infinity){break g}e=(b<<1)+d|0;if(o<2147483648){i=~~l}else{i=-2147483648}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=M[g>>3];if(l>=32767|l<-32768|(P(l)==Infinity|l!=l)){break g}if(l<0|l>1){break g}e=(b<<1)+d|0;l=T(l*32767+.5);i:{if(P(l)<2147483648){i=~~l;break i}i=-2147483648}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=1;if(c>>>0<=e>>>0){break g}ra((e<<1)+d|0,0,c-e<<1)}return j;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}ra((e<<1)+d|0,0,(c&255)-e<<1)}return j}ra((e<<1)+d|0,0,(c&255)-e<<1);return 1}function ec(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=O(0),n=O(0),o=0;a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=F[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=G[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=J[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=H[b>>2];b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=H[b>>2];if((e|0)<0){break b}H[(g<<2)+d>>2]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;k=H[e+4>>2];while(1){if(b>>>0>=k>>>0){break b}h=H[b+4>>2];e=H[b>>2];if(e- -2147483648>>>0<2147483648?h+1|0:h){break b}H[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=H[b+4>>2];e=H[b>>2];if(!k&e>>>0>2147483647|k){break b}H[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=H[a>>2];j=H[e>>2];g=j;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-j|0;if(!I[a+32|0]){j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(2147483648)|m>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(2147483648)|mO(1)){break d}e=(b<<2)+d|0;l=T(+m*2147483647+.5);f:{if(P(l)<2147483648){i=~~l;break f}i=-2147483648}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=1;if(c>>>0<=e>>>0){break d}ra((e<<2)+d|0,0,c-e<<2)}return j;case 9:g:{h:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=H[a>>2];j=H[e>>2];g=j;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-j|0;if(!I[a+32|0]){j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=M[g>>3];if(l>=2147483647|l<-2147483648|l!=l){break g}o=P(l);if(o==Infinity){break g}e=(b<<2)+d|0;if(o<2147483648){i=~~l}else{i=-2147483648}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=M[g>>3];if(l>=2147483647|l<-2147483648|(P(l)==Infinity|l!=l)){break g}if(l<0|l>1){break g}e=(b<<2)+d|0;l=T(l*2147483647+.5);i:{if(P(l)<2147483648){i=~~l;break i}i=-2147483648}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=1;if(c>>>0<=e>>>0){break g}ra((e<<2)+d|0,0,c-e<<2)}return j;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}ra((e<<2)+d|0,0,(c&255)-e<<2)}return j}ra((e<<2)+d|0,0,(c&255)-e<<2);return 1}function fc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=O(0);a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=F[b|0];if((e|0)<0){break b}G[(g<<1)+d>>1]=e&255;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=G[b>>1];if((e|0)<0){break b}G[(g<<1)+d>>1]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=J[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(e>>>0>65535){break b}G[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(e>>>0>65535){break b}G[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=H[b+4>>2];e=H[b>>2];if(!k&e>>>0>65535|k){break b}G[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=H[b+4>>2];e=H[b>>2];if(!k&e>>>0>65535|k){break b}G[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=H[a>>2];l=H[e>>2];g=l;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-l|0;if(!I[a+32|0]){l=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(65535)|m=O(0)){i=~~m>>>0}else{i=0}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}l=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(65535)|mO(1)){break d}e=(b<<1)+d|0;j=T(+m*65535+.5);f:{if(j<4294967296&j>=0){i=~~j>>>0;break f}i=0}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}l=1;if(c>>>0<=e>>>0){break d}ra((e<<1)+d|0,0,c-e<<1)}return l;case 9:g:{h:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=H[a>>2];l=H[e>>2];g=l;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-l|0;if(!I[a+32|0]){l=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=M[g>>3];if(j>=65535|j<0|(P(j)==Infinity|j!=j)){break g}e=(b<<1)+d|0;if(j<4294967296&j>=0){i=~~j>>>0}else{i=0}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}l=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=M[g>>3];if(j>=65535|j<0|(P(j)==Infinity|j!=j)){break g}if(j>1){break g}e=(b<<1)+d|0;j=T(j*65535+.5);i:{if(j<4294967296&j>=0){i=~~j>>>0;break i}i=0}G[e>>1]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}l=1;if(c>>>0<=e>>>0){break g}ra((e<<1)+d|0,0,c-e<<1)}return l;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];k=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}G[(g<<1)+d>>1]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}ra((e<<1)+d|0,0,(c&255)-e<<1)}return l}ra((e<<1)+d|0,0,(c&255)-e<<1);return 1}function Sa(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=O(0),l=0,m=0,n=O(0),o=0;a:{if(!d){break a}b:{c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=F[b|0];H[e>>2]=i;H[e+4>>2]=i>>31;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 1:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;H[e>>2]=I[b|0];H[e+4>>2]=0;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 2:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=G[b>>1];H[e>>2]=i;H[e+4>>2]=i>>31;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 3:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;H[e>>2]=J[b>>1];H[e+4>>2]=0;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 4:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=H[b>>2];H[e>>2]=i;H[e+4>>2]=i>>31;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 5:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;H[e>>2]=H[b>>2];H[e+4>>2]=0;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 6:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}i=H[b+4>>2];e=(g<<3)+d|0;H[e>>2]=H[b>>2];H[e+4>>2]=i;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 7:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=H[b>>2];i=H[b+4>>2];if((i|0)<0){break a}j=(g<<3)+d|0;H[j>>2]=e;H[j+4>>2]=i;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 8:d:{e=I[a+24|0];f=c&255;if(!(e>>>0>>0?e:f)){break d}if(I[a+32|0]){break a}e=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+e|0;e=H[a>>2];i=H[e+4>>2];e=H[e>>2];if((b|0)>=(i-e|0)){break a}g=b+e|0;h=c&255;b=0;while(1){k=L[g>>2];if(k>=O(0x8000000000000000)|k=O(1)?~~(k>O(0)?O(R(O(T(O(k*O(2.3283064365386963e-10)))),O(4294967296))):O(U(O(O(k-O(~~k>>>0>>>0))*O(2.3283064365386963e-10)))))>>>0:0;m=~~k>>>0;break e}j=-2147483648;m=0}H[e>>2]=m;H[e+4>>2]=j;b=b+1|0;e=I[a+24|0];if(b>>>0>=(e>>>0>>0?e:h)>>>0){break d}g=g+4|0;if(i>>>0>g>>>0){continue}break}break a}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 9:f:{e=I[a+24|0];f=c&255;if(!(e>>>0>>0?e:f)){break f}if(I[a+32|0]){break a}e=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+e|0;e=H[a>>2];i=H[e+4>>2];e=H[e>>2];if((b|0)>=(i-e|0)){break a}g=b+e|0;h=c&255;b=0;while(1){l=M[g>>3];if(l>=0x8000000000000000|l<-0x8000000000000000|l!=l){break a}o=P(l);if(o==Infinity){break a}e=(b<<3)+d|0;g:{if(o<0x8000000000000000){j=P(l)>=1?~~(l>0?R(T(l*2.3283064365386963e-10),4294967295):U((l-+(~~l>>>0>>>0))*2.3283064365386963e-10))>>>0:0;m=~~l>>>0;break g}j=-2147483648;m=0}H[e>>2]=m;H[e+4>>2]=j;b=b+1|0;e=I[a+24|0];if(b>>>0>=(e>>>0>>0?e:h)>>>0){break f}g=g+8|0;if(i>>>0>g>>>0){continue}break}break a}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 10:break c;default:break a}}e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;H[e>>2]=I[b|0];H[e+4>>2]=0;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0}ra(d,0,a<<3)}}function Oj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=a;a:{b:{c:{d:{e:{f:{g:{h:{a=H[a+8>>2];switch(H[a+28>>2]-1|0){case 4:break c;case 5:break d;case 2:break e;case 3:break f;case 0:break g;case 1:break h;default:break a}}f=I[a+24|0];c=pa(f);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(f){o=f&252;l=f&3;h=f>>>0<4;while(1){a=0;e=0;if(!h){while(1){k=g+(d<<2)|0;F[a+c|0]=H[k>>2];F[(a|1)+c|0]=H[k+4>>2];F[(a|2)+c|0]=H[k+8>>2];F[(a|3)+c|0]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){F[a+c|0]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+m|0,c,f);m=f+m|0;n=n+1|0;if((n|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,f);a=a+f|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,f);a=a+f|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,f);break b}f=I[a+24|0];c=pa(f);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(f){o=f&252;l=f&3;h=f>>>0<4;while(1){a=0;e=0;if(!h){while(1){k=g+(d<<2)|0;F[a+c|0]=H[k>>2];F[(a|1)+c|0]=H[k+4>>2];F[(a|2)+c|0]=H[k+8>>2];F[(a|3)+c|0]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){F[a+c|0]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+m|0,c,f);m=f+m|0;n=n+1|0;if((n|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,f);a=a+f|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,f);a=a+f|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,f);break b}h=I[a+24|0];i=h<<1;c=pa(i);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<1;k=g+(d<<2)|0;G[f+c>>1]=H[k>>2];G[(f|2)+c>>1]=H[k+4>>2];G[(f|4)+c>>1]=H[k+8>>2];G[(f|6)+c>>1]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){G[(a<<1)+c>>1]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=I[a+24|0];i=h<<1;c=pa(i);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<1;k=g+(d<<2)|0;G[f+c>>1]=H[k>>2];G[(f|2)+c>>1]=H[k+4>>2];G[(f|4)+c>>1]=H[k+8>>2];G[(f|6)+c>>1]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){G[(a<<1)+c>>1]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=I[a+24|0];i=h<<2;c=pa(i);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<2;k=g+(d<<2)|0;H[f+c>>2]=H[k>>2];H[(f|4)+c>>2]=H[k+4>>2];H[(f|8)+c>>2]=H[k+8>>2];H[(f|12)+c>>2]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){H[(a<<2)+c>>2]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=I[a+24|0];i=h<<2;c=pa(i);a=H[j+16>>2];if(H[a+80>>2]){g=H[H[a>>2]>>2]+H[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<2;k=g+(d<<2)|0;H[f+c>>2]=H[k>>2];H[(f|4)+c>>2]=H[k+4>>2];H[(f|8)+c>>2]=H[k+8>>2];H[(f|12)+c>>2]=H[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){H[(a<<2)+c>>2]=H[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[H[H[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;qa(a+H[H[H[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}qa(H[H[H[j+8>>2]+64>>2]>>2]+a|0,c,i)}oa(c);c=1}return c|0}function dc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=O(0);a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=F[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=G[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=J[b>>1];b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=H[b>>2];b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=H[b>>2];b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(H[b+4>>2]){break b}H[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=H[b>>2];if(H[b+4>>2]){break b}H[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=H[a>>2];k=H[e>>2];g=k;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-k|0;if(!I[a+32|0]){k=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(4294967296)|m=O(0)){i=~~m>>>0}else{i=0}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}k=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=L[g>>2];if(m>=O(4294967296)|mO(1)){break d}e=(b<<2)+d|0;j=T(+m*4294967295+.5);f:{if(j<4294967296&j>=0){i=~~j>>>0;break f}i=0}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}k=1;if(c>>>0<=e>>>0){break d}ra((e<<2)+d|0,0,c-e<<2)}return k;case 9:g:{h:{e=I[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=H[a>>2];k=H[e>>2];g=k;f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=H[e+4>>2];e=f-k|0;if(!I[a+32|0]){k=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=M[g>>3];if(j>=4294967295|j<0|(P(j)==Infinity|j!=j)){break g}e=(b<<2)+d|0;if(j<4294967296&j>=0){i=~~j>>>0}else{i=0}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}k=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=M[g>>3];if(j>=4294967295|j<0|(P(j)==Infinity|j!=j)){break g}if(j>1){break g}e=(b<<2)+d|0;j=T(j*4294967295+.5);i:{if(j<4294967296&j>=0){i=~~j>>>0;break i}i=0}H[e>>2]=i;b=b+1|0;e=I[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}k=1;if(c>>>0<=e>>>0){break g}ra((e<<2)+d|0,0,c-e<<2)}return k;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];h=H[e>>2];l=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=H[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}H[(g<<2)+d>>2]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ra((e<<2)+d|0,0,(c&255)-e<<2)}return k}ra((e<<2)+d|0,0,(c&255)-e<<2);return 1}function ye(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{c:{d:{e:{if(H[a+92>>2]==H[a+88>>2]){break e}c=H[a+52>>2];f:{if((c|0)!=H[a+56>>2]){H[c>>2]=b;H[a+52>>2]=c+4;break f}h=H[a+48>>2];g=c-h|0;d=g>>2;f=d+1|0;if(f>>>0>=1073741824){break a}e=g>>>1|0;g=g>>>0>=2147483644?1073741823:f>>>0>>0?e:f;if(g){if(g>>>0>=1073741824){break d}e=pa(g<<2)}else{e=0}f=e+(d<<2)|0;H[f>>2]=b;d=f+4|0;if((c|0)!=(h|0)){while(1){f=f-4|0;c=c-4|0;H[f>>2]=H[c>>2];if((c|0)!=(h|0)){continue}break}}H[a+56>>2]=e+(g<<2);H[a+52>>2]=d;H[a+48>>2]=f;if(!h){break f}oa(h)}H[a+84>>2]=0;c=-1;e=-1;g:{if((b|0)==-1){break g}d=H[a+4>>2];e=b+1|0;e=(e>>>0)%3|0?e:b-2|0;if((e|0)!=-1){c=H[H[d>>2]+(e<<2)>>2]}h:{if((b>>>0)%3|0){l=b-1|0;break h}l=b+2|0;e=-1;if((l|0)==-1){break g}}e=H[H[d>>2]+(l<<2)>>2]}i=e>>>3&536870908;d=H[a+36>>2];h=d+(c>>>3&536870908)|0;g=H[h>>2];f=1<>2]=f|g;f=a+8|0;if((b|0)!=-1){d=b+1|0;d=(d>>>0)%3|0?d:b-2|0}else{d=-1}Ua(f,c,d);d=H[a+36>>2]}f=d+i|0;d=H[f>>2];c=1<>2]=c|d;d=a+8|0;c=-1;i:{if((b|0)==-1){break i}c=b-1|0;if((b>>>0)%3|0){break i}c=b+2|0}Ua(d,e,c)}c=-1;c=(b|0)!=-1?H[H[H[a+4>>2]>>2]+(b<<2)>>2]:c;f=H[a+36>>2]+(c>>>3&536870908)|0;d=H[f>>2];e=1<>2]=d|e;Ua(a+8|0,c,b)}d=H[a+84>>2];if((d|0)>2){break e}while(1){e=N(d,12)+a|0;b=H[e+52>>2];if((b|0)==H[e+48>>2]){d=d+1|0;if((d|0)!=3){continue}break e}b=b-4|0;c=H[b>>2];H[e+52>>2]=b;H[a+84>>2]=d;if((c|0)==-1){break e}f=H[a+24>>2];b=(c>>>0)/3|0;j:{if(H[f+(b>>>3&268435452)>>2]>>>b&1){break j}k:{while(1){k=(c>>>0)/3|0;b=(k>>>3&268435452)+f|0;H[b>>2]=H[b>>2]|1<>2]>>2]+(c<<2)>>2]:d;f=H[a+36>>2]+(d>>>3&536870908)|0;e=H[f>>2];b=1<>2]=b|e;i=H[(H[H[a+16>>2]+96>>2]+N(k,12)|0)+((c>>>0)%3<<2)>>2];l=H[H[a+20>>2]+4>>2];f=H[l+4>>2];t:{if((f|0)!=H[l+8>>2]){H[f>>2]=i;H[l+4>>2]=f+4;break t}j=H[l>>2];h=f-j|0;g=h>>2;e=g+1|0;if(e>>>0>=1073741824){break s}b=h>>>1|0;h=h>>>0>=2147483644?1073741823:b>>>0>e>>>0?b:e;if(h){if(h>>>0>=1073741824){break d}e=pa(h<<2)}else{e=0}b=e+(g<<2)|0;H[b>>2]=i;g=b+4|0;if((f|0)!=(j|0)){while(1){b=b-4|0;f=f-4|0;H[b>>2]=H[f>>2];if((f|0)!=(j|0)){continue}break}}H[l+8>>2]=e+(h<<2);H[l+4>>2]=g;H[l>>2]=b;if(!j){break t}oa(j)}j=H[a+12>>2];f=H[j+4>>2];u:{if((f|0)!=H[j+8>>2]){H[f>>2]=c;H[j+4>>2]=f+4;break u}i=H[j>>2];h=f-i|0;g=h>>2;e=g+1|0;if(e>>>0>=1073741824){break r}b=h>>>1|0;h=h>>>0>=2147483644?1073741823:b>>>0>e>>>0?b:e;if(h){if(h>>>0>=1073741824){break d}e=pa(h<<2)}else{e=0}b=e+(g<<2)|0;H[b>>2]=c;g=b+4|0;if((f|0)!=(i|0)){while(1){b=b-4|0;f=f-4|0;H[b>>2]=H[f>>2];if((f|0)!=(i|0)){continue}break}}H[j+8>>2]=e+(h<<2);H[j+4>>2]=g;H[j>>2]=b;if(!i){break u}oa(i)}b=H[a+12>>2];H[H[b+12>>2]+(d<<2)>>2]=H[b+24>>2];H[b+24>>2]=H[b+24>>2]+1}if((c|0)==-1){break k}g=H[a+4>>2];f=-1;b=c+1|0;b=(b>>>0)%3|0?b:c-2|0;if((b|0)!=-1){f=H[H[g+12>>2]+(b<<2)>>2]}v:{w:{if((N(k,3)|0)!=(c|0)){d=c-1|0;break w}d=c+2|0;c=-1;if((d|0)==-1){break v}}c=H[H[g+12>>2]+(d<<2)>>2]}d=(c|0)==-1;e=(c>>>0)/3|0;if((f|0)!=-1){b=(f>>>0)/3|0;b=H[H[a+24>>2]+(b>>>3&268435452)>>2]&1<>2]+(b>>>3&536870908)>>2]>>>b&1){break x}k=0;b=H[H[g>>2]+(c<<2)>>2];if(!(H[H[a+36>>2]+(b>>>3&536870908)>>2]>>>b&1)){b=H[a+88>>2]+(b<<2)|0;e=H[b>>2];H[b>>2]=e+1;k=(e|0)<=0?2:1}if(H[a+84>>2]>=(k|0)&l){break m}j=N(k,12)+a|0;b=H[j+52>>2];y:{if((b|0)!=H[j+56>>2]){H[b>>2]=c;H[j+52>>2]=b+4;break y}i=H[j+48>>2];h=b-i|0;d=h>>2;g=d+1|0;if(g>>>0>=1073741824){break c}e=h>>>1|0;g=h>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break d}e=pa(g<<2)}else{e=0}d=e+(d<<2)|0;H[d>>2]=c;c=d+4|0;if((b|0)!=(i|0)){while(1){d=d-4|0;b=b-4|0;H[d>>2]=H[b>>2];if((b|0)!=(i|0)){continue}break}}H[j+48>>2]=d;H[j+52>>2]=c;H[j+56>>2]=e+(g<<2);if(!i){break y}oa(i)}if(H[a+84>>2]<=(k|0)){break x}H[a+84>>2]=k}if(l){break k}c=-1;if((f|0)==-1){break n}}c=H[H[H[a+4>>2]>>2]+(f<<2)>>2]}b=0;if(!(H[H[a+36>>2]+(c>>>3&536870908)>>2]>>>c&1)){b=H[a+88>>2]+(c<<2)|0;c=H[b>>2];H[b>>2]=c+1;b=(c|0)<=0?2:1}if(H[a+84>>2]<(b|0)){break l}c=f}f=H[a+24>>2];continue}break}k=N(b,12)+a|0;c=H[k+52>>2];z:{if((c|0)!=H[k+56>>2]){H[c>>2]=f;H[k+52>>2]=c+4;break z}i=H[k+48>>2];h=c-i|0;d=h>>2;g=d+1|0;if(g>>>0>=1073741824){break b}e=h>>>1|0;g=h>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break d}e=pa(g<<2)}else{e=0}d=e+(d<<2)|0;H[d>>2]=f;f=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;H[d>>2]=H[c>>2];if((c|0)!=(i|0)){continue}break}}H[k+48>>2]=d;H[k+52>>2]=f;H[k+56>>2]=e+(g<<2);if(!i){break z}oa(i)}d=H[a+84>>2];if((d|0)<=(b|0)){break j}H[a+84>>2]=b;d=b;break j}d=H[a+84>>2]}if((d|0)<3){continue}break}}return 1}wa();v()}sa();v()}sa();v()}sa();v()}function gd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;n=ca-96|0;ca=n;o=H[a+4>>2];d=H[o+32>>2];i=H[d+8>>2];j=H[d+12>>2];e=j;c=H[d+20>>2];f=H[d+16>>2];a:{if((e|0)<=(c|0)&f>>>0>=i>>>0|(c|0)>(e|0)){break a}p=H[d>>2];g=I[p+f|0];h=f+1|0;e=h?c:c+1|0;H[d+16>>2]=h;H[d+20>>2]=e;if((e|0)>=(j|0)&h>>>0>=i>>>0|(e|0)>(j|0)){break a}m=I[h+p|0];h=f+2|0;e=h>>>0<2?c+1|0:c;H[d+16>>2]=h;H[d+20>>2]=e;l=g<<24>>24;b:{if((l|0)>=0){k=H[a+216>>2];if(g>>>0>=(H[a+220>>2]-k|0)/144>>>0){break a}k=k+N(g,144)|0;if(H[k>>2]<0){break b}break a}if(H[a+212>>2]>=0){break a}k=a+212|0}H[k>>2]=b;c:{d:{e:{f:{g:{h:{k=J[o+36>>1];i:{if(((k<<8|k>>>8)&65535)>>>0>=258){if((e|0)>=(j|0)&h>>>0>=i>>>0|(e|0)>(j|0)){break a}e=I[h+p|0];f=f+3|0;c=f>>>0<3?c+1|0:c;H[d+16>>2]=f;H[d+20>>2]=c;if(e>>>0>1){break a}d=e>>>0<2?e:0;if(!m){break i}if(!d){break h}break a}if(m){break g}d=0}if((l|0)<0){e=a+184|0}else{c=H[a+216>>2]+N(g,144)|0;F[c+100|0]=0;e=c+104|0}if((d|0)!=1){break e}c=ca-112|0;ca=c;h=H[H[a+4>>2]+44>>2];d=pa(120);H[d>>2]=12172;H[d+4>>2]=0;H[d+116>>2]=0;H[d+112>>2]=e;H[d+108>>2]=h;H[d+12>>2]=0;H[d+16>>2]=0;H[d+20>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;H[d+32>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0;H[d+44>>2]=0;H[d+48>>2]=0;H[d+52>>2]=0;H[d+56>>2]=0;H[d+60>>2]=0;H[d+8>>2]=12384;f=d- -64|0;H[f>>2]=0;H[f+4>>2]=0;H[d+72>>2]=0;H[d+76>>2]=0;H[d+80>>2]=0;H[d+84>>2]=0;H[d+88>>2]=0;H[d+104>>2]=0;H[d+96>>2]=0;H[d+100>>2]=0;f=H[a+8>>2];H[c+48>>2]=0;H[c+52>>2]=0;H[c+40>>2]=0;H[c+44>>2]=0;i=c+32|0;H[i>>2]=0;H[i+4>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;g=c- -64|0;H[g>>2]=0;H[g+4>>2]=0;H[c+72>>2]=0;H[c+76>>2]=0;H[c+80>>2]=0;H[c+84>>2]=0;H[c+88>>2]=0;H[c+104>>2]=0;H[c+16>>2]=0;H[c+20>>2]=0;H[c+56>>2]=0;H[c+60>>2]=0;H[c+8>>2]=12384;H[c+96>>2]=0;H[c+100>>2]=0;H[c+12>>2]=f;g=H[f>>2];j=H[f+4>>2];F[c+111|0]=0;m=i;i=c+111|0;Oa(m,(j-g>>2>>>0)/3|0,i);g=H[c+12>>2];j=H[g+28>>2];g=H[g+24>>2];F[c+111|0]=0;Oa(c+44|0,j-g>>2,i);H[c+28>>2]=d;H[c+24>>2]=h;H[c+20>>2]=e;H[c+16>>2]=f;f=d+8|0;e=c+8|0;fd(f,e);j:{if((e|0)==(f|0)){H[d+92>>2]=H[e+84>>2];break j}Cb(d+56|0,H[e+48>>2],H[e+52>>2]);Cb(d+68|0,H[e+60>>2],H[e- -64>>2]);Cb(d+80|0,H[e+72>>2],H[e+76>>2]);H[d+92>>2]=H[e+84>>2];Aa(d+96|0,H[e+88>>2],H[e+92>>2])}H[c+8>>2]=12384;e=H[c+96>>2];if(e){H[c+100>>2]=e;oa(e)}e=H[c+80>>2];if(e){H[c+84>>2]=e;oa(e)}e=H[c+68>>2];if(e){H[c+72>>2]=e;oa(e)}e=H[c+56>>2];if(e){H[c+60>>2]=e;oa(e)}H[c+8>>2]=12620;e=H[c+44>>2];if(e){oa(e)}e=H[c+32>>2];if(e){oa(e)}ca=c+112|0;break d}if((l|0)>=0){break f}break a}if((l|0)<0){break a}}e=H[a+216>>2];c=H[o+44>>2];d=pa(80);H[d>>2]=12932;H[d+4>>2]=0;H[d+76>>2]=0;H[d+68>>2]=c;H[d+8>>2]=11872;H[d+12>>2]=0;H[d+16>>2]=0;H[d+20>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;H[d+32>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0;H[d+44>>2]=0;H[d+48>>2]=0;H[d+52>>2]=0;e=e+N(g,144)|0;f=e+104|0;H[d+72>>2]=f;H[d- -64>>2]=0;H[d+56>>2]=0;H[d+60>>2]=0;H[n+24>>2]=c;c=n;H[c+68>>2]=0;H[c+72>>2]=0;H[c+60>>2]=0;H[c+64>>2]=0;H[c+52>>2]=0;H[c+56>>2]=0;H[c+44>>2]=0;H[c+48>>2]=0;H[c+84>>2]=0;H[c+88>>2]=0;H[c+76>>2]=0;H[c+80>>2]=0;H[c+28>>2]=d;h=H[c+28>>2];H[c+8>>2]=H[c+24>>2];H[c+12>>2]=h;H[c+20>>2]=f;f=e+4|0;H[c+16>>2]=f;H[c+36>>2]=0;H[c+40>>2]=0;H[c+32>>2]=11872;e=H[c+20>>2];H[c>>2]=H[c+16>>2];H[c+4>>2]=e;e=c+32|0;Ie(e,f,c);c=d+8|0;fd(c,e);if((c|0)!=(e|0)){Cb(d+56|0,H[e+48>>2],H[e+52>>2])}He(e);break c}c=ca+-64|0;ca=c;h=H[H[a+4>>2]+44>>2];d=pa(80);H[d>>2]=12640;H[d+4>>2]=0;H[d+76>>2]=0;H[d+72>>2]=e;H[d+68>>2]=h;H[d+8>>2]=12804;H[d+12>>2]=0;H[d+16>>2]=0;H[d+20>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;H[d+32>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0;H[d+44>>2]=0;H[d+48>>2]=0;H[d+52>>2]=0;H[d- -64>>2]=0;i=d+56|0;f=i;H[f>>2]=0;H[f+4>>2]=0;f=H[a+8>>2];H[c+40>>2]=0;H[c+44>>2]=0;H[c+32>>2]=0;H[c+36>>2]=0;g=c+24|0;H[g>>2]=0;H[g+4>>2]=0;H[c+16>>2]=0;H[c+20>>2]=0;H[c+56>>2]=0;H[c+8>>2]=0;H[c+12>>2]=0;H[c+48>>2]=0;H[c+52>>2]=0;H[c>>2]=12804;H[c+4>>2]=f;j=H[f>>2];l=H[f+4>>2];F[c+63|0]=0;m=g;g=c+63|0;Oa(m,(l-j>>2>>>0)/3|0,g);j=H[c+4>>2];l=H[j+28>>2];j=H[j+24>>2];F[c+63|0]=0;Oa(c+36|0,l-j>>2,g);H[c+20>>2]=d;H[c+16>>2]=h;H[c+12>>2]=e;H[c+8>>2]=f;fd(d+8|0,c);Cb(i,H[c+48>>2],H[c+52>>2]);H[c>>2]=12804;e=H[c+48>>2];if(e){H[c+52>>2]=e;oa(e)}H[c>>2]=12620;e=H[c+36>>2];if(e){oa(e)}e=H[c+24>>2];if(e){oa(e)}ca=c- -64|0}if(!d){break a}}d=od(pa(64),d);c=H[a+4>>2];a=d;d=b;k:{l:{if((d|0)>=0){h=c+8|0;b=H[c+12>>2];i=H[c+8>>2];e=b-i>>2;m:{if((e|0)>(d|0)){break m}f=d+1|0;if(d>>>0>=e>>>0){Vb(h,f-e|0);break m}if(e>>>0<=f>>>0){break m}f=i+(f<<2)|0;if((f|0)!=(b|0)){while(1){b=b-4|0;e=H[b>>2];H[b>>2]=0;if(e){ea[H[H[e>>2]+4>>2]](e)}if((b|0)!=(f|0)){continue}break}}H[c+12>>2]=f}c=H[h>>2]+(d<<2)|0;b=H[c>>2];H[c>>2]=a;if(b){break l}break k}b=a;if(!a){break k}}ea[H[H[b>>2]+4>>2]](b)}q=(d^-1)>>>31|0}ca=n+96|0;return q|0}function Kd(a){var b=0,c=0,d=0,e=0,f=0,g=0;e=ca-16|0;ca=e;H[e+12>>2]=a;a:{if(a>>>0<=211){d=H[Jd(14256,14448,e+12|0)>>2];break a}if(a>>>0>=4294967292){X();v()}f=(a>>>0)/210|0;d=N(f,210);H[e+8>>2]=a-d;g=Jd(14448,14640,e+8|0)-14448>>2;while(1){d=H[(g<<2)+14448>>2]+d|0;a=5;while(1){b:{if((a|0)==47){a=211;while(1){b=(d>>>0)/(a>>>0)|0;if(b>>>0>>0){break a}if((N(a,b)|0)==(d|0)){break b}b=a+10|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+12|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+16|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+18|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+22|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+28|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+30|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+36|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+40|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+42|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+46|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+52|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+58|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+60|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+66|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+70|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+72|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+78|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+82|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+88|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+96|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+100|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+102|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+106|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+108|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+112|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+120|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+126|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+130|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+136|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+138|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+142|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+148|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+150|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+156|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+162|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+166|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+168|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+172|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+178|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+180|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+186|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+190|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+192|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+196|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+198|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((N(b,c)|0)==(d|0)){break b}b=a+208|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}a=a+210|0;if((N(b,c)|0)!=(d|0)){continue}break}break b}b=H[(a<<2)+14256>>2];c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}a=a+1|0;if((N(b,c)|0)!=(d|0)){continue}}break}d=g+1|0;a=(d|0)==48;g=a?0:d;f=a+f|0;d=N(f,210);continue}}ca=e+16|0;return d}function Ib(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=ca-16|0;ca=j;a:{b:{c:{d:{if(I[H[a+4>>2]+36|0]<=1){k=-1;c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;g=H[b+12>>2];if(K[b+8>>2]>>0&(g|0)<=(c|0)|(c|0)>(g|0)){break c}d=d+H[b>>2]|0;l=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[j+12>>2]=l;H[b+16>>2]=e;H[b+20>>2]=c;break d}k=-1;if(!Ea(1,j+12|0,b)){break c}l=H[j+12>>2]}e:{f:{g:{h:{i:{if(!l){break i}c=H[a+8>>2];if((H[c+4>>2]-H[c>>2]>>2>>>0)/3>>>0>>0){break c}c=J[H[a+4>>2]+36>>1];if(((c<<8|c>>>8)&65535)>>>0>=258){j:{while(1){if(!Ea(1,j+8|0,b)){break c}c=H[j+8>>2];if(!Ea(1,j+8|0,b)){break c}f=c+f|0;c=H[j+8>>2];if(f>>>0>>0){break c}g=f-c|0;c=H[a+40>>2];k:{if((c|0)!=H[a+44>>2]){H[c+4>>2]=f;H[c>>2]=g;H[a+40>>2]=c+12;l=H[j+12>>2];break k}m=H[a+36>>2];d=c-m|0;o=(d|0)/12|0;e=o+1|0;if(e>>>0>=357913942){break j}c=o<<1;h=o>>>0>=178956970?357913941:c>>>0>e>>>0?c:e;if(h){if(h>>>0>=357913942){break b}i=pa(N(h,12))}else{i=0}e=i+N(o,12)|0;H[e+4>>2]=f;H[e>>2]=g;c=va(e+N((d|0)/-12|0,12)|0,m,d);H[a+44>>2]=i+N(h,12);H[a+40>>2]=e+12;H[a+36>>2]=c;if(!m){break k}oa(m)}p=p+1|0;if(l>>>0>p>>>0){continue}break}k=0;Db(b,0,0);if(l){while(1){e=I[b+36|0];c=J[H[a+4>>2]+36>>1];l:{m:{if(((c<<8|c>>>8)&65535)>>>0<=513){if(!e){break l}p=0;c=H[b+32>>2];n=c>>>3|0;g=H[b+24>>2];e=n+g|0;d=H[b+28>>2];n:{if(e>>>0>=d>>>0){f=c;break n}e=I[e|0];f=c+1|0;H[b+32>>2]=f;n=f>>>3|0;p=e>>>(c&7)&1}if(d>>>0>g+n>>>0){break m}break l}if(!e){break l}p=0;f=H[b+32>>2];c=H[b+24>>2]+(f>>>3|0)|0;if(c>>>0>=K[b+28>>2]){break l}p=I[c|0]>>>(f&7)&1}H[b+32>>2]=f+1}c=H[a+36>>2]+N(k,12)|0;F[c+8|0]=I[c+8|0]&254|p&1;k=k+1|0;if((k|0)!=(l|0)){continue}break}}F[b+36|0]=0;f=H[b+20>>2];e=0;d=H[b+32>>2]+7|0;e=d>>>0<7?1:e;c=e>>>3|0;e=(e&7)<<29|d>>>3;d=e+H[b+16>>2]|0;c=c+f|0;H[b+16>>2]=d;H[b+20>>2]=d>>>0>>0?c+1|0:c;break i}sa();v()}while(1){d=H[b+8>>2];c=H[b+12>>2];g=c;c=H[b+20>>2];e=c;h=H[b+16>>2];f=h+4|0;c=f>>>0<4?c+1|0:c;i=f;if(f>>>0>d>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}m=H[b>>2];f=m+h|0;o=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=i;H[b+20>>2]=c;c=e;f=h+8|0;c=f>>>0<8?c+1|0:c;if(d>>>0>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}i=i+m|0;i=I[i|0]|I[i+1|0]<<8|(I[i+2|0]<<16|I[i+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;if(d>>>0<=f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}d=I[f+m|0];c=h+9|0;e=c>>>0<9?e+1|0:e;H[b+16>>2]=c;H[b+20>>2]=e;f=d&1;c=H[a+40>>2];o:{if((c|0)!=H[a+44>>2]){F[c+8|0]=f;H[c+4>>2]=i;H[c>>2]=o;H[a+40>>2]=c+12;l=H[j+12>>2];break o}m=H[a+36>>2];d=c-m|0;h=(d|0)/12|0;e=h+1|0;if(e>>>0>=357913942){break h}c=h<<1;g=h>>>0>=178956970?357913941:c>>>0>e>>>0?c:e;if(g){if(g>>>0>=357913942){break b}e=pa(N(g,12))}else{e=0}h=e+N(h,12)|0;F[h+8|0]=f;H[h+4>>2]=i;H[h>>2]=o;c=va(h+N((d|0)/-12|0,12)|0,m,d);H[a+44>>2]=e+N(g,12);H[a+40>>2]=h+12;H[a+36>>2]=c;if(!m){break o}oa(m)}n=n+1|0;if(l>>>0>n>>>0){continue}break}}H[j+8>>2]=0;c=J[H[a+4>>2]+36>>1];c=(c<<8|c>>>8)&65535;p:{if(c>>>0<=511){k=-1;c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;f=H[b+12>>2];if(K[b+8>>2]>>0&(f|0)<=(c|0)|(c|0)>(f|0)){break c}d=d+H[b>>2]|0;f=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;break p}if((c|0)!=512){break e}k=-1;if(!Ea(1,j+8|0,b)){break c}f=H[j+8>>2]}if(!f){break e}c=J[H[a+4>>2]+36>>1];if(((c<<8|c>>>8)&65535)>>>0<258){break f}n=0;l=0;while(1){if(!Ea(1,j+4|0,b)){break c}l=H[j+4>>2]+l|0;c=H[a+52>>2];q:{if((c|0)!=H[a+56>>2]){H[c>>2]=l;H[a+52>>2]=c+4;break q}i=H[a+48>>2];g=c-i|0;e=g>>2;d=e+1|0;if(d>>>0>=1073741824){break g}c=g>>>1|0;d=g>>>0>=2147483644?1073741823:c>>>0>d>>>0?c:d;if(d){if(d>>>0>=1073741824){break b}c=pa(d<<2)}else{c=0}e=c+(e<<2)|0;H[e>>2]=l;c=va(c,i,g);H[a+56>>2]=c+(d<<2);H[a+52>>2]=e+4;H[a+48>>2]=c;if(!i){break q}oa(i)}n=n+1|0;if((n|0)!=(f|0)){continue}break}break e}sa();v()}sa();v()}k=0;while(1){c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;g=H[b+12>>2];if(K[b+8>>2]>>0&(g|0)<=(c|0)|(c|0)>(g|0)){k=-1;break c}d=d+H[b>>2]|0;g=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;c=H[a+52>>2];r:{if((c|0)!=H[a+56>>2]){H[c>>2]=g;H[a+52>>2]=c+4;break r}h=H[a+48>>2];i=c-h|0;e=i>>2;d=e+1|0;if(d>>>0>=1073741824){break a}c=i>>>1|0;d=i>>>0>=2147483644?1073741823:c>>>0>d>>>0?c:d;if(d){if(d>>>0>=1073741824){break b}c=pa(d<<2)}else{c=0}e=c+(e<<2)|0;H[e>>2]=g;c=va(c,h,i);H[a+56>>2]=c+(d<<2);H[a+52>>2]=e+4;H[a+48>>2]=c;if(!h){break r}oa(h)}k=k+1|0;if((k|0)!=(f|0)){continue}break}}k=H[b+16>>2]}ca=j+16|0;return k}wa();v()}sa();v()}function Va(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=O(0),k=0,l=0;a:{if(!d){break a}b:{c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(F[b|0]);L[(h<<2)+d>>2]=i?O(j/O(127)):j;b=b+1|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 1:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(I[b|0]);L[(h<<2)+d>>2]=i?O(j/O(255)):j;b=b+1|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 2:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(G[b>>1]);L[(h<<2)+d>>2]=i?O(j/O(32767)):j;b=b+2|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 3:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(J[b>>1]);L[(h<<2)+d>>2]=i?O(j/O(65535)):j;b=b+2|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 4:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(H[b>>2]);L[(h<<2)+d>>2]=i?O(j*O(4.656612873077393e-10)):j;b=b+4|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 5:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(K[b>>2]);L[(h<<2)+d>>2]=i?O(j*O(2.3283064365386963e-10)):j;b=b+4|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 6:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(+K[b>>2]+ +H[b+4>>2]*4294967296);L[(h<<2)+d>>2]=i?O(j*O(10842021724855044e-35)):j;b=b+8|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 7:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];i=I[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=O(+K[b>>2]+ +K[b+4>>2]*4294967296);L[(h<<2)+d>>2]=i?O(j*O(5.421010862427522e-20)):j;b=b+8|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 8:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}L[(h<<2)+d>>2]=L[b>>2];b=b+4|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 9:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}L[(h<<2)+d>>2]=M[b>>3];b=b+8|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 10:break c;default:break a}}e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[a>>2];g=H[e>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=H[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}L[(h<<2)+d>>2]=I[b|0]?O(1):O(0);b=b+1|0;h=h+1|0;e=I[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0}ra(d,0,a<<2)}return l}function ic(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=O(0),m=O(0);a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}F[d+g|0]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){return 0}e=F[b|0];if((e|0)<0){break b}F[d+g|0]=e;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=J[b>>1];if((e+128&65535)>>>0>255){break b}F[d+g|0]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=J[b>>1];if(e>>>0>127){break b}F[d+g|0]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>2];if(e+128>>>0>255){break b}F[d+g|0]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>2];if(e>>>0>127){break b}F[d+g|0]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}i=H[b+4>>2];e=H[b>>2];h=e+128|0;i=h>>>0<128?i+1|0:i;if(!i&h>>>0>255|i){break b}F[d+g|0]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}i=H[b+4>>2];e=H[b>>2];if(!i&e>>>0>127|i){break b}F[d+g|0]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:e=I[a+24|0];c=c&255;d:{if(c>>>0>e>>>0?e:c){e=H[H[a>>2]>>2];f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+f|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break d}l=L[b>>2];if(l>=O(127)|lO(1)){break d}j=T(+l*127+.5);if(!(P(j)<2147483648)){break f}h=~~j;break e}if(!(m>>0<(c>>>0>e>>>0?e:c)>>>0){continue}break}}k=1;if(c>>>0<=e>>>0){break d}ra(d+e|0,0,c-e|0)}return k;case 9:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}j=M[b>>3];if(j>=127|j<-128|(P(j)==Infinity|j!=j)){break b}e=d+g|0;if(I[a+32|0]){if(j<0|j>1){break b}j=T(j*127+.5)}g:{if(P(j)<2147483648){h=~~j;break g}h=-2147483648}F[e|0]=h;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}F[d+g|0]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ra(d+e|0,0,(c&255)-e|0)}return k}ra(d+e|0,0,(c&255)-e|0);return 1}function hc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=O(0);a:{b:{if(!d){break b}c:{switch(H[a+28>>2]-1|0){case 0:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){return 0}e=F[b|0];if((e|0)<0){break b}F[d+g|0]=e;b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}F[d+g|0]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=J[b>>1];if(e>>>0>255){break b}F[d+g|0]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=J[b>>1];if(e>>>0>255){break b}F[d+g|0]=e;b=b+2|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>2];if(e>>>0>255){break b}F[d+g|0]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>2];if(e>>>0>255){break b}F[d+g|0]=e;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}i=H[b+4>>2];e=H[b>>2];if(!i&e>>>0>255|i){break b}F[d+g|0]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}i=H[b+4>>2];e=H[b>>2];if(!i&e>>>0>255|i){break b}F[d+g|0]=e;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:e=I[a+24|0];c=c&255;d:{if(c>>>0>e>>>0?e:c){e=H[H[a>>2]>>2];f=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+f|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break d}l=L[b>>2];if(l>=O(255)|lO(1)){break d}j=T(+l*255+.5);if(!(j<4294967296&j>=0)){break f}h=~~j>>>0;break e}if(!(l=O(0))){break f}h=~~l>>>0;break e}h=0}F[e|0]=h;b=b+4|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(c>>>0>e>>>0?e:c)>>>0){continue}break}}k=1;if(c>>>0<=e>>>0){break d}ra(d+e|0,0,c-e|0)}return k;case 9:e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}j=M[b>>3];if(j>=255|j<0|(P(j)==Infinity|j!=j)){break b}e=d+g|0;if(I[a+32|0]){if(j>1){break b}j=T(j*255+.5)}g:{if(j<4294967296&j>=0){h=~~j>>>0;break g}h=0}F[e|0]=h;b=b+8|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 10:break c;default:break b}}e=I[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=H[H[a>>2]>>2];i=H[a+48>>2];b=Rj(H[a+40>>2],H[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(K[H[a>>2]+4>>2]<=b>>>0){break b}F[d+g|0]=I[b|0];b=b+1|0;g=g+1|0;e=I[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ra(d+e|0,0,(c&255)-e|0)}return k}ra(d+e|0,0,(c&255)-e|0);return 1}function Hh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=ca-32|0;ca=g;i=H[a+32>>2];b=J[a+36>>1];a:{b:{if(((b<<8|b>>>8)&65535)>>>0<=513){b=H[i+8>>2];d=H[i+12>>2];c=b;b=H[i+20>>2];e=b;j=H[i+16>>2];f=j+4|0;b=f>>>0<4?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break a}n=H[i>>2];k=n+j|0;k=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);H[i+16>>2]=f;H[i+20>>2]=b;h=c;c=d;b=e;d=j+8|0;b=d>>>0<8?b+1|0:b;if(d>>>0>h>>>0&(b|0)>=(c|0)|(b|0)>(c|0)){break a}c=f+n|0;n=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[i+16>>2]=d;H[i+20>>2]=b;break b}if(!Fb(1,g+28|0,i)){break a}if(!Fb(1,g+24|0,H[a+32>>2])){break a}k=H[g+28>>2];n=H[g+24>>2]}if(k>>>0>1431655765){break a}d=H[a+32>>2];b=d;j=H[b+8>>2];c=H[b+16>>2];f=H[b+12>>2];b=H[b+20>>2];e=Sj(j-c|0,f-(b+(c>>>0>j>>>0)|0)|0,3,0);if(!da&e>>>0>>0){break a}e=Rj(k,0,3,0);if(!da&e>>>0>>0|((b|0)>=(f|0)&c>>>0>=j>>>0|(b|0)>(f|0))){break a}j=I[c+H[d>>2]|0];c=c+1|0;b=c?b:b+1|0;H[d+16>>2]=c;H[d+20>>2]=b;c:{d:{if(!j){d=0;c=ca-32|0;ca=c;H[c+24>>2]=0;H[c+16>>2]=0;H[c+20>>2]=0;e:{f:{b=N(k,3);if(b){if(b>>>0>=1073741824){break f}j=N(k,12);d=pa(j);ra(d,0,j)}b=kd(b,1,H[a+32>>2],d);g:{h:{if(!(!k|!b)){j=0;while(1){i:{b=(j<<2)+d|0;f=H[b>>2];e=f>>>1|0;f=(f&1?0-e|0:e)+l|0;if((f|0)<0){break i}H[c>>2]=f;e=H[b+4>>2];h=e>>>1|0;f=f+(e&1?0-h|0:h)|0;if((f|0)<0){break i}H[c+4>>2]=f;b=H[b+8>>2];e=b>>>1|0;l=f+(b&1?0-e|0:e)|0;if((l|0)<0){break i}H[c+8>>2]=l;Rb(H[a+44>>2]+96|0,c);j=j+3|0;b=1;o=o+1|0;if((o|0)!=(k|0)){continue}break h}break}b=0;break h}if(!d){break g}}oa(d)}ca=c+32|0;break e}sa();v()}if(b){break d}break a}if(n>>>0<=255){if(!k){break d}while(1){j:{H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;d=H[a+32>>2];b=d;j=H[b+16>>2];e=H[b+8>>2];c=H[b+20>>2];h=H[b+12>>2];b=h;if(e>>>0<=j>>>0&(c|0)>=(b|0)|(b|0)<(c|0)){break j}i=H[d>>2];l=I[i+j|0];b=c;f=j+1|0;b=f?b:b+1|0;H[d+16>>2]=f;H[d+20>>2]=b;H[g+8>>2]=l;l=e>>>0>>0&(c|0)>=(h|0)|(c|0)>(h|0);e=l?j:e;h=l?c:h;if((e|0)==(f|0)&(h|0)==(b|0)){break j}l=I[f+i|0];b=c;f=j+2|0;b=f>>>0<2?b+1|0:b;H[d+16>>2]=f;H[d+20>>2]=b;H[g+12>>2]=l;if((e|0)==(f|0)&(b|0)==(h|0)){break j}f=I[f+i|0];b=c;c=j+3|0;b=c>>>0<3?b+1|0:b;H[d+16>>2]=c;H[d+20>>2]=b;H[g+16>>2]=f;Rb(H[a+44>>2]+96|0,g+8|0);m=m+1|0;if((m|0)!=(k|0)){continue}break d}break}m=0;break a}if(n>>>0<=65535){if(!k){break d}while(1){k:{H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;i=H[a+32>>2];b=i;c=H[b+8>>2];d=H[b+12>>2];f=H[b+16>>2];b=H[b+20>>2];j=b;e=f+2|0;b=e>>>0<2?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break k}l=H[i>>2];h=l+f|0;h=I[h|0]|I[h+1|0]<<8;H[i+16>>2]=e;H[i+20>>2]=b;H[g+8>>2]=h;b=j;h=f+4|0;b=h>>>0<4?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break k}e=e+l|0;e=I[e|0]|I[e+1|0]<<8;H[i+16>>2]=h;H[i+20>>2]=b;H[g+12>>2]=e;e=c;b=j;c=f+6|0;b=c>>>0<6?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break k}d=h+l|0;d=I[d|0]|I[d+1|0]<<8;H[i+16>>2]=c;H[i+20>>2]=b;H[g+16>>2]=d;Rb(H[a+44>>2]+96|0,g+8|0);m=m+1|0;if((m|0)!=(k|0)){continue}break d}break}m=0;break a}l:{if(n>>>0>2097151){break l}b=J[a+36>>1];if(((b<<8|b>>>8)&65535)>>>0<514){break l}if(!k){break d}while(1){m:{H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;if(!Fb(1,g+4|0,H[a+32>>2])){break m}H[g+8>>2]=H[g+4>>2];if(!Fb(1,g+4|0,H[a+32>>2])){break m}H[g+12>>2]=H[g+4>>2];if(!Fb(1,g+4|0,H[a+32>>2])){break m}H[g+16>>2]=H[g+4>>2];Rb(H[a+44>>2]+96|0,g+8|0);m=m+1|0;if((m|0)!=(k|0)){continue}break d}break}m=0;break a}if(!k){break d}while(1){H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;i=H[a+32>>2];b=i;c=H[b+8>>2];d=H[b+12>>2];f=H[b+16>>2];b=H[b+20>>2];j=b;e=f+4|0;b=e>>>0<4?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break c}l=H[i>>2];h=l+f|0;h=I[h|0]|I[h+1|0]<<8|(I[h+2|0]<<16|I[h+3|0]<<24);H[i+16>>2]=e;H[i+20>>2]=b;H[g+8>>2]=h;b=j;h=f+8|0;b=h>>>0<8?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break c}e=e+l|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[i+16>>2]=h;H[i+20>>2]=b;H[g+12>>2]=e;e=c;b=j;c=f+12|0;b=c>>>0<12?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break c}d=h+l|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[i+16>>2]=c;H[i+20>>2]=b;H[g+16>>2]=d;Rb(H[a+44>>2]+96|0,g+8|0);m=m+1|0;if((m|0)!=(k|0)){continue}break}}H[H[a+4>>2]+80>>2]=n;m=1;break a}m=0}ca=g+32|0;return m|0}function zf(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=O(0),w=0;p=ca-16|0;ca=p;a:{if(!(H[a+60>>2]!=H[a- -64>>2]|H[a+48>>2]!=H[a+52>>2])){j=1;break a}j=1;if((ea[H[H[a>>2]+24>>2]](a)|0)<=0){break a}while(1){b:{b=ea[H[H[a>>2]+20>>2]](a,w)|0;c:{d:{e:{f=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(b<<2)>>2];switch(H[f+28>>2]-1|0){case 8:break d;case 0:case 2:case 4:break e;default:break c}}b=I[f+24|0];f:{if(!b){n=0;j=0;break f}j=0;b=b<<2;n=pa(b);ra(n,0,b);b=I[f+24|0];if(!b){break f}b=b<<2;j=pa(b);ra(j,0,b)}g:{h:{i:{switch(H[f+28>>2]-1|0){case 4:i=0;h=0;d=0;b=0;k=0;e=I[f+24|0];j:{if(!e){g=0;break j}e=e<<2;h=pa(e);ra(h,0,e);g=pa(e);ra(g,0,e)}k:{if(H[f+80>>2]){while(1){o=H[f>>2];c=H[o>>2];m=H[f+48>>2];e=H[f+40>>2];l=Rj(e,H[f+44>>2],d,b);m=m+l|0;s=c+m|0;c=e;m=qa(h,s,c);l=I[f+24|0];if(l){t=H[a+48>>2];e=0;while(1){r=e<<2;s=H[r+m>>2];if((s|0)<0){break k}H[g+r>>2]=s+H[t+(e+u<<2)>>2];e=e+1|0;if((l|0)!=(e|0)){continue}break}}qa(H[o>>2]+N(d,c)|0,g,c);d=d+1|0;b=d?b:b+1|0;if(!b&K[f+80>>2]>d>>>0){continue}break}}k=1}if(g){oa(g)}if(h){oa(h)}if(k){break h}break g;case 2:g=0;e=0;d=0;b=0;c=I[f+24|0];if(c){c=c<<1;e=pa(c);ra(e,0,c);g=pa(c);ra(g,0,c)}if(H[f+80>>2]){while(1){l=H[f>>2];h=H[l>>2];i=H[f+48>>2];c=H[f+40>>2];k=Rj(c,H[f+44>>2],d,b);i=i+k|0;k=qa(e,h+i|0,c);o=I[f+24|0];l:{if(!o){break l}m=H[a+48>>2];h=0;if((o|0)!=1){t=o&254;i=0;while(1){r=h<<1;G[r+g>>1]=J[k+r>>1]+J[m+(h+u<<2)>>1];r=h|1;s=r<<1;G[s+g>>1]=J[k+s>>1]+J[m+(r+u<<2)>>1];h=h+2|0;i=i+2|0;if((t|0)!=(i|0)){continue}break}}if(!(o&1)){break l}i=h<<1;G[i+g>>1]=J[i+k>>1]+J[m+(h+u<<2)>>1]}qa(H[l>>2]+N(d,c)|0,g,c);d=d+1|0;b=d?b:b+1|0;if(!b&K[f+80>>2]>d>>>0){continue}break}}if(g){oa(g)}if(e){oa(e)}break h;case 0:break i;default:break h}}h=0;e=0;d=0;b=0;c=I[f+24|0];if(c){e=pa(c);ra(e,0,c);h=pa(c);ra(h,0,c)}if(H[f+80>>2]){while(1){t=H[f>>2];g=H[t>>2];i=H[f+48>>2];c=H[f+40>>2];k=Rj(c,H[f+44>>2],d,b);i=i+k|0;k=qa(e,g+i|0,c);o=I[f+24|0];m:{if(!o){break m}m=H[a+48>>2];g=0;if((o|0)!=1){r=o&254;i=0;while(1){F[g+h|0]=I[g+k|0]+I[m+(g+u<<2)|0];l=g|1;F[l+h|0]=I[k+l|0]+I[m+(l+u<<2)|0];g=g+2|0;i=i+2|0;if((r|0)!=(i|0)){continue}break}}if(!(o&1)){break m}F[g+h|0]=I[g+k|0]+I[m+(g+u<<2)|0]}qa(H[t>>2]+N(d,c)|0,h,c);d=d+1|0;b=d?b:b+1|0;if(!b&K[f+80>>2]>d>>>0){continue}break}}if(h){oa(h)}if(e){oa(e)}}u=I[f+24|0]+u|0;i=1}if(j){oa(j)}if(n){oa(n)}if(i){break c}j=0;break a}e=H[H[a+60>>2]+(q<<2)>>2];h=H[a+36>>2];g=H[(ea[H[H[a>>2]+28>>2]](a)|0)+40>>2];H[p+12>>2]=H[f+56>>2];b=pa(32);H[p>>2]=b;H[p+4>>2]=24;H[p+8>>2]=-2147483616;d=I[1206]|I[1207]<<8|(I[1208]<<16|I[1209]<<24);c=I[1202]|I[1203]<<8|(I[1204]<<16|I[1205]<<24);F[b+16|0]=c;F[b+17|0]=c>>>8;F[b+18|0]=c>>>16;F[b+19|0]=c>>>24;F[b+20|0]=d;F[b+21|0]=d>>>8;F[b+22|0]=d>>>16;F[b+23|0]=d>>>24;d=I[1198]|I[1199]<<8|(I[1200]<<16|I[1201]<<24);c=I[1194]|I[1195]<<8|(I[1196]<<16|I[1197]<<24);F[b+8|0]=c;F[b+9|0]=c>>>8;F[b+10|0]=c>>>16;F[b+11|0]=c>>>24;F[b+12|0]=d;F[b+13|0]=d>>>8;F[b+14|0]=d>>>16;F[b+15|0]=d>>>24;d=I[1190]|I[1191]<<8|(I[1192]<<16|I[1193]<<24);c=I[1186]|I[1187]<<8|(I[1188]<<16|I[1189]<<24);F[b|0]=c;F[b+1|0]=c>>>8;F[b+2|0]=c>>>16;F[b+3|0]=c>>>24;F[b+4|0]=d;F[b+5|0]=d>>>8;F[b+6|0]=d>>>16;F[b+7|0]=d>>>24;F[b+24|0]=0;d=sd(g,p+12|0,p);if(F[p+11|0]<0){oa(H[p>>2])}b=q+1|0;n:{if(d){oe(f,e);break n}g=h+N(q,24)|0;q=H[g+4>>2];c=I[f+24|0];h=c<<2;d=pa(h);H[p>>2]=1065353216;v=L[g+20>>2];q=-1<0){L[p>>2]=v/O(q|0)}if((q|0)<=0){break b}o:{if(!H[e+80>>2]){break o}if(!c){n=0;j=0;while(1){qa(H[H[f+64>>2]>>2]+j|0,d,h);j=h+j|0;n=n+1|0;if(n>>>0>2]){continue}break}break o}o=H[H[e>>2]>>2]+H[e+48>>2]|0;t=c&254;r=c&1;i=0;k=0;j=0;while(1){q=H[g+8>>2];v=L[p>>2];n=0;m=0;if((c|0)!=1){while(1){l=n<<2;s=o+(j<<2)|0;L[l+d>>2]=O(v*O(H[s>>2]))+L[l+q>>2];l=l|4;L[l+d>>2]=O(v*O(H[s+4>>2]))+L[l+q>>2];n=n+2|0;j=j+2|0;m=m+2|0;if((t|0)!=(m|0)){continue}break}}if(r){n=n<<2;L[n+d>>2]=O(v*O(H[o+(j<<2)>>2]))+L[n+q>>2];j=j+1|0}qa(H[H[f+64>>2]>>2]+k|0,d,h);k=h+k|0;i=i+1|0;if(i>>>0>2]){continue}break}}oa(d)}q=b}j=1;w=w+1|0;if((ea[H[H[a>>2]+24>>2]](a)|0)>(w|0)){continue}break a}break}oa(d);j=0}ca=p+16|0;return j|0}function Le(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=ca+-64|0;ca=g;H[g+56>>2]=0;H[g+48>>2]=0;H[g+52>>2]=0;H[g+40>>2]=0;H[g+44>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;H[g+24>>2]=0;H[g+28>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;j=g+8|0;d=J[b+38>>1];a:{b:{if(!d){break b}c:{if(d>>>0<=511){h=H[b+8>>2];f=H[b+12>>2];e=H[b+20>>2];d=H[b+16>>2];i=d+4|0;e=i>>>0<4?e+1|0:e;if(h>>>0>>0&(e|0)>=(f|0)|(e|0)>(f|0)){break b}d=d+H[b>>2]|0;l=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[j+12>>2]=l;e=H[b+20>>2];d=H[b+16>>2]+4|0;e=d>>>0<4?e+1|0:e;H[b+16>>2]=d;H[b+20>>2]=e;break c}if(!hb(1,j+12|0,b)){break b}d=H[b+16>>2];e=H[b+20>>2];l=H[j+12>>2]}f=H[b+8>>2];i=f-d|0;d=H[b+12>>2]-((d>>>0>f>>>0)+e|0)|0;if(i>>>0>>6>>>0&(d|0)<=0|(d|0)<0){break b}e=H[j>>2];d=H[j+4>>2]-e>>2;d:{if(d>>>0>>0){ya(j,l-d|0);l=H[j+12>>2];break d}if(d>>>0<=l>>>0){break d}H[j+4>>2]=e+(l<<2)}i=1;if(!l){break a}d=H[b+16>>2];e=H[b+20>>2];r=H[j>>2];k=H[b+8>>2];o=H[b+12>>2];h=0;while(1){i=0;if((e|0)>=(o|0)&d>>>0>=k>>>0|(e|0)>(o|0)){break a}i=H[b>>2];p=I[i+d|0];d=d+1|0;e=d?e:e+1|0;H[b+16>>2]=d;H[b+20>>2]=e;f=p>>>2|0;m=0;e:{f:{g:{h:{s=p&3;switch(s|0){case 0:break f;case 3:break h;default:break g}}f=f+h|0;i=0;if(f>>>0>=l>>>0){break a}ra(r+(h<<2)|0,0,(p&252)+4|0);h=f;break e}while(1){if((d|0)==(k|0)&(e|0)==(o|0)){break b}l=I[d+i|0];d=d+1|0;e=d?e:e+1|0;H[b+16>>2]=d;H[b+20>>2]=e;f=l<<(m<<3|6)|f;m=m+1|0;if((s|0)!=(m|0)){continue}break}}H[r+(h<<2)>>2]=f}l=H[j+12>>2];h=h+1|0;if(l>>>0>h>>>0){continue}break}d=j+16|0;o=H[j>>2];f=H[j+16>>2];e=H[j+20>>2]-f|0;i:{if(e>>>0<=4194303){ya(d,1048576-(e>>>2|0)|0);break i}if((e|0)==4194304){break i}H[j+20>>2]=f+4194304}e=j+28|0;h=H[e>>2];f=H[j+32>>2]-h>>3;j:{if(f>>>0>>0){ob(e,l-f|0);h=H[e>>2];break j}if(f>>>0>l>>>0){H[j+32>>2]=(l<<3)+h}if(!l){break b}}k=H[d>>2];d=0;i=0;while(1){e=o+(d<<2)|0;j=H[e>>2];m=(d<<3)+h|0;f=i;H[m+4>>2]=f;H[m>>2]=j;e=H[e>>2];i=e+f|0;if(i>>>0>1048576){break b}k:{if(f>>>0>=i>>>0){break k}m=0;j=e&7;if(j){while(1){H[k+(f<<2)>>2]=d;f=f+1|0;m=m+1|0;if((j|0)!=(m|0)){continue}break}}if(e-1>>>0<=6){break k}while(1){e=k+(f<<2)|0;H[e>>2]=d;H[e+28>>2]=d;H[e+24>>2]=d;H[e+20>>2]=d;H[e+16>>2]=d;H[e+12>>2]=d;H[e+8>>2]=d;H[e+4>>2]=d;f=f+8|0;if((i|0)!=(f|0)){continue}break}}d=d+1|0;if((l|0)!=(d|0)){continue}break}n=(i|0)==1048576}i=n}l:{if(!i|(H[g+20>>2]?0:a)){break l}i=0;n=ca-16|0;ca=n;m:{n:{if(J[b+38>>1]<=511){h=H[b+8>>2];f=H[b+12>>2];j=f;e=H[b+20>>2];k=H[b+16>>2];d=k+8|0;e=d>>>0<8?e+1|0:e;if(d>>>0>h>>>0&(e|0)>=(f|0)|(e|0)>(f|0)){break m}k=k+H[b>>2]|0;f=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);k=I[k+4|0]|I[k+5|0]<<8|(I[k+6|0]<<16|I[k+7|0]<<24);H[b+16>>2]=d;H[b+20>>2]=e;break n}if(!gb(1,n+8|0,b)){break m}d=H[b+16>>2];e=H[b+20>>2];h=H[b+8>>2];j=H[b+12>>2];f=H[n+8>>2];k=H[n+12>>2]}l=h-d|0;h=j-((d>>>0>h>>>0)+e|0)|0;if((h|0)==(k|0)&f>>>0>l>>>0|h>>>0>>0){break m}e=e+k|0;h=d+f|0;e=h>>>0>>0?e+1|0:e;H[b+16>>2]=h;H[b+20>>2]=e;if((f|0)<=0){break m}b=H[b>>2]+d|0;H[g+48>>2]=b;d=f-1|0;e=d+b|0;h=I[e|0];o:{if(h>>>0<=63){H[g+52>>2]=d;b=I[e|0]&63;break o}p:{switch((h>>>6|0)-1|0){case 0:if(f>>>0<2){break m}d=f-2|0;H[g+52>>2]=d;b=b+d|0;b=I[b+1|0]<<8&16128|I[b|0];break o;case 1:if(f>>>0<3){break m}d=f-3|0;H[g+52>>2]=d;b=b+d|0;b=I[b+1|0]<<8|I[b+2|0]<<16&4128768|I[b|0];break o;default:break p}}d=f-4|0;H[g+52>>2]=d;b=b+d|0;b=(I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24))&1073741823}H[g+56>>2]=b+4194304;i=b>>>0<1069547520}ca=n+16|0;if(!i){break l}if(!a){t=1;break l}b=H[g+52>>2];f=H[g+56>>2];d=H[g+36>>2];e=H[g+48>>2];h=H[g+24>>2];while(1){q:{if(f>>>0>4194303){break q}while(1){if((b|0)<=0){break q}b=b-1|0;H[g+52>>2]=b;f=I[b+e|0]|f<<8;H[g+56>>2]=f;if(f>>>0<4194304){continue}break}}i=f&1048575;k=H[h+(i<<2)>>2];n=d+(k<<3)|0;f=(N(H[n>>2],f>>>20|0)+i|0)-H[n+4>>2]|0;H[g+56>>2]=f;H[(q<<2)+c>>2]=k;t=1;q=q+1|0;if((q|0)!=(a|0)){continue}break}}a=H[g+36>>2];if(a){H[g+40>>2]=a;oa(a)}a=H[g+24>>2];if(a){H[g+28>>2]=a;oa(a)}a=H[g+8>>2];if(a){H[g+12>>2]=a;oa(a)}ca=g- -64|0;return t}function nc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;e=ca-48|0;ca=e;f=J[6677]|J[6678]<<16;d=J[6675]|J[6676]<<16;G[e+38>>1]=d;G[e+40>>1]=d>>>16;G[e+42>>1]=f;G[e+44>>1]=f>>>16;d=H[3337];H[e+32>>2]=H[3336];H[e+36>>2]=d;d=H[3335];H[e+24>>2]=H[3334];H[e+28>>2]=d;d=H[3333];H[e+16>>2]=H[3332];H[e+20>>2]=d;g=H[b+8>>2];i=H[b+12>>2];h=H[b+20>>2];d=H[b+16>>2];f=d+5|0;h=f>>>0<5?h+1|0:h;a:{b:{if(g>>>0>>0&(h|0)>=(i|0)|(h|0)>(i|0)){d=Ma(e+16|0);if(d>>>0>=2147483632){break a}c:{d:{if(d>>>0>=11){b=(d|15)+1|0;c=pa(b);H[e+8>>2]=b|-2147483648;H[e>>2]=c;H[e+4>>2]=d;b=c+d|0;break d}F[e+11|0]=d;b=d+e|0;c=e;if(!d){break c}}qa(c,e+16|0,d)}F[b|0]=0;H[a>>2]=-2;b=a+4|0;if(F[e+11|0]>=0){a=H[e+4>>2];H[b>>2]=H[e>>2];H[b+4>>2]=a;H[b+8>>2]=H[e+8>>2];break b}za(b,H[e>>2],H[e+4>>2]);if(F[e+11|0]>=0){break b}oa(H[e>>2]);break b}f=d+H[b>>2]|0;d=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);F[c|0]=d;F[c+1|0]=d>>>8;F[c+2|0]=d>>>16;F[c+3|0]=d>>>24;F[c+4|0]=I[f+4|0];d=H[b+20>>2];f=H[b+16>>2]+5|0;d=f>>>0<5?d+1|0:d;H[b+16>>2]=f;H[b+20>>2]=d;if(Fa(c,1260,5)){d=pa(32);F[d+17|0]=0;F[d+16|0]=I[1496];c=I[1492]|I[1493]<<8|(I[1494]<<16|I[1495]<<24);b=I[1488]|I[1489]<<8|(I[1490]<<16|I[1491]<<24);F[d+8|0]=b;F[d+9|0]=b>>>8;F[d+10|0]=b>>>16;F[d+11|0]=b>>>24;F[d+12|0]=c;F[d+13|0]=c>>>8;F[d+14|0]=c>>>16;F[d+15|0]=c>>>24;c=I[1484]|I[1485]<<8|(I[1486]<<16|I[1487]<<24);b=I[1480]|I[1481]<<8|(I[1482]<<16|I[1483]<<24);F[d|0]=b;F[d+1|0]=b>>>8;F[d+2|0]=b>>>16;F[d+3|0]=b>>>24;F[d+4|0]=c;F[d+5|0]=c>>>8;F[d+6|0]=c>>>16;F[d+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,d,17);oa(d);break b}g=H[b+12>>2];if((g|0)<=(d|0)&K[b+8>>2]<=f>>>0|(d|0)>(g|0)){d=Ma(e+16|0);if(d>>>0>=2147483632){break a}e:{f:{if(d>>>0>=11){b=(d|15)+1|0;c=pa(b);H[e+8>>2]=b|-2147483648;H[e>>2]=c;H[e+4>>2]=d;b=c+d|0;break f}F[e+11|0]=d;b=d+e|0;c=e;if(!d){break e}}qa(c,e+16|0,d)}F[b|0]=0;H[a>>2]=-2;b=a+4|0;if(F[e+11|0]>=0){a=H[e+4>>2];H[b>>2]=H[e>>2];H[b+4>>2]=a;H[b+8>>2]=H[e+8>>2];break b}za(b,H[e>>2],H[e+4>>2]);if(F[e+11|0]>=0){break b}oa(H[e>>2]);break b}F[c+5|0]=I[f+H[b>>2]|0];g=H[b+20>>2];d=H[b+16>>2]+1|0;g=d?g:g+1|0;H[b+16>>2]=d;H[b+20>>2]=g;f=H[b+12>>2];if((f|0)<=(g|0)&K[b+8>>2]<=d>>>0|(g|0)>(f|0)){d=Ma(e+16|0);if(d>>>0>=2147483632){break a}g:{h:{if(d>>>0>=11){b=(d|15)+1|0;c=pa(b);H[e+8>>2]=b|-2147483648;H[e>>2]=c;H[e+4>>2]=d;b=c+d|0;break h}F[e+11|0]=d;b=d+e|0;c=e;if(!d){break g}}qa(c,e+16|0,d)}F[b|0]=0;H[a>>2]=-2;b=a+4|0;if(F[e+11|0]>=0){a=H[e+4>>2];H[b>>2]=H[e>>2];H[b+4>>2]=a;H[b+8>>2]=H[e+8>>2];break b}za(b,H[e>>2],H[e+4>>2]);if(F[e+11|0]>=0){break b}oa(H[e>>2]);break b}F[c+6|0]=I[d+H[b>>2]|0];h=H[b+20>>2];d=H[b+16>>2]+1|0;h=d?h:h+1|0;H[b+16>>2]=d;H[b+20>>2]=h;f=H[b+12>>2];if((f|0)<=(h|0)&K[b+8>>2]<=d>>>0|(f|0)<(h|0)){d=Ma(e+16|0);if(d>>>0>=2147483632){break a}i:{j:{if(d>>>0>=11){b=(d|15)+1|0;c=pa(b);H[e+8>>2]=b|-2147483648;H[e>>2]=c;H[e+4>>2]=d;b=c+d|0;break j}F[e+11|0]=d;b=d+e|0;c=e;if(!d){break i}}qa(c,e+16|0,d)}F[b|0]=0;H[a>>2]=-2;b=a+4|0;if(F[e+11|0]>=0){a=H[e+4>>2];H[b>>2]=H[e>>2];H[b+4>>2]=a;H[b+8>>2]=H[e+8>>2];break b}za(b,H[e>>2],H[e+4>>2]);if(F[e+11|0]>=0){break b}oa(H[e>>2]);break b}F[c+7|0]=I[d+H[b>>2]|0];g=H[b+20>>2];d=H[b+16>>2]+1|0;g=d?g:g+1|0;H[b+16>>2]=d;H[b+20>>2]=g;f=H[b+12>>2];if((f|0)<=(g|0)&K[b+8>>2]<=d>>>0|(g|0)>(f|0)){c=mc(e,e+16|0);H[a>>2]=-2;b=a+4|0;if(F[c+11|0]>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break b}za(b,H[c>>2],H[c+4>>2]);if(F[c+11|0]>=0){break b}oa(H[c>>2]);break b}F[c+8|0]=I[d+H[b>>2]|0];d=H[b+20>>2];g=H[b+16>>2];f=g+1|0;i=f?d:d+1|0;H[b+16>>2]=f;H[b+20>>2]=i;i=H[b+8>>2];h=H[b+12>>2];g=g+3|0;d=g>>>0<3?d+1|0:d;if(g>>>0>i>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){c=mc(e,e+16|0);H[a>>2]=-2;b=a+4|0;if(F[c+11|0]>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break b}za(b,H[c>>2],H[c+4>>2]);if(F[c+11|0]>=0){break b}oa(H[c>>2]);break b}d=c;c=H[b>>2]+f|0;G[d+10>>1]=I[c|0]|I[c+1|0]<<8;g=H[b+20>>2];c=H[b+16>>2]+2|0;g=c>>>0<2?g+1|0:g;H[b+16>>2]=c;H[b+20>>2]=g;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+4>>2]=0}ca=e+48|0;return}Na();v()}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;e=ca-96|0;ca=e;f=H[a+16>>2];F[e+92|0]=1;H[e+88>>2]=b;H[e+84>>2]=b;H[e+80>>2]=f;j=H[a+20>>2];d=H[j>>2];a:{b:{f=H[H[f+28>>2]+(b<<2)>>2];if(f>>>0>2]-d>>2>>>0){d=H[H[a+8>>2]+(H[d+(f<<2)>>2]<<2)>>2];f=H[a+4>>2];if(!I[f+84|0]){d=H[H[f+68>>2]+(d<<2)>>2]}H[e+72>>2]=0;H[e+76>>2]=0;j=e- -64|0;H[j>>2]=0;H[j+4>>2]=0;H[e+56>>2]=0;H[e+60>>2]=0;Sa(f,d,F[f+24|0],e+56|0);if((b|0)!=-1){f=b+1|0;j=(f>>>0)%3|0?f:b-2|0;m=((b>>>0)%3|0?-1:2)+b|0;while(1){d=j;f=m;c:{if(!H[a+28>>2]){break c}f=b+1|0;d=(f>>>0)%3|0?f:b-2|0;f=b-1|0;if((b>>>0)%3|0){break c}f=b+2|0}n=H[a+20>>2];b=H[n>>2];d=H[H[H[a+16>>2]+28>>2]+(d<<2)>>2];if(d>>>0>=H[n+4>>2]-b>>2>>>0){break b}d=H[H[a+8>>2]+(H[b+(d<<2)>>2]<<2)>>2];b=H[a+4>>2];if(!I[b+84|0]){d=H[H[b+68>>2]+(d<<2)>>2]}H[e+48>>2]=0;H[e+52>>2]=0;H[e+40>>2]=0;H[e+44>>2]=0;H[e+32>>2]=0;H[e+36>>2]=0;Sa(b,d,F[b+24|0],e+32|0);d=H[a+20>>2];b=H[d>>2];f=H[H[H[a+16>>2]+28>>2]+(f<<2)>>2];if(f>>>0>=H[d+4>>2]-b>>2>>>0){break a}d=H[H[a+8>>2]+(H[b+(f<<2)>>2]<<2)>>2];b=H[a+4>>2];if(!I[b+84|0]){d=H[H[b+68>>2]+(d<<2)>>2]}H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;Sa(b,d,F[b+24|0],e+8|0);g=H[e+8>>2];b=H[e+56>>2];d=g-b|0;p=H[e+60>>2];t=H[e+12>>2]-(p+(b>>>0>g>>>0)|0)|0;h=H[e+40>>2];f=H[e+64>>2];n=h-f|0;u=H[e+68>>2];y=H[e+44>>2]-(u+(f>>>0>h>>>0)|0)|0;g=Rj(d,t,n,y);w=o-g|0;x=i-(da+(g>>>0>o>>>0)|0)|0;i=w;h=H[e+16>>2];g=h-f|0;u=H[e+20>>2]-((f>>>0>h>>>0)+u|0)|0;k=H[e+32>>2];h=k-b|0;w=H[e+36>>2]-((b>>>0>k>>>0)+p|0)|0;b=Rj(g,u,h,w);o=i+b|0;i=da+x|0;i=b>>>0>o>>>0?i+1|0:i;b=l;l=d;p=t;k=H[e+48>>2];f=H[e+72>>2];d=k-f|0;t=H[e+76>>2];x=H[e+52>>2]-(t+(f>>>0>k>>>0)|0)|0;l=Rj(l,p,d,x);k=b+l|0;b=da+q|0;b=k>>>0>>0?b+1|0:b;l=H[e+24>>2];p=l-f|0;f=H[e+28>>2]-((f>>>0>l>>>0)+t|0)|0;q=Rj(p,f,h,w);l=k-q|0;q=b-(da+(k>>>0>>0)|0)|0;b=Rj(g,u,d,x);d=r-b|0;b=s-(da+(b>>>0>r>>>0)|0)|0;s=Rj(p,f,n,y);r=s+d|0;b=da+b|0;s=r>>>0>>0?b+1|0:b;b=H[e+88>>2];f=H[e+80>>2];d:{if(I[e+92|0]){e:{f:{g:{h:{if((b|0)==-1){break h}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;if((b|0)==-1|H[H[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break h}b=H[H[H[f+64>>2]+12>>2]+(b<<2)>>2];if((b|0)!=-1){break g}}H[e+88>>2]=-1;break f}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;H[e+88>>2]=b;if((b|0)!=-1){break e}}b=H[e+84>>2];d=-1;i:{if((b|0)==-1){break i}j:{if((b>>>0)%3|0){b=b-1|0;break j}b=b+2|0;d=-1;if((b|0)==-1){break i}}d=-1;if(H[H[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break i}b=H[H[H[f+64>>2]+12>>2]+(b<<2)>>2];d=-1;if((b|0)==-1){break i}d=b-1|0;if((b>>>0)%3|0){break i}d=b+2|0}F[e+92|0]=0;H[e+88>>2]=d;break d}if((b|0)!=H[e+84>>2]){break d}H[e+88>>2]=-1;break d}d=-1;k:{if((b|0)==-1){break k}l:{if((b>>>0)%3|0){b=b-1|0;break l}b=b+2|0;d=-1;if((b|0)==-1){break k}}d=-1;if(H[H[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break k}b=H[H[H[f+64>>2]+12>>2]+(b<<2)>>2];d=-1;if((b|0)==-1){break k}d=b-1|0;if((b>>>0)%3|0){break k}d=b+2|0}H[e+88>>2]=d}b=H[e+88>>2];if((b|0)!=-1){continue}break}}b=s>>31;f=b^r;d=f-b|0;b=(b^s)-((b>>>0>f>>>0)+b|0)|0;m=-1;f=2147483647;g=q>>31;h=g^l;j=h-g|0;n=(g^q)-((h>>>0>>0)+g|0)|0;h=n;k=j^-1;g=h^2147483647;n=i;m:{n:{if(!H[a+28>>2]){if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break m}b=b+h|0;a=d+j|0;b=a>>>0>>0?b+1|0:b;f=a;g=i;a=g>>31;d=a;m=d^o;a=m-d|0;i=a;d=(d^g)-((d>>>0>m>>>0)+d|0)|0;a=a+f|0;d=d^2147483647;i=(d|0)==(b|0)&(i^-1)>>>0>>0|b>>>0>d>>>0;a=i?-1:a;if(!(i&0)&(a|0)<=536870912|(a|0)<536870912){break m}b=0;a=a>>>29|0;break n}o:{if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break o}b=b+h|0;a=d+j|0;b=a>>>0>>0?b+1|0:b;k=i;d=i>>31;h=d^o;i=h-d|0;j=(d^k)-((d>>>0>h>>>0)+d|0)|0;g=j^2147483647;d=a;a=i;if((g|0)==(b|0)&d>>>0>(a^-1)>>>0|b>>>0>g>>>0){break o}b=b+j|0;m=a+d|0;b=m>>>0>>0?b+1|0:b;f=b;if(!b&m>>>0<536870913){break m}}b=f>>>29|0;a=(f&536870911)<<3|m>>>29}o=Sj(o,n,a,b);l=Sj(l,q,a,b);r=Sj(r,s,a,b)}H[c+8>>2]=o;H[c+4>>2]=l;H[c>>2]=r;ca=e+96|0;return}Ca();v()}Ca();v()}Ca();v()}function Jj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;H[a+8>>2]=e;r=a+32|0;g=H[r>>2];f=H[a+36>>2]-g>>2;a:{if(f>>>0>>0){ya(r,e-f|0);d=H[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}H[a+36>>2]=g+(e<<2);d=e}w=e<<2;f=e>>>0>1073741823?-1:w;m=ra(pa(f),0,f);p=ra(pa(f),0,f);b:{if((d|0)<=0){break b}i=H[a+32>>2];while(1){d=h<<2;f=H[d+m>>2];g=H[a+16>>2];c:{if((f|0)>(g|0)){H[d+i>>2]=g;break c}d=d+i|0;g=H[a+12>>2];if((g|0)>(f|0)){H[d>>2]=g;break c}H[d>>2]=f}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){g=f<<2;d=g+c|0;g=H[b+g>>2]+H[g+i>>2]|0;H[d>>2]=g;d:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break d}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=H[a+56>>2];x=H[f>>2];f=H[f+4>>2]-x|0;if((f|0)>=5){D=H[a+52>>2];s=H[a+48>>2];u=f>>>2|0;E=u>>>0<=2?2:u;y=e&-2;z=e&1;F=e&-4;A=e&3;B=e-1|0;n=1;while(1){e:{f:{g:{h:{if((n|0)!=(u|0)){g=H[(n<<2)+x>>2];t=(e|0)<=0;if(!t){ra(m,0,w)}if((g|0)==-1){i=N(e,n);break f}C=H[s>>2];l=0;f=g;while(1){i:{if(H[(f>>>3&536870908)+C>>2]>>>f&1){break i}i=H[H[H[s+64>>2]+12>>2]+(f<<2)>>2];if((i|0)==-1){break i}j=H[D>>2];h=H[s+28>>2];o=H[j+(H[h+(i<<2)>>2]<<2)>>2];if((o|0)>=(n|0)){break i}k=i+1|0;k=H[j+(H[h+(((k>>>0)%3|0?k:i-2|0)<<2)>>2]<<2)>>2];if((k|0)>=(n|0)){break i}i=H[j+(H[h+(i+((i>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((i|0)>=(n|0)){break i}j:{if(t){break j}i=N(e,i);j=N(e,k);o=N(e,o);h=0;q=0;if(B){while(1){H[(h<<2)+p>>2]=(H[(h+i<<2)+c>>2]+H[(h+j<<2)+c>>2]|0)-H[(h+o<<2)+c>>2];k=h|1;H[(k<<2)+p>>2]=(H[(i+k<<2)+c>>2]+H[(j+k<<2)+c>>2]|0)-H[(k+o<<2)+c>>2];h=h+2|0;q=q+2|0;if((y|0)!=(q|0)){continue}break}}if(z){H[(h<<2)+p>>2]=(H[(h+i<<2)+c>>2]+H[(h+j<<2)+c>>2]|0)-H[(h+o<<2)+c>>2]}if(t){break j}o=0;h=0;i=0;if(e>>>0>3){while(1){j=h<<2;k=j+m|0;H[k>>2]=H[j+p>>2]+H[k>>2];k=j|4;q=k+m|0;H[q>>2]=H[k+p>>2]+H[q>>2];k=j|8;q=k+m|0;H[q>>2]=H[k+p>>2]+H[q>>2];j=j|12;k=j+m|0;H[k>>2]=H[j+p>>2]+H[k>>2];h=h+4|0;i=i+4|0;if((F|0)!=(i|0)){continue}break}}if(!A){break j}while(1){i=h<<2;j=i+m|0;H[j>>2]=H[i+p>>2]+H[j>>2];h=h+1|0;o=o+1|0;if((A|0)!=(o|0)){continue}break}}l=l+1|0}k:{l:{if((f>>>0)%3|0){h=f-1|0;break l}h=f+2|0;i=-1;if((h|0)==-1){break k}}i=-1;if(H[(h>>>3&536870908)+C>>2]>>>h&1){break k}f=H[H[H[s+64>>2]+12>>2]+(h<<2)>>2];i=-1;if((f|0)==-1){break k}i=f-1|0;if((f>>>0)%3|0){break k}i=f+2|0}f=i;if((g|0)!=(f|0)&(f|0)!=-1){continue}break}i=N(e,n);if(!l){break f}if(t){break g}h=0;f=0;if(!B){break h}while(1){g=h<<2;j=g+m|0;H[j>>2]=H[j>>2]/(l|0);g=(g|4)+m|0;H[g>>2]=H[g>>2]/(l|0);h=h+2|0;f=f+2|0;if((y|0)!=(f|0)){continue}break}break h}Ca();v()}if(!z){break g}f=(h<<2)+m|0;H[f>>2]=H[f>>2]/(l|0)}if((d|0)<=0){break e}l=H[r>>2];h=0;while(1){d=h<<2;f=H[d+m>>2];g=H[a+16>>2];m:{if((f|0)>(g|0)){H[d+l>>2]=g;break m}d=d+l|0;g=H[a+12>>2];if((g|0)>(f|0)){H[d>>2]=g;break m}H[d>>2]=f}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}f=0;if((d|0)<=0){break e}d=i<<2;i=d+c|0;h=b+d|0;while(1){g=f<<2;d=g+i|0;g=H[h+g>>2]+H[g+l>>2]|0;H[d>>2]=g;n:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break n}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}if((d|0)<=0){break e}g=(N(n-1|0,e)<<2)+c|0;l=H[r>>2];h=0;while(1){d=h<<2;f=H[d+g>>2];j=H[a+16>>2];o:{if((f|0)>(j|0)){H[d+l>>2]=j;break o}d=d+l|0;j=H[a+12>>2];if((j|0)>(f|0)){H[d>>2]=j;break o}H[d>>2]=f}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}f=0;if((d|0)<=0){break e}d=i<<2;i=d+c|0;h=b+d|0;while(1){g=f<<2;d=g+i|0;g=H[h+g>>2]+H[g+l>>2]|0;H[d>>2]=g;p:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break p}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}n=n+1|0;if((E|0)!=(n|0)){continue}break}}oa(p);oa(m);return 1}function sj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;H[a+8>>2]=e;r=a+32|0;f=H[r>>2];j=H[a+36>>2]-f>>2;a:{if(j>>>0>>0){ya(r,e-j|0);d=H[a+8>>2];break a}d=e;if(e>>>0>=j>>>0){break a}H[a+36>>2]=f+(e<<2);d=e}u=e<<2;f=e>>>0>1073741823?-1:u;m=ra(pa(f),0,f);p=ra(pa(f),0,f);b:{if((d|0)<=0){break b}i=H[a+32>>2];while(1){f=h<<2;j=H[f+m>>2];d=H[a+16>>2];c:{if((j|0)>(d|0)){H[f+i>>2]=d;break c}f=f+i|0;d=H[a+12>>2];if((d|0)>(j|0)){H[f>>2]=d;break c}H[f>>2]=j}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){j=f<<2;d=j+c|0;j=H[b+j>>2]+H[j+i>>2]|0;H[d>>2]=j;d:{if((j|0)>H[a+16>>2]){j=j-H[a+20>>2]|0}else{if((j|0)>=H[a+12>>2]){break d}j=j+H[a+20>>2]|0}H[d>>2]=j}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=H[a+56>>2];w=H[f>>2];f=H[f+4>>2]-w|0;if((f|0)>=5){D=H[a+52>>2];x=H[a+48>>2];t=f>>>2|0;E=t>>>0<=2?2:t;y=e&-2;z=e&1;F=e&-4;A=e&3;B=e-1|0;n=1;while(1){e:{f:{g:{h:{if((n|0)!=(t|0)){j=H[(n<<2)+w>>2];s=(e|0)<=0;if(!s){ra(m,0,u)}if((j|0)==-1){g=N(e,n);break f}C=H[x+12>>2];q=0;f=j;while(1){h=H[(f<<2)+C>>2];i:{if((h|0)==-1){break i}o=H[D>>2];l=H[x>>2];k=H[o+(H[l+(h<<2)>>2]<<2)>>2];i=h+1|0;i=(i>>>0)%3|0?i:h-2|0;if((i|0)!=-1){g=H[l+(i<<2)>>2]}else{g=-1}j:{k:{if((h>>>0)%3|0){h=h-1|0;break k}h=h+2|0;i=-1;if((h|0)==-1){break j}}i=H[l+(h<<2)>>2]}if((k|0)>=(n|0)){break i}g=H[(g<<2)+o>>2];if((g|0)>=(n|0)){break i}i=H[o+(i<<2)>>2];if((i|0)>=(n|0)){break i}l:{if(s){break l}l=N(e,i);o=N(e,g);k=N(e,k);h=0;i=0;if(B){while(1){H[(h<<2)+p>>2]=(H[(h+l<<2)+c>>2]+H[(h+o<<2)+c>>2]|0)-H[(h+k<<2)+c>>2];g=h|1;H[(g<<2)+p>>2]=(H[(g+l<<2)+c>>2]+H[(g+o<<2)+c>>2]|0)-H[(g+k<<2)+c>>2];h=h+2|0;i=i+2|0;if((y|0)!=(i|0)){continue}break}}if(z){H[(h<<2)+p>>2]=(H[(h+l<<2)+c>>2]+H[(h+o<<2)+c>>2]|0)-H[(h+k<<2)+c>>2]}if(s){break l}o=0;h=0;k=0;if(e>>>0>3){while(1){l=h<<2;i=l+m|0;H[i>>2]=H[l+p>>2]+H[i>>2];g=l|4;i=g+m|0;H[i>>2]=H[g+p>>2]+H[i>>2];g=l|8;i=g+m|0;H[i>>2]=H[g+p>>2]+H[i>>2];g=l|12;i=g+m|0;H[i>>2]=H[g+p>>2]+H[i>>2];h=h+4|0;k=k+4|0;if((F|0)!=(k|0)){continue}break}}if(!A){break l}while(1){g=h<<2;i=g+m|0;H[i>>2]=H[g+p>>2]+H[i>>2];h=h+1|0;o=o+1|0;if((A|0)!=(o|0)){continue}break}}q=q+1|0}m:{n:{if((f>>>0)%3|0){h=f-1|0;break n}h=f+2|0;g=-1;if((h|0)==-1){break m}}f=H[(h<<2)+C>>2];g=-1;if((f|0)==-1){break m}g=f-1|0;if((f>>>0)%3|0){break m}g=f+2|0}f=g;if((j|0)!=(f|0)&(f|0)!=-1){continue}break}g=N(e,n);if(!q){break f}if(s){break g}h=0;f=0;if(!B){break h}while(1){i=h<<2;j=i+m|0;H[j>>2]=H[j>>2]/(q|0);j=(i|4)+m|0;H[j>>2]=H[j>>2]/(q|0);h=h+2|0;f=f+2|0;if((y|0)!=(f|0)){continue}break}break h}Ca();v()}if(!z){break g}f=(h<<2)+m|0;H[f>>2]=H[f>>2]/(q|0)}if((d|0)<=0){break e}k=H[r>>2];h=0;while(1){f=h<<2;j=H[f+m>>2];d=H[a+16>>2];o:{if((j|0)>(d|0)){H[f+k>>2]=d;break o}f=f+k|0;d=H[a+12>>2];if((d|0)>(j|0)){H[f>>2]=d;break o}H[f>>2]=j}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}f=0;if((d|0)<=0){break e}d=g<<2;i=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+i|0;g=H[g+j>>2]+H[g+k>>2]|0;H[d>>2]=g;p:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break p}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}if((d|0)<=0){break e}f=(N(n-1|0,e)<<2)+c|0;k=H[r>>2];h=0;while(1){j=h<<2;i=H[j+f>>2];d=H[a+16>>2];q:{if((i|0)>(d|0)){H[j+k>>2]=d;break q}j=j+k|0;d=H[a+12>>2];if((d|0)>(i|0)){H[j>>2]=d;break q}H[j>>2]=i}d=H[a+8>>2];h=h+1|0;if((d|0)>(h|0)){continue}break}f=0;if((d|0)<=0){break e}d=g<<2;i=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+i|0;g=H[g+j>>2]+H[g+k>>2]|0;H[d>>2]=g;r:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break r}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}n=n+1|0;if((E|0)!=(n|0)){continue}break}}oa(p);oa(m);return 1}function xa(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;f=ca-32|0;ca=f;a:{b=H[a+16>>2];b:{if(b>>>0>=341){H[a+16>>2]=b-341;b=H[a+4>>2];j=H[b>>2];c=b+4|0;H[a+4>>2]=c;b=H[a+8>>2];c:{if((b|0)!=H[a+12>>2]){d=b;break c}k=H[a>>2];if(k>>>0>>0){e=((c-k>>2)+1|0)/-2<<2;b=b-c|0;d=va(e+c|0,c,b)+b|0;H[a+8>>2]=d;H[a+4>>2]=e+H[a+4>>2];break c}d=(b|0)==(k|0)?1:b-k>>1;if(d>>>0>=1073741824){break a}e=d<<2;h=pa(e);l=e+h|0;e=h+(d&-4)|0;d=e;d:{if((b|0)==(c|0)){break d}b=b-c|0;m=b&-4;i=b-4|0;g=(i>>>2|0)+1&7;e:{if(!g){b=e;break e}d=0;b=e;while(1){H[b>>2]=H[c>>2];c=c+4|0;b=b+4|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}}d=e+m|0;if(i>>>0<28){break d}while(1){H[b>>2]=H[c>>2];H[b+4>>2]=H[c+4>>2];H[b+8>>2]=H[c+8>>2];H[b+12>>2]=H[c+12>>2];H[b+16>>2]=H[c+16>>2];H[b+20>>2]=H[c+20>>2];H[b+24>>2]=H[c+24>>2];H[b+28>>2]=H[c+28>>2];c=c+32|0;b=b+32|0;if((d|0)!=(b|0)){continue}break}}H[a+12>>2]=l;H[a+8>>2]=d;H[a+4>>2]=e;H[a>>2]=h;if(!k){break c}oa(k);d=H[a+8>>2]}H[d>>2]=j;H[a+8>>2]=H[a+8>>2]+4;break b}c=H[a+8>>2];b=H[a+4>>2];l=c-b|0;h=l>>2;g=H[a+12>>2];d=H[a>>2];e=g-d|0;if(h>>>0>2>>>0){if((c|0)!=(g|0)){n=f,o=pa(4092),H[n+8>>2]=o;d=a;f:{g:{b=H[a+8>>2];h:{if((b|0)!=H[a+12>>2]){e=b;break h}c=H[d+4>>2];h=H[d>>2];if(c>>>0>h>>>0){g=((c-h>>2)+1|0)/-2<<2;a=b-c|0;e=va(g+c|0,c,a)+a|0;H[d+8>>2]=e;H[d+4>>2]=g+H[d+4>>2];break h}e=(b|0)==(h|0)?1:b-h>>1;if(e>>>0>=1073741824){break g}a=e<<2;j=pa(a);l=a+j|0;a=j+(e&-4)|0;e=a;i:{if((b|0)==(c|0)){break i}b=b-c|0;m=b&-4;i=b-4|0;g=(i>>>2|0)+1&7;j:{if(!g){b=a;break j}e=0;b=a;while(1){H[b>>2]=H[c>>2];c=c+4|0;b=b+4|0;e=e+1|0;if((g|0)!=(e|0)){continue}break}}e=a+m|0;if(i>>>0<28){break i}while(1){H[b>>2]=H[c>>2];H[b+4>>2]=H[c+4>>2];H[b+8>>2]=H[c+8>>2];H[b+12>>2]=H[c+12>>2];H[b+16>>2]=H[c+16>>2];H[b+20>>2]=H[c+20>>2];H[b+24>>2]=H[c+24>>2];H[b+28>>2]=H[c+28>>2];c=c+32|0;b=b+32|0;if((e|0)!=(b|0)){continue}break}}H[d+12>>2]=l;H[d+8>>2]=e;H[d+4>>2]=a;H[d>>2]=j;if(!h){break h}oa(h);e=H[d+8>>2]}H[e>>2]=H[f+8>>2];H[d+8>>2]=H[d+8>>2]+4;break f}wa();v()}break b}n=f,o=pa(4092),H[n+8>>2]=o;qd(a,f+8|0);b=H[a+4>>2];j=H[b>>2];c=b+4|0;H[a+4>>2]=c;b=H[a+8>>2];k:{if((b|0)!=H[a+12>>2]){d=b;break k}k=H[a>>2];if(k>>>0>>0){e=((c-k>>2)+1|0)/-2<<2;b=b-c|0;d=va(e+c|0,c,b)+b|0;H[a+8>>2]=d;H[a+4>>2]=e+H[a+4>>2];break k}d=(b|0)==(k|0)?1:b-k>>1;if(d>>>0>=1073741824){break a}e=d<<2;h=pa(e);l=e+h|0;e=h+(d&-4)|0;d=e;l:{if((b|0)==(c|0)){break l}b=b-c|0;m=b&-4;i=b-4|0;g=(i>>>2|0)+1&7;m:{if(!g){b=e;break m}d=0;b=e;while(1){H[b>>2]=H[c>>2];c=c+4|0;b=b+4|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}}d=e+m|0;if(i>>>0<28){break l}while(1){H[b>>2]=H[c>>2];H[b+4>>2]=H[c+4>>2];H[b+8>>2]=H[c+8>>2];H[b+12>>2]=H[c+12>>2];H[b+16>>2]=H[c+16>>2];H[b+20>>2]=H[c+20>>2];H[b+24>>2]=H[c+24>>2];H[b+28>>2]=H[c+28>>2];c=c+32|0;b=b+32|0;if((d|0)!=(b|0)){continue}break}}H[a+12>>2]=l;H[a+8>>2]=d;H[a+4>>2]=e;H[a>>2]=h;if(!k){break k}oa(k);d=H[a+8>>2]}H[d>>2]=j;H[a+8>>2]=H[a+8>>2]+4;break b}H[f+24>>2]=a+12;m=(d|0)==(g|0)?1:e>>1;if(m>>>0>=1073741824){break a}e=m<<2;g=pa(e);H[f+8>>2]=g;j=e+g|0;H[f+20>>2]=j;d=(h<<2)+g|0;H[f+12>>2]=d;i=pa(4092);n:{if((h|0)!=(m|0)){break n}if((l|0)>0){d=((h+1|0)/-2<<2)+d|0;H[f+12>>2]=d;break n}d=(b|0)==(c|0)?1:l>>1;if(d>>>0>=1073741824){break a}b=d<<2;e=pa(b);H[f+8>>2]=e;j=b+e|0;H[f+20>>2]=j;d=e+(d&-4)|0;H[f+12>>2]=d;oa(g);b=H[a+4>>2];c=H[a+8>>2];g=e}H[d>>2]=i;i=d+4|0;H[f+16>>2]=i;e=b;if((b|0)!=(c|0)){while(1){c=c-4|0;qd(f+8|0,c);if(H[a+4>>2]!=(c|0)){continue}break}j=H[f+20>>2];i=H[f+16>>2];d=H[f+12>>2];g=H[f+8>>2];e=c;b=H[a+8>>2]}c=H[a>>2];H[a>>2]=g;H[f+8>>2]=c;H[a+4>>2]=d;H[f+12>>2]=e;H[a+8>>2]=i;H[f+16>>2]=b;d=H[a+12>>2];H[a+12>>2]=j;H[f+20>>2]=d;if((b|0)!=(e|0)){H[f+16>>2]=((e-b|0)+3&-4)+b}if(!c){break b}oa(c)}ca=f+32|0;return}wa();v()}function Aj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=O(0),j=0,k=0,l=0,m=O(0),n=O(0),o=O(0),p=O(0),q=O(0),r=0,s=O(0),t=O(0),u=O(0),w=O(0),x=0,y=O(0),z=O(0),A=O(0),B=0;a:{b:{if((e|0)!=2){break b}H[a+64>>2]=f;H[a+72>>2]=2;e=pa(8);d=H[a+68>>2];H[a+68>>2]=e;if(d){oa(d)}H[a+8>>2]=2;x=a+32|0;e=H[x>>2];d=H[a+36>>2]-e|0;c:{if(d>>>0<=7){ya(x,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}H[a+36>>2]=e+8}h=1;d=H[a+56>>2];d=H[d+4>>2]-H[d>>2]|0;if((d|0)<=0){break b}d=d>>>2|0;B=d>>>0<=1?1:d;d=0;while(1){e=H[a+56>>2];h=H[e>>2];if(H[e+4>>2]-h>>2>>>0<=d>>>0){break a}q=O(0);g=ca-48|0;ca=g;e=-1;h=H[h+(d<<2)>>2];f=-1;d:{if((h|0)==-1){break d}e=h+1|0;e=(e>>>0)%3|0?e:h-2|0;f=h-1|0;if((h>>>0)%3|0){break d}f=h+2|0}j=H[a+52>>2];h=H[j>>2];e:{f:{j=H[j+4>>2]-h>>2;l=e<<2;e=H[H[a+48>>2]+28>>2];r=H[l+e>>2];if(j>>>0<=r>>>0){break f}e=H[e+(f<<2)>>2];if(e>>>0>=j>>>0){break f}j=H[h+(e<<2)>>2];f=H[h+(r<<2)>>2];g:{if(!((j|0)>=(d|0)|(f|0)>=(d|0))){e=H[a+72>>2];h=(N(e,j)<<2)+c|0;m=O(H[h+4>>2]);e=(N(e,f)<<2)+c|0;p=O(H[e+4>>2]);y=O(H[e>>2]);n=O(H[h>>2]);if(!(y!=n|m!=p)){h=+m>2147483647;e=H[a+68>>2];if(O(P(m))>2]=m2147483647;if(O(P(n))>2]=n>2]+(d<<2)>>2];H[g+40>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;h=H[a+60>>2];if(!I[h+84|0]){e=H[H[h+68>>2]+(e<<2)>>2]}Va(h,e,F[h+24|0],g+32|0);f=H[H[a+64>>2]+(f<<2)>>2];H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;e=H[a+60>>2];if(!I[e+84|0]){f=H[H[e+68>>2]+(f<<2)>>2]}Va(e,f,F[e+24|0],g+16|0);f=H[H[a+64>>2]+(j<<2)>>2];H[g+8>>2]=0;H[g>>2]=0;H[g+4>>2]=0;e=H[a+60>>2];if(!I[e+84|0]){f=H[H[e+68>>2]+(f<<2)>>2]}Va(e,f,F[e+24|0],g);o=L[g+24>>2];s=O(L[g+8>>2]-o);t=L[g+20>>2];u=O(L[g+4>>2]-t);A=L[g+16>>2];w=O(L[g>>2]-A);z=O(O(s*s)+O(O(u*u)+O(O(w*w)+O(0))));h:{if(H[a+88>>2]>=258){i=O(0);if(!(z>O(0))){break h}}i=O(L[g+40>>2]-o);o=O(L[g+36>>2]-t);t=O(L[g+32>>2]-A);q=O(O(O(s*i)+O(O(u*o)+O(O(w*t)+O(0))))/z);i=O(i-O(s*q));s=O(i*i);i=O(o-O(u*q));o=O(i*i);i=O(t-O(w*q));i=O(W(O(O(s+O(o+O(O(i*i)+O(0))))/z)))}f=H[a+80>>2];if(f){e=f-1|0;h=H[H[a+76>>2]+(e>>>3&536870908)>>2];H[a+80>>2]=e;m=O(m-p);o=O(O(m*q)+p);n=O(n-y);p=O(n*i);e=h>>>e&1;p=O(o+(e?p:O(-p)));i=O(i*m);k=T(+O(O(O(n*q)+y)+(e?O(-i):i))+.5);i:{if(k<-2147483648|k!=k|k>2147483647){e=H[a+68>>2];H[e>>2]=-2147483648;break i}e=H[a+68>>2];if(P(k)<2147483648){h=~~k}else{h=-2147483648}H[e>>2]=h}k=T(+p+.5);j=k>2147483647;if(P(k)<2147483648){h=~~k}else{h=-2147483648}H[e+4>>2]=k<-2147483648?-2147483648:k!=k?-2147483648:j?-2147483648:h}f=(f|0)!=0;break g}j:{if((d|0)>(f|0)){e=H[a+72>>2];h=N(f,e);break j}if((d|0)<=0){f=1;if(H[a+72>>2]<=0){break g}h=H[a+68>>2];e=0;while(1){H[h+(e<<2)>>2]=0;e=e+1|0;if((e|0)>2]){continue}break}break g}e=H[a+72>>2];h=N(e,d-1|0)}f=1;if((e|0)<=0){break g}j=H[a+68>>2];e=0;while(1){H[j+(e<<2)>>2]=H[(e+h<<2)+c>>2];e=e+1|0;if((e|0)>2]){continue}break}}ca=g+48|0;break e}Ca();v()}h=f;if(!h){return 0}k:{if(H[a+8>>2]<=0){break k}r=H[a+68>>2];j=H[x>>2];e=0;while(1){f=e<<2;g=H[f+r>>2];l=H[a+16>>2];l:{if((g|0)>(l|0)){H[f+j>>2]=l;break l}f=f+j|0;l=H[a+12>>2];if((l|0)>(g|0)){H[f>>2]=l;break l}H[f>>2]=g}e=e+1|0;g=H[a+8>>2];if((e|0)<(g|0)){continue}break}f=0;if((g|0)<=0){break k}e=d<<3;r=e+c|0;l=b+e|0;while(1){g=f<<2;e=g+r|0;g=H[g+l>>2]+H[g+j>>2]|0;H[e>>2]=g;m:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break m}g=g+H[a+20>>2]|0}H[e>>2]=g}f=f+1|0;if((f|0)>2]){continue}break}}d=d+1|0;if((B|0)!=(d|0)){continue}break}}return h|0}Ca();v()}function kj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=O(0),j=0,k=0,l=O(0),m=O(0),n=O(0),o=O(0),p=0,q=O(0),r=O(0),s=O(0),t=O(0),u=O(0),w=0,x=O(0),y=O(0),z=0,A=O(0),B=0;a:{b:{if((e|0)!=2){break b}H[a+64>>2]=f;H[a+72>>2]=2;e=pa(8);d=H[a+68>>2];H[a+68>>2]=e;if(d){oa(d)}H[a+8>>2]=2;w=a+32|0;e=H[w>>2];d=H[a+36>>2]-e|0;c:{if(d>>>0<=7){ya(w,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}H[a+36>>2]=e+8}h=1;d=H[a+56>>2];d=H[d+4>>2]-H[d>>2]|0;if((d|0)<=0){break b}d=d>>>2|0;B=d>>>0<=1?1:d;d=0;while(1){f=H[a+56>>2];e=H[f>>2];if(H[f+4>>2]-e>>2>>>0<=d>>>0){break a}q=O(0);g=ca-48|0;ca=g;h=-1;d:{e:{e=H[e+(d<<2)>>2];if((e|0)==-1){break e}j=H[a+48>>2];f=e+1|0;f=(f>>>0)%3|0?f:e-2|0;if((f|0)!=-1){h=H[H[j>>2]+(f<<2)>>2]}f=-1;e=e+((e>>>0)%3|0?-1:2)|0;if((e|0)!=-1){f=H[H[j>>2]+(e<<2)>>2]}e=H[a+52>>2];j=H[e>>2];e=H[e+4>>2]-j>>2;if(e>>>0<=h>>>0|e>>>0<=f>>>0){break e}e=H[j+(h<<2)>>2];j=H[j+(f<<2)>>2];f:{if(!((d|0)<=(e|0)|(j|0)>=(d|0))){f=H[a+72>>2];h=(N(f,j)<<2)+c|0;l=O(H[h+4>>2]);f=(N(e,f)<<2)+c|0;o=O(H[f+4>>2]);x=O(H[f>>2]);m=O(H[h>>2]);if(!(x!=m|l!=o)){h=+l>2147483647;e=H[a+68>>2];if(O(P(l))>2]=l2147483647;if(O(P(m))>2]=m>2]+(d<<2)>>2];H[g+40>>2]=0;H[g+32>>2]=0;H[g+36>>2]=0;h=H[a+60>>2];if(!I[h+84|0]){f=H[H[h+68>>2]+(f<<2)>>2]}Va(h,f,F[h+24|0],g+32|0);f=H[H[a+64>>2]+(e<<2)>>2];H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;e=H[a+60>>2];if(!I[e+84|0]){f=H[H[e+68>>2]+(f<<2)>>2]}Va(e,f,F[e+24|0],g+16|0);h=H[H[a+64>>2]+(j<<2)>>2];H[g+8>>2]=0;H[g>>2]=0;H[g+4>>2]=0;e=H[a+60>>2];if(!I[e+84|0]){h=H[H[e+68>>2]+(h<<2)>>2]}Va(e,h,F[e+24|0],g);n=L[g+24>>2];r=O(L[g+8>>2]-n);s=L[g+20>>2];t=O(L[g+4>>2]-s);A=L[g+16>>2];u=O(L[g>>2]-A);y=O(O(r*r)+O(O(t*t)+O(O(u*u)+O(0))));g:{if(H[a+88>>2]>=258){i=O(0);if(!(y>O(0))){break g}}i=O(L[g+40>>2]-n);n=O(L[g+36>>2]-s);s=O(L[g+32>>2]-A);q=O(O(O(r*i)+O(O(t*n)+O(O(u*s)+O(0))))/y);i=O(i-O(r*q));r=O(i*i);i=O(n-O(t*q));n=O(i*i);i=O(s-O(u*q));i=O(W(O(O(r+O(n+O(O(i*i)+O(0))))/y)))}e=H[a+80>>2];if(e){f=e-1|0;h=H[H[a+76>>2]+(f>>>3&536870908)>>2];H[a+80>>2]=f;l=O(l-o);n=O(O(l*q)+o);m=O(m-x);o=O(m*i);f=h>>>f&1;o=O(n+(f?o:O(-o)));i=O(i*l);k=T(+O(O(O(m*q)+x)+(f?O(-i):i))+.5);h:{if(k<-2147483648|k!=k|k>2147483647){h=H[a+68>>2];H[h>>2]=-2147483648;break h}h=H[a+68>>2];if(P(k)<2147483648){f=~~k}else{f=-2147483648}H[h>>2]=f}k=T(+o+.5);j=k>2147483647;if(P(k)<2147483648){f=~~k}else{f=-2147483648}H[h+4>>2]=k<-2147483648?-2147483648:k!=k?-2147483648:j?-2147483648:f}h=(e|0)!=0;break f}i:{if((d|0)>(e|0)){f=H[a+72>>2];e=N(e,f);break i}if((d|0)<=0){h=1;if(H[a+72>>2]<=0){break f}e=H[a+68>>2];f=0;while(1){H[e+(f<<2)>>2]=0;f=f+1|0;if((f|0)>2]){continue}break}break f}f=H[a+72>>2];e=N(f,d-1|0)}h=1;if((f|0)<=0){break f}j=H[a+68>>2];f=0;while(1){H[j+(f<<2)>>2]=H[(e+f<<2)+c>>2];f=f+1|0;if((f|0)>2]){continue}break}}ca=g+48|0;break d}Ca();v()}if(!h){return 0}j:{if(H[a+8>>2]<=0){break j}z=H[a+68>>2];j=H[w>>2];e=0;while(1){f=e<<2;g=H[f+z>>2];p=H[a+16>>2];k:{if((g|0)>(p|0)){H[f+j>>2]=p;break k}f=f+j|0;p=H[a+12>>2];if((p|0)>(g|0)){H[f>>2]=p;break k}H[f>>2]=g}e=e+1|0;g=H[a+8>>2];if((e|0)<(g|0)){continue}break}f=0;if((g|0)<=0){break j}e=d<<3;z=e+c|0;p=b+e|0;while(1){g=f<<2;e=g+z|0;g=H[g+p>>2]+H[g+j>>2]|0;H[e>>2]=g;l:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break l}g=g+H[a+20>>2]|0}H[e>>2]=g}f=f+1|0;if((f|0)>2]){continue}break}}d=d+1|0;if((B|0)!=(d|0)){continue}break}}return h|0}Ca();v()}function Of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=ca-704|0;ca=f;n=1;a:{b:{c:{d:{if(J[b+38>>1]<515){break d}n=0;c=H[b+20>>2];d=H[b+12>>2];g=H[b+16>>2];if((c|0)>=(d|0)&g>>>0>=K[b+8>>2]|(c|0)>(d|0)){break d}p=I[H[b>>2]+g|0];g=g+1|0;c=g?c:c+1|0;H[b+16>>2]=g;H[b+20>>2]=c;g=H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+80>>2];c=ea[H[H[a>>2]+24>>2]](a)|0;H[f+40>>2]=0;H[f+32>>2]=0;H[f+36>>2]=0;if(c){if(c>>>0>=214748365){break c}c=N(c,20);d=pa(c);H[f+32>>2]=d;H[f+40>>2]=c+d;c=c-20|0;c=(c-((c>>>0)%20|0)|0)+20|0;q=f,r=ra(d,0,c)+c|0,H[q+36>>2]=r}e:{if((ea[H[H[a>>2]+24>>2]](a)|0)>0){while(1){c=ea[H[H[a>>2]+20>>2]](a,l)|0;c=H[H[H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2]+8>>2]+(c<<2)>>2];mb(c,g);F[c+84|0]=1;H[c+72>>2]=H[c+68>>2];d=H[c+28>>2];if(d>>>0>9){break e}f:{g:{h:{e=1<>2],d,6,0,i,i>>31);c=jc(pa(96),e);H[f>>2]=c;F[c+84|0]=1;H[c+72>>2]=H[c+68>>2];mb(c,g);c=H[a+64>>2];if(c>>>0>=K[a+68>>2]){break h}d=H[f>>2];H[f>>2]=0;H[c>>2]=d;c=c+4|0;H[a+64>>2]=c;break g}j=0;if(!I[c+24|0]){break f}while(1){d=H[a+52>>2];i=H[a+56>>2];i:{if(d>>>0>>0){H[d>>2]=0;H[a+52>>2]=d+4;break i}e=d;d=H[a+48>>2];m=e-d|0;k=m>>2;e=k+1|0;if(e>>>0>=1073741824){break b}o=k<<2;i=i-d|0;k=i>>>1|0;e=i>>>0>=2147483644?1073741823:e>>>0>>0?k:e;if(e){if(e>>>0>=1073741824){break a}i=pa(e<<2)}else{i=0}k=o+i|0;H[k>>2]=0;o=e<<2;e=va(i,d,m);H[a+56>>2]=o+e;H[a+52>>2]=k+4;H[a+48>>2]=e;if(!d){break i}oa(d)}j=j+1|0;if(j>>>0>2];i=H[a+64>>2]-e>>2;d=i+1|0;if(d>>>0<1073741824){e=H[a+68>>2]-e|0;j=e>>>1|0;e=e>>>0>=2147483644?1073741823:d>>>0>>0?j:d;if(e){if(e>>>0>=1073741824){break l}c=pa(e<<2)}j=H[f>>2];H[f>>2]=0;d=(i<<2)+c|0;H[d>>2]=j;e=(e<<2)+c|0;i=d+4|0;c=H[a+64>>2];j=H[a+60>>2];if((c|0)==(j|0)){break k}while(1){c=c-4|0;m=H[c>>2];H[c>>2]=0;d=d-4|0;H[d>>2]=m;if((c|0)!=(j|0)){continue}break}H[a+68>>2]=e;e=H[a+64>>2];H[a+64>>2]=i;c=H[a+60>>2];H[a+60>>2]=d;if((c|0)==(e|0)){break j}while(1){e=e-4|0;d=H[e>>2];H[e>>2]=0;if(d){Ga(d)}if((c|0)!=(e|0)){continue}break}break j}sa();v()}wa();v()}H[a+68>>2]=e;H[a+64>>2]=i;H[a+60>>2]=d}if(c){oa(c)}c=H[a+64>>2]}c=H[c-4>>2];d=H[f>>2];H[f>>2]=0;if(!d){break f}Ga(d)}i=H[c+28>>2];d=i-1|0;if(d>>>0<=10){e=H[(d<<2)+13584>>2]}else{e=-1}d=H[f+32>>2]+N(l,20)|0;j=I[c+24|0];H[d+16>>2]=j;H[d+12>>2]=(e|0)>0?e:0;H[d+8>>2]=i;H[d+4>>2]=h;H[d>>2]=c;h=h+j|0;l=l+1|0;if((ea[H[H[a>>2]+24>>2]](a)|0)>(l|0)){continue}break}}a=Ac(f,f+32|0);m:{n:{o:{switch(p|0){case 0:c=wb(f+48|0,h);b=Bd(c,b,a,g);h=H[c+8>>2];xb(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 1:c=wb(f+48|0,h);b=zd(c,b,a,g);h=H[c+8>>2];xb(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 2:c=ub(f+48|0,h);b=yd(c,b,a,g);h=H[c+8>>2];vb(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 3:c=ub(f+48|0,h);b=xd(c,b,a,g);h=H[c+8>>2];vb(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 4:c=$a(f+48|0,h);b=wd(c,b,a,g);h=H[c+8>>2];ab(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 5:c=$a(f+48|0,h);b=vd(c,b,a,g);h=H[c+8>>2];ab(c);if(!b){break m}if((h|0)==(g|0)){break n}break m;case 6:break o;default:break m}}c=$a(f+48|0,h);b=ud(c,b,a,g);h=H[c+8>>2];ab(c);if(!b|(h|0)!=(g|0)){break m}}n=1}b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a>>2];if(!b){break e}H[a+4>>2]=b;oa(b)}a=H[f+32>>2];if(!a){break d}H[f+36>>2]=a;oa(a)}ca=f+704|0;return n|0}sa();v()}sa();v()}wa();v()}function Zi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=ca-32|0;ca=e;a:{b:{switch(c-2|0){case 0:c=H[a+4>>2];f=H[a+12>>2];H[e+24>>2]=-1;H[e+16>>2]=-1;H[e+20>>2]=1065353216;H[e+8>>2]=-1;H[e+12>>2]=-1;if((b|0)==-2){break a}i=H[H[H[c+4>>2]+8>>2]+(f<<2)>>2];if((ea[H[H[c>>2]+8>>2]](c)|0)==1){h=H[H[H[c+4>>2]+8>>2]+(f<<2)>>2];c:{if((ea[H[H[c>>2]+8>>2]](c)|0)!=1|b-1>>>0>5){break c}g=ea[H[H[c>>2]+36>>2]](c)|0;a=ea[H[H[c>>2]+44>>2]](c,f)|0;if(!g|!a){break c}f=ea[H[H[c>>2]+40>>2]](c,f)|0;d:{if(f){if((b|0)!=6){break c}b=H[c+44>>2];d=pa(112);H[d+4>>2]=h;c=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=c;c=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=c;H[d+24>>2]=H[e+24>>2];H[d+40>>2]=a;c=a+12|0;H[d+36>>2]=c;H[d+32>>2]=f;H[d+28>>2]=b;H[d+68>>2]=a;H[d- -64>>2]=c;H[d+60>>2]=f;H[d+56>>2]=b;H[d+48>>2]=0;H[d+52>>2]=0;H[d>>2]=7144;H[d+88>>2]=1065353216;H[d+92>>2]=-1;H[d+80>>2]=-1;H[d+84>>2]=-1;H[d+72>>2]=1;H[d+76>>2]=-1;H[d+44>>2]=7668;a=d+96|0;break d}if((b|0)!=6){break c}b=H[c+44>>2];d=pa(112);H[d+4>>2]=h;c=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=c;c=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=c;H[d+24>>2]=H[e+24>>2];H[d+40>>2]=a;c=a+12|0;H[d+36>>2]=c;H[d+32>>2]=g;H[d+28>>2]=b;H[d+68>>2]=a;H[d- -64>>2]=c;H[d+60>>2]=g;H[d+56>>2]=b;H[d+48>>2]=0;H[d+52>>2]=0;H[d>>2]=8080;H[d+88>>2]=1065353216;H[d+92>>2]=-1;H[d+80>>2]=-1;H[d+84>>2]=-1;H[d+72>>2]=1;H[d+76>>2]=-1;H[d+44>>2]=8472;a=d+96|0}H[a>>2]=0;H[a+4>>2]=0;F[a+5|0]=0;F[a+6|0]=0;F[a+7|0]=0;F[a+8|0]=0;F[a+9|0]=0;F[a+10|0]=0;F[a+11|0]=0;F[a+12|0]=0}if(d){break a}}d=pa(28);H[d+4>>2]=i;a=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=a;a=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=a;H[d+24>>2]=H[e+24>>2];H[d>>2]=8860;break a;case 1:break b;default:break a}}c=H[a+4>>2];f=H[a+12>>2];H[e+24>>2]=-1;H[e+16>>2]=-1;H[e+20>>2]=1065353216;H[e+8>>2]=-1;H[e+12>>2]=-1;if((b|0)==-2){break a}i=H[H[H[c+4>>2]+8>>2]+(f<<2)>>2];if((ea[H[H[c>>2]+8>>2]](c)|0)==1){h=H[H[H[c+4>>2]+8>>2]+(f<<2)>>2];e:{if((ea[H[H[c>>2]+8>>2]](c)|0)!=1|b-1>>>0>5){break e}g=ea[H[H[c>>2]+36>>2]](c)|0;a=ea[H[H[c>>2]+44>>2]](c,f)|0;if(!g|!a){break e}f=ea[H[H[c>>2]+40>>2]](c,f)|0;f:{if(f){if((b|0)!=6){break e}b=H[c+44>>2];d=pa(112);H[d+4>>2]=h;c=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=c;c=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=c;H[d+24>>2]=H[e+24>>2];H[d+40>>2]=a;c=a+12|0;H[d+36>>2]=c;H[d+32>>2]=f;H[d+28>>2]=b;H[d+68>>2]=a;H[d- -64>>2]=c;H[d+60>>2]=f;H[d+56>>2]=b;H[d+48>>2]=0;H[d+52>>2]=0;H[d>>2]=9028;H[d+88>>2]=1065353216;H[d+92>>2]=-1;H[d+80>>2]=-1;H[d+84>>2]=-1;H[d+72>>2]=1;H[d+76>>2]=-1;H[d+44>>2]=9592;a=d+96|0;break f}if((b|0)!=6){break e}b=H[c+44>>2];d=pa(112);H[d+4>>2]=h;c=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=c;c=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=c;H[d+24>>2]=H[e+24>>2];H[d+40>>2]=a;c=a+12|0;H[d+36>>2]=c;H[d+32>>2]=g;H[d+28>>2]=b;H[d+68>>2]=a;H[d- -64>>2]=c;H[d+60>>2]=g;H[d+56>>2]=b;H[d+48>>2]=0;H[d+52>>2]=0;H[d>>2]=10032;H[d+88>>2]=1065353216;H[d+92>>2]=-1;H[d+80>>2]=-1;H[d+84>>2]=-1;H[d+72>>2]=1;H[d+76>>2]=-1;H[d+44>>2]=10452;a=d+96|0}H[a>>2]=0;H[a+4>>2]=0;F[a+5|0]=0;F[a+6|0]=0;F[a+7|0]=0;F[a+8|0]=0;F[a+9|0]=0;F[a+10|0]=0;F[a+11|0]=0;F[a+12|0]=0}if(d){break a}}d=pa(28);H[d+4>>2]=i;a=H[e+12>>2];H[d+8>>2]=H[e+8>>2];H[d+12>>2]=a;a=H[e+20>>2];H[d+16>>2]=H[e+16>>2];H[d+20>>2]=a;H[d+24>>2]=H[e+24>>2];H[d>>2]=10864}ca=e+32|0;return d|0}function Ki(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=O(0),f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=O(0),p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;if(H[c>>2]==H[c+4>>2]){m=H[d+80>>2];u=ca-16|0;ca=u;g=H[a+4>>2];k=I[b+24|0];h=H[d+48>>2];n=H[H[d>>2]>>2];c=u+8|0;H[c>>2]=1065353216;d=c;L[c>>2]=O(-1<>2];c=pa(k<<2);a:{if(!m|!k){break a}p=h+n|0;o=L[d>>2];n=H[a+8>>2];v=H[b>>2];d=H[b+48>>2];g=H[b+40>>2];w=H[b+44>>2];if(!I[b+84|0]){f=H[b+68>>2];s=k&254;t=k&1;a=0;while(1){b=H[v>>2];l=Rj(g,w,H[f+(i<<2)>>2],0)+d|0;h=qa(c,b+l|0,g);b=0;q=0;if((k|0)!=1){while(1){l=p+(a<<2)|0;j=b<<2;e=O(T(O(O(o*O(L[j+h>>2]-L[n+j>>2]))+O(.5))));b:{if(O(P(e))>2]=r;j=j|4;e=O(T(O(O(o*O(L[j+h>>2]-L[n+j>>2]))+O(.5))));c:{if(O(P(e))>2]=j;b=b+2|0;a=a+2|0;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(t){l=p+(a<<2)|0;b=b<<2;e=O(T(O(O(o*O(L[b+h>>2]-L[b+n>>2]))+O(.5))));d:{if(O(P(e))>2]=b;a=a+1|0}i=i+1|0;if((m|0)!=(i|0)){continue}break}break a}s=k&254;t=k&1;a=0;while(1){b=H[v>>2];h=Rj(g,w,i,l)+d|0;j=qa(c,b+h|0,g);b=0;q=0;if((k|0)!=1){while(1){h=p+(a<<2)|0;f=b<<2;e=O(T(O(O(o*O(L[f+j>>2]-L[f+n>>2]))+O(.5))));e:{if(O(P(e))>2]=r;f=f|4;e=O(T(O(O(o*O(L[f+j>>2]-L[f+n>>2]))+O(.5))));f:{if(O(P(e))>2]=f;b=b+2|0;a=a+2|0;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(t){h=p+(a<<2)|0;b=b<<2;e=O(T(O(O(o*O(L[b+j>>2]-L[b+n>>2]))+O(.5))));g:{if(O(P(e))>2]=b;a=a+1|0}b=l;i=i+1|0;b=i?b:b+1|0;l=b;if((i|0)!=(m|0)|b){continue}break}}oa(c);ca=u+16|0;return 1}j=ca-16|0;ca=j;m=H[a+4>>2];i=I[b+24|0];g=H[d+48>>2];h=H[H[d>>2]>>2];d=j+8|0;H[d>>2]=1065353216;l=d;L[d>>2]=O(-1<>2];d=pa(i<<2);m=H[c+4>>2];q=H[c>>2];h:{if(!i|(m|0)==(q|0)){break h}n=h+g|0;c=m-q>>2;u=c>>>0<=1?1:c;o=L[l>>2];h=H[a+8>>2];v=H[b>>2];l=H[b+48>>2];m=H[b+40>>2];w=H[b+44>>2];if(I[b+84|0]){s=i&254;t=i&1;a=0;c=0;while(1){b=H[v>>2];g=Rj(m,w,H[q+(c<<2)>>2],0)+l|0;p=qa(d,b+g|0,m);b=0;k=0;if((i|0)!=1){while(1){g=n+(a<<2)|0;f=b<<2;e=O(T(O(O(o*O(L[f+p>>2]-L[h+f>>2]))+O(.5))));i:{if(O(P(e))>2]=r;f=f|4;e=O(T(O(O(o*O(L[f+p>>2]-L[h+f>>2]))+O(.5))));j:{if(O(P(e))>2]=f;b=b+2|0;a=a+2|0;k=k+2|0;if((s|0)!=(k|0)){continue}break}}if(t){g=n+(a<<2)|0;b=b<<2;e=O(T(O(O(o*O(L[b+p>>2]-L[b+h>>2]))+O(.5))));k:{if(O(P(e))>2]=b;a=a+1|0}c=c+1|0;if((u|0)!=(c|0)){continue}break}break h}s=H[b+68>>2];t=i&254;x=i&1;a=0;c=0;while(1){b=H[v>>2];g=Rj(m,w,H[s+(H[q+(c<<2)>>2]<<2)>>2],0)+l|0;p=qa(d,b+g|0,m);b=0;k=0;if((i|0)!=1){while(1){g=n+(a<<2)|0;f=b<<2;e=O(T(O(O(o*O(L[f+p>>2]-L[h+f>>2]))+O(.5))));l:{if(O(P(e))>2]=r;f=f|4;e=O(T(O(O(o*O(L[f+p>>2]-L[h+f>>2]))+O(.5))));m:{if(O(P(e))>2]=f;b=b+2|0;a=a+2|0;k=k+2|0;if((t|0)!=(k|0)){continue}break}}if(x){g=n+(a<<2)|0;b=b<<2;e=O(T(O(O(o*O(L[b+p>>2]-L[b+h>>2]))+O(.5))));n:{if(O(P(e))>2]=b;a=a+1|0}c=c+1|0;if((u|0)!=(c|0)){continue}break}}oa(d);ca=j+16|0;return 1}function dd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=H[a+4>>2];e=H[a>>2];f=(c-e|0)/144|0;if(f>>>0>>0){e=a;b=b-f|0;h=H[a+8>>2];c=H[a+4>>2];a:{if(b>>>0<=(h-c|0)/144>>>0){b:{if(!b){break b}a=c;f=b&7;if(f){while(1){Ia(a);a=a+144|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}}c=N(b,144)+c|0;if((b-1&268435455)>>>0<7){break b}while(1){Ia(a);Ia(a+144|0);Ia(a+288|0);Ia(a+432|0);Ia(a+576|0);Ia(a+720|0);Ia(a+864|0);Ia(a+1008|0);a=a+1152|0;if((c|0)!=(a|0)){continue}break}}H[e+4>>2]=c;break a}c:{d:{e:{a=c;c=H[e>>2];i=(a-c|0)/144|0;a=i+b|0;if(a>>>0<29826162){c=(h-c|0)/144|0;f=c<<1;f=c>>>0>=14913080?29826161:a>>>0>>0?f:a;if(f){if(f>>>0>=29826162){break e}g=pa(N(f,144))}c=N(i,144)+g|0;a=c;h=b&7;if(h){while(1){Ia(a);a=a+144|0;d=d+1|0;if((h|0)!=(d|0)){continue}break}}h=N(b,144)+c|0;if((b-1&268435455)>>>0>=7){while(1){Ia(a);Ia(a+144|0);Ia(a+288|0);Ia(a+432|0);Ia(a+576|0);Ia(a+720|0);Ia(a+864|0);Ia(a+1008|0);a=a+1152|0;if((h|0)!=(a|0)){continue}break}}b=N(f,144)+g|0;d=H[e+4>>2];f=H[e>>2];if((d|0)==(f|0)){break d}while(1){c=c-144|0;d=d-144|0;a=d;H[c>>2]=H[a>>2];H[c+4>>2]=H[a+4>>2];H[c+8>>2]=H[a+8>>2];H[c+12>>2]=H[a+12>>2];H[a+12>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[c+16>>2]=H[a+16>>2];H[c+20>>2]=H[a+20>>2];H[c+24>>2]=H[a+24>>2];H[a+24>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;g=I[a+28|0];H[c+40>>2]=0;H[c+32>>2]=0;H[c+36>>2]=0;F[c+28|0]=g;H[c+32>>2]=H[a+32>>2];H[c+36>>2]=H[a+36>>2];H[c+40>>2]=H[a+40>>2];H[a+40>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;H[c+52>>2]=0;H[c+44>>2]=0;H[c+48>>2]=0;H[c+44>>2]=H[a+44>>2];H[c+48>>2]=H[a+48>>2];H[c+52>>2]=H[a+52>>2];H[a+52>>2]=0;H[a+44>>2]=0;H[a+48>>2]=0;g=c- -64|0;H[g>>2]=0;H[c+56>>2]=0;H[c+60>>2]=0;H[c+56>>2]=H[a+56>>2];H[c+60>>2]=H[a+60>>2];i=g;g=a- -64|0;H[i>>2]=H[g>>2];H[g>>2]=0;H[a+56>>2]=0;H[a+60>>2]=0;H[c+68>>2]=H[a+68>>2];g=H[a+72>>2];H[c+84>>2]=0;H[c+76>>2]=0;H[c+80>>2]=0;H[c+72>>2]=g;H[c+76>>2]=H[a+76>>2];H[c+80>>2]=H[a+80>>2];H[c+84>>2]=H[a+84>>2];H[a+84>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[c+96>>2]=0;H[c+88>>2]=0;H[c+92>>2]=0;H[c+88>>2]=H[a+88>>2];H[c+92>>2]=H[a+92>>2];H[c+96>>2]=H[a+96>>2];H[a+96>>2]=0;H[a+88>>2]=0;H[a+92>>2]=0;g=I[a+100|0];H[c+112>>2]=0;H[c+104>>2]=0;H[c+108>>2]=0;F[c+100|0]=g;H[c+104>>2]=H[a+104>>2];H[c+108>>2]=H[a+108>>2];H[c+112>>2]=H[a+112>>2];H[a+112>>2]=0;H[a+104>>2]=0;H[a+108>>2]=0;H[c+124>>2]=0;H[c+116>>2]=0;H[c+120>>2]=0;H[c+116>>2]=H[a+116>>2];H[c+120>>2]=H[a+120>>2];H[c+124>>2]=H[a+124>>2];H[a+124>>2]=0;H[a+116>>2]=0;H[a+120>>2]=0;g=H[a+128>>2];H[c+140>>2]=0;H[c+132>>2]=0;H[c+136>>2]=0;H[c+128>>2]=g;H[c+132>>2]=H[a+132>>2];H[c+136>>2]=H[a+136>>2];H[c+140>>2]=H[a+140>>2];H[a+140>>2]=0;H[a+132>>2]=0;H[a+136>>2]=0;if((a|0)!=(f|0)){continue}break}H[e+8>>2]=b;a=H[e+4>>2];H[e+4>>2]=h;d=H[e>>2];H[e>>2]=c;if((a|0)==(d|0)){break c}while(1){b=a-144|0;c=H[b+132>>2];if(c){H[a-8>>2]=c;oa(c)}c=H[a-28>>2];if(c){H[a-24>>2]=c;oa(c)}c=H[a-40>>2];if(c){H[a-36>>2]=c;oa(c)}oc(a-140|0);a=b;if((d|0)!=(a|0)){continue}break}break c}sa();v()}wa();v()}H[e+8>>2]=b;H[e+4>>2]=h;H[e>>2]=c}if(d){oa(d)}}return}if(b>>>0>>0){e=e+N(b,144)|0;if((e|0)!=(c|0)){while(1){b=c-144|0;d=H[b+132>>2];if(d){H[c-8>>2]=d;oa(d)}d=H[c-28>>2];if(d){H[c-24>>2]=d;oa(d)}d=H[c-40>>2];if(d){H[c-36>>2]=d;oa(d)}oc(c-140|0);c=b;if((e|0)!=(c|0)){continue}break}}H[a+4>>2]=e}}function Pe(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;f=ca-80|0;ca=f;e=H[c+36>>2];H[f+72>>2]=H[c+32>>2];H[f+76>>2]=e;g=H[c+28>>2];e=f- -64|0;H[e>>2]=H[c+24>>2];H[e+4>>2]=g;e=H[c+20>>2];H[f+56>>2]=H[c+16>>2];H[f+60>>2]=e;e=H[c+12>>2];H[f+48>>2]=H[c+8>>2];H[f+52>>2]=e;e=H[c+4>>2];H[f+40>>2]=H[c>>2];H[f+44>>2]=e;nc(a,f+40|0,f+24|0);a:{if(H[a>>2]){break a}if(F[a+15|0]<0){oa(H[a+4>>2])}if(I[f+31|0]){b=pa(32);F[b+27|0]=0;c=I[1521]|I[1522]<<8|(I[1523]<<16|I[1524]<<24);F[b+23|0]=c;F[b+24|0]=c>>>8;F[b+25|0]=c>>>16;F[b+26|0]=c>>>24;c=I[1518]|I[1519]<<8|(I[1520]<<16|I[1521]<<24);d=I[1514]|I[1515]<<8|(I[1516]<<16|I[1517]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1510]|I[1511]<<8|(I[1512]<<16|I[1513]<<24);d=I[1506]|I[1507]<<8|(I[1508]<<16|I[1509]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1502]|I[1503]<<8|(I[1504]<<16|I[1505]<<24);d=I[1498]|I[1499]<<8|(I[1500]<<16|I[1501]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,b,27);oa(b);break a}i=ca-16|0;ca=i;b:{c:{switch(F[f+32|0]){case 0:e=pa(44);H[e>>2]=0;H[e+4>>2]=0;H[e+40>>2]=0;H[e+32>>2]=0;H[e+36>>2]=0;H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;e=Vc(e);H[e>>2]=13496;H[f+8>>2]=0;H[f+12>>2]=0;H[f>>2]=0;H[f+4>>2]=0;H[f+16>>2]=e;break b;case 1:e=pa(44);H[e>>2]=0;H[e+4>>2]=0;H[e+40>>2]=0;H[e+32>>2]=0;H[e+36>>2]=0;H[e+24>>2]=0;H[e+28>>2]=0;H[e+16>>2]=0;H[e+20>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;e=Vc(e);H[e>>2]=13404;H[f+8>>2]=0;H[f+12>>2]=0;H[f>>2]=0;H[f+4>>2]=0;H[f+16>>2]=e;break b;default:break c}}g=pa(32);F[g+28|0]=0;e=I[1550]|I[1551]<<8|(I[1552]<<16|I[1553]<<24);F[g+24|0]=e;F[g+25|0]=e>>>8;F[g+26|0]=e>>>16;F[g+27|0]=e>>>24;e=I[1546]|I[1547]<<8|(I[1548]<<16|I[1549]<<24);h=I[1542]|I[1543]<<8|(I[1544]<<16|I[1545]<<24);F[g+16|0]=h;F[g+17|0]=h>>>8;F[g+18|0]=h>>>16;F[g+19|0]=h>>>24;F[g+20|0]=e;F[g+21|0]=e>>>8;F[g+22|0]=e>>>16;F[g+23|0]=e>>>24;e=I[1538]|I[1539]<<8|(I[1540]<<16|I[1541]<<24);h=I[1534]|I[1535]<<8|(I[1536]<<16|I[1537]<<24);F[g+8|0]=h;F[g+9|0]=h>>>8;F[g+10|0]=h>>>16;F[g+11|0]=h>>>24;F[g+12|0]=e;F[g+13|0]=e>>>8;F[g+14|0]=e>>>16;F[g+15|0]=e>>>24;e=I[1530]|I[1531]<<8|(I[1532]<<16|I[1533]<<24);h=I[1526]|I[1527]<<8|(I[1528]<<16|I[1529]<<24);F[g|0]=h;F[g+1|0]=h>>>8;F[g+2|0]=h>>>16;F[g+3|0]=h>>>24;F[g+4|0]=e;F[g+5|0]=e>>>8;F[g+6|0]=e>>>16;F[g+7|0]=e>>>24;H[i>>2]=-1;e=i|4;za(e,g,28);j=F[i+15|0];H[f>>2]=H[i>>2];h=f+4|0;d:{if((j|0)>=0){j=H[e+4>>2];H[h>>2]=H[e>>2];H[h+4>>2]=j;H[h+8>>2]=H[e+8>>2];H[f+16>>2]=0;break d}za(h,H[i+4>>2],H[i+8>>2]);e=F[i+15|0];H[f+16>>2]=0;if((e|0)>=0){break d}oa(H[i+4>>2])}oa(g)}ca=i+16|0;e=H[f>>2];e:{if(e){H[a>>2]=e;a=a+4|0;if(F[f+15|0]>=0){b=f|4;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];break e}za(a,H[f+4>>2],H[f+8>>2]);break e}e=H[f+16>>2];H[f+16>>2]=0;te(a,e,b,c,d);if(!H[a>>2]){if(F[a+15|0]<0){oa(H[a+4>>2])}H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0}ea[H[H[e>>2]+4>>2]](e)}a=H[f+16>>2];H[f+16>>2]=0;if(a){ea[H[H[a>>2]+4>>2]](a)}if(F[f+15|0]>=0){break a}oa(H[f+4>>2])}ca=f+80|0}function Ic(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;H[a+56>>2]=H[a+52>>2];H[a+44>>2]=H[a+40>>2];b=H[a+64>>2];c=H[b+24>>2];if((c|0)==H[b+28>>2]){return 1}a:{b:{c:{while(1){g=i;i=H[(k<<2)+c>>2];d:{if((i|0)==-1){i=g;break d}b=H[a+56>>2];e:{if((b|0)!=H[a+60>>2]){H[b>>2]=g;H[a+56>>2]=b+4;break e}d=H[a+52>>2];e=b-d|0;h=e>>2;c=h+1|0;if(c>>>0>=1073741824){break c}f=e>>>1|0;f=e>>>0>=2147483644?1073741823:c>>>0>>0?f:c;if(f){if(f>>>0>=1073741824){break b}e=pa(f<<2)}else{e=0}c=e+(h<<2)|0;H[c>>2]=g;h=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[a+60>>2]=e+(f<<2);H[a+56>>2]=h;H[a+52>>2]=c;if(!d){break e}oa(d)}f:{g:{if(!(H[H[a+12>>2]+(k>>>3&536870908)>>2]>>>k&1)){break g}e=i+1|0;e=(e>>>0)%3|0?e:i-2|0;if((e|0)==-1|H[H[a>>2]+(e>>>3&536870908)>>2]>>>e&1){break g}e=H[H[H[a+64>>2]+12>>2]+(e<<2)>>2];if((e|0)==-1){break g}b=e+1|0;b=(b>>>0)%3|0?b:e-2|0;if((b|0)==-1){break g}c=H[a+64>>2];f=H[a>>2];while(1){e=b;b=-1;d=e+1|0;d=(d>>>0)%3|0?d:e-2|0;h:{if((d|0)==-1|H[f+(d>>>3&536870908)>>2]>>>d&1){break h}d=H[H[c+12>>2]+(d<<2)>>2];if((d|0)==-1){break h}b=d+1|0;b=(b>>>0)%3|0?b:d-2|0}if((b|0)!=(i|0)){if((b|0)==-1){break f}continue}break}return 0}e=i}H[H[a+28>>2]+(e<<2)>>2]=g;b=H[a+44>>2];i:{if((b|0)!=H[a+48>>2]){H[b>>2]=e;H[a+44>>2]=b+4;break i}d=H[a+40>>2];i=b-d|0;h=i>>2;c=h+1|0;if(c>>>0>=1073741824){break a}f=i>>>1|0;f=i>>>0>=2147483644?1073741823:c>>>0>>0?f:c;if(f){if(f>>>0>=1073741824){break b}i=pa(f<<2)}else{i=0}c=i+(h<<2)|0;H[c>>2]=e;h=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[a+48>>2]=i+(f<<2);H[a+44>>2]=h;H[a+40>>2]=c;if(!d){break i}oa(d)}i=g+1|0;b=H[a+64>>2];if((e|0)==-1){break d}j:{if((e>>>0)%3|0){c=e-1|0;break j}c=e+2|0;if((c|0)==-1){break d}}d=H[H[b+12>>2]+(c<<2)>>2];if((d|0)==-1){break d}f=d+((d>>>0)%3|0?-1:2)|0;if((f|0)==-1|(e|0)==(f|0)){break d}while(1){b=f+1|0;b=(b>>>0)%3|0?b:f-2|0;if(H[H[a>>2]+(b>>>3&536870908)>>2]>>>b&1){b=H[a+56>>2];k:{if((b|0)!=H[a+60>>2]){H[b>>2]=i;H[a+56>>2]=b+4;break k}d=H[a+52>>2];g=b-d|0;j=g>>2;c=j+1|0;if(c>>>0>=1073741824){break c}h=g>>>1|0;h=g>>>0>=2147483644?1073741823:c>>>0>>0?h:c;if(h){if(h>>>0>=1073741824){break b}g=pa(h<<2)}else{g=0}c=g+(j<<2)|0;H[c>>2]=i;j=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[a+60>>2]=g+(h<<2);H[a+56>>2]=j;H[a+52>>2]=c;if(!d){break k}oa(d)}d=i+1|0;b=H[a+44>>2];l:{if((b|0)!=H[a+48>>2]){H[b>>2]=f;H[a+44>>2]=b+4;break l}h=H[a+40>>2];g=b-h|0;l=g>>2;c=l+1|0;if(c>>>0>=1073741824){break a}j=g>>>1|0;j=g>>>0>=2147483644?1073741823:c>>>0>>0?j:c;if(j){if(j>>>0>=1073741824){break b}g=pa(j<<2)}else{g=0}c=g+(l<<2)|0;H[c>>2]=f;l=c+4|0;if((b|0)!=(h|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(h|0)){continue}break}}H[a+48>>2]=g+(j<<2);H[a+44>>2]=l;H[a+40>>2]=c;if(!h){break l}oa(h)}g=i;i=d}H[H[a+28>>2]+(f<<2)>>2]=g;b=H[a+64>>2];m:{if((f>>>0)%3|0){c=f-1|0;break m}c=f+2|0;if((c|0)==-1){break d}}d=H[H[b+12>>2]+(c<<2)>>2];if((d|0)==-1){break d}f=d+((d>>>0)%3|0?-1:2)|0;if((f|0)==-1){break d}if((e|0)!=(f|0)){continue}break}}k=k+1|0;c=H[b+24>>2];if(k>>>0>2]-c>>2>>>0){continue}break}return 1}sa();v()}wa();v()}sa();v()}function ti(a){a=a|0;var b=0,c=0,d=0,e=0;c=H[a+32>>2];d=H[c+16>>2];e=H[c+12>>2];b=H[c+20>>2];if(K[c+8>>2]>d>>>0&(e|0)>=(b|0)|(b|0)<(e|0)){e=I[H[c>>2]+d|0];d=d+1|0;b=d?b:b+1|0;H[c+16>>2]=d;H[c+20>>2]=b;b=H[a+48>>2];H[a+48>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}a:{b:{c:{d:{switch(e|0){case 0:b=pa(384);H[b>>2]=11384;ra(b+4|0,0,80);H[b+96>>2]=0;H[b+100>>2]=0;H[b+92>>2]=-1;H[b+84>>2]=-1;H[b+88>>2]=-1;H[b+104>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+116>>2]=0;H[b+120>>2]=0;H[b+124>>2]=0;H[b+128>>2]=0;H[b+132>>2]=0;H[b+136>>2]=0;H[b+140>>2]=0;H[b+144>>2]=0;H[b+148>>2]=0;H[b+156>>2]=0;H[b+160>>2]=0;H[b+152>>2]=1065353216;H[b+164>>2]=0;H[b+168>>2]=0;H[b+172>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+184>>2]=0;H[b+188>>2]=0;H[b+192>>2]=0;H[b+196>>2]=0;H[b+200>>2]=0;H[b+204>>2]=0;H[b+208>>2]=0;H[b+212>>2]=-1;H[b+216>>2]=0;H[b+220>>2]=0;H[b+224>>2]=0;Ha(b+232|0);Ha(b+272|0);c=b+312|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;Ha(b+328|0);H[b+376>>2]=0;H[b+368>>2]=0;H[b+372>>2]=0;break c;case 1:b=pa(424);H[b>>2]=11436;ra(b+4|0,0,80);H[b+96>>2]=0;H[b+100>>2]=0;H[b+92>>2]=-1;H[b+84>>2]=-1;H[b+88>>2]=-1;H[b+104>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+116>>2]=0;H[b+120>>2]=0;H[b+124>>2]=0;H[b+128>>2]=0;H[b+132>>2]=0;H[b+136>>2]=0;H[b+140>>2]=0;H[b+144>>2]=0;H[b+148>>2]=0;H[b+156>>2]=0;H[b+160>>2]=0;H[b+152>>2]=1065353216;H[b+164>>2]=0;H[b+168>>2]=0;H[b+172>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+184>>2]=0;H[b+188>>2]=0;H[b+192>>2]=0;H[b+196>>2]=0;H[b+200>>2]=0;H[b+204>>2]=0;H[b+208>>2]=0;H[b+212>>2]=-1;H[b+216>>2]=0;H[b+220>>2]=0;H[b+224>>2]=0;Ha(b+232|0);Ha(b+272|0);c=b+312|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;Ha(b+328|0);H[b+392>>2]=0;H[b+396>>2]=0;H[b+384>>2]=0;H[b+388>>2]=0;H[b+376>>2]=0;H[b+380>>2]=0;H[b+368>>2]=0;H[b+372>>2]=0;c=b+400|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;H[b+416>>2]=-1;H[b+420>>2]=-1;break c;case 2:break d;default:break b}}b=pa(440);H[b>>2]=11484;ra(b+4|0,0,80);H[b+96>>2]=0;H[b+100>>2]=0;H[b+92>>2]=-1;H[b+84>>2]=-1;H[b+88>>2]=-1;H[b+104>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+116>>2]=0;H[b+120>>2]=0;H[b+124>>2]=0;H[b+128>>2]=0;H[b+132>>2]=0;H[b+136>>2]=0;H[b+140>>2]=0;H[b+144>>2]=0;H[b+148>>2]=0;H[b+156>>2]=0;H[b+160>>2]=0;H[b+152>>2]=1065353216;H[b+164>>2]=0;H[b+168>>2]=0;H[b+172>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+184>>2]=0;H[b+188>>2]=0;H[b+192>>2]=0;H[b+196>>2]=0;H[b+200>>2]=0;H[b+204>>2]=0;H[b+208>>2]=0;H[b+212>>2]=-1;H[b+216>>2]=0;H[b+220>>2]=0;H[b+224>>2]=0;Ha(b+232|0);Ha(b+272|0);c=b+312|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;Ha(b+328|0);H[b+392>>2]=0;H[b+396>>2]=0;H[b+384>>2]=0;H[b+388>>2]=0;H[b+376>>2]=0;H[b+380>>2]=0;H[b+368>>2]=0;H[b+372>>2]=0;H[b+416>>2]=0;H[b+420>>2]=0;H[b+408>>2]=2;H[b+412>>2]=7;H[b+400>>2]=-1;H[b+404>>2]=-1;H[b+424>>2]=0;H[b+428>>2]=0;H[b+432>>2]=0;H[b+436>>2]=0}c=H[a+48>>2];H[a+48>>2]=b;if(!c){break a}ea[H[H[c>>2]+4>>2]](c)}b=H[a+48>>2];if(b){break a}return 0}a=ea[H[H[b>>2]+8>>2]](b,a)|0}else{a=0}return a|0}function Lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;f=ca-96|0;ca=f;e=H[a+16>>2];F[f+92|0]=1;H[f+88>>2]=b;H[f+84>>2]=b;H[f+80>>2]=e;a:{if((b|0)==-1){break a}j=H[a+20>>2];d=H[j>>2];e=H[H[e>>2]+(b<<2)>>2];if(e>>>0>=H[j+4>>2]-d>>2>>>0){break a}e=H[H[a+8>>2]+(H[d+(e<<2)>>2]<<2)>>2];d=H[a+4>>2];if(!I[d+84|0]){e=H[H[d+68>>2]+(e<<2)>>2]}H[f+72>>2]=0;H[f+76>>2]=0;j=f- -64|0;H[j>>2]=0;H[j+4>>2]=0;H[f+56>>2]=0;H[f+60>>2]=0;Sa(d,e,F[d+24|0],f+56|0);e=b+1|0;j=(e>>>0)%3|0?e:b-2|0;n=((b>>>0)%3|0?-1:2)+b|0;b:{c:{while(1){d=j;e=n;d:{if(!H[a+28>>2]){break d}e=b+1|0;d=(e>>>0)%3|0?e:b-2|0;e=b-1|0;if((b>>>0)%3|0){break d}e=b+2|0}if((d|0)==-1){break b}m=H[a+20>>2];b=H[m>>2];d=H[H[H[a+16>>2]>>2]+(d<<2)>>2];if(d>>>0>=H[m+4>>2]-b>>2>>>0){break b}d=H[H[a+8>>2]+(H[(d<<2)+b>>2]<<2)>>2];b=H[a+4>>2];if(!I[b+84|0]){d=H[H[b+68>>2]+(d<<2)>>2]}H[f+48>>2]=0;H[f+52>>2]=0;H[f+40>>2]=0;H[f+44>>2]=0;H[f+32>>2]=0;H[f+36>>2]=0;Sa(b,d,F[b+24|0],f+32|0);if((e|0)==-1){break c}d=H[a+20>>2];b=H[d>>2];e=H[H[H[a+16>>2]>>2]+(e<<2)>>2];if(e>>>0>=H[d+4>>2]-b>>2>>>0){break c}d=H[H[a+8>>2]+(H[b+(e<<2)>>2]<<2)>>2];b=H[a+4>>2];if(!I[b+84|0]){d=H[H[b+68>>2]+(d<<2)>>2]}H[f+24>>2]=0;H[f+28>>2]=0;H[f+16>>2]=0;H[f+20>>2]=0;H[f+8>>2]=0;H[f+12>>2]=0;Sa(b,d,F[b+24|0],f+8|0);g=H[f+8>>2];b=H[f+56>>2];d=g-b|0;p=H[f+60>>2];t=H[f+12>>2]-(p+(b>>>0>g>>>0)|0)|0;i=H[f+40>>2];e=H[f+64>>2];m=i-e|0;u=H[f+68>>2];y=H[f+44>>2]-(u+(e>>>0>i>>>0)|0)|0;g=Rj(d,t,m,y);w=o-g|0;x=h-(da+(g>>>0>o>>>0)|0)|0;h=w;i=H[f+16>>2];g=i-e|0;u=H[f+20>>2]-((e>>>0>i>>>0)+u|0)|0;k=H[f+32>>2];i=k-b|0;w=H[f+36>>2]-((b>>>0>k>>>0)+p|0)|0;b=Rj(g,u,i,w);o=h+b|0;h=da+x|0;h=b>>>0>o>>>0?h+1|0:h;b=l;l=d;p=t;k=H[f+48>>2];e=H[f+72>>2];d=k-e|0;t=H[f+76>>2];x=H[f+52>>2]-(t+(e>>>0>k>>>0)|0)|0;l=Rj(l,p,d,x);k=b+l|0;b=da+q|0;b=k>>>0>>0?b+1|0:b;l=H[f+24>>2];p=l-e|0;e=H[f+28>>2]-((e>>>0>l>>>0)+t|0)|0;q=Rj(p,e,i,w);l=k-q|0;q=b-(da+(k>>>0>>0)|0)|0;b=Rj(g,u,d,x);d=r-b|0;b=s-(da+(b>>>0>r>>>0)|0)|0;s=Rj(p,e,m,y);r=s+d|0;b=da+b|0;s=r>>>0>>0?b+1|0:b;uc(f+80|0);b=H[f+88>>2];if((b|0)!=-1){continue}break}b=s>>31;e=b^r;d=e-b|0;b=(b^s)-((b>>>0>e>>>0)+b|0)|0;n=-1;e=2147483647;m=q>>31;g=m;i=g^l;j=i-g|0;m=(g^q)-((i>>>0>>0)+g|0)|0;i=m;k=j^-1;g=i^2147483647;m=h;e:{f:{if(!H[a+28>>2]){if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break e}b=b+i|0;a=d+j|0;b=a>>>0>>0?b+1|0:b;e=a;g=h;a=g>>31;d=a;n=d^o;a=n-d|0;h=a;d=(d^g)-((d>>>0>n>>>0)+d|0)|0;a=a+e|0;d=d^2147483647;h=(d|0)==(b|0)&(h^-1)>>>0>>0|b>>>0>d>>>0;a=h?-1:a;if(!(h&0)&(a|0)<=536870912|(a|0)<536870912){break e}b=0;a=a>>>29|0;break f}g:{if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break g}b=b+i|0;a=d+j|0;b=a>>>0>>0?b+1|0:b;k=h;h=h>>31;g=h;i=g^o;h=i-g|0;j=(g^k)-((g>>>0>i>>>0)+g|0)|0;g=j^2147483647;d=a;a=h;if((g|0)==(b|0)&d>>>0>(a^-1)>>>0|b>>>0>g>>>0){break g}b=b+j|0;n=a+d|0;b=n>>>0>>0?b+1|0:b;e=b;if(!b&n>>>0<536870913){break e}}b=e>>>29|0;a=(e&536870911)<<3|n>>>29}o=Sj(o,m,a,b);l=Sj(l,q,a,b);r=Sj(r,s,a,b)}H[c+8>>2]=o;H[c+4>>2]=l;H[c>>2]=r;ca=f+96|0;return}Ca();v()}Ca();v()}Ca();v()}function Wd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if((b|0)<0){break a}c=H[a+12>>2];d=H[a+8>>2];if(c-d>>2>>>0<=b>>>0){break a}d=d+(b<<2)|0;e=H[d>>2];i=H[e+60>>2];f=H[e+56>>2];e=d+4|0;if((e|0)!=(c|0)){while(1){h=H[e>>2];H[e>>2]=0;g=H[d>>2];H[d>>2]=h;if(g){Ga(g)}d=d+4|0;e=e+4|0;if((e|0)!=(c|0)){continue}break}c=H[a+12>>2]}if((c|0)!=(d|0)){while(1){c=c-4|0;e=H[c>>2];H[c>>2]=0;if(e){Ga(e)}if((c|0)!=(d|0)){continue}break}}H[a+12>>2]=d;g=H[a+4>>2];b:{if(!g|(i|0)<0){break b}c=H[g+24>>2];d=H[g+28>>2];if((c|0)==(d|0)){break b}while(1){if((i|0)==H[H[c>>2]+24>>2]){d=c+4|0;i=H[g+28>>2];if((d|0)!=(i|0)){while(1){h=H[d>>2];H[d>>2]=0;e=H[c>>2];H[c>>2]=h;if(e){Ra(e+12|0,H[e+16>>2]);Qa(e,H[e+4>>2]);oa(e)}c=c+4|0;d=d+4|0;if((i|0)!=(d|0)){continue}break}d=H[g+28>>2]}if((c|0)!=(d|0)){while(1){d=d-4|0;e=H[d>>2];H[d>>2]=0;if(e){Ra(e+12|0,H[e+16>>2]);Qa(e,H[e+4>>2]);oa(e)}if((c|0)!=(d|0)){continue}break}}H[g+28>>2]=c;break b}c=c+4|0;if((d|0)!=(c|0)){continue}break}}c:{if((f|0)>4){break c}d:{e=N(f,12)+a|0;c=H[e+20>>2];d=H[e+24>>2];if((c|0)==(d|0)){break d}while(1){if(H[c>>2]==(b|0)){break d}c=c+4|0;if((d|0)!=(c|0)){continue}break}break c}if((c|0)==(d|0)){break c}f=c;c=c+4|0;va(f,c,d-c|0);H[e+24>>2]=d-4}c=H[a+24>>2];d=H[a+20>>2];e:{if((c|0)==(d|0)){break e}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=H[h>>2];if((j|0)>(b|0)){H[h>>2]=j-1}f=d+(f|4)|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break e}c=d+(c<<2)|0;d=H[c>>2];if((d|0)<=(b|0)){break e}H[c>>2]=d-1}c=H[a+36>>2];d=H[a+32>>2];f:{if((c|0)==(d|0)){break f}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=H[h>>2];if((j|0)>(b|0)){H[h>>2]=j-1}f=d+(f|4)|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break f}c=d+(c<<2)|0;d=H[c>>2];if((d|0)<=(b|0)){break f}H[c>>2]=d-1}c=H[a+48>>2];d=H[a+44>>2];g:{if((c|0)==(d|0)){break g}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=H[h>>2];if((j|0)>(b|0)){H[h>>2]=j-1}f=d+(f|4)|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break g}c=d+(c<<2)|0;d=H[c>>2];if((d|0)<=(b|0)){break g}H[c>>2]=d-1}c=H[a+60>>2];d=H[a+56>>2];h:{if((c|0)==(d|0)){break h}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=H[h>>2];if((j|0)>(b|0)){H[h>>2]=j-1}f=d+(f|4)|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break h}c=d+(c<<2)|0;d=H[c>>2];if((d|0)<=(b|0)){break h}H[c>>2]=d-1}c=H[a+72>>2];a=H[a+68>>2];if((c|0)==(a|0)){break a}d=c-a|0;c=d>>2;e=c>>>0<=1?1:c;g=e&1;c=0;if(d>>>0>=8){d=e&-2;e=0;while(1){i=c<<2;f=i+a|0;h=H[f>>2];if((h|0)>(b|0)){H[f>>2]=h-1}i=a+(i|4)|0;f=H[i>>2];if((f|0)>(b|0)){H[i>>2]=f-1}c=c+2|0;e=e+2|0;if((d|0)!=(e|0)){continue}break}}if(!g){break a}f=b;a=a+(c<<2)|0;b=H[a>>2];if((f|0)>=(b|0)){break a}H[a>>2]=b-1}}function oa(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if(!a){break a}d=a-8|0;b=H[a-4>>2];a=b&-8;f=d+a|0;b:{if(b&1){break b}if(!(b&3)){break a}b=H[d>>2];d=d-b|0;if(d>>>0>>0<=255){e=H[d+8>>2];b=b>>>3|0;c=H[d+12>>2];if((c|0)==(e|0)){i=17192,j=H[4298]&Vj(b),H[i>>2]=j;break b}H[e+12>>2]=c;H[c+8>>2]=e;break b}h=H[d+24>>2];b=H[d+12>>2];c:{if((d|0)!=(b|0)){c=H[d+8>>2];H[c+12>>2]=b;H[b+8>>2]=c;break c}d:{e=d+20|0;c=H[e>>2];if(c){break d}e=d+16|0;c=H[e>>2];if(c){break d}b=0;break c}while(1){g=e;b=c;e=b+20|0;c=H[e>>2];if(c){continue}e=b+16|0;c=H[b+16>>2];if(c){continue}break}H[g>>2]=0}if(!h){break b}e=H[d+28>>2];c=(e<<2)+17496|0;e:{if(H[c>>2]==(d|0)){H[c>>2]=b;if(b){break e}i=17196,j=H[4299]&Vj(e),H[i>>2]=j;break b}H[h+(H[h+16>>2]==(d|0)?16:20)>>2]=b;if(!b){break b}}H[b+24>>2]=h;c=H[d+16>>2];if(c){H[b+16>>2]=c;H[c+24>>2]=b}c=H[d+20>>2];if(!c){break b}H[b+20>>2]=c;H[c+24>>2]=b;break b}b=H[f+4>>2];if((b&3)!=3){break b}H[4300]=a;H[f+4>>2]=b&-2;H[d+4>>2]=a|1;H[a+d>>2]=a;return}if(d>>>0>=f>>>0){break a}b=H[f+4>>2];if(!(b&1)){break a}f:{if(!(b&2)){if(H[4304]==(f|0)){H[4304]=d;a=H[4301]+a|0;H[4301]=a;H[d+4>>2]=a|1;if(H[4303]!=(d|0)){break a}H[4300]=0;H[4303]=0;return}if(H[4303]==(f|0)){H[4303]=d;a=H[4300]+a|0;H[4300]=a;H[d+4>>2]=a|1;H[a+d>>2]=a;return}a=(b&-8)+a|0;g:{if(b>>>0<=255){e=H[f+8>>2];b=b>>>3|0;c=H[f+12>>2];if((c|0)==(e|0)){i=17192,j=H[4298]&Vj(b),H[i>>2]=j;break g}H[e+12>>2]=c;H[c+8>>2]=e;break g}h=H[f+24>>2];b=H[f+12>>2];h:{if((f|0)!=(b|0)){c=H[f+8>>2];H[c+12>>2]=b;H[b+8>>2]=c;break h}i:{e=f+20|0;c=H[e>>2];if(c){break i}e=f+16|0;c=H[e>>2];if(c){break i}b=0;break h}while(1){g=e;b=c;e=b+20|0;c=H[e>>2];if(c){continue}e=b+16|0;c=H[b+16>>2];if(c){continue}break}H[g>>2]=0}if(!h){break g}e=H[f+28>>2];c=(e<<2)+17496|0;j:{if(H[c>>2]==(f|0)){H[c>>2]=b;if(b){break j}i=17196,j=H[4299]&Vj(e),H[i>>2]=j;break g}H[h+(H[h+16>>2]==(f|0)?16:20)>>2]=b;if(!b){break g}}H[b+24>>2]=h;c=H[f+16>>2];if(c){H[b+16>>2]=c;H[c+24>>2]=b}c=H[f+20>>2];if(!c){break g}H[b+20>>2]=c;H[c+24>>2]=b}H[d+4>>2]=a|1;H[a+d>>2]=a;if(H[4303]!=(d|0)){break f}H[4300]=a;return}H[f+4>>2]=b&-2;H[d+4>>2]=a|1;H[a+d>>2]=a}if(a>>>0<=255){b=(a&-8)+17232|0;c=H[4298];a=1<<(a>>>3);k:{if(!(c&a)){H[4298]=a|c;a=b;break k}a=H[b+8>>2]}H[b+8>>2]=d;H[a+12>>2]=d;H[d+12>>2]=b;H[d+8>>2]=a;return}e=31;if(a>>>0<=16777215){b=Q(a>>>8|0);e=((a>>>38-b&1)-(b<<1)|0)+62|0}H[d+28>>2]=e;H[d+16>>2]=0;H[d+20>>2]=0;g=(e<<2)+17496|0;l:{m:{c=H[4299];b=1<>2]=d;H[d+24>>2]=g;break n}e=a<<((e|0)!=31?25-(e>>>1|0)|0:0);b=H[g>>2];while(1){c=b;if((H[b+4>>2]&-8)==(a|0)){break m}b=e>>>29|0;e=e<<1;g=c+(b&4)|0;b=H[g+16>>2];if(b){continue}break}H[g+16>>2]=d;H[d+24>>2]=c}H[d+12>>2]=d;H[d+8>>2]=d;break l}a=H[c+8>>2];H[a+12>>2]=d;H[c+8>>2]=d;H[d+24>>2]=0;H[d+12>>2]=c;H[d+8>>2]=a}a=H[4306]-1|0;H[4306]=a?a:-1}}function tj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;H[a+8>>2]=e;n=a+32|0;h=H[n>>2];f=H[a+36>>2]-h>>2;a:{if(f>>>0>>0){ya(n,e-f|0);d=H[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}H[a+36>>2]=h+(e<<2);d=e}s=H[a+52>>2];p=H[a+48>>2];f=0;h=e>>>0>1073741823?-1:e<<2;m=ra(pa(h),0,h);b:{if((d|0)<=0){break b}g=H[a+32>>2];while(1){d=f<<2;h=H[d+m>>2];j=H[a+16>>2];c:{if((h|0)>(j|0)){H[d+g>>2]=j;break c}d=d+g|0;j=H[a+12>>2];if((j|0)>(h|0)){H[d>>2]=j;break c}H[d>>2]=h}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){h=f<<2;d=h+c|0;h=H[b+h>>2]+H[g+h>>2]|0;H[d>>2]=h;d:{if((h|0)>H[a+16>>2]){i=h-H[a+20>>2]|0}else{if((h|0)>=H[a+12>>2]){break d}i=h+H[a+20>>2]|0}H[d>>2]=i}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=H[a+56>>2];q=H[f>>2];f=H[f+4>>2]-q|0;if((f|0)>=5){o=f>>>2|0;t=o>>>0<=2?2:o;u=e&-2;w=e&1;h=1;while(1){e:{f:{if((h|0)!=(o|0)){r=N(e,h);f=H[(h<<2)+q>>2];if((f|0)==-1){break f}f=H[H[p+12>>2]+(f<<2)>>2];if((f|0)==-1){break f}j=H[s>>2];g=H[p>>2];k=H[j+(H[g+(f<<2)>>2]<<2)>>2];i=f+1|0;i=(i>>>0)%3|0?i:f-2|0;if((i|0)!=-1){i=H[g+(i<<2)>>2]}else{i=-1}g:{h:{if((f>>>0)%3|0){f=f-1|0;break h}f=f+2|0;l=-1;if((f|0)==-1){break g}}l=H[g+(f<<2)>>2]}if((h|0)<=(k|0)){break f}f=H[(i<<2)+j>>2];if((f|0)>=(h|0)){break f}g=H[j+(l<<2)>>2];if((g|0)>=(h|0)){break f}i:{if((e|0)<=0){break i}g=N(e,g);j=N(e,f);k=N(e,k);f=0;l=0;if((e|0)!=1){while(1){H[(f<<2)+m>>2]=(H[(f+g<<2)+c>>2]+H[(f+j<<2)+c>>2]|0)-H[(f+k<<2)+c>>2];i=f|1;H[(i<<2)+m>>2]=(H[(g+i<<2)+c>>2]+H[(j+i<<2)+c>>2]|0)-H[(i+k<<2)+c>>2];f=f+2|0;l=l+2|0;if((u|0)!=(l|0)){continue}break}}if(!w){break i}H[(f<<2)+m>>2]=(H[(f+g<<2)+c>>2]+H[(f+j<<2)+c>>2]|0)-H[(f+k<<2)+c>>2]}if((d|0)<=0){break e}j=H[n>>2];f=0;while(1){d=f<<2;g=H[d+m>>2];k=H[a+16>>2];j:{if((g|0)>(k|0)){H[d+j>>2]=k;break j}d=d+j|0;k=H[a+12>>2];if((k|0)>(g|0)){H[d>>2]=k;break j}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;i=b+d|0;while(1){g=f<<2;d=g+k|0;g=H[g+i>>2]+H[g+j>>2]|0;H[d>>2]=g;k:{if((g|0)>H[a+16>>2]){l=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break k}l=g+H[a+20>>2]|0}H[d>>2]=l}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}Ca();v()}if((d|0)<=0){break e}k=(N(h-1|0,e)<<2)+c|0;j=H[n>>2];f=0;while(1){d=f<<2;g=H[d+k>>2];i=H[a+16>>2];l:{if((g|0)>(i|0)){H[d+j>>2]=i;break l}d=d+j|0;i=H[a+12>>2];if((i|0)>(g|0)){H[d>>2]=i;break l}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;i=b+d|0;while(1){g=f<<2;d=g+k|0;g=H[g+i>>2]+H[g+j>>2]|0;H[d>>2]=g;m:{if((g|0)>H[a+16>>2]){l=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break m}l=g+H[a+20>>2]|0}H[d>>2]=l}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}h=h+1|0;if((t|0)!=(h|0)){continue}break}}oa(m);return 1}function we(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((b|0)==-1){return 1}g=(b>>>0)/3|0;if(!(H[H[a+24>>2]+(g>>>3&268435452)>>2]>>>g&1)){e=H[a+48>>2];H[a+52>>2]=e;a:{if((e|0)!=H[a+56>>2]){H[e>>2]=b;H[a+52>>2]=e+4;break a}d=pa(4);H[d>>2]=b;c=d+4|0;H[a+56>>2]=c;H[a+52>>2]=c;H[a+48>>2]=d;if(!e){break a}oa(e)}c=b+1|0;i=(c>>>0)%3|0?c:b-2|0;c=H[H[a+4>>2]+28>>2];k=H[(i<<2)+c>>2];if((k|0)==-1){return 0}e=(b-N(g,3)|0?-1:2)+b|0;j=H[c+(e<<2)>>2];if((j|0)==-1){return 0}b=H[a+36>>2];g=b+(k>>>3&536870908)|0;d=H[g>>2];c=1<>2]=c|d;Ua(a+8|0,k,i);b=H[a+36>>2]}d=(j>>>3&536870908)+b|0;c=H[d>>2];b=1<>2]=b|c;Ua(a+8|0,j,e)}f=H[a+52>>2];if((f|0)==H[a+48>>2]){return 1}k=a+8|0;while(1){b:{c:{f=f-4|0;b=H[f>>2];if((b|0)==-1){break c}c=(b>>>0)/3|0;g=H[a+24>>2]+(c>>>3&268435452)|0;d=H[g>>2];c=1<>2]=c|d;h=H[a+4>>2];c=H[H[h+28>>2]+(b<<2)>>2];if((c|0)==-1){return 0}while(1){d=b;d:{e:{j=H[a+36>>2]+(c>>>3&536870908)|0;i=H[j>>2];e=1<>2]+(c<<2)>>2];g:{if((g|0)==-1){break g}b=g+1|0;b=(b>>>0)%3|0?b:g-2|0;if((b|0)==-1|H[H[h>>2]+(b>>>3&536870908)>>2]>>>b&1){break g}g=H[H[H[h+64>>2]+12>>2]+(b<<2)>>2];if((g|0)!=-1){break f}}H[j>>2]=e|i;Ua(k,c,d);h=H[a+4>>2];break e}H[j>>2]=e|i;Ua(k,c,d);h=H[a+4>>2];b=g+1|0;if((((b>>>0)%3|0?b:g-2|0)|0)==-1){break e}b=-1;h:{if((d|0)==-1){break h}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1|H[H[h>>2]+(c>>>3&536870908)>>2]>>>c&1){break h}b=H[H[H[h+64>>2]+12>>2]+(c<<2)>>2]}c=(b>>>0)/3|0;d=1<>2];e=c>>>5|0;j=H[f+(e<<2)>>2];break d}i:{j:{if((d|0)==-1){break j}c=-1;b=d+1|0;b=(b>>>0)%3|0?b:d-2|0;if(!((b|0)==-1|H[H[h>>2]+(b>>>3&536870908)>>2]>>>b&1)){c=H[H[H[h+64>>2]+12>>2]+(b<<2)>>2]}k:{l:{if((d>>>0)%3|0){f=d-1|0;break l}f=d+2|0;b=-1;if((f|0)==-1){break k}}b=-1;if(H[H[h>>2]+(f>>>3&536870908)>>2]>>>f&1){break k}b=H[H[H[h+64>>2]+12>>2]+(f<<2)>>2]}g=(b|0)==-1;i=g?-1:(b>>>0)/3|0;if((c|0)!=-1){f=H[a+24>>2];d=(c>>>0)/3|0;e=d>>>5|0;j=H[f+(e<<2)>>2];d=1<>2];e=i>>>5|0;j=H[f+(e<<2)>>2];if(!(d&j)){break d}}f=H[a+52>>2]-4|0;H[a+52>>2]=f;break b}if(g){b=c;break d}if(H[(i>>>3&536870908)+f>>2]>>>i&1){b=c;break d}h=H[a+52>>2];H[h-4>>2]=b;if(H[a+56>>2]!=(h|0)){H[h>>2]=c;f=h+4|0;break c}m:{i=H[a+48>>2];e=h-i|0;g=e>>2;d=g+1|0;if(d>>>0<1073741824){b=e>>>1|0;e=e>>>0>=2147483644?1073741823:b>>>0>d>>>0?b:d;if(e){if(e>>>0>=1073741824){break m}d=pa(e<<2)}else{d=0}b=d+(g<<2)|0;H[b>>2]=c;f=b+4|0;if((h|0)!=(i|0)){while(1){b=b-4|0;h=h-4|0;H[b>>2]=H[h>>2];if((h|0)!=(i|0)){continue}break}}H[a+56>>2]=d+(e<<2);H[a+52>>2]=f;H[a+48>>2]=b;if(!i){break b}oa(i);f=H[a+52>>2];break b}sa();v()}wa();v()}H[(e<<2)+f>>2]=d|j;c=H[H[h+28>>2]+(b<<2)>>2];if((c|0)!=-1){continue}break}return 0}H[a+52>>2]=f}if(H[a+48>>2]!=(f|0)){continue}break}}return 1}function Lj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;H[a+8>>2]=e;m=a+32|0;h=H[m>>2];f=H[a+36>>2]-h>>2;a:{if(f>>>0>>0){ya(m,e-f|0);d=H[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}H[a+36>>2]=h+(e<<2);d=e}s=H[a+52>>2];n=H[a+48>>2];f=0;h=e>>>0>1073741823?-1:e<<2;l=ra(pa(h),0,h);b:{if((d|0)<=0){break b}g=H[a+32>>2];while(1){d=f<<2;h=H[d+l>>2];i=H[a+16>>2];c:{if((h|0)>(i|0)){H[d+g>>2]=i;break c}d=d+g|0;i=H[a+12>>2];if((i|0)>(h|0)){H[d>>2]=i;break c}H[d>>2]=h}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){h=f<<2;d=h+c|0;h=H[b+h>>2]+H[g+h>>2]|0;H[d>>2]=h;d:{if((h|0)>H[a+16>>2]){h=h-H[a+20>>2]|0}else{if((h|0)>=H[a+12>>2]){break d}h=h+H[a+20>>2]|0}H[d>>2]=h}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=H[a+56>>2];q=H[f>>2];f=H[f+4>>2]-q|0;if((f|0)>=5){o=f>>>2|0;t=o>>>0<=2?2:o;u=e&-2;w=e&1;h=1;while(1){e:{f:{if((h|0)!=(o|0)){r=N(e,h);f=H[(h<<2)+q>>2];if((f|0)==-1|H[H[n>>2]+(f>>>3&536870908)>>2]>>>f&1){break f}f=H[H[H[n+64>>2]+12>>2]+(f<<2)>>2];if((f|0)==-1){break f}i=H[s>>2];g=H[n+28>>2];k=H[i+(H[g+(f<<2)>>2]<<2)>>2];if((k|0)>=(h|0)){break f}j=f+1|0;j=H[i+(H[g+(((j>>>0)%3|0?j:f-2|0)<<2)>>2]<<2)>>2];if((j|0)>=(h|0)){break f}f=H[i+(H[g+(f+((f>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((f|0)>=(h|0)){break f}g:{if((e|0)<=0){break g}g=N(e,f);i=N(e,j);k=N(e,k);f=0;p=0;if((e|0)!=1){while(1){H[(f<<2)+l>>2]=(H[(f+g<<2)+c>>2]+H[(f+i<<2)+c>>2]|0)-H[(f+k<<2)+c>>2];j=f|1;H[(j<<2)+l>>2]=(H[(g+j<<2)+c>>2]+H[(i+j<<2)+c>>2]|0)-H[(k+j<<2)+c>>2];f=f+2|0;p=p+2|0;if((u|0)!=(p|0)){continue}break}}if(!w){break g}H[(f<<2)+l>>2]=(H[(f+g<<2)+c>>2]+H[(f+i<<2)+c>>2]|0)-H[(f+k<<2)+c>>2]}if((d|0)<=0){break e}i=H[m>>2];f=0;while(1){d=f<<2;g=H[d+l>>2];k=H[a+16>>2];h:{if((g|0)>(k|0)){H[d+i>>2]=k;break h}d=d+i|0;k=H[a+12>>2];if((k|0)>(g|0)){H[d>>2]=k;break h}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+k|0;g=H[g+j>>2]+H[g+i>>2]|0;H[d>>2]=g;i:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break i}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}Ca();v()}if((d|0)<=0){break e}k=(N(h-1|0,e)<<2)+c|0;i=H[m>>2];f=0;while(1){d=f<<2;g=H[d+k>>2];j=H[a+16>>2];j:{if((g|0)>(j|0)){H[d+i>>2]=j;break j}d=d+i|0;j=H[a+12>>2];if((j|0)>(g|0)){H[d>>2]=j;break j}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+k|0;g=H[g+j>>2]+H[g+i>>2]|0;H[d>>2]=g;k:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break k}g=g+H[a+20>>2]|0}H[d>>2]=g}d=H[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}h=h+1|0;if((t|0)!=(h|0)){continue}break}}oa(l);return 1}function Gb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=O(0),k=0,l=0,m=O(0);i=H[c>>2];a:{b:{f=H[b+4>>2];if(!f){break b}g=Uj(f);c:{if(g>>>0>=2){e=i;if(f>>>0<=e>>>0){e=(i>>>0)%(f>>>0)|0}c=H[H[b>>2]+(e<<2)>>2];if(!c){break b}if(g>>>0<=1){break c}while(1){c=H[c>>2];if(!c){break b}g=H[c+4>>2];if((g|0)!=(i|0)){if(f>>>0<=g>>>0){g=(g>>>0)%(f>>>0)|0}if((e|0)!=(g|0)){break b}}if(H[c+8>>2]!=(i|0)){continue}break}b=0;break a}e=f-1&i;c=H[H[b>>2]+(e<<2)>>2];if(!c){break b}}h=f-1|0;while(1){c=H[c>>2];if(!c){break b}g=H[c+4>>2];if((g|0)!=(i|0)&(g&h)!=(e|0)){break b}if(H[c+8>>2]!=(i|0)){continue}break}b=0;break a}c=pa(16);d=H[H[d>>2]>>2];H[c+12>>2]=0;H[c+8>>2]=d;H[c+4>>2]=i;H[c>>2]=0;m=O(H[b+12>>2]+1>>>0);j=L[b+16>>2];d:{if(m>O(j*O(f>>>0))?0:f){break d}e=2;d=(f-1&f)!=0|f>>>0<3|f<<1;j=O(U(O(m/j)));e:{if(j=O(0)){g=~~j>>>0;break e}g=0}d=d>>>0>g>>>0?d:g;f:{if((d|0)==1){break f}if(!(d&d-1)){e=d;break f}e=Kd(d);f=H[b+4>>2]}g:{if(e>>>0<=f>>>0){if(e>>>0>=f>>>0){break g}g=f>>>0<3;j=O(U(O(O(K[b+12>>2])/L[b+16>>2])));h:{if(j=O(0)){d=~~j>>>0;break h}d=0}i:{j:{if(g){break j}if(Uj(f)>>>0>1){break j}d=d>>>0<2?d:1<<32-Q(d-1|0);break i}d=Kd(d)}e=d>>>0>>0?e:d;if(f>>>0<=e>>>0){break g}}f=0;g=0;h=e;k:{l:{m:{n:{if(e){if(h>>>0>=1073741824){break n}d=pa(h<<2);e=H[b>>2];H[b>>2]=d;if(e){oa(e)}H[b+4>>2]=h;d=0;if(h>>>0>=4){e=h&-4;while(1){k=d<<2;H[k+H[b>>2]>>2]=0;H[H[b>>2]+(k|4)>>2]=0;H[H[b>>2]+(k|8)>>2]=0;H[H[b>>2]+(k|12)>>2]=0;d=d+4|0;g=g+4|0;if((e|0)!=(g|0)){continue}break}}e=h&3;if(e){while(1){H[H[b>>2]+(d<<2)>>2]=0;d=d+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}e=H[b+8>>2];if(!e){break k}d=b+8|0;f=H[e+4>>2];g=Uj(h);if(g>>>0<2){break m}f=f>>>0>=h>>>0?(f>>>0)%(h>>>0)|0:f;H[H[b>>2]+(f<<2)>>2]=d;d=H[e>>2];if(!d){break k}if(g>>>0<=1){break l}while(1){g=H[d+4>>2];if(h>>>0<=g>>>0){g=(g>>>0)%(h>>>0)|0}o:{if((f|0)==(g|0)){e=d;break o}l=g<<2;k=l+H[b>>2]|0;if(!H[k>>2]){H[k>>2]=e;e=d;f=g;break o}H[e>>2]=H[d>>2];H[d>>2]=H[H[l+H[b>>2]>>2]>>2];H[H[l+H[b>>2]>>2]>>2]=d}d=H[e>>2];if(d){continue}break}break k}d=H[b>>2];H[b>>2]=0;if(d){oa(d)}H[b+4>>2]=0;break k}wa();v()}f=h-1&f;H[H[b>>2]+(f<<2)>>2]=d;d=H[e>>2];if(!d){break k}}k=h-1|0;while(1){g=k&H[d+4>>2];p:{if((g|0)==(f|0)){e=d;break p}l=g<<2;h=l+H[b>>2]|0;if(H[h>>2]){H[e>>2]=H[d>>2];H[d>>2]=H[H[l+H[b>>2]>>2]>>2];H[H[l+H[b>>2]>>2]>>2]=d;break p}H[h>>2]=e;e=d;f=g}d=H[e>>2];if(d){continue}break}}}f=H[b+4>>2];d=f-1|0;if(!(d&f)){e=d&i;break d}if(f>>>0>i>>>0){e=i;break d}e=(i>>>0)%(f>>>0)|0}e=H[b>>2]+(e<<2)|0;d=H[e>>2];q:{r:{if(!d){d=b+8|0;H[c>>2]=H[d>>2];H[b+8>>2]=c;H[e>>2]=d;d=H[c>>2];if(!d){break q}d=H[d+4>>2];e=f-1|0;s:{if(!(e&f)){d=d&e;break s}if(d>>>0>>0){break s}d=(d>>>0)%(f>>>0)|0}d=H[b>>2]+(d<<2)|0;break r}H[c>>2]=H[d>>2]}H[d>>2]=c}H[b+12>>2]=H[b+12>>2]+1;b=1}F[a+4|0]=b;H[a>>2]=c}function Oe(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;f=ca-80|0;ca=f;e=H[c+36>>2];H[f+72>>2]=H[c+32>>2];H[f+76>>2]=e;g=H[c+28>>2];e=f- -64|0;H[e>>2]=H[c+24>>2];H[e+4>>2]=g;e=H[c+20>>2];H[f+56>>2]=H[c+16>>2];H[f+60>>2]=e;e=H[c+12>>2];H[f+48>>2]=H[c+8>>2];H[f+52>>2]=e;e=H[c+4>>2];H[f+40>>2]=H[c>>2];H[f+44>>2]=e;nc(a,f+40|0,f+24|0);a:{if(H[a>>2]){break a}if(F[a+15|0]<0){oa(H[a+4>>2])}if(I[f+31|0]!=1){b=pa(32);F[b+20|0]=0;c=I[1448]|I[1449]<<8|(I[1450]<<16|I[1451]<<24);F[b+16|0]=c;F[b+17|0]=c>>>8;F[b+18|0]=c>>>16;F[b+19|0]=c>>>24;c=I[1444]|I[1445]<<8|(I[1446]<<16|I[1447]<<24);d=I[1440]|I[1441]<<8|(I[1442]<<16|I[1443]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1436]|I[1437]<<8|(I[1438]<<16|I[1439]<<24);d=I[1432]|I[1433]<<8|(I[1434]<<16|I[1435]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;H[a>>2]=-1;za(a+4|0,b,20);oa(b);break a}i=ca-16|0;ca=i;b:{c:{switch(I[f+32|0]){case 0:e=Ke(pa(48));H[e>>2]=13112;H[f+8>>2]=0;H[f+12>>2]=0;H[f>>2]=0;H[f+4>>2]=0;H[f+16>>2]=e;break b;case 1:e=Ke(pa(52));H[e+48>>2]=0;H[e>>2]=11276;H[f+8>>2]=0;H[f+12>>2]=0;H[f>>2]=0;H[f+4>>2]=0;H[f+16>>2]=e;break b;default:break c}}g=pa(32);F[g+28|0]=0;e=I[1550]|I[1551]<<8|(I[1552]<<16|I[1553]<<24);F[g+24|0]=e;F[g+25|0]=e>>>8;F[g+26|0]=e>>>16;F[g+27|0]=e>>>24;e=I[1546]|I[1547]<<8|(I[1548]<<16|I[1549]<<24);h=I[1542]|I[1543]<<8|(I[1544]<<16|I[1545]<<24);F[g+16|0]=h;F[g+17|0]=h>>>8;F[g+18|0]=h>>>16;F[g+19|0]=h>>>24;F[g+20|0]=e;F[g+21|0]=e>>>8;F[g+22|0]=e>>>16;F[g+23|0]=e>>>24;e=I[1538]|I[1539]<<8|(I[1540]<<16|I[1541]<<24);h=I[1534]|I[1535]<<8|(I[1536]<<16|I[1537]<<24);F[g+8|0]=h;F[g+9|0]=h>>>8;F[g+10|0]=h>>>16;F[g+11|0]=h>>>24;F[g+12|0]=e;F[g+13|0]=e>>>8;F[g+14|0]=e>>>16;F[g+15|0]=e>>>24;e=I[1530]|I[1531]<<8|(I[1532]<<16|I[1533]<<24);h=I[1526]|I[1527]<<8|(I[1528]<<16|I[1529]<<24);F[g|0]=h;F[g+1|0]=h>>>8;F[g+2|0]=h>>>16;F[g+3|0]=h>>>24;F[g+4|0]=e;F[g+5|0]=e>>>8;F[g+6|0]=e>>>16;F[g+7|0]=e>>>24;H[i>>2]=-1;e=i|4;za(e,g,28);j=F[i+15|0];H[f>>2]=H[i>>2];h=f+4|0;d:{if((j|0)>=0){j=H[e+4>>2];H[h>>2]=H[e>>2];H[h+4>>2]=j;H[h+8>>2]=H[e+8>>2];H[f+16>>2]=0;break d}za(h,H[i+4>>2],H[i+8>>2]);e=F[i+15|0];H[f+16>>2]=0;if((e|0)>=0){break d}oa(H[i+4>>2])}oa(g)}ca=i+16|0;e=H[f>>2];e:{if(e){H[a>>2]=e;a=a+4|0;if(F[f+15|0]>=0){b=f|4;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];break e}za(a,H[f+4>>2],H[f+8>>2]);break e}e=H[f+16>>2];H[f+16>>2]=0;H[e+44>>2]=d;te(a,e,b,c,d);if(!H[a>>2]){if(F[a+15|0]<0){oa(H[a+4>>2])}H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0}ea[H[H[e>>2]+4>>2]](e)}a=H[f+16>>2];H[f+16>>2]=0;if(a){ea[H[H[a>>2]+4>>2]](a)}if(F[f+15|0]>=0){break a}oa(H[f+4>>2])}ca=f+80|0}function Gc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=N(b,12)+a|0;H[j+12>>2]=H[j+8>>2];m=(c|0)==-1?-1:(c>>>0)/3|0;d=1;k=c;a:{b:{c:{while(1){d:{l=d;if(!d){if((k|0)==-1){break d}if((de(a,((k>>>0)%3|0?-1:2)+k|0)|0)==-1){break a}c=k+1|0;d=(c>>>0)%3|0?c:k-2|0;if((d|0)==-1){break a}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break a}d=H[H[H[a+4>>2]+12>>2]+(c<<2)>>2];if((d|0)==-1){break a}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break a}m=(c>>>0)/3|0}e:{d=H[a+56>>2]+(m>>>3&536870908)|0;h=H[d>>2];e=1<>2]=e|h;d=H[j+12>>2];f:{if((d|0)!=H[j+16>>2]){H[d>>2]=m;H[j+12>>2]=d+4;break f}n=H[j+8>>2];h=d-n|0;e=h>>2;i=e+1|0;if(i>>>0>=1073741824){break c}g=h>>>1|0;i=h>>>0>=2147483644?1073741823:i>>>0>>0?g:i;if(i){if(i>>>0>=1073741824){break b}g=pa(i<<2)}else{g=0}h=g+(e<<2)|0;H[h>>2]=m;e=h+4|0;if((d|0)!=(n|0)){while(1){h=h-4|0;d=d-4|0;H[h>>2]=H[d>>2];if((d|0)!=(n|0)){continue}break}}H[j+8>>2]=h;H[j+12>>2]=e;H[j+16>>2]=g+(i<<2);if(!n){break f}oa(n)}g=f+1|0;g:{h:{i:{if(!f){break i}if(g&1){if((c|0)==-1){c=-1;break g}d=c+1|0;c=(d>>>0)%3|0?d:c-2|0;break i}k=l?k:c;if((c|0)==-1){c=-1;break g}if((c>>>0)%3|0){d=c-1|0;break h}c=c+2|0}d=c;c=-1;if((d|0)==-1){break g}}c=H[H[H[a+4>>2]+12>>2]+(d<<2)>>2];h=-1;f=-1;e=d+1|0;e=(e>>>0)%3|0?e:d-2|0;if((e|0)>=0){f=(e>>>0)/3|0;f=H[(H[H[a>>2]+96>>2]+N(f,12)|0)+(e-N(f,3)<<2)>>2]}j:{if((c|0)==-1){break j}i=((c>>>0)%3|0?-1:2)+c|0;if((i|0)<0){break j}e=(i>>>0)/3|0;h=H[(H[H[a>>2]+96>>2]+N(e,12)|0)+(i-N(e,3)<<2)>>2]}if((f|0)!=(h|0)){c=-1;break g}k:{l:{f=((d>>>0)%3|0?-1:2)+d|0;if((f|0)>=0){d=(f>>>0)/3|0;if((c|0)!=-1){break l}c=-1;break g}d=-1;if((c|0)!=-1){break k}c=-1;break g}d=H[(H[H[a>>2]+96>>2]+N(d,12)|0)+(f-N(d,3)<<2)>>2]}f=c+1|0;e=(f>>>0)%3|0?f:c-2|0;if((e|0)>=0){f=(e>>>0)/3|0;f=H[(H[H[a>>2]+96>>2]+N(f,12)|0)+(e-N(f,3)<<2)>>2]}else{f=-1}if((f|0)!=(d|0)){c=-1;break g}f=g;m=(c>>>0)/3|0;d=H[a+56>>2]+(m>>>3&268435452)|0;h=H[d>>2];e=1<>2]-4|0;g=H[l>>2];d=H[a+56>>2]+(g>>>3&536870908)|0;c=H[d>>2];o=d,p=Vj(g)&c,H[o>>2]=p;H[j+12>>2]=l;break a}d=0;if(l){continue}break a}break}k=-1;de(a,-1);break a}sa();v()}wa();v()}H[((b<<2)+a|0)+44>>2]=k;b=H[j+12>>2];i=H[j+8>>2];m:{if((b|0)==(i|0)){break m}c=b-i|0;b=c>>2;b=b>>>0<=1?1:b;k=b&1;e=H[a+56>>2];d=0;if(c>>>0>=8){f=b&-2;c=0;while(1){l=d<<2;g=H[l+i>>2];b=e+(g>>>3&536870908)|0;a=H[b>>2];o=b,p=Vj(g)&a,H[o>>2]=p;g=H[i+(l|4)>>2];b=e+(g>>>3&536870908)|0;a=H[b>>2];o=b,p=Vj(g)&a,H[o>>2]=p;d=d+2|0;c=c+2|0;if((f|0)!=(c|0)){continue}break}}if(!k){break m}c=H[i+(d<<2)>>2];b=e+(c>>>3&536870908)|0;a=H[b>>2];o=b,p=Vj(c)&a,H[o>>2]=p}}function Gj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=ca-32|0;ca=h;a:{if(J[b+38>>1]<=513){c=H[b+20>>2];f=H[b+12>>2];d=H[b+16>>2];if((c|0)>=(f|0)&d>>>0>=K[b+8>>2]|(c|0)>(f|0)){break a}f=I[d+H[b>>2]|0];d=d+1|0;c=d?c:c+1|0;H[b+16>>2]=d;H[b+20>>2]=c;if(f){break a}}b:{if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[H[a+48>>2]+64>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}c:{if(d){Wa(a+60|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[H[a+48>>2]+64>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+72|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[H[a+48>>2]+64>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+84|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[H[a+48>>2]+64>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+96|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}e=0;c=H[b+8>>2];f=H[b+12>>2];d=c;c=H[b+20>>2];i=c;g=H[b+16>>2];j=g+4|0;c=j>>>0<4?c+1|0:c;if(d>>>0>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break a}m=H[b>>2];k=m+g|0;l=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);H[b+16>>2]=j;H[b+20>>2]=c;k=d;d=f;c=i;f=g+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>k>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break a}d=j+m|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;if((d|0)<(l|0)){break a}H[a+16>>2]=d;H[a+12>>2]=l;c=(d>>31)-((l>>31)+(d>>>0>>0)|0)|0;b=d-l|0;if(!c&b>>>0>2147483646|c){break a}e=1;b=b+1|0;H[a+20>>2]=b;c=b>>>1|0;H[a+24>>2]=c;H[a+28>>2]=0-c;if(b&1){break a}H[a+24>>2]=c-1;break a}}e=0}ca=h+32|0;return e|0}function pj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=ca-32|0;ca=h;a:{if(J[b+38>>1]<=513){c=H[b+20>>2];f=H[b+12>>2];d=H[b+16>>2];if((c|0)>=(f|0)&d>>>0>=K[b+8>>2]|(c|0)>(f|0)){break a}f=I[d+H[b>>2]|0];d=d+1|0;c=d?c:c+1|0;H[b+16>>2]=d;H[b+20>>2]=c;if(f){break a}}b:{if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[a+48>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}c:{if(d){Wa(a+60|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[a+48>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+72|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[a+48>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+84|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Xa(1,h+28|0,b)){break b}d=H[h+28>>2];c=H[a+48>>2];if(d>>>0>H[c+4>>2]-H[c>>2]>>2>>>0){break b}if(d){e=0;Wa(a+96|0,d);c=h+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;if(!ta(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|H[g>>2]}else{i=H[g>>2]&(f^-1)}H[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}e=0;c=H[b+8>>2];f=H[b+12>>2];d=c;c=H[b+20>>2];i=c;g=H[b+16>>2];j=g+4|0;c=j>>>0<4?c+1|0:c;if(d>>>0>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break a}m=H[b>>2];k=m+g|0;l=I[k|0]|I[k+1|0]<<8|(I[k+2|0]<<16|I[k+3|0]<<24);H[b+16>>2]=j;H[b+20>>2]=c;k=d;d=f;c=i;f=g+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>k>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break a}d=j+m|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;if((d|0)<(l|0)){break a}H[a+16>>2]=d;H[a+12>>2]=l;c=(d>>31)-((l>>31)+(d>>>0>>0)|0)|0;b=d-l|0;if(!c&b>>>0>2147483646|c){break a}e=1;b=b+1|0;H[a+20>>2]=b;c=b>>>1|0;H[a+24>>2]=c;H[a+28>>2]=0-c;if(b&1){break a}H[a+24>>2]=c-1;break a}}e=0}ca=h+32|0;return e|0}function xe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if((b|0)==-1){return 1}g=(b>>>0)/3|0;if(!(H[H[a+24>>2]+(g>>>3&268435452)>>2]>>>g&1)){f=H[a+48>>2];H[a+52>>2]=f;a:{if((f|0)!=H[a+56>>2]){H[f>>2]=b;H[a+52>>2]=f+4;break a}d=pa(4);H[d>>2]=b;c=d+4|0;H[a+56>>2]=c;H[a+52>>2]=c;H[a+48>>2]=d;if(!f){break a}oa(f)}e=-1;d=H[a+4>>2];c=b+1|0;i=(c>>>0)%3|0?c:b-2|0;if((i|0)!=-1){e=H[H[d>>2]+(i<<2)>>2]}b:{h=b-N(g,3)|0;if(h){c=b-1|0;break b}c=b+2|0;if((c|0)!=-1){break b}return 0}if((e|0)==-1){return 0}j=H[H[d>>2]+(c<<2)>>2];if((j|0)==-1){return 0}c=H[a+36>>2];f=c+(e>>>3&536870908)|0;g=H[f>>2];d=1<>2]=d|g;Ua(a+8|0,e,i);c=H[a+36>>2]}g=(j>>>3&536870908)+c|0;d=H[g>>2];c=1<>2]=c|d;Ua(a+8|0,j,(h?-1:2)+b|0)}c=H[a+52>>2];if((c|0)==H[a+48>>2]){return 1}j=a+8|0;while(1){c:{d:{c=c-4|0;b=H[c>>2];if((b|0)==-1){break d}d=(b>>>0)/3|0;f=H[a+24>>2]+(d>>>3&268435452)|0;g=H[f>>2];d=1<>2]=d|g;while(1){i=H[a+4>>2];e=H[H[i>>2]+(b<<2)>>2];if((e|0)==-1){return 0}e:{f:{h=H[a+36>>2]+(e>>>3&536870908)|0;f=H[h>>2];g=1<>2]+(e<<2)>>2];h:{if((d|0)==-1){break h}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break h}d=H[H[i+12>>2]+(c<<2)>>2];if((d|0)!=-1){break g}}H[h>>2]=f|g;Ua(j,e,b);break f}H[h>>2]=f|g;Ua(j,e,b);c=d+1|0;if((((c>>>0)%3|0?c:d-2|0)|0)==-1){break f}c=b-2|0;d=b+1|0;b=-1;c=(d>>>0)%3|0?d:c;if((c|0)!=-1){b=H[H[H[a+4>>2]+12>>2]+(c<<2)>>2]}c=(b>>>0)/3|0;d=1<>2];f=c>>>5|0;i=H[e+(f<<2)>>2];break e}c=-1;g=H[a+4>>2];d=b+1|0;d=(d>>>0)%3|0?d:b-2|0;if((d|0)!=-1){c=H[H[g+12>>2]+(d<<2)>>2]}i:{j:{if((b>>>0)%3|0){e=b-1|0;break j}e=b+2|0;b=-1;if((e|0)==-1){break i}}b=H[H[g+12>>2]+(e<<2)>>2]}g=(b|0)==-1;h=g?-1:(b>>>0)/3|0;k:{if((c|0)!=-1){e=H[a+24>>2];d=(c>>>0)/3|0;f=d>>>5|0;i=H[e+(f<<2)>>2];d=1<>2];f=h>>>5|0;i=H[e+(f<<2)>>2];if(!(d&i)){break e}}c=H[a+52>>2]-4|0;H[a+52>>2]=c;break c}if(g){b=c;break e}if(H[(h>>>3&536870908)+e>>2]>>>h&1){b=c;break e}e=H[a+52>>2];H[e-4>>2]=b;if(H[a+56>>2]!=(e|0)){H[e>>2]=c;c=e+4|0;break d}l:{h=H[a+48>>2];f=e-h|0;g=f>>2;d=g+1|0;if(d>>>0<1073741824){b=f>>>1|0;f=f>>>0>=2147483644?1073741823:b>>>0>d>>>0?b:d;if(f){if(f>>>0>=1073741824){break l}d=pa(f<<2)}else{d=0}b=d+(g<<2)|0;H[b>>2]=c;c=b+4|0;if((e|0)!=(h|0)){while(1){b=b-4|0;e=e-4|0;H[b>>2]=H[e>>2];if((e|0)!=(h|0)){continue}break}}H[a+56>>2]=d+(f<<2);H[a+52>>2]=c;H[a+48>>2]=b;if(!h){break c}oa(h);c=H[a+52>>2];break c}sa();v()}wa();v()}H[(f<<2)+e>>2]=d|i;if((b|0)!=-1){continue}break}return 0}H[a+52>>2]=c}if(H[a+48>>2]!=(c|0)){continue}break}}return 1}function uj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=ca-32|0;ca=g;H[a+68>>2]=f;d=H[a+56>>2];e=H[d>>2];d=H[d+4>>2];H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+60|0;d=d>>>2|0;n=d>>>0<=1?1:d;o=a+112|0;while(1){e=H[a+56>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Nb(m,H[d+(j<<2)>>2],g+16|0);i=H[g+20>>2];d=i>>31;h=H[g+16>>2];e=h>>31;f=(d^i)-d+((e^h)-e)|0;k=H[g+24>>2];d=k>>31;e=(d^k)-d|0;d=0;l=e;e=e+f|0;d=l>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+16>>2]=H[a+108>>2];break b}f=H[a+108>>2];l=f>>31;h=Sj(Rj(f,l,h,h>>31),da,e,d);H[g+16>>2]=h;d=Sj(Rj(f,l,i,i>>31),da,e,d);H[g+20>>2]=d;e=d;d=d>>31;e=(e^d)-d|0;d=h>>31;d=e+((d^h)-d|0)|0;if((k|0)>=0){H[g+24>>2]=f-d;break b}H[g+24>>2]=d-f}d=Ba(o);f=H[g+16>>2];c:{if(d){H[g+24>>2]=0-H[g+24>>2];e=0-H[g+20>>2]|0;H[g+20>>2]=e;f=0-f|0;H[g+16>>2]=f;break c}e=H[g+20>>2]}d:{if((f|0)>=0){f=H[a+108>>2];d=f+H[g+24>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+24>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+24>>2];f=d>>31;f=H[a+100>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+100>>2]+(d-(d^e)|0)|0}e=H[a+100>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}i=H[a+108>>2];if((i|0)>=(d|0)){break g}d=(i<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}i=H[a+108>>2];if((i|0)<=(d|0)){break h}d=(i<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+108>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+108>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}H[g+12>>2]=d;H[g+8>>2]=f;j:{if(H[a+8>>2]<=0){break j}i=H[a+32>>2];f=0;while(1){d=f<<2;e=H[d+(g+8|0)>>2];h=H[a+16>>2];k:{if((e|0)>(h|0)){H[d+i>>2]=h;break k}d=d+i|0;h=H[a+12>>2];if((h|0)>(e|0)){H[d>>2]=h;break k}H[d>>2]=e}f=f+1|0;e=H[a+8>>2];if((f|0)<(e|0)){continue}break}d=0;if((e|0)<=0){break j}e=j<<3;h=e+c|0;k=b+e|0;while(1){f=d<<2;e=f+h|0;f=H[f+k>>2]+H[f+i>>2]|0;H[e>>2]=f;l:{if((f|0)>H[a+16>>2]){f=f-H[a+20>>2]|0}else{if((f|0)>=H[a+12>>2]){break l}f=f+H[a+20>>2]|0}H[e>>2]=f}d=d+1|0;if((d|0)>2]){continue}break}}j=j+1|0;if((n|0)!=(j|0)){continue}break}}ca=g+32|0;return 1}Ca();v()}function dj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=ca-32|0;ca=g;H[a+68>>2]=f;d=H[a+56>>2];e=H[d>>2];d=H[d+4>>2];H[g+24>>2]=0;H[g+16>>2]=0;H[g+20>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+60|0;d=d>>>2|0;n=d>>>0<=1?1:d;o=a+112|0;while(1){e=H[a+56>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Lb(m,H[d+(j<<2)>>2],g+16|0);i=H[g+20>>2];d=i>>31;h=H[g+16>>2];e=h>>31;f=(d^i)-d+((e^h)-e)|0;k=H[g+24>>2];d=k>>31;e=(d^k)-d|0;d=0;l=e;e=e+f|0;d=l>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+16>>2]=H[a+108>>2];break b}f=H[a+108>>2];l=f>>31;h=Sj(Rj(f,l,h,h>>31),da,e,d);H[g+16>>2]=h;d=Sj(Rj(f,l,i,i>>31),da,e,d);H[g+20>>2]=d;e=d;d=d>>31;e=(e^d)-d|0;d=h>>31;d=e+((d^h)-d|0)|0;if((k|0)>=0){H[g+24>>2]=f-d;break b}H[g+24>>2]=d-f}d=Ba(o);f=H[g+16>>2];c:{if(d){H[g+24>>2]=0-H[g+24>>2];e=0-H[g+20>>2]|0;H[g+20>>2]=e;f=0-f|0;H[g+16>>2]=f;break c}e=H[g+20>>2]}d:{if((f|0)>=0){f=H[a+108>>2];d=f+H[g+24>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+24>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+24>>2];f=d>>31;f=H[a+100>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+100>>2]+(d-(d^e)|0)|0}e=H[a+100>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}i=H[a+108>>2];if((i|0)>=(d|0)){break g}d=(i<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}i=H[a+108>>2];if((i|0)<=(d|0)){break h}d=(i<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+108>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+108>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}H[g+12>>2]=d;H[g+8>>2]=f;j:{if(H[a+8>>2]<=0){break j}i=H[a+32>>2];f=0;while(1){d=f<<2;e=H[d+(g+8|0)>>2];h=H[a+16>>2];k:{if((e|0)>(h|0)){H[d+i>>2]=h;break k}d=d+i|0;h=H[a+12>>2];if((h|0)>(e|0)){H[d>>2]=h;break k}H[d>>2]=e}f=f+1|0;e=H[a+8>>2];if((f|0)<(e|0)){continue}break}d=0;if((e|0)<=0){break j}e=j<<3;h=e+c|0;k=b+e|0;while(1){f=d<<2;e=f+h|0;f=H[f+k>>2]+H[f+i>>2]|0;H[e>>2]=f;l:{if((f|0)>H[a+16>>2]){f=f-H[a+20>>2]|0}else{if((f|0)>=H[a+12>>2]){break l}f=f+H[a+20>>2]|0}H[e>>2]=f}d=d+1|0;if((d|0)>2]){continue}break}}j=j+1|0;if((n|0)!=(j|0)){continue}break}}ca=g+32|0;return 1}Ca();v()}function ke(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=ca-80|0;ca=h;a:{b:{if(I[H[a+28>>2]+36|0]<=1){d=H[b+20>>2];f=H[b+16>>2];c=f+4|0;d=c>>>0<4?d+1|0:d;g=H[b+12>>2];if(K[b+8>>2]>>0&(g|0)<=(d|0)|(d|0)>(g|0)){break a}f=f+H[b>>2]|0;j=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=c;H[b+20>>2]=d;break b}if(!Pc(1,h+76|0,b)){break a}j=H[h+76>>2]}if(!j){break a}d=H[b+8>>2];c=H[b+16>>2];d=Rj(d-c|0,H[b+12>>2]-(H[b+20>>2]+(c>>>0>d>>>0)|0)|0,5,0);c=da;if(d>>>0>>0&(c|0)<=0|(c|0)<0){break a}c=H[a+4>>2];d=H[a+8>>2]-c>>2;c:{if(d>>>0>>0){ya(a+4|0,j-d|0);break c}if(d>>>0<=j>>>0){break c}H[a+8>>2]=c+(j<<2)}p=a+16|0;l=H[a+32>>2];while(1){i=H[b+12>>2];c=i;d=H[b+20>>2];e=H[b+8>>2];f=H[b+16>>2];if((c|0)<=(d|0)&e>>>0<=f>>>0|(c|0)<(d|0)){e=0;break a}n=H[b>>2];q=I[n+f|0];c=d;g=f+1|0;c=g?c:c+1|0;H[b+16>>2]=g;H[b+20>>2]=c;if(e>>>0<=g>>>0&(c|0)>=(i|0)|(c|0)>(i|0)){e=0;break a}g=I[g+n|0];c=d;k=f+2|0;c=k>>>0<2?c+1|0:c;H[b+16>>2]=k;H[b+20>>2]=c;if(e>>>0<=k>>>0&(c|0)>=(i|0)|(c|0)>(i|0)){e=0;break a}k=I[k+n|0];c=d;m=f+3|0;c=m>>>0<3?c+1|0:c;H[b+16>>2]=m;H[b+20>>2]=c;if(e>>>0<=m>>>0&(c|0)>=(i|0)|(c|0)>(i|0)){e=0;break a}e=I[m+n|0];c=d;d=f+4|0;c=d>>>0<4?c+1|0:c;H[b+16>>2]=d;H[b+20>>2]=c;if(q>>>0>4){e=0;break a}if((g-12&255)>>>0<245){e=0;break a}if(!k){e=0;break a}m=Eb(h+8|0);i=(e|0)!=0;d=g-1|0;if(d>>>0<=10){c=H[(d<<2)+13584>>2]}else{c=-1}d=N(c,k);lc(m,q,k,g,i,d,d>>31);d:{d=J[H[a+28>>2]+36>>1];e:{if(((d<<8|d>>>8)&65535)>>>0<=258){c=H[b+20>>2];f=H[b+16>>2];d=f+2|0;c=d>>>0<2?c+1|0:c;e=H[b+12>>2];if(K[b+8>>2]>>0&(e|0)<=(c|0)|(c|0)>(e|0)){break d}f=f+H[b>>2]|0;e=I[f|0]|I[f+1|0]<<8;H[b+16>>2]=d;H[b+20>>2]=c;break e}if(!Pc(1,h+4|0,b)){break d}e=H[h+4>>2]}H[h+68>>2]=e;d=jc(pa(96),m);ea[H[H[l>>2]+8>>2]](l,H[l+12>>2]-H[l+8>>2]>>2,d);d=(H[l+12>>2]-H[l+8>>2]>>2)-1|0;f=d<<2;H[H[f+H[l+8>>2]>>2]+60>>2]=e;H[H[a+4>>2]+(o<<2)>>2]=d;e=H[a+16>>2];c=H[a+20>>2]-e>>2;f:{if((c|0)>(d|0)){break f}H[h>>2]=-1;d=d+1|0;if(d>>>0>c>>>0){Pa(p,d-c|0,h);e=H[p>>2];break f}if(c>>>0<=d>>>0){break f}H[a+20>>2]=(d<<2)+e}H[e+f>>2]=o;e=1;o=o+1|0;if((o|0)!=(j|0)){continue}break a}break}e=0}ca=h+80|0;return e|0}function nd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=ea[H[H[a>>2]+44>>2]](a)|0;a:{if((n|0)<=0){break a}i=H[b+4>>2]-H[b>>2]>>2;e=ca+-64|0;ca=e;f=Eb(e);d=N(H[3400],n);lc(f,H[H[a+8>>2]+56>>2],n&255,5,0,d,d>>31);f=jc(pa(96),f);F[f+84|0]=1;H[f+72>>2]=H[f+68>>2];mb(f,i);H[f+60>>2]=H[H[a+8>>2]+60>>2];d=H[a+16>>2];H[a+16>>2]=f;if(d){Ga(d)}ca=e- -64|0;h=H[a+16>>2];if(!H[h+80>>2]){break a}j=H[H[h>>2]>>2];if(!j){break a}m=H[c+12>>2];e=m;d=H[c+20>>2];g=H[c+8>>2];k=H[c+16>>2];if((e|0)<=(d|0)&g>>>0<=k>>>0|(d|0)>(e|0)){break a}l=N(i,n);i=j+H[h+48>>2]|0;h=H[c>>2];j=I[h+k|0];e=k+1|0;f=e?d:d+1|0;H[c+16>>2]=e;H[c+20>>2]=f;b:{c:{if(j){if(kd(l,n,c,i)){break c}break a}if((f|0)>=(m|0)&e>>>0>=g>>>0|(f|0)>(m|0)){break a}g=I[e+h|0];f=k+2|0;d=f>>>0<2?d+1|0:d;H[c+16>>2]=f;H[c+20>>2]=d;d=H[H[a+16>>2]+64>>2];d=H[d+4>>2]-H[d>>2]|0;if((g|0)==H[3400]){e=l<<2;if(e>>>0>d>>>0){break a}g=H[c+8>>2];k=H[c+12>>2];j=H[c+20>>2];d=H[c+16>>2];f=e+d|0;j=f>>>0>>0?j+1|0:j;if(f>>>0>g>>>0&(j|0)>=(k|0)|(j|0)>(k|0)){break a}qa(i,d+H[c>>2]|0,e);f=H[c+20>>2];d=e+H[c+16>>2]|0;f=d>>>0>>0?f+1|0:f;H[c+16>>2]=d;H[c+20>>2]=f;break c}if(d>>>0>>0){break a}d=H[c+8>>2];f=H[c+16>>2];e=d-f|0;m=d>>>0>>0;d=H[c+20>>2];k=H[c+12>>2]-(m+d|0)|0;m=Rj(g,0,l,0)>>>0>e>>>0;e=da;if(m&(e|0)>=(k|0)|(e|0)>(k|0)){break a}e=1;if(!l){break b}h=0;while(1){k=H[c+8>>2];j=H[c+12>>2];e=f+g|0;d=e>>>0>>0?d+1|0:d;if(e>>>0>k>>>0&(d|0)>=(j|0)|(d|0)>(j|0)){return 0}qa(i+(h<<2)|0,H[c>>2]+f|0,g);d=H[c+20>>2];f=g+H[c+16>>2]|0;d=f>>>0>>0?d+1|0:d;H[c+16>>2]=f;H[c+20>>2]=d;h=h+1|0;if((l|0)!=(h|0)){continue}break}}e=1;if(!l){break b}d=H[a+20>>2];if(d){e=0;if(ea[H[H[d>>2]+32>>2]](d)|0){break b}}g=0;h=0;d:{if((l|0)<=0){break d}if((l|0)!=1){f=l&-2;while(1){e=g<<2;d=H[e+i>>2];H[e+i>>2]=0-(d&1)^d>>>1;d=e|4;e=H[d+i>>2];H[d+i>>2]=0-(e&1)^e>>>1;g=g+2|0;h=h+2|0;if((f|0)!=(h|0)){continue}break}}if(!(l&1)){break d}d=g<<2;f=H[d+i>>2];H[d+i>>2]=0-(f&1)^f>>>1}e=0}d=e;f=H[a+20>>2];e:{if(!f){break e}if(!(ea[H[H[f>>2]+40>>2]](f,c)|0)){break a}if(d){break e}a=H[a+20>>2];if(!(ea[H[H[a>>2]+44>>2]](a,i,i,l,n,H[b>>2])|0)){break a}}o=1}return o|0}function pb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=ca-32|0;ca=h;a:{b:{if(H[a+8>>2]<<5>>>0>=b>>>0){break b}if((b|0)<0){break a}b=(b-1>>>5|0)+1|0;c=pa(b<<2);H[h+24>>2]=b;H[h+20>>2]=0;H[h+16>>2]=c;b=H[a>>2];H[h+12>>2]=0;H[h+8>>2]=b;c=H[a+4>>2];H[h+4>>2]=c&31;H[h>>2]=b+(c>>>3&536870908);e=ca-32|0;ca=e;i=H[h+4>>2];g=H[h+12>>2];j=H[h>>2];d=H[h+8>>2];b=(i-g|0)+(j-d<<3)|0;f=H[h+20>>2];c=b+f|0;H[h+20>>2]=c;if(!((c-1^f-1)>>>0<32?f:0)){H[H[h+16>>2]+((c>>>0>=33?c-1>>>5|0:0)<<2)>>2]=0}c=H[h+16>>2]+(f>>>3&536870908)|0;f=f&31;c:{if((f|0)==(g|0)){if((b|0)<=0){break c}if(g){i=32-g|0;f=(b|0)<(i|0)?b:i;i=-1<>>i-f;H[c>>2]=H[c>>2]&(i^-1)|i&H[d>>2];d=d+4|0;c=(g+f>>>3&536870908)+c|0;b=b-f|0}g=(b|0)/32|0;if(b+31>>>0>=63){va(c,d,g<<2)}b=b-(g<<5)|0;if((b|0)<=0){break c}f=c;c=g<<2;g=f+c|0;b=-1>>>32-b|0;H[g>>2]=H[g>>2]&(b^-1)|b&H[c+d>>2];break c}H[e+28>>2]=g;H[e+24>>2]=d;H[e+20>>2]=i;H[e+16>>2]=j;H[e+12>>2]=f;H[e+8>>2]=c;b=H[e+28>>2];c=H[e+24>>2];g=(H[e+20>>2]-b|0)+(H[e+16>>2]-c<<3)|0;d:{if((g|0)<=0){b=H[e+12>>2];d=H[e+8>>2];break d}e:{if(!b){b=H[e+12>>2];break e}d=H[e+12>>2];j=32-d|0;k=32-b|0;f=(g|0)<(k|0)?g:k;i=f>>>0>j>>>0?j:f;l=H[e+8>>2];m=H[l>>2]&(-1<>>j-i^-1);j=H[c>>2]&(-1<>>k-f);H[l>>2]=m|(b>>>0>>0?j<>>b-d|0);c=d+i|0;b=c&31;H[e+12>>2]=b;d=l+(c>>>3&536870908)|0;H[e+8>>2]=d;c=f-i|0;if((c|0)>0){H[d>>2]=H[d>>2]&(-1>>>32-c^-1)|j>>>i+H[e+28>>2];H[e+12>>2]=c;b=c}g=g-f|0;c=H[e+24>>2]+4|0;H[e+24>>2]=c}i=-1<=32){j=i^-1;while(1){d=H[e+8>>2];c=H[c>>2];H[d>>2]=j&H[d>>2]|c<>2]=d+4;H[d+4>>2]=i&H[d+4>>2]|c>>>f;c=H[e+24>>2]+4|0;H[e+24>>2]=c;d=g>>>0>63;g=g-32|0;if(d){continue}break}}d=H[e+8>>2];if((g|0)<=0){break d}j=f;f=(g|0)>(f|0)?f:g;j=H[d>>2]&(i&-1>>>j-f^-1);i=H[c>>2]&-1>>>32-g;H[d>>2]=j|i<>2]=c;d=(b>>>3&536870908)+d|0;H[e+8>>2]=d;b=g-f|0;if((b|0)<=0){b=c;break d}H[d>>2]=H[d>>2]&(-1>>>32-b^-1)|i>>>f;H[e+12>>2]=b}H[e+4>>2]=b;H[e>>2]=d}ca=e+32|0;b=H[a>>2];H[a>>2]=H[h+16>>2];H[h+16>>2]=b;c=H[a+4>>2];H[a+4>>2]=H[h+20>>2];H[h+20>>2]=c;c=H[a+8>>2];H[a+8>>2]=H[h+24>>2];H[h+24>>2]=c;if(!b){break b}oa(b)}ca=h+32|0;return}sa();v()}function Ne(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=J[b+38>>1];a:{if(!c){break a}b:{if(c>>>0<=511){g=H[b+8>>2];e=H[b+12>>2];d=H[b+20>>2];c=H[b+16>>2];i=c+4|0;d=i>>>0<4?d+1|0:d;if(g>>>0>>0&(d|0)>=(e|0)|(d|0)>(e|0)){break a}c=c+H[b>>2]|0;f=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[a+12>>2]=f;d=H[b+20>>2];c=H[b+16>>2]+4|0;d=c>>>0<4?d+1|0:d;H[b+16>>2]=c;H[b+20>>2]=d;break b}if(!hb(1,a+12|0,b)){break a}c=H[b+16>>2];d=H[b+20>>2];f=H[a+12>>2]}e=H[b+8>>2];i=e-c|0;c=H[b+12>>2]-(d+(c>>>0>e>>>0)|0)|0;if(i>>>0>>6>>>0&(c|0)<=0|(c|0)<0){break a}d=H[a>>2];c=H[a+4>>2]-d>>2;c:{if(c>>>0>>0){ya(a,f-c|0);f=H[a+12>>2];break c}if(c>>>0<=f>>>0){break c}H[a+4>>2]=d+(f<<2)}if(!f){return 1}c=H[b+16>>2];d=H[b+20>>2];l=H[a>>2];i=H[b+8>>2];j=H[b+12>>2];g=0;while(1){if((d|0)>=(j|0)&c>>>0>=i>>>0|(d|0)>(j|0)){return 0}m=H[b>>2];k=I[m+c|0];c=c+1|0;d=c?d:d+1|0;H[b+16>>2]=c;H[b+20>>2]=d;e=k>>>2|0;h=0;d:{e:{f:{g:{n=k&3;switch(n|0){case 0:break e;case 3:break g;default:break f}}e=e+g|0;if(e>>>0>=f>>>0){return 0}ra(l+(g<<2)|0,0,(k&252)+4|0);g=e;break d}while(1){if((c|0)==(i|0)&(d|0)==(j|0)){break a}f=I[c+m|0];c=c+1|0;d=c?d:d+1|0;H[b+16>>2]=c;H[b+20>>2]=d;e=f<<(h<<3|6)|e;h=h+1|0;if((n|0)!=(h|0)){continue}break}}H[l+(g<<2)>>2]=e}f=H[a+12>>2];g=g+1|0;if(f>>>0>g>>>0){continue}break}b=a+16|0;i=H[a>>2];d=H[a+16>>2];c=H[a+20>>2]-d|0;h:{if(c>>>0<=16383){ya(b,4096-(c>>>2|0)|0);break h}if((c|0)==16384){break h}H[a+20>>2]=d+16384}c=a+28|0;g=H[c>>2];d=H[a+32>>2]-g>>3;i:{if(d>>>0>>0){ob(c,f-d|0);g=H[c>>2];break i}if(d>>>0>f>>>0){H[a+32>>2]=(f<<3)+g}if(!f){break a}}d=H[b>>2];b=0;a=0;while(1){c=i+(b<<2)|0;h=H[c>>2];e=a;j=(b<<3)+g|0;H[j+4>>2]=a;H[j>>2]=h;c=H[c>>2];a=c+a|0;if(a>>>0>4096){break a}j:{if(a>>>0<=e>>>0){break j}h=0;j=c&7;if(j){while(1){H[d+(e<<2)>>2]=b;e=e+1|0;h=h+1|0;if((j|0)!=(h|0)){continue}break}}if(c-1>>>0<=6){break j}while(1){c=d+(e<<2)|0;H[c>>2]=b;H[c+28>>2]=b;H[c+24>>2]=b;H[c+20>>2]=b;H[c+16>>2]=b;H[c+12>>2]=b;H[c+8>>2]=b;H[c+4>>2]=b;e=e+8|0;if((e|0)!=(a|0)){continue}break}}b=b+1|0;if((f|0)!=(b|0)){continue}break}o=(a|0)==4096}return o}function Ni(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=ca-48|0;ca=g;d=H[a+8>>2];if(d-2>>>0<=28){H[a+76>>2]=d;e=-1<>2]=d;H[a+80>>2]=e^-1;H[a+92>>2]=(d|0)/2;L[a+88>>2]=O(2)/O(d|0)}H[a+52>>2]=f;d=H[a+40>>2];e=H[d>>2];d=H[d+4>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=H[a+40>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Nb(n,H[d+(j<<2)>>2],g+8|0);h=H[g+12>>2];d=h>>31;i=H[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=H[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+8>>2]=H[a+92>>2];break b}f=H[a+92>>2];k=f>>31;i=Sj(Rj(f,k,i,i>>31),da,e,d);H[g+8>>2]=i;d=Sj(Rj(f,k,h,h>>31),da,e,d);H[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){H[g+16>>2]=f-d;break b}H[g+16>>2]=d-f}d=Ba(p);f=H[g+8>>2];c:{if(d){H[g+16>>2]=0-H[g+16>>2];e=0-H[g+12>>2]|0;H[g+12>>2]=e;f=0-f|0;H[g+8>>2]=f;break c}e=H[g+12>>2]}d:{if((f|0)>=0){f=H[a+92>>2];d=f+H[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+16>>2];f=d>>31;f=H[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+84>>2]+(d-(d^e)|0)|0}e=H[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=H[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=H[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=H[h>>2];h=H[h+4>>2];H[g+36>>2]=d;H[g+32>>2]=f;H[g+24>>2]=i;H[g+28>>2]=h;qc(g+40|0,m,g+32|0,g+24|0);d=c+e|0;H[d>>2]=H[g+40>>2];H[d+4>>2]=H[g+44>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}ca=g+48|0;return 1}Ca();v()}function Ii(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=ca-48|0;ca=g;d=H[a+8>>2];if(d-2>>>0<=28){H[a+76>>2]=d;e=-1<>2]=d;H[a+80>>2]=e^-1;H[a+92>>2]=(d|0)/2;L[a+88>>2]=O(2)/O(d|0)}H[a+52>>2]=f;d=H[a+40>>2];e=H[d>>2];d=H[d+4>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=H[a+40>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Lb(n,H[d+(j<<2)>>2],g+8|0);h=H[g+12>>2];d=h>>31;i=H[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=H[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+8>>2]=H[a+92>>2];break b}f=H[a+92>>2];k=f>>31;i=Sj(Rj(f,k,i,i>>31),da,e,d);H[g+8>>2]=i;d=Sj(Rj(f,k,h,h>>31),da,e,d);H[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){H[g+16>>2]=f-d;break b}H[g+16>>2]=d-f}d=Ba(p);f=H[g+8>>2];c:{if(d){H[g+16>>2]=0-H[g+16>>2];e=0-H[g+12>>2]|0;H[g+12>>2]=e;f=0-f|0;H[g+8>>2]=f;break c}e=H[g+12>>2]}d:{if((f|0)>=0){f=H[a+92>>2];d=f+H[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+16>>2];f=d>>31;f=H[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+84>>2]+(d-(d^e)|0)|0}e=H[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=H[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=H[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=H[h>>2];h=H[h+4>>2];H[g+36>>2]=d;H[g+32>>2]=f;H[g+24>>2]=i;H[g+28>>2]=h;qc(g+40|0,m,g+32|0,g+24|0);d=c+e|0;H[d>>2]=H[g+40>>2];H[d+4>>2]=H[g+44>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}ca=g+48|0;return 1}Ca();v()}function Wi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=ca-48|0;ca=g;d=H[a+8>>2];if(d-2>>>0<=28){H[a+76>>2]=d;e=-1<>2]=d;H[a+80>>2]=e^-1;H[a+92>>2]=(d|0)/2;L[a+88>>2]=O(2)/O(d|0)}H[a+52>>2]=f;d=H[a+40>>2];e=H[d>>2];d=H[d+4>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=H[a+40>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Nb(n,H[d+(j<<2)>>2],g+8|0);h=H[g+12>>2];d=h>>31;i=H[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=H[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+8>>2]=H[a+92>>2];break b}f=H[a+92>>2];k=f>>31;i=Sj(Rj(f,k,i,i>>31),da,e,d);H[g+8>>2]=i;d=Sj(Rj(f,k,h,h>>31),da,e,d);H[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){H[g+16>>2]=f-d;break b}H[g+16>>2]=d-f}d=Ba(p);f=H[g+8>>2];c:{if(d){H[g+16>>2]=0-H[g+16>>2];e=0-H[g+12>>2]|0;H[g+12>>2]=e;f=0-f|0;H[g+8>>2]=f;break c}e=H[g+12>>2]}d:{if((f|0)>=0){f=H[a+92>>2];d=f+H[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+16>>2];f=d>>31;f=H[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+84>>2]+(d-(d^e)|0)|0}e=H[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=H[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=H[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=H[h+4>>2];H[g+40>>2]=H[h>>2];H[g+44>>2]=i;H[g+28>>2]=d;H[g+24>>2]=f;rc(g+32|0,m,g+24|0,g+40|0);d=c+e|0;H[d>>2]=H[g+32>>2];H[d+4>>2]=H[g+36>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}ca=g+48|0;return 1}Ca();v()}function Ri(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=ca-48|0;ca=g;d=H[a+8>>2];if(d-2>>>0<=28){H[a+76>>2]=d;e=-1<>2]=d;H[a+80>>2]=e^-1;H[a+92>>2]=(d|0)/2;L[a+88>>2]=O(2)/O(d|0)}H[a+52>>2]=f;d=H[a+40>>2];e=H[d>>2];d=H[d+4>>2];H[g+16>>2]=0;H[g+8>>2]=0;H[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=H[a+40>>2];d=H[e>>2];if(H[e+4>>2]-d>>2>>>0<=j>>>0){break a}Lb(n,H[d+(j<<2)>>2],g+8|0);h=H[g+12>>2];d=h>>31;i=H[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=H[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){H[g+8>>2]=H[a+92>>2];break b}f=H[a+92>>2];k=f>>31;i=Sj(Rj(f,k,i,i>>31),da,e,d);H[g+8>>2]=i;d=Sj(Rj(f,k,h,h>>31),da,e,d);H[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){H[g+16>>2]=f-d;break b}H[g+16>>2]=d-f}d=Ba(p);f=H[g+8>>2];c:{if(d){H[g+16>>2]=0-H[g+16>>2];e=0-H[g+12>>2]|0;H[g+12>>2]=e;f=0-f|0;H[g+8>>2]=f;break c}e=H[g+12>>2]}d:{if((f|0)>=0){f=H[a+92>>2];d=f+H[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=H[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=H[g+16>>2];f=d>>31;f=H[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=H[a+84>>2]+(d-(d^e)|0)|0}e=H[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=H[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=H[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=H[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=H[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=H[h+4>>2];H[g+40>>2]=H[h>>2];H[g+44>>2]=i;H[g+28>>2]=d;H[g+24>>2]=f;rc(g+32|0,m,g+24|0,g+40|0);d=c+e|0;H[d>>2]=H[g+32>>2];H[d+4>>2]=H[g+36>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}ca=g+48|0;return 1}Ca();v()}function Ge(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=ca-16|0;ca=f;c=H[a+4>>2];H[a+40>>2]=H[a>>2];H[a+44>>2]=c;c=H[a+36>>2];H[a+72>>2]=H[a+32>>2];H[a+76>>2]=c;d=H[a+28>>2];c=a- -64|0;H[c>>2]=H[a+24>>2];H[c+4>>2]=d;c=H[a+20>>2];H[a+56>>2]=H[a+16>>2];H[a+60>>2]=c;c=H[a+12>>2];H[a+48>>2]=H[a+8>>2];H[a+52>>2]=c;a:{b:{if(Db(a+40|0,1,f+8|0)){c=H[a+44>>2];H[a>>2]=H[a+40>>2];H[a+4>>2]=c;c=H[a+76>>2];H[a+32>>2]=H[a+72>>2];H[a+36>>2]=c;c=H[a+68>>2];H[a+24>>2]=H[a+64>>2];H[a+28>>2]=c;d=H[a+60>>2];h=d;c=H[a+56>>2];H[a+16>>2]=c;H[a+20>>2]=d;e=H[a+52>>2];d=H[a+48>>2];H[a+8>>2]=d;H[a+12>>2]=e;i=d-c|0;g=H[f+12>>2];e=e-((c>>>0>d>>>0)+h|0)|0;d=H[f+8>>2];if((g|0)==(e|0)&i>>>0>=d>>>0|e>>>0>g>>>0){break b}}c=0;break a}e=h+g|0;c=c+d|0;e=c>>>0>>0?e+1|0:e;H[a+16>>2]=c;H[a+20>>2]=e;c:{if(J[a+38>>1]<=513){c=H[a+4>>2];H[a+96>>2]=H[a>>2];H[a+100>>2]=c;c=H[a+36>>2];H[a+128>>2]=H[a+32>>2];H[a+132>>2]=c;c=H[a+28>>2];H[a+120>>2]=H[a+24>>2];H[a+124>>2]=c;c=H[a+20>>2];H[a+112>>2]=H[a+16>>2];H[a+116>>2]=c;c=H[a+12>>2];H[a+104>>2]=H[a+8>>2];H[a+108>>2]=c;d:{if(Db(a+96|0,1,f+8|0)){c=H[a+100>>2];H[a>>2]=H[a+96>>2];H[a+4>>2]=c;c=H[a+132>>2];H[a+32>>2]=H[a+128>>2];H[a+36>>2]=c;c=H[a+124>>2];H[a+24>>2]=H[a+120>>2];H[a+28>>2]=c;d=H[a+116>>2];h=d;c=H[a+112>>2];H[a+16>>2]=c;H[a+20>>2]=d;e=H[a+108>>2];d=H[a+104>>2];H[a+8>>2]=d;H[a+12>>2]=e;i=d-c|0;g=H[f+12>>2];e=e-((c>>>0>d>>>0)+h|0)|0;d=H[f+8>>2];if((g|0)==(e|0)&i>>>0>=d>>>0|e>>>0>g>>>0){break d}}c=0;break a}e=h+g|0;c=c+d|0;e=c>>>0>>0?e+1|0:e;H[a+16>>2]=c;H[a+20>>2]=e;break c}c=0;if(!ta(a+80|0,a)){break a}}c=0;if(!Fe(a)){break a}c=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=c;c=H[a+36>>2];H[b+32>>2]=H[a+32>>2];H[b+36>>2]=c;c=H[a+28>>2];H[b+24>>2]=H[a+24>>2];H[b+28>>2]=c;c=H[a+20>>2];H[b+16>>2]=H[a+16>>2];H[b+20>>2]=c;c=H[a+12>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=c;c=1}ca=f+16|0;return c}function oe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;if(!H[a+64>>2]){c=pa(32);H[c+16>>2]=0;H[c+20>>2]=0;H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;d=H[a+64>>2];H[a+64>>2]=c;if(d){c=H[d>>2];if(c){H[d+4>>2]=c;oa(c)}oa(d);c=H[a+64>>2]}H[a>>2]=c;d=H[c+20>>2];H[a+8>>2]=H[c+16>>2];H[a+12>>2]=d;d=H[c+24>>2];c=H[c+28>>2];H[a+48>>2]=0;H[a+52>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+16>>2]=d;H[a+20>>2]=c}a:{F[a+24|0]=I[b+24|0];H[a+28>>2]=H[b+28>>2];F[a+32|0]=I[b+32|0];c=H[b+44>>2];H[a+40>>2]=H[b+40>>2];H[a+44>>2]=c;c=H[b+52>>2];H[a+48>>2]=H[b+48>>2];H[a+52>>2]=c;H[a+56>>2]=H[b+56>>2];c=H[b+12>>2];H[a+8>>2]=H[b+8>>2];H[a+12>>2]=c;c=H[b+20>>2];H[a+16>>2]=H[b+16>>2];H[a+20>>2]=c;H[a+60>>2]=H[b+60>>2];c=H[b>>2];b:{if(!c){H[a>>2]=0;d=1;break b}g=H[a>>2];d=0;if(!g){break b}d=H[c>>2];c=H[c+4>>2]-d|0;se(g,d,c,0);d=1}c:{if(!d){break c}F[a+84|0]=I[b+84|0];H[a+80>>2]=H[b+80>>2];if((a|0)!=(b|0)){Cb(a+68|0,H[b+68>>2],H[b+72>>2])}f=H[b+88>>2];d:{if(f){e=pa(40);b=H[f>>2];H[e+16>>2]=0;H[e+8>>2]=0;H[e+12>>2]=0;H[e>>2]=b;c=H[f+12>>2];b=H[f+8>>2];if((c|0)!=(b|0)){c=c-b|0;if((c|0)<0){break a}b=pa(c);H[e+12>>2]=b;H[e+8>>2]=b;H[e+16>>2]=b+c;c=H[f+8>>2];h=H[f+12>>2];e:{if((c|0)==(h|0)){break e}g=(c^-1)+h|0;d=h-c&7;if(d){while(1){F[b|0]=I[c|0];b=b+1|0;c=c+1|0;i=i+1|0;if((d|0)!=(i|0)){continue}break}}if(g>>>0<7){break e}while(1){F[b|0]=I[c|0];F[b+1|0]=I[c+1|0];F[b+2|0]=I[c+2|0];F[b+3|0]=I[c+3|0];F[b+4|0]=I[c+4|0];F[b+5|0]=I[c+5|0];F[b+6|0]=I[c+6|0];F[b+7|0]=I[c+7|0];b=b+8|0;c=c+8|0;if((h|0)!=(c|0)){continue}break}}H[e+12>>2]=b}b=H[f+36>>2];H[e+32>>2]=H[f+32>>2];H[e+36>>2]=b;b=H[f+28>>2];H[e+24>>2]=H[f+24>>2];H[e+28>>2]=b;b=H[a+88>>2];H[a+88>>2]=e;if(b){break d}break c}b=H[a+88>>2];H[a+88>>2]=0;if(!b){break c}}a=H[b+8>>2];if(a){H[b+12>>2]=a;oa(a)}oa(b)}return}sa();v()}function og(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=ca-32|0;ca=f;e=f+8|0;c=ca-80|0;ca=c;a=H[b+36>>2];H[c+72>>2]=H[b+32>>2];H[c+76>>2]=a;d=H[b+28>>2];a=c- -64|0;H[a>>2]=H[b+24>>2];H[a+4>>2]=d;a=H[b+20>>2];H[c+56>>2]=H[b+16>>2];H[c+60>>2]=a;a=H[b+12>>2];H[c+48>>2]=H[b+8>>2];H[c+52>>2]=a;a=H[b+4>>2];H[c+40>>2]=H[b>>2];H[c+44>>2]=a;nc(c+8|0,c+40|0,c+24|0);a=H[c+8>>2];a:{if(a){H[e>>2]=a;a=e+4|0;if(F[c+23|0]>=0){b=c+8|4;e=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=e;H[a+8>>2]=H[b+8>>2];break a}za(a,H[c+12>>2],H[c+16>>2]);if(F[c+23|0]>=0){break a}oa(H[c+12>>2]);break a}if(F[c+23|0]<0){oa(H[c+12>>2])}a=I[c+31|0];if(a>>>0>=2){b=pa(32);F[b+26|0]=0;a=I[1477]|I[1478]<<8;F[b+24|0]=a;F[b+25|0]=a>>>8;a=I[1473]|I[1474]<<8|(I[1475]<<16|I[1476]<<24);d=I[1469]|I[1470]<<8|(I[1471]<<16|I[1472]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=a;F[b+21|0]=a>>>8;F[b+22|0]=a>>>16;F[b+23|0]=a>>>24;a=I[1465]|I[1466]<<8|(I[1467]<<16|I[1468]<<24);d=I[1461]|I[1462]<<8|(I[1463]<<16|I[1464]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=a;F[b+13|0]=a>>>8;F[b+14|0]=a>>>16;F[b+15|0]=a>>>24;a=I[1457]|I[1458]<<8|(I[1459]<<16|I[1460]<<24);d=I[1453]|I[1454]<<8|(I[1455]<<16|I[1456]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=a;F[b+5|0]=a>>>8;F[b+6|0]=a>>>16;F[b+7|0]=a>>>24;H[c+8>>2]=-1;a=c+8|4;za(a,b,26);d=F[c+23|0];H[e>>2]=H[c+8>>2];e=e+4|0;if((d|0)>=0){d=H[a+4>>2];H[e>>2]=H[a>>2];H[e+4>>2]=d;H[e+8>>2]=H[a+8>>2];oa(b);break a}za(e,H[c+12>>2],H[c+16>>2]);if(F[c+23|0]<0){oa(H[c+12>>2])}oa(b);break a}H[e>>2]=0;H[e+4>>2]=0;H[e+16>>2]=a;H[e+8>>2]=0;H[e+12>>2]=0}ca=c+80|0;a=H[f+24>>2];if(F[f+23|0]<0){oa(H[f+12>>2])}ca=f+32|0;return a|0}function Xd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=ca-16|0;ca=k;H[k+8>>2]=c;h=H[a+12>>2];d=H[a+8>>2];g=h-d>>2;a:{if((g|0)>(b|0)){break a}e=b+1|0;if(e>>>0>g>>>0){l=e-g|0;f=H[a+16>>2];d=H[a+12>>2];if(l>>>0<=f-d>>2>>>0){if(l){e=d;d=l<<2;d=ra(e,0,d)+d|0}H[a+12>>2]=d;break a}b:{c:{d:{m=H[a+8>>2];g=d-m>>2;i=g+l|0;if(i>>>0<1073741824){e=f-m|0;f=e>>>1|0;e=e>>>0>=2147483644?1073741823:f>>>0>i>>>0?f:i;if(e){if(e>>>0>=1073741824){break d}j=pa(e<<2)}h=(g<<2)+j|0;f=l<<2;i=ra(h,0,f);g=f+i|0;e=(e<<2)+j|0;if((d|0)==(m|0)){break c}while(1){d=d-4|0;f=H[d>>2];H[d>>2]=0;h=h-4|0;H[h>>2]=f;if((d|0)!=(m|0)){continue}break}H[a+16>>2]=e;e=H[a+12>>2];H[a+12>>2]=g;d=H[a+8>>2];H[a+8>>2]=h;if((d|0)==(e|0)){break b}while(1){e=e-4|0;f=H[e>>2];H[e>>2]=0;if(f){Ga(f)}if((d|0)!=(e|0)){continue}break}break b}sa();v()}wa();v()}H[a+16>>2]=e;H[a+12>>2]=g;H[a+8>>2]=i}if(d){oa(d)}break a}if(e>>>0>=g>>>0){break a}d=d+(e<<2)|0;if((d|0)!=(h|0)){while(1){h=h-4|0;c=H[h>>2];H[h>>2]=0;if(c){Ga(c)}if((d|0)!=(h|0)){continue}break}c=H[k+8>>2]}H[a+12>>2]=d}e:{f:{d=H[c+56>>2];g:{if((d|0)>4){break g}j=N(d,12)+a|0;d=H[j+24>>2];if((d|0)!=H[j+28>>2]){H[d>>2]=b;H[j+24>>2]=d+4;break g}i=H[j+20>>2];g=d-i|0;f=g>>2;e=f+1|0;if(e>>>0>=1073741824){break f}d=g>>>1|0;e=g>>>0>=2147483644?1073741823:d>>>0>e>>>0?d:e;if(e){if(e>>>0>=1073741824){break e}d=pa(e<<2)}else{d=0}f=d+(f<<2)|0;H[f>>2]=b;d=va(d,i,g);H[j+20>>2]=d;H[j+24>>2]=f+4;H[j+28>>2]=d+(e<<2);if(!i){break g}oa(i)}H[c+60>>2]=b;a=H[a+8>>2];H[k+8>>2]=0;a=a+(b<<2)|0;b=H[a>>2];H[a>>2]=c;if(b){Ga(b)}a=H[k+8>>2];H[k+8>>2]=0;if(a){Ga(a)}ca=k+16|0;return}sa();v()}wa();v()}function Og(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c;d=a;a:{if(H[a+12>>2]==(b|0)){break a}a=b;b=H[d+4>>2];e=H[d>>2];if((b|0)!=(e|0)){while(1){c=b-12|0;if(F[b-1|0]<0){oa(H[c>>2])}b=c;if((e|0)!=(b|0)){continue}break}}H[d+12>>2]=a;H[d+4>>2]=e;c=H[a>>2];j=a+4|0;if((c|0)==(j|0)){break a}while(1){a=H[d+4>>2];b:{if((a|0)!=H[d+8>>2]){c:{if(F[c+27|0]>=0){b=H[c+20>>2];H[a>>2]=H[c+16>>2];H[a+4>>2]=b;H[a+8>>2]=H[c+24>>2];break c}za(a,H[c+16>>2],H[c+20>>2])}H[d+4>>2]=a+12;break b}g=0;d:{e:{f:{a=H[d+4>>2];e=H[d>>2];f=(a-e|0)/12|0;b=f+1|0;if(b>>>0<357913942){h=(H[d+8>>2]-e|0)/12|0;k=h<<1;b=h>>>0>=178956970?357913941:b>>>0>>0?k:b;if(b){if(b>>>0>=357913942){break f}g=pa(N(b,12))}h=N(b,12);b=N(f,12)+g|0;g:{if(F[c+27|0]>=0){f=H[c+20>>2];H[b>>2]=H[c+16>>2];H[b+4>>2]=f;H[b+8>>2]=H[c+24>>2];break g}za(b,H[c+16>>2],H[c+20>>2]);e=H[d>>2];a=H[d+4>>2]}g=g+h|0;f=b+12|0;if((a|0)==(e|0)){break e}while(1){a=a-12|0;h=H[a+4>>2];b=b-12|0;H[b>>2]=H[a>>2];H[b+4>>2]=h;H[b+8>>2]=H[a+8>>2];H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;if((a|0)!=(e|0)){continue}break}H[d+8>>2]=g;a=H[d+4>>2];H[d+4>>2]=f;e=H[d>>2];H[d>>2]=b;if((a|0)==(e|0)){break d}while(1){b=a-12|0;if(F[a-1|0]<0){oa(H[b>>2])}a=b;if((e|0)!=(b|0)){continue}break}break d}sa();v()}wa();v()}H[d+8>>2]=g;H[d+4>>2]=f;H[d>>2]=b}if(e){oa(e)}}b=H[c+4>>2];h:{if(b){while(1){a=b;b=H[b>>2];if(b){continue}break h}}while(1){a=H[c+8>>2];b=H[a>>2]!=(c|0);c=a;if(b){continue}break}}c=a;if((j|0)!=(a|0)){continue}break}}a=0;i:{if((i|0)<0){break i}b=H[d>>2];if((H[d+4>>2]-b|0)/12>>>0<=i>>>0){break i}a=b+N(i,12)|0;a=F[a+11|0]<0?H[a>>2]:a}return a|0}function bd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=ca-16|0;ca=i;H[i>>2]=b;f=-1;a:{if((b|0)==-1){H[i+4>>2]=-1;break a}f=b+1|0;H[i+4>>2]=(f>>>0)%3|0?f:b-2|0;if((b>>>0)%3|0){f=b-1|0;break a}f=b+2|0}H[i+8>>2]=f;n=(b>>>0)/3|0;b:{c:{d:{while(1){e:{f:{j=H[(l<<2)+i>>2];if((j|0)!=-1){f=H[H[H[a+8>>2]+12>>2]+(j<<2)>>2];if((f|0)!=-1){break f}}f=0;g=H[a+216>>2];if((g|0)==H[a+220>>2]){break e}while(1){g=N(f,144)+g|0;d=H[g+136>>2];c=H[g+140>>2];g:{if(d>>>0>>0){H[d>>2]=j;H[g+136>>2]=d+4;break g}e=d;d=H[g+132>>2];k=e-d|0;e=k>>2;h=e+1|0;if(h>>>0>=1073741824){break d}m=e<<2;c=c-d|0;e=c>>>1|0;h=c>>>0>=2147483644?1073741823:h>>>0>>0?e:h;if(h){if(h>>>0>=1073741824){break c}c=pa(h<<2)}else{c=0}e=m+c|0;H[e>>2]=j;c=va(c,d,k);H[g+132>>2]=c;H[g+136>>2]=e+4;H[g+140>>2]=c+(h<<2);if(!d){break g}oa(d)}f=f+1|0;g=H[a+216>>2];if(f>>>0<(H[a+220>>2]-g|0)/144>>>0){continue}break}break e}if((b|0)==-1|(f>>>0)/3>>>0>>0){break e}f=0;if(H[a+220>>2]==H[a+216>>2]){break e}while(1){h:{if(!Ba(H[a+368>>2]+(f<<4)|0)){break h}g=H[a+216>>2]+N(f,144)|0;d=H[g+136>>2];c=H[g+140>>2];if(d>>>0>>0){H[d>>2]=j;H[g+136>>2]=d+4;break h}e=d;d=H[g+132>>2];k=e-d|0;e=k>>2;h=e+1|0;if(h>>>0>=1073741824){break b}m=e<<2;c=c-d|0;e=c>>>1|0;h=c>>>0>=2147483644?1073741823:h>>>0>>0?e:h;if(h){if(h>>>0>=1073741824){break c}c=pa(h<<2)}else{c=0}e=m+c|0;H[e>>2]=j;c=va(c,d,k);H[g+132>>2]=c;H[g+136>>2]=e+4;H[g+140>>2]=c+(h<<2);if(!d){break h}oa(d)}f=f+1|0;if(f>>>0<(H[a+220>>2]-H[a+216>>2]|0)/144>>>0){continue}break}}l=l+1|0;if((l|0)!=3){continue}break}ca=i+16|0;return 1}sa();v()}wa();v()}sa();v()}function cd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=ca-16|0;ca=h;H[h>>2]=b;c=-1;a:{if((b|0)==-1){H[h+4>>2]=-1;break a}c=b+1|0;H[h+4>>2]=(c>>>0)%3|0?c:b-2|0;if((b>>>0)%3|0){c=b-1|0;break a}c=b+2|0}H[h+8>>2]=c;b:{c:{while(1){i=H[(k<<2)+h>>2];d:{if(!((i|0)==-1|H[H[H[a+8>>2]+12>>2]+(i<<2)>>2]==-1)){b=0;if(H[a+220>>2]==H[a+216>>2]){break d}while(1){e:{f:{if(!Ba(H[a+368>>2]+(b<<4)|0)){break f}c=H[a+216>>2]+N(b,144)|0;e=H[c+136>>2];d=H[c+140>>2];if(e>>>0>>0){H[e>>2]=i;H[c+136>>2]=e+4;break f}f=e;e=H[c+132>>2];j=f-e|0;f=j>>2;g=f+1|0;if(g>>>0>=1073741824){break e}l=f<<2;d=d-e|0;f=d>>>1|0;g=d>>>0>=2147483644?1073741823:g>>>0>>0?f:g;if(g){if(g>>>0>=1073741824){break b}d=pa(g<<2)}else{d=0}f=l+d|0;H[f>>2]=i;d=va(d,e,j);H[c+132>>2]=d;H[c+136>>2]=f+4;H[c+140>>2]=d+(g<<2);if(!e){break f}oa(e)}b=b+1|0;if(b>>>0<(H[a+220>>2]-H[a+216>>2]|0)/144>>>0){continue}break d}break}sa();v()}b=0;c=H[a+216>>2];if((c|0)==H[a+220>>2]){break d}while(1){c=N(b,144)+c|0;e=H[c+136>>2];d=H[c+140>>2];g:{if(e>>>0>>0){H[e>>2]=i;H[c+136>>2]=e+4;break g}f=e;e=H[c+132>>2];j=f-e|0;f=j>>2;g=f+1|0;if(g>>>0>=1073741824){break c}l=f<<2;d=d-e|0;f=d>>>1|0;g=d>>>0>=2147483644?1073741823:g>>>0>>0?f:g;if(g){if(g>>>0>=1073741824){break b}d=pa(g<<2)}else{d=0}f=l+d|0;H[f>>2]=i;d=va(d,e,j);H[c+132>>2]=d;H[c+136>>2]=f+4;H[c+140>>2]=d+(g<<2);if(!e){break g}oa(e)}b=b+1|0;c=H[a+216>>2];if(b>>>0<(H[a+220>>2]-c|0)/144>>>0){continue}break}}k=k+1|0;if((k|0)!=3){continue}break}ca=h+16|0;return 1}sa();v()}wa();v()}function vg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=ca-16|0;ca=m;l=H[b+80>>2];e=I[c+24|0];a=N(l,e);a:{b:{c:{d:{b=H[c+28>>2];if(!(!I[c+84|0]|(b|0)!=1&(b|0)!=2)){b=H[c+48>>2];c=H[H[c>>2]>>2];H[m+8>>2]=0;H[m>>2]=0;H[m+4>>2]=0;if(a){if((a|0)<0){break d}f=pa(a);h=qa(f,b+c|0,a)+a|0}a=H[d>>2];if(a){H[d+4>>2]=a;oa(a)}H[d+8>>2]=h;H[d+4>>2]=h;H[d>>2]=f;b=1;break a}if(e){f=pa(e);ra(f,0,e)}e:{i=H[d+4>>2];b=H[d>>2];g=i-b|0;f:{if(g>>>0>>0){k=a-g|0;j=H[d+8>>2];if(k>>>0<=j-i>>>0){n=d,o=ra(i,0,k)+k|0,H[n+4>>2]=o;break f}if((a|0)<0){break e}i=j-b|0;j=i<<1;i=i>>>0>=1073741823?2147483647:a>>>0>>0?j:a;j=pa(i);ra(j+g|0,0,k);g=va(j,b,g);H[d+8>>2]=g+i;H[d+4>>2]=a+g;H[d>>2]=g;if(!b){break f}oa(b);break f}if(a>>>0>=g>>>0){break f}H[d+4>>2]=a+b}if(!l){b=1;break c}if(!e){b=0;a=0;while(1){if(!ic(c,I[c+84|0]?a:H[H[c+68>>2]+(a<<2)>>2],F[c+24|0],f)){break c}a=a+1|0;b=l>>>0<=a>>>0;if((a|0)!=(l|0)){continue}break}break c}i=e&252;g=e&3;b=0;j=e>>>0<4;e=0;while(1){if(!ic(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],f)){break c}b=0;a=0;k=0;if(!j){while(1){F[H[d>>2]+h|0]=I[a+f|0];F[(H[d>>2]+h|0)+1|0]=I[(a|1)+f|0];F[(H[d>>2]+h|0)+2|0]=I[(a|2)+f|0];F[(H[d>>2]+h|0)+3|0]=I[(a|3)+f|0];a=a+4|0;h=h+4|0;k=k+4|0;if((i|0)!=(k|0)){continue}break}}if(g){while(1){F[H[d>>2]+h|0]=I[a+f|0];a=a+1|0;h=h+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}e=e+1|0;b=l>>>0<=e>>>0;if((e|0)!=(l|0)){continue}break}break b}sa();v()}sa();v()}if(!f){break a}}oa(f)}ca=m+16|0;return b&1}function ug(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=ca-16|0;ca=m;l=H[b+80>>2];e=I[c+24|0];a=N(l,e);a:{b:{c:{d:{b=H[c+28>>2];if(!(!I[c+84|0]|(b|0)!=1&(b|0)!=2)){b=H[c+48>>2];c=H[H[c>>2]>>2];H[m+8>>2]=0;H[m>>2]=0;H[m+4>>2]=0;if(a){if((a|0)<0){break d}f=pa(a);h=qa(f,b+c|0,a)+a|0}a=H[d>>2];if(a){H[d+4>>2]=a;oa(a)}H[d+8>>2]=h;H[d+4>>2]=h;H[d>>2]=f;b=1;break a}if(e){f=pa(e);ra(f,0,e)}e:{i=H[d+4>>2];b=H[d>>2];g=i-b|0;f:{if(g>>>0>>0){k=a-g|0;j=H[d+8>>2];if(k>>>0<=j-i>>>0){n=d,o=ra(i,0,k)+k|0,H[n+4>>2]=o;break f}if((a|0)<0){break e}i=j-b|0;j=i<<1;i=i>>>0>=1073741823?2147483647:a>>>0>>0?j:a;j=pa(i);ra(j+g|0,0,k);g=va(j,b,g);H[d+8>>2]=g+i;H[d+4>>2]=a+g;H[d>>2]=g;if(!b){break f}oa(b);break f}if(a>>>0>=g>>>0){break f}H[d+4>>2]=a+b}if(!l){b=1;break c}if(!e){b=0;a=0;while(1){if(!hc(c,I[c+84|0]?a:H[H[c+68>>2]+(a<<2)>>2],F[c+24|0],f)){break c}a=a+1|0;b=l>>>0<=a>>>0;if((a|0)!=(l|0)){continue}break}break c}i=e&252;g=e&3;b=0;j=e>>>0<4;e=0;while(1){if(!hc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],f)){break c}b=0;a=0;k=0;if(!j){while(1){F[H[d>>2]+h|0]=I[a+f|0];F[(H[d>>2]+h|0)+1|0]=I[(a|1)+f|0];F[(H[d>>2]+h|0)+2|0]=I[(a|2)+f|0];F[(H[d>>2]+h|0)+3|0]=I[(a|3)+f|0];a=a+4|0;h=h+4|0;k=k+4|0;if((i|0)!=(k|0)){continue}break}}if(g){while(1){F[H[d>>2]+h|0]=I[a+f|0];a=a+1|0;h=h+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}e=e+1|0;b=l>>>0<=e>>>0;if((e|0)!=(l|0)){continue}break}break b}sa();v()}sa();v()}if(!f){break a}}oa(f)}ca=m+16|0;return b&1}function qc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=H[b+16>>2];h=H[c+4>>2]-k|0;e=H[c>>2]-k|0;H[c>>2]=e;f=h;H[c+4>>2]=f;l=H[b+16>>2];f=f>>31;g=(h^f)-f|0;f=e>>31;m=l>>>0>=g+((f^e)-f|0)>>>0;a:{if(m){f=h;break a}b:{c:{if((e|0)>=0){g=1;j=1;if((h|0)>=0){break b}i=1;g=-1;j=-1;if(e){break c}break b}i=-1;g=-1;j=-1;if((h|0)<=0){break b}}g=(h|0)<=0?-1:1;j=i}n=N(j,l);f=(e<<1)-n|0;i=(N(g,j)|0)>=0;e=N(g,l);f=((i?0-f|0:f)+e|0)/2|0;H[c+4>>2]=f;e=(h<<1)-e|0;e=((i?0-e|0:e)+n|0)/2|0;H[c>>2]=e}d:{e:{f:{g:{h:{i:{j:{if(e){if((e|0)<0){break j}if((f|0)>=0){break i}break f}if(f){break h}j=1;g=0;f=0;i=0;break d}j=1;if((f|0)>0){break g}i=(f|0)>0?3:0;g=f;f=e;break d}g=0-f|0;f=0-e|0;i=2;break e}if((f|0)<=0){break f}}f=0-f|0;g=e;i=3;break e}g=0-e|0;i=1}H[c>>2]=f;H[c+4>>2]=g;j=0}e=H[d>>2]+f|0;h=H[b+16>>2];k:{if((e|0)>(h|0)){e=e-H[b+4>>2]|0;break k}if((0-h|0)<=(e|0)){break k}e=H[b+4>>2]+e|0}c=H[d+4>>2]+g|0;l:{if((h|0)<(c|0)){c=c-H[b+4>>2]|0;break l}if((0-h|0)<=(c|0)){break l}c=H[b+4>>2]+c|0}m:{if(j){b=c;break m}b=c;n:{o:{p:{d=4-i|0;switch((d>>>0<4?d:0-i|0)-1|0){case 2:break n;case 1:break o;case 0:break p;default:break m}}b=0-e|0;e=c;break m}b=0-c|0;e=0-e|0;break m}b=e;e=0-c|0}q:{if(m){c=b;break q}r:{s:{if((e|0)>=0){c=1;f=1;if((b|0)>=0){break r}d=1;c=-1;f=-1;if(e){break s}break r}d=-1;c=-1;f=-1;if((b|0)<=0){break r}}c=(b|0)<=0?-1:1;f=d}d=e<<1;e=N(f,h);d=d-e|0;f=(N(c,f)|0)>=0;g=f?0-d|0:d;d=N(c,h);c=(g+d|0)/2|0;b=(b<<1)-d|0;e=(e+(f?0-b|0:b)|0)/2|0}b=a;H[b>>2]=e+k;H[b+4>>2]=c+k}function Cj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=ca-32|0;ca=j;H[j+28>>2]=0;a:{b:{if(J[b+38>>1]<=513){c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;h=H[b+12>>2];if(K[b+8>>2]>>0&(h|0)<=(c|0)|(c|0)>(h|0)){break a}d=d+H[b>>2]|0;f=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;break b}if(!Xa(1,j+28|0,b)){break a}f=H[j+28>>2]}if(!f){break a}c=H[H[a+48>>2]+64>>2];if(H[c+4>>2]-H[c>>2]>>2>>>0>>0){break a}Wa(a+76|0,f);c=j+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c:{if(!ta(c,b)){break c}h=1;while(1){d=1<>2]+(i>>>3&536870908)|0;e=e^h;if(e&1){d=H[g>>2]&(d^-1)}else{d=d|H[g>>2]}h=e^1;H[g>>2]=d;i=i+1|0;if((f|0)!=(i|0)){continue}break}c=H[b+8>>2];e=H[b+12>>2];g=e;e=H[b+20>>2];h=e;f=H[b+16>>2];d=f+4|0;e=d>>>0<4?e+1|0:e;i=d;if(d>>>0>c>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break c}l=H[b>>2];d=l+f|0;k=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=i;H[b+20>>2]=e;d=c;c=h;e=f+8|0;c=e>>>0<8?c+1|0:c;if(d>>>0>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}d=i+l|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;if((d|0)<(k|0)){break c}H[a+16>>2]=d;H[a+12>>2]=k;c=(d>>31)-((k>>31)+(d>>>0>>0)|0)|0;b=d-k|0;if(!c&b>>>0>2147483646|c){break c}m=1;c=b+1|0;H[a+20>>2]=c;b=c>>>1|0;H[a+24>>2]=b;H[a+28>>2]=0-b;if(c&1){break c}H[a+24>>2]=b-1}}ca=j+32|0;return m|0}function lj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=ca-32|0;ca=j;H[j+28>>2]=0;a:{b:{if(J[b+38>>1]<=513){c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;h=H[b+12>>2];if(K[b+8>>2]>>0&(h|0)<=(c|0)|(c|0)>(h|0)){break a}d=d+H[b>>2]|0;f=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;break b}if(!Xa(1,j+28|0,b)){break a}f=H[j+28>>2]}if(!f){break a}c=H[a+48>>2];if(H[c+4>>2]-H[c>>2]>>2>>>0>>0){break a}Wa(a+76|0,f);c=j+8|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;c:{if(!ta(c,b)){break c}h=1;while(1){d=1<>2]+(i>>>3&536870908)|0;e=e^h;if(e&1){d=H[g>>2]&(d^-1)}else{d=d|H[g>>2]}h=e^1;H[g>>2]=d;i=i+1|0;if((f|0)!=(i|0)){continue}break}c=H[b+8>>2];e=H[b+12>>2];g=e;e=H[b+20>>2];h=e;f=H[b+16>>2];d=f+4|0;e=d>>>0<4?e+1|0:e;i=d;if(d>>>0>c>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break c}l=H[b>>2];d=l+f|0;k=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=i;H[b+20>>2]=e;d=c;c=h;e=f+8|0;c=e>>>0<8?c+1|0:c;if(d>>>0>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break c}d=i+l|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;if((d|0)<(k|0)){break c}H[a+16>>2]=d;H[a+12>>2]=k;c=(d>>31)-((k>>31)+(d>>>0>>0)|0)|0;b=d-k|0;if(!c&b>>>0>2147483646|c){break c}m=1;c=b+1|0;H[a+20>>2]=c;b=c>>>1|0;H[a+24>>2]=b;H[a+28>>2]=0-b;if(c&1){break c}H[a+24>>2]=b-1}}ca=j+32|0;return m|0}function cj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;H[a+8>>2]=e;m=a+32|0;h=H[m>>2];g=H[a+36>>2]-h>>2;a:{if(g>>>0>>0){ya(m,e-g|0);f=H[a+8>>2];break a}f=e;if(f>>>0>=g>>>0){break a}H[a+36>>2]=h+(e<<2);f=e}g=e>>>0>1073741823?-1:e<<2;n=ra(pa(g),0,g);b:{if((f|0)<=0){break b}h=H[a+32>>2];while(1){f=i<<2;g=H[f+n>>2];j=H[a+16>>2];c:{if((g|0)>(j|0)){H[f+h>>2]=j;break c}f=f+h|0;j=H[a+12>>2];if((j|0)>(g|0)){H[f>>2]=j;break c}H[f>>2]=g}f=H[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}if((f|0)<=0){break b}i=0;while(1){g=i<<2;f=g+c|0;g=H[b+g>>2]+H[g+h>>2]|0;H[f>>2]=g;d:{if((g|0)>H[a+16>>2]){g=g-H[a+20>>2]|0}else{if((g|0)>=H[a+12>>2]){break d}g=g+H[a+20>>2]|0}H[f>>2]=g}f=H[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}}if(!((d|0)<=(e|0)|(f|0)<=0)){p=0-e<<2;g=e;while(1){e:{if((f|0)<=0){break e}l=g<<2;o=l+c|0;q=o+p|0;j=H[m>>2];i=0;while(1){f=i<<2;h=H[f+q>>2];k=H[a+16>>2];f:{if((h|0)>(k|0)){H[f+j>>2]=k;break f}f=f+j|0;k=H[a+12>>2];if((k|0)>(h|0)){H[f>>2]=k;break f}H[f>>2]=h}f=H[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}i=0;if((f|0)<=0){break e}l=b+l|0;while(1){h=i<<2;f=h+o|0;h=H[h+l>>2]+H[h+j>>2]|0;H[f>>2]=h;g:{if((h|0)>H[a+16>>2]){h=h-H[a+20>>2]|0}else{if((h|0)>=H[a+12>>2]){break g}h=h+H[a+20>>2]|0}H[f>>2]=h}f=H[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}}g=e+g|0;if((g|0)<(d|0)){continue}break}}oa(n);return 1}function De(a,b){var c=0,d=0,e=0,f=0,g=0;d=-1;f=-1;a:{if((b|0)==-1){break a}c=b+1|0;d=(c>>>0)%3|0?c:b-2|0;f=b-1|0;if((b>>>0)%3|0){break a}f=b+2|0}b:{c:{d:{e:{f:{g:{e=H[a+184>>2];switch(e|0){case 7:break d;case 3:break e;case 5:break f;case 0:case 1:break g;default:break b}}g=H[a+148>>2];c=-1;e=1;d=((d|0)!=-1?H[H[g>>2]+(d<<2)>>2]:c)<<2;c=H[a+156>>2];d=d+c|0;H[d>>2]=H[d>>2]+1;c=(((f|0)==-1?-1:H[H[g>>2]+(f<<2)>>2])<<2)+c|0;break c}g=H[a+148>>2];c=H[a+156>>2];e=c+(((b|0)==-1?-1:H[H[g>>2]+(b<<2)>>2])<<2)|0;H[e>>2]=H[e>>2]+1;d=(((d|0)==-1?-1:H[H[g>>2]+(d<<2)>>2])<<2)+c|0;H[d>>2]=H[d>>2]+1;e=2;c=(((f|0)==-1?-1:H[H[g>>2]+(f<<2)>>2])<<2)+c|0;break c}g=H[a+148>>2];c=H[a+156>>2];e=c+(((b|0)==-1?-1:H[H[g>>2]+(b<<2)>>2])<<2)|0;H[e>>2]=H[e>>2]+1;d=(((d|0)==-1?-1:H[H[g>>2]+(d<<2)>>2])<<2)+c|0;H[d>>2]=H[d>>2]+2;e=1;c=(((f|0)==-1?-1:H[H[g>>2]+(f<<2)>>2])<<2)+c|0;break c}g=H[a+148>>2];c=H[a+156>>2];e=c+(((b|0)==-1?-1:H[H[g>>2]+(b<<2)>>2])<<2)|0;H[e>>2]=H[e>>2]+2;d=(((d|0)==-1?-1:H[H[g>>2]+(d<<2)>>2])<<2)+c|0;H[d>>2]=H[d>>2]+2;e=2;c=(((f|0)==-1?-1:H[H[g>>2]+(f<<2)>>2])<<2)+c|0}H[c>>2]=H[c>>2]+e;e=H[a+184>>2]}h:{switch(e|0){case 0:case 5:f=H[a+156>>2];c=-1;i:{if((b|0)==-1){break i}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;c=-1;if((b|0)==-1){break i}c=H[H[H[a+148>>2]>>2]+(b<<2)>>2]}if(H[f+(c<<2)>>2]<=5){H[a+188>>2]=5;return}H[a+188>>2]=0;return;default:break h}}H[a+188>>2]=-1}function xg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=H[b+80>>2];b=I[c+24|0];g=N(j,b);a:{if(!b){break a}h=b<<2;f=pa(h);a=f;k=b&7;if(k){while(1){H[a>>2]=-1073741824;a=a+4|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}}if((b-1&1073741823)>>>0<7){break a}e=f+h|0;while(1){H[a+24>>2]=-1073741824;H[a+28>>2]=-1073741824;H[a+16>>2]=-1073741824;H[a+20>>2]=-1073741824;H[a+8>>2]=-1073741824;H[a+12>>2]=-1073741824;H[a>>2]=-1073741824;H[a+4>>2]=-1073741824;a=a+32|0;if((e|0)!=(a|0)){continue}break}}e=H[d>>2];a=H[d+4>>2]-e>>2;b:{if(a>>>0>>0){ya(d,g-a|0);break b}if(a>>>0<=g>>>0){break b}H[d+4>>2]=e+(g<<2)}c:{d:{e:{if(!j){i=1;break e}if(!b){a=0;while(1){if(!Va(c,I[c+84|0]?a:H[H[c+68>>2]+(a<<2)>>2],F[c+24|0],f)){break e}a=a+1|0;i=j>>>0<=a>>>0;if((a|0)!=(j|0)){continue}break}break e}n=b&252;k=b&3;o=b>>>0<4;e=0;b=0;while(1){if(!Va(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],f)){break e}m=H[d>>2];i=0;a=0;l=0;if(!o){while(1){g=(e<<2)+m|0;h=a<<2;L[g>>2]=L[h+f>>2];L[g+4>>2]=L[(h|4)+f>>2];L[g+8>>2]=L[(h|8)+f>>2];L[g+12>>2]=L[(h|12)+f>>2];a=a+4|0;e=e+4|0;l=l+4|0;if((n|0)!=(l|0)){continue}break}}if(k){while(1){L[(e<<2)+m>>2]=L[(a<<2)+f>>2];a=a+1|0;e=e+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}b=b+1|0;i=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break d}if(!f){break c}}oa(f)}return i|0}function mf(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=ca-16|0;ca=e;h=1;i=ea[H[H[a>>2]+24>>2]](a)|0;a:{if((i|0)<=0){break a}l=a+48|0;h=0;while(1){b:{c:{if(!H[(ea[H[H[a>>2]+28>>2]](a)|0)+40>>2]){break c}j=f<<2;g=H[j+H[a+36>>2]>>2];b=H[g+8>>2];k=rb(g);if(!k){break c}g=H[(ea[H[H[a>>2]+28>>2]](a)|0)+40>>2];H[e+12>>2]=H[b+56>>2];b=pa(32);H[e>>2]=b;H[e+4>>2]=24;H[e+8>>2]=-2147483616;c=I[1206]|I[1207]<<8|(I[1208]<<16|I[1209]<<24);d=I[1202]|I[1203]<<8|(I[1204]<<16|I[1205]<<24);F[b+16|0]=d;F[b+17|0]=d>>>8;F[b+18|0]=d>>>16;F[b+19|0]=d>>>24;F[b+20|0]=c;F[b+21|0]=c>>>8;F[b+22|0]=c>>>16;F[b+23|0]=c>>>24;c=I[1198]|I[1199]<<8|(I[1200]<<16|I[1201]<<24);d=I[1194]|I[1195]<<8|(I[1196]<<16|I[1197]<<24);F[b+8|0]=d;F[b+9|0]=d>>>8;F[b+10|0]=d>>>16;F[b+11|0]=d>>>24;F[b+12|0]=c;F[b+13|0]=c>>>8;F[b+14|0]=c>>>16;F[b+15|0]=c>>>24;c=I[1190]|I[1191]<<8|(I[1192]<<16|I[1193]<<24);d=I[1186]|I[1187]<<8|(I[1188]<<16|I[1189]<<24);F[b|0]=d;F[b+1|0]=d>>>8;F[b+2|0]=d>>>16;F[b+3|0]=d>>>24;F[b+4|0]=c;F[b+5|0]=c>>>8;F[b+6|0]=c>>>16;F[b+7|0]=c>>>24;F[b+24|0]=0;b=sd(g,e+12|0,e);if(F[e+11|0]<0){oa(H[e>>2])}if(!b){break c}oe(H[H[H[a+36>>2]+j>>2]+8>>2],k);break b}b=H[H[a+36>>2]+(f<<2)>>2];if(!(ea[H[H[b>>2]+24>>2]](b,l)|0)){break a}}f=f+1|0;h=(i|0)<=(f|0);if((f|0)!=(i|0)){continue}break}}ca=e+16|0;return h|0}function Ye(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=ca-16|0;ca=k;c=H[b+20>>2];d=H[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;g=H[b+12>>2];a:{if(K[b+8>>2]>>0&(g|0)<=(c|0)|(c|0)>(g|0)){break a}d=d+H[b>>2]|0;h=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;if((h|0)<0){break a}Wa(a+76|0,h);c=k;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;b:{if(!ta(c,b)){break b}if(h){g=1;while(1){d=1<>2]+(i>>>3&536870908)|0;e=e^g;if(e&1){d=H[f>>2]&(d^-1)}else{d=d|H[f>>2]}g=e^1;H[f>>2]=d;i=i+1|0;if((h|0)!=(i|0)){continue}break}}i=0;c=H[b+8>>2];e=H[b+12>>2];f=e;e=H[b+20>>2];g=e;l=H[b+16>>2];d=l+4|0;e=d>>>0<4?e+1|0:e;h=d;if(d>>>0>c>>>0&(e|0)>=(f|0)|(e|0)>(f|0)){break b}m=H[b>>2];d=m+l|0;j=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=h;H[b+20>>2]=e;d=c;c=g;e=l+8|0;c=e>>>0<8?c+1|0:c;if(d>>>0>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break b}d=h+m|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;if((d|0)<(j|0)){break b}H[a+16>>2]=d;H[a+12>>2]=j;c=(d>>31)-((j>>31)+(d>>>0>>0)|0)|0;b=d-j|0;if(!c&b>>>0>2147483646|c){break b}i=1;c=b+1|0;H[a+20>>2]=c;b=c>>>1|0;H[a+24>>2]=b;H[a+28>>2]=0-b;if(c&1){break b}H[a+24>>2]=b-1}}ca=k+16|0;return i|0}function rg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=ca-16|0;ca=k;j=H[b+80>>2];e=I[c+24|0];b=N(j,e);a:{b:{c:{d:{f=H[c+28>>2];if(!(!I[c+84|0]|(f|0)!=5&(f|0)!=6)){e=H[c+48>>2];c=H[H[c>>2]>>2];H[k+8>>2]=0;H[k>>2]=0;H[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<2;a=pa(b);g=qa(a,c+e|0,b)+b|0}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=a;h=1;break a}if(e){f=e<<2;a=pa(f);ra(a,0,f)}i=H[d>>2];f=H[d+4>>2]-i>>2;e:{if(f>>>0>>0){ya(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}H[d+4>>2]=i+(b<<2)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!dc(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!dc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break c}n=H[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<2)+n|0;i=b<<2;H[f>>2]=H[i+a>>2];H[f+4>>2]=H[(i|4)+a>>2];H[f+8>>2]=H[(i|8)+a>>2];H[f+12>>2]=H[(i|12)+a>>2];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){H[(g<<2)+n>>2]=H[(b<<2)+a>>2];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}sa();v()}if(!a){break a}}oa(a)}ca=k+16|0;return h|0}function ge(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=ca-16|0;ca=k;j=H[b+80>>2];e=I[c+24|0];b=N(j,e);a:{b:{c:{d:{f=H[c+28>>2];if(!(!I[c+84|0]|(f|0)!=5&(f|0)!=6)){e=H[c+48>>2];c=H[H[c>>2]>>2];H[k+8>>2]=0;H[k>>2]=0;H[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<2;a=pa(b);g=qa(a,c+e|0,b)+b|0}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=a;h=1;break a}if(e){f=e<<2;a=pa(f);ra(a,0,f)}i=H[d>>2];f=H[d+4>>2]-i>>2;e:{if(f>>>0>>0){ya(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}H[d+4>>2]=i+(b<<2)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!ec(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!ec(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break c}n=H[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<2)+n|0;i=b<<2;H[f>>2]=H[i+a>>2];H[f+4>>2]=H[(i|4)+a>>2];H[f+8>>2]=H[(i|8)+a>>2];H[f+12>>2]=H[(i|12)+a>>2];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){H[(g<<2)+n>>2]=H[(b<<2)+a>>2];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}sa();v()}if(!a){break a}}oa(a)}ca=k+16|0;return h|0}function tg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=ca-16|0;ca=k;j=H[b+80>>2];e=I[c+24|0];b=N(j,e);a:{b:{c:{d:{f=H[c+28>>2];if(!(!I[c+84|0]|(f|0)!=3&(f|0)!=4)){e=H[c+48>>2];c=H[H[c>>2]>>2];H[k+8>>2]=0;H[k>>2]=0;H[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<1;a=pa(b);g=qa(a,c+e|0,b)+b|0}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=a;h=1;break a}if(e){f=e<<1;a=pa(f);ra(a,0,f)}i=H[d>>2];f=H[d+4>>2]-i>>1;e:{if(f>>>0>>0){qe(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}H[d+4>>2]=i+(b<<1)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!gc(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!gc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break c}n=H[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<1)+n|0;i=b<<1;G[f>>1]=J[i+a>>1];G[f+2>>1]=J[(i|2)+a>>1];G[f+4>>1]=J[(i|4)+a>>1];G[f+6>>1]=J[(i|6)+a>>1];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){G[(g<<1)+n>>1]=J[(b<<1)+a>>1];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}sa();v()}if(!a){break a}}oa(a)}ca=k+16|0;return h|0}function sg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=ca-16|0;ca=k;j=H[b+80>>2];e=I[c+24|0];b=N(j,e);a:{b:{c:{d:{f=H[c+28>>2];if(!(!I[c+84|0]|(f|0)!=3&(f|0)!=4)){e=H[c+48>>2];c=H[H[c>>2]>>2];H[k+8>>2]=0;H[k>>2]=0;H[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<1;a=pa(b);g=qa(a,c+e|0,b)+b|0}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=a;h=1;break a}if(e){f=e<<1;a=pa(f);ra(a,0,f)}i=H[d>>2];f=H[d+4>>2]-i>>1;e:{if(f>>>0>>0){qe(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}H[d+4>>2]=i+(b<<1)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!fc(c,I[c+84|0]?b:H[H[c+68>>2]+(b<<2)>>2],F[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!fc(c,I[c+84|0]?e:H[H[c+68>>2]+(e<<2)>>2],F[c+24|0],a)){break c}n=H[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<1)+n|0;i=b<<1;G[f>>1]=J[i+a>>1];G[f+2>>1]=J[(i|2)+a>>1];G[f+4>>1]=J[(i|4)+a>>1];G[f+6>>1]=J[(i|6)+a>>1];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){G[(g<<1)+n>>1]=J[(b<<1)+a>>1];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}sa();v()}if(!a){break a}}oa(a)}ca=k+16|0;return h|0}function Ce(a,b){var c=0,d=0,e=0,f=0,g=0;f=-1;d=-1;a:{if((b|0)==-1){break a}d=b+1|0;f=(d>>>0)%3|0?d:b-2|0;d=b-1|0;if((b>>>0)%3|0){break a}d=b+2|0}b:{c:{d:{switch(H[a+168>>2]){case 0:case 1:e=H[a+148>>2];c=1;b=H[a+156>>2];g=b+(((f|0)==-1?-1:H[H[e>>2]+(f<<2)>>2])<<2)|0;H[g>>2]=H[g>>2]+1;b=(((d|0)==-1?-1:H[H[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 5:e=H[a+148>>2];c=-1;c=((b|0)!=-1?H[H[e>>2]+(b<<2)>>2]:c)<<2;b=H[a+156>>2];c=c+b|0;H[c>>2]=H[c>>2]+1;c=(((f|0)==-1?-1:H[H[e>>2]+(f<<2)>>2])<<2)+b|0;H[c>>2]=H[c>>2]+1;c=2;b=(((d|0)==-1?-1:H[H[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 3:e=H[a+148>>2];c=-1;c=((b|0)!=-1?H[H[e>>2]+(b<<2)>>2]:c)<<2;b=H[a+156>>2];c=c+b|0;H[c>>2]=H[c>>2]+1;c=(((f|0)==-1?-1:H[H[e>>2]+(f<<2)>>2])<<2)+b|0;H[c>>2]=H[c>>2]+2;c=1;b=(((d|0)==-1?-1:H[H[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 7:break d;default:break b}}e=H[a+148>>2];c=-1;c=((b|0)!=-1?H[H[e>>2]+(b<<2)>>2]:c)<<2;b=H[a+156>>2];c=c+b|0;H[c>>2]=H[c>>2]+2;c=(((f|0)==-1?-1:H[H[e>>2]+(f<<2)>>2])<<2)+b|0;H[c>>2]=H[c>>2]+2;c=2;b=(((d|0)==-1?-1:H[H[e>>2]+(d<<2)>>2])<<2)+b|0}H[b>>2]=H[b>>2]+c}c=a;b=H[H[a+156>>2]+(((f|0)==-1?-1:H[H[H[a+148>>2]>>2]+(f<<2)>>2])<<2)>>2];d=H[a+180>>2];a=H[a+176>>2];H[c+172>>2]=(a|0)<=(b|0)?((b|0)<(d|0)?b:d)-a|0:0}function Ac(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;H[a+24>>2]=0;f=H[b+4>>2];g=H[b>>2];e=f-g|0;c=(e|0)/20|0;a:{if((f|0)==(g|0)){break a}b:{if(c>>>0<214748365){f=pa(e);H[a+20>>2]=f;H[a+16>>2]=f;H[a+24>>2]=f+N(c,20);c=H[b>>2];g=H[b+4>>2];if((c|0)==(g|0)){break a}b=f;while(1){e=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=e;H[b+16>>2]=H[c+16>>2];e=H[c+12>>2];H[b+8>>2]=H[c+8>>2];H[b+12>>2]=e;b=b+20|0;c=c+20|0;if((g|0)!=(c|0)){continue}break}g=0;H[a+28>>2]=0;H[a+20>>2]=b;if((b|0)!=(f|0)){b=(b-f|0)/20|0;e=b>>>0<=1?1:b;h=e&3;b=0;c=0;if(e-1>>>0>=3){i=e&-4;e=0;while(1){d=f+N(b,20)|0;d=N(H[d+16>>2],H[d+12>>2]);c=c>>>0>d>>>0?c:d;d=f+N(b|1,20)|0;d=N(H[d+16>>2],H[d+12>>2]);c=c>>>0>d>>>0?c:d;d=f+N(b|2,20)|0;d=N(H[d+16>>2],H[d+12>>2]);c=c>>>0>d>>>0?c:d;d=f+N(b|3,20)|0;d=N(H[d+16>>2],H[d+12>>2]);c=c>>>0>d>>>0?c:d;b=b+4|0;e=e+4|0;if((i|0)!=(e|0)){continue}break}}if(h){while(1){e=f+N(b,20)|0;e=N(H[e+16>>2],H[e+12>>2]);c=c>>>0>e>>>0?c:e;b=b+1|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}}if(!c){H[a+12>>2]=0;return a}if((c|0)<0){break b}g=pa(c);b=ra(g,0,c);f=b+c|0;H[a+8>>2]=f;H[a+4>>2]=f;H[a>>2]=b}H[a+12>>2]=g;return a}sa();v()}sa();v()}H[a+28>>2]=0;H[a+12>>2]=0;return a}function Dh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b=H[a+32>>2];f=H[b+8>>2];h=H[b+12>>2];g=H[b+20>>2];c=H[b+16>>2];e=0;b:{if((h|0)<=(g|0)&c>>>0>=f>>>0|(g|0)>(h|0)){break b}f=I[H[b>>2]+c|0];e=b;b=g;c=c+1|0;b=c?b:b+1|0;H[e+16>>2]=c;H[e+20>>2]=b;c:{if(!f){break c}while(1){if(ea[H[H[a>>2]+16>>2]](a,d)|0){d=d+1|0;if((f|0)!=(d|0)){continue}break c}break}return 0}d=H[a+8>>2];b=H[a+12>>2];if((d|0)!=(b|0)){while(1){c=H[d>>2];if(!(ea[H[H[c>>2]+8>>2]](c,a,H[a+4>>2])|0)){break a}d=d+4|0;if((b|0)!=(d|0)){continue}break}}d:{if(!f){break d}d=0;while(1){b=H[H[a+8>>2]+(d<<2)>>2];if(!(ea[H[H[b>>2]+12>>2]](b,H[a+32>>2])|0)){break a}d=d+1|0;if((f|0)!=(d|0)){continue}break}if(!f){break d}i=a+20|0;b=0;while(1){d=0;j=b<<2;c=H[j+H[a+8>>2]>>2];k=ea[H[H[c>>2]+24>>2]](c)|0;if((k|0)>0){while(1){c=H[H[a+8>>2]+j>>2];c=ea[H[H[c>>2]+20>>2]](c,d)|0;e=H[a+20>>2];g=H[a+24>>2]-e>>2;e:{if(c>>>0>>0){break e}h=c+1|0;if(h>>>0>g>>>0){ya(i,h-g|0);e=H[i>>2];break e}if(g>>>0<=h>>>0){break e}H[a+24>>2]=(h<<2)+e}H[(c<<2)+e>>2]=b;d=d+1|0;if((k|0)!=(d|0)){continue}break}}b=b+1|0;if((f|0)!=(b|0)){continue}break}}e=0;if(!(ea[H[H[a>>2]+28>>2]](a)|0)){break b}e=ea[H[H[a>>2]+32>>2]](a)|0}return e|0}return 0}function ta(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=ca-16|0;ca=i;f=H[b+20>>2];d=H[b+12>>2];c=H[b+16>>2];a:{if((f|0)>=(d|0)&c>>>0>=K[b+8>>2]|(d|0)<(f|0)){break a}F[a+12|0]=I[c+H[b>>2]|0];c=H[b+20>>2];g=c;f=H[b+16>>2];e=f+1|0;c=e?c:c+1|0;H[b+16>>2]=e;H[b+20>>2]=c;b:{if(J[b+38>>1]<=513){d=H[b+8>>2];c=H[b+12>>2];h=c;c=g;f=f+5|0;c=f>>>0<5?c+1|0:c;if(d>>>0>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}e=e+H[b>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;break b}if(!Qe(1,i+12|0,b)){break a}f=H[b+16>>2];c=H[b+20>>2];d=H[b+8>>2];h=H[b+12>>2];e=H[i+12>>2]}g=d-f|0;d=h-(c+(d>>>0>>0)|0)|0;if((d|0)<=0&e>>>0>g>>>0|(d|0)<0|(e|0)<=0){break a}j=H[b>>2]+f|0;H[a>>2]=j;c:{d:{h=e-1|0;g=h+j|0;d=I[g|0];e:{if(d>>>0<=63){H[a+4>>2]=h;g=I[g|0]&63;break e}f:{switch((d>>>6|0)-1|0){case 1:break d;case 0:break f;default:break a}}if(e>>>0<2){break a}d=e-2|0;H[a+4>>2]=d;d=d+j|0;g=I[d+1|0]<<8&16128|I[d|0]}H[a+8>>2]=g+4096;break c}if(e>>>0<3){break a}d=e-3|0;H[a+4>>2]=d;g=a;a=d+j|0;a=I[a+1|0]<<8|I[a+2|0]<<16&4128768|I[a|0];H[g+8>>2]=a+4096;if(a>>>0>1044479){break a}}a=e+f|0;c=a>>>0>>0?c+1|0:c;H[b+16>>2]=a;H[b+20>>2]=c;k=1}ca=i+16|0;return k}function Wf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;Xd(a,b,c);c=H[a+84>>2];d=H[a+88>>2]-c>>2;a:{if((d|0)>(b|0)){break a}b=b+1|0;if(b>>>0>d>>>0){b:{d=b-d|0;e=H[a+92>>2];c=H[a+88>>2];if(d>>>0<=e-c>>2>>>0){c:{if(!d){break c}b=c;e=d&7;if(e){while(1){H[b>>2]=1;b=b+4|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}c=(d<<2)+c|0;if((d-1&1073741823)>>>0<7){break c}while(1){H[b+24>>2]=1;H[b+28>>2]=1;H[b+16>>2]=1;H[b+20>>2]=1;H[b+8>>2]=1;H[b+12>>2]=1;H[b>>2]=1;H[b+4>>2]=1;b=b+32|0;if((c|0)!=(b|0)){continue}break}}H[a+88>>2]=c;break b}d:{b=c;c=H[a+84>>2];i=b-c|0;g=i>>2;b=g+d|0;if(b>>>0<1073741824){e=e-c|0;h=e>>>1|0;e=e>>>0>=2147483644?1073741823:b>>>0>>0?h:b;if(e){if(e>>>0>=1073741824){break d}j=pa(e<<2)}g=(g<<2)+j|0;b=g;h=d&7;if(h){while(1){H[b>>2]=1;b=b+4|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}f=g+(d<<2)|0;if((d-1&1073741823)>>>0>=7){while(1){H[b+24>>2]=1;H[b+28>>2]=1;H[b+16>>2]=1;H[b+20>>2]=1;H[b+8>>2]=1;H[b+12>>2]=1;H[b>>2]=1;H[b+4>>2]=1;b=b+32|0;if((f|0)!=(b|0)){continue}break}}b=va(j,c,i);H[a+88>>2]=f;H[a+84>>2]=b;H[a+92>>2]=b+(e<<2);if(c){oa(c)}break b}sa();v()}wa();v()}return}if(b>>>0>=d>>>0){break a}H[a+88>>2]=c+(b<<2)}}function qb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=H[a+8>>2];e=H[a+4>>2];if(d-e>>2>>>0>=b>>>0){a:{if(!b){break a}d=e;g=b&7;if(g){while(1){H[d>>2]=H[c>>2];d=d+4|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}e=(b<<2)+e|0;if((b-1&1073741823)>>>0<7){break a}while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=e;return}b:{i=H[a>>2];f=e-i>>2;h=f+b|0;if(h>>>0<1073741824){j=d-i|0;d=j>>>1|0;h=j>>>0>=2147483644?1073741823:d>>>0>h>>>0?d:h;if(h){if(h>>>0>=1073741824){break b}k=pa(h<<2)}f=(f<<2)+k|0;d=f;j=b&7;if(j){while(1){H[d>>2]=H[c>>2];d=d+4|0;g=g+1|0;if((j|0)!=(g|0)){continue}break}}g=(b<<2)+f|0;if((b-1&1073741823)>>>0>=7){while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;if((g|0)!=(d|0)){continue}break}}if((e|0)!=(i|0)){while(1){f=f-4|0;e=e-4|0;H[f>>2]=H[e>>2];if((e|0)!=(i|0)){continue}break}}H[a+8>>2]=(h<<2)+k;H[a+4>>2]=g;H[a>>2]=f;if(i){oa(i)}return}sa();v()}wa();v()}function Kc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=H[a+8>>2];e=H[a>>2];if(d-e>>2>>>0>=b>>>0){f=H[a+4>>2];h=f-e>>2;i=b>>>0>h>>>0?h:b;a:{if(!i){break a}d=e;g=i;j=g&7;if(j){while(1){H[d>>2]=H[c>>2];g=g-1|0;d=d+4|0;k=k+1|0;if((k|0)!=(j|0)){continue}break}}if(i>>>0<8){break a}while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;g=g-8|0;if(g){continue}break}}if(b>>>0>h>>>0){b=(b-h<<2)+f|0;while(1){H[f>>2]=H[c>>2];f=f+4|0;if((b|0)!=(f|0)){continue}break}H[a+4>>2]=b;return}H[a+4>>2]=e+(b<<2);return}if(e){H[a+4>>2]=e;oa(e);H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d=0}b:{if(b>>>0>=1073741824){break b}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:b>>>0>>0?e:b;if(d>>>0>=1073741824){break b}d=d<<2;e=pa(d);H[a>>2]=e;H[a+8>>2]=d+e;c=H[c>>2];d=e;g=b&7;if(g){while(1){H[d>>2]=c;d=d+4|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}e=e+(b<<2)|0;if((b-1&1073741823)>>>0>=7){while(1){H[d+28>>2]=c;H[d+24>>2]=c;H[d+20>>2]=c;H[d+16>>2]=c;H[d+12>>2]=c;H[d+8>>2]=c;H[d+4>>2]=c;H[d>>2]=c;d=d+32|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=e;return}sa();v()}function Me(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=ca-16|0;ca=h;a:{b:{if(J[b+38>>1]<=511){e=H[b+8>>2];c=H[b+12>>2];i=c;f=H[b+20>>2];d=H[b+16>>2];g=d+8|0;f=g>>>0<8?f+1|0:f;if(e>>>0>>0&(c|0)<=(f|0)|(c|0)<(f|0)){break a}d=d+H[b>>2]|0;c=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=I[d+4|0]|I[d+5|0]<<8|(I[d+6|0]<<16|I[d+7|0]<<24);H[b+16>>2]=g;H[b+20>>2]=f;break b}if(!gb(1,h+8|0,b)){break a}g=H[b+16>>2];f=H[b+20>>2];e=H[b+8>>2];i=H[b+12>>2];c=H[h+8>>2];d=H[h+12>>2]}j=e-g|0;e=i-(f+(e>>>0>>0)|0)|0;if((e|0)==(d|0)&c>>>0>j>>>0|d>>>0>e>>>0){break a}e=d+f|0;f=c+g|0;e=f>>>0>>0?e+1|0:e;H[b+16>>2]=f;H[b+20>>2]=e;if((c|0)<=0){break a}b=H[b>>2]+g|0;H[a+40>>2]=b;g=c-1|0;e=b+g|0;f=I[e|0];c:{if(f>>>0<=63){H[a+44>>2]=g;b=I[e|0]&63;break c}d:{switch((f>>>6|0)-1|0){case 0:if(c>>>0<2){break a}c=c-2|0;H[a+44>>2]=c;b=b+c|0;b=I[b+1|0]<<8&16128|I[b|0];break c;case 1:if(c>>>0<3){break a}c=c-3|0;H[a+44>>2]=c;b=b+c|0;b=I[b+1|0]<<8|I[b+2|0]<<16&4128768|I[b|0];break c;default:break d}}c=c-4|0;H[a+44>>2]=c;b=b+c|0;b=(I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24))&1073741823}H[a+48>>2]=b+16384;k=b>>>0<4177920}ca=h+16|0;return k}function Ua(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=(c>>>0)/3|0;j=H[(H[H[a+8>>2]+96>>2]+N(f,12)|0)+(c-N(f,3)<<2)>>2];a:{h=H[H[a+12>>2]+4>>2];e=H[h+4>>2];if((e|0)!=H[h+8>>2]){H[e>>2]=j;H[h+4>>2]=e+4;break a}b:{i=H[h>>2];f=e-i|0;g=f>>2;d=g+1|0;if(d>>>0<1073741824){k=g<<2;g=f>>>1|0;g=f>>>0>=2147483644?1073741823:d>>>0>>0?g:d;if(g){if(g>>>0>=1073741824){break b}f=pa(g<<2)}else{f=0}d=k+f|0;H[d>>2]=j;j=d+4|0;if((e|0)!=(i|0)){while(1){d=d-4|0;e=e-4|0;H[d>>2]=H[e>>2];if((e|0)!=(i|0)){continue}break}}H[h+8>>2]=f+(g<<2);H[h+4>>2]=j;H[h>>2]=d;if(i){oa(i)}break a}sa();v()}wa();v()}c:{d:{h=H[a+4>>2];e=H[h+4>>2];e:{if((e|0)!=H[h+8>>2]){H[e>>2]=c;H[h+4>>2]=e+4;break e}i=H[h>>2];f=e-i|0;j=f>>2;d=j+1|0;if(d>>>0>=1073741824){break d}g=f>>>1|0;g=f>>>0>=2147483644?1073741823:d>>>0>>0?g:d;if(g){if(g>>>0>=1073741824){break c}f=pa(g<<2)}else{f=0}d=f+(j<<2)|0;H[d>>2]=c;c=d+4|0;if((e|0)!=(i|0)){while(1){d=d-4|0;e=e-4|0;H[d>>2]=H[e>>2];if((e|0)!=(i|0)){continue}break}}H[h+8>>2]=f+(g<<2);H[h+4>>2]=c;H[h>>2]=d;if(!i){break e}oa(i)}a=H[a+4>>2];H[H[a+12>>2]+(b<<2)>>2]=H[a+24>>2];H[a+24>>2]=H[a+24>>2]+1;return}sa();v()}wa();v()}function Wb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=d-c|0;if((h|0)<=0){return}a:{e=H[a+8>>2];i=H[a+4>>2];if((e-i|0)>=(h|0)){j=i-b|0;if((j|0)>=(h|0)){f=i;g=d;break a}f=i;g=c+j|0;if((g|0)!=(d|0)){e=g;while(1){F[f|0]=I[e|0];f=f+1|0;e=e+1|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=f;if((j|0)>0){break a}return}k=H[a>>2];g=(i-k|0)+h|0;if((g|0)>=0){j=b-k|0;f=e-k|0;e=f<<1;f=f>>>0>=1073741823?2147483647:e>>>0>g>>>0?e:g;if(f){e=pa(f)}else{e=0}g=j+e|0;if((c|0)!=(d|0)){g=qa(g,c,h)+h|0}d=va(e,k,j);c=i-b|0;b=va(g,b,c);H[a+8>>2]=e+f;H[a+4>>2]=b+c;H[a>>2]=d;if(k){oa(k)}return}sa();v()}e=f;d=e-h|0;if(i>>>0>d>>>0){while(1){F[e|0]=I[d|0];e=e+1|0;d=d+1|0;if(i>>>0>d>>>0){continue}break}}H[a+4>>2]=e;a=b+h|0;if((a|0)!=(f|0)){a=f-a|0;va(f-a|0,b,a)}if((c|0)==(g|0)){return}f=(c^-1)+g|0;a=g-c&7;b:{if(!a){e=b;break b}d=0;e=b;while(1){F[e|0]=I[c|0];e=e+1|0;c=c+1|0;d=d+1|0;if((a|0)!=(d|0)){continue}break}}if(f>>>0<7){return}while(1){F[e|0]=I[c|0];F[e+1|0]=I[c+1|0];F[e+2|0]=I[c+2|0];F[e+3|0]=I[c+3|0];F[e+4|0]=I[c+4|0];F[e+5|0]=I[c+5|0];F[e+6|0]=I[c+6|0];F[e+7|0]=I[c+7|0];e=e+8|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}}function qa(a,b,c){var d=0,e=0,f=0;if(c>>>0>=512){ba(a|0,b|0,c|0);return a}e=a+c|0;a:{if(!((a^b)&3)){b:{if(!(a&3)){c=a;break b}if(!c){c=a;break b}c=a;while(1){F[c|0]=I[b|0];b=b+1|0;c=c+1|0;if(!(c&3)){break b}if(c>>>0>>0){continue}break}}d=e&-4;c:{if(d>>>0<64){break c}f=d+-64|0;if(f>>>0>>0){break c}while(1){H[c>>2]=H[b>>2];H[c+4>>2]=H[b+4>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=H[b+12>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=H[b+20>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=H[b+28>>2];H[c+32>>2]=H[b+32>>2];H[c+36>>2]=H[b+36>>2];H[c+40>>2]=H[b+40>>2];H[c+44>>2]=H[b+44>>2];H[c+48>>2]=H[b+48>>2];H[c+52>>2]=H[b+52>>2];H[c+56>>2]=H[b+56>>2];H[c+60>>2]=H[b+60>>2];b=b- -64|0;c=c- -64|0;if(f>>>0>=c>>>0){continue}break}}if(c>>>0>=d>>>0){break a}while(1){H[c>>2]=H[b>>2];b=b+4|0;c=c+4|0;if(d>>>0>c>>>0){continue}break}break a}if(e>>>0<4){c=a;break a}d=e-4|0;if(d>>>0>>0){c=a;break a}c=a;while(1){F[c|0]=I[b|0];F[c+1|0]=I[b+1|0];F[c+2|0]=I[b+2|0];F[c+3|0]=I[b+3|0];b=b+4|0;c=c+4|0;if(d>>>0>=c>>>0){continue}break}}if(c>>>0>>0){while(1){F[c|0]=I[b|0];b=b+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}}return a}function ub(a,b){var c=0,d=0,e=0,f=0,g=0;d=ca-16|0;ca=d;H[a+12>>2]=b;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;c=a+16|0;H[c>>2]=0;H[c+4>>2]=0;F[c+5|0]=0;F[c+6|0]=0;F[c+7|0]=0;F[c+8|0]=0;F[c+9|0]=0;F[c+10|0]=0;F[c+11|0]=0;F[c+12|0]=0;H[a+32>>2]=0;H[a+36>>2]=0;H[a+48>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+52>>2]=0;H[a+56>>2]=0;H[a+68>>2]=0;H[a+60>>2]=0;H[a+64>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+88>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+100>>2]=0;H[a+92>>2]=0;H[a+96>>2]=0;g=a+116|0;a:{b:{if(b){if(b>>>0<1073741824){break b}sa();v()}H[a+104>>2]=0;H[a+108>>2]=0;H[a+112>>2]=0;H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;c=1;break a}c=b<<2;e=pa(c);H[a+92>>2]=e;f=c+e|0;H[a+100>>2]=f;ra(e,0,c);H[a+112>>2]=0;H[a+104>>2]=0;H[a+108>>2]=0;H[a+96>>2]=f;e=pa(c);H[a+104>>2]=e;f=c+e|0;H[a+112>>2]=f;ra(e,0,c);H[a+108>>2]=f;e=pa(c);H[d>>2]=e;f=c+e|0;H[d+8>>2]=f;ra(e,0,c);H[d+4>>2]=f;c=b<<5|1}tb(g,c,d);e=H[d>>2];if(e){H[d+4>>2]=e;oa(e)}H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;if(b){b=b<<2;e=pa(b);H[d>>2]=e;f=b+e|0;H[d+8>>2]=f;ra(e,0,b);H[d+4>>2]=f}tb(a+128|0,c,d);b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}ca=d+16|0;return a}function ze(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;H[a>>2]=11484;d=a+232|0;b=H[d+196>>2];if(b){H[d+200>>2]=b;oa(b)}c=H[d+184>>2];if(c){b=c;e=H[d+188>>2];if((b|0)!=(e|0)){while(1){b=e-12|0;f=H[b>>2];if(f){H[e-8>>2]=f;oa(f)}e=b;if((b|0)!=(c|0)){continue}break}b=H[d+184>>2]}H[d+188>>2]=c;oa(b)}b=H[d+156>>2];if(b){H[d+160>>2]=b;oa(b)}c=H[d+136>>2];H[d+136>>2]=0;if(c){e=c-4|0;b=H[e>>2];if(b){b=c+(b<<4)|0;while(1){b=b-16|0;if((c|0)!=(b|0)){continue}break}}oa(e)}Yc(a+216|0);b=H[a+196>>2];if(b){H[a+200>>2]=b;oa(b)}b=H[a+184>>2];if(b){H[a+188>>2]=b;oa(b)}b=H[a+172>>2];if(b){H[a+176>>2]=b;oa(b)}b=H[a+160>>2];if(b){H[a+164>>2]=b;oa(b)}b=H[a+144>>2];if(b){while(1){c=H[b>>2];oa(b);b=c;if(b){continue}break}}b=H[a+136>>2];H[a+136>>2]=0;if(b){oa(b)}b=H[a+120>>2];if(b){oa(b)}b=H[a+108>>2];if(b){oa(b)}b=H[a+96>>2];if(b){oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}b=H[a+36>>2];if(b){H[a+40>>2]=b;oa(b)}b=H[a+24>>2];if(b){H[a+28>>2]=b;oa(b)}b=H[a+12>>2];if(b){H[a+16>>2]=b;oa(b)}b=H[a+8>>2];H[a+8>>2]=0;if(b){cb(b)}return a|0}function Pa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=H[a+8>>2];e=H[a+4>>2];if(d-e>>2>>>0>=b>>>0){a:{if(!b){break a}d=e;f=b&7;if(f){while(1){H[d>>2]=H[c>>2];d=d+4|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}}e=(b<<2)+e|0;if((b-1&1073741823)>>>0<7){break a}while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=e;return}b:{i=H[a>>2];j=e-i|0;f=j>>2;g=f+b|0;if(g>>>0<1073741824){d=d-i|0;e=d>>>1|0;g=d>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break b}k=pa(g<<2)}f=(f<<2)+k|0;d=f;e=b&7;if(e){while(1){H[d>>2]=H[c>>2];d=d+4|0;h=h+1|0;if((e|0)!=(h|0)){continue}break}}e=f+(b<<2)|0;if((b-1&1073741823)>>>0>=7){while(1){H[d>>2]=H[c>>2];H[d+4>>2]=H[c>>2];H[d+8>>2]=H[c>>2];H[d+12>>2]=H[c>>2];H[d+16>>2]=H[c>>2];H[d+20>>2]=H[c>>2];H[d+24>>2]=H[c>>2];H[d+28>>2]=H[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}b=va(k,i,j);H[a+4>>2]=e;H[a>>2]=b;H[a+8>>2]=b+(g<<2);if(i){oa(i)}return}sa();v()}wa();v()}function Cc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(I[a+11|0]>>>7|0){d=H[a+4>>2]}else{d=I[a+11|0]&127}if(d>>>0>>0){h=ca-16|0;ca=h;b=b-d|0;if(b){g=I[a+11|0]>>>7|0?(H[a+8>>2]&2147483647)-1|0:10;if(I[a+11|0]>>>7|0){d=H[a+4>>2]}else{d=I[a+11|0]&127}i=d+b|0;if(g-d>>>0>>0){a:{e=ca-16|0;ca=e;c=i-g|0;if(c>>>0<=2147483631-g>>>0){if(I[a+11|0]>>>7|0){f=H[a>>2]}else{f=a}if(g>>>0<1073741799){H[e+12>>2]=g<<1;H[e>>2]=c+g;c=ca-16|0;ca=c;ca=c+16|0;c=e+12|0;c=H[(K[e>>2]>2]?c:e)>>2];if(c>>>0>=11){j=c+16&-16;c=j-1|0;c=(c|0)==11?j:c}else{c=10}c=c+1|0}else{c=2147483631}Zb(e,c);c=H[e>>2];if(d){yb(c,f,d)}if((g|0)!=10){oa(f)}H[a>>2]=c;H[a+8>>2]=H[a+8>>2]&-2147483648|H[e+4>>2]&2147483647;H[a+8>>2]=H[a+8>>2]|-2147483648;ca=e+16|0;break a}Na();v()}}f=d;if(I[a+11|0]>>>7|0){d=H[a>>2]}else{d=a}f=f+d|0;e=ca-16|0;ca=e;F[e+15|0]=0;while(1){if(b){F[f|0]=I[e+15|0];b=b-1|0;f=f+1|0;continue}break}ca=e+16|0;Id(a,i);F[h+15|0]=0;F[d+i|0]=I[h+15|0]}ca=h+16|0;return}if(I[a+11|0]>>>7|0){d=H[a>>2]}else{d=a}f=ca-16|0;ca=f;Id(a,b);F[f+15|0]=0;F[b+d|0]=I[f+15|0];ca=f+16|0}function Jc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;g=ca-16|0;ca=g;a:{b:{if(b){H[a+88>>2]=0;H[a+92>>2]=0;d=H[a+84>>2];H[a+84>>2]=0;if(d){oa(d)}H[a+76>>2]=0;H[a+80>>2]=0;d=H[a+72>>2];H[a+72>>2]=0;if(d){oa(d)}d=H[b>>2];c=H[b+4>>2];F[g+15|0]=0;Oa(a,c-d>>2,g+15|0);d=H[b+28>>2];c=H[b+24>>2];F[g+14|0]=0;Oa(a+12|0,d-c>>2,g+14|0);Kc(a+28|0,H[b+4>>2]-H[b>>2]>>2,13708);c=H[b+28>>2]-H[b+24>>2]|0;f=c>>2;e=H[a+52>>2];c:{if(f>>>0<=H[a+60>>2]-e>>2>>>0){break c}if((c|0)<0){break b}d=H[a+56>>2];c=pa(c);f=c+(f<<2)|0;h=c+(d-e&-4)|0;c=h;if((d|0)!=(e|0)){while(1){c=c-4|0;d=d-4|0;H[c>>2]=H[d>>2];if((d|0)!=(e|0)){continue}break}}H[a+60>>2]=f;H[a+56>>2]=h;H[a+52>>2]=c;if(!e){break c}oa(e)}c=H[b+28>>2]-H[b+24>>2]|0;f=c>>2;e=H[a+40>>2];d:{if(f>>>0<=H[a+48>>2]-e>>2>>>0){break d}if((c|0)<0){break a}d=H[a+44>>2];c=pa(c);f=c+(f<<2)|0;h=c+(d-e&-4)|0;c=h;if((d|0)!=(e|0)){while(1){c=c-4|0;d=d-4|0;H[c>>2]=H[d>>2];if((d|0)!=(e|0)){continue}break}}H[a+48>>2]=f;H[a+44>>2]=h;H[a+40>>2]=c;if(!e){break d}oa(e)}F[a+24|0]=1;H[a+64>>2]=b}ca=g+16|0;return}sa();v()}sa();v()}function wb(a,b){var c=0,d=0,e=0,f=0,g=0;c=ca-16|0;ca=c;H[a+12>>2]=b;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+32>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+36>>2]=0;H[a+40>>2]=0;H[a+52>>2]=0;H[a+44>>2]=0;H[a+48>>2]=0;H[a+56>>2]=0;H[a+60>>2]=0;H[a+72>>2]=0;H[a+64>>2]=0;H[a+68>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+92>>2]=0;H[a+84>>2]=0;H[a+88>>2]=0;H[a+104>>2]=0;H[a+96>>2]=0;H[a+100>>2]=0;g=a+120|0;a:{b:{if(b){if(b>>>0<1073741824){break b}sa();v()}H[a+108>>2]=0;H[a+112>>2]=0;H[a+116>>2]=0;H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;e=1;break a}e=b<<2;d=pa(e);H[a+96>>2]=d;f=d+e|0;H[a+104>>2]=f;ra(d,0,e);H[a+116>>2]=0;H[a+108>>2]=0;H[a+112>>2]=0;H[a+100>>2]=f;d=pa(e);H[a+108>>2]=d;f=d+e|0;H[a+116>>2]=f;ra(d,0,e);H[a+112>>2]=f;d=pa(e);H[c>>2]=d;f=d+e|0;H[c+8>>2]=f;ra(d,0,e);H[c+4>>2]=f;e=b<<5|1}tb(g,e,c);d=H[c>>2];if(d){H[c+4>>2]=d;oa(d)}H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;if(b){b=b<<2;d=pa(b);H[c>>2]=d;f=b+d|0;H[c+8>>2]=f;ra(d,0,b);H[c+4>>2]=f}tb(a+132|0,e,c);b=H[c>>2];if(b){H[c+4>>2]=b;oa(b)}ca=c+16|0;return a}function Sb(a,b){var c=0,d=0,e=0;c=(a|0)==(b|0);F[b+12|0]=c;a:{if(c){break a}while(1){d=H[b+8>>2];if(I[d+12|0]){break a}b:{c=H[d+8>>2];e=H[c>>2];if((e|0)==(d|0)){e=H[c+4>>2];if(!(!e|I[e+12|0])){break b}c:{if(H[d>>2]==(b|0)){b=d;break c}b=H[d+4>>2];a=H[b>>2];H[d+4>>2]=a;if(a){H[a+8>>2]=d;c=H[d+8>>2]}H[b+8>>2]=c;a=H[d+8>>2];H[((H[a>>2]!=(d|0))<<2)+a>>2]=b;H[b>>2]=d;H[d+8>>2]=b;c=H[b+8>>2];d=H[c>>2]}F[b+12|0]=1;F[c+12|0]=0;a=H[d+4>>2];H[c>>2]=a;if(a){H[a+8>>2]=c}H[d+8>>2]=H[c+8>>2];a=H[c+8>>2];H[((H[a>>2]!=(c|0))<<2)+a>>2]=d;H[d+4>>2]=c;H[c+8>>2]=d;return}if(!(I[e+12|0]|!e)){break b}d:{if(H[d>>2]!=(b|0)){b=d;break d}a=H[b+4>>2];H[d>>2]=a;if(a){H[a+8>>2]=d;c=H[d+8>>2]}H[b+8>>2]=c;a=H[d+8>>2];H[((H[a>>2]!=(d|0))<<2)+a>>2]=b;H[b+4>>2]=d;H[d+8>>2]=b;c=H[b+8>>2]}F[b+12|0]=1;F[c+12|0]=0;a=H[c+4>>2];b=H[a>>2];H[c+4>>2]=b;if(b){H[b+8>>2]=c}H[a+8>>2]=H[c+8>>2];b=H[c+8>>2];H[((H[b>>2]!=(c|0))<<2)+b>>2]=a;H[a>>2]=c;H[c+8>>2]=a;break a}F[d+12|0]=1;F[c+12|0]=(a|0)==(c|0);F[e+12|0]=1;b=c;if((c|0)!=(a|0)){continue}break}}}function Tj(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(b){if(!c){break k}if(!d){break j}e=Q(d)-Q(b)|0;if(e>>>0<=31){break i}break c}if((d|0)==1|d>>>0>1){break c}da=0;a=(a>>>0)/(c>>>0)|0;break a}if(!a){break h}if(!d|d-1&d){break g}a=b>>>Qj(d)|0;da=0;break a}if(!(c-1&c)){break f}h=(Q(c)+33|0)-Q(b)|0;g=0-h|0;break d}h=e+1|0;g=63-e|0;break d}da=0;a=(b>>>0)/(d>>>0)|0;break a}e=Q(d)-Q(b)|0;if(e>>>0<31){break e}break c}if((c|0)==1){break b}d=Qj(c);c=d&31;if((d&63)>>>0>=32){a=b>>>c|0}else{e=b>>>c|0;a=((1<>>c}da=e;break a}h=e+1|0;g=63-e|0}e=h&63;f=e&31;if(e>>>0>=32){e=0;i=b>>>f|0}else{e=b>>>f|0;i=((1<>>f}g=g&63;f=g&31;if(g>>>0>=32){b=a<>>32-f|b<>>31;e=i<<1|b>>>31;f=m-(j+(e>>>0>g>>>0)|0)>>31;k=c&f;i=e-k|0;e=j-((d&f)+(e>>>0>>0)|0)|0;b=b<<1|a>>>31;a=l|a<<1;l=f&1;h=h-1|0;if(h){continue}break}}da=b<<1|a>>>31;a=l|a<<1;break a}a=0;b=0}da=b}return a}function rc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=H[b+16>>2];h=H[c+4>>2]-k|0;e=H[c>>2]-k|0;H[c>>2]=e;H[c+4>>2]=h;g=H[b+16>>2];f=h>>31;i=(f^h)-f|0;f=e>>31;l=g>>>0>=i+((f^e)-f|0)>>>0;a:{if(l){f=h;break a}b:{c:{if((e|0)>=0){f=1;i=1;if((h|0)>=0){break b}j=1;f=-1;i=-1;if(e){break c}break b}j=-1;f=-1;i=-1;if((h|0)<=0){break b}}f=(h|0)<=0?-1:1;i=j}j=N(g,i);e=(e<<1)-j|0;i=(N(f,i)|0)>=0;g=N(f,g);f=((i?0-e|0:e)+g|0)/2|0;H[c+4>>2]=f;m=c;c=(h<<1)-g|0;e=(j+(i?0-c|0:c)|0)/2|0;H[m>>2]=e;g=H[b+16>>2]}c=H[d+4>>2]+f|0;e=H[d>>2]+e|0;d:{if((g|0)<(e|0)){e=e-H[b+4>>2]|0;break d}if((0-g|0)<=(e|0)){break d}e=H[b+4>>2]+e|0}e:{if((c|0)>(g|0)){c=c-H[b+4>>2]|0;break e}if((0-g|0)<=(c|0)){break e}c=H[b+4>>2]+c|0}f:{if(l){g=c;break f}g:{h:{if((e|0)>=0){b=1;f=1;if((c|0)>=0){break g}d=1;b=-1;f=-1;if(e){break h}break g}d=-1;b=-1;f=-1;if((c|0)<=0){break g}}b=(c|0)<=0?-1:1;f=d}d=N(f,g);h=(e<<1)-d|0;f=(N(b,f)|0)>=0;b=N(b,g);g=((f?0-h|0:h)+b|0)/2|0;b=(c<<1)-b|0;e=(d+(f?0-b|0:b)|0)/2|0}c=a;H[c>>2]=e+k;H[c+4>>2]=g+k}function Wh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;g=ca-16|0;ca=g;e=H[a+4>>2];d=H[e>>2];a:{b=H[a+12>>2];c=H[b+28>>2]-H[b+24>>2]|0;f=c>>2;b:{if(f>>>0<=H[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=H[e+4>>2];c=pa(c);f=c+(f<<2)|0;h=c+(b-d&-4)|0;c=h;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[e+8>>2]=f;H[e+4>>2]=h;H[e>>2]=c;if(!d){break b}oa(d)}b=H[a+12>>2];c=H[b+28>>2];b=H[b+24>>2];H[g+12>>2]=0;b=c-b>>2;d=a+96|0;e=H[d>>2];c=H[a+100>>2]-e>>2;c:{if(b>>>0>c>>>0){Pa(d,b-c|0,g+12|0);break c}if(b>>>0>=c>>>0){break c}H[a+100>>2]=e+(b<<2)}e=a+8|0;b=H[a+116>>2];d:{if(b){d=H[b>>2];if((d|0)==H[b+4>>2]){c=1;break d}b=0;while(1){c=ye(e,H[(b<<2)+d>>2]);if(!c){break d}f=H[a+116>>2];d=H[f>>2];b=b+1|0;if(b>>>0>2]-d>>2>>>0){continue}break}break d}c=1;a=H[a+12>>2];a=H[a+4>>2]-H[a>>2]|0;if(a>>>0<12){break d}a=(a>>2>>>0)/3|0;b=0;while(1){c=ye(e,N(b,3));if(!c){break d}b=b+1|0;if((a|0)!=(b|0)){continue}break}}ca=g+16|0;return c|0}sa();v()}function gj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c=H[b+88>>2];if(!(!c|H[c>>2]!=1)){e=H[c+8>>2];H[a+4>>2]=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);f=a+8|0;d=I[b+24|0];h=H[a+8>>2];g=H[a+12>>2]-h>>2;a:{if(d>>>0>g>>>0){ya(f,d-g|0);d=I[b+24|0];e=H[c+8>>2];break a}if(d>>>0>=g>>>0){break a}H[a+12>>2]=h+(d<<2)}b:{if(!d){b=4;break b}h=d&3;f=H[f>>2];c:{if(d-1>>>0<3){b=4;d=0;break c}k=d&252;d=0;b=4;while(1){g=d<<2;c=b+e|0;H[g+f>>2]=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[f+(g|4)>>2]=I[c+4|0]|I[c+5|0]<<8|(I[c+6|0]<<16|I[c+7|0]<<24);H[f+(g|8)>>2]=I[c+8|0]|I[c+9|0]<<8|(I[c+10|0]<<16|I[c+11|0]<<24);H[f+(g|12)>>2]=I[c+12|0]|I[c+13|0]<<8|(I[c+14|0]<<16|I[c+15|0]<<24);d=d+4|0;b=b+16|0;i=i+4|0;if((k|0)!=(i|0)){continue}break}}if(!h){break b}while(1){c=b+e|0;H[f+(d<<2)>>2]=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);d=d+1|0;b=b+4|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}d=a;a=b+e|0;H[d+20>>2]=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);d=1}return d|0}function se(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;a:{b:{c:{if(!b){if((d|0)<0){break a}f=H[a+4>>2];b=H[a>>2];d=f-b|0;if(c>>>0>d>>>0){g=c-d|0;e=H[a+8>>2];if(g>>>0<=e-f>>>0){i=a,j=ra(f,0,g)+g|0,H[i+4>>2]=j;break c}if((c|0)<0){break b}f=e-b|0;e=f<<1;f=f>>>0>=1073741823?2147483647:c>>>0>>0?e:c;e=pa(f);ra(e+d|0,0,g);d=va(e,b,d);H[a+8>>2]=d+f;H[a+4>>2]=c+d;H[a>>2]=d;if(!b){break c}oa(b);break c}if(c>>>0>=d>>>0){break c}H[a+4>>2]=b+c;break c}if((d|0)<0){break a}e=H[a+4>>2];f=H[a>>2];g=e-f|0;d:{if((d|0)<=0&c>>>0<=g>>>0|(d|0)<0){break d}if(c>>>0>g>>>0){d=c-g|0;h=H[a+8>>2];if(d>>>0<=h-e>>>0){i=a,j=ra(e,0,d)+d|0,H[i+4>>2]=j;break d}if((c|0)<0){break b}e=h-f|0;h=e<<1;e=e>>>0>=1073741823?2147483647:c>>>0>>0?h:c;h=pa(e);ra(h+g|0,0,d);d=va(h,f,g);H[a+8>>2]=d+e;H[a+4>>2]=c+d;H[a>>2]=d;if(!f){break d}oa(f);break d}if(c>>>0>=g>>>0){break d}H[a+4>>2]=c+f}if(!c){break c}va(H[a>>2],b,c)}b=H[a+28>>2];c=H[a+24>>2]+1|0;b=c?b:b+1|0;H[a+24>>2]=c;H[a+28>>2]=b;g=1;break a}sa();v()}return g}function Jh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=H[a+12>>2];c=H[a+68>>2];d=H[c+80>>2];F[b+84|0]=0;n=b+68|0;i=H[b+68>>2];e=H[b+72>>2]-i>>2;a:{if(e>>>0>>0){qb(n,d-e|0,12372);c=H[a+68>>2];d=H[c+80>>2];break a}if(d>>>0>=e>>>0){break a}H[b+72>>2]=i+(d<<2)}b=H[c+100>>2];e=H[c+96>>2];i=(b-e|0)/12|0;m=1;b:{if((b|0)==(e|0)){break b}k=H[k+28>>2];f=H[k>>2];if((f|0)==-1){return 0}o=i>>>0<=1?1:i;c=e;b=0;m=0;while(1){g=H[c>>2];if(g>>>0>=d>>>0){break b}j=H[H[a+72>>2]+12>>2];h=H[j+(f<<2)>>2];if(h>>>0>=d>>>0){break b}f=H[n>>2];H[f+(g<<2)>>2]=h;g=k+(l<<2)|0;h=H[g+4>>2];if((h|0)==-1){break b}l=H[c+4>>2];if(l>>>0>=d>>>0){break b}h=H[(h<<2)+j>>2];if(h>>>0>=d>>>0){break b}H[f+(l<<2)>>2]=h;g=H[g+8>>2];if((g|0)==-1){break b}c=H[c+8>>2];if(c>>>0>=d>>>0){break b}j=H[(g<<2)+j>>2];if(j>>>0>=d>>>0){break b}H[f+(c<<2)>>2]=j;b=b+1|0;m=i>>>0<=b>>>0;if((b|0)==(o|0)){break b}c=e+N(b,12)|0;l=N(b,3);f=H[k+(l<<2)>>2];if((f|0)!=-1){continue}break}}return m|0}function Gh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=H[d+80>>2];e=ca-48|0;ca=e;a=H[a+4>>2];m=a-2|0;a:{if(m>>>0>28){break a}j=H[H[d>>2]>>2]+H[d+48>>2]|0;H[e+16>>2]=a;a=-1<>2]=a^-1;a=-2-a|0;H[e+24>>2]=a;H[e+32>>2]=(a|0)/2;L[e+28>>2]=O(2)/O(a|0);f=H[c>>2];if((f|0)!=H[c+4>>2]){a=0;d=0;while(1){g=H[(d<<2)+f>>2];h=e+36|0;k=H[H[b>>2]>>2];l=H[b+48>>2];f=H[b+40>>2];i=H[b+44>>2];if(!I[b+84|0]){g=H[H[b+68>>2]+(g<<2)>>2]}g=Rj(f,i,g,0);i=g;g=g+l|0;qa(h,g+k|0,f);he(e+16|0,h,e+12|0,e+8|0);f=a<<2;H[f+j>>2]=H[e+12>>2];H[(f|4)+j>>2]=H[e+8>>2];a=a+2|0;d=d+1|0;f=H[c>>2];if(d>>>0>2]-f>>2>>>0){continue}break}break a}if(!h){break a}d=0;a=0;while(1){k=e+36|0;l=H[H[b>>2]>>2];i=H[b+48>>2];c=H[b+40>>2];f=Rj(c,H[b+44>>2],I[b+84|0]?a:H[H[b+68>>2]+(a<<2)>>2],0);g=f;f=f+i|0;qa(k,f+l|0,c);he(e+16|0,k,e+12|0,e+8|0);c=d<<2;H[c+j>>2]=H[e+12>>2];H[(c|4)+j>>2]=H[e+8>>2];d=d+2|0;a=a+1|0;if((h|0)!=(a|0)){continue}break}}ca=e+48|0;return m>>>0<29|0}function Re(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=O(0),j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=ca-16|0;ca=k;if(H[c+28>>2]==9){d=H[a+4>>2];h=I[c+24|0];e=h<<2;f=pa(e);l=k+8|0;H[l>>2]=1065353216;i=L[a+20>>2];d=-1<0){L[l>>2]=i/O(d|0)}o=(d|0)>0;a:{if(!o){break a}j=H[c+80>>2];if(!j){break a}if(h){p=H[H[b>>2]>>2]+H[b+48>>2]|0;t=h&254;u=h&1;b=0;while(1){m=H[a+8>>2];i=L[l>>2];d=0;n=0;if((h|0)!=1){while(1){g=d<<2;q=(b<<2)+p|0;L[g+f>>2]=O(i*O(H[q>>2]))+L[g+m>>2];g=g|4;L[g+f>>2]=O(i*O(H[q+4>>2]))+L[g+m>>2];d=d+2|0;b=b+2|0;n=n+2|0;if((t|0)!=(n|0)){continue}break}}if(u){d=d<<2;L[d+f>>2]=O(i*O(H[(b<<2)+p>>2]))+L[d+m>>2];b=b+1|0}qa(H[H[c+64>>2]>>2]+r|0,f,e);r=e+r|0;s=s+1|0;if((s|0)!=(j|0)){continue}break}break a}b=0;if((j|0)!=1){a=j&-2;d=0;while(1){qa(H[H[c+64>>2]>>2]+b|0,f,e);b=b+e|0;qa(b+H[H[c+64>>2]>>2]|0,f,e);b=b+e|0;d=d+2|0;if((a|0)!=(d|0)){continue}break}}if(!(j&1)){break a}qa(H[H[c+64>>2]>>2]+b|0,f,e)}oa(f)}ca=k+16|0;return o|0}function Xh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=H[a+12>>2];d=H[a+108>>2];e=H[d+80>>2];F[b+84|0]=0;m=b+68|0;h=H[b+68>>2];f=H[b+72>>2]-h>>2;a:{if(f>>>0>>0){qb(m,e-f|0,12372);d=H[a+108>>2];e=H[d+80>>2];break a}if(e>>>0>=f>>>0){break a}H[b+72>>2]=h+(e<<2)}b=H[d+100>>2];f=H[d+96>>2];h=(b-f|0)/12|0;k=1;b:{if((b|0)==(f|0)){break b}n=h>>>0<=1?1:h;o=H[c>>2];c=0;d=f;b=0;k=0;while(1){c=(c<<2)+o|0;i=H[c>>2];if((i|0)==-1){break b}g=H[d>>2];if(g>>>0>=e>>>0){break b}l=H[H[a+112>>2]+12>>2];j=H[l+(i<<2)>>2];if(j>>>0>=e>>>0){break b}i=H[m>>2];H[i+(g<<2)>>2]=j;g=H[c+4>>2];if((g|0)==-1){break b}j=H[d+4>>2];if(j>>>0>=e>>>0){break b}g=H[(g<<2)+l>>2];if(g>>>0>=e>>>0){break b}H[i+(j<<2)>>2]=g;c=H[c+8>>2];if((c|0)==-1){break b}d=H[d+8>>2];if(d>>>0>=e>>>0){break b}c=H[(c<<2)+l>>2];if(c>>>0>=e>>>0){break b}H[i+(d<<2)>>2]=c;b=b+1|0;k=h>>>0<=b>>>0;if((b|0)==(n|0)){break b}c=N(b,3);d=f+N(b,12)|0;if((b|0)!=1431655765){continue}break}}return k|0}function Ph(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=H[a+12>>2];d=H[a+68>>2];e=H[d+80>>2];F[b+84|0]=0;m=b+68|0;h=H[b+68>>2];f=H[b+72>>2]-h>>2;a:{if(f>>>0>>0){qb(m,e-f|0,12372);d=H[a+68>>2];e=H[d+80>>2];break a}if(e>>>0>=f>>>0){break a}H[b+72>>2]=h+(e<<2)}b=H[d+100>>2];f=H[d+96>>2];h=(b-f|0)/12|0;k=1;b:{if((b|0)==(f|0)){break b}n=h>>>0<=1?1:h;o=H[c>>2];c=0;d=f;b=0;k=0;while(1){c=(c<<2)+o|0;i=H[c>>2];if((i|0)==-1){break b}g=H[d>>2];if(g>>>0>=e>>>0){break b}l=H[H[a+72>>2]+12>>2];j=H[l+(i<<2)>>2];if(j>>>0>=e>>>0){break b}i=H[m>>2];H[i+(g<<2)>>2]=j;g=H[c+4>>2];if((g|0)==-1){break b}j=H[d+4>>2];if(j>>>0>=e>>>0){break b}g=H[(g<<2)+l>>2];if(g>>>0>=e>>>0){break b}H[i+(j<<2)>>2]=g;c=H[c+8>>2];if((c|0)==-1){break b}d=H[d+8>>2];if(d>>>0>=e>>>0){break b}c=H[(c<<2)+l>>2];if(c>>>0>=e>>>0){break b}H[i+(d<<2)>>2]=c;b=b+1|0;k=h>>>0<=b>>>0;if((b|0)==(n|0)){break b}c=N(b,3);d=f+N(b,12)|0;if((b|0)!=1431655765){continue}break}}return k|0}function Wa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=ca-16|0;ca=d;a:{f=H[a+4>>2];b:{if(f>>>0>>0){e=b-f|0;c=H[a+8>>2];g=c<<5;c:{if(!(e>>>0>g>>>0|f>>>0>g-e>>>0)){H[a+4>>2]=b;h=f&31;b=H[a>>2]+(f>>>3&536870908)|0;break c}H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;if((b|0)<0){break a}if(g>>>0<=1073741822){c=c<<6;b=b+31&-32;b=b>>>0>>0?c:b}else{b=2147483647}pb(d,b);f=H[a+4>>2];H[d+4>>2]=f+e;i=H[a>>2];b=H[d>>2];d:{if((f|0)<=0){break d}c=f>>>5|0;if(f>>>0>=32){va(b,i,c<<2)}g=c<<2;b=g+b|0;h=f&31;if(h){c=-1>>>32-h|0;H[b>>2]=H[b>>2]&(c^-1)|H[i+g>>2]&c}i=H[a>>2]}H[a>>2]=H[d>>2];H[d>>2]=i;c=H[a+4>>2];H[a+4>>2]=H[d+4>>2];H[d+4>>2]=c;c=H[a+8>>2];H[a+8>>2]=H[d+8>>2];H[d+8>>2]=c;if(!i){break c}oa(i)}if(!e){break b}if(h){c=32-h|0;a=c>>>0>>0?c:e;H[b>>2]=H[b>>2]&(-1<>>c-a^-1);e=e-a|0;b=b+4|0}a=e>>>5|0;if(e>>>0>=32){ra(b,0,a<<2)}if((e&-32)==(e|0)){break b}a=(a<<2)+b|0;H[a>>2]=H[a>>2]&(-1>>>32-(e&31)^-1);break b}H[a+4>>2]=b}ca=d+16|0;return}sa();v()}function Je(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+12>>2];i=H[a+8>>2];d=e-i>>2;b=I[b+24|0];a:{if(d>>>0>>0){ya(a+8|0,b-d|0);i=H[a+8>>2];e=H[a+12>>2];break a}if(b>>>0>=d>>>0){break a}e=(b<<2)+i|0;H[a+12>>2]=e}b=0;f=H[c+8>>2];h=H[c+12>>2];j=H[c+20>>2];e=e-i|0;d=H[c+16>>2];g=e+d|0;j=e>>>0>g>>>0?j+1|0:j;b:{if(f>>>0>>0&(h|0)<=(j|0)|(h|0)<(j|0)){break b}qa(i,d+H[c>>2]|0,e);d=H[c+20>>2];g=e;e=e+H[c+16>>2]|0;d=g>>>0>e>>>0?d+1|0:d;H[c+16>>2]=e;H[c+20>>2]=d;f=H[c+8>>2];h=H[c+12>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;if(f>>>0>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break b}d=e+H[c>>2]|0;H[a+20>>2]=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);d=H[c+20>>2];g=d;f=d;e=H[c+16>>2];d=e+4|0;f=d>>>0<4?f+1|0:f;H[c+16>>2]=d;H[c+20>>2]=f;h=H[c+12>>2];if((f|0)>=(h|0)&d>>>0>=K[c+8>>2]|(f|0)>(h|0)){break b}f=I[d+H[c>>2]|0];d=g;e=e+5|0;d=e>>>0<5?d+1|0:d;H[c+16>>2]=e;H[c+20>>2]=d;if(f-1>>>0>29){break b}H[a+4>>2]=f;b=1}return b|0}function qd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{f=H[a+4>>2];b:{if((f|0)!=H[a>>2]){c=f;break b}g=H[a+8>>2];c=H[a+12>>2];if(g>>>0>>0){e=((c-g>>2)+1|0)/2<<2;c=e+g|0;if((f|0)!=(g|0)){d=g-f|0;c=c-d|0;va(c,f,d);f=H[a+8>>2]}H[a+4>>2]=c;H[a+8>>2]=e+f;break b}d=(c|0)==(f|0)?1:c-f>>1;if(d>>>0>=1073741824){break a}c=d<<2;i=pa(c);k=i+c|0;c=(d+3&-4)+i|0;h=c;c:{if((f|0)==(g|0)){break c}g=g-f|0;l=g&-4;e=c;d=f;j=g-4|0;g=(j>>>2|0)+1&7;if(g){h=0;while(1){H[e>>2]=H[d>>2];d=d+4|0;e=e+4|0;h=h+1|0;if((g|0)!=(h|0)){continue}break}}h=c+l|0;if(j>>>0<28){break c}while(1){H[e>>2]=H[d>>2];H[e+4>>2]=H[d+4>>2];H[e+8>>2]=H[d+8>>2];H[e+12>>2]=H[d+12>>2];H[e+16>>2]=H[d+16>>2];H[e+20>>2]=H[d+20>>2];H[e+24>>2]=H[d+24>>2];H[e+28>>2]=H[d+28>>2];d=d+32|0;e=e+32|0;if((h|0)!=(e|0)){continue}break}}H[a+12>>2]=k;H[a+8>>2]=h;H[a+4>>2]=c;H[a>>2]=i;if(!f){break b}oa(f);c=H[a+4>>2]}H[c-4>>2]=H[b>>2];H[a+4>>2]=H[a+4>>2]-4;return}wa();v()}function sb(a,b){var c=0;a:{if(!ta(a,b)){break a}if(!ta(a+16|0,b)){break a}if(!ta(a+32|0,b)){break a}if(!ta(a+48|0,b)){break a}if(!ta(a- -64|0,b)){break a}if(!ta(a+80|0,b)){break a}if(!ta(a+96|0,b)){break a}if(!ta(a+112|0,b)){break a}if(!ta(a+128|0,b)){break a}if(!ta(a+144|0,b)){break a}if(!ta(a+160|0,b)){break a}if(!ta(a+176|0,b)){break a}if(!ta(a+192|0,b)){break a}if(!ta(a+208|0,b)){break a}if(!ta(a+224|0,b)){break a}if(!ta(a+240|0,b)){break a}if(!ta(a+256|0,b)){break a}if(!ta(a+272|0,b)){break a}if(!ta(a+288|0,b)){break a}if(!ta(a+304|0,b)){break a}if(!ta(a+320|0,b)){break a}if(!ta(a+336|0,b)){break a}if(!ta(a+352|0,b)){break a}if(!ta(a+368|0,b)){break a}if(!ta(a+384|0,b)){break a}if(!ta(a+400|0,b)){break a}if(!ta(a+416|0,b)){break a}if(!ta(a+432|0,b)){break a}if(!ta(a+448|0,b)){break a}if(!ta(a+464|0,b)){break a}if(!ta(a+480|0,b)){break a}if(!ta(a+496|0,b)){break a}c=ta(a+512|0,b)}return c}function qf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{if(!ke(a,b)){break a}h=a+36|0;g=ea[H[H[a>>2]+24>>2]](a)|0;e=H[a+40>>2];d=H[a+36>>2];c=e-d>>2;b:{if(g>>>0>c>>>0){Vb(h,g-c|0);break b}if(c>>>0<=g>>>0){break b}d=d+(g<<2)|0;if((d|0)!=(e|0)){while(1){e=e-4|0;c=H[e>>2];H[e>>2]=0;if(c){ea[H[H[c>>2]+4>>2]](c)}if((d|0)!=(e|0)){continue}break}}H[a+40>>2]=d}c=1;if((g|0)<=0){break a}e=0;while(1){c:{c=H[b+20>>2];f=H[b+12>>2];d=H[b+16>>2];if((c|0)>=(f|0)&d>>>0>=K[b+8>>2]|(c|0)>(f|0)){break c}f=I[H[b>>2]+d|0];d=d+1|0;c=d?c:c+1|0;H[b+16>>2]=d;H[b+20>>2]=c;d=ea[H[H[a>>2]+48>>2]](a,f)|0;f=e<<2;i=f+H[a+36>>2]|0;c=H[i>>2];H[i>>2]=d;if(c){ea[H[H[c>>2]+4>>2]](c)}c=H[H[h>>2]+f>>2];if(!c){break c}if(!(k=c,l=ea[H[H[a>>2]+28>>2]](a)|0,m=ea[H[H[a>>2]+20>>2]](a,e)|0,j=H[H[c>>2]+8>>2],ea[j](k|0,l|0,m|0)|0)){break c}c=1;e=e+1|0;if((g|0)!=(e|0)){continue}break a}break}c=0}return c|0}function he(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=+L[b>>2];k=+L[b+4>>2];l=+L[b+8>>2];g=P(j)+P(k)+P(l);a:{if(!(g>1e-6)){j=1;k=0;e=0;break a}g=1/g;k=g*k;j=g*j;e=g*l<0}h=H[a+16>>2];l=+(h|0);g=T(j*l+.5);b:{if(P(g)<2147483648){m=~~g;break b}m=-2147483648}f=m>>31;i=(f^m)-f|0;g=T(k*l+.5);c:{if(P(g)<2147483648){f=~~g;break c}f=-2147483648}b=f>>31;b=h-(i+((f^b)-b|0)|0)|0;i=(b|0)>0?b:0;e=e?0-i|0:i;f=f+(b>>31&((f|0)>0?b:0-b|0))|0;d:{if((m|0)>=0){b=e+h|0;a=H[a+8>>2];e=h+f|0;break d}b=f>>31;b=(b^f)-b|0;a=H[a+8>>2];b=(e|0)<0?b:a-b|0;e=(f|0)<0?i:a-i|0}e:{if(!(b|e)){b=a;break e}if(!((a|0)!=(b|0)|e)){b=a;break e}if(!((a|0)!=(e|0)|b)){b=a;break e}if(!((b|0)<=(h|0)|e)){b=(h<<1)-b|0;a=0;break e}if(!((a|0)!=(e|0)|(b|0)>=(h|0))){b=(h<<1)-b|0;break e}if(!((a|0)!=(b|0)|(e|0)>=(h|0))){b=a;a=(h<<1)-e|0;break e}if(b){a=e;break e}b=0;if((e|0)<=(h|0)){a=e;break e}a=(h<<1)-e|0}H[c>>2]=a;H[d>>2]=b}function Ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=H[b+8>>2];h=H[b+12>>2];c=H[b+20>>2];i=c;k=H[b+16>>2];d=k+4|0;c=d>>>0<4?c+1|0:c;a:{if(d>>>0>g>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}l=H[b>>2];f=k+l|0;e=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=d;H[b+20>>2]=c;c=i;f=k+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>g>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}d=d+l|0;j=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=c;if((e|0)>(j|0)){break a}H[a+16>>2]=j;H[a+12>>2]=e;d=j-e|0;e=(j>>31)-((e>>31)+(e>>>0>j>>>0)|0)|0;if(!e&d>>>0>2147483646|e){break a}d=d+1|0;H[a+20>>2]=d;e=d>>>1|0;H[a+24>>2]=e;H[a+28>>2]=0-e;if(!(d&1)){H[a+24>>2]=e-1}if(J[b+38>>1]<=513){if((c|0)>=(h|0)&f>>>0>=g>>>0|(c|0)>(h|0)){break a}g=I[f+l|0];c=i;i=k+9|0;c=i>>>0<9?c+1|0:c;H[b+16>>2]=i;H[b+20>>2]=c;if(g>>>0>1){break a}H[a+88>>2]=g}m=ta(a+112|0,b)}return m|0}function Hc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;g=H[a>>2];c=g+(b>>>3&536870908)|0;H[c>>2]=H[c>>2]|1<>2];e=(b|0)==-1;d=-1;a:{if(e){break a}c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;d=-1;if((c|0)==-1){break a}d=H[H[f>>2]+(c<<2)>>2]}c=H[a+12>>2];h=(d>>>3&536870908)+c|0;H[h>>2]=H[h>>2]|1<>>0)%3|0){e=b-1|0;break e}e=b+2|0;d=-1;if((e|0)==-1){break d}}d=H[H[f>>2]+(e<<2)>>2]}e=(d>>>3&536870908)+c|0;H[e>>2]=H[e>>2]|1<>2]+(b<<2)>>2];if((b|0)==-1){break b}F[a+24|0]=0;a=(b>>>3&536870908)+g|0;H[a>>2]=H[a>>2]|1<>>0)%3|0?a:b-2|0;if((a|0)!=-1){d=H[H[f>>2]+(a<<2)>>2]}a=c+(d>>>3&536870908)|0;H[a>>2]=H[a>>2]|1<>>0)%3|0){b=b-1|0;break g}b=b+2|0;a=-1;if((b|0)==-1){break f}}a=H[H[f>>2]+(b<<2)>>2]}b=1<>>3&536870908)|0;c=H[a>>2];break c}a=c+536870908|0;b=H[c+536870908>>2];c=-2147483648}H[a>>2]=b|c}}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=O(0),f=O(0),g=O(0),h=O(0),i=O(0),j=0,k=O(0),l=O(0),m=O(0),n=O(0),o=0;a:{if(H[c+28>>2]!=9|I[c+24|0]!=3){break a}a=H[a+4>>2];if(a-2>>>0>28){break a}o=1;j=H[c+80>>2];if(!j){break a}k=O(O(2)/O((1<>2]>>2]+H[c+48>>2]|0;a=H[H[b>>2]>>2]+H[b+48>>2]|0;b=0;while(1){g=O(0);l=O(0);m=O(0);e=O(O(O(H[a>>2])*k)+O(-1));f=O(O(O(H[a+4>>2])*k)+O(-1));i=O(O(O(1)-O(P(e)))-O(P(f)));h=O(S(O(-i),O(0)));n=O(-h);f=O(f+(f>>8;F[c+10|0]=d>>>16;F[c+11|0]=d>>>24;d=(w(l),y(2));F[c+4|0]=d;F[c+5|0]=d>>>8;F[c+6|0]=d>>>16;F[c+7|0]=d>>>24;d=(w(g),y(2));F[c|0]=d;F[c+1|0]=d>>>8;F[c+2|0]=d>>>16;F[c+3|0]=d>>>24;c=c+12|0;b=b+1|0;if((j|0)!=(b|0)){continue}break}}return o|0}function Vd(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if(b>>>0<=63){b=0;a=H[a+12>>2];if(a>>>0<2){break a}b=a-1|0;e=b&3;d=H[c>>2];c=0;b:{if(a-2>>>0<3){a=1;b=0;break b}f=b&-4;b=0;a=1;while(1){g=a+3|0;h=a+2|0;i=a+1|0;b=K[d+(b<<2)>>2]>K[d+(a<<2)>>2]?a:b;b=K[d+(b<<2)>>2]>K[d+(i<<2)>>2]?i:b;b=K[d+(b<<2)>>2]>K[d+(h<<2)>>2]?h:b;b=K[d+(b<<2)>>2]>K[d+(g<<2)>>2]?g:b;a=a+4|0;j=j+4|0;if((f|0)!=(j|0)){continue}break}}if(!e){break a}while(1){b=K[d+(b<<2)>>2]>K[d+(a<<2)>>2]?a:b;a=a+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}break a}b=H[a+580>>2];d=32-b|0;if((d|0)>=4){c=H[a+576>>2];if((c|0)==H[a+568>>2]){return 0}d=H[c>>2];e=b+4|0;H[a+580>>2]=e;b=d<>>28|0;if((e|0)!=32){break a}H[a+580>>2]=0;H[a+576>>2]=c+4;return b}c=H[a+576>>2];e=c+4|0;if((e|0)==H[a+568>>2]){return 0}f=H[c>>2];H[a+576>>2]=e;H[a+580>>2]=b-28;a=60-b|0;b=H[c+4>>2]>>>a|f<>>a-d}return b}function Ae(a){a=a|0;var b=0,c=0,d=0,e=0;H[a>>2]=11436;b=H[a+388>>2];if(b){H[a+392>>2]=b;oa(b)}d=H[a+368>>2];H[a+368>>2]=0;if(d){e=d-4|0;b=H[e>>2];if(b){c=(b<<4)+d|0;while(1){c=c-16|0;if((d|0)!=(c|0)){continue}break}}oa(e)}Yc(a+216|0);b=H[a+196>>2];if(b){H[a+200>>2]=b;oa(b)}b=H[a+184>>2];if(b){H[a+188>>2]=b;oa(b)}b=H[a+172>>2];if(b){H[a+176>>2]=b;oa(b)}b=H[a+160>>2];if(b){H[a+164>>2]=b;oa(b)}c=H[a+144>>2];if(c){while(1){b=H[c>>2];oa(c);c=b;if(b){continue}break}}b=H[a+136>>2];H[a+136>>2]=0;if(b){oa(b)}b=H[a+120>>2];if(b){oa(b)}b=H[a+108>>2];if(b){oa(b)}b=H[a+96>>2];if(b){oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}b=H[a+36>>2];if(b){H[a+40>>2]=b;oa(b)}b=H[a+24>>2];if(b){H[a+28>>2]=b;oa(b)}b=H[a+12>>2];if(b){H[a+16>>2]=b;oa(b)}b=H[a+8>>2];H[a+8>>2]=0;if(b){cb(b)}return a|0}function Sg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a:{a=ca-32|0;ca=a;e=Ma(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){g=(e|15)+1|0;f=pa(g);H[a+24>>2]=g|-2147483648;H[a+16>>2]=f;H[a+20>>2]=e;g=e+f|0;break c}F[a+27|0]=e;f=a+16|0;g=e+f|0;if(!e){break b}}qa(f,c,e)}F[g|0]=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d:{c=nb(b,a+16|0);if((c|0)==(b+4|0)){break d}b=H[c+28>>2];e=H[c+32>>2];if((b|0)==(e|0)){break d}b=e-b|0;if(b&3){break d}e=b>>>2|0;f=H[a+4>>2];b=H[a>>2];g=f-b>>2;e:{if(e>>>0>g>>>0){ya(a,e-g|0);b=H[a>>2];f=H[a+4>>2];break e}if(e>>>0>=g>>>0){break e}f=(e<<2)+b|0;H[a+4>>2]=f}if((b|0)!=(f|0)){e=b;b=H[c+28>>2];qa(e,b,H[c+32>>2]-b|0);break d}Ca();v()}b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d>>2]=H[a>>2];H[d+4>>2]=H[a+4>>2];H[d+8>>2]=H[a+8>>2];if(F[a+27|0]<0){oa(H[a+16>>2])}ca=a+32|0;break a}Na();v()}}function Be(a){a=a|0;var b=0,c=0,d=0,e=0;H[a>>2]=11384;d=H[a+368>>2];H[a+368>>2]=0;if(d){e=d-4|0;b=H[e>>2];if(b){c=(b<<4)+d|0;while(1){c=c-16|0;if((d|0)!=(c|0)){continue}break}}oa(e)}Yc(a+216|0);b=H[a+196>>2];if(b){H[a+200>>2]=b;oa(b)}b=H[a+184>>2];if(b){H[a+188>>2]=b;oa(b)}b=H[a+172>>2];if(b){H[a+176>>2]=b;oa(b)}b=H[a+160>>2];if(b){H[a+164>>2]=b;oa(b)}c=H[a+144>>2];if(c){while(1){b=H[c>>2];oa(c);c=b;if(b){continue}break}}b=H[a+136>>2];H[a+136>>2]=0;if(b){oa(b)}b=H[a+120>>2];if(b){oa(b)}b=H[a+108>>2];if(b){oa(b)}b=H[a+96>>2];if(b){oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}b=H[a+36>>2];if(b){H[a+40>>2]=b;oa(b)}b=H[a+24>>2];if(b){H[a+28>>2]=b;oa(b)}b=H[a+12>>2];if(b){H[a+16>>2]=b;oa(b)}b=H[a+8>>2];H[a+8>>2]=0;if(b){cb(b)}return a|0}function Ug(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=ca-16|0;ca=d;a:{e=Ma(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){f=(e|15)+1|0;a=pa(f);H[d+8>>2]=f|-2147483648;H[d>>2]=a;H[d+4>>2]=e;f=a+e|0;break c}F[d+11|0]=e;f=d+e|0;a=d;if(!e){break b}}qa(a,c,e)}F[f|0]=0;c=I[d+11|0];e=c<<24>>24;b=H[b+4>>2];a=0;d:{if(!b){break d}a=c;c=(e|0)<0;a=c?H[d+4>>2]:a;f=c?H[d>>2]:d;while(1){c=I[b+27|0];g=c<<24>>24<0;c=g?H[b+20>>2]:c;i=c>>>0>>0;e:{f:{g:{h:{i:{j:{h=i?c:a;if(h){g=g?H[b+16>>2]:b+16|0;j=Fa(f,g,h);if(j){break j}if(a>>>0>=c>>>0){break i}break e}if(a>>>0>=c>>>0){break h}break e}if((j|0)<0){break e}}c=Fa(g,f,h);if(c){break g}}if(i){break f}a=1;break d}if((c|0)<0){break f}a=1;break d}b=b+4|0}b=H[b>>2];if(b){continue}break}a=0}if((e|0)<0){oa(H[d>>2])}ca=d+16|0;break a}Na();v()}return a|0}function fd(a,b){var c=0,d=0;c=H[b+8>>2];H[a+4>>2]=H[b+4>>2];H[a+8>>2]=c;H[a+20>>2]=H[b+20>>2];c=H[b+16>>2];H[a+12>>2]=H[b+12>>2];H[a+16>>2]=c;a:{b:{if((a|0)!=(b|0)){c=H[b+28>>2];if(c){d=H[a+24>>2];if(H[a+32>>2]<<5>>>0>>0){if(d){oa(d);H[a+32>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;c=H[b+28>>2]}if((c|0)<0){break b}c=(c-1>>>5|0)+1|0;d=pa(c<<2);H[a+32>>2]=c;H[a+28>>2]=0;H[a+24>>2]=d;c=H[b+28>>2]}va(d,H[b+24>>2],(c-1>>>3&536870908)+4|0);c=H[b+28>>2]}else{c=0}H[a+28>>2]=c;c=H[b+40>>2];if(c){d=H[a+36>>2];if(H[a+44>>2]<<5>>>0>>0){if(d){oa(d);H[a+44>>2]=0;H[a+36>>2]=0;H[a+40>>2]=0;c=H[b+40>>2]}if((c|0)<0){break a}c=(c-1>>>5|0)+1|0;d=pa(c<<2);H[a+44>>2]=c;H[a+40>>2]=0;H[a+36>>2]=d;c=H[b+40>>2]}va(d,H[b+36>>2],(c-1>>>3&536870908)+4|0);b=H[b+40>>2]}else{b=0}H[a+40>>2]=b}return}sa();v()}sa();v()}function uc(a){var b=0,c=0,d=0;b=H[a+8>>2];d=H[a>>2];a:{if(I[a+12|0]){b:{c:{d:{e:{if((b|0)==-1){break e}c=b+1|0;b=(c>>>0)%3|0?c:b-2|0;if((b|0)==-1){break e}b=H[H[d+12>>2]+(b<<2)>>2];if((b|0)!=-1){break d}}H[a+8>>2]=-1;break c}c=b+1|0;b=(c>>>0)%3|0?c:b-2|0;H[a+8>>2]=b;if((b|0)!=-1){break b}}c=H[a+4>>2];b=-1;f:{if((c|0)==-1){break f}g:{if((c>>>0)%3|0){c=c-1|0;break g}c=c+2|0;b=-1;if((c|0)==-1){break f}}c=H[H[d+12>>2]+(c<<2)>>2];b=-1;if((c|0)==-1){break f}b=c-1|0;if((c>>>0)%3|0){break f}b=c+2|0}F[a+12|0]=0;H[a+8>>2]=b;return}if((b|0)!=H[a+4>>2]){break a}H[a+8>>2]=-1;return}c=-1;h:{if((b|0)==-1){break h}i:{if((b>>>0)%3|0){b=b-1|0;break i}b=b+2|0;c=-1;if((b|0)==-1){break h}}b=H[H[d+12>>2]+(b<<2)>>2];c=-1;if((b|0)==-1){break h}c=b-1|0;if((b>>>0)%3|0){break h}c=b+2|0}H[a+8>>2]=c}}function Rf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;f=ca-32|0;ca=f;d=H[a+28>>2];H[f+16>>2]=d;g=H[a+20>>2];H[f+28>>2]=c;H[f+24>>2]=b;b=g-d|0;H[f+20>>2]=b;g=b+c|0;i=2;a:{b:{b=f+16|0;d=Z(H[a+60>>2],b|0,2,f+12|0)|0;if(d){H[3992]=d;d=-1}else{d=0}c:{d:{if(d){d=b;break d}while(1){e=H[f+12>>2];if((e|0)==(g|0)){break c}if((e|0)<0){d=b;break b}h=H[b+4>>2];j=h>>>0>>0;d=(j<<3)+b|0;h=e-(j?h:0)|0;H[d>>2]=h+H[d>>2];b=(j?12:4)+b|0;H[b>>2]=H[b>>2]-h;g=g-e|0;b=d;i=i-j|0;e=Z(H[a+60>>2],b|0,i|0,f+12|0)|0;if(e){H[3992]=e;e=-1}else{e=0}if(!e){continue}break}}if((g|0)!=-1){break b}}b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];a=c;break a}H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=H[a>>2]|32;a=0;if((i|0)==2){break a}a=c-H[d+4>>2]|0}ca=f+32|0;return a|0}function Ih(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=H[a+4>>2];d=H[e>>2];a:{b=H[a+12>>2];c=H[b+56>>2]-H[b+52>>2]|0;f=c>>2;b:{if(f>>>0<=H[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=H[e+4>>2];c=pa(c);f=c+(f<<2)|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[e+8>>2]=f;H[e+4>>2]=g;H[e>>2]=c;if(!d){break b}oa(d)}e=a+8|0;b=H[a+76>>2];c:{if(b){d=H[b>>2];if((d|0)==H[b+4>>2]){return 1}b=0;while(1){c=we(e,H[(b<<2)+d>>2]);if(!c){break c}f=H[a+76>>2];d=H[f>>2];b=b+1|0;if(b>>>0>2]-d>>2>>>0){continue}break}break c}c=1;a=H[H[a+12>>2]+64>>2];a=H[a+4>>2]-H[a>>2]|0;if(a>>>0<12){break c}a=(a>>2>>>0)/3|0;b=0;while(1){c=we(e,N(b,3));if(!c){break c}b=b+1|0;if((a|0)!=(b|0)){continue}break}}return c|0}sa();v()}function Oh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=H[a+4>>2];d=H[e>>2];a:{b=H[a+12>>2];c=H[b+28>>2]-H[b+24>>2]|0;f=c>>2;b:{if(f>>>0<=H[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=H[e+4>>2];c=pa(c);f=c+(f<<2)|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[e+8>>2]=f;H[e+4>>2]=g;H[e>>2]=c;if(!d){break b}oa(d)}e=a+8|0;b=H[a+76>>2];c:{if(b){d=H[b>>2];if((d|0)==H[b+4>>2]){return 1}b=0;while(1){c=xe(e,H[(b<<2)+d>>2]);if(!c){break c}f=H[a+76>>2];d=H[f>>2];b=b+1|0;if(b>>>0>2]-d>>2>>>0){continue}break}break c}c=1;a=H[a+12>>2];a=H[a+4>>2]-H[a>>2]|0;if(a>>>0<12){break c}a=(a>>2>>>0)/3|0;b=0;while(1){c=xe(e,N(b,3));if(!c){break c}b=b+1|0;if((a|0)!=(b|0)){continue}break}}return c|0}sa();v()}function Te(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=H[b+8>>2];h=H[b+12>>2];c=H[b+20>>2];i=c;e=H[b+16>>2];d=e+4|0;c=d>>>0<4?c+1|0:c;a:{if(d>>>0>g>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}j=H[b>>2];f=e+j|0;f=I[f|0]|I[f+1|0]<<8|(I[f+2|0]<<16|I[f+3|0]<<24);H[b+16>>2]=d;H[b+20>>2]=c;k=J[b+38>>1];if(k>>>0<=513){c=i;d=e+8|0;c=d>>>0<8?c+1|0:c;if(d>>>0>g>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break a}H[b+16>>2]=d;H[b+20>>2]=c}if(!(f&1)){break a}e=Q(f)^31;if(e-1>>>0>28){break a}H[a+8>>2]=e+1;i=-2<>2]=e;H[a+12>>2]=i^-1;H[a+24>>2]=e>>1;L[a+20>>2]=O(2)/O(e|0);if(k>>>0<=513){if((c|0)>=(h|0)&d>>>0>=g>>>0|(c|0)>(h|0)){break a}g=I[d+j|0];d=d+1|0;c=d?c:c+1|0;H[b+16>>2]=d;H[b+20>>2]=c;if(g>>>0>1){break a}H[a+72>>2]=g}l=ta(a+96|0,b)}return l|0}function Se(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=H[b+8>>2];g=H[b+12>>2];c=H[b+20>>2];h=c;i=H[b+16>>2];e=i+4|0;c=e>>>0<4?c+1|0:c;a:{if(e>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}j=H[b>>2];d=i+j|0;d=I[d|0]|I[d+1|0]<<8|(I[d+2|0]<<16|I[d+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=c;c=h;e=i+8|0;c=e>>>0<8?c+1|0:c;if(e>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}H[b+16>>2]=e;H[b+20>>2]=c;if(!(d&1)){break a}d=Q(d)^31;if(d-1>>>0>28){break a}H[a+8>>2]=d+1;k=-2<>2]=d;H[a+12>>2]=k^-1;H[a+24>>2]=d>>1;L[a+20>>2]=O(2)/O(d|0);if(J[b+38>>1]<=513){if((c|0)>=(g|0)&e>>>0>=f>>>0|(c|0)>(g|0)){break a}c=I[e+j|0];f=i+9|0;h=f>>>0<9?h+1|0:h;H[b+16>>2]=f;H[b+20>>2]=h;if(c>>>0>1){break a}H[a+72>>2]=c}l=ta(a+96|0,b)}return l|0} function va(a,b,c){var d=0,e=0;a:{if((a|0)==(b|0)){break a}e=a+c|0;if(b-e>>>0<=0-(c<<1)>>>0){return qa(a,b,c)}d=(a^b)&3;b:{c:{if(a>>>0>>0){if(d){d=a;break b}if(!(a&3)){d=a;break c}d=a;while(1){if(!c){break a}F[d|0]=I[b|0];b=b+1|0;c=c-1|0;d=d+1|0;if(d&3){continue}break}break c}d:{if(d){break d}if(e&3){while(1){if(!c){break a}c=c-1|0;d=c+a|0;F[d|0]=I[b+c|0];if(d&3){continue}break}}if(c>>>0<=3){break d}while(1){c=c-4|0;H[c+a>>2]=H[b+c>>2];if(c>>>0>3){continue}break}}if(!c){break a}while(1){c=c-1|0;F[c+a|0]=I[b+c|0];if(c){continue}break}break a}if(c>>>0<=3){break b}while(1){H[d>>2]=H[b>>2];b=b+4|0;d=d+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}while(1){F[d|0]=I[b|0];d=d+1|0;b=b+1|0;c=c-1|0;if(c){continue}break}}return a}function ff(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=H[c+12>>2];f=h;e=H[c+20>>2];i=H[c+8>>2];g=H[c+16>>2];a:{if((f|0)<=(e|0)&i>>>0<=g>>>0|(e|0)>(f|0)){break a}j=H[c>>2];k=F[j+g|0];d=e;f=g+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;b:{if((k|0)==-2){break b}if((d|0)>=(h|0)&f>>>0>=i>>>0|(d|0)>(h|0)){break a}d=F[f+j|0];g=g+2|0;e=g>>>0<2?e+1|0:e;H[c+16>>2]=g;H[c+20>>2]=e;if((d-4&255)>>>0<251){break a}e=ea[H[H[a>>2]+40>>2]](a,k,d)|0;d=H[a+20>>2];H[a+20>>2]=e;if(!d){break b}ea[H[H[d>>2]+4>>2]](d)}d=H[a+20>>2];if(d){if(!(ea[H[H[a>>2]+28>>2]](a,d)|0)){break a}}if(!(ea[H[H[a>>2]+36>>2]](a,b,c)|0)){break a}c=H[a+4>>2];if(!(!c|I[c+36|0]>1)){if(!(ea[H[H[a>>2]+48>>2]](a,H[b+4>>2]-H[b>>2]>>2)|0)){break a}}l=1}return l|0}function Vb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=H[a+8>>2];c=H[a+4>>2];if(d-c>>2>>>0>=b>>>0){if(b){b=b<<2;c=ra(c,0,b)+b|0}H[a+4>>2]=c;return}a:{b:{c:{g=H[a>>2];f=c-g>>2;e=f+b|0;if(e>>>0<1073741824){d=d-g|0;h=d>>>1|0;e=d>>>0>=2147483644?1073741823:e>>>0>>0?h:e;if(e){if(e>>>0>=1073741824){break c}i=pa(e<<2)}d=(f<<2)+i|0;f=b<<2;b=ra(d,0,f);f=b+f|0;e=(e<<2)+i|0;if((c|0)==(g|0)){break b}while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;d=d-4|0;H[d>>2]=b;if((c|0)!=(g|0)){continue}break}H[a+8>>2]=e;b=H[a+4>>2];H[a+4>>2]=f;c=H[a>>2];H[a>>2]=d;if((b|0)==(c|0)){break a}while(1){b=b-4|0;a=H[b>>2];H[b>>2]=0;if(a){ea[H[H[a>>2]+4>>2]](a)}if((b|0)!=(c|0)){continue}break}break a}sa();v()}wa();v()}H[a+8>>2]=e;H[a+4>>2]=f;H[a>>2]=b}if(c){oa(c)}}function Md(a,b,c){a:{switch(b-9|0){case 0:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];return;case 6:b=H[c>>2];H[c>>2]=b+4;b=G[b>>1];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 7:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=J[b>>1];H[a+4>>2]=0;return;case 8:b=H[c>>2];H[c>>2]=b+4;b=F[b|0];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 9:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=I[b|0];H[a+4>>2]=0;return;case 16:b=H[c>>2]+7&-8;H[c>>2]=b+8;M[a>>3]=M[b>>3];return;case 17:v();default:return;case 1:case 4:case 14:b=H[c>>2];H[c>>2]=b+4;b=H[b>>2];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];H[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=H[c>>2]+7&-8;H[c>>2]=b+8;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c}function Ed(a,b){var c=0,d=0,e=0;c=ca+-64|0;ca=c;d=H[a>>2];e=H[d-4>>2];d=H[d-8>>2];H[c+32>>2]=0;H[c+36>>2]=0;H[c+40>>2]=0;H[c+44>>2]=0;H[c+48>>2]=0;H[c+52>>2]=0;F[c+55|0]=0;F[c+56|0]=0;F[c+57|0]=0;F[c+58|0]=0;F[c+59|0]=0;F[c+60|0]=0;F[c+61|0]=0;F[c+62|0]=0;H[c+24>>2]=0;H[c+28>>2]=0;H[c+20>>2]=0;H[c+16>>2]=14924;H[c+12>>2]=a;H[c+8>>2]=b;a=a+d|0;d=0;a:{if(Ya(e,b,0)){H[c+56>>2]=1;ea[H[H[e>>2]+20>>2]](e,c+8|0,a,a,1,0);d=H[c+32>>2]==1?a:0;break a}ea[H[H[e>>2]+24>>2]](e,c+8|0,a,1,0);b:{switch(H[c+44>>2]){case 0:d=H[c+48>>2]==1?H[c+36>>2]==1?H[c+40>>2]==1?H[c+28>>2]:0:0:0;break a;case 1:break b;default:break a}}if(H[c+32>>2]!=1){if(H[c+48>>2]|H[c+36>>2]!=1|H[c+40>>2]!=1){break a}}d=H[c+24>>2]}ca=c- -64|0;return d}function ua(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;H[a+16>>2]=0;e=H[a>>2];H[a+4>>2]=e;H[a+12>>2]=e;e=H[b+8>>2];c=H[b+12>>2];h=c;d=H[b+20>>2];f=H[b+16>>2];g=f+4|0;d=g>>>0<4?d+1|0:d;a:{if(e>>>0>>0&(d|0)>=(c|0)|(d|0)>(c|0)){break a}c=f+H[b>>2]|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[b+16>>2]=g;H[b+20>>2]=d;if(!c|c&3){break a}f=h-(d+(e>>>0>>0)|0)|0;if(e-g>>>0>>0&(f|0)<=0|(f|0)<0){break a}if(c>>>0>=4){ya(a,c>>>2|0);h=H[b+12>>2];g=H[b+16>>2];d=H[b+20>>2];e=H[b+8>>2]}f=c+g|0;d=f>>>0>>0?d+1|0:d;if(e>>>0>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break a}qa(H[a>>2],H[b>>2]+g|0,c);d=H[b+20>>2];e=c+H[b+16>>2]|0;d=e>>>0>>0?d+1|0:d;H[b+16>>2]=e;H[b+20>>2]=d;H[a+16>>2]=0;H[a+12>>2]=H[a>>2];i=1}return i}function de(a,b){var c=0,d=0,e=0,f=0;d=-1;e=-1;f=-1;a:{b:{if((b|0)==-1){break b}e=H[H[H[a+4>>2]+12>>2]+(b<<2)>>2];c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;if((c|0)>=0){f=(c>>>0)/3|0;f=H[(H[H[a>>2]+96>>2]+N(f,12)|0)+(c-N(f,3)<<2)>>2]}c:{if((e|0)==-1){break c}c=((e>>>0)%3|0?-1:2)+e|0;if((c|0)<0){break c}d=(c>>>0)/3|0;d=H[(H[H[a>>2]+96>>2]+N(d,12)|0)+(c-N(d,3)<<2)>>2]}c=-1;if((d|0)!=(f|0)){break a}f=-1;d:{b=((b>>>0)%3|0?-1:2)+b|0;if((b|0)>=0){d=(b>>>0)/3|0;d=H[(H[H[a>>2]+96>>2]+N(d,12)|0)+(b-N(d,3)<<2)>>2];if((e|0)==-1){break b}break d}d=-1;if((e|0)!=-1){break d}break b}b=e+1|0;b=(b>>>0)%3|0?b:e-2|0;if((b|0)<0){break b}c=H[H[a>>2]+96>>2];a=(b>>>0)/3|0;f=H[(c+N(a,12)|0)+(b-N(a,3)<<2)>>2]}c=(d|0)!=(f|0)?-1:e}return c}function Ah(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;c=pa(72);H[c+4>>2]=0;H[c+8>>2]=0;H[c>>2]=1984;H[c+12>>2]=0;H[c+16>>2]=0;H[c+20>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;H[c+32>>2]=0;H[c+36>>2]=0;H[c+40>>2]=0;H[c>>2]=2128;H[c+44>>2]=0;H[c+48>>2]=0;H[c+52>>2]=0;H[c+56>>2]=0;H[c+60>>2]=0;H[c+64>>2]=0;H[c+68>>2]=0;h=c;a:{if((b|0)>=0){g=a+8|0;c=H[a+12>>2];e=H[a+8>>2];f=c-e>>2;b:{if((f|0)>(b|0)){break b}d=b+1|0;if(b>>>0>=f>>>0){Vb(g,d-f|0);break b}if(d>>>0>=f>>>0){break b}e=(d<<2)+e|0;if((e|0)!=(c|0)){while(1){c=c-4|0;d=H[c>>2];H[c>>2]=0;if(d){ea[H[H[d>>2]+4>>2]](d)}if((c|0)!=(e|0)){continue}break}}H[a+12>>2]=e}a=H[g>>2]+(b<<2)|0;c=H[a>>2];H[a>>2]=h;if(!c){break a}}ea[H[H[c>>2]+4>>2]](c)}return(b^-1)>>>31|0}function ra(a,b,c){var d=0,e=0,f=0,g=0;a:{if(!c){break a}F[a|0]=b;d=a+c|0;F[d-1|0]=b;if(c>>>0<3){break a}F[a+2|0]=b;F[a+1|0]=b;F[d-3|0]=b;F[d-2|0]=b;if(c>>>0<7){break a}F[a+3|0]=b;F[d-4|0]=b;if(c>>>0<9){break a}d=0-a&3;e=d+a|0;b=N(b&255,16843009);H[e>>2]=b;d=c-d&-4;c=d+e|0;H[c-4>>2]=b;if(d>>>0<9){break a}H[e+8>>2]=b;H[e+4>>2]=b;H[c-8>>2]=b;H[c-12>>2]=b;if(d>>>0<25){break a}H[e+24>>2]=b;H[e+20>>2]=b;H[e+16>>2]=b;H[e+12>>2]=b;H[c-16>>2]=b;H[c-20>>2]=b;H[c-24>>2]=b;H[c-28>>2]=b;g=e&4|24;c=d-g|0;if(c>>>0<32){break a}d=Rj(b,0,1,1);f=da;b=e+g|0;while(1){H[b+24>>2]=d;H[b+28>>2]=f;H[b+16>>2]=d;H[b+20>>2]=f;H[b+8>>2]=d;H[b+12>>2]=f;H[b>>2]=d;H[b+4>>2]=f;b=b+32|0;c=c-32|0;if(c>>>0>31){continue}break}}return a}function Mj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=H[b+8>>2];e=H[b+12>>2];g=e;e=H[b+20>>2];k=e;h=H[b+16>>2];c=h+4|0;e=c>>>0<4?e+1|0:e;i=c;a:{if(c>>>0>d>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break a}j=H[b>>2];c=j+h|0;f=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[b+16>>2]=i;H[b+20>>2]=e;c=d;d=k;e=h+8|0;d=e>>>0<8?d+1|0:d;if(c>>>0>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}c=i+j|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[b+16>>2]=e;H[b+20>>2]=d;if((c|0)<(f|0)){break a}H[a+16>>2]=c;H[a+12>>2]=f;d=(c>>31)-((f>>31)+(c>>>0>>0)|0)|0;b=c-f|0;if(!d&b>>>0>2147483646|d){break a}l=1;d=b+1|0;H[a+20>>2]=d;b=d>>>1|0;H[a+24>>2]=b;H[a+28>>2]=0-b;if(d&1){break a}H[a+24>>2]=b-1}return l|0}function sd(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=a+16|0;d=H[e>>2];a:{if(!d){break a}f=H[b>>2];b=e;while(1){g=(f|0)>H[d+16>>2];b=g?b:d;d=H[(g?d+4|0:d)>>2];if(d){continue}break}if((b|0)==(e|0)|(f|0)>2]){break a}d=H[b+24>>2];if(!d){break a}f=b+20|0;b=I[c+11|0];e=b<<24>>24<0;g=e?H[c>>2]:c;b=e?H[c+4>>2]:b;while(1){e=I[d+27|0];h=e<<24>>24<0;e=h?H[d+20>>2]:e;j=e>>>0>>0;b:{c:{d:{e:{f:{g:{i=j?e:b;if(i){h=h?H[d+16>>2]:d+16|0;k=Fa(g,h,i);if(k){break g}if(b>>>0>=e>>>0){break f}break b}if(b>>>0>=e>>>0){break e}break b}if((k|0)<0){break b}}e=Fa(h,g,i);if(e){break d}}if(j){break c}return Tc(f,c)}if((e|0)<0){break c}return Tc(f,c)}d=d+4|0}d=H[d>>2];if(d){continue}break}}return Tc(a,c)}function be(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=ca-16|0;ca=d;f=H[a+24>>2];k=H[a+28>>2];a:{if((f|0)!=(k|0)){while(1){H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;a=$d(H[f>>2],b,d);g=I[d+11|0];h=g<<24>>24;i=3;b:{c:{d:{if(!a){break d}i=0;a=I[c+11|0];e=a<<24>>24;j=(h|0)<0?H[d+4>>2]:g;if((j|0)!=(((e|0)<0?H[c+4>>2]:a)|0)){break d}a=(e|0)<0?H[c>>2]:c;e=(h|0)<0;e:{if(!e){e=d;if(!h){break e}while(1){if(I[e|0]!=I[a|0]){break d}a=a+1|0;e=e+1|0;g=g-1|0;if(g){continue}break}break e}if(!j){break e}if(Fa(e?H[d>>2]:d,a,j)){break c}}l=H[f>>2];i=1}if((h|0)>=0){break b}}oa(H[d>>2])}f:{switch(i|0){case 0:case 3:break f;default:break a}}f=f+4|0;if((k|0)!=(f|0)){continue}break}}l=0}ca=d+16|0;return l}function Cb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=c-b|0;h=f>>2;d=H[a+8>>2];e=H[a>>2];if(h>>>0<=d-e>>2>>>0){d=H[a+4>>2];g=d-e|0;f=g+b|0;i=g>>2;g=i>>>0>>0?f:c;if((g|0)!=(b|0)){while(1){H[e>>2]=H[b>>2];e=e+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(h>>>0>i>>>0){if((c|0)!=(g|0)){while(1){H[d>>2]=H[f>>2];d=d+4|0;f=f+4|0;if((f|0)!=(c|0)){continue}break}}H[a+4>>2]=d;return}H[a+4>>2]=e;return}if(e){H[a+4>>2]=e;oa(e);H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d=0}a:{if((f|0)<0){break a}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:e>>>0>h>>>0?e:h;if(d>>>0>=1073741824){break a}e=d<<2;d=pa(e);H[a>>2]=d;H[a+8>>2]=d+e;if((b|0)!=(c|0)){c=b;b=(f-4&-4)+4|0;d=qa(d,c,b)+b|0}H[a+4>>2]=d;return}sa();v()}function Oa(a,b,c){var d=0,e=0,f=0;e=ca-16|0;ca=e;H[a+4>>2]=0;a:{b:{if(!b){break b}f=H[a+8>>2];d=f<<5;c:{if(d>>>0>=b>>>0){H[a+4>>2]=b;break c}H[e+8>>2]=0;H[e>>2]=0;H[e+4>>2]=0;if((b|0)<0){break a}if(d>>>0<=1073741822){f=f<<6;d=b+31&-32;d=d>>>0>>0?f:d}else{d=2147483647}pb(e,d);f=H[a>>2];H[a>>2]=H[e>>2];H[e>>2]=f;d=H[a+4>>2];H[a+4>>2]=b;H[e+4>>2]=d;d=H[a+8>>2];H[a+8>>2]=H[e+8>>2];H[e+8>>2]=d;if(!f){break c}oa(f)}d=b>>>5|0;a=H[a>>2];if(I[c|0]){if(b>>>0>=32){ra(a,255,d<<2)}if((b&-32)==(b|0)){break b}a=a+(d<<2)|0;H[a>>2]=H[a>>2]|-1>>>32-(b&31);break b}if(b>>>0>=32){ra(a,0,d<<2)}if((b&-32)==(b|0)){break b}a=a+(d<<2)|0;H[a>>2]=H[a>>2]&(-1>>>32-(b&31)^-1)}ca=e+16|0;return}sa();v()}function Hg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=ca-32|0;ca=e;a:{b:{f=Ma(c);if(f>>>0<2147483632){c:{d:{if(f>>>0>=11){a=(f|15)+1|0;g=pa(a);H[e+24>>2]=a|-2147483648;H[e+16>>2]=g;H[e+20>>2]=f;a=f+g|0;break d}F[e+27|0]=f;g=e+16|0;a=f+g|0;if(!f){break c}}qa(g,c,f)}F[a|0]=0;c=Ma(d);if(c>>>0>=2147483632){break b}e:{f:{if(c>>>0>=11){f=(c|15)+1|0;a=pa(f);H[e+8>>2]=f|-2147483648;H[e>>2]=a;H[e+4>>2]=c;g=a+c|0;break f}F[e+11|0]=c;g=c+e|0;a=e;if(!c){break e}}qa(a,d,c)}F[g|0]=0;c=H[b+4>>2];a=-1;g:{if(!c){break g}c=be(c,e+16|0,e);a=-1;if(!c){break g}a=Yd(b,H[c+24>>2])}if(F[e+11|0]<0){oa(H[e>>2])}if(F[e+27|0]<0){oa(H[e+16>>2])}ca=e+32|0;break a}Na();v()}Na();v()}return a|0}function jb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=H[b>>2];h=H[b+8>>2];i=H[b+4>>2];j=H[b>>2];d=H[a>>2];b=H[d+4>>2];a=H[d+8>>2];if(b>>>0>>0){H[b+8>>2]=h;H[b+4>>2]=i;H[b>>2]=j;H[d+4>>2]=b+12;return}a:{e=H[d>>2];g=(b-e|0)/12|0;c=g+1|0;if(c>>>0<357913942){f=(a-e|0)/12|0;a=f<<1;c=f>>>0>=178956970?357913941:a>>>0>c>>>0?a:c;if(c){if(c>>>0>=357913942){break a}f=pa(N(c,12))}else{f=0}a=f+N(g,12)|0;H[a+8>>2]=h;H[a+4>>2]=i;H[a>>2]=j;g=a+12|0;if((b|0)!=(e|0)){while(1){a=a-12|0;b=b-12|0;H[a>>2]=H[b>>2];H[a+4>>2]=H[b+4>>2];H[a+8>>2]=H[b+8>>2];if((b|0)!=(e|0)){continue}break}}H[d+8>>2]=f+N(c,12);H[d+4>>2]=g;H[d>>2]=a;if(e){oa(e)}return}sa();v()}wa();v()}function lf(a,b){a=a|0;b=b|0;a=0;a:{switch(b|0){case 0:a=pa(20);H[a+12>>2]=-1;H[a+16>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=2232;return a|0;case 1:a=pa(24);H[a+12>>2]=-1;H[a+16>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=2232;H[a+20>>2]=0;H[a>>2]=2448;return a|0;case 2:a=pa(48);H[a+12>>2]=-1;H[a+16>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=2232;H[a+20>>2]=0;H[a>>2]=2448;H[a+24>>2]=1832;H[a>>2]=11048;H[a+32>>2]=0;H[a+36>>2]=0;H[a+28>>2]=-1;H[a+40>>2]=0;H[a+44>>2]=0;return a|0;case 3:a=pa(32);H[a+12>>2]=-1;H[a+16>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=2232;H[a+20>>2]=0;H[a>>2]=2448;H[a+24>>2]=1032;H[a>>2]=7028;H[a+28>>2]=-1;break;default:break a}}return a|0}function tf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=H[b>>2];b=H[b+4>>2];d=H[H[a+8>>2]+40>>2];j=d;m=pa((d|0)<0?-1:d);i=b-f|0;e=1;a:{if((i|0)<4){break a}b=0;g=H[c+16>>2];k=d;f=g+d|0;d=0+H[c+20>>2]|0;d=f>>>0>>0?d+1|0:d;h=H[c+12>>2];e=0;if(K[c+8>>2]>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break a}e=i>>2;i=(e|0)<=1?1:e;while(1){b:{g=qa(m,H[c>>2]+g|0,j);H[c+16>>2]=f;H[c+20>>2]=d;qa(H[H[H[a+8>>2]+64>>2]>>2]+b|0,g,j);l=l+1|0;if((i|0)==(l|0)){break b}b=b+j|0;d=n+H[c+20>>2]|0;g=H[c+16>>2];f=k+g|0;d=f>>>0>>0?d+1|0:d;h=H[c+12>>2];if((d|0)<=(h|0)&K[c+8>>2]>=f>>>0|(d|0)<(h|0)){continue}}break}e=(e|0)<=(l|0)}oa(m);return e|0}function Ti(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;H[b>>2]=1;f=b+8|0;c=H[b+8>>2];d=H[b+12>>2]-c|0;if(d>>>0<=4294967291){kc(f,d+4|0);c=H[f>>2]}c=c+d|0;d=H[a+4>>2];F[c|0]=d;F[c+1|0]=d>>>8;F[c+2|0]=d>>>16;F[c+3|0]=d>>>24;c=H[a+8>>2];if((c|0)!=H[a+12>>2]){d=0;while(1){g=(d<<2)+c|0;c=H[b+8>>2];e=H[b+12>>2]-c|0;if(e>>>0<=4294967291){kc(f,e+4|0);c=H[f>>2]}c=c+e|0;e=H[g>>2];F[c|0]=e;F[c+1|0]=e>>>8;F[c+2|0]=e>>>16;F[c+3|0]=e>>>24;d=d+1|0;c=H[a+8>>2];if(d>>>0>2]-c>>2>>>0){continue}break}}c=H[b+12>>2];b=H[b+8>>2];c=c-b|0;if(c>>>0<=4294967291){kc(f,c+4|0);b=H[f>>2]}b=b+c|0;a=H[a+20>>2];F[b|0]=a;F[b+1|0]=a>>>8;F[b+2|0]=a>>>16;F[b+3|0]=a>>>24}function Aa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=c-b|0;g=f>>2;d=H[a+8>>2];e=H[a>>2];if(g>>>0<=d-e>>2>>>0){f=H[a+4>>2]-e|0;d=f+b|0;h=f>>2;f=h>>>0>>0?d:c;i=f-b|0;if((b|0)!=(f|0)){va(e,b,i)}if(g>>>0>h>>>0){b=H[a+4>>2];if((c|0)!=(f|0)){while(1){H[b>>2]=H[d>>2];b=b+4|0;d=d+4|0;if((d|0)!=(c|0)){continue}break}}H[a+4>>2]=b;return}H[a+4>>2]=e+i;return}if(e){H[a+4>>2]=e;oa(e);H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;d=0}a:{if((f|0)<0){break a}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(d>>>0>=1073741824){break a}e=d<<2;d=pa(e);H[a>>2]=d;H[a+8>>2]=d+e;if((b|0)!=(c|0)){c=b;b=(f-4&-4)+4|0;d=qa(d,c,b)+b|0}H[a+4>>2]=d;return}sa();v()}function Rb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=H[a+4>>2];if((c|0)!=H[a+8>>2]){e=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=e;H[c+8>>2]=H[b+8>>2];H[a+4>>2]=c+12;return}a:{g=H[a>>2];d=(c-g|0)/12|0;e=d+1|0;if(e>>>0<357913942){f=d<<1;f=d>>>0>=178956970?357913941:e>>>0>>0?f:e;if(f){if(f>>>0>=357913942){break a}e=pa(N(f,12))}else{e=0}d=e+N(d,12)|0;h=H[b+4>>2];H[d>>2]=H[b>>2];H[d+4>>2]=h;H[d+8>>2]=H[b+8>>2];b=d+12|0;if((c|0)!=(g|0)){while(1){c=c-12|0;h=H[c+4>>2];d=d-12|0;H[d>>2]=H[c>>2];H[d+4>>2]=h;H[d+8>>2]=H[c+8>>2];if((c|0)!=(g|0)){continue}break}c=H[a>>2]}H[a+8>>2]=e+N(f,12);H[a+4>>2]=b;H[a>>2]=d;if(c){oa(c)}return}sa();v()}wa();v()}function Qi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=ca-32|0;ca=f;g=e>>>0>1073741823?-1:e<<2;l=ra(pa(g),0,g);g=l;i=H[g>>2];g=H[g+4>>2];k=H[b+4>>2];H[f+24>>2]=H[b>>2];H[f+28>>2]=k;H[f+8>>2]=i;H[f+12>>2]=g;i=a+8|0;rc(f+16|0,i,f+8|0,f+24|0);H[c>>2]=H[f+16>>2];H[c+4>>2]=H[f+20>>2];if((d|0)>(e|0)){k=0-e<<2;a=e;while(1){h=a<<2;g=h+c|0;j=g+k|0;m=H[j>>2];j=H[j+4>>2];h=b+h|0;n=H[h+4>>2];H[f+24>>2]=H[h>>2];H[f+28>>2]=n;H[f+8>>2]=m;H[f+12>>2]=j;rc(f+16|0,i,f+8|0,f+24|0);H[g>>2]=H[f+16>>2];H[g+4>>2]=H[f+20>>2];a=a+e|0;if((d|0)>(a|0)){continue}break}}oa(l);ca=f+32|0;return 1}function Hi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=ca-32|0;ca=f;h=e>>>0>1073741823?-1:e<<2;h=ra(pa(h),0,h);g=H[b>>2];i=H[b+4>>2];k=H[h+4>>2];H[f+16>>2]=H[h>>2];H[f+20>>2]=k;H[f+8>>2]=g;H[f+12>>2]=i;i=a+8|0;qc(f+24|0,i,f+16|0,f+8|0);H[c>>2]=H[f+24>>2];H[c+4>>2]=H[f+28>>2];if((d|0)>(e|0)){k=0-e<<2;a=e;while(1){g=a<<2;j=g+b|0;m=H[j>>2];j=H[j+4>>2];g=c+g|0;l=g+k|0;n=H[l+4>>2];H[f+16>>2]=H[l>>2];H[f+20>>2]=n;H[f+8>>2]=m;H[f+12>>2]=j;qc(f+24|0,i,f+16|0,f+8|0);H[g>>2]=H[f+24>>2];H[g+4>>2]=H[f+28>>2];a=a+e|0;if((d|0)>(a|0)){continue}break}}oa(h);ca=f+32|0;return 1}function Ag(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:{if(K[b+80>>2]>65535){break a}a=H[b+100>>2];b=H[b+96>>2];e=(a-b|0)/12|0;f=N(e,6);g=(f|0)==(c|0);if((a|0)==(b|0)|(c|0)!=(f|0)){break a}g=1;c=e>>>0<=1?1:e;i=c&1;a=0;if(e>>>0>=2){j=c&-2;c=0;while(1){f=N(a,6);h=f+d|0;e=b+N(a,12)|0;G[h>>1]=H[e>>2];G[(f|2)+d>>1]=H[e+4>>2];G[h+4>>1]=H[e+8>>2];f=a|1;e=N(f,6)+d|0;f=b+N(f,12)|0;G[e>>1]=H[f>>2];G[e+2>>1]=H[f+4>>2];G[e+4>>1]=H[f+8>>2];a=a+2|0;c=c+2|0;if((j|0)!=(c|0)){continue}break}}if(!i){break a}c=N(a,6)+d|0;a=b+N(a,12)|0;G[c>>1]=H[a>>2];G[c+2>>1]=H[a+4>>2];G[c+4>>1]=H[a+8>>2]}return g|0}function Gd(a,b,c,d,e,f,g){var h=0,i=0,j=0;h=ca-16|0;ca=h;if((b^-1)+2147483631>>>0>=c>>>0){if(I[a+11|0]>>>7|0){i=H[a>>2]}else{i=a}if(b>>>0<1073741799){H[h+12>>2]=b<<1;H[h>>2]=b+c;c=ca-16|0;ca=c;ca=c+16|0;c=h+12|0;c=H[(K[h>>2]>2]?c:h)>>2];if(c>>>0>=11){j=c+16&-16;c=j-1|0;c=(c|0)==11?j:c}else{c=10}c=c+1|0}else{c=2147483631}Zb(h,c);c=H[h>>2];if(f){yb(c,g,f)}g=d-e|0;if((d|0)!=(e|0)){yb(c+f|0,e+i|0,g)}if((b|0)!=10){oa(i)}H[a>>2]=c;H[a+8>>2]=H[a+8>>2]&-2147483648|H[h+4>>2]&2147483647;H[a+8>>2]=H[a+8>>2]|-2147483648;b=a;a=f+g|0;H[b+4>>2]=a;F[h+12|0]=0;F[a+c|0]=I[h+12|0];ca=h+16|0;return}Na();v()}function Rg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;a=ca-32|0;ca=a;H[a+24>>2]=0;H[a+28>>2]=0;a:{d=Ma(c);if(d>>>0<2147483632){b:{c:{if(d>>>0>=11){e=(d|15)+1|0;f=pa(e);H[a+16>>2]=e|-2147483648;H[a+8>>2]=f;H[a+12>>2]=d;e=d+f|0;break c}F[a+19|0]=d;f=a+8|0;e=f+d|0;if(!d){break b}}qa(f,c,d)}F[e|0]=0;c=b+4|0;b=nb(b,a+8|0);d:{if((c|0)==(b|0)){break d}c=H[b+32>>2];b=H[b+28>>2];if((c-b|0)!=8){break d}c=I[b+4|0]|I[b+5|0]<<8|(I[b+6|0]<<16|I[b+7|0]<<24);H[a+24>>2]=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[a+28>>2]=c}g=M[a+24>>3];if(F[a+19|0]<0){oa(H[a+8>>2])}ca=a+32|0;break a}Na();v()}return+g}function uf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;f=1;a:{if((ea[H[H[b>>2]+20>>2]](b)|0)<=0){break a}while(1){f=0;c=Zd(H[H[a+4>>2]+4>>2],ea[H[H[b>>2]+24>>2]](b,g)|0);if((c|0)==-1){break a}e=H[a+4>>2];b:{if(I[e+36|0]<=1){if(ea[H[H[b>>2]+28>>2]](b,H[H[H[e+4>>2]+8>>2]+(c<<2)>>2])|0){break b}break a}d=0;c:{if((c|0)<0){break c}h=H[e+4>>2];if(H[h+12>>2]-H[h+8>>2]>>2<=(c|0)){break c}d=H[H[e+8>>2]+(H[H[e+20>>2]+(c<<2)>>2]<<2)>>2];d=ea[H[H[d>>2]+32>>2]](d,c)|0}if(!d){break a}if(!(ea[H[H[b>>2]+28>>2]](b,d)|0)){break a}}f=1;g=g+1|0;if((ea[H[H[b>>2]+20>>2]](b)|0)>(g|0)){continue}break}}return f|0}function tb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;a:{b:{if(b){if(b>>>0>=357913942){break b}b=N(b,12);d=pa(b);H[a+4>>2]=d;H[a>>2]=d;e=b+d|0;H[a+8>>2]=e;f=H[c+4>>2];g=H[c>>2];c:{if((f|0)==(g|0)){b=b-12|0;ra(d,0,(b-((b>>>0)%12|0)|0)+12|0);break c}h=f-g|0;if((h|0)<0){break a}i=h&-4;while(1){H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;b=pa(h);H[d>>2]=b;H[d+8>>2]=b+i;c=g;while(1){H[b>>2]=H[c>>2];b=b+4|0;c=c+4|0;if((f|0)!=(c|0)){continue}break}H[d+4>>2]=b;d=d+12|0;if((e|0)!=(d|0)){continue}break}}H[a+4>>2]=e}return}sa();v()}H[d+8>>2]=0;H[d>>2]=0;H[d+4>>2]=0;sa();v()}function Vi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=H[b+8>>2];d=H[b+12>>2];g=d;d=H[b+20>>2];i=d;h=H[b+16>>2];f=h+4|0;d=f>>>0<4?d+1|0:d;a:{if(c>>>0>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}e=h+H[b>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=d;if(J[b+38>>1]<=513){f=c;c=i;d=h+8|0;c=d>>>0<8?c+1|0:c;if(d>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}H[b+16>>2]=d;H[b+20>>2]=c}if(!(e&1)){break a}b=Q(e)^31;if(b-1>>>0>28){break a}j=1;H[a+8>>2]=b+1;b=-2<>2]=c;H[a+12>>2]=b^-1;H[a+24>>2]=c>>1;L[a+20>>2]=O(2)/O(c|0)}return j|0}function Lc(a,b,c){var d=0,e=0,f=0,g=0;a:{f=b>>>0<1431655766&(b|c)>=0;b:{if(!f){break b}b=N(b,3);Kc(a,b,13648);Kc(a+12|0,b,13652);d=H[a+24>>2];c:{if(H[a+32>>2]-d>>2>>>0>=c>>>0){break c}if(c>>>0>=1073741824){break a}b=H[a+28>>2];e=c<<2;c=pa(e);e=c+e|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;H[c>>2]=H[b>>2];if((b|0)!=(d|0)){continue}break}}H[a+32>>2]=e;H[a+28>>2]=g;H[a+24>>2]=c;if(!d){break c}oa(d)}H[a+80>>2]=0;H[a+84>>2]=0;b=H[a+76>>2];H[a+76>>2]=0;if(b){oa(b)}H[a+68>>2]=0;H[a+72>>2]=0;b=a- -64|0;a=H[b>>2];H[b>>2]=0;if(!a){break b}oa(a)}return f}sa();v()}function Fe(a){var b=0,c=0,d=0,e=0,f=0;f=1;c=H[a+140>>2];a:{if((c|0)<=0){break a}b=c<<4;d=pa(c>>>0>268435455?-1:b|4);H[d>>2]=c;d=d+4|0;c=d+b|0;b=d;while(1){H[b>>2]=0;H[b+4>>2]=0;F[b+5|0]=0;F[b+6|0]=0;F[b+7|0]=0;F[b+8|0]=0;F[b+9|0]=0;F[b+10|0]=0;F[b+11|0]=0;F[b+12|0]=0;b=b+16|0;if((c|0)!=(b|0)){continue}break}e=H[a+136>>2];H[a+136>>2]=d;if(e){c=e-4|0;d=H[c>>2];if(d){b=(d<<4)+e|0;while(1){b=b-16|0;if((e|0)!=(b|0)){continue}break}}oa(c)}b=0;if(H[a+140>>2]<=0){break a}while(1){f=ta(H[a+136>>2]+(b<<4)|0,a);if(!f){break a}b=b+1|0;if((b|0)>2]){continue}break}}return f}function mb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if(H[a+64>>2]){break a}c=pa(32);H[c+16>>2]=0;H[c+20>>2]=0;H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;d=H[a+64>>2];H[a+64>>2]=c;if(!d){break a}c=H[d>>2];if(c){H[d+4>>2]=c;oa(c)}oa(d)}d=H[a+64>>2];c=H[a+28>>2]-1|0;if(c>>>0<=10){c=H[(c<<2)+13584>>2]}else{c=-1}c=N(c,I[a+24|0]);f=c>>31;g=se(d,0,Rj(c,f,b,0),da);if(g){d=H[a+64>>2];H[a>>2]=d;e=H[d+20>>2];H[a+8>>2]=H[d+16>>2];H[a+12>>2]=e;e=H[d+24>>2];d=H[d+28>>2];H[a+48>>2]=0;H[a+52>>2]=0;H[a+40>>2]=c;H[a+44>>2]=f;H[a+16>>2]=e;H[a+20>>2]=d;H[a+80>>2]=b}return g}function jc(a,b){var c=0;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;c=H[b+60>>2];H[a+56>>2]=H[b+56>>2];H[a+60>>2]=c;c=H[b+52>>2];H[a+48>>2]=H[b+48>>2];H[a+52>>2]=c;c=H[b+44>>2];H[a+40>>2]=H[b+40>>2];H[a+44>>2]=c;c=H[b+36>>2];H[a+32>>2]=H[b+32>>2];H[a+36>>2]=c;c=H[b+28>>2];H[a+24>>2]=H[b+24>>2];H[a+28>>2]=c;c=H[b+20>>2];H[a+16>>2]=H[b+16>>2];H[a+20>>2]=c;c=H[b+12>>2];H[a+8>>2]=H[b+8>>2];H[a+12>>2]=c;H[a+88>>2]=0;H[a+64>>2]=0;H[a+68>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;F[a+77|0]=0;F[a+78|0]=0;F[a+79|0]=0;F[a+80|0]=0;F[a+81|0]=0;F[a+82|0]=0;F[a+83|0]=0;F[a+84|0]=0;return a}function zg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;a=H[b+100>>2];b=H[b+96>>2];h=a-b|0;a:{if((h|0)!=(c|0)|(a|0)==(b|0)){break a}g=(c|0)/12|0;e=g>>>0<=1?1:g;j=e&1;a=0;if(g>>>0>=2){k=e&-2;g=0;while(1){e=N(a,12);i=e+d|0;f=b+e|0;H[i>>2]=H[f>>2];H[(e|4)+d>>2]=H[f+4>>2];H[i+8>>2]=H[f+8>>2];f=N(a|1,12);e=f+d|0;f=b+f|0;H[e>>2]=H[f>>2];H[e+4>>2]=H[f+4>>2];H[e+8>>2]=H[f+8>>2];a=a+2|0;g=g+2|0;if((k|0)!=(g|0)){continue}break}}if(!j){break a}e=d;d=N(a,12);a=e+d|0;b=b+d|0;H[a>>2]=H[b>>2];H[a+4>>2]=H[b+4>>2];H[a+8>>2]=H[b+8>>2]}return(c|0)==(h|0)|0}function Mi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=H[b+8>>2];d=H[b+12>>2];g=d;d=H[b+20>>2];i=d;h=H[b+16>>2];f=h+4|0;d=f>>>0<4?d+1|0:d;a:{if(c>>>0>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}e=h+H[b>>2]|0;e=I[e|0]|I[e+1|0]<<8|(I[e+2|0]<<16|I[e+3|0]<<24);H[b+16>>2]=f;H[b+20>>2]=d;f=c;c=i;d=h+8|0;c=d>>>0<8?c+1|0:c;if(d>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}H[b+16>>2]=d;H[b+20>>2]=c;if(!(e&1)){break a}b=Q(e)^31;if(b-1>>>0>28){break a}j=1;H[a+8>>2]=b+1;b=-2<>2]=c;H[a+12>>2]=b^-1;H[a+24>>2]=c>>1;L[a+20>>2]=O(2)/O(c|0)}return j|0}function nb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=a+4|0;a=H[a+4>>2];a:{b:{if(!a){break b}d=I[b+11|0];c=d<<24>>24<0;g=c?H[b>>2]:b;d=c?H[b+4>>2]:d;b=f;while(1){e=I[a+27|0];c=e<<24>>24<0;e=c?H[a+20>>2]:e;h=e>>>0>d>>>0;i=h?d:e;c:{if(i){c=Fa(c?H[a+16>>2]:a+16|0,g,i);if(c){break c}}c=d>>>0>e>>>0?-1:h}c=(c|0)<0;b=c?b:a;a=H[(c?a+4|0:a)>>2];if(a){continue}break}if((b|0)==(f|0)){break b}c=I[b+27|0];a=c<<24>>24<0;d:{c=a?H[b+20>>2]:c;e=c>>>0>>0?c:d;if(e){a=Fa(g,a?H[b+16>>2]:b+16|0,e);if(a){break d}}if(c>>>0>d>>>0){break b}break a}if((a|0)>=0){break a}}b=f}return b}function Jf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(Ya(a,H[b+8>>2],e)){if(!(H[b+28>>2]==1|H[b+4>>2]!=(c|0))){H[b+28>>2]=d}return}a:{if(Ya(a,H[b>>2],e)){if(!(H[b+16>>2]!=(c|0)&H[b+20>>2]!=(c|0))){if((d|0)!=1){break a}H[b+32>>2]=1;return}H[b+32>>2]=d;b:{if(H[b+44>>2]==4){break b}G[b+52>>1]=0;a=H[a+8>>2];ea[H[H[a>>2]+20>>2]](a,b,c,c,1,e);if(I[b+53|0]){H[b+44>>2]=3;if(!I[b+52|0]){break b}break a}H[b+44>>2]=4}H[b+20>>2]=c;H[b+40>>2]=H[b+40>>2]+1;if(H[b+36>>2]!=1|H[b+24>>2]!=2){break a}F[b+54|0]=1;return}a=H[a+8>>2];ea[H[H[a>>2]+24>>2]](a,b,c,d,e)}}function Db(a,b,c){var d=0,e=0,f=0,g=0;a:{b:{if(!b){break b}if(J[a+38>>1]<=513){f=H[a+12>>2];d=H[a+20>>2];b=H[a+16>>2];g=b+8|0;d=g>>>0<8?d+1|0:d;e=0;if(K[a+8>>2]>>0&(d|0)>=(f|0)|(d|0)>(f|0)){break a}b=b+H[a>>2]|0;d=I[b+4|0]|I[b+5|0]<<8|(I[b+6|0]<<16|I[b+7|0]<<24);H[c>>2]=I[b|0]|I[b+1|0]<<8|(I[b+2|0]<<16|I[b+3|0]<<24);H[c+4>>2]=d;b=H[a+20>>2];c=H[a+16>>2]+8|0;b=c>>>0<8?b+1|0:b;H[a+16>>2]=c;H[a+20>>2]=b;break b}e=0;if(!re(1,c,a)){break a}}F[a+36|0]=1;H[a+32>>2]=0;b=H[a+16>>2];c=b+H[a>>2]|0;H[a+24>>2]=c;H[a+28>>2]=(H[a+8>>2]-b|0)+c;e=1}return e}function ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;f=pa(64);c=pa(12);H[c+8>>2]=H[H[a+4>>2]+80>>2];H[c>>2]=13216;H[c+4>>2]=0;f=od(f,c);a:{b:{if((b|0)<0){c=f;break b}h=a+8|0;c=H[a+12>>2];e=H[a+8>>2];g=c-e>>2;c:{if((g|0)>(b|0)){break c}d=b+1|0;if(b>>>0>=g>>>0){Vb(h,d-g|0);break c}if(d>>>0>=g>>>0){break c}e=e+(d<<2)|0;if((e|0)!=(c|0)){while(1){c=c-4|0;d=H[c>>2];H[c>>2]=0;if(d){ea[H[H[d>>2]+4>>2]](d)}if((c|0)!=(e|0)){continue}break}}H[a+12>>2]=e}a=H[h>>2]+(b<<2)|0;c=H[a>>2];H[a>>2]=f;if(!c){break a}}ea[H[H[c>>2]+4>>2]](c)}return(b^-1)>>>31|0}function Qd(a,b){var c=0,d=0,e=0,f=0;d=ca-16|0;ca=d;H[d+12>>2]=b;c=ca-208|0;ca=c;H[c+204>>2]=b;b=c+160|0;ra(b,0,40);H[c+200>>2]=H[c+204>>2];a:{if((Od(0,a,c+200|0,c+80|0,b)|0)<0){break a}f=H[3941]>=0;b=H[3922];if(H[3940]<=0){H[3922]=b&-33}b:{c:{d:{if(!H[3934]){H[3934]=80;H[3929]=0;H[3926]=0;H[3927]=0;e=H[3933];H[3933]=c;break d}if(H[3926]){break c}}if(Sd(15688)){break b}}Od(15688,a,c+200|0,c+80|0,c+160|0)}if(e){ea[H[3931]](15688,0,0)|0;H[3934]=0;H[3933]=e;H[3929]=0;H[3926]=0;H[3927]=0}H[3922]=H[3922]|b&32;if(!f){break a}}ca=c+208|0;ca=d+16|0}function pf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=H[a+60>>2];a:{if(!c){break a}H[c+4>>2]=a+48;if(!(ea[H[H[c>>2]+12>>2]](c)|0)){break a}b:{c=ea[H[H[a>>2]+24>>2]](a)|0;if((c|0)<=0){break b}while(1){c:{f=H[(ea[H[H[a>>2]+28>>2]](a)|0)+4>>2];g=ea[H[H[a>>2]+20>>2]](a,d)|0;e=H[a+60>>2];if(!(ea[H[H[e>>2]+8>>2]](e,H[H[f+8>>2]+(g<<2)>>2])|0)){break c}d=d+1|0;if((c|0)!=(d|0)){continue}break b}break}return 0}d=0;if(!(ea[H[H[a>>2]+36>>2]](a,b)|0)){break a}if(!(ea[H[H[a>>2]+40>>2]](a,b)|0)){break a}d=ea[H[H[a>>2]+44>>2]](a)|0}return d|0}function id(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=H[a+216>>2];if((c|0)!=H[a+220>>2]){while(1){a:{c=H[N(e,144)+c>>2];if((c|0)<0){break a}d=H[a+4>>2];f=H[d+8>>2];if((c|0)>=H[d+12>>2]-f>>2){break a}d=0;c=H[(c<<2)+f>>2];if((ea[H[H[c>>2]+24>>2]](c)|0)<=0){break a}while(1){if((ea[H[H[c>>2]+20>>2]](c,d)|0)!=(b|0)){d=d+1|0;if((ea[H[H[c>>2]+24>>2]](c)|0)>(d|0)){continue}break a}break}a=H[a+216>>2]+N(e,144)|0;return(I[a+100|0]?a+4|0:0)|0}e=e+1|0;c=H[a+216>>2];if(e>>>0<(H[a+220>>2]-c|0)/144>>>0){continue}break}}return 0}function xb(a){var b=0,c=0,d=0,e=0;c=H[a+132>>2];if(c){d=c;b=H[a+136>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+132>>2]}H[a+136>>2]=c;oa(d)}c=H[a+120>>2];if(c){d=c;b=H[a+124>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+120>>2]}H[a+124>>2]=c;oa(d)}b=H[a+108>>2];if(b){H[a+112>>2]=b;oa(b)}b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}Za(a+76|0);Za(a+56|0);Za(a+36|0);Za(a+16|0)}function rd(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=2128;d=H[a+60>>2];if(d){b=d;c=H[a- -64>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){Ga(b)}if((c|0)!=(d|0)){continue}break}b=H[a+60>>2]}H[a+64>>2]=d;oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}d=H[a+36>>2];if(d){b=d;c=H[a+40>>2];if((b|0)!=(c|0)){while(1){c=c-24|0;ea[H[H[c>>2]>>2]](c)|0;if((c|0)!=(d|0)){continue}break}b=H[a+36>>2]}H[a+40>>2]=d;oa(b)}H[a>>2]=1984;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a+4>>2];if(b){H[a+8>>2]=b;oa(b)}return a|0}function ue(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=H[a+8>>2];d=H[a+4>>2];if(c-d>>2>>>0>=b>>>0){if(b){b=b<<2;d=ra(d,0,b)+b|0}H[a+4>>2]=d;return}a:{f=H[a>>2];g=d-f>>2;e=g+b|0;if(e>>>0<1073741824){c=c-f|0;h=c>>>1|0;e=c>>>0>=2147483644?1073741823:e>>>0>>0?h:e;if(e){if(e>>>0>=1073741824){break a}i=pa(e<<2)}c=(g<<2)+i|0;b=b<<2;b=ra(c,0,b)+b|0;if((d|0)!=(f|0)){while(1){c=c-4|0;d=d-4|0;H[c>>2]=H[d>>2];if((d|0)!=(f|0)){continue}break}}H[a+8>>2]=(e<<2)+i;H[a+4>>2]=b;H[a>>2]=c;if(f){oa(f)}return}sa();v()}wa();v()}function rb(a){var b=0,c=0,d=0,e=0,f=0;d=H[a+8>>2];a:{if(I[d+84|0]){break a}b=H[a+16>>2];if(!b|!I[b+84|0]){break a}c=H[d+72>>2];e=H[d+68>>2];F[b+84|0]=0;c=c-e>>2;f=H[b+68>>2];e=H[b+72>>2]-f>>2;b:{if(c>>>0>e>>>0){qb(b+68|0,c-e|0,2316);d=H[a+8>>2];break b}if(c>>>0>=e>>>0){break b}H[b+72>>2]=f+(c<<2)}if(I[d+84|0]){break a}c=H[d+68>>2];if((c|0)==H[d+72>>2]){break a}e=H[H[a+16>>2]+68>>2];b=0;while(1){f=b<<2;H[f+e>>2]=H[c+f>>2];b=b+1|0;c=H[d+68>>2];if(b>>>0>2]-c>>2>>>0){continue}break}}return H[a+16>>2]}function Lg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=ca+-64|0;ca=e;f=Ha(e+8|0);H[f+16>>2]=0;H[f+20>>2]=0;H[f>>2]=b;H[f+8>>2]=c;H[f+12>>2]=0;b=e+48|0;Pe(b,a,f,d);H[a+24>>2]=H[e+48>>2];f=a+24|0;a:{if((f|0)==(b|0)){break a}b=a+28|0;c=e+48|4;g=I[e+63|0];d=g<<24>>24;if(F[a+39|0]>=0){if((d|0)>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break a}Xb(b,H[e+52>>2],H[e+56>>2]);break a}a=(d|0)<0;Yb(b,a?H[e+52>>2]:c,a?H[e+56>>2]:g)}if(F[e+63|0]<0){oa(H[e+52>>2])}ca=e- -64|0;return f|0}function Kg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=ca+-64|0;ca=e;f=Ha(e+8|0);H[f+16>>2]=0;H[f+20>>2]=0;H[f>>2]=b;H[f+8>>2]=c;H[f+12>>2]=0;b=e+48|0;Oe(b,a,f,d);H[a+24>>2]=H[e+48>>2];f=a+24|0;a:{if((f|0)==(b|0)){break a}b=a+28|0;c=e+48|4;g=I[e+63|0];d=g<<24>>24;if(F[a+39|0]>=0){if((d|0)>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break a}Xb(b,H[e+52>>2],H[e+56>>2]);break a}a=(d|0)<0;Yb(b,a?H[e+52>>2]:c,a?H[e+56>>2]:g)}if(F[e+63|0]<0){oa(H[e+52>>2])}ca=e- -64|0;return f|0}function Ig(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;a=ca-32|0;ca=a;a:{d=Ma(c);if(d>>>0<2147483632){b:{c:{if(d>>>0>=11){e=(d|15)+1|0;f=pa(e);H[a+24>>2]=e|-2147483648;H[a+16>>2]=f;H[a+20>>2]=d;e=d+f|0;break c}F[a+27|0]=d;f=a+16|0;e=f+d|0;if(!d){break b}}qa(f,c,d)}F[e|0]=0;F[a+4|0]=0;H[a>>2]=1701667182;F[a+11|0]=4;d=H[b+4>>2];c=-1;d:{if(!d){break d}d=be(d,a,a+16|0);c=-1;if(!d){break d}c=Yd(b,H[d+24>>2])}b=c;if(F[a+11|0]<0){oa(H[a>>2])}if(F[a+27|0]<0){oa(H[a+16>>2])}ca=a+32|0;break a}Na();v()}return b|0}function hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=H[a+216>>2];if((c|0)!=H[a+220>>2]){while(1){a:{c=H[N(e,144)+c>>2];if((c|0)<0){break a}d=H[a+4>>2];f=H[d+8>>2];if((c|0)>=H[d+12>>2]-f>>2){break a}d=0;c=H[(c<<2)+f>>2];if((ea[H[H[c>>2]+24>>2]](c)|0)<=0){break a}while(1){if((ea[H[H[c>>2]+20>>2]](c,d)|0)!=(b|0)){d=d+1|0;if((ea[H[H[c>>2]+24>>2]](c)|0)>(d|0)){continue}break a}break}return(H[a+216>>2]+N(e,144)|0)+104|0}e=e+1|0;c=H[a+216>>2];if(e>>>0<(H[a+220>>2]-c|0)/144>>>0){continue}break}}return a+184|0}function ab(a){var b=0,c=0,d=0,e=0;c=H[a+640>>2];if(c){d=c;b=H[a+644>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+640>>2]}H[a+644>>2]=c;oa(d)}c=H[a+628>>2];if(c){d=c;b=H[a+632>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+628>>2]}H[a+632>>2]=c;oa(d)}b=H[a+616>>2];if(b){H[a+620>>2]=b;oa(b)}b=H[a+604>>2];if(b){H[a+608>>2]=b;oa(b)}Za(a+584|0);Za(a+564|0);Za(a+544|0)}function Tg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=ca-16|0;ca=d;H[d+12>>2]=0;a:{e=Ma(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){f=(e|15)+1|0;a=pa(f);H[d+8>>2]=f|-2147483648;H[d>>2]=a;H[d+4>>2]=e;f=a+e|0;break c}F[d+11|0]=e;f=d+e|0;a=d;if(!e){break b}}qa(a,c,e)}F[f|0]=0;a=nb(b,d);d:{if((a|0)==(b+4|0)){break d}b=H[a+32>>2];a=H[a+28>>2];if((b-a|0)!=4){break d}H[d+12>>2]=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24)}a=H[d+12>>2];if(F[d+11|0]<0){oa(H[d>>2])}ca=d+16|0;break a}Na();v()}return a|0}function vb(a){var b=0,c=0,d=0,e=0;c=H[a+128>>2];if(c){d=c;b=H[a+132>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+128>>2]}H[a+132>>2]=c;oa(d)}c=H[a+116>>2];if(c){d=c;b=H[a+120>>2];if((c|0)!=(b|0)){while(1){d=b-12|0;e=H[d>>2];if(e){H[b-8>>2]=e;oa(e)}b=d;if((c|0)!=(b|0)){continue}break}d=H[a+116>>2]}H[a+120>>2]=c;oa(d)}b=H[a+104>>2];if(b){H[a+108>>2]=b;oa(b)}b=H[a+92>>2];if(b){H[a+96>>2]=b;oa(b)}Za(a+72|0);Za(a+52|0);Za(a+32|0)}function kc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{c=H[a+4>>2];e=H[a>>2];d=c-e|0;b:{if(d>>>0>>0){g=b-d|0;f=H[a+8>>2];if(g>>>0<=f-c>>>0){h=a,i=ra(c,0,g)+g|0,H[h+4>>2]=i;break b}if((b|0)<0){break a}c=f-e|0;f=c<<1;c=c>>>0>=1073741823?2147483647:b>>>0>>0?f:b;f=pa(c);ra(f+d|0,0,g);d=va(f,e,d);H[a+8>>2]=d+c;H[a+4>>2]=b+d;H[a>>2]=d;if(!e){break b}oa(e);break b}if(b>>>0>=d>>>0){break b}H[a+4>>2]=b+e}b=H[a+28>>2];c=b;d=b+1|0;b=H[a+24>>2]+1|0;e=b?c:d;H[a+24>>2]=b;H[a+28>>2]=e;return}sa();v()}function Ka(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=H[a+4>>2];if((e|0)!=H[a+8>>2]){H[e>>2]=H[b>>2];H[a+4>>2]=e+4;return}a:{g=H[a>>2];f=e-g|0;c=f>>2;d=c+1|0;if(d>>>0<1073741824){h=c<<2;c=f>>>1|0;c=f>>>0>=2147483644?1073741823:c>>>0>d>>>0?c:d;if(c){if(c>>>0>=1073741824){break a}f=pa(c<<2)}else{f=0}d=h+f|0;H[d>>2]=H[b>>2];b=d+4|0;if((e|0)!=(g|0)){while(1){d=d-4|0;e=e-4|0;H[d>>2]=H[e>>2];if((e|0)!=(g|0)){continue}break}}H[a+8>>2]=f+(c<<2);H[a+4>>2]=b;H[a>>2]=d;if(g){oa(g)}return}sa();v()}wa();v()}function Ia(a){H[a>>2]=-1;H[a+4>>2]=0;H[a+8>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;F[a+28|0]=1;H[a+20>>2]=0;H[a+24>>2]=0;H[a+12>>2]=0;H[a+16>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+48>>2]=0;H[a+52>>2]=0;H[a+56>>2]=0;H[a+60>>2]=0;H[a+64>>2]=0;H[a+68>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+88>>2]=0;H[a+92>>2]=0;H[a+96>>2]=0;H[a+72>>2]=a+4;H[a+104>>2]=0;H[a+108>>2]=0;F[a+100|0]=1;H[a+112>>2]=0;H[a+116>>2]=0;H[a+120>>2]=0;H[a+124>>2]=0;H[a+128>>2]=0;H[a+132>>2]=0;H[a+136>>2]=0;H[a+140>>2]=0}function Ld(a,b){if(!a){return 0}a:{b:{if(a){if(b>>>0<=127){break b}c:{if(!H[H[4292]>>2]){if((b&-128)==57216){break b}break c}if(b>>>0<=2047){F[a+1|0]=b&63|128;F[a|0]=b>>>6|192;a=2;break a}if(!((b&-8192)!=57344&b>>>0>=55296)){F[a+2|0]=b&63|128;F[a|0]=b>>>12|224;F[a+1|0]=b>>>6&63|128;a=3;break a}if(b-65536>>>0<=1048575){F[a+3|0]=b&63|128;F[a|0]=b>>>18|240;F[a+2|0]=b>>>6&63|128;F[a+1|0]=b>>>12&63|128;a=4;break a}}H[3992]=25;a=-1}else{a=1}break a}F[a|0]=b;a=1}return a}function Hb(a,b){var c=0,d=0,e=0,f=0;d=H[a+12>>2];c=H[a+16>>2]-d>>2;a:{if(c>>>0>>0){ya(a+12|0,b-c|0);break a}if(b>>>0>=c>>>0){break a}H[a+16>>2]=d+(b<<2)}b:{c=H[a>>2];c:{if(H[a+8>>2]-c>>2>>>0>=b>>>0){break c}if(b>>>0>=1073741824){break b}d=H[a+4>>2];e=b<<2;b=pa(e);e=b+e|0;f=b+(d-c&-4)|0;b=f;if((c|0)!=(d|0)){while(1){b=b-4|0;d=d-4|0;H[b>>2]=H[d>>2];if((c|0)!=(d|0)){continue}break}}H[a+8>>2]=e;H[a+4>>2]=f;H[a>>2]=b;if(!c){break c}oa(c)}return}sa();v()}function _b(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=13724;b=H[a+68>>2];if(b){H[a+72>>2]=b;oa(b)}b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}b=H[a+44>>2];if(b){H[a+48>>2]=b;oa(b)}b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}b=H[a+8>>2];if(b){d=b;c=H[a+12>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;d=H[c>>2];H[c>>2]=0;if(d){Ga(d)}if((b|0)!=(c|0)){continue}break}d=H[a+8>>2]}H[a+12>>2]=b;oa(d)}b=H[a+4>>2];H[a+4>>2]=0;if(b){Uc(b)}return a|0}function yb(a,b,c){var d=0,e=0,f=0,g=0,h=0;f=ca-16|0;ca=f;d=ca-32|0;ca=d;e=ca-16|0;ca=e;H[e+12>>2]=b;H[e+8>>2]=b+c;H[d+24>>2]=H[e+12>>2];H[d+28>>2]=H[e+8>>2];ca=e+16|0;c=ca-16|0;ca=c;h=H[d+28>>2];e=H[d+24>>2];g=h-e|0;if((e|0)!=(h|0)){va(a,e,g)}H[c+12>>2]=e+g;H[c+8>>2]=a+g;H[d+16>>2]=H[c+12>>2];H[d+20>>2]=H[c+8>>2];ca=c+16|0;H[d+12>>2]=(H[d+16>>2]-b|0)+b;H[d+8>>2]=(H[d+20>>2]-a|0)+a;H[f+8>>2]=H[d+12>>2];H[f+12>>2]=H[d+8>>2];ca=d+32|0;ca=f+16|0}function ya(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=H[a+8>>2];c=H[a+4>>2];if(e-c>>2>>>0>=b>>>0){if(b){b=b<<2;c=ra(c,0,b)+b|0}H[a+4>>2]=c;return}a:{f=c;c=H[a>>2];g=f-c|0;h=g>>2;d=h+b|0;if(d>>>0<1073741824){e=e-c|0;f=e>>>1|0;d=e>>>0>=2147483644?1073741823:d>>>0>>0?f:d;if(d){if(d>>>0>=1073741824){break a}i=pa(d<<2)}b=b<<2;e=ra((h<<2)+i|0,0,b);f=d<<2;d=va(i,c,g);H[a+8>>2]=f+d;H[a+4>>2]=b+e;H[a>>2]=d;if(c){oa(c)}return}sa();v()}wa();v()}function Tc(a,b){var c=0,d=0,e=0,f=0;c=a+4|0;a=nb(a,b);a:{if((c|0)==(a|0)){break a}b=a+28|0;b=F[a+39|0]<0?H[b>>2]:b;while(1){a=b;b=a+1|0;c=F[a|0];if((c|0)==32|c-9>>>0<5){continue}break}b:{c:{d:{c=F[a|0];switch(c-43|0){case 0:break c;case 2:break d;default:break b}}e=1}c=F[b|0];a=b}if(c-48>>>0<10){while(1){d=(N(d,10)-F[a|0]|0)+48|0;b=F[a+1|0];a=a+1|0;if(b-48>>>0<10){continue}break}}a=e?d:0-d|0;if((a|0)==-1){break a}f=(a|0)!=0}return f}function bb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a=H[a>>2];c=H[a+4>>2];e=H[a+8>>2];if(c>>>0>>0){H[c>>2]=H[b>>2];H[a+4>>2]=c+4;return}a:{d=c;c=H[a>>2];g=d-c|0;d=g>>2;f=d+1|0;if(f>>>0<1073741824){h=d<<2;e=e-c|0;d=e>>>1|0;f=e>>>0>=2147483644?1073741823:f>>>0>>0?d:f;if(f){if(f>>>0>=1073741824){break a}e=pa(f<<2)}else{e=0}d=h+e|0;H[d>>2]=H[b>>2];b=va(e,c,g);H[a+8>>2]=b+(f<<2);H[a+4>>2]=d+4;H[a>>2]=b;if(c){oa(c)}return}sa();v()}wa();v()}function ob(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=H[a+8>>2];c=H[a+4>>2];if(e-c>>3>>>0>=b>>>0){if(b){b=b<<3;c=ra(c,0,b)+b|0}H[a+4>>2]=c;return}a:{f=c;c=H[a>>2];g=f-c|0;h=g>>3;d=h+b|0;if(d>>>0<536870912){e=e-c|0;f=e>>>2|0;d=e>>>0>=2147483640?536870911:d>>>0>>0?f:d;if(d){if(d>>>0>=536870912){break a}i=pa(d<<3)}b=b<<3;e=ra((h<<3)+i|0,0,b);f=d<<3;d=va(i,c,g);H[a+8>>2]=f+d;H[a+4>>2]=b+e;H[a>>2]=d;if(c){oa(c)}return}sa();v()}wa();v()}function kf(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=2328;b=H[a+60>>2];H[a+60>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}d=H[a+36>>2];if(d){c=H[a+40>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+36>>2]}H[a+40>>2]=d;oa(b)}H[a>>2]=1984;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a+4>>2];if(b){H[a+8>>2]=b;oa(b)}return a|0}function jf(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=2328;b=H[a+60>>2];H[a+60>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}d=H[a+36>>2];if(d){c=H[a+40>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+36>>2]}H[a+40>>2]=d;oa(b)}H[a>>2]=1984;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a+4>>2];if(b){H[a+8>>2]=b;oa(b)}oa(a)}function xi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;d=ca-16|0;ca=d;e=H[a+4>>2];a:{if((e|0)==-1){break a}c=H[b+20>>2];if(!!H[b+16>>2]&(c|0)>=0|(c|0)>0){break a}Wb(b,H[b+4>>2],H[a+8>>2],H[a+12>>2]);c=H[b+20>>2];if(!!H[b+16>>2]&(c|0)>=0|(c|0)>0){break a}Wb(b,H[b+4>>2],a+20|0,a+24|0);c=H[b+20>>2];f=H[b+16>>2];F[d+15|0]=H[a+4>>2];if(!!f&(c|0)>=0|(c|0)>0){break a}Wb(b,H[b+4>>2],d+15|0,d+16|0)}ca=d+16|0;return(e|0)!=-1|0}function Eh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;a:{b=H[a+8>>2];b:{if((b|0)<0){break b}c=H[a+4>>2];e=H[c>>2];d=H[c+4>>2]-e>>2;c:{if(d>>>0>>0){ue(c,b-d|0);f=H[a+8>>2];break c}f=b;if(b>>>0>=d>>>0){break c}H[c+4>>2]=e+(b<<2);f=b}d=f;if((d|0)<=0){break b}a=H[a+4>>2];c=H[a>>2];e=H[a+4>>2]-c>>2;a=0;while(1){if((a|0)==(e|0)){break a}H[c+(a<<2)>>2]=a;a=a+1|0;if((d|0)!=(a|0)){continue}break}}return(b^-1)>>>31|0}Ca();v()}function qe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=H[a+8>>2];c=H[a+4>>2];if(e-c>>1>>>0>=b>>>0){if(b){b=b<<1;c=ra(c,0,b)+b|0}H[a+4>>2]=c;return}a:{f=c;c=H[a>>2];g=f-c|0;f=g>>1;d=f+b|0;if((d|0)>=0){e=e-c|0;d=e>>>0>=2147483646?2147483647:d>>>0>>0?e:d;if(d){if((d|0)<0){break a}h=pa(d<<1)}b=b<<1;e=ra((f<<1)+h|0,0,b);f=d<<1;d=va(h,c,g);H[a+8>>2]=f+d;H[a+4>>2]=b+e;H[a>>2]=d;if(c){oa(c)}return}sa();v()}wa();v()}function ng(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=ca-16|0;ca=d;Pe(d,a,b,c);H[a+24>>2]=H[d>>2];e=a+24|0;a:{if((e|0)==(d|0)){break a}b=a+28|0;c=d|4;f=I[d+15|0];g=f<<24>>24;if(F[a+39|0]>=0){if((g|0)>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break a}Xb(b,H[d+4>>2],H[d+8>>2]);break a}a=(g|0)<0;Yb(b,a?H[d+4>>2]:c,a?H[d+8>>2]:f)}if(F[d+15|0]<0){oa(H[d+4>>2])}ca=d+16|0;return e|0}function mg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=ca-16|0;ca=d;Oe(d,a,b,c);H[a+24>>2]=H[d>>2];e=a+24|0;a:{if((e|0)==(d|0)){break a}b=a+28|0;c=d|4;f=I[d+15|0];g=f<<24>>24;if(F[a+39|0]>=0){if((g|0)>=0){a=H[c+4>>2];H[b>>2]=H[c>>2];H[b+4>>2]=a;H[b+8>>2]=H[c+8>>2];break a}Xb(b,H[d+4>>2],H[d+8>>2]);break a}a=(g|0)<0;Yb(b,a?H[d+4>>2]:c,a?H[d+8>>2]:f)}if(F[d+15|0]<0){oa(H[d+4>>2])}ca=d+16|0;return e|0}function za(a,b,c){var d=0,e=0,f=0,g=0;e=ca-16|0;ca=e;a:{b:{if(c>>>0<11){d=a;F[a+11|0]=I[a+11|0]&128|c;F[a+11|0]=I[a+11|0]&127;break b}if(c>>>0>2147483631){break a}g=e+8|0;if(c>>>0>=11){f=c+16&-16;d=f-1|0;d=(d|0)==11?f:d}else{d=10}Zb(g,d+1|0);d=H[e+8>>2];H[a>>2]=d;H[a+8>>2]=H[a+8>>2]&-2147483648|H[e+12>>2]&2147483647;H[a+8>>2]=H[a+8>>2]|-2147483648;H[a+4>>2]=c}yb(d,b,c+1|0);ca=e+16|0;return}Na();v()}function Qg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=ca-16|0;ca=d;a:{e=Ma(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){g=(e|15)+1|0;f=pa(g);H[d+8>>2]=g|-2147483648;H[d>>2]=f;H[d+4>>2]=e;g=e+f|0;break c}F[d+11|0]=e;g=d+e|0;f=d;if(!e){break b}}qa(f,c,e)}F[g|0]=0;f=a+16|0;c=$d(b,d,f);b=H[a+16>>2];a=F[a+27|0];if(F[d+11|0]<0){oa(H[d>>2])}ca=d+16|0;a=c?(a|0)<0?b:f:0;break a}Na();v()}return a|0}function Mc(a,b){var c=0,d=0,e=0;c=H[a+4>>2];d=c+b|0;H[a+4>>2]=d;if(!((d-1^c-1)>>>0<32?c:0)){H[H[a>>2]+((d>>>0>=33?d-1>>>5|0:0)<<2)>>2]=0}a:{if(!b){break a}a=H[a>>2]+(c>>>3&536870908)|0;c=c&31;if(c){d=32-c|0;e=b>>>0>d>>>0?d:b;H[a>>2]=H[a>>2]&(-1<>>d-e^-1);b=b-e|0;a=a+4|0}c=b>>>5|0;if(b>>>0>=32){ra(a,0,c<<2)}if((b&-32)==(b|0)){break a}a=(c<<2)+a|0;H[a>>2]=H[a>>2]&(-1>>>32-(b&31)^-1)}}function Fc(a,b,c){var d=0,e=0,f=0;d=H[c+16>>2];a:{if(!d){if(Sd(c)){break a}d=H[c+16>>2]}f=H[c+20>>2];if(d-f>>>0>>0){return ea[H[c+36>>2]](c,a,b)|0}b:{if(H[c+80>>2]<0){d=0;break b}e=b;while(1){d=e;if(!d){d=0;break b}e=d-1|0;if(I[e+a|0]!=10){continue}break}e=ea[H[c+36>>2]](c,a,d)|0;if(e>>>0>>0){break a}a=a+d|0;b=b-d|0;f=H[c+20>>2]}qa(f,a,b);H[c+20>>2]=H[c+20>>2]+b;e=b+d|0}return e}function ad(a){var b=0,c=0,d=0,e=0;if(I[a+76|0]){F[a+76|0]=0;e=H[a+60>>2];c=H[a+72>>2]+7|0;b=c>>>0<7?1:b;d=b<<29|c>>>3;c=d+H[a+56>>2]|0;b=(b>>>3|0)+e|0;H[a+56>>2]=c;H[a+60>>2]=c>>>0>>0?b+1|0:b}if(J[a+38>>1]<=513){F[a+132|0]=0;e=H[a+116>>2];b=0;c=H[a+128>>2]+7|0;b=c>>>0<7?1:b;d=b<<29|c>>>3;c=d+H[a+112>>2]|0;b=(b>>>3|0)+e|0;H[a+112>>2]=c;H[a+116>>2]=c>>>0>>0?b+1|0:b}}function re(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>10){break a}d=H[c+20>>2];f=H[c+12>>2];e=H[c+16>>2];if((d|0)>=(f|0)&e>>>0>=K[c+8>>2]|(d|0)>(f|0)){break a}f=F[e+H[c>>2]|0];e=e+1|0;d=e?d:d+1|0;H[c+16>>2]=e;H[c+20>>2]=d;d=f;b:{if((d|0)<0){if(!re(a+1|0,b,c)){break a}a=H[b>>2];d=d&127|a<<7;a=H[b+4>>2]<<7|a>>>25;break b}d=d&255;a=0}H[b>>2]=d;H[b+4>>2]=a;g=1}return g}function gb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>10){break a}d=H[c+20>>2];f=H[c+12>>2];e=H[c+16>>2];if((d|0)>=(f|0)&e>>>0>=K[c+8>>2]|(d|0)>(f|0)){break a}f=F[e+H[c>>2]|0];e=e+1|0;d=e?d:d+1|0;H[c+16>>2]=e;H[c+20>>2]=d;d=f;b:{if((d|0)<0){if(!gb(a+1|0,b,c)){break a}a=H[b>>2];d=d&127|a<<7;a=H[b+4>>2]<<7|a>>>25;break b}d=d&255;a=0}H[b>>2]=d;H[b+4>>2]=a;g=1}return g}function Nh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=ca+-64|0;ca=e;d=ea[H[H[a>>2]+44>>2]](a,b)|0;a=ea[H[H[a>>2]+40>>2]](a,b)|0;f=Eb(e);g=H[b+56>>2];h=d&255;i=a;a=a-1|0;if(a>>>0<=10){a=H[(a<<2)+13584>>2]}else{a=-1}d=N(a,d);lc(f,g,h,i,0,d,d>>31);a=jc(pa(96),f);mb(a,c);F[a+84|0]=1;H[a+72>>2]=H[a+68>>2];H[a+60>>2]=H[b+60>>2];ca=e- -64|0;return a|0}function If(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(Ya(a,H[b+8>>2],e)){if(!(H[b+28>>2]==1|H[b+4>>2]!=(c|0))){H[b+28>>2]=d}return}a:{if(!Ya(a,H[b>>2],e)){break a}if(!(H[b+16>>2]!=(c|0)&H[b+20>>2]!=(c|0))){if((d|0)!=1){break a}H[b+32>>2]=1;return}H[b+20>>2]=c;H[b+32>>2]=d;H[b+40>>2]=H[b+40>>2]+1;if(!(H[b+36>>2]!=1|H[b+24>>2]!=2)){F[b+54|0]=1}H[b+44>>2]=4}}function Bh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=H[a+32>>2];b=e;h=H[b+8>>2];g=H[b+12>>2];c=H[b+16>>2];b=H[b+20>>2];f=c+4|0;b=f>>>0<4?b+1|0:b;d=0;a:{if(f>>>0>h>>>0&(b|0)>=(g|0)|(b|0)>(g|0)){break a}c=H[e>>2]+c|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[e+16>>2]=f;H[e+20>>2]=b;d=0;if((c|0)<0){break a}H[H[a+4>>2]+80>>2]=c;d=1}return d|0}function qi(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=11276;b=H[a+48>>2];H[a+48>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=13280;b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}d=H[a+8>>2];if(d){c=H[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+8>>2]}H[a+12>>2]=d;oa(b)}return a|0}function Ee(a,b){var c=0,d=0,e=0,f=0;H[a+144>>2]=b;c=H[(ea[H[H[b>>2]+32>>2]](b)|0)+32>>2];c=H[c>>2]+H[c+16>>2]|0;d=H[(ea[H[H[b>>2]+32>>2]](b)|0)+32>>2];d=H[d+8>>2]-H[d+16>>2]|0;e=a,f=J[H[(ea[H[H[b>>2]+32>>2]](b)|0)+32>>2]+38>>1],G[e+38>>1]=f;H[a>>2]=c;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=d;H[a+12>>2]=0;e=a,f=ea[H[H[b>>2]+36>>2]](b)|0,H[e+148>>2]=f}function Cd(a,b,c,d){F[a+53|0]=1;a:{if(H[a+4>>2]!=(c|0)){break a}F[a+52|0]=1;c=H[a+16>>2];b:{if(!c){H[a+36>>2]=1;H[a+24>>2]=d;H[a+16>>2]=b;if((d|0)!=1){break a}if(H[a+48>>2]==1){break b}break a}if((b|0)==(c|0)){c=H[a+24>>2];if((c|0)==2){H[a+24>>2]=d;c=d}if(H[a+48>>2]!=1){break a}if((c|0)==1){break b}break a}H[a+36>>2]=H[a+36>>2]+1}F[a+54|0]=1}}function pi(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=11276;b=H[a+48>>2];H[a+48>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=13280;b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}d=H[a+8>>2];if(d){c=H[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+8>>2]}H[a+12>>2]=d;oa(b)}oa(a)}function zh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=H[a+32>>2];b=e;g=H[b+8>>2];d=H[b+12>>2];c=H[b+16>>2];b=H[b+20>>2];f=d;d=c+4|0;b=d>>>0<4?b+1|0:b;if((f|0)>=(b|0)&d>>>0<=g>>>0|(b|0)<(f|0)){c=H[e>>2]+c|0;c=I[c|0]|I[c+1|0]<<8|(I[c+2|0]<<16|I[c+3|0]<<24);H[e+16>>2]=d;H[e+20>>2]=b;H[H[a+4>>2]+80>>2]=c}return(b|0)<=(f|0)&d>>>0<=g>>>0|(b|0)<(f|0)}function Mf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=ca+-64|0;ca=e;d=1;a:{if(Ya(a,b,0)){break a}d=0;if(!b){break a}b=Ed(b,14972);d=0;if(!b){break a}d=e+8|0;ra(d|4,0,52);H[e+56>>2]=1;H[e+20>>2]=-1;H[e+16>>2]=a;H[e+8>>2]=b;ea[H[H[b>>2]+28>>2]](b,d,H[c>>2],1);a=H[e+32>>2];if((a|0)==1){H[c>>2]=H[e+24>>2]}d=(a|0)==1}ca=e- -64|0;return d|0}function Ie(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ca-16|0;ca=d;H[a+4>>2]=b;b=H[b+64>>2];e=H[b>>2];b=H[b+4>>2];F[d+15|0]=0;Oa(a+24|0,(b-e>>2>>>0)/3|0,d+15|0);b=H[a+4>>2];e=H[b+56>>2];b=H[b+52>>2];F[d+14|0]=0;Oa(a+36|0,e-b>>2,d+14|0);b=H[c+12>>2];H[a+16>>2]=H[c+8>>2];H[a+20>>2]=b;b=H[c+4>>2];H[a+8>>2]=H[c>>2];H[a+12>>2]=b;ca=d+16|0}function pc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(!b){H[c>>2]=0;return}h=0-I[a+12|0]&255;e=H[a+4>>2];d=H[a+8>>2];i=H[a>>2];while(1){j=f<<1;if(!((e|0)<=0|d>>>0>4095)){e=e-1|0;H[a+4>>2]=e;d=I[e+i|0]|d<<8}g=d&255;f=g>>>0>>0;k=g;g=N(d>>>8|0,h);d=f?k+g|0:d-(h+g|0)|0;H[a+8>>2]=d;f=f|j;b=b-1|0;if(b){continue}break}H[c>>2]=f}function yg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a=ca-16|0;ca=a;f=F[b+24|0];e=H[3411];H[a+8>>2]=H[3410];H[a+12>>2]=e;e=H[3409];H[a>>2]=H[3408];H[a+4>>2]=e;e=Va(b,c,f,a);if(e){b=0;if(f){c=(f&255)<<2;b=pa(c);g=qa(b,a,c)+c|0}c=H[d>>2];if(c){H[d+4>>2]=c;oa(c)}H[d+8>>2]=g;H[d+4>>2]=g;H[d>>2]=b}ca=a+16|0;return e|0}function of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=ea[H[H[a>>2]+24>>2]](a)|0;c=1;a:{if((f|0)<=0){break a}d=H[H[a+36>>2]>>2];g=a+48|0;c=0;if(!(ea[H[H[d>>2]+16>>2]](d,g,b)|0)){break a}while(1){e=e+1|0;if((f|0)!=(e|0)){d=H[H[a+36>>2]+(e<<2)>>2];if(ea[H[H[d>>2]+16>>2]](d,g,b)|0){continue}}break}c=(e|0)>=(f|0)}return c|0}function nf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=ea[H[H[a>>2]+24>>2]](a)|0;c=1;a:{if((f|0)<=0){break a}d=H[H[a+36>>2]>>2];g=a+48|0;c=0;if(!(ea[H[H[d>>2]+20>>2]](d,g,b)|0)){break a}while(1){e=e+1|0;if((f|0)!=(e|0)){d=H[H[a+36>>2]+(e<<2)>>2];if(ea[H[H[d>>2]+20>>2]](d,g,b)|0){continue}}break}c=(e|0)>=(f|0)}return c|0}function _c(a,b){var c=0,d=0;a:{c=H[a+4>>2];d=H[a+8>>2];if((c|0)==d<<5){if((c+1|0)<0){break a}if(c>>>0<=1073741822){d=d<<6;c=(c&-32)+32|0;c=c>>>0>>0?d:c}else{c=2147483647}pb(a,c);c=H[a+4>>2]}H[a+4>>2]=c+1;d=1<>2]+(c>>>3&536870908)|0;if(I[b|0]){H[a>>2]=d|H[a>>2];return}H[a>>2]=H[a>>2]&(d^-1);return}sa();v()}function $h(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ca-16|0;ca=d;H[a+4>>2]=b;e=H[b>>2];b=H[b+4>>2];F[d+15|0]=0;Oa(a+24|0,(b-e>>2>>>0)/3|0,d+15|0);b=H[a+4>>2];e=H[b+28>>2];b=H[b+24>>2];F[d+14|0]=0;Oa(a+36|0,e-b>>2,d+14|0);b=H[c+12>>2];H[a+16>>2]=H[c+8>>2];H[a+20>>2]=b;b=H[c+4>>2];H[a+8>>2]=H[c>>2];H[a+12>>2]=b;ca=d+16|0}function $b(a){var b=0;H[a>>2]=0;H[a+4>>2]=0;H[a+56>>2]=0;H[a+48>>2]=0;H[a+52>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;b=a- -64|0;H[b>>2]=0;H[b+4>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;H[a+80>>2]=0;H[a+84>>2]=0;H[a+60>>2]=a;return a}function td(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!td(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g} function hb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!hb(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Xa(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Xa(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Qe(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Qe(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Pc(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Pc(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Fb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Fb(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Ea(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Ea(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Bb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=H[c+20>>2];e=H[c+12>>2];f=H[c+16>>2];if((d|0)>=(e|0)&f>>>0>=K[c+8>>2]|(d|0)>(e|0)){break a}e=I[H[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;H[c+16>>2]=f;H[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Bb(a+1|0,b,c)){break a}e=d&127|H[b>>2]<<7}H[b>>2]=e;g=1}return g}function Fa(a,b,c){var d=0,e=0;a:{b:{if(c>>>0>=4){if((a|b)&3){break b}while(1){if(H[a>>2]!=H[b>>2]){break b}b=b+4|0;a=a+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}}while(1){d=I[a|0];e=I[b|0];if((d|0)==(e|0)){b=b+1|0;a=a+1|0;c=c-1|0;if(c){continue}break a}break}return d-e|0}return 0}function Yc(a){var b=0,c=0,d=0,e=0;d=H[a>>2];if(d){e=d;c=H[a+4>>2];if((d|0)!=(c|0)){while(1){e=c-144|0;b=H[e+132>>2];if(b){H[c-8>>2]=b;oa(b)}b=H[c-28>>2];if(b){H[c-24>>2]=b;oa(b)}b=H[c-40>>2];if(b){H[c-36>>2]=b;oa(b)}oc(c-140|0);c=e;if((d|0)!=(c|0)){continue}break}e=H[a>>2]}H[a+4>>2]=d;oa(e)}}function Dg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=H[b+4>>2];a:{if(!d){break a}b=H[H[H[b+8>>2]+(c<<2)>>2]+60>>2];if((b|0)<0){break a}a=H[d+24>>2];c=H[d+28>>2];if((a|0)==(c|0)){break a}b:{while(1){e=H[a>>2];if((b|0)==H[e+24>>2]){break b}a=a+4|0;if((c|0)!=(a|0)){continue}break}e=0}}return e|0}function Zh(a){a=a|0;var b=0;H[a+8>>2]=12384;H[a>>2]=12172;b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}b=H[a+80>>2];if(b){H[a+84>>2]=b;oa(b)}b=H[a+68>>2];if(b){H[a+72>>2]=b;oa(b)}b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12620;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}return a|0}function Uc(a){var b=0,c=0,d=0;if(a){d=H[a+24>>2];if(d){b=d;c=H[a+28>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){Ra(b+12|0,H[b+16>>2]);Qa(b,H[b+4>>2]);oa(b)}if((c|0)!=(d|0)){continue}break}b=H[a+24>>2]}H[a+28>>2]=d;oa(b)}Ra(a+12|0,H[a+16>>2]);Qa(a,H[a+4>>2]);oa(a)}}function Yh(a){a=a|0;var b=0;H[a+8>>2]=12384;H[a>>2]=12172;b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}b=H[a+80>>2];if(b){H[a+84>>2]=b;oa(b)}b=H[a+68>>2];if(b){H[a+72>>2]=b;oa(b)}b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12620;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}oa(a)}function vi(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=13280;b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}d=H[a+8>>2];if(d){c=H[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+8>>2]}H[a+12>>2]=d;oa(b)}return a|0}function xc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=H[c+8>>2];e=H[c+16>>2];g=H[c+12>>2];f=g;d=H[c+20>>2];if(h>>>0>e>>>0&(f|0)>=(d|0)|(d|0)<(f|0)){b=I[H[c>>2]+e|0];i=e+1|0;f=i?d:d+1|0;H[c+16>>2]=i;H[c+20>>2]=f;H[a+4>>2]=b}return e>>>0>>0&(d|0)<=(g|0)|(d|0)<(g|0)}function Wc(a){a=a|0;var b=0,c=0,d=0;H[a>>2]=13280;b=H[a+20>>2];if(b){H[a+24>>2]=b;oa(b)}d=H[a+8>>2];if(d){c=H[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=H[c>>2];H[c>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=H[a+8>>2]}H[a+12>>2]=d;oa(b)}oa(a)}function Ya(a,b,c){var d=0;if(!c){return H[a+4>>2]==H[b+4>>2]}if((a|0)==(b|0)){return 1}d=H[a+4>>2];a=I[d|0];c=H[b+4>>2];b=I[c|0];a:{if(!a|(b|0)!=(a|0)){break a}while(1){b=I[c+1|0];a=I[d+1|0];if(!a){break a}c=c+1|0;d=d+1|0;if((a|0)==(b|0)){continue}break}}return(a|0)==(b|0)}function _h(a){a=a|0;var b=0;H[a>>2]=12384;b=H[a+88>>2];if(b){H[a+92>>2]=b;oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){H[a- -64>>2]=b;oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function Fg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=H[b+12>>2];b=H[b+8>>2];a=0;a:{if((d|0)==(b|0)){break a}a=d-b>>2;d=a>>>0<=1?1:a;a=0;b:{while(1){e=H[b+(a<<2)>>2];if(H[e+60>>2]==(c|0)){break b}a=a+1|0;if((d|0)!=(a|0)){continue}break}a=0;break a}a=(a|0)!=-1?e:0}return a|0}function ae(a,b){var c=0,d=0,e=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;a:{c=H[b+4>>2];d=H[b>>2];b:{if((c|0)==(d|0)){a=c;break b}c=c-d|0;if((c|0)<0){break a}d=c;e=pa(c);c=ra(e,0,c);d=d+c|0;H[a+8>>2]=d;H[a+4>>2]=d;H[a>>2]=c;c=H[b>>2];a=H[b+4>>2]}qa(e,c,a-c|0);return}sa();v()}function ed(a){var b=0,c=0,d=0,e=0;c=H[a+4>>2];d=H[a>>2];if((c|0)!=(d|0)){while(1){e=c-144|0;b=H[e+132>>2];if(b){H[c-8>>2]=b;oa(b)}b=H[c-28>>2];if(b){H[c-24>>2]=b;oa(b)}b=H[c-40>>2];if(b){H[c-36>>2]=b;oa(b)}oc(c-140|0);c=e;if((d|0)!=(c|0)){continue}break}}H[a+4>>2]=d}function Vh(a){a=a|0;var b=0;H[a>>2]=12384;b=H[a+88>>2];if(b){H[a+92>>2]=b;oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+60>>2];if(b){H[a- -64>>2]=b;oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function cb(a){var b=0;if(a){b=H[a+76>>2];if(b){H[a+80>>2]=b;oa(b)}b=H[a- -64>>2];if(b){H[a+68>>2]=b;oa(b)}b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}b=H[a+24>>2];if(b){H[a+28>>2]=b;oa(b)}b=H[a+12>>2];if(b){H[a+16>>2]=b;oa(b)}b=H[a>>2];if(b){H[a+4>>2]=b;oa(b)}oa(a)}}function Jd(a,b,c){var d=0,e=0,f=0,g=0;f=ca-16|0;ca=f;d=ca-16|0;ca=d;b=b-a>>2;while(1){if(b){H[d+12>>2]=a;e=b>>>1|0;H[d+12>>2]=H[d+12>>2]+(e<<2);g=(e^-1)+b|0;b=e;e=K[H[d+12>>2]>>2]>2];b=e?g:b;a=e?H[d+12>>2]+4|0:a;continue}break}ca=d+16|0;ca=f+16|0;return a}function oc(a){var b=0;b=H[a+84>>2];if(b){H[a+88>>2]=b;oa(b)}b=H[a+72>>2];if(b){H[a+76>>2]=b;oa(b)}b=H[a+52>>2];if(b){H[a+56>>2]=b;oa(b)}b=H[a+40>>2];if(b){H[a+44>>2]=b;oa(b)}b=H[a+28>>2];if(b){H[a+32>>2]=b;oa(b)}b=H[a+12>>2];if(b){oa(b)}a=H[a>>2];if(a){oa(a)}}function Xc(a,b){var c=0,d=0;d=pa(40);H[d>>2]=-1;c=d+8|0;H[c+16>>2]=0;H[c+20>>2]=0;H[c+8>>2]=0;H[c>>2]=0;H[c+4>>2]=0;H[c+24>>2]=0;H[c+28>>2]=0;ea[H[H[a>>2]+16>>2]](a,d);a=H[b+88>>2];H[b+88>>2]=d;if(a){b=H[a+8>>2];if(b){H[a+12>>2]=b;oa(b)}oa(a)}return 1}function Ma(a){var b=0,c=0,d=0;b=a;a:{if(b&3){while(1){if(!I[b|0]){break a}b=b+1|0;if(b&3){continue}break}}while(1){c=b;b=b+4|0;d=H[c>>2];if(!((d^-1)&d-16843009&-2139062144)){continue}break}while(1){b=c;c=b+1|0;if(I[b|0]){continue}break}}return b-a|0}function Ba(a){var b=0,c=0,d=0,e=0,f=0;d=I[a+12|0];c=H[a+8>>2];a:{if(c>>>0>4095){break a}b=H[a+4>>2];if((b|0)<=0){break a}b=b-1|0;H[a+4>>2]=b;c=I[b+H[a>>2]|0]|c<<8}d=0-d&255;b=N(d,c>>>8|0);e=c&255;f=e>>>0>>0;H[a+8>>2]=f?b+e|0:c-(b+d|0)|0;return f}function od(a,b){H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=1984;H[a+12>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+32>>2]=0;H[a+36>>2]=0;H[a+40>>2]=0;H[a>>2]=2328;H[a+60>>2]=b;H[a+44>>2]=0;H[a+48>>2]=0;H[a+52>>2]=0;H[a+56>>2]=0;return a}function mc(a,b){var c=0,d=0,e=0;c=Ma(b);if(c>>>0<2147483632){a:{b:{if(c>>>0>=11){d=(c|15)+1|0;e=pa(d);H[a+8>>2]=d|-2147483648;H[a>>2]=e;H[a+4>>2]=c;d=c+e|0;break b}F[a+11|0]=c;d=a+c|0;e=a;if(!c){break a}}va(e,b,c)}F[d|0]=0;return a}Na();v()}function Ng(a){a=a|0;var b=0,c=0,d=0;if(a){if(F[a+27|0]<0){oa(H[a+16>>2])}b=H[a>>2];if(b){c=b;d=H[a+4>>2];if((b|0)!=(d|0)){while(1){c=d-12|0;if(F[d-1|0]<0){oa(H[c>>2])}d=c;if((d|0)!=(b|0)){continue}break}c=H[a>>2]}H[a+4>>2]=b;oa(c)}oa(a)}}function Jb(a,b){var c=0,d=0,e=0;a:{c=H[a>>2];b:{if(H[a+8>>2]-c>>2>>>0>=b>>>0){break b}if(b>>>0>=1073741824){break a}d=H[a+4>>2]-c|0;e=b<<2;b=va(pa(e),c,d);H[a+8>>2]=b+e;H[a+4>>2]=b+d;H[a>>2]=b;if(!c){break b}oa(c)}return}sa();v()}function Ga(a){a=a|0;var b=0,c=0;if(a){b=H[a+88>>2];H[a+88>>2]=0;if(b){c=H[b+8>>2];if(c){H[b+12>>2]=c;oa(c)}oa(b)}b=H[a+68>>2];if(b){H[a+72>>2]=b;oa(b)}b=H[a+64>>2];H[a+64>>2]=0;if(b){c=H[b>>2];if(c){H[b+4>>2]=c;oa(c)}oa(b)}oa(a)}}function Nd(a){var b=0,c=0,d=0;if(F[H[a>>2]]-48>>>0>=10){return 0}while(1){d=H[a>>2];c=-1;if(b>>>0<=214748364){c=F[d|0]-48|0;b=N(b,10);c=(c|0)>(b^2147483647)?-1:c+b|0}H[a>>2]=d+1;b=c;if(F[d+1|0]-48>>>0<10){continue}break}return b}function Cg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;b=H[b+96>>2];a=pa(12);b=b+N(c,12)|0;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c;H[a+8>>2]=H[b+8>>2];b=H[d>>2];if(b){H[d+4>>2]=b;oa(b)}H[d>>2]=a;a=a+12|0;H[d+8>>2]=a;H[d+4>>2]=a;return 1}function Ai(a){a=a|0;var b=0;H[a+24>>2]=1832;H[a>>2]=11048;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}H[a>>2]=2448;b=H[a+20>>2];H[a+20>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}return a|0}function Sj(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=Tj(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;da=(g^da)-((a>>>0>>0)+g|0)|0;return b}function yi(a){a=a|0;var b=0;H[a+24>>2]=1832;H[a>>2]=11048;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}H[a>>2]=2448;b=H[a+20>>2];H[a+20>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}oa(a)}function Yb(a,b,c){var d=0,e=0,f=0;e=ca-16|0;ca=e;d=H[a+8>>2]&2147483647;a:{if(d>>>0>c>>>0){d=H[a>>2];H[a+4>>2]=c;yb(d,b,c);F[e+15|0]=0;F[c+d|0]=I[e+15|0];break a}f=a;a=H[a+4>>2];Gd(f,d-1|0,(c-d|0)+1|0,a,a,c,b)}ca=e+16|0}function Bf(a,b){a=a|0;b=b|0;var c=0,d=0;c=ca-16|0;ca=c;a=H[a+4>>2];a:{if((a|0)==-1){break a}F[c+15|0]=a;d=H[b+20>>2];if(!!H[b+16>>2]&(d|0)>=0|(d|0)>0){break a}Wb(b,H[b+4>>2],c+15|0,c+16|0)}ca=c+16|0;return(a|0)!=-1|0}function Xb(a,b,c){var d=0,e=0;d=ca-16|0;ca=d;a:{if(c>>>0<=10){F[a+11|0]=I[a+11|0]&128|c;F[a+11|0]=I[a+11|0]&127;yb(a,b,c);F[d+15|0]=0;F[a+c|0]=I[d+15|0];break a}e=a;a=I[a+11|0]&127;Gd(e,10,c-10|0,a,a,c,b)}ca=d+16|0}function Rj(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=c>>>16|0;f=a>>>16|0;j=N(e,f);g=c&65535;h=a&65535;i=N(g,h);f=(i>>>16|0)+N(f,g)|0;e=(f&65535)+N(e,h)|0;da=(N(b,c)+j|0)+N(a,d)+(f>>>16)+(e>>>16)|0;return i&65535|e<<16}function Dd(a,b,c){var d=0;d=H[a+16>>2];if(!d){H[a+36>>2]=1;H[a+24>>2]=c;H[a+16>>2]=b;return}a:{if((b|0)==(d|0)){if(H[a+24>>2]!=2){break a}H[a+24>>2]=c;return}F[a+54|0]=1;H[a+24>>2]=2;H[a+36>>2]=H[a+36>>2]+1}}function th(){var a=0;a=Eb(pa(96));H[a+64>>2]=0;H[a+68>>2]=0;H[a+88>>2]=0;H[a+72>>2]=0;H[a+76>>2]=0;F[a+77|0]=0;F[a+78|0]=0;F[a+79|0]=0;F[a+80|0]=0;F[a+81|0]=0;F[a+82|0]=0;F[a+83|0]=0;F[a+84|0]=0;return a|0}function zi(a,b){a=a|0;b=b|0;var c=0,d=0;H[b>>2]=2;c=H[b+8>>2];d=H[b+12>>2]-c|0;if(d>>>0<=4294967291){kc(b+8|0,d+4|0);c=H[b+8>>2]}b=c+d|0;a=H[a+4>>2];F[b|0]=a;F[b+1|0]=a>>>8;F[b+2|0]=a>>>16;F[b+3|0]=a>>>24}function rj(a){a=a|0;var b=0;H[a>>2]=5580;b=H[a+96>>2];if(b){oa(b)}b=H[a+84>>2];if(b){oa(b)}b=H[a+72>>2];if(b){oa(b)}b=H[a+60>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function ib(a,b,c,d,e){var f=0;f=ca-256|0;ca=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;ra(f,b&255,c?d:256);if(!c){while(1){Ab(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}Ab(a,f,d)}ca=f+256|0}function Ij(a){a=a|0;var b=0;H[a>>2]=3564;b=H[a+96>>2];if(b){oa(b)}b=H[a+84>>2];if(b){oa(b)}b=H[a+72>>2];if(b){oa(b)}b=H[a+60>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function Ch(a){a=a|0;var b=0,c=0,d=0;b=H[a+8>>2];d=H[a+12>>2];if((b|0)==(d|0)){return 1}while(1){c=H[b>>2];c=ea[H[H[c>>2]+16>>2]](c,H[a+32>>2])|0;if(c){b=b+4|0;if((d|0)!=(b|0)){continue}}break}return c|0}function Yd(a,b){var c=0,d=0;c=H[a+8>>2];a=H[a+12>>2];if((c|0)!=(a|0)){a=a-c>>2;d=a>>>0<=1?1:a;a=0;while(1){if(H[H[(a<<2)+c>>2]+60>>2]==(b|0)){return a}a=a+1|0;if((d|0)!=(a|0)){continue}break}}return-1}function qj(a){a=a|0;var b=0;H[a>>2]=5580;b=H[a+96>>2];if(b){oa(b)}b=H[a+84>>2];if(b){oa(b)}b=H[a+72>>2];if(b){oa(b)}b=H[a+60>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function Hj(a){a=a|0;var b=0;H[a>>2]=3564;b=H[a+96>>2];if(b){oa(b)}b=H[a+84>>2];if(b){oa(b)}b=H[a+72>>2];if(b){oa(b)}b=H[a+60>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function $d(a,b,c){var d=0,e=0;d=a+4|0;a=nb(a,b);a:{if((d|0)==(a|0)){break a}b=H[a+32>>2];d=H[a+28>>2];if((b|0)==(d|0)){break a}Cc(c,b-d|0);c=Dc(c);b=H[a+28>>2];qa(c,b,H[a+32>>2]-b|0);e=1}return e}function Qf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=ca-16|0;ca=e;a=_(H[a+60>>2],b|0,c|0,d&255,e+8|0)|0;if(a){H[3992]=a;a=-1}else{a=0}ca=e+16|0;da=a?-1:H[e+12>>2];return(a?-1:H[e+8>>2])|0}function Sd(a){var b=0;b=H[a+72>>2];H[a+72>>2]=b-1|b;b=H[a>>2];if(b&8){H[a>>2]=b|32;return-1}H[a+4>>2]=0;H[a+8>>2]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];return 0}function Eb(a){H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+40>>2]=0;H[a+44>>2]=0;H[a+28>>2]=9;F[a+24|0]=1;H[a+56>>2]=-1;H[a+60>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+48>>2]=0;H[a+52>>2]=0;return a}function hf(a,b){a=a|0;b=b|0;var c=0,d=0;d=H[a+16>>2];c=0;a:{if(H[a+20>>2]-d>>2<=(b|0)){break a}b=H[(b<<2)+d>>2];c=0;if((b|0)<0){break a}c=rb(H[H[a+36>>2]+(b<<2)>>2])}return c|0}function Mg(){var a=0,b=0;a=pa(40);H[a+4>>2]=0;H[a+8>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;b=a+16|0;H[b>>2]=0;H[b+4>>2]=0;H[a>>2]=a+4;H[a+12>>2]=b;H[a+32>>2]=0;H[a+36>>2]=0;return a|0}function Vf(a,b){a=a|0;b=b|0;var c=0,d=0;Wd(a,b);a:{if((b|0)<0){break a}d=H[a+88>>2];c=H[a+84>>2];if(d-c>>2<=(b|0)){break a}c=(b<<2)+c|0;b=c+4|0;va(c,b,d-b|0);H[a+88>>2]=d-4}}function Rh(a){a=a|0;var b=0;H[a+8>>2]=12804;H[a>>2]=12640;b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12620;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}return a|0}function Lh(a){a=a|0;var b=0;H[a+8>>2]=11872;H[a>>2]=12932;b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12124;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}return a|0}function zb(a){var b=0,c=0;b=H[3958];c=a+7&-8;a=b+c|0;a:{if(a>>>0<=b>>>0?c:0){break a}if(a>>>0>fa()<<16>>>0){if(!($(a|0)|0)){break a}}H[3958]=a;return b}H[3992]=48;return-1}function bj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;H[a+4>>2]=b;b=H[H[H[b+4>>2]+8>>2]+(c<<2)>>2];H[a+12>>2]=c;H[a+8>>2]=b;a=H[a+8>>2];if(I[a+24|0]==3){d=H[a+28>>2]==9}return d|0}function wf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=H[a+8>>2];a:{if(!I[d+24|0]){break a}if(!mb(d,H[b+4>>2]-H[b>>2]>>2)){break a}e=ea[H[H[a>>2]+32>>2]](a,b,c)|0}return e|0}function Qh(a){a=a|0;var b=0;H[a+8>>2]=12804;H[a>>2]=12640;b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12620;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}oa(a)}function Kh(a){a=a|0;var b=0;H[a+8>>2]=11872;H[a>>2]=12932;b=H[a+56>>2];if(b){H[a+60>>2]=b;oa(b)}H[a+8>>2]=12124;b=H[a+44>>2];if(b){oa(b)}b=H[a+32>>2];if(b){oa(b)}oa(a)}function nj(a){a=a|0;var b=0;H[a>>2]=5816;b=H[a+76>>2];if(b){oa(b)}b=H[a+68>>2];H[a+68>>2]=0;if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function Ra(a,b){if(b){Ra(a,H[b>>2]);Ra(a,H[b+4>>2]);a=H[b+28>>2];H[b+28>>2]=0;if(a){Ra(a+12|0,H[a+16>>2]);Qa(a,H[a+4>>2]);oa(a)}if(F[b+27|0]<0){oa(H[b+16>>2])}oa(b)}}function Gi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;H[a+4>>2]=b;d=H[H[H[b+4>>2]+8>>2]+(c<<2)>>2];H[a+12>>2]=c;H[a+8>>2]=d;return H[H[H[H[b+4>>2]+8>>2]+(c<<2)>>2]+28>>2]==9|0}function Ej(a){a=a|0;var b=0;H[a>>2]=3812;b=H[a+76>>2];if(b){oa(b)}b=H[a+68>>2];H[a+68>>2]=0;if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function Vc(a){H[a+40>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;H[a>>2]=13280;H[a+12>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;H[a+32>>2]=0;G[a+36>>1]=0;return a}function Hd(a,b){var c=0,d=0,e=0,f=0;H[a>>2]=15260;H[a>>2]=15372;c=Ma(b);d=pa(c+13|0);H[d+8>>2]=0;H[d+4>>2]=c;H[d>>2]=c;e=a,f=qa(d+12|0,b,c+1|0),H[e+4>>2]=f;return a}function jg(a,b){a=a|0;b=b|0;var c=0;a:{if(!(ea[H[H[a>>2]+36>>2]](a,b)|0)){break a}if(!(ea[H[H[a>>2]+40>>2]](a,b)|0)){break a}c=ea[H[H[a>>2]+44>>2]](a)|0}return c|0}function mj(a){a=a|0;var b=0;H[a>>2]=5816;b=H[a+76>>2];if(b){oa(b)}b=H[a+68>>2];H[a+68>>2]=0;if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function Dj(a){a=a|0;var b=0;H[a>>2]=3812;b=H[a+76>>2];if(b){oa(b)}b=H[a+68>>2];H[a+68>>2]=0;if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function Xe(a){a=a|0;var b=0;a:{if(!H[a- -64>>2]|!H[a+68>>2]|(!H[a+44>>2]|!H[a+48>>2])){break a}if(!H[a+52>>2]|!H[a+56>>2]){break a}b=H[a+92>>2]!=-1}return b|0}function cf(a){a=a|0;var b=0;H[a>>2]=2448;b=H[a+20>>2];H[a+20>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}return a|0}function Pj(a,b){a=a|0;b=b|0;var c=0;b=H[b+88>>2];if(!(!b|H[b>>2]!=2)){c=a;a=H[b+8>>2];H[c+4>>2]=I[a|0]|I[a+1|0]<<8|(I[a+2|0]<<16|I[a+3|0]<<24);c=1}return c|0}function tc(a){a=a|0;var b=0;a:{if(!H[a+48>>2]|!H[a+52>>2]|(!H[a+28>>2]|!H[a+32>>2])){break a}if(!H[a+36>>2]|!H[a+40>>2]){break a}b=H[a+76>>2]!=-1}return b|0}function Sh(a){a=a|0;var b=0;H[a>>2]=12804;b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function He(a){a=a|0;var b=0;H[a>>2]=11872;b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12124;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function bf(a){a=a|0;var b=0;H[a>>2]=2448;b=H[a+20>>2];H[a+20>>2]=0;if(b){ea[H[H[b>>2]+4>>2]](b)}H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}oa(a)}function wh(){var a=0,b=0;b=pa(40);H[b>>2]=-1;a=b+8|0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a>>2]=0;H[a+4>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;return b|0}function gf(a,b){a=a|0;b=b|0;var c=0,d=0;d=H[a+4>>2];a:{if(d){c=1;if(I[d+36|0]<2){break a}}c=ea[H[H[a>>2]+48>>2]](a,H[b+4>>2]-H[b>>2]>>2)|0}return c|0}function ci(a){a=a|0;var b=0;H[a>>2]=11872;b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12124;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function Mh(a){a=a|0;var b=0;H[a>>2]=12804;b=H[a+48>>2];if(b){H[a+52>>2]=b;oa(b)}H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function Ha(a){H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+32>>2]=0;H[a+24>>2]=0;H[a+28>>2]=0;G[a+38>>1]=0;F[a+36|0]=0;return a}function Hf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Ya(a,H[b+8>>2],f)){Cd(b,c,d,e);return}a=H[a+8>>2];ea[H[H[a>>2]+20>>2]](a,b,c,d,e,f)}function Ei(a,b,c){a=a|0;b=b|0;c=c|0;a:{if(I[H[a+4>>2]+36|0]>=2){b=0;if(!(ea[H[H[a>>2]+52>>2]](a)|0)){break a}}b=Xc(a+24|0,H[a+16>>2])}return b|0}function Fi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a:{if(I[H[a+4>>2]+36|0]<=1){d=0;if(!(ea[H[H[a>>2]+52>>2]](a)|0)){break a}}d=nd(a,b,c)}return d|0}function gh(){var a=0;a=_d(pa(108));H[a+84>>2]=0;H[a+88>>2]=0;H[a>>2]=13664;H[a+92>>2]=0;H[a+96>>2]=0;H[a+100>>2]=0;H[a+104>>2]=0;return a|0}function Zd(a,b){var c=0;c=-1;a:{if((b|0)==-1|(b|0)>4){break a}b=N(b,12)+a|0;a=H[b+20>>2];if((H[b+24>>2]-a|0)<=0){break a}c=H[a>>2]}return c}function lc(a,b,c,d,e,f,g){H[a>>2]=0;H[a+56>>2]=b;H[a+48>>2]=0;H[a+52>>2]=0;H[a+40>>2]=f;H[a+44>>2]=g;F[a+32|0]=e;H[a+28>>2]=d;F[a+24|0]=c}function aj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;a:{if(I[H[a+4>>2]+36|0]<=1){d=0;if(!xc(a+24|0,H[a+8>>2],c)){break a}}d=nd(a,b,c)}return d|0}function $i(a,b,c){a=a|0;b=b|0;c=c|0;a:{if(I[H[a+4>>2]+36|0]>=2){b=0;if(!xc(a+24|0,rb(a),c)){break a}}b=Xc(a+24|0,H[a+16>>2])}return b|0}function Yf(a){a=a|0;var b=0;H[a>>2]=13664;b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}b=H[a+84>>2];if(b){H[a+88>>2]=b;oa(b)}return _b(a)|0}function Dc(a){var b=0;if(I[a+11|0]>>>7|0){b=H[a+4>>2]}else{b=I[a+11|0]&127}if(!b){af(1232);v()}if(I[a+11|0]>>>7|0){a=H[a>>2]}return a}function Xf(a){a=a|0;var b=0;H[a>>2]=13664;b=H[a+96>>2];if(b){H[a+100>>2]=b;oa(b)}b=H[a+84>>2];if(b){H[a+88>>2]=b;oa(b)}oa(_b(a))}function zj(a){a=a|0;var b=0;H[a>>2]=4040;b=H[a+76>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function jj(a){a=a|0;var b=0;H[a>>2]=6032;b=H[a+76>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function Qa(a,b){if(b){Qa(a,H[b>>2]);Qa(a,H[b+4>>2]);a=H[b+28>>2];if(a){H[b+32>>2]=a;oa(a)}if(F[b+27|0]<0){oa(H[b+16>>2])}oa(b)}}function Vg(){var a=0;a=pa(28);H[a>>2]=0;H[a+4>>2]=0;H[a+24>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;return a|0}function wg(a){a=a|0;var b=0;H[a>>2]=1984;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a+4>>2];if(b){H[a+8>>2]=b;oa(b)}return a|0}function eh(){var a=0,b=0;a=pa(24);H[a+4>>2]=0;H[a+8>>2]=0;b=a+16|0;H[b>>2]=0;H[b+4>>2]=0;H[a>>2]=a+4;H[a+12>>2]=b;return a|0}function Kf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(Ya(a,H[b+8>>2],0)){Dd(b,c,d);return}a=H[a+8>>2];ea[H[H[a>>2]+28>>2]](a,b,c,d)}function yj(a){a=a|0;var b=0;H[a>>2]=4040;b=H[a+76>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function ij(a){a=a|0;var b=0;H[a>>2]=6032;b=H[a+76>>2];if(b){oa(b)}H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function pa(a){var b=0;a=a?a:1;a:{while(1){b=Ec(a);if(b){break a}b=H[4422];if(b){ea[b|0]();continue}break}X();v()}return b}function Kb(a,b){if(b){Kb(a,H[b>>2]);Kb(a,H[b+4>>2]);if(F[b+39|0]<0){oa(H[b+28>>2])}if(F[b+27|0]<0){oa(H[b+16>>2])}oa(b)}}function Ad(a){a=a|0;var b=0,c=0;H[a>>2]=15372;b=H[a+4>>2]-12|0;c=H[b+8>>2]-1|0;H[b+8>>2]=c;if((c|0)<0){oa(b)}return a|0}function lh(){var a=0;a=pa(24);H[a+8>>2]=0;H[a+12>>2]=0;H[a+4>>2]=-1;H[a>>2]=1832;H[a+16>>2]=0;H[a+20>>2]=0;return a|0}function pd(a,b,c){a=a|0;b=b|0;c=c|0;H[a+4>>2]=b;b=H[H[H[b+4>>2]+8>>2]+(c<<2)>>2];H[a+12>>2]=c;H[a+8>>2]=b;return 1}function wc(a){a=a|0;var b=0;if(!(!H[a+60>>2]|!H[a+44>>2]|(!H[a+48>>2]|!H[a+52>>2]))){b=H[a+56>>2]!=0}return b|0}function Id(a,b){if(I[a+11|0]>>>7|0){H[a+4>>2]=b;return}F[a+11|0]=I[a+11|0]&128|b;F[a+11|0]=I[a+11|0]&127}function wj(a){a=a|0;var b=0;H[a>>2]=4276;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function fj(a){a=a|0;var b=0;H[a>>2]=6256;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function bi(a){a=a|0;var b=0;H[a>>2]=12124;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function Uh(a){a=a|0;var b=0;H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}return a|0}function lg(a){a=a|0;if(a){if(F[a+39|0]<0){oa(H[a+28>>2])}Oc(a+12|0,H[a+16>>2]);Kb(a,H[a+4>>2]);oa(a)}}function Pb(a){a=a|0;var b=0;if(!(!H[a+52>>2]|(!H[a+44>>2]|!H[a+48>>2]))){b=H[a+56>>2]!=0}return b|0}function vj(a){a=a|0;var b=0;H[a>>2]=4276;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function vc(a,b){a=a|0;b=b|0;var c=0;if(!(H[b+56>>2]|!b|I[b+24|0]!=3)){H[a+60>>2]=b;c=1}return c|0}function ej(a){a=a|0;var b=0;H[a>>2]=6256;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function ai(a){a=a|0;var b=0;H[a>>2]=12124;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function Th(a){a=a|0;var b=0;H[a>>2]=12620;b=H[a+36>>2];if(b){oa(b)}b=H[a+24>>2];if(b){oa(b)}oa(a)}function xh(a,b,c){a=a|0;b=b|0;c=c|0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=b;H[a+8>>2]=c;H[a+12>>2]=0}function We(a,b){a=a|0;b=b|0;var c=0;if(!(H[b+56>>2]|I[b+24|0]!=3)){H[a- -64>>2]=b;c=1}return c|0}function yc(a){var b=0;b=H[a+16>>2];if(b){H[a+20>>2]=b;oa(b)}b=H[a>>2];if(b){H[a+4>>2]=b;oa(b)}}function sc(a,b){a=a|0;b=b|0;var c=0;if(!(H[b+56>>2]|I[b+24|0]!=3)){H[a+48>>2]=b;c=1}return c|0}function Gf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Ya(a,H[b+8>>2],f)){Cd(b,c,d,e)}}function wa(){var a=0;a=Bc(4);H[a>>2]=15260;H[a>>2]=15220;H[a>>2]=15240;Y(a|0,15352,14);v()}function sf(a){a=a|0;var b=0;H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}return a|0}function Kj(a){a=a|0;var b=0;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}return a|0}function mi(a){a=a|0;var b=0;H[a>>2]=1832;b=H[a+8>>2];if(b){H[a+12>>2]=b;oa(b)}return a|0}function Ci(a){a=a|0;var b=0;b=rb(a);return Je(a+24|0,b?b:H[a+8>>2],H[H[a+4>>2]+32>>2])|0}function rf(a){a=a|0;var b=0;H[a>>2]=2232;b=H[a+16>>2];H[a+16>>2]=0;if(b){Ga(b)}oa(a)}function ji(a){a=a|0;var b=0;H[a>>2]=1832;b=H[a+8>>2];if(b){H[a+12>>2]=b;oa(b)}oa(a)} function Ub(a){a=a|0;var b=0;H[a>>2]=3272;b=H[a+32>>2];if(b){H[a+36>>2]=b;oa(b)}oa(a)}function Za(a){var b=0;H[a+16>>2]=0;b=H[a>>2];H[a+4>>2]=b;H[a+12>>2]=b;if(b){oa(b)}}function Oc(a,b){if(b){Oc(a,H[b>>2]);Oc(a,H[b+4>>2]);Kb(b+20|0,H[b+24>>2]);oa(b)}}function wi(a){a=a|0;if(!H[a+44>>2]){return 0}return ea[H[H[a>>2]+48>>2]](a)|0}function vh(a){a=a|0;var b=0;if(a){b=H[a+8>>2];if(b){H[a+12>>2]=b;oa(b)}oa(a)}}function Uj(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function Lf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(Ya(a,H[b+8>>2],0)){Dd(b,c,d)}}function ui(a,b){a=a|0;b=b|0;a=H[a+48>>2];return ea[H[H[a>>2]+20>>2]](a,b)|0}function ni(a,b){a=a|0;b=b|0;a=H[a+48>>2];return ea[H[H[a>>2]+12>>2]](a,b)|0}function li(a,b){a=a|0;b=b|0;a=H[a+48>>2];return ea[H[H[a>>2]+16>>2]](a,b)|0}function lb(){var a=0;a=pa(12);H[a>>2]=0;H[a+4>>2]=0;H[a+8>>2]=0;return a|0}function kb(a){a=a|0;var b=0;if(a){b=H[a>>2];if(b){H[a+4>>2]=b;oa(b)}oa(a)}}function Vj(a){var b=0;b=a&31;a=0-a&31;return(-1>>>b&-2)<>>a} function dh(a,b,c){a=a|0;b=b|0;c=c|0;H[a+32>>2]=c;H[a+28>>2]=b;return 1}function ch(a){a=a|0;if(a){Ra(a+12|0,H[a+16>>2]);Qa(a,H[a+4>>2]);oa(a)}}function Rd(a,b,c){a:{if(H[c+76>>2]<0){a=Fc(a,b,c);break a}a=Fc(a,b,c)}}function Mb(a,b){a=a|0;b=b|0;if(b>>>0<=1){H[a+28>>2]=b}return b>>>0<2|0}function Fh(a,b){a=a|0;b=b|0;F[b+84|0]=1;H[b+72>>2]=H[b+68>>2];return 1}function si(a){a=a|0;a=H[a+48>>2];return ea[H[H[a>>2]+24>>2]](a)|0}function ri(a){a=a|0;a=H[a+48>>2];return ea[H[H[a>>2]+28>>2]](a)|0}function oi(a){a=a|0;a=H[a+48>>2];return ea[H[H[a>>2]+36>>2]](a)|0}function ih(){var a=0;a=pa(8);H[a+4>>2]=-1;H[a>>2]=1032;return a|0}function Gg(a,b,c){a=a|0;b=b|0;c=c|0;return H[H[b+8>>2]+(c<<2)>>2]}function _i(a,b){a=a|0;b=b|0;return Fd(a+24|0,rb(a),H[a+8>>2])|0}function Bi(a,b){a=a|0;b=b|0;return Re(a+24|0,rb(a),H[a+8>>2])|0}function xf(a,b){a=a|0;b=b|0;H[a+12>>2]=-1;H[a+8>>2]=b;return 1}function ne(a,b){a=a|0;b=b|0;return ea[H[H[a>>2]+12>>2]](a,b)|0}function Ff(a){a=a|0;if(!a){return 0}return(Ed(a,15068)|0)!=0|0}function Di(a,b){a=a|0;b=b|0;return ea[H[H[a>>2]+56>>2]](a,b)|0}function $g(a){a=a|0;if(a){if(F[a+15|0]<0){oa(H[a+4>>2])}oa(a)}}function kh(a,b){a=a|0;b=b|0;return O(L[H[a+8>>2]+(b<<2)>>2])}function af(a){a=Hd(Bc(8),a);H[a>>2]=15472;Y(a|0,15504,1);v()}function Ue(a){a=Hd(Bc(8),a);H[a>>2]=15420;Y(a|0,15452,1);v()}function _g(a,b){a=a|0;b=b|0;return O(L[H[a>>2]+(b<<2)>>2])}function fh(a){a=a|0;return(H[a+100>>2]-H[a+96>>2]|0)/12|0}function ah(a){a=a|0;return(F[a+15|0]<0?H[a+4>>2]:a+4|0)|0}function _f(a,b){a=a|0;b=b|0;return H[H[a+4>>2]+(b<<2)>>2]}function Pf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;da=0;return 0}function Ke(a){a=Vc(a);H[a+44>>2]=0;H[a>>2]=11180;return a}function ie(a,b){a=a|0;b=b|0;return H[H[a>>2]+(b<<2)>>2]}function Xg(a,b){a=a|0;b=b|0;return G[H[a>>2]+(b<<1)>>1]}function Wg(a,b){a=a|0;b=b|0;return J[H[a>>2]+(b<<1)>>1]}function Zb(a,b){var c=0;c=pa(b);H[a+4>>2]=b;H[a>>2]=c}function Jg(a,b,c){a=a|0;b=b|0;c=c|0;return Zd(b,c)|0}function _d(a){H[a>>2]=13724;ra(a+4|0,0,80);return a}function me(a){a=a|0;return H[a+12>>2]-H[a+8>>2]>>2}function Qj(a){if(a){return 31-Q(a-1^a)|0}return 32}function cc(a){a=a|0;if(a){ea[H[H[a>>2]+4>>2]](a)}}function Zg(a,b){a=a|0;b=b|0;return F[H[a>>2]+b|0]}function Yg(a,b){a=a|0;b=b|0;return I[H[a>>2]+b|0]}function Uf(a){a=a|0;return H[a+8>>2]-H[a+4>>2]>>2}function jd(a,b){a=a|0;b=b|0;H[a+4>>2]=b;return 1}function je(a){a=a|0;return H[a+4>>2]-H[a>>2]>>1}function Qc(a){a=a|0;return H[a+4>>2]-H[a>>2]>>2}function le(a){a=a|0;return H[a+4>>2]-H[a>>2]|0}function Ab(a,b,c){if(!(I[a|0]&32)){Fc(b,c,a)}}function vf(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function hi(a,b){a=a|0;b=b|0;return I[b+24|0]}function Pg(a,b){a=a|0;b=b|0;return H[b+8>>2]}function Nj(a){a=a|0;return I[H[a+8>>2]+24|0]}function Li(a){a=a|0;H[a>>2]=10032;return a|0}function Eg(a,b){a=a|0;b=b|0;return H[b+4>>2]}function Yi(a){a=a|0;H[a>>2]=7144;return a|0}function Ui(a){a=a|0;H[a>>2]=8080;return a|0}function Sf(a){a=a|0;return aa(H[a+60>>2])|0}function Pi(a){a=a|0;H[a>>2]=9028;return a|0}function jh(a){a=a|0;return O(L[a+20>>2])}function Ji(a){a=a|0;H[a>>2]=10032;oa(a)}function Xi(a){a=a|0;H[a>>2]=7144;oa(a)}function Si(a){a=a|0;H[a>>2]=8080;oa(a)}function Oi(a){a=a|0;H[a>>2]=9028;oa(a)}function sh(a){a=a|0;return H[a+88>>2]}function rh(a){a=a|0;return H[a+56>>2]}function oh(a){a=a|0;return H[a+40>>2]}function nh(a){a=a|0;return H[a+48>>2]}function mh(a){a=a|0;return H[a+60>>2]}function eb(a){a=a|0;return H[a+28>>2]}function df(){H[4292]=17048;H[4274]=42}function Rc(a){a=a|0;return H[a+80>>2]}function qh(a){a=a|0;return F[a+24|0]}function ph(a){a=a|0;return I[a+32|0]}function md(a,b){a=a|0;b=b|0;return-1}function db(a){a=a|0;return H[a+4>>2]}function bh(a){a=a|0;return!H[a>>2]|0}function _e(a,b){a=a|0;b=b|0;return 6}function Zc(a){a=a|0;return H[a+8>>2]}function Pd(a,b){a=a|0;b=b|0;return 1}function Ja(a,b){a=a|0;b=b|0;return 0}function Bj(a,b){a=a|0;b=b|0;return 2}function Bc(a){return Ec(a+80|0)+80|0}function pe(a){a=a|0;return H[a>>2]}function yh(){return Ha(pa(40))|0}function uh(){return Eb(pa(64))|0}function hh(){return _d(pa(84))|0}function Sc(a){a=a|0;if(a){oa(a)}}function zc(a){a=a|0;Ad(a);oa(a)}function Ef(a){a=a|0;return 1171}function Df(a){a=a|0;return 1245}function Cf(a){a=a|0;return 1211}function Ta(a){a=a|0;return a|0}function yf(a){a=a|0;oa(rd(a))}function fi(a){a=a|0;oa(Be(a))}function ei(a){a=a|0;oa(Ae(a))}function di(a){a=a|0;oa(ze(a))}function Tf(a){a=a|0;oa(_b(a))}function ld(a){a=a|0;return 3}function _a(a){a=a|0;return 0}function Ze(a){a=a|0;return 5}function Tb(a){a=a|0;return 2}function Ob(a){a=a|0;return 6}function Da(a){a=a|0;return 1}function $e(a){a=a|0;return 4}function sa(){Ue(1164);v()}function Na(){Ue(1232);v()}function La(a){a=a|0;oa(a)}function Ca(){af(1164);v()}function fb(a){a=a|0;v()}function eg(){return 10}function dg(){return 11}function cg(){return 12}function kg(){return 5}function ig(){return 6}function hg(){return 7}function gg(){return 8}function fg(){return 9}function fe(){return 3}function ee(){return 4}function bg(){return-2}function bc(){return-1}function ag(){return-3}function ac(){return 1}function Zf(){return-5}function Qb(){return 0}function Nc(){return 2}function $f(){return-4}function Nf(){X();v()}function Td(a){a=a|0} // EMSCRIPTEN_END_FUNCS e=I;p(q);var ea=c([null,Ad,Ta,La,Tb,Pj,zi,Gh,Fd,Bf,xc,Nh,_e,Bj,Ta,mi,ji,Da,gj,Ti,Ki,Re,xi,Je,_e,hi,wg,fb,dh,ke,jg,_f,Uf,eb,Ja,Nf,Pd,Da,rd,yf,Of,Af,zf,sf,rf,pd,xf,wf,vf,Pd,uf,tf,kf,jf,qf,pf,hf,of,nf,mf,lf,cf,bf,pd,gf,ff,nd,ef,Nj,Oj,Kj,Ub,Da,db,Pb,_a,md,Ja,_a,Da,Mj,Lj,fb,fb,Ub,Tb,Pb,Jj,Ij,Hj,$e,Pb,Gj,Fj,Ej,Dj,ld,wc,Da,Ja,vc,Cj,Aj,zj,yj,Ze,wc,Da,Ja,vc,Ye,xj,wj,vj,Ob,Xe,Da,Ja,We,Ve,uj,Ta,La,Mb,eb,Nb,fb,Ub,Da,Pb,tj,fb,Ub,Tb,Pb,sj,rj,qj,$e,Pb,pj,oj,nj,mj,ld,wc,Da,Ja,vc,lj,kj,jj,ij,Ze,wc,Da,Ja,vc,Ye,hj,fj,ej,Ob,Xe,Da,Ja,We,Ve,dj,Ta,La,Mb,eb,Lb,fb,Ub,_a,Da,cj,cf,bf,bj,$i,aj,Zi,Tb,_i,Yi,Xi,Ob,db,tc,Da,Ja,sc,Da,Tb,Te,Wi,Ta,La,Mb,eb,Nb,Ui,Si,Ob,tc,Da,Ja,sc,Te,Ri,Ta,La,Mb,eb,Lb,Ta,La,_a,Da,_a,md,Ja,Vi,Qi,Pi,Oi,Ob,db,tc,Da,Ja,sc,Da,ld,Se,Ni,Ta,La,Mb,eb,Nb,Li,Ji,Ob,tc,Da,Ja,sc,Se,Ii,Ta,La,Mb,eb,Lb,La,_a,Da,_a,md,Ja,Mi,Hi,Ai,yi,Gi,Ei,Fi,Di,Ci,Bi,vi,fb,Da,Da,wi,Dh,Ch,Da,_a,Ja,Ja,qi,pi,ti,ui,ri,oi,ni,li,si,Be,fi,jd,id,hd,gd,ki,Da,db,Zc,Ae,ei,jd,id,hd,gd,ii,Da,db,Zc,ze,di,jd,id,hd,gd,gi,Da,db,Zc,He,ci,Ie,bi,ai,Zh,Yh,Xh,Wh,_h,Vh,$h,Uh,Th,Rh,Qh,Ph,Oh,Sh,Mh,Lh,Kh,Jh,Ih,Wc,ve,Hh,Ta,La,Fh,Eh,fb,_a,Da,Wc,Ah,Bh,Wc,ve,zh,Yf,Xf,Wf,Vf,_b,Tf,Xd,Wd,Sf,Rf,Qf,_a,Pf,Ta,La,Td,Td,Mf,Gf,If,Lf,La,Hf,Jf,Kf,La,Df,La,Cf,La,Ef,zc,db,zc,zc]);function fa(){return E.byteLength/65536|0}function ka(la){la=la|0;var ga=fa()|0;var ha=ga+la|0;if(ga=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;assert(INITIAL_MEMORY>=65536,"INITIAL_MEMORY should be larger than STACK_SIZE, was "+INITIAL_MEMORY+"! (STACK_SIZE="+65536+")");if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":2147483648/65536})}updateMemoryViews();INITIAL_MEMORY=wasmMemory.buffer.byteLength;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="draco_decoder.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmTable=Module["asm"]["j"];addOnInit(Module["asm"]["i"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function _abort(){abort("")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var SYSCALLS={varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret}};function _fd_close(fd){return 52}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){return 70}var printCharBuffers=[null,[],[]];function printChar(stream,curr){var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module["WrapperObject"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module["getCache"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module["wrapPointer"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module["castObject"]=castObject;Module["NULL"]=wrapPointer(0);function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy object. (Did you create it yourself?)";obj["__destroy__"]();delete getCache(obj.__class__)[obj.ptr]}Module["destroy"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module["compare"]=compare;function getPointer(obj){return obj.ptr}Module["getPointer"]=getPointer;function getClass(obj){return obj.__class__}Module["getClass"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(ensureCache.needed){for(var i=0;i=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module["_malloc"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret},copy:function(array,view,offset){offset>>>=0;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offset>>>=1;break;case 4:offset>>>=2;break;case 8:offset>>>=3;break}for(var i=0;i3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=3)return true;if(version[0]!=0||version[1]>10)return false;return true}Module["isVersionSupported"]=isVersionSupported;var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}Module["print"]=typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null;Module["printErr"]=typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||Module["print"];Module.print=Module["print"];Module.printErr=Module["printErr"];for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;Module.printErr(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_max=Math.max;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+18640;__ATINIT__.push();memoryInitializer="data:application/octet-stream;base64,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cmFjbzI2U2VxdWVudGlhbEF0dHJpYnV0ZUVuY29kZXJFAE41ZHJhY28zN1NlcXVlbnRpYWxBdHRyaWJ1dGVFbmNvZGVyc0NvbnRyb2xsZXJFAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFRUUATjVkcmFjbzM3UHJlZGljdGlvblNjaGVtZVR5cGVkRW5jb2RlckludGVyZmFjZUlpaUVFAE41ZHJhY28zMlByZWRpY3Rpb25TY2hlbWVFbmNvZGVySW50ZXJmYWNlRQBONWRyYWNvMjVQcmVkaWN0aW9uU2NoZW1lSW50ZXJmYWNlRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQB1c2VfYnVpbHRfaW5fYXR0cmlidXRlX2NvbXByZXNzaW9uAE41ZHJhY28zM1NlcXVlbnRpYWxJbnRlZ2VyQXR0cmlidXRlRW5jb2RlckUATjVkcmFjbzI4UHJlZGljdGlvblNjaGVtZURlbHRhRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVFRQBONWRyYWNvMjNQcmVkaWN0aW9uU2NoZW1lRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JCYXNlSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMzJTZXF1ZW50aWFsTm9ybWFsQXR0cmlidXRlRW5jb2RlckUATjVkcmFjbzM4U2VxdWVudGlhbFF1YW50aXphdGlvbkF0dHJpYnV0ZUVuY29kZXJFAHByZWRpY3Rpb25fc2NoZW1lAE41ZHJhY28xMUVuY29kZXJCYXNlSU5TXzE4RW5jb2Rlck9wdGlvbnNCYXNlSWlFRUVFAE41ZHJhY283RW5jb2RlckUAIABONWRyYWNvMTNFeHBlcnRFbmNvZGVyRQBlbmNvZGluZ19tZXRob2QAcXVhbnRpemF0aW9uX2JpdHMASW52YWxpZCBlbmNvZGluZyBtZXRob2QuAGVuY29kaW5nX3NwZWVkAGRlY29kaW5nX3NwZWVkAHF1YW50aXphdGlvbl9vcmlnaW4AcXVhbnRpemF0aW9uX3JhbmdlAHN5bWJvbF9lbmNvZGluZ19tZXRob2QAc3ltYm9sX2VuY29kaW5nX2NvbXByZXNzaW9uX2xldmVsAHN0YW5kYXJkX2VkZ2VicmVha2VyAHByZWRpY3RpdmVfZWRnZWJyZWFrZXIAZWRnZWJyZWFrZXJfbWV0aG9kAE41ZHJhY28yMk1lc2hFZGdlYnJlYWtlckVuY29kZXJFAEFsbCB0cmlhbmdsZXMgYXJlIGRlZ2VuZXJhdGUuAEZhaWxlZCB0byBwcm9jZXNzIG1lc2ggaG9sZXMuAEZhaWxlZCB0byBpbml0aWFsaXplIGF0dHJpYnV0ZSBkYXRhLgBGYWlsZWQgdG8gZW5jb2RlIG1lc2ggY29tcG9uZW50LgBGYWlsZWQgdG8gZW5jb2RlIHNwbGl0IGRhdGEuAE41ZHJhY28xM1RyYXZlcnNlckJhc2VJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQBONWRyYWNvMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18xOURlcHRoRmlyc3RUcmF2ZXJzZXJJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAE41ZHJhY28xNVBvaW50c1NlcXVlbmNlckUATjVkcmFjbzEzVHJhdmVyc2VyQmFzZUlOU18xMUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzE5RGVwdGhGaXJzdFRyYXZlcnNlcklOU18xMUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18xOURlcHRoRmlyc3RUcmF2ZXJzZXJJTlNfMTFDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMl9FRUVFRUUATjVkcmFjbzI4TWF4UHJlZGljdGlvbkRlZ3JlZVRyYXZlcnNlcklOU18xMUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18yOE1heFByZWRpY3Rpb25EZWdyZWVUcmF2ZXJzZXJJTlNfMTFDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMl9FRUVFRUUAc3BsaXRfbWVzaF9vbl9zZWFtcwBONWRyYWNvMjZNZXNoRWRnZWJyZWFrZXJFbmNvZGVySW1wbElOU18zMU1lc2hFZGdlYnJlYWtlclRyYXZlcnNhbEVuY29kZXJFRUUATjVkcmFjbzM1TWVzaEVkZ2VicmVha2VyRW5jb2RlckltcGxJbnRlcmZhY2VFAE41ZHJhY28yNk1lc2hFZGdlYnJlYWtlckVuY29kZXJJbXBsSU5TXzM4TWVzaEVkZ2VicmVha2VyVHJhdmVyc2FsVmFsZW5jZUVuY29kZXJFRUUAc3RvcmVfbnVtYmVyX29mX2VuY29kZWRfZmFjZXMATjVkcmFjbzExTWVzaEVuY29kZXJFAGNvbXByZXNzX2Nvbm5lY3Rpdml0eQBONWRyYWNvMTVMaW5lYXJTZXF1ZW5jZXJFAE41ZHJhY28yMU1lc2hTZXF1ZW50aWFsRW5jb2RlckUATjVkcmFjbzE3UG9pbnRDbG91ZEVuY29kZXJFAEludmFsaWQgaW5wdXQgZ2VvbWV0cnkuAEZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIuAEZhaWxlZCB0byBlbmNvZGUgaW50ZXJuYWwgZGF0YS4ARmFpbGVkIHRvIGVuY29kZSBwb2ludCBhdHRyaWJ1dGVzLgBzdG9yZV9udW1iZXJfb2ZfZW5jb2RlZF9wb2ludHMARmFpbGVkIHRvIGVuY29kZSBtZXRhZGF0YS4ARFJBQ08ATjVkcmFjbzIzUG9pbnRDbG91ZEtkVHJlZUVuY29kZXJFAE41ZHJhY28yN1BvaW50Q2xvdWRTZXF1ZW50aWFsRW5jb2RlckUATjVkcmFjbzRNZXNoRQBhbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNpemVfdCBuKSAnbicgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBzaXplAE41ZHJhY28xMFBvaW50Q2xvdWRFABEACgAREREAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAEQAPChEREQMKBwABEwkLCwAACQYLAAALAAYRAAAAERERAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAABEACgoREREACgAAAgAJCwAAAAkACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAADQAAAAQNAAAAAAkOAAAAAAAOAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA8AAAAADwAAAAAJEAAAAAAAEAAAEAAAEgAAABISEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEhISAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAACgAAAAAKAAAAAAkLAAAAAAALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAALSsgICAwWDB4AChudWxsKQAtMFgrMFggMFgtMHgrMHggMHgAaW5mAElORgBOQU4AMDEyMzQ1Njc4OUFCQ0RFRi4AVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE5vIGVycm9yIGluZm9ybWF0aW9uAABpbmZpbml0eQBuYW4AJWQAJWYAdGVybWluYXRpbmcgd2l0aCAlcyBleGNlcHRpb24gb2YgdHlwZSAlczogJXMAdGVybWluYXRpbmcgd2l0aCAlcyBleGNlcHRpb24gb2YgdHlwZSAlcwB0ZXJtaW5hdGluZyB3aXRoICVzIGZvcmVpZ24gZXhjZXB0aW9uAHRlcm1pbmF0aW5nAHVuY2F1Z2h0AFN0OWV4Y2VwdGlvbgBOMTBfX2N4eGFiaXYxMTZfX3NoaW1fdHlwZV9pbmZvRQBTdDl0eXBlX2luZm8ATjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FAE4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRQBwdGhyZWFkX29uY2UgZmFpbHVyZSBpbiBfX2N4YV9nZXRfZ2xvYmFsc19mYXN0KCkAY2Fubm90IGNyZWF0ZSBwdGhyZWFkIGtleSBmb3IgX19jeGFfZ2V0X2dsb2JhbHMoKQBjYW5ub3QgemVybyBvdXQgdGhyZWFkIHZhbHVlIGZvciBfX2N4YV9nZXRfZ2xvYmFscygpAHRlcm1pbmF0ZV9oYW5kbGVyIHVuZXhwZWN0ZWRseSByZXR1cm5lZABTdDExbG9naWNfZXJyb3IAU3QxMmxlbmd0aF9lcnJvcgBOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRQBOMTBfX2N4eGFiaXYxMTdfX3BiYXNlX3R5cGVfaW5mb0U=";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___cxa_allocate_exception(size){return _malloc(size)}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",ALLOC_STATIC);function ___gxx_personality_v0(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i2147483648)return false;b=new a(newBuffer);d=new c(newBuffer);f=new e(newBuffer);h=new g(newBuffer);j=new i(newBuffer);l=new k(newBuffer);n=new m(newBuffer);p=new o(newBuffer);buffer=newBuffer;return true} // EMSCRIPTEN_START_FUNCS function wc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!a)return;b=a+-8|0;c=f[4516]|0;d=f[a+-4>>2]|0;a=d&-8;e=b+a|0;do if(!(d&1)){g=f[b>>2]|0;if(!(d&3))return;h=b+(0-g)|0;i=g+a|0;if(h>>>0>>0)return;if((f[4517]|0)==(h|0)){j=e+4|0;k=f[j>>2]|0;if((k&3|0)!=3){l=h;m=i;n=h;break}f[4514]=i;f[j>>2]=k&-2;f[h+4>>2]=i|1;f[h+i>>2]=i;return}k=g>>>3;if(g>>>0<256){g=f[h+8>>2]|0;j=f[h+12>>2]|0;if((j|0)==(g|0)){f[4512]=f[4512]&~(1<>2]=j;f[j+8>>2]=g;l=h;m=i;n=h;break}}g=f[h+24>>2]|0;j=f[h+12>>2]|0;do if((j|0)==(h|0)){k=h+16|0;o=k+4|0;p=f[o>>2]|0;if(!p){q=f[k>>2]|0;if(!q){r=0;break}else{s=q;t=k}}else{s=p;t=o}while(1){o=s+20|0;p=f[o>>2]|0;if(p|0){s=p;t=o;continue}o=s+16|0;p=f[o>>2]|0;if(!p)break;else{s=p;t=o}}f[t>>2]=0;r=s}else{o=f[h+8>>2]|0;f[o+12>>2]=j;f[j+8>>2]=o;r=j}while(0);if(g){j=f[h+28>>2]|0;o=18352+(j<<2)|0;if((f[o>>2]|0)==(h|0)){f[o>>2]=r;if(!r){f[4513]=f[4513]&~(1<>2]|0)!=(h|0)&1)<<2)>>2]=r;if(!r){l=h;m=i;n=h;break}}f[r+24>>2]=g;j=h+16|0;o=f[j>>2]|0;if(o|0){f[r+16>>2]=o;f[o+24>>2]=r}o=f[j+4>>2]|0;if(o){f[r+20>>2]=o;f[o+24>>2]=r;l=h;m=i;n=h}else{l=h;m=i;n=h}}else{l=h;m=i;n=h}}else{l=b;m=a;n=b}while(0);if(n>>>0>=e>>>0)return;b=e+4|0;a=f[b>>2]|0;if(!(a&1))return;if(!(a&2)){if((f[4518]|0)==(e|0)){r=(f[4515]|0)+m|0;f[4515]=r;f[4518]=l;f[l+4>>2]=r|1;if((l|0)!=(f[4517]|0))return;f[4517]=0;f[4514]=0;return}if((f[4517]|0)==(e|0)){r=(f[4514]|0)+m|0;f[4514]=r;f[4517]=n;f[l+4>>2]=r|1;f[n+r>>2]=r;return}r=(a&-8)+m|0;s=a>>>3;do if(a>>>0<256){t=f[e+8>>2]|0;c=f[e+12>>2]|0;if((c|0)==(t|0)){f[4512]=f[4512]&~(1<>2]=c;f[c+8>>2]=t;break}}else{t=f[e+24>>2]|0;c=f[e+12>>2]|0;do if((c|0)==(e|0)){d=e+16|0;o=d+4|0;j=f[o>>2]|0;if(!j){p=f[d>>2]|0;if(!p){u=0;break}else{v=p;w=d}}else{v=j;w=o}while(1){o=v+20|0;j=f[o>>2]|0;if(j|0){v=j;w=o;continue}o=v+16|0;j=f[o>>2]|0;if(!j)break;else{v=j;w=o}}f[w>>2]=0;u=v}else{o=f[e+8>>2]|0;f[o+12>>2]=c;f[c+8>>2]=o;u=c}while(0);if(t|0){c=f[e+28>>2]|0;h=18352+(c<<2)|0;if((f[h>>2]|0)==(e|0)){f[h>>2]=u;if(!u){f[4513]=f[4513]&~(1<>2]|0)!=(e|0)&1)<<2)>>2]=u;if(!u)break}f[u+24>>2]=t;c=e+16|0;h=f[c>>2]|0;if(h|0){f[u+16>>2]=h;f[h+24>>2]=u}h=f[c+4>>2]|0;if(h|0){f[u+20>>2]=h;f[h+24>>2]=u}}}while(0);f[l+4>>2]=r|1;f[n+r>>2]=r;if((l|0)==(f[4517]|0)){f[4514]=r;return}else x=r}else{f[b>>2]=a&-2;f[l+4>>2]=m|1;f[n+m>>2]=m;x=m}m=x>>>3;if(x>>>0<256){n=18088+(m<<1<<2)|0;a=f[4512]|0;b=1<>2]|0;z=b}f[z>>2]=l;f[y+12>>2]=l;f[l+8>>2]=y;f[l+12>>2]=n;return}n=x>>>8;if(n)if(x>>>0>16777215)A=31;else{y=(n+1048320|0)>>>16&8;z=n<>>16&4;b=z<>>16&2;a=14-(n|y|z)+(b<>>15)|0;A=x>>>(a+7|0)&1|a<<1}else A=0;a=18352+(A<<2)|0;f[l+28>>2]=A;f[l+20>>2]=0;f[l+16>>2]=0;z=f[4513]|0;b=1<>>1)|0);n=f[a>>2]|0;while(1){if((f[n+4>>2]&-8|0)==(x|0)){B=73;break}C=n+16+(y>>>31<<2)|0;m=f[C>>2]|0;if(!m){B=72;break}else{y=y<<1;n=m}}if((B|0)==72){f[C>>2]=l;f[l+24>>2]=n;f[l+12>>2]=l;f[l+8>>2]=l;break}else if((B|0)==73){y=n+8|0;t=f[y>>2]|0;f[t+12>>2]=l;f[y>>2]=l;f[l+8>>2]=t;f[l+12>>2]=n;f[l+24>>2]=0;break}}else{f[4513]=z|b;f[a>>2]=l;f[l+24>>2]=a;f[l+12>>2]=l;f[l+8>>2]=l}while(0);l=(f[4520]|0)+-1|0;f[4520]=l;if(!l)D=18504;else return;while(1){l=f[D>>2]|0;if(!l)break;else D=l+8|0}f[4520]=-1;return}function xc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=Oa,F=Oa,G=Oa,H=0,I=0,J=0,K=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;e=i;j=i;while(1){k=X(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;e=(X(k>>>24^k,1540483477)|0)^(X(e,1540483477)|0);j=j+-4|0;if(j>>>0<=3)break;else d=d+4|0}d=i+-4|0;j=d&-4;l=d-j|0;m=g+(j+4)|0;o=e}else{l=i;m=g;o=i}switch(l|0){case 3:{p=h[m+2>>0]<<16^o;q=6;break}case 2:{p=o;q=6;break}case 1:{r=o;q=7;break}default:s=o}if((q|0)==6){r=h[m+1>>0]<<8^p;q=7}if((q|0)==7)s=X(r^h[m>>0],1540483477)|0;m=X(s>>>13^s,1540483477)|0;s=m>>>15^m;m=a+4|0;r=f[m>>2]|0;p=(r|0)==0;a:do if(!p){o=r+-1|0;l=(o&r|0)==0;if(!l)if(s>>>0>>0)t=s;else t=(s>>>0)%(r>>>0)|0;else t=s&o;e=f[(f[a>>2]|0)+(t<<2)>>2]|0;if((e|0)!=0?(j=f[e>>2]|0,(j|0)!=0):0){e=(i|0)==0;if(l){if(e){l=j;while(1){d=f[l+4>>2]|0;if(!((d|0)==(s|0)|(d&o|0)==(t|0))){u=t;break a}d=b[l+8+11>>0]|0;if(!((d<<24>>24<0?f[l+12>>2]|0:d&255)|0)){v=l;break}l=f[l>>2]|0;if(!l){u=t;break a}}w=v+20|0;return w|0}else x=j;b:while(1){l=f[x+4>>2]|0;if(!((l|0)==(s|0)|(l&o|0)==(t|0))){u=t;break a}l=x+8|0;d=b[l+11>>0]|0;k=d<<24>>24<0;y=d&255;do if(((k?f[x+12>>2]|0:y)|0)==(i|0)){d=f[l>>2]|0;if(k)if(!(Pk(d,g,i)|0)){v=x;q=63;break b}else break;if((b[g>>0]|0)==(d&255)<<24>>24){d=l;z=y;A=g;do{z=z+-1|0;d=d+1|0;if(!z){v=x;q=63;break b}A=A+1|0}while((b[d>>0]|0)==(b[A>>0]|0))}}while(0);x=f[x>>2]|0;if(!x){u=t;break a}}if((q|0)==63){w=v+20|0;return w|0}}if(e){o=j;while(1){y=f[o+4>>2]|0;if((y|0)!=(s|0)){if(y>>>0>>0)B=y;else B=(y>>>0)%(r>>>0)|0;if((B|0)!=(t|0)){u=t;break a}}y=b[o+8+11>>0]|0;if(!((y<<24>>24<0?f[o+12>>2]|0:y&255)|0)){v=o;break}o=f[o>>2]|0;if(!o){u=t;break a}}w=v+20|0;return w|0}else C=j;c:while(1){o=f[C+4>>2]|0;if((o|0)!=(s|0)){if(o>>>0>>0)D=o;else D=(o>>>0)%(r>>>0)|0;if((D|0)!=(t|0)){u=t;break a}}o=C+8|0;e=b[o+11>>0]|0;y=e<<24>>24<0;l=e&255;do if(((y?f[C+12>>2]|0:l)|0)==(i|0)){e=f[o>>2]|0;if(y)if(!(Pk(e,g,i)|0)){v=C;q=63;break c}else break;if((b[g>>0]|0)==(e&255)<<24>>24){e=o;k=l;A=g;do{k=k+-1|0;e=e+1|0;if(!k){v=C;q=63;break c}A=A+1|0}while((b[e>>0]|0)==(b[A>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){u=t;break a}}if((q|0)==63){w=v+20|0;return w|0}}else u=t}else u=0;while(0);t=dn(24)|0;dj(t+8|0,c);f[t+20>>2]=0;f[t+4>>2]=s;f[t>>2]=0;c=a+12|0;E=$(((f[c>>2]|0)+1|0)>>>0);F=$(r>>>0);G=$(n[a+16>>2]);do if(p|$(G*F)>>0<3|(r+-1&r|0)!=0)&1;g=~~$(W($(E/G)))>>>0;Ph(a,C>>>0>>0?g:C);C=f[m>>2]|0;g=C+-1|0;if(!(g&C)){H=C;I=g&s;break}if(s>>>0>>0){H=C;I=s}else{H=C;I=(s>>>0)%(C>>>0)|0}}else{H=r;I=u}while(0);u=(f[a>>2]|0)+(I<<2)|0;I=f[u>>2]|0;if(!I){r=a+8|0;f[t>>2]=f[r>>2];f[r>>2]=t;f[u>>2]=r;r=f[t>>2]|0;if(r|0){u=f[r+4>>2]|0;r=H+-1|0;if(r&H)if(u>>>0>>0)J=u;else J=(u>>>0)%(H>>>0)|0;else J=u&r;K=(f[a>>2]|0)+(J<<2)|0;q=61}}else{f[t>>2]=f[I>>2];K=I;q=61}if((q|0)==61)f[K>>2]=t;f[c>>2]=(f[c>>2]|0)+1;v=t;w=v+20|0;return w|0}function yc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0.0,R=0.0,S=0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0.0,da=0,ea=0.0;g=a+4|0;i=f[g>>2]|0;j=a+100|0;if(i>>>0<(f[j>>2]|0)>>>0){f[g>>2]=i+1;k=h[i>>0]|0;l=0}else{k=Di(a)|0;l=0}a:while(1){switch(k|0){case 46:{m=8;break a;break}case 48:break;default:{n=0;o=0;p=1.0;q=0.0;r=0;s=k;t=l;u=0;v=0;w=0;x=0;break a}}i=f[g>>2]|0;if(i>>>0<(f[j>>2]|0)>>>0){f[g>>2]=i+1;k=h[i>>0]|0;l=1;continue}else{k=Di(a)|0;l=1;continue}}if((m|0)==8){k=f[g>>2]|0;if(k>>>0<(f[j>>2]|0)>>>0){f[g>>2]=k+1;y=h[k>>0]|0}else y=Di(a)|0;if((y|0)==48){k=0;i=0;while(1){z=f[g>>2]|0;if(z>>>0<(f[j>>2]|0)>>>0){f[g>>2]=z+1;A=h[z>>0]|0}else A=Di(a)|0;z=Tn(k|0,i|0,-1,-1)|0;B=I;if((A|0)==48){k=z;i=B}else{n=1;o=0;p=1.0;q=0.0;r=0;s=A;t=1;u=0;v=0;w=z;x=B;break}}}else{n=1;o=0;p=1.0;q=0.0;r=0;s=y;t=l;u=0;v=0;w=0;x=0}}while(1){l=s+-48|0;y=s|32;if(l>>>0>=10){A=(s|0)==46;if(!(A|(y+-97|0)>>>0<6)){C=s;break}if(A)if(!n){D=1;E=o;F=p;G=q;H=r;J=t;K=v;L=u;M=v;N=u}else{C=46;break}else m=20}else m=20;if((m|0)==20){m=0;A=(s|0)>57?y+-87|0:l;do if(!((u|0)<0|(u|0)==0&v>>>0<8))if((u|0)<0|(u|0)==0&v>>>0<14){O=p*.0625;P=o;Q=O;R=q+O*+(A|0);S=r;break}else{l=(o|0)!=0|(A|0)==0;P=l?o:1;Q=p;R=l?q:q+p*.5;S=r;break}else{P=o;Q=p;R=q;S=A+(r<<4)|0}while(0);A=Tn(v|0,u|0,1,0)|0;D=n;E=P;F=Q;G=R;H=S;J=1;K=w;L=x;M=A;N=I}A=f[g>>2]|0;if(A>>>0<(f[j>>2]|0)>>>0){f[g>>2]=A+1;n=D;o=E;p=F;q=G;r=H;s=h[A>>0]|0;t=J;u=N;v=M;w=K;x=L;continue}else{n=D;o=E;p=F;q=G;r=H;s=Di(a)|0;t=J;u=N;v=M;w=K;x=L;continue}}do if(!t){L=(f[j>>2]|0)==0;if(!L)f[g>>2]=(f[g>>2]|0)+-1;if(e){if(!L)f[g>>2]=(f[g>>2]|0)+-1;if(!((n|0)==0|L))f[g>>2]=(f[g>>2]|0)+-1}else Rm(a,0);T=+(d|0)*0.0}else{L=(n|0)==0;K=L?v:w;M=L?u:x;if((u|0)<0|(u|0)==0&v>>>0<8){L=r;N=v;J=u;while(1){s=L<<4;H=N;N=Tn(N|0,J|0,1,0)|0;if(!((J|0)<0|(J|0)==0&H>>>0<7)){U=s;break}else{L=s;J=I}}}else U=r;if((C|32|0)==112){J=De(a,e)|0;L=I;if((J|0)==0&(L|0)==-2147483648){if(!e){Rm(a,0);T=0.0;break}if(!(f[j>>2]|0)){V=0;W=0}else{f[g>>2]=(f[g>>2]|0)+-1;V=0;W=0}}else{V=J;W=L}}else if(!(f[j>>2]|0)){V=0;W=0}else{f[g>>2]=(f[g>>2]|0)+-1;V=0;W=0}L=Rn(K|0,M|0,2)|0;J=Tn(L|0,I|0,-32,-1)|0;L=Tn(J|0,I|0,V|0,W|0)|0;J=I;if(!U){T=+(d|0)*0.0;break}N=0-c|0;s=((N|0)<0)<<31>>31;if((J|0)>(s|0)|(J|0)==(s|0)&L>>>0>N>>>0){N=ir()|0;f[N>>2]=34;T=+(d|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}N=c+-106|0;s=((N|0)<0)<<31>>31;if((J|0)<(s|0)|(J|0)==(s|0)&L>>>0>>0){N=ir()|0;f[N>>2]=34;T=+(d|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if((U|0)>-1){G=q;N=U;s=L;H=J;while(1){E=!(G>=.5);o=N<<1|(E^1)&1;F=G+(E?G:G+-1.0);E=Tn(s|0,H|0,-1,-1)|0;D=I;if((o|0)>-1){G=F;N=o;s=E;H=D}else{X=F;Y=o;Z=E;_=D;break}}}else{X=q;Y=U;Z=L;_=J}H=((b|0)<0)<<31>>31;s=Vn(32,0,c|0,((c|0)<0)<<31>>31|0)|0;N=Tn(s|0,I|0,Z|0,_|0)|0;s=I;if((s|0)<(H|0)|(s|0)==(H|0)&N>>>0>>0)if((N|0)>0){$=N;m=59}else{aa=0;ba=84;m=61}else{$=b;m=59}if((m|0)==59)if(($|0)<53){aa=$;ba=84-$|0;m=61}else{ca=0.0;da=$;ea=+(d|0)}if((m|0)==61){G=+(d|0);ca=+Gq(+Wj(1.0,ba),G);da=aa;ea=G}N=(Y&1|0)==0&(X!=0.0&(da|0)<32);G=(N?0.0:X)*ea+(ca+ea*+((Y+(N&1)|0)>>>0))-ca;if(!(G!=0.0)){N=ir()|0;f[N>>2]=34}T=+Hq(G,Z)}while(0);return +T}function zc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=u;u=u+16|0;h=g+4|0;i=g;if(!(oh(a,d)|0)){j=0;u=g;return j|0}d=a+84|0;k=f[d>>2]|0;l=a+88|0;m=f[l>>2]|0;if((m|0)!=(k|0))f[l>>2]=m+(~((m+-4-k|0)>>>2)<<2);f[d>>2]=0;f[l>>2]=0;f[a+92>>2]=0;if(k|0)br(k);k=a+72|0;l=f[k>>2]|0;d=a+76|0;if((f[d>>2]|0)!=(l|0))f[d>>2]=l;f[k>>2]=0;f[d>>2]=0;f[a+80>>2]=0;if(l|0)br(l);l=a+64|0;d=f[l>>2]|0;if((f[d+4>>2]|0)!=(f[d>>2]|0)){k=a+12|0;m=e+84|0;n=e+68|0;o=c+96|0;p=a+24|0;q=0;r=d;do{f[i>>2]=(q>>>0)/3|0;f[h>>2]=f[i>>2];d=Rj(r,h)|0;r=f[l>>2]|0;do if(!d){s=f[(f[r+12>>2]|0)+(q<<2)>>2]|0;if((s|0)==-1){t=(f[a>>2]|0)+(q>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(q&31);t=q+1|0;v=((t>>>0)%3|0|0)==0?q+-2|0:t;if((v|0)==-1)w=-1;else w=f[(f[r>>2]|0)+(v<<2)>>2]|0;v=(f[k>>2]|0)+(w>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(w&31);v=(((q>>>0)%3|0|0)==0?2:-1)+q|0;if((v|0)==-1)x=-1;else x=f[(f[r>>2]|0)+(v<<2)>>2]|0;v=(f[k>>2]|0)+(x>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(x&31);break}if(s>>>0>=q>>>0){v=q+1|0;t=((v>>>0)%3|0|0)==0?q+-2|0:v;y=s+(((s>>>0)%3|0|0)==0?2:-1)|0;z=(t|0)==-1;if(!(b[m>>0]|0)){if(z)A=-1;else A=f[(f[o>>2]|0)+(((t|0)/3|0)*12|0)+(((t|0)%3|0)<<2)>>2]|0;B=(y|0)==-1;if(B)C=-1;else C=f[(f[o>>2]|0)+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;D=f[n>>2]|0;if((f[D+(A<<2)>>2]|0)==(f[D+(C<<2)>>2]|0)){E=t+1|0;if(z)F=-1;else F=((E>>>0)%3|0|0)==0?t+-2|0:E;do if(!B)if(!((y>>>0)%3|0)){G=y+2|0;break}else{G=y+-1|0;break}else G=-1;while(0);if((F|0)==-1)H=-1;else H=f[(f[o>>2]|0)+(((F|0)/3|0)*12|0)+(((F|0)%3|0)<<2)>>2]|0;if((G|0)==-1)I=-1;else I=f[(f[o>>2]|0)+(((G|0)/3|0)*12|0)+(((G|0)%3|0)<<2)>>2]|0;if((f[D+(H<<2)>>2]|0)==(f[D+(I<<2)>>2]|0))break}}else{if(z)J=-1;else J=f[(f[o>>2]|0)+(((t|0)/3|0)*12|0)+(((t|0)%3|0)<<2)>>2]|0;B=(y|0)==-1;if(B)K=-1;else K=f[(f[o>>2]|0)+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;if((J|0)==(K|0)){E=t+1|0;if(z)L=-1;else L=((E>>>0)%3|0|0)==0?t+-2|0:E;do if(!B)if(!((y>>>0)%3|0)){M=y+2|0;break}else{M=y+-1|0;break}else M=-1;while(0);if((L|0)==-1)N=-1;else N=f[(f[o>>2]|0)+(((L|0)/3|0)*12|0)+(((L|0)%3|0)<<2)>>2]|0;if((M|0)==-1)O=-1;else O=f[(f[o>>2]|0)+(((M|0)/3|0)*12|0)+(((M|0)%3|0)<<2)>>2]|0;if((N|0)==(O|0))break}}b[p>>0]=0;y=f[a>>2]|0;B=y+(q>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(q&31);B=y+(s>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(s&31);B=((v>>>0)%3|0|0)==0?q+-2|0:v;if((B|0)==-1)P=-1;else P=f[(f[r>>2]|0)+(B<<2)>>2]|0;B=(f[k>>2]|0)+(P>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(P&31);B=(((q>>>0)%3|0|0)==0?2:-1)+q|0;if((B|0)==-1)Q=-1;else Q=f[(f[r>>2]|0)+(B<<2)>>2]|0;B=(f[k>>2]|0)+(Q>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(Q&31);B=s+1|0;y=((B>>>0)%3|0|0)==0?s+-2|0:B;if((y|0)==-1)R=-1;else R=f[(f[r>>2]|0)+(y<<2)>>2]|0;y=(f[k>>2]|0)+(R>>>5<<2)|0;f[y>>2]=f[y>>2]|1<<(R&31);y=(((s>>>0)%3|0|0)==0?2:-1)+s|0;if((y|0)==-1)S=-1;else S=f[(f[r>>2]|0)+(y<<2)>>2]|0;y=(f[k>>2]|0)+(S>>>5<<2)|0;f[y>>2]=f[y>>2]|1<<(S&31)}}while(0);q=q+1|0}while(q>>>0<(f[r+4>>2]|0)-(f[r>>2]|0)>>2>>>0)}if((c|0)!=0&(e|0)!=0){Kc(a,c,e);j=1;u=g;return j|0}else{gd(a,0,0);j=1;u=g;return j|0}return 0}function Ac(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;d=u;u=u+32|0;e=d+12|0;g=d+8|0;h=d+4|0;i=d;j=a+8|0;a:do if(f[j>>2]|0?(k=f[a>>2]|0,l=a+4|0,f[a>>2]=l,f[(f[l>>2]|0)+8>>2]=0,f[l>>2]=0,f[j>>2]=0,m=f[k+4>>2]|0,n=(m|0)==0?k:m,n|0):0){m=a+4|0;k=n;n=f[b>>2]|0;while(1){if((n|0)==(f[c>>2]|0))break;o=k+16|0;f[o>>2]=f[n+16>>2];if((k|0)!=(n|0)){f[h>>2]=f[n+20>>2];f[i>>2]=n+24;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Hc(k+20|0,g,e)}p=k+8|0;q=f[p>>2]|0;do if(q){r=f[q>>2]|0;if((r|0)==(k|0)){f[q>>2]=0;s=f[q+4>>2]|0;if(!s){t=q;break}else v=s;while(1){s=f[v>>2]|0;if(s|0){v=s;continue}s=f[v+4>>2]|0;if(!s)break;else v=s}t=v;break}else{f[q+4>>2]=0;if(!r){t=q;break}else w=r;while(1){s=f[w>>2]|0;if(s|0){w=s;continue}s=f[w+4>>2]|0;if(!s)break;else w=s}t=w;break}}else t=0;while(0);q=f[l>>2]|0;do if(q){r=f[o>>2]|0;s=q;while(1){if((r|0)<(f[s+16>>2]|0)){x=f[s>>2]|0;if(!x){y=22;break}else z=x}else{A=s+4|0;x=f[A>>2]|0;if(!x){y=25;break}else z=x}s=z}if((y|0)==22){y=0;B=s;C=s;break}else if((y|0)==25){y=0;B=s;C=A;break}}else{B=l;C=l}while(0);f[k>>2]=0;f[k+4>>2]=0;f[p>>2]=B;f[C>>2]=k;q=f[f[a>>2]>>2]|0;if(!q)D=k;else{f[a>>2]=q;D=f[C>>2]|0}Ae(f[m>>2]|0,D);f[j>>2]=(f[j>>2]|0)+1;q=f[n+4>>2]|0;if(!q){o=n+8|0;r=f[o>>2]|0;if((f[r>>2]|0)==(n|0))E=r;else{r=o;do{o=f[r>>2]|0;r=o+8|0;x=f[r>>2]|0}while((f[x>>2]|0)!=(o|0));E=x}}else{r=q;while(1){p=f[r>>2]|0;if(!p)break;else r=p}E=r}f[b>>2]=E;if(!t)break a;else{k=t;n=E}}n=f[k+8>>2]|0;if(!n)F=k;else{m=n;while(1){n=f[m+8>>2]|0;if(!n)break;else m=n}F=m}Dj(a,F)}while(0);F=f[b>>2]|0;E=f[c>>2]|0;if((F|0)==(E|0)){u=d;return}c=a+4|0;t=a+4|0;D=F;while(1){tg(e,a,D+16|0);F=f[c>>2]|0;do if(F){C=f[e>>2]|0;B=f[C+16>>2]|0;A=F;while(1){if((B|0)<(f[A+16>>2]|0)){z=f[A>>2]|0;if(!z){y=43;break}else G=z}else{H=A+4|0;z=f[H>>2]|0;if(!z){y=46;break}else G=z}A=G}if((y|0)==43){y=0;I=A;J=A;K=C;break}else if((y|0)==46){y=0;I=A;J=H;K=C;break}}else{I=c;J=c;K=f[e>>2]|0}while(0);f[K>>2]=0;f[K+4>>2]=0;f[K+8>>2]=I;f[J>>2]=K;F=f[f[a>>2]>>2]|0;if(!F)L=K;else{f[a>>2]=F;L=f[J>>2]|0}Ae(f[t>>2]|0,L);f[j>>2]=(f[j>>2]|0)+1;F=f[D+4>>2]|0;if(!F){m=D+8|0;B=f[m>>2]|0;if((f[B>>2]|0)==(D|0))M=B;else{B=m;do{m=f[B>>2]|0;B=m+8|0;r=f[B>>2]|0}while((f[r>>2]|0)!=(m|0));M=r}}else{B=F;while(1){r=f[B>>2]|0;if(!r)break;else B=r}M=B}f[b>>2]=M;if((M|0)==(E|0))break;else D=M}u=d;return}function Bc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;g=a+8|0;Ah(g,b,d,e);d=e>>>0>1073741823?-1:e<<2;h=_q(d)|0;hj(h|0,0,d|0)|0;d=f[a+48>>2]|0;i=f[a+56>>2]|0;j=f[i>>2]|0;k=(f[i+4>>2]|0)-j|0;l=k>>2;a:do if((k|0)>4){m=f[a+52>>2]|0;n=a+16|0;o=a+32|0;p=a+12|0;q=a+28|0;r=a+20|0;s=a+24|0;t=d+12|0;u=(e|0)>0;v=j;w=l;while(1){x=w;w=w+-1|0;if(l>>>0<=w>>>0)break;y=f[v+(w<<2)>>2]|0;z=X(w,e)|0;if((y|0)!=-1?(A=f[(f[t>>2]|0)+(y<<2)>>2]|0,(A|0)!=-1):0){y=f[d>>2]|0;B=f[m>>2]|0;C=f[B+(f[y+(A<<2)>>2]<<2)>>2]|0;D=A+1|0;E=((D>>>0)%3|0|0)==0?A+-2|0:D;if((E|0)==-1)F=-1;else F=f[y+(E<<2)>>2]|0;E=f[B+(F<<2)>>2]|0;D=(((A>>>0)%3|0|0)==0?2:-1)+A|0;if((D|0)==-1)G=-1;else G=f[y+(D<<2)>>2]|0;D=f[B+(G<<2)>>2]|0;if((C|0)<(w|0)&(E|0)<(w|0)&(D|0)<(w|0)){B=X(C,e)|0;C=X(E,e)|0;E=X(D,e)|0;if(u){D=0;do{f[h+(D<<2)>>2]=(f[b+(D+E<<2)>>2]|0)+(f[b+(D+C<<2)>>2]|0)-(f[b+(D+B<<2)>>2]|0);D=D+1|0}while((D|0)!=(e|0))}D=b+(z<<2)|0;B=c+(z<<2)|0;C=f[g>>2]|0;if((C|0)>0){E=0;y=h;A=C;while(1){if((A|0)>0){C=0;do{H=f[y+(C<<2)>>2]|0;I=f[n>>2]|0;if((H|0)>(I|0)){J=f[o>>2]|0;f[J+(C<<2)>>2]=I;K=J}else{J=f[p>>2]|0;I=f[o>>2]|0;f[I+(C<<2)>>2]=(H|0)<(J|0)?J:H;K=I}C=C+1|0}while((C|0)<(f[g>>2]|0));L=K}else L=f[o>>2]|0;C=(f[D+(E<<2)>>2]|0)-(f[L+(E<<2)>>2]|0)|0;I=B+(E<<2)|0;f[I>>2]=C;if((C|0)>=(f[q>>2]|0)){if((C|0)>(f[s>>2]|0)){M=C-(f[r>>2]|0)|0;N=42}}else{M=(f[r>>2]|0)+C|0;N=42}if((N|0)==42){N=0;f[I>>2]=M}E=E+1|0;A=f[g>>2]|0;if((E|0)>=(A|0))break;else y=L}}}else N=16}else N=16;if((N|0)==16?(N=0,y=b+(z<<2)|0,A=c+(z<<2)|0,E=f[g>>2]|0,(E|0)>0):0){B=0;D=b+((X(x+-2|0,e)|0)<<2)|0;I=E;while(1){if((I|0)>0){E=0;do{C=f[D+(E<<2)>>2]|0;H=f[n>>2]|0;if((C|0)>(H|0)){J=f[o>>2]|0;f[J+(E<<2)>>2]=H;O=J}else{J=f[p>>2]|0;H=f[o>>2]|0;f[H+(E<<2)>>2]=(C|0)<(J|0)?J:C;O=H}E=E+1|0}while((E|0)<(f[g>>2]|0));P=O}else P=f[o>>2]|0;E=(f[y+(B<<2)>>2]|0)-(f[P+(B<<2)>>2]|0)|0;H=A+(B<<2)|0;f[H>>2]=E;if((E|0)>=(f[q>>2]|0)){if((E|0)>(f[s>>2]|0)){Q=E-(f[r>>2]|0)|0;N=29}}else{Q=(f[r>>2]|0)+E|0;N=29}if((N|0)==29){N=0;f[H>>2]=Q}B=B+1|0;I=f[g>>2]|0;if((B|0)>=(I|0))break;else D=P}}if((x|0)<=2)break a}mq(i)}while(0);if((e|0)>0)hj(h|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){$q(h);return 1}i=a+16|0;P=a+32|0;Q=a+12|0;O=a+28|0;L=a+20|0;M=a+24|0;a=0;K=h;G=e;while(1){if((G|0)>0){e=0;do{F=f[K+(e<<2)>>2]|0;d=f[i>>2]|0;if((F|0)>(d|0)){l=f[P>>2]|0;f[l+(e<<2)>>2]=d;R=l}else{l=f[Q>>2]|0;d=f[P>>2]|0;f[d+(e<<2)>>2]=(F|0)<(l|0)?l:F;R=d}e=e+1|0}while((e|0)<(f[g>>2]|0));S=R}else S=f[P>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[S+(a<<2)>>2]|0)|0;d=c+(a<<2)|0;f[d>>2]=e;if((e|0)>=(f[O>>2]|0)){if((e|0)>(f[M>>2]|0)){T=e-(f[L>>2]|0)|0;N=56}}else{T=(f[L>>2]|0)+e|0;N=56}if((N|0)==56){N=0;f[d>>2]=T}a=a+1|0;G=f[g>>2]|0;if((a|0)>=(G|0))break;else K=S}$q(h);return 1}function Cc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=a+8|0;Ah(g,b,d,e);d=e>>>0>1073741823?-1:e<<2;h=_q(d)|0;hj(h|0,0,d|0)|0;d=f[a+48>>2]|0;i=f[a+56>>2]|0;j=f[i>>2]|0;k=(f[i+4>>2]|0)-j|0;l=k>>2;a:do if((k|0)>4){m=f[a+52>>2]|0;n=a+16|0;o=a+32|0;p=a+12|0;q=a+28|0;r=a+20|0;s=a+24|0;t=d+64|0;u=d+28|0;v=(e|0)>0;w=j;x=l;while(1){y=x;x=x+-1|0;if(l>>>0<=x>>>0)break;z=f[w+(x<<2)>>2]|0;A=X(x,e)|0;if((((z|0)!=-1?(f[(f[d>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(B=f[(f[(f[t>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,(B|0)!=-1):0)?(z=f[u>>2]|0,C=f[m>>2]|0,D=f[C+(f[z+(B<<2)>>2]<<2)>>2]|0,E=B+1|0,F=f[C+(f[z+((((E>>>0)%3|0|0)==0?B+-2|0:E)<<2)>>2]<<2)>>2]|0,E=f[C+(f[z+((((B>>>0)%3|0|0)==0?2:-1)+B<<2)>>2]<<2)>>2]|0,(D|0)<(x|0)&(F|0)<(x|0)&(E|0)<(x|0)):0){B=X(D,e)|0;D=X(F,e)|0;F=X(E,e)|0;if(v){E=0;do{f[h+(E<<2)>>2]=(f[b+(E+F<<2)>>2]|0)+(f[b+(E+D<<2)>>2]|0)-(f[b+(E+B<<2)>>2]|0);E=E+1|0}while((E|0)!=(e|0))}E=b+(A<<2)|0;B=c+(A<<2)|0;D=f[g>>2]|0;if((D|0)>0){F=0;z=h;C=D;while(1){if((C|0)>0){D=0;do{G=f[z+(D<<2)>>2]|0;H=f[n>>2]|0;if((G|0)>(H|0)){I=f[o>>2]|0;f[I+(D<<2)>>2]=H;J=I}else{I=f[p>>2]|0;H=f[o>>2]|0;f[H+(D<<2)>>2]=(G|0)<(I|0)?I:G;J=H}D=D+1|0}while((D|0)<(f[g>>2]|0));K=J}else K=f[o>>2]|0;D=(f[E+(F<<2)>>2]|0)-(f[K+(F<<2)>>2]|0)|0;H=B+(F<<2)|0;f[H>>2]=D;if((D|0)>=(f[q>>2]|0)){if((D|0)>(f[s>>2]|0)){L=D-(f[r>>2]|0)|0;M=39}}else{L=(f[r>>2]|0)+D|0;M=39}if((M|0)==39){M=0;f[H>>2]=L}F=F+1|0;C=f[g>>2]|0;if((F|0)>=(C|0))break;else z=K}}}else M=13;if((M|0)==13?(M=0,z=b+(A<<2)|0,C=c+(A<<2)|0,F=f[g>>2]|0,(F|0)>0):0){B=0;E=b+((X(y+-2|0,e)|0)<<2)|0;H=F;while(1){if((H|0)>0){F=0;do{D=f[E+(F<<2)>>2]|0;G=f[n>>2]|0;if((D|0)>(G|0)){I=f[o>>2]|0;f[I+(F<<2)>>2]=G;N=I}else{I=f[p>>2]|0;G=f[o>>2]|0;f[G+(F<<2)>>2]=(D|0)<(I|0)?I:D;N=G}F=F+1|0}while((F|0)<(f[g>>2]|0));O=N}else O=f[o>>2]|0;F=(f[z+(B<<2)>>2]|0)-(f[O+(B<<2)>>2]|0)|0;G=C+(B<<2)|0;f[G>>2]=F;if((F|0)>=(f[q>>2]|0)){if((F|0)>(f[s>>2]|0)){P=F-(f[r>>2]|0)|0;M=26}}else{P=(f[r>>2]|0)+F|0;M=26}if((M|0)==26){M=0;f[G>>2]=P}B=B+1|0;H=f[g>>2]|0;if((B|0)>=(H|0))break;else E=O}}if((y|0)<=2)break a}mq(i)}while(0);if((e|0)>0)hj(h|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){$q(h);return 1}i=a+16|0;O=a+32|0;P=a+12|0;N=a+28|0;K=a+20|0;L=a+24|0;a=0;J=h;d=e;while(1){if((d|0)>0){e=0;do{l=f[J+(e<<2)>>2]|0;j=f[i>>2]|0;if((l|0)>(j|0)){k=f[O>>2]|0;f[k+(e<<2)>>2]=j;Q=k}else{k=f[P>>2]|0;j=f[O>>2]|0;f[j+(e<<2)>>2]=(l|0)<(k|0)?k:l;Q=j}e=e+1|0}while((e|0)<(f[g>>2]|0));R=Q}else R=f[O>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[R+(a<<2)>>2]|0)|0;j=c+(a<<2)|0;f[j>>2]=e;if((e|0)>=(f[N>>2]|0)){if((e|0)>(f[L>>2]|0)){S=e-(f[K>>2]|0)|0;M=53}}else{S=(f[K>>2]|0)+e|0;M=53}if((M|0)==53){M=0;f[j>>2]=S}a=a+1|0;d=f[g>>2]|0;if((a|0)>=(d|0))break;else J=R}$q(h);return 1}function Dc(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0;h=u;u=u+48|0;i=h+28|0;j=h+24|0;k=h;l=h+12|0;m=h+40|0;if((c|0)<0){n=0;u=h;return n|0}if(!c){n=1;u=h;return n|0}o=(d|0)>1;p=o?d:1;f[k>>2]=0;d=k+4|0;f[d>>2]=0;f[k+8>>2]=0;$j(k,c);q=k+8|0;if(o){o=0;r=0;while(1){s=1;t=f[a+(r<<2)>>2]|0;do{v=f[a+(s+r<<2)>>2]|0;t=t>>>0>>0?v:t;s=s+1|0}while((s|0)!=(p|0));s=(_(t|0)|0)^31;v=t>>>0>o>>>0?t:o;w=(t|0)==0?1:s+1|0;f[i>>2]=w;s=f[d>>2]|0;if(s>>>0<(f[q>>2]|0)>>>0){f[s>>2]=w;f[d>>2]=s+4}else Ci(k,i);r=r+p|0;if((r|0)>=(c|0)){x=v;break}else o=v}}else{o=0;r=0;while(1){v=f[a+(o<<2)>>2]|0;s=(_(v|0)|0)^31;w=v>>>0>r>>>0?v:r;y=(v|0)==0?1:s+1|0;f[i>>2]=y;s=f[d>>2]|0;if(s>>>0<(f[q>>2]|0)>>>0){f[s>>2]=y;f[d>>2]=s+4}else Ci(k,i);o=o+p|0;if((o|0)>=(c|0)){x=w;break}else r=w}}f[l>>2]=0;r=l+4|0;f[r>>2]=0;f[l+8>>2]=0;o=f[k>>2]|0;q=(f[d>>2]|0)-o|0;w=q>>2;if(w){if(w>>>0>1073741823)mq(l);s=dn(q)|0;f[r>>2]=s;f[l>>2]=s;f[l+8>>2]=s+(w<<2);w=s;if((q|0)>0){y=s+(q>>>2<<2)|0;Rg(s|0,o|0,q|0)|0;f[r>>2]=y;q=y-w>>2;if((y|0)==(s|0)){z=q;A=s;B=0;C=0}else{y=0;o=0;v=0;while(1){D=Tn(o|0,v|0,f[s+(y<<2)>>2]|0,0)|0;E=I;y=y+1|0;if(y>>>0>=q>>>0){z=q;A=s;B=D;C=E;break}else{o=D;v=E}}}}else{F=w;G=18}}else{F=0;G=18}if((G|0)==18){z=0;A=F;B=0;C=0}F=rg(A,z,32,i)|0;z=I;A=f[i>>2]<<3;w=Rn(A|0,((A|0)<0)<<31>>31|0,1)|0;A=I;v=on(B|0,C|0,p|0,0)|0;C=Tn(F|0,z|0,v|0,I|0)|0;v=Tn(C|0,I|0,w|0,A|0)|0;A=I;w=f[l>>2]|0;if(w|0){l=f[r>>2]|0;if((l|0)!=(w|0))f[r>>2]=l+(~((l+-4-w|0)>>>2)<<2);br(w)}w=rg(a,c,x,i)|0;l=f[i>>2]|0;r=((x-l|0)/64|0)+l<<3;C=l<<3;z=Tn(w|0,I|0,C|0,((C|0)<0)<<31>>31|0)|0;C=Tn(z|0,I|0,r|0,((r|0)<0)<<31>>31|0)|0;r=I;z=(_((x>>>0>1?x:1)|0)|0)^30;if(e){f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;w=dn(32)|0;f[i>>2]=w;f[i+8>>2]=-2147483616;f[i+4>>2]=22;F=w;B=13044;o=F+22|0;do{b[F>>0]=b[B>>0]|0;F=F+1|0;B=B+1|0}while((F|0)<(o|0));b[w+22>>0]=0;w=(sh(e,i)|0)==0;if((b[i+11>>0]|0)<0)br(f[i>>2]|0);if(!w){f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;w=dn(32)|0;f[i>>2]=w;f[i+8>>2]=-2147483616;f[i+4>>2]=22;F=w;B=13044;o=F+22|0;do{b[F>>0]=b[B>>0]|0;F=F+1|0;B=B+1|0}while((F|0)<(o|0));b[w+22>>0]=0;w=Ck(e,i)|0;if((b[i+11>>0]|0)<0)br(f[i>>2]|0);H=w}else G=32}else G=32;if((G|0)==32)H=z>>>0<18&((A|0)>(r|0)|(A|0)==(r|0)&v>>>0>=C>>>0)&1;b[m>>0]=H;C=g+16|0;v=f[C+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[C>>2]|0)>>>0>0)){f[j>>2]=f[g+4>>2];f[i>>2]=f[j>>2];ye(g,i,m,m+1|0)|0}switch(H|0){case 0:{J=md(a,c,p,k,g)|0;break}case 1:{J=Nc(a,c,x,l,e,g)|0;break}default:J=0}g=f[k>>2]|0;if(g|0){k=f[d>>2]|0;if((k|0)!=(g|0))f[d>>2]=k+(~((k+-4-g|0)>>>2)<<2);br(g)}n=J;u=h;return n|0}function Ec(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((b|0)<0)return;c=a+12|0;d=f[c>>2]|0;e=f[a+8>>2]|0;g=e;h=d;if(d-e>>2>>>0<=b>>>0)return;e=g+(b<<2)|0;d=f[(f[e>>2]|0)+56>>2]|0;i=f[(f[g+(b<<2)>>2]|0)+60>>2]|0;g=e+4|0;if((g|0)!=(h|0)){j=g;g=e;do{k=f[j>>2]|0;f[j>>2]=0;l=f[g>>2]|0;f[g>>2]=k;if(l|0){k=l+88|0;m=f[k>>2]|0;f[k>>2]=0;if(m|0){k=f[m+8>>2]|0;if(k|0){n=m+12|0;if((f[n>>2]|0)!=(k|0))f[n>>2]=k;br(k)}br(m)}m=f[l+68>>2]|0;if(m|0){k=l+72|0;n=f[k>>2]|0;if((n|0)!=(m|0))f[k>>2]=n+(~((n+-4-m|0)>>>2)<<2);br(m)}m=l+64|0;n=f[m>>2]|0;f[m>>2]=0;if(n|0){m=f[n>>2]|0;if(m|0){k=n+4|0;if((f[k>>2]|0)!=(m|0))f[k>>2]=m;br(m)}br(n)}br(l)}j=j+4|0;g=g+4|0}while((j|0)!=(h|0));j=f[c>>2]|0;if((j|0)!=(g|0)){o=g;p=j;q=24}}else{o=e;p=h;q=24}if((q|0)==24){q=p;do{p=q+-4|0;f[c>>2]=p;h=f[p>>2]|0;f[p>>2]=0;if(h|0){p=h+88|0;e=f[p>>2]|0;f[p>>2]=0;if(e|0){p=f[e+8>>2]|0;if(p|0){j=e+12|0;if((f[j>>2]|0)!=(p|0))f[j>>2]=p;br(p)}br(e)}e=f[h+68>>2]|0;if(e|0){p=h+72|0;j=f[p>>2]|0;if((j|0)!=(e|0))f[p>>2]=j+(~((j+-4-e|0)>>>2)<<2);br(e)}e=h+64|0;j=f[e>>2]|0;f[e>>2]=0;if(j|0){e=f[j>>2]|0;if(e|0){p=j+4|0;if((f[p>>2]|0)!=(e|0))f[p>>2]=e;br(e)}br(j)}br(h)}q=f[c>>2]|0}while((q|0)!=(o|0))}o=f[a+4>>2]|0;a:do if(o|0){q=o+44|0;c=f[q>>2]|0;h=f[o+40>>2]|0;while(1){if((h|0)==(c|0))break a;r=h+4|0;if((f[(f[h>>2]|0)+40>>2]|0)==(i|0))break;else h=r}if((r|0)!=(c|0)){j=r;e=h;do{p=f[j>>2]|0;f[j>>2]=0;g=f[e>>2]|0;f[e>>2]=p;if(g|0){Qi(g);br(g)}j=j+4|0;e=e+4|0}while((j|0)!=(c|0));j=f[q>>2]|0;if((j|0)==(e|0))break;else{s=e;t=j}}else{s=h;t=c}j=t;do{g=j+-4|0;f[q>>2]=g;p=f[g>>2]|0;f[g>>2]=0;if(p|0){Qi(p);br(p)}j=f[q>>2]|0}while((j|0)!=(s|0))}while(0);b:do if((d|0)<5){s=f[a+20+(d*12|0)>>2]|0;t=a+20+(d*12|0)+4|0;r=f[t>>2]|0;i=r;c:do if((s|0)==(r|0))u=s;else{o=s;while(1){if((f[o>>2]|0)==(b|0)){u=o;break c}o=o+4|0;if((o|0)==(r|0))break b}}while(0);if((u|0)!=(r|0)){s=u+4|0;o=i-s|0;j=o>>2;if(!j)v=r;else{Xl(u|0,s|0,o|0)|0;v=f[t>>2]|0}o=u+(j<<2)|0;if((v|0)!=(o|0))f[t>>2]=v+(~((v+-4-o|0)>>>2)<<2)}}while(0);v=f[a+24>>2]|0;u=f[a+20>>2]|0;d=u;if((v|0)!=(u|0)){o=v-u>>2;u=0;do{v=d+(u<<2)|0;j=f[v>>2]|0;if((j|0)>(b|0))f[v>>2]=j+-1;u=u+1|0}while(u>>>0>>0)}o=f[a+36>>2]|0;u=f[a+32>>2]|0;d=u;if((o|0)!=(u|0)){j=o-u>>2;u=0;do{o=d+(u<<2)|0;v=f[o>>2]|0;if((v|0)>(b|0))f[o>>2]=v+-1;u=u+1|0}while(u>>>0>>0)}j=f[a+48>>2]|0;u=f[a+44>>2]|0;d=u;if((j|0)!=(u|0)){v=j-u>>2;u=0;do{j=d+(u<<2)|0;o=f[j>>2]|0;if((o|0)>(b|0))f[j>>2]=o+-1;u=u+1|0}while(u>>>0>>0)}v=f[a+60>>2]|0;u=f[a+56>>2]|0;d=u;if((v|0)!=(u|0)){o=v-u>>2;u=0;do{v=d+(u<<2)|0;j=f[v>>2]|0;if((j|0)>(b|0))f[v>>2]=j+-1;u=u+1|0}while(u>>>0>>0)}o=f[a+72>>2]|0;u=f[a+68>>2]|0;a=u;if((o|0)==(u|0))return;d=o-u>>2;u=0;do{o=a+(u<<2)|0;j=f[o>>2]|0;if((j|0)>(b|0))f[o>>2]=j+-1;u=u+1|0}while(u>>>0>>0);return}function Fc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=u;u=u+32|0;e=d+16|0;g=d;h=c+4|0;i=f[(f[h>>2]|0)+48>>2]|0;j=c+12|0;c=f[j>>2]|0;k=dn(32)|0;f[e>>2]=k;f[e+8>>2]=-2147483616;f[e+4>>2]=17;l=k;m=12932;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[k+17>>0]=0;k=i+16|0;o=f[k>>2]|0;if(o){p=k;q=o;a:while(1){o=q;while(1){if((f[o+16>>2]|0)>=(c|0))break;r=f[o+4>>2]|0;if(!r){s=p;break a}else o=r}q=f[o>>2]|0;if(!q){s=o;break}else p=o}if(((s|0)!=(k|0)?(c|0)>=(f[s+16>>2]|0):0)?(c=s+20|0,(sh(c,e)|0)!=0):0)t=yk(c,e,-1)|0;else v=10}else v=10;if((v|0)==10)t=yk(i,e,-1)|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);i=(1<>2]=-1;f[e+4>>2]=-1;f[e+8>>2]=-1;f[e+12>>2]=-1;if(i&1|0?(t=(_(i|0)|0)^31,(t+-1|0)>>>0<=28):0){f[e>>2]=t+1;i=2<>2]=i+-1;t=i+-2|0;f[e+8>>2]=t;f[e+12>>2]=(t|0)/2|0}t=Ki(f[j>>2]|0,f[h>>2]|0)|0;i=f[(f[h>>2]|0)+48>>2]|0;c=f[j>>2]|0;s=dn(32)|0;f[g>>2]=s;f[g+8>>2]=-2147483616;f[g+4>>2]=17;l=s;m=12804;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[s+17>>0]=0;s=i+16|0;m=f[s>>2]|0;if(m){l=s;n=m;b:while(1){m=n;while(1){if((f[m+16>>2]|0)>=(c|0))break;k=f[m+4>>2]|0;if(!k){w=l;break b}else m=k}n=f[m>>2]|0;if(!n){w=m;break}else l=m}if(((w|0)!=(s|0)?(c|0)>=(f[w+16>>2]|0):0)?(c=w+20|0,(sh(c,g)|0)!=0):0)x=yk(c,g,t)|0;else v=25}else v=25;if((v|0)==25)x=yk(i,g,t)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);switch(x|0){case 6:{x=f[j>>2]|0;t=f[h>>2]|0;i=f[(f[(f[t+4>>2]|0)+8>>2]|0)+(x<<2)>>2]|0;do if((Qa[f[(f[t>>2]|0)+8>>2]&127](t)|0)==1){rf(g,t,6,x,e,514);c=f[g>>2]|0;if(!c){f[g>>2]=0;y=g;v=34;break}else{z=g;A=c;break}}else{y=g;v=34}while(0);if((v|0)==34){x=dn(24)|0;f[x+4>>2]=i;i=x+8|0;f[i>>2]=f[e>>2];f[i+4>>2]=f[e+4>>2];f[i+8>>2]=f[e+8>>2];f[i+12>>2]=f[e+12>>2];f[x>>2]=2320;i=x;f[g>>2]=i;z=y;A=i}f[a>>2]=A;f[z>>2]=0;u=d;return}case 0:{z=f[j>>2]|0;j=f[h>>2]|0;h=f[(f[(f[j+4>>2]|0)+8>>2]|0)+(z<<2)>>2]|0;do if((Qa[f[(f[j>>2]|0)+8>>2]&127](j)|0)==1){rf(g,j,0,z,e,514);A=f[g>>2]|0;if(!A){f[g>>2]=0;B=g;v=41;break}else{C=g;D=A;break}}else{B=g;v=41}while(0);if((v|0)==41){v=dn(24)|0;f[v+4>>2]=h;h=v+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[v>>2]=2320;e=v;f[g>>2]=e;C=B;D=e}f[a>>2]=D;f[C>>2]=0;u=d;return}default:{f[a>>2]=0;u=d;return}}}function Gc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;b=u;u=u+32|0;c=b+20|0;d=b+8|0;e=b;g=a+4|0;h=f[g>>2]|0;i=f[a>>2]|0;j=h-i|0;k=j>>2;f[c>>2]=0;l=c+4|0;f[l>>2]=0;m=c+8|0;f[m>>2]=0;n=i;if(k|0){if((j|0)<0)mq(c);j=((k+-1|0)>>>5)+1|0;o=dn(j<<2)|0;f[c>>2]=o;f[m>>2]=j;f[l>>2]=k;l=k>>>5;hj(o|0,0,l<<2|0)|0;j=k&31;k=o+(l<<2)|0;if(j|0)f[k>>2]=f[k>>2]&~(-1>>>(32-j|0))}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;k=a+12|0;l=e+4|0;o=d+8|0;m=n;n=h;h=i;while(1){if((n|0)==(h|0))break;else{p=0;q=0;r=h;s=m}while(1){i=f[c>>2]|0;do if(!(f[i+(q>>>5<<2)>>2]&1<<(q&31))){t=f[d>>2]|0;v=f[j>>2]|0;if((v|0)==(t|0))w=t;else{x=v+(~((v+-8-t|0)>>>3)<<3)|0;f[j>>2]=x;w=x}x=q;while(1){v=x+1|0;y=((v>>>0)%3|0|0)==0?x+-2|0:v;if((y|0)==-1){z=x;A=r;B=i;C=s;D=t;E=w;break}v=f[(f[k>>2]|0)+(y<<2)>>2]|0;y=v+1|0;if((v|0)==-1){z=x;A=r;B=i;C=s;D=t;E=w;break}F=((y>>>0)%3|0|0)==0?v+-2|0:y;if(!((F|0)!=(q|0)&(F|0)!=-1)){z=x;A=r;B=i;C=s;D=t;E=w;break}if(!(f[i+(F>>>5<<2)>>2]&1<<(F&31)))x=F;else{z=x;A=r;B=i;C=s;D=t;E=w;break}}a:while(1){t=B+(z>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(z&31);t=z+1|0;F=((t>>>0)%3|0|0)==0?z+-2|0:t;t=f[C+(F<<2)>>2]|0;G=(((z>>>0)%3|0|0)==0?2:-1)+z|0;if((D|0)!=(E|0))if((G|0)==-1){y=D;do{if((f[y>>2]|0)==(t|0)?(v=f[y+4>>2]|0,(v|0)!=-1):0){H=v;I=-1;J=-1;K=25;break a}y=y+8|0}while((y|0)!=(E|0))}else{y=D;do{if((f[y>>2]|0)==(t|0)?(L=f[y+4>>2]|0,M=f[(f[k>>2]|0)+(G<<2)>>2]|0,(M|0)!=(L|0)):0){K=24;break a}y=y+8|0}while((y|0)!=(E|0))}f[e>>2]=0;f[e>>2]=f[C+(G<<2)>>2];f[l>>2]=F;if((E|0)==(f[o>>2]|0))ei(d,e);else{y=e;t=f[y+4>>2]|0;v=E;f[v>>2]=f[y>>2];f[v+4>>2]=t;f[j>>2]=(f[j>>2]|0)+8}if((G|0)==-1){K=38;break}t=f[(f[k>>2]|0)+(G<<2)>>2]|0;if((t|0)==-1){K=38;break}v=t+(((t>>>0)%3|0|0)==0?2:-1)|0;if(!((v|0)!=(x|0)&(v|0)!=-1)){K=40;break}t=f[a>>2]|0;z=v;A=t;B=f[c>>2]|0;C=t;D=f[d>>2]|0;E=f[j>>2]|0}if((K|0)==24){K=0;if((L|0)==-1){N=-1;O=-1;P=M;Q=G}else{H=L;I=M;J=G;K=25}}else if((K|0)==38){K=0;K=40}if((K|0)==25){K=0;N=H;O=f[(f[k>>2]|0)+(H<<2)>>2]|0;P=I;Q=J}else if((K|0)==40){K=0;R=p;S=f[a>>2]|0;break}if((P|0)!=-1)f[(f[k>>2]|0)+(P<<2)>>2]=-1;x=f[k>>2]|0;if((O|0)!=-1)f[x+(O<<2)>>2]=-1;f[x+(Q<<2)>>2]=-1;f[x+(N<<2)>>2]=-1;R=1;S=A}else{R=p;S=r}while(0);q=q+1|0;T=f[g>>2]|0;s=S;if(q>>>0>=T-S>>2>>>0)break;else{p=R;r=S}}if(R){m=s;n=T;h=S}else break}S=f[d>>2]|0;if(S|0){d=f[j>>2]|0;if((d|0)!=(S|0))f[j>>2]=d+(~((d+-8-S|0)>>>3)<<3);br(S)}S=f[c>>2]|0;if(!S){u=b;return 1}br(S);u=b;return 1}function Hc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=a+8|0;a:do if(f[e>>2]|0?(g=f[a>>2]|0,h=a+4|0,f[a>>2]=h,f[(f[h>>2]|0)+8>>2]=0,f[h>>2]=0,f[e>>2]=0,i=f[g+4>>2]|0,j=(i|0)==0?g:i,j|0):0){i=a+4|0;g=j;j=f[c>>2]|0;while(1){if((j|0)==(f[d>>2]|0))break;k=g+16|0;Ql(k,j+16|0)|0;Ql(g+28|0,j+28|0)|0;l=g+8|0;m=f[l>>2]|0;do if(m){n=f[m>>2]|0;if((n|0)==(g|0)){f[m>>2]=0;o=f[m+4>>2]|0;if(!o){p=m;break}else q=o;while(1){o=f[q>>2]|0;if(o|0){q=o;continue}o=f[q+4>>2]|0;if(!o)break;else q=o}p=q;break}else{f[m+4>>2]=0;if(!n){p=m;break}else r=n;while(1){o=f[r>>2]|0;if(o|0){r=o;continue}o=f[r+4>>2]|0;if(!o)break;else r=o}p=r;break}}else p=0;while(0);m=f[h>>2]|0;do if(m){n=b[k+11>>0]|0;o=n<<24>>24<0;s=o?f[g+20>>2]|0:n&255;n=o?f[k>>2]|0:k;o=m;while(1){t=o+16|0;u=b[t+11>>0]|0;v=u<<24>>24<0;w=v?f[o+20>>2]|0:u&255;u=w>>>0>>0?w:s;if((u|0)!=0?(x=Pk(n,v?f[t>>2]|0:t,u)|0,(x|0)!=0):0)if((x|0)<0)y=22;else y=24;else if(s>>>0>>0)y=22;else y=24;if((y|0)==22){y=0;w=f[o>>2]|0;if(!w){y=23;break}else z=w}else if((y|0)==24){y=0;A=o+4|0;w=f[A>>2]|0;if(!w){y=26;break}else z=w}o=z}if((y|0)==23){y=0;B=o;C=o;break}else if((y|0)==26){y=0;B=A;C=o;break}}else{B=h;C=h}while(0);f[g>>2]=0;f[g+4>>2]=0;f[l>>2]=C;f[B>>2]=g;m=f[f[a>>2]>>2]|0;if(!m)D=g;else{f[a>>2]=m;D=f[B>>2]|0}Ae(f[i>>2]|0,D);f[e>>2]=(f[e>>2]|0)+1;m=f[j+4>>2]|0;if(!m){k=j+8|0;s=f[k>>2]|0;if((f[s>>2]|0)==(j|0))E=s;else{s=k;do{k=f[s>>2]|0;s=k+8|0;n=f[s>>2]|0}while((f[n>>2]|0)!=(k|0));E=n}}else{s=m;while(1){l=f[s>>2]|0;if(!l)break;else s=l}E=s}f[c>>2]=E;if(!p)break a;else{g=p;j=E}}j=f[g+8>>2]|0;if(!j)F=g;else{i=j;while(1){j=f[i+8>>2]|0;if(!j)break;else i=j}F=i}sj(a,F)}while(0);F=f[c>>2]|0;E=f[d>>2]|0;if((F|0)==(E|0))return;else G=F;while(1){Qe(a,G+16|0)|0;F=f[G+4>>2]|0;if(!F){d=G+8|0;p=f[d>>2]|0;if((f[p>>2]|0)==(G|0))H=p;else{p=d;do{d=f[p>>2]|0;p=d+8|0;e=f[p>>2]|0}while((f[e>>2]|0)!=(d|0));H=e}}else{p=F;while(1){i=f[p>>2]|0;if(!i)break;else p=i}H=p}f[c>>2]=H;if((H|0)==(E|0))break;else G=H}return}function Ic(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;g=u;u=u+16|0;h=g;i=c+4|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;j=dn(16)|0;f[h>>2]=j;f[h+8>>2]=-2147483632;f[h+4>>2]=15;k=j;l=12916;m=k+15|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[j+15>>0]=0;j=yk(i,h,-1)|0;if((b[h+11>>0]|0)<0)br(f[h>>2]|0);switch(j|0){case 0:{n=dn(56)|0;k=n;m=k+56|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(m|0));zn(n);o=3728;p=n;break}case -1:{if((Yh(i)|0)==10){n=dn(56)|0;k=n;m=k+56|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(m|0));zn(n);o=3728;p=n}else q=6;break}default:q=6}a:do if((q|0)==6){n=d+8|0;r=d+12|0;s=f[r>>2]|0;t=f[n>>2]|0;b:do if((s-t|0)>0){v=h+8|0;w=h+4|0;x=c+20|0;y=h+11|0;z=0;A=t;B=s;c:while(1){C=f[(f[A+(z<<2)>>2]|0)+28>>2]|0;switch(C|0){case 9:{q=12;break}case 6:case 5:case 4:case 2:{D=A;E=B;break}default:{if((C|2|0)!=3)break c;if((C|0)==9)q=12;else{D=A;E=B}}}if((q|0)==12){q=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;C=dn(32)|0;f[h>>2]=C;f[v>>2]=-2147483616;f[w>>2]=17;k=C;l=12932;m=k+17|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[C+17>>0]=0;F=f[x>>2]|0;if(F){G=x;H=F;d:while(1){F=H;while(1){if((f[F+16>>2]|0)>=0)break;I=f[F+4>>2]|0;if(!I){J=G;break d}else F=I}H=f[F>>2]|0;if(!H){J=F;break}else G=F}if(((J|0)!=(x|0)?(f[J+16>>2]|0)<=0:0)?(G=J+20|0,(sh(G,h)|0)!=0):0)K=yk(G,h,-1)|0;else q=21}else q=21;if((q|0)==21){q=0;K=yk(i,h,-1)|0}if((b[y>>0]|0)<0)br(f[h>>2]|0);if((K|0)<1)break;D=f[n>>2]|0;E=f[r>>2]|0}z=z+1|0;if((z|0)>=(E-D>>2|0))break b;else{A=D;B=E}}if((j|0)!=1){B=dn(56)|0;k=B;m=k+56|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(m|0));zn(B);o=3728;p=B;break a}f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;A=dn(32)|0;f[h>>2]=A;f[h+8>>2]=-2147483616;f[h+4>>2]=24;k=A;l=12950;m=k+24|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[A+24>>0]=0;f[a>>2]=-1;dj(a+4|0,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}while(0);r=dn(56)|0;k=r;m=k+56|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(m|0));zn(r);o=3668;p=r}while(0);f[p>>2]=o;tp(p,d);Ad(a,p,i,e);if(!(f[a>>2]|0)){e=a+4|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);f[c+40>>2]=f[p+52>>2];f[c+44>>2]=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}Va[f[(f[p>>2]|0)+4>>2]&127](p);u=g;return}function Jc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;b=u;u=u+32|0;c=b+4|0;d=b;e=a+16|0;g=f[e>>2]|0;if(g>>>0>112){f[e>>2]=g+-113;g=a+4|0;e=f[g>>2]|0;h=f[e>>2]|0;i=e+4|0;f[g>>2]=i;e=a+8|0;j=f[e>>2]|0;k=a+12|0;l=f[k>>2]|0;m=l;do if((j|0)==(l|0)){n=f[a>>2]|0;o=n;if(i>>>0>n>>>0){p=i;q=((p-o>>2)+1|0)/-2|0;r=i+(q<<2)|0;s=j-p|0;p=s>>2;if(!p)t=i;else{Xl(r|0,i|0,s|0)|0;t=f[g>>2]|0}s=r+(p<<2)|0;f[e>>2]=s;f[g>>2]=t+(q<<2);v=s;break}s=m-o>>1;o=(s|0)==0?1:s;if(o>>>0>1073741823){s=ra(8)|0;Wo(s,14941);f[s>>2]=6944;va(s|0,1080,114)}s=dn(o<<2)|0;q=s;p=s+(o>>>2<<2)|0;r=p;w=s+(o<<2)|0;if((i|0)==(j|0)){x=r;y=n}else{n=p;p=r;o=i;do{f[n>>2]=f[o>>2];n=p+4|0;p=n;o=o+4|0}while((o|0)!=(j|0));x=p;y=f[a>>2]|0}f[a>>2]=q;f[g>>2]=r;f[e>>2]=x;f[k>>2]=w;if(!y)v=x;else{br(y);v=f[e>>2]|0}}else v=j;while(0);f[v>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}e=a+8|0;h=f[e>>2]|0;v=a+4|0;j=h-(f[v>>2]|0)|0;y=a+12|0;x=f[y>>2]|0;k=x-(f[a>>2]|0)|0;if(j>>>0>=k>>>0){g=k>>1;k=(g|0)==0?1:g;f[c+12>>2]=0;f[c+16>>2]=a+12;if(k>>>0>1073741823){g=ra(8)|0;Wo(g,14941);f[g>>2]=6944;va(g|0,1080,114)}g=dn(k<<2)|0;f[c>>2]=g;i=g+(j>>2<<2)|0;j=c+8|0;f[j>>2]=i;m=c+4|0;f[m>>2]=i;i=c+12|0;f[i>>2]=g+(k<<2);k=dn(4068)|0;f[d>>2]=k;kg(c,d);d=f[e>>2]|0;while(1){z=f[v>>2]|0;if((d|0)==(z|0))break;k=d+-4|0;dg(c,k);d=k}k=z;z=f[a>>2]|0;f[a>>2]=f[c>>2];f[c>>2]=z;f[v>>2]=f[m>>2];f[m>>2]=k;m=f[e>>2]|0;f[e>>2]=f[j>>2];f[j>>2]=m;g=f[y>>2]|0;f[y>>2]=f[i>>2];f[i>>2]=g;g=m;if((d|0)!=(g|0))f[j>>2]=g+(~((g+-4-k|0)>>>2)<<2);if(z|0)br(z);u=b;return}if((x|0)!=(h|0)){h=dn(4068)|0;f[c>>2]=h;kg(a,c);u=b;return}h=dn(4068)|0;f[c>>2]=h;dg(a,c);c=f[v>>2]|0;h=f[c>>2]|0;x=c+4|0;f[v>>2]=x;c=f[e>>2]|0;z=f[y>>2]|0;k=z;do if((c|0)==(z|0)){g=f[a>>2]|0;j=g;if(x>>>0>g>>>0){d=x;m=((d-j>>2)+1|0)/-2|0;i=x+(m<<2)|0;t=c-d|0;d=t>>2;if(!d)A=x;else{Xl(i|0,x|0,t|0)|0;A=f[v>>2]|0}t=i+(d<<2)|0;f[e>>2]=t;f[v>>2]=A+(m<<2);B=t;break}t=k-j>>1;j=(t|0)==0?1:t;if(j>>>0>1073741823){t=ra(8)|0;Wo(t,14941);f[t>>2]=6944;va(t|0,1080,114)}t=dn(j<<2)|0;m=t;d=t+(j>>>2<<2)|0;i=d;l=t+(j<<2)|0;if((x|0)==(c|0)){C=i;D=g}else{g=d;d=i;j=x;do{f[g>>2]=f[j>>2];g=d+4|0;d=g;j=j+4|0}while((j|0)!=(c|0));C=d;D=f[a>>2]|0}f[a>>2]=m;f[v>>2]=i;f[e>>2]=C;f[y>>2]=l;if(!D)B=C;else{br(D);B=f[e>>2]|0}}else B=c;while(0);f[B>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}function Kc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=u;u=u+16|0;g=e+8|0;h=e+4|0;i=e;j=a+64|0;k=f[j>>2]|0;if((f[k+28>>2]|0)==(f[k+24>>2]|0)){u=e;return}l=c+96|0;c=a+52|0;m=d+84|0;n=d+68|0;d=a+56|0;o=a+60|0;p=a+12|0;q=a+28|0;r=a+40|0;s=a+44|0;t=a+48|0;v=0;w=0;x=k;while(1){k=f[(f[x+24>>2]|0)+(w<<2)>>2]|0;if((k|0)==-1){y=v;z=x}else{A=v+1|0;B=f[(f[l>>2]|0)+(((k|0)/3|0)*12|0)+(((k|0)%3|0)<<2)>>2]|0;if(!(b[m>>0]|0))C=f[(f[n>>2]|0)+(B<<2)>>2]|0;else C=B;f[g>>2]=C;B=f[d>>2]|0;if(B>>>0<(f[o>>2]|0)>>>0){f[B>>2]=C;f[d>>2]=B+4}else Ci(c,g);f[g>>2]=k;f[h>>2]=0;a:do if(!(f[(f[p>>2]|0)+(w>>>5<<2)>>2]&1<<(w&31)))D=k;else{B=k+1|0;E=((B>>>0)%3|0|0)==0?k+-2|0:B;if(((E|0)!=-1?(f[(f[a>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)==0:0)?(B=f[(f[(f[j>>2]|0)+12>>2]|0)+(E<<2)>>2]|0,E=B+1|0,(B|0)!=-1):0){F=((E>>>0)%3|0|0)==0?B+-2|0:E;f[h>>2]=F;if((F|0)==-1){D=k;break}else G=F;while(1){f[g>>2]=G;F=G+1|0;E=((F>>>0)%3|0|0)==0?G+-2|0:F;if((E|0)==-1)break;if(f[(f[a>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)break;F=f[(f[(f[j>>2]|0)+12>>2]|0)+(E<<2)>>2]|0;E=F+1|0;if((F|0)==-1)break;B=((E>>>0)%3|0|0)==0?F+-2|0:E;f[h>>2]=B;if((B|0)==-1){D=G;break a}else G=B}f[h>>2]=-1;D=G;break}f[h>>2]=-1;D=k}while(0);f[(f[q>>2]|0)+(D<<2)>>2]=v;k=f[s>>2]|0;if((k|0)==(f[t>>2]|0))Ci(r,g);else{f[k>>2]=f[g>>2];f[s>>2]=k+4}k=f[j>>2]|0;B=f[g>>2]|0;b:do if(((B|0)!=-1?(E=(((B>>>0)%3|0|0)==0?2:-1)+B|0,(E|0)!=-1):0)?(F=f[(f[k+12>>2]|0)+(E<<2)>>2]|0,(F|0)!=-1):0){E=F+(((F>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=E;if((E|0)!=-1&(E|0)!=(B|0)){F=A;H=v;I=E;while(1){E=I+1|0;J=((E>>>0)%3|0|0)==0?I+-2|0:E;do if(f[(f[a>>2]|0)+(J>>>5<<2)>>2]&1<<(J&31)){E=F+1|0;K=f[(f[l>>2]|0)+(((I|0)/3|0)*12|0)+(((I|0)%3|0)<<2)>>2]|0;if(!(b[m>>0]|0))L=f[(f[n>>2]|0)+(K<<2)>>2]|0;else L=K;f[i>>2]=L;K=f[d>>2]|0;if(K>>>0<(f[o>>2]|0)>>>0){f[K>>2]=L;f[d>>2]=K+4}else Ci(c,i);K=f[s>>2]|0;if((K|0)==(f[t>>2]|0)){Ci(r,h);M=E;N=F;break}else{f[K>>2]=f[h>>2];f[s>>2]=K+4;M=E;N=F;break}}else{M=F;N=H}while(0);f[(f[q>>2]|0)+(f[h>>2]<<2)>>2]=N;O=f[j>>2]|0;J=f[h>>2]|0;if((J|0)==-1)break;E=(((J>>>0)%3|0|0)==0?2:-1)+J|0;if((E|0)==-1)break;J=f[(f[O+12>>2]|0)+(E<<2)>>2]|0;if((J|0)==-1)break;I=J+(((J>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=I;if(!((I|0)!=-1?(I|0)!=(f[g>>2]|0):0)){P=M;Q=O;break b}else{F=M;H=N}}f[h>>2]=-1;P=M;Q=O}else{P=A;Q=k}}else R=28;while(0);if((R|0)==28){R=0;f[h>>2]=-1;P=A;Q=k}y=P;z=Q}w=w+1|0;if(w>>>0>=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2>>>0)break;else{v=y;x=z}}u=e;return}function Lc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,D=0,E=0,F=0;switch(c|0){case 0:{e=-149;g=24;i=4;break}case 1:{e=-1074;g=53;i=4;break}case 2:{e=-1074;g=53;i=4;break}default:j=0.0}a:do if((i|0)==4){c=a+4|0;k=a+100|0;do{l=f[c>>2]|0;if(l>>>0<(f[k>>2]|0)>>>0){f[c>>2]=l+1;m=h[l>>0]|0}else m=Di(a)|0}while((tq(m)|0)!=0);b:do switch(m|0){case 43:case 45:{l=1-(((m|0)==45&1)<<1)|0;n=f[c>>2]|0;if(n>>>0<(f[k>>2]|0)>>>0){f[c>>2]=n+1;o=h[n>>0]|0;p=l;break b}else{o=Di(a)|0;p=l;break b}break}default:{o=m;p=1}}while(0);l=0;n=o;while(1){if((n|32|0)!=(b[17452+l>>0]|0)){q=l;r=n;break}do if(l>>>0<7){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;t=h[s>>0]|0;break}else{t=Di(a)|0;break}}else t=n;while(0);s=l+1|0;if(s>>>0<8){l=s;n=t}else{q=s;r=t;break}}c:do switch(q|0){case 8:break;case 3:{i=23;break}default:{n=(d|0)!=0;if(n&q>>>0>3)if((q|0)==8)break c;else{i=23;break c}d:do if(!q){l=0;s=r;while(1){if((s|32|0)!=(b[17461+l>>0]|0)){u=l;v=s;break d}do if(l>>>0<2){w=f[c>>2]|0;if(w>>>0<(f[k>>2]|0)>>>0){f[c>>2]=w+1;x=h[w>>0]|0;break}else{x=Di(a)|0;break}}else x=s;while(0);w=l+1|0;if(w>>>0<3){l=w;s=x}else{u=w;v=x;break}}}else{u=q;v=r}while(0);switch(u|0){case 3:{s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;y=h[s>>0]|0}else y=Di(a)|0;if((y|0)==40)z=1;else{if(!(f[k>>2]|0)){j=B;break a}f[c>>2]=(f[c>>2]|0)+-1;j=B;break a}while(1){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;A=h[s>>0]|0}else A=Di(a)|0;if(!((A+-48|0)>>>0<10|(A+-65|0)>>>0<26)?!((A|0)==95|(A+-97|0)>>>0<26):0)break;z=z+1|0}if((A|0)==41){j=B;break a}s=(f[k>>2]|0)==0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if(!n){l=ir()|0;f[l>>2]=22;Rm(a,0);j=0.0;break a}if(!z){j=B;break a}else D=z;while(1){D=D+-1|0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if(!D){j=B;break a}}break}case 0:{if((v|0)==48){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;E=h[s>>0]|0}else E=Di(a)|0;if((E|32|0)==120){j=+yc(a,g,e,p,d);break a}if(!(f[k>>2]|0))F=48;else{f[c>>2]=(f[c>>2]|0)+-1;F=48}}else F=v;j=+ob(a,F,g,e,p,d);break a;break}default:{if(f[k>>2]|0)f[c>>2]=(f[c>>2]|0)+-1;s=ir()|0;f[s>>2]=22;Rm(a,0);j=0.0;break a}}}}while(0);if((i|0)==23){s=(f[k>>2]|0)==0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if((d|0)!=0&q>>>0>3){n=q;do{if(!s)f[c>>2]=(f[c>>2]|0)+-1;n=n+-1|0}while(n>>>0>3)}}j=+$($(p|0)*$(C))}while(0);return +j}function Mc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;b=u;u=u+16|0;c=b+4|0;d=b;e=f[a+64>>2]|0;if(!e){u=b;return}g=Qa[f[(f[e>>2]|0)+32>>2]&127](e)|0;if(!g){u=b;return}e=g+24|0;h=g+28|0;i=((f[h>>2]|0)-(f[e>>2]|0)>>2)-(f[g+44>>2]|0)|0;j=a+56|0;k=f[j>>2]|0;if(((f[k+12>>2]|0)-(f[k+8>>2]|0)|0)>4){f[c>>2]=0;l=c+4|0;f[l>>2]=0;f[c+8>>2]=0;m=c+8|0;n=0;o=k;while(1){if(!(f[(f[(f[o+8>>2]|0)+(n<<2)>>2]|0)+56>>2]|0))p=o;else{k=Ra[f[(f[a>>2]|0)+56>>2]&127](a,n)|0;f[d>>2]=k;q=k;do if(k|0){r=f[l>>2]|0;if((r|0)==(f[m>>2]|0)){Ci(c,d);break}else{f[r>>2]=q;f[l>>2]=(f[l>>2]|0)+4;break}}while(0);p=f[j>>2]|0}n=n+1|0;if((n|0)>=((f[p+12>>2]|0)-(f[p+8>>2]|0)>>2|0))break;else o=p}o=f[h>>2]|0;h=f[e>>2]|0;e=h;if((o|0)==(h|0)){s=i;t=f[c>>2]|0}else{n=o-h>>2;h=g+12|0;g=f[l>>2]|0;o=f[c>>2]|0;c=(g|0)==(o|0);j=o;d=g-o>>2;o=p+96|0;p=i;g=0;while(1){m=f[e+(g<<2)>>2]|0;if((m|0)==-1)v=p;else{q=f[o>>2]|0;k=f[q+(((m|0)/3|0)*12|0)+(((m|0)%3|0)<<2)>>2]|0;r=(((m>>>0)%3|0|0)==0?2:-1)+m|0;a:do if(((r|0)!=-1?(w=f[(f[h>>2]|0)+(r<<2)>>2]|0,(w|0)!=-1):0)?(x=w+(((w>>>0)%3|0|0)==0?2:-1)|0,(x|0)!=-1):0){if(c){w=0;y=x;z=k;while(1){A=z;z=f[q+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;B=w+((z|0)!=(A|0)&1)|0;if((y|0)==(m|0)){C=B;break a}A=(((y>>>0)%3|0|0)==0?2:-1)+y|0;if((A|0)==-1){C=B;break a}D=f[(f[h>>2]|0)+(A<<2)>>2]|0;if((D|0)==-1){C=B;break a}y=D+(((D>>>0)%3|0|0)==0?2:-1)|0;if((y|0)==-1){C=B;break a}else w=B}}else{E=0;F=x;G=m;H=k}while(1){w=f[q+(((F|0)/3|0)*12|0)+(((F|0)%3|0)<<2)>>2]|0;b:do if((w|0)==(H|0)){y=0;while(1){z=f[(f[j+(y<<2)>>2]|0)+28>>2]|0;y=y+1|0;if((f[z+(F<<2)>>2]|0)!=(f[z+(G<<2)>>2]|0)){I=H;J=28;break b}if(y>>>0>=d>>>0){K=H;L=E;break}}}else{I=w;J=28}while(0);if((J|0)==28){J=0;K=I;L=E+1|0}if((F|0)==(m|0)){C=L;break a}w=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((w|0)==-1){C=L;break a}y=f[(f[h>>2]|0)+(w<<2)>>2]|0;if((y|0)==-1){C=L;break a}w=y+(((y>>>0)%3|0|0)==0?2:-1)|0;if((w|0)==-1){C=L;break}else{y=F;E=L;F=w;H=K;G=y}}}else C=0;while(0);m=f[e+(g<<2)>>2]|0;q=m+1|0;if(((m|0)!=-1?(k=((q>>>0)%3|0|0)==0?m+-2|0:q,(k|0)!=-1):0)?(q=f[(f[h>>2]|0)+(k<<2)>>2]|0,k=q+1|0,(q|0)!=-1):0)M=((((k>>>0)%3|0|0)==0?q+-2|0:k)|0)==-1;else M=1;v=C+p+(((C|0)!=0&(M^1))<<31>>31)|0}g=g+1|0;if(g>>>0>=n>>>0){s=v;t=j;break}else p=v}}if(t|0){v=f[l>>2]|0;if((v|0)!=(t|0))f[l>>2]=v+(~((v+-4-t|0)>>>2)<<2);br(t)}N=s}else N=i;f[a+52>>2]=N;u=b;return}function Nc(a,c,d,e,g,h){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=u;u=u+32|0;j=i+4|0;k=i;l=i+16|0;m=(_(e|0)|0)^31;if((e|0)>0)if(m>>>0>17){n=0;u=i;return n|0}else o=m+1|0;else o=1;do if(g){m=dn(48)|0;f[j>>2]=m;f[j+8>>2]=-2147483600;f[j+4>>2]=33;e=m;p=13067;q=e+33|0;do{b[e>>0]=b[p>>0]|0;e=e+1|0;p=p+1|0}while((e|0)<(q|0));b[m+33>>0]=0;r=(sh(g,j)|0)==0;if((b[j+11>>0]|0)<0)br(f[j>>2]|0);if(!r){r=dn(48)|0;f[j>>2]=r;f[j+8>>2]=-2147483600;f[j+4>>2]=33;e=r;p=13067;q=e+33|0;do{b[e>>0]=b[p>>0]|0;e=e+1|0;p=p+1|0}while((e|0)<(q|0));b[r+33>>0]=0;p=Ck(g,j)|0;if((b[j+11>>0]|0)<0)br(f[j>>2]|0);if((p|0)<4){s=o+-2|0;break}if((p|0)<6){s=o+-1|0;break}if((p|0)>9){s=o+2|0;break}else{s=o+((p|0)>7&1)|0;break}}else s=o}else s=o;while(0);o=(s|0)>1?s:1;s=(o|0)<18?o:18;b[l>>0]=s;o=h+16|0;g=f[o+4>>2]|0;if(!((g|0)>0|(g|0)==0&(f[o>>2]|0)>>>0>0)){f[k>>2]=f[h+4>>2];f[j>>2]=f[k>>2];ye(h,j,l,l+1|0)|0}do switch(s&31){case 1:case 0:{n=je(a,c,d,h)|0;u=i;return n|0}case 2:{n=ie(a,c,d,h)|0;u=i;return n|0}case 3:{n=he(a,c,d,h)|0;u=i;return n|0}case 4:{n=ge(a,c,d,h)|0;u=i;return n|0}case 5:{n=fe(a,c,d,h)|0;u=i;return n|0}case 6:{n=ee(a,c,d,h)|0;u=i;return n|0}case 7:{n=de(a,c,d,h)|0;u=i;return n|0}case 8:{n=ce(a,c,d,h)|0;u=i;return n|0}case 9:{n=be(a,c,d,h)|0;u=i;return n|0}case 10:{n=ae(a,c,d,h)|0;u=i;return n|0}case 11:{n=$d(a,c,d,h)|0;u=i;return n|0}case 12:{n=_d(a,c,d,h)|0;u=i;return n|0}case 13:{n=Zd(a,c,d,h)|0;u=i;return n|0}case 14:{n=Yd(a,c,d,h)|0;u=i;return n|0}case 15:{n=Xd(a,c,d,h)|0;u=i;return n|0}case 16:{n=Wd(a,c,d,h)|0;u=i;return n|0}case 17:{n=Vd(a,c,d,h)|0;u=i;return n|0}case 18:{n=Ud(a,c,d,h)|0;u=i;return n|0}default:{n=0;u=i;return n|0}}while(0);return 0}function Oc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;wb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Pc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;xb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Qc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;yb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Rc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;zb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Sc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ab(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Tc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*524288.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==524288){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Eb(z,A,g);a:do if((x|0)<524288){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=524288-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>524288;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-524288|0;m=x;while(1){v=524288.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==524288){C=p;D=524288;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=524288){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*1.9073486328125e-06)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*262144.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==262144){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Bb(z,A,g);a:do if((x|0)<262144){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=262144-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>262144;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-262144|0;m=x;while(1){v=262144.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==262144){C=p;D=262144;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=262144){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*3.814697265625e-06)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*65536.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==65536){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Cb(z,A,g);a:do if((x|0)<65536){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=65536-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>65536;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-65536|0;m=x;while(1){v=65536.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==65536){C=p;D=65536;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=65536){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.0000152587890625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Wc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*32768.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==32768){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Db(z,A,g);a:do if((x|0)<32768){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=32768-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>32768;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-32768|0;m=x;while(1){v=32768.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==32768){C=p;D=32768;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=32768){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000030517578125)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Xc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*8192.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==8192){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Fb(z,A,g);a:do if((x|0)<8192){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=8192-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>8192;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-8192|0;m=x;while(1){v=8192.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==8192){C=p;D=8192;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=8192){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.0001220703125)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Yc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Gb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function Zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Hb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function _c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ib(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function $c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Jb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Kb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Lb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Mb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Tn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else dh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)mq(h);else{i=l<<2;t=dn(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;hj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Nb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);br(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Fg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=xe(a,d)|0;u=e;return w|0}function ed(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=e>>>0>1073741823?-1:e<<2;k=_q(j)|0;hj(k|0,0,j|0)|0;j=f[a+28>>2]|0;l=a+36|0;m=f[l>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;a:do if((p|0)>4){q=p>>2;r=f[a+32>>2]|0;s=a+8|0;t=h+4|0;v=i+4|0;w=d+4|0;x=j+12|0;y=(e|0)>0;z=k+4|0;A=h+4|0;B=i+4|0;C=d+4|0;D=q+-1|0;if(n-o>>2>>>0>D>>>0){E=q;F=D;G=o}else{H=m;mq(H)}while(1){D=f[G+(F<<2)>>2]|0;q=X(F,e)|0;if((D|0)!=-1?(I=f[(f[x>>2]|0)+(D<<2)>>2]|0,(I|0)!=-1):0){D=f[j>>2]|0;J=f[r>>2]|0;K=f[J+(f[D+(I<<2)>>2]<<2)>>2]|0;L=I+1|0;M=((L>>>0)%3|0|0)==0?I+-2|0:L;if((M|0)==-1)N=-1;else N=f[D+(M<<2)>>2]|0;M=f[J+(N<<2)>>2]|0;L=(((I>>>0)%3|0|0)==0?2:-1)+I|0;if((L|0)==-1)O=-1;else O=f[D+(L<<2)>>2]|0;L=f[J+(O<<2)>>2]|0;if((K|0)<(F|0)&(M|0)<(F|0)&(L|0)<(F|0)){J=X(K,e)|0;K=X(M,e)|0;M=X(L,e)|0;if(y){L=0;do{f[k+(L<<2)>>2]=(f[b+(L+M<<2)>>2]|0)+(f[b+(L+K<<2)>>2]|0)-(f[b+(L+J<<2)>>2]|0);L=L+1|0}while((L|0)!=(e|0))}L=b+(q<<2)|0;J=c+(q<<2)|0;K=f[L+4>>2]|0;M=f[k>>2]|0;D=f[z>>2]|0;f[h>>2]=f[L>>2];f[A>>2]=K;f[i>>2]=M;f[B>>2]=D;Dd(d,s,h,i);f[J>>2]=f[d>>2];f[J+4>>2]=f[C>>2]}else P=15}else P=15;if((P|0)==15){P=0;J=b+(q<<2)|0;D=b+((X(E+-2|0,e)|0)<<2)|0;M=c+(q<<2)|0;K=f[J+4>>2]|0;L=f[D>>2]|0;I=f[D+4>>2]|0;f[h>>2]=f[J>>2];f[t>>2]=K;f[i>>2]=L;f[v>>2]=I;Dd(d,s,h,i);f[M>>2]=f[d>>2];f[M+4>>2]=f[w>>2]}if((E|0)<=2)break a;M=f[l>>2]|0;G=f[M>>2]|0;I=F+-1|0;if((f[M+4>>2]|0)-G>>2>>>0<=I>>>0){H=M;break}else{M=F;F=I;E=M}}mq(H)}while(0);if((e|0)<=0){Q=a+8|0;R=b+4|0;S=f[b>>2]|0;T=f[R>>2]|0;U=k+4|0;V=f[k>>2]|0;W=f[U>>2]|0;f[h>>2]=S;Y=h+4|0;f[Y>>2]=T;f[i>>2]=V;Z=i+4|0;f[Z>>2]=W;Dd(d,Q,h,i);_=f[d>>2]|0;f[c>>2]=_;$=d+4|0;aa=f[$>>2]|0;ba=c+4|0;f[ba>>2]=aa;$q(k);u=g;return 1}hj(k|0,0,e<<2|0)|0;Q=a+8|0;R=b+4|0;S=f[b>>2]|0;T=f[R>>2]|0;U=k+4|0;V=f[k>>2]|0;W=f[U>>2]|0;f[h>>2]=S;Y=h+4|0;f[Y>>2]=T;f[i>>2]=V;Z=i+4|0;f[Z>>2]=W;Dd(d,Q,h,i);_=f[d>>2]|0;f[c>>2]=_;$=d+4|0;aa=f[$>>2]|0;ba=c+4|0;f[ba>>2]=aa;$q(k);u=g;return 1}function fd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0;d=u;u=u+32|0;e=d;g=d+20|0;h=d+24|0;i=d+8|0;j=f[a>>2]|0;k=j+8|0;l=j;j=f[l>>2]|0;m=f[l+4>>2]|0;l=Tn(j|0,m|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=I;n=Tn(l|0,k|0,(l|0)==0&(k|0)==0&1|0,0)|0;k=~~((+(j>>>0)+4294967296.0*+(m>>>0))/(+(n>>>0)+4294967296.0*+(I>>>0))*256.0+.5)>>>0;n=k>>>0<255?k:255;k=n+((n|0)==0&1)&255;b[h>>0]=k;n=a+12|0;m=a+16|0;j=((f[m>>2]|0)-(f[n>>2]|0)<<1)+64|0;f[i>>2]=0;l=i+4|0;f[l>>2]=0;f[i+8>>2]=0;if(!j)o=0;else{if((j|0)<0)mq(i);p=dn(j)|0;f[l>>2]=p;f[i>>2]=p;f[i+8>>2]=p+j;q=j;j=p;do{b[j>>0]=0;j=(f[l>>2]|0)+1|0;f[l>>2]=j;q=q+-1|0}while((q|0)!=0);o=f[i>>2]|0}q=a+28|0;j=(f[q>>2]|0)+-1|0;a:do if((j|0)>-1){p=a+24|0;r=j;s=0;t=4096;v=k;while(1){w=(f[p>>2]&1<>>0>>0){y=s;z=t}else{b[o+s>>0]=t;y=s+1|0;z=t>>>8}on(f[3780+(x<<3)>>2]|0,0,z|0,0)|0;A=z+(w?0:0-v&255)+(X((z+I|0)>>>(f[3780+(x<<3)+4>>2]|0),256-x|0)|0)|0;x=r+-1|0;if((x|0)<=-1){B=y;C=A;break a}r=x;s=y;t=A;v=b[h>>0]|0}}else{B=0;C=4096}while(0);y=f[m>>2]|0;if((f[n>>2]|0)==(y|0)){D=B;E=C}else{z=B;B=C;C=y;while(1){C=C+-4|0;y=f[C>>2]|0;k=31;j=z;v=B;while(1){t=b[h>>0]|0;s=(1<>>0>>0){F=j;G=v}else{b[o+j>>0]=v;F=j+1|0;G=v>>>8}on(f[3780+(r<<3)>>2]|0,0,G|0,0)|0;v=G+(s?0:0-t&255)+(X((G+I|0)>>>(f[3780+(r<<3)+4>>2]|0),256-r|0)|0)|0;if((k|0)<=0)break;else{k=k+-1|0;j=F}}if((f[n>>2]|0)==(C|0)){D=F;E=v;break}else{z=F;B=v}}}B=E+-4096|0;do if(B>>>0>=64){if(B>>>0<16384){F=o+D|0;z=E+12288|0;b[F>>0]=z;H=2;J=z>>>8;K=F+1|0;L=25;break}if(B>>>0<4194304){F=o+D|0;z=E+8384512|0;b[F>>0]=z;b[F+1>>0]=z>>>8;H=3;J=z>>>16;K=F+2|0;L=25}else M=D}else{H=1;J=B;K=o+D|0;L=25}while(0);if((L|0)==25){b[K>>0]=J;M=H+D|0}D=c+16|0;H=D;J=f[H+4>>2]|0;if(!((J|0)>0|(J|0)==0&(f[H>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}Nh(M,c)|0;h=f[i>>2]|0;H=D;D=f[H+4>>2]|0;if(!((D|0)>0|(D|0)==0&(f[H>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+M|0)|0}M=e;f[M>>2]=0;f[M+4>>2]=0;cf(a,2,e);e=f[a+12>>2]|0;M=f[m>>2]|0;if((M|0)!=(e|0))f[m>>2]=M+(~((M+-4-e|0)>>>2)<<2);f[a+24>>2]=0;f[q>>2]=0;q=f[i>>2]|0;if(!q){u=d;return}if((f[l>>2]|0)!=(q|0))f[l>>2]=q;br(q);u=d;return}function gd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;c=u;u=u+16|0;b=c+8|0;d=c+4|0;e=c;g=a+64|0;h=f[g>>2]|0;if((f[h+28>>2]|0)==(f[h+24>>2]|0)){u=c;return}i=a+52|0;j=a+56|0;k=a+60|0;l=a+12|0;m=a+28|0;n=a+40|0;o=a+44|0;p=a+48|0;q=0;r=0;s=h;while(1){h=f[(f[s+24>>2]|0)+(r<<2)>>2]|0;if((h|0)==-1){t=q;v=s}else{w=q+1|0;f[b>>2]=q;x=f[j>>2]|0;if((x|0)==(f[k>>2]|0))Ci(i,b);else{f[x>>2]=q;f[j>>2]=x+4}f[d>>2]=h;f[e>>2]=0;a:do if(!(f[(f[l>>2]|0)+(r>>>5<<2)>>2]&1<<(r&31)))y=h;else{x=h+1|0;z=((x>>>0)%3|0|0)==0?h+-2|0:x;if(((z|0)!=-1?(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(x=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,z=x+1|0,(x|0)!=-1):0){A=((z>>>0)%3|0|0)==0?x+-2|0:z;f[e>>2]=A;if((A|0)==-1){y=h;break}else B=A;while(1){f[d>>2]=B;A=B+1|0;z=((A>>>0)%3|0|0)==0?B+-2|0:A;if((z|0)==-1)break;if(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)break;A=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0;z=A+1|0;if((A|0)==-1)break;x=((z>>>0)%3|0|0)==0?A+-2|0:z;f[e>>2]=x;if((x|0)==-1){y=B;break a}else B=x}f[e>>2]=-1;y=B;break}f[e>>2]=-1;y=h}while(0);f[(f[m>>2]|0)+(y<<2)>>2]=f[b>>2];h=f[o>>2]|0;if((h|0)==(f[p>>2]|0))Ci(n,d);else{f[h>>2]=f[d>>2];f[o>>2]=h+4}h=f[g>>2]|0;x=f[d>>2]|0;b:do if(((x|0)!=-1?(z=(((x>>>0)%3|0|0)==0?2:-1)+x|0,(z|0)!=-1):0)?(A=f[(f[h+12>>2]|0)+(z<<2)>>2]|0,(A|0)!=-1):0){z=A+(((A>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=z;if((z|0)!=-1&(z|0)!=(x|0)){A=w;C=z;while(1){z=C+1|0;D=((z>>>0)%3|0|0)==0?C+-2|0:z;do if(f[(f[a>>2]|0)+(D>>>5<<2)>>2]&1<<(D&31)){z=A+1|0;f[b>>2]=A;E=f[j>>2]|0;if((E|0)==(f[k>>2]|0))Ci(i,b);else{f[E>>2]=A;f[j>>2]=E+4}E=f[o>>2]|0;if((E|0)==(f[p>>2]|0)){Ci(n,e);F=z;break}else{f[E>>2]=f[e>>2];f[o>>2]=E+4;F=z;break}}else F=A;while(0);f[(f[m>>2]|0)+(f[e>>2]<<2)>>2]=f[b>>2];G=f[g>>2]|0;D=f[e>>2]|0;if((D|0)==-1)break;z=(((D>>>0)%3|0|0)==0?2:-1)+D|0;if((z|0)==-1)break;D=f[(f[G+12>>2]|0)+(z<<2)>>2]|0;if((D|0)==-1)break;C=D+(((D>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=C;if(!((C|0)!=-1?(C|0)!=(f[d>>2]|0):0)){H=F;I=G;break b}else A=F}f[e>>2]=-1;H=F;I=G}else{H=w;I=h}}else J=26;while(0);if((J|0)==26){J=0;f[e>>2]=-1;H=w;I=h}t=H;v=I}r=r+1|0;if(r>>>0>=(f[v+28>>2]|0)-(f[v+24>>2]|0)>>2>>>0)break;else{q=t;s=v}}u=c;return}function hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+124|0;f[h>>2]=(f[h>>2]|0)+1;h=a+88|0;i=a+120|0;j=f[i>>2]|0;k=j+1|0;do if((j|0)!=-1){l=((k>>>0)%3|0|0)==0?j+-2|0:k;if(!((j>>>0)%3|0)){m=j+2|0;n=l;break}else{m=j+-1|0;n=l;break}}else{m=-1;n=-1}while(0);k=a+104|0;l=a+92|0;o=f[l>>2]|0;p=o+(n<<2)|0;q=f[k>>2]|0;r=q+(f[p>>2]<<2)|0;s=f[r>>2]|0;switch(b|0){case 1:case 0:{f[r>>2]=s+-1;r=q+(f[o+(m<<2)>>2]<<2)|0;f[r>>2]=(f[r>>2]|0)+-1;if((b|0)==1){if((m|0)!=-1?(r=f[(f[(f[h>>2]|0)+12>>2]|0)+(m<<2)>>2]|0,(r|0)!=-1):0){t=a+64|0;v=1;w=r;while(1){r=f[t>>2]|0;x=f[(f[r>>2]|0)+36>>2]|0;f[e>>2]=(w>>>0)/3|0;f[d>>2]=f[e>>2];if(Ra[x&127](r,d)|0){y=v;break}r=w+1|0;x=((r>>>0)%3|0|0)==0?w+-2|0:r;if((x|0)==-1){z=12;break}w=f[(f[(f[h>>2]|0)+12>>2]|0)+(x<<2)>>2]|0;x=v+1|0;if((w|0)==-1){y=x;break}else v=x}if((z|0)==12)y=v+1|0;A=y;B=f[k>>2]|0;C=f[l>>2]|0}else{A=1;B=q;C=o}f[B+(f[C+(f[i>>2]<<2)>>2]<<2)>>2]=A;A=a+108|0;i=f[A>>2]|0;C=i-B>>2;B=i;if((n|0)!=-1?(i=f[(f[(f[h>>2]|0)+12>>2]|0)+(n<<2)>>2]|0,(i|0)!=-1):0){n=a+64|0;y=1;v=i;while(1){i=f[n>>2]|0;w=f[(f[i>>2]|0)+36>>2]|0;f[g>>2]=(v>>>0)/3|0;f[d>>2]=f[g>>2];if(Ra[w&127](i,d)|0){D=y;break}i=v+1|0;f[(f[l>>2]|0)+((((i>>>0)%3|0|0)==0?v+-2|0:i)<<2)>>2]=C;i=(((v>>>0)%3|0|0)==0?2:-1)+v|0;if((i|0)==-1){z=20;break}v=f[(f[(f[h>>2]|0)+12>>2]|0)+(i<<2)>>2]|0;i=y+1|0;if((v|0)==-1){D=i;break}else y=i}if((z|0)==20)D=y+1|0;E=D;F=f[A>>2]|0}else{E=1;F=B}f[d>>2]=E;if(F>>>0<(f[a+112>>2]|0)>>>0){f[F>>2]=E;f[A>>2]=F+4}else Ci(k,d)}break}case 5:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;break}case 3:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;break}case 7:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;break}default:{}}k=a+116|0;m=f[k>>2]|0;if((m|0)==-1){f[k>>2]=b;u=c;return}o=f[a+128>>2]|0;if((s|0)<(o|0))G=o;else{q=f[a+132>>2]|0;G=(s|0)>(q|0)?q:s}s=G-o|0;o=f[a+136>>2]|0;a=f[3384+(m<<2)>>2]|0;f[d>>2]=a;m=o+(s*12|0)+4|0;G=f[m>>2]|0;if(G>>>0<(f[o+(s*12|0)+8>>2]|0)>>>0){f[G>>2]=a;f[m>>2]=G+4}else Ci(o+(s*12|0)|0,d);f[k>>2]=b;u=c;return}function id(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=e>>>0>1073741823?-1:e<<2;k=_q(j)|0;hj(k|0,0,j|0)|0;j=f[a+28>>2]|0;l=a+36|0;m=f[l>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;a:do if((p|0)>4){q=p>>2;r=f[a+32>>2]|0;s=a+8|0;t=h+4|0;v=i+4|0;w=d+4|0;x=j+64|0;y=j+28|0;z=(e|0)>0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=q+-1|0;if(n-o>>2>>>0>E>>>0){F=q;G=E;H=o}else{I=m;mq(I)}while(1){E=f[H+(G<<2)>>2]|0;q=X(G,e)|0;if((((E|0)!=-1?(f[(f[j>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)==0:0)?(J=f[(f[(f[x>>2]|0)+12>>2]|0)+(E<<2)>>2]|0,(J|0)!=-1):0)?(E=f[y>>2]|0,K=f[r>>2]|0,L=f[K+(f[E+(J<<2)>>2]<<2)>>2]|0,M=J+1|0,N=f[K+(f[E+((((M>>>0)%3|0|0)==0?J+-2|0:M)<<2)>>2]<<2)>>2]|0,M=f[K+(f[E+((((J>>>0)%3|0|0)==0?2:-1)+J<<2)>>2]<<2)>>2]|0,(L|0)<(G|0)&(N|0)<(G|0)&(M|0)<(G|0)):0){J=X(L,e)|0;L=X(N,e)|0;N=X(M,e)|0;if(z){M=0;do{f[k+(M<<2)>>2]=(f[b+(M+N<<2)>>2]|0)+(f[b+(M+L<<2)>>2]|0)-(f[b+(M+J<<2)>>2]|0);M=M+1|0}while((M|0)!=(e|0))}M=b+(q<<2)|0;J=c+(q<<2)|0;L=f[M+4>>2]|0;N=f[k>>2]|0;E=f[A>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=L;f[i>>2]=N;f[C>>2]=E;Dd(d,s,h,i);f[J>>2]=f[d>>2];f[J+4>>2]=f[D>>2]}else{J=b+(q<<2)|0;E=b+((X(F+-2|0,e)|0)<<2)|0;N=c+(q<<2)|0;L=f[J+4>>2]|0;M=f[E>>2]|0;K=f[E+4>>2]|0;f[h>>2]=f[J>>2];f[t>>2]=L;f[i>>2]=M;f[v>>2]=K;Dd(d,s,h,i);f[N>>2]=f[d>>2];f[N+4>>2]=f[w>>2]}if((F|0)<=2)break a;N=f[l>>2]|0;H=f[N>>2]|0;K=G+-1|0;if((f[N+4>>2]|0)-H>>2>>>0<=K>>>0){I=N;break}else{N=G;G=K;F=N}}mq(I)}while(0);if((e|0)<=0){O=a+8|0;P=b+4|0;Q=f[b>>2]|0;R=f[P>>2]|0;S=k+4|0;T=f[k>>2]|0;U=f[S>>2]|0;f[h>>2]=Q;V=h+4|0;f[V>>2]=R;f[i>>2]=T;W=i+4|0;f[W>>2]=U;Dd(d,O,h,i);Y=f[d>>2]|0;f[c>>2]=Y;Z=d+4|0;_=f[Z>>2]|0;$=c+4|0;f[$>>2]=_;$q(k);u=g;return 1}hj(k|0,0,e<<2|0)|0;O=a+8|0;P=b+4|0;Q=f[b>>2]|0;R=f[P>>2]|0;S=k+4|0;T=f[k>>2]|0;U=f[S>>2]|0;f[h>>2]=Q;V=h+4|0;f[V>>2]=R;f[i>>2]=T;W=i+4|0;f[W>>2]=U;Dd(d,O,h,i);Y=f[d>>2]|0;f[c>>2]=Y;Z=d+4|0;_=f[Z>>2]|0;$=c+4|0;f[$>>2]=_;$q(k);u=g;return 1}function jd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+2|0;v=e+12|0;w=q+6|0;x=f[e>>2]|0;d:do if(!x)y=e;else{z=d[q>>1]|0;A=e;B=x;while(1){C=B+8|0;if(z<<16>>16!=(d[C>>1]|0)){y=A;break d}if((d[u>>1]|0)!=(d[C+2>>1]|0)){y=A;break d}if((d[v>>1]|0)!=(d[B+12>>1]|0)){y=A;break d}if((d[w>>1]|0)!=(d[C+6>>1]|0)){y=A;break d}C=f[B>>2]|0;if(!C){y=B;break}else{D=B;B=C;A=D}}}while(0);f[j>>2]=f[y>>2];f[y>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}else{e=c;while(1){w=f[e+4>>2]|0;if(w>>>0>>0)F=w;else F=(w>>>0)%(b>>>0)|0;if((F|0)==(k|0)){p=e;break c}w=(f[a>>2]|0)+(F<<2)|0;if(!(f[w>>2]|0)){r=e;s=F;t=w;break b}w=e+8|0;v=w+2|0;u=e+12|0;x=w+6|0;q=f[e>>2]|0;e:do if(!q)G=e;else{A=d[w>>1]|0;B=e;z=q;while(1){D=z+8|0;if(A<<16>>16!=(d[D>>1]|0)){G=B;break e}if((d[v>>1]|0)!=(d[D+2>>1]|0)){G=B;break e}if((d[u>>1]|0)!=(d[z+12>>1]|0)){G=B;break e}if((d[x>>1]|0)!=(d[D+6>>1]|0)){G=B;break e}D=f[z>>2]|0;if(!D){G=z;break}else{C=z;z=D;B=C}}}while(0);f[j>>2]=f[G>>2];f[G>>2]=f[f[(f[a>>2]|0)+(F<<2)>>2]>>2];f[f[(f[a>>2]|0)+(F<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}while(0);c=f[p>>2]|0;if(!c){E=43;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){E=43;break}else{k=s;l=r;n=r}}if((E|0)==43)return}function kd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+1|0;v=q+2|0;w=q+3|0;x=f[e>>2]|0;d:do if(!x)y=e;else{z=b[q>>0]|0;A=e;B=x;while(1){C=B+8|0;if(z<<24>>24!=(b[C>>0]|0)){y=A;break d}if((b[u>>0]|0)!=(b[C+1>>0]|0)){y=A;break d}if((b[v>>0]|0)!=(b[C+2>>0]|0)){y=A;break d}if((b[w>>0]|0)!=(b[C+3>>0]|0)){y=A;break d}C=f[B>>2]|0;if(!C){y=B;break}else{D=B;B=C;A=D}}}while(0);f[j>>2]=f[y>>2];f[y>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}else{e=d;while(1){w=f[e+4>>2]|0;if(w>>>0>>0)F=w;else F=(w>>>0)%(c>>>0)|0;if((F|0)==(k|0)){p=e;break c}w=(f[a>>2]|0)+(F<<2)|0;if(!(f[w>>2]|0)){r=e;s=F;t=w;break b}w=e+8|0;v=w+1|0;u=w+2|0;x=w+3|0;q=f[e>>2]|0;e:do if(!q)G=e;else{A=b[w>>0]|0;B=e;z=q;while(1){D=z+8|0;if(A<<24>>24!=(b[D>>0]|0)){G=B;break e}if((b[v>>0]|0)!=(b[D+1>>0]|0)){G=B;break e}if((b[u>>0]|0)!=(b[D+2>>0]|0)){G=B;break e}if((b[x>>0]|0)!=(b[D+3>>0]|0)){G=B;break e}D=f[z>>2]|0;if(!D){G=z;break}else{C=z;z=D;B=C}}}while(0);f[j>>2]=f[G>>2];f[G>>2]=f[f[(f[a>>2]|0)+(F<<2)>>2]>>2];f[f[(f[a>>2]|0)+(F<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}while(0);d=f[p>>2]|0;if(!d){E=43;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){E=43;break}else{k=s;l=r;n=r}}if((E|0)==43)return}function ld(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)br(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}d=dn(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)br(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=d+16|0;u=d+20|0;v=f[d>>2]|0;d:do if(!v)w=d;else{x=f[d+8>>2]|0;y=d;z=v;while(1){if((x|0)!=(f[z+8>>2]|0)){w=y;break d}if((f[p>>2]|0)!=(f[z+12>>2]|0)){w=y;break d}if((f[t>>2]|0)!=(f[z+16>>2]|0)){w=y;break d}if((f[u>>2]|0)!=(f[z+20>>2]|0)){w=y;break d}A=f[z>>2]|0;if(!A){w=z;break}else{B=z;z=A;y=B}}}while(0);f[i>>2]=f[w>>2];f[w>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){C=43;break a}}}else{d=c;while(1){u=f[d+4>>2]|0;if(u>>>0>>0)D=u;else D=(u>>>0)%(b>>>0)|0;if((D|0)==(j|0)){o=d;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){q=d;r=D;s=u;break b}u=d+12|0;t=d+16|0;p=d+20|0;v=f[d>>2]|0;e:do if(!v)E=d;else{y=f[d+8>>2]|0;z=d;x=v;while(1){if((y|0)!=(f[x+8>>2]|0)){E=z;break e}if((f[u>>2]|0)!=(f[x+12>>2]|0)){E=z;break e}if((f[t>>2]|0)!=(f[x+16>>2]|0)){E=z;break e}if((f[p>>2]|0)!=(f[x+20>>2]|0)){E=z;break e}B=f[x>>2]|0;if(!B){E=x;break}else{A=x;x=B;z=A}}}while(0);f[i>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){C=43;break a}}}while(0);c=f[o>>2]|0;if(!c){C=43;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){C=43;break}else{j=r;k=q;m=q}}if((C|0)==43)return}function md(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0;i=u;u=u+352|0;j=i+340|0;k=i+336|0;l=i+80|0;m=i+48|0;n=i;hj(l|0,0,256)|0;o=f[e+4>>2]|0;p=f[e>>2]|0;q=p;if((o|0)!=(p|0)){r=o-p>>2;p=0;do{o=l+(f[q+(p<<2)>>2]<<3)|0;s=o;t=Tn(f[s>>2]|0,f[s+4>>2]|0,1,0)|0;s=o;f[s>>2]=t;f[s+4>>2]=I;p=p+1|0}while(p>>>0>>0)}Cn(m);r=Rn(c|0,((c|0)<0)<<31>>31|0,5)|0;p=I;q=n+40|0;s=q;f[s>>2]=0;f[s+4>>2]=0;s=n;t=s+36|0;do{f[s>>2]=0;s=s+4|0}while((s|0)<(t|0));$c(n,l,32,g)|0;l=n+16|0;s=Rn(f[l>>2]|0,f[l+4>>2]|0,1)|0;l=g+4|0;t=(f[l>>2]|0)-(f[g>>2]|0)|0;o=q;f[o>>2]=t;f[o+4>>2]=0;o=Tn(s|0,I|0,39,0)|0;s=Wn(o|0,I|0,3)|0;o=Tn(s|0,I|0,8,0)|0;s=Tn(o|0,I|0,t|0,0)|0;vl(g,s,I);s=n+24|0;f[s>>2]=(f[g>>2]|0)+(f[q>>2]|0);q=n+28|0;f[q>>2]=0;t=n+32|0;f[t>>2]=16384;li(m,r,p,0)|0;p=c-d|0;if((p|0)>-1){c=(d|0)>0;r=m+16|0;o=m+12|0;v=p;do{w=f[e>>2]|0;x=f[w+(((v|0)/(d|0)|0)<<2)>>2]|0;y=f[n>>2]|0;z=f[y+(x<<3)>>2]|0;A=f[t>>2]|0;B=z<<10;if(A>>>0>>0){C=A;D=w}else{w=A;do{A=f[s>>2]|0;E=f[q>>2]|0;f[q>>2]=E+1;b[A+E>>0]=w;w=(f[t>>2]|0)>>>8;f[t>>2]=w}while(w>>>0>=B>>>0);C=w;D=f[e>>2]|0}f[t>>2]=(((C>>>0)/(z>>>0)|0)<<12)+((C>>>0)%(z>>>0)|0)+(f[y+(x<<3)+4>>2]|0);B=p-v|0;E=f[D+(((B|0)/(d|0)|0)<<2)>>2]|0;if(c&(E|0)>0){A=0;do{F=f[a+(A+B<<2)>>2]|0;G=r;H=f[G+4>>2]|0;if((H|0)>0|(H|0)==0&(f[G>>2]|0)>>>0>0){G=f[o>>2]|0;H=G+4|0;J=0;K=f[H>>2]|0;do{L=K>>>3;M=K&7;N=(f[G>>2]|0)+L|0;b[N>>0]=(1<>0]|0);N=(f[G>>2]|0)+L|0;b[N>>0]=(F>>>J&1)<>0]|0);K=(f[H>>2]|0)+1|0;f[H>>2]=K;J=J+1|0}while((J|0)!=(E|0))}A=A+1|0}while((A|0)!=(d|0))}v=v-d|0}while((v|0)>-1)}Lf(n,g);Qf(m);v=f[m>>2]|0;d=m+4|0;o=g+16|0;r=f[o+4>>2]|0;if(!((r|0)>0|(r|0)==0&(f[o>>2]|0)>>>0>0)){o=(f[d>>2]|0)-v|0;f[k>>2]=f[l>>2];f[j>>2]=f[k>>2];ye(g,j,v,v+o|0)|0}o=f[n>>2]|0;if(o|0){v=n+4|0;n=f[v>>2]|0;if((n|0)!=(o|0))f[v>>2]=n+(~((n+-8-o|0)>>>3)<<3);br(o)}o=m+12|0;n=f[o>>2]|0;f[o>>2]=0;if(n|0)br(n);n=f[m>>2]|0;if(!n){u=i;return 1}if((f[d>>2]|0)!=(n|0))f[d>>2]=n;br(n);u=i;return 1}function nd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=e+12|0;v=f[e>>2]|0;d:do if(!v)w=e;else{x=d[q>>1]|0;y=q+2|0;z=e;A=v;while(1){B=A+8|0;if(x<<16>>16!=(d[B>>1]|0)){w=z;break d}if((d[y>>1]|0)!=(d[B+2>>1]|0)){w=z;break d}if((d[u>>1]|0)!=(d[A+12>>1]|0)){w=z;break d}B=f[A>>2]|0;if(!B){w=A;break}else{C=A;A=B;z=C}}}while(0);f[j>>2]=f[w>>2];f[w>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}else{e=c;while(1){u=f[e+4>>2]|0;if(u>>>0>>0)E=u;else E=(u>>>0)%(b>>>0)|0;if((E|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(E<<2)|0;if(!(f[u>>2]|0)){r=e;s=E;t=u;break b}u=e+8|0;v=e+12|0;q=f[e>>2]|0;e:do if(!q)F=e;else{z=d[u>>1]|0;A=u+2|0;y=e;x=q;while(1){C=x+8|0;if(z<<16>>16!=(d[C>>1]|0)){F=y;break e}if((d[A>>1]|0)!=(d[C+2>>1]|0)){F=y;break e}if((d[v>>1]|0)!=(d[x+12>>1]|0)){F=y;break e}C=f[x>>2]|0;if(!C){F=x;break}else{B=x;x=C;y=B}}}while(0);f[j>>2]=f[F>>2];f[F>>2]=f[f[(f[a>>2]|0)+(E<<2)>>2]>>2];f[f[(f[a>>2]|0)+(E<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}while(0);c=f[p>>2]|0;if(!c){D=41;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){D=41;break}else{k=s;l=r;n=r}}if((D|0)==41)return}function od(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+1|0;v=q+2|0;w=f[e>>2]|0;d:do if(!w)x=e;else{y=b[q>>0]|0;z=e;A=w;while(1){B=A+8|0;if(y<<24>>24!=(b[B>>0]|0)){x=z;break d}if((b[u>>0]|0)!=(b[B+1>>0]|0)){x=z;break d}if((b[v>>0]|0)!=(b[B+2>>0]|0)){x=z;break d}B=f[A>>2]|0;if(!B){x=A;break}else{C=A;A=B;z=C}}}while(0);f[j>>2]=f[x>>2];f[x>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}else{e=d;while(1){v=f[e+4>>2]|0;if(v>>>0>>0)E=v;else E=(v>>>0)%(c>>>0)|0;if((E|0)==(k|0)){p=e;break c}v=(f[a>>2]|0)+(E<<2)|0;if(!(f[v>>2]|0)){r=e;s=E;t=v;break b}v=e+8|0;u=v+1|0;w=v+2|0;q=f[e>>2]|0;e:do if(!q)F=e;else{z=b[v>>0]|0;A=e;y=q;while(1){C=y+8|0;if(z<<24>>24!=(b[C>>0]|0)){F=A;break e}if((b[u>>0]|0)!=(b[C+1>>0]|0)){F=A;break e}if((b[w>>0]|0)!=(b[C+2>>0]|0)){F=A;break e}C=f[y>>2]|0;if(!C){F=y;break}else{B=y;y=C;A=B}}}while(0);f[j>>2]=f[F>>2];f[F>>2]=f[f[(f[a>>2]|0)+(E<<2)>>2]>>2];f[f[(f[a>>2]|0)+(E<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}while(0);d=f[p>>2]|0;if(!d){D=41;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){D=41;break}else{k=s;l=r;n=r}}if((D|0)==41)return}function pd(a,b){a=+a;b=+b;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;p[s>>3]=b;e=f[s>>2]|0;g=f[s+4>>2]|0;h=Wn(c|0,d|0,52)|0;i=h&2047;h=Wn(e|0,g|0,52)|0;j=h&2047;h=d&-2147483648;k=Rn(e|0,g|0,1)|0;l=I;a:do if(!((k|0)==0&(l|0)==0)?(m=xo(b)|0,n=I&2147483647,!((i|0)==2047|(n>>>0>2146435072|(n|0)==2146435072&m>>>0>0))):0){m=Rn(c|0,d|0,1)|0;n=I;if(!(n>>>0>l>>>0|(n|0)==(l|0)&m>>>0>k>>>0))return +((m|0)==(k|0)&(n|0)==(l|0)?a*0.0:a);if(!i){n=Rn(c|0,d|0,12)|0;m=I;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){o=0;q=n;n=m;while(1){m=o+-1|0;q=Rn(q|0,n|0,1)|0;n=I;if(!((n|0)>-1|(n|0)==-1&q>>>0>4294967295)){r=m;break}else o=m}}else r=0;o=Rn(c|0,d|0,1-r|0)|0;t=r;u=o;v=I}else{t=i;u=c;v=d&1048575|1048576}if(!j){o=Rn(e|0,g|0,12)|0;q=I;if((q|0)>-1|(q|0)==-1&o>>>0>4294967295){n=0;m=o;o=q;while(1){q=n+-1|0;m=Rn(m|0,o|0,1)|0;o=I;if(!((o|0)>-1|(o|0)==-1&m>>>0>4294967295)){w=q;break}else n=q}}else w=0;n=Rn(e|0,g|0,1-w|0)|0;x=w;y=n;z=I}else{x=j;y=e;z=g&1048575|1048576}n=Vn(u|0,v|0,y|0,z|0)|0;m=I;o=(m|0)>-1|(m|0)==-1&n>>>0>4294967295;b:do if((t|0)>(x|0)){q=t;A=m;B=o;C=u;D=v;E=n;while(1){if(B)if((E|0)==0&(A|0)==0)break;else{F=E;G=A}else{F=C;G=D}H=Rn(F|0,G|0,1)|0;J=I;K=q+-1|0;L=Vn(H|0,J|0,y|0,z|0)|0;M=I;N=(M|0)>-1|(M|0)==-1&L>>>0>4294967295;if((K|0)>(x|0)){q=K;A=M;B=N;C=H;D=J;E=L}else{O=K;P=N;Q=L;R=M;S=H;T=J;break b}}U=a*0.0;break a}else{O=t;P=o;Q=n;R=m;S=u;T=v}while(0);if(P)if((Q|0)==0&(R|0)==0){U=a*0.0;break}else{V=R;W=Q}else{V=T;W=S}if(V>>>0<1048576|(V|0)==1048576&W>>>0<0){m=O;n=W;o=V;while(1){E=Rn(n|0,o|0,1)|0;D=I;C=m+-1|0;if(D>>>0<1048576|(D|0)==1048576&E>>>0<0){m=C;n=E;o=D}else{X=C;Y=E;Z=D;break}}}else{X=O;Y=W;Z=V}if((X|0)>0){o=Tn(Y|0,Z|0,0,-1048576)|0;n=I;m=Rn(X|0,0,52)|0;_=n|I;$=o|m}else{m=Wn(Y|0,Z|0,1-X|0)|0;_=I;$=m}f[s>>2]=$;f[s+4>>2]=_|h;U=+p[s>>3]}else aa=3;while(0);if((aa|0)==3){ba=a*b;U=ba/ba}return +U}function qd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)br(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}d=dn(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)br(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=d+16|0;u=f[d>>2]|0;d:do if(!u)v=d;else{w=f[d+8>>2]|0;x=d;y=u;while(1){if((w|0)!=(f[y+8>>2]|0)){v=x;break d}if((f[p>>2]|0)!=(f[y+12>>2]|0)){v=x;break d}if((f[t>>2]|0)!=(f[y+16>>2]|0)){v=x;break d}z=f[y>>2]|0;if(!z){v=y;break}else{A=y;y=z;x=A}}}while(0);f[i>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){B=41;break a}}}else{d=c;while(1){t=f[d+4>>2]|0;if(t>>>0>>0)C=t;else C=(t>>>0)%(b>>>0)|0;if((C|0)==(j|0)){o=d;break c}t=(f[a>>2]|0)+(C<<2)|0;if(!(f[t>>2]|0)){q=d;r=C;s=t;break b}t=d+12|0;p=d+16|0;u=f[d>>2]|0;e:do if(!u)D=d;else{x=f[d+8>>2]|0;y=d;w=u;while(1){if((x|0)!=(f[w+8>>2]|0)){D=y;break e}if((f[t>>2]|0)!=(f[w+12>>2]|0)){D=y;break e}if((f[p>>2]|0)!=(f[w+16>>2]|0)){D=y;break e}A=f[w>>2]|0;if(!A){D=w;break}else{z=w;w=A;y=z}}}while(0);f[i>>2]=f[D>>2];f[D>>2]=f[f[(f[a>>2]|0)+(C<<2)>>2]>>2];f[f[(f[a>>2]|0)+(C<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){B=41;break a}}}while(0);c=f[o>>2]|0;if(!c){B=41;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){B=41;break}else{j=r;k=q;m=q}}if((B|0)==41)return}function rd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){o=d;while(1){e=f[o+4>>2]|0;if(!i)if(e>>>0>>0)p=e;else p=(e>>>0)%(c>>>0)|0;else p=e&h;if((p|0)==(k|0))break;q=(f[a>>2]|0)+(p<<2)|0;if(!(f[q>>2]|0))break b;e=f[o>>2]|0;c:do if(!e)r=o;else{s=o+8|0;t=b[s+11>>0]|0;u=t<<24>>24<0;v=t&255;t=u?f[o+12>>2]|0:v;w=(t|0)==0;if(u){u=o;x=e;while(1){y=x+8|0;z=b[y+11>>0]|0;A=z<<24>>24<0;if((t|0)!=((A?f[x+12>>2]|0:z&255)|0)){r=u;break c}if(!w?Pk(f[s>>2]|0,A?f[y>>2]|0:y,t)|0:0){r=u;break c}y=f[x>>2]|0;if(!y){r=x;break c}else{A=x;x=y;u=A}}}if(w){u=o;x=e;while(1){A=b[x+8+11>>0]|0;if((A<<24>>24<0?f[x+12>>2]|0:A&255)|0){r=u;break c}A=f[x>>2]|0;if(!A){r=x;break c}else{y=x;x=A;u=y}}}u=o;x=e;while(1){w=x+8|0;y=b[w+11>>0]|0;A=y<<24>>24<0;if((t|0)!=((A?f[x+12>>2]|0:y&255)|0)){r=u;break c}y=A?f[w>>2]|0:w;if((b[y>>0]|0)==(f[s>>2]&255)<<24>>24){B=s;C=v;D=y}else{r=u;break c}while(1){C=C+-1|0;B=B+1|0;if(!C)break;D=D+1|0;if((b[B>>0]|0)!=(b[D>>0]|0)){r=u;break c}}y=f[x>>2]|0;if(!y){r=x;break}else{w=x;x=y;u=w}}}while(0);f[j>>2]=f[r>>2];f[r>>2]=f[f[(f[a>>2]|0)+(p<<2)>>2]>>2];f[f[(f[a>>2]|0)+(p<<2)>>2]>>2]=o;e=f[g>>2]|0;if(!e){E=43;break a}else o=e}d=f[o>>2]|0;if(!d){E=43;break a}else{g=o;j=o}}f[q>>2]=j;m=f[o>>2]|0;if(!m){E=43;break}else{k=p;l=o;n=o}}if((E|0)==43)return}function sd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+48|0;d=c+8|0;e=c+4|0;g=c;h=a+44|0;Nh(f[h>>2]|0,b)|0;if(f[h>>2]|0){rn(d);lk(d);i=f[h>>2]|0;if((i|0)>0){h=a+40|0;j=i;do{i=j;j=j+-1|0;Vi(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0)}while((i|0)>1)}fd(d,b);tj(d)}j=a+56|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);h=f[j>>2]|0;if((h|0)>1){j=a+52|0;i=h;do{h=i;i=i+-2|0;Vi(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);k=h+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((h|0)>3)}fd(d,b);tj(d)}j=a+68|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);i=f[j>>2]|0;if((i|0)>2){j=a+64|0;h=i;do{i=h;h=h+-3|0;Vi(d,(f[(f[j>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);k=i+-2|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=i+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((i|0)>5)}fd(d,b);tj(d)}j=a+80|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);h=f[j>>2]|0;if((h|0)>3){j=a+76|0;i=h;do{h=i;i=i+-4|0;Vi(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);k=h+-3|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=h+-2|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=h+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((h|0)>7)}fd(d,b);tj(d)}f[g>>2]=f[a+12>>2];j=b+16|0;i=j;h=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&h>>>0>0){l=k;m=h}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;h=j;l=f[h+4>>2]|0;m=f[h>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;u=c;return 1}function td(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+48|0;d=c+8|0;e=c+4|0;g=c;h=a+64|0;Nh(f[h>>2]|0,b)|0;if(f[h>>2]|0){rn(d);lk(d);i=f[h>>2]|0;if((i|0)>0){h=a+60|0;j=i;do{i=j;j=j+-1|0;Vi(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0)}while((i|0)>1)}fd(d,b);tj(d)}j=a+76|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);h=f[j>>2]|0;if((h|0)>1){j=a+72|0;i=h;do{h=i;i=i+-2|0;Vi(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);k=h+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((h|0)>3)}fd(d,b);tj(d)}j=a+88|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);i=f[j>>2]|0;if((i|0)>2){j=a+84|0;h=i;do{i=h;h=h+-3|0;Vi(d,(f[(f[j>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);k=i+-2|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=i+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((i|0)>5)}fd(d,b);tj(d)}j=a+100|0;Nh(f[j>>2]|0,b)|0;if(f[j>>2]|0){rn(d);lk(d);h=f[j>>2]|0;if((h|0)>3){j=a+96|0;i=h;do{h=i;i=i+-4|0;Vi(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);k=h+-3|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=h+-2|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0);k=h+-1|0;Vi(d,(f[(f[j>>2]|0)+(k>>>5<<2)>>2]&1<<(k&31)|0)!=0)}while((h|0)>7)}fd(d,b);tj(d)}f[g>>2]=f[a+12>>2];j=b+16|0;i=j;h=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&h>>>0>0){l=k;m=h}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;h=j;l=f[h+4>>2]|0;m=f[h>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;u=c;return 1}function ud(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=f[e>>2]|0;d:do if(!u)v=e;else{w=d[q>>1]|0;x=q+2|0;y=e;z=u;while(1){A=z+8|0;if(w<<16>>16!=(d[A>>1]|0)){v=y;break d}if((d[x>>1]|0)!=(d[A+2>>1]|0)){v=y;break d}A=f[z>>2]|0;if(!A){v=z;break}else{B=z;z=A;y=B}}}while(0);f[j>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}else{e=c;while(1){u=f[e+4>>2]|0;if(u>>>0>>0)D=u;else D=(u>>>0)%(b>>>0)|0;if((D|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){r=e;s=D;t=u;break b}u=e+8|0;q=f[e>>2]|0;e:do if(!q)E=e;else{y=d[u>>1]|0;z=u+2|0;x=e;w=q;while(1){B=w+8|0;if(y<<16>>16!=(d[B>>1]|0)){E=x;break e}if((d[z>>1]|0)!=(d[B+2>>1]|0)){E=x;break e}B=f[w>>2]|0;if(!B){E=w;break}else{A=w;w=B;x=A}}}while(0);f[j>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}while(0);c=f[p>>2]|0;if(!c){C=39;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){C=39;break}else{k=s;l=r;n=r}}if((C|0)==39)return}function vd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=f[e>>2]|0;d:do if(!u)v=e;else{w=b[q>>0]|0;x=q+1|0;y=e;z=u;while(1){A=z+8|0;if(w<<24>>24!=(b[A>>0]|0)){v=y;break d}if((b[x>>0]|0)!=(b[A+1>>0]|0)){v=y;break d}A=f[z>>2]|0;if(!A){v=z;break}else{B=z;z=A;y=B}}}while(0);f[j>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}else{e=d;while(1){u=f[e+4>>2]|0;if(u>>>0>>0)D=u;else D=(u>>>0)%(c>>>0)|0;if((D|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){r=e;s=D;t=u;break b}u=e+8|0;q=f[e>>2]|0;e:do if(!q)E=e;else{y=b[u>>0]|0;z=u+1|0;x=e;w=q;while(1){B=w+8|0;if(y<<24>>24!=(b[B>>0]|0)){E=x;break e}if((b[z>>0]|0)!=(b[B+1>>0]|0)){E=x;break e}B=f[w>>2]|0;if(!B){E=w;break}else{A=w;w=B;x=A}}}while(0);f[j>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}while(0);d=f[p>>2]|0;if(!d){C=39;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){C=39;break}else{k=s;l=r;n=r}}if((C|0)==39)return}function wd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=u;u=u+48|0;d=c+32|0;e=c+28|0;g=c+16|0;h=c;i=a+16|0;j=f[i>>2]|0;if(j|0){k=f[b>>2]|0;l=i;m=j;a:while(1){j=m;while(1){if((f[j+16>>2]|0)>=(k|0))break;n=f[j+4>>2]|0;if(!n){o=l;break a}else j=n}m=f[j>>2]|0;if(!m){o=j;break}else l=j}if((o|0)!=(i|0)?(k|0)>=(f[o+16>>2]|0):0){p=o;q=p+20|0;u=c;return q|0}}wp(g);f[h>>2]=f[b>>2];b=h+4|0;f[h+8>>2]=0;o=h+12|0;f[o>>2]=0;k=h+8|0;f[b>>2]=k;l=f[g>>2]|0;m=g+4|0;if((l|0)!=(m|0)){n=k;r=l;while(1){l=r+16|0;f[e>>2]=n;f[d>>2]=f[e>>2];Wg(b,d,l,l)|0;l=f[r+4>>2]|0;if(!l){s=r+8|0;t=f[s>>2]|0;if((f[t>>2]|0)==(r|0))v=t;else{t=s;do{s=f[t>>2]|0;t=s+8|0;w=f[t>>2]|0}while((f[w>>2]|0)!=(s|0));v=w}}else{t=l;while(1){j=f[t>>2]|0;if(!j)break;else t=j}v=t}if((v|0)==(m|0))break;else r=v}}v=a+12|0;r=f[i>>2]|0;do if(r){d=f[h>>2]|0;e=a+16|0;n=r;while(1){l=f[n+16>>2]|0;if((d|0)<(l|0)){j=f[n>>2]|0;if(!j){x=23;break}else{y=n;z=j}}else{if((l|0)>=(d|0)){x=27;break}A=n+4|0;l=f[A>>2]|0;if(!l){x=26;break}else{y=A;z=l}}e=y;n=z}if((x|0)==23){B=n;C=n;break}else if((x|0)==26){B=n;C=A;break}else if((x|0)==27){B=n;C=e;break}}else{B=i;C=i}while(0);i=f[C>>2]|0;if(!i){x=dn(32)|0;f[x+16>>2]=f[h>>2];A=x+20|0;f[A>>2]=f[b>>2];z=x+24|0;y=f[h+8>>2]|0;f[z>>2]=y;r=f[o>>2]|0;f[x+28>>2]=r;if(!r)f[A>>2]=z;else{f[y+8>>2]=z;f[b>>2]=k;f[k>>2]=0;f[o>>2]=0}f[x>>2]=0;f[x+4>>2]=0;f[x+8>>2]=B;f[C>>2]=x;B=f[f[v>>2]>>2]|0;if(!B)D=x;else{f[v>>2]=B;D=f[C>>2]|0}Ae(f[a+16>>2]|0,D);D=a+20|0;f[D>>2]=(f[D>>2]|0)+1;E=x}else E=i;sj(h+4|0,f[k>>2]|0);sj(g,f[m>>2]|0);p=E;q=p+20|0;u=c;return q|0}function xd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;c=i;e=i;while(1){j=X(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;c=(X(j>>>24^j,1540483477)|0)^(X(c,1540483477)|0);e=e+-4|0;if(e>>>0<=3)break;else d=d+4|0}d=i+-4|0;e=d&-4;k=d-e|0;l=g+(e+4)|0;m=c}else{k=i;l=g;m=i}switch(k|0){case 3:{n=h[l+2>>0]<<16^m;o=6;break}case 2:{n=m;o=6;break}case 1:{p=m;o=7;break}default:q=m}if((o|0)==6){p=h[l+1>>0]<<8^n;o=7}if((o|0)==7)q=X(p^h[l>>0],1540483477)|0;l=X(q>>>13^q,1540483477)|0;q=l>>>15^l;l=f[a+4>>2]|0;if(!l){r=0;return r|0}p=l+-1|0;n=(p&l|0)==0;if(!n)if(q>>>0>>0)s=q;else s=(q>>>0)%(l>>>0)|0;else s=q&p;m=f[(f[a>>2]|0)+(s<<2)>>2]|0;if(!m){r=0;return r|0}a=f[m>>2]|0;if(!a){r=0;return r|0}m=(i|0)==0;if(n){n=a;a:while(1){k=f[n+4>>2]|0;c=(k|0)==(q|0);if(!(c|(k&p|0)==(s|0))){r=0;o=40;break}do if(c?(k=n+8|0,e=b[k+11>>0]|0,d=e<<24>>24<0,j=e&255,((d?f[n+12>>2]|0:j)|0)==(i|0)):0){e=f[k>>2]|0;t=d?e:k;if(d){if(m){r=n;o=40;break a}if(!(Pk(t,g,i)|0)){r=n;o=40;break a}else break}if(m){r=n;o=40;break a}if((b[g>>0]|0)==(e&255)<<24>>24){e=k;k=j;j=g;do{k=k+-1|0;e=e+1|0;if(!k){r=n;o=40;break a}j=j+1|0}while((b[e>>0]|0)==(b[j>>0]|0))}}while(0);n=f[n>>2]|0;if(!n){r=0;o=40;break}}if((o|0)==40)return r|0}else u=a;b:while(1){a=f[u+4>>2]|0;do if((a|0)==(q|0)){n=u+8|0;p=b[n+11>>0]|0;c=p<<24>>24<0;j=p&255;if(((c?f[u+12>>2]|0:j)|0)==(i|0)){p=f[n>>2]|0;e=c?p:n;if(c){if(m){r=u;o=40;break b}if(!(Pk(e,g,i)|0)){r=u;o=40;break b}else break}if(m){r=u;o=40;break b}if((b[g>>0]|0)==(p&255)<<24>>24){p=n;n=j;j=g;do{n=n+-1|0;p=p+1|0;if(!n){r=u;o=40;break b}j=j+1|0}while((b[p>>0]|0)==(b[j>>0]|0))}}}else{if(a>>>0>>0)v=a;else v=(a>>>0)%(l>>>0)|0;if((v|0)!=(s|0)){r=0;o=40;break b}}while(0);u=f[u>>2]|0;if(!u){r=0;o=40;break}}if((o|0)==40)return r|0;return 0}function yd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)br(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}d=dn(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)br(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=f[d>>2]|0;d:do if(!t)u=d;else{v=f[d+8>>2]|0;w=d;x=t;while(1){if((v|0)!=(f[x+8>>2]|0)){u=w;break d}if((f[p>>2]|0)!=(f[x+12>>2]|0)){u=w;break d}y=f[x>>2]|0;if(!y){u=x;break}else{z=x;x=y;w=z}}}while(0);f[i>>2]=f[u>>2];f[u>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){A=39;break a}}}else{d=c;while(1){p=f[d+4>>2]|0;if(p>>>0>>0)B=p;else B=(p>>>0)%(b>>>0)|0;if((B|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(B<<2)|0;if(!(f[p>>2]|0)){q=d;r=B;s=p;break b}p=d+12|0;t=f[d>>2]|0;e:do if(!t)C=d;else{w=f[d+8>>2]|0;x=d;v=t;while(1){if((w|0)!=(f[v+8>>2]|0)){C=x;break e}if((f[p>>2]|0)!=(f[v+12>>2]|0)){C=x;break e}z=f[v>>2]|0;if(!z){C=v;break}else{y=v;v=z;x=y}}}while(0);f[i>>2]=f[C>>2];f[C>>2]=f[f[(f[a>>2]|0)+(B<<2)>>2]>>2];f[f[(f[a>>2]|0)+(B<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){A=39;break a}}}while(0);c=f[o>>2]|0;if(!c){A=39;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){A=39;break}else{j=r;k=q;m=q}}if((A|0)==39)return}function zd(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=a+4|0;i=f[c>>2]|0;c=i;do if((i|0)!=(h|0)){j=i+16|0;k=b[j+11>>0]|0;l=k<<24>>24<0;m=l?f[i+20>>2]|0:k&255;k=b[g+11>>0]|0;n=k<<24>>24<0;o=n?f[g+4>>2]|0:k&255;k=m>>>0>>0;p=k?m:o;if((p|0)!=0?(q=Pk(n?f[g>>2]|0:g,l?f[j>>2]|0:j,p)|0,(q|0)!=0):0){if((q|0)<0)break}else r=4;if((r|0)==4?o>>>0>>0:0)break;q=o>>>0>>0?o:m;if((q|0)!=0?(m=Pk(l?f[j>>2]|0:j,n?f[g>>2]|0:g,q)|0,(m|0)!=0):0){if((m|0)>=0)r=37}else r=21;if((r|0)==21?!k:0)r=37;if((r|0)==37){f[d>>2]=c;f[e>>2]=c;s=e;return s|0}k=f[i+4>>2]|0;m=(k|0)==0;if(m){q=i+8|0;j=f[q>>2]|0;if((f[j>>2]|0)==(i|0))t=j;else{j=q;do{q=f[j>>2]|0;j=q+8|0;l=f[j>>2]|0}while((f[l>>2]|0)!=(q|0));t=l}}else{j=k;while(1){l=f[j>>2]|0;if(!l)break;else j=l}t=j}do if((t|0)!=(h|0)){k=t+16|0;l=b[k+11>>0]|0;q=l<<24>>24<0;p=q?f[t+20>>2]|0:l&255;l=p>>>0>>0?p:o;if((l|0)!=0?(u=Pk(n?f[g>>2]|0:g,q?f[k>>2]|0:k,l)|0,(u|0)!=0):0){if((u|0)<0)break}else r=31;if((r|0)==31?o>>>0

>>0:0)break;s=hg(a,d,g)|0;return s|0}while(0);if(m){f[d>>2]=c;s=i+4|0;return s|0}else{f[d>>2]=t;s=t;return s|0}}while(0);t=f[i>>2]|0;do if((f[a>>2]|0)==(i|0))v=c;else{if(!t){h=i;while(1){e=f[h+8>>2]|0;if((f[e>>2]|0)==(h|0))h=e;else{w=e;break}}}else{h=t;while(1){m=f[h+4>>2]|0;if(!m){w=h;break}else h=m}}h=w;m=w+16|0;e=b[g+11>>0]|0;o=e<<24>>24<0;n=o?f[g+4>>2]|0:e&255;e=b[m+11>>0]|0;j=e<<24>>24<0;p=j?f[w+20>>2]|0:e&255;e=n>>>0

>>0?n:p;if((e|0)!=0?(u=Pk(j?f[m>>2]|0:m,o?f[g>>2]|0:g,e)|0,(u|0)!=0):0){if((u|0)<0){v=h;break}}else r=13;if((r|0)==13?p>>>0>>0:0){v=h;break}s=hg(a,d,g)|0;return s|0}while(0);if(!t){f[d>>2]=i;s=i;return s|0}else{f[d>>2]=v;s=v+4|0;return s|0}return 0}function Ad(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=u;u=u+16|0;h=g;f[c+48>>2]=d;f[c+44>>2]=e;e=f[c+8>>2]|0;i=c+12|0;j=f[i>>2]|0;if((j|0)!=(e|0)){k=j;do{j=k+-4|0;f[i>>2]=j;l=f[j>>2]|0;f[j>>2]=0;if(l|0)Va[f[(f[l>>2]|0)+4>>2]&127](l);k=f[i>>2]|0}while((k|0)!=(e|0))}e=f[c+20>>2]|0;k=c+24|0;i=f[k>>2]|0;if((i|0)!=(e|0))f[k>>2]=i+(~((i+-4-e|0)>>>2)<<2);e=f[c+32>>2]|0;i=c+36|0;k=f[i>>2]|0;if((k|0)!=(e|0))f[i>>2]=k+(~((k+-4-e|0)>>>2)<<2);if(!(f[c+4>>2]|0)){e=dn(32)|0;f[h>>2]=e;f[h+8>>2]=-2147483616;f[h+4>>2]=23;m=e;n=14670;o=m+23|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[e+23>>0]=0;f[a>>2]=-1;dj(a+4|0,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}Jd(a,c);if(f[a>>2]|0){u=g;return}e=a+4|0;k=e+11|0;if((b[k>>0]|0)<0)br(f[e>>2]|0);Ji(a,c);if(f[a>>2]|0){u=g;return}if((b[k>>0]|0)<0)br(f[e>>2]|0);if(!(Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0)){i=dn(32)|0;f[h>>2]=i;f[h+8>>2]=-2147483616;f[h+4>>2]=29;m=i;n=14694;o=m+29|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[i+29>>0]=0;f[a>>2]=-1;dj(e,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}if(!(Qa[f[(f[c>>2]|0)+20>>2]&127](c)|0)){i=dn(32)|0;f[h>>2]=i;f[h+8>>2]=-2147483616;f[h+4>>2]=31;m=i;n=14724;o=m+31|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[i+31>>0]=0;f[a>>2]=-1;dj(e,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}Wa[f[(f[c>>2]|0)+24>>2]&15](a,c);if(f[a>>2]|0){u=g;return}if((b[k>>0]|0)<0)br(f[e>>2]|0);if(!(Qa[f[(f[c>>2]|0)+28>>2]&127](c)|0)){k=dn(48)|0;f[h>>2]=k;f[h+8>>2]=-2147483600;f[h+4>>2]=34;m=k;n=14756;o=m+34|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[k+34>>0]=0;f[a>>2]=-1;dj(e,h);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);u=g;return}e=dn(32)|0;f[h>>2]=e;f[h+8>>2]=-2147483616;f[h+4>>2]=30;m=e;n=14791;o=m+30|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[e+30>>0]=0;e=Oj(d,h,0)|0;if((b[h+11>>0]|0)<0)br(f[h>>2]|0);if(e)Va[f[(f[c>>2]|0)+48>>2]&127](c);f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=g;return}function Bd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a;h=b;i=h;j=c;k=d;l=k;if(!i){m=(e|0)!=0;if(!l){if(m){f[e>>2]=(g>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (I=n,o)|0}else{if(!m){n=0;o=0;return (I=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=b&0;n=0;o=0;return (I=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(_(l|0)|0)-(_(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<>>(q>>>0)&s;w=0;x=g<>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (I=n,o)|0}r=j-1|0;if(r&j|0){s=(_(j|0)|0)+33-(_(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<>>(z>>>0))&y|g<>31;break}if(e|0){f[e>>2]=r&g;f[e+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (I=n,o)|0}else{r=im(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (I=n,o)|0}}else{if(m){if(e|0){f[e>>2]=(i>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (I=n,o)|0}if(!g){if(e|0){f[e>>2]=0;f[e+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (I=n,o)|0}r=l-1|0;if(!(r&l)){if(e|0){f[e>>2]=a|0;f[e+4>>2]=r&i|b&0}n=0;o=i>>>((im(l|0)|0)>>>0);return (I=n,o)|0}r=(_(l|0)|0)-(_(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (I=n,o)|0}while(0);if(!t){B=x;C=w;D=v;E=u;F=0;G=0}else{b=c|0|0;c=k|d&0;d=Tn(b|0,c|0,-1,-1)|0;k=I;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;Vn(d|0,k|0,g|0,a|0)|0;i=I;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=Vn(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&c|0)|0;w=I;u=u-1|0}while((u|0)!=0);B=h;C=x;D=w;E=v;F=0;G=t}t=C;C=0;if(e|0){f[e>>2]=E;f[e+4>>2]=D}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|F;o=(t<<1|0>>>31)&-2|G;return (I=n,o)|0}function Cd(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=u;u=u+32|0;d=c+4|0;e=c;g=c+16|0;h=a+48|0;i=f[h>>2]|0;j=dn(32)|0;f[d>>2]=j;f[d+8>>2]=-2147483616;f[d+4>>2]=20;k=j;l=13101;m=k+20|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[j+20>>0]=0;j=vk(i+24|0,d)|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);i=f[h>>2]|0;n=dn(32)|0;f[d>>2]=n;f[d+8>>2]=-2147483616;f[d+4>>2]=22;k=n;l=13122;m=k+22|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[n+22>>0]=0;n=vk(i+24|0,d)|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);i=a+64|0;o=f[i>>2]|0;f[i>>2]=0;if(o|0)Va[f[(f[o>>2]|0)+4>>2]&127](o);o=f[a+56>>2]|0;p=(((f[o+100>>2]|0)-(f[o+96>>2]|0)|0)/12|0)>>>0<1e3;o=f[h>>2]|0;q=dn(32)|0;f[d>>2]=q;f[d+8>>2]=-2147483616;f[d+4>>2]=18;k=q;l=13145;m=k+18|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[q+18>>0]=0;q=yk(o,d,-1)|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);switch(q|0){case -1:{if(j?p|((Yh(f[h>>2]|0)|0)>4|n^1):0)r=13;else r=17;break}case 0:{if(j)r=13;else r=21;break}case 2:{r=17;break}default:r=21}if((r|0)==13){j=f[a+44>>2]|0;b[g>>0]=0;n=j+16|0;h=f[n+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[n>>2]|0)>>>0>0)){f[e>>2]=f[j+4>>2];f[d>>2]=f[e>>2];ye(j,d,g,g+1|0)|0}j=dn(296)|0;Ni(j);n=f[i>>2]|0;f[i>>2]=j;if(!n)s=j;else{Va[f[(f[n>>2]|0)+4>>2]&127](n);r=21}}else if((r|0)==17){n=f[a+44>>2]|0;b[g>>0]=2;j=n+16|0;h=f[j+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[j>>2]|0)>>>0>0)){f[e>>2]=f[n+4>>2];f[d>>2]=f[e>>2];ye(n,d,g,g+1|0)|0}g=dn(360)|0;ji(g);d=f[i>>2]|0;f[i>>2]=g;if(!d)s=g;else{Va[f[(f[d>>2]|0)+4>>2]&127](d);r=21}}if((r|0)==21){r=f[i>>2]|0;if(!r){t=0;u=c;return t|0}else s=r}t=Ra[f[(f[s>>2]|0)+8>>2]&127](s,a)|0;u=c;return t|0}function Dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=b+12|0;g=f[e>>2]|0;h=c+4|0;i=(f[h>>2]|0)-g|0;j=c;f[j>>2]=(f[c>>2]|0)-g;f[j+4>>2]=i;i=(f[d>>2]|0)-g|0;j=d+4|0;k=(f[j>>2]|0)-g|0;g=d;f[g>>2]=i;f[g+4>>2]=k;g=f[e>>2]|0;if((((k|0)>-1?k:0-k|0)+((i|0)>-1?i:0-i|0)|0)>(g|0)){l=f[c>>2]|0;m=f[h>>2]|0;if((l|0)>-1)if((m|0)<=-1)if((l|0)<1){n=-1;o=-1}else p=6;else{n=1;o=1}else if((m|0)<1){n=-1;o=-1}else p=6;if((p|0)==6){n=(l|0)>0?1:-1;o=(m|0)>0?1:-1}q=X(g,n)|0;r=X(g,o)|0;g=(l<<1)-q|0;f[c>>2]=g;l=(m<<1)-r|0;f[h>>2]=l;if((X(n,o)|0)>-1){o=0-l|0;f[c>>2]=o;s=0-g|0;t=o}else{f[c>>2]=l;s=g;t=l}f[c>>2]=(t+q|0)/2|0;f[h>>2]=(s+r|0)/2|0;r=f[d>>2]|0;s=f[j>>2]|0;if((r|0)>-1)if((s|0)<=-1)if((r|0)<1){u=-1;v=-1}else p=14;else{u=1;v=1}else if((s|0)<1){u=-1;v=-1}else p=14;if((p|0)==14){u=(r|0)>0?1:-1;v=(s|0)>0?1:-1}q=f[e>>2]|0;e=X(q,u)|0;t=X(q,v)|0;q=(r<<1)-e|0;f[d>>2]=q;r=(s<<1)-t|0;f[j>>2]=r;if((X(u,v)|0)>-1){v=0-r|0;f[d>>2]=v;w=0-q|0;x=v}else{f[d>>2]=r;w=q;x=r}r=(x+e|0)/2|0;f[d>>2]=r;e=(w+t|0)/2|0;f[j>>2]=e;y=r;z=e}else{y=i;z=k}if(!y)if(!z){A=y;B=z}else p=22;else if((y|0)<0&(z|0)<1){A=y;B=z}else p=22;if((p|0)==22){if(!y)C=(z|0)==0?0:(z|0)>0?3:1;else C=(y|0)>0?(z>>31)+2|0:(z|0)<1?0:3;z=f[c>>2]|0;y=f[h>>2]|0;switch(C|0){case 1:{C=c;f[C>>2]=y;f[C+4>>2]=0-z;D=f[j>>2]|0;E=0-(f[d>>2]|0)|0;break}case 2:{C=c;f[C>>2]=0-z;f[C+4>>2]=0-y;D=0-(f[d>>2]|0)|0;E=0-(f[j>>2]|0)|0;break}case 3:{C=c;f[C>>2]=0-y;f[C+4>>2]=z;D=0-(f[j>>2]|0)|0;E=f[d>>2]|0;break}default:{C=c;f[C>>2]=z;f[C+4>>2]=y;D=f[d>>2]|0;E=f[j>>2]|0}}j=d;f[j>>2]=D;f[j+4>>2]=E;A=D;B=E}E=(f[c>>2]|0)-A|0;f[a>>2]=E;A=(f[h>>2]|0)-B|0;B=a+4|0;f[B>>2]=A;if((E|0)<0)F=(f[b+4>>2]|0)+E|0;else F=E;f[a>>2]=F;if((A|0)>=0){G=A;f[B>>2]=G;return}G=(f[b+4>>2]|0)+A|0;f[B>>2]=G;return}function Ed(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){b:do if(i){g=l;c=m;j=n;while(1){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0))break;p=(f[a>>2]|0)+(o<<2)|0;if(!(f[p>>2]|0)){q=e;r=j;s=o;t=p;break b}p=e+8|0;u=e;while(1){v=f[u>>2]|0;if(!v)break;if((d[p>>1]|0)==(d[v+8>>1]|0))u=v;else break}f[j>>2]=v;f[u>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;p=f[g>>2]|0;if(!p){w=37;break a}else e=p}c=f[e>>2]|0;if(!c){w=37;break a}else{g=e;j=e}}}else{j=l;g=m;c=n;while(1){p=g;while(1){x=f[p+4>>2]|0;if(x>>>0>>0)y=x;else y=(x>>>0)%(b>>>0)|0;if((y|0)==(k|0))break;x=(f[a>>2]|0)+(y<<2)|0;if(!(f[x>>2]|0)){q=p;r=c;s=y;t=x;break b}x=p+8|0;z=p;while(1){A=f[z>>2]|0;if(!A)break;if((d[x>>1]|0)==(d[A+8>>1]|0))z=A;else break}f[c>>2]=A;f[z>>2]=f[f[(f[a>>2]|0)+(y<<2)>>2]>>2];f[f[(f[a>>2]|0)+(y<<2)>>2]>>2]=p;x=f[j>>2]|0;if(!x){w=37;break a}else p=x}g=f[p>>2]|0;if(!g){w=37;break a}else{j=p;c=p}}}while(0);f[t>>2]=r;m=f[q>>2]|0;if(!m){w=37;break}else{k=s;l=q;n=q}}if((w|0)==37)return}function Fd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){b:do if(i){g=l;d=m;j=n;while(1){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0))break;p=(f[a>>2]|0)+(o<<2)|0;if(!(f[p>>2]|0)){q=e;r=j;s=o;t=p;break b}p=e+8|0;u=e;while(1){v=f[u>>2]|0;if(!v)break;if((b[p>>0]|0)==(b[v+8>>0]|0))u=v;else break}f[j>>2]=v;f[u>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;p=f[g>>2]|0;if(!p){w=37;break a}else e=p}d=f[e>>2]|0;if(!d){w=37;break a}else{g=e;j=e}}}else{j=l;g=m;d=n;while(1){p=g;while(1){x=f[p+4>>2]|0;if(x>>>0>>0)y=x;else y=(x>>>0)%(c>>>0)|0;if((y|0)==(k|0))break;x=(f[a>>2]|0)+(y<<2)|0;if(!(f[x>>2]|0)){q=p;r=d;s=y;t=x;break b}x=p+8|0;z=p;while(1){A=f[z>>2]|0;if(!A)break;if((b[x>>0]|0)==(b[A+8>>0]|0))z=A;else break}f[d>>2]=A;f[z>>2]=f[f[(f[a>>2]|0)+(y<<2)>>2]>>2];f[f[(f[a>>2]|0)+(y<<2)>>2]>>2]=p;x=f[j>>2]|0;if(!x){w=37;break a}else p=x}g=f[p>>2]|0;if(!g){w=37;break a}else{j=p;d=p}}}while(0);f[t>>2]=r;m=f[q>>2]|0;if(!m){w=37;break}else{k=s;l=q;n=q}}if((w|0)==37)return}function Gd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=f[c>>2]|0;c=f[b>>2]|0;h=g-c|0;i=a+8|0;j=f[i>>2]|0;if(h>>>0<64){if(j>>>0<=1){k=0;return k|0}l=f[e>>2]|0;m=0;n=1;while(1){o=(f[l+(m<<2)>>2]|0)>>>0>(f[l+(n<<2)>>2]|0)>>>0?n:m;n=n+1|0;if(n>>>0>=j>>>0){k=o;break}else m=o}return k|0}if(j){j=f[a+1128>>2]|0;m=f[e>>2]|0;e=f[a+1140>>2]|0;n=f[d>>2]|0;d=b+4|0;l=b+8|0;if((g|0)==(c|0)){b=0;do{o=j+(b<<2)|0;f[o>>2]=0;p=(f[a>>2]|0)-(f[m+(b<<2)>>2]|0)|0;f[e+(b<<2)>>2]=p;if(p|0){p=f[o>>2]|0;q=h-p|0;f[o>>2]=q>>>0

>>0?p:q}b=b+1|0;q=f[i>>2]|0}while(b>>>0>>0);r=q}else{b=0;do{q=j+(b<<2)|0;f[q>>2]=0;p=(f[a>>2]|0)-(f[m+(b<<2)>>2]|0)|0;f[e+(b<<2)>>2]=p;if(p|0){o=(f[n+(b<<2)>>2]|0)+(1<>2]|0;s=f[(f[d>>2]|0)+24>>2]|0;t=c;u=f[q>>2]|0;do{v=s+((X(t,p)|0)<<2)+(b<<2)|0;u=u+((f[v>>2]|0)>>>0>>0&1)|0;f[q>>2]=u;t=t+1|0}while((t|0)!=(g|0));t=h-u|0;f[q>>2]=t>>>0>>0?u:t}b=b+1|0;t=f[i>>2]|0}while(b>>>0>>0);r=t}if(r){b=f[a+1140>>2]|0;i=a+1128|0;h=0;g=0;c=0;while(1){if(!(f[b+(g<<2)>>2]|0)){w=h;x=c}else{d=f[(f[i>>2]|0)+(g<<2)>>2]|0;l=h>>>0>>0;w=l?d:h;x=l?g:c}g=g+1|0;if(g>>>0>=r>>>0){y=x;break}else{h=w;c=x}}}else y=0}else y=0;x=a+1088|0;c=a+1104|0;w=f[c>>2]|0;h=32-w|0;if((h|0)<4){r=y&15;g=4-h|0;f[c>>2]=g;h=a+1100|0;i=f[h>>2]|r>>>g;f[h>>2]=i;g=a+1092|0;b=f[g>>2]|0;if((b|0)==(f[a+1096>>2]|0))Ci(x,h);else{f[b>>2]=i;f[g>>2]=b+4}f[h>>2]=r<<32-(f[c>>2]|0);k=y;return k|0}r=a+1100|0;h=f[r>>2]|y<<28>>>w;f[r>>2]=h;b=w+4|0;f[c>>2]=b;if((b|0)!=32){k=y;return k|0}b=a+1092|0;w=f[b>>2]|0;if((w|0)==(f[a+1096>>2]|0))Ci(x,r);else{f[w>>2]=h;f[b>>2]=w+4}f[r>>2]=0;f[c>>2]=0;k=y;return k|0}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)br(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}d=dn(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)br(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){b:do if(h){e=k;c=l;i=m;while(1){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0))break;o=(f[a>>2]|0)+(n<<2)|0;if(!(f[o>>2]|0)){p=d;q=i;r=n;s=o;break b}o=d+8|0;t=d;while(1){u=f[t>>2]|0;if(!u)break;if((f[o>>2]|0)==(f[u+8>>2]|0))t=u;else break}f[i>>2]=u;f[t>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;o=f[e>>2]|0;if(!o){v=37;break a}else d=o}c=f[d>>2]|0;if(!c){v=37;break a}else{e=d;i=d}}}else{i=k;e=l;c=m;while(1){o=e;while(1){w=f[o+4>>2]|0;if(w>>>0>>0)x=w;else x=(w>>>0)%(b>>>0)|0;if((x|0)==(j|0))break;w=(f[a>>2]|0)+(x<<2)|0;if(!(f[w>>2]|0)){p=o;q=c;r=x;s=w;break b}w=o+8|0;y=o;while(1){z=f[y>>2]|0;if(!z)break;if((f[w>>2]|0)==(f[z+8>>2]|0))y=z;else break}f[c>>2]=z;f[y>>2]=f[f[(f[a>>2]|0)+(x<<2)>>2]>>2];f[f[(f[a>>2]|0)+(x<<2)>>2]>>2]=o;w=f[i>>2]|0;if(!w){v=37;break a}else o=w}e=f[o>>2]|0;if(!e){v=37;break a}else{i=o;c=o}}}while(0);f[s>>2]=q;l=f[p>>2]|0;if(!l){v=37;break}else{j=r;k=p;m=p}}if((v|0)==37)return}function Id(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)br(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}e=dn(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)br(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;e=a+24|0;k=j;j=g;l=d;d=g;a:while(1){g=j;m=l;n=d;b:while(1){o=m;while(1){p=f[o+4>>2]|0;if(!i)if(p>>>0>>0)q=p;else q=(p>>>0)%(c>>>0)|0;else q=p&h;if((q|0)==(k|0))break;r=(f[a>>2]|0)+(q<<2)|0;if(!(f[r>>2]|0))break b;p=f[o>>2]|0;c:do if(!p)s=o;else{t=f[o+8>>2]|0;u=f[e>>2]|0;v=f[u+8>>2]|0;w=(f[u+12>>2]|0)-v|0;u=v;v=w>>>2;if((w|0)>0){x=o;y=p}else{w=p;while(1){z=f[w>>2]|0;if(!z){s=w;break c}else w=z}}while(1){w=f[y+8>>2]|0;z=0;do{A=f[u+(z<<2)>>2]|0;if(!(b[A+84>>0]|0)){B=f[A+68>>2]|0;C=f[B+(w<<2)>>2]|0;D=f[B+(t<<2)>>2]|0}else{C=w;D=t}z=z+1|0;if((D|0)!=(C|0)){s=x;break c}}while((z|0)<(v|0));z=f[y>>2]|0;if(!z){s=y;break}else{w=y;y=z;x=w}}}while(0);f[n>>2]=f[s>>2];f[s>>2]=f[f[(f[a>>2]|0)+(q<<2)>>2]>>2];f[f[(f[a>>2]|0)+(q<<2)>>2]>>2]=o;p=f[g>>2]|0;if(!p){E=38;break a}else o=p}m=f[o>>2]|0;if(!m){E=38;break a}else{g=o;n=o}}f[r>>2]=n;l=f[o>>2]|0;if(!l){E=38;break}else{k=q;j=o;d=o}}if((E|0)==38)return}function Jd(a,c){a=a|0;c=c|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+16|0;g=e+4|0;h=e;i=e+12|0;j=e+11|0;k=e+10|0;l=e+8|0;m=c+44|0;n=f[m>>2]|0;o=n+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];ye(n,g,14849,14854)|0}n=Qa[f[(f[c>>2]|0)+8>>2]&127](c)|0;b[i>>0]=n;b[j>>0]=2;b[k>>0]=(n&255|0)==0?3:2;n=f[m>>2]|0;o=n+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];ye(n,g,j,j+1|0)|0;j=f[m>>2]|0;o=j+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[j+4>>2];f[g>>2]=f[h>>2];ye(j,g,k,k+1|0)|0;k=f[m>>2]|0;o=k+16|0;p=f[o+4>>2]|0;if((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0){q=h;r=k}else{f[h>>2]=f[k+4>>2];f[g>>2]=f[h>>2];ye(k,g,i,i+1|0)|0;q=h;r=f[m>>2]|0}}else{s=h;t=j;v=6}}else{s=h;t=n;v=6}if((v|0)==6){q=h;r=t}t=Qa[f[(f[c>>2]|0)+12>>2]&127](c)|0;b[l>>0]=t;t=r+16|0;q=f[t+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[t>>2]|0)>>>0>0)){f[h>>2]=f[r+4>>2];f[g>>2]=f[h>>2];ye(r,g,l,l+1|0)|0}d[l>>1]=(f[(f[c+4>>2]|0)+4>>2]|0)==0?0:-32768;c=f[m>>2]|0;m=c+16|0;r=f[m+4>>2]|0;if((r|0)>0|(r|0)==0&(f[m>>2]|0)>>>0>0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}f[h>>2]=f[c+4>>2];f[g>>2]=f[h>>2];ye(c,g,l,l+2|0)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}function Kd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=Oa,x=0,y=Oa,z=Oa,A=Oa,B=Oa;e=u;u=u+16|0;g=e;h=a+4|0;if((f[h>>2]|0)!=-1){i=0;u=e;return i|0}f[h>>2]=d;d=b[c+24>>0]|0;h=d<<24>>24;j=a+20|0;n[j>>2]=$(0.0);f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;do if(d<<24>>24)if(d<<24>>24<0)mq(g);else{l=h<<2;m=dn(l)|0;f[g>>2]=m;o=m+(h<<2)|0;f[g+8>>2]=o;hj(m|0,0,l|0)|0;l=m+(h<<2)|0;f[k>>2]=l;p=m;q=l;r=o;break}else{p=0;q=0;r=0}while(0);k=a+8|0;g=f[k>>2]|0;o=a+12|0;if(!g)s=a+16|0;else{l=f[o>>2]|0;if((l|0)!=(g|0))f[o>>2]=l+(~((l+-4-g|0)>>>2)<<2);br(g);g=a+16|0;f[g>>2]=0;f[o>>2]=0;f[k>>2]=0;s=g}f[k>>2]=p;f[o>>2]=q;f[s>>2]=r;r=h>>>0>1073741823?-1:h<<2;s=_q(r)|0;q=_q(r)|0;r=c+48|0;o=f[r>>2]|0;g=c+40|0;a=f[g>>2]|0;l=f[c>>2]|0;Rg(q|0,(f[l>>2]|0)+o|0,a|0)|0;Rg(p|0,(f[l>>2]|0)+o|0,a|0)|0;a=r;r=f[a>>2]|0;o=f[a+4>>2]|0;a=g;g=f[a>>2]|0;l=f[a+4>>2]|0;a=f[c>>2]|0;Rg(s|0,(f[a>>2]|0)+r|0,g|0)|0;p=f[c+80>>2]|0;a:do if(p>>>0>1){if(d<<24>>24<=0){c=1;while(1){m=on(g|0,l|0,c|0,0)|0;t=Tn(m|0,I|0,r|0,o|0)|0;Rg(q|0,(f[a>>2]|0)+t|0,g|0)|0;c=c+1|0;if(c>>>0>=p>>>0)break a}}c=f[k>>2]|0;t=1;do{m=on(g|0,l|0,t|0,0)|0;v=Tn(m|0,I|0,r|0,o|0)|0;Rg(q|0,(f[a>>2]|0)+v|0,g|0)|0;v=0;do{m=c+(v<<2)|0;w=$(n[m>>2]);x=q+(v<<2)|0;y=$(n[x>>2]);if(w>y){n[m>>2]=y;z=$(n[x>>2])}else z=y;x=s+(v<<2)|0;if($(n[x>>2])>2]=z;v=v+1|0}while((v|0)!=(h|0));t=t+1|0}while(t>>>0

>>0)}while(0);if(d<<24>>24>0){d=f[k>>2]|0;k=0;z=$(n[j>>2]);while(1){y=$(n[s+(k<<2)>>2]);w=$(y-$(n[d+(k<<2)>>2]));if(w>z){n[j>>2]=w;A=w}else A=z;k=k+1|0;if((k|0)==(h|0)){B=A;break}else z=A}}else B=$(n[j>>2]);if(B==$(0.0))n[j>>2]=$(1.0);$q(q);$q(s);i=1;u=e;return i|0}function Ld(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a+8|0;Ah(g,b,d,e);h=d-e|0;if((h|0)>0){d=0-e|0;i=a+16|0;j=a+32|0;k=a+12|0;l=a+28|0;m=a+20|0;n=a+24|0;o=h;h=f[g>>2]|0;while(1){p=b+(o<<2)|0;q=c+(o<<2)|0;if((h|0)>0){r=0;s=p+(d<<2)|0;t=h;while(1){if((t|0)>0){u=0;do{v=f[s+(u<<2)>>2]|0;w=f[i>>2]|0;if((v|0)>(w|0)){x=f[j>>2]|0;f[x+(u<<2)>>2]=w;y=x}else{x=f[k>>2]|0;w=f[j>>2]|0;f[w+(u<<2)>>2]=(v|0)<(x|0)?x:v;y=w}u=u+1|0}while((u|0)<(f[g>>2]|0));z=y}else z=f[j>>2]|0;u=(f[p+(r<<2)>>2]|0)-(f[z+(r<<2)>>2]|0)|0;w=q+(r<<2)|0;f[w>>2]=u;if((u|0)>=(f[l>>2]|0)){if((u|0)>(f[n>>2]|0)){A=u-(f[m>>2]|0)|0;B=31}}else{A=(f[m>>2]|0)+u|0;B=31}if((B|0)==31){B=0;f[w>>2]=A}r=r+1|0;w=f[g>>2]|0;if((r|0)>=(w|0)){C=w;break}else{s=z;t=w}}}else C=h;o=o-e|0;if((o|0)<=0){D=C;break}else h=C}}else D=f[g>>2]|0;C=e>>>0>1073741823?-1:e<<2;e=_q(C)|0;hj(e|0,0,C|0)|0;if((D|0)<=0){$q(e);return 1}C=a+16|0;h=a+32|0;o=a+12|0;z=a+28|0;A=a+20|0;m=a+24|0;a=0;n=e;l=D;while(1){if((l|0)>0){D=0;do{j=f[n+(D<<2)>>2]|0;y=f[C>>2]|0;if((j|0)>(y|0)){k=f[h>>2]|0;f[k+(D<<2)>>2]=y;E=k}else{k=f[o>>2]|0;y=f[h>>2]|0;f[y+(D<<2)>>2]=(j|0)<(k|0)?k:j;E=y}D=D+1|0}while((D|0)<(f[g>>2]|0));F=E}else F=f[h>>2]|0;D=(f[b+(a<<2)>>2]|0)-(f[F+(a<<2)>>2]|0)|0;y=c+(a<<2)|0;f[y>>2]=D;if((D|0)>=(f[z>>2]|0)){if((D|0)>(f[m>>2]|0)){G=D-(f[A>>2]|0)|0;B=16}}else{G=(f[A>>2]|0)+D|0;B=16}if((B|0)==16){B=0;f[y>>2]=G}a=a+1|0;l=f[g>>2]|0;if((a|0)>=(l|0))break;else n=F}$q(e);return 1}function Md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;e=f[a>>2]|0;g=e;h=(f[b>>2]|0)-g|0;b=e+(h>>2<<2)|0;i=f[c>>2]|0;c=f[d>>2]|0;d=c-i|0;j=d>>2;k=i;l=c;if((d|0)<=0){m=b;return m|0}d=a+8|0;n=f[d>>2]|0;o=a+4|0;p=f[o>>2]|0;q=p;if((j|0)<=(n-q>>2|0)){r=b;s=q-r|0;t=s>>2;if((j|0)>(t|0)){u=k+(t<<2)|0;t=u;if((u|0)==(l|0))v=p;else{w=l+-4-t|0;x=u;u=p;while(1){f[u>>2]=f[x>>2];x=x+4|0;if((x|0)==(l|0))break;else u=u+4|0}u=p+((w>>>2)+1<<2)|0;f[o>>2]=u;v=u}if((s|0)>0){y=t;z=v}else{m=b;return m|0}}else{y=c;z=p}c=z-(b+(j<<2))>>2;v=b+(c<<2)|0;if(v>>>0

>>0){t=(p+(0-c<<2)+~r|0)>>>2;r=v;s=z;while(1){f[s>>2]=f[r>>2];r=r+4|0;if(r>>>0>=p>>>0)break;else s=s+4|0}f[o>>2]=z+(t+1<<2)}if(c|0){c=v;v=z;do{c=c+-4|0;v=v+-4|0;f[v>>2]=f[c>>2]}while((c|0)!=(b|0))}c=y;if((k|0)==(c|0)){m=b;return m|0}else{A=b;B=k}while(1){f[A>>2]=f[B>>2];B=B+4|0;if((B|0)==(c|0)){m=b;break}else A=A+4|0}return m|0}A=(q-g>>2)+j|0;if(A>>>0>1073741823)mq(a);j=n-g|0;g=j>>1;n=j>>2>>>0<536870911?(g>>>0>>0?A:g):1073741823;g=b;A=h>>2;do if(n)if(n>>>0>1073741823){j=ra(8)|0;Wo(j,14941);f[j>>2]=6944;va(j|0,1080,114)}else{j=dn(n<<2)|0;C=j;D=j;break}else{C=0;D=0}while(0);j=D+(A<<2)|0;A=D+(n<<2)|0;if((l|0)==(k|0))E=j;else{n=((l+-4-i|0)>>>2)+1|0;i=k;k=j;while(1){f[k>>2]=f[i>>2];i=i+4|0;if((i|0)==(l|0))break;else k=k+4|0}E=j+(n<<2)|0}if((h|0)>0)Rg(C|0,e|0,h|0)|0;h=q-g|0;if((h|0)>0){Rg(E|0,b|0,h|0)|0;F=E+(h>>>2<<2)|0}else F=E;f[a>>2]=D;f[o>>2]=F;f[d>>2]=A;if(!e){m=j;return m|0}br(e);m=j;return m|0}function Nd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0;switch(c|0){case 1:{c=dn(60)|0;f[c>>2]=1528;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1948;i=c;f[a>>2]=i;return}case 4:{c=dn(168)|0;Ei(c,d,e,g);i=c;f[a>>2]=i;return}case 5:{c=dn(104)|0;f[c>>2]=1528;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2004;f[c+60>>2]=0;f[c+64>>2]=0;f[c+76>>2]=0;f[c+80>>2]=0;f[c+84>>2]=0;h=c+88|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=dn(140)|0;f[c>>2]=1528;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];f[d+16>>2]=f[e+16>>2];f[d+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);e=c+44|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2060;f[c+64>>2]=0;f[c+68>>2]=0;e=c+72|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+60>>2]=2116;f[c+88>>2]=1;g=c+92|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;rn(c+108|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Od(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0;switch(c|0){case 1:{c=dn(60)|0;f[c>>2]=1528;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1640;i=c;f[a>>2]=i;return}case 4:{c=dn(168)|0;Hi(c,d,e,g);i=c;f[a>>2]=i;return}case 5:{c=dn(104)|0;f[c>>2]=1528;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1696;f[c+60>>2]=0;f[c+64>>2]=0;f[c+76>>2]=0;f[c+80>>2]=0;f[c+84>>2]=0;h=c+88|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=dn(140)|0;f[c>>2]=1528;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];f[d+16>>2]=f[e+16>>2];f[d+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);e=c+44|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=1752;f[c+64>>2]=0;f[c+68>>2]=0;e=c+72|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+60>>2]=1808;f[c+88>>2]=1;g=c+92|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;rn(c+108|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Pd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0;switch(c|0){case 1:{c=dn(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2628;i=c;f[a>>2]=i;return}case 4:{c=dn(152)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2684;h=c+96|0;b=c+40|0;j=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Sm(h);f[c+136>>2]=0;f[c+140>>2]=0;f[c+144>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=dn(84)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2740;f[c+40>>2]=0;f[c+44>>2]=0;f[c+56>>2]=0;f[c+60>>2]=0;f[c+64>>2]=0;h=c+68|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=dn(120)|0;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];e=c+24|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2796;f[c+44>>2]=0;f[c+48>>2]=0;e=c+52|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+40>>2]=2852;f[c+68>>2]=1;g=c+72|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;rn(c+88|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;switch(b-a>>2|0){case 2:{d=b+-4|0;e=f[d>>2]|0;g=f[a>>2]|0;h=f[c>>2]|0;i=f[h>>2]|0;j=(f[h+4>>2]|0)-i>>3;if(j>>>0<=e>>>0)mq(h);k=i;if(j>>>0<=g>>>0)mq(h);if((f[k+(e<<3)>>2]|0)>>>0>=(f[k+(g<<3)>>2]|0)>>>0){l=1;return l|0}f[a>>2]=e;f[d>>2]=g;l=1;return l|0}case 3:{Cg(a,a+4|0,b+-4|0,c)|0;l=1;return l|0}case 4:{Qg(a,a+4|0,a+8|0,b+-4|0,c)|0;l=1;return l|0}case 5:{Tf(a,a+4|0,a+8|0,a+12|0,b+-4|0,c)|0;l=1;return l|0}case 1:case 0:{l=1;return l|0}default:{g=a+8|0;Cg(a,a+4|0,g,c)|0;d=a+12|0;a:do if((d|0)!=(b|0)){e=f[c>>2]|0;k=f[e>>2]|0;h=(f[e+4>>2]|0)-k>>3;j=k;k=d;i=0;m=g;b:while(1){n=f[k>>2]|0;o=f[m>>2]|0;if(h>>>0<=n>>>0){p=14;break}if(h>>>0<=o>>>0){p=16;break}q=j+(n<<3)|0;if((f[q>>2]|0)>>>0<(f[j+(o<<3)>>2]|0)>>>0){r=m;s=k;t=o;while(1){f[s>>2]=t;if((r|0)==(a|0)){u=a;break}o=r+-4|0;t=f[o>>2]|0;if(h>>>0<=t>>>0){p=20;break b}if((f[q>>2]|0)>>>0>=(f[j+(t<<3)>>2]|0)>>>0){u=r;break}else{v=r;r=o;s=v}}f[u>>2]=n;s=i+1|0;if((s|0)==8){w=0;x=(k+4|0)==(b|0);break a}else y=s}else y=i;s=k+4|0;if((s|0)==(b|0)){w=1;x=0;break a}else{r=k;k=s;i=y;m=r}}if((p|0)==14)mq(e);else if((p|0)==16)mq(e);else if((p|0)==20)mq(e)}else{w=1;x=0}while(0);l=x|w;return l|0}}return 0}function Rd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0;switch(c|0){case 1:{c=dn(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2376;i=c;f[a>>2]=i;return}case 4:{c=dn(152)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2432;h=c+96|0;b=c+40|0;j=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Sm(h);f[c+136>>2]=0;f[c+140>>2]=0;f[c+144>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=dn(84)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2488;f[c+40>>2]=0;f[c+44>>2]=0;f[c+56>>2]=0;f[c+60>>2]=0;f[c+64>>2]=0;h=c+68|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=dn(120)|0;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];e=c+24|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2544;f[c+44>>2]=0;f[c+48>>2]=0;e=c+52|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+40>>2]=2600;f[c+68>>2]=1;g=c+72|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;rn(c+88|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Sd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=Oa,t=Oa,u=Oa,v=0,w=0,x=0,y=0,z=0;c=f[b>>2]|0;b=a+4|0;d=f[b>>2]|0;e=(d|0)==0;a:do if(!e){g=d+-1|0;h=(g&d|0)==0;if(!h)if(c>>>0>>0)i=c;else i=(c>>>0)%(d>>>0)|0;else i=g&c;j=f[(f[a>>2]|0)+(i<<2)>>2]|0;if(!j)k=i;else{if(h){h=j;while(1){l=f[h>>2]|0;if(!l){k=i;break a}m=f[l+4>>2]|0;if(!((m|0)==(c|0)|(m&g|0)==(i|0))){k=i;break a}if((f[l+8>>2]|0)==(c|0)){o=l;break}else h=l}p=o+12|0;return p|0}else q=j;while(1){h=f[q>>2]|0;if(!h){k=i;break a}g=f[h+4>>2]|0;if((g|0)!=(c|0)){if(g>>>0>>0)r=g;else r=(g>>>0)%(d>>>0)|0;if((r|0)!=(i|0)){k=i;break a}}if((f[h+8>>2]|0)==(c|0)){o=h;break}else q=h}p=o+12|0;return p|0}}else k=0;while(0);q=dn(16)|0;f[q+8>>2]=c;f[q+12>>2]=0;f[q+4>>2]=c;f[q>>2]=0;i=a+12|0;s=$(((f[i>>2]|0)+1|0)>>>0);t=$(d>>>0);u=$(n[a+16>>2]);do if(e|$(u*t)>>0<3|(d+-1&d|0)!=0)&1;j=~~$(W($(s/u)))>>>0;ti(a,r>>>0>>0?j:r);r=f[b>>2]|0;j=r+-1|0;if(!(j&r)){v=r;w=j&c;break}if(c>>>0>>0){v=r;w=c}else{v=r;w=(c>>>0)%(r>>>0)|0}}else{v=d;w=k}while(0);k=(f[a>>2]|0)+(w<<2)|0;w=f[k>>2]|0;if(!w){d=a+8|0;f[q>>2]=f[d>>2];f[d>>2]=q;f[k>>2]=d;d=f[q>>2]|0;if(d|0){k=f[d+4>>2]|0;d=v+-1|0;if(d&v)if(k>>>0>>0)x=k;else x=(k>>>0)%(v>>>0)|0;else x=k&d;y=(f[a>>2]|0)+(x<<2)|0;z=30}}else{f[q>>2]=f[w>>2];y=w;z=30}if((z|0)==30)f[y>>2]=q;f[i>>2]=(f[i>>2]|0)+1;o=q;p=o+12|0;return p|0}function Td(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;c=u;u=u+16|0;d=c+4|0;e=c;f[a+64>>2]=b;g=a+128|0;f[g>>2]=2;h=a+132|0;f[h>>2]=7;i=Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0;b=a+88|0;f[b>>2]=i;j=a+104|0;k=(f[i+28>>2]|0)-(f[i+24>>2]|0)>>2;i=a+108|0;l=f[i>>2]|0;m=f[j>>2]|0;n=l-m>>2;o=m;p=l;if(k>>>0<=n>>>0)if(k>>>0>>0?(q=o+(k<<2)|0,(q|0)!=(p|0)):0){o=p+(~((p+-4-q|0)>>>2)<<2)|0;f[i>>2]=o;r=o;s=m}else{r=l;s=m}else{oi(j,k-n|0);r=f[i>>2]|0;s=f[j>>2]|0}if((r|0)!=(s|0)){s=0;do{r=f[b>>2]|0;f[e>>2]=s;f[d>>2]=f[e>>2];n=Og(r,d)|0;r=f[j>>2]|0;f[r+(s<<2)>>2]=n;s=s+1|0}while(s>>>0<(f[i>>2]|0)-r>>2>>>0)}i=a+92|0;s=f[b>>2]|0;j=f[s>>2]|0;d=(f[s+4>>2]|0)-j>>2;e=a+96|0;r=f[e>>2]|0;n=f[i>>2]|0;k=r-n>>2;m=n;n=r;if(d>>>0<=k>>>0)if(d>>>0>>0?(r=m+(d<<2)|0,(r|0)!=(n|0)):0){f[e>>2]=n+(~((n+-4-r|0)>>>2)<<2);t=s;v=j}else{t=s;v=j}else{oi(i,d-k|0);k=f[b>>2]|0;t=k;v=f[k>>2]|0}k=f[t+4>>2]|0;if((k|0)!=(v|0)){v=f[i>>2]|0;i=f[t>>2]|0;t=k-i>>2;k=0;do{f[v+(k<<2)>>2]=f[i+(k<<2)>>2];k=k+1|0}while(k>>>0>>0)}t=(f[h>>2]|0)-(f[g>>2]|0)+1|0;g=a+136|0;h=a+140|0;a=f[h>>2]|0;k=f[g>>2]|0;i=(a-k|0)/12|0;v=a;if(t>>>0>i>>>0){vf(g,t-i|0);u=c;return 1}if(t>>>0>=i>>>0){u=c;return 1}i=k+(t*12|0)|0;if((i|0)==(v|0)){u=c;return 1}else w=v;while(1){v=w+-12|0;f[h>>2]=v;t=f[v>>2]|0;if(!t)x=v;else{v=w+-8|0;k=f[v>>2]|0;if((k|0)!=(t|0))f[v>>2]=k+(~((k+-4-t|0)>>>2)<<2);br(t);x=f[h>>2]|0}if((x|0)==(i|0))break;else w=x}u=c;return 1}function Ud(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Oc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Vd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Pc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Wd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Qc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Xd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Rc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Yd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Sc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}xf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function Zd(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Tc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=2097152;if(d){d=c;c=2097152;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<19)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}yf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function _d(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Uc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=1048576;if(d){d=c;c=1048576;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<18)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}zf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function $d(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Vc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=262144;if(d){d=c;c=262144;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<16)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Cf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ae(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Wc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=131072;if(d){d=c;c=131072;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<15)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Df(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function be(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Xc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=32768;if(d){d=c;c=32768;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<13)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Ef(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ce(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Yc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function de(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));Zc(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ee(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));_c(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function fe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));$c(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ge(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));ad(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function he(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));bd(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ie(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));cd(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function je(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)mq(h);else{l=dn(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;hj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Tn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;l=i;p=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(p|0));dd(i,n,o-n>>3,e)|0;n=i+16|0;o=Rn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Tn(o|0,I|0,39,0)|0;o=Wn(l|0,I|0,3)|0;l=Tn(o|0,I|0,8,0)|0;o=Tn(l|0,I|0,n|0,0)|0;vl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Lf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);br(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);br(e);u=g;return 1}function ke(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[b>>2]|0;g=b+4|0;h=f[g>>2]|0;i=((f[c>>2]|0)-e<<3)+(f[c+4>>2]|0)-h|0;c=e;if((i|0)<=0){j=d+4|0;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}if(!h){e=d+4|0;n=i;o=e;p=c;q=f[e>>2]|0}else{e=32-h|0;r=(i|0)<(e|0)?i:e;s=-1>>>(e-r|0)&-1<>2];c=d+4|0;h=f[c>>2]|0;e=32-h|0;t=e>>>0>>0?e:r;u=f[d>>2]|0;v=f[u>>2]&~(-1>>>(e-t|0)&-1<>2]=v;h=f[c>>2]|0;e=f[g>>2]|0;f[u>>2]=(h>>>0>e>>>0?s<>>(e-h|0))|v;v=(f[c>>2]|0)+t|0;h=u+(v>>>5<<2)|0;f[d>>2]=h;u=v&31;f[c>>2]=u;v=r-t|0;if((v|0)>0){e=f[h>>2]&~(-1>>>(32-v|0));f[h>>2]=e;f[h>>2]=e|s>>>((f[g>>2]|0)+t|0);f[c>>2]=v;w=v}else w=u;u=(f[b>>2]|0)+4|0;f[b>>2]=u;n=i-r|0;o=c;p=u;q=w}w=32-q|0;u=-1<31){q=~u;c=~n;r=n+((c|0)>-64?c:-64)+32&-32;c=n;i=p;while(1){v=f[i>>2]|0;t=f[d>>2]|0;g=f[t>>2]&q;f[t>>2]=g;f[t>>2]=g|v<>2];g=t+4|0;f[d>>2]=g;f[g>>2]=f[g>>2]&u|v>>>w;i=(f[b>>2]|0)+4|0;f[b>>2]=i;if((c|0)<=63)break;else c=c+-32|0}x=n+-32-r|0;y=i}else{x=n;y=p}if((x|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}p=f[y>>2]&-1>>>(32-x|0);y=(w|0)<(x|0)?w:x;n=f[d>>2]|0;i=f[n>>2]&~(-1<>2]&-1>>>(w-y|0));f[n>>2]=i;f[n>>2]=i|p<>2];i=(f[o>>2]|0)+y|0;w=n+(i>>>5<<2)|0;f[d>>2]=w;f[o>>2]=i&31;i=x-y|0;if((i|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}f[w>>2]=f[w>>2]&~(-1>>>(32-i|0))|p>>>y;f[o>>2]=i;j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}function le(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+9|0;i=d+8|0;j=f[(f[a+184>>2]|0)+(c<<2)>>2]&255;b[h>>0]=j;c=a+4|0;k=f[(f[c>>2]|0)+44>>2]|0;l=k+16|0;m=f[l+4>>2]|0;if((m|0)>0|(m|0)==0&(f[l>>2]|0)>>>0>0)n=j;else{f[g>>2]=f[k+4>>2];f[e>>2]=f[g>>2];ye(k,e,h,h+1|0)|0;n=b[h>>0]|0}a:do if(n<<24>>24>-1){k=a+172|0;j=f[(f[k>>2]|0)+((n<<24>>24)*136|0)>>2]|0;l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+56|0;m=b[h>>0]|0;o=f[k>>2]|0;k=f[o+(m*136|0)+132>>2]|0;switch(f[(f[(f[l>>2]|0)+84>>2]|0)+(j<<2)>>2]|0){case 0:{p=k;q=7;break a;break}case 1:{if(b[o+(m*136|0)+28>>0]|0){p=k;q=7;break a}break}default:{}}m=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=1;o=m+16|0;j=f[o+4>>2]|0;if(!((j|0)>0|(j|0)==0&(f[o>>2]|0)>>>0>0)){f[g>>2]=f[m+4>>2];f[e>>2]=f[g>>2];ye(m,e,i,i+1|0)|0}r=k}else{p=f[a+68>>2]|0;q=7}while(0);if((q|0)==7){q=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=0;a=q+16|0;h=f[a+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[a>>2]|0)>>>0>0)){f[g>>2]=f[q+4>>2];f[e>>2]=f[g>>2];ye(q,e,i,i+1|0)|0}r=p}p=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=r;r=p+16|0;c=f[r+4>>2]|0;if((c|0)>0|(c|0)==0&(f[r>>2]|0)>>>0>0){u=d;return 1}f[g>>2]=f[p+4>>2];f[e>>2]=f[g>>2];ye(p,e,i,i+1|0)|0;u=d;return 1}function me(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;k=a+60|0;f[a+64>>2]=g;g=a+8|0;Ah(g,b,d,e);d=a+56|0;l=f[d>>2]|0;m=f[l+4>>2]|0;n=f[l>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+68|0;q=a+16|0;r=a+32|0;s=a+12|0;t=a+28|0;v=a+20|0;w=a+24|0;if(m-n>>2>>>0>p>>>0){x=p;y=n}else{z=l;mq(z)}while(1){f[j>>2]=f[y+(x<<2)>>2];f[i>>2]=f[j>>2];tb(k,i,b,x)|0;l=X(x,e)|0;n=b+(l<<2)|0;p=c+(l<<2)|0;l=f[g>>2]|0;if((l|0)>0){m=0;a=o;A=l;while(1){if((A|0)>0){l=0;do{B=f[a+(l<<2)>>2]|0;C=f[q>>2]|0;if((B|0)>(C|0)){D=f[r>>2]|0;f[D+(l<<2)>>2]=C;E=D}else{D=f[s>>2]|0;C=f[r>>2]|0;f[C+(l<<2)>>2]=(B|0)<(D|0)?D:B;E=C}l=l+1|0}while((l|0)<(f[g>>2]|0));F=E}else F=f[r>>2]|0;l=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=l;if((l|0)>=(f[t>>2]|0)){if((l|0)>(f[w>>2]|0)){G=l-(f[v>>2]|0)|0;H=18}}else{G=(f[v>>2]|0)+l|0;H=18}if((H|0)==18){H=0;f[C>>2]=G}m=m+1|0;A=f[g>>2]|0;if((m|0)>=(A|0))break;else a=F}}x=x+-1|0;if((x|0)<=-1){H=3;break}a=f[d>>2]|0;y=f[a>>2]|0;if((f[a+4>>2]|0)-y>>2>>>0<=x>>>0){z=a;H=4;break}}if((H|0)==3){u=h;return 1}else if((H|0)==4)mq(z);return 0}function ne(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;k=a+60|0;f[a+64>>2]=g;g=a+8|0;Ah(g,b,d,e);d=a+56|0;l=f[d>>2]|0;m=f[l+4>>2]|0;n=f[l>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+68|0;q=a+16|0;r=a+32|0;s=a+12|0;t=a+28|0;v=a+20|0;w=a+24|0;if(m-n>>2>>>0>p>>>0){x=p;y=n}else{z=l;mq(z)}while(1){f[j>>2]=f[y+(x<<2)>>2];f[i>>2]=f[j>>2];sb(k,i,b,x)|0;l=X(x,e)|0;n=b+(l<<2)|0;p=c+(l<<2)|0;l=f[g>>2]|0;if((l|0)>0){m=0;a=o;A=l;while(1){if((A|0)>0){l=0;do{B=f[a+(l<<2)>>2]|0;C=f[q>>2]|0;if((B|0)>(C|0)){D=f[r>>2]|0;f[D+(l<<2)>>2]=C;E=D}else{D=f[s>>2]|0;C=f[r>>2]|0;f[C+(l<<2)>>2]=(B|0)<(D|0)?D:B;E=C}l=l+1|0}while((l|0)<(f[g>>2]|0));F=E}else F=f[r>>2]|0;l=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=l;if((l|0)>=(f[t>>2]|0)){if((l|0)>(f[w>>2]|0)){G=l-(f[v>>2]|0)|0;H=18}}else{G=(f[v>>2]|0)+l|0;H=18}if((H|0)==18){H=0;f[C>>2]=G}m=m+1|0;A=f[g>>2]|0;if((m|0)>=(A|0))break;else a=F}}x=x+-1|0;if((x|0)<=-1){H=3;break}a=f[d>>2]|0;y=f[a>>2]|0;if((f[a+4>>2]|0)-y>>2>>>0<=x>>>0){z=a;H=4;break}}if((H|0)==3){u=h;return 1}else if((H|0)==4)mq(z);return 0}function oe(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+12|0;g=f[e>>2]|0;h=(f[g+4>>2]|0)-(f[g>>2]|0)>>2;if(!h){u=b;return 1}i=a+152|0;j=a+140|0;k=a+144|0;l=a+148|0;a=0;m=g;while(1){f[d>>2]=(a>>>0)/3|0;f[c>>2]=f[d>>2];if(!(Rj(m,c)|0)?(g=f[e>>2]|0,(f[(f[g+12>>2]|0)+(a<<2)>>2]|0)==-1):0){n=a+1|0;o=((n>>>0)%3|0|0)==0?a+-2|0:n;if((o|0)==-1)p=-1;else p=f[(f[g>>2]|0)+(o<<2)>>2]|0;o=f[i>>2]|0;if((f[o+(p<<2)>>2]|0)==-1){g=f[k>>2]|0;n=f[l>>2]|0;if((g|0)==(n<<5|0)){if((g+1|0)<0){q=11;break}r=n<<6;n=g+32&-32;hi(j,g>>>0<1073741823?(r>>>0>>0?n:r):2147483647);s=f[k>>2]|0;t=f[i>>2]|0}else{s=g;t=o}f[k>>2]=s+1;o=(f[j>>2]|0)+(s>>>5<<2)|0;f[o>>2]=f[o>>2]&~(1<<(s&31));o=t+(p<<2)|0;if((f[o>>2]|0)==-1){r=a;n=o;while(1){f[n>>2]=g;o=r+1|0;a:do if((r|0)!=-1?(v=((o>>>0)%3|0|0)==0?r+-2|0:o,(v|0)!=-1):0){w=f[e>>2]|0;x=f[w+12>>2]|0;y=v;while(1){v=f[x+(y<<2)>>2]|0;if((v|0)==-1)break;z=v+1|0;A=((z>>>0)%3|0|0)==0?v+-2|0:z;if((A|0)==-1){B=-1;C=-1;break a}else y=A}x=y+1|0;A=((x>>>0)%3|0|0)==0?y+-2|0:x;if((A|0)==-1){B=y;C=-1}else{B=y;C=f[(f[w>>2]|0)+(A<<2)>>2]|0}}else{B=-1;C=-1}while(0);n=t+(C<<2)|0;if((f[n>>2]|0)!=-1)break;else r=B}}}}r=a+1|0;if(r>>>0>=h>>>0){q=3;break}a=r;m=f[e>>2]|0}if((q|0)==3){u=b;return 1}else if((q|0)==11)mq(j);return 0} function pe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=u;u=u+32|0;e=d+8|0;g=d;h=a+4|0;i=f[h>>2]|0;if(i>>>0>=b>>>0){f[h>>2]=b;u=d;return}j=a+8|0;k=f[j>>2]|0;l=k<<5;m=b-i|0;if(l>>>0>>0|i>>>0>(l-m|0)>>>0){f[e>>2]=0;n=e+4|0;f[n>>2]=0;o=e+8|0;f[o>>2]=0;if((b|0)<0)mq(a);p=k<<6;k=b+31&-32;hi(e,l>>>0<1073741823?(p>>>0>>0?k:p):2147483647);p=f[h>>2]|0;f[n>>2]=p+m;k=f[a>>2]|0;l=k;q=f[e>>2]|0;r=(l+(p>>>5<<2)-k<<3)+(p&31)|0;if((r|0)>0){p=r>>>5;Xl(q|0,k|0,p<<2|0)|0;k=r&31;r=q+(p<<2)|0;s=r;if(!k){t=0;v=s}else{w=-1>>>(32-k|0);f[r>>2]=f[r>>2]&~w|f[l+(p<<2)>>2]&w;t=k;v=s}}else{t=0;v=q}f[g>>2]=v;f[g+4>>2]=t;t=g;g=f[t>>2]|0;v=f[t+4>>2]|0;t=f[a>>2]|0;f[a>>2]=f[e>>2];f[e>>2]=t;e=f[h>>2]|0;f[h>>2]=f[n>>2];f[n>>2]=e;e=f[j>>2]|0;f[j>>2]=f[o>>2];f[o>>2]=e;if(t|0)br(t);x=g;y=v}else{v=(f[a>>2]|0)+(i>>>5<<2)|0;f[h>>2]=b;x=v;y=i&31}if(!m){u=d;return}i=(y|0)==0;v=x;if(c){if(i){z=m;A=x;B=v}else{c=32-y|0;b=c>>>0>m>>>0?m:c;f[v>>2]=f[v>>2]|-1>>>(c-b|0)&-1<>>5;hj(A|0,-1,c<<2|0)|0;A=z&31;z=B+(c<<2)|0;if(!A){u=d;return}f[z>>2]=f[z>>2]|-1>>>(32-A|0);u=d;return}else{if(i){C=m;D=x;E=v}else{x=32-y|0;i=x>>>0>m>>>0?m:x;f[v>>2]=f[v>>2]&~(-1>>>(x-i|0)&-1<>>5;hj(D|0,0,y<<2|0)|0;D=C&31;C=E+(y<<2)|0;if(!D){u=d;return}f[C>>2]=f[C>>2]&~(-1>>>(32-D|0));u=d;return}}function qe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;a=u;u=u+48|0;g=a+36|0;h=a+24|0;i=a+12|0;j=a;if(!c){k=0;u=a;return k|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;l=vj(d)|0;if(l>>>0>4294967279)mq(g);if(l>>>0<11){b[g+11>>0]=l;if(!l)m=g;else{n=g;o=7}}else{p=l+16&-16;q=dn(p)|0;f[g>>2]=q;f[g+8>>2]=p|-2147483648;f[g+4>>2]=l;n=q;o=7}if((o|0)==7){Rg(n|0,d|0,l|0)|0;m=n}b[m+l>>0]=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;l=vj(e)|0;if(l>>>0>4294967279)mq(h);if(l>>>0<11){b[h+11>>0]=l;if(!l)r=h;else{s=h;o=13}}else{m=l+16&-16;n=dn(m)|0;f[h>>2]=n;f[h+8>>2]=m|-2147483648;f[h+4>>2]=l;s=n;o=13}if((o|0)==13){Rg(s|0,e|0,l|0)|0;r=s}b[r+l>>0]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;l=vj(d)|0;if(l>>>0>4294967279)mq(i);if(l>>>0<11){b[i+11>>0]=l;if(!l)t=i;else{v=i;o=19}}else{r=l+16&-16;s=dn(r)|0;f[i>>2]=s;f[i+8>>2]=r|-2147483648;f[i+4>>2]=l;v=s;o=19}if((o|0)==19){Rg(v|0,d|0,l|0)|0;t=v}b[t+l>>0]=0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;l=vj(e)|0;if(l>>>0>4294967279)mq(j);if(l>>>0<11){b[j+11>>0]=l;if(!l)w=j;else{x=j;o=25}}else{t=l+16&-16;v=dn(t)|0;f[j>>2]=v;f[j+8>>2]=t|-2147483648;f[j+4>>2]=l;x=v;o=25}if((o|0)==25){Rg(x|0,e|0,l|0)|0;w=x}b[w+l>>0]=0;en(c,i,j);if((b[j+11>>0]|0)<0)br(f[j>>2]|0);if((b[i+11>>0]|0)<0)br(f[i>>2]|0);if((b[h+11>>0]|0)<0)br(f[h>>2]|0);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);k=1;u=a;return k|0}function re(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;f[a>>2]=f[c>>2];d=c+4|0;f[a+4>>2]=f[d>>2];e=c+8|0;f[a+8>>2]=f[e>>2];g=c+12|0;f[a+12>>2]=f[g>>2];f[d>>2]=0;f[e>>2]=0;f[g>>2]=0;g=c+16|0;f[a+16>>2]=f[g>>2];e=c+20|0;f[a+20>>2]=f[e>>2];d=c+24|0;f[a+24>>2]=f[d>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;b[a+28>>0]=b[c+28>>0]|0;d=a+32|0;e=c+32|0;f[d>>2]=0;g=a+36|0;f[g>>2]=0;f[a+40>>2]=0;f[d>>2]=f[e>>2];d=c+36|0;f[g>>2]=f[d>>2];g=c+40|0;f[a+40>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;e=a+44|0;d=c+44|0;f[e>>2]=0;g=a+48|0;f[g>>2]=0;f[a+52>>2]=0;f[e>>2]=f[d>>2];e=c+48|0;f[g>>2]=f[e>>2];g=c+52|0;f[a+52>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+56|0;e=c+56|0;f[d>>2]=0;g=a+60|0;f[g>>2]=0;f[a+64>>2]=0;f[d>>2]=f[e>>2];d=c+60|0;f[g>>2]=f[d>>2];g=c+64|0;f[a+64>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+68>>2]=f[c+68>>2];f[a+72>>2]=f[c+72>>2];e=a+76|0;d=c+76|0;f[e>>2]=0;g=a+80|0;f[g>>2]=0;f[a+84>>2]=0;f[e>>2]=f[d>>2];e=c+80|0;f[g>>2]=f[e>>2];g=c+84|0;f[a+84>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+88|0;e=c+88|0;f[d>>2]=0;g=a+92|0;f[g>>2]=0;f[a+96>>2]=0;f[d>>2]=f[e>>2];d=c+92|0;f[g>>2]=f[d>>2];g=c+96|0;f[a+96>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;b[a+100>>0]=b[c+100>>0]|0;e=a+104|0;d=c+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;f[a+112>>2]=0;f[e>>2]=f[d>>2];e=c+108|0;f[g>>2]=f[e>>2];g=c+112|0;f[a+112>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+116|0;e=c+116|0;f[d>>2]=0;g=a+120|0;f[g>>2]=0;f[a+124>>2]=0;f[d>>2]=f[e>>2];d=c+120|0;f[g>>2]=f[d>>2];g=c+124|0;f[a+124>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+128>>2]=f[c+128>>2];f[a+132>>2]=f[c+132>>2];return}function se(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;h=u;u=u+48|0;i=h+36|0;j=h+24|0;k=h+8|0;l=h+4|0;m=h;n=e+4|0;Bh(i,c,(f[n>>2]|0)-(f[e>>2]|0)>>2,2,g,d,1);g=f[i>>2]|0;o=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;f[k>>2]=-1;f[k+4>>2]=-1;f[k+8>>2]=-1;f[k+12>>2]=-1;p=f[c+4>>2]|0;if((p+-2|0)>>>0<=28){f[k>>2]=p;c=1<>2]=c+-1;p=c+-2|0;f[k+8>>2]=p;f[k+12>>2]=(p|0)/2|0;p=f[e>>2]|0;if((f[n>>2]|0)==(p|0))q=g;else{c=d+84|0;r=d+68|0;s=d+48|0;t=d+40|0;v=0;w=0;x=p;while(1){p=f[x+(v<<2)>>2]|0;if(!(b[c>>0]|0))y=f[(f[r>>2]|0)+(p<<2)>>2]|0;else y=p;p=s;z=f[p>>2]|0;A=f[p+4>>2]|0;p=t;B=f[p>>2]|0;C=on(B|0,f[p+4>>2]|0,y|0,0)|0;p=Tn(C|0,I|0,z|0,A|0)|0;Rg(j|0,(f[f[d>>2]>>2]|0)+p|0,B|0)|0;df(k,j,l,m);f[o+(w<<2)>>2]=f[l>>2];f[o+((w|1)<<2)>>2]=f[m>>2];v=v+1|0;x=f[e>>2]|0;if(v>>>0>=(f[n>>2]|0)-x>>2>>>0)break;else w=w+2|0}q=f[i>>2]|0}f[a>>2]=q;f[i>>2]=0;u=h;return}f[a>>2]=0;f[i>>2]=0;if(!g){u=h;return}i=g+88|0;a=f[i>>2]|0;f[i>>2]=0;if(a|0){i=f[a+8>>2]|0;if(i|0){q=a+12|0;if((f[q>>2]|0)!=(i|0))f[q>>2]=i;br(i)}br(a)}a=f[g+68>>2]|0;if(a|0){i=g+72|0;q=f[i>>2]|0;if((q|0)!=(a|0))f[i>>2]=q+(~((q+-4-a|0)>>>2)<<2);br(a)}a=g+64|0;q=f[a>>2]|0;f[a>>2]=0;if(q|0){a=f[q>>2]|0;if(a|0){i=q+4|0;if((f[i>>2]|0)!=(a|0))f[i>>2]=a;br(a)}br(q)}br(g);u=h;return}function te(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/136|0)>>>0>=c>>>0){i=c;j=h;do{f[j>>2]=-1;Ek(j+4|0);b[j+100>>0]=1;k=j+104|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[k+24>>2]=0;j=(f[g>>2]|0)+136|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/136|0;h=j+c|0;if(h>>>0>31580641)mq(a);k=(e-i|0)/136|0;i=k<<1;e=k>>>0<15790320?(i>>>0>>0?h:i):31580641;do if(e)if(e>>>0>31580641){i=ra(8)|0;Wo(i,14941);f[i>>2]=6944;va(i|0,1080,114)}else{l=dn(e*136|0)|0;break}else l=0;while(0);i=l+(j*136|0)|0;j=i;h=l+(e*136|0)|0;e=c;c=j;l=i;do{f[l>>2]=-1;Ek(l+4|0);b[l+100>>0]=1;k=l+104|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[k+24>>2]=0;l=c+136|0;c=l;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;l=f[g>>2]|0;if((l|0)==(e|0)){m=j;n=e;o=e}else{k=l;l=j;j=i;do{k=k+-136|0;re(j+-136|0,k);j=l+-136|0;l=j}while((k|0)!=(e|0));m=l;n=f[a>>2]|0;o=f[g>>2]|0}f[a>>2]=m;f[g>>2]=c;f[d>>2]=h;h=n;if((o|0)!=(h|0)){d=o;do{o=f[d+-20>>2]|0;if(o|0){c=d+-16|0;g=f[c>>2]|0;if((g|0)!=(o|0))f[c>>2]=g+(~((g+-4-o|0)>>>2)<<2);br(o)}o=f[d+-32>>2]|0;if(o|0){g=d+-28|0;c=f[g>>2]|0;if((c|0)!=(o|0))f[g>>2]=c+(~((c+-4-o|0)>>>2)<<2);br(o)}yi(d+-132|0);d=d+-136|0}while((d|0)!=(h|0))}if(!n)return;br(n);return}function ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=f[b>>2]|0;b=a+12|0;d=(c|0)==-1;e=c+1|0;do if(!d){g=((e>>>0)%3|0|0)==0?c+-2|0:e;if(!((c>>>0)%3|0)){h=g;i=c+2|0;break}else{h=g;i=c+-1|0;break}}else{h=-1;i=-1}while(0);e=d?-1:(c>>>0)/3|0;g=a+28|0;j=(f[g>>2]|0)+(e>>>5<<2)|0;f[j>>2]=1<<(e&31)|f[j>>2];j=a+172|0;e=a+176|0;k=a+280|0;if(((!d?(d=f[(f[(f[b>>2]|0)+12>>2]|0)+(c<<2)>>2]|0,(d|0)!=-1):0)?(a=(d>>>0)/3|0,(f[(f[g>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0):0)?(a=f[j>>2]|0,(f[e>>2]|0)!=(a|0)):0){d=c>>>5;l=1<<(c&31);c=0;m=a;do{a=(f[k>>2]|0)+(c<<5)|0;if(!(l&f[(f[m+(c*136|0)+4>>2]|0)+(d<<2)>>2]))Vi(a,0);else Vi(a,1);c=c+1|0;m=f[j>>2]|0}while(c>>>0<(((f[e>>2]|0)-m|0)/136|0)>>>0)}if((((h|0)!=-1?(m=f[(f[(f[b>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,(m|0)!=-1):0)?(c=(m>>>0)/3|0,(f[(f[g>>2]|0)+(c>>>5<<2)>>2]&1<<(c&31)|0)==0):0)?(c=f[j>>2]|0,(f[e>>2]|0)!=(c|0)):0){m=h>>>5;d=1<<(h&31);h=0;l=c;do{c=(f[k>>2]|0)+(h<<5)|0;if(!(d&f[(f[l+(h*136|0)+4>>2]|0)+(m<<2)>>2]))Vi(c,0);else Vi(c,1);h=h+1|0;l=f[j>>2]|0}while(h>>>0<(((f[e>>2]|0)-l|0)/136|0)>>>0)}if((i|0)==-1)return 1;l=f[(f[(f[b>>2]|0)+12>>2]|0)+(i<<2)>>2]|0;if((l|0)==-1)return 1;b=(l>>>0)/3|0;if(f[(f[g>>2]|0)+(b>>>5<<2)>>2]&1<<(b&31)|0)return 1;b=f[j>>2]|0;if((f[e>>2]|0)==(b|0))return 1;g=i>>>5;l=1<<(i&31);i=0;h=b;do{b=(f[k>>2]|0)+(i<<5)|0;if(!(l&f[(f[h+(i*136|0)+4>>2]|0)+(g<<2)>>2]))Vi(b,0);else Vi(b,1);i=i+1|0;h=f[j>>2]|0}while(i>>>0<(((f[e>>2]|0)-h|0)/136|0)>>>0);return 1}function ve(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+4|0;j=a+8|0;Nh((f[j>>2]|0)-(f[i>>2]|0)>>2,c)|0;k=f[i>>2]|0;if((f[j>>2]|0)==(k|0)){u=d;return 1}l=a+32|0;a=c+16|0;m=c+4|0;n=h+1|0;o=h+1|0;p=h+1|0;q=h+1|0;r=0;s=k;do{k=f[(f[(f[l>>2]|0)+8>>2]|0)+(f[s+(r<<2)>>2]<<2)>>2]|0;b[h>>0]=f[k+56>>2];t=a;v=f[t>>2]|0;w=f[t+4>>2]|0;if((w|0)>0|(w|0)==0&v>>>0>0){x=w;y=v}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,q)|0;v=a;x=f[v+4>>2]|0;y=f[v>>2]|0}b[h>>0]=f[k+28>>2];if((x|0)>0|(x|0)==0&y>>>0>0){z=x;A=y}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,p)|0;v=a;z=f[v+4>>2]|0;A=f[v>>2]|0}b[h>>0]=b[k+24>>0]|0;if((z|0)>0|(z|0)==0&A>>>0>0){B=z;C=A}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,o)|0;v=a;B=f[v+4>>2]|0;C=f[v>>2]|0}b[h>>0]=b[k+32>>0]|0;if(!((B|0)>0|(B|0)==0&C>>>0>0)){f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,n)|0}Nh(f[k+60>>2]|0,c)|0;r=r+1|0;s=f[i>>2]|0}while(r>>>0<(f[j>>2]|0)-s>>2>>>0);u=d;return 1}function we(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;d=u;u=u+32|0;e=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;wp(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;k=a+24|0;wp(k);l=b+4|0;if((a|0)!=(l|0)){f[h>>2]=f[l>>2];f[i>>2]=b+8;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Hc(a,g,e)}l=b+28|0;if((k|0)!=(l|0)){f[h>>2]=f[l>>2];f[i>>2]=b+32;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Hc(k,g,e)}f[j>>2]=0;k=c+8|0;l=c+12|0;c=f[l>>2]|0;m=f[k>>2]|0;if((c-m|0)<=0){u=d;return}n=b+20|0;b=m;m=c;c=0;while(1){o=f[(f[b+(c<<2)>>2]|0)+56>>2]|0;p=f[n>>2]|0;if(p){q=n;r=p;a:while(1){p=r;while(1){if((f[p+16>>2]|0)>=(o|0))break;s=f[p+4>>2]|0;if(!s){t=q;break a}else p=s}r=f[p>>2]|0;if(!r){t=p;break}else q=p}if((t|0)!=(n|0)?(o|0)>=(f[t+16>>2]|0):0){q=t+20|0;r=wd(a,j)|0;if((r|0)!=(q|0)){f[h>>2]=f[q>>2];f[i>>2]=t+24;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Hc(r,g,e)}v=f[j>>2]|0;w=f[k>>2]|0;x=f[l>>2]|0}else{v=c;w=b;x=m}}else{v=c;w=b;x=m}c=v+1|0;f[j>>2]=c;if((c|0)>=(x-w>>2|0))break;else{b=w;m=x}}u=d;return}function xe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+12|0;Nh(f[i>>2]|0,c)|0;if(!(f[i>>2]|0)){j=1;u=d;return j|0}k=c+16|0;l=c+4|0;m=h+1|0;n=h+1|0;o=h+1|0;p=0;while(1){q=f[a>>2]|0;r=f[q+(p<<3)>>2]|0;if(r>>>0>63)if(r>>>0>16383)if(r>>>0>4194303){j=0;s=20;break}else{t=2;s=13}else{t=1;s=13}else if(!r){v=p+1|0;w=0;while(1){if(f[q+(v+w<<3)>>2]|0){x=w;break}y=w+1|0;if(y>>>0<63)w=y;else{x=y;break}}b[h>>0]=x<<2|3;w=k;v=f[w+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[w>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];ye(c,e,h,o)|0}z=x+p|0}else{t=0;s=13}if((s|0)==13){s=0;b[h>>0]=t|r<<2;w=k;v=f[w+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[w>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];ye(c,e,h,n)|0}if(!t)z=p;else{w=0;do{w=w+1|0;b[h>>0]=r>>>((w<<3)+-2|0);v=k;q=f[v+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[v>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];ye(c,e,h,m)|0}}while((w|0)<(t|0));z=p}}p=z+1|0;if(p>>>0>=(f[i>>2]|0)>>>0){j=1;s=20;break}}if((s|0)==20){u=d;return j|0}return 0}function ye(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=f[a>>2]|0;h=g;i=(f[c>>2]|0)-h|0;c=g+i|0;j=e-d|0;if((j|0)<=0){k=c;return k|0}l=a+8|0;m=f[l>>2]|0;n=a+4|0;o=f[n>>2]|0;p=o;if((j|0)<=(m-p|0)){q=p-c|0;if((j|0)>(q|0)){r=d+q|0;if((r|0)==(e|0))s=o;else{t=r;u=o;while(1){b[u>>0]=b[t>>0]|0;t=t+1|0;v=(f[n>>2]|0)+1|0;f[n>>2]=v;if((t|0)==(e|0)){s=v;break}else u=v}}if((q|0)>0){w=r;x=s}else{k=c;return k|0}}else{w=e;x=o}s=x-(c+j)|0;r=c+s|0;if(r>>>0>>0){q=r;r=x;do{b[r>>0]=b[q>>0]|0;q=q+1|0;r=(f[n>>2]|0)+1|0;f[n>>2]=r}while((q|0)!=(o|0))}if(s|0)Xl(x+(0-s)|0,c|0,s|0)|0;if((w|0)==(d|0)){k=c;return k|0}else{y=d;z=c}while(1){b[z>>0]=b[y>>0]|0;y=y+1|0;if((y|0)==(w|0)){k=c;break}else z=z+1|0}return k|0}z=p-h+j|0;if((z|0)<0)mq(a);j=m-h|0;h=j<<1;m=j>>>0<1073741823?(h>>>0>>0?z:h):2147483647;h=c;if(!m)A=0;else A=dn(m)|0;z=A+i|0;i=z;j=A+m|0;if((d|0)==(e|0)){B=i;C=g}else{g=d;d=i;i=z;do{b[i>>0]=b[g>>0]|0;i=d+1|0;d=i;g=g+1|0}while((g|0)!=(e|0));B=d;C=f[a>>2]|0}d=h-C|0;e=z+(0-d)|0;if((d|0)>0)Rg(e|0,C|0,d|0)|0;d=(f[n>>2]|0)-h|0;if((d|0)>0){h=B;Rg(h|0,c|0,d|0)|0;D=h+d|0;E=f[a>>2]|0}else{D=B;E=C}f[a>>2]=e;f[n>>2]=D;f[l>>2]=j;if(!E){k=z;return k|0}br(E);k=z;return k|0}function ze(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+16|0;g=e;h=f[(f[c+4>>2]|0)+(d<<2)>>2]|0;d=f[c+28>>2]|0;c=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(h<<2)>>2]|0;switch(f[c+28>>2]|0){case 5:case 6:case 3:case 4:case 1:case 2:{i=dn(40)|0;Ao(i);j=i;k=j;f[a>>2]=k;u=e;return}case 9:{l=3;break}default:{}}if((l|0)==3){i=f[d+48>>2]|0;d=dn(32)|0;f[g>>2]=d;f[g+8>>2]=-2147483616;f[g+4>>2]=17;m=d;n=12932;o=m+17|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[d+17>>0]=0;d=i+16|0;n=f[d>>2]|0;if(n){p=d;q=n;a:while(1){n=q;while(1){if((f[n+16>>2]|0)>=(h|0))break;r=f[n+4>>2]|0;if(!r){s=p;break a}else n=r}q=f[n>>2]|0;if(!q){s=n;break}else p=n}if(((s|0)!=(d|0)?(h|0)>=(f[s+16>>2]|0):0)?(h=s+20|0,(sh(h,g)|0)!=0):0)t=yk(h,g,-1)|0;else l=12}else l=12;if((l|0)==12)t=yk(i,g,-1)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if((t|0)>0)if((f[c+56>>2]|0)==1){c=dn(48)|0;m=c;o=m+48|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(o|0));Ao(c);f[c>>2]=2256;f[c+40>>2]=1152;f[c+44>>2]=-1;j=c;k=j;f[a>>2]=k;u=e;return}else{c=dn(64)|0;mm(c);j=c;k=j;f[a>>2]=k;u=e;return}}c=dn(36)|0;wm(c);j=c;k=j;f[a>>2]=k;u=e;return}function Ae(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=(c|0)==(a|0);b[c+12>>0]=d&1;if(d)return;else e=c;while(1){g=e+8|0;h=f[g>>2]|0;c=h+12|0;if(b[c>>0]|0){i=23;break}j=h+8|0;k=f[j>>2]|0;d=f[k>>2]|0;if((d|0)==(h|0)){l=f[k+4>>2]|0;if(!l){i=7;break}m=l+12|0;if(!(b[m>>0]|0))n=m;else{i=7;break}}else{if(!d){i=16;break}m=d+12|0;if(!(b[m>>0]|0))n=m;else{i=16;break}}b[c>>0]=1;c=(k|0)==(a|0);b[k+12>>0]=c&1;b[n>>0]=1;if(c){i=23;break}else e=k}if((i|0)==7){if((f[h>>2]|0)==(e|0)){o=h;p=k}else{n=h+4|0;a=f[n>>2]|0;c=f[a>>2]|0;f[n>>2]=c;if(!c)q=k;else{f[c+8>>2]=h;q=f[j>>2]|0}f[a+8>>2]=q;q=f[j>>2]|0;f[((f[q>>2]|0)==(h|0)?q:q+4|0)>>2]=a;f[a>>2]=h;f[j>>2]=a;o=a;p=f[a+8>>2]|0}b[o+12>>0]=1;b[p+12>>0]=0;o=f[p>>2]|0;a=o+4|0;q=f[a>>2]|0;f[p>>2]=q;if(q|0)f[q+8>>2]=p;q=p+8|0;f[o+8>>2]=f[q>>2];c=f[q>>2]|0;f[((f[c>>2]|0)==(p|0)?c:c+4|0)>>2]=o;f[a>>2]=p;f[q>>2]=o;return}else if((i|0)==16){if((f[h>>2]|0)==(e|0)){o=e+4|0;q=f[o>>2]|0;f[h>>2]=q;if(!q)r=k;else{f[q+8>>2]=h;r=f[j>>2]|0}f[g>>2]=r;r=f[j>>2]|0;f[((f[r>>2]|0)==(h|0)?r:r+4|0)>>2]=e;f[o>>2]=h;f[j>>2]=e;s=e;t=f[e+8>>2]|0}else{s=h;t=k}b[s+12>>0]=1;b[t+12>>0]=0;s=t+4|0;k=f[s>>2]|0;h=f[k>>2]|0;f[s>>2]=h;if(h|0)f[h+8>>2]=t;h=t+8|0;f[k+8>>2]=f[h>>2];s=f[h>>2]|0;f[((f[s>>2]|0)==(t|0)?s:s+4|0)>>2]=k;f[k>>2]=t;f[h>>2]=k;return}else if((i|0)==23)return}function Be(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=Oa,C=Oa;h=u;u=u+16|0;i=h;j=e+4|0;k=b[d+24>>0]|0;l=k<<24>>24;Bh(a,c,(f[j>>2]|0)-(f[e>>2]|0)>>2,l,g,d,1);g=f[a>>2]|0;a=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;g=f[c+4>>2]|0;sq(i);yo(i,$(n[c+20>>2]),(1<>>0>1073741823?-1:l<<2)|0;m=f[j>>2]|0;j=f[e>>2]|0;e=j;if((m|0)==(j|0)){$q(g);u=h;return}o=d+68|0;p=d+48|0;q=d+40|0;r=c+8|0;c=(b[d+84>>0]|0)==0;s=m-j>>2;if(k<<24>>24>0){t=0;v=0}else{k=0;do{j=f[e+(k<<2)>>2]|0;if(c)w=f[(f[o>>2]|0)+(j<<2)>>2]|0;else w=j;j=p;m=f[j>>2]|0;x=f[j+4>>2]|0;j=q;y=f[j>>2]|0;z=on(y|0,f[j+4>>2]|0,w|0,0)|0;j=Tn(z|0,I|0,m|0,x|0)|0;Rg(g|0,(f[f[d>>2]>>2]|0)+j|0,y|0)|0;k=k+1|0}while(k>>>0>>0);$q(g);u=h;return}while(1){k=f[e+(t<<2)>>2]|0;if(c)A=f[(f[o>>2]|0)+(k<<2)>>2]|0;else A=k;k=p;w=f[k>>2]|0;y=f[k+4>>2]|0;k=q;j=f[k>>2]|0;x=on(j|0,f[k+4>>2]|0,A|0,0)|0;k=Tn(x|0,I|0,w|0,y|0)|0;Rg(g|0,(f[f[d>>2]>>2]|0)+k|0,j|0)|0;j=f[r>>2]|0;B=$(n[i>>2]);k=0;y=v;while(1){C=$(n[g+(k<<2)>>2]);w=~~$(J($($(B*$(C-$(n[j+(k<<2)>>2])))+$(.5))));f[a+(y<<2)>>2]=w;k=k+1|0;if((k|0)==(l|0))break;else y=y+1|0}t=t+1|0;if(t>>>0>=s>>>0)break;else v=v+l|0}$q(g);u=h;return}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=f[b>>2]|0;b=a+12|0;e=(d|0)==-1;do if(e){g=1;h=-1;i=-1}else{j=d+(((d>>>0)%3|0|0)==0?2:-1)|0;if((j|0)!=-1){k=f[(f[b>>2]|0)+12>>2]|0;l=j;while(1){j=f[k+(l<<2)>>2]|0;if((j|0)==-1){m=0;n=l;break}o=j+1|0;l=((o>>>0)%3|0|0)==0?j+-2|0:o;if((l|0)==-1){m=1;n=-1;break}}if(e){g=m;h=-1;i=n;break}else{p=m;q=n}}else{p=1;q=-1}g=p;h=f[(f[f[b>>2]>>2]|0)+(d<<2)>>2]|0;i=q}while(0);if(c){c=(f[a+84>>2]|0)+(h>>>5<<2)|0;f[c>>2]=f[c>>2]|1<<(h&31);r=1}else r=0;c=f[(f[a+152>>2]|0)+(h<<2)>>2]|0;q=(f[a+140>>2]|0)+(c>>>5<<2)|0;f[q>>2]=f[q>>2]|1<<(c&31);if(!g){g=(((i>>>0)%3|0|0)==0?2:-1)+i|0;if((g|0)==-1){s=-1;t=i}else{s=f[(f[f[b>>2]>>2]|0)+(g<<2)>>2]|0;t=i}}else{s=-1;t=-1}if((s|0)==(h|0)){u=r;return u|0}i=f[a+84>>2]|0;a=r;r=s;s=t;while(1){t=i+(r>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(r&31);t=a+1|0;g=s+1|0;a:do if((s|0)!=-1?(c=((g>>>0)%3|0|0)==0?s+-2|0:g,(c|0)!=-1):0){q=f[b>>2]|0;d=f[q+12>>2]|0;p=c;while(1){c=f[d+(p<<2)>>2]|0;if((c|0)==-1)break;n=c+1|0;m=((n>>>0)%3|0|0)==0?c+-2|0:n;if((m|0)==-1){v=-1;w=-1;break a}else p=m}d=(((p>>>0)%3|0|0)==0?2:-1)+p|0;if((d|0)==-1){v=-1;w=p}else{v=f[(f[q>>2]|0)+(d<<2)>>2]|0;w=p}}else{v=-1;w=-1}while(0);if((v|0)==(h|0)){u=t;break}else{a=t;r=v;s=w}}return u|0}function De(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;c=a+4|0;d=f[c>>2]|0;e=a+100|0;if(d>>>0<(f[e>>2]|0)>>>0){f[c>>2]=d+1;g=h[d>>0]|0}else g=Di(a)|0;switch(g|0){case 43:case 45:{d=(g|0)==45&1;i=f[c>>2]|0;if(i>>>0<(f[e>>2]|0)>>>0){f[c>>2]=i+1;j=h[i>>0]|0}else j=Di(a)|0;if((b|0)!=0&(j+-48|0)>>>0>9?(f[e>>2]|0)!=0:0){f[c>>2]=(f[c>>2]|0)+-1;k=d;l=j}else{k=d;l=j}break}default:{k=0;l=g}}if((l+-48|0)>>>0>9)if(!(f[e>>2]|0)){m=-2147483648;n=0}else{f[c>>2]=(f[c>>2]|0)+-1;m=-2147483648;n=0}else{g=0;j=l;while(1){g=j+-48+(g*10|0)|0;l=f[c>>2]|0;if(l>>>0<(f[e>>2]|0)>>>0){f[c>>2]=l+1;o=h[l>>0]|0}else o=Di(a)|0;if(!((o+-48|0)>>>0<10&(g|0)<214748364))break;else j=o}j=((g|0)<0)<<31>>31;if((o+-48|0)>>>0<10){l=o;d=g;b=j;while(1){i=on(d|0,b|0,10,0)|0;p=I;q=Tn(l|0,((l|0)<0)<<31>>31|0,-48,-1)|0;r=Tn(q|0,I|0,i|0,p|0)|0;p=I;i=f[c>>2]|0;if(i>>>0<(f[e>>2]|0)>>>0){f[c>>2]=i+1;s=h[i>>0]|0}else s=Di(a)|0;if((s+-48|0)>>>0<10&((p|0)<21474836|(p|0)==21474836&r>>>0<2061584302)){l=s;d=r;b=p}else{t=s;u=r;v=p;break}}}else{t=o;u=g;v=j}if((t+-48|0)>>>0<10)do{t=f[c>>2]|0;if(t>>>0<(f[e>>2]|0)>>>0){f[c>>2]=t+1;w=h[t>>0]|0}else w=Di(a)|0}while((w+-48|0)>>>0<10);if(f[e>>2]|0)f[c>>2]=(f[c>>2]|0)+-1;c=(k|0)!=0;k=Vn(0,0,u|0,v|0)|0;m=c?I:v;n=c?k:u}I=m;return n|0}function Ee(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=a+1176|0;c=f[b>>2]|0;if(c|0){d=a+1180|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);br(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}br(g)}g=a+1164|0;b=f[g>>2]|0;if(b|0){j=a+1168|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);br(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}br(l)}l=f[a+1152>>2]|0;if(l|0){g=a+1156|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l)}l=f[a+1140>>2]|0;if(l|0){m=a+1144|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);br(l)}l=f[a+1128>>2]|0;if(!l){n=a+1108|0;dl(n);o=a+1088|0;dl(o);p=a+1068|0;dl(p);q=a+1036|0;tj(q);r=a+12|0;xh(r);return}g=a+1132|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l);n=a+1108|0;dl(n);o=a+1088|0;dl(o);p=a+1068|0;dl(p);q=a+1036|0;tj(q);r=a+12|0;xh(r);return}function Fe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+16|0;e=d;g=a+4|0;h=f[g>>2]|0;i=f[(f[a>>2]|0)+52>>2]|0;if(!h){if(!(Sa[i&31](a,c,0)|0)){j=0;u=d;return j|0}}else if(!(Sa[i&31](a,c,f[(f[h+4>>2]|0)+80>>2]|0)|0)){j=0;u=d;return j|0}if(!(b[a+28>>0]|0)){j=1;u=d;return j|0}h=f[a+8>>2]|0;i=f[a+32>>2]|0;a=f[h+80>>2]|0;f[e>>2]=0;k=e+4|0;f[k>>2]=0;f[e+8>>2]=0;do if(a)if(a>>>0>1073741823)mq(e);else{l=a<<2;m=dn(l)|0;f[e>>2]=m;n=m+(a<<2)|0;f[e+8>>2]=n;hj(m|0,0,l|0)|0;f[k>>2]=n;o=m;p=n;q=m;break}else{o=0;p=0;q=0}while(0);e=f[c+4>>2]|0;a=f[c>>2]|0;c=a;a:do if((e|0)!=(a|0)){m=e-a>>2;if(b[h+84>>0]|0){n=0;while(1){f[o+(f[c+(n<<2)>>2]<<2)>>2]=n;n=n+1|0;if(n>>>0>=m>>>0)break a}}n=f[h+68>>2]|0;l=0;do{f[o+(f[n+(f[c+(l<<2)>>2]<<2)>>2]<<2)>>2]=l;l=l+1|0}while(l>>>0>>0)}while(0);c=f[(f[(f[g>>2]|0)+4>>2]|0)+80>>2]|0;b:do if(c|0){g=f[i+68>>2]|0;if(b[h+84>>0]|0){a=0;while(1){f[g+(a<<2)>>2]=f[o+(a<<2)>>2];a=a+1|0;if(a>>>0>=c>>>0)break b}}a=f[h+68>>2]|0;e=0;do{f[g+(e<<2)>>2]=f[o+(f[a+(e<<2)>>2]<<2)>>2];e=e+1|0}while(e>>>0>>0)}while(0);if(o|0){if((p|0)!=(o|0))f[k>>2]=p+(~((p+-4-o|0)>>>2)<<2);br(q)}j=1;u=d;return j|0}function Ge(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;yh(a+12|0);rn(a+1036|0);to(a+1068|0);to(a+1088|0);to(a+1108|0);e=a+1128|0;f[e>>2]=0;g=a+1132|0;f[g>>2]=0;f[a+1136>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)mq(e);else{i=b<<2;j=dn(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+1136>>2]=k;hj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+1140|0;f[g>>2]=0;e=a+1144|0;f[e>>2]=0;f[a+1148>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+1148>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=a+1152|0;f[g>>2]=0;e=a+1156|0;f[e>>2]=0;f[a+1160>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+1160>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;hj(i|0,0,k|0)|0;f[e>>2]=j}fk(a+1164|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);br(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=dn(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;hj(k|0,0,h|0)|0;f[j>>2]=e}fk(a+1176|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g);u=c;return}function He(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0;g=u;u=u+16|0;h=g;i=b+16|0;f[a>>2]=f[i>>2];f[a+4>>2]=f[i+4>>2];f[a+8>>2]=f[i+8>>2];f[a+12>>2]=f[i+12>>2];f[a+16>>2]=f[i+16>>2];f[a+20>>2]=f[i+20>>2];j=a+8|0;f[j>>2]=(f[j>>2]|0)+d;j=(d|0)>0;if(j){k=b+4|0;l=a+16|0;m=a+12|0;n=f[b>>2]|0;o=n;q=0;r=o;s=n;n=o;while(1){o=f[c+(q<<2)>>2]|0;t=f[k>>2]|0;if(t-s>>2>>>0>o>>>0){v=r;w=n}else{x=o+1|0;f[h>>2]=0;y=t-s>>2;z=s;A=t;if(x>>>0<=y>>>0)if(x>>>0>>0?(t=z+(x<<2)|0,(t|0)!=(A|0)):0){f[k>>2]=A+(~((A+-4-t|0)>>>2)<<2);B=r}else B=r;else{kh(b,x-y|0,h);B=f[b>>2]|0}v=B;w=B}y=w+(o<<2)|0;x=f[y>>2]|0;s=w;if((x|0)<=1)if((x|0)==0?(f[l>>2]=(f[l>>2]|0)+1,o>>>0>(f[m>>2]|0)>>>0):0){f[m>>2]=o;C=0.0}else C=0.0;else{D=+(x|0);C=+Fg(D)*D}x=(f[y>>2]|0)+1|0;f[y>>2]=x;D=+(x|0);E=+Fg(D)*D-C;p[a>>3]=+p[a>>3]+E;q=q+1|0;if((q|0)==(d|0))break;else{r=v;n=w}}}if(e){f[i>>2]=f[a>>2];f[i+4>>2]=f[a+4>>2];f[i+8>>2]=f[a+8>>2];f[i+12>>2]=f[a+12>>2];f[i+16>>2]=f[a+16>>2];u=g;return}if(!j){u=g;return}j=f[b>>2]|0;b=0;do{a=j+(f[c+(b<<2)>>2]<<2)|0;f[a>>2]=(f[a>>2]|0)+-1;b=b+1|0}while((b|0)!=(d|0));u=g;return}function Ie(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;f[a>>2]=e;break a;break}case 10:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;e=a;f[e>>2]=d;f[e+4>>2]=((d|0)<0)<<31>>31;break a;break}case 11:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;d=a;f[d>>2]=e;f[d+4>>2]=0;break a;break}case 12:{d=(f[c>>2]|0)+(8-1)&~(8-1);e=d;g=f[e>>2]|0;h=f[e+4>>2]|0;f[c>>2]=d+8;d=a;f[d>>2]=g;f[d+4>>2]=h;break a;break}case 13:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&65535)<<16>>16;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 14:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&65535;f[h+4>>2]=0;break a;break}case 15:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&255)<<24>>24;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 16:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&255;f[h+4>>2]=0;break a;break}case 17:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}case 18:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}default:break a}while(0);while(0);return}function Je(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=u;u=u+16|0;d=c+4|0;e=c;g=c+8|0;if(!(Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0)){h=0;u=c;return h|0}i=a+44|0;j=f[i>>2]|0;k=a+8|0;l=a+12|0;m=f[l>>2]|0;n=f[k>>2]|0;b[g>>0]=(m-n|0)>>>2;o=j+16|0;p=f[o+4>>2]|0;if((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0){q=k;r=n;s=m}else{f[e>>2]=f[j+4>>2];f[d>>2]=f[e>>2];ye(j,d,g,g+1|0)|0;q=k;r=f[k>>2]|0;s=f[l>>2]|0}a:do if((r|0)!=(s|0)){l=a+4|0;k=r;while(1){g=f[k>>2]|0;k=k+4|0;if(!(Sa[f[(f[g>>2]|0)+8>>2]&31](g,a,f[l>>2]|0)|0)){h=0;break}if((k|0)==(s|0))break a}u=c;return h|0}while(0);if(!(vc(a)|0)){h=0;u=c;return h|0}s=a+32|0;r=f[s>>2]|0;k=a+36|0;l=f[k>>2]|0;b:do if((r|0)!=(l|0)){g=r;do{if(!(Ra[f[(f[a>>2]|0)+40>>2]&127](a,f[g>>2]|0)|0)){h=0;t=18;break}g=g+4|0}while((g|0)!=(l|0));if((t|0)==18){u=c;return h|0}g=f[s>>2]|0;d=f[k>>2]|0;if((g|0)!=(d|0)){j=g;while(1){g=f[(f[q>>2]|0)+(f[j>>2]<<2)>>2]|0;j=j+4|0;if(!(Ra[f[(f[g>>2]|0)+12>>2]&127](g,f[i>>2]|0)|0)){h=0;break}if((j|0)==(d|0))break b}u=c;return h|0}}while(0);h=Qa[f[(f[a>>2]|0)+44>>2]&127](a)|0;u=c;return h|0}function Ke(a,b){a=a|0;b=b|0;fd(a,b);fd(a+32|0,b);fd(a+64|0,b);fd(a+96|0,b);fd(a+128|0,b);fd(a+160|0,b);fd(a+192|0,b);fd(a+224|0,b);fd(a+256|0,b);fd(a+288|0,b);fd(a+320|0,b);fd(a+352|0,b);fd(a+384|0,b);fd(a+416|0,b);fd(a+448|0,b);fd(a+480|0,b);fd(a+512|0,b);fd(a+544|0,b);fd(a+576|0,b);fd(a+608|0,b);fd(a+640|0,b);fd(a+672|0,b);fd(a+704|0,b);fd(a+736|0,b);fd(a+768|0,b);fd(a+800|0,b);fd(a+832|0,b);fd(a+864|0,b);fd(a+896|0,b);fd(a+928|0,b);fd(a+960|0,b);fd(a+992|0,b);fd(a+1024|0,b);return}function Le(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+64|0;g=e+60|0;h=e;i=dn(80)|0;j=f[c+8>>2]|0;f[i+4>>2]=0;f[i>>2]=3232;k=i+8|0;l=i+12|0;m=l+44|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[k>>2]=3256;n=i+56|0;f[n>>2]=0;f[i+60>>2]=0;f[i+64>>2]=0;f[i+68>>2]=j;f[i+72>>2]=d;o=i+76|0;f[o>>2]=0;p=i;q=f[c+12>>2]|0;r=h+4|0;l=r+4|0;m=l+40|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[h>>2]=3256;l=h+48|0;f[l>>2]=0;m=h+52|0;f[m>>2]=0;f[h+56>>2]=0;s=q;f[r>>2]=s;t=((f[s+4>>2]|0)-(f[q>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Xg(h+24|0,t,g);t=f[r>>2]|0;r=(f[t+28>>2]|0)-(f[t+24>>2]|0)>>2;b[g>>0]=0;Xg(h+36|0,r,g);f[h+8>>2]=q;f[h+12>>2]=d;f[h+16>>2]=j;f[h+20>>2]=i;f[o>>2]=c+72;ef(k,h)|0;Yf(n,f[l>>2]|0,f[m>>2]|0);f[a>>2]=p;f[h>>2]=3256;p=f[l>>2]|0;if(p|0){l=f[m>>2]|0;if((l|0)!=(p|0))f[m>>2]=l+(~((l+-4-p|0)>>>2)<<2);br(p)}f[h>>2]=3276;p=f[h+36>>2]|0;if(p|0)br(p);p=f[h+24>>2]|0;if(!p){u=e;return}br(p);u=e;return}function Me(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;c=u;u=u+32|0;d=c;e=a+4|0;g=f[a>>2]|0;h=(f[e>>2]|0)-g>>2;i=h+1|0;if(i>>>0>1073741823)mq(a);j=a+8|0;k=(f[j>>2]|0)-g|0;g=k>>1;l=k>>2>>>0<536870911?(g>>>0>>0?i:g):1073741823;f[d+12>>2]=0;f[d+16>>2]=a+8;do if(l)if(l>>>0>1073741823){g=ra(8)|0;Wo(g,14941);f[g>>2]=6944;va(g|0,1080,114)}else{m=dn(l<<2)|0;break}else m=0;while(0);f[d>>2]=m;g=m+(h<<2)|0;h=d+8|0;i=d+4|0;f[i>>2]=g;k=m+(l<<2)|0;l=d+12|0;f[l>>2]=k;m=f[b>>2]|0;f[b>>2]=0;f[g>>2]=m;m=g+4|0;f[h>>2]=m;b=f[a>>2]|0;n=f[e>>2]|0;if((n|0)==(b|0)){o=g;p=l;q=h;r=b;s=m;t=n;v=k;w=o;f[a>>2]=w;f[i>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;Wh(d);u=c;return}else{y=n;z=g}do{y=y+-4|0;g=f[y>>2]|0;f[y>>2]=0;f[z+-4>>2]=g;z=(f[i>>2]|0)+-4|0;f[i>>2]=z}while((y|0)!=(b|0));o=z;p=l;q=h;r=f[a>>2]|0;s=f[h>>2]|0;t=f[e>>2]|0;v=f[l>>2]|0;w=o;f[a>>2]=w;f[i>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;Wh(d);u=c;return}function Ne(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+32|0;e=d+12|0;g=d;h=hl(c,0)|0;if(!h){f[a>>2]=0;u=d;return}i=f[c+100>>2]|0;j=f[c+96>>2]|0;c=i-j|0;k=(c|0)/12|0;f[e>>2]=0;l=e+4|0;f[l>>2]=0;f[e+8>>2]=0;m=j;do if(c)if(k>>>0>357913941)mq(e);else{n=dn(c)|0;f[e>>2]=n;f[e+8>>2]=n+(k*12|0);hj(n|0,0,c|0)|0;f[l>>2]=n+c;o=n;break}else o=0;while(0);f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;a:do if((i|0)!=(j|0)){c=g+4|0;n=g+8|0;if(b[h+84>>0]|0){p=0;while(1){q=m+(p*12|0)|0;f[g>>2]=f[q>>2];f[g+4>>2]=f[q+4>>2];f[g+8>>2]=f[q+8>>2];f[o+(p*12|0)>>2]=f[g>>2];f[o+(p*12|0)+4>>2]=f[c>>2];f[o+(p*12|0)+8>>2]=f[n>>2];p=p+1|0;if(p>>>0>=k>>>0)break a}}p=f[h+68>>2]|0;q=0;do{r=f[p+(f[m+(q*12|0)>>2]<<2)>>2]|0;f[g>>2]=r;s=f[p+(f[m+(q*12|0)+4>>2]<<2)>>2]|0;f[c>>2]=s;t=f[p+(f[m+(q*12|0)+8>>2]<<2)>>2]|0;f[n>>2]=t;f[o+(q*12|0)>>2]=r;f[o+(q*12|0)+4>>2]=s;f[o+(q*12|0)+8>>2]=t;q=q+1|0}while(q>>>0>>0)}while(0);Cj(a,e);a=f[e>>2]|0;if(a|0){e=f[l>>2]|0;if((e|0)!=(a|0))f[l>>2]=e+(~(((e+-12-a|0)>>>0)/12|0)*12|0);br(a)}u=d;return}function Oe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;rn(a+12|0);to(a+44|0);to(a+64|0);to(a+84|0);e=a+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;f[a+112>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)mq(e);else{i=b<<2;j=dn(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+112>>2]=k;hj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+116|0;f[g>>2]=0;e=a+120|0;f[e>>2]=0;f[a+124>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+124>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=a+128|0;f[g>>2]=0;e=a+132|0;f[e>>2]=0;f[a+136>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+136>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;hj(i|0,0,k|0)|0;f[e>>2]=j}fk(a+140|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);br(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=dn(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;hj(k|0,0,h|0)|0;f[j>>2]=e}fk(a+152|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g);u=c;return}function Pe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;to(a+12|0);to(a+32|0);to(a+52|0);to(a+72|0);e=a+92|0;f[e>>2]=0;g=a+96|0;f[g>>2]=0;f[a+100>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)mq(e);else{i=b<<2;j=dn(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+100>>2]=k;hj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+104|0;f[g>>2]=0;e=a+108|0;f[e>>2]=0;f[a+112>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+112>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=a+116|0;f[g>>2]=0;e=a+120|0;f[e>>2]=0;f[a+124>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+124>>2]=g;hj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=dn(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;hj(i|0,0,k|0)|0;f[e>>2]=j}fk(a+128|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);br(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=dn(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;hj(k|0,0,h|0)|0;f[j>>2]=e}fk(a+140|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g);u=c;return}function Qe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=dn(40)|0;e=d+16|0;dj(e,c);dj(d+28|0,c+12|0);c=a+4|0;g=f[c>>2]|0;do if(g){h=b[d+27>>0]|0;i=h<<24>>24<0;j=i?f[d+20>>2]|0:h&255;h=i?f[e>>2]|0:e;i=g;while(1){k=i+16|0;l=b[k+11>>0]|0;m=l<<24>>24<0;n=m?f[i+20>>2]|0:l&255;l=n>>>0>>0?n:j;if((l|0)!=0?(o=Pk(h,m?f[k>>2]|0:k,l)|0,(o|0)!=0):0)if((o|0)<0)p=7;else p=9;else if(j>>>0>>0)p=7;else p=9;if((p|0)==7){p=0;n=f[i>>2]|0;if(!n){p=8;break}else q=n}else if((p|0)==9){p=0;r=i+4|0;n=f[r>>2]|0;if(!n){p=11;break}else q=n}i=q}if((p|0)==8){s=i;t=i;break}else if((p|0)==11){s=i;t=r;break}}else{s=c;t=c}while(0);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=s;f[t>>2]=d;s=f[f[a>>2]>>2]|0;if(!s){u=d;v=a+4|0;w=f[v>>2]|0;Ae(w,u);x=a+8|0;y=f[x>>2]|0;z=y+1|0;f[x>>2]=z;return d|0}f[a>>2]=s;u=f[t>>2]|0;v=a+4|0;w=f[v>>2]|0;Ae(w,u);x=a+8|0;y=f[x>>2]|0;z=y+1|0;f[x>>2]=z;return d|0}function Re(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=Oa,B=Oa;g=u;u=u+16|0;h=g;i=b[d+24>>0]|0;j=i<<24>>24;Bh(a,c,e,j,0,d,1);k=f[a>>2]|0;a=(f[f[k>>2]>>2]|0)+(f[k+48>>2]|0)|0;k=f[c+4>>2]|0;sq(h);yo(h,$(n[c+20>>2]),(1<>>0>1073741823?-1:j<<2)|0;if(!e){$q(k);u=g;return}l=d+68|0;m=d+48|0;o=d+40|0;p=c+8|0;c=(b[d+84>>0]|0)==0;if(i<<24>>24>0){q=0;r=0}else{i=0;do{if(c)s=f[(f[l>>2]|0)+(i<<2)>>2]|0;else s=i;t=m;v=f[t>>2]|0;w=f[t+4>>2]|0;t=o;x=f[t>>2]|0;y=on(x|0,f[t+4>>2]|0,s|0,0)|0;t=Tn(y|0,I|0,v|0,w|0)|0;Rg(k|0,(f[f[d>>2]>>2]|0)+t|0,x|0)|0;i=i+1|0}while((i|0)!=(e|0));$q(k);u=g;return}while(1){if(c)z=f[(f[l>>2]|0)+(r<<2)>>2]|0;else z=r;i=m;s=f[i>>2]|0;x=f[i+4>>2]|0;i=o;t=f[i>>2]|0;w=on(t|0,f[i+4>>2]|0,z|0,0)|0;i=Tn(w|0,I|0,s|0,x|0)|0;Rg(k|0,(f[f[d>>2]>>2]|0)+i|0,t|0)|0;t=f[p>>2]|0;A=$(n[h>>2]);i=0;x=q;while(1){B=$(n[k+(i<<2)>>2]);s=~~$(J($($(A*$(B-$(n[t+(i<<2)>>2])))+$(.5))));f[a+(x<<2)>>2]=s;i=i+1|0;if((i|0)==(j|0))break;else x=x+1|0}r=r+1|0;if((r|0)==(e|0))break;else q=q+j|0}$q(k);u=g;return}function Se(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3340;ii(a+200|0);b=f[a+184>>2]|0;if(b|0){c=a+188|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}_i(a+172|0);b=f[a+152>>2]|0;if(b|0){d=a+156|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+140>>2]|0;if(b|0)br(b);b=f[a+128>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;br(b)}while((c|0)!=0)}c=a+120|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)br(b);b=f[a+108>>2]|0;if(b|0){c=a+112|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);br(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+84>>2]|0;if(b|0)br(b);b=f[a+72>>2]|0;if(b|0){c=a+76|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+28>>2]|0;if(b|0)br(b);b=f[a+16>>2]|0;if(b|0){d=a+20|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=a+12|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;ui(a);br(a);return}function Te(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+140|0;c=f[b>>2]|0;if(c|0){d=a+144|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);br(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}br(g)}g=a+128|0;b=f[g>>2]|0;if(b|0){j=a+132|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);br(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}br(l)}l=f[a+116>>2]|0;if(l|0){g=a+120|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l)}l=f[a+104>>2]|0;if(l|0){m=a+108|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);br(l)}l=f[a+92>>2]|0;if(!l){n=a+72|0;dl(n);o=a+52|0;dl(o);p=a+32|0;dl(p);q=a+12|0;dl(q);return}g=a+96|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l);n=a+72|0;dl(n);o=a+52|0;dl(o);p=a+32|0;dl(p);q=a+12|0;dl(q);return}function Ue(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+152|0;c=f[b>>2]|0;if(c|0){d=a+156|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);br(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}br(g)}g=a+140|0;b=f[g>>2]|0;if(b|0){j=a+144|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);br(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}br(l)}l=f[a+128>>2]|0;if(l|0){g=a+132|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l)}l=f[a+116>>2]|0;if(l|0){m=a+120|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);br(l)}l=f[a+104>>2]|0;if(!l){n=a+84|0;dl(n);o=a+64|0;dl(o);p=a+44|0;dl(p);q=a+12|0;tj(q);return}g=a+108|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(l);n=a+84|0;dl(n);o=a+64|0;dl(o);p=a+44|0;dl(p);q=a+12|0;tj(q);return}function Ve(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3080;jj(a+200|0);b=f[a+184>>2]|0;if(b|0){c=a+188|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}_i(a+172|0);b=f[a+152>>2]|0;if(b|0){d=a+156|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+140>>2]|0;if(b|0)br(b);b=f[a+128>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;br(b)}while((c|0)!=0)}c=a+120|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)br(b);b=f[a+108>>2]|0;if(b|0){c=a+112|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);br(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+84>>2]|0;if(b|0)br(b);b=f[a+72>>2]|0;if(b|0){c=a+76|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+28>>2]|0;if(b|0)br(b);b=f[a+16>>2]|0;if(b|0){d=a+20|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=a+12|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;ui(a);br(a);return}function We(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+48|0;d=c+44|0;e=c+40|0;g=c+36|0;h=c+32|0;i=c;f[h>>2]=f[a+60>>2];j=b+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,h,h+4|0)|0}rn(i);lk(i);if((f[h>>2]|0)>0){k=a+56|0;l=1;m=0;do{n=l;l=(f[(f[k>>2]|0)+(m>>>5<<2)>>2]&1<<(m&31)|0)!=0;Vi(i,n^l^1);m=m+1|0}while((m|0)<(f[h>>2]|0))}fd(i,b);f[g>>2]=f[a+12>>2];h=j;m=f[h>>2]|0;l=f[h+4>>2]|0;if((l|0)>0|(l|0)==0&m>>>0>0){o=l;p=m}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;m=j;o=f[m+4>>2]|0;p=f[m>>2]|0}f[g>>2]=f[a+20>>2];if((o|0)>0|(o|0)==0&p>>>0>0){tj(i);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;tj(i);u=c;return 1}function Xe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=f[c>>2]|0;c=f[d>>2]|0;e=f[a+4>>2]|0;g=f[d+4>>2]|0;h=e+-1|0;i=(h&e|0)==0;if(!i)if(g>>>0>>0)j=g;else j=(g>>>0)%(e>>>0)|0;else j=h&g;g=(f[a>>2]|0)+(j<<2)|0;k=f[g>>2]|0;while(1){l=f[k>>2]|0;if((l|0)==(d|0))break;else k=l}if((k|0)!=(a+8|0)){l=f[k+4>>2]|0;if(!i)if(l>>>0>>0)m=l;else m=(l>>>0)%(e>>>0)|0;else m=l&h;if((m|0)==(j|0)){n=c;o=21}else o=13}else o=13;do if((o|0)==13){if(c|0){m=f[c+4>>2]|0;if(!i)if(m>>>0>>0)p=m;else p=(m>>>0)%(e>>>0)|0;else p=m&h;if((p|0)==(j|0)){q=c;r=c;o=22;break}}f[g>>2]=0;n=f[d>>2]|0;o=21}while(0);if((o|0)==21){g=n;if(!n)s=g;else{q=n;r=g;o=22}}if((o|0)==22){o=f[q+4>>2]|0;if(!i)if(o>>>0>>0)t=o;else t=(o>>>0)%(e>>>0)|0;else t=o&h;if((t|0)==(j|0))s=r;else{f[(f[a>>2]|0)+(t<<2)>>2]=k;s=f[d>>2]|0}}f[k>>2]=s;f[d>>2]=0;s=a+12|0;f[s>>2]=(f[s>>2]|0)+-1;if(!d)return c|0;s=d+8|0;a=f[d+20>>2]|0;if(a|0){k=d+24|0;if((f[k>>2]|0)!=(a|0))f[k>>2]=a;br(a)}if((b[s+11>>0]|0)<0)br(f[s>>2]|0);br(d);return c|0}function Ye(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;b=u;u=u+16|0;c=b+4|0;d=b;f[c>>2]=0;e=c+4|0;f[e>>2]=0;f[c+8>>2]=0;g=a+56|0;h=f[g>>2]|0;i=(f[h+100>>2]|0)-(f[h+96>>2]|0)|0;j=(i|0)/12|0;if(!i){k=0;l=0}else{i=c+8|0;m=0;n=0;o=h;h=0;p=0;while(1){q=f[o+96>>2]|0;r=f[q+(n*12|0)>>2]|0;s=r-m|0;t=((s|0)>-1?s:0-s|0)<<1|s>>>31;f[d>>2]=t;if((h|0)==(p|0)){Ci(c,d);v=f[e>>2]|0;w=f[i>>2]|0}else{f[h>>2]=t;t=h+4|0;f[e>>2]=t;v=t;w=p}t=f[q+(n*12|0)+4>>2]|0;s=t-r|0;r=((s|0)>-1?s:0-s|0)<<1|s>>>31;f[d>>2]=r;if((v|0)==(w|0)){Ci(c,d);x=f[e>>2]|0;y=f[i>>2]|0}else{f[v>>2]=r;r=v+4|0;f[e>>2]=r;x=r;y=w}r=f[q+(n*12|0)+8>>2]|0;q=r-t|0;t=((q|0)>-1?q:0-q|0)<<1|q>>>31;f[d>>2]=t;if((x|0)==(y|0))Ci(c,d);else{f[x>>2]=t;f[e>>2]=x+4}t=n+1|0;if(t>>>0>=j>>>0)break;m=r;n=t;o=f[g>>2]|0;h=f[e>>2]|0;p=f[i>>2]|0}k=f[c>>2]|0;l=f[e>>2]|0}Dc(k,l-k>>2,1,0,f[a+44>>2]|0)|0;a=f[c>>2]|0;if(!a){u=b;return 1}c=f[e>>2]|0;if((c|0)!=(a|0))f[e>>2]=c+(~((c+-4-a|0)>>>2)<<2);br(a);u=b;return 1}function Ze(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[a+12>>2]|0;e=a+108|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{kh(i,h-m|0,3220);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+112|0;a=c+68|0;c=f[o+96>>2]|0;o=0;while(1){h=o*3|0;if((h|0)==-1){q=0;r=12;break}i=f[d>>2]|0;g=f[i+(h<<2)>>2]|0;if((g|0)==-1){q=0;r=12;break}k=f[(f[m>>2]|0)+12>>2]|0;l=f[k+(g<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}g=f[a>>2]|0;f[g+(f[c+(o*12|0)>>2]<<2)>>2]=l;l=h+1|0;if((l|0)==-1){q=0;r=12;break}j=f[i+(l<<2)>>2]|0;if((j|0)==-1){q=0;r=12;break}l=f[k+(j<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}f[g+(f[c+(o*12|0)+4>>2]<<2)>>2]=l;l=h+2|0;if((l|0)==-1){q=0;r=12;break}h=f[i+(l<<2)>>2]|0;if((h|0)==-1){q=0;r=12;break}l=f[k+(h<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}f[g+(f[c+(o*12|0)+8>>2]<<2)>>2]=l;o=o+1|0;if(o>>>0>=e>>>0){q=1;r=12;break}}if((r|0)==12)return q|0;return 0}function _e(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+48|0;d=c+44|0;e=c+40|0;g=c+36|0;h=c+32|0;i=c;f[h>>2]=f[a+80>>2];j=b+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,h,h+4|0)|0}rn(i);lk(i);if((f[h>>2]|0)>0){k=a+76|0;l=1;m=0;do{n=l;l=(f[(f[k>>2]|0)+(m>>>5<<2)>>2]&1<<(m&31)|0)!=0;Vi(i,n^l^1);m=m+1|0}while((m|0)<(f[h>>2]|0))}fd(i,b);f[g>>2]=f[a+12>>2];h=j;m=f[h>>2]|0;l=f[h+4>>2]|0;if((l|0)>0|(l|0)==0&m>>>0>0){o=l;p=m}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;m=j;o=f[m+4>>2]|0;p=f[m>>2]|0}f[g>>2]=f[a+16>>2];if((o|0)>0|(o|0)==0&p>>>0>0){tj(i);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;tj(i);u=c;return 1}function $e(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=a+12|0;h=f[g>>2]|0;$j(f[a+4>>2]|0,(f[h+28>>2]|0)-(f[h+24>>2]|0)>>2);h=a+96|0;i=f[g>>2]|0;j=(f[i+28>>2]|0)-(f[i+24>>2]|0)>>2;f[c>>2]=0;i=a+100|0;k=f[i>>2]|0;l=f[h>>2]|0;m=k-l>>2;n=l;l=k;if(j>>>0<=m>>>0){if(j>>>0>>0?(k=n+(j<<2)|0,(k|0)!=(l|0)):0)f[i>>2]=l+(~((l+-4-k|0)>>>2)<<2)}else kh(h,j-m|0,c);m=a+116|0;a=f[m>>2]|0;if(!a){j=f[g>>2]|0;g=(f[j+4>>2]|0)-(f[j>>2]|0)>>2;j=(g>>>0)/3|0;if(g>>>0<=2){o=1;u=b;return o|0}g=0;while(1){f[d>>2]=g*3;f[c>>2]=f[d>>2];g=g+1|0;if(!(vb(e,c)|0)){o=0;p=15;break}if((g|0)>=(j|0)){o=1;p=15;break}}if((p|0)==15){u=b;return o|0}}else{j=f[a>>2]|0;if((f[a+4>>2]|0)==(j|0)){o=1;u=b;return o|0}a=0;g=j;while(1){f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(vb(e,c)|0)){o=0;p=15;break}j=f[m>>2]|0;g=f[j>>2]|0;if(a>>>0>=(f[j+4>>2]|0)-g>>2>>>0){o=1;p=15;break}}if((p|0)==15){u=b;return o|0}}return 0}function af(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[a+12>>2]|0;e=a+68|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{kh(i,h-m|0,3220);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+72|0;a=c+68|0;c=f[o+96>>2]|0;o=0;while(1){h=o*3|0;if((h|0)==-1){q=0;r=12;break}i=f[d>>2]|0;g=f[i+(h<<2)>>2]|0;if((g|0)==-1){q=0;r=12;break}k=f[(f[m>>2]|0)+12>>2]|0;l=f[k+(g<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}g=f[a>>2]|0;f[g+(f[c+(o*12|0)>>2]<<2)>>2]=l;l=h+1|0;if((l|0)==-1){q=0;r=12;break}j=f[i+(l<<2)>>2]|0;if((j|0)==-1){q=0;r=12;break}l=f[k+(j<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}f[g+(f[c+(o*12|0)+4>>2]<<2)>>2]=l;l=h+2|0;if((l|0)==-1){q=0;r=12;break}h=f[i+(l<<2)>>2]|0;if((h|0)==-1){q=0;r=12;break}l=f[k+(h<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=12;break}f[g+(f[c+(o*12|0)+8>>2]<<2)>>2]=l;o=o+1|0;if(o>>>0>=e>>>0){q=1;r=12;break}}if((r|0)==12)return q|0;return 0}function bf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c+12|0;e=c+8|0;g=c+4|0;h=c;if(!b){i=dn(76)|0;j=dn(12)|0;k=f[(f[a+4>>2]|0)+80>>2]|0;f[j+4>>2]=0;f[j>>2]=3584;f[j+8>>2]=k;f[h>>2]=j;ml(i,h,0);j=i;f[g>>2]=j;i=a+12|0;k=f[i>>2]|0;if(k>>>0<(f[a+16>>2]|0)>>>0){f[g>>2]=0;f[k>>2]=j;f[i>>2]=k+4;l=g}else{yg(a+8|0,g);l=g}g=f[l>>2]|0;f[l>>2]=0;if(g|0)Va[f[(f[g>>2]|0)+4>>2]&127](g);g=f[h>>2]|0;f[h>>2]=0;if(!g){u=c;return 1}Va[f[(f[g>>2]|0)+4>>2]&127](g);u=c;return 1}g=f[f[a+8>>2]>>2]|0;f[d>>2]=b;a=g+4|0;h=g+8|0;l=f[h>>2]|0;if((l|0)==(f[g+12>>2]|0))Ci(a,d);else{f[l>>2]=b;f[h>>2]=l+4}l=f[d>>2]|0;b=g+16|0;k=g+20|0;g=f[k>>2]|0;i=f[b>>2]|0;j=g-i>>2;m=i;if((l|0)<(j|0)){n=m;o=l}else{i=l+1|0;f[e>>2]=-1;p=g;if(i>>>0<=j>>>0)if(i>>>0>>0?(g=m+(i<<2)|0,(g|0)!=(p|0)):0){f[k>>2]=p+(~((p+-4-g|0)>>>2)<<2);q=l;r=m}else{q=l;r=m}else{kh(b,i-j|0,e);q=f[d>>2]|0;r=f[b>>2]|0}n=r;o=q}f[n+(o<<2)>>2]=((f[h>>2]|0)-(f[a>>2]|0)>>2)+-1;u=c;return 1}function cf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;do if(e-g>>3>>>0>=b>>>0){i=a+4|0;j=f[i>>2]|0;k=j-g>>3;l=k>>>0>>0;m=l?k:b;n=j;if(m|0){j=m;m=h;while(1){o=c;p=f[o+4>>2]|0;q=m;f[q>>2]=f[o>>2];f[q+4>>2]=p;j=j+-1|0;if(!j)break;else m=m+8|0}}if(!l){m=h+(b<<3)|0;if((m|0)==(n|0))return;else{r=i;s=n+(~((n+-8-m|0)>>>3)<<3)|0;break}}else{m=b-k|0;j=m;p=n;while(1){q=c;o=f[q+4>>2]|0;t=p;f[t>>2]=f[q>>2];f[t+4>>2]=o;j=j+-1|0;if(!j)break;else p=p+8|0}r=i;s=n+(m<<3)|0;break}}else{p=g;if(!g)u=e;else{j=a+4|0;k=f[j>>2]|0;if((k|0)!=(h|0))f[j>>2]=k+(~((k+-8-g|0)>>>3)<<3);br(p);f[d>>2]=0;f[j>>2]=0;f[a>>2]=0;u=0}if(b>>>0>536870911)mq(a);j=u>>2;p=u>>3>>>0<268435455?(j>>>0>>0?b:j):536870911;if(p>>>0>536870911)mq(a);j=dn(p<<3)|0;k=a+4|0;f[k>>2]=j;f[a>>2]=j;f[d>>2]=j+(p<<3);p=b;l=j;while(1){o=c;t=f[o+4>>2]|0;q=l;f[q>>2]=f[o>>2];f[q+4>>2]=t;p=p+-1|0;if(!p)break;else l=l+8|0}r=k;s=j+(b<<3)|0}while(0);f[r>>2]=s;return}function df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=+$(n[b>>2]);g=+K(+e);h=+$(n[b+4>>2]);i=g+ +K(+h);g=+$(n[b+8>>2]);j=i+ +K(+g);b=j>1.0e-06;i=1.0/j;k=f[a+12>>2]|0;j=+(k|0);l=~~+J(+((b?i*e:1.0)*j+.5));m=~~+J(+((b?i*h:0.0)*j+.5));o=(l|0)>-1;p=k-(o?l:0-l|0)-((m|0)>-1?m:0-m|0)|0;l=(p|0)<0;q=(l?((m|0)>0?p:0-p|0):0)+m|0;m=l?0:p;p=(b?i*g:0.0)<0.0?0-m|0:m;do if(!o){if((q|0)<0)r=(p|0)>-1?p:0-p|0;else r=(f[a+8>>2]|0)-((p|0)>-1?p:0-p|0)|0;if((p|0)<0){s=(q|0)>-1?q:0-q|0;t=r;break}else{s=(f[a+8>>2]|0)-((q|0)>-1?q:0-q|0)|0;t=r;break}}else{s=k+p|0;t=k+q|0}while(0);q=(t|0)==0;p=(s|0)==0;r=f[a+8>>2]|0;if(!(s|t)){u=r;v=r;f[c>>2]=u;f[d>>2]=v;return}a=(r|0)==(s|0);if(q&a){u=s;v=s;f[c>>2]=u;f[d>>2]=v;return}o=(r|0)==(t|0);if(p&o){u=t;v=t;f[c>>2]=u;f[d>>2]=v;return}if(q&(k|0)<(s|0)){u=0;v=(k<<1)-s|0;f[c>>2]=u;f[d>>2]=v;return}if(o&(k|0)>(s|0)){u=t;v=(k<<1)-s|0;f[c>>2]=u;f[d>>2]=v;return}if(a&(k|0)>(t|0)){u=(k<<1)-t|0;v=s;f[c>>2]=u;f[d>>2]=v;return}if(!p){u=t;v=s;f[c>>2]=u;f[d>>2]=v;return}u=(k|0)<(t|0)?(k<<1)-t|0:t;v=0;f[c>>2]=u;f[d>>2]=v;return}function ef(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=a+4|0;d=b+4|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[c+16>>2]=f[d+16>>2];d=a+24|0;c=b+24|0;if((a|0)==(b|0))return a|0;e=b+28|0;g=f[e>>2]|0;if(!g)h=0;else{i=a+32|0;do if(g>>>0>f[i>>2]<<5>>>0){j=f[d>>2]|0;if(!j)k=g;else{br(j);f[d>>2]=0;f[i>>2]=0;f[a+28>>2]=0;k=f[e>>2]|0}if((k|0)<0)mq(d);else{j=((k+-1|0)>>>5)+1|0;l=dn(j<<2)|0;f[d>>2]=l;f[a+28>>2]=0;f[i>>2]=j;m=f[e>>2]|0;n=l;break}}else{m=g;n=f[d>>2]|0}while(0);Xl(n|0,f[c>>2]|0,((m+-1|0)>>>5<<2)+4|0)|0;h=f[e>>2]|0}f[a+28>>2]=h;h=a+36|0;e=b+36|0;m=b+40|0;b=f[m>>2]|0;if(!b)o=0;else{c=a+44|0;do if(b>>>0>f[c>>2]<<5>>>0){n=f[h>>2]|0;if(!n)p=b;else{br(n);f[h>>2]=0;f[c>>2]=0;f[a+40>>2]=0;p=f[m>>2]|0}if((p|0)<0)mq(h);else{n=((p+-1|0)>>>5)+1|0;d=dn(n<<2)|0;f[h>>2]=d;f[a+40>>2]=0;f[c>>2]=n;q=f[m>>2]|0;r=d;break}}else{q=b;r=f[h>>2]|0}while(0);Xl(r|0,f[e>>2]|0,((q+-1|0)>>>5<<2)+4|0)|0;o=f[m>>2]|0}f[a+40>>2]=o;return a|0}function ff(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],ye(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];ye(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;og(d);m=a+1068|0;Cm(m);k=a+1088|0;Cm(k);l=a+1108|0;Cm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];jb(a,i,h);Ke(d,e);mg(m,e);mg(k,e);mg(l,e);u=g;return 1}function gf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],ye(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];ye(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;og(d);m=a+1068|0;Cm(m);k=a+1088|0;Cm(k);l=a+1108|0;Cm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];mb(a,i,h);Ke(d,e);mg(m,e);mg(k,e);mg(l,e);u=g;return 1}function hf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;c=u;u=u+32|0;d=c;e=a+8|0;g=f[e>>2]|0;h=a+4|0;i=f[h>>2]|0;j=i;if(g-i>>2>>>0>=b>>>0){hj(i|0,0,b<<2|0)|0;f[h>>2]=i+(b<<2);u=c;return}k=f[a>>2]|0;l=i-k>>2;m=l+b|0;n=k;if(m>>>0>1073741823)mq(a);o=g-k|0;p=o>>1;q=o>>2>>>0<536870911?(p>>>0>>0?m:p):1073741823;f[d+12>>2]=0;f[d+16>>2]=a+8;do if(q)if(q>>>0>1073741823){p=ra(8)|0;Wo(p,14941);f[p>>2]=6944;va(p|0,1080,114)}else{r=dn(q<<2)|0;break}else r=0;while(0);f[d>>2]=r;p=r+(l<<2)|0;l=d+8|0;m=d+4|0;f[m>>2]=p;o=r+(q<<2)|0;q=d+12|0;f[q>>2]=o;r=p+(b<<2)|0;hj(p|0,0,b<<2|0)|0;f[l>>2]=r;if((j|0)==(n|0)){s=p;t=q;v=l;w=k;x=r;y=i;z=o;A=g}else{g=j;j=p;do{g=g+-4|0;p=f[g>>2]|0;f[g>>2]=0;f[j+-4>>2]=p;j=(f[m>>2]|0)+-4|0;f[m>>2]=j}while((g|0)!=(n|0));s=j;t=q;v=l;w=f[a>>2]|0;x=f[l>>2]|0;y=f[h>>2]|0;z=f[q>>2]|0;A=f[e>>2]|0}f[a>>2]=s;f[m>>2]=w;f[h>>2]=x;f[v>>2]=y;f[e>>2]=z;f[t>>2]=A;f[d>>2]=w;Wh(d);u=c;return}function jf(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=u;u=u+16|0;h=d;i=f[a+124>>2]|0;if(!i){u=d;return}j=i+-1|0;k=(j&i|0)==0;if(!k)if(i>>>0>g>>>0)l=g;else l=(g>>>0)%(i>>>0)|0;else l=j&g;m=f[(f[a+120>>2]|0)+(l<<2)>>2]|0;if(!m){u=d;return}n=f[m>>2]|0;if(!n){u=d;return}a:do if(k){m=n;while(1){o=f[m+4>>2]|0;p=(o|0)==(g|0);if(!(p|(o&j|0)==(l|0))){q=24;break}if(p?(f[m+8>>2]|0)==(g|0):0){r=m;break a}m=f[m>>2]|0;if(!m){q=24;break}}if((q|0)==24){u=d;return}}else{m=n;while(1){p=f[m+4>>2]|0;if((p|0)==(g|0)){if((f[m+8>>2]|0)==(g|0)){r=m;break a}}else{if(p>>>0>>0)s=p;else s=(p>>>0)%(i>>>0)|0;if((s|0)!=(l|0)){q=24;break}}m=f[m>>2]|0;if(!m){q=24;break}}if((q|0)==24){u=d;return}}while(0);q=f[r+12>>2]|0;if((q|0)==-1){u=d;return}f[h>>2]=q;f[h+4>>2]=c;b[h+8>>0]=e&1;e=a+112|0;c=f[e>>2]|0;if((c|0)==(f[a+116>>2]|0))ki(a+108|0,h);else{f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];f[c+8>>2]=f[h+8>>2];f[e>>2]=(f[e>>2]|0)+12}u=d;return}function kf(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=d[b>>1]|0;e=d[b+2>>1]|0;g=d[b+4>>1]|0;h=d[b+6>>1]|0;b=((((c^318)&65535)+239^e&65535)+239^g&65535)+239^h&65535;i=f[a+4>>2]|0;if(!i){j=0;return j|0}k=i+-1|0;l=(k&i|0)==0;if(!l)if(b>>>0>>0)m=b;else m=(b>>>0)%(i>>>0)|0;else m=b&k;n=f[(f[a>>2]|0)+(m<<2)>>2]|0;if(!n){j=0;return j|0}a=f[n>>2]|0;if(!a){j=0;return j|0}if(l){l=a;while(1){n=f[l+4>>2]|0;o=(n|0)==(b|0);if(!(o|(n&k|0)==(m|0))){j=0;p=25;break}if((((o?(o=l+8|0,(d[o>>1]|0)==c<<16>>16):0)?(d[o+2>>1]|0)==e<<16>>16:0)?(d[l+12>>1]|0)==g<<16>>16:0)?(d[o+6>>1]|0)==h<<16>>16:0){j=l;p=25;break}l=f[l>>2]|0;if(!l){j=0;p=25;break}}if((p|0)==25)return j|0}else q=a;while(1){a=f[q+4>>2]|0;if((a|0)==(b|0)){l=q+8|0;if((((d[l>>1]|0)==c<<16>>16?(d[l+2>>1]|0)==e<<16>>16:0)?(d[q+12>>1]|0)==g<<16>>16:0)?(d[l+6>>1]|0)==h<<16>>16:0){j=q;p=25;break}}else{if(a>>>0>>0)r=a;else r=(a>>>0)%(i>>>0)|0;if((r|0)!=(m|0)){j=0;p=25;break}}q=f[q>>2]|0;if(!q){j=0;p=25;break}}if((p|0)==25)return j|0;return 0}function lf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],ye(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];ye(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;Cm(d);m=a+32|0;Cm(m);k=a+52|0;Cm(k);l=a+72|0;Cm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];hb(a,i,h);mg(d,e);mg(m,e);mg(k,e);mg(l,e);u=g;return 1}function mf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],ye(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];ye(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;lk(d);m=a+44|0;Cm(m);k=a+64|0;Cm(k);l=a+84|0;Cm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];nb(a,i,h);fd(d,e);mg(m,e);mg(k,e);mg(l,e);u=g;return 1}function nf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;a=u;u=u+16|0;e=a+4|0;g=a;h=a+8|0;i=d+11|0;j=b[i>>0]|0;k=j<<24>>24<0;if(k){l=f[d+4>>2]|0;if(l>>>0>255){m=0;u=a;return m|0}else n=l}else n=j&255;if(!n){b[h>>0]=0;n=c+16|0;l=f[n+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}m=1;u=a;return m|0}n=d+4|0;l=f[n>>2]|0;b[h>>0]=k?l:j&255;k=c+16|0;o=k;p=f[o>>2]|0;q=f[o+4>>2]|0;if((q|0)>0|(q|0)==0&p>>>0>0){r=j;s=q;t=p;v=l}else{f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0;h=k;r=b[i>>0]|0;s=f[h+4>>2]|0;t=f[h>>2]|0;v=f[n>>2]|0}n=r<<24>>24<0;h=n?f[d>>2]|0:d;if(!((s|0)>0|(s|0)==0&t>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+(n?v:r&255)|0)|0}m=1;u=a;return m|0}function of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=a+4|0;d=f[a>>2]|0;e=((f[c>>2]|0)-d|0)/24|0;g=e+1|0;if(g>>>0>178956970)mq(a);h=a+8|0;i=((f[h>>2]|0)-d|0)/24|0;d=i<<1;j=i>>>0<89478485?(d>>>0>>0?g:d):178956970;do if(j)if(j>>>0>178956970){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{k=dn(j*24|0)|0;break}else k=0;while(0);d=k+(e*24|0)|0;g=d;i=k+(j*24|0)|0;f[d>>2]=1180;f[k+(e*24|0)+4>>2]=f[b+4>>2];_j(k+(e*24|0)+8|0,b+8|0);f[k+(e*24|0)+20>>2]=f[b+20>>2];b=d+24|0;e=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(e|0)){l=g;m=e;n=e}else{j=k;k=g;g=d;do{f[g+-24>>2]=1180;f[g+-20>>2]=f[j+-20>>2];d=g+-16|0;o=j+-16|0;f[d>>2]=0;p=g+-12|0;f[p>>2]=0;f[g+-8>>2]=0;f[d>>2]=f[o>>2];d=j+-12|0;f[p>>2]=f[d>>2];p=j+-8|0;f[g+-8>>2]=f[p>>2];f[p>>2]=0;f[d>>2]=0;f[o>>2]=0;f[g+-4>>2]=f[j+-4>>2];j=j+-24|0;g=k+-24|0;k=g}while((j|0)!=(e|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=b;f[h>>2]=i;i=m;if((n|0)!=(i|0)){h=n;do{h=h+-24|0;Va[f[f[h>>2]>>2]&127](h)}while((h|0)!=(i|0))}if(!m)return;br(m);return}function pf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b[c>>0]|0;e=b[c+1>>0]|0;g=b[c+2>>0]|0;h=b[c+3>>0]|0;c=(((d&255^318)+239^e&255)+239^g&255)+239^h&255;i=f[a+4>>2]|0;if(!i){j=0;return j|0}k=i+-1|0;l=(k&i|0)==0;if(!l)if(c>>>0>>0)m=c;else m=(c>>>0)%(i>>>0)|0;else m=c&k;n=f[(f[a>>2]|0)+(m<<2)>>2]|0;if(!n){j=0;return j|0}a=f[n>>2]|0;if(!a){j=0;return j|0}if(l){l=a;while(1){n=f[l+4>>2]|0;o=(n|0)==(c|0);if(!(o|(n&k|0)==(m|0))){j=0;p=25;break}if((((o?(o=l+8|0,(b[o>>0]|0)==d<<24>>24):0)?(b[o+1>>0]|0)==e<<24>>24:0)?(b[o+2>>0]|0)==g<<24>>24:0)?(b[o+3>>0]|0)==h<<24>>24:0){j=l;p=25;break}l=f[l>>2]|0;if(!l){j=0;p=25;break}}if((p|0)==25)return j|0}else q=a;while(1){a=f[q+4>>2]|0;if((a|0)==(c|0)){l=q+8|0;if((((b[l>>0]|0)==d<<24>>24?(b[l+1>>0]|0)==e<<24>>24:0)?(b[l+2>>0]|0)==g<<24>>24:0)?(b[l+3>>0]|0)==h<<24>>24:0){j=q;p=25;break}}else{if(a>>>0>>0)r=a;else r=(a>>>0)%(i>>>0)|0;if((r|0)!=(m|0)){j=0;p=25;break}}q=f[q>>2]|0;if(!q){j=0;p=25;break}}if((p|0)==25)return j|0;return 0}function qf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;l=a+40|0;f[a+44>>2]=g;g=a+36|0;m=f[g>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=a+48|0;s=a+52|0;a=i+4|0;t=j+4|0;v=h+4|0;if(n-o>>2>>>0>q>>>0){w=q;x=o}else{y=m;mq(y)}while(1){f[k>>2]=f[x+(w<<2)>>2];f[h>>2]=f[k>>2];tb(l,h,b,w)|0;m=X(w,e)|0;o=b+(m<<2)|0;q=c+(m<<2)|0;m=f[o+4>>2]|0;n=f[r>>2]|0;z=f[s>>2]|0;f[i>>2]=f[o>>2];f[a>>2]=m;f[j>>2]=n;f[t>>2]=z;Dd(h,p,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[v>>2];w=w+-1|0;if((w|0)<=-1){A=3;break}q=f[g>>2]|0;x=f[q>>2]|0;if((f[q+4>>2]|0)-x>>2>>>0<=w>>>0){y=q;A=4;break}}if((A|0)==3){u=d;return 1}else if((A|0)==4)mq(y);return 0}function rf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h;j=h+16|0;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Qa[f[(f[b>>2]|0)+52>>2]&127](b)|0;m=Ra[f[(f[b>>2]|0)+60>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=Ra[f[(f[b>>2]|0)+56>>2]&127](b,d)|0;if(!n){f[i>>2]=f[b+56>>2];f[i+4>>2]=l;f[i+12>>2]=m;f[i+8>>2]=m+12;Rd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[i>>2]=f[b+56>>2];f[i+4>>2]=n;f[i+12>>2]=m;f[i+8>>2]=m+12;Pd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function sf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;l=a+40|0;f[a+44>>2]=g;g=a+36|0;m=f[g>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=a+48|0;s=a+52|0;a=i+4|0;t=j+4|0;v=h+4|0;if(n-o>>2>>>0>q>>>0){w=q;x=o}else{y=m;mq(y)}while(1){f[k>>2]=f[x+(w<<2)>>2];f[h>>2]=f[k>>2];sb(l,h,b,w)|0;m=X(w,e)|0;o=b+(m<<2)|0;q=c+(m<<2)|0;m=f[o+4>>2]|0;n=f[r>>2]|0;z=f[s>>2]|0;f[i>>2]=f[o>>2];f[a>>2]=m;f[j>>2]=n;f[t>>2]=z;Dd(h,p,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[v>>2];w=w+-1|0;if((w|0)<=-1){A=3;break}q=f[g>>2]|0;x=f[q>>2]|0;if((f[q+4>>2]|0)-x>>2>>>0<=w>>>0){y=q;A=4;break}}if((A|0)==3){u=d;return 1}else if((A|0)==4)mq(y);return 0}function tf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=f[b>>2]|0;b=f[c>>2]|0;e=b-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;k=b;if(e>>>0<=h-i>>2>>>0){l=a+4|0;m=(f[l>>2]|0)-i>>2;n=e>>>0>m>>>0;o=n?d+(m<<2)|0:b;b=o-d|0;m=b>>2;if(m|0)Xl(i|0,d|0,b|0)|0;b=j+(m<<2)|0;if(!n){n=f[l>>2]|0;if((n|0)==(b|0))return;f[l>>2]=n+(~((n+-4-b|0)>>>2)<<2);return}b=f[c>>2]|0;c=o;if((b|0)==(c|0))return;n=f[l>>2]|0;m=b+-4-o|0;o=c;c=n;while(1){f[c>>2]=f[o>>2];o=o+4|0;if((o|0)==(b|0))break;else c=c+4|0}f[l>>2]=n+((m>>>2)+1<<2);return}m=i;if(!i)p=h;else{h=a+4|0;n=f[h>>2]|0;if((n|0)!=(j|0))f[h>>2]=n+(~((n+-4-i|0)>>>2)<<2);br(m);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;p=0}if(e>>>0>1073741823)mq(a);h=p>>1;m=p>>2>>>0<536870911?(h>>>0>>0?e:h):1073741823;if(m>>>0>1073741823)mq(a);h=dn(m<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(m<<2);m=d;if((k|0)==(m|0))return;g=k+-4-d|0;d=m;m=h;while(1){f[m>>2]=f[d>>2];d=d+4|0;if((d|0)==(k|0))break;else m=m+4|0}f[e>>2]=h+((g>>>2)+1<<2);return}function uf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=u;u=u+112|0;g=e+100|0;h=e;i=dn(120)|0;j=f[c+8>>2]|0;f[i+4>>2]=0;f[i>>2]=3296;k=i+8|0;l=i+12|0;m=l+44|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[k>>2]=3320;l=i+56|0;m=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[i+96>>2]=0;f[i+100>>2]=0;f[i+104>>2]=0;f[i+108>>2]=j;f[i+112>>2]=d;k=i+116|0;f[k>>2]=0;n=i;o=f[c+12>>2]|0;p=h+4|0;l=p+4|0;m=l+40|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[h>>2]=3320;l=h+48|0;m=l+36|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[h+88>>2]=0;f[h+92>>2]=0;f[h+96>>2]=0;l=o;f[p>>2]=l;m=((f[l+4>>2]|0)-(f[o>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Xg(h+24|0,m,g);m=f[p>>2]|0;p=(f[m+28>>2]|0)-(f[m+24>>2]|0)>>2;b[g>>0]=0;Xg(h+36|0,p,g);f[h+8>>2]=o;f[h+12>>2]=d;f[h+16>>2]=j;f[h+20>>2]=i;f[k>>2]=c+72;fh(i,h);f[a>>2]=n;Gi(h);u=e;return}function vf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(((d-g|0)/12|0)>>>0>=b>>>0){hj(g|0,0,b*12|0)|0;f[e>>2]=h+(b*12|0);return}i=f[a>>2]|0;j=(g-i|0)/12|0;g=j+b|0;k=i;if(g>>>0>357913941)mq(a);l=(d-i|0)/12|0;d=l<<1;m=l>>>0<178956970?(d>>>0>>0?g:d):357913941;do if(m)if(m>>>0>357913941){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{n=dn(m*12|0)|0;break}else n=0;while(0);d=n+(j*12|0)|0;j=d;g=n+(m*12|0)|0;hj(d|0,0,b*12|0)|0;m=d+(b*12|0)|0;if((h|0)==(k|0)){o=j;p=i;q=h}else{i=h;h=j;j=d;do{d=j+-12|0;b=i;i=i+-12|0;f[d>>2]=0;n=j+-8|0;f[n>>2]=0;f[j+-4>>2]=0;f[d>>2]=f[i>>2];d=b+-8|0;f[n>>2]=f[d>>2];n=b+-4|0;f[j+-4>>2]=f[n>>2];f[n>>2]=0;f[d>>2]=0;f[i>>2]=0;j=h+-12|0;h=j}while((i|0)!=(k|0));o=h;p=f[a>>2]|0;q=f[e>>2]|0}f[a>>2]=o;f[e>>2]=m;f[c>>2]=g;g=p;if((q|0)!=(g|0)){c=q;do{q=c;c=c+-12|0;m=f[c>>2]|0;if(m|0){e=q+-8|0;q=f[e>>2]|0;if((q|0)!=(m|0))f[e>>2]=q+(~((q+-4-m|0)>>>2)<<2);br(m)}}while((c|0)!=(g|0))}if(!p)return;br(p);return}function wf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[a+12>>2]|0;e=a+68|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{kh(i,h-m|0,3220);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+72|0;a=c+68|0;c=f[o+96>>2]|0;o=f[d+28>>2]|0;d=0;while(1){h=d*3|0;i=f[o+(h<<2)>>2]|0;if((i|0)==-1){q=0;r=11;break}g=f[(f[m>>2]|0)+12>>2]|0;k=f[g+(i<<2)>>2]|0;if(k>>>0>=p>>>0){q=0;r=11;break}i=f[a>>2]|0;f[i+(f[c+(d*12|0)>>2]<<2)>>2]=k;k=f[o+(h+1<<2)>>2]|0;if((k|0)==-1){q=0;r=11;break}l=f[g+(k<<2)>>2]|0;if(l>>>0>=p>>>0){q=0;r=11;break}f[i+(f[c+(d*12|0)+4>>2]<<2)>>2]=l;l=f[o+(h+2<<2)>>2]|0;if((l|0)==-1){q=0;r=11;break}h=f[g+(l<<2)>>2]|0;if(h>>>0>=p>>>0){q=0;r=11;break}f[i+(f[c+(d*12|0)+8>>2]<<2)>>2]=h;d=d+1|0;if(d>>>0>=e>>>0){q=1;r=11;break}}if((r|0)==11)return q|0;return 0}function xf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-4194304|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-4177920|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+4194304|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1077936128|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function yf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-2097152|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-2080768|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+6291456|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1075838976|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function zf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-1048576|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1032192|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+7340032|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1074790400|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Af(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Lm(j);yj(j,d,0,g&255,i,0,g<<1,0,0,0);i=uh(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+((X(d,g)|0)<<1)|0;r=n;s=f[r>>2]|0;t=on(s|0,f[r+4>>2]|0,p|0,0)|0;Rg((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;br(i)}br(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);br(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;br(v)}br(j)}k=w;u=a;return k|0}function Bf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Lm(j);yj(j,d,0,g&255,i,0,g<<2,0,0,0);i=uh(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+((X(d,g)|0)<<2)|0;r=n;s=f[r>>2]|0;t=on(s|0,f[r+4>>2]|0,p|0,0)|0;Rg((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;br(i)}br(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);br(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;br(v)}br(j)}k=w;u=a;return k|0}function Cf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-262144|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-245760|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8126464|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1074003968|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Df(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-131072|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-114688|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8257536|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1073872896|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Ef(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-32768|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-16384|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8355840|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1073774592|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Cn(e);eh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,o|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,o|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Ff(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=f[b>>2]|0;d=f[b+4>>2]|0;e=f[b+8>>2]|0;g=f[b+12>>2]|0;b=(((c^318)+239^d)+239^e)+239^g;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(b>>>0>>0)l=b;else l=(b>>>0)%(h>>>0)|0;else l=b&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(b|0);if(!(n|(m&j|0)==(l|0))){i=0;o=25;break}if((((n?(f[k+8>>2]|0)==(c|0):0)?(f[k+12>>2]|0)==(d|0):0)?(f[k+16>>2]|0)==(e|0):0)?(f[k+20>>2]|0)==(g|0):0){i=k;o=25;break}k=f[k>>2]|0;if(!k){i=0;o=25;break}}if((o|0)==25)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(b|0)){if((((f[p+8>>2]|0)==(c|0)?(f[p+12>>2]|0)==(d|0):0)?(f[p+16>>2]|0)==(e|0):0)?(f[p+20>>2]|0)==(g|0):0){i=p;o=25;break}}else{if(a>>>0>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=25;break}}p=f[p>>2]|0;if(!p){i=0;o=25;break}}if((o|0)==25)return i|0;return 0}function Gf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Lm(j);yj(j,d,0,g&255,i,0,g,0,0,0);i=uh(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+(X(d,g)|0)|0;r=n;s=f[r>>2]|0;t=on(s|0,f[r+4>>2]|0,p|0,0)|0;Rg((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;br(i)}br(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);br(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;br(v)}br(j)}k=w;u=a;return k|0}function Hf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h;j=h+16|0;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Qa[f[(f[b>>2]|0)+52>>2]&127](b)|0;m=Ra[f[(f[b>>2]|0)+60>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=Ra[f[(f[b>>2]|0)+56>>2]&127](b,d)|0;if(!n){f[i>>2]=f[b+56>>2];f[i+4>>2]=l;f[i+12>>2]=m;f[i+8>>2]=m+12;Od(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[i>>2]=f[b+56>>2];f[i+4>>2]=n;f[i+12>>2]=m;f[i+8>>2]=m+12;Nd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function If(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[d>>2]|0;g=f[d+4>>2]|0;if((e|0)==(g|0)){h=0;i=a+12|0;j=a+8|0}else{d=f[c>>2]|0;c=a+8|0;k=a+12|0;a=0;l=e;while(1){e=f[l>>2]|0;m=f[d+(e<<2)>>2]|0;if(m>>>0>>0)n=a;else{o=f[c>>2]|0;p=(f[k>>2]|0)-o|0;q=o;if((p|0)>0){o=p>>>2;p=0;do{r=f[q+(p<<2)>>2]|0;s=f[r+68>>2]|0;if(!(b[r+84>>0]|0))t=f[s+(e<<2)>>2]|0;else t=e;f[s+(m<<2)>>2]=t;p=p+1|0}while((p|0)<(o|0))}n=m+1|0}l=l+4|0;if((l|0)==(g|0)){h=n;i=k;j=c;break}else a=n}}n=f[i>>2]|0;a=f[j>>2]|0;if((n-a|0)>0){u=0;v=a;w=n}else return;while(1){n=f[v+(u<<2)>>2]|0;b[n+84>>0]=0;a=n+68|0;c=n+72|0;n=f[c>>2]|0;k=f[a>>2]|0;g=n-k>>2;l=k;k=n;if(h>>>0<=g>>>0)if(h>>>0>>0?(n=l+(h<<2)|0,(n|0)!=(k|0)):0){f[c>>2]=k+(~((k+-4-n|0)>>>2)<<2);x=v;y=w}else{x=v;y=w}else{kh(a,h-g|0,5908);x=f[j>>2]|0;y=f[i>>2]|0}u=u+1|0;if((u|0)>=(y-x>>2|0))break;else{v=x;w=y}}return}function Jf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;q=p>>2;if(q|0)Xl(i|0,b|0,p|0)|0;p=j+(q<<2)|0;if(!m){m=f[k>>2]|0;if((m|0)==(p|0))return;f[k>>2]=m+(~((m+-4-p|0)>>>2)<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=((c+-4-o|0)>>>2)+1|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+(p<<2);return}p=i;if(!i)r=h;else{h=a+4|0;l=f[h>>2]|0;if((l|0)!=(j|0))f[h>>2]=l+(~((l+-4-i|0)>>>2)<<2);br(p);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;r=0}if(e>>>0>1073741823)mq(a);h=r>>1;p=r>>2>>>0<536870911?(h>>>0>>0?e:h):1073741823;if(p>>>0>1073741823)mq(a);h=dn(p<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(p<<2);if((b|0)==(c|0))return;p=((c+-4-d|0)>>>2)+1|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+(p<<2);return}function Kf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;c=u;u=u+16|0;d=c;e=a+76|0;g=f[e>>2]|0;h=a+80|0;i=f[h>>2]|0;if((i|0)!=(g|0))f[h>>2]=i+(~((i+-4-g|0)>>>2)<<2);f[e>>2]=0;f[h>>2]=0;f[a+84>>2]=0;if(g|0)br(g);g=a+64|0;h=f[g>>2]|0;e=a+68|0;if((f[e>>2]|0)!=(h|0))f[e>>2]=h;f[g>>2]=0;f[e>>2]=0;f[a+72>>2]=0;if(h|0)br(h);h=b+4|0;e=f[h>>2]|0;g=f[b>>2]|0;i=((e-g|0)/12|0)*3|0;j=a+4|0;k=f[j>>2]|0;l=f[a>>2]|0;m=k-l>>2;n=l;l=k;k=g;if(i>>>0<=m>>>0)if(i>>>0>>0?(o=n+(i<<2)|0,(o|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-o|0)>>>2)<<2);p=e;q=g;r=k}else{p=e;q=g;r=k}else{oi(a,i-m|0);m=f[b>>2]|0;p=f[h>>2]|0;q=m;r=m}if((p|0)!=(q|0)){q=f[a>>2]|0;m=(p-r|0)/12|0;p=0;do{h=p*3|0;f[q+(h<<2)>>2]=f[r+(p*12|0)>>2];f[q+(h+1<<2)>>2]=f[r+(p*12|0)+4>>2];f[q+(h+2<<2)>>2]=f[r+(p*12|0)+8>>2];p=p+1|0}while(p>>>0>>0)}f[d>>2]=-1;if(!(oc(a,d)|0)){s=0;u=c;return s|0}Gc(a)|0;fb(a,f[d>>2]|0)|0;s=1;u=c;return s|0}function Lf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-16384|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;b[m>>0]=j;b[m+1>>0]=j>>>8;n=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;o=j+8372224|0;b[m>>0]=o;b[m+1>>0]=o>>>8;b[m+2>>0]=o>>>16;n=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;o=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+-1073758208|0;b[o>>0]=m;b[o+1>>0]=m>>>8;b[o+2>>0]=m>>>16;b[o+3>>0]=m>>>24;n=(f[l>>2]|0)+4|0;break}else{n=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;n=(f[l>>2]|0)+1|0}while(0);k=((n|0)<0)<<31>>31;Cn(e);eh(n,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;Xl(h+a|0,h|0,n|0)|0;Rg(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Tn(a|0,0,n|0,k|0)|0;k=Tn(h|0,I|0,g|0,j|0)|0;vl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)br(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c);u=d;return}function Mf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;q=p>>2;if(q|0)Xl(i|0,b|0,p|0)|0;p=j+(q<<2)|0;if(!m){m=f[k>>2]|0;if((m|0)==(p|0))return;f[k>>2]=m+(~((m+-4-p|0)>>>2)<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=c+-4-o|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+((p>>>2)+1<<2);return}p=i;if(!i)r=h;else{h=a+4|0;l=f[h>>2]|0;if((l|0)!=(j|0))f[h>>2]=l+(~((l+-4-i|0)>>>2)<<2);br(p);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;r=0}if(e>>>0>1073741823)mq(a);h=r>>1;p=r>>2>>>0<536870911?(h>>>0>>0?e:h):1073741823;if(p>>>0>1073741823)mq(a);h=dn(p<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(p<<2);if((b|0)==(c|0))return;p=c+-4-d|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+((p>>>2)+1<<2);return}function Nf(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0;g=u;u=u+80|0;h=g;i=g+64|0;Al(h);j=f[(f[a+8>>2]|0)+56>>2]|0;k=X(Ll(5)|0,d)|0;yj(h,j,0,d&255,5,0,k,((k|0)<0)<<31>>31,0,0);k=dn(96)|0;nl(k,h);pj(k,c)|0;f[i>>2]=k;Wi(a,i);k=f[i>>2]|0;f[i>>2]=0;if(k|0){i=k+88|0;c=f[i>>2]|0;f[i>>2]=0;if(c|0){i=f[c+8>>2]|0;if(i|0){h=c+12|0;if((f[h>>2]|0)!=(i|0))f[h>>2]=i;br(i)}br(c)}c=f[k+68>>2]|0;if(c|0){i=k+72|0;h=f[i>>2]|0;if((h|0)!=(c|0))f[i>>2]=h+(~((h+-4-c|0)>>>2)<<2);br(c)}c=k+64|0;h=f[c>>2]|0;f[c>>2]=0;if(h|0){c=f[h>>2]|0;if(c|0){i=h+4|0;if((f[i>>2]|0)!=(c|0))f[i>>2]=c;br(c)}br(h)}br(k)}if(!e){u=g;return}k=f[a+32>>2]|0;b[k+84>>0]=0;a=k+68|0;h=k+72|0;k=f[h>>2]|0;c=f[a>>2]|0;i=k-c>>2;d=k;if(i>>>0>>0){kh(a,e-i|0,1516);u=g;return}if(i>>>0<=e>>>0){u=g;return}i=c+(e<<2)|0;if((i|0)==(d|0)){u=g;return}f[h>>2]=d+(~((d+-4-i|0)>>>2)<<2);u=g;return}function Of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;c=u;u=u+16|0;d=c+4|0;e=c;g=a+4|0;h=f[g>>2]|0;i=a+8|0;j=f[i>>2]|0;if((j|0)==(h|0))k=h;else{l=j+(~((j+-4-h|0)>>>2)<<2)|0;f[i>>2]=l;k=l}l=a+16|0;h=f[l>>2]|0;j=a+20|0;m=f[j>>2]|0;n=h;if((m|0)!=(h|0))f[j>>2]=m+(~((m+-4-n|0)>>>2)<<2);m=f[b>>2]|0;h=f[b+4>>2]|0;if((m|0)==(h|0)){u=c;return}b=a+12|0;a=m;m=k;k=n;while(1){n=f[a>>2]|0;f[d>>2]=n;if((m|0)==(f[b>>2]|0)){Ci(g,d);o=f[l>>2]|0}else{f[m>>2]=n;f[i>>2]=m+4;o=k}n=f[d>>2]|0;p=f[j>>2]|0;q=p-o>>2;r=o;if((n|0)<(q|0)){s=r;t=n;v=o}else{w=n+1|0;f[e>>2]=-1;x=p;if(w>>>0<=q>>>0)if(w>>>0>>0?(p=r+(w<<2)|0,(p|0)!=(x|0)):0){f[j>>2]=x+(~((x+-4-p|0)>>>2)<<2);y=n;z=r;A=o}else{y=n;z=r;A=o}else{kh(l,w-q|0,e);q=f[l>>2]|0;y=f[d>>2]|0;z=q;A=q}s=z;t=y;v=A}m=f[i>>2]|0;f[s+(t<<2)>>2]=(m-(f[g>>2]|0)>>2)+-1;a=a+4|0;if((a|0)==(h|0))break;else k=v}u=c;return}function Pf(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=d[b>>1]|0;e=d[b+2>>1]|0;g=d[b+4>>1]|0;b=(((c^318)&65535)+239^e&65535)+239^g&65535;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(b>>>0>>0)l=b;else l=(b>>>0)%(h>>>0)|0;else l=b&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(b|0);if(!(n|(m&j|0)==(l|0))){i=0;o=23;break}if(((n?(n=k+8|0,(d[n>>1]|0)==c<<16>>16):0)?(d[n+2>>1]|0)==e<<16>>16:0)?(d[k+12>>1]|0)==g<<16>>16:0){i=k;o=23;break}k=f[k>>2]|0;if(!k){i=0;o=23;break}}if((o|0)==23)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(b|0)){k=p+8|0;if(((d[k>>1]|0)==c<<16>>16?(d[k+2>>1]|0)==e<<16>>16:0)?(d[p+12>>1]|0)==g<<16>>16:0){i=p;o=23;break}}else{if(a>>>0>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=23;break}}p=f[p>>2]|0;if(!p){i=0;o=23;break}}if((o|0)==23)return i|0;return 0}function Qf(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=u;u=u+32|0;d=c;e=a+16|0;g=e;h=f[g>>2]|0;i=f[g+4>>2]|0;if(!((i|0)>0|(i|0)==0&h>>>0>0)){u=c;return}g=Tn(f[(f[a+12>>2]|0)+4>>2]|0,0,7,0)|0;j=Wn(g|0,I|0,3)|0;g=I;if(!(b[a+24>>0]|0)){k=a+4|0;l=k;m=k;n=h;o=i}else{k=f[a>>2]|0;p=a+4|0;q=k+((f[p>>2]|0)-k)|0;k=Tn(h|0,i|0,8,0)|0;i=q+(0-k)|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;b[d+24>>0]=0;eh(j,g,d)|0;k=d+4|0;q=(f[k>>2]|0)-(f[d>>2]|0)|0;Xl(i+q|0,i+8|0,j|0)|0;Rg(i|0,f[d>>2]|0,q|0)|0;i=e;h=Tn(f[i>>2]|0,f[i+4>>2]|0,8-q|0,0)|0;q=e;f[q>>2]=h;f[q+4>>2]=I;q=d+12|0;h=f[q>>2]|0;f[q>>2]=0;if(h|0)br(h);h=f[d>>2]|0;if(h|0){if((f[k>>2]|0)!=(h|0))f[k>>2]=h;br(h)}h=e;l=p;m=p;n=f[h>>2]|0;o=f[h+4>>2]|0}h=f[l>>2]|0;l=f[a>>2]|0;p=h-l|0;k=Vn(j|0,g|0,n|0,o|0)|0;o=Tn(k|0,I|0,p|0,0)|0;k=l;l=h;if(p>>>0>=o>>>0){if(p>>>0>o>>>0?(h=k+o|0,(h|0)!=(l|0)):0)f[m>>2]=h}else ri(a,o-p|0);p=e;f[p>>2]=0;f[p+4>>2]=0;u=c;return}function Rf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f[c>>2]=1;d=a+4|0;e=c+8|0;g=c+12|0;c=f[e>>2]|0;i=(f[g>>2]|0)-c|0;if(i>>>0<4294967292){Bk(e,i+4|0,0);j=f[e>>2]|0}else j=c;c=j+i|0;i=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[c>>0]=i;b[c+1>>0]=i>>8;b[c+2>>0]=i>>16;b[c+3>>0]=i>>24;i=a+8|0;c=a+12|0;d=f[i>>2]|0;if((f[c>>2]|0)!=(d|0)){j=0;k=d;do{d=k+(j<<2)|0;l=f[e>>2]|0;m=(f[g>>2]|0)-l|0;if(m>>>0<4294967292){Bk(e,m+4|0,0);n=f[e>>2]|0}else n=l;l=n+m|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;j=j+1|0;k=f[i>>2]|0}while(j>>>0<(f[c>>2]|0)-k>>2>>>0)}k=a+20|0;a=f[e>>2]|0;c=(f[g>>2]|0)-a|0;if(c>>>0<4294967292){Bk(e,c+4|0,0);o=f[e>>2]|0;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}else{o=a;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}}function Sf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;do if(e-g>>2>>>0>=b>>>0){i=a+4|0;j=f[i>>2]|0;k=j-g>>2;l=k>>>0>>0;m=l?k:b;n=j;if(m|0){j=m;m=h;while(1){f[m>>2]=f[c>>2];j=j+-1|0;if(!j)break;else m=m+4|0}}if(!l){m=h+(b<<2)|0;if((m|0)==(n|0))return;else{o=i;p=n+(~((n+-4-m|0)>>>2)<<2)|0;break}}else{m=b-k|0;j=m;q=n;while(1){f[q>>2]=f[c>>2];j=j+-1|0;if(!j)break;else q=q+4|0}o=i;p=n+(m<<2)|0;break}}else{q=g;if(!g)r=e;else{j=a+4|0;k=f[j>>2]|0;if((k|0)!=(h|0))f[j>>2]=k+(~((k+-4-g|0)>>>2)<<2);br(q);f[d>>2]=0;f[j>>2]=0;f[a>>2]=0;r=0}if(b>>>0>1073741823)mq(a);j=r>>1;q=r>>2>>>0<536870911?(j>>>0>>0?b:j):1073741823;if(q>>>0>1073741823)mq(a);j=dn(q<<2)|0;k=a+4|0;f[k>>2]=j;f[a>>2]=j;f[d>>2]=j+(q<<2);q=b;l=j;while(1){f[l>>2]=f[c>>2];q=q+-1|0;if(!q)break;else l=l+4|0}o=k;p=j+(b<<2)|0}while(0);f[o>>2]=p;return}function Tf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=Qg(a,b,c,d,g)|0;i=f[e>>2]|0;j=f[d>>2]|0;k=f[g>>2]|0;g=f[k>>2]|0;l=(f[k+4>>2]|0)-g>>3;if(l>>>0<=i>>>0)mq(k);m=g;if(l>>>0<=j>>>0)mq(k);if((f[m+(i<<3)>>2]|0)>>>0>=(f[m+(j<<3)>>2]|0)>>>0){n=h;return n|0}f[d>>2]=i;f[e>>2]=j;j=f[d>>2]|0;e=f[c>>2]|0;if(l>>>0<=j>>>0)mq(k);if(l>>>0<=e>>>0)mq(k);if((f[m+(j<<3)>>2]|0)>>>0>=(f[m+(e<<3)>>2]|0)>>>0){n=h+1|0;return n|0}f[c>>2]=j;f[d>>2]=e;e=f[c>>2]|0;d=f[b>>2]|0;if(l>>>0<=e>>>0)mq(k);if(l>>>0<=d>>>0)mq(k);if((f[m+(e<<3)>>2]|0)>>>0>=(f[m+(d<<3)>>2]|0)>>>0){n=h+2|0;return n|0}f[b>>2]=e;f[c>>2]=d;d=f[b>>2]|0;c=f[a>>2]|0;if(l>>>0<=d>>>0)mq(k);if(l>>>0<=c>>>0)mq(k);if((f[m+(d<<3)>>2]|0)>>>0>=(f[m+(c<<3)>>2]|0)>>>0){n=h+3|0;return n|0}f[a>>2]=d;f[b>>2]=c;n=h+4|0;return n|0}function Uf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=b[c>>0]|0;e=b[c+1>>0]|0;g=b[c+2>>0]|0;c=((d&255^318)+239^e&255)+239^g&255;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(c>>>0>>0)l=c;else l=(c>>>0)%(h>>>0)|0;else l=c&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(c|0);if(!(n|(m&j|0)==(l|0))){i=0;o=23;break}if(((n?(n=k+8|0,(b[n>>0]|0)==d<<24>>24):0)?(b[n+1>>0]|0)==e<<24>>24:0)?(b[n+2>>0]|0)==g<<24>>24:0){i=k;o=23;break}k=f[k>>2]|0;if(!k){i=0;o=23;break}}if((o|0)==23)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(c|0)){k=p+8|0;if(((b[k>>0]|0)==d<<24>>24?(b[k+1>>0]|0)==e<<24>>24:0)?(b[k+2>>0]|0)==g<<24>>24:0){i=p;o=23;break}}else{if(a>>>0>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=23;break}}p=f[p>>2]|0;if(!p){i=0;o=23;break}}if((o|0)==23)return i|0;return 0}function Vf(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=u;u=u+16|0;c=b;d=a+36|0;e=a+4|0;g=a+8|0;h=(f[g>>2]|0)-(f[e>>2]|0)>>2;i=a+40|0;j=f[i>>2]|0;k=f[d>>2]|0;l=j-k>>2;m=k;k=j;if(h>>>0<=l>>>0){if(h>>>0>>0?(j=m+(h<<2)|0,(j|0)!=(k|0)):0){m=k;do{k=m+-4|0;f[i>>2]=k;n=f[k>>2]|0;f[k>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);m=f[i>>2]|0}while((m|0)!=(j|0))}}else ng(d,h-l|0);if((f[g>>2]|0)==(f[e>>2]|0)){o=1;u=b;return o|0}l=a+52|0;h=a+48|0;j=0;while(1){Xa[f[(f[a>>2]|0)+56>>2]&15](c,a,j);m=(f[d>>2]|0)+(j<<2)|0;i=f[c>>2]|0;f[c>>2]=0;n=f[m>>2]|0;f[m>>2]=i;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);n=f[c>>2]|0;f[c>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);n=f[(f[d>>2]|0)+(j<<2)>>2]|0;if(!n){o=0;p=19;break}if(j>>>0<(f[l>>2]|0)>>>0?f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0:0)Pp(n);j=j+1|0;if(j>>>0>=(f[g>>2]|0)-(f[e>>2]|0)>>2>>>0){o=1;p=19;break}}if((p|0)==19){u=b;return o|0}return 0}function Wf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d+4|0;g=d;Nh(f[c+12>>2]|0,b)|0;h=f[c+8>>2]|0;a:do if(h|0){i=b+16|0;j=b+4|0;k=h;while(1){l=k;if(!(nf(0,b,l+8|0)|0)){m=0;break}n=l+20|0;o=(f[l+24>>2]|0)-(f[n>>2]|0)|0;Nh(o,b)|0;l=f[n>>2]|0;n=i;p=f[n+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[j>>2];f[e>>2]=f[g>>2];ye(b,e,l,l+o|0)|0}k=f[k>>2]|0;if(!k)break a}u=d;return m|0}while(0);Nh(f[c+32>>2]|0,b)|0;e=f[c+28>>2]|0;if(!e){m=1;u=d;return m|0}else q=e;while(1){e=q;if(!(nf(0,b,e+8|0)|0)){m=0;r=10;break}Wf(a,b,f[e+20>>2]|0)|0;q=f[q>>2]|0;if(!q){m=1;r=10;break}}if((r|0)==10){u=d;return m|0}return 0}function Xf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+8|0;i=a+12|0;j=f[h>>2]|0;if((f[i>>2]|0)==(j|0)){k=dn(76)|0;pn(k,b);l=k;f[g>>2]=l;k=f[i>>2]|0;if(k>>>0<(f[a+16>>2]|0)>>>0){f[g>>2]=0;f[k>>2]=l;f[i>>2]=k+4;m=g}else{yg(h,g);m=g}g=f[m>>2]|0;f[m>>2]=0;if(!g){u=c;return 1}Va[f[(f[g>>2]|0)+4>>2]&127](g);u=c;return 1}g=f[j>>2]|0;f[d>>2]=b;j=g+4|0;m=g+8|0;h=f[m>>2]|0;if((h|0)==(f[g+12>>2]|0))Ci(j,d);else{f[h>>2]=b;f[m>>2]=h+4}h=f[d>>2]|0;b=g+16|0;k=g+20|0;g=f[k>>2]|0;i=f[b>>2]|0;l=g-i>>2;a=i;if((h|0)<(l|0)){n=a;o=h}else{i=h+1|0;f[e>>2]=-1;p=g;if(i>>>0<=l>>>0)if(i>>>0>>0?(g=a+(i<<2)|0,(g|0)!=(p|0)):0){f[k>>2]=p+(~((p+-4-g|0)>>>2)<<2);q=h;r=a}else{q=h;r=a}else{kh(b,i-l|0,e);q=f[d>>2]|0;r=f[b>>2]|0}n=r;o=q}f[n+(o<<2)>>2]=((f[m>>2]|0)-(f[j>>2]|0)>>2)+-1;u=c;return 1}function Yf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0>j-k>>2>>>0){m=k;if(!k)n=j;else{j=a+4|0;o=f[j>>2]|0;if((o|0)!=(l|0))f[j>>2]=o+(~((o+-4-k|0)>>>2)<<2);br(m);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;n=0}if(h>>>0>1073741823)mq(a);j=n>>1;m=n>>2>>>0<536870911?(j>>>0>>0?h:j):1073741823;if(m>>>0>1073741823)mq(a);j=dn(m<<2)|0;n=a+4|0;f[n>>2]=j;f[a>>2]=j;f[i>>2]=j+(m<<2);if((g|0)<=0)return;Rg(j|0,b|0,g|0)|0;f[n>>2]=j+(g>>>2<<2);return}g=a+4|0;a=f[g>>2]|0;j=a-k>>2;k=h>>>0>j>>>0;h=k?b+(j<<2)|0:c;c=a;j=a;if((h|0)==(b|0))p=l;else{a=h+-4-e|0;e=b;b=l;while(1){f[b>>2]=f[e>>2];e=e+4|0;if((e|0)==(h|0))break;else b=b+4|0}p=l+((a>>>2)+1<<2)|0}if(k){k=d-h|0;if((k|0)<=0)return;Rg(j|0,h|0,k|0)|0;f[g>>2]=(f[g>>2]|0)+(k>>>2<<2);return}else{if((p|0)==(c|0))return;f[g>>2]=c+(~((c+-4-p|0)>>>2)<<2);return}}function Zf(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0;g=u;u=u+96|0;h=g+40|0;i=g;Gm(h,d);we(i,c,d);th(h,i);sj(i+24|0,f[i+28>>2]|0);Dj(i+12|0,f[i+16>>2]|0);sj(i,f[i+4>>2]|0);Si(a,h,e);if(!(f[a>>2]|0)){e=a+4|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);f[c+40>>2]=f[h+40>>2];f[c+44>>2]=f[h+44>>2];f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}f[h>>2]=2968;sj(h+28|0,f[h+32>>2]|0);Dj(h+16|0,f[h+20>>2]|0);sj(h+4|0,f[h+8>>2]|0);u=g;return}function _f(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=f[b>>2]|0;d=f[b+4>>2]|0;e=f[b+8>>2]|0;b=((c^318)+239^d)+239^e;g=f[a+4>>2]|0;if(!g){h=0;return h|0}i=g+-1|0;j=(i&g|0)==0;if(!j)if(b>>>0>>0)k=b;else k=(b>>>0)%(g>>>0)|0;else k=b&i;l=f[(f[a>>2]|0)+(k<<2)>>2]|0;if(!l){h=0;return h|0}a=f[l>>2]|0;if(!a){h=0;return h|0}if(j){j=a;while(1){l=f[j+4>>2]|0;m=(l|0)==(b|0);if(!(m|(l&i|0)==(k|0))){h=0;n=23;break}if(((m?(f[j+8>>2]|0)==(c|0):0)?(f[j+12>>2]|0)==(d|0):0)?(f[j+16>>2]|0)==(e|0):0){h=j;n=23;break}j=f[j>>2]|0;if(!j){h=0;n=23;break}}if((n|0)==23)return h|0}else o=a;while(1){a=f[o+4>>2]|0;if((a|0)==(b|0)){if(((f[o+8>>2]|0)==(c|0)?(f[o+12>>2]|0)==(d|0):0)?(f[o+16>>2]|0)==(e|0):0){h=o;n=23;break}}else{if(a>>>0>>0)p=a;else p=(a>>>0)%(g>>>0)|0;if((p|0)!=(k|0)){h=0;n=23;break}}o=f[o>>2]|0;if(!o){h=0;n=23;break}}if((n|0)==23)return h|0;return 0}function $f(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=u;u=u+16|0;g=e;if(!(ih(a,c,d)|0)){h=0;u=e;return h|0}if((b[(f[a+8>>2]|0)+24>>0]|0)!=3){h=0;u=e;return h|0}i=f[c+48>>2]|0;c=dn(32)|0;f[g>>2]=c;f[g+8>>2]=-2147483616;f[g+4>>2]=17;j=c;k=12932;l=j+17|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[c+17>>0]=0;c=i+16|0;k=f[c>>2]|0;if(k){j=c;l=k;a:while(1){k=l;while(1){if((f[k+16>>2]|0)>=(d|0))break;m=f[k+4>>2]|0;if(!m){n=j;break a}else k=m}l=f[k>>2]|0;if(!l){n=k;break}else j=k}if(((n|0)!=(c|0)?(f[n+16>>2]|0)<=(d|0):0)?(d=n+20|0,(sh(d,g)|0)!=0):0)o=yk(d,g,-1)|0;else p=12}else p=12;if((p|0)==12)o=yk(i,g,-1)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if((o|0)<1){h=0;u=e;return h|0}tp(a+40|0,o);h=1;u=e;return h|0}function ag(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c;g=d-e|0;h=a+8|0;i=f[h>>2]|0;j=f[a>>2]|0;k=j;if(g>>>0>(i-j|0)>>>0){if(!j)l=i;else{i=a+4|0;if((f[i>>2]|0)!=(k|0))f[i>>2]=k;br(k);f[h>>2]=0;f[i>>2]=0;f[a>>2]=0;l=0}if((g|0)<0)mq(a);i=l<<1;m=l>>>0<1073741823?(i>>>0>>0?g:i):2147483647;if((m|0)<0)mq(a);i=dn(m)|0;l=a+4|0;f[l>>2]=i;f[a>>2]=i;f[h>>2]=i+m;if((c|0)==(d|0))return;else{n=c;o=i}do{b[o>>0]=b[n>>0]|0;n=n+1|0;o=(f[l>>2]|0)+1|0;f[l>>2]=o}while((n|0)!=(d|0));return}n=a+4|0;a=(f[n>>2]|0)-j|0;j=g>>>0>a>>>0;g=c+a|0;a=j?g:d;if((a|0)==(c|0))p=k;else{o=c;c=k;while(1){b[c>>0]=b[o>>0]|0;o=o+1|0;if((o|0)==(a|0))break;else c=c+1|0}p=k+(a-e)|0}if(!j){if((f[n>>2]|0)==(p|0))return;f[n>>2]=p;return}if((a|0)==(d|0))return;a=g;g=f[n>>2]|0;do{b[g>>0]=b[a>>0]|0;a=a+1|0;g=(f[n>>2]|0)+1|0;f[n>>2]=g}while((a|0)!=(d|0));return}function bg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=c>>>1&1431655765|c<<1&-1431655766;c=d>>>2&858993459|d<<2&-858993460;d=c>>>4&252645135|c<<4&-252645136;c=d>>>8&16711935|d<<8&-16711936;d=32-b|0;e=(c>>>16|c<<16)>>>d;c=e-(e>>>1&1431655765)|0;g=(c>>>2&858993459)+(c&858993459)|0;c=(X((g>>>4)+g&252645135,16843009)|0)>>>24;g=b-c|0;h=f[a>>2]|0;i=h;j=Tn(f[i>>2]|0,f[i+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;g=h;f[g>>2]=j;f[g+4>>2]=I;g=h+8|0;h=g;j=Tn(f[h>>2]|0,f[h+4>>2]|0,c|0,0)|0;c=g;f[c>>2]=j;f[c+4>>2]=I;c=a+28|0;j=f[c>>2]|0;g=32-j|0;h=a+24|0;do if((g|0)>=(b|0)){i=-1>>>d<>2]&~i|i&e<>2]=k;i=j+b|0;f[c>>2]=i;if((i|0)!=32)return;i=a+16|0;l=f[i>>2]|0;if((l|0)==(f[a+20>>2]|0)){Ci(a+12|0,h);m=0;n=0;break}else{f[l>>2]=k;f[i>>2]=l+4;m=0;n=0;break}}else{l=-1>>>j<>2]&~l|l&e<>2]=i;l=a+16|0;k=f[l>>2]|0;if((k|0)==(f[a+20>>2]|0))Ci(a+12|0,h);else{f[k>>2]=i;f[l>>2]=k+4}k=b-g|0;m=k;n=-1>>>(32-k|0)&e>>>g}while(0);f[h>>2]=n;f[c>>2]=m;return}function cg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=c&255;g=(d|0)!=0;a:do if(g&(a&3|0)!=0){h=c&255;i=a;j=d;while(1){if((b[i>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=i+1|0;o=j+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=n;j=o}else{q=n;r=o;s=p;m=5;break}}}else{q=a;r=d;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=q;u=0}b:do if((m|0)==6){q=c&255;if((b[k>>0]|0)==q<<24>>24){t=k;u=l}else{r=X(e,16843009)|0;c:do if(l>>>0>3){s=k;g=l;while(1){d=f[s>>2]^r;if((d&-2139062144^-2139062144)&d+-16843009|0)break;d=s+4|0;a=g+-4|0;if(a>>>0>3){s=d;g=a}else{v=d;w=a;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!w){t=v;u=0;break}else{x=v;y=w}while(1){if((b[x>>0]|0)==q<<24>>24){t=x;u=y;break b}r=x+1|0;y=y+-1|0;if(!y){t=r;u=0;break}else x=r}}}while(0);return (u|0?t:0)|0}function dg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=e;do if((d|0)==(e|0)){h=a+8|0;i=f[h>>2]|0;j=a+12|0;k=f[j>>2]|0;l=k;if(i>>>0>>0){k=i;m=((l-k>>2)+1|0)/2|0;n=i+(m<<2)|0;o=k-d|0;k=o>>2;p=n+(0-k<<2)|0;if(!k){q=n;r=i}else{Xl(p|0,d|0,o|0)|0;q=p;r=f[h>>2]|0}f[c>>2]=q;f[h>>2]=r+(m<<2);s=q;break}m=l-g>>1;l=(m|0)==0?1:m;if(l>>>0>1073741823){m=ra(8)|0;Wo(m,14941);f[m>>2]=6944;va(m|0,1080,114)}m=dn(l<<2)|0;p=m;o=m+((l+3|0)>>>2<<2)|0;n=o;k=m+(l<<2)|0;if((d|0)==(i|0)){t=n;u=d}else{l=o;m=n;v=d;do{f[l>>2]=f[v>>2];l=m+4|0;m=l;v=v+4|0}while((v|0)!=(i|0));t=m;u=f[a>>2]|0}f[a>>2]=p;f[c>>2]=n;f[h>>2]=t;f[j>>2]=k;if(!u)s=o;else{br(u);s=f[c>>2]|0}}else s=d;while(0);f[s+-4>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+-4;return}function eg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+4|0;if((f[i>>2]|0)==-1){j=0;u=d;return j|0}k=f[a+8>>2]|0;l=c+16|0;m=l;n=f[m>>2]|0;o=f[m+4>>2]|0;if(!((o|0)>0|(o|0)==0&n>>>0>0)){m=(f[a+12>>2]|0)-k|0;p=c+4|0;f[g>>2]=f[p>>2];f[e>>2]=f[g>>2];ye(c,e,k,k+m|0)|0;m=l;k=f[m>>2]|0;q=f[m+4>>2]|0;m=a+20|0;if((q|0)>0|(q|0)==0&k>>>0>0){r=q;s=k;t=g}else{f[g>>2]=f[p>>2];f[e>>2]=f[g>>2];ye(c,e,m,m+4|0)|0;m=l;r=f[m+4>>2]|0;s=f[m>>2]|0;t=g}}else{r=o;s=n;t=g}b[h>>0]=f[i>>2];if(!((r|0)>0|(r|0)==0&s>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}j=1;u=d;return j|0}function fg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;e=u;u=u+16|0;g=e+4|0;h=e;i=a+8|0;a=f[i>>2]|0;j=f[a+40>>2]|0;k=_q((j|0)>-1?j:-1)|0;l=c+4|0;m=f[l>>2]|0;n=f[c>>2]|0;if((m|0)==(n|0)){$q(k);u=e;return 1}o=d+16|0;p=d+4|0;q=k+j|0;j=0;r=n;n=a;s=a;a=m;while(1){m=f[r+(j<<2)>>2]|0;if(!(b[n+84>>0]|0))t=f[(f[n+68>>2]|0)+(m<<2)>>2]|0;else t=m;m=s+48|0;v=f[m>>2]|0;w=f[m+4>>2]|0;m=s+40|0;x=f[m>>2]|0;y=on(x|0,f[m+4>>2]|0,t|0,0)|0;m=Tn(y|0,I|0,v|0,w|0)|0;Rg(k|0,(f[f[s>>2]>>2]|0)+m|0,x|0)|0;x=o;m=f[x+4>>2]|0;if((m|0)>0|(m|0)==0&(f[x>>2]|0)>>>0>0){z=r;A=a}else{f[h>>2]=f[p>>2];f[g>>2]=f[h>>2];ye(d,g,k,q)|0;z=f[c>>2]|0;A=f[l>>2]|0}x=j+1|0;if(x>>>0>=A-z>>2>>>0)break;m=f[i>>2]|0;j=x;r=z;n=m;s=m;a=A}$q(k);u=e;return 1}function gg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=(f[b>>2]|0)*3|0;if((d|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}b=f[a+12>>2]|0;h=f[b+12>>2]|0;if((f[h+(d<<2)>>2]|0)==-1){e=0;g=d;f[c>>2]=g;return e|0}i=f[b>>2]|0;b=f[a+152>>2]|0;if((f[b+(f[i+(d<<2)>>2]<<2)>>2]|0)==-1){a=d+1|0;j=((a>>>0)%3|0|0)==0?d+-2|0:a;if((j|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}if((f[h+(j<<2)>>2]|0)==-1){e=0;g=j;f[c>>2]=g;return e|0}if((f[b+(f[i+(j<<2)>>2]<<2)>>2]|0)==-1){a=j+1|0;k=((a>>>0)%3|0|0)==0?j+-2|0:a;if((k|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}if((f[h+(k<<2)>>2]|0)==-1){e=0;g=k;f[c>>2]=g;return e|0}if((f[b+(f[i+(k<<2)>>2]<<2)>>2]|0)==-1){i=k+1|0;e=1;g=((i>>>0)%3|0|0)==0?k+-2|0:i;f[c>>2]=g;return e|0}else l=k}else l=j}else l=d;while(1){d=(((l>>>0)%3|0|0)==0?2:-1)+l|0;if((d|0)==-1)break;j=f[h+(d<<2)>>2]|0;if((j|0)==-1)break;d=j+(((j>>>0)%3|0|0)==0?2:-1)|0;if((d|0)==-1)break;else l=d}e=0;g=(((l>>>0)%3|0|0)==0?2:-1)+l|0;f[c>>2]=g;return e|0}function hg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=a+4|0;g=f[e>>2]|0;if(!g){f[c>>2]=e;h=e;return h|0}e=b[d+11>>0]|0;i=e<<24>>24<0;j=i?f[d+4>>2]|0:e&255;e=i?f[d>>2]|0:d;d=a+4|0;a=g;while(1){g=a+16|0;i=b[g+11>>0]|0;k=i<<24>>24<0;l=k?f[a+20>>2]|0:i&255;i=l>>>0>>0;m=i?l:j;if((m|0)!=0?(n=Pk(e,k?f[g>>2]|0:g,m)|0,(n|0)!=0):0)if((n|0)<0)o=8;else o=10;else if(j>>>0>>0)o=8;else o=10;if((o|0)==8){o=0;n=f[a>>2]|0;if(!n){o=9;break}else{p=a;q=n}}else if((o|0)==10){o=0;n=j>>>0>>0?j:l;if((n|0)!=0?(l=Pk(k?f[g>>2]|0:g,e,n)|0,(l|0)!=0):0){if((l|0)>=0){o=16;break}}else o=12;if((o|0)==12?(o=0,!i):0){o=16;break}r=a+4|0;i=f[r>>2]|0;if(!i){o=15;break}else{p=r;q=i}}d=p;a=q}if((o|0)==9){f[c>>2]=a;h=a;return h|0}else if((o|0)==15){f[c>>2]=a;h=r;return h|0}else if((o|0)==16){f[c>>2]=a;h=d;return h|0}return 0}function ig(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;d=u;u=u+32|0;e=d+24|0;g=d+16|0;h=d+8|0;i=d;j=a+4|0;k=f[j>>2]|0;l=f[b>>2]|0;m=f[b+4>>2]|0;b=f[c>>2]|0;n=f[c+4>>2]|0;c=b-l<<3;f[j>>2]=k-m+n+c;j=(f[a>>2]|0)+(k>>>5<<2)|0;a=k&31;k=j;if((m|0)!=(a|0)){f[e>>2]=l;f[e+4>>2]=m;f[g>>2]=b;f[g+4>>2]=n;f[h>>2]=k;f[h+4>>2]=a;ke(i,e,g,h);u=d;return}h=n-m+c|0;c=l;if((h|0)>0){if(!m){o=h;p=j;q=0;r=l;s=c}else{l=32-m|0;n=(h|0)<(l|0)?h:l;g=-1>>>(l-n|0)&-1<>2]=f[j>>2]&~g|f[c>>2]&g;g=n+m|0;l=c+4|0;o=h-n|0;p=j+(g>>>5<<2)|0;q=g&31;r=l;s=l}l=(o|0)/32|0;Xl(p|0,r|0,l<<2|0)|0;r=o-(l<<5)|0;o=p+(l<<2)|0;p=o;if((r|0)>0){g=-1>>>(32-r|0);f[o>>2]=f[o>>2]&~g|f[s+(l<<2)>>2]&g;t=r;v=p}else{t=q;v=p}}else{t=m;v=k}f[i>>2]=v;f[i+4>>2]=t;u=d;return}function jg(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=u;u=u+16|0;h=g;i=c+4|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;j=dn(16)|0;f[h>>2]=j;f[h+8>>2]=-2147483632;f[h+4>>2]=15;k=j;l=12916;m=k+15|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[j+15>>0]=0;j=yk(i,h,-1)|0;if((b[h+11>>0]|0)<0)br(f[h>>2]|0);switch(j|0){case -1:{if((Yh(i)|0)==10)n=6;else n=5;break}case 1:{n=5;break}default:n=6}if((n|0)==5){j=dn(68)|0;Xo(j);o=j}else if((n|0)==6){n=dn(64)|0;Gp(n);o=n}vo(o,d);Ad(a,o,i,e);if(f[a>>2]|0){p=f[o>>2]|0;q=p+4|0;r=f[q>>2]|0;Va[r&127](o);u=g;return}e=a+4|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);f[c+40>>2]=f[o+52>>2];f[c+44>>2]=f[o+60>>2];f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;p=f[o>>2]|0;q=p+4|0;r=f[q>>2]|0;Va[r&127](o);u=g;return}function kg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;c=a+8|0;d=f[c>>2]|0;e=a+12|0;g=f[e>>2]|0;h=g;do if((d|0)==(g|0)){i=a+4|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(j>>>0>k>>>0){m=j;n=((m-l>>2)+1|0)/-2|0;o=j+(n<<2)|0;p=d-m|0;m=p>>2;if(!m)q=j;else{Xl(o|0,j|0,p|0)|0;q=f[i>>2]|0}p=o+(m<<2)|0;f[c>>2]=p;f[i>>2]=q+(n<<2);r=p;break}p=h-l>>1;l=(p|0)==0?1:p;if(l>>>0>1073741823){p=ra(8)|0;Wo(p,14941);f[p>>2]=6944;va(p|0,1080,114)}p=dn(l<<2)|0;n=p;m=p+(l>>>2<<2)|0;o=m;s=p+(l<<2)|0;if((j|0)==(d|0)){t=o;u=k}else{k=m;m=o;l=j;do{f[k>>2]=f[l>>2];k=m+4|0;m=k;l=l+4|0}while((l|0)!=(d|0));t=m;u=f[a>>2]|0}f[a>>2]=n;f[i>>2]=o;f[c>>2]=t;f[e>>2]=s;if(!u)r=t;else{br(u);r=f[c>>2]|0}}else r=d;while(0);f[r>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+4;return}function lg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=a+12|0;h=f[g>>2]|0;$j(f[a+4>>2]|0,(f[h+56>>2]|0)-(f[h+52>>2]|0)>>2);h=a+76|0;a=f[h>>2]|0;if(!a){i=f[(f[g>>2]|0)+64>>2]|0;g=(f[i+4>>2]|0)-(f[i>>2]|0)>>2;i=(g>>>0)/3|0;if(g>>>0<=2){j=1;u=b;return j|0}g=0;while(1){f[d>>2]=g*3;f[c>>2]=f[d>>2];g=g+1|0;if(!(Tb(e,c)|0)){j=0;k=10;break}if((g|0)>=(i|0)){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}else{i=f[a>>2]|0;if((f[a+4>>2]|0)==(i|0)){j=1;u=b;return j|0}a=0;g=i;while(1){f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(Tb(e,c)|0)){j=0;k=10;break}i=f[h>>2]|0;g=f[i>>2]|0;if(a>>>0>=(f[i+4>>2]|0)-g>>2>>>0){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}return 0}function mg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+12|0;i=a+4|0;j=f[i>>2]|0;if((j|0)==(f[a+8>>2]|0)){Ci(a,h);k=f[i>>2]|0}else{f[j>>2]=f[h>>2];l=j+4|0;f[i>>2]=l;k=l}l=f[a>>2]|0;f[g>>2]=k-l;k=b+16|0;j=k;m=f[j+4>>2]|0;if(!((m|0)>0|(m|0)==0&(f[j>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=f[a>>2]|0;m=f[g>>2]|0;g=k;k=f[g+4>>2]|0;if((k|0)>0|(k|0)==0&(f[g>>2]|0)>>>0>0){n=j;o=e}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,j,j+m|0)|0;n=f[a>>2]|0;o=e}}else{n=l;o=e}e=f[i>>2]|0;if((e|0)==(n|0)){f[h>>2]=0;p=a+16|0;f[p>>2]=0;u=c;return}f[i>>2]=e+(~((e+-4-n|0)>>>2)<<2);f[h>>2]=0;p=a+16|0;f[p>>2]=0;u=c;return}function ng(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){hj(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}i=f[a>>2]|0;j=g-i>>2;g=j+b|0;k=i;if(g>>>0>1073741823)mq(a);l=d-i|0;d=l>>1;m=l>>2>>>0<536870911?(d>>>0>>0?g:d):1073741823;do if(m)if(m>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{n=dn(m<<2)|0;break}else n=0;while(0);d=n+(j<<2)|0;hj(d|0,0,b<<2|0)|0;b=d;j=n+(m<<2)|0;m=n+(g<<2)|0;if((h|0)==(k|0)){o=b;p=i;q=h}else{i=h;h=b;b=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[b+-4>>2]=d;b=h+-4|0;h=b}while((i|0)!=(k|0));o=h;p=f[a>>2]|0;q=f[e>>2]|0}f[a>>2]=o;f[e>>2]=m;f[c>>2]=j;j=p;if((q|0)!=(j|0)){c=q;do{c=c+-4|0;q=f[c>>2]|0;f[c>>2]=0;if(q|0)Va[f[(f[q>>2]|0)+4>>2]&127](q)}while((c|0)!=(j|0))}if(!p)return;br(p);return}function og(a){a=a|0;lk(a);lk(a+32|0);lk(a+64|0);lk(a+96|0);lk(a+128|0);lk(a+160|0);lk(a+192|0);lk(a+224|0);lk(a+256|0);lk(a+288|0);lk(a+320|0);lk(a+352|0);lk(a+384|0);lk(a+416|0);lk(a+448|0);lk(a+480|0);lk(a+512|0);lk(a+544|0);lk(a+576|0);lk(a+608|0);lk(a+640|0);lk(a+672|0);lk(a+704|0);lk(a+736|0);lk(a+768|0);lk(a+800|0);lk(a+832|0);lk(a+864|0);lk(a+896|0);lk(a+928|0);lk(a+960|0);lk(a+992|0);lk(a+1024|0);return}function pg(a,c,d,e,g,h){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=$(h);var i=0,j=0,k=0,l=0,m=0,n=0;i=u;u=u+16|0;j=i;k=i+4|0;f[j>>2]=c;c=a+4|0;a=dn(32)|0;f[k>>2]=a;f[k+8>>2]=-2147483616;f[k+4>>2]=17;l=a;m=12932;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[a+17>>0]=0;Nj(wd(c,j)|0,k,d);if((b[k+11>>0]|0)<0)br(f[k>>2]|0);d=dn(32)|0;f[k>>2]=d;f[k+8>>2]=-2147483616;f[k+4>>2]=19;l=d;m=13005;n=l+19|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[d+19>>0]=0;ci(wd(c,j)|0,k,g,e);if((b[k+11>>0]|0)<0)br(f[k>>2]|0);e=dn(32)|0;f[k>>2]=e;f[k+8>>2]=-2147483616;f[k+4>>2]=18;l=e;m=13025;n=l+18|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[e+18>>0]=0;Lj(wd(c,j)|0,k,h);if((b[k+11>>0]|0)>=0){u=i;return}br(f[k>>2]|0);u=i;return}function qg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0<=j-k>>2>>>0){m=a+4|0;n=(f[m>>2]|0)-k>>2;o=h>>>0>n>>>0;p=o?b+(n<<2)|0:c;c=p;n=c-e|0;e=n>>2;if(e|0)Xl(k|0,b|0,n|0)|0;n=l+(e<<2)|0;if(o){o=d-c|0;if((o|0)<=0)return;Rg(f[m>>2]|0,p|0,o|0)|0;f[m>>2]=(f[m>>2]|0)+(o>>>2<<2);return}else{o=f[m>>2]|0;if((o|0)==(n|0))return;f[m>>2]=o+(~((o+-4-n|0)>>>2)<<2);return}}n=k;if(!k)q=j;else{j=a+4|0;o=f[j>>2]|0;if((o|0)!=(l|0))f[j>>2]=o+(~((o+-4-k|0)>>>2)<<2);br(n);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;q=0}if(h>>>0>1073741823)mq(a);j=q>>1;n=q>>2>>>0<536870911?(j>>>0>>0?h:j):1073741823;if(n>>>0>1073741823)mq(a);j=dn(n<<2)|0;h=a+4|0;f[h>>2]=j;f[a>>2]=j;f[i>>2]=j+(n<<2);if((g|0)<=0)return;Rg(j|0,b|0,g|0)|0;f[h>>2]=j+(g>>>2<<2);return}function rg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,v=0.0;e=u;u=u+16|0;g=e;h=c+1|0;f[g>>2]=0;i=g+4|0;f[i>>2]=0;f[g+8>>2]=0;do if(h)if(h>>>0>1073741823)mq(g);else{j=dn(h<<2)|0;f[g>>2]=j;k=j+(h<<2)|0;f[g+8>>2]=k;hj(j|0,0,(c<<2)+4|0)|0;f[i>>2]=k;l=j;m=k;n=j;break}else{l=0;m=0;n=0}while(0);if((b|0)>0){g=0;do{j=l+(f[a+(g<<2)>>2]<<2)|0;f[j>>2]=(f[j>>2]|0)+1;g=g+1|0}while((g|0)!=(b|0))}o=+(b|0);if((c|0)<0){p=0;q=0.0}else{c=0;r=0.0;b=0;while(1){g=f[l+(b<<2)>>2]|0;s=+(g|0);if((g|0)>0){t=c+1|0;v=r+ +Fg(s/o)*s}else{t=c;v=r}b=b+1|0;if((b|0)==(h|0)){p=t;q=v;break}else{c=t;r=v}}}if(d|0)f[d>>2]=p;v=-q;p=~~v>>>0;d=+K(v)>=1.0?(v>0.0?~~+Y(+J(v/4294967296.0),4294967295.0)>>>0:~~+W((v-+(~~v>>>0))/4294967296.0)>>>0):0;if(!l){I=d;u=e;return p|0}if((m|0)!=(l|0))f[i>>2]=m+(~((m+-4-l|0)>>>2)<<2);br(n);I=d;u=e;return p|0}function sg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=a+12|0;h=f[g>>2]|0;$j(f[a+4>>2]|0,(f[h+28>>2]|0)-(f[h+24>>2]|0)>>2);h=a+76|0;a=f[h>>2]|0;if(!a){i=f[g>>2]|0;g=(f[i+4>>2]|0)-(f[i>>2]|0)>>2;i=(g>>>0)/3|0;if(g>>>0<=2){j=1;u=b;return j|0}g=0;while(1){f[d>>2]=g*3;f[c>>2]=f[d>>2];g=g+1|0;if(!(Wb(e,c)|0)){j=0;k=10;break}if((g|0)>=(i|0)){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}else{i=f[a>>2]|0;if((f[a+4>>2]|0)==(i|0)){j=1;u=b;return j|0}a=0;g=i;while(1){f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];a=a+1|0;if(!(Wb(e,c)|0)){j=0;k=10;break}i=f[h>>2]|0;g=f[i>>2]|0;if(a>>>0>=(f[i+4>>2]|0)-g>>2>>>0){j=1;k=10;break}}if((k|0)==10){u=b;return j|0}}return 0}function tg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e+4|0;h=e;i=dn(32)|0;f[a>>2]=i;f[a+4>>2]=c+4;c=a+8|0;b[c>>0]=0;f[i+16>>2]=f[d>>2];a=i+20|0;f[i+24>>2]=0;f[i+28>>2]=0;j=i+24|0;f[a>>2]=j;i=f[d+4>>2]|0;k=d+8|0;if((i|0)==(k|0)){b[c>>0]=1;u=e;return}d=j;j=i;while(1){i=j+16|0;f[h>>2]=d;f[g>>2]=f[h>>2];Wg(a,g,i,i)|0;i=f[j+4>>2]|0;if(!i){l=j+8|0;m=f[l>>2]|0;if((f[m>>2]|0)==(j|0))n=m;else{m=l;do{l=f[m>>2]|0;m=l+8|0;o=f[m>>2]|0}while((f[o>>2]|0)!=(l|0));n=o}}else{m=i;while(1){o=f[m>>2]|0;if(!o)break;else m=o}n=m}if((n|0)==(k|0))break;else j=n}b[c>>0]=1;u=e;return}function ug(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;f[e>>2]=b;g=a+8|0;if(((f[a+12>>2]|0)-(f[g>>2]|0)>>2|0)<=(b|0))jh(g,b+1|0);h=f[(f[c>>2]|0)+56>>2]|0;do if((h|0)<5){i=a+20+(h*12|0)+4|0;j=f[i>>2]|0;if((j|0)==(f[a+20+(h*12|0)+8>>2]|0)){Ci(a+20+(h*12|0)|0,e);break}else{f[j>>2]=b;f[i>>2]=j+4;break}}while(0);b=f[c>>2]|0;h=f[e>>2]|0;f[b+60>>2]=h;e=(f[g>>2]|0)+(h<<2)|0;f[c>>2]=0;c=f[e>>2]|0;f[e>>2]=b;if(!c){u=d;return}b=c+88|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0){b=f[e+8>>2]|0;if(b|0){h=e+12|0;if((f[h>>2]|0)!=(b|0))f[h>>2]=b;br(b)}br(e)}e=f[c+68>>2]|0;if(e|0){b=c+72|0;h=f[b>>2]|0;if((h|0)!=(e|0))f[b>>2]=h+(~((h+-4-e|0)>>>2)<<2);br(e)}e=c+64|0;h=f[e>>2]|0;f[e>>2]=0;if(h|0){e=f[h>>2]|0;if(e|0){b=h+4|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;br(e)}br(h)}br(c);u=d;return}function vg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;d=u;u=u+48|0;e=d+16|0;g=d;h=d+32|0;i=a+28|0;j=f[i>>2]|0;f[h>>2]=j;k=a+20|0;l=(f[k>>2]|0)-j|0;f[h+4>>2]=l;f[h+8>>2]=b;f[h+12>>2]=c;b=l+c|0;l=a+60|0;f[g>>2]=f[l>>2];f[g+4>>2]=h;f[g+8>>2]=2;j=ro(Aa(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=2;m=b;n=h;o=j;while(1){if((o|0)<0)break;m=m-o|0;p=f[n+4>>2]|0;q=o>>>0>p>>>0;r=q?n+8|0:n;s=g+(q<<31>>31)|0;t=o-(q?p:0)|0;f[r>>2]=(f[r>>2]|0)+t;p=r+4|0;f[p>>2]=(f[p>>2]|0)-t;f[e>>2]=f[l>>2];f[e+4>>2]=r;f[e+8>>2]=s;o=ro(Aa(146,e|0)|0)|0;if((m|0)==(o|0)){v=3;break a}else{g=s;n=r}}f[a+16>>2]=0;f[i>>2]=0;f[k>>2]=0;f[a>>2]=f[a>>2]|32;if((g|0)==2)w=0;else w=c-(f[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=f[a+44>>2]|0;f[a+16>>2]=v+(f[a+48>>2]|0);a=v;f[i>>2]=a;f[k>>2]=a;w=c}u=d;return w|0}function wg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;f[a>>2]=5880;b=f[a+68>>2]|0;if(b|0){c=a+72|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+56>>2]|0;if(b|0){d=a+60|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+44>>2]|0;if(b|0){c=a+48|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+32>>2]|0;if(b|0){d=a+36|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+20>>2]|0;if(b|0){c=a+24|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}Sh(a+8|0);b=a+4|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=a+40|0;d=f[b>>2]|0;if(d|0){c=a+44|0;e=f[c>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-4|0;f[c>>2]=e;i=f[e>>2]|0;f[e>>2]=0;if(i|0){Qi(i);br(i)}h=f[c>>2]|0}while((h|0)!=(d|0));g=f[b>>2]|0}br(g)}Qi(a);br(a);return}function xg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if(((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(f[(f[d>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)==0:0)?(j=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if(((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(f[(f[d>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)==0:0)?(k=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if((((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(f[(f[d>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0:0)?(h=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function yg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)mq(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{k=dn(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;e=d;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(b|0)){l=e;m=b;n=b}else{i=k;k=e;e=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[e+-4>>2]=d;e=k+-4|0;k=e}while((i|0)!=(b|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=j;f[h>>2]=g;g=m;if((n|0)!=(g|0)){h=n;do{h=h+-4|0;n=f[h>>2]|0;f[h>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n)}while((h|0)!=(g|0))}if(!m)return;br(m);return}function zg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+4|0;a=f[d>>2]|0;do if(a|0){e=b[c+11>>0]|0;g=e<<24>>24<0;h=g?f[c+4>>2]|0:e&255;e=g?f[c>>2]|0:c;g=d;i=a;a:while(1){j=i;while(1){k=j+16|0;l=b[k+11>>0]|0;m=l<<24>>24<0;n=m?f[j+20>>2]|0:l&255;l=h>>>0>>0?h:n;if((l|0)!=0?(o=Pk(m?f[k>>2]|0:k,e,l)|0,(o|0)!=0):0){if((o|0)>=0)break}else p=6;if((p|0)==6?(p=0,n>>>0>=h>>>0):0)break;n=f[j+4>>2]|0;if(!n){q=g;break a}else j=n}i=f[j>>2]|0;if(!i){q=j;break}else g=j}if((q|0)!=(d|0)){g=q+16|0;i=b[g+11>>0]|0;n=i<<24>>24<0;o=n?f[q+20>>2]|0:i&255;i=o>>>0>>0?o:h;if(i|0?(l=Pk(e,n?f[g>>2]|0:g,i)|0,l|0):0){if((l|0)<0)break;else r=q;return r|0}if(h>>>0>=o>>>0){r=q;return r|0}}}while(0);r=d;return r|0}function Ag(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/12|0)>>>0>=b>>>0){i=b;j=h;do{f[j>>2]=f[c>>2];f[j+4>>2]=f[c+4>>2];f[j+8>>2]=f[c+8>>2];j=(f[g>>2]|0)+12|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/12|0;h=j+b|0;if(h>>>0>357913941)mq(a);k=(e-i|0)/12|0;i=k<<1;e=k>>>0<178956970?(i>>>0>>0?h:i):357913941;do if(e)if(e>>>0>357913941){i=ra(8)|0;Wo(i,14941);f[i>>2]=6944;va(i|0,1080,114)}else{l=dn(e*12|0)|0;break}else l=0;while(0);i=l+(j*12|0)|0;j=l+(e*12|0)|0;e=b;b=i;l=i;do{f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];b=l+12|0;l=b;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;b=(f[g>>2]|0)-e|0;c=i+(((b|0)/-12|0)*12|0)|0;if((b|0)>0)Rg(c|0,e|0,b|0)|0;f[a>>2]=c;f[g>>2]=l;f[d>>2]=j;if(!e)return;br(e);return}function Bg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)mq(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{k=dn(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;e=d;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(b|0)){l=e;m=b;n=b}else{i=k;k=e;e=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[e+-4>>2]=d;e=k+-4|0;k=e}while((i|0)!=(b|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=j;f[h>>2]=g;g=m;if((n|0)!=(g|0)){h=n;do{h=h+-4|0;n=f[h>>2]|0;f[h>>2]=0;if(n|0){Qi(n);br(n)}}while((h|0)!=(g|0))}if(!m)return;br(m);return}function Cg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=f[b>>2]|0;g=f[a>>2]|0;h=f[d>>2]|0;d=f[h>>2]|0;i=(f[h+4>>2]|0)-d>>3;if(i>>>0<=e>>>0)mq(h);j=d;if(i>>>0<=g>>>0)mq(h);d=f[j+(e<<3)>>2]|0;k=f[c>>2]|0;if(i>>>0<=k>>>0)mq(h);l=j+(g<<3)|0;m=(f[j+(k<<3)>>2]|0)>>>0>>0;if(d>>>0<(f[l>>2]|0)>>>0){if(m){f[a>>2]=k;f[c>>2]=g;n=1;return n|0}f[a>>2]=e;f[b>>2]=g;d=f[c>>2]|0;if(i>>>0<=d>>>0)mq(h);if((f[j+(d<<3)>>2]|0)>>>0>=(f[l>>2]|0)>>>0){n=1;return n|0}f[b>>2]=d;f[c>>2]=g;n=2;return n|0}if(!m){n=0;return n|0}f[b>>2]=k;f[c>>2]=e;e=f[b>>2]|0;c=f[a>>2]|0;if(i>>>0<=e>>>0)mq(h);if(i>>>0<=c>>>0)mq(h);if((f[j+(e<<3)>>2]|0)>>>0>=(f[j+(c<<3)>>2]|0)>>>0){n=1;return n|0}f[a>>2]=e;f[b>>2]=c;n=2;return n|0}function Dg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=u;u=u+96|0;g=e+40|0;h=e;Am(g,c);we(h,b,c);th(g,h);sj(h+24|0,f[h+28>>2]|0);Dj(h+12|0,f[h+16>>2]|0);sj(h,f[h+4>>2]|0);Si(a,g,d);f[g>>2]=2968;sj(g+28|0,f[g+32>>2]|0);Dj(g+16|0,f[g+20>>2]|0);sj(g+4|0,f[g+8>>2]|0);u=e;return}function Eg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a=u;u=u+16|0;e=a;if(!b){g=0;u=a;return g|0}h=b+96|0;i=b+100|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;b=f[i>>2]|0;j=f[h>>2]|0;k=(b-j|0)/12|0;l=j;j=b;if(k>>>0>=c>>>0){if(k>>>0>c>>>0?(b=l+(c*12|0)|0,(b|0)!=(j|0)):0)f[i>>2]=j+(~(((j+-12-b|0)>>>0)/12|0)*12|0);if(!c){g=1;u=a;return g|0}}else Ag(h,c-k|0,e);k=0;b=f[h>>2]|0;while(1){j=k*3|0;l=f[d+(j<<2)>>2]|0;m=f[d+(j+1<<2)>>2]|0;n=f[d+(j+2<<2)>>2]|0;j=((f[i>>2]|0)-b|0)/12|0;o=k;k=k+1|0;if(o>>>0>>0){p=b;q=b}else{f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;Ag(h,k-j|0,e);j=f[h>>2]|0;p=j;q=j}f[p+(o*12|0)>>2]=l;f[p+(o*12|0)+4>>2]=m;f[p+(o*12|0)+8>>2]=n;if((k|0)==(c|0)){g=1;break}else b=q}u=a;return g|0}function Fg(a){a=+a;var b=0,c=0,d=0,e=0.0,g=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,q=0.0,r=0.0,t=0.0;p[s>>3]=a;b=f[s>>2]|0;c=f[s+4>>2]|0;d=(c|0)<0;do if(d|c>>>0<1048576){if((b|0)==0&(c&2147483647|0)==0){e=-1.0/(a*a);break}if(d){e=(a-a)/0.0;break}else{p[s>>3]=a*18014398509481984.0;g=f[s+4>>2]|0;h=-1077;i=g;j=f[s>>2]|0;k=g;l=9;break}}else if(c>>>0<=2146435071)if((b|0)==0&0==0&(c|0)==1072693248)e=0.0;else{h=-1023;i=c;j=b;k=c;l=9}else e=a;while(0);if((l|0)==9){l=i+614242|0;f[s>>2]=j;f[s+4>>2]=(l&1048575)+1072079006;a=+p[s>>3]+-1.0;m=a*a*.5;n=a/(a+2.0);o=n*n;q=o*o;p[s>>3]=a-m;j=f[s+4>>2]|0;f[s>>2]=0;f[s+4>>2]=j;r=+p[s>>3];t=a-r-m+n*(m+(q*(q*(q*.15313837699209373+.22222198432149784)+.3999999999940942)+o*(q*(q*(q*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));q=r*1.4426950407214463;o=+(h+(l>>>20)|0);m=q+o;e=m+(q+(o-m)+(t*1.4426950407214463+(t+r)*1.6751713164886512e-10))}return +e}function Gg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d;g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=17;h=g;i=12804;j=h+17|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+17>>0]=0;g=c+16|0;i=f[g>>2]|0;if(i){h=g;j=i;a:while(1){i=j;while(1){if((f[i+16>>2]|0)>=(a|0))break;k=f[i+4>>2]|0;if(!k){l=h;break a}else i=k}j=f[i>>2]|0;if(!j){l=i;break}else h=i}if(((l|0)!=(g|0)?(f[l+16>>2]|0)<=(a|0):0)?(a=l+20|0,(sh(a,e)|0)!=0):0)m=a;else n=10}else n=10;if((n|0)==10)m=c;c=yk(m,e,-1)|0;if((b[e+11>>0]|0)>=0){o=(c|0)==-1;p=c>>>0>6;q=p?-2:c;r=o?-1:q;u=d;return r|0}br(f[e>>2]|0);o=(c|0)==-1;p=c>>>0>6;q=p?-2:c;r=o?-1:q;u=d;return r|0}function Hg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;g=f[c>>2]|0;f[c>>2]=0;f[e>>2]=g;ug(a,b,e);g=f[e>>2]|0;f[e>>2]=0;if(g|0){e=g+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){h=c+12|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;br(e)}br(c)}c=f[g+68>>2]|0;if(c|0){e=g+72|0;h=f[e>>2]|0;if((h|0)!=(c|0))f[e>>2]=h+(~((h+-4-c|0)>>>2)<<2);br(c)}c=g+64|0;h=f[c>>2]|0;f[c>>2]=0;if(h|0){c=f[h>>2]|0;if(c|0){e=h+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;br(c)}br(h)}br(g)}g=a+84|0;h=a+88|0;a=f[h>>2]|0;c=f[g>>2]|0;e=a-c>>2;if((e|0)>(b|0)){u=d;return}i=b+1|0;b=a;if(i>>>0>e>>>0){nh(g,i-e|0);u=d;return}if(i>>>0>=e>>>0){u=d;return}e=c+(i<<2)|0;if((e|0)==(b|0)){u=d;return}f[h>>2]=b+(~((b+-4-e|0)>>>2)<<2);u=d;return}function Ig(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;g=a+4|0;f[g>>2]=c;f[a+8>>2]=f[c+56>>2];h=f[a+184>>2]|0;i=a+188|0;j=f[i>>2]|0;if((j|0)!=(h|0))f[i>>2]=j+(~((j+-4-h|0)>>>2)<<2);h=f[c+48>>2]|0;c=dn(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=14285;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(sh(h,e)|0)==0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);h=f[(f[g>>2]|0)+48>>2]|0;if(c){c=(Yh(h)|0)>5&1;b[a+352>>0]=c;u=d;return 1}c=dn(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=14285;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Oj(h,e,0)|0)&1;b[a+352>>0]=c;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return 1}function Jg(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0;c=a+108|0;d=(f[a+112>>2]|0)-(f[c>>2]|0)|0;e=(d|0)/12|0;g=a+4|0;Nh(e,f[(f[g>>2]|0)+44>>2]|0)|0;if(!d)return 1;d=0;a=0;while(1){i=f[c>>2]|0;j=i+(d*12|0)+4|0;Nh((f[j>>2]|0)-a|0,f[(f[g>>2]|0)+44>>2]|0)|0;Nh((f[j>>2]|0)-(f[i+(d*12|0)>>2]|0)|0,f[(f[g>>2]|0)+44>>2]|0)|0;d=d+1|0;if(d>>>0>=e>>>0)break;else a=f[j>>2]|0}li(f[(f[g>>2]|0)+44>>2]|0,e,0,0)|0;a=0;do{d=f[(f[g>>2]|0)+44>>2]|0;j=d+16|0;i=f[j+4>>2]|0;if((i|0)>0|(i|0)==0&(f[j>>2]|0)>>>0>0){j=f[d+12>>2]|0;d=j+4|0;i=f[d>>2]|0;k=b[(f[c>>2]|0)+(a*12|0)+8>>0]&1;l=i>>>3;m=i&7;i=(f[j>>2]|0)+l|0;b[i>>0]=(1<>0]|0);i=(f[j>>2]|0)+l|0;b[i>>0]=k<>0]|0);f[d>>2]=(f[d>>2]|0)+1}a=a+1|0}while(a>>>0>>0);Qf(f[(f[g>>2]|0)+44>>2]|0);return 1}function Kg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;g=a+4|0;f[g>>2]=c;f[a+8>>2]=f[c+56>>2];h=f[a+184>>2]|0;i=a+188|0;j=f[i>>2]|0;if((j|0)!=(h|0))f[i>>2]=j+(~((j+-4-h|0)>>>2)<<2);h=f[c+48>>2]|0;c=dn(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=14285;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(sh(h,e)|0)==0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);h=f[(f[g>>2]|0)+48>>2]|0;if(c){c=(Yh(h)|0)>5&1;b[a+288>>0]=c;u=d;return 1}c=dn(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=14285;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Oj(h,e,0)|0)&1;b[a+288>>0]=c;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return 1}function Lg(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=u;u=u+32|0;h=g+16|0;i=g+8|0;j=g;k=d-e|0;d=a+8|0;if((k|0)>0){a=0-e|0;l=i+4|0;m=j+4|0;n=h+4|0;o=k;do{k=b+(o<<2)|0;p=k+(a<<2)|0;q=c+(o<<2)|0;r=f[k+4>>2]|0;s=f[p>>2]|0;t=f[p+4>>2]|0;f[i>>2]=f[k>>2];f[l>>2]=r;f[j>>2]=s;f[m>>2]=t;Dd(h,d,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[n>>2];o=o-e|0}while((o|0)>0)}o=e>>>0>1073741823?-1:e<<2;e=_q(o)|0;hj(e|0,0,o|0)|0;o=f[b+4>>2]|0;n=f[e>>2]|0;m=f[e+4>>2]|0;f[i>>2]=f[b>>2];f[i+4>>2]=o;f[j>>2]=n;f[j+4>>2]=m;Dd(h,d,i,j);f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];$q(e);u=g;return 1}function Mg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+32|0;d=c+12|0;e=c;g=f[b+100>>2]|0;h=f[b+96>>2]|0;b=g-h|0;i=(b|0)/12|0;f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;k=h;do if(b)if(i>>>0>357913941)mq(d);else{l=dn(b)|0;f[d>>2]=l;f[d+8>>2]=l+(i*12|0);hj(l|0,0,b|0)|0;f[j>>2]=l+b;m=l;break}else m=0;while(0);f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;if((g|0)!=(h|0)){h=e+4|0;g=e+8|0;b=0;do{l=k+(b*12|0)|0;f[e>>2]=f[l>>2];f[e+4>>2]=f[l+4>>2];f[e+8>>2]=f[l+8>>2];f[m+(b*12|0)>>2]=f[e>>2];f[m+(b*12|0)+4>>2]=f[h>>2];f[m+(b*12|0)+8>>2]=f[g>>2];b=b+1|0}while(b>>>0>>0)}Cj(a,d);a=f[d>>2]|0;if(!a){u=c;return}d=f[j>>2]|0;if((d|0)!=(a|0))f[j>>2]=d+(~(((d+-12-a|0)>>>0)/12|0)*12|0);br(a);u=c;return}function Ng(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(c>>>0>4294967279)mq(a);d=a+11|0;e=b[d>>0]|0;g=e<<24>>24<0;if(g){h=f[a+4>>2]|0;i=(f[a+8>>2]&2147483647)+-1|0}else{h=e&255;i=10}j=h>>>0>c>>>0?h:c;c=j>>>0<11;k=c?10:(j+16&-16)+-1|0;do if((k|0)!=(i|0)){do if(c){j=f[a>>2]|0;if(g){l=0;m=j;n=a;o=13}else{Lo(a,j,(e&255)+1|0)|0;br(j);o=16}}else{j=k+1|0;p=dn(j)|0;if(g){l=1;m=f[a>>2]|0;n=p;o=13;break}else{Lo(p,a,(e&255)+1|0)|0;q=p;r=j;s=a+4|0;o=15;break}}while(0);if((o|0)==13){j=a+4|0;Lo(n,m,(f[j>>2]|0)+1|0)|0;br(m);if(l){q=n;r=k+1|0;s=j;o=15}else o=16}if((o|0)==15){f[a+8>>2]=r|-2147483648;f[s>>2]=h;f[a>>2]=q;break}else if((o|0)==16){b[d>>0]=h;break}}while(0);return}function Og(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=f[b>>2]|0;if((c|0)==-1){d=-1;return d|0}b=f[(f[a+24>>2]|0)+(c<<2)>>2]|0;if((b|0)==-1){d=0;return d|0}c=a+12|0;a=0;e=0;g=b;a:while(1){b:do if(e){h=a+1|0;i=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((i|0)==-1){d=h;j=15;break a}k=f[(f[c>>2]|0)+(i<<2)>>2]|0;if((k|0)==-1){d=h;j=15;break a}if(!((k>>>0)%3|0)){l=k+2|0;m=h;break}else{l=k+-1|0;m=h;break}}else{h=a;k=g;while(1){i=h+1|0;n=k+1|0;o=((n>>>0)%3|0|0)==0?k+-2|0:n;if((o|0)==-1){l=b;m=i;break b}n=f[(f[c>>2]|0)+(o<<2)>>2]|0;o=n+1|0;if((n|0)==-1){l=b;m=i;break b}k=((o>>>0)%3|0|0)==0?n+-2|0:o;if((k|0)==-1){l=b;m=i;break b}if((k|0)==(b|0)){d=i;j=15;break a}else h=i}}while(0);if((l|0)==-1){d=m;j=15;break}else{a=m;e=1;g=l}}if((j|0)==15)return d|0;return 0}function Pg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=a+8|0;Cg(a,a+4|0,d,c)|0;e=a+12|0;if((e|0)==(b|0))return;g=f[c>>2]|0;c=f[g>>2]|0;h=(f[g+4>>2]|0)-c>>3;i=c;c=e;e=d;a:while(1){d=f[c>>2]|0;j=f[e>>2]|0;if(h>>>0<=d>>>0){k=5;break}if(h>>>0<=j>>>0){k=7;break}l=i+(d<<3)|0;if((f[l>>2]|0)>>>0<(f[i+(j<<3)>>2]|0)>>>0){m=e;n=c;o=j;while(1){f[n>>2]=o;if((m|0)==(a|0)){p=a;break}j=m+-4|0;o=f[j>>2]|0;if(h>>>0<=o>>>0){k=11;break a}if((f[l>>2]|0)>>>0>=(f[i+(o<<3)>>2]|0)>>>0){p=m;break}else{q=m;m=j;n=q}}f[p>>2]=d}n=c+4|0;if((n|0)==(b|0)){k=3;break}else{m=c;c=n;e=m}}if((k|0)==3)return;else if((k|0)==5)mq(g);else if((k|0)==7)mq(g);else if((k|0)==11)mq(g)}function Qg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Cg(a,b,c,e)|0;h=f[d>>2]|0;i=f[c>>2]|0;j=f[e>>2]|0;e=f[j>>2]|0;k=(f[j+4>>2]|0)-e>>3;if(k>>>0<=h>>>0)mq(j);l=e;if(k>>>0<=i>>>0)mq(j);if((f[l+(h<<3)>>2]|0)>>>0>=(f[l+(i<<3)>>2]|0)>>>0){m=g;return m|0}f[c>>2]=h;f[d>>2]=i;i=f[c>>2]|0;d=f[b>>2]|0;if(k>>>0<=i>>>0)mq(j);if(k>>>0<=d>>>0)mq(j);if((f[l+(i<<3)>>2]|0)>>>0>=(f[l+(d<<3)>>2]|0)>>>0){m=g+1|0;return m|0}f[b>>2]=i;f[c>>2]=d;d=f[b>>2]|0;c=f[a>>2]|0;if(k>>>0<=d>>>0)mq(j);if(k>>>0<=c>>>0)mq(j);if((f[l+(d<<3)>>2]|0)>>>0>=(f[l+(c<<3)>>2]|0)>>>0){m=g+2|0;return m|0}f[a>>2]=d;f[b>>2]=c;m=g+3|0;return m|0}function Rg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;if((d|0)>=8192)return Da(a|0,c|0,d|0)|0;e=a|0;g=a+d|0;if((a&3)==(c&3)){while(a&3){if(!d)return e|0;b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0;d=d-1|0}h=g&-4|0;d=h-64|0;while((a|0)<=(d|0)){f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];f[a+12>>2]=f[c+12>>2];f[a+16>>2]=f[c+16>>2];f[a+20>>2]=f[c+20>>2];f[a+24>>2]=f[c+24>>2];f[a+28>>2]=f[c+28>>2];f[a+32>>2]=f[c+32>>2];f[a+36>>2]=f[c+36>>2];f[a+40>>2]=f[c+40>>2];f[a+44>>2]=f[c+44>>2];f[a+48>>2]=f[c+48>>2];f[a+52>>2]=f[c+52>>2];f[a+56>>2]=f[c+56>>2];f[a+60>>2]=f[c+60>>2];a=a+64|0;c=c+64|0}while((a|0)<(h|0)){f[a>>2]=f[c>>2];a=a+4|0;c=c+4|0}}else{h=g-4|0;while((a|0)<(h|0)){b[a>>0]=b[c>>0]|0;b[a+1>>0]=b[c+1>>0]|0;b[a+2>>0]=b[c+2>>0]|0;b[a+3>>0]=b[c+3>>0]|0;a=a+4|0;c=c+4|0}}while((a|0)<(g|0)){b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0}return e|0}function Sg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;c=u;u=u+16|0;d=c+4|0;e=c;f[a>>2]=1216;g=a+4|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;f[d>>2]=b;b=a+4|0;g=a+8|0;Ci(b,d);h=f[d>>2]|0;i=a+20|0;j=f[i>>2]|0;k=a+16|0;a=f[k>>2]|0;l=j-a>>2;m=a;if((h|0)<(l|0)){n=m;o=h;p=f[g>>2]|0;q=f[b>>2]|0;r=p-q|0;s=r>>2;t=s+-1|0;v=n+(o<<2)|0;f[v>>2]=t;u=c;return}a=h+1|0;f[e>>2]=-1;w=j;if(a>>>0<=l>>>0)if(a>>>0>>0?(j=m+(a<<2)|0,(j|0)!=(w|0)):0){f[i>>2]=w+(~((w+-4-j|0)>>>2)<<2);x=h;y=m}else{x=h;y=m}else{kh(k,a-l|0,e);x=f[d>>2]|0;y=f[k>>2]|0}n=y;o=x;p=f[g>>2]|0;q=f[b>>2]|0;r=p-q|0;s=r>>2;t=s+-1|0;v=n+(o<<2)|0;f[v>>2]=t;u=c;return}function Tg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+4|0;c=f[b>>2]|0;d=(f[c+12>>2]|0)-(f[c+8>>2]|0)|0;c=d>>2;a:do if((d|0)>0){e=0;while(1){if(!(Ra[f[(f[a>>2]|0)+36>>2]&127](a,e)|0)){g=0;break}e=e+1|0;h=f[b>>2]|0;i=(f[h+12>>2]|0)-(f[h+8>>2]|0)>>2;if((e|0)>=(i|0)){j=i;break a}}return g|0}else j=c;while(0);c=a+20|0;b=a+24|0;d=f[b>>2]|0;e=f[c>>2]|0;i=d-e>>2;h=e;e=d;if(j>>>0<=i>>>0){if(j>>>0>>0?(d=h+(j<<2)|0,(d|0)!=(e|0)):0)f[b>>2]=e+(~((e+-4-d|0)>>>2)<<2)}else oi(c,j-i|0);i=f[a+12>>2]|0;j=f[a+8>>2]|0;a=j;if((i|0)==(j|0)){g=1;return g|0}d=i-j>>2;j=0;do{i=f[a+(j<<2)>>2]|0;e=f[i+8>>2]|0;b=f[i+4>>2]|0;i=b;if((e|0)!=(b|0)?(h=f[c>>2]|0,k=e-b>>2,f[h+(f[i>>2]<<2)>>2]=j,k>>>0>1):0){b=1;do{f[h+(f[i+(b<<2)>>2]<<2)>>2]=j;b=b+1|0}while(b>>>0>>0)}j=j+1|0}while(j>>>0>>0);g=1;return g|0}function Ug(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=f[c+88>>2]|0;if(!d){e=0;return e|0}if((f[d>>2]|0)!=1){e=0;return e|0}g=d+8|0;d=f[g>>2]|0;f[a+4>>2]=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;i=a+8|0;j=c+24|0;c=b[j>>0]|0;k=c<<24>>24;l=a+12|0;m=f[l>>2]|0;n=f[i>>2]|0;o=m-n>>2;p=n;n=m;if(o>>>0>=k>>>0)if(o>>>0>k>>>0?(m=p+(k<<2)|0,(m|0)!=(n|0)):0){f[l>>2]=n+(~((n+-4-m|0)>>>2)<<2);q=c;r=d}else{q=c;r=d}else{oi(i,k-o|0);q=b[j>>0]|0;r=f[g>>2]|0}g=r+4|0;j=h[g>>0]|h[g+1>>0]<<8|h[g+2>>0]<<16|h[g+3>>0]<<24;if(q<<24>>24>0){g=f[i>>2]|0;i=q<<24>>24;q=j;o=4;k=0;while(1){f[g+(k<<2)>>2]=q;o=o+4|0;k=k+1|0;d=r+o|0;c=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;if((k|0)>=(i|0)){s=c;break}else q=c}}else s=j;f[a+20>>2]=s;e=1;return e|0}function Vg(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;do if(!(qp(a,f[c+8>>2]|0,g)|0)){if(!(qp(a,f[c>>2]|0,g)|0)){h=f[a+8>>2]|0;Za[f[(f[h>>2]|0)+24>>2]&3](h,c,d,e,g);break}if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;i=c+44|0;if((f[i>>2]|0)==4)break;j=c+52|0;b[j>>0]=0;k=c+53|0;b[k>>0]=0;l=f[a+8>>2]|0;_a[f[(f[l>>2]|0)+20>>2]&3](l,c,d,d,1,g);if(b[k>>0]|0)if(!(b[j>>0]|0)){m=3;n=11}else o=3;else{m=4;n=11}if((n|0)==11){f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0){b[c+54>>0]=1;o=m}else o=m}f[i>>2]=o;break}if((e|0)==1)f[c+32>>2]=1}else Om(0,c,d,e);while(0);return}function Wg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e+12|0;h=e+8|0;i=e;f[i>>2]=f[b>>2];f[g>>2]=f[i>>2];i=zd(a,g,h,e+4|0,c)|0;c=f[i>>2]|0;if(c|0){j=c;u=e;return j|0}c=dn(40)|0;dj(c+16|0,d);dj(c+28|0,d+12|0);d=f[h>>2]|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=d;f[i>>2]=c;d=f[f[a>>2]>>2]|0;if(!d)k=c;else{f[a>>2]=d;k=f[i>>2]|0}Ae(f[a+4>>2]|0,k);k=a+8|0;f[k>>2]=(f[k>>2]|0)+1;j=c;u=e;return j|0}function Xg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=0;if(!c){u=e;return}i=a+8|0;j=f[i>>2]|0;k=j<<5;if(k>>>0>>0){f[g>>2]=0;l=g+4|0;f[l>>2]=0;m=g+8|0;f[m>>2]=0;if((c|0)<0)mq(a);n=j<<6;j=c+31&-32;hi(g,k>>>0<1073741823?(n>>>0>>0?j:n):2147483647);n=f[a>>2]|0;f[a>>2]=f[g>>2];f[g>>2]=n;g=f[h>>2]|0;f[h>>2]=c;f[l>>2]=g;g=f[i>>2]|0;f[i>>2]=f[m>>2];f[m>>2]=g;if(n|0)br(n);o=a}else{f[h>>2]=c;o=a}a=f[o>>2]|0;o=a;h=a;a=c>>>5;n=a<<2;if(!(b[d>>0]|0)){hj(h|0,0,n|0)|0;d=c&31;g=o+(a<<2)|0;if(!d){u=e;return}f[g>>2]=f[g>>2]&~(-1>>>(32-d|0));u=e;return}else{hj(h|0,-1,n|0)|0;n=c&31;c=o+(a<<2)|0;if(!n){u=e;return}f[c>>2]=f[c>>2]|-1>>>(32-n|0);u=e;return}}function Yg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){n=a+88|0;fd(n,b);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;n=a+88|0;fd(n,b);u=c;return 1}function Zg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){n=a+108|0;fd(n,b);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;n=a+108|0;fd(n,b);u=c;return 1}function _g(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=a+32|0;d=f[a+64>>2]|0;e=(Qa[f[(f[d>>2]|0)+40>>2]&127](d)|0)+56|0;d=f[e>>2]|0;li(c,(((f[d+100>>2]|0)-(f[d+96>>2]|0)|0)/12|0)*3|0,0,1)|0;d=a+68|0;e=f[d>>2]|0;g=(f[a+72>>2]|0)-e|0;if((g|0)<=0){Qf(c);return}i=a+48|0;j=a+44|0;a=(g>>>2)+-1|0;g=e;while(1){e=f[g+(a<<2)>>2]|0;k=f[3124+(e<<2)>>2]|0;l=i;m=f[l+4>>2]|0;if((m|0)>0|(m|0)==0&(f[l>>2]|0)>>>0>0?(l=f[j>>2]|0,171>>>e&1|0):0){m=l+4|0;n=0;o=f[m>>2]|0;do{p=o>>>3;q=o&7;r=(f[l>>2]|0)+p|0;b[r>>0]=(1<>0]|0);r=(f[l>>2]|0)+p|0;b[r>>0]=(e>>>n&1)<>0]|0);o=(f[m>>2]|0)+1|0;f[m>>2]=o;n=n+1|0}while((n|0)!=(k|0))}k=a+-1|0;if((k|0)<=-1)break;a=k;g=f[d>>2]|0}Qf(c);return}function $g(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+48|0;h=g;i=g+32|0;if(!c){j=0;u=g;return j|0}Cn(h);do if((Tl(c,0)|0)!=-1){if(d){if(!(Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0)){k=0;break}Va[f[(f[c>>2]|0)+20>>2]&127](c)}Dg(i,a,c,h);l=(f[i>>2]|0)==0;m=i+4|0;if((b[m+11>>0]|0)<0)br(f[m>>2]|0);if(l){l=f[h>>2]|0;m=h+4|0;ag(e,l,l+((f[m>>2]|0)-l)|0);k=(f[m>>2]|0)-(f[h>>2]|0)|0}else k=0}else k=0;while(0);e=h+12|0;i=f[e>>2]|0;f[e>>2]=0;if(i|0)br(i);i=f[h>>2]|0;if(i|0){e=h+4|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;br(i)}j=k;u=g;return j|0}function ah(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=u;u=u+16|0;d=c;e=f[(f[a>>2]|0)+8>>2]|0;g=a+8|0;h=a+12|0;i=(f[h>>2]|0)-(f[g>>2]|0)>>2;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;Xa[e&15](a,i,d);i=f[d>>2]|0;f[d>>2]=0;if(!i){k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}d=i+88|0;a=f[d>>2]|0;f[d>>2]=0;if(a|0){d=f[a+8>>2]|0;if(d|0){e=a+12|0;if((f[e>>2]|0)!=(d|0))f[e>>2]=d;br(d)}br(a)}a=f[i+68>>2]|0;if(a|0){d=i+72|0;e=f[d>>2]|0;if((e|0)!=(a|0))f[d>>2]=e+(~((e+-4-a|0)>>>2)<<2);br(a)}a=i+64|0;e=f[a>>2]|0;f[a>>2]=0;if(e|0){a=f[e>>2]|0;if(a|0){d=e+4|0;if((f[d>>2]|0)!=(a|0))f[d>>2]=a;br(a)}br(e)}br(i);k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}function bh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(b[a+352>>0]|0)return 1;c=a+8|0;d=f[c>>2]|0;e=(f[d+12>>2]|0)-(f[d+8>>2]|0)|0;d=e>>2;g=a+172|0;si(g,d+-1|0);if(!((d|0)!=1&(e|0)>0))return 1;e=a+12|0;a=0;h=0;while(1){i=f[(f[(f[c>>2]|0)+8>>2]|0)+(a<<2)>>2]|0;if(!(f[i+56>>2]|0))j=h;else{k=f[g>>2]|0;f[k+(h*136|0)>>2]=a;l=f[k+(h*136|0)+104>>2]|0;m=k+(h*136|0)+108|0;n=f[m>>2]|0;if((n|0)!=(l|0))f[m>>2]=n+(~((n+-4-l|0)>>>2)<<2);l=f[e>>2]|0;$j(k+(h*136|0)+104|0,(f[l+4>>2]|0)-(f[l>>2]|0)>>2);l=f[g>>2]|0;f[l+(h*136|0)+128>>2]=0;zc(l+(h*136|0)+4|0,f[c>>2]|0,f[e>>2]|0,i)|0;j=h+1|0}a=a+1|0;if((a|0)>=(d|0))break;else h=j}return 1}function ch(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(b[a+288>>0]|0)return 1;c=a+8|0;d=f[c>>2]|0;e=(f[d+12>>2]|0)-(f[d+8>>2]|0)|0;d=e>>2;g=a+172|0;si(g,d+-1|0);if(!((d|0)!=1&(e|0)>0))return 1;e=a+12|0;a=0;h=0;while(1){i=f[(f[(f[c>>2]|0)+8>>2]|0)+(a<<2)>>2]|0;if(!(f[i+56>>2]|0))j=h;else{k=f[g>>2]|0;f[k+(h*136|0)>>2]=a;l=f[k+(h*136|0)+104>>2]|0;m=k+(h*136|0)+108|0;n=f[m>>2]|0;if((n|0)!=(l|0))f[m>>2]=n+(~((n+-4-l|0)>>>2)<<2);l=f[e>>2]|0;$j(k+(h*136|0)+104|0,(f[l+4>>2]|0)-(f[l>>2]|0)>>2);l=f[g>>2]|0;f[l+(h*136|0)+128>>2]=0;zc(l+(h*136|0)+4|0,f[c>>2]|0,f[e>>2]|0,i)|0;j=h+1|0}a=a+1|0;if((a|0)>=(d|0))break;else h=j}return 1}function dh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>3>>>0>=b>>>0){h=b;i=g;do{j=i;f[j>>2]=0;f[j+4>>2]=0;i=(f[e>>2]|0)+8|0;f[e>>2]=i;h=h+-1|0}while((h|0)!=0);return}h=f[a>>2]|0;i=g-h>>3;g=i+b|0;if(g>>>0>536870911)mq(a);j=d-h|0;h=j>>2;d=j>>3>>>0<268435455?(h>>>0>>0?g:h):536870911;do if(d)if(d>>>0>536870911){h=ra(8)|0;Wo(h,14941);f[h>>2]=6944;va(h|0,1080,114)}else{k=dn(d<<3)|0;break}else k=0;while(0);h=k+(i<<3)|0;i=k+(d<<3)|0;d=b;b=h;k=h;do{g=b;f[g>>2]=0;f[g+4>>2]=0;b=k+8|0;k=b;d=d+-1|0}while((d|0)!=0);d=f[a>>2]|0;b=(f[e>>2]|0)-d|0;g=h+(0-(b>>3)<<3)|0;if((b|0)>0)Rg(g|0,d|0,b|0)|0;f[a>>2]=g;f[e>>2]=k;f[c>>2]=i;if(!d)return;br(d);return}function eh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e+4|0;h=e;i=e+8|0;j=a&255;b[i>>0]=j&127;do if(c>>>0>0|(c|0)==0&a>>>0>127){b[i>>0]=j|-128;k=d+16|0;l=f[k+4>>2]|0;if((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0){m=0;break}else{f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,i,i+1|0)|0;k=Wn(a|0,c|0,7)|0;m=eh(k,I,d)|0;break}}else{k=d+16|0;l=f[k+4>>2]|0;if((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0){m=0;break}f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,i,i+1|0)|0;n=1;u=e;return n|0}while(0);n=m;u=e;return n|0}function fh(a,b){a=a|0;b=b|0;var c=0;c=a+8|0;ef(c,b)|0;if((c|0)==(b|0)){f[a+92>>2]=f[b+84>>2];return}else{Yf(a+56|0,f[b+48>>2]|0,f[b+52>>2]|0);Yf(a+68|0,f[b+60>>2]|0,f[b+64>>2]|0);Yf(a+80|0,f[b+72>>2]|0,f[b+76>>2]|0);f[a+92>>2]=f[b+84>>2];qg(a+96|0,f[b+88>>2]|0,f[b+92>>2]|0);return}}function gh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0;g=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;if((b|0)==-1)h=Ki(c,d)|0;else h=b;if((h|0)==-2)i=0;else{do if((Qa[f[(f[d>>2]|0)+8>>2]&127](d)|0)==1){Hf(a,d,h,c,e,514);if(!(f[a>>2]|0)){f[a>>2]=0;break}else return}while(0);c=dn(44)|0;f[c>>2]=1528;f[c+4>>2]=g;g=c+8|0;f[g>>2]=f[e>>2];f[g+4>>2]=f[e+4>>2];f[g+8>>2]=f[e+8>>2];f[g+12>>2]=f[e+12>>2];f[g+16>>2]=f[e+16>>2];f[g+20>>2]=f[e+20>>2];_j(c+32|0,e+24|0);f[c>>2]=1584;i=c}f[a>>2]=i;return}function hh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+224|0;g=e+120|0;h=e+80|0;i=e;j=e+136|0;k=h;l=k+40|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(l|0));f[g>>2]=f[d>>2];if((qb(0,c,g,i,h)|0)<0)m=-1;else{if((f[a+76>>2]|0)>-1)n=gr(a)|0;else n=0;d=f[a>>2]|0;k=d&32;if((b[a+74>>0]|0)<1)f[a>>2]=d&-33;d=a+48|0;if(!(f[d>>2]|0)){l=a+44|0;o=f[l>>2]|0;f[l>>2]=j;p=a+28|0;f[p>>2]=j;q=a+20|0;f[q>>2]=j;f[d>>2]=80;r=a+16|0;f[r>>2]=j+80;j=qb(a,c,g,i,h)|0;if(!o)s=j;else{Sa[f[a+36>>2]&31](a,0,0)|0;t=(f[q>>2]|0)==0?-1:j;f[l>>2]=o;f[d>>2]=0;f[r>>2]=0;f[p>>2]=0;f[q>>2]=0;s=t}}else s=qb(a,c,g,i,h)|0;h=f[a>>2]|0;f[a>>2]=h|k;if(n|0)fr(a);m=(h&32|0)==0?s:-1}u=e;return m|0}function ih(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;if(!(fn(a,b,c)|0)){g=0;u=d;return g|0}if((Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0)<<24>>24==1?((f[(f[a+8>>2]|0)+28>>2]|0)+-1|0)>>>0>=6:0){g=0;u=d;return g|0}h=Gg(c,f[b+48>>2]|0)|0;Xa[f[(f[a>>2]|0)+48>>2]&15](e,a,h);h=a+36|0;b=f[e>>2]|0;f[e>>2]=0;c=f[h>>2]|0;f[h>>2]=b;if(!c){f[e>>2]=0;i=b}else{Va[f[(f[c>>2]|0)+4>>2]&127](c);c=f[e>>2]|0;f[e>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);i=f[h>>2]|0}if(!i){g=1;u=d;return g|0}if(Ra[f[(f[a>>2]|0)+36>>2]&127](a,i)|0){g=1;u=d;return g|0}i=f[h>>2]|0;f[h>>2]=0;if(!i){g=1;u=d;return g|0}Va[f[(f[i>>2]|0)+4>>2]&127](i);g=1;u=d;return g|0}function jh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e>>2;h=d;if(g>>>0>>0){hf(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b<<2)|0;if((g|0)==(h|0))return;else i=h;do{h=i+-4|0;f[c>>2]=h;b=f[h>>2]|0;f[h>>2]=0;if(b|0){h=b+88|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0){h=f[e+8>>2]|0;if(h|0){a=e+12|0;if((f[a>>2]|0)!=(h|0))f[a>>2]=h;br(h)}br(e)}e=f[b+68>>2]|0;if(e|0){h=b+72|0;a=f[h>>2]|0;if((a|0)!=(e|0))f[h>>2]=a+(~((a+-4-e|0)>>>2)<<2);br(e)}e=b+64|0;a=f[e>>2]|0;f[e>>2]=0;if(a|0){e=f[a>>2]|0;if(e|0){h=a+4|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;br(e)}br(a)}br(b)}i=f[c>>2]|0}while((i|0)!=(g|0));return}function kh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;i=h;if(e-h>>2>>>0>=b>>>0){j=b;k=i;while(1){f[k>>2]=f[c>>2];j=j+-1|0;if(!j)break;else k=k+4|0}f[g>>2]=i+(b<<2);return}i=f[a>>2]|0;k=h-i|0;h=k>>2;j=h+b|0;if(j>>>0>1073741823)mq(a);l=e-i|0;e=l>>1;m=l>>2>>>0<536870911?(e>>>0>>0?j:e):1073741823;do if(m)if(m>>>0>1073741823){e=ra(8)|0;Wo(e,14941);f[e>>2]=6944;va(e|0,1080,114)}else{e=dn(m<<2)|0;n=e;o=e;break}else{n=0;o=0}while(0);e=n+(h<<2)|0;h=n+(m<<2)|0;m=b;j=e;while(1){f[j>>2]=f[c>>2];m=m+-1|0;if(!m)break;else j=j+4|0}if((k|0)>0)Rg(o|0,i|0,k|0)|0;f[a>>2]=n;f[g>>2]=e+(b<<2);f[d>>2]=h;if(!i)return;br(i);return}function lh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=(f[a>>2]|0)+1794895138|0;g=rp(f[a+8>>2]|0,e)|0;h=rp(f[a+12>>2]|0,e)|0;i=rp(f[a+16>>2]|0,e)|0;a:do if((g>>>0>>2>>>0?(j=c-(g<<2)|0,h>>>0>>0&i>>>0>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=rp(f[a+(q<<2)>>2]|0,e)|0;s=rp(f[a+(q+1<<2)>>2]|0,e)|0;if(!(s>>>0>>0&r>>>0<(c-s|0)>>>0)){t=0;break a}if(b[a+(s+r)>>0]|0){t=0;break a}r=bl(d,a+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=rp(f[a+(m<<2)>>2]|0,e)|0;j=rp(f[a+(m+1<<2)>>2]|0,e)|0;if(j>>>0>>0&l>>>0<(c-j|0)>>>0)t=(b[a+(j+l)>>0]|0)==0?a+j|0:0;else t=0}else t=0;while(0);return t|0}function mh(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=u;u=u+64|0;i=h;j=f[a>>2]|0;k=a+(f[j+-8>>2]|0)|0;l=f[j+-4>>2]|0;f[i>>2]=e;f[i+4>>2]=a;f[i+8>>2]=c;f[i+12>>2]=g;g=i+16|0;c=i+20|0;a=i+24|0;j=i+28|0;m=i+32|0;n=i+40|0;o=g;p=o+36|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d[g+36>>1]=0;b[g+38>>0]=0;a:do if(qp(l,e,0)|0){f[i+48>>2]=1;_a[f[(f[l>>2]|0)+20>>2]&3](l,i,k,k,1,0);q=(f[a>>2]|0)==1?k:0}else{Za[f[(f[l>>2]|0)+24>>2]&3](l,i,k,1,0);switch(f[i+36>>2]|0){case 0:{q=(f[n>>2]|0)==1&(f[j>>2]|0)==1&(f[m>>2]|0)==1?f[c>>2]|0:0;break a;break}case 1:break;default:{q=0;break a}}if((f[a>>2]|0)!=1?!((f[n>>2]|0)==0&(f[j>>2]|0)==1&(f[m>>2]|0)==1):0){q=0;break}q=f[g>>2]|0}while(0);u=h;return q|0}function nh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){i=b;j=h;while(1){f[j>>2]=1;i=i+-1|0;if(!i)break;else j=j+4|0}f[e>>2]=h+(b<<2);return}h=f[a>>2]|0;j=g-h|0;g=j>>2;i=g+b|0;if(i>>>0>1073741823)mq(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0>>0?i:d):1073741823;do if(l)if(l>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{d=dn(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;g=m+(l<<2)|0;l=b;i=d;while(1){f[i>>2]=1;l=l+-1|0;if(!l)break;else i=i+4|0}if((j|0)>0)Rg(n|0,h|0,j|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=g;if(!h)return;br(h);return}function oh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(!c){g=0;u=d;return g|0}h=a+84|0;i=f[h>>2]|0;j=a+88|0;k=f[j>>2]|0;if((k|0)!=(i|0))f[j>>2]=k+(~((k+-4-i|0)>>>2)<<2);f[h>>2]=0;f[j>>2]=0;f[a+92>>2]=0;if(i|0)br(i);i=a+72|0;j=f[i>>2]|0;h=a+76|0;if((f[h>>2]|0)!=(j|0))f[h>>2]=j;f[i>>2]=0;f[h>>2]=0;f[a+80>>2]=0;if(j|0)br(j);j=c+4|0;h=(f[j>>2]|0)-(f[c>>2]|0)>>2;b[e>>0]=0;Xg(a,h,e);h=c+24|0;i=c+28|0;k=(f[i>>2]|0)-(f[h>>2]|0)>>2;b[e>>0]=0;Xg(a+12|0,k,e);Sf(a+28|0,(f[j>>2]|0)-(f[c>>2]|0)>>2,5868);$j(a+52|0,(f[i>>2]|0)-(f[h>>2]|0)>>2);$j(a+40|0,(f[i>>2]|0)-(f[h>>2]|0)>>2);f[a+64>>2]=c;b[a+24>>0]=1;g=1;u=d;return g|0}function ph(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(j=f[(f[d+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(k=f[(f[d+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if(((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(h=f[(f[d+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function qh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Id(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+20>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Id(a,e);return}function rh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+48|0;g=e;h=e+32|0;i=a+4|0;j=f[i>>2]|0;if(!j){k=0;u=e;return k|0}do if(c)if(Qa[f[(f[j>>2]|0)+16>>2]&127](j)|0){l=f[i>>2]|0;Va[f[(f[l>>2]|0)+20>>2]&127](l);break}else{k=0;u=e;return k|0}while(0);Cn(g);Si(h,f[a>>2]|0,g);a=(f[h>>2]|0)==0;i=h+4|0;if((b[i+11>>0]|0)<0)br(f[i>>2]|0);if(a){a=f[g>>2]|0;i=g+4|0;ag(d,a,a+((f[i>>2]|0)-a)|0);m=(f[i>>2]|0)-(f[g>>2]|0)|0}else m=0;i=g+12|0;a=f[i>>2]|0;f[i>>2]=0;if(a|0)br(a);a=f[g>>2]|0;if(a|0){i=g+4|0;if((f[i>>2]|0)!=(a|0))f[i>>2]=a;br(a)}k=m;u=e;return k|0}function sh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=f[a+4>>2]|0;if(!d){e=0;return e|0}a=b[c+11>>0]|0;g=a<<24>>24<0;h=g?f[c+4>>2]|0:a&255;a=g?f[c>>2]|0:c;c=d;while(1){d=c+16|0;g=b[d+11>>0]|0;i=g<<24>>24<0;j=i?f[c+20>>2]|0:g&255;g=j>>>0>>0;k=g?j:h;if((k|0)!=0?(l=Pk(a,i?f[d>>2]|0:d,k)|0,(l|0)!=0):0)if((l|0)<0)m=7;else m=8;else if(h>>>0>>0)m=7;else m=8;if((m|0)==7){m=0;n=c}else if((m|0)==8){m=0;l=h>>>0>>0?h:j;if((l|0)!=0?(j=Pk(i?f[d>>2]|0:d,a,l)|0,(j|0)!=0):0){if((j|0)>=0){e=1;m=14;break}}else m=10;if((m|0)==10?(m=0,!g):0){e=1;m=14;break}n=c+4|0}c=f[n>>2]|0;if(!c){e=0;m=14;break}}if((m|0)==14)return e|0;return 0}function th(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=u;u=u+16|0;d=c+12|0;e=c+8|0;g=c+4|0;h=c;i=a+4|0;j=(i|0)==(b|0);if(!j){f[g>>2]=f[b>>2];f[h>>2]=b+4;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Hc(i,e,d)}if(!j){f[g>>2]=f[b+12>>2];f[h>>2]=b+16;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Ac(a+16|0,e,d)}if(j){u=c;return}f[g>>2]=f[b+24>>2];f[h>>2]=b+28;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Hc(a+28|0,e,d);u=c;return}function uh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=u;u=u+16|0;g=e+4|0;h=e;di(g,a,b,c,d);d=f[g>>2]|0;if(!d){i=-1;f[g>>2]=0;u=e;return i|0}f[g>>2]=0;f[h>>2]=d;d=ah(a,h)|0;a=f[h>>2]|0;f[h>>2]=0;if(!a){i=d;f[g>>2]=0;u=e;return i|0}h=a+88|0;c=f[h>>2]|0;f[h>>2]=0;if(c|0){h=f[c+8>>2]|0;if(h|0){b=c+12|0;if((f[b>>2]|0)!=(h|0))f[b>>2]=h;br(h)}br(c)}c=f[a+68>>2]|0;if(c|0){h=a+72|0;b=f[h>>2]|0;if((b|0)!=(c|0))f[h>>2]=b+(~((b+-4-c|0)>>>2)<<2);br(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){h=b+4|0;if((f[h>>2]|0)!=(c|0))f[h>>2]=c;br(c)}br(b)}br(a);i=d;f[g>>2]=0;u=e;return i|0}function vh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=u;u=u+16|0;g=e+4|0;h=e;i=f[a+8>>2]|0;j=i+24|0;k=b[j>>0]|0;l=c+4|0;Nf(a,(f[l>>2]|0)-(f[c>>2]|0)>>2,k,d);d=f[a+32>>2]|0;a=(f[f[d>>2]>>2]|0)+(f[d+48>>2]|0)|0;d=f[c>>2]|0;c=f[l>>2]|0;if((d|0)==(c|0)){m=1;u=e;return m|0}l=i+84|0;n=i+68|0;o=0;p=d;while(1){d=f[p>>2]|0;if(!(b[l>>0]|0))q=f[(f[n>>2]|0)+(d<<2)>>2]|0;else q=d;f[h>>2]=q;d=b[j>>0]|0;f[g>>2]=f[h>>2];if(!(Pb(i,g,d,a+(o<<2)|0)|0)){m=0;r=7;break}p=p+4|0;if((p|0)==(c|0)){m=1;r=7;break}else o=o+k|0}if((r|0)==7){u=e;return m|0}return 0}function wh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;f[a>>2]=1392;b=a+72|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);c=f[a+60>>2]|0;if(c|0){b=a+64|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);br(c)}c=f[a+48>>2]|0;if(c|0)br(c);c=a+36|0;d=f[c>>2]|0;if(d|0){b=a+40|0;e=f[b>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-4|0;f[b>>2]=e;i=f[e>>2]|0;f[e>>2]=0;if(i|0)Va[f[(f[i>>2]|0)+4>>2]&127](i);h=f[b>>2]|0}while((h|0)!=(d|0));g=f[c>>2]|0}br(g)}f[a>>2]=1216;g=f[a+16>>2]|0;if(g|0){c=a+20|0;d=f[c>>2]|0;if((d|0)!=(g|0))f[c>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g)}g=f[a+4>>2]|0;if(!g)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(g|0))f[d>>2]=a+(~((a+-4-g|0)>>>2)<<2);br(g);return}function xh(a){a=a|0;tj(a+992|0);tj(a+960|0);tj(a+928|0);tj(a+896|0);tj(a+864|0);tj(a+832|0);tj(a+800|0);tj(a+768|0);tj(a+736|0);tj(a+704|0);tj(a+672|0);tj(a+640|0);tj(a+608|0);tj(a+576|0);tj(a+544|0);tj(a+512|0);tj(a+480|0);tj(a+448|0);tj(a+416|0);tj(a+384|0);tj(a+352|0);tj(a+320|0);tj(a+288|0);tj(a+256|0);tj(a+224|0);tj(a+192|0);tj(a+160|0);tj(a+128|0);tj(a+96|0);tj(a+64|0);tj(a+32|0);tj(a);return}function yh(a){a=a|0;rn(a);rn(a+32|0);rn(a+64|0);rn(a+96|0);rn(a+128|0);rn(a+160|0);rn(a+192|0);rn(a+224|0);rn(a+256|0);rn(a+288|0);rn(a+320|0);rn(a+352|0);rn(a+384|0);rn(a+416|0);rn(a+448|0);rn(a+480|0);rn(a+512|0);rn(a+544|0);rn(a+576|0);rn(a+608|0);rn(a+640|0);rn(a+672|0);rn(a+704|0);rn(a+736|0);rn(a+768|0);rn(a+800|0);rn(a+832|0);rn(a+864|0);rn(a+896|0);rn(a+928|0);rn(a+960|0);rn(a+992|0);return}function zh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;a=u;u=u+16|0;e=a;if((c|0)<0|((b|0)==0|(d|0)==0)){g=0;u=a;return g|0}h=f[b+8>>2]|0;if(((f[b+12>>2]|0)-h>>2|0)<=(c|0)){g=0;u=a;return g|0}i=b+4|0;if(!(f[i>>2]|0)){j=dn(52)|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;n[j+16>>2]=$(1.0);k=j+20|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;n[j+36>>2]=$(1.0);f[j+40>>2]=0;f[j+44>>2]=0;f[j+48>>2]=0;f[b+4>>2]=j}j=f[(f[h+(c<<2)>>2]|0)+60>>2]|0;c=dn(44)|0;Ub(c,d);f[c+40>>2]=j;j=f[i>>2]|0;f[e>>2]=c;gk(j,e)|0;j=f[e>>2]|0;f[e>>2]=0;if(!j){g=1;u=a;return g|0}Qi(j);br(j);g=1;u=a;return g|0}function Ah(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f[a>>2]=d;e=a+24|0;g=a+28|0;h=f[g>>2]|0;i=f[e>>2]|0;j=h-i>>2;k=i;i=h;if(j>>>0>=d>>>0){if(j>>>0>d>>>0?(h=k+(d<<2)|0,(h|0)!=(i|0)):0)f[g>>2]=i+(~((i+-4-h|0)>>>2)<<2)}else oi(e,d-j|0);if(!c)return;j=f[b>>2]|0;if((c|0)>1){d=j;e=j;h=1;while(1){i=f[b+(h<<2)>>2]|0;g=(i|0)<(e|0);k=g?i:e;l=g?d:(i|0)>(d|0)?i:d;h=h+1|0;if((h|0)==(c|0)){m=l;n=k;break}else{d=l;e=k}}}else{m=j;n=j}f[a+4>>2]=n;f[a+8>>2]=m;j=Vn(m|0,((m|0)<0)<<31>>31|0,n|0,((n|0)<0)<<31>>31|0)|0;n=I;if(!(n>>>0<0|(n|0)==0&j>>>0<2147483647))return;n=j+1|0;f[a+12>>2]=n;j=(n|0)/2|0;m=a+16|0;f[m>>2]=j;f[a+20>>2]=0-j;if(n&1|0)return;f[m>>2]=j+-1;return}function Bh(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;c=u;u=u+64|0;j=c;k=i?6:5;Al(j);i=f[h+56>>2]|0;h=X(Ll(k)|0,e)|0;yj(j,i,0,e&255,k,0,h,((h|0)<0)<<31>>31,0,0);h=dn(96)|0;nl(h,j);f[a>>2]=h;pj(h,d)|0;d=h+84|0;if(!g){b[d>>0]=1;a=f[h+68>>2]|0;j=h+72|0;k=f[j>>2]|0;if((k|0)==(a|0)){u=c;return}f[j>>2]=k+(~((k+-4-a|0)>>>2)<<2);u=c;return}b[d>>0]=0;d=h+68|0;a=h+72|0;h=f[a>>2]|0;k=f[d>>2]|0;j=h-k>>2;e=h;if(j>>>0>>0){kh(d,g-j|0,1200);u=c;return}if(j>>>0<=g>>>0){u=c;return}j=k+(g<<2)|0;if((j|0)==(e|0)){u=c;return}f[a>>2]=e+(~((e+-4-j|0)>>>2)<<2);u=c;return}function Ch(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){jd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;jd(a,e);return}function Dh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){nd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;nd(a,e);return}function Eh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){ud(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;ud(a,e);return}function Fh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Ed(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Ed(a,e);return}function Gh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){ld(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;ld(a,e);return}function Hh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){qd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;qd(a,e);return}function Ih(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){yd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;yd(a,e);return}function Jh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){kd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;kd(a,e);return}function Kh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){od(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;od(a,e);return}function Lh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){vd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;vd(a,e);return}function Mh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Fd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Fd(a,e);return}function Nh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;b[h>>0]=a&127;do if(a>>>0>127){b[h>>0]=a|128;i=c+16|0;j=f[i+4>>2]|0;if((j|0)>0|(j|0)==0&(f[i>>2]|0)>>>0>0){k=0;break}else{f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0;k=Nh(a>>>7,c)|0;break}}else{i=c+16|0;j=f[i+4>>2]|0;if((j|0)>0|(j|0)==0&(f[i>>2]|0)>>>0>0){k=0;break}f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0;l=1;u=d;return l|0}while(0);l=k;u=d;return l|0}function Oh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;Be(e,a+40|0,f[a+8>>2]|0,b,c);Wi(a,e);a=f[e>>2]|0;f[e>>2]=0;if(!a){u=d;return 1}e=a+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){b=c+12|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;br(e)}br(c)}c=f[a+68>>2]|0;if(c|0){e=a+72|0;b=f[e>>2]|0;if((b|0)!=(c|0))f[e>>2]=b+(~((b+-4-c|0)>>>2)<<2);br(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){e=b+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;br(c)}br(b)}br(a);u=d;return 1}function Ph(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){rd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;rd(a,e);return}function Qh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=u;u=u+48|0;g=e;h=e+32|0;if(!c){i=0;u=e;return i|0}Cn(g);if((Tl(c,0)|0)!=-1?Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0:0){Va[f[(f[c>>2]|0)+20>>2]&127](c);Zf(h,a,c,g);c=(f[h>>2]|0)==0;a=h+4|0;if((b[a+11>>0]|0)<0)br(f[a>>2]|0);if(c){c=f[g>>2]|0;a=g+4|0;ag(d,c,c+((f[a>>2]|0)-c)|0);j=(f[a>>2]|0)-(f[g>>2]|0)|0}else j=0}else j=0;a=g+12|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0)br(c);c=f[g>>2]|0;if(c|0){a=g+4|0;if((f[a>>2]|0)!=(c|0))f[a>>2]=c;br(c)}i=j;u=e;return i|0}function Rh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;se(e,a+40|0,f[a+8>>2]|0,b,c);Wi(a,e);a=f[e>>2]|0;f[e>>2]=0;if(!a){u=d;return 1}e=a+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){b=c+12|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;br(e)}br(c)}c=f[a+68>>2]|0;if(c|0){e=a+72|0;b=f[e>>2]|0;if((b|0)!=(c|0))f[e>>2]=b+(~((b+-4-c|0)>>>2)<<2);br(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){e=b+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;br(c)}br(b)}br(a);u=d;return 1}function Sh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{d=g+-4|0;f[c>>2]=d;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=h+88|0;i=f[d>>2]|0;f[d>>2]=0;if(i|0){d=f[i+8>>2]|0;if(d|0){j=i+12|0;if((f[j>>2]|0)!=(d|0))f[j>>2]=d;br(d)}br(i)}i=f[h+68>>2]|0;if(i|0){d=h+72|0;j=f[d>>2]|0;if((j|0)!=(i|0))f[d>>2]=j+(~((j+-4-i|0)>>>2)<<2);br(i)}i=h+64|0;j=f[i>>2]|0;f[i>>2]=0;if(j|0){i=f[j>>2]|0;if(i|0){d=j+4|0;if((f[d>>2]|0)!=(i|0))f[d>>2]=i;br(i)}br(j)}br(h)}g=f[c>>2]|0}while((g|0)!=(b|0));e=f[a>>2]|0}br(e);return}function Th(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=(d|0)<0;do if(!b){if(e){g=0;return g|0}h=a+4|0;i=f[h>>2]|0;j=f[a>>2]|0;k=i-j|0;if(k>>>0>>0){ri(a,c-k|0);break}if(k>>>0>c>>>0?(k=j+c|0,(k|0)!=(i|0)):0)f[h>>2]=k}else{if(e){g=0;return g|0}k=a+4|0;h=f[k>>2]|0;i=f[a>>2]|0;j=h-i|0;do if(0<(d|0)|0==(d|0)&j>>>0>>0){if(j>>>0>>0){ri(a,c-j|0);break}if(j>>>0>c>>>0?(l=i+c|0,(l|0)!=(h|0)):0){f[k>>2]=l;m=15}else m=15}else m=15;while(0);if((m|0)==15?(c|0)==0:0)break;Xl(f[a>>2]|0,b|0,c|0)|0}while(0);c=a+24|0;a=c;b=Tn(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=c;f[a>>2]=b;f[a+4>>2]=I;g=1;return g|0}function Uh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;if(!(ve(a,c)|0)){i=0;u=d;return i|0}j=a+36|0;k=a+40|0;a=f[j>>2]|0;if((f[k>>2]|0)==(a|0)){i=1;u=d;return i|0}l=c+16|0;m=c+4|0;n=h+1|0;o=0;p=a;do{a=f[p+(o<<2)>>2]|0;q=Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0;b[h>>0]=q;q=l;a=f[q+4>>2]|0;if(!((a|0)>0|(a|0)==0&(f[q>>2]|0)>>>0>0)){f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];ye(c,e,h,n)|0}o=o+1|0;p=f[j>>2]|0}while(o>>>0<(f[k>>2]|0)-p>>2>>>0);i=1;u=d;return i|0}function Vh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=u;u=u+16|0;d=c;wp(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;e=a+24|0;wp(e);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;a=dn(32)|0;f[d>>2]=a;f[d+8>>2]=-2147483616;f[d+4>>2]=20;g=a;h=13101;i=g+20|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[a+20>>0]=0;Mj(e,d,1);if((b[d+11>>0]|0)<0)br(f[d>>2]|0);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;a=dn(32)|0;f[d>>2]=a;f[d+8>>2]=-2147483616;f[d+4>>2]=22;g=a;h=13122;i=g+22|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[a+22>>0]=0;Mj(e,d,1);if((b[d+11>>0]|0)>=0){u=c;return}br(f[d>>2]|0);u=c;return}function Wh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a+4>>2]|0;c=a+8|0;d=f[c>>2]|0;if((d|0)!=(b|0)){e=d;do{d=e+-4|0;f[c>>2]=d;g=f[d>>2]|0;f[d>>2]=0;if(g|0){d=g+88|0;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=f[h+8>>2]|0;if(d|0){i=h+12|0;if((f[i>>2]|0)!=(d|0))f[i>>2]=d;br(d)}br(h)}h=f[g+68>>2]|0;if(h|0){d=g+72|0;i=f[d>>2]|0;if((i|0)!=(h|0))f[d>>2]=i+(~((i+-4-h|0)>>>2)<<2);br(h)}h=g+64|0;i=f[h>>2]|0;f[h>>2]=0;if(i|0){h=f[i>>2]|0;if(h|0){d=i+4|0;if((f[d>>2]|0)!=(h|0))f[d>>2]=h;br(h)}br(i)}br(g)}e=f[c>>2]|0}while((e|0)!=(b|0))}b=f[a>>2]|0;if(!b)return;br(b);return}function Xh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;u=c;return 1}function Yh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c;e=dn(16)|0;f[d>>2]=e;f[d+8>>2]=-2147483632;f[d+4>>2]=14;g=e;h=12975;i=g+14|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[e+14>>0]=0;e=yk(a,d,-1)|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);j=dn(16)|0;f[d>>2]=j;f[d+8>>2]=-2147483632;f[d+4>>2]=14;g=j;h=12990;i=g+14|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[j+14>>0]=0;j=yk(a,d,-1)|0;if((b[d+11>>0]|0)>=0){k=(e|0)<(j|0);l=k?j:e;m=(l|0)==-1;n=m?5:l;u=c;return n|0}br(f[d>>2]|0);k=(e|0)<(j|0);l=k?j:e;m=(l|0)==-1;n=m?5:l;u=c;return n|0}function Zh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];ye(b,d,g,g+4|0)|0;u=c;return 1}function _h(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=dn(32)|0;f[a>>2]=g;f[a+4>>2]=c+8;c=a+8|0;b[c>>0]=0;h=g+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;h=g+20|0;i=e+12|0;f[h>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;g=e+16|0;e=f[g>>2]|0;j=f[i>>2]|0;k=e-j|0;if(!k){l=j;m=e;n=0}else{ri(h,k);l=f[i>>2]|0;m=f[g>>2]|0;n=f[h>>2]|0}Rg(n|0,l|0,m-l|0)|0;b[c>>0]=1;c=f[a>>2]|0;f[c+4>>2]=d;f[c>>2]=0;return}function $h(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=a+32|0;fd(a,b);c=a+80|0;d=f[c>>2]|0;if((d|0?(e=a+84|0,(f[e>>2]|0)>0):0)?(fd(d,b),(f[e>>2]|0)>1):0){d=1;do{fd((f[c>>2]|0)+(d<<5)|0,b);d=d+1|0}while((d|0)<(f[e>>2]|0))}e=a+136|0;d=a+140|0;a=f[e>>2]|0;if((f[d>>2]|0)==(a|0))return;c=0;g=a;while(1){a=g;Nh((f[a+(c*12|0)+4>>2]|0)-(f[a+(c*12|0)>>2]|0)>>2,b)|0;a=f[e>>2]|0;h=f[a+(c*12|0)>>2]|0;i=(f[a+(c*12|0)+4>>2]|0)-h>>2;if(!i)j=a;else{Dc(h,i,1,0,b)|0;j=f[e>>2]|0}c=c+1|0;if(c>>>0>=(((f[d>>2]|0)-j|0)/12|0)>>>0)break;else g=j}return}function ai(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=d+16|0;g=f[e>>2]|0;if(!g)if(!(pl(d)|0)){h=f[e>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=d+20|0;e=f[g>>2]|0;k=e;if((h-e|0)>>>0>>0){j=Sa[f[d+36>>2]&31](d,a,c)|0;break}b:do if((b[d+75>>0]|0)>-1){e=c;while(1){if(!e){l=0;m=a;n=c;o=k;break b}p=e+-1|0;if((b[a+p>>0]|0)==10)break;else e=p}p=Sa[f[d+36>>2]&31](d,a,e)|0;if(p>>>0>>0){j=p;break a}l=e;m=a+e|0;n=c-e|0;o=f[g>>2]|0}else{l=0;m=a;n=c;o=k}while(0);Rg(o|0,m|0,n|0)|0;f[g>>2]=(f[g>>2]|0)+n;j=l+n|0}while(0);return j|0}function bi(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+12|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d+28>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;bi(c+8|0);br(c)}while((e|0)!=0)}e=d+20|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0)br(c);c=f[d+8>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;g=c+8|0;h=f[c+20>>2]|0;if(h|0){i=c+24|0;if((f[i>>2]|0)!=(h|0))f[i>>2]=h;br(h)}if((b[g+11>>0]|0)<0)br(f[g>>2]|0);br(c)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(e|0)br(e);br(d)}if((b[a+11>>0]|0)>=0)return;br(f[a>>2]|0);return}function ci(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0;g=u;u=u+32|0;h=g+12|0;i=g;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;if((e|0)>0){j=i+11|0;k=i+4|0;l=0;do{if((l|0)>0)vn(h,12890)|0;cl(i,$(n[d+(l<<2)>>2]));m=b[j>>0]|0;o=m<<24>>24<0;$i(h,o?f[i>>2]|0:i,o?f[k>>2]|0:m&255)|0;if((b[j>>0]|0)<0)br(f[i>>2]|0);l=l+1|0}while((l|0)<(e|0))}Ql(mi(a,c)|0,h)|0;if((b[h+11>>0]|0)>=0){u=g;return}br(f[h>>2]|0);u=g;return}function di(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((f[d+56>>2]|0)==-1){h=0;f[a>>2]=h;return}i=dn(96)|0;nl(i,d);d=i;do if(!e){j=f[c+80>>2]|0;b[i+84>>0]=0;k=i+68|0;l=i+72|0;m=f[l>>2]|0;n=f[k>>2]|0;o=m-n>>2;p=m;if(j>>>0>o>>>0){kh(k,j-o|0,5908);break}if(j>>>0>>0?(o=n+(j<<2)|0,(o|0)!=(p|0)):0)f[l>>2]=p+(~((p+-4-o|0)>>>2)<<2)}else{b[i+84>>0]=1;o=f[i+68>>2]|0;p=i+72|0;l=f[p>>2]|0;if((l|0)!=(o|0))f[p>>2]=l+(~((l+-4-o|0)>>>2)<<2);f[i+80>>2]=f[c+80>>2]}while(0);if(!g){h=d;f[a>>2]=h;return}pj(i,g)|0;h=d;f[a>>2]=h;return}function ei(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=e>>3;h=g+1|0;if(h>>>0>536870911)mq(a);i=a+8|0;j=(f[i>>2]|0)-d|0;k=j>>2;l=j>>3>>>0<268435455?(k>>>0>>0?h:k):536870911;do if(l)if(l>>>0>536870911){k=ra(8)|0;Wo(k,14941);f[k>>2]=6944;va(k|0,1080,114)}else{k=dn(l<<3)|0;m=k;n=k;break}else{m=0;n=0}while(0);k=m+(g<<3)|0;g=b;b=f[g+4>>2]|0;h=k;f[h>>2]=f[g>>2];f[h+4>>2]=b;if((e|0)>0)Rg(n|0,d|0,e|0)|0;f[a>>2]=m;f[c>>2]=k+8;f[i>>2]=m+(l<<3);if(!d)return;br(d);return}function fi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c;if((Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){e=1;u=c;return e|0}g=a+4|0;h=a+20|0;i=a+24|0;j=a+16|0;a=0;while(1){k=f[(f[g>>2]|0)+4>>2]|0;l=Tl(k,Ra[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;f[d>>2]=l;if((l|0)==-1)break;k=f[h>>2]|0;if((k|0)==(f[i>>2]|0))Ci(j,d);else{f[k>>2]=l;f[h>>2]=k+4}al(f[g>>2]|0,f[d>>2]|0)|0;a=a+1|0;if((a|0)>=(Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)){e=1;m=9;break}}if((m|0)==9){u=c;return e|0}e=0;u=c;return e|0}function gi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=1276;Sh(a+60|0);b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=a+36|0;d=f[b>>2]|0;if(d|0){c=a+40|0;e=f[c>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-24|0;f[c>>2]=e;Va[f[f[e>>2]>>2]&127](e);h=f[c>>2]|0}while((h|0)!=(d|0));g=f[b>>2]|0}br(g)}f[a>>2]=1216;g=f[a+16>>2]|0;if(g|0){b=a+20|0;d=f[b>>2]|0;if((d|0)!=(g|0))f[b>>2]=d+(~((d+-4-g|0)>>>2)<<2);br(g)}g=f[a+4>>2]|0;if(!g)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(g|0))f[d>>2]=a+(~((a+-4-g|0)>>>2)<<2);br(g);return}function hi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+32|0;d=c+16|0;e=c+8|0;g=c;h=a+8|0;if(f[h>>2]<<5>>>0>=b>>>0){u=c;return}f[d>>2]=0;i=d+4|0;f[i>>2]=0;j=d+8|0;f[j>>2]=0;if((b|0)<0)mq(d);k=((b+-1|0)>>>5)+1|0;b=dn(k<<2)|0;f[d>>2]=b;f[i>>2]=0;f[j>>2]=k;k=f[a>>2]|0;f[e>>2]=k;f[e+4>>2]=0;b=a+4|0;l=f[b>>2]|0;f[g>>2]=k+(l>>>5<<2);f[g+4>>2]=l&31;ig(d,e,g);g=f[a>>2]|0;f[a>>2]=f[d>>2];f[d>>2]=g;d=f[b>>2]|0;f[b>>2]=f[i>>2];f[i>>2]=d;d=f[h>>2]|0;f[h>>2]=f[j>>2];f[j>>2]=d;if(g|0)br(g);u=c;return}function ii(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+136|0;c=f[b>>2]|0;if(c|0){d=a+140|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);br(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}br(g)}g=f[a+104>>2]|0;if(g|0){b=a+108|0;j=f[b>>2]|0;if((j|0)!=(g|0))f[b>>2]=j+(~((j+-4-g|0)>>>2)<<2);br(g)}g=f[a+92>>2]|0;if(!g){jj(a);return}j=a+96|0;b=f[j>>2]|0;if((b|0)!=(g|0))f[j>>2]=b+(~((b+-4-g|0)>>>2)<<2);br(g);jj(a);return}function ji(a){a=a|0;var c=0,d=0,e=0,g=0;f[a>>2]=3340;c=a+72|0;d=a+136|0;e=a+4|0;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));e=c;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));n[d>>2]=$(1.0);d=a+140|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[a+164>>2]=-1;d=a+168|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[d+24>>2]=0;rn(a+200|0);Cn(a+232|0);d=a+316|0;e=a+264|0;g=e+52|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=-1;f[a+320>>2]=-1;f[a+324>>2]=0;f[a+328>>2]=2;f[a+332>>2]=7;f[a+336>>2]=0;f[a+340>>2]=0;f[a+344>>2]=0;b[a+352>>0]=0;return}function ki(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=(e|0)/12|0;h=g+1|0;if(h>>>0>357913941)mq(a);i=a+8|0;j=((f[i>>2]|0)-d|0)/12|0;k=j<<1;l=j>>>0<178956970?(k>>>0>>0?h:k):357913941;do if(l)if(l>>>0>357913941){k=ra(8)|0;Wo(k,14941);f[k>>2]=6944;va(k|0,1080,114)}else{m=dn(l*12|0)|0;break}else m=0;while(0);k=m+(g*12|0)|0;f[k>>2]=f[b>>2];f[k+4>>2]=f[b+4>>2];f[k+8>>2]=f[b+8>>2];b=k+(((e|0)/-12|0)*12|0)|0;if((e|0)>0)Rg(b|0,d|0,e|0)|0;f[a>>2]=b;f[c>>2]=k+12;f[i>>2]=m+(l*12|0);if(!d)return;br(d);return}function li(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=a+16|0;h=g;i=f[h+4>>2]|0;if((d|0)<0|(d|0)==0&c>>>0<1|((i|0)>0|(i|0)==0&(f[h>>2]|0)>>>0>0)){j=0;return j|0}b[a+24>>0]=e&1;h=Tn(c|0,d|0,7,0)|0;d=zk(h|0,I|0,8,0)|0;h=I;c=g;f[c>>2]=d;f[c+4>>2]=h;c=a+4|0;g=f[c>>2]|0;i=f[a>>2]|0;k=g-i|0;l=Tn(k|0,0,8,0)|0;m=e?l:k;l=Tn(m|0,(e?I:0)|0,d|0,h|0)|0;h=i;i=g;if(k>>>0>=l>>>0)if(k>>>0>l>>>0?(g=h+l|0,(g|0)!=(i|0)):0){f[c>>2]=g;n=h}else n=h;else{ri(a,l-k|0);n=f[a>>2]|0}k=dn(8)|0;f[k>>2]=n+m;f[k+4>>2]=0;m=a+12|0;a=f[m>>2]|0;f[m>>2]=k;if(!a){j=1;return j|0}br(a);j=1;return j|0}function mi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=u;u=u+16|0;d=c;e=hg(a,d,b)|0;g=f[e>>2]|0;if(g|0){h=g;i=h+28|0;u=c;return i|0}g=dn(40)|0;dj(g+16|0,b);b=g+28|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;b=f[d>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=b;f[e>>2]=g;b=f[f[a>>2]>>2]|0;if(!b)j=g;else{f[a>>2]=b;j=f[e>>2]|0}Ae(f[a+4>>2]|0,j);j=a+8|0;f[j>>2]=(f[j>>2]|0)+1;h=g;i=h+28|0;u=c;return i|0}function ni(a,c,d,e,g,h,i,j){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0;k=u;u=u+16|0;l=k;if((-18-c|0)>>>0>>0)mq(a);if((b[a+11>>0]|0)<0)m=f[a>>2]|0;else m=a;if(c>>>0<2147483623){n=d+c|0;d=c<<1;o=n>>>0>>0?d:n;p=o>>>0<11?11:o+16&-16}else p=-17;o=dn(p)|0;if(g|0)Lo(o,m,g)|0;if(i|0)Lo(o+g|0,j,i)|0;j=e-h|0;e=j-g|0;if(e|0)Lo(o+g+i|0,m+g+h|0,e)|0;if((c|0)!=10)br(m);f[a>>2]=o;f[a+8>>2]=p|-2147483648;p=j+i|0;f[a+4>>2]=p;b[l>>0]=0;Hp(o+p|0,l);u=k;return}function oi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>2>>>0>=b>>>0){hj(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}h=f[a>>2]|0;i=g-h|0;g=i>>2;j=g+b|0;if(j>>>0>1073741823)mq(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0>>0?j:d):1073741823;do if(l)if(l>>>0>1073741823){d=ra(8)|0;Wo(d,14941);f[d>>2]=6944;va(d|0,1080,114)}else{d=dn(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;hj(d|0,0,b<<2|0)|0;if((i|0)>0)Rg(n|0,h|0,i|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=m+(l<<2);if(!h)return;br(h);return}function pi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=dn(32)|0;f[a>>2]=g;f[a+4>>2]=c+8;c=a+8|0;b[c>>0]=0;dj(g+8|0,e);h=g+20|0;i=e+12|0;f[h>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;g=e+16|0;e=f[g>>2]|0;j=f[i>>2]|0;k=e-j|0;if(!k){l=j;m=e;n=0}else{ri(h,k);l=f[i>>2]|0;m=f[g>>2]|0;n=f[h>>2]|0}Rg(n|0,l|0,m-l|0)|0;b[c>>0]=1;c=f[a>>2]|0;f[c+4>>2]=d;f[c>>2]=0;return}function qi(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=0,h=0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=+d;l=j;j=i;while(1){if(j<<24>>24<0)m=f[c>>2]|0;else m=c;p[g>>3]=k;n=wn(m,l+1|0,17468,g)|0;if((n|0)>-1)if(n>>>0>l>>>0)o=n;else break;else o=l<<1|1;wj(c,o,0);l=o;j=b[h>>0]|0}wj(c,n,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function ri(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if((e-h|0)>>>0>=c>>>0){i=c;j=h;do{b[j>>0]=0;j=(f[g>>2]|0)+1|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=h-i|0;h=j+c|0;if((h|0)<0)mq(a);k=e-i|0;i=k<<1;e=k>>>0<1073741823?(i>>>0>>0?h:i):2147483647;if(!e)l=0;else l=dn(e)|0;i=l+j|0;j=l+e|0;e=c;c=i;l=i;do{b[l>>0]=0;l=c+1|0;c=l;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;l=(f[g>>2]|0)-e|0;h=i+(0-l)|0;if((l|0)>0)Rg(h|0,e|0,l|0)|0;f[a>>2]=h;f[g>>2]=c;f[d>>2]=j;if(!e)return;br(e);return}function si(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=(d-e|0)/136|0;h=d;if(g>>>0>>0){te(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b*136|0)|0;if((g|0)==(h|0))return;else i=h;do{f[c>>2]=i+-136;h=f[i+-20>>2]|0;if(h|0){b=i+-16|0;e=f[b>>2]|0;if((e|0)!=(h|0))f[b>>2]=e+(~((e+-4-h|0)>>>2)<<2);br(h)}h=f[i+-32>>2]|0;if(h|0){e=i+-28|0;b=f[e>>2]|0;if((b|0)!=(h|0))f[e>>2]=b+(~((b+-4-h|0)>>>2)<<2);br(h)}yi(i+-132|0);i=f[c>>2]|0}while((i|0)!=(g|0));return}function ti(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Hd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Hd(a,e);return}function ui(a){a=a|0;var b=0,c=0,d=0;b=f[a+76>>2]|0;if(b|0){c=a+80|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+64>>2]|0;if(b|0){d=a+68|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;br(b)}b=f[a+48>>2]|0;if(b|0){d=a+52|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+24>>2]|0;if(b|0){c=a+28|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+12>>2]|0;if(b|0){d=a+16|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function vi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=j;j=i;while(1){if(j<<24>>24<0)l=f[c>>2]|0;else l=c;f[g>>2]=d;m=wn(l,k+1|0,17465,g)|0;if((m|0)>-1)if(m>>>0>k>>>0)n=m;else break;else n=k<<1|1;wj(c,n,0);k=n;j=b[h>>0]|0}wj(c,m,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function wi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+8|0;c=f[b>>2]|0;if((c|0)<0){d=0;return d|0}e=a+4|0;a=f[e>>2]|0;g=a+4|0;h=f[g>>2]|0;i=f[a>>2]|0;j=h-i>>2;k=i;i=h;if(c>>>0<=j>>>0)if(c>>>0>>0?(h=k+(c<<2)|0,(h|0)!=(i|0)):0){f[g>>2]=i+(~((i+-4-h|0)>>>2)<<2);l=c}else l=c;else{oi(a,c-j|0);l=f[b>>2]|0}if((l|0)<=0){d=1;return d|0}b=f[e>>2]|0;e=f[b>>2]|0;j=(f[b+4>>2]|0)-e>>2;c=e;e=0;while(1){if(j>>>0<=e>>>0){m=10;break}f[c+(e<<2)>>2]=e;e=e+1|0;if((e|0)>=(l|0)){d=1;m=12;break}}if((m|0)==10)mq(b);else if((m|0)==12)return d|0;return 0}function xi(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=30;h=g;i=14791;j=h+30|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+30>>0]=0;g=a+4|0;Mj(g,e,c);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);a=dn(32)|0;f[e>>2]=a;f[e+8>>2]=-2147483616;f[e+4>>2]=29;h=a;i=14510;j=h+29|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[a+29>>0]=0;Mj(g,e,c);if((b[e+11>>0]|0)>=0){u=d;return}br(f[e>>2]|0);u=d;return}function yi(a){a=a|0;var b=0,c=0,d=0;b=f[a+84>>2]|0;if(b|0){c=a+88|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+72>>2]|0;if(b|0){d=a+76|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;br(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+28>>2]|0;if(b|0){d=a+32|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+12>>2]|0;if(b|0)br(b);b=f[a>>2]|0;if(!b)return;br(b);return}function zi(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=1336;b=a+32|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+88|0;d=f[b>>2]|0;f[b>>2]=0;if(d|0){b=f[d+8>>2]|0;if(b|0){e=d+12|0;if((f[e>>2]|0)!=(b|0))f[e>>2]=b;br(b)}br(d)}d=f[c+68>>2]|0;if(d|0){b=c+72|0;e=f[b>>2]|0;if((e|0)!=(d|0))f[b>>2]=e+(~((e+-4-d|0)>>>2)<<2);br(d)}d=c+64|0;e=f[d>>2]|0;f[d>>2]=0;if(e|0){d=f[e>>2]|0;if(d|0){b=e+4|0;if((f[b>>2]|0)!=(d|0))f[b>>2]=d;br(d)}br(e)}br(c)}c=f[a+16>>2]|0;if(!c)return;e=a+20|0;a=f[e>>2]|0;if((a|0)!=(c|0))f[e>>2]=a+(~((a+-4-c|0)>>>2)<<2);br(c);return}function Ai(){var a=0,b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;a=u;u=u+48|0;b=a+32|0;c=a+24|0;d=a+16|0;e=a;g=a+36|0;a=mn()|0;if(a|0?(h=f[a>>2]|0,h|0):0){a=h+48|0;i=f[a>>2]|0;j=f[a+4>>2]|0;if(!((i&-256|0)==1126902528&(j|0)==1129074247)){f[c>>2]=17607;Dn(17557,c)}if((i|0)==1126902529&(j|0)==1129074247)k=f[h+44>>2]|0;else k=h+80|0;f[g>>2]=k;k=f[h>>2]|0;h=f[k+4>>2]|0;if(Sa[f[(f[250]|0)+16>>2]&31](1e3,k,g)|0){k=f[g>>2]|0;g=Qa[f[(f[k>>2]|0)+8>>2]&127](k)|0;f[e>>2]=17607;f[e+4>>2]=h;f[e+8>>2]=g;Dn(17471,e)}else{f[d>>2]=17607;f[d+4>>2]=h;Dn(17516,d)}}Dn(17595,b)}function Bi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;do if(a){if(c>>>0<128){b[a>>0]=c;e=1;break}d=(Yq()|0)+188|0;if(!(f[f[d>>2]>>2]|0))if((c&-128|0)==57216){b[a>>0]=c;e=1;break}else{d=ir()|0;f[d>>2]=84;e=-1;break}if(c>>>0<2048){b[a>>0]=c>>>6|192;b[a+1>>0]=c&63|128;e=2;break}if(c>>>0<55296|(c&-8192|0)==57344){b[a>>0]=c>>>12|224;b[a+1>>0]=c>>>6&63|128;b[a+2>>0]=c&63|128;e=3;break}if((c+-65536|0)>>>0<1048576){b[a>>0]=c>>>18|240;b[a+1>>0]=c>>>12&63|128;b[a+2>>0]=c>>>6&63|128;b[a+3>>0]=c&63|128;e=4;break}else{d=ir()|0;f[d>>2]=84;e=-1;break}}else e=1;while(0);return e|0}function Ci(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=e>>2;h=g+1|0;if(h>>>0>1073741823)mq(a);i=a+8|0;j=(f[i>>2]|0)-d|0;k=j>>1;l=j>>2>>>0<536870911?(k>>>0>>0?h:k):1073741823;do if(l)if(l>>>0>1073741823){k=ra(8)|0;Wo(k,14941);f[k>>2]=6944;va(k|0,1080,114)}else{k=dn(l<<2)|0;m=k;n=k;break}else{m=0;n=0}while(0);k=m+(g<<2)|0;f[k>>2]=f[b>>2];if((e|0)>0)Rg(n|0,d|0,e|0)|0;f[a>>2]=m;f[c>>2]=k+4;f[i>>2]=m+(l<<2);if(!d)return;br(d);return}function Di(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=a+104|0;d=f[c>>2]|0;if((d|0)!=0?(f[a+108>>2]|0)>=(d|0):0)e=4;else{d=Qm(a)|0;if((d|0)>=0){g=f[c>>2]|0;c=a+8|0;if(g){i=f[c>>2]|0;j=f[a+4>>2]|0;k=g-(f[a+108>>2]|0)|0;g=i;if((i-j|0)<(k|0)){l=g;m=g}else{l=j+(k+-1)|0;m=g}}else{g=f[c>>2]|0;l=g;m=g}f[a+100>>2]=l;l=a+4|0;if(!m)n=f[l>>2]|0;else{g=f[l>>2]|0;l=a+108|0;f[l>>2]=m+1-g+(f[l>>2]|0);n=g}g=n+-1|0;if((d|0)==(h[g>>0]|0|0))o=d;else{b[g>>0]=d;o=d}}else e=4}if((e|0)==4){f[a+100>>2]=0;o=-1}return o|0}function Ei(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;f[a>>2]=1528;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];_j(a+32|0,c+24|0);f[a>>2]=2144;c=a+44|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[a>>2]=2200;d=a+112|0;c=a+60|0;b=c+52|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(b|0));Sm(d);f[a+152>>2]=0;f[a+156>>2]=0;f[a+160>>2]=0;return}function Fi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=dn(16)|0;f[g>>2]=h;f[g+8>>2]=-2147483632;f[g+4>>2]=14;i=h;j=12975;k=i+14|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+14>>0]=0;Nj(a,g,c);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);c=dn(16)|0;f[g>>2]=c;f[g+8>>2]=-2147483632;f[g+4>>2]=14;i=c;j=12990;k=i+14|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[c+14>>0]=0;Nj(a,g,d);if((b[g+11>>0]|0)>=0){u=e;return}br(f[g>>2]|0);u=e;return}function Gi(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3320;b=f[a+88>>2]|0;if(b|0){c=a+92|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+72>>2]|0;if(b|0){d=a+76|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+60>>2]|0;if(b|0){c=a+64|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+48>>2]|0;if(b|0){d=a+52|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Hi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;f[a>>2]=1528;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];_j(a+32|0,c+24|0);f[a>>2]=1836;c=a+44|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[a>>2]=1892;d=a+112|0;c=a+60|0;b=c+52|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(b|0));Sm(d);f[a+152>>2]=0;f[a+156>>2]=0;f[a+160>>2]=0;return}function Ii(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2200;b=f[a+152>>2]|0;if(b|0){c=a+156|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+112>>2]|0;if(b|0){d=a+116|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+96>>2]|0;if(b|0)br(b);b=f[a+84>>2]|0;if(b|0)br(b);b=f[a+72>>2]|0;if(b|0)br(b);b=f[a+60>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Ji(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;g=f[(f[c+4>>2]|0)+4>>2]|0;if(!g){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=d;return}if(!(rj(d+12|0,f[c+44>>2]|0,g)|0)){g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=26;c=g;h=14822;i=c+26|0;do{b[c>>0]=b[h>>0]|0;c=c+1|0;h=h+1|0}while((c|0)<(i|0));b[g+26>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}else{f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}u=d;return}function Ki(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=b+48|0;if((Yh(f[c>>2]|0)|0)>9){d=0;return d|0}if((Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)!=1){d=0;return d|0}e=b+4|0;b=(f[(f[(f[e>>2]|0)+8>>2]|0)+(a<<2)>>2]|0)+56|0;a=f[b>>2]|0;do if((a|0)==3)if((Yh(f[c>>2]|0)|0)<4){d=5;return d|0}else{g=f[b>>2]|0;break}else g=a;while(0);a=Yh(f[c>>2]|0)|0;if((g|0)==1){d=(a|0)<4?6:0;return d|0}if((a|0)>7){d=0;return d|0}if((Yh(f[c>>2]|0)|0)>1){d=1;return d|0}else return ((f[(f[e>>2]|0)+80>>2]|0)>>>0<40?1:4)|0;return 0}function Li(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1892;b=f[a+152>>2]|0;if(b|0){c=a+156|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+112>>2]|0;if(b|0){d=a+116|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+96>>2]|0;if(b|0)br(b);b=f[a+84>>2]|0;if(b|0)br(b);b=f[a+72>>2]|0;if(b|0)br(b);b=f[a+60>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Mi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=u;u=u+128|0;h=g+124|0;i=g;j=i;k=6284;l=j+124|0;do{f[j>>2]=f[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(l|0));if((c+-1|0)>>>0>2147483646)if(!c){m=h;n=1;o=4}else{h=ir()|0;f[h>>2]=75;p=-1}else{m=a;n=c;o=4}if((o|0)==4){o=-2-m|0;c=n>>>0>o>>>0?o:n;f[i+48>>2]=c;n=i+20|0;f[n>>2]=m;f[i+44>>2]=m;o=m+c|0;m=i+16|0;f[m>>2]=o;f[i+28>>2]=o;o=hh(i,d,e)|0;if(!c)p=o;else{c=f[n>>2]|0;b[c+(((c|0)==(f[m>>2]|0))<<31>>31)>>0]=0;p=o}}u=g;return p|0}function Ni(a){a=a|0;var c=0,d=0,e=0,g=0;f[a>>2]=3080;c=a+72|0;d=a+136|0;e=a+4|0;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));e=c;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));n[d>>2]=$(1.0);d=a+140|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[a+164>>2]=-1;d=a+168|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[d+24>>2]=0;rn(a+200|0);Cn(a+232|0);d=a+264|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;b[d+24>>0]=0;return}function Oi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=+e;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+16|0;g=a;if(!c){h=0;u=a;return h|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=vj(d)|0;if(i>>>0>4294967279)mq(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=7}}else{m=i+16&-16;n=dn(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=7}if((l|0)==7){Rg(k|0,d|0,i|0)|0;j=k}b[j+i>>0]=0;Ol(c,g,e);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);h=1;u=a;return h|0}function Pi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+16|0;g=a;if(!c){h=0;u=a;return h|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=vj(d)|0;if(i>>>0>4294967279)mq(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=7}}else{m=i+16&-16;n=dn(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=7}if((l|0)==7){Rg(k|0,d|0,i|0)|0;j=k}b[j+i>>0]=0;Pl(c,g,e);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);h=1;u=a;return h|0}function Qi(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;c=f[a+28>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;g=c+20|0;h=f[g>>2]|0;f[g>>2]=0;if(h|0){Qi(h);br(h)}if((b[e+11>>0]|0)<0)br(f[e>>2]|0);br(c)}while((d|0)!=0)}d=a+20|0;c=f[d>>2]|0;f[d>>2]=0;if(c|0)br(c);c=f[a+8>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;h=f[c+20>>2]|0;if(h|0){g=c+24|0;if((f[g>>2]|0)!=(h|0))f[g>>2]=h;br(h)}if((b[e+11>>0]|0)<0)br(f[e>>2]|0);br(c)}while((d|0)!=0)}d=f[a>>2]|0;f[a>>2]=0;if(!d)return;br(d);return}function Ri(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;Wa[f[(f[c>>2]|0)+64>>2]&15](a,c);if(f[a>>2]|0){u=d;return}g=a+4|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);g=f[c+48>>2]|0;h=dn(32)|0;f[e>>2]=h;f[e+8>>2]=-2147483616;f[e+4>>2]=29;i=h;j=14510;k=i+29|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+29>>0]=0;h=Oj(g,e,0)|0;if((b[e+11>>0]|0)<0)br(f[e>>2]|0);if(h)Va[f[(f[c>>2]|0)+68>>2]&127](c);f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=d;return}function Si(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0;e=u;u=u+16|0;g=e;h=f[c+48>>2]|0;if(!h){i=dn(32)|0;f[g>>2]=i;f[g+8>>2]=-2147483616;f[g+4>>2]=23;j=i;k=14670;l=j+23|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[i+23>>0]=0;f[a>>2]=-1;dj(a+4|0,g);if((b[g+11>>0]|0)<0)br(f[g>>2]|0);u=e;return}g=f[c+52>>2]|0;if(!g){Ic(a,c,h,d);u=e;return}else{jg(a,c,g,d);u=e;return}}function Ti(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;lk(a);b=a+84|0;c=f[b>>2]|0;if((c|0)<=0)return;d=c<<5;e=_q(c>>>0>134217727|d>>>0>4294967291?-1:d+4|0)|0;f[e>>2]=c;d=e+4|0;e=d+(c<<5)|0;c=d;do{rn(c);c=c+32|0}while((c|0)!=(e|0));e=a+80|0;a=f[e>>2]|0;f[e>>2]=d;if(a|0){d=a+-4|0;c=f[d>>2]|0;if(c|0){g=a+(c<<5)|0;do{g=g+-32|0;tj(g)}while((g|0)!=(a|0))}$q(d)}if((f[b>>2]|0)>0)h=0;else return;do{lk((f[e>>2]|0)+(h<<5)|0);h=h+1|0}while((h|0)<(f[b>>2]|0));return}function Ui(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;if(!b){d=0;return d|0}if(f[b+4>>2]|0){d=0;return d|0}a=dn(52)|0;Ub(a,c);f[a+40>>2]=0;f[a+44>>2]=0;f[a+48>>2]=0;c=b+4|0;b=f[c>>2]|0;f[c>>2]=a;if(!b){d=1;return d|0}a=b+40|0;c=f[a>>2]|0;if(c|0){e=b+44|0;g=f[e>>2]|0;if((g|0)==(c|0))h=c;else{i=g;do{g=i+-4|0;f[e>>2]=g;j=f[g>>2]|0;f[g>>2]=0;if(j|0){Qi(j);br(j)}i=f[e>>2]|0}while((i|0)!=(c|0));h=f[a>>2]|0}br(h)}Qi(b);br(b);d=1;return d|0}function Vi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[a>>2]|0;if(b){b=c+8|0;d=b;e=Tn(f[d>>2]|0,f[d+4>>2]|0,1,0)|0;d=b;f[d>>2]=e;f[d+4>>2]=I;d=a+28|0;e=f[d>>2]|0;b=a+24|0;f[b>>2]=f[b>>2]|1<>2]|0,f[e+4>>2]|0,1,0)|0;e=c;f[e>>2]=d;f[e+4>>2]=I;e=a+28|0;g=e;h=f[e>>2]|0}e=h+1|0;f[g>>2]=e;if((e|0)!=32)return;e=a+24|0;h=a+16|0;d=f[h>>2]|0;if((d|0)==(f[a+20>>2]|0))Ci(a+12|0,e);else{f[d>>2]=f[e>>2];f[h>>2]=d+4}f[g>>2]=0;f[e>>2]=0;return}function Wi(a,b){a=a|0;b=b|0;var c=0,d=0;c=a+32|0;a=f[b>>2]|0;f[b>>2]=0;b=f[c>>2]|0;f[c>>2]=a;if(!b)return;a=b+88|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0){a=f[c+8>>2]|0;if(a|0){d=c+12|0;if((f[d>>2]|0)!=(a|0))f[d>>2]=a;br(a)}br(c)}c=f[b+68>>2]|0;if(c|0){a=b+72|0;d=f[a>>2]|0;if((d|0)!=(c|0))f[a>>2]=d+(~((d+-4-c|0)>>>2)<<2);br(c)}c=b+64|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d>>2]|0;if(c|0){a=d+4|0;if((f[a>>2]|0)!=(c|0))f[a>>2]=c;br(c)}br(d)}br(b);return}function Xi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;if(c|0){h=a+11|0;i=b[h>>0]|0;if(i<<24>>24<0){j=f[a+4>>2]|0;k=(f[a+8>>2]&2147483647)+-1|0}else{j=i&255;k=10}if((k-j|0)>>>0>>0){lj(a,k,c-k+j|0,j,j,0,0);l=b[h>>0]|0}else l=i;if(l<<24>>24<0)m=f[a>>2]|0;else m=a;On(m+j|0,c,d)|0;d=j+c|0;if((b[h>>0]|0)<0)f[a+4>>2]=d;else b[h>>0]=d;b[g>>0]=0;Hp(m+d|0,g)}u=e;return a|0}function Yi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+48|0;e=d+4|0;g=d;h=f[b+12>>2]|0;i=f[b+4>>2]|0;b=e;j=b+36|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));gh(g,c,h,i,e);i=f[e+24>>2]|0;if(!i){k=f[g>>2]|0;f[a>>2]=k;u=d;return}h=e+28|0;e=f[h>>2]|0;if((e|0)!=(i|0))f[h>>2]=e+(~((e+-4-i|0)>>>2)<<2);br(i);k=f[g>>2]|0;f[a>>2]=k;u=d;return}function Zi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=(f[a+8>>2]&2147483647)+-1|0;else k=10;do if(k>>>0>=d>>>0){if(j)l=f[a>>2]|0;else l=a;Jo(l,c,d)|0;b[g>>0]=0;Hp(l+d|0,g);if((b[h>>0]|0)<0){f[a+4>>2]=d;break}else{b[h>>0]=d;break}}else{if(j)m=f[a+4>>2]|0;else m=i&255;ni(a,k,d-k|0,m,0,m,d,c)}while(0);u=e;return a|0}function _i(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{f[c>>2]=g+-136;d=f[g+-20>>2]|0;if(d|0){h=g+-16|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);br(d)}d=f[g+-32>>2]|0;if(d|0){i=g+-28|0;h=f[i>>2]|0;if((h|0)!=(d|0))f[i>>2]=h+(~((h+-4-d|0)>>>2)<<2);br(d)}yi(g+-132|0);g=f[c>>2]|0}while((g|0)!=(b|0));e=f[a>>2]|0}br(e);return}function $i(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j){k=f[a+4>>2]|0;l=(f[a+8>>2]&2147483647)+-1|0}else{k=i&255;l=10}if((l-k|0)>>>0>=d>>>0){if(d|0){if(j)m=f[a>>2]|0;else m=a;Lo(m+k|0,c,d)|0;j=k+d|0;if((b[h>>0]|0)<0)f[a+4>>2]=j;else b[h>>0]=j;b[g>>0]=0;Hp(m+j|0,g)}}else ni(a,l,d-l+k|0,k,k,0,d,c);u=e;return a|0}function aj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=3608;b=f[a+32>>2]|0;if(b|0){c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+20>>2]|0;if(b|0){d=a+24|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=a+8|0;c=f[b>>2]|0;if(!c)return;d=a+12|0;a=f[d>>2]|0;if((a|0)==(c|0))e=c;else{g=a;do{a=g+-4|0;f[d>>2]=a;h=f[a>>2]|0;f[a>>2]=0;if(h|0)Va[f[(f[h>>2]|0)+4>>2]&127](h);g=f[d>>2]|0}while((g|0)!=(c|0));e=f[b>>2]|0}br(e);return}function bj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;if((Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){d=1;return d|0}a=0;while(1){e=f[(f[c>>2]|0)+4>>2]|0;g=Tl(e,Ra[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;if((g|0)==-1){d=0;h=6;break}e=f[(f[b>>2]|0)+28>>2]|0;i=$k(f[c>>2]|0,g)|0;a=a+1|0;if(!(Ra[e&127](b,i)|0)){d=0;h=6;break}if((a|0)>=(Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)){d=1;h=6;break}}if((h|0)==6)return d|0;return 0}function cj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;if(!(lo(a,b,c)|0)){d=0;return d|0}if(!(Qa[f[(f[a>>2]|0)+52>>2]&127](a)|0)){d=0;return d|0}c=a+4|0;e=a+8|0;g=f[c>>2]|0;if((f[e>>2]|0)==(g|0)){d=1;return d|0}h=a+36|0;a=0;i=g;while(1){g=f[(f[h>>2]|0)+(a<<2)>>2]|0;if(!(Sa[f[(f[g>>2]|0)+8>>2]&31](g,b,f[i+(a<<2)>>2]|0)|0)){d=0;j=7;break}a=a+1|0;i=f[c>>2]|0;if(a>>>0>=(f[e>>2]|0)-i>>2>>>0){d=1;j=7;break}}if((j|0)==7)return d|0;return 0}function dj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;if((b[c+11>>0]|0)<0){g=f[c>>2]|0;h=f[c+4>>2]|0;if(h>>>0>4294967279)mq(a);if(h>>>0<11){b[a+11>>0]=h;i=a}else{j=h+16&-16;k=dn(j)|0;f[a>>2]=k;f[a+8>>2]=j|-2147483648;f[a+4>>2]=h;i=k}Lo(i,g,h)|0;b[e>>0]=0;Hp(i+h|0,e)}else{f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2]}u=d;return}function ej(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[(f[b+4>>2]|0)+80>>2];h=f[b+44>>2]|0;b=h+16|0;i=f[b+4>>2]|0;if((i|0)>0|(i|0)==0&(f[b>>2]|0)>>>0>0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=c;return}f[e>>2]=f[h+4>>2];f[d>>2]=f[e>>2];ye(h,d,g,g+4|0)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=c;return}function fj(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0;b[c+53>>0]=1;do if((f[c+4>>2]|0)==(e|0)){b[c+52>>0]=1;a=c+16|0;h=f[a>>2]|0;if(!h){f[a>>2]=d;f[c+24>>2]=g;f[c+36>>2]=1;if(!((g|0)==1?(f[c+48>>2]|0)==1:0))break;b[c+54>>0]=1;break}if((h|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;b[c+54>>0]=1;break}h=c+24|0;a=f[h>>2]|0;if((a|0)==2){f[h>>2]=g;i=g}else i=a;if((i|0)==1?(f[c+48>>2]|0)==1:0)b[c+54>>0]=1}while(0);return}function gj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+36|0;d=a+40|0;e=f[c>>2]|0;if((f[d>>2]|0)!=(e|0)){g=0;h=e;do{eg(h+(g*24|0)|0,b)|0;g=g+1|0;h=f[c>>2]|0}while(g>>>0<(((f[d>>2]|0)-h|0)/24|0)>>>0)}h=a+48|0;d=a+52|0;a=f[h>>2]|0;if((f[d>>2]|0)==(a|0))return 1;else{i=0;j=a}do{a=f[j+(i<<2)>>2]|0;Nh(a<<1^a>>31,b)|0;i=i+1|0;j=f[h>>2]|0}while(i>>>0<(f[d>>2]|0)-j>>2>>>0);return 1}function hj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=a+d|0;c=c&255;if((d|0)>=67){while(a&3){b[a>>0]=c;a=a+1|0}g=e&-4|0;h=g-64|0;i=c|c<<8|c<<16|c<<24;while((a|0)<=(h|0)){f[a>>2]=i;f[a+4>>2]=i;f[a+8>>2]=i;f[a+12>>2]=i;f[a+16>>2]=i;f[a+20>>2]=i;f[a+24>>2]=i;f[a+28>>2]=i;f[a+32>>2]=i;f[a+36>>2]=i;f[a+40>>2]=i;f[a+44>>2]=i;f[a+48>>2]=i;f[a+52>>2]=i;f[a+56>>2]=i;f[a+60>>2]=i;a=a+64|0}while((a|0)<(g|0)){f[a>>2]=i;a=a+4|0}}while((a|0)<(e|0)){b[a>>0]=c;a=a+1|0}return e-d|0}function ij(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;do if(!(qp(a,f[c+8>>2]|0,g)|0)){if(qp(a,f[c>>2]|0,g)|0){if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0)b[c+54>>0]=1;f[c+44>>2]=4;break}if((e|0)==1)f[c+32>>2]=1}}else Om(0,c,d,e);while(0);return}function jj(a){a=a|0;var b=0,c=0,d=0,e=0;b=a+80|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+-4|0;d=f[b>>2]|0;if(d|0){e=c+(d<<5)|0;do{e=e+-32|0;tj(e)}while((e|0)!=(c|0))}$q(b)}b=f[a+68>>2]|0;if(b|0){c=a+72|0;e=f[c>>2]|0;if((e|0)!=(b|0))f[c>>2]=e+(~((e+-4-b|0)>>>2)<<2);br(b)}b=a+44|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0)br(e);e=f[a+32>>2]|0;if(!e){tj(a);return}b=a+36|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;br(e);tj(a);return}function kj(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2684;b=f[a+136>>2]|0;if(b|0){c=a+140|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+76>>2]|0;if(b|0)br(b);b=f[a+64>>2]|0;if(b|0)br(b);b=f[a+52>>2]|0;if(b|0)br(b);b=f[a+40>>2]|0;if(!b)return;br(b);return}function lj(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0;if((-17-c|0)>>>0>>0)mq(a);if((b[a+11>>0]|0)<0)j=f[a>>2]|0;else j=a;if(c>>>0<2147483623){k=d+c|0;d=c<<1;l=k>>>0>>0?d:k;m=l>>>0<11?11:l+16&-16}else m=-17;l=dn(m)|0;if(g|0)Lo(l,j,g)|0;k=e-h-g|0;if(k|0)Lo(l+g+i|0,j+g+h|0,k)|0;if((c|0)!=10)br(j);f[a>>2]=l;f[a+8>>2]=m|-2147483648;return}function mj(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2432;b=f[a+136>>2]|0;if(b|0){c=a+140|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b)}b=f[a+76>>2]|0;if(b|0)br(b);b=f[a+64>>2]|0;if(b|0)br(b);b=f[a+52>>2]|0;if(b|0)br(b);b=f[a+40>>2]|0;if(!b)return;br(b);return}function nj(a,b){a=a|0;b=b|0;if(!b)return;else{nj(a,f[b>>2]|0);nj(a,f[b+4>>2]|0);sj(b+20|0,f[b+24>>2]|0);br(b);return}}function oj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;If(a,b,c);c=f[a+100>>2]|0;d=f[a+96>>2]|0;a=d;if((c|0)==(d|0))return;e=f[b>>2]|0;b=(c-d|0)/12|0;d=0;do{c=a+(d*12|0)|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];c=a+(d*12|0)+4|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];c=a+(d*12|0)+8|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];d=d+1|0}while(d>>>0>>0);return}function pj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=a+64|0;if((f[d>>2]|0)==0?(e=dn(32)|0,tn(e),g=f[d>>2]|0,f[d>>2]=e,g|0):0){e=f[g>>2]|0;if(e|0){h=g+4|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;br(e)}br(g)}g=Ll(f[a+28>>2]|0)|0;e=X(g,b[a+24>>0]|0)|0;g=((e|0)<0)<<31>>31;h=f[d>>2]|0;i=on(e|0,g|0,c|0,0)|0;if(!(Th(h,0,i,I)|0)){j=0;return j|0}Ak(a,f[d>>2]|0,e,g,0,0);f[a+80>>2]=c;j=1;return j|0}function qj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+64|0;e=d;if(!(qp(a,b,0)|0))if((b|0)!=0?(g=mh(b,1024,1008,0)|0,(g|0)!=0):0){b=e+4|0;h=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(h|0));f[e>>2]=g;f[e+8>>2]=a;f[e+12>>2]=-1;f[e+48>>2]=1;Ya[f[(f[g>>2]|0)+28>>2]&7](g,e,f[c>>2]|0,1);if((f[e+24>>2]|0)==1){f[c>>2]=f[e+16>>2];i=1}else i=0;j=i}else j=0;else j=1;u=d;return j|0}function rj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;if(!c){d=0;return d|0}e=c+40|0;g=c+44|0;Nh((f[g>>2]|0)-(f[e>>2]|0)>>2,b)|0;h=f[e>>2]|0;e=f[g>>2]|0;if((h|0)!=(e|0)){g=h;do{h=f[g>>2]|0;if(h|0){Nh(f[h+40>>2]|0,b)|0;Wf(a,b,h)|0}g=g+4|0}while((g|0)!=(e|0))}Wf(a,b,c)|0;d=1;return d|0}function sj(a,c){a=a|0;c=c|0;var d=0;if(!c)return;sj(a,f[c>>2]|0);sj(a,f[c+4>>2]|0);a=c+16|0;d=c+28|0;if((b[d+11>>0]|0)<0)br(f[d>>2]|0);if((b[a+11>>0]|0)<0)br(f[a>>2]|0);br(c);return}function tj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b;d=c;f[d>>2]=0;f[d+4>>2]=0;cf(a,2,c);c=f[a+12>>2]|0;d=a+16|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e+(~((e+-4-c|0)>>>2)<<2)|0;f[d>>2]=h;g=h}f[a+24>>2]=0;f[a+28>>2]=0;if(c|0){if((g|0)!=(c|0))f[d>>2]=g+(~((g+-4-c|0)>>>2)<<2);br(c)}c=f[a>>2]|0;if(!c){u=b;return}g=a+4|0;a=f[g>>2]|0;if((a|0)!=(c|0))f[g>>2]=a+(~((a+-8-c|0)>>>3)<<3);br(c);u=b;return} function $a(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;b=u;u=u+16|0;c=b;do if(a>>>0<245){d=a>>>0<11?16:a+11&-8;e=d>>>3;g=f[4512]|0;h=g>>>e;if(h&3|0){i=(h&1^1)+e|0;j=18088+(i<<1<<2)|0;k=j+8|0;l=f[k>>2]|0;m=l+8|0;n=f[m>>2]|0;if((n|0)==(j|0))f[4512]=g&~(1<>2]=j;f[k>>2]=n}n=i<<3;f[l+4>>2]=n|3;i=l+n+4|0;f[i>>2]=f[i>>2]|1;o=m;u=b;return o|0}m=f[4514]|0;if(d>>>0>m>>>0){if(h|0){i=2<>>12&16;e=i>>>n;i=e>>>5&8;h=e>>>i;e=h>>>2&4;l=h>>>e;h=l>>>1&2;k=l>>>h;l=k>>>1&1;j=(i|n|e|h|l)+(k>>>l)|0;l=18088+(j<<1<<2)|0;k=l+8|0;h=f[k>>2]|0;e=h+8|0;n=f[e>>2]|0;if((n|0)==(l|0)){i=g&~(1<>2]=l;f[k>>2]=n;p=g}n=j<<3;j=n-d|0;f[h+4>>2]=d|3;k=h+d|0;f[k+4>>2]=j|1;f[h+n>>2]=j;if(m|0){n=f[4517]|0;h=m>>>3;l=18088+(h<<1<<2)|0;i=1<>2]|0;r=i}f[r>>2]=n;f[q+12>>2]=n;f[n+8>>2]=q;f[n+12>>2]=l}f[4514]=j;f[4517]=k;o=e;u=b;return o|0}e=f[4513]|0;if(e){k=(e&0-e)+-1|0;j=k>>>12&16;l=k>>>j;k=l>>>5&8;n=l>>>k;l=n>>>2&4;i=n>>>l;n=i>>>1&2;h=i>>>n;i=h>>>1&1;s=f[18352+((k|j|l|n|i)+(h>>>i)<<2)>>2]|0;i=(f[s+4>>2]&-8)-d|0;h=f[s+16+(((f[s+16>>2]|0)==0&1)<<2)>>2]|0;if(!h){t=s;v=i}else{n=s;s=i;i=h;while(1){h=(f[i+4>>2]&-8)-d|0;l=h>>>0>>0;j=l?h:s;h=l?i:n;i=f[i+16+(((f[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!i){t=h;v=j;break}else{n=h;s=j}}}s=t+d|0;if(s>>>0>t>>>0){n=f[t+24>>2]|0;i=f[t+12>>2]|0;do if((i|0)==(t|0)){j=t+20|0;h=f[j>>2]|0;if(!h){l=t+16|0;k=f[l>>2]|0;if(!k){w=0;break}else{x=k;y=l}}else{x=h;y=j}while(1){j=x+20|0;h=f[j>>2]|0;if(h|0){x=h;y=j;continue}j=x+16|0;h=f[j>>2]|0;if(!h)break;else{x=h;y=j}}f[y>>2]=0;w=x}else{j=f[t+8>>2]|0;f[j+12>>2]=i;f[i+8>>2]=j;w=i}while(0);do if(n|0){i=f[t+28>>2]|0;j=18352+(i<<2)|0;if((t|0)==(f[j>>2]|0)){f[j>>2]=w;if(!w){f[4513]=e&~(1<>2]|0)!=(t|0)&1)<<2)>>2]=w;if(!w)break}f[w+24>>2]=n;i=f[t+16>>2]|0;if(i|0){f[w+16>>2]=i;f[i+24>>2]=w}i=f[t+20>>2]|0;if(i|0){f[w+20>>2]=i;f[i+24>>2]=w}}while(0);if(v>>>0<16){n=v+d|0;f[t+4>>2]=n|3;e=t+n+4|0;f[e>>2]=f[e>>2]|1}else{f[t+4>>2]=d|3;f[s+4>>2]=v|1;f[s+v>>2]=v;if(m|0){e=f[4517]|0;n=m>>>3;i=18088+(n<<1<<2)|0;j=1<>2]|0;A=j}f[A>>2]=e;f[z+12>>2]=e;f[e+8>>2]=z;f[e+12>>2]=i}f[4514]=v;f[4517]=s}o=t+8|0;u=b;return o|0}else B=d}else B=d}else B=d}else if(a>>>0<=4294967231){i=a+11|0;e=i&-8;j=f[4513]|0;if(j){n=0-e|0;h=i>>>8;if(h)if(e>>>0>16777215)C=31;else{i=(h+1048320|0)>>>16&8;l=h<>>16&4;k=l<>>16&2;D=14-(h|i|l)+(k<>>15)|0;C=e>>>(D+7|0)&1|D<<1}else C=0;D=f[18352+(C<<2)>>2]|0;a:do if(!D){E=0;F=0;G=n;H=57}else{l=0;k=n;i=D;h=e<<((C|0)==31?0:25-(C>>>1)|0);I=0;while(1){J=(f[i+4>>2]&-8)-e|0;if(J>>>0>>0)if(!J){K=0;L=i;M=i;H=61;break a}else{N=i;O=J}else{N=l;O=k}J=f[i+20>>2]|0;i=f[i+16+(h>>>31<<2)>>2]|0;P=(J|0)==0|(J|0)==(i|0)?I:J;J=(i|0)==0;if(J){E=P;F=N;G=O;H=57;break}else{l=N;k=O;h=h<<((J^1)&1);I=P}}}while(0);if((H|0)==57){if((E|0)==0&(F|0)==0){D=2<>>12&16;d=D>>>n;D=d>>>5&8;s=d>>>D;d=s>>>2&4;g=s>>>d;s=g>>>1&2;m=g>>>s;g=m>>>1&1;Q=0;R=f[18352+((D|n|d|s|g)+(m>>>g)<<2)>>2]|0}else{Q=F;R=E}if(!R){S=Q;T=G}else{K=G;L=R;M=Q;H=61}}if((H|0)==61)while(1){H=0;g=(f[L+4>>2]&-8)-e|0;m=g>>>0>>0;s=m?g:K;g=m?L:M;L=f[L+16+(((f[L+16>>2]|0)==0&1)<<2)>>2]|0;if(!L){S=g;T=s;break}else{K=s;M=g;H=61}}if((S|0)!=0?T>>>0<((f[4514]|0)-e|0)>>>0:0){g=S+e|0;if(g>>>0<=S>>>0){o=0;u=b;return o|0}s=f[S+24>>2]|0;m=f[S+12>>2]|0;do if((m|0)==(S|0)){d=S+20|0;n=f[d>>2]|0;if(!n){D=S+16|0;I=f[D>>2]|0;if(!I){U=0;break}else{V=I;W=D}}else{V=n;W=d}while(1){d=V+20|0;n=f[d>>2]|0;if(n|0){V=n;W=d;continue}d=V+16|0;n=f[d>>2]|0;if(!n)break;else{V=n;W=d}}f[W>>2]=0;U=V}else{d=f[S+8>>2]|0;f[d+12>>2]=m;f[m+8>>2]=d;U=m}while(0);do if(s){m=f[S+28>>2]|0;d=18352+(m<<2)|0;if((S|0)==(f[d>>2]|0)){f[d>>2]=U;if(!U){d=j&~(1<>2]|0)!=(S|0)&1)<<2)>>2]=U;if(!U){X=j;break}}f[U+24>>2]=s;d=f[S+16>>2]|0;if(d|0){f[U+16>>2]=d;f[d+24>>2]=U}d=f[S+20>>2]|0;if(d){f[U+20>>2]=d;f[d+24>>2]=U;X=j}else X=j}else X=j;while(0);do if(T>>>0>=16){f[S+4>>2]=e|3;f[g+4>>2]=T|1;f[g+T>>2]=T;j=T>>>3;if(T>>>0<256){s=18088+(j<<1<<2)|0;d=f[4512]|0;m=1<>2]|0;Z=m}f[Z>>2]=g;f[Y+12>>2]=g;f[g+8>>2]=Y;f[g+12>>2]=s;break}s=T>>>8;if(s)if(T>>>0>16777215)_=31;else{m=(s+1048320|0)>>>16&8;d=s<>>16&4;j=d<>>16&2;n=14-(s|m|d)+(j<>>15)|0;_=T>>>(n+7|0)&1|n<<1}else _=0;n=18352+(_<<2)|0;f[g+28>>2]=_;d=g+16|0;f[d+4>>2]=0;f[d>>2]=0;d=1<<_;if(!(X&d)){f[4513]=X|d;f[n>>2]=g;f[g+24>>2]=n;f[g+12>>2]=g;f[g+8>>2]=g;break}d=T<<((_|0)==31?0:25-(_>>>1)|0);j=f[n>>2]|0;while(1){if((f[j+4>>2]&-8|0)==(T|0)){H=97;break}$=j+16+(d>>>31<<2)|0;n=f[$>>2]|0;if(!n){H=96;break}else{d=d<<1;j=n}}if((H|0)==96){f[$>>2]=g;f[g+24>>2]=j;f[g+12>>2]=g;f[g+8>>2]=g;break}else if((H|0)==97){d=j+8|0;n=f[d>>2]|0;f[n+12>>2]=g;f[d>>2]=g;f[g+8>>2]=n;f[g+12>>2]=j;f[g+24>>2]=0;break}}else{n=T+e|0;f[S+4>>2]=n|3;d=S+n+4|0;f[d>>2]=f[d>>2]|1}while(0);o=S+8|0;u=b;return o|0}else B=e}else B=e}else B=-1;while(0);S=f[4514]|0;if(S>>>0>=B>>>0){T=S-B|0;$=f[4517]|0;if(T>>>0>15){_=$+B|0;f[4517]=_;f[4514]=T;f[_+4>>2]=T|1;f[$+S>>2]=T;f[$+4>>2]=B|3}else{f[4514]=0;f[4517]=0;f[$+4>>2]=S|3;T=$+S+4|0;f[T>>2]=f[T>>2]|1}o=$+8|0;u=b;return o|0}$=f[4515]|0;if($>>>0>B>>>0){T=$-B|0;f[4515]=T;S=f[4518]|0;_=S+B|0;f[4518]=_;f[_+4>>2]=T|1;f[S+4>>2]=B|3;o=S+8|0;u=b;return o|0}if(!(f[4630]|0)){f[4632]=4096;f[4631]=4096;f[4633]=-1;f[4634]=-1;f[4635]=0;f[4623]=0;f[4630]=c&-16^1431655768;aa=4096}else aa=f[4632]|0;c=B+48|0;S=B+47|0;T=aa+S|0;_=0-aa|0;aa=T&_;if(aa>>>0<=B>>>0){o=0;u=b;return o|0}X=f[4622]|0;if(X|0?(Y=f[4620]|0,Z=Y+aa|0,Z>>>0<=Y>>>0|Z>>>0>X>>>0):0){o=0;u=b;return o|0}b:do if(!(f[4623]&4)){X=f[4518]|0;c:do if(X){Z=18496;while(1){Y=f[Z>>2]|0;if(Y>>>0<=X>>>0?(ba=Z+4|0,(Y+(f[ba>>2]|0)|0)>>>0>X>>>0):0)break;Y=f[Z+8>>2]|0;if(!Y){H=118;break c}else Z=Y}j=T-$&_;if(j>>>0<2147483647){Y=Fl(j|0)|0;if((Y|0)==((f[Z>>2]|0)+(f[ba>>2]|0)|0))if((Y|0)==(-1|0))ca=j;else{da=j;ea=Y;H=135;break b}else{fa=Y;ga=j;H=126}}else ca=0}else H=118;while(0);do if((H|0)==118){X=Fl(0)|0;if((X|0)!=(-1|0)?(e=X,j=f[4631]|0,Y=j+-1|0,U=((Y&e|0)==0?0:(Y+e&0-j)-e|0)+aa|0,e=f[4620]|0,j=U+e|0,U>>>0>B>>>0&U>>>0<2147483647):0){Y=f[4622]|0;if(Y|0?j>>>0<=e>>>0|j>>>0>Y>>>0:0){ca=0;break}Y=Fl(U|0)|0;if((Y|0)==(X|0)){da=U;ea=X;H=135;break b}else{fa=Y;ga=U;H=126}}else ca=0}while(0);do if((H|0)==126){U=0-ga|0;if(!(c>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=ga;ea=fa;H=135;break b}Y=f[4632]|0;X=S-ga+Y&0-Y;if(X>>>0>=2147483647){da=ga;ea=fa;H=135;break b}if((Fl(X|0)|0)==(-1|0)){Fl(U|0)|0;ca=0;break}else{da=X+ga|0;ea=fa;H=135;break b}}while(0);f[4623]=f[4623]|4;ha=ca;H=133}else{ha=0;H=133}while(0);if(((H|0)==133?aa>>>0<2147483647:0)?(ca=Fl(aa|0)|0,aa=Fl(0)|0,fa=aa-ca|0,ga=fa>>>0>(B+40|0)>>>0,!((ca|0)==(-1|0)|ga^1|ca>>>0>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ga?fa:ha;ea=ca;H=135}if((H|0)==135){ca=(f[4620]|0)+da|0;f[4620]=ca;if(ca>>>0>(f[4621]|0)>>>0)f[4621]=ca;ca=f[4518]|0;do if(ca){ha=18496;while(1){ia=f[ha>>2]|0;ja=ha+4|0;ka=f[ja>>2]|0;if((ea|0)==(ia+ka|0)){H=143;break}fa=f[ha+8>>2]|0;if(!fa)break;else ha=fa}if(((H|0)==143?(f[ha+12>>2]&8|0)==0:0)?ea>>>0>ca>>>0&ia>>>0<=ca>>>0:0){f[ja>>2]=ka+da;fa=(f[4515]|0)+da|0;ga=ca+8|0;aa=(ga&7|0)==0?0:0-ga&7;ga=ca+aa|0;S=fa-aa|0;f[4518]=ga;f[4515]=S;f[ga+4>>2]=S|1;f[ca+fa+4>>2]=40;f[4519]=f[4634];break}if(ea>>>0<(f[4516]|0)>>>0)f[4516]=ea;fa=ea+da|0;S=18496;while(1){if((f[S>>2]|0)==(fa|0)){H=151;break}ga=f[S+8>>2]|0;if(!ga){la=18496;break}else S=ga}if((H|0)==151)if(!(f[S+12>>2]&8)){f[S>>2]=ea;ha=S+4|0;f[ha>>2]=(f[ha>>2]|0)+da;ha=ea+8|0;ga=ea+((ha&7|0)==0?0:0-ha&7)|0;ha=fa+8|0;aa=fa+((ha&7|0)==0?0:0-ha&7)|0;ha=ga+B|0;c=aa-ga-B|0;f[ga+4>>2]=B|3;do if((ca|0)!=(aa|0)){if((f[4517]|0)==(aa|0)){ba=(f[4514]|0)+c|0;f[4514]=ba;f[4517]=ha;f[ha+4>>2]=ba|1;f[ha+ba>>2]=ba;break}ba=f[aa+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;d:do if(ba>>>0<256){T=f[aa+8>>2]|0;X=f[aa+12>>2]|0;if((X|0)==(T|0)){f[4512]=f[4512]&~(1<<$);break}else{f[T+12>>2]=X;f[X+8>>2]=T;break}}else{T=f[aa+24>>2]|0;X=f[aa+12>>2]|0;do if((X|0)==(aa|0)){U=aa+16|0;Y=U+4|0;j=f[Y>>2]|0;if(!j){e=f[U>>2]|0;if(!e){ma=0;break}else{na=e;oa=U}}else{na=j;oa=Y}while(1){Y=na+20|0;j=f[Y>>2]|0;if(j|0){na=j;oa=Y;continue}Y=na+16|0;j=f[Y>>2]|0;if(!j)break;else{na=j;oa=Y}}f[oa>>2]=0;ma=na}else{Y=f[aa+8>>2]|0;f[Y+12>>2]=X;f[X+8>>2]=Y;ma=X}while(0);if(!T)break;X=f[aa+28>>2]|0;Y=18352+(X<<2)|0;do if((f[Y>>2]|0)!=(aa|0)){f[T+16+(((f[T+16>>2]|0)!=(aa|0)&1)<<2)>>2]=ma;if(!ma)break d}else{f[Y>>2]=ma;if(ma|0)break;f[4513]=f[4513]&~(1<>2]=T;X=aa+16|0;Y=f[X>>2]|0;if(Y|0){f[ma+16>>2]=Y;f[Y+24>>2]=ma}Y=f[X+4>>2]|0;if(!Y)break;f[ma+20>>2]=Y;f[Y+24>>2]=ma}while(0);pa=aa+_|0;qa=_+c|0}else{pa=aa;qa=c}$=pa+4|0;f[$>>2]=f[$>>2]&-2;f[ha+4>>2]=qa|1;f[ha+qa>>2]=qa;$=qa>>>3;if(qa>>>0<256){ba=18088+($<<1<<2)|0;Z=f[4512]|0;Y=1<<$;if(!(Z&Y)){f[4512]=Z|Y;ra=ba;sa=ba+8|0}else{Y=ba+8|0;ra=f[Y>>2]|0;sa=Y}f[sa>>2]=ha;f[ra+12>>2]=ha;f[ha+8>>2]=ra;f[ha+12>>2]=ba;break}ba=qa>>>8;do if(!ba)ta=0;else{if(qa>>>0>16777215){ta=31;break}Y=(ba+1048320|0)>>>16&8;Z=ba<>>16&4;X=Z<<$;Z=(X+245760|0)>>>16&2;j=14-($|Y|Z)+(X<>>15)|0;ta=qa>>>(j+7|0)&1|j<<1}while(0);ba=18352+(ta<<2)|0;f[ha+28>>2]=ta;_=ha+16|0;f[_+4>>2]=0;f[_>>2]=0;_=f[4513]|0;j=1<>2]=ha;f[ha+24>>2]=ba;f[ha+12>>2]=ha;f[ha+8>>2]=ha;break}j=qa<<((ta|0)==31?0:25-(ta>>>1)|0);_=f[ba>>2]|0;while(1){if((f[_+4>>2]&-8|0)==(qa|0)){H=192;break}ua=_+16+(j>>>31<<2)|0;ba=f[ua>>2]|0;if(!ba){H=191;break}else{j=j<<1;_=ba}}if((H|0)==191){f[ua>>2]=ha;f[ha+24>>2]=_;f[ha+12>>2]=ha;f[ha+8>>2]=ha;break}else if((H|0)==192){j=_+8|0;ba=f[j>>2]|0;f[ba+12>>2]=ha;f[j>>2]=ha;f[ha+8>>2]=ba;f[ha+12>>2]=_;f[ha+24>>2]=0;break}}else{ba=(f[4515]|0)+c|0;f[4515]=ba;f[4518]=ha;f[ha+4>>2]=ba|1}while(0);o=ga+8|0;u=b;return o|0}else la=18496;while(1){ha=f[la>>2]|0;if(ha>>>0<=ca>>>0?(va=ha+(f[la+4>>2]|0)|0,va>>>0>ca>>>0):0)break;la=f[la+8>>2]|0}ga=va+-47|0;ha=ga+8|0;c=ga+((ha&7|0)==0?0:0-ha&7)|0;ha=ca+16|0;ga=c>>>0>>0?ca:c;c=ga+8|0;aa=da+-40|0;fa=ea+8|0;S=(fa&7|0)==0?0:0-fa&7;fa=ea+S|0;ba=aa-S|0;f[4518]=fa;f[4515]=ba;f[fa+4>>2]=ba|1;f[ea+aa+4>>2]=40;f[4519]=f[4634];aa=ga+4|0;f[aa>>2]=27;f[c>>2]=f[4624];f[c+4>>2]=f[4625];f[c+8>>2]=f[4626];f[c+12>>2]=f[4627];f[4624]=ea;f[4625]=da;f[4627]=0;f[4626]=c;c=ga+24|0;do{ba=c;c=c+4|0;f[c>>2]=7}while((ba+8|0)>>>0>>0);if((ga|0)!=(ca|0)){c=ga-ca|0;f[aa>>2]=f[aa>>2]&-2;f[ca+4>>2]=c|1;f[ga>>2]=c;ba=c>>>3;if(c>>>0<256){fa=18088+(ba<<1<<2)|0;S=f[4512]|0;j=1<>2]|0;xa=j}f[xa>>2]=ca;f[wa+12>>2]=ca;f[ca+8>>2]=wa;f[ca+12>>2]=fa;break}fa=c>>>8;if(fa)if(c>>>0>16777215)ya=31;else{j=(fa+1048320|0)>>>16&8;S=fa<>>16&4;ba=S<>>16&2;Z=14-(fa|j|S)+(ba<>>15)|0;ya=c>>>(Z+7|0)&1|Z<<1}else ya=0;Z=18352+(ya<<2)|0;f[ca+28>>2]=ya;f[ca+20>>2]=0;f[ha>>2]=0;S=f[4513]|0;ba=1<>2]=ca;f[ca+24>>2]=Z;f[ca+12>>2]=ca;f[ca+8>>2]=ca;break}ba=c<<((ya|0)==31?0:25-(ya>>>1)|0);S=f[Z>>2]|0;while(1){if((f[S+4>>2]&-8|0)==(c|0)){H=213;break}za=S+16+(ba>>>31<<2)|0;Z=f[za>>2]|0;if(!Z){H=212;break}else{ba=ba<<1;S=Z}}if((H|0)==212){f[za>>2]=ca;f[ca+24>>2]=S;f[ca+12>>2]=ca;f[ca+8>>2]=ca;break}else if((H|0)==213){ba=S+8|0;c=f[ba>>2]|0;f[c+12>>2]=ca;f[ba>>2]=ca;f[ca+8>>2]=c;f[ca+12>>2]=S;f[ca+24>>2]=0;break}}}else{c=f[4516]|0;if((c|0)==0|ea>>>0>>0)f[4516]=ea;f[4624]=ea;f[4625]=da;f[4627]=0;f[4521]=f[4630];f[4520]=-1;f[4525]=18088;f[4524]=18088;f[4527]=18096;f[4526]=18096;f[4529]=18104;f[4528]=18104;f[4531]=18112;f[4530]=18112;f[4533]=18120;f[4532]=18120;f[4535]=18128;f[4534]=18128;f[4537]=18136;f[4536]=18136;f[4539]=18144;f[4538]=18144;f[4541]=18152;f[4540]=18152;f[4543]=18160;f[4542]=18160;f[4545]=18168;f[4544]=18168;f[4547]=18176;f[4546]=18176;f[4549]=18184;f[4548]=18184;f[4551]=18192;f[4550]=18192;f[4553]=18200;f[4552]=18200;f[4555]=18208;f[4554]=18208;f[4557]=18216;f[4556]=18216;f[4559]=18224;f[4558]=18224;f[4561]=18232;f[4560]=18232;f[4563]=18240;f[4562]=18240;f[4565]=18248;f[4564]=18248;f[4567]=18256;f[4566]=18256;f[4569]=18264;f[4568]=18264;f[4571]=18272;f[4570]=18272;f[4573]=18280;f[4572]=18280;f[4575]=18288;f[4574]=18288;f[4577]=18296;f[4576]=18296;f[4579]=18304;f[4578]=18304;f[4581]=18312;f[4580]=18312;f[4583]=18320;f[4582]=18320;f[4585]=18328;f[4584]=18328;f[4587]=18336;f[4586]=18336;c=da+-40|0;ba=ea+8|0;ha=(ba&7|0)==0?0:0-ba&7;ba=ea+ha|0;ga=c-ha|0;f[4518]=ba;f[4515]=ga;f[ba+4>>2]=ga|1;f[ea+c+4>>2]=40;f[4519]=f[4634]}while(0);ea=f[4515]|0;if(ea>>>0>B>>>0){da=ea-B|0;f[4515]=da;ea=f[4518]|0;ca=ea+B|0;f[4518]=ca;f[ca+4>>2]=da|1;f[ea+4>>2]=B|3;o=ea+8|0;u=b;return o|0}}ea=ir()|0;f[ea>>2]=12;o=0;u=b;return o|0}function ab(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0;i=u;u=u+240|0;j=i+104|0;k=i+224|0;l=i+176|0;m=i+160|0;n=i+228|0;o=i+72|0;p=i+40|0;q=i+132|0;r=i;s=i+172|0;t=i+156|0;v=i+152|0;w=i+148|0;x=i+144|0;y=i+128|0;z=a+8|0;Ah(z,c,e,g);e=f[a+48>>2]|0;A=f[a+52>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{oi(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else oi(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)mq(m);else{D=g<<2;B=dn(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;hj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+152|0;D=a+156|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else oi(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=dn(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;hj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+56|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>>2;R=e+64|0;S=e+28|0;T=(g|0)>0;U=r+4|0;V=r+8|0;Z=r+12|0;_=a+152|0;$=a+112|0;aa=r+16|0;ba=r+28|0;ca=a+16|0;da=a+32|0;ea=a+12|0;fa=a+28|0;ga=a+20|0;ha=a+24|0;ia=r+28|0;ja=r+16|0;ka=r+20|0;la=r+32|0;ma=n+1|0;na=g<<2;oa=(g|0)==1;pa=Q+-1|0;if(F-D>>2>>>0>pa>>>0){qa=Q;ra=pa;sa=D;ta=M;ua=P;va=O;wa=M;xa=N;ya=M;za=N}else{Aa=G;mq(Aa)}b:while(1){pa=f[sa+(ra<<2)>>2]|0;Q=(((pa>>>0)%3|0|0)==0?2:-1)+pa|0;Ba=Q>>>5;Ca=1<<(Q&31);Da=(pa|0)==-1|(Q|0)==-1;Ea=1;Fa=0;Ga=pa;c:while(1){Ha=Ea^1;Ia=Fa;Ja=Ga;while(1){if((Ja|0)==-1){Ka=Ia;break c}La=f[l+(Ia*12|0)>>2]|0;if(((f[(f[e>>2]|0)+(Ja>>>5<<2)>>2]&1<<(Ja&31)|0)==0?(Ma=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ja<<2)>>2]|0,(Ma|0)!=-1):0)?(Na=f[S>>2]|0,Oa=f[A>>2]|0,Pa=f[Oa+(f[Na+(Ma<<2)>>2]<<2)>>2]|0,Qa=Ma+1|0,Ra=f[Oa+(f[Na+((((Qa>>>0)%3|0|0)==0?Ma+-2|0:Qa)<<2)>>2]<<2)>>2]|0,Qa=f[Oa+(f[Na+((((Ma>>>0)%3|0|0)==0?2:-1)+Ma<<2)>>2]<<2)>>2]|0,(Pa|0)<(ra|0)&(Ra|0)<(ra|0)&(Qa|0)<(ra|0)):0){Ma=X(Pa,g)|0;Pa=X(Ra,g)|0;Ra=X(Qa,g)|0;if(T){Qa=0;do{f[La+(Qa<<2)>>2]=(f[c+(Qa+Ra<<2)>>2]|0)+(f[c+(Qa+Pa<<2)>>2]|0)-(f[c+(Qa+Ma<<2)>>2]|0);Qa=Qa+1|0}while((Qa|0)!=(g|0))}Qa=Ia+1|0;if((Qa|0)==4){Ka=4;break c}else Sa=Qa}else Sa=Ia;do if(Ea){Qa=Ja+1|0;Ma=((Qa>>>0)%3|0|0)==0?Ja+-2|0:Qa;if(((Ma|0)!=-1?(f[(f[e>>2]|0)+(Ma>>>5<<2)>>2]&1<<(Ma&31)|0)==0:0)?(Qa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ma<<2)>>2]|0,Ma=Qa+1|0,(Qa|0)!=-1):0)Ta=((Ma>>>0)%3|0|0)==0?Qa+-2|0:Ma;else Ta=-1}else{Ma=(((Ja>>>0)%3|0|0)==0?2:-1)+Ja|0;if(((Ma|0)!=-1?(f[(f[e>>2]|0)+(Ma>>>5<<2)>>2]&1<<(Ma&31)|0)==0:0)?(Qa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ma<<2)>>2]|0,(Qa|0)!=-1):0)if(!((Qa>>>0)%3|0)){Ta=Qa+2|0;break}else{Ta=Qa+-1|0;break}else Ta=-1}while(0);if((Ta|0)==(pa|0)){Ka=Sa;break c}if((Ta|0)!=-1|Ha){Ia=Sa;Ja=Ta}else break}if(Da){Ea=0;Fa=Sa;Ga=-1;continue}if(f[(f[e>>2]|0)+(Ba<<2)>>2]&Ca|0){Ea=0;Fa=Sa;Ga=-1;continue}Ja=f[(f[(f[R>>2]|0)+12>>2]|0)+(Q<<2)>>2]|0;if((Ja|0)==-1){Ea=0;Fa=Sa;Ga=-1;continue}if(!((Ja>>>0)%3|0)){Ea=0;Fa=Sa;Ga=Ja+2|0;continue}else{Ea=0;Fa=Sa;Ga=Ja+-1|0;continue}}Ga=X(ra,g)|0;f[r>>2]=0;f[U>>2]=0;b[V>>0]=0;f[Z>>2]=0;f[Z+4>>2]=0;f[Z+8>>2]=0;f[Z+12>>2]=0;f[Z+16>>2]=0;f[Z+20>>2]=0;f[Z+24>>2]=0;Fa=c+((X(qa+-2|0,g)|0)<<2)|0;Ea=c+(Ga<<2)|0;Q=f[_>>2]|0;if(T){Ca=0;Ba=0;while(1){Da=(f[Fa+(Ca<<2)>>2]|0)-(f[Ea+(Ca<<2)>>2]|0)|0;pa=((Da|0)>-1?Da:0-Da|0)+Ba|0;f[ta+(Ca<<2)>>2]=Da;f[Q+(Ca<<2)>>2]=Da<<1^Da>>31;Ca=Ca+1|0;if((Ca|0)==(g|0)){Ua=pa;break}else Ba=pa}}else Ua=0;ho(j,$,Q,g);Ba=Tk(j)|0;Ca=I;pa=om(j)|0;Da=Tn(pa|0,I|0,Ba|0,Ca|0)|0;Ca=I;Ba=(Ka|0)>0;if(Ba){pa=Ka+-1|0;Ja=p+(pa<<3)|0;Ia=Ja;Ha=Tn(f[Ia>>2]|0,f[Ia+4>>2]|0,Ka|0,((Ka|0)<0)<<31>>31|0)|0;Ia=I;Qa=Ja;f[Qa>>2]=Ha;f[Qa+4>>2]=Ia;Va=+W(+(+jm(Ha,f[o+(pa<<3)>>2]|0)*(+(Ha>>>0)+4294967296.0*+(Ia|0))));Ia=Tn(Da|0,Ca|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;Wa=Ia}else Wa=Da;Da=r;f[Da>>2]=Wa;f[Da+4>>2]=Ua;b[V>>0]=0;f[Z>>2]=0;Mf(aa,Fa,Fa+(g<<2)|0);f[s>>2]=ua;f[t>>2]=va;f[k>>2]=f[s>>2];f[j>>2]=f[t>>2];tf(ba,k,j);if((Ka|0)<1){Xa=za;Ya=ya;Za=xa;_a=wa;$a=va;ab=ua;bb=ua}else{Da=n+Ka|0;Ia=f[q>>2]|0;Ca=Ka+-1|0;Ha=o+(Ca<<3)|0;pa=p+(Ca<<3)|0;Ca=Ia;Qa=f[H>>2]|0;Ja=Da+-1|0;Ma=(Ja|0)==(n|0);Pa=Da+-2|0;Ra=ma>>>0>>0;La=~Ka;Na=Ka+2+((La|0)>-2?La:-2)|0;La=Qa;Oa=Ja>>>0>n>>>0;cb=0;db=1;while(1){cb=cb+1|0;hj(n|0,1,Na|0)|0;hj(n|0,0,cb|0)|0;d:while(1){if(T){hj(f[m>>2]|0,0,na|0)|0;eb=f[m>>2]|0;fb=0;gb=0;while(1){if(!(b[n+fb>>0]|0)){hb=f[l+(fb*12|0)>>2]|0;ib=0;do{jb=eb+(ib<<2)|0;f[jb>>2]=(f[jb>>2]|0)+(f[hb+(ib<<2)>>2]|0);ib=ib+1|0}while((ib|0)!=(g|0));kb=(1<>0]|0))mb=(1<>2]|0;do if(T){f[fb>>2]=(f[fb>>2]|0)/(db|0)|0;if(!oa){gb=1;do{eb=fb+(gb<<2)|0;f[eb>>2]=(f[eb>>2]|0)/(db|0)|0;gb=gb+1|0}while((gb|0)!=(g|0));gb=f[_>>2]|0;if(T)nb=gb;else{ob=0;pb=gb;break}}else nb=f[_>>2]|0;gb=0;eb=0;while(1){ib=(f[fb+(gb<<2)>>2]|0)-(f[Ea+(gb<<2)>>2]|0)|0;hb=((ib|0)>-1?ib:0-ib|0)+eb|0;f[Ia+(gb<<2)>>2]=ib;f[nb+(gb<<2)>>2]=ib<<1^ib>>31;gb=gb+1|0;if((gb|0)==(g|0)){ob=hb;pb=nb;break}else eb=hb}}else{ob=0;pb=f[_>>2]|0}while(0);ho(j,$,pb,g);fb=Tk(j)|0;eb=I;gb=om(j)|0;hb=Tn(gb|0,I|0,fb|0,eb|0)|0;eb=I;if(Ba){fb=Ha;gb=Tn(f[fb>>2]|0,f[fb+4>>2]|0,db|0,0)|0;fb=pa;ib=f[fb>>2]|0;jb=f[fb+4>>2]|0;Va=+W(+(+jm(ib,gb)*(+(ib>>>0)+4294967296.0*+(jb|0))));jb=Tn(hb|0,eb|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;qb=jb}else qb=hb;hb=f[r>>2]|0;if(!((qb|0)>=(hb|0)?!((qb|0)<=(hb|0)?(ob|0)<(f[U>>2]|0):0):0)){hb=r;f[hb>>2]=qb;f[hb+4>>2]=ob;b[V>>0]=lb;f[Z>>2]=db;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[k>>2]=f[v>>2];f[j>>2]=f[w>>2];tf(aa,k,j);f[x>>2]=Ca;f[y>>2]=Qa;f[k>>2]=f[x>>2];f[j>>2]=f[y>>2];tf(ba,k,j)}if(Ma)break;rb=b[Ja>>0]|0;hb=-1;jb=rb;while(1){eb=hb+-1|0;sb=Da+eb|0;ib=jb;jb=b[sb>>0]|0;if((jb&255)<(ib&255))break;if((sb|0)==(n|0)){tb=86;break d}else hb=eb}eb=Da+hb|0;if((jb&255)<(rb&255)){ub=Ja;vb=rb}else{ib=Da;gb=Ja;while(1){fb=gb+-1|0;if((jb&255)<(h[ib+-2>>0]|0)){ub=fb;vb=1;break}else{wb=gb;gb=fb;ib=wb}}}b[sb>>0]=vb;b[ub>>0]=jb;if((hb|0)<-1){xb=eb;yb=Ja}else continue;while(1){ib=b[xb>>0]|0;b[xb>>0]=b[yb>>0]|0;b[yb>>0]=ib;ib=xb+1|0;gb=yb+-1|0;if(ib>>>0>>0){xb=ib;yb=gb}else continue d}}if(((tb|0)==86?(tb=0,Oa):0)?(eb=b[n>>0]|0,b[n>>0]=rb,b[Ja>>0]=eb,Ra):0){eb=Pa;hb=ma;do{jb=b[hb>>0]|0;b[hb>>0]=b[eb>>0]|0;b[eb>>0]=jb;hb=hb+1|0;eb=eb+-1|0}while(hb>>>0>>0)}if((db|0)>=(Ka|0)){Xa=La;Ya=Ia;Za=La;_a=Ia;$a=Qa;ab=Ca;bb=Ia;break}else db=db+1|0}}if(Ba){db=f[Z>>2]|0;Ia=o+(Ka+-1<<3)|0;Ca=Ia;Qa=Tn(f[Ca>>2]|0,f[Ca+4>>2]|0,db|0,((db|0)<0)<<31>>31|0)|0;db=Ia;f[db>>2]=Qa;f[db+4>>2]=I}if(T){db=f[ba>>2]|0;Qa=f[C>>2]|0;Ia=0;do{Ca=f[db+(Ia<<2)>>2]|0;f[Qa+(Ia<<2)>>2]=Ca<<1^Ca>>31;Ia=Ia+1|0}while((Ia|0)!=(g|0));zb=Qa}else zb=f[C>>2]|0;go(j,$,zb,g);if(Ba){Qa=Ka+-1|0;Ab=a+60+(Qa*12|0)|0;Ia=a+60+(Qa*12|0)+4|0;db=a+60+(Qa*12|0)+8|0;Qa=0;do{Ca=f[Ia>>2]|0;La=f[db>>2]|0;Pa=(Ca|0)==(La<<5|0);if(!(1<>0])){if(Pa){if((Ca+1|0)<0){tb=114;break b}Ra=La<<6;Ja=Ca+32&-32;hi(Ab,Ca>>>0<1073741823?(Ra>>>0>>0?Ja:Ra):2147483647);Bb=f[Ia>>2]|0}else Bb=Ca;f[Ia>>2]=Bb+1;Ra=(f[Ab>>2]|0)+(Bb>>>5<<2)|0;f[Ra>>2]=f[Ra>>2]|1<<(Bb&31)}else{if(Pa){if((Ca+1|0)<0){tb=119;break b}Pa=La<<6;La=Ca+32&-32;hi(Ab,Ca>>>0<1073741823?(Pa>>>0>>0?La:Pa):2147483647);Cb=f[Ia>>2]|0}else Cb=Ca;f[Ia>>2]=Cb+1;Ca=(f[Ab>>2]|0)+(Cb>>>5<<2)|0;f[Ca>>2]=f[Ca>>2]&~(1<<(Cb&31))}Qa=Qa+1|0}while((Qa|0)<(Ka|0))}Qa=d+(Ga<<2)|0;Ia=f[z>>2]|0;if((Ia|0)>0){db=0;Ba=f[aa>>2]|0;Ca=Ia;while(1){if((Ca|0)>0){Ia=0;do{Pa=f[Ba+(Ia<<2)>>2]|0;La=f[ca>>2]|0;if((Pa|0)>(La|0)){Ra=f[da>>2]|0;f[Ra+(Ia<<2)>>2]=La;Db=Ra}else{Ra=f[ea>>2]|0;La=f[da>>2]|0;f[La+(Ia<<2)>>2]=(Pa|0)<(Ra|0)?Ra:Pa;Db=La}Ia=Ia+1|0}while((Ia|0)<(f[z>>2]|0));Eb=Db}else Eb=f[da>>2]|0;Ia=(f[Ea+(db<<2)>>2]|0)-(f[Eb+(db<<2)>>2]|0)|0;La=Qa+(db<<2)|0;f[La>>2]=Ia;do if((Ia|0)<(f[fa>>2]|0)){Fb=(f[ga>>2]|0)+Ia|0;tb=109}else{if((Ia|0)<=(f[ha>>2]|0))break;Fb=Ia-(f[ga>>2]|0)|0;tb=109}while(0);if((tb|0)==109){tb=0;f[La>>2]=Fb}db=db+1|0;Ca=f[z>>2]|0;if((db|0)>=(Ca|0))break;else Ba=Eb}}Ba=f[ia>>2]|0;if(Ba|0){Ca=f[la>>2]|0;if((Ca|0)!=(Ba|0))f[la>>2]=Ca+(~((Ca+-4-Ba|0)>>>2)<<2);br(Ba)}Ba=f[ja>>2]|0;if(Ba|0){Ca=f[ka>>2]|0;if((Ca|0)!=(Ba|0))f[ka>>2]=Ca+(~((Ca+-4-Ba|0)>>>2)<<2);br(Ba)}if((qa|0)<=2){Gb=_a;Hb=Za;break a}Ba=f[B>>2]|0;sa=f[Ba>>2]|0;Ca=ra+-1|0;if((f[Ba+4>>2]|0)-sa>>2>>>0<=Ca>>>0){Aa=Ba;tb=18;break}else{Ba=ra;ra=Ca;ta=bb;ua=ab;va=$a;wa=_a;xa=Za;ya=Ya;za=Xa;qa=Ba}}if((tb|0)==18)mq(Aa);else if((tb|0)==114)mq(Ab);else if((tb|0)==119)mq(Ab)}else{Gb=M;Hb=N}while(0);N=f[l>>2]|0;if((g|0)>0?(f[N>>2]=0,(g|0)!=1):0){M=1;do{f[N+(M<<2)>>2]=0;M=M+1|0}while((M|0)!=(g|0))}g=f[z>>2]|0;if((g|0)>0){M=a+16|0;Ab=a+32|0;Aa=a+12|0;qa=a+28|0;Xa=a+20|0;za=a+24|0;a=0;Ya=N;N=g;while(1){if((N|0)>0){g=0;do{ya=f[Ya+(g<<2)>>2]|0;Za=f[M>>2]|0;if((ya|0)>(Za|0)){xa=f[Ab>>2]|0;f[xa+(g<<2)>>2]=Za;Ib=xa}else{xa=f[Aa>>2]|0;Za=f[Ab>>2]|0;f[Za+(g<<2)>>2]=(ya|0)<(xa|0)?xa:ya;Ib=Za}g=g+1|0}while((g|0)<(f[z>>2]|0));Jb=Ib}else Jb=f[Ab>>2]|0;g=(f[c+(a<<2)>>2]|0)-(f[Jb+(a<<2)>>2]|0)|0;Za=d+(a<<2)|0;f[Za>>2]=g;if((g|0)>=(f[qa>>2]|0)){if((g|0)>(f[za>>2]|0)){Kb=g-(f[Xa>>2]|0)|0;tb=145}}else{Kb=(f[Xa>>2]|0)+g|0;tb=145}if((tb|0)==145){tb=0;f[Za>>2]=Kb}a=a+1|0;N=f[z>>2]|0;if((a|0)>=(N|0))break;else Ya=Jb}}if(Gb|0){if((Hb|0)!=(Gb|0))f[H>>2]=Hb+(~((Hb+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[m>>2]|0;if(Gb|0){m=f[E>>2]|0;if((m|0)!=(Gb|0))f[E>>2]=m+(~((m+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[l+36>>2]|0;if(Gb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Gb|0))f[m>>2]=E+(~((E+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[l+24>>2]|0;if(Gb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Gb|0))f[E>>2]=m+(~((m+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[l+12>>2]|0;if(Gb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Gb|0))f[m>>2]=E+(~((E+-4-Gb|0)>>>2)<<2);br(Gb)}Gb=f[l>>2]|0;if(!Gb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Gb|0))f[E>>2]=l+(~((l+-4-Gb|0)>>>2)<<2);br(Gb);u=i;return 1}function bb(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0;i=u;u=u+240|0;j=i+104|0;k=i+224|0;l=i+176|0;m=i+160|0;n=i+228|0;o=i+72|0;p=i+40|0;q=i+132|0;r=i;s=i+172|0;t=i+156|0;v=i+152|0;w=i+148|0;x=i+144|0;y=i+128|0;z=a+8|0;Ah(z,c,e,g);e=f[a+48>>2]|0;A=f[a+52>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{oi(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else oi(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)mq(m);else{D=g<<2;B=dn(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;hj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+152|0;D=a+156|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else oi(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=dn(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;hj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+56|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>>2;R=e+12|0;S=(g|0)>0;T=r+4|0;U=r+8|0;V=r+12|0;Z=a+152|0;_=a+112|0;$=r+16|0;aa=r+28|0;ba=a+16|0;ca=a+32|0;da=a+12|0;ea=a+28|0;fa=a+20|0;ga=a+24|0;ha=r+28|0;ia=r+16|0;ja=r+20|0;ka=r+32|0;la=n+1|0;ma=g<<2;na=(g|0)==1;oa=Q+-1|0;if(F-D>>2>>>0>oa>>>0){pa=Q;qa=oa;ra=D;sa=M;ta=P;ua=O;va=M;wa=N;xa=M;ya=N}else{za=G;mq(za)}b:while(1){oa=f[ra+(qa<<2)>>2]|0;Q=(((oa>>>0)%3|0|0)==0?2:-1)+oa|0;Aa=(oa|0)==-1|(Q|0)==-1;Ba=1;Ca=0;Da=oa;c:while(1){Ea=Ba^1;Fa=Ca;Ga=Da;while(1){if((Ga|0)==-1){Ha=Fa;break c}Ia=f[l+(Fa*12|0)>>2]|0;Ja=f[R>>2]|0;Ka=f[Ja+(Ga<<2)>>2]|0;if((Ka|0)!=-1){La=f[e>>2]|0;Ma=f[A>>2]|0;Na=f[Ma+(f[La+(Ka<<2)>>2]<<2)>>2]|0;Oa=Ka+1|0;Pa=((Oa>>>0)%3|0|0)==0?Ka+-2|0:Oa;if((Pa|0)==-1)Qa=-1;else Qa=f[La+(Pa<<2)>>2]|0;Pa=f[Ma+(Qa<<2)>>2]|0;Oa=(((Ka>>>0)%3|0|0)==0?2:-1)+Ka|0;if((Oa|0)==-1)Ra=-1;else Ra=f[La+(Oa<<2)>>2]|0;Oa=f[Ma+(Ra<<2)>>2]|0;if((Na|0)<(qa|0)&(Pa|0)<(qa|0)&(Oa|0)<(qa|0)){Ma=X(Na,g)|0;Na=X(Pa,g)|0;Pa=X(Oa,g)|0;if(S){Oa=0;do{f[Ia+(Oa<<2)>>2]=(f[c+(Oa+Pa<<2)>>2]|0)+(f[c+(Oa+Na<<2)>>2]|0)-(f[c+(Oa+Ma<<2)>>2]|0);Oa=Oa+1|0}while((Oa|0)!=(g|0))}Oa=Fa+1|0;if((Oa|0)==4){Ha=4;break c}else Sa=Oa}else Sa=Fa}else Sa=Fa;do if(Ba){Oa=Ga+1|0;Ma=((Oa>>>0)%3|0|0)==0?Ga+-2|0:Oa;if((Ma|0)!=-1?(Oa=f[Ja+(Ma<<2)>>2]|0,Ma=Oa+1|0,(Oa|0)!=-1):0)Ta=((Ma>>>0)%3|0|0)==0?Oa+-2|0:Ma;else Ta=-1}else{Ma=(((Ga>>>0)%3|0|0)==0?2:-1)+Ga|0;if((Ma|0)!=-1?(Oa=f[Ja+(Ma<<2)>>2]|0,(Oa|0)!=-1):0)if(!((Oa>>>0)%3|0)){Ta=Oa+2|0;break}else{Ta=Oa+-1|0;break}else Ta=-1}while(0);if((Ta|0)==(oa|0)){Ha=Sa;break c}if((Ta|0)!=-1|Ea){Fa=Sa;Ga=Ta}else break}if(Aa){Ba=0;Ca=Sa;Da=-1;continue}Ga=f[Ja+(Q<<2)>>2]|0;if((Ga|0)==-1){Ba=0;Ca=Sa;Da=-1;continue}if(!((Ga>>>0)%3|0)){Ba=0;Ca=Sa;Da=Ga+2|0;continue}else{Ba=0;Ca=Sa;Da=Ga+-1|0;continue}}Da=X(qa,g)|0;f[r>>2]=0;f[T>>2]=0;b[U>>0]=0;f[V>>2]=0;f[V+4>>2]=0;f[V+8>>2]=0;f[V+12>>2]=0;f[V+16>>2]=0;f[V+20>>2]=0;f[V+24>>2]=0;Ca=c+((X(pa+-2|0,g)|0)<<2)|0;Ba=c+(Da<<2)|0;Q=f[Z>>2]|0;if(S){Aa=0;oa=0;while(1){Ga=(f[Ca+(Aa<<2)>>2]|0)-(f[Ba+(Aa<<2)>>2]|0)|0;Fa=((Ga|0)>-1?Ga:0-Ga|0)+oa|0;f[sa+(Aa<<2)>>2]=Ga;f[Q+(Aa<<2)>>2]=Ga<<1^Ga>>31;Aa=Aa+1|0;if((Aa|0)==(g|0)){Ua=Fa;break}else oa=Fa}}else Ua=0;ho(j,_,Q,g);oa=Tk(j)|0;Aa=I;Fa=om(j)|0;Ga=Tn(Fa|0,I|0,oa|0,Aa|0)|0;Aa=I;oa=(Ha|0)>0;if(oa){Fa=Ha+-1|0;Ea=p+(Fa<<3)|0;Oa=Ea;Ma=Tn(f[Oa>>2]|0,f[Oa+4>>2]|0,Ha|0,((Ha|0)<0)<<31>>31|0)|0;Oa=I;Na=Ea;f[Na>>2]=Ma;f[Na+4>>2]=Oa;Va=+W(+(+jm(Ma,f[o+(Fa<<3)>>2]|0)*(+(Ma>>>0)+4294967296.0*+(Oa|0))));Oa=Tn(Ga|0,Aa|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;Wa=Oa}else Wa=Ga;Ga=r;f[Ga>>2]=Wa;f[Ga+4>>2]=Ua;b[U>>0]=0;f[V>>2]=0;Mf($,Ca,Ca+(g<<2)|0);f[s>>2]=ta;f[t>>2]=ua;f[k>>2]=f[s>>2];f[j>>2]=f[t>>2];tf(aa,k,j);if((Ha|0)<1){Xa=ya;Ya=xa;Za=wa;_a=va;$a=ua;ab=ta;bb=ta}else{Ga=n+Ha|0;Oa=f[q>>2]|0;Aa=Ha+-1|0;Ma=o+(Aa<<3)|0;Fa=p+(Aa<<3)|0;Aa=Oa;Na=f[H>>2]|0;Ea=Ga+-1|0;Pa=(Ea|0)==(n|0);Ia=Ga+-2|0;La=la>>>0>>0;Ka=~Ha;cb=Ha+2+((Ka|0)>-2?Ka:-2)|0;Ka=Na;db=Ea>>>0>n>>>0;eb=0;fb=1;while(1){eb=eb+1|0;hj(n|0,1,cb|0)|0;hj(n|0,0,eb|0)|0;d:while(1){if(S){hj(f[m>>2]|0,0,ma|0)|0;gb=f[m>>2]|0;hb=0;ib=0;while(1){if(!(b[n+hb>>0]|0)){jb=f[l+(hb*12|0)>>2]|0;kb=0;do{lb=gb+(kb<<2)|0;f[lb>>2]=(f[lb>>2]|0)+(f[jb+(kb<<2)>>2]|0);kb=kb+1|0}while((kb|0)!=(g|0));mb=(1<>0]|0))ob=(1<>2]|0;do if(S){f[hb>>2]=(f[hb>>2]|0)/(fb|0)|0;if(!na){ib=1;do{gb=hb+(ib<<2)|0;f[gb>>2]=(f[gb>>2]|0)/(fb|0)|0;ib=ib+1|0}while((ib|0)!=(g|0));ib=f[Z>>2]|0;if(S)pb=ib;else{qb=0;rb=ib;break}}else pb=f[Z>>2]|0;ib=0;gb=0;while(1){kb=(f[hb+(ib<<2)>>2]|0)-(f[Ba+(ib<<2)>>2]|0)|0;jb=((kb|0)>-1?kb:0-kb|0)+gb|0;f[Oa+(ib<<2)>>2]=kb;f[pb+(ib<<2)>>2]=kb<<1^kb>>31;ib=ib+1|0;if((ib|0)==(g|0)){qb=jb;rb=pb;break}else gb=jb}}else{qb=0;rb=f[Z>>2]|0}while(0);ho(j,_,rb,g);hb=Tk(j)|0;gb=I;ib=om(j)|0;jb=Tn(ib|0,I|0,hb|0,gb|0)|0;gb=I;if(oa){hb=Ma;ib=Tn(f[hb>>2]|0,f[hb+4>>2]|0,fb|0,0)|0;hb=Fa;kb=f[hb>>2]|0;lb=f[hb+4>>2]|0;Va=+W(+(+jm(kb,ib)*(+(kb>>>0)+4294967296.0*+(lb|0))));lb=Tn(jb|0,gb|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;sb=lb}else sb=jb;jb=f[r>>2]|0;if(!((sb|0)>=(jb|0)?!((sb|0)<=(jb|0)?(qb|0)<(f[T>>2]|0):0):0)){jb=r;f[jb>>2]=sb;f[jb+4>>2]=qb;b[U>>0]=nb;f[V>>2]=fb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[k>>2]=f[v>>2];f[j>>2]=f[w>>2];tf($,k,j);f[x>>2]=Aa;f[y>>2]=Na;f[k>>2]=f[x>>2];f[j>>2]=f[y>>2];tf(aa,k,j)}if(Pa)break;tb=b[Ea>>0]|0;jb=-1;lb=tb;while(1){gb=jb+-1|0;ub=Ga+gb|0;kb=lb;lb=b[ub>>0]|0;if((lb&255)<(kb&255))break;if((ub|0)==(n|0)){vb=86;break d}else jb=gb}gb=Ga+jb|0;if((lb&255)<(tb&255)){wb=Ea;xb=tb}else{kb=Ga;ib=Ea;while(1){hb=ib+-1|0;if((lb&255)<(h[kb+-2>>0]|0)){wb=hb;xb=1;break}else{yb=ib;ib=hb;kb=yb}}}b[ub>>0]=xb;b[wb>>0]=lb;if((jb|0)<-1){zb=gb;Ab=Ea}else continue;while(1){kb=b[zb>>0]|0;b[zb>>0]=b[Ab>>0]|0;b[Ab>>0]=kb;kb=zb+1|0;ib=Ab+-1|0;if(kb>>>0>>0){zb=kb;Ab=ib}else continue d}}if(((vb|0)==86?(vb=0,db):0)?(gb=b[n>>0]|0,b[n>>0]=tb,b[Ea>>0]=gb,La):0){gb=Ia;jb=la;do{lb=b[jb>>0]|0;b[jb>>0]=b[gb>>0]|0;b[gb>>0]=lb;jb=jb+1|0;gb=gb+-1|0}while(jb>>>0>>0)}if((fb|0)>=(Ha|0)){Xa=Ka;Ya=Oa;Za=Ka;_a=Oa;$a=Na;ab=Aa;bb=Oa;break}else fb=fb+1|0}}if(oa){fb=f[V>>2]|0;Oa=o+(Ha+-1<<3)|0;Aa=Oa;Na=Tn(f[Aa>>2]|0,f[Aa+4>>2]|0,fb|0,((fb|0)<0)<<31>>31|0)|0;fb=Oa;f[fb>>2]=Na;f[fb+4>>2]=I}if(S){fb=f[aa>>2]|0;Na=f[C>>2]|0;Oa=0;do{Aa=f[fb+(Oa<<2)>>2]|0;f[Na+(Oa<<2)>>2]=Aa<<1^Aa>>31;Oa=Oa+1|0}while((Oa|0)!=(g|0));Bb=Na}else Bb=f[C>>2]|0;go(j,_,Bb,g);if(oa){Na=Ha+-1|0;Cb=a+60+(Na*12|0)|0;Oa=a+60+(Na*12|0)+4|0;fb=a+60+(Na*12|0)+8|0;Na=0;do{Aa=f[Oa>>2]|0;Ka=f[fb>>2]|0;Ia=(Aa|0)==(Ka<<5|0);if(!(1<>0])){if(Ia){if((Aa+1|0)<0){vb=114;break b}La=Ka<<6;Ea=Aa+32&-32;hi(Cb,Aa>>>0<1073741823?(La>>>0>>0?Ea:La):2147483647);Db=f[Oa>>2]|0}else Db=Aa;f[Oa>>2]=Db+1;La=(f[Cb>>2]|0)+(Db>>>5<<2)|0;f[La>>2]=f[La>>2]|1<<(Db&31)}else{if(Ia){if((Aa+1|0)<0){vb=119;break b}Ia=Ka<<6;Ka=Aa+32&-32;hi(Cb,Aa>>>0<1073741823?(Ia>>>0>>0?Ka:Ia):2147483647);Eb=f[Oa>>2]|0}else Eb=Aa;f[Oa>>2]=Eb+1;Aa=(f[Cb>>2]|0)+(Eb>>>5<<2)|0;f[Aa>>2]=f[Aa>>2]&~(1<<(Eb&31))}Na=Na+1|0}while((Na|0)<(Ha|0))}Na=d+(Da<<2)|0;Oa=f[z>>2]|0;if((Oa|0)>0){fb=0;oa=f[$>>2]|0;Aa=Oa;while(1){if((Aa|0)>0){Oa=0;do{Ia=f[oa+(Oa<<2)>>2]|0;Ka=f[ba>>2]|0;if((Ia|0)>(Ka|0)){La=f[ca>>2]|0;f[La+(Oa<<2)>>2]=Ka;Fb=La}else{La=f[da>>2]|0;Ka=f[ca>>2]|0;f[Ka+(Oa<<2)>>2]=(Ia|0)<(La|0)?La:Ia;Fb=Ka}Oa=Oa+1|0}while((Oa|0)<(f[z>>2]|0));Gb=Fb}else Gb=f[ca>>2]|0;Oa=(f[Ba+(fb<<2)>>2]|0)-(f[Gb+(fb<<2)>>2]|0)|0;Ka=Na+(fb<<2)|0;f[Ka>>2]=Oa;do if((Oa|0)<(f[ea>>2]|0)){Hb=(f[fa>>2]|0)+Oa|0;vb=109}else{if((Oa|0)<=(f[ga>>2]|0))break;Hb=Oa-(f[fa>>2]|0)|0;vb=109}while(0);if((vb|0)==109){vb=0;f[Ka>>2]=Hb}fb=fb+1|0;Aa=f[z>>2]|0;if((fb|0)>=(Aa|0))break;else oa=Gb}}oa=f[ha>>2]|0;if(oa|0){Aa=f[ka>>2]|0;if((Aa|0)!=(oa|0))f[ka>>2]=Aa+(~((Aa+-4-oa|0)>>>2)<<2);br(oa)}oa=f[ia>>2]|0;if(oa|0){Aa=f[ja>>2]|0;if((Aa|0)!=(oa|0))f[ja>>2]=Aa+(~((Aa+-4-oa|0)>>>2)<<2);br(oa)}if((pa|0)<=2){Ib=_a;Jb=Za;break a}oa=f[B>>2]|0;ra=f[oa>>2]|0;Aa=qa+-1|0;if((f[oa+4>>2]|0)-ra>>2>>>0<=Aa>>>0){za=oa;vb=18;break}else{oa=qa;qa=Aa;sa=bb;ta=ab;ua=$a;va=_a;wa=Za;xa=Ya;ya=Xa;pa=oa}}if((vb|0)==18)mq(za);else if((vb|0)==114)mq(Cb);else if((vb|0)==119)mq(Cb)}else{Ib=M;Jb=N}while(0);N=f[l>>2]|0;if((g|0)>0?(f[N>>2]=0,(g|0)!=1):0){M=1;do{f[N+(M<<2)>>2]=0;M=M+1|0}while((M|0)!=(g|0))}g=f[z>>2]|0;if((g|0)>0){M=a+16|0;Cb=a+32|0;za=a+12|0;pa=a+28|0;Xa=a+20|0;ya=a+24|0;a=0;Ya=N;N=g;while(1){if((N|0)>0){g=0;do{xa=f[Ya+(g<<2)>>2]|0;Za=f[M>>2]|0;if((xa|0)>(Za|0)){wa=f[Cb>>2]|0;f[wa+(g<<2)>>2]=Za;Kb=wa}else{wa=f[za>>2]|0;Za=f[Cb>>2]|0;f[Za+(g<<2)>>2]=(xa|0)<(wa|0)?wa:xa;Kb=Za}g=g+1|0}while((g|0)<(f[z>>2]|0));Lb=Kb}else Lb=f[Cb>>2]|0;g=(f[c+(a<<2)>>2]|0)-(f[Lb+(a<<2)>>2]|0)|0;Za=d+(a<<2)|0;f[Za>>2]=g;if((g|0)>=(f[pa>>2]|0)){if((g|0)>(f[ya>>2]|0)){Mb=g-(f[Xa>>2]|0)|0;vb=145}}else{Mb=(f[Xa>>2]|0)+g|0;vb=145}if((vb|0)==145){vb=0;f[Za>>2]=Mb}a=a+1|0;N=f[z>>2]|0;if((a|0)>=(N|0))break;else Ya=Lb}}if(Ib|0){if((Jb|0)!=(Ib|0))f[H>>2]=Jb+(~((Jb+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[m>>2]|0;if(Ib|0){m=f[E>>2]|0;if((m|0)!=(Ib|0))f[E>>2]=m+(~((m+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[l+36>>2]|0;if(Ib|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Ib|0))f[m>>2]=E+(~((E+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[l+24>>2]|0;if(Ib|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Ib|0))f[E>>2]=m+(~((m+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[l+12>>2]|0;if(Ib|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Ib|0))f[m>>2]=E+(~((E+-4-Ib|0)>>>2)<<2);br(Ib)}Ib=f[l>>2]|0;if(!Ib){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Ib|0))f[E>>2]=l+(~((l+-4-Ib|0)>>>2)<<2);br(Ib);u=i;return 1}function cb(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;b=u;u=u+16|0;c=b;d=b+8|0;e=b+4|0;f[d>>2]=a;do if(a>>>0>=212){g=(a>>>0)/210|0;h=g*210|0;f[e>>2]=a-h;i=0;j=g;g=(zl(6640,6832,e,c)|0)-6640>>2;k=h;a:while(1){l=(f[6640+(g<<2)>>2]|0)+k|0;h=5;while(1){if(h>>>0>=47){m=211;n=i;o=8;break}p=f[6448+(h<<2)>>2]|0;q=(l>>>0)/(p>>>0)|0;if(q>>>0

>>0){o=106;break a}if((l|0)==(X(q,p)|0)){r=i;break}else h=h+1|0}b:do if((o|0)==8){c:while(1){o=0;h=(l>>>0)/(m>>>0)|0;do if(h>>>0>=m>>>0)if((l|0)!=(X(h,m)|0)){p=m+10|0;q=(l>>>0)/(p>>>0)|0;if(q>>>0>=p>>>0)if((l|0)!=(X(q,p)|0)){q=m+12|0;s=(l>>>0)/(q>>>0)|0;if(s>>>0>=q>>>0)if((l|0)!=(X(s,q)|0)){s=m+16|0;t=(l>>>0)/(s>>>0)|0;if(t>>>0>=s>>>0)if((l|0)!=(X(t,s)|0)){t=m+18|0;v=(l>>>0)/(t>>>0)|0;if(v>>>0>=t>>>0)if((l|0)!=(X(v,t)|0)){v=m+22|0;w=(l>>>0)/(v>>>0)|0;if(w>>>0>=v>>>0)if((l|0)!=(X(w,v)|0)){w=m+28|0;x=(l>>>0)/(w>>>0)|0;if(x>>>0>=w>>>0)if((l|0)==(X(x,w)|0)){y=w;z=9;A=n}else{x=m+30|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+36|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+40|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+42|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+46|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+52|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+58|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+60|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+66|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+70|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+72|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+78|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+82|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+88|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+96|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+100|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+102|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+106|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+108|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+112|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+120|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+126|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+130|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+136|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+138|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+142|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+148|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+150|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+156|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+162|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+166|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+168|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+172|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+178|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+180|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+186|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+190|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+192|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+196|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+198|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+208|0;B=(l>>>0)/(x>>>0)|0;C=B>>>0>>0;D=(l|0)==(X(B,x)|0);y=C|D?x:m+210|0;z=C?1:D?9:0;A=C?l:n}else{y=w;z=1;A=l}}else{y=v;z=9;A=n}else{y=v;z=1;A=l}}else{y=t;z=9;A=n}else{y=t;z=1;A=l}}else{y=s;z=9;A=n}else{y=s;z=1;A=l}}else{y=q;z=9;A=n}else{y=q;z=1;A=l}}else{y=p;z=9;A=n}else{y=p;z=1;A=l}}else{y=m;z=9;A=n}else{y=m;z=1;A=l}while(0);switch(z&15){case 9:{r=A;break b;break}case 0:{m=y;n=A;o=8;break}default:break c}}if(!z)r=A;else{o=107;break a}}while(0);h=g+1|0;p=(h|0)==48;q=j+(p&1)|0;i=r;j=q;g=p?0:h;k=q*210|0}if((o|0)==106){f[d>>2]=l;E=l;break}else if((o|0)==107){f[d>>2]=l;E=A;break}}else{k=zl(6448,6640,d,c)|0;E=f[k>>2]|0}while(0);u=b;return E|0}function db(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0;i=u;u=u+256|0;e=i+104|0;j=i+240|0;k=i+224|0;l=i+160|0;m=i+140|0;n=i+248|0;o=i+72|0;p=i+40|0;q=i+128|0;r=i;s=i+232|0;t=i+220|0;v=i+216|0;w=i+212|0;x=i+208|0;y=i+152|0;z=f[a+28>>2]|0;A=f[a+32>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{oi(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else oi(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)mq(m);else{D=g<<2;B=dn(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;hj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+136|0;D=a+140|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else oi(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=dn(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;hj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+36|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>>2;R=z+64|0;S=z+28|0;T=(g|0)>0;U=r+4|0;V=r+8|0;Z=r+12|0;_=a+136|0;$=a+96|0;aa=r+16|0;ba=r+28|0;ca=a+8|0;da=j+4|0;ea=k+4|0;fa=e+4|0;ga=r+28|0;ha=r+16|0;ia=r+20|0;ja=r+32|0;ka=n+1|0;la=g<<2;ma=(g|0)==1;na=Q+-1|0;if(F-D>>2>>>0>na>>>0){oa=Q;pa=na;qa=D;ra=M;sa=P;ta=O;ua=M;va=N;wa=M;xa=N}else{ya=G;mq(ya)}b:while(1){na=f[qa+(pa<<2)>>2]|0;Q=(((na>>>0)%3|0|0)==0?2:-1)+na|0;za=Q>>>5;Aa=1<<(Q&31);Ba=(na|0)==-1|(Q|0)==-1;Ca=1;Da=0;Ea=na;c:while(1){Fa=Ca^1;Ga=Da;Ha=Ea;while(1){if((Ha|0)==-1){Ia=Ga;break c}Ja=f[l+(Ga*12|0)>>2]|0;if(((f[(f[z>>2]|0)+(Ha>>>5<<2)>>2]&1<<(Ha&31)|0)==0?(Ka=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ha<<2)>>2]|0,(Ka|0)!=-1):0)?(La=f[S>>2]|0,Ma=f[A>>2]|0,Na=f[Ma+(f[La+(Ka<<2)>>2]<<2)>>2]|0,Oa=Ka+1|0,Pa=f[Ma+(f[La+((((Oa>>>0)%3|0|0)==0?Ka+-2|0:Oa)<<2)>>2]<<2)>>2]|0,Oa=f[Ma+(f[La+((((Ka>>>0)%3|0|0)==0?2:-1)+Ka<<2)>>2]<<2)>>2]|0,(Na|0)<(pa|0)&(Pa|0)<(pa|0)&(Oa|0)<(pa|0)):0){Ka=X(Na,g)|0;Na=X(Pa,g)|0;Pa=X(Oa,g)|0;if(T){Oa=0;do{f[Ja+(Oa<<2)>>2]=(f[c+(Oa+Pa<<2)>>2]|0)+(f[c+(Oa+Na<<2)>>2]|0)-(f[c+(Oa+Ka<<2)>>2]|0);Oa=Oa+1|0}while((Oa|0)!=(g|0))}Oa=Ga+1|0;if((Oa|0)==4){Ia=4;break c}else Qa=Oa}else Qa=Ga;do if(Ca){Oa=Ha+1|0;Ka=((Oa>>>0)%3|0|0)==0?Ha+-2|0:Oa;if(((Ka|0)!=-1?(f[(f[z>>2]|0)+(Ka>>>5<<2)>>2]&1<<(Ka&31)|0)==0:0)?(Oa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ka<<2)>>2]|0,Ka=Oa+1|0,(Oa|0)!=-1):0)Ra=((Ka>>>0)%3|0|0)==0?Oa+-2|0:Ka;else Ra=-1}else{Ka=(((Ha>>>0)%3|0|0)==0?2:-1)+Ha|0;if(((Ka|0)!=-1?(f[(f[z>>2]|0)+(Ka>>>5<<2)>>2]&1<<(Ka&31)|0)==0:0)?(Oa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ka<<2)>>2]|0,(Oa|0)!=-1):0)if(!((Oa>>>0)%3|0)){Ra=Oa+2|0;break}else{Ra=Oa+-1|0;break}else Ra=-1}while(0);if((Ra|0)==(na|0)){Ia=Qa;break c}if((Ra|0)!=-1|Fa){Ga=Qa;Ha=Ra}else break}if(Ba){Ca=0;Da=Qa;Ea=-1;continue}if(f[(f[z>>2]|0)+(za<<2)>>2]&Aa|0){Ca=0;Da=Qa;Ea=-1;continue}Ha=f[(f[(f[R>>2]|0)+12>>2]|0)+(Q<<2)>>2]|0;if((Ha|0)==-1){Ca=0;Da=Qa;Ea=-1;continue}if(!((Ha>>>0)%3|0)){Ca=0;Da=Qa;Ea=Ha+2|0;continue}else{Ca=0;Da=Qa;Ea=Ha+-1|0;continue}}Ea=X(pa,g)|0;f[r>>2]=0;f[U>>2]=0;b[V>>0]=0;f[Z>>2]=0;f[Z+4>>2]=0;f[Z+8>>2]=0;f[Z+12>>2]=0;f[Z+16>>2]=0;f[Z+20>>2]=0;f[Z+24>>2]=0;Da=c+((X(oa+-2|0,g)|0)<<2)|0;Ca=c+(Ea<<2)|0;Q=f[_>>2]|0;if(T){Aa=0;za=0;while(1){Ba=(f[Da+(Aa<<2)>>2]|0)-(f[Ca+(Aa<<2)>>2]|0)|0;na=((Ba|0)>-1?Ba:0-Ba|0)+za|0;f[ra+(Aa<<2)>>2]=Ba;f[Q+(Aa<<2)>>2]=Ba<<1^Ba>>31;Aa=Aa+1|0;if((Aa|0)==(g|0)){Sa=na;break}else za=na}}else Sa=0;ho(e,$,Q,g);za=Tk(e)|0;Aa=I;na=om(e)|0;Ba=Tn(na|0,I|0,za|0,Aa|0)|0;Aa=I;za=(Ia|0)>0;if(za){na=Ia+-1|0;Ha=p+(na<<3)|0;Ga=Ha;Fa=Tn(f[Ga>>2]|0,f[Ga+4>>2]|0,Ia|0,((Ia|0)<0)<<31>>31|0)|0;Ga=I;Oa=Ha;f[Oa>>2]=Fa;f[Oa+4>>2]=Ga;Ta=+W(+(+jm(Fa,f[o+(na<<3)>>2]|0)*(+(Fa>>>0)+4294967296.0*+(Ga|0))));Ga=Tn(Ba|0,Aa|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;Ua=Ga}else Ua=Ba;Ba=r;f[Ba>>2]=Ua;f[Ba+4>>2]=Sa;b[V>>0]=0;f[Z>>2]=0;Mf(aa,Da,Da+(g<<2)|0);f[s>>2]=sa;f[t>>2]=ta;f[j>>2]=f[s>>2];f[e>>2]=f[t>>2];tf(ba,j,e);if((Ia|0)<1){Va=xa;Wa=wa;Xa=va;Ya=ua;Za=ta;_a=sa;$a=sa}else{Ba=n+Ia|0;Ga=f[q>>2]|0;Aa=Ia+-1|0;Fa=o+(Aa<<3)|0;na=p+(Aa<<3)|0;Aa=Ga;Oa=f[H>>2]|0;Ha=Ba+-1|0;Ka=(Ha|0)==(n|0);Na=Ba+-2|0;Pa=ka>>>0>>0;Ja=~Ia;La=Ia+2+((Ja|0)>-2?Ja:-2)|0;Ja=Oa;Ma=Ha>>>0>n>>>0;ab=0;bb=1;while(1){ab=ab+1|0;hj(n|0,1,La|0)|0;hj(n|0,0,ab|0)|0;d:while(1){if(T){hj(f[m>>2]|0,0,la|0)|0;cb=f[m>>2]|0;db=0;eb=0;while(1){if(!(b[n+db>>0]|0)){fb=f[l+(db*12|0)>>2]|0;gb=0;do{hb=cb+(gb<<2)|0;f[hb>>2]=(f[hb>>2]|0)+(f[fb+(gb<<2)>>2]|0);gb=gb+1|0}while((gb|0)!=(g|0));ib=(1<>0]|0))kb=(1<>2]|0;do if(T){f[db>>2]=(f[db>>2]|0)/(bb|0)|0;if(!ma){eb=1;do{cb=db+(eb<<2)|0;f[cb>>2]=(f[cb>>2]|0)/(bb|0)|0;eb=eb+1|0}while((eb|0)!=(g|0));eb=f[_>>2]|0;if(T)lb=eb;else{mb=0;nb=eb;break}}else lb=f[_>>2]|0;eb=0;cb=0;while(1){gb=(f[db+(eb<<2)>>2]|0)-(f[Ca+(eb<<2)>>2]|0)|0;fb=((gb|0)>-1?gb:0-gb|0)+cb|0;f[Ga+(eb<<2)>>2]=gb;f[lb+(eb<<2)>>2]=gb<<1^gb>>31;eb=eb+1|0;if((eb|0)==(g|0)){mb=fb;nb=lb;break}else cb=fb}}else{mb=0;nb=f[_>>2]|0}while(0);ho(e,$,nb,g);db=Tk(e)|0;cb=I;eb=om(e)|0;fb=Tn(eb|0,I|0,db|0,cb|0)|0;cb=I;if(za){db=Fa;eb=Tn(f[db>>2]|0,f[db+4>>2]|0,bb|0,0)|0;db=na;gb=f[db>>2]|0;hb=f[db+4>>2]|0;Ta=+W(+(+jm(gb,eb)*(+(gb>>>0)+4294967296.0*+(hb|0))));hb=Tn(fb|0,cb|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;ob=hb}else ob=fb;fb=f[r>>2]|0;if(!((ob|0)>=(fb|0)?!((ob|0)<=(fb|0)?(mb|0)<(f[U>>2]|0):0):0)){fb=r;f[fb>>2]=ob;f[fb+4>>2]=mb;b[V>>0]=jb;f[Z>>2]=bb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[j>>2]=f[v>>2];f[e>>2]=f[w>>2];tf(aa,j,e);f[x>>2]=Aa;f[y>>2]=Oa;f[j>>2]=f[x>>2];f[e>>2]=f[y>>2];tf(ba,j,e)}if(Ka)break;pb=b[Ha>>0]|0;fb=-1;hb=pb;while(1){cb=fb+-1|0;qb=Ba+cb|0;gb=hb;hb=b[qb>>0]|0;if((hb&255)<(gb&255))break;if((qb|0)==(n|0)){rb=86;break d}else fb=cb}cb=Ba+fb|0;if((hb&255)<(pb&255)){sb=Ha;tb=pb}else{gb=Ba;eb=Ha;while(1){db=eb+-1|0;if((hb&255)<(h[gb+-2>>0]|0)){sb=db;tb=1;break}else{ub=eb;eb=db;gb=ub}}}b[qb>>0]=tb;b[sb>>0]=hb;if((fb|0)<-1){vb=cb;wb=Ha}else continue;while(1){gb=b[vb>>0]|0;b[vb>>0]=b[wb>>0]|0;b[wb>>0]=gb;gb=vb+1|0;eb=wb+-1|0;if(gb>>>0>>0){vb=gb;wb=eb}else continue d}}if(((rb|0)==86?(rb=0,Ma):0)?(cb=b[n>>0]|0,b[n>>0]=pb,b[Ha>>0]=cb,Pa):0){cb=Na;fb=ka;do{hb=b[fb>>0]|0;b[fb>>0]=b[cb>>0]|0;b[cb>>0]=hb;fb=fb+1|0;cb=cb+-1|0}while(fb>>>0>>0)}if((bb|0)>=(Ia|0)){Va=Ja;Wa=Ga;Xa=Ja;Ya=Ga;Za=Oa;_a=Aa;$a=Ga;break}else bb=bb+1|0}}if(za){bb=f[Z>>2]|0;Ga=o+(Ia+-1<<3)|0;Aa=Ga;Oa=Tn(f[Aa>>2]|0,f[Aa+4>>2]|0,bb|0,((bb|0)<0)<<31>>31|0)|0;bb=Ga;f[bb>>2]=Oa;f[bb+4>>2]=I}if(T){bb=f[ba>>2]|0;Oa=f[C>>2]|0;Ga=0;do{Aa=f[bb+(Ga<<2)>>2]|0;f[Oa+(Ga<<2)>>2]=Aa<<1^Aa>>31;Ga=Ga+1|0}while((Ga|0)!=(g|0));xb=Oa}else xb=f[C>>2]|0;go(e,$,xb,g);if(za){Oa=Ia+-1|0;yb=a+40+(Oa*12|0)|0;Ga=a+40+(Oa*12|0)+4|0;bb=a+40+(Oa*12|0)+8|0;Oa=0;do{Aa=f[Ga>>2]|0;Ja=f[bb>>2]|0;Na=(Aa|0)==(Ja<<5|0);if(!(1<>0])){if(Na){if((Aa+1|0)<0){rb=101;break b}Pa=Ja<<6;Ha=Aa+32&-32;hi(yb,Aa>>>0<1073741823?(Pa>>>0>>0?Ha:Pa):2147483647);zb=f[Ga>>2]|0}else zb=Aa;f[Ga>>2]=zb+1;Pa=(f[yb>>2]|0)+(zb>>>5<<2)|0;f[Pa>>2]=f[Pa>>2]|1<<(zb&31)}else{if(Na){if((Aa+1|0)<0){rb=106;break b}Na=Ja<<6;Ja=Aa+32&-32;hi(yb,Aa>>>0<1073741823?(Na>>>0>>0?Ja:Na):2147483647);Ab=f[Ga>>2]|0}else Ab=Aa;f[Ga>>2]=Ab+1;Aa=(f[yb>>2]|0)+(Ab>>>5<<2)|0;f[Aa>>2]=f[Aa>>2]&~(1<<(Ab&31))}Oa=Oa+1|0}while((Oa|0)<(Ia|0))}Oa=f[aa>>2]|0;Ga=d+(Ea<<2)|0;bb=f[Ca+4>>2]|0;za=f[Oa>>2]|0;Aa=f[Oa+4>>2]|0;f[j>>2]=f[Ca>>2];f[da>>2]=bb;f[k>>2]=za;f[ea>>2]=Aa;Dd(e,ca,j,k);f[Ga>>2]=f[e>>2];f[Ga+4>>2]=f[fa>>2];Ga=f[ga>>2]|0;if(Ga|0){Aa=f[ja>>2]|0;if((Aa|0)!=(Ga|0))f[ja>>2]=Aa+(~((Aa+-4-Ga|0)>>>2)<<2);br(Ga)}Ga=f[ha>>2]|0;if(Ga|0){Aa=f[ia>>2]|0;if((Aa|0)!=(Ga|0))f[ia>>2]=Aa+(~((Aa+-4-Ga|0)>>>2)<<2);br(Ga)}if((oa|0)<=2){Bb=Ya;Cb=Xa;break a}Ga=f[B>>2]|0;qa=f[Ga>>2]|0;Aa=pa+-1|0;if((f[Ga+4>>2]|0)-qa>>2>>>0<=Aa>>>0){ya=Ga;rb=18;break}else{Ga=pa;pa=Aa;ra=$a;sa=_a;ta=Za;ua=Ya;va=Xa;wa=Wa;xa=Va;oa=Ga}}if((rb|0)==18)mq(ya);else if((rb|0)==101)mq(yb);else if((rb|0)==106)mq(yb)}else{Bb=M;Cb=N}while(0);if((g|0)>0)hj(f[l>>2]|0,0,g<<2|0)|0;g=f[l>>2]|0;N=f[c+4>>2]|0;M=f[g>>2]|0;yb=f[g+4>>2]|0;f[j>>2]=f[c>>2];f[j+4>>2]=N;f[k>>2]=M;f[k+4>>2]=yb;Dd(e,a+8|0,j,k);f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];if(Bb|0){if((Cb|0)!=(Bb|0))f[H>>2]=Cb+(~((Cb+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[m>>2]|0;if(Bb|0){m=f[E>>2]|0;if((m|0)!=(Bb|0))f[E>>2]=m+(~((m+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[l+36>>2]|0;if(Bb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Bb|0))f[m>>2]=E+(~((E+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[l+24>>2]|0;if(Bb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Bb|0))f[E>>2]=m+(~((m+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[l+12>>2]|0;if(Bb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Bb|0))f[m>>2]=E+(~((E+-4-Bb|0)>>>2)<<2);br(Bb)}Bb=f[l>>2]|0;if(!Bb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Bb|0))f[E>>2]=l+(~((l+-4-Bb|0)>>>2)<<2);br(Bb);u=i;return 1}function eb(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0;i=u;u=u+256|0;e=i+104|0;j=i+240|0;k=i+224|0;l=i+160|0;m=i+140|0;n=i+248|0;o=i+72|0;p=i+40|0;q=i+128|0;r=i;s=i+232|0;t=i+220|0;v=i+216|0;w=i+212|0;x=i+208|0;y=i+152|0;z=f[a+28>>2]|0;A=f[a+32>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{oi(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else oi(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else oi(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)mq(m);else{D=g<<2;B=dn(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;hj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+136|0;D=a+140|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else oi(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=dn(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;hj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+36|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>>2;R=z+12|0;S=(g|0)>0;T=r+4|0;U=r+8|0;V=r+12|0;Z=a+136|0;_=a+96|0;$=r+16|0;aa=r+28|0;ba=a+8|0;ca=j+4|0;da=k+4|0;ea=e+4|0;fa=r+28|0;ga=r+16|0;ha=r+20|0;ia=r+32|0;ja=n+1|0;ka=g<<2;la=(g|0)==1;ma=Q+-1|0;if(F-D>>2>>>0>ma>>>0){na=Q;oa=ma;pa=M;qa=P;ra=O;sa=M;ta=N;ua=M;va=N;wa=D}else{xa=G;mq(xa)}b:while(1){ma=f[wa+(oa<<2)>>2]|0;Q=(((ma>>>0)%3|0|0)==0?2:-1)+ma|0;ya=(ma|0)==-1|(Q|0)==-1;za=1;Aa=0;Ba=ma;c:while(1){Ca=za^1;Da=Aa;Ea=Ba;while(1){if((Ea|0)==-1){Fa=Da;break c}Ga=f[l+(Da*12|0)>>2]|0;Ha=f[R>>2]|0;Ia=f[Ha+(Ea<<2)>>2]|0;if((Ia|0)!=-1){Ja=f[z>>2]|0;Ka=f[A>>2]|0;La=f[Ka+(f[Ja+(Ia<<2)>>2]<<2)>>2]|0;Ma=Ia+1|0;Na=((Ma>>>0)%3|0|0)==0?Ia+-2|0:Ma;if((Na|0)==-1)Oa=-1;else Oa=f[Ja+(Na<<2)>>2]|0;Na=f[Ka+(Oa<<2)>>2]|0;Ma=(((Ia>>>0)%3|0|0)==0?2:-1)+Ia|0;if((Ma|0)==-1)Pa=-1;else Pa=f[Ja+(Ma<<2)>>2]|0;Ma=f[Ka+(Pa<<2)>>2]|0;if((La|0)<(oa|0)&(Na|0)<(oa|0)&(Ma|0)<(oa|0)){Ka=X(La,g)|0;La=X(Na,g)|0;Na=X(Ma,g)|0;if(S){Ma=0;do{f[Ga+(Ma<<2)>>2]=(f[c+(Ma+Na<<2)>>2]|0)+(f[c+(Ma+La<<2)>>2]|0)-(f[c+(Ma+Ka<<2)>>2]|0);Ma=Ma+1|0}while((Ma|0)!=(g|0))}Ma=Da+1|0;if((Ma|0)==4){Fa=4;break c}else Qa=Ma}else Qa=Da}else Qa=Da;do if(za){Ma=Ea+1|0;Ka=((Ma>>>0)%3|0|0)==0?Ea+-2|0:Ma;if((Ka|0)!=-1?(Ma=f[Ha+(Ka<<2)>>2]|0,Ka=Ma+1|0,(Ma|0)!=-1):0)Ra=((Ka>>>0)%3|0|0)==0?Ma+-2|0:Ka;else Ra=-1}else{Ka=(((Ea>>>0)%3|0|0)==0?2:-1)+Ea|0;if((Ka|0)!=-1?(Ma=f[Ha+(Ka<<2)>>2]|0,(Ma|0)!=-1):0)if(!((Ma>>>0)%3|0)){Ra=Ma+2|0;break}else{Ra=Ma+-1|0;break}else Ra=-1}while(0);if((Ra|0)==(ma|0)){Fa=Qa;break c}if((Ra|0)!=-1|Ca){Da=Qa;Ea=Ra}else break}if(ya){za=0;Aa=Qa;Ba=-1;continue}Ea=f[Ha+(Q<<2)>>2]|0;if((Ea|0)==-1){za=0;Aa=Qa;Ba=-1;continue}if(!((Ea>>>0)%3|0)){za=0;Aa=Qa;Ba=Ea+2|0;continue}else{za=0;Aa=Qa;Ba=Ea+-1|0;continue}}Ba=X(oa,g)|0;f[r>>2]=0;f[T>>2]=0;b[U>>0]=0;f[V>>2]=0;f[V+4>>2]=0;f[V+8>>2]=0;f[V+12>>2]=0;f[V+16>>2]=0;f[V+20>>2]=0;f[V+24>>2]=0;Aa=c+((X(na+-2|0,g)|0)<<2)|0;za=c+(Ba<<2)|0;Q=f[Z>>2]|0;if(S){ya=0;ma=0;while(1){Ea=(f[Aa+(ya<<2)>>2]|0)-(f[za+(ya<<2)>>2]|0)|0;Da=((Ea|0)>-1?Ea:0-Ea|0)+ma|0;f[pa+(ya<<2)>>2]=Ea;f[Q+(ya<<2)>>2]=Ea<<1^Ea>>31;ya=ya+1|0;if((ya|0)==(g|0)){Sa=Da;break}else ma=Da}}else Sa=0;ho(e,_,Q,g);ma=Tk(e)|0;ya=I;Da=om(e)|0;Ea=Tn(Da|0,I|0,ma|0,ya|0)|0;ya=I;ma=(Fa|0)>0;if(ma){Da=Fa+-1|0;Ca=p+(Da<<3)|0;Ma=Ca;Ka=Tn(f[Ma>>2]|0,f[Ma+4>>2]|0,Fa|0,((Fa|0)<0)<<31>>31|0)|0;Ma=I;La=Ca;f[La>>2]=Ka;f[La+4>>2]=Ma;Ta=+W(+(+jm(Ka,f[o+(Da<<3)>>2]|0)*(+(Ka>>>0)+4294967296.0*+(Ma|0))));Ma=Tn(Ea|0,ya|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;Ua=Ma}else Ua=Ea;Ea=r;f[Ea>>2]=Ua;f[Ea+4>>2]=Sa;b[U>>0]=0;f[V>>2]=0;Mf($,Aa,Aa+(g<<2)|0);f[s>>2]=qa;f[t>>2]=ra;f[j>>2]=f[s>>2];f[e>>2]=f[t>>2];tf(aa,j,e);if((Fa|0)<1){Va=va;Wa=ua;Xa=ta;Ya=sa;Za=ra;_a=qa;$a=qa}else{Ea=n+Fa|0;Ma=f[q>>2]|0;ya=Fa+-1|0;Ka=o+(ya<<3)|0;Da=p+(ya<<3)|0;ya=Ma;La=f[H>>2]|0;Ca=Ea+-1|0;Na=(Ca|0)==(n|0);Ga=Ea+-2|0;Ja=ja>>>0>>0;Ia=~Fa;ab=Fa+2+((Ia|0)>-2?Ia:-2)|0;Ia=La;bb=Ca>>>0>n>>>0;cb=0;db=1;while(1){cb=cb+1|0;hj(n|0,1,ab|0)|0;hj(n|0,0,cb|0)|0;d:while(1){if(S){hj(f[m>>2]|0,0,ka|0)|0;eb=f[m>>2]|0;fb=0;gb=0;while(1){if(!(b[n+fb>>0]|0)){hb=f[l+(fb*12|0)>>2]|0;ib=0;do{jb=eb+(ib<<2)|0;f[jb>>2]=(f[jb>>2]|0)+(f[hb+(ib<<2)>>2]|0);ib=ib+1|0}while((ib|0)!=(g|0));kb=(1<>0]|0))mb=(1<>2]|0;do if(S){f[fb>>2]=(f[fb>>2]|0)/(db|0)|0;if(!la){gb=1;do{eb=fb+(gb<<2)|0;f[eb>>2]=(f[eb>>2]|0)/(db|0)|0;gb=gb+1|0}while((gb|0)!=(g|0));gb=f[Z>>2]|0;if(S)nb=gb;else{ob=0;pb=gb;break}}else nb=f[Z>>2]|0;gb=0;eb=0;while(1){ib=(f[fb+(gb<<2)>>2]|0)-(f[za+(gb<<2)>>2]|0)|0;hb=((ib|0)>-1?ib:0-ib|0)+eb|0;f[Ma+(gb<<2)>>2]=ib;f[nb+(gb<<2)>>2]=ib<<1^ib>>31;gb=gb+1|0;if((gb|0)==(g|0)){ob=hb;pb=nb;break}else eb=hb}}else{ob=0;pb=f[Z>>2]|0}while(0);ho(e,_,pb,g);fb=Tk(e)|0;eb=I;gb=om(e)|0;hb=Tn(gb|0,I|0,fb|0,eb|0)|0;eb=I;if(ma){fb=Ka;gb=Tn(f[fb>>2]|0,f[fb+4>>2]|0,db|0,0)|0;fb=Da;ib=f[fb>>2]|0;jb=f[fb+4>>2]|0;Ta=+W(+(+jm(ib,gb)*(+(ib>>>0)+4294967296.0*+(jb|0))));jb=Tn(hb|0,eb|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;qb=jb}else qb=hb;hb=f[r>>2]|0;if(!((qb|0)>=(hb|0)?!((qb|0)<=(hb|0)?(ob|0)<(f[T>>2]|0):0):0)){hb=r;f[hb>>2]=qb;f[hb+4>>2]=ob;b[U>>0]=lb;f[V>>2]=db;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[j>>2]=f[v>>2];f[e>>2]=f[w>>2];tf($,j,e);f[x>>2]=ya;f[y>>2]=La;f[j>>2]=f[x>>2];f[e>>2]=f[y>>2];tf(aa,j,e)}if(Na)break;rb=b[Ca>>0]|0;hb=-1;jb=rb;while(1){eb=hb+-1|0;sb=Ea+eb|0;ib=jb;jb=b[sb>>0]|0;if((jb&255)<(ib&255))break;if((sb|0)==(n|0)){tb=86;break d}else hb=eb}eb=Ea+hb|0;if((jb&255)<(rb&255)){ub=Ca;vb=rb}else{ib=Ea;gb=Ca;while(1){fb=gb+-1|0;if((jb&255)<(h[ib+-2>>0]|0)){ub=fb;vb=1;break}else{wb=gb;gb=fb;ib=wb}}}b[sb>>0]=vb;b[ub>>0]=jb;if((hb|0)<-1){xb=eb;yb=Ca}else continue;while(1){ib=b[xb>>0]|0;b[xb>>0]=b[yb>>0]|0;b[yb>>0]=ib;ib=xb+1|0;gb=yb+-1|0;if(ib>>>0>>0){xb=ib;yb=gb}else continue d}}if(((tb|0)==86?(tb=0,bb):0)?(eb=b[n>>0]|0,b[n>>0]=rb,b[Ca>>0]=eb,Ja):0){eb=Ga;hb=ja;do{jb=b[hb>>0]|0;b[hb>>0]=b[eb>>0]|0;b[eb>>0]=jb;hb=hb+1|0;eb=eb+-1|0}while(hb>>>0>>0)}if((db|0)>=(Fa|0)){Va=Ia;Wa=Ma;Xa=Ia;Ya=Ma;Za=La;_a=ya;$a=Ma;break}else db=db+1|0}}if(ma){db=f[V>>2]|0;Ma=o+(Fa+-1<<3)|0;ya=Ma;La=Tn(f[ya>>2]|0,f[ya+4>>2]|0,db|0,((db|0)<0)<<31>>31|0)|0;db=Ma;f[db>>2]=La;f[db+4>>2]=I}if(S){db=f[aa>>2]|0;La=f[C>>2]|0;Ma=0;do{ya=f[db+(Ma<<2)>>2]|0;f[La+(Ma<<2)>>2]=ya<<1^ya>>31;Ma=Ma+1|0}while((Ma|0)!=(g|0));zb=La}else zb=f[C>>2]|0;go(e,_,zb,g);if(ma){La=Fa+-1|0;Ab=a+40+(La*12|0)|0;Ma=a+40+(La*12|0)+4|0;db=a+40+(La*12|0)+8|0;La=0;do{ya=f[Ma>>2]|0;Ia=f[db>>2]|0;Ga=(ya|0)==(Ia<<5|0);if(!(1<>0])){if(Ga){if((ya+1|0)<0){tb=101;break b}Ja=Ia<<6;Ca=ya+32&-32;hi(Ab,ya>>>0<1073741823?(Ja>>>0>>0?Ca:Ja):2147483647);Bb=f[Ma>>2]|0}else Bb=ya;f[Ma>>2]=Bb+1;Ja=(f[Ab>>2]|0)+(Bb>>>5<<2)|0;f[Ja>>2]=f[Ja>>2]|1<<(Bb&31)}else{if(Ga){if((ya+1|0)<0){tb=106;break b}Ga=Ia<<6;Ia=ya+32&-32;hi(Ab,ya>>>0<1073741823?(Ga>>>0>>0?Ia:Ga):2147483647);Cb=f[Ma>>2]|0}else Cb=ya;f[Ma>>2]=Cb+1;ya=(f[Ab>>2]|0)+(Cb>>>5<<2)|0;f[ya>>2]=f[ya>>2]&~(1<<(Cb&31))}La=La+1|0}while((La|0)<(Fa|0))}La=f[$>>2]|0;Ma=d+(Ba<<2)|0;db=f[za+4>>2]|0;ma=f[La>>2]|0;ya=f[La+4>>2]|0;f[j>>2]=f[za>>2];f[ca>>2]=db;f[k>>2]=ma;f[da>>2]=ya;Dd(e,ba,j,k);f[Ma>>2]=f[e>>2];f[Ma+4>>2]=f[ea>>2];Ma=f[fa>>2]|0;if(Ma|0){ya=f[ia>>2]|0;if((ya|0)!=(Ma|0))f[ia>>2]=ya+(~((ya+-4-Ma|0)>>>2)<<2);br(Ma)}Ma=f[ga>>2]|0;if(Ma|0){ya=f[ha>>2]|0;if((ya|0)!=(Ma|0))f[ha>>2]=ya+(~((ya+-4-Ma|0)>>>2)<<2);br(Ma)}if((na|0)<=2){Db=Ya;Eb=Xa;break a}Ma=f[B>>2]|0;wa=f[Ma>>2]|0;ya=oa+-1|0;if((f[Ma+4>>2]|0)-wa>>2>>>0<=ya>>>0){xa=Ma;tb=18;break}else{Ma=oa;oa=ya;pa=$a;qa=_a;ra=Za;sa=Ya;ta=Xa;ua=Wa;va=Va;na=Ma}}if((tb|0)==18)mq(xa);else if((tb|0)==101)mq(Ab);else if((tb|0)==106)mq(Ab)}else{Db=M;Eb=N}while(0);if((g|0)>0)hj(f[l>>2]|0,0,g<<2|0)|0;g=f[l>>2]|0;N=f[c+4>>2]|0;M=f[g>>2]|0;Ab=f[g+4>>2]|0;f[j>>2]=f[c>>2];f[j+4>>2]=N;f[k>>2]=M;f[k+4>>2]=Ab;Dd(e,a+8|0,j,k);f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];if(Db|0){if((Eb|0)!=(Db|0))f[H>>2]=Eb+(~((Eb+-4-Db|0)>>>2)<<2);br(Db)}Db=f[m>>2]|0;if(Db|0){m=f[E>>2]|0;if((m|0)!=(Db|0))f[E>>2]=m+(~((m+-4-Db|0)>>>2)<<2);br(Db)}Db=f[l+36>>2]|0;if(Db|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Db|0))f[m>>2]=E+(~((E+-4-Db|0)>>>2)<<2);br(Db)}Db=f[l+24>>2]|0;if(Db|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Db|0))f[E>>2]=m+(~((m+-4-Db|0)>>>2)<<2);br(Db)}Db=f[l+12>>2]|0;if(Db|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Db|0))f[m>>2]=E+(~((E+-4-Db|0)>>>2)<<2);br(Db)}Db=f[l>>2]|0;if(!Db){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Db|0))f[E>>2]=l+(~((l+-4-Db|0)>>>2)<<2);br(Db);u=i;return 1}function fb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0;c=u;u=u+32|0;d=c+16|0;e=c+4|0;g=c;f[a+36>>2]=b;h=a+24|0;i=a+28|0;j=f[i>>2]|0;k=f[h>>2]|0;l=j-k>>2;m=k;k=j;if(l>>>0>=b>>>0){if(l>>>0>b>>>0?(j=m+(b<<2)|0,(j|0)!=(k|0)):0)f[i>>2]=k+(~((k+-4-j|0)>>>2)<<2)}else kh(h,b-l|0,5828);f[d>>2]=0;l=d+4|0;f[l>>2]=0;j=d+8|0;f[j>>2]=0;if(b){if((b|0)<0)mq(d);k=((b+-1|0)>>>5)+1|0;m=dn(k<<2)|0;f[d>>2]=m;f[j>>2]=k;f[l>>2]=b;k=b>>>5;hj(m|0,0,k<<2|0)|0;n=b&31;o=m+(k<<2)|0;k=m;if(!n){p=b;q=k;r=m}else{f[o>>2]=f[o>>2]&~(-1>>>(32-n|0));p=b;q=k;r=m}}else{p=0;q=0;r=0}m=a+4|0;k=f[a>>2]|0;n=(f[m>>2]|0)-k|0;o=n>>2;f[e>>2]=0;s=e+4|0;f[s>>2]=0;t=e+8|0;f[t>>2]=0;do if(o){if((n|0)<0)mq(e);v=((o+-1|0)>>>5)+1|0;w=dn(v<<2)|0;f[e>>2]=w;f[t>>2]=v;f[s>>2]=o;v=o>>>5;hj(w|0,0,v<<2|0)|0;x=o&31;y=w+(v<<2)|0;if(x|0)f[y>>2]=f[y>>2]&~(-1>>>(32-x|0));if(o>>>0>2){x=a+12|0;y=a+32|0;v=a+52|0;w=a+56|0;z=a+48|0;A=b;B=k;C=0;D=q;E=r;a:while(1){F=B;G=C*3|0;if((G|0)!=-1){H=f[F+(G<<2)>>2]|0;I=G+1|0;J=((I>>>0)%3|0|0)==0?G+-2|0:I;if((J|0)==-1)K=-1;else K=f[F+(J<<2)>>2]|0;J=(((G>>>0)%3|0|0)==0?2:-1)+G|0;if((J|0)==-1)L=-1;else L=f[F+(J<<2)>>2]|0;if((H|0)!=(K|0)?!((H|0)==(L|0)|(K|0)==(L|0)):0){H=0;J=A;F=E;I=D;while(1){M=H+G|0;if(!(f[(f[e>>2]|0)+(M>>>5<<2)>>2]&1<<(M&31))){N=f[(f[a>>2]|0)+(M<<2)>>2]|0;f[g>>2]=N;if(!(f[F+(N>>>5<<2)>>2]&1<<(N&31))){O=0;P=J;Q=N}else{N=f[i>>2]|0;if((N|0)==(f[y>>2]|0))Ci(h,5828);else{f[N>>2]=-1;f[i>>2]=N+4}N=f[v>>2]|0;if((N|0)==(f[w>>2]|0))Ci(z,g);else{f[N>>2]=f[g>>2];f[v>>2]=N+4}N=f[l>>2]|0;R=f[j>>2]|0;if((N|0)==(R<<5|0)){if((N+1|0)<0){S=50;break a}T=R<<6;R=N+32&-32;hi(d,N>>>0<1073741823?(T>>>0>>0?R:T):2147483647);U=f[l>>2]|0}else U=N;f[l>>2]=U+1;N=(f[d>>2]|0)+(U>>>5<<2)|0;f[N>>2]=f[N>>2]&~(1<<(U&31));f[g>>2]=J;O=1;P=J+1|0;Q=J}N=f[d>>2]|0;T=N+(Q>>>5<<2)|0;f[T>>2]=f[T>>2]|1<<(Q&31);T=N;b:do if(O){R=M;while(1){if((R|0)==-1){S=64;break b}V=(f[e>>2]|0)+(R>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(R&31);V=f[g>>2]|0;f[(f[h>>2]|0)+(V<<2)>>2]=R;f[(f[a>>2]|0)+(R<<2)>>2]=V;V=R+1|0;W=((V>>>0)%3|0|0)==0?R+-2|0:V;do if((W|0)==-1)X=-1;else{V=f[(f[x>>2]|0)+(W<<2)>>2]|0;Y=V+1|0;if((V|0)==-1){X=-1;break}X=((Y>>>0)%3|0|0)==0?V+-2|0:Y}while(0);if((X|0)==(M|0))break;else R=X}}else{R=M;while(1){if((R|0)==-1){S=64;break b}W=(f[e>>2]|0)+(R>>>5<<2)|0;f[W>>2]=f[W>>2]|1<<(R&31);f[(f[h>>2]|0)+(f[g>>2]<<2)>>2]=R;W=R+1|0;Y=((W>>>0)%3|0|0)==0?R+-2|0:W;do if((Y|0)==-1)Z=-1;else{W=f[(f[x>>2]|0)+(Y<<2)>>2]|0;V=W+1|0;if((W|0)==-1){Z=-1;break}Z=((V>>>0)%3|0|0)==0?W+-2|0:V}while(0);if((Z|0)==(M|0))break;else R=Z}}while(0);c:do if((S|0)==64){S=0;if((M|0)==-1)break;R=(((M>>>0)%3|0|0)==0?2:-1)+M|0;if((R|0)==-1)break;Y=f[(f[x>>2]|0)+(R<<2)>>2]|0;if((Y|0)==-1)break;R=Y+(((Y>>>0)%3|0|0)==0?2:-1)|0;if((R|0)==-1)break;if(!O){Y=R;while(1){V=(f[e>>2]|0)+(Y>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(Y&31);V=(((Y>>>0)%3|0|0)==0?2:-1)+Y|0;if((V|0)==-1)break c;W=f[(f[x>>2]|0)+(V<<2)>>2]|0;if((W|0)==-1)break c;Y=W+(((W>>>0)%3|0|0)==0?2:-1)|0;if((Y|0)==-1)break c}}Y=f[a>>2]|0;W=R;do{V=(f[e>>2]|0)+(W>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(W&31);f[Y+(W<<2)>>2]=f[g>>2];V=(((W>>>0)%3|0|0)==0?2:-1)+W|0;if((V|0)==-1)break c;_=f[(f[x>>2]|0)+(V<<2)>>2]|0;if((_|0)==-1)break c;W=_+(((_>>>0)%3|0|0)==0?2:-1)|0}while((W|0)!=-1)}while(0);$=P;aa=T;ba=N}else{$=J;aa=I;ba=F}if((H|0)<2){H=H+1|0;J=$;F=ba;I=aa}else{ca=$;da=aa;ea=ba;break}}}else{ca=A;da=D;ea=E}}else{ca=A;da=D;ea=E}C=C+1|0;B=f[a>>2]|0;if(C>>>0>=(((f[m>>2]|0)-B>>2>>>0)/3|0)>>>0){S=18;break}else{A=ca;D=da;E=ea}}if((S|0)==18){fa=da;ga=f[l>>2]|0;break}else if((S|0)==50)mq(d)}else{fa=q;ga=p}}else{fa=q;ga=p}while(0);p=a+44|0;f[p>>2]=0;a=fa;fa=ga>>>5;q=a+(fa<<2)|0;S=ga&31;ga=(fa|0)!=0;d:do if(fa|S|0)if(!S){l=a;da=0;ea=ga;while(1){e:do if(ea){if(!(f[l>>2]&1)){ca=da+1|0;f[p>>2]=ca;ha=ca}else ha=da;if(!(f[l>>2]&2)){ca=ha+1|0;f[p>>2]=ca;ia=ca}else ia=ha;if(!(f[l>>2]&4)){ca=ia+1|0;f[p>>2]=ca;ja=ca}else ja=ia;if(!(f[l>>2]&8)){ca=ja+1|0;f[p>>2]=ca;ka=ca}else ka=ja;if(!(f[l>>2]&16)){ca=ka+1|0;f[p>>2]=ca;la=ca}else la=ka;if(!(f[l>>2]&32)){ca=la+1|0;f[p>>2]=ca;ma=ca}else ma=la;if(!(f[l>>2]&64)){ca=ma+1|0;f[p>>2]=ca;na=ca}else na=ma;if(!(f[l>>2]&128)){ca=na+1|0;f[p>>2]=ca;oa=ca}else oa=na;if(!(f[l>>2]&256)){ca=oa+1|0;f[p>>2]=ca;pa=ca}else pa=oa;if(!(f[l>>2]&512)){ca=pa+1|0;f[p>>2]=ca;qa=ca}else qa=pa;if(!(f[l>>2]&1024)){ca=qa+1|0;f[p>>2]=ca;ra=ca}else ra=qa;if(!(f[l>>2]&2048)){ca=ra+1|0;f[p>>2]=ca;sa=ca}else sa=ra;if(!(f[l>>2]&4096)){ca=sa+1|0;f[p>>2]=ca;ta=ca}else ta=sa;if(!(f[l>>2]&8192)){ca=ta+1|0;f[p>>2]=ca;ua=ca}else ua=ta;if(!(f[l>>2]&16384)){ca=ua+1|0;f[p>>2]=ca;va=ca}else va=ua;if(!(f[l>>2]&32768)){ca=va+1|0;f[p>>2]=ca;wa=ca}else wa=va;if(!(f[l>>2]&65536)){ca=wa+1|0;f[p>>2]=ca;xa=ca}else xa=wa;if(!(f[l>>2]&131072)){ca=xa+1|0;f[p>>2]=ca;ya=ca}else ya=xa;if(!(f[l>>2]&262144)){ca=ya+1|0;f[p>>2]=ca;za=ca}else za=ya;if(!(f[l>>2]&524288)){ca=za+1|0;f[p>>2]=ca;Aa=ca}else Aa=za;if(!(f[l>>2]&1048576)){ca=Aa+1|0;f[p>>2]=ca;Ba=ca}else Ba=Aa;if(!(f[l>>2]&2097152)){ca=Ba+1|0;f[p>>2]=ca;Ca=ca}else Ca=Ba;if(!(f[l>>2]&4194304)){ca=Ca+1|0;f[p>>2]=ca;Da=ca}else Da=Ca;if(!(f[l>>2]&8388608)){ca=Da+1|0;f[p>>2]=ca;Ea=ca}else Ea=Da;if(!(f[l>>2]&16777216)){ca=Ea+1|0;f[p>>2]=ca;Fa=ca}else Fa=Ea;if(!(f[l>>2]&33554432)){ca=Fa+1|0;f[p>>2]=ca;Ga=ca}else Ga=Fa;if(!(f[l>>2]&67108864)){ca=Ga+1|0;f[p>>2]=ca;Ha=ca}else Ha=Ga;if(!(f[l>>2]&134217728)){ca=Ha+1|0;f[p>>2]=ca;Ia=ca}else Ia=Ha;if(!(f[l>>2]&268435456)){ca=Ia+1|0;f[p>>2]=ca;Ja=ca}else Ja=Ia;if(!(f[l>>2]&536870912)){ca=Ja+1|0;f[p>>2]=ca;Ka=ca}else Ka=Ja;if(!(f[l>>2]&1073741824)){ca=Ka+1|0;f[p>>2]=ca;La=ca}else La=Ka;if((f[l>>2]|0)<=-1){Ma=La;break}ca=La+1|0;f[p>>2]=ca;Ma=ca}else{ca=0;m=da;while(1){if(!(f[l>>2]&1<>2]=ba;Na=ba}else Na=m;if((ca|0)==31){Ma=Na;break e}ca=ca+1|0;if(!ca)break d;else m=Na}}while(0);l=l+4|0;if((q|0)==(l|0))break;else{da=Ma;ea=1}}}else{if(ga){ea=0;da=a;l=0;while(1){if(!(f[da>>2]&1)){m=l+1|0;f[p>>2]=m;Oa=m;Pa=m}else{Oa=l;Pa=ea}if(!(f[da>>2]&2)){m=Oa+1|0;f[p>>2]=m;Qa=m;Ra=m}else{Qa=Oa;Ra=Pa}if(!(f[da>>2]&4)){m=Qa+1|0;f[p>>2]=m;Sa=m;Ta=m}else{Sa=Qa;Ta=Ra}if(!(f[da>>2]&8)){m=Sa+1|0;f[p>>2]=m;Ua=m;Va=m}else{Ua=Sa;Va=Ta}if(!(f[da>>2]&16)){m=Ua+1|0;f[p>>2]=m;Wa=m;Xa=m}else{Wa=Ua;Xa=Va}if(!(f[da>>2]&32)){m=Wa+1|0;f[p>>2]=m;Ya=m;Za=m}else{Ya=Wa;Za=Xa}if(!(f[da>>2]&64)){m=Ya+1|0;f[p>>2]=m;_a=m;$a=m}else{_a=Ya;$a=Za}if(!(f[da>>2]&128)){m=_a+1|0;f[p>>2]=m;ab=m;bb=m}else{ab=_a;bb=$a}if(!(f[da>>2]&256)){m=ab+1|0;f[p>>2]=m;cb=m;db=m}else{cb=ab;db=bb}if(!(f[da>>2]&512)){m=cb+1|0;f[p>>2]=m;eb=m;fb=m}else{eb=cb;fb=db}if(!(f[da>>2]&1024)){m=eb+1|0;f[p>>2]=m;gb=m;hb=m}else{gb=eb;hb=fb}if(!(f[da>>2]&2048)){m=gb+1|0;f[p>>2]=m;ib=m;jb=m}else{ib=gb;jb=hb}if(!(f[da>>2]&4096)){m=ib+1|0;f[p>>2]=m;kb=m;lb=m}else{kb=ib;lb=jb}if(!(f[da>>2]&8192)){m=kb+1|0;f[p>>2]=m;mb=m;nb=m}else{mb=kb;nb=lb}if(!(f[da>>2]&16384)){m=mb+1|0;f[p>>2]=m;ob=m;pb=m}else{ob=mb;pb=nb}if(!(f[da>>2]&32768)){m=ob+1|0;f[p>>2]=m;qb=m;rb=m}else{qb=ob;rb=pb}if(!(f[da>>2]&65536)){m=qb+1|0;f[p>>2]=m;sb=m;tb=m}else{sb=qb;tb=rb}if(!(f[da>>2]&131072)){m=sb+1|0;f[p>>2]=m;ub=m;vb=m}else{ub=sb;vb=tb}if(!(f[da>>2]&262144)){m=ub+1|0;f[p>>2]=m;wb=m;xb=m}else{wb=ub;xb=vb}if(!(f[da>>2]&524288)){m=wb+1|0;f[p>>2]=m;yb=m;zb=m}else{yb=wb;zb=xb}if(!(f[da>>2]&1048576)){m=yb+1|0;f[p>>2]=m;Ab=m;Bb=m}else{Ab=yb;Bb=zb}if(!(f[da>>2]&2097152)){m=Ab+1|0;f[p>>2]=m;Cb=m;Db=m}else{Cb=Ab;Db=Bb}if(!(f[da>>2]&4194304)){m=Cb+1|0;f[p>>2]=m;Eb=m;Fb=m}else{Eb=Cb;Fb=Db}if(!(f[da>>2]&8388608)){m=Eb+1|0;f[p>>2]=m;Gb=m;Hb=m}else{Gb=Eb;Hb=Fb}if(!(f[da>>2]&16777216)){m=Gb+1|0;f[p>>2]=m;Ib=m;Jb=m}else{Ib=Gb;Jb=Hb}if(!(f[da>>2]&33554432)){m=Ib+1|0;f[p>>2]=m;Kb=m;Lb=m}else{Kb=Ib;Lb=Jb}if(!(f[da>>2]&67108864)){m=Kb+1|0;f[p>>2]=m;Mb=m;Nb=m}else{Mb=Kb;Nb=Lb}if(!(f[da>>2]&134217728)){m=Mb+1|0;f[p>>2]=m;Ob=m;Pb=m}else{Ob=Mb;Pb=Nb}if(!(f[da>>2]&268435456)){m=Ob+1|0;f[p>>2]=m;Qb=m;Rb=m}else{Qb=Ob;Rb=Pb}if(!(f[da>>2]&536870912)){m=Qb+1|0;f[p>>2]=m;Sb=m;Tb=m}else{Sb=Qb;Tb=Rb}if(!(f[da>>2]&1073741824)){m=Sb+1|0;f[p>>2]=m;Ub=m;Vb=m}else{Ub=Sb;Vb=Tb}if((f[da>>2]|0)>-1){m=Ub+1|0;f[p>>2]=m;Wb=m;Xb=m}else{Wb=Ub;Xb=Vb}m=da+4|0;if((q|0)==(m|0)){Yb=m;Zb=Xb;break}else{ea=Xb;da=m;l=Wb}}}else{Yb=a;Zb=0}l=0;da=Zb;while(1){if(!(f[Yb>>2]&1<>2]=ea;_b=ea}else _b=da;l=l+1|0;if((l|0)==(S|0))break;else da=_b}}while(0);_b=f[e>>2]|0;if(_b|0)br(_b);_b=f[d>>2]|0;if(!_b){u=c;return 1}br(_b);u=c;return 1}function gb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=Oa,La=0,Ma=0,Na=0,Pa=0,Qa=Oa,Ra=0,Sa=0,Ta=0,Ua=0,Va=0;c=u;u=u+80|0;d=c+60|0;e=c+48|0;g=c+24|0;h=c+12|0;i=c;j=a+28|0;k=f[j>>2]|0;l=f[k+4>>2]|0;m=f[l+80>>2]|0;o=a+4|0;p=a+8|0;q=f[p>>2]|0;r=f[o>>2]|0;s=(q|0)==(r|0);t=r;if(s){f[a+72>>2]=0;v=1;u=c;return v|0}w=f[l+8>>2]|0;x=q-r>>2;r=0;q=0;do{r=r+(b[(f[w+(f[t+(q<<2)>>2]<<2)>>2]|0)+24>>0]|0)|0;q=q+1|0}while(q>>>0>>0);f[a+72>>2]=r;if(s){v=1;u=c;return v|0}s=g+4|0;r=g+8|0;x=d+8|0;q=d+4|0;w=d+11|0;y=g+12|0;z=d+8|0;A=d+4|0;B=d+11|0;C=h+4|0;D=h+8|0;E=i+8|0;F=i+4|0;G=d+11|0;H=d+4|0;I=i+11|0;J=d+8|0;K=d+4|0;L=d+11|0;M=d+11|0;N=d+4|0;O=h+8|0;P=a+40|0;Q=a+44|0;R=a+36|0;S=a+64|0;T=a+68|0;U=a+60|0;V=g+8|0;W=g+20|0;X=e+8|0;Y=e+4|0;Z=e+11|0;_=g+4|0;aa=g+8|0;ba=h+4|0;ca=h+8|0;da=h+8|0;ea=a+52|0;fa=a+56|0;ga=a+48|0;a=g+8|0;ha=0;ia=t;t=l;l=k;a:while(1){k=f[ia+(ha<<2)>>2]|0;ja=f[(f[t+8>>2]|0)+(k<<2)>>2]|0;switch(f[ja+28>>2]|0){case 9:{f[g>>2]=1180;f[s>>2]=-1;f[r>>2]=0;f[r+4>>2]=0;f[r+8>>2]=0;f[r+12>>2]=0;ka=f[l+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;la=dn(32)|0;f[d>>2]=la;f[x>>2]=-2147483616;f[q>>2]=17;ma=la;na=12932;oa=ma+17|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[la+17>>0]=0;pa=ka+16|0;qa=f[pa>>2]|0;if(qa){ra=pa;sa=qa;b:while(1){qa=sa;while(1){if((f[qa+16>>2]|0)>=(k|0))break;ta=f[qa+4>>2]|0;if(!ta){ua=ra;break b}else qa=ta}sa=f[qa>>2]|0;if(!sa){ua=qa;break}else ra=qa}if(((ua|0)!=(pa|0)?(k|0)>=(f[ua+16>>2]|0):0)?(ra=ua+20|0,(sh(ra,d)|0)!=0):0)va=yk(ra,d,-1)|0;else wa=17}else wa=17;if((wa|0)==17){wa=0;va=yk(ka,d,-1)|0}if((b[w>>0]|0)<0)br(f[d>>2]|0);if((va|0)<1)xa=1;else{ra=f[(f[j>>2]|0)+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;sa=dn(32)|0;f[d>>2]=sa;f[z>>2]=-2147483616;f[A>>2]=19;ma=sa;na=13005;oa=ma+19|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[sa+19>>0]=0;ka=ra+16|0;pa=f[ka>>2]|0;if(pa){la=ka;ta=pa;c:while(1){pa=ta;while(1){if((f[pa+16>>2]|0)>=(k|0))break;ya=f[pa+4>>2]|0;if(!ya){za=la;break c}else pa=ya}ta=f[pa>>2]|0;if(!ta){za=pa;break}else la=pa}if((za|0)!=(ka|0)?(k|0)>=(f[za+16>>2]|0):0)Aa=za+20|0;else wa=29}else wa=29;if((wa|0)==29){wa=0;Aa=ra}if(!(sh(Aa,d)|0))Ba=0;else{la=f[(f[j>>2]|0)+48>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;ta=dn(32)|0;f[e>>2]=ta;f[X>>2]=-2147483616;f[Y>>2]=18;ma=ta;na=13025;oa=ma+18|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ta+18>>0]=0;ra=la+16|0;ka=f[ra>>2]|0;if(ka){sa=ra;qa=ka;d:while(1){ka=qa;while(1){if((f[ka+16>>2]|0)>=(k|0))break;ya=f[ka+4>>2]|0;if(!ya){Ca=sa;break d}else ka=ya}qa=f[ka>>2]|0;if(!qa){Ca=ka;break}else sa=ka}if((Ca|0)!=(ra|0)?(k|0)>=(f[Ca+16>>2]|0):0)Da=Ca+20|0;else wa=39}else wa=39;if((wa|0)==39){wa=0;Da=la}sa=(sh(Da,e)|0)!=0;if((b[Z>>0]|0)<0)br(f[e>>2]|0);Ba=sa}if((b[B>>0]|0)<0)br(f[d>>2]|0);if(Ba){sa=ja+24|0;qa=b[sa>>0]|0;ta=qa<<24>>24;f[h>>2]=0;f[C>>2]=0;f[D>>2]=0;if(!(qa<<24>>24))Ea=0;else{if(qa<<24>>24<0){wa=48;break a}qa=ta<<2;pa=dn(qa)|0;f[h>>2]=pa;ya=pa+(ta<<2)|0;f[O>>2]=ya;hj(pa|0,0,qa|0)|0;f[C>>2]=ya;Ea=pa}pa=f[(f[j>>2]|0)+48>>2]|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;ya=dn(32)|0;f[i>>2]=ya;f[E>>2]=-2147483616;f[F>>2]=19;ma=ya;na=13005;oa=ma+19|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ya+19>>0]=0;la=b[sa>>0]|0;ra=la<<24>>24;qa=pa+16|0;ta=f[qa>>2]|0;if(ta){Fa=qa;Ga=ta;e:while(1){ta=Ga;while(1){if((f[ta+16>>2]|0)>=(k|0))break;Ha=f[ta+4>>2]|0;if(!Ha){Ia=Fa;break e}else ta=Ha}Ga=f[ta>>2]|0;if(!Ga){Ia=ta;break}else Fa=ta}if(((Ia|0)!=(qa|0)?(k|0)>=(f[Ia+16>>2]|0):0)?(Fa=Ia+20|0,(sh(Fa,i)|0)!=0):0){Ga=zg(Fa,i)|0;if((Ga|0)!=(Ia+24|0)){dj(d,Ga+28|0);Ga=b[M>>0]|0;Fa=Ga<<24>>24<0;if(!((Fa?f[N>>2]|0:Ga&255)|0))Ja=Ga;else{if(la<<24>>24>0){ya=Fa?f[d>>2]|0:d;Fa=0;do{Ka=$(pq(ya,e));ka=ya;ya=f[e>>2]|0;if((ka|0)==(ya|0))break;n[Ea+(Fa<<2)>>2]=Ka;Fa=Fa+1|0}while((Fa|0)<(ra|0));La=b[M>>0]|0}else La=Ga;Ja=La}if(Ja<<24>>24<0)br(f[d>>2]|0)}}else wa=69}else wa=69;if((wa|0)==69?(wa=0,Fa=zg(pa,i)|0,(Fa|0)!=(pa+4|0)):0){dj(d,Fa+28|0);Fa=b[G>>0]|0;ya=Fa<<24>>24<0;if(!((ya?f[H>>2]|0:Fa&255)|0))Ma=Fa;else{if(la<<24>>24>0){qa=ya?f[d>>2]|0:d;ya=0;do{Ka=$(pq(qa,e));ka=qa;qa=f[e>>2]|0;if((ka|0)==(qa|0))break;n[Ea+(ya<<2)>>2]=Ka;ya=ya+1|0}while((ya|0)<(ra|0));Na=b[G>>0]|0}else Na=Fa;Ma=Na}if(Ma<<24>>24<0)br(f[d>>2]|0)}if((b[I>>0]|0)<0)br(f[i>>2]|0);ra=f[(f[j>>2]|0)+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;ya=dn(32)|0;f[d>>2]=ya;f[J>>2]=-2147483616;f[K>>2]=18;ma=ya;na=13025;oa=ma+18|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ya+18>>0]=0;na=ra+16|0;ma=f[na>>2]|0;do if(ma){oa=na;Fa=ma;f:while(1){qa=Fa;while(1){if((f[qa+16>>2]|0)>=(k|0))break;la=f[qa+4>>2]|0;if(!la){Pa=oa;break f}else qa=la}Fa=f[qa>>2]|0;if(!Fa){Pa=qa;break}else oa=qa}if((Pa|0)!=(na|0)?(k|0)>=(f[Pa+16>>2]|0):0){oa=Pa+20|0;if(!(sh(oa,d)|0)){wa=91;break}Qa=$(kk(oa,d,$(1.0)))}else wa=91}else wa=91;while(0);if((wa|0)==91){wa=0;Qa=$(kk(ra,d,$(1.0)))}if((b[L>>0]|0)<0)br(f[d>>2]|0);wl(g,va,f[h>>2]|0,b[sa>>0]|0,Qa);k=f[h>>2]|0;if(k|0){na=f[C>>2]|0;if((na|0)!=(k|0))f[C>>2]=na+(~((na+-4-k|0)>>>2)<<2);br(k)}}else Kd(g,ja,va)|0;k=f[P>>2]|0;if((k|0)==(f[Q>>2]|0))of(R,g);else{f[k>>2]=1180;f[k+4>>2]=f[s>>2];Ra=k+8|0;f[Ra>>2]=0;na=k+12|0;f[na>>2]=0;f[k+16>>2]=0;ma=(f[y>>2]|0)-(f[V>>2]|0)|0;ya=ma>>2;if(ya|0){if(ya>>>0>1073741823){wa=103;break a}oa=dn(ma)|0;f[na>>2]=oa;f[Ra>>2]=oa;f[k+16>>2]=oa+(ya<<2);ya=f[V>>2]|0;ma=(f[y>>2]|0)-ya|0;if((ma|0)>0){Rg(oa|0,ya|0,ma|0)|0;f[na>>2]=oa+(ma>>>2<<2)}}f[k+20>>2]=f[W>>2];f[P>>2]=(f[P>>2]|0)+24}Re(d,g,ja,m);k=f[S>>2]|0;if(k>>>0<(f[T>>2]|0)>>>0){ma=f[d>>2]|0;f[d>>2]=0;f[k>>2]=ma;f[S>>2]=k+4}else Me(U,d);k=f[d>>2]|0;f[d>>2]=0;if(k|0){ma=k+88|0;oa=f[ma>>2]|0;f[ma>>2]=0;if(oa|0){ma=f[oa+8>>2]|0;if(ma|0){na=oa+12|0;if((f[na>>2]|0)!=(ma|0))f[na>>2]=ma;br(ma)}br(oa)}oa=f[k+68>>2]|0;if(oa|0){ma=k+72|0;na=f[ma>>2]|0;if((na|0)!=(oa|0))f[ma>>2]=na+(~((na+-4-oa|0)>>>2)<<2);br(oa)}oa=k+64|0;na=f[oa>>2]|0;f[oa>>2]=0;if(na|0){oa=f[na>>2]|0;if(oa|0){ma=na+4|0;if((f[ma>>2]|0)!=(oa|0))f[ma>>2]=oa;br(oa)}br(na)}br(k)}xa=0}f[g>>2]=1180;k=f[r>>2]|0;if(k|0){na=f[y>>2]|0;if((na|0)!=(k|0))f[y>>2]=na+(~((na+-4-k|0)>>>2)<<2);br(k)}if(xa|0){v=0;wa=169;break a}break}case 1:case 3:case 5:{k=ja+24|0;na=b[k>>0]|0;oa=na<<24>>24;f[g>>2]=0;f[_>>2]=0;f[aa>>2]=0;if(!(na<<24>>24))Sa=0;else{if(na<<24>>24<0){wa=137;break a}na=dn(oa<<2)|0;f[_>>2]=na;f[g>>2]=na;ma=na+(oa<<2)|0;f[a>>2]=ma;ya=oa;oa=na;while(1){f[oa>>2]=2147483647;ya=ya+-1|0;if(!ya)break;else oa=oa+4|0}f[_>>2]=ma;Sa=b[k>>0]|0}oa=Sa<<24>>24;f[h>>2]=0;f[ba>>2]=0;f[ca>>2]=0;if(!(Sa<<24>>24))Ta=0;else{if(Sa<<24>>24<0){wa=144;break a}ya=oa<<2;sa=dn(ya)|0;f[h>>2]=sa;ra=sa+(oa<<2)|0;f[da>>2]=ra;hj(sa|0,0,ya|0)|0;f[ba>>2]=ra;Ta=sa}sa=ja+80|0;ra=b[k>>0]|0;g:do if(!(f[sa>>2]|0))Ua=ra;else{ya=0;oa=ra;na=Ta;while(1){f[e>>2]=ya;f[d>>2]=f[e>>2];Pb(ja,d,oa,na)|0;Fa=b[k>>0]|0;if(Fa<<24>>24>0){ta=f[g>>2]|0;la=f[h>>2]|0;pa=Fa<<24>>24;Ga=0;do{ka=ta+(Ga<<2)|0;Ha=f[la+(Ga<<2)>>2]|0;if((f[ka>>2]|0)>(Ha|0))f[ka>>2]=Ha;Ga=Ga+1|0}while((Ga|0)<(pa|0))}pa=ya+1|0;if(pa>>>0>=(f[sa>>2]|0)>>>0){Ua=Fa;break g}ya=pa;oa=Fa;na=f[h>>2]|0}}while(0);if(Ua<<24>>24>0){sa=0;ja=Ua;while(1){ra=(f[g>>2]|0)+(sa<<2)|0;ma=f[ea>>2]|0;if((ma|0)==(f[fa>>2]|0)){Ci(ga,ra);Va=b[k>>0]|0}else{f[ma>>2]=f[ra>>2];f[ea>>2]=ma+4;Va=ja}sa=sa+1|0;if((sa|0)>=(Va<<24>>24|0))break;else ja=Va}}ja=f[h>>2]|0;if(ja|0){sa=f[ba>>2]|0;if((sa|0)!=(ja|0))f[ba>>2]=sa+(~((sa+-4-ja|0)>>>2)<<2);br(ja)}ja=f[g>>2]|0;if(ja|0){sa=f[_>>2]|0;if((sa|0)!=(ja|0))f[_>>2]=sa+(~((sa+-4-ja|0)>>>2)<<2);br(ja)}break}default:{}}ja=ha+1|0;sa=f[o>>2]|0;if(ja>>>0>=(f[p>>2]|0)-sa>>2>>>0){v=1;wa=169;break}k=f[j>>2]|0;ha=ja;ia=sa;t=f[k+4>>2]|0;l=k}if((wa|0)==48)mq(h);else if((wa|0)==103)mq(Ra);else if((wa|0)==137)mq(g);else if((wa|0)==144)mq(h);else if((wa|0)==169){u=c;return v|0}return 0}function hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)mq(e);else{j=h<<2;k=dn(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;hj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+128|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);br(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)mq(e);else{r=s<<2;o=dn(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;hj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+140|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);br(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Jc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+116|0;y=a+48|0;h=a+44|0;j=a+36|0;m=a+40|0;n=a+32|0;A=b+8|0;B=c+8|0;C=a+28|0;D=a+24|0;E=a+16|0;F=a+20|0;G=a+12|0;H=a+88|0;I=a+84|0;J=a+76|0;K=a+80|0;L=a+72|0;M=i+4|0;N=i+24|0;O=i+24|0;P=p+24|0;Q=z;while(1){z=f[v>>2]|0;R=Q+-1|0;S=R+z|0;T=f[t>>2]|0;U=f[T+(((S>>>0)/113|0)<<2)>>2]|0;V=(S>>>0)%113|0;S=f[U+(V*36|0)>>2]|0;W=f[U+(V*36|0)+12>>2]|0;Y=f[U+(V*36|0)+24>>2]|0;Z=f[U+(V*36|0)+32>>2]|0;f[l>>2]=R;R=f[o>>2]|0;V=R-T>>2;if((1-Q-z+((V|0)==0?0:(V*113|0)+-1|0)|0)>>>0>225){br(f[R+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=S;f[c>>2]=W;R=f[k>>2]|0;V=((f[g>>2]|0)+-1|0)==(Y|0)?0:Y+1|0;Y=(f[s>>2]|0)+(Z*12|0)|0;z=W-S|0;T=(f[a>>2]|0)-(f[(f[Y>>2]|0)+(V<<2)>>2]|0)|0;a:do if(T){if(z>>>0<3){U=f[w>>2]|0;f[U>>2]=V;$=f[g>>2]|0;if($>>>0>1){aa=1;ba=$;ca=V;while(1){ca=(ca|0)==(ba+-1|0)?0:ca+1|0;f[U+(aa<<2)>>2]=ca;aa=aa+1|0;da=f[g>>2]|0;if(aa>>>0>=da>>>0){ea=da;break}else ba=da}}else ea=$;if(!z){fa=99;break}else{ga=0;ha=ea}while(1){ba=(f[N>>2]|0)+((X(f[M>>2]|0,S+ga|0)|0)<<2)|0;if(!ha)ia=0;else{aa=0;do{ca=f[(f[w>>2]|0)+(aa<<2)>>2]|0;U=(f[a>>2]|0)-(f[(f[Y>>2]|0)+(ca<<2)>>2]|0)|0;do if(U|0){da=f[y>>2]|0;ja=32-da|0;ka=32-U|0;la=f[ba+(ca<<2)>>2]<(ja|0)){ma=la>>>ka;ka=U-ja|0;f[y>>2]=ka;ja=f[h>>2]|ma>>>ka;f[h>>2]=ja;ka=f[j>>2]|0;if((ka|0)==(f[m>>2]|0))Ci(n,h);else{f[ka>>2]=ja;f[j>>2]=ka+4}f[h>>2]=ma<<32-(f[y>>2]|0);break}ma=f[h>>2]|la>>>da;f[h>>2]=ma;la=da+U|0;f[y>>2]=la;if((la|0)!=32)break;la=f[j>>2]|0;if((la|0)==(f[m>>2]|0))Ci(n,h);else{f[la>>2]=ma;f[j>>2]=la+4}f[h>>2]=0;f[y>>2]=0}while(0);aa=aa+1|0;U=f[g>>2]|0}while(aa>>>0>>0);ia=U}ga=ga+1|0;if(ga>>>0>=z>>>0){fa=99;break a}else ha=ia}}$=Z+1|0;qg(R+($*12|0)|0,f[R+(Z*12|0)>>2]|0,f[R+(Z*12|0)+4>>2]|0);aa=(f[(f[k>>2]|0)+($*12|0)>>2]|0)+(V<<2)|0;ba=(f[aa>>2]|0)+(1<>2]=ba;aa=f[A>>2]|0;U=f[B>>2]|0;b:do if((W|0)==(S|0))na=S;else{ca=f[O>>2]|0;if(!aa){if((f[ca+(V<<2)>>2]|0)>>>0>>0){na=W;break}else{oa=W;pa=S}while(1){la=oa;do{la=la+-1|0;if((pa|0)==(la|0)){na=pa;break b}ma=(f[P>>2]|0)+((X(la,U)|0)<<2)+(V<<2)|0}while((f[ma>>2]|0)>>>0>=ba>>>0);pa=pa+1|0;if((pa|0)==(la|0)){na=la;break b}else oa=la}}else{qa=W;ra=S}while(1){ma=ra;while(1){sa=ca+((X(ma,aa)|0)<<2)|0;if((f[sa+(V<<2)>>2]|0)>>>0>=ba>>>0){ta=qa;break}da=ma+1|0;if((da|0)==(qa|0)){na=qa;break b}else ma=da}while(1){ta=ta+-1|0;if((ma|0)==(ta|0)){na=ma;break b}ua=(f[P>>2]|0)+((X(ta,U)|0)<<2)|0;if((f[ua+(V<<2)>>2]|0)>>>0>>0){va=0;break}}do{la=sa+(va<<2)|0;da=ua+(va<<2)|0;ka=f[la>>2]|0;f[la>>2]=f[da>>2];f[da>>2]=ka;va=va+1|0}while((va|0)!=(aa|0));ra=ma+1|0;if((ra|0)==(ta|0)){na=ta;break}else qa=ta}}while(0);ba=(_(z|0)|0)^31;U=na-S|0;ca=W-na|0;ka=U>>>0>>0;if((U|0)!=(ca|0)){da=f[H>>2]|0;if(ka)f[I>>2]=f[I>>2]|1<<31-da;la=da+1|0;f[H>>2]=la;if((la|0)==32){la=f[J>>2]|0;if((la|0)==(f[K>>2]|0))Ci(L,I);else{f[la>>2]=f[I>>2];f[J>>2]=la+4}f[H>>2]=0;f[I>>2]=0}}la=z>>>1;do if(ka){da=f[C>>2]|0;ja=32-da|0;wa=32-ba|0;xa=la-U<(ja|0)){ya=xa>>>wa;wa=ba-ja|0;f[C>>2]=wa;ja=f[D>>2]|ya>>>wa;f[D>>2]=ja;wa=f[E>>2]|0;if((wa|0)==(f[F>>2]|0))Ci(G,D);else{f[wa>>2]=ja;f[E>>2]=wa+4}f[D>>2]=ya<<32-(f[C>>2]|0);break}ya=f[D>>2]|xa>>>da;f[D>>2]=ya;xa=da+ba|0;f[C>>2]=xa;if((xa|0)==32){xa=f[E>>2]|0;if((xa|0)==(f[F>>2]|0))Ci(G,D);else{f[xa>>2]=ya;f[E>>2]=xa+4}f[D>>2]=0;f[C>>2]=0}}else{xa=f[C>>2]|0;ya=32-xa|0;da=32-ba|0;wa=la-ca<(ya|0)){ja=wa>>>da;da=ba-ya|0;f[C>>2]=da;ya=f[D>>2]|ja>>>da;f[D>>2]=ya;da=f[E>>2]|0;if((da|0)==(f[F>>2]|0))Ci(G,D);else{f[da>>2]=ya;f[E>>2]=da+4}f[D>>2]=ja<<32-(f[C>>2]|0);break}ja=f[D>>2]|wa>>>xa;f[D>>2]=ja;wa=xa+ba|0;f[C>>2]=wa;if((wa|0)==32){wa=f[E>>2]|0;if((wa|0)==(f[F>>2]|0))Ci(G,D);else{f[wa>>2]=ja;f[E>>2]=wa+4}f[D>>2]=0;f[C>>2]=0}}while(0);ba=f[s>>2]|0;la=f[ba+(Z*12|0)>>2]|0;ka=la+(V<<2)|0;f[ka>>2]=(f[ka>>2]|0)+1;qg(ba+($*12|0)|0,la,f[ba+(Z*12|0)+4>>2]|0);if((na|0)!=(S|0)){ba=f[o>>2]|0;la=f[t>>2]|0;ka=ba-la>>2;wa=f[v>>2]|0;ja=f[l>>2]|0;if((((ka|0)==0?0:(ka*113|0)+-1|0)|0)==(ja+wa|0)){Jc(e);za=f[v>>2]|0;Aa=f[l>>2]|0;Ba=f[o>>2]|0;Ca=f[t>>2]|0}else{za=wa;Aa=ja;Ba=ba;Ca=la}la=Aa+za|0;if((Ba|0)==(Ca|0))Da=0;else Da=(f[Ca+(((la>>>0)/113|0)<<2)>>2]|0)+(((la>>>0)%113|0)*36|0)|0;f[Da>>2]=S;la=Da+4|0;f[la>>2]=r;f[la+4>>2]=x;f[Da+12>>2]=na;f[Da+16>>2]=i;f[Da+20>>2]=aa;f[Da+24>>2]=V;f[Da+28>>2]=U;f[Da+32>>2]=Z;f[l>>2]=(f[l>>2]|0)+1}if((W|0)!=(na|0)){la=f[o>>2]|0;ba=f[t>>2]|0;ja=la-ba>>2;wa=f[v>>2]|0;ka=f[l>>2]|0;if((((ja|0)==0?0:(ja*113|0)+-1|0)|0)==(ka+wa|0)){Jc(e);Ea=f[v>>2]|0;Fa=f[l>>2]|0;Ga=f[o>>2]|0;Ha=f[t>>2]|0}else{Ea=wa;Fa=ka;Ga=la;Ha=ba}ba=Fa+Ea|0;if((Ga|0)==(Ha|0))Ia=0;else Ia=(f[Ha+(((ba>>>0)/113|0)<<2)>>2]|0)+(((ba>>>0)%113|0)*36|0)|0;f[Ia>>2]=na;f[Ia+4>>2]=i;f[Ia+8>>2]=aa;f[Ia+12>>2]=W;ba=Ia+16|0;f[ba>>2]=p;f[ba+4>>2]=q;f[Ia+24>>2]=V;f[Ia+28>>2]=ca;f[Ia+32>>2]=$;ba=(f[l>>2]|0)+1|0;f[l>>2]=ba;Ja=ba}else fa=99}else fa=99;while(0);if((fa|0)==99){fa=0;Ja=f[l>>2]|0}if(!Ja)break;else Q=Ja}}Ja=f[t>>2]|0;Q=f[v>>2]|0;Ia=Ja+(((Q>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ja;if((q|0)==(Ja|0)){Ka=0;La=0}else{na=(f[Ia>>2]|0)+(((Q>>>0)%113|0)*36|0)|0;Ka=na;La=na}na=Ia;Ia=La;c:while(1){La=Ia;do{Q=La;if((Ka|0)==(Q|0))break c;La=Q+36|0}while((La-(f[na>>2]|0)|0)!=4068);La=na+4|0;na=La;Ia=f[La>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ja;do{br(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Ma=f[o>>2]|0;Na=Ma-i>>2}while(Na>>>0>2);Oa=Na;Pa=i;Qa=Ma}else{Oa=l;Pa=Ja;Qa=q}switch(Oa|0){case 1:{Ra=56;fa=113;break}case 2:{Ra=113;fa=113;break}default:{}}if((fa|0)==113)f[v>>2]=Ra;if((Pa|0)!=(Qa|0)){Ra=Pa;do{br(f[Ra>>2]|0);Ra=Ra+4|0}while((Ra|0)!=(Qa|0));Qa=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Qa|0))f[o>>2]=t+(~((t+-4-Qa|0)>>>2)<<2)}Qa=f[e>>2]|0;if(!Qa){u=d;return}br(Qa);u=d;return}function ib(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;d=u;u=u+80|0;e=d+56|0;g=d+52|0;h=d+48|0;i=d+68|0;j=d;k=d+44|0;l=d+40|0;m=d+36|0;n=d+32|0;o=d+28|0;p=d+24|0;q=d+20|0;r=d+16|0;s=d+12|0;if(!(b[c+288>>0]|0)){Ne(e,f[c+8>>2]|0);t=c+12|0;v=f[e>>2]|0;f[e>>2]=0;w=f[t>>2]|0;f[t>>2]=v;if(w){ui(w);br(w);w=f[e>>2]|0;f[e>>2]=0;if(w|0){ui(w);br(w)}}else f[e>>2]=0}else{Mg(e,f[c+8>>2]|0);w=c+12|0;v=f[e>>2]|0;f[e>>2]=0;t=f[w>>2]|0;f[w>>2]=v;if(t){ui(t);br(t);t=f[e>>2]|0;f[e>>2]=0;if(t|0){ui(t);br(t)}}else f[e>>2]=0}t=c+12|0;v=f[t>>2]|0;if(v|0?(((f[v+4>>2]|0)-(f[v>>2]|0)>>2>>>0)/3|0|0)!=(f[v+40>>2]|0):0){w=c+200|0;f[c+264>>2]=c;x=c+4|0;Nh(((f[v+28>>2]|0)-(f[v+24>>2]|0)>>2)-(f[v+44>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;v=f[t>>2]|0;Nh((((f[v+4>>2]|0)-(f[v>>2]|0)>>2>>>0)/3|0)-(f[v+40>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;v=c+28|0;y=c+8|0;z=f[y>>2]|0;A=((f[z+100>>2]|0)-(f[z+96>>2]|0)|0)/12|0;b[e>>0]=0;Xg(v,A,e);A=f[t>>2]|0;z=(f[A+28>>2]|0)-(f[A+24>>2]|0)>>2;f[e>>2]=-1;Sf(c+52|0,z,e);z=c+40|0;A=f[z>>2]|0;B=c+44|0;C=f[B>>2]|0;if((C|0)!=(A|0))f[B>>2]=C+(~((C+-4-A|0)>>>2)<<2);A=f[t>>2]|0;C=(f[A+4>>2]|0)-(f[A>>2]|0)>>2;$j(z,C-((C>>>0)%3|0)|0);C=c+84|0;z=f[t>>2]|0;A=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2;b[e>>0]=0;Xg(C,A,e);A=c+96|0;z=f[A>>2]|0;B=c+100|0;D=f[B>>2]|0;if((D|0)!=(z|0))f[B>>2]=D+(~((D+-4-z|0)>>>2)<<2);f[c+164>>2]=-1;z=c+168|0;f[z>>2]=0;D=f[c+108>>2]|0;E=c+112|0;F=f[E>>2]|0;if((F|0)!=(D|0))f[E>>2]=F+(~(((F+-12-D|0)>>>0)/12|0)*12|0);D=c+132|0;if(f[D>>2]|0){F=c+128|0;E=f[F>>2]|0;if(E|0){G=E;do{E=G;G=f[G>>2]|0;br(E)}while((G|0)!=0)}f[F>>2]=0;F=f[c+124>>2]|0;if(F|0){G=c+120|0;E=0;do{f[(f[G>>2]|0)+(E<<2)>>2]=0;E=E+1|0}while((E|0)!=(F|0))}f[D>>2]=0}f[c+144>>2]=0;D=f[t>>2]|0;F=(f[D+28>>2]|0)-(f[D+24>>2]|0)>>2;f[e>>2]=-1;Sf(c+152|0,F,e);F=c+72|0;D=f[F>>2]|0;E=c+76|0;G=f[E>>2]|0;if((G|0)!=(D|0))f[E>>2]=G+(~((G+-4-D|0)>>>2)<<2);D=f[t>>2]|0;$j(F,((f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)/3|0);f[c+64>>2]=0;if(!(oe(c)|0)){D=dn(32)|0;f[e>>2]=D;f[e+8>>2]=-2147483616;f[e+4>>2]=29;H=D;I=13227;J=H+29|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[D+29>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}if(!(ch(c)|0)){D=dn(48)|0;f[e>>2]=D;f[e+8>>2]=-2147483600;f[e+4>>2]=36;H=D;I=13257;J=H+36|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[D+36>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}D=c+172|0;G=c+176|0;K=(((f[G>>2]|0)-(f[D>>2]|0)|0)/136|0)&255;b[i>>0]=K;L=f[(f[x>>2]|0)+44>>2]|0;M=L+16|0;N=f[M+4>>2]|0;if((N|0)>0|(N|0)==0&(f[M>>2]|0)>>>0>0)O=K;else{f[g>>2]=f[L+4>>2];f[e>>2]=f[g>>2];ye(L,e,i,i+1|0)|0;O=b[i>>0]|0}i=c+284|0;f[i>>2]=O&255;O=f[t>>2]|0;L=(f[O+4>>2]|0)-(f[O>>2]|0)|0;O=L>>2;Ti(w);f[j>>2]=0;K=j+4|0;f[K>>2]=0;f[j+8>>2]=0;a:do if((L|0)>0){M=c+104|0;N=j+8|0;P=0;b:while(1){Q=(P>>>0)/3|0;R=Q>>>5;S=1<<(Q&31);if((f[(f[v>>2]|0)+(R<<2)>>2]&S|0)==0?(T=f[t>>2]|0,f[k>>2]=Q,f[e>>2]=f[k>>2],!(Rj(T,e)|0)):0){f[g>>2]=0;f[l>>2]=Q;f[e>>2]=f[l>>2];Q=gg(c,e,g)|0;Vi(w,Q);T=f[g>>2]|0;U=(T|0)==-1;do if(Q){do if(U){V=-1;W=-1;X=-1}else{Y=f[f[t>>2]>>2]|0;Z=f[Y+(T<<2)>>2]|0;_=T+1|0;$=((_>>>0)%3|0|0)==0?T+-2|0:_;if(($|0)==-1)aa=-1;else aa=f[Y+($<<2)>>2]|0;$=(((T>>>0)%3|0|0)==0?2:-1)+T|0;if(($|0)==-1){V=-1;W=aa;X=Z;break}V=f[Y+($<<2)>>2]|0;W=aa;X=Z}while(0);Z=f[C>>2]|0;$=Z+(X>>>5<<2)|0;f[$>>2]=f[$>>2]|1<<(X&31);$=Z+(W>>>5<<2)|0;f[$>>2]=f[$>>2]|1<<(W&31);$=Z+(V>>>5<<2)|0;f[$>>2]=f[$>>2]|1<<(V&31);f[e>>2]=1;$=f[B>>2]|0;if($>>>0<(f[M>>2]|0)>>>0){f[$>>2]=1;f[B>>2]=$+4}else Ci(A,e);$=(f[v>>2]|0)+(R<<2)|0;f[$>>2]=f[$>>2]|S;$=T+1|0;if(U)ba=-1;else ba=(($>>>0)%3|0|0)==0?T+-2|0:$;f[e>>2]=ba;Z=f[K>>2]|0;if(Z>>>0<(f[N>>2]|0)>>>0){f[Z>>2]=ba;f[K>>2]=Z+4}else Ci(j,e);if(U)break;Z=(($>>>0)%3|0|0)==0?T+-2|0:$;if((Z|0)==-1)break;$=f[(f[(f[t>>2]|0)+12>>2]|0)+(Z<<2)>>2]|0;Z=($|0)==-1;Y=Z?-1:($>>>0)/3|0;if(Z)break;if(f[(f[v>>2]|0)+(Y>>>5<<2)>>2]&1<<(Y&31)|0)break;f[m>>2]=$;f[e>>2]=f[m>>2];if(!(hc(c,e)|0)){ca=65;break b}}else{$=T+1|0;if(U)da=-1;else da=(($>>>0)%3|0|0)==0?T+-2|0:$;f[n>>2]=da;f[e>>2]=f[n>>2];Ce(c,e,1)|0;f[o>>2]=f[g>>2];f[e>>2]=f[o>>2];if(!(hc(c,e)|0)){ca=71;break b}}while(0)}P=P+1|0;if((P|0)>=(O|0)){ca=77;break a}}if((ca|0)==65){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;P=dn(48)|0;f[e>>2]=P;f[e+8>>2]=-2147483600;f[e+4>>2]=32;H=P;I=13294;J=H+32|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[P+32>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}else if((ca|0)==71){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;N=dn(48)|0;f[e>>2]=N;f[e+8>>2]=-2147483600;f[e+4>>2]=32;H=N;I=13294;J=H+32|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[N+32>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}}else ca=77;while(0);do if((ca|0)==77){O=f[F>>2]|0;o=f[E>>2]|0;n=o;if((O|0)!=(o|0)?(da=o+-4|0,O>>>0>>0):0){o=O;O=da;do{da=f[o>>2]|0;f[o>>2]=f[O>>2];f[O>>2]=da;o=o+4|0;O=O+-4|0}while(o>>>0>>0)}f[p>>2]=n;f[q>>2]=f[j>>2];f[r>>2]=f[K>>2];f[h>>2]=f[p>>2];f[g>>2]=f[q>>2];f[e>>2]=f[r>>2];Md(F,h,g,e)|0;if((f[G>>2]|0)!=(f[D>>2]|0)?(O=f[y>>2]|0,o=((f[O+100>>2]|0)-(f[O+96>>2]|0)|0)/12|0,b[e>>0]=0,Xg(v,o,e),o=f[F>>2]|0,O=f[E>>2]|0,(o|0)!=(O|0)):0){N=o;do{f[s>>2]=f[N>>2];f[e>>2]=f[s>>2];ue(c,e)|0;N=N+4|0}while((N|0)!=(O|0))}_g(w);O=c+232|0;fd(w,O);N=c+280|0;n=f[N>>2]|0;if((n|0?(f[i>>2]|0)>0:0)?(fd(n,O),(f[i>>2]|0)>1):0){n=1;do{fd((f[N>>2]|0)+(n<<5)|0,O);n=n+1|0}while((n|0)<(f[i>>2]|0))}Nh((f[c+272>>2]|0)-(f[c+268>>2]|0)>>2,f[(f[x>>2]|0)+44>>2]|0)|0;Nh(f[z>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;if(Jg(c)|0){n=f[(f[x>>2]|0)+44>>2]|0;N=f[O>>2]|0;o=n+16|0;da=f[o+4>>2]|0;if(!((da|0)>0|(da|0)==0&(f[o>>2]|0)>>>0>0)){o=(f[c+236>>2]|0)-N|0;f[g>>2]=f[n+4>>2];f[e>>2]=f[g>>2];ye(n,e,N,N+o|0)|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;break}else{f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;o=dn(32)|0;f[e>>2]=o;f[e+8>>2]=-2147483616;f[e+4>>2]=28;H=o;I=13327;J=H+28|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[o+28>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);break}}while(0);g=f[j>>2]|0;if(g|0){j=f[K>>2]|0;if((j|0)!=(g|0))f[K>>2]=j+(~((j+-4-g|0)>>>2)<<2);br(g)}u=d;return}g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=29;H=g;I=13197;J=H+29|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[g+29>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}function jb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0;d=u;u=u+48|0;e=d+36|0;g=d+24|0;h=d;i=a+8|0;j=f[i>>2]|0;f[e>>2]=0;k=e+4|0;f[k>>2]=0;f[e+8>>2]=0;do if(j)if(j>>>0>1073741823)mq(e);else{l=j<<2;m=dn(l)|0;f[e>>2]=m;n=m+(j<<2)|0;f[e+8>>2]=n;hj(m|0,0,l|0)|0;f[k>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+1164|0;n=f[m>>2]|0;l=f[n>>2]|0;q=n+4|0;if(!l){r=n+8|0;s=p;t=o;v=j}else{j=f[q>>2]|0;if((j|0)!=(l|0))f[q>>2]=j+(~((j+-4-l|0)>>>2)<<2);br(l);l=n+8|0;f[l>>2]=0;f[q>>2]=0;f[n>>2]=0;r=l;s=f[e>>2]|0;t=f[k>>2]|0;v=f[i>>2]|0}f[n>>2]=s;f[q>>2]=t;f[r>>2]=f[e+8>>2];f[e>>2]=0;r=e+4|0;f[r>>2]=0;f[e+8>>2]=0;do if(v)if(v>>>0>1073741823)mq(e);else{t=v<<2;q=dn(t)|0;f[e>>2]=q;s=q+(v<<2)|0;f[e+8>>2]=s;hj(q|0,0,t|0)|0;f[r>>2]=s;w=s;x=q;break}else{w=0;x=0}while(0);v=a+1176|0;q=f[v>>2]|0;s=f[q>>2]|0;t=q+4|0;if(!s){y=q+8|0;z=x;A=w}else{w=f[t>>2]|0;if((w|0)!=(s|0))f[t>>2]=w+(~((w+-4-s|0)>>>2)<<2);br(s);s=q+8|0;f[s>>2]=0;f[t>>2]=0;f[q>>2]=0;y=s;z=f[e>>2]|0;A=f[r>>2]|0}f[q>>2]=z;f[t>>2]=A;f[y>>2]=f[e+8>>2];y=f[b>>2]|0;A=b+4|0;t=f[A>>2]|0;z=f[A+4>>2]|0;A=f[c>>2]|0;q=c+4|0;r=f[q>>2]|0;s=f[q+4>>2]|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;q=h+8|0;w=h+4|0;x=h+16|0;n=h+20|0;k=t;Jc(h);l=f[w>>2]|0;j=(f[n>>2]|0)+(f[x>>2]|0)|0;if((f[q>>2]|0)==(l|0))B=0;else B=(f[l+(((j>>>0)/113|0)<<2)>>2]|0)+(((j>>>0)%113|0)*36|0)|0;f[B>>2]=y;j=B+4|0;f[j>>2]=t;f[j+4>>2]=z;f[B+12>>2]=A;j=B+16|0;f[j>>2]=r;f[j+4>>2]=s;f[B+24>>2]=0;f[B+28>>2]=A-y;f[B+32>>2]=0;B=(f[n>>2]|0)+1|0;f[n>>2]=B;if(B|0){y=a+1152|0;A=a+1084|0;j=a+1080|0;l=a+1072|0;o=a+1076|0;p=a+1068|0;C=b+8|0;D=c+8|0;E=a+1124|0;F=a+1120|0;G=a+1112|0;H=a+1116|0;I=a+1108|0;J=k+4|0;K=k+24|0;L=k+24|0;M=r+24|0;N=B;while(1){B=f[x>>2]|0;O=N+-1|0;P=O+B|0;Q=f[w>>2]|0;R=f[Q+(((P>>>0)/113|0)<<2)>>2]|0;S=(P>>>0)%113|0;P=f[R+(S*36|0)>>2]|0;T=f[R+(S*36|0)+12>>2]|0;U=f[R+(S*36|0)+24>>2]|0;V=f[R+(S*36|0)+32>>2]|0;f[n>>2]=O;O=f[q>>2]|0;S=O-Q>>2;if((1-N-B+((S|0)==0?0:(S*113|0)+-1|0)|0)>>>0>225){br(f[O+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}f[b>>2]=P;f[c>>2]=T;O=f[m>>2]|0;S=O+(V*12|0)|0;B=(f[v>>2]|0)+(V*12|0)|0;f[g>>2]=f[b>>2];f[g+4>>2]=f[b+4>>2];f[g+8>>2]=f[b+8>>2];f[e>>2]=f[c>>2];f[e+4>>2]=f[c+4>>2];f[e+8>>2]=f[c+8>>2];Q=Gd(a,g,e,S,B,U)|0;U=T-P|0;R=(f[a>>2]|0)-(f[(f[B>>2]|0)+(Q<<2)>>2]|0)|0;a:do if(R){if(U>>>0<3){W=f[y>>2]|0;f[W>>2]=Q;Y=f[i>>2]|0;if(Y>>>0>1){Z=1;$=Y;aa=Q;while(1){aa=(aa|0)==($+-1|0)?0:aa+1|0;f[W+(Z<<2)>>2]=aa;Z=Z+1|0;ba=f[i>>2]|0;if(Z>>>0>=ba>>>0){ca=ba;break}else $=ba}}else ca=Y;if(!U){da=87;break}else{ea=0;fa=ca}while(1){$=(f[K>>2]|0)+((X(f[J>>2]|0,P+ea|0)|0)<<2)|0;if(!fa)ga=0;else{Z=0;do{aa=f[(f[y>>2]|0)+(Z<<2)>>2]|0;W=(f[a>>2]|0)-(f[(f[B>>2]|0)+(aa<<2)>>2]|0)|0;do if(W|0){ba=f[A>>2]|0;ha=32-ba|0;ia=32-W|0;ja=f[$+(aa<<2)>>2]<(ha|0)){ka=ja>>>ia;ia=W-ha|0;f[A>>2]=ia;ha=f[j>>2]|ka>>>ia;f[j>>2]=ha;ia=f[l>>2]|0;if((ia|0)==(f[o>>2]|0))Ci(p,j);else{f[ia>>2]=ha;f[l>>2]=ia+4}f[j>>2]=ka<<32-(f[A>>2]|0);break}ka=f[j>>2]|ja>>>ba;f[j>>2]=ka;ja=ba+W|0;f[A>>2]=ja;if((ja|0)!=32)break;ja=f[l>>2]|0;if((ja|0)==(f[o>>2]|0))Ci(p,j);else{f[ja>>2]=ka;f[l>>2]=ja+4}f[j>>2]=0;f[A>>2]=0}while(0);Z=Z+1|0;W=f[i>>2]|0}while(Z>>>0>>0);ga=W}ea=ea+1|0;if(ea>>>0>=U>>>0){da=87;break a}else fa=ga}}Y=V+1|0;Z=f[m>>2]|0;$=Z+(Y*12|0)|0;if(($|0)==(S|0))la=Z;else{qg($,f[S>>2]|0,f[O+(V*12|0)+4>>2]|0);la=f[m>>2]|0}$=(f[la+(Y*12|0)>>2]|0)+(Q<<2)|0;Z=(f[$>>2]|0)+(1<>2]=Z;$=f[C>>2]|0;W=f[D>>2]|0;b:do if((T|0)==(P|0))ma=P;else{aa=f[L>>2]|0;if(!$){if((f[aa+(Q<<2)>>2]|0)>>>0>>0){ma=T;break}else{na=T;oa=P}while(1){ja=na;do{ja=ja+-1|0;if((oa|0)==(ja|0)){ma=oa;break b}ka=(f[M>>2]|0)+((X(ja,W)|0)<<2)+(Q<<2)|0}while((f[ka>>2]|0)>>>0>=Z>>>0);oa=oa+1|0;if((oa|0)==(ja|0)){ma=ja;break b}else na=ja}}else{pa=T;qa=P}while(1){ka=qa;while(1){ra=aa+((X(ka,$)|0)<<2)|0;if((f[ra+(Q<<2)>>2]|0)>>>0>=Z>>>0){sa=pa;break}ba=ka+1|0;if((ba|0)==(pa|0)){ma=pa;break b}else ka=ba}while(1){sa=sa+-1|0;if((ka|0)==(sa|0)){ma=ka;break b}ta=(f[M>>2]|0)+((X(sa,W)|0)<<2)|0;if((f[ta+(Q<<2)>>2]|0)>>>0>>0){ua=0;break}}do{ja=ra+(ua<<2)|0;ba=ta+(ua<<2)|0;ia=f[ja>>2]|0;f[ja>>2]=f[ba>>2];f[ba>>2]=ia;ua=ua+1|0}while((ua|0)!=($|0));qa=ka+1|0;if((qa|0)==(sa|0)){ma=sa;break}else pa=sa}}while(0);Z=(_(U|0)|0)^31;W=ma-P|0;aa=T-ma|0;ia=W>>>0>>0;if((W|0)!=(aa|0)){ba=f[E>>2]|0;if(ia)f[F>>2]=f[F>>2]|1<<31-ba;ja=ba+1|0;f[E>>2]=ja;if((ja|0)==32){ja=f[G>>2]|0;if((ja|0)==(f[H>>2]|0))Ci(I,F);else{f[ja>>2]=f[F>>2];f[G>>2]=ja+4}f[E>>2]=0;f[F>>2]=0}}ja=U>>>1;if(ia){ia=ja-W|0;if(Z|0){ba=0;ha=1<>>1}}}else{ha=ja-aa|0;if(Z|0){ba=0;ia=1<>>1}}}ia=f[v>>2]|0;Z=f[ia+(V*12|0)>>2]|0;ba=Z+(Q<<2)|0;f[ba>>2]=(f[ba>>2]|0)+1;qg(ia+(Y*12|0)|0,Z,f[ia+(V*12|0)+4>>2]|0);if((ma|0)!=(P|0)){ia=f[q>>2]|0;Z=f[w>>2]|0;ba=ia-Z>>2;ha=f[x>>2]|0;ja=f[n>>2]|0;if((((ba|0)==0?0:(ba*113|0)+-1|0)|0)==(ja+ha|0)){Jc(h);va=f[x>>2]|0;wa=f[n>>2]|0;xa=f[q>>2]|0;ya=f[w>>2]|0}else{va=ha;wa=ja;xa=ia;ya=Z}Z=wa+va|0;if((xa|0)==(ya|0))za=0;else za=(f[ya+(((Z>>>0)/113|0)<<2)>>2]|0)+(((Z>>>0)%113|0)*36|0)|0;f[za>>2]=P;Z=za+4|0;f[Z>>2]=t;f[Z+4>>2]=z;f[za+12>>2]=ma;f[za+16>>2]=k;f[za+20>>2]=$;f[za+24>>2]=Q;f[za+28>>2]=W;f[za+32>>2]=V;f[n>>2]=(f[n>>2]|0)+1}if((T|0)!=(ma|0)){Z=f[q>>2]|0;ia=f[w>>2]|0;ja=Z-ia>>2;ha=f[x>>2]|0;ba=f[n>>2]|0;if((((ja|0)==0?0:(ja*113|0)+-1|0)|0)==(ba+ha|0)){Jc(h);Aa=f[x>>2]|0;Ba=f[n>>2]|0;Ca=f[q>>2]|0;Da=f[w>>2]|0}else{Aa=ha;Ba=ba;Ca=Z;Da=ia}ia=Ba+Aa|0;if((Ca|0)==(Da|0))Ea=0;else Ea=(f[Da+(((ia>>>0)/113|0)<<2)>>2]|0)+(((ia>>>0)%113|0)*36|0)|0;f[Ea>>2]=ma;f[Ea+4>>2]=k;f[Ea+8>>2]=$;f[Ea+12>>2]=T;ia=Ea+16|0;f[ia>>2]=r;f[ia+4>>2]=s;f[Ea+24>>2]=Q;f[Ea+28>>2]=aa;f[Ea+32>>2]=Y;ia=(f[n>>2]|0)+1|0;f[n>>2]=ia;Fa=ia}else da=87}else da=87;while(0);if((da|0)==87){da=0;Fa=f[n>>2]|0}if(!Fa)break;else N=Fa}}Fa=f[w>>2]|0;N=f[x>>2]|0;Ea=Fa+(((N>>>0)/113|0)<<2)|0;s=f[q>>2]|0;r=s;k=Fa;if((s|0)==(Fa|0)){Ga=0;Ha=0}else{ma=(f[Ea>>2]|0)+(((N>>>0)%113|0)*36|0)|0;Ga=ma;Ha=ma}ma=Ea;Ea=Ha;c:while(1){Ha=Ea;do{N=Ha;if((Ga|0)==(N|0))break c;Ha=N+36|0}while((Ha-(f[ma>>2]|0)|0)!=4068);Ha=ma+4|0;ma=Ha;Ea=f[Ha>>2]|0}f[n>>2]=0;n=r-k>>2;if(n>>>0>2){k=Fa;do{br(f[k>>2]|0);k=(f[w>>2]|0)+4|0;f[w>>2]=k;Ia=f[q>>2]|0;Ja=Ia-k>>2}while(Ja>>>0>2);Ka=Ja;La=k;Ma=Ia}else{Ka=n;La=Fa;Ma=s}switch(Ka|0){case 1:{Na=56;da=101;break}case 2:{Na=113;da=101;break}default:{}}if((da|0)==101)f[x>>2]=Na;if((La|0)!=(Ma|0)){Na=La;do{br(f[Na>>2]|0);Na=Na+4|0}while((Na|0)!=(Ma|0));Ma=f[w>>2]|0;w=f[q>>2]|0;if((w|0)!=(Ma|0))f[q>>2]=w+(~((w+-4-Ma|0)>>>2)<<2)}Ma=f[h>>2]|0;if(!Ma){u=d;return}br(Ma);u=d;return}function kb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;d=u;u=u+1424|0;e=d+1408|0;g=d+1396|0;h=d+1420|0;i=d+1200|0;j=d+12|0;k=d;l=d+1384|0;m=d+1372|0;n=d+1360|0;o=d+1348|0;p=d+1336|0;q=d+1324|0;r=d+1312|0;s=d+1300|0;t=d+1288|0;v=d+1276|0;w=d+1264|0;x=d+1252|0;y=d+1240|0;z=d+1228|0;A=a+28|0;B=10-(Yh(f[(f[A>>2]|0)+48>>2]|0)|0)|0;C=(B|0)<6?B:6;b[h>>0]=C;if((C&255|0)==6?(f[a+72>>2]|0)>15:0)b[h>>0]=5;C=c+16|0;B=f[C+4>>2]|0;if(!((B|0)>0|(B|0)==0&(f[C>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}C=f[A>>2]|0;B=f[(f[C+4>>2]|0)+80>>2]|0;D=a+72|0;E=f[D>>2]|0;f[i>>2]=B;F=i+4|0;f[F>>2]=E;f[i+8>>2]=E<<2;G=i+12|0;H=X(E,B)|0;f[G>>2]=0;J=i+16|0;f[J>>2]=0;f[i+20>>2]=0;do if(H)if(H>>>0>1073741823)mq(G);else{K=H<<2;L=dn(K)|0;f[G>>2]=L;M=L+(H<<2)|0;f[i+20>>2]=M;hj(L|0,0,K|0)|0;f[J>>2]=M;N=L;break}else N=0;while(0);H=i+24|0;f[H>>2]=N;G=a+4|0;L=a+8|0;M=f[G>>2]|0;a:do if((f[L>>2]|0)!=(M|0)){K=j+4|0;O=j+8|0;P=j+8|0;Q=(B|0)==0;R=j+4|0;S=j+8|0;T=k+4|0;U=k+8|0;V=k+8|0;W=a+48|0;Y=j+8|0;Z=a+60|0;$=0;aa=0;ba=0;ca=0;da=M;ea=C;b:while(1){fa=f[(f[(f[ea+4>>2]|0)+8>>2]|0)+(f[da+(ca<<2)>>2]<<2)>>2]|0;switch(f[fa+28>>2]|0){case 1:case 3:case 5:case 2:case 4:case 6:{ga=fa;ha=aa;break}case 9:{ga=f[(f[Z>>2]|0)+(aa<<2)>>2]|0;ha=aa+1|0;break}default:{ia=0;break a}}if(!ga){ia=0;break a}c:do switch(f[ga+28>>2]|0){case 6:{if(Q){ja=ba;ka=ga+24|0;break c}fa=ga+84|0;la=ga+68|0;ma=ga+48|0;na=ga+40|0;oa=ga+24|0;pa=0;do{if(!(b[fa>>0]|0))qa=f[(f[la>>2]|0)+(pa<<2)>>2]|0;else qa=pa;ra=ma;sa=f[ra>>2]|0;ta=f[ra+4>>2]|0;ra=na;ua=on(f[ra>>2]|0,f[ra+4>>2]|0,qa|0,0)|0;ra=Tn(ua|0,I|0,sa|0,ta|0)|0;Rg((f[H>>2]|0)+((X(f[F>>2]|0,pa)|0)<<2)+($<<2)|0,(f[f[ga>>2]>>2]|0)+ra|0,b[oa>>0]<<2|0)|0;pa=pa+1|0}while((pa|0)!=(B|0));ja=ba;ka=oa;break}case 1:case 3:case 5:{oa=ga+24|0;pa=b[oa>>0]|0;na=pa<<24>>24;f[j>>2]=0;f[R>>2]=0;f[S>>2]=0;if(!(pa<<24>>24))va=0;else{if(pa<<24>>24<0){wa=24;break b}pa=na<<2;ma=dn(pa)|0;f[j>>2]=ma;la=ma+(na<<2)|0;f[Y>>2]=la;hj(ma|0,0,pa|0)|0;f[R>>2]=la;va=b[oa>>0]|0}la=va<<24>>24;f[k>>2]=0;f[T>>2]=0;f[U>>2]=0;if(!(va<<24>>24)){xa=0;ya=0}else{if(va<<24>>24<0){wa=30;break b}pa=la<<2;ma=dn(pa)|0;f[k>>2]=ma;na=ma+(la<<2)|0;f[V>>2]=na;hj(ma|0,0,pa|0)|0;f[T>>2]=na;xa=ma;ya=ma}if(Q){za=ya;Aa=xa}else{ma=ga+84|0;na=ga+68|0;pa=0;do{if(!(b[ma>>0]|0))Ba=f[(f[na>>2]|0)+(pa<<2)>>2]|0;else Ba=pa;la=f[j>>2]|0;f[g>>2]=Ba;fa=b[oa>>0]|0;f[e>>2]=f[g>>2];Pb(ga,e,fa,la)|0;la=b[oa>>0]|0;fa=la<<24>>24;if(la<<24>>24>0){la=f[j>>2]|0;ra=f[W>>2]|0;ta=f[k>>2]|0;sa=0;do{f[ta+(sa<<2)>>2]=(f[la+(sa<<2)>>2]|0)-(f[ra+(sa+ba<<2)>>2]|0);sa=sa+1|0}while((sa|0)<(fa|0));Ca=ta}else Ca=f[k>>2]|0;Rg((f[H>>2]|0)+((X(f[F>>2]|0,pa)|0)<<2)+($<<2)|0,Ca|0,fa<<2|0)|0;pa=pa+1|0}while(pa>>>0>>0);pa=f[k>>2]|0;za=pa;Aa=pa}pa=ba+(b[oa>>0]|0)|0;if(za|0){na=f[T>>2]|0;if((na|0)!=(za|0))f[T>>2]=na+(~((na+-4-za|0)>>>2)<<2);br(Aa)}na=f[j>>2]|0;if(na|0){ma=f[R>>2]|0;if((ma|0)!=(na|0))f[R>>2]=ma+(~((ma+-4-na|0)>>>2)<<2);br(na)}ja=pa;ka=oa;break}default:{pa=ga+24|0;na=b[pa>>0]|0;ma=na<<24>>24;f[j>>2]=0;f[K>>2]=0;f[O>>2]=0;if(!(na<<24>>24)){Da=0;Ea=0}else{if(na<<24>>24<0){wa=53;break b}na=ma<<2;ta=dn(na)|0;f[j>>2]=ta;sa=ta+(ma<<2)|0;f[P>>2]=sa;hj(ta|0,0,na|0)|0;f[K>>2]=sa;Da=ta;Ea=ta}if(Q){Fa=Ea;Ga=Da}else{ta=ga+84|0;sa=ga+68|0;na=0;do{if(!(b[ta>>0]|0))Ha=f[(f[sa>>2]|0)+(na<<2)>>2]|0;else Ha=na;ma=f[j>>2]|0;f[g>>2]=Ha;ra=b[pa>>0]|0;f[e>>2]=f[g>>2];Ob(ga,e,ra,ma)|0;Rg((f[H>>2]|0)+((X(f[F>>2]|0,na)|0)<<2)+($<<2)|0,f[j>>2]|0,b[pa>>0]<<2|0)|0;na=na+1|0}while(na>>>0>>0);na=f[j>>2]|0;Fa=na;Ga=na}if(Fa|0){na=f[K>>2]|0;if((na|0)!=(Fa|0))f[K>>2]=na+(~((na+-4-Fa|0)>>>2)<<2);br(Ga)}ja=ba;ka=pa}}while(0);na=ca+1|0;sa=f[G>>2]|0;if(na>>>0>=(f[L>>2]|0)-sa>>2>>>0){wa=66;break}$=$+(b[ka>>0]|0)|0;aa=ha;ba=ja;ca=na;da=sa;ea=f[A>>2]|0}if((wa|0)==24)mq(j);else if((wa|0)==30)mq(k);else if((wa|0)==53)mq(j);else if((wa|0)==66){Ia=f[D>>2]|0;Ja=f[H>>2]|0;wa=67;break}}else{Ia=E;Ja=N;wa=67}while(0);d:do if((wa|0)==67){N=X(Ia,B)|0;if((N|0)>0){E=0;H=0;while(1){D=f[Ja+(E<<2)>>2]|0;if(!D)Ka=H;else{A=(_(D|0)|0)^31;Ka=(A|0)<(H|0)?H:A+1|0}E=E+1|0;if((E|0)>=(N|0)){La=Ka;break}else H=Ka}}else La=0;switch(b[h>>0]|0){case 6:{Ge(j,Ia);f[l>>2]=0;f[l+4>>2]=i;H=f[F>>2]|0;f[l+8>>2]=H;f[m>>2]=f[i>>2];f[m+4>>2]=i;f[m+8>>2]=H;f[k>>2]=La;f[g>>2]=f[l>>2];f[g+4>>2]=f[l+4>>2];f[g+8>>2]=f[l+8>>2];f[e>>2]=f[m>>2];f[e+4>>2]=f[m+4>>2];f[e+8>>2]=f[m+8>>2];H=ff(j,g,e,k,c)|0;Ee(j);if(!H){ia=0;break d}break}case 5:{Ge(j,Ia);f[n>>2]=0;f[n+4>>2]=i;H=f[F>>2]|0;f[n+8>>2]=H;f[o>>2]=f[i>>2];f[o+4>>2]=i;f[o+8>>2]=H;f[k>>2]=La;f[g>>2]=f[n>>2];f[g+4>>2]=f[n+4>>2];f[g+8>>2]=f[n+8>>2];f[e>>2]=f[o>>2];f[e+4>>2]=f[o+4>>2];f[e+8>>2]=f[o+8>>2];H=gf(j,g,e,k,c)|0;Ee(j);if(!H){ia=0;break d}break}case 4:{Ge(j,Ia);f[p>>2]=0;f[p+4>>2]=i;H=f[F>>2]|0;f[p+8>>2]=H;f[q>>2]=f[i>>2];f[q+4>>2]=i;f[q+8>>2]=H;f[k>>2]=La;f[g>>2]=f[p>>2];f[g+4>>2]=f[p+4>>2];f[g+8>>2]=f[p+8>>2];f[e>>2]=f[q>>2];f[e+4>>2]=f[q+4>>2];f[e+8>>2]=f[q+8>>2];H=gf(j,g,e,k,c)|0;Ee(j);if(!H){ia=0;break d}break}case 3:{Oe(j,Ia);f[r>>2]=0;f[r+4>>2]=i;H=f[F>>2]|0;f[r+8>>2]=H;f[s>>2]=f[i>>2];f[s+4>>2]=i;f[s+8>>2]=H;f[k>>2]=La;f[g>>2]=f[r>>2];f[g+4>>2]=f[r+4>>2];f[g+8>>2]=f[r+8>>2];f[e>>2]=f[s>>2];f[e+4>>2]=f[s+4>>2];f[e+8>>2]=f[s+8>>2];H=mf(j,g,e,k,c)|0;Ue(j);if(!H){ia=0;break d}break}case 2:{Oe(j,Ia);f[t>>2]=0;f[t+4>>2]=i;H=f[F>>2]|0;f[t+8>>2]=H;f[v>>2]=f[i>>2];f[v+4>>2]=i;f[v+8>>2]=H;f[k>>2]=La;f[g>>2]=f[t>>2];f[g+4>>2]=f[t+4>>2];f[g+8>>2]=f[t+8>>2];f[e>>2]=f[v>>2];f[e+4>>2]=f[v+4>>2];f[e+8>>2]=f[v+8>>2];H=mf(j,g,e,k,c)|0;Ue(j);if(!H){ia=0;break d}break}case 1:{Pe(j,Ia);f[w>>2]=0;f[w+4>>2]=i;H=f[F>>2]|0;f[w+8>>2]=H;f[x>>2]=f[i>>2];f[x+4>>2]=i;f[x+8>>2]=H;f[k>>2]=La;f[g>>2]=f[w>>2];f[g+4>>2]=f[w+4>>2];f[g+8>>2]=f[w+8>>2];f[e>>2]=f[x>>2];f[e+4>>2]=f[x+4>>2];f[e+8>>2]=f[x+8>>2];H=lf(j,g,e,k,c)|0;Te(j);if(!H){ia=0;break d}break}case 0:{Pe(j,Ia);f[y>>2]=0;f[y+4>>2]=i;H=f[F>>2]|0;f[y+8>>2]=H;f[z>>2]=f[i>>2];f[z+4>>2]=i;f[z+8>>2]=H;f[k>>2]=La;f[g>>2]=f[y>>2];f[g+4>>2]=f[y+4>>2];f[g+8>>2]=f[y+8>>2];f[e>>2]=f[z>>2];f[e+4>>2]=f[z+4>>2];f[e+8>>2]=f[z+8>>2];H=lf(j,g,e,k,c)|0;Te(j);if(!H){ia=0;break d}break}default:{ia=0;break d}}ia=1}while(0);j=f[i+12>>2]|0;if(!j){u=d;return ia|0}i=f[J>>2]|0;if((i|0)!=(j|0))f[J>>2]=i+(~((i+-4-j|0)>>>2)<<2);br(j);u=d;return ia|0}function lb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;d=u;u=u+80|0;e=d+56|0;g=d+52|0;h=d+48|0;i=d+68|0;j=d;k=d+44|0;l=d+40|0;m=d+36|0;n=d+32|0;o=d+28|0;p=d+24|0;q=d+20|0;r=d+16|0;s=d+12|0;if(!(b[c+352>>0]|0)){Ne(e,f[c+8>>2]|0);t=c+12|0;v=f[e>>2]|0;f[e>>2]=0;w=f[t>>2]|0;f[t>>2]=v;if(w){ui(w);br(w);w=f[e>>2]|0;f[e>>2]=0;if(w|0){ui(w);br(w)}}else f[e>>2]=0}else{Mg(e,f[c+8>>2]|0);w=c+12|0;v=f[e>>2]|0;f[e>>2]=0;t=f[w>>2]|0;f[w>>2]=v;if(t){ui(t);br(t);t=f[e>>2]|0;f[e>>2]=0;if(t|0){ui(t);br(t)}}else f[e>>2]=0}t=c+12|0;v=f[t>>2]|0;if(v|0?(((f[v+4>>2]|0)-(f[v>>2]|0)>>2>>>0)/3|0|0)!=(f[v+40>>2]|0):0){v=c+200|0;Td(v,c)|0;w=f[t>>2]|0;x=c+4|0;Nh(((f[w+28>>2]|0)-(f[w+24>>2]|0)>>2)-(f[w+44>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;w=f[t>>2]|0;Nh((((f[w+4>>2]|0)-(f[w>>2]|0)>>2>>>0)/3|0)-(f[w+40>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;w=c+28|0;y=c+8|0;z=f[y>>2]|0;A=((f[z+100>>2]|0)-(f[z+96>>2]|0)|0)/12|0;b[e>>0]=0;Xg(w,A,e);A=f[t>>2]|0;z=(f[A+28>>2]|0)-(f[A+24>>2]|0)>>2;f[e>>2]=-1;Sf(c+52|0,z,e);z=c+40|0;A=f[z>>2]|0;B=c+44|0;C=f[B>>2]|0;if((C|0)!=(A|0))f[B>>2]=C+(~((C+-4-A|0)>>>2)<<2);A=f[t>>2]|0;C=(f[A+4>>2]|0)-(f[A>>2]|0)>>2;$j(z,C-((C>>>0)%3|0)|0);C=c+84|0;z=f[t>>2]|0;A=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2;b[e>>0]=0;Xg(C,A,e);A=c+96|0;z=f[A>>2]|0;B=c+100|0;D=f[B>>2]|0;if((D|0)!=(z|0))f[B>>2]=D+(~((D+-4-z|0)>>>2)<<2);f[c+164>>2]=-1;z=c+168|0;f[z>>2]=0;D=f[c+108>>2]|0;E=c+112|0;F=f[E>>2]|0;if((F|0)!=(D|0))f[E>>2]=F+(~(((F+-12-D|0)>>>0)/12|0)*12|0);D=c+132|0;if(f[D>>2]|0){F=c+128|0;E=f[F>>2]|0;if(E|0){G=E;do{E=G;G=f[G>>2]|0;br(E)}while((G|0)!=0)}f[F>>2]=0;F=f[c+124>>2]|0;if(F|0){G=c+120|0;E=0;do{f[(f[G>>2]|0)+(E<<2)>>2]=0;E=E+1|0}while((E|0)!=(F|0))}f[D>>2]=0}f[c+144>>2]=0;D=f[t>>2]|0;F=(f[D+28>>2]|0)-(f[D+24>>2]|0)>>2;f[e>>2]=-1;Sf(c+152|0,F,e);F=c+72|0;D=f[F>>2]|0;E=c+76|0;G=f[E>>2]|0;if((G|0)!=(D|0))f[E>>2]=G+(~((G+-4-D|0)>>>2)<<2);D=f[t>>2]|0;$j(F,((f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)/3|0);f[c+64>>2]=0;if(!(oe(c)|0)){D=dn(32)|0;f[e>>2]=D;f[e+8>>2]=-2147483616;f[e+4>>2]=29;H=D;I=13227;J=H+29|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[D+29>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}if(!(bh(c)|0)){D=dn(48)|0;f[e>>2]=D;f[e+8>>2]=-2147483600;f[e+4>>2]=36;H=D;I=13257;J=H+36|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[D+36>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}D=c+172|0;G=c+176|0;K=(((f[G>>2]|0)-(f[D>>2]|0)|0)/136|0)&255;b[i>>0]=K;L=f[(f[x>>2]|0)+44>>2]|0;M=L+16|0;N=f[M+4>>2]|0;if((N|0)>0|(N|0)==0&(f[M>>2]|0)>>>0>0)O=K;else{f[g>>2]=f[L+4>>2];f[e>>2]=f[g>>2];ye(L,e,i,i+1|0)|0;O=b[i>>0]|0}f[c+284>>2]=O&255;O=f[t>>2]|0;i=(f[O+4>>2]|0)-(f[O>>2]|0)|0;O=i>>2;Ti(v);f[j>>2]=0;L=j+4|0;f[L>>2]=0;f[j+8>>2]=0;a:do if((i|0)>0){K=c+104|0;M=j+8|0;N=0;b:while(1){P=(N>>>0)/3|0;Q=P>>>5;R=1<<(P&31);if((f[(f[w>>2]|0)+(Q<<2)>>2]&R|0)==0?(S=f[t>>2]|0,f[k>>2]=P,f[e>>2]=f[k>>2],!(Rj(S,e)|0)):0){f[g>>2]=0;f[l>>2]=P;f[e>>2]=f[l>>2];P=gg(c,e,g)|0;Vi(v,P);S=f[g>>2]|0;T=(S|0)==-1;do if(P){do if(T){U=-1;V=-1;W=-1}else{X=f[f[t>>2]>>2]|0;Y=f[X+(S<<2)>>2]|0;Z=S+1|0;_=((Z>>>0)%3|0|0)==0?S+-2|0:Z;if((_|0)==-1)$=-1;else $=f[X+(_<<2)>>2]|0;_=(((S>>>0)%3|0|0)==0?2:-1)+S|0;if((_|0)==-1){U=-1;V=$;W=Y;break}U=f[X+(_<<2)>>2]|0;V=$;W=Y}while(0);Y=f[C>>2]|0;_=Y+(W>>>5<<2)|0;f[_>>2]=f[_>>2]|1<<(W&31);_=Y+(V>>>5<<2)|0;f[_>>2]=f[_>>2]|1<<(V&31);_=Y+(U>>>5<<2)|0;f[_>>2]=f[_>>2]|1<<(U&31);f[e>>2]=1;_=f[B>>2]|0;if(_>>>0<(f[K>>2]|0)>>>0){f[_>>2]=1;f[B>>2]=_+4}else Ci(A,e);_=(f[w>>2]|0)+(Q<<2)|0;f[_>>2]=f[_>>2]|R;_=S+1|0;if(T)aa=-1;else aa=((_>>>0)%3|0|0)==0?S+-2|0:_;f[e>>2]=aa;Y=f[L>>2]|0;if(Y>>>0<(f[M>>2]|0)>>>0){f[Y>>2]=aa;f[L>>2]=Y+4}else Ci(j,e);if(T)break;Y=((_>>>0)%3|0|0)==0?S+-2|0:_;if((Y|0)==-1)break;_=f[(f[(f[t>>2]|0)+12>>2]|0)+(Y<<2)>>2]|0;Y=(_|0)==-1;X=Y?-1:(_>>>0)/3|0;if(Y)break;if(f[(f[w>>2]|0)+(X>>>5<<2)>>2]&1<<(X&31)|0)break;f[m>>2]=_;f[e>>2]=f[m>>2];if(!(Zb(c,e)|0)){ba=65;break b}}else{_=S+1|0;if(T)ca=-1;else ca=((_>>>0)%3|0|0)==0?S+-2|0:_;f[n>>2]=ca;f[e>>2]=f[n>>2];Ce(c,e,1)|0;f[o>>2]=f[g>>2];f[e>>2]=f[o>>2];if(!(Zb(c,e)|0)){ba=71;break b}}while(0)}N=N+1|0;if((N|0)>=(O|0)){ba=77;break a}}if((ba|0)==65){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;N=dn(48)|0;f[e>>2]=N;f[e+8>>2]=-2147483600;f[e+4>>2]=32;H=N;I=13294;J=H+32|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[N+32>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}else if((ba|0)==71){f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;M=dn(48)|0;f[e>>2]=M;f[e+8>>2]=-2147483600;f[e+4>>2]=32;H=M;I=13294;J=H+32|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[M+32>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0)}}else ba=77;while(0);do if((ba|0)==77){O=f[F>>2]|0;o=f[E>>2]|0;n=o;if((O|0)!=(o|0)?(ca=o+-4|0,O>>>0>>0):0){o=O;O=ca;do{ca=f[o>>2]|0;f[o>>2]=f[O>>2];f[O>>2]=ca;o=o+4|0;O=O+-4|0}while(o>>>0>>0)}f[p>>2]=n;f[q>>2]=f[j>>2];f[r>>2]=f[L>>2];f[h>>2]=f[p>>2];f[g>>2]=f[q>>2];f[e>>2]=f[r>>2];Md(F,h,g,e)|0;if((f[G>>2]|0)!=(f[D>>2]|0)?(O=f[y>>2]|0,o=((f[O+100>>2]|0)-(f[O+96>>2]|0)|0)/12|0,b[e>>0]=0,Xg(w,o,e),o=f[F>>2]|0,O=f[E>>2]|0,(o|0)!=(O|0)):0){M=o;do{f[s>>2]=f[M>>2];f[e>>2]=f[s>>2];ue(c,e)|0;M=M+4|0}while((M|0)!=(O|0))}$h(v);Nh(f[c+324>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;Nh(f[z>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;if(Jg(c)|0){O=f[(f[x>>2]|0)+44>>2]|0;M=f[c+232>>2]|0;n=O+16|0;o=f[n+4>>2]|0;if(!((o|0)>0|(o|0)==0&(f[n>>2]|0)>>>0>0)){n=(f[c+236>>2]|0)-M|0;f[g>>2]=f[O+4>>2];f[e>>2]=f[g>>2];ye(O,e,M,M+n|0)|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;break}else{f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;n=dn(32)|0;f[e>>2]=n;f[e+8>>2]=-2147483616;f[e+4>>2]=28;H=n;I=13327;J=H+28|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[n+28>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);break}}while(0);g=f[j>>2]|0;if(g|0){j=f[L>>2]|0;if((j|0)!=(g|0))f[L>>2]=j+(~((j+-4-g|0)>>>2)<<2);br(g)}u=d;return}g=dn(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=29;H=g;I=13197;J=H+29|0;do{b[H>>0]=b[I>>0]|0;H=H+1|0;I=I+1|0}while((H|0)<(J|0));b[g+29>>0]=0;f[a>>2]=-1;dj(a+4|0,e);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);u=d;return}function mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)mq(e);else{j=h<<2;k=dn(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;hj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+1164|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);br(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)mq(e);else{r=s<<2;o=dn(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;hj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+1176|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);br(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Jc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+1152|0;y=a+1084|0;h=a+1080|0;j=a+1072|0;m=a+1076|0;n=a+1068|0;A=b+8|0;B=c+8|0;C=a+1124|0;D=a+1120|0;E=a+1112|0;F=a+1116|0;G=a+1108|0;H=i+4|0;I=i+24|0;J=i+24|0;K=p+24|0;L=z;while(1){z=f[v>>2]|0;M=L+-1|0;N=M+z|0;O=f[t>>2]|0;P=f[O+(((N>>>0)/113|0)<<2)>>2]|0;Q=(N>>>0)%113|0;N=f[P+(Q*36|0)>>2]|0;R=f[P+(Q*36|0)+12>>2]|0;S=f[P+(Q*36|0)+24>>2]|0;T=f[P+(Q*36|0)+32>>2]|0;f[l>>2]=M;M=f[o>>2]|0;Q=M-O>>2;if((1-L-z+((Q|0)==0?0:(Q*113|0)+-1|0)|0)>>>0>225){br(f[M+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=N;f[c>>2]=R;M=f[k>>2]|0;Q=((f[g>>2]|0)+-1|0)==(S|0)?0:S+1|0;S=(f[s>>2]|0)+(T*12|0)|0;z=R-N|0;O=(f[a>>2]|0)-(f[(f[S>>2]|0)+(Q<<2)>>2]|0)|0;a:do if(O){if(z>>>0<3){P=f[w>>2]|0;f[P>>2]=Q;U=f[g>>2]|0;if(U>>>0>1){V=1;W=U;Y=Q;while(1){Y=(Y|0)==(W+-1|0)?0:Y+1|0;f[P+(V<<2)>>2]=Y;V=V+1|0;Z=f[g>>2]|0;if(V>>>0>=Z>>>0){$=Z;break}else W=Z}}else $=U;if(!z){aa=85;break}else{ba=0;ca=$}while(1){W=(f[I>>2]|0)+((X(f[H>>2]|0,N+ba|0)|0)<<2)|0;if(!ca)da=0;else{V=0;do{Y=f[(f[w>>2]|0)+(V<<2)>>2]|0;P=(f[a>>2]|0)-(f[(f[S>>2]|0)+(Y<<2)>>2]|0)|0;do if(P|0){Z=f[y>>2]|0;ea=32-Z|0;fa=32-P|0;ga=f[W+(Y<<2)>>2]<(ea|0)){ha=ga>>>fa;fa=P-ea|0;f[y>>2]=fa;ea=f[h>>2]|ha>>>fa;f[h>>2]=ea;fa=f[j>>2]|0;if((fa|0)==(f[m>>2]|0))Ci(n,h);else{f[fa>>2]=ea;f[j>>2]=fa+4}f[h>>2]=ha<<32-(f[y>>2]|0);break}ha=f[h>>2]|ga>>>Z;f[h>>2]=ha;ga=Z+P|0;f[y>>2]=ga;if((ga|0)!=32)break;ga=f[j>>2]|0;if((ga|0)==(f[m>>2]|0))Ci(n,h);else{f[ga>>2]=ha;f[j>>2]=ga+4}f[h>>2]=0;f[y>>2]=0}while(0);V=V+1|0;P=f[g>>2]|0}while(V>>>0

>>0);da=P}ba=ba+1|0;if(ba>>>0>=z>>>0){aa=85;break a}else ca=da}}U=T+1|0;qg(M+(U*12|0)|0,f[M+(T*12|0)>>2]|0,f[M+(T*12|0)+4>>2]|0);V=(f[(f[k>>2]|0)+(U*12|0)>>2]|0)+(Q<<2)|0;W=(f[V>>2]|0)+(1<>2]=W;V=f[A>>2]|0;P=f[B>>2]|0;b:do if((R|0)==(N|0))ia=N;else{Y=f[J>>2]|0;if(!V){if((f[Y+(Q<<2)>>2]|0)>>>0>>0){ia=R;break}else{ja=R;ka=N}while(1){ga=ja;do{ga=ga+-1|0;if((ka|0)==(ga|0)){ia=ka;break b}ha=(f[K>>2]|0)+((X(ga,P)|0)<<2)+(Q<<2)|0}while((f[ha>>2]|0)>>>0>=W>>>0);ka=ka+1|0;if((ka|0)==(ga|0)){ia=ga;break b}else ja=ga}}else{la=R;ma=N}while(1){ha=ma;while(1){na=Y+((X(ha,V)|0)<<2)|0;if((f[na+(Q<<2)>>2]|0)>>>0>=W>>>0){oa=la;break}Z=ha+1|0;if((Z|0)==(la|0)){ia=la;break b}else ha=Z}while(1){oa=oa+-1|0;if((ha|0)==(oa|0)){ia=ha;break b}pa=(f[K>>2]|0)+((X(oa,P)|0)<<2)|0;if((f[pa+(Q<<2)>>2]|0)>>>0>>0){qa=0;break}}do{ga=na+(qa<<2)|0;Z=pa+(qa<<2)|0;fa=f[ga>>2]|0;f[ga>>2]=f[Z>>2];f[Z>>2]=fa;qa=qa+1|0}while((qa|0)!=(V|0));ma=ha+1|0;if((ma|0)==(oa|0)){ia=oa;break}else la=oa}}while(0);W=(_(z|0)|0)^31;P=ia-N|0;Y=R-ia|0;fa=P>>>0>>0;if((P|0)!=(Y|0)){Z=f[C>>2]|0;if(fa)f[D>>2]=f[D>>2]|1<<31-Z;ga=Z+1|0;f[C>>2]=ga;if((ga|0)==32){ga=f[E>>2]|0;if((ga|0)==(f[F>>2]|0))Ci(G,D);else{f[ga>>2]=f[D>>2];f[E>>2]=ga+4}f[C>>2]=0;f[D>>2]=0}}ga=z>>>1;if(fa){fa=ga-P|0;if(W|0){Z=0;ea=1<>>1}}}else{ea=ga-Y|0;if(W|0){Z=0;fa=1<>>1}}}fa=f[s>>2]|0;W=f[fa+(T*12|0)>>2]|0;Z=W+(Q<<2)|0;f[Z>>2]=(f[Z>>2]|0)+1;qg(fa+(U*12|0)|0,W,f[fa+(T*12|0)+4>>2]|0);if((ia|0)!=(N|0)){fa=f[o>>2]|0;W=f[t>>2]|0;Z=fa-W>>2;ea=f[v>>2]|0;ga=f[l>>2]|0;if((((Z|0)==0?0:(Z*113|0)+-1|0)|0)==(ga+ea|0)){Jc(e);ra=f[v>>2]|0;sa=f[l>>2]|0;ta=f[o>>2]|0;ua=f[t>>2]|0}else{ra=ea;sa=ga;ta=fa;ua=W}W=sa+ra|0;if((ta|0)==(ua|0))va=0;else va=(f[ua+(((W>>>0)/113|0)<<2)>>2]|0)+(((W>>>0)%113|0)*36|0)|0;f[va>>2]=N;W=va+4|0;f[W>>2]=r;f[W+4>>2]=x;f[va+12>>2]=ia;f[va+16>>2]=i;f[va+20>>2]=V;f[va+24>>2]=Q;f[va+28>>2]=P;f[va+32>>2]=T;f[l>>2]=(f[l>>2]|0)+1}if((R|0)!=(ia|0)){W=f[o>>2]|0;fa=f[t>>2]|0;ga=W-fa>>2;ea=f[v>>2]|0;Z=f[l>>2]|0;if((((ga|0)==0?0:(ga*113|0)+-1|0)|0)==(Z+ea|0)){Jc(e);wa=f[v>>2]|0;xa=f[l>>2]|0;ya=f[o>>2]|0;za=f[t>>2]|0}else{wa=ea;xa=Z;ya=W;za=fa}fa=xa+wa|0;if((ya|0)==(za|0))Aa=0;else Aa=(f[za+(((fa>>>0)/113|0)<<2)>>2]|0)+(((fa>>>0)%113|0)*36|0)|0;f[Aa>>2]=ia;f[Aa+4>>2]=i;f[Aa+8>>2]=V;f[Aa+12>>2]=R;fa=Aa+16|0;f[fa>>2]=p;f[fa+4>>2]=q;f[Aa+24>>2]=Q;f[Aa+28>>2]=Y;f[Aa+32>>2]=U;fa=(f[l>>2]|0)+1|0;f[l>>2]=fa;Ba=fa}else aa=85}else aa=85;while(0);if((aa|0)==85){aa=0;Ba=f[l>>2]|0}if(!Ba)break;else L=Ba}}Ba=f[t>>2]|0;L=f[v>>2]|0;Aa=Ba+(((L>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ba;if((q|0)==(Ba|0)){Ca=0;Da=0}else{ia=(f[Aa>>2]|0)+(((L>>>0)%113|0)*36|0)|0;Ca=ia;Da=ia}ia=Aa;Aa=Da;c:while(1){Da=Aa;do{L=Da;if((Ca|0)==(L|0))break c;Da=L+36|0}while((Da-(f[ia>>2]|0)|0)!=4068);Da=ia+4|0;ia=Da;Aa=f[Da>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ba;do{br(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Ea=f[o>>2]|0;Fa=Ea-i>>2}while(Fa>>>0>2);Ga=Fa;Ha=i;Ia=Ea}else{Ga=l;Ha=Ba;Ia=q}switch(Ga|0){case 1:{Ja=56;aa=99;break}case 2:{Ja=113;aa=99;break}default:{}}if((aa|0)==99)f[v>>2]=Ja;if((Ha|0)!=(Ia|0)){Ja=Ha;do{br(f[Ja>>2]|0);Ja=Ja+4|0}while((Ja|0)!=(Ia|0));Ia=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Ia|0))f[o>>2]=t+(~((t+-4-Ia|0)>>>2)<<2)}Ia=f[e>>2]|0;if(!Ia){u=d;return}br(Ia);u=d;return}function nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)mq(e);else{j=h<<2;k=dn(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;hj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+140|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);br(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)mq(e);else{r=s<<2;o=dn(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;hj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+152|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);br(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Jc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+128|0;y=a+60|0;h=a+56|0;j=a+48|0;m=a+52|0;n=a+44|0;A=b+8|0;B=c+8|0;C=a+12|0;D=a+100|0;E=a+96|0;F=a+88|0;G=a+92|0;H=a+84|0;I=i+4|0;J=i+24|0;K=i+24|0;L=p+24|0;M=z;while(1){z=f[v>>2]|0;N=M+-1|0;O=N+z|0;P=f[t>>2]|0;Q=f[P+(((O>>>0)/113|0)<<2)>>2]|0;R=(O>>>0)%113|0;O=f[Q+(R*36|0)>>2]|0;S=f[Q+(R*36|0)+12>>2]|0;T=f[Q+(R*36|0)+24>>2]|0;U=f[Q+(R*36|0)+32>>2]|0;f[l>>2]=N;N=f[o>>2]|0;R=N-P>>2;if((1-M-z+((R|0)==0?0:(R*113|0)+-1|0)|0)>>>0>225){br(f[N+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=O;f[c>>2]=S;N=f[k>>2]|0;R=((f[g>>2]|0)+-1|0)==(T|0)?0:T+1|0;T=(f[s>>2]|0)+(U*12|0)|0;z=S-O|0;P=(f[a>>2]|0)-(f[(f[T>>2]|0)+(R<<2)>>2]|0)|0;a:do if(P){if(z>>>0<3){Q=f[w>>2]|0;f[Q>>2]=R;V=f[g>>2]|0;if(V>>>0>1){W=1;Y=V;Z=R;while(1){Z=(Z|0)==(Y+-1|0)?0:Z+1|0;f[Q+(W<<2)>>2]=Z;W=W+1|0;$=f[g>>2]|0;if(W>>>0>=$>>>0){aa=$;break}else Y=$}}else aa=V;if(!z){ba=81;break}else{ca=0;da=aa}while(1){Y=(f[J>>2]|0)+((X(f[I>>2]|0,O+ca|0)|0)<<2)|0;if(!da)ea=0;else{W=0;do{Z=f[(f[w>>2]|0)+(W<<2)>>2]|0;Q=(f[a>>2]|0)-(f[(f[T>>2]|0)+(Z<<2)>>2]|0)|0;do if(Q|0){$=f[y>>2]|0;fa=32-$|0;ga=32-Q|0;ha=f[Y+(Z<<2)>>2]<(fa|0)){ia=ha>>>ga;ga=Q-fa|0;f[y>>2]=ga;fa=f[h>>2]|ia>>>ga;f[h>>2]=fa;ga=f[j>>2]|0;if((ga|0)==(f[m>>2]|0))Ci(n,h);else{f[ga>>2]=fa;f[j>>2]=ga+4}f[h>>2]=ia<<32-(f[y>>2]|0);break}ia=f[h>>2]|ha>>>$;f[h>>2]=ia;ha=$+Q|0;f[y>>2]=ha;if((ha|0)!=32)break;ha=f[j>>2]|0;if((ha|0)==(f[m>>2]|0))Ci(n,h);else{f[ha>>2]=ia;f[j>>2]=ha+4}f[h>>2]=0;f[y>>2]=0}while(0);W=W+1|0;Q=f[g>>2]|0}while(W>>>0>>0);ea=Q}ca=ca+1|0;if(ca>>>0>=z>>>0){ba=81;break a}else da=ea}}V=U+1|0;qg(N+(V*12|0)|0,f[N+(U*12|0)>>2]|0,f[N+(U*12|0)+4>>2]|0);W=(f[(f[k>>2]|0)+(V*12|0)>>2]|0)+(R<<2)|0;Y=(f[W>>2]|0)+(1<>2]=Y;W=f[A>>2]|0;Q=f[B>>2]|0;b:do if((S|0)==(O|0))ja=O;else{Z=f[K>>2]|0;if(!W){if((f[Z+(R<<2)>>2]|0)>>>0>>0){ja=S;break}else{ka=S;la=O}while(1){ha=ka;do{ha=ha+-1|0;if((la|0)==(ha|0)){ja=la;break b}ia=(f[L>>2]|0)+((X(ha,Q)|0)<<2)+(R<<2)|0}while((f[ia>>2]|0)>>>0>=Y>>>0);la=la+1|0;if((la|0)==(ha|0)){ja=ha;break b}else ka=ha}}else{ma=S;na=O}while(1){ia=na;while(1){oa=Z+((X(ia,W)|0)<<2)|0;if((f[oa+(R<<2)>>2]|0)>>>0>=Y>>>0){pa=ma;break}$=ia+1|0;if(($|0)==(ma|0)){ja=ma;break b}else ia=$}while(1){pa=pa+-1|0;if((ia|0)==(pa|0)){ja=ia;break b}qa=(f[L>>2]|0)+((X(pa,Q)|0)<<2)|0;if((f[qa+(R<<2)>>2]|0)>>>0>>0){ra=0;break}}do{ha=oa+(ra<<2)|0;$=qa+(ra<<2)|0;ga=f[ha>>2]|0;f[ha>>2]=f[$>>2];f[$>>2]=ga;ra=ra+1|0}while((ra|0)!=(W|0));na=ia+1|0;if((na|0)==(pa|0)){ja=pa;break}else ma=pa}}while(0);Y=(_(z|0)|0)^31;Q=ja-O|0;Z=S-ja|0;ga=Q>>>0>>0;if((Q|0)!=(Z|0)){$=f[D>>2]|0;if(ga)f[E>>2]=f[E>>2]|1<<31-$;ha=$+1|0;f[D>>2]=ha;if((ha|0)==32){ha=f[F>>2]|0;if((ha|0)==(f[G>>2]|0))Ci(H,E);else{f[ha>>2]=f[E>>2];f[F>>2]=ha+4}f[D>>2]=0;f[E>>2]=0}}ha=z>>>1;if(ga)bg(C,Y,ha-Q|0);else bg(C,Y,ha-Z|0);ha=f[s>>2]|0;Y=f[ha+(U*12|0)>>2]|0;ga=Y+(R<<2)|0;f[ga>>2]=(f[ga>>2]|0)+1;qg(ha+(V*12|0)|0,Y,f[ha+(U*12|0)+4>>2]|0);if((ja|0)!=(O|0)){ha=f[o>>2]|0;Y=f[t>>2]|0;ga=ha-Y>>2;$=f[v>>2]|0;fa=f[l>>2]|0;if((((ga|0)==0?0:(ga*113|0)+-1|0)|0)==(fa+$|0)){Jc(e);sa=f[v>>2]|0;ta=f[l>>2]|0;ua=f[o>>2]|0;va=f[t>>2]|0}else{sa=$;ta=fa;ua=ha;va=Y}Y=ta+sa|0;if((ua|0)==(va|0))wa=0;else wa=(f[va+(((Y>>>0)/113|0)<<2)>>2]|0)+(((Y>>>0)%113|0)*36|0)|0;f[wa>>2]=O;Y=wa+4|0;f[Y>>2]=r;f[Y+4>>2]=x;f[wa+12>>2]=ja;f[wa+16>>2]=i;f[wa+20>>2]=W;f[wa+24>>2]=R;f[wa+28>>2]=Q;f[wa+32>>2]=U;f[l>>2]=(f[l>>2]|0)+1}if((S|0)!=(ja|0)){Q=f[o>>2]|0;Y=f[t>>2]|0;ha=Q-Y>>2;fa=f[v>>2]|0;$=f[l>>2]|0;if((((ha|0)==0?0:(ha*113|0)+-1|0)|0)==($+fa|0)){Jc(e);xa=f[v>>2]|0;ya=f[l>>2]|0;za=f[o>>2]|0;Aa=f[t>>2]|0}else{xa=fa;ya=$;za=Q;Aa=Y}Y=ya+xa|0;if((za|0)==(Aa|0))Ba=0;else Ba=(f[Aa+(((Y>>>0)/113|0)<<2)>>2]|0)+(((Y>>>0)%113|0)*36|0)|0;f[Ba>>2]=ja;f[Ba+4>>2]=i;f[Ba+8>>2]=W;f[Ba+12>>2]=S;Y=Ba+16|0;f[Y>>2]=p;f[Y+4>>2]=q;f[Ba+24>>2]=R;f[Ba+28>>2]=Z;f[Ba+32>>2]=V;Z=(f[l>>2]|0)+1|0;f[l>>2]=Z;Ca=Z}else ba=81}else ba=81;while(0);if((ba|0)==81){ba=0;Ca=f[l>>2]|0}if(!Ca)break;else M=Ca}}Ca=f[t>>2]|0;M=f[v>>2]|0;Ba=Ca+(((M>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ca;if((q|0)==(Ca|0)){Da=0;Ea=0}else{ja=(f[Ba>>2]|0)+(((M>>>0)%113|0)*36|0)|0;Da=ja;Ea=ja}ja=Ba;Ba=Ea;c:while(1){Ea=Ba;do{M=Ea;if((Da|0)==(M|0))break c;Ea=M+36|0}while((Ea-(f[ja>>2]|0)|0)!=4068);Ea=ja+4|0;ja=Ea;Ba=f[Ea>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ca;do{br(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Fa=f[o>>2]|0;Ga=Fa-i>>2}while(Ga>>>0>2);Ha=Ga;Ia=i;Ja=Fa}else{Ha=l;Ia=Ca;Ja=q}switch(Ha|0){case 1:{Ka=56;ba=95;break}case 2:{Ka=113;ba=95;break}default:{}}if((ba|0)==95)f[v>>2]=Ka;if((Ia|0)!=(Ja|0)){Ka=Ia;do{br(f[Ka>>2]|0);Ka=Ka+4|0}while((Ka|0)!=(Ja|0));Ja=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Ja|0))f[o>>2]=t+(~((t+-4-Ja|0)>>>2)<<2)}Ja=f[e>>2]|0;if(!Ja){u=d;return}br(Ja);u=d;return}function ob(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0.0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0.0,kb=0.0,lb=0.0,mb=0.0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0.0,sb=0.0,tb=0;i=u;u=u+512|0;j=i;k=d+c|0;l=0-k|0;m=a+4|0;n=a+100|0;o=b;b=0;a:while(1){switch(o|0){case 46:{p=6;break a;break}case 48:break;default:{q=0;r=o;s=b;t=0;v=0;break a}}w=f[m>>2]|0;if(w>>>0<(f[n>>2]|0)>>>0){f[m>>2]=w+1;o=h[w>>0]|0;b=1;continue}else{o=Di(a)|0;b=1;continue}}if((p|0)==6){o=f[m>>2]|0;if(o>>>0<(f[n>>2]|0)>>>0){f[m>>2]=o+1;x=h[o>>0]|0}else x=Di(a)|0;if((x|0)==48){o=0;w=0;while(1){y=Tn(o|0,w|0,-1,-1)|0;z=I;A=f[m>>2]|0;if(A>>>0<(f[n>>2]|0)>>>0){f[m>>2]=A+1;B=h[A>>0]|0}else B=Di(a)|0;if((B|0)==48){o=y;w=z}else{q=1;r=B;s=1;t=y;v=z;break}}}else{q=1;r=x;s=b;t=0;v=0}}f[j>>2]=0;b=r+-48|0;x=(r|0)==46;b:do if(x|b>>>0<10){B=j+496|0;w=0;o=0;z=0;y=q;A=s;C=r;D=x;E=b;F=t;G=v;H=0;J=0;c:while(1){do if(D)if(!y){L=w;M=o;N=1;O=z;P=A;Q=H;R=J;S=H;T=J}else break c;else{U=Tn(H|0,J|0,1,0)|0;V=I;W=(C|0)!=48;if((o|0)>=125){if(!W){L=w;M=o;N=y;O=z;P=A;Q=F;R=G;S=U;T=V;break}f[B>>2]=f[B>>2]|1;L=w;M=o;N=y;O=z;P=A;Q=F;R=G;S=U;T=V;break}Y=j+(o<<2)|0;if(!w)Z=E;else Z=C+-48+((f[Y>>2]|0)*10|0)|0;f[Y>>2]=Z;Y=w+1|0;_=(Y|0)==9;L=_?0:Y;M=o+(_&1)|0;N=y;O=W?U:z;P=1;Q=F;R=G;S=U;T=V}while(0);V=f[m>>2]|0;if(V>>>0<(f[n>>2]|0)>>>0){f[m>>2]=V+1;$=h[V>>0]|0}else $=Di(a)|0;E=$+-48|0;D=($|0)==46;if(!(D|E>>>0<10)){aa=L;ba=M;ca=O;da=N;ea=$;fa=P;ga=S;ha=Q;ia=T;ja=R;p=29;break b}else{w=L;o=M;z=O;y=N;A=P;C=$;F=Q;G=R;H=S;J=T}}ka=w;la=o;ma=z;na=H;oa=J;pa=F;qa=G;ra=(A|0)!=0;p=37}else{aa=0;ba=0;ca=0;da=q;ea=r;fa=s;ga=0;ha=t;ia=0;ja=v;p=29}while(0);do if((p|0)==29){v=(da|0)==0;t=v?ga:ha;s=v?ia:ja;v=(fa|0)!=0;if(!(v&(ea|32|0)==101))if((ea|0)>-1){ka=aa;la=ba;ma=ca;na=ga;oa=ia;pa=t;qa=s;ra=v;p=37;break}else{sa=aa;ta=ba;ua=ca;va=ga;wa=ia;xa=v;ya=t;za=s;p=39;break}v=De(a,g)|0;r=I;if((v|0)==0&(r|0)==-2147483648){if(!g){Rm(a,0);Aa=0.0;break}if(!(f[n>>2]|0)){Ba=0;Ca=0}else{f[m>>2]=(f[m>>2]|0)+-1;Ba=0;Ca=0}}else{Ba=v;Ca=r}r=Tn(Ba|0,Ca|0,t|0,s|0)|0;Da=aa;Ea=ba;Fa=ca;Ga=r;Ha=ga;Ia=I;Ja=ia;p=41}while(0);if((p|0)==37)if(f[n>>2]|0){f[m>>2]=(f[m>>2]|0)+-1;if(ra){Da=ka;Ea=la;Fa=ma;Ga=pa;Ha=na;Ia=qa;Ja=oa;p=41}else p=40}else{sa=ka;ta=la;ua=ma;va=na;wa=oa;xa=ra;ya=pa;za=qa;p=39}if((p|0)==39)if(xa){Da=sa;Ea=ta;Fa=ua;Ga=ya;Ha=va;Ia=za;Ja=wa;p=41}else p=40;do if((p|0)==40){wa=ir()|0;f[wa>>2]=22;Rm(a,0);Aa=0.0}else if((p|0)==41){wa=f[j>>2]|0;if(!wa){Aa=+(e|0)*0.0;break}if(((Ja|0)<0|(Ja|0)==0&Ha>>>0<10)&((Ga|0)==(Ha|0)&(Ia|0)==(Ja|0))?(c|0)>30|(wa>>>c|0)==0:0){Aa=+(e|0)*+(wa>>>0);break}wa=(d|0)/-2|0;za=((wa|0)<0)<<31>>31;if((Ia|0)>(za|0)|(Ia|0)==(za|0)&Ga>>>0>wa>>>0){wa=ir()|0;f[wa>>2]=34;Aa=+(e|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}wa=d+-106|0;za=((wa|0)<0)<<31>>31;if((Ia|0)<(za|0)|(Ia|0)==(za|0)&Ga>>>0>>0){wa=ir()|0;f[wa>>2]=34;Aa=+(e|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if(!Da)Ka=Ea;else{if((Da|0)<9){wa=j+(Ea<<2)|0;za=Da;va=f[wa>>2]|0;while(1){va=va*10|0;if((za|0)>=8)break;else za=za+1|0}f[wa>>2]=va}Ka=Ea+1|0}if((Fa|0)<9?(Fa|0)<=(Ga|0)&(Ga|0)<18:0){if((Ga|0)==9){Aa=+(e|0)*+((f[j>>2]|0)>>>0);break}if((Ga|0)<9){Aa=+(e|0)*+((f[j>>2]|0)>>>0)/+(f[6408+(8-Ga<<2)>>2]|0);break}za=c+27+(X(Ga,-3)|0)|0;A=f[j>>2]|0;if((za|0)>30|(A>>>za|0)==0){Aa=+(e|0)*+(A>>>0)*+(f[6408+(Ga+-10<<2)>>2]|0);break}}A=(Ga|0)%9|0;if(!A){La=0;Ma=Ka;Na=0;Oa=Ga}else{za=(Ga|0)>-1?A:A+9|0;A=f[6408+(8-za<<2)>>2]|0;if(Ka){G=1e9/(A|0)|0;F=0;J=0;H=Ga;z=0;do{o=j+(z<<2)|0;w=f[o>>2]|0;ya=((w>>>0)/(A>>>0)|0)+F|0;f[o>>2]=ya;F=X(G,(w>>>0)%(A>>>0)|0)|0;w=(z|0)==(J|0)&(ya|0)==0;H=w?H+-9|0:H;J=w?J+1&127:J;z=z+1|0}while((z|0)!=(Ka|0));if(!F){Pa=J;Qa=Ka;Ra=H}else{f[j+(Ka<<2)>>2]=F;Pa=J;Qa=Ka+1|0;Ra=H}}else{Pa=0;Qa=0;Ra=Ga}La=0;Ma=Qa;Na=Pa;Oa=9-za+Ra|0}d:while(1){z=(Oa|0)<18;A=(Oa|0)==18;G=j+(Na<<2)|0;va=La;wa=Ma;while(1){if(!z){if(!A){Sa=va;Ta=Na;Ua=Oa;Va=wa;break d}if((f[G>>2]|0)>>>0>=9007199){Sa=va;Ta=Na;Ua=18;Va=wa;break d}}w=0;Wa=wa;ya=wa+127|0;while(1){o=ya&127;ua=j+(o<<2)|0;ta=Rn(f[ua>>2]|0,0,29)|0;sa=Tn(ta|0,I|0,w|0,0)|0;ta=I;if(ta>>>0>0|(ta|0)==0&sa>>>0>1e9){xa=up(sa|0,ta|0,1e9,0)|0;qa=an(sa|0,ta|0,1e9,0)|0;Xa=xa;Ya=qa}else{Xa=0;Ya=sa}f[ua>>2]=Ya;ua=(o|0)==(Na|0);Wa=(Ya|0)==0&(((o|0)!=(Wa+127&127|0)|ua)^1)?o:Wa;if(ua)break;else{w=Xa;ya=o+-1|0}}va=va+-29|0;if(Xa|0)break;else wa=Wa}wa=Na+127&127;G=Wa+127&127;A=j+((Wa+126&127)<<2)|0;if((wa|0)==(Wa|0)){f[A>>2]=f[A>>2]|f[j+(G<<2)>>2];Za=G}else Za=Wa;f[j+(wa<<2)>>2]=Xa;La=va;Ma=Za;Na=wa;Oa=Oa+9|0}e:while(1){za=Va+1&127;H=j+((Va+127&127)<<2)|0;J=Sa;F=Ta;wa=Ua;while(1){G=(wa|0)==18;A=(wa|0)>27?9:1;_a=J;$a=F;while(1){z=0;while(1){ya=z+$a&127;if((ya|0)==(Va|0)){ab=2;p=88;break}w=f[j+(ya<<2)>>2]|0;ya=f[6440+(z<<2)>>2]|0;if(w>>>0>>0){ab=2;p=88;break}if(w>>>0>ya>>>0)break;ya=z+1|0;if((z|0)<1)z=ya;else{ab=ya;p=88;break}}if((p|0)==88?(p=0,G&(ab|0)==2):0){bb=0.0;cb=0;db=Va;break e}eb=A+_a|0;if(($a|0)==(Va|0)){_a=eb;$a=Va}else break}G=(1<>>A;fb=0;gb=$a;hb=wa;ya=$a;do{w=j+(ya<<2)|0;o=f[w>>2]|0;ua=(o>>>A)+fb|0;f[w>>2]=ua;fb=X(o&G,z)|0;o=(ya|0)==(gb|0)&(ua|0)==0;hb=o?hb+-9|0:hb;gb=o?gb+1&127:gb;ya=ya+1&127}while((ya|0)!=(Va|0));if(!fb){J=eb;F=gb;wa=hb;continue}if((za|0)!=(gb|0))break;f[H>>2]=f[H>>2]|1;J=eb;F=gb;wa=hb}f[j+(Va<<2)>>2]=fb;Sa=eb;Ta=gb;Ua=hb;Va=za}while(1){wa=cb+$a&127;F=db+1&127;if((wa|0)==(db|0)){f[j+(F+-1<<2)>>2]=0;ib=F}else ib=db;bb=bb*1.0e9+ +((f[j+(wa<<2)>>2]|0)>>>0);cb=cb+1|0;if((cb|0)==2)break;else db=ib}jb=+(e|0);kb=bb*jb;wa=_a+53|0;F=wa-d|0;J=(F|0)<(c|0);H=J?((F|0)>0?F:0):c;if((H|0)<53){lb=+Gq(+Wj(1.0,105-H|0),kb);mb=+Sq(kb,+Wj(1.0,53-H|0));nb=lb;ob=mb;pb=lb+(kb-mb)}else{nb=0.0;ob=0.0;pb=kb}va=$a+2&127;if((va|0)!=(ib|0)){ya=f[j+(va<<2)>>2]|0;do if(ya>>>0>=5e8){if((ya|0)!=5e8){qb=jb*.75+ob;break}if(($a+3&127|0)==(ib|0)){qb=jb*.5+ob;break}else{qb=jb*.75+ob;break}}else{if((ya|0)==0?($a+3&127|0)==(ib|0):0){qb=ob;break}qb=jb*.25+ob}while(0);if((53-H|0)>1?!(+Sq(qb,1.0)!=0.0):0)rb=qb+1.0;else rb=qb}else rb=ob;jb=pb+rb-nb;do if((wa&2147483647|0)>(-2-k|0)){ya=!(+K(+jb)>=9007199254740992.0);va=_a+((ya^1)&1)|0;kb=ya?jb:jb*.5;if((va+50|0)<=(l|0)?!(rb!=0.0&(J&((H|0)!=(F|0)|ya))):0){sb=kb;tb=va;break}ya=ir()|0;f[ya>>2]=34;sb=kb;tb=va}else{sb=jb;tb=_a}while(0);Aa=+Hq(sb,tb)}while(0);u=i;return +Aa}function pb(a,c,d,e,g,i){a=a|0;c=+c;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0,F=0,G=0,H=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0.0,ga=0.0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0;j=u;u=u+560|0;k=j+8|0;l=j;m=j+524|0;n=m;o=j+512|0;f[l>>2]=0;p=o+12|0;xo(c)|0;if((I|0)<0){q=-c;r=1;s=15511}else{q=c;r=(g&2049|0)!=0&1;s=(g&2048|0)==0?((g&1|0)==0?15512:15517):15514}xo(q)|0;do if(0==0&(I&2146435072|0)==2146435072){t=(i&32|0)!=0;v=r+3|0;Hk(a,32,d,v,g&-65537);ep(a,s,r);ep(a,q!=q|0.0!=0.0?(t?17461:15538):t?15530:15534,3);Hk(a,32,d,v,g^8192);w=v}else{c=+Iq(q,l)*2.0;v=c!=0.0;if(v)f[l>>2]=(f[l>>2]|0)+-1;t=i|32;if((t|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-e|0;do if(!(e>>>0>11|(A|0)==0)){B=8.0;C=A;do{C=C+-1|0;B=B*16.0}while((C|0)!=0);if((b[y>>0]|0)==45){D=-(B+(-c-B));break}else{D=c+B-B;break}}else D=c;while(0);A=f[l>>2]|0;C=(A|0)<0?0-A|0:A;E=Jj(C,((C|0)<0)<<31>>31,p)|0;if((E|0)==(p|0)){C=o+11|0;b[C>>0]=48;F=C}else F=E;b[F+-1>>0]=(A>>31&2)+43;A=F+-2|0;b[A>>0]=i+15;E=(e|0)<1;C=(g&8|0)==0;G=m;H=D;while(1){J=~~H;K=G+1|0;b[G>>0]=x|h[15542+J>>0];H=(H-+(J|0))*16.0;if((K-n|0)==1?!(C&(E&H==0.0)):0){b[K>>0]=46;L=G+2|0}else L=K;if(!(H!=0.0))break;else G=L}G=L;if((e|0)!=0?(-2-n+G|0)<(e|0):0){M=G-n|0;N=e+2|0}else{E=G-n|0;M=E;N=E}E=p-A|0;G=E+z+N|0;Hk(a,32,d,G,g);ep(a,y,z);Hk(a,48,d,G,g^65536);ep(a,m,M);Hk(a,48,N-M|0,0,0);ep(a,A,E);Hk(a,32,d,G,g^8192);w=G;break}G=(e|0)<0?6:e;if(v){E=(f[l>>2]|0)+-28|0;f[l>>2]=E;O=c*268435456.0;P=E}else{O=c;P=f[l>>2]|0}E=(P|0)<0?k:k+288|0;C=E;H=O;do{x=~~H>>>0;f[C>>2]=x;C=C+4|0;H=(H-+(x>>>0))*1.0e9}while(H!=0.0);if((P|0)>0){v=E;A=C;z=P;while(1){y=(z|0)<29?z:29;x=A+-4|0;if(x>>>0>=v>>>0){K=x;x=0;do{J=Rn(f[K>>2]|0,0,y|0)|0;Q=Tn(J|0,I|0,x|0,0)|0;J=I;R=an(Q|0,J|0,1e9,0)|0;f[K>>2]=R;x=up(Q|0,J|0,1e9,0)|0;K=K+-4|0}while(K>>>0>=v>>>0);if(x){K=v+-4|0;f[K>>2]=x;S=K}else S=v}else S=v;K=A;while(1){if(K>>>0<=S>>>0)break;J=K+-4|0;if(!(f[J>>2]|0))K=J;else break}x=(f[l>>2]|0)-y|0;f[l>>2]=x;if((x|0)>0){v=S;A=K;z=x}else{T=S;U=K;V=x;break}}}else{T=E;U=C;V=P}if((V|0)<0){z=((G+25|0)/9|0)+1|0;A=(t|0)==102;v=T;x=U;J=V;while(1){Q=0-J|0;R=(Q|0)<9?Q:9;if(v>>>0>>0){Q=(1<>>R;Y=0;Z=v;do{_=f[Z>>2]|0;f[Z>>2]=(_>>>R)+Y;Y=X(_&Q,W)|0;Z=Z+4|0}while(Z>>>0>>0);Z=(f[v>>2]|0)==0?v+4|0:v;if(!Y){$=Z;aa=x}else{f[x>>2]=Y;$=Z;aa=x+4|0}}else{$=(f[v>>2]|0)==0?v+4|0:v;aa=x}Z=A?E:$;W=(aa-Z>>2|0)>(z|0)?Z+(z<<2)|0:aa;J=(f[l>>2]|0)+R|0;f[l>>2]=J;if((J|0)>=0){ba=$;ca=W;break}else{v=$;x=W}}}else{ba=T;ca=U}x=E;if(ba>>>0>>0){v=(x-ba>>2)*9|0;J=f[ba>>2]|0;if(J>>>0<10)da=v;else{z=v;v=10;while(1){v=v*10|0;A=z+1|0;if(J>>>0>>0){da=A;break}else z=A}}}else da=0;z=(t|0)==103;v=(G|0)!=0;J=G-((t|0)!=102?da:0)+((v&z)<<31>>31)|0;if((J|0)<(((ca-x>>2)*9|0)+-9|0)){A=J+9216|0;J=E+4+(((A|0)/9|0)+-1024<<2)|0;C=(A|0)%9|0;if((C|0)<8){A=C;C=10;while(1){W=C*10|0;if((A|0)<7){A=A+1|0;C=W}else{ea=W;break}}}else ea=10;C=f[J>>2]|0;A=(C>>>0)%(ea>>>0)|0;t=(J+4|0)==(ca|0);if(!(t&(A|0)==0)){B=(((C>>>0)/(ea>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;W=(ea|0)/2|0;H=A>>>0>>0?.5:t&(A|0)==(W|0)?1.0:1.5;if(!r){fa=H;ga=B}else{W=(b[s>>0]|0)==45;fa=W?-H:H;ga=W?-B:B}W=C-A|0;f[J>>2]=W;if(ga+fa!=ga){A=W+ea|0;f[J>>2]=A;if(A>>>0>999999999){A=ba;W=J;while(1){C=W+-4|0;f[W>>2]=0;if(C>>>0>>0){t=A+-4|0;f[t>>2]=0;ha=t}else ha=A;t=(f[C>>2]|0)+1|0;f[C>>2]=t;if(t>>>0>999999999){A=ha;W=C}else{ia=ha;ja=C;break}}}else{ia=ba;ja=J}W=(x-ia>>2)*9|0;A=f[ia>>2]|0;if(A>>>0<10){ka=ja;la=W;ma=ia}else{C=W;W=10;while(1){W=W*10|0;t=C+1|0;if(A>>>0>>0){ka=ja;la=t;ma=ia;break}else C=t}}}else{ka=J;la=da;ma=ba}}else{ka=J;la=da;ma=ba}C=ka+4|0;na=la;oa=ca>>>0>C>>>0?C:ca;pa=ma}else{na=da;oa=ca;pa=ba}C=oa;while(1){if(C>>>0<=pa>>>0){qa=0;break}W=C+-4|0;if(!(f[W>>2]|0))C=W;else{qa=1;break}}J=0-na|0;do if(z){W=G+((v^1)&1)|0;if((W|0)>(na|0)&(na|0)>-5){ra=i+-1|0;sa=W+-1-na|0}else{ra=i+-2|0;sa=W+-1|0}W=g&8;if(!W){if(qa?(A=f[C+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){t=0;Z=10;while(1){Z=Z*10|0;Q=t+1|0;if((A>>>0)%(Z>>>0)|0|0){ta=Q;break}else t=Q}}else ta=0;else ta=9;t=((C-x>>2)*9|0)+-9|0;if((ra|32|0)==102){Z=t-ta|0;A=(Z|0)>0?Z:0;ua=ra;va=(sa|0)<(A|0)?sa:A;wa=0;break}else{A=t+na-ta|0;t=(A|0)>0?A:0;ua=ra;va=(sa|0)<(t|0)?sa:t;wa=0;break}}else{ua=ra;va=sa;wa=W}}else{ua=i;va=G;wa=g&8}while(0);G=va|wa;x=(G|0)!=0&1;v=(ua|32|0)==102;if(v){xa=0;ya=(na|0)>0?na:0}else{z=(na|0)<0?J:na;t=Jj(z,((z|0)<0)<<31>>31,p)|0;z=p;if((z-t|0)<2){A=t;while(1){Z=A+-1|0;b[Z>>0]=48;if((z-Z|0)<2)A=Z;else{za=Z;break}}}else za=t;b[za+-1>>0]=(na>>31&2)+43;A=za+-2|0;b[A>>0]=ua;xa=A;ya=z-A|0}A=r+1+va+x+ya|0;Hk(a,32,d,A,g);ep(a,s,r);Hk(a,48,d,A,g^65536);if(v){J=pa>>>0>E>>>0?E:pa;Z=m+9|0;R=Z;Y=m+8|0;Q=J;do{K=Jj(f[Q>>2]|0,0,Z)|0;if((Q|0)==(J|0))if((K|0)==(Z|0)){b[Y>>0]=48;Aa=Y}else Aa=K;else if(K>>>0>m>>>0){hj(m|0,48,K-n|0)|0;y=K;while(1){_=y+-1|0;if(_>>>0>m>>>0)y=_;else{Aa=_;break}}}else Aa=K;ep(a,Aa,R-Aa|0);Q=Q+4|0}while(Q>>>0<=E>>>0);if(G|0)ep(a,15558,1);if(Q>>>0>>0&(va|0)>0){E=va;R=Q;while(1){Y=Jj(f[R>>2]|0,0,Z)|0;if(Y>>>0>m>>>0){hj(m|0,48,Y-n|0)|0;J=Y;while(1){v=J+-1|0;if(v>>>0>m>>>0)J=v;else{Ba=v;break}}}else Ba=Y;ep(a,Ba,(E|0)<9?E:9);R=R+4|0;J=E+-9|0;if(!(R>>>0>>0&(E|0)>9)){Ca=J;break}else E=J}}else Ca=va;Hk(a,48,Ca+9|0,9,0)}else{E=qa?C:pa+4|0;if((va|0)>-1){R=m+9|0;Z=(wa|0)==0;Q=R;G=0-n|0;J=m+8|0;K=va;v=pa;while(1){x=Jj(f[v>>2]|0,0,R)|0;if((x|0)==(R|0)){b[J>>0]=48;Da=J}else Da=x;do if((v|0)==(pa|0)){x=Da+1|0;ep(a,Da,1);if(Z&(K|0)<1){Ea=x;break}ep(a,15558,1);Ea=x}else{if(Da>>>0<=m>>>0){Ea=Da;break}hj(m|0,48,Da+G|0)|0;x=Da;while(1){z=x+-1|0;if(z>>>0>m>>>0)x=z;else{Ea=z;break}}}while(0);Y=Q-Ea|0;ep(a,Ea,(K|0)>(Y|0)?Y:K);x=K-Y|0;v=v+4|0;if(!(v>>>0>>0&(x|0)>-1)){Fa=x;break}else K=x}}else Fa=va;Hk(a,48,Fa+18|0,18,0);ep(a,xa,p-xa|0)}Hk(a,32,d,A,g^8192);w=A}while(0);u=j;return ((w|0)<(d|0)?d:w)|0}function qb(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;i=u;u=u+64|0;j=i+16|0;k=i;l=i+24|0;m=i+8|0;n=i+20|0;f[j>>2]=c;c=(a|0)!=0;o=l+40|0;q=o;r=l+39|0;l=m+4|0;s=0;t=0;v=0;a:while(1){do if((t|0)>-1)if((s|0)>(2147483647-t|0)){w=ir()|0;f[w>>2]=75;x=-1;break}else{x=s+t|0;break}else x=t;while(0);w=f[j>>2]|0;y=b[w>>0]|0;if(!(y<<24>>24)){z=88;break}else{A=y;B=w}b:while(1){switch(A<<24>>24){case 37:{C=B;D=B;z=9;break b;break}case 0:{E=B;break b;break}default:{}}y=B+1|0;f[j>>2]=y;A=b[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((b[D+1>>0]|0)!=37){E=C;break c}y=C+1|0;D=D+2|0;f[j>>2]=D;if((b[D>>0]|0)!=37){E=y;break}else{C=y;z=9}}while(0);y=E-w|0;if(c)ep(a,w,y);if(y|0){s=y;t=x;continue}y=(Pq(b[(f[j>>2]|0)+1>>0]|0)|0)==0;F=f[j>>2]|0;if(!y?(b[F+2>>0]|0)==36:0){G=(b[F+1>>0]|0)+-48|0;H=1;J=3}else{G=-1;H=v;J=1}y=F+J|0;f[j>>2]=y;F=b[y>>0]|0;K=(F<<24>>24)+-32|0;if(K>>>0>31|(1<>24)+-32|K;P=F+1|0;f[j>>2]=P;Q=b[P>>0]|0;R=(Q<<24>>24)+-32|0;if(R>>>0>31|(1<>24==42){if((Pq(b[N+1>>0]|0)|0)!=0?(F=f[j>>2]|0,(b[F+2>>0]|0)==36):0){O=F+1|0;f[h+((b[O>>0]|0)+-48<<2)>>2]=10;S=f[g+((b[O>>0]|0)+-48<<3)>>2]|0;T=1;U=F+3|0}else{if(H|0){V=-1;break}if(c){F=(f[e>>2]|0)+(4-1)&~(4-1);O=f[F>>2]|0;f[e>>2]=F+4;W=O}else W=0;S=W;T=0;U=(f[j>>2]|0)+1|0}f[j>>2]=U;O=(S|0)<0;X=O?0-S|0:S;Y=O?L|8192:L;Z=T;_=U}else{O=Cl(j)|0;if((O|0)<0){V=-1;break}X=O;Y=L;Z=H;_=f[j>>2]|0}do if((b[_>>0]|0)==46){if((b[_+1>>0]|0)!=42){f[j>>2]=_+1;O=Cl(j)|0;$=O;aa=f[j>>2]|0;break}if(Pq(b[_+2>>0]|0)|0?(O=f[j>>2]|0,(b[O+3>>0]|0)==36):0){F=O+2|0;f[h+((b[F>>0]|0)+-48<<2)>>2]=10;K=f[g+((b[F>>0]|0)+-48<<3)>>2]|0;F=O+4|0;f[j>>2]=F;$=K;aa=F;break}if(Z|0){V=-1;break a}if(c){F=(f[e>>2]|0)+(4-1)&~(4-1);K=f[F>>2]|0;f[e>>2]=F+4;ba=K}else ba=0;K=(f[j>>2]|0)+2|0;f[j>>2]=K;$=ba;aa=K}else{$=-1;aa=_}while(0);K=0;F=aa;while(1){if(((b[F>>0]|0)+-65|0)>>>0>57){V=-1;break a}O=F;F=F+1|0;f[j>>2]=F;ca=b[(b[O>>0]|0)+-65+(15030+(K*58|0))>>0]|0;da=ca&255;if((da+-1|0)>>>0>=8)break;else K=da}if(!(ca<<24>>24)){V=-1;break}O=(G|0)>-1;do if(ca<<24>>24==19)if(O){V=-1;break a}else z=50;else{if(O){f[h+(G<<2)>>2]=da;P=g+(G<<3)|0;Q=f[P+4>>2]|0;y=k;f[y>>2]=f[P>>2];f[y+4>>2]=Q;z=50;break}if(!c){V=0;break a}Ie(k,da,e);ea=f[j>>2]|0}while(0);if((z|0)==50){z=0;if(c)ea=F;else{s=0;t=x;v=Z;continue}}O=b[ea+-1>>0]|0;Q=(K|0)!=0&(O&15|0)==3?O&-33:O;O=Y&-65537;y=(Y&8192|0)==0?Y:O;d:do switch(Q|0){case 110:{switch((K&255)<<24>>24){case 0:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 1:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 2:{P=f[k>>2]|0;f[P>>2]=x;f[P+4>>2]=((x|0)<0)<<31>>31;s=0;t=x;v=Z;continue a;break}case 3:{d[f[k>>2]>>1]=x;s=0;t=x;v=Z;continue a;break}case 4:{b[f[k>>2]>>0]=x;s=0;t=x;v=Z;continue a;break}case 6:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 7:{P=f[k>>2]|0;f[P>>2]=x;f[P+4>>2]=((x|0)<0)<<31>>31;s=0;t=x;v=Z;continue a;break}default:{s=0;t=x;v=Z;continue a}}break}case 112:{fa=120;ga=$>>>0>8?$:8;ha=y|8;z=62;break}case 88:case 120:{fa=Q;ga=$;ha=y;z=62;break}case 111:{P=k;R=f[P>>2]|0;ia=f[P+4>>2]|0;P=Gl(R,ia,o)|0;ja=q-P|0;ka=P;la=0;ma=15494;na=(y&8|0)==0|($|0)>(ja|0)?$:ja+1|0;oa=y;pa=R;qa=ia;z=68;break}case 105:case 100:{ia=k;R=f[ia>>2]|0;ja=f[ia+4>>2]|0;if((ja|0)<0){ia=Vn(0,0,R|0,ja|0)|0;P=I;ra=k;f[ra>>2]=ia;f[ra+4>>2]=P;sa=1;ta=15494;ua=ia;va=P;z=67;break d}else{sa=(y&2049|0)!=0&1;ta=(y&2048|0)==0?((y&1|0)==0?15494:15496):15495;ua=R;va=ja;z=67;break d}break}case 117:{ja=k;sa=0;ta=15494;ua=f[ja>>2]|0;va=f[ja+4>>2]|0;z=67;break}case 99:{b[r>>0]=f[k>>2];wa=r;xa=0;ya=15494;za=o;Aa=1;Ba=O;break}case 109:{ja=ir()|0;Ca=kp(f[ja>>2]|0)|0;z=72;break}case 115:{ja=f[k>>2]|0;Ca=ja|0?ja:15504;z=72;break}case 67:{f[m>>2]=f[k>>2];f[l>>2]=0;f[k>>2]=m;Da=-1;Ea=m;z=76;break}case 83:{ja=f[k>>2]|0;if(!$){Hk(a,32,X,0,y);Fa=0;z=85}else{Da=$;Ea=ja;z=76}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{s=pb(a,+p[k>>3],X,$,y,Q)|0;t=x;v=Z;continue a;break}default:{wa=w;xa=0;ya=15494;za=o;Aa=$;Ba=y}}while(0);e:do if((z|0)==62){z=0;w=k;Q=f[w>>2]|0;K=f[w+4>>2]|0;w=ol(Q,K,o,fa&32)|0;F=(ha&8|0)==0|(Q|0)==0&(K|0)==0;ka=w;la=F?0:2;ma=F?15494:15494+(fa>>4)|0;na=ga;oa=ha;pa=Q;qa=K;z=68}else if((z|0)==67){z=0;ka=Jj(ua,va,o)|0;la=sa;ma=ta;na=$;oa=y;pa=ua;qa=va;z=68}else if((z|0)==72){z=0;K=cg(Ca,0,$)|0;Q=(K|0)==0;wa=Ca;xa=0;ya=15494;za=Q?Ca+$|0:K;Aa=Q?$:K-Ca|0;Ba=O}else if((z|0)==76){z=0;K=Ea;Q=0;F=0;while(1){w=f[K>>2]|0;if(!w){Ga=Q;Ha=F;break}ja=Yo(n,w)|0;if((ja|0)<0|ja>>>0>(Da-Q|0)>>>0){Ga=Q;Ha=ja;break}w=ja+Q|0;if(Da>>>0>w>>>0){K=K+4|0;Q=w;F=ja}else{Ga=w;Ha=ja;break}}if((Ha|0)<0){V=-1;break a}Hk(a,32,X,Ga,y);if(!Ga){Fa=0;z=85}else{F=Ea;Q=0;while(1){K=f[F>>2]|0;if(!K){Fa=Ga;z=85;break e}ja=Yo(n,K)|0;Q=ja+Q|0;if((Q|0)>(Ga|0)){Fa=Ga;z=85;break e}ep(a,n,ja);if(Q>>>0>=Ga>>>0){Fa=Ga;z=85;break}else F=F+4|0}}}while(0);if((z|0)==68){z=0;O=(pa|0)!=0|(qa|0)!=0;F=(na|0)!=0|O;Q=q-ka+((O^1)&1)|0;wa=F?ka:o;xa=la;ya=ma;za=o;Aa=F?((na|0)>(Q|0)?na:Q):na;Ba=(na|0)>-1?oa&-65537:oa}else if((z|0)==85){z=0;Hk(a,32,X,Fa,y^8192);s=(X|0)>(Fa|0)?X:Fa;t=x;v=Z;continue}Q=za-wa|0;F=(Aa|0)<(Q|0)?Q:Aa;O=F+xa|0;ja=(X|0)<(O|0)?O:X;Hk(a,32,ja,O,Ba);ep(a,ya,xa);Hk(a,48,ja,O,Ba^65536);Hk(a,48,F,Q,0);ep(a,wa,Q);Hk(a,32,ja,O,Ba^8192);s=ja;t=x;v=Z}f:do if((z|0)==88)if(!a)if(v){Z=1;while(1){t=f[h+(Z<<2)>>2]|0;if(!t){Ia=Z;break}Ie(g+(Z<<3)|0,t,e);t=Z+1|0;if((Z|0)<9)Z=t;else{Ia=t;break}}if((Ia|0)<10){Z=Ia;while(1){if(f[h+(Z<<2)>>2]|0){V=-1;break f}if((Z|0)<9)Z=Z+1|0;else{V=1;break}}}else V=1}else V=0;else V=x;while(0);u=i;return V|0}function rb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=Oa,ma=Oa,na=Oa,oa=0,pa=0,qa=0,ra=0,sa=0;c=u;u=u+64|0;d=c+28|0;e=c+16|0;g=c+4|0;h=c;i=a;j=a+80|0;k=f[j>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=i;l=d+20|0;n[l>>2]=$(1.0);f[d+24>>2]=i;qh(d,k);k=f[j>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;m=(k|0)==0;do if(!m)if(k>>>0>1073741823)mq(e);else{o=k<<2;p=dn(o)|0;f[e>>2]=p;q=p+(k<<2)|0;f[e+8>>2]=q;hj(p|0,0,o|0)|0;f[i>>2]=q;break}while(0);f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;f[h>>2]=0;if(!m){m=d+16|0;q=d+4|0;o=d+12|0;p=d+8|0;r=g+8|0;s=d+24|0;t=0;v=0;while(1){w=f[m>>2]|0;x=f[w+8>>2]|0;y=(f[w+12>>2]|0)-x|0;w=(y|0)>0;z=x;if(w){x=y>>>2;A=0;B=0;while(1){C=f[z+(A<<2)>>2]|0;if(!(b[C+84>>0]|0))D=f[(f[C+68>>2]|0)+(v<<2)>>2]|0;else D=v;C=D+239^B;A=A+1|0;if((A|0)>=(x|0)){E=C;break}else B=C}}else E=0;B=f[q>>2]|0;x=(B|0)==0;a:do if(!x){A=B+-1|0;C=(A&B|0)==0;if(!C)if(E>>>0>>0)F=E;else F=(E>>>0)%(B>>>0)|0;else F=A&E;G=f[(f[d>>2]|0)+(F<<2)>>2]|0;if((G|0)!=0?(H=f[G>>2]|0,(H|0)!=0):0){G=f[s>>2]|0;I=G+8|0;J=G+12|0;b:do if(C){G=H;while(1){K=f[G+4>>2]|0;L=(K|0)==(E|0);if(!(L|(K&A|0)==(F|0))){M=44;break a}c:do if(L){K=f[G+8>>2]|0;N=f[I>>2]|0;O=(f[J>>2]|0)-N|0;P=N;if((O|0)<=0){Q=G;break b}N=O>>>2;O=0;while(1){R=f[P+(O<<2)>>2]|0;if(!(b[R+84>>0]|0)){S=f[R+68>>2]|0;T=f[S+(v<<2)>>2]|0;U=f[S+(K<<2)>>2]|0}else{T=v;U=K}O=O+1|0;if((U|0)!=(T|0))break c;if((O|0)>=(N|0)){V=G;M=42;break b}}}while(0);G=f[G>>2]|0;if(!G){M=44;break a}}}else{G=H;while(1){L=f[G+4>>2]|0;d:do if((L|0)!=(E|0)){if(L>>>0>>0)X=L;else X=(L>>>0)%(B>>>0)|0;if((X|0)!=(F|0)){M=44;break a}}else{N=f[G+8>>2]|0;O=f[I>>2]|0;K=(f[J>>2]|0)-O|0;P=O;if((K|0)<=0){Q=G;break b}O=K>>>2;K=0;while(1){S=f[P+(K<<2)>>2]|0;if(!(b[S+84>>0]|0)){R=f[S+68>>2]|0;Y=f[R+(v<<2)>>2]|0;Z=f[R+(N<<2)>>2]|0}else{Y=v;Z=N}K=K+1|0;if((Z|0)!=(Y|0))break d;if((K|0)>=(O|0)){V=G;M=42;break b}}}while(0);G=f[G>>2]|0;if(!G){M=44;break a}}}while(0);if((M|0)==42){M=0;if(!V){M=44;break}else Q=V}f[(f[e>>2]|0)+(v<<2)>>2]=f[Q+12>>2];_=t}else M=44}else M=44;while(0);do if((M|0)==44){M=0;if(w){J=y>>>2;I=0;H=0;while(1){A=f[z+(I<<2)>>2]|0;if(!(b[A+84>>0]|0))aa=f[(f[A+68>>2]|0)+(v<<2)>>2]|0;else aa=v;A=aa+239^H;I=I+1|0;if((I|0)>=(J|0)){ba=A;break}else H=A}}else ba=0;e:do if(!x){H=B+-1|0;J=(H&B|0)==0;if(!J)if(ba>>>0>>0)ca=ba;else ca=(ba>>>0)%(B>>>0)|0;else ca=H&ba;I=f[(f[d>>2]|0)+(ca<<2)>>2]|0;if((I|0)!=0?(A=f[I>>2]|0,(A|0)!=0):0){I=f[s>>2]|0;C=I+8|0;G=I+12|0;if(J){J=A;while(1){I=f[J+4>>2]|0;if(!((I|0)==(ba|0)|(I&H|0)==(ca|0))){da=ca;M=76;break e}I=f[J+8>>2]|0;L=f[C>>2]|0;O=(f[G>>2]|0)-L|0;K=L;if((O|0)<=0){ea=v;break e}L=O>>>2;O=0;while(1){N=f[K+(O<<2)>>2]|0;if(!(b[N+84>>0]|0)){P=f[N+68>>2]|0;fa=f[P+(v<<2)>>2]|0;ga=f[P+(I<<2)>>2]|0}else{fa=v;ga=I}O=O+1|0;if((ga|0)!=(fa|0))break;if((O|0)>=(L|0)){ea=v;break e}}J=f[J>>2]|0;if(!J){da=ca;M=76;break e}}}else ha=A;while(1){J=f[ha+4>>2]|0;if((J|0)!=(ba|0)){if(J>>>0>>0)ia=J;else ia=(J>>>0)%(B>>>0)|0;if((ia|0)!=(ca|0)){da=ca;M=76;break e}}J=f[ha+8>>2]|0;H=f[C>>2]|0;L=(f[G>>2]|0)-H|0;O=H;if((L|0)<=0){ea=v;break e}H=L>>>2;L=0;while(1){I=f[O+(L<<2)>>2]|0;if(!(b[I+84>>0]|0)){K=f[I+68>>2]|0;ja=f[K+(v<<2)>>2]|0;ka=f[K+(J<<2)>>2]|0}else{ja=v;ka=J}L=L+1|0;if((ka|0)!=(ja|0))break;if((L|0)>=(H|0)){ea=v;break e}}ha=f[ha>>2]|0;if(!ha){da=ca;M=76;break}}}else{da=ca;M=76}}else{da=0;M=76}while(0);if((M|0)==76){M=0;G=dn(16)|0;f[G+8>>2]=v;f[G+12>>2]=t;f[G+4>>2]=ba;f[G>>2]=0;la=$(((f[o>>2]|0)+1|0)>>>0);ma=$(B>>>0);na=$(n[l>>2]);do if(x|$(na*ma)>>0<3|(B+-1&B|0)!=0)&1;A=~~$(W($(la/na)))>>>0;qh(d,C>>>0>>0?A:C);C=f[q>>2]|0;A=C+-1|0;if(!(A&C)){oa=C;pa=A&ba;break}if(ba>>>0>>0){oa=C;pa=ba}else{oa=C;pa=(ba>>>0)%(C>>>0)|0}}else{oa=B;pa=da}while(0);C=(f[d>>2]|0)+(pa<<2)|0;A=f[C>>2]|0;if(!A){f[G>>2]=f[p>>2];f[p>>2]=G;f[C>>2]=p;C=f[G>>2]|0;if(C|0){H=f[C+4>>2]|0;C=oa+-1|0;if(C&oa)if(H>>>0>>0)qa=H;else qa=(H>>>0)%(oa>>>0)|0;else qa=H&C;ra=(f[d>>2]|0)+(qa<<2)|0;M=89}}else{f[G>>2]=f[A>>2];ra=A;M=89}if((M|0)==89){M=0;f[ra>>2]=G}f[o>>2]=(f[o>>2]|0)+1;ea=f[h>>2]|0}A=t+1|0;f[(f[e>>2]|0)+(ea<<2)>>2]=t;C=f[k>>2]|0;if((C|0)==(f[r>>2]|0)){Ci(g,h);_=A;break}else{f[C>>2]=f[h>>2];f[k>>2]=C+4;_=A;break}}while(0);v=(f[h>>2]|0)+1|0;f[h>>2]=v;sa=f[j>>2]|0;if(v>>>0>=sa>>>0)break;else t=_}if((_|0)!=(sa|0)){Xa[f[(f[a>>2]|0)+24>>2]&15](a,e,g);f[j>>2]=_}}_=f[g>>2]|0;if(_|0){g=f[k>>2]|0;if((g|0)!=(_|0))f[k>>2]=g+(~((g+-4-_|0)>>>2)<<2);br(_)}_=f[e>>2]|0;if(_|0){e=f[i>>2]|0;if((e|0)!=(_|0))f[i>>2]=e+(~((e+-4-_|0)>>>2)<<2);br(_)}_=f[d+8>>2]|0;if(_|0){e=_;do{_=e;e=f[e>>2]|0;br(_)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(!e){u=c;return}br(e);u=c;return}function sb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;c=(((n>>>0)%3|0|0)==0?2:-1)+n|0;if((o|0)==-1)p=-1;else p=f[(f[f[m>>2]>>2]|0)+(o<<2)>>2]|0;if((c|0)==-1){q=p;r=-1}else{q=p;r=f[(f[f[m>>2]>>2]|0)+(c<<2)>>2]|0}}else{q=-1;r=-1}c=f[a+36>>2]|0;m=f[c>>2]|0;p=(f[c+4>>2]|0)-m>>2;if(p>>>0<=q>>>0)mq(c);o=m;m=f[o+(q<<2)>>2]|0;if(p>>>0<=r>>>0)mq(c);c=f[o+(r<<2)>>2]|0;r=(m|0)<(e|0);do if(r&(c|0)<(e|0)){o=m<<1;p=f[d+(o<<2)>>2]|0;q=((p|0)<0)<<31>>31;n=f[d+((o|1)<<2)>>2]|0;o=((n|0)<0)<<31>>31;s=c<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(p|0)|(v|0)!=(n|0))){f[a+8>>2]=p;f[a+12>>2]=n;u=g;return 1}s=a+4|0;w=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))y=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else y=w;f[i>>2]=y;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];ub(x,h,w,j)|0;w=f[(f[s>>2]|0)+(m<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))z=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else z=w;f[i>>2]=z;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];ub(x,h,w,k)|0;w=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))A=f[(f[s+68>>2]|0)+(w<<2)>>2]|0;else A=w;f[i>>2]=A;w=b[s+24>>0]|0;f[h>>2]=f[i>>2];ub(s,h,w,l)|0;w=l;s=k;x=f[s>>2]|0;B=f[s+4>>2]|0;s=Vn(f[w>>2]|0,f[w+4>>2]|0,x|0,B|0)|0;w=I;C=l+8|0;D=k+8|0;E=f[D>>2]|0;F=f[D+4>>2]|0;D=Vn(f[C>>2]|0,f[C+4>>2]|0,E|0,F|0)|0;C=I;G=l+16|0;H=k+16|0;J=f[H>>2]|0;K=f[H+4>>2]|0;H=Vn(f[G>>2]|0,f[G+4>>2]|0,J|0,K|0)|0;G=I;L=on(s|0,w|0,s|0,w|0)|0;M=I;N=on(D|0,C|0,D|0,C|0)|0;O=Tn(N|0,I|0,L|0,M|0)|0;M=I;L=on(H|0,G|0,H|0,G|0)|0;N=Tn(O|0,M|0,L|0,I|0)|0;L=I;if((N|0)==0&(L|0)==0)break;M=j;O=Vn(f[M>>2]|0,f[M+4>>2]|0,x|0,B|0)|0;B=I;x=j+8|0;M=Vn(f[x>>2]|0,f[x+4>>2]|0,E|0,F|0)|0;F=I;E=j+16|0;x=Vn(f[E>>2]|0,f[E+4>>2]|0,J|0,K|0)|0;K=I;J=on(O|0,B|0,s|0,w|0)|0;E=I;P=on(M|0,F|0,D|0,C|0)|0;Q=Tn(P|0,I|0,J|0,E|0)|0;E=I;J=on(x|0,K|0,H|0,G|0)|0;P=Tn(Q|0,E|0,J|0,I|0)|0;J=I;E=Vn(t|0,((t|0)<0)<<31>>31|0,p|0,q|0)|0;t=I;Q=Vn(v|0,((v|0)<0)<<31>>31|0,n|0,o|0)|0;v=I;R=on(N|0,L|0,p|0,q|0)|0;q=I;p=on(N|0,L|0,n|0,o|0)|0;o=I;n=on(P|0,J|0,E|0,t|0)|0;S=I;T=on(P|0,J|0,Q|0,v|0)|0;U=I;V=Tn(n|0,S|0,R|0,q|0)|0;q=I;R=Tn(T|0,U|0,p|0,o|0)|0;o=I;p=on(P|0,J|0,s|0,w|0)|0;w=I;s=on(P|0,J|0,D|0,C|0)|0;C=I;D=on(P|0,J|0,H|0,G|0)|0;G=I;H=zk(p|0,w|0,N|0,L|0)|0;w=I;p=zk(s|0,C|0,N|0,L|0)|0;C=I;s=zk(D|0,G|0,N|0,L|0)|0;G=I;D=Vn(O|0,B|0,H|0,w|0)|0;w=I;H=Vn(M|0,F|0,p|0,C|0)|0;C=I;p=Vn(x|0,K|0,s|0,G|0)|0;G=I;s=on(D|0,w|0,D|0,w|0)|0;w=I;D=on(H|0,C|0,H|0,C|0)|0;C=Tn(D|0,I|0,s|0,w|0)|0;w=I;s=on(p|0,G|0,p|0,G|0)|0;G=Tn(C|0,w|0,s|0,I|0)|0;s=I;w=Vn(0,0,E|0,t|0)|0;t=I;E=on(G|0,s|0,N|0,L|0)|0;s=I;switch(E|0){case 0:{if(!s){W=0;X=0}else{Y=1;Z=0;_=E;$=s;aa=23}break}case 1:{if(!s){ba=1;ca=0;aa=24}else{Y=1;Z=0;_=E;$=s;aa=23}break}default:{Y=1;Z=0;_=E;$=s;aa=23}}if((aa|0)==23)while(1){aa=0;G=Rn(Y|0,Z|0,1)|0;C=I;p=_;_=Wn(_|0,$|0,2)|0;if(!($>>>0>0|($|0)==0&p>>>0>7)){ba=G;ca=C;aa=24;break}else{Y=G;Z=C;$=I;aa=23}}if((aa|0)==24)while(1){aa=0;C=up(E|0,s|0,ba|0,ca|0)|0;G=Tn(C|0,I|0,ba|0,ca|0)|0;C=Wn(G|0,I|0,1)|0;G=I;p=on(C|0,G|0,C|0,G|0)|0;D=I;if(D>>>0>s>>>0|(D|0)==(s|0)&p>>>0>E>>>0){ba=C;ca=G;aa=24}else{W=C;X=G;break}}E=on(W|0,X|0,Q|0,v|0)|0;s=I;G=on(W|0,X|0,w|0,t|0)|0;C=I;p=Tn(E|0,s|0,V|0,q|0)|0;D=I;H=Tn(G|0,C|0,R|0,o|0)|0;K=I;x=zk(p|0,D|0,N|0,L|0)|0;D=I;p=zk(H|0,K|0,N|0,L|0)|0;K=I;H=Vn(V|0,q|0,E|0,s|0)|0;s=I;E=Vn(R|0,o|0,G|0,C|0)|0;C=I;G=zk(H|0,s|0,N|0,L|0)|0;s=I;H=zk(E|0,C|0,N|0,L|0)|0;C=I;E=e<<1;F=f[d+(E<<2)>>2]|0;M=((F|0)<0)<<31>>31;B=f[d+((E|1)<<2)>>2]|0;E=((B|0)<0)<<31>>31;O=Vn(F|0,M|0,x|0,D|0)|0;J=I;P=Vn(B|0,E|0,p|0,K|0)|0;U=I;T=on(O|0,J|0,O|0,J|0)|0;J=I;O=on(P|0,U|0,P|0,U|0)|0;U=Tn(O|0,I|0,T|0,J|0)|0;J=I;T=Vn(F|0,M|0,G|0,s|0)|0;M=I;F=Vn(B|0,E|0,H|0,C|0)|0;E=I;B=on(T|0,M|0,T|0,M|0)|0;M=I;T=on(F|0,E|0,F|0,E|0)|0;E=Tn(T|0,I|0,B|0,M|0)|0;M=I;B=a+16|0;T=a+20|0;F=f[T>>2]|0;O=f[a+24>>2]|0;P=(F|0)==(O<<5|0);if(J>>>0>>0|(J|0)==(M|0)&U>>>0>>0){do if(P)if((F+1|0)<0)mq(B);else{E=O<<6;U=F+32&-32;hi(B,F>>>0<1073741823?(E>>>0>>0?U:E):2147483647);da=f[T>>2]|0;break}else da=F;while(0);f[T>>2]=da+1;L=(f[B>>2]|0)+(da>>>5<<2)|0;f[L>>2]=f[L>>2]|1<<(da&31);ea=x;fa=p;ga=K;ha=D}else{do if(P)if((F+1|0)<0)mq(B);else{L=O<<6;N=F+32&-32;hi(B,F>>>0<1073741823?(L>>>0>>0?N:L):2147483647);ia=f[T>>2]|0;break}else ia=F;while(0);f[T>>2]=ia+1;F=(f[B>>2]|0)+(ia>>>5<<2)|0;f[F>>2]=f[F>>2]&~(1<<(ia&31));ea=G;fa=H;ga=C;ha=s}f[a+8>>2]=ea;f[a+12>>2]=fa;u=g;return 1}while(0);do if(r)ja=m<<1;else{if((e|0)>0){ja=(e<<1)+-2|0;break}fa=a+8|0;f[fa>>2]=0;f[fa+4>>2]=0;u=g;return 1}while(0);f[a+8>>2]=f[d+(ja<<2)>>2];f[a+12>>2]=f[d+(ja+1<<2)>>2];u=g;return 1}function tb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;do if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;if(!((n>>>0)%3|0)){p=n+2|0;q=o;break}else{p=n+-1|0;q=o;break}}else{p=-1;q=-1}while(0);n=f[(f[m>>2]|0)+28>>2]|0;m=f[n+(q<<2)>>2]|0;q=f[n+(p<<2)>>2]|0;p=f[a+36>>2]|0;n=f[p>>2]|0;c=(f[p+4>>2]|0)-n>>2;if(c>>>0<=m>>>0)mq(p);o=n;n=f[o+(m<<2)>>2]|0;if(c>>>0<=q>>>0)mq(p);p=f[o+(q<<2)>>2]|0;q=(n|0)<(e|0);do if(q&(p|0)<(e|0)){o=n<<1;c=f[d+(o<<2)>>2]|0;m=((c|0)<0)<<31>>31;r=f[d+((o|1)<<2)>>2]|0;o=((r|0)<0)<<31>>31;s=p<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(c|0)|(v|0)!=(r|0))){f[a+8>>2]=c;f[a+12>>2]=r;u=g;return 1}s=a+4|0;w=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))y=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else y=w;f[i>>2]=y;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];ub(x,h,w,j)|0;w=f[(f[s>>2]|0)+(n<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))z=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else z=w;f[i>>2]=z;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];ub(x,h,w,k)|0;w=f[(f[s>>2]|0)+(p<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))A=f[(f[s+68>>2]|0)+(w<<2)>>2]|0;else A=w;f[i>>2]=A;w=b[s+24>>0]|0;f[h>>2]=f[i>>2];ub(s,h,w,l)|0;w=l;s=k;x=f[s>>2]|0;B=f[s+4>>2]|0;s=Vn(f[w>>2]|0,f[w+4>>2]|0,x|0,B|0)|0;w=I;C=l+8|0;D=k+8|0;E=f[D>>2]|0;F=f[D+4>>2]|0;D=Vn(f[C>>2]|0,f[C+4>>2]|0,E|0,F|0)|0;C=I;G=l+16|0;H=k+16|0;J=f[H>>2]|0;K=f[H+4>>2]|0;H=Vn(f[G>>2]|0,f[G+4>>2]|0,J|0,K|0)|0;G=I;L=on(s|0,w|0,s|0,w|0)|0;M=I;N=on(D|0,C|0,D|0,C|0)|0;O=Tn(N|0,I|0,L|0,M|0)|0;M=I;L=on(H|0,G|0,H|0,G|0)|0;N=Tn(O|0,M|0,L|0,I|0)|0;L=I;if((N|0)==0&(L|0)==0)break;M=j;O=Vn(f[M>>2]|0,f[M+4>>2]|0,x|0,B|0)|0;B=I;x=j+8|0;M=Vn(f[x>>2]|0,f[x+4>>2]|0,E|0,F|0)|0;F=I;E=j+16|0;x=Vn(f[E>>2]|0,f[E+4>>2]|0,J|0,K|0)|0;K=I;J=on(O|0,B|0,s|0,w|0)|0;E=I;P=on(M|0,F|0,D|0,C|0)|0;Q=Tn(P|0,I|0,J|0,E|0)|0;E=I;J=on(x|0,K|0,H|0,G|0)|0;P=Tn(Q|0,E|0,J|0,I|0)|0;J=I;E=Vn(t|0,((t|0)<0)<<31>>31|0,c|0,m|0)|0;t=I;Q=Vn(v|0,((v|0)<0)<<31>>31|0,r|0,o|0)|0;v=I;R=on(N|0,L|0,c|0,m|0)|0;m=I;c=on(N|0,L|0,r|0,o|0)|0;o=I;r=on(P|0,J|0,E|0,t|0)|0;S=I;T=on(P|0,J|0,Q|0,v|0)|0;U=I;V=Tn(r|0,S|0,R|0,m|0)|0;m=I;R=Tn(T|0,U|0,c|0,o|0)|0;o=I;c=on(P|0,J|0,s|0,w|0)|0;w=I;s=on(P|0,J|0,D|0,C|0)|0;C=I;D=on(P|0,J|0,H|0,G|0)|0;G=I;H=zk(c|0,w|0,N|0,L|0)|0;w=I;c=zk(s|0,C|0,N|0,L|0)|0;C=I;s=zk(D|0,G|0,N|0,L|0)|0;G=I;D=Vn(O|0,B|0,H|0,w|0)|0;w=I;H=Vn(M|0,F|0,c|0,C|0)|0;C=I;c=Vn(x|0,K|0,s|0,G|0)|0;G=I;s=on(D|0,w|0,D|0,w|0)|0;w=I;D=on(H|0,C|0,H|0,C|0)|0;C=Tn(D|0,I|0,s|0,w|0)|0;w=I;s=on(c|0,G|0,c|0,G|0)|0;G=Tn(C|0,w|0,s|0,I|0)|0;s=I;w=Vn(0,0,E|0,t|0)|0;t=I;E=on(G|0,s|0,N|0,L|0)|0;s=I;switch(E|0){case 0:{if(!s){W=0;X=0}else{Y=1;Z=0;_=E;$=s;aa=22}break}case 1:{if(!s){ba=1;ca=0;aa=23}else{Y=1;Z=0;_=E;$=s;aa=22}break}default:{Y=1;Z=0;_=E;$=s;aa=22}}if((aa|0)==22)while(1){aa=0;G=Rn(Y|0,Z|0,1)|0;C=I;c=_;_=Wn(_|0,$|0,2)|0;if(!($>>>0>0|($|0)==0&c>>>0>7)){ba=G;ca=C;aa=23;break}else{Y=G;Z=C;$=I;aa=22}}if((aa|0)==23)while(1){aa=0;C=up(E|0,s|0,ba|0,ca|0)|0;G=Tn(C|0,I|0,ba|0,ca|0)|0;C=Wn(G|0,I|0,1)|0;G=I;c=on(C|0,G|0,C|0,G|0)|0;D=I;if(D>>>0>s>>>0|(D|0)==(s|0)&c>>>0>E>>>0){ba=C;ca=G;aa=23}else{W=C;X=G;break}}E=on(W|0,X|0,Q|0,v|0)|0;s=I;G=on(W|0,X|0,w|0,t|0)|0;C=I;c=Tn(E|0,s|0,V|0,m|0)|0;D=I;H=Tn(G|0,C|0,R|0,o|0)|0;K=I;x=zk(c|0,D|0,N|0,L|0)|0;D=I;c=zk(H|0,K|0,N|0,L|0)|0;K=I;H=Vn(V|0,m|0,E|0,s|0)|0;s=I;E=Vn(R|0,o|0,G|0,C|0)|0;C=I;G=zk(H|0,s|0,N|0,L|0)|0;s=I;H=zk(E|0,C|0,N|0,L|0)|0;C=I;E=e<<1;F=f[d+(E<<2)>>2]|0;M=((F|0)<0)<<31>>31;B=f[d+((E|1)<<2)>>2]|0;E=((B|0)<0)<<31>>31;O=Vn(F|0,M|0,x|0,D|0)|0;J=I;P=Vn(B|0,E|0,c|0,K|0)|0;U=I;T=on(O|0,J|0,O|0,J|0)|0;J=I;O=on(P|0,U|0,P|0,U|0)|0;U=Tn(O|0,I|0,T|0,J|0)|0;J=I;T=Vn(F|0,M|0,G|0,s|0)|0;M=I;F=Vn(B|0,E|0,H|0,C|0)|0;E=I;B=on(T|0,M|0,T|0,M|0)|0;M=I;T=on(F|0,E|0,F|0,E|0)|0;E=Tn(T|0,I|0,B|0,M|0)|0;M=I;B=a+16|0;T=a+20|0;F=f[T>>2]|0;O=f[a+24>>2]|0;P=(F|0)==(O<<5|0);if(J>>>0>>0|(J|0)==(M|0)&U>>>0>>0){do if(P)if((F+1|0)<0)mq(B);else{E=O<<6;U=F+32&-32;hi(B,F>>>0<1073741823?(E>>>0>>0?U:E):2147483647);da=f[T>>2]|0;break}else da=F;while(0);f[T>>2]=da+1;L=(f[B>>2]|0)+(da>>>5<<2)|0;f[L>>2]=f[L>>2]|1<<(da&31);ea=x;fa=c;ga=K;ha=D}else{do if(P)if((F+1|0)<0)mq(B);else{L=O<<6;N=F+32&-32;hi(B,F>>>0<1073741823?(L>>>0>>0?N:L):2147483647);ia=f[T>>2]|0;break}else ia=F;while(0);f[T>>2]=ia+1;F=(f[B>>2]|0)+(ia>>>5<<2)|0;f[F>>2]=f[F>>2]&~(1<<(ia&31));ea=G;fa=H;ga=C;ha=s}f[a+8>>2]=ea;f[a+12>>2]=fa;u=g;return 1}while(0);do if(q)ja=n<<1;else{if((e|0)>0){ja=(e<<1)+-2|0;break}fa=a+8|0;f[fa>>2]=0;f[fa+4>>2]=0;u=g;return 1}while(0);f[a+8>>2]=f[d+(ja<<2)>>2];f[a+12>>2]=f[d+(ja+1<<2)>>2];u=g;return 1}function ub(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=Oa,D=0,E=0.0,F=0,G=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){m=b[o>>0]|0;q=g+(r<<3)|0;f[q>>2]=m;f[q+4>>2]=((m|0)<0)<<31>>31;r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=g+(t<<3)|0;f[k>>2]=h[m>>0];f[k+4>>2]=0;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){o=d[l>>1]|0;k=g+(q<<3)|0;f[k>>2]=o;f[k+4>>2]=((o|0)<0)<<31>>31;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=j[r>>1];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<3)|0,0,(e<<24>>24)-r<<3|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=on(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Tn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){l=f[t>>2]|0;m=g+(o<<3)|0;f[m>>2]=l;f[m+4>>2]=((l|0)<0)<<31>>31;o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(t<<3)|0,0,(e<<24>>24)-t<<3|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=on(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Tn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){r=g+(m<<3)|0;f[r>>2]=f[q>>2];f[r+4>>2]=0;m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(q<<3)|0,0,(e<<24>>24)-q<<3|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=on(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Tn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){t=k;r=f[t+4>>2]|0;z=g+(l<<3)|0;f[z>>2]=f[t>>2];f[z+4>>2]=r;l=l+1|0;r=b[q>>0]|0;if((l|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){A=r;break}else k=k+8|0}}else A=m;k=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(k<<3)|0,0,(e<<24>>24)-k<<3|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;r=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;z=Tn(r|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+z|0;z=0;while(1){q=o;r=f[q+4>>2]|0;t=g+(z<<3)|0;f[t>>2]=f[q>>2];f[t+4>>2]=r;z=z+1|0;r=b[k>>0]|0;if((z|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){B=r;break}else o=o+8|0}}else B=l;o=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 9:{o=a+24|0;z=b[o>>0]|0;if((z<<24>>24>e<<24>>24?e:z)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;r=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(r|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){C=$(n[m>>2]);k=+K(+C)>=1.0?(+C>0.0?~~+Y(+J(+C/4294967296.0),4294967295.0)>>>0:~~+W((+C-+(~~+C>>>0))/4294967296.0)>>>0):0;r=g+(t<<3)|0;f[r>>2]=~~+C>>>0;f[r+4>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){D=k;break}else m=m+4|0}}else D=z;m=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;r=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+r|0;r=0;while(1){E=+p[l>>3];o=+K(E)>=1.0?(E>0.0?~~+Y(+J(E/4294967296.0),4294967295.0)>>>0:~~+W((E-+(~~E>>>0))/4294967296.0)>>>0):0;k=g+(r<<3)|0;f[k>>2]=~~E>>>0;f[k+4>>2]=o;r=r+1|0;o=b[m>>0]|0;if((r|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){F=o;break}else l=l+8|0}}else F=t;l=F<<24>>24;if(F<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 11:{l=a+24|0;r=b[l>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){m=f[f[a>>2]>>2]|0;z=a+40|0;o=on(f[z>>2]|0,f[z+4>>2]|0,f[c>>2]|0,0)|0;z=a+48|0;k=Tn(o|0,I|0,f[z>>2]|0,f[z+4>>2]|0)|0;z=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=h[z>>0];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){G=m;break}else z=z+1|0}}else G=r;z=G<<24>>24;if(G<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(z<<3)|0,0,(e<<24>>24)-z<<3|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function vb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;c=u;u=u+16|0;d=c+8|0;e=c;if((f[a+92>>2]|0)==(f[a+88>>2]|0)){u=c;return 1}g=a+52|0;h=f[g>>2]|0;if((h|0)==(f[a+56>>2]|0)){Ci(a+48|0,b);i=b}else{f[h>>2]=f[b>>2];f[g>>2]=h+4;i=b}b=a+84|0;f[b>>2]=0;h=a+4|0;g=f[h>>2]|0;j=f[i>>2]|0;k=j+1|0;if((j|0)!=-1){l=((k>>>0)%3|0|0)==0?j+-2|0:k;if((l|0)==-1)m=-1;else m=f[(f[g>>2]|0)+(l<<2)>>2]|0;l=(((j>>>0)%3|0|0)==0?2:-1)+j|0;if((l|0)==-1){n=m;o=-1}else{n=m;o=f[(f[g>>2]|0)+(l<<2)>>2]|0}}else{n=-1;o=-1}l=a+36|0;g=f[l>>2]|0;m=g+(n>>>5<<2)|0;j=1<<(n&31);k=f[m>>2]|0;if(!(k&j)){f[m>>2]=k|j;j=f[i>>2]|0;k=j+1|0;if((j|0)==-1)p=-1;else p=((k>>>0)%3|0|0)==0?j+-2|0:k;f[e>>2]=p;k=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((p>>>0)/3|0)*12|0)+(((p>>>0)%3|0)<<2)>>2]|0;p=f[a+20>>2]|0;f[d>>2]=k;j=f[p+4>>2]|0;p=j+4|0;m=f[p>>2]|0;if((m|0)==(f[j+8>>2]|0))Ci(j,d);else{f[m>>2]=k;f[p>>2]=m+4}m=a+12|0;p=f[m>>2]|0;k=p+4|0;j=f[k>>2]|0;if((j|0)==(f[p+8>>2]|0)){Ci(p,e);q=f[m>>2]|0}else{f[j>>2]=f[e>>2];f[k>>2]=j+4;q=p}p=q+24|0;f[(f[q+12>>2]|0)+(n<<2)>>2]=f[p>>2];f[p>>2]=(f[p>>2]|0)+1;r=f[l>>2]|0}else r=g;g=r+(o>>>5<<2)|0;r=1<<(o&31);p=f[g>>2]|0;if(!(p&r)){f[g>>2]=p|r;r=f[i>>2]|0;do if((r|0)!=-1)if(!((r>>>0)%3|0)){s=r+2|0;break}else{s=r+-1|0;break}else s=-1;while(0);f[e>>2]=s;r=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((s>>>0)/3|0)*12|0)+(((s>>>0)%3|0)<<2)>>2]|0;s=f[a+20>>2]|0;f[d>>2]=r;p=f[s+4>>2]|0;s=p+4|0;g=f[s>>2]|0;if((g|0)==(f[p+8>>2]|0))Ci(p,d);else{f[g>>2]=r;f[s>>2]=g+4}g=a+12|0;s=f[g>>2]|0;r=s+4|0;p=f[r>>2]|0;if((p|0)==(f[s+8>>2]|0)){Ci(s,e);t=f[g>>2]|0}else{f[p>>2]=f[e>>2];f[r>>2]=p+4;t=s}s=t+24|0;f[(f[t+12>>2]|0)+(o<<2)>>2]=f[s>>2];f[s>>2]=(f[s>>2]|0)+1}s=f[i>>2]|0;if((s|0)==-1)v=-1;else v=f[(f[f[h>>2]>>2]|0)+(s<<2)>>2]|0;s=(f[l>>2]|0)+(v>>>5<<2)|0;o=1<<(v&31);t=f[s>>2]|0;if(!(o&t)){f[s>>2]=t|o;o=f[i>>2]|0;f[e>>2]=o;t=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((o>>>0)/3|0)*12|0)+(((o>>>0)%3|0)<<2)>>2]|0;o=f[a+20>>2]|0;f[d>>2]=t;s=f[o+4>>2]|0;o=s+4|0;p=f[o>>2]|0;if((p|0)==(f[s+8>>2]|0))Ci(s,d);else{f[p>>2]=t;f[o>>2]=p+4}p=a+12|0;o=f[p>>2]|0;t=o+4|0;s=f[t>>2]|0;if((s|0)==(f[o+8>>2]|0)){Ci(o,e);w=f[p>>2]|0}else{f[s>>2]=f[e>>2];f[t>>2]=s+4;w=o}o=w+24|0;f[(f[w+12>>2]|0)+(v<<2)>>2]=f[o>>2];f[o>>2]=(f[o>>2]|0)+1}o=f[b>>2]|0;a:do if((o|0)<3){v=a+24|0;w=a+16|0;s=a+20|0;t=a+12|0;p=a+88|0;r=o;while(1){g=r;while(1){x=a+48+(g*12|0)+4|0;y=f[x>>2]|0;if((f[a+48+(g*12|0)>>2]|0)!=(y|0))break;if((g|0)<2)g=g+1|0;else break a}n=y+-4|0;q=f[n>>2]|0;f[x>>2]=n;f[b>>2]=g;f[i>>2]=q;if((q|0)==-1)break;n=(q>>>0)/3|0;j=f[v>>2]|0;do if(!(f[j+(n>>>5<<2)>>2]&1<<(n&31))){k=q;m=j;b:while(1){z=(k>>>0)/3|0;A=m+(z>>>5<<2)|0;f[A>>2]=1<<(z&31)|f[A>>2];A=f[i>>2]|0;if((A|0)==-1)B=-1;else B=f[(f[f[h>>2]>>2]|0)+(A<<2)>>2]|0;z=(f[l>>2]|0)+(B>>>5<<2)|0;C=1<<(B&31);D=f[z>>2]|0;if(!(C&D)){f[z>>2]=D|C;C=f[i>>2]|0;f[e>>2]=C;D=f[(f[(f[w>>2]|0)+96>>2]|0)+(((C>>>0)/3|0)*12|0)+(((C>>>0)%3|0)<<2)>>2]|0;C=f[s>>2]|0;f[d>>2]=D;z=f[C+4>>2]|0;C=z+4|0;E=f[C>>2]|0;if((E|0)==(f[z+8>>2]|0))Ci(z,d);else{f[E>>2]=D;f[C>>2]=E+4}E=f[t>>2]|0;C=E+4|0;D=f[C>>2]|0;if((D|0)==(f[E+8>>2]|0)){Ci(E,e);F=f[t>>2]|0}else{f[D>>2]=f[e>>2];f[C>>2]=D+4;F=E}E=F+24|0;f[(f[F+12>>2]|0)+(B<<2)>>2]=f[E>>2];f[E>>2]=(f[E>>2]|0)+1;G=f[i>>2]|0}else G=A;A=f[h>>2]|0;if((G|0)==-1){H=93;break}E=G+1|0;D=((E>>>0)%3|0|0)==0?G+-2|0:E;if((D|0)==-1)I=-1;else I=f[(f[A+12>>2]|0)+(D<<2)>>2]|0;D=(((G>>>0)%3|0|0)==0?2:-1)+G|0;if((D|0)==-1)J=-1;else J=f[(f[A+12>>2]|0)+(D<<2)>>2]|0;D=(I|0)==-1;E=D?-1:(I>>>0)/3|0;C=(J|0)==-1;z=C?-1:(J>>>0)/3|0;if(D)K=1;else K=(f[(f[v>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)!=0;do if(C)if(K){H=93;break b}else H=82;else{if(f[(f[v>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)if(K){H=93;break b}else{H=82;break}E=f[(f[A>>2]|0)+(J<<2)>>2]|0;if(!(1<<(E&31)&f[(f[l>>2]|0)+(E>>>5<<2)>>2])){L=(f[p>>2]|0)+(E<<2)|0;E=f[L>>2]|0;f[L>>2]=E+1;M=(E|0)>0?1:2}else M=0;if(K?(M|0)<=(f[b>>2]|0):0){N=J;break}f[d>>2]=J;E=a+48+(M*12|0)+4|0;L=f[E>>2]|0;if((L|0)==(f[a+48+(M*12|0)+8>>2]|0))Ci(a+48+(M*12|0)|0,d);else{f[L>>2]=J;f[E>>2]=L+4}if((f[b>>2]|0)>(M|0))f[b>>2]=M;if(K){H=93;break b}else H=82}while(0);if((H|0)==82){H=0;if(D)O=-1;else O=f[(f[f[h>>2]>>2]|0)+(I<<2)>>2]|0;if(!(1<<(O&31)&f[(f[l>>2]|0)+(O>>>5<<2)>>2])){A=(f[p>>2]|0)+(O<<2)|0;z=f[A>>2]|0;f[A>>2]=z+1;P=(z|0)>0?1:2}else P=0;if((P|0)>(f[b>>2]|0))break;else N=I}f[i>>2]=N;k=N;m=f[v>>2]|0}if((H|0)==93){H=0;Q=f[b>>2]|0;break}f[d>>2]=I;m=a+48+(P*12|0)+4|0;k=f[m>>2]|0;if((k|0)==(f[a+48+(P*12|0)+8>>2]|0))Ci(a+48+(P*12|0)|0,d);else{f[k>>2]=I;f[m>>2]=k+4}k=f[b>>2]|0;if((k|0)>(P|0)){f[b>>2]=P;R=P}else R=k;Q=R}else Q=g;while(0);if((Q|0)<3)r=Q;else break a}u=c;return 1}while(0);f[i>>2]=-1;u=c;return 1}function wb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}wb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;wb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function xb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}xb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;xb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function yb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}yb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;yb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function zb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}zb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;zb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Ab(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ab(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ab(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}} function Bb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Bb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Bb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Cb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Cb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Cb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Db(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Db(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Db(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Eb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Eb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Eb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Fb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Fb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Fb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Gb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Gb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Gb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Hb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Hb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ib(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ib(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Jb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Jb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Jb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Kb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Kb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Lb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Lb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Mb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Mb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=Tf(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Cg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=Qd(h,Y,c)|0;j=Y+4|0;if(Qd(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Nb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Nb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)mq(d);_=$;if(i>>>0<=Y>>>0)mq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Cg(h,h+4|0,e,c)|0;return}case 12:{Qg(h,h+4|0,h+8|0,e,c)|0;return}case 13:{Tf(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{Pg(h,a,c);return}case 20:{mq(p);break}case 22:{mq(p);break}case 26:{mq(p);break}case 32:{mq(p);break}case 38:{mq(A);break}case 40:{mq(A);break}case 46:{mq(A);break}case 47:{mq(A);break}case 51:{mq(p);break}case 57:{mq(R);break}case 59:{mq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)mq(S);else mq(S);break}case 66:{mq(S);break}case 72:{mq(Z);break}case 74:{mq(Z);break}case 84:return}}function Ob(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=on(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Tn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=on(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Tn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=on(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Tn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(t|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~$(n[m>>2])>>>0;f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3]>>>0;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Pb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=on(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Tn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=on(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Tn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=on(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Tn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=on(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Tn(t|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=on(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Tn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~$(n[m>>2]);f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=on(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Tn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=on(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Tn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}hj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Qb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=Oa,J=0,K=0,L=0,M=0,N=Oa;e=u;u=u+48|0;g=e+36|0;h=e+24|0;i=e+12|0;j=e;if(!(ih(a,c,d)|0)){k=0;u=e;return k|0}l=f[(f[(f[c+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;if((f[l+28>>2]|0)!=9){k=0;u=e;return k|0}m=c+48|0;c=f[m>>2]|0;o=dn(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=17;p=o;q=12932;r=p+17|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+17>>0]=0;o=c+16|0;s=f[o>>2]|0;if(s){t=o;v=s;a:while(1){s=v;while(1){if((f[s+16>>2]|0)>=(d|0))break;w=f[s+4>>2]|0;if(!w){x=t;break a}else s=w}v=f[s>>2]|0;if(!v){x=s;break}else t=s}if(((x|0)!=(o|0)?(f[x+16>>2]|0)<=(d|0):0)?(o=x+20|0,(sh(o,g)|0)!=0):0)y=yk(o,g,-1)|0;else z=12}else z=12;if((z|0)==12)y=yk(c,g,-1)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if((y|0)<1){k=0;u=e;return k|0}c=f[m>>2]|0;o=dn(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=19;p=o;q=13005;r=p+19|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+19>>0]=0;o=c+16|0;x=f[o>>2]|0;if(x){t=o;v=x;b:while(1){x=v;while(1){if((f[x+16>>2]|0)>=(d|0))break;w=f[x+4>>2]|0;if(!w){A=t;break b}else x=w}v=f[x>>2]|0;if(!v){A=x;break}else t=x}if((A|0)!=(o|0)?(f[A+16>>2]|0)<=(d|0):0)B=A+20|0;else z=24}else z=24;if((z|0)==24)B=c;if(!(sh(B,g)|0))C=0;else{B=f[m>>2]|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;c=dn(32)|0;f[h>>2]=c;f[h+8>>2]=-2147483616;f[h+4>>2]=18;p=c;q=13025;r=p+18|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[c+18>>0]=0;c=B+16|0;A=f[c>>2]|0;if(A){o=c;t=A;c:while(1){A=t;while(1){if((f[A+16>>2]|0)>=(d|0))break;v=f[A+4>>2]|0;if(!v){D=o;break c}else A=v}t=f[A>>2]|0;if(!t){D=A;break}else o=A}if((D|0)!=(c|0)?(f[D+16>>2]|0)<=(d|0):0)E=D+20|0;else z=34}else z=34;if((z|0)==34)E=B;B=(sh(E,h)|0)!=0;if((b[h+11>>0]|0)<0)br(f[h>>2]|0);C=B}if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if(!C){Kd(a+40|0,l,y)|0;k=1;u=e;return k|0}C=l+24|0;l=b[C>>0]|0;B=l<<24>>24;f[i>>2]=0;E=i+4|0;f[E>>2]=0;f[i+8>>2]=0;do if(l<<24>>24)if(l<<24>>24<0)mq(i);else{D=B<<2;c=dn(D)|0;f[i>>2]=c;o=c+(B<<2)|0;f[i+8>>2]=o;hj(c|0,0,D|0)|0;f[E>>2]=o;F=c;break}else F=0;while(0);B=f[m>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;l=dn(32)|0;f[j>>2]=l;f[j+8>>2]=-2147483616;f[j+4>>2]=19;p=l;q=13005;r=p+19|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[l+19>>0]=0;l=b[C>>0]|0;c=l<<24>>24;o=B+16|0;D=f[o>>2]|0;if(D){t=o;x=D;d:while(1){D=x;while(1){if((f[D+16>>2]|0)>=(d|0))break;v=f[D+4>>2]|0;if(!v){G=t;break d}else D=v}x=f[D>>2]|0;if(!x){G=D;break}else t=D}if(((G|0)!=(o|0)?(f[G+16>>2]|0)<=(d|0):0)?(o=G+20|0,(sh(o,j)|0)!=0):0){t=zg(o,j)|0;if((t|0)!=(G+24|0)){dj(g,t+28|0);t=g+11|0;G=b[t>>0]|0;o=G<<24>>24<0;if(!((o?f[g+4>>2]|0:G&255)|0))H=G;else{if(l<<24>>24>0){x=o?f[g>>2]|0:g;o=0;do{I=$(pq(x,h));A=x;x=f[h>>2]|0;if((A|0)==(x|0))break;n[F+(o<<2)>>2]=I;o=o+1|0}while((o|0)<(c|0));J=b[t>>0]|0}else J=G;H=J}if(H<<24>>24<0)br(f[g>>2]|0)}}else z=64}else z=64;if((z|0)==64?(H=zg(B,j)|0,(H|0)!=(B+4|0)):0){dj(g,H+28|0);H=g+11|0;B=b[H>>0]|0;J=B<<24>>24<0;if(!((J?f[g+4>>2]|0:B&255)|0))K=B;else{if(l<<24>>24>0){l=J?f[g>>2]|0:g;J=0;do{I=$(pq(l,h));G=l;l=f[h>>2]|0;if((G|0)==(l|0))break;n[F+(J<<2)>>2]=I;J=J+1|0}while((J|0)<(c|0));L=b[H>>0]|0}else L=B;K=L}if(K<<24>>24<0)br(f[g>>2]|0)}if((b[j+11>>0]|0)<0)br(f[j>>2]|0);j=f[m>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;m=dn(32)|0;f[g>>2]=m;f[g+8>>2]=-2147483616;f[g+4>>2]=18;p=m;q=13025;r=p+18|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[m+18>>0]=0;m=j+16|0;q=f[m>>2]|0;if(q){p=m;r=q;e:while(1){q=r;while(1){if((f[q+16>>2]|0)>=(d|0))break;K=f[q+4>>2]|0;if(!K){M=p;break e}else q=K}r=f[q>>2]|0;if(!r){M=q;break}else p=q}if(((M|0)!=(m|0)?(f[M+16>>2]|0)<=(d|0):0)?(d=M+20|0,(sh(d,g)|0)!=0):0)N=$(kk(d,g,$(1.0)));else z=86}else z=86;if((z|0)==86)N=$(kk(j,g,$(1.0)));if((b[g+11>>0]|0)<0)br(f[g>>2]|0);wl(a+40|0,y,f[i>>2]|0,b[C>>0]|0,N);C=f[i>>2]|0;if(C|0){i=f[E>>2]|0;if((i|0)!=(C|0))f[E>>2]=i+(~((i+-4-C|0)>>>2)<<2);br(C)}k=1;u=e;return k|0}function Rb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=u;u=u+64|0;d=e+48|0;h=e+36|0;i=e+24|0;j=e+16|0;k=e+8|0;l=e;m=e+32|0;n=a+60|0;f[a+68>>2]=g;g=a+108|0;lk(g);o=a+56|0;p=f[o>>2]|0;q=(f[p+4>>2]|0)-(f[p>>2]|0)|0;r=q>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;s=i;f[s>>2]=0;f[s+4>>2]=0;s=j;f[s>>2]=0;f[s+4>>2]=0;s=k;f[s>>2]=0;f[s+4>>2]=0;s=l;f[s>>2]=0;f[s+4>>2]=0;if((q|0)<=0){u=e;return 1}q=h+4|0;s=h+8|0;t=a+104|0;v=i+4|0;w=a+100|0;x=j+4|0;y=a+8|0;z=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;D=a+20|0;E=a+24|0;F=a+96|0;a=k+4|0;G=l+4|0;H=f[p>>2]|0;if((f[p+4>>2]|0)==(H|0)){J=p;mq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];fc(n,d,h);H=f[h>>2]|0;p=(H|0)>-1?H:0-H|0;M=f[q>>2]|0;N=(M|0)>-1?M:0-M|0;O=Tn(N|0,((N|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=f[s>>2]|0;N=(p|0)>-1;P=N?p:0-p|0;p=Tn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((p|0)==0&(P|0)==0){O=f[t>>2]|0;Q=O;R=h;S=M;T=O}else{O=f[t>>2]|0;U=((O|0)<0)<<31>>31;V=on(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=zk(V|0,I|0,p|0,P|0)|0;f[h>>2]=H;V=on(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=zk(V|0,I|0,p|0,P|0)|0;f[q>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=s;S=M;T=O}f[R>>2]=Q;O=f[h>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[s>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[s>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[s>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){p=(N|0)==(Z|0);if(!(P&p)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(p&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);f[i>>2]=$;f[v>>2]=aa;P=0-S|0;M=0-_|0;f[h>>2]=0-O;f[q>>2]=P;f[s>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(p=(N|0)==(ca|0),!(M&p)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(p&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);f[j>>2]=da;f[x>>2]=ea;N=K<<1;M=b+(N<<2)|0;H=f[y>>2]|0;if((H|0)>0){O=0;P=i;p=H;while(1){if((p|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;U=f[z>>2]|0;if((V|0)>(U|0)){fa=f[A>>2]|0;f[fa+(H<<2)>>2]=U;ga=fa}else{fa=f[B>>2]|0;U=f[A>>2]|0;f[U+(H<<2)>>2]=(V|0)<(fa|0)?fa:V;ga=U}H=H+1|0;U=f[y>>2]|0}while((H|0)<(U|0));ha=ga;ia=U}else{ha=f[A>>2]|0;ia=p}H=(f[M+(O<<2)>>2]|0)-(f[ha+(O<<2)>>2]|0)|0;U=k+(O<<2)|0;f[U>>2]=H;ja=f[C>>2]|0;if((H|0)>=(ja|0)){if((H|0)>(f[E>>2]|0)){ka=H-(f[D>>2]|0)|0;la=52}}else{ka=(f[D>>2]|0)+H|0;la=52}if((la|0)==52){la=0;f[U>>2]=ka}O=O+1|0;if((O|0)>=(ia|0))break;else{P=ha;p=ia}}if((ia|0)>0){p=0;P=j;O=ia;U=ja;while(1){if((O|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;fa=f[z>>2]|0;if((V|0)>(fa|0))f[ha+(H<<2)>>2]=fa;else{fa=f[B>>2]|0;f[ha+(H<<2)>>2]=(V|0)<(fa|0)?fa:V}H=H+1|0;ma=f[y>>2]|0}while((H|0)<(ma|0));na=f[C>>2]|0;oa=ma}else{na=U;oa=O}H=(f[M+(p<<2)>>2]|0)-(f[ha+(p<<2)>>2]|0)|0;V=l+(p<<2)|0;f[V>>2]=H;if((H|0)>=(na|0)){if((H|0)>(f[E>>2]|0)){pa=H-(f[D>>2]|0)|0;la=65}}else{pa=(f[D>>2]|0)+H|0;la=65}if((la|0)==65){la=0;f[V>>2]=pa}p=p+1|0;if((p|0)>=(oa|0))break;else{P=ha;O=oa;U=na}}}}U=f[k>>2]|0;O=f[t>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))qa=(f[F>>2]|0)+U|0;else qa=U;else qa=U-(f[F>>2]|0)|0;f[k>>2]=qa;U=f[a>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ra=(f[F>>2]|0)+U|0;else ra=U;else ra=U-(f[F>>2]|0)|0;f[a>>2]=ra;U=f[l>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))sa=(f[F>>2]|0)+U|0;else sa=U;else sa=U-(f[F>>2]|0)|0;f[l>>2]=sa;U=f[G>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ta=(f[F>>2]|0)+U|0;else ta=U;else ta=U-(f[F>>2]|0)|0;f[G>>2]=ta;if((((ra|0)>-1?ra:0-ra|0)+((qa|0)>-1?qa:0-qa|0)|0)<(((sa|0)>-1?sa:0-sa|0)+((ta|0)>-1?ta:0-ta|0)|0)){Vi(g,0);ua=k}else{Vi(g,1);ua=l}U=f[ua>>2]|0;if((U|0)<0)va=(f[F>>2]|0)+U|0;else va=U;U=c+(N<<2)|0;f[U>>2]=va;O=f[ua+4>>2]|0;if((O|0)<0)wa=(f[F>>2]|0)+O|0;else wa=O;f[U+4>>2]=wa;K=K+1|0;if((K|0)>=(r|0)){la=3;break}U=f[o>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=K>>>0){J=U;la=4;break}}if((la|0)==3){u=e;return 1}else if((la|0)==4)mq(J);return 0}function Sb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=u;u=u+64|0;d=e+48|0;h=e+36|0;i=e+24|0;j=e+16|0;k=e+8|0;l=e;m=e+32|0;n=a+60|0;f[a+68>>2]=g;g=a+108|0;lk(g);o=a+56|0;p=f[o>>2]|0;q=(f[p+4>>2]|0)-(f[p>>2]|0)|0;r=q>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;s=i;f[s>>2]=0;f[s+4>>2]=0;s=j;f[s>>2]=0;f[s+4>>2]=0;s=k;f[s>>2]=0;f[s+4>>2]=0;s=l;f[s>>2]=0;f[s+4>>2]=0;if((q|0)<=0){u=e;return 1}q=h+4|0;s=h+8|0;t=a+104|0;v=i+4|0;w=a+100|0;x=j+4|0;y=a+8|0;z=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;D=a+20|0;E=a+24|0;F=a+96|0;a=k+4|0;G=l+4|0;H=f[p>>2]|0;if((f[p+4>>2]|0)==(H|0)){J=p;mq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];$b(n,d,h);H=f[h>>2]|0;p=(H|0)>-1?H:0-H|0;M=f[q>>2]|0;N=(M|0)>-1?M:0-M|0;O=Tn(N|0,((N|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=f[s>>2]|0;N=(p|0)>-1;P=N?p:0-p|0;p=Tn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((p|0)==0&(P|0)==0){O=f[t>>2]|0;Q=O;R=h;S=M;T=O}else{O=f[t>>2]|0;U=((O|0)<0)<<31>>31;V=on(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=zk(V|0,I|0,p|0,P|0)|0;f[h>>2]=H;V=on(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=zk(V|0,I|0,p|0,P|0)|0;f[q>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=s;S=M;T=O}f[R>>2]=Q;O=f[h>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[s>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[s>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[s>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){p=(N|0)==(Z|0);if(!(P&p)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(p&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);f[i>>2]=$;f[v>>2]=aa;P=0-S|0;M=0-_|0;f[h>>2]=0-O;f[q>>2]=P;f[s>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(p=(N|0)==(ca|0),!(M&p)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(p&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);f[j>>2]=da;f[x>>2]=ea;N=K<<1;M=b+(N<<2)|0;H=f[y>>2]|0;if((H|0)>0){O=0;P=i;p=H;while(1){if((p|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;U=f[z>>2]|0;if((V|0)>(U|0)){fa=f[A>>2]|0;f[fa+(H<<2)>>2]=U;ga=fa}else{fa=f[B>>2]|0;U=f[A>>2]|0;f[U+(H<<2)>>2]=(V|0)<(fa|0)?fa:V;ga=U}H=H+1|0;U=f[y>>2]|0}while((H|0)<(U|0));ha=ga;ia=U}else{ha=f[A>>2]|0;ia=p}H=(f[M+(O<<2)>>2]|0)-(f[ha+(O<<2)>>2]|0)|0;U=k+(O<<2)|0;f[U>>2]=H;ja=f[C>>2]|0;if((H|0)>=(ja|0)){if((H|0)>(f[E>>2]|0)){ka=H-(f[D>>2]|0)|0;la=52}}else{ka=(f[D>>2]|0)+H|0;la=52}if((la|0)==52){la=0;f[U>>2]=ka}O=O+1|0;if((O|0)>=(ia|0))break;else{P=ha;p=ia}}if((ia|0)>0){p=0;P=j;O=ia;U=ja;while(1){if((O|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;fa=f[z>>2]|0;if((V|0)>(fa|0))f[ha+(H<<2)>>2]=fa;else{fa=f[B>>2]|0;f[ha+(H<<2)>>2]=(V|0)<(fa|0)?fa:V}H=H+1|0;ma=f[y>>2]|0}while((H|0)<(ma|0));na=f[C>>2]|0;oa=ma}else{na=U;oa=O}H=(f[M+(p<<2)>>2]|0)-(f[ha+(p<<2)>>2]|0)|0;V=l+(p<<2)|0;f[V>>2]=H;if((H|0)>=(na|0)){if((H|0)>(f[E>>2]|0)){pa=H-(f[D>>2]|0)|0;la=65}}else{pa=(f[D>>2]|0)+H|0;la=65}if((la|0)==65){la=0;f[V>>2]=pa}p=p+1|0;if((p|0)>=(oa|0))break;else{P=ha;O=oa;U=na}}}}U=f[k>>2]|0;O=f[t>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))qa=(f[F>>2]|0)+U|0;else qa=U;else qa=U-(f[F>>2]|0)|0;f[k>>2]=qa;U=f[a>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ra=(f[F>>2]|0)+U|0;else ra=U;else ra=U-(f[F>>2]|0)|0;f[a>>2]=ra;U=f[l>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))sa=(f[F>>2]|0)+U|0;else sa=U;else sa=U-(f[F>>2]|0)|0;f[l>>2]=sa;U=f[G>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ta=(f[F>>2]|0)+U|0;else ta=U;else ta=U-(f[F>>2]|0)|0;f[G>>2]=ta;if((((ra|0)>-1?ra:0-ra|0)+((qa|0)>-1?qa:0-qa|0)|0)<(((sa|0)>-1?sa:0-sa|0)+((ta|0)>-1?ta:0-ta|0)|0)){Vi(g,0);ua=k}else{Vi(g,1);ua=l}U=f[ua>>2]|0;if((U|0)<0)va=(f[F>>2]|0)+U|0;else va=U;U=c+(N<<2)|0;f[U>>2]=va;O=f[ua+4>>2]|0;if((O|0)<0)wa=(f[F>>2]|0)+O|0;else wa=O;f[U+4>>2]=wa;K=K+1|0;if((K|0)>=(r|0)){la=3;break}U=f[o>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=K>>>0){J=U;la=4;break}}if((la|0)==3){u=e;return 1}else if((la|0)==4)mq(J);return 0}function Tb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){h=1;u=c;return h|0}i=(g>>>0)/3|0;j=a+24|0;if(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0){h=1;u=c;return h|0}i=a+48|0;k=f[i>>2]|0;l=a+52|0;m=f[l>>2]|0;if((m|0)==(k|0))n=k;else{o=m+(~((m+-4-k|0)>>>2)<<2)|0;f[l>>2]=o;n=o}o=a+56|0;if((n|0)==(f[o>>2]|0))Ci(i,b);else{f[n>>2]=g;f[l>>2]=n+4}n=a+4|0;g=f[n>>2]|0;k=f[b>>2]|0;m=k+1|0;do if((k|0)!=-1){p=f[g+28>>2]|0;q=f[p+((((m>>>0)%3|0|0)==0?k+-2|0:m)<<2)>>2]|0;if(!((k>>>0)%3|0)){r=q;s=k+2|0;t=p;break}else{r=q;s=k+-1|0;t=p;break}}else{p=f[g+28>>2]|0;r=f[p+-4>>2]|0;s=-1;t=p}while(0);g=f[t+(s<<2)>>2]|0;if((r|0)==-1|(g|0)==-1){h=0;u=c;return h|0}s=a+36|0;t=f[s>>2]|0;k=t+(r>>>5<<2)|0;m=1<<(r&31);p=f[k>>2]|0;if(!(p&m)){f[k>>2]=p|m;m=f[b>>2]|0;p=m+1|0;if((m|0)==-1)v=-1;else v=((p>>>0)%3|0|0)==0?m+-2|0:p;f[e>>2]=v;p=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((v>>>0)/3|0)*12|0)+(((v>>>0)%3|0)<<2)>>2]|0;v=f[a+20>>2]|0;f[d>>2]=p;m=f[v+4>>2]|0;v=m+4|0;k=f[v>>2]|0;if((k|0)==(f[m+8>>2]|0))Ci(m,d);else{f[k>>2]=p;f[v>>2]=k+4}k=a+12|0;v=f[k>>2]|0;p=v+4|0;m=f[p>>2]|0;if((m|0)==(f[v+8>>2]|0)){Ci(v,e);w=f[k>>2]|0}else{f[m>>2]=f[e>>2];f[p>>2]=m+4;w=v}v=w+24|0;f[(f[w+12>>2]|0)+(r<<2)>>2]=f[v>>2];f[v>>2]=(f[v>>2]|0)+1;x=f[s>>2]|0}else x=t;t=x+(g>>>5<<2)|0;x=1<<(g&31);v=f[t>>2]|0;if(!(v&x)){f[t>>2]=v|x;x=f[b>>2]|0;do if((x|0)!=-1)if(!((x>>>0)%3|0)){y=x+2|0;break}else{y=x+-1|0;break}else y=-1;while(0);f[e>>2]=y;x=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((y>>>0)/3|0)*12|0)+(((y>>>0)%3|0)<<2)>>2]|0;y=f[a+20>>2]|0;f[d>>2]=x;v=f[y+4>>2]|0;y=v+4|0;t=f[y>>2]|0;if((t|0)==(f[v+8>>2]|0))Ci(v,d);else{f[t>>2]=x;f[y>>2]=t+4}t=a+12|0;y=f[t>>2]|0;x=y+4|0;v=f[x>>2]|0;if((v|0)==(f[y+8>>2]|0)){Ci(y,e);z=f[t>>2]|0}else{f[v>>2]=f[e>>2];f[x>>2]=v+4;z=y}y=z+24|0;f[(f[z+12>>2]|0)+(g<<2)>>2]=f[y>>2];f[y>>2]=(f[y>>2]|0)+1}y=f[i>>2]|0;g=f[l>>2]|0;if((y|0)==(g|0)){h=1;u=c;return h|0}z=a+16|0;v=a+20|0;x=a+12|0;a=g;g=y;a:while(1){y=f[a+-4>>2]|0;f[b>>2]=y;t=(y>>>0)/3|0;if((y|0)!=-1?(y=(f[j>>2]|0)+(t>>>5<<2)|0,r=1<<(t&31),t=f[y>>2]|0,(t&r|0)==0):0){f[y>>2]=t|r;r=f[n>>2]|0;t=f[b>>2]|0;y=f[(f[r+28>>2]|0)+(t<<2)>>2]|0;if((y|0)==-1){h=0;A=79;break}else{B=y;C=r;D=t}b:while(1){t=(f[s>>2]|0)+(B>>>5<<2)|0;r=1<<(B&31);y=f[t>>2]|0;do if(!(y&r)){w=f[(f[C+40>>2]|0)+(B<<2)>>2]|0;if((w|0)==-1)E=1;else{m=f[(f[f[C+64>>2]>>2]|0)+(w<<2)>>2]|0;E=(1<<(m&31)&f[(f[C+12>>2]|0)+(m>>>5<<2)>>2]|0)!=0}f[t>>2]=y|r;m=f[b>>2]|0;f[e>>2]=m;w=f[(f[(f[z>>2]|0)+96>>2]|0)+(((m>>>0)/3|0)*12|0)+(((m>>>0)%3|0)<<2)>>2]|0;m=f[v>>2]|0;f[d>>2]=w;p=f[m+4>>2]|0;m=p+4|0;k=f[m>>2]|0;if((k|0)==(f[p+8>>2]|0))Ci(p,d);else{f[k>>2]=w;f[m>>2]=k+4}k=f[x>>2]|0;m=k+4|0;w=f[m>>2]|0;if((w|0)==(f[k+8>>2]|0)){Ci(k,e);F=f[x>>2]|0}else{f[w>>2]=f[e>>2];f[m>>2]=w+4;F=k}k=F+24|0;f[(f[F+12>>2]|0)+(B<<2)>>2]=f[k>>2];f[k>>2]=(f[k>>2]|0)+1;k=f[n>>2]|0;w=f[b>>2]|0;if(E){G=w;H=k;A=59;break}m=w+1|0;do if((w|0)==-1)I=-1;else{p=((m>>>0)%3|0|0)==0?w+-2|0:m;if((p|0)==-1){I=-1;break}if(f[(f[k>>2]|0)+(p>>>5<<2)>>2]&1<<(p&31)|0){I=-1;break}I=f[(f[(f[k+64>>2]|0)+12>>2]|0)+(p<<2)>>2]|0}while(0);f[b>>2]=I;J=(I>>>0)/3|0;K=k}else{G=D;H=C;A=59}while(0);if((A|0)==59){A=0;r=G+1|0;if((G|0)==-1){A=60;break}y=((r>>>0)%3|0|0)==0?G+-2|0:r;do if((y|0)==-1)L=-1;else{if(f[(f[H>>2]|0)+(y>>>5<<2)>>2]&1<<(y&31)|0){L=-1;break}L=f[(f[(f[H+64>>2]|0)+12>>2]|0)+(y<<2)>>2]|0}while(0);f[d>>2]=L;y=(((G>>>0)%3|0|0)==0?2:-1)+G|0;do if((y|0)==-1)M=-1;else{if(f[(f[H>>2]|0)+(y>>>5<<2)>>2]&1<<(y&31)|0){M=-1;break}M=f[(f[(f[H+64>>2]|0)+12>>2]|0)+(y<<2)>>2]|0}while(0);y=(L|0)==-1;r=(L>>>0)/3|0;t=y?-1:r;m=(M|0)==-1;w=(M>>>0)/3|0;p=m?-1:w;do if(!y){q=f[j>>2]|0;if(f[q+(t>>>5<<2)>>2]&1<<(t&31)|0){A=69;break}if(m){N=L;O=r;break}if(!(f[q+(p>>>5<<2)>>2]&1<<(p&31))){A=74;break b}else{N=L;O=r}}else A=69;while(0);if((A|0)==69){A=0;if(m){A=71;break}if(!(f[(f[j>>2]|0)+(p>>>5<<2)>>2]&1<<(p&31))){N=M;O=w}else{A=71;break}}f[b>>2]=N;J=O;K=H}r=(f[j>>2]|0)+(J>>>5<<2)|0;f[r>>2]=f[r>>2]|1<<(J&31);D=f[b>>2]|0;B=f[(f[K+28>>2]|0)+(D<<2)>>2]|0;if((B|0)==-1){h=0;A=79;break a}else C=K}do if((A|0)==60){A=0;f[d>>2]=-1;A=71}else if((A|0)==74){A=0;r=f[l>>2]|0;f[r+-4>>2]=M;if((r|0)==(f[o>>2]|0)){Ci(i,d);P=f[l>>2]|0;break}else{f[r>>2]=f[d>>2];t=r+4|0;f[l>>2]=t;P=t;break}}while(0);if((A|0)==71){A=0;t=(f[l>>2]|0)+-4|0;f[l>>2]=t;P=t}Q=f[i>>2]|0;R=P}else{t=a+-4|0;f[l>>2]=t;Q=g;R=t}if((Q|0)==(R|0)){h=1;A=79;break}else{a=R;g=Q}}if((A|0)==79){u=c;return h|0}return 0}function Ub(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,Y=Oa,Z=0,_=0,aa=0,ba=0;d=u;u=u+16|0;e=d;g=a+16|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;n[g>>2]=$(1.0);i=a+20|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[a+36>>2]=$(1.0);j=f[c+8>>2]|0;a:do if(j|0){k=a+4|0;l=a+12|0;m=a+8|0;o=j;p=j;while(1){q=o+8|0;r=b[q+11>>0]|0;s=r<<24>>24<0;t=s?f[q>>2]|0:q;v=s?f[o+12>>2]|0:r&255;if(v>>>0>3){r=t;s=v;w=v;while(1){x=X(h[r>>0]|h[r+1>>0]<<8|h[r+2>>0]<<16|h[r+3>>0]<<24,1540483477)|0;s=(X(x>>>24^x,1540483477)|0)^(X(s,1540483477)|0);w=w+-4|0;if(w>>>0<=3)break;else r=r+4|0}r=v+-4|0;w=r&-4;y=r-w|0;z=t+(w+4)|0;A=s}else{y=v;z=t;A=v}switch(y|0){case 3:{B=h[z+2>>0]<<16^A;C=8;break}case 2:{B=A;C=8;break}case 1:{D=A;C=9;break}default:E=A}if((C|0)==8){C=0;D=h[z+1>>0]<<8^B;C=9}if((C|0)==9){C=0;E=X(D^h[z>>0],1540483477)|0}w=X(E>>>13^E,1540483477)|0;r=w>>>15^w;w=f[k>>2]|0;x=(w|0)==0;b:do if(!x){F=w+-1|0;G=(F&w|0)==0;if(!G)if(r>>>0>>0)H=r;else H=(r>>>0)%(w>>>0)|0;else H=r&F;I=f[(f[a>>2]|0)+(H<<2)>>2]|0;if((I|0)!=0?(J=f[I>>2]|0,(J|0)!=0):0){I=(v|0)==0;if(G){if(I){G=J;while(1){K=f[G+4>>2]|0;if(!((K|0)==(r|0)|(K&F|0)==(H|0))){L=H;C=50;break b}K=b[G+8+11>>0]|0;if(!((K<<24>>24<0?f[G+12>>2]|0:K&255)|0))break b;G=f[G>>2]|0;if(!G){L=H;C=50;break b}}}else M=J;while(1){G=f[M+4>>2]|0;if(!((G|0)==(r|0)|(G&F|0)==(H|0))){L=H;C=50;break b}G=M+8|0;K=b[G+11>>0]|0;N=K<<24>>24<0;O=K&255;do if(((N?f[M+12>>2]|0:O)|0)==(v|0)){K=f[G>>2]|0;if(N)if(!(Pk(K,t,v)|0))break b;else break;if((b[t>>0]|0)==(K&255)<<24>>24){K=G;P=O;Q=t;do{P=P+-1|0;K=K+1|0;if(!P)break b;Q=Q+1|0}while((b[K>>0]|0)==(b[Q>>0]|0))}}while(0);M=f[M>>2]|0;if(!M){L=H;C=50;break b}}}if(I){F=J;while(1){O=f[F+4>>2]|0;if((O|0)!=(r|0)){if(O>>>0>>0)R=O;else R=(O>>>0)%(w>>>0)|0;if((R|0)!=(H|0)){L=H;C=50;break b}}O=b[F+8+11>>0]|0;if(!((O<<24>>24<0?f[F+12>>2]|0:O&255)|0))break b;F=f[F>>2]|0;if(!F){L=H;C=50;break b}}}else S=J;while(1){F=f[S+4>>2]|0;if((F|0)!=(r|0)){if(F>>>0>>0)T=F;else T=(F>>>0)%(w>>>0)|0;if((T|0)!=(H|0)){L=H;C=50;break b}}F=S+8|0;I=b[F+11>>0]|0;O=I<<24>>24<0;G=I&255;do if(((O?f[S+12>>2]|0:G)|0)==(v|0)){I=f[F>>2]|0;if(O)if(!(Pk(I,t,v)|0))break b;else break;if((b[t>>0]|0)==(I&255)<<24>>24){I=F;N=G;Q=t;do{N=N+-1|0;I=I+1|0;if(!N)break b;Q=Q+1|0}while((b[I>>0]|0)==(b[Q>>0]|0))}}while(0);S=f[S>>2]|0;if(!S){L=H;C=50;break}}}else{L=H;C=50}}else{L=0;C=50}while(0);if((C|0)==50){C=0;pi(e,a,r,q);U=$(((f[l>>2]|0)+1|0)>>>0);V=$(w>>>0);Y=$(n[g>>2]);do if(x|$(Y*V)>>0<3|(w+-1&w|0)!=0)&1;v=~~$(W($(U/Y)))>>>0;Ph(a,t>>>0>>0?v:t);t=f[k>>2]|0;v=t+-1|0;if(!(v&t)){Z=t;_=v&r;break}if(r>>>0>>0){Z=t;_=r}else{Z=t;_=(r>>>0)%(t>>>0)|0}}else{Z=w;_=L}while(0);w=f[(f[a>>2]|0)+(_<<2)>>2]|0;if(!w){f[f[e>>2]>>2]=f[m>>2];f[m>>2]=f[e>>2];f[(f[a>>2]|0)+(_<<2)>>2]=m;r=f[e>>2]|0;x=f[r>>2]|0;if(x|0){q=f[x+4>>2]|0;x=Z+-1|0;if(x&Z)if(q>>>0>>0)aa=q;else aa=(q>>>0)%(Z>>>0)|0;else aa=q&x;f[(f[a>>2]|0)+(aa<<2)>>2]=r}}else{f[f[e>>2]>>2]=f[w>>2];f[w>>2]=f[e>>2]}f[l>>2]=(f[l>>2]|0)+1}w=f[p>>2]|0;if(!w)break a;else{o=w;p=w}}}while(0);e=f[c+28>>2]|0;if(!e){u=d;return}else ba=e;do{e=ba;c=dn(40)|0;Ub(c,f[e+20>>2]|0);aa=xc(i,e+8|0)|0;e=f[aa>>2]|0;f[aa>>2]=c;if(e|0){c=f[e+28>>2]|0;if(c|0){aa=c;do{c=aa;aa=f[aa>>2]|0;bi(c+8|0);br(c)}while((aa|0)!=0)}aa=e+20|0;c=f[aa>>2]|0;f[aa>>2]=0;if(c|0)br(c);c=f[e+8>>2]|0;if(c|0){aa=c;do{c=aa;aa=f[aa>>2]|0;a=c+8|0;Z=f[c+20>>2]|0;if(Z|0){_=c+24|0;if((f[_>>2]|0)!=(Z|0))f[_>>2]=Z;br(Z)}if((b[a+11>>0]|0)<0)br(f[a>>2]|0);br(c)}while((aa|0)!=0)}aa=f[e>>2]|0;f[e>>2]=0;if(aa|0)br(aa);br(e)}ba=f[ba>>2]|0}while((ba|0)!=0);u=d;return}function Vb(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+16|0;j=g+12|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=r;z=0;A=0;B=r;C=r;D=0;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=on(f[r>>2]|0,f[r+4>>2]|0,y+z|0,0)|0;r=Tn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8|h[G+2>>0]<<16|h[G+3>>0]<<24;f[j>>2]=r;G=r&65535;F=r>>>16;H=F&65535;J=(r&65535^318)+239^F;F=(D|0)==0;a:do if(!F){K=D+-1|0;L=(K&D|0)==0;if(!L)if(J>>>0>>0)M=J;else M=(J>>>0)%(D>>>0)|0;else M=J&K;N=f[(f[i>>2]|0)+(M<<2)>>2]|0;do if(N|0?(O=f[N>>2]|0,O|0):0){b:do if(L){P=O;while(1){Q=f[P+4>>2]|0;R=(Q|0)==(J|0);if(!(R|(Q&K|0)==(M|0))){S=27;break b}if((R?(R=P+8|0,(d[R>>1]|0)==G<<16>>16):0)?(d[R+2>>1]|0)==H<<16>>16:0){T=P;S=26;break b}P=f[P>>2]|0;if(!P){S=27;break}}}else{P=O;while(1){R=f[P+4>>2]|0;if((R|0)==(J|0)){Q=P+8|0;if((d[Q>>1]|0)==G<<16>>16?(d[Q+2>>1]|0)==H<<16>>16:0){T=P;S=26;break b}}else{if(R>>>0>>0)U=R;else U=(R>>>0)%(D>>>0)|0;if((U|0)!=(M|0)){S=27;break b}}P=f[P>>2]|0;if(!P){S=27;break}}}while(0);if((S|0)==26){S=0;f[E+(z<<2)>>2]=f[T+12>>2];V=e;X=A;Y=C;Z=B;_=E;break a}else if((S|0)==27){S=0;if(F){aa=0;S=46;break a}else break}}while(0);K=D+-1|0;L=(K&D|0)==0;if(!L)if(J>>>0>>0)ba=J;else ba=(J>>>0)%(D>>>0)|0;else ba=K&J;N=f[(f[i>>2]|0)+(ba<<2)>>2]|0;if((N|0)!=0?(O=f[N>>2]|0,(O|0)!=0):0){if(L){L=O;while(1){N=f[L+4>>2]|0;if(!((N|0)==(J|0)|(N&K|0)==(ba|0))){aa=ba;S=46;break a}N=L+8|0;if((d[N>>1]|0)==G<<16>>16?(d[N+2>>1]|0)==H<<16>>16:0){S=61;break a}L=f[L>>2]|0;if(!L){aa=ba;S=46;break a}}}else ca=O;while(1){L=f[ca+4>>2]|0;if((L|0)!=(J|0)){if(L>>>0>>0)da=L;else da=(L>>>0)%(D>>>0)|0;if((da|0)!=(ba|0)){aa=ba;S=46;break a}}L=ca+8|0;if((d[L>>1]|0)==G<<16>>16?(d[L+2>>1]|0)==H<<16>>16:0){S=61;break a}ca=f[ca>>2]|0;if(!ca){aa=ba;S=46;break}}}else{aa=ba;S=46}}else{aa=0;S=46}while(0);if((S|0)==46){S=0;H=dn(16)|0;G=H+8|0;d[G>>1]=r;d[G+2>>1]=r>>>16;f[H+12>>2]=A;f[H+4>>2]=J;f[H>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(D>>>0);ga=$(n[l>>2]);do if(F|$(ga*fa)>>0<3|(D+-1&D|0)!=0)&1;O=~~$(W($(ea/ga)))>>>0;Eh(i,G>>>0>>0?O:G);G=f[o>>2]|0;O=G+-1|0;if(!(O&G)){ha=G;ia=O&J;break}if(J>>>0>>0){ha=G;ia=J}else{ha=G;ia=(J>>>0)%(G>>>0)|0}}else{ha=D;ia=aa}while(0);J=(f[i>>2]|0)+(ia<<2)|0;F=f[J>>2]|0;if(!F){f[H>>2]=f[v>>2];f[v>>2]=H;f[J>>2]=v;J=f[H>>2]|0;if(J|0){r=f[J+4>>2]|0;J=ha+-1|0;if(J&ha)if(r>>>0>>0)ja=r;else ja=(r>>>0)%(ha>>>0)|0;else ja=r&J;ka=(f[i>>2]|0)+(ja<<2)|0;S=59}}else{f[H>>2]=f[F>>2];ka=F;S=59}if((S|0)==59){S=0;f[ka>>2]=H}f[t>>2]=(f[t>>2]|0)+1;S=61}if((S|0)==61){S=0;F=w;J=f[F>>2]|0;r=on(J|0,f[F+4>>2]|0,A|0,0)|0;Rg((f[f[x>>2]>>2]|0)+r|0,j|0,J|0)|0;J=f[k>>2]|0;f[J+(z<<2)>>2]=A;V=J;X=A+1|0;Y=J;Z=J;_=J}J=z+1|0;la=f[m>>2]|0;if(J>>>0>=la>>>0)break;e=V;z=J;A=X;B=Z;C=Y;D=f[o>>2]|0;E=_}if((X|0)==(la|0))ma=Z;else{Z=a+84|0;if(!(b[Z>>0]|0)){_=f[a+72>>2]|0;E=f[a+68>>2]|0;o=E;if((_|0)==(E|0))na=V;else{D=_-E>>2;E=0;do{_=o+(E<<2)|0;f[_>>2]=f[Y+(f[_>>2]<<2)>>2];E=E+1|0}while(E>>>0>>0);na=V}}else{b[Z>>0]=0;Z=a+68|0;V=a+72|0;D=f[V>>2]|0;E=f[Z>>2]|0;Y=D-E>>2;o=E;E=D;if(la>>>0<=Y>>>0)if(la>>>0>>0?(D=o+(la<<2)|0,(D|0)!=(E|0)):0){f[V>>2]=E+(~((E+-4-D|0)>>>2)<<2);oa=la}else oa=la;else{kh(Z,la-Y|0,1204);oa=f[m>>2]|0}Y=f[k>>2]|0;if(!oa)na=Y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[Y+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);na=Y}}f[m>>2]=X;ma=na}if(!ma)pa=X;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);br(ma);pa=X}}else pa=0;X=f[i+8>>2]|0;if(X|0){ma=X;do{X=ma;ma=f[ma>>2]|0;br(X)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}br(ma);u=g;return pa|0}function Wb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){h=1;u=c;return h|0}i=(g>>>0)/3|0;j=a+24|0;if(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0){h=1;u=c;return h|0}i=a+48|0;k=f[i>>2]|0;l=a+52|0;m=f[l>>2]|0;if((m|0)==(k|0))n=k;else{o=m+(~((m+-4-k|0)>>>2)<<2)|0;f[l>>2]=o;n=o}o=a+56|0;if((n|0)==(f[o>>2]|0))Ci(i,b);else{f[n>>2]=g;f[l>>2]=n+4}n=a+4|0;g=f[n>>2]|0;k=f[b>>2]|0;m=k+1|0;if((k|0)==-1){h=0;u=c;return h|0}p=((m>>>0)%3|0|0)==0?k+-2|0:m;if((p|0)==-1)q=-1;else q=f[(f[g>>2]|0)+(p<<2)>>2]|0;p=(((k>>>0)%3|0|0)==0?2:-1)+k|0;if((p|0)==-1){h=0;u=c;return h|0}k=f[(f[g>>2]|0)+(p<<2)>>2]|0;if((q|0)==-1|(k|0)==-1){h=0;u=c;return h|0}p=a+36|0;g=f[p>>2]|0;m=g+(q>>>5<<2)|0;r=1<<(q&31);s=f[m>>2]|0;if(!(s&r)){f[m>>2]=s|r;r=f[b>>2]|0;s=r+1|0;if((r|0)==-1)t=-1;else t=((s>>>0)%3|0|0)==0?r+-2|0:s;f[e>>2]=t;s=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((t>>>0)/3|0)*12|0)+(((t>>>0)%3|0)<<2)>>2]|0;t=f[a+20>>2]|0;f[d>>2]=s;r=f[t+4>>2]|0;t=r+4|0;m=f[t>>2]|0;if((m|0)==(f[r+8>>2]|0))Ci(r,d);else{f[m>>2]=s;f[t>>2]=m+4}m=a+12|0;t=f[m>>2]|0;s=t+4|0;r=f[s>>2]|0;if((r|0)==(f[t+8>>2]|0)){Ci(t,e);v=f[m>>2]|0}else{f[r>>2]=f[e>>2];f[s>>2]=r+4;v=t}t=v+24|0;f[(f[v+12>>2]|0)+(q<<2)>>2]=f[t>>2];f[t>>2]=(f[t>>2]|0)+1;w=f[p>>2]|0}else w=g;g=w+(k>>>5<<2)|0;w=1<<(k&31);t=f[g>>2]|0;if(!(t&w)){f[g>>2]=t|w;w=f[b>>2]|0;do if((w|0)!=-1)if(!((w>>>0)%3|0)){x=w+2|0;break}else{x=w+-1|0;break}else x=-1;while(0);f[e>>2]=x;w=f[(f[(f[a+16>>2]|0)+96>>2]|0)+(((x>>>0)/3|0)*12|0)+(((x>>>0)%3|0)<<2)>>2]|0;x=f[a+20>>2]|0;f[d>>2]=w;t=f[x+4>>2]|0;x=t+4|0;g=f[x>>2]|0;if((g|0)==(f[t+8>>2]|0))Ci(t,d);else{f[g>>2]=w;f[x>>2]=g+4}g=a+12|0;x=f[g>>2]|0;w=x+4|0;t=f[w>>2]|0;if((t|0)==(f[x+8>>2]|0)){Ci(x,e);y=f[g>>2]|0}else{f[t>>2]=f[e>>2];f[w>>2]=t+4;y=x}x=y+24|0;f[(f[y+12>>2]|0)+(k<<2)>>2]=f[x>>2];f[x>>2]=(f[x>>2]|0)+1}x=f[i>>2]|0;k=f[l>>2]|0;if((x|0)==(k|0)){h=1;u=c;return h|0}y=a+16|0;t=a+20|0;w=a+12|0;a=k;k=x;a:while(1){x=f[a+-4>>2]|0;f[b>>2]=x;g=(x>>>0)/3|0;if((x|0)!=-1?(x=(f[j>>2]|0)+(g>>>5<<2)|0,q=1<<(g&31),g=f[x>>2]|0,(g&q|0)==0):0){f[x>>2]=g|q;q=f[b>>2]|0;if((q|0)==-1){h=0;z=80;break}g=f[n>>2]|0;x=q;b:while(1){q=f[(f[g>>2]|0)+(x<<2)>>2]|0;if((q|0)==-1){h=0;z=80;break a}v=(f[p>>2]|0)+(q>>>5<<2)|0;r=1<<(q&31);s=f[v>>2]|0;do if(!(s&r)){m=f[(f[g+24>>2]|0)+(q<<2)>>2]|0;A=m+1|0;do if((m|0)==-1)B=1;else{C=((A>>>0)%3|0|0)==0?m+-2|0:A;if((C|0)==-1){B=1;break}D=f[(f[g+12>>2]|0)+(C<<2)>>2]|0;C=D+1|0;if((D|0)==-1){B=1;break}B=((((C>>>0)%3|0|0)==0?D+-2|0:C)|0)==-1}while(0);f[v>>2]=s|r;A=f[b>>2]|0;f[e>>2]=A;m=f[(f[(f[y>>2]|0)+96>>2]|0)+(((A>>>0)/3|0)*12|0)+(((A>>>0)%3|0)<<2)>>2]|0;A=f[t>>2]|0;f[d>>2]=m;C=f[A+4>>2]|0;A=C+4|0;D=f[A>>2]|0;if((D|0)==(f[C+8>>2]|0))Ci(C,d);else{f[D>>2]=m;f[A>>2]=D+4}D=f[w>>2]|0;A=D+4|0;m=f[A>>2]|0;if((m|0)==(f[D+8>>2]|0)){Ci(D,e);E=f[w>>2]|0}else{f[m>>2]=f[e>>2];f[A>>2]=m+4;E=D}D=E+24|0;f[(f[E+12>>2]|0)+(q<<2)>>2]=f[D>>2];f[D>>2]=(f[D>>2]|0)+1;D=f[n>>2]|0;m=f[b>>2]|0;if(B)if((m|0)==-1){z=63;break b}else{F=m;G=D;z=64;break}do if((m|0)==-1)H=-1;else{A=m+1|0;C=((A>>>0)%3|0|0)==0?m+-2|0:A;if((C|0)==-1){H=-1;break}H=f[(f[D+12>>2]|0)+(C<<2)>>2]|0}while(0);f[b>>2]=H;I=(H>>>0)/3|0;J=D}else{F=x;G=g;z=64}while(0);if((z|0)==64){z=0;q=F+1|0;r=((q>>>0)%3|0|0)==0?F+-2|0:q;if((r|0)==-1)K=-1;else K=f[(f[G+12>>2]|0)+(r<<2)>>2]|0;f[d>>2]=K;r=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((r|0)==-1)L=-1;else L=f[(f[G+12>>2]|0)+(r<<2)>>2]|0;r=(K|0)==-1;q=(K>>>0)/3|0;s=r?-1:q;v=(L|0)==-1;m=(L>>>0)/3|0;C=v?-1:m;do if(!r){A=f[j>>2]|0;if(f[A+(s>>>5<<2)>>2]&1<<(s&31)|0){z=70;break}if(v){M=K;N=q;break}if(!(f[A+(C>>>5<<2)>>2]&1<<(C&31))){z=75;break b}else{M=K;N=q}}else z=70;while(0);if((z|0)==70){z=0;if(v){z=72;break}if(!(f[(f[j>>2]|0)+(C>>>5<<2)>>2]&1<<(C&31))){M=L;N=m}else{z=72;break}}f[b>>2]=M;I=N;J=G}q=(f[j>>2]|0)+(I>>>5<<2)|0;f[q>>2]=f[q>>2]|1<<(I&31);x=f[b>>2]|0;if((x|0)==-1){h=0;z=80;break a}else g=J}do if((z|0)==63){z=0;f[d>>2]=-1;z=72}else if((z|0)==75){z=0;g=f[l>>2]|0;f[g+-4>>2]=L;if((g|0)==(f[o>>2]|0)){Ci(i,d);O=f[l>>2]|0;break}else{f[g>>2]=f[d>>2];x=g+4|0;f[l>>2]=x;O=x;break}}while(0);if((z|0)==72){z=0;x=(f[l>>2]|0)+-4|0;f[l>>2]=x;O=x}P=f[i>>2]|0;Q=O}else{x=a+-4|0;f[l>>2]=x;P=k;Q=x}if((P|0)==(Q|0)){h=1;z=80;break}else{a=Q;k=P}}if((z|0)==80){u=c;return h|0}return 0}function Xb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=Oa,da=Oa,ea=Oa,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=u;u=u+48|0;g=e+20|0;i=e;j=e+8|0;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=c+48|0;p=c+40|0;m=g+4|0;s=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=f[d>>2]|0;d=q;y=0;z=0;A=q;B=q;C=q;q=0;while(1){D=r;E=f[D>>2]|0;F=f[D+4>>2]|0;D=p;G=on(f[D>>2]|0,f[D+4>>2]|0,x+y|0,0)|0;D=Tn(G|0,I|0,E|0,F|0)|0;F=(f[f[c>>2]>>2]|0)+D|0;D=F;E=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;D=F+4|0;F=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;D=i;f[D>>2]=E;f[D+4>>2]=F;D=(E^318)+239^F;G=(q|0)==0;a:do if(!G){H=q+-1|0;J=(H&q|0)==0;if(!J)if(D>>>0>>0)K=D;else K=(D>>>0)%(q>>>0)|0;else K=D&H;L=f[(f[g>>2]|0)+(K<<2)>>2]|0;do if(L|0?(M=f[L>>2]|0,M|0):0){b:do if(J){N=M;while(1){O=f[N+4>>2]|0;P=(O|0)==(D|0);if(!(P|(O&H|0)==(K|0))){Q=27;break b}if((P?(f[N+8>>2]|0)==(E|0):0)?(f[N+12>>2]|0)==(F|0):0){R=N;Q=26;break b}N=f[N>>2]|0;if(!N){Q=27;break}}}else{N=M;while(1){P=f[N+4>>2]|0;if((P|0)==(D|0)){if((f[N+8>>2]|0)==(E|0)?(f[N+12>>2]|0)==(F|0):0){R=N;Q=26;break b}}else{if(P>>>0>>0)S=P;else S=(P>>>0)%(q>>>0)|0;if((S|0)!=(K|0)){Q=27;break b}}N=f[N>>2]|0;if(!N){Q=27;break}}}while(0);if((Q|0)==26){Q=0;f[A+(y<<2)>>2]=f[R+16>>2];T=d;U=z;V=C;X=B;Y=A;break a}else if((Q|0)==27){Q=0;if(G){Z=0;Q=46;break a}else break}}while(0);H=q+-1|0;J=(H&q|0)==0;if(!J)if(D>>>0>>0)_=D;else _=(D>>>0)%(q>>>0)|0;else _=H&D;L=f[(f[g>>2]|0)+(_<<2)>>2]|0;if((L|0)!=0?(M=f[L>>2]|0,(M|0)!=0):0){if(J){J=M;while(1){L=f[J+4>>2]|0;if(!((L|0)==(D|0)|(L&H|0)==(_|0))){Z=_;Q=46;break a}if((f[J+8>>2]|0)==(E|0)?(f[J+12>>2]|0)==(F|0):0){Q=61;break a}J=f[J>>2]|0;if(!J){Z=_;Q=46;break a}}}else aa=M;while(1){J=f[aa+4>>2]|0;if((J|0)!=(D|0)){if(J>>>0>>0)ba=J;else ba=(J>>>0)%(q>>>0)|0;if((ba|0)!=(_|0)){Z=_;Q=46;break a}}if((f[aa+8>>2]|0)==(E|0)?(f[aa+12>>2]|0)==(F|0):0){Q=61;break a}aa=f[aa>>2]|0;if(!aa){Z=_;Q=46;break}}}else{Z=_;Q=46}}else{Z=0;Q=46}while(0);if((Q|0)==46){Q=0;M=dn(20)|0;J=M+8|0;f[J>>2]=E;f[J+4>>2]=F;f[M+16>>2]=z;f[M+4>>2]=D;f[M>>2]=0;ca=$(((f[s>>2]|0)+1|0)>>>0);da=$(q>>>0);ea=$(n[k>>2]);do if(G|$(ea*da)>>0<3|(q+-1&q|0)!=0)&1;H=~~$(W($(ca/ea)))>>>0;Ih(g,J>>>0>>0?H:J);J=f[m>>2]|0;H=J+-1|0;if(!(H&J)){fa=J;ga=H&D;break}if(D>>>0>>0){fa=J;ga=D}else{fa=J;ga=(D>>>0)%(J>>>0)|0}}else{fa=q;ga=Z}while(0);D=(f[g>>2]|0)+(ga<<2)|0;G=f[D>>2]|0;if(!G){f[M>>2]=f[t>>2];f[t>>2]=M;f[D>>2]=t;D=f[M>>2]|0;if(D|0){F=f[D+4>>2]|0;D=fa+-1|0;if(D&fa)if(F>>>0>>0)ha=F;else ha=(F>>>0)%(fa>>>0)|0;else ha=F&D;ia=(f[g>>2]|0)+(ha<<2)|0;Q=59}}else{f[M>>2]=f[G>>2];ia=G;Q=59}if((Q|0)==59){Q=0;f[ia>>2]=M}f[s>>2]=(f[s>>2]|0)+1;Q=61}if((Q|0)==61){Q=0;G=v;D=f[G>>2]|0;F=on(D|0,f[G+4>>2]|0,z|0,0)|0;Rg((f[f[w>>2]>>2]|0)+F|0,i|0,D|0)|0;D=f[j>>2]|0;f[D+(y<<2)>>2]=z;T=D;U=z+1|0;V=D;X=D;Y=D}D=y+1|0;ja=f[l>>2]|0;if(D>>>0>=ja>>>0)break;d=T;y=D;z=U;A=Y;B=X;C=V;q=f[m>>2]|0}if((U|0)==(ja|0))ka=X;else{X=a+84|0;if(!(b[X>>0]|0)){m=f[a+72>>2]|0;q=f[a+68>>2]|0;C=q;if((m|0)==(q|0))la=T;else{B=m-q>>2;q=0;do{m=C+(q<<2)|0;f[m>>2]=f[V+(f[m>>2]<<2)>>2];q=q+1|0}while(q>>>0>>0);la=T}}else{b[X>>0]=0;X=a+68|0;T=a+72|0;B=f[T>>2]|0;q=f[X>>2]|0;V=B-q>>2;C=q;q=B;if(ja>>>0<=V>>>0)if(ja>>>0>>0?(B=C+(ja<<2)|0,(B|0)!=(q|0)):0){f[T>>2]=q+(~((q+-4-B|0)>>>2)<<2);ma=ja}else ma=ja;else{kh(X,ja-V|0,1204);ma=f[l>>2]|0}V=f[j>>2]|0;if(!ma)la=V;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[V+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);la=V}}f[l>>2]=U;ka=la}if(!ka)na=U;else{la=f[o>>2]|0;if((la|0)!=(ka|0))f[o>>2]=la+(~((la+-4-ka|0)>>>2)<<2);br(ka);na=U}}else na=0;U=f[g+8>>2]|0;if(U|0){ka=U;do{U=ka;ka=f[ka>>2]|0;br(U)}while((ka|0)!=0)}ka=f[g>>2]|0;f[g>>2]=0;if(!ka){u=e;return na|0}br(ka);u=e;return na|0}function Yb(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+12|0;j=g+32|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=r;z=0;A=0;B=r;C=r;D=0;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=on(f[r>>2]|0,f[r+4>>2]|0,y+z|0,0)|0;r=Tn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8;d[j>>1]=r;G=r&255;F=(r&65535)>>>8;H=F&255;J=((r&255^318)+239<<16>>16^F)&65535;F=(D|0)==0;a:do if(!F){K=D+-1|0;L=(K&D|0)==0;if(!L)if(D>>>0>J>>>0)M=J;else M=(J>>>0)%(D>>>0)|0;else M=K&J;N=f[(f[i>>2]|0)+(M<<2)>>2]|0;do if(N|0?(O=f[N>>2]|0,O|0):0){b:do if(L){P=O;while(1){Q=f[P+4>>2]|0;R=(Q|0)==(J|0);if(!(R|(Q&K|0)==(M|0))){S=27;break b}if((R?(R=P+8|0,(b[R>>0]|0)==G<<24>>24):0)?(b[R+1>>0]|0)==H<<24>>24:0){T=P;S=26;break b}P=f[P>>2]|0;if(!P){S=27;break}}}else{P=O;while(1){R=f[P+4>>2]|0;if((R|0)==(J|0)){Q=P+8|0;if((b[Q>>0]|0)==G<<24>>24?(b[Q+1>>0]|0)==H<<24>>24:0){T=P;S=26;break b}}else{if(R>>>0>>0)U=R;else U=(R>>>0)%(D>>>0)|0;if((U|0)!=(M|0)){S=27;break b}}P=f[P>>2]|0;if(!P){S=27;break}}}while(0);if((S|0)==26){S=0;f[E+(z<<2)>>2]=f[T+12>>2];V=e;X=A;Y=C;Z=B;_=E;break a}else if((S|0)==27){S=0;if(F){aa=0;S=46;break a}else break}}while(0);K=D+-1|0;L=(K&D|0)==0;if(!L)if(D>>>0>J>>>0)ba=J;else ba=(J>>>0)%(D>>>0)|0;else ba=K&J;N=f[(f[i>>2]|0)+(ba<<2)>>2]|0;if((N|0)!=0?(O=f[N>>2]|0,(O|0)!=0):0){if(L){L=O;while(1){N=f[L+4>>2]|0;if(!((N|0)==(J|0)|(N&K|0)==(ba|0))){aa=ba;S=46;break a}N=L+8|0;if((b[N>>0]|0)==G<<24>>24?(b[N+1>>0]|0)==H<<24>>24:0){S=61;break a}L=f[L>>2]|0;if(!L){aa=ba;S=46;break a}}}else ca=O;while(1){L=f[ca+4>>2]|0;if((L|0)!=(J|0)){if(L>>>0>>0)da=L;else da=(L>>>0)%(D>>>0)|0;if((da|0)!=(ba|0)){aa=ba;S=46;break a}}L=ca+8|0;if((b[L>>0]|0)==G<<24>>24?(b[L+1>>0]|0)==H<<24>>24:0){S=61;break a}ca=f[ca>>2]|0;if(!ca){aa=ba;S=46;break}}}else{aa=ba;S=46}}else{aa=0;S=46}while(0);if((S|0)==46){S=0;H=dn(16)|0;G=H+8|0;b[G>>0]=r;b[G+1>>0]=r>>8;f[H+12>>2]=A;f[H+4>>2]=J;f[H>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(D>>>0);ga=$(n[l>>2]);do if(F|$(ga*fa)>>0<3|(D+-1&D|0)!=0)&1;O=~~$(W($(ea/ga)))>>>0;Lh(i,G>>>0>>0?O:G);G=f[o>>2]|0;O=G+-1|0;if(!(O&G)){ha=G;ia=O&J;break}if(G>>>0>J>>>0){ha=G;ia=J}else{ha=G;ia=(J>>>0)%(G>>>0)|0}}else{ha=D;ia=aa}while(0);J=(f[i>>2]|0)+(ia<<2)|0;F=f[J>>2]|0;if(!F){f[H>>2]=f[v>>2];f[v>>2]=H;f[J>>2]=v;J=f[H>>2]|0;if(J|0){r=f[J+4>>2]|0;J=ha+-1|0;if(J&ha)if(r>>>0>>0)ja=r;else ja=(r>>>0)%(ha>>>0)|0;else ja=r&J;ka=(f[i>>2]|0)+(ja<<2)|0;S=59}}else{f[H>>2]=f[F>>2];ka=F;S=59}if((S|0)==59){S=0;f[ka>>2]=H}f[t>>2]=(f[t>>2]|0)+1;S=61}if((S|0)==61){S=0;F=w;J=f[F>>2]|0;r=on(J|0,f[F+4>>2]|0,A|0,0)|0;Rg((f[f[x>>2]>>2]|0)+r|0,j|0,J|0)|0;J=f[k>>2]|0;f[J+(z<<2)>>2]=A;V=J;X=A+1|0;Y=J;Z=J;_=J}J=z+1|0;la=f[m>>2]|0;if(J>>>0>=la>>>0)break;e=V;z=J;A=X;B=Z;C=Y;D=f[o>>2]|0;E=_}if((X|0)==(la|0))ma=Z;else{Z=a+84|0;if(!(b[Z>>0]|0)){_=f[a+72>>2]|0;E=f[a+68>>2]|0;o=E;if((_|0)==(E|0))na=V;else{D=_-E>>2;E=0;do{_=o+(E<<2)|0;f[_>>2]=f[Y+(f[_>>2]<<2)>>2];E=E+1|0}while(E>>>0>>0);na=V}}else{b[Z>>0]=0;Z=a+68|0;V=a+72|0;D=f[V>>2]|0;E=f[Z>>2]|0;Y=D-E>>2;o=E;E=D;if(la>>>0<=Y>>>0)if(la>>>0>>0?(D=o+(la<<2)|0,(D|0)!=(E|0)):0){f[V>>2]=E+(~((E+-4-D|0)>>>2)<<2);oa=la}else oa=la;else{kh(Z,la-Y|0,1204);oa=f[m>>2]|0}Y=f[k>>2]|0;if(!oa)na=Y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[Y+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);na=Y}}f[m>>2]=X;ma=na}if(!ma)pa=X;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);br(ma);pa=X}}else pa=0;X=f[i+8>>2]|0;if(X|0){ma=X;do{X=ma;ma=f[ma>>2]|0;br(X)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}br(ma);u=g;return pa|0}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;c=u;u=u+16|0;d=c+8|0;e=c;g=c+4|0;h=a+16|0;i=f[h>>2]|0;j=a+20|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k+(~((k+-4-i|0)>>>2)<<2)|0;f[j>>2]=m;l=m}m=a+24|0;if((l|0)==(f[m>>2]|0)){Ci(h,b);n=f[h>>2]|0;o=f[j>>2]|0}else{f[l>>2]=f[b>>2];k=l+4|0;f[j>>2]=k;n=i;o=k}k=f[a+8>>2]|0;i=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(i|0)/12|0;if((n|0)==(o|0)){u=c;return 1}n=a+28|0;l=(i|0)>0;i=a+164|0;p=a+12|0;q=a+76|0;r=a+80|0;s=a+72|0;t=a+200|0;v=a+320|0;w=a+152|0;x=a+84|0;y=a+324|0;z=a+292|0;A=a+304|0;B=a+316|0;C=a+328|0;D=a+336|0;E=a+332|0;F=a+168|0;G=a+140|0;H=a+120|0;I=o;do{o=f[I+-4>>2]|0;f[b>>2]=o;a:do if((o|0)!=-1?(J=(o>>>0)/3|0,K=f[n>>2]|0,(f[K+(J>>>5<<2)>>2]&1<<(J&31)|0)==0):0){if(l){J=0;L=K;b:while(1){K=J+1|0;f[i>>2]=(f[i>>2]|0)+1;M=f[b>>2]|0;N=(M|0)==-1?-1:(M>>>0)/3|0;M=L+(N>>>5<<2)|0;f[M>>2]=1<<(N&31)|f[M>>2];M=f[q>>2]|0;if((M|0)==(f[r>>2]|0))Ci(s,b);else{f[M>>2]=f[b>>2];f[q>>2]=M+4}f[v>>2]=f[b>>2];M=f[b>>2]|0;if((M|0)==-1)O=-1;else O=f[(f[f[p>>2]>>2]|0)+(M<<2)>>2]|0;P=(f[(f[w>>2]|0)+(O<<2)>>2]|0)!=-1;Q=(f[x>>2]|0)+(O>>>5<<2)|0;R=1<<(O&31);S=f[Q>>2]|0;do if(!(S&R)){f[Q>>2]=S|R;if(P){T=f[b>>2]|0;U=38;break}f[y>>2]=(f[y>>2]|0)+1;V=f[v>>2]|0;W=V+1|0;do if((V|0)!=-1){X=((W>>>0)%3|0|0)==0?V+-2|0:W;if(!((V>>>0)%3|0)){Y=V+2|0;Z=X;break}else{Y=V+-1|0;Z=X;break}}else{Y=-1;Z=-1}while(0);V=f[z>>2]|0;W=f[A>>2]|0;X=W+(f[V+(Z<<2)>>2]<<2)|0;_=f[X>>2]|0;f[X>>2]=_+-1;X=W+(f[V+(Y<<2)>>2]<<2)|0;f[X>>2]=(f[X>>2]|0)+-1;X=f[B>>2]|0;if((X|0)!=-1){V=f[C>>2]|0;if((_|0)<(V|0))$=V;else{W=f[E>>2]|0;$=(_|0)>(W|0)?W:_}_=$-V|0;V=f[D>>2]|0;W=f[3384+(X<<2)>>2]|0;f[d>>2]=W;X=V+(_*12|0)+4|0;aa=f[X>>2]|0;if(aa>>>0<(f[V+(_*12|0)+8>>2]|0)>>>0){f[aa>>2]=W;f[X>>2]=aa+4}else Ci(V+(_*12|0)|0,d)}f[B>>2]=0;_=f[b>>2]|0;V=_+1|0;if((_|0)!=-1?(aa=((V>>>0)%3|0|0)==0?_+-2|0:V,(aa|0)!=-1):0)ba=f[(f[(f[p>>2]|0)+12>>2]|0)+(aa<<2)>>2]|0;else ba=-1;f[b>>2]=ba}else{T=M;U=38}while(0);if((U|0)==38){U=0;M=T+1|0;if((T|0)==-1){U=43;break}R=((M>>>0)%3|0|0)==0?T+-2|0:M;if((R|0)==-1)ca=-1;else ca=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;f[e>>2]=ca;R=(((T>>>0)%3|0|0)==0?2:-1)+T|0;if((R|0)==-1)da=-1;else da=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;R=(ca|0)==-1;S=R?-1:(ca>>>0)/3|0;ea=(da|0)==-1;fa=ea?-1:(da>>>0)/3|0;Q=((M>>>0)%3|0|0)==0?T+-2|0:M;if(((Q|0)!=-1?(M=f[(f[p>>2]|0)+12>>2]|0,aa=f[M+(Q<<2)>>2]|0,(aa|0)!=-1):0)?(Q=(aa>>>0)/3|0,aa=f[n>>2]|0,(f[aa+(Q>>>5<<2)>>2]&1<<(Q&31)|0)==0):0){Q=(((T>>>0)%3|0|0)==0?2:-1)+T|0;do if((Q|0)!=-1){V=f[M+(Q<<2)>>2]|0;if((V|0)==-1)break;_=(V>>>0)/3|0;if(!(f[aa+(_>>>5<<2)>>2]&1<<(_&31))){U=62;break b}}while(0);if(!ea)jf(a,f[i>>2]|0,N,0,fa);hd(t,3);ga=f[e>>2]|0}else{if(!R){jf(a,f[i>>2]|0,N,1,S);aa=f[b>>2]|0;if((aa|0)==-1){U=52;break}else ha=aa}else ha=T;aa=(((ha>>>0)%3|0|0)==0?2:-1)+ha|0;if((aa|0)==-1){U=52;break}Q=f[(f[(f[p>>2]|0)+12>>2]|0)+(aa<<2)>>2]|0;if((Q|0)==-1){U=52;break}aa=(Q>>>0)/3|0;if(f[(f[n>>2]|0)+(aa>>>5<<2)>>2]&1<<(aa&31)|0){U=52;break}hd(t,5);ga=da}f[b>>2]=ga}if((K|0)>=(k|0))break a;J=K;L=f[n>>2]|0}do if((U|0)==43){U=0;f[e>>2]=-1;U=54}else if((U|0)==52){U=0;if(ea)U=54;else{jf(a,f[i>>2]|0,N,0,fa);U=54}}else if((U|0)==62){U=0;hd(t,1);f[F>>2]=(f[F>>2]|0)+1;if(P?(L=f[(f[w>>2]|0)+(O<<2)>>2]|0,(1<<(L&31)&f[(f[G>>2]|0)+(L>>>5<<2)>>2]|0)==0):0){f[g>>2]=f[b>>2];f[d>>2]=f[g>>2];Ce(a,d,0)|0}L=f[i>>2]|0;f[d>>2]=N;J=Sd(H,d)|0;f[J>>2]=L;L=f[j>>2]|0;f[L+-4>>2]=da;if((L|0)==(f[m>>2]|0)){Ci(h,e);break}else{f[L>>2]=f[e>>2];f[j>>2]=L+4;break}}while(0);if((U|0)==54){U=0;hd(t,7);f[j>>2]=(f[j>>2]|0)+-4}}}else U=11;while(0);if((U|0)==11){U=0;f[j>>2]=I+-4}I=f[j>>2]|0}while((f[h>>2]|0)!=(I|0));u=c;return 1}function _b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=Oa,K=Oa,L=Oa,M=0,N=0,O=0,P=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=xd(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];Xe(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;ri(j,8);l=d;d=l;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=l+4|0;l=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=f[j>>2]|0;o=d;b[o>>0]=m;b[o+1>>0]=m>>8;b[o+2>>0]=m>>16;b[o+3>>0]=m>>24;m=d+4|0;b[m>>0]=l;b[m+1>>0]=l>>8;b[m+2>>0]=l>>16;b[m+3>>0]=l>>24;dj(i,c);c=i+12|0;f[c>>2]=0;l=i+16|0;f[l>>2]=0;f[i+20>>2]=0;m=f[k>>2]|0;d=f[j>>2]|0;o=m-d|0;if(!o){p=d;q=m;r=0}else{ri(c,o);p=f[j>>2]|0;q=f[k>>2]|0;r=f[c>>2]|0}Rg(r|0,p|0,q-p|0)|0;p=i+11|0;q=b[p>>0]|0;r=q<<24>>24<0;c=r?f[i>>2]|0:i;o=r?f[i+4>>2]|0:q&255;if(o>>>0>3){q=c;r=o;m=o;while(1){d=X(h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24,1540483477)|0;r=(X(d>>>24^d,1540483477)|0)^(X(r,1540483477)|0);m=m+-4|0;if(m>>>0<=3)break;else q=q+4|0}q=o+-4|0;m=q&-4;s=q-m|0;t=c+(m+4)|0;v=r}else{s=o;t=c;v=o}switch(s|0){case 3:{w=h[t+2>>0]<<16^v;x=10;break}case 2:{w=v;x=10;break}case 1:{y=v;x=11;break}default:z=v}if((x|0)==10){y=h[t+1>>0]<<8^w;x=11}if((x|0)==11)z=X(y^h[t>>0],1540483477)|0;t=X(z>>>13^z,1540483477)|0;z=t>>>15^t;t=a+4|0;y=f[t>>2]|0;w=(y|0)==0;a:do if(!w){v=y+-1|0;s=(v&y|0)==0;if(!s)if(z>>>0>>0)A=z;else A=(z>>>0)%(y>>>0)|0;else A=z&v;r=f[(f[a>>2]|0)+(A<<2)>>2]|0;if((r|0)!=0?(m=f[r>>2]|0,(m|0)!=0):0){r=(o|0)==0;if(s){if(r){s=m;while(1){q=f[s+4>>2]|0;if(!((q|0)==(z|0)|(q&v|0)==(A|0))){B=A;x=52;break a}q=b[s+8+11>>0]|0;if(!((q<<24>>24<0?f[s+12>>2]|0:q&255)|0))break a;s=f[s>>2]|0;if(!s){B=A;x=52;break a}}}else C=m;while(1){s=f[C+4>>2]|0;if(!((s|0)==(z|0)|(s&v|0)==(A|0))){B=A;x=52;break a}s=C+8|0;q=b[s+11>>0]|0;d=q<<24>>24<0;D=q&255;do if(((d?f[C+12>>2]|0:D)|0)==(o|0)){q=f[s>>2]|0;if(d)if(!(Pk(q,c,o)|0))break a;else break;if((b[c>>0]|0)==(q&255)<<24>>24){q=s;E=D;F=c;do{E=E+-1|0;q=q+1|0;if(!E)break a;F=F+1|0}while((b[q>>0]|0)==(b[F>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){B=A;x=52;break a}}}if(r){v=m;while(1){D=f[v+4>>2]|0;if((D|0)!=(z|0)){if(D>>>0>>0)G=D;else G=(D>>>0)%(y>>>0)|0;if((G|0)!=(A|0)){B=A;x=52;break a}}D=b[v+8+11>>0]|0;if(!((D<<24>>24<0?f[v+12>>2]|0:D&255)|0))break a;v=f[v>>2]|0;if(!v){B=A;x=52;break a}}}else H=m;while(1){v=f[H+4>>2]|0;if((v|0)!=(z|0)){if(v>>>0>>0)I=v;else I=(v>>>0)%(y>>>0)|0;if((I|0)!=(A|0)){B=A;x=52;break a}}v=H+8|0;r=b[v+11>>0]|0;D=r<<24>>24<0;s=r&255;do if(((D?f[H+12>>2]|0:s)|0)==(o|0)){r=f[v>>2]|0;if(D)if(!(Pk(r,c,o)|0))break a;else break;if((b[c>>0]|0)==(r&255)<<24>>24){r=v;d=s;F=c;do{d=d+-1|0;r=r+1|0;if(!d)break a;F=F+1|0}while((b[r>>0]|0)==(b[F>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){B=A;x=52;break}}}else{B=A;x=52}}else{B=0;x=52}while(0);if((x|0)==52){_h(g,a,z,i);x=a+12|0;J=$(((f[x>>2]|0)+1|0)>>>0);K=$(y>>>0);L=$(n[a+16>>2]);do if(w|$(L*K)>>0<3|(y+-1&y|0)!=0)&1;H=~~$(W($(J/L)))>>>0;Ph(a,A>>>0>>0?H:A);A=f[t>>2]|0;H=A+-1|0;if(!(H&A)){M=A;N=H&z;break}if(z>>>0>>0){M=A;N=z}else{M=A;N=(z>>>0)%(A>>>0)|0}}else{M=y;N=B}while(0);B=f[(f[a>>2]|0)+(N<<2)>>2]|0;if(!B){y=a+8|0;f[f[g>>2]>>2]=f[y>>2];f[y>>2]=f[g>>2];f[(f[a>>2]|0)+(N<<2)>>2]=y;y=f[g>>2]|0;N=f[y>>2]|0;if(!N)O=g;else{z=f[N+4>>2]|0;N=M+-1|0;if(N&M)if(z>>>0>>0)P=z;else P=(z>>>0)%(M>>>0)|0;else P=z&N;f[(f[a>>2]|0)+(P<<2)>>2]=y;O=g}}else{f[f[g>>2]>>2]=f[B>>2];f[B>>2]=f[g>>2];O=g}f[x>>2]=(f[x>>2]|0)+1;f[O>>2]=0}O=f[i+12>>2]|0;if(O|0){if((f[l>>2]|0)!=(O|0))f[l>>2]=O;br(O)}if((b[p>>0]|0)<0)br(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;br(i);u=e;return}function $b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=(o|0)==-1;if(p)q=-1;else q=f[(f[n>>2]|0)+(o<<2)>>2]|0;n=a+20|0;r=f[n>>2]|0;s=f[r>>2]|0;if((f[r+4>>2]|0)-s>>2>>>0<=q>>>0)mq(r);r=a+8|0;t=f[(f[r>>2]|0)+(f[s+(q<<2)>>2]<<2)>>2]|0;q=a+4|0;s=f[q>>2]|0;if(!(b[s+84>>0]|0))v=f[(f[s+68>>2]|0)+(t<<2)>>2]|0;else v=t;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=v;v=b[s+24>>0]|0;f[g>>2]=f[h>>2];ub(s,g,v,j)|0;v=a+28|0;a=(f[v>>2]|0)==0;a:do if(!p){s=k+8|0;t=j+8|0;w=k+16|0;x=j+16|0;y=l+8|0;z=l+16|0;A=o;B=o;C=0;D=0;E=0;F=0;G=0;H=0;J=a;K=o;while(1){do if(J){L=K+1|0;if((K|0)==-1){M=A;N=-1;O=-1;P=-1;break}Q=((L>>>0)%3|0|0)==0?K+-2|0:L;if((A|0)!=-1)if(!((A>>>0)%3|0)){R=A;S=A+2|0;T=Q;U=A;V=19;break}else{R=A;S=A+-1|0;T=Q;U=A;V=19;break}else{R=-1;S=-1;T=Q;U=-1;V=19}}else{Q=B+1|0;L=((Q>>>0)%3|0|0)==0?B+-2|0:Q;if(!((B>>>0)%3|0)){R=A;S=B+2|0;T=L;U=K;V=19;break}else{R=A;S=B+-1|0;T=L;U=K;V=19;break}}while(0);if((V|0)==19){V=0;if((T|0)==-1){M=R;N=-1;O=S;P=U}else{M=R;N=f[(f[f[m>>2]>>2]|0)+(T<<2)>>2]|0;O=S;P=U}}W=f[n>>2]|0;L=f[W>>2]|0;if((f[W+4>>2]|0)-L>>2>>>0<=N>>>0){V=22;break}Q=f[(f[r>>2]|0)+(f[L+(N<<2)>>2]<<2)>>2]|0;L=f[q>>2]|0;if(!(b[L+84>>0]|0))X=f[(f[L+68>>2]|0)+(Q<<2)>>2]|0;else X=Q;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=X;Q=b[L+24>>0]|0;f[g>>2]=f[h>>2];ub(L,g,Q,k)|0;if((O|0)==-1)Y=-1;else Y=f[(f[f[m>>2]>>2]|0)+(O<<2)>>2]|0;Z=f[n>>2]|0;Q=f[Z>>2]|0;if((f[Z+4>>2]|0)-Q>>2>>>0<=Y>>>0){V=28;break}L=f[(f[r>>2]|0)+(f[Q+(Y<<2)>>2]<<2)>>2]|0;Q=f[q>>2]|0;if(!(b[Q+84>>0]|0))_=f[(f[Q+68>>2]|0)+(L<<2)>>2]|0;else _=L;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=_;L=b[Q+24>>0]|0;f[g>>2]=f[h>>2];ub(Q,g,L,l)|0;L=k;Q=j;$=f[Q>>2]|0;aa=f[Q+4>>2]|0;Q=Vn(f[L>>2]|0,f[L+4>>2]|0,$|0,aa|0)|0;L=I;ba=s;ca=t;da=f[ca>>2]|0;ea=f[ca+4>>2]|0;ca=Vn(f[ba>>2]|0,f[ba+4>>2]|0,da|0,ea|0)|0;ba=I;fa=w;ga=x;ha=f[ga>>2]|0;ia=f[ga+4>>2]|0;ga=Vn(f[fa>>2]|0,f[fa+4>>2]|0,ha|0,ia|0)|0;fa=I;ja=l;ka=Vn(f[ja>>2]|0,f[ja+4>>2]|0,$|0,aa|0)|0;aa=I;$=y;ja=Vn(f[$>>2]|0,f[$+4>>2]|0,da|0,ea|0)|0;ea=I;da=z;$=Vn(f[da>>2]|0,f[da+4>>2]|0,ha|0,ia|0)|0;ia=I;ha=on($|0,ia|0,ca|0,ba|0)|0;da=I;la=on(ja|0,ea|0,ga|0,fa|0)|0;ma=I;na=on(ka|0,aa|0,ga|0,fa|0)|0;fa=I;ga=on($|0,ia|0,Q|0,L|0)|0;ia=I;$=on(ja|0,ea|0,Q|0,L|0)|0;L=I;Q=on(ka|0,aa|0,ca|0,ba|0)|0;ba=I;ca=Vn(C|0,D|0,la|0,ma|0)|0;ma=Tn(ca|0,I|0,ha|0,da|0)|0;da=I;ha=Tn(na|0,fa|0,E|0,F|0)|0;fa=Vn(ha|0,I|0,ga|0,ia|0)|0;ia=I;ga=Vn(G|0,H|0,Q|0,ba|0)|0;ba=Tn(ga|0,I|0,$|0,L|0)|0;L=I;ph(i);B=f[c>>2]|0;$=(f[v>>2]|0)==0;if((B|0)==-1){oa=$;pa=da;qa=ma;ra=ia;sa=fa;ta=L;ua=ba;break a}else{A=M;C=ma;D=da;E=fa;F=ia;G=ba;H=L;J=$;K=P}}if((V|0)==22)mq(W);else if((V|0)==28)mq(Z)}else{oa=a;pa=0;qa=0;ra=0;sa=0;ta=0;ua=0}while(0);a=(pa|0)>-1|(pa|0)==-1&qa>>>0>4294967295;Z=Vn(0,0,qa|0,pa|0)|0;V=a?pa:I;W=(ra|0)>-1|(ra|0)==-1&sa>>>0>4294967295;P=Vn(0,0,sa|0,ra|0)|0;M=W?ra:I;v=(ta|0)>-1|(ta|0)==-1&ua>>>0>4294967295;c=Vn(0,0,ua|0,ta|0)|0;i=Tn((W?sa:P)|0,M|0,(v?ua:c)|0,(v?ta:I)|0)|0;v=Tn(i|0,I|0,(a?qa:Z)|0,V|0)|0;V=I;if(oa){if((v|0)<=536870912){va=qa;wa=sa;xa=ua;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}oa=Wn(v|0,V|0,29)|0;Z=oa&7;oa=zk(qa|0,pa|0,Z|0,0)|0;a=zk(sa|0,ra|0,Z|0,0)|0;i=zk(ua|0,ta|0,Z|0,0)|0;va=oa;wa=a;xa=i;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}else{if(!((V|0)>0|(V|0)==0&v>>>0>536870912)){va=qa;wa=sa;xa=ua;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}i=Wn(v|0,V|0,29)|0;V=I;v=zk(qa|0,pa|0,i|0,V|0)|0;pa=zk(sa|0,ra|0,i|0,V|0)|0;ra=zk(ua|0,ta|0,i|0,V|0)|0;va=v;wa=pa;xa=ra;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}}function ac(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=Oa,M=Oa,N=Oa,O=0,P=0,Q=0,R=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=xd(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];Xe(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;l=d+11|0;m=b[l>>0]|0;o=d+4|0;p=f[o>>2]|0;q=m<<24>>24<0?p:m&255;if(!q){r=m;s=p;t=0}else{ri(j,q);r=b[l>>0]|0;s=f[o>>2]|0;t=f[j>>2]|0}o=r<<24>>24<0;Rg(t|0,(o?f[d>>2]|0:d)|0,(o?s:r&255)|0)|0;dj(i,c);c=i+12|0;f[c>>2]=0;r=i+16|0;f[r>>2]=0;f[i+20>>2]=0;s=f[k>>2]|0;o=f[j>>2]|0;d=s-o|0;if(!d){v=o;w=s;x=0}else{ri(c,d);v=f[j>>2]|0;w=f[k>>2]|0;x=f[c>>2]|0}Rg(x|0,v|0,w-v|0)|0;v=i+11|0;w=b[v>>0]|0;x=w<<24>>24<0;c=x?f[i>>2]|0:i;d=x?f[i+4>>2]|0:w&255;if(d>>>0>3){w=c;x=d;s=d;while(1){o=X(h[w>>0]|h[w+1>>0]<<8|h[w+2>>0]<<16|h[w+3>>0]<<24,1540483477)|0;x=(X(o>>>24^o,1540483477)|0)^(X(x,1540483477)|0);s=s+-4|0;if(s>>>0<=3)break;else w=w+4|0}w=d+-4|0;s=w&-4;y=w-s|0;z=c+(s+4)|0;A=x}else{y=d;z=c;A=d}switch(y|0){case 3:{B=h[z+2>>0]<<16^A;C=12;break}case 2:{B=A;C=12;break}case 1:{D=A;C=13;break}default:E=A}if((C|0)==12){D=h[z+1>>0]<<8^B;C=13}if((C|0)==13)E=X(D^h[z>>0],1540483477)|0;z=X(E>>>13^E,1540483477)|0;E=z>>>15^z;z=a+4|0;D=f[z>>2]|0;B=(D|0)==0;a:do if(!B){A=D+-1|0;y=(A&D|0)==0;if(!y)if(E>>>0>>0)F=E;else F=(E>>>0)%(D>>>0)|0;else F=E&A;x=f[(f[a>>2]|0)+(F<<2)>>2]|0;if((x|0)!=0?(s=f[x>>2]|0,(s|0)!=0):0){x=(d|0)==0;if(y){if(x){y=s;while(1){w=f[y+4>>2]|0;if(!((w|0)==(E|0)|(w&A|0)==(F|0))){G=F;C=54;break a}w=b[y+8+11>>0]|0;if(!((w<<24>>24<0?f[y+12>>2]|0:w&255)|0))break a;y=f[y>>2]|0;if(!y){G=F;C=54;break a}}}else H=s;while(1){y=f[H+4>>2]|0;if(!((y|0)==(E|0)|(y&A|0)==(F|0))){G=F;C=54;break a}y=H+8|0;w=b[y+11>>0]|0;o=w<<24>>24<0;t=w&255;do if(((o?f[H+12>>2]|0:t)|0)==(d|0)){w=f[y>>2]|0;if(o)if(!(Pk(w,c,d)|0))break a;else break;if((b[c>>0]|0)==(w&255)<<24>>24){w=y;l=t;q=c;do{l=l+-1|0;w=w+1|0;if(!l)break a;q=q+1|0}while((b[w>>0]|0)==(b[q>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){G=F;C=54;break a}}}if(x){A=s;while(1){t=f[A+4>>2]|0;if((t|0)!=(E|0)){if(t>>>0>>0)I=t;else I=(t>>>0)%(D>>>0)|0;if((I|0)!=(F|0)){G=F;C=54;break a}}t=b[A+8+11>>0]|0;if(!((t<<24>>24<0?f[A+12>>2]|0:t&255)|0))break a;A=f[A>>2]|0;if(!A){G=F;C=54;break a}}}else J=s;while(1){A=f[J+4>>2]|0;if((A|0)!=(E|0)){if(A>>>0>>0)K=A;else K=(A>>>0)%(D>>>0)|0;if((K|0)!=(F|0)){G=F;C=54;break a}}A=J+8|0;x=b[A+11>>0]|0;t=x<<24>>24<0;y=x&255;do if(((t?f[J+12>>2]|0:y)|0)==(d|0)){x=f[A>>2]|0;if(t)if(!(Pk(x,c,d)|0))break a;else break;if((b[c>>0]|0)==(x&255)<<24>>24){x=A;o=y;q=c;do{o=o+-1|0;x=x+1|0;if(!o)break a;q=q+1|0}while((b[x>>0]|0)==(b[q>>0]|0))}}while(0);J=f[J>>2]|0;if(!J){G=F;C=54;break}}}else{G=F;C=54}}else{G=0;C=54}while(0);if((C|0)==54){_h(g,a,E,i);C=a+12|0;L=$(((f[C>>2]|0)+1|0)>>>0);M=$(D>>>0);N=$(n[a+16>>2]);do if(B|$(N*M)>>0<3|(D+-1&D|0)!=0)&1;J=~~$(W($(L/N)))>>>0;Ph(a,F>>>0>>0?J:F);F=f[z>>2]|0;J=F+-1|0;if(!(J&F)){O=F;P=J&E;break}if(E>>>0>>0){O=F;P=E}else{O=F;P=(E>>>0)%(F>>>0)|0}}else{O=D;P=G}while(0);G=f[(f[a>>2]|0)+(P<<2)>>2]|0;if(!G){D=a+8|0;f[f[g>>2]>>2]=f[D>>2];f[D>>2]=f[g>>2];f[(f[a>>2]|0)+(P<<2)>>2]=D;D=f[g>>2]|0;P=f[D>>2]|0;if(!P)Q=g;else{E=f[P+4>>2]|0;P=O+-1|0;if(P&O)if(E>>>0>>0)R=E;else R=(E>>>0)%(O>>>0)|0;else R=E&P;f[(f[a>>2]|0)+(R<<2)>>2]=D;Q=g}}else{f[f[g>>2]>>2]=f[G>>2];f[G>>2]=f[g>>2];Q=g}f[C>>2]=(f[C>>2]|0)+1;f[Q>>2]=0}Q=f[i+12>>2]|0;if(Q|0){if((f[r>>2]|0)!=(Q|0))f[r>>2]=Q;br(Q)}if((b[v>>0]|0)<0)br(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;br(i);u=e;return}function bc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+12|0;j=g+32|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=0;z=r;A=0;B=0;C=r;D=r;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=on(f[r>>2]|0,f[r+4>>2]|0,y+A|0,0)|0;r=Tn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8;d[j>>1]=r;G=(r^318)&65535;a:do if(e){F=e+-1|0;H=(F&e|0)==0;if(!H)if(e>>>0>G>>>0)J=G;else J=(G>>>0)%(e>>>0)|0;else J=F&G;K=f[i>>2]|0;L=f[K+(J<<2)>>2]|0;b:do if(L|0?(M=f[L>>2]|0,M|0):0){c:do if(H){N=M;while(1){O=f[N+4>>2]|0;P=(O|0)==(G|0);if(!(P|(O&F|0)==(J|0)))break b;if(P?(d[N+8>>1]|0)==r<<16>>16:0){Q=N;break c}N=f[N>>2]|0;if(!N)break b}}else{N=M;while(1){P=f[N+4>>2]|0;if((P|0)==(G|0)){if((d[N+8>>1]|0)==r<<16>>16){Q=N;break c}}else{if(P>>>0>>0)R=P;else R=(P>>>0)%(e>>>0)|0;if((R|0)!=(J|0))break b}N=f[N>>2]|0;if(!N)break b}}while(0);f[E+(A<<2)>>2]=f[Q+12>>2];S=z;T=B;U=D;V=C;X=E;break a}while(0);if(!H)if(e>>>0>G>>>0)Y=G;else Y=(G>>>0)%(e>>>0)|0;else Y=F&G;L=f[K+(Y<<2)>>2]|0;if(!L){Z=Y;_=e;aa=0;ba=40}else{if(H){M=L;while(1){M=f[M>>2]|0;if(!M){Z=Y;_=e;aa=0;ba=40;break a}N=f[M+4>>2]|0;if(!((N|0)==(G|0)|(N&F|0)==(Y|0))){Z=Y;_=e;aa=0;ba=40;break a}if((d[M+8>>1]|0)==r<<16>>16){ba=55;break a}}}else ca=L;while(1){ca=f[ca>>2]|0;if(!ca){Z=Y;_=e;aa=0;ba=40;break a}M=f[ca+4>>2]|0;if((M|0)!=(G|0)){if(M>>>0>>0)da=M;else da=(M>>>0)%(e>>>0)|0;if((da|0)!=(Y|0)){Z=Y;_=e;aa=0;ba=40;break a}}if((d[ca+8>>1]|0)==r<<16>>16){ba=55;break}}}}else{Z=0;_=0;aa=1;ba=40}while(0);if((ba|0)==40){ba=0;L=dn(16)|0;d[L+8>>1]=r;f[L+12>>2]=B;f[L+4>>2]=G;f[L>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(_>>>0);ga=$(n[l>>2]);do if(aa|$(ga*fa)>>0<3|(_+-1&_|0)!=0)&1;F=~~$(W($(ea/ga)))>>>0;Fh(i,M>>>0>>0?F:M);M=f[o>>2]|0;F=M+-1|0;if(!(F&M)){ha=M;ia=F&G;break}if(M>>>0>G>>>0){ha=M;ia=G}else{ha=M;ia=(G>>>0)%(M>>>0)|0}}else{ha=_;ia=Z}while(0);G=(f[i>>2]|0)+(ia<<2)|0;r=f[G>>2]|0;if(!r){f[L>>2]=f[v>>2];f[v>>2]=L;f[G>>2]=v;G=f[L>>2]|0;if(G|0){M=f[G+4>>2]|0;G=ha+-1|0;if(G&ha)if(M>>>0>>0)ja=M;else ja=(M>>>0)%(ha>>>0)|0;else ja=M&G;ka=(f[i>>2]|0)+(ja<<2)|0;ba=53}}else{f[L>>2]=f[r>>2];ka=r;ba=53}if((ba|0)==53){ba=0;f[ka>>2]=L}f[t>>2]=(f[t>>2]|0)+1;ba=55}if((ba|0)==55){ba=0;r=w;G=f[r>>2]|0;M=on(G|0,f[r+4>>2]|0,B|0,0)|0;Rg((f[f[x>>2]>>2]|0)+M|0,j|0,G|0)|0;G=f[k>>2]|0;f[G+(A<<2)>>2]=B;S=G;T=B+1|0;U=G;V=G;X=G}G=A+1|0;la=f[m>>2]|0;if(G>>>0>=la>>>0)break;e=f[o>>2]|0;z=S;A=G;B=T;C=V;D=U;E=X}if((T|0)==(la|0))ma=V;else{V=a+84|0;if(!(b[V>>0]|0)){X=f[a+72>>2]|0;E=f[a+68>>2]|0;D=E;if((X|0)==(E|0))na=S;else{C=X-E>>2;E=0;do{X=D+(E<<2)|0;f[X>>2]=f[U+(f[X>>2]<<2)>>2];E=E+1|0}while(E>>>0>>0);na=S}}else{b[V>>0]=0;V=a+68|0;S=a+72|0;C=f[S>>2]|0;E=f[V>>2]|0;U=C-E>>2;D=E;E=C;if(la>>>0<=U>>>0)if(la>>>0>>0?(C=D+(la<<2)|0,(C|0)!=(E|0)):0){f[S>>2]=E+(~((E+-4-C|0)>>>2)<<2);oa=la}else oa=la;else{kh(V,la-U|0,1204);oa=f[m>>2]|0}U=f[k>>2]|0;if(!oa)na=U;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[U+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);na=U}}f[m>>2]=T;ma=na}if(!ma)pa=T;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);br(ma);pa=T}}else pa=0;T=f[i+8>>2]|0;if(T|0){ma=T;do{T=ma;ma=f[ma>>2]|0;br(T)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}br(ma);u=g;return pa|0}function cc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=Oa,K=Oa,L=Oa,M=0,N=0,O=0,P=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=xd(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];Xe(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;ri(j,4);l=f[j>>2]|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;dj(i,c);c=i+12|0;f[c>>2]=0;m=i+16|0;f[m>>2]=0;f[i+20>>2]=0;l=f[k>>2]|0;d=f[j>>2]|0;o=l-d|0;if(!o){p=d;q=l;r=0}else{ri(c,o);p=f[j>>2]|0;q=f[k>>2]|0;r=f[c>>2]|0}Rg(r|0,p|0,q-p|0)|0;p=i+11|0;q=b[p>>0]|0;r=q<<24>>24<0;c=r?f[i>>2]|0:i;o=r?f[i+4>>2]|0:q&255;if(o>>>0>3){q=c;r=o;l=o;while(1){d=X(h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24,1540483477)|0;r=(X(d>>>24^d,1540483477)|0)^(X(r,1540483477)|0);l=l+-4|0;if(l>>>0<=3)break;else q=q+4|0}q=o+-4|0;l=q&-4;s=q-l|0;t=c+(l+4)|0;v=r}else{s=o;t=c;v=o}switch(s|0){case 3:{w=h[t+2>>0]<<16^v;x=10;break}case 2:{w=v;x=10;break}case 1:{y=v;x=11;break}default:z=v}if((x|0)==10){y=h[t+1>>0]<<8^w;x=11}if((x|0)==11)z=X(y^h[t>>0],1540483477)|0;t=X(z>>>13^z,1540483477)|0;z=t>>>15^t;t=a+4|0;y=f[t>>2]|0;w=(y|0)==0;a:do if(!w){v=y+-1|0;s=(v&y|0)==0;if(!s)if(z>>>0>>0)A=z;else A=(z>>>0)%(y>>>0)|0;else A=z&v;r=f[(f[a>>2]|0)+(A<<2)>>2]|0;if((r|0)!=0?(l=f[r>>2]|0,(l|0)!=0):0){r=(o|0)==0;if(s){if(r){s=l;while(1){q=f[s+4>>2]|0;if(!((q|0)==(z|0)|(q&v|0)==(A|0))){B=A;x=52;break a}q=b[s+8+11>>0]|0;if(!((q<<24>>24<0?f[s+12>>2]|0:q&255)|0))break a;s=f[s>>2]|0;if(!s){B=A;x=52;break a}}}else C=l;while(1){s=f[C+4>>2]|0;if(!((s|0)==(z|0)|(s&v|0)==(A|0))){B=A;x=52;break a}s=C+8|0;q=b[s+11>>0]|0;d=q<<24>>24<0;D=q&255;do if(((d?f[C+12>>2]|0:D)|0)==(o|0)){q=f[s>>2]|0;if(d)if(!(Pk(q,c,o)|0))break a;else break;if((b[c>>0]|0)==(q&255)<<24>>24){q=s;E=D;F=c;do{E=E+-1|0;q=q+1|0;if(!E)break a;F=F+1|0}while((b[q>>0]|0)==(b[F>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){B=A;x=52;break a}}}if(r){v=l;while(1){D=f[v+4>>2]|0;if((D|0)!=(z|0)){if(D>>>0>>0)G=D;else G=(D>>>0)%(y>>>0)|0;if((G|0)!=(A|0)){B=A;x=52;break a}}D=b[v+8+11>>0]|0;if(!((D<<24>>24<0?f[v+12>>2]|0:D&255)|0))break a;v=f[v>>2]|0;if(!v){B=A;x=52;break a}}}else H=l;while(1){v=f[H+4>>2]|0;if((v|0)!=(z|0)){if(v>>>0>>0)I=v;else I=(v>>>0)%(y>>>0)|0;if((I|0)!=(A|0)){B=A;x=52;break a}}v=H+8|0;r=b[v+11>>0]|0;D=r<<24>>24<0;s=r&255;do if(((D?f[H+12>>2]|0:s)|0)==(o|0)){r=f[v>>2]|0;if(D)if(!(Pk(r,c,o)|0))break a;else break;if((b[c>>0]|0)==(r&255)<<24>>24){r=v;d=s;F=c;do{d=d+-1|0;r=r+1|0;if(!d)break a;F=F+1|0}while((b[r>>0]|0)==(b[F>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){B=A;x=52;break}}}else{B=A;x=52}}else{B=0;x=52}while(0);if((x|0)==52){_h(g,a,z,i);x=a+12|0;J=$(((f[x>>2]|0)+1|0)>>>0);K=$(y>>>0);L=$(n[a+16>>2]);do if(w|$(L*K)>>0<3|(y+-1&y|0)!=0)&1;H=~~$(W($(J/L)))>>>0;Ph(a,A>>>0>>0?H:A);A=f[t>>2]|0;H=A+-1|0;if(!(H&A)){M=A;N=H&z;break}if(z>>>0>>0){M=A;N=z}else{M=A;N=(z>>>0)%(A>>>0)|0}}else{M=y;N=B}while(0);B=f[(f[a>>2]|0)+(N<<2)>>2]|0;if(!B){y=a+8|0;f[f[g>>2]>>2]=f[y>>2];f[y>>2]=f[g>>2];f[(f[a>>2]|0)+(N<<2)>>2]=y;y=f[g>>2]|0;N=f[y>>2]|0;if(!N)O=g;else{z=f[N+4>>2]|0;N=M+-1|0;if(N&M)if(z>>>0>>0)P=z;else P=(z>>>0)%(M>>>0)|0;else P=z&N;f[(f[a>>2]|0)+(P<<2)>>2]=y;O=g}}else{f[f[g>>2]>>2]=f[B>>2];f[B>>2]=f[g>>2];O=g}f[x>>2]=(f[x>>2]|0)+1;f[O>>2]=0}O=f[i+12>>2]|0;if(O|0){if((f[m>>2]|0)!=(O|0))f[m>>2]=O;br(O)}if((b[p>>0]|0)<0)br(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;br(i);u=e;return}function dc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=Oa,da=Oa,ea=Oa,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=u;u=u+48|0;g=e+12|0;h=e+32|0;i=e;j=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[j>>2]=$(1.0);k=a+80|0;l=f[k>>2]|0;f[i>>2]=0;m=i+4|0;f[m>>2]=0;f[i+8>>2]=0;if(l){if(l>>>0>1073741823)mq(i);o=l<<2;p=dn(o)|0;f[i>>2]=p;q=p+(l<<2)|0;f[i+8>>2]=q;hj(p|0,0,o|0)|0;f[m>>2]=q;q=c+48|0;o=c+40|0;l=g+4|0;r=g+12|0;s=g+8|0;t=a+40|0;v=a+64|0;w=f[d>>2]|0;d=0;x=p;y=0;z=0;A=p;B=p;C=p;while(1){p=q;D=f[p>>2]|0;E=f[p+4>>2]|0;p=o;F=on(f[p>>2]|0,f[p+4>>2]|0,w+y|0,0)|0;p=Tn(F|0,I|0,D|0,E|0)|0;E=b[(f[f[c>>2]>>2]|0)+p>>0]|0;b[h>>0]=E;p=E&255^318;a:do if(d){D=d+-1|0;F=(D&d|0)==0;if(!F)if(p>>>0>>0)G=p;else G=(p>>>0)%(d>>>0)|0;else G=D&p;H=f[g>>2]|0;J=f[H+(G<<2)>>2]|0;b:do if(J|0?(K=f[J>>2]|0,K|0):0){c:do if(F){L=K;while(1){M=f[L+4>>2]|0;N=(M|0)==(p|0);if(!(N|(M&D|0)==(G|0)))break b;if(N?(b[L+8>>0]|0)==E<<24>>24:0){O=L;break c}L=f[L>>2]|0;if(!L)break b}}else{L=K;while(1){N=f[L+4>>2]|0;if((N|0)==(p|0)){if((b[L+8>>0]|0)==E<<24>>24){O=L;break c}}else{if(N>>>0>>0)P=N;else P=(N>>>0)%(d>>>0)|0;if((P|0)!=(G|0))break b}L=f[L>>2]|0;if(!L)break b}}while(0);f[C+(y<<2)>>2]=f[O+12>>2];Q=x;R=z;S=B;T=A;U=C;break a}while(0);if(!F)if(p>>>0>>0)V=p;else V=(p>>>0)%(d>>>0)|0;else V=D&p;J=f[H+(V<<2)>>2]|0;if(!J){X=V;Y=d;Z=0;_=40}else{if(F){K=J;while(1){K=f[K>>2]|0;if(!K){X=V;Y=d;Z=0;_=40;break a}L=f[K+4>>2]|0;if(!((L|0)==(p|0)|(L&D|0)==(V|0))){X=V;Y=d;Z=0;_=40;break a}if((b[K+8>>0]|0)==E<<24>>24){_=55;break a}}}else aa=J;while(1){aa=f[aa>>2]|0;if(!aa){X=V;Y=d;Z=0;_=40;break a}K=f[aa+4>>2]|0;if((K|0)!=(p|0)){if(K>>>0>>0)ba=K;else ba=(K>>>0)%(d>>>0)|0;if((ba|0)!=(V|0)){X=V;Y=d;Z=0;_=40;break a}}if((b[aa+8>>0]|0)==E<<24>>24){_=55;break}}}}else{X=0;Y=0;Z=1;_=40}while(0);if((_|0)==40){_=0;J=dn(16)|0;b[J+8>>0]=E;f[J+12>>2]=z;f[J+4>>2]=p;f[J>>2]=0;ca=$(((f[r>>2]|0)+1|0)>>>0);da=$(Y>>>0);ea=$(n[j>>2]);do if(Z|$(ea*da)>>0<3|(Y+-1&Y|0)!=0)&1;D=~~$(W($(ca/ea)))>>>0;Mh(g,K>>>0>>0?D:K);K=f[l>>2]|0;D=K+-1|0;if(!(D&K)){fa=K;ga=D&p;break}if(p>>>0>>0){fa=K;ga=p}else{fa=K;ga=(p>>>0)%(K>>>0)|0}}else{fa=Y;ga=X}while(0);p=(f[g>>2]|0)+(ga<<2)|0;E=f[p>>2]|0;if(!E){f[J>>2]=f[s>>2];f[s>>2]=J;f[p>>2]=s;p=f[J>>2]|0;if(p|0){K=f[p+4>>2]|0;p=fa+-1|0;if(p&fa)if(K>>>0>>0)ha=K;else ha=(K>>>0)%(fa>>>0)|0;else ha=K&p;ia=(f[g>>2]|0)+(ha<<2)|0;_=53}}else{f[J>>2]=f[E>>2];ia=E;_=53}if((_|0)==53){_=0;f[ia>>2]=J}f[r>>2]=(f[r>>2]|0)+1;_=55}if((_|0)==55){_=0;E=t;p=f[E>>2]|0;K=on(p|0,f[E+4>>2]|0,z|0,0)|0;Rg((f[f[v>>2]>>2]|0)+K|0,h|0,p|0)|0;p=f[i>>2]|0;f[p+(y<<2)>>2]=z;Q=p;R=z+1|0;S=p;T=p;U=p}p=y+1|0;ja=f[k>>2]|0;if(p>>>0>=ja>>>0)break;d=f[l>>2]|0;x=Q;y=p;z=R;A=T;B=S;C=U}if((R|0)==(ja|0))ka=T;else{T=a+84|0;if(!(b[T>>0]|0)){U=f[a+72>>2]|0;C=f[a+68>>2]|0;B=C;if((U|0)==(C|0))la=Q;else{A=U-C>>2;C=0;do{U=B+(C<<2)|0;f[U>>2]=f[S+(f[U>>2]<<2)>>2];C=C+1|0}while(C>>>0>>0);la=Q}}else{b[T>>0]=0;T=a+68|0;Q=a+72|0;A=f[Q>>2]|0;C=f[T>>2]|0;S=A-C>>2;B=C;C=A;if(ja>>>0<=S>>>0)if(ja>>>0>>0?(A=B+(ja<<2)|0,(A|0)!=(C|0)):0){f[Q>>2]=C+(~((C+-4-A|0)>>>2)<<2);ma=ja}else ma=ja;else{kh(T,ja-S|0,1204);ma=f[k>>2]|0}S=f[i>>2]|0;if(!ma)la=S;else{i=f[a+68>>2]|0;a=0;do{f[i+(a<<2)>>2]=f[S+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);la=S}}f[k>>2]=R;ka=la}if(!ka)na=R;else{la=f[m>>2]|0;if((la|0)!=(ka|0))f[m>>2]=la+(~((la+-4-ka|0)>>>2)<<2);br(ka);na=R}}else na=0;R=f[g+8>>2]|0;if(R|0){ka=R;do{R=ka;ka=f[ka>>2]|0;br(R)}while((ka|0)!=0)}ka=f[g>>2]|0;f[g>>2]=0;if(!ka){u=e;return na|0}br(ka);u=e;return na|0}function ec(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=Oa,ea=Oa,fa=Oa,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0;e=u;u=u+48|0;g=e+16|0;i=e+12|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=c+48|0;p=c+40|0;m=g+4|0;s=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=f[d>>2]|0;d=0;y=q;z=0;A=0;B=q;C=q;D=q;while(1){q=r;E=f[q>>2]|0;F=f[q+4>>2]|0;q=p;G=on(f[q>>2]|0,f[q+4>>2]|0,x+z|0,0)|0;q=Tn(G|0,I|0,E|0,F|0)|0;F=(f[f[c>>2]>>2]|0)+q|0;q=h[F>>0]|h[F+1>>0]<<8|h[F+2>>0]<<16|h[F+3>>0]<<24;f[i>>2]=q;F=q^318;a:do if(d){E=d+-1|0;G=(E&d|0)==0;if(!G)if(F>>>0>>0)H=F;else H=(F>>>0)%(d>>>0)|0;else H=E&F;J=f[g>>2]|0;K=f[J+(H<<2)>>2]|0;b:do if(K|0?(L=f[K>>2]|0,L|0):0){c:do if(G){M=L;while(1){N=f[M+4>>2]|0;O=(N|0)==(F|0);if(!(O|(N&E|0)==(H|0)))break b;if(O?(f[M+8>>2]|0)==(q|0):0){P=M;break c}M=f[M>>2]|0;if(!M)break b}}else{M=L;while(1){O=f[M+4>>2]|0;if((O|0)==(F|0)){if((f[M+8>>2]|0)==(q|0)){P=M;break c}}else{if(O>>>0>>0)Q=O;else Q=(O>>>0)%(d>>>0)|0;if((Q|0)!=(H|0))break b}M=f[M>>2]|0;if(!M)break b}}while(0);f[D+(z<<2)>>2]=f[P+12>>2];R=y;S=A;T=C;U=B;V=D;break a}while(0);if(!G)if(F>>>0>>0)X=F;else X=(F>>>0)%(d>>>0)|0;else X=E&F;K=f[J+(X<<2)>>2]|0;if(!K){Y=X;Z=d;_=0;aa=40}else{if(G){L=K;while(1){L=f[L>>2]|0;if(!L){Y=X;Z=d;_=0;aa=40;break a}M=f[L+4>>2]|0;if(!((M|0)==(F|0)|(M&E|0)==(X|0))){Y=X;Z=d;_=0;aa=40;break a}if((f[L+8>>2]|0)==(q|0)){aa=55;break a}}}else ba=K;while(1){ba=f[ba>>2]|0;if(!ba){Y=X;Z=d;_=0;aa=40;break a}L=f[ba+4>>2]|0;if((L|0)!=(F|0)){if(L>>>0>>0)ca=L;else ca=(L>>>0)%(d>>>0)|0;if((ca|0)!=(X|0)){Y=X;Z=d;_=0;aa=40;break a}}if((f[ba+8>>2]|0)==(q|0)){aa=55;break}}}}else{Y=0;Z=0;_=1;aa=40}while(0);if((aa|0)==40){aa=0;K=dn(16)|0;f[K+8>>2]=q;f[K+12>>2]=A;f[K+4>>2]=F;f[K>>2]=0;da=$(((f[s>>2]|0)+1|0)>>>0);ea=$(Z>>>0);fa=$(n[k>>2]);do if(_|$(fa*ea)>>0<3|(Z+-1&Z|0)!=0)&1;E=~~$(W($(da/fa)))>>>0;ti(g,L>>>0>>0?E:L);L=f[m>>2]|0;E=L+-1|0;if(!(E&L)){ga=L;ha=E&F;break}if(F>>>0>>0){ga=L;ha=F}else{ga=L;ha=(F>>>0)%(L>>>0)|0}}else{ga=Z;ha=Y}while(0);F=(f[g>>2]|0)+(ha<<2)|0;q=f[F>>2]|0;if(!q){f[K>>2]=f[t>>2];f[t>>2]=K;f[F>>2]=t;F=f[K>>2]|0;if(F|0){L=f[F+4>>2]|0;F=ga+-1|0;if(F&ga)if(L>>>0>>0)ia=L;else ia=(L>>>0)%(ga>>>0)|0;else ia=L&F;ja=(f[g>>2]|0)+(ia<<2)|0;aa=53}}else{f[K>>2]=f[q>>2];ja=q;aa=53}if((aa|0)==53){aa=0;f[ja>>2]=K}f[s>>2]=(f[s>>2]|0)+1;aa=55}if((aa|0)==55){aa=0;q=v;F=f[q>>2]|0;L=on(F|0,f[q+4>>2]|0,A|0,0)|0;Rg((f[f[w>>2]>>2]|0)+L|0,i|0,F|0)|0;F=f[j>>2]|0;f[F+(z<<2)>>2]=A;R=F;S=A+1|0;T=F;U=F;V=F}F=z+1|0;ka=f[l>>2]|0;if(F>>>0>=ka>>>0)break;d=f[m>>2]|0;y=R;z=F;A=S;B=U;C=T;D=V}if((S|0)==(ka|0))la=U;else{U=a+84|0;if(!(b[U>>0]|0)){V=f[a+72>>2]|0;D=f[a+68>>2]|0;C=D;if((V|0)==(D|0))ma=R;else{B=V-D>>2;D=0;do{V=C+(D<<2)|0;f[V>>2]=f[T+(f[V>>2]<<2)>>2];D=D+1|0}while(D>>>0>>0);ma=R}}else{b[U>>0]=0;U=a+68|0;R=a+72|0;B=f[R>>2]|0;D=f[U>>2]|0;T=B-D>>2;C=D;D=B;if(ka>>>0<=T>>>0)if(ka>>>0>>0?(B=C+(ka<<2)|0,(B|0)!=(D|0)):0){f[R>>2]=D+(~((D+-4-B|0)>>>2)<<2);na=ka}else na=ka;else{kh(U,ka-T|0,1204);na=f[l>>2]|0}T=f[j>>2]|0;if(!na)ma=T;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[T+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);ma=T}}f[l>>2]=S;la=ma}if(!la)oa=S;else{ma=f[o>>2]|0;if((ma|0)!=(la|0))f[o>>2]=ma+(~((ma+-4-la|0)>>>2)<<2);br(la);oa=S}}else oa=0;S=f[g+8>>2]|0;if(S|0){la=S;do{S=la;la=f[la>>2]|0;br(S)}while((la|0)!=0)}la=f[g>>2]|0;f[g>>2]=0;if(!la){u=e;return oa|0}br(la);u=e;return oa|0}function fc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=f[(f[n+28>>2]|0)+(o<<2)>>2]|0;n=a+20|0;q=f[n>>2]|0;r=f[q>>2]|0;if((f[q+4>>2]|0)-r>>2>>>0<=p>>>0)mq(q);q=a+8|0;s=f[(f[q>>2]|0)+(f[r+(p<<2)>>2]<<2)>>2]|0;p=a+4|0;r=f[p>>2]|0;if(!(b[r+84>>0]|0))t=f[(f[r+68>>2]|0)+(s<<2)>>2]|0;else t=s;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=t;t=b[r+24>>0]|0;f[g>>2]=f[h>>2];ub(r,g,t,j)|0;t=a+28|0;a=(f[t>>2]|0)==0;a:do if((o|0)!=-1){r=k+8|0;s=j+8|0;v=k+16|0;w=j+16|0;x=l+8|0;y=l+16|0;z=o;A=o;B=0;C=0;D=0;E=0;F=0;G=0;H=a;J=o;while(1){do if(H){K=J+1|0;if((J|0)!=-1){L=((K>>>0)%3|0|0)==0?J+-2|0:K;if((z|0)!=-1)if(!((z>>>0)%3|0)){M=z;N=z+2|0;O=L;P=z;break}else{M=z;N=z+-1|0;O=L;P=z;break}else{M=-1;N=-1;O=L;P=-1}}else{M=z;N=-1;O=-1;P=-1}}else{L=A+1|0;K=((L>>>0)%3|0|0)==0?A+-2|0:L;if(!((A>>>0)%3|0)){M=z;N=A+2|0;O=K;P=J;break}else{M=z;N=A+-1|0;O=K;P=J;break}}while(0);K=f[(f[(f[m>>2]|0)+28>>2]|0)+(O<<2)>>2]|0;Q=f[n>>2]|0;L=f[Q>>2]|0;if((f[Q+4>>2]|0)-L>>2>>>0<=K>>>0){R=17;break}S=f[(f[q>>2]|0)+(f[L+(K<<2)>>2]<<2)>>2]|0;K=f[p>>2]|0;if(!(b[K+84>>0]|0))T=f[(f[K+68>>2]|0)+(S<<2)>>2]|0;else T=S;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=T;S=b[K+24>>0]|0;f[g>>2]=f[h>>2];ub(K,g,S,k)|0;S=f[(f[(f[m>>2]|0)+28>>2]|0)+(N<<2)>>2]|0;U=f[n>>2]|0;K=f[U>>2]|0;if((f[U+4>>2]|0)-K>>2>>>0<=S>>>0){R=21;break}L=f[(f[q>>2]|0)+(f[K+(S<<2)>>2]<<2)>>2]|0;S=f[p>>2]|0;if(!(b[S+84>>0]|0))V=f[(f[S+68>>2]|0)+(L<<2)>>2]|0;else V=L;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=V;L=b[S+24>>0]|0;f[g>>2]=f[h>>2];ub(S,g,L,l)|0;L=k;S=j;K=f[S>>2]|0;W=f[S+4>>2]|0;S=Vn(f[L>>2]|0,f[L+4>>2]|0,K|0,W|0)|0;L=I;X=r;Y=s;Z=f[Y>>2]|0;_=f[Y+4>>2]|0;Y=Vn(f[X>>2]|0,f[X+4>>2]|0,Z|0,_|0)|0;X=I;$=v;aa=w;ba=f[aa>>2]|0;ca=f[aa+4>>2]|0;aa=Vn(f[$>>2]|0,f[$+4>>2]|0,ba|0,ca|0)|0;$=I;da=l;ea=Vn(f[da>>2]|0,f[da+4>>2]|0,K|0,W|0)|0;W=I;K=x;da=Vn(f[K>>2]|0,f[K+4>>2]|0,Z|0,_|0)|0;_=I;Z=y;K=Vn(f[Z>>2]|0,f[Z+4>>2]|0,ba|0,ca|0)|0;ca=I;ba=on(K|0,ca|0,Y|0,X|0)|0;Z=I;fa=on(da|0,_|0,aa|0,$|0)|0;ga=I;ha=on(ea|0,W|0,aa|0,$|0)|0;$=I;aa=on(K|0,ca|0,S|0,L|0)|0;ca=I;K=on(da|0,_|0,S|0,L|0)|0;L=I;S=on(ea|0,W|0,Y|0,X|0)|0;X=I;Y=Vn(B|0,C|0,fa|0,ga|0)|0;ga=Tn(Y|0,I|0,ba|0,Z|0)|0;Z=I;ba=Tn(ha|0,$|0,D|0,E|0)|0;$=Vn(ba|0,I|0,aa|0,ca|0)|0;ca=I;aa=Vn(F|0,G|0,S|0,X|0)|0;X=Tn(aa|0,I|0,K|0,L|0)|0;L=I;xg(i);A=f[c>>2]|0;K=(f[t>>2]|0)==0;if((A|0)==-1){ia=K;ja=Z;ka=ga;la=ca;ma=$;na=L;oa=X;break a}else{z=M;B=ga;C=Z;D=$;E=ca;F=X;G=L;H=K;J=P}}if((R|0)==17)mq(Q);else if((R|0)==21)mq(U)}else{ia=a;ja=0;ka=0;la=0;ma=0;na=0;oa=0}while(0);a=(ja|0)>-1|(ja|0)==-1&ka>>>0>4294967295;U=Vn(0,0,ka|0,ja|0)|0;R=a?ja:I;Q=(la|0)>-1|(la|0)==-1&ma>>>0>4294967295;P=Vn(0,0,ma|0,la|0)|0;M=Q?la:I;t=(na|0)>-1|(na|0)==-1&oa>>>0>4294967295;c=Vn(0,0,oa|0,na|0)|0;i=Tn((Q?ma:P)|0,M|0,(t?oa:c)|0,(t?na:I)|0)|0;t=Tn(i|0,I|0,(a?ka:U)|0,R|0)|0;R=I;if(ia){if((t|0)<=536870912){pa=ka;qa=ma;ra=oa;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}ia=Wn(t|0,R|0,29)|0;U=ia&7;ia=zk(ka|0,ja|0,U|0,0)|0;a=zk(ma|0,la|0,U|0,0)|0;i=zk(oa|0,na|0,U|0,0)|0;pa=ia;qa=a;ra=i;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}else{if(!((R|0)>0|(R|0)==0&t>>>0>536870912)){pa=ka;qa=ma;ra=oa;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}i=Wn(t|0,R|0,29)|0;R=I;t=zk(ka|0,ja|0,i|0,R|0)|0;ja=zk(ma|0,la|0,i|0,R|0)|0;la=zk(oa|0,na|0,i|0,R|0)|0;pa=t;qa=ja;ra=la;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}}function gc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;g=u;u=u+48|0;i=g+28|0;j=g+8|0;k=g;l=g+16|0;m=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[m>>2]=$(1.0);o=a+80|0;p=f[o>>2]|0;f[l>>2]=0;q=l+4|0;f[q>>2]=0;f[l+8>>2]=0;if(p){if(p>>>0>1073741823)mq(l);r=p<<2;s=dn(r)|0;f[l>>2]=s;t=s+(p<<2)|0;f[l+8>>2]=t;hj(s|0,0,r|0)|0;f[q>>2]=t;t=f[e>>2]|0;e=c+48|0;r=c+40|0;s=i+4|0;p=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=e;B=f[A>>2]|0;C=f[A+4>>2]|0;A=r;D=on(f[A>>2]|0,f[A+4>>2]|0,t+y|0,0)|0;A=Tn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;A=C;B=h[A>>0]|h[A+1>>0]<<8|h[A+2>>0]<<16|h[A+3>>0]<<24;A=C+4|0;C=h[A>>0]|h[A+1>>0]<<8|h[A+2>>0]<<16|h[A+3>>0]<<24;A=j;f[A>>2]=B;f[A+4>>2]=C;A=k;f[A>>2]=B;f[A+4>>2]=C;C=kf(i,k)|0;if(!C){A=k;B=f[A>>2]|0;D=f[A+4>>2]|0;A=B&65535;E=Wn(B|0,D|0,16)|0;F=E&65535;G=D&65535;H=Wn(B|0,D|0,48)|0;J=H&65535;K=((((A^318)&65535)+239^E&65535)+239^D&65535)+239^H&65535;H=f[s>>2]|0;E=(H|0)==0;a:do if(!E){L=H+-1|0;M=(L&H|0)==0;if(!M)if(K>>>0>>0)N=K;else N=(K>>>0)%(H>>>0)|0;else N=K&L;O=f[(f[i>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(K|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}O=M+8|0;if((((d[O>>1]|0)==A<<16>>16?(d[O+2>>1]|0)==F<<16>>16:0)?(d[M+12>>1]|0)==G<<16>>16:0)?(d[O+6>>1]|0)==J<<16>>16:0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(K|0)){if(M>>>0>>0)T=M;else T=(M>>>0)%(H>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}M=S+8|0;if((((d[M>>1]|0)==A<<16>>16?(d[M+2>>1]|0)==F<<16>>16:0)?(d[S+12>>1]|0)==G<<16>>16:0)?(d[M+6>>1]|0)==J<<16>>16:0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;J=dn(20)|0;G=J+8|0;F=G;d[F>>1]=B;d[F+2>>1]=B>>>16;F=G+4|0;d[F>>1]=D;d[F+2>>1]=D>>>16;f[J+16>>2]=z;f[J+4>>2]=K;f[J>>2]=0;U=$(((f[p>>2]|0)+1|0)>>>0);V=$(H>>>0);X=$(n[m>>2]);do if(E|$(X*V)>>0<3|(H+-1&H|0)!=0)&1;G=~~$(W($(U/X)))>>>0;Ch(i,F>>>0>>0?G:F);F=f[s>>2]|0;G=F+-1|0;if(!(G&F)){Y=F;Z=G&K;break}if(K>>>0>>0){Y=F;Z=K}else{Y=F;Z=(K>>>0)%(F>>>0)|0}}else{Y=H;Z=Q}while(0);H=(f[i>>2]|0)+(Z<<2)|0;K=f[H>>2]|0;if(!K){f[J>>2]=f[v>>2];f[v>>2]=J;f[H>>2]=v;H=f[J>>2]|0;if(H|0){E=f[H+4>>2]|0;H=Y+-1|0;if(H&Y)if(E>>>0>>0)_=E;else _=(E>>>0)%(Y>>>0)|0;else _=E&H;aa=(f[i>>2]|0)+(_<<2)|0;R=44}}else{f[J>>2]=f[K>>2];aa=K;R=44}if((R|0)==44){R=0;f[aa>>2]=J}f[p>>2]=(f[p>>2]|0)+1}K=w;H=f[K>>2]|0;E=on(H|0,f[K+4>>2]|0,z|0,0)|0;Rg((f[f[x>>2]>>2]|0)+E|0,j|0,H|0)|0;H=f[l>>2]|0;f[H+(y<<2)>>2]=z;ba=z+1|0;ca=H}else{H=f[l>>2]|0;f[H+(y<<2)>>2]=f[C+16>>2];ba=z;ca=H}y=y+1|0;da=f[o>>2]|0;if(y>>>0>=da>>>0)break;else z=ba}if((ba|0)==(da|0))ea=ca;else{z=a+84|0;if(!(b[z>>0]|0)){y=f[a+72>>2]|0;j=f[a+68>>2]|0;x=j;if((y|0)==(j|0))fa=ca;else{w=y-j>>2;j=0;do{y=x+(j<<2)|0;f[y>>2]=f[ca+(f[y>>2]<<2)>>2];j=j+1|0}while(j>>>0>>0);fa=ca}}else{b[z>>0]=0;z=a+68|0;ca=a+72|0;w=f[ca>>2]|0;j=f[z>>2]|0;x=w-j>>2;y=j;j=w;if(da>>>0<=x>>>0)if(da>>>0>>0?(w=y+(da<<2)|0,(w|0)!=(j|0)):0){f[ca>>2]=j+(~((j+-4-w|0)>>>2)<<2);ga=da}else ga=da;else{kh(z,da-x|0,1204);ga=f[o>>2]|0}x=f[l>>2]|0;if(!ga)fa=x;else{l=f[a+68>>2]|0;a=0;do{f[l+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);fa=x}}f[o>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[q>>2]|0;if((fa|0)!=(ea|0))f[q>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);br(ea);ha=ba}}else ha=0;ba=f[i+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;br(ba)}while((ea|0)!=0)}ea=f[i>>2]|0;f[i>>2]=0;if(!ea){u=g;return ha|0}br(ea);u=g;return ha|0}function hc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;c=u;u=u+16|0;d=c+8|0;e=c;g=c+4|0;h=a+16|0;i=f[h>>2]|0;j=a+20|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k+(~((k+-4-i|0)>>>2)<<2)|0;f[j>>2]=m;l=m}m=a+24|0;if((l|0)==(f[m>>2]|0)){Ci(h,b);n=f[h>>2]|0;o=f[j>>2]|0}else{f[l>>2]=f[b>>2];k=l+4|0;f[j>>2]=k;n=i;o=k}k=f[a+8>>2]|0;i=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(i|0)/12|0;if((n|0)==(o|0)){u=c;return 1}n=a+28|0;l=(i|0)>0;i=a+164|0;p=a+12|0;q=a+76|0;r=a+80|0;s=a+72|0;t=a+152|0;v=a+84|0;w=a+272|0;x=a+276|0;y=a+268|0;z=a+168|0;A=a+140|0;B=a+120|0;C=o;do{o=f[C+-4>>2]|0;f[b>>2]=o;a:do if((o|0)!=-1?(D=(o>>>0)/3|0,E=f[n>>2]|0,(f[E+(D>>>5<<2)>>2]&1<<(D&31)|0)==0):0){if(l){D=0;F=E;b:while(1){E=D+1|0;f[i>>2]=(f[i>>2]|0)+1;G=f[b>>2]|0;H=(G|0)==-1?-1:(G>>>0)/3|0;G=F+(H>>>5<<2)|0;f[G>>2]=1<<(H&31)|f[G>>2];G=f[q>>2]|0;if((G|0)==(f[r>>2]|0))Ci(s,b);else{f[G>>2]=f[b>>2];f[q>>2]=G+4}G=f[b>>2]|0;if((G|0)==-1)I=-1;else I=f[(f[f[p>>2]>>2]|0)+(G<<2)>>2]|0;J=(f[(f[t>>2]|0)+(I<<2)>>2]|0)!=-1;K=(f[v>>2]|0)+(I>>>5<<2)|0;L=1<<(I&31);M=f[K>>2]|0;do if(!(M&L)){f[K>>2]=M|L;if(J){N=f[b>>2]|0;O=30;break}f[d>>2]=0;P=f[w>>2]|0;if((P|0)==(f[x>>2]|0))Ci(y,d);else{f[P>>2]=0;f[w>>2]=P+4}P=f[b>>2]|0;Q=P+1|0;if((P|0)!=-1?(R=((Q>>>0)%3|0|0)==0?P+-2|0:Q,(R|0)!=-1):0)S=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;else S=-1;f[b>>2]=S}else{N=G;O=30}while(0);if((O|0)==30){O=0;G=N+1|0;if((N|0)==-1){O=35;break}L=((G>>>0)%3|0|0)==0?N+-2|0:G;if((L|0)==-1)T=-1;else T=f[(f[(f[p>>2]|0)+12>>2]|0)+(L<<2)>>2]|0;f[e>>2]=T;L=(((N>>>0)%3|0|0)==0?2:-1)+N|0;if((L|0)==-1)U=-1;else U=f[(f[(f[p>>2]|0)+12>>2]|0)+(L<<2)>>2]|0;L=(T|0)==-1;M=L?-1:(T>>>0)/3|0;V=(U|0)==-1;W=V?-1:(U>>>0)/3|0;K=((G>>>0)%3|0|0)==0?N+-2|0:G;if(((K|0)!=-1?(G=f[(f[p>>2]|0)+12>>2]|0,R=f[G+(K<<2)>>2]|0,(R|0)!=-1):0)?(K=(R>>>0)/3|0,R=f[n>>2]|0,(f[R+(K>>>5<<2)>>2]&1<<(K&31)|0)==0):0){K=(((N>>>0)%3|0|0)==0?2:-1)+N|0;do if((K|0)!=-1){Q=f[G+(K<<2)>>2]|0;if((Q|0)==-1)break;P=(Q>>>0)/3|0;if(!(f[R+(P>>>5<<2)>>2]&1<<(P&31))){O=63;break b}}while(0);if(!V)jf(a,f[i>>2]|0,H,0,W);f[d>>2]=3;R=f[w>>2]|0;if((R|0)==(f[x>>2]|0))Ci(y,d);else{f[R>>2]=3;f[w>>2]=R+4}X=f[e>>2]|0}else{if(!L){jf(a,f[i>>2]|0,H,1,M);R=f[b>>2]|0;if((R|0)==-1){O=44;break}else Y=R}else Y=N;R=(((Y>>>0)%3|0|0)==0?2:-1)+Y|0;if((R|0)==-1){O=44;break}K=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;if((K|0)==-1){O=44;break}R=(K>>>0)/3|0;if(f[(f[n>>2]|0)+(R>>>5<<2)>>2]&1<<(R&31)|0){O=44;break}f[d>>2]=5;R=f[w>>2]|0;if((R|0)==(f[x>>2]|0))Ci(y,d);else{f[R>>2]=5;f[w>>2]=R+4}X=U}f[b>>2]=X}if((E|0)>=(k|0))break a;D=E;F=f[n>>2]|0}do if((O|0)==35){O=0;f[e>>2]=-1;O=46}else if((O|0)==44){O=0;if(V)O=46;else{jf(a,f[i>>2]|0,H,0,W);O=46}}else if((O|0)==63){O=0;f[d>>2]=1;F=f[w>>2]|0;if((F|0)==(f[x>>2]|0))Ci(y,d);else{f[F>>2]=1;f[w>>2]=F+4}f[z>>2]=(f[z>>2]|0)+1;if(J?(F=f[(f[t>>2]|0)+(I<<2)>>2]|0,(1<<(F&31)&f[(f[A>>2]|0)+(F>>>5<<2)>>2]|0)==0):0){f[g>>2]=f[b>>2];f[d>>2]=f[g>>2];Ce(a,d,0)|0}F=f[i>>2]|0;f[d>>2]=H;D=Sd(B,d)|0;f[D>>2]=F;F=f[j>>2]|0;f[F+-4>>2]=U;if((F|0)==(f[m>>2]|0)){Ci(h,e);break}else{f[F>>2]=f[e>>2];f[j>>2]=F+4;break}}while(0);if((O|0)==46){O=0;f[d>>2]=7;F=f[w>>2]|0;if((F|0)==(f[x>>2]|0))Ci(y,d);else{f[F>>2]=7;f[w>>2]=F+4}f[j>>2]=(f[j>>2]|0)+-4}}}else O=11;while(0);if((O|0)==11){O=0;f[j>>2]=C+-4}C=f[j>>2]|0}while((f[h>>2]|0)!=(C|0));u=c;return 1}function ic(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;e=u;u=u+48|0;g=e+20|0;i=e+16|0;j=e+12|0;k=e;l=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=f[d>>2]|0;d=c+48|0;q=c+40|0;r=g+4|0;o=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=0;y=0;while(1){z=d;A=f[z>>2]|0;B=f[z+4>>2]|0;z=q;C=on(f[z>>2]|0,f[z+4>>2]|0,s+x|0,0)|0;z=Tn(C|0,I|0,A|0,B|0)|0;B=(f[f[c>>2]>>2]|0)+z|0;z=h[B>>0]|h[B+1>>0]<<8|h[B+2>>0]<<16|h[B+3>>0]<<24;f[i>>2]=z;f[j>>2]=z;z=pf(g,j)|0;if(!z){B=f[j>>2]|0;A=B&255;C=B>>>8;D=C&255;E=B>>>16;F=E&255;G=B>>>24;H=G&255;J=C&255;C=E&255;E=(((B&255^318)+239^J)+239^C)+239^G;G=f[r>>2]|0;K=(G|0)==0;a:do if(!K){L=G+-1|0;M=(L&G|0)==0;if(!M)if(E>>>0>>0)N=E;else N=(E>>>0)%(G>>>0)|0;else N=E&L;O=f[(f[g>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(E|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}O=M+8|0;if((((b[O>>0]|0)==A<<24>>24?(b[O+1>>0]|0)==D<<24>>24:0)?(b[O+2>>0]|0)==F<<24>>24:0)?(b[O+3>>0]|0)==H<<24>>24:0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(E|0)){if(M>>>0>>0)T=M;else T=(M>>>0)%(G>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}M=S+8|0;if((((b[M>>0]|0)==A<<24>>24?(b[M+1>>0]|0)==D<<24>>24:0)?(b[M+2>>0]|0)==F<<24>>24:0)?(b[M+3>>0]|0)==H<<24>>24:0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;H=dn(16)|0;F=H+8|0;D=B&-16776961|C<<16|J<<8;b[F>>0]=D;b[F+1>>0]=D>>8;b[F+2>>0]=D>>16;b[F+3>>0]=D>>24;f[H+12>>2]=y;f[H+4>>2]=E;f[H>>2]=0;U=$(((f[o>>2]|0)+1|0)>>>0);V=$(G>>>0);X=$(n[l>>2]);do if(K|$(X*V)>>0<3|(G+-1&G|0)!=0)&1;F=~~$(W($(U/X)))>>>0;Jh(g,D>>>0>>0?F:D);D=f[r>>2]|0;F=D+-1|0;if(!(F&D)){Y=D;Z=F&E;break}if(E>>>0>>0){Y=D;Z=E}else{Y=D;Z=(E>>>0)%(D>>>0)|0}}else{Y=G;Z=Q}while(0);G=(f[g>>2]|0)+(Z<<2)|0;E=f[G>>2]|0;if(!E){f[H>>2]=f[t>>2];f[t>>2]=H;f[G>>2]=t;G=f[H>>2]|0;if(G|0){K=f[G+4>>2]|0;G=Y+-1|0;if(G&Y)if(K>>>0>>0)_=K;else _=(K>>>0)%(Y>>>0)|0;else _=K&G;aa=(f[g>>2]|0)+(_<<2)|0;R=44}}else{f[H>>2]=f[E>>2];aa=E;R=44}if((R|0)==44){R=0;f[aa>>2]=H}f[o>>2]=(f[o>>2]|0)+1}E=v;G=f[E>>2]|0;K=on(G|0,f[E+4>>2]|0,y|0,0)|0;Rg((f[f[w>>2]>>2]|0)+K|0,i|0,G|0)|0;G=f[k>>2]|0;f[G+(x<<2)>>2]=y;ba=y+1|0;ca=G}else{G=f[k>>2]|0;f[G+(x<<2)>>2]=f[z+12>>2];ba=y;ca=G}x=x+1|0;da=f[m>>2]|0;if(x>>>0>=da>>>0)break;else y=ba}if((ba|0)==(da|0))ea=ca;else{y=a+84|0;if(!(b[y>>0]|0)){x=f[a+72>>2]|0;i=f[a+68>>2]|0;w=i;if((x|0)==(i|0))fa=ca;else{v=x-i>>2;i=0;do{x=w+(i<<2)|0;f[x>>2]=f[ca+(f[x>>2]<<2)>>2];i=i+1|0}while(i>>>0>>0);fa=ca}}else{b[y>>0]=0;y=a+68|0;ca=a+72|0;v=f[ca>>2]|0;i=f[y>>2]|0;w=v-i>>2;x=i;i=v;if(da>>>0<=w>>>0)if(da>>>0>>0?(v=x+(da<<2)|0,(v|0)!=(i|0)):0){f[ca>>2]=i+(~((i+-4-v|0)>>>2)<<2);ga=da}else ga=da;else{kh(y,da-w|0,1204);ga=f[m>>2]|0}w=f[k>>2]|0;if(!ga)fa=w;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[w+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);fa=w}}f[m>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[p>>2]|0;if((fa|0)!=(ea|0))f[p>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);br(ea);ha=ba}}else ha=0;ba=f[g+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;br(ba)}while((ea|0)!=0)}ea=f[g>>2]|0;f[g>>2]=0;if(!ea){u=e;return ha|0}br(ea);u=e;return ha|0}function jc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;e=u;u=u+80|0;g=e+48|0;h=e+32|0;i=e+16|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+4|0;m=i+8|0;s=i+12|0;t=g+4|0;v=g+12|0;w=g+8|0;x=a+40|0;y=a+64|0;z=0;A=0;while(1){B=d;C=f[B>>2]|0;D=f[B+4>>2]|0;B=p;E=on(f[B>>2]|0,f[B+4>>2]|0,r+A|0,0)|0;B=Tn(E|0,I|0,C|0,D|0)|0;D=(f[f[c>>2]>>2]|0)+B|0;B=h;C=D;E=B+16|0;do{b[B>>0]=b[C>>0]|0;B=B+1|0;C=C+1|0}while((B|0)<(E|0));Xl(i|0,D|0,16)|0;C=Ff(g,i)|0;if(!C){B=f[i>>2]|0;E=f[q>>2]|0;F=f[m>>2]|0;G=f[s>>2]|0;H=(((B^318)+239^E)+239^F)+239^G;J=f[t>>2]|0;K=(J|0)==0;a:do if(!K){L=J+-1|0;M=(L&J|0)==0;if(!M)if(H>>>0>>0)N=H;else N=(H>>>0)%(J>>>0)|0;else N=H&L;O=f[(f[g>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(H|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}if((((f[M+8>>2]|0)==(B|0)?(f[M+12>>2]|0)==(E|0):0)?(f[M+16>>2]|0)==(F|0):0)?(f[M+20>>2]|0)==(G|0):0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(H|0)){if(M>>>0>>0)T=M;else T=(M>>>0)%(J>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}if((((f[S+8>>2]|0)==(B|0)?(f[S+12>>2]|0)==(E|0):0)?(f[S+16>>2]|0)==(F|0):0)?(f[S+20>>2]|0)==(G|0):0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;D=dn(28)|0;f[D+8>>2]=B;f[D+12>>2]=E;f[D+16>>2]=F;f[D+20>>2]=G;f[D+24>>2]=z;f[D+4>>2]=H;f[D>>2]=0;U=$(((f[v>>2]|0)+1|0)>>>0);V=$(J>>>0);X=$(n[k>>2]);do if(K|$(X*V)>>0<3|(J+-1&J|0)!=0)&1;M=~~$(W($(U/X)))>>>0;Gh(g,P>>>0>>0?M:P);P=f[t>>2]|0;M=P+-1|0;if(!(M&P)){Y=P;Z=M&H;break}if(H>>>0

>>0){Y=P;Z=H}else{Y=P;Z=(H>>>0)%(P>>>0)|0}}else{Y=J;Z=Q}while(0);J=(f[g>>2]|0)+(Z<<2)|0;H=f[J>>2]|0;if(!H){f[D>>2]=f[w>>2];f[w>>2]=D;f[J>>2]=w;J=f[D>>2]|0;if(J|0){K=f[J+4>>2]|0;J=Y+-1|0;if(J&Y)if(K>>>0>>0)_=K;else _=(K>>>0)%(Y>>>0)|0;else _=K&J;aa=(f[g>>2]|0)+(_<<2)|0;R=44}}else{f[D>>2]=f[H>>2];aa=H;R=44}if((R|0)==44){R=0;f[aa>>2]=D}f[v>>2]=(f[v>>2]|0)+1}H=x;J=f[H>>2]|0;K=on(J|0,f[H+4>>2]|0,z|0,0)|0;Rg((f[f[y>>2]>>2]|0)+K|0,h|0,J|0)|0;J=f[j>>2]|0;f[J+(A<<2)>>2]=z;ba=z+1|0;ca=J}else{J=f[j>>2]|0;f[J+(A<<2)>>2]=f[C+24>>2];ba=z;ca=J}A=A+1|0;da=f[l>>2]|0;if(A>>>0>=da>>>0)break;else z=ba}if((ba|0)==(da|0))ea=ca;else{z=a+84|0;if(!(b[z>>0]|0)){A=f[a+72>>2]|0;h=f[a+68>>2]|0;y=h;if((A|0)==(h|0))fa=ca;else{x=A-h>>2;h=0;do{A=y+(h<<2)|0;f[A>>2]=f[ca+(f[A>>2]<<2)>>2];h=h+1|0}while(h>>>0>>0);fa=ca}}else{b[z>>0]=0;z=a+68|0;ca=a+72|0;x=f[ca>>2]|0;h=f[z>>2]|0;y=x-h>>2;A=h;h=x;if(da>>>0<=y>>>0)if(da>>>0>>0?(x=A+(da<<2)|0,(x|0)!=(h|0)):0){f[ca>>2]=h+(~((h+-4-x|0)>>>2)<<2);ga=da}else ga=da;else{kh(z,da-y|0,1204);ga=f[l>>2]|0}y=f[j>>2]|0;if(!ga)fa=y;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[y+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);fa=y}}f[l>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[o>>2]|0;if((fa|0)!=(ea|0))f[o>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);br(ea);ha=ba}}else ha=0;ba=f[g+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;br(ba)}while((ea|0)!=0)}ea=f[g>>2]|0;f[g>>2]=0;if(!ea){u=e;return ha|0}br(ea);u=e;return ha|0}function kc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=Oa,T=Oa,U=Oa,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;g=u;u=u+48|0;h=g+12|0;i=g+38|0;j=g+32|0;k=g;l=h+16|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)mq(k);q=o<<2;r=dn(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;hj(r|0,0,q|0)|0;f[p>>2]=s;s=f[e>>2]|0;e=c+48|0;q=c+40|0;r=j+2|0;o=j+4|0;t=h+4|0;v=h+12|0;w=h+8|0;x=a+40|0;y=a+64|0;z=0;A=0;while(1){B=e;C=f[B>>2]|0;D=f[B+4>>2]|0;B=q;E=on(f[B>>2]|0,f[B+4>>2]|0,s+A|0,0)|0;B=Tn(E|0,I|0,C|0,D|0)|0;D=(f[f[c>>2]>>2]|0)+B|0;b[i>>0]=b[D>>0]|0;b[i+1>>0]=b[D+1>>0]|0;b[i+2>>0]=b[D+2>>0]|0;b[i+3>>0]=b[D+3>>0]|0;b[i+4>>0]=b[D+4>>0]|0;b[i+5>>0]=b[D+5>>0]|0;Xl(j|0,D|0,6)|0;D=Pf(h,j)|0;if(!D){B=d[j>>1]|0;C=d[r>>1]|0;E=d[o>>1]|0;F=(((B^318)&65535)+239^C&65535)+239^E&65535;G=f[t>>2]|0;H=(G|0)==0;a:do if(!H){J=G+-1|0;K=(J&G|0)==0;if(!K)if(F>>>0>>0)L=F;else L=(F>>>0)%(G>>>0)|0;else L=F&J;M=f[(f[h>>2]|0)+(L<<2)>>2]|0;if((M|0)!=0?(N=f[M>>2]|0,(N|0)!=0):0){if(K){K=N;while(1){M=f[K+4>>2]|0;if(!((M|0)==(F|0)|(M&J|0)==(L|0))){O=L;P=29;break a}M=K+8|0;if(((d[M>>1]|0)==B<<16>>16?(d[M+2>>1]|0)==C<<16>>16:0)?(d[K+12>>1]|0)==E<<16>>16:0)break a;K=f[K>>2]|0;if(!K){O=L;P=29;break a}}}else Q=N;while(1){K=f[Q+4>>2]|0;if((K|0)!=(F|0)){if(K>>>0>>0)R=K;else R=(K>>>0)%(G>>>0)|0;if((R|0)!=(L|0)){O=L;P=29;break a}}K=Q+8|0;if(((d[K>>1]|0)==B<<16>>16?(d[K+2>>1]|0)==C<<16>>16:0)?(d[Q+12>>1]|0)==E<<16>>16:0)break a;Q=f[Q>>2]|0;if(!Q){O=L;P=29;break}}}else{O=L;P=29}}else{O=0;P=29}while(0);if((P|0)==29){P=0;N=dn(20)|0;d[N+8>>1]=B;d[N+10>>1]=C;d[N+12>>1]=E;f[N+16>>2]=z;f[N+4>>2]=F;f[N>>2]=0;S=$(((f[v>>2]|0)+1|0)>>>0);T=$(G>>>0);U=$(n[l>>2]);do if(H|$(U*T)>>0<3|(G+-1&G|0)!=0)&1;J=~~$(W($(S/U)))>>>0;Dh(h,K>>>0>>0?J:K);K=f[t>>2]|0;J=K+-1|0;if(!(J&K)){V=K;X=J&F;break}if(F>>>0>>0){V=K;X=F}else{V=K;X=(F>>>0)%(K>>>0)|0}}else{V=G;X=O}while(0);G=(f[h>>2]|0)+(X<<2)|0;F=f[G>>2]|0;if(!F){f[N>>2]=f[w>>2];f[w>>2]=N;f[G>>2]=w;G=f[N>>2]|0;if(G|0){H=f[G+4>>2]|0;G=V+-1|0;if(G&V)if(H>>>0>>0)Y=H;else Y=(H>>>0)%(V>>>0)|0;else Y=H&G;Z=(f[h>>2]|0)+(Y<<2)|0;P=42}}else{f[N>>2]=f[F>>2];Z=F;P=42}if((P|0)==42){P=0;f[Z>>2]=N}f[v>>2]=(f[v>>2]|0)+1}F=x;G=f[F>>2]|0;H=on(G|0,f[F+4>>2]|0,z|0,0)|0;Rg((f[f[y>>2]>>2]|0)+H|0,i|0,G|0)|0;G=f[k>>2]|0;f[G+(A<<2)>>2]=z;_=z+1|0;aa=G}else{G=f[k>>2]|0;f[G+(A<<2)>>2]=f[D+16>>2];_=z;aa=G}A=A+1|0;ba=f[m>>2]|0;if(A>>>0>=ba>>>0)break;else z=_}if((_|0)==(ba|0))ca=aa;else{z=a+84|0;if(!(b[z>>0]|0)){A=f[a+72>>2]|0;i=f[a+68>>2]|0;y=i;if((A|0)==(i|0))da=aa;else{x=A-i>>2;i=0;do{A=y+(i<<2)|0;f[A>>2]=f[aa+(f[A>>2]<<2)>>2];i=i+1|0}while(i>>>0>>0);da=aa}}else{b[z>>0]=0;z=a+68|0;aa=a+72|0;x=f[aa>>2]|0;i=f[z>>2]|0;y=x-i>>2;A=i;i=x;if(ba>>>0<=y>>>0)if(ba>>>0>>0?(x=A+(ba<<2)|0,(x|0)!=(i|0)):0){f[aa>>2]=i+(~((i+-4-x|0)>>>2)<<2);ea=ba}else ea=ba;else{kh(z,ba-y|0,1204);ea=f[m>>2]|0}y=f[k>>2]|0;if(!ea)da=y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[y+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);da=y}}f[m>>2]=_;ca=da}if(!ca)fa=_;else{da=f[p>>2]|0;if((da|0)!=(ca|0))f[p>>2]=da+(~((da+-4-ca|0)>>>2)<<2);br(ca);fa=_}}else fa=0;_=f[h+8>>2]|0;if(_|0){ca=_;do{_=ca;ca=f[ca>>2]|0;br(_)}while((ca|0)!=0)}ca=f[h>>2]|0;f[h>>2]=0;if(!ca){u=g;return fa|0}br(ca);u=g;return fa|0}function lc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;d=u;u=u+80|0;e=d+72|0;g=d+64|0;h=d;i=d+68|0;j=d+60|0;k=a+352|0;if(b[k>>0]|0?(l=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0,((f[l+12>>2]|0)-(f[l+8>>2]|0)|0)>0):0){l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+8|0;m=f[f[l>>2]>>2]|0;f[e>>2]=c;l=m+4|0;n=m+8|0;o=f[n>>2]|0;if((o|0)==(f[m+12>>2]|0))Ci(l,e);else{f[o>>2]=c;f[n>>2]=o+4}o=f[e>>2]|0;p=m+16|0;q=m+20|0;m=f[q>>2]|0;r=f[p>>2]|0;s=m-r>>2;t=r;if((o|0)<(s|0)){v=t;w=o}else{r=o+1|0;f[g>>2]=-1;x=m;if(r>>>0<=s>>>0)if(r>>>0>>0?(m=t+(r<<2)|0,(m|0)!=(x|0)):0){f[q>>2]=x+(~((x+-4-m|0)>>>2)<<2);y=o;z=t}else{y=o;z=t}else{kh(p,r-s|0,g);y=f[e>>2]|0;z=f[p>>2]|0}v=z;w=y}f[v+(w<<2)>>2]=((f[n>>2]|0)-(f[l>>2]|0)>>2)+-1;A=1;u=d;return A|0}l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+56|0;n=f[(f[(f[l>>2]|0)+84>>2]|0)+(c<<2)>>2]|0;l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+4|0;w=f[(f[(f[l>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;f[g>>2]=-1;l=a+172|0;v=f[a+176>>2]|0;y=f[l>>2]|0;z=y;a:do if((v|0)==(y|0))B=-1;else{p=(v-y|0)/136|0;s=0;while(1){if((f[z+(s*136|0)>>2]|0)==(c|0))break;r=s+1|0;if(r>>>0

>>0)s=r;else{B=-1;break a}}f[g>>2]=s;B=s}while(0);b:do if(!(b[k>>0]|0)){y=(f[w+56>>2]|0)==0;do if(!((n|0)==0|y)){if((n|0)==1?b[z+(B*136|0)+28>>0]|0:0)break;v=z+(B*136|0)+104|0;p=z+(B*136|0)+4|0;r=(f[z+(B*136|0)+60>>2]|0)-(f[z+(B*136|0)+56>>2]|0)>>2;f[e>>2]=-1;Sf(z+(B*136|0)+116|0,r,e);r=dn(80)|0;t=f[a+8>>2]|0;f[r+4>>2]=0;f[r>>2]=3164;o=r+8|0;m=r+12|0;x=m+44|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(x|0));f[o>>2]=3188;q=r+56|0;f[q>>2]=0;f[r+60>>2]=0;f[r+64>>2]=0;f[r+68>>2]=t;f[r+72>>2]=v;C=r+76|0;f[C>>2]=0;D=h+4|0;m=D+4|0;x=m+40|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(x|0));f[h>>2]=3188;m=h+48|0;f[m>>2]=0;x=h+52|0;f[x>>2]=0;f[h+56>>2]=0;f[D>>2]=p;E=f[z+(B*136|0)+68>>2]|0;F=((f[E+4>>2]|0)-(f[E>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;Xg(h+24|0,F,e);F=f[D>>2]|0;E=(f[F+56>>2]|0)-(f[F+52>>2]|0)>>2;b[e>>0]=0;Xg(h+36|0,E,e);f[h+8>>2]=p;f[h+12>>2]=v;f[h+16>>2]=t;f[h+20>>2]=r;f[C>>2]=a+72;ef(o,h)|0;Yf(q,f[m>>2]|0,f[x>>2]|0);E=r;f[h>>2]=3188;F=f[m>>2]|0;if(F|0){m=f[x>>2]|0;if((m|0)!=(F|0))f[x>>2]=m+(~((m+-4-F|0)>>>2)<<2);br(F)}f[h>>2]=3208;F=f[h+36>>2]|0;if(F|0)br(F);F=f[h+24>>2]|0;if(F|0)br(F);G=0;H=E;I=42;break b}while(0);if(!y){s=f[a+12>>2]|0;E=(f[s+28>>2]|0)-(f[s+24>>2]|0)>>2;f[e>>2]=-1;Sf(z+(B*136|0)+116|0,E,e);b[(f[l>>2]|0)+((f[g>>2]|0)*136|0)+100>>0]=0;J=z+(B*136|0)+104|0;I=26}else I=24}else I=24;while(0);if((I|0)==24){J=a+40|0;I=26}if((I|0)==26){B=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+48|0;do if((Yh(f[B>>2]|0)|0)==0?(f[w+56>>2]|0)==0:0){if(b[k>>0]|0?(z=f[a+8>>2]|0,((f[z+12>>2]|0)-(f[z+8>>2]|0)|0)>=5):0){I=31;break}uf(e,a,J);K=1;L=f[e>>2]|0}else I=31;while(0);if((I|0)==31){Le(e,a,J);K=0;L=f[e>>2]|0}if(!L)M=0;else{G=K;H=L;I=42}}if((I|0)==42){I=f[g>>2]|0;if((I|0)==-1)N=a+68|0;else N=(f[l>>2]|0)+(I*136|0)+132|0;f[N>>2]=G;G=dn(76)|0;f[i>>2]=H;ml(G,i,c);c=G;G=f[i>>2]|0;f[i>>2]=0;if(G|0)Va[f[(f[G>>2]|0)+4>>2]&127](G);G=a+188|0;i=f[G>>2]|0;if((i|0)==(f[a+192>>2]|0))Ci(a+184|0,g);else{f[i>>2]=f[g>>2];f[G>>2]=i+4}i=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0;f[j>>2]=c;a=i+12|0;G=f[a>>2]|0;if(G>>>0<(f[i+16>>2]|0)>>>0){f[j>>2]=0;f[G>>2]=c;f[a>>2]=G+4;O=j}else{yg(i+8|0,j);O=j}j=f[O>>2]|0;f[O>>2]=0;if(!j)M=1;else{Va[f[(f[j>>2]|0)+4>>2]&127](j);M=1}}A=M;u=d;return A|0}function mc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;d=u;u=u+80|0;e=d+72|0;g=d+64|0;h=d;i=d+68|0;j=d+60|0;k=a+288|0;if(b[k>>0]|0?(l=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0,((f[l+12>>2]|0)-(f[l+8>>2]|0)|0)>0):0){l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+8|0;m=f[f[l>>2]>>2]|0;f[e>>2]=c;l=m+4|0;n=m+8|0;o=f[n>>2]|0;if((o|0)==(f[m+12>>2]|0))Ci(l,e);else{f[o>>2]=c;f[n>>2]=o+4}o=f[e>>2]|0;p=m+16|0;q=m+20|0;m=f[q>>2]|0;r=f[p>>2]|0;s=m-r>>2;t=r;if((o|0)<(s|0)){v=t;w=o}else{r=o+1|0;f[g>>2]=-1;x=m;if(r>>>0<=s>>>0)if(r>>>0>>0?(m=t+(r<<2)|0,(m|0)!=(x|0)):0){f[q>>2]=x+(~((x+-4-m|0)>>>2)<<2);y=o;z=t}else{y=o;z=t}else{kh(p,r-s|0,g);y=f[e>>2]|0;z=f[p>>2]|0}v=z;w=y}f[v+(w<<2)>>2]=((f[n>>2]|0)-(f[l>>2]|0)>>2)+-1;A=1;u=d;return A|0}l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+56|0;n=f[(f[(f[l>>2]|0)+84>>2]|0)+(c<<2)>>2]|0;l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+4|0;w=f[(f[(f[l>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;f[g>>2]=-1;l=a+172|0;v=f[a+176>>2]|0;y=f[l>>2]|0;z=y;a:do if((v|0)==(y|0))B=-1;else{p=(v-y|0)/136|0;s=0;while(1){if((f[z+(s*136|0)>>2]|0)==(c|0))break;r=s+1|0;if(r>>>0

>>0)s=r;else{B=-1;break a}}f[g>>2]=s;B=s}while(0);b:do if(!(b[k>>0]|0)){y=(f[w+56>>2]|0)==0;do if(!((n|0)==0|y)){if((n|0)==1?b[z+(B*136|0)+28>>0]|0:0)break;v=z+(B*136|0)+104|0;p=z+(B*136|0)+4|0;r=(f[z+(B*136|0)+60>>2]|0)-(f[z+(B*136|0)+56>>2]|0)>>2;f[e>>2]=-1;Sf(z+(B*136|0)+116|0,r,e);r=dn(80)|0;t=f[a+8>>2]|0;f[r+4>>2]=0;f[r>>2]=3164;o=r+8|0;m=r+12|0;x=m+44|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(x|0));f[o>>2]=3188;q=r+56|0;f[q>>2]=0;f[r+60>>2]=0;f[r+64>>2]=0;f[r+68>>2]=t;f[r+72>>2]=v;C=r+76|0;f[C>>2]=0;D=h+4|0;m=D+4|0;x=m+40|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(x|0));f[h>>2]=3188;m=h+48|0;f[m>>2]=0;x=h+52|0;f[x>>2]=0;f[h+56>>2]=0;f[D>>2]=p;E=f[z+(B*136|0)+68>>2]|0;F=((f[E+4>>2]|0)-(f[E>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;Xg(h+24|0,F,e);F=f[D>>2]|0;E=(f[F+56>>2]|0)-(f[F+52>>2]|0)>>2;b[e>>0]=0;Xg(h+36|0,E,e);f[h+8>>2]=p;f[h+12>>2]=v;f[h+16>>2]=t;f[h+20>>2]=r;f[C>>2]=a+72;ef(o,h)|0;Yf(q,f[m>>2]|0,f[x>>2]|0);E=r;f[h>>2]=3188;F=f[m>>2]|0;if(F|0){m=f[x>>2]|0;if((m|0)!=(F|0))f[x>>2]=m+(~((m+-4-F|0)>>>2)<<2);br(F)}f[h>>2]=3208;F=f[h+36>>2]|0;if(F|0)br(F);F=f[h+24>>2]|0;if(F|0)br(F);G=0;H=E;I=42;break b}while(0);if(!y){s=f[a+12>>2]|0;E=(f[s+28>>2]|0)-(f[s+24>>2]|0)>>2;f[e>>2]=-1;Sf(z+(B*136|0)+116|0,E,e);b[(f[l>>2]|0)+((f[g>>2]|0)*136|0)+100>>0]=0;J=z+(B*136|0)+104|0;I=26}else I=24}else I=24;while(0);if((I|0)==24){J=a+40|0;I=26}if((I|0)==26){B=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+48|0;do if((Yh(f[B>>2]|0)|0)==0?(f[w+56>>2]|0)==0:0){if(b[k>>0]|0?(z=f[a+8>>2]|0,((f[z+12>>2]|0)-(f[z+8>>2]|0)|0)>=5):0){I=31;break}uf(e,a,J);K=1;L=f[e>>2]|0}else I=31;while(0);if((I|0)==31){Le(e,a,J);K=0;L=f[e>>2]|0}if(!L)M=0;else{G=K;H=L;I=42}}if((I|0)==42){I=f[g>>2]|0;if((I|0)==-1)N=a+68|0;else N=(f[l>>2]|0)+(I*136|0)+132|0;f[N>>2]=G;G=dn(76)|0;f[i>>2]=H;ml(G,i,c);c=G;G=f[i>>2]|0;f[i>>2]=0;if(G|0)Va[f[(f[G>>2]|0)+4>>2]&127](G);G=a+188|0;i=f[G>>2]|0;if((i|0)==(f[a+192>>2]|0))Ci(a+184|0,g);else{f[i>>2]=f[g>>2];f[G>>2]=i+4}i=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0;f[j>>2]=c;a=i+12|0;G=f[a>>2]|0;if(G>>>0<(f[i+16>>2]|0)>>>0){f[j>>2]=0;f[G>>2]=c;f[a>>2]=G+4;O=j}else{yg(i+8|0,j);O=j}j=f[O>>2]|0;f[O>>2]=0;if(!j)M=1;else{Va[f[(f[j>>2]|0)+4>>2]&127](j);M=1}}A=M;u=d;return A|0}function nc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;e=u;u=u+64|0;d=e+48|0;h=e+40|0;i=e+32|0;j=e+16|0;k=e+8|0;l=e;m=e+28|0;n=a+8|0;o=f[n>>2]|0;if((o+-2|0)>>>0<=28){f[a+72>>2]=o;p=1<>2]=p+-1;o=p+-2|0;f[a+80>>2]=o;f[a+84>>2]=(o|0)/2|0}o=a+40|0;f[a+48>>2]=g;g=a+88|0;lk(g);p=a+36|0;q=f[p>>2]|0;r=(f[q+4>>2]|0)-(f[q>>2]|0)|0;s=r>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;t=k;f[t>>2]=0;f[t+4>>2]=0;t=l;f[t>>2]=0;f[t+4>>2]=0;if((r|0)<=0){u=e;return 1}r=j+4|0;t=j+8|0;v=a+84|0;w=a+80|0;x=h+4|0;y=i+4|0;z=d+4|0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=l+4|0;F=a+76|0;a=k+4|0;G=l+4|0;H=f[q>>2]|0;if((f[q+4>>2]|0)==(H|0)){J=q;mq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];fc(o,d,j);H=f[j>>2]|0;q=(H|0)>-1?H:0-H|0;M=f[r>>2]|0;N=(M|0)>-1?M:0-M|0;O=Tn(N|0,((N|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=f[t>>2]|0;N=(q|0)>-1;P=N?q:0-q|0;q=Tn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((q|0)==0&(P|0)==0){O=f[v>>2]|0;Q=O;R=j;S=M;T=O}else{O=f[v>>2]|0;U=((O|0)<0)<<31>>31;V=on(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=zk(V|0,I|0,q|0,P|0)|0;f[j>>2]=H;V=on(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=zk(V|0,I|0,q|0,P|0)|0;f[r>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=t;S=M;T=O}f[R>>2]=Q;O=f[j>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[t>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[t>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[t>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){q=(N|0)==(Z|0);if(!(P&q)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(q&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);P=0-S|0;M=0-_|0;f[j>>2]=0-O;f[r>>2]=P;f[t>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(q=(N|0)==(ca|0),!(M&q)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(q&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);N=K<<1;M=b+(N<<2)|0;H=M+4|0;O=f[H>>2]|0;f[h>>2]=f[M>>2];f[x>>2]=O;f[i>>2]=$;f[y>>2]=aa;Dd(d,n,h,i);O=f[d>>2]|0;f[k>>2]=O;P=f[z>>2]|0;f[A>>2]=P;q=f[H>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=q;f[i>>2]=da;f[C>>2]=ea;Dd(d,n,h,i);q=f[d>>2]|0;f[l>>2]=q;M=f[D>>2]|0;f[E>>2]=M;H=f[v>>2]|0;if((H|0)>=(O|0))if((O|0)<(0-H|0))fa=(f[F>>2]|0)+O|0;else fa=O;else fa=O-(f[F>>2]|0)|0;f[k>>2]=fa;if((H|0)>=(P|0))if((P|0)<(0-H|0))ga=(f[F>>2]|0)+P|0;else ga=P;else ga=P-(f[F>>2]|0)|0;f[a>>2]=ga;if((H|0)>=(q|0))if((q|0)<(0-H|0))ha=(f[F>>2]|0)+q|0;else ha=q;else ha=q-(f[F>>2]|0)|0;f[l>>2]=ha;if((H|0)>=(M|0))if((M|0)<(0-H|0))ia=(f[F>>2]|0)+M|0;else ia=M;else ia=M-(f[F>>2]|0)|0;f[G>>2]=ia;if((((ga|0)>-1?ga:0-ga|0)+((fa|0)>-1?fa:0-fa|0)|0)<(((ha|0)>-1?ha:0-ha|0)+((ia|0)>-1?ia:0-ia|0)|0)){Vi(g,0);ja=k}else{Vi(g,1);ja=l}M=f[ja>>2]|0;if((M|0)<0)ka=(f[F>>2]|0)+M|0;else ka=M;M=c+(N<<2)|0;f[M>>2]=ka;N=f[ja+4>>2]|0;if((N|0)<0)la=(f[F>>2]|0)+N|0;else la=N;f[M+4>>2]=la;K=K+1|0;if((K|0)>=(s|0)){ma=5;break}M=f[p>>2]|0;L=f[M>>2]|0;if((f[M+4>>2]|0)-L>>2>>>0<=K>>>0){J=M;ma=6;break}}if((ma|0)==5){u=e;return 1}else if((ma|0)==6)mq(J);return 0}function oc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;c=u;u=u+48|0;d=c+24|0;e=c+12|0;g=c;if(!b){h=0;u=c;return h|0}i=a+12|0;j=a+4|0;k=f[j>>2]|0;l=f[a>>2]|0;m=k-l>>2;n=a+16|0;o=f[n>>2]|0;p=f[i>>2]|0;q=o-p>>2;r=p;p=o;if(m>>>0<=q>>>0)if(m>>>0>>0?(o=r+(m<<2)|0,(o|0)!=(p|0)):0){f[n>>2]=p+(~((p+-4-o|0)>>>2)<<2);s=l;t=k}else{s=l;t=k}else{kh(i,m-q|0,5828);s=f[a>>2]|0;t=f[j>>2]|0}f[d>>2]=0;q=d+4|0;f[q>>2]=0;f[d+8>>2]=0;$j(d,t-s>>2);s=f[j>>2]|0;t=f[a>>2]|0;if((s|0)==(t|0)){v=s;w=s}else{m=f[d>>2]|0;k=m;l=k;o=0;p=s;s=k;k=t;t=m;while(1){m=f[k+(o<<2)>>2]|0;n=f[q>>2]|0;if(m>>>0>2>>>0){x=l;y=s;z=k;A=p}else{r=m+1|0;f[e>>2]=0;B=n-t>>2;C=t;D=n;if(r>>>0<=B>>>0)if(r>>>0>>0?(n=C+(r<<2)|0,(n|0)!=(D|0)):0){f[q>>2]=D+(~((D+-4-n|0)>>>2)<<2);E=l;F=p;G=k}else{E=l;F=p;G=k}else{kh(d,r-B|0,e);E=f[d>>2]|0;F=f[j>>2]|0;G=f[a>>2]|0}x=E;y=E;z=G;A=F}B=y+(m<<2)|0;f[B>>2]=(f[B>>2]|0)+1;o=o+1|0;if(o>>>0>=A-z>>2>>>0){v=z;w=A;break}else{l=x;p=A;s=y;k=z;t=y}}}y=w-v|0;v=y>>2;f[e>>2]=0;w=e+4|0;f[w>>2]=0;f[e+8>>2]=0;if(!v){H=0;I=0}else{if(v>>>0>536870911)mq(e);t=dn(y<<1)|0;f[w>>2]=t;f[e>>2]=t;y=t+(v<<3)|0;f[e+8>>2]=y;z=v;v=t;k=t;while(1){s=v;f[s>>2]=-1;f[s+4>>2]=-1;s=k+8|0;A=z+-1|0;if(!A)break;else{z=A;v=s;k=s}}f[w>>2]=y;H=t;I=t}t=f[q>>2]|0;y=f[d>>2]|0;k=t-y|0;v=k>>2;f[g>>2]=0;z=g+4|0;f[z>>2]=0;f[g+8>>2]=0;s=y;do if(v)if(v>>>0>1073741823)mq(g);else{A=dn(k)|0;f[g>>2]=A;p=A+(v<<2)|0;f[g+8>>2]=p;hj(A|0,0,k|0)|0;f[z>>2]=p;J=A;K=p;L=A;break}else{J=0;K=0;L=0}while(0);if((t|0)!=(y|0)){y=0;t=0;while(1){f[J+(t<<2)>>2]=y;k=t+1|0;if(k>>>0>>0){y=(f[s+(t<<2)>>2]|0)+y|0;t=k}else break}}t=f[j>>2]|0;j=f[a>>2]|0;y=j;if((t|0)!=(j|0)){k=a+40|0;a=t-j>>2;j=H;t=H;g=H;A=H;p=H;x=H;l=0;o=J;while(1){F=f[y+(l<<2)>>2]|0;G=l+1|0;E=((G>>>0)%3|0|0)==0?l+-2|0:G;if((E|0)==-1)M=-1;else M=f[y+(E<<2)>>2]|0;E=((l>>>0)%3|0|0)==0;G=(E?2:-1)+l|0;if((G|0)==-1)N=-1;else N=f[y+(G<<2)>>2]|0;if(E?(M|0)==(N|0)|((F|0)==(M|0)|(F|0)==(N|0)):0){f[k>>2]=(f[k>>2]|0)+1;O=j;P=t;Q=g;R=A;S=p;T=x;U=l+2|0;V=o}else W=51;a:do if((W|0)==51){W=0;E=f[s+(N<<2)>>2]|0;b:do if((E|0)>0){G=0;B=f[o+(N<<2)>>2]|0;while(1){m=f[p+(B<<3)>>2]|0;if((m|0)==-1){X=j;Y=t;Z=A;_=p;break b}if((m|0)==(M|0)){m=f[p+(B<<3)+4>>2]|0;if((m|0)==-1)$=-1;else $=f[y+(m<<2)>>2]|0;if((F|0)!=($|0))break}m=G+1|0;if((m|0)<(E|0)){G=m;B=B+1|0}else{X=j;Y=t;Z=A;_=p;break b}}m=f[A+(B<<3)+4>>2]|0;r=G;n=B;D=t;while(1){r=r+1|0;if((r|0)>=(E|0))break;C=n+1|0;f[D+(n<<3)>>2]=f[D+(C<<3)>>2];f[D+(n<<3)+4>>2]=f[D+(C<<3)+4>>2];if((f[j+(n<<3)>>2]|0)==-1)break;else{n=C;D=j}}f[g+(n<<3)>>2]=-1;if((m|0)==-1){X=g;Y=g;Z=g;_=g}else{D=f[i>>2]|0;f[D+(l<<2)>>2]=m;f[D+(m<<2)>>2]=l;O=g;P=g;Q=g;R=g;S=g;T=x;U=l;V=o;break a}}else{X=j;Y=t;Z=A;_=p}while(0);E=f[s+(M<<2)>>2]|0;if((E|0)>0){D=0;r=f[J+(M<<2)>>2]|0;while(1){aa=x+(r<<3)|0;if((f[aa>>2]|0)==-1)break;D=D+1|0;if((D|0)>=(E|0)){O=x;P=x;Q=x;R=x;S=x;T=x;U=l;V=J;break a}else r=r+1|0}f[aa>>2]=N;f[H+(r<<3)+4>>2]=l;O=H;P=H;Q=H;R=H;S=H;T=H;U=l;V=J}else{O=X;P=Y;Q=g;R=Z;S=_;T=x;U=l;V=o}}while(0);l=U+1|0;if(l>>>0>=a>>>0)break;else{j=O;t=P;g=Q;A=R;p=S;x=T;o=V}}}f[b>>2]=v;if(!J){ba=H;ca=I}else{if((K|0)!=(J|0))f[z>>2]=K+(~((K+-4-J|0)>>>2)<<2);br(L);L=f[e>>2]|0;ba=L;ca=L}if(ba|0){L=f[w>>2]|0;if((L|0)!=(ba|0))f[w>>2]=L+(~((L+-8-ba|0)>>>3)<<3);br(ca)}ca=f[d>>2]|0;if(ca|0){d=f[q>>2]|0;if((d|0)!=(ca|0))f[q>>2]=d+(~((d+-4-ca|0)>>>2)<<2);br(ca)}h=1;u=c;return h|0}function pc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=Oa,S=Oa,T=Oa,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0;e=u;u=u+48|0;g=e+12|0;h=e+35|0;i=e+32|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+1|0;m=i+2|0;s=g+4|0;t=g+12|0;v=g+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=d;B=f[A>>2]|0;C=f[A+4>>2]|0;A=p;D=on(f[A>>2]|0,f[A+4>>2]|0,r+y|0,0)|0;A=Tn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;b[h>>0]=b[C>>0]|0;b[h+1>>0]=b[C+1>>0]|0;b[h+2>>0]=b[C+2>>0]|0;Xl(i|0,C|0,3)|0;C=Uf(g,i)|0;if(!C){A=b[i>>0]|0;B=b[q>>0]|0;D=b[m>>0]|0;E=((A&255^318)+239^B&255)+239^D&255;F=f[s>>2]|0;G=(F|0)==0;a:do if(!G){H=F+-1|0;J=(H&F|0)==0;if(!J)if(E>>>0>>0)K=E;else K=(E>>>0)%(F>>>0)|0;else K=E&H;L=f[(f[g>>2]|0)+(K<<2)>>2]|0;if((L|0)!=0?(M=f[L>>2]|0,(M|0)!=0):0){if(J){J=M;while(1){L=f[J+4>>2]|0;if(!((L|0)==(E|0)|(L&H|0)==(K|0))){N=K;O=29;break a}L=J+8|0;if(((b[L>>0]|0)==A<<24>>24?(b[L+1>>0]|0)==B<<24>>24:0)?(b[L+2>>0]|0)==D<<24>>24:0)break a;J=f[J>>2]|0;if(!J){N=K;O=29;break a}}}else P=M;while(1){J=f[P+4>>2]|0;if((J|0)!=(E|0)){if(J>>>0>>0)Q=J;else Q=(J>>>0)%(F>>>0)|0;if((Q|0)!=(K|0)){N=K;O=29;break a}}J=P+8|0;if(((b[J>>0]|0)==A<<24>>24?(b[J+1>>0]|0)==B<<24>>24:0)?(b[J+2>>0]|0)==D<<24>>24:0)break a;P=f[P>>2]|0;if(!P){N=K;O=29;break}}}else{N=K;O=29}}else{N=0;O=29}while(0);if((O|0)==29){O=0;M=dn(16)|0;b[M+8>>0]=A;b[M+9>>0]=B;b[M+10>>0]=D;f[M+12>>2]=z;f[M+4>>2]=E;f[M>>2]=0;R=$(((f[t>>2]|0)+1|0)>>>0);S=$(F>>>0);T=$(n[k>>2]);do if(G|$(T*S)>>0<3|(F+-1&F|0)!=0)&1;H=~~$(W($(R/T)))>>>0;Kh(g,J>>>0>>0?H:J);J=f[s>>2]|0;H=J+-1|0;if(!(H&J)){U=J;V=H&E;break}if(E>>>0>>0){U=J;V=E}else{U=J;V=(E>>>0)%(J>>>0)|0}}else{U=F;V=N}while(0);F=(f[g>>2]|0)+(V<<2)|0;E=f[F>>2]|0;if(!E){f[M>>2]=f[v>>2];f[v>>2]=M;f[F>>2]=v;F=f[M>>2]|0;if(F|0){G=f[F+4>>2]|0;F=U+-1|0;if(F&U)if(G>>>0>>0)X=G;else X=(G>>>0)%(U>>>0)|0;else X=G&F;Y=(f[g>>2]|0)+(X<<2)|0;O=42}}else{f[M>>2]=f[E>>2];Y=E;O=42}if((O|0)==42){O=0;f[Y>>2]=M}f[t>>2]=(f[t>>2]|0)+1}E=w;F=f[E>>2]|0;G=on(F|0,f[E+4>>2]|0,z|0,0)|0;Rg((f[f[x>>2]>>2]|0)+G|0,h|0,F|0)|0;F=f[j>>2]|0;f[F+(y<<2)>>2]=z;Z=z+1|0;_=F}else{F=f[j>>2]|0;f[F+(y<<2)>>2]=f[C+12>>2];Z=z;_=F}y=y+1|0;aa=f[l>>2]|0;if(y>>>0>=aa>>>0)break;else z=Z}if((Z|0)==(aa|0))ba=_;else{z=a+84|0;if(!(b[z>>0]|0)){y=f[a+72>>2]|0;h=f[a+68>>2]|0;x=h;if((y|0)==(h|0))ca=_;else{w=y-h>>2;h=0;do{y=x+(h<<2)|0;f[y>>2]=f[_+(f[y>>2]<<2)>>2];h=h+1|0}while(h>>>0>>0);ca=_}}else{b[z>>0]=0;z=a+68|0;_=a+72|0;w=f[_>>2]|0;h=f[z>>2]|0;x=w-h>>2;y=h;h=w;if(aa>>>0<=x>>>0)if(aa>>>0>>0?(w=y+(aa<<2)|0,(w|0)!=(h|0)):0){f[_>>2]=h+(~((h+-4-w|0)>>>2)<<2);da=aa}else da=aa;else{kh(z,aa-x|0,1204);da=f[l>>2]|0}x=f[j>>2]|0;if(!da)ca=x;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);ca=x}}f[l>>2]=Z;ba=ca}if(!ba)ea=Z;else{ca=f[o>>2]|0;if((ca|0)!=(ba|0))f[o>>2]=ca+(~((ca+-4-ba|0)>>>2)<<2);br(ba);ea=Z}}else ea=0;Z=f[g+8>>2]|0;if(Z|0){ba=Z;do{Z=ba;ba=f[ba>>2]|0;br(Z)}while((ba|0)!=0)}ba=f[g>>2]|0;f[g>>2]=0;if(!ba){u=e;return ea|0}br(ba);u=e;return ea|0}function qc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;e=u;u=u+64|0;d=e+48|0;h=e+40|0;i=e+32|0;j=e+16|0;k=e+8|0;l=e;m=e+28|0;n=a+8|0;o=f[n>>2]|0;if((o+-2|0)>>>0<=28){f[a+72>>2]=o;p=1<>2]=p+-1;o=p+-2|0;f[a+80>>2]=o;f[a+84>>2]=(o|0)/2|0}o=a+40|0;f[a+48>>2]=g;g=a+88|0;lk(g);p=a+36|0;q=f[p>>2]|0;r=(f[q+4>>2]|0)-(f[q>>2]|0)|0;s=r>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;t=k;f[t>>2]=0;f[t+4>>2]=0;t=l;f[t>>2]=0;f[t+4>>2]=0;if((r|0)<=0){u=e;return 1}r=j+4|0;t=j+8|0;v=a+84|0;w=a+80|0;x=h+4|0;y=i+4|0;z=d+4|0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=l+4|0;F=a+76|0;a=k+4|0;G=l+4|0;H=f[q>>2]|0;if((f[q+4>>2]|0)==(H|0)){J=q;mq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];$b(o,d,j);H=f[j>>2]|0;q=(H|0)>-1?H:0-H|0;M=f[r>>2]|0;N=(M|0)>-1?M:0-M|0;O=Tn(N|0,((N|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=f[t>>2]|0;N=(q|0)>-1;P=N?q:0-q|0;q=Tn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((q|0)==0&(P|0)==0){O=f[v>>2]|0;Q=O;R=j;S=M;T=O}else{O=f[v>>2]|0;U=((O|0)<0)<<31>>31;V=on(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=zk(V|0,I|0,q|0,P|0)|0;f[j>>2]=H;V=on(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=zk(V|0,I|0,q|0,P|0)|0;f[r>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=t;S=M;T=O}f[R>>2]=Q;O=f[j>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[t>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[t>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[t>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){q=(N|0)==(Z|0);if(!(P&q)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(q&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);P=0-S|0;M=0-_|0;f[j>>2]=0-O;f[r>>2]=P;f[t>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(q=(N|0)==(ca|0),!(M&q)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(q&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);N=K<<1;M=b+(N<<2)|0;H=M+4|0;O=f[H>>2]|0;f[h>>2]=f[M>>2];f[x>>2]=O;f[i>>2]=$;f[y>>2]=aa;Dd(d,n,h,i);O=f[d>>2]|0;f[k>>2]=O;P=f[z>>2]|0;f[A>>2]=P;q=f[H>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=q;f[i>>2]=da;f[C>>2]=ea;Dd(d,n,h,i);q=f[d>>2]|0;f[l>>2]=q;M=f[D>>2]|0;f[E>>2]=M;H=f[v>>2]|0;if((H|0)>=(O|0))if((O|0)<(0-H|0))fa=(f[F>>2]|0)+O|0;else fa=O;else fa=O-(f[F>>2]|0)|0;f[k>>2]=fa;if((H|0)>=(P|0))if((P|0)<(0-H|0))ga=(f[F>>2]|0)+P|0;else ga=P;else ga=P-(f[F>>2]|0)|0;f[a>>2]=ga;if((H|0)>=(q|0))if((q|0)<(0-H|0))ha=(f[F>>2]|0)+q|0;else ha=q;else ha=q-(f[F>>2]|0)|0;f[l>>2]=ha;if((H|0)>=(M|0))if((M|0)<(0-H|0))ia=(f[F>>2]|0)+M|0;else ia=M;else ia=M-(f[F>>2]|0)|0;f[G>>2]=ia;if((((ga|0)>-1?ga:0-ga|0)+((fa|0)>-1?fa:0-fa|0)|0)<(((ha|0)>-1?ha:0-ha|0)+((ia|0)>-1?ia:0-ia|0)|0)){Vi(g,0);ja=k}else{Vi(g,1);ja=l}M=f[ja>>2]|0;if((M|0)<0)ka=(f[F>>2]|0)+M|0;else ka=M;M=c+(N<<2)|0;f[M>>2]=ka;N=f[ja+4>>2]|0;if((N|0)<0)la=(f[F>>2]|0)+N|0;else la=N;f[M+4>>2]=la;K=K+1|0;if((K|0)>=(s|0)){ma=5;break}M=f[p>>2]|0;L=f[M>>2]|0;if((f[M+4>>2]|0)-L>>2>>>0<=K>>>0){J=M;ma=6;break}}if((ma|0)==5){u=e;return 1}else if((ma|0)==6)mq(J);return 0}function rc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=Oa,T=Oa,U=Oa,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;e=u;u=u+64|0;g=e+36|0;h=e+24|0;i=e+12|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)mq(j);p=m<<2;q=dn(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;hj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+4|0;m=i+8|0;s=g+4|0;t=g+12|0;v=g+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=d;B=f[A>>2]|0;C=f[A+4>>2]|0;A=p;D=on(f[A>>2]|0,f[A+4>>2]|0,r+z|0,0)|0;A=Tn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;A=h;B=C;D=A+12|0;do{b[A>>0]=b[B>>0]|0;A=A+1|0;B=B+1|0}while((A|0)<(D|0));Xl(i|0,C|0,12)|0;B=_f(g,i)|0;if(!B){A=f[i>>2]|0;D=f[q>>2]|0;E=f[m>>2]|0;F=((A^318)+239^D)+239^E;G=f[s>>2]|0;H=(G|0)==0;a:do if(!H){J=G+-1|0;K=(J&G|0)==0;if(!K)if(F>>>0>>0)L=F;else L=(F>>>0)%(G>>>0)|0;else L=F&J;M=f[(f[g>>2]|0)+(L<<2)>>2]|0;if((M|0)!=0?(N=f[M>>2]|0,(N|0)!=0):0){if(K){K=N;while(1){M=f[K+4>>2]|0;if(!((M|0)==(F|0)|(M&J|0)==(L|0))){O=L;P=29;break a}if(((f[K+8>>2]|0)==(A|0)?(f[K+12>>2]|0)==(D|0):0)?(f[K+16>>2]|0)==(E|0):0)break a;K=f[K>>2]|0;if(!K){O=L;P=29;break a}}}else Q=N;while(1){K=f[Q+4>>2]|0;if((K|0)!=(F|0)){if(K>>>0>>0)R=K;else R=(K>>>0)%(G>>>0)|0;if((R|0)!=(L|0)){O=L;P=29;break a}}if(((f[Q+8>>2]|0)==(A|0)?(f[Q+12>>2]|0)==(D|0):0)?(f[Q+16>>2]|0)==(E|0):0)break a;Q=f[Q>>2]|0;if(!Q){O=L;P=29;break}}}else{O=L;P=29}}else{O=0;P=29}while(0);if((P|0)==29){P=0;C=dn(24)|0;f[C+8>>2]=A;f[C+12>>2]=D;f[C+16>>2]=E;f[C+20>>2]=y;f[C+4>>2]=F;f[C>>2]=0;S=$(((f[t>>2]|0)+1|0)>>>0);T=$(G>>>0);U=$(n[k>>2]);do if(H|$(U*T)>>0<3|(G+-1&G|0)!=0)&1;K=~~$(W($(S/U)))>>>0;Hh(g,N>>>0>>0?K:N);N=f[s>>2]|0;K=N+-1|0;if(!(K&N)){V=N;X=K&F;break}if(F>>>0>>0){V=N;X=F}else{V=N;X=(F>>>0)%(N>>>0)|0}}else{V=G;X=O}while(0);G=(f[g>>2]|0)+(X<<2)|0;F=f[G>>2]|0;if(!F){f[C>>2]=f[v>>2];f[v>>2]=C;f[G>>2]=v;G=f[C>>2]|0;if(G|0){H=f[G+4>>2]|0;G=V+-1|0;if(G&V)if(H>>>0>>0)Y=H;else Y=(H>>>0)%(V>>>0)|0;else Y=H&G;Z=(f[g>>2]|0)+(Y<<2)|0;P=42}}else{f[C>>2]=f[F>>2];Z=F;P=42}if((P|0)==42){P=0;f[Z>>2]=C}f[t>>2]=(f[t>>2]|0)+1}F=w;G=f[F>>2]|0;H=on(G|0,f[F+4>>2]|0,y|0,0)|0;Rg((f[f[x>>2]>>2]|0)+H|0,h|0,G|0)|0;G=f[j>>2]|0;f[G+(z<<2)>>2]=y;_=y+1|0;aa=G}else{G=f[j>>2]|0;f[G+(z<<2)>>2]=f[B+20>>2];_=y;aa=G}z=z+1|0;ba=f[l>>2]|0;if(z>>>0>=ba>>>0)break;else y=_}if((_|0)==(ba|0))ca=aa;else{y=a+84|0;if(!(b[y>>0]|0)){z=f[a+72>>2]|0;h=f[a+68>>2]|0;x=h;if((z|0)==(h|0))da=aa;else{w=z-h>>2;h=0;do{z=x+(h<<2)|0;f[z>>2]=f[aa+(f[z>>2]<<2)>>2];h=h+1|0}while(h>>>0>>0);da=aa}}else{b[y>>0]=0;y=a+68|0;aa=a+72|0;w=f[aa>>2]|0;h=f[y>>2]|0;x=w-h>>2;z=h;h=w;if(ba>>>0<=x>>>0)if(ba>>>0>>0?(w=z+(ba<<2)|0,(w|0)!=(h|0)):0){f[aa>>2]=h+(~((h+-4-w|0)>>>2)<<2);ea=ba}else ea=ba;else{kh(y,ba-x|0,1204);ea=f[l>>2]|0}x=f[j>>2]|0;if(!ea)da=x;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);da=x}}f[l>>2]=_;ca=da}if(!ca)fa=_;else{da=f[o>>2]|0;if((da|0)!=(ca|0))f[o>>2]=da+(~((da+-4-ca|0)>>>2)<<2);br(ca);fa=_}}else fa=0;_=f[g+8>>2]|0;if(_|0){ca=_;do{_=ca;ca=f[ca>>2]|0;br(_)}while((ca|0)!=0)}ca=f[g>>2]|0;f[g>>2]=0;if(!ca){u=e;return fa|0}br(ca);u=e;return fa|0}function sc(a,c){a=a|0;c=c|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;e=u;u=u+32|0;g=e+4|0;h=e;i=e+16|0;j=c+56|0;k=f[j>>2]|0;l=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(l|0)/12|0;m=c+44|0;Nh(k,f[m>>2]|0)|0;Nh(f[(f[j>>2]|0)+80>>2]|0,f[m>>2]|0)|0;n=f[c+48>>2]|0;o=dn(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=21;p=o;q=14562;r=p+21|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+21>>0]=0;o=Oj(n,g,0)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);n=f[m>>2]|0;if(o){b[i>>0]=0;o=n+16|0;q=f[o+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];ye(n,g,i,i+1|0)|0}Ye(c)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}b[i>>0]=1;c=n+16|0;o=f[c+4>>2]|0;if(!((o|0)>0|(o|0)==0&(f[c>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];ye(n,g,i,i+1|0)|0}n=f[j>>2]|0;c=f[n+80>>2]|0;if(c>>>0<256){if(!l){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}o=i+1|0;q=i+1|0;p=i+1|0;r=0;s=n;while(1){t=f[s+96>>2]|0;v=f[m>>2]|0;b[i>>0]=f[t+(r*12|0)>>2];w=v+16|0;x=f[w>>2]|0;y=f[w+4>>2]|0;if((y|0)>0|(y|0)==0&x>>>0>0){z=x;A=v;B=y}else{f[h>>2]=f[v+4>>2];f[g>>2]=f[h>>2];ye(v,g,i,p)|0;v=f[m>>2]|0;y=v+16|0;z=f[y>>2]|0;A=v;B=f[y+4>>2]|0}b[i>>0]=f[t+(r*12|0)+4>>2];if((B|0)>0|(B|0)==0&z>>>0>0){C=B;D=z;E=A}else{f[h>>2]=f[A+4>>2];f[g>>2]=f[h>>2];ye(A,g,i,q)|0;y=f[m>>2]|0;v=y+16|0;C=f[v+4>>2]|0;D=f[v>>2]|0;E=y}b[i>>0]=f[t+(r*12|0)+8>>2];if(!((C|0)>0|(C|0)==0&D>>>0>0)){f[h>>2]=f[E+4>>2];f[g>>2]=f[h>>2];ye(E,g,i,o)|0}t=r+1|0;if(t>>>0>=k>>>0)break;r=t;s=f[j>>2]|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}if(c>>>0<65536){if(!l){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}s=i+2|0;r=i+2|0;o=i+2|0;E=0;D=n;while(1){C=f[D+96>>2]|0;q=f[m>>2]|0;d[i>>1]=f[C+(E*12|0)>>2];A=q+16|0;z=f[A>>2]|0;B=f[A+4>>2]|0;if((B|0)>0|(B|0)==0&z>>>0>0){F=B;G=z;H=q}else{f[h>>2]=f[q+4>>2];f[g>>2]=f[h>>2];ye(q,g,i,o)|0;q=f[m>>2]|0;z=q+16|0;F=f[z+4>>2]|0;G=f[z>>2]|0;H=q}d[i>>1]=f[C+(E*12|0)+4>>2];if((F|0)>0|(F|0)==0&G>>>0>0){I=F;J=G;K=H}else{f[h>>2]=f[H+4>>2];f[g>>2]=f[h>>2];ye(H,g,i,r)|0;q=f[m>>2]|0;z=q+16|0;I=f[z+4>>2]|0;J=f[z>>2]|0;K=q}d[i>>1]=f[C+(E*12|0)+8>>2];if(!((I|0)>0|(I|0)==0&J>>>0>0)){f[h>>2]=f[K+4>>2];f[g>>2]=f[h>>2];ye(K,g,i,s)|0}C=E+1|0;if(C>>>0>=k>>>0)break;E=C;D=f[j>>2]|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}D=(l|0)!=0;if(c>>>0<2097152){if(D){L=0;M=n}else{f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}while(1){c=f[M+96>>2]|0;Nh(f[c+(L*12|0)>>2]|0,f[m>>2]|0)|0;Nh(f[c+(L*12|0)+4>>2]|0,f[m>>2]|0)|0;Nh(f[c+(L*12|0)+8>>2]|0,f[m>>2]|0)|0;c=L+1|0;if(c>>>0>=k>>>0)break;L=c;M=f[j>>2]|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}if(!D){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}D=0;M=n;while(1){n=(f[M+96>>2]|0)+(D*12|0)|0;L=f[m>>2]|0;c=L+16|0;l=f[c+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[c>>2]|0)>>>0>0)){f[h>>2]=f[L+4>>2];f[g>>2]=f[h>>2];ye(L,g,n,n+12|0)|0}n=D+1|0;if(n>>>0>=k>>>0)break;D=n;M=f[j>>2]|0}f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}function tc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+32|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;switch(f[c+28>>2]|0){case 9:{l=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=l;f[g>>2]=f[h>>2];m=ec(a,c,g)|0;break}case 2:{f[i>>2]=l;f[g>>2]=f[i>>2];m=Xb(a,c,g)|0;break}case 3:{f[j>>2]=l;f[g>>2]=f[j>>2];m=rc(a,c,g)|0;break}case 4:{f[k>>2]=l;f[g>>2]=f[k>>2];m=jc(a,c,g)|0;break}default:m=0}n=m;break}case 1:{m=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=m;f[g>>2]=f[h>>2];o=dc(a,c,g)|0;break}case 2:{f[i>>2]=m;f[g>>2]=f[i>>2];o=Yb(a,c,g)|0;break}case 3:{f[j>>2]=m;f[g>>2]=f[j>>2];o=pc(a,c,g)|0;break}case 4:{f[k>>2]=m;f[g>>2]=f[k>>2];o=ic(a,c,g)|0;break}default:o=0}n=o;break}case 11:case 2:{o=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=o;f[g>>2]=f[h>>2];p=dc(a,c,g)|0;break}case 2:{f[i>>2]=o;f[g>>2]=f[i>>2];p=Yb(a,c,g)|0;break}case 3:{f[j>>2]=o;f[g>>2]=f[j>>2];p=pc(a,c,g)|0;break}case 4:{f[k>>2]=o;f[g>>2]=f[k>>2];p=ic(a,c,g)|0;break}default:p=0}n=p;break}case 4:{p=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=p;f[g>>2]=f[h>>2];q=bc(a,c,g)|0;break}case 2:{f[i>>2]=p;f[g>>2]=f[i>>2];q=Vb(a,c,g)|0;break}case 3:{f[j>>2]=p;f[g>>2]=f[j>>2];q=kc(a,c,g)|0;break}case 4:{f[k>>2]=p;f[g>>2]=f[k>>2];q=gc(a,c,g)|0;break}default:q=0}n=q;break}case 3:{q=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=q;f[g>>2]=f[h>>2];r=bc(a,c,g)|0;break}case 2:{f[i>>2]=q;f[g>>2]=f[i>>2];r=Vb(a,c,g)|0;break}case 3:{f[j>>2]=q;f[g>>2]=f[j>>2];r=kc(a,c,g)|0;break}case 4:{f[k>>2]=q;f[g>>2]=f[k>>2];r=gc(a,c,g)|0;break}default:r=0}n=r;break}case 6:{r=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=r;f[g>>2]=f[h>>2];s=ec(a,c,g)|0;break}case 2:{f[i>>2]=r;f[g>>2]=f[i>>2];s=Xb(a,c,g)|0;break}case 3:{f[j>>2]=r;f[g>>2]=f[j>>2];s=rc(a,c,g)|0;break}case 4:{f[k>>2]=r;f[g>>2]=f[k>>2];s=jc(a,c,g)|0;break}default:s=0}n=s;break}case 5:{s=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=s;f[g>>2]=f[h>>2];t=ec(a,c,g)|0;break}case 2:{f[i>>2]=s;f[g>>2]=f[i>>2];t=Xb(a,c,g)|0;break}case 3:{f[j>>2]=s;f[g>>2]=f[j>>2];t=rc(a,c,g)|0;break}case 4:{f[k>>2]=s;f[g>>2]=f[k>>2];t=jc(a,c,g)|0;break}default:t=0}n=t;break}default:{v=-1;u=e;return v|0}}v=(n|0)==0?-1:n;u=e;return v|0}function uc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=u;u=u+32|0;g=e+16|0;h=e+12|0;i=e+29|0;j=e;k=e+28|0;if(!(f[(f[a+8>>2]|0)+80>>2]|0)){l=1;u=e;return l|0}b[i>>0]=-2;m=a+36|0;n=f[m>>2]|0;if(n)if(Ra[f[(f[a>>2]|0)+40>>2]&127](a,n)|0){n=f[m>>2]|0;o=(Qa[f[(f[n>>2]|0)+8>>2]&127](n)|0)&255;b[i>>0]=o;p=5}else q=0;else p=5;if((p|0)==5){o=d+16|0;n=o;r=f[n+4>>2]|0;if(!((r|0)>0|(r|0)==0&(f[n>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,i,i+1|0)|0}i=f[m>>2]|0;if(i|0?(n=(Qa[f[(f[i>>2]|0)+36>>2]&127](i)|0)&255,b[j>>0]=n,n=o,i=f[n+4>>2]|0,!((i|0)>0|(i|0)==0&(f[n>>2]|0)>>>0>0)):0){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,j,j+1|0)|0}n=f[a+32>>2]|0;i=b[n+24>>0]|0;r=X(f[n+80>>2]|0,i)|0;s=(f[f[n>>2]>>2]|0)+(f[n+48>>2]|0)|0;f[j>>2]=0;n=j+4|0;f[n>>2]=0;f[j+8>>2]=0;t=(r|0)==0;do if(!t)if(r>>>0>1073741823)mq(j);else{v=r<<2;w=dn(v)|0;f[j>>2]=w;x=w+(r<<2)|0;f[j+8>>2]=x;hj(w|0,0,v|0)|0;f[n>>2]=x;y=w;break}else y=0;while(0);w=f[m>>2]|0;do if(w){Ta[f[(f[w>>2]|0)+44>>2]&31](w,s,y,r,i,f[c>>2]|0)|0;x=f[m>>2]|0;if(!x){z=s;A=f[j>>2]|0;p=20;break}if(!(Qa[f[(f[x>>2]|0)+32>>2]&127](x)|0)){x=f[j>>2]|0;z=f[m>>2]|0?x:s;A=x;p=20}}else{z=s;A=y;p=20}while(0);if((p|0)==20)km(z,r,A);A=a+4|0;a=f[A>>2]|0;do if(a){z=f[a+48>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;y=dn(48)|0;f[g>>2]=y;f[g+8>>2]=-2147483600;f[g+4>>2]=34;s=y;w=9835;x=s+34|0;do{b[s>>0]=b[w>>0]|0;s=s+1|0;w=w+1|0}while((s|0)<(x|0));b[y+34>>0]=0;w=Oj(z,g,1)|0;if((b[g+11>>0]|0)<0)br(f[g>>2]|0);if(!w){if(!t){w=f[j>>2]|0;s=0;x=0;do{x=f[w+(s<<2)>>2]|x;s=s+1|0}while((s|0)!=(r|0));if(x)B=((_(x|0)|0)>>>3^3)+1|0;else B=1}else B=1;b[k>>0]=0;s=o;w=f[s>>2]|0;z=f[s+4>>2]|0;if((z|0)>0|(z|0)==0&w>>>0>0){C=z;D=w}else{f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,k,k+1|0)|0;w=o;C=f[w+4>>2]|0;D=f[w>>2]|0}b[k>>0]=B;if(!((C|0)>0|(C|0)==0&D>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,k,k+1|0)|0}if((B|0)==(Ll(5)|0)){w=f[j>>2]|0;z=o;s=f[z+4>>2]|0;if(!((s|0)>0|(s|0)==0&(f[z>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,w,w+(r<<2)|0)|0}p=48;break}if(t)p=48;else{w=d+4|0;z=0;do{s=(f[j>>2]|0)+(z<<2)|0;y=o;v=f[y+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[y>>2]|0)>>>0>0)){f[h>>2]=f[w>>2];f[g>>2]=f[h>>2];ye(d,g,s,s+B|0)|0}z=z+1|0}while(z>>>0>>0);p=48}}else p=27}else p=27;while(0);if((p|0)==27){b[k>>0]=1;r=o;o=f[r+4>>2]|0;if(!((o|0)>0|(o|0)==0&(f[r>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];ye(d,g,k,k+1|0)|0}wp(g);k=f[A>>2]|0;if(k|0)Pj(g,10-(Yh(f[k+48>>2]|0)|0)|0)|0;k=Dc(f[j>>2]|0,X((f[c+4>>2]|0)-(f[c>>2]|0)>>2,i)|0,i,g,d)|0;sj(g,f[g+4>>2]|0);if(k)p=48;else E=0}if((p|0)==48){p=f[m>>2]|0;if(!p)E=1;else{Ra[f[(f[p>>2]|0)+40>>2]&127](p,d)|0;E=1}}d=f[j>>2]|0;if(d|0){j=f[n>>2]|0;if((j|0)!=(d|0))f[n>>2]=j+(~((j+-4-d|0)>>>2)<<2);br(d)}q=E}l=q;u=e;return l|0}function vc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;b=u;u=u+48|0;c=b+24|0;d=b+12|0;e=b;g=a+32|0;h=a+8|0;i=a+12|0;j=f[i>>2]|0;k=f[h>>2]|0;l=j-k>>2;m=a+36|0;n=f[m>>2]|0;o=f[g>>2]|0;p=n-o>>2;q=o;o=n;n=k;if(l>>>0<=p>>>0)if(l>>>0

>>0?(r=q+(l<<2)|0,(r|0)!=(o|0)):0){f[m>>2]=o+(~((o+-4-r|0)>>>2)<<2);s=n;t=k;v=j}else{s=n;t=k;v=j}else{oi(g,l-p|0);p=f[h>>2]|0;s=p;t=p;v=f[i>>2]|0}p=v-t|0;l=p>>2;f[c>>2]=0;j=c+4|0;f[j>>2]=0;k=c+8|0;f[k>>2]=0;if(l|0){if((p|0)<0)mq(c);p=((l+-1|0)>>>5)+1|0;n=dn(p<<2)|0;f[c>>2]=n;f[k>>2]=p;f[j>>2]=l;j=l>>>5;hj(n|0,0,j<<2|0)|0;p=l&31;l=n+(j<<2)|0;if(p|0)f[l>>2]=f[l>>2]&~(-1>>>(32-p|0))}p=a+20|0;l=0;j=s;s=t;t=v;while(1){if(l>>>0>2>>>0){w=0;x=0;y=l;z=s;A=j}else{B=25;break}while(1){v=x>>>5;n=1<<(x&31);do if(!(f[(f[c>>2]|0)+(v<<2)>>2]&n)){k=f[A+(x<<2)>>2]|0;if((f[k+8>>2]|0)!=(f[k+4>>2]|0)){r=0;o=1;m=A;q=k;while(1){k=f[(f[q+4>>2]|0)+(r<<2)>>2]|0;C=0;D=m;while(1){E=f[D+(x<<2)>>2]|0;if((C|0)>=(Ra[f[(f[E>>2]|0)+24>>2]&127](E,k)|0)){F=o;break}E=f[(f[h>>2]|0)+(x<<2)>>2]|0;G=Sa[f[(f[E>>2]|0)+28>>2]&31](E,k,C)|0;if((G|0)!=(x|0)?(E=f[(f[p>>2]|0)+(G<<2)>>2]|0,(1<<(E&31)&f[(f[c>>2]|0)+(E>>>5<<2)>>2]|0)==0):0){F=0;break}C=C+1|0;D=f[h>>2]|0}r=r+1|0;m=f[h>>2]|0;q=f[m+(x<<2)>>2]|0;if(r>>>0>=(f[q+8>>2]|0)-(f[q+4>>2]|0)>>2>>>0)break;else o=F}o=m;if(F)H=o;else{I=w;J=y;K=o;break}}else H=z;f[(f[g>>2]|0)+(y<<2)>>2]=x;o=(f[c>>2]|0)+(v<<2)|0;f[o>>2]=f[o>>2]|n;I=1;J=y+1|0;K=H}else{I=w;J=y;K=z}while(0);x=x+1|0;L=f[i>>2]|0;M=L-K>>2;A=K;if(x>>>0>=M>>>0)break;else{w=I;y=J;z=K}}if(J>>>0>>0&(I^1)){N=0;break}else{l=J;j=A;s=K;t=L}}if((B|0)==25){f[d>>2]=0;B=d+4|0;f[B>>2]=0;f[d+8>>2]=0;L=f[a+4>>2]|0;a=(f[L+12>>2]|0)-(f[L+8>>2]|0)|0;L=a>>2;f[e>>2]=0;K=e+4|0;f[K>>2]=0;A=e+8|0;f[A>>2]=0;if(L|0){if((a|0)<0)mq(e);a=((L+-1|0)>>>5)+1|0;J=dn(a<<2)|0;f[e>>2]=J;f[A>>2]=a;f[K>>2]=L;K=L>>>5;hj(J|0,0,K<<2|0)|0;a=L&31;L=J+(K<<2)|0;if(a|0)f[L>>2]=f[L>>2]&~(-1>>>(32-a|0))}a:do if((t|0)==(s|0))O=1;else{a=0;L=j;K=s;J=t;while(1){A=f[(f[g>>2]|0)+(a<<2)>>2]|0;l=f[L+(A<<2)>>2]|0;I=(f[l+8>>2]|0)-(f[l+4>>2]|0)|0;l=I>>2;if((I|0)<8){P=K;Q=J}else{I=f[B>>2]|0;M=f[d>>2]|0;z=I-M>>2;y=M;M=I;if(l>>>0<=z>>>0)if(l>>>0>>0?(I=y+(l<<2)|0,(I|0)!=(M|0)):0){f[B>>2]=M+(~((M+-4-I|0)>>>2)<<2);R=0}else R=0;else{oi(d,l-z|0);R=0}while(1){if((R|0)<(l|0)){S=0;T=0;U=R}else break;while(1){z=f[(f[h>>2]|0)+(A<<2)>>2]|0;I=f[(f[z+4>>2]|0)+(S<<2)>>2]|0;M=S>>>5;y=1<<(S&31);if(!(f[(f[e>>2]|0)+(M<<2)>>2]&y)){w=0;x=1;H=z;while(1){if((w|0)>=(Ra[f[(f[H>>2]|0)+24>>2]&127](H,I)|0)){V=x;break}z=f[(f[h>>2]|0)+(A<<2)>>2]|0;F=Sa[f[(f[z>>2]|0)+28>>2]&31](z,I,w)|0;z=(f[(f[e>>2]|0)+(F>>>5<<2)>>2]&1<<(F&31)|0)!=0;F=x&z;if(!z){V=F;break}w=w+1|0;x=F;H=f[(f[h>>2]|0)+(A<<2)>>2]|0}if(V){f[(f[d>>2]|0)+(U<<2)>>2]=S;H=(f[e>>2]|0)+(M<<2)|0;f[H>>2]=f[H>>2]|y;W=1;X=U+1|0}else{W=T;X=U}}else{W=T;X=U}S=S+1|0;if((S|0)>=(l|0))break;else{T=W;U=X}}if(W|(X|0)>=(l|0))R=X;else{O=0;break a}}Of(f[(f[h>>2]|0)+(A<<2)>>2]|0,d);P=f[h>>2]|0;Q=f[i>>2]|0}a=a+1|0;if(a>>>0>=Q-P>>2>>>0){O=1;break}else{L=P;K=P;J=Q}}}while(0);Q=f[e>>2]|0;if(Q|0)br(Q);Q=f[d>>2]|0;if(Q|0){d=f[B>>2]|0;if((d|0)!=(Q|0))f[B>>2]=d+(~((d+-4-Q|0)>>>2)<<2);br(Q)}N=O}O=f[c>>2]|0;if(!O){u=b;return N|0}br(O);u=b;return N|0} function uj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=c;i=f[c+64>>2]|0;c=((f[i+4>>2]|0)-(f[i>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Xg(a+24|0,c,g);c=f[h>>2]|0;h=(f[c+56>>2]|0)-(f[c+52>>2]|0)>>2;b[g>>0]=0;Xg(a+36|0,h,g);g=a+8|0;f[g>>2]=f[d>>2];f[g+4>>2]=f[d+4>>2];f[g+8>>2]=f[d+8>>2];f[g+12>>2]=f[d+12>>2];u=e;return}function vj(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a;a:do if(!(c&3)){d=a;e=4}else{g=a;h=c;while(1){if(!(b[g>>0]|0)){i=h;break a}j=g+1|0;h=j;if(!(h&3)){d=j;e=4;break}else g=j}}while(0);if((e|0)==4){e=d;while(1){k=f[e>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))e=e+4|0;else break}if(!((k&255)<<24>>24))l=e;else{k=e;while(1){e=k+1|0;if(!(b[e>>0]|0)){l=e;break}else k=e}}i=l}return i-c|0}function wj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=f[a+4>>2]|0;else k=i&255;do if(k>>>0>=c>>>0)if(j){i=(f[a>>2]|0)+c|0;b[g>>0]=0;Hp(i,g);f[a+4>>2]=c;break}else{b[g>>0]=0;Hp(a+c|0,g);b[h>>0]=c;break}else Xi(a,c-k|0,d)|0;while(0);u=e;return}function xj(a){a=a|0;var b=0,c=0,d=0;if(!a)return;b=a+88|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=f[c+8>>2]|0;if(b|0){d=c+12|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;br(b)}br(c)}c=f[a+68>>2]|0;if(c|0){b=a+72|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);br(c)}c=a+64|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d>>2]|0;if(c|0){b=d+4|0;if((f[b>>2]|0)!=(c|0))f[b>>2]=c;br(c)}br(d)}br(a);return}function yj(a,c,d,e,g,h,i,j,k,l){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;f[a>>2]=d;if(d|0){m=d+16|0;n=f[m+4>>2]|0;o=a+8|0;f[o>>2]=f[m>>2];f[o+4>>2]=n;n=d+24|0;d=f[n+4>>2]|0;o=a+16|0;f[o>>2]=f[n>>2];f[o+4>>2]=d}b[a+24>>0]=e;f[a+28>>2]=g;b[a+32>>0]=h&1;h=a+40|0;f[h>>2]=i;f[h+4>>2]=j;j=a+48|0;f[j>>2]=k;f[j+4>>2]=l;f[a+56>>2]=c;return}function zj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;if((f[c+76>>2]|0)>=0?(gr(c)|0)!=0:0){d=a&255;e=a&255;if((e|0)!=(b[c+75>>0]|0)?(g=c+20|0,h=f[g>>2]|0,h>>>0<(f[c+16>>2]|0)>>>0):0){f[g>>2]=h+1;b[h>>0]=d;i=e}else i=Bj(c,a)|0;fr(c);j=i}else k=3;do if((k|0)==3){i=a&255;e=a&255;if((e|0)!=(b[c+75>>0]|0)?(d=c+20|0,h=f[d>>2]|0,h>>>0<(f[c+16>>2]|0)>>>0):0){f[d>>2]=h+1;b[h>>0]=i;j=e;break}j=Bj(c,a)|0}while(0);return j|0}function Aj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=f[a+4>>2]|0;if((i|0)==-1){j=0;u=d;return j|0}b[h>>0]=i;i=c+16|0;a=f[i+4>>2]|0;if(!((a|0)>0|(a|0)==0&(f[i>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];ye(c,e,h,h+1|0)|0}j=1;u=d;return j|0}function Bj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;d=u;u=u+16|0;e=d;g=c&255;b[e>>0]=g;i=a+16|0;j=f[i>>2]|0;if(!j)if(!(pl(a)|0)){k=f[i>>2]|0;l=4}else m=-1;else{k=j;l=4}do if((l|0)==4){j=a+20|0;i=f[j>>2]|0;if(i>>>0>>0?(n=c&255,(n|0)!=(b[a+75>>0]|0)):0){f[j>>2]=i+1;b[i>>0]=g;m=n;break}if((Sa[f[a+36>>2]&31](a,e,1)|0)==1)m=h[e>>0]|0;else m=-1}while(0);u=d;return m|0}function Cj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=dn(88)|0;d=c+60|0;e=c;g=e+60|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=c;d=c+64|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;d=Kf(c,b)|0;f[a>>2]=d?c:0;a=d?0:c;if(d)return;ui(a);br(a);return}function Dj(a,b){a=a|0;b=b|0;if(!b)return;else{Dj(a,f[b>>2]|0);Dj(a,f[b+4>>2]|0);sj(b+20|0,f[b+24>>2]|0);br(b);return}}function Ej(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=c;i=((f[c+4>>2]|0)-(f[c>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;Xg(a+24|0,i,g);i=f[h>>2]|0;h=(f[i+28>>2]|0)-(f[i+24>>2]|0)>>2;b[g>>0]=0;Xg(a+36|0,h,g);g=a+8|0;f[g>>2]=f[d>>2];f[g+4>>2]=f[d+4>>2];f[g+8>>2]=f[d+8>>2];f[g+12>>2]=f[d+12>>2];u=e;return}function Fj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=e+4|0;f[g>>2]=c;c=a+4|0;a=dn(32)|0;f[h>>2]=a;f[h+8>>2]=-2147483616;f[h+4>>2]=17;i=a;j=12932;k=i+17|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[a+17>>0]=0;Nj(wd(c,g)|0,h,d);if((b[h+11>>0]|0)>=0){u=e;return}br(f[h>>2]|0);u=e;return}function Gj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=a+48|0;if((f[a+52>>2]|0)>>>0<=e>>>0)pe(b,e+1|0,0);c=(f[b>>2]|0)+(e>>>5<<2)|0;f[c>>2]=f[c>>2]|1<<(e&31);c=f[a+36>>2]|0;if((f[a+40>>2]|0)-c>>2>>>0<=e>>>0){d=1;return d|0}Pp(f[c+(e<<2)>>2]|0);d=1;return d|0}function Hj(a){a=a|0;if(!a)return;f[a>>2]=1136;sj(a+28|0,f[a+32>>2]|0);nj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);br(a);return}function Ij(a){a=a|0;f[a>>2]=1136;sj(a+28|0,f[a+32>>2]|0);nj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);return}function Jj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&a>>>0>4294967295){e=d;f=a;g=c;while(1){c=an(f|0,g|0,10,0)|0;e=e+-1|0;b[e>>0]=c&255|48;c=f;f=up(f|0,g|0,10,0)|0;if(!(g>>>0>9|(g|0)==9&c>>>0>4294967295))break;else g=I}h=f;i=e}else{h=a;i=d}if(!h)j=i;else{d=h;h=i;while(1){i=h+-1|0;b[i>>0]=(d>>>0)%10|0|48;if(d>>>0<10){j=i;break}else{d=(d>>>0)/10|0;h=i}}}return j|0}function Kj(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a;while(1){d=c+1|0;if(!(tq(b[c>>0]|0)|0))break;else c=d}a=b[c>>0]|0;switch(a<<24>>24|0){case 45:{e=1;f=5;break}case 43:{e=0;f=5;break}default:{g=0;h=c;i=a}}if((f|0)==5){g=e;h=d;i=b[d>>0]|0}if(!(Pq(i<<24>>24)|0))j=0;else{i=0;d=h;while(1){h=(i*10|0)+48-(b[d>>0]|0)|0;d=d+1|0;if(!(Pq(b[d>>0]|0)|0)){j=h;break}else i=h}}return (g|0?j:0-j|0)|0}function Lj(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=0,h=0;e=u;u=u+16|0;g=e;cl(g,d);h=mi(a,c)|0;c=h+11|0;if((b[c>>0]|0)<0){b[f[h>>2]>>0]=0;f[h+4>>2]=0}else{b[h>>0]=0;b[c>>0]=0}Ng(h,0);f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];u=e;return}function Mj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;fl(g,d&1);d=mi(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}Ng(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Nj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;fl(g,d);d=mi(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}Ng(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Oj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=zg(a,c)|0;if((e|0)==(a+4|0)){g=-1;h=(g|0)==-1;i=(g|0)!=0;j=h?d:i;return j|0}a=e+28|0;if((b[a+11>>0]|0)<0)k=f[a>>2]|0;else k=a;g=Kj(k)|0;h=(g|0)==-1;i=(g|0)!=0;j=h?d:i;return j|0}function Pj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(c>>>0>10){g=0;u=d;return g|0}h=dn(48)|0;f[e>>2]=h;f[e+8>>2]=-2147483600;f[e+4>>2]=33;i=h;j=13067;k=i+33|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+33>>0]=0;Nj(a,e,c);if((b[e+11>>0]|0)<0)br(f[e>>2]|0);g=1;u=d;return g|0}function Qj(a){a=a|0;f[a>>2]=1136;sj(a+28|0,f[a+32>>2]|0);nj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);br(a);return}function Rj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[b>>2]|0;if((c|0)==-1)return 1;b=c*3|0;if((b|0)==-1)return 1;c=f[a>>2]|0;a=f[c+(b<<2)>>2]|0;d=b+1|0;e=((d>>>0)%3|0|0)==0?b+-2|0:d;if((e|0)==-1)g=-1;else g=f[c+(e<<2)>>2]|0;e=(((b>>>0)%3|0|0)==0?2:-1)+b|0;if((e|0)==-1)h=-1;else h=f[c+(e<<2)>>2]|0;if((a|0)==(g|0))return 1;else return (a|0)==(h|0)|(g|0)==(h|0)|0;return 0}function Sj(a){a=a|0;f[a>>2]=2968;sj(a+28|0,f[a+32>>2]|0);Dj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);return}function Tj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0;d=0;while(1){if((h[15560+d>>0]|0)==(a|0)){e=2;break}g=d+1|0;if((g|0)==87){i=15648;j=87;e=5;break}else d=g}if((e|0)==2)if(!d)k=15648;else{i=15648;j=d;e=5}if((e|0)==5)while(1){e=0;d=i;do{a=d;d=d+1|0}while((b[a>>0]|0)!=0);j=j+-1|0;if(!j){k=d;break}else{i=d;e=5}}return yq(k,f[c+20>>2]|0)|0}function Uj(a,b){a=+a;b=b|0;var c=0,d=0,e=0,g=0.0,h=0.0,i=0,j=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;e=Wn(c|0,d|0,52)|0;switch(e&2047){case 0:{if(a!=0.0){g=+Uj(a*18446744073709551616.0,b);h=g;i=(f[b>>2]|0)+-64|0}else{h=a;i=0}f[b>>2]=i;j=h;break}case 2047:{j=a;break}default:{f[b>>2]=(e&2047)+-1022;f[s>>2]=c;f[s+4>>2]=d&-2146435073|1071644672;j=+p[s>>3]}}return +j}function Vj(a){a=a|0;f[a>>2]=2968;sj(a+28|0,f[a+32>>2]|0);Dj(a+16|0,f[a+20>>2]|0);sj(a+4|0,f[a+8>>2]|0);br(a);return}function Wj(a,b){a=+a;b=b|0;var c=0.0,d=0,e=0,g=0.0,h=0;if((b|0)<=1023)if((b|0)<-1022){c=a*2.2250738585072014e-308;d=(b|0)<-2044;e=b+2044|0;g=d?c*2.2250738585072014e-308:c;h=d?((e|0)>-1022?e:-1022):b+1022|0}else{g=a;h=b}else{c=a*8988465674311579538646525.0e283;e=(b|0)>2046;d=b+-2046|0;g=e?c*8988465674311579538646525.0e283:c;h=e?((d|0)<1023?d:1023):b+-1023|0}b=Rn(h+1023|0,0,52)|0;h=I;f[s>>2]=b;f[s+4>>2]=h;return +(g*+p[s>>3])}function Xj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;if(!(f[a+80>>2]|0)){b=0;return b|0}c=a+8|0;d=a+12|0;a=f[c>>2]|0;if(((f[d>>2]|0)-a|0)>0){e=0;g=a}else{b=1;return b|0}while(1){a=f[g+(e<<2)>>2]|0;e=e+1|0;if(!(yl(a,a)|0)){b=0;h=5;break}g=f[c>>2]|0;if((e|0)>=((f[d>>2]|0)-g>>2|0)){b=1;h=5;break}}if((h|0)==5)return b|0;return 0}function Yj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+36|0;d=a+40|0;e=f[c>>2]|0;if((f[d>>2]|0)==(e|0)){g=1;return g|0}h=a+60|0;a=0;i=e;while(1){e=f[i+(a<<2)>>2]|0;a=a+1|0;if(!(Sa[f[(f[e>>2]|0)+20>>2]&31](e,h,b)|0)){g=0;j=5;break}i=f[c>>2]|0;if(a>>>0>=(f[d>>2]|0)-i>>2>>>0){g=1;j=5;break}}if((j|0)==5)return g|0;return 0}function Zj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+36|0;d=a+40|0;a=f[c>>2]|0;if((f[d>>2]|0)==(a|0)){e=1;return e|0}else{g=0;h=a}while(1){a=f[h+(g<<2)>>2]|0;g=g+1|0;if(!(Ra[f[(f[a>>2]|0)+24>>2]&127](a,b)|0)){e=0;i=4;break}h=f[c>>2]|0;if(g>>>0>=(f[d>>2]|0)-h>>2>>>0){e=1;i=4;break}}if((i|0)==4)return e|0;return 0}function _j(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;f[a>>2]=0;c=a+4|0;f[c>>2]=0;f[a+8>>2]=0;d=b+4|0;e=(f[d>>2]|0)-(f[b>>2]|0)|0;g=e>>2;if(!g)return;if(g>>>0>1073741823)mq(a);h=dn(e)|0;f[c>>2]=h;f[a>>2]=h;f[a+8>>2]=h+(g<<2);g=f[b>>2]|0;b=(f[d>>2]|0)-g|0;if((b|0)<=0)return;Rg(h|0,g|0,b|0)|0;f[c>>2]=h+(b>>>2<<2);return}function $j(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=a+8|0;d=f[a>>2]|0;if((f[c>>2]|0)-d>>2>>>0>=b>>>0)return;e=a+4|0;if(b>>>0>1073741823){g=ra(8)|0;Wo(g,14941);f[g>>2]=6944;va(g|0,1080,114)}g=(f[e>>2]|0)-d|0;h=dn(b<<2)|0;if((g|0)>0)Rg(h|0,d|0,g|0)|0;f[a>>2]=h;f[e>>2]=h+(g>>2<<2);f[c>>2]=h+(b<<2);if(!d)return;br(d);return}function ak(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=a+36|0;c=a+40|0;d=f[b>>2]|0;if((f[c>>2]|0)==(d|0)){e=1;return e|0}g=a+60|0;a=0;h=d;while(1){d=f[h+(a<<2)>>2]|0;a=a+1|0;if(!(Ra[f[(f[d>>2]|0)+16>>2]&127](d,g)|0)){e=0;i=5;break}h=f[b>>2]|0;if(a>>>0>=(f[c>>2]|0)-h>>2>>>0){e=1;i=5;break}}if((i|0)==5)return e|0;return 0}function bk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;g=dn(16)|0;f[e>>2]=g;f[e+8>>2]=-2147483632;f[e+4>>2]=15;h=g;i=12916;j=h+15|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+15>>0]=0;Nj(a+4|0,e,c);if((b[e+11>>0]|0)>=0){u=d;return}br(f[e>>2]|0);u=d;return}function ck(a,b){a=a|0;b=b|0;var c=0,d=0;f[a>>2]=0;f[a+4>>2]=b;if(b|0?(c=mh(b,992,976,0)|0,c|0):0){d=dn(56)|0;Gm(d,c);c=f[a>>2]|0;f[a>>2]=d;if(!c)return;Va[f[(f[c>>2]|0)+4>>2]&127](c);return}c=dn(56)|0;Am(c,b);b=f[a>>2]|0;f[a>>2]=c;if(!b)return;Va[f[(f[b>>2]|0)+4>>2]&127](b);return}function dk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0;d=f[a+176>>2]|0;e=f[a+172>>2]|0;a=e;if((d|0)==(e|0))return 0;g=(d-e|0)/136|0;e=0;while(1){if((f[a+(e*136|0)>>2]|0)==(c|0)){h=4;break}d=e+1|0;if(d>>>0>>0)e=d;else{h=6;break}}if((h|0)==4)return ((b[a+(e*136|0)+100>>0]|0)==0?0:a+(e*136|0)+4|0)|0;else if((h|0)==6)return 0;return 0}function ek(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[a+72>>2]|0;if(!c){d=0;return d|0}f[c+4>>2]=a+60;if(!(Qa[f[(f[c>>2]|0)+12>>2]&127](c)|0)){d=0;return d|0}if(!(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)){d=0;return d|0}if(!(Ra[f[(f[a>>2]|0)+44>>2]&127](a,b)|0)){d=0;return d|0}d=Ra[f[(f[a>>2]|0)+48>>2]&127](a,b)|0;return d|0}function fk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;f[a>>2]=0;d=a+4|0;f[d>>2]=0;f[a+8>>2]=0;if(!b)return;if(b>>>0>357913941)mq(a);e=dn(b*12|0)|0;f[d>>2]=e;f[a>>2]=e;f[a+8>>2]=e+(b*12|0);a=b;b=e;do{_j(b,c);b=(f[d>>2]|0)+12|0;f[d>>2]=b;a=a+-1|0}while((a|0)!=0);return}function gk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=f[b>>2]|0;if(!c){d=0;return d|0}e=a+44|0;g=f[e>>2]|0;if(g>>>0<(f[a+48>>2]|0)>>>0){f[b>>2]=0;f[g>>2]=c;f[e>>2]=(f[e>>2]|0)+4;d=1;return d|0}else{Bg(a+40|0,b);d=1;return d|0}return 0}function hk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2880;f[a+40>>2]=1180;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=1460;b=a+36|0;d=f[b>>2]|0;f[b>>2]=0;if(!d){zi(a);br(a);return}Va[f[(f[d>>2]|0)+4>>2]&127](d);zi(a);br(a);return}function ik(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0;f[c>>2]=2;d=a+4|0;a=c+8|0;e=f[a>>2]|0;g=(f[c+12>>2]|0)-e|0;if(g>>>0<4294967292){Bk(a,g+4|0,0);i=f[a>>2]|0}else i=e;e=i+g|0;g=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[e>>0]=g;b[e+1>>0]=g>>8;b[e+2>>0]=g>>16;b[e+3>>0]=g>>24;return}function jk(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3164;b=a+8|0;f[b>>2]=3188;c=f[a+56>>2]|0;if(c|0){d=a+60|0;e=f[d>>2]|0;if((e|0)!=(c|0))f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);br(c)}f[b>>2]=3208;b=f[a+44>>2]|0;if(b|0)br(b);b=f[a+32>>2]|0;if(!b){br(a);return}br(b);br(a);return}function kk(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=Oa,h=0;e=zg(a,c)|0;if((e|0)==(a+4|0)){g=d;return $(g)}a=e+28|0;if((b[a+11>>0]|0)<0)h=f[a>>2]|0;else h=a;g=$(+Xq(h));return $(g)}function lk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b;d=c;f[d>>2]=0;f[d+4>>2]=0;cf(a,2,c);c=f[a+12>>2]|0;d=a+16|0;e=f[d>>2]|0;if((e|0)==(c|0)){g=a+24|0;f[g>>2]=0;h=a+28|0;f[h>>2]=0;u=b;return}f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);g=a+24|0;f[g>>2]=0;h=a+28|0;f[h>>2]=0;u=b;return}function mk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=f[a+176>>2]|0;d=f[a+172>>2]|0;e=d;a:do if((c|0)!=(d|0)){g=(c-d|0)/136|0;h=0;while(1){if((f[e+(h*136|0)>>2]|0)==(b|0))break;i=h+1|0;if(i>>>0>>0)h=i;else break a}j=e+(h*136|0)+104|0;return j|0}while(0);j=a+40|0;return j|0}function nk(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3232;b=a+8|0;f[b>>2]=3256;c=f[a+56>>2]|0;if(c|0){d=a+60|0;e=f[d>>2]|0;if((e|0)!=(c|0))f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);br(c)}f[b>>2]=3276;b=f[a+44>>2]|0;if(b|0)br(b);b=f[a+32>>2]|0;if(!b){br(a);return}br(b);br(a);return}function ok(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2880;f[a+40>>2]=1180;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=1460;b=a+36|0;d=f[b>>2]|0;f[b>>2]=0;if(!d){zi(a);return}Va[f[(f[d>>2]|0)+4>>2]&127](d);zi(a);return}function pk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;Ec(a,b);if((b|0)<=-1)return;c=a+88|0;d=f[c>>2]|0;e=f[a+84>>2]|0;if((d-e>>2|0)<=(b|0))return;a=e+(b<<2)|0;b=a+4|0;e=d-b|0;g=e>>2;if(!g)h=d;else{Xl(a|0,b|0,e|0)|0;h=f[c>>2]|0}e=a+(g<<2)|0;if((h|0)==(e|0))return;f[c>>2]=h+(~((h+-4-e|0)>>>2)<<2);return}function qk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=f[a+32>>2]|0;c=f[a+36>>2]|0;if((b|0)==(c|0)){d=1;return d|0}e=a+8|0;g=a+44|0;a=b;while(1){b=f[(f[e>>2]|0)+(f[a>>2]<<2)>>2]|0;a=a+4|0;if(!(Ra[f[(f[b>>2]|0)+20>>2]&127](b,f[g>>2]|0)|0)){d=0;h=5;break}if((a|0)==(c|0)){d=1;h=5;break}}if((h|0)==5)return d|0;return 0}function rk(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3164;b=a+8|0;f[b>>2]=3188;c=f[a+56>>2]|0;if(c|0){d=a+60|0;e=f[d>>2]|0;if((e|0)!=(c|0))f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);br(c)}f[b>>2]=3208;b=f[a+44>>2]|0;if(b|0)br(b);b=f[a+32>>2]|0;if(!b)return;br(b);return}function sk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;d=u;u=u+128|0;e=d;g=e;h=g+124|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(h|0));g=e+4|0;f[g>>2]=a;h=e+8|0;f[h>>2]=-1;f[e+44>>2]=a;f[e+76>>2]=-1;Rm(e,0);i=+Lc(e,c,1);c=(f[g>>2]|0)-(f[h>>2]|0)+(f[e+108>>2]|0)|0;if(b|0)f[b>>2]=c|0?a+c|0:a;u=d;return +i}function tk(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0;a=c+16|0;g=f[a>>2]|0;do if(g){if((g|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;f[c+24>>2]=2;b[c+54>>0]=1;break}h=c+24|0;if((f[h>>2]|0)==2)f[h>>2]=e}else{f[a>>2]=d;f[c+24>>2]=e;f[c+36>>2]=1}while(0);return}function uk(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=a+20|0;c=a+28|0;if((f[d>>2]|0)>>>0>(f[c>>2]|0)>>>0)Sa[f[a+36>>2]&31](a,0,0)|0;f[a+16>>2]=0;f[c>>2]=0;f[d>>2]=0;d=f[a>>2]|0;if(!(d&4)){c=(f[a+44>>2]|0)+(f[a+48>>2]|0)|0;f[a+8>>2]=c;f[a+4>>2]=c;e=d<<27>>31}else{f[a>>2]=d|32;e=-1}return e|0}function vk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;d=zg(a,c)|0;if((d|0)==(a+4|0)){e=0;return e|0}a=d+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;e=((Kj(g)|0)+1|0)>>>0>1;return e|0}function wk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=5840;b=f[a+96>>2]|0;if(b|0){c=a+100|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);br(b)}b=f[a+84>>2]|0;if(!b){wg(a);br(a);return}d=a+88|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b);wg(a);br(a);return}function xk(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=3232;b=a+8|0;f[b>>2]=3256;c=f[a+56>>2]|0;if(c|0){d=a+60|0;e=f[d>>2]|0;if((e|0)!=(c|0))f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);br(c)}f[b>>2]=3276;b=f[a+44>>2]|0;if(b|0)br(b);b=f[a+32>>2]|0;if(!b)return;br(b);return}function yk(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=zg(a,c)|0;if((e|0)==(a+4|0)){g=d;return g|0}d=e+28|0;if((b[d+11>>0]|0)<0)h=f[d>>2]|0;else h=d;g=Kj(h)|0;return g|0}function zk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=Vn(e^a|0,f^b|0,e|0,f|0)|0;b=I;a=g^e;e=h^f;return Vn((Bd(i,b,Vn(g^c|0,h^d|0,g|0,h|0)|0,I,0)|0)^a|0,I^e|0,a|0,e|0)|0}function Ak(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0;f[a>>2]=b;h=b+16|0;i=f[h+4>>2]|0;j=a+8|0;f[j>>2]=f[h>>2];f[j+4>>2]=i;i=b+24|0;b=f[i+4>>2]|0;j=a+16|0;f[j>>2]=f[i>>2];f[j+4>>2]=b;b=a+40|0;f[b>>2]=c;f[b+4>>2]=d;d=a+48|0;f[d>>2]=e;f[d+4>>2]=g;return}function Bk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e|0;h=e;e=d;if(g>>>0>=b>>>0){if(g>>>0>b>>>0?(d=h+b|0,(d|0)!=(e|0)):0)f[c>>2]=d}else ri(a,b-g|0);g=a+24|0;a=g;b=Tn(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=g;f[a>>2]=b;f[a+4>>2]=I;return}function Ck(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;d=zg(a,c)|0;if((d|0)==(a+4|0)){e=-1;return e|0}a=d+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;e=Kj(g)|0;return e|0}function Dk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=5840;b=f[a+96>>2]|0;if(b|0){c=a+100|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);br(b)}b=f[a+84>>2]|0;if(!b){wg(a);return}d=a+88|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);br(b);wg(a);return}function Ek(a){a=a|0;var c=0,d=0,e=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=1;c=a+68|0;d=a+28|0;e=d+40|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(e|0));f[c>>2]=a;c=a+72|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;f[c+20>>2]=0;return}function Fk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3188;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3208;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b){br(a);return}br(b);br(a);return}function Gk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2004;b=f[a+76>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Hk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=u;u=u+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;hj(g|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{ep(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;ep(a,g,h)}u=f;return}function Ik(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3256;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b){br(a);return}br(b);br(a);return}function Jk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1696;b=f[a+76>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Kk(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;if(qp(a,f[b+8>>2]|0,g)|0)fj(0,b,c,d,e);else{h=f[a+8>>2]|0;_a[f[(f[h>>2]|0)+20>>2]&3](h,b,c,d,e,g)}return}function Lk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3188;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3208;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Mk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2060;tj(a+108|0);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Nk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3256;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Ok(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1752;tj(a+108|0);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Pk(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=a;g=d;h=c;while(1){i=b[f>>0]|0;j=b[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}function Qk(a){a=a|0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+24>>2]|0))return 0;if(!(f[a+28>>2]|0))return 0;if(!(f[a+32>>2]|0))return 0;else return (f[a+36>>2]|0)!=0|0;return 0}function Rk(a){a=a|0;var b=0,c=0;f[a>>2]=2004;b=f[a+76>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Sk(a){a=a|0;var c=0,d=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;c=0;while(1){if((c|0)==3)break;f[a+(c<<2)>>2]=0;c=c+1|0}if((b[a+11>>0]|0)<0)d=(f[a+8>>2]&2147483647)+-1|0;else d=10;wj(a,d,0);return}function Tk(a){a=a|0;var b=0,c=0,d=0,e=0.0,g=0.0;b=f[a+8>>2]|0;if((b|0)<2){c=0;d=0;I=c;return d|0}e=+(b|0);g=+Fg(e)*e;e=+W(+(g-+p[a>>3]));c=+K(e)>=1.0?(e>0.0?~~+Y(+J(e/4294967296.0),4294967295.0)>>>0:~~+W((e-+(~~e>>>0))/4294967296.0)>>>0):0;d=~~e>>>0;I=c;return d|0}function Uk(a){a=a|0;var b=0,c=0;f[a>>2]=1696;b=f[a+76>>2]|0;if(b|0)br(b);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Vk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=f[(f[a+36>>2]|0)+(e<<2)>>2]|0;e=f[b+32>>2]|0;if(e|0){d=e;return d|0}d=f[b+8>>2]|0;return d|0}function Wk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1216;b=f[a+16>>2]|0;if(b|0){c=a+20|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b)}b=f[a+4>>2]|0;if(!b)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(b|0))f[d>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Xk(a){a=a|0;var b=0,c=0;f[a>>2]=2060;tj(a+108|0);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Yk(a){a=a|0;if(!(f[a+64>>2]|0))return 0;if(!(f[a+68>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function Zk(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(qp(a,f[b+8>>2]|0,0)|0)tk(0,b,c,d);else{e=f[a+8>>2]|0;Ya[f[(f[e>>2]|0)+28>>2]&7](e,b,c,d)}return}function _k(a){a=a|0;var b=0,c=0;f[a>>2]=1752;tj(a+108|0);f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function $k(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=Ra[f[(f[d>>2]|0)+36>>2]&127](d,b)|0;return c|0}function al(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=Ra[f[(f[d>>2]|0)+32>>2]&127](d,b)|0;return c|0}function bl(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;d=b[a>>0]|0;e=b[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=c;c=a;do{c=c+1|0;d=d+1|0;a=b[c>>0]|0;e=b[d>>0]|0}while(!(a<<24>>24==0?1:a<<24>>24!=e<<24>>24));f=e;g=a}return (g&255)-(f&255)|0}function cl(a,b){a=a|0;b=$(b);var c=0,d=0;c=u;u=u+16|0;d=c;Sk(d);qi(a,d,b);Go(d);u=c;return}function dl(a){a=a|0;var b=0,c=0,d=0,e=0,g=0;b=f[a>>2]|0;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d+(~((d+-4-b|0)>>>2)<<2)|0;f[c>>2]=g;e=g}f[a+12>>2]=0;f[a+16>>2]=0;if(!b)return;if((e|0)!=(b|0))f[c>>2]=e+(~((e+-4-b|0)>>>2)<<2);br(b);return}function el(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=f[a+16>>2]|0;if(((f[a+20>>2]|0)-d>>2|0)<=(b|0)){e=-1;return e|0}g=f[d+(b<<2)>>2]|0;if((g|0)<0){e=-1;return e|0}e=f[(f[(f[(f[a+36>>2]|0)+(g<<2)>>2]|0)+16>>2]|0)+(c<<2)>>2]|0;return e|0}function fl(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;Sk(d);vi(a,d,b);Go(d);u=c;return}function gl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;d=u;u=u+32|0;e=d;g=d+20|0;f[e>>2]=f[a+60>>2];f[e+4>>2]=0;f[e+8>>2]=b;f[e+12>>2]=g;f[e+16>>2]=c;if((ro(za(140,e|0)|0)|0)<0){f[g>>2]=-1;h=-1}else h=f[g>>2]|0;u=d;return h|0}function hl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=0;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=0;return c|0}b=f[d>>2]|0;if((b|0)==-1){c=0;return c|0}c=f[(f[a+8>>2]|0)+(b<<2)>>2]|0;return c|0}function il(a){a=a|0;if(!(f[a+40>>2]|0))return 0;if(!(f[a+24>>2]|0))return 0;if(!(f[a+28>>2]|0))return 0;if(!(f[a+32>>2]|0))return 0;else return (f[a+36>>2]|0)!=0|0;return 0}function jl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=f[(f[a+36>>2]|0)+(e<<2)>>2]|0;d=(f[b+20>>2]|0)-(f[b+16>>2]|0)>>2;return d|0}function kl(a){a=a|0;var b=0;if(!(f[a+24>>2]|0)){b=0;return b|0}if(!(f[a+28>>2]|0)){b=0;return b|0}if(!(f[a+32>>2]|0)){b=0;return b|0}b=(f[a+36>>2]|0)!=0;return b|0}function ll(a){a=a|0;if(!(f[a+60>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function ml(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;Sg(a,c);f[a>>2]=1392;c=a+72|0;d=a+36|0;a=d+36|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(a|0));d=f[b>>2]|0;f[b>>2]=0;f[c>>2]=d;return}function nl(a,c){a=a|0;c=c|0;var d=0,e=0;d=a;e=c;c=d+64|0;do{f[d>>2]=f[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(c|0));e=a+64|0;f[a+88>>2]=0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;b[e+20>>0]=0;return}function ol(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;if((a|0)==0&(c|0)==0)f=d;else{g=d;d=c;c=a;while(1){a=g+-1|0;b[a>>0]=h[15542+(c&15)>>0]|0|e;c=Wn(c|0,d|0,4)|0;d=I;if((c|0)==0&(d|0)==0){f=a;break}else g=a}}return f|0}function pl(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=f[a>>2]|0;if(!(d&8)){f[a+8>>2]=0;f[a+4>>2]=0;c=f[a+44>>2]|0;f[a+28>>2]=c;f[a+20>>2]=c;f[a+16>>2]=c+(f[a+48>>2]|0);e=0}else{f[a>>2]=d|32;e=-1}return e|0}function ql(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[b+88>>2]|0;if(!c){d=0;return d|0}if((f[c>>2]|0)!=2){d=0;return d|0}b=f[c+8>>2]|0;f[a+4>>2]=h[b>>0]|h[b+1>>0]<<8|h[b+2>>0]<<16|h[b+3>>0]<<24;d=1;return d|0}function rl(a){a=a|0;var b=0;if(!(f[a+44>>2]|0)){b=0;return b|0}if(!(f[a+48>>2]|0)){b=0;return b|0}if(!(f[a+52>>2]|0)){b=0;return b|0}b=(f[a+56>>2]|0)!=0;return b|0}function sl(a){a=a|0;kj(a);br(a);return}function tl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+40>>2]=c;d=1;return d|0}function ul(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+44>>2]=c;d=1;return d|0}function vl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e|0;if(g>>>0>>0){ri(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+b|0;if((g|0)==(d|0))return;f[c>>2]=g;return}function wl(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=$(e);f[a+4>>2]=b;Jf(a+8|0,c,c+(d<<2)|0);n[a+20>>2]=e;return}function xl(a,b){a=a|0;b=b|0;var c=0;if(!(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)){c=0;return c|0}if(!(Ra[f[(f[a>>2]|0)+44>>2]&127](a,b)|0)){c=0;return c|0}c=Ra[f[(f[a>>2]|0)+48>>2]&127](a,b)|0;return c|0}function yl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=u;u=u+16|0;d=c+4|0;e=c;f[e>>2]=0;f[d>>2]=f[e>>2];e=tc(a,b,d)|0;u=c;return e|0}function zl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;d=f[c>>2]|0;c=a;e=b-a>>2;while(1){if(!e)break;a=(e|0)/2|0;b=c+(a<<2)|0;g=(f[b>>2]|0)>>>0>>0;c=g?b+4|0:c;e=g?e+-1-a|0:a}return c|0}function Al(a){a=a|0;var c=0;f[a>>2]=0;c=a+8|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;b[a+24>>0]=1;f[a+28>>2]=9;c=a+40|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[a+56>>2]=-1;f[a+60>>2]=0;return}function Bl(a){a=a|0;mj(a);br(a);return}function Cl(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;if(!(Pq(b[f[a>>2]>>0]|0)|0))c=0;else{d=0;while(1){e=f[a>>2]|0;g=(d*10|0)+-48+(b[e>>0]|0)|0;h=e+1|0;f[a>>2]=h;if(!(Pq(b[h>>0]|0)|0)){c=g;break}else d=g}}return c|0}function Dl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+60>>2]=c;d=1;return d|0}function El(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+64>>2]=c;d=1;return d|0}function Fl(a){a=a|0;var b=0,c=0;b=f[r>>2]|0;c=b+a|0;if((a|0)>0&(c|0)<(b|0)|(c|0)<0){ea()|0;ya(12);return -1}f[r>>2]=c;if((c|0)>(da()|0)?(ca()|0)==0:0){f[r>>2]=b;ya(12);return -1}return b|0}function Gl(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;if((a|0)==0&(c|0)==0)e=d;else{f=d;d=c;c=a;while(1){a=f+-1|0;b[a>>0]=c&7|48;c=Wn(c|0,d|0,3)|0;d=I;if((c|0)==0&(d|0)==0){e=a;break}else f=a}}return e|0}function Hl(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1528;b=f[a+32>>2]|0;if(!b){br(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Il(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;if(qp(a,f[b+8>>2]|0,g)|0)fj(0,b,c,d,e);return}function Jl(a){a=a|0;var b=0,c=0;b=f[a+64>>2]|0;if(!b)return;c=Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0;if(!c)return;f[a+60>>2]=(((f[c+4>>2]|0)-(f[c>>2]|0)>>2>>>0)/3|0)-(f[c+40>>2]|0);return}function Kl(a){a=a|0;Ii(a);br(a);return}function Ll(a){a=a|0;var b=0;switch(a|0){case 11:case 2:case 1:{b=1;break}case 4:case 3:{b=2;break}case 6:case 5:{b=4;break}case 8:case 7:{b=8;break}case 9:{b=4;break}case 10:{b=8;break}default:b=-1}return b|0}function Ml(){var a=0,b=0;a=dn(40)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;n[a+16>>2]=$(1.0);b=a+20|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;n[a+36>>2]=$(1.0);return a|0}function Nl(a,b){a=+a;b=+b;var c=0,d=0,e=0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;p[s>>3]=b;e=f[s+4>>2]&-2147483648|d&2147483647;f[s>>2]=c;f[s+4>>2]=e;return +(+p[s>>3])}function Ol(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0;d=u;u=u+16|0;e=d;p[e>>3]=c;_b(a,b,e);u=d;return}function Pl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;f[e>>2]=c;cc(a,b,e);u=d;return}function Ql(a,c){a=a|0;c=c|0;var d=0,e=0;if((a|0)!=(c|0)){d=b[c+11>>0]|0;e=d<<24>>24<0;Zi(a,e?f[c>>2]|0:c,e?f[c+4>>2]|0:d&255)|0}return a|0}function Rl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=X(d,c)|0;f=a>>>16;a=(e>>>16)+(X(d,f)|0)|0;d=b>>>16;b=X(d,c)|0;return (I=(a>>>16)+(X(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function Sl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=vj(b)|0;d=dn(c+13|0)|0;f[d>>2]=c;f[d+4>>2]=c;f[d+8>>2]=0;e=Sp(d)|0;Rg(e|0,b|0,c+1|0)|0;f[a>>2]=e;return}function Tl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=-1;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=-1;return c|0}c=f[d>>2]|0;return c|0}function Ul(a){a=a|0;Li(a);br(a);return}function Vl(a){a=a|0;var b=0,c=0;f[a>>2]=1528;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Wl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(qp(a,f[b+8>>2]|0,0)|0)tk(0,b,c,d);return}function Xl(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if((c|0)<(a|0)&(a|0)<(c+d|0)){e=a;c=c+d|0;a=a+d|0;while((d|0)>0){a=a-1|0;c=c-1|0;d=d-1|0;b[a>>0]=b[c>>0]|0}a=e}else Rg(a,c,d)|0;return a|0}function Yl(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1180;b=f[a+8>>2]|0;if(!b){br(a);return}c=a+12|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);br(b);br(a);return}function Zl(a){a=a|0;var b=0;f[a>>2]=2740;b=f[a+56>>2]|0;if(!b){br(a);return}br(b);br(a);return}function _l(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=u;u=u+16|0;e=d;f[e>>2]=f[c>>2];g=Sa[f[(f[a>>2]|0)+16>>2]&31](a,b,e)|0;if(g)f[c>>2]=f[e>>2];u=d;return g&1|0}function $l(a,b){a=a|0;b=b|0;var c=0;if(b>>>0>=2){c=0;return c|0}f[a+28>>2]=b;c=1;return c|0}function am(a){a=a|0;var b=0,c=0;f[a>>2]=3e3;b=a+64|0;c=f[b>>2]|0;f[b>>2]=0;if(!c){aj(a);return}Va[f[(f[c>>2]|0)+4>>2]&127](c);aj(a);return}function bm(){var a=0,b=0;a=mn()|0;if((a|0?(b=f[a>>2]|0,b|0):0)?(a=b+48|0,(f[a>>2]&-256|0)==1126902528?(f[a+4>>2]|0)==1129074247:0):0)Qo(f[b+12>>2]|0);Qo(bq()|0)}function cm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Bf(a,b,c,d,e,f,6)|0}function dm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Af(a,b,c,d,e,f,4)|0}function em(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Gf(a,b,c,d,e,f,2)|0}function fm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Af(a,b,c,d,e,f,3)|0}function gm(a){a=a|0;var b=0;f[a>>2]=2488;b=f[a+56>>2]|0;if(!b){br(a);return}br(b);br(a);return}function hm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Gf(a,b,c,d,e,f,1)|0}function im(a){a=a|0;var c=0;c=b[w+(a&255)>>0]|0;if((c|0)<8)return c|0;c=b[w+(a>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=b[w+(a>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (b[w+(a>>>24)>>0]|0)+24|0}function jm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0;if(!a){c=0.0;return +c}if((b|0)==0|(a|0)==(b|0)){c=0.0;return +c}d=+(b>>>0)/+(a>>>0);e=1.0-d;f=d*+Fg(d);c=-(f+e*+Fg(e));return +c}function km(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if((b|0)>0)d=0;else return;do{e=f[a+(d<<2)>>2]|0;f[c+(d<<2)>>2]=e<<1^e>>31;d=d+1|0}while((d|0)!=(b|0));return}function lm(a){a=a|0;var b=0,c=0;if(Eq(a)|0?(b=Zp(f[a>>2]|0)|0,a=b+8|0,c=f[a>>2]|0,f[a>>2]=c+-1,(c+-1|0)<0):0)br(b);return}function mm(a){a=a|0;var b=0;Ao(a);f[a>>2]=2880;f[a+40>>2]=1180;f[a+44>>2]=-1;b=a+48|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function nm(a,c){a=a|0;c=c|0;var d=0;b[c+84>>0]=1;a=f[c+68>>2]|0;d=c+72|0;c=f[d>>2]|0;if((c|0)==(a|0))return 1;f[d>>2]=c+(~((c+-4-a|0)>>>2)<<2);return 1}function om(a){a=a|0;var b=0,c=0;b=f[a+16>>2]|0;c=(((f[a+12>>2]|0)+1-b|0)/64|0)+b<<3;a=b<<3;b=Tn(c|0,((c|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;return b|0}function pm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Bf(a,b,c,d,e,f,5)|0}function qm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Bf(a,b,c,d,e,f,9)|0}function rm(a){a=a|0;var b=0;f[a>>2]=3208;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b){br(a);return}br(b);br(a);return}function sm(a){a=a|0;var b=0;f[a>>2]=2740;b=f[a+56>>2]|0;if(!b)return;br(b);return}function tm(a){a=a|0;var b=0,c=0;f[a>>2]=1460;b=a+36|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);zi(a);br(a);return}function um(a){a=a|0;var b=0,c=0;f[a>>2]=1180;b=f[a+8>>2]|0;if(!b)return;c=a+12|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function vm(a){a=a|0;var b=0;f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b){br(a);return}br(b);br(a);return}function wm(a){a=a|0;var c=0;f[a>>2]=1336;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=-1;c=a+16|0;f[a+32>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;b[c+12>>0]=0;return}function xm(a){a=a|0;f[a>>2]=3296;Gi(a+8|0);br(a);return}function ym(a){a=a|0;var b=0;f[a>>2]=2488;b=f[a+56>>2]|0;if(!b)return;br(b);return}function zm(a){a=a|0;var b=0,c=0;f[a>>2]=1460;b=a+36|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);zi(a);return}function Am(a,b){a=a|0;b=b|0;f[a>>2]=2968;Vh(a+4|0);f[a+40>>2]=0;f[a+44>>2]=0;f[a>>2]=2984;f[a+48>>2]=b;f[a+52>>2]=0;return}function Bm(a){a=a|0;var b=0,c=0;f[a>>2]=3e3;b=a+64|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);aj(a);br(a);return}function Cm(a){a=a|0;var b=0,c=0,d=0;b=f[a>>2]|0;c=a+4|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);f[a+12>>2]=0;f[a+16>>2]=0;return}function Dm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=a+20|0;e=f[d>>2]|0;g=(f[a+16>>2]|0)-e|0;a=g>>>0>c>>>0?c:g;Rg(e|0,b|0,a|0)|0;f[d>>2]=(f[d>>2]|0)+a;return c|0}function Em(a){a=a|0;var b=0;f[a>>2]=3208;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Fm(a){a=a|0;f[a>>2]=3296;Gi(a+8|0);return}function Gm(a,b){a=a|0;b=b|0;f[a>>2]=2968;Vh(a+4|0);f[a+40>>2]=0;f[a+44>>2]=0;f[a>>2]=2984;f[a+48>>2]=b;f[a+52>>2]=b;return}function Hm(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-8-b|0)>>>3)<<3);br(b);return}function Im(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);br(b);return}function Jm(a,b){a=a|0;b=b|0;var c=0;c=f[b>>2]|0;return (1<<(c&31)&f[(f[a+28>>2]|0)+(c>>>5<<2)>>2]|0)!=0|0}function Km(a,b,c){a=a|0;b=b|0;c=c|0;return Sa[f[(f[a>>2]|0)+44>>2]&31](a,b,c)|0}function Lm(a){a=a|0;var c=0;Al(a);c=a+64|0;f[a+88>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;b[c+20>>0]=0;return}function Mm(a){a=a|0;f[a>>2]=2796;tj(a+88|0);br(a);return}function Nm(a){a=a|0;var b=0;f[a>>2]=3276;b=f[a+36>>2]|0;if(b|0)br(b);b=f[a+24>>2]|0;if(!b)return;br(b);return}function Om(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((f[b+4>>2]|0)==(c|0)?(c=b+28|0,(f[c>>2]|0)!=1):0)f[c>>2]=d;return}function Pm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);pg(a,b,c,d,e,f);return}function Qm(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;if((uk(a)|0)==0?(Sa[f[a+32>>2]&31](a,c,1)|0)==1:0)d=h[c>>0]|0;else d=-1;u=b;return d|0}function Rm(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;f[a+104>>2]=b;c=f[a+8>>2]|0;d=f[a+4>>2]|0;e=c-d|0;f[a+108>>2]=e;f[a+100>>2]=(b|0)!=0&(e|0)>(b|0)?d+b|0:c;return}function Sm(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;return}function Tm(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=$(g);pg(f[a>>2]|0,b,c,d,e,g);return}function Um(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);Pm(a,b,c,d,e,f);return}function Vm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return cm(a,b,c,d,e,f)|0}function Wm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return dm(a,b,c,d,e,f)|0}function Xm(a){a=a|0;var b=0,c=0;if(!a)return;b=f[a>>2]|0;if(b|0){c=a+4|0;if((f[c>>2]|0)!=(b|0))f[c>>2]=b;br(b)}br(a);return}function Ym(a){a=a|0;f[a>>2]=2544;tj(a+88|0);br(a);return}function Zm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return em(a,b,c,d,e,f)|0}function _m(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return fm(a,b,c,d,e,f)|0}function $m(a){a=a|0;f[a>>2]=2796;tj(a+88|0);return}function an(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e|0;Bd(a,b,c,d,g)|0;u=e;return (I=f[g+4>>2]|0,f[g>>2]|0)|0}function bn(a){a=a|0;var b=0;$n(a);f[a>>2]=5840;b=a+84|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;return}function cn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return hm(a,b,c,d,e,f)|0}function dn(a){a=a|0;var b=0,c=0;b=(a|0)==0?1:a;while(1){a=$a(b)|0;if(a|0){c=a;break}a=$p()|0;if(!a){c=0;break}Ua[a&3]()}return c|0}function en(a,b,c){a=a|0;b=b|0;c=c|0;ac(a,b,c);return}function fn(a,b,c){a=a|0;b=b|0;c=c|0;f[a+4>>2]=b;f[a+8>>2]=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(c<<2)>>2];f[a+12>>2]=c;return 1}function gn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return pm(a,b,c,d,e,f)|0}function hn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return qm(a,b,c,d,e,f)|0}function jn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);Tm(a,b,c,d,e,f);return}function kn(a){a=a|0;f[a>>2]=2544;tj(a+88|0);return}function ln(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;d=dr(f[a+60>>2]|0)|0;f[c>>2]=d;d=ro(Ba(6,c|0)|0)|0;u=b;return d|0}function mn(){var a=0,b=0;a=u;u=u+16|0;if(!(Ka(18612,3)|0)){b=Ia(f[4654]|0)|0;u=a;return b|0}else Dn(17746,a);return 0}function nn(a){a=a|0;var b=0;if(!a)return;b=f[a>>2]|0;f[a>>2]=0;if(b|0)Va[f[(f[b>>2]|0)+4>>2]&127](b);br(a);return}function on(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=Rl(e,a)|0;f=I;return (I=(X(b,a)|0)+(X(d,e)|0)+f|f&0,c|0|0)|0}function pn(a,b){a=a|0;b=b|0;Sg(a,b);f[a>>2]=1276;b=a+36|0;a=b+40|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function qn(a){a=a|0;Gi(a);br(a);return}function rn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;f[a+24>>2]=0;f[a+28>>2]=0;return}function sn(a){a=a|0;var b=0;b=u;u=u+16|0;wc(a);if(!(La(f[4654]|0,0)|0)){u=b;return}else Dn(17845,b)}function tn(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function un(a,b){a=a|0;b=b|0;return eg(a+40|0,b)|0}function vn(a,b){a=a|0;b=b|0;return $i(a,b,Aq(b)|0)|0}function wn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;f[g>>2]=d;d=Mi(a,b,c,g)|0;u=e;return d|0}function xn(a,b){a=a|0;b=b|0;return Aj(a+40|0,b)|0}function yn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return zh(a,b,c,d)|0}function zn(a){a=a|0;var b=0;f[a>>2]=3608;f[a+52>>2]=0;b=a+4|0;a=b+44|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function An(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return $g(a,b,c,d)|0}function Bn(a,b){a=a|0;b=b|0;var c=0;c=f[a+64>>2]|0;return Ra[f[(f[c>>2]|0)+24>>2]&127](c,b)|0}function Cn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=0;return}function Dn(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;f[d>>2]=b;b=f[1478]|0;hh(b,a,d)|0;zj(10,b)|0;Ca()}function En(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Ta[a&31](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Fn(a){a=a|0;var b=0;b=f[a+56>>2]|0;f[a+60>>2]=((f[b+100>>2]|0)-(f[b+96>>2]|0)|0)/12|0;return}function Gn(a,b){a=a|0;b=b|0;var c=0;c=f[a+64>>2]|0;return Ra[f[(f[c>>2]|0)+16>>2]&127](c,b)|0}function Hn(a,b){a=a|0;b=b|0;var c=0;c=f[a+64>>2]|0;return Ra[f[(f[c>>2]|0)+20>>2]&127](c,b)|0}function In(a,b){a=a|0;b=b|0;var c=0;c=f[a+64>>2]|0;return Ra[f[(f[c>>2]|0)+12>>2]&127](c,b)|0}function Jn(){var a=0;a=u;u=u+16|0;if(!(Ja(18616,117)|0)){u=a;return}else Dn(17795,a)}function Kn(a){a=a|0;f[a>>2]=1136;Vh(a+4|0);f[a+40>>2]=0;f[a+44>>2]=0;f[a>>2]=2944;return}function Ln(a){a=a|0;Se(a);br(a);return}function Mn(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;_a[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Nn(a,b){a=a|0;b=b|0;var c=0;c=f[b+64>>2]|0;Wa[f[(f[c>>2]|0)+28>>2]&15](a,c);return}function On(a,b,c){a=a|0;b=b|0;c=c|0;if(b|0)hj(a|0,(zq(c)|0)&255|0,b|0)|0;return a|0}function Pn(a){a=a|0;return 4}function Qn(a,b,c){a=a|0;b=b|0;c=c|0;return Ui(0,b,c)|0}function Rn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b<>>32-c;return a<>>0;return (I=b+d+(e>>>0>>0|0)>>>0,e|0)|0}function Un(a,b){a=a|0;b=b|0;var c=0;if(!b)c=0;else c=lh(f[b>>2]|0,f[b+4>>2]|0,a)|0;return (c|0?c:a)|0}function Vn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (I=e,a-c>>>0|0)|0}function Wn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>>c;return a>>>c|(b&(1<>>c-32|0}function Xn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return qe(a,b,c,d)|0}function Yn(a){a=a|0;Ve(a);br(a);return}function Zn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return Oi(a,b,c,d)|0}function _n(a){a=a|0;return 5}function $n(a){a=a|0;var b=0;f[a>>2]=5880;b=a+4|0;a=b+80|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function ao(a){a=a|0;return 6}function bo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Pi(a,b,c,d)|0}function co(a,b,c){a=a|0;b=b|0;c=c|0;Fj(a,b,c);return}function eo(a,b){a=a|0;b=b|0;xi(f[a>>2]|0,b);return}function fo(a,b,c){a=a|0;b=b|0;c=c|0;co(a,b,c);return}function go(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;He(a,b,c,d,1);return}function ho(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;He(a,b,c,d,0);return}function io(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Eg(a,b,c,d)|0}function jo(a,b,c){a=a|0;b=b|0;c=c|0;return Qh(a,b,c)|0}function ko(a){a=a|0;var b=0;b=f[a+64>>2]|0;return Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0}function lo(a,b,c){a=a|0;b=b|0;c=c|0;f[a+28>>2]=b;f[a+32>>2]=c;return 1}function mo(a,b){a=a|0;b=b|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;return}function no(a,b,c){a=a|0;b=b|0;c=c|0;Fj(f[a>>2]|0,b,c);return}function oo(a,b,c){a=a|0;b=b|0;c=c|0;return Ui(a,b,c)|0}function po(a,b,c){a=a|0;b=b|0;c=c|0;return Qn(a,b,c)|0}function qo(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Za[a&3](b|0,c|0,d|0,e|0,f|0)}function ro(a){a=a|0;var b=0,c=0;if(a>>>0>4294963200){b=ir()|0;f[b>>2]=0-a;c=-1}else c=a;return c|0}function so(a,b,c){a=a|0;b=b|0;c=c|0;return rh(a,b,c)|0}function to(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;return}function uo(a,b){a=a|0;b=b|0;f[a+8>>2]=b;f[a+12>>2]=-1;return 1}function vo(a,b){a=a|0;b=b|0;f[a+56>>2]=b;tp(a,b);return}function wo(a,b,c){a=a|0;b=b|0;c=c|0;no(a,b,c);return}function xo(a){a=+a;var b=0;p[s>>3]=a;b=f[s>>2]|0;I=f[s+4>>2]|0;return b|0}function yo(a,b,c){a=a|0;b=$(b);c=c|0;var d=Oa;d=$($(c|0)/b);n[a>>2]=d;return}function zo(a,b){a=a|0;b=b|0;xi(a,b);return}function Ao(a){a=a|0;wm(a);f[a>>2]=1460;f[a+36>>2]=0;return}function Bo(a){a=a|0;zn(a);f[a>>2]=3424;f[a+56>>2]=0;f[a+60>>2]=0;return}function Co(a){a=a|0;var b=0;if(!a)b=0;else b=(mh(a,1024,1112,0)|0)!=0&1;return b|0}function Do(a,b,c){a=a|0;b=b|0;c=c|0;Eo(f[a>>2]|0,b,c);return}function Eo(a,b,c){a=a|0;b=b|0;c=c|0;Fi(a+4|0,b,c);return}function Fo(a){a=a|0;var b=0;b=dn(8)|0;ck(b,a);return b|0}function Go(a){a=a|0;if((b[a+11>>0]|0)<0)br(f[a>>2]|0);return}function Ho(a){a=a|0;if(!a)return;Va[f[(f[a>>2]|0)+4>>2]&127](a);return}function Io(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ya[a&7](b|0,c|0,d|0,e|0)}function Jo(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)Xl(a|0,b|0,c|0)|0;return a|0}function Ko(a,b,c){a=a|0;b=b|0;c=c|0;Do(a,b,c);return}function Lo(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)Rg(a|0,b|0,c|0)|0;return a|0}function Mo(a){a=a|0;f[a+52>>2]=f[(f[a+4>>2]|0)+80>>2];return}function No(a,b){a=a|0;b=b|0;eo(a,b);return}function Oo(a){a=a|0;f[a+52>>2]=f[(f[a+56>>2]|0)+80>>2];return}function Po(a,b){a=a|0;b=b|0;return -1}function Qo(a){a=a|0;var b=0;b=u;u=u+16|0;Ua[a&3]();Dn(17898,b)}function Ro(a){a=a|0;wh(a);br(a);return}function So(a,b,c){a=a|0;b=b|0;c=c|0;$o(a,b,c);return}function To(a,b){a=a|0;b=b|0;bk(f[a>>2]|0,b);return}function Uo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Sa[a&31](b|0,c|0,d|0)|0}function Vo(a,b){a=a|0;b=b|0;return (Jp(a,b)|0)<<24>>24|0}function Wo(a,b){a=a|0;b=b|0;f[a>>2]=6924;Sl(a+4|0,b);return}function Xo(a){a=a|0;Bo(a);f[a>>2]=3e3;f[a+64>>2]=0;return}function Yo(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=Bi(a,b,0)|0;return c|0}function Zo(a,b){a=a|0;b=b|0;zo(a,b);return}function _o(a){a=a|0;return f[a+12>>2]|0}function $o(a,b,c){a=a|0;b=b|0;c=c|0;Eo(a,b,c);return}function ap(){var a=0;a=dn(64)|0;Al(a);return a|0}function bp(a,b){a=a|0;b=b|0;To(a,b);return}function cp(a){a=a|0;if(!a)return;Qi(a);br(a);return}function dp(a){a=a|0;return f[a+4>>2]|0}function ep(a,b,c){a=a|0;b=b|0;c=c|0;if(!(f[a>>2]&32))ai(b,c,a)|0;return}function fp(a){a=a|0;return Mp(a)|0}function gp(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Xa[a&15](b|0,c|0,d|0)}function hp(){var a=0;a=dn(96)|0;Lm(a);return a|0}function ip(a){a=a|0;return Np(a)|0}function jp(a){a=a|0;var b=0;b=u;u=u+a|0;u=u+15&-16;return b|0}function kp(a){a=a|0;var b=0;b=(Yq()|0)+188|0;return Tj(a,f[b>>2]|0)|0}function lp(a){a=a|0;return ((f[a+100>>2]|0)-(f[a+96>>2]|0)|0)/12|0|0}function mp(a,b){a=a|0;b=b|0;vp(a,b);return}function np(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;aa(3);return 0}function op(){var a=0;a=dn(12)|0;Bp(a);return a|0}function pp(a){a=a|0;zi(a);br(a);return}function qp(a,b,c){a=a|0;b=b|0;c=c|0;return (a|0)==(b|0)|0}function rp(a,b){a=a|0;b=b|0;var c=0;c=Fp(a|0)|0;return ((b|0)==0?a:c)|0}function sp(a){a=a|0;return (f[a+12>>2]|0)-(f[a+8>>2]|0)>>2|0}function tp(a,b){a=a|0;b=b|0;f[a+4>>2]=b;return}function up(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Bd(a,b,c,d,0)|0}function vp(a,b){a=a|0;b=b|0;bk(a,b);return}function wp(a){a=a|0;f[a+4>>2]=0;f[a+8>>2]=0;f[a>>2]=a+4;return}function xp(a){a=a|0;return nq(a)|0}function yp(){var a=0;a=dn(84)|0;$n(a);return a|0}function zp(a){a=a|0;gi(a);br(a);return}function Ap(a){a=a|0;return oq(a)|0}function Bp(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;return}function Cp(a){a=a|0;f[a>>2]=6924;lm(a+4|0);return}function Dp(a,b,c){a=a|0;b=b|0;c=c|0;return Ra[a&127](b|0,c|0)|0}function Ep(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;aa(10)}function Fp(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Gp(a){a=a|0;Bo(a);f[a>>2]=3504;return}function Hp(a,c){a=a|0;c=c|0;b[a>>0]=b[c>>0]|0;return}function Ip(a,b,c){a=a|0;b=b|0;c=c|0;return -1}function Jp(a,c){a=a|0;c=c|0;return b[(f[a>>2]|0)+c>>0]|0}function Kp(a){a=a|0;return (f[a+4>>2]|0)-(f[a>>2]|0)|0}function Lp(a){a=a|0;aj(a);br(a);return}function Mp(a){a=a|0;return f[(f[a>>2]|0)+40>>2]|0}function Np(a){a=a|0;return f[(f[a>>2]|0)+44>>2]|0}function Op(a){a=a|0;if(!a)return;br(a);return}function Pp(a){a=a|0;b[a+28>>0]=1;return}function Qp(a,b){a=a|0;b=b|0;if(!x){x=a;y=b}}function Rp(a,b){a=a|0;b=b|0;return 1}function Sp(a){a=a|0;return a+12|0}function Tp(a,b,c){a=a|0;b=b|0;c=c|0;Wa[a&15](b|0,c|0)}function Up(a,b){a=a|0;b=b|0;f[a+80>>2]=b;return}function Vp(){var a=0;a=dn(48)|0;Fq(a);return a|0}function Wp(a){a=a|0;return vq(a+4|0)|0}function Xp(){var a=0;a=dn(108)|0;bn(a);return a|0}function Yp(a){a=a|0;return (b[a+32>>0]|0)!=0|0}function Zp(a){a=a|0;return a+-12|0}function _p(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;aa(9)}function $p(){var a=0;a=f[4655]|0;f[4655]=a+0;return a|0}function aq(a){a=a|0;return f[a+56>>2]|0}function bq(){var a=0;a=f[1708]|0;f[1708]=a+0;return a|0}function cq(a){a=a|0;wg(a);br(a);return}function dq(a){a=a|0;fr(a);br(a);return}function eq(a){a=a|0;return b[a+24>>0]|0}function fq(a,b){a=a|0;b=b|0;return 0}function gq(a){a=a|0;return f[a+48>>2]|0}function hq(a,b){a=a|0;b=b|0;return Qa[a&127](b|0)|0}function iq(a){a=a|0;return f[a+60>>2]|0}function jq(a){a=a|0;return f[a+28>>2]|0}function kq(a){a=a|0;sa(a|0)|0;bm()}function lq(a){a=a|0;Cp(a);br(a);return}function mq(a){a=a|0;Ca()}function nq(a){a=a|0;return f[a+40>>2]|0}function oq(a){a=a|0;return f[a+44>>2]|0}function pq(a,b){a=a|0;b=b|0;return $(+sk(a,b,0))}function qq(a){a=a|0;return 3}function rq(a,b){a=a|0;b=b|0;u=a;v=b}function sq(a){a=a|0;n[a>>2]=$(1.0);return}function tq(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function uq(a){a=a|0;return f[a+80>>2]|0}function vq(a){a=a|0;return f[a>>2]|0}function wq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;aa(8)}function xq(a,b){a=a|0;b=b|0;Va[a&127](b|0)}function yq(a,b){a=a|0;b=b|0;return Un(a,b)|0}function zq(a){a=a|0;return a&255|0}function Aq(a){a=a|0;return vj(a)|0}function Bq(a,b){a=a|0;b=b|0;return +(+sk(a,b,1))}function Cq(a,b,c){a=a|0;b=b|0;c=c|0;aa(2);return 0}function Dq(a){a=a|0;return 2}function Eq(a){a=a|0;return 1}function Fq(a){a=a|0;Kn(a);return}function Gq(a,b){a=+a;b=+b;return +(+Nl(a,b))}function Hq(a,b){a=+a;b=b|0;return +(+Wj(a,b))}function Iq(a,b){a=+a;b=b|0;return +(+Uj(a,b))}function Jq(){return 3}function Kq(a,b,c){a=a|0;b=b|0;c=c|0;aa(7)}function Lq(){return 0}function Mq(){return -1}function Nq(){return dn(1)|0}function Oq(){return 4}function Pq(a){a=a|0;return (a+-48|0)>>>0<10|0}function Qq(){return 1}function Rq(){return 2}function Sq(a,b){a=+a;b=+b;return +(+pd(a,b))}function Tq(a,b){a=a|0;b=b|0;aa(1);return 0}function Uq(a){a=a|0;Ha()}function Vq(a){a=a|0;Ua[a&3]()}function Wq(){ua()}function Xq(a){a=a|0;return +(+Bq(a,0))}function Yq(){return lr()|0}function Zq(a,b){a=a|0;b=b|0;aa(6)}function _q(a){a=a|0;return dn(a)|0}function $q(a){a=a|0;br(a);return}function ar(a){a=a|0;u=a}function br(a){a=a|0;wc(a);return}function cr(a){a=a|0;I=a}function dr(a){a=a|0;return a|0}function er(a){a=a|0;aa(0);return 0}function fr(a){a=a|0;return}function gr(a){a=a|0;return 0}function hr(){return I|0}function ir(){return 18544}function jr(){return u|0}function kr(a){a=a|0;aa(5)}function lr(){return 6040}function mr(){aa(4)} // EMSCRIPTEN_END_FUNCS var Qa=[er,Dq,Eq,Eq,Dq,gb,gr,gr,gr,ak,Vf,Eq,dp,gr,gr,Eq,gr,Eq,Eq,rl,_n,ll,Eq,ao,Yk,Eq,jq,Pn,rl,Eq,rl,_n,ll,Eq,ao,Yk,Eq,jq,Pn,rl,Eq,qq,gr,dp,Eq,gr,Eq,qq,Eq,kl,Pn,kl,_n,il,Eq,ao,Qk,Eq,jq,Eq,kl,Pn,kl,_n,il,Eq,ao,Qk,Eq,jq,Eq,Dq,Eq,Eq,Cd,Eq,Je,Tg,qk,ko,_o,dp,lg,sg,$e,_o,dp,Eq,gr,gr,wi,gr,Eq,gr,Xj,ln,Wp,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er,er];var Ra=[Tq,ql,Ug,ve,xl,fq,fq,fq,Rp,kb,gj,uo,Rp,Rp,fi,bj,Uh,ek,jl,Gj,Vk,Yj,Zj,Fe,Po,fq,Zh,fq,Dl,_e,fq,El,Zg,$l,td,fq,Dl,_e,fq,El,Zg,$l,td,xn,Po,fq,Xh,sd,fq,tl,We,fq,ul,Yg,$l,sd,fq,tl,We,fq,ul,Yg,$l,un,Hn,Bn,In,Gn,Kg,dk,mk,mc,le,Jm,wf,af,Ze,Ig,dk,mk,lc,le,Jm,Rp,fq,fq,bf,nm,Xf,bf,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq,Tq];var Sa=[Cq,lo,Ip,fn,Km,fg,cj,el,ih,uc,vh,$f,Rh,Qb,Oh,vg,gl,Dm,qj,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq,Cq];var Ta=[np,Ld,Bc,ne,Sb,bb,Cc,me,Rb,ab,Lg,ed,eb,sf,qc,id,db,qf,nc,np,np,np,np,np,np,np,np,np,np,np,np,np];var Ua=[mr,Wq,Ai,Jn];var Va=[kr,Ij,Qj,fr,$q,um,Yl,Wk,Uq,gi,zp,zi,pp,wh,Ro,zm,tm,Vl,Uq,Hl,Hl,Uk,Jk,_k,Ok,fr,$q,Uq,Li,Ul,Hl,Rk,Gk,Xk,Mk,fr,$q,Uq,Ii,Kl,zm,tm,fr,$q,$q,mj,Bl,ym,gm,kn,Ym,fr,$q,$q,kj,sl,sm,Zl,$m,Mm,fr,$q,ok,hk,Qj,Sj,Vj,Vj,am,Bm,Mc,Jl,Ve,Yn,rk,jk,Lk,Fk,Em,rm,xk,nk,Nk,Ik,Nm,vm,Fm,xm,Gi,qn,Se,Ln,aj,Uq,Lp,Oo,Fn,fr,$q,Uq,Lp,Mo,Lp,Mo,Dk,wk,rb,wg,cq,fr,dq,fr,fr,dq,Cp,lq,lq,sn,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr];var Wa=[Zq,ik,Rf,Ri,Nn,ib,lb,sc,mo,ej,ej,pk,Ec,Zq,Zq,Zq];var Xa=[Kq,ze,Yi,$b,fc,Fc,$b,fc,uj,Ej,Hg,oj,ug,If,Kq,Kq];var Ya=[wq,Dg,Zf,Wl,Zk,wq,wq,wq];var Za=[_p,ij,Vg,_p];var _a=[Ep,Il,Kk,Ep];return{___cxa_can_catch:_l,___cxa_is_pointer_type:Co,___divdi3:zk,___muldi3:on,___udivdi3:up,___uremdi3:an,_bitshift64Lshr:Wn,_bitshift64Shl:Rn,_emscripten_bind_DracoInt8Array_DracoInt8Array_0:op,_emscripten_bind_DracoInt8Array_GetValue_1:Vo,_emscripten_bind_DracoInt8Array___destroy___0:Xm,_emscripten_bind_DracoInt8Array_size_0:Kp,_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2:jo,_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3:An,_emscripten_bind_Encoder_Encoder_0:Vp,_emscripten_bind_Encoder_GetNumberOfEncodedFaces_0:Ap,_emscripten_bind_Encoder_GetNumberOfEncodedPoints_0:xp,_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5:Um,_emscripten_bind_Encoder_SetAttributeQuantization_2:fo,_emscripten_bind_Encoder_SetEncodingMethod_1:mp,_emscripten_bind_Encoder_SetSpeedOptions_2:So,_emscripten_bind_Encoder_SetTrackEncodedProperties_1:Zo,_emscripten_bind_Encoder___destroy___0:Hj,_emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2:so,_emscripten_bind_ExpertEncoder_ExpertEncoder_1:Fo,_emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0:ip,_emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0:fp,_emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5:jn,_emscripten_bind_ExpertEncoder_SetAttributeQuantization_2:wo,_emscripten_bind_ExpertEncoder_SetEncodingMethod_1:bp,_emscripten_bind_ExpertEncoder_SetSpeedOptions_2:Ko,_emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1:No,_emscripten_bind_ExpertEncoder___destroy___0:nn,_emscripten_bind_GeometryAttribute_GeometryAttribute_0:ap,_emscripten_bind_GeometryAttribute___destroy___0:Op,_emscripten_bind_MeshBuilder_AddFacesToMesh_3:io,_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5:hn,_emscripten_bind_MeshBuilder_AddFloatAttribute_5:hn,_emscripten_bind_MeshBuilder_AddInt16Attribute_5:_m,_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5:gn,_emscripten_bind_MeshBuilder_AddInt32Attribute_5:gn,_emscripten_bind_MeshBuilder_AddInt8Attribute_5:cn,_emscripten_bind_MeshBuilder_AddMetadataToMesh_2:po,_emscripten_bind_MeshBuilder_AddMetadata_2:oo,_emscripten_bind_MeshBuilder_AddUInt16Attribute_5:Wm,_emscripten_bind_MeshBuilder_AddUInt32Attribute_5:Vm,_emscripten_bind_MeshBuilder_AddUInt8Attribute_5:Zm,_emscripten_bind_MeshBuilder_MeshBuilder_0:Nq,_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3:yn,_emscripten_bind_MeshBuilder___destroy___0:Op,_emscripten_bind_Mesh_Mesh_0:Xp,_emscripten_bind_Mesh___destroy___0:Ho,_emscripten_bind_Mesh_num_attributes_0:sp,_emscripten_bind_Mesh_num_faces_0:lp,_emscripten_bind_Mesh_num_points_0:uq,_emscripten_bind_Mesh_set_num_points_1:Up,_emscripten_bind_MetadataBuilder_AddDoubleEntry_3:Zn,_emscripten_bind_MetadataBuilder_AddIntEntry_3:bo,_emscripten_bind_MetadataBuilder_AddStringEntry_3:Xn,_emscripten_bind_MetadataBuilder_MetadataBuilder_0:Nq,_emscripten_bind_MetadataBuilder___destroy___0:Op,_emscripten_bind_Metadata_Metadata_0:Ml,_emscripten_bind_Metadata___destroy___0:cp,_emscripten_bind_PointAttribute_PointAttribute_0:hp,_emscripten_bind_PointAttribute___destroy___0:xj,_emscripten_bind_PointAttribute_attribute_type_0:aq,_emscripten_bind_PointAttribute_byte_offset_0:gq,_emscripten_bind_PointAttribute_byte_stride_0:nq,_emscripten_bind_PointAttribute_data_type_0:jq,_emscripten_bind_PointAttribute_normalized_0:Yp,_emscripten_bind_PointAttribute_num_components_0:eq,_emscripten_bind_PointAttribute_size_0:uq,_emscripten_bind_PointAttribute_unique_id_0:iq,_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5:hn,_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5:_m,_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5:gn,_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5:cn,_emscripten_bind_PointCloudBuilder_AddMetadata_2:oo,_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5:Wm,_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5:Vm,_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5:Zm,_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0:Nq,_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3:yn,_emscripten_bind_PointCloudBuilder___destroy___0:Op,_emscripten_bind_PointCloud_PointCloud_0:yp,_emscripten_bind_PointCloud___destroy___0:Ho,_emscripten_bind_PointCloud_num_attributes_0:sp,_emscripten_bind_PointCloud_num_points_0:uq,_emscripten_bind_VoidPtr___destroy___0:Op,_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE:Mq,_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD:Lq,_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH:Qq,_emscripten_enum_draco_GeometryAttribute_Type_COLOR:Rq,_emscripten_enum_draco_GeometryAttribute_Type_GENERIC:Oq,_emscripten_enum_draco_GeometryAttribute_Type_INVALID:Mq,_emscripten_enum_draco_GeometryAttribute_Type_NORMAL:Qq,_emscripten_enum_draco_GeometryAttribute_Type_POSITION:Lq,_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD:Jq,_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING:Qq,_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING:Lq,_emscripten_replace_memory:Pa,_free:wc,_i64Add:Tn,_i64Subtract:Vn,_llvm_bswap_i32:Fp,_malloc:$a,_memcpy:Rg,_memmove:Xl,_memset:hj,_sbrk:Fl,dynCall_ii:hq,dynCall_iii:Dp,dynCall_iiii:Uo,dynCall_iiiiiii:En,dynCall_v:Vq,dynCall_vi:xq,dynCall_vii:Tp,dynCall_viii:gp,dynCall_viiii:Io,dynCall_viiiii:qo,dynCall_viiiiii:Mn,establishStackSpace:rq,getTempRet0:hr,runPostSets:Sn,setTempRet0:cr,setThrew:Qp,stackAlloc:jp,stackRestore:ar,stackSave:jr}}) // EMSCRIPTEN_END_ASM (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module["_emscripten_bind_DracoInt8Array_DracoInt8Array_0"]=asm["_emscripten_bind_DracoInt8Array_DracoInt8Array_0"];var _emscripten_bind_DracoInt8Array_GetValue_1=Module["_emscripten_bind_DracoInt8Array_GetValue_1"]=asm["_emscripten_bind_DracoInt8Array_GetValue_1"];var _emscripten_bind_DracoInt8Array___destroy___0=Module["_emscripten_bind_DracoInt8Array___destroy___0"]=asm["_emscripten_bind_DracoInt8Array___destroy___0"];var _emscripten_bind_DracoInt8Array_size_0=Module["_emscripten_bind_DracoInt8Array_size_0"]=asm["_emscripten_bind_DracoInt8Array_size_0"];var _emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2=Module["_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2"]=asm["_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2"];var _emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3=Module["_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3"]=asm["_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3"];var _emscripten_bind_Encoder_Encoder_0=Module["_emscripten_bind_Encoder_Encoder_0"]=asm["_emscripten_bind_Encoder_Encoder_0"];var _emscripten_bind_Encoder_GetNumberOfEncodedFaces_0=Module["_emscripten_bind_Encoder_GetNumberOfEncodedFaces_0"]=asm["_emscripten_bind_Encoder_GetNumberOfEncodedFaces_0"];var _emscripten_bind_Encoder_GetNumberOfEncodedPoints_0=Module["_emscripten_bind_Encoder_GetNumberOfEncodedPoints_0"]=asm["_emscripten_bind_Encoder_GetNumberOfEncodedPoints_0"];var _emscripten_bind_Encoder_SetAttributeExplicitQuantization_5=Module["_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5"]=asm["_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5"];var _emscripten_bind_Encoder_SetAttributeQuantization_2=Module["_emscripten_bind_Encoder_SetAttributeQuantization_2"]=asm["_emscripten_bind_Encoder_SetAttributeQuantization_2"];var _emscripten_bind_Encoder_SetEncodingMethod_1=Module["_emscripten_bind_Encoder_SetEncodingMethod_1"]=asm["_emscripten_bind_Encoder_SetEncodingMethod_1"];var _emscripten_bind_Encoder_SetSpeedOptions_2=Module["_emscripten_bind_Encoder_SetSpeedOptions_2"]=asm["_emscripten_bind_Encoder_SetSpeedOptions_2"];var _emscripten_bind_Encoder_SetTrackEncodedProperties_1=Module["_emscripten_bind_Encoder_SetTrackEncodedProperties_1"]=asm["_emscripten_bind_Encoder_SetTrackEncodedProperties_1"];var _emscripten_bind_Encoder___destroy___0=Module["_emscripten_bind_Encoder___destroy___0"]=asm["_emscripten_bind_Encoder___destroy___0"];var _emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2=Module["_emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2"]=asm["_emscripten_bind_ExpertEncoder_EncodeToDracoBuffer_2"];var _emscripten_bind_ExpertEncoder_ExpertEncoder_1=Module["_emscripten_bind_ExpertEncoder_ExpertEncoder_1"]=asm["_emscripten_bind_ExpertEncoder_ExpertEncoder_1"];var _emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0=Module["_emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0"]=asm["_emscripten_bind_ExpertEncoder_GetNumberOfEncodedFaces_0"];var _emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0=Module["_emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0"]=asm["_emscripten_bind_ExpertEncoder_GetNumberOfEncodedPoints_0"];var _emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5=Module["_emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5"]=asm["_emscripten_bind_ExpertEncoder_SetAttributeExplicitQuantization_5"];var _emscripten_bind_ExpertEncoder_SetAttributeQuantization_2=Module["_emscripten_bind_ExpertEncoder_SetAttributeQuantization_2"]=asm["_emscripten_bind_ExpertEncoder_SetAttributeQuantization_2"];var _emscripten_bind_ExpertEncoder_SetEncodingMethod_1=Module["_emscripten_bind_ExpertEncoder_SetEncodingMethod_1"]=asm["_emscripten_bind_ExpertEncoder_SetEncodingMethod_1"];var _emscripten_bind_ExpertEncoder_SetSpeedOptions_2=Module["_emscripten_bind_ExpertEncoder_SetSpeedOptions_2"]=asm["_emscripten_bind_ExpertEncoder_SetSpeedOptions_2"];var _emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1=Module["_emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1"]=asm["_emscripten_bind_ExpertEncoder_SetTrackEncodedProperties_1"];var _emscripten_bind_ExpertEncoder___destroy___0=Module["_emscripten_bind_ExpertEncoder___destroy___0"]=asm["_emscripten_bind_ExpertEncoder___destroy___0"];var _emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module["_emscripten_bind_GeometryAttribute_GeometryAttribute_0"]=asm["_emscripten_bind_GeometryAttribute_GeometryAttribute_0"];var _emscripten_bind_GeometryAttribute___destroy___0=Module["_emscripten_bind_GeometryAttribute___destroy___0"]=asm["_emscripten_bind_GeometryAttribute___destroy___0"];var _emscripten_bind_MeshBuilder_AddFacesToMesh_3=Module["_emscripten_bind_MeshBuilder_AddFacesToMesh_3"]=asm["_emscripten_bind_MeshBuilder_AddFacesToMesh_3"];var _emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5=Module["_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5"]=asm["_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5"];var _emscripten_bind_MeshBuilder_AddFloatAttribute_5=Module["_emscripten_bind_MeshBuilder_AddFloatAttribute_5"]=asm["_emscripten_bind_MeshBuilder_AddFloatAttribute_5"];var _emscripten_bind_MeshBuilder_AddInt16Attribute_5=Module["_emscripten_bind_MeshBuilder_AddInt16Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddInt16Attribute_5"];var _emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5=Module["_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5"]=asm["_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5"];var _emscripten_bind_MeshBuilder_AddInt32Attribute_5=Module["_emscripten_bind_MeshBuilder_AddInt32Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddInt32Attribute_5"];var _emscripten_bind_MeshBuilder_AddInt8Attribute_5=Module["_emscripten_bind_MeshBuilder_AddInt8Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddInt8Attribute_5"];var _emscripten_bind_MeshBuilder_AddMetadataToMesh_2=Module["_emscripten_bind_MeshBuilder_AddMetadataToMesh_2"]=asm["_emscripten_bind_MeshBuilder_AddMetadataToMesh_2"];var _emscripten_bind_MeshBuilder_AddMetadata_2=Module["_emscripten_bind_MeshBuilder_AddMetadata_2"]=asm["_emscripten_bind_MeshBuilder_AddMetadata_2"];var _emscripten_bind_MeshBuilder_AddUInt16Attribute_5=Module["_emscripten_bind_MeshBuilder_AddUInt16Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddUInt16Attribute_5"];var _emscripten_bind_MeshBuilder_AddUInt32Attribute_5=Module["_emscripten_bind_MeshBuilder_AddUInt32Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddUInt32Attribute_5"];var _emscripten_bind_MeshBuilder_AddUInt8Attribute_5=Module["_emscripten_bind_MeshBuilder_AddUInt8Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddUInt8Attribute_5"];var _emscripten_bind_MeshBuilder_MeshBuilder_0=Module["_emscripten_bind_MeshBuilder_MeshBuilder_0"]=asm["_emscripten_bind_MeshBuilder_MeshBuilder_0"];var _emscripten_bind_MeshBuilder_SetMetadataForAttribute_3=Module["_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3"]=asm["_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3"];var _emscripten_bind_MeshBuilder___destroy___0=Module["_emscripten_bind_MeshBuilder___destroy___0"]=asm["_emscripten_bind_MeshBuilder___destroy___0"];var _emscripten_bind_Mesh_Mesh_0=Module["_emscripten_bind_Mesh_Mesh_0"]=asm["_emscripten_bind_Mesh_Mesh_0"];var _emscripten_bind_Mesh___destroy___0=Module["_emscripten_bind_Mesh___destroy___0"]=asm["_emscripten_bind_Mesh___destroy___0"];var _emscripten_bind_Mesh_num_attributes_0=Module["_emscripten_bind_Mesh_num_attributes_0"]=asm["_emscripten_bind_Mesh_num_attributes_0"];var _emscripten_bind_Mesh_num_faces_0=Module["_emscripten_bind_Mesh_num_faces_0"]=asm["_emscripten_bind_Mesh_num_faces_0"];var _emscripten_bind_Mesh_num_points_0=Module["_emscripten_bind_Mesh_num_points_0"]=asm["_emscripten_bind_Mesh_num_points_0"];var _emscripten_bind_Mesh_set_num_points_1=Module["_emscripten_bind_Mesh_set_num_points_1"]=asm["_emscripten_bind_Mesh_set_num_points_1"];var _emscripten_bind_MetadataBuilder_AddDoubleEntry_3=Module["_emscripten_bind_MetadataBuilder_AddDoubleEntry_3"]=asm["_emscripten_bind_MetadataBuilder_AddDoubleEntry_3"];var _emscripten_bind_MetadataBuilder_AddIntEntry_3=Module["_emscripten_bind_MetadataBuilder_AddIntEntry_3"]=asm["_emscripten_bind_MetadataBuilder_AddIntEntry_3"];var _emscripten_bind_MetadataBuilder_AddStringEntry_3=Module["_emscripten_bind_MetadataBuilder_AddStringEntry_3"]=asm["_emscripten_bind_MetadataBuilder_AddStringEntry_3"];var _emscripten_bind_MetadataBuilder_MetadataBuilder_0=Module["_emscripten_bind_MetadataBuilder_MetadataBuilder_0"]=asm["_emscripten_bind_MetadataBuilder_MetadataBuilder_0"];var _emscripten_bind_MetadataBuilder___destroy___0=Module["_emscripten_bind_MetadataBuilder___destroy___0"]=asm["_emscripten_bind_MetadataBuilder___destroy___0"];var _emscripten_bind_Metadata_Metadata_0=Module["_emscripten_bind_Metadata_Metadata_0"]=asm["_emscripten_bind_Metadata_Metadata_0"];var _emscripten_bind_Metadata___destroy___0=Module["_emscripten_bind_Metadata___destroy___0"]=asm["_emscripten_bind_Metadata___destroy___0"];var _emscripten_bind_PointAttribute_PointAttribute_0=Module["_emscripten_bind_PointAttribute_PointAttribute_0"]=asm["_emscripten_bind_PointAttribute_PointAttribute_0"];var _emscripten_bind_PointAttribute___destroy___0=Module["_emscripten_bind_PointAttribute___destroy___0"]=asm["_emscripten_bind_PointAttribute___destroy___0"];var _emscripten_bind_PointAttribute_attribute_type_0=Module["_emscripten_bind_PointAttribute_attribute_type_0"]=asm["_emscripten_bind_PointAttribute_attribute_type_0"];var _emscripten_bind_PointAttribute_byte_offset_0=Module["_emscripten_bind_PointAttribute_byte_offset_0"]=asm["_emscripten_bind_PointAttribute_byte_offset_0"];var _emscripten_bind_PointAttribute_byte_stride_0=Module["_emscripten_bind_PointAttribute_byte_stride_0"]=asm["_emscripten_bind_PointAttribute_byte_stride_0"];var _emscripten_bind_PointAttribute_data_type_0=Module["_emscripten_bind_PointAttribute_data_type_0"]=asm["_emscripten_bind_PointAttribute_data_type_0"];var _emscripten_bind_PointAttribute_normalized_0=Module["_emscripten_bind_PointAttribute_normalized_0"]=asm["_emscripten_bind_PointAttribute_normalized_0"];var _emscripten_bind_PointAttribute_num_components_0=Module["_emscripten_bind_PointAttribute_num_components_0"]=asm["_emscripten_bind_PointAttribute_num_components_0"];var _emscripten_bind_PointAttribute_size_0=Module["_emscripten_bind_PointAttribute_size_0"]=asm["_emscripten_bind_PointAttribute_size_0"];var _emscripten_bind_PointAttribute_unique_id_0=Module["_emscripten_bind_PointAttribute_unique_id_0"]=asm["_emscripten_bind_PointAttribute_unique_id_0"];var _emscripten_bind_PointCloudBuilder_AddFloatAttribute_5=Module["_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5"];var _emscripten_bind_PointCloudBuilder_AddInt16Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddInt32Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddInt8Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddMetadata_2=Module["_emscripten_bind_PointCloudBuilder_AddMetadata_2"]=asm["_emscripten_bind_PointCloudBuilder_AddMetadata_2"];var _emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5"];var _emscripten_bind_PointCloudBuilder_PointCloudBuilder_0=Module["_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0"]=asm["_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0"];var _emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3=Module["_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3"]=asm["_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3"];var _emscripten_bind_PointCloudBuilder___destroy___0=Module["_emscripten_bind_PointCloudBuilder___destroy___0"]=asm["_emscripten_bind_PointCloudBuilder___destroy___0"];var _emscripten_bind_PointCloud_PointCloud_0=Module["_emscripten_bind_PointCloud_PointCloud_0"]=asm["_emscripten_bind_PointCloud_PointCloud_0"];var _emscripten_bind_PointCloud___destroy___0=Module["_emscripten_bind_PointCloud___destroy___0"]=asm["_emscripten_bind_PointCloud___destroy___0"];var _emscripten_bind_PointCloud_num_attributes_0=Module["_emscripten_bind_PointCloud_num_attributes_0"]=asm["_emscripten_bind_PointCloud_num_attributes_0"];var _emscripten_bind_PointCloud_num_points_0=Module["_emscripten_bind_PointCloud_num_points_0"]=asm["_emscripten_bind_PointCloud_num_points_0"];var _emscripten_bind_VoidPtr___destroy___0=Module["_emscripten_bind_VoidPtr___destroy___0"]=asm["_emscripten_bind_VoidPtr___destroy___0"];var _emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module["_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE"]=asm["_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE"];var _emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module["_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD"]=asm["_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD"];var _emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module["_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH"]=asm["_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH"];var _emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module["_emscripten_enum_draco_GeometryAttribute_Type_COLOR"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_COLOR"];var _emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module["_emscripten_enum_draco_GeometryAttribute_Type_GENERIC"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_GENERIC"];var _emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module["_emscripten_enum_draco_GeometryAttribute_Type_INVALID"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_INVALID"];var _emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module["_emscripten_enum_draco_GeometryAttribute_Type_NORMAL"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_NORMAL"];var _emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module["_emscripten_enum_draco_GeometryAttribute_Type_POSITION"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_POSITION"];var _emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module["_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD"];var _emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING=Module["_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING"]=asm["_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING"];var _emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING=Module["_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING"]=asm["_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _free=Module["_free"]=asm["_free"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memmove=Module["_memmove"]=asm["_memmove"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;if(memoryInitializer){if(!isDataURI(memoryInitializer)){if(typeof Module["locateFile"]==="function"){memoryInitializer=Module["locateFile"](memoryInitializer)}else if(Module["memoryInitializerPrefixURL"]){memoryInitializer=Module["memoryInitializerPrefixURL"]+memoryInitializer}}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=exit;function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module["WrapperObject"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module["getCache"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module["wrapPointer"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module["castObject"]=castObject;Module["NULL"]=wrapPointer(0);function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy object. (Did you create it yourself?)";obj["__destroy__"]();delete getCache(obj.__class__)[obj.ptr]}Module["destroy"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module["compare"]=compare;function getPointer(obj){return obj.ptr}Module["getPointer"]=getPointer;function getClass(obj){return obj.__class__}Module["getClass"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:(function(){if(ensureCache.needed){for(var i=0;i=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module["_malloc"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret}),copy:(function(array,view,offset){var offsetShifted=offset;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offsetShifted>>=1;break;case 4:offsetShifted>>=2;break;case 8:offsetShifted>>=3;break}for(var i=0;i>>0,$jscomp.propertyToPolyfillSymbol[h]=$jscomp.IS_SYMBOL_NATIVE? $jscomp.global.Symbol(h):$jscomp.POLYFILL_PREFIX+l+"$"+h),$jscomp.defineProperty(p,$jscomp.propertyToPolyfillSymbol[h],{configurable:!0,writable:!0,value:n})))}; $jscomp.polyfill("Promise",function(k){function n(){this.batch_=null}function l(f){return f instanceof h?f:new h(function(q,v){q(f)})}if(k&&(!($jscomp.FORCE_POLYFILL_PROMISE||$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION&&"undefined"===typeof $jscomp.global.PromiseRejectionEvent)||!$jscomp.global.Promise||-1===$jscomp.global.Promise.toString().indexOf("[native code]")))return k;n.prototype.asyncExecute=function(f){if(null==this.batch_){this.batch_=[];var q=this;this.asyncExecuteFunction(function(){q.executeBatch_()})}this.batch_.push(f)}; var p=$jscomp.global.setTimeout;n.prototype.asyncExecuteFunction=function(f){p(f,0)};n.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var f=this.batch_;this.batch_=[];for(var q=0;q=A}},"es6","es3"); $jscomp.polyfill("Array.prototype.copyWithin",function(k){function n(l){l=Number(l);return Infinity===l||-Infinity===l?l:l|0}return k?k:function(l,p,h){var A=this.length;l=n(l);p=n(p);h=void 0===h?A:n(h);l=0>l?Math.max(A+l,0):Math.min(l,A);p=0>p?Math.max(A+p,0):Math.min(p,A);h=0>h?Math.max(A+h,0):Math.min(h,A);if(lp;)--h in this?this[--l]=this[h]:delete this[--l];return this}},"es6","es3"); $jscomp.typedArrayCopyWithin=function(k){return k?k:Array.prototype.copyWithin};$jscomp.polyfill("Int8Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint8Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint8ClampedArray.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Int16Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5"); $jscomp.polyfill("Uint16Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Int32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Float32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Float64Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5"); var DracoDecoderModule=function(){var k="undefined"!==typeof document&&document.currentScript?document.currentScript.src:void 0;"undefined"!==typeof __filename&&(k=k||__filename);return function(n){function l(e){return a.locateFile?a.locateFile(e,U):U+e}function p(e,b,c){var d=b+c;for(c=b;e[c]&&!(c>=d);)++c;if(16g?d+=String.fromCharCode(g):(g-=65536,d+=String.fromCharCode(55296|g>>10,56320|g&1023))}}else d+=String.fromCharCode(g)}return d}function h(e,b){return e?p(ea,e,b):""}function A(){var e=ja.buffer;a.HEAP8=Y=new Int8Array(e);a.HEAP16=new Int16Array(e);a.HEAP32=ca=new Int32Array(e);a.HEAPU8=ea=new Uint8Array(e);a.HEAPU16=new Uint16Array(e);a.HEAPU32=V=new Uint32Array(e);a.HEAPF32=new Float32Array(e);a.HEAPF64=new Float64Array(e)}function f(e){if(a.onAbort)a.onAbort(e); e="Aborted("+e+")";da(e);wa=!0;e=new WebAssembly.RuntimeError(e+". Build with -sASSERTIONS for more info.");ka(e);throw e;}function q(e){try{if(e==P&&fa)return new Uint8Array(fa);if(ma)return ma(e);throw"both async and sync fetching of the wasm failed";}catch(b){f(b)}}function v(){if(!fa&&(xa||ha)){if("function"==typeof fetch&&!P.startsWith("file://"))return fetch(P,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+P+"'";return e.arrayBuffer()}).catch(function(){return q(P)}); if(na)return new Promise(function(e,b){na(P,function(c){e(new Uint8Array(c))},b)})}return Promise.resolve().then(function(){return q(P)})}function z(e){for(;0>2]=b};this.get_type=function(){return V[this.ptr+4>>2]};this.set_destructor=function(b){V[this.ptr+8>>2]=b};this.get_destructor=function(){return V[this.ptr+8>>2]};this.set_refcount=function(b){ca[this.ptr>>2]=b};this.set_caught=function(b){Y[this.ptr+ 12>>0]=b?1:0};this.get_caught=function(){return 0!=Y[this.ptr+12>>0]};this.set_rethrown=function(b){Y[this.ptr+13>>0]=b?1:0};this.get_rethrown=function(){return 0!=Y[this.ptr+13>>0]};this.init=function(b,c){this.set_adjusted_ptr(0);this.set_type(b);this.set_destructor(c);this.set_refcount(0);this.set_caught(!1);this.set_rethrown(!1)};this.add_ref=function(){ca[this.ptr>>2]+=1};this.release_ref=function(){var b=ca[this.ptr>>2];ca[this.ptr>>2]=b-1;return 1===b};this.set_adjusted_ptr=function(b){V[this.ptr+ 16>>2]=b};this.get_adjusted_ptr=function(){return V[this.ptr+16>>2]};this.get_exception_ptr=function(){if(ya(this.get_type()))return V[this.excPtr>>2];var b=this.get_adjusted_ptr();return 0!==b?b:this.excPtr}}function ba(){function e(){if(!la&&(la=!0,a.calledRun=!0,!wa)){za=!0;z(oa);Aa(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)Ba.unshift(a.postRun.shift());z(Ba)}}if(!(0=d?b++:2047>=d?b+=2:55296<=d&&57343>= d?(b+=4,++c):b+=3}b=Array(b+1);c=0;d=b.length;if(0=u){var X=e.charCodeAt(++g);u=65536+((u&1023)<<10)|X&1023}if(127>=u){if(c>=d)break;b[c++]=u}else{if(2047>=u){if(c+1>=d)break;b[c++]=192|u>>6}else{if(65535>=u){if(c+2>=d)break;b[c++]=224|u>>12}else{if(c+3>=d)break;b[c++]=240|u>>18;b[c++]=128|u>>12&63}b[c++]=128|u>>6&63}b[c++]=128|u&63}}b[c]=0}e=r.alloc(b,Y);r.copy(b,Y,e);return e}return e}function pa(e){if("object"===typeof e){var b= r.alloc(e,Y);r.copy(e,Y,b);return b}return e}function Z(){throw"cannot construct a VoidPtr, no constructor in IDL";}function S(){this.ptr=Da();x(S)[this.ptr]=this}function Q(){this.ptr=Ea();x(Q)[this.ptr]=this}function W(){this.ptr=Fa();x(W)[this.ptr]=this}function w(){this.ptr=Ga();x(w)[this.ptr]=this}function C(){this.ptr=Ha();x(C)[this.ptr]=this}function F(){this.ptr=Ia();x(F)[this.ptr]=this}function G(){this.ptr=Ja();x(G)[this.ptr]=this}function E(){this.ptr=Ka();x(E)[this.ptr]=this}function T(){this.ptr= La();x(T)[this.ptr]=this}function B(){throw"cannot construct a Status, no constructor in IDL";}function H(){this.ptr=Ma();x(H)[this.ptr]=this}function I(){this.ptr=Na();x(I)[this.ptr]=this}function J(){this.ptr=Oa();x(J)[this.ptr]=this}function K(){this.ptr=Pa();x(K)[this.ptr]=this}function L(){this.ptr=Qa();x(L)[this.ptr]=this}function M(){this.ptr=Ra();x(M)[this.ptr]=this}function N(){this.ptr=Sa();x(N)[this.ptr]=this}function y(){this.ptr=Ta();x(y)[this.ptr]=this}function m(){this.ptr=Ua();x(m)[this.ptr]= this}n=void 0===n?{}:n;var a="undefined"!=typeof n?n:{},Aa,ka;a.ready=new Promise(function(e,b){Aa=e;ka=b});var Va=!1,Wa=!1;a.onRuntimeInitialized=function(){Va=!0;if(Wa&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Wa=!0;if(Va&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(e){if("string"!==typeof e)return!1;e=e.split(".");return 2>e.length||3=e[1]?!0:0!=e[0]||10>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,e+100663296);var g=Math;d=Math.max(e,d);g=g.min.call(g,2147483648,d+(65536-d%65536)%65536);a:{d=ja.buffer;try{ja.grow(g-d.byteLength+65535>>>16);A();var u=1;break a}catch(X){}u=void 0}if(u)return!0}return!1},f:function(e){return 52},d:function(e,b,c,d,g){return 70},c:function(e,b,c,d){for(var g=0,u=0;u>2],ab=V[b+4>>2];b+=8;for(var sa=0;sa>2]=g;return 0}};(function(){function e(g,u){a.asm=g.exports;ja=a.asm.h;A();oa.unshift(a.asm.i);aa--;a.monitorRunDependencies&&a.monitorRunDependencies(aa);0==aa&&(null!==ra&&(clearInterval(ra),ra=null),ia&&(g=ia,ia=null,g()))}function b(g){e(g.instance)}function c(g){return v().then(function(u){return WebAssembly.instantiate(u,d)}).then(function(u){return u}).then(g,function(u){da("failed to asynchronously prepare wasm: "+u);f(u)})}var d={a:xd};aa++;a.monitorRunDependencies&&a.monitorRunDependencies(aa); if(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(g){da("Module.instantiateWasm callback failed with error: "+g),ka(g)}(function(){return fa||"function"!=typeof WebAssembly.instantiateStreaming||P.startsWith("data:application/octet-stream;base64,")||P.startsWith("file://")||Ya||"function"!=typeof fetch?c(b):fetch(P,{credentials:"same-origin"}).then(function(g){return WebAssembly.instantiateStreaming(g,d).then(b,function(u){da("wasm streaming compile failed: "+u);da("falling back to ArrayBuffer instantiation"); return c(b)})})})().catch(ka);return{}})();var bb=a._emscripten_bind_VoidPtr___destroy___0=function(){return(bb=a._emscripten_bind_VoidPtr___destroy___0=a.asm.k).apply(null,arguments)},Da=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=function(){return(Da=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=a.asm.l).apply(null,arguments)},cb=a._emscripten_bind_DecoderBuffer_Init_2=function(){return(cb=a._emscripten_bind_DecoderBuffer_Init_2=a.asm.m).apply(null,arguments)},db=a._emscripten_bind_DecoderBuffer___destroy___0= function(){return(db=a._emscripten_bind_DecoderBuffer___destroy___0=a.asm.n).apply(null,arguments)},Ea=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=function(){return(Ea=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=a.asm.o).apply(null,arguments)},eb=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return(eb=a._emscripten_bind_AttributeTransformData_transform_type_0=a.asm.p).apply(null,arguments)},fb=a._emscripten_bind_AttributeTransformData___destroy___0= function(){return(fb=a._emscripten_bind_AttributeTransformData___destroy___0=a.asm.q).apply(null,arguments)},Fa=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return(Fa=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=a.asm.r).apply(null,arguments)},gb=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return(gb=a._emscripten_bind_GeometryAttribute___destroy___0=a.asm.s).apply(null,arguments)},Ga=a._emscripten_bind_PointAttribute_PointAttribute_0=function(){return(Ga= a._emscripten_bind_PointAttribute_PointAttribute_0=a.asm.t).apply(null,arguments)},hb=a._emscripten_bind_PointAttribute_size_0=function(){return(hb=a._emscripten_bind_PointAttribute_size_0=a.asm.u).apply(null,arguments)},ib=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=function(){return(ib=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=a.asm.v).apply(null,arguments)},jb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return(jb=a._emscripten_bind_PointAttribute_attribute_type_0= a.asm.w).apply(null,arguments)},kb=a._emscripten_bind_PointAttribute_data_type_0=function(){return(kb=a._emscripten_bind_PointAttribute_data_type_0=a.asm.x).apply(null,arguments)},lb=a._emscripten_bind_PointAttribute_num_components_0=function(){return(lb=a._emscripten_bind_PointAttribute_num_components_0=a.asm.y).apply(null,arguments)},mb=a._emscripten_bind_PointAttribute_normalized_0=function(){return(mb=a._emscripten_bind_PointAttribute_normalized_0=a.asm.z).apply(null,arguments)},nb=a._emscripten_bind_PointAttribute_byte_stride_0= function(){return(nb=a._emscripten_bind_PointAttribute_byte_stride_0=a.asm.A).apply(null,arguments)},ob=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return(ob=a._emscripten_bind_PointAttribute_byte_offset_0=a.asm.B).apply(null,arguments)},pb=a._emscripten_bind_PointAttribute_unique_id_0=function(){return(pb=a._emscripten_bind_PointAttribute_unique_id_0=a.asm.C).apply(null,arguments)},qb=a._emscripten_bind_PointAttribute___destroy___0=function(){return(qb=a._emscripten_bind_PointAttribute___destroy___0= a.asm.D).apply(null,arguments)},Ha=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=function(){return(Ha=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=a.asm.E).apply(null,arguments)},rb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=function(){return(rb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=a.asm.F).apply(null,arguments)},sb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0= function(){return(sb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=a.asm.G).apply(null,arguments)},tb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return(tb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=a.asm.H).apply(null,arguments)},ub=a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return(ub=a._emscripten_bind_AttributeQuantizationTransform_range_0=a.asm.I).apply(null,arguments)},vb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0= function(){return(vb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=a.asm.J).apply(null,arguments)},Ia=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return(Ia=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=a.asm.K).apply(null,arguments)},wb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=function(){return(wb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=a.asm.L).apply(null, arguments)},xb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return(xb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=a.asm.M).apply(null,arguments)},yb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return(yb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=a.asm.N).apply(null,arguments)},Ja=a._emscripten_bind_PointCloud_PointCloud_0=function(){return(Ja=a._emscripten_bind_PointCloud_PointCloud_0=a.asm.O).apply(null, arguments)},zb=a._emscripten_bind_PointCloud_num_attributes_0=function(){return(zb=a._emscripten_bind_PointCloud_num_attributes_0=a.asm.P).apply(null,arguments)},Ab=a._emscripten_bind_PointCloud_num_points_0=function(){return(Ab=a._emscripten_bind_PointCloud_num_points_0=a.asm.Q).apply(null,arguments)},Bb=a._emscripten_bind_PointCloud___destroy___0=function(){return(Bb=a._emscripten_bind_PointCloud___destroy___0=a.asm.R).apply(null,arguments)},Ka=a._emscripten_bind_Mesh_Mesh_0=function(){return(Ka= a._emscripten_bind_Mesh_Mesh_0=a.asm.S).apply(null,arguments)},Cb=a._emscripten_bind_Mesh_num_faces_0=function(){return(Cb=a._emscripten_bind_Mesh_num_faces_0=a.asm.T).apply(null,arguments)},Db=a._emscripten_bind_Mesh_num_attributes_0=function(){return(Db=a._emscripten_bind_Mesh_num_attributes_0=a.asm.U).apply(null,arguments)},Eb=a._emscripten_bind_Mesh_num_points_0=function(){return(Eb=a._emscripten_bind_Mesh_num_points_0=a.asm.V).apply(null,arguments)},Fb=a._emscripten_bind_Mesh___destroy___0=function(){return(Fb= a._emscripten_bind_Mesh___destroy___0=a.asm.W).apply(null,arguments)},La=a._emscripten_bind_Metadata_Metadata_0=function(){return(La=a._emscripten_bind_Metadata_Metadata_0=a.asm.X).apply(null,arguments)},Gb=a._emscripten_bind_Metadata___destroy___0=function(){return(Gb=a._emscripten_bind_Metadata___destroy___0=a.asm.Y).apply(null,arguments)},Hb=a._emscripten_bind_Status_code_0=function(){return(Hb=a._emscripten_bind_Status_code_0=a.asm.Z).apply(null,arguments)},Ib=a._emscripten_bind_Status_ok_0=function(){return(Ib= a._emscripten_bind_Status_ok_0=a.asm._).apply(null,arguments)},Jb=a._emscripten_bind_Status_error_msg_0=function(){return(Jb=a._emscripten_bind_Status_error_msg_0=a.asm.$).apply(null,arguments)},Kb=a._emscripten_bind_Status___destroy___0=function(){return(Kb=a._emscripten_bind_Status___destroy___0=a.asm.aa).apply(null,arguments)},Ma=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return(Ma=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=a.asm.ba).apply(null,arguments)}, Lb=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return(Lb=a._emscripten_bind_DracoFloat32Array_GetValue_1=a.asm.ca).apply(null,arguments)},Mb=a._emscripten_bind_DracoFloat32Array_size_0=function(){return(Mb=a._emscripten_bind_DracoFloat32Array_size_0=a.asm.da).apply(null,arguments)},Nb=a._emscripten_bind_DracoFloat32Array___destroy___0=function(){return(Nb=a._emscripten_bind_DracoFloat32Array___destroy___0=a.asm.ea).apply(null,arguments)},Na=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0= function(){return(Na=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=a.asm.fa).apply(null,arguments)},Ob=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return(Ob=a._emscripten_bind_DracoInt8Array_GetValue_1=a.asm.ga).apply(null,arguments)},Pb=a._emscripten_bind_DracoInt8Array_size_0=function(){return(Pb=a._emscripten_bind_DracoInt8Array_size_0=a.asm.ha).apply(null,arguments)},Qb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return(Qb=a._emscripten_bind_DracoInt8Array___destroy___0= a.asm.ia).apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return(Oa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=a.asm.ja).apply(null,arguments)},Rb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return(Rb=a._emscripten_bind_DracoUInt8Array_GetValue_1=a.asm.ka).apply(null,arguments)},Sb=a._emscripten_bind_DracoUInt8Array_size_0=function(){return(Sb=a._emscripten_bind_DracoUInt8Array_size_0=a.asm.la).apply(null,arguments)},Tb=a._emscripten_bind_DracoUInt8Array___destroy___0= function(){return(Tb=a._emscripten_bind_DracoUInt8Array___destroy___0=a.asm.ma).apply(null,arguments)},Pa=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return(Pa=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=a.asm.na).apply(null,arguments)},Ub=a._emscripten_bind_DracoInt16Array_GetValue_1=function(){return(Ub=a._emscripten_bind_DracoInt16Array_GetValue_1=a.asm.oa).apply(null,arguments)},Vb=a._emscripten_bind_DracoInt16Array_size_0=function(){return(Vb=a._emscripten_bind_DracoInt16Array_size_0= a.asm.pa).apply(null,arguments)},Wb=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return(Wb=a._emscripten_bind_DracoInt16Array___destroy___0=a.asm.qa).apply(null,arguments)},Qa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return(Qa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=a.asm.ra).apply(null,arguments)},Xb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return(Xb=a._emscripten_bind_DracoUInt16Array_GetValue_1=a.asm.sa).apply(null,arguments)}, Yb=a._emscripten_bind_DracoUInt16Array_size_0=function(){return(Yb=a._emscripten_bind_DracoUInt16Array_size_0=a.asm.ta).apply(null,arguments)},Zb=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return(Zb=a._emscripten_bind_DracoUInt16Array___destroy___0=a.asm.ua).apply(null,arguments)},Ra=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=function(){return(Ra=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=a.asm.va).apply(null,arguments)},$b=a._emscripten_bind_DracoInt32Array_GetValue_1= function(){return($b=a._emscripten_bind_DracoInt32Array_GetValue_1=a.asm.wa).apply(null,arguments)},ac=a._emscripten_bind_DracoInt32Array_size_0=function(){return(ac=a._emscripten_bind_DracoInt32Array_size_0=a.asm.xa).apply(null,arguments)},bc=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return(bc=a._emscripten_bind_DracoInt32Array___destroy___0=a.asm.ya).apply(null,arguments)},Sa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return(Sa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0= a.asm.za).apply(null,arguments)},cc=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return(cc=a._emscripten_bind_DracoUInt32Array_GetValue_1=a.asm.Aa).apply(null,arguments)},dc=a._emscripten_bind_DracoUInt32Array_size_0=function(){return(dc=a._emscripten_bind_DracoUInt32Array_size_0=a.asm.Ba).apply(null,arguments)},ec=a._emscripten_bind_DracoUInt32Array___destroy___0=function(){return(ec=a._emscripten_bind_DracoUInt32Array___destroy___0=a.asm.Ca).apply(null,arguments)},Ta=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0= function(){return(Ta=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=a.asm.Da).apply(null,arguments)},fc=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return(fc=a._emscripten_bind_MetadataQuerier_HasEntry_2=a.asm.Ea).apply(null,arguments)},gc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return(gc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=a.asm.Fa).apply(null,arguments)},hc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=function(){return(hc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3= a.asm.Ga).apply(null,arguments)},ic=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return(ic=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=a.asm.Ha).apply(null,arguments)},jc=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return(jc=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=a.asm.Ia).apply(null,arguments)},kc=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return(kc=a._emscripten_bind_MetadataQuerier_NumEntries_1=a.asm.Ja).apply(null,arguments)}, lc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return(lc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=a.asm.Ka).apply(null,arguments)},mc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return(mc=a._emscripten_bind_MetadataQuerier___destroy___0=a.asm.La).apply(null,arguments)},Ua=a._emscripten_bind_Decoder_Decoder_0=function(){return(Ua=a._emscripten_bind_Decoder_Decoder_0=a.asm.Ma).apply(null,arguments)},nc=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=function(){return(nc= a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=a.asm.Na).apply(null,arguments)},oc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=function(){return(oc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=a.asm.Oa).apply(null,arguments)},pc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return(pc=a._emscripten_bind_Decoder_GetAttributeId_2=a.asm.Pa).apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return(qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2= a.asm.Qa).apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return(rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=a.asm.Ra).apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetAttribute_2=function(){return(sc=a._emscripten_bind_Decoder_GetAttribute_2=a.asm.Sa).apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return(tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=a.asm.Ta).apply(null,arguments)}, uc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return(uc=a._emscripten_bind_Decoder_GetMetadata_1=a.asm.Ua).apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return(vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=a.asm.Va).apply(null,arguments)},wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=function(){return(wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=a.asm.Wa).apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2= function(){return(xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=a.asm.Xa).apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return(yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=a.asm.Ya).apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=function(){return(zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=a.asm.Za).apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return(Ac= a._emscripten_bind_Decoder_GetAttributeFloat_3=a.asm._a).apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return(Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=a.asm.$a).apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return(Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=a.asm.ab).apply(null,arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return(Dc= a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=a.asm.bb).apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return(Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=a.asm.cb).apply(null,arguments)},Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return(Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=a.asm.db).apply(null,arguments)},Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3= function(){return(Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=a.asm.eb).apply(null,arguments)},Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return(Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=a.asm.fb).apply(null,arguments)},Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return(Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=a.asm.gb).apply(null,arguments)},Jc=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5= function(){return(Jc=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=a.asm.hb).apply(null,arguments)},Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return(Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=a.asm.ib).apply(null,arguments)},Lc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=function(){return(Lc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=a.asm.jb).apply(null,arguments)},Mc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2= function(){return(Mc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=a.asm.kb).apply(null,arguments)},Nc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return(Nc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=a.asm.lb).apply(null,arguments)},Oc=a._emscripten_bind_Decoder___destroy___0=function(){return(Oc=a._emscripten_bind_Decoder___destroy___0=a.asm.mb).apply(null,arguments)},Pc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=function(){return(Pc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM= a.asm.nb).apply(null,arguments)},Qc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return(Qc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=a.asm.ob).apply(null,arguments)},Rc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return(Rc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=a.asm.pb).apply(null,arguments)},Sc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM= function(){return(Sc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=a.asm.qb).apply(null,arguments)},Tc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return(Tc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=a.asm.rb).apply(null,arguments)},Uc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return(Uc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=a.asm.sb).apply(null,arguments)},Vc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL= function(){return(Vc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=a.asm.tb).apply(null,arguments)},Wc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=function(){return(Wc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=a.asm.ub).apply(null,arguments)},Xc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return(Xc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=a.asm.vb).apply(null,arguments)},Yc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC= function(){return(Yc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=a.asm.wb).apply(null,arguments)},Zc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return(Zc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=a.asm.xb).apply(null,arguments)},$c=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return($c=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=a.asm.yb).apply(null,arguments)},ad=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH= function(){return(ad=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=a.asm.zb).apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return(bd=a._emscripten_enum_draco_DataType_DT_INVALID=a.asm.Ab).apply(null,arguments)},cd=a._emscripten_enum_draco_DataType_DT_INT8=function(){return(cd=a._emscripten_enum_draco_DataType_DT_INT8=a.asm.Bb).apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_UINT8=function(){return(dd=a._emscripten_enum_draco_DataType_DT_UINT8= a.asm.Cb).apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_INT16=function(){return(ed=a._emscripten_enum_draco_DataType_DT_INT16=a.asm.Db).apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return(fd=a._emscripten_enum_draco_DataType_DT_UINT16=a.asm.Eb).apply(null,arguments)},gd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return(gd=a._emscripten_enum_draco_DataType_DT_INT32=a.asm.Fb).apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_UINT32= function(){return(hd=a._emscripten_enum_draco_DataType_DT_UINT32=a.asm.Gb).apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_INT64=function(){return(id=a._emscripten_enum_draco_DataType_DT_INT64=a.asm.Hb).apply(null,arguments)},jd=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return(jd=a._emscripten_enum_draco_DataType_DT_UINT64=a.asm.Ib).apply(null,arguments)},kd=a._emscripten_enum_draco_DataType_DT_FLOAT32=function(){return(kd=a._emscripten_enum_draco_DataType_DT_FLOAT32=a.asm.Jb).apply(null, arguments)},ld=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return(ld=a._emscripten_enum_draco_DataType_DT_FLOAT64=a.asm.Kb).apply(null,arguments)},md=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return(md=a._emscripten_enum_draco_DataType_DT_BOOL=a.asm.Lb).apply(null,arguments)},nd=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return(nd=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=a.asm.Mb).apply(null,arguments)},od=a._emscripten_enum_draco_StatusCode_OK=function(){return(od= a._emscripten_enum_draco_StatusCode_OK=a.asm.Nb).apply(null,arguments)},pd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return(pd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=a.asm.Ob).apply(null,arguments)},qd=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return(qd=a._emscripten_enum_draco_StatusCode_IO_ERROR=a.asm.Pb).apply(null,arguments)},rd=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=function(){return(rd=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER= a.asm.Qb).apply(null,arguments)},sd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=function(){return(sd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=a.asm.Rb).apply(null,arguments)},td=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return(td=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=a.asm.Sb).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.Tb).apply(null,arguments)};a._free=function(){return(a._free=a.asm.Ub).apply(null,arguments)}; var ya=function(){return(ya=a.asm.Vb).apply(null,arguments)};a.___start_em_js=15856;a.___stop_em_js=15954;var la;ia=function b(){la||ba();la||(ia=b)};if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0=r.size?(0>>=0;switch(c.BYTES_PER_ELEMENT){case 2:d>>>=1;break;case 4:d>>>=2;break;case 8:d>>>=3}for(var g=0;gb.byteLength)return a.INVALID_GEOMETRY_TYPE;switch(b[7]){case 0:return a.POINT_CLOUD;case 1:return a.TRIANGULAR_MESH;default:return a.INVALID_GEOMETRY_TYPE}};return n.ready}}(); "object"===typeof exports&&"object"===typeof module?module.exports=DracoDecoderModule:"function"===typeof define&&define.amd?define([],function(){return DracoDecoderModule}):"object"===typeof exports&&(exports.DracoDecoderModule=DracoDecoderModule); ================================================ FILE: examples/libs/draco/gltf/draco_decoder.js ================================================ var DracoDecoderModule = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( function(DracoDecoderModule = {}) { var Module=typeof DracoDecoderModule!="undefined"?DracoDecoderModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var isRuntimeInitialized=false;var isModuleParsed=false;Module["onRuntimeInitialized"]=function(){isRuntimeInitialized=true;if(isModuleParsed){if(typeof Module["onModuleLoaded"]==="function"){Module["onModuleLoaded"](Module)}}};Module["onModuleParsed"]=function(){isModuleParsed=true;if(isRuntimeInitialized){if(typeof Module["onModuleLoaded"]==="function"){Module["onModuleLoaded"](Module)}}};function isVersionSupported(versionString){if(typeof versionString!=="string")return false;const version=versionString.split(".");if(version.length<2||version.length>3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=5)return true;if(version[0]!=0||version[1]>10)return false;return true}Module["isVersionSupported"]=isVersionSupported;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( // EMSCRIPTEN_START_ASM function instantiate(ia){function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return this[a]};return d}var e;var f=new Uint8Array(123);for(var a=25;a>=0;--a){f[48+a]=52+a;f[65+a]=a;f[97+a]=26+a}f[43]=62;f[47]=63;function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]=="=")-(o[j-1]=="=");for(;a>4;if(i>2;if(i>2];o=F[c+12>>2];g=F[c+16>>2];a:{if((e|0)>=(o|0)&g>>>0>=I[c+8>>2]|(e|0)>(o|0)){break a}o=G[g+F[c>>2]|0];g=g+1|0;e=g?e:e+1|0;F[c+16>>2]=g;F[c+20>>2]=e;b:{switch(o|0){case 0:e=a;f=b;g=d;a=0;d=0;j=Z+-64|0;Z=j;F[j+56>>2]=0;F[j+48>>2]=0;F[j+52>>2]=0;F[j+40>>2]=0;F[j+44>>2]=0;F[j+32>>2]=0;F[j+36>>2]=0;F[j+24>>2]=0;F[j+28>>2]=0;F[j+16>>2]=0;F[j+20>>2]=0;F[j+8>>2]=0;F[j+12>>2]=0;c:{if(!Nd(j+8|0,c)){break c}if(!Md(j+8|0,c)|(F[j+20>>2]?0:e)){break c}hc(c,0,0);if(e){s=f<<2;t=F[j+36>>2];u=F[j+48>>2];x=F[j+24>>2];l=F[j+56>>2];i=F[j+52>>2];while(1){d:{if(l>>>0>16383){break d}while(1){if((i|0)<=0){break d}i=i-1|0;F[j+52>>2]=i;l=G[i+u|0]|l<<8;F[j+56>>2]=l;if(l>>>0<16384){continue}break}}a=l&4095;r=F[(a<<2)+x>>2];b=(r<<3)+t|0;l=(L(F[b>>2],l>>>12|0)+a|0)-F[b+4>>2]|0;F[j+56>>2]=l;if((f|0)>0){a=0;if(!G[c+36|0]|r>>>0>32){break c}o=d+f|0;e:{if(!r){ma(g+(d<<2)|0,0,s);break e}y=r&-2;z=r&1;b=F[c+32>>2];h=F[c+28>>2];q=F[c+24>>2];while(1){k=0;a=b;m=0;n=0;if((r|0)!=1){while(1){p=q+(a>>>3|0)|0;f:{if(p>>>0>=h>>>0){p=0;break f}p=G[p|0];b=a+1|0;F[c+32>>2]=b;p=p>>>(a&7)&1;a=b}p=p<>>3|0)|0;if(v>>>0>>0){m=G[v|0];b=a+1|0;F[c+32>>2]=b;m=m>>>(a&7)&1;a=b}v=k|1;k=k+2|0;m=p|m<>>3|0)|0;if(p>>>0>>0){p=G[p|0];b=a+1|0;F[c+32>>2]=b;a=p>>>(a&7)&1}else{a=0}m=a<>2]=m;d=d+1|0;if((o|0)!=(d|0)){continue}break}}d=o}w=f+w|0;if(e>>>0>w>>>0){continue}break}}D[c+36|0]=0;f=F[c+20>>2];a=0;m=F[c+32>>2]+7|0;a=m>>>0<7?1:a;m=a<<29|m>>>3;b=m+F[c+16>>2]|0;a=(a>>>3|0)+f|0;F[c+16>>2]=b;F[c+20>>2]=b>>>0>>0?a+1|0:a;a=1}b=F[j+36>>2];if(b){F[j+40>>2]=b;ja(b)}b=F[j+24>>2];if(b){F[j+28>>2]=b;ja(b)}b=F[j+8>>2];if(b){F[j+12>>2]=b;ja(b)}Z=j- -64|0;return a;case 1:break b;default:break a}}b=0;e=F[c+20>>2];o=F[c+12>>2];g=F[c+16>>2];g:{if((e|0)>=(o|0)&g>>>0>=I[c+8>>2]|(e|0)>(o|0)){break g}o=G[g+F[c>>2]|0];g=g+1|0;e=g?e:e+1|0;F[c+16>>2]=g;F[c+20>>2]=e;h:{switch(o-1|0){case 8:o=a;r=d;e=Z+-64|0;Z=e;F[e+56>>2]=0;F[e+48>>2]=0;F[e+52>>2]=0;F[e+40>>2]=0;F[e+44>>2]=0;F[e+32>>2]=0;F[e+36>>2]=0;F[e+24>>2]=0;F[e+28>>2]=0;F[e+16>>2]=0;F[e+20>>2]=0;F[e+8>>2]=0;F[e+12>>2]=0;h=e+8|0;i:{j:{if(!H[c+38>>1]){break j}if(!Ta(1,h+12|0,c)){break j}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0>>0)|0)|0;if(f>>>0>>6>>>0&(b|0)<=0|(b|0)<0){break j}b=F[h>>2];a=F[h+4>>2]-b>>2;k:{if(a>>>0>>0){qa(h,i-a|0);i=F[h+12>>2];break k}if(a>>>0<=i>>>0){break k}F[h+4>>2]=b+(i<<2)}g=1;if(!i){break i}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){g=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break i}g=F[c>>2];p=G[g+f|0];a=d;f=f+1|0;a=f?a:a+1|0;F[c+16>>2]=f;d=a;F[c+20>>2]=a;a=p>>>2|0;l=0;l:{m:{n:{o:{t=p&3;switch(t|0){case 0:break m;case 3:break o;default:break n}}a=a+b|0;g=0;if(a>>>0>=i>>>0){break i}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break l}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break j}i=G[f+g|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;a=i<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;p:{if(b>>>0<=32767){qa(a,8192-(b>>>2|0)|0);break p}if((b|0)==32768){break p}F[h+20>>2]=d+32768}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;q:{if(f>>>0>>0){_a(d,i-f|0);b=F[d>>2];break q}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break j}}j=F[a>>2];f=0;d=0;while(1){g=n+(f<<2)|0;l=F[g>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;g=F[g>>2];d=g+a|0;if(d>>>0>8192){break j}r:{if(a>>>0>=d>>>0){break r}l=0;h=g&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(g-1>>>0<=6){break r}while(1){g=j+(a<<2)|0;F[g>>2]=f;F[g+28>>2]=f;F[g+24>>2]=f;F[g+20>>2]=f;F[g+16>>2]=f;F[g+12>>2]=f;F[g+8>>2]=f;F[g+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==8192}g=k}s:{if(!g|(F[e+20>>2]?0:o)){break s}d=0;k=Z-16|0;Z=k;t:{if(!Sa(1,k+8|0,c)){break t}a=F[c+8>>2];f=F[c+16>>2];g=a-f|0;j=F[k+12>>2];i=F[c+20>>2];a=F[c+12>>2]-(i+(a>>>0>>0)|0)|0;b=F[k+8>>2];if((j|0)==(a|0)&g>>>0>>0|a>>>0>>0){break t}a=i+j|0;g=b+f|0;a=g>>>0>>0?a+1|0:a;F[c+16>>2]=g;F[c+20>>2]=a;if((b|0)<=0){break t}a=f+F[c>>2]|0;F[e+48>>2]=a;c=b-1|0;f=c+a|0;g=G[f|0];u:{if(g>>>0<=63){F[e+52>>2]=c;a=G[f|0]&63;break u}v:{switch((g>>>6|0)-1|0){case 0:if(b>>>0<2){break t}b=b-2|0;F[e+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break u;case 1:if(b>>>0<3){break t}b=b-3|0;F[e+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break u;default:break v}}b=b-4|0;F[e+52>>2]=b;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[e+56>>2]=a+32768;d=a>>>0<8355840}Z=k+16|0;if(!d){break s}if(!o){m=1;break s}b=F[e+52>>2];a=F[e+56>>2];c=F[e+36>>2];d=F[e+48>>2];f=F[e+24>>2];while(1){w:{if(a>>>0>32767){break w}while(1){if((b|0)<=0){break w}b=b-1|0;F[e+52>>2]=b;a=G[b+d|0]|a<<8;F[e+56>>2]=a;if(a>>>0<32768){continue}break}}m=a&8191;k=F[f+(m<<2)>>2];g=c+(k<<3)|0;a=(L(F[g>>2],a>>>13|0)+m|0)-F[g+4>>2]|0;F[e+56>>2]=a;F[r+(q<<2)>>2]=k;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[e+36>>2];if(a){F[e+40>>2]=a;ja(a)}a=F[e+24>>2];if(a){F[e+28>>2]=a;ja(a)}a=F[e+8>>2];if(a){F[e+12>>2]=a;ja(a)}Z=e- -64|0;b=m;break g;case 9:o=a;r=d;g=Z+-64|0;Z=g;F[g+56>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;h=g+8|0;x:{y:{if(!H[c+38>>1]){break y}if(!Ta(1,h+12|0,c)){break y}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0>>0)|0)|0;if(f>>>0>>6>>>0&(b|0)<=0|(b|0)<0){break y}b=F[h>>2];a=F[h+4>>2]-b>>2;z:{if(a>>>0>>0){qa(h,i-a|0);i=F[h+12>>2];break z}if(a>>>0<=i>>>0){break z}F[h+4>>2]=b+(i<<2)}e=1;if(!i){break x}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){e=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break x}t=F[c>>2];p=G[t+f|0];e=d;f=f+1|0;e=f?e:e+1|0;F[c+16>>2]=f;d=e;F[c+20>>2]=e;a=p>>>2|0;l=0;A:{B:{C:{D:{e=p&3;switch(e|0){case 0:break B;case 3:break D;default:break C}}a=a+b|0;e=0;if(a>>>0>=i>>>0){break x}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break A}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break y}i=G[f+t|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;a=i<<(l<<3|6)|a;l=l+1|0;if((e|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;E:{if(b>>>0<=131071){qa(a,32768-(b>>>2|0)|0);break E}if((b|0)==131072){break E}F[h+20>>2]=d+131072}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;F:{if(f>>>0>>0){_a(d,i-f|0);b=F[d>>2];break F}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break y}}j=F[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;l=F[e>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;e=F[e>>2];d=e+a|0;if(d>>>0>32768){break y}G:{if(a>>>0>=d>>>0){break G}l=0;h=e&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break G}while(1){e=j+(a<<2)|0;F[e>>2]=f;F[e+28>>2]=f;F[e+24>>2]=f;F[e+20>>2]=f;F[e+16>>2]=f;F[e+12>>2]=f;F[e+8>>2]=f;F[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==32768}e=k}H:{if(!e|(F[g+20>>2]?0:o)){break H}d=0;f=Z-16|0;Z=f;I:{if(!Sa(1,f+8|0,c)){break I}e=F[c+8>>2];b=F[c+16>>2];k=e-b|0;j=F[f+12>>2];i=F[c+20>>2];e=F[c+12>>2]-(i+(b>>>0>e>>>0)|0)|0;a=F[f+8>>2];if((j|0)==(e|0)&k>>>0>>0|e>>>0>>0){break I}e=i+j|0;k=a+b|0;e=k>>>0>>0?e+1|0:e;F[c+16>>2]=k;F[c+20>>2]=e;if((a|0)<=0){break I}b=b+F[c>>2]|0;F[g+48>>2]=b;c=a-1|0;e=c+b|0;k=G[e|0];J:{if(k>>>0<=63){F[g+52>>2]=c;a=G[e|0]&63;break J}K:{switch((k>>>6|0)-1|0){case 0:if(a>>>0<2){break I}a=a-2|0;F[g+52>>2]=a;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break J;case 1:if(a>>>0<3){break I}a=a-3|0;F[g+52>>2]=a;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break J;default:break K}}a=a-4|0;F[g+52>>2]=a;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[g+56>>2]=a+131072;d=a>>>0<33423360}Z=f+16|0;if(!d){break H}if(!o){m=1;break H}b=F[g+52>>2];a=F[g+56>>2];c=F[g+36>>2];d=F[g+48>>2];f=F[g+24>>2];while(1){L:{if(a>>>0>131071){break L}while(1){if((b|0)<=0){break L}b=b-1|0;F[g+52>>2]=b;a=G[b+d|0]|a<<8;F[g+56>>2]=a;if(a>>>0<131072){continue}break}}m=a&32767;e=F[f+(m<<2)>>2];k=c+(e<<3)|0;a=(L(F[k>>2],a>>>15|0)+m|0)-F[k+4>>2]|0;F[g+56>>2]=a;F[r+(q<<2)>>2]=e;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[g+36>>2];if(a){F[g+40>>2]=a;ja(a)}a=F[g+24>>2];if(a){F[g+28>>2]=a;ja(a)}a=F[g+8>>2];if(a){F[g+12>>2]=a;ja(a)}Z=g- -64|0;b=m;break g;case 10:o=a;r=d;g=Z+-64|0;Z=g;F[g+56>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;h=g+8|0;M:{N:{if(!H[c+38>>1]){break N}if(!Ta(1,h+12|0,c)){break N}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0>>0)|0)|0;if(f>>>0>>6>>>0&(b|0)<=0|(b|0)<0){break N}b=F[h>>2];a=F[h+4>>2]-b>>2;O:{if(a>>>0>>0){qa(h,i-a|0);i=F[h+12>>2];break O}if(a>>>0<=i>>>0){break O}F[h+4>>2]=b+(i<<2)}e=1;if(!i){break M}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){e=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break M}t=F[c>>2];p=G[t+f|0];a=d;f=f+1|0;a=f?a:a+1|0;F[c+16>>2]=f;d=a;F[c+20>>2]=a;a=p>>>2|0;l=0;P:{Q:{R:{S:{u=p&3;switch(u|0){case 0:break Q;case 3:break S;default:break R}}a=a+b|0;e=0;if(a>>>0>=i>>>0){break M}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break P}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break N}i=G[f+t|0];e=d;f=f+1|0;e=f?e:e+1|0;F[c+16>>2]=f;d=e;F[c+20>>2]=e;a=i<<(l<<3|6)|a;l=l+1|0;if((u|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;T:{if(b>>>0<=262143){qa(a,65536-(b>>>2|0)|0);break T}if((b|0)==262144){break T}F[h+20>>2]=d+262144}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;U:{if(f>>>0>>0){_a(d,i-f|0);b=F[d>>2];break U}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break N}}j=F[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;l=F[e>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;e=F[e>>2];d=e+a|0;if(d>>>0>65536){break N}V:{if(a>>>0>=d>>>0){break V}l=0;h=e&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break V}while(1){e=j+(a<<2)|0;F[e>>2]=f;F[e+28>>2]=f;F[e+24>>2]=f;F[e+20>>2]=f;F[e+16>>2]=f;F[e+12>>2]=f;F[e+8>>2]=f;F[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==65536}e=k}W:{if(!e|(F[g+20>>2]?0:o)){break W}d=0;e=Z-16|0;Z=e;X:{if(!Sa(1,e+8|0,c)){break X}a=F[c+8>>2];f=F[c+16>>2];k=a-f|0;j=F[e+12>>2];i=F[c+20>>2];a=F[c+12>>2]-(i+(a>>>0>>0)|0)|0;b=F[e+8>>2];if((j|0)==(a|0)&k>>>0>>0|a>>>0>>0){break X}a=i+j|0;k=b+f|0;a=k>>>0>>0?a+1|0:a;F[c+16>>2]=k;F[c+20>>2]=a;if((b|0)<=0){break X}a=f+F[c>>2]|0;F[g+48>>2]=a;c=b-1|0;f=c+a|0;k=G[f|0];Y:{if(k>>>0<=63){F[g+52>>2]=c;a=G[f|0]&63;break Y}Z:{switch((k>>>6|0)-1|0){case 0:if(b>>>0<2){break X}b=b-2|0;F[g+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break Y;case 1:if(b>>>0<3){break X}b=b-3|0;F[g+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break Y;default:break Z}}b=b-4|0;F[g+52>>2]=b;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[g+56>>2]=a+262144;d=a>>>0<66846720}Z=e+16|0;if(!d){break W}if(!o){m=1;break W}b=F[g+52>>2];a=F[g+56>>2];c=F[g+36>>2];d=F[g+48>>2];f=F[g+24>>2];while(1){_:{if(a>>>0>262143){break _}while(1){if((b|0)<=0){break _}b=b-1|0;F[g+52>>2]=b;a=G[b+d|0]|a<<8;F[g+56>>2]=a;if(a>>>0<262144){continue}break}}m=a&65535;e=F[f+(m<<2)>>2];k=c+(e<<3)|0;a=(L(F[k>>2],a>>>16|0)+m|0)-F[k+4>>2]|0;F[g+56>>2]=a;F[r+(q<<2)>>2]=e;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[g+36>>2];if(a){F[g+40>>2]=a;ja(a)}a=F[g+24>>2];if(a){F[g+28>>2]=a;ja(a)}a=F[g+8>>2];if(a){F[g+12>>2]=a;ja(a)}Z=g- -64|0;b=m;break g;case 11:o=a;r=d;g=Z+-64|0;Z=g;F[g+56>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;h=g+8|0;$:{aa:{if(!H[c+38>>1]){break aa}if(!Ta(1,h+12|0,c)){break aa}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0>>0)|0)|0;if(f>>>0>>6>>>0&(b|0)<=0|(b|0)<0){break aa}b=F[h>>2];a=F[h+4>>2]-b>>2;ba:{if(a>>>0>>0){qa(h,i-a|0);i=F[h+12>>2];break ba}if(a>>>0<=i>>>0){break ba}F[h+4>>2]=b+(i<<2)}e=1;if(!i){break $}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){e=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break $}t=F[c>>2];p=G[t+f|0];e=d;f=f+1|0;e=f?e:e+1|0;F[c+16>>2]=f;d=e;F[c+20>>2]=e;a=p>>>2|0;l=0;ca:{da:{ea:{fa:{e=p&3;switch(e|0){case 0:break da;case 3:break fa;default:break ea}}a=a+b|0;e=0;if(a>>>0>=i>>>0){break $}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break ca}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break aa}i=G[f+t|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;a=i<<(l<<3|6)|a;l=l+1|0;if((e|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;ga:{if(b>>>0<=1048575){qa(a,262144-(b>>>2|0)|0);break ga}if((b|0)==1048576){break ga}F[h+20>>2]=d- -1048576}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;ha:{if(f>>>0>>0){_a(d,i-f|0);b=F[d>>2];break ha}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break aa}}j=F[a>>2];f=0;d=0;while(1){e=n+(f<<2)|0;l=F[e>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;e=F[e>>2];d=e+a|0;if(d>>>0>262144){break aa}ia:{if(a>>>0>=d>>>0){break ia}l=0;h=e&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(e-1>>>0<=6){break ia}while(1){e=j+(a<<2)|0;F[e>>2]=f;F[e+28>>2]=f;F[e+24>>2]=f;F[e+20>>2]=f;F[e+16>>2]=f;F[e+12>>2]=f;F[e+8>>2]=f;F[e+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==262144}e=k}ja:{if(!e|(F[g+20>>2]?0:o)){break ja}d=0;f=Z-16|0;Z=f;ka:{if(!Sa(1,f+8|0,c)){break ka}e=F[c+8>>2];b=F[c+16>>2];k=e-b|0;j=F[f+12>>2];i=F[c+20>>2];e=F[c+12>>2]-(i+(b>>>0>e>>>0)|0)|0;a=F[f+8>>2];if((j|0)==(e|0)&k>>>0>>0|e>>>0>>0){break ka}e=i+j|0;k=a+b|0;e=k>>>0>>0?e+1|0:e;F[c+16>>2]=k;F[c+20>>2]=e;if((a|0)<=0){break ka}b=b+F[c>>2]|0;F[g+48>>2]=b;c=a-1|0;e=c+b|0;k=G[e|0];la:{if(k>>>0<=63){F[g+52>>2]=c;a=G[e|0]&63;break la}ma:{switch((k>>>6|0)-1|0){case 0:if(a>>>0<2){break ka}a=a-2|0;F[g+52>>2]=a;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break la;case 1:if(a>>>0<3){break ka}a=a-3|0;F[g+52>>2]=a;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break la;default:break ma}}a=a-4|0;F[g+52>>2]=a;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[g+56>>2]=a- -1048576;d=a>>>0<267386880}Z=f+16|0;if(!d){break ja}if(!o){m=1;break ja}b=F[g+52>>2];a=F[g+56>>2];c=F[g+36>>2];d=F[g+48>>2];f=F[g+24>>2];while(1){na:{if(a>>>0>1048575){break na}while(1){if((b|0)<=0){break na}b=b-1|0;F[g+52>>2]=b;a=G[b+d|0]|a<<8;F[g+56>>2]=a;if(a>>>0<1048576){continue}break}}m=a&262143;e=F[f+(m<<2)>>2];k=c+(e<<3)|0;a=(L(F[k>>2],a>>>18|0)+m|0)-F[k+4>>2]|0;F[g+56>>2]=a;F[r+(q<<2)>>2]=e;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[g+36>>2];if(a){F[g+40>>2]=a;ja(a)}a=F[g+24>>2];if(a){F[g+28>>2]=a;ja(a)}a=F[g+8>>2];if(a){F[g+12>>2]=a;ja(a)}Z=g- -64|0;b=m;break g;case 12:o=a;r=d;e=Z+-64|0;Z=e;F[e+56>>2]=0;F[e+48>>2]=0;F[e+52>>2]=0;F[e+40>>2]=0;F[e+44>>2]=0;F[e+32>>2]=0;F[e+36>>2]=0;F[e+24>>2]=0;F[e+28>>2]=0;F[e+16>>2]=0;F[e+20>>2]=0;F[e+8>>2]=0;F[e+12>>2]=0;h=e+8|0;oa:{pa:{if(!H[c+38>>1]){break pa}if(!Ta(1,h+12|0,c)){break pa}b=F[c+8>>2];d=F[c+16>>2];f=b-d|0;i=F[h+12>>2];b=F[c+12>>2]-(F[c+20>>2]+(b>>>0>>0)|0)|0;if(f>>>0>>6>>>0&(b|0)<=0|(b|0)<0){break pa}b=F[h>>2];a=F[h+4>>2]-b>>2;qa:{if(a>>>0>>0){qa(h,i-a|0);i=F[h+12>>2];break qa}if(a>>>0<=i>>>0){break qa}F[h+4>>2]=b+(i<<2)}g=1;if(!i){break oa}f=F[c+16>>2];d=F[c+20>>2];s=F[h>>2];j=F[c+8>>2];n=F[c+12>>2];b=0;while(1){g=0;if((d|0)>=(n|0)&f>>>0>=j>>>0|(d|0)>(n|0)){break oa}g=F[c>>2];p=G[g+f|0];a=d;f=f+1|0;a=f?a:a+1|0;F[c+16>>2]=f;d=a;F[c+20>>2]=a;a=p>>>2|0;l=0;ra:{sa:{ta:{ua:{t=p&3;switch(t|0){case 0:break sa;case 3:break ua;default:break ta}}a=a+b|0;g=0;if(a>>>0>=i>>>0){break oa}ma(s+(b<<2)|0,0,(p&252)+4|0);b=a;break ra}while(1){if((f|0)==(j|0)&(d|0)==(n|0)){break pa}i=G[f+g|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;a=i<<(l<<3|6)|a;l=l+1|0;if((t|0)!=(l|0)){continue}break}}F[s+(b<<2)>>2]=a}b=b+1|0;i=F[h+12>>2];if(b>>>0>>0){continue}break}a=h+16|0;n=F[h>>2];d=F[h+16>>2];b=F[h+20>>2]-d|0;va:{if(b>>>0<=2097151){qa(a,524288-(b>>>2|0)|0);break va}if((b|0)==2097152){break va}F[h+20>>2]=d+2097152}d=h+28|0;b=F[d>>2];f=F[h+32>>2]-b>>3;wa:{if(f>>>0>>0){_a(d,i-f|0);b=F[d>>2];break wa}if(f>>>0>i>>>0){F[h+32>>2]=(i<<3)+b}if(!i){break pa}}j=F[a>>2];f=0;d=0;while(1){g=n+(f<<2)|0;l=F[g>>2];h=(f<<3)+b|0;a=d;F[h+4>>2]=a;F[h>>2]=l;g=F[g>>2];d=g+a|0;if(d>>>0>524288){break pa}xa:{if(a>>>0>=d>>>0){break xa}l=0;h=g&7;if(h){while(1){F[j+(a<<2)>>2]=f;a=a+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(g-1>>>0<=6){break xa}while(1){g=j+(a<<2)|0;F[g>>2]=f;F[g+28>>2]=f;F[g+24>>2]=f;F[g+20>>2]=f;F[g+16>>2]=f;F[g+12>>2]=f;F[g+8>>2]=f;F[g+4>>2]=f;a=a+8|0;if((d|0)!=(a|0)){continue}break}}f=f+1|0;if((i|0)!=(f|0)){continue}break}k=(d|0)==524288}g=k}ya:{if(!g|(F[e+20>>2]?0:o)){break ya}d=0;k=Z-16|0;Z=k;za:{if(!Sa(1,k+8|0,c)){break za}a=F[c+8>>2];f=F[c+16>>2];g=a-f|0;j=F[k+12>>2];i=F[c+20>>2];a=F[c+12>>2]-(i+(a>>>0>>0)|0)|0;b=F[k+8>>2];if((j|0)==(a|0)&g>>>0>>0|a>>>0>>0){break za}a=i+j|0;g=b+f|0;a=g>>>0>>0?a+1|0:a;F[c+16>>2]=g;F[c+20>>2]=a;if((b|0)<=0){break za}a=f+F[c>>2]|0;F[e+48>>2]=a;c=b-1|0;f=c+a|0;g=G[f|0];Aa:{if(g>>>0<=63){F[e+52>>2]=c;a=G[f|0]&63;break Aa}Ba:{switch((g>>>6|0)-1|0){case 0:if(b>>>0<2){break za}b=b-2|0;F[e+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8&16128|G[a|0];break Aa;case 1:if(b>>>0<3){break za}b=b-3|0;F[e+52>>2]=b;a=a+b|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];break Aa;default:break Ba}}b=b-4|0;F[e+52>>2]=b;a=a+b|0;a=(G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24))&1073741823}F[e+56>>2]=a+2097152;d=a>>>0<534773760}Z=k+16|0;if(!d){break ya}if(!o){m=1;break ya}b=F[e+52>>2];a=F[e+56>>2];c=F[e+36>>2];d=F[e+48>>2];f=F[e+24>>2];while(1){Ca:{if(a>>>0>2097151){break Ca}while(1){if((b|0)<=0){break Ca}b=b-1|0;F[e+52>>2]=b;a=G[b+d|0]|a<<8;F[e+56>>2]=a;if(a>>>0<2097152){continue}break}}m=a&524287;k=F[f+(m<<2)>>2];g=c+(k<<3)|0;a=(L(F[g>>2],a>>>19|0)+m|0)-F[g+4>>2]|0;F[e+56>>2]=a;F[r+(q<<2)>>2]=k;m=1;q=q+1|0;if((o|0)!=(q|0)){continue}break}}a=F[e+36>>2];if(a){F[e+40>>2]=a;ja(a)}a=F[e+24>>2];if(a){F[e+28>>2]=a;ja(a)}a=F[e+8>>2];if(a){F[e+12>>2]=a;ja(a)}Z=e- -64|0;b=m;break g;case 17:b=Ld(a,c,d);break g;case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:b=Z+-64|0;Z=b;F[b+56>>2]=0;F[b+48>>2]=0;F[b+52>>2]=0;F[b+40>>2]=0;F[b+44>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;F[b+24>>2]=0;F[b+28>>2]=0;F[b+16>>2]=0;F[b+20>>2]=0;F[b+8>>2]=0;F[b+12>>2]=0;Da:{if(!Nd(b+8|0,c)|(F[b+20>>2]?0:a)){break Da}if(!Md(b+8|0,c)){break Da}if(!a){f=1;break Da}m=F[b+52>>2];c=F[b+56>>2];e=F[b+36>>2];g=F[b+48>>2];o=F[b+24>>2];while(1){Ea:{if(c>>>0>16383){break Ea}while(1){if((m|0)<=0){break Ea}m=m-1|0;F[b+52>>2]=m;c=G[g+m|0]|c<<8;F[b+56>>2]=c;if(c>>>0<16384){continue}break}}f=c&4095;j=F[o+(f<<2)>>2];r=e+(j<<3)|0;c=(L(F[r>>2],c>>>12|0)+f|0)-F[r+4>>2]|0;F[b+56>>2]=c;F[(k<<2)+d>>2]=j;f=1;k=k+1|0;if((k|0)!=(a|0)){continue}break}}a=F[b+36>>2];if(a){F[b+40>>2]=a;ja(a)}a=F[b+24>>2];if(a){F[b+28>>2]=a;ja(a)}a=F[b+8>>2];if(a){F[b+12>>2]=a;ja(a)}Z=b- -64|0;b=f;break g;case 13:case 14:case 15:case 16:break h;default:break g}}b=Ld(a,c,d)}f=b}return f}function ih(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,J=0,K=0,M=0,N=0,O=0,P=0;u=Z+-64|0;Z=u;F[a+132>>2]=0;if(F[a+148>>2]){b=F[a+144>>2];if(b){while(1){f=F[b>>2];ja(b);b=f;if(b){continue}break}}b=0;F[a+144>>2]=0;f=F[a+140>>2];a:{if(!f){break a}if(f>>>0>=4){c=f&-4;while(1){e=b<<2;F[e+F[a+136>>2]>>2]=0;F[F[a+136>>2]+(e|4)>>2]=0;F[F[a+136>>2]+(e|8)>>2]=0;F[F[a+136>>2]+(e|12)>>2]=0;b=b+4|0;d=d+4|0;if((c|0)!=(d|0)){continue}break}}f=f&3;if(!f){break a}d=0;while(1){F[F[a+136>>2]+(b<<2)>>2]=0;b=b+1|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}}F[a+148>>2]=0}b:{c:{if(!Da(1,u+60|0,F[F[a+4>>2]+32>>2])){break c}F[a+156>>2]=F[u+60>>2];if(!Da(1,u+56|0,F[F[a+4>>2]+32>>2])){break c}e=F[u+56>>2];if(e>>>0>1431655765|I[a+156>>2]>L(e,3)>>>0){break c}b=F[F[a+4>>2]+32>>2];c=F[b+8>>2];k=F[b+12>>2];d=F[b+20>>2];f=F[b+16>>2];if((k|0)<=(d|0)&f>>>0>=c>>>0|(d|0)>(k|0)){break c}k=G[f+F[b>>2]|0];f=f+1|0;d=f?d:d+1|0;F[b+16>>2]=f;F[b+20>>2]=d;if(!Da(1,u+52|0,b)){break c}q=F[u+52>>2];if(q>>>0>e>>>0|e>>>0>q+((q>>>0)/3|0)>>>0){break c}if(!Da(1,u+48|0,F[F[a+4>>2]+32>>2])){break c}d=F[u+48>>2];if(d>>>0>q>>>0){break c}F[a+28>>2]=F[a+24>>2];f=Zb(ka(88));b=F[a+8>>2];F[a+8>>2]=f;if(b){Za(b);if(!F[a+8>>2]){break c}}F[a+164>>2]=F[a+160>>2];Ib(a+160|0,e);F[a+176>>2]=F[a+172>>2];Ib(a+172|0,e);F[a- -64>>2]=0;F[a+92>>2]=-1;F[a+84>>2]=-1;F[a+88>>2]=-1;F[a+40>>2]=F[a+36>>2];F[a+52>>2]=F[a+48>>2];F[a+76>>2]=F[a+72>>2];A=a+216|0;Dd(A);Cd(A,k);if(!_c(F[a+8>>2],e,d+F[a+156>>2]|0)){break c}b=F[a+156>>2];D[u+8|0]=1;Ea(a+120|0,b+d|0,u+8|0);if((Bd(a,F[F[a+4>>2]+32>>2])|0)==-1){break c}c=a+232|0;b=c;F[b+144>>2]=a;f=F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2];f=F[f>>2]+F[f+16>>2]|0;e=F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2];e=F[e+8>>2]-F[e+16>>2]|0;O=b,P=H[F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2]+38>>1],E[O+38>>1]=P;F[b>>2]=f;F[b+16>>2]=0;F[b+20>>2]=0;F[b+8>>2]=e;F[b+12>>2]=0;O=b,P=$[F[F[a>>2]+36>>2]](a)|0,F[O+148>>2]=P;F[a+372>>2]=k;F[a+384>>2]=d+F[a+156>>2];K=Ja(u+8|0);k=K;f=0;j=Z-16|0;Z=j;d:{if(!Aa(b+80|0,b)){break d}if(!yd(c)){break d}b=F[c+4>>2];F[k>>2]=F[c>>2];F[k+4>>2]=b;b=F[c+36>>2];F[k+32>>2]=F[c+32>>2];F[k+36>>2]=b;b=F[c+28>>2];F[k+24>>2]=F[c+24>>2];F[k+28>>2]=b;b=F[c+20>>2];F[k+16>>2]=F[c+16>>2];F[k+20>>2]=b;b=F[c+12>>2];F[k+8>>2]=F[c+8>>2];F[k+12>>2]=b;F[c+176>>2]=2;F[c+180>>2]=7;b=F[c+152>>2];if((b|0)<0){break d}F[j+12>>2]=0;f=2;h=F[c+156>>2];e=F[c+160>>2]-h>>2;e:{if(e>>>0>>0){Fa(c+156|0,b-e|0,j+12|0);f=F[c+176>>2];d=F[c+180>>2];break e}d=7;if(b>>>0>=e>>>0){break e}F[c+160>>2]=h+(b<<2)}e=c+184|0;d=(d-f|0)+1|0;b=F[c+188>>2];f=F[c+184>>2];s=(b-f|0)/12|0;f:{if(d>>>0>s>>>0){h=0;b=d-s|0;o=F[e+8>>2];f=F[e+4>>2];g:{if(b>>>0<=(o-f|0)/12>>>0){if(b){b=L(b,12)-12|0;b=(b-((b>>>0)%12|0)|0)+12|0;f=ma(f,0,b)+b|0}F[e+4>>2]=f;break g}h:{i:{j:{s=F[e>>2];g=(f-s|0)/12|0;d=g+b|0;if(d>>>0<357913942){o=(o-s|0)/12|0;i=o<<1;o=o>>>0>=178956970?357913941:d>>>0>>0?i:d;if(o){if(o>>>0>=357913942){break j}h=ka(L(o,12))}d=L(g,12)+h|0;b=L(b,12)-12|0;g=(b-((b>>>0)%12|0)|0)+12|0;b=ma(d,0,g);g=b+g|0;h=L(o,12)+h|0;if((f|0)==(s|0)){break i}while(1){d=d-12|0;f=f-12|0;F[d>>2]=F[f>>2];F[d+4>>2]=F[f+4>>2];F[d+8>>2]=F[f+8>>2];F[f+8>>2]=0;F[f>>2]=0;F[f+4>>2]=0;if((f|0)!=(s|0)){continue}break}F[e+8>>2]=h;b=F[e+4>>2];F[e+4>>2]=g;f=F[e>>2];F[e>>2]=d;if((b|0)==(f|0)){break h}while(1){d=b-12|0;h=F[d>>2];if(h){F[b-8>>2]=h;ja(h)}b=d;if((f|0)!=(b|0)){continue}break}break h}break b}oa();v()}F[e+8>>2]=h;F[e+4>>2]=g;F[e>>2]=b}if(f){ja(f)}}d=F[c+188>>2];break f}if(d>>>0>=s>>>0){d=b;break f}d=f+L(d,12)|0;if((d|0)!=(b|0)){while(1){f=b-12|0;h=F[f>>2];if(h){F[b-8>>2]=h;ja(h)}b=f;if((d|0)!=(b|0)){continue}break}}F[c+188>>2]=d}s=c+196|0;f=F[c+184>>2];b=(d-f|0)/12|0;o=F[c+196>>2];h=F[c+200>>2]-o>>2;k:{if(b>>>0>h>>>0){qa(s,b-h|0);f=F[c+184>>2];d=F[c+188>>2];break k}if(b>>>0>=h>>>0){break k}F[c+200>>2]=o+(b<<2)}if((d|0)==(f|0)){f=1;break d}b=0;while(1){l:{if(!Da(1,j+8|0,k)){break l}f=F[j+8>>2];d=F[c+148>>2];if(f>>>0>(F[d+4>>2]-F[d>>2]>>2>>>0)/3>>>0){break l}if(f){g=L(b,12);h=g+F[e>>2]|0;d=F[h>>2];o=F[h+4>>2]-d>>2;m:{if(o>>>0>>0){qa(h,f-o|0);d=F[g+F[e>>2]>>2];break m}if(f>>>0>=o>>>0){break m}F[h+4>>2]=(f<<2)+d}mc(f,1,k,d);F[F[s>>2]+(b<<2)>>2]=f}f=1;b=b+1|0;if(b>>>0<(F[c+188>>2]-F[c+184>>2]|0)/12>>>0){continue}break d}break}f=0}Z=j+16|0;n:{if(!f){break n}e=0;c=0;d=0;b=0;k=0;f=0;s=0;o=0;l=Z-96|0;Z=l;F[l+72>>2]=0;F[l+64>>2]=0;F[l+68>>2]=0;F[l+48>>2]=0;F[l+52>>2]=0;F[l+40>>2]=0;F[l+44>>2]=0;F[l+56>>2]=1065353216;F[l+32>>2]=0;F[l+24>>2]=0;F[l+28>>2]=0;j=a;C=F[a+124>>2];o:{p:{q:{r:{s:{if((q|0)<=0){break s}J=j+232|0;M=F[j+216>>2]!=F[j+220>>2];B=1;t:{while(1){h=s;s=h+1|0;u:{v:{w:{g=F[j+404>>2];if((g|0)==-1){F[j+400>>2]=7;break w}a=-1;i=F[j+428>>2]+(g<<2)|0;m=F[i>>2];g=m-1|0;F[i>>2]=g;if((m|0)<=0){break r}g=F[F[F[j+416>>2]+L(F[j+404>>2],12)>>2]+(g<<2)>>2];if(g>>>0>4){break r}i=F[(g<<2)+8896>>2];F[j+400>>2]=i;if(!g){if((b|0)==(c|0)){break r}i=-1;m=F[j+8>>2];B=F[m+24>>2];t=c-4|0;e=F[t>>2];g=-1;x:{if((e|0)==-1){break x}p=e+1|0;p=(p>>>0)%3|0?p:e-2|0;g=-1;if((p|0)==-1){break x}g=F[F[m>>2]+(p<<2)>>2]}n=F[B+(g<<2)>>2];if((n|0)!=-1){i=n+1|0;i=(i>>>0)%3|0?i:n-2|0}if((e|0)!=-1&F[F[m+12>>2]+(e<<2)>>2]!=-1|(e|0)==(i|0)){break r}n=F[m+12>>2];if((i|0)!=-1&F[n+(i<<2)>>2]!=-1){break r}p=L(h,3);h=p+1|0;F[n+(e<<2)>>2]=h;x=h<<2;F[x+n>>2]=e;r=p+2|0;F[n+(i<<2)>>2]=r;w=r<<2;F[w+n>>2]=i;n=-1;h=-1;y:{if((e|0)==-1){break y}z:{if((e>>>0)%3|0){e=e-1|0;break z}e=e+2|0;h=-1;if((e|0)==-1){break y}}h=F[F[m>>2]+(e<<2)>>2]}e=h;A:{if((i|0)==-1){break A}h=i+1|0;h=(h>>>0)%3|0?h:i-2|0;if((h|0)==-1){break A}n=F[F[m>>2]+(h<<2)>>2]}if((e|0)==(g|0)|(g|0)==(n|0)){break r}a=F[m>>2];F[a+(p<<2)>>2]=g;F[a+x>>2]=n;F[a+w>>2]=e;if((e|0)!=-1){F[B+(e<<2)>>2]=r}a=F[j+120>>2]+(g>>>3&536870908)|0;e=F[a>>2];O=a,P=oi(g)&e,F[O>>2]=P;F[t>>2]=p;e=b;kc(J,p);break u}B:{switch(i-1|0){case 2:case 4:if((b|0)==(c|0)){break r}r=c-4|0;e=F[r>>2];i=F[j+8>>2];m=F[i+12>>2];if((e|0)!=-1&F[m+(e<<2)>>2]!=-1){break r}c=L(h,3);n=(g|0)==3;g=c+(n?2:1)|0;t=g<<2;F[t+m>>2]=e;F[m+(e<<2)>>2]=g;Ma(i+24|0,8324);p=F[j+8>>2];m=F[p+24>>2];if(F[p+28>>2]-m>>2>(C|0)){break r}a=F[p>>2];w=a+t|0;p=F[i+28>>2];i=F[i+24>>2];t=(p-i>>2)-1|0;F[w>>2]=t;if((i|0)!=(p|0)){F[m+(t<<2)>>2]=g}g=n?c:c+2|0;w=a+(c+n<<2)|0;C:{if((e|0)==-1){F[a+(g<<2)>>2]=-1;i=-1;break C}D:{E:{F:{if((e>>>0)%3|0){i=e-1|0;break F}i=e+2|0;if((i|0)==-1){break E}}i=F[a+(i<<2)>>2];F[a+(g<<2)>>2]=i;if((i|0)==-1){break D}F[m+(i<<2)>>2]=g;break D}F[a+(g<<2)>>2]=-1}i=e+1|0;e=(i>>>0)%3|0?i:e-2|0;i=-1;if((e|0)==-1){break C}i=F[a+(e<<2)>>2]}F[w>>2]=i;F[r>>2]=c;e=b;break v;case 6:break w;case 0:break B;default:break r}}if((e|0)==(c|0)){break r}f=c-4|0;m=F[f>>2];F[l+68>>2]=f;n=F[l+44>>2];G:{if(!n){break G}g=F[l+40>>2];p=ni(n)>>>0>1;a=h&n+2147483647;H:{if(!p){break H}a=h;if(a>>>0>>0){break H}a=(h>>>0)%(n>>>0)|0}i=a;a=F[g+(i<<2)>>2];if(!a){break G}a=F[a>>2];if(!a){break G}I:{if(!p){g=n-1|0;while(1){n=F[a+4>>2];J:{if((n|0)!=(h|0)){if((i|0)==(g&n)){break J}break G}if((h|0)==F[a+8>>2]){break I}}a=F[a>>2];if(a){continue}break}break G}while(1){g=F[a+4>>2];K:{if((g|0)!=(h|0)){if(g>>>0>=n>>>0){g=(g>>>0)%(n>>>0)|0}if((g|0)==(i|0)){break K}break G}if((h|0)==F[a+8>>2]){break I}}a=F[a>>2];if(a){continue}break}break G}if((f|0)!=(k|0)){F[f>>2]=F[a+12>>2];F[l+68>>2]=c;f=c;break G}b=k-e|0;c=b>>2;d=c+1|0;if(d>>>0>=1073741824){break b}f=b>>>1|0;d=b>>>0>=2147483644?1073741823:d>>>0>>0?f:d;if(d){if(d>>>0>=1073741824){break p}f=ka(d<<2)}else{f=0}b=f+(c<<2)|0;F[b>>2]=F[a+12>>2];d=f+(d<<2)|0;f=b+4|0;if((e|0)!=(k|0)){while(1){b=b-4|0;k=k-4|0;F[b>>2]=F[k>>2];if((e|0)!=(k|0)){continue}break}}F[l+72>>2]=d;F[l+68>>2]=f;F[l+64>>2]=b;if(e){ja(e)}e=b;k=d}if((e|0)==(f|0)){break t}x=f-4|0;a=F[x>>2];if((a|0)==(m|0)){break t}i=(a|0)==-1;g=F[j+8>>2];if(!i&F[F[g+12>>2]+(a<<2)>>2]!=-1){break t}n=F[g+12>>2];if((m|0)!=-1&F[n+(m<<2)>>2]!=-1){break t}p=L(h,3);t=p+2|0;F[n+(a<<2)>>2]=t;c=t<<2;F[c+n>>2]=a;h=p+1|0;F[n+(m<<2)>>2]=h;w=h<<2;F[w+n>>2]=m;L:{M:{N:{if(!i){if((a>>>0)%3|0){h=a-1|0;break N}h=a+2|0;if((h|0)!=-1){break N}i=F[g>>2];h=-1;break M}h=-1;i=F[g>>2];F[i+(p<<2)>>2]=-1;r=-1;break L}i=F[g>>2];h=F[i+(h<<2)>>2]}F[(p<<2)+i>>2]=h;r=a+1|0;a=(r>>>0)%3|0?r:a-2|0;r=-1;if((a|0)==-1){break L}r=F[(a<<2)+i>>2]}F[i+w>>2]=r;O:{if((m|0)==-1){F[c+i>>2]=-1;r=-1;c=-1;break O}P:{Q:{R:{if((m>>>0)%3|0){a=m-1|0;break R}a=m+2|0;if((a|0)==-1){break Q}}a=F[(a<<2)+i>>2];F[c+i>>2]=a;if((a|0)==-1){break P}F[F[g+24>>2]+(a<<2)>>2]=t;break P}F[c+i>>2]=-1}r=-1;a=m+1|0;a=(a>>>0)%3|0?a:m-2|0;c=-1;if((a|0)==-1){break O}r=F[(a<<2)+i>>2];c=a}a=F[j+388>>2];t=h<<2;m=a+t|0;w=a;a=r<<2;F[m>>2]=F[m>>2]+F[w+a>>2];w=a;a=F[g+24>>2];m=w+a|0;if((h|0)!=-1){F[a+t>>2]=F[m>>2]}a=c;while(1){if((a|0)!=-1){F[(a<<2)+i>>2]=h;t=a+1|0;a=(t>>>0)%3|0?t:a-2|0;g=-1;S:{if((a|0)==-1){break S}a=F[n+(a<<2)>>2];g=-1;if((a|0)==-1){break S}g=a+1|0;g=(g>>>0)%3|0?g:a-2|0}a=g;if((c|0)!=(a|0)){continue}break t}break}F[m>>2]=-1;T:{U:{if(M){break U}if((y|0)!=(z|0)){F[z>>2]=r;z=z+4|0;F[l+28>>2]=z;break U}a=y-o|0;g=a>>2;c=g+1|0;if(c>>>0>=1073741824){break T}h=a>>>1|0;h=a>>>0>=2147483644?1073741823:c>>>0>>0?h:c;if(h){if(h>>>0>=1073741824){break p}c=ka(h<<2)}else{c=0}a=c+(g<<2)|0;F[a>>2]=r;z=a+4|0;if((o|0)!=(y|0)){while(1){a=a-4|0;y=y-4|0;F[a>>2]=F[y>>2];if((o|0)!=(y|0)){continue}break}}y=c+(h<<2)|0;F[l+32>>2]=y;F[l+28>>2]=z;F[l+24>>2]=a;if(o){ja(o)}o=a}F[x>>2]=p;c=f;kc(J,p);break u}break b}g=F[j+8>>2];Ma(g+24|0,8324);a=-1;k=F[j+8>>2];f=L(h,3);i=F[g+28>>2];m=F[g+24>>2];n=i-m|0;g=n>>2;p=g-1|0;F[F[k>>2]+(f<<2)>>2]=p;Ma(k+24|0,8324);r=f+1|0;F[F[k>>2]+(r<<2)>>2]=(F[k+28>>2]-F[k+24>>2]>>2)-1;k=F[j+8>>2];Ma(k+24|0,8324);t=f+2|0;F[F[k>>2]+(t<<2)>>2]=(F[k+28>>2]-F[k+24>>2]>>2)-1;x=F[j+8>>2];k=F[x+24>>2];if(F[x+28>>2]-k>>2>(C|0)){break r}V:{W:{if((i|0)!=(m|0)){F[k+(p<<2)>>2]=f;a=0;if((n|0)==-4){break W}}F[k+(g<<2)>>2]=r;a=g+1|0;if((a|0)==-1){break V}}F[k+(a<<2)>>2]=t}if((d|0)!=(c|0)){F[c>>2]=f;f=c+4|0;F[l+68>>2]=f;k=d;break v}a=d-b|0;k=a>>2;e=k+1|0;if(e>>>0>=1073741824){break b}c=a>>>1|0;a=a>>>0>=2147483644?1073741823:e>>>0>>0?c:e;if(a){if(a>>>0>=1073741824){break p}c=ka(a<<2)}else{c=0}e=c+(k<<2)|0;F[e>>2]=f;k=c+(a<<2)|0;f=e+4|0;if((b|0)!=(d|0)){while(1){e=e-4|0;d=d-4|0;F[e>>2]=F[d>>2];if((b|0)!=(d|0)){continue}break}}F[l+72>>2]=k;F[l+68>>2]=f;F[l+64>>2]=e;if(b){ja(b)}d=k;b=e}kc(J,F[f-4>>2]);a=F[j+40>>2];X:{if((a|0)==F[j+36>>2]){break X}c=a-12|0;g=F[c+4>>2];h=q+(h^-1)|0;if(g>>>0>h>>>0){break t}if((g|0)!=(h|0)){break X}i=G[a-4|0];g=F[c>>2];F[j+40>>2]=c;if((g|0)<0){break t}m=f-4|0;a=F[m>>2];F[l+20>>2]=q+(g^-1);c=l+20|0;F[l+88>>2]=c;Fb(l,l+40|0,c,l+88|0);g=F[l>>2];Y:{if(i&1){c=-1;if((a|0)==-1){break Y}c=a+1|0;c=(c>>>0)%3|0?c:a-2|0;break Y}c=-1;if((a|0)==-1){break Y}c=a-1|0;if((a>>>0)%3|0){break Y}c=a+2|0}F[g+12>>2]=c;a=F[j+40>>2];if((a|0)==F[j+36>>2]){break X}while(1){c=a-12|0;g=F[c+4>>2];if(g>>>0>h>>>0){break t}if((g|0)!=(h|0)){break X}i=G[a-4|0];g=F[c>>2];F[j+40>>2]=c;if((g|0)<0){break t}a=F[m>>2];F[l+20>>2]=q+(g^-1);c=l+20|0;F[l+88>>2]=c;Fb(l,l+40|0,c,l+88|0);g=F[l>>2];Z:{if(i&1){c=-1;if((a|0)==-1){break Z}c=a+1|0;c=(c>>>0)%3|0?c:a-2|0;break Z}c=-1;if((a|0)==-1){break Z}c=a-1|0;if((a>>>0)%3|0){break Z}c=a+2|0}F[g+12>>2]=c;a=F[j+40>>2];if((a|0)!=F[j+36>>2]){continue}break}}c=f}B=(q|0)>(s|0);if((q|0)!=(s|0)){continue}break}s=q;break s}a=-1;if(B){break r}}a=-1;c=F[j+8>>2];if(F[c+28>>2]-F[c+24>>2]>>2>(C|0)){break r}if((b|0)!=(f|0)){m=j+72|0;k=j+60|0;n=j+312|0;while(1){f=f-4|0;q=F[f>>2];F[l+68>>2]=f;_:{if(wa(n)){g=F[j+8>>2];o=F[g>>2];if(((F[g+4>>2]-o>>2>>>0)/3|0)<=(s|0)){a=-1;break r}b=-1;i=F[g+24>>2];a=-1;$:{if((q|0)==-1){break $}e=q+1|0;e=(e>>>0)%3|0?e:q-2|0;a=-1;if((e|0)==-1){break $}a=F[o+(e<<2)>>2]}e=a;a=F[i+(e<<2)>>2];aa:{if((a|0)==-1){h=1;c=-1;break aa}h=1;c=-1;d=a+1|0;a=(d>>>0)%3|0?d:a-2|0;if((a|0)==-1){break aa}h=0;b=a+1|0;b=(b>>>0)%3|0?b:a-2|0;if((b|0)!=-1){c=F[o+(b<<2)>>2]}b=a}a=-1;d=-1;i=F[i+(c<<2)>>2];if((i|0)!=-1){d=i+1|0;d=(d>>>0)%3|0?d:i-2|0}if((b|0)==(q|0)|(d|0)==(q|0)|((q|0)!=-1&F[F[g+12>>2]+(q<<2)>>2]!=-1|(b|0)==(d|0))){break r}if(!h&F[F[g+12>>2]+(b<<2)>>2]!=-1){break r}h=-1;g=F[g+12>>2];i=-1;ba:{if((d|0)==-1){break ba}if(F[g+(d<<2)>>2]!=-1){break r}a=d+1|0;a=(a>>>0)%3|0?a:d-2|0;i=-1;if((a|0)==-1){break ba}i=F[o+(a<<2)>>2]}a=L(s,3);F[l>>2]=a;F[g+(a<<2)>>2]=q;F[g+(q<<2)>>2]=a;a=F[l>>2]+1|0;F[g+(a<<2)>>2]=b;F[g+(b<<2)>>2]=a;a=F[l>>2]+2|0;F[g+(a<<2)>>2]=d;F[g+(d<<2)>>2]=a;a=F[l>>2];F[o+(a<<2)>>2]=c;b=a+1|0;d=o+(b<<2)|0;F[d>>2]=i;q=a+2|0;o=o+(q<<2)|0;F[o>>2]=e;a=F[j+120>>2];e=b?c:-1;c=a+(e>>>3&536870908)|0;g=F[c>>2];O=c,P=oi(e)&g,F[O>>2]=P;h=(b|0)!=-1?F[d>>2]:h;b=a+(h>>>3&536870908)|0;d=F[b>>2];O=b,P=oi(h)&d,F[O>>2]=P;d=-1;d=(q|0)!=-1?F[o>>2]:d;a=a+(d>>>3&536870908)|0;b=F[a>>2];O=a,P=oi(d)&b,F[O>>2]=P;D[l+88|0]=1;wd(k,l+88|0);Ma(m,l);s=s+1|0;b=F[l+64>>2];break _}d=F[j+64>>2];a=F[j+68>>2];if((d|0)==a<<5){if((d+1|0)<0){break b}if(d>>>0<=1073741822){a=a<<6;d=(d&-32)+32|0;a=a>>>0>d>>>0?a:d}else{a=2147483647}$a(k,a);d=F[j+64>>2]}F[j+64>>2]=d+1;a=F[j+60>>2]+(d>>>3&536870908)|0;e=F[a>>2];O=a,P=oi(d)&e,F[O>>2]=P;d=F[j+76>>2];if((d|0)!=F[j+80>>2]){F[d>>2]=q;F[j+76>>2]=d+4;break _}c=F[m>>2];a=d-c|0;o=a>>2;e=o+1|0;if(e>>>0>=1073741824){break b}h=a>>>1|0;h=a>>>0>=2147483644?1073741823:e>>>0>>0?h:e;if(h){if(h>>>0>=1073741824){break p}a=ka(h<<2)}else{a=0}e=a+(o<<2)|0;F[e>>2]=q;q=e+4|0;if((d|0)!=(c|0)){while(1){e=e-4|0;d=d-4|0;F[e>>2]=F[d>>2];if((d|0)!=(c|0)){continue}break}}F[j+80>>2]=a+(h<<2);F[j+76>>2]=q;F[j+72>>2]=e;if(!c){break _}ja(c)}if((b|0)!=(f|0)){continue}break}c=F[j+8>>2]}a=-1;if(((F[c+4>>2]-F[c>>2]>>2>>>0)/3|0)!=(s|0)){break r}a=F[c+28>>2]-F[c+24>>2]>>2;f=F[l+24>>2];h=F[l+28>>2];if((f|0)==(h|0)){break q}while(1){b=F[f>>2];k=F[c+24>>2];d=a-1|0;e=k+(d<<2)|0;if(F[e>>2]==-1){while(1){d=a-2|0;a=a-1|0;e=k+(d<<2)|0;if(F[e>>2]==-1){continue}break}}if(b>>>0<=d>>>0){F[l>>2]=c;e=F[e>>2];D[l+12|0]=1;F[l+8>>2]=e;F[l+4>>2]=e;if((e|0)!=-1){while(1){e=F[F[j+8>>2]>>2]+(e<<2)|0;if(F[e>>2]!=(d|0)){a=-1;break r}F[e>>2]=b;nc(l);e=F[l+8>>2];if((e|0)!=-1){continue}break}c=F[j+8>>2]}k=F[c+24>>2];e=k+(d<<2)|0;if((b|0)!=-1){F[k+(b<<2)>>2]=F[e>>2]}F[e>>2]=-1;e=1<>2];b=k+(b>>>3&536870908)|0;k=k+(d>>>3&536870908)|0;d=1<>2]&d){e=e|F[b>>2]}else{e=F[b>>2]&(e^-1)}F[b>>2]=e;F[k>>2]=F[k>>2]&(d^-1);a=a-1|0}f=f+4|0;if((h|0)!=(f|0)){continue}break}}f=F[l+24>>2]}if(f){ja(f)}b=F[l+48>>2];if(b){while(1){d=F[b>>2];ja(b);b=d;if(b){continue}break}}b=F[l+40>>2];F[l+40>>2]=0;if(b){ja(b)}b=F[l+64>>2];if(b){F[l+68>>2]=b;ja(b)}Z=l+96|0;break o}oa();v()}f=a;if((a|0)==-1){break n}a=K;b=F[a+16>>2];d=b+F[a>>2]|0;b=F[a+8>>2]-b|0;a=F[F[j+4>>2]+32>>2];E[a+38>>1]=H[a+38>>1];F[a>>2]=d;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=b;F[a+12>>2]=0;ca:{if(F[j+216>>2]==F[j+220>>2]){break ca}a=F[j+8>>2];if(F[a+4>>2]==F[a>>2]){break ca}b=0;while(1){if(Ad(j,b)){b=b+3|0;a=F[j+8>>2];if(b>>>0>2]-F[a>>2]>>2>>>0){continue}break ca}break}break n}if(G[j+308|0]){D[j+308|0]=0;d=F[j+292>>2];a=0;e=F[j+304>>2]+7|0;a=e>>>0<7?1:a;e=a<<29|e>>>3;b=e+F[j+288>>2]|0;a=(a>>>3|0)+d|0;F[j+288>>2]=b;F[j+292>>2]=b>>>0>>0?a+1|0:a}b=F[j+216>>2];if((b|0)!=F[j+220>>2]){a=0;while(1){e=L(a,144);Zc((e+b|0)+4|0,F[j+8>>2]);d=F[A>>2];c=d+e|0;b=F[c+132>>2];c=F[c+136>>2];if((b|0)!=(c|0)){while(1){Xc((e+F[A>>2]|0)+4|0,F[b>>2]);b=b+4|0;if((c|0)!=(b|0)){continue}break}d=F[A>>2]}if(!Yc((d+e|0)+4|0)){break n}a=a+1|0;b=F[j+216>>2];if(a>>>0<(F[j+220>>2]-b|0)/144>>>0){continue}break}}a=F[j+8>>2];Hb(j+184|0,F[a+28>>2]-F[a+24>>2]>>2);d=F[j+216>>2];if((d|0)!=F[j+220>>2]){b=0;while(1){a=L(b,144)+d|0;d=F[a+60>>2]-F[a+56>>2]>>2;c=a+104|0;a=F[j+8>>2];a=F[a+28>>2]-F[a+24>>2]>>2;Hb(c,(a|0)<(d|0)?d:a);b=b+1|0;d=F[j+216>>2];if(b>>>0<(F[j+220>>2]-d|0)/144>>>0){continue}break}}N=zd(j,f)}}Z=u- -64|0;return N|0}na();v()}function lh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,J=0,K=0,M=0,N=0;t=Z+-64|0;Z=t;F[a+132>>2]=0;if(F[a+148>>2]){c=F[a+144>>2];if(c){while(1){b=F[c>>2];ja(c);c=b;if(b){continue}break}}c=0;F[a+144>>2]=0;b=F[a+140>>2];a:{if(!b){break a}if(b>>>0>=4){h=b&-4;while(1){e=c<<2;F[e+F[a+136>>2]>>2]=0;F[F[a+136>>2]+(e|4)>>2]=0;F[F[a+136>>2]+(e|8)>>2]=0;F[F[a+136>>2]+(e|12)>>2]=0;c=c+4|0;g=g+4|0;if((h|0)!=(g|0)){continue}break}}b=b&3;if(!b){break a}g=0;while(1){F[F[a+136>>2]+(c<<2)>>2]=0;c=c+1|0;g=g+1|0;if((b|0)!=(g|0)){continue}break}}F[a+148>>2]=0}b:{if(!Da(1,t+60|0,F[F[a+4>>2]+32>>2])){break b}F[a+156>>2]=F[t+60>>2];if(!Da(1,t+56|0,F[F[a+4>>2]+32>>2])){break b}e=F[t+56>>2];if(e>>>0>1431655765|I[a+156>>2]>L(e,3)>>>0){break b}c=F[F[a+4>>2]+32>>2];h=F[c+8>>2];m=F[c+12>>2];b=F[c+20>>2];g=F[c+16>>2];if((m|0)<=(b|0)&g>>>0>=h>>>0|(b|0)>(m|0)){break b}h=G[g+F[c>>2]|0];g=g+1|0;b=g?b:b+1|0;F[c+16>>2]=g;F[c+20>>2]=b;if(!Da(1,t+52|0,c)){break b}n=F[t+52>>2];if(n>>>0>e>>>0|e>>>0>n+((n>>>0)/3|0)>>>0){break b}if(!Da(1,t+48|0,F[F[a+4>>2]+32>>2])){break b}c=F[t+48>>2];if(c>>>0>n>>>0){break b}F[a+28>>2]=F[a+24>>2];g=Zb(ka(88));b=F[a+8>>2];F[a+8>>2]=g;if(b){Za(b);if(!F[a+8>>2]){break b}}F[a+164>>2]=F[a+160>>2];Ib(a+160|0,e);F[a+176>>2]=F[a+172>>2];Ib(a+172|0,e);F[a- -64>>2]=0;F[a+92>>2]=-1;F[a+84>>2]=-1;F[a+88>>2]=-1;F[a+40>>2]=F[a+36>>2];F[a+52>>2]=F[a+48>>2];F[a+76>>2]=F[a+72>>2];y=a+216|0;Dd(y);Cd(y,h);if(!_c(F[a+8>>2],e,c+F[a+156>>2]|0)){break b}b=F[a+156>>2];D[t+8|0]=1;Ea(a+120|0,b+c|0,t+8|0);if((Bd(a,F[F[a+4>>2]+32>>2])|0)==-1){break b}c=a+232|0;F[c+144>>2]=a;b=F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2];b=F[b>>2]+F[b+16>>2]|0;g=F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2];g=F[g+8>>2]-F[g+16>>2]|0;M=c,N=H[F[($[F[F[a>>2]+32>>2]](a)|0)+32>>2]+38>>1],E[M+38>>1]=N;F[c>>2]=b;F[c+16>>2]=0;F[c+20>>2]=0;F[c+8>>2]=g;F[c+12>>2]=0;F[a+372>>2]=h;C=Ja(t+8|0);h=C;m=0;d=Z-16|0;Z=d;b=F[c+4>>2];F[c+40>>2]=F[c>>2];F[c+44>>2]=b;b=F[c+36>>2];F[c+72>>2]=F[c+32>>2];F[c+76>>2]=b;g=F[c+28>>2];b=c- -64|0;F[b>>2]=F[c+24>>2];F[b+4>>2]=g;b=F[c+20>>2];F[c+56>>2]=F[c+16>>2];F[c+60>>2]=b;b=F[c+12>>2];F[c+48>>2]=F[c+8>>2];F[c+52>>2]=b;c:{d:{if(hc(c+40|0,1,d+8|0)){b=F[c+44>>2];F[c>>2]=F[c+40>>2];F[c+4>>2]=b;b=F[c+76>>2];F[c+32>>2]=F[c+72>>2];F[c+36>>2]=b;b=F[c+68>>2];F[c+24>>2]=F[c+64>>2];F[c+28>>2]=b;g=F[c+60>>2];f=g;b=F[c+56>>2];F[c+16>>2]=b;F[c+20>>2]=g;e=F[c+52>>2];g=F[c+48>>2];F[c+8>>2]=g;F[c+12>>2]=e;k=F[d+12>>2];i=e-((b>>>0>g>>>0)+f|0)|0;e=g-b|0;g=F[d+8>>2];if((k|0)==(i|0)&e>>>0>=g>>>0|i>>>0>k>>>0){break d}}break c}e=f+k|0;b=b+g|0;e=b>>>0>>0?e+1|0:e;F[c+16>>2]=b;F[c+20>>2]=e;if(!Aa(c+80|0,c)){break c}if(!yd(c)){break c}b=F[c+4>>2];F[h>>2]=F[c>>2];F[h+4>>2]=b;b=F[c+36>>2];F[h+32>>2]=F[c+32>>2];F[h+36>>2]=b;b=F[c+28>>2];F[h+24>>2]=F[c+24>>2];F[h+28>>2]=b;b=F[c+20>>2];F[h+16>>2]=F[c+16>>2];F[h+20>>2]=b;b=F[c+12>>2];F[h+8>>2]=F[c+8>>2];F[h+12>>2]=b;m=1}Z=d+16|0;e:{if(!m){break e}b=0;c=0;g=0;m=0;j=Z-96|0;Z=j;F[j+72>>2]=0;F[j+64>>2]=0;F[j+68>>2]=0;F[j+48>>2]=0;F[j+52>>2]=0;F[j+40>>2]=0;F[j+44>>2]=0;F[j+56>>2]=1065353216;F[j+32>>2]=0;F[j+24>>2]=0;F[j+28>>2]=0;h=a;B=F[a+124>>2];f:{g:{h:{i:{j:{k:{l:{m:{if((n|0)<=0){break m}J=F[h+216>>2]!=F[h+220>>2];z=1;while(1){e=m;m=e+1|0;n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{if(!G[h+308|0]){break B}k=F[h+296>>2];d=F[h+304>>2];a=k+(d>>>3|0)|0;l=F[h+300>>2];if(a>>>0>=l>>>0){break B}f=G[a|0];a=d+1|0;F[h+304>>2]=a;p=f>>>(d&7)&1;if(!p){break B}i=0;f=a>>>3|0;r=k+f|0;C:{if(r>>>0>=l>>>0){d=a;a=0;break C}r=G[r|0];d=d+2|0;F[h+304>>2]=d;f=d>>>3|0;a=r>>>(a&7)&1}f=f+k|0;if(f>>>0>>0){f=G[f|0];F[h+304>>2]=d+1;i=f>>>(d&7)<<1&2}f=-1;i=p|(a|i)<<1;switch(i-1|0){case 6:break y;case 0:break z;case 2:case 4:break A;default:break l}}if((c|0)==(g|0)){f=-1;break l}d=-1;i=F[h+8>>2];z=F[i+24>>2];r=c-4|0;b=F[r>>2];a=-1;D:{if((b|0)==-1){break D}k=b+1|0;k=(k>>>0)%3|0?k:b-2|0;a=-1;if((k|0)==-1){break D}a=F[F[i>>2]+(k<<2)>>2]}f=F[z+(a<<2)>>2];if((f|0)!=-1){d=f+1|0;d=(d>>>0)%3|0?d:f-2|0}if((b|0)==(d|0)){f=-1;break l}if((b|0)!=-1){f=-1;if(F[F[i+12>>2]+(b<<2)>>2]!=-1){break l}}k=F[i+12>>2];if((d|0)!=-1){f=-1;if(F[k+(d<<2)>>2]!=-1){break l}}l=L(e,3);e=l+1|0;F[k+(b<<2)>>2]=e;s=e<<2;F[s+k>>2]=b;p=l+2|0;F[k+(d<<2)>>2]=p;u=p<<2;F[u+k>>2]=d;k=-1;e=-1;E:{if((b|0)==-1){break E}F:{if((b>>>0)%3|0){b=b-1|0;break F}b=b+2|0;e=-1;if((b|0)==-1){break E}}e=F[F[i>>2]+(b<<2)>>2]}b=e;G:{if((d|0)==-1){break G}e=d+1|0;e=(e>>>0)%3|0?e:d-2|0;if((e|0)==-1){break G}k=F[F[i>>2]+(e<<2)>>2]}f=-1;if((a|0)==(b|0)|(a|0)==(k|0)){break l}e=F[i>>2];F[e+(l<<2)>>2]=a;F[e+s>>2]=k;F[e+u>>2]=b;if((b|0)!=-1){F[z+(b<<2)>>2]=p}b=F[h+120>>2]+(a>>>3&536870908)|0;e=F[b>>2];M=b,N=oi(a)&e,F[M>>2]=N;F[r>>2]=l;b=g;break n}if((c|0)==(g|0)){break l}r=c-4|0;b=F[r>>2];a=F[h+8>>2];d=F[a+12>>2];if((b|0)!=-1&F[d+(b<<2)>>2]!=-1){break l}l=(i|0)==5;i=L(e,3);p=(l?2:1)+i|0;s=p<<2;F[s+d>>2]=b;F[d+(b<<2)>>2]=p;Ma(a+24|0,8324);d=F[h+8>>2];k=F[d+24>>2];if(F[d+28>>2]-k>>2>(B|0)){break l}d=F[d>>2];u=d+s|0;f=F[a+28>>2];a=F[a+24>>2];s=(f-a>>2)-1|0;F[u>>2]=s;if((a|0)!=(f|0)){F[k+(s<<2)>>2]=p}f=l?i:i+2|0;l=d+(i+l<<2)|0;H:{if((b|0)==-1){F[d+(f<<2)>>2]=-1;a=-1;break H}I:{J:{K:{if((b>>>0)%3|0){a=b-1|0;break K}a=b+2|0;if((a|0)==-1){break J}}a=F[d+(a<<2)>>2];F[d+(f<<2)>>2]=a;if((a|0)==-1){break I}F[k+(a<<2)>>2]=f;break I}F[d+(f<<2)>>2]=-1}f=b+1|0;b=(f>>>0)%3|0?f:b-2|0;a=-1;if((b|0)==-1){break H}a=F[d+(b<<2)>>2]}F[l>>2]=a;F[r>>2]=i;b=g;break t}if((b|0)==(c|0)){break l}a=c-4|0;k=F[a>>2];F[j+68>>2]=a;l=F[j+44>>2];L:{if(!l){c=a;break L}f=F[j+40>>2];p=ni(l)>>>0>1;d=e&l+2147483647;M:{if(!p){break M}d=e;if(d>>>0>>0){break M}d=(e>>>0)%(l>>>0)|0}i=d;d=F[f+(i<<2)>>2];if(!d){c=a;break L}d=F[d>>2];if(!d){c=a;break L}N:{if(!p){f=l-1|0;while(1){l=F[d+4>>2];O:{if((l|0)!=(e|0)){if((i|0)==(f&l)){break O}c=a;break L}if((e|0)==F[d+8>>2]){break N}}d=F[d>>2];if(d){continue}break}c=a;break L}while(1){f=F[d+4>>2];P:{if((f|0)!=(e|0)){if(f>>>0>=l>>>0){f=(f>>>0)%(l>>>0)|0}if((f|0)==(i|0)){break P}c=a;break L}if((e|0)==F[d+8>>2]){break N}}d=F[d>>2];if(d){continue}break}c=a;break L}if((a|0)!=(q|0)){F[a>>2]=F[d+12>>2];F[j+68>>2]=c;break L}a=q-b|0;g=a>>2;c=g+1|0;if(c>>>0>=1073741824){break x}f=a>>>1|0;f=a>>>0>=2147483644?1073741823:c>>>0>>0?f:c;if(f){if(f>>>0>=1073741824){break j}a=ka(f<<2)}else{a=0}g=a+(g<<2)|0;F[g>>2]=F[d+12>>2];c=g+4|0;if((b|0)!=(q|0)){while(1){g=g-4|0;q=q-4|0;F[g>>2]=F[q>>2];if((b|0)!=(q|0)){continue}break}}q=a+(f<<2)|0;F[j+72>>2]=q;F[j+68>>2]=c;F[j+64>>2]=g;if(b){ja(b)}}if((c|0)==(g|0)){break p}s=c-4|0;b=F[s>>2];if((b|0)==(k|0)){break p}a=(b|0)==-1;f=F[h+8>>2];if(!a&F[F[f+12>>2]+(b<<2)>>2]!=-1){break p}l=F[f+12>>2];if((k|0)!=-1&F[l+(k<<2)>>2]!=-1){break p}p=L(e,3);r=p+2|0;F[l+(b<<2)>>2]=r;e=r<<2;F[e+l>>2]=b;d=p+1|0;F[l+(k<<2)>>2]=d;u=d<<2;F[u+l>>2]=k;if(a){break w}if((b>>>0)%3|0){d=b-1|0;break s}d=b+2|0;if((d|0)!=-1){break s}a=F[f>>2];d=-1;break r}i=F[h+8>>2];Ma(i+24|0,8324);d=F[h+8>>2];a=L(e,3);k=F[i+28>>2];l=F[i+24>>2];p=k-l|0;i=p>>2;r=i-1|0;F[F[d>>2]+(a<<2)>>2]=r;Ma(d+24|0,8324);s=a+1|0;F[F[d>>2]+(s<<2)>>2]=(F[d+28>>2]-F[d+24>>2]>>2)-1;d=F[h+8>>2];Ma(d+24|0,8324);u=a+2|0;F[F[d>>2]+(u<<2)>>2]=(F[d+28>>2]-F[d+24>>2]>>2)-1;A=F[h+8>>2];d=F[A+24>>2];if(F[A+28>>2]-d>>2>(B|0)){break l}Q:{R:{if((k|0)!=(l|0)){F[d+(r<<2)>>2]=a;f=0;if((p|0)==-4){break R}}F[d+(i<<2)>>2]=s;f=i+1|0;if((f|0)==-1){break Q}}F[d+(f<<2)>>2]=u}if((c|0)!=(q|0)){F[c>>2]=a;c=c+4|0;F[j+68>>2]=c;break t}g=c-b|0;i=g>>2;d=i+1|0;if(d>>>0>=1073741824){break v}f=g>>>1|0;d=g>>>0>=2147483644?1073741823:d>>>0>>0?f:d;if(d){if(d>>>0>=1073741824){break j}f=ka(d<<2)}else{f=0}g=f+(i<<2)|0;F[g>>2]=a;q=f+(d<<2)|0;a=g+4|0;if((b|0)!=(c|0)){while(1){g=g-4|0;c=c-4|0;F[g>>2]=F[c>>2];if((b|0)!=(c|0)){continue}break}}F[j+72>>2]=q;F[j+68>>2]=a;F[j+64>>2]=g;if(!b){break u}ja(b);break u}na();v()}d=-1;a=F[f>>2];F[a+(p<<2)>>2]=-1;i=-1;break q}na();v()}c=a;b=g}a=F[h+40>>2];if((a|0)==F[h+36>>2]){break n}d=a-12|0;i=F[d+4>>2];f=n+(e^-1)|0;if(i>>>0>f>>>0){break p}if((f|0)!=(i|0)){break n}i=G[a-4|0];e=F[d>>2];F[h+40>>2]=d;if((e|0)<0){break p}k=c-4|0;a=F[k>>2];F[j+20>>2]=n+(e^-1);e=j+20|0;F[j+88>>2]=e;Fb(j,j+40|0,e,j+88|0);d=F[j>>2];S:{if(i&1){e=-1;if((a|0)==-1){break S}e=a+1|0;e=(e>>>0)%3|0?e:a-2|0;break S}e=-1;if((a|0)==-1){break S}e=a-1|0;if((a>>>0)%3|0){break S}e=a+2|0}F[d+12>>2]=e;d=F[h+40>>2];if((d|0)==F[h+36>>2]){break n}while(1){a=d-12|0;e=F[a+4>>2];if(e>>>0>f>>>0){break p}if((f|0)!=(e|0)){break n}d=G[d-4|0];e=F[a>>2];F[h+40>>2]=a;if((e|0)<0){break p}a=F[k>>2];F[j+20>>2]=n+(e^-1);e=j+20|0;F[j+88>>2]=e;Fb(j,j+40|0,e,j+88|0);i=F[j>>2];T:{if(d&1){e=-1;if((a|0)==-1){break T}e=a+1|0;e=(e>>>0)%3|0?e:a-2|0;break T}e=-1;if((a|0)==-1){break T}e=a-1|0;if((a>>>0)%3|0){break T}e=a+2|0}F[i+12>>2]=e;d=F[h+40>>2];if((d|0)!=F[h+36>>2]){continue}break}break n}a=F[f>>2];d=F[a+(d<<2)>>2]}F[(p<<2)+a>>2]=d;A=b+1|0;b=(A>>>0)%3|0?A:b-2|0;i=-1;if((b|0)==-1){break q}i=F[(b<<2)+a>>2]}F[a+u>>2]=i;U:{if((k|0)==-1){F[a+e>>2]=-1;i=-1;e=-1;break U}V:{W:{X:{if((k>>>0)%3|0){b=k-1|0;break X}b=k+2|0;if((b|0)==-1){break W}}b=F[(b<<2)+a>>2];F[a+e>>2]=b;if((b|0)==-1){break V}F[F[f+24>>2]+(b<<2)>>2]=r;break V}F[a+e>>2]=-1}i=-1;b=k+1|0;b=(b>>>0)%3|0?b:k-2|0;e=-1;if((b|0)==-1){break U}i=F[(b<<2)+a>>2];e=b}b=F[f+24>>2];k=b+(i<<2)|0;if((d|0)!=-1){F[b+(d<<2)>>2]=F[k>>2]}b=e;while(1){if((b|0)==-1){break o}F[(b<<2)+a>>2]=d;r=b+1|0;b=(r>>>0)%3|0?r:b-2|0;f=-1;Y:{if((b|0)==-1){break Y}b=F[l+(b<<2)>>2];f=-1;if((b|0)==-1){break Y}f=b+1|0;f=(f>>>0)%3|0?f:b-2|0}b=f;if((e|0)!=(b|0)){continue}break}}f=-1;if(!z){break m}break l}F[k>>2]=-1;Z:{if(J){break Z}if((w|0)!=(x|0)){F[x>>2]=i;x=x+4|0;F[j+28>>2]=x;break Z}a=w-o|0;d=a>>2;b=d+1|0;if(b>>>0>=1073741824){break i}e=a>>>1|0;e=a>>>0>=2147483644?1073741823:b>>>0>>0?e:b;if(e){if(e>>>0>=1073741824){break j}a=ka(e<<2)}else{a=0}b=a+(d<<2)|0;F[b>>2]=i;x=b+4|0;if((o|0)!=(w|0)){while(1){b=b-4|0;w=w-4|0;F[b>>2]=F[w>>2];if((o|0)!=(w|0)){continue}break}}w=a+(e<<2)|0;F[j+32>>2]=w;F[j+28>>2]=x;F[j+24>>2]=b;if(o){ja(o)}o=b}F[s>>2]=p;b=g}z=(m|0)<(n|0);if((m|0)!=(n|0)){continue}break}m=n}f=-1;a=F[h+8>>2];if(F[a+28>>2]-F[a+24>>2]>>2>(B|0)){break l}if((c|0)!=(g|0)){l=h+72|0;e=h+60|0;w=h+312|0;while(1){c=c-4|0;i=F[c>>2];F[j+68>>2]=c;_:{if(wa(w)){q=F[h+8>>2];k=F[q>>2];if(((F[q+4>>2]-k>>2>>>0)/3|0)<=(m|0)){f=-1;break l}a=-1;f=-1;b=-1;x=F[q+24>>2];g=-1;$:{if((i|0)==-1){break $}n=i+1|0;n=(n>>>0)%3|0?n:i-2|0;g=-1;if((n|0)==-1){break $}g=F[k+(n<<2)>>2]}n=g;o=F[x+(n<<2)>>2];aa:{if((o|0)==-1){d=1;g=-1;break aa}d=1;p=o+1|0;o=(p>>>0)%3|0?p:o-2|0;g=-1;if((o|0)==-1){break aa}d=0;a=o;g=a+1|0;g=(g>>>0)%3|0?g:a-2|0;if((g|0)!=-1){g=F[k+(g<<2)>>2]}else{g=-1}}o=F[(g<<2)+x>>2];if((o|0)!=-1){b=o+1|0;b=(b>>>0)%3|0?b:o-2|0}if((a|0)==(i|0)|(b|0)==(i|0)|((i|0)!=-1&F[F[q+12>>2]+(i<<2)>>2]!=-1|(a|0)==(b|0))){break l}if(!d&F[F[q+12>>2]+(a<<2)>>2]!=-1){break l}d=-1;o=F[q+12>>2];q=-1;ba:{if((b|0)==-1){break ba}if(F[o+(b<<2)>>2]!=-1){break l}f=b+1|0;f=(f>>>0)%3|0?f:b-2|0;q=-1;if((f|0)==-1){break ba}q=F[k+(f<<2)>>2]}f=L(m,3);F[j>>2]=f;F[o+(f<<2)>>2]=i;F[o+(i<<2)>>2]=f;f=F[j>>2]+1|0;F[o+(f<<2)>>2]=a;F[o+(a<<2)>>2]=f;a=F[j>>2]+2|0;F[o+(a<<2)>>2]=b;F[o+(b<<2)>>2]=a;a=F[j>>2];F[k+(a<<2)>>2]=g;b=a+1|0;f=k+(b<<2)|0;F[f>>2]=q;o=a+2|0;i=k+(o<<2)|0;F[i>>2]=n;a=F[h+120>>2];g=b?g:-1;n=a+(g>>>3&536870908)|0;k=F[n>>2];M=n,N=oi(g)&k,F[M>>2]=N;d=(b|0)!=-1?F[f>>2]:d;b=a+(d>>>3&536870908)|0;g=F[b>>2];M=b,N=oi(d)&g,F[M>>2]=N;b=-1;b=(o|0)!=-1?F[i>>2]:b;a=a+(b>>>3&536870908)|0;g=F[a>>2];M=a,N=oi(b)&g,F[M>>2]=N;D[j+88|0]=1;wd(e,j+88|0);Ma(l,j);m=m+1|0;g=F[j+64>>2];break _}b=F[h+64>>2];a=F[h+68>>2];if((b|0)==a<<5){if((b+1|0)<0){break h}if(b>>>0<=1073741822){a=a<<6;b=(b&-32)+32|0;a=a>>>0>b>>>0?a:b}else{a=2147483647}$a(e,a);b=F[h+64>>2]}F[h+64>>2]=b+1;a=F[h+60>>2]+(b>>>3&536870908)|0;d=F[a>>2];M=a,N=oi(b)&d,F[M>>2]=N;b=F[h+76>>2];if((b|0)!=F[h+80>>2]){F[b>>2]=i;F[h+76>>2]=b+4;break _}f=F[l>>2];a=b-f|0;o=a>>2;d=o+1|0;if(d>>>0>=1073741824){break g}n=a>>>1|0;n=a>>>0>=2147483644?1073741823:d>>>0>>0?n:d;if(n){if(n>>>0>=1073741824){break j}a=ka(n<<2)}else{a=0}d=a+(o<<2)|0;F[d>>2]=i;o=d+4|0;if((b|0)!=(f|0)){while(1){d=d-4|0;b=b-4|0;F[d>>2]=F[b>>2];if((b|0)!=(f|0)){continue}break}}F[h+80>>2]=a+(n<<2);F[h+76>>2]=o;F[h+72>>2]=d;if(!f){break _}ja(f)}if((c|0)!=(g|0)){continue}break}a=F[h+8>>2]}f=-1;if(((F[a+4>>2]-F[a>>2]>>2>>>0)/3|0)!=(m|0)){break l}f=F[a+28>>2]-F[a+24>>2]>>2;c=F[j+24>>2];n=F[j+28>>2];if((c|0)==(n|0)){break k}while(1){g=F[c>>2];e=F[a+24>>2];b=f-1|0;d=e+(b<<2)|0;if(F[d>>2]==-1){while(1){b=f-2|0;f=f-1|0;d=e+(b<<2)|0;if(F[d>>2]==-1){continue}break}}if(b>>>0>=g>>>0){F[j>>2]=a;d=F[d>>2];D[j+12|0]=1;F[j+8>>2]=d;F[j+4>>2]=d;if((d|0)!=-1){while(1){a=F[F[h+8>>2]>>2]+(d<<2)|0;if(F[a>>2]!=(b|0)){f=-1;break l}F[a>>2]=g;nc(j);d=F[j+8>>2];if((d|0)!=-1){continue}break}a=F[h+8>>2]}m=F[a+24>>2];e=m+(b<<2)|0;if((g|0)!=-1){F[m+(g<<2)>>2]=F[e>>2]}F[e>>2]=-1;e=1<>2];g=m+(g>>>3&536870908)|0;d=1<>>3&536870908)|0;if(d&F[m>>2]){b=e|F[g>>2]}else{b=F[g>>2]&(e^-1)}F[g>>2]=b;F[m>>2]=F[m>>2]&(d^-1);f=f-1|0}c=c+4|0;if((n|0)!=(c|0)){continue}break}}c=F[j+24>>2]}if(c){ja(c)}a=F[j+48>>2];if(a){while(1){c=F[a>>2];ja(a);a=c;if(a){continue}break}}a=F[j+40>>2];F[j+40>>2]=0;if(a){ja(a)}a=F[j+64>>2];if(a){F[j+68>>2]=a;ja(a)}Z=j+96|0;a=f;break f}oa();v()}na();v()}na();v()}na();v()}b=a;if((a|0)==-1){break e}a=C;c=F[a+16>>2];g=c+F[a>>2]|0;c=F[a+8>>2]-c|0;a=F[F[h+4>>2]+32>>2];E[a+38>>1]=H[a+38>>1];F[a>>2]=g;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=c;F[a+12>>2]=0;ca:{if(F[h+216>>2]==F[h+220>>2]){break ca}a=F[h+8>>2];if(F[a+4>>2]==F[a>>2]){break ca}c=0;while(1){if(Ad(h,c)){c=c+3|0;a=F[h+8>>2];if(c>>>0>2]-F[a>>2]>>2>>>0){continue}break ca}break}break e}if(G[h+308|0]){D[h+308|0]=0;g=F[h+292>>2];a=0;e=F[h+304>>2]+7|0;a=e>>>0<7?1:a;c=a>>>3|0;m=a<<29|e>>>3;a=m+F[h+288>>2]|0;e=c+g|0;F[h+288>>2]=a;F[h+292>>2]=a>>>0>>0?e+1|0:e}c=F[h+216>>2];if((c|0)!=F[h+220>>2]){a=0;while(1){e=L(a,144);Zc((e+c|0)+4|0,F[h+8>>2]);g=F[y>>2];m=g+e|0;c=F[m+132>>2];m=F[m+136>>2];if((c|0)!=(m|0)){while(1){Xc((e+F[y>>2]|0)+4|0,F[c>>2]);c=c+4|0;if((m|0)!=(c|0)){continue}break}g=F[y>>2]}if(!Yc((g+e|0)+4|0)){break e}a=a+1|0;c=F[h+216>>2];if(a>>>0<(F[h+220>>2]-c|0)/144>>>0){continue}break}}a=F[h+8>>2];Hb(h+184|0,F[a+28>>2]-F[a+24>>2]>>2);g=F[h+216>>2];if((g|0)!=F[h+220>>2]){c=0;while(1){a=L(c,144)+g|0;g=F[a+60>>2]-F[a+56>>2]>>2;e=a+104|0;a=F[h+8>>2];a=F[a+28>>2]-F[a+24>>2]>>2;Hb(e,(a|0)<(g|0)?g:a);c=c+1|0;g=F[h+216>>2];if(c>>>0<(F[h+220>>2]-g|0)/144>>>0){continue}break}}K=zd(h,b)}}Z=t- -64|0;return K|0}function Cf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0;B=c;c=0;m=Z-96|0;Z=m;l=m+16|0;ma(l,0,76);F[m+92>>2]=-1;F[m+8>>2]=0;F[m>>2]=0;F[m+4>>2]=0;r=Z-16|0;Z=r;F[l+68>>2]=0;F[l+72>>2]=0;F[l>>2]=b;s=Z-16|0;Z=s;u=b;a=F[b+20>>2];a:{if((F[b+24>>2]-a|0)<=0){break a}a=F[a>>2];if((a|0)==-1){break a}c=F[F[u+8>>2]+(a<<2)>>2]}b:{c:{d:{if(!c){a=0;break d}a=F[u+100>>2];e=F[u+96>>2];F[s+8>>2]=0;F[s>>2]=0;F[s+4>>2]=0;f=a-e|0;b=(f|0)/12|0;e:{if((a|0)==(e|0)){break e}if(b>>>0>=357913942){break c}d=ka(f);F[s>>2]=d;F[s+8>>2]=d+L(b,12);a=0;n=d;f=f-12|0;d=(f-((f>>>0)%12|0)|0)+12|0;f=ma(n,0,d);F[s+4>>2]=d+f;if(G[c+84|0]){c=b>>>0<=1?1:b;h=c&1;if(b>>>0>=2){g=c&-2;c=0;while(1){d=L(a,12);b=d+e|0;i=F[b+4>>2];j=F[b>>2];d=d+f|0;F[d+8>>2]=F[b+8>>2];F[d>>2]=j;F[d+4>>2]=i;d=L(a|1,12);b=d+e|0;i=F[b+4>>2];j=F[b>>2];d=d+f|0;F[d+8>>2]=F[b+8>>2];F[d>>2]=j;F[d+4>>2]=i;a=a+2|0;c=c+2|0;if((g|0)!=(c|0)){continue}break}}if(!h){break e}b=L(a,12);a=b+e|0;c=F[a+4>>2];e=F[a>>2];b=b+f|0;F[b+8>>2]=F[a+8>>2];F[b>>2]=e;F[b+4>>2]=c;break e}h=b>>>0<=1?1:b;a=F[c+68>>2];c=0;while(1){d=L(c,12);b=d+e|0;g=F[a+(F[b>>2]<<2)>>2];i=F[a+(F[b+4>>2]<<2)>>2];d=d+f|0;F[d+8>>2]=F[a+(F[b+8>>2]<<2)>>2];F[d+4>>2]=i;F[d>>2]=g;c=c+1|0;if((h|0)!=(c|0)){continue}break}}d=0;H=Z-16|0;Z=H;h=ka(88);Zb(h);C=Z-16|0;Z=C;F[h+80>>2]=0;F[h+84>>2]=0;a=F[h+76>>2];F[h+76>>2]=0;if(a){ja(a)}F[h+68>>2]=0;F[h+72>>2]=0;b=h- -64|0;a=F[b>>2];F[b>>2]=0;if(a){ja(a)}g=F[s+4>>2];b=F[s>>2];c=(g-b|0)/12|0;a=L(c,3);f=F[h>>2];e=F[h+4>>2]-f>>2;f:{if(a>>>0>e>>>0){nd(h,a-e|0);g=F[s+4>>2];b=F[s>>2];c=(g-b|0)/12|0;break f}if(a>>>0>=e>>>0){break f}F[h+4>>2]=f+(a<<2)}g:{if((b|0)==(g|0)){break g}e=c>>>0<=1?1:c;g=e&1;a=F[h>>2];if(c>>>0>=2){i=e&-2;c=0;while(1){e=L(d,12);j=e+a|0;f=b+e|0;F[j>>2]=F[f>>2];F[a+(e|4)>>2]=F[f+4>>2];F[j+8>>2]=F[f+8>>2];f=L(d|1,12);e=f+a|0;f=b+f|0;F[e>>2]=F[f>>2];F[e+4>>2]=F[f+4>>2];F[e+8>>2]=F[f+8>>2];d=d+2|0;c=c+2|0;if((i|0)!=(c|0)){continue}break}}if(!g){break g}c=L(d,12);a=c+a|0;b=b+c|0;F[a>>2]=F[b>>2];F[a+4>>2]=F[b+4>>2];F[a+8>>2]=F[b+8>>2]}F[C+12>>2]=-1;a=0;e=0;g=0;f=Z-32|0;Z=f;h:{i:{w=C+12|0;j:{if(!w){break j}c=F[h+4>>2];j=F[h>>2];d=c-j|0;i=d>>2;n=F[h+12>>2];b=F[h+16>>2]-n>>2;k:{if(i>>>0>b>>>0){ab(h+12|0,i-b|0,10228);c=F[h+4>>2];j=F[h>>2];d=c-j|0;i=d>>2;break k}if(b>>>0<=i>>>0){break k}F[h+16>>2]=n+(i<<2)}F[f+24>>2]=0;F[f+16>>2]=0;F[f+20>>2]=0;b=(c|0)==(j|0);if(!b){if((d|0)<0){break i}e=ka(d);F[f+20>>2]=e;F[f+16>>2]=e;F[f+24>>2]=(i<<2)+e}l:{m:{n:{o:{p:{if(d){while(1){i=F[(a<<2)+j>>2];b=F[f+20>>2]-e>>2;q:{if(i>>>0>>0){break q}F[f>>2]=0;d=i+1|0;if(d>>>0>b>>>0){Fa(f+16|0,d-b|0,f);j=F[h>>2];c=F[h+4>>2];e=F[f+16>>2];break q}if(b>>>0<=d>>>0){break q}F[f+20>>2]=(d<<2)+e}b=(i<<2)+e|0;F[b>>2]=F[b>>2]+1;a=a+1|0;d=c-j|0;i=d>>2;if(a>>>0>>0){continue}break}break p}d=0;if(!b){break o}break n}if((c|0)==(j|0)){d=0;break n}if(d>>>0>=2147483645){break m}}d=ka(d<<1);ma(d,255,i<<3)}F[f+8>>2]=0;F[f>>2]=0;F[f+4>>2]=0;b=F[f+20>>2];a=b-e|0;t=a>>2;r:{s:{if((b|0)==(e|0)){break s}if((a|0)<0){break r}q=ka(a);F[f>>2]=q;F[f+8>>2]=(t<<2)+q;b=ma(q,0,a);F[f+4>>2]=b+a;c=t>>>0<=1?1:t;n=c&3;a=0;if(c-1>>>0>=3){o=c&-4;while(1){c=g<<2;F[c+b>>2]=a;x=c|4;a=F[c+e>>2]+a|0;F[x+b>>2]=a;y=c|8;a=a+F[e+x>>2]|0;F[y+b>>2]=a;c=c|12;a=a+F[e+y>>2]|0;F[c+b>>2]=a;a=a+F[c+e>>2]|0;g=g+4|0;p=p+4|0;if((o|0)!=(p|0)){continue}break}}if(!n){break s}while(1){c=g<<2;F[c+b>>2]=a;g=g+1|0;a=F[c+e>>2]+a|0;k=k+1|0;if((n|0)!=(k|0)){continue}break}}if(!i){break l}x=F[h+40>>2];y=F[h+12>>2];n=0;while(1){I=n<<2;a=I+j|0;k=-1;c=n+1|0;b=(c>>>0)%3|0?c:n-2|0;if((b|0)!=-1){k=F[(b<<2)+j>>2]}b=F[a>>2];t:{u:{if(!((n>>>0)%3|0)){p=-1;a=n+2|0;if((a|0)!=-1){p=F[(a<<2)+j>>2]}if(!((b|0)==(k|0)|(b|0)==(p|0))&(k|0)!=(p|0)){break u}x=x+1|0;F[h+40>>2]=x;c=n+3|0;break t}p=F[a-4>>2]}a=p<<2;A=F[a+e>>2];v:{w:{if((A|0)<=0){break w}a=F[a+q>>2];g=0;while(1){o=(a<<3)+d|0;z=F[o>>2];if((z|0)==-1){break w}x:{if((k|0)!=(z|0)){break x}o=F[o+4>>2];if((o|0)!=-1){z=F[(o<<2)+j>>2]}else{z=-1}if((z|0)==(b|0)){break x}while(1){y:{b=a;g=g+1|0;if((A|0)<=(g|0)){break y}a=b+1|0;J=(a<<3)+d|0;z=F[J>>2];K=(b<<3)+d|0;F[K+4>>2]=F[J+4>>2];F[K>>2]=z;if((z|0)!=-1){continue}}break}F[(b<<3)+d>>2]=-1;if((o|0)==-1){break w}F[y+I>>2]=o;F[y+(o<<2)>>2]=n;break v}a=a+1|0;g=g+1|0;if((A|0)!=(g|0)){continue}break}}a=k<<2;k=F[a+e>>2];if((k|0)<=0){break v}a=F[a+q>>2];g=0;while(1){b=(a<<3)+d|0;if(F[b>>2]==-1){F[b>>2]=p;F[b+4>>2]=n;break v}a=a+1|0;g=g+1|0;if((k|0)!=(g|0)){continue}break}}}n=c;if(n>>>0>>0){continue}break}break l}break i}na();v()}F[w>>2]=t;if(q){ja(q)}if(d){ja(d)}a=F[f+16>>2];if(!a){break j}F[f+20>>2]=a;ja(a)}Z=f+32|0;x=(w|0)!=0;if(x){k=Z-32|0;Z=k;a=F[h>>2];g=F[h+4>>2];F[k+24>>2]=0;F[k+16>>2]=0;F[k+20>>2]=0;if((a|0)==(g|0)){c=g}else{a=g-a|0;if((a|0)<0){break i}a=a>>2;b=(a-1>>>5|0)+1|0;c=ka(b<<2);F[k+24>>2]=b;F[k+20>>2]=0;F[k+16>>2]=c;Yb(k+16|0,a);g=F[h>>2];c=F[h+4>>2]}F[k+8>>2]=0;F[k>>2]=0;while(1){z:{o=0;i=0;if((c|0)==(g|0)){break z}while(1){b=F[k+16>>2];A:{if(F[b+(i>>>3&536870908)>>2]>>>i&1){break A}c=F[k>>2];F[k+4>>2]=c;e=F[h+12>>2];a=i;while(1){B:{f=a+1|0;d=a;a=(f>>>0)%3|0?f:a-2|0;if((a|0)==-1){break B}a=F[e+(a<<2)>>2];if((a|0)==-1){break B}f=a+1|0;a=(f>>>0)%3|0?f:a-2|0;if((i|0)==(a|0)|(a|0)==-1){break B}if(!(F[b+(a>>>3&536870908)>>2]>>>a&1)){continue}}break}j=d;C:{D:{E:{while(1){a=F[k+16>>2]+(j>>>3&536870908)|0;F[a>>2]=F[a>>2]|1<>>0)%3|0?a:j-2|0;g=F[h>>2];y=(j>>>0)%3|0;b=(y?-1:2)+j|0;n=F[k>>2];A=(n|0)==(c|0);F:{if(A){break F}w=F[(f<<2)+g>>2];q=F[h+12>>2];a=n;if((b|0)!=-1){e=q+(b<<2)|0;while(1){G:{if((w|0)!=F[a>>2]){break G}p=F[a+4>>2];t=F[e>>2];if((p|0)==(t|0)){break G}e=b;c=-1;a=-1;if((p|0)==-1){break C}break D}a=a+8|0;if((c|0)!=(a|0)){continue}break}break F}while(1){if((w|0)==F[a>>2]){t=-1;e=-1;p=F[a+4>>2];if((p|0)!=-1){break D}}a=a+8|0;if((c|0)!=(a|0)){continue}break}}b=F[(b<<2)+g>>2];H:{if(F[k+8>>2]!=(c|0)){F[c>>2]=b;F[c+4>>2]=f;c=c+8|0;F[k+4>>2]=c;break H}a=c-n|0;p=a>>3;e=p+1|0;if(e>>>0>=536870912){break i}g=a>>>2|0;g=a>>>0>=2147483640?536870911:e>>>0>>0?g:e;if(g){if(g>>>0>=536870912){break E}e=ka(g<<3)}else{e=0}a=e+(p<<3)|0;F[a>>2]=b;F[a+4>>2]=f;b=a+8|0;if(!A){while(1){c=c-8|0;f=F[c+4>>2];a=a-8|0;F[a>>2]=F[c>>2];F[a+4>>2]=f;if((c|0)!=(n|0)){continue}break}c=F[k>>2]}F[k+8>>2]=e+(g<<3);F[k+4>>2]=b;F[k>>2]=a;if(c){ja(c)}c=b}I:{J:{if(y){a=j-1|0;break J}a=j+2|0;if((a|0)==-1){break I}}a=F[F[h+12>>2]+(a<<2)>>2];if((a|0)==-1){break I}j=a+((a>>>0)%3|0?-1:2)|0;if((d|0)==(j|0)){break I}if((j|0)!=-1){continue}}break}g=F[h>>2];break A}oa();v()}c=F[q+(p<<2)>>2];b=e;a=p}if((t|0)!=-1){F[q+(t<<2)>>2]=-1}if((c|0)!=-1){F[q+(c<<2)>>2]=-1}F[q+(b<<2)>>2]=-1;F[q+(a<<2)>>2]=-1;o=1}i=i+1|0;c=F[h+4>>2];if(i>>>0>2>>>0){continue}break}if(o){continue}}break}a=F[k>>2];if(a){ja(a)}a=F[k+16>>2];if(a){ja(a)}Z=k+32|0;n=0;g=Z-32|0;Z=g;e=F[C+12>>2];F[h+36>>2]=e;p=h+24|0;b=F[h+24>>2];a=F[h+28>>2]-b>>2;K:{L:{if(a>>>0>>0){ab(p,e-a|0,10228);F[g+24>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;break L}if(a>>>0>e>>>0){F[h+28>>2]=b+(e<<2)}F[g+24>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;if(!e){break K}}if((e|0)<0){break i}a=(e-1>>>5|0)+1|0;b=ka(a<<2);F[g+24>>2]=a;F[g+20>>2]=0;F[g+16>>2]=b;Yb(g+16|0,e)}a=F[h>>2];b=F[h+4>>2];F[g+8>>2]=0;F[g>>2]=0;F[g+4>>2]=0;M:{if((a|0)==(b|0)){a=b}else{a=b-a|0;if((a|0)<0){break i}a=a>>2;b=(a-1>>>5|0)+1|0;c=ka(b<<2);F[g+8>>2]=b;F[g+4>>2]=0;F[g>>2]=c;Yb(g,a);b=F[h>>2];a=F[h+4>>2]}if(a-b>>>0<12){break M}N:{while(1){q=L(n,3);d=(q<<2)+b|0;f=F[d>>2];c=-1;i=q+1|0;if((i|0)!=-1){c=F[(i<<2)+b>>2]}O:{if((c|0)==(f|0)){break O}i=f;f=F[d+8>>2];if((i|0)==(f|0)|(c|0)==(f|0)){break O}k=0;i=F[g>>2];while(1){f=k+q|0;if(!(F[(f>>>3&536870908)+i>>2]>>>f&1)){a=F[(f<<2)+b>>2];c=1<>2];b=a>>>5|0;i=F[d+(b<<2)>>2];t=c&i;if(t){c=F[h+28>>2];P:{if((c|0)!=F[h+32>>2]){F[c>>2]=-1;F[h+28>>2]=c+4;break P}i=F[p>>2];b=c-i|0;o=b>>2;d=o+1|0;if(d>>>0>=1073741824){break i}j=b>>>1|0;j=b>>>0>=2147483644?1073741823:d>>>0>>0?j:d;if(j){if(j>>>0>=1073741824){break N}b=ka(j<<2)}else{b=0}d=b+(o<<2)|0;F[d>>2]=-1;o=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;F[d>>2]=F[c>>2];if((c|0)!=(i|0)){continue}break}}F[h+32>>2]=b+(j<<2);F[h+28>>2]=o;F[h+24>>2]=d;if(!i){break P}ja(i)}c=F[h+52>>2];Q:{if((c|0)!=F[h+56>>2]){F[c>>2]=a;F[h+52>>2]=c+4;break Q}i=F[h+48>>2];b=c-i|0;o=b>>2;d=o+1|0;if(d>>>0>=1073741824){break i}j=b>>>1|0;j=b>>>0>=2147483644?1073741823:d>>>0>>0?j:d;if(j){if(j>>>0>=1073741824){break N}b=ka(j<<2)}else{b=0}d=b+(o<<2)|0;F[d>>2]=a;a=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;F[d>>2]=F[c>>2];if((c|0)!=(i|0)){continue}break}}F[h+56>>2]=b+(j<<2);F[h+52>>2]=a;F[h+48>>2]=d;if(!i){break Q}ja(i)}c=F[g+20>>2];a=F[g+24>>2];if((c|0)==a<<5){if((c+1|0)<0){break i}b=g+16|0;if(c>>>0<=1073741822){a=a<<6;c=(c&-32)+32|0;a=a>>>0>c>>>0?a:c}else{a=2147483647}$a(b,a);c=F[g+20>>2]}F[g+20>>2]=c+1;d=F[g+16>>2];a=d+(c>>>3&536870908)|0;b=F[a>>2];N=a,O=oi(c)&b,F[N>>2]=O;c=1<>>5|0;i=F[(b<<2)+d>>2];a=e;e=a+1|0}F[(b<<2)+d>>2]=c|i;o=F[h+24>>2]+(a<<2)|0;j=F[h+12>>2];b=F[h>>2];i=F[g>>2];c=f;R:{S:{T:{while(1){if((c|0)==-1){break T}d=(c>>>3&536870908)+i|0;F[d>>2]=F[d>>2]|1<>2]=c;if(t){F[(c<<2)+b>>2]=a}w=c+1|0;c=(w>>>0)%3|0?w:c-2|0;d=-1;U:{if((c|0)==-1){break U}c=F[j+(c<<2)>>2];d=-1;if((c|0)==-1){break U}d=c+1|0;d=(d>>>0)%3|0?d:c-2|0}c=d;if((f|0)!=(c|0)){continue}break}if((f|0)!=-1){break R}c=1;break S}if((f>>>0)%3|0){c=f-1|0;break S}c=f+2|0;if((c|0)==-1){break R}}c=F[j+(c<<2)>>2];if((c|0)==-1){break R}V:{if((c>>>0)%3|0){c=c-1|0;break V}c=c+2|0;if((c|0)==-1){break R}}f=F[h+12>>2];b=F[h>>2];while(1){d=(c>>>3&536870908)+i|0;F[d>>2]=F[d>>2]|1<>2]=a}W:{if((c>>>0)%3|0){c=c-1|0;break W}c=c+2|0;if((c|0)==-1){break R}}c=F[f+(c<<2)>>2];if((c|0)==-1){break R}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)!=-1){continue}break}}}k=k+1|0;if((k|0)!=3){continue}break}b=F[h>>2];a=F[h+4>>2]}n=n+1|0;if(n>>>0<(a-b>>2>>>0)/3>>>0){continue}break}break M}oa();v()}c=0;F[h+44>>2]=0;a=F[g+16>>2];b=F[g+20>>2];if(b){e=b&31;b=(b>>>3&536870908)+a|0;d=a;i=0;while(1){if(!(F[d>>2]>>>c&1)){i=i+1|0;F[h+44>>2]=i}f=(c|0)==31;c=f?0:c+1|0;d=(f<<2)+d|0;if((b|0)!=(d|0)|(c|0)!=(e|0)){continue}break}}b=F[g>>2];if(b){ja(b);a=F[g+16>>2]}if(a){ja(a)}Z=g+32|0}Z=C+16|0;if(!x){F[H+8>>2]=0;Za(h);h=0}Z=H+16|0;a=h;break h}na();v()}b=F[s>>2];if(!b){break d}F[s+4>>2]=b;ja(b)}Z=s+16|0;break b}na();v()}c=F[l+4>>2];b=a;F[l+4>>2]=a;if(c){Za(c);b=F[l+4>>2]}X:{if(!b){break X}a=F[u+100>>2];c=F[u+96>>2];D[r+12|0]=0;Ea(l+56|0,(a-c|0)/12|0,r+12|0);a=F[u+100>>2];c=F[u+96>>2];if((a|0)==(c|0)){break X}while(1){if(!(F[F[l+56>>2]+(E>>>3&536870908)>>2]>>>E&1)){a=L(E,3);Vb(l,0,a);c=F[l+8>>2];e=F[l+12>>2];Vb(l,1,a+1|0);f=F[l+20>>2];d=F[l+24>>2];Vb(l,2,a+2|0);n=(c|0)==(e|0)?-1:0;a=d-f>>2;c=e-c>>2;e=a>>>0>c>>>0;c=F[l+36>>2]-F[l+32>>2]>>2>>>0>(e?a:c)>>>0?2:e?1:n;Y:{if(F[l+68>>2]<=0){break Y}F[r+12>>2]=F[l+76>>2];F[r+8>>2]=m;Qa(r+8|0,r+12|0);a=F[((c<<2)+l|0)+44>>2];if((a|0)<0){a=-1}else{e=(a>>>0)/3|0;a=F[(F[F[l>>2]+96>>2]+L(e,12)|0)+(a-L(e,3)<<2)>>2]}F[r+12>>2]=a;F[r+8>>2]=m;Qa(r+8|0,r+12|0);e=F[l+72>>2];F[l+72>>2]=e+2;if(!(e&1)){break Y}F[r+12>>2]=a;F[r+8>>2]=m;Qa(r+8|0,r+12|0);F[l+72>>2]=F[l+72>>2]+1}d=0;e=Z-16|0;Z=e;F[l+68>>2]=F[l+68>>2]+1;a=L(c,12)+l|0;a=F[a+12>>2]-F[a+8>>2]|0;if((a|0)>0){a=a>>>2|0;h=a>>>0<=1?1:a;c=F[((c<<2)+l|0)+44>>2];while(1){a=c;f=(a>>>0)/3|0;c=(a|0)==-1;g=c?-1:f;i=F[l+56>>2]+(g>>>3&536870908)|0;F[i>>2]=F[i>>2]|1<>2]=F[l+72>>2]+1;Z:{_:{$:{aa:{ba:{if(!d){ca:{if((a|0)>=0){F[e+12>>2]=F[(F[F[l>>2]+96>>2]+L(f,12)|0)+((a>>>0)%3<<2)>>2];F[e+8>>2]=m;Qa(e+8|0,e+12|0);break ca}F[e+12>>2]=-1;F[e+8>>2]=m;Qa(e+8|0,e+12|0);if(c){break ba}}c=-1;f=a+1|0;f=(f>>>0)%3|0?f:a-2|0;if((f|0)>=0){g=(f>>>0)/3|0;f=F[(F[F[l>>2]+96>>2]+L(g,12)|0)+(f-L(g,3)<<2)>>2]}else{f=-1}F[e+12>>2]=f;F[e+8>>2]=m;Qa(e+8|0,e+12|0);f=((a>>>0)%3|0?-1:2)+a|0;if((f|0)<0){break aa}c=(f>>>0)/3|0;c=F[(F[F[l>>2]+96>>2]+L(c,12)|0)+(f-L(c,3)<<2)>>2];break aa}c=(a|0)<0?-1:F[(F[F[l>>2]+96>>2]+L(f,12)|0)+((a>>>0)%3<<2)>>2];F[l+76>>2]=c;F[e+12>>2]=c;F[e+8>>2]=m;Qa(e+8|0,e+12|0);if(d&1){c=-1;if((a|0)==-1){break Z}if((L(f,3)|0)!=(a|0)){a=a-1|0;break _}a=a+2|0;break $}c=-1;if((a|0)==-1){break Z}c=a+1|0;a=(c>>>0)%3|0?c:a-2|0;break $}c=-1;F[e+12>>2]=-1;F[e+8>>2]=m;Qa(e+8|0,e+12|0)}F[l+76>>2]=c;F[e+12>>2]=c;F[e+8>>2]=m;Qa(e+8|0,e+12|0)}c=-1;if((a|0)==-1){break Z}}c=F[F[F[l+4>>2]+12>>2]+(a<<2)>>2]}d=d+1|0;if((h|0)!=(d|0)){continue}break}}Z=e+16|0;c=F[u+96>>2];a=F[u+100>>2]}E=E+1|0;if(E>>>0<(a-c|0)/12>>>0){continue}break}}Z=r+16|0;da:{if(b){a=F[B>>2];if(a){F[B+4>>2]=a;ja(a)}F[B>>2]=F[m>>2];F[B+4>>2]=F[m+4>>2];F[B+8>>2]=F[m+8>>2];M=F[m+84>>2];break da}a=F[m>>2];if(!a){break da}F[m+4>>2]=a;ja(a)}a=F[m+72>>2];if(a){ja(a)}a=F[m+48>>2];if(a){F[m+52>>2]=a;ja(a)}a=F[m+36>>2];if(a){F[m+40>>2]=a;ja(a)}a=F[m+24>>2];if(a){F[m+28>>2]=a;ja(a)}a=F[m+20>>2];F[m+20>>2]=0;if(a){Za(a)}Z=m+96|0;return M|0}function sf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=b;a=0;b=0;a:{b:{switch(d-1|0){case 0:j=F[i+80>>2];h=G[c+24|0];c:{if((L(j,h)|0)!=(e|0)){break c}d=F[c+28>>2]!=1;b=G[c+84|0];if(!(d|!b)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);b=1;break c}if(h){a=ka(h);ma(a,0,h)}d:{if(!j){b=1;break d}if(!d){if(h){d=0;e=0;while(1){i=d+f|0;k=F[F[c>>2]>>2];m=F[c+48>>2];g=F[c+40>>2];b=ki(g,F[c+44>>2],G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],0);n=b;b=b+m|0;la(i,la(a,b+k|0,g),h);d=d+h|0;b=1;e=e+1|0;if((j|0)!=(e|0)){continue}break}break d}if(b){b=1;h=F[c>>2];e=F[c+48>>2];f=F[c+40>>2];i=F[c+44>>2];if((j|0)!=1){g=j&-2;c=0;d=0;while(1){k=F[h>>2];m=ki(f,i,c,0)+e|0;k=la(a,k+m|0,f);m=F[h>>2];n=ki(f,i,c|1,0)+e|0;la(k,m+n|0,f);c=c+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}g=c}if(!(j&1)){break d}c=F[h>>2];d=ki(g,0,f,i)+e|0;la(a,c+d|0,f);break d}b=1;h=F[c>>2];e=F[c+48>>2];g=F[c+68>>2];f=F[c+40>>2];i=F[c+44>>2];c=0;if((j|0)!=1){k=j&-2;d=0;while(1){m=F[h>>2];n=c<<2;l=ki(f,i,F[n+g>>2],0)+e|0;m=la(a,m+l|0,f);l=F[h>>2];n=ki(f,i,F[g+(n|4)>>2],0)+e|0;la(m,l+n|0,f);c=c+2|0;d=d+2|0;if((k|0)!=(d|0)){continue}break}}if(!(j&1)){break d}d=F[h>>2];c=ki(f,i,F[g+(c<<2)>>2],0)+e|0;la(a,c+d|0,f);break d}b=0;if(!h){d=0;while(1){if(!Cb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],a)){break d}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break d}d=0;e=0;while(1){if(!Cb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break d}la(d+f|0,a,h);d=d+h|0;e=e+1|0;b=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}}if(!a){break c}ja(a)}break a;case 2:n=G[c+24|0];l=n<<1;j=F[i+80>>2];e:{if((L(l,j)|0)!=(e|0)){break e}i=F[c+28>>2]!=3;d=G[c+84|0];if(!(i|!d)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);a=1;break e}f:{if(!n){e=0;break f}e=ka(l);ma(e,0,l)}g:{if(!j){a=1;break g}if(!i){o=F[c+68>>2];k=F[c>>2];b=F[c+48>>2];i=F[c+40>>2];m=F[c+44>>2];if(n){if(!d){c=0;d=0;while(1){a=1;g=F[k>>2];p=ki(i,m,F[o+(d<<2)>>2],0)+b|0;la((c<<1)+f|0,la(e,g+p|0,i),l);c=c+n|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break g}c=0;while(1){a=1;o=F[k>>2];p=ki(g,h,i,m)+b|0;la((c<<1)+f|0,la(e,o+p|0,i),l);c=c+n|0;d=h;g=g+1|0;d=g?d:d+1|0;h=d;if((j|0)!=(g|0)|d){continue}break}break g}if(!d){a=1;c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=F[k>>2];g=c<<2;n=ki(i,m,F[g+o>>2],0)+b|0;h=la(e,h+n|0,i);n=F[k>>2];g=ki(i,m,F[o+(g|4)>>2],0)+b|0;la(h,g+n|0,i);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break g}d=F[k>>2];b=ki(i,m,F[o+(c<<2)>>2],0)+b|0;la(e,b+d|0,i);break g}n=j&1;a=1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){d=F[k>>2];l=ki(g,h,i,m)+b|0;d=la(e,d+l|0,i);l=F[k>>2];o=ki(i,m,g|1,h)+b|0;la(d,l+o|0,i);g=g+2|0;h=g>>>0<2?h+1|0:h;f=f+2|0;d=f>>>0<2?c+1|0:c;c=d;if((f|0)!=(j|0)|c){continue}break}}if(!n){break g}c=F[k>>2];b=ki(g,h,i,m)+b|0;la(e,b+c|0,i);break g}if(!n){d=0;while(1){if(!Ab(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break g}d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break g}d=0;while(1){if(!Ab(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break g}la((b<<1)+f|0,e,l);b=b+n|0;d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break e}ja(e)}b=a;break a;case 4:l=G[c+24|0];o=l<<2;j=F[i+80>>2];h:{if((L(o,j)|0)!=(e|0)){break h}i=F[c+28>>2]!=5;d=G[c+84|0];if(!(i|!d)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);b=1;break h}i:{if(!l){e=0;break i}e=ka(o);ma(e,0,o)}b=1;j:{if(!j){break j}if(!i){a=F[c+68>>2];m=F[c>>2];i=F[c+48>>2];k=F[c+40>>2];n=F[c+44>>2];if(l){if(!d){c=0;d=0;while(1){g=F[m>>2];p=ki(k,n,F[a+(d<<2)>>2],0)+i|0;la((c<<2)+f|0,la(e,g+p|0,k),o);c=c+l|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break j}c=0;while(1){d=F[m>>2];p=ki(g,h,k,n)+i|0;la((c<<2)+f|0,la(e,d+p|0,k),o);c=c+l|0;g=g+1|0;a=g?h:h+1|0;h=a;if((j|0)!=(g|0)|h){continue}break}break j}if(!d){c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=F[m>>2];g=c<<2;l=ki(k,n,F[g+a>>2],0)+i|0;h=la(e,h+l|0,k);l=F[m>>2];g=ki(k,n,F[a+(g|4)>>2],0)+i|0;la(h,g+l|0,k);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break j}d=F[m>>2];a=ki(k,n,F[a+(c<<2)>>2],0)+i|0;la(e,a+d|0,k);break j}l=j&1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){a=F[m>>2];d=ki(g,h,k,n)+i|0;a=la(e,a+d|0,k);d=F[m>>2];o=ki(k,n,g|1,h)+i|0;la(a,d+o|0,k);d=h;g=g+2|0;h=g>>>0<2?d+1|0:d;f=f+2|0;a=f>>>0<2?c+1|0:c;c=a;if((f|0)!=(j|0)|c){continue}break}}if(!l){break j}a=F[m>>2];c=ki(g,h,k,n)+i|0;la(e,a+c|0,k);break j}b=0;if(!l){d=0;while(1){if(!yb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break j}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break j}d=0;while(1){if(!yb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break j}la((a<<2)+f|0,e,o);a=a+l|0;d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break h}ja(e)}break a;case 1:j=F[i+80>>2];h=G[c+24|0];k:{if((L(j,h)|0)!=(e|0)){break k}d=F[c+28>>2]!=2;b=G[c+84|0];if(!(d|!b)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);b=1;break k}if(h){a=ka(h);ma(a,0,h)}l:{if(!j){b=1;break l}if(!d){if(h){d=0;e=0;while(1){i=d+f|0;k=F[F[c>>2]>>2];m=F[c+48>>2];g=F[c+40>>2];b=ki(g,F[c+44>>2],G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],0);n=b;b=b+m|0;la(i,la(a,b+k|0,g),h);d=d+h|0;b=1;e=e+1|0;if((j|0)!=(e|0)){continue}break}break l}if(b){b=1;h=F[c>>2];e=F[c+48>>2];f=F[c+40>>2];i=F[c+44>>2];if((j|0)!=1){g=j&-2;c=0;d=0;while(1){k=F[h>>2];m=ki(f,i,c,0)+e|0;k=la(a,k+m|0,f);m=F[h>>2];n=ki(f,i,c|1,0)+e|0;la(k,m+n|0,f);c=c+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}g=c}if(!(j&1)){break l}c=F[h>>2];d=ki(g,0,f,i)+e|0;la(a,c+d|0,f);break l}b=1;h=F[c>>2];e=F[c+48>>2];g=F[c+68>>2];f=F[c+40>>2];i=F[c+44>>2];c=0;if((j|0)!=1){k=j&-2;d=0;while(1){m=F[h>>2];n=c<<2;l=ki(f,i,F[n+g>>2],0)+e|0;m=la(a,m+l|0,f);l=F[h>>2];n=ki(f,i,F[g+(n|4)>>2],0)+e|0;la(m,l+n|0,f);c=c+2|0;d=d+2|0;if((k|0)!=(d|0)){continue}break}}if(!(j&1)){break l}d=F[h>>2];c=ki(f,i,F[g+(c<<2)>>2],0)+e|0;la(a,c+d|0,f);break l}b=0;if(!h){d=0;while(1){if(!Bb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],a)){break l}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break l}d=0;e=0;while(1){if(!Bb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break l}la(d+f|0,a,h);d=d+h|0;e=e+1|0;b=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}}if(!a){break k}ja(a)}break a;case 3:n=G[c+24|0];l=n<<1;j=F[i+80>>2];m:{if((L(l,j)|0)!=(e|0)){break m}i=F[c+28>>2]!=4;d=G[c+84|0];if(!(i|!d)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);a=1;break m}n:{if(!n){e=0;break n}e=ka(l);ma(e,0,l)}o:{if(!j){a=1;break o}if(!i){o=F[c+68>>2];k=F[c>>2];b=F[c+48>>2];i=F[c+40>>2];m=F[c+44>>2];if(n){if(!d){c=0;d=0;while(1){a=1;g=F[k>>2];p=ki(i,m,F[o+(d<<2)>>2],0)+b|0;la((c<<1)+f|0,la(e,g+p|0,i),l);c=c+n|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break o}c=0;while(1){a=1;o=F[k>>2];p=ki(g,h,i,m)+b|0;la((c<<1)+f|0,la(e,o+p|0,i),l);c=c+n|0;d=h;g=g+1|0;d=g?d:d+1|0;h=d;if((j|0)!=(g|0)|d){continue}break}break o}if(!d){a=1;c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=F[k>>2];g=c<<2;n=ki(i,m,F[g+o>>2],0)+b|0;h=la(e,h+n|0,i);n=F[k>>2];g=ki(i,m,F[o+(g|4)>>2],0)+b|0;la(h,g+n|0,i);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break o}d=F[k>>2];b=ki(i,m,F[o+(c<<2)>>2],0)+b|0;la(e,b+d|0,i);break o}n=j&1;a=1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){d=F[k>>2];l=ki(g,h,i,m)+b|0;d=la(e,d+l|0,i);l=F[k>>2];o=ki(i,m,g|1,h)+b|0;la(d,l+o|0,i);g=g+2|0;h=g>>>0<2?h+1|0:h;f=f+2|0;d=f>>>0<2?c+1|0:c;c=d;if((f|0)!=(j|0)|c){continue}break}}if(!n){break o}c=F[k>>2];b=ki(g,h,i,m)+b|0;la(e,b+c|0,i);break o}if(!n){d=0;while(1){if(!zb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break o}d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break o}d=0;while(1){if(!zb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break o}la((b<<1)+f|0,e,l);b=b+n|0;d=d+1|0;a=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break m}ja(e)}b=a;break a;case 5:l=G[c+24|0];o=l<<2;j=F[i+80>>2];p:{if((L(o,j)|0)!=(e|0)){break p}i=F[c+28>>2]!=6;d=G[c+84|0];if(!(i|!d)){la(f,F[F[c>>2]>>2]+F[c+48>>2]|0,e);b=1;break p}q:{if(!l){e=0;break q}e=ka(o);ma(e,0,o)}b=1;r:{if(!j){break r}if(!i){a=F[c+68>>2];m=F[c>>2];i=F[c+48>>2];k=F[c+40>>2];n=F[c+44>>2];if(l){if(!d){c=0;d=0;while(1){g=F[m>>2];p=ki(k,n,F[a+(d<<2)>>2],0)+i|0;la((c<<2)+f|0,la(e,g+p|0,k),o);c=c+l|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}break r}c=0;while(1){d=F[m>>2];p=ki(g,h,k,n)+i|0;la((c<<2)+f|0,la(e,d+p|0,k),o);c=c+l|0;g=g+1|0;a=g?h:h+1|0;h=a;if((j|0)!=(g|0)|h){continue}break}break r}if(!d){c=0;if((j|0)!=1){f=j&-2;d=0;while(1){h=F[m>>2];g=c<<2;l=ki(k,n,F[g+a>>2],0)+i|0;h=la(e,h+l|0,k);l=F[m>>2];g=ki(k,n,F[a+(g|4)>>2],0)+i|0;la(h,g+l|0,k);c=c+2|0;d=d+2|0;if((f|0)!=(d|0)){continue}break}}if(!(j&1)){break r}d=F[m>>2];a=ki(k,n,F[a+(c<<2)>>2],0)+i|0;la(e,a+d|0,k);break r}l=j&1;if((j|0)!=1){j=j&-2;f=0;c=0;while(1){a=F[m>>2];d=ki(g,h,k,n)+i|0;a=la(e,a+d|0,k);d=F[m>>2];o=ki(k,n,g|1,h)+i|0;la(a,d+o|0,k);d=h;g=g+2|0;h=g>>>0<2?d+1|0:d;f=f+2|0;a=f>>>0<2?c+1|0:c;c=a;if((f|0)!=(j|0)|c){continue}break}}if(!l){break r}a=F[m>>2];c=ki(g,h,k,n)+i|0;la(e,a+c|0,k);break r}b=0;if(!l){d=0;while(1){if(!xb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break r}d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}break r}d=0;while(1){if(!xb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],e)){break r}la((a<<2)+f|0,e,o);a=a+l|0;d=d+1|0;b=j>>>0<=d>>>0;if((d|0)!=(j|0)){continue}break}}if(!e){break p}ja(e)}break a;case 8:p=G[c+24|0];q=p<<2;k=F[i+80>>2];s:{if((L(q,k)|0)!=(e|0)){break s}i=F[c+28>>2];t:{if(!p){break t}a=ka(q);d=a;m=q-4|0;l=(m>>>2|0)+1&7;if(l){e=0;while(1){F[d>>2]=-1073741824;d=d+4|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}if(m>>>0<28){break t}e=(p<<2)+a|0;while(1){F[d+24>>2]=-1073741824;F[d+28>>2]=-1073741824;F[d+16>>2]=-1073741824;F[d+20>>2]=-1073741824;F[d+8>>2]=-1073741824;F[d+12>>2]=-1073741824;F[d>>2]=-1073741824;F[d+4>>2]=-1073741824;d=d+32|0;if((e|0)!=(d|0)){continue}break}}u:{if(!k){b=1;break u}if((i|0)==9){r=F[c+68>>2];l=F[c>>2];i=F[c+48>>2];s=G[c+84|0];m=F[c+44>>2];c=F[c+40>>2];o=c;if(p){e=0;d=0;while(1){h=(e<<2)+f|0;g=F[l>>2];b=ki(c,m,s?d:F[r+(d<<2)>>2],0)+i|0;la(h,la(a,b+g|0,o),q);e=e+p|0;b=1;d=d+1|0;if((k|0)!=(d|0)){continue}break}break u}if(!s){b=1;d=0;if((k|0)!=1){f=k&-2;e=0;while(1){h=F[l>>2];g=d<<2;j=ki(c,m,F[g+r>>2],0)+i|0;h=la(a,h+j|0,o);j=F[l>>2];g=ki(c,m,F[r+(g|4)>>2],0)+i|0;la(h,j+g|0,o);d=d+2|0;e=e+2|0;if((f|0)!=(e|0)){continue}break}}if(!(k&1)){break u}e=F[l>>2];c=ki(c,m,F[r+(d<<2)>>2],0)+i|0;la(a,c+e|0,o);break u}f=k&1;b=1;if((k|0)!=1){k=k&-2;while(1){d=F[l>>2];e=ki(g,h,c,m)+i|0;d=la(a,d+e|0,o);e=F[l>>2];p=ki(c,m,g|1,h)+i|0;la(d,e+p|0,o);g=g+2|0;h=g>>>0<2?h+1|0:h;d=j;e=n+2|0;d=e>>>0<2?d+1|0:d;n=e;j=d;if((e|0)!=(k|0)|d){continue}break}}if(!f){break u}d=F[l>>2];c=ki(g,h,c,m)+i|0;la(a,c+d|0,o);break u}if(!p){d=0;while(1){if(!lb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],a)){break u}d=d+1|0;b=k>>>0<=d>>>0;if((d|0)!=(k|0)){continue}break}break u}e=0;d=0;while(1){if(!lb(c,G[c+84|0]?d:F[F[c+68>>2]+(d<<2)>>2],D[c+24|0],a)){break u}la((e<<2)+f|0,a,q);e=e+p|0;d=d+1|0;b=k>>>0<=d>>>0;if((d|0)!=(k|0)){continue}break}}if(!a){break s}ja(a)}a=b;break;default:break b}}b=a}return b|0}function Pd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=Z-80|0;Z=h;e=F[c+36>>2];F[h+72>>2]=F[c+32>>2];F[h+76>>2]=e;f=F[c+28>>2];e=h- -64|0;F[e>>2]=F[c+24>>2];F[e+4>>2]=f;e=F[c+20>>2];F[h+56>>2]=F[c+16>>2];F[h+60>>2]=e;e=F[c+12>>2];F[h+48>>2]=F[c+8>>2];F[h+52>>2]=e;e=F[c+4>>2];F[h+40>>2]=F[c>>2];F[h+44>>2]=e;jc(a,h+40|0,h+24|0);a:{if(F[a>>2]){break a}if(D[a+15|0]<0){ja(F[a+4>>2])}if(G[h+31|0]!=1){b=ka(32);D[b+20|0]=0;c=G[1446]|G[1447]<<8|(G[1448]<<16|G[1449]<<24);D[b+16|0]=c;D[b+17|0]=c>>>8;D[b+18|0]=c>>>16;D[b+19|0]=c>>>24;c=G[1442]|G[1443]<<8|(G[1444]<<16|G[1445]<<24);d=G[1438]|G[1439]<<8|(G[1440]<<16|G[1441]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1434]|G[1435]<<8|(G[1436]<<16|G[1437]<<24);d=G[1430]|G[1431]<<8|(G[1432]<<16|G[1433]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,20);ja(b);break a}j=Z-16|0;Z=j;b:{c:{switch(G[h+32|0]){case 0:e=Kd(ka(48));F[e>>2]=9864;F[h+8>>2]=0;F[h+12>>2]=0;F[h>>2]=0;F[h+4>>2]=0;F[h+16>>2]=e;break b;case 1:e=Kd(ka(52));F[e+48>>2]=0;F[e>>2]=8176;F[h+8>>2]=0;F[h+12>>2]=0;F[h>>2]=0;F[h+4>>2]=0;F[h+16>>2]=e;break b;default:break c}}f=ka(32);D[f+28|0]=0;e=G[1520]|G[1521]<<8|(G[1522]<<16|G[1523]<<24);D[f+24|0]=e;D[f+25|0]=e>>>8;D[f+26|0]=e>>>16;D[f+27|0]=e>>>24;e=G[1516]|G[1517]<<8|(G[1518]<<16|G[1519]<<24);g=G[1512]|G[1513]<<8|(G[1514]<<16|G[1515]<<24);D[f+16|0]=g;D[f+17|0]=g>>>8;D[f+18|0]=g>>>16;D[f+19|0]=g>>>24;D[f+20|0]=e;D[f+21|0]=e>>>8;D[f+22|0]=e>>>16;D[f+23|0]=e>>>24;e=G[1508]|G[1509]<<8|(G[1510]<<16|G[1511]<<24);g=G[1504]|G[1505]<<8|(G[1506]<<16|G[1507]<<24);D[f+8|0]=g;D[f+9|0]=g>>>8;D[f+10|0]=g>>>16;D[f+11|0]=g>>>24;D[f+12|0]=e;D[f+13|0]=e>>>8;D[f+14|0]=e>>>16;D[f+15|0]=e>>>24;e=G[1500]|G[1501]<<8|(G[1502]<<16|G[1503]<<24);g=G[1496]|G[1497]<<8|(G[1498]<<16|G[1499]<<24);D[f|0]=g;D[f+1|0]=g>>>8;D[f+2|0]=g>>>16;D[f+3|0]=g>>>24;D[f+4|0]=e;D[f+5|0]=e>>>8;D[f+6|0]=e>>>16;D[f+7|0]=e>>>24;F[j>>2]=-1;e=j|4;ra(e,f,28);k=D[j+15|0];F[h>>2]=F[j>>2];g=h+4|0;d:{if((k|0)>=0){k=F[e+4>>2];F[g>>2]=F[e>>2];F[g+4>>2]=k;F[g+8>>2]=F[e+8>>2];F[h+16>>2]=0;break d}ra(g,F[j+4>>2],F[j+8>>2]);e=D[j+15|0];F[h+16>>2]=0;if((e|0)>=0){break d}ja(F[j+4>>2])}ja(f)}Z=j+16|0;e=F[h>>2];e:{if(e){F[a>>2]=e;a=a+4|0;if(D[h+15|0]>=0){b=h|4;c=F[b+4>>2];F[a>>2]=F[b>>2];F[a+4>>2]=c;F[a+8>>2]=F[b+8>>2];break e}ra(a,F[h+4>>2],F[h+8>>2]);break e}e=F[h+16>>2];F[h+16>>2]=0;F[e+44>>2]=d;f=Z-32|0;Z=f;F[e+32>>2]=c;F[e+40>>2]=b;F[e+4>>2]=d;jc(a,c,f+16|0);f:{if(F[a>>2]){break f}if(D[a+15|0]<0){ja(F[a+4>>2])}b=G[f+23|0];if(($[F[F[e>>2]+8>>2]](e)|0)!=(b|0)){b=ka(64);D[b+50|0]=0;c=G[1304]|G[1305]<<8;D[b+48|0]=c;D[b+49|0]=c>>>8;c=G[1300]|G[1301]<<8|(G[1302]<<16|G[1303]<<24);d=G[1296]|G[1297]<<8|(G[1298]<<16|G[1299]<<24);D[b+40|0]=d;D[b+41|0]=d>>>8;D[b+42|0]=d>>>16;D[b+43|0]=d>>>24;D[b+44|0]=c;D[b+45|0]=c>>>8;D[b+46|0]=c>>>16;D[b+47|0]=c>>>24;c=G[1292]|G[1293]<<8|(G[1294]<<16|G[1295]<<24);d=G[1288]|G[1289]<<8|(G[1290]<<16|G[1291]<<24);D[b+32|0]=d;D[b+33|0]=d>>>8;D[b+34|0]=d>>>16;D[b+35|0]=d>>>24;D[b+36|0]=c;D[b+37|0]=c>>>8;D[b+38|0]=c>>>16;D[b+39|0]=c>>>24;c=G[1284]|G[1285]<<8|(G[1286]<<16|G[1287]<<24);d=G[1280]|G[1281]<<8|(G[1282]<<16|G[1283]<<24);D[b+24|0]=d;D[b+25|0]=d>>>8;D[b+26|0]=d>>>16;D[b+27|0]=d>>>24;D[b+28|0]=c;D[b+29|0]=c>>>8;D[b+30|0]=c>>>16;D[b+31|0]=c>>>24;c=G[1276]|G[1277]<<8|(G[1278]<<16|G[1279]<<24);d=G[1272]|G[1273]<<8|(G[1274]<<16|G[1275]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1268]|G[1269]<<8|(G[1270]<<16|G[1271]<<24);d=G[1264]|G[1265]<<8|(G[1266]<<16|G[1267]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1260]|G[1261]<<8|(G[1262]<<16|G[1263]<<24);d=G[1256]|G[1257]<<8|(G[1258]<<16|G[1259]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,50);ja(b);break f}c=G[f+21|0];D[e+36|0]=c;d=G[f+22|0];D[e+37|0]=d;if((c|0)!=2){b=ka(32);D[b+26|0]=0;c=G[1427]|G[1428]<<8;D[b+24|0]=c;D[b+25|0]=c>>>8;c=G[1423]|G[1424]<<8|(G[1425]<<16|G[1426]<<24);d=G[1419]|G[1420]<<8|(G[1421]<<16|G[1422]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1415]|G[1416]<<8|(G[1417]<<16|G[1418]<<24);d=G[1411]|G[1412]<<8|(G[1413]<<16|G[1414]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1407]|G[1408]<<8|(G[1409]<<16|G[1410]<<24);d=G[1403]|G[1404]<<8|(G[1405]<<16|G[1406]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-5;ra(a+4|0,b,26);ja(b);break f}b=b?2:3;if((b|0)!=(d|0)){b=ka(32);D[b+26|0]=0;c=G[1400]|G[1401]<<8;D[b+24|0]=c;D[b+25|0]=c>>>8;c=G[1396]|G[1397]<<8|(G[1398]<<16|G[1399]<<24);d=G[1392]|G[1393]<<8|(G[1394]<<16|G[1395]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1388]|G[1389]<<8|(G[1390]<<16|G[1391]<<24);d=G[1384]|G[1385]<<8|(G[1386]<<16|G[1387]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1380]|G[1381]<<8|(G[1382]<<16|G[1383]<<24);d=G[1376]|G[1377]<<8|(G[1378]<<16|G[1379]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-5;ra(a+4|0,b,26);ja(b);break f}E[F[e+32>>2]+38>>1]=b|512;g:{if(E[f+26>>1]>=0){break g}j=Z-16|0;Z=j;d=ka(36);b=d;F[b+4>>2]=0;F[b+8>>2]=0;F[b+24>>2]=0;F[b+28>>2]=0;b=b+16|0;F[b>>2]=0;F[b+4>>2]=0;F[d>>2]=d+4;F[d+32>>2]=0;F[d+12>>2]=b;F[j>>2]=0;c=F[e+32>>2];k=Z-16|0;Z=k;b=0;h:{if(!d){break h}F[j>>2]=c;F[k+12>>2]=0;b=0;if(!fb(1,k+12|0,c)){break h}n=F[k+12>>2];if(n){while(1){i:{if(fb(1,k+8|0,F[j>>2])){b=ka(28);F[b+4>>2]=0;F[b+8>>2]=0;c=b+16|0;F[c>>2]=0;F[c+4>>2]=0;F[b>>2]=b+4;F[b+12>>2]=c;F[b+24>>2]=F[k+8>>2];if(Vc(j,b)){break i}Ca(b+12|0,F[b+16>>2]);Ba(b,F[b+4>>2]);ja(b)}b=0;break h}g=Z-16|0;Z=g;F[g+8>>2]=b;j:{if(!b){break j}c=F[d+28>>2];k:{if(c>>>0>2]){F[g+8>>2]=0;F[c>>2]=b;F[d+28>>2]=c+4;break k}c=0;l:{m:{n:{i=F[d+24>>2];m=F[d+28>>2]-i>>2;b=m+1|0;if(b>>>0<1073741824){i=F[d+32>>2]-i|0;l=i>>>1|0;i=i>>>0>=2147483644?1073741823:b>>>0>>0?l:b;if(i){if(i>>>0>=1073741824){break n}c=ka(i<<2)}l=F[g+8>>2];F[g+8>>2]=0;b=(m<<2)+c|0;F[b>>2]=l;i=(i<<2)+c|0;m=b+4|0;c=F[d+28>>2];l=F[d+24>>2];if((c|0)==(l|0)){break m}while(1){c=c-4|0;p=F[c>>2];F[c>>2]=0;b=b-4|0;F[b>>2]=p;if((c|0)!=(l|0)){continue}break}F[d+32>>2]=i;i=F[d+28>>2];F[d+28>>2]=m;c=F[d+24>>2];F[d+24>>2]=b;if((c|0)==(i|0)){break l}while(1){i=i-4|0;b=F[i>>2];F[i>>2]=0;if(b){Ca(b+12|0,F[b+16>>2]);Ba(b,F[b+4>>2]);ja(b)}if((c|0)!=(i|0)){continue}break}break l}na();v()}oa();v()}F[d+32>>2]=i;F[d+28>>2]=m;F[d+24>>2]=b}if(c){ja(c)}}b=F[g+8>>2];F[g+8>>2]=0;if(!b){break j}Ca(b+12|0,F[b+16>>2]);Ba(b,F[b+4>>2]);ja(b)}Z=g+16|0;o=o+1|0;if((n|0)!=(o|0)){continue}break}}b=Vc(j,d)}Z=k+16|0;o:{if(b){c=F[e+4>>2];b=F[c+4>>2];F[c+4>>2]=d;if(b){ic(b)}F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0;break o}b=ka(32);D[b+26|0]=0;c=G[1549]|G[1550]<<8;D[b+24|0]=c;D[b+25|0]=c>>>8;c=G[1545]|G[1546]<<8|(G[1547]<<16|G[1548]<<24);g=G[1541]|G[1542]<<8|(G[1543]<<16|G[1544]<<24);D[b+16|0]=g;D[b+17|0]=g>>>8;D[b+18|0]=g>>>16;D[b+19|0]=g>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1537]|G[1538]<<8|(G[1539]<<16|G[1540]<<24);g=G[1533]|G[1534]<<8|(G[1535]<<16|G[1536]<<24);D[b+8|0]=g;D[b+9|0]=g>>>8;D[b+10|0]=g>>>16;D[b+11|0]=g>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1529]|G[1530]<<8|(G[1531]<<16|G[1532]<<24);g=G[1525]|G[1526]<<8|(G[1527]<<16|G[1528]<<24);D[b|0]=g;D[b+1|0]=g>>>8;D[b+2|0]=g>>>16;D[b+3|0]=g>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,26);ja(b);F[j+8>>2]=0;ic(d)}Z=j+16|0;if(F[a>>2]){break f}if(D[a+15|0]>=0){break g}ja(F[a+4>>2])}if(!($[F[F[e>>2]+12>>2]](e)|0)){b=ka(48);D[b+33|0]=0;D[b+32|0]=G[1374];c=G[1370]|G[1371]<<8|(G[1372]<<16|G[1373]<<24);d=G[1366]|G[1367]<<8|(G[1368]<<16|G[1369]<<24);D[b+24|0]=d;D[b+25|0]=d>>>8;D[b+26|0]=d>>>16;D[b+27|0]=d>>>24;D[b+28|0]=c;D[b+29|0]=c>>>8;D[b+30|0]=c>>>16;D[b+31|0]=c>>>24;c=G[1362]|G[1363]<<8|(G[1364]<<16|G[1365]<<24);d=G[1358]|G[1359]<<8|(G[1360]<<16|G[1361]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1354]|G[1355]<<8|(G[1356]<<16|G[1357]<<24);d=G[1350]|G[1351]<<8|(G[1352]<<16|G[1353]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1346]|G[1347]<<8|(G[1348]<<16|G[1349]<<24);d=G[1342]|G[1343]<<8|(G[1344]<<16|G[1345]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,33);ja(b);break f}if(!($[F[F[e>>2]+20>>2]](e)|0)){b=Eb(f,1552);F[a>>2]=-1;c=a+4|0;if(D[b+11|0]>=0){d=F[b+4>>2];F[c>>2]=F[b>>2];F[c+4>>2]=d;F[c+8>>2]=F[b+8>>2];break f}ra(c,F[b>>2],F[b+4>>2]);if(D[b+11|0]>=0){break f}ja(F[b>>2]);break f}if(!($[F[F[e>>2]+24>>2]](e)|0)){b=Eb(f,1307);F[a>>2]=-1;c=a+4|0;if(D[b+11|0]>=0){d=F[b+4>>2];F[c>>2]=F[b>>2];F[c+4>>2]=d;F[c+8>>2]=F[b+8>>2];break f}ra(c,F[b>>2],F[b+4>>2]);if(D[b+11|0]>=0){break f}ja(F[b>>2]);break f}F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0}Z=f+32|0;if(!F[a>>2]){if(D[a+15|0]<0){ja(F[a+4>>2])}F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0}$[F[F[e>>2]+4>>2]](e)}a=F[h+16>>2];F[h+16>>2]=0;if(a){$[F[F[a>>2]+4>>2]](a)}if(D[h+15|0]>=0){break a}ja(F[h+4>>2])}Z=h+80|0}function Ub(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=Z-16|0;Z=l;a:{b:{c:{d:{e:{f:{g:{h:{i:{if(a>>>0<=244){g=F[2941];h=a>>>0<11?16:a+11&-8;c=h>>>3|0;b=g>>>c|0;if(b&3){c=c+((b^-1)&1)|0;a=c<<3;b=a+11804|0;d=F[a+11812>>2];a=F[d+8>>2];j:{if((b|0)==(a|0)){m=11764,n=oi(c)&g,F[m>>2]=n;break j}F[a+12>>2]=b;F[b+8>>2]=a}a=d+8|0;b=c<<3;F[d+4>>2]=b|3;b=b+d|0;F[b+4>>2]=F[b+4>>2]|1;break a}k=F[2943];if(k>>>0>=h>>>0){break i}if(b){a=2<>2];a=F[e+8>>2];k:{if((b|0)==(a|0)){g=oi(d)&g;F[2941]=g;break k}F[a+12>>2]=b;F[b+8>>2]=a}F[e+4>>2]=h|3;c=e+h|0;a=d<<3;d=a-h|0;F[c+4>>2]=d|1;F[a+e>>2]=d;if(k){b=(k&-8)+11804|0;f=F[2946];a=1<<(k>>>3);l:{if(!(a&g)){F[2941]=a|g;a=b;break l}a=F[b+8>>2]}F[b+8>>2]=f;F[a+12>>2]=f;F[f+12>>2]=b;F[f+8>>2]=a}a=e+8|0;F[2946]=c;F[2943]=d;break a}j=F[2942];if(!j){break i}c=F[(ji(0-j&j)<<2)+12068>>2];f=(F[c+4>>2]&-8)-h|0;b=c;while(1){m:{a=F[b+16>>2];if(!a){a=F[b+20>>2];if(!a){break m}}b=(F[a+4>>2]&-8)-h|0;d=b>>>0>>0;f=d?b:f;c=d?a:c;b=a;continue}break}i=F[c+24>>2];d=F[c+12>>2];if((d|0)!=(c|0)){a=F[c+8>>2];F[a+12>>2]=d;F[d+8>>2]=a;break b}b=c+20|0;a=F[b>>2];if(!a){a=F[c+16>>2];if(!a){break h}b=c+16|0}while(1){e=b;d=a;b=a+20|0;a=F[b>>2];if(a){continue}b=d+16|0;a=F[d+16>>2];if(a){continue}break}F[e>>2]=0;break b}h=-1;if(a>>>0>4294967231){break i}a=a+11|0;h=a&-8;j=F[2942];if(!j){break i}f=0-h|0;g=0;n:{if(h>>>0<256){break n}g=31;if(h>>>0>16777215){break n}a=O(a>>>8|0);g=((h>>>38-a&1)-(a<<1)|0)+62|0}b=F[(g<<2)+12068>>2];o:{p:{q:{if(!b){a=0;break q}a=0;c=h<<((g|0)!=31?25-(g>>>1|0)|0:0);while(1){r:{e=(F[b+4>>2]&-8)-h|0;if(e>>>0>=f>>>0){break r}d=b;f=e;if(e){break r}f=0;a=b;break p}e=F[b+20>>2];b=F[((c>>>29&4)+b|0)+16>>2];a=e?(e|0)==(b|0)?a:e:a;c=c<<1;if(b){continue}break}}if(!(a|d)){d=0;a=2<>2]}if(!a){break o}}while(1){b=(F[a+4>>2]&-8)-h|0;c=b>>>0>>0;f=c?b:f;d=c?a:d;b=F[a+16>>2];if(b){a=b}else{a=F[a+20>>2]}if(a){continue}break}}if(!d|F[2943]-h>>>0<=f>>>0){break i}g=F[d+24>>2];c=F[d+12>>2];if((d|0)!=(c|0)){a=F[d+8>>2];F[a+12>>2]=c;F[c+8>>2]=a;break c}b=d+20|0;a=F[b>>2];if(!a){a=F[d+16>>2];if(!a){break g}b=d+16|0}while(1){e=b;c=a;b=a+20|0;a=F[b>>2];if(a){continue}b=c+16|0;a=F[c+16>>2];if(a){continue}break}F[e>>2]=0;break c}a=F[2943];if(a>>>0>=h>>>0){d=F[2946];b=a-h|0;s:{if(b>>>0>=16){c=d+h|0;F[c+4>>2]=b|1;F[a+d>>2]=b;F[d+4>>2]=h|3;break s}F[d+4>>2]=a|3;a=a+d|0;F[a+4>>2]=F[a+4>>2]|1;c=0;b=0}F[2943]=b;F[2946]=c;a=d+8|0;break a}i=F[2944];if(i>>>0>h>>>0){b=i-h|0;F[2944]=b;c=F[2947];a=c+h|0;F[2947]=a;F[a+4>>2]=b|1;F[c+4>>2]=h|3;a=c+8|0;break a}a=0;j=h+47|0;if(F[3059]){c=F[3061]}else{F[3062]=-1;F[3063]=-1;F[3060]=4096;F[3061]=4096;F[3059]=l+12&-16^1431655768;F[3064]=0;F[3052]=0;c=4096}e=j+c|0;f=0-c|0;b=e&f;if(b>>>0<=h>>>0){break a}d=F[3051];if(d){c=F[3049];g=c+b|0;if(d>>>0>>0|c>>>0>=g>>>0){break a}}t:{if(!(G[12208]&4)){u:{v:{w:{x:{d=F[2947];if(d){a=12212;while(1){c=F[a>>2];if(c>>>0<=d>>>0&d>>>0>2]>>>0){break x}a=F[a+8>>2];if(a){continue}break}}c=eb(0);if((c|0)==-1){break u}g=b;d=F[3060];a=d-1|0;if(a&c){g=(b-c|0)+(a+c&0-d)|0}if(g>>>0<=h>>>0){break u}d=F[3051];if(d){a=F[3049];f=a+g|0;if(d>>>0>>0|a>>>0>=f>>>0){break u}}a=eb(g);if((c|0)!=(a|0)){break w}break t}g=f&e-i;c=eb(g);if((c|0)==(F[a>>2]+F[a+4>>2]|0)){break v}a=c}if((a|0)==-1){break u}if(h+48>>>0<=g>>>0){c=a;break t}c=F[3061];c=c+(j-g|0)&0-c;if((eb(c)|0)==-1){break u}g=c+g|0;c=a;break t}if((c|0)!=-1){break t}}F[3052]=F[3052]|4}c=eb(b);a=eb(0);if((c|0)==-1|(a|0)==-1|a>>>0<=c>>>0){break d}g=a-c|0;if(g>>>0<=h+40>>>0){break d}}a=F[3049]+g|0;F[3049]=a;if(a>>>0>I[3050]){F[3050]=a}y:{e=F[2947];if(e){a=12212;while(1){d=F[a>>2];b=F[a+4>>2];if((d+b|0)==(c|0)){break y}a=F[a+8>>2];if(a){continue}break}break f}a=F[2945];if(!(a>>>0<=c>>>0?a:0)){F[2945]=c}a=0;F[3054]=g;F[3053]=c;F[2949]=-1;F[2950]=F[3059];F[3056]=0;while(1){d=a<<3;b=d+11804|0;F[d+11812>>2]=b;F[d+11816>>2]=b;a=a+1|0;if((a|0)!=32){continue}break}d=g-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;F[2944]=b;a=a+c|0;F[2947]=a;F[a+4>>2]=b|1;F[(c+d|0)+4>>2]=40;F[2948]=F[3063];break e}if(G[a+12|0]&8|d>>>0>e>>>0|c>>>0<=e>>>0){break f}F[a+4>>2]=b+g;a=e+8&7?-8-e&7:0;c=a+e|0;F[2947]=c;b=F[2944]+g|0;a=b-a|0;F[2944]=a;F[c+4>>2]=a|1;F[(b+e|0)+4>>2]=40;F[2948]=F[3063];break e}d=0;break b}c=0;break c}if(I[2945]>c>>>0){F[2945]=c}b=c+g|0;a=12212;z:{A:{B:{C:{D:{E:{while(1){if((b|0)!=F[a>>2]){a=F[a+8>>2];if(a){continue}break E}break}if(!(G[a+12|0]&8)){break D}}a=12212;while(1){b=F[a>>2];if(b>>>0<=e>>>0){f=b+F[a+4>>2]|0;if(f>>>0>e>>>0){break C}}a=F[a+8>>2];continue}}F[a>>2]=c;F[a+4>>2]=F[a+4>>2]+g;j=(c+8&7?-8-c&7:0)+c|0;F[j+4>>2]=h|3;g=b+(b+8&7?-8-b&7:0)|0;i=h+j|0;a=g-i|0;if((e|0)==(g|0)){F[2947]=i;a=F[2944]+a|0;F[2944]=a;F[i+4>>2]=a|1;break A}if(F[2946]==(g|0)){F[2946]=i;a=F[2943]+a|0;F[2943]=a;F[i+4>>2]=a|1;F[a+i>>2]=a;break A}f=F[g+4>>2];if((f&3)==1){e=f&-8;F:{if(f>>>0<=255){d=F[g+8>>2];b=f>>>3|0;c=F[g+12>>2];if((c|0)==(d|0)){m=11764,n=F[2941]&oi(b),F[m>>2]=n;break F}F[d+12>>2]=c;F[c+8>>2]=d;break F}h=F[g+24>>2];c=F[g+12>>2];G:{if((g|0)!=(c|0)){b=F[g+8>>2];F[b+12>>2]=c;F[c+8>>2]=b;break G}H:{f=g+20|0;b=F[f>>2];if(b){break H}f=g+16|0;b=F[f>>2];if(b){break H}c=0;break G}while(1){d=f;c=b;f=c+20|0;b=F[f>>2];if(b){continue}f=c+16|0;b=F[c+16>>2];if(b){continue}break}F[d>>2]=0}if(!h){break F}d=F[g+28>>2];b=(d<<2)+12068|0;I:{if(F[b>>2]==(g|0)){F[b>>2]=c;if(c){break I}m=11768,n=F[2942]&oi(d),F[m>>2]=n;break F}F[h+(F[h+16>>2]==(g|0)?16:20)>>2]=c;if(!c){break F}}F[c+24>>2]=h;b=F[g+16>>2];if(b){F[c+16>>2]=b;F[b+24>>2]=c}b=F[g+20>>2];if(!b){break F}F[c+20>>2]=b;F[b+24>>2]=c}g=e+g|0;f=F[g+4>>2];a=a+e|0}F[g+4>>2]=f&-2;F[i+4>>2]=a|1;F[a+i>>2]=a;if(a>>>0<=255){b=(a&-8)+11804|0;c=F[2941];a=1<<(a>>>3);J:{if(!(c&a)){F[2941]=a|c;a=b;break J}a=F[b+8>>2]}F[b+8>>2]=i;F[a+12>>2]=i;F[i+12>>2]=b;F[i+8>>2]=a;break A}f=31;if(a>>>0<=16777215){b=O(a>>>8|0);f=((a>>>38-b&1)-(b<<1)|0)+62|0}F[i+28>>2]=f;F[i+16>>2]=0;F[i+20>>2]=0;b=(f<<2)+12068|0;d=F[2942];c=1<>2]=i;break K}f=a<<((f|0)!=31?25-(f>>>1|0)|0:0);c=F[b>>2];while(1){b=c;if((F[c+4>>2]&-8)==(a|0)){break B}c=f>>>29|0;f=f<<1;d=(c&4)+b|0;c=F[d+16>>2];if(c){continue}break}F[d+16>>2]=i}F[i+24>>2]=b;F[i+12>>2]=i;F[i+8>>2]=i;break A}d=g-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;F[2944]=b;a=a+c|0;F[2947]=a;F[a+4>>2]=b|1;F[(c+d|0)+4>>2]=40;F[2948]=F[3063];a=(f+(f-39&7?39-f&7:0)|0)-47|0;d=a>>>0>>0?e:a;F[d+4>>2]=27;a=F[3056];F[d+16>>2]=F[3055];F[d+20>>2]=a;a=F[3054];F[d+8>>2]=F[3053];F[d+12>>2]=a;F[3055]=d+8;F[3054]=g;F[3053]=c;F[3056]=0;a=d+24|0;while(1){F[a+4>>2]=7;b=a+8|0;a=a+4|0;if(b>>>0>>0){continue}break}if((d|0)==(e|0)){break e}F[d+4>>2]=F[d+4>>2]&-2;f=d-e|0;F[e+4>>2]=f|1;F[d>>2]=f;if(f>>>0<=255){b=(f&-8)+11804|0;c=F[2941];a=1<<(f>>>3);L:{if(!(c&a)){F[2941]=a|c;a=b;break L}a=F[b+8>>2]}F[b+8>>2]=e;F[a+12>>2]=e;F[e+12>>2]=b;F[e+8>>2]=a;break e}a=31;if(f>>>0<=16777215){a=O(f>>>8|0);a=((f>>>38-a&1)-(a<<1)|0)+62|0}F[e+28>>2]=a;F[e+16>>2]=0;F[e+20>>2]=0;b=(a<<2)+12068|0;d=F[2942];c=1<>2]=e;break M}a=f<<((a|0)!=31?25-(a>>>1|0)|0:0);d=F[b>>2];while(1){b=d;if((f|0)==(F[b+4>>2]&-8)){break z}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;d=F[c+16>>2];if(d){continue}break}F[c+16>>2]=e}F[e+24>>2]=b;F[e+12>>2]=e;F[e+8>>2]=e;break e}a=F[b+8>>2];F[a+12>>2]=i;F[b+8>>2]=i;F[i+24>>2]=0;F[i+12>>2]=b;F[i+8>>2]=a}a=j+8|0;break a}a=F[b+8>>2];F[a+12>>2]=e;F[b+8>>2]=e;F[e+24>>2]=0;F[e+12>>2]=b;F[e+8>>2]=a}a=F[2944];if(a>>>0<=h>>>0){break d}b=a-h|0;F[2944]=b;c=F[2947];a=c+h|0;F[2947]=a;F[a+4>>2]=b|1;F[c+4>>2]=h|3;a=c+8|0;break a}F[2940]=48;a=0;break a}N:{if(!g){break N}b=F[d+28>>2];a=(b<<2)+12068|0;O:{if(F[a>>2]==(d|0)){F[a>>2]=c;if(c){break O}j=oi(b)&j;F[2942]=j;break N}F[g+(F[g+16>>2]==(d|0)?16:20)>>2]=c;if(!c){break N}}F[c+24>>2]=g;a=F[d+16>>2];if(a){F[c+16>>2]=a;F[a+24>>2]=c}a=F[d+20>>2];if(!a){break N}F[c+20>>2]=a;F[a+24>>2]=c}P:{if(f>>>0<=15){a=f+h|0;F[d+4>>2]=a|3;a=a+d|0;F[a+4>>2]=F[a+4>>2]|1;break P}F[d+4>>2]=h|3;e=d+h|0;F[e+4>>2]=f|1;F[e+f>>2]=f;if(f>>>0<=255){b=(f&-8)+11804|0;c=F[2941];a=1<<(f>>>3);Q:{if(!(c&a)){F[2941]=a|c;a=b;break Q}a=F[b+8>>2]}F[b+8>>2]=e;F[a+12>>2]=e;F[e+12>>2]=b;F[e+8>>2]=a;break P}a=31;if(f>>>0<=16777215){a=O(f>>>8|0);a=((f>>>38-a&1)-(a<<1)|0)+62|0}F[e+28>>2]=a;F[e+16>>2]=0;F[e+20>>2]=0;b=(a<<2)+12068|0;R:{c=1<>2]=e;break S}a=f<<((a|0)!=31?25-(a>>>1|0)|0:0);h=F[b>>2];while(1){b=h;if((F[b+4>>2]&-8)==(f|0)){break R}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;h=F[c+16>>2];if(h){continue}break}F[c+16>>2]=e}F[e+24>>2]=b;F[e+12>>2]=e;F[e+8>>2]=e;break P}a=F[b+8>>2];F[a+12>>2]=e;F[b+8>>2]=e;F[e+24>>2]=0;F[e+12>>2]=b;F[e+8>>2]=a}a=d+8|0;break a}T:{if(!i){break T}b=F[c+28>>2];a=(b<<2)+12068|0;U:{if(F[a>>2]==(c|0)){F[a>>2]=d;if(d){break U}m=11768,n=oi(b)&j,F[m>>2]=n;break T}F[i+(F[i+16>>2]==(c|0)?16:20)>>2]=d;if(!d){break T}}F[d+24>>2]=i;a=F[c+16>>2];if(a){F[d+16>>2]=a;F[a+24>>2]=d}a=F[c+20>>2];if(!a){break T}F[d+20>>2]=a;F[a+24>>2]=d}V:{if(f>>>0<=15){a=f+h|0;F[c+4>>2]=a|3;a=a+c|0;F[a+4>>2]=F[a+4>>2]|1;break V}F[c+4>>2]=h|3;d=c+h|0;F[d+4>>2]=f|1;F[d+f>>2]=f;if(k){b=(k&-8)+11804|0;e=F[2946];a=1<<(k>>>3);W:{if(!(a&g)){F[2941]=a|g;a=b;break W}a=F[b+8>>2]}F[b+8>>2]=e;F[a+12>>2]=e;F[e+12>>2]=b;F[e+8>>2]=a}F[2946]=d;F[2943]=f}a=c+8|0}Z=l+16|0;return a|0}function Vc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;m=Z-32|0;Z=m;o=ka(12);F[o+8>>2]=0;F[o+4>>2]=b;F[o>>2]=0;s=o+12|0;b=s;a:{b:{c:{while(1){b=b-12|0;w=F[b+8>>2];j=F[b+4>>2];t=F[b>>2];if(t){if((w|0)>1e3){break a}F[m+24>>2]=0;F[m+16>>2]=0;F[m+20>>2]=0;d=1;c=F[a>>2];e=F[c+8>>2];h=F[c+12>>2];g=F[c+20>>2];f=F[c+16>>2];d:{if((h|0)<=(g|0)&f>>>0>=e>>>0|(g|0)>(h|0)){break d}e=G[f+F[c>>2]|0];h=c;c=g;f=f+1|0;c=f?c:c+1|0;F[h+16>>2]=f;F[h+20>>2]=c;Sb(m+16|0,e);if(e){c=F[a>>2];n=Tb(m+16|0);p=F[c+8>>2];g=F[c+12>>2];h=F[c+20>>2];f=F[c+16>>2];k=f+e|0;h=k>>>0>>0?h+1|0:h;if((g|0)<=(h|0)&k>>>0>p>>>0|(g|0)<(h|0)){break d}la(n,f+F[c>>2]|0,e);d=F[c+20>>2];f=e;e=e+F[c+16>>2]|0;d=f>>>0>e>>>0?d+1|0:d;F[c+16>>2]=e;F[c+20>>2]=d}j=ka(24);c=j;F[c+4>>2]=0;F[c+8>>2]=0;c=c+16|0;F[c>>2]=0;F[c+4>>2]=0;F[j>>2]=j+4;F[j+12>>2]=c;e=Z-32|0;Z=e;h=t+12|0;c=m+16|0;u=Ya(h,c);i=t+16|0;e:{if((u|0)==(i|0)){F[e+16>>2]=c;f:{g:{d=F[h+4>>2];h:{if(!d){f=h+4|0;c=f;break h}f=G[c+11|0];g=f<<24>>24<0;n=g?F[c>>2]:c;g=g?F[c+4>>2]:f;while(1){c=d;d=G[c+27|0];f=d<<24>>24<0;d=f?F[c+20>>2]:d;p=d>>>0>>0;i:{j:{k:{l:{k=p?d:g;m:{if(k){f=f?F[c+16>>2]:c+16|0;q=sa(n,f,k);if(!q){if(d>>>0>g>>>0){break m}break l}if((q|0)>=0){break l}break m}if(d>>>0<=g>>>0){break k}}f=c;d=F[c>>2];if(d){continue}break h}d=sa(f,n,k);if(d){break j}}if(p){break i}break g}if((d|0)>=0){break g}}d=F[c+4>>2];if(d){continue}break}f=c+4|0}d=ka(32);n=d+16|0;g=F[e+16>>2];n:{if(D[g+11|0]>=0){p=F[g+4>>2];F[n>>2]=F[g>>2];F[n+4>>2]=p;F[n+8>>2]=F[g+8>>2];break n}ra(n,F[g>>2],F[g+4>>2])}F[d+8>>2]=c;F[d>>2]=0;F[d+4>>2]=0;F[d+28>>2]=0;F[f>>2]=d;c=d;g=F[F[h>>2]>>2];if(g){F[h>>2]=g;c=F[f>>2]}nb(F[h+4>>2],c);F[h+8>>2]=F[h+8>>2]+1;c=1;break f}d=c;c=0}D[e+28|0]=c;F[e+24>>2]=d;d=F[e+24>>2];c=F[d+28>>2];F[d+28>>2]=j;if(!c){break e}Ca(c+12|0,F[c+16>>2]);Ba(c,F[c+4>>2]);ja(c);break e}if(!j){break e}Ca(j+12|0,F[j+16>>2]);Ba(j,F[j+4>>2]);ja(j)}Z=e+32|0;d=(i|0)!=(u|0)}if(D[m+27|0]<0){ja(F[m+16>>2])}if(d){break a}}if(!j){break a}F[m+16>>2]=0;if(!fb(1,m+16|0,F[a>>2])){break a}q=0;x=F[m+16>>2];if(x){while(1){d=0;i=Z-32|0;Z=i;F[i+24>>2]=0;F[i+16>>2]=0;F[i+20>>2]=0;c=F[a>>2];f=F[c+8>>2];o:{p:{h=F[c+12>>2];g=F[c+20>>2];e=F[c+16>>2];q:{if((h|0)<=(g|0)&e>>>0>=f>>>0|(g|0)>(h|0)){break q}f=G[e+F[c>>2]|0];h=c;c=g;e=e+1|0;c=e?c:c+1|0;F[h+16>>2]=e;F[h+20>>2]=c;Sb(i+16|0,f);if(f){e=F[a>>2];n=Tb(i+16|0);p=F[e+8>>2];g=F[e+12>>2];c=F[e+20>>2];h=F[e+16>>2];k=h+f|0;c=k>>>0>>0?c+1|0:c;if(k>>>0>p>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break q}la(n,h+F[e>>2]|0,f);c=F[e+20>>2];g=f;f=f+F[e+16>>2]|0;c=g>>>0>f>>>0?c+1|0:c;F[e+16>>2]=f;F[e+20>>2]=c}F[i+12>>2]=0;if(!fb(1,i+12|0,F[a>>2])){break q}f=F[i+12>>2];if(!f){break q}e=F[a>>2];c=F[e+8>>2];h=F[e+16>>2];g=c-h|0;c=F[e+12>>2]-(F[e+20>>2]+(c>>>0>>0)|0)|0;if((c|0)<=0&f>>>0>g>>>0|(c|0)<0){break q}F[i+8>>2]=0;F[i>>2]=0;F[i+4>>2]=0;if((f|0)<0){break p}d=ka(f);F[i>>2]=d;c=d+f|0;F[i+8>>2]=c;l=ma(d,0,f);F[i+4>>2]=c;h=F[e+12>>2];y=h;p=F[e+8>>2];c=F[e+20>>2];k=F[e+16>>2];g=f+k|0;c=g>>>0>>0?c+1|0:c;u=g;n=c;r:{if((c|0)<=(h|0)&g>>>0<=p>>>0|(c|0)<(h|0)){la(l,F[e>>2]+k|0,f);d=F[e+20>>2];c=f+F[e+16>>2]|0;d=c>>>0>>0?d+1|0:d;F[e+16>>2]=c;F[e+20>>2]=d;h=Z-48|0;Z=h;e=Ya(j,i+16|0);if((e|0)!=(j+4|0)){c=F[e+4>>2];s:{if(!c){c=e;while(1){d=F[c+8>>2];f=F[d>>2]!=(c|0);c=d;if(f){continue}break}break s}while(1){d=c;c=F[c>>2];if(c){continue}break}}if((e|0)==F[j>>2]){F[j>>2]=d}F[j+8>>2]=F[j+8>>2]-1;f=F[j+4>>2];t:{u:{g=e;d=e;e=F[d>>2];if(e){c=F[g+4>>2];if(!c){break u}while(1){d=c;c=F[c>>2];if(c){continue}break}}e=F[d+4>>2];if(e){break u}e=0;k=1;break t}F[e+8>>2]=F[d+8>>2];k=0}l=F[d+8>>2];c=F[l>>2];v:{if((d|0)==(c|0)){F[l>>2]=e;if((d|0)==(f|0)){c=0;f=e;break v}c=F[l+4>>2];break v}F[l+4>>2]=e}r=!G[d+12|0];if((d|0)!=(g|0)){l=F[g+8>>2];F[d+8>>2]=l;F[l+(((g|0)!=F[F[g+8>>2]>>2])<<2)>>2]=d;l=F[g>>2];F[d>>2]=l;F[l+8>>2]=d;l=F[g+4>>2];F[d+4>>2]=l;if(l){F[l+8>>2]=d}D[d+12|0]=G[g+12|0];f=(f|0)==(g|0)?d:f}w:{if(r|!f){break w}if(k){while(1){e=G[c+12|0];x:{d=F[c+8>>2];if(F[d>>2]!=(c|0)){if(!e){D[c+12|0]=1;D[d+12|0]=0;e=F[d+4>>2];k=F[e>>2];F[d+4>>2]=k;if(k){F[k+8>>2]=d}F[e+8>>2]=F[d+8>>2];k=F[d+8>>2];F[(((d|0)!=F[k>>2])<<2)+k>>2]=e;F[e>>2]=d;F[d+8>>2]=e;d=c;c=F[c>>2];f=(c|0)==(f|0)?d:f;c=F[c+4>>2]}y:{z:{d=F[c>>2];A:{if(!(G[d+12|0]?0:d)){e=F[c+4>>2];if(G[e+12|0]?0:e){break A}D[c+12|0]=0;c=F[c+8>>2];B:{if((f|0)==(c|0)){c=f;break B}if(G[c+12|0]){break x}}D[c+12|0]=1;break w}e=F[c+4>>2];if(!e){break z}}if(G[e+12|0]){break z}d=c;break y}D[d+12|0]=1;D[c+12|0]=0;e=F[d+4>>2];F[c>>2]=e;if(e){F[e+8>>2]=c}F[d+8>>2]=F[c+8>>2];e=F[c+8>>2];F[((F[e>>2]!=(c|0))<<2)+e>>2]=d;F[d+4>>2]=c;F[c+8>>2]=d;e=c}c=F[d+8>>2];D[d+12|0]=G[c+12|0];D[c+12|0]=1;D[e+12|0]=1;d=F[c+4>>2];e=F[d>>2];F[c+4>>2]=e;if(e){F[e+8>>2]=c}F[d+8>>2]=F[c+8>>2];e=F[c+8>>2];F[(((c|0)!=F[e>>2])<<2)+e>>2]=d;F[d>>2]=c;F[c+8>>2]=d;break w}if(!e){D[c+12|0]=1;D[d+12|0]=0;e=F[c+4>>2];F[d>>2]=e;if(e){F[e+8>>2]=d}F[c+8>>2]=F[d+8>>2];e=F[d+8>>2];F[(((d|0)!=F[e>>2])<<2)+e>>2]=c;F[c+4>>2]=d;F[d+8>>2]=c;f=(d|0)==(f|0)?c:f;c=F[d>>2]}e=F[c>>2];C:{if(!(!e|G[e+12|0])){d=c;break C}d=F[c+4>>2];if(!(G[d+12|0]?0:d)){D[c+12|0]=0;c=F[c+8>>2];if((c|0)!=(f|0)?G[c+12|0]:0){break x}D[c+12|0]=1;break w}if(e){if(!G[e+12|0]){d=c;break C}d=F[c+4>>2]}D[d+12|0]=1;D[c+12|0]=0;e=F[d>>2];F[c+4>>2]=e;if(e){F[e+8>>2]=c}F[d+8>>2]=F[c+8>>2];e=F[c+8>>2];F[((F[e>>2]!=(c|0))<<2)+e>>2]=d;F[d>>2]=c;F[c+8>>2]=d;e=c}c=F[d+8>>2];D[d+12|0]=G[c+12|0];D[c+12|0]=1;D[e+12|0]=1;d=F[c>>2];e=F[d+4>>2];F[c>>2]=e;if(e){F[e+8>>2]=c}F[d+8>>2]=F[c+8>>2];e=F[c+8>>2];F[(((c|0)!=F[e>>2])<<2)+e>>2]=d;F[d+4>>2]=c;F[c+8>>2]=d;break w}d=c;c=F[c+8>>2];c=F[(((d|0)==F[c>>2])<<2)+c>>2];continue}}D[e+12|0]=1}c=F[g+28>>2];if(c){F[g+32>>2]=c;ja(c)}if(D[g+27|0]<0){ja(F[g+16>>2])}ja(g)}F[h+8>>2]=0;F[h>>2]=0;F[h+4>>2]=0;c=F[i+4>>2];d=F[i>>2];f=c-d|0;e=0;D:{E:{if((c|0)!=(d|0)){if((f|0)<0){break E}e=ka(f);c=ma(e,0,f);g=c+f|0;F[h+8>>2]=g;F[h+4>>2]=g;F[h>>2]=c;c=d}la(e,c,f);F:{if(D[i+27|0]>=0){F[h+24>>2]=F[i+24>>2];c=F[i+20>>2];F[h+16>>2]=F[i+16>>2];F[h+20>>2]=c;break F}ra(h+16|0,F[i+16>>2],F[i+20>>2])}Tc(h+28|0,h);f=h+16|0;c=f;G:{H:{d=F[j+4>>2];I:{if(!d){e=j+4|0;c=e;break I}e=G[c+11|0];g=e<<24>>24<0;k=g?F[c>>2]:c;g=g?F[c+4>>2]:e;while(1){c=d;d=G[c+27|0];e=d<<24>>24<0;d=e?F[c+20>>2]:d;l=d>>>0>>0;J:{K:{L:{M:{r=l?d:g;N:{if(r){e=e?F[c+16>>2]:c+16|0;z=sa(k,e,r);if(!z){if(d>>>0>g>>>0){break N}break M}if((z|0)>=0){break M}break N}if(d>>>0<=g>>>0){break L}}e=c;d=F[c>>2];if(d){continue}break I}d=sa(e,k,r);if(d){break K}}if(l){break J}break H}if((d|0)>=0){break H}}d=F[c+4>>2];if(d){continue}break}e=c+4|0}d=ka(40);F[d+24>>2]=F[f+8>>2];g=F[f+4>>2];F[d+16>>2]=F[f>>2];F[d+20>>2]=g;F[f>>2]=0;F[f+4>>2]=0;F[f+8>>2]=0;Tc(d+28|0,f+12|0);F[d+8>>2]=c;F[d>>2]=0;F[d+4>>2]=0;F[e>>2]=d;c=d;f=F[F[j>>2]>>2];if(f){F[j>>2]=f;c=F[e>>2]}nb(F[j+4>>2],c);F[j+8>>2]=F[j+8>>2]+1;c=1;break G}d=c;c=0}D[h+44|0]=c;F[h+40>>2]=d;c=F[h+28>>2];if(c){F[h+32>>2]=c;ja(c)}if(D[h+27|0]<0){ja(F[h+16>>2])}c=F[h>>2];if(c){F[h+4>>2]=c;ja(c)}Z=h+48|0;break D}na();v()}d=F[i>>2];if(!d){break r}}F[i+4>>2]=d;ja(d)}d=(n|0)<=(y|0)&p>>>0>=u>>>0|(n|0)<(y|0)}if(D[i+27|0]<0){ja(F[i+16>>2])}Z=i+32|0;break o}na();v()}if(!d){break a}q=q+1|0;if((x|0)!=(q|0)){continue}break}}F[m+12>>2]=0;if(!fb(1,m+12|0,F[a>>2])){break a}c=F[a>>2];e=F[c+8>>2];f=F[c+16>>2];h=e-f|0;d=F[m+12>>2];c=F[c+12>>2]-(F[c+20>>2]+(e>>>0>>0)|0)|0;if(h>>>0>>0&(c|0)<=0|(c|0)<0){break a}if(d){q=0;h=((t|0)!=0)+w|0;while(1){O:{if(b>>>0>>0){F[b+8>>2]=h;F[b+4>>2]=0;F[b>>2]=j;b=b+12|0;d=F[m+12>>2];break O}c=b-o|0;g=(c|0)/12|0;b=g+1|0;if(b>>>0>=357913942){break c}e=(s-o|0)/12|0;f=e<<1;e=e>>>0>=178956970?357913941:b>>>0>>0?f:b;if(e){if(e>>>0>=357913942){break b}f=ka(L(e,12))}else{f=0}b=f+L(g,12)|0;F[b+8>>2]=h;F[b+4>>2]=0;F[b>>2]=j;c=pa(b+L((c|0)/-12|0,12)|0,o,c);s=f+L(e,12)|0;b=b+12|0;if(o){ja(o)}o=c}q=q+1|0;if(q>>>0>>0){continue}break}}if((b|0)!=(o|0)){continue}break}A=1;break a}na();v()}oa();v()}if(o){ja(o)}Z=m+32|0;return A}function me(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=Z-48|0;Z=h;a:{if((c|0)!=1){break a}i=F[a+4>>2];c=F[a+12>>2];F[h+40>>2]=0;F[h+32>>2]=0;F[h+36>>2]=0;F[h+24>>2]=0;F[h+28>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;F[h+8>>2]=0;F[h+12>>2]=0;d=h+8|0;b:{if((b|0)==-2){break b}k=F[F[F[i+4>>2]+8>>2]+(c<<2)>>2];if(($[F[F[i>>2]+8>>2]](i)|0)==1){j=Z-32|0;Z=j;l=F[F[F[i+4>>2]+8>>2]+(c<<2)>>2];c:{d:{e:{if(($[F[F[i>>2]+8>>2]](i)|0)!=1|b-1>>>0>5){break e}g=$[F[F[i>>2]+36>>2]](i)|0;f=$[F[F[i>>2]+44>>2]](i,c)|0;if(!g|!f){break e}c=$[F[F[i>>2]+40>>2]](i,c)|0;if(c){a=F[i+44>>2];F[j+12>>2]=c;F[j+8>>2]=a;F[j+20>>2]=f;F[j+16>>2]=f+12;f=j+8|0;a=0;f:{g:{switch(b-1|0){case 0:b=ka(60);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b>>2]=2252;a=b;break f;case 3:b=ka(112);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b+60>>2]=0;F[b+64>>2]=0;F[b>>2]=3016;F[b+68>>2]=0;F[b+72>>2]=0;F[b+76>>2]=0;F[b+80>>2]=0;F[b+84>>2]=0;F[b+88>>2]=0;F[b+92>>2]=0;F[b+96>>2]=0;F[b+100>>2]=0;F[b+104>>2]=0;F[b+108>>2]=0;a=b;break f;case 4:b=ka(104);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b+84>>2]=0;F[b+76>>2]=0;F[b+80>>2]=0;F[b+60>>2]=0;F[b+64>>2]=0;F[b>>2]=3264;a=F[f+4>>2];F[b+88>>2]=F[f>>2];F[b+92>>2]=a;a=F[f+12>>2];F[b+96>>2]=F[f+8>>2];F[b+100>>2]=a;a=b;break f;case 5:break g;default:break f}}a=ka(128);F[a+4>>2]=l;F[a>>2]=2960;b=F[d+4>>2];F[a+8>>2]=F[d>>2];F[a+12>>2]=b;b=F[d+12>>2];F[a+16>>2]=F[d+8>>2];F[a+20>>2]=b;b=F[d+20>>2];F[a+24>>2]=F[d+16>>2];F[a+28>>2]=b;F[a+40>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;h:{i:{c=F[d+28>>2];b=F[d+24>>2];if((c|0)!=(b|0)){c=c-b|0;if((c|0)<0){break i}b=ka(c);F[a+36>>2]=b;F[a+32>>2]=b;F[a+40>>2]=(c&-4)+b;e=F[d+24>>2];c=F[d+28>>2];if((e|0)!=(c|0)){while(1){F[b>>2]=F[e>>2];b=b+4|0;e=e+4|0;if((c|0)!=(e|0)){continue}break}}F[a+36>>2]=b}F[a>>2]=2904;b=F[f+4>>2];F[a+44>>2]=F[f>>2];F[a+48>>2]=b;b=F[f+12>>2];F[a+52>>2]=F[f+8>>2];F[a+56>>2]=b;b=a- -64|0;F[b>>2]=0;F[b+4>>2]=0;F[a+60>>2]=4128;F[a>>2]=3500;b=F[f+4>>2];F[a+72>>2]=F[f>>2];F[a+76>>2]=b;b=F[f+12>>2];F[a+80>>2]=F[f+8>>2];F[a+84>>2]=b;F[a+104>>2]=1065353216;F[a+108>>2]=-1;F[a+96>>2]=-1;F[a+100>>2]=-1;F[a+88>>2]=1;F[a+92>>2]=-1;F[a+60>>2]=3736;F[a+112>>2]=0;F[a+116>>2]=0;D[a+117|0]=0;D[a+118|0]=0;D[a+119|0]=0;D[a+120|0]=0;D[a+121|0]=0;D[a+122|0]=0;D[a+123|0]=0;D[a+124|0]=0;break h}na();v()}break f}e=a;break e}a=F[i+44>>2];F[j+12>>2]=g;F[j+8>>2]=a;F[j+20>>2]=f;F[j+16>>2]=f+12;f=j+8|0;a=0;j:{k:{switch(b-1|0){case 0:b=ka(60);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b>>2]=4156;a=b;break j;case 3:b=ka(112);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b+60>>2]=0;F[b+64>>2]=0;F[b>>2]=4580;F[b+68>>2]=0;F[b+72>>2]=0;F[b+76>>2]=0;F[b+80>>2]=0;F[b+84>>2]=0;F[b+88>>2]=0;F[b+92>>2]=0;F[b+96>>2]=0;F[b+100>>2]=0;F[b+104>>2]=0;F[b+108>>2]=0;a=b;break j;case 4:b=ka(104);F[b+4>>2]=l;F[b>>2]=2960;a=F[d+4>>2];F[b+8>>2]=F[d>>2];F[b+12>>2]=a;a=F[d+12>>2];F[b+16>>2]=F[d+8>>2];F[b+20>>2]=a;a=F[d+20>>2];F[b+24>>2]=F[d+16>>2];F[b+28>>2]=a;F[b+40>>2]=0;F[b+32>>2]=0;F[b+36>>2]=0;a=F[d+24>>2];g=F[d+28>>2];if((a|0)!=(g|0)){c=g-a|0;if((c|0)<0){break d}e=ka(c);F[b+32>>2]=e;F[b+40>>2]=(c&-4)+e;while(1){F[e>>2]=F[a>>2];e=e+4|0;a=a+4|0;if((g|0)!=(a|0)){continue}break}F[b+36>>2]=e}a=F[f+4>>2];F[b+44>>2]=F[f>>2];F[b+48>>2]=a;a=F[f+12>>2];F[b+52>>2]=F[f+8>>2];F[b+56>>2]=a;F[b+84>>2]=0;F[b+76>>2]=0;F[b+80>>2]=0;F[b+60>>2]=0;F[b+64>>2]=0;F[b>>2]=4816;a=F[f+4>>2];F[b+88>>2]=F[f>>2];F[b+92>>2]=a;a=F[f+12>>2];F[b+96>>2]=F[f+8>>2];F[b+100>>2]=a;a=b;break j;case 5:break k;default:break j}}a=ka(128);F[a+4>>2]=l;F[a>>2]=2960;b=F[d+4>>2];F[a+8>>2]=F[d>>2];F[a+12>>2]=b;b=F[d+12>>2];F[a+16>>2]=F[d+8>>2];F[a+20>>2]=b;b=F[d+20>>2];F[a+24>>2]=F[d+16>>2];F[a+28>>2]=b;F[a+40>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;l:{m:{c=F[d+28>>2];b=F[d+24>>2];if((c|0)!=(b|0)){c=c-b|0;if((c|0)<0){break m}b=ka(c);F[a+36>>2]=b;F[a+32>>2]=b;F[a+40>>2]=(c&-4)+b;e=F[d+24>>2];c=F[d+28>>2];if((e|0)!=(c|0)){while(1){F[b>>2]=F[e>>2];b=b+4|0;e=e+4|0;if((c|0)!=(e|0)){continue}break}}F[a+36>>2]=b}F[a>>2]=4524;b=F[f+4>>2];F[a+44>>2]=F[f>>2];F[a+48>>2]=b;b=F[f+12>>2];F[a+52>>2]=F[f+8>>2];F[a+56>>2]=b;b=a- -64|0;F[b>>2]=0;F[b+4>>2]=0;F[a+60>>2]=5624;F[a>>2]=5040;b=F[f+4>>2];F[a+72>>2]=F[f>>2];F[a+76>>2]=b;b=F[f+12>>2];F[a+80>>2]=F[f+8>>2];F[a+84>>2]=b;F[a+104>>2]=1065353216;F[a+108>>2]=-1;F[a+96>>2]=-1;F[a+100>>2]=-1;F[a+88>>2]=1;F[a+92>>2]=-1;F[a+60>>2]=5260;F[a+112>>2]=0;F[a+116>>2]=0;D[a+117|0]=0;D[a+118|0]=0;D[a+119|0]=0;D[a+120|0]=0;D[a+121|0]=0;D[a+122|0]=0;D[a+123|0]=0;D[a+124|0]=0;break l}na();v()}break j}e=a}Z=j+32|0;break c}na();v()}if(e){break b}}e=ka(44);F[e+4>>2]=k;F[e>>2]=2960;a=F[d+4>>2];F[e+8>>2]=F[d>>2];F[e+12>>2]=a;a=F[d+12>>2];F[e+16>>2]=F[d+8>>2];F[e+20>>2]=a;a=F[d+20>>2];F[e+24>>2]=F[d+16>>2];F[e+28>>2]=a;F[e+40>>2]=0;F[e+32>>2]=0;F[e+36>>2]=0;n:{c=F[d+24>>2];b=F[d+28>>2];if((c|0)!=(b|0)){a=b-c|0;if((a|0)<0){break n}k=ka(a);F[e+32>>2]=k;F[e+40>>2]=(a&-4)+k;while(1){F[k>>2]=F[c>>2];k=k+4|0;c=c+4|0;if((b|0)!=(c|0)){continue}break}F[e+36>>2]=k}F[e>>2]=5652;break b}na();v()}k=e;a=F[h+32>>2];if(!a){break a}F[h+36>>2]=a;ja(a)}Z=h+48|0;return k|0}function rf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;m=Z-16|0;Z=m;F[m+12>>2]=b;b=ka(32);F[m>>2]=b;F[m+4>>2]=24;F[m+8>>2]=-2147483616;c=G[1196]|G[1197]<<8|(G[1198]<<16|G[1199]<<24);d=G[1192]|G[1193]<<8|(G[1194]<<16|G[1195]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1188]|G[1189]<<8|(G[1190]<<16|G[1191]<<24);d=G[1184]|G[1185]<<8|(G[1186]<<16|G[1187]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1180]|G[1181]<<8|(G[1182]<<16|G[1183]<<24);d=G[1176]|G[1177]<<8|(G[1178]<<16|G[1179]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;D[b+24|0]=0;l=Z-48|0;Z=l;f=F[m+12>>2];d=a;a=a+16|0;b=F[a>>2];a:{b:{if(!b){break b}c=a;while(1){e=(f|0)>F[b+16>>2];c=e?c:b;b=F[(e?b+4|0:b)>>2];if(b){continue}break}if((a|0)==(c|0)){break b}if((f|0)>=F[c+16>>2]){break a}}F[l+28>>2]=0;F[l+32>>2]=0;y=l+24|0;F[l+24>>2]=y|4;a=l+16|0;F[a>>2]=0;F[a+4>>2]=0;F[l+8>>2]=f;F[l+12>>2]=a;t=l+8|0;a=t;x=Z-16|0;Z=x;u=d+12|0;c=F[u+4>>2];c:{d:{if(!c){o=u+4|0;d=o;break d}a=F[a>>2];while(1){d=c;b=F[c+16>>2];if((b|0)>(a|0)){o=d;c=F[d>>2];if(c){continue}break d}if((a|0)<=(b|0)){g=d;a=0;break c}c=F[d+4>>2];if(c){continue}break}o=d+4|0}g=ka(32);b=F[t>>2];q=g+24|0;a=q;F[a>>2]=0;F[a+4>>2]=0;F[g+16>>2]=b;r=g+20|0;F[r>>2]=a;c=F[t+4>>2];z=t+8|0;if((c|0)!=(z|0)){while(1){p=Z-16|0;Z=p;a=p+8|0;k=c+16|0;e:{f:{g:{h:{i:{j:{k:{f=q;e=r+4|0;l:{if((f|0)==(e|0)){break l}b=G[f+27|0];h=b<<24>>24<0;i=G[k+11|0];n=i<<24>>24;j=(n|0)<0;i=j?F[k+4>>2]:i;b=h?F[f+20>>2]:b;s=i>>>0>b>>>0;w=s?b:i;if(w){j=j?F[k>>2]:k;h=h?F[f+16>>2]:f+16|0;A=sa(j,h,w);if(!A){if(b>>>0>i>>>0){break l}break k}if((A|0)>=0){break k}break l}if(b>>>0<=i>>>0){break j}}h=F[f>>2];m:{a=f;n:{if((a|0)==F[r>>2]){break n}o:{if(!h){b=f;while(1){a=F[b+8>>2];i=F[a>>2]==(b|0);b=a;if(i){continue}break}break o}b=h;while(1){a=b;b=F[b+4>>2];if(b){continue}break}}i=G[k+11|0];s=i<<24>>24;b=(s|0)<0;j=G[a+27|0];n=j<<24>>24<0;p:{i=b?F[k+4>>2]:i;j=n?F[a+20>>2]:j;w=i>>>0>>0?i:j;if(w){b=sa(n?F[a+16>>2]:a+16|0,b?F[k>>2]:k,w);if(b){break p}}if(i>>>0>j>>>0){break n}break m}if((b|0)>=0){break m}}if(!h){F[p+12>>2]=f;a=f;break e}F[p+12>>2]=a;a=a+4|0;break e}b=F[e>>2];if(!b){F[p+12>>2]=e;a=e;break e}h=(s|0)<0?F[k>>2]:k;f=e;while(1){a=b;b=G[b+27|0];e=b<<24>>24<0;b=e?F[a+20>>2]:b;k=b>>>0>>0;q:{r:{s:{t:{n=k?b:i;u:{if(n){e=e?F[a+16>>2]:a+16|0;j=sa(h,e,n);if(!j){if(b>>>0>i>>>0){break u}break t}if((j|0)>=0){break t}break u}if(b>>>0<=i>>>0){break s}}f=a;b=F[a>>2];if(b){continue}break g}b=sa(e,h,n);if(b){break r}}if(k){break q}break g}if((b|0)>=0){break g}}f=a+4|0;b=F[a+4>>2];if(b){continue}break}break g}b=sa(h,j,w);if(b){break i}}if(s){break h}break f}if((b|0)>=0){break f}}h=F[f+4>>2];v:{if(!h){b=f;while(1){a=F[b+8>>2];j=F[a>>2]!=(b|0);b=a;if(j){continue}break}break v}b=h;while(1){a=b;b=F[b>>2];if(b){continue}break}}w:{x:{if((a|0)==(e|0)){break x}j=G[a+27|0];b=j<<24>>24<0;y:{j=b?F[a+20>>2]:j;s=i>>>0>j>>>0?j:i;if(s){b=sa((n|0)<0?F[k>>2]:k,b?F[a+16>>2]:a+16|0,s);if(b){break y}}if(i>>>0>>0){break x}break w}if((b|0)>=0){break w}}if(!h){F[p+12>>2]=f;a=f+4|0;break e}F[p+12>>2]=a;break e}b=F[e>>2];if(!b){F[p+12>>2]=e;a=e;break e}h=(n|0)<0?F[k>>2]:k;f=e;while(1){a=b;b=G[b+27|0];e=b<<24>>24<0;b=e?F[a+20>>2]:b;k=b>>>0>>0;z:{A:{B:{C:{n=k?b:i;D:{if(n){e=e?F[a+16>>2]:a+16|0;j=sa(h,e,n);if(!j){if(b>>>0>i>>>0){break D}break C}if((j|0)>=0){break C}break D}if(b>>>0<=i>>>0){break B}}f=a;b=F[a>>2];if(b){continue}break g}b=sa(e,h,n);if(b){break A}}if(k){break z}break g}if((b|0)>=0){break g}}f=a+4|0;b=F[a+4>>2];if(b){continue}break}}F[p+12>>2]=a;a=f;break e}F[p+12>>2]=f;F[a>>2]=f}f=a;a=F[a>>2];if(a){b=0}else{a=ka(40);b=a+16|0;E:{if(D[c+27|0]>=0){e=F[c+20>>2];F[b>>2]=F[c+16>>2];F[b+4>>2]=e;F[b+8>>2]=F[c+24>>2];break E}ra(b,F[c+16>>2],F[c+20>>2])}b=a+28|0;F:{if(D[c+39|0]>=0){e=F[c+32>>2];F[b>>2]=F[c+28>>2];F[b+4>>2]=e;F[b+8>>2]=F[c+36>>2];break F}ra(b,F[c+28>>2],F[c+32>>2])}F[a+8>>2]=F[p+12>>2];F[a>>2]=0;F[a+4>>2]=0;F[f>>2]=a;b=a;e=F[F[r>>2]>>2];if(e){F[r>>2]=e;b=F[f>>2]}nb(F[r+4>>2],b);F[r+8>>2]=F[r+8>>2]+1;b=1}D[x+12|0]=b;F[x+8>>2]=a;Z=p+16|0;b=F[c+4>>2];G:{if(b){while(1){c=b;b=F[b>>2];if(b){continue}break G}}while(1){a=c;c=F[c+8>>2];if((a|0)!=F[c>>2]){continue}break}}if((c|0)!=(z|0)){continue}break}}F[g+8>>2]=d;F[g>>2]=0;F[g+4>>2]=0;F[o>>2]=g;c=g;a=F[F[u>>2]>>2];if(a){F[u>>2]=a;c=F[o>>2]}nb(F[u+4>>2],c);F[u+8>>2]=F[u+8>>2]+1;a=1}D[l+44|0]=a;F[l+40>>2]=g;Z=x+16|0;c=F[l+40>>2];ib(t|4,F[l+16>>2]);ib(y,F[l+28>>2])}f=Z-48|0;Z=f;d=f+8|0;g=Z-32|0;Z=g;o=g+32|0;b=o;a=g+21|0;H:{if((b|0)==(a|0)){break H}}e=b-a|0;I:{if((e|0)<=9){h=61;if((e|0)<(I[2684]<=1|0)){break I}}D[a|0]=49;b=a+1|0;h=0}F[g+12>>2]=h;F[g+8>>2]=b;h=Z-16|0;Z=h;e=Z-16|0;Z=e;J:{q=F[g+8>>2];g=q-a|0;if(g>>>0<=2147483631){K:{if(g>>>0<11){D[d+11|0]=g|G[d+11|0]&128;D[d+11|0]=G[d+11|0]&127;b=d;break K}t=e+8|0;if(g>>>0>=11){k=g+16&-16;b=k-1|0;b=(b|0)==11?k:b}else{b=10}sb(t,b+1|0);b=F[e+8>>2];F[d>>2]=b;F[d+8>>2]=F[d+8>>2]&-2147483648|F[e+12>>2]&2147483647;F[d+8>>2]=F[d+8>>2]|-2147483648;F[d+4>>2]=g}while(1){if((a|0)!=(q|0)){D[b|0]=G[a|0];b=b+1|0;a=a+1|0;continue}break}D[e+7|0]=0;D[b|0]=G[e+7|0];Z=e+16|0;break J}za();v()}Z=h+16|0;Z=o;F[f+32>>2]=m;L:{M:{a=c+20|0;d=F[a+4>>2];N:{if(!d){g=a+4|0;c=g;break N}b=G[m+11|0];c=b<<24>>24<0;e=c?F[m>>2]:m;b=c?F[m+4>>2]:b;while(1){c=d;d=G[c+27|0];g=d<<24>>24<0;d=g?F[c+20>>2]:d;o=d>>>0>>0;O:{P:{Q:{R:{h=o?d:b;S:{if(h){g=g?F[c+16>>2]:c+16|0;q=sa(e,g,h);if(!q){if(b>>>0>>0){break S}break R}if((q|0)>=0){break R}break S}if(b>>>0>=d>>>0){break Q}}g=c;d=F[c>>2];if(d){continue}break N}d=sa(g,e,h);if(d){break P}}if(o){break O}break M}if((d|0)>=0){break M}}d=F[c+4>>2];if(d){continue}break}g=c+4|0}d=ka(40);e=d+16|0;b=F[f+32>>2];T:{if(D[b+11|0]>=0){o=F[b+4>>2];F[e>>2]=F[b>>2];F[e+4>>2]=o;F[e+8>>2]=F[b+8>>2];break T}ra(e,F[b>>2],F[b+4>>2])}F[d+8>>2]=c;F[d>>2]=0;F[d+4>>2]=0;F[d+36>>2]=0;F[d+28>>2]=0;F[d+32>>2]=0;F[g>>2]=d;c=d;b=F[F[a>>2]>>2];if(b){F[a>>2]=b;c=F[g>>2]}nb(F[a+4>>2],c);F[a+8>>2]=F[a+8>>2]+1;a=1;break L}d=c;a=0}D[f+44|0]=a;F[f+40>>2]=d;a=F[f+40>>2];if(D[a+39|0]<0){ja(F[a+28>>2])}b=F[f+12>>2];F[a+28>>2]=F[f+8>>2];F[a+32>>2]=b;F[a+36>>2]=F[f+16>>2];Z=f+48|0;Z=l+48|0;if(D[m+11|0]<0){ja(F[m>>2])}Z=m+16|0}function zd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;h=Z-32|0;Z=h;g=F[F[a+4>>2]+44>>2];c=F[a+8>>2];d=F[c>>2];c=F[c+4>>2];F[h+24>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;d=(c-d>>2>>>0)/3|0;c=F[g+96>>2];f=(F[g+100>>2]-c|0)/12|0;a:{if(d>>>0>f>>>0){e=d-f|0;i=F[g+104>>2];c=F[g+100>>2];if(e>>>0<=(i-c|0)/12>>>0){b:{if(!e){break b}d=c;f=L(e,12)-12|0;i=((f>>>0)/12|0)+1&3;if(i){while(1){l=F[h+20>>2];F[d>>2]=F[h+16>>2];F[d+4>>2]=l;F[d+8>>2]=F[h+24>>2];d=d+12|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}c=L(e,12)+c|0;if(f>>>0<36){break b}while(1){f=F[h+20>>2];F[d>>2]=F[h+16>>2];F[d+4>>2]=f;F[d+8>>2]=F[h+24>>2];F[d+20>>2]=F[h+24>>2];f=F[h+20>>2];F[d+12>>2]=F[h+16>>2];F[d+16>>2]=f;F[d+32>>2]=F[h+24>>2];f=F[h+20>>2];F[d+24>>2]=F[h+16>>2];F[d+28>>2]=f;f=F[h+20>>2];F[d+36>>2]=F[h+16>>2];F[d+40>>2]=f;F[d+44>>2]=F[h+24>>2];d=d+48|0;if((d|0)!=(c|0)){continue}break}}F[g+100>>2]=c;break a}c:{f=F[g+96>>2];n=(c-f|0)/12|0;d=n+e|0;if(d>>>0<357913942){f=(i-f|0)/12|0;i=f<<1;i=f>>>0>=178956970?357913941:d>>>0>>0?i:d;if(i){if(i>>>0>=357913942){break c}l=ka(L(i,12))}f=L(n,12)+l|0;d=f;e=L(e,12);n=e-12|0;q=((n>>>0)/12|0)+1&3;if(q){while(1){r=F[h+20>>2];F[d>>2]=F[h+16>>2];F[d+4>>2]=r;F[d+8>>2]=F[h+24>>2];d=d+12|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}e=e+f|0;if(n>>>0>=36){while(1){j=F[h+20>>2];F[d>>2]=F[h+16>>2];F[d+4>>2]=j;F[d+8>>2]=F[h+24>>2];F[d+20>>2]=F[h+24>>2];j=F[h+20>>2];F[d+12>>2]=F[h+16>>2];F[d+16>>2]=j;F[d+32>>2]=F[h+24>>2];j=F[h+20>>2];F[d+24>>2]=F[h+16>>2];F[d+28>>2]=j;j=F[h+20>>2];F[d+36>>2]=F[h+16>>2];F[d+40>>2]=j;F[d+44>>2]=F[h+24>>2];d=d+48|0;if((e|0)!=(d|0)){continue}break}}j=F[g+96>>2];if((j|0)!=(c|0)){while(1){c=c-12|0;n=F[c+4>>2];f=f-12|0;d=f;F[d>>2]=F[c>>2];F[d+4>>2]=n;F[d+8>>2]=F[c+8>>2];if((c|0)!=(j|0)){continue}break}c=F[g+96>>2]}F[g+104>>2]=L(i,12)+l;F[g+100>>2]=e;F[g+96>>2]=f;if(c){ja(c)}break a}na();v()}oa();v()}if(d>>>0>=f>>>0){break a}F[g+100>>2]=c+L(d,12)}d:{if(F[a+216>>2]==F[a+220>>2]){j=F[a+4>>2];c=F[j+44>>2];d=F[c+100>>2];f=F[c+96>>2];if((d|0)!=(f|0)){c=(d-f|0)/12|0;o=c>>>0<=1?1:c;c=0;while(1){d=F[a+8>>2];i=f+L(c,12)|0;g=L(c,3);e:{f:{if((g|0)==-1){e=F[(F[d>>2]+(g<<2)|0)+4>>2];k=-1;g=1;break f}e=-1;k=F[F[d>>2]+(g<<2)>>2];l=g+1|0;if((l|0)==-1){g=0;break f}e=F[F[d>>2]+(l<<2)>>2];g=g+2|0;m=-1;if((g|0)==-1){break e}}m=F[F[d>>2]+(g<<2)>>2]}F[i+8>>2]=m;F[i+4>>2]=e;F[i>>2]=k;c=c+1|0;if((o|0)!=(c|0)){continue}break}}F[F[j+4>>2]+80>>2]=b;c=1;break d}d=0;F[h+24>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;l=F[a+8>>2];c=F[l>>2];g=F[l+4>>2];F[h+8>>2]=0;F[h>>2]=0;F[h+4>>2]=0;b=0;g:{h:{i:{j:{k:{l:{if((c|0)!=(g|0)){c=g-c|0;if((c|0)<0){break l}b=ka(c);F[h>>2]=b;F[h+8>>2]=(c&-4)+b;u=h,w=ma(b,0,c)+c|0,F[u+4>>2]=w}c=F[l+24>>2];if((F[l+28>>2]-c|0)<4){break h}f=0;while(1){g=F[(p<<2)+c>>2];m:{if((g|0)==-1){break m}n:{if(F[F[a+120>>2]+(p>>>3&536870908)>>2]>>>p&1){break n}n=F[a+216>>2];c=F[a+220>>2];if((n|0)==(c|0)){break n}e=g+2|0;i=(g>>>0)%3|0;q=i?g-1|0:e;c=(c-n|0)/144|0;r=c>>>0<=1?1:c;j=0;t=(i|0)!=0|(e|0)!=-1;while(1){s=g<<2;i=L(j,144)+n|0;c=F[s+F[F[i+68>>2]>>2]>>2];o:{if(!(F[F[i+16>>2]+(c>>>3&536870908)>>2]>>>c&1)){break o}c=-1;p:{if(!t){break p}e=F[F[l+12>>2]+(q<<2)>>2];c=-1;if((e|0)==-1){break p}c=e-1|0;if((e>>>0)%3|0){break p}c=e+2|0}if((g|0)==(c|0)){break o}e=s;s=F[i+32>>2];i=F[e+s>>2];while(1){e=0;if((c|0)==-1){break g}if((i|0)!=F[s+(c<<2)>>2]){g=c;break n}q:{r:{if((c>>>0)%3|0){e=c-1|0;break r}e=c+2|0;m=-1;if((e|0)==-1){break q}}c=F[F[l+12>>2]+(e<<2)>>2];m=-1;if((c|0)==-1){break q}m=c-1|0;if((c>>>0)%3|0){break q}m=c+2|0}c=m;if((g|0)!=(c|0)){continue}break}}j=j+1|0;if((r|0)!=(j|0)){continue}break}}i=k-f|0;e=i>>2;F[(g<<2)+b>>2]=e;s:{if(k>>>0>>0){F[k>>2]=g;k=k+4|0;F[h+20>>2]=k;break s}c=e+1|0;if(c>>>0>=1073741824){break k}d=o-f|0;k=d>>>1|0;c=d>>>0>=2147483644?1073741823:c>>>0>>0?k:c;if(c){if(c>>>0>=1073741824){break j}d=ka(c<<2)}else{d=0}e=d+(e<<2)|0;F[e>>2]=g;m=c<<2;c=pa(d,f,i);o=m+c|0;F[h+24>>2]=o;k=e+4|0;F[h+20>>2]=k;F[h+16>>2]=c;if(f){ja(f);l=F[a+8>>2]}f=c}if((g|0)==-1){break m}t:{if((g>>>0)%3|0){c=g-1|0;break t}c=g+2|0;if((c|0)==-1){break m}}c=F[F[l+12>>2]+(c<<2)>>2];if((c|0)==-1){break m}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)==-1){break m}e=g;if((c|0)==(g|0)){break m}while(1){i=c;u:{v:{c=F[a+220>>2];j=F[a+216>>2];if((c|0)==(j|0)){break v}c=(c-j|0)/144|0;n=c>>>0<=1?1:c;c=0;while(1){q=F[(j+L(c,144)|0)+32>>2];r=i<<2;if(F[q+r>>2]==F[q+(e<<2)>>2]){c=c+1|0;if((n|0)!=(c|0)){continue}break v}break}j=k-d|0;e=j>>2;F[b+r>>2]=e;if(k>>>0>>0){F[k>>2]=i;k=k+4|0;F[h+20>>2]=k;f=d;break u}c=e+1|0;if(c>>>0>=1073741824){break i}f=o-d|0;k=f>>>1|0;c=f>>>0>=2147483644?1073741823:c>>>0>>0?k:c;if(c){if(c>>>0>=1073741824){break j}f=ka(c<<2)}else{f=0}e=f+(e<<2)|0;F[e>>2]=i;m=c<<2;c=pa(f,d,j);o=m+c|0;F[h+24>>2]=o;k=e+4|0;F[h+20>>2]=k;F[h+16>>2]=c;if(!d){d=c;break u}ja(d);l=F[a+8>>2];d=c;break u}F[(i<<2)+b>>2]=F[(e<<2)+b>>2]}if((i|0)==-1){break m}w:{if((i>>>0)%3|0){c=i-1|0;break w}c=i+2|0;if((c|0)==-1){break m}}c=F[F[l+12>>2]+(c<<2)>>2];if((c|0)==-1){break m}c=c+((c>>>0)%3|0?-1:2)|0;if((c|0)==-1){break m}e=i;if((c|0)!=(g|0)){continue}break}}p=p+1|0;c=F[l+24>>2];if((p|0)>2]-c>>2){continue}break}break h}na();v()}na();v()}oa();v()}na();v()}i=F[a+4>>2];a=F[i+44>>2];c=F[a+100>>2];a=F[a+96>>2];x:{if((c|0)==(a|0)){break x}g=(c-a|0)/12|0;f=g>>>0<=1?1:g;l=f&1;c=0;if(g>>>0>=2){j=f&-2;g=0;while(1){e=L(c,12);f=e+b|0;o=F[f>>2];p=F[f+4>>2];e=a+e|0;F[e+8>>2]=F[f+8>>2];F[e>>2]=o;F[e+4>>2]=p;e=L(c|1,12);f=e+b|0;o=F[f>>2];p=F[f+4>>2];e=a+e|0;F[e+8>>2]=F[f+8>>2];F[e>>2]=o;F[e+4>>2]=p;c=c+2|0;g=g+2|0;if((j|0)!=(g|0)){continue}break}}if(!l){break x}g=L(c,12);c=g+b|0;f=F[c>>2];e=F[c+4>>2];a=a+g|0;F[a+8>>2]=F[c+8>>2];F[a>>2]=f;F[a+4>>2]=e}F[F[i+4>>2]+80>>2]=k-d>>2;e=1}c=e;if(b){ja(b)}if(!d){break d}F[h+20>>2]=d;ja(d)}Z=h+32|0;return c}function de(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0;g=Z+-64|0;Z=g;F[a+8>>2]=e;y=a+32|0;f=F[y>>2];d=F[a+36>>2]-f>>2;a:{b:{if(d>>>0>>0){qa(y,e-d|0);F[g+56>>2]=0;F[g+60>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g>>2]=0;break b}if(d>>>0>e>>>0){F[a+36>>2]=f+(e<<2)}F[g+56>>2]=0;F[g+60>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g>>2]=0;d=0;if(!e){break a}}Fa(g+16|0,e,g);h=F[g+28>>2];d=F[g+32>>2]}F[g>>2]=0;d=d-h>>2;c:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break c}F[g+32>>2]=(e<<2)+h;break c}Fa(g+16|12,e-d|0,g)}F[g>>2]=0;f=F[g+40>>2];d=F[g+44>>2]-f>>2;d:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break d}F[g+44>>2]=f+(e<<2);break d}Fa(g+40|0,e-d|0,g)}F[g>>2]=0;f=F[g+52>>2];d=F[g+56>>2]-f>>2;e:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break e}F[g+56>>2]=f+(e<<2);break e}Fa(g+52|0,e-d|0,g)}f:{if(F[a+8>>2]<=0){break f}i=F[g+16>>2];j=F[a+32>>2];h=0;while(1){d=h<<2;f=F[d+i>>2];m=F[a+16>>2];g:{if((f|0)>(m|0)){F[d+j>>2]=m;break g}d=d+j|0;m=F[a+12>>2];if((m|0)>(f|0)){F[d>>2]=m;break g}F[d>>2]=f}h=h+1|0;d=F[a+8>>2];if((h|0)<(d|0)){continue}break}if((d|0)<=0){break f}d=0;while(1){i=d<<2;f=i+c|0;i=F[b+i>>2]+F[j+i>>2]|0;F[f>>2]=i;h:{if((i|0)>F[a+16>>2]){i=i-F[a+20>>2]|0}else{if((i|0)>=F[a+12>>2]){break h}i=i+F[a+20>>2]|0}F[f>>2]=i}d=d+1|0;if((d|0)>2]){continue}break}}H=F[a+52>>2];t=F[a+48>>2];z=ka(16);d=z;F[d>>2]=0;F[d+4>>2]=0;F[d+8>>2]=0;F[d+12>>2]=0;F[g+8>>2]=0;F[g>>2]=0;F[g+4>>2]=0;i:{if(e){if(e>>>0>=1073741824){break i}d=e<<2;r=ka(d);F[g>>2]=r;F[g+8>>2]=d+r;ma(r,0,d)}A=1;d=F[a+56>>2];B=F[d>>2];d=F[d+4>>2]-B|0;j:{if((d|0)<8){break j}w=d>>2;I=(w|0)<=2?2:w;J=w>>>0<=1?1:w;C=e&-2;D=e&1;K=e&-4;E=e&3;G=e-1|0;M=e<<2;N=e>>>0<4;A=0;m=1;while(1){k:{l:{m:{n:{if((m|0)!=(J|0)){o:{p:{f=F[(m<<2)+B>>2];if((f|0)==-1){break p}k=1;d=f+2|0;j=(f>>>0)%3|0;x=j?f-1|0:d;s=1<>2];O=n+(x>>>3&536870908)|0;i=0;P=(j|0)!=0|(d|0)!=-1;d=f;q:{while(1){r:{if(F[n+(d>>>3&536870908)>>2]>>>d&1){break r}j=F[F[F[t+64>>2]+12>>2]+(d<<2)>>2];if((j|0)==-1){break r}l=F[H>>2];h=F[t+28>>2];p=F[l+(F[h+(j<<2)>>2]<<2)>>2];if((p|0)>=(m|0)){break r}q=j+1|0;q=F[l+(F[h+(((q>>>0)%3|0?q:j-2|0)<<2)>>2]<<2)>>2];if((q|0)>=(m|0)){break r}h=F[l+(F[h+(j+((j>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((h|0)>=(m|0)){break r}s:{if(!e){break s}j=F[(g+16|0)+L(i,12)>>2];l=L(e,h);q=L(e,q);p=L(e,p);h=0;o=0;if(G){while(1){F[j+(h<<2)>>2]=(F[(h+l<<2)+c>>2]+F[(h+q<<2)+c>>2]|0)-F[(h+p<<2)+c>>2];u=h|1;F[j+(u<<2)>>2]=(F[(l+u<<2)+c>>2]+F[(q+u<<2)+c>>2]|0)-F[(p+u<<2)+c>>2];h=h+2|0;o=o+2|0;if((C|0)!=(o|0)){continue}break}}if(!D){break s}F[j+(h<<2)>>2]=(F[(h+l<<2)+c>>2]+F[(h+q<<2)+c>>2]|0)-F[(h+p<<2)+c>>2]}j=4;i=i+1|0;if((i|0)==4){break q}}t:{if(k&1){h=d-2|0;j=d+1|0;d=-1;j=(j>>>0)%3|0?j:h;if((j|0)==-1|F[n+(j>>>3&536870908)>>2]>>>j&1){break t}j=F[F[F[t+64>>2]+12>>2]+(j<<2)>>2];if((j|0)==-1){break t}d=j+1|0;d=(d>>>0)%3|0?d:j-2|0;break t}u:{if((d>>>0)%3|0){h=d-1|0;break u}h=d+2|0;d=-1;if((h|0)==-1){break t}}d=-1;if(F[n+(h>>>3&536870908)>>2]>>>h&1){break t}j=F[F[F[t+64>>2]+12>>2]+(h<<2)>>2];if((j|0)==-1){break t}if((j>>>0)%3|0){d=j-1|0;break t}d=j+2|0}v:{if((d|0)==(f|0)){break v}if((d|0)==-1&k){if(!P|s&F[O>>2]){break v}d=F[F[F[t+64>>2]+12>>2]+(x<<2)>>2];if((d|0)==-1){break v}k=0;d=(d>>>0)%3|0?d-1|0:d+2|0}if((d|0)!=-1){continue}}break}j=i;if((j|0)<=0){break p}}if(e){ma(r,0,M)}d=j-1|0;q=(d<<2)+z|0;d=L(d,12)+a|0;u=d;x=F[d- -64>>2];k=0;d=F[g>>2];f=0;while(1){i=F[q>>2];F[q>>2]=i+1;if(i>>>0>=x>>>0){break j}w:{if(F[F[u+60>>2]+(i>>>3&536870908)>>2]>>>i&1){break w}f=f+1|0;if(!e){break w}n=F[(g+16|0)+L(k,12)>>2];i=0;h=0;p=0;if(!N){while(1){l=h<<2;o=l+d|0;F[o>>2]=F[l+n>>2]+F[o>>2];o=l|4;s=o+d|0;F[s>>2]=F[n+o>>2]+F[s>>2];o=l|8;s=o+d|0;F[s>>2]=F[n+o>>2]+F[s>>2];l=l|12;o=l+d|0;F[o>>2]=F[l+n>>2]+F[o>>2];h=h+4|0;p=p+4|0;if((K|0)!=(p|0)){continue}break}}if(!E){break w}while(1){l=h<<2;p=l+d|0;F[p>>2]=F[l+n>>2]+F[p>>2];h=h+1|0;i=i+1|0;if((E|0)!=(i|0)){continue}break}}k=k+1|0;if((k|0)!=(j|0)){continue}break}i=L(e,m);if(!f){break o}if(!e){break l}h=0;d=0;if(G){break n}break m}i=L(e,m)}if(F[a+8>>2]<=0){break k}k=(L(m-1|0,e)<<2)+c|0;j=F[y>>2];h=0;while(1){d=h<<2;f=F[d+k>>2];n=F[a+16>>2];x:{if((f|0)>(n|0)){F[d+j>>2]=n;break x}d=d+j|0;n=F[a+12>>2];if((n|0)>(f|0)){F[d>>2]=n;break x}F[d>>2]=f}h=h+1|0;f=F[a+8>>2];if((h|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=i<<2;h=f+c|0;k=b+f|0;while(1){i=d<<2;f=i+h|0;i=F[i+k>>2]+F[j+i>>2]|0;F[f>>2]=i;y:{if((i|0)>F[a+16>>2]){i=i-F[a+20>>2]|0}else{if((i|0)>=F[a+12>>2]){break y}i=i+F[a+20>>2]|0}F[f>>2]=i}d=d+1|0;if((d|0)>2]){continue}break}break k}ta();v()}while(1){j=h<<2;k=j+r|0;F[k>>2]=F[k>>2]/(f|0);j=(j|4)+r|0;F[j>>2]=F[j>>2]/(f|0);h=h+2|0;d=d+2|0;if((C|0)!=(d|0)){continue}break}}if(!D){break l}d=(h<<2)+r|0;F[d>>2]=F[d>>2]/(f|0)}if(F[a+8>>2]<=0){break k}j=F[y>>2];h=0;while(1){d=h<<2;f=F[d+r>>2];k=F[a+16>>2];z:{if((f|0)>(k|0)){F[d+j>>2]=k;break z}d=d+j|0;k=F[a+12>>2];if((k|0)>(f|0)){F[d>>2]=k;break z}F[d>>2]=f}h=h+1|0;f=F[a+8>>2];if((h|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=i<<2;h=f+c|0;k=b+f|0;while(1){i=d<<2;f=i+h|0;i=F[i+k>>2]+F[j+i>>2]|0;F[f>>2]=i;A:{if((i|0)>F[a+16>>2]){i=i-F[a+20>>2]|0}else{if((i|0)>=F[a+12>>2]){break A}i=i+F[a+20>>2]|0}F[f>>2]=i}d=d+1|0;if((d|0)>2]){continue}break}}m=m+1|0;A=(w|0)<=(m|0);if((m|0)!=(I|0)){continue}break}}a=F[g>>2];if(a){ja(a)}ja(z);a=F[g+52>>2];if(a){F[g+56>>2]=a;ja(a)}a=F[g+40>>2];if(a){F[g+44>>2]=a;ja(a)}a=F[g+28>>2];if(a){F[g+32>>2]=a;ja(a)}a=F[g+16>>2];if(a){F[g+20>>2]=a;ja(a)}Z=g- -64|0;return A|0}na();v()}function $h(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0;h=Z+-64|0;Z=h;F[a+8>>2]=e;x=a+32|0;f=F[x>>2];d=F[a+36>>2]-f>>2;a:{b:{if(d>>>0>>0){qa(x,e-d|0);F[h+56>>2]=0;F[h+60>>2]=0;F[h+48>>2]=0;F[h+52>>2]=0;F[h+40>>2]=0;F[h+44>>2]=0;F[h+32>>2]=0;F[h+36>>2]=0;F[h+24>>2]=0;F[h+28>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;F[h>>2]=0;break b}if(d>>>0>e>>>0){F[a+36>>2]=f+(e<<2)}F[h+56>>2]=0;F[h+60>>2]=0;F[h+48>>2]=0;F[h+52>>2]=0;F[h+40>>2]=0;F[h+44>>2]=0;F[h+32>>2]=0;F[h+36>>2]=0;F[h+24>>2]=0;F[h+28>>2]=0;F[h+16>>2]=0;F[h+20>>2]=0;F[h>>2]=0;d=0;if(!e){break a}}Fa(h+16|0,e,h);i=F[h+28>>2];d=F[h+32>>2]}F[h>>2]=0;d=d-i>>2;c:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break c}F[h+32>>2]=(e<<2)+i;break c}Fa(h+16|12,e-d|0,h)}F[h>>2]=0;f=F[h+40>>2];d=F[h+44>>2]-f>>2;d:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break d}F[h+44>>2]=f+(e<<2);break d}Fa(h+40|0,e-d|0,h)}F[h>>2]=0;f=F[h+52>>2];d=F[h+56>>2]-f>>2;e:{if(d>>>0>=e>>>0){if(d>>>0<=e>>>0){break e}F[h+56>>2]=f+(e<<2);break e}Fa(h+52|0,e-d|0,h)}f:{if(F[a+8>>2]<=0){break f}g=F[h+16>>2];j=F[a+32>>2];i=0;while(1){d=i<<2;f=F[d+g>>2];m=F[a+16>>2];g:{if((f|0)>(m|0)){F[d+j>>2]=m;break g}d=d+j|0;m=F[a+12>>2];if((m|0)>(f|0)){F[d>>2]=m;break g}F[d>>2]=f}i=i+1|0;d=F[a+8>>2];if((i|0)<(d|0)){continue}break}if((d|0)<=0){break f}d=0;while(1){g=d<<2;f=g+c|0;g=F[b+g>>2]+F[g+j>>2]|0;F[f>>2]=g;h:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break h}g=g+F[a+20>>2]|0}F[f>>2]=g}d=d+1|0;if((d|0)>2]){continue}break}}H=F[a+52>>2];A=F[a+48>>2];y=ka(16);d=y;F[d>>2]=0;F[d+4>>2]=0;F[d+8>>2]=0;F[d+12>>2]=0;F[h+8>>2]=0;F[h>>2]=0;F[h+4>>2]=0;i:{if(e){if(e>>>0>=1073741824){break i}d=e<<2;t=ka(d);F[h>>2]=t;F[h+8>>2]=d+t;ma(t,0,d)}z=1;d=F[a+56>>2];B=F[d>>2];d=F[d+4>>2]-B|0;j:{if((d|0)<8){break j}w=d>>2;I=(w|0)<=2?2:w;J=w>>>0<=1?1:w;C=e&-2;D=e&1;K=e&-4;E=e&3;G=e-1|0;M=e<<2;N=e>>>0<4;z=0;m=1;while(1){k:{l:{m:{n:{if((m|0)!=(J|0)){o:{p:{f=F[(m<<2)+B>>2];if((f|0)==-1){break p}n=F[A+12>>2];d=f+2|0;g=(f>>>0)%3|0;q=n+((g?f-1|0:d)<<2)|0;j=0;u=(g|0)!=0|(d|0)!=-1;k=1;d=f;q:{while(1){g=F[n+(d<<2)>>2];r:{if((g|0)==-1){break r}l=-1;p=F[H>>2];r=F[A>>2];i=p+(F[r+(g<<2)>>2]<<2)|0;o=g+1|0;o=(o>>>0)%3|0?o:g-2|0;if((o|0)!=-1){l=F[r+(o<<2)>>2]}o=F[i>>2];s:{t:{if((g>>>0)%3|0){i=g-1|0;break t}i=g+2|0;s=-1;if((i|0)==-1){break s}}s=F[r+(i<<2)>>2]}if((m|0)<=(o|0)){break r}i=F[p+(l<<2)>>2];if((i|0)>=(m|0)){break r}l=F[p+(s<<2)>>2];if((l|0)>=(m|0)){break r}g=F[(h+16|0)+L(j,12)>>2];u:{if(!e){break u}l=L(e,l);r=L(e,i);p=L(e,o);i=0;s=0;if(G){while(1){F[g+(i<<2)>>2]=(F[(i+l<<2)+c>>2]+F[(i+r<<2)+c>>2]|0)-F[(i+p<<2)+c>>2];o=i|1;F[g+(o<<2)>>2]=(F[(l+o<<2)+c>>2]+F[(o+r<<2)+c>>2]|0)-F[(o+p<<2)+c>>2];i=i+2|0;s=s+2|0;if((C|0)!=(s|0)){continue}break}}if(!D){break u}F[g+(i<<2)>>2]=(F[(i+l<<2)+c>>2]+F[(i+r<<2)+c>>2]|0)-F[(i+p<<2)+c>>2]}g=4;j=j+1|0;if((j|0)==4){break q}}v:{if(k&1){i=d+1|0;d=(i>>>0)%3|0?i:d-2|0;g=-1;if((d|0)==-1){break v}d=F[n+(d<<2)>>2];g=-1;if((d|0)==-1){break v}g=d+1|0;g=(g>>>0)%3|0?g:d-2|0;break v}w:{if((d>>>0)%3|0){i=d-1|0;break w}i=d+2|0;g=-1;if((i|0)==-1){break v}}d=F[n+(i<<2)>>2];g=-1;if((d|0)==-1){break v}g=d-1|0;if((d>>>0)%3|0){break v}g=d+2|0}d=g;x:{if((f|0)==(d|0)){break x}if((d|0)==-1&k){if(!u){break x}d=F[q>>2];if((d|0)==-1){break x}k=0;d=(d>>>0)%3|0?d-1|0:d+2|0}if((d|0)!=-1){continue}}break}g=j;if((g|0)<=0){break p}}if(e){ma(t,0,M)}d=g-1|0;r=(d<<2)+y|0;d=L(d,12)+a|0;o=d;s=F[d- -64>>2];k=0;d=F[h>>2];f=0;while(1){j=F[r>>2];F[r>>2]=j+1;if(j>>>0>=s>>>0){break j}y:{if(F[F[o+60>>2]+(j>>>3&536870908)>>2]>>>j&1){break y}f=f+1|0;if(!e){break y}j=F[(h+16|0)+L(k,12)>>2];l=0;i=0;p=0;if(!N){while(1){n=i<<2;q=n+d|0;F[q>>2]=F[j+n>>2]+F[q>>2];q=n|4;u=q+d|0;F[u>>2]=F[j+q>>2]+F[u>>2];q=n|8;u=q+d|0;F[u>>2]=F[j+q>>2]+F[u>>2];n=n|12;q=n+d|0;F[q>>2]=F[j+n>>2]+F[q>>2];i=i+4|0;p=p+4|0;if((K|0)!=(p|0)){continue}break}}if(!E){break y}while(1){n=i<<2;p=n+d|0;F[p>>2]=F[j+n>>2]+F[p>>2];i=i+1|0;l=l+1|0;if((E|0)!=(l|0)){continue}break}}k=k+1|0;if((k|0)!=(g|0)){continue}break}g=L(e,m);if(!f){break o}if(!e){break l}i=0;d=0;if(G){break n}break m}g=L(e,m)}if(F[a+8>>2]<=0){break k}k=(L(m-1|0,e)<<2)+c|0;j=F[x>>2];i=0;while(1){d=i<<2;f=F[d+k>>2];l=F[a+16>>2];z:{if((f|0)>(l|0)){F[d+j>>2]=l;break z}d=d+j|0;l=F[a+12>>2];if((l|0)>(f|0)){F[d>>2]=l;break z}F[d>>2]=f}i=i+1|0;f=F[a+8>>2];if((i|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=g<<2;i=f+c|0;k=b+f|0;while(1){g=d<<2;f=g+i|0;g=F[g+k>>2]+F[g+j>>2]|0;F[f>>2]=g;A:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break A}g=g+F[a+20>>2]|0}F[f>>2]=g}d=d+1|0;if((d|0)>2]){continue}break}break k}ta();v()}while(1){j=i<<2;k=j+t|0;F[k>>2]=F[k>>2]/(f|0);j=(j|4)+t|0;F[j>>2]=F[j>>2]/(f|0);i=i+2|0;d=d+2|0;if((C|0)!=(d|0)){continue}break}}if(!D){break l}d=(i<<2)+t|0;F[d>>2]=F[d>>2]/(f|0)}if(F[a+8>>2]<=0){break k}j=F[x>>2];i=0;while(1){d=i<<2;f=F[d+t>>2];k=F[a+16>>2];B:{if((f|0)>(k|0)){F[d+j>>2]=k;break B}d=d+j|0;k=F[a+12>>2];if((k|0)>(f|0)){F[d>>2]=k;break B}F[d>>2]=f}i=i+1|0;f=F[a+8>>2];if((i|0)<(f|0)){continue}break}d=0;if((f|0)<=0){break k}f=g<<2;i=f+c|0;k=b+f|0;while(1){g=d<<2;f=g+i|0;g=F[g+k>>2]+F[g+j>>2]|0;F[f>>2]=g;C:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break C}g=g+F[a+20>>2]|0}F[f>>2]=g}d=d+1|0;if((d|0)>2]){continue}break}}m=m+1|0;z=(w|0)<=(m|0);if((m|0)!=(I|0)){continue}break}}a=F[h>>2];if(a){ja(a)}ja(y);a=F[h+52>>2];if(a){F[h+56>>2]=a;ja(a)}a=F[h+40>>2];if(a){F[h+44>>2]=a;ja(a)}a=F[h+28>>2];if(a){F[h+32>>2]=a;ja(a)}a=F[h+16>>2];if(a){F[h+20>>2]=a;ja(a)}Z=h- -64|0;return z|0}na();v()}function Yh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,$=0,aa=0;a:{b:{if((e|0)!=2){break b}F[a+8>>2]=2;F[a- -64>>2]=f;M=a+32|0;e=F[M>>2];d=F[a+36>>2]-e|0;c:{if(d>>>0<=7){qa(M,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}F[a+36>>2]=e+8}i=1;d=F[a+56>>2];d=F[d+4>>2]-F[d>>2]|0;if((d|0)<=0){break b}o=a+60|0;d=d>>>2|0;X=d>>>0<=1?1:d;Y=a+68|0;d=0;while(1){f=F[a+56>>2];e=F[f>>2];if(F[f+4>>2]-e>>2>>>0<=d>>>0){break a}k=Z-80|0;Z=k;f=-1;d:{e:{e=F[e+(d<<2)>>2];if((e|0)==-1){break e}i=F[o+32>>2];g=e+1|0;g=(g>>>0)%3|0?g:e-2|0;if((g|0)!=-1){f=F[F[i>>2]+(g<<2)>>2]}p=-1;e=e+((e>>>0)%3|0?-1:2)|0;if((e|0)!=-1){p=F[F[i>>2]+(e<<2)>>2]}i=F[o+36>>2];e=F[i>>2];i=F[i+4>>2]-e>>2;if(i>>>0<=f>>>0|i>>>0<=p>>>0){break e}f:{g:{h:{i:{j:{k:{j=F[e+(p<<2)>>2];f=F[e+(f<<2)>>2];if((j|0)>=(d|0)|(f|0)>=(d|0)){break k}i=(j<<3)+c|0;w=F[i+4>>2];g=(f<<3)+c|0;e=F[g+4>>2];l=F[i>>2];i=F[g>>2];if(!((l|0)!=(i|0)|(e|0)!=(w|0))){F[o+8>>2]=i;F[o+12>>2]=e;break j}p=F[F[o+4>>2]+(d<<2)>>2];F[k+72>>2]=0;F[k+76>>2]=0;g=k- -64|0;F[g>>2]=0;F[g+4>>2]=0;F[k+56>>2]=0;F[k+60>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+56|0);p=F[F[o+4>>2]+(f<<2)>>2];F[k+48>>2]=0;F[k+52>>2]=0;F[k+40>>2]=0;F[k+44>>2]=0;F[k+32>>2]=0;F[k+36>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+32|0);p=F[F[o+4>>2]+(j<<2)>>2];F[k+24>>2]=0;F[k+28>>2]=0;F[k+16>>2]=0;F[k+20>>2]=0;F[k+8>>2]=0;F[k+12>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+8|0);g=F[k+16>>2];n=F[k+40>>2];x=g-n|0;N=F[k+44>>2];g=F[k+20>>2]-(N+(g>>>0>>0)|0)|0;H=g;j=ki(x,g,x,g);q=_;g=F[k+8>>2];z=F[k+32>>2];A=g-z|0;O=F[k+36>>2];g=F[k+12>>2]-(O+(g>>>0>>0)|0)|0;I=g;h=j;j=ki(A,g,A,g);g=h+j|0;h=_+q|0;h=g>>>0>>0?h+1|0:h;j=F[k+24>>2];B=F[k+48>>2];C=j-B|0;P=F[k+52>>2];j=F[k+28>>2]-(P+(j>>>0>>0)|0)|0;J=j;m=g;g=ki(C,j,C,j);r=m+g|0;h=_+h|0;s=g>>>0>r>>>0?h+1|0:h;if(!(s|r)){break k}p=0;E=mi(-1,2147483647,r,s);f=i>>31;R=f;h=f>>31;Q=i;g=h;q=i^g;i=q-g|0;f=(f^g)-((g>>>0>q>>>0)+g|0)|0;g=f;f=e>>31;S=f;K=e;e=f>>31;q=K^e;m=q-e|0;h=f>>31;e=(h^f)-((e>>>0>q>>>0)+h|0)|0;f=(g|0)==(e|0)&i>>>0>m>>>0|e>>>0>>0;i=f?i:m;j=_;e=f?g:e;if((j|0)==(e|0)&i>>>0>E>>>0|e>>>0>j>>>0){break f}i=F[k+64>>2];T=F[k+68>>2];e=ki(i-n|0,T-((i>>>0>>0)+N|0)|0,x,H);f=_;g=F[k+56>>2];U=F[k+60>>2];j=ki(g-z|0,U-((g>>>0>>0)+O|0)|0,A,I);e=j+e|0;h=_+f|0;h=e>>>0>>0?h+1|0:h;f=e;m=F[k+72>>2];V=F[k+76>>2];e=ki(m-B|0,V-((m>>>0>>0)+P|0)|0,C,J);j=f+e|0;f=_+h|0;q=e>>>0>j>>>0?f+1|0:f;e=l;E=e-Q|0;e=(e>>31)-((e>>>0>>0)+R|0)|0;W=e;l=e>>31;y=l^E;f=y-l|0;h=e>>31;e=(h^e)-((l>>>0>y>>>0)+h|0)|0;h=e;y=w-K|0;e=(w>>31)-((w>>>0>>0)+S|0)|0;w=e;l=f;t=e>>31;u=t^y;L=u-t|0;f=e>>31;e=(f^e)-((t>>>0>u>>>0)+f|0)|0;f=(h|0)==(e|0)&l>>>0>L>>>0|e>>>0>>0;f=mi(-1,2147483647,f?l:L,f?h:e)>>>0>>0;e=_;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break f}e=I>>31;f=e;l=e^A;e=l-e|0;f=(f^I)-((f>>>0>l>>>0)+f|0)|0;h=H>>31;t=h^x;u=t-h|0;l=(h^H)-((h>>>0>t>>>0)+h|0)|0;h=(f|0)==(l|0)&e>>>0>u>>>0|f>>>0>l>>>0;e=h?e:u;f=h?f:l;h=J>>31;L=e;t=h^C;u=t-h|0;l=(h^J)-((h>>>0>t>>>0)+h|0)|0;e=(f|0)==(l|0)&e>>>0>u>>>0|f>>>0>l>>>0;f=mi(-1,2147483647,e?L:u,e?f:l)>>>0>>0;e=_;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break f}l=1;e=0;f=n;n=li(ki(j,q,x,H),_,r,s);f=f+n|0;h=_+N|0;h=f>>>0>>0?h+1|0:h;n=i-f|0;f=T-((f>>>0>i>>>0)+h|0)|0;n=ki(n,f,n,f);x=_;f=g;h=li(ki(j,q,A,I),_,r,s);i=h+z|0;g=_+O|0;g=h>>>0>i>>>0?g+1|0:g;h=f-i|0;f=U-((f>>>0>>0)+g|0)|0;g=ki(h,f,h,f);i=g+n|0;f=_+x|0;f=g>>>0>i>>>0?f+1|0:f;n=i;g=li(ki(j,q,C,J),_,r,s);i=g+B|0;h=_+P|0;h=g>>>0>i>>>0?h+1|0:h;g=m-i|0;i=V-((i>>>0>m>>>0)+h|0)|0;m=ki(g,i,g,i);i=m+n|0;g=_+f|0;f=ki(i,i>>>0>>0?g+1|0:g,r,s);i=_;m=i;if(!i&f>>>0<=1){break i}h=f;while(1){g=e<<1|l>>>31;l=l<<1;e=g;n=!i&h>>>0>7|(i|0)!=0;h=(i&3)<<30|h>>>2;i=i>>>2|0;if(n){continue}break}break h}if((d|0)>(f|0)){e=f<<1}else{if((d|0)<=0){F[o+8>>2]=0;F[o+12>>2]=0;break j}e=(d<<1)-2|0}e=(e<<2)+c|0;F[o+8>>2]=F[e>>2];F[o+12>>2]=F[e+4>>2]}p=1;break f}e=m;l=f;if(f-1|0){break g}}while(1){i=mi(f,m,l,e);h=e+_|0;e=i+l|0;h=e>>>0>>0?h+1|0:h;l=(h&1)<<31|e>>>1;e=h>>>1|0;i=ki(l,e,l,e);g=_;if((m|0)==(g|0)&f>>>0>>0|g>>>0>m>>>0){continue}break}}f=F[o+20>>2];if(!f){break f}g=f-1|0;h=F[F[o+16>>2]+(g>>>3&536870908)>>2];F[o+20>>2]=g;p=1;f=ki(j,q,y,w);i=_;n=ki(r,s,K,S);m=n+f|0;f=_+i|0;f=m>>>0>>0?f+1|0:f;i=ki(l,e,E,W);g=h>>>g&1;h=g?0-i|0:i;m=h+m|0;n=f;f=_;i=n+(g?0-(f+((i|0)!=0)|0)|0:f)|0;$=o,aa=li(m,h>>>0>m>>>0?i+1|0:i,r,s),F[$+12>>2]=aa;f=ki(j,q,E,W);i=_;j=ki(r,s,Q,R);f=j+f|0;h=_+i|0;e=ki(l,e,y,w);i=0-e|0;l=_;h=(f>>>0>>0?h+1|0:h)+(g?l:0-(((e|0)!=0)+l|0)|0)|0;i=g?e:i;f=i+f|0;$=o,aa=li(f,f>>>0>>0?h+1|0:h,r,s),F[$+8>>2]=aa}Z=k+80|0;e=p;break d}ta();v()}i=e;if(!e){return 0}l:{if(F[a+8>>2]<=0){break l}l=F[M>>2];e=0;while(1){f=e<<2;g=F[f+Y>>2];j=F[a+16>>2];m:{if((g|0)>(j|0)){F[f+l>>2]=j;break m}f=f+l|0;j=F[a+12>>2];if((j|0)>(g|0)){F[f>>2]=j;break m}F[f>>2]=g}e=e+1|0;g=F[a+8>>2];if((e|0)<(g|0)){continue}break}f=0;if((g|0)<=0){break l}e=d<<3;j=e+c|0;q=b+e|0;while(1){g=f<<2;e=g+j|0;g=F[g+q>>2]+F[g+l>>2]|0;F[e>>2]=g;n:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break n}g=g+F[a+20>>2]|0}F[e>>2]=g}f=f+1|0;if((f|0)>2]){continue}break}}d=d+1|0;if((X|0)!=(d|0)){continue}break}}return i|0}ta();v()}function hi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,E=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,$=0,aa=0;a:{b:{if((e|0)!=2){break b}F[a+8>>2]=2;F[a- -64>>2]=f;M=a+32|0;e=F[M>>2];d=F[a+36>>2]-e|0;c:{if(d>>>0<=7){qa(M,2-(d>>>2|0)|0);break c}if((d|0)==8){break c}F[a+36>>2]=e+8}p=1;d=F[a+56>>2];d=F[d+4>>2]-F[d>>2]|0;if((d|0)<=0){break b}o=a+60|0;d=d>>>2|0;X=d>>>0<=1?1:d;Y=a+68|0;d=0;while(1){e=F[a+56>>2];h=F[e>>2];if(F[e+4>>2]-h>>2>>>0<=d>>>0){break a}k=Z-80|0;Z=k;f=-1;h=F[h+(d<<2)>>2];e=-1;d:{if((h|0)==-1){break d}e=h+1|0;f=(e>>>0)%3|0?e:h-2|0;e=h-1|0;if((h>>>0)%3|0){break d}e=h+2|0}g=F[o+36>>2];h=F[g>>2];e:{f:{g:{h:{i:{g=F[g+4>>2]-h>>2;i=f<<2;f=F[F[o+32>>2]+28>>2];j=F[i+f>>2];if(g>>>0<=j>>>0){break i}e=F[f+(e<<2)>>2];if(e>>>0>=g>>>0){break i}j:{k:{l=F[h+(e<<2)>>2];f=F[h+(j<<2)>>2];if((l|0)>=(d|0)|(f|0)>=(d|0)){break k}h=(l<<3)+c|0;w=F[h+4>>2];g=(f<<3)+c|0;e=F[g+4>>2];j=F[h>>2];h=F[g>>2];if(!((j|0)!=(h|0)|(e|0)!=(w|0))){F[o+8>>2]=h;F[o+12>>2]=e;break j}p=F[F[o+4>>2]+(d<<2)>>2];F[k+72>>2]=0;F[k+76>>2]=0;g=k- -64|0;F[g>>2]=0;F[g+4>>2]=0;F[k+56>>2]=0;F[k+60>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+56|0);p=F[F[o+4>>2]+(f<<2)>>2];F[k+48>>2]=0;F[k+52>>2]=0;F[k+40>>2]=0;F[k+44>>2]=0;F[k+32>>2]=0;F[k+36>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+32|0);p=F[F[o+4>>2]+(l<<2)>>2];F[k+24>>2]=0;F[k+28>>2]=0;F[k+16>>2]=0;F[k+20>>2]=0;F[k+8>>2]=0;F[k+12>>2]=0;g=F[o>>2];if(!G[g+84|0]){p=F[F[g+68>>2]+(p<<2)>>2]}Ga(g,p,D[g+24|0],k+8|0);g=F[k+16>>2];n=F[k+40>>2];x=g-n|0;N=F[k+44>>2];g=F[k+20>>2]-(N+(g>>>0>>0)|0)|0;H=g;l=ki(x,g,x,g);q=_;g=F[k+8>>2];z=F[k+32>>2];A=g-z|0;O=F[k+36>>2];g=F[k+12>>2]-(O+(g>>>0>>0)|0)|0;I=g;i=l;l=ki(A,g,A,g);g=i+l|0;i=_+q|0;i=g>>>0>>0?i+1|0:i;l=F[k+24>>2];B=F[k+48>>2];C=l-B|0;P=F[k+52>>2];l=F[k+28>>2]-(P+(l>>>0>>0)|0)|0;J=l;m=g;g=ki(C,l,C,l);r=m+g|0;i=_+i|0;s=g>>>0>r>>>0?i+1|0:i;if(!(s|r)){break k}p=0;E=mi(-1,2147483647,r,s);f=h>>31;R=f;i=f>>31;Q=h;g=i;q=h^g;h=q-g|0;f=(f^g)-((g>>>0>q>>>0)+g|0)|0;g=f;f=e>>31;S=f;K=e;e=f>>31;q=K^e;m=q-e|0;i=f>>31;e=(i^f)-((e>>>0>q>>>0)+i|0)|0;f=(g|0)==(e|0)&h>>>0>m>>>0|e>>>0>>0;h=f?h:m;l=_;e=f?g:e;if((l|0)==(e|0)&h>>>0>E>>>0|e>>>0>l>>>0){break e}h=F[k+64>>2];T=F[k+68>>2];e=ki(h-n|0,T-((h>>>0>>0)+N|0)|0,x,H);f=_;g=F[k+56>>2];U=F[k+60>>2];l=ki(g-z|0,U-((g>>>0>>0)+O|0)|0,A,I);e=l+e|0;i=_+f|0;i=e>>>0>>0?i+1|0:i;f=e;m=F[k+72>>2];V=F[k+76>>2];e=ki(m-B|0,V-((m>>>0>>0)+P|0)|0,C,J);l=f+e|0;f=_+i|0;q=e>>>0>l>>>0?f+1|0:f;e=j;E=e-Q|0;e=(e>>31)-((e>>>0>>0)+R|0)|0;W=e;j=e>>31;y=j^E;f=y-j|0;i=e>>31;e=(i^e)-((j>>>0>y>>>0)+i|0)|0;i=e;y=w-K|0;e=(w>>31)-((w>>>0>>0)+S|0)|0;w=e;j=f;t=e>>31;u=t^y;L=u-t|0;f=e>>31;e=(f^e)-((t>>>0>u>>>0)+f|0)|0;f=(i|0)==(e|0)&j>>>0>L>>>0|e>>>0>>0;f=mi(-1,2147483647,f?j:L,f?i:e)>>>0>>0;e=_;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break e}e=I>>31;f=e;j=e^A;e=j-e|0;f=(f^I)-((f>>>0>j>>>0)+f|0)|0;i=H>>31;t=i^x;u=t-i|0;j=(i^H)-((i>>>0>t>>>0)+i|0)|0;i=(f|0)==(j|0)&e>>>0>u>>>0|f>>>0>j>>>0;e=i?e:u;f=i?f:j;i=J>>31;L=e;t=i^C;u=t-i|0;j=(i^J)-((i>>>0>t>>>0)+i|0)|0;e=(f|0)==(j|0)&e>>>0>u>>>0|f>>>0>j>>>0;f=mi(-1,2147483647,e?L:u,e?f:j)>>>0>>0;e=_;if(f&(e|0)<=(q|0)|(e|0)<(q|0)){break e}j=1;e=0;f=n;n=li(ki(l,q,x,H),_,r,s);f=f+n|0;i=_+N|0;i=f>>>0>>0?i+1|0:i;n=h-f|0;f=T-((f>>>0>h>>>0)+i|0)|0;n=ki(n,f,n,f);x=_;f=g;i=li(ki(l,q,A,I),_,r,s);h=i+z|0;g=_+O|0;g=h>>>0>>0?g+1|0:g;i=f-h|0;f=U-((f>>>0>>0)+g|0)|0;g=ki(i,f,i,f);h=g+n|0;f=_+x|0;f=h>>>0>>0?f+1|0:f;n=h;g=li(ki(l,q,C,J),_,r,s);h=g+B|0;i=_+P|0;i=h>>>0>>0?i+1|0:i;g=m-h|0;h=V-((h>>>0>m>>>0)+i|0)|0;m=ki(g,h,g,h);h=m+n|0;g=_+f|0;f=ki(h,h>>>0>>0?g+1|0:g,r,s);h=_;m=h;if(!h&f>>>0<=1){break h}i=f;while(1){g=e<<1|j>>>31;j=j<<1;e=g;n=!h&i>>>0>7|(h|0)!=0;i=(h&3)<<30|i>>>2;h=h>>>2|0;if(n){continue}break}break g}if((d|0)>(f|0)){e=f<<1}else{if((d|0)<=0){F[o+8>>2]=0;F[o+12>>2]=0;break j}e=(d<<1)-2|0}e=(e<<2)+c|0;F[o+8>>2]=F[e>>2];F[o+12>>2]=F[e+4>>2]}p=1;break e}ta();v()}e=m;j=f;if(f-1|0){break f}}while(1){h=mi(f,m,j,e);i=e+_|0;e=h+j|0;i=e>>>0>>0?i+1|0:i;j=(i&1)<<31|e>>>1;e=i>>>1|0;h=ki(j,e,j,e);g=_;if((m|0)==(g|0)&f>>>0>>0|g>>>0>m>>>0){continue}break}}f=F[o+20>>2];if(!f){break e}g=f-1|0;i=F[F[o+16>>2]+(g>>>3&536870908)>>2];F[o+20>>2]=g;p=1;f=ki(l,q,y,w);h=_;n=ki(r,s,K,S);m=n+f|0;f=_+h|0;f=m>>>0>>0?f+1|0:f;h=ki(j,e,E,W);g=i>>>g&1;i=g?0-h|0:h;m=i+m|0;n=f;f=_;h=n+(g?0-(f+((h|0)!=0)|0)|0:f)|0;$=o,aa=li(m,i>>>0>m>>>0?h+1|0:h,r,s),F[$+12>>2]=aa;f=ki(l,q,E,W);h=_;l=ki(r,s,Q,R);f=l+f|0;i=_+h|0;e=ki(j,e,y,w);h=0-e|0;j=_;i=(f>>>0>>0?i+1|0:i)+(g?j:0-(((e|0)!=0)+j|0)|0)|0;h=g?e:h;f=h+f|0;$=o,aa=li(f,f>>>0>>0?i+1|0:i,r,s),F[$+8>>2]=aa}Z=k+80|0;if(!p){return 0}l:{if(F[a+8>>2]<=0){break l}g=F[M>>2];e=0;while(1){f=e<<2;h=F[f+Y>>2];j=F[a+16>>2];m:{if((h|0)>(j|0)){F[f+g>>2]=j;break m}f=f+g|0;j=F[a+12>>2];if((j|0)>(h|0)){F[f>>2]=j;break m}F[f>>2]=h}e=e+1|0;h=F[a+8>>2];if((e|0)<(h|0)){continue}break}f=0;if((h|0)<=0){break l}e=d<<3;j=e+c|0;l=b+e|0;while(1){h=f<<2;e=h+j|0;h=F[h+l>>2]+F[h+g>>2]|0;F[e>>2]=h;n:{if((h|0)>F[a+16>>2]){i=h-F[a+20>>2]|0}else{if((h|0)>=F[a+12>>2]){break n}i=h+F[a+20>>2]|0}F[e>>2]=i}f=f+1|0;if((f|0)>2]){continue}break}}d=d+1|0;if((X|0)!=(d|0)){continue}break}}return p|0}ta();v()}function Gd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;n=Z-96|0;Z=n;m=F[a+4>>2];d=F[m+32>>2];j=F[d+8>>2];i=F[d+12>>2];e=i;c=F[d+20>>2];f=F[d+16>>2];a:{if((e|0)<=(c|0)&f>>>0>=j>>>0|(c|0)>(e|0)){break a}o=F[d>>2];h=G[o+f|0];g=f+1|0;e=g?c:c+1|0;F[d+16>>2]=g;F[d+20>>2]=e;if((e|0)>=(i|0)&g>>>0>=j>>>0|(e|0)>(i|0)){break a}p=G[g+o|0];g=f+2|0;e=g>>>0<2?c+1|0:c;F[d+16>>2]=g;F[d+20>>2]=e;l=h<<24>>24;b:{if((l|0)>=0){k=F[a+216>>2];if(h>>>0>=(F[a+220>>2]-k|0)/144>>>0){break a}k=k+L(h,144)|0;if(F[k>>2]<0){break b}break a}if(F[a+212>>2]>=0){break a}k=a+212|0}F[k>>2]=b;c:{d:{e:{f:{g:{h:{k=H[m+36>>1];i:{if(((k<<8|k>>>8)&65535)>>>0>=258){if((e|0)>=(i|0)&g>>>0>=j>>>0|(e|0)>(i|0)){break a}e=G[g+o|0];f=f+3|0;c=f>>>0<3?c+1|0:c;F[d+16>>2]=f;F[d+20>>2]=c;if(e>>>0>1){break a}d=e>>>0<2?e:0;if(!p){break i}if(!d){break h}break a}if(p){break g}d=0}if((l|0)<0){e=a+184|0}else{c=F[a+216>>2]+L(h,144)|0;D[c+100|0]=0;e=c+104|0}if((d|0)!=1){break e}c=Z-112|0;Z=c;g=F[F[a+4>>2]+44>>2];d=ka(120);F[d>>2]=8924;F[d+4>>2]=0;F[d+116>>2]=0;F[d+112>>2]=e;F[d+108>>2]=g;F[d+12>>2]=0;F[d+16>>2]=0;F[d+20>>2]=0;F[d+24>>2]=0;F[d+28>>2]=0;F[d+32>>2]=0;F[d+36>>2]=0;F[d+40>>2]=0;F[d+44>>2]=0;F[d+48>>2]=0;F[d+52>>2]=0;F[d+56>>2]=0;F[d+60>>2]=0;F[d+8>>2]=9136;f=d- -64|0;F[f>>2]=0;F[f+4>>2]=0;F[d+72>>2]=0;F[d+76>>2]=0;F[d+80>>2]=0;F[d+84>>2]=0;F[d+88>>2]=0;F[d+104>>2]=0;F[d+96>>2]=0;F[d+100>>2]=0;f=F[a+8>>2];F[c+48>>2]=0;F[c+52>>2]=0;F[c+40>>2]=0;F[c+44>>2]=0;j=c+32|0;F[j>>2]=0;F[j+4>>2]=0;F[c+24>>2]=0;F[c+28>>2]=0;h=c- -64|0;F[h>>2]=0;F[h+4>>2]=0;F[c+72>>2]=0;F[c+76>>2]=0;F[c+80>>2]=0;F[c+84>>2]=0;F[c+88>>2]=0;F[c+104>>2]=0;F[c+16>>2]=0;F[c+20>>2]=0;F[c+56>>2]=0;F[c+60>>2]=0;F[c+8>>2]=9136;F[c+96>>2]=0;F[c+100>>2]=0;F[c+12>>2]=f;h=F[f>>2];i=F[f+4>>2];D[c+111|0]=0;k=j;j=c+111|0;Ea(k,(i-h>>2>>>0)/3|0,j);h=F[c+12>>2];i=F[h+28>>2];h=F[h+24>>2];D[c+111|0]=0;Ea(c+44|0,i-h>>2,j);F[c+28>>2]=d;F[c+24>>2]=g;F[c+20>>2]=e;F[c+16>>2]=f;f=d+8|0;e=c+8|0;lc(f,e);j:{if((e|0)==(f|0)){F[d+92>>2]=F[e+84>>2];break j}gb(d+56|0,F[e+48>>2],F[e+52>>2]);gb(d+68|0,F[e+60>>2],F[e- -64>>2]);gb(d+80|0,F[e+72>>2],F[e+76>>2]);F[d+92>>2]=F[e+84>>2];k:{h=F[e+92>>2];j=F[e+88>>2];i=h-j|0;e=i>>2;f=F[d+104>>2];g=F[d+96>>2];if(e>>>0<=f-g>>2>>>0){i=F[d+100>>2]-g|0;f=i+j|0;m=i>>2;i=e>>>0>m>>>0?f:h;l=i-j|0;if((i|0)!=(j|0)){pa(g,j,l)}if(e>>>0>m>>>0){e=F[d+100>>2];if((h|0)!=(i|0)){while(1){F[e>>2]=F[f>>2];e=e+4|0;f=f+4|0;if((h|0)!=(f|0)){continue}break}}F[d+100>>2]=e;break k}F[d+100>>2]=g+l;break k}if(g){F[d+100>>2]=g;ja(g);F[d+104>>2]=0;F[d+96>>2]=0;F[d+100>>2]=0;f=0}l:{if((i|0)<0){break l}g=f>>>1|0;e=f>>>0>=2147483644?1073741823:e>>>0>>0?g:e;if(e>>>0>=1073741824){break l}f=e<<2;e=ka(f);F[d+96>>2]=e;F[d+104>>2]=e+f;if((h|0)!=(j|0)){f=e;e=(i-4&-4)+4|0;e=la(f,j,e)+e|0}F[d+100>>2]=e;break k}na();v()}}F[c+8>>2]=9136;e=F[c+96>>2];if(e){F[c+100>>2]=e;ja(e)}e=F[c+80>>2];if(e){F[c+84>>2]=e;ja(e)}e=F[c+68>>2];if(e){F[c+72>>2]=e;ja(e)}e=F[c+56>>2];if(e){F[c+60>>2]=e;ja(e)}F[c+8>>2]=9372;e=F[c+44>>2];if(e){ja(e)}e=F[c+32>>2];if(e){ja(e)}Z=c+112|0;break d}if((l|0)>=0){break f}break a}if((l|0)<0){break a}}e=F[a+216>>2];c=F[m+44>>2];d=ka(80);F[d>>2]=9684;F[d+4>>2]=0;F[d+76>>2]=0;F[d+68>>2]=c;F[d+8>>2]=8624;F[d+12>>2]=0;F[d+16>>2]=0;F[d+20>>2]=0;F[d+24>>2]=0;F[d+28>>2]=0;F[d+32>>2]=0;F[d+36>>2]=0;F[d+40>>2]=0;F[d+44>>2]=0;F[d+48>>2]=0;F[d+52>>2]=0;e=e+L(h,144)|0;f=e+104|0;F[d+72>>2]=f;F[d- -64>>2]=0;F[d+56>>2]=0;F[d+60>>2]=0;F[n+24>>2]=c;c=n;F[c+68>>2]=0;F[c+72>>2]=0;F[c+60>>2]=0;F[c+64>>2]=0;F[c+52>>2]=0;F[c+56>>2]=0;F[c+44>>2]=0;F[c+48>>2]=0;F[c+84>>2]=0;F[c+88>>2]=0;F[c+76>>2]=0;F[c+80>>2]=0;F[c+28>>2]=d;g=F[c+28>>2];F[c+8>>2]=F[c+24>>2];F[c+12>>2]=g;F[c+20>>2]=f;f=e+4|0;F[c+16>>2]=f;F[c+36>>2]=0;F[c+40>>2]=0;F[c+32>>2]=8624;e=F[c+20>>2];F[c>>2]=F[c+16>>2];F[c+4>>2]=e;e=c+32|0;Fd(e,f,c);c=d+8|0;lc(c,e);if((c|0)!=(e|0)){gb(d+56|0,F[e+48>>2],F[e+52>>2])}Ed(e);break c}c=Z+-64|0;Z=c;g=F[F[a+4>>2]+44>>2];d=ka(80);F[d>>2]=9392;F[d+4>>2]=0;F[d+76>>2]=0;F[d+72>>2]=e;F[d+68>>2]=g;F[d+8>>2]=9556;F[d+12>>2]=0;F[d+16>>2]=0;F[d+20>>2]=0;F[d+24>>2]=0;F[d+28>>2]=0;F[d+32>>2]=0;F[d+36>>2]=0;F[d+40>>2]=0;F[d+44>>2]=0;F[d+48>>2]=0;F[d+52>>2]=0;F[d- -64>>2]=0;j=d+56|0;f=j;F[f>>2]=0;F[f+4>>2]=0;f=F[a+8>>2];F[c+40>>2]=0;F[c+44>>2]=0;F[c+32>>2]=0;F[c+36>>2]=0;h=c+24|0;F[h>>2]=0;F[h+4>>2]=0;F[c+16>>2]=0;F[c+20>>2]=0;F[c+56>>2]=0;F[c+8>>2]=0;F[c+12>>2]=0;F[c+48>>2]=0;F[c+52>>2]=0;F[c>>2]=9556;F[c+4>>2]=f;i=F[f>>2];l=F[f+4>>2];D[c+63|0]=0;k=h;h=c+63|0;Ea(k,(l-i>>2>>>0)/3|0,h);i=F[c+4>>2];l=F[i+28>>2];i=F[i+24>>2];D[c+63|0]=0;Ea(c+36|0,l-i>>2,h);F[c+20>>2]=d;F[c+16>>2]=g;F[c+12>>2]=e;F[c+8>>2]=f;lc(d+8|0,c);gb(j,F[c+48>>2],F[c+52>>2]);F[c>>2]=9556;e=F[c+48>>2];if(e){F[c+52>>2]=e;ja(e)}F[c>>2]=9372;e=F[c+36>>2];if(e){ja(e)}e=F[c+24>>2];if(e){ja(e)}Z=c- -64|0}if(!d){break a}}d=yc(ka(64),d);c=F[a+4>>2];a=d;d=b;m:{n:{if((d|0)>=0){g=c+8|0;b=F[c+12>>2];j=F[c+8>>2];e=b-j>>2;o:{if((e|0)>(d|0)){break o}f=d+1|0;if(d>>>0>=e>>>0){Pb(g,f-e|0);break o}if(e>>>0<=f>>>0){break o}f=j+(f<<2)|0;if((f|0)!=(b|0)){while(1){b=b-4|0;e=F[b>>2];F[b>>2]=0;if(e){$[F[F[e>>2]+4>>2]](e)}if((b|0)!=(f|0)){continue}break}}F[c+12>>2]=f}c=F[g>>2]+(d<<2)|0;b=F[c>>2];F[c>>2]=a;if(b){break n}break m}b=a;if(!a){break m}}$[F[F[b>>2]+4>>2]](b)}q=(d^-1)>>>31|0}Z=n+96|0;return q|0}function Ab(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=M(0),n=M(0),o=0;a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=D[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=H[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=E[b>>1];if((e|0)<0){break b}E[(g<<1)+d>>1]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(e+32768>>>0>65535){break b}E[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(e>>>0>32767){break b}E[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;k=F[e+4>>2];while(1){if(b>>>0>=k>>>0){break b}h=F[b+4>>2];e=F[b>>2];i=e+32768|0;h=i>>>0<32768?h+1|0:h;if(!h&i>>>0>65535|h){break b}E[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=F[b+4>>2];e=F[b>>2];if(!k&e>>>0>32767|k){break b}E[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=F[a>>2];j=F[e>>2];g=j;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-j|0;if(!G[a+32|0]){j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(32767)|m>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(32767)|mM(1)){break d}e=(b<<1)+d|0;l=R(+m*32767+.5);f:{if(N(l)<2147483648){i=~~l;break f}i=-2147483648}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=1;if(c>>>0<=e>>>0){break d}ma((e<<1)+d|0,0,c-e<<1)}return j;case 9:g:{h:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=F[a>>2];j=F[e>>2];g=j;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-j|0;if(!G[a+32|0]){j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=K[g>>3];if(l>=32767|l<-32768|l!=l){break g}o=N(l);if(o==Infinity){break g}e=(b<<1)+d|0;if(o<2147483648){i=~~l}else{i=-2147483648}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=K[g>>3];if(l>=32767|l<-32768|(N(l)==Infinity|l!=l)){break g}if(l<0|l>1){break g}e=(b<<1)+d|0;l=R(l*32767+.5);i:{if(N(l)<2147483648){i=~~l;break i}i=-2147483648}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=1;if(c>>>0<=e>>>0){break g}ma((e<<1)+d|0,0,c-e<<1)}return j;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}ma((e<<1)+d|0,0,(c&255)-e<<1)}return j}ma((e<<1)+d|0,0,(c&255)-e<<1);return 1}function yb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=M(0),n=M(0),o=0;a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=D[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=E[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=H[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=F[b>>2];b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=F[b>>2];if((e|0)<0){break b}F[(g<<2)+d>>2]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;k=F[e+4>>2];while(1){if(b>>>0>=k>>>0){break b}h=F[b+4>>2];e=F[b>>2];if(e- -2147483648>>>0<2147483648?h+1|0:h){break b}F[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=F[b+4>>2];e=F[b>>2];if(!k&e>>>0>2147483647|k){break b}F[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=F[a>>2];j=F[e>>2];g=j;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-j|0;if(!G[a+32|0]){j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(2147483648)|m>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(2147483648)|mM(1)){break d}e=(b<<2)+d|0;l=R(+m*2147483647+.5);f:{if(N(l)<2147483648){i=~~l;break f}i=-2147483648}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}j=1;if(c>>>0<=e>>>0){break d}ma((e<<2)+d|0,0,c-e<<2)}return j;case 9:g:{h:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=F[a>>2];j=F[e>>2];g=j;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-j|0;if(!G[a+32|0]){j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=K[g>>3];if(l>=2147483647|l<-2147483648|l!=l){break g}o=N(l);if(o==Infinity){break g}e=(b<<2)+d|0;if(o<2147483648){i=~~l}else{i=-2147483648}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=0;if((b|0)>=(e|0)){break g}b=0;while(1){l=K[g>>3];if(l>=2147483647|l<-2147483648|(N(l)==Infinity|l!=l)){break g}if(l<0|l>1){break g}e=(b<<2)+d|0;l=R(l*2147483647+.5);i:{if(N(l)<2147483648){i=~~l;break i}i=-2147483648}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}j=1;if(c>>>0<=e>>>0){break g}ma((e<<2)+d|0,0,c-e<<2)}return j;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}j=1;if(e>>>0>=f>>>0){break b}ma((e<<2)+d|0,0,(c&255)-e<<2)}return j}ma((e<<2)+d|0,0,(c&255)-e<<2);return 1}function zb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=M(0);a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=D[b|0];if((e|0)<0){break b}E[(g<<1)+d>>1]=e&255;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){return 0}e=E[b>>1];if((e|0)<0){break b}E[(g<<1)+d>>1]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=H[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(e>>>0>65535){break b}E[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(e>>>0>65535){break b}E[(g<<1)+d>>1]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=F[b+4>>2];e=F[b>>2];if(!k&e>>>0>65535|k){break b}E[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}k=F[b+4>>2];e=F[b>>2];if(!k&e>>>0>65535|k){break b}E[(g<<1)+d>>1]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=F[a>>2];l=F[e>>2];g=l;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-l|0;if(!G[a+32|0]){l=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(65535)|m=M(0)){i=~~m>>>0}else{i=0}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}l=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(65535)|mM(1)){break d}e=(b<<1)+d|0;j=R(+m*65535+.5);f:{if(j<4294967296&j>=0){i=~~j>>>0;break f}i=0}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}l=1;if(c>>>0<=e>>>0){break d}ma((e<<1)+d|0,0,c-e<<1)}return l;case 9:g:{h:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=F[a>>2];l=F[e>>2];g=l;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-l|0;if(!G[a+32|0]){l=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=K[g>>3];if(j>=65535|j<0|(N(j)==Infinity|j!=j)){break g}e=(b<<1)+d|0;if(j<4294967296&j>=0){i=~~j>>>0}else{i=0}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}l=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=K[g>>3];if(j>=65535|j<0|(N(j)==Infinity|j!=j)){break g}if(j>1){break g}e=(b<<1)+d|0;j=R(j*65535+.5);i:{if(j<4294967296&j>=0){i=~~j>>>0;break i}i=0}E[e>>1]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}l=1;if(c>>>0<=e>>>0){break g}ma((e<<1)+d|0,0,c-e<<1)}return l;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];k=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+k|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}E[(g<<1)+d>>1]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break b}ma((e<<1)+d|0,0,(c&255)-e<<1)}return l}ma((e<<1)+d|0,0,(c&255)-e<<1);return 1}function Ga(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=M(0),l=0,m=0,n=M(0),o=0;a:{if(!d){break a}b:{c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=D[b|0];F[e>>2]=i;F[e+4>>2]=i>>31;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 1:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;F[e>>2]=G[b|0];F[e+4>>2]=0;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 2:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=E[b>>1];F[e>>2]=i;F[e+4>>2]=i>>31;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 3:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;F[e>>2]=H[b>>1];F[e+4>>2]=0;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 4:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;i=F[b>>2];F[e>>2]=i;F[e+4>>2]=i>>31;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 5:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;F[e>>2]=F[b>>2];F[e+4>>2]=0;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 6:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}i=F[b+4>>2];e=(g<<3)+d|0;F[e>>2]=F[b>>2];F[e+4>>2]=i;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 7:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=F[b>>2];i=F[b+4>>2];if((i|0)<0){break a}j=(g<<3)+d|0;F[j>>2]=e;F[j+4>>2]=i;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 8:d:{e=G[a+24|0];f=c&255;if(!(e>>>0>>0?e:f)){break d}if(G[a+32|0]){break a}e=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+e|0;e=F[a>>2];i=F[e+4>>2];e=F[e>>2];if((b|0)>=(i-e|0)){break a}g=b+e|0;h=c&255;b=0;while(1){k=J[g>>2];if(k>=M(0x8000000000000000)|k=M(1)?~~(k>M(0)?M(P(M(R(M(k*M(2.3283064365386963e-10)))),M(4294967296))):M(S(M(M(k-M(~~k>>>0>>>0))*M(2.3283064365386963e-10)))))>>>0:0;m=~~k>>>0;break e}j=-2147483648;m=0}F[e>>2]=m;F[e+4>>2]=j;b=b+1|0;e=G[a+24|0];if(b>>>0>=(e>>>0>>0?e:h)>>>0){break d}g=g+4|0;if(i>>>0>g>>>0){continue}break}break a}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 9:f:{e=G[a+24|0];f=c&255;if(!(e>>>0>>0?e:f)){break f}if(G[a+32|0]){break a}e=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+e|0;e=F[a>>2];i=F[e+4>>2];e=F[e>>2];if((b|0)>=(i-e|0)){break a}g=b+e|0;h=c&255;b=0;while(1){l=K[g>>3];if(l>=0x8000000000000000|l<-0x8000000000000000|l!=l){break a}o=N(l);if(o==Infinity){break a}e=(b<<3)+d|0;g:{if(o<0x8000000000000000){j=N(l)>=1?~~(l>0?P(R(l*2.3283064365386963e-10),4294967295):S((l-+(~~l>>>0>>>0))*2.3283064365386963e-10))>>>0:0;m=~~l>>>0;break g}j=-2147483648;m=0}F[e>>2]=m;F[e+4>>2]=j;b=b+1|0;e=G[a+24|0];if(b>>>0>=(e>>>0>>0?e:h)>>>0){break f}g=g+8|0;if(i>>>0>g>>>0){continue}break}break a}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0;break b;case 10:break c;default:break a}}e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);j=b;b=b+i|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break a}e=(g<<3)+d|0;F[e>>2]=G[b|0];F[e+4>>2]=0;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}if(e>>>0>=f>>>0){break a}d=(e<<3)+d|0;a=(c&255)-e|0}ma(d,0,a<<3)}}function le(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=a;a:{b:{c:{d:{e:{f:{g:{h:{a=F[a+8>>2];switch(F[a+28>>2]-1|0){case 4:break c;case 5:break d;case 2:break e;case 3:break f;case 0:break g;case 1:break h;default:break a}}f=G[a+24|0];c=ka(f);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(f){o=f&252;l=f&3;h=f>>>0<4;while(1){a=0;e=0;if(!h){while(1){k=g+(d<<2)|0;D[a+c|0]=F[k>>2];D[(a|1)+c|0]=F[k+4>>2];D[(a|2)+c|0]=F[k+8>>2];D[(a|3)+c|0]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){D[a+c|0]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+m|0,c,f);m=f+m|0;n=n+1|0;if((n|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,f);a=a+f|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,f);a=a+f|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,f);break b}f=G[a+24|0];c=ka(f);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(f){o=f&252;l=f&3;h=f>>>0<4;while(1){a=0;e=0;if(!h){while(1){k=g+(d<<2)|0;D[a+c|0]=F[k>>2];D[(a|1)+c|0]=F[k+4>>2];D[(a|2)+c|0]=F[k+8>>2];D[(a|3)+c|0]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){D[a+c|0]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+m|0,c,f);m=f+m|0;n=n+1|0;if((n|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,f);a=a+f|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,f);a=a+f|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,f);break b}h=G[a+24|0];i=h<<1;c=ka(i);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<1;k=g+(d<<2)|0;E[f+c>>1]=F[k>>2];E[(f|2)+c>>1]=F[k+4>>2];E[(f|4)+c>>1]=F[k+8>>2];E[(f|6)+c>>1]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){E[(a<<1)+c>>1]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=G[a+24|0];i=h<<1;c=ka(i);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<1;k=g+(d<<2)|0;E[f+c>>1]=F[k>>2];E[(f|2)+c>>1]=F[k+4>>2];E[(f|4)+c>>1]=F[k+8>>2];E[(f|6)+c>>1]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){E[(a<<1)+c>>1]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=G[a+24|0];i=h<<2;c=ka(i);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<2;k=g+(d<<2)|0;F[f+c>>2]=F[k>>2];F[(f|4)+c>>2]=F[k+4>>2];F[(f|8)+c>>2]=F[k+8>>2];F[(f|12)+c>>2]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){F[(a<<2)+c>>2]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);break b}h=G[a+24|0];i=h<<2;c=ka(i);a=F[j+16>>2];if(F[a+80>>2]){g=F[F[a>>2]>>2]+F[a+48>>2]|0}else{g=0}if(!b){break b}if(h){o=h&252;l=h&3;h=h>>>0<4;while(1){a=0;e=0;if(!h){while(1){f=a<<2;k=g+(d<<2)|0;F[f+c>>2]=F[k>>2];F[(f|4)+c>>2]=F[k+4>>2];F[(f|8)+c>>2]=F[k+8>>2];F[(f|12)+c>>2]=F[k+12>>2];a=a+4|0;d=d+4|0;e=e+4|0;if((o|0)!=(e|0)){continue}break}}e=0;if(l){while(1){F[(a<<2)+c>>2]=F[g+(d<<2)>>2];a=a+1|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}la(F[F[F[j+8>>2]+64>>2]>>2]+n|0,c,i);n=i+n|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break b}a=0;if((b|0)!=1){g=b&-2;while(1){la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i);a=a+i|0;la(a+F[F[F[j+8>>2]+64>>2]>>2]|0,c,i);a=a+i|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(!(b&1)){break b}la(F[F[F[j+8>>2]+64>>2]>>2]+a|0,c,i)}ja(c);c=1}return c|0}function xb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=M(0);a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=D[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=E[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=H[b>>1];b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=F[b>>2];b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=F[b>>2];b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(F[b+4>>2]){break b}F[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}e=F[b>>2];if(F[b+4>>2]){break b}F[(g<<2)+d>>2]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:d:{e:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break e}e=F[a>>2];k=F[e>>2];g=k;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-k|0;if(!G[a+32|0]){k=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(4294967296)|m=M(0)){i=~~m>>>0}else{i=0}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}k=0;if((b|0)>=(e|0)){break d}b=0;while(1){m=J[g>>2];if(m>=M(4294967296)|mM(1)){break d}e=(b<<2)+d|0;j=R(+m*4294967295+.5);f:{if(j<4294967296&j>=0){i=~~j>>>0;break f}i=0}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break e}g=g+4|0;if(f>>>0>g>>>0){continue}break}break d}k=1;if(c>>>0<=e>>>0){break d}ma((e<<2)+d|0,0,c-e<<2)}return k;case 9:g:{h:{e=G[a+24|0];c=c&255;if(!(c>>>0>e>>>0?e:c)){break h}e=F[a>>2];k=F[e>>2];g=k;f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+f|0;g=b+g|0;f=F[e+4>>2];e=f-k|0;if(!G[a+32|0]){k=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=K[g>>3];if(j>=4294967295|j<0|(N(j)==Infinity|j!=j)){break g}e=(b<<2)+d|0;if(j<4294967296&j>=0){i=~~j>>>0}else{i=0}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}k=0;if((b|0)>=(e|0)){break g}b=0;while(1){j=K[g>>3];if(j>=4294967295|j<0|(N(j)==Infinity|j!=j)){break g}if(j>1){break g}e=(b<<2)+d|0;j=R(j*4294967295+.5);i:{if(j<4294967296&j>=0){i=~~j>>>0;break i}i=0}F[e>>2]=i;b=b+1|0;e=G[a+24|0];if(b>>>0>=(c>>>0>e>>>0?e:c)>>>0){break h}g=g+8|0;if(f>>>0>g>>>0){continue}break}break g}k=1;if(c>>>0<=e>>>0){break g}ma((e<<2)+d|0,0,c-e<<2)}return k;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];h=F[e>>2];l=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);i=b;b=b+l|0;b=b+h|0;h=F[e+4>>2];while(1){if(b>>>0>=h>>>0){break b}F[(g<<2)+d>>2]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ma((e<<2)+d|0,0,(c&255)-e<<2)}return k}ma((e<<2)+d|0,0,(c&255)-e<<2);return 1}function rd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{c:{d:{e:{if(F[a+92>>2]==F[a+88>>2]){break e}c=F[a+52>>2];f:{if((c|0)!=F[a+56>>2]){F[c>>2]=b;F[a+52>>2]=c+4;break f}h=F[a+48>>2];g=c-h|0;d=g>>2;f=d+1|0;if(f>>>0>=1073741824){break a}e=g>>>1|0;g=g>>>0>=2147483644?1073741823:f>>>0>>0?e:f;if(g){if(g>>>0>=1073741824){break d}e=ka(g<<2)}else{e=0}f=e+(d<<2)|0;F[f>>2]=b;d=f+4|0;if((c|0)!=(h|0)){while(1){f=f-4|0;c=c-4|0;F[f>>2]=F[c>>2];if((c|0)!=(h|0)){continue}break}}F[a+56>>2]=e+(g<<2);F[a+52>>2]=d;F[a+48>>2]=f;if(!h){break f}ja(h)}F[a+84>>2]=0;c=-1;e=-1;g:{if((b|0)==-1){break g}d=F[a+4>>2];e=b+1|0;e=(e>>>0)%3|0?e:b-2|0;if((e|0)!=-1){c=F[F[d>>2]+(e<<2)>>2]}h:{if((b>>>0)%3|0){l=b-1|0;break h}l=b+2|0;e=-1;if((l|0)==-1){break g}}e=F[F[d>>2]+(l<<2)>>2]}i=e>>>3&536870908;d=F[a+36>>2];h=d+(c>>>3&536870908)|0;g=F[h>>2];f=1<>2]=f|g;f=a+8|0;if((b|0)!=-1){d=b+1|0;d=(d>>>0)%3|0?d:b-2|0}else{d=-1}Ka(f,c,d);d=F[a+36>>2]}f=d+i|0;d=F[f>>2];c=1<>2]=c|d;d=a+8|0;c=-1;i:{if((b|0)==-1){break i}c=b-1|0;if((b>>>0)%3|0){break i}c=b+2|0}Ka(d,e,c)}c=-1;c=(b|0)!=-1?F[F[F[a+4>>2]>>2]+(b<<2)>>2]:c;f=F[a+36>>2]+(c>>>3&536870908)|0;d=F[f>>2];e=1<>2]=d|e;Ka(a+8|0,c,b)}d=F[a+84>>2];if((d|0)>2){break e}while(1){e=L(d,12)+a|0;b=F[e+52>>2];if((b|0)==F[e+48>>2]){d=d+1|0;if((d|0)!=3){continue}break e}b=b-4|0;c=F[b>>2];F[e+52>>2]=b;F[a+84>>2]=d;if((c|0)==-1){break e}f=F[a+24>>2];b=(c>>>0)/3|0;j:{if(F[f+(b>>>3&268435452)>>2]>>>b&1){break j}k:{while(1){k=(c>>>0)/3|0;b=(k>>>3&268435452)+f|0;F[b>>2]=F[b>>2]|1<>2]>>2]+(c<<2)>>2]:d;f=F[a+36>>2]+(d>>>3&536870908)|0;e=F[f>>2];b=1<>2]=b|e;i=F[(F[F[a+16>>2]+96>>2]+L(k,12)|0)+((c>>>0)%3<<2)>>2];l=F[F[a+20>>2]+4>>2];f=F[l+4>>2];t:{if((f|0)!=F[l+8>>2]){F[f>>2]=i;F[l+4>>2]=f+4;break t}j=F[l>>2];h=f-j|0;g=h>>2;e=g+1|0;if(e>>>0>=1073741824){break s}b=h>>>1|0;h=h>>>0>=2147483644?1073741823:b>>>0>e>>>0?b:e;if(h){if(h>>>0>=1073741824){break d}e=ka(h<<2)}else{e=0}b=e+(g<<2)|0;F[b>>2]=i;g=b+4|0;if((f|0)!=(j|0)){while(1){b=b-4|0;f=f-4|0;F[b>>2]=F[f>>2];if((f|0)!=(j|0)){continue}break}}F[l+8>>2]=e+(h<<2);F[l+4>>2]=g;F[l>>2]=b;if(!j){break t}ja(j)}j=F[a+12>>2];f=F[j+4>>2];u:{if((f|0)!=F[j+8>>2]){F[f>>2]=c;F[j+4>>2]=f+4;break u}i=F[j>>2];h=f-i|0;g=h>>2;e=g+1|0;if(e>>>0>=1073741824){break r}b=h>>>1|0;h=h>>>0>=2147483644?1073741823:b>>>0>e>>>0?b:e;if(h){if(h>>>0>=1073741824){break d}e=ka(h<<2)}else{e=0}b=e+(g<<2)|0;F[b>>2]=c;g=b+4|0;if((f|0)!=(i|0)){while(1){b=b-4|0;f=f-4|0;F[b>>2]=F[f>>2];if((f|0)!=(i|0)){continue}break}}F[j+8>>2]=e+(h<<2);F[j+4>>2]=g;F[j>>2]=b;if(!i){break u}ja(i)}b=F[a+12>>2];F[F[b+12>>2]+(d<<2)>>2]=F[b+24>>2];F[b+24>>2]=F[b+24>>2]+1}if((c|0)==-1){break k}g=F[a+4>>2];f=-1;b=c+1|0;b=(b>>>0)%3|0?b:c-2|0;if((b|0)!=-1){f=F[F[g+12>>2]+(b<<2)>>2]}v:{w:{if((L(k,3)|0)!=(c|0)){d=c-1|0;break w}d=c+2|0;c=-1;if((d|0)==-1){break v}}c=F[F[g+12>>2]+(d<<2)>>2]}d=(c|0)==-1;e=(c>>>0)/3|0;if((f|0)!=-1){b=(f>>>0)/3|0;b=F[F[a+24>>2]+(b>>>3&268435452)>>2]&1<>2]+(b>>>3&536870908)>>2]>>>b&1){break x}k=0;b=F[F[g>>2]+(c<<2)>>2];if(!(F[F[a+36>>2]+(b>>>3&536870908)>>2]>>>b&1)){b=F[a+88>>2]+(b<<2)|0;e=F[b>>2];F[b>>2]=e+1;k=(e|0)<=0?2:1}if(F[a+84>>2]>=(k|0)&l){break m}j=L(k,12)+a|0;b=F[j+52>>2];y:{if((b|0)!=F[j+56>>2]){F[b>>2]=c;F[j+52>>2]=b+4;break y}i=F[j+48>>2];h=b-i|0;d=h>>2;g=d+1|0;if(g>>>0>=1073741824){break c}e=h>>>1|0;g=h>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break d}e=ka(g<<2)}else{e=0}d=e+(d<<2)|0;F[d>>2]=c;c=d+4|0;if((b|0)!=(i|0)){while(1){d=d-4|0;b=b-4|0;F[d>>2]=F[b>>2];if((b|0)!=(i|0)){continue}break}}F[j+48>>2]=d;F[j+52>>2]=c;F[j+56>>2]=e+(g<<2);if(!i){break y}ja(i)}if(F[a+84>>2]<=(k|0)){break x}F[a+84>>2]=k}if(l){break k}c=-1;if((f|0)==-1){break n}}c=F[F[F[a+4>>2]>>2]+(f<<2)>>2]}b=0;if(!(F[F[a+36>>2]+(c>>>3&536870908)>>2]>>>c&1)){b=F[a+88>>2]+(c<<2)|0;c=F[b>>2];F[b>>2]=c+1;b=(c|0)<=0?2:1}if(F[a+84>>2]<(b|0)){break l}c=f}f=F[a+24>>2];continue}break}k=L(b,12)+a|0;c=F[k+52>>2];z:{if((c|0)!=F[k+56>>2]){F[c>>2]=f;F[k+52>>2]=c+4;break z}i=F[k+48>>2];h=c-i|0;d=h>>2;g=d+1|0;if(g>>>0>=1073741824){break b}e=h>>>1|0;g=h>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break d}e=ka(g<<2)}else{e=0}d=e+(d<<2)|0;F[d>>2]=f;f=d+4|0;if((c|0)!=(i|0)){while(1){d=d-4|0;c=c-4|0;F[d>>2]=F[c>>2];if((c|0)!=(i|0)){continue}break}}F[k+48>>2]=d;F[k+52>>2]=f;F[k+56>>2]=e+(g<<2);if(!i){break z}ja(i)}d=F[a+84>>2];if((d|0)<=(b|0)){break j}F[a+84>>2]=b;d=b;break j}d=F[a+84>>2]}if((d|0)<3){continue}break}}return 1}oa();v()}na();v()}na();v()}na();v()}function Mc(a){var b=0,c=0,d=0,e=0,f=0,g=0;e=Z-16|0;Z=e;F[e+12>>2]=a;a:{if(a>>>0<=211){d=F[Lc(10352,10544,e+12|0)>>2];break a}if(a>>>0>=4294967292){V();v()}f=(a>>>0)/210|0;d=L(f,210);F[e+8>>2]=a-d;g=Lc(10544,10736,e+8|0)-10544>>2;while(1){d=F[(g<<2)+10544>>2]+d|0;a=5;while(1){b:{if((a|0)==47){a=211;while(1){b=(d>>>0)/(a>>>0)|0;if(b>>>0>>0){break a}if((L(a,b)|0)==(d|0)){break b}b=a+10|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+12|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+16|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+18|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+22|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+28|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+30|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+36|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+40|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+42|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+46|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+52|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+58|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+60|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+66|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+70|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+72|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+78|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+82|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+88|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+96|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+100|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+102|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+106|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+108|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+112|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+120|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+126|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+130|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+136|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+138|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+142|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+148|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+150|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+156|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+162|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+166|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+168|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+172|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+178|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+180|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+186|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+190|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+192|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+196|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+198|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}if((L(b,c)|0)==(d|0)){break b}b=a+208|0;c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}a=a+210|0;if((L(b,c)|0)!=(d|0)){continue}break}break b}b=F[(a<<2)+10352>>2];c=(d>>>0)/(b>>>0)|0;if(b>>>0>c>>>0){break a}a=a+1|0;if((L(b,c)|0)!=(d|0)){continue}}break}d=g+1|0;a=(d|0)==48;g=a?0:d;f=a+f|0;d=L(f,210);continue}}Z=e+16|0;return d}function lb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=M(0),k=0,l=0;a:{if(!d){break a}b:{c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(D[b|0]);J[(h<<2)+d>>2]=i?M(j/M(127)):j;b=b+1|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 1:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(G[b|0]);J[(h<<2)+d>>2]=i?M(j/M(255)):j;b=b+1|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 2:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(E[b>>1]);J[(h<<2)+d>>2]=i?M(j/M(32767)):j;b=b+2|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 3:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(H[b>>1]);J[(h<<2)+d>>2]=i?M(j/M(65535)):j;b=b+2|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 4:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(F[b>>2]);J[(h<<2)+d>>2]=i?M(j*M(4.656612873077393e-10)):j;b=b+4|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 5:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(I[b>>2]);J[(h<<2)+d>>2]=i?M(j*M(2.3283064365386963e-10)):j;b=b+4|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 6:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(+I[b>>2]+ +F[b+4>>2]*4294967296);J[(h<<2)+d>>2]=i?M(j*M(10842021724855044e-35)):j;b=b+8|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 7:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];i=G[a+32|0];while(1){if(b>>>0>=g>>>0){break a}j=M(+I[b>>2]+ +I[b+4>>2]*4294967296);J[(h<<2)+d>>2]=i?M(j*M(5.421010862427522e-20)):j;b=b+8|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 8:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}J[(h<<2)+d>>2]=J[b>>2];b=b+4|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 9:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}J[(h<<2)+d>>2]=K[b>>3];b=b+8|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0;break b;case 10:break c;default:break a}}e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[a>>2];g=F[e>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);k=b;b=b+i|0;b=b+g|0;g=F[e+4>>2];while(1){if(b>>>0>=g>>>0){break a}J[(h<<2)+d>>2]=G[b|0]?M(1):M(0);b=b+1|0;h=h+1|0;e=G[a+24|0];if(h>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}l=1;if(e>>>0>=f>>>0){break a}d=(e<<2)+d|0;a=(c&255)-e|0}ma(d,0,a<<2)}return l}function Cb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=M(0),m=M(0);a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}D[d+g|0]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){return 0}e=D[b|0];if((e|0)<0){break b}D[d+g|0]=e;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>1];if((e+128&65535)>>>0>255){break b}D[d+g|0]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>1];if(e>>>0>127){break b}D[d+g|0]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=F[b>>2];if(e+128>>>0>255){break b}D[d+g|0]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=F[b>>2];if(e>>>0>127){break b}D[d+g|0]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}i=F[b+4>>2];e=F[b>>2];h=e+128|0;i=h>>>0<128?i+1|0:i;if(!i&h>>>0>255|i){break b}D[d+g|0]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}i=F[b+4>>2];e=F[b>>2];if(!i&e>>>0>127|i){break b}D[d+g|0]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:e=G[a+24|0];c=c&255;d:{if(c>>>0>e>>>0?e:c){e=F[F[a>>2]>>2];f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+f|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break d}l=J[b>>2];if(l>=M(127)|lM(1)){break d}j=R(+l*127+.5);if(!(N(j)<2147483648)){break f}h=~~j;break e}if(!(m>>0<(c>>>0>e>>>0?e:c)>>>0){continue}break}}k=1;if(c>>>0<=e>>>0){break d}ma(d+e|0,0,c-e|0)}return k;case 9:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}j=K[b>>3];if(j>=127|j<-128|(N(j)==Infinity|j!=j)){break b}e=d+g|0;if(G[a+32|0]){if(j<0|j>1){break b}j=R(j*127+.5)}g:{if(N(j)<2147483648){h=~~j;break g}h=-2147483648}D[e|0]=h;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}D[d+g|0]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ma(d+e|0,0,(c&255)-e|0)}return k}ma(d+e|0,0,(c&255)-e|0);return 1}function Bb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=M(0);a:{b:{if(!d){break b}c:{switch(F[a+28>>2]-1|0){case 0:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){return 0}e=D[b|0];if((e|0)<0){break b}D[d+g|0]=e;b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 1:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}D[d+g|0]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 2:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>1];if(e>>>0>255){break b}D[d+g|0]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 3:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=H[b>>1];if(e>>>0>255){break b}D[d+g|0]=e;b=b+2|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 4:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=F[b>>2];if(e>>>0>255){break b}D[d+g|0]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 5:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}e=F[b>>2];if(e>>>0>255){break b}D[d+g|0]=e;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 6:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}i=F[b+4>>2];e=F[b>>2];if(!i&e>>>0>255|i){break b}D[d+g|0]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 7:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}i=F[b+4>>2];e=F[b>>2];if(!i&e>>>0>255|i){break b}D[d+g|0]=e;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 8:e=G[a+24|0];c=c&255;d:{if(c>>>0>e>>>0?e:c){e=F[F[a>>2]>>2];f=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+f|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break d}l=J[b>>2];if(l>=M(255)|lM(1)){break d}j=R(+l*255+.5);if(!(j<4294967296&j>=0)){break f}h=~~j>>>0;break e}if(!(l=M(0))){break f}h=~~l>>>0;break e}h=0}D[e|0]=h;b=b+4|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(c>>>0>e>>>0?e:c)>>>0){continue}break}}k=1;if(c>>>0<=e>>>0){break d}ma(d+e|0,0,c-e|0)}return k;case 9:e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}j=K[b>>3];if(j>=255|j<0|(N(j)==Infinity|j!=j)){break b}e=d+g|0;if(G[a+32|0]){if(j>1){break b}j=R(j*255+.5)}g:{if(j<4294967296&j>=0){h=~~j>>>0;break g}h=0}D[e|0]=h;b=b+8|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}break a;case 10:break c;default:break b}}e=G[a+24|0];f=c&255;if(e>>>0>>0?e:f){e=F[F[a>>2]>>2];i=F[a+48>>2];b=ki(F[a+40>>2],F[a+44>>2],b,0);h=b;b=b+i|0;b=b+e|0;while(1){if(I[F[a>>2]+4>>2]<=b>>>0){break b}D[d+g|0]=G[b|0];b=b+1|0;g=g+1|0;e=G[a+24|0];if(g>>>0<(e>>>0>>0?e:f)>>>0){continue}break}}k=1;if(e>>>0>=f>>>0){break b}ma(d+e|0,0,(c&255)-e|0)}return k}ma(d+e|0,0,(c&255)-e|0);return 1}function jc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;e=Z-48|0;Z=e;f=H[5053]|H[5054]<<16;d=H[5051]|H[5052]<<16;E[e+38>>1]=d;E[e+40>>1]=d>>>16;E[e+42>>1]=f;E[e+44>>1]=f>>>16;d=F[2525];F[e+32>>2]=F[2524];F[e+36>>2]=d;d=F[2523];F[e+24>>2]=F[2522];F[e+28>>2]=d;d=F[2521];F[e+16>>2]=F[2520];F[e+20>>2]=d;g=F[b+8>>2];i=F[b+12>>2];h=F[b+20>>2];d=F[b+16>>2];f=d+5|0;h=f>>>0<5?h+1|0:h;a:{b:{if(g>>>0>>0&(h|0)>=(i|0)|(h|0)>(i|0)){d=ya(e+16|0);if(d>>>0>=2147483632){break a}c:{d:{if(d>>>0>=11){b=(d|15)+1|0;c=ka(b);F[e+8>>2]=b|-2147483648;F[e>>2]=c;F[e+4>>2]=d;b=c+d|0;break d}D[e+11|0]=d;b=d+e|0;c=e;if(!d){break c}}la(c,e+16|0,d)}D[b|0]=0;F[a>>2]=-2;b=a+4|0;if(D[e+11|0]>=0){a=F[e+4>>2];F[b>>2]=F[e>>2];F[b+4>>2]=a;F[b+8>>2]=F[e+8>>2];break b}ra(b,F[e>>2],F[e+4>>2]);if(D[e+11|0]>=0){break b}ja(F[e>>2]);break b}f=d+F[b>>2]|0;d=G[f|0]|G[f+1|0]<<8|(G[f+2|0]<<16|G[f+3|0]<<24);D[c|0]=d;D[c+1|0]=d>>>8;D[c+2|0]=d>>>16;D[c+3|0]=d>>>24;D[c+4|0]=G[f+4|0];d=F[b+20>>2];f=F[b+16>>2]+5|0;d=f>>>0<5?d+1|0:d;F[b+16>>2]=f;F[b+20>>2]=d;if(sa(c,1250,5)){d=ka(32);D[d+17|0]=0;D[d+16|0]=G[1494];c=G[1490]|G[1491]<<8|(G[1492]<<16|G[1493]<<24);b=G[1486]|G[1487]<<8|(G[1488]<<16|G[1489]<<24);D[d+8|0]=b;D[d+9|0]=b>>>8;D[d+10|0]=b>>>16;D[d+11|0]=b>>>24;D[d+12|0]=c;D[d+13|0]=c>>>8;D[d+14|0]=c>>>16;D[d+15|0]=c>>>24;c=G[1482]|G[1483]<<8|(G[1484]<<16|G[1485]<<24);b=G[1478]|G[1479]<<8|(G[1480]<<16|G[1481]<<24);D[d|0]=b;D[d+1|0]=b>>>8;D[d+2|0]=b>>>16;D[d+3|0]=b>>>24;D[d+4|0]=c;D[d+5|0]=c>>>8;D[d+6|0]=c>>>16;D[d+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,d,17);ja(d);break b}g=F[b+12>>2];if((g|0)<=(d|0)&I[b+8>>2]<=f>>>0|(d|0)>(g|0)){d=ya(e+16|0);if(d>>>0>=2147483632){break a}e:{f:{if(d>>>0>=11){b=(d|15)+1|0;c=ka(b);F[e+8>>2]=b|-2147483648;F[e>>2]=c;F[e+4>>2]=d;b=c+d|0;break f}D[e+11|0]=d;b=d+e|0;c=e;if(!d){break e}}la(c,e+16|0,d)}D[b|0]=0;F[a>>2]=-2;b=a+4|0;if(D[e+11|0]>=0){a=F[e+4>>2];F[b>>2]=F[e>>2];F[b+4>>2]=a;F[b+8>>2]=F[e+8>>2];break b}ra(b,F[e>>2],F[e+4>>2]);if(D[e+11|0]>=0){break b}ja(F[e>>2]);break b}D[c+5|0]=G[f+F[b>>2]|0];g=F[b+20>>2];d=F[b+16>>2]+1|0;g=d?g:g+1|0;F[b+16>>2]=d;F[b+20>>2]=g;f=F[b+12>>2];if((f|0)<=(g|0)&I[b+8>>2]<=d>>>0|(g|0)>(f|0)){d=ya(e+16|0);if(d>>>0>=2147483632){break a}g:{h:{if(d>>>0>=11){b=(d|15)+1|0;c=ka(b);F[e+8>>2]=b|-2147483648;F[e>>2]=c;F[e+4>>2]=d;b=c+d|0;break h}D[e+11|0]=d;b=d+e|0;c=e;if(!d){break g}}la(c,e+16|0,d)}D[b|0]=0;F[a>>2]=-2;b=a+4|0;if(D[e+11|0]>=0){a=F[e+4>>2];F[b>>2]=F[e>>2];F[b+4>>2]=a;F[b+8>>2]=F[e+8>>2];break b}ra(b,F[e>>2],F[e+4>>2]);if(D[e+11|0]>=0){break b}ja(F[e>>2]);break b}D[c+6|0]=G[d+F[b>>2]|0];h=F[b+20>>2];d=F[b+16>>2]+1|0;h=d?h:h+1|0;F[b+16>>2]=d;F[b+20>>2]=h;f=F[b+12>>2];if((f|0)<=(h|0)&I[b+8>>2]<=d>>>0|(f|0)<(h|0)){d=ya(e+16|0);if(d>>>0>=2147483632){break a}i:{j:{if(d>>>0>=11){b=(d|15)+1|0;c=ka(b);F[e+8>>2]=b|-2147483648;F[e>>2]=c;F[e+4>>2]=d;b=c+d|0;break j}D[e+11|0]=d;b=d+e|0;c=e;if(!d){break i}}la(c,e+16|0,d)}D[b|0]=0;F[a>>2]=-2;b=a+4|0;if(D[e+11|0]>=0){a=F[e+4>>2];F[b>>2]=F[e>>2];F[b+4>>2]=a;F[b+8>>2]=F[e+8>>2];break b}ra(b,F[e>>2],F[e+4>>2]);if(D[e+11|0]>=0){break b}ja(F[e>>2]);break b}D[c+7|0]=G[d+F[b>>2]|0];g=F[b+20>>2];d=F[b+16>>2]+1|0;g=d?g:g+1|0;F[b+16>>2]=d;F[b+20>>2]=g;f=F[b+12>>2];if((f|0)<=(g|0)&I[b+8>>2]<=d>>>0|(g|0)>(f|0)){c=Eb(e,e+16|0);F[a>>2]=-2;b=a+4|0;if(D[c+11|0]>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break b}ra(b,F[c>>2],F[c+4>>2]);if(D[c+11|0]>=0){break b}ja(F[c>>2]);break b}D[c+8|0]=G[d+F[b>>2]|0];d=F[b+20>>2];g=F[b+16>>2];f=g+1|0;i=f?d:d+1|0;F[b+16>>2]=f;F[b+20>>2]=i;i=F[b+8>>2];h=F[b+12>>2];g=g+3|0;d=g>>>0<3?d+1|0:d;if(g>>>0>i>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){c=Eb(e,e+16|0);F[a>>2]=-2;b=a+4|0;if(D[c+11|0]>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break b}ra(b,F[c>>2],F[c+4>>2]);if(D[c+11|0]>=0){break b}ja(F[c>>2]);break b}d=c;c=F[b>>2]+f|0;E[d+10>>1]=G[c|0]|G[c+1|0]<<8;g=F[b+20>>2];c=F[b+16>>2]+2|0;g=c>>>0<2?g+1|0:g;F[b+16>>2]=c;F[b+20>>2]=g;F[a+8>>2]=0;F[a+12>>2]=0;F[a>>2]=0;F[a+4>>2]=0}Z=e+48|0;return}za();v()}function Mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;e=Z-96|0;Z=e;f=F[a+16>>2];D[e+92|0]=1;F[e+88>>2]=b;F[e+84>>2]=b;F[e+80>>2]=f;j=F[a+20>>2];d=F[j>>2];a:{b:{f=F[F[f+28>>2]+(b<<2)>>2];if(f>>>0>2]-d>>2>>>0){d=F[F[a+8>>2]+(F[d+(f<<2)>>2]<<2)>>2];f=F[a+4>>2];if(!G[f+84|0]){d=F[F[f+68>>2]+(d<<2)>>2]}F[e+72>>2]=0;F[e+76>>2]=0;j=e- -64|0;F[j>>2]=0;F[j+4>>2]=0;F[e+56>>2]=0;F[e+60>>2]=0;Ga(f,d,D[f+24|0],e+56|0);if((b|0)!=-1){f=b+1|0;j=(f>>>0)%3|0?f:b-2|0;m=((b>>>0)%3|0?-1:2)+b|0;while(1){d=j;f=m;c:{if(!F[a+28>>2]){break c}f=b+1|0;d=(f>>>0)%3|0?f:b-2|0;f=b-1|0;if((b>>>0)%3|0){break c}f=b+2|0}n=F[a+20>>2];b=F[n>>2];d=F[F[F[a+16>>2]+28>>2]+(d<<2)>>2];if(d>>>0>=F[n+4>>2]-b>>2>>>0){break b}d=F[F[a+8>>2]+(F[b+(d<<2)>>2]<<2)>>2];b=F[a+4>>2];if(!G[b+84|0]){d=F[F[b+68>>2]+(d<<2)>>2]}F[e+48>>2]=0;F[e+52>>2]=0;F[e+40>>2]=0;F[e+44>>2]=0;F[e+32>>2]=0;F[e+36>>2]=0;Ga(b,d,D[b+24|0],e+32|0);d=F[a+20>>2];b=F[d>>2];f=F[F[F[a+16>>2]+28>>2]+(f<<2)>>2];if(f>>>0>=F[d+4>>2]-b>>2>>>0){break a}d=F[F[a+8>>2]+(F[b+(f<<2)>>2]<<2)>>2];b=F[a+4>>2];if(!G[b+84|0]){d=F[F[b+68>>2]+(d<<2)>>2]}F[e+24>>2]=0;F[e+28>>2]=0;F[e+16>>2]=0;F[e+20>>2]=0;F[e+8>>2]=0;F[e+12>>2]=0;Ga(b,d,D[b+24|0],e+8|0);g=F[e+8>>2];b=F[e+56>>2];d=g-b|0;p=F[e+60>>2];t=F[e+12>>2]-(p+(b>>>0>g>>>0)|0)|0;h=F[e+40>>2];f=F[e+64>>2];n=h-f|0;u=F[e+68>>2];y=F[e+44>>2]-(u+(f>>>0>h>>>0)|0)|0;g=ki(d,t,n,y);w=o-g|0;x=i-(_+(g>>>0>o>>>0)|0)|0;i=w;h=F[e+16>>2];g=h-f|0;u=F[e+20>>2]-((f>>>0>h>>>0)+u|0)|0;k=F[e+32>>2];h=k-b|0;w=F[e+36>>2]-((b>>>0>k>>>0)+p|0)|0;b=ki(g,u,h,w);o=i+b|0;i=_+x|0;i=b>>>0>o>>>0?i+1|0:i;b=l;l=d;p=t;k=F[e+48>>2];f=F[e+72>>2];d=k-f|0;t=F[e+76>>2];x=F[e+52>>2]-(t+(f>>>0>k>>>0)|0)|0;l=ki(l,p,d,x);k=b+l|0;b=_+q|0;b=k>>>0>>0?b+1|0:b;l=F[e+24>>2];p=l-f|0;f=F[e+28>>2]-((f>>>0>l>>>0)+t|0)|0;q=ki(p,f,h,w);l=k-q|0;q=b-(_+(k>>>0>>0)|0)|0;b=ki(g,u,d,x);d=r-b|0;b=s-(_+(b>>>0>r>>>0)|0)|0;s=ki(p,f,n,y);r=s+d|0;b=_+b|0;s=r>>>0>>0?b+1|0:b;b=F[e+88>>2];f=F[e+80>>2];d:{if(G[e+92|0]){e:{f:{g:{h:{if((b|0)==-1){break h}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;if((b|0)==-1|F[F[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break h}b=F[F[F[f+64>>2]+12>>2]+(b<<2)>>2];if((b|0)!=-1){break g}}F[e+88>>2]=-1;break f}d=b+1|0;b=(d>>>0)%3|0?d:b-2|0;F[e+88>>2]=b;if((b|0)!=-1){break e}}b=F[e+84>>2];d=-1;i:{if((b|0)==-1){break i}j:{if((b>>>0)%3|0){b=b-1|0;break j}b=b+2|0;d=-1;if((b|0)==-1){break i}}d=-1;if(F[F[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break i}b=F[F[F[f+64>>2]+12>>2]+(b<<2)>>2];d=-1;if((b|0)==-1){break i}d=b-1|0;if((b>>>0)%3|0){break i}d=b+2|0}D[e+92|0]=0;F[e+88>>2]=d;break d}if((b|0)!=F[e+84>>2]){break d}F[e+88>>2]=-1;break d}d=-1;k:{if((b|0)==-1){break k}l:{if((b>>>0)%3|0){b=b-1|0;break l}b=b+2|0;d=-1;if((b|0)==-1){break k}}d=-1;if(F[F[f>>2]+(b>>>3&536870908)>>2]>>>b&1){break k}b=F[F[F[f+64>>2]+12>>2]+(b<<2)>>2];d=-1;if((b|0)==-1){break k}d=b-1|0;if((b>>>0)%3|0){break k}d=b+2|0}F[e+88>>2]=d}b=F[e+88>>2];if((b|0)!=-1){continue}break}}b=s>>31;f=b^r;d=f-b|0;b=(b^s)-((b>>>0>f>>>0)+b|0)|0;m=-1;f=2147483647;g=q>>31;h=g^l;j=h-g|0;n=(g^q)-((h>>>0>>0)+g|0)|0;h=n;k=j^-1;g=h^2147483647;n=i;m:{n:{if(!F[a+28>>2]){if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break m}b=b+h|0;a=d+j|0;b=a>>>0>>0?b+1|0:b;f=a;g=i;a=g>>31;d=a;m=d^o;a=m-d|0;i=a;d=(d^g)-((d>>>0>m>>>0)+d|0)|0;a=a+f|0;d=d^2147483647;i=(d|0)==(b|0)&(i^-1)>>>0>>0|b>>>0>d>>>0;a=i?-1:a;if(!(i&0)&(a|0)<=536870912|(a|0)<536870912){break m}b=0;a=a>>>29|0;break n}o:{if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break o}b=b+h|0;a=d+j|0;b=a>>>0>>0?b+1|0:b;k=i;d=i>>31;h=d^o;i=h-d|0;j=(d^k)-((d>>>0>h>>>0)+d|0)|0;g=j^2147483647;d=a;a=i;if((g|0)==(b|0)&d>>>0>(a^-1)>>>0|b>>>0>g>>>0){break o}b=b+j|0;m=a+d|0;b=m>>>0>>0?b+1|0:b;f=b;if(!b&m>>>0<536870913){break m}}b=f>>>29|0;a=(f&536870911)<<3|m>>>29}o=li(o,n,a,b);l=li(l,q,a,b);r=li(r,s,a,b)}F[c+8>>2]=o;F[c+4>>2]=l;F[c>>2]=r;Z=e+96|0;return}ta();v()}ta();v()}ta();v()}function te(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=Z-16|0;Z=g;f=1;m=$[F[F[a>>2]+24>>2]](a)|0;a:{if((m|0)<=0){break a}r=a+48|0;f=0;while(1){b:{c:{if(!F[($[F[F[a>>2]+28>>2]](a)|0)+40>>2]){break c}o=l<<2;d=F[o+F[a+36>>2]>>2];c=F[d+8>>2];e=bb(d);if(!e){break c}h=F[($[F[F[a>>2]+28>>2]](a)|0)+40>>2];F[g+12>>2]=F[c+56>>2];d=ka(32);F[g>>2]=d;F[g+4>>2]=24;F[g+8>>2]=-2147483616;c=G[1196]|G[1197]<<8|(G[1198]<<16|G[1199]<<24);b=G[1192]|G[1193]<<8|(G[1194]<<16|G[1195]<<24);D[d+16|0]=b;D[d+17|0]=b>>>8;D[d+18|0]=b>>>16;D[d+19|0]=b>>>24;D[d+20|0]=c;D[d+21|0]=c>>>8;D[d+22|0]=c>>>16;D[d+23|0]=c>>>24;c=G[1188]|G[1189]<<8|(G[1190]<<16|G[1191]<<24);b=G[1184]|G[1185]<<8|(G[1186]<<16|G[1187]<<24);D[d+8|0]=b;D[d+9|0]=b>>>8;D[d+10|0]=b>>>16;D[d+11|0]=b>>>24;D[d+12|0]=c;D[d+13|0]=c>>>8;D[d+14|0]=c>>>16;D[d+15|0]=c>>>24;c=G[1180]|G[1181]<<8|(G[1182]<<16|G[1183]<<24);b=G[1176]|G[1177]<<8|(G[1178]<<16|G[1179]<<24);D[d|0]=b;D[d+1|0]=b>>>8;D[d+2|0]=b>>>16;D[d+3|0]=b>>>24;D[d+4|0]=c;D[d+5|0]=c>>>8;D[d+6|0]=c>>>16;D[d+7|0]=c>>>24;D[d+24|0]=0;c=h+16|0;b=F[c>>2];d:{e:{if(!b){break e}i=F[g+12>>2];d=c;while(1){k=(i|0)>F[b+16>>2];d=k?d:b;b=F[(k?b+4|0:b)>>2];if(b){continue}break}if((c|0)==(d|0)|(i|0)>2]){break e}b=F[d+24>>2];if(!b){break e}i=d+20|0;d=G[g+11|0];c=d<<24>>24<0;k=c?F[g>>2]:g;d=c?F[g+4>>2]:d;while(1){c=G[b+27|0];j=c<<24>>24<0;c=j?F[b+20>>2]:c;p=c>>>0>>0;f:{g:{h:{i:{j:{k:{n=p?c:d;if(n){j=j?F[b+16>>2]:b+16|0;q=sa(k,j,n);if(q){break k}if(c>>>0<=d>>>0){break j}break f}if(c>>>0<=d>>>0){break i}break f}if((q|0)<0){break f}}c=sa(j,k,n);if(c){break h}}if(p){break g}d=gc(i,g);break d}if((c|0)<0){break g}d=gc(i,g);break d}b=b+4|0}b=F[b>>2];if(b){continue}break}}d=gc(h,g)}if(D[g+11|0]<0){ja(F[g>>2])}if(!d){break c}d=0;c=F[F[o+F[a+36>>2]>>2]+8>>2];if(!F[c+64>>2]){b=ka(32);F[b+16>>2]=0;F[b+20>>2]=0;F[b+8>>2]=0;F[b>>2]=0;F[b+4>>2]=0;F[b+24>>2]=0;F[b+28>>2]=0;f=F[c+64>>2];F[c+64>>2]=b;if(f){b=F[f>>2];if(b){F[f+4>>2]=b;ja(b)}ja(f);b=F[c+64>>2]}F[c>>2]=b;f=F[b+20>>2];F[c+8>>2]=F[b+16>>2];F[c+12>>2]=f;f=F[b+24>>2];b=F[b+28>>2];F[c+48>>2]=0;F[c+52>>2]=0;F[c+40>>2]=0;F[c+44>>2]=0;F[c+16>>2]=f;F[c+20>>2]=b}l:{D[c+24|0]=G[e+24|0];F[c+28>>2]=F[e+28>>2];D[c+32|0]=G[e+32|0];b=F[e+44>>2];F[c+40>>2]=F[e+40>>2];F[c+44>>2]=b;b=F[e+52>>2];F[c+48>>2]=F[e+48>>2];F[c+52>>2]=b;F[c+56>>2]=F[e+56>>2];b=F[e+12>>2];F[c+8>>2]=F[e+8>>2];F[c+12>>2]=b;b=F[e+20>>2];F[c+16>>2]=F[e+16>>2];F[c+20>>2]=b;F[c+60>>2]=F[e+60>>2];f=F[e>>2];m:{if(!f){F[c>>2]=0;b=1;break m}h=F[c>>2];b=0;if(!h){break m}b=F[f>>2];f=F[f+4>>2]-b|0;md(h,b,f,0);b=1}if(!b){break l}D[c+84|0]=G[e+84|0];F[c+80>>2]=F[e+80>>2];if((c|0)!=(e|0)){gb(c+68|0,F[e+68>>2],F[e+72>>2])}n:{h=F[e+88>>2];o:{if(h){f=ka(40);e=F[h>>2];F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;F[f>>2]=e;e=F[h+12>>2];b=F[h+8>>2];if((e|0)!=(b|0)){b=e-b|0;if((b|0)<0){break n}e=ka(b);F[f+12>>2]=e;F[f+8>>2]=e;F[f+16>>2]=b+e;b=F[h+8>>2];i=F[h+12>>2];p:{if((b|0)==(i|0)){break p}k=i+(b^-1)|0;j=i-b&7;if(j){while(1){D[e|0]=G[b|0];e=e+1|0;b=b+1|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}if(k>>>0<7){break p}while(1){D[e|0]=G[b|0];D[e+1|0]=G[b+1|0];D[e+2|0]=G[b+2|0];D[e+3|0]=G[b+3|0];D[e+4|0]=G[b+4|0];D[e+5|0]=G[b+5|0];D[e+6|0]=G[b+6|0];D[e+7|0]=G[b+7|0];e=e+8|0;b=b+8|0;if((i|0)!=(b|0)){continue}break}}F[f+12>>2]=e}d=F[h+36>>2];F[f+32>>2]=F[h+32>>2];F[f+36>>2]=d;d=F[h+28>>2];F[f+24>>2]=F[h+24>>2];F[f+28>>2]=d;e=F[c+88>>2];F[c+88>>2]=f;if(e){break o}break l}e=F[c+88>>2];F[c+88>>2]=0;if(!e){break l}}d=F[e+8>>2];if(d){F[e+12>>2]=d;ja(d)}ja(e);break l}na();v()}break b}d=F[F[a+36>>2]+(l<<2)>>2];if(!($[F[F[d>>2]+24>>2]](d,r)|0)){break a}}l=l+1|0;f=(m|0)<=(l|0);if((l|0)!=(m|0)){continue}break}}Z=g+16|0;return f|0}function Jg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=Z-32|0;Z=f;a:{if(!hb(1,f+28|0,F[a+32>>2])){break a}if(!hb(1,f+24|0,F[a+32>>2])){break a}l=F[f+28>>2];if(l>>>0>1431655765){break a}d=F[a+32>>2];c=d;i=F[c+8>>2];b=F[c+16>>2];h=F[c+12>>2];c=F[c+20>>2];g=li(i-b|0,h-(c+(b>>>0>i>>>0)|0)|0,3,0);if(!_&g>>>0>>0){break a}n=F[f+24>>2];g=ki(l,0,3,0);if(!_&g>>>0>>0|((c|0)>=(h|0)&b>>>0>=i>>>0|(c|0)>(h|0))){break a}i=G[b+F[d>>2]|0];b=b+1|0;c=b?c:c+1|0;F[d+16>>2]=b;F[d+20>>2]=c;b:{c:{if(!i){d=0;c=Z-32|0;Z=c;F[c+24>>2]=0;F[c+16>>2]=0;F[c+20>>2]=0;d:{e:{b=L(l,3);if(b){if(b>>>0>=1073741824){break e}i=L(l,12);d=ka(i);ma(d,0,i)}b=mc(b,1,F[a+32>>2],d);f:{g:{if(!(!l|!b)){i=0;while(1){h:{g=e;b=(i<<2)+d|0;h=F[b>>2];e=h>>>1|0;h=g+(h&1?0-e|0:e)|0;if((h|0)<0){break h}F[c>>2]=h;e=F[b+4>>2];g=e>>>1|0;h=h+(e&1?0-g|0:g)|0;if((h|0)<0){break h}F[c+4>>2]=h;b=F[b+8>>2];e=b>>>1|0;e=h+(b&1?0-e|0:e)|0;if((e|0)<0){break h}F[c+8>>2]=e;mb(F[a+44>>2]+96|0,c);i=i+3|0;b=1;j=j+1|0;if((j|0)!=(l|0)){continue}break g}break}b=0;break g}if(!d){break f}}ja(d)}Z=c+32|0;break d}na();v()}if(b){break c}break a}if(n>>>0<=255){if(!l){break c}while(1){i:{F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;d=F[a+32>>2];b=d;i=F[b+16>>2];e=F[b+8>>2];c=F[b+20>>2];g=F[b+12>>2];b=g;if(e>>>0<=i>>>0&(c|0)>=(b|0)|(b|0)<(c|0)){break i}j=F[d>>2];m=G[j+i|0];b=c;h=i+1|0;b=h?b:b+1|0;F[d+16>>2]=h;F[d+20>>2]=b;F[f+8>>2]=m;m=e>>>0>>0&(c|0)>=(g|0)|(c|0)>(g|0);e=m?i:e;g=m?c:g;if((e|0)==(h|0)&(g|0)==(b|0)){break i}m=G[h+j|0];b=c;h=i+2|0;b=h>>>0<2?b+1|0:b;F[d+16>>2]=h;F[d+20>>2]=b;F[f+12>>2]=m;if((e|0)==(h|0)&(b|0)==(g|0)){break i}h=G[h+j|0];b=c;c=i+3|0;b=c>>>0<3?b+1|0:b;F[d+16>>2]=c;F[d+20>>2]=b;F[f+16>>2]=h;mb(F[a+44>>2]+96|0,f+8|0);k=k+1|0;if((l|0)!=(k|0)){continue}break c}break}k=0;break a}if(n>>>0<=65535){if(!l){break c}while(1){j:{F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;j=F[a+32>>2];b=j;c=F[b+8>>2];d=F[b+12>>2];h=F[b+16>>2];b=F[b+20>>2];i=b;e=h+2|0;b=e>>>0<2?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break j}m=F[j>>2];g=m+h|0;g=G[g|0]|G[g+1|0]<<8;F[j+16>>2]=e;F[j+20>>2]=b;F[f+8>>2]=g;b=i;g=h+4|0;b=g>>>0<4?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break j}e=e+m|0;e=G[e|0]|G[e+1|0]<<8;F[j+16>>2]=g;F[j+20>>2]=b;F[f+12>>2]=e;e=c;b=i;c=h+6|0;b=c>>>0<6?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break j}d=g+m|0;d=G[d|0]|G[d+1|0]<<8;F[j+16>>2]=c;F[j+20>>2]=b;F[f+16>>2]=d;mb(F[a+44>>2]+96|0,f+8|0);k=k+1|0;if((l|0)!=(k|0)){continue}break c}break}k=0;break a}k:{if(n>>>0>2097151){break k}b=H[a+36>>1];if(((b<<8|b>>>8)&65535)>>>0<514){break k}if(!l){break c}while(1){l:{F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;if(!hb(1,f+4|0,F[a+32>>2])){break l}F[f+8>>2]=F[f+4>>2];if(!hb(1,f+4|0,F[a+32>>2])){break l}F[f+12>>2]=F[f+4>>2];if(!hb(1,f+4|0,F[a+32>>2])){break l}F[f+16>>2]=F[f+4>>2];mb(F[a+44>>2]+96|0,f+8|0);k=k+1|0;if((l|0)!=(k|0)){continue}break c}break}k=0;break a}if(!l){break c}while(1){F[f+16>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;j=F[a+32>>2];b=j;c=F[b+8>>2];d=F[b+12>>2];h=F[b+16>>2];b=F[b+20>>2];i=b;e=h+4|0;b=e>>>0<4?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break b}m=F[j>>2];g=m+h|0;g=G[g|0]|G[g+1|0]<<8|(G[g+2|0]<<16|G[g+3|0]<<24);F[j+16>>2]=e;F[j+20>>2]=b;F[f+8>>2]=g;b=i;g=h+8|0;b=g>>>0<8?b+1|0:b;if(c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break b}e=e+m|0;e=G[e|0]|G[e+1|0]<<8|(G[e+2|0]<<16|G[e+3|0]<<24);F[j+16>>2]=g;F[j+20>>2]=b;F[f+12>>2]=e;e=c;b=i;c=h+12|0;b=c>>>0<12?b+1|0:b;if(c>>>0>e>>>0&(b|0)>=(d|0)|(b|0)>(d|0)){break b}d=g+m|0;d=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[j+16>>2]=c;F[j+20>>2]=b;F[f+16>>2]=d;mb(F[a+44>>2]+96|0,f+8|0);k=k+1|0;if((l|0)!=(k|0)){continue}break}}F[F[a+4>>2]+80>>2]=n;k=1;break a}k=0}Z=f+32|0;return k|0}function Ld(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=Z+-64|0;Z=g;F[g+56>>2]=0;F[g+48>>2]=0;F[g+52>>2]=0;F[g+40>>2]=0;F[g+44>>2]=0;F[g+32>>2]=0;F[g+36>>2]=0;F[g+24>>2]=0;F[g+28>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;h=g+8|0;a:{b:{if(!H[b+38>>1]){break b}if(!Ta(1,h+12|0,b)){break b}e=F[b+8>>2];f=F[b+16>>2];j=e-f|0;k=F[h+12>>2];e=F[b+12>>2]-(F[b+20>>2]+(e>>>0>>0)|0)|0;if(j>>>0>>6>>>0&(e|0)<=0|(e|0)<0){break b}e=F[h>>2];d=F[h+4>>2]-e>>2;c:{if(d>>>0>>0){qa(h,k-d|0);k=F[h+12>>2];break c}if(d>>>0<=k>>>0){break c}F[h+4>>2]=e+(k<<2)}i=1;if(!k){break a}e=F[b+16>>2];d=F[b+20>>2];r=F[h>>2];l=F[b+8>>2];o=F[b+12>>2];j=0;while(1){i=0;if((d|0)>=(o|0)&e>>>0>=l>>>0|(d|0)>(o|0)){break a}i=F[b>>2];p=G[i+e|0];e=e+1|0;d=e?d:d+1|0;F[b+16>>2]=e;F[b+20>>2]=d;f=p>>>2|0;m=0;d:{e:{f:{g:{s=p&3;switch(s|0){case 3:break g;case 0:break e;default:break f}}f=f+j|0;i=0;if(f>>>0>=k>>>0){break a}ma(r+(j<<2)|0,0,(p&252)+4|0);j=f;break d}while(1){if((e|0)==(l|0)&(d|0)==(o|0)){break b}k=G[e+i|0];e=e+1|0;d=e?d:d+1|0;F[b+16>>2]=e;F[b+20>>2]=d;f=k<<(m<<3|6)|f;m=m+1|0;if((s|0)!=(m|0)){continue}break}}F[r+(j<<2)>>2]=f}j=j+1|0;k=F[h+12>>2];if(j>>>0>>0){continue}break}d=h+16|0;o=F[h>>2];f=F[h+16>>2];e=F[h+20>>2]-f|0;h:{if(e>>>0<=4194303){qa(d,1048576-(e>>>2|0)|0);break h}if((e|0)==4194304){break h}F[h+20>>2]=f+4194304}e=h+28|0;j=F[e>>2];f=F[h+32>>2]-j>>3;i:{if(f>>>0>>0){_a(e,k-f|0);j=F[e>>2];break i}if(f>>>0>k>>>0){F[h+32>>2]=(k<<3)+j}if(!k){break b}}l=F[d>>2];d=0;i=0;while(1){e=o+(d<<2)|0;h=F[e>>2];m=(d<<3)+j|0;f=i;F[m+4>>2]=f;F[m>>2]=h;e=F[e>>2];i=e+f|0;if(i>>>0>1048576){break b}j:{if(f>>>0>=i>>>0){break j}m=0;h=e&7;if(h){while(1){F[l+(f<<2)>>2]=d;f=f+1|0;m=m+1|0;if((h|0)!=(m|0)){continue}break}}if(e-1>>>0<=6){break j}while(1){e=l+(f<<2)|0;F[e>>2]=d;F[e+28>>2]=d;F[e+24>>2]=d;F[e+20>>2]=d;F[e+16>>2]=d;F[e+12>>2]=d;F[e+8>>2]=d;F[e+4>>2]=d;f=f+8|0;if((i|0)!=(f|0)){continue}break}}d=d+1|0;if((k|0)!=(d|0)){continue}break}n=(i|0)==1048576}i=n}k:{if(!i|(F[g+20>>2]?0:a)){break k}i=0;j=Z-16|0;Z=j;l:{if(!Sa(1,j+8|0,b)){break l}d=F[b+8>>2];f=F[b+16>>2];l=d-f|0;n=F[j+12>>2];h=F[b+20>>2];d=F[b+12>>2]-(h+(d>>>0>>0)|0)|0;e=F[j+8>>2];if((n|0)==(d|0)&e>>>0>l>>>0|d>>>0>>0){break l}d=h+n|0;l=e+f|0;d=l>>>0>>0?d+1|0:d;F[b+16>>2]=l;F[b+20>>2]=d;if((e|0)<=0){break l}b=f+F[b>>2]|0;F[g+48>>2]=b;d=e-1|0;f=d+b|0;l=G[f|0];m:{if(l>>>0<=63){F[g+52>>2]=d;b=G[f|0]&63;break m}n:{switch((l>>>6|0)-1|0){case 0:if(e>>>0<2){break l}d=e-2|0;F[g+52>>2]=d;b=b+d|0;b=G[b+1|0]<<8&16128|G[b|0];break m;case 1:if(e>>>0<3){break l}d=e-3|0;F[g+52>>2]=d;b=b+d|0;b=G[b+1|0]<<8|G[b+2|0]<<16&4128768|G[b|0];break m;default:break n}}d=e-4|0;F[g+52>>2]=d;b=b+d|0;b=(G[b|0]|G[b+1|0]<<8|(G[b+2|0]<<16|G[b+3|0]<<24))&1073741823}F[g+56>>2]=b+4194304;i=b>>>0<1069547520}Z=j+16|0;if(!i){break k}if(!a){t=1;break k}b=F[g+52>>2];f=F[g+56>>2];d=F[g+36>>2];e=F[g+48>>2];j=F[g+24>>2];while(1){o:{if(f>>>0>4194303){break o}while(1){if((b|0)<=0){break o}b=b-1|0;F[g+52>>2]=b;f=G[b+e|0]|f<<8;F[g+56>>2]=f;if(f>>>0<4194304){continue}break}}i=f&1048575;l=F[j+(i<<2)>>2];n=d+(l<<3)|0;f=(L(F[n>>2],f>>>20|0)+i|0)-F[n+4>>2]|0;F[g+56>>2]=f;F[(q<<2)+c>>2]=l;t=1;q=q+1|0;if((q|0)!=(a|0)){continue}break}}a=F[g+36>>2];if(a){F[g+40>>2]=a;ja(a)}a=F[g+24>>2];if(a){F[g+28>>2]=a;ja(a)}a=F[g+8>>2];if(a){F[g+12>>2]=a;ja(a)}Z=g- -64|0;return t}function kh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=M(0),f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=M(0),p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;if(F[c>>2]==F[c+4>>2]){m=F[d+80>>2];u=Z-16|0;Z=u;g=F[a+4>>2];k=G[b+24|0];h=F[d+48>>2];n=F[F[d>>2]>>2];c=u+8|0;F[c>>2]=1065353216;d=c;J[c>>2]=M(-1<>2];c=ka(k<<2);a:{if(!m|!k){break a}p=h+n|0;o=J[d>>2];n=F[a+8>>2];v=F[b>>2];d=F[b+48>>2];g=F[b+40>>2];w=F[b+44>>2];if(!G[b+84|0]){f=F[b+68>>2];s=k&254;t=k&1;a=0;while(1){b=F[v>>2];l=ki(g,w,F[f+(i<<2)>>2],0)+d|0;h=la(c,b+l|0,g);b=0;q=0;if((k|0)!=1){while(1){l=p+(a<<2)|0;j=b<<2;e=M(R(M(M(o*M(J[j+h>>2]-J[n+j>>2]))+M(.5))));b:{if(M(N(e))>2]=r;j=j|4;e=M(R(M(M(o*M(J[j+h>>2]-J[n+j>>2]))+M(.5))));c:{if(M(N(e))>2]=j;b=b+2|0;a=a+2|0;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(t){l=p+(a<<2)|0;b=b<<2;e=M(R(M(M(o*M(J[b+h>>2]-J[b+n>>2]))+M(.5))));d:{if(M(N(e))>2]=b;a=a+1|0}i=i+1|0;if((m|0)!=(i|0)){continue}break}break a}s=k&254;t=k&1;a=0;while(1){b=F[v>>2];h=ki(g,w,i,l)+d|0;j=la(c,b+h|0,g);b=0;q=0;if((k|0)!=1){while(1){h=p+(a<<2)|0;f=b<<2;e=M(R(M(M(o*M(J[f+j>>2]-J[f+n>>2]))+M(.5))));e:{if(M(N(e))>2]=r;f=f|4;e=M(R(M(M(o*M(J[f+j>>2]-J[f+n>>2]))+M(.5))));f:{if(M(N(e))>2]=f;b=b+2|0;a=a+2|0;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(t){h=p+(a<<2)|0;b=b<<2;e=M(R(M(M(o*M(J[b+j>>2]-J[b+n>>2]))+M(.5))));g:{if(M(N(e))>2]=b;a=a+1|0}b=l;i=i+1|0;b=i?b:b+1|0;l=b;if((i|0)!=(m|0)|b){continue}break}}ja(c);Z=u+16|0;return 1}j=Z-16|0;Z=j;m=F[a+4>>2];i=G[b+24|0];g=F[d+48>>2];h=F[F[d>>2]>>2];d=j+8|0;F[d>>2]=1065353216;l=d;J[d>>2]=M(-1<>2];d=ka(i<<2);m=F[c+4>>2];q=F[c>>2];h:{if(!i|(m|0)==(q|0)){break h}n=h+g|0;c=m-q>>2;u=c>>>0<=1?1:c;o=J[l>>2];h=F[a+8>>2];v=F[b>>2];l=F[b+48>>2];m=F[b+40>>2];w=F[b+44>>2];if(G[b+84|0]){s=i&254;t=i&1;a=0;c=0;while(1){b=F[v>>2];g=ki(m,w,F[q+(c<<2)>>2],0)+l|0;p=la(d,b+g|0,m);b=0;k=0;if((i|0)!=1){while(1){g=n+(a<<2)|0;f=b<<2;e=M(R(M(M(o*M(J[f+p>>2]-J[h+f>>2]))+M(.5))));i:{if(M(N(e))>2]=r;f=f|4;e=M(R(M(M(o*M(J[f+p>>2]-J[h+f>>2]))+M(.5))));j:{if(M(N(e))>2]=f;b=b+2|0;a=a+2|0;k=k+2|0;if((s|0)!=(k|0)){continue}break}}if(t){g=n+(a<<2)|0;b=b<<2;e=M(R(M(M(o*M(J[b+p>>2]-J[b+h>>2]))+M(.5))));k:{if(M(N(e))>2]=b;a=a+1|0}c=c+1|0;if((u|0)!=(c|0)){continue}break}break h}s=F[b+68>>2];t=i&254;x=i&1;a=0;c=0;while(1){b=F[v>>2];g=ki(m,w,F[s+(F[q+(c<<2)>>2]<<2)>>2],0)+l|0;p=la(d,b+g|0,m);b=0;k=0;if((i|0)!=1){while(1){g=n+(a<<2)|0;f=b<<2;e=M(R(M(M(o*M(J[f+p>>2]-J[h+f>>2]))+M(.5))));l:{if(M(N(e))>2]=r;f=f|4;e=M(R(M(M(o*M(J[f+p>>2]-J[h+f>>2]))+M(.5))));m:{if(M(N(e))>2]=f;b=b+2|0;a=a+2|0;k=k+2|0;if((t|0)!=(k|0)){continue}break}}if(x){g=n+(a<<2)|0;b=b<<2;e=M(R(M(M(o*M(J[b+p>>2]-J[b+h>>2]))+M(.5))));n:{if(M(N(e))>2]=b;a=a+1|0}c=c+1|0;if((u|0)!=(c|0)){continue}break}}ja(d);Z=j+16|0;return 1} function Cd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=F[a+4>>2];e=F[a>>2];f=(c-e|0)/144|0;if(f>>>0>>0){e=a;b=b-f|0;h=F[a+8>>2];c=F[a+4>>2];a:{if(b>>>0<=(h-c|0)/144>>>0){b:{if(!b){break b}a=c;f=b&7;if(f){while(1){va(a);a=a+144|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}}c=L(b,144)+c|0;if((b-1&268435455)>>>0<7){break b}while(1){va(a);va(a+144|0);va(a+288|0);va(a+432|0);va(a+576|0);va(a+720|0);va(a+864|0);va(a+1008|0);a=a+1152|0;if((c|0)!=(a|0)){continue}break}}F[e+4>>2]=c;break a}c:{d:{e:{a=c;c=F[e>>2];i=(a-c|0)/144|0;a=i+b|0;if(a>>>0<29826162){c=(h-c|0)/144|0;f=c<<1;f=c>>>0>=14913080?29826161:a>>>0>>0?f:a;if(f){if(f>>>0>=29826162){break e}g=ka(L(f,144))}c=L(i,144)+g|0;a=c;h=b&7;if(h){while(1){va(a);a=a+144|0;d=d+1|0;if((h|0)!=(d|0)){continue}break}}h=L(b,144)+c|0;if((b-1&268435455)>>>0>=7){while(1){va(a);va(a+144|0);va(a+288|0);va(a+432|0);va(a+576|0);va(a+720|0);va(a+864|0);va(a+1008|0);a=a+1152|0;if((h|0)!=(a|0)){continue}break}}b=L(f,144)+g|0;d=F[e+4>>2];f=F[e>>2];if((d|0)==(f|0)){break d}while(1){c=c-144|0;d=d-144|0;a=d;F[c>>2]=F[a>>2];F[c+4>>2]=F[a+4>>2];F[c+8>>2]=F[a+8>>2];F[c+12>>2]=F[a+12>>2];F[a+12>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[c+16>>2]=F[a+16>>2];F[c+20>>2]=F[a+20>>2];F[c+24>>2]=F[a+24>>2];F[a+24>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;g=G[a+28|0];F[c+40>>2]=0;F[c+32>>2]=0;F[c+36>>2]=0;D[c+28|0]=g;F[c+32>>2]=F[a+32>>2];F[c+36>>2]=F[a+36>>2];F[c+40>>2]=F[a+40>>2];F[a+40>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;F[c+52>>2]=0;F[c+44>>2]=0;F[c+48>>2]=0;F[c+44>>2]=F[a+44>>2];F[c+48>>2]=F[a+48>>2];F[c+52>>2]=F[a+52>>2];F[a+52>>2]=0;F[a+44>>2]=0;F[a+48>>2]=0;g=c- -64|0;F[g>>2]=0;F[c+56>>2]=0;F[c+60>>2]=0;F[c+56>>2]=F[a+56>>2];F[c+60>>2]=F[a+60>>2];i=g;g=a- -64|0;F[i>>2]=F[g>>2];F[g>>2]=0;F[a+56>>2]=0;F[a+60>>2]=0;F[c+68>>2]=F[a+68>>2];g=F[a+72>>2];F[c+84>>2]=0;F[c+76>>2]=0;F[c+80>>2]=0;F[c+72>>2]=g;F[c+76>>2]=F[a+76>>2];F[c+80>>2]=F[a+80>>2];F[c+84>>2]=F[a+84>>2];F[a+84>>2]=0;F[a+76>>2]=0;F[a+80>>2]=0;F[c+96>>2]=0;F[c+88>>2]=0;F[c+92>>2]=0;F[c+88>>2]=F[a+88>>2];F[c+92>>2]=F[a+92>>2];F[c+96>>2]=F[a+96>>2];F[a+96>>2]=0;F[a+88>>2]=0;F[a+92>>2]=0;g=G[a+100|0];F[c+112>>2]=0;F[c+104>>2]=0;F[c+108>>2]=0;D[c+100|0]=g;F[c+104>>2]=F[a+104>>2];F[c+108>>2]=F[a+108>>2];F[c+112>>2]=F[a+112>>2];F[a+112>>2]=0;F[a+104>>2]=0;F[a+108>>2]=0;F[c+124>>2]=0;F[c+116>>2]=0;F[c+120>>2]=0;F[c+116>>2]=F[a+116>>2];F[c+120>>2]=F[a+120>>2];F[c+124>>2]=F[a+124>>2];F[a+124>>2]=0;F[a+116>>2]=0;F[a+120>>2]=0;g=F[a+128>>2];F[c+140>>2]=0;F[c+132>>2]=0;F[c+136>>2]=0;F[c+128>>2]=g;F[c+132>>2]=F[a+132>>2];F[c+136>>2]=F[a+136>>2];F[c+140>>2]=F[a+140>>2];F[a+140>>2]=0;F[a+132>>2]=0;F[a+136>>2]=0;if((a|0)!=(f|0)){continue}break}F[e+8>>2]=b;a=F[e+4>>2];F[e+4>>2]=h;d=F[e>>2];F[e>>2]=c;if((a|0)==(d|0)){break c}while(1){b=a-144|0;c=F[b+132>>2];if(c){F[a-8>>2]=c;ja(c)}c=F[a-28>>2];if(c){F[a-24>>2]=c;ja(c)}c=F[a-40>>2];if(c){F[a-36>>2]=c;ja(c)}Gb(a-140|0);a=b;if((d|0)!=(a|0)){continue}break}break c}na();v()}oa();v()}F[e+8>>2]=b;F[e+4>>2]=h;F[e>>2]=c}if(d){ja(d)}}return}if(b>>>0>>0){e=e+L(b,144)|0;if((e|0)!=(c|0)){while(1){b=c-144|0;d=F[b+132>>2];if(d){F[c-8>>2]=d;ja(d)}d=F[c-28>>2];if(d){F[c-24>>2]=d;ja(d)}d=F[c-40>>2];if(d){F[c-36>>2]=d;ja(d)}Gb(c-140|0);c=b;if((e|0)!=(c|0)){continue}break}}F[a+4>>2]=e}}function Yc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;F[a+56>>2]=F[a+52>>2];F[a+44>>2]=F[a+40>>2];b=F[a+64>>2];c=F[b+24>>2];if((c|0)==F[b+28>>2]){return 1}a:{b:{c:{while(1){g=i;i=F[(k<<2)+c>>2];d:{if((i|0)==-1){i=g;break d}b=F[a+56>>2];e:{if((b|0)!=F[a+60>>2]){F[b>>2]=g;F[a+56>>2]=b+4;break e}d=F[a+52>>2];e=b-d|0;h=e>>2;c=h+1|0;if(c>>>0>=1073741824){break c}f=e>>>1|0;f=e>>>0>=2147483644?1073741823:c>>>0>>0?f:c;if(f){if(f>>>0>=1073741824){break b}e=ka(f<<2)}else{e=0}c=e+(h<<2)|0;F[c>>2]=g;h=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[a+60>>2]=e+(f<<2);F[a+56>>2]=h;F[a+52>>2]=c;if(!d){break e}ja(d)}f:{g:{if(!(F[F[a+12>>2]+(k>>>3&536870908)>>2]>>>k&1)){break g}e=i+1|0;e=(e>>>0)%3|0?e:i-2|0;if((e|0)==-1|F[F[a>>2]+(e>>>3&536870908)>>2]>>>e&1){break g}e=F[F[F[a+64>>2]+12>>2]+(e<<2)>>2];if((e|0)==-1){break g}b=e+1|0;b=(b>>>0)%3|0?b:e-2|0;if((b|0)==-1){break g}c=F[a+64>>2];f=F[a>>2];while(1){e=b;b=-1;d=e+1|0;d=(d>>>0)%3|0?d:e-2|0;h:{if((d|0)==-1|F[f+(d>>>3&536870908)>>2]>>>d&1){break h}d=F[F[c+12>>2]+(d<<2)>>2];if((d|0)==-1){break h}b=d+1|0;b=(b>>>0)%3|0?b:d-2|0}if((b|0)!=(i|0)){if((b|0)==-1){break f}continue}break}return 0}e=i}F[F[a+28>>2]+(e<<2)>>2]=g;b=F[a+44>>2];i:{if((b|0)!=F[a+48>>2]){F[b>>2]=e;F[a+44>>2]=b+4;break i}d=F[a+40>>2];i=b-d|0;h=i>>2;c=h+1|0;if(c>>>0>=1073741824){break a}f=i>>>1|0;f=i>>>0>=2147483644?1073741823:c>>>0>>0?f:c;if(f){if(f>>>0>=1073741824){break b}i=ka(f<<2)}else{i=0}c=i+(h<<2)|0;F[c>>2]=e;h=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[a+48>>2]=i+(f<<2);F[a+44>>2]=h;F[a+40>>2]=c;if(!d){break i}ja(d)}i=g+1|0;b=F[a+64>>2];if((e|0)==-1){break d}j:{if((e>>>0)%3|0){c=e-1|0;break j}c=e+2|0;if((c|0)==-1){break d}}d=F[F[b+12>>2]+(c<<2)>>2];if((d|0)==-1){break d}f=d+((d>>>0)%3|0?-1:2)|0;if((f|0)==-1|(e|0)==(f|0)){break d}while(1){b=f+1|0;b=(b>>>0)%3|0?b:f-2|0;if(F[F[a>>2]+(b>>>3&536870908)>>2]>>>b&1){b=F[a+56>>2];k:{if((b|0)!=F[a+60>>2]){F[b>>2]=i;F[a+56>>2]=b+4;break k}d=F[a+52>>2];g=b-d|0;j=g>>2;c=j+1|0;if(c>>>0>=1073741824){break c}h=g>>>1|0;h=g>>>0>=2147483644?1073741823:c>>>0>>0?h:c;if(h){if(h>>>0>=1073741824){break b}g=ka(h<<2)}else{g=0}c=g+(j<<2)|0;F[c>>2]=i;j=c+4|0;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[a+60>>2]=g+(h<<2);F[a+56>>2]=j;F[a+52>>2]=c;if(!d){break k}ja(d)}d=i+1|0;b=F[a+44>>2];l:{if((b|0)!=F[a+48>>2]){F[b>>2]=f;F[a+44>>2]=b+4;break l}h=F[a+40>>2];g=b-h|0;l=g>>2;c=l+1|0;if(c>>>0>=1073741824){break a}j=g>>>1|0;j=g>>>0>=2147483644?1073741823:c>>>0>>0?j:c;if(j){if(j>>>0>=1073741824){break b}g=ka(j<<2)}else{g=0}c=g+(l<<2)|0;F[c>>2]=f;l=c+4|0;if((b|0)!=(h|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(h|0)){continue}break}}F[a+48>>2]=g+(j<<2);F[a+44>>2]=l;F[a+40>>2]=c;if(!h){break l}ja(h)}g=i;i=d}F[F[a+28>>2]+(f<<2)>>2]=g;b=F[a+64>>2];m:{if((f>>>0)%3|0){c=f-1|0;break m}c=f+2|0;if((c|0)==-1){break d}}d=F[F[b+12>>2]+(c<<2)>>2];if((d|0)==-1){break d}f=d+((d>>>0)%3|0?-1:2)|0;if((f|0)==-1){break d}if((e|0)!=(f|0)){continue}break}}k=k+1|0;c=F[b+24>>2];if(k>>>0>2]-c>>2>>>0){continue}break}return 1}na();v()}oa();v()}na();v()}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;f=Z-96|0;Z=f;e=F[a+16>>2];D[f+92|0]=1;F[f+88>>2]=b;F[f+84>>2]=b;F[f+80>>2]=e;a:{if((b|0)==-1){break a}j=F[a+20>>2];d=F[j>>2];e=F[F[e>>2]+(b<<2)>>2];if(e>>>0>=F[j+4>>2]-d>>2>>>0){break a}e=F[F[a+8>>2]+(F[d+(e<<2)>>2]<<2)>>2];d=F[a+4>>2];if(!G[d+84|0]){e=F[F[d+68>>2]+(e<<2)>>2]}F[f+72>>2]=0;F[f+76>>2]=0;j=f- -64|0;F[j>>2]=0;F[j+4>>2]=0;F[f+56>>2]=0;F[f+60>>2]=0;Ga(d,e,D[d+24|0],f+56|0);e=b+1|0;j=(e>>>0)%3|0?e:b-2|0;n=((b>>>0)%3|0?-1:2)+b|0;b:{c:{while(1){d=j;e=n;d:{if(!F[a+28>>2]){break d}e=b+1|0;d=(e>>>0)%3|0?e:b-2|0;e=b-1|0;if((b>>>0)%3|0){break d}e=b+2|0}if((d|0)==-1){break b}m=F[a+20>>2];b=F[m>>2];d=F[F[F[a+16>>2]>>2]+(d<<2)>>2];if(d>>>0>=F[m+4>>2]-b>>2>>>0){break b}d=F[F[a+8>>2]+(F[(d<<2)+b>>2]<<2)>>2];b=F[a+4>>2];if(!G[b+84|0]){d=F[F[b+68>>2]+(d<<2)>>2]}F[f+48>>2]=0;F[f+52>>2]=0;F[f+40>>2]=0;F[f+44>>2]=0;F[f+32>>2]=0;F[f+36>>2]=0;Ga(b,d,D[b+24|0],f+32|0);if((e|0)==-1){break c}d=F[a+20>>2];b=F[d>>2];e=F[F[F[a+16>>2]>>2]+(e<<2)>>2];if(e>>>0>=F[d+4>>2]-b>>2>>>0){break c}d=F[F[a+8>>2]+(F[b+(e<<2)>>2]<<2)>>2];b=F[a+4>>2];if(!G[b+84|0]){d=F[F[b+68>>2]+(d<<2)>>2]}F[f+24>>2]=0;F[f+28>>2]=0;F[f+16>>2]=0;F[f+20>>2]=0;F[f+8>>2]=0;F[f+12>>2]=0;Ga(b,d,D[b+24|0],f+8|0);g=F[f+8>>2];b=F[f+56>>2];d=g-b|0;p=F[f+60>>2];t=F[f+12>>2]-(p+(b>>>0>g>>>0)|0)|0;i=F[f+40>>2];e=F[f+64>>2];m=i-e|0;u=F[f+68>>2];y=F[f+44>>2]-(u+(e>>>0>i>>>0)|0)|0;g=ki(d,t,m,y);w=o-g|0;x=h-(_+(g>>>0>o>>>0)|0)|0;h=w;i=F[f+16>>2];g=i-e|0;u=F[f+20>>2]-((e>>>0>i>>>0)+u|0)|0;k=F[f+32>>2];i=k-b|0;w=F[f+36>>2]-((b>>>0>k>>>0)+p|0)|0;b=ki(g,u,i,w);o=h+b|0;h=_+x|0;h=b>>>0>o>>>0?h+1|0:h;b=l;l=d;p=t;k=F[f+48>>2];e=F[f+72>>2];d=k-e|0;t=F[f+76>>2];x=F[f+52>>2]-(t+(e>>>0>k>>>0)|0)|0;l=ki(l,p,d,x);k=b+l|0;b=_+q|0;b=k>>>0>>0?b+1|0:b;l=F[f+24>>2];p=l-e|0;e=F[f+28>>2]-((e>>>0>l>>>0)+t|0)|0;q=ki(p,e,i,w);l=k-q|0;q=b-(_+(k>>>0>>0)|0)|0;b=ki(g,u,d,x);d=r-b|0;b=s-(_+(b>>>0>r>>>0)|0)|0;s=ki(p,e,m,y);r=s+d|0;b=_+b|0;s=r>>>0>>0?b+1|0:b;nc(f+80|0);b=F[f+88>>2];if((b|0)!=-1){continue}break}b=s>>31;e=b^r;d=e-b|0;b=(b^s)-((b>>>0>e>>>0)+b|0)|0;n=-1;e=2147483647;m=q>>31;g=m;i=g^l;j=i-g|0;m=(g^q)-((i>>>0>>0)+g|0)|0;i=m;k=j^-1;g=i^2147483647;m=h;e:{f:{if(!F[a+28>>2]){if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break e}b=b+i|0;a=d+j|0;b=a>>>0>>0?b+1|0:b;e=a;g=h;a=g>>31;d=a;n=d^o;a=n-d|0;h=a;d=(d^g)-((d>>>0>n>>>0)+d|0)|0;a=a+e|0;d=d^2147483647;h=(d|0)==(b|0)&(h^-1)>>>0>>0|b>>>0>d>>>0;a=h?-1:a;if(!(h&0)&(a|0)<=536870912|(a|0)<536870912){break e}b=0;a=a>>>29|0;break f}g:{if((b|0)==(g|0)&d>>>0>k>>>0|b>>>0>g>>>0){break g}b=b+i|0;a=d+j|0;b=a>>>0>>0?b+1|0:b;k=h;h=h>>31;g=h;i=g^o;h=i-g|0;j=(g^k)-((g>>>0>i>>>0)+g|0)|0;g=j^2147483647;d=a;a=h;if((g|0)==(b|0)&d>>>0>(a^-1)>>>0|b>>>0>g>>>0){break g}b=b+j|0;n=a+d|0;b=n>>>0>>0?b+1|0:b;e=b;if(!b&n>>>0<536870913){break e}}b=e>>>29|0;a=(e&536870911)<<3|n>>>29}o=li(o,m,a,b);l=li(l,q,a,b);r=li(r,s,a,b)}F[c+8>>2]=o;F[c+4>>2]=l;F[c>>2]=r;Z=f+96|0;return}ta();v()}ta();v()}ta();v()}function Nc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if((b|0)<0){break a}c=F[a+12>>2];d=F[a+8>>2];if(c-d>>2>>>0<=b>>>0){break a}d=d+(b<<2)|0;e=F[d>>2];i=F[e+60>>2];f=F[e+56>>2];e=d+4|0;if((e|0)!=(c|0)){while(1){h=F[e>>2];F[e>>2]=0;g=F[d>>2];F[d>>2]=h;if(g){xa(g)}d=d+4|0;e=e+4|0;if((e|0)!=(c|0)){continue}break}c=F[a+12>>2]}if((c|0)!=(d|0)){while(1){c=c-4|0;e=F[c>>2];F[c>>2]=0;if(e){xa(e)}if((c|0)!=(d|0)){continue}break}}F[a+12>>2]=d;g=F[a+4>>2];b:{if(!g|(i|0)<0){break b}c=F[g+24>>2];d=F[g+28>>2];if((c|0)==(d|0)){break b}while(1){if((i|0)==F[F[c>>2]+24>>2]){d=c+4|0;i=F[g+28>>2];if((d|0)!=(i|0)){while(1){h=F[d>>2];F[d>>2]=0;e=F[c>>2];F[c>>2]=h;if(e){Ca(e+12|0,F[e+16>>2]);Ba(e,F[e+4>>2]);ja(e)}c=c+4|0;d=d+4|0;if((i|0)!=(d|0)){continue}break}d=F[g+28>>2]}if((c|0)!=(d|0)){while(1){d=d-4|0;e=F[d>>2];F[d>>2]=0;if(e){Ca(e+12|0,F[e+16>>2]);Ba(e,F[e+4>>2]);ja(e)}if((c|0)!=(d|0)){continue}break}}F[g+28>>2]=c;break b}c=c+4|0;if((d|0)!=(c|0)){continue}break}}c:{if((f|0)>4){break c}d:{e=L(f,12)+a|0;c=F[e+20>>2];d=F[e+24>>2];if((c|0)==(d|0)){break d}while(1){if(F[c>>2]==(b|0)){break d}c=c+4|0;if((d|0)!=(c|0)){continue}break}break c}if((c|0)==(d|0)){break c}f=c;c=c+4|0;pa(f,c,d-c|0);F[e+24>>2]=d-4}c=F[a+24>>2];d=F[a+20>>2];e:{if((c|0)==(d|0)){break e}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=F[h>>2];if((j|0)>(b|0)){F[h>>2]=j-1}f=d+(f|4)|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break e}c=d+(c<<2)|0;d=F[c>>2];if((d|0)<=(b|0)){break e}F[c>>2]=d-1}c=F[a+36>>2];d=F[a+32>>2];f:{if((c|0)==(d|0)){break f}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=F[h>>2];if((j|0)>(b|0)){F[h>>2]=j-1}f=d+(f|4)|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break f}c=d+(c<<2)|0;d=F[c>>2];if((d|0)<=(b|0)){break f}F[c>>2]=d-1}c=F[a+48>>2];d=F[a+44>>2];g:{if((c|0)==(d|0)){break g}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=F[h>>2];if((j|0)>(b|0)){F[h>>2]=j-1}f=d+(f|4)|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break g}c=d+(c<<2)|0;d=F[c>>2];if((d|0)<=(b|0)){break g}F[c>>2]=d-1}c=F[a+60>>2];d=F[a+56>>2];h:{if((c|0)==(d|0)){break h}e=c-d|0;c=e>>2;g=c>>>0<=1?1:c;i=g&1;c=0;if(e>>>0>=8){g=g&-2;e=0;while(1){f=c<<2;h=f+d|0;j=F[h>>2];if((j|0)>(b|0)){F[h>>2]=j-1}f=d+(f|4)|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!i){break h}c=d+(c<<2)|0;d=F[c>>2];if((d|0)<=(b|0)){break h}F[c>>2]=d-1}c=F[a+72>>2];a=F[a+68>>2];if((c|0)==(a|0)){break a}d=c-a|0;c=d>>2;e=c>>>0<=1?1:c;g=e&1;c=0;if(d>>>0>=8){d=e&-2;e=0;while(1){i=c<<2;f=i+a|0;h=F[f>>2];if((h|0)>(b|0)){F[f>>2]=h-1}i=a+(i|4)|0;f=F[i>>2];if((f|0)>(b|0)){F[i>>2]=f-1}c=c+2|0;e=e+2|0;if((d|0)!=(e|0)){continue}break}}if(!g){break a}f=b;a=a+(c<<2)|0;b=F[a>>2];if((f|0)>=(b|0)){break a}F[a>>2]=b-1}}function ja(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if(!a){break a}d=a-8|0;b=F[a-4>>2];a=b&-8;f=d+a|0;b:{if(b&1){break b}if(!(b&3)){break a}b=F[d>>2];d=d-b|0;if(d>>>0>>0<=255){e=F[d+8>>2];b=b>>>3|0;c=F[d+12>>2];if((c|0)==(e|0)){i=11764,j=F[2941]&oi(b),F[i>>2]=j;break b}F[e+12>>2]=c;F[c+8>>2]=e;break b}h=F[d+24>>2];b=F[d+12>>2];c:{if((d|0)!=(b|0)){c=F[d+8>>2];F[c+12>>2]=b;F[b+8>>2]=c;break c}d:{e=d+20|0;c=F[e>>2];if(c){break d}e=d+16|0;c=F[e>>2];if(c){break d}b=0;break c}while(1){g=e;b=c;e=b+20|0;c=F[e>>2];if(c){continue}e=b+16|0;c=F[b+16>>2];if(c){continue}break}F[g>>2]=0}if(!h){break b}e=F[d+28>>2];c=(e<<2)+12068|0;e:{if(F[c>>2]==(d|0)){F[c>>2]=b;if(b){break e}i=11768,j=F[2942]&oi(e),F[i>>2]=j;break b}F[h+(F[h+16>>2]==(d|0)?16:20)>>2]=b;if(!b){break b}}F[b+24>>2]=h;c=F[d+16>>2];if(c){F[b+16>>2]=c;F[c+24>>2]=b}c=F[d+20>>2];if(!c){break b}F[b+20>>2]=c;F[c+24>>2]=b;break b}b=F[f+4>>2];if((b&3)!=3){break b}F[2943]=a;F[f+4>>2]=b&-2;F[d+4>>2]=a|1;F[a+d>>2]=a;return}if(d>>>0>=f>>>0){break a}b=F[f+4>>2];if(!(b&1)){break a}f:{if(!(b&2)){if(F[2947]==(f|0)){F[2947]=d;a=F[2944]+a|0;F[2944]=a;F[d+4>>2]=a|1;if(F[2946]!=(d|0)){break a}F[2943]=0;F[2946]=0;return}if(F[2946]==(f|0)){F[2946]=d;a=F[2943]+a|0;F[2943]=a;F[d+4>>2]=a|1;F[a+d>>2]=a;return}a=(b&-8)+a|0;g:{if(b>>>0<=255){e=F[f+8>>2];b=b>>>3|0;c=F[f+12>>2];if((c|0)==(e|0)){i=11764,j=F[2941]&oi(b),F[i>>2]=j;break g}F[e+12>>2]=c;F[c+8>>2]=e;break g}h=F[f+24>>2];b=F[f+12>>2];h:{if((f|0)!=(b|0)){c=F[f+8>>2];F[c+12>>2]=b;F[b+8>>2]=c;break h}i:{e=f+20|0;c=F[e>>2];if(c){break i}e=f+16|0;c=F[e>>2];if(c){break i}b=0;break h}while(1){g=e;b=c;e=b+20|0;c=F[e>>2];if(c){continue}e=b+16|0;c=F[b+16>>2];if(c){continue}break}F[g>>2]=0}if(!h){break g}e=F[f+28>>2];c=(e<<2)+12068|0;j:{if(F[c>>2]==(f|0)){F[c>>2]=b;if(b){break j}i=11768,j=F[2942]&oi(e),F[i>>2]=j;break g}F[h+(F[h+16>>2]==(f|0)?16:20)>>2]=b;if(!b){break g}}F[b+24>>2]=h;c=F[f+16>>2];if(c){F[b+16>>2]=c;F[c+24>>2]=b}c=F[f+20>>2];if(!c){break g}F[b+20>>2]=c;F[c+24>>2]=b}F[d+4>>2]=a|1;F[a+d>>2]=a;if(F[2946]!=(d|0)){break f}F[2943]=a;return}F[f+4>>2]=b&-2;F[d+4>>2]=a|1;F[a+d>>2]=a}if(a>>>0<=255){b=(a&-8)+11804|0;c=F[2941];a=1<<(a>>>3);k:{if(!(c&a)){F[2941]=a|c;a=b;break k}a=F[b+8>>2]}F[b+8>>2]=d;F[a+12>>2]=d;F[d+12>>2]=b;F[d+8>>2]=a;return}e=31;if(a>>>0<=16777215){b=O(a>>>8|0);e=((a>>>38-b&1)-(b<<1)|0)+62|0}F[d+28>>2]=e;F[d+16>>2]=0;F[d+20>>2]=0;g=(e<<2)+12068|0;l:{m:{c=F[2942];b=1<>2]=d;F[d+24>>2]=g;break n}e=a<<((e|0)!=31?25-(e>>>1|0)|0:0);b=F[g>>2];while(1){c=b;if((F[b+4>>2]&-8)==(a|0)){break m}b=e>>>29|0;e=e<<1;g=c+(b&4)|0;b=F[g+16>>2];if(b){continue}break}F[g+16>>2]=d;F[d+24>>2]=c}F[d+12>>2]=d;F[d+8>>2]=d;break l}a=F[c+8>>2];F[a+12>>2]=d;F[c+8>>2]=d;F[d+24>>2]=0;F[d+12>>2]=c;F[d+8>>2]=a}a=F[2949]-1|0;F[2949]=a?a:-1}}function di(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;F[a+8>>2]=e;n=a+32|0;h=F[n>>2];f=F[a+36>>2]-h>>2;a:{if(f>>>0>>0){qa(n,e-f|0);d=F[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}F[a+36>>2]=h+(e<<2);d=e}s=F[a+52>>2];p=F[a+48>>2];f=0;h=e>>>0>1073741823?-1:e<<2;m=ma(ka(h),0,h);b:{if((d|0)<=0){break b}g=F[a+32>>2];while(1){d=f<<2;h=F[d+m>>2];j=F[a+16>>2];c:{if((h|0)>(j|0)){F[d+g>>2]=j;break c}d=d+g|0;j=F[a+12>>2];if((j|0)>(h|0)){F[d>>2]=j;break c}F[d>>2]=h}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){h=f<<2;d=h+c|0;h=F[b+h>>2]+F[g+h>>2]|0;F[d>>2]=h;d:{if((h|0)>F[a+16>>2]){i=h-F[a+20>>2]|0}else{if((h|0)>=F[a+12>>2]){break d}i=h+F[a+20>>2]|0}F[d>>2]=i}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=F[a+56>>2];q=F[f>>2];f=F[f+4>>2]-q|0;if((f|0)>=5){o=f>>>2|0;t=o>>>0<=2?2:o;u=e&-2;w=e&1;h=1;while(1){e:{f:{if((h|0)!=(o|0)){r=L(e,h);f=F[(h<<2)+q>>2];if((f|0)==-1){break f}f=F[F[p+12>>2]+(f<<2)>>2];if((f|0)==-1){break f}j=F[s>>2];g=F[p>>2];k=F[j+(F[g+(f<<2)>>2]<<2)>>2];i=f+1|0;i=(i>>>0)%3|0?i:f-2|0;if((i|0)!=-1){i=F[g+(i<<2)>>2]}else{i=-1}g:{h:{if((f>>>0)%3|0){f=f-1|0;break h}f=f+2|0;l=-1;if((f|0)==-1){break g}}l=F[g+(f<<2)>>2]}if((h|0)<=(k|0)){break f}f=F[(i<<2)+j>>2];if((f|0)>=(h|0)){break f}g=F[j+(l<<2)>>2];if((g|0)>=(h|0)){break f}i:{if((e|0)<=0){break i}g=L(e,g);j=L(e,f);k=L(e,k);f=0;l=0;if((e|0)!=1){while(1){F[(f<<2)+m>>2]=(F[(f+g<<2)+c>>2]+F[(f+j<<2)+c>>2]|0)-F[(f+k<<2)+c>>2];i=f|1;F[(i<<2)+m>>2]=(F[(g+i<<2)+c>>2]+F[(j+i<<2)+c>>2]|0)-F[(i+k<<2)+c>>2];f=f+2|0;l=l+2|0;if((u|0)!=(l|0)){continue}break}}if(!w){break i}F[(f<<2)+m>>2]=(F[(f+g<<2)+c>>2]+F[(f+j<<2)+c>>2]|0)-F[(f+k<<2)+c>>2]}if((d|0)<=0){break e}j=F[n>>2];f=0;while(1){d=f<<2;g=F[d+m>>2];k=F[a+16>>2];j:{if((g|0)>(k|0)){F[d+j>>2]=k;break j}d=d+j|0;k=F[a+12>>2];if((k|0)>(g|0)){F[d>>2]=k;break j}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;i=b+d|0;while(1){g=f<<2;d=g+k|0;g=F[g+i>>2]+F[g+j>>2]|0;F[d>>2]=g;k:{if((g|0)>F[a+16>>2]){l=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break k}l=g+F[a+20>>2]|0}F[d>>2]=l}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}ta();v()}if((d|0)<=0){break e}k=(L(h-1|0,e)<<2)+c|0;j=F[n>>2];f=0;while(1){d=f<<2;g=F[d+k>>2];i=F[a+16>>2];l:{if((g|0)>(i|0)){F[d+j>>2]=i;break l}d=d+j|0;i=F[a+12>>2];if((i|0)>(g|0)){F[d>>2]=i;break l}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;i=b+d|0;while(1){g=f<<2;d=g+k|0;g=F[g+i>>2]+F[g+j>>2]|0;F[d>>2]=g;m:{if((g|0)>F[a+16>>2]){l=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break m}l=g+F[a+20>>2]|0}F[d>>2]=l}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}h=h+1|0;if((t|0)!=(h|0)){continue}break}}ja(m);return 1}function od(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((b|0)==-1){return 1}g=(b>>>0)/3|0;if(!(F[F[a+24>>2]+(g>>>3&268435452)>>2]>>>g&1)){e=F[a+48>>2];F[a+52>>2]=e;a:{if((e|0)!=F[a+56>>2]){F[e>>2]=b;F[a+52>>2]=e+4;break a}d=ka(4);F[d>>2]=b;c=d+4|0;F[a+56>>2]=c;F[a+52>>2]=c;F[a+48>>2]=d;if(!e){break a}ja(e)}c=b+1|0;i=(c>>>0)%3|0?c:b-2|0;c=F[F[a+4>>2]+28>>2];k=F[(i<<2)+c>>2];if((k|0)==-1){return 0}e=(b-L(g,3)|0?-1:2)+b|0;j=F[c+(e<<2)>>2];if((j|0)==-1){return 0}b=F[a+36>>2];g=b+(k>>>3&536870908)|0;d=F[g>>2];c=1<>2]=c|d;Ka(a+8|0,k,i);b=F[a+36>>2]}d=(j>>>3&536870908)+b|0;c=F[d>>2];b=1<>2]=b|c;Ka(a+8|0,j,e)}f=F[a+52>>2];if((f|0)==F[a+48>>2]){return 1}k=a+8|0;while(1){b:{c:{f=f-4|0;b=F[f>>2];if((b|0)==-1){break c}c=(b>>>0)/3|0;g=F[a+24>>2]+(c>>>3&268435452)|0;d=F[g>>2];c=1<>2]=c|d;h=F[a+4>>2];c=F[F[h+28>>2]+(b<<2)>>2];if((c|0)==-1){return 0}while(1){d=b;d:{e:{j=F[a+36>>2]+(c>>>3&536870908)|0;i=F[j>>2];e=1<>2]+(c<<2)>>2];g:{if((g|0)==-1){break g}b=g+1|0;b=(b>>>0)%3|0?b:g-2|0;if((b|0)==-1|F[F[h>>2]+(b>>>3&536870908)>>2]>>>b&1){break g}g=F[F[F[h+64>>2]+12>>2]+(b<<2)>>2];if((g|0)!=-1){break f}}F[j>>2]=e|i;Ka(k,c,d);h=F[a+4>>2];break e}F[j>>2]=e|i;Ka(k,c,d);h=F[a+4>>2];b=g+1|0;if((((b>>>0)%3|0?b:g-2|0)|0)==-1){break e}b=-1;h:{if((d|0)==-1){break h}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1|F[F[h>>2]+(c>>>3&536870908)>>2]>>>c&1){break h}b=F[F[F[h+64>>2]+12>>2]+(c<<2)>>2]}c=(b>>>0)/3|0;d=1<>2];e=c>>>5|0;j=F[f+(e<<2)>>2];break d}i:{j:{if((d|0)==-1){break j}c=-1;b=d+1|0;b=(b>>>0)%3|0?b:d-2|0;if(!((b|0)==-1|F[F[h>>2]+(b>>>3&536870908)>>2]>>>b&1)){c=F[F[F[h+64>>2]+12>>2]+(b<<2)>>2]}k:{l:{if((d>>>0)%3|0){f=d-1|0;break l}f=d+2|0;b=-1;if((f|0)==-1){break k}}b=-1;if(F[F[h>>2]+(f>>>3&536870908)>>2]>>>f&1){break k}b=F[F[F[h+64>>2]+12>>2]+(f<<2)>>2]}g=(b|0)==-1;i=g?-1:(b>>>0)/3|0;if((c|0)!=-1){f=F[a+24>>2];d=(c>>>0)/3|0;e=d>>>5|0;j=F[f+(e<<2)>>2];d=1<>2];e=i>>>5|0;j=F[f+(e<<2)>>2];if(!(d&j)){break d}}f=F[a+52>>2]-4|0;F[a+52>>2]=f;break b}if(g){b=c;break d}if(F[(i>>>3&536870908)+f>>2]>>>i&1){b=c;break d}h=F[a+52>>2];F[h-4>>2]=b;if(F[a+56>>2]!=(h|0)){F[h>>2]=c;f=h+4|0;break c}m:{i=F[a+48>>2];e=h-i|0;g=e>>2;d=g+1|0;if(d>>>0<1073741824){b=e>>>1|0;e=e>>>0>=2147483644?1073741823:b>>>0>d>>>0?b:d;if(e){if(e>>>0>=1073741824){break m}d=ka(e<<2)}else{d=0}b=d+(g<<2)|0;F[b>>2]=c;f=b+4|0;if((h|0)!=(i|0)){while(1){b=b-4|0;h=h-4|0;F[b>>2]=F[h>>2];if((h|0)!=(i|0)){continue}break}}F[a+56>>2]=d+(e<<2);F[a+52>>2]=f;F[a+48>>2]=b;if(!i){break b}ja(i);f=F[a+52>>2];break b}na();v()}oa();v()}F[(e<<2)+f>>2]=d|j;c=F[F[h+28>>2]+(b<<2)>>2];if((c|0)!=-1){continue}break}return 0}F[a+52>>2]=f}if(F[a+48>>2]!=(f|0)){continue}break}}return 1}function he(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;F[a+8>>2]=e;m=a+32|0;h=F[m>>2];f=F[a+36>>2]-h>>2;a:{if(f>>>0>>0){qa(m,e-f|0);d=F[a+8>>2];break a}d=e;if(d>>>0>=f>>>0){break a}F[a+36>>2]=h+(e<<2);d=e}s=F[a+52>>2];n=F[a+48>>2];f=0;h=e>>>0>1073741823?-1:e<<2;l=ma(ka(h),0,h);b:{if((d|0)<=0){break b}g=F[a+32>>2];while(1){d=f<<2;h=F[d+l>>2];i=F[a+16>>2];c:{if((h|0)>(i|0)){F[d+g>>2]=i;break c}d=d+g|0;i=F[a+12>>2];if((i|0)>(h|0)){F[d>>2]=i;break c}F[d>>2]=h}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}if((d|0)<=0){break b}f=0;while(1){h=f<<2;d=h+c|0;h=F[b+h>>2]+F[g+h>>2]|0;F[d>>2]=h;d:{if((h|0)>F[a+16>>2]){h=h-F[a+20>>2]|0}else{if((h|0)>=F[a+12>>2]){break d}h=h+F[a+20>>2]|0}F[d>>2]=h}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}f=F[a+56>>2];q=F[f>>2];f=F[f+4>>2]-q|0;if((f|0)>=5){o=f>>>2|0;t=o>>>0<=2?2:o;u=e&-2;w=e&1;h=1;while(1){e:{f:{if((h|0)!=(o|0)){r=L(e,h);f=F[(h<<2)+q>>2];if((f|0)==-1|F[F[n>>2]+(f>>>3&536870908)>>2]>>>f&1){break f}f=F[F[F[n+64>>2]+12>>2]+(f<<2)>>2];if((f|0)==-1){break f}i=F[s>>2];g=F[n+28>>2];k=F[i+(F[g+(f<<2)>>2]<<2)>>2];if((k|0)>=(h|0)){break f}j=f+1|0;j=F[i+(F[g+(((j>>>0)%3|0?j:f-2|0)<<2)>>2]<<2)>>2];if((j|0)>=(h|0)){break f}f=F[i+(F[g+(f+((f>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2];if((f|0)>=(h|0)){break f}g:{if((e|0)<=0){break g}g=L(e,f);i=L(e,j);k=L(e,k);f=0;p=0;if((e|0)!=1){while(1){F[(f<<2)+l>>2]=(F[(f+g<<2)+c>>2]+F[(f+i<<2)+c>>2]|0)-F[(f+k<<2)+c>>2];j=f|1;F[(j<<2)+l>>2]=(F[(g+j<<2)+c>>2]+F[(i+j<<2)+c>>2]|0)-F[(k+j<<2)+c>>2];f=f+2|0;p=p+2|0;if((u|0)!=(p|0)){continue}break}}if(!w){break g}F[(f<<2)+l>>2]=(F[(f+g<<2)+c>>2]+F[(f+i<<2)+c>>2]|0)-F[(f+k<<2)+c>>2]}if((d|0)<=0){break e}i=F[m>>2];f=0;while(1){d=f<<2;g=F[d+l>>2];k=F[a+16>>2];h:{if((g|0)>(k|0)){F[d+i>>2]=k;break h}d=d+i|0;k=F[a+12>>2];if((k|0)>(g|0)){F[d>>2]=k;break h}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+k|0;g=F[g+j>>2]+F[g+i>>2]|0;F[d>>2]=g;i:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break i}g=g+F[a+20>>2]|0}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}break e}ta();v()}if((d|0)<=0){break e}k=(L(h-1|0,e)<<2)+c|0;i=F[m>>2];f=0;while(1){d=f<<2;g=F[d+k>>2];j=F[a+16>>2];j:{if((g|0)>(j|0)){F[d+i>>2]=j;break j}d=d+i|0;j=F[a+12>>2];if((j|0)>(g|0)){F[d>>2]=j;break j}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}f=0;if((d|0)<=0){break e}d=r<<2;k=d+c|0;j=b+d|0;while(1){g=f<<2;d=g+k|0;g=F[g+j>>2]+F[g+i>>2]|0;F[d>>2]=g;k:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break k}g=g+F[a+20>>2]|0}F[d>>2]=g}d=F[a+8>>2];f=f+1|0;if((d|0)>(f|0)){continue}break}}h=h+1|0;if((t|0)!=(h|0)){continue}break}}ja(l);return 1}function Fb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=M(0),k=0,l=0,m=M(0);i=F[c>>2];a:{b:{f=F[b+4>>2];if(!f){break b}g=ni(f);c:{if(g>>>0>=2){e=i;if(f>>>0<=e>>>0){e=(i>>>0)%(f>>>0)|0}c=F[F[b>>2]+(e<<2)>>2];if(!c){break b}if(g>>>0<=1){break c}while(1){c=F[c>>2];if(!c){break b}g=F[c+4>>2];if((g|0)!=(i|0)){if(f>>>0<=g>>>0){g=(g>>>0)%(f>>>0)|0}if((e|0)!=(g|0)){break b}}if(F[c+8>>2]!=(i|0)){continue}break}b=0;break a}e=f-1&i;c=F[F[b>>2]+(e<<2)>>2];if(!c){break b}}h=f-1|0;while(1){c=F[c>>2];if(!c){break b}g=F[c+4>>2];if((g|0)!=(i|0)&(g&h)!=(e|0)){break b}if(F[c+8>>2]!=(i|0)){continue}break}b=0;break a}c=ka(16);d=F[F[d>>2]>>2];F[c+12>>2]=0;F[c+8>>2]=d;F[c+4>>2]=i;F[c>>2]=0;m=M(F[b+12>>2]+1>>>0);j=J[b+16>>2];d:{if(m>M(j*M(f>>>0))?0:f){break d}e=2;d=(f-1&f)!=0|f>>>0<3|f<<1;j=M(S(M(m/j)));e:{if(j=M(0)){g=~~j>>>0;break e}g=0}d=d>>>0>g>>>0?d:g;f:{if((d|0)==1){break f}if(!(d&d-1)){e=d;break f}e=Mc(d);f=F[b+4>>2]}g:{if(e>>>0<=f>>>0){if(e>>>0>=f>>>0){break g}g=f>>>0<3;j=M(S(M(M(I[b+12>>2])/J[b+16>>2])));h:{if(j=M(0)){d=~~j>>>0;break h}d=0}i:{j:{if(g){break j}if(ni(f)>>>0>1){break j}d=d>>>0<2?d:1<<32-O(d-1|0);break i}d=Mc(d)}e=d>>>0>>0?e:d;if(f>>>0<=e>>>0){break g}}f=0;g=0;h=e;k:{l:{m:{n:{if(e){if(h>>>0>=1073741824){break n}d=ka(h<<2);e=F[b>>2];F[b>>2]=d;if(e){ja(e)}F[b+4>>2]=h;d=0;if(h>>>0>=4){e=h&-4;while(1){k=d<<2;F[k+F[b>>2]>>2]=0;F[F[b>>2]+(k|4)>>2]=0;F[F[b>>2]+(k|8)>>2]=0;F[F[b>>2]+(k|12)>>2]=0;d=d+4|0;g=g+4|0;if((e|0)!=(g|0)){continue}break}}e=h&3;if(e){while(1){F[F[b>>2]+(d<<2)>>2]=0;d=d+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}e=F[b+8>>2];if(!e){break k}d=b+8|0;f=F[e+4>>2];g=ni(h);if(g>>>0<2){break m}f=f>>>0>=h>>>0?(f>>>0)%(h>>>0)|0:f;F[F[b>>2]+(f<<2)>>2]=d;d=F[e>>2];if(!d){break k}if(g>>>0<=1){break l}while(1){g=F[d+4>>2];if(h>>>0<=g>>>0){g=(g>>>0)%(h>>>0)|0}o:{if((f|0)==(g|0)){e=d;break o}l=g<<2;k=l+F[b>>2]|0;if(!F[k>>2]){F[k>>2]=e;e=d;f=g;break o}F[e>>2]=F[d>>2];F[d>>2]=F[F[l+F[b>>2]>>2]>>2];F[F[l+F[b>>2]>>2]>>2]=d}d=F[e>>2];if(d){continue}break}break k}d=F[b>>2];F[b>>2]=0;if(d){ja(d)}F[b+4>>2]=0;break k}oa();v()}f=h-1&f;F[F[b>>2]+(f<<2)>>2]=d;d=F[e>>2];if(!d){break k}}k=h-1|0;while(1){g=k&F[d+4>>2];p:{if((g|0)==(f|0)){e=d;break p}l=g<<2;h=l+F[b>>2]|0;if(F[h>>2]){F[e>>2]=F[d>>2];F[d>>2]=F[F[l+F[b>>2]>>2]>>2];F[F[l+F[b>>2]>>2]>>2]=d;break p}F[h>>2]=e;e=d;f=g}d=F[e>>2];if(d){continue}break}}}f=F[b+4>>2];d=f-1|0;if(!(d&f)){e=d&i;break d}if(f>>>0>i>>>0){e=i;break d}e=(i>>>0)%(f>>>0)|0}e=F[b>>2]+(e<<2)|0;d=F[e>>2];q:{r:{if(!d){d=b+8|0;F[c>>2]=F[d>>2];F[b+8>>2]=c;F[e>>2]=d;d=F[c>>2];if(!d){break q}d=F[d+4>>2];e=f-1|0;s:{if(!(e&f)){d=d&e;break s}if(d>>>0>>0){break s}d=(d>>>0)%(f>>>0)|0}d=F[b>>2]+(d<<2)|0;break r}F[c>>2]=F[d>>2]}F[d>>2]=c}F[b+12>>2]=F[b+12>>2]+1;b=1}D[a+4|0]=b;F[a>>2]=c}function Vb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=L(b,12)+a|0;F[j+12>>2]=F[j+8>>2];m=(c|0)==-1?-1:(c>>>0)/3|0;d=1;k=c;a:{b:{c:{while(1){d:{l=d;if(!d){if((k|0)==-1){break d}if((Wc(a,((k>>>0)%3|0?-1:2)+k|0)|0)==-1){break a}c=k+1|0;d=(c>>>0)%3|0?c:k-2|0;if((d|0)==-1){break a}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break a}d=F[F[F[a+4>>2]+12>>2]+(c<<2)>>2];if((d|0)==-1){break a}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break a}m=(c>>>0)/3|0}e:{d=F[a+56>>2]+(m>>>3&536870908)|0;h=F[d>>2];e=1<>2]=e|h;d=F[j+12>>2];f:{if((d|0)!=F[j+16>>2]){F[d>>2]=m;F[j+12>>2]=d+4;break f}n=F[j+8>>2];h=d-n|0;e=h>>2;i=e+1|0;if(i>>>0>=1073741824){break c}g=h>>>1|0;i=h>>>0>=2147483644?1073741823:i>>>0>>0?g:i;if(i){if(i>>>0>=1073741824){break b}g=ka(i<<2)}else{g=0}h=g+(e<<2)|0;F[h>>2]=m;e=h+4|0;if((d|0)!=(n|0)){while(1){h=h-4|0;d=d-4|0;F[h>>2]=F[d>>2];if((d|0)!=(n|0)){continue}break}}F[j+8>>2]=h;F[j+12>>2]=e;F[j+16>>2]=g+(i<<2);if(!n){break f}ja(n)}g=f+1|0;g:{h:{i:{if(!f){break i}if(g&1){if((c|0)==-1){c=-1;break g}d=c+1|0;c=(d>>>0)%3|0?d:c-2|0;break i}k=l?k:c;if((c|0)==-1){c=-1;break g}if((c>>>0)%3|0){d=c-1|0;break h}c=c+2|0}d=c;c=-1;if((d|0)==-1){break g}}c=F[F[F[a+4>>2]+12>>2]+(d<<2)>>2];h=-1;f=-1;e=d+1|0;e=(e>>>0)%3|0?e:d-2|0;if((e|0)>=0){f=(e>>>0)/3|0;f=F[(F[F[a>>2]+96>>2]+L(f,12)|0)+(e-L(f,3)<<2)>>2]}j:{if((c|0)==-1){break j}i=((c>>>0)%3|0?-1:2)+c|0;if((i|0)<0){break j}e=(i>>>0)/3|0;h=F[(F[F[a>>2]+96>>2]+L(e,12)|0)+(i-L(e,3)<<2)>>2]}if((f|0)!=(h|0)){c=-1;break g}k:{l:{f=((d>>>0)%3|0?-1:2)+d|0;if((f|0)>=0){d=(f>>>0)/3|0;if((c|0)!=-1){break l}c=-1;break g}d=-1;if((c|0)!=-1){break k}c=-1;break g}d=F[(F[F[a>>2]+96>>2]+L(d,12)|0)+(f-L(d,3)<<2)>>2]}f=c+1|0;e=(f>>>0)%3|0?f:c-2|0;if((e|0)>=0){f=(e>>>0)/3|0;f=F[(F[F[a>>2]+96>>2]+L(f,12)|0)+(e-L(f,3)<<2)>>2]}else{f=-1}if((f|0)!=(d|0)){c=-1;break g}f=g;m=(c>>>0)/3|0;d=F[a+56>>2]+(m>>>3&268435452)|0;h=F[d>>2];e=1<>2]-4|0;g=F[l>>2];d=F[a+56>>2]+(g>>>3&536870908)|0;c=F[d>>2];o=d,p=oi(g)&c,F[o>>2]=p;F[j+12>>2]=l;break a}d=0;if(l){continue}break a}break}k=-1;Wc(a,-1);break a}na();v()}oa();v()}F[((b<<2)+a|0)+44>>2]=k;b=F[j+12>>2];i=F[j+8>>2];m:{if((b|0)==(i|0)){break m}c=b-i|0;b=c>>2;b=b>>>0<=1?1:b;k=b&1;e=F[a+56>>2];d=0;if(c>>>0>=8){f=b&-2;c=0;while(1){l=d<<2;g=F[l+i>>2];b=e+(g>>>3&536870908)|0;a=F[b>>2];o=b,p=oi(g)&a,F[o>>2]=p;g=F[i+(l|4)>>2];b=e+(g>>>3&536870908)|0;a=F[b>>2];o=b,p=oi(g)&a,F[o>>2]=p;d=d+2|0;c=c+2|0;if((f|0)!=(c|0)){continue}break}}if(!k){break m}c=F[i+(d<<2)>>2];b=e+(c>>>3&536870908)|0;a=F[b>>2];o=b,p=oi(c)&a,F[o>>2]=p}}function pd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if((b|0)==-1){return 1}g=(b>>>0)/3|0;if(!(F[F[a+24>>2]+(g>>>3&268435452)>>2]>>>g&1)){f=F[a+48>>2];F[a+52>>2]=f;a:{if((f|0)!=F[a+56>>2]){F[f>>2]=b;F[a+52>>2]=f+4;break a}d=ka(4);F[d>>2]=b;c=d+4|0;F[a+56>>2]=c;F[a+52>>2]=c;F[a+48>>2]=d;if(!f){break a}ja(f)}e=-1;d=F[a+4>>2];c=b+1|0;i=(c>>>0)%3|0?c:b-2|0;if((i|0)!=-1){e=F[F[d>>2]+(i<<2)>>2]}b:{h=b-L(g,3)|0;if(h){c=b-1|0;break b}c=b+2|0;if((c|0)!=-1){break b}return 0}if((e|0)==-1){return 0}j=F[F[d>>2]+(c<<2)>>2];if((j|0)==-1){return 0}c=F[a+36>>2];f=c+(e>>>3&536870908)|0;g=F[f>>2];d=1<>2]=d|g;Ka(a+8|0,e,i);c=F[a+36>>2]}g=(j>>>3&536870908)+c|0;d=F[g>>2];c=1<>2]=c|d;Ka(a+8|0,j,(h?-1:2)+b|0)}c=F[a+52>>2];if((c|0)==F[a+48>>2]){return 1}j=a+8|0;while(1){c:{d:{c=c-4|0;b=F[c>>2];if((b|0)==-1){break d}d=(b>>>0)/3|0;f=F[a+24>>2]+(d>>>3&268435452)|0;g=F[f>>2];d=1<>2]=d|g;while(1){i=F[a+4>>2];e=F[F[i>>2]+(b<<2)>>2];if((e|0)==-1){return 0}e:{f:{h=F[a+36>>2]+(e>>>3&536870908)|0;f=F[h>>2];g=1<>2]+(e<<2)>>2];h:{if((d|0)==-1){break h}c=d+1|0;c=(c>>>0)%3|0?c:d-2|0;if((c|0)==-1){break h}d=F[F[i+12>>2]+(c<<2)>>2];if((d|0)!=-1){break g}}F[h>>2]=f|g;Ka(j,e,b);break f}F[h>>2]=f|g;Ka(j,e,b);c=d+1|0;if((((c>>>0)%3|0?c:d-2|0)|0)==-1){break f}c=b-2|0;d=b+1|0;b=-1;c=(d>>>0)%3|0?d:c;if((c|0)!=-1){b=F[F[F[a+4>>2]+12>>2]+(c<<2)>>2]}c=(b>>>0)/3|0;d=1<>2];f=c>>>5|0;i=F[e+(f<<2)>>2];break e}c=-1;g=F[a+4>>2];d=b+1|0;d=(d>>>0)%3|0?d:b-2|0;if((d|0)!=-1){c=F[F[g+12>>2]+(d<<2)>>2]}i:{j:{if((b>>>0)%3|0){e=b-1|0;break j}e=b+2|0;b=-1;if((e|0)==-1){break i}}b=F[F[g+12>>2]+(e<<2)>>2]}g=(b|0)==-1;h=g?-1:(b>>>0)/3|0;k:{if((c|0)!=-1){e=F[a+24>>2];d=(c>>>0)/3|0;f=d>>>5|0;i=F[e+(f<<2)>>2];d=1<>2];f=h>>>5|0;i=F[e+(f<<2)>>2];if(!(d&i)){break e}}c=F[a+52>>2]-4|0;F[a+52>>2]=c;break c}if(g){b=c;break e}if(F[(h>>>3&536870908)+e>>2]>>>h&1){b=c;break e}e=F[a+52>>2];F[e-4>>2]=b;if(F[a+56>>2]!=(e|0)){F[e>>2]=c;c=e+4|0;break d}l:{h=F[a+48>>2];f=e-h|0;g=f>>2;d=g+1|0;if(d>>>0<1073741824){b=f>>>1|0;f=f>>>0>=2147483644?1073741823:b>>>0>d>>>0?b:d;if(f){if(f>>>0>=1073741824){break l}d=ka(f<<2)}else{d=0}b=d+(g<<2)|0;F[b>>2]=c;c=b+4|0;if((e|0)!=(h|0)){while(1){b=b-4|0;e=e-4|0;F[b>>2]=F[e>>2];if((e|0)!=(h|0)){continue}break}}F[a+56>>2]=d+(f<<2);F[a+52>>2]=c;F[a+48>>2]=b;if(!h){break c}ja(h);c=F[a+52>>2];break c}na();v()}oa();v()}F[(f<<2)+e>>2]=d|i;if((b|0)!=-1){continue}break}return 0}F[a+52>>2]=c}if(F[a+48>>2]!=(c|0)){continue}break}}return 1}function ee(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Z-32|0;Z=h;a:{b:{if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[F[a+48>>2]+64>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}c:{if(d){Na(a+60|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[F[a+48>>2]+64>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+72|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[F[a+48>>2]+64>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+84|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[F[a+48>>2]+64>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+96|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}e=0;c=F[b+8>>2];f=F[b+12>>2];d=c;c=F[b+20>>2];i=c;g=F[b+16>>2];j=g+4|0;c=j>>>0<4?c+1|0:c;if(d>>>0>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break a}m=F[b>>2];k=m+g|0;l=G[k|0]|G[k+1|0]<<8|(G[k+2|0]<<16|G[k+3|0]<<24);F[b+16>>2]=j;F[b+20>>2]=c;k=d;d=f;c=i;f=g+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>k>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break a}d=j+m|0;d=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=f;F[b+20>>2]=c;if((d|0)<(l|0)){break a}F[a+16>>2]=d;F[a+12>>2]=l;c=(d>>31)-((l>>31)+(d>>>0>>0)|0)|0;b=d-l|0;if(!c&b>>>0>2147483646|c){break a}e=1;b=b+1|0;F[a+20>>2]=b;c=b>>>1|0;F[a+24>>2]=c;F[a+28>>2]=0-c;if(b&1){break a}F[a+24>>2]=c-1;break a}}e=0}Z=h+32|0;return e|0}function ai(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Z-32|0;Z=h;a:{b:{if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[a+48>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}c:{if(d){Na(a+60|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[a+48>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+72|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[a+48>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+84|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}if(!Oa(1,h+28|0,b)){break b}d=F[h+28>>2];c=F[a+48>>2];if(d>>>0>F[c+4>>2]-F[c>>2]>>2>>>0){break b}if(d){e=0;Na(a+96|0,d);c=h+8|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;if(!Aa(c,b)){break c}while(1){f=1<>2]+(e>>>3&536870908)|0;if(j){i=f|F[g>>2]}else{i=F[g>>2]&(f^-1)}F[g>>2]=i;e=e+1|0;if((d|0)!=(e|0)){continue}break}}e=0;c=F[b+8>>2];f=F[b+12>>2];d=c;c=F[b+20>>2];i=c;g=F[b+16>>2];j=g+4|0;c=j>>>0<4?c+1|0:c;if(d>>>0>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break a}m=F[b>>2];k=m+g|0;l=G[k|0]|G[k+1|0]<<8|(G[k+2|0]<<16|G[k+3|0]<<24);F[b+16>>2]=j;F[b+20>>2]=c;k=d;d=f;c=i;f=g+8|0;c=f>>>0<8?c+1|0:c;if(f>>>0>k>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){break a}d=j+m|0;d=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=f;F[b+20>>2]=c;if((d|0)<(l|0)){break a}F[a+16>>2]=d;F[a+12>>2]=l;c=(d>>31)-((l>>31)+(d>>>0>>0)|0)|0;b=d-l|0;if(!c&b>>>0>2147483646|c){break a}e=1;b=b+1|0;F[a+20>>2]=b;c=b>>>1|0;F[a+24>>2]=c;F[a+28>>2]=0-c;if(b&1){break a}F[a+24>>2]=c-1;break a}}e=0}Z=h+32|0;return e|0}function uh(a){a=a|0;var b=0,c=0,d=0,e=0;c=F[a+32>>2];d=F[c+16>>2];e=F[c+12>>2];b=F[c+20>>2];if(I[c+8>>2]>d>>>0&(e|0)>=(b|0)|(b|0)<(e|0)){e=G[F[c>>2]+d|0];d=d+1|0;b=d?b:b+1|0;F[c+16>>2]=d;F[c+20>>2]=b;b=F[a+48>>2];F[a+48>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}a:{b:{c:{d:{switch(e|0){case 0:b=ka(384);F[b>>2]=8284;ma(b+4|0,0,80);F[b+96>>2]=0;F[b+100>>2]=0;F[b+92>>2]=-1;F[b+84>>2]=-1;F[b+88>>2]=-1;F[b+104>>2]=0;F[b+108>>2]=0;F[b+112>>2]=0;F[b+116>>2]=0;F[b+120>>2]=0;F[b+124>>2]=0;F[b+128>>2]=0;F[b+132>>2]=0;F[b+136>>2]=0;F[b+140>>2]=0;F[b+144>>2]=0;F[b+148>>2]=0;F[b+156>>2]=0;F[b+160>>2]=0;F[b+152>>2]=1065353216;F[b+164>>2]=0;F[b+168>>2]=0;F[b+172>>2]=0;F[b+176>>2]=0;F[b+180>>2]=0;F[b+184>>2]=0;F[b+188>>2]=0;F[b+192>>2]=0;F[b+196>>2]=0;F[b+200>>2]=0;F[b+204>>2]=0;F[b+208>>2]=0;F[b+212>>2]=-1;F[b+216>>2]=0;F[b+220>>2]=0;F[b+224>>2]=0;Ja(b+232|0);Ja(b+272|0);c=b+312|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;Ja(b+328|0);F[b+376>>2]=0;F[b+368>>2]=0;F[b+372>>2]=0;break c;case 2:break d;default:break b}}b=ka(440);F[b>>2]=8336;ma(b+4|0,0,80);F[b+96>>2]=0;F[b+100>>2]=0;F[b+92>>2]=-1;F[b+84>>2]=-1;F[b+88>>2]=-1;F[b+104>>2]=0;F[b+108>>2]=0;F[b+112>>2]=0;F[b+116>>2]=0;F[b+120>>2]=0;F[b+124>>2]=0;F[b+128>>2]=0;F[b+132>>2]=0;F[b+136>>2]=0;F[b+140>>2]=0;F[b+144>>2]=0;F[b+148>>2]=0;F[b+156>>2]=0;F[b+160>>2]=0;F[b+152>>2]=1065353216;F[b+164>>2]=0;F[b+168>>2]=0;F[b+172>>2]=0;F[b+176>>2]=0;F[b+180>>2]=0;F[b+184>>2]=0;F[b+188>>2]=0;F[b+192>>2]=0;F[b+196>>2]=0;F[b+200>>2]=0;F[b+204>>2]=0;F[b+208>>2]=0;F[b+212>>2]=-1;F[b+216>>2]=0;F[b+220>>2]=0;F[b+224>>2]=0;Ja(b+232|0);Ja(b+272|0);c=b+312|0;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;Ja(b+328|0);F[b+392>>2]=0;F[b+396>>2]=0;F[b+384>>2]=0;F[b+388>>2]=0;F[b+376>>2]=0;F[b+380>>2]=0;F[b+368>>2]=0;F[b+372>>2]=0;F[b+416>>2]=0;F[b+420>>2]=0;F[b+408>>2]=2;F[b+412>>2]=7;F[b+400>>2]=-1;F[b+404>>2]=-1;F[b+424>>2]=0;F[b+428>>2]=0;F[b+432>>2]=0;F[b+436>>2]=0}c=F[a+48>>2];F[a+48>>2]=b;if(!c){break a}$[F[F[c>>2]+4>>2]](c)}b=F[a+48>>2];if(b){break a}return 0}a=$[F[F[b>>2]+8>>2]](b,a)|0}else{a=0}return a|0}function ei(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=Z-32|0;Z=g;F[a+68>>2]=f;d=F[a+56>>2];e=F[d>>2];d=F[d+4>>2];F[g+24>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+60|0;d=d>>>2|0;n=d>>>0<=1?1:d;o=a+112|0;while(1){e=F[a+56>>2];d=F[e>>2];if(F[e+4>>2]-d>>2>>>0<=j>>>0){break a}Mb(m,F[d+(j<<2)>>2],g+16|0);i=F[g+20>>2];d=i>>31;h=F[g+16>>2];e=h>>31;f=(d^i)-d+((e^h)-e)|0;k=F[g+24>>2];d=k>>31;e=(d^k)-d|0;d=0;l=e;e=e+f|0;d=l>>>0>e>>>0?1:d;b:{if(!(d|e)){F[g+16>>2]=F[a+108>>2];break b}f=F[a+108>>2];l=f>>31;h=li(ki(f,l,h,h>>31),_,e,d);F[g+16>>2]=h;d=li(ki(f,l,i,i>>31),_,e,d);F[g+20>>2]=d;e=d;d=d>>31;e=(e^d)-d|0;d=h>>31;d=e+((d^h)-d|0)|0;if((k|0)>=0){F[g+24>>2]=f-d;break b}F[g+24>>2]=d-f}d=wa(o);f=F[g+16>>2];c:{if(d){F[g+24>>2]=0-F[g+24>>2];e=0-F[g+20>>2]|0;F[g+20>>2]=e;f=0-f|0;F[g+16>>2]=f;break c}e=F[g+20>>2]}d:{if((f|0)>=0){f=F[a+108>>2];d=f+F[g+24>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=F[g+24>>2];f=d>>31;f=(d^f)-f|0;break e}d=F[g+24>>2];f=d>>31;f=F[a+100>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=F[a+100>>2]+(d-(d^e)|0)|0}e=F[a+100>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}i=F[a+108>>2];if((i|0)>=(d|0)){break g}d=(i<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}i=F[a+108>>2];if((i|0)<=(d|0)){break h}d=(i<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=F[a+108>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=F[a+108>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}F[g+12>>2]=d;F[g+8>>2]=f;j:{if(F[a+8>>2]<=0){break j}i=F[a+32>>2];f=0;while(1){d=f<<2;e=F[d+(g+8|0)>>2];h=F[a+16>>2];k:{if((e|0)>(h|0)){F[d+i>>2]=h;break k}d=d+i|0;h=F[a+12>>2];if((h|0)>(e|0)){F[d>>2]=h;break k}F[d>>2]=e}f=f+1|0;e=F[a+8>>2];if((f|0)<(e|0)){continue}break}d=0;if((e|0)<=0){break j}e=j<<3;h=e+c|0;k=b+e|0;while(1){f=d<<2;e=f+h|0;f=F[f+k>>2]+F[f+i>>2]|0;F[e>>2]=f;l:{if((f|0)>F[a+16>>2]){f=f-F[a+20>>2]|0}else{if((f|0)>=F[a+12>>2]){break l}f=f+F[a+20>>2]|0}F[e>>2]=f}d=d+1|0;if((d|0)>2]){continue}break}}j=j+1|0;if((n|0)!=(j|0)){continue}break}}Z=g+32|0;return 1}ta();v()}function Vh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=Z-32|0;Z=g;F[a+68>>2]=f;d=F[a+56>>2];e=F[d>>2];d=F[d+4>>2];F[g+24>>2]=0;F[g+16>>2]=0;F[g+20>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+60|0;d=d>>>2|0;n=d>>>0<=1?1:d;o=a+112|0;while(1){e=F[a+56>>2];d=F[e>>2];if(F[e+4>>2]-d>>2>>>0<=j>>>0){break a}Kb(m,F[d+(j<<2)>>2],g+16|0);i=F[g+20>>2];d=i>>31;h=F[g+16>>2];e=h>>31;f=(d^i)-d+((e^h)-e)|0;k=F[g+24>>2];d=k>>31;e=(d^k)-d|0;d=0;l=e;e=e+f|0;d=l>>>0>e>>>0?1:d;b:{if(!(d|e)){F[g+16>>2]=F[a+108>>2];break b}f=F[a+108>>2];l=f>>31;h=li(ki(f,l,h,h>>31),_,e,d);F[g+16>>2]=h;d=li(ki(f,l,i,i>>31),_,e,d);F[g+20>>2]=d;e=d;d=d>>31;e=(e^d)-d|0;d=h>>31;d=e+((d^h)-d|0)|0;if((k|0)>=0){F[g+24>>2]=f-d;break b}F[g+24>>2]=d-f}d=wa(o);f=F[g+16>>2];c:{if(d){F[g+24>>2]=0-F[g+24>>2];e=0-F[g+20>>2]|0;F[g+20>>2]=e;f=0-f|0;F[g+16>>2]=f;break c}e=F[g+20>>2]}d:{if((f|0)>=0){f=F[a+108>>2];d=f+F[g+24>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=F[g+24>>2];f=d>>31;f=(d^f)-f|0;break e}d=F[g+24>>2];f=d>>31;f=F[a+100>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=F[a+100>>2]+(d-(d^e)|0)|0}e=F[a+100>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}i=F[a+108>>2];if((i|0)>=(d|0)){break g}d=(i<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}i=F[a+108>>2];if((i|0)<=(d|0)){break h}d=(i<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=F[a+108>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=F[a+108>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}F[g+12>>2]=d;F[g+8>>2]=f;j:{if(F[a+8>>2]<=0){break j}i=F[a+32>>2];f=0;while(1){d=f<<2;e=F[d+(g+8|0)>>2];h=F[a+16>>2];k:{if((e|0)>(h|0)){F[d+i>>2]=h;break k}d=d+i|0;h=F[a+12>>2];if((h|0)>(e|0)){F[d>>2]=h;break k}F[d>>2]=e}f=f+1|0;e=F[a+8>>2];if((f|0)<(e|0)){continue}break}d=0;if((e|0)<=0){break j}e=j<<3;h=e+c|0;k=b+e|0;while(1){f=d<<2;e=f+h|0;f=F[f+k>>2]+F[f+i>>2]|0;F[e>>2]=f;l:{if((f|0)>F[a+16>>2]){f=f-F[a+20>>2]|0}else{if((f|0)>=F[a+12>>2]){break l}f=f+F[a+20>>2]|0}F[e>>2]=f}d=d+1|0;if((d|0)>2]){continue}break}}j=j+1|0;if((n|0)!=(j|0)){continue}break}}Z=g+32|0;return 1}ta();v()}function $a(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Z-32|0;Z=h;a:{b:{if(F[a+8>>2]<<5>>>0>=b>>>0){break b}if((b|0)<0){break a}b=(b-1>>>5|0)+1|0;c=ka(b<<2);F[h+24>>2]=b;F[h+20>>2]=0;F[h+16>>2]=c;b=F[a>>2];F[h+12>>2]=0;F[h+8>>2]=b;c=F[a+4>>2];F[h+4>>2]=c&31;F[h>>2]=b+(c>>>3&536870908);e=Z-32|0;Z=e;i=F[h+4>>2];g=F[h+12>>2];j=F[h>>2];d=F[h+8>>2];b=(i-g|0)+(j-d<<3)|0;f=F[h+20>>2];c=b+f|0;F[h+20>>2]=c;if(!((c-1^f-1)>>>0<32?f:0)){F[F[h+16>>2]+((c>>>0>=33?c-1>>>5|0:0)<<2)>>2]=0}c=F[h+16>>2]+(f>>>3&536870908)|0;f=f&31;c:{if((f|0)==(g|0)){if((b|0)<=0){break c}if(g){i=32-g|0;f=(b|0)<(i|0)?b:i;i=-1<>>i-f;F[c>>2]=F[c>>2]&(i^-1)|i&F[d>>2];d=d+4|0;c=(g+f>>>3&536870908)+c|0;b=b-f|0}g=(b|0)/32|0;if(b+31>>>0>=63){pa(c,d,g<<2)}b=b-(g<<5)|0;if((b|0)<=0){break c}f=c;c=g<<2;g=f+c|0;b=-1>>>32-b|0;F[g>>2]=F[g>>2]&(b^-1)|b&F[c+d>>2];break c}F[e+28>>2]=g;F[e+24>>2]=d;F[e+20>>2]=i;F[e+16>>2]=j;F[e+12>>2]=f;F[e+8>>2]=c;b=F[e+28>>2];c=F[e+24>>2];g=(F[e+20>>2]-b|0)+(F[e+16>>2]-c<<3)|0;d:{if((g|0)<=0){b=F[e+12>>2];d=F[e+8>>2];break d}e:{if(!b){b=F[e+12>>2];break e}d=F[e+12>>2];j=32-d|0;k=32-b|0;f=(g|0)<(k|0)?g:k;i=f>>>0>j>>>0?j:f;l=F[e+8>>2];m=F[l>>2]&(-1<>>j-i^-1);j=F[c>>2]&(-1<>>k-f);F[l>>2]=m|(b>>>0>>0?j<>>b-d|0);c=d+i|0;b=c&31;F[e+12>>2]=b;d=l+(c>>>3&536870908)|0;F[e+8>>2]=d;c=f-i|0;if((c|0)>0){F[d>>2]=F[d>>2]&(-1>>>32-c^-1)|j>>>i+F[e+28>>2];F[e+12>>2]=c;b=c}g=g-f|0;c=F[e+24>>2]+4|0;F[e+24>>2]=c}i=-1<=32){j=i^-1;while(1){d=F[e+8>>2];c=F[c>>2];F[d>>2]=j&F[d>>2]|c<>2]=d+4;F[d+4>>2]=i&F[d+4>>2]|c>>>f;c=F[e+24>>2]+4|0;F[e+24>>2]=c;d=g>>>0>63;g=g-32|0;if(d){continue}break}}d=F[e+8>>2];if((g|0)<=0){break d}j=f;f=(g|0)>(f|0)?f:g;j=F[d>>2]&(i&-1>>>j-f^-1);i=F[c>>2]&-1>>>32-g;F[d>>2]=j|i<>2]=c;d=(b>>>3&536870908)+d|0;F[e+8>>2]=d;b=g-f|0;if((b|0)<=0){b=c;break d}F[d>>2]=F[d>>2]&(-1>>>32-b^-1)|i>>>f;F[e+12>>2]=b}F[e+4>>2]=b;F[e>>2]=d}Z=e+32|0;b=F[a>>2];F[a>>2]=F[h+16>>2];F[h+16>>2]=b;c=F[a+4>>2];F[a+4>>2]=F[h+20>>2];F[h+20>>2]=c;c=F[a+8>>2];F[a+8>>2]=F[h+24>>2];F[h+24>>2]=c;if(!b){break b}ja(b)}Z=h+32|0;return}na();v()}function xc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;n=$[F[F[a>>2]+44>>2]](a)|0;a:{if((n|0)<=0){break a}i=F[b+4>>2]-F[b>>2]>>2;e=Z+-64|0;Z=e;f=kb(e);d=L(F[2541],n);cc(f,F[F[a+8>>2]+56>>2],n&255,5,0,d,d>>31);f=bc(ka(96),f);D[f+84|0]=1;F[f+72>>2]=F[f+68>>2];ac(f,i);F[f+60>>2]=F[F[a+8>>2]+60>>2];d=F[a+16>>2];F[a+16>>2]=f;if(d){xa(d)}Z=e- -64|0;h=F[a+16>>2];if(!F[h+80>>2]){break a}j=F[F[h>>2]>>2];if(!j){break a}m=F[c+12>>2];e=m;d=F[c+20>>2];g=F[c+8>>2];k=F[c+16>>2];if((e|0)<=(d|0)&g>>>0<=k>>>0|(d|0)>(e|0)){break a}l=L(i,n);i=j+F[h+48>>2]|0;h=F[c>>2];j=G[h+k|0];e=k+1|0;f=e?d:d+1|0;F[c+16>>2]=e;F[c+20>>2]=f;b:{c:{if(j){if(mc(l,n,c,i)){break c}break a}if((f|0)>=(m|0)&e>>>0>=g>>>0|(f|0)>(m|0)){break a}g=G[e+h|0];f=k+2|0;d=f>>>0<2?d+1|0:d;F[c+16>>2]=f;F[c+20>>2]=d;d=F[F[a+16>>2]+64>>2];d=F[d+4>>2]-F[d>>2]|0;if((g|0)==F[2541]){e=l<<2;if(e>>>0>d>>>0){break a}g=F[c+8>>2];k=F[c+12>>2];j=F[c+20>>2];d=F[c+16>>2];f=e+d|0;j=f>>>0>>0?j+1|0:j;if(f>>>0>g>>>0&(j|0)>=(k|0)|(j|0)>(k|0)){break a}la(i,d+F[c>>2]|0,e);f=F[c+20>>2];d=e+F[c+16>>2]|0;f=d>>>0>>0?f+1|0:f;F[c+16>>2]=d;F[c+20>>2]=f;break c}if(d>>>0>>0){break a}d=F[c+8>>2];f=F[c+16>>2];e=d-f|0;m=d>>>0>>0;d=F[c+20>>2];k=F[c+12>>2]-(m+d|0)|0;m=ki(g,0,l,0)>>>0>e>>>0;e=_;if(m&(e|0)>=(k|0)|(e|0)>(k|0)){break a}e=1;if(!l){break b}h=0;while(1){k=F[c+8>>2];j=F[c+12>>2];e=f+g|0;d=e>>>0>>0?d+1|0:d;if(e>>>0>k>>>0&(d|0)>=(j|0)|(d|0)>(j|0)){return 0}la(i+(h<<2)|0,F[c>>2]+f|0,g);d=F[c+20>>2];f=g+F[c+16>>2]|0;d=f>>>0>>0?d+1|0:d;F[c+16>>2]=f;F[c+20>>2]=d;h=h+1|0;if((l|0)!=(h|0)){continue}break}}e=1;if(!l){break b}d=F[a+20>>2];if(d){e=0;if($[F[F[d>>2]+32>>2]](d)|0){break b}}g=0;h=0;d:{if((l|0)<=0){break d}if((l|0)!=1){f=l&-2;while(1){e=g<<2;d=F[e+i>>2];F[e+i>>2]=0-(d&1)^d>>>1;d=e|4;e=F[d+i>>2];F[d+i>>2]=0-(e&1)^e>>>1;g=g+2|0;h=h+2|0;if((f|0)!=(h|0)){continue}break}}if(!(l&1)){break d}d=g<<2;f=F[d+i>>2];F[d+i>>2]=0-(f&1)^f>>>1}e=0}d=e;f=F[a+20>>2];e:{if(!f){break e}if(!($[F[F[f>>2]+40>>2]](f,c)|0)){break a}if(d){break e}a=F[a+20>>2];if(!($[F[F[a>>2]+44>>2]](a,i,i,l,n,F[b>>2])|0)){break a}}o=1}return o|0}function Lh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=Z-48|0;Z=g;d=F[a+8>>2];if(d-2>>>0<=28){F[a+76>>2]=d;e=-1<>2]=d;F[a+80>>2]=e^-1;F[a+92>>2]=(d|0)/2;J[a+88>>2]=M(2)/M(d|0)}F[a+52>>2]=f;d=F[a+40>>2];e=F[d>>2];d=F[d+4>>2];F[g+16>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=F[a+40>>2];d=F[e>>2];if(F[e+4>>2]-d>>2>>>0<=j>>>0){break a}Mb(n,F[d+(j<<2)>>2],g+8|0);h=F[g+12>>2];d=h>>31;i=F[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=F[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){F[g+8>>2]=F[a+92>>2];break b}f=F[a+92>>2];k=f>>31;i=li(ki(f,k,i,i>>31),_,e,d);F[g+8>>2]=i;d=li(ki(f,k,h,h>>31),_,e,d);F[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){F[g+16>>2]=f-d;break b}F[g+16>>2]=d-f}d=wa(p);f=F[g+8>>2];c:{if(d){F[g+16>>2]=0-F[g+16>>2];e=0-F[g+12>>2]|0;F[g+12>>2]=e;f=0-f|0;F[g+8>>2]=f;break c}e=F[g+12>>2]}d:{if((f|0)>=0){f=F[a+92>>2];d=f+F[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=F[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=F[g+16>>2];f=d>>31;f=F[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=F[a+84>>2]+(d-(d^e)|0)|0}e=F[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=F[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=F[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=F[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=F[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=F[h>>2];h=F[h+4>>2];F[g+36>>2]=d;F[g+32>>2]=f;F[g+24>>2]=i;F[g+28>>2]=h;Jb(g+40|0,m,g+32|0,g+24|0);d=c+e|0;F[d>>2]=F[g+40>>2];F[d+4>>2]=F[g+44>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}Z=g+48|0;return 1}ta();v()}function Hh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=Z-48|0;Z=g;d=F[a+8>>2];if(d-2>>>0<=28){F[a+76>>2]=d;e=-1<>2]=d;F[a+80>>2]=e^-1;F[a+92>>2]=(d|0)/2;J[a+88>>2]=M(2)/M(d|0)}F[a+52>>2]=f;d=F[a+40>>2];e=F[d>>2];d=F[d+4>>2];F[g+16>>2]=0;F[g+8>>2]=0;F[g+12>>2]=0;a:{d=d-e|0;if((d|0)>0){m=a+8|0;n=a+44|0;d=d>>>2|0;o=d>>>0<=1?1:d;p=a+96|0;while(1){e=F[a+40>>2];d=F[e>>2];if(F[e+4>>2]-d>>2>>>0<=j>>>0){break a}Kb(n,F[d+(j<<2)>>2],g+8|0);h=F[g+12>>2];d=h>>31;i=F[g+8>>2];e=i>>31;f=(d^h)-d+((e^i)-e)|0;l=F[g+16>>2];d=l>>31;e=(d^l)-d|0;d=0;k=e;e=e+f|0;d=k>>>0>e>>>0?1:d;b:{if(!(d|e)){F[g+8>>2]=F[a+92>>2];break b}f=F[a+92>>2];k=f>>31;i=li(ki(f,k,i,i>>31),_,e,d);F[g+8>>2]=i;d=li(ki(f,k,h,h>>31),_,e,d);F[g+12>>2]=d;e=d>>31;e=(d^e)-e|0;d=i>>31;d=e+((d^i)-d|0)|0;if((l|0)>=0){F[g+16>>2]=f-d;break b}F[g+16>>2]=d-f}d=wa(p);f=F[g+8>>2];c:{if(d){F[g+16>>2]=0-F[g+16>>2];e=0-F[g+12>>2]|0;F[g+12>>2]=e;f=0-f|0;F[g+8>>2]=f;break c}e=F[g+12>>2]}d:{if((f|0)>=0){f=F[a+92>>2];d=f+F[g+16>>2]|0;f=e+f|0;break d}e:{if((e|0)<0){d=F[g+16>>2];f=d>>31;f=(d^f)-f|0;break e}d=F[g+16>>2];f=d>>31;f=F[a+84>>2]+(f-(d^f)|0)|0}if((d|0)<0){d=e>>31;d=(d^e)-d|0;break d}d=e>>31;d=F[a+84>>2]+(d-(d^e)|0)|0}e=F[a+84>>2];f:{if(!(d|f)){d=e;f=d;break f}if(!((d|0)!=(e|0)|f)){f=d;break f}if(!((e|0)!=(f|0)|d)){d=f;break f}g:{if(f){break g}h=F[a+92>>2];if((h|0)>=(d|0)){break g}d=(h<<1)-d|0;f=0;break f}h:{if((e|0)!=(f|0)){break h}h=F[a+92>>2];if((h|0)<=(d|0)){break h}d=(h<<1)-d|0;break f}i:{if((d|0)!=(e|0)){break i}e=F[a+92>>2];if((e|0)<=(f|0)){break i}f=(e<<1)-f|0;break f}if(d){break f}d=0;e=F[a+92>>2];if((e|0)>=(f|0)){break f}f=(e<<1)-f|0}e=j<<3;h=e+b|0;i=F[h>>2];h=F[h+4>>2];F[g+36>>2]=d;F[g+32>>2]=f;F[g+24>>2]=i;F[g+28>>2]=h;Jb(g+40|0,m,g+32|0,g+24|0);d=c+e|0;F[d>>2]=F[g+40>>2];F[d+4>>2]=F[g+44>>2];j=j+1|0;if((o|0)!=(j|0)){continue}break}}Z=g+48|0;return 1}ta();v()}function Nd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{if(!H[b+38>>1]){break a}if(!Ta(1,a+12|0,b)){break a}d=F[b+8>>2];e=F[b+16>>2];g=d-e|0;f=F[a+12>>2];d=F[b+12>>2]-(F[b+20>>2]+(d>>>0>>0)|0)|0;if(g>>>0>>6>>>0&(d|0)<=0|(d|0)<0){break a}d=F[a>>2];c=F[a+4>>2]-d>>2;b:{if(c>>>0>>0){qa(a,f-c|0);f=F[a+12>>2];break b}if(c>>>0<=f>>>0){break b}F[a+4>>2]=d+(f<<2)}if(!f){return 1}d=F[b+16>>2];c=F[b+20>>2];l=F[a>>2];j=F[b+8>>2];i=F[b+12>>2];g=0;while(1){if((c|0)>=(i|0)&d>>>0>=j>>>0|(c|0)>(i|0)){return 0}m=F[b>>2];k=G[m+d|0];d=d+1|0;c=d?c:c+1|0;F[b+16>>2]=d;F[b+20>>2]=c;e=k>>>2|0;h=0;c:{d:{e:{f:{n=k&3;switch(n|0){case 3:break f;case 0:break d;default:break e}}e=e+g|0;if(e>>>0>=f>>>0){return 0}ma(l+(g<<2)|0,0,(k&252)+4|0);g=e;break c}while(1){if((d|0)==(j|0)&(c|0)==(i|0)){break a}f=G[d+m|0];d=d+1|0;c=d?c:c+1|0;F[b+16>>2]=d;F[b+20>>2]=c;e=f<<(h<<3|6)|e;h=h+1|0;if((n|0)!=(h|0)){continue}break}}F[l+(g<<2)>>2]=e}f=F[a+12>>2];g=g+1|0;if(f>>>0>g>>>0){continue}break}b=a+16|0;j=F[a>>2];d=F[a+16>>2];c=F[a+20>>2]-d|0;g:{if(c>>>0<=16383){qa(b,4096-(c>>>2|0)|0);break g}if((c|0)==16384){break g}F[a+20>>2]=d+16384}c=a+28|0;g=F[c>>2];d=F[a+32>>2]-g>>3;h:{if(d>>>0>>0){_a(c,f-d|0);g=F[c>>2];break h}if(d>>>0>f>>>0){F[a+32>>2]=(f<<3)+g}if(!f){break a}}d=F[b>>2];b=0;a=0;while(1){c=j+(b<<2)|0;h=F[c>>2];e=a;i=(b<<3)+g|0;F[i+4>>2]=a;F[i>>2]=h;c=F[c>>2];a=c+a|0;if(a>>>0>4096){break a}i:{if(a>>>0<=e>>>0){break i}h=0;i=c&7;if(i){while(1){F[d+(e<<2)>>2]=b;e=e+1|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(c-1>>>0<=6){break i}while(1){c=d+(e<<2)|0;F[c>>2]=b;F[c+28>>2]=b;F[c+24>>2]=b;F[c+20>>2]=b;F[c+16>>2]=b;F[c+12>>2]=b;F[c+8>>2]=b;F[c+4>>2]=b;e=e+8|0;if((e|0)!=(a|0)){continue}break}}b=b+1|0;if((f|0)!=(b|0)){continue}break}o=(a|0)==4096}return o}function qf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=Z-32|0;Z=f;e=f+8|0;c=Z-80|0;Z=c;a=F[b+36>>2];F[c+72>>2]=F[b+32>>2];F[c+76>>2]=a;d=F[b+28>>2];a=c- -64|0;F[a>>2]=F[b+24>>2];F[a+4>>2]=d;a=F[b+20>>2];F[c+56>>2]=F[b+16>>2];F[c+60>>2]=a;a=F[b+12>>2];F[c+48>>2]=F[b+8>>2];F[c+52>>2]=a;a=F[b+4>>2];F[c+40>>2]=F[b>>2];F[c+44>>2]=a;jc(c+8|0,c+40|0,c+24|0);a=F[c+8>>2];a:{if(a){F[e>>2]=a;a=e+4|0;if(D[c+23|0]>=0){b=c+8|4;e=F[b+4>>2];F[a>>2]=F[b>>2];F[a+4>>2]=e;F[a+8>>2]=F[b+8>>2];break a}ra(a,F[c+12>>2],F[c+16>>2]);if(D[c+23|0]>=0){break a}ja(F[c+12>>2]);break a}if(D[c+23|0]<0){ja(F[c+12>>2])}a=G[c+31|0];if(a>>>0>=2){b=ka(32);D[b+26|0]=0;a=G[1475]|G[1476]<<8;D[b+24|0]=a;D[b+25|0]=a>>>8;a=G[1471]|G[1472]<<8|(G[1473]<<16|G[1474]<<24);d=G[1467]|G[1468]<<8|(G[1469]<<16|G[1470]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=a;D[b+21|0]=a>>>8;D[b+22|0]=a>>>16;D[b+23|0]=a>>>24;a=G[1463]|G[1464]<<8|(G[1465]<<16|G[1466]<<24);d=G[1459]|G[1460]<<8|(G[1461]<<16|G[1462]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=a;D[b+13|0]=a>>>8;D[b+14|0]=a>>>16;D[b+15|0]=a>>>24;a=G[1455]|G[1456]<<8|(G[1457]<<16|G[1458]<<24);d=G[1451]|G[1452]<<8|(G[1453]<<16|G[1454]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=a;D[b+5|0]=a>>>8;D[b+6|0]=a>>>16;D[b+7|0]=a>>>24;F[c+8>>2]=-1;a=c+8|4;ra(a,b,26);d=D[c+23|0];F[e>>2]=F[c+8>>2];e=e+4|0;if((d|0)>=0){d=F[a+4>>2];F[e>>2]=F[a>>2];F[e+4>>2]=d;F[e+8>>2]=F[a+8>>2];ja(b);break a}ra(e,F[c+12>>2],F[c+16>>2]);if(D[c+23|0]<0){ja(F[c+12>>2])}ja(b);break a}F[e>>2]=0;F[e+4>>2]=0;F[e+16>>2]=a;F[e+8>>2]=0;F[e+12>>2]=0}Z=c+80|0;a=F[f+24>>2];if(D[f+23|0]<0){ja(F[f+12>>2])}Z=f+32|0;return a|0}function Ph(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=Z-32|0;Z=e;a:{if((c|0)!=3){break a}c=F[a+4>>2];f=F[a+12>>2];F[e+24>>2]=-1;F[e+16>>2]=-1;F[e+20>>2]=1065353216;F[e+8>>2]=-1;F[e+12>>2]=-1;if((b|0)==-2){break a}i=F[F[F[c+4>>2]+8>>2]+(f<<2)>>2];if(($[F[F[c>>2]+8>>2]](c)|0)==1){h=F[F[F[c+4>>2]+8>>2]+(f<<2)>>2];b:{if(($[F[F[c>>2]+8>>2]](c)|0)!=1|b-1>>>0>5){break b}g=$[F[F[c>>2]+36>>2]](c)|0;a=$[F[F[c>>2]+44>>2]](c,f)|0;if(!g|!a){break b}f=$[F[F[c>>2]+40>>2]](c,f)|0;c:{if(f){if((b|0)!=6){break b}b=F[c+44>>2];d=ka(112);F[d+4>>2]=h;c=F[e+12>>2];F[d+8>>2]=F[e+8>>2];F[d+12>>2]=c;c=F[e+20>>2];F[d+16>>2]=F[e+16>>2];F[d+20>>2]=c;F[d+24>>2]=F[e+24>>2];F[d+40>>2]=a;c=a+12|0;F[d+36>>2]=c;F[d+32>>2]=f;F[d+28>>2]=b;F[d+68>>2]=a;F[d- -64>>2]=c;F[d+60>>2]=f;F[d+56>>2]=b;F[d+48>>2]=0;F[d+52>>2]=0;F[d>>2]=5928;F[d+88>>2]=1065353216;F[d+92>>2]=-1;F[d+80>>2]=-1;F[d+84>>2]=-1;F[d+72>>2]=1;F[d+76>>2]=-1;F[d+44>>2]=6492;a=d+96|0;break c}if((b|0)!=6){break b}b=F[c+44>>2];d=ka(112);F[d+4>>2]=h;c=F[e+12>>2];F[d+8>>2]=F[e+8>>2];F[d+12>>2]=c;c=F[e+20>>2];F[d+16>>2]=F[e+16>>2];F[d+20>>2]=c;F[d+24>>2]=F[e+24>>2];F[d+40>>2]=a;c=a+12|0;F[d+36>>2]=c;F[d+32>>2]=g;F[d+28>>2]=b;F[d+68>>2]=a;F[d- -64>>2]=c;F[d+60>>2]=g;F[d+56>>2]=b;F[d+48>>2]=0;F[d+52>>2]=0;F[d>>2]=6932;F[d+88>>2]=1065353216;F[d+92>>2]=-1;F[d+80>>2]=-1;F[d+84>>2]=-1;F[d+72>>2]=1;F[d+76>>2]=-1;F[d+44>>2]=7352;a=d+96|0}F[a>>2]=0;F[a+4>>2]=0;D[a+5|0]=0;D[a+6|0]=0;D[a+7|0]=0;D[a+8|0]=0;D[a+9|0]=0;D[a+10|0]=0;D[a+11|0]=0;D[a+12|0]=0}if(d){break a}}d=ka(28);F[d+4>>2]=i;a=F[e+12>>2];F[d+8>>2]=F[e+8>>2];F[d+12>>2]=a;a=F[e+20>>2];F[d+16>>2]=F[e+16>>2];F[d+20>>2]=a;F[d+24>>2]=F[e+24>>2];F[d>>2]=7764}Z=e+32|0;return d|0}function $c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=Z-80|0;Z=f;a:{if(!Wb(1,f+76|0,b)){break a}k=F[f+76>>2];if(!k){break a}c=F[b+8>>2];e=F[b+16>>2];c=ki(c-e|0,F[b+12>>2]-(F[b+20>>2]+(c>>>0>>0)|0)|0,5,0);e=_;if(c>>>0>>0&(e|0)<=0|(e|0)<0){break a}c=F[a+4>>2];d=F[a+8>>2]-c>>2;b:{if(d>>>0>>0){qa(a+4|0,k-d|0);break b}if(d>>>0<=k>>>0){break b}F[a+8>>2]=c+(k<<2)}p=a+16|0;l=F[a+32>>2];while(1){g=F[b+12>>2];c=g;d=F[b+20>>2];h=F[b+8>>2];e=F[b+16>>2];if((c|0)<=(d|0)&h>>>0<=e>>>0|(c|0)<(d|0)){d=0;break a}m=F[b>>2];q=G[m+e|0];c=d;i=e+1|0;c=i?c:c+1|0;F[b+16>>2]=i;F[b+20>>2]=c;if(h>>>0<=i>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){d=0;break a}i=G[i+m|0];c=d;j=e+2|0;c=j>>>0<2?c+1|0:c;F[b+16>>2]=j;F[b+20>>2]=c;if(h>>>0<=j>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){d=0;break a}j=G[j+m|0];c=d;n=e+3|0;c=n>>>0<3?c+1|0:c;F[b+16>>2]=n;F[b+20>>2]=c;if(h>>>0<=n>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){d=0;break a}h=G[m+n|0];c=d;d=e+4|0;c=d>>>0<4?c+1|0:c;F[b+16>>2]=d;F[b+20>>2]=c;if(q>>>0>4){d=0;break a}if((i-12&255)>>>0<245){d=0;break a}if(!j){d=0;break a}c=kb(f+8|0);g=(h|0)!=0;d=i-1|0;if(d>>>0<=10){d=F[(d<<2)+10148>>2]}else{d=-1}d=L(d,j);cc(c,q,j,i,g,d,d>>31);if(Wb(1,f+4|0,b)){e=F[f+4>>2];F[f+68>>2]=e;d=bc(ka(96),c);$[F[F[l>>2]+8>>2]](l,F[l+12>>2]-F[l+8>>2]>>2,d);d=(F[l+12>>2]-F[l+8>>2]>>2)-1|0;h=d<<2;F[F[h+F[l+8>>2]>>2]+60>>2]=e;F[F[a+4>>2]+(o<<2)>>2]=d;c=F[a+16>>2];e=F[a+20>>2]-c>>2;c:{if((e|0)>(d|0)){break c}F[f>>2]=-1;d=d+1|0;if(d>>>0>e>>>0){Fa(p,d-e|0,f);c=F[p>>2];break c}if(d>>>0>=e>>>0){break c}F[a+20>>2]=(d<<2)+c}F[c+h>>2]=o;d=1;o=o+1|0;if((o|0)!=(k|0)){continue}break a}break}d=0}Z=f+80|0;return d|0}function Oc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=Z-16|0;Z=k;F[k+8>>2]=c;h=F[a+12>>2];d=F[a+8>>2];g=h-d>>2;a:{if((g|0)>(b|0)){break a}e=b+1|0;if(e>>>0>g>>>0){l=e-g|0;f=F[a+16>>2];d=F[a+12>>2];if(l>>>0<=f-d>>2>>>0){if(l){e=d;d=l<<2;d=ma(e,0,d)+d|0}F[a+12>>2]=d;break a}b:{c:{d:{m=F[a+8>>2];g=d-m>>2;i=g+l|0;if(i>>>0<1073741824){e=f-m|0;f=e>>>1|0;e=e>>>0>=2147483644?1073741823:f>>>0>i>>>0?f:i;if(e){if(e>>>0>=1073741824){break d}j=ka(e<<2)}h=(g<<2)+j|0;f=l<<2;i=ma(h,0,f);g=f+i|0;e=(e<<2)+j|0;if((d|0)==(m|0)){break c}while(1){d=d-4|0;f=F[d>>2];F[d>>2]=0;h=h-4|0;F[h>>2]=f;if((d|0)!=(m|0)){continue}break}F[a+16>>2]=e;e=F[a+12>>2];F[a+12>>2]=g;d=F[a+8>>2];F[a+8>>2]=h;if((d|0)==(e|0)){break b}while(1){e=e-4|0;f=F[e>>2];F[e>>2]=0;if(f){xa(f)}if((d|0)!=(e|0)){continue}break}break b}na();v()}oa();v()}F[a+16>>2]=e;F[a+12>>2]=g;F[a+8>>2]=i}if(d){ja(d)}break a}if(e>>>0>=g>>>0){break a}d=d+(e<<2)|0;if((d|0)!=(h|0)){while(1){h=h-4|0;c=F[h>>2];F[h>>2]=0;if(c){xa(c)}if((d|0)!=(h|0)){continue}break}c=F[k+8>>2]}F[a+12>>2]=d}e:{f:{d=F[c+56>>2];g:{if((d|0)>4){break g}j=L(d,12)+a|0;d=F[j+24>>2];if((d|0)!=F[j+28>>2]){F[d>>2]=b;F[j+24>>2]=d+4;break g}i=F[j+20>>2];g=d-i|0;f=g>>2;e=f+1|0;if(e>>>0>=1073741824){break f}d=g>>>1|0;e=g>>>0>=2147483644?1073741823:d>>>0>e>>>0?d:e;if(e){if(e>>>0>=1073741824){break e}d=ka(e<<2)}else{d=0}f=d+(f<<2)|0;F[f>>2]=b;d=pa(d,i,g);F[j+20>>2]=d;F[j+24>>2]=f+4;F[j+28>>2]=d+(e<<2);if(!i){break g}ja(i)}F[c+60>>2]=b;a=F[a+8>>2];F[k+8>>2]=0;a=a+(b<<2)|0;b=F[a>>2];F[a>>2]=c;if(b){xa(b)}a=F[k+8>>2];F[k+8>>2]=0;if(a){xa(a)}Z=k+16|0;return}na();v()}oa();v()}function Pf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=c;d=a;a:{if(F[a+12>>2]==(b|0)){break a}a=b;b=F[d+4>>2];e=F[d>>2];if((b|0)!=(e|0)){while(1){c=b-12|0;if(D[b-1|0]<0){ja(F[c>>2])}b=c;if((e|0)!=(b|0)){continue}break}}F[d+12>>2]=a;F[d+4>>2]=e;c=F[a>>2];j=a+4|0;if((c|0)==(j|0)){break a}while(1){a=F[d+4>>2];b:{if((a|0)!=F[d+8>>2]){c:{if(D[c+27|0]>=0){b=F[c+20>>2];F[a>>2]=F[c+16>>2];F[a+4>>2]=b;F[a+8>>2]=F[c+24>>2];break c}ra(a,F[c+16>>2],F[c+20>>2])}F[d+4>>2]=a+12;break b}g=0;d:{e:{f:{a=F[d+4>>2];e=F[d>>2];f=(a-e|0)/12|0;b=f+1|0;if(b>>>0<357913942){h=(F[d+8>>2]-e|0)/12|0;k=h<<1;b=h>>>0>=178956970?357913941:b>>>0>>0?k:b;if(b){if(b>>>0>=357913942){break f}g=ka(L(b,12))}h=L(b,12);b=L(f,12)+g|0;g:{if(D[c+27|0]>=0){f=F[c+20>>2];F[b>>2]=F[c+16>>2];F[b+4>>2]=f;F[b+8>>2]=F[c+24>>2];break g}ra(b,F[c+16>>2],F[c+20>>2]);e=F[d>>2];a=F[d+4>>2]}g=g+h|0;f=b+12|0;if((a|0)==(e|0)){break e}while(1){a=a-12|0;h=F[a+4>>2];b=b-12|0;F[b>>2]=F[a>>2];F[b+4>>2]=h;F[b+8>>2]=F[a+8>>2];F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;if((a|0)!=(e|0)){continue}break}F[d+8>>2]=g;a=F[d+4>>2];F[d+4>>2]=f;e=F[d>>2];F[d>>2]=b;if((a|0)==(e|0)){break d}while(1){b=a-12|0;if(D[a-1|0]<0){ja(F[b>>2])}a=b;if((e|0)!=(b|0)){continue}break}break d}na();v()}oa();v()}F[d+8>>2]=g;F[d+4>>2]=f;F[d>>2]=b}if(e){ja(e)}}b=F[c+4>>2];h:{if(b){while(1){a=b;b=F[b>>2];if(b){continue}break h}}while(1){a=F[c+8>>2];b=F[a>>2]!=(c|0);c=a;if(b){continue}break}}c=a;if((j|0)!=(a|0)){continue}break}}a=0;i:{if((i|0)<0){break i}b=F[d>>2];if((F[d+4>>2]-b|0)/12>>>0<=i>>>0){break i}a=b+L(i,12)|0;a=D[a+11|0]<0?F[a>>2]:a}return a|0}function Ad(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=Z-16|0;Z=i;F[i>>2]=b;f=-1;a:{if((b|0)==-1){F[i+4>>2]=-1;break a}f=b+1|0;F[i+4>>2]=(f>>>0)%3|0?f:b-2|0;if((b>>>0)%3|0){f=b-1|0;break a}f=b+2|0}F[i+8>>2]=f;n=(b>>>0)/3|0;b:{c:{d:{while(1){e:{f:{j=F[(l<<2)+i>>2];if((j|0)!=-1){f=F[F[F[a+8>>2]+12>>2]+(j<<2)>>2];if((f|0)!=-1){break f}}f=0;g=F[a+216>>2];if((g|0)==F[a+220>>2]){break e}while(1){g=L(f,144)+g|0;d=F[g+136>>2];c=F[g+140>>2];g:{if(d>>>0>>0){F[d>>2]=j;F[g+136>>2]=d+4;break g}e=d;d=F[g+132>>2];k=e-d|0;e=k>>2;h=e+1|0;if(h>>>0>=1073741824){break d}m=e<<2;c=c-d|0;e=c>>>1|0;h=c>>>0>=2147483644?1073741823:h>>>0>>0?e:h;if(h){if(h>>>0>=1073741824){break c}c=ka(h<<2)}else{c=0}e=m+c|0;F[e>>2]=j;c=pa(c,d,k);F[g+132>>2]=c;F[g+136>>2]=e+4;F[g+140>>2]=c+(h<<2);if(!d){break g}ja(d)}f=f+1|0;g=F[a+216>>2];if(f>>>0<(F[a+220>>2]-g|0)/144>>>0){continue}break}break e}if((b|0)==-1|(f>>>0)/3>>>0>>0){break e}f=0;if(F[a+220>>2]==F[a+216>>2]){break e}while(1){h:{if(!wa(F[a+368>>2]+(f<<4)|0)){break h}g=F[a+216>>2]+L(f,144)|0;d=F[g+136>>2];c=F[g+140>>2];if(d>>>0>>0){F[d>>2]=j;F[g+136>>2]=d+4;break h}e=d;d=F[g+132>>2];k=e-d|0;e=k>>2;h=e+1|0;if(h>>>0>=1073741824){break b}m=e<<2;c=c-d|0;e=c>>>1|0;h=c>>>0>=2147483644?1073741823:h>>>0>>0?e:h;if(h){if(h>>>0>=1073741824){break c}c=ka(h<<2)}else{c=0}e=m+c|0;F[e>>2]=j;c=pa(c,d,k);F[g+132>>2]=c;F[g+136>>2]=e+4;F[g+140>>2]=c+(h<<2);if(!d){break h}ja(d)}f=f+1|0;if(f>>>0<(F[a+220>>2]-F[a+216>>2]|0)/144>>>0){continue}break}}l=l+1|0;if((l|0)!=3){continue}break}Z=i+16|0;return 1}na();v()}oa();v()}na();v()}function Bd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Z-16|0;Z=h;m=-1;a:{b:{c:{if(!Da(1,h+12|0,b)){break c}j=F[h+12>>2];if(j){c=F[a+8>>2];if((F[c+4>>2]-F[c>>2]>>2>>>0)/3>>>0>>0){break c}while(1){if(!Da(1,h+8|0,b)){break c}c=F[h+8>>2];if(!Da(1,h+8|0,b)){break c}g=c+g|0;c=F[h+8>>2];if(g>>>0>>0){break c}e=g-c|0;c=F[a+40>>2];d:{if((c|0)!=F[a+44>>2]){F[c+4>>2]=g;F[c>>2]=e;F[a+40>>2]=c+12;j=F[h+12>>2];break d}d=c;c=F[a+36>>2];l=d-c|0;d=(l|0)/12|0;f=d+1|0;if(f>>>0>=357913942){break b}i=d<<1;f=d>>>0>=178956970?357913941:f>>>0>>0?i:f;if(f){if(f>>>0>=357913942){break a}i=ka(L(f,12))}else{i=0}d=i+L(d,12)|0;F[d+4>>2]=g;F[d>>2]=e;e=pa(d+L((l|0)/-12|0,12)|0,c,l);F[a+44>>2]=i+L(f,12);F[a+40>>2]=d+12;F[a+36>>2]=e;if(!c){break d}ja(c)}k=k+1|0;if(k>>>0>>0){continue}break}g=0;hc(b,0,0);if(j){while(1){c=G[b+36|0];d=H[F[a+4>>2]+36>>1];e:{f:{if(((d<<8|d>>>8)&65535)>>>0<=513){if(!c){break e}e=0;d=F[b+32>>2];k=d>>>3|0;f=F[b+24>>2];c=k+f|0;i=F[b+28>>2];g:{if(c>>>0>=i>>>0){c=d;break g}e=G[c|0];c=d+1|0;F[b+32>>2]=c;k=c>>>3|0;e=e>>>(d&7)&1}if(i>>>0>f+k>>>0){break f}break e}if(!c){break e}e=0;c=F[b+32>>2];d=F[b+24>>2]+(c>>>3|0)|0;if(d>>>0>=I[b+28>>2]){break e}e=G[d|0]>>>(c&7)&1}F[b+32>>2]=c+1}c=F[a+36>>2]+L(g,12)|0;D[c+8|0]=G[c+8|0]&254|e&1;g=g+1|0;if((j|0)!=(g|0)){continue}break}}D[b+36|0]=0;d=F[b+20>>2];a=0;e=F[b+32>>2]+7|0;a=e>>>0<7?1:a;e=a<<29|e>>>3;c=e+F[b+16>>2]|0;a=(a>>>3|0)+d|0;F[b+16>>2]=c;F[b+20>>2]=c>>>0>>0?a+1|0:a}m=F[b+16>>2]}Z=h+16|0;return m}na();v()}oa();v()}function xf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=Z-16|0;Z=m;l=F[b+80>>2];e=G[c+24|0];a=L(l,e);a:{b:{c:{d:{b=F[c+28>>2];if(!(!G[c+84|0]|(b|0)!=1&(b|0)!=2)){b=F[c+48>>2];c=F[F[c>>2]>>2];F[m+8>>2]=0;F[m>>2]=0;F[m+4>>2]=0;if(a){if((a|0)<0){break d}f=ka(a);h=la(f,b+c|0,a)+a|0}a=F[d>>2];if(a){F[d+4>>2]=a;ja(a)}F[d+8>>2]=h;F[d+4>>2]=h;F[d>>2]=f;b=1;break a}if(e){f=ka(e);ma(f,0,e)}e:{i=F[d+4>>2];b=F[d>>2];g=i-b|0;f:{if(g>>>0>>0){k=a-g|0;j=F[d+8>>2];if(k>>>0<=j-i>>>0){n=d,o=ma(i,0,k)+k|0,F[n+4>>2]=o;break f}if((a|0)<0){break e}i=j-b|0;j=i<<1;i=i>>>0>=1073741823?2147483647:a>>>0>>0?j:a;j=ka(i);ma(j+g|0,0,k);g=pa(j,b,g);F[d+8>>2]=g+i;F[d+4>>2]=a+g;F[d>>2]=g;if(!b){break f}ja(b);break f}if(a>>>0>=g>>>0){break f}F[d+4>>2]=a+b}if(!l){b=1;break c}if(!e){b=0;a=0;while(1){if(!Cb(c,G[c+84|0]?a:F[F[c+68>>2]+(a<<2)>>2],D[c+24|0],f)){break c}a=a+1|0;b=l>>>0<=a>>>0;if((a|0)!=(l|0)){continue}break}break c}i=e&252;g=e&3;b=0;j=e>>>0<4;e=0;while(1){if(!Cb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],f)){break c}b=0;a=0;k=0;if(!j){while(1){D[F[d>>2]+h|0]=G[a+f|0];D[(F[d>>2]+h|0)+1|0]=G[(a|1)+f|0];D[(F[d>>2]+h|0)+2|0]=G[(a|2)+f|0];D[(F[d>>2]+h|0)+3|0]=G[(a|3)+f|0];a=a+4|0;h=h+4|0;k=k+4|0;if((i|0)!=(k|0)){continue}break}}if(g){while(1){D[F[d>>2]+h|0]=G[a+f|0];a=a+1|0;h=h+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}e=e+1|0;b=l>>>0<=e>>>0;if((e|0)!=(l|0)){continue}break}break b}na();v()}na();v()}if(!f){break a}}ja(f)}Z=m+16|0;return b&1}function wf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=Z-16|0;Z=m;l=F[b+80>>2];e=G[c+24|0];a=L(l,e);a:{b:{c:{d:{b=F[c+28>>2];if(!(!G[c+84|0]|(b|0)!=1&(b|0)!=2)){b=F[c+48>>2];c=F[F[c>>2]>>2];F[m+8>>2]=0;F[m>>2]=0;F[m+4>>2]=0;if(a){if((a|0)<0){break d}f=ka(a);h=la(f,b+c|0,a)+a|0}a=F[d>>2];if(a){F[d+4>>2]=a;ja(a)}F[d+8>>2]=h;F[d+4>>2]=h;F[d>>2]=f;b=1;break a}if(e){f=ka(e);ma(f,0,e)}e:{i=F[d+4>>2];b=F[d>>2];g=i-b|0;f:{if(g>>>0>>0){k=a-g|0;j=F[d+8>>2];if(k>>>0<=j-i>>>0){n=d,o=ma(i,0,k)+k|0,F[n+4>>2]=o;break f}if((a|0)<0){break e}i=j-b|0;j=i<<1;i=i>>>0>=1073741823?2147483647:a>>>0>>0?j:a;j=ka(i);ma(j+g|0,0,k);g=pa(j,b,g);F[d+8>>2]=g+i;F[d+4>>2]=a+g;F[d>>2]=g;if(!b){break f}ja(b);break f}if(a>>>0>=g>>>0){break f}F[d+4>>2]=a+b}if(!l){b=1;break c}if(!e){b=0;a=0;while(1){if(!Bb(c,G[c+84|0]?a:F[F[c+68>>2]+(a<<2)>>2],D[c+24|0],f)){break c}a=a+1|0;b=l>>>0<=a>>>0;if((a|0)!=(l|0)){continue}break}break c}i=e&252;g=e&3;b=0;j=e>>>0<4;e=0;while(1){if(!Bb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],f)){break c}b=0;a=0;k=0;if(!j){while(1){D[F[d>>2]+h|0]=G[a+f|0];D[(F[d>>2]+h|0)+1|0]=G[(a|1)+f|0];D[(F[d>>2]+h|0)+2|0]=G[(a|2)+f|0];D[(F[d>>2]+h|0)+3|0]=G[(a|3)+f|0];a=a+4|0;h=h+4|0;k=k+4|0;if((i|0)!=(k|0)){continue}break}}if(g){while(1){D[F[d>>2]+h|0]=G[a+f|0];a=a+1|0;h=h+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}e=e+1|0;b=l>>>0<=e>>>0;if((e|0)!=(l|0)){continue}break}break b}na();v()}na();v()}if(!f){break a}}ja(f)}Z=m+16|0;return b&1}function Jb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=F[b+16>>2];h=F[c+4>>2]-k|0;e=F[c>>2]-k|0;F[c>>2]=e;f=h;F[c+4>>2]=f;l=F[b+16>>2];f=f>>31;g=(h^f)-f|0;f=e>>31;m=l>>>0>=g+((f^e)-f|0)>>>0;a:{if(m){f=h;break a}b:{c:{if((e|0)>=0){g=1;j=1;if((h|0)>=0){break b}i=1;g=-1;j=-1;if(e){break c}break b}i=-1;g=-1;j=-1;if((h|0)<=0){break b}}g=(h|0)<=0?-1:1;j=i}n=L(j,l);f=(e<<1)-n|0;i=(L(g,j)|0)>=0;e=L(g,l);f=((i?0-f|0:f)+e|0)/2|0;F[c+4>>2]=f;e=(h<<1)-e|0;e=((i?0-e|0:e)+n|0)/2|0;F[c>>2]=e}d:{e:{f:{g:{h:{i:{j:{if(e){if((e|0)<0){break j}if((f|0)>=0){break i}break f}if(f){break h}j=1;g=0;f=0;i=0;break d}j=1;if((f|0)>0){break g}i=(f|0)>0?3:0;g=f;f=e;break d}g=0-f|0;f=0-e|0;i=2;break e}if((f|0)<=0){break f}}f=0-f|0;g=e;i=3;break e}g=0-e|0;i=1}F[c>>2]=f;F[c+4>>2]=g;j=0}e=F[d>>2]+f|0;h=F[b+16>>2];k:{if((e|0)>(h|0)){e=e-F[b+4>>2]|0;break k}if((0-h|0)<=(e|0)){break k}e=F[b+4>>2]+e|0}c=F[d+4>>2]+g|0;l:{if((h|0)<(c|0)){c=c-F[b+4>>2]|0;break l}if((0-h|0)<=(c|0)){break l}c=F[b+4>>2]+c|0}m:{if(j){b=c;break m}b=c;n:{o:{p:{d=4-i|0;switch((d>>>0<4?d:0-i|0)-1|0){case 2:break n;case 1:break o;case 0:break p;default:break m}}b=0-e|0;e=c;break m}b=0-c|0;e=0-e|0;break m}b=e;e=0-c|0}q:{if(m){c=b;break q}r:{s:{if((e|0)>=0){c=1;f=1;if((b|0)>=0){break r}d=1;c=-1;f=-1;if(e){break s}break r}d=-1;c=-1;f=-1;if((b|0)<=0){break r}}c=(b|0)<=0?-1:1;f=d}d=e<<1;e=L(f,h);d=d-e|0;f=(L(c,f)|0)>=0;g=f?0-d|0:d;d=L(c,h);c=(g+d|0)/2|0;b=(b<<1)-d|0;e=(e+(f?0-b|0:b)|0)/2|0}b=a;F[b>>2]=e+k;F[b+4>>2]=c+k}function Uh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;F[a+8>>2]=e;m=a+32|0;h=F[m>>2];g=F[a+36>>2]-h>>2;a:{if(g>>>0>>0){qa(m,e-g|0);f=F[a+8>>2];break a}f=e;if(f>>>0>=g>>>0){break a}F[a+36>>2]=h+(e<<2);f=e}g=e>>>0>1073741823?-1:e<<2;n=ma(ka(g),0,g);b:{if((f|0)<=0){break b}h=F[a+32>>2];while(1){f=i<<2;g=F[f+n>>2];j=F[a+16>>2];c:{if((g|0)>(j|0)){F[f+h>>2]=j;break c}f=f+h|0;j=F[a+12>>2];if((j|0)>(g|0)){F[f>>2]=j;break c}F[f>>2]=g}f=F[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}if((f|0)<=0){break b}i=0;while(1){g=i<<2;f=g+c|0;g=F[b+g>>2]+F[g+h>>2]|0;F[f>>2]=g;d:{if((g|0)>F[a+16>>2]){g=g-F[a+20>>2]|0}else{if((g|0)>=F[a+12>>2]){break d}g=g+F[a+20>>2]|0}F[f>>2]=g}f=F[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}}if(!((d|0)<=(e|0)|(f|0)<=0)){p=0-e<<2;g=e;while(1){e:{if((f|0)<=0){break e}l=g<<2;o=l+c|0;q=o+p|0;j=F[m>>2];i=0;while(1){f=i<<2;h=F[f+q>>2];k=F[a+16>>2];f:{if((h|0)>(k|0)){F[f+j>>2]=k;break f}f=f+j|0;k=F[a+12>>2];if((k|0)>(h|0)){F[f>>2]=k;break f}F[f>>2]=h}f=F[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}i=0;if((f|0)<=0){break e}l=b+l|0;while(1){h=i<<2;f=h+o|0;h=F[h+l>>2]+F[h+j>>2]|0;F[f>>2]=h;g:{if((h|0)>F[a+16>>2]){h=h-F[a+20>>2]|0}else{if((h|0)>=F[a+12>>2]){break g}h=h+F[a+20>>2]|0}F[f>>2]=h}f=F[a+8>>2];i=i+1|0;if((f|0)>(i|0)){continue}break}}g=e+g|0;if((g|0)<(d|0)){continue}break}}ja(n);return 1}function yf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=F[b+80>>2];b=G[c+24|0];g=L(j,b);a:{if(!b){break a}h=b<<2;f=ka(h);a=f;k=b&7;if(k){while(1){F[a>>2]=-1073741824;a=a+4|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}}if((b-1&1073741823)>>>0<7){break a}e=f+h|0;while(1){F[a+24>>2]=-1073741824;F[a+28>>2]=-1073741824;F[a+16>>2]=-1073741824;F[a+20>>2]=-1073741824;F[a+8>>2]=-1073741824;F[a+12>>2]=-1073741824;F[a>>2]=-1073741824;F[a+4>>2]=-1073741824;a=a+32|0;if((e|0)!=(a|0)){continue}break}}e=F[d>>2];a=F[d+4>>2]-e>>2;b:{if(a>>>0>>0){qa(d,g-a|0);break b}if(a>>>0<=g>>>0){break b}F[d+4>>2]=e+(g<<2)}c:{d:{e:{if(!j){i=1;break e}if(!b){a=0;while(1){if(!lb(c,G[c+84|0]?a:F[F[c+68>>2]+(a<<2)>>2],D[c+24|0],f)){break e}a=a+1|0;i=j>>>0<=a>>>0;if((a|0)!=(j|0)){continue}break}break e}n=b&252;k=b&3;o=b>>>0<4;e=0;b=0;while(1){if(!lb(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],f)){break e}m=F[d>>2];i=0;a=0;l=0;if(!o){while(1){g=(e<<2)+m|0;h=a<<2;J[g>>2]=J[h+f>>2];J[g+4>>2]=J[(h|4)+f>>2];J[g+8>>2]=J[(h|8)+f>>2];J[g+12>>2]=J[(h|12)+f>>2];a=a+4|0;e=e+4|0;l=l+4|0;if((n|0)!=(l|0)){continue}break}}if(k){while(1){J[(e<<2)+m>>2]=J[(a<<2)+f>>2];a=a+1|0;e=e+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}b=b+1|0;i=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break d}if(!f){break c}}ja(f)}return i|0}function $d(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=Z-16|0;Z=k;c=F[b+20>>2];d=F[b+16>>2];e=d+4|0;c=e>>>0<4?c+1|0:c;g=F[b+12>>2];a:{if(I[b+8>>2]>>0&(g|0)<=(c|0)|(c|0)>(g|0)){break a}d=d+F[b>>2]|0;h=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=e;F[b+20>>2]=c;if((h|0)<0){break a}Na(a+76|0,h);c=k;F[c>>2]=0;F[c+4>>2]=0;D[c+5|0]=0;D[c+6|0]=0;D[c+7|0]=0;D[c+8|0]=0;D[c+9|0]=0;D[c+10|0]=0;D[c+11|0]=0;D[c+12|0]=0;b:{if(!Aa(c,b)){break b}if(h){g=1;while(1){d=1<>2]+(i>>>3&536870908)|0;e=e^g;if(e&1){d=F[f>>2]&(d^-1)}else{d=d|F[f>>2]}g=e^1;F[f>>2]=d;i=i+1|0;if((h|0)!=(i|0)){continue}break}}i=0;c=F[b+8>>2];e=F[b+12>>2];f=e;e=F[b+20>>2];g=e;l=F[b+16>>2];d=l+4|0;e=d>>>0<4?e+1|0:e;h=d;if(d>>>0>c>>>0&(e|0)>=(f|0)|(e|0)>(f|0)){break b}m=F[b>>2];d=m+l|0;j=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=h;F[b+20>>2]=e;d=c;c=g;e=l+8|0;c=e>>>0<8?c+1|0:c;if(d>>>0>>0&(c|0)>=(f|0)|(c|0)>(f|0)){break b}d=h+m|0;d=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);F[b+16>>2]=e;F[b+20>>2]=c;if((d|0)<(j|0)){break b}F[a+16>>2]=d;F[a+12>>2]=j;c=(d>>31)-((j>>31)+(d>>>0>>0)|0)|0;b=d-j|0;if(!c&b>>>0>2147483646|c){break b}i=1;c=b+1|0;F[a+20>>2]=c;b=c>>>1|0;F[a+24>>2]=b;F[a+28>>2]=0-b;if(c&1){break b}F[a+24>>2]=b-1}}Z=k+16|0;return i|0}function tf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=Z-16|0;Z=k;j=F[b+80>>2];e=G[c+24|0];b=L(j,e);a:{b:{c:{d:{f=F[c+28>>2];if(!(!G[c+84|0]|(f|0)!=5&(f|0)!=6)){e=F[c+48>>2];c=F[F[c>>2]>>2];F[k+8>>2]=0;F[k>>2]=0;F[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<2;a=ka(b);g=la(a,c+e|0,b)+b|0}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=a;h=1;break a}if(e){f=e<<2;a=ka(f);ma(a,0,f)}i=F[d>>2];f=F[d+4>>2]-i>>2;e:{if(f>>>0>>0){qa(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}F[d+4>>2]=i+(b<<2)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!xb(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!xb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break c}n=F[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<2)+n|0;i=b<<2;F[f>>2]=F[i+a>>2];F[f+4>>2]=F[(i|4)+a>>2];F[f+8>>2]=F[(i|8)+a>>2];F[f+12>>2]=F[(i|12)+a>>2];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){F[(g<<2)+n>>2]=F[(b<<2)+a>>2];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}na();v()}if(!a){break a}}ja(a)}Z=k+16|0;return h|0}function cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=Z-16|0;Z=k;j=F[b+80>>2];e=G[c+24|0];b=L(j,e);a:{b:{c:{d:{f=F[c+28>>2];if(!(!G[c+84|0]|(f|0)!=5&(f|0)!=6)){e=F[c+48>>2];c=F[F[c>>2]>>2];F[k+8>>2]=0;F[k>>2]=0;F[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<2;a=ka(b);g=la(a,c+e|0,b)+b|0}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=a;h=1;break a}if(e){f=e<<2;a=ka(f);ma(a,0,f)}i=F[d>>2];f=F[d+4>>2]-i>>2;e:{if(f>>>0>>0){qa(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}F[d+4>>2]=i+(b<<2)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!yb(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!yb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break c}n=F[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<2)+n|0;i=b<<2;F[f>>2]=F[i+a>>2];F[f+4>>2]=F[(i|4)+a>>2];F[f+8>>2]=F[(i|8)+a>>2];F[f+12>>2]=F[(i|12)+a>>2];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){F[(g<<2)+n>>2]=F[(b<<2)+a>>2];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}na();v()}if(!a){break a}}ja(a)}Z=k+16|0;return h|0}function vf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=Z-16|0;Z=k;j=F[b+80>>2];e=G[c+24|0];b=L(j,e);a:{b:{c:{d:{f=F[c+28>>2];if(!(!G[c+84|0]|(f|0)!=3&(f|0)!=4)){e=F[c+48>>2];c=F[F[c>>2]>>2];F[k+8>>2]=0;F[k>>2]=0;F[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<1;a=ka(b);g=la(a,c+e|0,b)+b|0}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=a;h=1;break a}if(e){f=e<<1;a=ka(f);ma(a,0,f)}i=F[d>>2];f=F[d+4>>2]-i>>1;e:{if(f>>>0>>0){kd(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}F[d+4>>2]=i+(b<<1)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!Ab(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!Ab(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break c}n=F[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<1)+n|0;i=b<<1;E[f>>1]=H[i+a>>1];E[f+2>>1]=H[(i|2)+a>>1];E[f+4>>1]=H[(i|4)+a>>1];E[f+6>>1]=H[(i|6)+a>>1];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){E[(g<<1)+n>>1]=H[(b<<1)+a>>1];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}na();v()}if(!a){break a}}ja(a)}Z=k+16|0;return h|0}function uf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=0;k=Z-16|0;Z=k;j=F[b+80>>2];e=G[c+24|0];b=L(j,e);a:{b:{c:{d:{f=F[c+28>>2];if(!(!G[c+84|0]|(f|0)!=3&(f|0)!=4)){e=F[c+48>>2];c=F[F[c>>2]>>2];F[k+8>>2]=0;F[k>>2]=0;F[k+4>>2]=0;if(b){if((b|0)<0){break d}b=b<<1;a=ka(b);g=la(a,c+e|0,b)+b|0}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=a;h=1;break a}if(e){f=e<<1;a=ka(f);ma(a,0,f)}i=F[d>>2];f=F[d+4>>2]-i>>1;e:{if(f>>>0>>0){kd(d,b-f|0);break e}if(b>>>0>=f>>>0){break e}F[d+4>>2]=i+(b<<1)}if(!j){h=1;break c}if(!e){b=0;while(1){if(!zb(c,G[c+84|0]?b:F[F[c+68>>2]+(b<<2)>>2],D[c+24|0],a)){break c}b=b+1|0;h=j>>>0<=b>>>0;if((b|0)!=(j|0)){continue}break}break c}o=e&252;m=e&3;p=e>>>0<4;e=0;while(1){if(!zb(c,G[c+84|0]?e:F[F[c+68>>2]+(e<<2)>>2],D[c+24|0],a)){break c}n=F[d>>2];l=0;b=0;h=0;if(!p){while(1){f=(g<<1)+n|0;i=b<<1;E[f>>1]=H[i+a>>1];E[f+2>>1]=H[(i|2)+a>>1];E[f+4>>1]=H[(i|4)+a>>1];E[f+6>>1]=H[(i|6)+a>>1];b=b+4|0;g=g+4|0;h=h+4|0;if((o|0)!=(h|0)){continue}break}}if(m){while(1){E[(g<<1)+n>>1]=H[(b<<1)+a>>1];b=b+1|0;g=g+1|0;l=l+1|0;if((l|0)!=(m|0)){continue}break}}e=e+1|0;h=j>>>0<=e>>>0;if((e|0)!=(j|0)){continue}break}break b}na();v()}if(!a){break a}}ja(a)}Z=k+16|0;return h|0}function kc(a,b){var c=0,d=0,e=0,f=0,g=0;f=-1;d=-1;a:{if((b|0)==-1){break a}d=b+1|0;f=(d>>>0)%3|0?d:b-2|0;d=b-1|0;if((b>>>0)%3|0){break a}d=b+2|0}b:{c:{d:{switch(F[a+168>>2]){case 0:case 1:e=F[a+148>>2];c=1;b=F[a+156>>2];g=b+(((f|0)==-1?-1:F[F[e>>2]+(f<<2)>>2])<<2)|0;F[g>>2]=F[g>>2]+1;b=(((d|0)==-1?-1:F[F[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 5:e=F[a+148>>2];c=-1;c=((b|0)!=-1?F[F[e>>2]+(b<<2)>>2]:c)<<2;b=F[a+156>>2];c=c+b|0;F[c>>2]=F[c>>2]+1;c=(((f|0)==-1?-1:F[F[e>>2]+(f<<2)>>2])<<2)+b|0;F[c>>2]=F[c>>2]+1;c=2;b=(((d|0)==-1?-1:F[F[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 3:e=F[a+148>>2];c=-1;c=((b|0)!=-1?F[F[e>>2]+(b<<2)>>2]:c)<<2;b=F[a+156>>2];c=c+b|0;F[c>>2]=F[c>>2]+1;c=(((f|0)==-1?-1:F[F[e>>2]+(f<<2)>>2])<<2)+b|0;F[c>>2]=F[c>>2]+2;c=1;b=(((d|0)==-1?-1:F[F[e>>2]+(d<<2)>>2])<<2)+b|0;break c;case 7:break d;default:break b}}e=F[a+148>>2];c=-1;c=((b|0)!=-1?F[F[e>>2]+(b<<2)>>2]:c)<<2;b=F[a+156>>2];c=c+b|0;F[c>>2]=F[c>>2]+2;c=(((f|0)==-1?-1:F[F[e>>2]+(f<<2)>>2])<<2)+b|0;F[c>>2]=F[c>>2]+2;c=2;b=(((d|0)==-1?-1:F[F[e>>2]+(d<<2)>>2])<<2)+b|0}F[b>>2]=F[b>>2]+c}c=a;b=F[F[a+156>>2]+(((f|0)==-1?-1:F[F[F[a+148>>2]>>2]+(f<<2)>>2])<<2)>>2];d=F[a+180>>2];a=F[a+176>>2];F[c+172>>2]=(a|0)<=(b|0)?((b|0)<(d|0)?b:d)-a|0:0}function Dg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b=F[a+32>>2];f=F[b+8>>2];h=F[b+12>>2];g=F[b+20>>2];c=F[b+16>>2];e=0;b:{if((h|0)<=(g|0)&c>>>0>=f>>>0|(g|0)>(h|0)){break b}f=G[F[b>>2]+c|0];e=b;b=g;c=c+1|0;b=c?b:b+1|0;F[e+16>>2]=c;F[e+20>>2]=b;c:{if(!f){break c}while(1){if($[F[F[a>>2]+16>>2]](a,d)|0){d=d+1|0;if((f|0)!=(d|0)){continue}break c}break}return 0}d=F[a+8>>2];b=F[a+12>>2];if((d|0)!=(b|0)){while(1){c=F[d>>2];if(!($[F[F[c>>2]+8>>2]](c,a,F[a+4>>2])|0)){break a}d=d+4|0;if((b|0)!=(d|0)){continue}break}}d:{if(!f){break d}d=0;while(1){b=F[F[a+8>>2]+(d<<2)>>2];if(!($[F[F[b>>2]+12>>2]](b,F[a+32>>2])|0)){break a}d=d+1|0;if((f|0)!=(d|0)){continue}break}if(!f){break d}i=a+20|0;b=0;while(1){d=0;j=b<<2;c=F[j+F[a+8>>2]>>2];k=$[F[F[c>>2]+24>>2]](c)|0;if((k|0)>0){while(1){c=F[F[a+8>>2]+j>>2];c=$[F[F[c>>2]+20>>2]](c,d)|0;e=F[a+20>>2];g=F[a+24>>2]-e>>2;e:{if(c>>>0>>0){break e}h=c+1|0;if(h>>>0>g>>>0){qa(i,h-g|0);e=F[i>>2];break e}if(g>>>0<=h>>>0){break e}F[a+24>>2]=(h<<2)+e}F[(c<<2)+e>>2]=b;d=d+1|0;if((k|0)!=(d|0)){continue}break}}b=b+1|0;if((f|0)!=(b|0)){continue}break}}e=0;if(!($[F[F[a>>2]+28>>2]](a)|0)){break b}e=$[F[F[a>>2]+32>>2]](a)|0}return e|0}return 0}function Ye(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;Oc(a,b,c);c=F[a+84>>2];d=F[a+88>>2]-c>>2;a:{if((d|0)>(b|0)){break a}b=b+1|0;if(b>>>0>d>>>0){b:{d=b-d|0;e=F[a+92>>2];c=F[a+88>>2];if(d>>>0<=e-c>>2>>>0){c:{if(!d){break c}b=c;e=d&7;if(e){while(1){F[b>>2]=1;b=b+4|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}c=(d<<2)+c|0;if((d-1&1073741823)>>>0<7){break c}while(1){F[b+24>>2]=1;F[b+28>>2]=1;F[b+16>>2]=1;F[b+20>>2]=1;F[b+8>>2]=1;F[b+12>>2]=1;F[b>>2]=1;F[b+4>>2]=1;b=b+32|0;if((c|0)!=(b|0)){continue}break}}F[a+88>>2]=c;break b}d:{b=c;c=F[a+84>>2];i=b-c|0;g=i>>2;b=g+d|0;if(b>>>0<1073741824){e=e-c|0;h=e>>>1|0;e=e>>>0>=2147483644?1073741823:b>>>0>>0?h:b;if(e){if(e>>>0>=1073741824){break d}j=ka(e<<2)}g=(g<<2)+j|0;b=g;h=d&7;if(h){while(1){F[b>>2]=1;b=b+4|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}f=g+(d<<2)|0;if((d-1&1073741823)>>>0>=7){while(1){F[b+24>>2]=1;F[b+28>>2]=1;F[b+16>>2]=1;F[b+20>>2]=1;F[b+8>>2]=1;F[b+12>>2]=1;F[b>>2]=1;F[b+4>>2]=1;b=b+32|0;if((f|0)!=(b|0)){continue}break}}b=pa(j,c,i);F[a+88>>2]=f;F[a+84>>2]=b;F[a+92>>2]=b+(e<<2);if(c){ja(c)}break b}na();v()}oa();v()}return}if(b>>>0>=d>>>0){break a}F[a+88>>2]=c+(b<<2)}}function ab(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=F[a+8>>2];e=F[a+4>>2];if(d-e>>2>>>0>=b>>>0){a:{if(!b){break a}d=e;g=b&7;if(g){while(1){F[d>>2]=F[c>>2];d=d+4|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}e=(b<<2)+e|0;if((b-1&1073741823)>>>0<7){break a}while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}F[a+4>>2]=e;return}b:{i=F[a>>2];f=e-i>>2;h=f+b|0;if(h>>>0<1073741824){j=d-i|0;d=j>>>1|0;h=j>>>0>=2147483644?1073741823:d>>>0>h>>>0?d:h;if(h){if(h>>>0>=1073741824){break b}k=ka(h<<2)}f=(f<<2)+k|0;d=f;j=b&7;if(j){while(1){F[d>>2]=F[c>>2];d=d+4|0;g=g+1|0;if((j|0)!=(g|0)){continue}break}}g=(b<<2)+f|0;if((b-1&1073741823)>>>0>=7){while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;if((g|0)!=(d|0)){continue}break}}if((e|0)!=(i|0)){while(1){f=f-4|0;e=e-4|0;F[f>>2]=F[e>>2];if((e|0)!=(i|0)){continue}break}}F[a+8>>2]=(h<<2)+k;F[a+4>>2]=g;F[a>>2]=f;if(i){ja(i)}return}na();v()}oa();v()}function Xb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=F[a+8>>2];e=F[a>>2];if(d-e>>2>>>0>=b>>>0){f=F[a+4>>2];h=f-e>>2;i=b>>>0>h>>>0?h:b;a:{if(!i){break a}d=e;g=i;j=g&7;if(j){while(1){F[d>>2]=F[c>>2];g=g-1|0;d=d+4|0;k=k+1|0;if((k|0)!=(j|0)){continue}break}}if(i>>>0<8){break a}while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;g=g-8|0;if(g){continue}break}}if(b>>>0>h>>>0){b=(b-h<<2)+f|0;while(1){F[f>>2]=F[c>>2];f=f+4|0;if((b|0)!=(f|0)){continue}break}F[a+4>>2]=b;return}F[a+4>>2]=e+(b<<2);return}if(e){F[a+4>>2]=e;ja(e);F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;d=0}b:{if(b>>>0>=1073741824){break b}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:b>>>0>>0?e:b;if(d>>>0>=1073741824){break b}d=d<<2;e=ka(d);F[a>>2]=e;F[a+8>>2]=d+e;c=F[c>>2];d=e;g=b&7;if(g){while(1){F[d>>2]=c;d=d+4|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}e=e+(b<<2)|0;if((b-1&1073741823)>>>0>=7){while(1){F[d+28>>2]=c;F[d+24>>2]=c;F[d+20>>2]=c;F[d+16>>2]=c;F[d+12>>2]=c;F[d+8>>2]=c;F[d+4>>2]=c;F[d>>2]=c;d=d+32|0;if((e|0)!=(d|0)){continue}break}}F[a+4>>2]=e;return}na();v()}function Ka(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=(c>>>0)/3|0;j=F[(F[F[a+8>>2]+96>>2]+L(f,12)|0)+(c-L(f,3)<<2)>>2];a:{h=F[F[a+12>>2]+4>>2];e=F[h+4>>2];if((e|0)!=F[h+8>>2]){F[e>>2]=j;F[h+4>>2]=e+4;break a}b:{i=F[h>>2];f=e-i|0;g=f>>2;d=g+1|0;if(d>>>0<1073741824){k=g<<2;g=f>>>1|0;g=f>>>0>=2147483644?1073741823:d>>>0>>0?g:d;if(g){if(g>>>0>=1073741824){break b}f=ka(g<<2)}else{f=0}d=k+f|0;F[d>>2]=j;j=d+4|0;if((e|0)!=(i|0)){while(1){d=d-4|0;e=e-4|0;F[d>>2]=F[e>>2];if((e|0)!=(i|0)){continue}break}}F[h+8>>2]=f+(g<<2);F[h+4>>2]=j;F[h>>2]=d;if(i){ja(i)}break a}na();v()}oa();v()}c:{d:{h=F[a+4>>2];e=F[h+4>>2];e:{if((e|0)!=F[h+8>>2]){F[e>>2]=c;F[h+4>>2]=e+4;break e}i=F[h>>2];f=e-i|0;j=f>>2;d=j+1|0;if(d>>>0>=1073741824){break d}g=f>>>1|0;g=f>>>0>=2147483644?1073741823:d>>>0>>0?g:d;if(g){if(g>>>0>=1073741824){break c}f=ka(g<<2)}else{f=0}d=f+(j<<2)|0;F[d>>2]=c;c=d+4|0;if((e|0)!=(i|0)){while(1){d=d-4|0;e=e-4|0;F[d>>2]=F[e>>2];if((e|0)!=(i|0)){continue}break}}F[h+8>>2]=f+(g<<2);F[h+4>>2]=c;F[h>>2]=d;if(!i){break e}ja(i)}a=F[a+4>>2];F[F[a+12>>2]+(b<<2)>>2]=F[a+24>>2];F[a+24>>2]=F[a+24>>2]+1;return}na();v()}oa();v()}function pb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=d-c|0;if((h|0)<=0){return}a:{e=F[a+8>>2];i=F[a+4>>2];if((e-i|0)>=(h|0)){j=i-b|0;if((j|0)>=(h|0)){f=i;g=d;break a}f=i;g=c+j|0;if((g|0)!=(d|0)){e=g;while(1){D[f|0]=G[e|0];f=f+1|0;e=e+1|0;if((e|0)!=(d|0)){continue}break}}F[a+4>>2]=f;if((j|0)>0){break a}return}k=F[a>>2];g=(i-k|0)+h|0;if((g|0)>=0){j=b-k|0;f=e-k|0;e=f<<1;f=f>>>0>=1073741823?2147483647:e>>>0>g>>>0?e:g;if(f){e=ka(f)}else{e=0}g=j+e|0;if((c|0)!=(d|0)){g=la(g,c,h)+h|0}d=pa(e,k,j);c=i-b|0;b=pa(g,b,c);F[a+8>>2]=e+f;F[a+4>>2]=b+c;F[a>>2]=d;if(k){ja(k)}return}na();v()}e=f;d=e-h|0;if(i>>>0>d>>>0){while(1){D[e|0]=G[d|0];e=e+1|0;d=d+1|0;if(i>>>0>d>>>0){continue}break}}F[a+4>>2]=e;a=b+h|0;if((a|0)!=(f|0)){a=f-a|0;pa(f-a|0,b,a)}if((c|0)==(g|0)){return}f=(c^-1)+g|0;a=g-c&7;b:{if(!a){e=b;break b}d=0;e=b;while(1){D[e|0]=G[c|0];e=e+1|0;c=c+1|0;d=d+1|0;if((a|0)!=(d|0)){continue}break}}if(f>>>0<7){return}while(1){D[e|0]=G[c|0];D[e+1|0]=G[c+1|0];D[e+2|0]=G[c+2|0];D[e+3|0]=G[c+3|0];D[e+4|0]=G[c+4|0];D[e+5|0]=G[c+5|0];D[e+6|0]=G[c+6|0];D[e+7|0]=G[c+7|0];e=e+8|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}}function la(a,b,c){var d=0,e=0,f=0;if(c>>>0>=512){Y(a|0,b|0,c|0);return a}e=a+c|0;a:{if(!((a^b)&3)){b:{if(!(a&3)){c=a;break b}if(!c){c=a;break b}c=a;while(1){D[c|0]=G[b|0];b=b+1|0;c=c+1|0;if(!(c&3)){break b}if(c>>>0>>0){continue}break}}d=e&-4;c:{if(d>>>0<64){break c}f=d+-64|0;if(f>>>0>>0){break c}while(1){F[c>>2]=F[b>>2];F[c+4>>2]=F[b+4>>2];F[c+8>>2]=F[b+8>>2];F[c+12>>2]=F[b+12>>2];F[c+16>>2]=F[b+16>>2];F[c+20>>2]=F[b+20>>2];F[c+24>>2]=F[b+24>>2];F[c+28>>2]=F[b+28>>2];F[c+32>>2]=F[b+32>>2];F[c+36>>2]=F[b+36>>2];F[c+40>>2]=F[b+40>>2];F[c+44>>2]=F[b+44>>2];F[c+48>>2]=F[b+48>>2];F[c+52>>2]=F[b+52>>2];F[c+56>>2]=F[b+56>>2];F[c+60>>2]=F[b+60>>2];b=b- -64|0;c=c- -64|0;if(f>>>0>=c>>>0){continue}break}}if(c>>>0>=d>>>0){break a}while(1){F[c>>2]=F[b>>2];b=b+4|0;c=c+4|0;if(d>>>0>c>>>0){continue}break}break a}if(e>>>0<4){c=a;break a}d=e-4|0;if(d>>>0>>0){c=a;break a}c=a;while(1){D[c|0]=G[b|0];D[c+1|0]=G[b+1|0];D[c+2|0]=G[b+2|0];D[c+3|0]=G[b+3|0];b=b+4|0;c=c+4|0;if(d>>>0>=c>>>0){continue}break}}if(c>>>0>>0){while(1){D[c|0]=G[b|0];b=b+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}}return a}function sd(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;F[a>>2]=8336;d=a+232|0;b=F[d+196>>2];if(b){F[d+200>>2]=b;ja(b)}c=F[d+184>>2];if(c){b=c;e=F[d+188>>2];if((b|0)!=(e|0)){while(1){b=e-12|0;f=F[b>>2];if(f){F[e-8>>2]=f;ja(f)}e=b;if((b|0)!=(c|0)){continue}break}b=F[d+184>>2]}F[d+188>>2]=c;ja(b)}b=F[d+156>>2];if(b){F[d+160>>2]=b;ja(b)}c=F[d+136>>2];F[d+136>>2]=0;if(c){e=c-4|0;b=F[e>>2];if(b){b=c+(b<<4)|0;while(1){b=b-16|0;if((c|0)!=(b|0)){continue}break}}ja(e)}td(a+216|0);b=F[a+196>>2];if(b){F[a+200>>2]=b;ja(b)}b=F[a+184>>2];if(b){F[a+188>>2]=b;ja(b)}b=F[a+172>>2];if(b){F[a+176>>2]=b;ja(b)}b=F[a+160>>2];if(b){F[a+164>>2]=b;ja(b)}b=F[a+144>>2];if(b){while(1){c=F[b>>2];ja(b);b=c;if(b){continue}break}}b=F[a+136>>2];F[a+136>>2]=0;if(b){ja(b)}b=F[a+120>>2];if(b){ja(b)}b=F[a+108>>2];if(b){ja(b)}b=F[a+96>>2];if(b){ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+60>>2];if(b){ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}b=F[a+36>>2];if(b){F[a+40>>2]=b;ja(b)}b=F[a+24>>2];if(b){F[a+28>>2]=b;ja(b)}b=F[a+12>>2];if(b){F[a+16>>2]=b;ja(b)}b=F[a+8>>2];F[a+8>>2]=0;if(b){Za(b)}return a|0}function Fa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=F[a+8>>2];e=F[a+4>>2];if(d-e>>2>>>0>=b>>>0){a:{if(!b){break a}d=e;f=b&7;if(f){while(1){F[d>>2]=F[c>>2];d=d+4|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}}e=(b<<2)+e|0;if((b-1&1073741823)>>>0<7){break a}while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}F[a+4>>2]=e;return}b:{i=F[a>>2];j=e-i|0;f=j>>2;g=f+b|0;if(g>>>0<1073741824){d=d-i|0;e=d>>>1|0;g=d>>>0>=2147483644?1073741823:e>>>0>g>>>0?e:g;if(g){if(g>>>0>=1073741824){break b}k=ka(g<<2)}f=(f<<2)+k|0;d=f;e=b&7;if(e){while(1){F[d>>2]=F[c>>2];d=d+4|0;h=h+1|0;if((e|0)!=(h|0)){continue}break}}e=f+(b<<2)|0;if((b-1&1073741823)>>>0>=7){while(1){F[d>>2]=F[c>>2];F[d+4>>2]=F[c>>2];F[d+8>>2]=F[c>>2];F[d+12>>2]=F[c>>2];F[d+16>>2]=F[c>>2];F[d+20>>2]=F[c>>2];F[d+24>>2]=F[c>>2];F[d+28>>2]=F[c>>2];d=d+32|0;if((e|0)!=(d|0)){continue}break}}b=pa(k,i,j);F[a+4>>2]=e;F[a>>2]=b;F[a+8>>2]=b+(g<<2);if(i){ja(i)}return}na();v()}oa();v()}function Sb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(G[a+11|0]>>>7|0){d=F[a+4>>2]}else{d=G[a+11|0]&127}if(d>>>0>>0){h=Z-16|0;Z=h;b=b-d|0;if(b){g=G[a+11|0]>>>7|0?(F[a+8>>2]&2147483647)-1|0:10;if(G[a+11|0]>>>7|0){d=F[a+4>>2]}else{d=G[a+11|0]&127}i=d+b|0;if(g-d>>>0>>0){a:{e=Z-16|0;Z=e;c=i-g|0;if(c>>>0<=2147483631-g>>>0){if(G[a+11|0]>>>7|0){f=F[a>>2]}else{f=a}if(g>>>0<1073741799){F[e+12>>2]=g<<1;F[e>>2]=c+g;c=Z-16|0;Z=c;Z=c+16|0;c=e+12|0;c=F[(I[e>>2]>2]?c:e)>>2];if(c>>>0>=11){j=c+16&-16;c=j-1|0;c=(c|0)==11?j:c}else{c=10}c=c+1|0}else{c=2147483631}sb(e,c);c=F[e>>2];if(d){db(c,f,d)}if((g|0)!=10){ja(f)}F[a>>2]=c;F[a+8>>2]=F[a+8>>2]&-2147483648|F[e+4>>2]&2147483647;F[a+8>>2]=F[a+8>>2]|-2147483648;Z=e+16|0;break a}za();v()}}f=d;if(G[a+11|0]>>>7|0){d=F[a>>2]}else{d=a}f=f+d|0;e=Z-16|0;Z=e;D[e+15|0]=0;while(1){if(b){D[f|0]=G[e+15|0];b=b-1|0;f=f+1|0;continue}break}Z=e+16|0;Ic(a,i);D[h+15|0]=0;D[d+i|0]=G[h+15|0]}Z=h+16|0;return}if(G[a+11|0]>>>7|0){d=F[a>>2]}else{d=a}f=Z-16|0;Z=f;Ic(a,b);D[f+15|0]=0;D[b+d|0]=G[f+15|0];Z=f+16|0}function Zc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;g=Z-16|0;Z=g;a:{b:{if(b){F[a+88>>2]=0;F[a+92>>2]=0;d=F[a+84>>2];F[a+84>>2]=0;if(d){ja(d)}F[a+76>>2]=0;F[a+80>>2]=0;d=F[a+72>>2];F[a+72>>2]=0;if(d){ja(d)}d=F[b>>2];c=F[b+4>>2];D[g+15|0]=0;Ea(a,c-d>>2,g+15|0);d=F[b+28>>2];c=F[b+24>>2];D[g+14|0]=0;Ea(a+12|0,d-c>>2,g+14|0);Xb(a+28|0,F[b+4>>2]-F[b>>2]>>2,10284);c=F[b+28>>2]-F[b+24>>2]|0;f=c>>2;e=F[a+52>>2];c:{if(f>>>0<=F[a+60>>2]-e>>2>>>0){break c}if((c|0)<0){break b}d=F[a+56>>2];c=ka(c);f=c+(f<<2)|0;h=c+(d-e&-4)|0;c=h;if((d|0)!=(e|0)){while(1){c=c-4|0;d=d-4|0;F[c>>2]=F[d>>2];if((d|0)!=(e|0)){continue}break}}F[a+60>>2]=f;F[a+56>>2]=h;F[a+52>>2]=c;if(!e){break c}ja(e)}c=F[b+28>>2]-F[b+24>>2]|0;f=c>>2;e=F[a+40>>2];d:{if(f>>>0<=F[a+48>>2]-e>>2>>>0){break d}if((c|0)<0){break a}d=F[a+44>>2];c=ka(c);f=c+(f<<2)|0;h=c+(d-e&-4)|0;c=h;if((d|0)!=(e|0)){while(1){c=c-4|0;d=d-4|0;F[c>>2]=F[d>>2];if((d|0)!=(e|0)){continue}break}}F[a+48>>2]=f;F[a+44>>2]=h;F[a+40>>2]=c;if(!e){break d}ja(e)}D[a+24|0]=1;F[a+64>>2]=b}Z=g+16|0;return}na();v()}na();v()}function nb(a,b){var c=0,d=0,e=0;c=(a|0)==(b|0);D[b+12|0]=c;a:{if(c){break a}while(1){d=F[b+8>>2];if(G[d+12|0]){break a}b:{c=F[d+8>>2];e=F[c>>2];if((e|0)==(d|0)){e=F[c+4>>2];if(!(!e|G[e+12|0])){break b}c:{if(F[d>>2]==(b|0)){b=d;break c}b=F[d+4>>2];a=F[b>>2];F[d+4>>2]=a;if(a){F[a+8>>2]=d;c=F[d+8>>2]}F[b+8>>2]=c;a=F[d+8>>2];F[((F[a>>2]!=(d|0))<<2)+a>>2]=b;F[b>>2]=d;F[d+8>>2]=b;c=F[b+8>>2];d=F[c>>2]}D[b+12|0]=1;D[c+12|0]=0;a=F[d+4>>2];F[c>>2]=a;if(a){F[a+8>>2]=c}F[d+8>>2]=F[c+8>>2];a=F[c+8>>2];F[((F[a>>2]!=(c|0))<<2)+a>>2]=d;F[d+4>>2]=c;F[c+8>>2]=d;return}if(!(G[e+12|0]|!e)){break b}d:{if(F[d>>2]!=(b|0)){b=d;break d}a=F[b+4>>2];F[d>>2]=a;if(a){F[a+8>>2]=d;c=F[d+8>>2]}F[b+8>>2]=c;a=F[d+8>>2];F[((F[a>>2]!=(d|0))<<2)+a>>2]=b;F[b+4>>2]=d;F[d+8>>2]=b;c=F[b+8>>2]}D[b+12|0]=1;D[c+12|0]=0;a=F[c+4>>2];b=F[a>>2];F[c+4>>2]=b;if(b){F[b+8>>2]=c}F[a+8>>2]=F[c+8>>2];b=F[c+8>>2];F[((F[b>>2]!=(c|0))<<2)+b>>2]=a;F[a>>2]=c;F[c+8>>2]=a;break a}D[d+12|0]=1;D[c+12|0]=(a|0)==(c|0);D[e+12|0]=1;b=c;if((c|0)!=(a|0)){continue}break}}}function mi(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(b){if(!c){break k}if(!d){break j}e=O(d)-O(b)|0;if(e>>>0<=31){break i}break c}if((d|0)==1|d>>>0>1){break c}_=0;a=(a>>>0)/(c>>>0)|0;break a}if(!a){break h}if(!d|d-1&d){break g}a=b>>>ji(d)|0;_=0;break a}if(!(c-1&c)){break f}h=(O(c)+33|0)-O(b)|0;g=0-h|0;break d}h=e+1|0;g=63-e|0;break d}_=0;a=(b>>>0)/(d>>>0)|0;break a}e=O(d)-O(b)|0;if(e>>>0<31){break e}break c}if((c|0)==1){break b}d=ji(c);c=d&31;if((d&63)>>>0>=32){a=b>>>c|0}else{e=b>>>c|0;a=((1<>>c}_=e;break a}h=e+1|0;g=63-e|0}e=h&63;f=e&31;if(e>>>0>=32){e=0;i=b>>>f|0}else{e=b>>>f|0;i=((1<>>f}g=g&63;f=g&31;if(g>>>0>=32){b=a<>>32-f|b<>>31;e=i<<1|b>>>31;f=m-(j+(e>>>0>g>>>0)|0)>>31;k=c&f;i=e-k|0;e=j-((d&f)+(e>>>0>>0)|0)|0;b=b<<1|a>>>31;a=l|a<<1;l=f&1;h=h-1|0;if(h){continue}break}}_=b<<1|a>>>31;a=l|a<<1;break a}a=0;b=0}_=b}return a}function yh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c=F[b+88>>2];if(!(!c|F[c>>2]!=1)){e=F[c+8>>2];F[a+4>>2]=G[e|0]|G[e+1|0]<<8|(G[e+2|0]<<16|G[e+3|0]<<24);f=a+8|0;d=G[b+24|0];h=F[a+8>>2];g=F[a+12>>2]-h>>2;a:{if(d>>>0>g>>>0){qa(f,d-g|0);d=G[b+24|0];e=F[c+8>>2];break a}if(d>>>0>=g>>>0){break a}F[a+12>>2]=h+(d<<2)}b:{if(!d){b=4;break b}h=d&3;f=F[f>>2];c:{if(d-1>>>0<3){b=4;d=0;break c}k=d&252;d=0;b=4;while(1){g=d<<2;c=b+e|0;F[g+f>>2]=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[f+(g|4)>>2]=G[c+4|0]|G[c+5|0]<<8|(G[c+6|0]<<16|G[c+7|0]<<24);F[f+(g|8)>>2]=G[c+8|0]|G[c+9|0]<<8|(G[c+10|0]<<16|G[c+11|0]<<24);F[f+(g|12)>>2]=G[c+12|0]|G[c+13|0]<<8|(G[c+14|0]<<16|G[c+15|0]<<24);d=d+4|0;b=b+16|0;i=i+4|0;if((k|0)!=(i|0)){continue}break}}if(!h){break b}while(1){c=b+e|0;F[f+(d<<2)>>2]=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);d=d+1|0;b=b+4|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}d=a;a=b+e|0;F[d+20>>2]=G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24);d=1}return d|0}function Yg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;g=Z-16|0;Z=g;e=F[a+4>>2];d=F[e>>2];a:{b=F[a+12>>2];c=F[b+28>>2]-F[b+24>>2]|0;f=c>>2;b:{if(f>>>0<=F[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=F[e+4>>2];c=ka(c);f=c+(f<<2)|0;h=c+(b-d&-4)|0;c=h;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[e+8>>2]=f;F[e+4>>2]=h;F[e>>2]=c;if(!d){break b}ja(d)}b=F[a+12>>2];c=F[b+28>>2];b=F[b+24>>2];F[g+12>>2]=0;b=c-b>>2;d=a+96|0;e=F[d>>2];c=F[a+100>>2]-e>>2;c:{if(b>>>0>c>>>0){Fa(d,b-c|0,g+12|0);break c}if(b>>>0>=c>>>0){break c}F[a+100>>2]=e+(b<<2)}e=a+8|0;b=F[a+116>>2];d:{if(b){d=F[b>>2];if((d|0)==F[b+4>>2]){c=1;break d}b=0;while(1){c=rd(e,F[(b<<2)+d>>2]);if(!c){break d}f=F[a+116>>2];d=F[f>>2];b=b+1|0;if(b>>>0>2]-d>>2>>>0){continue}break}break d}c=1;a=F[a+12>>2];a=F[a+4>>2]-F[a>>2]|0;if(a>>>0<12){break d}a=(a>>2>>>0)/3|0;b=0;while(1){c=rd(e,L(b,3));if(!c){break d}b=b+1|0;if((a|0)!=(b|0)){continue}break}}Z=g+16|0;return c|0}na();v()}function md(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;a:{b:{c:{if(!b){if((d|0)<0){break a}f=F[a+4>>2];b=F[a>>2];d=f-b|0;if(c>>>0>d>>>0){g=c-d|0;e=F[a+8>>2];if(g>>>0<=e-f>>>0){i=a,j=ma(f,0,g)+g|0,F[i+4>>2]=j;break c}if((c|0)<0){break b}f=e-b|0;e=f<<1;f=f>>>0>=1073741823?2147483647:c>>>0>>0?e:c;e=ka(f);ma(e+d|0,0,g);d=pa(e,b,d);F[a+8>>2]=d+f;F[a+4>>2]=c+d;F[a>>2]=d;if(!b){break c}ja(b);break c}if(c>>>0>=d>>>0){break c}F[a+4>>2]=b+c;break c}if((d|0)<0){break a}e=F[a+4>>2];f=F[a>>2];g=e-f|0;d:{if((d|0)<=0&c>>>0<=g>>>0|(d|0)<0){break d}if(c>>>0>g>>>0){d=c-g|0;h=F[a+8>>2];if(d>>>0<=h-e>>>0){i=a,j=ma(e,0,d)+d|0,F[i+4>>2]=j;break d}if((c|0)<0){break b}e=h-f|0;h=e<<1;e=e>>>0>=1073741823?2147483647:c>>>0>>0?h:c;h=ka(e);ma(h+g|0,0,d);d=pa(h,f,g);F[a+8>>2]=d+e;F[a+4>>2]=c+d;F[a>>2]=d;if(!f){break d}ja(f);break d}if(c>>>0>=g>>>0){break d}F[a+4>>2]=c+f}if(!c){break c}pa(F[a>>2],b,c)}b=F[a+28>>2];c=F[a+24>>2]+1|0;b=c?b:b+1|0;F[a+24>>2]=c;F[a+28>>2]=b;g=1;break a}na();v()}return g}function Lg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=F[a+12>>2];c=F[a+68>>2];d=F[c+80>>2];D[b+84|0]=0;n=b+68|0;i=F[b+68>>2];e=F[b+72>>2]-i>>2;a:{if(e>>>0>>0){ab(n,d-e|0,9124);c=F[a+68>>2];d=F[c+80>>2];break a}if(d>>>0>=e>>>0){break a}F[b+72>>2]=i+(d<<2)}b=F[c+100>>2];e=F[c+96>>2];i=(b-e|0)/12|0;m=1;b:{if((b|0)==(e|0)){break b}k=F[k+28>>2];f=F[k>>2];if((f|0)==-1){return 0}o=i>>>0<=1?1:i;c=e;b=0;m=0;while(1){g=F[c>>2];if(g>>>0>=d>>>0){break b}j=F[F[a+72>>2]+12>>2];h=F[j+(f<<2)>>2];if(h>>>0>=d>>>0){break b}f=F[n>>2];F[f+(g<<2)>>2]=h;g=k+(l<<2)|0;h=F[g+4>>2];if((h|0)==-1){break b}l=F[c+4>>2];if(l>>>0>=d>>>0){break b}h=F[(h<<2)+j>>2];if(h>>>0>=d>>>0){break b}F[f+(l<<2)>>2]=h;g=F[g+8>>2];if((g|0)==-1){break b}c=F[c+8>>2];if(c>>>0>=d>>>0){break b}j=F[(g<<2)+j>>2];if(j>>>0>=d>>>0){break b}F[f+(c<<2)>>2]=j;b=b+1|0;m=i>>>0<=b>>>0;if((b|0)==(o|0)){break b}c=e+L(b,12)|0;l=L(b,3);f=F[k+(l<<2)>>2];if((f|0)!=-1){continue}break}}return m|0}function ag(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=F[d+80>>2];e=Z-48|0;Z=e;a=F[a+4>>2];m=a-2|0;a:{if(m>>>0>28){break a}j=F[F[d>>2]>>2]+F[d+48>>2]|0;F[e+16>>2]=a;a=-1<>2]=a^-1;a=-2-a|0;F[e+24>>2]=a;F[e+32>>2]=(a|0)/2;J[e+28>>2]=M(2)/M(a|0);f=F[c>>2];if((f|0)!=F[c+4>>2]){a=0;d=0;while(1){g=F[(d<<2)+f>>2];h=e+36|0;k=F[F[b>>2]>>2];l=F[b+48>>2];f=F[b+40>>2];i=F[b+44>>2];if(!G[b+84|0]){g=F[F[b+68>>2]+(g<<2)>>2]}g=ki(f,i,g,0);i=g;g=g+l|0;la(h,g+k|0,f);Kc(e+16|0,h,e+12|0,e+8|0);f=a<<2;F[f+j>>2]=F[e+12>>2];F[(f|4)+j>>2]=F[e+8>>2];a=a+2|0;d=d+1|0;f=F[c>>2];if(d>>>0>2]-f>>2>>>0){continue}break}break a}if(!h){break a}d=0;a=0;while(1){k=e+36|0;l=F[F[b>>2]>>2];i=F[b+48>>2];c=F[b+40>>2];f=ki(c,F[b+44>>2],G[b+84|0]?a:F[F[b+68>>2]+(a<<2)>>2],0);g=f;f=f+i|0;la(k,f+l|0,c);Kc(e+16|0,k,e+12|0,e+8|0);c=d<<2;F[c+j>>2]=F[e+12>>2];F[(c|4)+j>>2]=F[e+8>>2];d=d+2|0;a=a+1|0;if((h|0)!=(a|0)){continue}break}}Z=e+48|0;return m>>>0<29|0}function Zg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=F[a+12>>2];d=F[a+108>>2];e=F[d+80>>2];D[b+84|0]=0;m=b+68|0;h=F[b+68>>2];f=F[b+72>>2]-h>>2;a:{if(f>>>0>>0){ab(m,e-f|0,9124);d=F[a+108>>2];e=F[d+80>>2];break a}if(e>>>0>=f>>>0){break a}F[b+72>>2]=h+(e<<2)}b=F[d+100>>2];f=F[d+96>>2];h=(b-f|0)/12|0;k=1;b:{if((b|0)==(f|0)){break b}n=h>>>0<=1?1:h;o=F[c>>2];c=0;d=f;b=0;k=0;while(1){c=(c<<2)+o|0;i=F[c>>2];if((i|0)==-1){break b}g=F[d>>2];if(g>>>0>=e>>>0){break b}l=F[F[a+112>>2]+12>>2];j=F[l+(i<<2)>>2];if(j>>>0>=e>>>0){break b}i=F[m>>2];F[i+(g<<2)>>2]=j;g=F[c+4>>2];if((g|0)==-1){break b}j=F[d+4>>2];if(j>>>0>=e>>>0){break b}g=F[(g<<2)+l>>2];if(g>>>0>=e>>>0){break b}F[i+(j<<2)>>2]=g;c=F[c+8>>2];if((c|0)==-1){break b}d=F[d+8>>2];if(d>>>0>=e>>>0){break b}c=F[(c<<2)+l>>2];if(c>>>0>=e>>>0){break b}F[i+(d<<2)>>2]=c;b=b+1|0;k=h>>>0<=b>>>0;if((b|0)==(n|0)){break b}c=L(b,3);d=f+L(b,12)|0;if((b|0)!=1431655765){continue}break}}return k|0}function xd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=M(0),j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=Z-16|0;Z=k;if(F[c+28>>2]==9){d=F[a+4>>2];h=G[c+24|0];e=h<<2;f=ka(e);l=k+8|0;F[l>>2]=1065353216;i=J[a+20>>2];d=-1<0){J[l>>2]=i/M(d|0)}o=(d|0)>0;a:{if(!o){break a}j=F[c+80>>2];if(!j){break a}if(h){p=F[F[b>>2]>>2]+F[b+48>>2]|0;t=h&254;u=h&1;b=0;while(1){m=F[a+8>>2];i=J[l>>2];d=0;n=0;if((h|0)!=1){while(1){g=d<<2;q=(b<<2)+p|0;J[g+f>>2]=M(i*M(F[q>>2]))+J[g+m>>2];g=g|4;J[g+f>>2]=M(i*M(F[q+4>>2]))+J[g+m>>2];d=d+2|0;b=b+2|0;n=n+2|0;if((t|0)!=(n|0)){continue}break}}if(u){d=d<<2;J[d+f>>2]=M(i*M(F[(b<<2)+p>>2]))+J[d+m>>2];b=b+1|0}la(F[F[c+64>>2]>>2]+r|0,f,e);r=e+r|0;s=s+1|0;if((s|0)!=(j|0)){continue}break}break a}b=0;if((j|0)!=1){a=j&-2;d=0;while(1){la(F[F[c+64>>2]>>2]+b|0,f,e);b=b+e|0;la(b+F[F[c+64>>2]>>2]|0,f,e);b=b+e|0;d=d+2|0;if((a|0)!=(d|0)){continue}break}}if(!(j&1)){break a}la(F[F[c+64>>2]>>2]+b|0,f,e)}ja(f)}Z=k+16|0;return o|0}function Rg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=F[a+12>>2];d=F[a+68>>2];e=F[d+80>>2];D[b+84|0]=0;m=b+68|0;h=F[b+68>>2];f=F[b+72>>2]-h>>2;a:{if(f>>>0>>0){ab(m,e-f|0,9124);d=F[a+68>>2];e=F[d+80>>2];break a}if(e>>>0>=f>>>0){break a}F[b+72>>2]=h+(e<<2)}b=F[d+100>>2];f=F[d+96>>2];h=(b-f|0)/12|0;k=1;b:{if((b|0)==(f|0)){break b}n=h>>>0<=1?1:h;o=F[c>>2];c=0;d=f;b=0;k=0;while(1){c=(c<<2)+o|0;i=F[c>>2];if((i|0)==-1){break b}g=F[d>>2];if(g>>>0>=e>>>0){break b}l=F[F[a+72>>2]+12>>2];j=F[l+(i<<2)>>2];if(j>>>0>=e>>>0){break b}i=F[m>>2];F[i+(g<<2)>>2]=j;g=F[c+4>>2];if((g|0)==-1){break b}j=F[d+4>>2];if(j>>>0>=e>>>0){break b}g=F[(g<<2)+l>>2];if(g>>>0>=e>>>0){break b}F[i+(j<<2)>>2]=g;c=F[c+8>>2];if((c|0)==-1){break b}d=F[d+8>>2];if(d>>>0>=e>>>0){break b}c=F[(c<<2)+l>>2];if(c>>>0>=e>>>0){break b}F[i+(d<<2)>>2]=c;b=b+1|0;k=h>>>0<=b>>>0;if((b|0)==(n|0)){break b}c=L(b,3);d=f+L(b,12)|0;if((b|0)!=1431655765){continue}break}}return k|0}function Na(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=Z-16|0;Z=d;a:{f=F[a+4>>2];b:{if(f>>>0>>0){e=b-f|0;c=F[a+8>>2];g=c<<5;c:{if(!(e>>>0>g>>>0|f>>>0>g-e>>>0)){F[a+4>>2]=b;h=f&31;b=F[a>>2]+(f>>>3&536870908)|0;break c}F[d+8>>2]=0;F[d>>2]=0;F[d+4>>2]=0;if((b|0)<0){break a}if(g>>>0<=1073741822){c=c<<6;b=b+31&-32;b=b>>>0>>0?c:b}else{b=2147483647}$a(d,b);f=F[a+4>>2];F[d+4>>2]=f+e;i=F[a>>2];b=F[d>>2];d:{if((f|0)<=0){break d}c=f>>>5|0;if(f>>>0>=32){pa(b,i,c<<2)}g=c<<2;b=g+b|0;h=f&31;if(h){c=-1>>>32-h|0;F[b>>2]=F[b>>2]&(c^-1)|F[i+g>>2]&c}i=F[a>>2]}F[a>>2]=F[d>>2];F[d>>2]=i;c=F[a+4>>2];F[a+4>>2]=F[d+4>>2];F[d+4>>2]=c;c=F[a+8>>2];F[a+8>>2]=F[d+8>>2];F[d+8>>2]=c;if(!i){break c}ja(i)}if(!e){break b}if(h){c=32-h|0;a=c>>>0>>0?c:e;F[b>>2]=F[b>>2]&(-1<>>c-a^-1);e=e-a|0;b=b+4|0}a=e>>>5|0;if(e>>>0>=32){ma(b,0,a<<2)}if((e&-32)==(e|0)){break b}a=(a<<2)+b|0;F[a>>2]=F[a>>2]&(-1>>>32-(e&31)^-1);break b}F[a+4>>2]=b}Z=d+16|0;return}na();v()}function Aa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=Z-16|0;Z=i;f=F[b+20>>2];h=F[b+12>>2];c=F[b+16>>2];a:{if((f|0)>=(h|0)&c>>>0>=I[b+8>>2]|(f|0)>(h|0)){break a}D[a+12|0]=G[c+F[b>>2]|0];c=F[b+20>>2];f=F[b+16>>2]+1|0;c=f?c:c+1|0;F[b+16>>2]=f;F[b+20>>2]=c;if(!Qd(1,i+12|0,b)){break a}h=F[b+8>>2];f=F[b+16>>2];g=h-f|0;c=F[i+12>>2];d=f>>>0>h>>>0;h=F[b+20>>2];e=F[b+12>>2]-(d+h|0)|0;if(g>>>0>>0&(e|0)<=0|(e|0)<0|(c|0)<=0){break a}g=f+F[b>>2]|0;F[a>>2]=g;b:{c:{e=c-1|0;j=e+g|0;d=G[j|0];d:{if(d>>>0<=63){F[a+4>>2]=e;d=G[j|0]&63;break d}e:{switch((d>>>6|0)-1|0){case 1:break c;case 0:break e;default:break a}}if(c>>>0<2){break a}e=c-2|0;F[a+4>>2]=e;g=g+e|0;d=G[g+1|0]<<8&16128|G[g|0]}F[a+8>>2]=d+4096;break b}if(c>>>0<3){break a}e=c-3|0;F[a+4>>2]=e;d=a;a=g+e|0;a=G[a+1|0]<<8|G[a+2|0]<<16&4128768|G[a|0];F[d+8>>2]=a+4096;if(a>>>0>1044479){break a}}a=h;d=c;c=c+f|0;a=d>>>0>c>>>0?a+1|0:a;F[b+16>>2]=c;F[b+20>>2]=a;k=1}Z=i+16|0;return k}function qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=F[a+12>>2];i=F[a+8>>2];d=e-i>>2;b=G[b+24|0];a:{if(d>>>0>>0){qa(a+8|0,b-d|0);i=F[a+8>>2];e=F[a+12>>2];break a}if(b>>>0>=d>>>0){break a}e=(b<<2)+i|0;F[a+12>>2]=e}b=0;f=F[c+8>>2];h=F[c+12>>2];j=F[c+20>>2];e=e-i|0;d=F[c+16>>2];g=e+d|0;j=e>>>0>g>>>0?j+1|0:j;b:{if(f>>>0>>0&(h|0)<=(j|0)|(h|0)<(j|0)){break b}la(i,d+F[c>>2]|0,e);d=F[c+20>>2];g=e;e=e+F[c+16>>2]|0;d=g>>>0>e>>>0?d+1|0:d;F[c+16>>2]=e;F[c+20>>2]=d;f=F[c+8>>2];h=F[c+12>>2];g=e+4|0;d=g>>>0<4?d+1|0:d;if(f>>>0>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break b}d=e+F[c>>2]|0;F[a+20>>2]=G[d|0]|G[d+1|0]<<8|(G[d+2|0]<<16|G[d+3|0]<<24);d=F[c+20>>2];g=d;f=d;e=F[c+16>>2];d=e+4|0;f=d>>>0<4?f+1|0:f;F[c+16>>2]=d;F[c+20>>2]=f;h=F[c+12>>2];if((f|0)>=(h|0)&d>>>0>=I[c+8>>2]|(f|0)>(h|0)){break b}f=G[d+F[c>>2]|0];d=g;e=e+5|0;d=e>>>0<5?d+1|0:d;F[c+16>>2]=e;F[c+20>>2]=d;if(f-1>>>0>29){break b}F[a+4>>2]=f;b=1}return b|0}function Kc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=+J[b>>2];k=+J[b+4>>2];l=+J[b+8>>2];g=N(j)+N(k)+N(l);a:{if(!(g>1e-6)){j=1;k=0;e=0;break a}g=1/g;k=g*k;j=g*j;e=g*l<0}h=F[a+16>>2];l=+(h|0);g=R(j*l+.5);b:{if(N(g)<2147483648){m=~~g;break b}m=-2147483648}f=m>>31;i=(f^m)-f|0;g=R(k*l+.5);c:{if(N(g)<2147483648){f=~~g;break c}f=-2147483648}b=f>>31;b=h-(i+((f^b)-b|0)|0)|0;i=(b|0)>0?b:0;e=e?0-i|0:i;f=f+(b>>31&((f|0)>0?b:0-b|0))|0;d:{if((m|0)>=0){b=e+h|0;a=F[a+8>>2];e=h+f|0;break d}b=f>>31;b=(b^f)-b|0;a=F[a+8>>2];b=(e|0)<0?b:a-b|0;e=(f|0)<0?i:a-i|0}e:{if(!(b|e)){b=a;break e}if(!((a|0)!=(b|0)|e)){b=a;break e}if(!((a|0)!=(e|0)|b)){b=a;break e}if(!((b|0)<=(h|0)|e)){b=(h<<1)-b|0;a=0;break e}if(!((a|0)!=(e|0)|(b|0)>=(h|0))){b=(h<<1)-b|0;break e}if(!((a|0)!=(b|0)|(e|0)>=(h|0))){b=a;a=(h<<1)-e|0;break e}if(b){a=e;break e}b=0;if((e|0)<=(h|0)){a=e;break e}a=(h<<1)-e|0}F[c>>2]=a;F[d>>2]=b}function ye(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{if(!$c(a,b)){break a}h=a+36|0;g=$[F[F[a>>2]+24>>2]](a)|0;e=F[a+40>>2];d=F[a+36>>2];c=e-d>>2;b:{if(g>>>0>c>>>0){Pb(h,g-c|0);break b}if(c>>>0<=g>>>0){break b}d=d+(g<<2)|0;if((d|0)!=(e|0)){while(1){e=e-4|0;c=F[e>>2];F[e>>2]=0;if(c){$[F[F[c>>2]+4>>2]](c)}if((d|0)!=(e|0)){continue}break}}F[a+40>>2]=d}c=1;if((g|0)<=0){break a}e=0;while(1){c:{c=F[b+20>>2];f=F[b+12>>2];d=F[b+16>>2];if((c|0)>=(f|0)&d>>>0>=I[b+8>>2]|(c|0)>(f|0)){break c}f=G[F[b>>2]+d|0];d=d+1|0;c=d?c:c+1|0;F[b+16>>2]=d;F[b+20>>2]=c;d=$[F[F[a>>2]+48>>2]](a,f)|0;f=e<<2;i=f+F[a+36>>2]|0;c=F[i>>2];F[i>>2]=d;if(c){$[F[F[c>>2]+4>>2]](c)}c=F[F[h>>2]+f>>2];if(!c){break c}if(!(k=c,l=$[F[F[a>>2]+28>>2]](a)|0,m=$[F[F[a>>2]+20>>2]](a,e)|0,j=F[F[c>>2]+8>>2],$[j](k|0,l|0,m|0)|0)){break c}c=1;e=e+1|0;if((g|0)!=(e|0)){continue}break a}break}c=0}return c|0}function Xc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;g=F[a>>2];c=g+(b>>>3&536870908)|0;F[c>>2]=F[c>>2]|1<>2];e=(b|0)==-1;d=-1;a:{if(e){break a}c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;d=-1;if((c|0)==-1){break a}d=F[F[f>>2]+(c<<2)>>2]}c=F[a+12>>2];h=(d>>>3&536870908)+c|0;F[h>>2]=F[h>>2]|1<>>0)%3|0){e=b-1|0;break e}e=b+2|0;d=-1;if((e|0)==-1){break d}}d=F[F[f>>2]+(e<<2)>>2]}e=(d>>>3&536870908)+c|0;F[e>>2]=F[e>>2]|1<>2]+(b<<2)>>2];if((b|0)==-1){break b}D[a+24|0]=0;a=(b>>>3&536870908)+g|0;F[a>>2]=F[a>>2]|1<>>0)%3|0?a:b-2|0;if((a|0)!=-1){d=F[F[f>>2]+(a<<2)>>2]}a=c+(d>>>3&536870908)|0;F[a>>2]=F[a>>2]|1<>>0)%3|0){b=b-1|0;break g}b=b+2|0;a=-1;if((b|0)==-1){break f}}a=F[F[f>>2]+(b<<2)>>2]}b=1<>>3&536870908)|0;c=F[a>>2];break c}a=c+536870908|0;b=F[c+536870908>>2];c=-2147483648}F[a>>2]=b|c}}function zc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=M(0),f=M(0),g=M(0),h=M(0),i=M(0),j=0,k=M(0),l=M(0),m=M(0),n=M(0),o=0;a:{if(F[c+28>>2]!=9|G[c+24|0]!=3){break a}a=F[a+4>>2];if(a-2>>>0>28){break a}o=1;j=F[c+80>>2];if(!j){break a}k=M(M(2)/M((1<>2]>>2]+F[c+48>>2]|0;a=F[F[b>>2]>>2]+F[b+48>>2]|0;b=0;while(1){g=M(0);l=M(0);m=M(0);e=M(M(M(F[a>>2])*k)+M(-1));f=M(M(M(F[a+4>>2])*k)+M(-1));i=M(M(M(1)-M(N(e)))-M(N(f)));h=M(Q(M(-i),M(0)));n=M(-h);f=M(f+(f>>8;D[c+10|0]=d>>>16;D[c+11|0]=d>>>24;d=(w(l),y(2));D[c+4|0]=d;D[c+5|0]=d>>>8;D[c+6|0]=d>>>16;D[c+7|0]=d>>>24;d=(w(g),y(2));D[c|0]=d;D[c+1|0]=d>>>8;D[c+2|0]=d>>>16;D[c+3|0]=d>>>24;c=c+12|0;b=b+1|0;if((j|0)!=(b|0)){continue}break}}return o|0}function Md(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=Z-16|0;Z=g;a:{if(!Sa(1,g+8|0,b)){break a}d=F[b+8>>2];e=F[b+16>>2];f=d-e|0;h=F[g+12>>2];c=d>>>0>>0;d=F[b+20>>2];i=F[b+12>>2]-(c+d|0)|0;c=F[g+8>>2];if((h|0)==(i|0)&c>>>0>f>>>0|h>>>0>i>>>0){break a}d=d+h|0;f=c+e|0;d=f>>>0>>0?d+1|0:d;F[b+16>>2]=f;F[b+20>>2]=d;if((c|0)<=0){break a}b=F[b>>2]+e|0;F[a+40>>2]=b;e=c-1|0;d=b+e|0;f=G[d|0];b:{if(f>>>0<=63){F[a+44>>2]=e;b=G[d|0]&63;break b}c:{switch((f>>>6|0)-1|0){case 0:if(c>>>0<2){break a}c=c-2|0;F[a+44>>2]=c;b=b+c|0;b=G[b+1|0]<<8&16128|G[b|0];break b;case 1:if(c>>>0<3){break a}c=c-3|0;F[a+44>>2]=c;b=b+c|0;b=G[b+1|0]<<8|G[b+2|0]<<16&4128768|G[b|0];break b;default:break c}}c=c-4|0;F[a+44>>2]=c;b=b+c|0;b=(G[b|0]|G[b+1|0]<<8|(G[b+2|0]<<16|G[b+3|0]<<24))&1073741823}F[a+48>>2]=b+16384;j=b>>>0<4177920}Z=g+16|0;return j}function Tf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a:{a=Z-32|0;Z=a;e=ya(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){g=(e|15)+1|0;f=ka(g);F[a+24>>2]=g|-2147483648;F[a+16>>2]=f;F[a+20>>2]=e;g=e+f|0;break c}D[a+27|0]=e;f=a+16|0;g=e+f|0;if(!e){break b}}la(f,c,e)}D[g|0]=0;F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;d:{c=Ya(b,a+16|0);if((c|0)==(b+4|0)){break d}b=F[c+28>>2];e=F[c+32>>2];if((b|0)==(e|0)){break d}b=e-b|0;if(b&3){break d}e=b>>>2|0;f=F[a+4>>2];b=F[a>>2];g=f-b>>2;e:{if(e>>>0>g>>>0){qa(a,e-g|0);b=F[a>>2];f=F[a+4>>2];break e}if(e>>>0>=g>>>0){break e}f=(e<<2)+b|0;F[a+4>>2]=f}if((b|0)!=(f|0)){e=b;b=F[c+28>>2];la(e,b,F[c+32>>2]-b|0);break d}ta();v()}b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d>>2]=F[a>>2];F[d+4>>2]=F[a+4>>2];F[d+8>>2]=F[a+8>>2];if(D[a+27|0]<0){ja(F[a+16>>2])}Z=a+32|0;break a}za();v()}}function ud(a){a=a|0;var b=0,c=0,d=0,e=0;F[a>>2]=8284;d=F[a+368>>2];F[a+368>>2]=0;if(d){e=d-4|0;b=F[e>>2];if(b){c=(b<<4)+d|0;while(1){c=c-16|0;if((d|0)!=(c|0)){continue}break}}ja(e)}td(a+216|0);b=F[a+196>>2];if(b){F[a+200>>2]=b;ja(b)}b=F[a+184>>2];if(b){F[a+188>>2]=b;ja(b)}b=F[a+172>>2];if(b){F[a+176>>2]=b;ja(b)}b=F[a+160>>2];if(b){F[a+164>>2]=b;ja(b)}c=F[a+144>>2];if(c){while(1){b=F[c>>2];ja(c);c=b;if(b){continue}break}}b=F[a+136>>2];F[a+136>>2]=0;if(b){ja(b)}b=F[a+120>>2];if(b){ja(b)}b=F[a+108>>2];if(b){ja(b)}b=F[a+96>>2];if(b){ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+60>>2];if(b){ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}b=F[a+36>>2];if(b){F[a+40>>2]=b;ja(b)}b=F[a+24>>2];if(b){F[a+28>>2]=b;ja(b)}b=F[a+12>>2];if(b){F[a+16>>2]=b;ja(b)}b=F[a+8>>2];F[a+8>>2]=0;if(b){Za(b)}return a|0}function Vf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=Z-16|0;Z=d;a:{e=ya(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){f=(e|15)+1|0;a=ka(f);F[d+8>>2]=f|-2147483648;F[d>>2]=a;F[d+4>>2]=e;f=a+e|0;break c}D[d+11|0]=e;f=d+e|0;a=d;if(!e){break b}}la(a,c,e)}D[f|0]=0;c=G[d+11|0];e=c<<24>>24;b=F[b+4>>2];a=0;d:{if(!b){break d}a=c;c=(e|0)<0;a=c?F[d+4>>2]:a;f=c?F[d>>2]:d;while(1){c=G[b+27|0];g=c<<24>>24<0;c=g?F[b+20>>2]:c;i=c>>>0>>0;e:{f:{g:{h:{i:{j:{h=i?c:a;if(h){g=g?F[b+16>>2]:b+16|0;j=sa(f,g,h);if(j){break j}if(a>>>0>=c>>>0){break i}break e}if(a>>>0>=c>>>0){break h}break e}if((j|0)<0){break e}}c=sa(g,f,h);if(c){break g}}if(i){break f}a=1;break d}if((c|0)<0){break f}a=1;break d}b=b+4|0}b=F[b>>2];if(b){continue}break}a=0}if((e|0)<0){ja(F[d>>2])}Z=d+16|0;break a}za();v()}return a|0}function lc(a,b){var c=0,d=0;c=F[b+8>>2];F[a+4>>2]=F[b+4>>2];F[a+8>>2]=c;F[a+20>>2]=F[b+20>>2];c=F[b+16>>2];F[a+12>>2]=F[b+12>>2];F[a+16>>2]=c;a:{b:{if((a|0)!=(b|0)){c=F[b+28>>2];if(c){d=F[a+24>>2];if(F[a+32>>2]<<5>>>0>>0){if(d){ja(d);F[a+32>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;c=F[b+28>>2]}if((c|0)<0){break b}c=(c-1>>>5|0)+1|0;d=ka(c<<2);F[a+32>>2]=c;F[a+28>>2]=0;F[a+24>>2]=d;c=F[b+28>>2]}pa(d,F[b+24>>2],(c-1>>>3&536870908)+4|0);c=F[b+28>>2]}else{c=0}F[a+28>>2]=c;c=F[b+40>>2];if(c){d=F[a+36>>2];if(F[a+44>>2]<<5>>>0>>0){if(d){ja(d);F[a+44>>2]=0;F[a+36>>2]=0;F[a+40>>2]=0;c=F[b+40>>2]}if((c|0)<0){break a}c=(c-1>>>5|0)+1|0;d=ka(c<<2);F[a+44>>2]=c;F[a+40>>2]=0;F[a+36>>2]=d;c=F[b+40>>2]}pa(d,F[b+36>>2],(c-1>>>3&536870908)+4|0);b=F[b+40>>2]}else{b=0}F[a+40>>2]=b}return}na();v()}na();v()}function nc(a){var b=0,c=0,d=0;b=F[a+8>>2];d=F[a>>2];a:{if(G[a+12|0]){b:{c:{d:{e:{if((b|0)==-1){break e}c=b+1|0;b=(c>>>0)%3|0?c:b-2|0;if((b|0)==-1){break e}b=F[F[d+12>>2]+(b<<2)>>2];if((b|0)!=-1){break d}}F[a+8>>2]=-1;break c}c=b+1|0;b=(c>>>0)%3|0?c:b-2|0;F[a+8>>2]=b;if((b|0)!=-1){break b}}c=F[a+4>>2];b=-1;f:{if((c|0)==-1){break f}g:{if((c>>>0)%3|0){c=c-1|0;break g}c=c+2|0;b=-1;if((c|0)==-1){break f}}c=F[F[d+12>>2]+(c<<2)>>2];b=-1;if((c|0)==-1){break f}b=c-1|0;if((c>>>0)%3|0){break f}b=c+2|0}D[a+12|0]=0;F[a+8>>2]=b;return}if((b|0)!=F[a+4>>2]){break a}F[a+8>>2]=-1;return}c=-1;h:{if((b|0)==-1){break h}i:{if((b>>>0)%3|0){b=b-1|0;break i}b=b+2|0;c=-1;if((b|0)==-1){break h}}b=F[F[d+12>>2]+(b<<2)>>2];c=-1;if((b|0)==-1){break h}c=b-1|0;if((b>>>0)%3|0){break h}c=b+2|0}F[a+8>>2]=c}}function Od(a){var b=0,c=0,d=0;b=ka(32);D[b+26|0]=0;c=G[1475]|G[1476]<<8;D[b+24|0]=c;D[b+25|0]=c>>>8;c=G[1471]|G[1472]<<8|(G[1473]<<16|G[1474]<<24);d=G[1467]|G[1468]<<8|(G[1469]<<16|G[1470]<<24);D[b+16|0]=d;D[b+17|0]=d>>>8;D[b+18|0]=d>>>16;D[b+19|0]=d>>>24;D[b+20|0]=c;D[b+21|0]=c>>>8;D[b+22|0]=c>>>16;D[b+23|0]=c>>>24;c=G[1463]|G[1464]<<8|(G[1465]<<16|G[1466]<<24);d=G[1459]|G[1460]<<8|(G[1461]<<16|G[1462]<<24);D[b+8|0]=d;D[b+9|0]=d>>>8;D[b+10|0]=d>>>16;D[b+11|0]=d>>>24;D[b+12|0]=c;D[b+13|0]=c>>>8;D[b+14|0]=c>>>16;D[b+15|0]=c>>>24;c=G[1455]|G[1456]<<8|(G[1457]<<16|G[1458]<<24);d=G[1451]|G[1452]<<8|(G[1453]<<16|G[1454]<<24);D[b|0]=d;D[b+1|0]=d>>>8;D[b+2|0]=d>>>16;D[b+3|0]=d>>>24;D[b+4|0]=c;D[b+5|0]=c>>>8;D[b+6|0]=c>>>16;D[b+7|0]=c>>>24;F[a>>2]=-1;ra(a+4|0,b,26);ja(b)}function Kg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=F[a+4>>2];d=F[e>>2];a:{b=F[a+12>>2];c=F[b+56>>2]-F[b+52>>2]|0;f=c>>2;b:{if(f>>>0<=F[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=F[e+4>>2];c=ka(c);f=c+(f<<2)|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[e+8>>2]=f;F[e+4>>2]=g;F[e>>2]=c;if(!d){break b}ja(d)}e=a+8|0;b=F[a+76>>2];c:{if(b){d=F[b>>2];if((d|0)==F[b+4>>2]){return 1}b=0;while(1){c=od(e,F[(b<<2)+d>>2]);if(!c){break c}f=F[a+76>>2];d=F[f>>2];b=b+1|0;if(b>>>0>2]-d>>2>>>0){continue}break}break c}c=1;a=F[F[a+12>>2]+64>>2];a=F[a+4>>2]-F[a>>2]|0;if(a>>>0<12){break c}a=(a>>2>>>0)/3|0;b=0;while(1){c=od(e,L(b,3));if(!c){break c}b=b+1|0;if((a|0)!=(b|0)){continue}break}}return c|0}na();v()}function Qg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;e=F[a+4>>2];d=F[e>>2];a:{b=F[a+12>>2];c=F[b+28>>2]-F[b+24>>2]|0;f=c>>2;b:{if(f>>>0<=F[e+8>>2]-d>>2>>>0){break b}if((c|0)<0){break a}b=F[e+4>>2];c=ka(c);f=c+(f<<2)|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[e+8>>2]=f;F[e+4>>2]=g;F[e>>2]=c;if(!d){break b}ja(d)}e=a+8|0;b=F[a+76>>2];c:{if(b){d=F[b>>2];if((d|0)==F[b+4>>2]){return 1}b=0;while(1){c=pd(e,F[(b<<2)+d>>2]);if(!c){break c}f=F[a+76>>2];d=F[f>>2];b=b+1|0;if(b>>>0>2]-d>>2>>>0){continue}break}break c}c=1;a=F[a+12>>2];a=F[a+4>>2]-F[a>>2]|0;if(a>>>0<12){break c}a=(a>>2>>>0)/3|0;b=0;while(1){c=pd(e,L(b,3));if(!c){break c}b=b+1|0;if((a|0)!=(b|0)){continue}break}}return c|0}na();v()}function pa(a,b,c){var d=0,e=0;a:{if((a|0)==(b|0)){break a}e=a+c|0;if(b-e>>>0<=0-(c<<1)>>>0){return la(a,b,c)}d=(a^b)&3;b:{c:{if(a>>>0>>0){if(d){d=a;break b}if(!(a&3)){d=a;break c}d=a;while(1){if(!c){break a}D[d|0]=G[b|0];b=b+1|0;c=c-1|0;d=d+1|0;if(d&3){continue}break}break c}d:{if(d){break d}if(e&3){while(1){if(!c){break a}c=c-1|0;d=c+a|0;D[d|0]=G[b+c|0];if(d&3){continue}break}}if(c>>>0<=3){break d}while(1){c=c-4|0;F[c+a>>2]=F[b+c>>2];if(c>>>0>3){continue}break}}if(!c){break a}while(1){c=c-1|0;D[c+a|0]=G[b+c|0];if(c){continue}break}break a}if(c>>>0<=3){break b}while(1){F[d>>2]=F[b>>2];b=b+4|0;d=d+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}while(1){D[d|0]=G[b|0];d=d+1|0;b=b+1|0;c=c-1|0;if(c){continue}break}}return a}function Pb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=F[a+8>>2];c=F[a+4>>2];if(d-c>>2>>>0>=b>>>0){if(b){b=b<<2;c=ma(c,0,b)+b|0}F[a+4>>2]=c;return}a:{b:{c:{g=F[a>>2];f=c-g>>2;e=f+b|0;if(e>>>0<1073741824){d=d-g|0;h=d>>>1|0;e=d>>>0>=2147483644?1073741823:e>>>0>>0?h:e;if(e){if(e>>>0>=1073741824){break c}i=ka(e<<2)}d=(f<<2)+i|0;f=b<<2;b=ma(d,0,f);f=b+f|0;e=(e<<2)+i|0;if((c|0)==(g|0)){break b}while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;d=d-4|0;F[d>>2]=b;if((c|0)!=(g|0)){continue}break}F[a+8>>2]=e;b=F[a+4>>2];F[a+4>>2]=f;c=F[a>>2];F[a>>2]=d;if((b|0)==(c|0)){break a}while(1){b=b-4|0;a=F[b>>2];F[b>>2]=0;if(a){$[F[F[a>>2]+4>>2]](a)}if((b|0)!=(c|0)){continue}break}break a}na();v()}oa();v()}F[a+8>>2]=e;F[a+4>>2]=f;F[a>>2]=b}if(c){ja(c)}}function Yd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=F[b+8>>2];d=F[b+12>>2];g=d;d=F[b+20>>2];k=d;h=F[b+16>>2];c=h+4|0;d=c>>>0<4?d+1|0:d;i=c;a:{if(c>>>0>e>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}j=F[b>>2];c=j+h|0;f=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[b+16>>2]=i;F[b+20>>2]=d;c=e;e=k;d=h+8|0;e=d>>>0<8?e+1|0:e;if(c>>>0>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break a}c=i+j|0;c=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[b+16>>2]=d;F[b+20>>2]=e;if((c|0)<(f|0)){break a}F[a+16>>2]=c;F[a+12>>2]=f;d=(c>>31)-((f>>31)+(c>>>0>>0)|0)|0;e=c-f|0;if(!d&e>>>0>2147483646|d){break a}d=e+1|0;F[a+20>>2]=d;e=d>>>1|0;F[a+24>>2]=e;F[a+28>>2]=0-e;if(!(d&1)){F[a+24>>2]=e-1}l=Aa(a+112|0,b)}return l|0}function Wc(a,b){var c=0,d=0,e=0,f=0;d=-1;e=-1;f=-1;a:{b:{if((b|0)==-1){break b}e=F[F[F[a+4>>2]+12>>2]+(b<<2)>>2];c=b+1|0;c=(c>>>0)%3|0?c:b-2|0;if((c|0)>=0){f=(c>>>0)/3|0;f=F[(F[F[a>>2]+96>>2]+L(f,12)|0)+(c-L(f,3)<<2)>>2]}c:{if((e|0)==-1){break c}c=((e>>>0)%3|0?-1:2)+e|0;if((c|0)<0){break c}d=(c>>>0)/3|0;d=F[(F[F[a>>2]+96>>2]+L(d,12)|0)+(c-L(d,3)<<2)>>2]}c=-1;if((d|0)!=(f|0)){break a}f=-1;d:{b=((b>>>0)%3|0?-1:2)+b|0;if((b|0)>=0){d=(b>>>0)/3|0;d=F[(F[F[a>>2]+96>>2]+L(d,12)|0)+(b-L(d,3)<<2)>>2];if((e|0)==-1){break b}break d}d=-1;if((e|0)!=-1){break d}break b}b=e+1|0;b=(b>>>0)%3|0?b:e-2|0;if((b|0)<0){break b}c=F[F[a>>2]+96>>2];a=(b>>>0)/3|0;f=F[(c+L(a,12)|0)+(b-L(a,3)<<2)>>2]}c=(d|0)!=(f|0)?-1:e}return c}function Fc(a,b){var c=0,d=0,e=0;c=Z+-64|0;Z=c;d=F[a>>2];e=F[d-4>>2];d=F[d-8>>2];F[c+32>>2]=0;F[c+36>>2]=0;F[c+40>>2]=0;F[c+44>>2]=0;F[c+48>>2]=0;F[c+52>>2]=0;D[c+55|0]=0;D[c+56|0]=0;D[c+57|0]=0;D[c+58|0]=0;D[c+59|0]=0;D[c+60|0]=0;D[c+61|0]=0;D[c+62|0]=0;F[c+24>>2]=0;F[c+28>>2]=0;F[c+20>>2]=0;F[c+16>>2]=11020;F[c+12>>2]=a;F[c+8>>2]=b;a=a+d|0;d=0;a:{if(La(e,b,0)){F[c+56>>2]=1;$[F[F[e>>2]+20>>2]](e,c+8|0,a,a,1,0);d=F[c+32>>2]==1?a:0;break a}$[F[F[e>>2]+24>>2]](e,c+8|0,a,1,0);b:{switch(F[c+44>>2]){case 0:d=F[c+48>>2]==1?F[c+36>>2]==1?F[c+40>>2]==1?F[c+28>>2]:0:0:0;break a;case 1:break b;default:break a}}if(F[c+32>>2]!=1){if(F[c+48>>2]|F[c+36>>2]!=1|F[c+40>>2]!=1){break a}}d=F[c+24>>2]}Z=c- -64|0;return d}function ma(a,b,c){var d=0,e=0,f=0,g=0;a:{if(!c){break a}D[a|0]=b;d=a+c|0;D[d-1|0]=b;if(c>>>0<3){break a}D[a+2|0]=b;D[a+1|0]=b;D[d-3|0]=b;D[d-2|0]=b;if(c>>>0<7){break a}D[a+3|0]=b;D[d-4|0]=b;if(c>>>0<9){break a}d=0-a&3;e=d+a|0;b=L(b&255,16843009);F[e>>2]=b;d=c-d&-4;c=d+e|0;F[c-4>>2]=b;if(d>>>0<9){break a}F[e+8>>2]=b;F[e+4>>2]=b;F[c-8>>2]=b;F[c-12>>2]=b;if(d>>>0<25){break a}F[e+24>>2]=b;F[e+20>>2]=b;F[e+16>>2]=b;F[e+12>>2]=b;F[c-16>>2]=b;F[c-20>>2]=b;F[c-24>>2]=b;F[c-28>>2]=b;g=e&4|24;c=d-g|0;if(c>>>0<32){break a}d=ki(b,0,1,1);f=_;b=e+g|0;while(1){F[b+24>>2]=d;F[b+28>>2]=f;F[b+16>>2]=d;F[b+20>>2]=f;F[b+8>>2]=d;F[b+12>>2]=f;F[b>>2]=d;F[b+4>>2]=f;b=b+32|0;c=c-32|0;if(c>>>0>31){continue}break}}return a}function ie(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=F[b+8>>2];e=F[b+12>>2];g=e;e=F[b+20>>2];k=e;h=F[b+16>>2];c=h+4|0;e=c>>>0<4?e+1|0:e;i=c;a:{if(c>>>0>d>>>0&(e|0)>=(g|0)|(e|0)>(g|0)){break a}j=F[b>>2];c=j+h|0;f=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[b+16>>2]=i;F[b+20>>2]=e;c=d;d=k;e=h+8|0;d=e>>>0<8?d+1|0:d;if(c>>>0>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}c=i+j|0;c=G[c|0]|G[c+1|0]<<8|(G[c+2|0]<<16|G[c+3|0]<<24);F[b+16>>2]=e;F[b+20>>2]=d;if((c|0)<(f|0)){break a}F[a+16>>2]=c;F[a+12>>2]=f;d=(c>>31)-((f>>31)+(c>>>0>>0)|0)|0;b=c-f|0;if(!d&b>>>0>2147483646|d){break a}l=1;d=b+1|0;F[a+20>>2]=d;b=d>>>1|0;F[a+24>>2]=b;F[a+28>>2]=0-b;if(d&1){break a}F[a+24>>2]=b-1}return l|0}function Uc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=Z-16|0;Z=d;f=F[a+24>>2];k=F[a+28>>2];a:{if((f|0)!=(k|0)){while(1){F[d+8>>2]=0;F[d>>2]=0;F[d+4>>2]=0;a=Sc(F[f>>2],b,d);g=G[d+11|0];h=g<<24>>24;i=3;b:{c:{d:{if(!a){break d}i=0;a=G[c+11|0];e=a<<24>>24;j=(h|0)<0?F[d+4>>2]:g;if((j|0)!=(((e|0)<0?F[c+4>>2]:a)|0)){break d}a=(e|0)<0?F[c>>2]:c;e=(h|0)<0;e:{if(!e){e=d;if(!h){break e}while(1){if(G[e|0]!=G[a|0]){break d}a=a+1|0;e=e+1|0;g=g-1|0;if(g){continue}break}break e}if(!j){break e}if(sa(e?F[d>>2]:d,a,j)){break c}}l=F[f>>2];i=1}if((h|0)>=0){break b}}ja(F[d>>2])}f:{switch(i|0){case 0:case 3:break f;default:break a}}f=f+4|0;if((k|0)!=(f|0)){continue}break}}l=0}Z=d+16|0;return l}function gb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=c-b|0;h=f>>2;d=F[a+8>>2];e=F[a>>2];if(h>>>0<=d-e>>2>>>0){d=F[a+4>>2];g=d-e|0;f=g+b|0;i=g>>2;g=i>>>0>>0?f:c;if((g|0)!=(b|0)){while(1){F[e>>2]=F[b>>2];e=e+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(h>>>0>i>>>0){if((c|0)!=(g|0)){while(1){F[d>>2]=F[f>>2];d=d+4|0;f=f+4|0;if((f|0)!=(c|0)){continue}break}}F[a+4>>2]=d;return}F[a+4>>2]=e;return}if(e){F[a+4>>2]=e;ja(e);F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;d=0}a:{if((f|0)<0){break a}e=d>>>1|0;d=d>>>0>=2147483644?1073741823:e>>>0>h>>>0?e:h;if(d>>>0>=1073741824){break a}e=d<<2;d=ka(e);F[a>>2]=d;F[a+8>>2]=d+e;if((b|0)!=(c|0)){c=b;b=(f-4&-4)+4|0;d=la(d,c,b)+b|0}F[a+4>>2]=d;return}na();v()}function Ea(a,b,c){var d=0,e=0,f=0;e=Z-16|0;Z=e;F[a+4>>2]=0;a:{b:{if(!b){break b}f=F[a+8>>2];d=f<<5;c:{if(d>>>0>=b>>>0){F[a+4>>2]=b;break c}F[e+8>>2]=0;F[e>>2]=0;F[e+4>>2]=0;if((b|0)<0){break a}if(d>>>0<=1073741822){f=f<<6;d=b+31&-32;d=d>>>0>>0?f:d}else{d=2147483647}$a(e,d);f=F[a>>2];F[a>>2]=F[e>>2];F[e>>2]=f;d=F[a+4>>2];F[a+4>>2]=b;F[e+4>>2]=d;d=F[a+8>>2];F[a+8>>2]=F[e+8>>2];F[e+8>>2]=d;if(!f){break c}ja(f)}d=b>>>5|0;a=F[a>>2];if(G[c|0]){if(b>>>0>=32){ma(a,255,d<<2)}if((b&-32)==(b|0)){break b}a=a+(d<<2)|0;F[a>>2]=F[a>>2]|-1>>>32-(b&31);break b}if(b>>>0>=32){ma(a,0,d<<2)}if((b&-32)==(b|0)){break b}a=a+(d<<2)|0;F[a>>2]=F[a>>2]&(-1>>>32-(b&31)^-1)}Z=e+16|0;return}na();v()}function If(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=Z-32|0;Z=e;a:{b:{f=ya(c);if(f>>>0<2147483632){c:{d:{if(f>>>0>=11){a=(f|15)+1|0;g=ka(a);F[e+24>>2]=a|-2147483648;F[e+16>>2]=g;F[e+20>>2]=f;a=f+g|0;break d}D[e+27|0]=f;g=e+16|0;a=f+g|0;if(!f){break c}}la(g,c,f)}D[a|0]=0;c=ya(d);if(c>>>0>=2147483632){break b}e:{f:{if(c>>>0>=11){f=(c|15)+1|0;a=ka(f);F[e+8>>2]=f|-2147483648;F[e>>2]=a;F[e+4>>2]=c;g=a+c|0;break f}D[e+11|0]=c;g=c+e|0;a=e;if(!c){break e}}la(a,d,c)}D[g|0]=0;c=F[b+4>>2];a=-1;g:{if(!c){break g}c=Uc(c,e+16|0,e);a=-1;if(!c){break g}a=Pc(b,F[c+24>>2])}if(D[e+11|0]<0){ja(F[e>>2])}if(D[e+27|0]<0){ja(F[e+16>>2])}Z=e+32|0;break a}za();v()}za();v()}return a|0}function se(a,b){a=a|0;b=b|0;a=0;a:{switch(b|0){case 0:a=ka(20);F[a+12>>2]=-1;F[a+16>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1920;return a|0;case 1:a=ka(24);F[a+12>>2]=-1;F[a+16>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1920;F[a+20>>2]=0;F[a>>2]=2136;return a|0;case 2:a=ka(48);F[a+12>>2]=-1;F[a+16>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1920;F[a+20>>2]=0;F[a>>2]=2136;F[a+24>>2]=1624;F[a>>2]=7948;F[a+32>>2]=0;F[a+36>>2]=0;F[a+28>>2]=-1;F[a+40>>2]=0;F[a+44>>2]=0;return a|0;case 3:a=ka(32);F[a+12>>2]=-1;F[a+16>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1920;F[a+20>>2]=0;F[a>>2]=2136;F[a+24>>2]=1032;F[a>>2]=5812;F[a+28>>2]=-1;break;default:break a}}return a|0}function Be(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=F[b>>2];b=F[b+4>>2];d=F[F[a+8>>2]+40>>2];j=d;m=ka((d|0)<0?-1:d);i=b-f|0;e=1;a:{if((i|0)<4){break a}b=0;g=F[c+16>>2];k=d;f=g+d|0;d=0+F[c+20>>2]|0;d=f>>>0>>0?d+1|0:d;h=F[c+12>>2];e=0;if(I[c+8>>2]>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break a}e=i>>2;i=(e|0)<=1?1:e;while(1){b:{g=la(m,F[c>>2]+g|0,j);F[c+16>>2]=f;F[c+20>>2]=d;la(F[F[F[a+8>>2]+64>>2]>>2]+b|0,g,j);l=l+1|0;if((i|0)==(l|0)){break b}b=b+j|0;d=n+F[c+20>>2]|0;g=F[c+16>>2];f=k+g|0;d=f>>>0>>0?d+1|0:d;h=F[c+12>>2];if((d|0)<=(h|0)&I[c+8>>2]>=f>>>0|(d|0)<(h|0)){continue}}break}e=(e|0)<=(l|0)}ja(m);return e|0}function mh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;F[b>>2]=1;f=b+8|0;c=F[b+8>>2];d=F[b+12>>2]-c|0;if(d>>>0<=4294967291){Db(f,d+4|0);c=F[f>>2]}c=c+d|0;d=F[a+4>>2];D[c|0]=d;D[c+1|0]=d>>>8;D[c+2|0]=d>>>16;D[c+3|0]=d>>>24;c=F[a+8>>2];if((c|0)!=F[a+12>>2]){d=0;while(1){g=(d<<2)+c|0;c=F[b+8>>2];e=F[b+12>>2]-c|0;if(e>>>0<=4294967291){Db(f,e+4|0);c=F[f>>2]}c=c+e|0;e=F[g>>2];D[c|0]=e;D[c+1|0]=e>>>8;D[c+2|0]=e>>>16;D[c+3|0]=e>>>24;d=d+1|0;c=F[a+8>>2];if(d>>>0>2]-c>>2>>>0){continue}break}}c=F[b+12>>2];b=F[b+8>>2];c=c-b|0;if(c>>>0<=4294967291){Db(f,c+4|0);b=F[f>>2]}b=b+c|0;a=F[a+20>>2];D[b|0]=a;D[b+1|0]=a>>>8;D[b+2|0]=a>>>16;D[b+3|0]=a>>>24}function mb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=F[a+4>>2];if((c|0)!=F[a+8>>2]){e=F[b+4>>2];F[c>>2]=F[b>>2];F[c+4>>2]=e;F[c+8>>2]=F[b+8>>2];F[a+4>>2]=c+12;return}a:{g=F[a>>2];d=(c-g|0)/12|0;e=d+1|0;if(e>>>0<357913942){f=d<<1;f=d>>>0>=178956970?357913941:e>>>0>>0?f:e;if(f){if(f>>>0>=357913942){break a}e=ka(L(f,12))}else{e=0}d=e+L(d,12)|0;h=F[b+4>>2];F[d>>2]=F[b>>2];F[d+4>>2]=h;F[d+8>>2]=F[b+8>>2];b=d+12|0;if((c|0)!=(g|0)){while(1){c=c-12|0;h=F[c+4>>2];d=d-12|0;F[d>>2]=F[c>>2];F[d+4>>2]=h;F[d+8>>2]=F[c+8>>2];if((c|0)!=(g|0)){continue}break}c=F[a>>2]}F[a+8>>2]=e+L(f,12);F[a+4>>2]=b;F[a>>2]=d;if(c){ja(c)}return}na();v()}oa();v()}function ne(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=F[c+12>>2];f=h;e=F[c+20>>2];i=F[c+8>>2];g=F[c+16>>2];a:{if((f|0)<=(e|0)&i>>>0<=g>>>0|(e|0)>(f|0)){break a}j=F[c>>2];k=D[j+g|0];d=e;f=g+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;b:{if((k|0)==-2){break b}if((d|0)>=(h|0)&f>>>0>=i>>>0|(d|0)>(h|0)){break a}d=D[f+j|0];g=g+2|0;e=g>>>0<2?e+1|0:e;F[c+16>>2]=g;F[c+20>>2]=e;if((d-4&255)>>>0<251){break a}e=$[F[F[a>>2]+40>>2]](a,k,d)|0;d=F[a+20>>2];F[a+20>>2]=e;if(!d){break b}$[F[F[d>>2]+4>>2]](d)}d=F[a+20>>2];if(d){if(!($[F[F[a>>2]+28>>2]](a,d)|0)){break a}}l=$[F[F[a>>2]+36>>2]](a,b,c)|0}return l|0}function Bf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:{if(I[b+80>>2]>65535){break a}a=F[b+100>>2];b=F[b+96>>2];e=(a-b|0)/12|0;f=L(e,6);g=(f|0)==(c|0);if((a|0)==(b|0)|(c|0)!=(f|0)){break a}g=1;c=e>>>0<=1?1:e;i=c&1;a=0;if(e>>>0>=2){j=c&-2;c=0;while(1){f=L(a,6);h=f+d|0;e=b+L(a,12)|0;E[h>>1]=F[e>>2];E[(f|2)+d>>1]=F[e+4>>2];E[h+4>>1]=F[e+8>>2];f=a|1;e=L(f,6)+d|0;f=b+L(f,12)|0;E[e>>1]=F[f>>2];E[e+2>>1]=F[f+4>>2];E[e+4>>1]=F[f+8>>2];a=a+2|0;c=c+2|0;if((j|0)!=(c|0)){continue}break}}if(!i){break a}c=L(a,6)+d|0;a=b+L(a,12)|0;E[c>>1]=F[a>>2];E[c+2>>1]=F[a+4>>2];E[c+4>>1]=F[a+8>>2]}return g|0}function Gh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=Z-32|0;Z=f;h=e>>>0>1073741823?-1:e<<2;h=ma(ka(h),0,h);g=F[b>>2];i=F[b+4>>2];k=F[h+4>>2];F[f+16>>2]=F[h>>2];F[f+20>>2]=k;F[f+8>>2]=g;F[f+12>>2]=i;i=a+8|0;Jb(f+24|0,i,f+16|0,f+8|0);F[c>>2]=F[f+24>>2];F[c+4>>2]=F[f+28>>2];if((d|0)>(e|0)){k=0-e<<2;a=e;while(1){g=a<<2;j=g+b|0;m=F[j>>2];j=F[j+4>>2];g=c+g|0;l=g+k|0;n=F[l+4>>2];F[f+16>>2]=F[l>>2];F[f+20>>2]=n;F[f+8>>2]=m;F[f+12>>2]=j;Jb(f+24|0,i,f+16|0,f+8|0);F[g>>2]=F[f+24>>2];F[g+4>>2]=F[f+28>>2];a=a+e|0;if((d|0)>(a|0)){continue}break}}ja(h);Z=f+32|0;return 1}function Sf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;a=Z-32|0;Z=a;F[a+24>>2]=0;F[a+28>>2]=0;a:{d=ya(c);if(d>>>0<2147483632){b:{c:{if(d>>>0>=11){e=(d|15)+1|0;f=ka(e);F[a+16>>2]=e|-2147483648;F[a+8>>2]=f;F[a+12>>2]=d;e=d+f|0;break c}D[a+19|0]=d;f=a+8|0;e=f+d|0;if(!d){break b}}la(f,c,d)}D[e|0]=0;c=b+4|0;b=Ya(b,a+8|0);d:{if((c|0)==(b|0)){break d}c=F[b+32>>2];b=F[b+28>>2];if((c-b|0)!=8){break d}c=G[b+4|0]|G[b+5|0]<<8|(G[b+6|0]<<16|G[b+7|0]<<24);F[a+24>>2]=G[b|0]|G[b+1|0]<<8|(G[b+2|0]<<16|G[b+3|0]<<24);F[a+28>>2]=c}g=K[a+24>>3];if(D[a+19|0]<0){ja(F[a+8>>2])}Z=a+32|0;break a}za();v()}return+g}function Gc(a,b,c,d,e,f,g){var h=0,i=0,j=0;h=Z-16|0;Z=h;if((b^-1)+2147483631>>>0>=c>>>0){if(G[a+11|0]>>>7|0){i=F[a>>2]}else{i=a}if(b>>>0<1073741799){F[h+12>>2]=b<<1;F[h>>2]=b+c;c=Z-16|0;Z=c;Z=c+16|0;c=h+12|0;c=F[(I[h>>2]>2]?c:h)>>2];if(c>>>0>=11){j=c+16&-16;c=j-1|0;c=(c|0)==11?j:c}else{c=10}c=c+1|0}else{c=2147483631}sb(h,c);c=F[h>>2];if(f){db(c,g,f)}g=d-e|0;if((d|0)!=(e|0)){db(c+f|0,e+i|0,g)}if((b|0)!=10){ja(i)}F[a>>2]=c;F[a+8>>2]=F[a+8>>2]&-2147483648|F[h+4>>2]&2147483647;F[a+8>>2]=F[a+8>>2]|-2147483648;b=a;a=f+g|0;F[b+4>>2]=a;D[h+12|0]=0;D[a+c|0]=G[h+12|0];Z=h+16|0;return}za();v()}function _c(a,b,c){var d=0,e=0,f=0,g=0;a:{f=b>>>0<1431655766&(b|c)>=0;b:{if(!f){break b}b=L(b,3);Xb(a,b,10224);Xb(a+12|0,b,10228);d=F[a+24>>2];c:{if(F[a+32>>2]-d>>2>>>0>=c>>>0){break c}if(c>>>0>=1073741824){break a}b=F[a+28>>2];e=c<<2;c=ka(e);e=c+e|0;g=c+(b-d&-4)|0;c=g;if((b|0)!=(d|0)){while(1){c=c-4|0;b=b-4|0;F[c>>2]=F[b>>2];if((b|0)!=(d|0)){continue}break}}F[a+32>>2]=e;F[a+28>>2]=g;F[a+24>>2]=c;if(!d){break c}ja(d)}F[a+80>>2]=0;F[a+84>>2]=0;b=F[a+76>>2];F[a+76>>2]=0;if(b){ja(b)}F[a+68>>2]=0;F[a+72>>2]=0;b=a- -64|0;a=F[b>>2];F[b>>2]=0;if(!a){break b}ja(a)}return f}na();v()}function yd(a){var b=0,c=0,d=0,e=0,f=0;f=1;c=F[a+140>>2];a:{if((c|0)<=0){break a}b=c<<4;d=ka(c>>>0>268435455?-1:b|4);F[d>>2]=c;d=d+4|0;c=d+b|0;b=d;while(1){F[b>>2]=0;F[b+4>>2]=0;D[b+5|0]=0;D[b+6|0]=0;D[b+7|0]=0;D[b+8|0]=0;D[b+9|0]=0;D[b+10|0]=0;D[b+11|0]=0;D[b+12|0]=0;b=b+16|0;if((c|0)!=(b|0)){continue}break}e=F[a+136>>2];F[a+136>>2]=d;if(e){c=e-4|0;d=F[c>>2];if(d){b=(d<<4)+e|0;while(1){b=b-16|0;if((e|0)!=(b|0)){continue}break}}ja(c)}b=0;if(F[a+140>>2]<=0){break a}while(1){f=Aa(F[a+136>>2]+(b<<4)|0,a);if(!f){break a}b=b+1|0;if((b|0)>2]){continue}break}}return f} function Sd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=F[b+8>>2];c=F[b+12>>2];g=c;c=F[b+20>>2];i=c;h=F[b+16>>2];f=h+4|0;c=f>>>0<4?c+1|0:c;a:{if(d>>>0>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}e=h+F[b>>2]|0;e=G[e|0]|G[e+1|0]<<8|(G[e+2|0]<<16|G[e+3|0]<<24);F[b+16>>2]=f;F[b+20>>2]=c;f=d;d=i;c=h+8|0;d=c>>>0<8?d+1|0:d;if(c>>>0>f>>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}F[b+16>>2]=c;F[b+20>>2]=d;if(!(e&1)){break a}d=O(e)^31;if(d-1>>>0>28){break a}F[a+8>>2]=d+1;d=-2<>2]=c;F[a+12>>2]=d^-1;F[a+24>>2]=c>>1;J[a+20>>2]=M(2)/M(c|0);j=Aa(a+96|0,b)}return j|0}function bc(a,b){var c=0;c=F[b+4>>2];F[a>>2]=F[b>>2];F[a+4>>2]=c;c=F[b+60>>2];F[a+56>>2]=F[b+56>>2];F[a+60>>2]=c;c=F[b+52>>2];F[a+48>>2]=F[b+48>>2];F[a+52>>2]=c;c=F[b+44>>2];F[a+40>>2]=F[b+40>>2];F[a+44>>2]=c;c=F[b+36>>2];F[a+32>>2]=F[b+32>>2];F[a+36>>2]=c;c=F[b+28>>2];F[a+24>>2]=F[b+24>>2];F[a+28>>2]=c;c=F[b+20>>2];F[a+16>>2]=F[b+16>>2];F[a+20>>2]=c;c=F[b+12>>2];F[a+8>>2]=F[b+8>>2];F[a+12>>2]=c;F[a+88>>2]=0;F[a+64>>2]=0;F[a+68>>2]=0;F[a+72>>2]=0;F[a+76>>2]=0;D[a+77|0]=0;D[a+78|0]=0;D[a+79|0]=0;D[a+80|0]=0;D[a+81|0]=0;D[a+82|0]=0;D[a+83|0]=0;D[a+84|0]=0;return a}function ac(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if(F[a+64>>2]){break a}c=ka(32);F[c+16>>2]=0;F[c+20>>2]=0;F[c+8>>2]=0;F[c>>2]=0;F[c+4>>2]=0;F[c+24>>2]=0;F[c+28>>2]=0;d=F[a+64>>2];F[a+64>>2]=c;if(!d){break a}c=F[d>>2];if(c){F[d+4>>2]=c;ja(c)}ja(d)}d=F[a+64>>2];c=F[a+28>>2]-1|0;if(c>>>0<=10){c=F[(c<<2)+10148>>2]}else{c=-1}c=L(c,G[a+24|0]);f=c>>31;g=md(d,0,ki(c,f,b,0),_);if(g){d=F[a+64>>2];F[a>>2]=d;e=F[d+20>>2];F[a+8>>2]=F[d+16>>2];F[a+12>>2]=e;e=F[d+24>>2];d=F[d+28>>2];F[a+48>>2]=0;F[a+52>>2]=0;F[a+40>>2]=c;F[a+44>>2]=f;F[a+16>>2]=e;F[a+20>>2]=d;F[a+80>>2]=b}return g}function Af(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;a=F[b+100>>2];b=F[b+96>>2];h=a-b|0;a:{if((h|0)!=(c|0)|(a|0)==(b|0)){break a}g=(c|0)/12|0;e=g>>>0<=1?1:g;j=e&1;a=0;if(g>>>0>=2){k=e&-2;g=0;while(1){e=L(a,12);i=e+d|0;f=b+e|0;F[i>>2]=F[f>>2];F[(e|4)+d>>2]=F[f+4>>2];F[i+8>>2]=F[f+8>>2];f=L(a|1,12);e=f+d|0;f=b+f|0;F[e>>2]=F[f>>2];F[e+4>>2]=F[f+4>>2];F[e+8>>2]=F[f+8>>2];a=a+2|0;g=g+2|0;if((k|0)!=(g|0)){continue}break}}if(!j){break a}e=d;d=L(a,12);a=e+d|0;b=b+d|0;F[a>>2]=F[b>>2];F[a+4>>2]=F[b+4>>2];F[a+8>>2]=F[b+8>>2]}return(c|0)==(h|0)|0}function Kh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=F[b+8>>2];d=F[b+12>>2];g=d;d=F[b+20>>2];i=d;h=F[b+16>>2];f=h+4|0;d=f>>>0<4?d+1|0:d;a:{if(c>>>0>>0&(d|0)>=(g|0)|(d|0)>(g|0)){break a}e=h+F[b>>2]|0;e=G[e|0]|G[e+1|0]<<8|(G[e+2|0]<<16|G[e+3|0]<<24);F[b+16>>2]=f;F[b+20>>2]=d;f=c;c=i;d=h+8|0;c=d>>>0<8?c+1|0:c;if(d>>>0>f>>>0&(c|0)>=(g|0)|(c|0)>(g|0)){break a}F[b+16>>2]=d;F[b+20>>2]=c;if(!(e&1)){break a}b=O(e)^31;if(b-1>>>0>28){break a}j=1;F[a+8>>2]=b+1;b=-2<>2]=c;F[a+12>>2]=b^-1;F[a+24>>2]=c>>1;J[a+20>>2]=M(2)/M(c|0)}return j|0}function Ya(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=a+4|0;a=F[a+4>>2];a:{b:{if(!a){break b}d=G[b+11|0];c=d<<24>>24<0;g=c?F[b>>2]:b;d=c?F[b+4>>2]:d;b=f;while(1){e=G[a+27|0];c=e<<24>>24<0;e=c?F[a+20>>2]:e;h=e>>>0>d>>>0;i=h?d:e;c:{if(i){c=sa(c?F[a+16>>2]:a+16|0,g,i);if(c){break c}}c=d>>>0>e>>>0?-1:h}c=(c|0)<0;b=c?b:a;a=F[(c?a+4|0:a)>>2];if(a){continue}break}if((b|0)==(f|0)){break b}c=G[b+27|0];a=c<<24>>24<0;d:{c=a?F[b+20>>2]:c;e=c>>>0>>0?c:d;if(e){a=sa(g,a?F[b+16>>2]:b+16|0,e);if(a){break d}}if(c>>>0>d>>>0){break b}break a}if((a|0)>=0){break a}}b=f}return b}function Oe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(La(a,F[b+8>>2],e)){if(!(F[b+28>>2]==1|F[b+4>>2]!=(c|0))){F[b+28>>2]=d}return}a:{if(La(a,F[b>>2],e)){if(!(F[b+16>>2]!=(c|0)&F[b+20>>2]!=(c|0))){if((d|0)!=1){break a}F[b+32>>2]=1;return}F[b+32>>2]=d;b:{if(F[b+44>>2]==4){break b}E[b+52>>1]=0;a=F[a+8>>2];$[F[F[a>>2]+20>>2]](a,b,c,c,1,e);if(G[b+53|0]){F[b+44>>2]=3;if(!G[b+52|0]){break b}break a}F[b+44>>2]=4}F[b+20>>2]=c;F[b+40>>2]=F[b+40>>2]+1;if(F[b+36>>2]!=1|F[b+24>>2]!=2){break a}D[b+54|0]=1;return}a=F[a+8>>2];$[F[F[a>>2]+24>>2]](a,b,c,d,e)}}function Ig(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;f=ka(64);c=ka(12);F[c+8>>2]=F[F[a+4>>2]+80>>2];F[c>>2]=9968;F[c+4>>2]=0;f=yc(f,c);a:{b:{if((b|0)<0){c=f;break b}h=a+8|0;c=F[a+12>>2];e=F[a+8>>2];g=c-e>>2;c:{if((g|0)>(b|0)){break c}d=b+1|0;if(b>>>0>=g>>>0){Pb(h,d-g|0);break c}if(d>>>0>=g>>>0){break c}e=e+(d<<2)|0;if((e|0)!=(c|0)){while(1){c=c-4|0;d=F[c>>2];F[c>>2]=0;if(d){$[F[F[d>>2]+4>>2]](d)}if((c|0)!=(e|0)){continue}break}}F[a+12>>2]=e}a=F[h>>2]+(b<<2)|0;c=F[a>>2];F[a>>2]=f;if(!c){break a}}$[F[F[c>>2]+4>>2]](c)}return(b^-1)>>>31|0}function we(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=F[a+60>>2];a:{if(!c){break a}F[c+4>>2]=a+48;if(!($[F[F[c>>2]+12>>2]](c)|0)){break a}b:{c=$[F[F[a>>2]+24>>2]](a)|0;if((c|0)<=0){break b}while(1){c:{f=F[($[F[F[a>>2]+28>>2]](a)|0)+4>>2];g=$[F[F[a>>2]+20>>2]](a,d)|0;e=F[a+60>>2];if(!($[F[F[e>>2]+8>>2]](e,F[F[f+8>>2]+(g<<2)>>2])|0)){break c}d=d+1|0;if((c|0)!=(d|0)){continue}break b}break}return 0}d=0;if(!($[F[F[a>>2]+36>>2]](a,b)|0)){break a}if(!($[F[F[a>>2]+40>>2]](a,b)|0)){break a}d=$[F[F[a>>2]+44>>2]](a)|0}return d|0}function Id(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=F[a+216>>2];if((c|0)!=F[a+220>>2]){while(1){a:{c=F[L(e,144)+c>>2];if((c|0)<0){break a}d=F[a+4>>2];f=F[d+8>>2];if((c|0)>=F[d+12>>2]-f>>2){break a}d=0;c=F[(c<<2)+f>>2];if(($[F[F[c>>2]+24>>2]](c)|0)<=0){break a}while(1){if(($[F[F[c>>2]+20>>2]](c,d)|0)!=(b|0)){d=d+1|0;if(($[F[F[c>>2]+24>>2]](c)|0)>(d|0)){continue}break a}break}a=F[a+216>>2]+L(e,144)|0;return(G[a+100|0]?a+4|0:0)|0}e=e+1|0;c=F[a+216>>2];if(e>>>0<(F[a+220>>2]-c|0)/144>>>0){continue}break}}return 0}function nd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=F[a+8>>2];d=F[a+4>>2];if(c-d>>2>>>0>=b>>>0){if(b){b=b<<2;d=ma(d,0,b)+b|0}F[a+4>>2]=d;return}a:{f=F[a>>2];g=d-f>>2;e=g+b|0;if(e>>>0<1073741824){c=c-f|0;h=c>>>1|0;e=c>>>0>=2147483644?1073741823:e>>>0>>0?h:e;if(e){if(e>>>0>=1073741824){break a}i=ka(e<<2)}c=(g<<2)+i|0;b=b<<2;b=ma(c,0,b)+b|0;if((d|0)!=(f|0)){while(1){c=c-4|0;d=d-4|0;F[c>>2]=F[d>>2];if((d|0)!=(f|0)){continue}break}}F[a+8>>2]=(e<<2)+i;F[a+4>>2]=b;F[a>>2]=c;if(f){ja(f)}return}na();v()}oa();v()}function bb(a){var b=0,c=0,d=0,e=0,f=0;d=F[a+8>>2];a:{if(G[d+84|0]){break a}b=F[a+16>>2];if(!b|!G[b+84|0]){break a}c=F[d+72>>2];e=F[d+68>>2];D[b+84|0]=0;c=c-e>>2;f=F[b+68>>2];e=F[b+72>>2]-f>>2;b:{if(c>>>0>e>>>0){ab(b+68|0,c-e|0,2004);d=F[a+8>>2];break b}if(c>>>0>=e>>>0){break b}F[b+72>>2]=f+(c<<2)}if(G[d+84|0]){break a}c=F[d+68>>2];if((c|0)==F[d+72>>2]){break a}e=F[F[a+16>>2]+68>>2];b=0;while(1){f=b<<2;F[f+e>>2]=F[c+f>>2];b=b+1|0;c=F[d+68>>2];if(b>>>0>2]-c>>2>>>0){continue}break}}return F[a+16>>2]}function Lf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=Z+-64|0;Z=e;f=Ja(e+8|0);F[f+16>>2]=0;F[f+20>>2]=0;F[f>>2]=b;F[f+8>>2]=c;F[f+12>>2]=0;b=e+48|0;Pd(b,a,f,d);F[a+24>>2]=F[e+48>>2];f=a+24|0;a:{if((f|0)==(b|0)){break a}b=a+28|0;c=e+48|4;g=G[e+63|0];d=g<<24>>24;if(D[a+39|0]>=0){if((d|0)>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break a}qb(b,F[e+52>>2],F[e+56>>2]);break a}a=(d|0)<0;rb(b,a?F[e+52>>2]:c,a?F[e+56>>2]:g)}if(D[e+63|0]<0){ja(F[e+52>>2])}Z=e- -64|0;return f|0}function Jf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;a=Z-32|0;Z=a;a:{d=ya(c);if(d>>>0<2147483632){b:{c:{if(d>>>0>=11){e=(d|15)+1|0;f=ka(e);F[a+24>>2]=e|-2147483648;F[a+16>>2]=f;F[a+20>>2]=d;e=d+f|0;break c}D[a+27|0]=d;f=a+16|0;e=f+d|0;if(!d){break b}}la(f,c,d)}D[e|0]=0;D[a+4|0]=0;F[a>>2]=1701667182;D[a+11|0]=4;d=F[b+4>>2];c=-1;d:{if(!d){break d}d=Uc(d,a,a+16|0);c=-1;if(!d){break d}c=Pc(b,F[d+24>>2])}b=c;if(D[a+11|0]<0){ja(F[a>>2])}if(D[a+27|0]<0){ja(F[a+16>>2])}Z=a+32|0;break a}za();v()}return b|0}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=F[a+216>>2];if((c|0)!=F[a+220>>2]){while(1){a:{c=F[L(e,144)+c>>2];if((c|0)<0){break a}d=F[a+4>>2];f=F[d+8>>2];if((c|0)>=F[d+12>>2]-f>>2){break a}d=0;c=F[(c<<2)+f>>2];if(($[F[F[c>>2]+24>>2]](c)|0)<=0){break a}while(1){if(($[F[F[c>>2]+20>>2]](c,d)|0)!=(b|0)){d=d+1|0;if(($[F[F[c>>2]+24>>2]](c)|0)>(d|0)){continue}break a}break}return(F[a+216>>2]+L(e,144)|0)+104|0}e=e+1|0;c=F[a+216>>2];if(e>>>0<(F[a+220>>2]-c|0)/144>>>0){continue}break}}return a+184|0}function Uf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=Z-16|0;Z=d;F[d+12>>2]=0;a:{e=ya(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){f=(e|15)+1|0;a=ka(f);F[d+8>>2]=f|-2147483648;F[d>>2]=a;F[d+4>>2]=e;f=a+e|0;break c}D[d+11|0]=e;f=d+e|0;a=d;if(!e){break b}}la(a,c,e)}D[f|0]=0;a=Ya(b,d);d:{if((a|0)==(b+4|0)){break d}b=F[a+32>>2];a=F[a+28>>2];if((b-a|0)!=4){break d}F[d+12>>2]=G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24)}a=F[d+12>>2];if(D[d+11|0]<0){ja(F[d>>2])}Z=d+16|0;break a}za();v()}return a|0}function Mf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;d=Z+-64|0;Z=d;e=Ja(d+8|0);F[e+16>>2]=0;F[e+20>>2]=0;F[e>>2]=b;F[e+8>>2]=c;F[e+12>>2]=0;b=d+48|0;Od(b);F[a+24>>2]=F[d+48>>2];f=a+24|0;a:{if((b|0)==(f|0)){break a}b=a+28|0;c=d+48|4;g=G[d+63|0];e=g<<24>>24;if(D[a+39|0]>=0){if((e|0)>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break a}qb(b,F[d+52>>2],F[d+56>>2]);break a}a=(e|0)<0;rb(b,a?F[d+52>>2]:c,a?F[d+56>>2]:g)}if(D[d+63|0]<0){ja(F[d+52>>2])}Z=d- -64|0;return f|0}function Ce(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;e=1;a:{if(($[F[F[b>>2]+20>>2]](b)|0)<=0){break a}while(1){e=0;d=Qc(F[F[a+4>>2]+4>>2],$[F[F[b>>2]+24>>2]](b,f)|0);if((d|0)==-1){break a}g=F[a+4>>2];c=0;b:{if((d|0)<0){break b}h=F[g+4>>2];if((d|0)>=F[h+12>>2]-F[h+8>>2]>>2){break b}c=F[F[g+8>>2]+(F[F[g+20>>2]+(d<<2)>>2]<<2)>>2];c=$[F[F[c>>2]+32>>2]](c,d)|0}if(!c){break a}if(!($[F[F[b>>2]+28>>2]](b,c)|0)){break a}e=1;f=f+1|0;if(($[F[F[b>>2]+20>>2]](b)|0)>(f|0)){continue}break}}return e|0}function Db(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{c=F[a+4>>2];e=F[a>>2];d=c-e|0;b:{if(d>>>0>>0){g=b-d|0;f=F[a+8>>2];if(g>>>0<=f-c>>>0){h=a,i=ma(c,0,g)+g|0,F[h+4>>2]=i;break b}if((b|0)<0){break a}c=f-e|0;f=c<<1;c=c>>>0>=1073741823?2147483647:b>>>0>>0?f:b;f=ka(c);ma(f+d|0,0,g);d=pa(f,e,d);F[a+8>>2]=d+c;F[a+4>>2]=b+d;F[a>>2]=d;if(!e){break b}ja(e);break b}if(b>>>0>=d>>>0){break b}F[a+4>>2]=b+e}b=F[a+28>>2];c=b;d=b+1|0;b=F[a+24>>2]+1|0;e=b?c:d;F[a+24>>2]=b;F[a+28>>2]=e;return}na();v()}function Ma(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=F[a+4>>2];if((e|0)!=F[a+8>>2]){F[e>>2]=F[b>>2];F[a+4>>2]=e+4;return}a:{g=F[a>>2];f=e-g|0;c=f>>2;d=c+1|0;if(d>>>0<1073741824){h=c<<2;c=f>>>1|0;c=f>>>0>=2147483644?1073741823:c>>>0>d>>>0?c:d;if(c){if(c>>>0>=1073741824){break a}f=ka(c<<2)}else{f=0}d=h+f|0;F[d>>2]=F[b>>2];b=d+4|0;if((e|0)!=(g|0)){while(1){d=d-4|0;e=e-4|0;F[d>>2]=F[e>>2];if((e|0)!=(g|0)){continue}break}}F[a+8>>2]=f+(c<<2);F[a+4>>2]=b;F[a>>2]=d;if(g){ja(g)}return}na();v()}oa();v()}function va(a){F[a>>2]=-1;F[a+4>>2]=0;F[a+8>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;D[a+28|0]=1;F[a+20>>2]=0;F[a+24>>2]=0;F[a+12>>2]=0;F[a+16>>2]=0;F[a+40>>2]=0;F[a+44>>2]=0;F[a+48>>2]=0;F[a+52>>2]=0;F[a+56>>2]=0;F[a+60>>2]=0;F[a+64>>2]=0;F[a+68>>2]=0;F[a+76>>2]=0;F[a+80>>2]=0;F[a+84>>2]=0;F[a+88>>2]=0;F[a+92>>2]=0;F[a+96>>2]=0;F[a+72>>2]=a+4;F[a+104>>2]=0;F[a+108>>2]=0;D[a+100|0]=1;F[a+112>>2]=0;F[a+116>>2]=0;F[a+120>>2]=0;F[a+124>>2]=0;F[a+128>>2]=0;F[a+132>>2]=0;F[a+136>>2]=0;F[a+140>>2]=0}function Hb(a,b){var c=0,d=0,e=0,f=0;d=F[a+12>>2];c=F[a+16>>2]-d>>2;a:{if(c>>>0>>0){qa(a+12|0,b-c|0);break a}if(b>>>0>=c>>>0){break a}F[a+16>>2]=d+(b<<2)}b:{c=F[a>>2];c:{if(F[a+8>>2]-c>>2>>>0>=b>>>0){break c}if(b>>>0>=1073741824){break b}d=F[a+4>>2];e=b<<2;b=ka(e);e=b+e|0;f=b+(d-c&-4)|0;b=f;if((c|0)!=(d|0)){while(1){b=b-4|0;d=d-4|0;F[b>>2]=F[d>>2];if((c|0)!=(d|0)){continue}break}}F[a+8>>2]=e;F[a+4>>2]=f;F[a>>2]=b;if(!c){break c}ja(c)}return}na();v()}function tb(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=10300;b=F[a+68>>2];if(b){F[a+72>>2]=b;ja(b)}b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}b=F[a+44>>2];if(b){F[a+48>>2]=b;ja(b)}b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}b=F[a+8>>2];if(b){d=b;c=F[a+12>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;d=F[c>>2];F[c>>2]=0;if(d){xa(d)}if((b|0)!=(c|0)){continue}break}d=F[a+8>>2]}F[a+12>>2]=b;ja(d)}b=F[a+4>>2];F[a+4>>2]=0;if(b){ic(b)}return a|0}function qa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=F[a+8>>2];c=F[a+4>>2];if(e-c>>2>>>0>=b>>>0){if(b){b=b<<2;c=ma(c,0,b)+b|0}F[a+4>>2]=c;return}a:{f=c;c=F[a>>2];g=f-c|0;h=g>>2;d=h+b|0;if(d>>>0<1073741824){e=e-c|0;f=e>>>1|0;d=e>>>0>=2147483644?1073741823:d>>>0>>0?f:d;if(d){if(d>>>0>=1073741824){break a}i=ka(d<<2)}b=b<<2;e=ma((h<<2)+i|0,0,b);f=d<<2;d=pa(i,c,g);F[a+8>>2]=f+d;F[a+4>>2]=b+e;F[a>>2]=d;if(c){ja(c)}return}na();v()}oa();v()}function gc(a,b){var c=0,d=0,e=0,f=0;c=a+4|0;a=Ya(a,b);a:{if((c|0)==(a|0)){break a}b=a+28|0;b=D[a+39|0]<0?F[b>>2]:b;while(1){a=b;b=a+1|0;c=D[a|0];if((c|0)==32|c-9>>>0<5){continue}break}b:{c:{d:{c=D[a|0];switch(c-43|0){case 0:break c;case 2:break d;default:break b}}e=1}c=D[b|0];a=b}if(c-48>>>0<10){while(1){d=(L(d,10)-D[a|0]|0)+48|0;b=D[a+1|0];a=a+1|0;if(b-48>>>0<10){continue}break}}a=e?d:0-d|0;if((a|0)==-1){break a}f=(a|0)!=0}return f}function Qa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a=F[a>>2];c=F[a+4>>2];e=F[a+8>>2];if(c>>>0>>0){F[c>>2]=F[b>>2];F[a+4>>2]=c+4;return}a:{d=c;c=F[a>>2];g=d-c|0;d=g>>2;f=d+1|0;if(f>>>0<1073741824){h=d<<2;e=e-c|0;d=e>>>1|0;f=e>>>0>=2147483644?1073741823:f>>>0>>0?d:f;if(f){if(f>>>0>=1073741824){break a}e=ka(f<<2)}else{e=0}d=h+e|0;F[d>>2]=F[b>>2];b=pa(e,c,g);F[a+8>>2]=b+(f<<2);F[a+4>>2]=d+4;F[a>>2]=b;if(c){ja(c)}return}na();v()}oa();v()}function db(a,b,c){var d=0,e=0,f=0,g=0,h=0;f=Z-16|0;Z=f;d=Z-32|0;Z=d;e=Z-16|0;Z=e;F[e+12>>2]=b;F[e+8>>2]=b+c;F[d+24>>2]=F[e+12>>2];F[d+28>>2]=F[e+8>>2];Z=e+16|0;c=Z-16|0;Z=c;h=F[d+28>>2];e=F[d+24>>2];g=h-e|0;if((e|0)!=(h|0)){pa(a,e,g)}F[c+12>>2]=e+g;F[c+8>>2]=a+g;F[d+16>>2]=F[c+12>>2];F[d+20>>2]=F[c+8>>2];Z=c+16|0;F[d+12>>2]=(F[d+16>>2]-b|0)+b;F[d+8>>2]=(F[d+20>>2]-a|0)+a;F[f+8>>2]=F[d+12>>2];F[f+12>>2]=F[d+8>>2];Z=d+32|0;Z=f+16|0}function _a(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=F[a+8>>2];c=F[a+4>>2];if(e-c>>3>>>0>=b>>>0){if(b){b=b<<3;c=ma(c,0,b)+b|0}F[a+4>>2]=c;return}a:{f=c;c=F[a>>2];g=f-c|0;h=g>>3;d=h+b|0;if(d>>>0<536870912){e=e-c|0;f=e>>>2|0;d=e>>>0>=2147483640?536870911:d>>>0>>0?f:d;if(d){if(d>>>0>=536870912){break a}i=ka(d<<3)}b=b<<3;e=ma((h<<3)+i|0,0,b);f=d<<3;d=pa(i,c,g);F[a+8>>2]=f+d;F[a+4>>2]=b+e;F[a>>2]=d;if(c){ja(c)}return}na();v()}oa();v()}function re(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=2016;b=F[a+60>>2];F[a+60>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}d=F[a+36>>2];if(d){c=F[a+40>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+36>>2]}F[a+40>>2]=d;ja(b)}F[a>>2]=1776;b=F[a+16>>2];if(b){F[a+20>>2]=b;ja(b)}b=F[a+4>>2];if(b){F[a+8>>2]=b;ja(b)}return a|0}function qe(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=2016;b=F[a+60>>2];F[a+60>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}d=F[a+36>>2];if(d){c=F[a+40>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+36>>2]}F[a+40>>2]=d;ja(b)}F[a>>2]=1776;b=F[a+16>>2];if(b){F[a+20>>2]=b;ja(b)}b=F[a+4>>2];if(b){F[a+8>>2]=b;ja(b)}ja(a)}function Eg(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;a:{b=F[a+8>>2];b:{if((b|0)<0){break b}c=F[a+4>>2];e=F[c>>2];d=F[c+4>>2]-e>>2;c:{if(d>>>0>>0){nd(c,b-d|0);f=F[a+8>>2];break c}f=b;if(b>>>0>=d>>>0){break c}F[c+4>>2]=e+(b<<2);f=b}d=f;if((d|0)<=0){break b}a=F[a+4>>2];c=F[a>>2];e=F[a+4>>2]-c>>2;a=0;while(1){if((a|0)==(e|0)){break a}F[c+(a<<2)>>2]=a;a=a+1|0;if((d|0)!=(a|0)){continue}break}}return(b^-1)>>>31|0}ta();v()}function fh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;d=Z-16|0;Z=d;e=F[a+4>>2];a:{if((e|0)==-1){break a}c=F[b+20>>2];if(!!F[b+16>>2]&(c|0)>=0|(c|0)>0){break a}pb(b,F[b+4>>2],F[a+8>>2],F[a+12>>2]);c=F[b+20>>2];if(!!F[b+16>>2]&(c|0)>=0|(c|0)>0){break a}pb(b,F[b+4>>2],a+20|0,a+24|0);c=F[b+20>>2];f=F[b+16>>2];D[d+15|0]=F[a+4>>2];if(!!f&(c|0)>=0|(c|0)>0){break a}pb(b,F[b+4>>2],d+15|0,d+16|0)}Z=d+16|0;return(e|0)!=-1|0}function kd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=F[a+8>>2];c=F[a+4>>2];if(e-c>>1>>>0>=b>>>0){if(b){b=b<<1;c=ma(c,0,b)+b|0}F[a+4>>2]=c;return}a:{f=c;c=F[a>>2];g=f-c|0;f=g>>1;d=f+b|0;if((d|0)>=0){e=e-c|0;d=e>>>0>=2147483646?2147483647:d>>>0>>0?e:d;if(d){if((d|0)<0){break a}h=ka(d<<1)}b=b<<1;e=ma((f<<1)+h|0,0,b);f=d<<1;d=pa(h,c,g);F[a+8>>2]=f+d;F[a+4>>2]=b+e;F[a>>2]=d;if(c){ja(c)}return}na();v()}oa();v()}function of(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=Z-16|0;Z=d;Pd(d,a,b,c);F[a+24>>2]=F[d>>2];e=a+24|0;a:{if((e|0)==(d|0)){break a}b=a+28|0;c=d|4;f=G[d+15|0];g=f<<24>>24;if(D[a+39|0]>=0){if((g|0)>=0){a=F[c+4>>2];F[b>>2]=F[c>>2];F[b+4>>2]=a;F[b+8>>2]=F[c+8>>2];break a}qb(b,F[d+4>>2],F[d+8>>2]);break a}a=(g|0)<0;rb(b,a?F[d+4>>2]:c,a?F[d+8>>2]:f)}if(D[d+15|0]<0){ja(F[d+4>>2])}Z=d+16|0;return e|0}function ra(a,b,c){var d=0,e=0,f=0,g=0;e=Z-16|0;Z=e;a:{b:{if(c>>>0<11){d=a;D[a+11|0]=G[a+11|0]&128|c;D[a+11|0]=G[a+11|0]&127;break b}if(c>>>0>2147483631){break a}g=e+8|0;if(c>>>0>=11){f=c+16&-16;d=f-1|0;d=(d|0)==11?f:d}else{d=10}sb(g,d+1|0);d=F[e+8>>2];F[a>>2]=d;F[a+8>>2]=F[a+8>>2]&-2147483648|F[e+12>>2]&2147483647;F[a+8>>2]=F[a+8>>2]|-2147483648;F[a+4>>2]=c}db(d,b,c+1|0);Z=e+16|0;return}za();v()}function pf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;b=Z-16|0;Z=b;Od(b);F[a+24>>2]=F[b>>2];e=a+24|0;a:{if((e|0)==(b|0)){break a}c=a+28|0;d=b|4;f=G[b+15|0];g=f<<24>>24;if(D[a+39|0]>=0){if((g|0)>=0){a=F[d+4>>2];F[c>>2]=F[d>>2];F[c+4>>2]=a;F[c+8>>2]=F[d+8>>2];break a}qb(c,F[b+4>>2],F[b+8>>2]);break a}a=(g|0)<0;rb(c,a?F[b+4>>2]:d,a?F[b+8>>2]:f)}if(D[b+15|0]<0){ja(F[b+4>>2])}Z=b+16|0;return e|0}function Rf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=Z-16|0;Z=d;a:{e=ya(c);if(e>>>0<2147483632){b:{c:{if(e>>>0>=11){g=(e|15)+1|0;f=ka(g);F[d+8>>2]=g|-2147483648;F[d>>2]=f;F[d+4>>2]=e;g=e+f|0;break c}D[d+11|0]=e;g=d+e|0;f=d;if(!e){break b}}la(f,c,e)}D[g|0]=0;f=a+16|0;c=Sc(b,d,f);b=F[a+16>>2];a=D[a+27|0];if(D[d+11|0]<0){ja(F[d>>2])}Z=d+16|0;a=c?(a|0)<0?b:f:0;break a}za();v()}return a|0}function Yb(a,b){var c=0,d=0,e=0;c=F[a+4>>2];d=c+b|0;F[a+4>>2]=d;if(!((d-1^c-1)>>>0<32?c:0)){F[F[a>>2]+((d>>>0>=33?d-1>>>5|0:0)<<2)>>2]=0}a:{if(!b){break a}a=F[a>>2]+(c>>>3&536870908)|0;c=c&31;if(c){d=32-c|0;e=b>>>0>d>>>0?d:b;F[a>>2]=F[a>>2]&(-1<>>d-e^-1);b=b-e|0;a=a+4|0}c=b>>>5|0;if(b>>>0>=32){ma(a,0,c<<2)}if((b&-32)==(b|0)){break a}a=(c<<2)+a|0;F[a>>2]=F[a>>2]&(-1>>>32-(b&31)^-1)}}function ld(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>10){break a}d=F[c+20>>2];f=F[c+12>>2];e=F[c+16>>2];if((d|0)>=(f|0)&e>>>0>=I[c+8>>2]|(d|0)>(f|0)){break a}f=D[e+F[c>>2]|0];e=e+1|0;d=e?d:d+1|0;F[c+16>>2]=e;F[c+20>>2]=d;d=f;b:{if((d|0)<0){if(!ld(a+1|0,b,c)){break a}a=F[b>>2];d=d&127|a<<7;a=F[b+4>>2]<<7|a>>>25;break b}d=d&255;a=0}F[b>>2]=d;F[b+4>>2]=a;g=1}return g}function Sa(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>10){break a}d=F[c+20>>2];f=F[c+12>>2];e=F[c+16>>2];if((d|0)>=(f|0)&e>>>0>=I[c+8>>2]|(d|0)>(f|0)){break a}f=D[e+F[c>>2]|0];e=e+1|0;d=e?d:d+1|0;F[c+16>>2]=e;F[c+20>>2]=d;d=f;b:{if((d|0)<0){if(!Sa(a+1|0,b,c)){break a}a=F[b>>2];d=d&127|a<<7;a=F[b+4>>2]<<7|a>>>25;break b}d=d&255;a=0}F[b>>2]=d;F[b+4>>2]=a;g=1}return g}function Ne(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(La(a,F[b+8>>2],e)){if(!(F[b+28>>2]==1|F[b+4>>2]!=(c|0))){F[b+28>>2]=d}return}a:{if(!La(a,F[b>>2],e)){break a}if(!(F[b+16>>2]!=(c|0)&F[b+20>>2]!=(c|0))){if((d|0)!=1){break a}F[b+32>>2]=1;return}F[b+20>>2]=c;F[b+32>>2]=d;F[b+40>>2]=F[b+40>>2]+1;if(!(F[b+36>>2]!=1|F[b+24>>2]!=2)){D[b+54|0]=1}F[b+44>>2]=4}}function jg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=Z+-64|0;Z=e;d=$[F[F[a>>2]+44>>2]](a,b)|0;a=$[F[F[a>>2]+40>>2]](a,b)|0;f=kb(e);g=F[b+56>>2];h=d&255;i=a;a=a-1|0;if(a>>>0<=10){a=F[(a<<2)+10148>>2]}else{a=-1}d=L(a,d);cc(f,g,h,i,0,d,d>>31);a=bc(ka(96),f);ac(a,c);D[a+84|0]=1;F[a+72>>2]=F[a+68>>2];F[a+60>>2]=F[b+60>>2];Z=e- -64|0;return a|0}function rh(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=8176;b=F[a+48>>2];F[a+48>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=10032;b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}d=F[a+8>>2];if(d){c=F[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+8>>2]}F[a+12>>2]=d;ja(b)}return a|0}function Dc(a,b,c,d){D[a+53|0]=1;a:{if(F[a+4>>2]!=(c|0)){break a}D[a+52|0]=1;c=F[a+16>>2];b:{if(!c){F[a+36>>2]=1;F[a+24>>2]=d;F[a+16>>2]=b;if((d|0)!=1){break a}if(F[a+48>>2]==1){break b}break a}if((b|0)==(c|0)){c=F[a+24>>2];if((c|0)==2){F[a+24>>2]=d;c=d}if(F[a+48>>2]!=1){break a}if((c|0)==1){break b}break a}F[a+36>>2]=F[a+36>>2]+1}D[a+54|0]=1}}function qh(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=8176;b=F[a+48>>2];F[a+48>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=10032;b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}d=F[a+8>>2];if(d){c=F[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+8>>2]}F[a+12>>2]=d;ja(b)}ja(a)}function Se(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=Z+-64|0;Z=e;d=1;a:{if(La(a,b,0)){break a}d=0;if(!b){break a}b=Fc(b,11068);d=0;if(!b){break a}d=e+8|0;ma(d|4,0,52);F[e+56>>2]=1;F[e+20>>2]=-1;F[e+16>>2]=a;F[e+8>>2]=b;$[F[F[b>>2]+28>>2]](b,d,F[c>>2],1);a=F[e+32>>2];if((a|0)==1){F[c>>2]=F[e+24>>2]}d=(a|0)==1}Z=e- -64|0;return d|0}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=Z-16|0;Z=d;F[a+4>>2]=b;b=F[b+64>>2];e=F[b>>2];b=F[b+4>>2];D[d+15|0]=0;Ea(a+24|0,(b-e>>2>>>0)/3|0,d+15|0);b=F[a+4>>2];e=F[b+56>>2];b=F[b+52>>2];D[d+14|0]=0;Ea(a+36|0,e-b>>2,d+14|0);b=F[c+12>>2];F[a+16>>2]=F[c+8>>2];F[a+20>>2]=b;b=F[c+4>>2];F[a+8>>2]=F[c>>2];F[a+12>>2]=b;Z=d+16|0}function zf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;a=Z-16|0;Z=a;f=D[b+24|0];e=F[2555];F[a+8>>2]=F[2554];F[a+12>>2]=e;e=F[2553];F[a>>2]=F[2552];F[a+4>>2]=e;e=lb(b,c,f,a);if(e){b=0;if(f){c=(f&255)<<2;b=ka(c);g=la(b,a,c)+c|0}c=F[d>>2];if(c){F[d+4>>2]=c;ja(c)}F[d+8>>2]=g;F[d+4>>2]=g;F[d>>2]=b}Z=a+16|0;return e|0}function wd(a,b){var c=0,d=0;a:{c=F[a+4>>2];d=F[a+8>>2];if((c|0)==d<<5){if((c+1|0)<0){break a}if(c>>>0<=1073741822){d=d<<6;c=(c&-32)+32|0;c=c>>>0>>0?d:c}else{c=2147483647}$a(a,c);c=F[a+4>>2]}F[a+4>>2]=c+1;d=1<>2]+(c>>>3&536870908)|0;if(G[b|0]){F[a>>2]=d|F[a>>2];return}F[a>>2]=F[a>>2]&(d^-1);return}na();v()}function Zb(a){var b=0;F[a>>2]=0;F[a+4>>2]=0;F[a+56>>2]=0;F[a+48>>2]=0;F[a+52>>2]=0;F[a+40>>2]=0;F[a+44>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0;b=a- -64|0;F[b>>2]=0;F[b+4>>2]=0;F[a+72>>2]=0;F[a+76>>2]=0;F[a+80>>2]=0;F[a+84>>2]=0;F[a+60>>2]=a;return a}function ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=$[F[F[a>>2]+24>>2]](a)|0;c=1;a:{if((f|0)<=0){break a}d=F[F[a+36>>2]>>2];g=a+48|0;c=0;if(!($[F[F[d>>2]+16>>2]](d,g,b)|0)){break a}while(1){e=e+1|0;if((f|0)!=(e|0)){d=F[F[a+36>>2]+(e<<2)>>2];if($[F[F[d>>2]+16>>2]](d,g,b)|0){continue}}break}c=(e|0)>=(f|0)}return c|0}function ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=$[F[F[a>>2]+24>>2]](a)|0;c=1;a:{if((f|0)<=0){break a}d=F[F[a+36>>2]>>2];g=a+48|0;c=0;if(!($[F[F[d>>2]+20>>2]](d,g,b)|0)){break a}while(1){e=e+1|0;if((f|0)!=(e|0)){d=F[F[a+36>>2]+(e<<2)>>2];if($[F[F[d>>2]+20>>2]](d,g,b)|0){continue}}break}c=(e|0)>=(f|0)}return c|0}function bh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=Z-16|0;Z=d;F[a+4>>2]=b;e=F[b>>2];b=F[b+4>>2];D[d+15|0]=0;Ea(a+24|0,(b-e>>2>>>0)/3|0,d+15|0);b=F[a+4>>2];e=F[b+28>>2];b=F[b+24>>2];D[d+14|0]=0;Ea(a+36|0,e-b>>2,d+14|0);b=F[c+12>>2];F[a+16>>2]=F[c+8>>2];F[a+20>>2]=b;b=F[c+4>>2];F[a+8>>2]=F[c>>2];F[a+12>>2]=b;Z=d+16|0}function hb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!hb(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function fb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!fb(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Wb(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Wb(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Ta(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Ta(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Qd(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Qd(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Oa(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Oa(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function Da(a,b,c){var d=0,e=0,f=0,g=0;a:{if(a>>>0>5){break a}d=F[c+20>>2];e=F[c+12>>2];f=F[c+16>>2];if((d|0)>=(e|0)&f>>>0>=I[c+8>>2]|(d|0)>(e|0)){break a}e=G[F[c>>2]+f|0];f=f+1|0;d=f?d:d+1|0;F[c+16>>2]=f;F[c+20>>2]=d;d=e<<24>>24;if((d|0)<0){if(!Da(a+1|0,b,c)){break a}e=d&127|F[b>>2]<<7}F[b>>2]=e;g=1}return g}function sa(a,b,c){var d=0,e=0;a:{b:{if(c>>>0>=4){if((a|b)&3){break b}while(1){if(F[a>>2]!=F[b>>2]){break b}b=b+4|0;a=a+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}}while(1){d=G[a|0];e=G[b|0];if((d|0)==(e|0)){b=b+1|0;a=a+1|0;c=c-1|0;if(c){continue}break a}break}return d-e|0}return 0}function td(a){var b=0,c=0,d=0,e=0;d=F[a>>2];if(d){e=d;c=F[a+4>>2];if((d|0)!=(c|0)){while(1){e=c-144|0;b=F[e+132>>2];if(b){F[c-8>>2]=b;ja(b)}b=F[c-28>>2];if(b){F[c-24>>2]=b;ja(b)}b=F[c-40>>2];if(b){F[c-36>>2]=b;ja(b)}Gb(c-140|0);c=e;if((d|0)!=(c|0)){continue}break}e=F[a>>2]}F[a+4>>2]=d;ja(e)}}function Ef(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=F[b+4>>2];a:{if(!d){break a}b=F[F[F[b+8>>2]+(c<<2)>>2]+60>>2];if((b|0)<0){break a}a=F[d+24>>2];c=F[d+28>>2];if((a|0)==(c|0)){break a}b:{while(1){e=F[a>>2];if((b|0)==F[e+24>>2]){break b}a=a+4|0;if((c|0)!=(a|0)){continue}break}e=0}}return e|0}function ic(a){var b=0,c=0,d=0;if(a){d=F[a+24>>2];if(d){b=d;c=F[a+28>>2];if((b|0)!=(c|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){Ca(b+12|0,F[b+16>>2]);Ba(b,F[b+4>>2]);ja(b)}if((c|0)!=(d|0)){continue}break}b=F[a+24>>2]}F[a+28>>2]=d;ja(b)}Ca(a+12|0,F[a+16>>2]);Ba(a,F[a+4>>2]);ja(a)}}function $g(a){a=a|0;var b=0;F[a+8>>2]=9136;F[a>>2]=8924;b=F[a+96>>2];if(b){F[a+100>>2]=b;ja(b)}b=F[a+80>>2];if(b){F[a+84>>2]=b;ja(b)}b=F[a+68>>2];if(b){F[a+72>>2]=b;ja(b)}b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=9372;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}return a|0}function _g(a){a=a|0;var b=0;F[a+8>>2]=9136;F[a>>2]=8924;b=F[a+96>>2];if(b){F[a+100>>2]=b;ja(b)}b=F[a+80>>2];if(b){F[a+84>>2]=b;ja(b)}b=F[a+68>>2];if(b){F[a+72>>2]=b;ja(b)}b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=9372;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}ja(a)}function wh(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=10032;b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}d=F[a+8>>2];if(d){c=F[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+8>>2]}F[a+12>>2]=d;ja(b)}return a|0}function uc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=F[c+8>>2];e=F[c+16>>2];g=F[c+12>>2];f=g;d=F[c+20>>2];if(h>>>0>e>>>0&(f|0)>=(d|0)|(d|0)<(f|0)){b=G[F[c>>2]+e|0];i=e+1|0;f=i?d:d+1|0;F[c+16>>2]=i;F[c+20>>2]=f;F[a+4>>2]=b}return e>>>0>>0&(d|0)<=(g|0)|(d|0)<(g|0)}function La(a,b,c){var d=0;if(!c){return F[a+4>>2]==F[b+4>>2]}if((a|0)==(b|0)){return 1}d=F[a+4>>2];a=G[d|0];c=F[b+4>>2];b=G[c|0];a:{if(!a|(b|0)!=(a|0)){break a}while(1){b=G[c+1|0];a=G[d+1|0];if(!a){break a}c=c+1|0;d=d+1|0;if((a|0)==(b|0)){continue}break}}return(a|0)==(b|0)}function Gg(a){a=a|0;var b=0,c=0,d=0;F[a>>2]=10032;b=F[a+20>>2];if(b){F[a+24>>2]=b;ja(b)}d=F[a+8>>2];if(d){c=F[a+12>>2];b=d;if((c|0)!=(b|0)){while(1){c=c-4|0;b=F[c>>2];F[c>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}if((c|0)!=(d|0)){continue}break}b=F[a+8>>2]}F[a+12>>2]=d;ja(b)}ja(a)}function Gf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=F[b+12>>2];b=F[b+8>>2];a=0;a:{if((d|0)==(b|0)){break a}a=d-b>>2;d=a>>>0<=1?1:a;a=0;b:{while(1){e=F[b+(a<<2)>>2];if(F[e+60>>2]==(c|0)){break b}a=a+1|0;if((d|0)!=(a|0)){continue}break}a=0;break a}a=(a|0)!=-1?e:0}return a|0}function ah(a){a=a|0;var b=0;F[a>>2]=9136;b=F[a+88>>2];if(b){F[a+92>>2]=b;ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+60>>2];if(b){F[a- -64>>2]=b;ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function Tc(a,b){var c=0,d=0,e=0;F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;a:{c=F[b+4>>2];d=F[b>>2];b:{if((c|0)==(d|0)){a=c;break b}c=c-d|0;if((c|0)<0){break a}d=c;e=ka(c);c=ma(e,0,c);d=d+c|0;F[a+8>>2]=d;F[a+4>>2]=d;F[a>>2]=c;c=F[b>>2];a=F[b+4>>2]}la(e,c,a-c|0);return}na();v()}function Dd(a){var b=0,c=0,d=0,e=0;c=F[a+4>>2];d=F[a>>2];if((c|0)!=(d|0)){while(1){e=c-144|0;b=F[e+132>>2];if(b){F[c-8>>2]=b;ja(b)}b=F[c-28>>2];if(b){F[c-24>>2]=b;ja(b)}b=F[c-40>>2];if(b){F[c-36>>2]=b;ja(b)}Gb(c-140|0);c=e;if((d|0)!=(c|0)){continue}break}}F[a+4>>2]=d}function Xg(a){a=a|0;var b=0;F[a>>2]=9136;b=F[a+88>>2];if(b){F[a+92>>2]=b;ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+60>>2];if(b){F[a- -64>>2]=b;ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Za(a){var b=0;if(a){b=F[a+76>>2];if(b){F[a+80>>2]=b;ja(b)}b=F[a- -64>>2];if(b){F[a+68>>2]=b;ja(b)}b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}b=F[a+24>>2];if(b){F[a+28>>2]=b;ja(b)}b=F[a+12>>2];if(b){F[a+16>>2]=b;ja(b)}b=F[a>>2];if(b){F[a+4>>2]=b;ja(b)}ja(a)}}function Gb(a){var b=0;b=F[a+84>>2];if(b){F[a+88>>2]=b;ja(b)}b=F[a+72>>2];if(b){F[a+76>>2]=b;ja(b)}b=F[a+52>>2];if(b){F[a+56>>2]=b;ja(b)}b=F[a+40>>2];if(b){F[a+44>>2]=b;ja(b)}b=F[a+28>>2];if(b){F[a+32>>2]=b;ja(b)}b=F[a+12>>2];if(b){ja(b)}a=F[a>>2];if(a){ja(a)}}function Lc(a,b,c){var d=0,e=0,f=0,g=0;f=Z-16|0;Z=f;d=Z-16|0;Z=d;b=b-a>>2;while(1){if(b){F[d+12>>2]=a;e=b>>>1|0;F[d+12>>2]=F[d+12>>2]+(e<<2);g=(e^-1)+b|0;b=e;e=I[F[d+12>>2]>>2]>2];b=e?g:b;a=e?F[d+12>>2]+4|0:a;continue}break}Z=d+16|0;Z=f+16|0;return a}function id(a,b){var c=0,d=0;d=ka(40);F[d>>2]=-1;c=d+8|0;F[c+16>>2]=0;F[c+20>>2]=0;F[c+8>>2]=0;F[c>>2]=0;F[c+4>>2]=0;F[c+24>>2]=0;F[c+28>>2]=0;$[F[F[a>>2]+16>>2]](a,d);a=F[b+88>>2];F[b+88>>2]=d;if(a){b=F[a+8>>2];if(b){F[a+12>>2]=b;ja(b)}ja(a)}return 1}function ya(a){var b=0,c=0,d=0;b=a;a:{if(b&3){while(1){if(!G[b|0]){break a}b=b+1|0;if(b&3){continue}break}}while(1){c=b;b=b+4|0;d=F[c>>2];if(!((d^-1)&d-16843009&-2139062144)){continue}break}while(1){b=c;c=b+1|0;if(G[b|0]){continue}break}}return b-a|0}function wa(a){var b=0,c=0,d=0,e=0,f=0;d=G[a+12|0];c=F[a+8>>2];a:{if(c>>>0>4095){break a}b=F[a+4>>2];if((b|0)<=0){break a}b=b-1|0;F[a+4>>2]=b;c=G[b+F[a>>2]|0]|c<<8}d=0-d&255;b=L(d,c>>>8|0);e=c&255;f=e>>>0>>0;F[a+8>>2]=f?b+e|0:c-(b+d|0)|0;return f}function yc(a,b){F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=1776;F[a+12>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;F[a+32>>2]=0;F[a+36>>2]=0;F[a+40>>2]=0;F[a>>2]=2016;F[a+60>>2]=b;F[a+44>>2]=0;F[a+48>>2]=0;F[a+52>>2]=0;F[a+56>>2]=0;return a}function Eb(a,b){var c=0,d=0,e=0;c=ya(b);if(c>>>0<2147483632){a:{b:{if(c>>>0>=11){d=(c|15)+1|0;e=ka(d);F[a+8>>2]=d|-2147483648;F[a>>2]=e;F[a+4>>2]=c;d=c+e|0;break b}D[a+11|0]=c;d=a+c|0;e=a;if(!c){break a}}pa(e,b,c)}D[d|0]=0;return a}za();v()}function Of(a){a=a|0;var b=0,c=0,d=0;if(a){if(D[a+27|0]<0){ja(F[a+16>>2])}b=F[a>>2];if(b){c=b;d=F[a+4>>2];if((b|0)!=(d|0)){while(1){c=d-12|0;if(D[d-1|0]<0){ja(F[c>>2])}d=c;if((d|0)!=(b|0)){continue}break}c=F[a>>2]}F[a+4>>2]=b;ja(c)}ja(a)}}function xa(a){a=a|0;var b=0,c=0;if(a){b=F[a+88>>2];F[a+88>>2]=0;if(b){c=F[b+8>>2];if(c){F[b+12>>2]=c;ja(c)}ja(b)}b=F[a+68>>2];if(b){F[a+72>>2]=b;ja(b)}b=F[a+64>>2];F[a+64>>2]=0;if(b){c=F[b>>2];if(c){F[b+4>>2]=c;ja(c)}ja(b)}ja(a)}}function Ib(a,b){var c=0,d=0,e=0;a:{c=F[a>>2];b:{if(F[a+8>>2]-c>>2>>>0>=b>>>0){break b}if(b>>>0>=1073741824){break a}d=F[a+4>>2]-c|0;e=b<<2;b=pa(ka(e),c,d);F[a+8>>2]=b+e;F[a+4>>2]=b+d;F[a>>2]=b;if(!c){break b}ja(c)}return}na();v()}function Df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;b=F[b+96>>2];a=ka(12);b=b+L(c,12)|0;c=F[b+4>>2];F[a>>2]=F[b>>2];F[a+4>>2]=c;F[a+8>>2]=F[b+8>>2];b=F[d>>2];if(b){F[d+4>>2]=b;ja(b)}F[d>>2]=a;a=a+12|0;F[d+8>>2]=a;F[d+4>>2]=a;return 1}function Ah(a){a=a|0;var b=0;F[a+24>>2]=1624;F[a>>2]=7948;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}F[a>>2]=2136;b=F[a+20>>2];F[a+20>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}return a|0}function li(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=mi(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;_=(g^_)-((a>>>0>>0)+g|0)|0;return b}function zh(a){a=a|0;var b=0;F[a+24>>2]=1624;F[a>>2]=7948;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}F[a>>2]=2136;b=F[a+20>>2];F[a+20>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}ja(a)}function rb(a,b,c){var d=0,e=0,f=0;e=Z-16|0;Z=e;d=F[a+8>>2]&2147483647;a:{if(d>>>0>c>>>0){d=F[a>>2];F[a+4>>2]=c;db(d,b,c);D[e+15|0]=0;D[c+d|0]=G[e+15|0];break a}f=a;a=F[a+4>>2];Gc(f,d-1|0,(c-d|0)+1|0,a,a,c,b)}Z=e+16|0}function xe(a,b){a=a|0;b=b|0;var c=0,d=0;c=Z-16|0;Z=c;a=F[a+4>>2];a:{if((a|0)==-1){break a}D[c+15|0]=a;d=F[b+20>>2];if(!!F[b+16>>2]&(d|0)>=0|(d|0)>0){break a}pb(b,F[b+4>>2],c+15|0,c+16|0)}Z=c+16|0;return(a|0)!=-1|0}function ki(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=c>>>16|0;f=a>>>16|0;j=L(e,f);g=c&65535;h=a&65535;i=L(g,h);f=(i>>>16|0)+L(f,g)|0;e=(f&65535)+L(e,h)|0;_=(L(b,c)+j|0)+L(a,d)+(f>>>16)+(e>>>16)|0;return i&65535|e<<16}function qb(a,b,c){var d=0,e=0;d=Z-16|0;Z=d;a:{if(c>>>0<=10){D[a+11|0]=G[a+11|0]&128|c;D[a+11|0]=G[a+11|0]&127;db(a,b,c);D[d+15|0]=0;D[a+c|0]=G[d+15|0];break a}e=a;a=G[a+11|0]&127;Gc(e,10,c-10|0,a,a,c,b)}Z=d+16|0}function Ec(a,b,c){var d=0;d=F[a+16>>2];if(!d){F[a+36>>2]=1;F[a+24>>2]=c;F[a+16>>2]=b;return}a:{if((b|0)==(d|0)){if(F[a+24>>2]!=2){break a}F[a+24>>2]=c;return}D[a+54|0]=1;F[a+24>>2]=2;F[a+36>>2]=F[a+36>>2]+1}}function vg(){var a=0;a=kb(ka(96));F[a+64>>2]=0;F[a+68>>2]=0;F[a+88>>2]=0;F[a+72>>2]=0;F[a+76>>2]=0;D[a+77|0]=0;D[a+78|0]=0;D[a+79|0]=0;D[a+80|0]=0;D[a+81|0]=0;D[a+82|0]=0;D[a+83|0]=0;D[a+84|0]=0;return a|0}function jh(a,b){a=a|0;b=b|0;var c=0,d=0;F[b>>2]=2;c=F[b+8>>2];d=F[b+12>>2]-c|0;if(d>>>0<=4294967291){Db(b+8|0,d+4|0);c=F[b+8>>2]}b=c+d|0;a=F[a+4>>2];D[b|0]=a;D[b+1|0]=a>>>8;D[b+2|0]=a>>>16;D[b+3|0]=a>>>24}function ge(a){a=a|0;var b=0;F[a>>2]=3016;b=F[a+96>>2];if(b){ja(b)}b=F[a+84>>2];if(b){ja(b)}b=F[a+72>>2];if(b){ja(b)}b=F[a+60>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function ci(a){a=a|0;var b=0;F[a>>2]=4580;b=F[a+96>>2];if(b){ja(b)}b=F[a+84>>2];if(b){ja(b)}b=F[a+72>>2];if(b){ja(b)}b=F[a+60>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function Cg(a){a=a|0;var b=0,c=0,d=0;b=F[a+8>>2];d=F[a+12>>2];if((b|0)==(d|0)){return 1}while(1){c=F[b>>2];c=$[F[F[c>>2]+16>>2]](c,F[a+32>>2])|0;if(c){b=b+4|0;if((d|0)!=(b|0)){continue}}break}return c|0}function Pc(a,b){var c=0,d=0;c=F[a+8>>2];a=F[a+12>>2];if((c|0)!=(a|0)){a=a-c>>2;d=a>>>0<=1?1:a;a=0;while(1){if(F[F[(a<<2)+c>>2]+60>>2]==(b|0)){return a}a=a+1|0;if((d|0)!=(a|0)){continue}break}}return-1}function fe(a){a=a|0;var b=0;F[a>>2]=3016;b=F[a+96>>2];if(b){ja(b)}b=F[a+84>>2];if(b){ja(b)}b=F[a+72>>2];if(b){ja(b)}b=F[a+60>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function bi(a){a=a|0;var b=0;F[a>>2]=4580;b=F[a+96>>2];if(b){ja(b)}b=F[a+84>>2];if(b){ja(b)}b=F[a+72>>2];if(b){ja(b)}b=F[a+60>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function Sc(a,b,c){var d=0,e=0;d=a+4|0;a=Ya(a,b);a:{if((d|0)==(a|0)){break a}b=F[a+32>>2];d=F[a+28>>2];if((b|0)==(d|0)){break a}Sb(c,b-d|0);c=Tb(c);b=F[a+28>>2];la(c,b,F[a+32>>2]-b|0);e=1}return e}function Kd(a){F[a+40>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;F[a>>2]=10032;F[a+12>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;F[a+32>>2]=0;E[a+36>>1]=0;F[a+44>>2]=0;F[a>>2]=8080;return a}function kb(a){F[a+8>>2]=0;F[a+12>>2]=0;F[a>>2]=0;F[a+40>>2]=0;F[a+44>>2]=0;F[a+28>>2]=9;D[a+24|0]=1;F[a+56>>2]=-1;F[a+60>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+48>>2]=0;F[a+52>>2]=0;return a}function pe(a,b){a=a|0;b=b|0;var c=0,d=0;d=F[a+16>>2];c=0;a:{if(F[a+20>>2]-d>>2<=(b|0)){break a}b=F[(b<<2)+d>>2];c=0;if((b|0)<0){break a}c=bb(F[F[a+36>>2]+(b<<2)>>2])}return c|0}function Nf(){var a=0,b=0;a=ka(40);F[a+4>>2]=0;F[a+8>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;b=a+16|0;F[b>>2]=0;F[b+4>>2]=0;F[a>>2]=a+4;F[a+12>>2]=b;F[a+32>>2]=0;F[a+36>>2]=0;return a|0}function Xe(a,b){a=a|0;b=b|0;var c=0,d=0;Nc(a,b);a:{if((b|0)<0){break a}d=F[a+88>>2];c=F[a+84>>2];if(d-c>>2<=(b|0)){break a}c=(b<<2)+c|0;b=c+4|0;pa(c,b,d-b|0);F[a+88>>2]=d-4}}function eb(a){var b=0,c=0;b=F[2909];c=a+7&-8;a=b+c|0;a:{if(a>>>0<=b>>>0?c:0){break a}if(a>>>0>aa()<<16>>>0){if(!(X(a|0)|0)){break a}}F[2909]=a;return b}F[2940]=48;return-1}function Th(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;F[a+4>>2]=b;b=F[F[F[b+4>>2]+8>>2]+(c<<2)>>2];F[a+12>>2]=c;F[a+8>>2]=b;a=F[a+8>>2];if(G[a+24|0]==3){d=F[a+28>>2]==9}return d|0}function Tg(a){a=a|0;var b=0;F[a+8>>2]=9556;F[a>>2]=9392;b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=9372;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}return a|0}function Ng(a){a=a|0;var b=0;F[a+8>>2]=8624;F[a>>2]=9684;b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=8876;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}return a|0}function Ee(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=F[a+8>>2];a:{if(!G[d+24|0]){break a}if(!ac(d,F[b+4>>2]-F[b>>2]>>2)){break a}e=$[F[F[a>>2]+32>>2]](a,b,c)|0}return e|0}function Fh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;F[a+4>>2]=b;d=F[F[F[b+4>>2]+8>>2]+(c<<2)>>2];F[a+12>>2]=c;F[a+8>>2]=d;return F[F[F[F[b+4>>2]+8>>2]+(c<<2)>>2]+28>>2]==9|0}function Ca(a,b){if(b){Ca(a,F[b>>2]);Ca(a,F[b+4>>2]);a=F[b+28>>2];F[b+28>>2]=0;if(a){Ca(a+12|0,F[a+16>>2]);Ba(a,F[a+4>>2]);ja(a)}if(D[b+27|0]<0){ja(F[b+16>>2])}ja(b)}}function Sg(a){a=a|0;var b=0;F[a+8>>2]=9556;F[a>>2]=9392;b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=9372;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}ja(a)}function Mg(a){a=a|0;var b=0;F[a+8>>2]=8624;F[a>>2]=9684;b=F[a+56>>2];if(b){F[a+60>>2]=b;ja(b)}F[a+8>>2]=8876;b=F[a+44>>2];if(b){ja(b)}b=F[a+32>>2];if(b){ja(b)}ja(a)}function Hc(a,b){var c=0,d=0,e=0,f=0;F[a>>2]=11356;F[a>>2]=11468;c=ya(b);d=ka(c+13|0);F[d+8>>2]=0;F[d+4>>2]=c;F[d>>2]=c;e=a,f=la(d+12|0,b,c+1|0),F[e+4>>2]=f;return a}function hc(a,b,c){a:{if(b){b=0;if(!ld(1,c,a)){break a}}D[a+36|0]=1;F[a+32>>2]=0;b=F[a+16>>2];c=b+F[a>>2]|0;F[a+24>>2]=c;F[a+28>>2]=c+(F[a+8>>2]-b|0);b=1}return b}function Ue(a,b){a=a|0;b=b|0;var c=0;a:{if(!($[F[F[a>>2]+36>>2]](a,b)|0)){break a}if(!($[F[F[a>>2]+40>>2]](a,b)|0)){break a}c=$[F[F[a>>2]+44>>2]](a)|0}return c|0}function _d(a){a=a|0;var b=0;a:{if(!F[a- -64>>2]|!F[a+68>>2]|(!F[a+44>>2]|!F[a+48>>2])){break a}if(!F[a+52>>2]|!F[a+56>>2]){break a}b=F[a+92>>2]!=-1}return b|0}function ii(a,b){a=a|0;b=b|0;var c=0;b=F[b+88>>2];if(!(!b|F[b>>2]!=2)){c=a;a=F[b+8>>2];F[c+4>>2]=G[a|0]|G[a+1|0]<<8|(G[a+2|0]<<16|G[a+3|0]<<24);c=1}return c|0}function wc(a){a=a|0;var b=0;F[a>>2]=2136;b=F[a+20>>2];F[a+20>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}return a|0}function Ud(a){a=a|0;var b=0;a:{if(!F[a+48>>2]|!F[a+52>>2]|(!F[a+28>>2]|!F[a+32>>2])){break a}if(!F[a+36>>2]|!F[a+40>>2]){break a}b=F[a+76>>2]!=-1}return b|0}function Ug(a){a=a|0;var b=0;F[a>>2]=9556;b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function Ed(a){a=a|0;var b=0;F[a>>2]=8624;b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=8876;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function vc(a){a=a|0;var b=0;F[a>>2]=2136;b=F[a+20>>2];F[a+20>>2]=0;if(b){$[F[F[b>>2]+4>>2]](b)}F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}ja(a)}function yg(){var a=0,b=0;b=ka(40);F[b>>2]=-1;a=b+8|0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=0;F[a>>2]=0;F[a+4>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;return b|0}function eh(a){a=a|0;var b=0;F[a>>2]=8624;b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=8876;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Og(a){a=a|0;var b=0;F[a>>2]=9556;b=F[a+48>>2];if(b){F[a+52>>2]=b;ja(b)}F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Ja(a){F[a+8>>2]=0;F[a+12>>2]=0;F[a>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+32>>2]=0;F[a+24>>2]=0;F[a+28>>2]=0;E[a+38>>1]=0;D[a+36|0]=0;return a}function Me(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(La(a,F[b+8>>2],f)){Dc(b,c,d,e);return}a=F[a+8>>2];$[F[F[a>>2]+20>>2]](a,b,c,d,e,f)}function Eh(a,b,c){a=a|0;b=b|0;c=c|0;a:{if(G[F[a+4>>2]+36|0]>=2){b=0;if(!($[F[F[a>>2]+52>>2]](a)|0)){break a}}b=id(a+24|0,F[a+16>>2])}return b|0}function hg(){var a=0;a=Rc(ka(108));F[a+84>>2]=0;F[a+88>>2]=0;F[a>>2]=10240;F[a+92>>2]=0;F[a+96>>2]=0;F[a+100>>2]=0;F[a+104>>2]=0;return a|0}function Qc(a,b){var c=0;c=-1;a:{if((b|0)==-1|(b|0)>4){break a}b=L(b,12)+a|0;a=F[b+20>>2];if((F[b+24>>2]-a|0)<=0){break a}c=F[a>>2]}return c}function cc(a,b,c,d,e,f,g){F[a>>2]=0;F[a+56>>2]=b;F[a+48>>2]=0;F[a+52>>2]=0;F[a+40>>2]=f;F[a+44>>2]=g;D[a+32|0]=e;F[a+28>>2]=d;D[a+24|0]=c}function Sh(a,b,c){a=a|0;b=b|0;c=c|0;a:{if(G[F[a+4>>2]+36|0]>=2){b=0;if(!uc(a+24|0,bb(a),c)){break a}}b=id(a+24|0,F[a+16>>2])}return b|0}function _e(a){a=a|0;var b=0;F[a>>2]=10240;b=F[a+96>>2];if(b){F[a+100>>2]=b;ja(b)}b=F[a+84>>2];if(b){F[a+88>>2]=b;ja(b)}return tb(a)|0}function Tb(a){var b=0;if(G[a+11|0]>>>7|0){b=F[a+4>>2]}else{b=G[a+11|0]&127}if(!b){sc(1222);v()}if(G[a+11|0]>>>7|0){a=F[a>>2]}return a}function Ze(a){a=a|0;var b=0;F[a>>2]=10240;b=F[a+96>>2];if(b){F[a+100>>2]=b;ja(b)}b=F[a+84>>2];if(b){F[a+88>>2]=b;ja(b)}ja(tb(a))}function ce(a){a=a|0;var b=0;F[a>>2]=3264;b=F[a+76>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function _h(a){a=a|0;var b=0;F[a>>2]=4816;b=F[a+76>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function Ba(a,b){if(b){Ba(a,F[b>>2]);Ba(a,F[b+4>>2]);a=F[b+28>>2];if(a){F[b+32>>2]=a;ja(a)}if(D[b+27|0]<0){ja(F[b+16>>2])}ja(b)}}function Wf(){var a=0;a=ka(28);F[a>>2]=0;F[a+4>>2]=0;F[a+24>>2]=0;F[a+16>>2]=0;F[a+20>>2]=0;F[a+8>>2]=0;F[a+12>>2]=0;return a|0}function We(a){a=a|0;var b=0;F[a>>2]=1776;b=F[a+16>>2];if(b){F[a+20>>2]=b;ja(b)}b=F[a+4>>2];if(b){F[a+8>>2]=b;ja(b)}return a|0}function fg(){var a=0,b=0;a=ka(24);F[a+4>>2]=0;F[a+8>>2]=0;b=a+16|0;F[b>>2]=0;F[b+4>>2]=0;F[a>>2]=a+4;F[a+12>>2]=b;return a|0}function Pe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(La(a,F[b+8>>2],0)){Ec(b,c,d);return}a=F[a+8>>2];$[F[F[a>>2]+28>>2]](a,b,c,d)}function be(a){a=a|0;var b=0;F[a>>2]=3264;b=F[a+76>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function Zh(a){a=a|0;var b=0;F[a>>2]=4816;b=F[a+76>>2];if(b){ja(b)}F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function ka(a){var b=0;a=a?a:1;a:{while(1){b=Ub(a);if(b){break a}b=F[3065];if(b){$[b|0]();continue}break}V();v()}return b}function ib(a,b){if(b){ib(a,F[b>>2]);ib(a,F[b+4>>2]);if(D[b+39|0]<0){ja(F[b+28>>2])}if(D[b+27|0]<0){ja(F[b+16>>2])}ja(b)}}function Cc(a){a=a|0;var b=0,c=0;F[a>>2]=11468;b=F[a+4>>2]-12|0;c=F[b+8>>2]-1|0;F[b+8>>2]=c;if((c|0)<0){ja(b)}return a|0}function ng(){var a=0;a=ka(24);F[a+8>>2]=0;F[a+12>>2]=0;F[a+4>>2]=-1;F[a>>2]=1624;F[a+16>>2]=0;F[a+20>>2]=0;return a|0}function Ac(a,b,c){a=a|0;b=b|0;c=c|0;F[a+4>>2]=b;b=F[F[F[b+4>>2]+8>>2]+(c<<2)>>2];F[a+12>>2]=c;F[a+8>>2]=b;return 1}function pc(a){a=a|0;var b=0;if(!(!F[a+60>>2]|!F[a+44>>2]|(!F[a+48>>2]|!F[a+52>>2]))){b=F[a+56>>2]!=0}return b|0}function Ic(a,b){if(G[a+11|0]>>>7|0){F[a+4>>2]=b;return}D[a+11|0]=G[a+11|0]&128|b;D[a+11|0]=G[a+11|0]&127}function gi(a){a=a|0;var b=0;F[a>>2]=3500;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function Xh(a){a=a|0;var b=0;F[a>>2]=5040;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function nf(a){a=a|0;if(a){if(D[a+39|0]<0){ja(F[a+28>>2])}$b(a+12|0,F[a+16>>2]);ib(a,F[a+4>>2]);ja(a)}}function dh(a){a=a|0;var b=0;F[a>>2]=8876;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function Wg(a){a=a|0;var b=0;F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}return a|0}function ob(a){a=a|0;var b=0;if(!(!F[a+52>>2]|(!F[a+44>>2]|!F[a+48>>2]))){b=F[a+56>>2]!=0}return b|0}function oc(a,b){a=a|0;b=b|0;var c=0;if(!(F[b+56>>2]|!b|G[b+24|0]!=3)){F[a+60>>2]=b;c=1}return c|0}function fi(a){a=a|0;var b=0;F[a>>2]=3500;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function Wh(a){a=a|0;var b=0;F[a>>2]=5040;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function zg(a,b,c){a=a|0;b=b|0;c=c|0;F[a+16>>2]=0;F[a+20>>2]=0;F[a>>2]=b;F[a+8>>2]=c;F[a+12>>2]=0}function ch(a){a=a|0;var b=0;F[a>>2]=8876;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Zd(a,b){a=a|0;b=b|0;var c=0;if(!(F[b+56>>2]|G[b+24|0]!=3)){F[a- -64>>2]=b;c=1}return c|0}function Vg(a){a=a|0;var b=0;F[a>>2]=9372;b=F[a+36>>2];if(b){ja(b)}b=F[a+24>>2];if(b){ja(b)}ja(a)}function Td(a,b){a=a|0;b=b|0;var c=0;if(!(F[b+56>>2]|G[b+24|0]!=3)){F[a+48>>2]=b;c=1}return c|0}function Le(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(La(a,F[b+8>>2],f)){Dc(b,c,d,e)}}function oa(){var a=0;a=Rb(4);F[a>>2]=11356;F[a>>2]=11316;F[a>>2]=11336;W(a|0,11448,14);v()}function je(a){a=a|0;var b=0;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}return a|0}function Ae(a){a=a|0;var b=0;F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}return a|0}function Pg(a){a=a|0;var b=0;F[a>>2]=1624;b=F[a+8>>2];if(b){F[a+12>>2]=b;ja(b)}return a|0}function Ch(a){a=a|0;var b=0;b=bb(a);return qd(a+24|0,b?b:F[a+8>>2],F[F[a+4>>2]+32>>2])|0}function ze(a){a=a|0;var b=0;F[a>>2]=1920;b=F[a+16>>2];F[a+16>>2]=0;if(b){xa(b)}ja(a)}function Ob(a){a=a|0;var b=0;F[a>>2]=2960;b=F[a+32>>2];if(b){F[a+36>>2]=b;ja(b)}ja(a)}function Hg(a){a=a|0;var b=0;F[a>>2]=1624;b=F[a+8>>2];if(b){F[a+12>>2]=b;ja(b)}ja(a)}function oe(a,b){a=a|0;b=b|0;return $[F[F[a>>2]+48>>2]](a,F[b+4>>2]-F[b>>2]>>2)|0}function $b(a,b){if(b){$b(a,F[b>>2]);$b(a,F[b+4>>2]);ib(b+20|0,F[b+24>>2]);ja(b)}}function xg(a){a=a|0;var b=0;if(a){b=F[a+8>>2];if(b){F[a+12>>2]=b;ja(b)}ja(a)}}function xh(a){a=a|0;if(!F[a+44>>2]){return 0}return $[F[F[a>>2]+48>>2]](a)|0}function ni(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function Qe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(La(a,F[b+8>>2],0)){Ec(b,c,d)}}function vh(a,b){a=a|0;b=b|0;a=F[a+48>>2];return $[F[F[a>>2]+20>>2]](a,b)|0}function oi(a){var b=0;b=a&31;a=0-a&31;return(-1>>>b&-2)<>>a} function oh(a,b){a=a|0;b=b|0;a=F[a+48>>2];return $[F[F[a>>2]+12>>2]](a,b)|0}function nh(a,b){a=a|0;b=b|0;a=F[a+48>>2];return $[F[F[a>>2]+16>>2]](a,b)|0}function Xa(){var a=0;a=ka(12);F[a>>2]=0;F[a+4>>2]=0;F[a+8>>2]=0;return a|0}function Wa(a){a=a|0;var b=0;if(a){b=F[a>>2];if(b){F[a+4>>2]=b;ja(b)}ja(a)}}function mf(a,b,c){a=a|0;b=b|0;c=c|0;F[a+32>>2]=c;F[a+28>>2]=b;return 1}function eg(a){a=a|0;if(a){Ca(a+12|0,F[a+16>>2]);Ba(a,F[a+4>>2]);ja(a)}}function Lb(a,b){a=a|0;b=b|0;if(b>>>0<=1){F[a+28>>2]=b}return b>>>0<2|0}function Fg(a,b){a=a|0;b=b|0;D[b+84|0]=1;F[b+72>>2]=F[b+68>>2];return 1}function kg(){var a=0;a=ka(8);F[a+4>>2]=-1;F[a>>2]=1032;return a|0}function Hf(a,b,c){a=a|0;b=b|0;c=c|0;return F[F[b+8>>2]+(c<<2)>>2]}function th(a){a=a|0;a=F[a+48>>2];return $[F[F[a>>2]+24>>2]](a)|0}function sh(a){a=a|0;a=F[a+48>>2];return $[F[F[a>>2]+28>>2]](a)|0}function ph(a){a=a|0;a=F[a+48>>2];return $[F[F[a>>2]+36>>2]](a)|0}function Rh(a,b){a=a|0;b=b|0;return zc(a+24|0,bb(a),F[a+8>>2])|0}function Bh(a,b){a=a|0;b=b|0;return xd(a+24|0,bb(a),F[a+8>>2])|0}function bg(a){a=a|0;if(a){if(D[a+15|0]<0){ja(F[a+4>>2])}ja(a)}}function Ke(a){a=a|0;if(!a){return 0}return(Fc(a,11164)|0)!=0|0}function Fe(a,b){a=a|0;b=b|0;F[a+12>>2]=-1;F[a+8>>2]=b;return 1}function hd(a,b){a=a|0;b=b|0;return $[F[F[a>>2]+12>>2]](a,b)|0}function Dh(a,b){a=a|0;b=b|0;return $[F[F[a>>2]+56>>2]](a,b)|0}function sc(a){a=Hc(Rb(8),a);F[a>>2]=11568;W(a|0,11600,1);v()}function mg(a,b){a=a|0;b=b|0;return M(J[F[a+8>>2]+(b<<2)>>2])}function Rd(a){a=Hc(Rb(8),a);F[a>>2]=11516;W(a|0,11548,1);v()}function $f(a,b){a=a|0;b=b|0;return M(J[F[a>>2]+(b<<2)>>2])}function gg(a){a=a|0;return(F[a+100>>2]-F[a+96>>2]|0)/12|0}function cg(a){a=a|0;return(D[a+15|0]<0?F[a+4>>2]:a+4|0)|0}function Re(a,b){a=a|0;b=b|0;return F[F[a+4>>2]+(b<<2)>>2]}function dd(a,b){a=a|0;b=b|0;return F[F[a>>2]+(b<<2)>>2]}function Yf(a,b){a=a|0;b=b|0;return E[F[a>>2]+(b<<1)>>1]}function Xf(a,b){a=a|0;b=b|0;return H[F[a>>2]+(b<<1)>>1]}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;return xc(a,b,c)|0}function sb(a,b){var c=0;c=ka(b);F[a+4>>2]=b;F[a>>2]=c}function Kf(a,b,c){a=a|0;b=b|0;c=c|0;return Qc(b,c)|0}function Rc(a){F[a>>2]=10300;ma(a+4|0,0,80);return a}function ji(a){if(a){return 31-O(a-1^a)|0}return 32}function gd(a){a=a|0;return F[a+12>>2]-F[a+8>>2]>>2}function _f(a,b){a=a|0;b=b|0;return D[F[a>>2]+b|0]}function Zf(a,b){a=a|0;b=b|0;return G[F[a>>2]+b|0]}function Ie(a){a=a|0;return F[a+8>>2]-F[a+4>>2]>>2}function wb(a){a=a|0;if(a){$[F[F[a>>2]+4>>2]](a)}}function Jd(a,b){a=a|0;b=b|0;F[a+4>>2]=b;return 1}function ed(a){a=a|0;return F[a+4>>2]-F[a>>2]>>1}function dc(a){a=a|0;return F[a+4>>2]-F[a>>2]>>2}function fd(a){a=a|0;return F[a+4>>2]-F[a>>2]|0}function ke(a){a=a|0;return G[F[a+8>>2]+24|0]}function Qf(a,b){a=a|0;b=b|0;return F[b+8>>2]}function Ff(a,b){a=a|0;b=b|0;return F[b+4>>2]}function De(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Bg(a,b){a=a|0;b=b|0;return G[b+24|0]}function Oh(a){a=a|0;F[a>>2]=5928;return a|0}function Jh(a){a=a|0;F[a>>2]=6932;return a|0}function lg(a){a=a|0;return M(J[a+20>>2])}function Nh(a){a=a|0;F[a>>2]=5928;ja(a)}function Ih(a){a=a|0;F[a>>2]=6932;ja(a)}function ug(a){a=a|0;return F[a+88>>2]}function tg(a){a=a|0;return F[a+56>>2]}function qg(a){a=a|0;return F[a+40>>2]}function pg(a){a=a|0;return F[a+48>>2]}function og(a){a=a|0;return F[a+60>>2]}function ec(a){a=a|0;return F[a+80>>2]}function cb(a){a=a|0;return F[a+28>>2]}function vd(a){a=a|0;return F[a+8>>2]}function tc(a,b){a=a|0;b=b|0;return-1}function sg(a){a=a|0;return D[a+24|0]}function rg(a){a=a|0;return G[a+32|0]}function dg(a){a=a|0;return!F[a>>2]|0}function Wd(a,b){a=a|0;b=b|0;return 6}function Va(a){a=a|0;return F[a+4>>2]}function Rb(a){return Ub(a+80|0)+80|0}function Qh(a,b){a=a|0;b=b|0;return 2}function Ia(a,b){a=a|0;b=b|0;return 0}function Bc(a,b){a=a|0;b=b|0;return 1}function jd(a){a=a|0;return F[a>>2]}function wg(){return kb(ka(64))|0}function ig(){return Rc(ka(84))|0}function fc(a){a=a|0;if(a){ja(a)}}function Ag(){return Ja(ka(40))|0}function Qb(a){a=a|0;Cc(a);ja(a)}function Je(a){a=a|0;return 1161}function He(a){a=a|0;return 1235}function Ge(a){a=a|0;return 1201}function Pa(a){a=a|0;return a|0}function hh(a){a=a|0;ja(ud(a))}function gh(a){a=a|0;ja(sd(a))}function Ve(a){a=a|0;ja(tb(a))}function ua(a){a=a|0;return 1}function rc(a){a=a|0;return 4}function qc(a){a=a|0;return 5}function Xd(a){a=a|0;return 2}function Ua(a){a=a|0;return 0}function Nb(a){a=a|0;return 6}function Mh(a){a=a|0;return 3}function za(){Rd(1222);v()}function ta(){sc(1154);v()}function na(){Rd(1154);v()}function Ha(a){a=a|0;ja(a)}function Ra(a){a=a|0;v()}function ff(){return 10}function ef(){return 11}function df(){return 12}function vb(){return-1}function ub(){return 1}function lf(){return 5}function kf(){return 6}function jf(){return 7}function jb(){return 0}function hf(){return 8}function gf(){return 9}function cf(){return-2}function bf(){return-3}function bd(){return 3}function af(){return-4}function ad(){return 4}function _b(){return 2}function $e(){return-5}function Te(){V();v()}function Jc(a){a=a|0}function ae(){} // EMSCRIPTEN_END_FUNCS e=G;p(q);var $=c([null,Cc,Pa,Ha,Xd,ii,jh,ag,zc,xe,uc,jg,Wd,Qh,Pa,Pg,Hg,ua,yh,mh,kh,xd,fh,qd,Wd,Bg,We,Ra,mf,$c,Ue,Re,Ie,cb,Ia,Te,Bc,ua,Ae,ze,Ac,Fe,Ee,De,Bc,Ce,Be,re,qe,ye,we,pe,ve,ue,te,se,wc,vc,Ac,oe,ne,xc,me,ke,le,je,Ob,ua,Va,ob,Ua,tc,Ia,Ua,ua,ie,he,Ra,Ra,ge,fe,rc,ob,ee,de,ce,be,qc,pc,ua,Ia,oc,$d,hi,gi,fi,Nb,_d,ua,Ia,Zd,Yd,ei,Pa,Ha,Lb,cb,Mb,Ra,Ob,ua,ob,di,Ra,ci,bi,rc,ob,ai,$h,_h,Zh,qc,pc,ua,Ia,oc,$d,Yh,Xh,Wh,Nb,_d,ua,Ia,Zd,Yd,Vh,Pa,Ha,Lb,cb,Kb,Ra,Ob,Ua,ua,Uh,wc,vc,Th,Sh,Vd,Ph,Xd,Rh,Oh,Nh,Nb,Va,Ud,ua,Ia,Td,ua,Mh,Sd,Lh,Pa,Ha,Lb,cb,Mb,Jh,Ih,Nb,Ud,ua,Ia,Td,Sd,Hh,Pa,Ha,Lb,cb,Kb,Pa,Ha,Ua,ua,Ua,tc,Ia,Kh,Gh,Ah,zh,Fh,Eh,Vd,Dh,Ch,Bh,wh,Ra,ua,ua,xh,Dg,Cg,ua,Ua,Ia,Ia,rh,qh,uh,vh,sh,ph,oh,nh,th,ud,hh,Jd,Id,Hd,Gd,lh,ua,Va,vd,sd,gh,Jd,Id,Hd,Gd,ih,ua,Va,vd,Ed,eh,Fd,dh,ch,$g,_g,Zg,Yg,ah,Xg,bh,Wg,Vg,Tg,Sg,Rg,Qg,Ug,Og,Ng,Mg,Lg,Kg,Gg,Ig,Jg,Pa,Ha,Fg,Eg,Ra,Ua,ua,_e,Ze,Ye,Xe,tb,Ve,Oc,Nc,Pa,Ha,Jc,Jc,Se,Le,Ne,Qe,Ha,Me,Oe,Pe,Ha,He,Ha,Ge,Ha,Je,Qb,Va,Qb,Qb]);function aa(){return C.byteLength/65536|0}function fa(ga){ga=ga|0;var ba=aa()|0;var ca=ba+ga|0;if(ba=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;assert(INITIAL_MEMORY>=65536,"INITIAL_MEMORY should be larger than STACK_SIZE, was "+INITIAL_MEMORY+"! (STACK_SIZE="+65536+")");if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":2147483648/65536})}updateMemoryViews();INITIAL_MEMORY=wasmMemory.buffer.byteLength;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="draco_decoder_gltf.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmTable=Module["asm"]["g"];addOnInit(Module["asm"]["f"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync().catch(readyPromiseReject);return{}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function _abort(){abort("")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module["WrapperObject"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module["getCache"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module["wrapPointer"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module["castObject"]=castObject;Module["NULL"]=wrapPointer(0);function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy object. (Did you create it yourself?)";obj["__destroy__"]();delete getCache(obj.__class__)[obj.ptr]}Module["destroy"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module["compare"]=compare;function getPointer(obj){return obj.ptr}Module["getPointer"]=getPointer;function getClass(obj){return obj.__class__}Module["getClass"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(ensureCache.needed){for(var i=0;i=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module["_malloc"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret},copy:function(array,view,offset){offset>>>=0;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offset>>>=1;break;case 4:offset>>>=2;break;case 8:offset>>>=3;break}for(var i=0;i3)return false;if(version[0]==1&&version[1]>=0&&version[1]<=3)return true;if(version[0]!=0||version[1]>10)return false;return true}Module["isVersionSupported"]=isVersionSupported;var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename)}return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}Module["print"]=typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null;Module["printErr"]=typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||Module["print"];Module.print=Module["print"];Module.printErr=Module["printErr"];for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;Module.printErr(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_max=Math.max;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+19728;__ATINIT__.push();memoryInitializer="data:application/octet-stream;base64,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bAAAABIAAAACAAAAAgAAAAIAAAAAAAAASAQAAG4AAABvAAAAfAAAAAAAAABYBAAAbgAAAHAAAAB8AAAATjVkcmFjbzI4QXR0cmlidXRlT2N0YWhlZHJvblRyYW5zZm9ybUUATjVkcmFjbzE4QXR0cmlidXRlVHJhbnNmb3JtRQBONWRyYWNvMzBBdHRyaWJ1dGVRdWFudGl6YXRpb25UcmFuc2Zvcm1FAE41ZHJhY28xN0F0dHJpYnV0ZXNFbmNvZGVyRQBONWRyYWNvMjNLZFRyZWVBdHRyaWJ1dGVzRW5jb2RlckUATjVkcmFjbzI2U2VxdWVudGlhbEF0dHJpYnV0ZUVuY29kZXJFAE41ZHJhY28zN1NlcXVlbnRpYWxBdHRyaWJ1dGVFbmNvZGVyc0NvbnRyb2xsZXJFAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFRUUATjVkcmFjbzM3UHJlZGljdGlvblNjaGVtZVR5cGVkRW5jb2RlckludGVyZmFjZUlpaUVFAE41ZHJhY28zMlByZWRpY3Rpb25TY2hlbWVFbmNvZGVySW50ZXJmYWNlRQBONWRyYWNvMjVQcmVkaWN0aW9uU2NoZW1lSW50ZXJmYWNlRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQyTWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMzZNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc0VuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDVNZXNoUHJlZGljdGlvblNjaGVtZU11bHRpUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQXJlYUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28yN01lc2hQcmVkaWN0aW9uU2NoZW1lRW5jb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcEVuY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280NE1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzUG9ydGFibGVFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzM2TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNFbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzU2TWVzaFByZWRpY3Rpb25TY2hlbWVDb25zdHJhaW5lZE11bHRpUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDVNZXNoUHJlZGljdGlvblNjaGVtZU11bHRpUGFyYWxsZWxvZ3JhbUVuY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBFbmNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDBNZXNoUHJlZGljdGlvblNjaGVtZVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRW5jb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUAdXNlX2J1aWx0X2luX2F0dHJpYnV0ZV9jb21wcmVzc2lvbgBONWRyYWNvMzNTZXF1ZW50aWFsSW50ZWdlckF0dHJpYnV0ZUVuY29kZXJFAE41ZHJhY28yOFByZWRpY3Rpb25TY2hlbWVEZWx0YUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFRUUATjVkcmFjbzIzUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFRUUATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDRNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc1BvcnRhYmxlRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzM2TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNFbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNTZNZXNoUHJlZGljdGlvblNjaGVtZUNvbnN0cmFpbmVkTXVsdGlQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ1TWVzaFByZWRpY3Rpb25TY2hlbWVNdWx0aVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDBNZXNoUHJlZGljdGlvblNjaGVtZVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbEVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZUVuY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRW5jb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDRNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc1BvcnRhYmxlRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28zNk1lc2hQcmVkaWN0aW9uU2NoZW1lVGV4Q29vcmRzRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQ1TWVzaFByZWRpY3Rpb25TY2hlbWVNdWx0aVBhcmFsbGVsb2dyYW1FbmNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZEVuY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRW5jb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWRFbmNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY28zMlNlcXVlbnRpYWxOb3JtYWxBdHRyaWJ1dGVFbmNvZGVyRQBONWRyYWNvMzhTZXF1ZW50aWFsUXVhbnRpemF0aW9uQXR0cmlidXRlRW5jb2RlckUAcHJlZGljdGlvbl9zY2hlbWUAZW5jb2Rpbmdfc3BlZWQAZGVjb2Rpbmdfc3BlZWQAcXVhbnRpemF0aW9uX29yaWdpbgBxdWFudGl6YXRpb25fcmFuZ2UAIABlbmNvZGluZ19tZXRob2QAcXVhbnRpemF0aW9uX2JpdHMASW52YWxpZCBlbmNvZGluZyBtZXRob2QuAHN0YW5kYXJkX2VkZ2VicmVha2VyAHByZWRpY3RpdmVfZWRnZWJyZWFrZXIAZWRnZWJyZWFrZXJfbWV0aG9kAE41ZHJhY28yMk1lc2hFZGdlQnJlYWtlckVuY29kZXJFAE41ZHJhY28yOUNvcm5lclRhYmxlVHJhdmVyc2FsUHJvY2Vzc29ySU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMjBFZGdlQnJlYWtlclRyYXZlcnNlcklOU18yOUNvcm5lclRhYmxlVHJhdmVyc2FsUHJvY2Vzc29ySU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRUVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzNfRUVOU18xOUVkZ2VCcmVha2VyT2JzZXJ2ZXJFRUVFRQBONWRyYWNvMTVQb2ludHNTZXF1ZW5jZXJFAE41ZHJhY28yOUNvcm5lclRhYmxlVHJhdmVyc2FsUHJvY2Vzc29ySU5TXzExQ29ybmVyVGFibGVFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18yMEVkZ2VCcmVha2VyVHJhdmVyc2VySU5TXzI5Q29ybmVyVGFibGVUcmF2ZXJzYWxQcm9jZXNzb3JJTlNfMTFDb3JuZXJUYWJsZUVFRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMzX0VFTlNfMTlFZGdlQnJlYWtlck9ic2VydmVyRUVFRUUATjVkcmFjbzIyTWVzaFRyYXZlcnNhbFNlcXVlbmNlcklOU18yNVByZWRpY3Rpb25EZWdyZWVUcmF2ZXJzZXJJTlNfMjlDb3JuZXJUYWJsZVRyYXZlcnNhbFByb2Nlc3NvcklOU18xMUNvcm5lclRhYmxlRUVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzNfRUVFRUVFAHNwbGl0X21lc2hfb25fc2VhbXMATjVkcmFjbzI2TWVzaEVkZ2VCcmVha2VyRW5jb2RlckltcGxJTlNfMzFNZXNoRWRnZUJyZWFrZXJUcmF2ZXJzYWxFbmNvZGVyRUVFAE41ZHJhY28zNU1lc2hFZGdlQnJlYWtlckVuY29kZXJJbXBsSW50ZXJmYWNlRQBONWRyYWNvMjZNZXNoRWRnZUJyZWFrZXJFbmNvZGVySW1wbElOU18zOE1lc2hFZGdlQnJlYWtlclRyYXZlcnNhbFZhbGVuY2VFbmNvZGVyRUVFAE41ZHJhY28xMU1lc2hFbmNvZGVyRQBjb21wcmVzc19jb25uZWN0aXZpdHkATjVkcmFjbzE1TGluZWFyU2VxdWVuY2VyRQBONWRyYWNvMjFNZXNoU2VxdWVudGlhbEVuY29kZXJFAE41ZHJhY28xN1BvaW50Q2xvdWRFbmNvZGVyRQBJbnZhbGlkIGlucHV0IGdlb21ldHJ5LgBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyLgBGYWlsZWQgdG8gZW5jb2RlIGludGVybmFsIGRhdGEuAEZhaWxlZCB0byBlbmNvZGUgZ2VvbWV0cnkgZGF0YS4ARmFpbGVkIHRvIGVuY29kZSBwb2ludCBhdHRyaWJ1dGVzLgBGYWlsZWQgdG8gZW5jb2RlIG1ldGFkYXRhLgBEUkFDTwBONWRyYWNvMjNQb2ludENsb3VkS2RUcmVlRW5jb2RlckUATjVkcmFjbzI3UG9pbnRDbG91ZFNlcXVlbnRpYWxFbmNvZGVyRQBzeW1ib2xfZW5jb2RpbmdfbWV0aG9kAHN5bWJvbF9lbmNvZGluZ19jb21wcmVzc2lvbl9sZXZlbABONWRyYWNvNE1lc2hFAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUATjVkcmFjbzEwUG9pbnRDbG91ZEUAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAtKyAgIDBYMHgAKG51bGwpAC0wWCswWCAwWC0weCsweCAweABpbmYASU5GAE5BTgAwMTIzNDU2Nzg5QUJDREVGLgBUISIZDQECAxFLHAwQBAsdEh4naG5vcHFiIAUGDxMUFRoIFgcoJBcYCQoOGx8lI4OCfSYqKzw9Pj9DR0pNWFlaW1xdXl9gYWNkZWZnaWprbHJzdHl6e3wASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAGluZmluaXR5AG5hbgAlZAAlZgB0ZXJtaW5hdGluZyB3aXRoICVzIGV4Y2VwdGlvbiBvZiB0eXBlICVzOiAlcwB0ZXJtaW5hdGluZyB3aXRoICVzIGV4Y2VwdGlvbiBvZiB0eXBlICVzAHRlcm1pbmF0aW5nIHdpdGggJXMgZm9yZWlnbiBleGNlcHRpb24AdGVybWluYXRpbmcAdW5jYXVnaHQAU3Q5ZXhjZXB0aW9uAE4xMF9fY3h4YWJpdjExNl9fc2hpbV90eXBlX2luZm9FAFN0OXR5cGVfaW5mbwBOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UATjEwX19jeHhhYml2MTE3X19jbGFzc190eXBlX2luZm9FAHB0aHJlYWRfb25jZSBmYWlsdXJlIGluIF9fY3hhX2dldF9nbG9iYWxzX2Zhc3QoKQBjYW5ub3QgY3JlYXRlIHB0aHJlYWQga2V5IGZvciBfX2N4YV9nZXRfZ2xvYmFscygpAGNhbm5vdCB6ZXJvIG91dCB0aHJlYWQgdmFsdWUgZm9yIF9fY3hhX2dldF9nbG9iYWxzKCkAdGVybWluYXRlX2hhbmRsZXIgdW5leHBlY3RlZGx5IHJldHVybmVkAFN0MTFsb2dpY19lcnJvcgBTdDEybGVuZ3RoX2Vycm9yAE4xMF9fY3h4YWJpdjExOV9fcG9pbnRlcl90eXBlX2luZm9FAE4xMF9fY3h4YWJpdjExN19fcGJhc2VfdHlwZV9pbmZvRQ==";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___cxa_allocate_exception(size){return _malloc(size)}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",ALLOC_STATIC);function ___gxx_personality_v0(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i2147483648)return false;b=new a(newBuffer);d=new c(newBuffer);f=new e(newBuffer);h=new g(newBuffer);j=new i(newBuffer);l=new k(newBuffer);n=new m(newBuffer);p=new o(newBuffer);buffer=newBuffer;return true} // EMSCRIPTEN_START_FUNCS function be(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;f[a+72>>2]=e;f[a+64>>2]=g;g=Lq(e>>>0>1073741823?-1:e<<2)|0;k=a+68|0;l=f[k>>2]|0;f[k>>2]=g;if(l|0)Mq(l);l=a+8|0;Mh(l,b,d,e);d=a+56|0;g=f[d>>2]|0;m=f[g+4>>2]|0;n=f[g>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+16|0;q=a+32|0;r=a+12|0;s=a+28|0;t=a+20|0;v=a+24|0;if(m-n>>2>>>0>p>>>0){w=p;x=n}else{y=g;aq(y)}while(1){f[j>>2]=f[x+(w<<2)>>2];f[i>>2]=f[j>>2];Cc(a,i,b,w);g=X(w,e)|0;n=b+(g<<2)|0;p=c+(g<<2)|0;g=f[l>>2]|0;if((g|0)>0){m=0;z=f[k>>2]|0;A=g;while(1){if((A|0)>0){g=0;do{B=f[z+(g<<2)>>2]|0;C=f[o>>2]|0;if((B|0)>(C|0)){D=f[q>>2]|0;f[D+(g<<2)>>2]=C;E=D}else{D=f[r>>2]|0;C=f[q>>2]|0;f[C+(g<<2)>>2]=(B|0)<(D|0)?D:B;E=C}g=g+1|0}while((g|0)<(f[l>>2]|0));F=E}else F=f[q>>2]|0;g=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=g;if((g|0)>=(f[s>>2]|0)){if((g|0)>(f[v>>2]|0)){G=g-(f[t>>2]|0)|0;H=21}}else{G=(f[t>>2]|0)+g|0;H=21}if((H|0)==21){H=0;f[C>>2]=G}m=m+1|0;A=f[l>>2]|0;if((m|0)>=(A|0))break;else z=F}}w=w+-1|0;if((w|0)<=-1){H=5;break}z=f[d>>2]|0;x=f[z>>2]|0;if((f[z+4>>2]|0)-x>>2>>>0<=w>>>0){y=z;H=6;break}}if((H|0)==5){u=h;return 1}else if((H|0)==6)aq(y);return 0}function ce(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Uc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function de(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Vc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ee(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Wc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function fe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Xc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ge(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Yc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=4194304;if(d){d=c;c=4194304;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<20)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Mf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function he(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;Zc(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=2097152;if(d){d=c;c=2097152;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<19)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Nf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ie(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;_c(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=1048576;if(d){d=c;c=1048576;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<18)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Of(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function je(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=Oa,t=Oa,u=Oa,v=0,w=0,x=0,y=0,z=0;c=f[b>>2]|0;b=a+4|0;d=f[b>>2]|0;e=(d|0)==0;a:do if(!e){g=d+-1|0;h=(g&d|0)==0;if(!h)if(c>>>0>>0)i=c;else i=(c>>>0)%(d>>>0)|0;else i=g&c;j=f[(f[a>>2]|0)+(i<<2)>>2]|0;if(!j)k=i;else{if(h){h=j;while(1){l=f[h>>2]|0;if(!l){k=i;break a}m=f[l+4>>2]|0;if(!((m|0)==(c|0)|(m&g|0)==(i|0))){k=i;break a}if((f[l+8>>2]|0)==(c|0)){o=l;break}else h=l}p=o+12|0;return p|0}else q=j;while(1){h=f[q>>2]|0;if(!h){k=i;break a}g=f[h+4>>2]|0;if((g|0)!=(c|0)){if(g>>>0>>0)r=g;else r=(g>>>0)%(d>>>0)|0;if((r|0)!=(i|0)){k=i;break a}}if((f[h+8>>2]|0)==(c|0)){o=h;break}else q=h}p=o+12|0;return p|0}}else k=0;while(0);q=ln(16)|0;f[q+8>>2]=c;f[q+12>>2]=0;f[q+4>>2]=c;f[q>>2]=0;i=a+12|0;s=$(((f[i>>2]|0)+1|0)>>>0);t=$(d>>>0);u=$(n[a+16>>2]);do if(e|$(u*t)>>0<3|(d+-1&d|0)!=0)&1;j=~~$(W($(s/u)))>>>0;Hi(a,r>>>0>>0?j:r);r=f[b>>2]|0;j=r+-1|0;if(!(j&r)){v=r;w=j&c;break}if(c>>>0>>0){v=r;w=c}else{v=r;w=(c>>>0)%(r>>>0)|0}}else{v=d;w=k}while(0);k=(f[a>>2]|0)+(w<<2)|0;w=f[k>>2]|0;if(!w){d=a+8|0;f[q>>2]=f[d>>2];f[d>>2]=q;f[k>>2]=d;d=f[q>>2]|0;if(d|0){k=f[d+4>>2]|0;d=v+-1|0;if(d&v)if(k>>>0>>0)x=k;else x=(k>>>0)%(v>>>0)|0;else x=k&d;y=(f[a>>2]|0)+(x<<2)|0;z=30}}else{f[q>>2]=f[w>>2];y=w;z=30}if((z|0)==30)f[y>>2]=q;f[i>>2]=(f[i>>2]|0)+1;o=q;p=o+12|0;return p|0}function ke(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;$c(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=262144;if(d){d=c;c=262144;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<16)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Rf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function le(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;ad(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=131072;if(d){d=c;c=131072;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<15)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Sf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function me(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;bd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=32768;if(d){d=c;c=32768;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<13)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}Uf(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ne(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;cd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function oe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;dd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function pe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;ed(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function qe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;fd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function re(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;gd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function se(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;hd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function te(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;id(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ue(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;g=u;u=u+64|0;h=g+48|0;i=g;j=d+1|0;f[h>>2]=0;k=h+4|0;f[k>>2]=0;f[h+8>>2]=0;do if(j)if(j>>>0>536870911)aq(h);else{l=ln(j<<3)|0;f[h>>2]=l;m=l+(j<<3)|0;f[h+8>>2]=m;sj(l|0,0,(d<<3)+8|0)|0;f[k>>2]=m;n=l;o=m;break}else{n=0;o=0}while(0);d=(c|0)>0;if(d){j=0;do{m=n+(f[a+(j<<2)>>2]<<3)|0;l=m;p=Vn(f[l>>2]|0,f[l+4>>2]|0,1,0)|0;l=m;f[l>>2]=p;f[l+4>>2]=I;j=j+1|0}while((j|0)!=(c|0))}j=i+40|0;l=j;f[l>>2]=0;f[l+4>>2]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;f[i+16>>2]=0;f[i+20>>2]=0;jd(i,n,o-n>>3,e)|0;n=i+16|0;o=Tn(f[n>>2]|0,f[n+4>>2]|0,1)|0;n=(f[e+4>>2]|0)-(f[e>>2]|0)|0;l=j;f[l>>2]=n;f[l+4>>2]=0;l=Vn(o|0,I|0,39,0)|0;o=Yn(l|0,I|0,3)|0;l=Vn(o|0,I|0,8,0)|0;o=Vn(l|0,I|0,n|0,0)|0;Cl(e,o,I);o=i+24|0;f[o>>2]=(f[e>>2]|0)+(f[j>>2]|0);j=i+28|0;f[j>>2]=0;n=i+32|0;f[n>>2]=16384;if(d){d=c;c=16384;do{l=d;d=d+-1|0;p=f[a+(d<<2)>>2]|0;m=f[i>>2]|0;q=f[m+(p<<3)>>2]|0;r=q<<10;if(c>>>0>>0)s=c;else{t=c;while(1){v=f[o>>2]|0;w=f[j>>2]|0;f[j>>2]=w+1;b[v+w>>0]=t;w=(f[n>>2]|0)>>>8;f[n>>2]=w;if(w>>>0>>0){s=w;break}else t=w}}c=(((s>>>0)/(q>>>0)|0)<<12)+((s>>>0)%(q>>>0)|0)+(f[m+(p<<3)+4>>2]|0)|0;f[n>>2]=c}while((l|0)>1)}_f(i,e);e=f[i>>2]|0;if(e|0){c=i+4|0;i=f[c>>2]|0;if((i|0)!=(e|0))f[c>>2]=i+(~((i+-8-e|0)>>>3)<<3);Oq(e)}e=f[h>>2]|0;if(!e){u=g;return 1}h=f[k>>2]|0;if((h|0)!=(e|0))f[k>>2]=h+(~((h+-8-e|0)>>>3)<<3);Oq(e);u=g;return 1}function ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;c=u;u=u+16|0;d=c+4|0;e=c;f[a+64>>2]=b;g=a+128|0;f[g>>2]=2;h=a+132|0;f[h>>2]=7;i=Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0;b=a+88|0;f[b>>2]=i;j=a+104|0;k=(f[i+28>>2]|0)-(f[i+24>>2]|0)>>2;i=a+108|0;l=f[i>>2]|0;m=f[j>>2]|0;n=l-m>>2;o=m;p=l;if(k>>>0<=n>>>0)if(k>>>0>>0?(q=o+(k<<2)|0,(q|0)!=(p|0)):0){o=p+(~((p+-4-q|0)>>>2)<<2)|0;f[i>>2]=o;r=o;s=m}else{r=l;s=m}else{Ci(j,k-n|0);r=f[i>>2]|0;s=f[j>>2]|0}if((r|0)!=(s|0)){s=0;do{r=f[b>>2]|0;f[e>>2]=s;f[d>>2]=f[e>>2];n=hh(r,d)|0;r=f[j>>2]|0;f[r+(s<<2)>>2]=n;s=s+1|0}while(s>>>0<(f[i>>2]|0)-r>>2>>>0)}i=a+92|0;s=f[b>>2]|0;j=f[s>>2]|0;d=(f[s+4>>2]|0)-j>>2;e=a+96|0;r=f[e>>2]|0;n=f[i>>2]|0;k=r-n>>2;m=n;n=r;if(d>>>0<=k>>>0)if(d>>>0>>0?(r=m+(d<<2)|0,(r|0)!=(n|0)):0){f[e>>2]=n+(~((n+-4-r|0)>>>2)<<2);t=s;v=j}else{t=s;v=j}else{Ci(i,d-k|0);k=f[b>>2]|0;t=k;v=f[k>>2]|0}k=f[t+4>>2]|0;if((k|0)!=(v|0)){v=f[i>>2]|0;i=f[t>>2]|0;t=k-i>>2;k=0;do{f[v+(k<<2)>>2]=f[i+(k<<2)>>2];k=k+1|0}while(k>>>0>>0)}t=(f[h>>2]|0)-(f[g>>2]|0)+1|0;g=a+136|0;h=a+140|0;a=f[h>>2]|0;k=f[g>>2]|0;i=(a-k|0)/12|0;v=a;if(t>>>0>i>>>0){Kf(g,t-i|0);u=c;return 1}if(t>>>0>=i>>>0){u=c;return 1}i=k+(t*12|0)|0;if((i|0)==(v|0)){u=c;return 1}else w=v;while(1){v=w+-12|0;f[h>>2]=v;t=f[v>>2]|0;if(!t)x=v;else{v=w+-8|0;k=f[v>>2]|0;if((k|0)!=(t|0))f[v>>2]=k+(~((k+-4-t|0)>>>2)<<2);Oq(t);x=f[h>>2]|0}if((x|0)==(i|0))break;else w=x}u=c;return 1}function we(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=f[b>>2]|0;g=f[b+4>>2]|0;h=((f[c>>2]|0)-e<<3)+(f[c+4>>2]|0)-g|0;c=e;if((h|0)<=0){i=d+4|0;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}if(!g){e=d+4|0;m=h;n=e;o=f[e>>2]|0;p=c}else{e=32-g|0;q=(h|0)<(e|0)?h:e;r=-1>>>(e-q|0)&-1<>2];e=d+4|0;s=f[e>>2]|0;t=32-s|0;u=t>>>0>>0?t:q;v=f[d>>2]|0;w=f[v>>2]&~(-1>>>(t-u|0)&-1<>2]=w;s=f[e>>2]|0;f[v>>2]=(s>>>0>g>>>0?r<>>(g-s|0))|w;w=(f[e>>2]|0)+u|0;s=v+(w>>>5<<2)|0;f[d>>2]=s;v=w&31;f[e>>2]=v;w=q-u|0;if((w|0)>0){f[s>>2]=f[s>>2]&~(-1>>>(32-w|0))|r>>>(g+u|0);f[e>>2]=w;x=w}else x=v;v=c+4|0;f[b>>2]=v;m=h-q|0;n=e;o=x;p=v}v=32-o|0;x=-1<31){o=~x;e=f[d>>2]|0;q=~m;h=m+((q|0)>-64?q:-64)+32|0;q=(h>>>5)+1|0;c=m+-32-(h&-32)|0;h=m;w=p;u=f[e>>2]|0;g=e;while(1){r=f[w>>2]|0;s=u&o;f[g>>2]=s;f[g>>2]=s|r<>2];g=g+4|0;u=f[g>>2]&x|r>>>v;f[g>>2]=u;if((h|0)<=63)break;else{h=h+-32|0;w=w+4|0}}w=p+(q<<2)|0;f[b>>2]=w;f[d>>2]=e+(q<<2);y=c;z=w}else{y=m;z=p}if((y|0)<=0){i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}p=f[z>>2]&-1>>>(32-y|0);z=(v|0)<(y|0)?v:y;m=f[d>>2]|0;w=f[m>>2]&~(-1<>2]&-1>>>(v-z|0));f[m>>2]=w;f[m>>2]=w|p<>2];w=(f[n>>2]|0)+z|0;v=m+(w>>>5<<2)|0;f[d>>2]=v;f[n>>2]=w&31;w=y-z|0;if((w|0)<=0){i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}f[v>>2]=f[v>>2]&~(-1>>>(32-w|0))|p>>>z;f[n>>2]=w;i=n;j=f[d>>2]|0;f[a>>2]=j;k=a+4|0;l=f[i>>2]|0;f[k>>2]=l;return}function xe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[b>>2]|0;g=b+4|0;h=f[g>>2]|0;i=((f[c>>2]|0)-e<<3)+(f[c+4>>2]|0)-h|0;c=e;if((i|0)<=0){j=d+4|0;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}if(!h){e=d+4|0;n=i;o=e;p=c;q=f[e>>2]|0}else{e=32-h|0;r=(i|0)<(e|0)?i:e;s=-1>>>(e-r|0)&-1<>2];c=d+4|0;h=f[c>>2]|0;e=32-h|0;t=e>>>0>>0?e:r;u=f[d>>2]|0;v=f[u>>2]&~(-1>>>(e-t|0)&-1<>2]=v;h=f[c>>2]|0;e=f[g>>2]|0;f[u>>2]=(h>>>0>e>>>0?s<>>(e-h|0))|v;v=(f[c>>2]|0)+t|0;h=u+(v>>>5<<2)|0;f[d>>2]=h;u=v&31;f[c>>2]=u;v=r-t|0;if((v|0)>0){e=f[h>>2]&~(-1>>>(32-v|0));f[h>>2]=e;f[h>>2]=e|s>>>((f[g>>2]|0)+t|0);f[c>>2]=v;w=v}else w=u;u=(f[b>>2]|0)+4|0;f[b>>2]=u;n=i-r|0;o=c;p=u;q=w}w=32-q|0;u=-1<31){q=~u;c=~n;r=n+((c|0)>-64?c:-64)+32&-32;c=n;i=p;while(1){v=f[i>>2]|0;t=f[d>>2]|0;g=f[t>>2]&q;f[t>>2]=g;f[t>>2]=g|v<>2];g=t+4|0;f[d>>2]=g;f[g>>2]=f[g>>2]&u|v>>>w;i=(f[b>>2]|0)+4|0;f[b>>2]=i;if((c|0)<=63)break;else c=c+-32|0}x=n+-32-r|0;y=i}else{x=n;y=p}if((x|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}p=f[y>>2]&-1>>>(32-x|0);y=(w|0)<(x|0)?w:x;n=f[d>>2]|0;i=f[n>>2]&~(-1<>2]&-1>>>(w-y|0));f[n>>2]=i;f[n>>2]=i|p<>2];i=(f[o>>2]|0)+y|0;w=n+(i>>>5<<2)|0;f[d>>2]=w;f[o>>2]=i&31;i=x-y|0;if((i|0)<=0){j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}f[w>>2]=f[w>>2]&~(-1>>>(32-i|0))|p>>>y;f[o>>2]=i;j=o;k=f[d>>2]|0;f[a>>2]=k;l=a+4|0;m=f[j>>2]|0;f[l>>2]=m;return}function ye(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+9|0;i=d+8|0;j=f[(f[a+184>>2]|0)+(c<<2)>>2]&255;b[h>>0]=j;c=a+4|0;k=f[(f[c>>2]|0)+44>>2]|0;l=k+16|0;m=f[l+4>>2]|0;if((m|0)>0|(m|0)==0&(f[l>>2]|0)>>>0>0)n=j;else{f[g>>2]=f[k+4>>2];f[e>>2]=f[g>>2];Me(k,e,h,h+1|0)|0;n=b[h>>0]|0}a:do if(n<<24>>24>-1){k=a+172|0;j=f[(f[k>>2]|0)+((n<<24>>24)*136|0)>>2]|0;l=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+52|0;m=b[h>>0]|0;o=f[k>>2]|0;k=f[o+(m*136|0)+132>>2]|0;switch(f[(f[(f[l>>2]|0)+84>>2]|0)+(j<<2)>>2]|0){case 0:{p=k;q=7;break a;break}case 1:{if(b[o+(m*136|0)+28>>0]|0){p=k;q=7;break a}break}default:{}}m=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=1;o=m+16|0;j=f[o+4>>2]|0;if(!((j|0)>0|(j|0)==0&(f[o>>2]|0)>>>0>0)){f[g>>2]=f[m+4>>2];f[e>>2]=f[g>>2];Me(m,e,i,i+1|0)|0}r=k}else{p=f[a+68>>2]|0;q=7}while(0);if((q|0)==7){q=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=0;a=q+16|0;h=f[a+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[a>>2]|0)>>>0>0)){f[g>>2]=f[q+4>>2];f[e>>2]=f[g>>2];Me(q,e,i,i+1|0)|0}r=p}p=f[(f[c>>2]|0)+44>>2]|0;b[i>>0]=r;r=p+16|0;c=f[r+4>>2]|0;if((c|0)>0|(c|0)==0&(f[r>>2]|0)>>>0>0){u=d;return 1}f[g>>2]=f[p+4>>2];f[e>>2]=f[g>>2];Me(p,e,i,i+1|0)|0;u=d;return 1}function ze(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;k=a+60|0;f[a+64>>2]=g;g=a+8|0;Mh(g,b,d,e);d=a+56|0;l=f[d>>2]|0;m=f[l+4>>2]|0;n=f[l>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+68|0;q=a+16|0;r=a+32|0;s=a+12|0;t=a+28|0;v=a+20|0;w=a+24|0;if(m-n>>2>>>0>p>>>0){x=p;y=n}else{z=l;aq(z)}while(1){f[j>>2]=f[y+(x<<2)>>2];f[i>>2]=f[j>>2];ub(k,i,b,x);l=X(x,e)|0;n=b+(l<<2)|0;p=c+(l<<2)|0;l=f[g>>2]|0;if((l|0)>0){m=0;a=o;A=l;while(1){if((A|0)>0){l=0;do{B=f[a+(l<<2)>>2]|0;C=f[q>>2]|0;if((B|0)>(C|0)){D=f[r>>2]|0;f[D+(l<<2)>>2]=C;E=D}else{D=f[s>>2]|0;C=f[r>>2]|0;f[C+(l<<2)>>2]=(B|0)<(D|0)?D:B;E=C}l=l+1|0}while((l|0)<(f[g>>2]|0));F=E}else F=f[r>>2]|0;l=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=l;if((l|0)>=(f[t>>2]|0)){if((l|0)>(f[w>>2]|0)){G=l-(f[v>>2]|0)|0;H=18}}else{G=(f[v>>2]|0)+l|0;H=18}if((H|0)==18){H=0;f[C>>2]=G}m=m+1|0;A=f[g>>2]|0;if((m|0)>=(A|0))break;else a=F}}x=x+-1|0;if((x|0)<=-1){H=3;break}a=f[d>>2]|0;y=f[a>>2]|0;if((f[a+4>>2]|0)-y>>2>>>0<=x>>>0){z=a;H=4;break}}if((H|0)==3){u=h;return 1}else if((H|0)==4)aq(z);return 0}function Ae(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;k=a+60|0;f[a+64>>2]=g;g=a+8|0;Mh(g,b,d,e);d=a+56|0;l=f[d>>2]|0;m=f[l+4>>2]|0;n=f[l>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+68|0;q=a+16|0;r=a+32|0;s=a+12|0;t=a+28|0;v=a+20|0;w=a+24|0;if(m-n>>2>>>0>p>>>0){x=p;y=n}else{z=l;aq(z)}while(1){f[j>>2]=f[y+(x<<2)>>2];f[i>>2]=f[j>>2];tb(k,i,b,x);l=X(x,e)|0;n=b+(l<<2)|0;p=c+(l<<2)|0;l=f[g>>2]|0;if((l|0)>0){m=0;a=o;A=l;while(1){if((A|0)>0){l=0;do{B=f[a+(l<<2)>>2]|0;C=f[q>>2]|0;if((B|0)>(C|0)){D=f[r>>2]|0;f[D+(l<<2)>>2]=C;E=D}else{D=f[s>>2]|0;C=f[r>>2]|0;f[C+(l<<2)>>2]=(B|0)<(D|0)?D:B;E=C}l=l+1|0}while((l|0)<(f[g>>2]|0));F=E}else F=f[r>>2]|0;l=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=l;if((l|0)>=(f[t>>2]|0)){if((l|0)>(f[w>>2]|0)){G=l-(f[v>>2]|0)|0;H=18}}else{G=(f[v>>2]|0)+l|0;H=18}if((H|0)==18){H=0;f[C>>2]=G}m=m+1|0;A=f[g>>2]|0;if((m|0)>=(A|0))break;else a=F}}x=x+-1|0;if((x|0)<=-1){H=3;break}a=f[d>>2]|0;y=f[a>>2]|0;if((f[a+4>>2]|0)-y>>2>>>0<=x>>>0){z=a;H=4;break}}if((H|0)==3){u=h;return 1}else if((H|0)==4)aq(z);return 0}function Be(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+12|0;g=f[e>>2]|0;h=(f[g+4>>2]|0)-(f[g>>2]|0)>>2;if(!h){u=b;return 1}i=a+152|0;j=a+140|0;k=a+144|0;l=a+148|0;a=0;m=g;while(1){f[d>>2]=(a>>>0)/3|0;f[c>>2]=f[d>>2];if(!(_j(m,c)|0)?(g=f[e>>2]|0,(f[(f[g+12>>2]|0)+(a<<2)>>2]|0)==-1):0){n=a+1|0;o=((n>>>0)%3|0|0)==0?a+-2|0:n;if((o|0)==-1)p=-1;else p=f[(f[g>>2]|0)+(o<<2)>>2]|0;o=f[i>>2]|0;if((f[o+(p<<2)>>2]|0)==-1){g=f[k>>2]|0;n=f[l>>2]|0;if((g|0)==(n<<5|0)){if((g+1|0)<0){q=11;break}r=n<<6;n=g+32&-32;vi(j,g>>>0<1073741823?(r>>>0>>0?n:r):2147483647);s=f[k>>2]|0;t=f[i>>2]|0}else{s=g;t=o}f[k>>2]=s+1;o=(f[j>>2]|0)+(s>>>5<<2)|0;f[o>>2]=f[o>>2]&~(1<<(s&31));o=t+(p<<2)|0;if((f[o>>2]|0)==-1){r=a;n=o;while(1){f[n>>2]=g;o=r+1|0;a:do if((r|0)!=-1?(v=((o>>>0)%3|0|0)==0?r+-2|0:o,(v|0)!=-1):0){w=f[e>>2]|0;x=f[w+12>>2]|0;y=v;while(1){v=f[x+(y<<2)>>2]|0;if((v|0)==-1)break;z=v+1|0;A=((z>>>0)%3|0|0)==0?v+-2|0:z;if((A|0)==-1){B=-1;C=-1;break a}else y=A}x=y+1|0;A=((x>>>0)%3|0|0)==0?y+-2|0:x;if((A|0)==-1){B=y;C=-1}else{B=y;C=f[(f[w>>2]|0)+(A<<2)>>2]|0}}else{B=-1;C=-1}while(0);n=t+(C<<2)|0;if((f[n>>2]|0)!=-1)break;else r=B}}}}r=a+1|0;if(r>>>0>=h>>>0){q=3;break}a=r;m=f[e>>2]|0}if((q|0)==3){u=b;return 1}else if((q|0)==11)aq(j);return 0}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=u;u=u+32|0;e=d+8|0;g=d;h=a+4|0;i=f[h>>2]|0;if(i>>>0>=b>>>0){f[h>>2]=b;u=d;return}j=a+8|0;k=f[j>>2]|0;l=k<<5;m=b-i|0;if(l>>>0>>0|i>>>0>(l-m|0)>>>0){f[e>>2]=0;n=e+4|0;f[n>>2]=0;o=e+8|0;f[o>>2]=0;if((b|0)<0)aq(a);p=k<<6;k=b+31&-32;vi(e,l>>>0<1073741823?(p>>>0>>0?k:p):2147483647);p=f[h>>2]|0;f[n>>2]=p+m;k=f[a>>2]|0;l=k;q=f[e>>2]|0;r=(l+(p>>>5<<2)-k<<3)+(p&31)|0;if((r|0)>0){p=r>>>5;im(q|0,k|0,p<<2|0)|0;k=r&31;r=q+(p<<2)|0;s=r;if(!k){t=0;v=s}else{w=-1>>>(32-k|0);f[r>>2]=f[r>>2]&~w|f[l+(p<<2)>>2]&w;t=k;v=s}}else{t=0;v=q}f[g>>2]=v;f[g+4>>2]=t;t=g;g=f[t>>2]|0;v=f[t+4>>2]|0;t=f[a>>2]|0;f[a>>2]=f[e>>2];f[e>>2]=t;e=f[h>>2]|0;f[h>>2]=f[n>>2];f[n>>2]=e;e=f[j>>2]|0;f[j>>2]=f[o>>2];f[o>>2]=e;if(t|0)Oq(t);x=g;y=v}else{v=(f[a>>2]|0)+(i>>>5<<2)|0;f[h>>2]=b;x=v;y=i&31}if(!m){u=d;return}i=(y|0)==0;v=x;if(c){if(i){z=m;A=x;B=v}else{c=32-y|0;b=c>>>0>m>>>0?m:c;f[v>>2]=f[v>>2]|-1>>>(c-b|0)&-1<>>5;sj(A|0,-1,c<<2|0)|0;A=z&31;z=B+(c<<2)|0;if(!A){u=d;return}f[z>>2]=f[z>>2]|-1>>>(32-A|0);u=d;return}else{if(i){C=m;D=x;E=v}else{x=32-y|0;i=x>>>0>m>>>0?m:x;f[v>>2]=f[v>>2]&~(-1>>>(x-i|0)&-1<>>5;sj(D|0,0,y<<2|0)|0;D=C&31;C=E+(y<<2)|0;if(!D){u=d;return}f[C>>2]=f[C>>2]&~(-1>>>(32-D|0));u=d;return}}function De(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;a=u;u=u+48|0;g=a+36|0;h=a+24|0;i=a+12|0;j=a;if(!c){k=0;u=a;return k|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;l=Gj(d)|0;if(l>>>0>4294967279)aq(g);if(l>>>0<11){b[g+11>>0]=l;if(!l)m=g;else{n=g;o=7}}else{p=l+16&-16;q=ln(p)|0;f[g>>2]=q;f[g+8>>2]=p|-2147483648;f[g+4>>2]=l;n=q;o=7}if((o|0)==7){kh(n|0,d|0,l|0)|0;m=n}b[m+l>>0]=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;l=Gj(e)|0;if(l>>>0>4294967279)aq(h);if(l>>>0<11){b[h+11>>0]=l;if(!l)r=h;else{s=h;o=13}}else{m=l+16&-16;n=ln(m)|0;f[h>>2]=n;f[h+8>>2]=m|-2147483648;f[h+4>>2]=l;s=n;o=13}if((o|0)==13){kh(s|0,e|0,l|0)|0;r=s}b[r+l>>0]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;l=Gj(d)|0;if(l>>>0>4294967279)aq(i);if(l>>>0<11){b[i+11>>0]=l;if(!l)t=i;else{v=i;o=19}}else{r=l+16&-16;s=ln(r)|0;f[i>>2]=s;f[i+8>>2]=r|-2147483648;f[i+4>>2]=l;v=s;o=19}if((o|0)==19){kh(v|0,d|0,l|0)|0;t=v}b[t+l>>0]=0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;l=Gj(e)|0;if(l>>>0>4294967279)aq(j);if(l>>>0<11){b[j+11>>0]=l;if(!l)w=j;else{x=j;o=25}}else{t=l+16&-16;v=ln(t)|0;f[j>>2]=v;f[j+8>>2]=t|-2147483648;f[j+4>>2]=l;x=v;o=25}if((o|0)==25){kh(x|0,e|0,l|0)|0;w=x}b[w+l>>0]=0;mn(c,i,j);if((b[j+11>>0]|0)<0)Oq(f[j>>2]|0);if((b[i+11>>0]|0)<0)Oq(f[i>>2]|0);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);k=1;u=a;return k|0}function Ee(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;f[a>>2]=f[c>>2];d=c+4|0;f[a+4>>2]=f[d>>2];e=c+8|0;f[a+8>>2]=f[e>>2];g=c+12|0;f[a+12>>2]=f[g>>2];f[d>>2]=0;f[e>>2]=0;f[g>>2]=0;g=c+16|0;f[a+16>>2]=f[g>>2];e=c+20|0;f[a+20>>2]=f[e>>2];d=c+24|0;f[a+24>>2]=f[d>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;b[a+28>>0]=b[c+28>>0]|0;d=a+32|0;e=c+32|0;f[d>>2]=0;g=a+36|0;f[g>>2]=0;f[a+40>>2]=0;f[d>>2]=f[e>>2];d=c+36|0;f[g>>2]=f[d>>2];g=c+40|0;f[a+40>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;e=a+44|0;d=c+44|0;f[e>>2]=0;g=a+48|0;f[g>>2]=0;f[a+52>>2]=0;f[e>>2]=f[d>>2];e=c+48|0;f[g>>2]=f[e>>2];g=c+52|0;f[a+52>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+56|0;e=c+56|0;f[d>>2]=0;g=a+60|0;f[g>>2]=0;f[a+64>>2]=0;f[d>>2]=f[e>>2];d=c+60|0;f[g>>2]=f[d>>2];g=c+64|0;f[a+64>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+68>>2]=f[c+68>>2];f[a+72>>2]=f[c+72>>2];e=a+76|0;d=c+76|0;f[e>>2]=0;g=a+80|0;f[g>>2]=0;f[a+84>>2]=0;f[e>>2]=f[d>>2];e=c+80|0;f[g>>2]=f[e>>2];g=c+84|0;f[a+84>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+88|0;e=c+88|0;f[d>>2]=0;g=a+92|0;f[g>>2]=0;f[a+96>>2]=0;f[d>>2]=f[e>>2];d=c+92|0;f[g>>2]=f[d>>2];g=c+96|0;f[a+96>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;b[a+100>>0]=b[c+100>>0]|0;e=a+104|0;d=c+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;f[a+112>>2]=0;f[e>>2]=f[d>>2];e=c+108|0;f[g>>2]=f[e>>2];g=c+112|0;f[a+112>>2]=f[g>>2];f[g>>2]=0;f[e>>2]=0;f[d>>2]=0;d=a+116|0;e=c+116|0;f[d>>2]=0;g=a+120|0;f[g>>2]=0;f[a+124>>2]=0;f[d>>2]=f[e>>2];d=c+120|0;f[g>>2]=f[d>>2];g=c+124|0;f[a+124>>2]=f[g>>2];f[g>>2]=0;f[d>>2]=0;f[e>>2]=0;f[a+128>>2]=f[c+128>>2];f[a+132>>2]=f[c+132>>2];return}function Fe(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;h=u;u=u+48|0;i=h+36|0;j=h+24|0;k=h+8|0;l=h+4|0;m=h;n=e+4|0;Rh(i,c,(f[n>>2]|0)-(f[e>>2]|0)>>2,2,g,d,1);g=f[i>>2]|0;o=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;f[k>>2]=-1;f[k+4>>2]=-1;f[k+8>>2]=-1;f[k+12>>2]=-1;p=f[c+4>>2]|0;if((p+-2|0)>>>0<=28){f[k>>2]=p;c=1<>2]=c+-1;p=c+-2|0;f[k+8>>2]=p;f[k+12>>2]=(p|0)/2|0;p=f[e>>2]|0;if((f[n>>2]|0)==(p|0))q=g;else{c=d+84|0;r=d+68|0;s=d+48|0;t=d+40|0;v=0;w=0;x=p;while(1){p=f[x+(v<<2)>>2]|0;if(!(b[c>>0]|0))y=f[(f[r>>2]|0)+(p<<2)>>2]|0;else y=p;p=s;z=f[p>>2]|0;A=f[p+4>>2]|0;p=t;B=f[p>>2]|0;C=un(B|0,f[p+4>>2]|0,y|0,0)|0;p=Vn(C|0,I|0,z|0,A|0)|0;kh(j|0,(f[f[d>>2]>>2]|0)+p|0,B|0)|0;rf(k,j,l,m);f[o+(w<<2)>>2]=f[l>>2];f[o+((w|1)<<2)>>2]=f[m>>2];v=v+1|0;x=f[e>>2]|0;if(v>>>0>=(f[n>>2]|0)-x>>2>>>0)break;else w=w+2|0}q=f[i>>2]|0}f[a>>2]=q;f[i>>2]=0;u=h;return}f[a>>2]=0;f[i>>2]=0;if(!g){u=h;return}i=g+88|0;a=f[i>>2]|0;f[i>>2]=0;if(a|0){i=f[a+8>>2]|0;if(i|0){q=a+12|0;if((f[q>>2]|0)!=(i|0))f[q>>2]=i;Oq(i)}Oq(a)}a=f[g+68>>2]|0;if(a|0){i=g+72|0;q=f[i>>2]|0;if((q|0)!=(a|0))f[i>>2]=q+(~((q+-4-a|0)>>>2)<<2);Oq(a)}a=g+64|0;q=f[a>>2]|0;f[a>>2]=0;if(q|0){a=f[q>>2]|0;if(a|0){i=q+4|0;if((f[i>>2]|0)!=(a|0))f[i>>2]=a;Oq(a)}Oq(q)}Oq(g);u=h;return}function Ge(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/136|0)>>>0>=c>>>0){i=c;j=h;do{f[j>>2]=-1;Ok(j+4|0);b[j+100>>0]=1;k=j+104|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[k+24>>2]=0;j=(f[g>>2]|0)+136|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/136|0;h=j+c|0;if(h>>>0>31580641)aq(a);k=(e-i|0)/136|0;i=k<<1;e=k>>>0<15790320?(i>>>0>>0?h:i):31580641;do if(e)if(e>>>0>31580641){i=ra(8)|0;Oo(i,16035);f[i>>2]=7256;va(i|0,1112,110)}else{l=ln(e*136|0)|0;break}else l=0;while(0);i=l+(j*136|0)|0;j=i;h=l+(e*136|0)|0;e=c;c=j;l=i;do{f[l>>2]=-1;Ok(l+4|0);b[l+100>>0]=1;k=l+104|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[k+24>>2]=0;l=c+136|0;c=l;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;l=f[g>>2]|0;if((l|0)==(e|0)){m=j;n=e;o=e}else{k=l;l=j;j=i;do{k=k+-136|0;Ee(j+-136|0,k);j=l+-136|0;l=j}while((k|0)!=(e|0));m=l;n=f[a>>2]|0;o=f[g>>2]|0}f[a>>2]=m;f[g>>2]=c;f[d>>2]=h;h=n;if((o|0)!=(h|0)){d=o;do{o=f[d+-20>>2]|0;if(o|0){c=d+-16|0;g=f[c>>2]|0;if((g|0)!=(o|0))f[c>>2]=g+(~((g+-4-o|0)>>>2)<<2);Oq(o)}o=f[d+-32>>2]|0;if(o|0){g=d+-28|0;c=f[g>>2]|0;if((c|0)!=(o|0))f[g>>2]=c+(~((c+-4-o|0)>>>2)<<2);Oq(o)}Mi(d+-132|0);d=d+-136|0}while((d|0)!=(h|0))}if(!n)return;Oq(n);return}function He(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=f[b>>2]|0;b=a+12|0;d=(c|0)==-1;e=c+1|0;do if(!d){g=((e>>>0)%3|0|0)==0?c+-2|0:e;if(!((c>>>0)%3|0)){h=g;i=c+2|0;break}else{h=g;i=c+-1|0;break}}else{h=-1;i=-1}while(0);e=d?-1:(c>>>0)/3|0;g=a+28|0;j=(f[g>>2]|0)+(e>>>5<<2)|0;f[j>>2]=1<<(e&31)|f[j>>2];j=a+172|0;e=a+176|0;k=a+280|0;if(((!d?(d=f[(f[(f[b>>2]|0)+12>>2]|0)+(c<<2)>>2]|0,(d|0)!=-1):0)?(a=(d>>>0)/3|0,(f[(f[g>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0):0)?(a=f[j>>2]|0,(f[e>>2]|0)!=(a|0)):0){d=c>>>5;l=1<<(c&31);c=0;m=a;do{a=(f[k>>2]|0)+(c<<5)|0;if(!(l&f[(f[m+(c*136|0)+4>>2]|0)+(d<<2)>>2]))fj(a,0);else fj(a,1);c=c+1|0;m=f[j>>2]|0}while(c>>>0<(((f[e>>2]|0)-m|0)/136|0)>>>0)}if((((h|0)!=-1?(m=f[(f[(f[b>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,(m|0)!=-1):0)?(c=(m>>>0)/3|0,(f[(f[g>>2]|0)+(c>>>5<<2)>>2]&1<<(c&31)|0)==0):0)?(c=f[j>>2]|0,(f[e>>2]|0)!=(c|0)):0){m=h>>>5;d=1<<(h&31);h=0;l=c;do{c=(f[k>>2]|0)+(h<<5)|0;if(!(d&f[(f[l+(h*136|0)+4>>2]|0)+(m<<2)>>2]))fj(c,0);else fj(c,1);h=h+1|0;l=f[j>>2]|0}while(h>>>0<(((f[e>>2]|0)-l|0)/136|0)>>>0)}if((i|0)==-1)return 1;l=f[(f[(f[b>>2]|0)+12>>2]|0)+(i<<2)>>2]|0;if((l|0)==-1)return 1;b=(l>>>0)/3|0;if(f[(f[g>>2]|0)+(b>>>5<<2)>>2]&1<<(b&31)|0)return 1;b=f[j>>2]|0;if((f[e>>2]|0)==(b|0))return 1;g=i>>>5;l=1<<(i&31);i=0;h=b;do{b=(f[k>>2]|0)+(i<<5)|0;if(!(l&f[(f[h+(i*136|0)+4>>2]|0)+(g<<2)>>2]))fj(b,0);else fj(b,1);i=i+1|0;h=f[j>>2]|0}while(i>>>0<(((f[e>>2]|0)-h|0)/136|0)>>>0);return 1}function Ie(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+4|0;j=a+8|0;ci((f[j>>2]|0)-(f[i>>2]|0)>>2,c)|0;k=f[i>>2]|0;if((f[j>>2]|0)==(k|0)){u=d;return 1}l=a+32|0;a=c+16|0;m=c+4|0;n=h+1|0;o=h+1|0;p=h+1|0;q=h+1|0;r=0;s=k;do{k=f[(f[(f[l>>2]|0)+8>>2]|0)+(f[s+(r<<2)>>2]<<2)>>2]|0;b[h>>0]=f[k+56>>2];t=a;v=f[t>>2]|0;w=f[t+4>>2]|0;if((w|0)>0|(w|0)==0&v>>>0>0){x=w;y=v}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,q)|0;v=a;x=f[v+4>>2]|0;y=f[v>>2]|0}b[h>>0]=f[k+28>>2];if((x|0)>0|(x|0)==0&y>>>0>0){z=x;A=y}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,p)|0;v=a;z=f[v+4>>2]|0;A=f[v>>2]|0}b[h>>0]=b[k+24>>0]|0;if((z|0)>0|(z|0)==0&A>>>0>0){B=z;C=A}else{f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,o)|0;v=a;B=f[v+4>>2]|0;C=f[v>>2]|0}b[h>>0]=b[k+32>>0]|0;if(!((B|0)>0|(B|0)==0&C>>>0>0)){f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,n)|0}ci(f[k+60>>2]|0,c)|0;r=r+1|0;s=f[i>>2]|0}while(r>>>0<(f[j>>2]|0)-s>>2>>>0);u=d;return 1}function Je(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=Oa,D=Oa,E=Oa,F=Oa;h=u;u=u+16|0;i=h;j=e+4|0;k=b[d+24>>0]|0;l=k<<24>>24;Rh(a,c,(f[j>>2]|0)-(f[e>>2]|0)>>2,l,g,d,1);g=f[a>>2]|0;a=(f[f[g>>2]>>2]|0)+(f[g+48>>2]|0)|0;g=f[c+4>>2]|0;Ap(i);Ko(i,$(n[c+20>>2]),(1<>>0>1073741823?-1:l<<2)|0;m=f[j>>2]|0;j=f[e>>2]|0;e=j;if((m|0)==(j|0)){Mq(g);u=h;return}o=d+68|0;p=d+48|0;q=d+40|0;r=c+8|0;c=i+4|0;s=(b[d+84>>0]|0)==0;t=m-j>>2;if(k<<24>>24>0){v=0;w=0}else{k=0;do{j=f[e+(k<<2)>>2]|0;if(s)x=f[(f[o>>2]|0)+(j<<2)>>2]|0;else x=j;j=p;m=f[j>>2]|0;y=f[j+4>>2]|0;j=q;z=f[j>>2]|0;A=un(z|0,f[j+4>>2]|0,x|0,0)|0;j=Vn(A|0,I|0,m|0,y|0)|0;kh(g|0,(f[f[d>>2]>>2]|0)+j|0,z|0)|0;k=k+1|0}while(k>>>0>>0);Mq(g);u=h;return}while(1){k=f[e+(v<<2)>>2]|0;if(s)B=f[(f[o>>2]|0)+(k<<2)>>2]|0;else B=k;k=p;x=f[k>>2]|0;z=f[k+4>>2]|0;k=q;j=f[k>>2]|0;y=un(j|0,f[k+4>>2]|0,B|0,0)|0;k=Vn(y|0,I|0,x|0,z|0)|0;kh(g|0,(f[f[d>>2]>>2]|0)+k|0,j|0)|0;j=f[r>>2]|0;C=$(n[i>>2]);k=0;z=w;while(1){D=$(n[g+(k<<2)>>2]);E=$(D-$(n[j+(k<<2)>>2]));x=E<$(0.0);D=$(-E);F=$((x?D:E)/C);y=~~$(J($($(F*$(f[c>>2]|0))+$(.5))));f[a+(z<<2)>>2]=x?0-y|0:y;k=k+1|0;if((k|0)==(l|0))break;else z=z+1|0}v=v+1|0;if(v>>>0>=t>>>0)break;else w=w+l|0}Mq(g);u=h;return}function Ke(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;d=u;u=u+32|0;e=d+16|0;g=d+12|0;h=d+8|0;i=d+4|0;j=d;lp(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;k=a+24|0;lp(k);if((a|0)!=(b|0)){f[h>>2]=f[b>>2];f[i>>2]=b+4;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Oc(a,g,e)}l=b+24|0;if((k|0)!=(l|0)){f[h>>2]=f[l>>2];f[i>>2]=b+28;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Oc(k,g,e)}f[j>>2]=0;k=c+8|0;l=c+12|0;c=f[l>>2]|0;m=f[k>>2]|0;if((c-m|0)<=0){u=d;return}n=b+16|0;b=m;m=c;c=0;while(1){o=f[(f[b+(c<<2)>>2]|0)+56>>2]|0;p=f[n>>2]|0;if(p){q=n;r=p;a:while(1){p=r;while(1){if((f[p+16>>2]|0)>=(o|0))break;s=f[p+4>>2]|0;if(!s){t=q;break a}else p=s}r=f[p>>2]|0;if(!r){t=p;break}else q=p}if((t|0)!=(n|0)?(o|0)>=(f[t+16>>2]|0):0){q=t+20|0;r=Hd(a,j)|0;if((r|0)!=(q|0)){f[h>>2]=f[q>>2];f[i>>2]=t+24;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Oc(r,g,e)}v=f[j>>2]|0;w=f[k>>2]|0;x=f[l>>2]|0}else{v=c;w=b;x=m}}else{v=c;w=b;x=m}c=v+1|0;f[j>>2]=c;if((c|0)>=(x-w>>2|0))break;else{b=w;m=x}}u=d;return}function Le(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+12|0;ci(f[i>>2]|0,c)|0;if(!(f[i>>2]|0)){j=1;u=d;return j|0}k=c+16|0;l=c+4|0;m=h+1|0;n=h+1|0;o=h+1|0;p=0;while(1){q=f[a>>2]|0;r=f[q+(p<<3)>>2]|0;if(r>>>0>63)if(r>>>0>16383)if(r>>>0>4194303){j=0;s=20;break}else{t=2;s=13}else{t=1;s=13}else if(!r){v=p+1|0;w=0;while(1){if(f[q+(v+w<<3)>>2]|0){x=w;break}y=w+1|0;if(y>>>0<63)w=y;else{x=y;break}}b[h>>0]=x<<2|3;w=k;v=f[w+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[w>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];Me(c,e,h,o)|0}z=x+p|0}else{t=0;s=13}if((s|0)==13){s=0;b[h>>0]=t|r<<2;w=k;v=f[w+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[w>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];Me(c,e,h,n)|0}if(!t)z=p;else{w=0;do{w=w+1|0;b[h>>0]=r>>>((w<<3)+-2|0);v=k;q=f[v+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[v>>2]|0)>>>0>0)){f[g>>2]=f[l>>2];f[e>>2]=f[g>>2];Me(c,e,h,m)|0}}while((w|0)<(t|0));z=p}}p=z+1|0;if(p>>>0>=(f[i>>2]|0)>>>0){j=1;s=20;break}}if((s|0)==20){u=d;return j|0}return 0}function Me(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=f[a>>2]|0;h=g;i=(f[c>>2]|0)-h|0;c=g+i|0;j=e-d|0;if((j|0)<=0){k=c;return k|0}l=a+8|0;m=f[l>>2]|0;n=a+4|0;o=f[n>>2]|0;p=o;if((j|0)<=(m-p|0)){q=p-c|0;if((j|0)>(q|0)){r=d+q|0;if((r|0)==(e|0))s=o;else{t=r;u=o;while(1){b[u>>0]=b[t>>0]|0;t=t+1|0;v=(f[n>>2]|0)+1|0;f[n>>2]=v;if((t|0)==(e|0)){s=v;break}else u=v}}if((q|0)>0){w=r;x=s}else{k=c;return k|0}}else{w=e;x=o}s=x-(c+j)|0;r=c+s|0;if(r>>>0>>0){q=r;r=x;do{b[r>>0]=b[q>>0]|0;q=q+1|0;r=(f[n>>2]|0)+1|0;f[n>>2]=r}while((q|0)!=(o|0))}if(s|0)im(x+(0-s)|0,c|0,s|0)|0;if((w|0)==(d|0)){k=c;return k|0}else{y=d;z=c}while(1){b[z>>0]=b[y>>0]|0;y=y+1|0;if((y|0)==(w|0)){k=c;break}else z=z+1|0}return k|0}z=p-h+j|0;if((z|0)<0)aq(a);j=m-h|0;h=j<<1;m=j>>>0<1073741823?(h>>>0>>0?z:h):2147483647;h=c;if(!m)A=0;else A=ln(m)|0;z=A+i|0;i=z;j=A+m|0;if((d|0)==(e|0)){B=i;C=g}else{g=d;d=i;i=z;do{b[i>>0]=b[g>>0]|0;i=d+1|0;d=i;g=g+1|0}while((g|0)!=(e|0));B=d;C=f[a>>2]|0}d=h-C|0;e=z+(0-d)|0;if((d|0)>0)kh(e|0,C|0,d|0)|0;d=(f[n>>2]|0)-h|0;if((d|0)>0){h=B;kh(h|0,c|0,d|0)|0;D=h+d|0;E=f[a>>2]|0}else{D=B;E=C}f[a>>2]=e;f[n>>2]=D;f[l>>2]=j;if(!E){k=z;return k|0}Oq(E);k=z;return k|0}function Ne(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+16|0;g=e;h=f[(f[c+4>>2]|0)+(d<<2)>>2]|0;d=f[c+28>>2]|0;c=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(h<<2)>>2]|0;switch(f[c+28>>2]|0){case 5:case 6:case 3:case 4:case 1:case 2:{i=ln(40)|0;zo(i);j=i;k=j;f[a>>2]=k;u=e;return}case 9:{l=3;break}default:{}}if((l|0)==3){i=f[d+48>>2]|0;d=ln(32)|0;f[g>>2]=d;f[g+8>>2]=-2147483616;f[g+4>>2]=17;m=d;n=14495;o=m+17|0;do{b[m>>0]=b[n>>0]|0;m=m+1|0;n=n+1|0}while((m|0)<(o|0));b[d+17>>0]=0;d=i+16|0;n=f[d>>2]|0;if(n){p=d;q=n;a:while(1){n=q;while(1){if((f[n+16>>2]|0)>=(h|0))break;r=f[n+4>>2]|0;if(!r){s=p;break a}else n=r}q=f[n>>2]|0;if(!q){s=n;break}else p=n}if(((s|0)!=(d|0)?(h|0)>=(f[s+16>>2]|0):0)?(h=s+20|0,(Jh(h,g)|0)!=0):0)t=Hk(h,g,-1)|0;else l=12}else l=12;if((l|0)==12)t=Hk(i,g,-1)|0;if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if((t|0)>0)if((f[c+56>>2]|0)==1){c=ln(48)|0;m=c;o=m+48|0;do{f[m>>2]=0;m=m+4|0}while((m|0)<(o|0));zo(c);f[c>>2]=2496;f[c+40>>2]=1168;f[c+44>>2]=-1;j=c;k=j;f[a>>2]=k;u=e;return}else{c=ln(64)|0;ym(c);j=c;k=j;f[a>>2]=k;u=e;return}}c=ln(36)|0;Hm(c);j=c;k=j;f[a>>2]=k;u=e;return}function Oe(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=(c|0)==(a|0);b[c+12>>0]=d&1;if(d)return;else e=c;while(1){g=e+8|0;h=f[g>>2]|0;c=h+12|0;if(b[c>>0]|0){i=23;break}j=h+8|0;k=f[j>>2]|0;d=f[k>>2]|0;if((d|0)==(h|0)){l=f[k+4>>2]|0;if(!l){i=7;break}m=l+12|0;if(!(b[m>>0]|0))n=m;else{i=7;break}}else{if(!d){i=16;break}m=d+12|0;if(!(b[m>>0]|0))n=m;else{i=16;break}}b[c>>0]=1;c=(k|0)==(a|0);b[k+12>>0]=c&1;b[n>>0]=1;if(c){i=23;break}else e=k}if((i|0)==7){if((f[h>>2]|0)==(e|0)){o=h;p=k}else{n=h+4|0;a=f[n>>2]|0;c=f[a>>2]|0;f[n>>2]=c;if(!c)q=k;else{f[c+8>>2]=h;q=f[j>>2]|0}f[a+8>>2]=q;q=f[j>>2]|0;f[((f[q>>2]|0)==(h|0)?q:q+4|0)>>2]=a;f[a>>2]=h;f[j>>2]=a;o=a;p=f[a+8>>2]|0}b[o+12>>0]=1;b[p+12>>0]=0;o=f[p>>2]|0;a=o+4|0;q=f[a>>2]|0;f[p>>2]=q;if(q|0)f[q+8>>2]=p;q=p+8|0;f[o+8>>2]=f[q>>2];c=f[q>>2]|0;f[((f[c>>2]|0)==(p|0)?c:c+4|0)>>2]=o;f[a>>2]=p;f[q>>2]=o;return}else if((i|0)==16){if((f[h>>2]|0)==(e|0)){o=e+4|0;q=f[o>>2]|0;f[h>>2]=q;if(!q)r=k;else{f[q+8>>2]=h;r=f[j>>2]|0}f[g>>2]=r;r=f[j>>2]|0;f[((f[r>>2]|0)==(h|0)?r:r+4|0)>>2]=e;f[o>>2]=h;f[j>>2]=e;s=e;t=f[e+8>>2]|0}else{s=h;t=k}b[s+12>>0]=1;b[t+12>>0]=0;s=t+4|0;k=f[s>>2]|0;h=f[k>>2]|0;f[s>>2]=h;if(h|0)f[h+8>>2]=t;h=t+8|0;f[k+8>>2]=f[h>>2];s=f[h>>2]|0;f[((f[s>>2]|0)==(t|0)?s:s+4|0)>>2]=k;f[k>>2]=t;f[h>>2]=k;return}else if((i|0)==23)return}function Pe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=f[b>>2]|0;b=a+12|0;e=(d|0)==-1;do if(e){g=1;h=-1;i=-1}else{j=d+(((d>>>0)%3|0|0)==0?2:-1)|0;if((j|0)!=-1){k=f[(f[b>>2]|0)+12>>2]|0;l=j;while(1){j=f[k+(l<<2)>>2]|0;if((j|0)==-1){m=0;n=l;break}o=j+1|0;l=((o>>>0)%3|0|0)==0?j+-2|0:o;if((l|0)==-1){m=1;n=-1;break}}if(e){g=m;h=-1;i=n;break}else{p=m;q=n}}else{p=1;q=-1}g=p;h=f[(f[f[b>>2]>>2]|0)+(d<<2)>>2]|0;i=q}while(0);if(c){c=(f[a+84>>2]|0)+(h>>>5<<2)|0;f[c>>2]=f[c>>2]|1<<(h&31);r=1}else r=0;c=f[(f[a+152>>2]|0)+(h<<2)>>2]|0;q=(f[a+140>>2]|0)+(c>>>5<<2)|0;f[q>>2]=f[q>>2]|1<<(c&31);if(!g){g=(((i>>>0)%3|0|0)==0?2:-1)+i|0;if((g|0)==-1){s=-1;t=i}else{s=f[(f[f[b>>2]>>2]|0)+(g<<2)>>2]|0;t=i}}else{s=-1;t=-1}if((s|0)==(h|0)){u=r;return u|0}i=f[a+84>>2]|0;a=r;r=s;s=t;while(1){t=i+(r>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(r&31);t=a+1|0;g=s+1|0;a:do if((s|0)!=-1?(c=((g>>>0)%3|0|0)==0?s+-2|0:g,(c|0)!=-1):0){q=f[b>>2]|0;d=f[q+12>>2]|0;p=c;while(1){c=f[d+(p<<2)>>2]|0;if((c|0)==-1)break;n=c+1|0;m=((n>>>0)%3|0|0)==0?c+-2|0:n;if((m|0)==-1){v=-1;w=-1;break a}else p=m}d=(((p>>>0)%3|0|0)==0?2:-1)+p|0;if((d|0)==-1){v=-1;w=p}else{v=f[(f[q>>2]|0)+(d<<2)>>2]|0;w=p}}else{v=-1;w=-1}while(0);if((v|0)==(h|0)){u=t;break}else{a=t;r=v;s=w}}return u|0}function Qe(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=Oa,C=Oa,D=Oa,E=Oa;g=u;u=u+16|0;h=g;i=b[d+24>>0]|0;j=i<<24>>24;Rh(a,c,e,j,0,d,1);k=f[a>>2]|0;a=(f[f[k>>2]>>2]|0)+(f[k+48>>2]|0)|0;k=f[c+4>>2]|0;Ap(h);Ko(h,$(n[c+20>>2]),(1<>>0>1073741823?-1:j<<2)|0;if(!e){Mq(k);u=g;return}l=d+68|0;m=d+48|0;o=d+40|0;p=c+8|0;c=h+4|0;q=(b[d+84>>0]|0)==0;if(i<<24>>24>0){r=0;s=0}else{i=0;do{if(q)t=f[(f[l>>2]|0)+(i<<2)>>2]|0;else t=i;v=m;w=f[v>>2]|0;x=f[v+4>>2]|0;v=o;y=f[v>>2]|0;z=un(y|0,f[v+4>>2]|0,t|0,0)|0;v=Vn(z|0,I|0,w|0,x|0)|0;kh(k|0,(f[f[d>>2]>>2]|0)+v|0,y|0)|0;i=i+1|0}while((i|0)!=(e|0));Mq(k);u=g;return}while(1){if(q)A=f[(f[l>>2]|0)+(s<<2)>>2]|0;else A=s;i=m;t=f[i>>2]|0;y=f[i+4>>2]|0;i=o;v=f[i>>2]|0;x=un(v|0,f[i+4>>2]|0,A|0,0)|0;i=Vn(x|0,I|0,t|0,y|0)|0;kh(k|0,(f[f[d>>2]>>2]|0)+i|0,v|0)|0;v=f[p>>2]|0;B=$(n[h>>2]);i=0;y=r;while(1){C=$(n[k+(i<<2)>>2]);D=$(C-$(n[v+(i<<2)>>2]));t=D<$(0.0);C=$(-D);E=$((t?C:D)/B);x=~~$(J($($(E*$(f[c>>2]|0))+$(.5))));f[a+(y<<2)>>2]=t?0-x|0:x;i=i+1|0;if((i|0)==(j|0))break;else y=y+1|0}s=s+1|0;if((s|0)==(e|0))break;else r=r+j|0}Mq(k);u=g;return}function Re(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;c=a+4|0;d=f[c>>2]|0;e=a+100|0;if(d>>>0<(f[e>>2]|0)>>>0){f[c>>2]=d+1;g=h[d>>0]|0}else g=Si(a)|0;switch(g|0){case 43:case 45:{d=(g|0)==45&1;i=f[c>>2]|0;if(i>>>0<(f[e>>2]|0)>>>0){f[c>>2]=i+1;j=h[i>>0]|0}else j=Si(a)|0;if((b|0)!=0&(j+-48|0)>>>0>9?(f[e>>2]|0)!=0:0){f[c>>2]=(f[c>>2]|0)+-1;k=d;l=j}else{k=d;l=j}break}default:{k=0;l=g}}if((l+-48|0)>>>0>9)if(!(f[e>>2]|0)){m=-2147483648;n=0}else{f[c>>2]=(f[c>>2]|0)+-1;m=-2147483648;n=0}else{g=0;j=l;while(1){g=j+-48+(g*10|0)|0;l=f[c>>2]|0;if(l>>>0<(f[e>>2]|0)>>>0){f[c>>2]=l+1;o=h[l>>0]|0}else o=Si(a)|0;if(!((o+-48|0)>>>0<10&(g|0)<214748364))break;else j=o}j=((g|0)<0)<<31>>31;if((o+-48|0)>>>0<10){l=o;d=g;b=j;while(1){i=un(d|0,b|0,10,0)|0;p=I;q=Vn(l|0,((l|0)<0)<<31>>31|0,-48,-1)|0;r=Vn(q|0,I|0,i|0,p|0)|0;p=I;i=f[c>>2]|0;if(i>>>0<(f[e>>2]|0)>>>0){f[c>>2]=i+1;s=h[i>>0]|0}else s=Si(a)|0;if((s+-48|0)>>>0<10&((p|0)<21474836|(p|0)==21474836&r>>>0<2061584302)){l=s;d=r;b=p}else{t=s;u=r;v=p;break}}}else{t=o;u=g;v=j}if((t+-48|0)>>>0<10)do{t=f[c>>2]|0;if(t>>>0<(f[e>>2]|0)>>>0){f[c>>2]=t+1;w=h[t>>0]|0}else w=Si(a)|0}while((w+-48|0)>>>0<10);if(f[e>>2]|0)f[c>>2]=(f[c>>2]|0)+-1;c=(k|0)!=0;k=Xn(0,0,u|0,v|0)|0;m=c?I:v;n=c?k:u}I=m;return n|0}function Se(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=a+1176|0;c=f[b>>2]|0;if(c|0){d=a+1180|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);Oq(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}Oq(g)}g=a+1164|0;b=f[g>>2]|0;if(b|0){j=a+1168|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);Oq(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}Oq(l)}l=f[a+1152>>2]|0;if(l|0){g=a+1156|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+1140>>2]|0;if(l|0){m=a+1144|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+1128>>2]|0;if(!l){n=a+1108|0;jl(n);o=a+1088|0;jl(o);p=a+1068|0;jl(p);q=a+1036|0;Fj(q);r=a+12|0;Nh(r);return}g=a+1132|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l);n=a+1108|0;jl(n);o=a+1088|0;jl(o);p=a+1068|0;jl(p);q=a+1036|0;Fj(q);r=a+12|0;Nh(r);return}function Te(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+16|0;e=d;g=a+4|0;h=f[g>>2]|0;i=f[(f[a>>2]|0)+52>>2]|0;if(!h){if(!(Sa[i&31](a,c,0)|0)){j=0;u=d;return j|0}}else if(!(Sa[i&31](a,c,f[(f[h+4>>2]|0)+80>>2]|0)|0)){j=0;u=d;return j|0}if(!(b[a+28>>0]|0)){j=1;u=d;return j|0}h=f[a+8>>2]|0;i=f[a+32>>2]|0;a=f[h+80>>2]|0;f[e>>2]=0;k=e+4|0;f[k>>2]=0;f[e+8>>2]=0;do if(a)if(a>>>0>1073741823)aq(e);else{l=a<<2;m=ln(l)|0;f[e>>2]=m;n=m+(a<<2)|0;f[e+8>>2]=n;sj(m|0,0,l|0)|0;f[k>>2]=n;o=m;p=n;q=m;break}else{o=0;p=0;q=0}while(0);e=f[c+4>>2]|0;a=f[c>>2]|0;c=a;a:do if((e|0)!=(a|0)){m=e-a>>2;if(b[h+84>>0]|0){n=0;while(1){f[o+(f[c+(n<<2)>>2]<<2)>>2]=n;n=n+1|0;if(n>>>0>=m>>>0)break a}}n=f[h+68>>2]|0;l=0;do{f[o+(f[n+(f[c+(l<<2)>>2]<<2)>>2]<<2)>>2]=l;l=l+1|0}while(l>>>0>>0)}while(0);c=f[(f[(f[g>>2]|0)+4>>2]|0)+80>>2]|0;b:do if(c|0){g=f[i+68>>2]|0;if(b[h+84>>0]|0){a=0;while(1){f[g+(a<<2)>>2]=f[o+(a<<2)>>2];a=a+1|0;if(a>>>0>=c>>>0)break b}}a=f[h+68>>2]|0;e=0;do{f[g+(e<<2)>>2]=f[o+(f[a+(e<<2)>>2]<<2)>>2];e=e+1|0}while(e>>>0>>0)}while(0);if(o|0){if((p|0)!=(o|0))f[k>>2]=p+(~((p+-4-o|0)>>>2)<<2);Oq(q)}j=1;u=d;return j|0}function Ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;Oh(a+12|0);wn(a+1036|0);vo(a+1068|0);vo(a+1088|0);vo(a+1108|0);e=a+1128|0;f[e>>2]=0;g=a+1132|0;f[g>>2]=0;f[a+1136>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)aq(e);else{i=b<<2;j=ln(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+1136>>2]=k;sj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+1140|0;f[g>>2]=0;e=a+1144|0;f[e>>2]=0;f[a+1148>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+1148>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=a+1152|0;f[g>>2]=0;e=a+1156|0;f[e>>2]=0;f[a+1160>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+1160>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;sj(i|0,0,k|0)|0;f[e>>2]=j}lk(a+1164|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);Oq(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=ln(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;sj(k|0,0,h|0)|0;f[j>>2]=e}lk(a+1176|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g);u=c;return}function Ve(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0;g=u;u=u+16|0;h=g;i=b+16|0;f[a>>2]=f[i>>2];f[a+4>>2]=f[i+4>>2];f[a+8>>2]=f[i+8>>2];f[a+12>>2]=f[i+12>>2];f[a+16>>2]=f[i+16>>2];f[a+20>>2]=f[i+20>>2];j=a+8|0;f[j>>2]=(f[j>>2]|0)+d;j=(d|0)>0;if(j){k=b+4|0;l=a+16|0;m=a+12|0;n=f[b>>2]|0;o=n;q=0;r=o;s=n;n=o;while(1){o=f[c+(q<<2)>>2]|0;t=f[k>>2]|0;if(t-s>>2>>>0>o>>>0){v=r;w=n}else{x=o+1|0;f[h>>2]=0;y=t-s>>2;z=s;A=t;if(x>>>0<=y>>>0)if(x>>>0>>0?(t=z+(x<<2)|0,(t|0)!=(A|0)):0){f[k>>2]=A+(~((A+-4-t|0)>>>2)<<2);B=r}else B=r;else{Ch(b,x-y|0,h);B=f[b>>2]|0}v=B;w=B}y=w+(o<<2)|0;x=f[y>>2]|0;s=w;if((x|0)<=1)if((x|0)==0?(f[l>>2]=(f[l>>2]|0)+1,o>>>0>(f[m>>2]|0)>>>0):0){f[m>>2]=o;C=0.0}else C=0.0;else{D=+(x|0);C=+Zg(D)*D}x=(f[y>>2]|0)+1|0;f[y>>2]=x;D=+(x|0);E=+Zg(D)*D-C;p[a>>3]=+p[a>>3]+E;q=q+1|0;if((q|0)==(d|0))break;else{r=v;n=w}}}if(e){f[i>>2]=f[a>>2];f[i+4>>2]=f[a+4>>2];f[i+8>>2]=f[a+8>>2];f[i+12>>2]=f[a+12>>2];f[i+16>>2]=f[a+16>>2];u=g;return}if(!j){u=g;return}j=f[b>>2]|0;b=0;do{a=j+(f[c+(b<<2)>>2]<<2)|0;f[a>>2]=(f[a>>2]|0)+-1;b=b+1|0}while((b|0)!=(d|0));u=g;return}function We(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;f[a>>2]=e;break a;break}case 10:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;e=a;f[e>>2]=d;f[e+4>>2]=((d|0)<0)<<31>>31;break a;break}case 11:{d=(f[c>>2]|0)+(4-1)&~(4-1);e=f[d>>2]|0;f[c>>2]=d+4;d=a;f[d>>2]=e;f[d+4>>2]=0;break a;break}case 12:{d=(f[c>>2]|0)+(8-1)&~(8-1);e=d;g=f[e>>2]|0;h=f[e+4>>2]|0;f[c>>2]=d+8;d=a;f[d>>2]=g;f[d+4>>2]=h;break a;break}case 13:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&65535)<<16>>16;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 14:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&65535;f[h+4>>2]=0;break a;break}case 15:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=(d&255)<<24>>24;d=a;f[d>>2]=h;f[d+4>>2]=((h|0)<0)<<31>>31;break a;break}case 16:{h=(f[c>>2]|0)+(4-1)&~(4-1);d=f[h>>2]|0;f[c>>2]=h+4;h=a;f[h>>2]=d&255;f[h+4>>2]=0;break a;break}case 17:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}case 18:{h=(f[c>>2]|0)+(8-1)&~(8-1);i=+p[h>>3];f[c>>2]=h+8;p[a>>3]=i;break a;break}default:break a}while(0);while(0);return}function Xe(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=u;u=u+16|0;d=c+4|0;e=c;g=c+8|0;if(!(Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0)){h=0;u=c;return h|0}i=a+44|0;j=f[i>>2]|0;k=a+8|0;l=a+12|0;m=f[l>>2]|0;n=f[k>>2]|0;b[g>>0]=(m-n|0)>>>2;o=j+16|0;p=f[o+4>>2]|0;if((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0){q=k;r=n;s=m}else{f[e>>2]=f[j+4>>2];f[d>>2]=f[e>>2];Me(j,d,g,g+1|0)|0;q=k;r=f[k>>2]|0;s=f[l>>2]|0}a:do if((r|0)!=(s|0)){l=a+4|0;k=r;while(1){g=f[k>>2]|0;k=k+4|0;if(!(Sa[f[(f[g>>2]|0)+8>>2]&31](g,a,f[l>>2]|0)|0)){h=0;break}if((k|0)==(s|0))break a}u=c;return h|0}while(0);if(!(xc(a)|0)){h=0;u=c;return h|0}s=a+32|0;r=f[s>>2]|0;k=a+36|0;l=f[k>>2]|0;b:do if((r|0)!=(l|0)){g=r;do{if(!(Ra[f[(f[a>>2]|0)+40>>2]&127](a,f[g>>2]|0)|0)){h=0;t=18;break}g=g+4|0}while((g|0)!=(l|0));if((t|0)==18){u=c;return h|0}g=f[s>>2]|0;d=f[k>>2]|0;if((g|0)!=(d|0)){j=g;while(1){g=f[(f[q>>2]|0)+(f[j>>2]<<2)>>2]|0;j=j+4|0;if(!(Ra[f[(f[g>>2]|0)+12>>2]&127](g,f[i>>2]|0)|0)){h=0;break}if((j|0)==(d|0))break b}u=c;return h|0}}while(0);h=Qa[f[(f[a>>2]|0)+44>>2]&127](a)|0;u=c;return h|0}function Ye(a,b){a=a|0;b=b|0;ld(a,b);ld(a+32|0,b);ld(a+64|0,b);ld(a+96|0,b);ld(a+128|0,b);ld(a+160|0,b);ld(a+192|0,b);ld(a+224|0,b);ld(a+256|0,b);ld(a+288|0,b);ld(a+320|0,b);ld(a+352|0,b);ld(a+384|0,b);ld(a+416|0,b);ld(a+448|0,b);ld(a+480|0,b);ld(a+512|0,b);ld(a+544|0,b);ld(a+576|0,b);ld(a+608|0,b);ld(a+640|0,b);ld(a+672|0,b);ld(a+704|0,b);ld(a+736|0,b);ld(a+768|0,b);ld(a+800|0,b);ld(a+832|0,b);ld(a+864|0,b);ld(a+896|0,b);ld(a+928|0,b);ld(a+960|0,b);ld(a+992|0,b);ld(a+1024|0,b);return}function Ze(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0;c=u;u=u+32|0;d=c;e=a+4|0;g=f[a>>2]|0;h=(f[e>>2]|0)-g>>2;i=h+1|0;if(i>>>0>1073741823)aq(a);j=a+8|0;k=(f[j>>2]|0)-g|0;g=k>>1;l=k>>2>>>0<536870911?(g>>>0>>0?i:g):1073741823;f[d+12>>2]=0;f[d+16>>2]=a+8;do if(l)if(l>>>0>1073741823){g=ra(8)|0;Oo(g,16035);f[g>>2]=7256;va(g|0,1112,110)}else{m=ln(l<<2)|0;break}else m=0;while(0);f[d>>2]=m;g=m+(h<<2)|0;h=d+8|0;i=d+4|0;f[i>>2]=g;k=m+(l<<2)|0;l=d+12|0;f[l>>2]=k;m=f[b>>2]|0;f[b>>2]=0;f[g>>2]=m;m=g+4|0;f[h>>2]=m;b=f[a>>2]|0;n=f[e>>2]|0;if((n|0)==(b|0)){o=g;p=l;q=h;r=b;s=m;t=n;v=k;w=o;f[a>>2]=w;f[i>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;ki(d);u=c;return}else{y=n;z=g}do{y=y+-4|0;g=f[y>>2]|0;f[y>>2]=0;f[z+-4>>2]=g;z=(f[i>>2]|0)+-4|0;f[i>>2]=z}while((y|0)!=(b|0));o=z;p=l;q=h;r=f[a>>2]|0;s=f[h>>2]|0;t=f[e>>2]|0;v=f[l>>2]|0;w=o;f[a>>2]=w;f[i>>2]=r;f[e>>2]=s;f[q>>2]=t;x=f[j>>2]|0;f[j>>2]=v;f[p>>2]=x;f[d>>2]=r;ki(d);u=c;return}function _e(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+32|0;e=d+12|0;g=d;h=nl(c,0)|0;if(!h){f[a>>2]=0;u=d;return}i=f[c+100>>2]|0;j=f[c+96>>2]|0;c=i-j|0;k=(c|0)/12|0;f[e>>2]=0;l=e+4|0;f[l>>2]=0;f[e+8>>2]=0;m=j;do if(c)if(k>>>0>357913941)aq(e);else{n=ln(c)|0;f[e>>2]=n;f[e+8>>2]=n+(k*12|0);sj(n|0,0,c|0)|0;f[l>>2]=n+c;o=n;break}else o=0;while(0);f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;a:do if((i|0)!=(j|0)){c=g+4|0;n=g+8|0;if(b[h+84>>0]|0){p=0;while(1){q=m+(p*12|0)|0;f[g>>2]=f[q>>2];f[g+4>>2]=f[q+4>>2];f[g+8>>2]=f[q+8>>2];f[o+(p*12|0)>>2]=f[g>>2];f[o+(p*12|0)+4>>2]=f[c>>2];f[o+(p*12|0)+8>>2]=f[n>>2];p=p+1|0;if(p>>>0>=k>>>0)break a}}p=f[h+68>>2]|0;q=0;do{r=f[p+(f[m+(q*12|0)>>2]<<2)>>2]|0;f[g>>2]=r;s=f[p+(f[m+(q*12|0)+4>>2]<<2)>>2]|0;f[c>>2]=s;t=f[p+(f[m+(q*12|0)+8>>2]<<2)>>2]|0;f[n>>2]=t;f[o+(q*12|0)>>2]=r;f[o+(q*12|0)+4>>2]=s;f[o+(q*12|0)+8>>2]=t;q=q+1|0}while(q>>>0>>0)}while(0);Kj(a,e);a=f[e>>2]|0;if(a|0){e=f[l>>2]|0;if((e|0)!=(a|0))f[l>>2]=e+(~(((e+-12-a|0)>>>0)/12|0)*12|0);Oq(a)}u=d;return}function $e(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;wn(a+12|0);vo(a+44|0);vo(a+64|0);vo(a+84|0);e=a+104|0;f[e>>2]=0;g=a+108|0;f[g>>2]=0;f[a+112>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)aq(e);else{i=b<<2;j=ln(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+112>>2]=k;sj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+116|0;f[g>>2]=0;e=a+120|0;f[e>>2]=0;f[a+124>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+124>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=a+128|0;f[g>>2]=0;e=a+132|0;f[e>>2]=0;f[a+136>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+136>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;sj(i|0,0,k|0)|0;f[e>>2]=j}lk(a+140|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);Oq(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=ln(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;sj(k|0,0,h|0)|0;f[j>>2]=e}lk(a+152|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g);u=c;return}function af(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=u;u=u+16|0;d=c;f[a>>2]=0;f[a+8>>2]=b;vo(a+12|0);vo(a+32|0);vo(a+52|0);vo(a+72|0);e=a+92|0;f[e>>2]=0;g=a+96|0;f[g>>2]=0;f[a+100>>2]=0;h=(b|0)==0;do if(!h)if(b>>>0>1073741823)aq(e);else{i=b<<2;j=ln(i)|0;f[e>>2]=j;k=j+(b<<2)|0;f[a+100>>2]=k;sj(j|0,0,i|0)|0;f[g>>2]=k;break}while(0);g=a+104|0;f[g>>2]=0;e=a+108|0;f[e>>2]=0;f[a+112>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+112>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=a+116|0;f[g>>2]=0;e=a+120|0;f[e>>2]=0;f[a+124>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[g>>2]=i;g=i+(b<<2)|0;f[a+124>>2]=g;sj(i|0,0,k|0)|0;f[e>>2]=g}g=b<<5|1;f[d>>2]=0;e=d+4|0;f[e>>2]=0;f[d+8>>2]=0;if(!h){k=b<<2;i=ln(k)|0;f[d>>2]=i;j=i+(b<<2)|0;f[d+8>>2]=j;sj(i|0,0,k|0)|0;f[e>>2]=j}lk(a+128|0,g,d);j=f[d>>2]|0;if(j|0){k=f[e>>2]|0;if((k|0)!=(j|0))f[e>>2]=k+(~((k+-4-j|0)>>>2)<<2);Oq(j)}f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;if(!h){h=b<<2;k=ln(h)|0;f[d>>2]=k;e=k+(b<<2)|0;f[d+8>>2]=e;sj(k|0,0,h|0)|0;f[j>>2]=e}lk(a+140|0,g,d);g=f[d>>2]|0;if(!g){u=c;return}d=f[j>>2]|0;if((d|0)!=(g|0))f[j>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g);u=c;return}function bf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=ln(40)|0;e=d+16|0;pj(e,c);pj(d+28|0,c+12|0);c=a+4|0;g=f[c>>2]|0;do if(g){h=b[d+27>>0]|0;i=h<<24>>24<0;j=i?f[d+20>>2]|0:h&255;h=i?f[e>>2]|0:e;i=g;while(1){k=i+16|0;l=b[k+11>>0]|0;m=l<<24>>24<0;n=m?f[i+20>>2]|0:l&255;l=n>>>0>>0?n:j;if((l|0)!=0?(o=Vk(h,m?f[k>>2]|0:k,l)|0,(o|0)!=0):0)if((o|0)<0)p=7;else p=9;else if(j>>>0>>0)p=7;else p=9;if((p|0)==7){p=0;n=f[i>>2]|0;if(!n){p=8;break}else q=n}else if((p|0)==9){p=0;r=i+4|0;n=f[r>>2]|0;if(!n){p=11;break}else q=n}i=q}if((p|0)==8){s=i;t=i;break}else if((p|0)==11){s=i;t=r;break}}else{s=c;t=c}while(0);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=s;f[t>>2]=d;s=f[f[a>>2]>>2]|0;if(!s){u=d;v=a+4|0;w=f[v>>2]|0;Oe(w,u);x=a+8|0;y=f[x>>2]|0;z=y+1|0;f[x>>2]=z;return d|0}f[a>>2]=s;u=f[t>>2]|0;v=a+4|0;w=f[v>>2]|0;Oe(w,u);x=a+8|0;y=f[x>>2]|0;z=y+1|0;f[x>>2]=z;return d|0}function cf(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3680;wi(a+200|0);b=f[a+184>>2]|0;if(b|0){c=a+188|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}kj(a+172|0);b=f[a+152>>2]|0;if(b|0){d=a+156|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+140>>2]|0;if(b|0)Oq(b);b=f[a+128>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;Oq(b)}while((c|0)!=0)}c=a+120|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)Oq(b);b=f[a+108>>2]|0;if(b|0){c=a+112|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);Oq(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+84>>2]|0;if(b|0)Oq(b);b=f[a+72>>2]|0;if(b|0){c=a+76|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+28>>2]|0;if(b|0)Oq(b);b=f[a+16>>2]|0;if(b|0){d=a+20|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=a+12|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;Ii(a);Oq(a);return}function df(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+140|0;c=f[b>>2]|0;if(c|0){d=a+144|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);Oq(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}Oq(g)}g=a+128|0;b=f[g>>2]|0;if(b|0){j=a+132|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);Oq(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}Oq(l)}l=f[a+116>>2]|0;if(l|0){g=a+120|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+104>>2]|0;if(l|0){m=a+108|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+92>>2]|0;if(!l){n=a+72|0;jl(n);o=a+52|0;jl(o);p=a+32|0;jl(p);q=a+12|0;jl(q);return}g=a+96|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l);n=a+72|0;jl(n);o=a+52|0;jl(o);p=a+32|0;jl(p);q=a+12|0;jl(q);return}function ef(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+152|0;c=f[b>>2]|0;if(c|0){d=a+156|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);Oq(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}Oq(g)}g=a+140|0;b=f[g>>2]|0;if(b|0){j=a+144|0;h=f[j>>2]|0;if((h|0)==(b|0))l=b;else{c=h;while(1){h=c+-12|0;f[j>>2]=h;d=f[h>>2]|0;if(!d)m=h;else{h=c+-8|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);Oq(d);m=f[j>>2]|0}if((m|0)==(b|0))break;else c=m}l=f[g>>2]|0}Oq(l)}l=f[a+128>>2]|0;if(l|0){g=a+132|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+116>>2]|0;if(l|0){m=a+120|0;g=f[m>>2]|0;if((g|0)!=(l|0))f[m>>2]=g+(~((g+-4-l|0)>>>2)<<2);Oq(l)}l=f[a+104>>2]|0;if(!l){n=a+84|0;jl(n);o=a+64|0;jl(o);p=a+44|0;jl(p);q=a+12|0;Fj(q);return}g=a+108|0;m=f[g>>2]|0;if((m|0)!=(l|0))f[g>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(l);n=a+84|0;jl(n);o=a+64|0;jl(o);p=a+44|0;jl(p);q=a+12|0;Fj(q);return}function ff(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3480;uj(a+200|0);b=f[a+184>>2]|0;if(b|0){c=a+188|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}kj(a+172|0);b=f[a+152>>2]|0;if(b|0){d=a+156|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+140>>2]|0;if(b|0)Oq(b);b=f[a+128>>2]|0;if(b|0){c=b;do{b=c;c=f[c>>2]|0;Oq(b)}while((c|0)!=0)}c=a+120|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0)Oq(b);b=f[a+108>>2]|0;if(b|0){c=a+112|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);Oq(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+84>>2]|0;if(b|0)Oq(b);b=f[a+72>>2]|0;if(b|0){c=a+76|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+28>>2]|0;if(b|0)Oq(b);b=f[a+16>>2]|0;if(b|0){d=a+20|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=a+12|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;Ii(a);Oq(a);return}function gf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=u;u=u+144|0;g=e+136|0;h=e+104|0;i=e;j=ln(124)|0;k=f[c+8>>2]|0;f[j+4>>2]=0;f[j>>2]=3656;f[j+12>>2]=3636;f[j+100>>2]=0;f[j+104>>2]=0;f[j+108>>2]=0;l=j+16|0;m=l+80|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));f[j+112>>2]=k;f[j+116>>2]=d;n=j+120|0;f[n>>2]=0;o=j;f[h>>2]=3636;p=h+4|0;q=p+4|0;f[q>>2]=0;f[q+4>>2]=0;f[q+8>>2]=0;f[q+12>>2]=0;f[q+16>>2]=0;f[q+20>>2]=0;q=f[c+12>>2]|0;f[i+4>>2]=3636;f[i+92>>2]=0;f[i+96>>2]=0;f[i+100>>2]=0;l=i+8|0;m=l+80|0;do{f[l>>2]=0;l=l+4|0}while((l|0)<(m|0));l=q;f[p>>2]=l;m=((f[l+4>>2]|0)-(f[q>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;qh(h+8|0,m,g);Va[f[(f[h>>2]|0)+8>>2]&127](h);f[i>>2]=f[p>>2];fg(i+4|0,h)|0;f[i+36>>2]=q;f[i+40>>2]=d;f[i+44>>2]=k;f[i+48>>2]=j;f[n>>2]=c+72;Sg(j,i);f[a>>2]=o;Qi(i);f[h>>2]=3636;i=f[h+20>>2]|0;if(i|0)Oq(i);i=f[h+8>>2]|0;if(!i){u=e;return}Oq(i);u=e;return}function hf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+48|0;d=c+44|0;e=c+40|0;g=c+36|0;h=c+32|0;i=c;f[h>>2]=f[a+60>>2];j=b+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,h,h+4|0)|0}wn(i);tk(i);if((f[h>>2]|0)>0){k=a+56|0;l=1;m=0;do{n=l;l=(f[(f[k>>2]|0)+(m>>>5<<2)>>2]&1<<(m&31)|0)!=0;fj(i,n^l^1);m=m+1|0}while((m|0)<(f[h>>2]|0))}ld(i,b);f[g>>2]=f[a+12>>2];h=j;m=f[h>>2]|0;l=f[h+4>>2]|0;if((l|0)>0|(l|0)==0&m>>>0>0){o=l;p=m}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;m=j;o=f[m+4>>2]|0;p=f[m>>2]|0}f[g>>2]=f[a+20>>2];if((o|0)>0|(o|0)==0&p>>>0>0){Fj(i);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;Fj(i);u=c;return 1}function jf(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=u;u=u+16|0;h=g;if((f[c+56>>2]|0)==-1){i=-1;u=g;return i|0}j=ln(96)|0;tl(j,c);f[h>>2]=j;j=vh(a,h)|0;c=f[h>>2]|0;f[h>>2]=0;if(c|0){h=c+88|0;k=f[h>>2]|0;f[h>>2]=0;if(k|0){h=f[k+8>>2]|0;if(h|0){l=k+12|0;if((f[l>>2]|0)!=(h|0))f[l>>2]=h;Oq(h)}Oq(k)}k=f[c+68>>2]|0;if(k|0){h=c+72|0;l=f[h>>2]|0;if((l|0)!=(k|0))f[h>>2]=l+(~((l+-4-k|0)>>>2)<<2);Oq(k)}k=c+64|0;l=f[k>>2]|0;f[k>>2]=0;if(l|0){k=f[l>>2]|0;if(k|0){h=l+4|0;if((f[h>>2]|0)!=(k|0))f[h>>2]=k;Oq(k)}Oq(l)}Oq(c)}c=a+8|0;l=(f[c>>2]|0)+(j<<2)|0;k=f[l>>2]|0;do if(!d){h=f[a+80>>2]|0;b[k+84>>0]=0;m=k+68|0;n=k+72|0;o=f[n>>2]|0;p=f[m>>2]|0;q=o-p>>2;r=o;if(h>>>0>q>>>0){Ch(m,h-q|0,6220);break}if(h>>>0>>0?(q=p+(h<<2)|0,(q|0)!=(r|0)):0)f[n>>2]=r+(~((r+-4-q|0)>>>2)<<2)}else{b[k+84>>0]=1;q=f[k+68>>2]|0;r=k+72|0;n=f[r>>2]|0;if((n|0)==(q|0))s=k;else{f[r>>2]=n+(~((n+-4-q|0)>>>2)<<2);s=f[l>>2]|0}f[s+80>>2]=f[a+80>>2]}while(0);if(!e){i=j;u=g;return i|0}Bj(f[(f[c>>2]|0)+(j<<2)>>2]|0,e)|0;i=j;u=g;return i|0}function kf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;f[a+52>>2]=e;f[a+44>>2]=g;g=Lq(e>>>0>1073741823?-1:e<<2)|0;l=a+48|0;m=f[l>>2]|0;f[l>>2]=g;if(m|0)Mq(m);m=a+36|0;g=f[m>>2]|0;n=f[g+4>>2]|0;o=f[g>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=i+4|0;s=j+4|0;t=h+4|0;if(n-o>>2>>>0>q>>>0){v=q;w=o}else{x=g;aq(x)}while(1){f[k>>2]=f[w+(v<<2)>>2];f[h>>2]=f[k>>2];Bc(a,h,b,v);g=X(v,e)|0;o=b+(g<<2)|0;q=f[l>>2]|0;n=c+(g<<2)|0;g=f[o+4>>2]|0;y=f[q>>2]|0;z=f[q+4>>2]|0;f[i>>2]=f[o>>2];f[r>>2]=g;f[j>>2]=y;f[s>>2]=z;Od(h,p,i,j);f[n>>2]=f[h>>2];f[n+4>>2]=f[t>>2];v=v+-1|0;if((v|0)<=-1){A=5;break}n=f[m>>2]|0;w=f[n>>2]|0;if((f[n+4>>2]|0)-w>>2>>>0<=v>>>0){x=n;A=6;break}}if((A|0)==5){u=d;return 1}else if((A|0)==6)aq(x);return 0}function lf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=f[c>>2]|0;c=f[d>>2]|0;e=f[a+4>>2]|0;g=f[d+4>>2]|0;h=e+-1|0;i=(h&e|0)==0;if(!i)if(g>>>0>>0)j=g;else j=(g>>>0)%(e>>>0)|0;else j=h&g;g=(f[a>>2]|0)+(j<<2)|0;k=f[g>>2]|0;while(1){l=f[k>>2]|0;if((l|0)==(d|0))break;else k=l}if((k|0)!=(a+8|0)){l=f[k+4>>2]|0;if(!i)if(l>>>0>>0)m=l;else m=(l>>>0)%(e>>>0)|0;else m=l&h;if((m|0)==(j|0)){n=c;o=21}else o=13}else o=13;do if((o|0)==13){if(c|0){m=f[c+4>>2]|0;if(!i)if(m>>>0>>0)p=m;else p=(m>>>0)%(e>>>0)|0;else p=m&h;if((p|0)==(j|0)){q=c;r=c;o=22;break}}f[g>>2]=0;n=f[d>>2]|0;o=21}while(0);if((o|0)==21){g=n;if(!n)s=g;else{q=n;r=g;o=22}}if((o|0)==22){o=f[q+4>>2]|0;if(!i)if(o>>>0>>0)t=o;else t=(o>>>0)%(e>>>0)|0;else t=o&h;if((t|0)==(j|0))s=r;else{f[(f[a>>2]|0)+(t<<2)>>2]=k;s=f[d>>2]|0}}f[k>>2]=s;f[d>>2]=0;s=a+12|0;f[s>>2]=(f[s>>2]|0)+-1;if(!d)return c|0;s=d+8|0;a=f[d+20>>2]|0;if(a|0){k=d+24|0;if((f[k>>2]|0)!=(a|0))f[k>>2]=a;Oq(a)}if((b[s+11>>0]|0)<0)Oq(f[s>>2]|0);Oq(d);return c|0}function mf(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;b=u;u=u+16|0;c=b+4|0;d=b;f[c>>2]=0;e=c+4|0;f[e>>2]=0;f[c+8>>2]=0;g=a+52|0;h=f[g>>2]|0;i=(f[h+100>>2]|0)-(f[h+96>>2]|0)|0;j=(i|0)/12|0;if(!i){k=0;l=0}else{i=c+8|0;m=0;n=0;o=h;h=0;p=0;while(1){q=f[o+96>>2]|0;r=f[q+(n*12|0)>>2]|0;s=r-m|0;t=((s|0)>-1?s:0-s|0)<<1|s>>>31;f[d>>2]=t;if((h|0)==(p|0)){Ri(c,d);v=f[e>>2]|0;w=f[i>>2]|0}else{f[h>>2]=t;t=h+4|0;f[e>>2]=t;v=t;w=p}t=f[q+(n*12|0)+4>>2]|0;s=t-r|0;r=((s|0)>-1?s:0-s|0)<<1|s>>>31;f[d>>2]=r;if((v|0)==(w|0)){Ri(c,d);x=f[e>>2]|0;y=f[i>>2]|0}else{f[v>>2]=r;r=v+4|0;f[e>>2]=r;x=r;y=w}r=f[q+(n*12|0)+8>>2]|0;q=r-t|0;t=((q|0)>-1?q:0-q|0)<<1|q>>>31;f[d>>2]=t;if((x|0)==(y|0))Ri(c,d);else{f[x>>2]=t;f[e>>2]=x+4}t=n+1|0;if(t>>>0>=j>>>0)break;m=r;n=t;o=f[g>>2]|0;h=f[e>>2]|0;p=f[i>>2]|0}k=f[c>>2]|0;l=f[e>>2]|0}Mc(k,l-k>>2,1,0,f[a+44>>2]|0)|0;a=f[c>>2]|0;if(!a){u=b;return 1}c=f[e>>2]|0;if((c|0)!=(a|0))f[e>>2]=c+(~((c+-4-a|0)>>>2)<<2);Oq(a);u=b;return 1}function nf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+48|0;d=c+44|0;e=c+40|0;g=c+36|0;h=c+32|0;i=c;f[h>>2]=f[a+80>>2];j=b+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,h,h+4|0)|0}wn(i);tk(i);if((f[h>>2]|0)>0){k=a+76|0;l=1;m=0;do{n=l;l=(f[(f[k>>2]|0)+(m>>>5<<2)>>2]&1<<(m&31)|0)!=0;fj(i,n^l^1);m=m+1|0}while((m|0)<(f[h>>2]|0))}ld(i,b);f[g>>2]=f[a+12>>2];h=j;m=f[h>>2]|0;l=f[h+4>>2]|0;if((l|0)>0|(l|0)==0&m>>>0>0){o=l;p=m}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;m=j;o=f[m+4>>2]|0;p=f[m>>2]|0}f[g>>2]=f[a+16>>2];if((o|0)>0|(o|0)==0&p>>>0>0){Fj(i);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;Fj(i);u=c;return 1}function of(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c+12|0;e=c+8|0;g=c+4|0;h=c;if(!b){i=ln(76)|0;j=ln(12)|0;k=f[(f[a+4>>2]|0)+80>>2]|0;f[j+4>>2]=0;f[j>>2]=3908;f[j+8>>2]=k;f[h>>2]=j;rl(i,h,0);j=i;f[g>>2]=j;i=a+12|0;k=f[i>>2]|0;if(k>>>0<(f[a+16>>2]|0)>>>0){f[g>>2]=0;f[k>>2]=j;f[i>>2]=k+4;l=g}else{Qg(a+8|0,g);l=g}g=f[l>>2]|0;f[l>>2]=0;if(g|0)Va[f[(f[g>>2]|0)+4>>2]&127](g);g=f[h>>2]|0;f[h>>2]=0;if(!g){u=c;return 1}Va[f[(f[g>>2]|0)+4>>2]&127](g);u=c;return 1}g=f[f[a+8>>2]>>2]|0;f[d>>2]=b;a=g+4|0;h=g+8|0;l=f[h>>2]|0;if((l|0)==(f[g+12>>2]|0))Ri(a,d);else{f[l>>2]=b;f[h>>2]=l+4}l=f[d>>2]|0;b=g+16|0;k=g+20|0;g=f[k>>2]|0;i=f[b>>2]|0;j=g-i>>2;m=i;if((l|0)<(j|0)){n=m;o=l}else{i=l+1|0;f[e>>2]=-1;p=g;if(i>>>0<=j>>>0)if(i>>>0>>0?(g=m+(i<<2)|0,(g|0)!=(p|0)):0){f[k>>2]=p+(~((p+-4-g|0)>>>2)<<2);q=l;r=m}else{q=l;r=m}else{Ch(b,i-j|0,e);q=f[d>>2]|0;r=f[b>>2]|0}n=r;o=q}f[n+(o<<2)>>2]=((f[h>>2]|0)-(f[a>>2]|0)>>2)+-1;u=c;return 1}function pf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;f[a+52>>2]=e;f[a+44>>2]=g;g=Lq(e>>>0>1073741823?-1:e<<2)|0;l=a+48|0;m=f[l>>2]|0;f[l>>2]=g;if(m|0)Mq(m);m=a+36|0;g=f[m>>2]|0;n=f[g+4>>2]|0;o=f[g>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=i+4|0;s=j+4|0;t=h+4|0;if(n-o>>2>>>0>q>>>0){v=q;w=o}else{x=g;aq(x)}while(1){f[k>>2]=f[w+(v<<2)>>2];f[h>>2]=f[k>>2];Ac(a,h,b,v);g=X(v,e)|0;o=b+(g<<2)|0;q=f[l>>2]|0;n=c+(g<<2)|0;g=f[o+4>>2]|0;y=f[q>>2]|0;z=f[q+4>>2]|0;f[i>>2]=f[o>>2];f[r>>2]=g;f[j>>2]=y;f[s>>2]=z;Od(h,p,i,j);f[n>>2]=f[h>>2];f[n+4>>2]=f[t>>2];v=v+-1|0;if((v|0)<=-1){A=5;break}n=f[m>>2]|0;w=f[n>>2]|0;if((f[n+4>>2]|0)-w>>2>>>0<=v>>>0){x=n;A=6;break}}if((A|0)==5){u=d;return 1}else if((A|0)==6)aq(x);return 0}function qf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;do if(e-g>>3>>>0>=b>>>0){i=a+4|0;j=f[i>>2]|0;k=j-g>>3;l=k>>>0>>0;m=l?k:b;n=j;if(m|0){j=m;m=h;while(1){o=c;p=f[o+4>>2]|0;q=m;f[q>>2]=f[o>>2];f[q+4>>2]=p;j=j+-1|0;if(!j)break;else m=m+8|0}}if(!l){m=h+(b<<3)|0;if((m|0)==(n|0))return;else{r=i;s=n+(~((n+-8-m|0)>>>3)<<3)|0;break}}else{m=b-k|0;j=m;p=n;while(1){q=c;o=f[q+4>>2]|0;t=p;f[t>>2]=f[q>>2];f[t+4>>2]=o;j=j+-1|0;if(!j)break;else p=p+8|0}r=i;s=n+(m<<3)|0;break}}else{p=g;if(!g)u=e;else{j=a+4|0;k=f[j>>2]|0;if((k|0)!=(h|0))f[j>>2]=k+(~((k+-8-g|0)>>>3)<<3);Oq(p);f[d>>2]=0;f[j>>2]=0;f[a>>2]=0;u=0}if(b>>>0>536870911)aq(a);j=u>>2;p=u>>3>>>0<268435455?(j>>>0>>0?b:j):536870911;if(p>>>0>536870911)aq(a);j=ln(p<<3)|0;k=a+4|0;f[k>>2]=j;f[a>>2]=j;f[d>>2]=j+(p<<3);p=b;l=j;while(1){o=c;t=f[o+4>>2]|0;q=l;f[q>>2]=f[o>>2];f[q+4>>2]=t;p=p+-1|0;if(!p)break;else l=l+8|0}r=k;s=j+(b<<3)|0}while(0);f[r>>2]=s;return}function rf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=+$(n[b>>2]);g=+K(+e);h=+$(n[b+4>>2]);i=g+ +K(+h);g=+$(n[b+8>>2]);j=i+ +K(+g);b=j>1.0e-06;i=1.0/j;k=f[a+12>>2]|0;j=+(k|0);l=~~+J(+((b?i*e:1.0)*j+.5));m=~~+J(+((b?i*h:0.0)*j+.5));o=(l|0)>-1;p=k-(o?l:0-l|0)-((m|0)>-1?m:0-m|0)|0;l=(p|0)<0;q=(l?((m|0)>0?p:0-p|0):0)+m|0;m=l?0:p;p=(b?i*g:0.0)<0.0?0-m|0:m;do if(!o){if((q|0)<0)r=(p|0)>-1?p:0-p|0;else r=(f[a+8>>2]|0)-((p|0)>-1?p:0-p|0)|0;if((p|0)<0){s=(q|0)>-1?q:0-q|0;t=r;break}else{s=(f[a+8>>2]|0)-((q|0)>-1?q:0-q|0)|0;t=r;break}}else{s=k+p|0;t=k+q|0}while(0);q=(t|0)==0;p=(s|0)==0;r=f[a+8>>2]|0;if(!(s|t)){u=r;v=r;f[c>>2]=u;f[d>>2]=v;return}a=(r|0)==(s|0);if(q&a){u=s;v=s;f[c>>2]=u;f[d>>2]=v;return}o=(r|0)==(t|0);if(p&o){u=t;v=t;f[c>>2]=u;f[d>>2]=v;return}if(q&(k|0)<(s|0)){u=0;v=(k<<1)-s|0;f[c>>2]=u;f[d>>2]=v;return}if(o&(k|0)>(s|0)){u=t;v=(k<<1)-s|0;f[c>>2]=u;f[d>>2]=v;return}if(a&(k|0)>(t|0)){u=(k<<1)-t|0;v=s;f[c>>2]=u;f[d>>2]=v;return}if(!p){u=t;v=s;f[c>>2]=u;f[d>>2]=v;return}u=(k|0)<(t|0)?(k<<1)-t|0:t;v=0;f[c>>2]=u;f[d>>2]=v;return}function sf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],Me(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];Me(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;Gg(d);m=a+1068|0;Mm(m);k=a+1088|0;Mm(k);l=a+1108|0;Mm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];ib(a,i,h);Ye(d,e);Bg(m,e);Bg(k,e);Bg(l,e);u=g;return 1}function tf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],Me(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];Me(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;Gg(d);m=a+1068|0;Mm(m);k=a+1088|0;Mm(k);l=a+1108|0;Mm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];kb(a,i,h);Ye(d,e);Bg(m,e);Bg(k,e);Bg(l,e);u=g;return 1}function uf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;c=u;u=u+32|0;d=c;e=a+8|0;g=f[e>>2]|0;h=a+4|0;i=f[h>>2]|0;j=i;if(g-i>>2>>>0>=b>>>0){sj(i|0,0,b<<2|0)|0;f[h>>2]=i+(b<<2);u=c;return}k=f[a>>2]|0;l=i-k>>2;m=l+b|0;n=k;if(m>>>0>1073741823)aq(a);o=g-k|0;p=o>>1;q=o>>2>>>0<536870911?(p>>>0>>0?m:p):1073741823;f[d+12>>2]=0;f[d+16>>2]=a+8;do if(q)if(q>>>0>1073741823){p=ra(8)|0;Oo(p,16035);f[p>>2]=7256;va(p|0,1112,110)}else{r=ln(q<<2)|0;break}else r=0;while(0);f[d>>2]=r;p=r+(l<<2)|0;l=d+8|0;m=d+4|0;f[m>>2]=p;o=r+(q<<2)|0;q=d+12|0;f[q>>2]=o;r=p+(b<<2)|0;sj(p|0,0,b<<2|0)|0;f[l>>2]=r;if((j|0)==(n|0)){s=p;t=q;v=l;w=k;x=r;y=i;z=o;A=g}else{g=j;j=p;do{g=g+-4|0;p=f[g>>2]|0;f[g>>2]=0;f[j+-4>>2]=p;j=(f[m>>2]|0)+-4|0;f[m>>2]=j}while((g|0)!=(n|0));s=j;t=q;v=l;w=f[a>>2]|0;x=f[l>>2]|0;y=f[h>>2]|0;z=f[q>>2]|0;A=f[e>>2]|0}f[a>>2]=s;f[m>>2]=w;f[h>>2]=x;f[v>>2]=y;f[e>>2]=z;f[t>>2]=A;f[d>>2]=w;ki(d);u=c;return}function vf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=f[a+8>>2]|0;e=a+76|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{Ch(i,h-m|0,3600);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+80|0;a=c+68|0;c=f[o+96>>2]|0;o=0;while(1){h=o*3|0;if((h|0)==-1)r=-1;else r=f[(f[d>>2]|0)+(h<<2)>>2]|0;i=f[(f[m>>2]|0)+12>>2]|0;g=f[i+(r<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}k=f[a>>2]|0;f[k+(f[c+(o*12|0)>>2]<<2)>>2]=g;g=h+1|0;if((g|0)==-1)t=-1;else t=f[(f[d>>2]|0)+(g<<2)>>2]|0;g=f[i+(t<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}f[k+(f[c+(o*12|0)+4>>2]<<2)>>2]=g;g=h+2|0;if((g|0)==-1)u=-1;else u=f[(f[d>>2]|0)+(g<<2)>>2]|0;g=f[i+(u<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}f[k+(f[c+(o*12|0)+8>>2]<<2)>>2]=g;o=o+1|0;if(o>>>0>=e>>>0){q=1;s=12;break}}if((s|0)==12)return q|0;return 0}function wf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=f[a+8>>2]|0;e=a+112|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{Ch(i,h-m|0,3600);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=a+116|0;a=c+68|0;c=f[o+96>>2]|0;o=0;while(1){h=o*3|0;if((h|0)==-1)r=-1;else r=f[(f[d>>2]|0)+(h<<2)>>2]|0;i=f[(f[m>>2]|0)+12>>2]|0;g=f[i+(r<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}k=f[a>>2]|0;f[k+(f[c+(o*12|0)>>2]<<2)>>2]=g;g=h+1|0;if((g|0)==-1)t=-1;else t=f[(f[d>>2]|0)+(g<<2)>>2]|0;g=f[i+(t<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}f[k+(f[c+(o*12|0)+4>>2]<<2)>>2]=g;g=h+2|0;if((g|0)==-1)u=-1;else u=f[(f[d>>2]|0)+(g<<2)>>2]|0;g=f[i+(u<<2)>>2]|0;if(g>>>0>=p>>>0){q=0;s=12;break}f[k+(f[c+(o*12|0)+8>>2]<<2)>>2]=g;o=o+1|0;if(o>>>0>=e>>>0){q=1;s=12;break}}if((s|0)==12)return q|0;return 0}function xf(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=u;u=u+16|0;h=d;i=f[a+124>>2]|0;if(!i){u=d;return}j=i+-1|0;k=(j&i|0)==0;if(!k)if(i>>>0>g>>>0)l=g;else l=(g>>>0)%(i>>>0)|0;else l=j&g;m=f[(f[a+120>>2]|0)+(l<<2)>>2]|0;if(!m){u=d;return}n=f[m>>2]|0;if(!n){u=d;return}a:do if(k){m=n;while(1){o=f[m+4>>2]|0;p=(o|0)==(g|0);if(!(p|(o&j|0)==(l|0))){q=24;break}if(p?(f[m+8>>2]|0)==(g|0):0){r=m;break a}m=f[m>>2]|0;if(!m){q=24;break}}if((q|0)==24){u=d;return}}else{m=n;while(1){p=f[m+4>>2]|0;if((p|0)==(g|0)){if((f[m+8>>2]|0)==(g|0)){r=m;break a}}else{if(p>>>0>>0)s=p;else s=(p>>>0)%(i>>>0)|0;if((s|0)!=(l|0)){q=24;break}}m=f[m>>2]|0;if(!m){q=24;break}}if((q|0)==24){u=d;return}}while(0);q=f[r+12>>2]|0;if((q|0)==-1){u=d;return}f[h>>2]=q;f[h+4>>2]=c;b[h+8>>0]=e&1;e=a+112|0;c=f[e>>2]|0;if((c|0)==(f[a+116>>2]|0))yi(a+108|0,h);else{f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];f[c+8>>2]=f[h+8>>2];f[e>>2]=(f[e>>2]|0)+12}u=d;return}function yf(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=d[b>>1]|0;e=d[b+2>>1]|0;g=d[b+4>>1]|0;h=d[b+6>>1]|0;b=((((c^318)&65535)+239^e&65535)+239^g&65535)+239^h&65535;i=f[a+4>>2]|0;if(!i){j=0;return j|0}k=i+-1|0;l=(k&i|0)==0;if(!l)if(b>>>0>>0)m=b;else m=(b>>>0)%(i>>>0)|0;else m=b&k;n=f[(f[a>>2]|0)+(m<<2)>>2]|0;if(!n){j=0;return j|0}a=f[n>>2]|0;if(!a){j=0;return j|0}if(l){l=a;while(1){n=f[l+4>>2]|0;o=(n|0)==(b|0);if(!(o|(n&k|0)==(m|0))){j=0;p=25;break}if((((o?(o=l+8|0,(d[o>>1]|0)==c<<16>>16):0)?(d[o+2>>1]|0)==e<<16>>16:0)?(d[l+12>>1]|0)==g<<16>>16:0)?(d[o+6>>1]|0)==h<<16>>16:0){j=l;p=25;break}l=f[l>>2]|0;if(!l){j=0;p=25;break}}if((p|0)==25)return j|0}else q=a;while(1){a=f[q+4>>2]|0;if((a|0)==(b|0)){l=q+8|0;if((((d[l>>1]|0)==c<<16>>16?(d[l+2>>1]|0)==e<<16>>16:0)?(d[q+12>>1]|0)==g<<16>>16:0)?(d[l+6>>1]|0)==h<<16>>16:0){j=q;p=25;break}}else{if(a>>>0>>0)r=a;else r=(a>>>0)%(i>>>0)|0;if((r|0)!=(m|0)){j=0;p=25;break}}q=f[q>>2]|0;if(!q){j=0;p=25;break}}if((p|0)==25)return j|0;return 0}function zf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],Me(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];Me(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;Mm(d);m=a+32|0;Mm(m);k=a+52|0;Mm(k);l=a+72|0;Mm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];hb(a,i,h);Bg(d,e);Bg(m,e);Bg(k,e);Bg(l,e);u=g;return 1}function Af(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+32|0;h=g+12|0;i=g;f[a>>2]=f[d>>2];d=a+4|0;f[d>>2]=(f[c>>2]|0)-(f[b>>2]|0);j=e+16|0;k=j;l=f[k+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0)?(k=e+4|0,f[i>>2]=f[k>>2],f[h>>2]=f[i>>2],Me(e,h,a,a+4|0)|0,l=j,j=f[l+4>>2]|0,!((j|0)>0|(j|0)==0&(f[l>>2]|0)>>>0>0)):0){f[i>>2]=f[k>>2];f[h>>2]=f[i>>2];Me(e,h,d,d+4|0)|0;m=i}else m=i;if(!(f[d>>2]|0)){u=g;return 1}d=a+12|0;tk(d);m=a+44|0;Mm(m);k=a+64|0;Mm(k);l=a+84|0;Mm(l);f[i>>2]=f[b>>2];f[i+4>>2]=f[b+4>>2];f[i+8>>2]=f[b+8>>2];f[h>>2]=f[c>>2];f[h+4>>2]=f[c+4>>2];f[h+8>>2]=f[c+8>>2];lb(a,i,h);ld(d,e);Bg(m,e);Bg(k,e);Bg(l,e);u=g;return 1}function Bf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;a=u;u=u+16|0;e=a+4|0;g=a;h=a+8|0;i=d+11|0;j=b[i>>0]|0;k=j<<24>>24<0;if(k){l=f[d+4>>2]|0;if(l>>>0>255){m=0;u=a;return m|0}else n=l}else n=j&255;if(!n){b[h>>0]=0;n=c+16|0;l=f[n+4>>2]|0;if(!((l|0)>0|(l|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}m=1;u=a;return m|0}n=d+4|0;l=f[n>>2]|0;b[h>>0]=k?l:j&255;k=c+16|0;o=k;p=f[o>>2]|0;q=f[o+4>>2]|0;if((q|0)>0|(q|0)==0&p>>>0>0){r=j;s=q;t=p;v=l}else{f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0;h=k;r=b[i>>0]|0;s=f[h+4>>2]|0;t=f[h>>2]|0;v=f[n>>2]|0}n=r<<24>>24<0;h=n?f[d>>2]|0:d;if(!((s|0)>0|(s|0)==0&t>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+(n?v:r&255)|0)|0}m=1;u=a;return m|0}function Cf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=a+4|0;d=f[a>>2]|0;e=((f[c>>2]|0)-d|0)/24|0;g=e+1|0;if(g>>>0>178956970)aq(a);h=a+8|0;i=((f[h>>2]|0)-d|0)/24|0;d=i<<1;j=i>>>0<89478485?(d>>>0>>0?g:d):178956970;do if(j)if(j>>>0>178956970){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{k=ln(j*24|0)|0;break}else k=0;while(0);d=k+(e*24|0)|0;g=d;i=k+(j*24|0)|0;f[d>>2]=1196;f[k+(e*24|0)+4>>2]=f[b+4>>2];fk(k+(e*24|0)+8|0,b+8|0);f[k+(e*24|0)+20>>2]=f[b+20>>2];b=d+24|0;e=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(e|0)){l=g;m=e;n=e}else{j=k;k=g;g=d;do{f[g+-24>>2]=1196;f[g+-20>>2]=f[j+-20>>2];d=g+-16|0;o=j+-16|0;f[d>>2]=0;p=g+-12|0;f[p>>2]=0;f[g+-8>>2]=0;f[d>>2]=f[o>>2];d=j+-12|0;f[p>>2]=f[d>>2];p=j+-8|0;f[g+-8>>2]=f[p>>2];f[p>>2]=0;f[d>>2]=0;f[o>>2]=0;f[g+-4>>2]=f[j+-4>>2];j=j+-24|0;g=k+-24|0;k=g}while((j|0)!=(e|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=b;f[h>>2]=i;i=m;if((n|0)!=(i|0)){h=n;do{h=h+-24|0;Va[f[f[h>>2]>>2]&127](h)}while((h|0)!=(i|0))}if(!m)return;Oq(m);return}function Df(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+32|0;d=c+24|0;e=c+16|0;g=c+8|0;h=c;f[a>>2]=3588;f[a+4>>2]=f[b+4>>2];i=a+8|0;j=b+8|0;f[i>>2]=0;k=a+12|0;f[k>>2]=0;l=a+16|0;f[l>>2]=0;m=b+12|0;n=f[m>>2]|0;do if(n|0)if((n|0)<0)aq(i);else{o=((n+-1|0)>>>5)+1|0;p=ln(o<<2)|0;f[i>>2]=p;f[k>>2]=0;f[l>>2]=o;o=f[j>>2]|0;f[g>>2]=o;f[g+4>>2]=0;p=f[m>>2]|0;f[h>>2]=o+(p>>>5<<2);f[h+4>>2]=p&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];Tf(i,e,d);break}while(0);i=a+20|0;f[i>>2]=0;m=a+24|0;f[m>>2]=0;j=a+28|0;f[j>>2]=0;a=b+24|0;l=f[a>>2]|0;if(!l){u=c;return}if((l|0)<0)aq(i);k=((l+-1|0)>>>5)+1|0;l=ln(k<<2)|0;f[i>>2]=l;f[m>>2]=0;f[j>>2]=k;k=f[b+20>>2]|0;f[g>>2]=k;f[g+4>>2]=0;b=f[a>>2]|0;f[h>>2]=k+(b>>>5<<2);f[h+4>>2]=b&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];Tf(i,e,d);u=c;return}function Ef(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b[c>>0]|0;e=b[c+1>>0]|0;g=b[c+2>>0]|0;h=b[c+3>>0]|0;c=(((d&255^318)+239^e&255)+239^g&255)+239^h&255;i=f[a+4>>2]|0;if(!i){j=0;return j|0}k=i+-1|0;l=(k&i|0)==0;if(!l)if(c>>>0>>0)m=c;else m=(c>>>0)%(i>>>0)|0;else m=c&k;n=f[(f[a>>2]|0)+(m<<2)>>2]|0;if(!n){j=0;return j|0}a=f[n>>2]|0;if(!a){j=0;return j|0}if(l){l=a;while(1){n=f[l+4>>2]|0;o=(n|0)==(c|0);if(!(o|(n&k|0)==(m|0))){j=0;p=25;break}if((((o?(o=l+8|0,(b[o>>0]|0)==d<<24>>24):0)?(b[o+1>>0]|0)==e<<24>>24:0)?(b[o+2>>0]|0)==g<<24>>24:0)?(b[o+3>>0]|0)==h<<24>>24:0){j=l;p=25;break}l=f[l>>2]|0;if(!l){j=0;p=25;break}}if((p|0)==25)return j|0}else q=a;while(1){a=f[q+4>>2]|0;if((a|0)==(c|0)){l=q+8|0;if((((b[l>>0]|0)==d<<24>>24?(b[l+1>>0]|0)==e<<24>>24:0)?(b[l+2>>0]|0)==g<<24>>24:0)?(b[l+3>>0]|0)==h<<24>>24:0){j=q;p=25;break}}else{if(a>>>0>>0)r=a;else r=(a>>>0)%(i>>>0)|0;if((r|0)!=(m|0)){j=0;p=25;break}}q=f[q>>2]|0;if(!q){j=0;p=25;break}}if((p|0)==25)return j|0;return 0}function Ff(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+32|0;d=c+24|0;e=c+16|0;g=c+8|0;h=c;f[a>>2]=3636;f[a+4>>2]=f[b+4>>2];i=a+8|0;j=b+8|0;f[i>>2]=0;k=a+12|0;f[k>>2]=0;l=a+16|0;f[l>>2]=0;m=b+12|0;n=f[m>>2]|0;do if(n|0)if((n|0)<0)aq(i);else{o=((n+-1|0)>>>5)+1|0;p=ln(o<<2)|0;f[i>>2]=p;f[k>>2]=0;f[l>>2]=o;o=f[j>>2]|0;f[g>>2]=o;f[g+4>>2]=0;p=f[m>>2]|0;f[h>>2]=o+(p>>>5<<2);f[h+4>>2]=p&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];Tf(i,e,d);break}while(0);i=a+20|0;f[i>>2]=0;m=a+24|0;f[m>>2]=0;j=a+28|0;f[j>>2]=0;a=b+24|0;l=f[a>>2]|0;if(!l){u=c;return}if((l|0)<0)aq(i);k=((l+-1|0)>>>5)+1|0;l=ln(k<<2)|0;f[i>>2]=l;f[m>>2]=0;f[j>>2]=k;k=f[b+20>>2]|0;f[g>>2]=k;f[g+4>>2]=0;b=f[a>>2]|0;f[h>>2]=k+(b>>>5<<2);f[h+4>>2]=b&31;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[d>>2]=f[h>>2];f[d+4>>2]=f[h+4>>2];Tf(i,e,d);u=c;return}function Gf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;l=a+40|0;f[a+44>>2]=g;g=a+36|0;m=f[g>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=a+48|0;s=a+52|0;a=i+4|0;t=j+4|0;v=h+4|0;if(n-o>>2>>>0>q>>>0){w=q;x=o}else{y=m;aq(y)}while(1){f[k>>2]=f[x+(w<<2)>>2];f[h>>2]=f[k>>2];ub(l,h,b,w);m=X(w,e)|0;o=b+(m<<2)|0;q=c+(m<<2)|0;m=f[o+4>>2]|0;n=f[r>>2]|0;z=f[s>>2]|0;f[i>>2]=f[o>>2];f[a>>2]=m;f[j>>2]=n;f[t>>2]=z;Od(h,p,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[v>>2];w=w+-1|0;if((w|0)<=-1){A=3;break}q=f[g>>2]|0;x=f[q>>2]|0;if((f[q+4>>2]|0)-x>>2>>>0<=w>>>0){y=q;A=4;break}}if((A|0)==3){u=d;return 1}else if((A|0)==4)aq(y);return 0}function Hf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h;j=h+16|0;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Qa[f[(f[b>>2]|0)+48>>2]&127](b)|0;m=Ra[f[(f[b>>2]|0)+56>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=Ra[f[(f[b>>2]|0)+52>>2]&127](b,d)|0;if(!n){f[i>>2]=f[b+52>>2];f[i+4>>2]=l;f[i+12>>2]=m;f[i+8>>2]=m+12;Cd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[i>>2]=f[b+52>>2];f[i+4>>2]=n;f[i+12>>2]=m;f[i+8>>2]=m+12;Ad(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function If(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;d=u;u=u+32|0;h=d+24|0;i=d+16|0;j=d;k=d+8|0;l=a+40|0;f[a+44>>2]=g;g=a+36|0;m=f[g>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;if((p|0)<=0){u=d;return 1}q=(p>>>2)+-1|0;p=a+8|0;r=a+48|0;s=a+52|0;a=i+4|0;t=j+4|0;v=h+4|0;if(n-o>>2>>>0>q>>>0){w=q;x=o}else{y=m;aq(y)}while(1){f[k>>2]=f[x+(w<<2)>>2];f[h>>2]=f[k>>2];tb(l,h,b,w);m=X(w,e)|0;o=b+(m<<2)|0;q=c+(m<<2)|0;m=f[o+4>>2]|0;n=f[r>>2]|0;z=f[s>>2]|0;f[i>>2]=f[o>>2];f[a>>2]=m;f[j>>2]=n;f[t>>2]=z;Od(h,p,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[v>>2];w=w+-1|0;if((w|0)<=-1){A=3;break}q=f[g>>2]|0;x=f[q>>2]|0;if((f[q+4>>2]|0)-x>>2>>>0<=w>>>0){y=q;A=4;break}}if((A|0)==3){u=d;return 1}else if((A|0)==4)aq(y);return 0}function Jf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=f[b>>2]|0;b=f[c>>2]|0;e=b-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;k=b;if(e>>>0<=h-i>>2>>>0){l=a+4|0;m=(f[l>>2]|0)-i>>2;n=e>>>0>m>>>0;o=n?d+(m<<2)|0:b;b=o-d|0;m=b>>2;if(m|0)im(i|0,d|0,b|0)|0;b=j+(m<<2)|0;if(!n){n=f[l>>2]|0;if((n|0)==(b|0))return;f[l>>2]=n+(~((n+-4-b|0)>>>2)<<2);return}b=f[c>>2]|0;c=o;if((b|0)==(c|0))return;n=f[l>>2]|0;m=b+-4-o|0;o=c;c=n;while(1){f[c>>2]=f[o>>2];o=o+4|0;if((o|0)==(b|0))break;else c=c+4|0}f[l>>2]=n+((m>>>2)+1<<2);return}m=i;if(!i)p=h;else{h=a+4|0;n=f[h>>2]|0;if((n|0)!=(j|0))f[h>>2]=n+(~((n+-4-i|0)>>>2)<<2);Oq(m);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;p=0}if(e>>>0>1073741823)aq(a);h=p>>1;m=p>>2>>>0<536870911?(h>>>0>>0?e:h):1073741823;if(m>>>0>1073741823)aq(a);h=ln(m<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(m<<2);m=d;if((k|0)==(m|0))return;g=k+-4-d|0;d=m;m=h;while(1){f[m>>2]=f[d>>2];d=d+4|0;if((d|0)==(k|0))break;else m=m+4|0}f[e>>2]=h+((g>>>2)+1<<2);return}function Kf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(((d-g|0)/12|0)>>>0>=b>>>0){sj(g|0,0,b*12|0)|0;f[e>>2]=h+(b*12|0);return}i=f[a>>2]|0;j=(g-i|0)/12|0;g=j+b|0;k=i;if(g>>>0>357913941)aq(a);l=(d-i|0)/12|0;d=l<<1;m=l>>>0<178956970?(d>>>0>>0?g:d):357913941;do if(m)if(m>>>0>357913941){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{n=ln(m*12|0)|0;break}else n=0;while(0);d=n+(j*12|0)|0;j=d;g=n+(m*12|0)|0;sj(d|0,0,b*12|0)|0;m=d+(b*12|0)|0;if((h|0)==(k|0)){o=j;p=i;q=h}else{i=h;h=j;j=d;do{d=j+-12|0;b=i;i=i+-12|0;f[d>>2]=0;n=j+-8|0;f[n>>2]=0;f[j+-4>>2]=0;f[d>>2]=f[i>>2];d=b+-8|0;f[n>>2]=f[d>>2];n=b+-4|0;f[j+-4>>2]=f[n>>2];f[n>>2]=0;f[d>>2]=0;f[i>>2]=0;j=h+-12|0;h=j}while((i|0)!=(k|0));o=h;p=f[a>>2]|0;q=f[e>>2]|0}f[a>>2]=o;f[e>>2]=m;f[c>>2]=g;g=p;if((q|0)!=(g|0)){c=q;do{q=c;c=c+-12|0;m=f[c>>2]|0;if(m|0){e=q+-8|0;q=f[e>>2]|0;if((q|0)!=(m|0))f[e>>2]=q+(~((q+-4-m|0)>>>2)<<2);Oq(m)}}while((c|0)!=(g|0))}if(!p)return;Oq(p);return}function Lf(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;gk(f[a+4>>2]|0,(f[g+28>>2]|0)-(f[g+24>>2]|0)>>2);g=a+100|0;h=f[e>>2]|0;i=(f[h+28>>2]|0)-(f[h+24>>2]|0)>>2;f[c>>2]=0;h=a+104|0;j=f[h>>2]|0;k=f[g>>2]|0;l=j-k>>2;m=k;k=j;if(i>>>0<=l>>>0){if(i>>>0>>0?(j=m+(i<<2)|0,(j|0)!=(k|0)):0)f[h>>2]=k+(~((k+-4-j|0)>>>2)<<2)}else Ch(g,i-l|0,c);l=a+120|0;a=f[l>>2]|0;if(!a){i=f[e>>2]|0;g=(f[i+4>>2]|0)-(f[i>>2]|0)>>2;i=(g>>>0)/3|0;if(g>>>0<=2){u=b;return 1}g=0;do{f[d>>2]=g*3;f[c>>2]=f[d>>2];wb(e,c);g=g+1|0}while((g|0)<(i|0));u=b;return 1}else{i=f[a>>2]|0;if((f[a+4>>2]|0)==(i|0)){u=b;return 1}a=0;g=i;do{f[d>>2]=f[g+(a<<2)>>2];f[c>>2]=f[d>>2];wb(e,c);a=a+1|0;i=f[l>>2]|0;g=f[i>>2]|0}while(a>>>0<(f[i+4>>2]|0)-g>>2>>>0);u=b;return 1}return 0}function Mf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-4194304|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-4177920|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+4194304|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1077936128|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Nf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-2097152|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-2080768|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+6291456|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1075838976|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Of(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-1048576|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1032192|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+7340032|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1074790400|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Pf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Tm(j);Jj(j,d,0,g&255,i,0,g<<1,0,0,0);i=jf(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+((X(d,g)|0)<<1)|0;r=n;s=f[r>>2]|0;t=un(s|0,f[r+4>>2]|0,p|0,0)|0;kh((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;Oq(i)}Oq(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);Oq(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;Oq(v)}Oq(j)}k=w;u=a;return k|0}function Qf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Tm(j);Jj(j,d,0,g&255,i,0,g<<2,0,0,0);i=jf(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+((X(d,g)|0)<<2)|0;r=n;s=f[r>>2]|0;t=un(s|0,f[r+4>>2]|0,p|0,0)|0;kh((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;Oq(i)}Oq(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);Oq(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;Oq(v)}Oq(j)}k=w;u=a;return k|0}function Rf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-262144|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-245760|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8126464|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1074003968|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Sf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-131072|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-114688|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8257536|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1073872896|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Tf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;d=u;u=u+48|0;e=d+40|0;g=d+32|0;h=d+8|0;i=d;j=d+24|0;k=d+16|0;l=a+4|0;m=f[l>>2]|0;n=b;b=f[n>>2]|0;o=f[n+4>>2]|0;n=c;c=f[n>>2]|0;p=f[n+4>>2]|0;n=c-b<<3;f[l>>2]=m-o+p+n;l=(f[a>>2]|0)+(m>>>5<<2)|0;a=m&31;m=l;if((a|0)!=(o|0)){q=h;f[q>>2]=b;f[q+4>>2]=o;q=i;f[q>>2]=c;f[q+4>>2]=p;f[j>>2]=m;f[j+4>>2]=a;f[g>>2]=f[h>>2];f[g+4>>2]=f[h+4>>2];f[e>>2]=f[i>>2];f[e+4>>2]=f[i+4>>2];we(k,g,e,j);u=d;return}j=p-o+n|0;n=b;if((j|0)>0){if(!o){r=j;s=0;t=l;v=b;w=n}else{b=32-o|0;p=(j|0)<(b|0)?j:b;e=-1>>>(b-p|0)&-1<>2]=f[l>>2]&~e|f[n>>2]&e;e=p+o|0;b=n+4|0;r=j-p|0;s=e&31;t=l+(e>>>5<<2)|0;v=b;w=b}b=(r|0)/32|0;im(t|0,v|0,b<<2|0)|0;v=r-(b<<5)|0;r=t+(b<<2)|0;t=r;if((v|0)>0){e=-1>>>(32-v|0);f[r>>2]=f[r>>2]&~e|f[w+(b<<2)>>2]&e;x=v;y=t}else{x=s;y=t}}else{x=o;y=m}f[k>>2]=y;f[k+4>>2]=x;u=d;return}function Uf(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-32768|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-16384|0;b[m>>0]=n;b[m+1>>0]=n>>>8;o=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;n=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+8355840|0;b[n>>0]=m;b[n+1>>0]=m>>>8;b[n+2>>0]=m>>>16;o=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;n=j+-1073774592|0;b[m>>0]=n;b[m+1>>0]=n>>>8;b[m+2>>0]=n>>>16;b[m+3>>0]=n>>>24;o=(f[l>>2]|0)+4|0;break}else{o=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;o=(f[l>>2]|0)+1|0}while(0);k=((o|0)<0)<<31>>31;Gn(e);yh(o,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,o|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,o|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function Vf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=f[b>>2]|0;d=f[b+4>>2]|0;e=f[b+8>>2]|0;g=f[b+12>>2]|0;b=(((c^318)+239^d)+239^e)+239^g;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(b>>>0>>0)l=b;else l=(b>>>0)%(h>>>0)|0;else l=b&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(b|0);if(!(n|(m&j|0)==(l|0))){i=0;o=25;break}if((((n?(f[k+8>>2]|0)==(c|0):0)?(f[k+12>>2]|0)==(d|0):0)?(f[k+16>>2]|0)==(e|0):0)?(f[k+20>>2]|0)==(g|0):0){i=k;o=25;break}k=f[k>>2]|0;if(!k){i=0;o=25;break}}if((o|0)==25)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(b|0)){if((((f[p+8>>2]|0)==(c|0)?(f[p+12>>2]|0)==(d|0):0)?(f[p+16>>2]|0)==(e|0):0)?(f[p+20>>2]|0)==(g|0):0){i=p;o=25;break}}else{if(a>>>0>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=25;break}}p=f[p>>2]|0;if(!p){i=0;o=25;break}}if((o|0)==25)return i|0;return 0}function Wf(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;a=u;u=u+96|0;j=a;if(!c){k=-1;u=a;return k|0}Tm(j);Jj(j,d,0,g&255,i,0,g,0,0,0);i=jf(c,j,1,e)|0;d=f[(f[c+8>>2]|0)+(i<<2)>>2]|0;if(e|0){l=d+84|0;m=d+68|0;n=d+40|0;o=d+64|0;d=0;do{if(!(b[l>>0]|0))p=f[(f[m>>2]|0)+(d<<2)>>2]|0;else p=d;q=h+(X(d,g)|0)|0;r=n;s=f[r>>2]|0;t=un(s|0,f[r+4>>2]|0,p|0,0)|0;kh((f[f[o>>2]>>2]|0)+t|0,q|0,s|0)|0;d=d+1|0}while((d|0)!=(e|0))}d=c+80|0;c=f[d>>2]|0;if(c)if((c|0)==(e|0))v=10;else w=-1;else{f[d>>2]=e;v=10}if((v|0)==10)w=i;i=j+88|0;v=f[i>>2]|0;f[i>>2]=0;if(v|0){i=f[v+8>>2]|0;if(i|0){e=v+12|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;Oq(i)}Oq(v)}v=f[j+68>>2]|0;if(v|0){i=j+72|0;e=f[i>>2]|0;if((e|0)!=(v|0))f[i>>2]=e+(~((e+-4-v|0)>>>2)<<2);Oq(v)}v=j+64|0;j=f[v>>2]|0;f[v>>2]=0;if(j|0){v=f[j>>2]|0;if(v|0){e=j+4|0;if((f[e>>2]|0)!=(v|0))f[e>>2]=v;Oq(v)}Oq(j)}k=w;u=a;return k|0}function Xf(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=u;u=u+32|0;i=h;j=h+16|0;k=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;do if((c+-1|0)>>>0<6&(Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)==1){l=Qa[f[(f[b>>2]|0)+48>>2]&127](b)|0;m=Ra[f[(f[b>>2]|0)+56>>2]&127](b,d)|0;if((l|0)==0|(m|0)==0){f[a>>2]=0;u=h;return}n=Ra[f[(f[b>>2]|0)+52>>2]&127](b,d)|0;if(!n){f[i>>2]=f[b+52>>2];f[i+4>>2]=l;f[i+12>>2]=m;f[i+8>>2]=m+12;qd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}else{f[i>>2]=f[b+52>>2];f[i+4>>2]=n;f[i+12>>2]=m;f[i+8>>2]=m+12;pd(a,j,c,k,e,i,g);if(!(f[a>>2]|0)){f[a>>2]=0;break}u=h;return}}while(0);f[a>>2]=0;u=h;return}function Yf(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=f[d>>2]|0;g=f[d+4>>2]|0;if((e|0)==(g|0)){h=0;i=a+12|0;j=a+8|0}else{d=f[c>>2]|0;c=a+8|0;k=a+12|0;a=0;l=e;while(1){e=f[l>>2]|0;m=f[d+(e<<2)>>2]|0;if(m>>>0>>0)n=a;else{o=f[c>>2]|0;p=(f[k>>2]|0)-o|0;q=o;if((p|0)>0){o=p>>>2;p=0;do{r=f[q+(p<<2)>>2]|0;s=f[r+68>>2]|0;if(!(b[r+84>>0]|0))t=f[s+(e<<2)>>2]|0;else t=e;f[s+(m<<2)>>2]=t;p=p+1|0}while((p|0)<(o|0))}n=m+1|0}l=l+4|0;if((l|0)==(g|0)){h=n;i=k;j=c;break}else a=n}}n=f[i>>2]|0;a=f[j>>2]|0;if((n-a|0)>0){u=0;v=a;w=n}else return;while(1){n=f[v+(u<<2)>>2]|0;b[n+84>>0]=0;a=n+68|0;c=n+72|0;n=f[c>>2]|0;k=f[a>>2]|0;g=n-k>>2;l=k;k=n;if(h>>>0<=g>>>0)if(h>>>0>>0?(n=l+(h<<2)|0,(n|0)!=(k|0)):0){f[c>>2]=k+(~((k+-4-n|0)>>>2)<<2);x=v;y=w}else{x=v;y=w}else{Ch(a,h-g|0,6220);x=f[j>>2]|0;y=f[i>>2]|0}u=u+1|0;if((u|0)>=(y-x>>2|0))break;else{v=x;w=y}}return}function Zf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;q=p>>2;if(q|0)im(i|0,b|0,p|0)|0;p=j+(q<<2)|0;if(!m){m=f[k>>2]|0;if((m|0)==(p|0))return;f[k>>2]=m+(~((m+-4-p|0)>>>2)<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=((c+-4-o|0)>>>2)+1|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+(p<<2);return}p=i;if(!i)r=h;else{h=a+4|0;l=f[h>>2]|0;if((l|0)!=(j|0))f[h>>2]=l+(~((l+-4-i|0)>>>2)<<2);Oq(p);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;r=0}if(e>>>0>1073741823)aq(a);h=r>>1;p=r>>2>>>0<536870911?(h>>>0>>0?e:h):1073741823;if(p>>>0>1073741823)aq(a);h=ln(p<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(p<<2);if((b|0)==(c|0))return;p=((c+-4-d|0)>>>2)+1|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+(p<<2);return}function _f(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=u;u=u+32|0;e=d;g=a+40|0;h=(f[c>>2]|0)+(f[g>>2]|0)|0;i=a+24|0;j=f[a+32>>2]|0;k=j+-16384|0;do if(k>>>0>=64){if(k>>>0<16384){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;b[m>>0]=j;b[m+1>>0]=j>>>8;n=(f[l>>2]|0)+2|0;break}if(k>>>0<4194304){l=a+28|0;m=(f[i>>2]|0)+(f[l>>2]|0)|0;o=j+8372224|0;b[m>>0]=o;b[m+1>>0]=o>>>8;b[m+2>>0]=o>>>16;n=(f[l>>2]|0)+3|0;break}if(k>>>0<1073741824){l=a+28|0;o=(f[i>>2]|0)+(f[l>>2]|0)|0;m=j+-1073758208|0;b[o>>0]=m;b[o+1>>0]=m>>>8;b[o+2>>0]=m>>>16;b[o+3>>0]=m>>>24;n=(f[l>>2]|0)+4|0;break}else{n=f[a+28>>2]|0;break}}else{l=a+28|0;b[(f[i>>2]|0)+(f[l>>2]|0)>>0]=k;n=(f[l>>2]|0)+1|0}while(0);k=((n|0)<0)<<31>>31;Gn(e);yh(n,k,e)|0;i=e+4|0;a=(f[i>>2]|0)-(f[e>>2]|0)|0;im(h+a|0,h|0,n|0)|0;kh(h|0,f[e>>2]|0,a|0)|0;h=g;g=f[h>>2]|0;j=f[h+4>>2]|0;h=Vn(a|0,0,n|0,k|0)|0;k=Vn(h|0,I|0,g|0,j|0)|0;Cl(c,k,I);k=e+12|0;c=f[k>>2]|0;f[k>>2]=0;if(c|0)Oq(c);c=f[e>>2]|0;if(!c){u=d;return}if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c);u=d;return}function $f(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;e=c-d>>2;g=a+8|0;h=f[g>>2]|0;i=f[a>>2]|0;j=i;if(e>>>0<=h-i>>2>>>0){k=a+4|0;l=(f[k>>2]|0)-i>>2;m=e>>>0>l>>>0;n=b+(l<<2)|0;l=m?n:c;o=l;p=o-d|0;q=p>>2;if(q|0)im(i|0,b|0,p|0)|0;p=j+(q<<2)|0;if(!m){m=f[k>>2]|0;if((m|0)==(p|0))return;f[k>>2]=m+(~((m+-4-p|0)>>>2)<<2);return}if((l|0)==(c|0))return;l=f[k>>2]|0;p=c+-4-o|0;o=n;n=l;while(1){f[n>>2]=f[o>>2];o=o+4|0;if((o|0)==(c|0))break;else n=n+4|0}f[k>>2]=l+((p>>>2)+1<<2);return}p=i;if(!i)r=h;else{h=a+4|0;l=f[h>>2]|0;if((l|0)!=(j|0))f[h>>2]=l+(~((l+-4-i|0)>>>2)<<2);Oq(p);f[g>>2]=0;f[h>>2]=0;f[a>>2]=0;r=0}if(e>>>0>1073741823)aq(a);h=r>>1;p=r>>2>>>0<536870911?(h>>>0>>0?e:h):1073741823;if(p>>>0>1073741823)aq(a);h=ln(p<<2)|0;e=a+4|0;f[e>>2]=h;f[a>>2]=h;f[g>>2]=h+(p<<2);if((b|0)==(c|0))return;p=c+-4-d|0;d=b;b=h;while(1){f[b>>2]=f[d>>2];d=d+4|0;if((d|0)==(c|0))break;else b=b+4|0}f[e>>2]=h+((p>>>2)+1<<2);return}function ag(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0;g=u;u=u+80|0;h=g;i=g+64|0;Il(h);j=f[(f[a+8>>2]|0)+56>>2]|0;k=X(Vl(5)|0,d)|0;Jj(h,j,0,d&255,5,0,k,((k|0)<0)<<31>>31,0,0);k=ln(96)|0;tl(k,h);Bj(k,c)|0;f[i>>2]=k;gj(a,i);k=f[i>>2]|0;f[i>>2]=0;if(k|0){i=k+88|0;c=f[i>>2]|0;f[i>>2]=0;if(c|0){i=f[c+8>>2]|0;if(i|0){h=c+12|0;if((f[h>>2]|0)!=(i|0))f[h>>2]=i;Oq(i)}Oq(c)}c=f[k+68>>2]|0;if(c|0){i=k+72|0;h=f[i>>2]|0;if((h|0)!=(c|0))f[i>>2]=h+(~((h+-4-c|0)>>>2)<<2);Oq(c)}c=k+64|0;h=f[c>>2]|0;f[c>>2]=0;if(h|0){c=f[h>>2]|0;if(c|0){i=h+4|0;if((f[i>>2]|0)!=(c|0))f[i>>2]=c;Oq(c)}Oq(h)}Oq(k)}if(!e){u=g;return}k=f[a+32>>2]|0;b[k+84>>0]=0;a=k+68|0;h=k+72|0;k=f[h>>2]|0;c=f[a>>2]|0;i=k-c>>2;d=k;if(i>>>0>>0){Ch(a,e-i|0,1532);u=g;return}if(i>>>0<=e>>>0){u=g;return}i=c+(e<<2)|0;if((i|0)==(d|0)){u=g;return}f[h>>2]=d+(~((d+-4-i|0)>>>2)<<2);u=g;return}function bg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;c=u;u=u+16|0;d=c+4|0;e=c;g=a+4|0;h=f[g>>2]|0;i=a+8|0;j=f[i>>2]|0;if((j|0)==(h|0))k=h;else{l=j+(~((j+-4-h|0)>>>2)<<2)|0;f[i>>2]=l;k=l}l=a+16|0;h=f[l>>2]|0;j=a+20|0;m=f[j>>2]|0;n=h;if((m|0)!=(h|0))f[j>>2]=m+(~((m+-4-n|0)>>>2)<<2);m=f[b>>2]|0;h=f[b+4>>2]|0;if((m|0)==(h|0)){u=c;return}b=a+12|0;a=m;m=k;k=n;while(1){n=f[a>>2]|0;f[d>>2]=n;if((m|0)==(f[b>>2]|0)){Ri(g,d);o=f[l>>2]|0}else{f[m>>2]=n;f[i>>2]=m+4;o=k}n=f[d>>2]|0;p=f[j>>2]|0;q=p-o>>2;r=o;if((n|0)<(q|0)){s=r;t=n;v=o}else{w=n+1|0;f[e>>2]=-1;x=p;if(w>>>0<=q>>>0)if(w>>>0>>0?(p=r+(w<<2)|0,(p|0)!=(x|0)):0){f[j>>2]=x+(~((x+-4-p|0)>>>2)<<2);y=n;z=r;A=o}else{y=n;z=r;A=o}else{Ch(l,w-q|0,e);q=f[l>>2]|0;y=f[d>>2]|0;z=q;A=q}s=z;t=y;v=A}m=f[i>>2]|0;f[s+(t<<2)>>2]=(m-(f[g>>2]|0)>>2)+-1;a=a+4|0;if((a|0)==(h|0))break;else k=v}u=c;return}function cg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;c=u;u=u+16|0;d=c;e=a+76|0;g=f[e>>2]|0;h=a+80|0;i=f[h>>2]|0;if((i|0)!=(g|0))f[h>>2]=i+(~((i+-4-g|0)>>>2)<<2);f[e>>2]=0;f[h>>2]=0;f[a+84>>2]=0;if(g|0)Oq(g);g=a+64|0;h=f[g>>2]|0;e=a+68|0;if((f[e>>2]|0)!=(h|0))f[e>>2]=h;f[g>>2]=0;f[e>>2]=0;f[a+72>>2]=0;if(h|0)Oq(h);h=b+4|0;e=f[h>>2]|0;g=f[b>>2]|0;i=((e-g|0)/12|0)*3|0;j=a+4|0;k=f[j>>2]|0;l=f[a>>2]|0;m=k-l>>2;n=l;l=k;k=g;if(i>>>0<=m>>>0)if(i>>>0>>0?(o=n+(i<<2)|0,(o|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-o|0)>>>2)<<2);p=e;q=g;r=k}else{p=e;q=g;r=k}else{Ci(a,i-m|0);m=f[b>>2]|0;p=f[h>>2]|0;q=m;r=m}if((p|0)!=(q|0)){q=f[a>>2]|0;m=(p-r|0)/12|0;p=0;do{h=p*3|0;f[q+(h<<2)>>2]=f[r+(p*12|0)>>2];f[q+(h+1<<2)>>2]=f[r+(p*12|0)+4>>2];f[q+(h+2<<2)>>2]=f[r+(p*12|0)+8>>2];p=p+1|0}while(p>>>0>>0)}f[d>>2]=-1;if(!(rc(a,d)|0)){s=0;u=c;return s|0}eb(a,f[d>>2]|0)|0;s=1;u=c;return s|0}function dg(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=d[b>>1]|0;e=d[b+2>>1]|0;g=d[b+4>>1]|0;b=(((c^318)&65535)+239^e&65535)+239^g&65535;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(b>>>0>>0)l=b;else l=(b>>>0)%(h>>>0)|0;else l=b&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(b|0);if(!(n|(m&j|0)==(l|0))){i=0;o=23;break}if(((n?(n=k+8|0,(d[n>>1]|0)==c<<16>>16):0)?(d[n+2>>1]|0)==e<<16>>16:0)?(d[k+12>>1]|0)==g<<16>>16:0){i=k;o=23;break}k=f[k>>2]|0;if(!k){i=0;o=23;break}}if((o|0)==23)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(b|0)){k=p+8|0;if(((d[k>>1]|0)==c<<16>>16?(d[k+2>>1]|0)==e<<16>>16:0)?(d[p+12>>1]|0)==g<<16>>16:0){i=p;o=23;break}}else{if(a>>>0>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=23;break}}p=f[p>>2]|0;if(!p){i=0;o=23;break}}if((o|0)==23)return i|0;return 0}function eg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=u;u=u+32|0;d=c;e=a+16|0;g=e;h=f[g>>2]|0;i=f[g+4>>2]|0;if(!((i|0)>0|(i|0)==0&h>>>0>0)){u=c;return}g=Vn(f[(f[a+12>>2]|0)+4>>2]|0,0,7,0)|0;j=Yn(g|0,I|0,3)|0;g=I;if(!(b[a+24>>0]|0)){k=a+4|0;l=k;m=k;n=h;o=i}else{k=f[a>>2]|0;p=a+4|0;q=k+((f[p>>2]|0)-k)|0;k=Vn(h|0,i|0,8,0)|0;i=q+(0-k)|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;b[d+24>>0]=0;yh(j,g,d)|0;k=d+4|0;q=(f[k>>2]|0)-(f[d>>2]|0)|0;im(i+q|0,i+8|0,j|0)|0;kh(i|0,f[d>>2]|0,q|0)|0;i=e;h=Vn(f[i>>2]|0,f[i+4>>2]|0,8-q|0,0)|0;q=e;f[q>>2]=h;f[q+4>>2]=I;q=d+12|0;h=f[q>>2]|0;f[q>>2]=0;if(h|0)Oq(h);h=f[d>>2]|0;if(h|0){if((f[k>>2]|0)!=(h|0))f[k>>2]=h;Oq(h)}h=e;l=p;m=p;n=f[h>>2]|0;o=f[h+4>>2]|0}h=f[l>>2]|0;l=f[a>>2]|0;p=h-l|0;k=Xn(j|0,g|0,n|0,o|0)|0;o=Vn(k|0,I|0,p|0,0)|0;k=l;l=h;if(p>>>0>=o>>>0){if(p>>>0>o>>>0?(h=k+o|0,(h|0)!=(l|0)):0)f[m>>2]=h}else Fi(a,o-p|0);p=e;f[p>>2]=0;f[p+4>>2]=0;u=c;return}function fg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f[a+4>>2]=f[b+4>>2];c=a+8|0;d=b+8|0;if((a|0)==(b|0))return a|0;e=b+12|0;g=f[e>>2]|0;if(!g)h=0;else{i=a+16|0;do if(g>>>0>f[i>>2]<<5>>>0){j=f[c>>2]|0;if(!j)k=g;else{Oq(j);f[c>>2]=0;f[i>>2]=0;f[a+12>>2]=0;k=f[e>>2]|0}if((k|0)<0)aq(c);else{j=((k+-1|0)>>>5)+1|0;l=ln(j<<2)|0;f[c>>2]=l;f[a+12>>2]=0;f[i>>2]=j;m=f[e>>2]|0;n=l;break}}else{m=g;n=f[c>>2]|0}while(0);im(n|0,f[d>>2]|0,((m+-1|0)>>>5<<2)+4|0)|0;h=f[e>>2]|0}f[a+12>>2]=h;h=a+20|0;e=b+20|0;m=b+24|0;b=f[m>>2]|0;if(!b)o=0;else{d=a+28|0;do if(b>>>0>f[d>>2]<<5>>>0){n=f[h>>2]|0;if(!n)p=b;else{Oq(n);f[h>>2]=0;f[d>>2]=0;f[a+24>>2]=0;p=f[m>>2]|0}if((p|0)<0)aq(h);else{n=((p+-1|0)>>>5)+1|0;c=ln(n<<2)|0;f[h>>2]=c;f[a+24>>2]=0;f[d>>2]=n;q=f[m>>2]|0;r=c;break}}else{q=b;r=f[h>>2]|0}while(0);im(r|0,f[e>>2]|0,((q+-1|0)>>>5<<2)+4|0)|0;o=f[m>>2]|0}f[a+24>>2]=o;return a|0}function gg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f[c>>2]=1;d=a+4|0;e=c+8|0;g=c+12|0;c=f[e>>2]|0;i=(f[g>>2]|0)-c|0;if(i>>>0<4294967292){Lk(e,i+4|0,0);j=f[e>>2]|0}else j=c;c=j+i|0;i=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[c>>0]=i;b[c+1>>0]=i>>8;b[c+2>>0]=i>>16;b[c+3>>0]=i>>24;i=a+8|0;c=a+12|0;d=f[i>>2]|0;if((f[c>>2]|0)!=(d|0)){j=0;k=d;do{d=k+(j<<2)|0;l=f[e>>2]|0;m=(f[g>>2]|0)-l|0;if(m>>>0<4294967292){Lk(e,m+4|0,0);n=f[e>>2]|0}else n=l;l=n+m|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;j=j+1|0;k=f[i>>2]|0}while(j>>>0<(f[c>>2]|0)-k>>2>>>0)}k=a+20|0;a=f[e>>2]|0;c=(f[g>>2]|0)-a|0;if(c>>>0<4294967292){Lk(e,c+4|0,0);o=f[e>>2]|0;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}else{o=a;p=o+c|0;q=h[k>>0]|h[k+1>>0]<<8|h[k+2>>0]<<16|h[k+3>>0]<<24;b[p>>0]=q;b[p+1>>0]=q>>8;b[p+2>>0]=q>>16;b[p+3>>0]=q>>24;return}}function hg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+8|0;e=f[d>>2]|0;g=f[a>>2]|0;h=g;do if(e-g>>2>>>0>=b>>>0){i=a+4|0;j=f[i>>2]|0;k=j-g>>2;l=k>>>0>>0;m=l?k:b;n=j;if(m|0){j=m;m=h;while(1){f[m>>2]=f[c>>2];j=j+-1|0;if(!j)break;else m=m+4|0}}if(!l){m=h+(b<<2)|0;if((m|0)==(n|0))return;else{o=i;p=n+(~((n+-4-m|0)>>>2)<<2)|0;break}}else{m=b-k|0;j=m;q=n;while(1){f[q>>2]=f[c>>2];j=j+-1|0;if(!j)break;else q=q+4|0}o=i;p=n+(m<<2)|0;break}}else{q=g;if(!g)r=e;else{j=a+4|0;k=f[j>>2]|0;if((k|0)!=(h|0))f[j>>2]=k+(~((k+-4-g|0)>>>2)<<2);Oq(q);f[d>>2]=0;f[j>>2]=0;f[a>>2]=0;r=0}if(b>>>0>1073741823)aq(a);j=r>>1;q=r>>2>>>0<536870911?(j>>>0>>0?b:j):1073741823;if(q>>>0>1073741823)aq(a);j=ln(q<<2)|0;k=a+4|0;f[k>>2]=j;f[a>>2]=j;f[d>>2]=j+(q<<2);q=b;l=j;while(1){f[l>>2]=f[c>>2];q=q+-1|0;if(!q)break;else l=l+4|0}o=k;p=j+(b<<2)|0}while(0);f[o>>2]=p;return}function ig(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=jh(a,b,c,d,g)|0;i=f[e>>2]|0;j=f[d>>2]|0;k=f[g>>2]|0;g=f[k>>2]|0;l=(f[k+4>>2]|0)-g>>3;if(l>>>0<=i>>>0)aq(k);m=g;if(l>>>0<=j>>>0)aq(k);if((f[m+(i<<3)>>2]|0)>>>0>=(f[m+(j<<3)>>2]|0)>>>0){n=h;return n|0}f[d>>2]=i;f[e>>2]=j;j=f[d>>2]|0;e=f[c>>2]|0;if(l>>>0<=j>>>0)aq(k);if(l>>>0<=e>>>0)aq(k);if((f[m+(j<<3)>>2]|0)>>>0>=(f[m+(e<<3)>>2]|0)>>>0){n=h+1|0;return n|0}f[c>>2]=j;f[d>>2]=e;e=f[c>>2]|0;d=f[b>>2]|0;if(l>>>0<=e>>>0)aq(k);if(l>>>0<=d>>>0)aq(k);if((f[m+(e<<3)>>2]|0)>>>0>=(f[m+(d<<3)>>2]|0)>>>0){n=h+2|0;return n|0}f[b>>2]=e;f[c>>2]=d;d=f[b>>2]|0;c=f[a>>2]|0;if(l>>>0<=d>>>0)aq(k);if(l>>>0<=c>>>0)aq(k);if((f[m+(d<<3)>>2]|0)>>>0>=(f[m+(c<<3)>>2]|0)>>>0){n=h+3|0;return n|0}f[a>>2]=d;f[b>>2]=c;n=h+4|0;return n|0}function jg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=b[c>>0]|0;e=b[c+1>>0]|0;g=b[c+2>>0]|0;c=((d&255^318)+239^e&255)+239^g&255;h=f[a+4>>2]|0;if(!h){i=0;return i|0}j=h+-1|0;k=(j&h|0)==0;if(!k)if(c>>>0>>0)l=c;else l=(c>>>0)%(h>>>0)|0;else l=c&j;m=f[(f[a>>2]|0)+(l<<2)>>2]|0;if(!m){i=0;return i|0}a=f[m>>2]|0;if(!a){i=0;return i|0}if(k){k=a;while(1){m=f[k+4>>2]|0;n=(m|0)==(c|0);if(!(n|(m&j|0)==(l|0))){i=0;o=23;break}if(((n?(n=k+8|0,(b[n>>0]|0)==d<<24>>24):0)?(b[n+1>>0]|0)==e<<24>>24:0)?(b[n+2>>0]|0)==g<<24>>24:0){i=k;o=23;break}k=f[k>>2]|0;if(!k){i=0;o=23;break}}if((o|0)==23)return i|0}else p=a;while(1){a=f[p+4>>2]|0;if((a|0)==(c|0)){k=p+8|0;if(((b[k>>0]|0)==d<<24>>24?(b[k+1>>0]|0)==e<<24>>24:0)?(b[k+2>>0]|0)==g<<24>>24:0){i=p;o=23;break}}else{if(a>>>0>>0)q=a;else q=(a>>>0)%(h>>>0)|0;if((q|0)!=(l|0)){i=0;o=23;break}}p=f[p>>2]|0;if(!p){i=0;o=23;break}}if((o|0)==23)return i|0;return 0}function kg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=u;u=u+16|0;c=b;d=a+36|0;e=a+4|0;g=a+8|0;h=(f[g>>2]|0)-(f[e>>2]|0)>>2;i=a+40|0;j=f[i>>2]|0;k=f[d>>2]|0;l=j-k>>2;m=k;k=j;if(h>>>0<=l>>>0){if(h>>>0>>0?(j=m+(h<<2)|0,(j|0)!=(k|0)):0){m=k;do{k=m+-4|0;f[i>>2]=k;n=f[k>>2]|0;f[k>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);m=f[i>>2]|0}while((m|0)!=(j|0))}}else Eg(d,h-l|0);if((f[g>>2]|0)==(f[e>>2]|0)){o=1;u=b;return o|0}l=a+52|0;h=a+48|0;j=0;while(1){Xa[f[(f[a>>2]|0)+56>>2]&15](c,a,j);m=(f[d>>2]|0)+(j<<2)|0;i=f[c>>2]|0;f[c>>2]=0;n=f[m>>2]|0;f[m>>2]=i;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);n=f[c>>2]|0;f[c>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n);n=f[(f[d>>2]|0)+(j<<2)>>2]|0;if(!n){o=0;p=19;break}if(j>>>0<(f[l>>2]|0)>>>0?f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0:0)Bp(n);j=j+1|0;if(j>>>0>=(f[g>>2]|0)-(f[e>>2]|0)>>2>>>0){o=1;p=19;break}}if((p|0)==19){u=b;return o|0}return 0}function lg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d+4|0;g=d;ci(f[c+12>>2]|0,b)|0;h=f[c+8>>2]|0;a:do if(h|0){i=b+16|0;j=b+4|0;k=h;while(1){l=k;if(!(Bf(0,b,l+8|0)|0)){m=0;break}n=l+20|0;o=(f[l+24>>2]|0)-(f[n>>2]|0)|0;ci(o,b)|0;l=f[n>>2]|0;n=i;p=f[n+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[j>>2];f[e>>2]=f[g>>2];Me(b,e,l,l+o|0)|0}k=f[k>>2]|0;if(!k)break a}u=d;return m|0}while(0);ci(f[c+32>>2]|0,b)|0;e=f[c+28>>2]|0;if(!e){m=1;u=d;return m|0}else q=e;while(1){e=q;if(!(Bf(0,b,e+8|0)|0)){m=0;r=10;break}lg(a,b,f[e+20>>2]|0)|0;q=f[q>>2]|0;if(!q){m=1;r=10;break}}if((r|0)==10){u=d;return m|0}return 0}function mg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+8|0;i=a+12|0;j=f[h>>2]|0;if((f[i>>2]|0)==(j|0)){k=ln(76)|0;vn(k,b);l=k;f[g>>2]=l;k=f[i>>2]|0;if(k>>>0<(f[a+16>>2]|0)>>>0){f[g>>2]=0;f[k>>2]=l;f[i>>2]=k+4;m=g}else{Qg(h,g);m=g}g=f[m>>2]|0;f[m>>2]=0;if(!g){u=c;return 1}Va[f[(f[g>>2]|0)+4>>2]&127](g);u=c;return 1}g=f[j>>2]|0;f[d>>2]=b;j=g+4|0;m=g+8|0;h=f[m>>2]|0;if((h|0)==(f[g+12>>2]|0))Ri(j,d);else{f[h>>2]=b;f[m>>2]=h+4}h=f[d>>2]|0;b=g+16|0;k=g+20|0;g=f[k>>2]|0;i=f[b>>2]|0;l=g-i>>2;a=i;if((h|0)<(l|0)){n=a;o=h}else{i=h+1|0;f[e>>2]=-1;p=g;if(i>>>0<=l>>>0)if(i>>>0>>0?(g=a+(i<<2)|0,(g|0)!=(p|0)):0){f[k>>2]=p+(~((p+-4-g|0)>>>2)<<2);q=h;r=a}else{q=h;r=a}else{Ch(b,i-l|0,e);q=f[d>>2]|0;r=f[b>>2]|0}n=r;o=q}f[n+(o<<2)>>2]=((f[m>>2]|0)-(f[j>>2]|0)>>2)+-1;u=c;return 1}function ng(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0>j-k>>2>>>0){m=k;if(!k)n=j;else{j=a+4|0;o=f[j>>2]|0;if((o|0)!=(l|0))f[j>>2]=o+(~((o+-4-k|0)>>>2)<<2);Oq(m);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;n=0}if(h>>>0>1073741823)aq(a);j=n>>1;m=n>>2>>>0<536870911?(j>>>0>>0?h:j):1073741823;if(m>>>0>1073741823)aq(a);j=ln(m<<2)|0;n=a+4|0;f[n>>2]=j;f[a>>2]=j;f[i>>2]=j+(m<<2);if((g|0)<=0)return;kh(j|0,b|0,g|0)|0;f[n>>2]=j+(g>>>2<<2);return}g=a+4|0;a=f[g>>2]|0;j=a-k>>2;k=h>>>0>j>>>0;h=k?b+(j<<2)|0:c;c=a;j=a;if((h|0)==(b|0))p=l;else{a=h+-4-e|0;e=b;b=l;while(1){f[b>>2]=f[e>>2];e=e+4|0;if((e|0)==(h|0))break;else b=b+4|0}p=l+((a>>>2)+1<<2)|0}if(k){k=d-h|0;if((k|0)<=0)return;kh(j|0,h|0,k|0)|0;f[g>>2]=(f[g>>2]|0)+(k>>>2<<2);return}else{if((p|0)==(c|0))return;f[g>>2]=c+(~((c+-4-p|0)>>>2)<<2);return}}function og(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=f[a+8>>2]|0;e=a+76|0;g=f[e>>2]|0;h=f[g+80>>2]|0;b[c+84>>0]=0;i=c+68|0;j=c+72|0;k=f[j>>2]|0;l=f[i>>2]|0;m=k-l>>2;n=l;l=k;if(h>>>0<=m>>>0)if(h>>>0>>0?(k=n+(h<<2)|0,(k|0)!=(l|0)):0){f[j>>2]=l+(~((l+-4-k|0)>>>2)<<2);o=g;p=h}else{o=g;p=h}else{Ch(i,h-m|0,3600);m=f[e>>2]|0;o=m;p=f[m+80>>2]|0}m=(f[o+100>>2]|0)-(f[o+96>>2]|0)|0;e=(m|0)/12|0;if(!m){q=1;return q|0}m=c+68|0;c=f[o+96>>2]|0;o=f[d+28>>2]|0;d=f[(f[a+80>>2]|0)+12>>2]|0;a=0;while(1){h=a*3|0;i=f[d+(f[o+(h<<2)>>2]<<2)>>2]|0;if(i>>>0>=p>>>0){q=0;r=10;break}g=f[m>>2]|0;f[g+(f[c+(a*12|0)>>2]<<2)>>2]=i;i=f[d+(f[o+(h+1<<2)>>2]<<2)>>2]|0;if(i>>>0>=p>>>0){q=0;r=10;break}f[g+(f[c+(a*12|0)+4>>2]<<2)>>2]=i;i=f[d+(f[o+(h+2<<2)>>2]<<2)>>2]|0;if(i>>>0>=p>>>0){q=0;r=10;break}f[g+(f[c+(a*12|0)+8>>2]<<2)>>2]=i;a=a+1|0;if(a>>>0>=e>>>0){q=1;r=10;break}}if((r|0)==10)return q|0;return 0}function pg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=u;u=u+16|0;g=e;if(!(xh(a,c,d)|0)){h=0;u=e;return h|0}if((b[(f[a+8>>2]|0)+24>>0]|0)!=3){h=0;u=e;return h|0}i=f[c+48>>2]|0;c=ln(32)|0;f[g>>2]=c;f[g+8>>2]=-2147483616;f[g+4>>2]=17;j=c;k=14495;l=j+17|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[c+17>>0]=0;c=i+16|0;k=f[c>>2]|0;if(k){j=c;l=k;a:while(1){k=l;while(1){if((f[k+16>>2]|0)>=(d|0))break;m=f[k+4>>2]|0;if(!m){n=j;break a}else k=m}l=f[k>>2]|0;if(!l){n=k;break}else j=k}if(((n|0)!=(c|0)?(f[n+16>>2]|0)<=(d|0):0)?(d=n+20|0,(Jh(d,g)|0)!=0):0)o=Hk(d,g,-1)|0;else p=12}else p=12;if((p|0)==12)o=Hk(i,g,-1)|0;if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if((o|0)<1){h=0;u=e;return h|0}ip(a+40|0,o);h=1;u=e;return h|0}function qg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=f[b>>2]|0;d=f[b+4>>2]|0;e=f[b+8>>2]|0;b=((c^318)+239^d)+239^e;g=f[a+4>>2]|0;if(!g){h=0;return h|0}i=g+-1|0;j=(i&g|0)==0;if(!j)if(b>>>0>>0)k=b;else k=(b>>>0)%(g>>>0)|0;else k=b&i;l=f[(f[a>>2]|0)+(k<<2)>>2]|0;if(!l){h=0;return h|0}a=f[l>>2]|0;if(!a){h=0;return h|0}if(j){j=a;while(1){l=f[j+4>>2]|0;m=(l|0)==(b|0);if(!(m|(l&i|0)==(k|0))){h=0;n=23;break}if(((m?(f[j+8>>2]|0)==(c|0):0)?(f[j+12>>2]|0)==(d|0):0)?(f[j+16>>2]|0)==(e|0):0){h=j;n=23;break}j=f[j>>2]|0;if(!j){h=0;n=23;break}}if((n|0)==23)return h|0}else o=a;while(1){a=f[o+4>>2]|0;if((a|0)==(b|0)){if(((f[o+8>>2]|0)==(c|0)?(f[o+12>>2]|0)==(d|0):0)?(f[o+16>>2]|0)==(e|0):0){h=o;n=23;break}}else{if(a>>>0>>0)p=a;else p=(a>>>0)%(g>>>0)|0;if((p|0)!=(k|0)){h=0;n=23;break}}o=f[o>>2]|0;if(!o){h=0;n=23;break}}if((n|0)==23)return h|0;return 0}function rg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=c;g=d-e|0;h=a+8|0;i=f[h>>2]|0;j=f[a>>2]|0;k=j;if(g>>>0>(i-j|0)>>>0){if(!j)l=i;else{i=a+4|0;if((f[i>>2]|0)!=(k|0))f[i>>2]=k;Oq(k);f[h>>2]=0;f[i>>2]=0;f[a>>2]=0;l=0}if((g|0)<0)aq(a);i=l<<1;m=l>>>0<1073741823?(i>>>0>>0?g:i):2147483647;if((m|0)<0)aq(a);i=ln(m)|0;l=a+4|0;f[l>>2]=i;f[a>>2]=i;f[h>>2]=i+m;if((c|0)==(d|0))return;else{n=c;o=i}do{b[o>>0]=b[n>>0]|0;n=n+1|0;o=(f[l>>2]|0)+1|0;f[l>>2]=o}while((n|0)!=(d|0));return}n=a+4|0;a=(f[n>>2]|0)-j|0;j=g>>>0>a>>>0;g=c+a|0;a=j?g:d;if((a|0)==(c|0))p=k;else{o=c;c=k;while(1){b[c>>0]=b[o>>0]|0;o=o+1|0;if((o|0)==(a|0))break;else c=c+1|0}p=k+(a-e)|0}if(!j){if((f[n>>2]|0)==(p|0))return;f[n>>2]=p;return}if((a|0)==(d|0))return;a=g;g=f[n>>2]|0;do{b[g>>0]=b[a>>0]|0;a=a+1|0;g=(f[n>>2]|0)+1|0;f[n>>2]=g}while((a|0)!=(d|0));return}function sg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=c>>>1&1431655765|c<<1&-1431655766;c=d>>>2&858993459|d<<2&-858993460;d=c>>>4&252645135|c<<4&-252645136;c=d>>>8&16711935|d<<8&-16711936;d=32-b|0;e=(c>>>16|c<<16)>>>d;c=e-(e>>>1&1431655765)|0;g=(c>>>2&858993459)+(c&858993459)|0;c=(X((g>>>4)+g&252645135,16843009)|0)>>>24;g=b-c|0;h=f[a>>2]|0;i=h;j=Vn(f[i>>2]|0,f[i+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;g=h;f[g>>2]=j;f[g+4>>2]=I;g=h+8|0;h=g;j=Vn(f[h>>2]|0,f[h+4>>2]|0,c|0,0)|0;c=g;f[c>>2]=j;f[c+4>>2]=I;c=a+28|0;j=f[c>>2]|0;g=32-j|0;h=a+24|0;do if((g|0)>=(b|0)){i=-1>>>d<>2]&~i|i&e<>2]=k;i=j+b|0;f[c>>2]=i;if((i|0)!=32)return;i=a+16|0;l=f[i>>2]|0;if((l|0)==(f[a+20>>2]|0)){Ri(a+12|0,h);m=0;n=0;break}else{f[l>>2]=k;f[i>>2]=l+4;m=0;n=0;break}}else{l=-1>>>j<>2]&~l|l&e<>2]=i;l=a+16|0;k=f[l>>2]|0;if((k|0)==(f[a+20>>2]|0))Ri(a+12|0,h);else{f[k>>2]=i;f[l>>2]=k+4}k=b-g|0;m=k;n=-1>>>(32-k|0)&e>>>g}while(0);f[h>>2]=n;f[c>>2]=m;return}function tg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;e=c&255;g=(d|0)!=0;a:do if(g&(a&3|0)!=0){h=c&255;i=a;j=d;while(1){if((b[i>>0]|0)==h<<24>>24){k=i;l=j;m=6;break a}n=i+1|0;o=j+-1|0;p=(o|0)!=0;if(p&(n&3|0)!=0){i=n;j=o}else{q=n;r=o;s=p;m=5;break}}}else{q=a;r=d;s=g;m=5}while(0);if((m|0)==5)if(s){k=q;l=r;m=6}else{t=q;u=0}b:do if((m|0)==6){q=c&255;if((b[k>>0]|0)==q<<24>>24){t=k;u=l}else{r=X(e,16843009)|0;c:do if(l>>>0>3){s=k;g=l;while(1){d=f[s>>2]^r;if((d&-2139062144^-2139062144)&d+-16843009|0)break;d=s+4|0;a=g+-4|0;if(a>>>0>3){s=d;g=a}else{v=d;w=a;m=11;break c}}x=s;y=g}else{v=k;w=l;m=11}while(0);if((m|0)==11)if(!w){t=v;u=0;break}else{x=v;y=w}while(1){if((b[x>>0]|0)==q<<24>>24){t=x;u=y;break b}r=x+1|0;y=y+-1|0;if(!y){t=r;u=0;break}else x=r}}}while(0);return (u|0?t:0)|0}function ug(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=e;do if((d|0)==(e|0)){h=a+8|0;i=f[h>>2]|0;j=a+12|0;k=f[j>>2]|0;l=k;if(i>>>0>>0){k=i;m=((l-k>>2)+1|0)/2|0;n=i+(m<<2)|0;o=k-d|0;k=o>>2;p=n+(0-k<<2)|0;if(!k){q=n;r=i}else{im(p|0,d|0,o|0)|0;q=p;r=f[h>>2]|0}f[c>>2]=q;f[h>>2]=r+(m<<2);s=q;break}m=l-g>>1;l=(m|0)==0?1:m;if(l>>>0>1073741823){m=ra(8)|0;Oo(m,16035);f[m>>2]=7256;va(m|0,1112,110)}m=ln(l<<2)|0;p=m;o=m+((l+3|0)>>>2<<2)|0;n=o;k=m+(l<<2)|0;if((d|0)==(i|0)){t=n;u=d}else{l=o;m=n;v=d;do{f[l>>2]=f[v>>2];l=m+4|0;m=l;v=v+4|0}while((v|0)!=(i|0));t=m;u=f[a>>2]|0}f[a>>2]=p;f[c>>2]=n;f[h>>2]=t;f[j>>2]=k;if(!u)s=o;else{Oq(u);s=f[c>>2]|0}}else s=d;while(0);f[s+-4>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+-4;return}function vg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=a+4|0;if((f[i>>2]|0)==-1){j=0;u=d;return j|0}k=f[a+8>>2]|0;l=c+16|0;m=l;n=f[m>>2]|0;o=f[m+4>>2]|0;if(!((o|0)>0|(o|0)==0&n>>>0>0)){m=(f[a+12>>2]|0)-k|0;p=c+4|0;f[g>>2]=f[p>>2];f[e>>2]=f[g>>2];Me(c,e,k,k+m|0)|0;m=l;k=f[m>>2]|0;q=f[m+4>>2]|0;m=a+20|0;if((q|0)>0|(q|0)==0&k>>>0>0){r=q;s=k;t=g}else{f[g>>2]=f[p>>2];f[e>>2]=f[g>>2];Me(c,e,m,m+4|0)|0;m=l;r=f[m+4>>2]|0;s=f[m>>2]|0;t=g}}else{r=o;s=n;t=g}b[h>>0]=f[i>>2];if(!((r|0)>0|(r|0)==0&s>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}j=1;u=d;return j|0}function wg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0;e=u;u=u+16|0;g=e+4|0;h=e;i=a+8|0;a=f[i>>2]|0;j=f[a+40>>2]|0;k=Lq((j|0)>-1?j:-1)|0;l=c+4|0;m=f[l>>2]|0;n=f[c>>2]|0;if((m|0)==(n|0)){Mq(k);u=e;return 1}o=d+16|0;p=d+4|0;q=k+j|0;j=0;r=n;n=a;s=a;a=m;while(1){m=f[r+(j<<2)>>2]|0;if(!(b[n+84>>0]|0))t=f[(f[n+68>>2]|0)+(m<<2)>>2]|0;else t=m;m=s+48|0;v=f[m>>2]|0;w=f[m+4>>2]|0;m=s+40|0;x=f[m>>2]|0;y=un(x|0,f[m+4>>2]|0,t|0,0)|0;m=Vn(y|0,I|0,v|0,w|0)|0;kh(k|0,(f[f[s>>2]>>2]|0)+m|0,x|0)|0;x=o;m=f[x+4>>2]|0;if((m|0)>0|(m|0)==0&(f[x>>2]|0)>>>0>0){z=r;A=a}else{f[h>>2]=f[p>>2];f[g>>2]=f[h>>2];Me(d,g,k,q)|0;z=f[c>>2]|0;A=f[l>>2]|0}x=j+1|0;if(x>>>0>=A-z>>2>>>0)break;m=f[i>>2]|0;j=x;r=z;n=m;s=m;a=A}Mq(k);u=e;return 1}function xg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=(f[b>>2]|0)*3|0;if((d|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}b=f[a+12>>2]|0;h=f[b+12>>2]|0;if((f[h+(d<<2)>>2]|0)==-1){e=0;g=d;f[c>>2]=g;return e|0}i=f[b>>2]|0;b=f[a+152>>2]|0;if((f[b+(f[i+(d<<2)>>2]<<2)>>2]|0)==-1){a=d+1|0;j=((a>>>0)%3|0|0)==0?d+-2|0:a;if((j|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}if((f[h+(j<<2)>>2]|0)==-1){e=0;g=j;f[c>>2]=g;return e|0}if((f[b+(f[i+(j<<2)>>2]<<2)>>2]|0)==-1){a=j+1|0;k=((a>>>0)%3|0|0)==0?j+-2|0:a;if((k|0)==-1){e=0;g=-1;f[c>>2]=g;return e|0}if((f[h+(k<<2)>>2]|0)==-1){e=0;g=k;f[c>>2]=g;return e|0}if((f[b+(f[i+(k<<2)>>2]<<2)>>2]|0)==-1){i=k+1|0;e=1;g=((i>>>0)%3|0|0)==0?k+-2|0:i;f[c>>2]=g;return e|0}else l=k}else l=j}else l=d;while(1){d=(((l>>>0)%3|0|0)==0?2:-1)+l|0;if((d|0)==-1)break;j=f[h+(d<<2)>>2]|0;if((j|0)==-1)break;d=j+(((j>>>0)%3|0|0)==0?2:-1)|0;if((d|0)==-1)break;else l=d}e=0;g=(((l>>>0)%3|0|0)==0?2:-1)+l|0;f[c>>2]=g;return e|0}function yg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=a+4|0;g=f[e>>2]|0;if(!g){f[c>>2]=e;h=e;return h|0}e=b[d+11>>0]|0;i=e<<24>>24<0;j=i?f[d+4>>2]|0:e&255;e=i?f[d>>2]|0:d;d=a+4|0;a=g;while(1){g=a+16|0;i=b[g+11>>0]|0;k=i<<24>>24<0;l=k?f[a+20>>2]|0:i&255;i=l>>>0>>0;m=i?l:j;if((m|0)!=0?(n=Vk(e,k?f[g>>2]|0:g,m)|0,(n|0)!=0):0)if((n|0)<0)o=8;else o=10;else if(j>>>0>>0)o=8;else o=10;if((o|0)==8){o=0;n=f[a>>2]|0;if(!n){o=9;break}else{p=a;q=n}}else if((o|0)==10){o=0;n=j>>>0>>0?j:l;if((n|0)!=0?(l=Vk(k?f[g>>2]|0:g,e,n)|0,(l|0)!=0):0){if((l|0)>=0){o=16;break}}else o=12;if((o|0)==12?(o=0,!i):0){o=16;break}r=a+4|0;i=f[r>>2]|0;if(!i){o=15;break}else{p=r;q=i}}d=p;a=q}if((o|0)==9){f[c>>2]=a;h=a;return h|0}else if((o|0)==15){f[c>>2]=a;h=r;return h|0}else if((o|0)==16){f[c>>2]=a;h=d;return h|0}return 0}function zg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;d=u;u=u+32|0;e=d+24|0;g=d+16|0;h=d+8|0;i=d;j=a+4|0;k=f[j>>2]|0;l=f[b>>2]|0;m=f[b+4>>2]|0;b=f[c>>2]|0;n=f[c+4>>2]|0;c=b-l<<3;f[j>>2]=k-m+n+c;j=(f[a>>2]|0)+(k>>>5<<2)|0;a=k&31;k=j;if((m|0)!=(a|0)){f[e>>2]=l;f[e+4>>2]=m;f[g>>2]=b;f[g+4>>2]=n;f[h>>2]=k;f[h+4>>2]=a;xe(i,e,g,h);u=d;return}h=n-m+c|0;c=l;if((h|0)>0){if(!m){o=h;p=j;q=0;r=l;s=c}else{l=32-m|0;n=(h|0)<(l|0)?h:l;g=-1>>>(l-n|0)&-1<>2]=f[j>>2]&~g|f[c>>2]&g;g=n+m|0;l=c+4|0;o=h-n|0;p=j+(g>>>5<<2)|0;q=g&31;r=l;s=l}l=(o|0)/32|0;im(p|0,r|0,l<<2|0)|0;r=o-(l<<5)|0;o=p+(l<<2)|0;p=o;if((r|0)>0){g=-1>>>(32-r|0);f[o>>2]=f[o>>2]&~g|f[s+(l<<2)>>2]&g;t=r;v=p}else{t=q;v=p}}else{t=m;v=k}f[i>>2]=v;f[i+4>>2]=t;u=d;return}function Ag(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;c=a+8|0;d=f[c>>2]|0;e=a+12|0;g=f[e>>2]|0;h=g;do if((d|0)==(g|0)){i=a+4|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(j>>>0>k>>>0){m=j;n=((m-l>>2)+1|0)/-2|0;o=j+(n<<2)|0;p=d-m|0;m=p>>2;if(!m)q=j;else{im(o|0,j|0,p|0)|0;q=f[i>>2]|0}p=o+(m<<2)|0;f[c>>2]=p;f[i>>2]=q+(n<<2);r=p;break}p=h-l>>1;l=(p|0)==0?1:p;if(l>>>0>1073741823){p=ra(8)|0;Oo(p,16035);f[p>>2]=7256;va(p|0,1112,110)}p=ln(l<<2)|0;n=p;m=p+(l>>>2<<2)|0;o=m;s=p+(l<<2)|0;if((j|0)==(d|0)){t=o;u=k}else{k=m;m=o;l=j;do{f[k>>2]=f[l>>2];k=m+4|0;m=k;l=l+4|0}while((l|0)!=(d|0));t=m;u=f[a>>2]|0}f[a>>2]=n;f[i>>2]=o;f[c>>2]=t;f[e>>2]=s;if(!u)r=t;else{Oq(u);r=f[c>>2]|0}}else r=d;while(0);f[r>>2]=f[b>>2];f[c>>2]=(f[c>>2]|0)+4;return}function Bg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+12|0;i=a+4|0;j=f[i>>2]|0;if((j|0)==(f[a+8>>2]|0)){Ri(a,h);k=f[i>>2]|0}else{f[j>>2]=f[h>>2];l=j+4|0;f[i>>2]=l;k=l}l=f[a>>2]|0;f[g>>2]=k-l;k=b+16|0;j=k;m=f[j+4>>2]|0;if(!((m|0)>0|(m|0)==0&(f[j>>2]|0)>>>0>0)){f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=f[a>>2]|0;m=f[g>>2]|0;g=k;k=f[g+4>>2]|0;if((k|0)>0|(k|0)==0&(f[g>>2]|0)>>>0>0){n=j;o=e}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,j,j+m|0)|0;n=f[a>>2]|0;o=e}}else{n=l;o=e}e=f[i>>2]|0;if((e|0)==(n|0)){f[h>>2]=0;p=a+16|0;f[p>>2]=0;u=c;return}f[i>>2]=e+(~((e+-4-n|0)>>>2)<<2);f[h>>2]=0;p=a+16|0;f[p>>2]=0;u=c;return}function Cg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=c;g=d-e|0;h=a+8|0;i=f[h>>2]|0;j=f[a>>2]|0;k=j;if(g>>>0>(i-j|0)>>>0){if(!j)l=i;else{i=a+4|0;if((f[i>>2]|0)!=(k|0))f[i>>2]=k;Oq(k);f[h>>2]=0;f[i>>2]=0;f[a>>2]=0;l=0}if((g|0)<0)aq(a);i=l<<1;m=l>>>0<1073741823?(i>>>0>>0?g:i):2147483647;if((m|0)<0)aq(a);i=ln(m)|0;l=a+4|0;f[l>>2]=i;f[a>>2]=i;f[h>>2]=i+m;if((c|0)==(d|0))return;else{n=c;o=i}do{b[o>>0]=b[n>>0]|0;n=n+1|0;o=(f[l>>2]|0)+1|0;f[l>>2]=o}while((n|0)!=(d|0));return}else{n=a+4|0;a=(f[n>>2]|0)-j|0;j=g>>>0>a>>>0;g=c+a|0;a=j?g:d;o=a-e|0;if(o|0)im(k|0,c|0,o|0)|0;c=k+o|0;if(!j){if((f[n>>2]|0)==(c|0))return;f[n>>2]=c;return}if((a|0)==(d|0))return;a=g;g=f[n>>2]|0;do{b[g>>0]=b[a>>0]|0;a=a+1|0;g=(f[n>>2]|0)+1|0;f[n>>2]=g}while((a|0)!=(d|0));return}}function Dg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+16|0;d=c;if(b[a+352>>0]|0){u=c;return 1}e=a+8|0;g=f[e>>2]|0;h=(f[g+12>>2]|0)-(f[g+8>>2]|0)|0;g=h>>2;i=a+172|0;Gi(i,g+-1|0);if(!((g|0)!=1&(h|0)>0)){u=c;return 1}h=a+12|0;a=0;j=0;while(1){k=f[(f[(f[e>>2]|0)+8>>2]|0)+(a<<2)>>2]|0;if(!(f[k+56>>2]|0))l=j;else{m=f[i>>2]|0;f[m+(j*136|0)>>2]=a;n=f[m+(j*136|0)+104>>2]|0;o=m+(j*136|0)+108|0;p=f[o>>2]|0;if((p|0)!=(n|0))f[o>>2]=p+(~((p+-4-n|0)>>>2)<<2);n=f[h>>2]|0;gk(m+(j*136|0)+104|0,(f[n+4>>2]|0)-(f[n>>2]|0)>>2);n=(f[i>>2]|0)+(j*136|0)+116|0;m=f[h>>2]|0;p=(f[m+4>>2]|0)-(f[m>>2]|0)>>2;f[d>>2]=-1;hg(n,p,d);p=f[i>>2]|0;f[p+(j*136|0)+128>>2]=0;Gc(p+(j*136|0)+4|0,f[e>>2]|0,f[h>>2]|0,k)|0;l=j+1|0}a=a+1|0;if((a|0)>=(g|0))break;else j=l}u=c;return 1}function Eg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){sj(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}i=f[a>>2]|0;j=g-i>>2;g=j+b|0;k=i;if(g>>>0>1073741823)aq(a);l=d-i|0;d=l>>1;m=l>>2>>>0<536870911?(d>>>0>>0?g:d):1073741823;do if(m)if(m>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{n=ln(m<<2)|0;break}else n=0;while(0);d=n+(j<<2)|0;sj(d|0,0,b<<2|0)|0;b=d;j=n+(m<<2)|0;m=n+(g<<2)|0;if((h|0)==(k|0)){o=b;p=i;q=h}else{i=h;h=b;b=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[b+-4>>2]=d;b=h+-4|0;h=b}while((i|0)!=(k|0));o=h;p=f[a>>2]|0;q=f[e>>2]|0}f[a>>2]=o;f[e>>2]=m;f[c>>2]=j;j=p;if((q|0)!=(j|0)){c=q;do{c=c+-4|0;q=f[c>>2]|0;f[c>>2]=0;if(q|0)Va[f[(f[q>>2]|0)+4>>2]&127](q)}while((c|0)!=(j|0))}if(!p)return;Oq(p);return}function Fg(a,c,d,e,g,h){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=$(h);var i=0,j=0,k=0,l=0,m=0,n=0;i=u;u=u+16|0;j=i;k=i+4|0;f[j>>2]=c;c=ln(32)|0;f[k>>2]=c;f[k+8>>2]=-2147483616;f[k+4>>2]=17;l=c;m=14495;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[c+17>>0]=0;Xj(Hd(a,j)|0,k,d);if((b[k+11>>0]|0)<0)Oq(f[k>>2]|0);d=ln(32)|0;f[k>>2]=d;f[k+8>>2]=-2147483616;f[k+4>>2]=19;l=d;m=14438;n=l+19|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[d+19>>0]=0;si(Hd(a,j)|0,k,g,e);if((b[k+11>>0]|0)<0)Oq(f[k>>2]|0);e=ln(32)|0;f[k>>2]=e;f[k+8>>2]=-2147483616;f[k+4>>2]=18;l=e;m=14458;n=l+18|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[e+18>>0]=0;Tj(Hd(a,j)|0,k,h);if((b[k+11>>0]|0)>=0){u=i;return}Oq(f[k>>2]|0);u=i;return}function Gg(a){a=a|0;tk(a);tk(a+32|0);tk(a+64|0);tk(a+96|0);tk(a+128|0);tk(a+160|0);tk(a+192|0);tk(a+224|0);tk(a+256|0);tk(a+288|0);tk(a+320|0);tk(a+352|0);tk(a+384|0);tk(a+416|0);tk(a+448|0);tk(a+480|0);tk(a+512|0);tk(a+544|0);tk(a+576|0);tk(a+608|0);tk(a+640|0);tk(a+672|0);tk(a+704|0);tk(a+736|0);tk(a+768|0);tk(a+800|0);tk(a+832|0);tk(a+864|0);tk(a+896|0);tk(a+928|0);tk(a+960|0);tk(a+992|0);tk(a+1024|0);return}function Hg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=u;u=u+16|0;d=c;if(b[a+288>>0]|0){u=c;return 1}e=a+8|0;g=f[e>>2]|0;h=(f[g+12>>2]|0)-(f[g+8>>2]|0)|0;g=h>>2;i=a+172|0;Gi(i,g+-1|0);if(!((g|0)!=1&(h|0)>0)){u=c;return 1}h=a+12|0;a=0;j=0;while(1){k=f[(f[(f[e>>2]|0)+8>>2]|0)+(a<<2)>>2]|0;if(!(f[k+56>>2]|0))l=j;else{m=f[i>>2]|0;f[m+(j*136|0)>>2]=a;n=f[m+(j*136|0)+104>>2]|0;o=m+(j*136|0)+108|0;p=f[o>>2]|0;if((p|0)!=(n|0))f[o>>2]=p+(~((p+-4-n|0)>>>2)<<2);n=f[h>>2]|0;gk(m+(j*136|0)+104|0,(f[n+4>>2]|0)-(f[n>>2]|0)>>2);n=(f[i>>2]|0)+(j*136|0)+116|0;m=f[h>>2]|0;p=(f[m+4>>2]|0)-(f[m>>2]|0)>>2;f[d>>2]=-1;hg(n,p,d);p=f[i>>2]|0;f[p+(j*136|0)+128>>2]=0;Gc(p+(j*136|0)+4|0,f[e>>2]|0,f[h>>2]|0,k)|0;l=j+1|0}a=a+1|0;if((a|0)>=(g|0))break;else j=l}u=c;return 1}function Ig(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c;e=b;g=d-e|0;h=g>>2;i=a+8|0;j=f[i>>2]|0;k=f[a>>2]|0;l=k;if(h>>>0<=j-k>>2>>>0){m=a+4|0;n=(f[m>>2]|0)-k>>2;o=h>>>0>n>>>0;p=o?b+(n<<2)|0:c;c=p;n=c-e|0;e=n>>2;if(e|0)im(k|0,b|0,n|0)|0;n=l+(e<<2)|0;if(o){o=d-c|0;if((o|0)<=0)return;kh(f[m>>2]|0,p|0,o|0)|0;f[m>>2]=(f[m>>2]|0)+(o>>>2<<2);return}else{o=f[m>>2]|0;if((o|0)==(n|0))return;f[m>>2]=o+(~((o+-4-n|0)>>>2)<<2);return}}n=k;if(!k)q=j;else{j=a+4|0;o=f[j>>2]|0;if((o|0)!=(l|0))f[j>>2]=o+(~((o+-4-k|0)>>>2)<<2);Oq(n);f[i>>2]=0;f[j>>2]=0;f[a>>2]=0;q=0}if(h>>>0>1073741823)aq(a);j=q>>1;n=q>>2>>>0<536870911?(j>>>0>>0?h:j):1073741823;if(n>>>0>1073741823)aq(a);j=ln(n<<2)|0;h=a+4|0;f[h>>2]=j;f[a>>2]=j;f[i>>2]=j+(n<<2);if((g|0)<=0)return;kh(j|0,b|0,g|0)|0;f[h>>2]=j+(g>>>2<<2);return}function Jg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0,v=0.0;e=u;u=u+16|0;g=e;h=c+1|0;f[g>>2]=0;i=g+4|0;f[i>>2]=0;f[g+8>>2]=0;do if(h)if(h>>>0>1073741823)aq(g);else{j=ln(h<<2)|0;f[g>>2]=j;k=j+(h<<2)|0;f[g+8>>2]=k;sj(j|0,0,(c<<2)+4|0)|0;f[i>>2]=k;l=j;m=k;n=j;break}else{l=0;m=0;n=0}while(0);if((b|0)>0){g=0;do{j=l+(f[a+(g<<2)>>2]<<2)|0;f[j>>2]=(f[j>>2]|0)+1;g=g+1|0}while((g|0)!=(b|0))}o=+(b|0);if((c|0)<0){p=0;q=0.0}else{c=0;r=0.0;b=0;while(1){g=f[l+(b<<2)>>2]|0;s=+(g|0);if((g|0)>0){t=c+1|0;v=r+ +Zg(s/o)*s}else{t=c;v=r}b=b+1|0;if((b|0)==(h|0)){p=t;q=v;break}else{c=t;r=v}}}if(d|0)f[d>>2]=p;v=-q;p=~~v>>>0;d=+K(v)>=1.0?(v>0.0?~~+Y(+J(v/4294967296.0),4294967295.0)>>>0:~~+W((v-+(~~v>>>0))/4294967296.0)>>>0):0;if(!l){I=d;u=e;return p|0}if((m|0)!=(l|0))f[i>>2]=m+(~((m+-4-l|0)>>>2)<<2);Oq(n);I=d;u=e;return p|0}function Kg(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e+4|0;h=e;i=ln(32)|0;f[a>>2]=i;f[a+4>>2]=c+4;c=a+8|0;b[c>>0]=0;f[i+16>>2]=f[d>>2];a=i+20|0;f[i+24>>2]=0;f[i+28>>2]=0;j=i+24|0;f[a>>2]=j;i=f[d+4>>2]|0;k=d+8|0;if((i|0)==(k|0)){b[c>>0]=1;u=e;return}d=j;j=i;while(1){i=j+16|0;f[h>>2]=d;f[g>>2]=f[h>>2];ph(a,g,i,i)|0;i=f[j+4>>2]|0;if(!i){l=j+8|0;m=f[l>>2]|0;if((f[m>>2]|0)==(j|0))n=m;else{m=l;do{l=f[m>>2]|0;m=l+8|0;o=f[m>>2]|0}while((f[o>>2]|0)!=(l|0));n=o}}else{m=i;while(1){o=f[m>>2]|0;if(!o)break;else m=o}n=m}if((n|0)==(k|0))break;else j=n}b[c>>0]=1;u=e;return}function Lg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;f[e>>2]=b;g=a+8|0;if(((f[a+12>>2]|0)-(f[g>>2]|0)>>2|0)<=(b|0))Bh(g,b+1|0);h=f[(f[c>>2]|0)+56>>2]|0;do if((h|0)<5){i=a+20+(h*12|0)+4|0;j=f[i>>2]|0;if((j|0)==(f[a+20+(h*12|0)+8>>2]|0)){Ri(a+20+(h*12|0)|0,e);break}else{f[j>>2]=b;f[i>>2]=j+4;break}}while(0);b=f[c>>2]|0;h=f[e>>2]|0;f[b+60>>2]=h;e=(f[g>>2]|0)+(h<<2)|0;f[c>>2]=0;c=f[e>>2]|0;f[e>>2]=b;if(!c){u=d;return}b=c+88|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0){b=f[e+8>>2]|0;if(b|0){h=e+12|0;if((f[h>>2]|0)!=(b|0))f[h>>2]=b;Oq(b)}Oq(e)}e=f[c+68>>2]|0;if(e|0){b=c+72|0;h=f[b>>2]|0;if((h|0)!=(e|0))f[b>>2]=h+(~((h+-4-e|0)>>>2)<<2);Oq(e)}e=c+64|0;h=f[e>>2]|0;f[e>>2]=0;if(h|0){e=f[h>>2]|0;if(e|0){b=h+4|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;Oq(e)}Oq(h)}Oq(c);u=d;return}function Mg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;gk(f[a+4>>2]|0,(f[g+56>>2]|0)-(f[g+52>>2]|0)>>2);g=a+84|0;a=f[g>>2]|0;if(!a){h=f[(f[e>>2]|0)+64>>2]|0;i=(f[h+4>>2]|0)-(f[h>>2]|0)>>2;h=(i>>>0)/3|0;if(i>>>0<=2){u=b;return 1}i=0;do{f[d>>2]=i*3;f[c>>2]=f[d>>2];Zb(e,c);i=i+1|0}while((i|0)<(h|0));u=b;return 1}else{h=f[a>>2]|0;if((f[a+4>>2]|0)==(h|0)){u=b;return 1}a=0;i=h;do{f[d>>2]=f[i+(a<<2)>>2];f[c>>2]=f[d>>2];Zb(e,c);a=a+1|0;h=f[g>>2]|0;i=f[h>>2]|0}while(a>>>0<(f[h+4>>2]|0)-i>>2>>>0);u=b;return 1}return 0}function Ng(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0;d=u;u=u+48|0;e=d+16|0;g=d;h=d+32|0;i=a+28|0;j=f[i>>2]|0;f[h>>2]=j;k=a+20|0;l=(f[k>>2]|0)-j|0;f[h+4>>2]=l;f[h+8>>2]=b;f[h+12>>2]=c;b=l+c|0;l=a+60|0;f[g>>2]=f[l>>2];f[g+4>>2]=h;f[g+8>>2]=2;j=to(Aa(146,g|0)|0)|0;a:do if((b|0)!=(j|0)){g=2;m=b;n=h;o=j;while(1){if((o|0)<0)break;m=m-o|0;p=f[n+4>>2]|0;q=o>>>0>p>>>0;r=q?n+8|0:n;s=g+(q<<31>>31)|0;t=o-(q?p:0)|0;f[r>>2]=(f[r>>2]|0)+t;p=r+4|0;f[p>>2]=(f[p>>2]|0)-t;f[e>>2]=f[l>>2];f[e+4>>2]=r;f[e+8>>2]=s;o=to(Aa(146,e|0)|0)|0;if((m|0)==(o|0)){v=3;break a}else{g=s;n=r}}f[a+16>>2]=0;f[i>>2]=0;f[k>>2]=0;f[a>>2]=f[a>>2]|32;if((g|0)==2)w=0;else w=c-(f[n+4>>2]|0)|0}else v=3;while(0);if((v|0)==3){v=f[a+44>>2]|0;f[a+16>>2]=v+(f[a+48>>2]|0);a=v;f[i>>2]=a;f[k>>2]=a;w=c}u=d;return w|0}function Og(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;f[a>>2]=6192;b=f[a+68>>2]|0;if(b|0){c=a+72|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+56>>2]|0;if(b|0){d=a+60|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+44>>2]|0;if(b|0){c=a+48|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+32>>2]|0;if(b|0){d=a+36|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+20>>2]|0;if(b|0){c=a+24|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}hi(a+8|0);b=a+4|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;b=a+40|0;d=f[b>>2]|0;if(d|0){c=a+44|0;e=f[c>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-4|0;f[c>>2]=e;i=f[e>>2]|0;f[e>>2]=0;if(i|0){bj(i);Oq(i)}h=f[c>>2]|0}while((h|0)!=(d|0));g=f[b>>2]|0}Oq(g)}bj(a);Oq(a);return}function Pg(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if(((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(f[(f[d>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)==0:0)?(j=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if(((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(f[(f[d>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)==0:0)?(k=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if((((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(f[(f[d>>2]|0)+(a>>>5<<2)>>2]&1<<(a&31)|0)==0:0)?(h=f[(f[(f[d+64>>2]|0)+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function Qg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)aq(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{k=ln(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;e=d;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(b|0)){l=e;m=b;n=b}else{i=k;k=e;e=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[e+-4>>2]=d;e=k+-4|0;k=e}while((i|0)!=(b|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=j;f[h>>2]=g;g=m;if((n|0)!=(g|0)){h=n;do{h=h+-4|0;n=f[h>>2]|0;f[h>>2]=0;if(n|0)Va[f[(f[n>>2]|0)+4>>2]&127](n)}while((h|0)!=(g|0))}if(!m)return;Oq(m);return}function Rg(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=a+4|0;a=f[d>>2]|0;do if(a|0){e=b[c+11>>0]|0;g=e<<24>>24<0;h=g?f[c+4>>2]|0:e&255;e=g?f[c>>2]|0:c;g=d;i=a;a:while(1){j=i;while(1){k=j+16|0;l=b[k+11>>0]|0;m=l<<24>>24<0;n=m?f[j+20>>2]|0:l&255;l=h>>>0>>0?h:n;if((l|0)!=0?(o=Vk(m?f[k>>2]|0:k,e,l)|0,(o|0)!=0):0){if((o|0)>=0)break}else p=6;if((p|0)==6?(p=0,n>>>0>=h>>>0):0)break;n=f[j+4>>2]|0;if(!n){q=g;break a}else j=n}i=f[j>>2]|0;if(!i){q=j;break}else g=j}if((q|0)!=(d|0)){g=q+16|0;i=b[g+11>>0]|0;n=i<<24>>24<0;o=n?f[q+20>>2]|0:i&255;i=o>>>0>>0?o:h;if(i|0?(l=Vk(e,n?f[g>>2]|0:g,i)|0,l|0):0){if((l|0)<0)break;else r=q;return r|0}if(h>>>0>=o>>>0){r=q;return r|0}}}while(0);r=d;return r|0}function Sg(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=a+8|0;f[c>>2]=f[b>>2];fg(a+12|0,b+4|0)|0;d=a+44|0;e=b+36|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];if((c|0)==(b|0)){f[a+96>>2]=f[b+88>>2];return}else{ng(a+60|0,f[b+52>>2]|0,f[b+56>>2]|0);ng(a+72|0,f[b+64>>2]|0,f[b+68>>2]|0);ng(a+84|0,f[b+76>>2]|0,f[b+80>>2]|0);f[a+96>>2]=f[b+88>>2];Ig(a+100|0,f[b+92>>2]|0,f[b+96>>2]|0);return}}function Tg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if(((e-h|0)/12|0)>>>0>=b>>>0){i=b;j=h;do{f[j>>2]=f[c>>2];f[j+4>>2]=f[c+4>>2];f[j+8>>2]=f[c+8>>2];j=(f[g>>2]|0)+12|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=(h-i|0)/12|0;h=j+b|0;if(h>>>0>357913941)aq(a);k=(e-i|0)/12|0;i=k<<1;e=k>>>0<178956970?(i>>>0>>0?h:i):357913941;do if(e)if(e>>>0>357913941){i=ra(8)|0;Oo(i,16035);f[i>>2]=7256;va(i|0,1112,110)}else{l=ln(e*12|0)|0;break}else l=0;while(0);i=l+(j*12|0)|0;j=l+(e*12|0)|0;e=b;b=i;l=i;do{f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];b=l+12|0;l=b;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;b=(f[g>>2]|0)-e|0;c=i+(((b|0)/-12|0)*12|0)|0;if((b|0)>0)kh(c|0,e|0,b|0)|0;f[a>>2]=c;f[g>>2]=l;f[d>>2]=j;if(!e)return;Oq(e);return}function Ug(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d>>2;g=e+1|0;if(g>>>0>1073741823)aq(a);h=a+8|0;i=(f[h>>2]|0)-d|0;d=i>>1;j=i>>2>>>0<536870911?(d>>>0>>0?g:d):1073741823;do if(j)if(j>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{k=ln(j<<2)|0;break}else k=0;while(0);d=k+(e<<2)|0;e=d;g=k+(j<<2)|0;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;j=d+4|0;b=f[a>>2]|0;k=f[c>>2]|0;if((k|0)==(b|0)){l=e;m=b;n=b}else{i=k;k=e;e=d;do{i=i+-4|0;d=f[i>>2]|0;f[i>>2]=0;f[e+-4>>2]=d;e=k+-4|0;k=e}while((i|0)!=(b|0));l=k;m=f[a>>2]|0;n=f[c>>2]|0}f[a>>2]=l;f[c>>2]=j;f[h>>2]=g;g=m;if((n|0)!=(g|0)){h=n;do{h=h+-4|0;n=f[h>>2]|0;f[h>>2]=0;if(n|0){bj(n);Oq(n)}}while((h|0)!=(g|0))}if(!m)return;Oq(m);return}function Vg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=f[b>>2]|0;g=f[a>>2]|0;h=f[d>>2]|0;d=f[h>>2]|0;i=(f[h+4>>2]|0)-d>>3;if(i>>>0<=e>>>0)aq(h);j=d;if(i>>>0<=g>>>0)aq(h);d=f[j+(e<<3)>>2]|0;k=f[c>>2]|0;if(i>>>0<=k>>>0)aq(h);l=j+(g<<3)|0;m=(f[j+(k<<3)>>2]|0)>>>0>>0;if(d>>>0<(f[l>>2]|0)>>>0){if(m){f[a>>2]=k;f[c>>2]=g;n=1;return n|0}f[a>>2]=e;f[b>>2]=g;d=f[c>>2]|0;if(i>>>0<=d>>>0)aq(h);if((f[j+(d<<3)>>2]|0)>>>0>=(f[l>>2]|0)>>>0){n=1;return n|0}f[b>>2]=d;f[c>>2]=g;n=2;return n|0}if(!m){n=0;return n|0}f[b>>2]=k;f[c>>2]=e;e=f[b>>2]|0;c=f[a>>2]|0;if(i>>>0<=e>>>0)aq(h);if(i>>>0<=c>>>0)aq(h);if((f[j+(e<<3)>>2]|0)>>>0>=(f[j+(c<<3)>>2]|0)>>>0){n=1;return n|0}f[a>>2]=e;f[b>>2]=c;n=2;return n|0}function Wg(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=u;u=u+16|0;c=b+4|0;d=b;e=a+8|0;g=f[e>>2]|0;gk(f[a+4>>2]|0,(f[g+28>>2]|0)-(f[g+24>>2]|0)>>2);g=a+84|0;a=f[g>>2]|0;if(!a){h=f[e>>2]|0;i=(f[h+4>>2]|0)-(f[h>>2]|0)>>2;h=(i>>>0)/3|0;if(i>>>0<=2){u=b;return 1}i=0;do{f[d>>2]=i*3;f[c>>2]=f[d>>2];dc(e,c);i=i+1|0}while((i|0)<(h|0));u=b;return 1}else{h=f[a>>2]|0;if((f[a+4>>2]|0)==(h|0)){u=b;return 1}a=0;i=h;do{f[d>>2]=f[i+(a<<2)>>2];f[c>>2]=f[d>>2];dc(e,c);a=a+1|0;h=f[g>>2]|0;i=f[h>>2]|0}while(a>>>0<(f[h+4>>2]|0)-i>>2>>>0);u=b;return 1}return 0}function Xg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;a=u;u=u+16|0;e=a;if(!b){g=0;u=a;return g|0}h=b+96|0;i=b+100|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;b=f[i>>2]|0;j=f[h>>2]|0;k=(b-j|0)/12|0;l=j;j=b;if(k>>>0>=c>>>0){if(k>>>0>c>>>0?(b=l+(c*12|0)|0,(b|0)!=(j|0)):0)f[i>>2]=j+(~(((j+-12-b|0)>>>0)/12|0)*12|0);if(!c){g=1;u=a;return g|0}}else Tg(h,c-k|0,e);k=0;b=f[h>>2]|0;while(1){j=k*3|0;l=f[d+(j<<2)>>2]|0;m=f[d+(j+1<<2)>>2]|0;n=f[d+(j+2<<2)>>2]|0;j=((f[i>>2]|0)-b|0)/12|0;o=k;k=k+1|0;if(o>>>0>>0){p=b;q=b}else{f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;Tg(h,k-j|0,e);j=f[h>>2]|0;p=j;q=j}f[p+(o*12|0)>>2]=l;f[p+(o*12|0)+4>>2]=m;f[p+(o*12|0)+8>>2]=n;if((k|0)==(c|0)){g=1;break}else b=q}u=a;return g|0}function Yg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=u;u=u+80|0;g=e+36|0;h=e;ao(g,c);Ke(h,b,c);Ph(g,h);Ej(h+24|0,f[h+28>>2]|0);Oj(h+12|0,f[h+16>>2]|0);Ej(h,f[h+4>>2]|0);cj(a,g,d);Ej(g+24|0,f[g+28>>2]|0);Oj(g+12|0,f[g+16>>2]|0);Ej(g,f[g+4>>2]|0);u=e;return}function Zg(a){a=+a;var b=0,c=0,d=0,e=0.0,g=0,h=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,q=0.0,r=0.0,t=0.0;p[s>>3]=a;b=f[s>>2]|0;c=f[s+4>>2]|0;d=(c|0)<0;do if(d|c>>>0<1048576){if((b|0)==0&(c&2147483647|0)==0){e=-1.0/(a*a);break}if(d){e=(a-a)/0.0;break}else{p[s>>3]=a*18014398509481984.0;g=f[s+4>>2]|0;h=-1077;i=g;j=f[s>>2]|0;k=g;l=9;break}}else if(c>>>0<=2146435071)if((b|0)==0&0==0&(c|0)==1072693248)e=0.0;else{h=-1023;i=c;j=b;k=c;l=9}else e=a;while(0);if((l|0)==9){l=i+614242|0;f[s>>2]=j;f[s+4>>2]=(l&1048575)+1072079006;a=+p[s>>3]+-1.0;m=a*a*.5;n=a/(a+2.0);o=n*n;q=o*o;p[s>>3]=a-m;j=f[s+4>>2]|0;f[s>>2]=0;f[s+4>>2]=j;r=+p[s>>3];t=a-r-m+n*(m+(q*(q*(q*.15313837699209373+.22222198432149784)+.3999999999940942)+o*(q*(q*(q*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)));q=r*1.4426950407214463;o=+(h+(l>>>20)|0);m=q+o;e=m+(q+(o-m)+(t*1.4426950407214463+(t+r)*1.6751713164886512e-10))}return +e}function _g(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=u;u=u+16|0;e=d;g=ln(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=17;h=g;i=14390;j=h+17|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+17>>0]=0;g=c+16|0;i=f[g>>2]|0;if(i){h=g;j=i;a:while(1){i=j;while(1){if((f[i+16>>2]|0)>=(a|0))break;k=f[i+4>>2]|0;if(!k){l=h;break a}else i=k}j=f[i>>2]|0;if(!j){l=i;break}else h=i}if(((l|0)!=(g|0)?(f[l+16>>2]|0)<=(a|0):0)?(a=l+20|0,(Jh(a,e)|0)!=0):0)m=a;else n=10}else n=10;if((n|0)==10)m=c;c=Hk(m,e,-1)|0;if((b[e+11>>0]|0)>=0){o=(c|0)==-1;p=c>>>0>6;q=p?-2:c;r=o?-1:q;u=d;return r|0}Oq(f[e>>2]|0);o=(c|0)==-1;p=c>>>0>6;q=p?-2:c;r=o?-1:q;u=d;return r|0}function $g(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;g=f[c>>2]|0;f[c>>2]=0;f[e>>2]=g;Lg(a,b,e);g=f[e>>2]|0;f[e>>2]=0;if(g|0){e=g+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){h=c+12|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;Oq(e)}Oq(c)}c=f[g+68>>2]|0;if(c|0){e=g+72|0;h=f[e>>2]|0;if((h|0)!=(c|0))f[e>>2]=h+(~((h+-4-c|0)>>>2)<<2);Oq(c)}c=g+64|0;h=f[c>>2]|0;f[c>>2]=0;if(h|0){c=f[h>>2]|0;if(c|0){e=h+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;Oq(c)}Oq(h)}Oq(g)}g=a+84|0;h=a+88|0;a=f[h>>2]|0;c=f[g>>2]|0;e=a-c>>2;if((e|0)>(b|0)){u=d;return}i=b+1|0;b=a;if(i>>>0>e>>>0){Fh(g,i-e|0);u=d;return}if(i>>>0>=e>>>0){u=d;return}e=c+(i<<2)|0;if((e|0)==(b|0)){u=d;return}f[h>>2]=b+(~((b+-4-e|0)>>>2)<<2);u=d;return}function ah(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;g=a+4|0;f[g>>2]=c;f[a+8>>2]=f[c+52>>2];h=f[a+184>>2]|0;i=a+188|0;j=f[i>>2]|0;if((j|0)!=(h|0))f[i>>2]=j+(~((j+-4-h|0)>>>2)<<2);h=f[c+48>>2]|0;c=ln(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=15351;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Jh(h,e)|0)==0;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);h=f[(f[g>>2]|0)+48>>2]|0;if(c){c=(mi(h)|0)>5&1;b[a+352>>0]=c;u=d;return 1}c=ln(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=15351;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Yj(h,e,0)|0)&1;b[a+352>>0]=c;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);u=d;return 1}function bh(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0;c=a+108|0;d=(f[a+112>>2]|0)-(f[c>>2]|0)|0;e=(d|0)/12|0;g=a+4|0;ci(e,f[(f[g>>2]|0)+44>>2]|0)|0;if(!d)return 1;d=0;a=0;while(1){i=f[c>>2]|0;j=i+(d*12|0)+4|0;ci((f[j>>2]|0)-a|0,f[(f[g>>2]|0)+44>>2]|0)|0;ci((f[j>>2]|0)-(f[i+(d*12|0)>>2]|0)|0,f[(f[g>>2]|0)+44>>2]|0)|0;d=d+1|0;if(d>>>0>=e>>>0)break;else a=f[j>>2]|0}zi(f[(f[g>>2]|0)+44>>2]|0,e,0,0)|0;a=0;do{d=f[(f[g>>2]|0)+44>>2]|0;j=d+16|0;i=f[j+4>>2]|0;if((i|0)>0|(i|0)==0&(f[j>>2]|0)>>>0>0){j=f[d+12>>2]|0;d=j+4|0;i=f[d>>2]|0;k=b[(f[c>>2]|0)+(a*12|0)+8>>0]&1;l=i>>>3;m=i&7;i=(f[j>>2]|0)+l|0;b[i>>0]=(1<>0]|0);i=(f[j>>2]|0)+l|0;b[i>>0]=k<>0]|0);f[d>>2]=(f[d>>2]|0)+1}a=a+1|0}while(a>>>0>>0);eg(f[(f[g>>2]|0)+44>>2]|0);return 1}function ch(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=u;u=u+80|0;g=e+36|0;h=e;io(g,c);Ke(h,b,c);Ph(g,h);Ej(h+24|0,f[h+28>>2]|0);Oj(h+12|0,f[h+16>>2]|0);Ej(h,f[h+4>>2]|0);cj(a,g,d);Ej(g+24|0,f[g+28>>2]|0);Oj(g+12|0,f[g+16>>2]|0);Ej(g,f[g+4>>2]|0);u=e;return}function dh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;g=a+4|0;f[g>>2]=c;f[a+8>>2]=f[c+52>>2];h=f[a+184>>2]|0;i=a+188|0;j=f[i>>2]|0;if((j|0)!=(h|0))f[i>>2]=j+(~((j+-4-h|0)>>>2)<<2);h=f[c+48>>2]|0;c=ln(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=15351;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Jh(h,e)|0)==0;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);h=f[(f[g>>2]|0)+48>>2]|0;if(c){c=(mi(h)|0)>5&1;b[a+288>>0]=c;u=d;return 1}c=ln(32)|0;f[e>>2]=c;f[e+8>>2]=-2147483616;f[e+4>>2]=19;j=c;i=15351;k=j+19|0;do{b[j>>0]=b[i>>0]|0;j=j+1|0;i=i+1|0}while((j|0)<(k|0));b[c+19>>0]=0;c=(Yj(h,e,0)|0)&1;b[a+288>>0]=c;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);u=d;return 1}function eh(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=u;u=u+32|0;h=g+16|0;i=g+8|0;j=g;k=d-e|0;d=a+8|0;if((k|0)>0){a=0-e|0;l=i+4|0;m=j+4|0;n=h+4|0;o=k;do{k=b+(o<<2)|0;p=k+(a<<2)|0;q=c+(o<<2)|0;r=f[k+4>>2]|0;s=f[p>>2]|0;t=f[p+4>>2]|0;f[i>>2]=f[k>>2];f[l>>2]=r;f[j>>2]=s;f[m>>2]=t;Od(h,d,i,j);f[q>>2]=f[h>>2];f[q+4>>2]=f[n>>2];o=o-e|0}while((o|0)>0)}o=e>>>0>1073741823?-1:e<<2;e=Lq(o)|0;sj(e|0,0,o|0)|0;o=f[b+4>>2]|0;n=f[e>>2]|0;m=f[e+4>>2]|0;f[i>>2]=f[b>>2];f[i+4>>2]=o;f[j>>2]=n;f[j+4>>2]=m;Od(h,d,i,j);f[c>>2]=f[h>>2];f[c+4>>2]=f[h+4>>2];Mq(e);u=g;return 1}function fh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+32|0;d=c+12|0;e=c;g=f[b+100>>2]|0;h=f[b+96>>2]|0;b=g-h|0;i=(b|0)/12|0;f[d>>2]=0;j=d+4|0;f[j>>2]=0;f[d+8>>2]=0;k=h;do if(b)if(i>>>0>357913941)aq(d);else{l=ln(b)|0;f[d>>2]=l;f[d+8>>2]=l+(i*12|0);sj(l|0,0,b|0)|0;f[j>>2]=l+b;m=l;break}else m=0;while(0);f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;if((g|0)!=(h|0)){h=e+4|0;g=e+8|0;b=0;do{l=k+(b*12|0)|0;f[e>>2]=f[l>>2];f[e+4>>2]=f[l+4>>2];f[e+8>>2]=f[l+8>>2];f[m+(b*12|0)>>2]=f[e>>2];f[m+(b*12|0)+4>>2]=f[h>>2];f[m+(b*12|0)+8>>2]=f[g>>2];b=b+1|0}while(b>>>0>>0)}Kj(a,d);a=f[d>>2]|0;if(!a){u=c;return}d=f[j>>2]|0;if((d|0)!=(a|0))f[j>>2]=d+(~(((d+-12-a|0)>>>0)/12|0)*12|0);Oq(a);u=c;return}function gh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(c>>>0>4294967279)aq(a);d=a+11|0;e=b[d>>0]|0;g=e<<24>>24<0;if(g){h=f[a+4>>2]|0;i=(f[a+8>>2]&2147483647)+-1|0}else{h=e&255;i=10}j=h>>>0>c>>>0?h:c;c=j>>>0<11;k=c?10:(j+16&-16)+-1|0;do if((k|0)!=(i|0)){do if(c){j=f[a>>2]|0;if(g){l=0;m=j;n=a;o=13}else{Fo(a,j,(e&255)+1|0)|0;Oq(j);o=16}}else{j=k+1|0;p=ln(j)|0;if(g){l=1;m=f[a>>2]|0;n=p;o=13;break}else{Fo(p,a,(e&255)+1|0)|0;q=p;r=j;s=a+4|0;o=15;break}}while(0);if((o|0)==13){j=a+4|0;Fo(n,m,(f[j>>2]|0)+1|0)|0;Oq(m);if(l){q=n;r=k+1|0;s=j;o=15}else o=16}if((o|0)==15){f[a+8>>2]=r|-2147483648;f[s>>2]=h;f[a>>2]=q;break}else if((o|0)==16){b[d>>0]=h;break}}while(0);return}function hh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=f[b>>2]|0;if((c|0)==-1){d=-1;return d|0}b=f[(f[a+24>>2]|0)+(c<<2)>>2]|0;if((b|0)==-1){d=0;return d|0}c=a+12|0;a=0;e=0;g=b;a:while(1){b:do if(e){h=a+1|0;i=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((i|0)==-1){d=h;j=15;break a}k=f[(f[c>>2]|0)+(i<<2)>>2]|0;if((k|0)==-1){d=h;j=15;break a}if(!((k>>>0)%3|0)){l=k+2|0;m=h;break}else{l=k+-1|0;m=h;break}}else{h=a;k=g;while(1){i=h+1|0;n=k+1|0;o=((n>>>0)%3|0|0)==0?k+-2|0:n;if((o|0)==-1){l=b;m=i;break b}n=f[(f[c>>2]|0)+(o<<2)>>2]|0;o=n+1|0;if((n|0)==-1){l=b;m=i;break b}k=((o>>>0)%3|0|0)==0?n+-2|0:o;if((k|0)==-1){l=b;m=i;break b}if((k|0)==(b|0)){d=i;j=15;break a}else h=i}}while(0);if((l|0)==-1){d=m;j=15;break}else{a=m;e=1;g=l}}if((j|0)==15)return d|0;return 0}function ih(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=a+8|0;Vg(a,a+4|0,d,c)|0;e=a+12|0;if((e|0)==(b|0))return;g=f[c>>2]|0;c=f[g>>2]|0;h=(f[g+4>>2]|0)-c>>3;i=c;c=e;e=d;a:while(1){d=f[c>>2]|0;j=f[e>>2]|0;if(h>>>0<=d>>>0){k=5;break}if(h>>>0<=j>>>0){k=7;break}l=i+(d<<3)|0;if((f[l>>2]|0)>>>0<(f[i+(j<<3)>>2]|0)>>>0){m=e;n=c;o=j;while(1){f[n>>2]=o;if((m|0)==(a|0)){p=a;break}j=m+-4|0;o=f[j>>2]|0;if(h>>>0<=o>>>0){k=11;break a}if((f[l>>2]|0)>>>0>=(f[i+(o<<3)>>2]|0)>>>0){p=m;break}else{q=m;m=j;n=q}}f[p>>2]=d}n=c+4|0;if((n|0)==(b|0)){k=3;break}else{m=c;c=n;e=m}}if((k|0)==3)return;else if((k|0)==5)aq(g);else if((k|0)==7)aq(g);else if((k|0)==11)aq(g)}function jh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Vg(a,b,c,e)|0;h=f[d>>2]|0;i=f[c>>2]|0;j=f[e>>2]|0;e=f[j>>2]|0;k=(f[j+4>>2]|0)-e>>3;if(k>>>0<=h>>>0)aq(j);l=e;if(k>>>0<=i>>>0)aq(j);if((f[l+(h<<3)>>2]|0)>>>0>=(f[l+(i<<3)>>2]|0)>>>0){m=g;return m|0}f[c>>2]=h;f[d>>2]=i;i=f[c>>2]|0;d=f[b>>2]|0;if(k>>>0<=i>>>0)aq(j);if(k>>>0<=d>>>0)aq(j);if((f[l+(i<<3)>>2]|0)>>>0>=(f[l+(d<<3)>>2]|0)>>>0){m=g+1|0;return m|0}f[b>>2]=i;f[c>>2]=d;d=f[b>>2]|0;c=f[a>>2]|0;if(k>>>0<=d>>>0)aq(j);if(k>>>0<=c>>>0)aq(j);if((f[l+(d<<3)>>2]|0)>>>0>=(f[l+(c<<3)>>2]|0)>>>0){m=g+2|0;return m|0}f[a>>2]=d;f[b>>2]=c;m=g+3|0;return m|0}function kh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;if((d|0)>=8192)return Da(a|0,c|0,d|0)|0;e=a|0;g=a+d|0;if((a&3)==(c&3)){while(a&3){if(!d)return e|0;b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0;d=d-1|0}h=g&-4|0;d=h-64|0;while((a|0)<=(d|0)){f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];f[a+12>>2]=f[c+12>>2];f[a+16>>2]=f[c+16>>2];f[a+20>>2]=f[c+20>>2];f[a+24>>2]=f[c+24>>2];f[a+28>>2]=f[c+28>>2];f[a+32>>2]=f[c+32>>2];f[a+36>>2]=f[c+36>>2];f[a+40>>2]=f[c+40>>2];f[a+44>>2]=f[c+44>>2];f[a+48>>2]=f[c+48>>2];f[a+52>>2]=f[c+52>>2];f[a+56>>2]=f[c+56>>2];f[a+60>>2]=f[c+60>>2];a=a+64|0;c=c+64|0}while((a|0)<(h|0)){f[a>>2]=f[c>>2];a=a+4|0;c=c+4|0}}else{h=g-4|0;while((a|0)<(h|0)){b[a>>0]=b[c>>0]|0;b[a+1>>0]=b[c+1>>0]|0;b[a+2>>0]=b[c+2>>0]|0;b[a+3>>0]=b[c+3>>0]|0;a=a+4|0;c=c+4|0}}while((a|0)<(g|0)){b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0}return e|0}function lh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;c=u;u=u+16|0;d=c+4|0;e=c;f[a>>2]=1232;g=a+4|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;f[g+20>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;f[d>>2]=b;b=a+4|0;g=a+8|0;Ri(b,d);h=f[d>>2]|0;i=a+20|0;j=f[i>>2]|0;k=a+16|0;a=f[k>>2]|0;l=j-a>>2;m=a;if((h|0)<(l|0)){n=m;o=h;p=f[g>>2]|0;q=f[b>>2]|0;r=p-q|0;s=r>>2;t=s+-1|0;v=n+(o<<2)|0;f[v>>2]=t;u=c;return}a=h+1|0;f[e>>2]=-1;w=j;if(a>>>0<=l>>>0)if(a>>>0>>0?(j=m+(a<<2)|0,(j|0)!=(w|0)):0){f[i>>2]=w+(~((w+-4-j|0)>>>2)<<2);x=h;y=m}else{x=h;y=m}else{Ch(k,a-l|0,e);x=f[d>>2]|0;y=f[k>>2]|0}n=y;o=x;p=f[g>>2]|0;q=f[b>>2]|0;r=p-q|0;s=r>>2;t=s+-1|0;v=n+(o<<2)|0;f[v>>2]=t;u=c;return}function mh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+4|0;c=f[b>>2]|0;d=(f[c+12>>2]|0)-(f[c+8>>2]|0)|0;c=d>>2;a:do if((d|0)>0){e=0;while(1){if(!(Ra[f[(f[a>>2]|0)+36>>2]&127](a,e)|0)){g=0;break}e=e+1|0;h=f[b>>2]|0;i=(f[h+12>>2]|0)-(f[h+8>>2]|0)>>2;if((e|0)>=(i|0)){j=i;break a}}return g|0}else j=c;while(0);c=a+20|0;b=a+24|0;d=f[b>>2]|0;e=f[c>>2]|0;i=d-e>>2;h=e;e=d;if(j>>>0<=i>>>0){if(j>>>0>>0?(d=h+(j<<2)|0,(d|0)!=(e|0)):0)f[b>>2]=e+(~((e+-4-d|0)>>>2)<<2)}else Ci(c,j-i|0);i=f[a+12>>2]|0;j=f[a+8>>2]|0;a=j;if((i|0)==(j|0)){g=1;return g|0}d=i-j>>2;j=0;do{i=f[a+(j<<2)>>2]|0;e=f[i+8>>2]|0;b=f[i+4>>2]|0;i=b;if((e|0)!=(b|0)?(h=f[c>>2]|0,k=e-b>>2,f[h+(f[i>>2]<<2)>>2]=j,k>>>0>1):0){b=1;do{f[h+(f[i+(b<<2)>>2]<<2)>>2]=j;b=b+1|0}while(b>>>0>>0)}j=j+1|0}while(j>>>0>>0);g=1;return g|0}function nh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=f[c+88>>2]|0;if(!d){e=0;return e|0}if((f[d>>2]|0)!=1){e=0;return e|0}g=d+8|0;d=f[g>>2]|0;f[a+4>>2]=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;i=a+8|0;j=c+24|0;c=b[j>>0]|0;k=c<<24>>24;l=a+12|0;m=f[l>>2]|0;n=f[i>>2]|0;o=m-n>>2;p=n;n=m;if(o>>>0>=k>>>0)if(o>>>0>k>>>0?(m=p+(k<<2)|0,(m|0)!=(n|0)):0){f[l>>2]=n+(~((n+-4-m|0)>>>2)<<2);q=c;r=d}else{q=c;r=d}else{Ci(i,k-o|0);q=b[j>>0]|0;r=f[g>>2]|0}g=r+4|0;j=h[g>>0]|h[g+1>>0]<<8|h[g+2>>0]<<16|h[g+3>>0]<<24;if(q<<24>>24>0){g=f[i>>2]|0;i=q<<24>>24;q=j;o=4;k=0;while(1){f[g+(k<<2)>>2]=q;o=o+4|0;k=k+1|0;d=r+o|0;c=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;if((k|0)>=(i|0)){s=c;break}else q=c}}else s=j;f[a+20>>2]=s;e=1;return e|0}function oh(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;do if(!(fp(a,f[c+8>>2]|0,g)|0)){if(!(fp(a,f[c>>2]|0,g)|0)){h=f[a+8>>2]|0;Za[f[(f[h>>2]|0)+24>>2]&3](h,c,d,e,g);break}if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;i=c+44|0;if((f[i>>2]|0)==4)break;j=c+52|0;b[j>>0]=0;k=c+53|0;b[k>>0]=0;l=f[a+8>>2]|0;_a[f[(f[l>>2]|0)+20>>2]&3](l,c,d,d,1,g);if(b[k>>0]|0)if(!(b[j>>0]|0)){m=3;n=11}else o=3;else{m=4;n=11}if((n|0)==11){f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0){b[c+54>>0]=1;o=m}else o=m}f[i>>2]=o;break}if((e|0)==1)f[c+32>>2]=1}else Vm(0,c,d,e);while(0);return}function ph(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e+12|0;h=e+8|0;i=e;f[i>>2]=f[b>>2];f[g>>2]=f[i>>2];i=Kd(a,g,h,e+4|0,c)|0;c=f[i>>2]|0;if(c|0){j=c;u=e;return j|0}c=ln(40)|0;pj(c+16|0,d);pj(c+28|0,d+12|0);d=f[h>>2]|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=d;f[i>>2]=c;d=f[f[a>>2]>>2]|0;if(!d)k=c;else{f[a>>2]=d;k=f[i>>2]|0}Oe(f[a+4>>2]|0,k);k=a+8|0;f[k>>2]=(f[k>>2]|0)+1;j=c;u=e;return j|0}function qh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=a+4|0;f[h>>2]=0;if(!c){u=e;return}i=a+8|0;j=f[i>>2]|0;k=j<<5;if(k>>>0>>0){f[g>>2]=0;l=g+4|0;f[l>>2]=0;m=g+8|0;f[m>>2]=0;if((c|0)<0)aq(a);n=j<<6;j=c+31&-32;vi(g,k>>>0<1073741823?(n>>>0>>0?j:n):2147483647);n=f[a>>2]|0;f[a>>2]=f[g>>2];f[g>>2]=n;g=f[h>>2]|0;f[h>>2]=c;f[l>>2]=g;g=f[i>>2]|0;f[i>>2]=f[m>>2];f[m>>2]=g;if(n|0)Oq(n);o=a}else{f[h>>2]=c;o=a}a=f[o>>2]|0;o=a;h=a;a=c>>>5;n=a<<2;if(!(b[d>>0]|0)){sj(h|0,0,n|0)|0;d=c&31;g=o+(a<<2)|0;if(!d){u=e;return}f[g>>2]=f[g>>2]&~(-1>>>(32-d|0));u=e;return}else{sj(h|0,-1,n|0)|0;n=c&31;c=o+(a<<2)|0;if(!n){u=e;return}f[c>>2]=f[c>>2]|-1>>>(32-n|0);u=e;return}}function rh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){n=a+88|0;ld(n,b);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;n=a+88|0;ld(n,b);u=c;return 1}function sh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){n=a+108|0;ld(n,b);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;n=a+108|0;ld(n,b);u=c;return 1}function th(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;c=a+32|0;d=f[a+64>>2]|0;e=(Qa[f[(f[d>>2]|0)+40>>2]&127](d)|0)+52|0;d=f[e>>2]|0;zi(c,(((f[d+100>>2]|0)-(f[d+96>>2]|0)|0)/12|0)*3|0,0,1)|0;d=a+68|0;e=f[d>>2]|0;g=(f[a+72>>2]|0)-e|0;if((g|0)<=0){eg(c);return}i=a+48|0;j=a+44|0;a=(g>>>2)+-1|0;g=e;while(1){e=f[g+(a<<2)>>2]|0;k=f[3524+(e<<2)>>2]|0;l=i;m=f[l+4>>2]|0;if((m|0)>0|(m|0)==0&(f[l>>2]|0)>>>0>0?(l=f[j>>2]|0,171>>>e&1|0):0){m=l+4|0;n=0;o=f[m>>2]|0;do{p=o>>>3;q=o&7;r=(f[l>>2]|0)+p|0;b[r>>0]=(1<>0]|0);r=(f[l>>2]|0)+p|0;b[r>>0]=(e>>>n&1)<>0]|0);o=(f[m>>2]|0)+1|0;f[m>>2]=o;n=n+1|0}while((n|0)!=(k|0))}k=a+-1|0;if((k|0)<=-1)break;a=k;g=f[d>>2]|0}eg(c);return}function uh(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=u;u=u+48|0;h=g;i=g+32|0;if(!c){j=0;u=g;return j|0}Gn(h);do if((dm(c,0)|0)!=-1){if(d){if(!(Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0)){k=0;break}Va[f[(f[c>>2]|0)+20>>2]&127](c)}Yg(i,a,c,h);l=(f[i>>2]|0)==0;m=i+4|0;if((b[m+11>>0]|0)<0)Oq(f[m>>2]|0);if(l){l=f[h>>2]|0;m=h+4|0;rg(e,l,l+((f[m>>2]|0)-l)|0);k=(f[m>>2]|0)-(f[h>>2]|0)|0}else k=0}else k=0;while(0);e=h+12|0;i=f[e>>2]|0;f[e>>2]=0;if(i|0)Oq(i);i=f[h>>2]|0;if(i|0){e=h+4|0;if((f[e>>2]|0)!=(i|0))f[e>>2]=i;Oq(i)}j=k;u=g;return j|0}function vh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=u;u=u+16|0;d=c;e=f[(f[a>>2]|0)+8>>2]|0;g=a+8|0;h=a+12|0;i=(f[h>>2]|0)-(f[g>>2]|0)>>2;j=f[b>>2]|0;f[b>>2]=0;f[d>>2]=j;Xa[e&15](a,i,d);i=f[d>>2]|0;f[d>>2]=0;if(!i){k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}d=i+88|0;a=f[d>>2]|0;f[d>>2]=0;if(a|0){d=f[a+8>>2]|0;if(d|0){e=a+12|0;if((f[e>>2]|0)!=(d|0))f[e>>2]=d;Oq(d)}Oq(a)}a=f[i+68>>2]|0;if(a|0){d=i+72|0;e=f[d>>2]|0;if((e|0)!=(a|0))f[d>>2]=e+(~((e+-4-a|0)>>>2)<<2);Oq(a)}a=i+64|0;e=f[a>>2]|0;f[a>>2]=0;if(e|0){a=f[e>>2]|0;if(a|0){d=e+4|0;if((f[d>>2]|0)!=(a|0))f[d>>2]=a;Oq(a)}Oq(e)}Oq(i);k=f[h>>2]|0;l=f[g>>2]|0;m=k-l|0;n=m>>2;o=n+-1|0;u=c;return o|0}function wh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>3>>>0>=b>>>0){h=b;i=g;do{j=i;f[j>>2]=0;f[j+4>>2]=0;i=(f[e>>2]|0)+8|0;f[e>>2]=i;h=h+-1|0}while((h|0)!=0);return}h=f[a>>2]|0;i=g-h>>3;g=i+b|0;if(g>>>0>536870911)aq(a);j=d-h|0;h=j>>2;d=j>>3>>>0<268435455?(h>>>0>>0?g:h):536870911;do if(d)if(d>>>0>536870911){h=ra(8)|0;Oo(h,16035);f[h>>2]=7256;va(h|0,1112,110)}else{k=ln(d<<3)|0;break}else k=0;while(0);h=k+(i<<3)|0;i=k+(d<<3)|0;d=b;b=h;k=h;do{g=b;f[g>>2]=0;f[g+4>>2]=0;b=k+8|0;k=b;d=d+-1|0}while((d|0)!=0);d=f[a>>2]|0;b=(f[e>>2]|0)-d|0;g=h+(0-(b>>3)<<3)|0;if((b|0)>0)kh(g|0,d|0,b|0)|0;f[a>>2]=g;f[e>>2]=k;f[c>>2]=i;if(!d)return;Oq(d);return}function xh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;if(!(bn(a,b,c)|0)){g=0;u=d;return g|0}if((Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0)<<24>>24==1?((f[(f[a+8>>2]|0)+28>>2]|0)+-1|0)>>>0>=6:0){g=0;u=d;return g|0}h=_g(c,f[b+48>>2]|0)|0;Xa[f[(f[a>>2]|0)+48>>2]&15](e,a,h);h=a+36|0;b=f[e>>2]|0;f[e>>2]=0;c=f[h>>2]|0;f[h>>2]=b;if(!c){f[e>>2]=0;i=b}else{Va[f[(f[c>>2]|0)+4>>2]&127](c);c=f[e>>2]|0;f[e>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);i=f[h>>2]|0}if(!i){g=1;u=d;return g|0}if(Ra[f[(f[a>>2]|0)+36>>2]&127](a,i)|0){g=1;u=d;return g|0}i=f[h>>2]|0;f[h>>2]=0;if(!i){g=1;u=d;return g|0}Va[f[(f[i>>2]|0)+4>>2]&127](i);g=1;u=d;return g|0}function yh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e+4|0;h=e;i=e+8|0;j=a&255;b[i>>0]=j&127;do if(c>>>0>0|(c|0)==0&a>>>0>127){b[i>>0]=j|-128;k=d+16|0;l=f[k+4>>2]|0;if((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0){m=0;break}else{f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,i,i+1|0)|0;k=Yn(a|0,c|0,7)|0;m=yh(k,I,d)|0;break}}else{k=d+16|0;l=f[k+4>>2]|0;if((l|0)>0|(l|0)==0&(f[k>>2]|0)>>>0>0){m=0;break}f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,i,i+1|0)|0;n=1;u=e;return n|0}while(0);n=m;u=e;return n|0}function zh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0;g=f[(f[(f[d+4>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;if((b|0)==-1)h=Xi(c,d)|0;else h=b;if((h|0)==-2)i=0;else{do if((Qa[f[(f[d>>2]|0)+8>>2]&127](d)|0)==1){Xf(a,d,h,c,e,514);if(!(f[a>>2]|0)){f[a>>2]=0;break}else return}while(0);c=ln(44)|0;f[c>>2]=1544;f[c+4>>2]=g;g=c+8|0;f[g>>2]=f[e>>2];f[g+4>>2]=f[e+4>>2];f[g+8>>2]=f[e+8>>2];f[g+12>>2]=f[e+12>>2];f[g+16>>2]=f[e+16>>2];f[g+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);f[c>>2]=1600;i=c}f[a>>2]=i;return}function Ah(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=u;u=u+224|0;g=e+120|0;h=e+80|0;i=e;j=e+136|0;k=h;l=k+40|0;do{f[k>>2]=0;k=k+4|0}while((k|0)<(l|0));f[g>>2]=f[d>>2];if((qb(0,c,g,i,h)|0)<0)m=-1;else{if((f[a+76>>2]|0)>-1)n=Tq(a)|0;else n=0;d=f[a>>2]|0;k=d&32;if((b[a+74>>0]|0)<1)f[a>>2]=d&-33;d=a+48|0;if(!(f[d>>2]|0)){l=a+44|0;o=f[l>>2]|0;f[l>>2]=j;p=a+28|0;f[p>>2]=j;q=a+20|0;f[q>>2]=j;f[d>>2]=80;r=a+16|0;f[r>>2]=j+80;j=qb(a,c,g,i,h)|0;if(!o)s=j;else{Sa[f[a+36>>2]&31](a,0,0)|0;t=(f[q>>2]|0)==0?-1:j;f[l>>2]=o;f[d>>2]=0;f[r>>2]=0;f[p>>2]=0;f[q>>2]=0;s=t}}else s=qb(a,c,g,i,h)|0;h=f[a>>2]|0;f[a>>2]=h|k;if(n|0)Sq(a);m=(h&32|0)==0?s:-1}u=e;return m|0}function Bh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e>>2;h=d;if(g>>>0>>0){uf(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b<<2)|0;if((g|0)==(h|0))return;else i=h;do{h=i+-4|0;f[c>>2]=h;b=f[h>>2]|0;f[h>>2]=0;if(b|0){h=b+88|0;e=f[h>>2]|0;f[h>>2]=0;if(e|0){h=f[e+8>>2]|0;if(h|0){a=e+12|0;if((f[a>>2]|0)!=(h|0))f[a>>2]=h;Oq(h)}Oq(e)}e=f[b+68>>2]|0;if(e|0){h=b+72|0;a=f[h>>2]|0;if((a|0)!=(e|0))f[h>>2]=a+(~((a+-4-e|0)>>>2)<<2);Oq(e)}e=b+64|0;a=f[e>>2]|0;f[e>>2]=0;if(a|0){e=f[a>>2]|0;if(e|0){h=a+4|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;Oq(e)}Oq(a)}Oq(b)}i=f[c>>2]|0}while((i|0)!=(g|0));return}function Ch(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;i=h;if(e-h>>2>>>0>=b>>>0){j=b;k=i;while(1){f[k>>2]=f[c>>2];j=j+-1|0;if(!j)break;else k=k+4|0}f[g>>2]=i+(b<<2);return}i=f[a>>2]|0;k=h-i|0;h=k>>2;j=h+b|0;if(j>>>0>1073741823)aq(a);l=e-i|0;e=l>>1;m=l>>2>>>0<536870911?(e>>>0>>0?j:e):1073741823;do if(m)if(m>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}else{e=ln(m<<2)|0;n=e;o=e;break}else{n=0;o=0}while(0);e=n+(h<<2)|0;h=n+(m<<2)|0;m=b;j=e;while(1){f[j>>2]=f[c>>2];m=m+-1|0;if(!m)break;else j=j+4|0}if((k|0)>0)kh(o|0,i|0,k|0)|0;f[a>>2]=n;f[g>>2]=e+(b<<2);f[d>>2]=h;if(!i)return;Oq(i);return}function Dh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=(f[a>>2]|0)+1794895138|0;g=gp(f[a+8>>2]|0,e)|0;h=gp(f[a+12>>2]|0,e)|0;i=gp(f[a+16>>2]|0,e)|0;a:do if((g>>>0>>2>>>0?(j=c-(g<<2)|0,h>>>0>>0&i>>>0>>0):0)?((i|h)&3|0)==0:0){j=h>>>2;k=i>>>2;l=0;m=g;while(1){n=m>>>1;o=l+n|0;p=o<<1;q=p+j|0;r=gp(f[a+(q<<2)>>2]|0,e)|0;s=gp(f[a+(q+1<<2)>>2]|0,e)|0;if(!(s>>>0>>0&r>>>0<(c-s|0)>>>0)){t=0;break a}if(b[a+(s+r)>>0]|0){t=0;break a}r=hl(d,a+s|0)|0;if(!r)break;s=(r|0)<0;if((m|0)==1){t=0;break a}else{l=s?l:o;m=s?n:m-n|0}}m=p+k|0;l=gp(f[a+(m<<2)>>2]|0,e)|0;j=gp(f[a+(m+1<<2)>>2]|0,e)|0;if(j>>>0>>0&l>>>0<(c-j|0)>>>0)t=(b[a+(j+l)>>0]|0)==0?a+j|0:0;else t=0}else t=0;while(0);return t|0}function Eh(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=u;u=u+64|0;i=h;j=f[a>>2]|0;k=a+(f[j+-8>>2]|0)|0;l=f[j+-4>>2]|0;f[i>>2]=e;f[i+4>>2]=a;f[i+8>>2]=c;f[i+12>>2]=g;g=i+16|0;c=i+20|0;a=i+24|0;j=i+28|0;m=i+32|0;n=i+40|0;o=g;p=o+36|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));d[g+36>>1]=0;b[g+38>>0]=0;a:do if(fp(l,e,0)|0){f[i+48>>2]=1;_a[f[(f[l>>2]|0)+20>>2]&3](l,i,k,k,1,0);q=(f[a>>2]|0)==1?k:0}else{Za[f[(f[l>>2]|0)+24>>2]&3](l,i,k,1,0);switch(f[i+36>>2]|0){case 0:{q=(f[n>>2]|0)==1&(f[j>>2]|0)==1&(f[m>>2]|0)==1?f[c>>2]|0:0;break a;break}case 1:break;default:{q=0;break a}}if((f[a>>2]|0)!=1?!((f[n>>2]|0)==0&(f[j>>2]|0)==1&(f[m>>2]|0)==1):0){q=0;break}q=f[g>>2]|0}while(0);u=h;return q|0}function Fh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;h=g;if(d-g>>2>>>0>=b>>>0){i=b;j=h;while(1){f[j>>2]=1;i=i+-1|0;if(!i)break;else j=j+4|0}f[e>>2]=h+(b<<2);return}h=f[a>>2]|0;j=g-h|0;g=j>>2;i=g+b|0;if(i>>>0>1073741823)aq(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0>>0?i:d):1073741823;do if(l)if(l>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{d=ln(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;g=m+(l<<2)|0;l=b;i=d;while(1){f[i>>2]=1;l=l+-1|0;if(!l)break;else i=i+4|0}if((j|0)>0)kh(n|0,h|0,j|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=g;if(!h)return;Oq(h);return}function Gh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(!c){g=0;u=d;return g|0}h=a+84|0;i=f[h>>2]|0;j=a+88|0;k=f[j>>2]|0;if((k|0)!=(i|0))f[j>>2]=k+(~((k+-4-i|0)>>>2)<<2);f[h>>2]=0;f[j>>2]=0;f[a+92>>2]=0;if(i|0)Oq(i);i=a+72|0;j=f[i>>2]|0;h=a+76|0;if((f[h>>2]|0)!=(j|0))f[h>>2]=j;f[i>>2]=0;f[h>>2]=0;f[a+80>>2]=0;if(j|0)Oq(j);j=c+4|0;h=(f[j>>2]|0)-(f[c>>2]|0)>>2;b[e>>0]=0;qh(a,h,e);h=c+24|0;i=c+28|0;k=(f[i>>2]|0)-(f[h>>2]|0)>>2;b[e>>0]=0;qh(a+12|0,k,e);hg(a+28|0,(f[j>>2]|0)-(f[c>>2]|0)>>2,6180);gk(a+52|0,(f[i>>2]|0)-(f[h>>2]|0)>>2);gk(a+40|0,(f[i>>2]|0)-(f[h>>2]|0)>>2);f[a+64>>2]=c;b[a+24>>0]=1;g=1;u=d;return g|0}function Hh(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a+12|0;d=f[a>>2]|0;e=a+8|0;g=f[e>>2]|0;h=(g|0)==-1;if(!(b[c>>0]|0)){do if((!h?(i=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(i|0)!=-1):0)?(j=f[(f[d+12>>2]|0)+(i<<2)>>2]|0,(j|0)!=-1):0)if(!((j>>>0)%3|0)){k=j+2|0;break}else{k=j+-1|0;break}else k=-1;while(0);f[e>>2]=k;return}k=g+1|0;if((!h?(h=((k>>>0)%3|0|0)==0?g+-2|0:k,(h|0)!=-1):0)?(k=f[(f[d+12>>2]|0)+(h<<2)>>2]|0,h=k+1|0,(k|0)!=-1):0){g=((h>>>0)%3|0|0)==0?k+-2|0:h;f[e>>2]=g;if((g|0)!=-1){if((g|0)!=(f[a+4>>2]|0))return;f[e>>2]=-1;return}}else f[e>>2]=-1;g=f[a+4>>2]|0;do if(((g|0)!=-1?(a=(((g>>>0)%3|0|0)==0?2:-1)+g|0,(a|0)!=-1):0)?(h=f[(f[d+12>>2]|0)+(a<<2)>>2]|0,(h|0)!=-1):0)if(!((h>>>0)%3|0)){l=h+2|0;break}else{l=h+-1|0;break}else l=-1;while(0);f[e>>2]=l;b[c>>0]=0;return}function Ih(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Td(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+20>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Td(a,e);return}function Jh(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=f[a+4>>2]|0;if(!d){e=0;return e|0}a=b[c+11>>0]|0;g=a<<24>>24<0;h=g?f[c+4>>2]|0:a&255;a=g?f[c>>2]|0:c;c=d;while(1){d=c+16|0;g=b[d+11>>0]|0;i=g<<24>>24<0;j=i?f[c+20>>2]|0:g&255;g=j>>>0>>0;k=g?j:h;if((k|0)!=0?(l=Vk(a,i?f[d>>2]|0:d,k)|0,(l|0)!=0):0)if((l|0)<0)m=7;else m=8;else if(h>>>0>>0)m=7;else m=8;if((m|0)==7){m=0;n=c}else if((m|0)==8){m=0;l=h>>>0>>0?h:j;if((l|0)!=0?(j=Vk(i?f[d>>2]|0:d,a,l)|0,(j|0)!=0):0){if((j|0)>=0){e=1;m=14;break}}else m=10;if((m|0)==10?(m=0,!g):0){e=1;m=14;break}n=c+4|0}c=f[n>>2]|0;if(!c){e=0;m=14;break}}if((m|0)==14)return e|0;return 0}function Kh(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=u;u=u+16|0;g=e+4|0;h=e;i=f[a+8>>2]|0;j=i+24|0;k=b[j>>0]|0;l=c+4|0;ag(a,(f[l>>2]|0)-(f[c>>2]|0)>>2,k,d);d=f[a+32>>2]|0;a=(f[f[d>>2]>>2]|0)+(f[d+48>>2]|0)|0;d=f[c>>2]|0;c=f[l>>2]|0;if((d|0)==(c|0)){m=1;u=e;return m|0}l=i+84|0;n=i+68|0;o=0;p=d;while(1){d=f[p>>2]|0;if(!(b[l>>0]|0))q=f[(f[n>>2]|0)+(d<<2)>>2]|0;else q=d;f[h>>2]=q;d=b[j>>0]|0;f[g>>2]=f[h>>2];if(!(Qb(i,g,d,a+(o<<2)|0)|0)){m=0;r=7;break}p=p+4|0;if((p|0)==(c|0)){m=1;r=7;break}else o=o+k|0}if((r|0)==7){u=e;return m|0}return 0}function Lh(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;f[a>>2]=1408;b=a+72|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);c=f[a+60>>2]|0;if(c|0){b=a+64|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c)}c=f[a+48>>2]|0;if(c|0)Oq(c);c=a+36|0;d=f[c>>2]|0;if(d|0){b=a+40|0;e=f[b>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-4|0;f[b>>2]=e;i=f[e>>2]|0;f[e>>2]=0;if(i|0)Va[f[(f[i>>2]|0)+4>>2]&127](i);h=f[b>>2]|0}while((h|0)!=(d|0));g=f[c>>2]|0}Oq(g)}f[a>>2]=1232;g=f[a+16>>2]|0;if(g|0){c=a+20|0;d=f[c>>2]|0;if((d|0)!=(g|0))f[c>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g)}g=f[a+4>>2]|0;if(!g)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(g|0))f[d>>2]=a+(~((a+-4-g|0)>>>2)<<2);Oq(g);return}function Mh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f[a>>2]=d;e=a+24|0;g=a+28|0;h=f[g>>2]|0;i=f[e>>2]|0;j=h-i>>2;k=i;i=h;if(j>>>0>=d>>>0){if(j>>>0>d>>>0?(h=k+(d<<2)|0,(h|0)!=(i|0)):0)f[g>>2]=i+(~((i+-4-h|0)>>>2)<<2)}else Ci(e,d-j|0);if(!c)return;j=f[b>>2]|0;if((c|0)>1){d=j;e=j;h=1;while(1){i=f[b+(h<<2)>>2]|0;g=(i|0)<(e|0);k=g?i:e;l=g?d:(i|0)>(d|0)?i:d;h=h+1|0;if((h|0)==(c|0)){m=l;n=k;break}else{d=l;e=k}}}else{m=j;n=j}f[a+4>>2]=n;f[a+8>>2]=m;j=Xn(m|0,((m|0)<0)<<31>>31|0,n|0,((n|0)<0)<<31>>31|0)|0;n=I;if(!(n>>>0<0|(n|0)==0&j>>>0<2147483647))return;n=j+1|0;f[a+12>>2]=n;j=(n|0)/2|0;m=a+16|0;f[m>>2]=j;f[a+20>>2]=0-j;if(n&1|0)return;f[m>>2]=j+-1;return}function Nh(a){a=a|0;Fj(a+992|0);Fj(a+960|0);Fj(a+928|0);Fj(a+896|0);Fj(a+864|0);Fj(a+832|0);Fj(a+800|0);Fj(a+768|0);Fj(a+736|0);Fj(a+704|0);Fj(a+672|0);Fj(a+640|0);Fj(a+608|0);Fj(a+576|0);Fj(a+544|0);Fj(a+512|0);Fj(a+480|0);Fj(a+448|0);Fj(a+416|0);Fj(a+384|0);Fj(a+352|0);Fj(a+320|0);Fj(a+288|0);Fj(a+256|0);Fj(a+224|0);Fj(a+192|0);Fj(a+160|0);Fj(a+128|0);Fj(a+96|0);Fj(a+64|0);Fj(a+32|0);Fj(a);return}function Oh(a){a=a|0;wn(a);wn(a+32|0);wn(a+64|0);wn(a+96|0);wn(a+128|0);wn(a+160|0);wn(a+192|0);wn(a+224|0);wn(a+256|0);wn(a+288|0);wn(a+320|0);wn(a+352|0);wn(a+384|0);wn(a+416|0);wn(a+448|0);wn(a+480|0);wn(a+512|0);wn(a+544|0);wn(a+576|0);wn(a+608|0);wn(a+640|0);wn(a+672|0);wn(a+704|0);wn(a+736|0);wn(a+768|0);wn(a+800|0);wn(a+832|0);wn(a+864|0);wn(a+896|0);wn(a+928|0);wn(a+960|0);wn(a+992|0);return}function Ph(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=u;u=u+16|0;d=c+12|0;e=c+8|0;g=c+4|0;h=c;i=(a|0)==(b|0);if(!i){f[g>>2]=f[b>>2];f[h>>2]=b+4;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Oc(a,e,d)}if(!i){f[g>>2]=f[b+12>>2];f[h>>2]=b+16;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Hc(a+12|0,e,d)}if(i){u=c;return}f[g>>2]=f[b+24>>2];f[h>>2]=b+28;f[e>>2]=f[g>>2];f[d>>2]=f[h>>2];Oc(a+24|0,e,d);u=c;return}function Qh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;a=u;u=u+16|0;e=a;if((c|0)<0|((b|0)==0|(d|0)==0)){g=0;u=a;return g|0}h=f[b+8>>2]|0;if(((f[b+12>>2]|0)-h>>2|0)<=(c|0)){g=0;u=a;return g|0}i=b+4|0;if(!(f[i>>2]|0)){j=ln(52)|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;n[j+16>>2]=$(1.0);k=j+20|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;n[j+36>>2]=$(1.0);f[j+40>>2]=0;f[j+44>>2]=0;f[j+48>>2]=0;f[b+4>>2]=j}j=f[(f[h+(c<<2)>>2]|0)+60>>2]|0;c=ln(44)|0;Ub(c,d);f[c+40>>2]=j;j=f[i>>2]|0;f[e>>2]=c;mk(j,e)|0;j=f[e>>2]|0;f[e>>2]=0;if(!j){g=1;u=a;return g|0}bj(j);Oq(j);g=1;u=a;return g|0}function Rh(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;c=u;u=u+64|0;j=c;k=i?6:5;Il(j);i=f[h+56>>2]|0;h=X(Vl(k)|0,e)|0;Jj(j,i,0,e&255,k,0,h,((h|0)<0)<<31>>31,0,0);h=ln(96)|0;tl(h,j);f[a>>2]=h;Bj(h,d)|0;d=h+84|0;if(!g){b[d>>0]=1;a=f[h+68>>2]|0;j=h+72|0;k=f[j>>2]|0;if((k|0)==(a|0)){u=c;return}f[j>>2]=k+(~((k+-4-a|0)>>>2)<<2);u=c;return}b[d>>0]=0;d=h+68|0;a=h+72|0;h=f[a>>2]|0;k=f[d>>2]|0;j=h-k>>2;e=h;if(j>>>0>>0){Ch(d,g-j|0,1216);u=c;return}if(j>>>0<=g>>>0){u=c;return}j=k+(g<<2)|0;if((j|0)==(e|0)){u=c;return}f[a>>2]=e+(~((e+-4-j|0)>>>2)<<2);u=c;return}function Sh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){rd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;rd(a,e);return}function Th(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){vd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;vd(a,e);return}function Uh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Fd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Fd(a,e);return}function Vh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Pd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Pd(a,e);return}function Wh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){ud(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;ud(a,e);return}function Xh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){zd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;zd(a,e);return}function Yh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Jd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Jd(a,e);return}function Zh(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){sd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;sd(a,e);return}function _h(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){wd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;wd(a,e);return}function $h(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Gd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Gd(a,e);return}function ai(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Qd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Qd(a,e);return}function bi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=u;u=u+16|0;h=g;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;i=ln(16)|0;f[h>>2]=i;f[h+8>>2]=-2147483632;f[h+4>>2]=15;j=i;k=14479;l=j+15|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[i+15>>0]=0;i=Hk(c,h,-1)|0;if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);switch(i|0){case -1:{if((mi(c)|0)==10)m=6;else m=5;break}case 1:{m=5;break}default:m=6}if((m|0)==5){i=ln(60)|0;Lo(i);n=i}else if((m|0)==6){m=ln(56)|0;tp(m);n=m}xo(n,d);Md(a,n,c,e);Va[f[(f[n>>2]|0)+4>>2]&127](n);u=g;return}function ci(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;b[h>>0]=a&127;do if(a>>>0>127){b[h>>0]=a|128;i=c+16|0;j=f[i+4>>2]|0;if((j|0)>0|(j|0)==0&(f[i>>2]|0)>>>0>0){k=0;break}else{f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0;k=ci(a>>>7,c)|0;break}}else{i=c+16|0;j=f[i+4>>2]|0;if((j|0)>0|(j|0)==0&(f[i>>2]|0)>>>0>0){k=0;break}f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0;l=1;u=d;return l|0}while(0);l=k;u=d;return l|0} function vc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+32|0;g=e+16|0;h=e+12|0;i=e+8|0;j=e+4|0;k=e;switch(f[c+28>>2]|0){case 9:{l=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=l;f[g>>2]=f[h>>2];m=hc(a,c,g)|0;break}case 2:{f[i>>2]=l;f[g>>2]=f[i>>2];m=Wb(a,c,g)|0;break}case 3:{f[j>>2]=l;f[g>>2]=f[j>>2];m=uc(a,c,g)|0;break}case 4:{f[k>>2]=l;f[g>>2]=f[k>>2];m=mc(a,c,g)|0;break}default:m=0}n=m;break}case 1:{m=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=m;f[g>>2]=f[h>>2];o=gc(a,c,g)|0;break}case 2:{f[i>>2]=m;f[g>>2]=f[i>>2];o=Xb(a,c,g)|0;break}case 3:{f[j>>2]=m;f[g>>2]=f[j>>2];o=sc(a,c,g)|0;break}case 4:{f[k>>2]=m;f[g>>2]=f[k>>2];o=lc(a,c,g)|0;break}default:o=0}n=o;break}case 11:case 2:{o=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=o;f[g>>2]=f[h>>2];p=gc(a,c,g)|0;break}case 2:{f[i>>2]=o;f[g>>2]=f[i>>2];p=Xb(a,c,g)|0;break}case 3:{f[j>>2]=o;f[g>>2]=f[j>>2];p=sc(a,c,g)|0;break}case 4:{f[k>>2]=o;f[g>>2]=f[k>>2];p=lc(a,c,g)|0;break}default:p=0}n=p;break}case 4:{p=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=p;f[g>>2]=f[h>>2];q=ec(a,c,g)|0;break}case 2:{f[i>>2]=p;f[g>>2]=f[i>>2];q=Vb(a,c,g)|0;break}case 3:{f[j>>2]=p;f[g>>2]=f[j>>2];q=nc(a,c,g)|0;break}case 4:{f[k>>2]=p;f[g>>2]=f[k>>2];q=jc(a,c,g)|0;break}default:q=0}n=q;break}case 3:{q=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=q;f[g>>2]=f[h>>2];r=ec(a,c,g)|0;break}case 2:{f[i>>2]=q;f[g>>2]=f[i>>2];r=Vb(a,c,g)|0;break}case 3:{f[j>>2]=q;f[g>>2]=f[j>>2];r=nc(a,c,g)|0;break}case 4:{f[k>>2]=q;f[g>>2]=f[k>>2];r=jc(a,c,g)|0;break}default:r=0}n=r;break}case 6:{r=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=r;f[g>>2]=f[h>>2];s=hc(a,c,g)|0;break}case 2:{f[i>>2]=r;f[g>>2]=f[i>>2];s=Wb(a,c,g)|0;break}case 3:{f[j>>2]=r;f[g>>2]=f[j>>2];s=uc(a,c,g)|0;break}case 4:{f[k>>2]=r;f[g>>2]=f[k>>2];s=mc(a,c,g)|0;break}default:s=0}n=s;break}case 5:{s=f[d>>2]|0;switch(b[c+24>>0]|0){case 1:{f[h>>2]=s;f[g>>2]=f[h>>2];t=hc(a,c,g)|0;break}case 2:{f[i>>2]=s;f[g>>2]=f[i>>2];t=Wb(a,c,g)|0;break}case 3:{f[j>>2]=s;f[g>>2]=f[j>>2];t=uc(a,c,g)|0;break}case 4:{f[k>>2]=s;f[g>>2]=f[k>>2];t=mc(a,c,g)|0;break}default:t=0}n=t;break}default:{v=-1;u=e;return v|0}}v=(n|0)==0?-1:n;u=e;return v|0}function wc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=u;u=u+32|0;g=e+16|0;h=e+12|0;i=e+29|0;j=e;k=e+28|0;if(!(f[(f[a+8>>2]|0)+80>>2]|0)){l=1;u=e;return l|0}b[i>>0]=-2;m=a+36|0;n=f[m>>2]|0;if(n)if(Ra[f[(f[a>>2]|0)+40>>2]&127](a,n)|0){n=f[m>>2]|0;o=(Qa[f[(f[n>>2]|0)+8>>2]&127](n)|0)&255;b[i>>0]=o;p=5}else q=0;else p=5;if((p|0)==5){o=d+16|0;n=o;r=f[n+4>>2]|0;if(!((r|0)>0|(r|0)==0&(f[n>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,i,i+1|0)|0}i=f[m>>2]|0;if(i|0?(n=(Qa[f[(f[i>>2]|0)+36>>2]&127](i)|0)&255,b[j>>0]=n,n=o,i=f[n+4>>2]|0,!((i|0)>0|(i|0)==0&(f[n>>2]|0)>>>0>0)):0){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,j,j+1|0)|0}n=f[a+32>>2]|0;i=b[n+24>>0]|0;r=X(f[n+80>>2]|0,i)|0;s=(f[f[n>>2]>>2]|0)+(f[n+48>>2]|0)|0;f[j>>2]=0;n=j+4|0;f[n>>2]=0;f[j+8>>2]=0;t=(r|0)==0;do if(!t)if(r>>>0>1073741823)aq(j);else{v=r<<2;w=ln(v)|0;f[j>>2]=w;x=w+(r<<2)|0;f[j+8>>2]=x;sj(w|0,0,v|0)|0;f[n>>2]=x;y=w;break}else y=0;while(0);w=f[m>>2]|0;do if(w){Ta[f[(f[w>>2]|0)+44>>2]&31](w,s,y,r,i,f[c>>2]|0)|0;x=f[m>>2]|0;if(!x){z=s;A=f[j>>2]|0;p=20;break}if(!(Qa[f[(f[x>>2]|0)+32>>2]&127](x)|0)){x=f[j>>2]|0;z=f[m>>2]|0?x:s;A=x;p=20}}else{z=s;A=y;p=20}while(0);if((p|0)==20)xm(z,r,A);A=a+4|0;a=f[A>>2]|0;do if(a){z=f[a+48>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;y=ln(48)|0;f[g>>2]=y;f[g+8>>2]=-2147483600;f[g+4>>2]=34;s=y;w=10697;x=s+34|0;do{b[s>>0]=b[w>>0]|0;s=s+1|0;w=w+1|0}while((s|0)<(x|0));b[y+34>>0]=0;w=Yj(z,g,1)|0;if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if(!w){if(!t){w=f[j>>2]|0;s=0;x=0;do{x=f[w+(s<<2)>>2]|x;s=s+1|0}while((s|0)!=(r|0));if(x)B=((_(x|0)|0)>>>3^3)+1|0;else B=1}else B=1;b[k>>0]=0;s=o;w=f[s>>2]|0;z=f[s+4>>2]|0;if((z|0)>0|(z|0)==0&w>>>0>0){C=z;D=w}else{f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,k,k+1|0)|0;w=o;C=f[w+4>>2]|0;D=f[w>>2]|0}b[k>>0]=B;if(!((C|0)>0|(C|0)==0&D>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,k,k+1|0)|0}if((B|0)==(Vl(5)|0)){w=f[j>>2]|0;z=o;s=f[z+4>>2]|0;if(!((s|0)>0|(s|0)==0&(f[z>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,w,w+(r<<2)|0)|0}p=48;break}if(t)p=48;else{w=d+4|0;z=0;do{s=(f[j>>2]|0)+(z<<2)|0;y=o;v=f[y+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[y>>2]|0)>>>0>0)){f[h>>2]=f[w>>2];f[g>>2]=f[h>>2];Me(d,g,s,s+B|0)|0}z=z+1|0}while(z>>>0>>0);p=48}}else p=27}else p=27;while(0);if((p|0)==27){b[k>>0]=1;r=o;o=f[r+4>>2]|0;if(!((o|0)>0|(o|0)==0&(f[r>>2]|0)>>>0>0)){f[h>>2]=f[d+4>>2];f[g>>2]=f[h>>2];Me(d,g,k,k+1|0)|0}lp(g);k=f[A>>2]|0;if(k|0)Zj(g,10-(mi(f[k+48>>2]|0)|0)|0)|0;k=Mc(f[j>>2]|0,X((f[c+4>>2]|0)-(f[c>>2]|0)>>2,i)|0,i,g,d)|0;Ej(g,f[g+4>>2]|0);if(k)p=48;else E=0}if((p|0)==48){p=f[m>>2]|0;if(!p)E=1;else{Ra[f[(f[p>>2]|0)+40>>2]&127](p,d)|0;E=1}}d=f[j>>2]|0;if(d|0){j=f[n>>2]|0;if((j|0)!=(d|0))f[n>>2]=j+(~((j+-4-d|0)>>>2)<<2);Oq(d)}q=E}l=q;u=e;return l|0}function xc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;b=u;u=u+48|0;c=b+24|0;d=b+12|0;e=b;g=a+32|0;h=a+8|0;i=a+12|0;j=f[i>>2]|0;k=f[h>>2]|0;l=j-k>>2;m=a+36|0;n=f[m>>2]|0;o=f[g>>2]|0;p=n-o>>2;q=o;o=n;n=k;if(l>>>0<=p>>>0)if(l>>>0

>>0?(r=q+(l<<2)|0,(r|0)!=(o|0)):0){f[m>>2]=o+(~((o+-4-r|0)>>>2)<<2);s=n;t=k;v=j}else{s=n;t=k;v=j}else{Ci(g,l-p|0);p=f[h>>2]|0;s=p;t=p;v=f[i>>2]|0}p=v-t|0;l=p>>2;f[c>>2]=0;j=c+4|0;f[j>>2]=0;k=c+8|0;f[k>>2]=0;if(l|0){if((p|0)<0)aq(c);p=((l+-1|0)>>>5)+1|0;n=ln(p<<2)|0;f[c>>2]=n;f[k>>2]=p;f[j>>2]=l;j=l>>>5;sj(n|0,0,j<<2|0)|0;p=l&31;l=n+(j<<2)|0;if(p|0)f[l>>2]=f[l>>2]&~(-1>>>(32-p|0))}p=a+20|0;l=0;j=s;s=t;t=v;while(1){if(l>>>0>2>>>0){w=0;x=0;y=l;z=s;A=j}else{B=25;break}while(1){v=x>>>5;n=1<<(x&31);do if(!(f[(f[c>>2]|0)+(v<<2)>>2]&n)){k=f[A+(x<<2)>>2]|0;if((f[k+8>>2]|0)!=(f[k+4>>2]|0)){r=0;o=1;m=A;q=k;while(1){k=f[(f[q+4>>2]|0)+(r<<2)>>2]|0;C=0;D=m;while(1){E=f[D+(x<<2)>>2]|0;if((C|0)>=(Ra[f[(f[E>>2]|0)+24>>2]&127](E,k)|0)){F=o;break}E=f[(f[h>>2]|0)+(x<<2)>>2]|0;G=Sa[f[(f[E>>2]|0)+28>>2]&31](E,k,C)|0;if((G|0)!=(x|0)?(E=f[(f[p>>2]|0)+(G<<2)>>2]|0,(1<<(E&31)&f[(f[c>>2]|0)+(E>>>5<<2)>>2]|0)==0):0){F=0;break}C=C+1|0;D=f[h>>2]|0}r=r+1|0;m=f[h>>2]|0;q=f[m+(x<<2)>>2]|0;if(r>>>0>=(f[q+8>>2]|0)-(f[q+4>>2]|0)>>2>>>0)break;else o=F}o=m;if(F)H=o;else{I=w;J=y;K=o;break}}else H=z;f[(f[g>>2]|0)+(y<<2)>>2]=x;o=(f[c>>2]|0)+(v<<2)|0;f[o>>2]=f[o>>2]|n;I=1;J=y+1|0;K=H}else{I=w;J=y;K=z}while(0);x=x+1|0;L=f[i>>2]|0;M=L-K>>2;A=K;if(x>>>0>=M>>>0)break;else{w=I;y=J;z=K}}if(J>>>0>>0&(I^1)){N=0;break}else{l=J;j=A;s=K;t=L}}if((B|0)==25){f[d>>2]=0;B=d+4|0;f[B>>2]=0;f[d+8>>2]=0;L=f[a+4>>2]|0;a=(f[L+12>>2]|0)-(f[L+8>>2]|0)|0;L=a>>2;f[e>>2]=0;K=e+4|0;f[K>>2]=0;A=e+8|0;f[A>>2]=0;if(L|0){if((a|0)<0)aq(e);a=((L+-1|0)>>>5)+1|0;J=ln(a<<2)|0;f[e>>2]=J;f[A>>2]=a;f[K>>2]=L;K=L>>>5;sj(J|0,0,K<<2|0)|0;a=L&31;L=J+(K<<2)|0;if(a|0)f[L>>2]=f[L>>2]&~(-1>>>(32-a|0))}a:do if((t|0)==(s|0))O=1;else{a=0;L=j;K=s;J=t;while(1){A=f[(f[g>>2]|0)+(a<<2)>>2]|0;l=f[L+(A<<2)>>2]|0;I=(f[l+8>>2]|0)-(f[l+4>>2]|0)|0;l=I>>2;if((I|0)<8){P=K;Q=J}else{I=f[B>>2]|0;M=f[d>>2]|0;z=I-M>>2;y=M;M=I;if(l>>>0<=z>>>0)if(l>>>0>>0?(I=y+(l<<2)|0,(I|0)!=(M|0)):0){f[B>>2]=M+(~((M+-4-I|0)>>>2)<<2);R=0}else R=0;else{Ci(d,l-z|0);R=0}while(1){if((R|0)<(l|0)){S=0;T=0;U=R}else break;while(1){z=f[(f[h>>2]|0)+(A<<2)>>2]|0;I=f[(f[z+4>>2]|0)+(S<<2)>>2]|0;M=S>>>5;y=1<<(S&31);if(!(f[(f[e>>2]|0)+(M<<2)>>2]&y)){w=0;x=1;H=z;while(1){if((w|0)>=(Ra[f[(f[H>>2]|0)+24>>2]&127](H,I)|0)){V=x;break}z=f[(f[h>>2]|0)+(A<<2)>>2]|0;F=Sa[f[(f[z>>2]|0)+28>>2]&31](z,I,w)|0;z=(f[(f[e>>2]|0)+(F>>>5<<2)>>2]&1<<(F&31)|0)!=0;F=x&z;if(!z){V=F;break}w=w+1|0;x=F;H=f[(f[h>>2]|0)+(A<<2)>>2]|0}if(V){f[(f[d>>2]|0)+(U<<2)>>2]=S;H=(f[e>>2]|0)+(M<<2)|0;f[H>>2]=f[H>>2]|y;W=1;X=U+1|0}else{W=T;X=U}}else{W=T;X=U}S=S+1|0;if((S|0)>=(l|0))break;else{T=W;U=X}}if(W|(X|0)>=(l|0))R=X;else{O=0;break a}}bg(f[(f[h>>2]|0)+(A<<2)>>2]|0,d);P=f[h>>2]|0;Q=f[i>>2]|0}a=a+1|0;if(a>>>0>=Q-P>>2>>>0){O=1;break}else{L=P;K=P;J=Q}}}while(0);Q=f[e>>2]|0;if(Q|0)Oq(Q);Q=f[d>>2]|0;if(Q|0){d=f[B>>2]|0;if((d|0)!=(Q|0))f[B>>2]=d+(~((d+-4-Q|0)>>>2)<<2);Oq(Q)}N=O}O=f[c>>2]|0;if(!O){u=b;return N|0}Oq(O);u=b;return N|0}function yc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!a)return;b=a+-8|0;c=f[4788]|0;d=f[a+-4>>2]|0;a=d&-8;e=b+a|0;do if(!(d&1)){g=f[b>>2]|0;if(!(d&3))return;h=b+(0-g)|0;i=g+a|0;if(h>>>0>>0)return;if((f[4789]|0)==(h|0)){j=e+4|0;k=f[j>>2]|0;if((k&3|0)!=3){l=h;m=i;n=h;break}f[4786]=i;f[j>>2]=k&-2;f[h+4>>2]=i|1;f[h+i>>2]=i;return}k=g>>>3;if(g>>>0<256){g=f[h+8>>2]|0;j=f[h+12>>2]|0;if((j|0)==(g|0)){f[4784]=f[4784]&~(1<>2]=j;f[j+8>>2]=g;l=h;m=i;n=h;break}}g=f[h+24>>2]|0;j=f[h+12>>2]|0;do if((j|0)==(h|0)){k=h+16|0;o=k+4|0;p=f[o>>2]|0;if(!p){q=f[k>>2]|0;if(!q){r=0;break}else{s=q;t=k}}else{s=p;t=o}while(1){o=s+20|0;p=f[o>>2]|0;if(p|0){s=p;t=o;continue}o=s+16|0;p=f[o>>2]|0;if(!p)break;else{s=p;t=o}}f[t>>2]=0;r=s}else{o=f[h+8>>2]|0;f[o+12>>2]=j;f[j+8>>2]=o;r=j}while(0);if(g){j=f[h+28>>2]|0;o=19440+(j<<2)|0;if((f[o>>2]|0)==(h|0)){f[o>>2]=r;if(!r){f[4785]=f[4785]&~(1<>2]|0)!=(h|0)&1)<<2)>>2]=r;if(!r){l=h;m=i;n=h;break}}f[r+24>>2]=g;j=h+16|0;o=f[j>>2]|0;if(o|0){f[r+16>>2]=o;f[o+24>>2]=r}o=f[j+4>>2]|0;if(o){f[r+20>>2]=o;f[o+24>>2]=r;l=h;m=i;n=h}else{l=h;m=i;n=h}}else{l=h;m=i;n=h}}else{l=b;m=a;n=b}while(0);if(n>>>0>=e>>>0)return;b=e+4|0;a=f[b>>2]|0;if(!(a&1))return;if(!(a&2)){if((f[4790]|0)==(e|0)){r=(f[4787]|0)+m|0;f[4787]=r;f[4790]=l;f[l+4>>2]=r|1;if((l|0)!=(f[4789]|0))return;f[4789]=0;f[4786]=0;return}if((f[4789]|0)==(e|0)){r=(f[4786]|0)+m|0;f[4786]=r;f[4789]=n;f[l+4>>2]=r|1;f[n+r>>2]=r;return}r=(a&-8)+m|0;s=a>>>3;do if(a>>>0<256){t=f[e+8>>2]|0;c=f[e+12>>2]|0;if((c|0)==(t|0)){f[4784]=f[4784]&~(1<>2]=c;f[c+8>>2]=t;break}}else{t=f[e+24>>2]|0;c=f[e+12>>2]|0;do if((c|0)==(e|0)){d=e+16|0;o=d+4|0;j=f[o>>2]|0;if(!j){p=f[d>>2]|0;if(!p){u=0;break}else{v=p;w=d}}else{v=j;w=o}while(1){o=v+20|0;j=f[o>>2]|0;if(j|0){v=j;w=o;continue}o=v+16|0;j=f[o>>2]|0;if(!j)break;else{v=j;w=o}}f[w>>2]=0;u=v}else{o=f[e+8>>2]|0;f[o+12>>2]=c;f[c+8>>2]=o;u=c}while(0);if(t|0){c=f[e+28>>2]|0;h=19440+(c<<2)|0;if((f[h>>2]|0)==(e|0)){f[h>>2]=u;if(!u){f[4785]=f[4785]&~(1<>2]|0)!=(e|0)&1)<<2)>>2]=u;if(!u)break}f[u+24>>2]=t;c=e+16|0;h=f[c>>2]|0;if(h|0){f[u+16>>2]=h;f[h+24>>2]=u}h=f[c+4>>2]|0;if(h|0){f[u+20>>2]=h;f[h+24>>2]=u}}}while(0);f[l+4>>2]=r|1;f[n+r>>2]=r;if((l|0)==(f[4789]|0)){f[4786]=r;return}else x=r}else{f[b>>2]=a&-2;f[l+4>>2]=m|1;f[n+m>>2]=m;x=m}m=x>>>3;if(x>>>0<256){n=19176+(m<<1<<2)|0;a=f[4784]|0;b=1<>2]|0;z=b}f[z>>2]=l;f[y+12>>2]=l;f[l+8>>2]=y;f[l+12>>2]=n;return}n=x>>>8;if(n)if(x>>>0>16777215)A=31;else{y=(n+1048320|0)>>>16&8;z=n<>>16&4;b=z<>>16&2;a=14-(n|y|z)+(b<>>15)|0;A=x>>>(a+7|0)&1|a<<1}else A=0;a=19440+(A<<2)|0;f[l+28>>2]=A;f[l+20>>2]=0;f[l+16>>2]=0;z=f[4785]|0;b=1<>>1)|0);n=f[a>>2]|0;while(1){if((f[n+4>>2]&-8|0)==(x|0)){B=73;break}C=n+16+(y>>>31<<2)|0;m=f[C>>2]|0;if(!m){B=72;break}else{y=y<<1;n=m}}if((B|0)==72){f[C>>2]=l;f[l+24>>2]=n;f[l+12>>2]=l;f[l+8>>2]=l;break}else if((B|0)==73){y=n+8|0;t=f[y>>2]|0;f[t+12>>2]=l;f[y>>2]=l;f[l+8>>2]=t;f[l+12>>2]=n;f[l+24>>2]=0;break}}else{f[4785]=z|b;f[a>>2]=l;f[l+24>>2]=a;f[l+12>>2]=l;f[l+8>>2]=l}while(0);l=(f[4792]|0)+-1|0;f[4792]=l;if(!l)D=19592;else return;while(1){l=f[D>>2]|0;if(!l)break;else D=l+8|0}f[4792]=-1;return}function zc(a){a=a|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;c=u;u=u+32|0;e=c+4|0;g=c;h=c+16|0;i=a+52|0;j=f[i>>2]|0;k=(f[j+100>>2]|0)-(f[j+96>>2]|0)|0;j=(k|0)/12|0;l=a+44|0;ci(j,f[l>>2]|0)|0;ci(f[(f[i>>2]|0)+80>>2]|0,f[l>>2]|0)|0;m=f[a+48>>2]|0;n=ln(32)|0;f[e>>2]=n;f[e+8>>2]=-2147483616;f[e+4>>2]=21;o=n;p=15598;q=o+21|0;do{b[o>>0]=b[p>>0]|0;o=o+1|0;p=p+1|0}while((o|0)<(q|0));b[n+21>>0]=0;n=Yj(m,e,0)|0;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);m=f[l>>2]|0;if(n){b[h>>0]=0;n=m+16|0;p=f[n+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[n>>2]|0)>>>0>0)){f[g>>2]=f[m+4>>2];f[e>>2]=f[g>>2];Me(m,e,h,h+1|0)|0}mf(a)|0;u=c;return 1}b[h>>0]=1;a=m+16|0;n=f[a+4>>2]|0;if(!((n|0)>0|(n|0)==0&(f[a>>2]|0)>>>0>0)){f[g>>2]=f[m+4>>2];f[e>>2]=f[g>>2];Me(m,e,h,h+1|0)|0}m=f[i>>2]|0;a=f[m+80>>2]|0;if(a>>>0<256){if(!k){u=c;return 1}n=h+1|0;p=h+1|0;o=h+1|0;q=0;r=m;while(1){s=f[r+96>>2]|0;t=f[l>>2]|0;b[h>>0]=f[s+(q*12|0)>>2];v=t+16|0;w=f[v>>2]|0;x=f[v+4>>2]|0;if((x|0)>0|(x|0)==0&w>>>0>0){y=w;z=t;A=x}else{f[g>>2]=f[t+4>>2];f[e>>2]=f[g>>2];Me(t,e,h,o)|0;t=f[l>>2]|0;x=t+16|0;y=f[x>>2]|0;z=t;A=f[x+4>>2]|0}b[h>>0]=f[s+(q*12|0)+4>>2];if((A|0)>0|(A|0)==0&y>>>0>0){B=A;C=y;D=z}else{f[g>>2]=f[z+4>>2];f[e>>2]=f[g>>2];Me(z,e,h,p)|0;x=f[l>>2]|0;t=x+16|0;B=f[t+4>>2]|0;C=f[t>>2]|0;D=x}b[h>>0]=f[s+(q*12|0)+8>>2];if(!((B|0)>0|(B|0)==0&C>>>0>0)){f[g>>2]=f[D+4>>2];f[e>>2]=f[g>>2];Me(D,e,h,n)|0}s=q+1|0;if(s>>>0>=j>>>0)break;q=s;r=f[i>>2]|0}u=c;return 1}if(a>>>0<65536){if(!k){u=c;return 1}r=h+2|0;q=h+2|0;n=h+2|0;D=0;C=m;while(1){B=f[C+96>>2]|0;p=f[l>>2]|0;d[h>>1]=f[B+(D*12|0)>>2];z=p+16|0;y=f[z>>2]|0;A=f[z+4>>2]|0;if((A|0)>0|(A|0)==0&y>>>0>0){E=A;F=y;G=p}else{f[g>>2]=f[p+4>>2];f[e>>2]=f[g>>2];Me(p,e,h,n)|0;p=f[l>>2]|0;y=p+16|0;E=f[y+4>>2]|0;F=f[y>>2]|0;G=p}d[h>>1]=f[B+(D*12|0)+4>>2];if((E|0)>0|(E|0)==0&F>>>0>0){H=E;I=F;J=G}else{f[g>>2]=f[G+4>>2];f[e>>2]=f[g>>2];Me(G,e,h,q)|0;p=f[l>>2]|0;y=p+16|0;H=f[y+4>>2]|0;I=f[y>>2]|0;J=p}d[h>>1]=f[B+(D*12|0)+8>>2];if(!((H|0)>0|(H|0)==0&I>>>0>0)){f[g>>2]=f[J+4>>2];f[e>>2]=f[g>>2];Me(J,e,h,r)|0}B=D+1|0;if(B>>>0>=j>>>0)break;D=B;C=f[i>>2]|0}u=c;return 1}C=(k|0)!=0;if(a>>>0<2097152){if(C){K=0;L=m}else{u=c;return 1}while(1){a=f[L+96>>2]|0;ci(f[a+(K*12|0)>>2]|0,f[l>>2]|0)|0;ci(f[a+(K*12|0)+4>>2]|0,f[l>>2]|0)|0;ci(f[a+(K*12|0)+8>>2]|0,f[l>>2]|0)|0;a=K+1|0;if(a>>>0>=j>>>0)break;K=a;L=f[i>>2]|0}u=c;return 1}if(!C){u=c;return 1}C=0;L=m;while(1){m=(f[L+96>>2]|0)+(C*12|0)|0;K=f[l>>2]|0;a=K+16|0;k=f[a+4>>2]|0;if(!((k|0)>0|(k|0)==0&(f[a>>2]|0)>>>0>0)){f[g>>2]=f[K+4>>2];f[e>>2]=f[g>>2];Me(K,e,m,m+12|0)|0}m=C+1|0;if(m>>>0>=j>>>0)break;C=m;L=f[i>>2]|0}u=c;return 1}function Ac(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=Oa,w=Oa,x=Oa,y=Oa,z=0,A=0,B=0,C=Oa,D=Oa,E=Oa,F=Oa,G=Oa,H=Oa,I=Oa,K=Oa,M=Oa,N=Oa,O=Oa,P=0,Q=Oa,R=Oa,S=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+28|0;o=f[c>>2]|0;c=o+1|0;if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;c=o+(((o>>>0)%3|0|0)==0?2:-1)|0;if((p|0)==-1)q=-1;else q=f[(f[f[m>>2]>>2]|0)+(p<<2)>>2]|0;if((c|0)==-1){r=-1;s=q}else{r=f[(f[f[m>>2]>>2]|0)+(c<<2)>>2]|0;s=q}}else{r=-1;s=-1}q=f[a+32>>2]|0;c=f[q>>2]|0;m=(f[q+4>>2]|0)-c>>2;if(m>>>0<=s>>>0)aq(q);p=c;c=f[p+(s<<2)>>2]|0;if(m>>>0<=r>>>0)aq(q);q=f[p+(r<<2)>>2]|0;r=(c|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r)t=c;else{if((e|0)>0){t=e+-1|0;break}p=a+52|0;if((f[p>>2]|0)<=0){u=g;return}m=f[a+48>>2]|0;s=0;do{f[m+(s<<2)>>2]=0;s=s+1|0}while((s|0)<(f[p>>2]|0));u=g;return}while(0);r=a+52|0;p=f[r>>2]|0;s=X(p,t)|0;if((p|0)<=0){u=g;return}p=f[a+48>>2]|0;t=0;do{f[p+(t<<2)>>2]=f[d+(t+s<<2)>>2];t=t+1|0}while((t|0)<(f[r>>2]|0));u=g;return}r=a+52|0;t=f[r>>2]|0;s=X(t,c)|0;v=$(f[d+(s<<2)>>2]|0);w=$(f[d+(s+1<<2)>>2]|0);s=X(t,q)|0;x=$(f[d+(s<<2)>>2]|0);y=$(f[d+(s+1<<2)>>2]|0);if(!(x!=v|y!=w)){s=f[a+48>>2]|0;f[s>>2]=~~x;f[s+4>>2]=~~y;u=g;return}s=a+44|0;t=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;p=a+40|0;m=f[p>>2]|0;if(!(b[m+84>>0]|0))z=f[(f[m+68>>2]|0)+(t<<2)>>2]|0;else z=t;f[i>>2]=z;z=b[m+24>>0]|0;f[h>>2]=f[i>>2];mb(m,h,z,j)|0;z=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;c=f[p>>2]|0;if(!(b[c+84>>0]|0))A=f[(f[c+68>>2]|0)+(z<<2)>>2]|0;else A=z;f[i>>2]=A;A=b[c+24>>0]|0;f[h>>2]=f[i>>2];mb(c,h,A,k)|0;A=f[(f[s>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[p>>2]|0;if(!(b[q+84>>0]|0))B=f[(f[q+68>>2]|0)+(A<<2)>>2]|0;else B=A;f[i>>2]=B;B=b[q+24>>0]|0;f[h>>2]=f[i>>2];mb(q,h,B,l)|0;C=$(n[l>>2]);D=$(n[k>>2]);E=$(C-D);C=$(n[l+4>>2]);F=$(n[k+4>>2]);G=$(C-F);C=$(n[l+8>>2]);H=$(n[k+8>>2]);I=$(C-H);C=$($(n[j>>2])-D);D=$($(n[j+4>>2])-F);F=$($(n[j+8>>2])-H);H=$($($($(E*E)+$(0.0))+$(G*G))+$(I*I));if(H>$(0.0)){K=$($($($($(E*C)+$(0.0))+$(G*D))+$(I*F))/H);M=$(C-$(E*K));E=$(D-$(G*K));G=$(F-$(I*K));N=K;O=$(L($($($(G*G)+$($(E*E)+$($(M*M)+$(0.0))))/H)))}else{N=$(0.0);O=$(0.0)}H=$(x-v);x=$(y-w);y=$($(H*N)+v);v=$(H*O);H=$($(x*N)+w);w=$(x*O);O=$(y-w);x=$(H+v);N=$(y+w);w=$(H-v);j=X(f[r>>2]|0,e)|0;v=$(f[d+(j<<2)>>2]|0);H=$(f[d+(j+1<<2)>>2]|0);y=$(v-O);M=$(H-x);E=$(v-N);v=$(H-w);j=$($($(y*y)+$(0.0))+$(M*M))<$($($(E*E)+$(0.0))+$(v*v));d=a+56|0;e=a+60|0;r=f[e>>2]|0;k=f[a+64>>2]|0;l=(r|0)==(k<<5|0);if(j){do if(l)if((r+1|0)<0)aq(d);else{j=k<<6;B=r+32&-32;vi(d,r>>>0<1073741823?(j>>>0>>0?B:j):2147483647);P=f[e>>2]|0;break}else P=r;while(0);f[e>>2]=P+1;j=(f[d>>2]|0)+(P>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(P&31);Q=O;R=x}else{do if(l)if((r+1|0)<0)aq(d);else{P=k<<6;j=r+32&-32;vi(d,r>>>0<1073741823?(P>>>0>>0?j:P):2147483647);S=f[e>>2]|0;break}else S=r;while(0);f[e>>2]=S+1;e=(f[d>>2]|0)+(S>>>5<<2)|0;f[e>>2]=f[e>>2]&~(1<<(S&31));Q=N;R=w}S=~~+J(+(+Q+.5));e=f[a+48>>2]|0;f[e>>2]=S;S=~~+J(+(+R+.5));f[e+4>>2]=S;u=g;return}function Bc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=Oa,v=Oa,w=Oa,x=Oa,y=0,z=0,A=0,B=Oa,C=Oa,D=Oa,E=Oa,F=Oa,G=Oa,H=Oa,I=Oa,K=Oa,M=Oa,N=Oa,O=0,P=Oa,Q=Oa,R=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+28|0;o=f[c>>2]|0;c=o+1|0;do if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;if(!((o>>>0)%3|0)){q=o+2|0;r=p;break}else{q=o+-1|0;r=p;break}}else{q=-1;r=-1}while(0);o=f[(f[m>>2]|0)+28>>2]|0;m=f[o+(r<<2)>>2]|0;r=f[o+(q<<2)>>2]|0;q=f[a+32>>2]|0;o=f[q>>2]|0;c=(f[q+4>>2]|0)-o>>2;if(c>>>0<=m>>>0)aq(q);p=o;o=f[p+(m<<2)>>2]|0;if(c>>>0<=r>>>0)aq(q);q=f[p+(r<<2)>>2]|0;r=(o|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r)s=o;else{if((e|0)>0){s=e+-1|0;break}p=a+52|0;if((f[p>>2]|0)<=0){u=g;return}c=f[a+48>>2]|0;m=0;do{f[c+(m<<2)>>2]=0;m=m+1|0}while((m|0)<(f[p>>2]|0));u=g;return}while(0);r=a+52|0;p=f[r>>2]|0;m=X(p,s)|0;if((p|0)<=0){u=g;return}p=f[a+48>>2]|0;s=0;do{f[p+(s<<2)>>2]=f[d+(s+m<<2)>>2];s=s+1|0}while((s|0)<(f[r>>2]|0));u=g;return}r=a+52|0;s=f[r>>2]|0;m=X(s,o)|0;t=$(f[d+(m<<2)>>2]|0);v=$(f[d+(m+1<<2)>>2]|0);m=X(s,q)|0;w=$(f[d+(m<<2)>>2]|0);x=$(f[d+(m+1<<2)>>2]|0);if(!(w!=t|x!=v)){m=f[a+48>>2]|0;f[m>>2]=~~w;f[m+4>>2]=~~x;u=g;return}m=a+44|0;s=f[(f[m>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;p=a+40|0;c=f[p>>2]|0;if(!(b[c+84>>0]|0))y=f[(f[c+68>>2]|0)+(s<<2)>>2]|0;else y=s;f[i>>2]=y;y=b[c+24>>0]|0;f[h>>2]=f[i>>2];mb(c,h,y,j)|0;y=f[(f[m>>2]|0)+(o<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;o=f[p>>2]|0;if(!(b[o+84>>0]|0))z=f[(f[o+68>>2]|0)+(y<<2)>>2]|0;else z=y;f[i>>2]=z;z=b[o+24>>0]|0;f[h>>2]=f[i>>2];mb(o,h,z,k)|0;z=f[(f[m>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[p>>2]|0;if(!(b[q+84>>0]|0))A=f[(f[q+68>>2]|0)+(z<<2)>>2]|0;else A=z;f[i>>2]=A;A=b[q+24>>0]|0;f[h>>2]=f[i>>2];mb(q,h,A,l)|0;B=$(n[l>>2]);C=$(n[k>>2]);D=$(B-C);B=$(n[l+4>>2]);E=$(n[k+4>>2]);F=$(B-E);B=$(n[l+8>>2]);G=$(n[k+8>>2]);H=$(B-G);B=$($(n[j>>2])-C);C=$($(n[j+4>>2])-E);E=$($(n[j+8>>2])-G);G=$($($($(D*D)+$(0.0))+$(F*F))+$(H*H));if(G>$(0.0)){I=$($($($($(D*B)+$(0.0))+$(F*C))+$(H*E))/G);K=$(B-$(D*I));D=$(C-$(F*I));F=$(E-$(H*I));M=I;N=$(L($($($(F*F)+$($(D*D)+$($(K*K)+$(0.0))))/G)))}else{M=$(0.0);N=$(0.0)}G=$(w-t);w=$(x-v);x=$($(G*M)+t);t=$(G*N);G=$($(w*M)+v);v=$(w*N);N=$(x-v);w=$(G+t);M=$(x+v);v=$(G-t);j=X(f[r>>2]|0,e)|0;t=$(f[d+(j<<2)>>2]|0);G=$(f[d+(j+1<<2)>>2]|0);x=$(t-N);K=$(G-w);D=$(t-M);t=$(G-v);j=$($($(x*x)+$(0.0))+$(K*K))<$($($(D*D)+$(0.0))+$(t*t));d=a+56|0;e=a+60|0;r=f[e>>2]|0;k=f[a+64>>2]|0;l=(r|0)==(k<<5|0);if(j){do if(l)if((r+1|0)<0)aq(d);else{j=k<<6;A=r+32&-32;vi(d,r>>>0<1073741823?(j>>>0>>0?A:j):2147483647);O=f[e>>2]|0;break}else O=r;while(0);f[e>>2]=O+1;j=(f[d>>2]|0)+(O>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(O&31);P=N;Q=w}else{do if(l)if((r+1|0)<0)aq(d);else{O=k<<6;j=r+32&-32;vi(d,r>>>0<1073741823?(O>>>0>>0?j:O):2147483647);R=f[e>>2]|0;break}else R=r;while(0);f[e>>2]=R+1;e=(f[d>>2]|0)+(R>>>5<<2)|0;f[e>>2]=f[e>>2]&~(1<<(R&31));P=M;Q=v}R=~~+J(+(+P+.5));e=f[a+48>>2]|0;f[e>>2]=R;R=~~+J(+(+Q+.5));f[e+4>>2]=R;u=g;return}function Cc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=Oa,w=Oa,x=Oa,y=Oa,z=0,A=0,B=0,C=Oa,D=Oa,E=Oa,F=Oa,G=Oa,H=Oa,I=Oa,K=Oa,M=Oa,N=Oa,O=Oa,P=0,Q=Oa,R=Oa,S=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+48|0;o=f[c>>2]|0;c=o+1|0;if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;c=o+(((o>>>0)%3|0|0)==0?2:-1)|0;if((p|0)==-1)q=-1;else q=f[(f[f[m>>2]>>2]|0)+(p<<2)>>2]|0;if((c|0)==-1){r=-1;s=q}else{r=f[(f[f[m>>2]>>2]|0)+(c<<2)>>2]|0;s=q}}else{r=-1;s=-1}q=f[a+52>>2]|0;c=f[q>>2]|0;m=(f[q+4>>2]|0)-c>>2;if(m>>>0<=s>>>0)aq(q);p=c;c=f[p+(s<<2)>>2]|0;if(m>>>0<=r>>>0)aq(q);q=f[p+(r<<2)>>2]|0;r=(c|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r)t=c;else{if((e|0)>0){t=e+-1|0;break}p=a+72|0;if((f[p>>2]|0)<=0){u=g;return}m=f[a+68>>2]|0;s=0;do{f[m+(s<<2)>>2]=0;s=s+1|0}while((s|0)<(f[p>>2]|0));u=g;return}while(0);r=a+72|0;p=f[r>>2]|0;s=X(p,t)|0;if((p|0)<=0){u=g;return}p=f[a+68>>2]|0;t=0;do{f[p+(t<<2)>>2]=f[d+(t+s<<2)>>2];t=t+1|0}while((t|0)<(f[r>>2]|0));u=g;return}r=a+72|0;t=f[r>>2]|0;s=X(t,c)|0;v=$(f[d+(s<<2)>>2]|0);w=$(f[d+(s+1<<2)>>2]|0);s=X(t,q)|0;x=$(f[d+(s<<2)>>2]|0);y=$(f[d+(s+1<<2)>>2]|0);if(!(x!=v|y!=w)){s=f[a+68>>2]|0;f[s>>2]=~~x;f[s+4>>2]=~~y;u=g;return}s=a+64|0;t=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;p=a+60|0;m=f[p>>2]|0;if(!(b[m+84>>0]|0))z=f[(f[m+68>>2]|0)+(t<<2)>>2]|0;else z=t;f[i>>2]=z;z=b[m+24>>0]|0;f[h>>2]=f[i>>2];mb(m,h,z,j)|0;z=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;c=f[p>>2]|0;if(!(b[c+84>>0]|0))A=f[(f[c+68>>2]|0)+(z<<2)>>2]|0;else A=z;f[i>>2]=A;A=b[c+24>>0]|0;f[h>>2]=f[i>>2];mb(c,h,A,k)|0;A=f[(f[s>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[p>>2]|0;if(!(b[q+84>>0]|0))B=f[(f[q+68>>2]|0)+(A<<2)>>2]|0;else B=A;f[i>>2]=B;B=b[q+24>>0]|0;f[h>>2]=f[i>>2];mb(q,h,B,l)|0;C=$(n[l>>2]);D=$(n[k>>2]);E=$(C-D);C=$(n[l+4>>2]);F=$(n[k+4>>2]);G=$(C-F);C=$(n[l+8>>2]);H=$(n[k+8>>2]);I=$(C-H);C=$($(n[j>>2])-D);D=$($(n[j+4>>2])-F);F=$($(n[j+8>>2])-H);H=$($($($(E*E)+$(0.0))+$(G*G))+$(I*I));if(H>$(0.0)){K=$($($($($(E*C)+$(0.0))+$(G*D))+$(I*F))/H);M=$(C-$(E*K));E=$(D-$(G*K));G=$(F-$(I*K));N=K;O=$(L($($($(G*G)+$($(E*E)+$($(M*M)+$(0.0))))/H)))}else{N=$(0.0);O=$(0.0)}H=$(x-v);x=$(y-w);y=$($(H*N)+v);v=$(H*O);H=$($(x*N)+w);w=$(x*O);O=$(y-w);x=$(H+v);N=$(y+w);w=$(H-v);j=X(f[r>>2]|0,e)|0;v=$(f[d+(j<<2)>>2]|0);H=$(f[d+(j+1<<2)>>2]|0);y=$(v-O);M=$(H-x);E=$(v-N);v=$(H-w);j=$($($(y*y)+$(0.0))+$(M*M))<$($($(E*E)+$(0.0))+$(v*v));d=a+76|0;e=a+80|0;r=f[e>>2]|0;k=f[a+84>>2]|0;l=(r|0)==(k<<5|0);if(j){do if(l)if((r+1|0)<0)aq(d);else{j=k<<6;B=r+32&-32;vi(d,r>>>0<1073741823?(j>>>0>>0?B:j):2147483647);P=f[e>>2]|0;break}else P=r;while(0);f[e>>2]=P+1;j=(f[d>>2]|0)+(P>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(P&31);Q=O;R=x}else{do if(l)if((r+1|0)<0)aq(d);else{P=k<<6;j=r+32&-32;vi(d,r>>>0<1073741823?(P>>>0>>0?j:P):2147483647);S=f[e>>2]|0;break}else S=r;while(0);f[e>>2]=S+1;e=(f[d>>2]|0)+(S>>>5<<2)|0;f[e>>2]=f[e>>2]&~(1<<(S&31));Q=N;R=w}S=~~+J(+(+Q+.5));e=f[a+68>>2]|0;f[e>>2]=S;S=~~+J(+(+R+.5));f[e+4>>2]=S;u=g;return}function Dc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=Oa,v=Oa,w=Oa,x=Oa,y=0,z=0,A=0,B=Oa,C=Oa,D=Oa,E=Oa,F=Oa,G=Oa,H=Oa,I=Oa,K=Oa,M=Oa,N=Oa,O=0,P=Oa,Q=Oa,R=0;g=u;u=u+48|0;h=g+40|0;i=g+36|0;j=g+24|0;k=g+12|0;l=g;m=a+48|0;o=f[c>>2]|0;c=o+1|0;do if((o|0)!=-1){p=((c>>>0)%3|0|0)==0?o+-2|0:c;if(!((o>>>0)%3|0)){q=o+2|0;r=p;break}else{q=o+-1|0;r=p;break}}else{q=-1;r=-1}while(0);o=f[(f[m>>2]|0)+28>>2]|0;m=f[o+(r<<2)>>2]|0;r=f[o+(q<<2)>>2]|0;q=f[a+52>>2]|0;o=f[q>>2]|0;c=(f[q+4>>2]|0)-o>>2;if(c>>>0<=m>>>0)aq(q);p=o;o=f[p+(m<<2)>>2]|0;if(c>>>0<=r>>>0)aq(q);q=f[p+(r<<2)>>2]|0;r=(o|0)<(e|0);if(!(r&(q|0)<(e|0))){do if(r)s=o;else{if((e|0)>0){s=e+-1|0;break}p=a+72|0;if((f[p>>2]|0)<=0){u=g;return}c=f[a+68>>2]|0;m=0;do{f[c+(m<<2)>>2]=0;m=m+1|0}while((m|0)<(f[p>>2]|0));u=g;return}while(0);r=a+72|0;p=f[r>>2]|0;m=X(p,s)|0;if((p|0)<=0){u=g;return}p=f[a+68>>2]|0;s=0;do{f[p+(s<<2)>>2]=f[d+(s+m<<2)>>2];s=s+1|0}while((s|0)<(f[r>>2]|0));u=g;return}r=a+72|0;s=f[r>>2]|0;m=X(s,o)|0;t=$(f[d+(m<<2)>>2]|0);v=$(f[d+(m+1<<2)>>2]|0);m=X(s,q)|0;w=$(f[d+(m<<2)>>2]|0);x=$(f[d+(m+1<<2)>>2]|0);if(!(w!=t|x!=v)){m=f[a+68>>2]|0;f[m>>2]=~~w;f[m+4>>2]=~~x;u=g;return}m=a+64|0;s=f[(f[m>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;p=a+60|0;c=f[p>>2]|0;if(!(b[c+84>>0]|0))y=f[(f[c+68>>2]|0)+(s<<2)>>2]|0;else y=s;f[i>>2]=y;y=b[c+24>>0]|0;f[h>>2]=f[i>>2];mb(c,h,y,j)|0;y=f[(f[m>>2]|0)+(o<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;o=f[p>>2]|0;if(!(b[o+84>>0]|0))z=f[(f[o+68>>2]|0)+(y<<2)>>2]|0;else z=y;f[i>>2]=z;z=b[o+24>>0]|0;f[h>>2]=f[i>>2];mb(o,h,z,k)|0;z=f[(f[m>>2]|0)+(q<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;q=f[p>>2]|0;if(!(b[q+84>>0]|0))A=f[(f[q+68>>2]|0)+(z<<2)>>2]|0;else A=z;f[i>>2]=A;A=b[q+24>>0]|0;f[h>>2]=f[i>>2];mb(q,h,A,l)|0;B=$(n[l>>2]);C=$(n[k>>2]);D=$(B-C);B=$(n[l+4>>2]);E=$(n[k+4>>2]);F=$(B-E);B=$(n[l+8>>2]);G=$(n[k+8>>2]);H=$(B-G);B=$($(n[j>>2])-C);C=$($(n[j+4>>2])-E);E=$($(n[j+8>>2])-G);G=$($($($(D*D)+$(0.0))+$(F*F))+$(H*H));if(G>$(0.0)){I=$($($($($(D*B)+$(0.0))+$(F*C))+$(H*E))/G);K=$(B-$(D*I));D=$(C-$(F*I));F=$(E-$(H*I));M=I;N=$(L($($($(F*F)+$($(D*D)+$($(K*K)+$(0.0))))/G)))}else{M=$(0.0);N=$(0.0)}G=$(w-t);w=$(x-v);x=$($(G*M)+t);t=$(G*N);G=$($(w*M)+v);v=$(w*N);N=$(x-v);w=$(G+t);M=$(x+v);v=$(G-t);j=X(f[r>>2]|0,e)|0;t=$(f[d+(j<<2)>>2]|0);G=$(f[d+(j+1<<2)>>2]|0);x=$(t-N);K=$(G-w);D=$(t-M);t=$(G-v);j=$($($(x*x)+$(0.0))+$(K*K))<$($($(D*D)+$(0.0))+$(t*t));d=a+76|0;e=a+80|0;r=f[e>>2]|0;k=f[a+84>>2]|0;l=(r|0)==(k<<5|0);if(j){do if(l)if((r+1|0)<0)aq(d);else{j=k<<6;A=r+32&-32;vi(d,r>>>0<1073741823?(j>>>0>>0?A:j):2147483647);O=f[e>>2]|0;break}else O=r;while(0);f[e>>2]=O+1;j=(f[d>>2]|0)+(O>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(O&31);P=N;Q=w}else{do if(l)if((r+1|0)<0)aq(d);else{O=k<<6;j=r+32&-32;vi(d,r>>>0<1073741823?(O>>>0>>0?j:O):2147483647);R=f[e>>2]|0;break}else R=r;while(0);f[e>>2]=R+1;e=(f[d>>2]|0)+(R>>>5<<2)|0;f[e>>2]=f[e>>2]&~(1<<(R&31));P=M;Q=v}R=~~+J(+(+P+.5));e=f[a+68>>2]|0;f[e>>2]=R;R=~~+J(+(+Q+.5));f[e+4>>2]=R;u=g;return}function Ec(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=Oa,F=Oa,G=Oa,H=0,I=0,J=0,K=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;e=i;j=i;while(1){k=X(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;e=(X(k>>>24^k,1540483477)|0)^(X(e,1540483477)|0);j=j+-4|0;if(j>>>0<=3)break;else d=d+4|0}d=i+-4|0;j=d&-4;l=d-j|0;m=g+(j+4)|0;o=e}else{l=i;m=g;o=i}switch(l|0){case 3:{p=h[m+2>>0]<<16^o;q=6;break}case 2:{p=o;q=6;break}case 1:{r=o;q=7;break}default:s=o}if((q|0)==6){r=h[m+1>>0]<<8^p;q=7}if((q|0)==7)s=X(r^h[m>>0],1540483477)|0;m=X(s>>>13^s,1540483477)|0;s=m>>>15^m;m=a+4|0;r=f[m>>2]|0;p=(r|0)==0;a:do if(!p){o=r+-1|0;l=(o&r|0)==0;if(!l)if(s>>>0>>0)t=s;else t=(s>>>0)%(r>>>0)|0;else t=s&o;e=f[(f[a>>2]|0)+(t<<2)>>2]|0;if((e|0)!=0?(j=f[e>>2]|0,(j|0)!=0):0){e=(i|0)==0;if(l){if(e){l=j;while(1){d=f[l+4>>2]|0;if(!((d|0)==(s|0)|(d&o|0)==(t|0))){u=t;break a}d=b[l+8+11>>0]|0;if(!((d<<24>>24<0?f[l+12>>2]|0:d&255)|0)){v=l;break}l=f[l>>2]|0;if(!l){u=t;break a}}w=v+20|0;return w|0}else x=j;b:while(1){l=f[x+4>>2]|0;if(!((l|0)==(s|0)|(l&o|0)==(t|0))){u=t;break a}l=x+8|0;d=b[l+11>>0]|0;k=d<<24>>24<0;y=d&255;do if(((k?f[x+12>>2]|0:y)|0)==(i|0)){d=f[l>>2]|0;if(k)if(!(Vk(d,g,i)|0)){v=x;q=63;break b}else break;if((b[g>>0]|0)==(d&255)<<24>>24){d=l;z=y;A=g;do{z=z+-1|0;d=d+1|0;if(!z){v=x;q=63;break b}A=A+1|0}while((b[d>>0]|0)==(b[A>>0]|0))}}while(0);x=f[x>>2]|0;if(!x){u=t;break a}}if((q|0)==63){w=v+20|0;return w|0}}if(e){o=j;while(1){y=f[o+4>>2]|0;if((y|0)!=(s|0)){if(y>>>0>>0)B=y;else B=(y>>>0)%(r>>>0)|0;if((B|0)!=(t|0)){u=t;break a}}y=b[o+8+11>>0]|0;if(!((y<<24>>24<0?f[o+12>>2]|0:y&255)|0)){v=o;break}o=f[o>>2]|0;if(!o){u=t;break a}}w=v+20|0;return w|0}else C=j;c:while(1){o=f[C+4>>2]|0;if((o|0)!=(s|0)){if(o>>>0>>0)D=o;else D=(o>>>0)%(r>>>0)|0;if((D|0)!=(t|0)){u=t;break a}}o=C+8|0;e=b[o+11>>0]|0;y=e<<24>>24<0;l=e&255;do if(((y?f[C+12>>2]|0:l)|0)==(i|0)){e=f[o>>2]|0;if(y)if(!(Vk(e,g,i)|0)){v=C;q=63;break c}else break;if((b[g>>0]|0)==(e&255)<<24>>24){e=o;k=l;A=g;do{k=k+-1|0;e=e+1|0;if(!k){v=C;q=63;break c}A=A+1|0}while((b[e>>0]|0)==(b[A>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){u=t;break a}}if((q|0)==63){w=v+20|0;return w|0}}else u=t}else u=0;while(0);t=ln(24)|0;pj(t+8|0,c);f[t+20>>2]=0;f[t+4>>2]=s;f[t>>2]=0;c=a+12|0;E=$(((f[c>>2]|0)+1|0)>>>0);F=$(r>>>0);G=$(n[a+16>>2]);do if(p|$(G*F)>>0<3|(r+-1&r|0)!=0)&1;g=~~$(W($(E/G)))>>>0;ei(a,C>>>0>>0?g:C);C=f[m>>2]|0;g=C+-1|0;if(!(g&C)){H=C;I=g&s;break}if(s>>>0>>0){H=C;I=s}else{H=C;I=(s>>>0)%(C>>>0)|0}}else{H=r;I=u}while(0);u=(f[a>>2]|0)+(I<<2)|0;I=f[u>>2]|0;if(!I){r=a+8|0;f[t>>2]=f[r>>2];f[r>>2]=t;f[u>>2]=r;r=f[t>>2]|0;if(r|0){u=f[r+4>>2]|0;r=H+-1|0;if(r&H)if(u>>>0>>0)J=u;else J=(u>>>0)%(H>>>0)|0;else J=u&r;K=(f[a>>2]|0)+(J<<2)|0;q=61}}else{f[t>>2]=f[I>>2];K=I;q=61}if((q|0)==61)f[K>>2]=t;f[c>>2]=(f[c>>2]|0)+1;v=t;w=v+20|0;return w|0}function Fc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0.0,R=0.0,S=0,T=0.0,U=0,V=0,W=0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0.0,da=0,ea=0.0;g=a+4|0;i=f[g>>2]|0;j=a+100|0;if(i>>>0<(f[j>>2]|0)>>>0){f[g>>2]=i+1;k=h[i>>0]|0;l=0}else{k=Si(a)|0;l=0}a:while(1){switch(k|0){case 46:{m=8;break a;break}case 48:break;default:{n=0;o=0;p=1.0;q=0.0;r=0;s=k;t=l;u=0;v=0;w=0;x=0;break a}}i=f[g>>2]|0;if(i>>>0<(f[j>>2]|0)>>>0){f[g>>2]=i+1;k=h[i>>0]|0;l=1;continue}else{k=Si(a)|0;l=1;continue}}if((m|0)==8){k=f[g>>2]|0;if(k>>>0<(f[j>>2]|0)>>>0){f[g>>2]=k+1;y=h[k>>0]|0}else y=Si(a)|0;if((y|0)==48){k=0;i=0;while(1){z=f[g>>2]|0;if(z>>>0<(f[j>>2]|0)>>>0){f[g>>2]=z+1;A=h[z>>0]|0}else A=Si(a)|0;z=Vn(k|0,i|0,-1,-1)|0;B=I;if((A|0)==48){k=z;i=B}else{n=1;o=0;p=1.0;q=0.0;r=0;s=A;t=1;u=0;v=0;w=z;x=B;break}}}else{n=1;o=0;p=1.0;q=0.0;r=0;s=y;t=l;u=0;v=0;w=0;x=0}}while(1){l=s+-48|0;y=s|32;if(l>>>0>=10){A=(s|0)==46;if(!(A|(y+-97|0)>>>0<6)){C=s;break}if(A)if(!n){D=1;E=o;F=p;G=q;H=r;J=t;K=v;L=u;M=v;N=u}else{C=46;break}else m=20}else m=20;if((m|0)==20){m=0;A=(s|0)>57?y+-87|0:l;do if(!((u|0)<0|(u|0)==0&v>>>0<8))if((u|0)<0|(u|0)==0&v>>>0<14){O=p*.0625;P=o;Q=O;R=q+O*+(A|0);S=r;break}else{l=(o|0)!=0|(A|0)==0;P=l?o:1;Q=p;R=l?q:q+p*.5;S=r;break}else{P=o;Q=p;R=q;S=A+(r<<4)|0}while(0);A=Vn(v|0,u|0,1,0)|0;D=n;E=P;F=Q;G=R;H=S;J=1;K=w;L=x;M=A;N=I}A=f[g>>2]|0;if(A>>>0<(f[j>>2]|0)>>>0){f[g>>2]=A+1;n=D;o=E;p=F;q=G;r=H;s=h[A>>0]|0;t=J;u=N;v=M;w=K;x=L;continue}else{n=D;o=E;p=F;q=G;r=H;s=Si(a)|0;t=J;u=N;v=M;w=K;x=L;continue}}do if(!t){L=(f[j>>2]|0)==0;if(!L)f[g>>2]=(f[g>>2]|0)+-1;if(e){if(!L)f[g>>2]=(f[g>>2]|0)+-1;if(!((n|0)==0|L))f[g>>2]=(f[g>>2]|0)+-1}else Ym(a,0);T=+(d|0)*0.0}else{L=(n|0)==0;K=L?v:w;M=L?u:x;if((u|0)<0|(u|0)==0&v>>>0<8){L=r;N=v;J=u;while(1){s=L<<4;H=N;N=Vn(N|0,J|0,1,0)|0;if(!((J|0)<0|(J|0)==0&H>>>0<7)){U=s;break}else{L=s;J=I}}}else U=r;if((C|32|0)==112){J=Re(a,e)|0;L=I;if((J|0)==0&(L|0)==-2147483648){if(!e){Ym(a,0);T=0.0;break}if(!(f[j>>2]|0)){V=0;W=0}else{f[g>>2]=(f[g>>2]|0)+-1;V=0;W=0}}else{V=J;W=L}}else if(!(f[j>>2]|0)){V=0;W=0}else{f[g>>2]=(f[g>>2]|0)+-1;V=0;W=0}L=Tn(K|0,M|0,2)|0;J=Vn(L|0,I|0,-32,-1)|0;L=Vn(J|0,I|0,V|0,W|0)|0;J=I;if(!U){T=+(d|0)*0.0;break}N=0-c|0;s=((N|0)<0)<<31>>31;if((J|0)>(s|0)|(J|0)==(s|0)&L>>>0>N>>>0){N=Vq()|0;f[N>>2]=34;T=+(d|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}N=c+-106|0;s=((N|0)<0)<<31>>31;if((J|0)<(s|0)|(J|0)==(s|0)&L>>>0>>0){N=Vq()|0;f[N>>2]=34;T=+(d|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if((U|0)>-1){G=q;N=U;s=L;H=J;while(1){E=!(G>=.5);o=N<<1|(E^1)&1;F=G+(E?G:G+-1.0);E=Vn(s|0,H|0,-1,-1)|0;D=I;if((o|0)>-1){G=F;N=o;s=E;H=D}else{X=F;Y=o;Z=E;_=D;break}}}else{X=q;Y=U;Z=L;_=J}H=((b|0)<0)<<31>>31;s=Xn(32,0,c|0,((c|0)<0)<<31>>31|0)|0;N=Vn(s|0,I|0,Z|0,_|0)|0;s=I;if((s|0)<(H|0)|(s|0)==(H|0)&N>>>0>>0)if((N|0)>0){$=N;m=59}else{aa=0;ba=84;m=61}else{$=b;m=59}if((m|0)==59)if(($|0)<53){aa=$;ba=84-$|0;m=61}else{ca=0.0;da=$;ea=+(d|0)}if((m|0)==61){G=+(d|0);ca=+rq(+bk(1.0,ba),G);da=aa;ea=G}N=(Y&1|0)==0&(X!=0.0&(da|0)<32);G=(N?0.0:X)*ea+(ca+ea*+((Y+(N&1)|0)>>>0))-ca;if(!(G!=0.0)){N=Vq()|0;f[N>>2]=34}T=+sq(G,Z)}while(0);return +T}function Gc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=u;u=u+16|0;h=g+4|0;i=g;if(!(Gh(a,d)|0)){j=0;u=g;return j|0}d=a+84|0;k=f[d>>2]|0;l=a+88|0;m=f[l>>2]|0;if((m|0)!=(k|0))f[l>>2]=m+(~((m+-4-k|0)>>>2)<<2);f[d>>2]=0;f[l>>2]=0;f[a+92>>2]=0;if(k|0)Oq(k);k=a+72|0;l=f[k>>2]|0;d=a+76|0;if((f[d>>2]|0)!=(l|0))f[d>>2]=l;f[k>>2]=0;f[d>>2]=0;f[a+80>>2]=0;if(l|0)Oq(l);l=a+64|0;d=f[l>>2]|0;if((f[d+4>>2]|0)!=(f[d>>2]|0)){k=a+12|0;m=e+84|0;n=e+68|0;o=c+96|0;p=a+24|0;q=0;r=d;do{f[i>>2]=(q>>>0)/3|0;f[h>>2]=f[i>>2];d=_j(r,h)|0;r=f[l>>2]|0;do if(!d){s=f[(f[r+12>>2]|0)+(q<<2)>>2]|0;if((s|0)==-1){t=(f[a>>2]|0)+(q>>>5<<2)|0;f[t>>2]=f[t>>2]|1<<(q&31);t=q+1|0;v=((t>>>0)%3|0|0)==0?q+-2|0:t;if((v|0)==-1)w=-1;else w=f[(f[r>>2]|0)+(v<<2)>>2]|0;v=(f[k>>2]|0)+(w>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(w&31);v=(((q>>>0)%3|0|0)==0?2:-1)+q|0;if((v|0)==-1)x=-1;else x=f[(f[r>>2]|0)+(v<<2)>>2]|0;v=(f[k>>2]|0)+(x>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(x&31);break}if(s>>>0>=q>>>0){v=q+1|0;t=((v>>>0)%3|0|0)==0?q+-2|0:v;y=s+(((s>>>0)%3|0|0)==0?2:-1)|0;z=(t|0)==-1;if(!(b[m>>0]|0)){if(z)A=-1;else A=f[(f[o>>2]|0)+(((t|0)/3|0)*12|0)+(((t|0)%3|0)<<2)>>2]|0;B=(y|0)==-1;if(B)C=-1;else C=f[(f[o>>2]|0)+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;D=f[n>>2]|0;if((f[D+(A<<2)>>2]|0)==(f[D+(C<<2)>>2]|0)){E=t+1|0;if(z)F=-1;else F=((E>>>0)%3|0|0)==0?t+-2|0:E;do if(!B)if(!((y>>>0)%3|0)){G=y+2|0;break}else{G=y+-1|0;break}else G=-1;while(0);if((F|0)==-1)H=-1;else H=f[(f[o>>2]|0)+(((F|0)/3|0)*12|0)+(((F|0)%3|0)<<2)>>2]|0;if((G|0)==-1)I=-1;else I=f[(f[o>>2]|0)+(((G|0)/3|0)*12|0)+(((G|0)%3|0)<<2)>>2]|0;if((f[D+(H<<2)>>2]|0)==(f[D+(I<<2)>>2]|0))break}}else{if(z)J=-1;else J=f[(f[o>>2]|0)+(((t|0)/3|0)*12|0)+(((t|0)%3|0)<<2)>>2]|0;B=(y|0)==-1;if(B)K=-1;else K=f[(f[o>>2]|0)+(((y|0)/3|0)*12|0)+(((y|0)%3|0)<<2)>>2]|0;if((J|0)==(K|0)){E=t+1|0;if(z)L=-1;else L=((E>>>0)%3|0|0)==0?t+-2|0:E;do if(!B)if(!((y>>>0)%3|0)){M=y+2|0;break}else{M=y+-1|0;break}else M=-1;while(0);if((L|0)==-1)N=-1;else N=f[(f[o>>2]|0)+(((L|0)/3|0)*12|0)+(((L|0)%3|0)<<2)>>2]|0;if((M|0)==-1)O=-1;else O=f[(f[o>>2]|0)+(((M|0)/3|0)*12|0)+(((M|0)%3|0)<<2)>>2]|0;if((N|0)==(O|0))break}}b[p>>0]=0;y=f[a>>2]|0;B=y+(q>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(q&31);B=y+(s>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(s&31);B=((v>>>0)%3|0|0)==0?q+-2|0:v;if((B|0)==-1)P=-1;else P=f[(f[r>>2]|0)+(B<<2)>>2]|0;B=(f[k>>2]|0)+(P>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(P&31);B=(((q>>>0)%3|0|0)==0?2:-1)+q|0;if((B|0)==-1)Q=-1;else Q=f[(f[r>>2]|0)+(B<<2)>>2]|0;B=(f[k>>2]|0)+(Q>>>5<<2)|0;f[B>>2]=f[B>>2]|1<<(Q&31);B=s+1|0;y=((B>>>0)%3|0|0)==0?s+-2|0:B;if((y|0)==-1)R=-1;else R=f[(f[r>>2]|0)+(y<<2)>>2]|0;y=(f[k>>2]|0)+(R>>>5<<2)|0;f[y>>2]=f[y>>2]|1<<(R&31);y=(((s>>>0)%3|0|0)==0?2:-1)+s|0;if((y|0)==-1)S=-1;else S=f[(f[r>>2]|0)+(y<<2)>>2]|0;y=(f[k>>2]|0)+(S>>>5<<2)|0;f[y>>2]=f[y>>2]|1<<(S&31)}}while(0);q=q+1|0}while(q>>>0<(f[r+4>>2]|0)-(f[r>>2]|0)>>2>>>0)}if((c|0)!=0&(e|0)!=0){Qc(a,c,e);j=1;u=g;return j|0}else{md(a,0,0);j=1;u=g;return j|0}return 0}function Hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;d=u;u=u+32|0;e=d+12|0;g=d+8|0;h=d+4|0;i=d;j=a+8|0;a:do if(f[j>>2]|0?(k=f[a>>2]|0,l=a+4|0,f[a>>2]=l,f[(f[l>>2]|0)+8>>2]=0,f[l>>2]=0,f[j>>2]=0,m=f[k+4>>2]|0,n=(m|0)==0?k:m,n|0):0){m=a+4|0;k=n;n=f[b>>2]|0;while(1){if((n|0)==(f[c>>2]|0))break;o=k+16|0;f[o>>2]=f[n+16>>2];if((k|0)!=(n|0)){f[h>>2]=f[n+20>>2];f[i>>2]=n+24;f[g>>2]=f[h>>2];f[e>>2]=f[i>>2];Oc(k+20|0,g,e)}p=k+8|0;q=f[p>>2]|0;do if(q){r=f[q>>2]|0;if((r|0)==(k|0)){f[q>>2]=0;s=f[q+4>>2]|0;if(!s){t=q;break}else v=s;while(1){s=f[v>>2]|0;if(s|0){v=s;continue}s=f[v+4>>2]|0;if(!s)break;else v=s}t=v;break}else{f[q+4>>2]=0;if(!r){t=q;break}else w=r;while(1){s=f[w>>2]|0;if(s|0){w=s;continue}s=f[w+4>>2]|0;if(!s)break;else w=s}t=w;break}}else t=0;while(0);q=f[l>>2]|0;do if(q){r=f[o>>2]|0;s=q;while(1){if((r|0)<(f[s+16>>2]|0)){x=f[s>>2]|0;if(!x){y=22;break}else z=x}else{A=s+4|0;x=f[A>>2]|0;if(!x){y=25;break}else z=x}s=z}if((y|0)==22){y=0;B=s;C=s;break}else if((y|0)==25){y=0;B=s;C=A;break}}else{B=l;C=l}while(0);f[k>>2]=0;f[k+4>>2]=0;f[p>>2]=B;f[C>>2]=k;q=f[f[a>>2]>>2]|0;if(!q)D=k;else{f[a>>2]=q;D=f[C>>2]|0}Oe(f[m>>2]|0,D);f[j>>2]=(f[j>>2]|0)+1;q=f[n+4>>2]|0;if(!q){o=n+8|0;r=f[o>>2]|0;if((f[r>>2]|0)==(n|0))E=r;else{r=o;do{o=f[r>>2]|0;r=o+8|0;x=f[r>>2]|0}while((f[x>>2]|0)!=(o|0));E=x}}else{r=q;while(1){p=f[r>>2]|0;if(!p)break;else r=p}E=r}f[b>>2]=E;if(!t)break a;else{k=t;n=E}}n=f[k+8>>2]|0;if(!n)F=k;else{m=n;while(1){n=f[m+8>>2]|0;if(!n)break;else m=n}F=m}Oj(a,F)}while(0);F=f[b>>2]|0;E=f[c>>2]|0;if((F|0)==(E|0)){u=d;return}c=a+4|0;t=a+4|0;D=F;while(1){Kg(e,a,D+16|0);F=f[c>>2]|0;do if(F){C=f[e>>2]|0;B=f[C+16>>2]|0;A=F;while(1){if((B|0)<(f[A+16>>2]|0)){z=f[A>>2]|0;if(!z){y=43;break}else G=z}else{H=A+4|0;z=f[H>>2]|0;if(!z){y=46;break}else G=z}A=G}if((y|0)==43){y=0;I=A;J=A;K=C;break}else if((y|0)==46){y=0;I=A;J=H;K=C;break}}else{I=c;J=c;K=f[e>>2]|0}while(0);f[K>>2]=0;f[K+4>>2]=0;f[K+8>>2]=I;f[J>>2]=K;F=f[f[a>>2]>>2]|0;if(!F)L=K;else{f[a>>2]=F;L=f[J>>2]|0}Oe(f[t>>2]|0,L);f[j>>2]=(f[j>>2]|0)+1;F=f[D+4>>2]|0;if(!F){m=D+8|0;B=f[m>>2]|0;if((f[B>>2]|0)==(D|0))M=B;else{B=m;do{m=f[B>>2]|0;B=m+8|0;r=f[B>>2]|0}while((f[r>>2]|0)!=(m|0));M=r}}else{B=F;while(1){r=f[B>>2]|0;if(!r)break;else B=r}M=B}f[b>>2]=M;if((M|0)==(E|0))break;else D=M}u=d;return}function Ic(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=f[a+28>>2]|0;k=f[a+32>>2]|0;l=e>>>0>1073741823?-1:e<<2;m=Lq(l)|0;sj(m|0,0,l|0)|0;n=Lq(l)|0;sj(n|0,0,l|0)|0;l=a+36|0;o=f[l>>2]|0;p=f[o+4>>2]|0;q=f[o>>2]|0;r=p-q|0;a:do if((r|0)>4){s=r>>2;t=(e|0)>0;v=a+8|0;w=h+4|0;x=i+4|0;y=d+4|0;z=m+4|0;A=h+4|0;B=i+4|0;C=d+4|0;D=j+12|0;E=e<<2;F=s+-1|0;if(p-q>>2>>>0>F>>>0){G=s;H=F;I=q}else{J=o;aq(J)}while(1){F=f[I+(H<<2)>>2]|0;if(t)sj(m|0,0,E|0)|0;if((F|0)!=-1){s=f[D>>2]|0;K=0;L=F;while(1){M=f[s+(L<<2)>>2]|0;if((M|0)!=-1){N=f[j>>2]|0;O=f[k>>2]|0;P=f[O+(f[N+(M<<2)>>2]<<2)>>2]|0;Q=M+1|0;R=((Q>>>0)%3|0|0)==0?M+-2|0:Q;if((R|0)==-1)S=-1;else S=f[N+(R<<2)>>2]|0;R=f[O+(S<<2)>>2]|0;Q=(((M>>>0)%3|0|0)==0?2:-1)+M|0;if((Q|0)==-1)T=-1;else T=f[N+(Q<<2)>>2]|0;Q=f[O+(T<<2)>>2]|0;if((P|0)<(H|0)&(R|0)<(H|0)&(Q|0)<(H|0)){O=X(P,e)|0;P=X(R,e)|0;R=X(Q,e)|0;if(t){Q=0;do{f[n+(Q<<2)>>2]=(f[b+(Q+R<<2)>>2]|0)+(f[b+(Q+P<<2)>>2]|0)-(f[b+(Q+O<<2)>>2]|0);Q=Q+1|0}while((Q|0)!=(e|0));if(t){Q=0;do{O=m+(Q<<2)|0;f[O>>2]=(f[O>>2]|0)+(f[n+(Q<<2)>>2]|0);Q=Q+1|0}while((Q|0)!=(e|0))}}U=K+1|0}else U=K}else U=K;Q=(((L>>>0)%3|0|0)==0?2:-1)+L|0;do if((Q|0)!=-1?(O=f[s+(Q<<2)>>2]|0,(O|0)!=-1):0)if(!((O>>>0)%3|0)){V=O+2|0;break}else{V=O+-1|0;break}else V=-1;while(0);L=(V|0)==(F|0)?-1:V;if((L|0)==-1)break;else K=U}K=X(H,e)|0;if(!U){W=K;Y=30}else{if(t){L=0;do{F=m+(L<<2)|0;f[F>>2]=(f[F>>2]|0)/(U|0)|0;L=L+1|0}while((L|0)!=(e|0))}L=b+(K<<2)|0;F=c+(K<<2)|0;s=f[L+4>>2]|0;Q=f[m>>2]|0;O=f[z>>2]|0;f[h>>2]=f[L>>2];f[A>>2]=s;f[i>>2]=Q;f[B>>2]=O;Od(d,v,h,i);f[F>>2]=f[d>>2];f[F+4>>2]=f[C>>2]}}else{W=X(H,e)|0;Y=30}if((Y|0)==30){Y=0;F=b+(W<<2)|0;O=b+((X(G+-2|0,e)|0)<<2)|0;Q=c+(W<<2)|0;s=f[F+4>>2]|0;L=f[O>>2]|0;P=f[O+4>>2]|0;f[h>>2]=f[F>>2];f[w>>2]=s;f[i>>2]=L;f[x>>2]=P;Od(d,v,h,i);f[Q>>2]=f[d>>2];f[Q+4>>2]=f[y>>2]}if((G|0)<=2)break a;Q=f[l>>2]|0;I=f[Q>>2]|0;P=H+-1|0;if((f[Q+4>>2]|0)-I>>2>>>0<=P>>>0){J=Q;break}else{Q=H;H=P;G=Q}}aq(J)}while(0);if((e|0)<=0){Z=a+8|0;_=b+4|0;$=f[b>>2]|0;aa=f[_>>2]|0;ba=m+4|0;ca=f[m>>2]|0;da=f[ba>>2]|0;f[h>>2]=$;ea=h+4|0;f[ea>>2]=aa;f[i>>2]=ca;fa=i+4|0;f[fa>>2]=da;Od(d,Z,h,i);ga=f[d>>2]|0;f[c>>2]=ga;ha=d+4|0;ia=f[ha>>2]|0;ja=c+4|0;f[ja>>2]=ia;Mq(n);Mq(m);u=g;return 1}sj(m|0,0,e<<2|0)|0;Z=a+8|0;_=b+4|0;$=f[b>>2]|0;aa=f[_>>2]|0;ba=m+4|0;ca=f[m>>2]|0;da=f[ba>>2]|0;f[h>>2]=$;ea=h+4|0;f[ea>>2]=aa;f[i>>2]=ca;fa=i+4|0;f[fa>>2]=da;Od(d,Z,h,i);ga=f[d>>2]|0;f[c>>2]=ga;ha=d+4|0;ia=f[ha>>2]|0;ja=c+4|0;f[ja>>2]=ia;Mq(n);Mq(m);u=g;return 1}function Jc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;g=a+8|0;Mh(g,b,d,e);d=e>>>0>1073741823?-1:e<<2;h=Lq(d)|0;sj(h|0,0,d|0)|0;d=f[a+48>>2]|0;i=f[a+56>>2]|0;j=f[i>>2]|0;k=(f[i+4>>2]|0)-j|0;l=k>>2;a:do if((k|0)>4){m=f[a+52>>2]|0;n=a+16|0;o=a+32|0;p=a+12|0;q=a+28|0;r=a+20|0;s=a+24|0;t=d+12|0;u=(e|0)>0;v=j;w=l;while(1){x=w;w=w+-1|0;if(l>>>0<=w>>>0)break;y=f[v+(w<<2)>>2]|0;z=X(w,e)|0;if((y|0)!=-1?(A=f[(f[t>>2]|0)+(y<<2)>>2]|0,(A|0)!=-1):0){y=f[d>>2]|0;B=f[m>>2]|0;C=f[B+(f[y+(A<<2)>>2]<<2)>>2]|0;D=A+1|0;E=((D>>>0)%3|0|0)==0?A+-2|0:D;if((E|0)==-1)F=-1;else F=f[y+(E<<2)>>2]|0;E=f[B+(F<<2)>>2]|0;D=(((A>>>0)%3|0|0)==0?2:-1)+A|0;if((D|0)==-1)G=-1;else G=f[y+(D<<2)>>2]|0;D=f[B+(G<<2)>>2]|0;if((C|0)<(w|0)&(E|0)<(w|0)&(D|0)<(w|0)){B=X(C,e)|0;C=X(E,e)|0;E=X(D,e)|0;if(u){D=0;do{f[h+(D<<2)>>2]=(f[b+(D+E<<2)>>2]|0)+(f[b+(D+C<<2)>>2]|0)-(f[b+(D+B<<2)>>2]|0);D=D+1|0}while((D|0)!=(e|0))}D=b+(z<<2)|0;B=c+(z<<2)|0;C=f[g>>2]|0;if((C|0)>0){E=0;y=h;A=C;while(1){if((A|0)>0){C=0;do{H=f[y+(C<<2)>>2]|0;I=f[n>>2]|0;if((H|0)>(I|0)){J=f[o>>2]|0;f[J+(C<<2)>>2]=I;K=J}else{J=f[p>>2]|0;I=f[o>>2]|0;f[I+(C<<2)>>2]=(H|0)<(J|0)?J:H;K=I}C=C+1|0}while((C|0)<(f[g>>2]|0));L=K}else L=f[o>>2]|0;C=(f[D+(E<<2)>>2]|0)-(f[L+(E<<2)>>2]|0)|0;I=B+(E<<2)|0;f[I>>2]=C;if((C|0)>=(f[q>>2]|0)){if((C|0)>(f[s>>2]|0)){M=C-(f[r>>2]|0)|0;N=42}}else{M=(f[r>>2]|0)+C|0;N=42}if((N|0)==42){N=0;f[I>>2]=M}E=E+1|0;A=f[g>>2]|0;if((E|0)>=(A|0))break;else y=L}}}else N=16}else N=16;if((N|0)==16?(N=0,y=b+(z<<2)|0,A=c+(z<<2)|0,E=f[g>>2]|0,(E|0)>0):0){B=0;D=b+((X(x+-2|0,e)|0)<<2)|0;I=E;while(1){if((I|0)>0){E=0;do{C=f[D+(E<<2)>>2]|0;H=f[n>>2]|0;if((C|0)>(H|0)){J=f[o>>2]|0;f[J+(E<<2)>>2]=H;O=J}else{J=f[p>>2]|0;H=f[o>>2]|0;f[H+(E<<2)>>2]=(C|0)<(J|0)?J:C;O=H}E=E+1|0}while((E|0)<(f[g>>2]|0));P=O}else P=f[o>>2]|0;E=(f[y+(B<<2)>>2]|0)-(f[P+(B<<2)>>2]|0)|0;H=A+(B<<2)|0;f[H>>2]=E;if((E|0)>=(f[q>>2]|0)){if((E|0)>(f[s>>2]|0)){Q=E-(f[r>>2]|0)|0;N=29}}else{Q=(f[r>>2]|0)+E|0;N=29}if((N|0)==29){N=0;f[H>>2]=Q}B=B+1|0;I=f[g>>2]|0;if((B|0)>=(I|0))break;else D=P}}if((x|0)<=2)break a}aq(i)}while(0);if((e|0)>0)sj(h|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){Mq(h);return 1}i=a+16|0;P=a+32|0;Q=a+12|0;O=a+28|0;L=a+20|0;M=a+24|0;a=0;K=h;G=e;while(1){if((G|0)>0){e=0;do{F=f[K+(e<<2)>>2]|0;d=f[i>>2]|0;if((F|0)>(d|0)){l=f[P>>2]|0;f[l+(e<<2)>>2]=d;R=l}else{l=f[Q>>2]|0;d=f[P>>2]|0;f[d+(e<<2)>>2]=(F|0)<(l|0)?l:F;R=d}e=e+1|0}while((e|0)<(f[g>>2]|0));S=R}else S=f[P>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[S+(a<<2)>>2]|0)|0;d=c+(a<<2)|0;f[d>>2]=e;if((e|0)>=(f[O>>2]|0)){if((e|0)>(f[M>>2]|0)){T=e-(f[L>>2]|0)|0;N=56}}else{T=(f[L>>2]|0)+e|0;N=56}if((N|0)==56){N=0;f[d>>2]=T}a=a+1|0;G=f[g>>2]|0;if((a|0)>=(G|0))break;else K=S}Mq(h);return 1}function Kc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=f[a+28>>2]|0;k=f[a+32>>2]|0;l=e>>>0>1073741823?-1:e<<2;m=Lq(l)|0;sj(m|0,0,l|0)|0;n=Lq(l)|0;sj(n|0,0,l|0)|0;l=a+36|0;o=f[l>>2]|0;p=f[o+4>>2]|0;q=f[o>>2]|0;r=p-q|0;a:do if((r|0)>4){s=r>>2;t=(e|0)>0;v=a+8|0;w=h+4|0;x=i+4|0;y=d+4|0;z=m+4|0;A=h+4|0;B=i+4|0;C=d+4|0;D=j+64|0;E=j+28|0;F=e<<2;G=s+-1|0;if(p-q>>2>>>0>G>>>0){H=s;I=G;J=q}else{K=o;aq(K)}while(1){G=f[J+(I<<2)>>2]|0;if(t)sj(m|0,0,F|0)|0;if((G|0)!=-1){s=f[j>>2]|0;L=0;M=G;while(1){if(((f[s+(M>>>5<<2)>>2]&1<<(M&31)|0)==0?(N=f[(f[(f[D>>2]|0)+12>>2]|0)+(M<<2)>>2]|0,(N|0)!=-1):0)?(O=f[E>>2]|0,P=f[k>>2]|0,Q=f[P+(f[O+(N<<2)>>2]<<2)>>2]|0,R=N+1|0,S=f[P+(f[O+((((R>>>0)%3|0|0)==0?N+-2|0:R)<<2)>>2]<<2)>>2]|0,R=f[P+(f[O+((((N>>>0)%3|0|0)==0?2:-1)+N<<2)>>2]<<2)>>2]|0,(Q|0)<(I|0)&(S|0)<(I|0)&(R|0)<(I|0)):0){N=X(Q,e)|0;Q=X(S,e)|0;S=X(R,e)|0;if(t){R=0;do{f[n+(R<<2)>>2]=(f[b+(R+S<<2)>>2]|0)+(f[b+(R+Q<<2)>>2]|0)-(f[b+(R+N<<2)>>2]|0);R=R+1|0}while((R|0)!=(e|0));if(t){R=0;do{N=m+(R<<2)|0;f[N>>2]=(f[N>>2]|0)+(f[n+(R<<2)>>2]|0);R=R+1|0}while((R|0)!=(e|0))}}T=L+1|0}else T=L;R=(((M>>>0)%3|0|0)==0?2:-1)+M|0;do if(((R|0)!=-1?(f[s+(R>>>5<<2)>>2]&1<<(R&31)|0)==0:0)?(N=f[(f[(f[D>>2]|0)+12>>2]|0)+(R<<2)>>2]|0,(N|0)!=-1):0)if(!((N>>>0)%3|0)){U=N+2|0;break}else{U=N+-1|0;break}else U=-1;while(0);M=(U|0)==(G|0)?-1:U;if((M|0)==-1)break;else L=T}L=X(I,e)|0;if(!T){V=L;W=28}else{if(t){M=0;do{G=m+(M<<2)|0;f[G>>2]=(f[G>>2]|0)/(T|0)|0;M=M+1|0}while((M|0)!=(e|0))}M=b+(L<<2)|0;G=c+(L<<2)|0;s=f[M+4>>2]|0;R=f[m>>2]|0;N=f[z>>2]|0;f[h>>2]=f[M>>2];f[A>>2]=s;f[i>>2]=R;f[B>>2]=N;Od(d,v,h,i);f[G>>2]=f[d>>2];f[G+4>>2]=f[C>>2]}}else{V=X(I,e)|0;W=28}if((W|0)==28){W=0;G=b+(V<<2)|0;N=b+((X(H+-2|0,e)|0)<<2)|0;R=c+(V<<2)|0;s=f[G+4>>2]|0;M=f[N>>2]|0;Q=f[N+4>>2]|0;f[h>>2]=f[G>>2];f[w>>2]=s;f[i>>2]=M;f[x>>2]=Q;Od(d,v,h,i);f[R>>2]=f[d>>2];f[R+4>>2]=f[y>>2]}if((H|0)<=2)break a;R=f[l>>2]|0;J=f[R>>2]|0;Q=I+-1|0;if((f[R+4>>2]|0)-J>>2>>>0<=Q>>>0){K=R;break}else{R=I;I=Q;H=R}}aq(K)}while(0);if((e|0)<=0){Y=a+8|0;Z=b+4|0;_=f[b>>2]|0;$=f[Z>>2]|0;aa=m+4|0;ba=f[m>>2]|0;ca=f[aa>>2]|0;f[h>>2]=_;da=h+4|0;f[da>>2]=$;f[i>>2]=ba;ea=i+4|0;f[ea>>2]=ca;Od(d,Y,h,i);fa=f[d>>2]|0;f[c>>2]=fa;ga=d+4|0;ha=f[ga>>2]|0;ia=c+4|0;f[ia>>2]=ha;Mq(n);Mq(m);u=g;return 1}sj(m|0,0,e<<2|0)|0;Y=a+8|0;Z=b+4|0;_=f[b>>2]|0;$=f[Z>>2]|0;aa=m+4|0;ba=f[m>>2]|0;ca=f[aa>>2]|0;f[h>>2]=_;da=h+4|0;f[da>>2]=$;f[i>>2]=ba;ea=i+4|0;f[ea>>2]=ca;Od(d,Y,h,i);fa=f[d>>2]|0;f[c>>2]=fa;ga=d+4|0;ha=f[ga>>2]|0;ia=c+4|0;f[ia>>2]=ha;Mq(n);Mq(m);u=g;return 1}function Lc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=a+8|0;Mh(g,b,d,e);d=e>>>0>1073741823?-1:e<<2;h=Lq(d)|0;sj(h|0,0,d|0)|0;d=f[a+48>>2]|0;i=f[a+56>>2]|0;j=f[i>>2]|0;k=(f[i+4>>2]|0)-j|0;l=k>>2;a:do if((k|0)>4){m=f[a+52>>2]|0;n=a+16|0;o=a+32|0;p=a+12|0;q=a+28|0;r=a+20|0;s=a+24|0;t=d+64|0;u=d+28|0;v=(e|0)>0;w=j;x=l;while(1){y=x;x=x+-1|0;if(l>>>0<=x>>>0)break;z=f[w+(x<<2)>>2]|0;A=X(x,e)|0;if((((z|0)!=-1?(f[(f[d>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(B=f[(f[(f[t>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,(B|0)!=-1):0)?(z=f[u>>2]|0,C=f[m>>2]|0,D=f[C+(f[z+(B<<2)>>2]<<2)>>2]|0,E=B+1|0,F=f[C+(f[z+((((E>>>0)%3|0|0)==0?B+-2|0:E)<<2)>>2]<<2)>>2]|0,E=f[C+(f[z+((((B>>>0)%3|0|0)==0?2:-1)+B<<2)>>2]<<2)>>2]|0,(D|0)<(x|0)&(F|0)<(x|0)&(E|0)<(x|0)):0){B=X(D,e)|0;D=X(F,e)|0;F=X(E,e)|0;if(v){E=0;do{f[h+(E<<2)>>2]=(f[b+(E+F<<2)>>2]|0)+(f[b+(E+D<<2)>>2]|0)-(f[b+(E+B<<2)>>2]|0);E=E+1|0}while((E|0)!=(e|0))}E=b+(A<<2)|0;B=c+(A<<2)|0;D=f[g>>2]|0;if((D|0)>0){F=0;z=h;C=D;while(1){if((C|0)>0){D=0;do{G=f[z+(D<<2)>>2]|0;H=f[n>>2]|0;if((G|0)>(H|0)){I=f[o>>2]|0;f[I+(D<<2)>>2]=H;J=I}else{I=f[p>>2]|0;H=f[o>>2]|0;f[H+(D<<2)>>2]=(G|0)<(I|0)?I:G;J=H}D=D+1|0}while((D|0)<(f[g>>2]|0));K=J}else K=f[o>>2]|0;D=(f[E+(F<<2)>>2]|0)-(f[K+(F<<2)>>2]|0)|0;H=B+(F<<2)|0;f[H>>2]=D;if((D|0)>=(f[q>>2]|0)){if((D|0)>(f[s>>2]|0)){L=D-(f[r>>2]|0)|0;M=39}}else{L=(f[r>>2]|0)+D|0;M=39}if((M|0)==39){M=0;f[H>>2]=L}F=F+1|0;C=f[g>>2]|0;if((F|0)>=(C|0))break;else z=K}}}else M=13;if((M|0)==13?(M=0,z=b+(A<<2)|0,C=c+(A<<2)|0,F=f[g>>2]|0,(F|0)>0):0){B=0;E=b+((X(y+-2|0,e)|0)<<2)|0;H=F;while(1){if((H|0)>0){F=0;do{D=f[E+(F<<2)>>2]|0;G=f[n>>2]|0;if((D|0)>(G|0)){I=f[o>>2]|0;f[I+(F<<2)>>2]=G;N=I}else{I=f[p>>2]|0;G=f[o>>2]|0;f[G+(F<<2)>>2]=(D|0)<(I|0)?I:D;N=G}F=F+1|0}while((F|0)<(f[g>>2]|0));O=N}else O=f[o>>2]|0;F=(f[z+(B<<2)>>2]|0)-(f[O+(B<<2)>>2]|0)|0;G=C+(B<<2)|0;f[G>>2]=F;if((F|0)>=(f[q>>2]|0)){if((F|0)>(f[s>>2]|0)){P=F-(f[r>>2]|0)|0;M=26}}else{P=(f[r>>2]|0)+F|0;M=26}if((M|0)==26){M=0;f[G>>2]=P}B=B+1|0;H=f[g>>2]|0;if((B|0)>=(H|0))break;else E=O}}if((y|0)<=2)break a}aq(i)}while(0);if((e|0)>0)sj(h|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){Mq(h);return 1}i=a+16|0;O=a+32|0;P=a+12|0;N=a+28|0;K=a+20|0;L=a+24|0;a=0;J=h;d=e;while(1){if((d|0)>0){e=0;do{l=f[J+(e<<2)>>2]|0;j=f[i>>2]|0;if((l|0)>(j|0)){k=f[O>>2]|0;f[k+(e<<2)>>2]=j;Q=k}else{k=f[P>>2]|0;j=f[O>>2]|0;f[j+(e<<2)>>2]=(l|0)<(k|0)?k:l;Q=j}e=e+1|0}while((e|0)<(f[g>>2]|0));R=Q}else R=f[O>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[R+(a<<2)>>2]|0)|0;j=c+(a<<2)|0;f[j>>2]=e;if((e|0)>=(f[N>>2]|0)){if((e|0)>(f[L>>2]|0)){S=e-(f[K>>2]|0)|0;M=53}}else{S=(f[K>>2]|0)+e|0;M=53}if((M|0)==53){M=0;f[j>>2]=S}a=a+1|0;d=f[g>>2]|0;if((a|0)>=(d|0))break;else J=R}Mq(h);return 1}function Mc(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0;h=u;u=u+48|0;i=h+28|0;j=h+24|0;k=h;l=h+12|0;m=h+40|0;if((c|0)<0){n=0;u=h;return n|0}if(!c){n=1;u=h;return n|0}o=(d|0)>1;p=o?d:1;f[k>>2]=0;d=k+4|0;f[d>>2]=0;f[k+8>>2]=0;gk(k,c);q=k+8|0;if(o){o=0;r=0;while(1){s=1;t=f[a+(r<<2)>>2]|0;do{v=f[a+(s+r<<2)>>2]|0;t=t>>>0>>0?v:t;s=s+1|0}while((s|0)!=(p|0));s=(_(t|0)|0)^31;v=t>>>0>o>>>0?t:o;w=(t|0)==0?1:s+1|0;f[i>>2]=w;s=f[d>>2]|0;if(s>>>0<(f[q>>2]|0)>>>0){f[s>>2]=w;f[d>>2]=s+4}else Ri(k,i);r=r+p|0;if((r|0)>=(c|0)){x=v;break}else o=v}}else{o=0;r=0;while(1){v=f[a+(o<<2)>>2]|0;s=(_(v|0)|0)^31;w=v>>>0>r>>>0?v:r;y=(v|0)==0?1:s+1|0;f[i>>2]=y;s=f[d>>2]|0;if(s>>>0<(f[q>>2]|0)>>>0){f[s>>2]=y;f[d>>2]=s+4}else Ri(k,i);o=o+p|0;if((o|0)>=(c|0)){x=w;break}else r=w}}f[l>>2]=0;r=l+4|0;f[r>>2]=0;f[l+8>>2]=0;o=f[k>>2]|0;q=(f[d>>2]|0)-o|0;w=q>>2;if(w){if(w>>>0>1073741823)aq(l);s=ln(q)|0;f[r>>2]=s;f[l>>2]=s;f[l+8>>2]=s+(w<<2);w=s;if((q|0)>0){y=s+(q>>>2<<2)|0;kh(s|0,o|0,q|0)|0;f[r>>2]=y;q=y-w>>2;if((y|0)==(s|0)){z=q;A=s;B=0;C=0}else{y=0;o=0;v=0;while(1){D=Vn(o|0,v|0,f[s+(y<<2)>>2]|0,0)|0;E=I;y=y+1|0;if(y>>>0>=q>>>0){z=q;A=s;B=D;C=E;break}else{o=D;v=E}}}}else{F=w;G=18}}else{F=0;G=18}if((G|0)==18){z=0;A=F;B=0;C=0}F=Jg(A,z,32,i)|0;z=I;A=f[i>>2]<<3;w=Tn(A|0,((A|0)<0)<<31>>31|0,1)|0;A=I;v=un(B|0,C|0,p|0,0)|0;C=Vn(F|0,z|0,v|0,I|0)|0;v=Vn(C|0,I|0,w|0,A|0)|0;A=I;w=f[l>>2]|0;if(w|0){l=f[r>>2]|0;if((l|0)!=(w|0))f[r>>2]=l+(~((l+-4-w|0)>>>2)<<2);Oq(w)}w=Jg(a,c,x,i)|0;l=f[i>>2]|0;r=((x-l|0)/64|0)+l<<3;C=l<<3;z=Vn(w|0,I|0,C|0,((C|0)<0)<<31>>31|0)|0;C=Vn(z|0,I|0,r|0,((r|0)<0)<<31>>31|0)|0;r=I;z=(_((x>>>0>1?x:1)|0)|0)^30;if(e){f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;w=ln(32)|0;f[i>>2]=w;f[i+8>>2]=-2147483616;f[i+4>>2]=22;F=w;B=15964;o=F+22|0;do{b[F>>0]=b[B>>0]|0;F=F+1|0;B=B+1|0}while((F|0)<(o|0));b[w+22>>0]=0;w=(Jh(e,i)|0)==0;if((b[i+11>>0]|0)<0)Oq(f[i>>2]|0);if(!w){f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;w=ln(32)|0;f[i>>2]=w;f[i+8>>2]=-2147483616;f[i+4>>2]=22;F=w;B=15964;o=F+22|0;do{b[F>>0]=b[B>>0]|0;F=F+1|0;B=B+1|0}while((F|0)<(o|0));b[w+22>>0]=0;w=Mk(e,i)|0;if((b[i+11>>0]|0)<0)Oq(f[i>>2]|0);H=w}else G=32}else G=32;if((G|0)==32)H=z>>>0<18&((A|0)>(r|0)|(A|0)==(r|0)&v>>>0>=C>>>0)&1;b[m>>0]=H;C=g+16|0;v=f[C+4>>2]|0;if(!((v|0)>0|(v|0)==0&(f[C>>2]|0)>>>0>0)){f[j>>2]=f[g+4>>2];f[i>>2]=f[j>>2];Me(g,i,m,m+1|0)|0}switch(H|0){case 0:{J=td(a,c,p,k,g)|0;break}case 1:{J=Tc(a,c,x,l,e,g)|0;break}default:J=0}g=f[k>>2]|0;if(g|0){k=f[d>>2]|0;if((k|0)!=(g|0))f[d>>2]=k+(~((k+-4-g|0)>>>2)<<2);Oq(g)}n=J;u=h;return n|0}function Nc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((b|0)<0)return;c=a+12|0;d=f[c>>2]|0;e=f[a+8>>2]|0;g=e;h=d;if(d-e>>2>>>0<=b>>>0)return;e=g+(b<<2)|0;d=f[(f[e>>2]|0)+56>>2]|0;i=f[(f[g+(b<<2)>>2]|0)+60>>2]|0;g=e+4|0;if((g|0)!=(h|0)){j=g;g=e;do{k=f[j>>2]|0;f[j>>2]=0;l=f[g>>2]|0;f[g>>2]=k;if(l|0){k=l+88|0;m=f[k>>2]|0;f[k>>2]=0;if(m|0){k=f[m+8>>2]|0;if(k|0){n=m+12|0;if((f[n>>2]|0)!=(k|0))f[n>>2]=k;Oq(k)}Oq(m)}m=f[l+68>>2]|0;if(m|0){k=l+72|0;n=f[k>>2]|0;if((n|0)!=(m|0))f[k>>2]=n+(~((n+-4-m|0)>>>2)<<2);Oq(m)}m=l+64|0;n=f[m>>2]|0;f[m>>2]=0;if(n|0){m=f[n>>2]|0;if(m|0){k=n+4|0;if((f[k>>2]|0)!=(m|0))f[k>>2]=m;Oq(m)}Oq(n)}Oq(l)}j=j+4|0;g=g+4|0}while((j|0)!=(h|0));j=f[c>>2]|0;if((j|0)!=(g|0)){o=g;p=j;q=24}}else{o=e;p=h;q=24}if((q|0)==24){q=p;do{p=q+-4|0;f[c>>2]=p;h=f[p>>2]|0;f[p>>2]=0;if(h|0){p=h+88|0;e=f[p>>2]|0;f[p>>2]=0;if(e|0){p=f[e+8>>2]|0;if(p|0){j=e+12|0;if((f[j>>2]|0)!=(p|0))f[j>>2]=p;Oq(p)}Oq(e)}e=f[h+68>>2]|0;if(e|0){p=h+72|0;j=f[p>>2]|0;if((j|0)!=(e|0))f[p>>2]=j+(~((j+-4-e|0)>>>2)<<2);Oq(e)}e=h+64|0;j=f[e>>2]|0;f[e>>2]=0;if(j|0){e=f[j>>2]|0;if(e|0){p=j+4|0;if((f[p>>2]|0)!=(e|0))f[p>>2]=e;Oq(e)}Oq(j)}Oq(h)}q=f[c>>2]|0}while((q|0)!=(o|0))}o=f[a+4>>2]|0;a:do if(o|0){q=o+44|0;c=f[q>>2]|0;h=f[o+40>>2]|0;while(1){if((h|0)==(c|0))break a;r=h+4|0;if((f[(f[h>>2]|0)+40>>2]|0)==(i|0))break;else h=r}if((r|0)!=(c|0)){j=r;e=h;do{p=f[j>>2]|0;f[j>>2]=0;g=f[e>>2]|0;f[e>>2]=p;if(g|0){bj(g);Oq(g)}j=j+4|0;e=e+4|0}while((j|0)!=(c|0));j=f[q>>2]|0;if((j|0)==(e|0))break;else{s=e;t=j}}else{s=h;t=c}j=t;do{g=j+-4|0;f[q>>2]=g;p=f[g>>2]|0;f[g>>2]=0;if(p|0){bj(p);Oq(p)}j=f[q>>2]|0}while((j|0)!=(s|0))}while(0);b:do if((d|0)<5){s=f[a+20+(d*12|0)>>2]|0;t=a+20+(d*12|0)+4|0;r=f[t>>2]|0;i=r;c:do if((s|0)==(r|0))u=s;else{o=s;while(1){if((f[o>>2]|0)==(b|0)){u=o;break c}o=o+4|0;if((o|0)==(r|0))break b}}while(0);if((u|0)!=(r|0)){s=u+4|0;o=i-s|0;j=o>>2;if(!j)v=r;else{im(u|0,s|0,o|0)|0;v=f[t>>2]|0}o=u+(j<<2)|0;if((v|0)!=(o|0))f[t>>2]=v+(~((v+-4-o|0)>>>2)<<2)}}while(0);v=f[a+24>>2]|0;u=f[a+20>>2]|0;d=u;if((v|0)!=(u|0)){o=v-u>>2;u=0;do{v=d+(u<<2)|0;j=f[v>>2]|0;if((j|0)>(b|0))f[v>>2]=j+-1;u=u+1|0}while(u>>>0>>0)}o=f[a+36>>2]|0;u=f[a+32>>2]|0;d=u;if((o|0)!=(u|0)){j=o-u>>2;u=0;do{o=d+(u<<2)|0;v=f[o>>2]|0;if((v|0)>(b|0))f[o>>2]=v+-1;u=u+1|0}while(u>>>0>>0)}j=f[a+48>>2]|0;u=f[a+44>>2]|0;d=u;if((j|0)!=(u|0)){v=j-u>>2;u=0;do{j=d+(u<<2)|0;o=f[j>>2]|0;if((o|0)>(b|0))f[j>>2]=o+-1;u=u+1|0}while(u>>>0>>0)}v=f[a+60>>2]|0;u=f[a+56>>2]|0;d=u;if((v|0)!=(u|0)){o=v-u>>2;u=0;do{v=d+(u<<2)|0;j=f[v>>2]|0;if((j|0)>(b|0))f[v>>2]=j+-1;u=u+1|0}while(u>>>0>>0)}o=f[a+72>>2]|0;u=f[a+68>>2]|0;a=u;if((o|0)==(u|0))return;d=o-u>>2;u=0;do{o=a+(u<<2)|0;j=f[o>>2]|0;if((j|0)>(b|0))f[o>>2]=j+-1;u=u+1|0}while(u>>>0>>0);return}function Oc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=a+8|0;a:do if(f[e>>2]|0?(g=f[a>>2]|0,h=a+4|0,f[a>>2]=h,f[(f[h>>2]|0)+8>>2]=0,f[h>>2]=0,f[e>>2]=0,i=f[g+4>>2]|0,j=(i|0)==0?g:i,j|0):0){i=a+4|0;g=j;j=f[c>>2]|0;while(1){if((j|0)==(f[d>>2]|0))break;k=g+16|0;am(k,j+16|0)|0;am(g+28|0,j+28|0)|0;l=g+8|0;m=f[l>>2]|0;do if(m){n=f[m>>2]|0;if((n|0)==(g|0)){f[m>>2]=0;o=f[m+4>>2]|0;if(!o){p=m;break}else q=o;while(1){o=f[q>>2]|0;if(o|0){q=o;continue}o=f[q+4>>2]|0;if(!o)break;else q=o}p=q;break}else{f[m+4>>2]=0;if(!n){p=m;break}else r=n;while(1){o=f[r>>2]|0;if(o|0){r=o;continue}o=f[r+4>>2]|0;if(!o)break;else r=o}p=r;break}}else p=0;while(0);m=f[h>>2]|0;do if(m){n=b[k+11>>0]|0;o=n<<24>>24<0;s=o?f[g+20>>2]|0:n&255;n=o?f[k>>2]|0:k;o=m;while(1){t=o+16|0;u=b[t+11>>0]|0;v=u<<24>>24<0;w=v?f[o+20>>2]|0:u&255;u=w>>>0>>0?w:s;if((u|0)!=0?(x=Vk(n,v?f[t>>2]|0:t,u)|0,(x|0)!=0):0)if((x|0)<0)y=22;else y=24;else if(s>>>0>>0)y=22;else y=24;if((y|0)==22){y=0;w=f[o>>2]|0;if(!w){y=23;break}else z=w}else if((y|0)==24){y=0;A=o+4|0;w=f[A>>2]|0;if(!w){y=26;break}else z=w}o=z}if((y|0)==23){y=0;B=o;C=o;break}else if((y|0)==26){y=0;B=A;C=o;break}}else{B=h;C=h}while(0);f[g>>2]=0;f[g+4>>2]=0;f[l>>2]=C;f[B>>2]=g;m=f[f[a>>2]>>2]|0;if(!m)D=g;else{f[a>>2]=m;D=f[B>>2]|0}Oe(f[i>>2]|0,D);f[e>>2]=(f[e>>2]|0)+1;m=f[j+4>>2]|0;if(!m){k=j+8|0;s=f[k>>2]|0;if((f[s>>2]|0)==(j|0))E=s;else{s=k;do{k=f[s>>2]|0;s=k+8|0;n=f[s>>2]|0}while((f[n>>2]|0)!=(k|0));E=n}}else{s=m;while(1){l=f[s>>2]|0;if(!l)break;else s=l}E=s}f[c>>2]=E;if(!p)break a;else{g=p;j=E}}j=f[g+8>>2]|0;if(!j)F=g;else{i=j;while(1){j=f[i+8>>2]|0;if(!j)break;else i=j}F=i}Ej(a,F)}while(0);F=f[c>>2]|0;E=f[d>>2]|0;if((F|0)==(E|0))return;else G=F;while(1){bf(a,G+16|0)|0;F=f[G+4>>2]|0;if(!F){d=G+8|0;p=f[d>>2]|0;if((f[p>>2]|0)==(G|0))H=p;else{p=d;do{d=f[p>>2]|0;p=d+8|0;e=f[p>>2]|0}while((f[e>>2]|0)!=(d|0));H=e}}else{p=F;while(1){i=f[p>>2]|0;if(!i)break;else p=i}H=p}f[c>>2]=H;if((H|0)==(E|0))break;else G=H}return}function Pc(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;b=u;u=u+32|0;c=b+4|0;d=b;e=a+16|0;g=f[e>>2]|0;if(g>>>0>112){f[e>>2]=g+-113;g=a+4|0;e=f[g>>2]|0;h=f[e>>2]|0;i=e+4|0;f[g>>2]=i;e=a+8|0;j=f[e>>2]|0;k=a+12|0;l=f[k>>2]|0;m=l;do if((j|0)==(l|0)){n=f[a>>2]|0;o=n;if(i>>>0>n>>>0){p=i;q=((p-o>>2)+1|0)/-2|0;r=i+(q<<2)|0;s=j-p|0;p=s>>2;if(!p)t=i;else{im(r|0,i|0,s|0)|0;t=f[g>>2]|0}s=r+(p<<2)|0;f[e>>2]=s;f[g>>2]=t+(q<<2);v=s;break}s=m-o>>1;o=(s|0)==0?1:s;if(o>>>0>1073741823){s=ra(8)|0;Oo(s,16035);f[s>>2]=7256;va(s|0,1112,110)}s=ln(o<<2)|0;q=s;p=s+(o>>>2<<2)|0;r=p;w=s+(o<<2)|0;if((i|0)==(j|0)){x=r;y=n}else{n=p;p=r;o=i;do{f[n>>2]=f[o>>2];n=p+4|0;p=n;o=o+4|0}while((o|0)!=(j|0));x=p;y=f[a>>2]|0}f[a>>2]=q;f[g>>2]=r;f[e>>2]=x;f[k>>2]=w;if(!y)v=x;else{Oq(y);v=f[e>>2]|0}}else v=j;while(0);f[v>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}e=a+8|0;h=f[e>>2]|0;v=a+4|0;j=h-(f[v>>2]|0)|0;y=a+12|0;x=f[y>>2]|0;k=x-(f[a>>2]|0)|0;if(j>>>0>=k>>>0){g=k>>1;k=(g|0)==0?1:g;f[c+12>>2]=0;f[c+16>>2]=a+12;if(k>>>0>1073741823){g=ra(8)|0;Oo(g,16035);f[g>>2]=7256;va(g|0,1112,110)}g=ln(k<<2)|0;f[c>>2]=g;i=g+(j>>2<<2)|0;j=c+8|0;f[j>>2]=i;m=c+4|0;f[m>>2]=i;i=c+12|0;f[i>>2]=g+(k<<2);k=ln(4068)|0;f[d>>2]=k;Ag(c,d);d=f[e>>2]|0;while(1){z=f[v>>2]|0;if((d|0)==(z|0))break;k=d+-4|0;ug(c,k);d=k}k=z;z=f[a>>2]|0;f[a>>2]=f[c>>2];f[c>>2]=z;f[v>>2]=f[m>>2];f[m>>2]=k;m=f[e>>2]|0;f[e>>2]=f[j>>2];f[j>>2]=m;g=f[y>>2]|0;f[y>>2]=f[i>>2];f[i>>2]=g;g=m;if((d|0)!=(g|0))f[j>>2]=g+(~((g+-4-k|0)>>>2)<<2);if(z|0)Oq(z);u=b;return}if((x|0)!=(h|0)){h=ln(4068)|0;f[c>>2]=h;Ag(a,c);u=b;return}h=ln(4068)|0;f[c>>2]=h;ug(a,c);c=f[v>>2]|0;h=f[c>>2]|0;x=c+4|0;f[v>>2]=x;c=f[e>>2]|0;z=f[y>>2]|0;k=z;do if((c|0)==(z|0)){g=f[a>>2]|0;j=g;if(x>>>0>g>>>0){d=x;m=((d-j>>2)+1|0)/-2|0;i=x+(m<<2)|0;t=c-d|0;d=t>>2;if(!d)A=x;else{im(i|0,x|0,t|0)|0;A=f[v>>2]|0}t=i+(d<<2)|0;f[e>>2]=t;f[v>>2]=A+(m<<2);B=t;break}t=k-j>>1;j=(t|0)==0?1:t;if(j>>>0>1073741823){t=ra(8)|0;Oo(t,16035);f[t>>2]=7256;va(t|0,1112,110)}t=ln(j<<2)|0;m=t;d=t+(j>>>2<<2)|0;i=d;l=t+(j<<2)|0;if((x|0)==(c|0)){C=i;D=g}else{g=d;d=i;j=x;do{f[g>>2]=f[j>>2];g=d+4|0;d=g;j=j+4|0}while((j|0)!=(c|0));C=d;D=f[a>>2]|0}f[a>>2]=m;f[v>>2]=i;f[e>>2]=C;f[y>>2]=l;if(!D)B=C;else{Oq(D);B=f[e>>2]|0}}else B=c;while(0);f[B>>2]=h;f[e>>2]=(f[e>>2]|0)+4;u=b;return}function Qc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=u;u=u+16|0;g=e+8|0;h=e+4|0;i=e;j=a+64|0;k=f[j>>2]|0;if((f[k+28>>2]|0)==(f[k+24>>2]|0)){u=e;return}l=c+96|0;c=a+52|0;m=d+84|0;n=d+68|0;d=a+56|0;o=a+60|0;p=a+12|0;q=a+28|0;r=a+40|0;s=a+44|0;t=a+48|0;v=0;w=0;x=k;while(1){k=f[(f[x+24>>2]|0)+(w<<2)>>2]|0;if((k|0)==-1){y=v;z=x}else{A=v+1|0;B=f[(f[l>>2]|0)+(((k|0)/3|0)*12|0)+(((k|0)%3|0)<<2)>>2]|0;if(!(b[m>>0]|0))C=f[(f[n>>2]|0)+(B<<2)>>2]|0;else C=B;f[g>>2]=C;B=f[d>>2]|0;if(B>>>0<(f[o>>2]|0)>>>0){f[B>>2]=C;f[d>>2]=B+4}else Ri(c,g);f[g>>2]=k;f[h>>2]=0;a:do if(!(f[(f[p>>2]|0)+(w>>>5<<2)>>2]&1<<(w&31)))D=k;else{B=k+1|0;E=((B>>>0)%3|0|0)==0?k+-2|0:B;if(((E|0)!=-1?(f[(f[a>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)==0:0)?(B=f[(f[(f[j>>2]|0)+12>>2]|0)+(E<<2)>>2]|0,E=B+1|0,(B|0)!=-1):0){F=((E>>>0)%3|0|0)==0?B+-2|0:E;f[h>>2]=F;if((F|0)==-1){D=k;break}else G=F;while(1){f[g>>2]=G;F=G+1|0;E=((F>>>0)%3|0|0)==0?G+-2|0:F;if((E|0)==-1)break;if(f[(f[a>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)break;F=f[(f[(f[j>>2]|0)+12>>2]|0)+(E<<2)>>2]|0;E=F+1|0;if((F|0)==-1)break;B=((E>>>0)%3|0|0)==0?F+-2|0:E;f[h>>2]=B;if((B|0)==-1){D=G;break a}else G=B}f[h>>2]=-1;D=G;break}f[h>>2]=-1;D=k}while(0);f[(f[q>>2]|0)+(D<<2)>>2]=v;k=f[s>>2]|0;if((k|0)==(f[t>>2]|0))Ri(r,g);else{f[k>>2]=f[g>>2];f[s>>2]=k+4}k=f[j>>2]|0;B=f[g>>2]|0;b:do if(((B|0)!=-1?(E=(((B>>>0)%3|0|0)==0?2:-1)+B|0,(E|0)!=-1):0)?(F=f[(f[k+12>>2]|0)+(E<<2)>>2]|0,(F|0)!=-1):0){E=F+(((F>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=E;if((E|0)!=-1&(E|0)!=(B|0)){F=A;H=v;I=E;while(1){E=I+1|0;J=((E>>>0)%3|0|0)==0?I+-2|0:E;do if(f[(f[a>>2]|0)+(J>>>5<<2)>>2]&1<<(J&31)){E=F+1|0;K=f[(f[l>>2]|0)+(((I|0)/3|0)*12|0)+(((I|0)%3|0)<<2)>>2]|0;if(!(b[m>>0]|0))L=f[(f[n>>2]|0)+(K<<2)>>2]|0;else L=K;f[i>>2]=L;K=f[d>>2]|0;if(K>>>0<(f[o>>2]|0)>>>0){f[K>>2]=L;f[d>>2]=K+4}else Ri(c,i);K=f[s>>2]|0;if((K|0)==(f[t>>2]|0)){Ri(r,h);M=E;N=F;break}else{f[K>>2]=f[h>>2];f[s>>2]=K+4;M=E;N=F;break}}else{M=F;N=H}while(0);f[(f[q>>2]|0)+(f[h>>2]<<2)>>2]=N;O=f[j>>2]|0;J=f[h>>2]|0;if((J|0)==-1)break;E=(((J>>>0)%3|0|0)==0?2:-1)+J|0;if((E|0)==-1)break;J=f[(f[O+12>>2]|0)+(E<<2)>>2]|0;if((J|0)==-1)break;I=J+(((J>>>0)%3|0|0)==0?2:-1)|0;f[h>>2]=I;if(!((I|0)!=-1?(I|0)!=(f[g>>2]|0):0)){P=M;Q=O;break b}else{F=M;H=N}}f[h>>2]=-1;P=M;Q=O}else{P=A;Q=k}}else R=28;while(0);if((R|0)==28){R=0;f[h>>2]=-1;P=A;Q=k}y=P;z=Q}w=w+1|0;if(w>>>0>=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2>>>0)break;else{v=y;x=z}}u=e;return}function Rc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,D=0,E=0,F=0;switch(c|0){case 0:{e=-149;g=24;i=4;break}case 1:{e=-1074;g=53;i=4;break}case 2:{e=-1074;g=53;i=4;break}default:j=0.0}a:do if((i|0)==4){c=a+4|0;k=a+100|0;do{l=f[c>>2]|0;if(l>>>0<(f[k>>2]|0)>>>0){f[c>>2]=l+1;m=h[l>>0]|0}else m=Si(a)|0}while((eq(m)|0)!=0);b:do switch(m|0){case 43:case 45:{l=1-(((m|0)==45&1)<<1)|0;n=f[c>>2]|0;if(n>>>0<(f[k>>2]|0)>>>0){f[c>>2]=n+1;o=h[n>>0]|0;p=l;break b}else{o=Si(a)|0;p=l;break b}break}default:{o=m;p=1}}while(0);l=0;n=o;while(1){if((n|32|0)!=(b[18546+l>>0]|0)){q=l;r=n;break}do if(l>>>0<7){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;t=h[s>>0]|0;break}else{t=Si(a)|0;break}}else t=n;while(0);s=l+1|0;if(s>>>0<8){l=s;n=t}else{q=s;r=t;break}}c:do switch(q|0){case 8:break;case 3:{i=23;break}default:{n=(d|0)!=0;if(n&q>>>0>3)if((q|0)==8)break c;else{i=23;break c}d:do if(!q){l=0;s=r;while(1){if((s|32|0)!=(b[18555+l>>0]|0)){u=l;v=s;break d}do if(l>>>0<2){w=f[c>>2]|0;if(w>>>0<(f[k>>2]|0)>>>0){f[c>>2]=w+1;x=h[w>>0]|0;break}else{x=Si(a)|0;break}}else x=s;while(0);w=l+1|0;if(w>>>0<3){l=w;s=x}else{u=w;v=x;break}}}else{u=q;v=r}while(0);switch(u|0){case 3:{s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;y=h[s>>0]|0}else y=Si(a)|0;if((y|0)==40)z=1;else{if(!(f[k>>2]|0)){j=B;break a}f[c>>2]=(f[c>>2]|0)+-1;j=B;break a}while(1){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;A=h[s>>0]|0}else A=Si(a)|0;if(!((A+-48|0)>>>0<10|(A+-65|0)>>>0<26)?!((A|0)==95|(A+-97|0)>>>0<26):0)break;z=z+1|0}if((A|0)==41){j=B;break a}s=(f[k>>2]|0)==0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if(!n){l=Vq()|0;f[l>>2]=22;Ym(a,0);j=0.0;break a}if(!z){j=B;break a}else D=z;while(1){D=D+-1|0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if(!D){j=B;break a}}break}case 0:{if((v|0)==48){s=f[c>>2]|0;if(s>>>0<(f[k>>2]|0)>>>0){f[c>>2]=s+1;E=h[s>>0]|0}else E=Si(a)|0;if((E|32|0)==120){j=+Fc(a,g,e,p,d);break a}if(!(f[k>>2]|0))F=48;else{f[c>>2]=(f[c>>2]|0)+-1;F=48}}else F=v;j=+nb(a,F,g,e,p,d);break a;break}default:{if(f[k>>2]|0)f[c>>2]=(f[c>>2]|0)+-1;s=Vq()|0;f[s>>2]=22;Ym(a,0);j=0.0;break a}}}}while(0);if((i|0)==23){s=(f[k>>2]|0)==0;if(!s)f[c>>2]=(f[c>>2]|0)+-1;if((d|0)!=0&q>>>0>3){n=q;do{if(!s)f[c>>2]=(f[c>>2]|0)+-1;n=n+-1|0}while(n>>>0>3)}}j=+$($(p|0)*$(C))}while(0);return +j}function Sc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;g=u;u=u+16|0;h=g;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;i=ln(16)|0;f[h>>2]=i;f[h+8>>2]=-2147483632;f[h+4>>2]=15;j=i;k=14479;l=j+15|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[i+15>>0]=0;i=Hk(c,h,-1)|0;if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);switch(i|0){case 0:{m=ln(52)|0;j=m;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));Zn(m);n=4044;o=m;break}case -1:{if((mi(c)|0)==10){m=ln(52)|0;j=m;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));Zn(m);n=4044;o=m}else p=6;break}default:p=6}a:do if((p|0)==6){m=d+8|0;q=d+12|0;r=f[q>>2]|0;s=f[m>>2]|0;b:do if((r-s|0)>0){t=h+8|0;v=h+4|0;w=c+16|0;x=h+11|0;y=0;z=s;A=r;c:while(1){B=f[(f[z+(y<<2)>>2]|0)+28>>2]|0;switch(B|0){case 9:{p=12;break}case 6:case 5:case 4:case 2:{C=z;D=A;break}default:{if((B|2|0)!=3)break c;if((B|0)==9)p=12;else{C=z;D=A}}}if((p|0)==12){p=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;B=ln(32)|0;f[h>>2]=B;f[t>>2]=-2147483616;f[v>>2]=17;j=B;k=14495;l=j+17|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[B+17>>0]=0;E=f[w>>2]|0;if(E){F=w;G=E;d:while(1){E=G;while(1){if((f[E+16>>2]|0)>=0)break;H=f[E+4>>2]|0;if(!H){I=F;break d}else E=H}G=f[E>>2]|0;if(!G){I=E;break}else F=E}if(((I|0)!=(w|0)?(f[I+16>>2]|0)<=0:0)?(F=I+20|0,(Jh(F,h)|0)!=0):0)J=Hk(F,h,-1)|0;else p=21}else p=21;if((p|0)==21){p=0;J=Hk(c,h,-1)|0}if((b[x>>0]|0)<0)Oq(f[h>>2]|0);if((J|0)<1)break;C=f[m>>2]|0;D=f[q>>2]|0}y=y+1|0;if((y|0)>=(D-C>>2|0))break b;else{z=C;A=D}}if((i|0)!=1){A=ln(52)|0;j=A;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));Zn(A);n=4044;o=A;break a}f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;z=ln(32)|0;f[h>>2]=z;f[h+8>>2]=-2147483616;f[h+4>>2]=24;j=z;k=14513;l=j+24|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[z+24>>0]=0;f[a>>2]=-1;pj(a+4|0,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}while(0);q=ln(52)|0;j=q;l=j+52|0;do{f[j>>2]=0;j=j+4|0}while((j|0)<(l|0));Zn(q);n=3988;o=q}while(0);f[o>>2]=n;ip(o,d);Md(a,o,c,e);Va[f[(f[o>>2]|0)+4>>2]&127](o);u=g;return}function Tc(a,c,d,e,g,h){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=u;u=u+32|0;j=i+4|0;k=i;l=i+16|0;m=(_(e|0)|0)^31;if((e|0)>0)if(m>>>0>17){n=0;u=i;return n|0}else o=m+1|0;else o=1;do if(g){m=ln(48)|0;f[j>>2]=m;f[j+8>>2]=-2147483600;f[j+4>>2]=33;e=m;p=15987;q=e+33|0;do{b[e>>0]=b[p>>0]|0;e=e+1|0;p=p+1|0}while((e|0)<(q|0));b[m+33>>0]=0;r=(Jh(g,j)|0)==0;if((b[j+11>>0]|0)<0)Oq(f[j>>2]|0);if(!r){r=ln(48)|0;f[j>>2]=r;f[j+8>>2]=-2147483600;f[j+4>>2]=33;e=r;p=15987;q=e+33|0;do{b[e>>0]=b[p>>0]|0;e=e+1|0;p=p+1|0}while((e|0)<(q|0));b[r+33>>0]=0;p=Mk(g,j)|0;if((b[j+11>>0]|0)<0)Oq(f[j>>2]|0);if((p|0)<4){s=o+-2|0;break}if((p|0)<6){s=o+-1|0;break}if((p|0)>9){s=o+2|0;break}else{s=o+((p|0)>7&1)|0;break}}else s=o}else s=o;while(0);o=(s|0)>1?s:1;s=(o|0)<18?o:18;b[l>>0]=s;o=h+16|0;g=f[o+4>>2]|0;if(!((g|0)>0|(g|0)==0&(f[o>>2]|0)>>>0>0)){f[k>>2]=f[h+4>>2];f[j>>2]=f[k>>2];Me(h,j,l,l+1|0)|0}do switch(s&31){case 1:case 0:{n=ue(a,c,d,h)|0;u=i;return n|0}case 2:{n=te(a,c,d,h)|0;u=i;return n|0}case 3:{n=se(a,c,d,h)|0;u=i;return n|0}case 4:{n=re(a,c,d,h)|0;u=i;return n|0}case 5:{n=qe(a,c,d,h)|0;u=i;return n|0}case 6:{n=pe(a,c,d,h)|0;u=i;return n|0}case 7:{n=oe(a,c,d,h)|0;u=i;return n|0}case 8:{n=ne(a,c,d,h)|0;u=i;return n|0}case 9:{n=me(a,c,d,h)|0;u=i;return n|0}case 10:{n=le(a,c,d,h)|0;u=i;return n|0}case 11:{n=ke(a,c,d,h)|0;u=i;return n|0}case 12:{n=ie(a,c,d,h)|0;u=i;return n|0}case 13:{n=he(a,c,d,h)|0;u=i;return n|0}case 14:{n=ge(a,c,d,h)|0;u=i;return n|0}case 15:{n=fe(a,c,d,h)|0;u=i;return n|0}case 16:{n=ee(a,c,d,h)|0;u=i;return n|0}case 17:{n=de(a,c,d,h)|0;u=i;return n|0}case 18:{n=ce(a,c,d,h)|0;u=i;return n|0}default:{n=0;u=i;return n|0}}while(0);return 0}function Uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;xb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;yb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Wc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;zb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Xc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ab(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Yc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*1048576.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==1048576){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Fb(z,A,g);a:do if((x|0)<1048576){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=1048576-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>1048576;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-1048576|0;m=x;while(1){v=1048576.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==1048576){C=p;D=1048576;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=1048576){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*9.5367431640625e-07)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function Zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*524288.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==524288){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Bb(z,A,g);a:do if((x|0)<524288){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=524288-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>524288;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-524288|0;m=x;while(1){v=524288.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==524288){C=p;D=524288;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=524288){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*1.9073486328125e-06)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function _c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*262144.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==262144){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Cb(z,A,g);a:do if((x|0)<262144){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=262144-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>262144;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-262144|0;m=x;while(1){v=262144.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==262144){C=p;D=262144;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=262144){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*3.814697265625e-06)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function $c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*65536.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==65536){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Db(z,A,g);a:do if((x|0)<65536){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=65536-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>65536;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-65536|0;m=x;while(1){v=65536.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==65536){C=p;D=65536;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=65536){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.0000152587890625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*32768.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==32768){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Eb(z,A,g);a:do if((x|0)<32768){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=32768-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>32768;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-32768|0;m=x;while(1){v=32768.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==32768){C=p;D=32768;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=32768){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000030517578125)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*8192.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==8192){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Gb(z,A,g);a:do if((x|0)<8192){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=8192-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>8192;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-8192|0;m=x;while(1){v=8192.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==8192){C=p;D=8192;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=8192){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.0001220703125)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Hb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ib(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Jb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function fd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Kb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Lb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Mb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Nb(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;e=u;u=u+16|0;g=e;h=e+4|0;if((c|0)>0){i=0;j=0;k=0;l=0;while(1){m=b+(j<<3)|0;n=f[m>>2]|0;o=f[m+4>>2]|0;m=Vn(n|0,o|0,k|0,l|0)|0;p=I;q=(n|0)==0&(o|0)==0?i:j;j=j+1|0;if((j|0)==(c|0)){r=q;s=p;t=m;break}else{i=q;k=m;l=p}}}else{r=0;s=0;t=0}l=r+1|0;f[a+12>>2]=l;k=a+4|0;i=f[k>>2]|0;c=f[a>>2]|0;j=i-c>>3;p=c;c=i;if(l>>>0<=j>>>0){if(l>>>0>>0?(i=p+(l<<3)|0,(i|0)!=(c|0)):0)f[k>>2]=c+(~((c+-8-i|0)>>>3)<<3)}else wh(a,l-j|0);v=+(t>>>0)+4294967296.0*+(s>>>0);s=(r|0)<0;if(!s){t=f[a>>2]|0;j=0;i=0;do{c=b+(i<<3)|0;k=f[c>>2]|0;p=f[c+4>>2]|0;c=~~((+(k>>>0)+4294967296.0*+(p>>>0))/v*4096.0+.5)>>>0;m=((k|0)!=0|(p|0)!=0)&(c|0)==0?1:c;f[t+(i<<3)>>2]=m;j=m+j|0;i=i+1|0}while((i|0)!=(l|0));if((j|0)==4096){if(s){w=0;u=e;return w|0}}else{x=j;y=12}}else{x=0;y=12}if((y|0)==12){f[h>>2]=0;j=h+4|0;f[j>>2]=0;f[h+8>>2]=0;do if(l)if(l>>>0>1073741823)aq(h);else{i=l<<2;t=ln(i)|0;f[h>>2]=t;m=t+(l<<2)|0;f[h+8>>2]=m;sj(t|0,0,i|0)|0;f[j>>2]=m;z=t;A=m;break}else{z=0;A=0}while(0);if(!s?(f[z>>2]=0,r|0):0){m=1;do{f[z+(m<<2)>>2]=m;m=m+1|0}while((m|0)!=(l|0))}f[g>>2]=a;Ob(z,A,g);a:do if((x|0)<4096){g=(f[a>>2]|0)+(f[(f[j>>2]|0)+-4>>2]<<3)|0;f[g>>2]=4096-x+(f[g>>2]|0);B=0}else{g=f[h>>2]|0;if((r|0)<=0){A=(x|0)>4096;while(1)if(!A){B=0;break a}}A=f[a>>2]|0;z=x+-4096|0;m=x;while(1){v=4096.0/+(m|0);t=r;i=z;c=m;while(1){p=A+(f[g+(t<<2)>>2]<<3)|0;k=f[p>>2]|0;if(k>>>0<2){y=28;break}q=k-~~+J(+(v*+(k>>>0)))|0;o=(q|0)==0?1:q;q=(o|0)<(k|0)?o:k+-1|0;o=(q|0)>(i|0)?i:q;f[p>>2]=k-o;k=c-o|0;p=i-o|0;if((k|0)==4096){C=p;D=4096;break}if((t|0)>1){t=t+-1|0;i=p;c=k}else{C=p;D=k;break}}if((y|0)==28){y=0;if((t|0)==(r|0)){B=1;break a}else{C=i;D=c}}if((C|0)>0){z=C;m=D}else{B=0;break}}}while(0);D=f[h>>2]|0;if(D|0){h=f[j>>2]|0;if((h|0)!=(D|0))f[j>>2]=h+(~((h+-4-D|0)>>>2)<<2);Oq(D)}if((B|0)!=0|s){w=0;u=e;return w|0}}B=f[a>>2]|0;D=0;h=0;do{f[B+(D<<3)+4>>2]=h;h=(f[B+(D<<3)>>2]|0)+h|0;D=D+1|0}while((D|0)!=(l|0));if((h|0)!=4096){w=0;u=e;return w|0}if(s)E=0.0;else{s=f[a>>2]|0;h=0;v=0.0;while(1){D=f[s+(h<<3)>>2]|0;if(!D)F=v;else{B=b+(h<<3)|0;G=+((f[B>>2]|0)>>>0)+4294967296.0*+((f[B+4>>2]|0)>>>0);F=v+ +Zg(+(D>>>0)*.000244140625)*G}h=h+1|0;if((h|0)==(l|0)){E=F;break}else v=F}}F=+W(+-E);l=+K(F)>=1.0?(F>0.0?~~+Y(+J(F/4294967296.0),4294967295.0)>>>0:~~+W((F-+(~~F>>>0))/4294967296.0)>>>0):0;h=a+16|0;f[h>>2]=~~F>>>0;f[h+4>>2]=l;w=Le(a,d)|0;u=e;return w|0}function kd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=e>>>0>1073741823?-1:e<<2;k=Lq(j)|0;sj(k|0,0,j|0)|0;j=f[a+28>>2]|0;l=a+36|0;m=f[l>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;a:do if((p|0)>4){q=p>>2;r=f[a+32>>2]|0;s=a+8|0;t=h+4|0;v=i+4|0;w=d+4|0;x=j+12|0;y=(e|0)>0;z=k+4|0;A=h+4|0;B=i+4|0;C=d+4|0;D=q+-1|0;if(n-o>>2>>>0>D>>>0){E=q;F=D;G=o}else{H=m;aq(H)}while(1){D=f[G+(F<<2)>>2]|0;q=X(F,e)|0;if((D|0)!=-1?(I=f[(f[x>>2]|0)+(D<<2)>>2]|0,(I|0)!=-1):0){D=f[j>>2]|0;J=f[r>>2]|0;K=f[J+(f[D+(I<<2)>>2]<<2)>>2]|0;L=I+1|0;M=((L>>>0)%3|0|0)==0?I+-2|0:L;if((M|0)==-1)N=-1;else N=f[D+(M<<2)>>2]|0;M=f[J+(N<<2)>>2]|0;L=(((I>>>0)%3|0|0)==0?2:-1)+I|0;if((L|0)==-1)O=-1;else O=f[D+(L<<2)>>2]|0;L=f[J+(O<<2)>>2]|0;if((K|0)<(F|0)&(M|0)<(F|0)&(L|0)<(F|0)){J=X(K,e)|0;K=X(M,e)|0;M=X(L,e)|0;if(y){L=0;do{f[k+(L<<2)>>2]=(f[b+(L+M<<2)>>2]|0)+(f[b+(L+K<<2)>>2]|0)-(f[b+(L+J<<2)>>2]|0);L=L+1|0}while((L|0)!=(e|0))}L=b+(q<<2)|0;J=c+(q<<2)|0;K=f[L+4>>2]|0;M=f[k>>2]|0;D=f[z>>2]|0;f[h>>2]=f[L>>2];f[A>>2]=K;f[i>>2]=M;f[B>>2]=D;Od(d,s,h,i);f[J>>2]=f[d>>2];f[J+4>>2]=f[C>>2]}else P=15}else P=15;if((P|0)==15){P=0;J=b+(q<<2)|0;D=b+((X(E+-2|0,e)|0)<<2)|0;M=c+(q<<2)|0;K=f[J+4>>2]|0;L=f[D>>2]|0;I=f[D+4>>2]|0;f[h>>2]=f[J>>2];f[t>>2]=K;f[i>>2]=L;f[v>>2]=I;Od(d,s,h,i);f[M>>2]=f[d>>2];f[M+4>>2]=f[w>>2]}if((E|0)<=2)break a;M=f[l>>2]|0;G=f[M>>2]|0;I=F+-1|0;if((f[M+4>>2]|0)-G>>2>>>0<=I>>>0){H=M;break}else{M=F;F=I;E=M}}aq(H)}while(0);if((e|0)<=0){Q=a+8|0;R=b+4|0;S=f[b>>2]|0;T=f[R>>2]|0;U=k+4|0;V=f[k>>2]|0;W=f[U>>2]|0;f[h>>2]=S;Y=h+4|0;f[Y>>2]=T;f[i>>2]=V;Z=i+4|0;f[Z>>2]=W;Od(d,Q,h,i);_=f[d>>2]|0;f[c>>2]=_;$=d+4|0;aa=f[$>>2]|0;ba=c+4|0;f[ba>>2]=aa;Mq(k);u=g;return 1}sj(k|0,0,e<<2|0)|0;Q=a+8|0;R=b+4|0;S=f[b>>2]|0;T=f[R>>2]|0;U=k+4|0;V=f[k>>2]|0;W=f[U>>2]|0;f[h>>2]=S;Y=h+4|0;f[Y>>2]=T;f[i>>2]=V;Z=i+4|0;f[Z>>2]=W;Od(d,Q,h,i);_=f[d>>2]|0;f[c>>2]=_;$=d+4|0;aa=f[$>>2]|0;ba=c+4|0;f[ba>>2]=aa;Mq(k);u=g;return 1}function ld(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0;d=u;u=u+32|0;e=d;g=d+20|0;h=d+24|0;i=d+8|0;j=f[a>>2]|0;k=j+8|0;l=j;j=f[l>>2]|0;m=f[l+4>>2]|0;l=Vn(j|0,m|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=I;n=Vn(l|0,k|0,(l|0)==0&(k|0)==0&1|0,0)|0;k=~~((+(j>>>0)+4294967296.0*+(m>>>0))/(+(n>>>0)+4294967296.0*+(I>>>0))*256.0+.5)>>>0;n=k>>>0<255?k:255;k=n+((n|0)==0&1)&255;b[h>>0]=k;n=a+12|0;m=a+16|0;j=((f[m>>2]|0)-(f[n>>2]|0)<<1)+64|0;f[i>>2]=0;l=i+4|0;f[l>>2]=0;f[i+8>>2]=0;if(!j)o=0;else{if((j|0)<0)aq(i);p=ln(j)|0;f[l>>2]=p;f[i>>2]=p;f[i+8>>2]=p+j;q=j;j=p;do{b[j>>0]=0;j=(f[l>>2]|0)+1|0;f[l>>2]=j;q=q+-1|0}while((q|0)!=0);o=f[i>>2]|0}q=a+28|0;j=(f[q>>2]|0)+-1|0;a:do if((j|0)>-1){p=a+24|0;r=j;s=4096;t=0;v=k;while(1){w=(f[p>>2]&1<>>0>>0){y=t;z=s}else{b[o+t>>0]=s;y=t+1|0;z=s>>>8}un(f[4092+(x<<3)>>2]|0,0,z|0,0)|0;A=z+(w?0:0-v&255)+(X((z+I|0)>>>(f[4092+(x<<3)+4>>2]|0),256-x|0)|0)|0;x=r+-1|0;if((x|0)<=-1){B=A;C=y;break a}r=x;s=A;t=y;v=b[h>>0]|0}}else{B=4096;C=0}while(0);y=f[m>>2]|0;if((f[n>>2]|0)==(y|0)){D=B;E=C}else{z=B;B=C;C=y;while(1){C=C+-4|0;y=f[C>>2]|0;k=31;j=z;v=B;while(1){t=b[h>>0]|0;s=(1<>>0>>0){F=v;G=j}else{b[o+v>>0]=j;F=v+1|0;G=j>>>8}un(f[4092+(r<<3)>>2]|0,0,G|0,0)|0;j=G+(s?0:0-t&255)+(X((G+I|0)>>>(f[4092+(r<<3)+4>>2]|0),256-r|0)|0)|0;if((k|0)<=0)break;else{k=k+-1|0;v=F}}if((f[n>>2]|0)==(C|0)){D=j;E=F;break}else{z=j;B=F}}}F=D+-4096|0;do if(F>>>0>=64){if(F>>>0<16384){B=o+E|0;z=D+12288|0;b[B>>0]=z;H=2;J=z>>>8;K=B+1|0;L=25;break}if(F>>>0<4194304){B=o+E|0;z=D+8384512|0;b[B>>0]=z;b[B+1>>0]=z>>>8;H=3;J=z>>>16;K=B+2|0;L=25}else M=E}else{H=1;J=F;K=o+E|0;L=25}while(0);if((L|0)==25){b[K>>0]=J;M=H+E|0}E=c+16|0;H=E;J=f[H+4>>2]|0;if(!((J|0)>0|(J|0)==0&(f[H>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}ci(M,c)|0;h=f[i>>2]|0;H=E;E=f[H+4>>2]|0;if(!((E|0)>0|(E|0)==0&(f[H>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+M|0)|0}M=e;f[M>>2]=0;f[M+4>>2]=0;qf(a,2,e);e=f[a+12>>2]|0;M=f[m>>2]|0;if((M|0)!=(e|0))f[m>>2]=M+(~((M+-4-e|0)>>>2)<<2);f[a+24>>2]=0;f[q>>2]=0;q=f[i>>2]|0;if(!q){u=d;return}if((f[l>>2]|0)!=(q|0))f[l>>2]=q;Oq(q);u=d;return}function md(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;c=u;u=u+16|0;b=c+8|0;d=c+4|0;e=c;g=a+64|0;h=f[g>>2]|0;if((f[h+28>>2]|0)==(f[h+24>>2]|0)){u=c;return}i=a+52|0;j=a+56|0;k=a+60|0;l=a+12|0;m=a+28|0;n=a+40|0;o=a+44|0;p=a+48|0;q=0;r=0;s=h;while(1){h=f[(f[s+24>>2]|0)+(r<<2)>>2]|0;if((h|0)==-1){t=q;v=s}else{w=q+1|0;f[b>>2]=q;x=f[j>>2]|0;if((x|0)==(f[k>>2]|0))Ri(i,b);else{f[x>>2]=q;f[j>>2]=x+4}f[d>>2]=h;f[e>>2]=0;a:do if(!(f[(f[l>>2]|0)+(r>>>5<<2)>>2]&1<<(r&31)))y=h;else{x=h+1|0;z=((x>>>0)%3|0|0)==0?h+-2|0:x;if(((z|0)!=-1?(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)==0:0)?(x=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0,z=x+1|0,(x|0)!=-1):0){A=((z>>>0)%3|0|0)==0?x+-2|0:z;f[e>>2]=A;if((A|0)==-1){y=h;break}else B=A;while(1){f[d>>2]=B;A=B+1|0;z=((A>>>0)%3|0|0)==0?B+-2|0:A;if((z|0)==-1)break;if(f[(f[a>>2]|0)+(z>>>5<<2)>>2]&1<<(z&31)|0)break;A=f[(f[(f[g>>2]|0)+12>>2]|0)+(z<<2)>>2]|0;z=A+1|0;if((A|0)==-1)break;x=((z>>>0)%3|0|0)==0?A+-2|0:z;f[e>>2]=x;if((x|0)==-1){y=B;break a}else B=x}f[e>>2]=-1;y=B;break}f[e>>2]=-1;y=h}while(0);f[(f[m>>2]|0)+(y<<2)>>2]=f[b>>2];h=f[o>>2]|0;if((h|0)==(f[p>>2]|0))Ri(n,d);else{f[h>>2]=f[d>>2];f[o>>2]=h+4}h=f[g>>2]|0;x=f[d>>2]|0;b:do if(((x|0)!=-1?(z=(((x>>>0)%3|0|0)==0?2:-1)+x|0,(z|0)!=-1):0)?(A=f[(f[h+12>>2]|0)+(z<<2)>>2]|0,(A|0)!=-1):0){z=A+(((A>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=z;if((z|0)!=-1&(z|0)!=(x|0)){A=w;C=z;while(1){z=C+1|0;D=((z>>>0)%3|0|0)==0?C+-2|0:z;do if(f[(f[a>>2]|0)+(D>>>5<<2)>>2]&1<<(D&31)){z=A+1|0;f[b>>2]=A;E=f[j>>2]|0;if((E|0)==(f[k>>2]|0))Ri(i,b);else{f[E>>2]=A;f[j>>2]=E+4}E=f[o>>2]|0;if((E|0)==(f[p>>2]|0)){Ri(n,e);F=z;break}else{f[E>>2]=f[e>>2];f[o>>2]=E+4;F=z;break}}else F=A;while(0);f[(f[m>>2]|0)+(f[e>>2]<<2)>>2]=f[b>>2];G=f[g>>2]|0;D=f[e>>2]|0;if((D|0)==-1)break;z=(((D>>>0)%3|0|0)==0?2:-1)+D|0;if((z|0)==-1)break;D=f[(f[G+12>>2]|0)+(z<<2)>>2]|0;if((D|0)==-1)break;C=D+(((D>>>0)%3|0|0)==0?2:-1)|0;f[e>>2]=C;if(!((C|0)!=-1?(C|0)!=(f[d>>2]|0):0)){H=F;I=G;break b}else A=F}f[e>>2]=-1;H=F;I=G}else{H=w;I=h}}else J=26;while(0);if((J|0)==26){J=0;f[e>>2]=-1;H=w;I=h}t=H;v=I}r=r+1|0;if(r>>>0>=(f[v+28>>2]|0)-(f[v+24>>2]|0)>>2>>>0)break;else{q=t;s=v}}u=c;return}function nd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;h=a+124|0;f[h>>2]=(f[h>>2]|0)+1;h=a+88|0;i=a+120|0;j=f[i>>2]|0;k=j+1|0;do if((j|0)!=-1){l=((k>>>0)%3|0|0)==0?j+-2|0:k;if(!((j>>>0)%3|0)){m=j+2|0;n=l;break}else{m=j+-1|0;n=l;break}}else{m=-1;n=-1}while(0);k=a+104|0;l=a+92|0;o=f[l>>2]|0;p=o+(n<<2)|0;q=f[k>>2]|0;r=q+(f[p>>2]<<2)|0;s=f[r>>2]|0;switch(b|0){case 1:case 0:{f[r>>2]=s+-1;r=q+(f[o+(m<<2)>>2]<<2)|0;f[r>>2]=(f[r>>2]|0)+-1;if((b|0)==1){if((m|0)!=-1?(r=f[(f[(f[h>>2]|0)+12>>2]|0)+(m<<2)>>2]|0,(r|0)!=-1):0){t=a+64|0;v=1;w=r;while(1){r=f[t>>2]|0;x=f[(f[r>>2]|0)+36>>2]|0;f[e>>2]=(w>>>0)/3|0;f[d>>2]=f[e>>2];if(Ra[x&127](r,d)|0){y=v;break}r=w+1|0;x=((r>>>0)%3|0|0)==0?w+-2|0:r;if((x|0)==-1){z=12;break}w=f[(f[(f[h>>2]|0)+12>>2]|0)+(x<<2)>>2]|0;x=v+1|0;if((w|0)==-1){y=x;break}else v=x}if((z|0)==12)y=v+1|0;A=y;B=f[k>>2]|0;C=f[l>>2]|0}else{A=1;B=q;C=o}f[B+(f[C+(f[i>>2]<<2)>>2]<<2)>>2]=A;A=a+108|0;i=f[A>>2]|0;C=i-B>>2;B=i;if((n|0)!=-1?(i=f[(f[(f[h>>2]|0)+12>>2]|0)+(n<<2)>>2]|0,(i|0)!=-1):0){n=a+64|0;y=1;v=i;while(1){i=f[n>>2]|0;w=f[(f[i>>2]|0)+36>>2]|0;f[g>>2]=(v>>>0)/3|0;f[d>>2]=f[g>>2];if(Ra[w&127](i,d)|0){D=y;break}i=v+1|0;f[(f[l>>2]|0)+((((i>>>0)%3|0|0)==0?v+-2|0:i)<<2)>>2]=C;i=(((v>>>0)%3|0|0)==0?2:-1)+v|0;if((i|0)==-1){z=20;break}v=f[(f[(f[h>>2]|0)+12>>2]|0)+(i<<2)>>2]|0;i=y+1|0;if((v|0)==-1){D=i;break}else y=i}if((z|0)==20)D=y+1|0;E=D;F=f[A>>2]|0}else{E=1;F=B}f[d>>2]=E;if(F>>>0<(f[a+112>>2]|0)>>>0){f[F>>2]=E;f[A>>2]=F+4}else Ri(k,d)}break}case 5:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;break}case 3:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-1;break}case 7:{k=q+(f[o+(j<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[p>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;k=q+(f[o+(m<<2)>>2]<<2)|0;f[k>>2]=(f[k>>2]|0)+-2;break}default:{}}k=a+116|0;m=f[k>>2]|0;if((m|0)==-1){f[k>>2]=b;u=c;return}o=f[a+128>>2]|0;if((s|0)<(o|0))G=o;else{q=f[a+132>>2]|0;G=(s|0)>(q|0)?q:s}s=G-o|0;o=f[a+136>>2]|0;a=f[3724+(m<<2)>>2]|0;f[d>>2]=a;m=o+(s*12|0)+4|0;G=f[m>>2]|0;if(G>>>0<(f[o+(s*12|0)+8>>2]|0)>>>0){f[G>>2]=a;f[m>>2]=G+4}else Ri(o+(s*12|0)|0,d);f[k>>2]=b;u=c;return}function od(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0;g=u;u=u+32|0;d=g+16|0;h=g+8|0;i=g;j=e>>>0>1073741823?-1:e<<2;k=Lq(j)|0;sj(k|0,0,j|0)|0;j=f[a+28>>2]|0;l=a+36|0;m=f[l>>2]|0;n=f[m+4>>2]|0;o=f[m>>2]|0;p=n-o|0;a:do if((p|0)>4){q=p>>2;r=f[a+32>>2]|0;s=a+8|0;t=h+4|0;v=i+4|0;w=d+4|0;x=j+64|0;y=j+28|0;z=(e|0)>0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=q+-1|0;if(n-o>>2>>>0>E>>>0){F=q;G=E;H=o}else{I=m;aq(I)}while(1){E=f[H+(G<<2)>>2]|0;q=X(G,e)|0;if((((E|0)!=-1?(f[(f[j>>2]|0)+(E>>>5<<2)>>2]&1<<(E&31)|0)==0:0)?(J=f[(f[(f[x>>2]|0)+12>>2]|0)+(E<<2)>>2]|0,(J|0)!=-1):0)?(E=f[y>>2]|0,K=f[r>>2]|0,L=f[K+(f[E+(J<<2)>>2]<<2)>>2]|0,M=J+1|0,N=f[K+(f[E+((((M>>>0)%3|0|0)==0?J+-2|0:M)<<2)>>2]<<2)>>2]|0,M=f[K+(f[E+((((J>>>0)%3|0|0)==0?2:-1)+J<<2)>>2]<<2)>>2]|0,(L|0)<(G|0)&(N|0)<(G|0)&(M|0)<(G|0)):0){J=X(L,e)|0;L=X(N,e)|0;N=X(M,e)|0;if(z){M=0;do{f[k+(M<<2)>>2]=(f[b+(M+N<<2)>>2]|0)+(f[b+(M+L<<2)>>2]|0)-(f[b+(M+J<<2)>>2]|0);M=M+1|0}while((M|0)!=(e|0))}M=b+(q<<2)|0;J=c+(q<<2)|0;L=f[M+4>>2]|0;N=f[k>>2]|0;E=f[A>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=L;f[i>>2]=N;f[C>>2]=E;Od(d,s,h,i);f[J>>2]=f[d>>2];f[J+4>>2]=f[D>>2]}else{J=b+(q<<2)|0;E=b+((X(F+-2|0,e)|0)<<2)|0;N=c+(q<<2)|0;L=f[J+4>>2]|0;M=f[E>>2]|0;K=f[E+4>>2]|0;f[h>>2]=f[J>>2];f[t>>2]=L;f[i>>2]=M;f[v>>2]=K;Od(d,s,h,i);f[N>>2]=f[d>>2];f[N+4>>2]=f[w>>2]}if((F|0)<=2)break a;N=f[l>>2]|0;H=f[N>>2]|0;K=G+-1|0;if((f[N+4>>2]|0)-H>>2>>>0<=K>>>0){I=N;break}else{N=G;G=K;F=N}}aq(I)}while(0);if((e|0)<=0){O=a+8|0;P=b+4|0;Q=f[b>>2]|0;R=f[P>>2]|0;S=k+4|0;T=f[k>>2]|0;U=f[S>>2]|0;f[h>>2]=Q;V=h+4|0;f[V>>2]=R;f[i>>2]=T;W=i+4|0;f[W>>2]=U;Od(d,O,h,i);Y=f[d>>2]|0;f[c>>2]=Y;Z=d+4|0;_=f[Z>>2]|0;$=c+4|0;f[$>>2]=_;Mq(k);u=g;return 1}sj(k|0,0,e<<2|0)|0;O=a+8|0;P=b+4|0;Q=f[b>>2]|0;R=f[P>>2]|0;S=k+4|0;T=f[k>>2]|0;U=f[S>>2]|0;f[h>>2]=Q;V=h+4|0;f[V>>2]=R;f[i>>2]=T;W=i+4|0;f[W>>2]=U;Od(d,O,h,i);Y=f[d>>2]|0;f[c>>2]=Y;Z=d+4|0;_=f[Z>>2]|0;$=c+4|0;f[$>>2]=_;Mq(k);u=g;return 1}function pd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0;switch(c|0){case 1:{c=ln(60)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2076;i=c;f[a>>2]=i;return}case 2:{c=ln(60)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2132;i=c;f[a>>2]=i;return}case 4:{c=ln(168)|0;Ti(c,d,e,g);i=c;f[a>>2]=i;return}case 3:{c=ln(88)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2188;h=c+60|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;f[h+24>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=ln(104)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2244;f[c+60>>2]=0;f[c+64>>2]=0;f[c+76>>2]=0;f[c+80>>2]=0;f[c+84>>2]=0;h=c+88|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=ln(140)|0;f[c>>2]=1544;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];f[d+16>>2]=f[e+16>>2];f[d+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);e=c+44|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2300;f[c+64>>2]=0;f[c+68>>2]=0;e=c+72|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+60>>2]=2356;f[c+88>>2]=1;g=c+92|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;wn(c+108|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function qd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0;switch(c|0){case 1:{c=ln(60)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1656;i=c;f[a>>2]=i;return}case 2:{c=ln(60)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1712;i=c;f[a>>2]=i;return}case 4:{c=ln(168)|0;Ui(c,d,e,g);i=c;f[a>>2]=i;return}case 3:{c=ln(88)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1768;h=c+60|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;f[h+24>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=ln(104)|0;f[c>>2]=1544;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[h+16>>2]=f[e+16>>2];f[h+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);h=c+44|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=1824;f[c+60>>2]=0;f[c+64>>2]=0;f[c+76>>2]=0;f[c+80>>2]=0;f[c+84>>2]=0;h=c+88|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=ln(140)|0;f[c>>2]=1544;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];f[d+16>>2]=f[e+16>>2];f[d+20>>2]=f[e+20>>2];fk(c+32|0,e+24|0);e=c+44|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=1880;f[c+64>>2]=0;f[c+68>>2]=0;e=c+72|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+60>>2]=1936;f[c+88>>2]=1;g=c+92|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;wn(c+108|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function rd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+2|0;v=e+12|0;w=q+6|0;x=f[e>>2]|0;d:do if(!x)y=e;else{z=d[q>>1]|0;A=e;B=x;while(1){C=B+8|0;if(z<<16>>16!=(d[C>>1]|0)){y=A;break d}if((d[u>>1]|0)!=(d[C+2>>1]|0)){y=A;break d}if((d[v>>1]|0)!=(d[B+12>>1]|0)){y=A;break d}if((d[w>>1]|0)!=(d[C+6>>1]|0)){y=A;break d}C=f[B>>2]|0;if(!C){y=B;break}else{D=B;B=C;A=D}}}while(0);f[j>>2]=f[y>>2];f[y>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}else{e=c;while(1){w=f[e+4>>2]|0;if(w>>>0>>0)F=w;else F=(w>>>0)%(b>>>0)|0;if((F|0)==(k|0)){p=e;break c}w=(f[a>>2]|0)+(F<<2)|0;if(!(f[w>>2]|0)){r=e;s=F;t=w;break b}w=e+8|0;v=w+2|0;u=e+12|0;x=w+6|0;q=f[e>>2]|0;e:do if(!q)G=e;else{A=d[w>>1]|0;B=e;z=q;while(1){D=z+8|0;if(A<<16>>16!=(d[D>>1]|0)){G=B;break e}if((d[v>>1]|0)!=(d[D+2>>1]|0)){G=B;break e}if((d[u>>1]|0)!=(d[z+12>>1]|0)){G=B;break e}if((d[x>>1]|0)!=(d[D+6>>1]|0)){G=B;break e}D=f[z>>2]|0;if(!D){G=z;break}else{C=z;z=D;B=C}}}while(0);f[j>>2]=f[G>>2];f[G>>2]=f[f[(f[a>>2]|0)+(F<<2)>>2]>>2];f[f[(f[a>>2]|0)+(F<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}while(0);c=f[p>>2]|0;if(!c){E=43;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){E=43;break}else{k=s;l=r;n=r}}if((E|0)==43)return}function sd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+1|0;v=q+2|0;w=q+3|0;x=f[e>>2]|0;d:do if(!x)y=e;else{z=b[q>>0]|0;A=e;B=x;while(1){C=B+8|0;if(z<<24>>24!=(b[C>>0]|0)){y=A;break d}if((b[u>>0]|0)!=(b[C+1>>0]|0)){y=A;break d}if((b[v>>0]|0)!=(b[C+2>>0]|0)){y=A;break d}if((b[w>>0]|0)!=(b[C+3>>0]|0)){y=A;break d}C=f[B>>2]|0;if(!C){y=B;break}else{D=B;B=C;A=D}}}while(0);f[j>>2]=f[y>>2];f[y>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}else{e=d;while(1){w=f[e+4>>2]|0;if(w>>>0>>0)F=w;else F=(w>>>0)%(c>>>0)|0;if((F|0)==(k|0)){p=e;break c}w=(f[a>>2]|0)+(F<<2)|0;if(!(f[w>>2]|0)){r=e;s=F;t=w;break b}w=e+8|0;v=w+1|0;u=w+2|0;x=w+3|0;q=f[e>>2]|0;e:do if(!q)G=e;else{A=b[w>>0]|0;B=e;z=q;while(1){D=z+8|0;if(A<<24>>24!=(b[D>>0]|0)){G=B;break e}if((b[v>>0]|0)!=(b[D+1>>0]|0)){G=B;break e}if((b[u>>0]|0)!=(b[D+2>>0]|0)){G=B;break e}if((b[x>>0]|0)!=(b[D+3>>0]|0)){G=B;break e}D=f[z>>2]|0;if(!D){G=z;break}else{C=z;z=D;B=C}}}while(0);f[j>>2]=f[G>>2];f[G>>2]=f[f[(f[a>>2]|0)+(F<<2)>>2]>>2];f[f[(f[a>>2]|0)+(F<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){E=43;break a}}}while(0);d=f[p>>2]|0;if(!d){E=43;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){E=43;break}else{k=s;l=r;n=r}}if((E|0)==43)return}function td(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0;i=u;u=u+352|0;j=i+340|0;k=i+336|0;l=i+80|0;m=i+48|0;n=i;sj(l|0,0,256)|0;o=f[e+4>>2]|0;p=f[e>>2]|0;q=p;if((o|0)!=(p|0)){r=o-p>>2;p=0;do{o=l+(f[q+(p<<2)>>2]<<3)|0;s=o;t=Vn(f[s>>2]|0,f[s+4>>2]|0,1,0)|0;s=o;f[s>>2]=t;f[s+4>>2]=I;p=p+1|0}while(p>>>0>>0)}Gn(m);r=Tn(c|0,((c|0)<0)<<31>>31|0,5)|0;p=I;q=n+40|0;s=q;f[s>>2]=0;f[s+4>>2]=0;f[n>>2]=0;f[n+4>>2]=0;f[n+8>>2]=0;f[n+12>>2]=0;f[n+16>>2]=0;f[n+20>>2]=0;fd(n,l,32,g)|0;l=n+16|0;s=Tn(f[l>>2]|0,f[l+4>>2]|0,1)|0;l=g+4|0;t=(f[l>>2]|0)-(f[g>>2]|0)|0;o=q;f[o>>2]=t;f[o+4>>2]=0;o=Vn(s|0,I|0,39,0)|0;s=Yn(o|0,I|0,3)|0;o=Vn(s|0,I|0,8,0)|0;s=Vn(o|0,I|0,t|0,0)|0;Cl(g,s,I);s=n+24|0;f[s>>2]=(f[g>>2]|0)+(f[q>>2]|0);q=n+28|0;f[q>>2]=0;t=n+32|0;f[t>>2]=16384;zi(m,r,p,0)|0;p=c-d|0;if((p|0)>-1){c=(d|0)>0;r=m+16|0;o=m+12|0;v=p;do{w=f[e>>2]|0;x=f[w+(((v|0)/(d|0)|0)<<2)>>2]|0;y=f[n>>2]|0;z=f[y+(x<<3)>>2]|0;A=f[t>>2]|0;B=z<<10;if(A>>>0>>0){C=A;D=w}else{w=A;do{A=f[s>>2]|0;E=f[q>>2]|0;f[q>>2]=E+1;b[A+E>>0]=w;w=(f[t>>2]|0)>>>8;f[t>>2]=w}while(w>>>0>=B>>>0);C=w;D=f[e>>2]|0}f[t>>2]=(((C>>>0)/(z>>>0)|0)<<12)+((C>>>0)%(z>>>0)|0)+(f[y+(x<<3)+4>>2]|0);B=p-v|0;E=f[D+(((B|0)/(d|0)|0)<<2)>>2]|0;if(c&(E|0)>0){A=0;do{F=f[a+(A+B<<2)>>2]|0;G=r;H=f[G+4>>2]|0;if((H|0)>0|(H|0)==0&(f[G>>2]|0)>>>0>0){G=f[o>>2]|0;H=G+4|0;J=0;K=f[H>>2]|0;do{L=K>>>3;M=K&7;N=(f[G>>2]|0)+L|0;b[N>>0]=(1<>0]|0);N=(f[G>>2]|0)+L|0;b[N>>0]=(F>>>J&1)<>0]|0);K=(f[H>>2]|0)+1|0;f[H>>2]=K;J=J+1|0}while((J|0)!=(E|0))}A=A+1|0}while((A|0)!=(d|0))}v=v-d|0}while((v|0)>-1)}_f(n,g);eg(m);v=f[m>>2]|0;d=m+4|0;o=g+16|0;r=f[o+4>>2]|0;if(!((r|0)>0|(r|0)==0&(f[o>>2]|0)>>>0>0)){o=(f[d>>2]|0)-v|0;f[k>>2]=f[l>>2];f[j>>2]=f[k>>2];Me(g,j,v,v+o|0)|0}o=f[n>>2]|0;if(o|0){v=n+4|0;n=f[v>>2]|0;if((n|0)!=(o|0))f[v>>2]=n+(~((n+-8-o|0)>>>3)<<3);Oq(o)}o=m+12|0;n=f[o>>2]|0;f[o>>2]=0;if(n|0)Oq(n);n=f[m>>2]|0;if(!n){u=i;return 1}if((f[d>>2]|0)!=(n|0))f[d>>2]=n;Oq(n);u=i;return 1}function ud(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Oq(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}d=ln(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Oq(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=d+16|0;u=d+20|0;v=f[d>>2]|0;d:do if(!v)w=d;else{x=f[d+8>>2]|0;y=d;z=v;while(1){if((x|0)!=(f[z+8>>2]|0)){w=y;break d}if((f[p>>2]|0)!=(f[z+12>>2]|0)){w=y;break d}if((f[t>>2]|0)!=(f[z+16>>2]|0)){w=y;break d}if((f[u>>2]|0)!=(f[z+20>>2]|0)){w=y;break d}A=f[z>>2]|0;if(!A){w=z;break}else{B=z;z=A;y=B}}}while(0);f[i>>2]=f[w>>2];f[w>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){C=43;break a}}}else{d=c;while(1){u=f[d+4>>2]|0;if(u>>>0>>0)D=u;else D=(u>>>0)%(b>>>0)|0;if((D|0)==(j|0)){o=d;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){q=d;r=D;s=u;break b}u=d+12|0;t=d+16|0;p=d+20|0;v=f[d>>2]|0;e:do if(!v)E=d;else{y=f[d+8>>2]|0;z=d;x=v;while(1){if((y|0)!=(f[x+8>>2]|0)){E=z;break e}if((f[u>>2]|0)!=(f[x+12>>2]|0)){E=z;break e}if((f[t>>2]|0)!=(f[x+16>>2]|0)){E=z;break e}if((f[p>>2]|0)!=(f[x+20>>2]|0)){E=z;break e}B=f[x>>2]|0;if(!B){E=x;break}else{A=x;x=B;z=A}}}while(0);f[i>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){C=43;break a}}}while(0);c=f[o>>2]|0;if(!c){C=43;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){C=43;break}else{j=r;k=q;m=q}}if((C|0)==43)return}function vd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=e+12|0;v=f[e>>2]|0;d:do if(!v)w=e;else{x=d[q>>1]|0;y=q+2|0;z=e;A=v;while(1){B=A+8|0;if(x<<16>>16!=(d[B>>1]|0)){w=z;break d}if((d[y>>1]|0)!=(d[B+2>>1]|0)){w=z;break d}if((d[u>>1]|0)!=(d[A+12>>1]|0)){w=z;break d}B=f[A>>2]|0;if(!B){w=A;break}else{C=A;A=B;z=C}}}while(0);f[j>>2]=f[w>>2];f[w>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}else{e=c;while(1){u=f[e+4>>2]|0;if(u>>>0>>0)E=u;else E=(u>>>0)%(b>>>0)|0;if((E|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(E<<2)|0;if(!(f[u>>2]|0)){r=e;s=E;t=u;break b}u=e+8|0;v=e+12|0;q=f[e>>2]|0;e:do if(!q)F=e;else{z=d[u>>1]|0;A=u+2|0;y=e;x=q;while(1){C=x+8|0;if(z<<16>>16!=(d[C>>1]|0)){F=y;break e}if((d[A>>1]|0)!=(d[C+2>>1]|0)){F=y;break e}if((d[v>>1]|0)!=(d[x+12>>1]|0)){F=y;break e}C=f[x>>2]|0;if(!C){F=x;break}else{B=x;x=C;y=B}}}while(0);f[j>>2]=f[F>>2];f[F>>2]=f[f[(f[a>>2]|0)+(E<<2)>>2]>>2];f[f[(f[a>>2]|0)+(E<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}while(0);c=f[p>>2]|0;if(!c){D=41;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){D=41;break}else{k=s;l=r;n=r}}if((D|0)==41)return}function wd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=q+1|0;v=q+2|0;w=f[e>>2]|0;d:do if(!w)x=e;else{y=b[q>>0]|0;z=e;A=w;while(1){B=A+8|0;if(y<<24>>24!=(b[B>>0]|0)){x=z;break d}if((b[u>>0]|0)!=(b[B+1>>0]|0)){x=z;break d}if((b[v>>0]|0)!=(b[B+2>>0]|0)){x=z;break d}B=f[A>>2]|0;if(!B){x=A;break}else{C=A;A=B;z=C}}}while(0);f[j>>2]=f[x>>2];f[x>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}else{e=d;while(1){v=f[e+4>>2]|0;if(v>>>0>>0)E=v;else E=(v>>>0)%(c>>>0)|0;if((E|0)==(k|0)){p=e;break c}v=(f[a>>2]|0)+(E<<2)|0;if(!(f[v>>2]|0)){r=e;s=E;t=v;break b}v=e+8|0;u=v+1|0;w=v+2|0;q=f[e>>2]|0;e:do if(!q)F=e;else{z=b[v>>0]|0;A=e;y=q;while(1){C=y+8|0;if(z<<24>>24!=(b[C>>0]|0)){F=A;break e}if((b[u>>0]|0)!=(b[C+1>>0]|0)){F=A;break e}if((b[w>>0]|0)!=(b[C+2>>0]|0)){F=A;break e}C=f[y>>2]|0;if(!C){F=y;break}else{B=y;y=C;A=B}}}while(0);f[j>>2]=f[F>>2];f[F>>2]=f[f[(f[a>>2]|0)+(E<<2)>>2]>>2];f[f[(f[a>>2]|0)+(E<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){D=41;break a}}}while(0);d=f[p>>2]|0;if(!d){D=41;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){D=41;break}else{k=s;l=r;n=r}}if((D|0)==41)return}function xd(a,b){a=+a;b=+b;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;p[s>>3]=b;e=f[s>>2]|0;g=f[s+4>>2]|0;h=Yn(c|0,d|0,52)|0;i=h&2047;h=Yn(e|0,g|0,52)|0;j=h&2047;h=d&-2147483648;k=Tn(e|0,g|0,1)|0;l=I;a:do if(!((k|0)==0&(l|0)==0)?(m=yo(b)|0,n=I&2147483647,!((i|0)==2047|(n>>>0>2146435072|(n|0)==2146435072&m>>>0>0))):0){m=Tn(c|0,d|0,1)|0;n=I;if(!(n>>>0>l>>>0|(n|0)==(l|0)&m>>>0>k>>>0))return +((m|0)==(k|0)&(n|0)==(l|0)?a*0.0:a);if(!i){n=Tn(c|0,d|0,12)|0;m=I;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){o=0;q=n;n=m;while(1){m=o+-1|0;q=Tn(q|0,n|0,1)|0;n=I;if(!((n|0)>-1|(n|0)==-1&q>>>0>4294967295)){r=m;break}else o=m}}else r=0;o=Tn(c|0,d|0,1-r|0)|0;t=r;u=o;v=I}else{t=i;u=c;v=d&1048575|1048576}if(!j){o=Tn(e|0,g|0,12)|0;q=I;if((q|0)>-1|(q|0)==-1&o>>>0>4294967295){n=0;m=o;o=q;while(1){q=n+-1|0;m=Tn(m|0,o|0,1)|0;o=I;if(!((o|0)>-1|(o|0)==-1&m>>>0>4294967295)){w=q;break}else n=q}}else w=0;n=Tn(e|0,g|0,1-w|0)|0;x=w;y=n;z=I}else{x=j;y=e;z=g&1048575|1048576}n=Xn(u|0,v|0,y|0,z|0)|0;m=I;o=(m|0)>-1|(m|0)==-1&n>>>0>4294967295;b:do if((t|0)>(x|0)){q=t;A=m;B=o;C=u;D=v;E=n;while(1){if(B)if((E|0)==0&(A|0)==0)break;else{F=E;G=A}else{F=C;G=D}H=Tn(F|0,G|0,1)|0;J=I;K=q+-1|0;L=Xn(H|0,J|0,y|0,z|0)|0;M=I;N=(M|0)>-1|(M|0)==-1&L>>>0>4294967295;if((K|0)>(x|0)){q=K;A=M;B=N;C=H;D=J;E=L}else{O=K;P=N;Q=L;R=M;S=H;T=J;break b}}U=a*0.0;break a}else{O=t;P=o;Q=n;R=m;S=u;T=v}while(0);if(P)if((Q|0)==0&(R|0)==0){U=a*0.0;break}else{V=R;W=Q}else{V=T;W=S}if(V>>>0<1048576|(V|0)==1048576&W>>>0<0){m=O;n=W;o=V;while(1){E=Tn(n|0,o|0,1)|0;D=I;C=m+-1|0;if(D>>>0<1048576|(D|0)==1048576&E>>>0<0){m=C;n=E;o=D}else{X=C;Y=E;Z=D;break}}}else{X=O;Y=W;Z=V}if((X|0)>0){o=Vn(Y|0,Z|0,0,-1048576)|0;n=I;m=Tn(X|0,0,52)|0;_=n|I;$=o|m}else{m=Yn(Y|0,Z|0,1-X|0)|0;_=I;$=m}f[s>>2]=$;f[s+4>>2]=_|h;U=+p[s>>3]}else aa=3;while(0);if((aa|0)==3){ba=a*b;U=ba/ba}return +U}function yd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;d=u;u=u+32|0;e=d+8|0;g=d;h=c+4|0;i=f[(f[h>>2]|0)+48>>2]|0;j=c+12|0;c=f[j>>2]|0;k=ln(32)|0;f[e>>2]=k;f[e+8>>2]=-2147483616;f[e+4>>2]=17;l=k;m=14495;n=l+17|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[k+17>>0]=0;k=i+16|0;m=f[k>>2]|0;if(m){l=k;n=m;a:while(1){m=n;while(1){if((f[m+16>>2]|0)>=(c|0))break;o=f[m+4>>2]|0;if(!o){p=l;break a}else m=o}n=f[m>>2]|0;if(!n){p=m;break}else l=m}if(((p|0)!=(k|0)?(c|0)>=(f[p+16>>2]|0):0)?(c=p+20|0,(Jh(c,e)|0)!=0):0)q=Hk(c,e,-1)|0;else r=10}else r=10;if((r|0)==10)q=Hk(i,e,-1)|0;if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);f[e>>2]=-1;f[e+4>>2]=-1;f[e+8>>2]=-1;f[e+12>>2]=-1;i=(_((1<>>0<=28){f[e>>2]=i+1;q=2<>2]=q+-1;i=q+-2|0;f[e+8>>2]=i;f[e+12>>2]=(i|0)/2|0}switch(Xi(f[j>>2]|0,f[h>>2]|0)|0){case 6:{i=f[j>>2]|0;q=f[h>>2]|0;c=f[(f[(f[q+4>>2]|0)+8>>2]|0)+(i<<2)>>2]|0;do if((Qa[f[(f[q>>2]|0)+8>>2]&127](q)|0)==1){Hf(g,q,6,i,e,514);p=f[g>>2]|0;if(!p){f[g>>2]=0;s=g;r=21;break}else{t=g;v=p;break}}else{s=g;r=21}while(0);if((r|0)==21){i=ln(24)|0;f[i+4>>2]=c;c=i+8|0;f[c>>2]=f[e>>2];f[c+4>>2]=f[e+4>>2];f[c+8>>2]=f[e+8>>2];f[c+12>>2]=f[e+12>>2];f[i>>2]=2560;c=i;f[g>>2]=c;t=s;v=c}f[a>>2]=v;f[t>>2]=0;u=d;return}case 0:{t=f[j>>2]|0;j=f[h>>2]|0;h=f[(f[(f[j+4>>2]|0)+8>>2]|0)+(t<<2)>>2]|0;do if((Qa[f[(f[j>>2]|0)+8>>2]&127](j)|0)==1){Hf(g,j,0,t,e,514);v=f[g>>2]|0;if(!v){f[g>>2]=0;w=g;r=28;break}else{x=g;y=v;break}}else{w=g;r=28}while(0);if((r|0)==28){r=ln(24)|0;f[r+4>>2]=h;h=r+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];f[r>>2]=2560;e=r;f[g>>2]=e;x=w;y=e}f[a>>2]=y;f[x>>2]=0;u=d;return}default:{f[a>>2]=0;u=d;return}}}function zd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Oq(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}d=ln(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Oq(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=d+16|0;u=f[d>>2]|0;d:do if(!u)v=d;else{w=f[d+8>>2]|0;x=d;y=u;while(1){if((w|0)!=(f[y+8>>2]|0)){v=x;break d}if((f[p>>2]|0)!=(f[y+12>>2]|0)){v=x;break d}if((f[t>>2]|0)!=(f[y+16>>2]|0)){v=x;break d}z=f[y>>2]|0;if(!z){v=y;break}else{A=y;y=z;x=A}}}while(0);f[i>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){B=41;break a}}}else{d=c;while(1){t=f[d+4>>2]|0;if(t>>>0>>0)C=t;else C=(t>>>0)%(b>>>0)|0;if((C|0)==(j|0)){o=d;break c}t=(f[a>>2]|0)+(C<<2)|0;if(!(f[t>>2]|0)){q=d;r=C;s=t;break b}t=d+12|0;p=d+16|0;u=f[d>>2]|0;e:do if(!u)D=d;else{x=f[d+8>>2]|0;y=d;w=u;while(1){if((x|0)!=(f[w+8>>2]|0)){D=y;break e}if((f[t>>2]|0)!=(f[w+12>>2]|0)){D=y;break e}if((f[p>>2]|0)!=(f[w+16>>2]|0)){D=y;break e}A=f[w>>2]|0;if(!A){D=w;break}else{z=w;w=A;y=z}}}while(0);f[i>>2]=f[D>>2];f[D>>2]=f[f[(f[a>>2]|0)+(C<<2)>>2]>>2];f[f[(f[a>>2]|0)+(C<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){B=41;break a}}}while(0);c=f[o>>2]|0;if(!c){B=41;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){B=41;break}else{j=r;k=q;m=q}}if((B|0)==41)return}function Ad(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0;switch(c|0){case 1:{c=ln(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2980;i=c;f[a>>2]=i;return}case 2:{c=ln(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=3036;i=c;f[a>>2]=i;return}case 4:{c=ln(152)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=3092;h=c+96|0;b=c+40|0;j=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Zm(h);f[c+136>>2]=0;f[c+140>>2]=0;f[c+144>>2]=0;i=c;f[a>>2]=i;return}case 3:{c=ln(68)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=3148;h=c+40|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;f[h+24>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=ln(84)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=3204;f[c+40>>2]=0;f[c+44>>2]=0;f[c+56>>2]=0;f[c+60>>2]=0;f[c+64>>2]=0;h=c+68|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=ln(120)|0;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];e=c+24|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=3260;f[c+44>>2]=0;f[c+48>>2]=0;e=c+52|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+40>>2]=3316;f[c+68>>2]=1;g=c+72|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;wn(c+88|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Bd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){o=d;while(1){e=f[o+4>>2]|0;if(!i)if(e>>>0>>0)p=e;else p=(e>>>0)%(c>>>0)|0;else p=e&h;if((p|0)==(k|0))break;q=(f[a>>2]|0)+(p<<2)|0;if(!(f[q>>2]|0))break b;e=f[o>>2]|0;c:do if(!e)r=o;else{s=o+8|0;t=b[s+11>>0]|0;u=t<<24>>24<0;v=t&255;t=u?f[o+12>>2]|0:v;w=(t|0)==0;if(u){u=o;x=e;while(1){y=x+8|0;z=b[y+11>>0]|0;A=z<<24>>24<0;if((t|0)!=((A?f[x+12>>2]|0:z&255)|0)){r=u;break c}if(!w?Vk(f[s>>2]|0,A?f[y>>2]|0:y,t)|0:0){r=u;break c}y=f[x>>2]|0;if(!y){r=x;break c}else{A=x;x=y;u=A}}}if(w){u=o;x=e;while(1){A=b[x+8+11>>0]|0;if((A<<24>>24<0?f[x+12>>2]|0:A&255)|0){r=u;break c}A=f[x>>2]|0;if(!A){r=x;break c}else{y=x;x=A;u=y}}}u=o;x=e;while(1){w=x+8|0;y=b[w+11>>0]|0;A=y<<24>>24<0;if((t|0)!=((A?f[x+12>>2]|0:y&255)|0)){r=u;break c}y=A?f[w>>2]|0:w;if((b[y>>0]|0)==(f[s>>2]&255)<<24>>24){B=s;C=v;D=y}else{r=u;break c}while(1){C=C+-1|0;B=B+1|0;if(!C)break;D=D+1|0;if((b[B>>0]|0)!=(b[D>>0]|0)){r=u;break c}}y=f[x>>2]|0;if(!y){r=x;break}else{w=x;x=y;u=w}}}while(0);f[j>>2]=f[r>>2];f[r>>2]=f[f[(f[a>>2]|0)+(p<<2)>>2]>>2];f[f[(f[a>>2]|0)+(p<<2)>>2]>>2]=o;e=f[g>>2]|0;if(!e){E=43;break a}else o=e}d=f[o>>2]|0;if(!d){E=43;break a}else{g=o;j=o}}f[q>>2]=j;m=f[o>>2]|0;if(!m){E=43;break}else{k=p;l=o;n=o}}if((E|0)==43)return}function Cd(a,b,c,d,e,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;var i=0,j=0;switch(c|0){case 1:{c=ln(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2616;i=c;f[a>>2]=i;return}case 2:{c=ln(40)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2672;i=c;f[a>>2]=i;return}case 4:{c=ln(152)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2728;h=c+96|0;b=c+40|0;j=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));Zm(h);f[c+136>>2]=0;f[c+140>>2]=0;f[c+144>>2]=0;i=c;f[a>>2]=i;return}case 3:{c=ln(68)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2784;h=c+40|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;f[h+24>>2]=0;i=c;f[a>>2]=i;return}case 5:{c=ln(84)|0;f[c+4>>2]=d;h=c+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[h+12>>2]=f[e+12>>2];h=c+24|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];f[c>>2]=2840;f[c+40>>2]=0;f[c+44>>2]=0;f[c+56>>2]=0;f[c+60>>2]=0;f[c+64>>2]=0;h=c+68|0;f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];f[h+12>>2]=f[g+12>>2];i=c;f[a>>2]=i;return}case 6:{c=ln(120)|0;f[c+4>>2]=d;d=c+8|0;f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];f[d+8>>2]=f[e+8>>2];f[d+12>>2]=f[e+12>>2];e=c+24|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c>>2]=2896;f[c+44>>2]=0;f[c+48>>2]=0;e=c+52|0;f[e>>2]=f[g>>2];f[e+4>>2]=f[g+4>>2];f[e+8>>2]=f[g+8>>2];f[e+12>>2]=f[g+12>>2];f[c+40>>2]=2952;f[c+68>>2]=1;g=c+72|0;f[g>>2]=-1;f[g+4>>2]=-1;f[g+8>>2]=-1;f[g+12>>2]=-1;wn(c+88|0);i=c;f[a>>2]=i;return}default:{i=0;f[a>>2]=i;return}}}function Dd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+48|0;d=c+8|0;e=c+4|0;g=c;h=a+44|0;ci(f[h>>2]|0,b)|0;if(f[h>>2]|0){wn(d);tk(d);i=(f[h>>2]|0)+-1|0;if((i|0)>-1){h=a+40|0;j=i;do{fj(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);j=j+-1|0}while((j|0)>-1)}ld(d,b);Fj(d)}j=a+56|0;ci(f[j>>2]|0,b)|0;if(f[j>>2]|0){wn(d);tk(d);h=(f[j>>2]|0)+-2|0;if((h|0)>-1){j=a+52|0;i=h;do{fj(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);h=i+1|0;fj(d,(f[(f[j>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);i=i+-2|0}while((i|0)>-1)}ld(d,b);Fj(d)}i=a+68|0;ci(f[i>>2]|0,b)|0;if(f[i>>2]|0){wn(d);tk(d);j=(f[i>>2]|0)+-3|0;if((j|0)>-1){i=a+64|0;h=j;do{fj(d,(f[(f[i>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);j=h+1|0;fj(d,(f[(f[i>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);j=h+2|0;fj(d,(f[(f[i>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);h=h+-3|0}while((h|0)>-1)}ld(d,b);Fj(d)}h=a+80|0;ci(f[h>>2]|0,b)|0;if(f[h>>2]|0){wn(d);tk(d);i=(f[h>>2]|0)+-4|0;if((i|0)>-1){h=a+76|0;j=i;do{fj(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);i=j+1|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);i=j+2|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);i=j+3|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);j=j+-4|0}while((j|0)>-1)}ld(d,b);Fj(d)}f[g>>2]=f[a+12>>2];j=b+16|0;h=j;i=f[h>>2]|0;k=f[h+4>>2]|0;if((k|0)>0|(k|0)==0&i>>>0>0){l=k;m=i}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;i=j;l=f[i+4>>2]|0;m=f[i>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;u=c;return 1}function Ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+48|0;d=c+8|0;e=c+4|0;g=c;h=a+64|0;ci(f[h>>2]|0,b)|0;if(f[h>>2]|0){wn(d);tk(d);i=(f[h>>2]|0)+-1|0;if((i|0)>-1){h=a+60|0;j=i;do{fj(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);j=j+-1|0}while((j|0)>-1)}ld(d,b);Fj(d)}j=a+76|0;ci(f[j>>2]|0,b)|0;if(f[j>>2]|0){wn(d);tk(d);h=(f[j>>2]|0)+-2|0;if((h|0)>-1){j=a+72|0;i=h;do{fj(d,(f[(f[j>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);h=i+1|0;fj(d,(f[(f[j>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);i=i+-2|0}while((i|0)>-1)}ld(d,b);Fj(d)}i=a+88|0;ci(f[i>>2]|0,b)|0;if(f[i>>2]|0){wn(d);tk(d);j=(f[i>>2]|0)+-3|0;if((j|0)>-1){i=a+84|0;h=j;do{fj(d,(f[(f[i>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0)!=0);j=h+1|0;fj(d,(f[(f[i>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);j=h+2|0;fj(d,(f[(f[i>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);h=h+-3|0}while((h|0)>-1)}ld(d,b);Fj(d)}h=a+100|0;ci(f[h>>2]|0,b)|0;if(f[h>>2]|0){wn(d);tk(d);i=(f[h>>2]|0)+-4|0;if((i|0)>-1){h=a+96|0;j=i;do{fj(d,(f[(f[h>>2]|0)+(j>>>5<<2)>>2]&1<<(j&31)|0)!=0);i=j+1|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);i=j+2|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);i=j+3|0;fj(d,(f[(f[h>>2]|0)+(i>>>5<<2)>>2]&1<<(i&31)|0)!=0);j=j+-4|0}while((j|0)>-1)}ld(d,b);Fj(d)}f[g>>2]=f[a+12>>2];j=b+16|0;h=j;i=f[h>>2]|0;k=f[h+4>>2]|0;if((k|0)>0|(k|0)==0&i>>>0>0){l=k;m=i}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;i=j;l=f[i+4>>2]|0;m=f[i>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;u=c;return 1}function Fd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){g=l;c=m;j=n;b:while(1){c:do if(i){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=f[e>>2]|0;d:do if(!u)v=e;else{w=d[q>>1]|0;x=q+2|0;y=e;z=u;while(1){A=z+8|0;if(w<<16>>16!=(d[A>>1]|0)){v=y;break d}if((d[x>>1]|0)!=(d[A+2>>1]|0)){v=y;break d}A=f[z>>2]|0;if(!A){v=z;break}else{B=z;z=A;y=B}}}while(0);f[j>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}else{e=c;while(1){u=f[e+4>>2]|0;if(u>>>0>>0)D=u;else D=(u>>>0)%(b>>>0)|0;if((D|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){r=e;s=D;t=u;break b}u=e+8|0;q=f[e>>2]|0;e:do if(!q)E=e;else{y=d[u>>1]|0;z=u+2|0;x=e;w=q;while(1){B=w+8|0;if(y<<16>>16!=(d[B>>1]|0)){E=x;break e}if((d[z>>1]|0)!=(d[B+2>>1]|0)){E=x;break e}B=f[w>>2]|0;if(!B){E=w;break}else{A=w;w=B;x=A}}}while(0);f[j>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}while(0);c=f[p>>2]|0;if(!c){C=39;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){C=39;break}else{k=s;l=r;n=r}}if((C|0)==39)return}function Gd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){g=l;d=m;j=n;b:while(1){c:do if(i){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0)){p=e;break c}q=(f[a>>2]|0)+(o<<2)|0;if(!(f[q>>2]|0)){r=e;s=o;t=q;break b}q=e+8|0;u=f[e>>2]|0;d:do if(!u)v=e;else{w=b[q>>0]|0;x=q+1|0;y=e;z=u;while(1){A=z+8|0;if(w<<24>>24!=(b[A>>0]|0)){v=y;break d}if((b[x>>0]|0)!=(b[A+1>>0]|0)){v=y;break d}A=f[z>>2]|0;if(!A){v=z;break}else{B=z;z=A;y=B}}}while(0);f[j>>2]=f[v>>2];f[v>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}else{e=d;while(1){u=f[e+4>>2]|0;if(u>>>0>>0)D=u;else D=(u>>>0)%(c>>>0)|0;if((D|0)==(k|0)){p=e;break c}u=(f[a>>2]|0)+(D<<2)|0;if(!(f[u>>2]|0)){r=e;s=D;t=u;break b}u=e+8|0;q=f[e>>2]|0;e:do if(!q)E=e;else{y=b[u>>0]|0;z=u+1|0;x=e;w=q;while(1){B=w+8|0;if(y<<24>>24!=(b[B>>0]|0)){E=x;break e}if((b[z>>0]|0)!=(b[B+1>>0]|0)){E=x;break e}B=f[w>>2]|0;if(!B){E=w;break}else{A=w;w=B;x=A}}}while(0);f[j>>2]=f[E>>2];f[E>>2]=f[f[(f[a>>2]|0)+(D<<2)>>2]>>2];f[f[(f[a>>2]|0)+(D<<2)>>2]>>2]=e;e=f[g>>2]|0;if(!e){C=39;break a}}}while(0);d=f[p>>2]|0;if(!d){C=39;break a}else{g=p;j=p}}f[t>>2]=j;m=f[r>>2]|0;if(!m){C=39;break}else{k=s;l=r;n=r}}if((C|0)==39)return}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;c=u;u=u+48|0;d=c+32|0;e=c+28|0;g=c+16|0;h=c;i=a+16|0;j=f[i>>2]|0;if(j|0){k=f[b>>2]|0;l=i;m=j;a:while(1){j=m;while(1){if((f[j+16>>2]|0)>=(k|0))break;n=f[j+4>>2]|0;if(!n){o=l;break a}else j=n}m=f[j>>2]|0;if(!m){o=j;break}else l=j}if((o|0)!=(i|0)?(k|0)>=(f[o+16>>2]|0):0){p=o;q=p+20|0;u=c;return q|0}}lp(g);f[h>>2]=f[b>>2];b=h+4|0;f[h+8>>2]=0;o=h+12|0;f[o>>2]=0;k=h+8|0;f[b>>2]=k;l=f[g>>2]|0;m=g+4|0;if((l|0)!=(m|0)){n=k;r=l;while(1){l=r+16|0;f[e>>2]=n;f[d>>2]=f[e>>2];ph(b,d,l,l)|0;l=f[r+4>>2]|0;if(!l){s=r+8|0;t=f[s>>2]|0;if((f[t>>2]|0)==(r|0))v=t;else{t=s;do{s=f[t>>2]|0;t=s+8|0;w=f[t>>2]|0}while((f[w>>2]|0)!=(s|0));v=w}}else{t=l;while(1){j=f[t>>2]|0;if(!j)break;else t=j}v=t}if((v|0)==(m|0))break;else r=v}}v=a+12|0;r=f[i>>2]|0;do if(r){d=f[h>>2]|0;e=a+16|0;n=r;while(1){l=f[n+16>>2]|0;if((d|0)<(l|0)){j=f[n>>2]|0;if(!j){x=23;break}else{y=n;z=j}}else{if((l|0)>=(d|0)){x=27;break}A=n+4|0;l=f[A>>2]|0;if(!l){x=26;break}else{y=A;z=l}}e=y;n=z}if((x|0)==23){B=n;C=n;break}else if((x|0)==26){B=n;C=A;break}else if((x|0)==27){B=n;C=e;break}}else{B=i;C=i}while(0);i=f[C>>2]|0;if(!i){x=ln(32)|0;f[x+16>>2]=f[h>>2];A=x+20|0;f[A>>2]=f[b>>2];z=x+24|0;y=f[h+8>>2]|0;f[z>>2]=y;r=f[o>>2]|0;f[x+28>>2]=r;if(!r)f[A>>2]=z;else{f[y+8>>2]=z;f[b>>2]=k;f[k>>2]=0;f[o>>2]=0}f[x>>2]=0;f[x+4>>2]=0;f[x+8>>2]=B;f[C>>2]=x;B=f[f[v>>2]>>2]|0;if(!B)D=x;else{f[v>>2]=B;D=f[C>>2]|0}Oe(f[a+16>>2]|0,D);D=a+20|0;f[D>>2]=(f[D>>2]|0)+1;E=x}else E=i;Ej(h+4|0,f[k>>2]|0);Ej(g,f[m>>2]|0);p=E;q=p+20|0;u=c;return q|0}function Id(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;d=b[c+11>>0]|0;e=d<<24>>24<0;g=e?f[c>>2]|0:c;i=e?f[c+4>>2]|0:d&255;if(i>>>0>3){d=g;c=i;e=i;while(1){j=X(h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24,1540483477)|0;c=(X(j>>>24^j,1540483477)|0)^(X(c,1540483477)|0);e=e+-4|0;if(e>>>0<=3)break;else d=d+4|0}d=i+-4|0;e=d&-4;k=d-e|0;l=g+(e+4)|0;m=c}else{k=i;l=g;m=i}switch(k|0){case 3:{n=h[l+2>>0]<<16^m;o=6;break}case 2:{n=m;o=6;break}case 1:{p=m;o=7;break}default:q=m}if((o|0)==6){p=h[l+1>>0]<<8^n;o=7}if((o|0)==7)q=X(p^h[l>>0],1540483477)|0;l=X(q>>>13^q,1540483477)|0;q=l>>>15^l;l=f[a+4>>2]|0;if(!l){r=0;return r|0}p=l+-1|0;n=(p&l|0)==0;if(!n)if(q>>>0>>0)s=q;else s=(q>>>0)%(l>>>0)|0;else s=q&p;m=f[(f[a>>2]|0)+(s<<2)>>2]|0;if(!m){r=0;return r|0}a=f[m>>2]|0;if(!a){r=0;return r|0}m=(i|0)==0;if(n){n=a;a:while(1){k=f[n+4>>2]|0;c=(k|0)==(q|0);if(!(c|(k&p|0)==(s|0))){r=0;o=40;break}do if(c?(k=n+8|0,e=b[k+11>>0]|0,d=e<<24>>24<0,j=e&255,((d?f[n+12>>2]|0:j)|0)==(i|0)):0){e=f[k>>2]|0;t=d?e:k;if(d){if(m){r=n;o=40;break a}if(!(Vk(t,g,i)|0)){r=n;o=40;break a}else break}if(m){r=n;o=40;break a}if((b[g>>0]|0)==(e&255)<<24>>24){e=k;k=j;j=g;do{k=k+-1|0;e=e+1|0;if(!k){r=n;o=40;break a}j=j+1|0}while((b[e>>0]|0)==(b[j>>0]|0))}}while(0);n=f[n>>2]|0;if(!n){r=0;o=40;break}}if((o|0)==40)return r|0}else u=a;b:while(1){a=f[u+4>>2]|0;do if((a|0)==(q|0)){n=u+8|0;p=b[n+11>>0]|0;c=p<<24>>24<0;j=p&255;if(((c?f[u+12>>2]|0:j)|0)==(i|0)){p=f[n>>2]|0;e=c?p:n;if(c){if(m){r=u;o=40;break b}if(!(Vk(e,g,i)|0)){r=u;o=40;break b}else break}if(m){r=u;o=40;break b}if((b[g>>0]|0)==(p&255)<<24>>24){p=n;n=j;j=g;do{n=n+-1|0;p=p+1|0;if(!n){r=u;o=40;break b}j=j+1|0}while((b[p>>0]|0)==(b[j>>0]|0))}}}else{if(a>>>0>>0)v=a;else v=(a>>>0)%(l>>>0)|0;if((v|0)!=(s|0)){r=0;o=40;break b}}while(0);u=f[u>>2]|0;if(!u){r=0;o=40;break}}if((o|0)==40)return r|0;return 0}function Jd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Oq(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}d=ln(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Oq(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){e=k;c=l;i=m;b:while(1){c:do if(h){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(n<<2)|0;if(!(f[p>>2]|0)){q=d;r=n;s=p;break b}p=d+12|0;t=f[d>>2]|0;d:do if(!t)u=d;else{v=f[d+8>>2]|0;w=d;x=t;while(1){if((v|0)!=(f[x+8>>2]|0)){u=w;break d}if((f[p>>2]|0)!=(f[x+12>>2]|0)){u=w;break d}y=f[x>>2]|0;if(!y){u=x;break}else{z=x;x=y;w=z}}}while(0);f[i>>2]=f[u>>2];f[u>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){A=39;break a}}}else{d=c;while(1){p=f[d+4>>2]|0;if(p>>>0>>0)B=p;else B=(p>>>0)%(b>>>0)|0;if((B|0)==(j|0)){o=d;break c}p=(f[a>>2]|0)+(B<<2)|0;if(!(f[p>>2]|0)){q=d;r=B;s=p;break b}p=d+12|0;t=f[d>>2]|0;e:do if(!t)C=d;else{w=f[d+8>>2]|0;x=d;v=t;while(1){if((w|0)!=(f[v+8>>2]|0)){C=x;break e}if((f[p>>2]|0)!=(f[v+12>>2]|0)){C=x;break e}z=f[v>>2]|0;if(!z){C=v;break}else{y=v;v=z;x=y}}}while(0);f[i>>2]=f[C>>2];f[C>>2]=f[f[(f[a>>2]|0)+(B<<2)>>2]>>2];f[f[(f[a>>2]|0)+(B<<2)>>2]>>2]=d;d=f[e>>2]|0;if(!d){A=39;break a}}}while(0);c=f[o>>2]|0;if(!c){A=39;break a}else{e=o;i=o}}f[s>>2]=i;l=f[q>>2]|0;if(!l){A=39;break}else{j=r;k=q;m=q}}if((A|0)==39)return}function Kd(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=a+4|0;i=f[c>>2]|0;c=i;do if((i|0)!=(h|0)){j=i+16|0;k=b[j+11>>0]|0;l=k<<24>>24<0;m=l?f[i+20>>2]|0:k&255;k=b[g+11>>0]|0;n=k<<24>>24<0;o=n?f[g+4>>2]|0:k&255;k=m>>>0>>0;p=k?m:o;if((p|0)!=0?(q=Vk(n?f[g>>2]|0:g,l?f[j>>2]|0:j,p)|0,(q|0)!=0):0){if((q|0)<0)break}else r=4;if((r|0)==4?o>>>0>>0:0)break;q=o>>>0>>0?o:m;if((q|0)!=0?(m=Vk(l?f[j>>2]|0:j,n?f[g>>2]|0:g,q)|0,(m|0)!=0):0){if((m|0)>=0)r=37}else r=21;if((r|0)==21?!k:0)r=37;if((r|0)==37){f[d>>2]=c;f[e>>2]=c;s=e;return s|0}k=f[i+4>>2]|0;m=(k|0)==0;if(m){q=i+8|0;j=f[q>>2]|0;if((f[j>>2]|0)==(i|0))t=j;else{j=q;do{q=f[j>>2]|0;j=q+8|0;l=f[j>>2]|0}while((f[l>>2]|0)!=(q|0));t=l}}else{j=k;while(1){l=f[j>>2]|0;if(!l)break;else j=l}t=j}do if((t|0)!=(h|0)){k=t+16|0;l=b[k+11>>0]|0;q=l<<24>>24<0;p=q?f[t+20>>2]|0:l&255;l=p>>>0>>0?p:o;if((l|0)!=0?(u=Vk(n?f[g>>2]|0:g,q?f[k>>2]|0:k,l)|0,(u|0)!=0):0){if((u|0)<0)break}else r=31;if((r|0)==31?o>>>0

>>0:0)break;s=yg(a,d,g)|0;return s|0}while(0);if(m){f[d>>2]=c;s=i+4|0;return s|0}else{f[d>>2]=t;s=t;return s|0}}while(0);t=f[i>>2]|0;do if((f[a>>2]|0)==(i|0))v=c;else{if(!t){h=i;while(1){e=f[h+8>>2]|0;if((f[e>>2]|0)==(h|0))h=e;else{w=e;break}}}else{h=t;while(1){m=f[h+4>>2]|0;if(!m){w=h;break}else h=m}}h=w;m=w+16|0;e=b[g+11>>0]|0;o=e<<24>>24<0;n=o?f[g+4>>2]|0:e&255;e=b[m+11>>0]|0;j=e<<24>>24<0;p=j?f[w+20>>2]|0:e&255;e=n>>>0

>>0?n:p;if((e|0)!=0?(u=Vk(j?f[m>>2]|0:m,o?f[g>>2]|0:g,e)|0,(u|0)!=0):0){if((u|0)<0){v=h;break}}else r=13;if((r|0)==13?p>>>0>>0:0){v=h;break}s=yg(a,d,g)|0;return s|0}while(0);if(!t){f[d>>2]=i;s=i;return s|0}else{f[d>>2]=v;s=v+4|0;return s|0}return 0}function Ld(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a;h=b;i=h;j=c;k=d;l=k;if(!i){m=(e|0)!=0;if(!l){if(m){f[e>>2]=(g>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return (I=n,o)|0}else{if(!m){n=0;o=0;return (I=n,o)|0}f[e>>2]=a|0;f[e+4>>2]=b&0;n=0;o=0;return (I=n,o)|0}}m=(l|0)==0;do if(j){if(!m){p=(_(l|0)|0)-(_(i|0)|0)|0;if(p>>>0<=31){q=p+1|0;r=31-p|0;s=p-31>>31;t=q;u=g>>>(q>>>0)&s|i<>>(q>>>0)&s;w=0;x=g<>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (I=n,o)|0}r=j-1|0;if(r&j|0){s=(_(j|0)|0)+33-(_(i|0)|0)|0;q=64-s|0;p=32-s|0;y=p>>31;z=s-32|0;A=z>>31;t=s;u=p-1>>31&i>>>(z>>>0)|(i<>>(s>>>0))&A;v=A&i>>>(s>>>0);w=g<>>(z>>>0))&y|g<>31;break}if(e|0){f[e>>2]=r&g;f[e+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return (I=n,o)|0}else{r=vm(j|0)|0;n=i>>>(r>>>0)|0;o=i<<32-r|g>>>(r>>>0)|0;return (I=n,o)|0}}else{if(m){if(e|0){f[e>>2]=(i>>>0)%(j>>>0);f[e+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return (I=n,o)|0}if(!g){if(e|0){f[e>>2]=0;f[e+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return (I=n,o)|0}r=l-1|0;if(!(r&l)){if(e|0){f[e>>2]=a|0;f[e+4>>2]=r&i|b&0}n=0;o=i>>>((vm(l|0)|0)>>>0);return (I=n,o)|0}r=(_(l|0)|0)-(_(i|0)|0)|0;if(r>>>0<=30){s=r+1|0;p=31-r|0;t=s;u=i<>>(s>>>0);v=i>>>(s>>>0);w=0;x=g<>2]=a|0;f[e+4>>2]=h|b&0;n=0;o=0;return (I=n,o)|0}while(0);if(!t){B=x;C=w;D=v;E=u;F=0;G=0}else{b=c|0|0;c=k|d&0;d=Vn(b|0,c|0,-1,-1)|0;k=I;h=x;x=w;w=v;v=u;u=t;t=0;do{a=h;h=x>>>31|h<<1;x=t|x<<1;g=v<<1|a>>>31|0;a=v>>>31|w<<1|0;Xn(d|0,k|0,g|0,a|0)|0;i=I;l=i>>31|((i|0)<0?-1:0)<<1;t=l&1;v=Xn(g|0,a|0,l&b|0,(((i|0)<0?-1:0)>>31|((i|0)<0?-1:0)<<1)&c|0)|0;w=I;u=u-1|0}while((u|0)!=0);B=h;C=x;D=w;E=v;F=0;G=t}t=C;C=0;if(e|0){f[e>>2]=E;f[e+4>>2]=D}n=(t|0)>>>31|(B|C)<<1|(C<<1|t>>>31)&0|F;o=(t<<1|0>>>31)&-2|G;return (I=n,o)|0}function Md(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=u;u=u+16|0;h=g;f[c+48>>2]=d;f[c+44>>2]=e;e=f[c+8>>2]|0;d=c+12|0;i=f[d>>2]|0;if((i|0)!=(e|0)){j=i;do{i=j+-4|0;f[d>>2]=i;k=f[i>>2]|0;f[i>>2]=0;if(k|0)Va[f[(f[k>>2]|0)+4>>2]&127](k);j=f[d>>2]|0}while((j|0)!=(e|0))}e=f[c+20>>2]|0;j=c+24|0;d=f[j>>2]|0;if((d|0)!=(e|0))f[j>>2]=d+(~((d+-4-e|0)>>>2)<<2);e=f[c+32>>2]|0;d=c+36|0;j=f[d>>2]|0;if((j|0)!=(e|0))f[d>>2]=j+(~((j+-4-e|0)>>>2)<<2);if(!(f[c+4>>2]|0)){e=ln(32)|0;f[h>>2]=e;f[h+8>>2]=-2147483616;f[h+4>>2]=23;l=e;m=15706;n=l+23|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[e+23>>0]=0;f[a>>2]=-1;pj(a+4|0,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}Ud(a,c);if(f[a>>2]|0){u=g;return}e=a+4|0;j=e+11|0;if((b[j>>0]|0)<0)Oq(f[e>>2]|0);Wi(a,c);if(f[a>>2]|0){u=g;return}if((b[j>>0]|0)<0)Oq(f[e>>2]|0);if(!(Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0)){j=ln(32)|0;f[h>>2]=j;f[h+8>>2]=-2147483616;f[h+4>>2]=29;l=j;m=15730;n=l+29|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[j+29>>0]=0;f[a>>2]=-1;pj(e,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}if(!(Qa[f[(f[c>>2]|0)+20>>2]&127](c)|0)){j=ln(32)|0;f[h>>2]=j;f[h+8>>2]=-2147483616;f[h+4>>2]=31;l=j;m=15760;n=l+31|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[j+31>>0]=0;f[a>>2]=-1;pj(e,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}if(!(Qa[f[(f[c>>2]|0)+24>>2]&127](c)|0)){j=ln(32)|0;f[h>>2]=j;f[h+8>>2]=-2147483616;f[h+4>>2]=31;l=j;m=15792;n=l+31|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[j+31>>0]=0;f[a>>2]=-1;pj(e,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}if(Qa[f[(f[c>>2]|0)+28>>2]&127](c)|0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=g;return}c=ln(48)|0;f[h>>2]=c;f[h+8>>2]=-2147483600;f[h+4>>2]=34;l=c;m=15824;n=l+34|0;do{b[l>>0]=b[m>>0]|0;l=l+1|0;m=m+1|0}while((l|0)<(n|0));b[c+34>>0]=0;f[a>>2]=-1;pj(e,h);if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);u=g;return}function Nd(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=u;u=u+32|0;d=c+4|0;e=c;g=c+16|0;h=a+48|0;i=f[h>>2]|0;j=ln(32)|0;f[d>>2]=j;f[d+8>>2]=-2147483616;f[d+4>>2]=20;k=j;l=14538;m=k+20|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[j+20>>0]=0;j=Fk(i+24|0,d)|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);i=f[h>>2]|0;n=ln(32)|0;f[d>>2]=n;f[d+8>>2]=-2147483616;f[d+4>>2]=22;k=n;l=14559;m=k+22|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[n+22>>0]=0;n=Fk(i+24|0,d)|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);i=a+56|0;o=f[i>>2]|0;f[i>>2]=0;if(o|0)Va[f[(f[o>>2]|0)+4>>2]&127](o);o=f[a+52>>2]|0;p=(((f[o+100>>2]|0)-(f[o+96>>2]|0)|0)/12|0)>>>0<1e3;o=f[h>>2]|0;q=ln(32)|0;f[d>>2]=q;f[d+8>>2]=-2147483616;f[d+4>>2]=18;k=q;l=14582;m=k+18|0;do{b[k>>0]=b[l>>0]|0;k=k+1|0;l=l+1|0}while((k|0)<(m|0));b[q+18>>0]=0;q=Hk(o,d,-1)|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);switch(q|0){case -1:{if(j?p|((mi(f[h>>2]|0)|0)>4|n^1):0)r=13;else r=17;break}case 0:{if(j)r=13;else r=21;break}case 2:{r=17;break}default:r=21}if((r|0)==13){j=f[a+44>>2]|0;b[g>>0]=0;n=j+16|0;h=f[n+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[n>>2]|0)>>>0>0)){f[e>>2]=f[j+4>>2];f[d>>2]=f[e>>2];Me(j,d,g,g+1|0)|0}j=ln(296)|0;_i(j);n=f[i>>2]|0;f[i>>2]=j;if(!n)s=j;else{Va[f[(f[n>>2]|0)+4>>2]&127](n);r=21}}else if((r|0)==17){n=f[a+44>>2]|0;b[g>>0]=2;j=n+16|0;h=f[j+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[j>>2]|0)>>>0>0)){f[e>>2]=f[n+4>>2];f[d>>2]=f[e>>2];Me(n,d,g,g+1|0)|0}g=ln(360)|0;xi(g);d=f[i>>2]|0;f[i>>2]=g;if(!d)s=g;else{Va[f[(f[d>>2]|0)+4>>2]&127](d);r=21}}if((r|0)==21){r=f[i>>2]|0;if(!r){t=0;u=c;return t|0}else s=r}t=Ra[f[(f[s>>2]|0)+8>>2]&127](s,a)|0;u=c;return t|0}function Od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;e=b+12|0;g=f[e>>2]|0;h=c+4|0;i=(f[h>>2]|0)-g|0;j=c;f[j>>2]=(f[c>>2]|0)-g;f[j+4>>2]=i;i=(f[d>>2]|0)-g|0;j=d+4|0;k=(f[j>>2]|0)-g|0;g=d;f[g>>2]=i;f[g+4>>2]=k;g=f[e>>2]|0;if((((k|0)>-1?k:0-k|0)+((i|0)>-1?i:0-i|0)|0)>(g|0)){l=f[c>>2]|0;m=f[h>>2]|0;if((l|0)>-1)if((m|0)<=-1)if((l|0)<1){n=-1;o=-1}else p=6;else{n=1;o=1}else if((m|0)<1){n=-1;o=-1}else p=6;if((p|0)==6){n=(l|0)>0?1:-1;o=(m|0)>0?1:-1}q=X(g,n)|0;r=X(g,o)|0;g=(l<<1)-q|0;f[c>>2]=g;l=(m<<1)-r|0;f[h>>2]=l;if((X(n,o)|0)>-1){o=0-l|0;f[c>>2]=o;s=0-g|0;t=o}else{f[c>>2]=l;s=g;t=l}f[c>>2]=(t+q|0)/2|0;f[h>>2]=(s+r|0)/2|0;r=f[d>>2]|0;s=f[j>>2]|0;if((r|0)>-1)if((s|0)<=-1)if((r|0)<1){u=-1;v=-1}else p=14;else{u=1;v=1}else if((s|0)<1){u=-1;v=-1}else p=14;if((p|0)==14){u=(r|0)>0?1:-1;v=(s|0)>0?1:-1}q=f[e>>2]|0;e=X(q,u)|0;t=X(q,v)|0;q=(r<<1)-e|0;f[d>>2]=q;r=(s<<1)-t|0;f[j>>2]=r;if((X(u,v)|0)>-1){v=0-r|0;f[d>>2]=v;w=0-q|0;x=v}else{f[d>>2]=r;w=q;x=r}r=(x+e|0)/2|0;f[d>>2]=r;e=(w+t|0)/2|0;f[j>>2]=e;y=r;z=e}else{y=i;z=k}if(!y)if(!z){A=y;B=z}else p=22;else if((y|0)<0&(z|0)<1){A=y;B=z}else p=22;if((p|0)==22){if(!y)C=(z|0)==0?0:(z|0)>0?3:1;else C=(y|0)>0?(z>>31)+2|0:(z|0)<1?0:3;z=f[c>>2]|0;y=f[h>>2]|0;switch(C|0){case 1:{C=c;f[C>>2]=y;f[C+4>>2]=0-z;D=f[j>>2]|0;E=0-(f[d>>2]|0)|0;break}case 2:{C=c;f[C>>2]=0-z;f[C+4>>2]=0-y;D=0-(f[d>>2]|0)|0;E=0-(f[j>>2]|0)|0;break}case 3:{C=c;f[C>>2]=0-y;f[C+4>>2]=z;D=0-(f[j>>2]|0)|0;E=f[d>>2]|0;break}default:{C=c;f[C>>2]=z;f[C+4>>2]=y;D=f[d>>2]|0;E=f[j>>2]|0}}j=d;f[j>>2]=D;f[j+4>>2]=E;A=D;B=E}E=(f[c>>2]|0)-A|0;f[a>>2]=E;A=(f[h>>2]|0)-B|0;B=a+4|0;f[B>>2]=A;if((E|0)<0)F=(f[b+4>>2]|0)+E|0;else F=E;f[a>>2]=F;if((A|0)>=0){G=A;f[B>>2]=G;return}G=(f[b+4>>2]|0)+A|0;f[B>>2]=G;return}function Pd(a,b){a=a|0;b=b|0;var c=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;c=a+4|0;if(!b){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[c>>2]=0;return}if(b>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(b<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;g=f[c>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=b+-1|0;i=(h&b|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(b>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=c;c=f[g>>2]|0;if(!c)return;else{k=j;l=g;m=c;n=g}a:while(1){b:do if(i){g=l;c=m;j=n;while(1){e=c;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0))break;p=(f[a>>2]|0)+(o<<2)|0;if(!(f[p>>2]|0)){q=e;r=j;s=o;t=p;break b}p=e+8|0;u=e;while(1){v=f[u>>2]|0;if(!v)break;if((d[p>>1]|0)==(d[v+8>>1]|0))u=v;else break}f[j>>2]=v;f[u>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;p=f[g>>2]|0;if(!p){w=37;break a}else e=p}c=f[e>>2]|0;if(!c){w=37;break a}else{g=e;j=e}}}else{j=l;g=m;c=n;while(1){p=g;while(1){x=f[p+4>>2]|0;if(x>>>0>>0)y=x;else y=(x>>>0)%(b>>>0)|0;if((y|0)==(k|0))break;x=(f[a>>2]|0)+(y<<2)|0;if(!(f[x>>2]|0)){q=p;r=c;s=y;t=x;break b}x=p+8|0;z=p;while(1){A=f[z>>2]|0;if(!A)break;if((d[x>>1]|0)==(d[A+8>>1]|0))z=A;else break}f[c>>2]=A;f[z>>2]=f[f[(f[a>>2]|0)+(y<<2)>>2]>>2];f[f[(f[a>>2]|0)+(y<<2)>>2]>>2]=p;x=f[j>>2]|0;if(!x){w=37;break a}else p=x}g=f[p>>2]|0;if(!g){w=37;break a}else{j=p;c=p}}}while(0);f[t>>2]=r;m=f[q>>2]|0;if(!m){w=37;break}else{k=s;l=q;n=q}}if((w|0)==37)return}function Qd(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;else{k=j;l=g;m=d;n=g}a:while(1){b:do if(i){g=l;d=m;j=n;while(1){e=d;while(1){o=f[e+4>>2]&h;if((o|0)==(k|0))break;p=(f[a>>2]|0)+(o<<2)|0;if(!(f[p>>2]|0)){q=e;r=j;s=o;t=p;break b}p=e+8|0;u=e;while(1){v=f[u>>2]|0;if(!v)break;if((b[p>>0]|0)==(b[v+8>>0]|0))u=v;else break}f[j>>2]=v;f[u>>2]=f[f[(f[a>>2]|0)+(o<<2)>>2]>>2];f[f[(f[a>>2]|0)+(o<<2)>>2]>>2]=e;p=f[g>>2]|0;if(!p){w=37;break a}else e=p}d=f[e>>2]|0;if(!d){w=37;break a}else{g=e;j=e}}}else{j=l;g=m;d=n;while(1){p=g;while(1){x=f[p+4>>2]|0;if(x>>>0>>0)y=x;else y=(x>>>0)%(c>>>0)|0;if((y|0)==(k|0))break;x=(f[a>>2]|0)+(y<<2)|0;if(!(f[x>>2]|0)){q=p;r=d;s=y;t=x;break b}x=p+8|0;z=p;while(1){A=f[z>>2]|0;if(!A)break;if((b[x>>0]|0)==(b[A+8>>0]|0))z=A;else break}f[d>>2]=A;f[z>>2]=f[f[(f[a>>2]|0)+(y<<2)>>2]>>2];f[f[(f[a>>2]|0)+(y<<2)>>2]>>2]=p;x=f[j>>2]|0;if(!x){w=37;break a}else p=x}g=f[p>>2]|0;if(!g){w=37;break a}else{j=p;d=p}}}while(0);f[t>>2]=r;m=f[q>>2]|0;if(!m){w=37;break}else{k=s;l=q;n=q}}if((w|0)==37)return}function Rd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=f[c>>2]|0;c=f[b>>2]|0;h=g-c|0;i=a+8|0;j=f[i>>2]|0;if(h>>>0<64){if(j>>>0<=1){k=0;return k|0}l=f[e>>2]|0;m=0;n=1;while(1){o=(f[l+(m<<2)>>2]|0)>>>0>(f[l+(n<<2)>>2]|0)>>>0?n:m;n=n+1|0;if(n>>>0>=j>>>0){k=o;break}else m=o}return k|0}if(j){j=f[a+1128>>2]|0;m=f[e>>2]|0;e=f[a+1140>>2]|0;n=f[d>>2]|0;d=b+4|0;l=b+8|0;if((g|0)==(c|0)){b=0;do{o=j+(b<<2)|0;f[o>>2]=0;p=(f[a>>2]|0)-(f[m+(b<<2)>>2]|0)|0;f[e+(b<<2)>>2]=p;if(p|0){p=f[o>>2]|0;q=h-p|0;f[o>>2]=q>>>0

>>0?p:q}b=b+1|0;q=f[i>>2]|0}while(b>>>0>>0);r=q}else{b=0;do{q=j+(b<<2)|0;f[q>>2]=0;p=(f[a>>2]|0)-(f[m+(b<<2)>>2]|0)|0;f[e+(b<<2)>>2]=p;if(p|0){o=(f[n+(b<<2)>>2]|0)+(1<>2]|0;s=f[(f[d>>2]|0)+24>>2]|0;t=c;u=f[q>>2]|0;do{v=s+((X(t,p)|0)<<2)+(b<<2)|0;u=u+((f[v>>2]|0)>>>0>>0&1)|0;f[q>>2]=u;t=t+1|0}while((t|0)!=(g|0));t=h-u|0;f[q>>2]=t>>>0>>0?u:t}b=b+1|0;t=f[i>>2]|0}while(b>>>0>>0);r=t}if(r){b=f[a+1140>>2]|0;i=a+1128|0;h=0;g=0;c=0;while(1){if(!(f[b+(g<<2)>>2]|0)){w=h;x=c}else{d=f[(f[i>>2]|0)+(g<<2)>>2]|0;l=h>>>0>>0;w=l?d:h;x=l?g:c}g=g+1|0;if(g>>>0>=r>>>0){y=x;break}else{h=w;c=x}}}else y=0}else y=0;x=a+1088|0;c=a+1104|0;w=f[c>>2]|0;h=32-w|0;if((h|0)<4){r=y&15;g=4-h|0;f[c>>2]=g;h=a+1100|0;i=f[h>>2]|r>>>g;f[h>>2]=i;g=a+1092|0;b=f[g>>2]|0;if((b|0)==(f[a+1096>>2]|0))Ri(x,h);else{f[b>>2]=i;f[g>>2]=b+4}f[h>>2]=r<<32-(f[c>>2]|0);k=y;return k|0}r=a+1100|0;h=f[r>>2]|y<<28>>>w;f[r>>2]=h;b=w+4|0;f[c>>2]=b;if((b|0)!=32){k=y;return k|0}b=a+1092|0;w=f[b>>2]|0;if((w|0)==(f[a+1096>>2]|0))Ri(x,r);else{f[w>>2]=h;f[b>>2]=w+4}f[r>>2]=0;f[c>>2]=0;k=y;return k|0}function Sd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;c=a+4|0;if(!b){d=f[a>>2]|0;f[a>>2]=0;if(d|0)Oq(d);f[c>>2]=0;return}if(b>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}d=ln(b<<2)|0;e=f[a>>2]|0;f[a>>2]=d;if(e|0)Oq(e);f[c>>2]=b;c=0;do{f[(f[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));c=a+8|0;e=f[c>>2]|0;if(!e)return;d=f[e+4>>2]|0;g=b+-1|0;h=(g&b|0)==0;if(!h)if(d>>>0>>0)i=d;else i=(d>>>0)%(b>>>0)|0;else i=d&g;f[(f[a>>2]|0)+(i<<2)>>2]=c;c=f[e>>2]|0;if(!c)return;else{j=i;k=e;l=c;m=e}a:while(1){b:do if(h){e=k;c=l;i=m;while(1){d=c;while(1){n=f[d+4>>2]&g;if((n|0)==(j|0))break;o=(f[a>>2]|0)+(n<<2)|0;if(!(f[o>>2]|0)){p=d;q=i;r=n;s=o;break b}o=d+8|0;t=d;while(1){u=f[t>>2]|0;if(!u)break;if((f[o>>2]|0)==(f[u+8>>2]|0))t=u;else break}f[i>>2]=u;f[t>>2]=f[f[(f[a>>2]|0)+(n<<2)>>2]>>2];f[f[(f[a>>2]|0)+(n<<2)>>2]>>2]=d;o=f[e>>2]|0;if(!o){v=37;break a}else d=o}c=f[d>>2]|0;if(!c){v=37;break a}else{e=d;i=d}}}else{i=k;e=l;c=m;while(1){o=e;while(1){w=f[o+4>>2]|0;if(w>>>0>>0)x=w;else x=(w>>>0)%(b>>>0)|0;if((x|0)==(j|0))break;w=(f[a>>2]|0)+(x<<2)|0;if(!(f[w>>2]|0)){p=o;q=c;r=x;s=w;break b}w=o+8|0;y=o;while(1){z=f[y>>2]|0;if(!z)break;if((f[w>>2]|0)==(f[z+8>>2]|0))y=z;else break}f[c>>2]=z;f[y>>2]=f[f[(f[a>>2]|0)+(x<<2)>>2]>>2];f[f[(f[a>>2]|0)+(x<<2)>>2]>>2]=o;w=f[i>>2]|0;if(!w){v=37;break a}else o=w}e=f[o>>2]|0;if(!e){v=37;break a}else{i=o;c=o}}}while(0);f[s>>2]=q;l=f[p>>2]|0;if(!l){v=37;break}else{j=r;k=p;m=p}}if((v|0)==37)return}function Td(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=a+4|0;if(!c){e=f[a>>2]|0;f[a>>2]=0;if(e|0)Oq(e);f[d>>2]=0;return}if(c>>>0>1073741823){e=ra(8)|0;Oo(e,16035);f[e>>2]=7256;va(e|0,1112,110)}e=ln(c<<2)|0;g=f[a>>2]|0;f[a>>2]=e;if(g|0)Oq(g);f[d>>2]=c;d=0;do{f[(f[a>>2]|0)+(d<<2)>>2]=0;d=d+1|0}while((d|0)!=(c|0));d=a+8|0;g=f[d>>2]|0;if(!g)return;e=f[g+4>>2]|0;h=c+-1|0;i=(h&c|0)==0;if(!i)if(e>>>0>>0)j=e;else j=(e>>>0)%(c>>>0)|0;else j=e&h;f[(f[a>>2]|0)+(j<<2)>>2]=d;d=f[g>>2]|0;if(!d)return;e=a+24|0;k=j;j=g;l=d;d=g;a:while(1){g=j;m=l;n=d;b:while(1){o=m;while(1){p=f[o+4>>2]|0;if(!i)if(p>>>0>>0)q=p;else q=(p>>>0)%(c>>>0)|0;else q=p&h;if((q|0)==(k|0))break;r=(f[a>>2]|0)+(q<<2)|0;if(!(f[r>>2]|0))break b;p=f[o>>2]|0;c:do if(!p)s=o;else{t=f[o+8>>2]|0;u=f[e>>2]|0;v=f[u+8>>2]|0;w=(f[u+12>>2]|0)-v|0;u=v;v=w>>>2;if((w|0)>0){x=o;y=p}else{w=p;while(1){z=f[w>>2]|0;if(!z){s=w;break c}else w=z}}while(1){w=f[y+8>>2]|0;z=0;do{A=f[u+(z<<2)>>2]|0;if(!(b[A+84>>0]|0)){B=f[A+68>>2]|0;C=f[B+(w<<2)>>2]|0;D=f[B+(t<<2)>>2]|0}else{C=w;D=t}z=z+1|0;if((D|0)!=(C|0)){s=x;break c}}while((z|0)<(v|0));z=f[y>>2]|0;if(!z){s=y;break}else{w=y;y=z;x=w}}}while(0);f[n>>2]=f[s>>2];f[s>>2]=f[f[(f[a>>2]|0)+(q<<2)>>2]>>2];f[f[(f[a>>2]|0)+(q<<2)>>2]>>2]=o;p=f[g>>2]|0;if(!p){E=38;break a}else o=p}m=f[o>>2]|0;if(!m){E=38;break a}else{g=o;n=o}}f[r>>2]=n;l=f[o>>2]|0;if(!l){E=38;break}else{k=q;j=o;d=o}}if((E|0)==38)return}function Ud(a,c){a=a|0;c=c|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0;e=u;u=u+16|0;g=e+4|0;h=e;i=e+12|0;j=e+11|0;k=e+10|0;l=e+8|0;m=c+44|0;n=f[m>>2]|0;o=n+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];Me(n,g,15886,15891)|0}n=Qa[f[(f[c>>2]|0)+8>>2]&127](c)|0;b[i>>0]=n;b[j>>0]=2;b[k>>0]=(n&255|0)==0?3:2;n=f[m>>2]|0;o=n+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[n+4>>2];f[g>>2]=f[h>>2];Me(n,g,j,j+1|0)|0;j=f[m>>2]|0;o=j+16|0;p=f[o+4>>2]|0;if(!((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0)){f[h>>2]=f[j+4>>2];f[g>>2]=f[h>>2];Me(j,g,k,k+1|0)|0;k=f[m>>2]|0;o=k+16|0;p=f[o+4>>2]|0;if((p|0)>0|(p|0)==0&(f[o>>2]|0)>>>0>0){q=h;r=k}else{f[h>>2]=f[k+4>>2];f[g>>2]=f[h>>2];Me(k,g,i,i+1|0)|0;q=h;r=f[m>>2]|0}}else{s=h;t=j;v=6}}else{s=h;t=n;v=6}if((v|0)==6){q=h;r=t}t=Qa[f[(f[c>>2]|0)+12>>2]&127](c)|0;b[l>>0]=t;t=r+16|0;q=f[t+4>>2]|0;if(!((q|0)>0|(q|0)==0&(f[t>>2]|0)>>>0>0)){f[h>>2]=f[r+4>>2];f[g>>2]=f[h>>2];Me(r,g,l,l+1|0)|0}d[l>>1]=(f[(f[c+4>>2]|0)+4>>2]|0)==0?0:-32768;c=f[m>>2]|0;m=c+16|0;r=f[m+4>>2]|0;if((r|0)>0|(r|0)==0&(f[m>>2]|0)>>>0>0){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}f[h>>2]=f[c+4>>2];f[g>>2]=f[h>>2];Me(c,g,l,l+2|0)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=e;return}function Vd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;e=u;u=u+176|0;g=e+136|0;h=e+104|0;i=e;j=e+72|0;k=ln(88)|0;l=f[c+8>>2]|0;f[k+4>>2]=0;f[k>>2]=3612;m=k+12|0;f[m>>2]=3636;n=k+64|0;f[n>>2]=0;f[k+68>>2]=0;f[k+72>>2]=0;o=k+16|0;p=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));f[k+76>>2]=l;f[k+80>>2]=d;q=k+84|0;f[q>>2]=0;r=k;f[h>>2]=3636;s=h+4|0;t=s+4|0;f[t>>2]=0;f[t+4>>2]=0;f[t+8>>2]=0;f[t+12>>2]=0;f[t+16>>2]=0;f[t+20>>2]=0;t=f[c+12>>2]|0;v=i+4|0;f[v>>2]=3636;w=i+56|0;f[w>>2]=0;x=i+60|0;f[x>>2]=0;f[i+64>>2]=0;o=i+8|0;p=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(p|0));o=t;f[s>>2]=o;s=((f[o+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0;b[g>>0]=0;qh(h+8|0,s,g);Va[f[(f[h>>2]|0)+8>>2]&127](h);Ff(j,h);Ff(g,j);f[i>>2]=f[g+4>>2];s=i+4|0;fg(s,g)|0;f[g>>2]=3636;o=f[g+20>>2]|0;if(o|0)Oq(o);o=f[g+8>>2]|0;if(o|0)Oq(o);f[i+36>>2]=t;f[i+40>>2]=d;f[i+44>>2]=l;f[i+48>>2]=k;f[j>>2]=3636;l=f[j+20>>2]|0;if(l|0)Oq(l);l=f[j+8>>2]|0;if(l|0)Oq(l);f[q>>2]=c+72;f[k+8>>2]=f[i>>2];fg(m,s)|0;s=k+44|0;k=i+36|0;f[s>>2]=f[k>>2];f[s+4>>2]=f[k+4>>2];f[s+8>>2]=f[k+8>>2];f[s+12>>2]=f[k+12>>2];b[s+16>>0]=b[k+16>>0]|0;ng(n,f[w>>2]|0,f[x>>2]|0);f[a>>2]=r;r=f[w>>2]|0;if(r|0){w=f[x>>2]|0;if((w|0)!=(r|0))f[x>>2]=w+(~((w+-4-r|0)>>>2)<<2);Oq(r)}f[v>>2]=3636;v=f[i+24>>2]|0;if(v|0)Oq(v);v=f[i+12>>2]|0;if(v|0)Oq(v);f[h>>2]=3636;v=f[h+20>>2]|0;if(v|0)Oq(v);v=f[h+8>>2]|0;if(!v){u=e;return}Oq(v);u=e;return}function Wd(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=Oa,x=0,y=Oa,z=Oa,A=Oa;e=u;u=u+16|0;g=e;h=a+4|0;if((f[h>>2]|0)!=-1){i=0;u=e;return i|0}f[h>>2]=d;d=b[c+24>>0]|0;h=d<<24>>24;j=a+20|0;n[j>>2]=$(0.0);f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;do if(d<<24>>24)if(d<<24>>24<0)aq(g);else{l=h<<2;m=ln(l)|0;f[g>>2]=m;o=m+(h<<2)|0;f[g+8>>2]=o;sj(m|0,0,l|0)|0;l=m+(h<<2)|0;f[k>>2]=l;p=m;q=l;r=o;break}else{p=0;q=0;r=0}while(0);k=a+8|0;g=f[k>>2]|0;o=a+12|0;if(!g)s=a+16|0;else{l=f[o>>2]|0;if((l|0)!=(g|0))f[o>>2]=l+(~((l+-4-g|0)>>>2)<<2);Oq(g);g=a+16|0;f[g>>2]=0;f[o>>2]=0;f[k>>2]=0;s=g}f[k>>2]=p;f[o>>2]=q;f[s>>2]=r;r=h>>>0>1073741823?-1:h<<2;s=Lq(r)|0;q=Lq(r)|0;r=c+48|0;o=f[r>>2]|0;g=c+40|0;a=f[g>>2]|0;l=f[c>>2]|0;kh(q|0,(f[l>>2]|0)+o|0,a|0)|0;kh(p|0,(f[l>>2]|0)+o|0,a|0)|0;a=r;r=f[a>>2]|0;o=f[a+4>>2]|0;a=g;g=f[a>>2]|0;l=f[a+4>>2]|0;a=f[c>>2]|0;kh(s|0,(f[a>>2]|0)+r|0,g|0)|0;p=f[c+80>>2]|0;a:do if(p>>>0>1){if(d<<24>>24<=0){c=1;while(1){m=un(g|0,l|0,c|0,0)|0;t=Vn(m|0,I|0,r|0,o|0)|0;kh(q|0,(f[a>>2]|0)+t|0,g|0)|0;c=c+1|0;if(c>>>0>=p>>>0)break a}}c=f[k>>2]|0;t=1;do{m=un(g|0,l|0,t|0,0)|0;v=Vn(m|0,I|0,r|0,o|0)|0;kh(q|0,(f[a>>2]|0)+v|0,g|0)|0;v=0;do{m=c+(v<<2)|0;w=$(n[m>>2]);x=q+(v<<2)|0;y=$(n[x>>2]);if(w>y){n[m>>2]=y;z=$(n[x>>2])}else z=y;x=s+(v<<2)|0;if($(n[x>>2])>2]=z;v=v+1|0}while((v|0)!=(h|0));t=t+1|0}while(t>>>0

>>0)}while(0);if(d<<24>>24>0){d=f[k>>2]|0;k=0;z=$(n[j>>2]);while(1){y=$(n[s+(k<<2)>>2]);w=$(y-$(n[d+(k<<2)>>2]));if(w>z){n[j>>2]=w;A=w}else A=z;k=k+1|0;if((k|0)==(h|0))break;else z=A}}Mq(q);Mq(s);i=1;u=e;return i|0}function Xd(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=a+8|0;Mh(g,b,d,e);h=d-e|0;if((h|0)>0){d=0-e|0;i=a+16|0;j=a+32|0;k=a+12|0;l=a+28|0;m=a+20|0;n=a+24|0;o=h;h=f[g>>2]|0;while(1){p=b+(o<<2)|0;q=c+(o<<2)|0;if((h|0)>0){r=0;s=p+(d<<2)|0;t=h;while(1){if((t|0)>0){u=0;do{v=f[s+(u<<2)>>2]|0;w=f[i>>2]|0;if((v|0)>(w|0)){x=f[j>>2]|0;f[x+(u<<2)>>2]=w;y=x}else{x=f[k>>2]|0;w=f[j>>2]|0;f[w+(u<<2)>>2]=(v|0)<(x|0)?x:v;y=w}u=u+1|0}while((u|0)<(f[g>>2]|0));z=y}else z=f[j>>2]|0;u=(f[p+(r<<2)>>2]|0)-(f[z+(r<<2)>>2]|0)|0;w=q+(r<<2)|0;f[w>>2]=u;if((u|0)>=(f[l>>2]|0)){if((u|0)>(f[n>>2]|0)){A=u-(f[m>>2]|0)|0;B=31}}else{A=(f[m>>2]|0)+u|0;B=31}if((B|0)==31){B=0;f[w>>2]=A}r=r+1|0;w=f[g>>2]|0;if((r|0)>=(w|0)){C=w;break}else{s=z;t=w}}}else C=h;o=o-e|0;if((o|0)<=0){D=C;break}else h=C}}else D=f[g>>2]|0;C=e>>>0>1073741823?-1:e<<2;e=Lq(C)|0;sj(e|0,0,C|0)|0;if((D|0)<=0){Mq(e);return 1}C=a+16|0;h=a+32|0;o=a+12|0;z=a+28|0;A=a+20|0;m=a+24|0;a=0;n=e;l=D;while(1){if((l|0)>0){D=0;do{j=f[n+(D<<2)>>2]|0;y=f[C>>2]|0;if((j|0)>(y|0)){k=f[h>>2]|0;f[k+(D<<2)>>2]=y;E=k}else{k=f[o>>2]|0;y=f[h>>2]|0;f[y+(D<<2)>>2]=(j|0)<(k|0)?k:j;E=y}D=D+1|0}while((D|0)<(f[g>>2]|0));F=E}else F=f[h>>2]|0;D=(f[b+(a<<2)>>2]|0)-(f[F+(a<<2)>>2]|0)|0;y=c+(a<<2)|0;f[y>>2]=D;if((D|0)>=(f[z>>2]|0)){if((D|0)>(f[m>>2]|0)){G=D-(f[A>>2]|0)|0;B=16}}else{G=(f[A>>2]|0)+D|0;B=16}if((B|0)==16){B=0;f[y>>2]=G}a=a+1|0;l=f[g>>2]|0;if((a|0)>=(l|0))break;else n=F}Mq(e);return 1}function Yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;e=f[a>>2]|0;g=e;h=(f[b>>2]|0)-g|0;b=e+(h>>2<<2)|0;i=f[c>>2]|0;c=f[d>>2]|0;d=c-i|0;j=d>>2;k=i;l=c;if((d|0)<=0){m=b;return m|0}d=a+8|0;n=f[d>>2]|0;o=a+4|0;p=f[o>>2]|0;q=p;if((j|0)<=(n-q>>2|0)){r=b;s=q-r|0;t=s>>2;if((j|0)>(t|0)){u=k+(t<<2)|0;t=u;if((u|0)==(l|0))v=p;else{w=l+-4-t|0;x=u;u=p;while(1){f[u>>2]=f[x>>2];x=x+4|0;if((x|0)==(l|0))break;else u=u+4|0}u=p+((w>>>2)+1<<2)|0;f[o>>2]=u;v=u}if((s|0)>0){y=t;z=v}else{m=b;return m|0}}else{y=c;z=p}c=z-(b+(j<<2))>>2;v=b+(c<<2)|0;if(v>>>0

>>0){t=(p+(0-c<<2)+~r|0)>>>2;r=v;s=z;while(1){f[s>>2]=f[r>>2];r=r+4|0;if(r>>>0>=p>>>0)break;else s=s+4|0}f[o>>2]=z+(t+1<<2)}if(c|0){c=v;v=z;do{c=c+-4|0;v=v+-4|0;f[v>>2]=f[c>>2]}while((c|0)!=(b|0))}c=y;if((k|0)==(c|0)){m=b;return m|0}else{A=b;B=k}while(1){f[A>>2]=f[B>>2];B=B+4|0;if((B|0)==(c|0)){m=b;break}else A=A+4|0}return m|0}A=(q-g>>2)+j|0;if(A>>>0>1073741823)aq(a);j=n-g|0;g=j>>1;n=j>>2>>>0<536870911?(g>>>0>>0?A:g):1073741823;g=b;A=h>>2;do if(n)if(n>>>0>1073741823){j=ra(8)|0;Oo(j,16035);f[j>>2]=7256;va(j|0,1112,110)}else{j=ln(n<<2)|0;C=j;D=j;break}else{C=0;D=0}while(0);j=D+(A<<2)|0;A=D+(n<<2)|0;if((l|0)==(k|0))E=j;else{n=((l+-4-i|0)>>>2)+1|0;i=k;k=j;while(1){f[k>>2]=f[i>>2];i=i+4|0;if((i|0)==(l|0))break;else k=k+4|0}E=j+(n<<2)|0}if((h|0)>0)kh(C|0,e|0,h|0)|0;h=q-g|0;if((h|0)>0){kh(E|0,b|0,h|0)|0;F=E+(h>>>2<<2)|0}else F=E;f[a>>2]=D;f[o>>2]=F;f[d>>2]=A;if(!e){m=j;return m|0}Oq(e);m=j;return m|0}function Zd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;c=u;u=u+48|0;d=c+40|0;e=c+36|0;g=c+32|0;h=c;i=a+60|0;ci(f[i>>2]|0,b)|0;wn(h);tk(h);j=f[a+56>>2]|0;k=f[i>>2]|0;i=k>>>5;l=j+(i<<2)|0;m=k&31;k=(i|0)!=0;a:do if(i|m|0){if(!m){n=1;o=j;p=k;while(1){if(p){q=n;r=0;while(1){s=(f[o>>2]&1<>2]&1<>2]&1<>2]&1<>2]=f[a+12>>2];m=b+16|0;w=m;v=f[w>>2]|0;j=f[w+4>>2]|0;if((j|0)>0|(j|0)==0&v>>>0>0){x=j;y=v}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;v=m;x=f[v+4>>2]|0;y=f[v>>2]|0}f[g>>2]=f[a+20>>2];if((x|0)>0|(x|0)==0&y>>>0>0){Fj(h);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;Fj(h);u=c;return 1}function _d(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;switch(b-a>>2|0){case 2:{d=b+-4|0;e=f[d>>2]|0;g=f[a>>2]|0;h=f[c>>2]|0;i=f[h>>2]|0;j=(f[h+4>>2]|0)-i>>3;if(j>>>0<=e>>>0)aq(h);k=i;if(j>>>0<=g>>>0)aq(h);if((f[k+(e<<3)>>2]|0)>>>0>=(f[k+(g<<3)>>2]|0)>>>0){l=1;return l|0}f[a>>2]=e;f[d>>2]=g;l=1;return l|0}case 3:{Vg(a,a+4|0,b+-4|0,c)|0;l=1;return l|0}case 4:{jh(a,a+4|0,a+8|0,b+-4|0,c)|0;l=1;return l|0}case 5:{ig(a,a+4|0,a+8|0,a+12|0,b+-4|0,c)|0;l=1;return l|0}case 1:case 0:{l=1;return l|0}default:{g=a+8|0;Vg(a,a+4|0,g,c)|0;d=a+12|0;a:do if((d|0)!=(b|0)){e=f[c>>2]|0;k=f[e>>2]|0;h=(f[e+4>>2]|0)-k>>3;j=k;k=d;i=0;m=g;b:while(1){n=f[k>>2]|0;o=f[m>>2]|0;if(h>>>0<=n>>>0){p=14;break}if(h>>>0<=o>>>0){p=16;break}q=j+(n<<3)|0;if((f[q>>2]|0)>>>0<(f[j+(o<<3)>>2]|0)>>>0){r=m;s=k;t=o;while(1){f[s>>2]=t;if((r|0)==(a|0)){u=a;break}o=r+-4|0;t=f[o>>2]|0;if(h>>>0<=t>>>0){p=20;break b}if((f[q>>2]|0)>>>0>=(f[j+(t<<3)>>2]|0)>>>0){u=r;break}else{v=r;r=o;s=v}}f[u>>2]=n;s=i+1|0;if((s|0)==8){w=0;x=(k+4|0)==(b|0);break a}else y=s}else y=i;s=k+4|0;if((s|0)==(b|0)){w=1;x=0;break a}else{r=k;k=s;i=y;m=r}}if((p|0)==14)aq(e);else if((p|0)==16)aq(e);else if((p|0)==20)aq(e)}else{w=1;x=0}while(0);l=x|w;return l|0}}return 0}function $d(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0;c=u;u=u+48|0;d=c+40|0;e=c+36|0;g=c+32|0;h=c;i=a+80|0;ci(f[i>>2]|0,b)|0;wn(h);tk(h);j=f[a+76>>2]|0;k=f[i>>2]|0;i=k>>>5;l=j+(i<<2)|0;m=k&31;k=(i|0)!=0;a:do if(i|m|0){if(!m){n=1;o=j;p=k;while(1){if(p){q=n;r=0;while(1){s=(f[o>>2]&1<>2]&1<>2]&1<>2]&1<>2]=f[a+12>>2];m=b+16|0;w=m;v=f[w>>2]|0;j=f[w+4>>2]|0;if((j|0)>0|(j|0)==0&v>>>0>0){x=j;y=v}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;v=m;x=f[v+4>>2]|0;y=f[v>>2]|0}f[g>>2]=f[a+16>>2];if((x|0)>0|(x|0)==0&y>>>0>0){Fj(h);u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;Fj(h);u=c;return 1}function ae(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;h=u;u=u+16|0;i=h+4|0;j=h;f[a+72>>2]=e;f[a+64>>2]=g;g=Lq(e>>>0>1073741823?-1:e<<2)|0;k=a+68|0;l=f[k>>2]|0;f[k>>2]=g;if(l|0)Mq(l);l=a+8|0;Mh(l,b,d,e);d=a+56|0;g=f[d>>2]|0;m=f[g+4>>2]|0;n=f[g>>2]|0;o=m-n|0;if((o|0)<=0){u=h;return 1}p=(o>>>2)+-1|0;o=a+16|0;q=a+32|0;r=a+12|0;s=a+28|0;t=a+20|0;v=a+24|0;if(m-n>>2>>>0>p>>>0){w=p;x=n}else{y=g;aq(y)}while(1){f[j>>2]=f[x+(w<<2)>>2];f[i>>2]=f[j>>2];Dc(a,i,b,w);g=X(w,e)|0;n=b+(g<<2)|0;p=c+(g<<2)|0;g=f[l>>2]|0;if((g|0)>0){m=0;z=f[k>>2]|0;A=g;while(1){if((A|0)>0){g=0;do{B=f[z+(g<<2)>>2]|0;C=f[o>>2]|0;if((B|0)>(C|0)){D=f[q>>2]|0;f[D+(g<<2)>>2]=C;E=D}else{D=f[r>>2]|0;C=f[q>>2]|0;f[C+(g<<2)>>2]=(B|0)<(D|0)?D:B;E=C}g=g+1|0}while((g|0)<(f[l>>2]|0));F=E}else F=f[q>>2]|0;g=(f[n+(m<<2)>>2]|0)-(f[F+(m<<2)>>2]|0)|0;C=p+(m<<2)|0;f[C>>2]=g;if((g|0)>=(f[s>>2]|0)){if((g|0)>(f[v>>2]|0)){G=g-(f[t>>2]|0)|0;H=21}}else{G=(f[t>>2]|0)+g|0;H=21}if((H|0)==21){H=0;f[C>>2]=G}m=m+1|0;A=f[l>>2]|0;if((m|0)>=(A|0))break;else z=F}}w=w+-1|0;if((w|0)<=-1){H=5;break}z=f[d>>2]|0;x=f[z>>2]|0;if((f[z+4>>2]|0)-x>>2>>>0<=w>>>0){y=z;H=6;break}}if((H|0)==5){u=h;return 1}else if((H|0)==6)aq(y);return 0} function $a(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;b=u;u=u+16|0;c=b;do if(a>>>0<245){d=a>>>0<11?16:a+11&-8;e=d>>>3;g=f[4784]|0;h=g>>>e;if(h&3|0){i=(h&1^1)+e|0;j=19176+(i<<1<<2)|0;k=j+8|0;l=f[k>>2]|0;m=l+8|0;n=f[m>>2]|0;if((n|0)==(j|0))f[4784]=g&~(1<>2]=j;f[k>>2]=n}n=i<<3;f[l+4>>2]=n|3;i=l+n+4|0;f[i>>2]=f[i>>2]|1;o=m;u=b;return o|0}m=f[4786]|0;if(d>>>0>m>>>0){if(h|0){i=2<>>12&16;e=i>>>n;i=e>>>5&8;h=e>>>i;e=h>>>2&4;l=h>>>e;h=l>>>1&2;k=l>>>h;l=k>>>1&1;j=(i|n|e|h|l)+(k>>>l)|0;l=19176+(j<<1<<2)|0;k=l+8|0;h=f[k>>2]|0;e=h+8|0;n=f[e>>2]|0;if((n|0)==(l|0)){i=g&~(1<>2]=l;f[k>>2]=n;p=g}n=j<<3;j=n-d|0;f[h+4>>2]=d|3;k=h+d|0;f[k+4>>2]=j|1;f[h+n>>2]=j;if(m|0){n=f[4789]|0;h=m>>>3;l=19176+(h<<1<<2)|0;i=1<>2]|0;r=i}f[r>>2]=n;f[q+12>>2]=n;f[n+8>>2]=q;f[n+12>>2]=l}f[4786]=j;f[4789]=k;o=e;u=b;return o|0}e=f[4785]|0;if(e){k=(e&0-e)+-1|0;j=k>>>12&16;l=k>>>j;k=l>>>5&8;n=l>>>k;l=n>>>2&4;i=n>>>l;n=i>>>1&2;h=i>>>n;i=h>>>1&1;s=f[19440+((k|j|l|n|i)+(h>>>i)<<2)>>2]|0;i=(f[s+4>>2]&-8)-d|0;h=f[s+16+(((f[s+16>>2]|0)==0&1)<<2)>>2]|0;if(!h){t=s;v=i}else{n=s;s=i;i=h;while(1){h=(f[i+4>>2]&-8)-d|0;l=h>>>0>>0;j=l?h:s;h=l?i:n;i=f[i+16+(((f[i+16>>2]|0)==0&1)<<2)>>2]|0;if(!i){t=h;v=j;break}else{n=h;s=j}}}s=t+d|0;if(s>>>0>t>>>0){n=f[t+24>>2]|0;i=f[t+12>>2]|0;do if((i|0)==(t|0)){j=t+20|0;h=f[j>>2]|0;if(!h){l=t+16|0;k=f[l>>2]|0;if(!k){w=0;break}else{x=k;y=l}}else{x=h;y=j}while(1){j=x+20|0;h=f[j>>2]|0;if(h|0){x=h;y=j;continue}j=x+16|0;h=f[j>>2]|0;if(!h)break;else{x=h;y=j}}f[y>>2]=0;w=x}else{j=f[t+8>>2]|0;f[j+12>>2]=i;f[i+8>>2]=j;w=i}while(0);do if(n|0){i=f[t+28>>2]|0;j=19440+(i<<2)|0;if((t|0)==(f[j>>2]|0)){f[j>>2]=w;if(!w){f[4785]=e&~(1<>2]|0)!=(t|0)&1)<<2)>>2]=w;if(!w)break}f[w+24>>2]=n;i=f[t+16>>2]|0;if(i|0){f[w+16>>2]=i;f[i+24>>2]=w}i=f[t+20>>2]|0;if(i|0){f[w+20>>2]=i;f[i+24>>2]=w}}while(0);if(v>>>0<16){n=v+d|0;f[t+4>>2]=n|3;e=t+n+4|0;f[e>>2]=f[e>>2]|1}else{f[t+4>>2]=d|3;f[s+4>>2]=v|1;f[s+v>>2]=v;if(m|0){e=f[4789]|0;n=m>>>3;i=19176+(n<<1<<2)|0;j=1<>2]|0;A=j}f[A>>2]=e;f[z+12>>2]=e;f[e+8>>2]=z;f[e+12>>2]=i}f[4786]=v;f[4789]=s}o=t+8|0;u=b;return o|0}else B=d}else B=d}else B=d}else if(a>>>0<=4294967231){i=a+11|0;e=i&-8;j=f[4785]|0;if(j){n=0-e|0;h=i>>>8;if(h)if(e>>>0>16777215)C=31;else{i=(h+1048320|0)>>>16&8;l=h<>>16&4;k=l<>>16&2;D=14-(h|i|l)+(k<>>15)|0;C=e>>>(D+7|0)&1|D<<1}else C=0;D=f[19440+(C<<2)>>2]|0;a:do if(!D){E=0;F=0;G=n;H=57}else{l=0;k=n;i=D;h=e<<((C|0)==31?0:25-(C>>>1)|0);I=0;while(1){J=(f[i+4>>2]&-8)-e|0;if(J>>>0>>0)if(!J){K=0;L=i;M=i;H=61;break a}else{N=i;O=J}else{N=l;O=k}J=f[i+20>>2]|0;i=f[i+16+(h>>>31<<2)>>2]|0;P=(J|0)==0|(J|0)==(i|0)?I:J;J=(i|0)==0;if(J){E=P;F=N;G=O;H=57;break}else{l=N;k=O;h=h<<((J^1)&1);I=P}}}while(0);if((H|0)==57){if((E|0)==0&(F|0)==0){D=2<>>12&16;d=D>>>n;D=d>>>5&8;s=d>>>D;d=s>>>2&4;g=s>>>d;s=g>>>1&2;m=g>>>s;g=m>>>1&1;Q=0;R=f[19440+((D|n|d|s|g)+(m>>>g)<<2)>>2]|0}else{Q=F;R=E}if(!R){S=Q;T=G}else{K=G;L=R;M=Q;H=61}}if((H|0)==61)while(1){H=0;g=(f[L+4>>2]&-8)-e|0;m=g>>>0>>0;s=m?g:K;g=m?L:M;L=f[L+16+(((f[L+16>>2]|0)==0&1)<<2)>>2]|0;if(!L){S=g;T=s;break}else{K=s;M=g;H=61}}if((S|0)!=0?T>>>0<((f[4786]|0)-e|0)>>>0:0){g=S+e|0;if(g>>>0<=S>>>0){o=0;u=b;return o|0}s=f[S+24>>2]|0;m=f[S+12>>2]|0;do if((m|0)==(S|0)){d=S+20|0;n=f[d>>2]|0;if(!n){D=S+16|0;I=f[D>>2]|0;if(!I){U=0;break}else{V=I;W=D}}else{V=n;W=d}while(1){d=V+20|0;n=f[d>>2]|0;if(n|0){V=n;W=d;continue}d=V+16|0;n=f[d>>2]|0;if(!n)break;else{V=n;W=d}}f[W>>2]=0;U=V}else{d=f[S+8>>2]|0;f[d+12>>2]=m;f[m+8>>2]=d;U=m}while(0);do if(s){m=f[S+28>>2]|0;d=19440+(m<<2)|0;if((S|0)==(f[d>>2]|0)){f[d>>2]=U;if(!U){d=j&~(1<>2]|0)!=(S|0)&1)<<2)>>2]=U;if(!U){X=j;break}}f[U+24>>2]=s;d=f[S+16>>2]|0;if(d|0){f[U+16>>2]=d;f[d+24>>2]=U}d=f[S+20>>2]|0;if(d){f[U+20>>2]=d;f[d+24>>2]=U;X=j}else X=j}else X=j;while(0);do if(T>>>0>=16){f[S+4>>2]=e|3;f[g+4>>2]=T|1;f[g+T>>2]=T;j=T>>>3;if(T>>>0<256){s=19176+(j<<1<<2)|0;d=f[4784]|0;m=1<>2]|0;Z=m}f[Z>>2]=g;f[Y+12>>2]=g;f[g+8>>2]=Y;f[g+12>>2]=s;break}s=T>>>8;if(s)if(T>>>0>16777215)_=31;else{m=(s+1048320|0)>>>16&8;d=s<>>16&4;j=d<>>16&2;n=14-(s|m|d)+(j<>>15)|0;_=T>>>(n+7|0)&1|n<<1}else _=0;n=19440+(_<<2)|0;f[g+28>>2]=_;d=g+16|0;f[d+4>>2]=0;f[d>>2]=0;d=1<<_;if(!(X&d)){f[4785]=X|d;f[n>>2]=g;f[g+24>>2]=n;f[g+12>>2]=g;f[g+8>>2]=g;break}d=T<<((_|0)==31?0:25-(_>>>1)|0);j=f[n>>2]|0;while(1){if((f[j+4>>2]&-8|0)==(T|0)){H=97;break}$=j+16+(d>>>31<<2)|0;n=f[$>>2]|0;if(!n){H=96;break}else{d=d<<1;j=n}}if((H|0)==96){f[$>>2]=g;f[g+24>>2]=j;f[g+12>>2]=g;f[g+8>>2]=g;break}else if((H|0)==97){d=j+8|0;n=f[d>>2]|0;f[n+12>>2]=g;f[d>>2]=g;f[g+8>>2]=n;f[g+12>>2]=j;f[g+24>>2]=0;break}}else{n=T+e|0;f[S+4>>2]=n|3;d=S+n+4|0;f[d>>2]=f[d>>2]|1}while(0);o=S+8|0;u=b;return o|0}else B=e}else B=e}else B=-1;while(0);S=f[4786]|0;if(S>>>0>=B>>>0){T=S-B|0;$=f[4789]|0;if(T>>>0>15){_=$+B|0;f[4789]=_;f[4786]=T;f[_+4>>2]=T|1;f[$+S>>2]=T;f[$+4>>2]=B|3}else{f[4786]=0;f[4789]=0;f[$+4>>2]=S|3;T=$+S+4|0;f[T>>2]=f[T>>2]|1}o=$+8|0;u=b;return o|0}$=f[4787]|0;if($>>>0>B>>>0){T=$-B|0;f[4787]=T;S=f[4790]|0;_=S+B|0;f[4790]=_;f[_+4>>2]=T|1;f[S+4>>2]=B|3;o=S+8|0;u=b;return o|0}if(!(f[4902]|0)){f[4904]=4096;f[4903]=4096;f[4905]=-1;f[4906]=-1;f[4907]=0;f[4895]=0;f[4902]=c&-16^1431655768;aa=4096}else aa=f[4904]|0;c=B+48|0;S=B+47|0;T=aa+S|0;_=0-aa|0;aa=T&_;if(aa>>>0<=B>>>0){o=0;u=b;return o|0}X=f[4894]|0;if(X|0?(Y=f[4892]|0,Z=Y+aa|0,Z>>>0<=Y>>>0|Z>>>0>X>>>0):0){o=0;u=b;return o|0}b:do if(!(f[4895]&4)){X=f[4790]|0;c:do if(X){Z=19584;while(1){Y=f[Z>>2]|0;if(Y>>>0<=X>>>0?(ba=Z+4|0,(Y+(f[ba>>2]|0)|0)>>>0>X>>>0):0)break;Y=f[Z+8>>2]|0;if(!Y){H=118;break c}else Z=Y}j=T-$&_;if(j>>>0<2147483647){Y=Nl(j|0)|0;if((Y|0)==((f[Z>>2]|0)+(f[ba>>2]|0)|0))if((Y|0)==(-1|0))ca=j;else{da=j;ea=Y;H=135;break b}else{fa=Y;ga=j;H=126}}else ca=0}else H=118;while(0);do if((H|0)==118){X=Nl(0)|0;if((X|0)!=(-1|0)?(e=X,j=f[4903]|0,Y=j+-1|0,U=((Y&e|0)==0?0:(Y+e&0-j)-e|0)+aa|0,e=f[4892]|0,j=U+e|0,U>>>0>B>>>0&U>>>0<2147483647):0){Y=f[4894]|0;if(Y|0?j>>>0<=e>>>0|j>>>0>Y>>>0:0){ca=0;break}Y=Nl(U|0)|0;if((Y|0)==(X|0)){da=U;ea=X;H=135;break b}else{fa=Y;ga=U;H=126}}else ca=0}while(0);do if((H|0)==126){U=0-ga|0;if(!(c>>>0>ga>>>0&(ga>>>0<2147483647&(fa|0)!=(-1|0))))if((fa|0)==(-1|0)){ca=0;break}else{da=ga;ea=fa;H=135;break b}Y=f[4904]|0;X=S-ga+Y&0-Y;if(X>>>0>=2147483647){da=ga;ea=fa;H=135;break b}if((Nl(X|0)|0)==(-1|0)){Nl(U|0)|0;ca=0;break}else{da=X+ga|0;ea=fa;H=135;break b}}while(0);f[4895]=f[4895]|4;ha=ca;H=133}else{ha=0;H=133}while(0);if(((H|0)==133?aa>>>0<2147483647:0)?(ca=Nl(aa|0)|0,aa=Nl(0)|0,fa=aa-ca|0,ga=fa>>>0>(B+40|0)>>>0,!((ca|0)==(-1|0)|ga^1|ca>>>0>>0&((ca|0)!=(-1|0)&(aa|0)!=(-1|0))^1)):0){da=ga?fa:ha;ea=ca;H=135}if((H|0)==135){ca=(f[4892]|0)+da|0;f[4892]=ca;if(ca>>>0>(f[4893]|0)>>>0)f[4893]=ca;ca=f[4790]|0;do if(ca){ha=19584;while(1){ia=f[ha>>2]|0;ja=ha+4|0;ka=f[ja>>2]|0;if((ea|0)==(ia+ka|0)){H=143;break}fa=f[ha+8>>2]|0;if(!fa)break;else ha=fa}if(((H|0)==143?(f[ha+12>>2]&8|0)==0:0)?ea>>>0>ca>>>0&ia>>>0<=ca>>>0:0){f[ja>>2]=ka+da;fa=(f[4787]|0)+da|0;ga=ca+8|0;aa=(ga&7|0)==0?0:0-ga&7;ga=ca+aa|0;S=fa-aa|0;f[4790]=ga;f[4787]=S;f[ga+4>>2]=S|1;f[ca+fa+4>>2]=40;f[4791]=f[4906];break}if(ea>>>0<(f[4788]|0)>>>0)f[4788]=ea;fa=ea+da|0;S=19584;while(1){if((f[S>>2]|0)==(fa|0)){H=151;break}ga=f[S+8>>2]|0;if(!ga){la=19584;break}else S=ga}if((H|0)==151)if(!(f[S+12>>2]&8)){f[S>>2]=ea;ha=S+4|0;f[ha>>2]=(f[ha>>2]|0)+da;ha=ea+8|0;ga=ea+((ha&7|0)==0?0:0-ha&7)|0;ha=fa+8|0;aa=fa+((ha&7|0)==0?0:0-ha&7)|0;ha=ga+B|0;c=aa-ga-B|0;f[ga+4>>2]=B|3;do if((ca|0)!=(aa|0)){if((f[4789]|0)==(aa|0)){ba=(f[4786]|0)+c|0;f[4786]=ba;f[4789]=ha;f[ha+4>>2]=ba|1;f[ha+ba>>2]=ba;break}ba=f[aa+4>>2]|0;if((ba&3|0)==1){_=ba&-8;$=ba>>>3;d:do if(ba>>>0<256){T=f[aa+8>>2]|0;X=f[aa+12>>2]|0;if((X|0)==(T|0)){f[4784]=f[4784]&~(1<<$);break}else{f[T+12>>2]=X;f[X+8>>2]=T;break}}else{T=f[aa+24>>2]|0;X=f[aa+12>>2]|0;do if((X|0)==(aa|0)){U=aa+16|0;Y=U+4|0;j=f[Y>>2]|0;if(!j){e=f[U>>2]|0;if(!e){ma=0;break}else{na=e;oa=U}}else{na=j;oa=Y}while(1){Y=na+20|0;j=f[Y>>2]|0;if(j|0){na=j;oa=Y;continue}Y=na+16|0;j=f[Y>>2]|0;if(!j)break;else{na=j;oa=Y}}f[oa>>2]=0;ma=na}else{Y=f[aa+8>>2]|0;f[Y+12>>2]=X;f[X+8>>2]=Y;ma=X}while(0);if(!T)break;X=f[aa+28>>2]|0;Y=19440+(X<<2)|0;do if((f[Y>>2]|0)!=(aa|0)){f[T+16+(((f[T+16>>2]|0)!=(aa|0)&1)<<2)>>2]=ma;if(!ma)break d}else{f[Y>>2]=ma;if(ma|0)break;f[4785]=f[4785]&~(1<>2]=T;X=aa+16|0;Y=f[X>>2]|0;if(Y|0){f[ma+16>>2]=Y;f[Y+24>>2]=ma}Y=f[X+4>>2]|0;if(!Y)break;f[ma+20>>2]=Y;f[Y+24>>2]=ma}while(0);pa=aa+_|0;qa=_+c|0}else{pa=aa;qa=c}$=pa+4|0;f[$>>2]=f[$>>2]&-2;f[ha+4>>2]=qa|1;f[ha+qa>>2]=qa;$=qa>>>3;if(qa>>>0<256){ba=19176+($<<1<<2)|0;Z=f[4784]|0;Y=1<<$;if(!(Z&Y)){f[4784]=Z|Y;ra=ba;sa=ba+8|0}else{Y=ba+8|0;ra=f[Y>>2]|0;sa=Y}f[sa>>2]=ha;f[ra+12>>2]=ha;f[ha+8>>2]=ra;f[ha+12>>2]=ba;break}ba=qa>>>8;do if(!ba)ta=0;else{if(qa>>>0>16777215){ta=31;break}Y=(ba+1048320|0)>>>16&8;Z=ba<>>16&4;X=Z<<$;Z=(X+245760|0)>>>16&2;j=14-($|Y|Z)+(X<>>15)|0;ta=qa>>>(j+7|0)&1|j<<1}while(0);ba=19440+(ta<<2)|0;f[ha+28>>2]=ta;_=ha+16|0;f[_+4>>2]=0;f[_>>2]=0;_=f[4785]|0;j=1<>2]=ha;f[ha+24>>2]=ba;f[ha+12>>2]=ha;f[ha+8>>2]=ha;break}j=qa<<((ta|0)==31?0:25-(ta>>>1)|0);_=f[ba>>2]|0;while(1){if((f[_+4>>2]&-8|0)==(qa|0)){H=192;break}ua=_+16+(j>>>31<<2)|0;ba=f[ua>>2]|0;if(!ba){H=191;break}else{j=j<<1;_=ba}}if((H|0)==191){f[ua>>2]=ha;f[ha+24>>2]=_;f[ha+12>>2]=ha;f[ha+8>>2]=ha;break}else if((H|0)==192){j=_+8|0;ba=f[j>>2]|0;f[ba+12>>2]=ha;f[j>>2]=ha;f[ha+8>>2]=ba;f[ha+12>>2]=_;f[ha+24>>2]=0;break}}else{ba=(f[4787]|0)+c|0;f[4787]=ba;f[4790]=ha;f[ha+4>>2]=ba|1}while(0);o=ga+8|0;u=b;return o|0}else la=19584;while(1){ha=f[la>>2]|0;if(ha>>>0<=ca>>>0?(va=ha+(f[la+4>>2]|0)|0,va>>>0>ca>>>0):0)break;la=f[la+8>>2]|0}ga=va+-47|0;ha=ga+8|0;c=ga+((ha&7|0)==0?0:0-ha&7)|0;ha=ca+16|0;ga=c>>>0>>0?ca:c;c=ga+8|0;aa=da+-40|0;fa=ea+8|0;S=(fa&7|0)==0?0:0-fa&7;fa=ea+S|0;ba=aa-S|0;f[4790]=fa;f[4787]=ba;f[fa+4>>2]=ba|1;f[ea+aa+4>>2]=40;f[4791]=f[4906];aa=ga+4|0;f[aa>>2]=27;f[c>>2]=f[4896];f[c+4>>2]=f[4897];f[c+8>>2]=f[4898];f[c+12>>2]=f[4899];f[4896]=ea;f[4897]=da;f[4899]=0;f[4898]=c;c=ga+24|0;do{ba=c;c=c+4|0;f[c>>2]=7}while((ba+8|0)>>>0>>0);if((ga|0)!=(ca|0)){c=ga-ca|0;f[aa>>2]=f[aa>>2]&-2;f[ca+4>>2]=c|1;f[ga>>2]=c;ba=c>>>3;if(c>>>0<256){fa=19176+(ba<<1<<2)|0;S=f[4784]|0;j=1<>2]|0;xa=j}f[xa>>2]=ca;f[wa+12>>2]=ca;f[ca+8>>2]=wa;f[ca+12>>2]=fa;break}fa=c>>>8;if(fa)if(c>>>0>16777215)ya=31;else{j=(fa+1048320|0)>>>16&8;S=fa<>>16&4;ba=S<>>16&2;Z=14-(fa|j|S)+(ba<>>15)|0;ya=c>>>(Z+7|0)&1|Z<<1}else ya=0;Z=19440+(ya<<2)|0;f[ca+28>>2]=ya;f[ca+20>>2]=0;f[ha>>2]=0;S=f[4785]|0;ba=1<>2]=ca;f[ca+24>>2]=Z;f[ca+12>>2]=ca;f[ca+8>>2]=ca;break}ba=c<<((ya|0)==31?0:25-(ya>>>1)|0);S=f[Z>>2]|0;while(1){if((f[S+4>>2]&-8|0)==(c|0)){H=213;break}za=S+16+(ba>>>31<<2)|0;Z=f[za>>2]|0;if(!Z){H=212;break}else{ba=ba<<1;S=Z}}if((H|0)==212){f[za>>2]=ca;f[ca+24>>2]=S;f[ca+12>>2]=ca;f[ca+8>>2]=ca;break}else if((H|0)==213){ba=S+8|0;c=f[ba>>2]|0;f[c+12>>2]=ca;f[ba>>2]=ca;f[ca+8>>2]=c;f[ca+12>>2]=S;f[ca+24>>2]=0;break}}}else{c=f[4788]|0;if((c|0)==0|ea>>>0>>0)f[4788]=ea;f[4896]=ea;f[4897]=da;f[4899]=0;f[4793]=f[4902];f[4792]=-1;f[4797]=19176;f[4796]=19176;f[4799]=19184;f[4798]=19184;f[4801]=19192;f[4800]=19192;f[4803]=19200;f[4802]=19200;f[4805]=19208;f[4804]=19208;f[4807]=19216;f[4806]=19216;f[4809]=19224;f[4808]=19224;f[4811]=19232;f[4810]=19232;f[4813]=19240;f[4812]=19240;f[4815]=19248;f[4814]=19248;f[4817]=19256;f[4816]=19256;f[4819]=19264;f[4818]=19264;f[4821]=19272;f[4820]=19272;f[4823]=19280;f[4822]=19280;f[4825]=19288;f[4824]=19288;f[4827]=19296;f[4826]=19296;f[4829]=19304;f[4828]=19304;f[4831]=19312;f[4830]=19312;f[4833]=19320;f[4832]=19320;f[4835]=19328;f[4834]=19328;f[4837]=19336;f[4836]=19336;f[4839]=19344;f[4838]=19344;f[4841]=19352;f[4840]=19352;f[4843]=19360;f[4842]=19360;f[4845]=19368;f[4844]=19368;f[4847]=19376;f[4846]=19376;f[4849]=19384;f[4848]=19384;f[4851]=19392;f[4850]=19392;f[4853]=19400;f[4852]=19400;f[4855]=19408;f[4854]=19408;f[4857]=19416;f[4856]=19416;f[4859]=19424;f[4858]=19424;c=da+-40|0;ba=ea+8|0;ha=(ba&7|0)==0?0:0-ba&7;ba=ea+ha|0;ga=c-ha|0;f[4790]=ba;f[4787]=ga;f[ba+4>>2]=ga|1;f[ea+c+4>>2]=40;f[4791]=f[4906]}while(0);ea=f[4787]|0;if(ea>>>0>B>>>0){da=ea-B|0;f[4787]=da;ea=f[4790]|0;ca=ea+B|0;f[4790]=ca;f[ca+4>>2]=da|1;f[ea+4>>2]=B|3;o=ea+8|0;u=b;return o|0}}ea=Vq()|0;f[ea>>2]=12;o=0;u=b;return o|0}function ab(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0;i=u;u=u+240|0;j=i+104|0;k=i+224|0;l=i+176|0;m=i+160|0;n=i+228|0;o=i+72|0;p=i+40|0;q=i+132|0;r=i;s=i+172|0;t=i+156|0;v=i+152|0;w=i+148|0;x=i+144|0;y=i+128|0;z=a+8|0;Mh(z,c,e,g);e=f[a+48>>2]|0;A=f[a+52>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{Ci(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else Ci(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)aq(m);else{D=g<<2;B=ln(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;sj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+152|0;D=a+156|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else Ci(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=ln(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;sj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+56|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>2;R=e+64|0;S=e+28|0;T=(g|0)>0;U=r+4|0;V=r+8|0;Z=r+12|0;_=a+152|0;$=a+112|0;aa=r+16|0;ba=r+28|0;ca=a+16|0;da=a+32|0;ea=a+12|0;fa=a+28|0;ga=a+20|0;ha=a+24|0;ia=r+28|0;ja=r+16|0;ka=r+20|0;la=r+32|0;ma=n+1|0;na=g<<2;oa=(g|0)==1;pa=Q+-1|0;if(F-D>>2>>>0>pa>>>0){qa=Q;ra=pa;sa=D;ta=P;ua=O;va=M;wa=M;xa=N;ya=M;za=N}else{Aa=G;aq(Aa)}b:while(1){pa=f[sa+(ra<<2)>>2]|0;Q=(((pa>>>0)%3|0|0)==0?2:-1)+pa|0;Ba=Q>>>5;Ca=1<<(Q&31);Da=(pa|0)==-1|(Q|0)==-1;Ea=1;Fa=0;Ga=pa;c:while(1){Ha=Ea^1;Ia=Fa;Ja=Ga;while(1){if((Ja|0)==-1){Ka=Ia;break c}La=f[l+(Ia*12|0)>>2]|0;if(((f[(f[e>>2]|0)+(Ja>>>5<<2)>>2]&1<<(Ja&31)|0)==0?(Ma=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ja<<2)>>2]|0,(Ma|0)!=-1):0)?(Na=f[S>>2]|0,Oa=f[A>>2]|0,Pa=f[Oa+(f[Na+(Ma<<2)>>2]<<2)>>2]|0,Qa=Ma+1|0,Ra=f[Oa+(f[Na+((((Qa>>>0)%3|0|0)==0?Ma+-2|0:Qa)<<2)>>2]<<2)>>2]|0,Qa=f[Oa+(f[Na+((((Ma>>>0)%3|0|0)==0?2:-1)+Ma<<2)>>2]<<2)>>2]|0,(Pa|0)<(ra|0)&(Ra|0)<(ra|0)&(Qa|0)<(ra|0)):0){Ma=X(Pa,g)|0;Pa=X(Ra,g)|0;Ra=X(Qa,g)|0;if(T){Qa=0;do{f[La+(Qa<<2)>>2]=(f[c+(Qa+Ra<<2)>>2]|0)+(f[c+(Qa+Pa<<2)>>2]|0)-(f[c+(Qa+Ma<<2)>>2]|0);Qa=Qa+1|0}while((Qa|0)!=(g|0))}Qa=Ia+1|0;if((Qa|0)==4){Ka=4;break c}else Sa=Qa}else Sa=Ia;do if(Ea){Qa=Ja+1|0;Ma=((Qa>>>0)%3|0|0)==0?Ja+-2|0:Qa;if(((Ma|0)!=-1?(f[(f[e>>2]|0)+(Ma>>>5<<2)>>2]&1<<(Ma&31)|0)==0:0)?(Qa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ma<<2)>>2]|0,Ma=Qa+1|0,(Qa|0)!=-1):0)Ta=((Ma>>>0)%3|0|0)==0?Qa+-2|0:Ma;else Ta=-1}else{Ma=(((Ja>>>0)%3|0|0)==0?2:-1)+Ja|0;if(((Ma|0)!=-1?(f[(f[e>>2]|0)+(Ma>>>5<<2)>>2]&1<<(Ma&31)|0)==0:0)?(Qa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ma<<2)>>2]|0,(Qa|0)!=-1):0)if(!((Qa>>>0)%3|0)){Ta=Qa+2|0;break}else{Ta=Qa+-1|0;break}else Ta=-1}while(0);if((Ta|0)==(pa|0)){Ka=Sa;break c}if((Ta|0)!=-1|Ha){Ia=Sa;Ja=Ta}else break}if(Da){Ea=0;Fa=Sa;Ga=-1;continue}if(f[(f[e>>2]|0)+(Ba<<2)>>2]&Ca|0){Ea=0;Fa=Sa;Ga=-1;continue}Ja=f[(f[(f[R>>2]|0)+12>>2]|0)+(Q<<2)>>2]|0;if((Ja|0)==-1){Ea=0;Fa=Sa;Ga=-1;continue}if(!((Ja>>>0)%3|0)){Ea=0;Fa=Sa;Ga=Ja+2|0;continue}else{Ea=0;Fa=Sa;Ga=Ja+-1|0;continue}}Ga=X(ra,g)|0;f[r>>2]=0;f[U>>2]=0;b[V>>0]=0;f[Z>>2]=0;f[Z+4>>2]=0;f[Z+8>>2]=0;f[Z+12>>2]=0;f[Z+16>>2]=0;f[Z+20>>2]=0;f[Z+24>>2]=0;Fa=Ka+-1|0;Ea=p+(Fa<<3)|0;Q=Ea;Ca=Vn(f[Q>>2]|0,f[Q+4>>2]|0,Ka|0,((Ka|0)<0)<<31>>31|0)|0;Q=I;Ba=Ea;f[Ba>>2]=Ca;f[Ba+4>>2]=Q;Ba=c+((X(qa+-2|0,g)|0)<<2)|0;Ea=c+(Ga<<2)|0;Da=f[_>>2]|0;if(T){pa=0;Ja=0;while(1){Ia=(f[Ba+(pa<<2)>>2]|0)-(f[Ea+(pa<<2)>>2]|0)|0;Ha=((Ia|0)>-1?Ia:0-Ia|0)+Ja|0;f[va+(pa<<2)>>2]=Ia;f[Da+(pa<<2)>>2]=Ia<<1^Ia>>31;pa=pa+1|0;if((pa|0)==(g|0)){Ua=Ha;break}else Ja=Ha}}else Ua=0;mo(j,$,Da,g);Ja=Zk(j)|0;pa=I;Ha=Bm(j)|0;Ia=I;Qa=o+(Fa<<3)|0;Ma=Qa;Pa=f[Ma>>2]|0;Ra=f[Ma+4>>2]|0;Va=+wm(Ca,Pa);Ma=Vn(Ha|0,Ia|0,Ja|0,pa|0)|0;Wa=+(Ca>>>0)+4294967296.0*+(Q|0);Xa=+W(+(Va*Wa));pa=Vn(Ma|0,I|0,~~Xa>>>0|0,(+K(Xa)>=1.0?(Xa>0.0?~~+Y(+J(Xa/4294967296.0),4294967295.0)>>>0:~~+W((Xa-+(~~Xa>>>0))/4294967296.0)>>>0):0)|0)|0;Ma=r;f[Ma>>2]=pa;f[Ma+4>>2]=Ua;b[V>>0]=0;f[Z>>2]=0;$f(aa,Ba,Ba+(g<<2)|0);f[s>>2]=ta;f[t>>2]=ua;f[k>>2]=f[s>>2];f[j>>2]=f[t>>2];Jf(ba,k,j);if((Ka|0)<1){Ya=za;Za=ya;_a=xa;$a=wa;ab=ua;bb=ta;cb=ta}else{Ma=n+Ka|0;pa=f[q>>2]|0;Ja=pa;Ia=f[H>>2]|0;Ha=Ma+-1|0;La=(Ha|0)==(n|0);Na=Ma+-2|0;Oa=ma>>>0>>0;db=~Ka;eb=Ka+2+((db|0)>-2?db:-2)|0;db=Ia;fb=Ha>>>0>n>>>0;gb=0;hb=1;while(1){gb=gb+1|0;sj(n|0,1,eb|0)|0;sj(n|0,0,gb|0)|0;ib=Vn(Pa|0,Ra|0,hb|0,0)|0;d:while(1){if(T){sj(f[m>>2]|0,0,na|0)|0;jb=f[m>>2]|0;kb=0;lb=0;while(1){if(!(b[n+kb>>0]|0)){mb=f[l+(kb*12|0)>>2]|0;nb=0;do{ob=jb+(nb<<2)|0;f[ob>>2]=(f[ob>>2]|0)+(f[mb+(nb<<2)>>2]|0);nb=nb+1|0}while((nb|0)!=(g|0));pb=(1<>0]|0))rb=(1<>2]|0;do if(T){f[kb>>2]=(f[kb>>2]|0)/(hb|0)|0;if(!oa){lb=1;do{jb=kb+(lb<<2)|0;f[jb>>2]=(f[jb>>2]|0)/(hb|0)|0;lb=lb+1|0}while((lb|0)!=(g|0));lb=f[_>>2]|0;if(T)sb=lb;else{tb=0;ub=lb;break}}else sb=f[_>>2]|0;lb=0;jb=0;while(1){nb=(f[kb+(lb<<2)>>2]|0)-(f[Ea+(lb<<2)>>2]|0)|0;mb=((nb|0)>-1?nb:0-nb|0)+jb|0;f[pa+(lb<<2)>>2]=nb;f[sb+(lb<<2)>>2]=nb<<1^nb>>31;lb=lb+1|0;if((lb|0)==(g|0)){tb=mb;ub=sb;break}else jb=mb}}else{tb=0;ub=f[_>>2]|0}while(0);mo(j,$,ub,g);kb=Zk(j)|0;jb=I;lb=Bm(j)|0;mb=I;Xa=+wm(Ca,ib);nb=Vn(lb|0,mb|0,kb|0,jb|0)|0;Va=+W(+(Xa*Wa));jb=Vn(nb|0,I|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;nb=f[r>>2]|0;if(!((nb|0)<=(jb|0)?!((nb|0)>=(jb|0)?(tb|0)<(f[U>>2]|0):0):0)){nb=r;f[nb>>2]=jb;f[nb+4>>2]=tb;b[V>>0]=qb;f[Z>>2]=hb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[k>>2]=f[v>>2];f[j>>2]=f[w>>2];Jf(aa,k,j);f[x>>2]=Ja;f[y>>2]=Ia;f[k>>2]=f[x>>2];f[j>>2]=f[y>>2];Jf(ba,k,j)}if(La)break;vb=b[Ha>>0]|0;nb=-1;jb=vb;while(1){kb=nb+-1|0;wb=Ma+kb|0;mb=jb;jb=b[wb>>0]|0;if((jb&255)<(mb&255))break;if((wb|0)==(n|0)){xb=84;break d}else nb=kb}kb=Ma+nb|0;if((jb&255)<(vb&255)){yb=Ha;zb=vb}else{mb=Ma;lb=Ha;while(1){ob=lb+-1|0;if((jb&255)<(h[mb+-2>>0]|0)){yb=ob;zb=1;break}else{Ab=lb;lb=ob;mb=Ab}}}b[wb>>0]=zb;b[yb>>0]=jb;if((nb|0)<-1){Bb=kb;Cb=Ha}else continue;while(1){mb=b[Bb>>0]|0;b[Bb>>0]=b[Cb>>0]|0;b[Cb>>0]=mb;mb=Bb+1|0;lb=Cb+-1|0;if(mb>>>0>>0){Bb=mb;Cb=lb}else continue d}}if(((xb|0)==84?(xb=0,fb):0)?(ib=b[n>>0]|0,b[n>>0]=vb,b[Ha>>0]=ib,Oa):0){ib=Na;kb=ma;do{nb=b[kb>>0]|0;b[kb>>0]=b[ib>>0]|0;b[ib>>0]=nb;kb=kb+1|0;ib=ib+-1|0}while(kb>>>0>>0)}if((hb|0)>=(Ka|0)){Ya=db;Za=pa;_a=db;$a=pa;ab=Ia;bb=Ja;cb=pa;break}else hb=hb+1|0}}hb=f[Z>>2]|0;pa=Vn(Pa|0,Ra|0,hb|0,((hb|0)<0)<<31>>31|0)|0;hb=Qa;f[hb>>2]=pa;f[hb+4>>2]=I;if(T){hb=f[ba>>2]|0;pa=f[C>>2]|0;Ja=0;do{Ia=f[hb+(Ja<<2)>>2]|0;f[pa+(Ja<<2)>>2]=Ia<<1^Ia>>31;Ja=Ja+1|0}while((Ja|0)!=(g|0));Db=pa}else Db=f[C>>2]|0;lo(j,$,Db,g);if((Ka|0)>0){Eb=a+60+(Fa*12|0)|0;pa=a+60+(Fa*12|0)+4|0;Ja=a+60+(Fa*12|0)+8|0;hb=0;do{Qa=f[pa>>2]|0;Ra=f[Ja>>2]|0;Pa=(Qa|0)==(Ra<<5|0);if(!(1<>0])){if(Pa){if((Qa+1|0)<0){xb=108;break b}Ia=Ra<<6;db=Qa+32&-32;vi(Eb,Qa>>>0<1073741823?(Ia>>>0>>0?db:Ia):2147483647);Fb=f[pa>>2]|0}else Fb=Qa;f[pa>>2]=Fb+1;Ia=(f[Eb>>2]|0)+(Fb>>>5<<2)|0;f[Ia>>2]=f[Ia>>2]|1<<(Fb&31)}else{if(Pa){if((Qa+1|0)<0){xb=113;break b}Pa=Ra<<6;Ra=Qa+32&-32;vi(Eb,Qa>>>0<1073741823?(Pa>>>0>>0?Ra:Pa):2147483647);Gb=f[pa>>2]|0}else Gb=Qa;f[pa>>2]=Gb+1;Qa=(f[Eb>>2]|0)+(Gb>>>5<<2)|0;f[Qa>>2]=f[Qa>>2]&~(1<<(Gb&31))}hb=hb+1|0}while((hb|0)<(Ka|0))}hb=d+(Ga<<2)|0;pa=f[z>>2]|0;if((pa|0)>0){Ja=0;Fa=f[aa>>2]|0;Qa=pa;while(1){if((Qa|0)>0){pa=0;do{Pa=f[Fa+(pa<<2)>>2]|0;Ra=f[ca>>2]|0;if((Pa|0)>(Ra|0)){Ia=f[da>>2]|0;f[Ia+(pa<<2)>>2]=Ra;Hb=Ia}else{Ia=f[ea>>2]|0;Ra=f[da>>2]|0;f[Ra+(pa<<2)>>2]=(Pa|0)<(Ia|0)?Ia:Pa;Hb=Ra}pa=pa+1|0}while((pa|0)<(f[z>>2]|0));Ib=Hb}else Ib=f[da>>2]|0;pa=(f[Ea+(Ja<<2)>>2]|0)-(f[Ib+(Ja<<2)>>2]|0)|0;Ra=hb+(Ja<<2)|0;f[Ra>>2]=pa;do if((pa|0)<(f[fa>>2]|0)){Jb=(f[ga>>2]|0)+pa|0;xb=103}else{if((pa|0)<=(f[ha>>2]|0))break;Jb=pa-(f[ga>>2]|0)|0;xb=103}while(0);if((xb|0)==103){xb=0;f[Ra>>2]=Jb}Ja=Ja+1|0;Qa=f[z>>2]|0;if((Ja|0)>=(Qa|0))break;else Fa=Ib}}Fa=f[ia>>2]|0;if(Fa|0){Qa=f[la>>2]|0;if((Qa|0)!=(Fa|0))f[la>>2]=Qa+(~((Qa+-4-Fa|0)>>>2)<<2);Oq(Fa)}Fa=f[ja>>2]|0;if(Fa|0){Qa=f[ka>>2]|0;if((Qa|0)!=(Fa|0))f[ka>>2]=Qa+(~((Qa+-4-Fa|0)>>>2)<<2);Oq(Fa)}if((qa|0)<=2){Kb=$a;Lb=_a;break a}Fa=f[B>>2]|0;sa=f[Fa>>2]|0;Qa=ra+-1|0;if((f[Fa+4>>2]|0)-sa>>2>>>0<=Qa>>>0){Aa=Fa;xb=18;break}else{Fa=ra;ra=Qa;ta=bb;ua=ab;va=cb;wa=$a;xa=_a;ya=Za;za=Ya;qa=Fa}}if((xb|0)==18)aq(Aa);else if((xb|0)==108)aq(Eb);else if((xb|0)==113)aq(Eb)}else{Kb=M;Lb=N}while(0);N=f[l>>2]|0;if((g|0)>0?(f[N>>2]=0,(g|0)!=1):0){M=1;do{f[N+(M<<2)>>2]=0;M=M+1|0}while((M|0)!=(g|0))}g=f[z>>2]|0;if((g|0)>0){M=a+16|0;Eb=a+32|0;Aa=a+12|0;qa=a+28|0;Ya=a+20|0;za=a+24|0;a=0;Za=N;N=g;while(1){if((N|0)>0){g=0;do{ya=f[Za+(g<<2)>>2]|0;_a=f[M>>2]|0;if((ya|0)>(_a|0)){xa=f[Eb>>2]|0;f[xa+(g<<2)>>2]=_a;Mb=xa}else{xa=f[Aa>>2]|0;_a=f[Eb>>2]|0;f[_a+(g<<2)>>2]=(ya|0)<(xa|0)?xa:ya;Mb=_a}g=g+1|0}while((g|0)<(f[z>>2]|0));Nb=Mb}else Nb=f[Eb>>2]|0;g=(f[c+(a<<2)>>2]|0)-(f[Nb+(a<<2)>>2]|0)|0;_a=d+(a<<2)|0;f[_a>>2]=g;if((g|0)>=(f[qa>>2]|0)){if((g|0)>(f[za>>2]|0)){Ob=g-(f[Ya>>2]|0)|0;xb=139}}else{Ob=(f[Ya>>2]|0)+g|0;xb=139}if((xb|0)==139){xb=0;f[_a>>2]=Ob}a=a+1|0;N=f[z>>2]|0;if((a|0)>=(N|0))break;else Za=Nb}}if(Kb|0){if((Lb|0)!=(Kb|0))f[H>>2]=Lb+(~((Lb+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[m>>2]|0;if(Kb|0){m=f[E>>2]|0;if((m|0)!=(Kb|0))f[E>>2]=m+(~((m+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[l+36>>2]|0;if(Kb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Kb|0))f[m>>2]=E+(~((E+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[l+24>>2]|0;if(Kb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Kb|0))f[E>>2]=m+(~((m+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[l+12>>2]|0;if(Kb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Kb|0))f[m>>2]=E+(~((E+-4-Kb|0)>>>2)<<2);Oq(Kb)}Kb=f[l>>2]|0;if(!Kb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Kb|0))f[E>>2]=l+(~((l+-4-Kb|0)>>>2)<<2);Oq(Kb);u=i;return 1}function bb(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0;i=u;u=u+240|0;j=i+104|0;k=i+224|0;l=i+176|0;m=i+160|0;n=i+228|0;o=i+72|0;p=i+40|0;q=i+132|0;r=i;s=i+172|0;t=i+156|0;v=i+152|0;w=i+148|0;x=i+144|0;y=i+128|0;z=a+8|0;Mh(z,c,e,g);e=f[a+48>>2]|0;A=f[a+52>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{Ci(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else Ci(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)aq(m);else{D=g<<2;B=ln(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;sj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+152|0;D=a+156|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else Ci(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=ln(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;sj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+56|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>2;R=e+12|0;S=(g|0)>0;T=r+4|0;U=r+8|0;V=r+12|0;Z=a+152|0;_=a+112|0;$=r+16|0;aa=r+28|0;ba=a+16|0;ca=a+32|0;da=a+12|0;ea=a+28|0;fa=a+20|0;ga=a+24|0;ha=r+28|0;ia=r+16|0;ja=r+20|0;ka=r+32|0;la=n+1|0;ma=g<<2;na=(g|0)==1;oa=Q+-1|0;if(F-D>>2>>>0>oa>>>0){pa=Q;qa=oa;ra=D;sa=P;ta=O;ua=M;va=M;wa=N;xa=M;ya=N}else{za=G;aq(za)}b:while(1){oa=f[ra+(qa<<2)>>2]|0;Q=(((oa>>>0)%3|0|0)==0?2:-1)+oa|0;Aa=(oa|0)==-1|(Q|0)==-1;Ba=1;Ca=0;Da=oa;c:while(1){Ea=Ba^1;Fa=Ca;Ga=Da;while(1){if((Ga|0)==-1){Ha=Fa;break c}Ia=f[l+(Fa*12|0)>>2]|0;Ja=f[R>>2]|0;Ka=f[Ja+(Ga<<2)>>2]|0;if((Ka|0)!=-1){La=f[e>>2]|0;Ma=f[A>>2]|0;Na=f[Ma+(f[La+(Ka<<2)>>2]<<2)>>2]|0;Oa=Ka+1|0;Pa=((Oa>>>0)%3|0|0)==0?Ka+-2|0:Oa;if((Pa|0)==-1)Qa=-1;else Qa=f[La+(Pa<<2)>>2]|0;Pa=f[Ma+(Qa<<2)>>2]|0;Oa=(((Ka>>>0)%3|0|0)==0?2:-1)+Ka|0;if((Oa|0)==-1)Ra=-1;else Ra=f[La+(Oa<<2)>>2]|0;Oa=f[Ma+(Ra<<2)>>2]|0;if((Na|0)<(qa|0)&(Pa|0)<(qa|0)&(Oa|0)<(qa|0)){Ma=X(Na,g)|0;Na=X(Pa,g)|0;Pa=X(Oa,g)|0;if(S){Oa=0;do{f[Ia+(Oa<<2)>>2]=(f[c+(Oa+Pa<<2)>>2]|0)+(f[c+(Oa+Na<<2)>>2]|0)-(f[c+(Oa+Ma<<2)>>2]|0);Oa=Oa+1|0}while((Oa|0)!=(g|0))}Oa=Fa+1|0;if((Oa|0)==4){Ha=4;break c}else Sa=Oa}else Sa=Fa}else Sa=Fa;do if(Ba){Oa=Ga+1|0;Ma=((Oa>>>0)%3|0|0)==0?Ga+-2|0:Oa;if((Ma|0)!=-1?(Oa=f[Ja+(Ma<<2)>>2]|0,Ma=Oa+1|0,(Oa|0)!=-1):0)Ta=((Ma>>>0)%3|0|0)==0?Oa+-2|0:Ma;else Ta=-1}else{Ma=(((Ga>>>0)%3|0|0)==0?2:-1)+Ga|0;if((Ma|0)!=-1?(Oa=f[Ja+(Ma<<2)>>2]|0,(Oa|0)!=-1):0)if(!((Oa>>>0)%3|0)){Ta=Oa+2|0;break}else{Ta=Oa+-1|0;break}else Ta=-1}while(0);if((Ta|0)==(oa|0)){Ha=Sa;break c}if((Ta|0)!=-1|Ea){Fa=Sa;Ga=Ta}else break}if(Aa){Ba=0;Ca=Sa;Da=-1;continue}Ga=f[Ja+(Q<<2)>>2]|0;if((Ga|0)==-1){Ba=0;Ca=Sa;Da=-1;continue}if(!((Ga>>>0)%3|0)){Ba=0;Ca=Sa;Da=Ga+2|0;continue}else{Ba=0;Ca=Sa;Da=Ga+-1|0;continue}}Da=X(qa,g)|0;f[r>>2]=0;f[T>>2]=0;b[U>>0]=0;f[V>>2]=0;f[V+4>>2]=0;f[V+8>>2]=0;f[V+12>>2]=0;f[V+16>>2]=0;f[V+20>>2]=0;f[V+24>>2]=0;Ca=Ha+-1|0;Ba=p+(Ca<<3)|0;Q=Ba;Aa=Vn(f[Q>>2]|0,f[Q+4>>2]|0,Ha|0,((Ha|0)<0)<<31>>31|0)|0;Q=I;oa=Ba;f[oa>>2]=Aa;f[oa+4>>2]=Q;oa=c+((X(pa+-2|0,g)|0)<<2)|0;Ba=c+(Da<<2)|0;Ga=f[Z>>2]|0;if(S){Fa=0;Ea=0;while(1){Oa=(f[oa+(Fa<<2)>>2]|0)-(f[Ba+(Fa<<2)>>2]|0)|0;Ma=((Oa|0)>-1?Oa:0-Oa|0)+Ea|0;f[ua+(Fa<<2)>>2]=Oa;f[Ga+(Fa<<2)>>2]=Oa<<1^Oa>>31;Fa=Fa+1|0;if((Fa|0)==(g|0)){Ua=Ma;break}else Ea=Ma}}else Ua=0;mo(j,_,Ga,g);Ea=Zk(j)|0;Fa=I;Ma=Bm(j)|0;Oa=I;Na=o+(Ca<<3)|0;Pa=Na;Ia=f[Pa>>2]|0;La=f[Pa+4>>2]|0;Va=+wm(Aa,Ia);Pa=Vn(Ma|0,Oa|0,Ea|0,Fa|0)|0;Wa=+(Aa>>>0)+4294967296.0*+(Q|0);Xa=+W(+(Va*Wa));Fa=Vn(Pa|0,I|0,~~Xa>>>0|0,(+K(Xa)>=1.0?(Xa>0.0?~~+Y(+J(Xa/4294967296.0),4294967295.0)>>>0:~~+W((Xa-+(~~Xa>>>0))/4294967296.0)>>>0):0)|0)|0;Pa=r;f[Pa>>2]=Fa;f[Pa+4>>2]=Ua;b[U>>0]=0;f[V>>2]=0;$f($,oa,oa+(g<<2)|0);f[s>>2]=sa;f[t>>2]=ta;f[k>>2]=f[s>>2];f[j>>2]=f[t>>2];Jf(aa,k,j);if((Ha|0)<1){Ya=ya;Za=xa;_a=wa;$a=va;ab=ta;bb=sa;cb=sa}else{Pa=n+Ha|0;Fa=f[q>>2]|0;Ea=Fa;Oa=f[H>>2]|0;Ma=Pa+-1|0;Ka=(Ma|0)==(n|0);db=Pa+-2|0;eb=la>>>0>>0;fb=~Ha;gb=Ha+2+((fb|0)>-2?fb:-2)|0;fb=Oa;hb=Ma>>>0>n>>>0;ib=0;jb=1;while(1){ib=ib+1|0;sj(n|0,1,gb|0)|0;sj(n|0,0,ib|0)|0;kb=Vn(Ia|0,La|0,jb|0,0)|0;d:while(1){if(S){sj(f[m>>2]|0,0,ma|0)|0;lb=f[m>>2]|0;mb=0;nb=0;while(1){if(!(b[n+mb>>0]|0)){ob=f[l+(mb*12|0)>>2]|0;pb=0;do{qb=lb+(pb<<2)|0;f[qb>>2]=(f[qb>>2]|0)+(f[ob+(pb<<2)>>2]|0);pb=pb+1|0}while((pb|0)!=(g|0));rb=(1<>0]|0))tb=(1<>2]|0;do if(S){f[mb>>2]=(f[mb>>2]|0)/(jb|0)|0;if(!na){nb=1;do{lb=mb+(nb<<2)|0;f[lb>>2]=(f[lb>>2]|0)/(jb|0)|0;nb=nb+1|0}while((nb|0)!=(g|0));nb=f[Z>>2]|0;if(S)ub=nb;else{vb=0;wb=nb;break}}else ub=f[Z>>2]|0;nb=0;lb=0;while(1){pb=(f[mb+(nb<<2)>>2]|0)-(f[Ba+(nb<<2)>>2]|0)|0;ob=((pb|0)>-1?pb:0-pb|0)+lb|0;f[Fa+(nb<<2)>>2]=pb;f[ub+(nb<<2)>>2]=pb<<1^pb>>31;nb=nb+1|0;if((nb|0)==(g|0)){vb=ob;wb=ub;break}else lb=ob}}else{vb=0;wb=f[Z>>2]|0}while(0);mo(j,_,wb,g);mb=Zk(j)|0;lb=I;nb=Bm(j)|0;ob=I;Xa=+wm(Aa,kb);pb=Vn(nb|0,ob|0,mb|0,lb|0)|0;Va=+W(+(Xa*Wa));lb=Vn(pb|0,I|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;pb=f[r>>2]|0;if(!((pb|0)<=(lb|0)?!((pb|0)>=(lb|0)?(vb|0)<(f[T>>2]|0):0):0)){pb=r;f[pb>>2]=lb;f[pb+4>>2]=vb;b[U>>0]=sb;f[V>>2]=jb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[k>>2]=f[v>>2];f[j>>2]=f[w>>2];Jf($,k,j);f[x>>2]=Ea;f[y>>2]=Oa;f[k>>2]=f[x>>2];f[j>>2]=f[y>>2];Jf(aa,k,j)}if(Ka)break;xb=b[Ma>>0]|0;pb=-1;lb=xb;while(1){mb=pb+-1|0;yb=Pa+mb|0;ob=lb;lb=b[yb>>0]|0;if((lb&255)<(ob&255))break;if((yb|0)==(n|0)){zb=84;break d}else pb=mb}mb=Pa+pb|0;if((lb&255)<(xb&255)){Ab=Ma;Bb=xb}else{ob=Pa;nb=Ma;while(1){qb=nb+-1|0;if((lb&255)<(h[ob+-2>>0]|0)){Ab=qb;Bb=1;break}else{Cb=nb;nb=qb;ob=Cb}}}b[yb>>0]=Bb;b[Ab>>0]=lb;if((pb|0)<-1){Db=mb;Eb=Ma}else continue;while(1){ob=b[Db>>0]|0;b[Db>>0]=b[Eb>>0]|0;b[Eb>>0]=ob;ob=Db+1|0;nb=Eb+-1|0;if(ob>>>0>>0){Db=ob;Eb=nb}else continue d}}if(((zb|0)==84?(zb=0,hb):0)?(kb=b[n>>0]|0,b[n>>0]=xb,b[Ma>>0]=kb,eb):0){kb=db;mb=la;do{pb=b[mb>>0]|0;b[mb>>0]=b[kb>>0]|0;b[kb>>0]=pb;mb=mb+1|0;kb=kb+-1|0}while(mb>>>0>>0)}if((jb|0)>=(Ha|0)){Ya=fb;Za=Fa;_a=fb;$a=Fa;ab=Oa;bb=Ea;cb=Fa;break}else jb=jb+1|0}}jb=f[V>>2]|0;Fa=Vn(Ia|0,La|0,jb|0,((jb|0)<0)<<31>>31|0)|0;jb=Na;f[jb>>2]=Fa;f[jb+4>>2]=I;if(S){jb=f[aa>>2]|0;Fa=f[C>>2]|0;Ea=0;do{Oa=f[jb+(Ea<<2)>>2]|0;f[Fa+(Ea<<2)>>2]=Oa<<1^Oa>>31;Ea=Ea+1|0}while((Ea|0)!=(g|0));Fb=Fa}else Fb=f[C>>2]|0;lo(j,_,Fb,g);if((Ha|0)>0){Gb=a+60+(Ca*12|0)|0;Fa=a+60+(Ca*12|0)+4|0;Ea=a+60+(Ca*12|0)+8|0;jb=0;do{Na=f[Fa>>2]|0;La=f[Ea>>2]|0;Ia=(Na|0)==(La<<5|0);if(!(1<>0])){if(Ia){if((Na+1|0)<0){zb=108;break b}Oa=La<<6;fb=Na+32&-32;vi(Gb,Na>>>0<1073741823?(Oa>>>0>>0?fb:Oa):2147483647);Hb=f[Fa>>2]|0}else Hb=Na;f[Fa>>2]=Hb+1;Oa=(f[Gb>>2]|0)+(Hb>>>5<<2)|0;f[Oa>>2]=f[Oa>>2]|1<<(Hb&31)}else{if(Ia){if((Na+1|0)<0){zb=113;break b}Ia=La<<6;La=Na+32&-32;vi(Gb,Na>>>0<1073741823?(Ia>>>0>>0?La:Ia):2147483647);Ib=f[Fa>>2]|0}else Ib=Na;f[Fa>>2]=Ib+1;Na=(f[Gb>>2]|0)+(Ib>>>5<<2)|0;f[Na>>2]=f[Na>>2]&~(1<<(Ib&31))}jb=jb+1|0}while((jb|0)<(Ha|0))}jb=d+(Da<<2)|0;Fa=f[z>>2]|0;if((Fa|0)>0){Ea=0;Ca=f[$>>2]|0;Na=Fa;while(1){if((Na|0)>0){Fa=0;do{Ia=f[Ca+(Fa<<2)>>2]|0;La=f[ba>>2]|0;if((Ia|0)>(La|0)){Oa=f[ca>>2]|0;f[Oa+(Fa<<2)>>2]=La;Jb=Oa}else{Oa=f[da>>2]|0;La=f[ca>>2]|0;f[La+(Fa<<2)>>2]=(Ia|0)<(Oa|0)?Oa:Ia;Jb=La}Fa=Fa+1|0}while((Fa|0)<(f[z>>2]|0));Kb=Jb}else Kb=f[ca>>2]|0;Fa=(f[Ba+(Ea<<2)>>2]|0)-(f[Kb+(Ea<<2)>>2]|0)|0;La=jb+(Ea<<2)|0;f[La>>2]=Fa;do if((Fa|0)<(f[ea>>2]|0)){Lb=(f[fa>>2]|0)+Fa|0;zb=103}else{if((Fa|0)<=(f[ga>>2]|0))break;Lb=Fa-(f[fa>>2]|0)|0;zb=103}while(0);if((zb|0)==103){zb=0;f[La>>2]=Lb}Ea=Ea+1|0;Na=f[z>>2]|0;if((Ea|0)>=(Na|0))break;else Ca=Kb}}Ca=f[ha>>2]|0;if(Ca|0){Na=f[ka>>2]|0;if((Na|0)!=(Ca|0))f[ka>>2]=Na+(~((Na+-4-Ca|0)>>>2)<<2);Oq(Ca)}Ca=f[ia>>2]|0;if(Ca|0){Na=f[ja>>2]|0;if((Na|0)!=(Ca|0))f[ja>>2]=Na+(~((Na+-4-Ca|0)>>>2)<<2);Oq(Ca)}if((pa|0)<=2){Mb=$a;Nb=_a;break a}Ca=f[B>>2]|0;ra=f[Ca>>2]|0;Na=qa+-1|0;if((f[Ca+4>>2]|0)-ra>>2>>>0<=Na>>>0){za=Ca;zb=18;break}else{Ca=qa;qa=Na;sa=bb;ta=ab;ua=cb;va=$a;wa=_a;xa=Za;ya=Ya;pa=Ca}}if((zb|0)==18)aq(za);else if((zb|0)==108)aq(Gb);else if((zb|0)==113)aq(Gb)}else{Mb=M;Nb=N}while(0);N=f[l>>2]|0;if((g|0)>0?(f[N>>2]=0,(g|0)!=1):0){M=1;do{f[N+(M<<2)>>2]=0;M=M+1|0}while((M|0)!=(g|0))}g=f[z>>2]|0;if((g|0)>0){M=a+16|0;Gb=a+32|0;za=a+12|0;pa=a+28|0;Ya=a+20|0;ya=a+24|0;a=0;Za=N;N=g;while(1){if((N|0)>0){g=0;do{xa=f[Za+(g<<2)>>2]|0;_a=f[M>>2]|0;if((xa|0)>(_a|0)){wa=f[Gb>>2]|0;f[wa+(g<<2)>>2]=_a;Ob=wa}else{wa=f[za>>2]|0;_a=f[Gb>>2]|0;f[_a+(g<<2)>>2]=(xa|0)<(wa|0)?wa:xa;Ob=_a}g=g+1|0}while((g|0)<(f[z>>2]|0));Pb=Ob}else Pb=f[Gb>>2]|0;g=(f[c+(a<<2)>>2]|0)-(f[Pb+(a<<2)>>2]|0)|0;_a=d+(a<<2)|0;f[_a>>2]=g;if((g|0)>=(f[pa>>2]|0)){if((g|0)>(f[ya>>2]|0)){Qb=g-(f[Ya>>2]|0)|0;zb=139}}else{Qb=(f[Ya>>2]|0)+g|0;zb=139}if((zb|0)==139){zb=0;f[_a>>2]=Qb}a=a+1|0;N=f[z>>2]|0;if((a|0)>=(N|0))break;else Za=Pb}}if(Mb|0){if((Nb|0)!=(Mb|0))f[H>>2]=Nb+(~((Nb+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[m>>2]|0;if(Mb|0){m=f[E>>2]|0;if((m|0)!=(Mb|0))f[E>>2]=m+(~((m+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[l+36>>2]|0;if(Mb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Mb|0))f[m>>2]=E+(~((E+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[l+24>>2]|0;if(Mb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Mb|0))f[E>>2]=m+(~((m+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[l+12>>2]|0;if(Mb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Mb|0))f[m>>2]=E+(~((E+-4-Mb|0)>>>2)<<2);Oq(Mb)}Mb=f[l>>2]|0;if(!Mb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Mb|0))f[E>>2]=l+(~((l+-4-Mb|0)>>>2)<<2);Oq(Mb);u=i;return 1}function cb(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;b=u;u=u+16|0;c=b;d=b+8|0;e=b+4|0;f[d>>2]=a;do if(a>>>0>=212){g=(a>>>0)/210|0;h=g*210|0;f[e>>2]=a-h;i=0;j=g;g=(Hl(6952,7144,e,c)|0)-6952>>2;k=h;a:while(1){l=(f[6952+(g<<2)>>2]|0)+k|0;h=5;while(1){if(h>>>0>=47){m=211;n=i;o=8;break}p=f[6760+(h<<2)>>2]|0;q=(l>>>0)/(p>>>0)|0;if(q>>>0

>>0){o=106;break a}if((l|0)==(X(q,p)|0)){r=i;break}else h=h+1|0}b:do if((o|0)==8){c:while(1){o=0;h=(l>>>0)/(m>>>0)|0;do if(h>>>0>=m>>>0)if((l|0)!=(X(h,m)|0)){p=m+10|0;q=(l>>>0)/(p>>>0)|0;if(q>>>0>=p>>>0)if((l|0)!=(X(q,p)|0)){q=m+12|0;s=(l>>>0)/(q>>>0)|0;if(s>>>0>=q>>>0)if((l|0)!=(X(s,q)|0)){s=m+16|0;t=(l>>>0)/(s>>>0)|0;if(t>>>0>=s>>>0)if((l|0)!=(X(t,s)|0)){t=m+18|0;v=(l>>>0)/(t>>>0)|0;if(v>>>0>=t>>>0)if((l|0)!=(X(v,t)|0)){v=m+22|0;w=(l>>>0)/(v>>>0)|0;if(w>>>0>=v>>>0)if((l|0)!=(X(w,v)|0)){w=m+28|0;x=(l>>>0)/(w>>>0)|0;if(x>>>0>=w>>>0)if((l|0)==(X(x,w)|0)){y=w;z=9;A=n}else{x=m+30|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+36|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+40|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+42|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+46|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+52|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+58|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+60|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+66|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+70|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+72|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+78|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+82|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+88|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+96|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+100|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+102|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+106|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+108|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+112|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+120|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+126|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+130|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+136|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+138|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+142|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+148|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+150|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+156|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+162|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+166|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+168|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+172|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+178|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+180|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+186|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+190|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+192|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+196|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+198|0;B=(l>>>0)/(x>>>0)|0;if(B>>>0>>0){y=x;z=1;A=l;break}if((l|0)==(X(B,x)|0)){y=x;z=9;A=n;break}x=m+208|0;B=(l>>>0)/(x>>>0)|0;C=B>>>0>>0;D=(l|0)==(X(B,x)|0);y=C|D?x:m+210|0;z=C?1:D?9:0;A=C?l:n}else{y=w;z=1;A=l}}else{y=v;z=9;A=n}else{y=v;z=1;A=l}}else{y=t;z=9;A=n}else{y=t;z=1;A=l}}else{y=s;z=9;A=n}else{y=s;z=1;A=l}}else{y=q;z=9;A=n}else{y=q;z=1;A=l}}else{y=p;z=9;A=n}else{y=p;z=1;A=l}}else{y=m;z=9;A=n}else{y=m;z=1;A=l}while(0);switch(z&15){case 9:{r=A;break b;break}case 0:{m=y;n=A;o=8;break}default:break c}}if(!z)r=A;else{o=107;break a}}while(0);h=g+1|0;p=(h|0)==48;q=j+(p&1)|0;i=r;j=q;g=p?0:h;k=q*210|0}if((o|0)==106){f[d>>2]=l;E=l;break}else if((o|0)==107){f[d>>2]=l;E=A;break}}else{k=Hl(6760,6952,d,c)|0;E=f[k>>2]|0}while(0);u=b;return E|0}function db(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0;i=u;u=u+256|0;e=i+104|0;j=i+240|0;k=i+224|0;l=i+160|0;m=i+140|0;n=i+248|0;o=i+72|0;p=i+40|0;q=i+128|0;r=i;s=i+232|0;t=i+220|0;v=i+216|0;w=i+212|0;x=i+208|0;y=i+152|0;z=f[a+28>>2]|0;A=f[a+32>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{Ci(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else Ci(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)aq(m);else{D=g<<2;B=ln(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;sj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+136|0;D=a+140|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else Ci(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=ln(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;sj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+36|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>2;R=z+64|0;S=z+28|0;T=(g|0)>0;U=r+4|0;V=r+8|0;Z=r+12|0;_=a+136|0;$=a+96|0;aa=r+16|0;ba=r+28|0;ca=a+8|0;da=j+4|0;ea=k+4|0;fa=e+4|0;ga=r+28|0;ha=r+16|0;ia=r+20|0;ja=r+32|0;ka=n+1|0;la=g<<2;ma=(g|0)==1;na=Q+-1|0;if(F-D>>2>>>0>na>>>0){oa=Q;pa=na;qa=D;ra=P;sa=O;ta=M;ua=M;va=N;wa=M;xa=N}else{ya=G;aq(ya)}b:while(1){na=f[qa+(pa<<2)>>2]|0;Q=(((na>>>0)%3|0|0)==0?2:-1)+na|0;za=Q>>>5;Aa=1<<(Q&31);Ba=(na|0)==-1|(Q|0)==-1;Ca=1;Da=0;Ea=na;c:while(1){Fa=Ca^1;Ga=Da;Ha=Ea;while(1){if((Ha|0)==-1){Ia=Ga;break c}Ja=f[l+(Ga*12|0)>>2]|0;if(((f[(f[z>>2]|0)+(Ha>>>5<<2)>>2]&1<<(Ha&31)|0)==0?(Ka=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ha<<2)>>2]|0,(Ka|0)!=-1):0)?(La=f[S>>2]|0,Ma=f[A>>2]|0,Na=f[Ma+(f[La+(Ka<<2)>>2]<<2)>>2]|0,Oa=Ka+1|0,Pa=f[Ma+(f[La+((((Oa>>>0)%3|0|0)==0?Ka+-2|0:Oa)<<2)>>2]<<2)>>2]|0,Oa=f[Ma+(f[La+((((Ka>>>0)%3|0|0)==0?2:-1)+Ka<<2)>>2]<<2)>>2]|0,(Na|0)<(pa|0)&(Pa|0)<(pa|0)&(Oa|0)<(pa|0)):0){Ka=X(Na,g)|0;Na=X(Pa,g)|0;Pa=X(Oa,g)|0;if(T){Oa=0;do{f[Ja+(Oa<<2)>>2]=(f[c+(Oa+Pa<<2)>>2]|0)+(f[c+(Oa+Na<<2)>>2]|0)-(f[c+(Oa+Ka<<2)>>2]|0);Oa=Oa+1|0}while((Oa|0)!=(g|0))}Oa=Ga+1|0;if((Oa|0)==4){Ia=4;break c}else Qa=Oa}else Qa=Ga;do if(Ca){Oa=Ha+1|0;Ka=((Oa>>>0)%3|0|0)==0?Ha+-2|0:Oa;if(((Ka|0)!=-1?(f[(f[z>>2]|0)+(Ka>>>5<<2)>>2]&1<<(Ka&31)|0)==0:0)?(Oa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ka<<2)>>2]|0,Ka=Oa+1|0,(Oa|0)!=-1):0)Ra=((Ka>>>0)%3|0|0)==0?Oa+-2|0:Ka;else Ra=-1}else{Ka=(((Ha>>>0)%3|0|0)==0?2:-1)+Ha|0;if(((Ka|0)!=-1?(f[(f[z>>2]|0)+(Ka>>>5<<2)>>2]&1<<(Ka&31)|0)==0:0)?(Oa=f[(f[(f[R>>2]|0)+12>>2]|0)+(Ka<<2)>>2]|0,(Oa|0)!=-1):0)if(!((Oa>>>0)%3|0)){Ra=Oa+2|0;break}else{Ra=Oa+-1|0;break}else Ra=-1}while(0);if((Ra|0)==(na|0)){Ia=Qa;break c}if((Ra|0)!=-1|Fa){Ga=Qa;Ha=Ra}else break}if(Ba){Ca=0;Da=Qa;Ea=-1;continue}if(f[(f[z>>2]|0)+(za<<2)>>2]&Aa|0){Ca=0;Da=Qa;Ea=-1;continue}Ha=f[(f[(f[R>>2]|0)+12>>2]|0)+(Q<<2)>>2]|0;if((Ha|0)==-1){Ca=0;Da=Qa;Ea=-1;continue}if(!((Ha>>>0)%3|0)){Ca=0;Da=Qa;Ea=Ha+2|0;continue}else{Ca=0;Da=Qa;Ea=Ha+-1|0;continue}}Ea=X(pa,g)|0;f[r>>2]=0;f[U>>2]=0;b[V>>0]=0;f[Z>>2]=0;f[Z+4>>2]=0;f[Z+8>>2]=0;f[Z+12>>2]=0;f[Z+16>>2]=0;f[Z+20>>2]=0;f[Z+24>>2]=0;Da=Ia+-1|0;Ca=p+(Da<<3)|0;Q=Ca;Aa=Vn(f[Q>>2]|0,f[Q+4>>2]|0,Ia|0,((Ia|0)<0)<<31>>31|0)|0;Q=I;za=Ca;f[za>>2]=Aa;f[za+4>>2]=Q;za=c+((X(oa+-2|0,g)|0)<<2)|0;Ca=c+(Ea<<2)|0;Ba=f[_>>2]|0;if(T){na=0;Ha=0;while(1){Ga=(f[za+(na<<2)>>2]|0)-(f[Ca+(na<<2)>>2]|0)|0;Fa=((Ga|0)>-1?Ga:0-Ga|0)+Ha|0;f[ta+(na<<2)>>2]=Ga;f[Ba+(na<<2)>>2]=Ga<<1^Ga>>31;na=na+1|0;if((na|0)==(g|0)){Sa=Fa;break}else Ha=Fa}}else Sa=0;mo(e,$,Ba,g);Ha=Zk(e)|0;na=I;Fa=Bm(e)|0;Ga=I;Oa=o+(Da<<3)|0;Ka=Oa;Na=f[Ka>>2]|0;Pa=f[Ka+4>>2]|0;Ta=+wm(Aa,Na);Ka=Vn(Fa|0,Ga|0,Ha|0,na|0)|0;Ua=+(Aa>>>0)+4294967296.0*+(Q|0);Va=+W(+(Ta*Ua));na=Vn(Ka|0,I|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;Ka=r;f[Ka>>2]=na;f[Ka+4>>2]=Sa;b[V>>0]=0;f[Z>>2]=0;$f(aa,za,za+(g<<2)|0);f[s>>2]=ra;f[t>>2]=sa;f[j>>2]=f[s>>2];f[e>>2]=f[t>>2];Jf(ba,j,e);if((Ia|0)<1){Wa=xa;Xa=wa;Ya=va;Za=ua;_a=sa;$a=ra;ab=ra}else{Ka=n+Ia|0;na=f[q>>2]|0;Ha=na;Ga=f[H>>2]|0;Fa=Ka+-1|0;Ja=(Fa|0)==(n|0);La=Ka+-2|0;Ma=ka>>>0>>0;bb=~Ia;cb=Ia+2+((bb|0)>-2?bb:-2)|0;bb=Ga;db=Fa>>>0>n>>>0;eb=0;fb=1;while(1){eb=eb+1|0;sj(n|0,1,cb|0)|0;sj(n|0,0,eb|0)|0;gb=Vn(Na|0,Pa|0,fb|0,0)|0;d:while(1){if(T){sj(f[m>>2]|0,0,la|0)|0;hb=f[m>>2]|0;ib=0;jb=0;while(1){if(!(b[n+ib>>0]|0)){kb=f[l+(ib*12|0)>>2]|0;lb=0;do{mb=hb+(lb<<2)|0;f[mb>>2]=(f[mb>>2]|0)+(f[kb+(lb<<2)>>2]|0);lb=lb+1|0}while((lb|0)!=(g|0));nb=(1<>0]|0))pb=(1<>2]|0;do if(T){f[ib>>2]=(f[ib>>2]|0)/(fb|0)|0;if(!ma){jb=1;do{hb=ib+(jb<<2)|0;f[hb>>2]=(f[hb>>2]|0)/(fb|0)|0;jb=jb+1|0}while((jb|0)!=(g|0));jb=f[_>>2]|0;if(T)qb=jb;else{rb=0;sb=jb;break}}else qb=f[_>>2]|0;jb=0;hb=0;while(1){lb=(f[ib+(jb<<2)>>2]|0)-(f[Ca+(jb<<2)>>2]|0)|0;kb=((lb|0)>-1?lb:0-lb|0)+hb|0;f[na+(jb<<2)>>2]=lb;f[qb+(jb<<2)>>2]=lb<<1^lb>>31;jb=jb+1|0;if((jb|0)==(g|0)){rb=kb;sb=qb;break}else hb=kb}}else{rb=0;sb=f[_>>2]|0}while(0);mo(e,$,sb,g);ib=Zk(e)|0;hb=I;jb=Bm(e)|0;kb=I;Va=+wm(Aa,gb);lb=Vn(jb|0,kb|0,ib|0,hb|0)|0;Ta=+W(+(Va*Ua));hb=Vn(lb|0,I|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;lb=f[r>>2]|0;if(!((lb|0)<=(hb|0)?!((lb|0)>=(hb|0)?(rb|0)<(f[U>>2]|0):0):0)){lb=r;f[lb>>2]=hb;f[lb+4>>2]=rb;b[V>>0]=ob;f[Z>>2]=fb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[j>>2]=f[v>>2];f[e>>2]=f[w>>2];Jf(aa,j,e);f[x>>2]=Ha;f[y>>2]=Ga;f[j>>2]=f[x>>2];f[e>>2]=f[y>>2];Jf(ba,j,e)}if(Ja)break;tb=b[Fa>>0]|0;lb=-1;hb=tb;while(1){ib=lb+-1|0;ub=Ka+ib|0;kb=hb;hb=b[ub>>0]|0;if((hb&255)<(kb&255))break;if((ub|0)==(n|0)){vb=84;break d}else lb=ib}ib=Ka+lb|0;if((hb&255)<(tb&255)){wb=Fa;xb=tb}else{kb=Ka;jb=Fa;while(1){mb=jb+-1|0;if((hb&255)<(h[kb+-2>>0]|0)){wb=mb;xb=1;break}else{yb=jb;jb=mb;kb=yb}}}b[ub>>0]=xb;b[wb>>0]=hb;if((lb|0)<-1){zb=ib;Ab=Fa}else continue;while(1){kb=b[zb>>0]|0;b[zb>>0]=b[Ab>>0]|0;b[Ab>>0]=kb;kb=zb+1|0;jb=Ab+-1|0;if(kb>>>0>>0){zb=kb;Ab=jb}else continue d}}if(((vb|0)==84?(vb=0,db):0)?(gb=b[n>>0]|0,b[n>>0]=tb,b[Fa>>0]=gb,Ma):0){gb=La;ib=ka;do{lb=b[ib>>0]|0;b[ib>>0]=b[gb>>0]|0;b[gb>>0]=lb;ib=ib+1|0;gb=gb+-1|0}while(ib>>>0>>0)}if((fb|0)>=(Ia|0)){Wa=bb;Xa=na;Ya=bb;Za=na;_a=Ga;$a=Ha;ab=na;break}else fb=fb+1|0}}fb=f[Z>>2]|0;na=Vn(Na|0,Pa|0,fb|0,((fb|0)<0)<<31>>31|0)|0;fb=Oa;f[fb>>2]=na;f[fb+4>>2]=I;if(T){fb=f[ba>>2]|0;na=f[C>>2]|0;Ha=0;do{Ga=f[fb+(Ha<<2)>>2]|0;f[na+(Ha<<2)>>2]=Ga<<1^Ga>>31;Ha=Ha+1|0}while((Ha|0)!=(g|0));Bb=na}else Bb=f[C>>2]|0;lo(e,$,Bb,g);if((Ia|0)>0){Cb=a+40+(Da*12|0)|0;na=a+40+(Da*12|0)+4|0;Ha=a+40+(Da*12|0)+8|0;fb=0;do{Oa=f[na>>2]|0;Pa=f[Ha>>2]|0;Na=(Oa|0)==(Pa<<5|0);if(!(1<>0])){if(Na){if((Oa+1|0)<0){vb=95;break b}Ga=Pa<<6;bb=Oa+32&-32;vi(Cb,Oa>>>0<1073741823?(Ga>>>0>>0?bb:Ga):2147483647);Db=f[na>>2]|0}else Db=Oa;f[na>>2]=Db+1;Ga=(f[Cb>>2]|0)+(Db>>>5<<2)|0;f[Ga>>2]=f[Ga>>2]|1<<(Db&31)}else{if(Na){if((Oa+1|0)<0){vb=100;break b}Na=Pa<<6;Pa=Oa+32&-32;vi(Cb,Oa>>>0<1073741823?(Na>>>0>>0?Pa:Na):2147483647);Eb=f[na>>2]|0}else Eb=Oa;f[na>>2]=Eb+1;Oa=(f[Cb>>2]|0)+(Eb>>>5<<2)|0;f[Oa>>2]=f[Oa>>2]&~(1<<(Eb&31))}fb=fb+1|0}while((fb|0)<(Ia|0))}fb=f[aa>>2]|0;na=d+(Ea<<2)|0;Ha=f[Ca+4>>2]|0;Da=f[fb>>2]|0;Oa=f[fb+4>>2]|0;f[j>>2]=f[Ca>>2];f[da>>2]=Ha;f[k>>2]=Da;f[ea>>2]=Oa;Od(e,ca,j,k);f[na>>2]=f[e>>2];f[na+4>>2]=f[fa>>2];na=f[ga>>2]|0;if(na|0){Oa=f[ja>>2]|0;if((Oa|0)!=(na|0))f[ja>>2]=Oa+(~((Oa+-4-na|0)>>>2)<<2);Oq(na)}na=f[ha>>2]|0;if(na|0){Oa=f[ia>>2]|0;if((Oa|0)!=(na|0))f[ia>>2]=Oa+(~((Oa+-4-na|0)>>>2)<<2);Oq(na)}if((oa|0)<=2){Fb=Za;Gb=Ya;break a}na=f[B>>2]|0;qa=f[na>>2]|0;Oa=pa+-1|0;if((f[na+4>>2]|0)-qa>>2>>>0<=Oa>>>0){ya=na;vb=18;break}else{na=pa;pa=Oa;ra=$a;sa=_a;ta=ab;ua=Za;va=Ya;wa=Xa;xa=Wa;oa=na}}if((vb|0)==18)aq(ya);else if((vb|0)==95)aq(Cb);else if((vb|0)==100)aq(Cb)}else{Fb=M;Gb=N}while(0);if((g|0)>0)sj(f[l>>2]|0,0,g<<2|0)|0;g=f[l>>2]|0;N=f[c+4>>2]|0;M=f[g>>2]|0;Cb=f[g+4>>2]|0;f[j>>2]=f[c>>2];f[j+4>>2]=N;f[k>>2]=M;f[k+4>>2]=Cb;Od(e,a+8|0,j,k);f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];if(Fb|0){if((Gb|0)!=(Fb|0))f[H>>2]=Gb+(~((Gb+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[m>>2]|0;if(Fb|0){m=f[E>>2]|0;if((m|0)!=(Fb|0))f[E>>2]=m+(~((m+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[l+36>>2]|0;if(Fb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Fb|0))f[m>>2]=E+(~((E+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[l+24>>2]|0;if(Fb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Fb|0))f[E>>2]=m+(~((m+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[l+12>>2]|0;if(Fb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Fb|0))f[m>>2]=E+(~((E+-4-Fb|0)>>>2)<<2);Oq(Fb)}Fb=f[l>>2]|0;if(!Fb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Fb|0))f[E>>2]=l+(~((l+-4-Fb|0)>>>2)<<2);Oq(Fb);u=i;return 1}function eb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0;c=u;u=u+32|0;d=c+16|0;e=c+4|0;g=c;f[a+36>>2]=b;h=a+24|0;i=a+28|0;j=f[i>>2]|0;k=f[h>>2]|0;l=j-k>>2;m=k;k=j;if(l>>>0>=b>>>0){if(l>>>0>b>>>0?(j=m+(b<<2)|0,(j|0)!=(k|0)):0)f[i>>2]=k+(~((k+-4-j|0)>>>2)<<2)}else Ch(h,b-l|0,6140);f[d>>2]=0;l=d+4|0;f[l>>2]=0;j=d+8|0;f[j>>2]=0;if(b){if((b|0)<0)aq(d);k=((b+-1|0)>>>5)+1|0;m=ln(k<<2)|0;f[d>>2]=m;f[j>>2]=k;f[l>>2]=b;k=b>>>5;sj(m|0,0,k<<2|0)|0;n=b&31;o=m+(k<<2)|0;k=m;if(!n){p=b;q=k;r=m}else{f[o>>2]=f[o>>2]&~(-1>>>(32-n|0));p=b;q=k;r=m}}else{p=0;q=0;r=0}m=a+4|0;k=f[a>>2]|0;n=(f[m>>2]|0)-k|0;o=n>>2;f[e>>2]=0;s=e+4|0;f[s>>2]=0;t=e+8|0;f[t>>2]=0;do if(o){if((n|0)<0)aq(e);v=((o+-1|0)>>>5)+1|0;w=ln(v<<2)|0;f[e>>2]=w;f[t>>2]=v;f[s>>2]=o;v=o>>>5;sj(w|0,0,v<<2|0)|0;x=o&31;y=w+(v<<2)|0;if(x|0)f[y>>2]=f[y>>2]&~(-1>>>(32-x|0));if(o>>>0>2){x=a+12|0;y=a+32|0;v=a+52|0;w=a+56|0;z=a+48|0;A=b;B=k;C=0;D=q;E=r;a:while(1){F=B;G=C*3|0;if((G|0)!=-1){H=f[F+(G<<2)>>2]|0;I=G+1|0;J=((I>>>0)%3|0|0)==0?G+-2|0:I;if((J|0)==-1)K=-1;else K=f[F+(J<<2)>>2]|0;J=(((G>>>0)%3|0|0)==0?2:-1)+G|0;if((J|0)==-1)L=-1;else L=f[F+(J<<2)>>2]|0;if((H|0)!=(K|0)?!((H|0)==(L|0)|(K|0)==(L|0)):0){H=0;J=A;F=E;I=D;while(1){M=H+G|0;if(!(f[(f[e>>2]|0)+(M>>>5<<2)>>2]&1<<(M&31))){N=f[(f[a>>2]|0)+(M<<2)>>2]|0;f[g>>2]=N;if(!(f[F+(N>>>5<<2)>>2]&1<<(N&31))){O=0;P=J;Q=N}else{N=f[i>>2]|0;if((N|0)==(f[y>>2]|0))Ri(h,6140);else{f[N>>2]=-1;f[i>>2]=N+4}N=f[v>>2]|0;if((N|0)==(f[w>>2]|0))Ri(z,g);else{f[N>>2]=f[g>>2];f[v>>2]=N+4}N=f[l>>2]|0;R=f[j>>2]|0;if((N|0)==(R<<5|0)){if((N+1|0)<0){S=50;break a}T=R<<6;R=N+32&-32;vi(d,N>>>0<1073741823?(T>>>0>>0?R:T):2147483647);U=f[l>>2]|0}else U=N;f[l>>2]=U+1;N=(f[d>>2]|0)+(U>>>5<<2)|0;f[N>>2]=f[N>>2]&~(1<<(U&31));f[g>>2]=J;O=1;P=J+1|0;Q=J}N=f[d>>2]|0;T=N+(Q>>>5<<2)|0;f[T>>2]=f[T>>2]|1<<(Q&31);T=N;b:do if(O){R=M;while(1){if((R|0)==-1){S=64;break b}V=(f[e>>2]|0)+(R>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(R&31);V=f[g>>2]|0;f[(f[h>>2]|0)+(V<<2)>>2]=R;f[(f[a>>2]|0)+(R<<2)>>2]=V;V=R+1|0;W=((V>>>0)%3|0|0)==0?R+-2|0:V;do if((W|0)==-1)X=-1;else{V=f[(f[x>>2]|0)+(W<<2)>>2]|0;Y=V+1|0;if((V|0)==-1){X=-1;break}X=((Y>>>0)%3|0|0)==0?V+-2|0:Y}while(0);if((X|0)==(M|0))break;else R=X}}else{R=M;while(1){if((R|0)==-1){S=64;break b}W=(f[e>>2]|0)+(R>>>5<<2)|0;f[W>>2]=f[W>>2]|1<<(R&31);f[(f[h>>2]|0)+(f[g>>2]<<2)>>2]=R;W=R+1|0;Y=((W>>>0)%3|0|0)==0?R+-2|0:W;do if((Y|0)==-1)Z=-1;else{W=f[(f[x>>2]|0)+(Y<<2)>>2]|0;V=W+1|0;if((W|0)==-1){Z=-1;break}Z=((V>>>0)%3|0|0)==0?W+-2|0:V}while(0);if((Z|0)==(M|0))break;else R=Z}}while(0);c:do if((S|0)==64){S=0;if((M|0)==-1)break;R=(((M>>>0)%3|0|0)==0?2:-1)+M|0;if((R|0)==-1)break;Y=f[(f[x>>2]|0)+(R<<2)>>2]|0;if((Y|0)==-1)break;R=Y+(((Y>>>0)%3|0|0)==0?2:-1)|0;if((R|0)==-1)break;if(!O){Y=R;while(1){V=(f[e>>2]|0)+(Y>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(Y&31);V=(((Y>>>0)%3|0|0)==0?2:-1)+Y|0;if((V|0)==-1)break c;W=f[(f[x>>2]|0)+(V<<2)>>2]|0;if((W|0)==-1)break c;Y=W+(((W>>>0)%3|0|0)==0?2:-1)|0;if((Y|0)==-1)break c}}Y=f[a>>2]|0;W=R;do{V=(f[e>>2]|0)+(W>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(W&31);f[Y+(W<<2)>>2]=f[g>>2];V=(((W>>>0)%3|0|0)==0?2:-1)+W|0;if((V|0)==-1)break c;_=f[(f[x>>2]|0)+(V<<2)>>2]|0;if((_|0)==-1)break c;W=_+(((_>>>0)%3|0|0)==0?2:-1)|0}while((W|0)!=-1)}while(0);$=P;aa=T;ba=N}else{$=J;aa=I;ba=F}if((H|0)<2){H=H+1|0;J=$;F=ba;I=aa}else{ca=$;da=aa;ea=ba;break}}}else{ca=A;da=D;ea=E}}else{ca=A;da=D;ea=E}C=C+1|0;B=f[a>>2]|0;if(C>>>0>=(((f[m>>2]|0)-B>>2>>>0)/3|0)>>>0){S=18;break}else{A=ca;D=da;E=ea}}if((S|0)==18){fa=da;ga=f[l>>2]|0;break}else if((S|0)==50)aq(d)}else{fa=q;ga=p}}else{fa=q;ga=p}while(0);p=a+44|0;f[p>>2]=0;a=fa;fa=ga>>>5;q=a+(fa<<2)|0;S=ga&31;ga=(fa|0)!=0;d:do if(fa|S|0)if(!S){l=a;da=0;ea=ga;while(1){e:do if(ea){if(!(f[l>>2]&1)){ca=da+1|0;f[p>>2]=ca;ha=ca}else ha=da;if(!(f[l>>2]&2)){ca=ha+1|0;f[p>>2]=ca;ia=ca}else ia=ha;if(!(f[l>>2]&4)){ca=ia+1|0;f[p>>2]=ca;ja=ca}else ja=ia;if(!(f[l>>2]&8)){ca=ja+1|0;f[p>>2]=ca;ka=ca}else ka=ja;if(!(f[l>>2]&16)){ca=ka+1|0;f[p>>2]=ca;la=ca}else la=ka;if(!(f[l>>2]&32)){ca=la+1|0;f[p>>2]=ca;ma=ca}else ma=la;if(!(f[l>>2]&64)){ca=ma+1|0;f[p>>2]=ca;na=ca}else na=ma;if(!(f[l>>2]&128)){ca=na+1|0;f[p>>2]=ca;oa=ca}else oa=na;if(!(f[l>>2]&256)){ca=oa+1|0;f[p>>2]=ca;pa=ca}else pa=oa;if(!(f[l>>2]&512)){ca=pa+1|0;f[p>>2]=ca;qa=ca}else qa=pa;if(!(f[l>>2]&1024)){ca=qa+1|0;f[p>>2]=ca;ra=ca}else ra=qa;if(!(f[l>>2]&2048)){ca=ra+1|0;f[p>>2]=ca;sa=ca}else sa=ra;if(!(f[l>>2]&4096)){ca=sa+1|0;f[p>>2]=ca;ta=ca}else ta=sa;if(!(f[l>>2]&8192)){ca=ta+1|0;f[p>>2]=ca;ua=ca}else ua=ta;if(!(f[l>>2]&16384)){ca=ua+1|0;f[p>>2]=ca;va=ca}else va=ua;if(!(f[l>>2]&32768)){ca=va+1|0;f[p>>2]=ca;wa=ca}else wa=va;if(!(f[l>>2]&65536)){ca=wa+1|0;f[p>>2]=ca;xa=ca}else xa=wa;if(!(f[l>>2]&131072)){ca=xa+1|0;f[p>>2]=ca;ya=ca}else ya=xa;if(!(f[l>>2]&262144)){ca=ya+1|0;f[p>>2]=ca;za=ca}else za=ya;if(!(f[l>>2]&524288)){ca=za+1|0;f[p>>2]=ca;Aa=ca}else Aa=za;if(!(f[l>>2]&1048576)){ca=Aa+1|0;f[p>>2]=ca;Ba=ca}else Ba=Aa;if(!(f[l>>2]&2097152)){ca=Ba+1|0;f[p>>2]=ca;Ca=ca}else Ca=Ba;if(!(f[l>>2]&4194304)){ca=Ca+1|0;f[p>>2]=ca;Da=ca}else Da=Ca;if(!(f[l>>2]&8388608)){ca=Da+1|0;f[p>>2]=ca;Ea=ca}else Ea=Da;if(!(f[l>>2]&16777216)){ca=Ea+1|0;f[p>>2]=ca;Fa=ca}else Fa=Ea;if(!(f[l>>2]&33554432)){ca=Fa+1|0;f[p>>2]=ca;Ga=ca}else Ga=Fa;if(!(f[l>>2]&67108864)){ca=Ga+1|0;f[p>>2]=ca;Ha=ca}else Ha=Ga;if(!(f[l>>2]&134217728)){ca=Ha+1|0;f[p>>2]=ca;Ia=ca}else Ia=Ha;if(!(f[l>>2]&268435456)){ca=Ia+1|0;f[p>>2]=ca;Ja=ca}else Ja=Ia;if(!(f[l>>2]&536870912)){ca=Ja+1|0;f[p>>2]=ca;Ka=ca}else Ka=Ja;if(!(f[l>>2]&1073741824)){ca=Ka+1|0;f[p>>2]=ca;La=ca}else La=Ka;if((f[l>>2]|0)<=-1){Ma=La;break}ca=La+1|0;f[p>>2]=ca;Ma=ca}else{ca=0;m=da;while(1){if(!(f[l>>2]&1<>2]=ba;Na=ba}else Na=m;if((ca|0)==31){Ma=Na;break e}ca=ca+1|0;if(!ca)break d;else m=Na}}while(0);l=l+4|0;if((q|0)==(l|0))break;else{da=Ma;ea=1}}}else{if(ga){ea=0;da=a;l=0;while(1){if(!(f[da>>2]&1)){m=l+1|0;f[p>>2]=m;Oa=m;Pa=m}else{Oa=l;Pa=ea}if(!(f[da>>2]&2)){m=Oa+1|0;f[p>>2]=m;Qa=m;Ra=m}else{Qa=Oa;Ra=Pa}if(!(f[da>>2]&4)){m=Qa+1|0;f[p>>2]=m;Sa=m;Ta=m}else{Sa=Qa;Ta=Ra}if(!(f[da>>2]&8)){m=Sa+1|0;f[p>>2]=m;Ua=m;Va=m}else{Ua=Sa;Va=Ta}if(!(f[da>>2]&16)){m=Ua+1|0;f[p>>2]=m;Wa=m;Xa=m}else{Wa=Ua;Xa=Va}if(!(f[da>>2]&32)){m=Wa+1|0;f[p>>2]=m;Ya=m;Za=m}else{Ya=Wa;Za=Xa}if(!(f[da>>2]&64)){m=Ya+1|0;f[p>>2]=m;_a=m;$a=m}else{_a=Ya;$a=Za}if(!(f[da>>2]&128)){m=_a+1|0;f[p>>2]=m;ab=m;bb=m}else{ab=_a;bb=$a}if(!(f[da>>2]&256)){m=ab+1|0;f[p>>2]=m;cb=m;db=m}else{cb=ab;db=bb}if(!(f[da>>2]&512)){m=cb+1|0;f[p>>2]=m;eb=m;fb=m}else{eb=cb;fb=db}if(!(f[da>>2]&1024)){m=eb+1|0;f[p>>2]=m;gb=m;hb=m}else{gb=eb;hb=fb}if(!(f[da>>2]&2048)){m=gb+1|0;f[p>>2]=m;ib=m;jb=m}else{ib=gb;jb=hb}if(!(f[da>>2]&4096)){m=ib+1|0;f[p>>2]=m;kb=m;lb=m}else{kb=ib;lb=jb}if(!(f[da>>2]&8192)){m=kb+1|0;f[p>>2]=m;mb=m;nb=m}else{mb=kb;nb=lb}if(!(f[da>>2]&16384)){m=mb+1|0;f[p>>2]=m;ob=m;pb=m}else{ob=mb;pb=nb}if(!(f[da>>2]&32768)){m=ob+1|0;f[p>>2]=m;qb=m;rb=m}else{qb=ob;rb=pb}if(!(f[da>>2]&65536)){m=qb+1|0;f[p>>2]=m;sb=m;tb=m}else{sb=qb;tb=rb}if(!(f[da>>2]&131072)){m=sb+1|0;f[p>>2]=m;ub=m;vb=m}else{ub=sb;vb=tb}if(!(f[da>>2]&262144)){m=ub+1|0;f[p>>2]=m;wb=m;xb=m}else{wb=ub;xb=vb}if(!(f[da>>2]&524288)){m=wb+1|0;f[p>>2]=m;yb=m;zb=m}else{yb=wb;zb=xb}if(!(f[da>>2]&1048576)){m=yb+1|0;f[p>>2]=m;Ab=m;Bb=m}else{Ab=yb;Bb=zb}if(!(f[da>>2]&2097152)){m=Ab+1|0;f[p>>2]=m;Cb=m;Db=m}else{Cb=Ab;Db=Bb}if(!(f[da>>2]&4194304)){m=Cb+1|0;f[p>>2]=m;Eb=m;Fb=m}else{Eb=Cb;Fb=Db}if(!(f[da>>2]&8388608)){m=Eb+1|0;f[p>>2]=m;Gb=m;Hb=m}else{Gb=Eb;Hb=Fb}if(!(f[da>>2]&16777216)){m=Gb+1|0;f[p>>2]=m;Ib=m;Jb=m}else{Ib=Gb;Jb=Hb}if(!(f[da>>2]&33554432)){m=Ib+1|0;f[p>>2]=m;Kb=m;Lb=m}else{Kb=Ib;Lb=Jb}if(!(f[da>>2]&67108864)){m=Kb+1|0;f[p>>2]=m;Mb=m;Nb=m}else{Mb=Kb;Nb=Lb}if(!(f[da>>2]&134217728)){m=Mb+1|0;f[p>>2]=m;Ob=m;Pb=m}else{Ob=Mb;Pb=Nb}if(!(f[da>>2]&268435456)){m=Ob+1|0;f[p>>2]=m;Qb=m;Rb=m}else{Qb=Ob;Rb=Pb}if(!(f[da>>2]&536870912)){m=Qb+1|0;f[p>>2]=m;Sb=m;Tb=m}else{Sb=Qb;Tb=Rb}if(!(f[da>>2]&1073741824)){m=Sb+1|0;f[p>>2]=m;Ub=m;Vb=m}else{Ub=Sb;Vb=Tb}if((f[da>>2]|0)>-1){m=Ub+1|0;f[p>>2]=m;Wb=m;Xb=m}else{Wb=Ub;Xb=Vb}m=da+4|0;if((q|0)==(m|0)){Yb=m;Zb=Xb;break}else{ea=Xb;da=m;l=Wb}}}else{Yb=a;Zb=0}l=0;da=Zb;while(1){if(!(f[Yb>>2]&1<>2]=ea;_b=ea}else _b=da;l=l+1|0;if((l|0)==(S|0))break;else da=_b}}while(0);_b=f[e>>2]|0;if(_b|0)Oq(_b);_b=f[d>>2]|0;if(!_b){u=c;return 1}Oq(_b);u=c;return 1}function fb(a,c,d,e,g,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0;i=u;u=u+256|0;e=i+104|0;j=i+240|0;k=i+224|0;l=i+160|0;m=i+140|0;n=i+248|0;o=i+72|0;p=i+40|0;q=i+128|0;r=i;s=i+232|0;t=i+220|0;v=i+216|0;w=i+212|0;x=i+208|0;y=i+152|0;z=f[a+28>>2]|0;A=f[a+32>>2]|0;B=l;C=B+48|0;do{f[B>>2]=0;B=B+4|0}while((B|0)<(C|0));if(!g){D=0;E=0}else{Ci(l,g);D=f[l+12>>2]|0;E=f[l+16>>2]|0}B=l+16|0;C=E-D>>2;F=D;D=E;if(C>>>0>=g>>>0){if(C>>>0>g>>>0?(E=F+(g<<2)|0,(E|0)!=(D|0)):0)f[B>>2]=D+(~((D+-4-E|0)>>>2)<<2)}else Ci(l+12|0,g-C|0);C=l+24|0;E=l+28|0;D=f[E>>2]|0;B=f[C>>2]|0;F=D-B>>2;G=B;B=D;if(F>>>0>=g>>>0){if(F>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[E>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(C,g-F|0);F=l+36|0;C=l+40|0;D=f[C>>2]|0;B=f[F>>2]|0;E=D-B>>2;G=B;B=D;if(E>>>0>=g>>>0){if(E>>>0>g>>>0?(D=G+(g<<2)|0,(D|0)!=(B|0)):0)f[C>>2]=B+(~((B+-4-D|0)>>>2)<<2)}else Ci(F,g-E|0);f[m>>2]=0;E=m+4|0;f[E>>2]=0;f[m+8>>2]=0;F=(g|0)==0;do if(!F)if(g>>>0>1073741823)aq(m);else{D=g<<2;B=ln(D)|0;f[m>>2]=B;C=B+(g<<2)|0;f[m+8>>2]=C;sj(B|0,0,D|0)|0;f[E>>2]=C;break}while(0);C=a+136|0;D=a+140|0;B=f[D>>2]|0;G=f[C>>2]|0;H=B-G>>2;L=G;G=B;if(H>>>0>=g>>>0){if(H>>>0>g>>>0?(B=L+(g<<2)|0,(B|0)!=(G|0)):0)f[D>>2]=G+(~((G+-4-B|0)>>>2)<<2)}else Ci(C,g-H|0);f[o>>2]=0;f[o+4>>2]=0;f[o+8>>2]=0;f[o+12>>2]=0;f[o+16>>2]=0;f[o+20>>2]=0;f[o+24>>2]=0;f[o+28>>2]=0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;f[p+16>>2]=0;f[p+20>>2]=0;f[p+24>>2]=0;f[p+28>>2]=0;f[q>>2]=0;H=q+4|0;f[H>>2]=0;f[q+8>>2]=0;if(F){M=0;N=0;O=0;P=0}else{F=g<<2;B=ln(F)|0;f[q>>2]=B;G=B+(g<<2)|0;f[q+8>>2]=G;sj(B|0,0,F|0)|0;f[H>>2]=G;M=B;N=G;O=G;P=B}B=a+36|0;G=f[B>>2]|0;F=f[G+4>>2]|0;D=f[G>>2]|0;L=F-D|0;a:do if((L|0)>4){Q=L>>2;R=z+12|0;S=(g|0)>0;T=r+4|0;U=r+8|0;V=r+12|0;Z=a+136|0;_=a+96|0;$=r+16|0;aa=r+28|0;ba=a+8|0;ca=j+4|0;da=k+4|0;ea=e+4|0;fa=r+28|0;ga=r+16|0;ha=r+20|0;ia=r+32|0;ja=n+1|0;ka=g<<2;la=(g|0)==1;ma=Q+-1|0;if(F-D>>2>>>0>ma>>>0){na=Q;oa=ma;pa=P;qa=O;ra=M;sa=M;ta=N;ua=M;va=N;wa=D}else{xa=G;aq(xa)}b:while(1){ma=f[wa+(oa<<2)>>2]|0;Q=(((ma>>>0)%3|0|0)==0?2:-1)+ma|0;ya=(ma|0)==-1|(Q|0)==-1;za=1;Aa=0;Ba=ma;c:while(1){Ca=za^1;Da=Aa;Ea=Ba;while(1){if((Ea|0)==-1){Fa=Da;break c}Ga=f[l+(Da*12|0)>>2]|0;Ha=f[R>>2]|0;Ia=f[Ha+(Ea<<2)>>2]|0;if((Ia|0)!=-1){Ja=f[z>>2]|0;Ka=f[A>>2]|0;La=f[Ka+(f[Ja+(Ia<<2)>>2]<<2)>>2]|0;Ma=Ia+1|0;Na=((Ma>>>0)%3|0|0)==0?Ia+-2|0:Ma;if((Na|0)==-1)Oa=-1;else Oa=f[Ja+(Na<<2)>>2]|0;Na=f[Ka+(Oa<<2)>>2]|0;Ma=(((Ia>>>0)%3|0|0)==0?2:-1)+Ia|0;if((Ma|0)==-1)Pa=-1;else Pa=f[Ja+(Ma<<2)>>2]|0;Ma=f[Ka+(Pa<<2)>>2]|0;if((La|0)<(oa|0)&(Na|0)<(oa|0)&(Ma|0)<(oa|0)){Ka=X(La,g)|0;La=X(Na,g)|0;Na=X(Ma,g)|0;if(S){Ma=0;do{f[Ga+(Ma<<2)>>2]=(f[c+(Ma+Na<<2)>>2]|0)+(f[c+(Ma+La<<2)>>2]|0)-(f[c+(Ma+Ka<<2)>>2]|0);Ma=Ma+1|0}while((Ma|0)!=(g|0))}Ma=Da+1|0;if((Ma|0)==4){Fa=4;break c}else Qa=Ma}else Qa=Da}else Qa=Da;do if(za){Ma=Ea+1|0;Ka=((Ma>>>0)%3|0|0)==0?Ea+-2|0:Ma;if((Ka|0)!=-1?(Ma=f[Ha+(Ka<<2)>>2]|0,Ka=Ma+1|0,(Ma|0)!=-1):0)Ra=((Ka>>>0)%3|0|0)==0?Ma+-2|0:Ka;else Ra=-1}else{Ka=(((Ea>>>0)%3|0|0)==0?2:-1)+Ea|0;if((Ka|0)!=-1?(Ma=f[Ha+(Ka<<2)>>2]|0,(Ma|0)!=-1):0)if(!((Ma>>>0)%3|0)){Ra=Ma+2|0;break}else{Ra=Ma+-1|0;break}else Ra=-1}while(0);if((Ra|0)==(ma|0)){Fa=Qa;break c}if((Ra|0)!=-1|Ca){Da=Qa;Ea=Ra}else break}if(ya){za=0;Aa=Qa;Ba=-1;continue}Ea=f[Ha+(Q<<2)>>2]|0;if((Ea|0)==-1){za=0;Aa=Qa;Ba=-1;continue}if(!((Ea>>>0)%3|0)){za=0;Aa=Qa;Ba=Ea+2|0;continue}else{za=0;Aa=Qa;Ba=Ea+-1|0;continue}}Ba=X(oa,g)|0;f[r>>2]=0;f[T>>2]=0;b[U>>0]=0;f[V>>2]=0;f[V+4>>2]=0;f[V+8>>2]=0;f[V+12>>2]=0;f[V+16>>2]=0;f[V+20>>2]=0;f[V+24>>2]=0;Aa=Fa+-1|0;za=p+(Aa<<3)|0;Q=za;ya=Vn(f[Q>>2]|0,f[Q+4>>2]|0,Fa|0,((Fa|0)<0)<<31>>31|0)|0;Q=I;ma=za;f[ma>>2]=ya;f[ma+4>>2]=Q;ma=c+((X(na+-2|0,g)|0)<<2)|0;za=c+(Ba<<2)|0;Ea=f[Z>>2]|0;if(S){Da=0;Ca=0;while(1){Ma=(f[ma+(Da<<2)>>2]|0)-(f[za+(Da<<2)>>2]|0)|0;Ka=((Ma|0)>-1?Ma:0-Ma|0)+Ca|0;f[ra+(Da<<2)>>2]=Ma;f[Ea+(Da<<2)>>2]=Ma<<1^Ma>>31;Da=Da+1|0;if((Da|0)==(g|0)){Sa=Ka;break}else Ca=Ka}}else Sa=0;mo(e,_,Ea,g);Ca=Zk(e)|0;Da=I;Ka=Bm(e)|0;Ma=I;La=o+(Aa<<3)|0;Na=La;Ga=f[Na>>2]|0;Ja=f[Na+4>>2]|0;Ta=+wm(ya,Ga);Na=Vn(Ka|0,Ma|0,Ca|0,Da|0)|0;Ua=+(ya>>>0)+4294967296.0*+(Q|0);Va=+W(+(Ta*Ua));Da=Vn(Na|0,I|0,~~Va>>>0|0,(+K(Va)>=1.0?(Va>0.0?~~+Y(+J(Va/4294967296.0),4294967295.0)>>>0:~~+W((Va-+(~~Va>>>0))/4294967296.0)>>>0):0)|0)|0;Na=r;f[Na>>2]=Da;f[Na+4>>2]=Sa;b[U>>0]=0;f[V>>2]=0;$f($,ma,ma+(g<<2)|0);f[s>>2]=pa;f[t>>2]=qa;f[j>>2]=f[s>>2];f[e>>2]=f[t>>2];Jf(aa,j,e);if((Fa|0)<1){Wa=va;Xa=ua;Ya=ta;Za=sa;_a=qa;$a=pa;ab=pa}else{Na=n+Fa|0;Da=f[q>>2]|0;Ca=Da;Ma=f[H>>2]|0;Ka=Na+-1|0;Ia=(Ka|0)==(n|0);bb=Na+-2|0;cb=ja>>>0>>0;db=~Fa;eb=Fa+2+((db|0)>-2?db:-2)|0;db=Ma;fb=Ka>>>0>n>>>0;gb=0;hb=1;while(1){gb=gb+1|0;sj(n|0,1,eb|0)|0;sj(n|0,0,gb|0)|0;ib=Vn(Ga|0,Ja|0,hb|0,0)|0;d:while(1){if(S){sj(f[m>>2]|0,0,ka|0)|0;jb=f[m>>2]|0;kb=0;lb=0;while(1){if(!(b[n+kb>>0]|0)){mb=f[l+(kb*12|0)>>2]|0;nb=0;do{ob=jb+(nb<<2)|0;f[ob>>2]=(f[ob>>2]|0)+(f[mb+(nb<<2)>>2]|0);nb=nb+1|0}while((nb|0)!=(g|0));pb=(1<>0]|0))rb=(1<>2]|0;do if(S){f[kb>>2]=(f[kb>>2]|0)/(hb|0)|0;if(!la){lb=1;do{jb=kb+(lb<<2)|0;f[jb>>2]=(f[jb>>2]|0)/(hb|0)|0;lb=lb+1|0}while((lb|0)!=(g|0));lb=f[Z>>2]|0;if(S)sb=lb;else{tb=0;ub=lb;break}}else sb=f[Z>>2]|0;lb=0;jb=0;while(1){nb=(f[kb+(lb<<2)>>2]|0)-(f[za+(lb<<2)>>2]|0)|0;mb=((nb|0)>-1?nb:0-nb|0)+jb|0;f[Da+(lb<<2)>>2]=nb;f[sb+(lb<<2)>>2]=nb<<1^nb>>31;lb=lb+1|0;if((lb|0)==(g|0)){tb=mb;ub=sb;break}else jb=mb}}else{tb=0;ub=f[Z>>2]|0}while(0);mo(e,_,ub,g);kb=Zk(e)|0;jb=I;lb=Bm(e)|0;mb=I;Va=+wm(ya,ib);nb=Vn(lb|0,mb|0,kb|0,jb|0)|0;Ta=+W(+(Va*Ua));jb=Vn(nb|0,I|0,~~Ta>>>0|0,(+K(Ta)>=1.0?(Ta>0.0?~~+Y(+J(Ta/4294967296.0),4294967295.0)>>>0:~~+W((Ta-+(~~Ta>>>0))/4294967296.0)>>>0):0)|0)|0;nb=f[r>>2]|0;if(!((nb|0)<=(jb|0)?!((nb|0)>=(jb|0)?(tb|0)<(f[T>>2]|0):0):0)){nb=r;f[nb>>2]=jb;f[nb+4>>2]=tb;b[U>>0]=qb;f[V>>2]=hb;f[v>>2]=f[m>>2];f[w>>2]=f[E>>2];f[j>>2]=f[v>>2];f[e>>2]=f[w>>2];Jf($,j,e);f[x>>2]=Ca;f[y>>2]=Ma;f[j>>2]=f[x>>2];f[e>>2]=f[y>>2];Jf(aa,j,e)}if(Ia)break;vb=b[Ka>>0]|0;nb=-1;jb=vb;while(1){kb=nb+-1|0;wb=Na+kb|0;mb=jb;jb=b[wb>>0]|0;if((jb&255)<(mb&255))break;if((wb|0)==(n|0)){xb=84;break d}else nb=kb}kb=Na+nb|0;if((jb&255)<(vb&255)){yb=Ka;zb=vb}else{mb=Na;lb=Ka;while(1){ob=lb+-1|0;if((jb&255)<(h[mb+-2>>0]|0)){yb=ob;zb=1;break}else{Ab=lb;lb=ob;mb=Ab}}}b[wb>>0]=zb;b[yb>>0]=jb;if((nb|0)<-1){Bb=kb;Cb=Ka}else continue;while(1){mb=b[Bb>>0]|0;b[Bb>>0]=b[Cb>>0]|0;b[Cb>>0]=mb;mb=Bb+1|0;lb=Cb+-1|0;if(mb>>>0>>0){Bb=mb;Cb=lb}else continue d}}if(((xb|0)==84?(xb=0,fb):0)?(ib=b[n>>0]|0,b[n>>0]=vb,b[Ka>>0]=ib,cb):0){ib=bb;kb=ja;do{nb=b[kb>>0]|0;b[kb>>0]=b[ib>>0]|0;b[ib>>0]=nb;kb=kb+1|0;ib=ib+-1|0}while(kb>>>0>>0)}if((hb|0)>=(Fa|0)){Wa=db;Xa=Da;Ya=db;Za=Da;_a=Ma;$a=Ca;ab=Da;break}else hb=hb+1|0}}hb=f[V>>2]|0;Da=Vn(Ga|0,Ja|0,hb|0,((hb|0)<0)<<31>>31|0)|0;hb=La;f[hb>>2]=Da;f[hb+4>>2]=I;if(S){hb=f[aa>>2]|0;Da=f[C>>2]|0;Ca=0;do{Ma=f[hb+(Ca<<2)>>2]|0;f[Da+(Ca<<2)>>2]=Ma<<1^Ma>>31;Ca=Ca+1|0}while((Ca|0)!=(g|0));Db=Da}else Db=f[C>>2]|0;lo(e,_,Db,g);if((Fa|0)>0){Eb=a+40+(Aa*12|0)|0;Da=a+40+(Aa*12|0)+4|0;Ca=a+40+(Aa*12|0)+8|0;hb=0;do{La=f[Da>>2]|0;Ja=f[Ca>>2]|0;Ga=(La|0)==(Ja<<5|0);if(!(1<>0])){if(Ga){if((La+1|0)<0){xb=95;break b}Ma=Ja<<6;db=La+32&-32;vi(Eb,La>>>0<1073741823?(Ma>>>0>>0?db:Ma):2147483647);Fb=f[Da>>2]|0}else Fb=La;f[Da>>2]=Fb+1;Ma=(f[Eb>>2]|0)+(Fb>>>5<<2)|0;f[Ma>>2]=f[Ma>>2]|1<<(Fb&31)}else{if(Ga){if((La+1|0)<0){xb=100;break b}Ga=Ja<<6;Ja=La+32&-32;vi(Eb,La>>>0<1073741823?(Ga>>>0>>0?Ja:Ga):2147483647);Gb=f[Da>>2]|0}else Gb=La;f[Da>>2]=Gb+1;La=(f[Eb>>2]|0)+(Gb>>>5<<2)|0;f[La>>2]=f[La>>2]&~(1<<(Gb&31))}hb=hb+1|0}while((hb|0)<(Fa|0))}hb=f[$>>2]|0;Da=d+(Ba<<2)|0;Ca=f[za+4>>2]|0;Aa=f[hb>>2]|0;La=f[hb+4>>2]|0;f[j>>2]=f[za>>2];f[ca>>2]=Ca;f[k>>2]=Aa;f[da>>2]=La;Od(e,ba,j,k);f[Da>>2]=f[e>>2];f[Da+4>>2]=f[ea>>2];Da=f[fa>>2]|0;if(Da|0){La=f[ia>>2]|0;if((La|0)!=(Da|0))f[ia>>2]=La+(~((La+-4-Da|0)>>>2)<<2);Oq(Da)}Da=f[ga>>2]|0;if(Da|0){La=f[ha>>2]|0;if((La|0)!=(Da|0))f[ha>>2]=La+(~((La+-4-Da|0)>>>2)<<2);Oq(Da)}if((na|0)<=2){Hb=Za;Ib=Ya;break a}Da=f[B>>2]|0;wa=f[Da>>2]|0;La=oa+-1|0;if((f[Da+4>>2]|0)-wa>>2>>>0<=La>>>0){xa=Da;xb=18;break}else{Da=oa;oa=La;pa=$a;qa=_a;ra=ab;sa=Za;ta=Ya;ua=Xa;va=Wa;na=Da}}if((xb|0)==18)aq(xa);else if((xb|0)==95)aq(Eb);else if((xb|0)==100)aq(Eb)}else{Hb=M;Ib=N}while(0);if((g|0)>0)sj(f[l>>2]|0,0,g<<2|0)|0;g=f[l>>2]|0;N=f[c+4>>2]|0;M=f[g>>2]|0;Eb=f[g+4>>2]|0;f[j>>2]=f[c>>2];f[j+4>>2]=N;f[k>>2]=M;f[k+4>>2]=Eb;Od(e,a+8|0,j,k);f[d>>2]=f[e>>2];f[d+4>>2]=f[e+4>>2];if(Hb|0){if((Ib|0)!=(Hb|0))f[H>>2]=Ib+(~((Ib+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[m>>2]|0;if(Hb|0){m=f[E>>2]|0;if((m|0)!=(Hb|0))f[E>>2]=m+(~((m+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[l+36>>2]|0;if(Hb|0){m=l+40|0;E=f[m>>2]|0;if((E|0)!=(Hb|0))f[m>>2]=E+(~((E+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[l+24>>2]|0;if(Hb|0){E=l+28|0;m=f[E>>2]|0;if((m|0)!=(Hb|0))f[E>>2]=m+(~((m+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[l+12>>2]|0;if(Hb|0){m=l+16|0;E=f[m>>2]|0;if((E|0)!=(Hb|0))f[m>>2]=E+(~((E+-4-Hb|0)>>>2)<<2);Oq(Hb)}Hb=f[l>>2]|0;if(!Hb){u=i;return 1}E=l+4|0;l=f[E>>2]|0;if((l|0)!=(Hb|0))f[E>>2]=l+(~((l+-4-Hb|0)>>>2)<<2);Oq(Hb);u=i;return 1}function gb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=Oa,La=0,Ma=0,Na=0,Pa=0,Qa=Oa,Ra=0,Sa=0,Ta=0,Ua=0,Va=0;c=u;u=u+80|0;d=c+60|0;e=c+48|0;g=c+24|0;h=c+12|0;i=c;j=a+28|0;k=f[j>>2]|0;l=f[k+4>>2]|0;m=f[l+80>>2]|0;o=a+4|0;p=a+8|0;q=f[p>>2]|0;r=f[o>>2]|0;s=(q|0)==(r|0);t=r;if(s){f[a+72>>2]=0;v=1;u=c;return v|0}w=f[l+8>>2]|0;x=q-r>>2;r=0;q=0;do{r=r+(b[(f[w+(f[t+(q<<2)>>2]<<2)>>2]|0)+24>>0]|0)|0;q=q+1|0}while(q>>>0>>0);f[a+72>>2]=r;if(s){v=1;u=c;return v|0}s=g+4|0;r=g+8|0;x=d+8|0;q=d+4|0;w=d+11|0;y=g+12|0;z=d+8|0;A=d+4|0;B=d+11|0;C=h+4|0;D=h+8|0;E=i+8|0;F=i+4|0;G=d+11|0;H=d+4|0;I=i+11|0;J=d+8|0;K=d+4|0;L=d+11|0;M=d+11|0;N=d+4|0;O=h+8|0;P=a+40|0;Q=a+44|0;R=a+36|0;S=a+64|0;T=a+68|0;U=a+60|0;V=g+8|0;W=g+20|0;X=e+8|0;Y=e+4|0;Z=e+11|0;_=g+4|0;aa=g+8|0;ba=h+4|0;ca=h+8|0;da=h+8|0;ea=a+52|0;fa=a+56|0;ga=a+48|0;a=g+8|0;ha=0;ia=t;t=l;l=k;a:while(1){k=f[ia+(ha<<2)>>2]|0;ja=f[(f[t+8>>2]|0)+(k<<2)>>2]|0;switch(f[ja+28>>2]|0){case 9:{f[g>>2]=1196;f[s>>2]=-1;f[r>>2]=0;f[r+4>>2]=0;f[r+8>>2]=0;f[r+12>>2]=0;ka=f[l+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;la=ln(32)|0;f[d>>2]=la;f[x>>2]=-2147483616;f[q>>2]=17;ma=la;na=14495;oa=ma+17|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[la+17>>0]=0;pa=ka+16|0;qa=f[pa>>2]|0;if(qa){ra=pa;sa=qa;b:while(1){qa=sa;while(1){if((f[qa+16>>2]|0)>=(k|0))break;ta=f[qa+4>>2]|0;if(!ta){ua=ra;break b}else qa=ta}sa=f[qa>>2]|0;if(!sa){ua=qa;break}else ra=qa}if(((ua|0)!=(pa|0)?(k|0)>=(f[ua+16>>2]|0):0)?(ra=ua+20|0,(Jh(ra,d)|0)!=0):0)va=Hk(ra,d,-1)|0;else wa=17}else wa=17;if((wa|0)==17){wa=0;va=Hk(ka,d,-1)|0}if((b[w>>0]|0)<0)Oq(f[d>>2]|0);if((va|0)<1)xa=1;else{ra=f[(f[j>>2]|0)+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;sa=ln(32)|0;f[d>>2]=sa;f[z>>2]=-2147483616;f[A>>2]=19;ma=sa;na=14438;oa=ma+19|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[sa+19>>0]=0;ka=ra+16|0;pa=f[ka>>2]|0;if(pa){la=ka;ta=pa;c:while(1){pa=ta;while(1){if((f[pa+16>>2]|0)>=(k|0))break;ya=f[pa+4>>2]|0;if(!ya){za=la;break c}else pa=ya}ta=f[pa>>2]|0;if(!ta){za=pa;break}else la=pa}if((za|0)!=(ka|0)?(k|0)>=(f[za+16>>2]|0):0)Aa=za+20|0;else wa=29}else wa=29;if((wa|0)==29){wa=0;Aa=ra}if(!(Jh(Aa,d)|0))Ba=0;else{la=f[(f[j>>2]|0)+48>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;ta=ln(32)|0;f[e>>2]=ta;f[X>>2]=-2147483616;f[Y>>2]=18;ma=ta;na=14458;oa=ma+18|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ta+18>>0]=0;ra=la+16|0;ka=f[ra>>2]|0;if(ka){sa=ra;qa=ka;d:while(1){ka=qa;while(1){if((f[ka+16>>2]|0)>=(k|0))break;ya=f[ka+4>>2]|0;if(!ya){Ca=sa;break d}else ka=ya}qa=f[ka>>2]|0;if(!qa){Ca=ka;break}else sa=ka}if((Ca|0)!=(ra|0)?(k|0)>=(f[Ca+16>>2]|0):0)Da=Ca+20|0;else wa=39}else wa=39;if((wa|0)==39){wa=0;Da=la}sa=(Jh(Da,e)|0)!=0;if((b[Z>>0]|0)<0)Oq(f[e>>2]|0);Ba=sa}if((b[B>>0]|0)<0)Oq(f[d>>2]|0);if(Ba){sa=ja+24|0;qa=b[sa>>0]|0;ta=qa<<24>>24;f[h>>2]=0;f[C>>2]=0;f[D>>2]=0;if(!(qa<<24>>24))Ea=0;else{if(qa<<24>>24<0){wa=48;break a}qa=ta<<2;pa=ln(qa)|0;f[h>>2]=pa;ya=pa+(ta<<2)|0;f[O>>2]=ya;sj(pa|0,0,qa|0)|0;f[C>>2]=ya;Ea=pa}pa=f[(f[j>>2]|0)+48>>2]|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;ya=ln(32)|0;f[i>>2]=ya;f[E>>2]=-2147483616;f[F>>2]=19;ma=ya;na=14438;oa=ma+19|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ya+19>>0]=0;la=b[sa>>0]|0;ra=la<<24>>24;qa=pa+16|0;ta=f[qa>>2]|0;if(ta){Fa=qa;Ga=ta;e:while(1){ta=Ga;while(1){if((f[ta+16>>2]|0)>=(k|0))break;Ha=f[ta+4>>2]|0;if(!Ha){Ia=Fa;break e}else ta=Ha}Ga=f[ta>>2]|0;if(!Ga){Ia=ta;break}else Fa=ta}if(((Ia|0)!=(qa|0)?(k|0)>=(f[Ia+16>>2]|0):0)?(Fa=Ia+20|0,(Jh(Fa,i)|0)!=0):0){Ga=Rg(Fa,i)|0;if((Ga|0)!=(Ia+24|0)){pj(d,Ga+28|0);Ga=b[M>>0]|0;Fa=Ga<<24>>24<0;if(!((Fa?f[N>>2]|0:Ga&255)|0))Ja=Ga;else{if(la<<24>>24>0){ya=Fa?f[d>>2]|0:d;Fa=0;do{Ka=$(bq(ya,e));ka=ya;ya=f[e>>2]|0;if((ka|0)==(ya|0))break;n[Ea+(Fa<<2)>>2]=Ka;Fa=Fa+1|0}while((Fa|0)<(ra|0));La=b[M>>0]|0}else La=Ga;Ja=La}if(Ja<<24>>24<0)Oq(f[d>>2]|0)}}else wa=69}else wa=69;if((wa|0)==69?(wa=0,Fa=Rg(pa,i)|0,(Fa|0)!=(pa+4|0)):0){pj(d,Fa+28|0);Fa=b[G>>0]|0;ya=Fa<<24>>24<0;if(!((ya?f[H>>2]|0:Fa&255)|0))Ma=Fa;else{if(la<<24>>24>0){qa=ya?f[d>>2]|0:d;ya=0;do{Ka=$(bq(qa,e));ka=qa;qa=f[e>>2]|0;if((ka|0)==(qa|0))break;n[Ea+(ya<<2)>>2]=Ka;ya=ya+1|0}while((ya|0)<(ra|0));Na=b[G>>0]|0}else Na=Fa;Ma=Na}if(Ma<<24>>24<0)Oq(f[d>>2]|0)}if((b[I>>0]|0)<0)Oq(f[i>>2]|0);ra=f[(f[j>>2]|0)+48>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;ya=ln(32)|0;f[d>>2]=ya;f[J>>2]=-2147483616;f[K>>2]=18;ma=ya;na=14458;oa=ma+18|0;do{b[ma>>0]=b[na>>0]|0;ma=ma+1|0;na=na+1|0}while((ma|0)<(oa|0));b[ya+18>>0]=0;na=ra+16|0;ma=f[na>>2]|0;do if(ma){oa=na;Fa=ma;f:while(1){qa=Fa;while(1){if((f[qa+16>>2]|0)>=(k|0))break;la=f[qa+4>>2]|0;if(!la){Pa=oa;break f}else qa=la}Fa=f[qa>>2]|0;if(!Fa){Pa=qa;break}else oa=qa}if((Pa|0)!=(na|0)?(k|0)>=(f[Pa+16>>2]|0):0){oa=Pa+20|0;if(!(Jh(oa,d)|0)){wa=91;break}Qa=$(sk(oa,d,$(1.0)))}else wa=91}else wa=91;while(0);if((wa|0)==91){wa=0;Qa=$(sk(ra,d,$(1.0)))}if((b[L>>0]|0)<0)Oq(f[d>>2]|0);Dl(g,va,f[h>>2]|0,b[sa>>0]|0,Qa);k=f[h>>2]|0;if(k|0){na=f[C>>2]|0;if((na|0)!=(k|0))f[C>>2]=na+(~((na+-4-k|0)>>>2)<<2);Oq(k)}}else Wd(g,ja,va)|0;k=f[P>>2]|0;if((k|0)==(f[Q>>2]|0))Cf(R,g);else{f[k>>2]=1196;f[k+4>>2]=f[s>>2];Ra=k+8|0;f[Ra>>2]=0;na=k+12|0;f[na>>2]=0;f[k+16>>2]=0;ma=(f[y>>2]|0)-(f[V>>2]|0)|0;ya=ma>>2;if(ya|0){if(ya>>>0>1073741823){wa=103;break a}oa=ln(ma)|0;f[na>>2]=oa;f[Ra>>2]=oa;f[k+16>>2]=oa+(ya<<2);ya=f[V>>2]|0;ma=(f[y>>2]|0)-ya|0;if((ma|0)>0){kh(oa|0,ya|0,ma|0)|0;f[na>>2]=oa+(ma>>>2<<2)}}f[k+20>>2]=f[W>>2];f[P>>2]=(f[P>>2]|0)+24}Qe(d,g,ja,m);k=f[S>>2]|0;if(k>>>0<(f[T>>2]|0)>>>0){ma=f[d>>2]|0;f[d>>2]=0;f[k>>2]=ma;f[S>>2]=k+4}else Ze(U,d);k=f[d>>2]|0;f[d>>2]=0;if(k|0){ma=k+88|0;oa=f[ma>>2]|0;f[ma>>2]=0;if(oa|0){ma=f[oa+8>>2]|0;if(ma|0){na=oa+12|0;if((f[na>>2]|0)!=(ma|0))f[na>>2]=ma;Oq(ma)}Oq(oa)}oa=f[k+68>>2]|0;if(oa|0){ma=k+72|0;na=f[ma>>2]|0;if((na|0)!=(oa|0))f[ma>>2]=na+(~((na+-4-oa|0)>>>2)<<2);Oq(oa)}oa=k+64|0;na=f[oa>>2]|0;f[oa>>2]=0;if(na|0){oa=f[na>>2]|0;if(oa|0){ma=na+4|0;if((f[ma>>2]|0)!=(oa|0))f[ma>>2]=oa;Oq(oa)}Oq(na)}Oq(k)}xa=0}f[g>>2]=1196;k=f[r>>2]|0;if(k|0){na=f[y>>2]|0;if((na|0)!=(k|0))f[y>>2]=na+(~((na+-4-k|0)>>>2)<<2);Oq(k)}if(xa|0){v=0;wa=169;break a}break}case 1:case 3:case 5:{k=ja+24|0;na=b[k>>0]|0;oa=na<<24>>24;f[g>>2]=0;f[_>>2]=0;f[aa>>2]=0;if(!(na<<24>>24))Sa=0;else{if(na<<24>>24<0){wa=137;break a}na=ln(oa<<2)|0;f[_>>2]=na;f[g>>2]=na;ma=na+(oa<<2)|0;f[a>>2]=ma;ya=oa;oa=na;while(1){f[oa>>2]=2147483647;ya=ya+-1|0;if(!ya)break;else oa=oa+4|0}f[_>>2]=ma;Sa=b[k>>0]|0}oa=Sa<<24>>24;f[h>>2]=0;f[ba>>2]=0;f[ca>>2]=0;if(!(Sa<<24>>24))Ta=0;else{if(Sa<<24>>24<0){wa=144;break a}ya=oa<<2;sa=ln(ya)|0;f[h>>2]=sa;ra=sa+(oa<<2)|0;f[da>>2]=ra;sj(sa|0,0,ya|0)|0;f[ba>>2]=ra;Ta=sa}sa=ja+80|0;ra=b[k>>0]|0;g:do if(!(f[sa>>2]|0))Ua=ra;else{ya=0;oa=ra;na=Ta;while(1){f[e>>2]=ya;f[d>>2]=f[e>>2];Qb(ja,d,oa,na)|0;Fa=b[k>>0]|0;if(Fa<<24>>24>0){ta=f[g>>2]|0;la=f[h>>2]|0;pa=Fa<<24>>24;Ga=0;do{ka=ta+(Ga<<2)|0;Ha=f[la+(Ga<<2)>>2]|0;if((f[ka>>2]|0)>(Ha|0))f[ka>>2]=Ha;Ga=Ga+1|0}while((Ga|0)<(pa|0))}pa=ya+1|0;if(pa>>>0>=(f[sa>>2]|0)>>>0){Ua=Fa;break g}ya=pa;oa=Fa;na=f[h>>2]|0}}while(0);if(Ua<<24>>24>0){sa=0;ja=Ua;while(1){ra=(f[g>>2]|0)+(sa<<2)|0;ma=f[ea>>2]|0;if((ma|0)==(f[fa>>2]|0)){Ri(ga,ra);Va=b[k>>0]|0}else{f[ma>>2]=f[ra>>2];f[ea>>2]=ma+4;Va=ja}sa=sa+1|0;if((sa|0)>=(Va<<24>>24|0))break;else ja=Va}}ja=f[h>>2]|0;if(ja|0){sa=f[ba>>2]|0;if((sa|0)!=(ja|0))f[ba>>2]=sa+(~((sa+-4-ja|0)>>>2)<<2);Oq(ja)}ja=f[g>>2]|0;if(ja|0){sa=f[_>>2]|0;if((sa|0)!=(ja|0))f[_>>2]=sa+(~((sa+-4-ja|0)>>>2)<<2);Oq(ja)}break}default:{}}ja=ha+1|0;sa=f[o>>2]|0;if(ja>>>0>=(f[p>>2]|0)-sa>>2>>>0){v=1;wa=169;break}k=f[j>>2]|0;ha=ja;ia=sa;t=f[k+4>>2]|0;l=k}if((wa|0)==48)aq(h);else if((wa|0)==103)aq(Ra);else if((wa|0)==137)aq(g);else if((wa|0)==144)aq(h);else if((wa|0)==169){u=c;return v|0}return 0}function hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)aq(e);else{j=h<<2;k=ln(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;sj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+128|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);Oq(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)aq(e);else{r=s<<2;o=ln(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;sj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+140|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);Oq(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Pc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+116|0;y=a+48|0;h=a+44|0;j=a+36|0;m=a+40|0;n=a+32|0;A=b+8|0;B=c+8|0;C=a+28|0;D=a+24|0;E=a+16|0;F=a+20|0;G=a+12|0;H=a+88|0;I=a+84|0;J=a+76|0;K=a+80|0;L=a+72|0;M=i+4|0;N=i+24|0;O=i+24|0;P=p+24|0;Q=z;while(1){z=f[v>>2]|0;R=Q+-1|0;S=R+z|0;T=f[t>>2]|0;U=f[T+(((S>>>0)/113|0)<<2)>>2]|0;V=(S>>>0)%113|0;S=f[U+(V*36|0)>>2]|0;W=f[U+(V*36|0)+12>>2]|0;Y=f[U+(V*36|0)+24>>2]|0;Z=f[U+(V*36|0)+32>>2]|0;f[l>>2]=R;R=f[o>>2]|0;V=R-T>>2;if((1-Q-z+((V|0)==0?0:(V*113|0)+-1|0)|0)>>>0>225){Oq(f[R+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=S;f[c>>2]=W;R=f[k>>2]|0;V=((f[g>>2]|0)+-1|0)==(Y|0)?0:Y+1|0;Y=(f[s>>2]|0)+(Z*12|0)|0;z=W-S|0;T=(f[a>>2]|0)-(f[(f[Y>>2]|0)+(V<<2)>>2]|0)|0;a:do if(T){if(z>>>0<3){U=f[w>>2]|0;f[U>>2]=V;$=f[g>>2]|0;if($>>>0>1){aa=1;ba=$;ca=V;while(1){ca=(ca|0)==(ba+-1|0)?0:ca+1|0;f[U+(aa<<2)>>2]=ca;aa=aa+1|0;da=f[g>>2]|0;if(aa>>>0>=da>>>0){ea=da;break}else ba=da}}else ea=$;if(!z){fa=99;break}else{ga=0;ha=ea}while(1){ba=(f[N>>2]|0)+((X(f[M>>2]|0,S+ga|0)|0)<<2)|0;if(!ha)ia=0;else{aa=0;do{ca=f[(f[w>>2]|0)+(aa<<2)>>2]|0;U=(f[a>>2]|0)-(f[(f[Y>>2]|0)+(ca<<2)>>2]|0)|0;do if(U|0){da=f[y>>2]|0;ja=32-da|0;ka=32-U|0;la=f[ba+(ca<<2)>>2]<(ja|0)){ma=la>>>ka;ka=U-ja|0;f[y>>2]=ka;ja=f[h>>2]|ma>>>ka;f[h>>2]=ja;ka=f[j>>2]|0;if((ka|0)==(f[m>>2]|0))Ri(n,h);else{f[ka>>2]=ja;f[j>>2]=ka+4}f[h>>2]=ma<<32-(f[y>>2]|0);break}ma=f[h>>2]|la>>>da;f[h>>2]=ma;la=da+U|0;f[y>>2]=la;if((la|0)!=32)break;la=f[j>>2]|0;if((la|0)==(f[m>>2]|0))Ri(n,h);else{f[la>>2]=ma;f[j>>2]=la+4}f[h>>2]=0;f[y>>2]=0}while(0);aa=aa+1|0;U=f[g>>2]|0}while(aa>>>0>>0);ia=U}ga=ga+1|0;if(ga>>>0>=z>>>0){fa=99;break a}else ha=ia}}$=Z+1|0;Ig(R+($*12|0)|0,f[R+(Z*12|0)>>2]|0,f[R+(Z*12|0)+4>>2]|0);aa=(f[(f[k>>2]|0)+($*12|0)>>2]|0)+(V<<2)|0;ba=(f[aa>>2]|0)+(1<>2]=ba;aa=f[A>>2]|0;U=f[B>>2]|0;b:do if((W|0)==(S|0))na=S;else{ca=f[O>>2]|0;if(!aa){if((f[ca+(V<<2)>>2]|0)>>>0>>0){na=W;break}else{oa=W;pa=S}while(1){la=oa;do{la=la+-1|0;if((pa|0)==(la|0)){na=pa;break b}ma=(f[P>>2]|0)+((X(la,U)|0)<<2)+(V<<2)|0}while((f[ma>>2]|0)>>>0>=ba>>>0);pa=pa+1|0;if((pa|0)==(la|0)){na=la;break b}else oa=la}}else{qa=W;ra=S}while(1){ma=ra;while(1){sa=ca+((X(ma,aa)|0)<<2)|0;if((f[sa+(V<<2)>>2]|0)>>>0>=ba>>>0){ta=qa;break}da=ma+1|0;if((da|0)==(qa|0)){na=qa;break b}else ma=da}while(1){ta=ta+-1|0;if((ma|0)==(ta|0)){na=ma;break b}ua=(f[P>>2]|0)+((X(ta,U)|0)<<2)|0;if((f[ua+(V<<2)>>2]|0)>>>0>>0){va=0;break}}do{la=sa+(va<<2)|0;da=ua+(va<<2)|0;ka=f[la>>2]|0;f[la>>2]=f[da>>2];f[da>>2]=ka;va=va+1|0}while((va|0)!=(aa|0));ra=ma+1|0;if((ra|0)==(ta|0)){na=ta;break}else qa=ta}}while(0);ba=(_(z|0)|0)^31;U=na-S|0;ca=W-na|0;ka=U>>>0>>0;if((U|0)!=(ca|0)){da=f[H>>2]|0;if(ka)f[I>>2]=f[I>>2]|1<<31-da;la=da+1|0;f[H>>2]=la;if((la|0)==32){la=f[J>>2]|0;if((la|0)==(f[K>>2]|0))Ri(L,I);else{f[la>>2]=f[I>>2];f[J>>2]=la+4}f[H>>2]=0;f[I>>2]=0}}la=z>>>1;do if(ka){da=f[C>>2]|0;ja=32-da|0;wa=32-ba|0;xa=la-U<(ja|0)){ya=xa>>>wa;wa=ba-ja|0;f[C>>2]=wa;ja=f[D>>2]|ya>>>wa;f[D>>2]=ja;wa=f[E>>2]|0;if((wa|0)==(f[F>>2]|0))Ri(G,D);else{f[wa>>2]=ja;f[E>>2]=wa+4}f[D>>2]=ya<<32-(f[C>>2]|0);break}ya=f[D>>2]|xa>>>da;f[D>>2]=ya;xa=da+ba|0;f[C>>2]=xa;if((xa|0)==32){xa=f[E>>2]|0;if((xa|0)==(f[F>>2]|0))Ri(G,D);else{f[xa>>2]=ya;f[E>>2]=xa+4}f[D>>2]=0;f[C>>2]=0}}else{xa=f[C>>2]|0;ya=32-xa|0;da=32-ba|0;wa=la-ca<(ya|0)){ja=wa>>>da;da=ba-ya|0;f[C>>2]=da;ya=f[D>>2]|ja>>>da;f[D>>2]=ya;da=f[E>>2]|0;if((da|0)==(f[F>>2]|0))Ri(G,D);else{f[da>>2]=ya;f[E>>2]=da+4}f[D>>2]=ja<<32-(f[C>>2]|0);break}ja=f[D>>2]|wa>>>xa;f[D>>2]=ja;wa=xa+ba|0;f[C>>2]=wa;if((wa|0)==32){wa=f[E>>2]|0;if((wa|0)==(f[F>>2]|0))Ri(G,D);else{f[wa>>2]=ja;f[E>>2]=wa+4}f[D>>2]=0;f[C>>2]=0}}while(0);ba=f[s>>2]|0;la=f[ba+(Z*12|0)>>2]|0;ka=la+(V<<2)|0;f[ka>>2]=(f[ka>>2]|0)+1;Ig(ba+($*12|0)|0,la,f[ba+(Z*12|0)+4>>2]|0);if((na|0)!=(S|0)){ba=f[o>>2]|0;la=f[t>>2]|0;ka=ba-la>>2;wa=f[v>>2]|0;ja=f[l>>2]|0;if((((ka|0)==0?0:(ka*113|0)+-1|0)|0)==(ja+wa|0)){Pc(e);za=f[v>>2]|0;Aa=f[l>>2]|0;Ba=f[o>>2]|0;Ca=f[t>>2]|0}else{za=wa;Aa=ja;Ba=ba;Ca=la}la=Aa+za|0;if((Ba|0)==(Ca|0))Da=0;else Da=(f[Ca+(((la>>>0)/113|0)<<2)>>2]|0)+(((la>>>0)%113|0)*36|0)|0;f[Da>>2]=S;la=Da+4|0;f[la>>2]=r;f[la+4>>2]=x;f[Da+12>>2]=na;f[Da+16>>2]=i;f[Da+20>>2]=aa;f[Da+24>>2]=V;f[Da+28>>2]=U;f[Da+32>>2]=Z;f[l>>2]=(f[l>>2]|0)+1}if((W|0)!=(na|0)){la=f[o>>2]|0;ba=f[t>>2]|0;ja=la-ba>>2;wa=f[v>>2]|0;ka=f[l>>2]|0;if((((ja|0)==0?0:(ja*113|0)+-1|0)|0)==(ka+wa|0)){Pc(e);Ea=f[v>>2]|0;Fa=f[l>>2]|0;Ga=f[o>>2]|0;Ha=f[t>>2]|0}else{Ea=wa;Fa=ka;Ga=la;Ha=ba}ba=Fa+Ea|0;if((Ga|0)==(Ha|0))Ia=0;else Ia=(f[Ha+(((ba>>>0)/113|0)<<2)>>2]|0)+(((ba>>>0)%113|0)*36|0)|0;f[Ia>>2]=na;f[Ia+4>>2]=i;f[Ia+8>>2]=aa;f[Ia+12>>2]=W;ba=Ia+16|0;f[ba>>2]=p;f[ba+4>>2]=q;f[Ia+24>>2]=V;f[Ia+28>>2]=ca;f[Ia+32>>2]=$;ba=(f[l>>2]|0)+1|0;f[l>>2]=ba;Ja=ba}else fa=99}else fa=99;while(0);if((fa|0)==99){fa=0;Ja=f[l>>2]|0}if(!Ja)break;else Q=Ja}}Ja=f[t>>2]|0;Q=f[v>>2]|0;Ia=Ja+(((Q>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ja;if((q|0)==(Ja|0)){Ka=0;La=0}else{na=(f[Ia>>2]|0)+(((Q>>>0)%113|0)*36|0)|0;Ka=na;La=na}na=Ia;Ia=La;c:while(1){La=Ia;do{Q=La;if((Ka|0)==(Q|0))break c;La=Q+36|0}while((La-(f[na>>2]|0)|0)!=4068);La=na+4|0;na=La;Ia=f[La>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ja;do{Oq(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Ma=f[o>>2]|0;Na=Ma-i>>2}while(Na>>>0>2);Oa=Na;Pa=i;Qa=Ma}else{Oa=l;Pa=Ja;Qa=q}switch(Oa|0){case 1:{Ra=56;fa=113;break}case 2:{Ra=113;fa=113;break}default:{}}if((fa|0)==113)f[v>>2]=Ra;if((Pa|0)!=(Qa|0)){Ra=Pa;do{Oq(f[Ra>>2]|0);Ra=Ra+4|0}while((Ra|0)!=(Qa|0));Qa=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Qa|0))f[o>>2]=t+(~((t+-4-Qa|0)>>>2)<<2)}Qa=f[e>>2]|0;if(!Qa){u=d;return}Oq(Qa);u=d;return}function ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0;d=u;u=u+48|0;e=d+36|0;g=d+24|0;h=d;i=a+8|0;j=f[i>>2]|0;f[e>>2]=0;k=e+4|0;f[k>>2]=0;f[e+8>>2]=0;do if(j)if(j>>>0>1073741823)aq(e);else{l=j<<2;m=ln(l)|0;f[e>>2]=m;n=m+(j<<2)|0;f[e+8>>2]=n;sj(m|0,0,l|0)|0;f[k>>2]=n;o=n;p=m;break}else{o=0;p=0}while(0);m=a+1164|0;n=f[m>>2]|0;l=f[n>>2]|0;q=n+4|0;if(!l){r=n+8|0;s=p;t=o;v=j}else{j=f[q>>2]|0;if((j|0)!=(l|0))f[q>>2]=j+(~((j+-4-l|0)>>>2)<<2);Oq(l);l=n+8|0;f[l>>2]=0;f[q>>2]=0;f[n>>2]=0;r=l;s=f[e>>2]|0;t=f[k>>2]|0;v=f[i>>2]|0}f[n>>2]=s;f[q>>2]=t;f[r>>2]=f[e+8>>2];f[e>>2]=0;r=e+4|0;f[r>>2]=0;f[e+8>>2]=0;do if(v)if(v>>>0>1073741823)aq(e);else{t=v<<2;q=ln(t)|0;f[e>>2]=q;s=q+(v<<2)|0;f[e+8>>2]=s;sj(q|0,0,t|0)|0;f[r>>2]=s;w=s;x=q;break}else{w=0;x=0}while(0);v=a+1176|0;q=f[v>>2]|0;s=f[q>>2]|0;t=q+4|0;if(!s){y=q+8|0;z=x;A=w}else{w=f[t>>2]|0;if((w|0)!=(s|0))f[t>>2]=w+(~((w+-4-s|0)>>>2)<<2);Oq(s);s=q+8|0;f[s>>2]=0;f[t>>2]=0;f[q>>2]=0;y=s;z=f[e>>2]|0;A=f[r>>2]|0}f[q>>2]=z;f[t>>2]=A;f[y>>2]=f[e+8>>2];y=f[b>>2]|0;A=b+4|0;t=f[A>>2]|0;z=f[A+4>>2]|0;A=f[c>>2]|0;q=c+4|0;r=f[q>>2]|0;s=f[q+4>>2]|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;f[h+20>>2]=0;q=h+8|0;w=h+4|0;x=h+16|0;n=h+20|0;k=t;Pc(h);l=f[w>>2]|0;j=(f[n>>2]|0)+(f[x>>2]|0)|0;if((f[q>>2]|0)==(l|0))B=0;else B=(f[l+(((j>>>0)/113|0)<<2)>>2]|0)+(((j>>>0)%113|0)*36|0)|0;f[B>>2]=y;j=B+4|0;f[j>>2]=t;f[j+4>>2]=z;f[B+12>>2]=A;j=B+16|0;f[j>>2]=r;f[j+4>>2]=s;f[B+24>>2]=0;f[B+28>>2]=A-y;f[B+32>>2]=0;B=(f[n>>2]|0)+1|0;f[n>>2]=B;if(B|0){y=a+1152|0;A=a+1084|0;j=a+1080|0;l=a+1072|0;o=a+1076|0;p=a+1068|0;C=b+8|0;D=c+8|0;E=a+1124|0;F=a+1120|0;G=a+1112|0;H=a+1116|0;I=a+1108|0;J=k+4|0;K=k+24|0;L=k+24|0;M=r+24|0;N=B;while(1){B=f[x>>2]|0;O=N+-1|0;P=O+B|0;Q=f[w>>2]|0;R=f[Q+(((P>>>0)/113|0)<<2)>>2]|0;S=(P>>>0)%113|0;P=f[R+(S*36|0)>>2]|0;T=f[R+(S*36|0)+12>>2]|0;U=f[R+(S*36|0)+24>>2]|0;V=f[R+(S*36|0)+32>>2]|0;f[n>>2]=O;O=f[q>>2]|0;S=O-Q>>2;if((1-N-B+((S|0)==0?0:(S*113|0)+-1|0)|0)>>>0>225){Oq(f[O+-4>>2]|0);f[q>>2]=(f[q>>2]|0)+-4}f[b>>2]=P;f[c>>2]=T;O=f[m>>2]|0;S=O+(V*12|0)|0;B=(f[v>>2]|0)+(V*12|0)|0;f[g>>2]=f[b>>2];f[g+4>>2]=f[b+4>>2];f[g+8>>2]=f[b+8>>2];f[e>>2]=f[c>>2];f[e+4>>2]=f[c+4>>2];f[e+8>>2]=f[c+8>>2];Q=Rd(a,g,e,S,B,U)|0;U=T-P|0;R=(f[a>>2]|0)-(f[(f[B>>2]|0)+(Q<<2)>>2]|0)|0;a:do if(R){if(U>>>0<3){W=f[y>>2]|0;f[W>>2]=Q;Y=f[i>>2]|0;if(Y>>>0>1){Z=1;$=Y;aa=Q;while(1){aa=(aa|0)==($+-1|0)?0:aa+1|0;f[W+(Z<<2)>>2]=aa;Z=Z+1|0;ba=f[i>>2]|0;if(Z>>>0>=ba>>>0){ca=ba;break}else $=ba}}else ca=Y;if(!U){da=87;break}else{ea=0;fa=ca}while(1){$=(f[K>>2]|0)+((X(f[J>>2]|0,P+ea|0)|0)<<2)|0;if(!fa)ga=0;else{Z=0;do{aa=f[(f[y>>2]|0)+(Z<<2)>>2]|0;W=(f[a>>2]|0)-(f[(f[B>>2]|0)+(aa<<2)>>2]|0)|0;do if(W|0){ba=f[A>>2]|0;ha=32-ba|0;ia=32-W|0;ja=f[$+(aa<<2)>>2]<(ha|0)){ka=ja>>>ia;ia=W-ha|0;f[A>>2]=ia;ha=f[j>>2]|ka>>>ia;f[j>>2]=ha;ia=f[l>>2]|0;if((ia|0)==(f[o>>2]|0))Ri(p,j);else{f[ia>>2]=ha;f[l>>2]=ia+4}f[j>>2]=ka<<32-(f[A>>2]|0);break}ka=f[j>>2]|ja>>>ba;f[j>>2]=ka;ja=ba+W|0;f[A>>2]=ja;if((ja|0)!=32)break;ja=f[l>>2]|0;if((ja|0)==(f[o>>2]|0))Ri(p,j);else{f[ja>>2]=ka;f[l>>2]=ja+4}f[j>>2]=0;f[A>>2]=0}while(0);Z=Z+1|0;W=f[i>>2]|0}while(Z>>>0>>0);ga=W}ea=ea+1|0;if(ea>>>0>=U>>>0){da=87;break a}else fa=ga}}Y=V+1|0;Z=f[m>>2]|0;$=Z+(Y*12|0)|0;if(($|0)==(S|0))la=Z;else{Ig($,f[S>>2]|0,f[O+(V*12|0)+4>>2]|0);la=f[m>>2]|0}$=(f[la+(Y*12|0)>>2]|0)+(Q<<2)|0;Z=(f[$>>2]|0)+(1<>2]=Z;$=f[C>>2]|0;W=f[D>>2]|0;b:do if((T|0)==(P|0))ma=P;else{aa=f[L>>2]|0;if(!$){if((f[aa+(Q<<2)>>2]|0)>>>0>>0){ma=T;break}else{na=T;oa=P}while(1){ja=na;do{ja=ja+-1|0;if((oa|0)==(ja|0)){ma=oa;break b}ka=(f[M>>2]|0)+((X(ja,W)|0)<<2)+(Q<<2)|0}while((f[ka>>2]|0)>>>0>=Z>>>0);oa=oa+1|0;if((oa|0)==(ja|0)){ma=ja;break b}else na=ja}}else{pa=T;qa=P}while(1){ka=qa;while(1){ra=aa+((X(ka,$)|0)<<2)|0;if((f[ra+(Q<<2)>>2]|0)>>>0>=Z>>>0){sa=pa;break}ba=ka+1|0;if((ba|0)==(pa|0)){ma=pa;break b}else ka=ba}while(1){sa=sa+-1|0;if((ka|0)==(sa|0)){ma=ka;break b}ta=(f[M>>2]|0)+((X(sa,W)|0)<<2)|0;if((f[ta+(Q<<2)>>2]|0)>>>0>>0){ua=0;break}}do{ja=ra+(ua<<2)|0;ba=ta+(ua<<2)|0;ia=f[ja>>2]|0;f[ja>>2]=f[ba>>2];f[ba>>2]=ia;ua=ua+1|0}while((ua|0)!=($|0));qa=ka+1|0;if((qa|0)==(sa|0)){ma=sa;break}else pa=sa}}while(0);Z=(_(U|0)|0)^31;W=ma-P|0;aa=T-ma|0;ia=W>>>0>>0;if((W|0)!=(aa|0)){ba=f[E>>2]|0;if(ia)f[F>>2]=f[F>>2]|1<<31-ba;ja=ba+1|0;f[E>>2]=ja;if((ja|0)==32){ja=f[G>>2]|0;if((ja|0)==(f[H>>2]|0))Ri(I,F);else{f[ja>>2]=f[F>>2];f[G>>2]=ja+4}f[E>>2]=0;f[F>>2]=0}}ja=U>>>1;if(ia){ia=ja-W|0;if(Z|0){ba=0;ha=1<>>1}}}else{ha=ja-aa|0;if(Z|0){ba=0;ia=1<>>1}}}ia=f[v>>2]|0;Z=f[ia+(V*12|0)>>2]|0;ba=Z+(Q<<2)|0;f[ba>>2]=(f[ba>>2]|0)+1;Ig(ia+(Y*12|0)|0,Z,f[ia+(V*12|0)+4>>2]|0);if((ma|0)!=(P|0)){ia=f[q>>2]|0;Z=f[w>>2]|0;ba=ia-Z>>2;ha=f[x>>2]|0;ja=f[n>>2]|0;if((((ba|0)==0?0:(ba*113|0)+-1|0)|0)==(ja+ha|0)){Pc(h);va=f[x>>2]|0;wa=f[n>>2]|0;xa=f[q>>2]|0;ya=f[w>>2]|0}else{va=ha;wa=ja;xa=ia;ya=Z}Z=wa+va|0;if((xa|0)==(ya|0))za=0;else za=(f[ya+(((Z>>>0)/113|0)<<2)>>2]|0)+(((Z>>>0)%113|0)*36|0)|0;f[za>>2]=P;Z=za+4|0;f[Z>>2]=t;f[Z+4>>2]=z;f[za+12>>2]=ma;f[za+16>>2]=k;f[za+20>>2]=$;f[za+24>>2]=Q;f[za+28>>2]=W;f[za+32>>2]=V;f[n>>2]=(f[n>>2]|0)+1}if((T|0)!=(ma|0)){Z=f[q>>2]|0;ia=f[w>>2]|0;ja=Z-ia>>2;ha=f[x>>2]|0;ba=f[n>>2]|0;if((((ja|0)==0?0:(ja*113|0)+-1|0)|0)==(ba+ha|0)){Pc(h);Aa=f[x>>2]|0;Ba=f[n>>2]|0;Ca=f[q>>2]|0;Da=f[w>>2]|0}else{Aa=ha;Ba=ba;Ca=Z;Da=ia}ia=Ba+Aa|0;if((Ca|0)==(Da|0))Ea=0;else Ea=(f[Da+(((ia>>>0)/113|0)<<2)>>2]|0)+(((ia>>>0)%113|0)*36|0)|0;f[Ea>>2]=ma;f[Ea+4>>2]=k;f[Ea+8>>2]=$;f[Ea+12>>2]=T;ia=Ea+16|0;f[ia>>2]=r;f[ia+4>>2]=s;f[Ea+24>>2]=Q;f[Ea+28>>2]=aa;f[Ea+32>>2]=Y;ia=(f[n>>2]|0)+1|0;f[n>>2]=ia;Fa=ia}else da=87}else da=87;while(0);if((da|0)==87){da=0;Fa=f[n>>2]|0}if(!Fa)break;else N=Fa}}Fa=f[w>>2]|0;N=f[x>>2]|0;Ea=Fa+(((N>>>0)/113|0)<<2)|0;s=f[q>>2]|0;r=s;k=Fa;if((s|0)==(Fa|0)){Ga=0;Ha=0}else{ma=(f[Ea>>2]|0)+(((N>>>0)%113|0)*36|0)|0;Ga=ma;Ha=ma}ma=Ea;Ea=Ha;c:while(1){Ha=Ea;do{N=Ha;if((Ga|0)==(N|0))break c;Ha=N+36|0}while((Ha-(f[ma>>2]|0)|0)!=4068);Ha=ma+4|0;ma=Ha;Ea=f[Ha>>2]|0}f[n>>2]=0;n=r-k>>2;if(n>>>0>2){k=Fa;do{Oq(f[k>>2]|0);k=(f[w>>2]|0)+4|0;f[w>>2]=k;Ia=f[q>>2]|0;Ja=Ia-k>>2}while(Ja>>>0>2);Ka=Ja;La=k;Ma=Ia}else{Ka=n;La=Fa;Ma=s}switch(Ka|0){case 1:{Na=56;da=101;break}case 2:{Na=113;da=101;break}default:{}}if((da|0)==101)f[x>>2]=Na;if((La|0)!=(Ma|0)){Na=La;do{Oq(f[Na>>2]|0);Na=Na+4|0}while((Na|0)!=(Ma|0));Ma=f[w>>2]|0;w=f[q>>2]|0;if((w|0)!=(Ma|0))f[q>>2]=w+(~((w+-4-Ma|0)>>>2)<<2)}Ma=f[h>>2]|0;if(!Ma){u=d;return}Oq(Ma);u=d;return}function jb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0;d=u;u=u+1424|0;e=d+1408|0;g=d+1396|0;h=d+1420|0;i=d+1200|0;j=d+12|0;k=d;l=d+1384|0;m=d+1372|0;n=d+1360|0;o=d+1348|0;p=d+1336|0;q=d+1324|0;r=d+1312|0;s=d+1300|0;t=d+1288|0;v=d+1276|0;w=d+1264|0;x=d+1252|0;y=d+1240|0;z=d+1228|0;A=a+28|0;B=10-(mi(f[(f[A>>2]|0)+48>>2]|0)|0)|0;C=(B|0)<6?B:6;b[h>>0]=C;if((C&255|0)==6?(f[a+72>>2]|0)>15:0)b[h>>0]=5;C=c+16|0;B=f[C+4>>2]|0;if(!((B|0)>0|(B|0)==0&(f[C>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}C=f[A>>2]|0;B=f[(f[C+4>>2]|0)+80>>2]|0;D=a+72|0;E=f[D>>2]|0;f[i>>2]=B;F=i+4|0;f[F>>2]=E;f[i+8>>2]=E<<2;G=i+12|0;H=X(E,B)|0;f[G>>2]=0;J=i+16|0;f[J>>2]=0;f[i+20>>2]=0;do if(H)if(H>>>0>1073741823)aq(G);else{K=H<<2;L=ln(K)|0;f[G>>2]=L;M=L+(H<<2)|0;f[i+20>>2]=M;sj(L|0,0,K|0)|0;f[J>>2]=M;N=L;break}else N=0;while(0);H=i+24|0;f[H>>2]=N;G=a+4|0;L=a+8|0;M=f[G>>2]|0;a:do if((f[L>>2]|0)!=(M|0)){K=j+4|0;O=j+8|0;P=j+8|0;Q=(B|0)==0;R=j+4|0;S=j+8|0;T=k+4|0;U=k+8|0;V=k+8|0;W=a+48|0;Y=j+8|0;Z=a+60|0;$=0;aa=0;ba=0;ca=0;da=M;ea=C;b:while(1){fa=f[(f[(f[ea+4>>2]|0)+8>>2]|0)+(f[da+(ca<<2)>>2]<<2)>>2]|0;switch(f[fa+28>>2]|0){case 1:case 3:case 5:case 2:case 4:case 6:{ga=fa;ha=aa;break}case 9:{ga=f[(f[Z>>2]|0)+(aa<<2)>>2]|0;ha=aa+1|0;break}default:{ia=0;break a}}if(!ga){ia=0;break a}c:do switch(f[ga+28>>2]|0){case 6:{if(Q){ja=ba;ka=ga+24|0;break c}fa=ga+84|0;la=ga+68|0;ma=ga+48|0;na=ga+40|0;oa=ga+24|0;pa=0;do{if(!(b[fa>>0]|0))qa=f[(f[la>>2]|0)+(pa<<2)>>2]|0;else qa=pa;ra=ma;sa=f[ra>>2]|0;ta=f[ra+4>>2]|0;ra=na;ua=un(f[ra>>2]|0,f[ra+4>>2]|0,qa|0,0)|0;ra=Vn(ua|0,I|0,sa|0,ta|0)|0;kh((f[H>>2]|0)+((X(f[F>>2]|0,pa)|0)<<2)+($<<2)|0,(f[f[ga>>2]>>2]|0)+ra|0,b[oa>>0]<<2|0)|0;pa=pa+1|0}while((pa|0)!=(B|0));ja=ba;ka=oa;break}case 1:case 3:case 5:{oa=ga+24|0;pa=b[oa>>0]|0;na=pa<<24>>24;f[j>>2]=0;f[R>>2]=0;f[S>>2]=0;if(!(pa<<24>>24))va=0;else{if(pa<<24>>24<0){wa=24;break b}pa=na<<2;ma=ln(pa)|0;f[j>>2]=ma;la=ma+(na<<2)|0;f[Y>>2]=la;sj(ma|0,0,pa|0)|0;f[R>>2]=la;va=b[oa>>0]|0}la=va<<24>>24;f[k>>2]=0;f[T>>2]=0;f[U>>2]=0;if(!(va<<24>>24)){xa=0;ya=0}else{if(va<<24>>24<0){wa=30;break b}pa=la<<2;ma=ln(pa)|0;f[k>>2]=ma;na=ma+(la<<2)|0;f[V>>2]=na;sj(ma|0,0,pa|0)|0;f[T>>2]=na;xa=ma;ya=ma}if(Q){za=ya;Aa=xa}else{ma=ga+84|0;na=ga+68|0;pa=0;do{if(!(b[ma>>0]|0))Ba=f[(f[na>>2]|0)+(pa<<2)>>2]|0;else Ba=pa;la=f[j>>2]|0;f[g>>2]=Ba;fa=b[oa>>0]|0;f[e>>2]=f[g>>2];Qb(ga,e,fa,la)|0;la=b[oa>>0]|0;fa=la<<24>>24;if(la<<24>>24>0){la=f[j>>2]|0;ra=f[W>>2]|0;ta=f[k>>2]|0;sa=0;do{f[ta+(sa<<2)>>2]=(f[la+(sa<<2)>>2]|0)-(f[ra+(sa+ba<<2)>>2]|0);sa=sa+1|0}while((sa|0)<(fa|0));Ca=ta}else Ca=f[k>>2]|0;kh((f[H>>2]|0)+((X(f[F>>2]|0,pa)|0)<<2)+($<<2)|0,Ca|0,fa<<2|0)|0;pa=pa+1|0}while(pa>>>0>>0);pa=f[k>>2]|0;za=pa;Aa=pa}pa=ba+(b[oa>>0]|0)|0;if(za|0){na=f[T>>2]|0;if((na|0)!=(za|0))f[T>>2]=na+(~((na+-4-za|0)>>>2)<<2);Oq(Aa)}na=f[j>>2]|0;if(na|0){ma=f[R>>2]|0;if((ma|0)!=(na|0))f[R>>2]=ma+(~((ma+-4-na|0)>>>2)<<2);Oq(na)}ja=pa;ka=oa;break}default:{pa=ga+24|0;na=b[pa>>0]|0;ma=na<<24>>24;f[j>>2]=0;f[K>>2]=0;f[O>>2]=0;if(!(na<<24>>24)){Da=0;Ea=0}else{if(na<<24>>24<0){wa=53;break b}na=ma<<2;ta=ln(na)|0;f[j>>2]=ta;sa=ta+(ma<<2)|0;f[P>>2]=sa;sj(ta|0,0,na|0)|0;f[K>>2]=sa;Da=ta;Ea=ta}if(Q){Fa=Ea;Ga=Da}else{ta=ga+84|0;sa=ga+68|0;na=0;do{if(!(b[ta>>0]|0))Ha=f[(f[sa>>2]|0)+(na<<2)>>2]|0;else Ha=na;ma=f[j>>2]|0;f[g>>2]=Ha;ra=b[pa>>0]|0;f[e>>2]=f[g>>2];Pb(ga,e,ra,ma)|0;kh((f[H>>2]|0)+((X(f[F>>2]|0,na)|0)<<2)+($<<2)|0,f[j>>2]|0,b[pa>>0]<<2|0)|0;na=na+1|0}while(na>>>0>>0);na=f[j>>2]|0;Fa=na;Ga=na}if(Fa|0){na=f[K>>2]|0;if((na|0)!=(Fa|0))f[K>>2]=na+(~((na+-4-Fa|0)>>>2)<<2);Oq(Ga)}ja=ba;ka=pa}}while(0);na=ca+1|0;sa=f[G>>2]|0;if(na>>>0>=(f[L>>2]|0)-sa>>2>>>0){wa=66;break}$=$+(b[ka>>0]|0)|0;aa=ha;ba=ja;ca=na;da=sa;ea=f[A>>2]|0}if((wa|0)==24)aq(j);else if((wa|0)==30)aq(k);else if((wa|0)==53)aq(j);else if((wa|0)==66){Ia=f[D>>2]|0;Ja=f[H>>2]|0;wa=67;break}}else{Ia=E;Ja=N;wa=67}while(0);d:do if((wa|0)==67){N=X(Ia,B)|0;if((N|0)>0){E=0;H=0;while(1){D=f[Ja+(E<<2)>>2]|0;if(!D)Ka=H;else{A=(_(D|0)|0)^31;Ka=(A|0)<(H|0)?H:A+1|0}E=E+1|0;if((E|0)>=(N|0)){La=Ka;break}else H=Ka}}else La=0;switch(b[h>>0]|0){case 6:{Ue(j,Ia);f[l>>2]=0;f[l+4>>2]=i;H=f[F>>2]|0;f[l+8>>2]=H;f[m>>2]=f[i>>2];f[m+4>>2]=i;f[m+8>>2]=H;f[k>>2]=La;f[g>>2]=f[l>>2];f[g+4>>2]=f[l+4>>2];f[g+8>>2]=f[l+8>>2];f[e>>2]=f[m>>2];f[e+4>>2]=f[m+4>>2];f[e+8>>2]=f[m+8>>2];H=sf(j,g,e,k,c)|0;Se(j);if(!H){ia=0;break d}break}case 5:{Ue(j,Ia);f[n>>2]=0;f[n+4>>2]=i;H=f[F>>2]|0;f[n+8>>2]=H;f[o>>2]=f[i>>2];f[o+4>>2]=i;f[o+8>>2]=H;f[k>>2]=La;f[g>>2]=f[n>>2];f[g+4>>2]=f[n+4>>2];f[g+8>>2]=f[n+8>>2];f[e>>2]=f[o>>2];f[e+4>>2]=f[o+4>>2];f[e+8>>2]=f[o+8>>2];H=tf(j,g,e,k,c)|0;Se(j);if(!H){ia=0;break d}break}case 4:{Ue(j,Ia);f[p>>2]=0;f[p+4>>2]=i;H=f[F>>2]|0;f[p+8>>2]=H;f[q>>2]=f[i>>2];f[q+4>>2]=i;f[q+8>>2]=H;f[k>>2]=La;f[g>>2]=f[p>>2];f[g+4>>2]=f[p+4>>2];f[g+8>>2]=f[p+8>>2];f[e>>2]=f[q>>2];f[e+4>>2]=f[q+4>>2];f[e+8>>2]=f[q+8>>2];H=tf(j,g,e,k,c)|0;Se(j);if(!H){ia=0;break d}break}case 3:{$e(j,Ia);f[r>>2]=0;f[r+4>>2]=i;H=f[F>>2]|0;f[r+8>>2]=H;f[s>>2]=f[i>>2];f[s+4>>2]=i;f[s+8>>2]=H;f[k>>2]=La;f[g>>2]=f[r>>2];f[g+4>>2]=f[r+4>>2];f[g+8>>2]=f[r+8>>2];f[e>>2]=f[s>>2];f[e+4>>2]=f[s+4>>2];f[e+8>>2]=f[s+8>>2];H=Af(j,g,e,k,c)|0;ef(j);if(!H){ia=0;break d}break}case 2:{$e(j,Ia);f[t>>2]=0;f[t+4>>2]=i;H=f[F>>2]|0;f[t+8>>2]=H;f[v>>2]=f[i>>2];f[v+4>>2]=i;f[v+8>>2]=H;f[k>>2]=La;f[g>>2]=f[t>>2];f[g+4>>2]=f[t+4>>2];f[g+8>>2]=f[t+8>>2];f[e>>2]=f[v>>2];f[e+4>>2]=f[v+4>>2];f[e+8>>2]=f[v+8>>2];H=Af(j,g,e,k,c)|0;ef(j);if(!H){ia=0;break d}break}case 1:{af(j,Ia);f[w>>2]=0;f[w+4>>2]=i;H=f[F>>2]|0;f[w+8>>2]=H;f[x>>2]=f[i>>2];f[x+4>>2]=i;f[x+8>>2]=H;f[k>>2]=La;f[g>>2]=f[w>>2];f[g+4>>2]=f[w+4>>2];f[g+8>>2]=f[w+8>>2];f[e>>2]=f[x>>2];f[e+4>>2]=f[x+4>>2];f[e+8>>2]=f[x+8>>2];H=zf(j,g,e,k,c)|0;df(j);if(!H){ia=0;break d}break}case 0:{af(j,Ia);f[y>>2]=0;f[y+4>>2]=i;H=f[F>>2]|0;f[y+8>>2]=H;f[z>>2]=f[i>>2];f[z+4>>2]=i;f[z+8>>2]=H;f[k>>2]=La;f[g>>2]=f[y>>2];f[g+4>>2]=f[y+4>>2];f[g+8>>2]=f[y+8>>2];f[e>>2]=f[z>>2];f[e+4>>2]=f[z+4>>2];f[e+8>>2]=f[z+8>>2];H=zf(j,g,e,k,c)|0;df(j);if(!H){ia=0;break d}break}default:{ia=0;break d}}ia=1}while(0);j=f[i+12>>2]|0;if(!j){u=d;return ia|0}i=f[J>>2]|0;if((i|0)!=(j|0))f[J>>2]=i+(~((i+-4-j|0)>>>2)<<2);Oq(j);u=d;return ia|0}function kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)aq(e);else{j=h<<2;k=ln(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;sj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+1164|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);Oq(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)aq(e);else{r=s<<2;o=ln(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;sj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+1176|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);Oq(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Pc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+1152|0;y=a+1084|0;h=a+1080|0;j=a+1072|0;m=a+1076|0;n=a+1068|0;A=b+8|0;B=c+8|0;C=a+1124|0;D=a+1120|0;E=a+1112|0;F=a+1116|0;G=a+1108|0;H=i+4|0;I=i+24|0;J=i+24|0;K=p+24|0;L=z;while(1){z=f[v>>2]|0;M=L+-1|0;N=M+z|0;O=f[t>>2]|0;P=f[O+(((N>>>0)/113|0)<<2)>>2]|0;Q=(N>>>0)%113|0;N=f[P+(Q*36|0)>>2]|0;R=f[P+(Q*36|0)+12>>2]|0;S=f[P+(Q*36|0)+24>>2]|0;T=f[P+(Q*36|0)+32>>2]|0;f[l>>2]=M;M=f[o>>2]|0;Q=M-O>>2;if((1-L-z+((Q|0)==0?0:(Q*113|0)+-1|0)|0)>>>0>225){Oq(f[M+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=N;f[c>>2]=R;M=f[k>>2]|0;Q=((f[g>>2]|0)+-1|0)==(S|0)?0:S+1|0;S=(f[s>>2]|0)+(T*12|0)|0;z=R-N|0;O=(f[a>>2]|0)-(f[(f[S>>2]|0)+(Q<<2)>>2]|0)|0;a:do if(O){if(z>>>0<3){P=f[w>>2]|0;f[P>>2]=Q;U=f[g>>2]|0;if(U>>>0>1){V=1;W=U;Y=Q;while(1){Y=(Y|0)==(W+-1|0)?0:Y+1|0;f[P+(V<<2)>>2]=Y;V=V+1|0;Z=f[g>>2]|0;if(V>>>0>=Z>>>0){$=Z;break}else W=Z}}else $=U;if(!z){aa=85;break}else{ba=0;ca=$}while(1){W=(f[I>>2]|0)+((X(f[H>>2]|0,N+ba|0)|0)<<2)|0;if(!ca)da=0;else{V=0;do{Y=f[(f[w>>2]|0)+(V<<2)>>2]|0;P=(f[a>>2]|0)-(f[(f[S>>2]|0)+(Y<<2)>>2]|0)|0;do if(P|0){Z=f[y>>2]|0;ea=32-Z|0;fa=32-P|0;ga=f[W+(Y<<2)>>2]<(ea|0)){ha=ga>>>fa;fa=P-ea|0;f[y>>2]=fa;ea=f[h>>2]|ha>>>fa;f[h>>2]=ea;fa=f[j>>2]|0;if((fa|0)==(f[m>>2]|0))Ri(n,h);else{f[fa>>2]=ea;f[j>>2]=fa+4}f[h>>2]=ha<<32-(f[y>>2]|0);break}ha=f[h>>2]|ga>>>Z;f[h>>2]=ha;ga=Z+P|0;f[y>>2]=ga;if((ga|0)!=32)break;ga=f[j>>2]|0;if((ga|0)==(f[m>>2]|0))Ri(n,h);else{f[ga>>2]=ha;f[j>>2]=ga+4}f[h>>2]=0;f[y>>2]=0}while(0);V=V+1|0;P=f[g>>2]|0}while(V>>>0

>>0);da=P}ba=ba+1|0;if(ba>>>0>=z>>>0){aa=85;break a}else ca=da}}U=T+1|0;Ig(M+(U*12|0)|0,f[M+(T*12|0)>>2]|0,f[M+(T*12|0)+4>>2]|0);V=(f[(f[k>>2]|0)+(U*12|0)>>2]|0)+(Q<<2)|0;W=(f[V>>2]|0)+(1<>2]=W;V=f[A>>2]|0;P=f[B>>2]|0;b:do if((R|0)==(N|0))ia=N;else{Y=f[J>>2]|0;if(!V){if((f[Y+(Q<<2)>>2]|0)>>>0>>0){ia=R;break}else{ja=R;ka=N}while(1){ga=ja;do{ga=ga+-1|0;if((ka|0)==(ga|0)){ia=ka;break b}ha=(f[K>>2]|0)+((X(ga,P)|0)<<2)+(Q<<2)|0}while((f[ha>>2]|0)>>>0>=W>>>0);ka=ka+1|0;if((ka|0)==(ga|0)){ia=ga;break b}else ja=ga}}else{la=R;ma=N}while(1){ha=ma;while(1){na=Y+((X(ha,V)|0)<<2)|0;if((f[na+(Q<<2)>>2]|0)>>>0>=W>>>0){oa=la;break}Z=ha+1|0;if((Z|0)==(la|0)){ia=la;break b}else ha=Z}while(1){oa=oa+-1|0;if((ha|0)==(oa|0)){ia=ha;break b}pa=(f[K>>2]|0)+((X(oa,P)|0)<<2)|0;if((f[pa+(Q<<2)>>2]|0)>>>0>>0){qa=0;break}}do{ga=na+(qa<<2)|0;Z=pa+(qa<<2)|0;fa=f[ga>>2]|0;f[ga>>2]=f[Z>>2];f[Z>>2]=fa;qa=qa+1|0}while((qa|0)!=(V|0));ma=ha+1|0;if((ma|0)==(oa|0)){ia=oa;break}else la=oa}}while(0);W=(_(z|0)|0)^31;P=ia-N|0;Y=R-ia|0;fa=P>>>0>>0;if((P|0)!=(Y|0)){Z=f[C>>2]|0;if(fa)f[D>>2]=f[D>>2]|1<<31-Z;ga=Z+1|0;f[C>>2]=ga;if((ga|0)==32){ga=f[E>>2]|0;if((ga|0)==(f[F>>2]|0))Ri(G,D);else{f[ga>>2]=f[D>>2];f[E>>2]=ga+4}f[C>>2]=0;f[D>>2]=0}}ga=z>>>1;if(fa){fa=ga-P|0;if(W|0){Z=0;ea=1<>>1}}}else{ea=ga-Y|0;if(W|0){Z=0;fa=1<>>1}}}fa=f[s>>2]|0;W=f[fa+(T*12|0)>>2]|0;Z=W+(Q<<2)|0;f[Z>>2]=(f[Z>>2]|0)+1;Ig(fa+(U*12|0)|0,W,f[fa+(T*12|0)+4>>2]|0);if((ia|0)!=(N|0)){fa=f[o>>2]|0;W=f[t>>2]|0;Z=fa-W>>2;ea=f[v>>2]|0;ga=f[l>>2]|0;if((((Z|0)==0?0:(Z*113|0)+-1|0)|0)==(ga+ea|0)){Pc(e);ra=f[v>>2]|0;sa=f[l>>2]|0;ta=f[o>>2]|0;ua=f[t>>2]|0}else{ra=ea;sa=ga;ta=fa;ua=W}W=sa+ra|0;if((ta|0)==(ua|0))va=0;else va=(f[ua+(((W>>>0)/113|0)<<2)>>2]|0)+(((W>>>0)%113|0)*36|0)|0;f[va>>2]=N;W=va+4|0;f[W>>2]=r;f[W+4>>2]=x;f[va+12>>2]=ia;f[va+16>>2]=i;f[va+20>>2]=V;f[va+24>>2]=Q;f[va+28>>2]=P;f[va+32>>2]=T;f[l>>2]=(f[l>>2]|0)+1}if((R|0)!=(ia|0)){W=f[o>>2]|0;fa=f[t>>2]|0;ga=W-fa>>2;ea=f[v>>2]|0;Z=f[l>>2]|0;if((((ga|0)==0?0:(ga*113|0)+-1|0)|0)==(Z+ea|0)){Pc(e);wa=f[v>>2]|0;xa=f[l>>2]|0;ya=f[o>>2]|0;za=f[t>>2]|0}else{wa=ea;xa=Z;ya=W;za=fa}fa=xa+wa|0;if((ya|0)==(za|0))Aa=0;else Aa=(f[za+(((fa>>>0)/113|0)<<2)>>2]|0)+(((fa>>>0)%113|0)*36|0)|0;f[Aa>>2]=ia;f[Aa+4>>2]=i;f[Aa+8>>2]=V;f[Aa+12>>2]=R;fa=Aa+16|0;f[fa>>2]=p;f[fa+4>>2]=q;f[Aa+24>>2]=Q;f[Aa+28>>2]=Y;f[Aa+32>>2]=U;fa=(f[l>>2]|0)+1|0;f[l>>2]=fa;Ba=fa}else aa=85}else aa=85;while(0);if((aa|0)==85){aa=0;Ba=f[l>>2]|0}if(!Ba)break;else L=Ba}}Ba=f[t>>2]|0;L=f[v>>2]|0;Aa=Ba+(((L>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ba;if((q|0)==(Ba|0)){Ca=0;Da=0}else{ia=(f[Aa>>2]|0)+(((L>>>0)%113|0)*36|0)|0;Ca=ia;Da=ia}ia=Aa;Aa=Da;c:while(1){Da=Aa;do{L=Da;if((Ca|0)==(L|0))break c;Da=L+36|0}while((Da-(f[ia>>2]|0)|0)!=4068);Da=ia+4|0;ia=Da;Aa=f[Da>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ba;do{Oq(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Ea=f[o>>2]|0;Fa=Ea-i>>2}while(Fa>>>0>2);Ga=Fa;Ha=i;Ia=Ea}else{Ga=l;Ha=Ba;Ia=q}switch(Ga|0){case 1:{Ja=56;aa=99;break}case 2:{Ja=113;aa=99;break}default:{}}if((aa|0)==99)f[v>>2]=Ja;if((Ha|0)!=(Ia|0)){Ja=Ha;do{Oq(f[Ja>>2]|0);Ja=Ja+4|0}while((Ja|0)!=(Ia|0));Ia=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Ia|0))f[o>>2]=t+(~((t+-4-Ia|0)>>>2)<<2)}Ia=f[e>>2]|0;if(!Ia){u=d;return}Oq(Ia);u=d;return}function lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0;d=u;u=u+32|0;e=d;g=a+8|0;h=f[g>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;do if(h)if(h>>>0>1073741823)aq(e);else{j=h<<2;k=ln(j)|0;f[e>>2]=k;l=k+(h<<2)|0;f[e+8>>2]=l;sj(k|0,0,j|0)|0;f[i>>2]=l;m=l;n=k;break}else{m=0;n=0}while(0);k=a+140|0;l=f[k>>2]|0;j=f[l>>2]|0;o=l+4|0;if(!j){p=l+8|0;q=n;r=m;s=h}else{h=f[o>>2]|0;if((h|0)!=(j|0))f[o>>2]=h+(~((h+-4-j|0)>>>2)<<2);Oq(j);j=l+8|0;f[j>>2]=0;f[o>>2]=0;f[l>>2]=0;p=j;q=f[e>>2]|0;r=f[i>>2]|0;s=f[g>>2]|0}f[l>>2]=q;f[o>>2]=r;f[p>>2]=f[e+8>>2];f[e>>2]=0;p=e+4|0;f[p>>2]=0;f[e+8>>2]=0;do if(s)if(s>>>0>1073741823)aq(e);else{r=s<<2;o=ln(r)|0;f[e>>2]=o;q=o+(s<<2)|0;f[e+8>>2]=q;sj(o|0,0,r|0)|0;f[p>>2]=q;t=q;v=o;break}else{t=0;v=0}while(0);s=a+152|0;o=f[s>>2]|0;q=f[o>>2]|0;r=o+4|0;if(!q){w=o+8|0;x=v;y=t}else{t=f[r>>2]|0;if((t|0)!=(q|0))f[r>>2]=t+(~((t+-4-q|0)>>>2)<<2);Oq(q);q=o+8|0;f[q>>2]=0;f[r>>2]=0;f[o>>2]=0;w=q;x=f[e>>2]|0;y=f[p>>2]|0}f[o>>2]=x;f[r>>2]=y;f[w>>2]=f[e+8>>2];w=f[b>>2]|0;y=b+4|0;r=f[y>>2]|0;x=f[y+4>>2]|0;y=f[c>>2]|0;o=c+4|0;p=f[o>>2]|0;q=f[o+4>>2]|0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;f[e+20>>2]=0;o=e+8|0;t=e+4|0;v=e+16|0;l=e+20|0;i=r;Pc(e);j=f[t>>2]|0;h=(f[l>>2]|0)+(f[v>>2]|0)|0;if((f[o>>2]|0)==(j|0))z=0;else z=(f[j+(((h>>>0)/113|0)<<2)>>2]|0)+(((h>>>0)%113|0)*36|0)|0;f[z>>2]=w;h=z+4|0;f[h>>2]=r;f[h+4>>2]=x;f[z+12>>2]=y;h=z+16|0;f[h>>2]=p;f[h+4>>2]=q;f[z+24>>2]=0;f[z+28>>2]=y-w;f[z+32>>2]=0;z=(f[l>>2]|0)+1|0;f[l>>2]=z;if(z|0){w=a+128|0;y=a+60|0;h=a+56|0;j=a+48|0;m=a+52|0;n=a+44|0;A=b+8|0;B=c+8|0;C=a+12|0;D=a+100|0;E=a+96|0;F=a+88|0;G=a+92|0;H=a+84|0;I=i+4|0;J=i+24|0;K=i+24|0;L=p+24|0;M=z;while(1){z=f[v>>2]|0;N=M+-1|0;O=N+z|0;P=f[t>>2]|0;Q=f[P+(((O>>>0)/113|0)<<2)>>2]|0;R=(O>>>0)%113|0;O=f[Q+(R*36|0)>>2]|0;S=f[Q+(R*36|0)+12>>2]|0;T=f[Q+(R*36|0)+24>>2]|0;U=f[Q+(R*36|0)+32>>2]|0;f[l>>2]=N;N=f[o>>2]|0;R=N-P>>2;if((1-M-z+((R|0)==0?0:(R*113|0)+-1|0)|0)>>>0>225){Oq(f[N+-4>>2]|0);f[o>>2]=(f[o>>2]|0)+-4}f[b>>2]=O;f[c>>2]=S;N=f[k>>2]|0;R=((f[g>>2]|0)+-1|0)==(T|0)?0:T+1|0;T=(f[s>>2]|0)+(U*12|0)|0;z=S-O|0;P=(f[a>>2]|0)-(f[(f[T>>2]|0)+(R<<2)>>2]|0)|0;a:do if(P){if(z>>>0<3){Q=f[w>>2]|0;f[Q>>2]=R;V=f[g>>2]|0;if(V>>>0>1){W=1;Y=V;Z=R;while(1){Z=(Z|0)==(Y+-1|0)?0:Z+1|0;f[Q+(W<<2)>>2]=Z;W=W+1|0;$=f[g>>2]|0;if(W>>>0>=$>>>0){aa=$;break}else Y=$}}else aa=V;if(!z){ba=81;break}else{ca=0;da=aa}while(1){Y=(f[J>>2]|0)+((X(f[I>>2]|0,O+ca|0)|0)<<2)|0;if(!da)ea=0;else{W=0;do{Z=f[(f[w>>2]|0)+(W<<2)>>2]|0;Q=(f[a>>2]|0)-(f[(f[T>>2]|0)+(Z<<2)>>2]|0)|0;do if(Q|0){$=f[y>>2]|0;fa=32-$|0;ga=32-Q|0;ha=f[Y+(Z<<2)>>2]<(fa|0)){ia=ha>>>ga;ga=Q-fa|0;f[y>>2]=ga;fa=f[h>>2]|ia>>>ga;f[h>>2]=fa;ga=f[j>>2]|0;if((ga|0)==(f[m>>2]|0))Ri(n,h);else{f[ga>>2]=fa;f[j>>2]=ga+4}f[h>>2]=ia<<32-(f[y>>2]|0);break}ia=f[h>>2]|ha>>>$;f[h>>2]=ia;ha=$+Q|0;f[y>>2]=ha;if((ha|0)!=32)break;ha=f[j>>2]|0;if((ha|0)==(f[m>>2]|0))Ri(n,h);else{f[ha>>2]=ia;f[j>>2]=ha+4}f[h>>2]=0;f[y>>2]=0}while(0);W=W+1|0;Q=f[g>>2]|0}while(W>>>0>>0);ea=Q}ca=ca+1|0;if(ca>>>0>=z>>>0){ba=81;break a}else da=ea}}V=U+1|0;Ig(N+(V*12|0)|0,f[N+(U*12|0)>>2]|0,f[N+(U*12|0)+4>>2]|0);W=(f[(f[k>>2]|0)+(V*12|0)>>2]|0)+(R<<2)|0;Y=(f[W>>2]|0)+(1<>2]=Y;W=f[A>>2]|0;Q=f[B>>2]|0;b:do if((S|0)==(O|0))ja=O;else{Z=f[K>>2]|0;if(!W){if((f[Z+(R<<2)>>2]|0)>>>0>>0){ja=S;break}else{ka=S;la=O}while(1){ha=ka;do{ha=ha+-1|0;if((la|0)==(ha|0)){ja=la;break b}ia=(f[L>>2]|0)+((X(ha,Q)|0)<<2)+(R<<2)|0}while((f[ia>>2]|0)>>>0>=Y>>>0);la=la+1|0;if((la|0)==(ha|0)){ja=ha;break b}else ka=ha}}else{ma=S;na=O}while(1){ia=na;while(1){oa=Z+((X(ia,W)|0)<<2)|0;if((f[oa+(R<<2)>>2]|0)>>>0>=Y>>>0){pa=ma;break}$=ia+1|0;if(($|0)==(ma|0)){ja=ma;break b}else ia=$}while(1){pa=pa+-1|0;if((ia|0)==(pa|0)){ja=ia;break b}qa=(f[L>>2]|0)+((X(pa,Q)|0)<<2)|0;if((f[qa+(R<<2)>>2]|0)>>>0>>0){ra=0;break}}do{ha=oa+(ra<<2)|0;$=qa+(ra<<2)|0;ga=f[ha>>2]|0;f[ha>>2]=f[$>>2];f[$>>2]=ga;ra=ra+1|0}while((ra|0)!=(W|0));na=ia+1|0;if((na|0)==(pa|0)){ja=pa;break}else ma=pa}}while(0);Y=(_(z|0)|0)^31;Q=ja-O|0;Z=S-ja|0;ga=Q>>>0>>0;if((Q|0)!=(Z|0)){$=f[D>>2]|0;if(ga)f[E>>2]=f[E>>2]|1<<31-$;ha=$+1|0;f[D>>2]=ha;if((ha|0)==32){ha=f[F>>2]|0;if((ha|0)==(f[G>>2]|0))Ri(H,E);else{f[ha>>2]=f[E>>2];f[F>>2]=ha+4}f[D>>2]=0;f[E>>2]=0}}ha=z>>>1;if(ga)sg(C,Y,ha-Q|0);else sg(C,Y,ha-Z|0);ha=f[s>>2]|0;Y=f[ha+(U*12|0)>>2]|0;ga=Y+(R<<2)|0;f[ga>>2]=(f[ga>>2]|0)+1;Ig(ha+(V*12|0)|0,Y,f[ha+(U*12|0)+4>>2]|0);if((ja|0)!=(O|0)){ha=f[o>>2]|0;Y=f[t>>2]|0;ga=ha-Y>>2;$=f[v>>2]|0;fa=f[l>>2]|0;if((((ga|0)==0?0:(ga*113|0)+-1|0)|0)==(fa+$|0)){Pc(e);sa=f[v>>2]|0;ta=f[l>>2]|0;ua=f[o>>2]|0;va=f[t>>2]|0}else{sa=$;ta=fa;ua=ha;va=Y}Y=ta+sa|0;if((ua|0)==(va|0))wa=0;else wa=(f[va+(((Y>>>0)/113|0)<<2)>>2]|0)+(((Y>>>0)%113|0)*36|0)|0;f[wa>>2]=O;Y=wa+4|0;f[Y>>2]=r;f[Y+4>>2]=x;f[wa+12>>2]=ja;f[wa+16>>2]=i;f[wa+20>>2]=W;f[wa+24>>2]=R;f[wa+28>>2]=Q;f[wa+32>>2]=U;f[l>>2]=(f[l>>2]|0)+1}if((S|0)!=(ja|0)){Q=f[o>>2]|0;Y=f[t>>2]|0;ha=Q-Y>>2;fa=f[v>>2]|0;$=f[l>>2]|0;if((((ha|0)==0?0:(ha*113|0)+-1|0)|0)==($+fa|0)){Pc(e);xa=f[v>>2]|0;ya=f[l>>2]|0;za=f[o>>2]|0;Aa=f[t>>2]|0}else{xa=fa;ya=$;za=Q;Aa=Y}Y=ya+xa|0;if((za|0)==(Aa|0))Ba=0;else Ba=(f[Aa+(((Y>>>0)/113|0)<<2)>>2]|0)+(((Y>>>0)%113|0)*36|0)|0;f[Ba>>2]=ja;f[Ba+4>>2]=i;f[Ba+8>>2]=W;f[Ba+12>>2]=S;Y=Ba+16|0;f[Y>>2]=p;f[Y+4>>2]=q;f[Ba+24>>2]=R;f[Ba+28>>2]=Z;f[Ba+32>>2]=V;Z=(f[l>>2]|0)+1|0;f[l>>2]=Z;Ca=Z}else ba=81}else ba=81;while(0);if((ba|0)==81){ba=0;Ca=f[l>>2]|0}if(!Ca)break;else M=Ca}}Ca=f[t>>2]|0;M=f[v>>2]|0;Ba=Ca+(((M>>>0)/113|0)<<2)|0;q=f[o>>2]|0;p=q;i=Ca;if((q|0)==(Ca|0)){Da=0;Ea=0}else{ja=(f[Ba>>2]|0)+(((M>>>0)%113|0)*36|0)|0;Da=ja;Ea=ja}ja=Ba;Ba=Ea;c:while(1){Ea=Ba;do{M=Ea;if((Da|0)==(M|0))break c;Ea=M+36|0}while((Ea-(f[ja>>2]|0)|0)!=4068);Ea=ja+4|0;ja=Ea;Ba=f[Ea>>2]|0}f[l>>2]=0;l=p-i>>2;if(l>>>0>2){i=Ca;do{Oq(f[i>>2]|0);i=(f[t>>2]|0)+4|0;f[t>>2]=i;Fa=f[o>>2]|0;Ga=Fa-i>>2}while(Ga>>>0>2);Ha=Ga;Ia=i;Ja=Fa}else{Ha=l;Ia=Ca;Ja=q}switch(Ha|0){case 1:{Ka=56;ba=95;break}case 2:{Ka=113;ba=95;break}default:{}}if((ba|0)==95)f[v>>2]=Ka;if((Ia|0)!=(Ja|0)){Ka=Ia;do{Oq(f[Ka>>2]|0);Ka=Ka+4|0}while((Ka|0)!=(Ja|0));Ja=f[t>>2]|0;t=f[o>>2]|0;if((t|0)!=(Ja|0))f[o>>2]=t+(~((t+-4-Ja|0)>>>2)<<2)}Ja=f[e>>2]|0;if(!Ja){u=d;return}Oq(Ja);u=d;return}function mb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=Oa,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;if(!(b[a+32>>0]|0)){r=o;m=0;while(1){s=$(b[r>>0]|0);n[g+(m<<2)>>2]=s;m=m+1|0;q=b[k>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){t=q;break}else r=r+1|0}}else{r=o;m=0;while(1){s=$($(b[r>>0]|0)/$(127.0));n[g+(m<<2)>>2]=s;m=m+1|0;q=b[k>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){t=q;break}else r=r+1|0}}}else t=l;r=t<<24>>24;if(t<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 2:{r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){k=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;u=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=k+u|0;if(!(b[a+32>>0]|0)){u=o;k=0;while(1){s=$(h[u>>0]|0);n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){v=q;break}else u=u+1|0}}else{u=o;k=0;while(1){s=$($(h[u>>0]|0)/$(255.0));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){v=l;break}else u=u+1|0}}}else v=m;u=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 3:{u=a+48|0;k=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,k|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;l=0;while(1){s=$(d[u>>1]|0);n[g+(l<<2)>>2]=s;l=l+1|0;q=b[r>>0]|0;if((l|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){w=q;break}else u=u+2|0}}else{u=o;l=0;while(1){s=$($(d[u>>1]|0)/$(32767.0));n[g+(l<<2)>>2]=s;l=l+1|0;m=b[r>>0]|0;if((l|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else u=u+2|0}}else w=k;u=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 4:{u=a+48|0;l=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,l|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;l=b[r>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;m=0;while(1){s=$(j[u>>1]|0);n[g+(m<<2)>>2]=s;m=m+1|0;q=b[r>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){x=q;break}else u=u+2|0}}else{u=o;m=0;while(1){s=$($(j[u>>1]|0)/$(65535.0));n[g+(m<<2)>>2]=s;m=m+1|0;k=b[r>>0]|0;if((m|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){x=k;break}else u=u+2|0}}else x=l;u=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 5:{u=a+48|0;m=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,m|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;k=0;while(1){s=$(f[u>>2]|0);n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){y=q;break}else u=u+4|0}}else{u=o;k=0;while(1){s=$($(f[u>>2]|0)*$(4.65661287e-10));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){y=l;break}else u=u+4|0}}else y=m;u=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 6:{u=a+48|0;k=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,k|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;l=0;while(1){s=$((f[u>>2]|0)>>>0);n[g+(l<<2)>>2]=s;l=l+1|0;q=b[r>>0]|0;if((l|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){z=q;break}else u=u+4|0}}else{u=o;l=0;while(1){s=$($((f[u>>2]|0)>>>0)*$(2.32830644e-10));n[g+(l<<2)>>2]=s;l=l+1|0;m=b[r>>0]|0;if((l|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){z=m;break}else u=u+4|0}}else z=k;u=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 7:{u=a+48|0;l=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,l|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;l=b[r>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;m=0;while(1){q=u;s=$(+((f[q>>2]|0)>>>0)+4294967296.0*+(f[q+4>>2]|0));n[g+(m<<2)>>2]=s;m=m+1|0;q=b[r>>0]|0;if((m|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else u=u+8|0}}else{u=o;m=0;while(1){k=u;s=$($(+((f[k>>2]|0)>>>0)+4294967296.0*+(f[k+4>>2]|0))*$(1.08420217e-19));n[g+(m<<2)>>2]=s;m=m+1|0;k=b[r>>0]|0;if((m|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){A=k;break}else u=u+8|0}}else A=l;u=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 8:{u=a+48|0;m=f[u>>2]|0;r=f[u+4>>2]|0;u=a+40|0;o=(Vn(un(f[u>>2]|0,f[u+4>>2]|0,f[c>>2]|0,0)|0,I|0,m|0,r|0)|0)+(f[f[a>>2]>>2]|0)|0;r=a+24|0;m=b[r>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0)if(!(b[a+32>>0]|0)){u=o;k=0;while(1){q=u;s=$(+((f[q>>2]|0)>>>0)+4294967296.0*+((f[q+4>>2]|0)>>>0));n[g+(k<<2)>>2]=s;k=k+1|0;q=b[r>>0]|0;if((k|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){B=q;break}else u=u+8|0}}else{u=o;k=0;while(1){l=u;s=$($(+((f[l>>2]|0)>>>0)+4294967296.0*+((f[l+4>>2]|0)>>>0))*$(5.42101086e-20));n[g+(k<<2)>>2]=s;k=k+1|0;l=b[r>>0]|0;if((k|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){B=l;break}else u=u+8|0}}else B=m;u=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(u<<2)|0,0,(e<<24>>24)-u<<2|0)|0;i=1;return i|0}case 9:{u=a+24|0;k=b[u>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){r=f[f[a>>2]>>2]|0;o=a+40|0;l=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;q=Vn(l|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=r+q|0;q=0;while(1){f[g+(q<<2)>>2]=f[o>>2];q=q+1|0;r=b[u>>0]|0;if((q|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){C=r;break}else o=o+4|0}}else C=k;o=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 10:{o=a+24|0;q=b[o>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){u=f[f[a>>2]>>2]|0;m=a+40|0;r=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;l=Vn(r|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=u+l|0;l=0;while(1){s=$(+p[m>>3]);n[g+(l<<2)>>2]=s;l=l+1|0;u=b[o>>0]|0;if((l|0)>=((u<<24>>24>e<<24>>24?e:u)<<24>>24|0)){D=u;break}else m=m+8|0}}else D=q;m=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 11:{m=a+24|0;l=b[m>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){o=f[f[a>>2]>>2]|0;k=a+40|0;u=un(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;r=Vn(u|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=o+r|0;r=0;while(1){s=$((b[k>>0]|0)!=0&1);n[g+(r<<2)>>2]=s;r=r+1|0;o=b[m>>0]|0;if((r|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){E=o;break}else k=k+1|0}}else E=l;k=E<<24>>24;if(E<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function nb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0.0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0.0,kb=0.0,lb=0.0,mb=0.0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0.0,sb=0.0,tb=0;i=u;u=u+512|0;j=i;k=d+c|0;l=0-k|0;m=a+4|0;n=a+100|0;o=b;b=0;a:while(1){switch(o|0){case 46:{p=6;break a;break}case 48:break;default:{q=0;r=o;s=b;t=0;v=0;break a}}w=f[m>>2]|0;if(w>>>0<(f[n>>2]|0)>>>0){f[m>>2]=w+1;o=h[w>>0]|0;b=1;continue}else{o=Si(a)|0;b=1;continue}}if((p|0)==6){o=f[m>>2]|0;if(o>>>0<(f[n>>2]|0)>>>0){f[m>>2]=o+1;x=h[o>>0]|0}else x=Si(a)|0;if((x|0)==48){o=0;w=0;while(1){y=Vn(o|0,w|0,-1,-1)|0;z=I;A=f[m>>2]|0;if(A>>>0<(f[n>>2]|0)>>>0){f[m>>2]=A+1;B=h[A>>0]|0}else B=Si(a)|0;if((B|0)==48){o=y;w=z}else{q=1;r=B;s=1;t=y;v=z;break}}}else{q=1;r=x;s=b;t=0;v=0}}f[j>>2]=0;b=r+-48|0;x=(r|0)==46;b:do if(x|b>>>0<10){B=j+496|0;w=0;o=0;z=0;y=q;A=s;C=r;D=x;E=b;F=t;G=v;H=0;J=0;c:while(1){do if(D)if(!y){L=w;M=o;N=1;O=z;P=A;Q=H;R=J;S=H;T=J}else break c;else{U=Vn(H|0,J|0,1,0)|0;V=I;W=(C|0)!=48;if((o|0)>=125){if(!W){L=w;M=o;N=y;O=z;P=A;Q=F;R=G;S=U;T=V;break}f[B>>2]=f[B>>2]|1;L=w;M=o;N=y;O=z;P=A;Q=F;R=G;S=U;T=V;break}Y=j+(o<<2)|0;if(!w)Z=E;else Z=C+-48+((f[Y>>2]|0)*10|0)|0;f[Y>>2]=Z;Y=w+1|0;_=(Y|0)==9;L=_?0:Y;M=o+(_&1)|0;N=y;O=W?U:z;P=1;Q=F;R=G;S=U;T=V}while(0);V=f[m>>2]|0;if(V>>>0<(f[n>>2]|0)>>>0){f[m>>2]=V+1;$=h[V>>0]|0}else $=Si(a)|0;E=$+-48|0;D=($|0)==46;if(!(D|E>>>0<10)){aa=L;ba=M;ca=O;da=N;ea=$;fa=P;ga=S;ha=Q;ia=T;ja=R;p=29;break b}else{w=L;o=M;z=O;y=N;A=P;C=$;F=Q;G=R;H=S;J=T}}ka=w;la=o;ma=z;na=H;oa=J;pa=F;qa=G;ra=(A|0)!=0;p=37}else{aa=0;ba=0;ca=0;da=q;ea=r;fa=s;ga=0;ha=t;ia=0;ja=v;p=29}while(0);do if((p|0)==29){v=(da|0)==0;t=v?ga:ha;s=v?ia:ja;v=(fa|0)!=0;if(!(v&(ea|32|0)==101))if((ea|0)>-1){ka=aa;la=ba;ma=ca;na=ga;oa=ia;pa=t;qa=s;ra=v;p=37;break}else{sa=aa;ta=ba;ua=ca;va=ga;wa=ia;xa=v;ya=t;za=s;p=39;break}v=Re(a,g)|0;r=I;if((v|0)==0&(r|0)==-2147483648){if(!g){Ym(a,0);Aa=0.0;break}if(!(f[n>>2]|0)){Ba=0;Ca=0}else{f[m>>2]=(f[m>>2]|0)+-1;Ba=0;Ca=0}}else{Ba=v;Ca=r}r=Vn(Ba|0,Ca|0,t|0,s|0)|0;Da=aa;Ea=ba;Fa=ca;Ga=r;Ha=ga;Ia=I;Ja=ia;p=41}while(0);if((p|0)==37)if(f[n>>2]|0){f[m>>2]=(f[m>>2]|0)+-1;if(ra){Da=ka;Ea=la;Fa=ma;Ga=pa;Ha=na;Ia=qa;Ja=oa;p=41}else p=40}else{sa=ka;ta=la;ua=ma;va=na;wa=oa;xa=ra;ya=pa;za=qa;p=39}if((p|0)==39)if(xa){Da=sa;Ea=ta;Fa=ua;Ga=ya;Ha=va;Ia=za;Ja=wa;p=41}else p=40;do if((p|0)==40){wa=Vq()|0;f[wa>>2]=22;Ym(a,0);Aa=0.0}else if((p|0)==41){wa=f[j>>2]|0;if(!wa){Aa=+(e|0)*0.0;break}if(((Ja|0)<0|(Ja|0)==0&Ha>>>0<10)&((Ga|0)==(Ha|0)&(Ia|0)==(Ja|0))?(c|0)>30|(wa>>>c|0)==0:0){Aa=+(e|0)*+(wa>>>0);break}wa=(d|0)/-2|0;za=((wa|0)<0)<<31>>31;if((Ia|0)>(za|0)|(Ia|0)==(za|0)&Ga>>>0>wa>>>0){wa=Vq()|0;f[wa>>2]=34;Aa=+(e|0)*1797693134862315708145274.0e284*1797693134862315708145274.0e284;break}wa=d+-106|0;za=((wa|0)<0)<<31>>31;if((Ia|0)<(za|0)|(Ia|0)==(za|0)&Ga>>>0>>0){wa=Vq()|0;f[wa>>2]=34;Aa=+(e|0)*2.2250738585072014e-308*2.2250738585072014e-308;break}if(!Da)Ka=Ea;else{if((Da|0)<9){wa=j+(Ea<<2)|0;za=Da;va=f[wa>>2]|0;while(1){va=va*10|0;if((za|0)>=8)break;else za=za+1|0}f[wa>>2]=va}Ka=Ea+1|0}if((Fa|0)<9?(Fa|0)<=(Ga|0)&(Ga|0)<18:0){if((Ga|0)==9){Aa=+(e|0)*+((f[j>>2]|0)>>>0);break}if((Ga|0)<9){Aa=+(e|0)*+((f[j>>2]|0)>>>0)/+(f[6720+(8-Ga<<2)>>2]|0);break}za=c+27+(X(Ga,-3)|0)|0;A=f[j>>2]|0;if((za|0)>30|(A>>>za|0)==0){Aa=+(e|0)*+(A>>>0)*+(f[6720+(Ga+-10<<2)>>2]|0);break}}A=(Ga|0)%9|0;if(!A){La=0;Ma=Ka;Na=0;Oa=Ga}else{za=(Ga|0)>-1?A:A+9|0;A=f[6720+(8-za<<2)>>2]|0;if(Ka){G=1e9/(A|0)|0;F=0;J=0;H=Ga;z=0;do{o=j+(z<<2)|0;w=f[o>>2]|0;ya=((w>>>0)/(A>>>0)|0)+F|0;f[o>>2]=ya;F=X(G,(w>>>0)%(A>>>0)|0)|0;w=(z|0)==(J|0)&(ya|0)==0;H=w?H+-9|0:H;J=w?J+1&127:J;z=z+1|0}while((z|0)!=(Ka|0));if(!F){Pa=J;Qa=Ka;Ra=H}else{f[j+(Ka<<2)>>2]=F;Pa=J;Qa=Ka+1|0;Ra=H}}else{Pa=0;Qa=0;Ra=Ga}La=0;Ma=Qa;Na=Pa;Oa=9-za+Ra|0}d:while(1){z=(Oa|0)<18;A=(Oa|0)==18;G=j+(Na<<2)|0;va=La;wa=Ma;while(1){if(!z){if(!A){Sa=va;Ta=Na;Ua=Oa;Va=wa;break d}if((f[G>>2]|0)>>>0>=9007199){Sa=va;Ta=Na;Ua=18;Va=wa;break d}}w=0;Wa=wa;ya=wa+127|0;while(1){o=ya&127;ua=j+(o<<2)|0;ta=Tn(f[ua>>2]|0,0,29)|0;sa=Vn(ta|0,I|0,w|0,0)|0;ta=I;if(ta>>>0>0|(ta|0)==0&sa>>>0>1e9){xa=jp(sa|0,ta|0,1e9,0)|0;qa=hn(sa|0,ta|0,1e9,0)|0;Xa=xa;Ya=qa}else{Xa=0;Ya=sa}f[ua>>2]=Ya;ua=(o|0)==(Na|0);Wa=(Ya|0)==0&(((o|0)!=(Wa+127&127|0)|ua)^1)?o:Wa;if(ua)break;else{w=Xa;ya=o+-1|0}}va=va+-29|0;if(Xa|0)break;else wa=Wa}wa=Na+127&127;G=Wa+127&127;A=j+((Wa+126&127)<<2)|0;if((wa|0)==(Wa|0)){f[A>>2]=f[A>>2]|f[j+(G<<2)>>2];Za=G}else Za=Wa;f[j+(wa<<2)>>2]=Xa;La=va;Ma=Za;Na=wa;Oa=Oa+9|0}e:while(1){za=Va+1&127;H=j+((Va+127&127)<<2)|0;J=Sa;F=Ta;wa=Ua;while(1){G=(wa|0)==18;A=(wa|0)>27?9:1;_a=J;$a=F;while(1){z=0;while(1){ya=z+$a&127;if((ya|0)==(Va|0)){ab=2;p=88;break}w=f[j+(ya<<2)>>2]|0;ya=f[6752+(z<<2)>>2]|0;if(w>>>0>>0){ab=2;p=88;break}if(w>>>0>ya>>>0)break;ya=z+1|0;if((z|0)<1)z=ya;else{ab=ya;p=88;break}}if((p|0)==88?(p=0,G&(ab|0)==2):0){bb=0.0;cb=0;db=Va;break e}eb=A+_a|0;if(($a|0)==(Va|0)){_a=eb;$a=Va}else break}G=(1<>>A;fb=0;gb=$a;hb=wa;ya=$a;do{w=j+(ya<<2)|0;o=f[w>>2]|0;ua=(o>>>A)+fb|0;f[w>>2]=ua;fb=X(o&G,z)|0;o=(ya|0)==(gb|0)&(ua|0)==0;hb=o?hb+-9|0:hb;gb=o?gb+1&127:gb;ya=ya+1&127}while((ya|0)!=(Va|0));if(!fb){J=eb;F=gb;wa=hb;continue}if((za|0)!=(gb|0))break;f[H>>2]=f[H>>2]|1;J=eb;F=gb;wa=hb}f[j+(Va<<2)>>2]=fb;Sa=eb;Ta=gb;Ua=hb;Va=za}while(1){wa=cb+$a&127;F=db+1&127;if((wa|0)==(db|0)){f[j+(F+-1<<2)>>2]=0;ib=F}else ib=db;bb=bb*1.0e9+ +((f[j+(wa<<2)>>2]|0)>>>0);cb=cb+1|0;if((cb|0)==2)break;else db=ib}jb=+(e|0);kb=bb*jb;wa=_a+53|0;F=wa-d|0;J=(F|0)<(c|0);H=J?((F|0)>0?F:0):c;if((H|0)<53){lb=+rq(+bk(1.0,105-H|0),kb);mb=+Dq(kb,+bk(1.0,53-H|0));nb=lb;ob=mb;pb=lb+(kb-mb)}else{nb=0.0;ob=0.0;pb=kb}va=$a+2&127;if((va|0)!=(ib|0)){ya=f[j+(va<<2)>>2]|0;do if(ya>>>0>=5e8){if((ya|0)!=5e8){qb=jb*.75+ob;break}if(($a+3&127|0)==(ib|0)){qb=jb*.5+ob;break}else{qb=jb*.75+ob;break}}else{if((ya|0)==0?($a+3&127|0)==(ib|0):0){qb=ob;break}qb=jb*.25+ob}while(0);if((53-H|0)>1?!(+Dq(qb,1.0)!=0.0):0)rb=qb+1.0;else rb=qb}else rb=ob;jb=pb+rb-nb;do if((wa&2147483647|0)>(-2-k|0)){ya=!(+K(+jb)>=9007199254740992.0);va=_a+((ya^1)&1)|0;kb=ya?jb:jb*.5;if((va+50|0)<=(l|0)?!(rb!=0.0&(J&((H|0)!=(F|0)|ya))):0){sb=kb;tb=va;break}ya=Vq()|0;f[ya>>2]=34;sb=kb;tb=va}else{sb=jb;tb=_a}while(0);Aa=+sq(sb,tb)}while(0);u=i;return +Aa}function ob(a,c,d,e,g,i){a=a|0;c=+c;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0,F=0,G=0,H=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0.0,ga=0.0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0;j=u;u=u+560|0;k=j+8|0;l=j;m=j+524|0;n=m;o=j+512|0;f[l>>2]=0;p=o+12|0;yo(c)|0;if((I|0)<0){q=-c;r=1;s=16605}else{q=c;r=(g&2049|0)!=0&1;s=(g&2048|0)==0?((g&1|0)==0?16606:16611):16608}yo(q)|0;do if(0==0&(I&2146435072|0)==2146435072){t=(i&32|0)!=0;v=r+3|0;Qk(a,32,d,v,g&-65537);Xo(a,s,r);Xo(a,q!=q|0.0!=0.0?(t?18555:16632):t?16624:16628,3);Qk(a,32,d,v,g^8192);w=v}else{c=+tq(q,l)*2.0;v=c!=0.0;if(v)f[l>>2]=(f[l>>2]|0)+-1;t=i|32;if((t|0)==97){x=i&32;y=(x|0)==0?s:s+9|0;z=r|2;A=12-e|0;do if(!(e>>>0>11|(A|0)==0)){B=8.0;C=A;do{C=C+-1|0;B=B*16.0}while((C|0)!=0);if((b[y>>0]|0)==45){D=-(B+(-c-B));break}else{D=c+B-B;break}}else D=c;while(0);A=f[l>>2]|0;C=(A|0)<0?0-A|0:A;E=Rj(C,((C|0)<0)<<31>>31,p)|0;if((E|0)==(p|0)){C=o+11|0;b[C>>0]=48;F=C}else F=E;b[F+-1>>0]=(A>>31&2)+43;A=F+-2|0;b[A>>0]=i+15;E=(e|0)<1;C=(g&8|0)==0;G=m;H=D;while(1){J=~~H;K=G+1|0;b[G>>0]=x|h[16636+J>>0];H=(H-+(J|0))*16.0;if((K-n|0)==1?!(C&(E&H==0.0)):0){b[K>>0]=46;L=G+2|0}else L=K;if(!(H!=0.0))break;else G=L}G=L;if((e|0)!=0?(-2-n+G|0)<(e|0):0){M=G-n|0;N=e+2|0}else{E=G-n|0;M=E;N=E}E=p-A|0;G=E+z+N|0;Qk(a,32,d,G,g);Xo(a,y,z);Qk(a,48,d,G,g^65536);Xo(a,m,M);Qk(a,48,N-M|0,0,0);Xo(a,A,E);Qk(a,32,d,G,g^8192);w=G;break}G=(e|0)<0?6:e;if(v){E=(f[l>>2]|0)+-28|0;f[l>>2]=E;O=c*268435456.0;P=E}else{O=c;P=f[l>>2]|0}E=(P|0)<0?k:k+288|0;C=E;H=O;do{x=~~H>>>0;f[C>>2]=x;C=C+4|0;H=(H-+(x>>>0))*1.0e9}while(H!=0.0);if((P|0)>0){v=E;A=C;z=P;while(1){y=(z|0)<29?z:29;x=A+-4|0;if(x>>>0>=v>>>0){K=x;x=0;do{J=Tn(f[K>>2]|0,0,y|0)|0;Q=Vn(J|0,I|0,x|0,0)|0;J=I;R=hn(Q|0,J|0,1e9,0)|0;f[K>>2]=R;x=jp(Q|0,J|0,1e9,0)|0;K=K+-4|0}while(K>>>0>=v>>>0);if(x){K=v+-4|0;f[K>>2]=x;S=K}else S=v}else S=v;K=A;while(1){if(K>>>0<=S>>>0)break;J=K+-4|0;if(!(f[J>>2]|0))K=J;else break}x=(f[l>>2]|0)-y|0;f[l>>2]=x;if((x|0)>0){v=S;A=K;z=x}else{T=S;U=K;V=x;break}}}else{T=E;U=C;V=P}if((V|0)<0){z=((G+25|0)/9|0)+1|0;A=(t|0)==102;v=T;x=U;J=V;while(1){Q=0-J|0;R=(Q|0)<9?Q:9;if(v>>>0>>0){Q=(1<>>R;Y=0;Z=v;do{_=f[Z>>2]|0;f[Z>>2]=(_>>>R)+Y;Y=X(_&Q,W)|0;Z=Z+4|0}while(Z>>>0>>0);Z=(f[v>>2]|0)==0?v+4|0:v;if(!Y){$=Z;aa=x}else{f[x>>2]=Y;$=Z;aa=x+4|0}}else{$=(f[v>>2]|0)==0?v+4|0:v;aa=x}Z=A?E:$;W=(aa-Z>>2|0)>(z|0)?Z+(z<<2)|0:aa;J=(f[l>>2]|0)+R|0;f[l>>2]=J;if((J|0)>=0){ba=$;ca=W;break}else{v=$;x=W}}}else{ba=T;ca=U}x=E;if(ba>>>0>>0){v=(x-ba>>2)*9|0;J=f[ba>>2]|0;if(J>>>0<10)da=v;else{z=v;v=10;while(1){v=v*10|0;A=z+1|0;if(J>>>0>>0){da=A;break}else z=A}}}else da=0;z=(t|0)==103;v=(G|0)!=0;J=G-((t|0)!=102?da:0)+((v&z)<<31>>31)|0;if((J|0)<(((ca-x>>2)*9|0)+-9|0)){A=J+9216|0;J=E+4+(((A|0)/9|0)+-1024<<2)|0;C=(A|0)%9|0;if((C|0)<8){A=C;C=10;while(1){W=C*10|0;if((A|0)<7){A=A+1|0;C=W}else{ea=W;break}}}else ea=10;C=f[J>>2]|0;A=(C>>>0)%(ea>>>0)|0;t=(J+4|0)==(ca|0);if(!(t&(A|0)==0)){B=(((C>>>0)/(ea>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;W=(ea|0)/2|0;H=A>>>0>>0?.5:t&(A|0)==(W|0)?1.0:1.5;if(!r){fa=H;ga=B}else{W=(b[s>>0]|0)==45;fa=W?-H:H;ga=W?-B:B}W=C-A|0;f[J>>2]=W;if(ga+fa!=ga){A=W+ea|0;f[J>>2]=A;if(A>>>0>999999999){A=ba;W=J;while(1){C=W+-4|0;f[W>>2]=0;if(C>>>0>>0){t=A+-4|0;f[t>>2]=0;ha=t}else ha=A;t=(f[C>>2]|0)+1|0;f[C>>2]=t;if(t>>>0>999999999){A=ha;W=C}else{ia=ha;ja=C;break}}}else{ia=ba;ja=J}W=(x-ia>>2)*9|0;A=f[ia>>2]|0;if(A>>>0<10){ka=ja;la=W;ma=ia}else{C=W;W=10;while(1){W=W*10|0;t=C+1|0;if(A>>>0>>0){ka=ja;la=t;ma=ia;break}else C=t}}}else{ka=J;la=da;ma=ba}}else{ka=J;la=da;ma=ba}C=ka+4|0;na=la;oa=ca>>>0>C>>>0?C:ca;pa=ma}else{na=da;oa=ca;pa=ba}C=oa;while(1){if(C>>>0<=pa>>>0){qa=0;break}W=C+-4|0;if(!(f[W>>2]|0))C=W;else{qa=1;break}}J=0-na|0;do if(z){W=G+((v^1)&1)|0;if((W|0)>(na|0)&(na|0)>-5){ra=i+-1|0;sa=W+-1-na|0}else{ra=i+-2|0;sa=W+-1|0}W=g&8;if(!W){if(qa?(A=f[C+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){t=0;Z=10;while(1){Z=Z*10|0;Q=t+1|0;if((A>>>0)%(Z>>>0)|0|0){ta=Q;break}else t=Q}}else ta=0;else ta=9;t=((C-x>>2)*9|0)+-9|0;if((ra|32|0)==102){Z=t-ta|0;A=(Z|0)>0?Z:0;ua=ra;va=(sa|0)<(A|0)?sa:A;wa=0;break}else{A=t+na-ta|0;t=(A|0)>0?A:0;ua=ra;va=(sa|0)<(t|0)?sa:t;wa=0;break}}else{ua=ra;va=sa;wa=W}}else{ua=i;va=G;wa=g&8}while(0);G=va|wa;x=(G|0)!=0&1;v=(ua|32|0)==102;if(v){xa=0;ya=(na|0)>0?na:0}else{z=(na|0)<0?J:na;t=Rj(z,((z|0)<0)<<31>>31,p)|0;z=p;if((z-t|0)<2){A=t;while(1){Z=A+-1|0;b[Z>>0]=48;if((z-Z|0)<2)A=Z;else{za=Z;break}}}else za=t;b[za+-1>>0]=(na>>31&2)+43;A=za+-2|0;b[A>>0]=ua;xa=A;ya=z-A|0}A=r+1+va+x+ya|0;Qk(a,32,d,A,g);Xo(a,s,r);Qk(a,48,d,A,g^65536);if(v){J=pa>>>0>E>>>0?E:pa;Z=m+9|0;R=Z;Y=m+8|0;Q=J;do{K=Rj(f[Q>>2]|0,0,Z)|0;if((Q|0)==(J|0))if((K|0)==(Z|0)){b[Y>>0]=48;Aa=Y}else Aa=K;else if(K>>>0>m>>>0){sj(m|0,48,K-n|0)|0;y=K;while(1){_=y+-1|0;if(_>>>0>m>>>0)y=_;else{Aa=_;break}}}else Aa=K;Xo(a,Aa,R-Aa|0);Q=Q+4|0}while(Q>>>0<=E>>>0);if(G|0)Xo(a,16652,1);if(Q>>>0>>0&(va|0)>0){E=va;R=Q;while(1){Y=Rj(f[R>>2]|0,0,Z)|0;if(Y>>>0>m>>>0){sj(m|0,48,Y-n|0)|0;J=Y;while(1){v=J+-1|0;if(v>>>0>m>>>0)J=v;else{Ba=v;break}}}else Ba=Y;Xo(a,Ba,(E|0)<9?E:9);R=R+4|0;J=E+-9|0;if(!(R>>>0>>0&(E|0)>9)){Ca=J;break}else E=J}}else Ca=va;Qk(a,48,Ca+9|0,9,0)}else{E=qa?C:pa+4|0;if((va|0)>-1){R=m+9|0;Z=(wa|0)==0;Q=R;G=0-n|0;J=m+8|0;K=va;v=pa;while(1){x=Rj(f[v>>2]|0,0,R)|0;if((x|0)==(R|0)){b[J>>0]=48;Da=J}else Da=x;do if((v|0)==(pa|0)){x=Da+1|0;Xo(a,Da,1);if(Z&(K|0)<1){Ea=x;break}Xo(a,16652,1);Ea=x}else{if(Da>>>0<=m>>>0){Ea=Da;break}sj(m|0,48,Da+G|0)|0;x=Da;while(1){z=x+-1|0;if(z>>>0>m>>>0)x=z;else{Ea=z;break}}}while(0);Y=Q-Ea|0;Xo(a,Ea,(K|0)>(Y|0)?Y:K);x=K-Y|0;v=v+4|0;if(!(v>>>0>>0&(x|0)>-1)){Fa=x;break}else K=x}}else Fa=va;Qk(a,48,Fa+18|0,18,0);Xo(a,xa,p-xa|0)}Qk(a,32,d,A,g^8192);w=A}while(0);u=j;return ((w|0)<(d|0)?d:w)|0}function pb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;c=u;u=u+64|0;d=c+56|0;e=c+52|0;g=c+48|0;h=c+60|0;i=c;j=c+44|0;k=c+40|0;l=c+36|0;m=c+32|0;n=c+28|0;o=c+24|0;p=c+20|0;q=c+16|0;r=c+12|0;if(!(b[a+288>>0]|0)){_e(d,f[a+8>>2]|0);s=a+12|0;t=f[d>>2]|0;f[d>>2]=0;v=f[s>>2]|0;f[s>>2]=t;if(v){Ii(v);Oq(v);v=f[d>>2]|0;f[d>>2]=0;if(v|0){Ii(v);Oq(v)}}else f[d>>2]=0}else{fh(d,f[a+8>>2]|0);v=a+12|0;t=f[d>>2]|0;f[d>>2]=0;s=f[v>>2]|0;f[v>>2]=t;if(s){Ii(s);Oq(s);s=f[d>>2]|0;f[d>>2]=0;if(s|0){Ii(s);Oq(s)}}else f[d>>2]=0}s=a+12|0;t=f[s>>2]|0;if(!t){w=0;u=c;return w|0}if((((f[t+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0|0)==(f[t+40>>2]|0)){w=0;u=c;return w|0}v=a+200|0;f[a+264>>2]=a;x=a+4|0;ci(((f[t+28>>2]|0)-(f[t+24>>2]|0)>>2)-(f[t+44>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;t=f[s>>2]|0;ci((((f[t+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0)-(f[t+40>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;t=a+28|0;y=a+8|0;z=f[y>>2]|0;A=((f[z+100>>2]|0)-(f[z+96>>2]|0)|0)/12|0;b[d>>0]=0;qh(t,A,d);A=f[s>>2]|0;z=(f[A+28>>2]|0)-(f[A+24>>2]|0)>>2;f[d>>2]=-1;hg(a+52|0,z,d);z=a+40|0;A=f[z>>2]|0;B=a+44|0;C=f[B>>2]|0;if((C|0)!=(A|0))f[B>>2]=C+(~((C+-4-A|0)>>>2)<<2);A=f[s>>2]|0;C=(f[A+4>>2]|0)-(f[A>>2]|0)>>2;gk(z,C-((C>>>0)%3|0)|0);C=a+84|0;z=f[s>>2]|0;A=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2;b[d>>0]=0;qh(C,A,d);A=a+96|0;z=f[A>>2]|0;B=a+100|0;D=f[B>>2]|0;if((D|0)!=(z|0))f[B>>2]=D+(~((D+-4-z|0)>>>2)<<2);f[a+164>>2]=-1;z=a+168|0;f[z>>2]=0;D=f[a+108>>2]|0;E=a+112|0;F=f[E>>2]|0;if((F|0)!=(D|0))f[E>>2]=F+(~(((F+-12-D|0)>>>0)/12|0)*12|0);D=a+132|0;if(f[D>>2]|0){F=a+128|0;E=f[F>>2]|0;if(E|0){G=E;do{E=G;G=f[G>>2]|0;Oq(E)}while((G|0)!=0)}f[F>>2]=0;F=f[a+124>>2]|0;if(F|0){G=a+120|0;E=0;do{f[(f[G>>2]|0)+(E<<2)>>2]=0;E=E+1|0}while((E|0)!=(F|0))}f[D>>2]=0}f[a+144>>2]=0;D=f[s>>2]|0;F=(f[D+28>>2]|0)-(f[D+24>>2]|0)>>2;f[d>>2]=-1;hg(a+152|0,F,d);F=a+72|0;D=f[F>>2]|0;E=a+76|0;G=f[E>>2]|0;if((G|0)!=(D|0))f[E>>2]=G+(~((G+-4-D|0)>>>2)<<2);D=f[s>>2]|0;gk(F,((f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)/3|0);f[a+64>>2]=0;if(!(Be(a)|0)){w=0;u=c;return w|0}if(!(Hg(a)|0)){w=0;u=c;return w|0}D=a+172|0;G=a+176|0;H=(((f[G>>2]|0)-(f[D>>2]|0)|0)/136|0)&255;b[h>>0]=H;I=f[(f[x>>2]|0)+44>>2]|0;J=I+16|0;K=f[J+4>>2]|0;if((K|0)>0|(K|0)==0&(f[J>>2]|0)>>>0>0)L=H;else{f[e>>2]=f[I+4>>2];f[d>>2]=f[e>>2];Me(I,d,h,h+1|0)|0;L=b[h>>0]|0}h=a+284|0;f[h>>2]=L&255;L=f[s>>2]|0;I=(f[L+4>>2]|0)-(f[L>>2]|0)|0;L=I>>2;dj(v);f[i>>2]=0;H=i+4|0;f[H>>2]=0;f[i+8>>2]=0;a:do if((I|0)>0){J=a+104|0;K=i+8|0;M=0;b:while(1){N=(M>>>0)/3|0;O=N>>>5;P=1<<(N&31);if((f[(f[t>>2]|0)+(O<<2)>>2]&P|0)==0?(Q=f[s>>2]|0,f[j>>2]=N,f[d>>2]=f[j>>2],!(_j(Q,d)|0)):0){f[e>>2]=0;f[k>>2]=N;f[d>>2]=f[k>>2];N=xg(a,d,e)|0;fj(v,N);Q=f[e>>2]|0;R=(Q|0)==-1;do if(N){do if(R){S=-1;T=-1;U=-1}else{V=f[f[s>>2]>>2]|0;W=f[V+(Q<<2)>>2]|0;X=Q+1|0;Y=((X>>>0)%3|0|0)==0?Q+-2|0:X;if((Y|0)==-1)Z=-1;else Z=f[V+(Y<<2)>>2]|0;Y=(((Q>>>0)%3|0|0)==0?2:-1)+Q|0;if((Y|0)==-1){S=W;T=-1;U=Z;break}S=W;T=f[V+(Y<<2)>>2]|0;U=Z}while(0);Y=f[C>>2]|0;V=Y+(S>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(S&31);V=Y+(U>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(U&31);V=Y+(T>>>5<<2)|0;f[V>>2]=f[V>>2]|1<<(T&31);f[d>>2]=1;V=f[B>>2]|0;if(V>>>0<(f[J>>2]|0)>>>0){f[V>>2]=1;f[B>>2]=V+4}else Ri(A,d);V=(f[t>>2]|0)+(O<<2)|0;f[V>>2]=f[V>>2]|P;V=Q+1|0;if(R)_=-1;else _=((V>>>0)%3|0|0)==0?Q+-2|0:V;f[d>>2]=_;Y=f[H>>2]|0;if(Y>>>0<(f[K>>2]|0)>>>0){f[Y>>2]=_;f[H>>2]=Y+4}else Ri(i,d);if(R)break;Y=((V>>>0)%3|0|0)==0?Q+-2|0:V;if((Y|0)==-1)break;V=f[(f[(f[s>>2]|0)+12>>2]|0)+(Y<<2)>>2]|0;Y=(V|0)==-1;W=Y?-1:(V>>>0)/3|0;if(Y)break;if(f[(f[t>>2]|0)+(W>>>5<<2)>>2]&1<<(W&31)|0)break;f[l>>2]=V;f[d>>2]=f[l>>2];if(!(kc(a,d)|0))break b}else{V=Q+1|0;if(R)$=-1;else $=((V>>>0)%3|0|0)==0?Q+-2|0:V;f[m>>2]=$;f[d>>2]=f[m>>2];Pe(a,d,1)|0;f[n>>2]=f[e>>2];f[d>>2]=f[n>>2];if(!(kc(a,d)|0))break b}while(0)}M=M+1|0;if((M|0)>=(L|0)){aa=62;break a}}ba=0}else aa=62;while(0);if((aa|0)==62){aa=f[F>>2]|0;L=f[E>>2]|0;n=L;if((aa|0)!=(L|0)?(m=L+-4|0,aa>>>0>>0):0){L=aa;aa=m;do{m=f[L>>2]|0;f[L>>2]=f[aa>>2];f[aa>>2]=m;L=L+4|0;aa=aa+-4|0}while(L>>>0>>0)}f[o>>2]=n;f[p>>2]=f[i>>2];f[q>>2]=f[H>>2];f[g>>2]=f[o>>2];f[e>>2]=f[p>>2];f[d>>2]=f[q>>2];Yd(F,g,e,d)|0;if((f[G>>2]|0)!=(f[D>>2]|0)?(D=f[y>>2]|0,y=((f[D+100>>2]|0)-(f[D+96>>2]|0)|0)/12|0,b[d>>0]=0,qh(t,y,d),y=f[F>>2]|0,F=f[E>>2]|0,(y|0)!=(F|0)):0){E=y;do{f[r>>2]=f[E>>2];f[d>>2]=f[r>>2];He(a,d)|0;E=E+4|0}while((E|0)!=(F|0))}th(v);F=a+232|0;ld(v,F);v=a+280|0;E=f[v>>2]|0;if((E|0?(f[h>>2]|0)>0:0)?(ld(E,F),(f[h>>2]|0)>1):0){E=1;do{ld((f[v>>2]|0)+(E<<5)|0,F);E=E+1|0}while((E|0)<(f[h>>2]|0))}ci((f[a+272>>2]|0)-(f[a+268>>2]|0)>>2,f[(f[x>>2]|0)+44>>2]|0)|0;ci(f[z>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;if(bh(a)|0){z=f[(f[x>>2]|0)+44>>2]|0;x=f[F>>2]|0;F=z+16|0;h=f[F+4>>2]|0;if(!((h|0)>0|(h|0)==0&(f[F>>2]|0)>>>0>0)){F=(f[a+236>>2]|0)-x|0;f[e>>2]=f[z+4>>2];f[d>>2]=f[e>>2];Me(z,d,x,x+F|0)|0}ba=1}else ba=0}F=f[i>>2]|0;if(F|0){i=f[H>>2]|0;if((i|0)!=(F|0))f[H>>2]=i+(~((i+-4-F|0)>>>2)<<2);Oq(F)}w=ba;u=c;return w|0}function qb(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;i=u;u=u+64|0;j=i+16|0;k=i;l=i+24|0;m=i+8|0;n=i+20|0;f[j>>2]=c;c=(a|0)!=0;o=l+40|0;q=o;r=l+39|0;l=m+4|0;s=0;t=0;v=0;a:while(1){do if((t|0)>-1)if((s|0)>(2147483647-t|0)){w=Vq()|0;f[w>>2]=75;x=-1;break}else{x=s+t|0;break}else x=t;while(0);w=f[j>>2]|0;y=b[w>>0]|0;if(!(y<<24>>24)){z=88;break}else{A=y;B=w}b:while(1){switch(A<<24>>24){case 37:{C=B;D=B;z=9;break b;break}case 0:{E=B;break b;break}default:{}}y=B+1|0;f[j>>2]=y;A=b[y>>0]|0;B=y}c:do if((z|0)==9)while(1){z=0;if((b[D+1>>0]|0)!=37){E=C;break c}y=C+1|0;D=D+2|0;f[j>>2]=D;if((b[D>>0]|0)!=37){E=y;break}else{C=y;z=9}}while(0);y=E-w|0;if(c)Xo(a,w,y);if(y|0){s=y;t=x;continue}y=(Aq(b[(f[j>>2]|0)+1>>0]|0)|0)==0;F=f[j>>2]|0;if(!y?(b[F+2>>0]|0)==36:0){G=(b[F+1>>0]|0)+-48|0;H=1;J=3}else{G=-1;H=v;J=1}y=F+J|0;f[j>>2]=y;F=b[y>>0]|0;K=(F<<24>>24)+-32|0;if(K>>>0>31|(1<>24)+-32|K;P=F+1|0;f[j>>2]=P;Q=b[P>>0]|0;R=(Q<<24>>24)+-32|0;if(R>>>0>31|(1<>24==42){if((Aq(b[N+1>>0]|0)|0)!=0?(F=f[j>>2]|0,(b[F+2>>0]|0)==36):0){O=F+1|0;f[h+((b[O>>0]|0)+-48<<2)>>2]=10;S=f[g+((b[O>>0]|0)+-48<<3)>>2]|0;T=1;U=F+3|0}else{if(H|0){V=-1;break}if(c){F=(f[e>>2]|0)+(4-1)&~(4-1);O=f[F>>2]|0;f[e>>2]=F+4;W=O}else W=0;S=W;T=0;U=(f[j>>2]|0)+1|0}f[j>>2]=U;O=(S|0)<0;X=O?0-S|0:S;Y=O?L|8192:L;Z=T;_=U}else{O=Ll(j)|0;if((O|0)<0){V=-1;break}X=O;Y=L;Z=H;_=f[j>>2]|0}do if((b[_>>0]|0)==46){if((b[_+1>>0]|0)!=42){f[j>>2]=_+1;O=Ll(j)|0;$=O;aa=f[j>>2]|0;break}if(Aq(b[_+2>>0]|0)|0?(O=f[j>>2]|0,(b[O+3>>0]|0)==36):0){F=O+2|0;f[h+((b[F>>0]|0)+-48<<2)>>2]=10;K=f[g+((b[F>>0]|0)+-48<<3)>>2]|0;F=O+4|0;f[j>>2]=F;$=K;aa=F;break}if(Z|0){V=-1;break a}if(c){F=(f[e>>2]|0)+(4-1)&~(4-1);K=f[F>>2]|0;f[e>>2]=F+4;ba=K}else ba=0;K=(f[j>>2]|0)+2|0;f[j>>2]=K;$=ba;aa=K}else{$=-1;aa=_}while(0);K=0;F=aa;while(1){if(((b[F>>0]|0)+-65|0)>>>0>57){V=-1;break a}O=F;F=F+1|0;f[j>>2]=F;ca=b[(b[O>>0]|0)+-65+(16124+(K*58|0))>>0]|0;da=ca&255;if((da+-1|0)>>>0>=8)break;else K=da}if(!(ca<<24>>24)){V=-1;break}O=(G|0)>-1;do if(ca<<24>>24==19)if(O){V=-1;break a}else z=50;else{if(O){f[h+(G<<2)>>2]=da;P=g+(G<<3)|0;Q=f[P+4>>2]|0;y=k;f[y>>2]=f[P>>2];f[y+4>>2]=Q;z=50;break}if(!c){V=0;break a}We(k,da,e);ea=f[j>>2]|0}while(0);if((z|0)==50){z=0;if(c)ea=F;else{s=0;t=x;v=Z;continue}}O=b[ea+-1>>0]|0;Q=(K|0)!=0&(O&15|0)==3?O&-33:O;O=Y&-65537;y=(Y&8192|0)==0?Y:O;d:do switch(Q|0){case 110:{switch((K&255)<<24>>24){case 0:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 1:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 2:{P=f[k>>2]|0;f[P>>2]=x;f[P+4>>2]=((x|0)<0)<<31>>31;s=0;t=x;v=Z;continue a;break}case 3:{d[f[k>>2]>>1]=x;s=0;t=x;v=Z;continue a;break}case 4:{b[f[k>>2]>>0]=x;s=0;t=x;v=Z;continue a;break}case 6:{f[f[k>>2]>>2]=x;s=0;t=x;v=Z;continue a;break}case 7:{P=f[k>>2]|0;f[P>>2]=x;f[P+4>>2]=((x|0)<0)<<31>>31;s=0;t=x;v=Z;continue a;break}default:{s=0;t=x;v=Z;continue a}}break}case 112:{fa=120;ga=$>>>0>8?$:8;ha=y|8;z=62;break}case 88:case 120:{fa=Q;ga=$;ha=y;z=62;break}case 111:{P=k;R=f[P>>2]|0;ia=f[P+4>>2]|0;P=Ol(R,ia,o)|0;ja=q-P|0;ka=P;la=0;ma=16588;na=(y&8|0)==0|($|0)>(ja|0)?$:ja+1|0;oa=y;pa=R;qa=ia;z=68;break}case 105:case 100:{ia=k;R=f[ia>>2]|0;ja=f[ia+4>>2]|0;if((ja|0)<0){ia=Xn(0,0,R|0,ja|0)|0;P=I;ra=k;f[ra>>2]=ia;f[ra+4>>2]=P;sa=1;ta=16588;ua=ia;va=P;z=67;break d}else{sa=(y&2049|0)!=0&1;ta=(y&2048|0)==0?((y&1|0)==0?16588:16590):16589;ua=R;va=ja;z=67;break d}break}case 117:{ja=k;sa=0;ta=16588;ua=f[ja>>2]|0;va=f[ja+4>>2]|0;z=67;break}case 99:{b[r>>0]=f[k>>2];wa=r;xa=0;ya=16588;za=o;Aa=1;Ba=O;break}case 109:{ja=Vq()|0;Ca=$o(f[ja>>2]|0)|0;z=72;break}case 115:{ja=f[k>>2]|0;Ca=ja|0?ja:16598;z=72;break}case 67:{f[m>>2]=f[k>>2];f[l>>2]=0;f[k>>2]=m;Da=-1;Ea=m;z=76;break}case 83:{ja=f[k>>2]|0;if(!$){Qk(a,32,X,0,y);Fa=0;z=85}else{Da=$;Ea=ja;z=76}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{s=ob(a,+p[k>>3],X,$,y,Q)|0;t=x;v=Z;continue a;break}default:{wa=w;xa=0;ya=16588;za=o;Aa=$;Ba=y}}while(0);e:do if((z|0)==62){z=0;w=k;Q=f[w>>2]|0;K=f[w+4>>2]|0;w=ul(Q,K,o,fa&32)|0;F=(ha&8|0)==0|(Q|0)==0&(K|0)==0;ka=w;la=F?0:2;ma=F?16588:16588+(fa>>4)|0;na=ga;oa=ha;pa=Q;qa=K;z=68}else if((z|0)==67){z=0;ka=Rj(ua,va,o)|0;la=sa;ma=ta;na=$;oa=y;pa=ua;qa=va;z=68}else if((z|0)==72){z=0;K=tg(Ca,0,$)|0;Q=(K|0)==0;wa=Ca;xa=0;ya=16588;za=Q?Ca+$|0:K;Aa=Q?$:K-Ca|0;Ba=O}else if((z|0)==76){z=0;K=Ea;Q=0;F=0;while(1){w=f[K>>2]|0;if(!w){Ga=Q;Ha=F;break}ja=Po(n,w)|0;if((ja|0)<0|ja>>>0>(Da-Q|0)>>>0){Ga=Q;Ha=ja;break}w=ja+Q|0;if(Da>>>0>w>>>0){K=K+4|0;Q=w;F=ja}else{Ga=w;Ha=ja;break}}if((Ha|0)<0){V=-1;break a}Qk(a,32,X,Ga,y);if(!Ga){Fa=0;z=85}else{F=Ea;Q=0;while(1){K=f[F>>2]|0;if(!K){Fa=Ga;z=85;break e}ja=Po(n,K)|0;Q=ja+Q|0;if((Q|0)>(Ga|0)){Fa=Ga;z=85;break e}Xo(a,n,ja);if(Q>>>0>=Ga>>>0){Fa=Ga;z=85;break}else F=F+4|0}}}while(0);if((z|0)==68){z=0;O=(pa|0)!=0|(qa|0)!=0;F=(na|0)!=0|O;Q=q-ka+((O^1)&1)|0;wa=F?ka:o;xa=la;ya=ma;za=o;Aa=F?((na|0)>(Q|0)?na:Q):na;Ba=(na|0)>-1?oa&-65537:oa}else if((z|0)==85){z=0;Qk(a,32,X,Fa,y^8192);s=(X|0)>(Fa|0)?X:Fa;t=x;v=Z;continue}Q=za-wa|0;F=(Aa|0)<(Q|0)?Q:Aa;O=F+xa|0;ja=(X|0)<(O|0)?O:X;Qk(a,32,ja,O,Ba);Xo(a,ya,xa);Qk(a,48,ja,O,Ba^65536);Qk(a,48,F,Q,0);Xo(a,wa,Q);Qk(a,32,ja,O,Ba^8192);s=ja;t=x;v=Z}f:do if((z|0)==88)if(!a)if(v){Z=1;while(1){t=f[h+(Z<<2)>>2]|0;if(!t){Ia=Z;break}We(g+(Z<<3)|0,t,e);t=Z+1|0;if((Z|0)<9)Z=t;else{Ia=t;break}}if((Ia|0)<10){Z=Ia;while(1){if(f[h+(Z<<2)>>2]|0){V=-1;break f}if((Z|0)<9)Z=Z+1|0;else{V=1;break}}}else V=1}else V=0;else V=x;while(0);u=i;return V|0}function rb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;c=u;u=u+64|0;d=c+56|0;e=c+52|0;g=c+48|0;h=c+60|0;i=c;j=c+44|0;k=c+40|0;l=c+36|0;m=c+32|0;n=c+28|0;o=c+24|0;p=c+20|0;q=c+16|0;r=c+12|0;if(!(b[a+352>>0]|0)){_e(d,f[a+8>>2]|0);s=a+12|0;t=f[d>>2]|0;f[d>>2]=0;v=f[s>>2]|0;f[s>>2]=t;if(v){Ii(v);Oq(v);v=f[d>>2]|0;f[d>>2]=0;if(v|0){Ii(v);Oq(v)}}else f[d>>2]=0}else{fh(d,f[a+8>>2]|0);v=a+12|0;t=f[d>>2]|0;f[d>>2]=0;s=f[v>>2]|0;f[v>>2]=t;if(s){Ii(s);Oq(s);s=f[d>>2]|0;f[d>>2]=0;if(s|0){Ii(s);Oq(s)}}else f[d>>2]=0}s=a+12|0;t=f[s>>2]|0;if(!t){w=0;u=c;return w|0}if((((f[t+4>>2]|0)-(f[t>>2]|0)>>2>>>0)/3|0|0)==(f[t+40>>2]|0)){w=0;u=c;return w|0}t=a+200|0;ve(t,a)|0;v=f[s>>2]|0;x=a+4|0;ci(((f[v+28>>2]|0)-(f[v+24>>2]|0)>>2)-(f[v+44>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;v=f[s>>2]|0;ci((((f[v+4>>2]|0)-(f[v>>2]|0)>>2>>>0)/3|0)-(f[v+40>>2]|0)|0,f[(f[x>>2]|0)+44>>2]|0)|0;v=a+28|0;y=a+8|0;z=f[y>>2]|0;A=((f[z+100>>2]|0)-(f[z+96>>2]|0)|0)/12|0;b[d>>0]=0;qh(v,A,d);A=f[s>>2]|0;z=(f[A+28>>2]|0)-(f[A+24>>2]|0)>>2;f[d>>2]=-1;hg(a+52|0,z,d);z=a+40|0;A=f[z>>2]|0;B=a+44|0;C=f[B>>2]|0;if((C|0)!=(A|0))f[B>>2]=C+(~((C+-4-A|0)>>>2)<<2);A=f[s>>2]|0;C=(f[A+4>>2]|0)-(f[A>>2]|0)>>2;gk(z,C-((C>>>0)%3|0)|0);C=a+84|0;z=f[s>>2]|0;A=(f[z+28>>2]|0)-(f[z+24>>2]|0)>>2;b[d>>0]=0;qh(C,A,d);A=a+96|0;z=f[A>>2]|0;B=a+100|0;D=f[B>>2]|0;if((D|0)!=(z|0))f[B>>2]=D+(~((D+-4-z|0)>>>2)<<2);f[a+164>>2]=-1;z=a+168|0;f[z>>2]=0;D=f[a+108>>2]|0;E=a+112|0;F=f[E>>2]|0;if((F|0)!=(D|0))f[E>>2]=F+(~(((F+-12-D|0)>>>0)/12|0)*12|0);D=a+132|0;if(f[D>>2]|0){F=a+128|0;E=f[F>>2]|0;if(E|0){G=E;do{E=G;G=f[G>>2]|0;Oq(E)}while((G|0)!=0)}f[F>>2]=0;F=f[a+124>>2]|0;if(F|0){G=a+120|0;E=0;do{f[(f[G>>2]|0)+(E<<2)>>2]=0;E=E+1|0}while((E|0)!=(F|0))}f[D>>2]=0}f[a+144>>2]=0;D=f[s>>2]|0;F=(f[D+28>>2]|0)-(f[D+24>>2]|0)>>2;f[d>>2]=-1;hg(a+152|0,F,d);F=a+72|0;D=f[F>>2]|0;E=a+76|0;G=f[E>>2]|0;if((G|0)!=(D|0))f[E>>2]=G+(~((G+-4-D|0)>>>2)<<2);D=f[s>>2]|0;gk(F,((f[D+4>>2]|0)-(f[D>>2]|0)>>2>>>0)/3|0);f[a+64>>2]=0;if(!(Be(a)|0)){w=0;u=c;return w|0}if(!(Dg(a)|0)){w=0;u=c;return w|0}D=a+172|0;G=a+176|0;H=(((f[G>>2]|0)-(f[D>>2]|0)|0)/136|0)&255;b[h>>0]=H;I=f[(f[x>>2]|0)+44>>2]|0;J=I+16|0;K=f[J+4>>2]|0;if((K|0)>0|(K|0)==0&(f[J>>2]|0)>>>0>0)L=H;else{f[e>>2]=f[I+4>>2];f[d>>2]=f[e>>2];Me(I,d,h,h+1|0)|0;L=b[h>>0]|0}f[a+284>>2]=L&255;L=f[s>>2]|0;h=(f[L+4>>2]|0)-(f[L>>2]|0)|0;L=h>>2;dj(t);f[i>>2]=0;I=i+4|0;f[I>>2]=0;f[i+8>>2]=0;a:do if((h|0)>0){H=a+104|0;J=i+8|0;K=0;b:while(1){M=(K>>>0)/3|0;N=M>>>5;O=1<<(M&31);if((f[(f[v>>2]|0)+(N<<2)>>2]&O|0)==0?(P=f[s>>2]|0,f[j>>2]=M,f[d>>2]=f[j>>2],!(_j(P,d)|0)):0){f[e>>2]=0;f[k>>2]=M;f[d>>2]=f[k>>2];M=xg(a,d,e)|0;fj(t,M);P=f[e>>2]|0;Q=(P|0)==-1;do if(M){do if(Q){R=-1;S=-1;T=-1}else{U=f[f[s>>2]>>2]|0;V=f[U+(P<<2)>>2]|0;W=P+1|0;X=((W>>>0)%3|0|0)==0?P+-2|0:W;if((X|0)==-1)Y=-1;else Y=f[U+(X<<2)>>2]|0;X=(((P>>>0)%3|0|0)==0?2:-1)+P|0;if((X|0)==-1){R=-1;S=Y;T=V;break}R=f[U+(X<<2)>>2]|0;S=Y;T=V}while(0);V=f[C>>2]|0;X=V+(T>>>5<<2)|0;f[X>>2]=f[X>>2]|1<<(T&31);X=V+(S>>>5<<2)|0;f[X>>2]=f[X>>2]|1<<(S&31);X=V+(R>>>5<<2)|0;f[X>>2]=f[X>>2]|1<<(R&31);f[d>>2]=1;X=f[B>>2]|0;if(X>>>0<(f[H>>2]|0)>>>0){f[X>>2]=1;f[B>>2]=X+4}else Ri(A,d);X=(f[v>>2]|0)+(N<<2)|0;f[X>>2]=f[X>>2]|O;X=P+1|0;if(Q)Z=-1;else Z=((X>>>0)%3|0|0)==0?P+-2|0:X;f[d>>2]=Z;V=f[I>>2]|0;if(V>>>0<(f[J>>2]|0)>>>0){f[V>>2]=Z;f[I>>2]=V+4}else Ri(i,d);if(Q)break;V=((X>>>0)%3|0|0)==0?P+-2|0:X;if((V|0)==-1)break;X=f[(f[(f[s>>2]|0)+12>>2]|0)+(V<<2)>>2]|0;V=(X|0)==-1;U=V?-1:(X>>>0)/3|0;if(V)break;if(f[(f[v>>2]|0)+(U>>>5<<2)>>2]&1<<(U&31)|0)break;f[l>>2]=X;f[d>>2]=f[l>>2];if(!(Yb(a,d)|0))break b}else{X=P+1|0;if(Q)_=-1;else _=((X>>>0)%3|0|0)==0?P+-2|0:X;f[m>>2]=_;f[d>>2]=f[m>>2];Pe(a,d,1)|0;f[n>>2]=f[e>>2];f[d>>2]=f[n>>2];if(!(Yb(a,d)|0))break b}while(0)}K=K+1|0;if((K|0)>=(L|0)){$=62;break a}}aa=0}else $=62;while(0);if(($|0)==62){$=f[F>>2]|0;L=f[E>>2]|0;n=L;if(($|0)!=(L|0)?(m=L+-4|0,$>>>0>>0):0){L=$;$=m;do{m=f[L>>2]|0;f[L>>2]=f[$>>2];f[$>>2]=m;L=L+4|0;$=$+-4|0}while(L>>>0<$>>>0)}f[o>>2]=n;f[p>>2]=f[i>>2];f[q>>2]=f[I>>2];f[g>>2]=f[o>>2];f[e>>2]=f[p>>2];f[d>>2]=f[q>>2];Yd(F,g,e,d)|0;if((f[G>>2]|0)!=(f[D>>2]|0)?(D=f[y>>2]|0,y=((f[D+100>>2]|0)-(f[D+96>>2]|0)|0)/12|0,b[d>>0]=0,qh(v,y,d),y=f[F>>2]|0,F=f[E>>2]|0,(y|0)!=(F|0)):0){E=y;do{f[r>>2]=f[E>>2];f[d>>2]=f[r>>2];He(a,d)|0;E=E+4|0}while((E|0)!=(F|0))}pi(t);ci(f[a+324>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;ci(f[z>>2]|0,f[(f[x>>2]|0)+44>>2]|0)|0;if(bh(a)|0){z=f[(f[x>>2]|0)+44>>2]|0;x=f[a+232>>2]|0;t=z+16|0;F=f[t+4>>2]|0;if(!((F|0)>0|(F|0)==0&(f[t>>2]|0)>>>0>0)){t=(f[a+236>>2]|0)-x|0;f[e>>2]=f[z+4>>2];f[d>>2]=f[e>>2];Me(z,d,x,x+t|0)|0}aa=1}else aa=0}t=f[i>>2]|0;if(t|0){i=f[I>>2]|0;if((i|0)!=(t|0))f[I>>2]=i+(~((i+-4-t|0)>>>2)<<2);Oq(t)}w=aa;u=c;return w|0}function sb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=Oa,ma=Oa,na=Oa,oa=0,pa=0,qa=0,ra=0,sa=0;c=u;u=u+64|0;d=c+28|0;e=c+16|0;g=c+4|0;h=c;i=a;j=a+80|0;k=f[j>>2]|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=i;l=d+20|0;n[l>>2]=$(1.0);f[d+24>>2]=i;Ih(d,k);k=f[j>>2]|0;f[e>>2]=0;i=e+4|0;f[i>>2]=0;f[e+8>>2]=0;m=(k|0)==0;do if(!m)if(k>>>0>1073741823)aq(e);else{o=k<<2;p=ln(o)|0;f[e>>2]=p;q=p+(k<<2)|0;f[e+8>>2]=q;sj(p|0,0,o|0)|0;f[i>>2]=q;break}while(0);f[g>>2]=0;k=g+4|0;f[k>>2]=0;f[g+8>>2]=0;f[h>>2]=0;if(!m){m=d+16|0;q=d+4|0;o=d+12|0;p=d+8|0;r=g+8|0;s=d+24|0;t=0;v=0;while(1){w=f[m>>2]|0;x=f[w+8>>2]|0;y=(f[w+12>>2]|0)-x|0;w=(y|0)>0;z=x;if(w){x=y>>>2;A=0;B=0;while(1){C=f[z+(A<<2)>>2]|0;if(!(b[C+84>>0]|0))D=f[(f[C+68>>2]|0)+(v<<2)>>2]|0;else D=v;C=D+239^B;A=A+1|0;if((A|0)>=(x|0)){E=C;break}else B=C}}else E=0;B=f[q>>2]|0;x=(B|0)==0;a:do if(!x){A=B+-1|0;C=(A&B|0)==0;if(!C)if(E>>>0>>0)F=E;else F=(E>>>0)%(B>>>0)|0;else F=A&E;G=f[(f[d>>2]|0)+(F<<2)>>2]|0;if((G|0)!=0?(H=f[G>>2]|0,(H|0)!=0):0){G=f[s>>2]|0;I=G+8|0;J=G+12|0;b:do if(C){G=H;while(1){K=f[G+4>>2]|0;L=(K|0)==(E|0);if(!(L|(K&A|0)==(F|0))){M=44;break a}c:do if(L){K=f[G+8>>2]|0;N=f[I>>2]|0;O=(f[J>>2]|0)-N|0;P=N;if((O|0)<=0){Q=G;break b}N=O>>>2;O=0;while(1){R=f[P+(O<<2)>>2]|0;if(!(b[R+84>>0]|0)){S=f[R+68>>2]|0;T=f[S+(v<<2)>>2]|0;U=f[S+(K<<2)>>2]|0}else{T=v;U=K}O=O+1|0;if((U|0)!=(T|0))break c;if((O|0)>=(N|0)){V=G;M=42;break b}}}while(0);G=f[G>>2]|0;if(!G){M=44;break a}}}else{G=H;while(1){L=f[G+4>>2]|0;d:do if((L|0)!=(E|0)){if(L>>>0>>0)X=L;else X=(L>>>0)%(B>>>0)|0;if((X|0)!=(F|0)){M=44;break a}}else{N=f[G+8>>2]|0;O=f[I>>2]|0;K=(f[J>>2]|0)-O|0;P=O;if((K|0)<=0){Q=G;break b}O=K>>>2;K=0;while(1){S=f[P+(K<<2)>>2]|0;if(!(b[S+84>>0]|0)){R=f[S+68>>2]|0;Y=f[R+(v<<2)>>2]|0;Z=f[R+(N<<2)>>2]|0}else{Y=v;Z=N}K=K+1|0;if((Z|0)!=(Y|0))break d;if((K|0)>=(O|0)){V=G;M=42;break b}}}while(0);G=f[G>>2]|0;if(!G){M=44;break a}}}while(0);if((M|0)==42){M=0;if(!V){M=44;break}else Q=V}f[(f[e>>2]|0)+(v<<2)>>2]=f[Q+12>>2];_=t}else M=44}else M=44;while(0);do if((M|0)==44){M=0;if(w){J=y>>>2;I=0;H=0;while(1){A=f[z+(I<<2)>>2]|0;if(!(b[A+84>>0]|0))aa=f[(f[A+68>>2]|0)+(v<<2)>>2]|0;else aa=v;A=aa+239^H;I=I+1|0;if((I|0)>=(J|0)){ba=A;break}else H=A}}else ba=0;e:do if(!x){H=B+-1|0;J=(H&B|0)==0;if(!J)if(ba>>>0>>0)ca=ba;else ca=(ba>>>0)%(B>>>0)|0;else ca=H&ba;I=f[(f[d>>2]|0)+(ca<<2)>>2]|0;if((I|0)!=0?(A=f[I>>2]|0,(A|0)!=0):0){I=f[s>>2]|0;C=I+8|0;G=I+12|0;if(J){J=A;while(1){I=f[J+4>>2]|0;if(!((I|0)==(ba|0)|(I&H|0)==(ca|0))){da=ca;M=76;break e}I=f[J+8>>2]|0;L=f[C>>2]|0;O=(f[G>>2]|0)-L|0;K=L;if((O|0)<=0){ea=v;break e}L=O>>>2;O=0;while(1){N=f[K+(O<<2)>>2]|0;if(!(b[N+84>>0]|0)){P=f[N+68>>2]|0;fa=f[P+(v<<2)>>2]|0;ga=f[P+(I<<2)>>2]|0}else{fa=v;ga=I}O=O+1|0;if((ga|0)!=(fa|0))break;if((O|0)>=(L|0)){ea=v;break e}}J=f[J>>2]|0;if(!J){da=ca;M=76;break e}}}else ha=A;while(1){J=f[ha+4>>2]|0;if((J|0)!=(ba|0)){if(J>>>0>>0)ia=J;else ia=(J>>>0)%(B>>>0)|0;if((ia|0)!=(ca|0)){da=ca;M=76;break e}}J=f[ha+8>>2]|0;H=f[C>>2]|0;L=(f[G>>2]|0)-H|0;O=H;if((L|0)<=0){ea=v;break e}H=L>>>2;L=0;while(1){I=f[O+(L<<2)>>2]|0;if(!(b[I+84>>0]|0)){K=f[I+68>>2]|0;ja=f[K+(v<<2)>>2]|0;ka=f[K+(J<<2)>>2]|0}else{ja=v;ka=J}L=L+1|0;if((ka|0)!=(ja|0))break;if((L|0)>=(H|0)){ea=v;break e}}ha=f[ha>>2]|0;if(!ha){da=ca;M=76;break}}}else{da=ca;M=76}}else{da=0;M=76}while(0);if((M|0)==76){M=0;G=ln(16)|0;f[G+8>>2]=v;f[G+12>>2]=t;f[G+4>>2]=ba;f[G>>2]=0;la=$(((f[o>>2]|0)+1|0)>>>0);ma=$(B>>>0);na=$(n[l>>2]);do if(x|$(na*ma)>>0<3|(B+-1&B|0)!=0)&1;A=~~$(W($(la/na)))>>>0;Ih(d,C>>>0>>0?A:C);C=f[q>>2]|0;A=C+-1|0;if(!(A&C)){oa=C;pa=A&ba;break}if(ba>>>0>>0){oa=C;pa=ba}else{oa=C;pa=(ba>>>0)%(C>>>0)|0}}else{oa=B;pa=da}while(0);C=(f[d>>2]|0)+(pa<<2)|0;A=f[C>>2]|0;if(!A){f[G>>2]=f[p>>2];f[p>>2]=G;f[C>>2]=p;C=f[G>>2]|0;if(C|0){H=f[C+4>>2]|0;C=oa+-1|0;if(C&oa)if(H>>>0>>0)qa=H;else qa=(H>>>0)%(oa>>>0)|0;else qa=H&C;ra=(f[d>>2]|0)+(qa<<2)|0;M=89}}else{f[G>>2]=f[A>>2];ra=A;M=89}if((M|0)==89){M=0;f[ra>>2]=G}f[o>>2]=(f[o>>2]|0)+1;ea=f[h>>2]|0}A=t+1|0;f[(f[e>>2]|0)+(ea<<2)>>2]=t;C=f[k>>2]|0;if((C|0)==(f[r>>2]|0)){Ri(g,h);_=A;break}else{f[C>>2]=f[h>>2];f[k>>2]=C+4;_=A;break}}while(0);v=(f[h>>2]|0)+1|0;f[h>>2]=v;sa=f[j>>2]|0;if(v>>>0>=sa>>>0)break;else t=_}if((_|0)!=(sa|0)){Xa[f[(f[a>>2]|0)+24>>2]&15](a,e,g);f[j>>2]=_}}_=f[g>>2]|0;if(_|0){g=f[k>>2]|0;if((g|0)!=(_|0))f[k>>2]=g+(~((g+-4-_|0)>>>2)<<2);Oq(_)}_=f[e>>2]|0;if(_|0){e=f[i>>2]|0;if((e|0)!=(_|0))f[i>>2]=e+(~((e+-4-_|0)>>>2)<<2);Oq(_)}_=f[d+8>>2]|0;if(_|0){e=_;do{_=e;e=f[e>>2]|0;Oq(_)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(!e){u=c;return}Oq(e);u=c;return}function tb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;c=(((n>>>0)%3|0|0)==0?2:-1)+n|0;if((o|0)==-1)p=-1;else p=f[(f[f[m>>2]>>2]|0)+(o<<2)>>2]|0;if((c|0)==-1){q=p;r=-1}else{q=p;r=f[(f[f[m>>2]>>2]|0)+(c<<2)>>2]|0}}else{q=-1;r=-1}c=f[a+36>>2]|0;m=f[c>>2]|0;p=(f[c+4>>2]|0)-m>>2;if(p>>>0<=q>>>0)aq(c);o=m;m=f[o+(q<<2)>>2]|0;if(p>>>0<=r>>>0)aq(c);c=f[o+(r<<2)>>2]|0;r=(m|0)<(e|0);do if(r&(c|0)<(e|0)){o=m<<1;p=f[d+(o<<2)>>2]|0;q=((p|0)<0)<<31>>31;n=f[d+((o|1)<<2)>>2]|0;o=((n|0)<0)<<31>>31;s=c<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(p|0)|(v|0)!=(n|0))){f[a+8>>2]=p;f[a+12>>2]=n;u=g;return}s=a+4|0;w=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))y=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else y=w;f[i>>2]=y;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];vb(x,h,w,j)|0;w=f[(f[s>>2]|0)+(m<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))z=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else z=w;f[i>>2]=z;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];vb(x,h,w,k)|0;w=f[(f[s>>2]|0)+(c<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))A=f[(f[s+68>>2]|0)+(w<<2)>>2]|0;else A=w;f[i>>2]=A;w=b[s+24>>0]|0;f[h>>2]=f[i>>2];vb(s,h,w,l)|0;w=l;s=k;x=f[s>>2]|0;B=f[s+4>>2]|0;s=Xn(f[w>>2]|0,f[w+4>>2]|0,x|0,B|0)|0;w=I;C=l+8|0;D=k+8|0;E=f[D>>2]|0;F=f[D+4>>2]|0;D=Xn(f[C>>2]|0,f[C+4>>2]|0,E|0,F|0)|0;C=I;G=l+16|0;H=k+16|0;J=f[H>>2]|0;K=f[H+4>>2]|0;H=Xn(f[G>>2]|0,f[G+4>>2]|0,J|0,K|0)|0;G=I;L=un(s|0,w|0,s|0,w|0)|0;M=I;N=un(D|0,C|0,D|0,C|0)|0;O=Vn(N|0,I|0,L|0,M|0)|0;M=I;L=un(H|0,G|0,H|0,G|0)|0;N=Vn(O|0,M|0,L|0,I|0)|0;L=I;if((N|0)==0&(L|0)==0)break;M=j;O=Xn(f[M>>2]|0,f[M+4>>2]|0,x|0,B|0)|0;B=I;x=j+8|0;M=Xn(f[x>>2]|0,f[x+4>>2]|0,E|0,F|0)|0;F=I;E=j+16|0;x=Xn(f[E>>2]|0,f[E+4>>2]|0,J|0,K|0)|0;K=I;J=un(O|0,B|0,s|0,w|0)|0;E=I;P=un(M|0,F|0,D|0,C|0)|0;Q=Vn(P|0,I|0,J|0,E|0)|0;E=I;J=un(x|0,K|0,H|0,G|0)|0;P=Vn(Q|0,E|0,J|0,I|0)|0;J=I;E=Xn(t|0,((t|0)<0)<<31>>31|0,p|0,q|0)|0;t=I;Q=Xn(v|0,((v|0)<0)<<31>>31|0,n|0,o|0)|0;v=I;R=un(N|0,L|0,p|0,q|0)|0;q=I;p=un(N|0,L|0,n|0,o|0)|0;o=I;n=un(P|0,J|0,E|0,t|0)|0;S=I;T=un(P|0,J|0,Q|0,v|0)|0;U=I;V=Vn(n|0,S|0,R|0,q|0)|0;q=I;R=Vn(T|0,U|0,p|0,o|0)|0;o=I;p=un(P|0,J|0,s|0,w|0)|0;w=I;s=un(P|0,J|0,D|0,C|0)|0;C=I;D=un(P|0,J|0,H|0,G|0)|0;G=I;H=Ik(p|0,w|0,N|0,L|0)|0;w=I;p=Ik(s|0,C|0,N|0,L|0)|0;C=I;s=Ik(D|0,G|0,N|0,L|0)|0;G=I;D=Xn(O|0,B|0,H|0,w|0)|0;w=I;H=Xn(M|0,F|0,p|0,C|0)|0;C=I;p=Xn(x|0,K|0,s|0,G|0)|0;G=I;s=un(D|0,w|0,D|0,w|0)|0;w=I;D=un(H|0,C|0,H|0,C|0)|0;C=Vn(D|0,I|0,s|0,w|0)|0;w=I;s=un(p|0,G|0,p|0,G|0)|0;G=Vn(C|0,w|0,s|0,I|0)|0;s=I;w=Xn(0,0,E|0,t|0)|0;t=I;E=un(G|0,s|0,N|0,L|0)|0;s=I;switch(E|0){case 0:{if(!s){W=0;X=0}else{Y=1;Z=0;_=E;$=s;aa=23}break}case 1:{if(!s){ba=1;ca=0;aa=24}else{Y=1;Z=0;_=E;$=s;aa=23}break}default:{Y=1;Z=0;_=E;$=s;aa=23}}if((aa|0)==23)while(1){aa=0;G=Tn(Y|0,Z|0,1)|0;C=I;p=_;_=Yn(_|0,$|0,2)|0;if(!($>>>0>0|($|0)==0&p>>>0>7)){ba=G;ca=C;aa=24;break}else{Y=G;Z=C;$=I;aa=23}}if((aa|0)==24)while(1){aa=0;C=jp(E|0,s|0,ba|0,ca|0)|0;G=Vn(C|0,I|0,ba|0,ca|0)|0;C=Yn(G|0,I|0,1)|0;G=I;p=un(C|0,G|0,C|0,G|0)|0;D=I;if(D>>>0>s>>>0|(D|0)==(s|0)&p>>>0>E>>>0){ba=C;ca=G;aa=24}else{W=C;X=G;break}}E=un(W|0,X|0,Q|0,v|0)|0;s=I;G=un(W|0,X|0,w|0,t|0)|0;C=I;p=Vn(E|0,s|0,V|0,q|0)|0;D=I;H=Vn(G|0,C|0,R|0,o|0)|0;K=I;x=Ik(p|0,D|0,N|0,L|0)|0;D=I;p=Ik(H|0,K|0,N|0,L|0)|0;K=I;H=Xn(V|0,q|0,E|0,s|0)|0;s=I;E=Xn(R|0,o|0,G|0,C|0)|0;C=I;G=Ik(H|0,s|0,N|0,L|0)|0;s=I;H=Ik(E|0,C|0,N|0,L|0)|0;C=I;E=e<<1;F=f[d+(E<<2)>>2]|0;M=((F|0)<0)<<31>>31;B=f[d+((E|1)<<2)>>2]|0;E=((B|0)<0)<<31>>31;O=Xn(F|0,M|0,x|0,D|0)|0;J=I;P=Xn(B|0,E|0,p|0,K|0)|0;U=I;T=un(O|0,J|0,O|0,J|0)|0;J=I;O=un(P|0,U|0,P|0,U|0)|0;U=Vn(O|0,I|0,T|0,J|0)|0;J=I;T=Xn(F|0,M|0,G|0,s|0)|0;M=I;F=Xn(B|0,E|0,H|0,C|0)|0;E=I;B=un(T|0,M|0,T|0,M|0)|0;M=I;T=un(F|0,E|0,F|0,E|0)|0;E=Vn(T|0,I|0,B|0,M|0)|0;M=I;B=a+16|0;T=a+20|0;F=f[T>>2]|0;O=f[a+24>>2]|0;P=(F|0)==(O<<5|0);if(J>>>0>>0|(J|0)==(M|0)&U>>>0>>0){do if(P)if((F+1|0)<0)aq(B);else{E=O<<6;U=F+32&-32;vi(B,F>>>0<1073741823?(E>>>0>>0?U:E):2147483647);da=f[T>>2]|0;break}else da=F;while(0);f[T>>2]=da+1;L=(f[B>>2]|0)+(da>>>5<<2)|0;f[L>>2]=f[L>>2]|1<<(da&31);ea=x;fa=p;ga=K;ha=D}else{do if(P)if((F+1|0)<0)aq(B);else{L=O<<6;N=F+32&-32;vi(B,F>>>0<1073741823?(L>>>0>>0?N:L):2147483647);ia=f[T>>2]|0;break}else ia=F;while(0);f[T>>2]=ia+1;F=(f[B>>2]|0)+(ia>>>5<<2)|0;f[F>>2]=f[F>>2]&~(1<<(ia&31));ea=G;fa=H;ga=C;ha=s}f[a+8>>2]=ea;f[a+12>>2]=fa;u=g;return}while(0);do if(r)ja=m<<1;else{if((e|0)>0){ja=(e<<1)+-2|0;break}fa=a+8|0;f[fa>>2]=0;f[fa+4>>2]=0;u=g;return}while(0);f[a+8>>2]=f[d+(ja<<2)>>2];f[a+12>>2]=f[d+(ja+1<<2)>>2];u=g;return}function ub(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;g=u;u=u+80|0;h=g+76|0;i=g+72|0;j=g+48|0;k=g+24|0;l=g;m=a+32|0;n=f[c>>2]|0;c=n+1|0;do if((n|0)!=-1){o=((c>>>0)%3|0|0)==0?n+-2|0:c;if(!((n>>>0)%3|0)){p=n+2|0;q=o;break}else{p=n+-1|0;q=o;break}}else{p=-1;q=-1}while(0);n=f[(f[m>>2]|0)+28>>2]|0;m=f[n+(q<<2)>>2]|0;q=f[n+(p<<2)>>2]|0;p=f[a+36>>2]|0;n=f[p>>2]|0;c=(f[p+4>>2]|0)-n>>2;if(c>>>0<=m>>>0)aq(p);o=n;n=f[o+(m<<2)>>2]|0;if(c>>>0<=q>>>0)aq(p);p=f[o+(q<<2)>>2]|0;q=(n|0)<(e|0);do if(q&(p|0)<(e|0)){o=n<<1;c=f[d+(o<<2)>>2]|0;m=((c|0)<0)<<31>>31;r=f[d+((o|1)<<2)>>2]|0;o=((r|0)<0)<<31>>31;s=p<<1;t=f[d+(s<<2)>>2]|0;v=f[d+((s|1)<<2)>>2]|0;if(!((t|0)!=(c|0)|(v|0)!=(r|0))){f[a+8>>2]=c;f[a+12>>2]=r;u=g;return}s=a+4|0;w=f[(f[s>>2]|0)+(e<<2)>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))y=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else y=w;f[i>>2]=y;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];vb(x,h,w,j)|0;w=f[(f[s>>2]|0)+(n<<2)>>2]|0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;x=f[a>>2]|0;if(!(b[x+84>>0]|0))z=f[(f[x+68>>2]|0)+(w<<2)>>2]|0;else z=w;f[i>>2]=z;w=b[x+24>>0]|0;f[h>>2]=f[i>>2];vb(x,h,w,k)|0;w=f[(f[s>>2]|0)+(p<<2)>>2]|0;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;s=f[a>>2]|0;if(!(b[s+84>>0]|0))A=f[(f[s+68>>2]|0)+(w<<2)>>2]|0;else A=w;f[i>>2]=A;w=b[s+24>>0]|0;f[h>>2]=f[i>>2];vb(s,h,w,l)|0;w=l;s=k;x=f[s>>2]|0;B=f[s+4>>2]|0;s=Xn(f[w>>2]|0,f[w+4>>2]|0,x|0,B|0)|0;w=I;C=l+8|0;D=k+8|0;E=f[D>>2]|0;F=f[D+4>>2]|0;D=Xn(f[C>>2]|0,f[C+4>>2]|0,E|0,F|0)|0;C=I;G=l+16|0;H=k+16|0;J=f[H>>2]|0;K=f[H+4>>2]|0;H=Xn(f[G>>2]|0,f[G+4>>2]|0,J|0,K|0)|0;G=I;L=un(s|0,w|0,s|0,w|0)|0;M=I;N=un(D|0,C|0,D|0,C|0)|0;O=Vn(N|0,I|0,L|0,M|0)|0;M=I;L=un(H|0,G|0,H|0,G|0)|0;N=Vn(O|0,M|0,L|0,I|0)|0;L=I;if((N|0)==0&(L|0)==0)break;M=j;O=Xn(f[M>>2]|0,f[M+4>>2]|0,x|0,B|0)|0;B=I;x=j+8|0;M=Xn(f[x>>2]|0,f[x+4>>2]|0,E|0,F|0)|0;F=I;E=j+16|0;x=Xn(f[E>>2]|0,f[E+4>>2]|0,J|0,K|0)|0;K=I;J=un(O|0,B|0,s|0,w|0)|0;E=I;P=un(M|0,F|0,D|0,C|0)|0;Q=Vn(P|0,I|0,J|0,E|0)|0;E=I;J=un(x|0,K|0,H|0,G|0)|0;P=Vn(Q|0,E|0,J|0,I|0)|0;J=I;E=Xn(t|0,((t|0)<0)<<31>>31|0,c|0,m|0)|0;t=I;Q=Xn(v|0,((v|0)<0)<<31>>31|0,r|0,o|0)|0;v=I;R=un(N|0,L|0,c|0,m|0)|0;m=I;c=un(N|0,L|0,r|0,o|0)|0;o=I;r=un(P|0,J|0,E|0,t|0)|0;S=I;T=un(P|0,J|0,Q|0,v|0)|0;U=I;V=Vn(r|0,S|0,R|0,m|0)|0;m=I;R=Vn(T|0,U|0,c|0,o|0)|0;o=I;c=un(P|0,J|0,s|0,w|0)|0;w=I;s=un(P|0,J|0,D|0,C|0)|0;C=I;D=un(P|0,J|0,H|0,G|0)|0;G=I;H=Ik(c|0,w|0,N|0,L|0)|0;w=I;c=Ik(s|0,C|0,N|0,L|0)|0;C=I;s=Ik(D|0,G|0,N|0,L|0)|0;G=I;D=Xn(O|0,B|0,H|0,w|0)|0;w=I;H=Xn(M|0,F|0,c|0,C|0)|0;C=I;c=Xn(x|0,K|0,s|0,G|0)|0;G=I;s=un(D|0,w|0,D|0,w|0)|0;w=I;D=un(H|0,C|0,H|0,C|0)|0;C=Vn(D|0,I|0,s|0,w|0)|0;w=I;s=un(c|0,G|0,c|0,G|0)|0;G=Vn(C|0,w|0,s|0,I|0)|0;s=I;w=Xn(0,0,E|0,t|0)|0;t=I;E=un(G|0,s|0,N|0,L|0)|0;s=I;switch(E|0){case 0:{if(!s){W=0;X=0}else{Y=1;Z=0;_=E;$=s;aa=22}break}case 1:{if(!s){ba=1;ca=0;aa=23}else{Y=1;Z=0;_=E;$=s;aa=22}break}default:{Y=1;Z=0;_=E;$=s;aa=22}}if((aa|0)==22)while(1){aa=0;G=Tn(Y|0,Z|0,1)|0;C=I;c=_;_=Yn(_|0,$|0,2)|0;if(!($>>>0>0|($|0)==0&c>>>0>7)){ba=G;ca=C;aa=23;break}else{Y=G;Z=C;$=I;aa=22}}if((aa|0)==23)while(1){aa=0;C=jp(E|0,s|0,ba|0,ca|0)|0;G=Vn(C|0,I|0,ba|0,ca|0)|0;C=Yn(G|0,I|0,1)|0;G=I;c=un(C|0,G|0,C|0,G|0)|0;D=I;if(D>>>0>s>>>0|(D|0)==(s|0)&c>>>0>E>>>0){ba=C;ca=G;aa=23}else{W=C;X=G;break}}E=un(W|0,X|0,Q|0,v|0)|0;s=I;G=un(W|0,X|0,w|0,t|0)|0;C=I;c=Vn(E|0,s|0,V|0,m|0)|0;D=I;H=Vn(G|0,C|0,R|0,o|0)|0;K=I;x=Ik(c|0,D|0,N|0,L|0)|0;D=I;c=Ik(H|0,K|0,N|0,L|0)|0;K=I;H=Xn(V|0,m|0,E|0,s|0)|0;s=I;E=Xn(R|0,o|0,G|0,C|0)|0;C=I;G=Ik(H|0,s|0,N|0,L|0)|0;s=I;H=Ik(E|0,C|0,N|0,L|0)|0;C=I;E=e<<1;F=f[d+(E<<2)>>2]|0;M=((F|0)<0)<<31>>31;B=f[d+((E|1)<<2)>>2]|0;E=((B|0)<0)<<31>>31;O=Xn(F|0,M|0,x|0,D|0)|0;J=I;P=Xn(B|0,E|0,c|0,K|0)|0;U=I;T=un(O|0,J|0,O|0,J|0)|0;J=I;O=un(P|0,U|0,P|0,U|0)|0;U=Vn(O|0,I|0,T|0,J|0)|0;J=I;T=Xn(F|0,M|0,G|0,s|0)|0;M=I;F=Xn(B|0,E|0,H|0,C|0)|0;E=I;B=un(T|0,M|0,T|0,M|0)|0;M=I;T=un(F|0,E|0,F|0,E|0)|0;E=Vn(T|0,I|0,B|0,M|0)|0;M=I;B=a+16|0;T=a+20|0;F=f[T>>2]|0;O=f[a+24>>2]|0;P=(F|0)==(O<<5|0);if(J>>>0>>0|(J|0)==(M|0)&U>>>0>>0){do if(P)if((F+1|0)<0)aq(B);else{E=O<<6;U=F+32&-32;vi(B,F>>>0<1073741823?(E>>>0>>0?U:E):2147483647);da=f[T>>2]|0;break}else da=F;while(0);f[T>>2]=da+1;L=(f[B>>2]|0)+(da>>>5<<2)|0;f[L>>2]=f[L>>2]|1<<(da&31);ea=x;fa=c;ga=K;ha=D}else{do if(P)if((F+1|0)<0)aq(B);else{L=O<<6;N=F+32&-32;vi(B,F>>>0<1073741823?(L>>>0>>0?N:L):2147483647);ia=f[T>>2]|0;break}else ia=F;while(0);f[T>>2]=ia+1;F=(f[B>>2]|0)+(ia>>>5<<2)|0;f[F>>2]=f[F>>2]&~(1<<(ia&31));ea=G;fa=H;ga=C;ha=s}f[a+8>>2]=ea;f[a+12>>2]=fa;u=g;return}while(0);do if(q)ja=n<<1;else{if((e|0)>0){ja=(e<<1)+-2|0;break}fa=a+8|0;f[fa>>2]=0;f[fa+4>>2]=0;u=g;return}while(0);f[a+8>>2]=f[d+(ja<<2)>>2];f[a+12>>2]=f[d+(ja+1<<2)>>2];u=g;return}function vb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=Oa,D=0,E=0.0,F=0,G=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){m=b[o>>0]|0;q=g+(r<<3)|0;f[q>>2]=m;f[q+4>>2]=((m|0)<0)<<31>>31;r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=g+(t<<3)|0;f[k>>2]=h[m>>0];f[k+4>>2]=0;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){o=d[l>>1]|0;k=g+(q<<3)|0;f[k>>2]=o;f[k+4>>2]=((o|0)<0)<<31>>31;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=j[r>>1];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<3)|0,0,(e<<24>>24)-r<<3|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=un(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Vn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){l=f[t>>2]|0;m=g+(o<<3)|0;f[m>>2]=l;f[m+4>>2]=((l|0)<0)<<31>>31;o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(t<<3)|0,0,(e<<24>>24)-t<<3|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=un(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Vn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){r=g+(m<<3)|0;f[r>>2]=f[q>>2];f[r+4>>2]=0;m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(q<<3)|0,0,(e<<24>>24)-q<<3|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=un(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Vn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){t=k;r=f[t+4>>2]|0;z=g+(l<<3)|0;f[z>>2]=f[t>>2];f[z+4>>2]=r;l=l+1|0;r=b[q>>0]|0;if((l|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){A=r;break}else k=k+8|0}}else A=m;k=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(k<<3)|0,0,(e<<24>>24)-k<<3|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;r=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;z=Vn(r|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+z|0;z=0;while(1){q=o;r=f[q+4>>2]|0;t=g+(z<<3)|0;f[t>>2]=f[q>>2];f[t+4>>2]=r;z=z+1|0;r=b[k>>0]|0;if((z|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){B=r;break}else o=o+8|0}}else B=l;o=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<3)|0,0,(e<<24>>24)-o<<3|0)|0;i=1;return i|0}case 9:{o=a+24|0;z=b[o>>0]|0;if((z<<24>>24>e<<24>>24?e:z)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;r=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(r|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){C=$(n[m>>2]);k=+K(+C)>=1.0?(+C>0.0?~~+Y(+J(+C/4294967296.0),4294967295.0)>>>0:~~+W((+C-+(~~+C>>>0))/4294967296.0)>>>0):0;r=g+(t<<3)|0;f[r>>2]=~~+C>>>0;f[r+4>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){D=k;break}else m=m+4|0}}else D=z;m=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<3)|0,0,(e<<24>>24)-m<<3|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;r=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+r|0;r=0;while(1){E=+p[l>>3];o=+K(E)>=1.0?(E>0.0?~~+Y(+J(E/4294967296.0),4294967295.0)>>>0:~~+W((E-+(~~E>>>0))/4294967296.0)>>>0):0;k=g+(r<<3)|0;f[k>>2]=~~E>>>0;f[k+4>>2]=o;r=r+1|0;o=b[m>>0]|0;if((r|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){F=o;break}else l=l+8|0}}else F=t;l=F<<24>>24;if(F<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<3)|0,0,(e<<24>>24)-l<<3|0)|0;i=1;return i|0}case 11:{l=a+24|0;r=b[l>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){m=f[f[a>>2]>>2]|0;z=a+40|0;o=un(f[z>>2]|0,f[z+4>>2]|0,f[c>>2]|0,0)|0;z=a+48|0;k=Vn(o|0,I|0,f[z>>2]|0,f[z+4>>2]|0)|0;z=m+k|0;k=0;while(1){m=g+(k<<3)|0;f[m>>2]=h[z>>0];f[m+4>>2]=0;k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){G=m;break}else z=z+1|0}}else G=r;z=G<<24>>24;if(G<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(z<<3)|0,0,(e<<24>>24)-z<<3|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function wb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;c=u;u=u+16|0;d=c+8|0;e=c;if((f[a+96>>2]|0)==(f[a+92>>2]|0)){u=c;return}g=a+56|0;h=f[g>>2]|0;if((h|0)==(f[a+60>>2]|0)){Ri(a+52|0,b);i=b}else{f[h>>2]=f[b>>2];f[g>>2]=h+4;i=b}b=a+88|0;f[b>>2]=0;h=f[a>>2]|0;g=f[i>>2]|0;j=g+1|0;if((g|0)!=-1){k=((j>>>0)%3|0|0)==0?g+-2|0:j;if((k|0)==-1)l=-1;else l=f[(f[h>>2]|0)+(k<<2)>>2]|0;k=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((k|0)==-1){m=l;n=-1}else{m=l;n=f[(f[h>>2]|0)+(k<<2)>>2]|0}}else{m=-1;n=-1}k=a+24|0;h=f[k>>2]|0;l=h+(m>>>5<<2)|0;g=1<<(m&31);j=f[l>>2]|0;if(!(j&g)){f[l>>2]=j|g;g=f[i>>2]|0;j=g+1|0;if((g|0)==-1)o=-1;else o=((j>>>0)%3|0|0)==0?g+-2|0:j;f[e>>2]=o;j=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((o>>>0)/3|0)*12|0)+(((o>>>0)%3|0)<<2)>>2]|0;o=f[a+48>>2]|0;f[d>>2]=j;g=f[o+4>>2]|0;o=g+4|0;l=f[o>>2]|0;if((l|0)==(f[g+8>>2]|0))Ri(g,d);else{f[l>>2]=j;f[o>>2]=l+4}l=a+40|0;o=f[l>>2]|0;j=o+4|0;g=f[j>>2]|0;if((g|0)==(f[o+8>>2]|0)){Ri(o,e);p=f[l>>2]|0}else{f[g>>2]=f[e>>2];f[j>>2]=g+4;p=o}o=p+24|0;f[(f[p+12>>2]|0)+(m<<2)>>2]=f[o>>2];f[o>>2]=(f[o>>2]|0)+1;q=f[k>>2]|0}else q=h;h=q+(n>>>5<<2)|0;q=1<<(n&31);o=f[h>>2]|0;if(!(o&q)){f[h>>2]=o|q;q=f[i>>2]|0;do if((q|0)!=-1)if(!((q>>>0)%3|0)){r=q+2|0;break}else{r=q+-1|0;break}else r=-1;while(0);f[e>>2]=r;q=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((r>>>0)/3|0)*12|0)+(((r>>>0)%3|0)<<2)>>2]|0;r=f[a+48>>2]|0;f[d>>2]=q;o=f[r+4>>2]|0;r=o+4|0;h=f[r>>2]|0;if((h|0)==(f[o+8>>2]|0))Ri(o,d);else{f[h>>2]=q;f[r>>2]=h+4}h=a+40|0;r=f[h>>2]|0;q=r+4|0;o=f[q>>2]|0;if((o|0)==(f[r+8>>2]|0)){Ri(r,e);s=f[h>>2]|0}else{f[o>>2]=f[e>>2];f[q>>2]=o+4;s=r}r=s+24|0;f[(f[s+12>>2]|0)+(n<<2)>>2]=f[r>>2];f[r>>2]=(f[r>>2]|0)+1}r=f[i>>2]|0;if((r|0)==-1)t=-1;else t=f[(f[f[a>>2]>>2]|0)+(r<<2)>>2]|0;r=(f[k>>2]|0)+(t>>>5<<2)|0;n=1<<(t&31);s=f[r>>2]|0;if(!(n&s)){f[r>>2]=s|n;n=f[i>>2]|0;f[e>>2]=n;s=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((n>>>0)/3|0)*12|0)+(((n>>>0)%3|0)<<2)>>2]|0;n=f[a+48>>2]|0;f[d>>2]=s;r=f[n+4>>2]|0;n=r+4|0;o=f[n>>2]|0;if((o|0)==(f[r+8>>2]|0))Ri(r,d);else{f[o>>2]=s;f[n>>2]=o+4}o=a+40|0;n=f[o>>2]|0;s=n+4|0;r=f[s>>2]|0;if((r|0)==(f[n+8>>2]|0)){Ri(n,e);v=f[o>>2]|0}else{f[r>>2]=f[e>>2];f[s>>2]=r+4;v=n}n=v+24|0;f[(f[v+12>>2]|0)+(t<<2)>>2]=f[n>>2];f[n>>2]=(f[n>>2]|0)+1}n=f[b>>2]|0;a:do if((n|0)<3){t=a+12|0;v=a+44|0;r=a+48|0;s=a+40|0;o=a+92|0;q=n;while(1){h=q;while(1){w=a+52+(h*12|0)+4|0;x=f[w>>2]|0;if((f[a+52+(h*12|0)>>2]|0)!=(x|0))break;if((h|0)<2)h=h+1|0;else break a}m=x+-4|0;p=f[m>>2]|0;f[w>>2]=m;f[b>>2]=h;f[i>>2]=p;if((p|0)==-1)break;m=(p>>>0)/3|0;g=f[t>>2]|0;do if(!(f[g+(m>>>5<<2)>>2]&1<<(m&31))){j=p;l=g;b:while(1){y=(j>>>0)/3|0;z=l+(y>>>5<<2)|0;f[z>>2]=1<<(y&31)|f[z>>2];z=f[i>>2]|0;if((z|0)==-1)A=-1;else A=f[(f[f[a>>2]>>2]|0)+(z<<2)>>2]|0;y=(f[k>>2]|0)+(A>>>5<<2)|0;B=1<<(A&31);C=f[y>>2]|0;if(!(B&C)){f[y>>2]=C|B;B=f[i>>2]|0;f[e>>2]=B;C=f[(f[(f[v>>2]|0)+96>>2]|0)+(((B>>>0)/3|0)*12|0)+(((B>>>0)%3|0)<<2)>>2]|0;B=f[r>>2]|0;f[d>>2]=C;y=f[B+4>>2]|0;B=y+4|0;D=f[B>>2]|0;if((D|0)==(f[y+8>>2]|0))Ri(y,d);else{f[D>>2]=C;f[B>>2]=D+4}D=f[s>>2]|0;B=D+4|0;C=f[B>>2]|0;if((C|0)==(f[D+8>>2]|0)){Ri(D,e);E=f[s>>2]|0}else{f[C>>2]=f[e>>2];f[B>>2]=C+4;E=D}D=E+24|0;f[(f[E+12>>2]|0)+(A<<2)>>2]=f[D>>2];f[D>>2]=(f[D>>2]|0)+1;F=f[i>>2]|0}else F=z;z=f[a>>2]|0;if((F|0)==-1){G=93;break}D=F+1|0;C=((D>>>0)%3|0|0)==0?F+-2|0:D;if((C|0)==-1)H=-1;else H=f[(f[z+12>>2]|0)+(C<<2)>>2]|0;C=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((C|0)==-1)I=-1;else I=f[(f[z+12>>2]|0)+(C<<2)>>2]|0;C=(H|0)==-1;D=C?-1:(H>>>0)/3|0;B=(I|0)==-1;y=B?-1:(I>>>0)/3|0;if(C)J=1;else J=(f[(f[t>>2]|0)+(D>>>5<<2)>>2]&1<<(D&31)|0)!=0;do if(B)if(J){G=93;break b}else G=82;else{if(f[(f[t>>2]|0)+(y>>>5<<2)>>2]&1<<(y&31)|0)if(J){G=93;break b}else{G=82;break}D=f[(f[z>>2]|0)+(I<<2)>>2]|0;if(!(1<<(D&31)&f[(f[k>>2]|0)+(D>>>5<<2)>>2])){K=(f[o>>2]|0)+(D<<2)|0;D=f[K>>2]|0;f[K>>2]=D+1;L=(D|0)>0?1:2}else L=0;if(J?(L|0)<=(f[b>>2]|0):0){M=I;break}f[d>>2]=I;D=a+52+(L*12|0)+4|0;K=f[D>>2]|0;if((K|0)==(f[a+52+(L*12|0)+8>>2]|0))Ri(a+52+(L*12|0)|0,d);else{f[K>>2]=I;f[D>>2]=K+4}if((f[b>>2]|0)>(L|0))f[b>>2]=L;if(J){G=93;break b}else G=82}while(0);if((G|0)==82){G=0;if(C)N=-1;else N=f[(f[f[a>>2]>>2]|0)+(H<<2)>>2]|0;if(!(1<<(N&31)&f[(f[k>>2]|0)+(N>>>5<<2)>>2])){z=(f[o>>2]|0)+(N<<2)|0;y=f[z>>2]|0;f[z>>2]=y+1;O=(y|0)>0?1:2}else O=0;if((O|0)>(f[b>>2]|0))break;else M=H}f[i>>2]=M;j=M;l=f[t>>2]|0}if((G|0)==93){G=0;P=f[b>>2]|0;break}f[d>>2]=H;l=a+52+(O*12|0)+4|0;j=f[l>>2]|0;if((j|0)==(f[a+52+(O*12|0)+8>>2]|0))Ri(a+52+(O*12|0)|0,d);else{f[j>>2]=H;f[l>>2]=j+4}j=f[b>>2]|0;if((j|0)>(O|0)){f[b>>2]=O;Q=O}else Q=j;P=Q}else P=h;while(0);if((P|0)<3)q=P;else break a}u=c;return}while(0);f[i>>2]=-1;u=c;return}function xb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}xb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;xb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function yb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}yb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;yb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function zb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}zb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;zb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Ab(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ab(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ab(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}} function Bb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Bb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Bb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Cb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Cb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Cb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Db(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Db(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Db(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Eb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Eb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Eb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Fb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Fb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Fb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Gb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Gb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Gb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Hb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Hb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ib(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ib(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Jb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Jb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Jb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Kb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Kb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Lb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Lb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Mb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Mb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Nb(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Nb(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Ob(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;d=a;a=b;a:while(1){b=a;e=a+-4|0;g=d;while(1){h=g;b:while(1){i=h;j=b-i|0;k=j>>2;switch(k|0){case 2:{l=5;break a;break}case 3:{l=11;break a;break}case 4:{l=12;break a;break}case 5:{l=13;break a;break}case 1:case 0:{l=84;break a;break}default:{}}if((j|0)<124){l=15;break a}m=h+(((k|0)/2|0)<<2)|0;if((j|0)>3996){j=(k|0)/4|0;n=ig(h,h+(j<<2)|0,m,m+(j<<2)|0,e,c)|0}else n=Vg(h,m,e,c)|0;o=f[h>>2]|0;j=f[m>>2]|0;p=f[c>>2]|0;k=f[p>>2]|0;q=(f[p+4>>2]|0)-k>>3;if(q>>>0<=o>>>0){l=20;break a}r=k;if(q>>>0<=j>>>0){l=22;break a}k=f[r+(o<<3)>>2]|0;s=f[r+(j<<3)>>2]|0;if(k>>>0>>0){t=e;u=n;break}else v=e;while(1){v=v+-4|0;if((h|0)==(v|0))break;w=f[v>>2]|0;if(q>>>0<=w>>>0){l=51;break a}if((f[r+(w<<3)>>2]|0)>>>0>>0){l=53;break b}}s=h+4|0;j=f[e>>2]|0;if(q>>>0<=j>>>0){l=26;break a}if(k>>>0<(f[r+(j<<3)>>2]|0)>>>0)x=s;else{if((s|0)==(e|0)){l=84;break a}else y=s;while(1){z=f[y>>2]|0;if(q>>>0<=z>>>0){l=32;break a}if(k>>>0<(f[r+(z<<3)>>2]|0)>>>0)break;s=y+4|0;if((s|0)==(e|0)){l=84;break a}else y=s}f[y>>2]=j;f[e>>2]=z;x=y+4|0}if((x|0)==(e|0)){l=84;break a}r=f[h>>2]|0;A=f[c>>2]|0;k=f[A>>2]|0;q=(f[A+4>>2]|0)-k>>3;if(q>>>0<=r>>>0){l=38;break a}s=k;k=e;B=x;C=r;while(1){r=s+(C<<3)|0;D=q>>>0>C>>>0;E=B;while(1){F=f[E>>2]|0;if(q>>>0<=F>>>0){l=40;break a}G=f[r>>2]|0;if(G>>>0<(f[s+(F<<3)>>2]|0)>>>0)break;if(D)E=E+4|0;else{l=38;break a}}if(q>>>0>C>>>0)H=k;else{l=46;break a}do{H=H+-4|0;I=f[H>>2]|0;if(q>>>0<=I>>>0){l=47;break a}}while(G>>>0<(f[s+(I<<3)>>2]|0)>>>0);if(E>>>0>=H>>>0){h=E;continue b}D=f[E>>2]|0;f[E>>2]=I;f[H>>2]=D;C=f[h>>2]|0;if(q>>>0<=C>>>0){l=38;break a}else{k=H;B=E+4|0}}}if((l|0)==53){l=0;f[h>>2]=w;f[v>>2]=o;t=v;u=n+1|0}B=h+4|0;c:do if(B>>>0>>0){k=f[B>>2]|0;C=f[c>>2]|0;q=f[C>>2]|0;s=(f[C+4>>2]|0)-q>>3;if(s>>>0>k>>>0){J=t;K=B;L=u;M=m;N=s;O=q;P=C;Q=k}else{R=C;l=57;break a}while(1){C=f[c>>2]|0;k=C+4|0;q=f[M>>2]|0;s=K;j=O;D=N;S=P;r=Q;while(1){F=j;if(D>>>0<=q>>>0){l=59;break a}if((f[F+(r<<3)>>2]|0)>>>0>=(f[F+(q<<3)>>2]|0)>>>0)break;F=s+4|0;T=f[F>>2]|0;j=f[C>>2]|0;D=(f[k>>2]|0)-j>>3;if(D>>>0<=T>>>0){R=C;l=57;break a}else{s=F;S=C;r=T}}C=f[M>>2]|0;O=f[S>>2]|0;N=(f[S+4>>2]|0)-O>>3;D=O;j=D+(C<<3)|0;if(N>>>0>C>>>0)U=J;else{l=65;break a}do{U=U+-4|0;V=f[U>>2]|0;if(N>>>0<=V>>>0){l=66;break a}}while((f[D+(V<<3)>>2]|0)>>>0>=(f[j>>2]|0)>>>0);if(s>>>0>U>>>0){W=M;X=L;Y=s;break c}f[s>>2]=V;f[U>>2]=r;K=s+4|0;Q=f[K>>2]|0;if(N>>>0<=Q>>>0){R=S;l=57;break a}else{J=U;L=L+1|0;M=(M|0)==(s|0)?U:M;P=S}}}else{W=m;X=u;Y=B}while(0);if((Y|0)!=(W|0)){B=f[W>>2]|0;j=f[Y>>2]|0;Z=f[c>>2]|0;D=f[Z>>2]|0;C=(f[Z+4>>2]|0)-D>>3;if(C>>>0<=B>>>0){l=72;break a}k=D;if(C>>>0<=j>>>0){l=74;break a}if((f[k+(B<<3)>>2]|0)>>>0<(f[k+(j<<3)>>2]|0)>>>0){f[Y>>2]=B;f[W>>2]=j;_=X+1|0}else _=X}else _=X;if(!_){$=_d(h,Y,c)|0;j=Y+4|0;if(_d(j,a,c)|0){l=83;break}if($){g=j;continue}}j=Y;if((j-i|0)>=(b-j|0)){l=82;break}Ob(h,Y,c);g=Y+4|0}if((l|0)==82){l=0;Ob(Y+4|0,a,c);d=h;a=Y;continue}else if((l|0)==83){l=0;if($){l=84;break}else{d=h;a=Y;continue}}}switch(l|0){case 5:{l=f[e>>2]|0;Y=f[h>>2]|0;d=f[c>>2]|0;$=f[d>>2]|0;i=(f[d+4>>2]|0)-$>>3;if(i>>>0<=l>>>0)aq(d);_=$;if(i>>>0<=Y>>>0)aq(d);if((f[_+(l<<3)>>2]|0)>>>0>=(f[_+(Y<<3)>>2]|0)>>>0)return;f[h>>2]=l;f[e>>2]=Y;return}case 11:{Vg(h,h+4|0,e,c)|0;return}case 12:{jh(h,h+4|0,h+8|0,e,c)|0;return}case 13:{ig(h,h+4|0,h+8|0,h+12|0,e,c)|0;return}case 15:{ih(h,a,c);return}case 20:{aq(p);break}case 22:{aq(p);break}case 26:{aq(p);break}case 32:{aq(p);break}case 38:{aq(A);break}case 40:{aq(A);break}case 46:{aq(A);break}case 47:{aq(A);break}case 51:{aq(p);break}case 57:{aq(R);break}case 59:{aq(S);break}case 65:{if(N>>>0>(f[J+-4>>2]|0)>>>0)aq(S);else aq(S);break}case 66:{aq(S);break}case 72:{aq(Z);break}case 74:{aq(Z);break}case 84:return}}function Pb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=un(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Vn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=un(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Vn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=un(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Vn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(t|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~$(n[m>>2])>>>0;f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3]>>>0;q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Qb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;if(!g){i=0;return i|0}do switch(f[a+28>>2]|0){case 1:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){m=f[f[a>>2]>>2]|0;o=a+40|0;q=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(q|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=m+r|0;r=0;while(1){f[g+(r<<2)>>2]=b[o>>0];r=r+1|0;m=b[k>>0]|0;if((r|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){s=m;break}else o=o+1|0}}else s=l;o=s<<24>>24;if(s<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 2:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){f[g+(t<<2)>>2]=h[m>>0];t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){u=k;break}else m=m+1|0}}else u=r;m=u<<24>>24;if(u<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 3:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=d[l>>1];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){v=o;break}else l=l+2|0}}else v=t;l=v<<24>>24;if(v<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 4:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=j[r>>1];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){w=m;break}else r=r+2|0}}else w=q;r=w<<24>>24;if(w<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}case 5:{r=a+24|0;k=b[r>>0]|0;if((k<<24>>24>e<<24>>24?e:k)<<24>>24>0){l=f[f[a>>2]>>2]|0;t=a+40|0;m=un(f[t>>2]|0,f[t+4>>2]|0,f[c>>2]|0,0)|0;t=a+48|0;o=Vn(m|0,I|0,f[t>>2]|0,f[t+4>>2]|0)|0;t=l+o|0;o=0;while(1){f[g+(o<<2)>>2]=f[t>>2];o=o+1|0;l=b[r>>0]|0;if((o|0)>=((l<<24>>24>e<<24>>24?e:l)<<24>>24|0)){x=l;break}else t=t+4|0}}else x=k;t=x<<24>>24;if(x<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(t<<2)|0,0,(e<<24>>24)-t<<2|0)|0;i=1;return i|0}case 6:{t=a+24|0;o=b[t>>0]|0;if((o<<24>>24>e<<24>>24?e:o)<<24>>24>0){r=f[f[a>>2]>>2]|0;q=a+40|0;l=un(f[q>>2]|0,f[q+4>>2]|0,f[c>>2]|0,0)|0;q=a+48|0;m=Vn(l|0,I|0,f[q>>2]|0,f[q+4>>2]|0)|0;q=r+m|0;m=0;while(1){f[g+(m<<2)>>2]=f[q>>2];m=m+1|0;r=b[t>>0]|0;if((m|0)>=((r<<24>>24>e<<24>>24?e:r)<<24>>24|0)){y=r;break}else q=q+4|0}}else y=o;q=y<<24>>24;if(y<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(q<<2)|0,0,(e<<24>>24)-q<<2|0)|0;i=1;return i|0}case 7:{q=a+24|0;m=b[q>>0]|0;if((m<<24>>24>e<<24>>24?e:m)<<24>>24>0){t=f[f[a>>2]>>2]|0;k=a+40|0;r=un(f[k>>2]|0,f[k+4>>2]|0,f[c>>2]|0,0)|0;k=a+48|0;l=Vn(r|0,I|0,f[k>>2]|0,f[k+4>>2]|0)|0;k=t+l|0;l=0;while(1){f[g+(l<<2)>>2]=f[k>>2];l=l+1|0;t=b[q>>0]|0;if((l|0)>=((t<<24>>24>e<<24>>24?e:t)<<24>>24|0)){z=t;break}else k=k+8|0}}else z=m;k=z<<24>>24;if(z<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(k<<2)|0,0,(e<<24>>24)-k<<2|0)|0;i=1;return i|0}case 8:{k=a+24|0;l=b[k>>0]|0;if((l<<24>>24>e<<24>>24?e:l)<<24>>24>0){q=f[f[a>>2]>>2]|0;o=a+40|0;t=un(f[o>>2]|0,f[o+4>>2]|0,f[c>>2]|0,0)|0;o=a+48|0;r=Vn(t|0,I|0,f[o>>2]|0,f[o+4>>2]|0)|0;o=q+r|0;r=0;while(1){f[g+(r<<2)>>2]=f[o>>2];r=r+1|0;q=b[k>>0]|0;if((r|0)>=((q<<24>>24>e<<24>>24?e:q)<<24>>24|0)){A=q;break}else o=o+8|0}}else A=l;o=A<<24>>24;if(A<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(o<<2)|0,0,(e<<24>>24)-o<<2|0)|0;i=1;return i|0}case 9:{o=a+24|0;r=b[o>>0]|0;if((r<<24>>24>e<<24>>24?e:r)<<24>>24>0){k=f[f[a>>2]>>2]|0;m=a+40|0;q=un(f[m>>2]|0,f[m+4>>2]|0,f[c>>2]|0,0)|0;m=a+48|0;t=Vn(q|0,I|0,f[m>>2]|0,f[m+4>>2]|0)|0;m=k+t|0;t=0;while(1){k=~~$(n[m>>2]);f[g+(t<<2)>>2]=k;t=t+1|0;k=b[o>>0]|0;if((t|0)>=((k<<24>>24>e<<24>>24?e:k)<<24>>24|0)){B=k;break}else m=m+4|0}}else B=r;m=B<<24>>24;if(B<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(m<<2)|0,0,(e<<24>>24)-m<<2|0)|0;i=1;return i|0}case 10:{m=a+24|0;t=b[m>>0]|0;if((t<<24>>24>e<<24>>24?e:t)<<24>>24>0){o=f[f[a>>2]>>2]|0;l=a+40|0;k=un(f[l>>2]|0,f[l+4>>2]|0,f[c>>2]|0,0)|0;l=a+48|0;q=Vn(k|0,I|0,f[l>>2]|0,f[l+4>>2]|0)|0;l=o+q|0;q=0;while(1){f[g+(q<<2)>>2]=~~+p[l>>3];q=q+1|0;o=b[m>>0]|0;if((q|0)>=((o<<24>>24>e<<24>>24?e:o)<<24>>24|0)){C=o;break}else l=l+8|0}}else C=t;l=C<<24>>24;if(C<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(l<<2)|0,0,(e<<24>>24)-l<<2|0)|0;i=1;return i|0}case 11:{l=a+24|0;q=b[l>>0]|0;if((q<<24>>24>e<<24>>24?e:q)<<24>>24>0){m=f[f[a>>2]>>2]|0;r=a+40|0;o=un(f[r>>2]|0,f[r+4>>2]|0,f[c>>2]|0,0)|0;r=a+48|0;k=Vn(o|0,I|0,f[r>>2]|0,f[r+4>>2]|0)|0;r=m+k|0;k=0;while(1){f[g+(k<<2)>>2]=h[r>>0];k=k+1|0;m=b[l>>0]|0;if((k|0)>=((m<<24>>24>e<<24>>24?e:m)<<24>>24|0)){D=m;break}else r=r+1|0}}else D=q;r=D<<24>>24;if(D<<24>>24>=e<<24>>24){i=1;return i|0}sj(g+(r<<2)|0,0,(e<<24>>24)-r<<2|0)|0;i=1;return i|0}default:{i=0;return i|0}}while(0);return 0}function Rb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=Oa,J=0,K=0,L=0,M=0,N=Oa;e=u;u=u+48|0;g=e+36|0;h=e+24|0;i=e+12|0;j=e;if(!(xh(a,c,d)|0)){k=0;u=e;return k|0}l=f[(f[(f[c+4>>2]|0)+8>>2]|0)+(d<<2)>>2]|0;if((f[l+28>>2]|0)!=9){k=0;u=e;return k|0}m=c+48|0;c=f[m>>2]|0;o=ln(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=17;p=o;q=14495;r=p+17|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+17>>0]=0;o=c+16|0;s=f[o>>2]|0;if(s){t=o;v=s;a:while(1){s=v;while(1){if((f[s+16>>2]|0)>=(d|0))break;w=f[s+4>>2]|0;if(!w){x=t;break a}else s=w}v=f[s>>2]|0;if(!v){x=s;break}else t=s}if(((x|0)!=(o|0)?(f[x+16>>2]|0)<=(d|0):0)?(o=x+20|0,(Jh(o,g)|0)!=0):0)y=Hk(o,g,-1)|0;else z=12}else z=12;if((z|0)==12)y=Hk(c,g,-1)|0;if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if((y|0)<1){k=0;u=e;return k|0}c=f[m>>2]|0;o=ln(32)|0;f[g>>2]=o;f[g+8>>2]=-2147483616;f[g+4>>2]=19;p=o;q=14438;r=p+19|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[o+19>>0]=0;o=c+16|0;x=f[o>>2]|0;if(x){t=o;v=x;b:while(1){x=v;while(1){if((f[x+16>>2]|0)>=(d|0))break;w=f[x+4>>2]|0;if(!w){A=t;break b}else x=w}v=f[x>>2]|0;if(!v){A=x;break}else t=x}if((A|0)!=(o|0)?(f[A+16>>2]|0)<=(d|0):0)B=A+20|0;else z=24}else z=24;if((z|0)==24)B=c;if(!(Jh(B,g)|0))C=0;else{B=f[m>>2]|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;c=ln(32)|0;f[h>>2]=c;f[h+8>>2]=-2147483616;f[h+4>>2]=18;p=c;q=14458;r=p+18|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[c+18>>0]=0;c=B+16|0;A=f[c>>2]|0;if(A){o=c;t=A;c:while(1){A=t;while(1){if((f[A+16>>2]|0)>=(d|0))break;v=f[A+4>>2]|0;if(!v){D=o;break c}else A=v}t=f[A>>2]|0;if(!t){D=A;break}else o=A}if((D|0)!=(c|0)?(f[D+16>>2]|0)<=(d|0):0)E=D+20|0;else z=34}else z=34;if((z|0)==34)E=B;B=(Jh(E,h)|0)!=0;if((b[h+11>>0]|0)<0)Oq(f[h>>2]|0);C=B}if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);if(!C){Wd(a+40|0,l,y)|0;k=1;u=e;return k|0}C=l+24|0;l=b[C>>0]|0;B=l<<24>>24;f[i>>2]=0;E=i+4|0;f[E>>2]=0;f[i+8>>2]=0;do if(l<<24>>24)if(l<<24>>24<0)aq(i);else{D=B<<2;c=ln(D)|0;f[i>>2]=c;o=c+(B<<2)|0;f[i+8>>2]=o;sj(c|0,0,D|0)|0;f[E>>2]=o;F=c;break}else F=0;while(0);B=f[m>>2]|0;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;l=ln(32)|0;f[j>>2]=l;f[j+8>>2]=-2147483616;f[j+4>>2]=19;p=l;q=14438;r=p+19|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[l+19>>0]=0;l=b[C>>0]|0;c=l<<24>>24;o=B+16|0;D=f[o>>2]|0;if(D){t=o;x=D;d:while(1){D=x;while(1){if((f[D+16>>2]|0)>=(d|0))break;v=f[D+4>>2]|0;if(!v){G=t;break d}else D=v}x=f[D>>2]|0;if(!x){G=D;break}else t=D}if(((G|0)!=(o|0)?(f[G+16>>2]|0)<=(d|0):0)?(o=G+20|0,(Jh(o,j)|0)!=0):0){t=Rg(o,j)|0;if((t|0)!=(G+24|0)){pj(g,t+28|0);t=g+11|0;G=b[t>>0]|0;o=G<<24>>24<0;if(!((o?f[g+4>>2]|0:G&255)|0))H=G;else{if(l<<24>>24>0){x=o?f[g>>2]|0:g;o=0;do{I=$(bq(x,h));A=x;x=f[h>>2]|0;if((A|0)==(x|0))break;n[F+(o<<2)>>2]=I;o=o+1|0}while((o|0)<(c|0));J=b[t>>0]|0}else J=G;H=J}if(H<<24>>24<0)Oq(f[g>>2]|0)}}else z=64}else z=64;if((z|0)==64?(H=Rg(B,j)|0,(H|0)!=(B+4|0)):0){pj(g,H+28|0);H=g+11|0;B=b[H>>0]|0;J=B<<24>>24<0;if(!((J?f[g+4>>2]|0:B&255)|0))K=B;else{if(l<<24>>24>0){l=J?f[g>>2]|0:g;J=0;do{I=$(bq(l,h));G=l;l=f[h>>2]|0;if((G|0)==(l|0))break;n[F+(J<<2)>>2]=I;J=J+1|0}while((J|0)<(c|0));L=b[H>>0]|0}else L=B;K=L}if(K<<24>>24<0)Oq(f[g>>2]|0)}if((b[j+11>>0]|0)<0)Oq(f[j>>2]|0);j=f[m>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;m=ln(32)|0;f[g>>2]=m;f[g+8>>2]=-2147483616;f[g+4>>2]=18;p=m;q=14458;r=p+18|0;do{b[p>>0]=b[q>>0]|0;p=p+1|0;q=q+1|0}while((p|0)<(r|0));b[m+18>>0]=0;m=j+16|0;q=f[m>>2]|0;if(q){p=m;r=q;e:while(1){q=r;while(1){if((f[q+16>>2]|0)>=(d|0))break;K=f[q+4>>2]|0;if(!K){M=p;break e}else q=K}r=f[q>>2]|0;if(!r){M=q;break}else p=q}if(((M|0)!=(m|0)?(f[M+16>>2]|0)<=(d|0):0)?(d=M+20|0,(Jh(d,g)|0)!=0):0)N=$(sk(d,g,$(1.0)));else z=86}else z=86;if((z|0)==86)N=$(sk(j,g,$(1.0)));if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);Dl(a+40|0,y,f[i>>2]|0,b[C>>0]|0,N);C=f[i>>2]|0;if(C|0){i=f[E>>2]|0;if((i|0)!=(C|0))f[E>>2]=i+(~((i+-4-C|0)>>>2)<<2);Oq(C)}k=1;u=e;return k|0}function Sb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=u;u=u+64|0;d=e+48|0;h=e+36|0;i=e+24|0;j=e+16|0;k=e+8|0;l=e;m=e+32|0;n=a+60|0;f[a+68>>2]=g;g=a+108|0;tk(g);o=a+56|0;p=f[o>>2]|0;q=(f[p+4>>2]|0)-(f[p>>2]|0)|0;r=q>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;s=i;f[s>>2]=0;f[s+4>>2]=0;s=j;f[s>>2]=0;f[s+4>>2]=0;s=k;f[s>>2]=0;f[s+4>>2]=0;s=l;f[s>>2]=0;f[s+4>>2]=0;if((q|0)<=0){u=e;return 1}q=h+4|0;s=h+8|0;t=a+104|0;v=i+4|0;w=a+100|0;x=j+4|0;y=a+8|0;z=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;D=a+20|0;E=a+24|0;F=a+96|0;a=k+4|0;G=l+4|0;H=f[p>>2]|0;if((f[p+4>>2]|0)==(H|0)){J=p;aq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];ic(n,d,h);H=f[h>>2]|0;p=(H|0)>-1?H:0-H|0;M=f[q>>2]|0;N=(M|0)>-1?M:0-M|0;O=Vn(N|0,((N|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=f[s>>2]|0;N=(p|0)>-1;P=N?p:0-p|0;p=Vn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((p|0)==0&(P|0)==0){O=f[t>>2]|0;Q=O;R=h;S=M;T=O}else{O=f[t>>2]|0;U=((O|0)<0)<<31>>31;V=un(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=Ik(V|0,I|0,p|0,P|0)|0;f[h>>2]=H;V=un(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=Ik(V|0,I|0,p|0,P|0)|0;f[q>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=s;S=M;T=O}f[R>>2]=Q;O=f[h>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[s>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[s>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[s>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){p=(N|0)==(Z|0);if(!(P&p)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(p&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);f[i>>2]=$;f[v>>2]=aa;P=0-S|0;M=0-_|0;f[h>>2]=0-O;f[q>>2]=P;f[s>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(p=(N|0)==(ca|0),!(M&p)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(p&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);f[j>>2]=da;f[x>>2]=ea;N=K<<1;M=b+(N<<2)|0;H=f[y>>2]|0;if((H|0)>0){O=0;P=i;p=H;while(1){if((p|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;U=f[z>>2]|0;if((V|0)>(U|0)){fa=f[A>>2]|0;f[fa+(H<<2)>>2]=U;ga=fa}else{fa=f[B>>2]|0;U=f[A>>2]|0;f[U+(H<<2)>>2]=(V|0)<(fa|0)?fa:V;ga=U}H=H+1|0;U=f[y>>2]|0}while((H|0)<(U|0));ha=ga;ia=U}else{ha=f[A>>2]|0;ia=p}H=(f[M+(O<<2)>>2]|0)-(f[ha+(O<<2)>>2]|0)|0;U=k+(O<<2)|0;f[U>>2]=H;ja=f[C>>2]|0;if((H|0)>=(ja|0)){if((H|0)>(f[E>>2]|0)){ka=H-(f[D>>2]|0)|0;la=52}}else{ka=(f[D>>2]|0)+H|0;la=52}if((la|0)==52){la=0;f[U>>2]=ka}O=O+1|0;if((O|0)>=(ia|0))break;else{P=ha;p=ia}}if((ia|0)>0){p=0;P=j;O=ia;U=ja;while(1){if((O|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;fa=f[z>>2]|0;if((V|0)>(fa|0))f[ha+(H<<2)>>2]=fa;else{fa=f[B>>2]|0;f[ha+(H<<2)>>2]=(V|0)<(fa|0)?fa:V}H=H+1|0;ma=f[y>>2]|0}while((H|0)<(ma|0));na=f[C>>2]|0;oa=ma}else{na=U;oa=O}H=(f[M+(p<<2)>>2]|0)-(f[ha+(p<<2)>>2]|0)|0;V=l+(p<<2)|0;f[V>>2]=H;if((H|0)>=(na|0)){if((H|0)>(f[E>>2]|0)){pa=H-(f[D>>2]|0)|0;la=65}}else{pa=(f[D>>2]|0)+H|0;la=65}if((la|0)==65){la=0;f[V>>2]=pa}p=p+1|0;if((p|0)>=(oa|0))break;else{P=ha;O=oa;U=na}}}}U=f[k>>2]|0;O=f[t>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))qa=(f[F>>2]|0)+U|0;else qa=U;else qa=U-(f[F>>2]|0)|0;f[k>>2]=qa;U=f[a>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ra=(f[F>>2]|0)+U|0;else ra=U;else ra=U-(f[F>>2]|0)|0;f[a>>2]=ra;U=f[l>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))sa=(f[F>>2]|0)+U|0;else sa=U;else sa=U-(f[F>>2]|0)|0;f[l>>2]=sa;U=f[G>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ta=(f[F>>2]|0)+U|0;else ta=U;else ta=U-(f[F>>2]|0)|0;f[G>>2]=ta;if((((ra|0)>-1?ra:0-ra|0)+((qa|0)>-1?qa:0-qa|0)|0)<(((sa|0)>-1?sa:0-sa|0)+((ta|0)>-1?ta:0-ta|0)|0)){fj(g,0);ua=k}else{fj(g,1);ua=l}U=f[ua>>2]|0;if((U|0)<0)va=(f[F>>2]|0)+U|0;else va=U;U=c+(N<<2)|0;f[U>>2]=va;O=f[ua+4>>2]|0;if((O|0)<0)wa=(f[F>>2]|0)+O|0;else wa=O;f[U+4>>2]=wa;K=K+1|0;if((K|0)>=(r|0)){la=3;break}U=f[o>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=K>>>0){J=U;la=4;break}}if((la|0)==3){u=e;return 1}else if((la|0)==4)aq(J);return 0}function Tb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;e=u;u=u+64|0;d=e+48|0;h=e+36|0;i=e+24|0;j=e+16|0;k=e+8|0;l=e;m=e+32|0;n=a+60|0;f[a+68>>2]=g;g=a+108|0;tk(g);o=a+56|0;p=f[o>>2]|0;q=(f[p+4>>2]|0)-(f[p>>2]|0)|0;r=q>>2;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;s=i;f[s>>2]=0;f[s+4>>2]=0;s=j;f[s>>2]=0;f[s+4>>2]=0;s=k;f[s>>2]=0;f[s+4>>2]=0;s=l;f[s>>2]=0;f[s+4>>2]=0;if((q|0)<=0){u=e;return 1}q=h+4|0;s=h+8|0;t=a+104|0;v=i+4|0;w=a+100|0;x=j+4|0;y=a+8|0;z=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;D=a+20|0;E=a+24|0;F=a+96|0;a=k+4|0;G=l+4|0;H=f[p>>2]|0;if((f[p+4>>2]|0)==(H|0)){J=p;aq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];$b(n,d,h);H=f[h>>2]|0;p=(H|0)>-1?H:0-H|0;M=f[q>>2]|0;N=(M|0)>-1?M:0-M|0;O=Vn(N|0,((N|0)<0)<<31>>31|0,p|0,((p|0)<0)<<31>>31|0)|0;p=f[s>>2]|0;N=(p|0)>-1;P=N?p:0-p|0;p=Vn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((p|0)==0&(P|0)==0){O=f[t>>2]|0;Q=O;R=h;S=M;T=O}else{O=f[t>>2]|0;U=((O|0)<0)<<31>>31;V=un(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=Ik(V|0,I|0,p|0,P|0)|0;f[h>>2]=H;V=un(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=Ik(V|0,I|0,p|0,P|0)|0;f[q>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=s;S=M;T=O}f[R>>2]=Q;O=f[h>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[s>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[s>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[s>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){p=(N|0)==(Z|0);if(!(P&p)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(p&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);f[i>>2]=$;f[v>>2]=aa;P=0-S|0;M=0-_|0;f[h>>2]=0-O;f[q>>2]=P;f[s>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(p=(N|0)==(ca|0),!(M&p)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(p&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);f[j>>2]=da;f[x>>2]=ea;N=K<<1;M=b+(N<<2)|0;H=f[y>>2]|0;if((H|0)>0){O=0;P=i;p=H;while(1){if((p|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;U=f[z>>2]|0;if((V|0)>(U|0)){fa=f[A>>2]|0;f[fa+(H<<2)>>2]=U;ga=fa}else{fa=f[B>>2]|0;U=f[A>>2]|0;f[U+(H<<2)>>2]=(V|0)<(fa|0)?fa:V;ga=U}H=H+1|0;U=f[y>>2]|0}while((H|0)<(U|0));ha=ga;ia=U}else{ha=f[A>>2]|0;ia=p}H=(f[M+(O<<2)>>2]|0)-(f[ha+(O<<2)>>2]|0)|0;U=k+(O<<2)|0;f[U>>2]=H;ja=f[C>>2]|0;if((H|0)>=(ja|0)){if((H|0)>(f[E>>2]|0)){ka=H-(f[D>>2]|0)|0;la=52}}else{ka=(f[D>>2]|0)+H|0;la=52}if((la|0)==52){la=0;f[U>>2]=ka}O=O+1|0;if((O|0)>=(ia|0))break;else{P=ha;p=ia}}if((ia|0)>0){p=0;P=j;O=ia;U=ja;while(1){if((O|0)>0){H=0;do{V=f[P+(H<<2)>>2]|0;fa=f[z>>2]|0;if((V|0)>(fa|0))f[ha+(H<<2)>>2]=fa;else{fa=f[B>>2]|0;f[ha+(H<<2)>>2]=(V|0)<(fa|0)?fa:V}H=H+1|0;ma=f[y>>2]|0}while((H|0)<(ma|0));na=f[C>>2]|0;oa=ma}else{na=U;oa=O}H=(f[M+(p<<2)>>2]|0)-(f[ha+(p<<2)>>2]|0)|0;V=l+(p<<2)|0;f[V>>2]=H;if((H|0)>=(na|0)){if((H|0)>(f[E>>2]|0)){pa=H-(f[D>>2]|0)|0;la=65}}else{pa=(f[D>>2]|0)+H|0;la=65}if((la|0)==65){la=0;f[V>>2]=pa}p=p+1|0;if((p|0)>=(oa|0))break;else{P=ha;O=oa;U=na}}}}U=f[k>>2]|0;O=f[t>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))qa=(f[F>>2]|0)+U|0;else qa=U;else qa=U-(f[F>>2]|0)|0;f[k>>2]=qa;U=f[a>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ra=(f[F>>2]|0)+U|0;else ra=U;else ra=U-(f[F>>2]|0)|0;f[a>>2]=ra;U=f[l>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))sa=(f[F>>2]|0)+U|0;else sa=U;else sa=U-(f[F>>2]|0)|0;f[l>>2]=sa;U=f[G>>2]|0;if((O|0)>=(U|0))if((U|0)<(0-O|0))ta=(f[F>>2]|0)+U|0;else ta=U;else ta=U-(f[F>>2]|0)|0;f[G>>2]=ta;if((((ra|0)>-1?ra:0-ra|0)+((qa|0)>-1?qa:0-qa|0)|0)<(((sa|0)>-1?sa:0-sa|0)+((ta|0)>-1?ta:0-ta|0)|0)){fj(g,0);ua=k}else{fj(g,1);ua=l}U=f[ua>>2]|0;if((U|0)<0)va=(f[F>>2]|0)+U|0;else va=U;U=c+(N<<2)|0;f[U>>2]=va;O=f[ua+4>>2]|0;if((O|0)<0)wa=(f[F>>2]|0)+O|0;else wa=O;f[U+4>>2]=wa;K=K+1|0;if((K|0)>=(r|0)){la=3;break}U=f[o>>2]|0;L=f[U>>2]|0;if((f[U+4>>2]|0)-L>>2>>>0<=K>>>0){J=U;la=4;break}}if((la|0)==3){u=e;return 1}else if((la|0)==4)aq(J);return 0}function Ub(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,Y=Oa,Z=0,_=0,aa=0,ba=0;d=u;u=u+16|0;e=d;g=a+16|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;n[g>>2]=$(1.0);i=a+20|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[a+36>>2]=$(1.0);j=f[c+8>>2]|0;a:do if(j|0){k=a+4|0;l=a+12|0;m=a+8|0;o=j;p=j;while(1){q=o+8|0;r=b[q+11>>0]|0;s=r<<24>>24<0;t=s?f[q>>2]|0:q;v=s?f[o+12>>2]|0:r&255;if(v>>>0>3){r=t;s=v;w=v;while(1){x=X(h[r>>0]|h[r+1>>0]<<8|h[r+2>>0]<<16|h[r+3>>0]<<24,1540483477)|0;s=(X(x>>>24^x,1540483477)|0)^(X(s,1540483477)|0);w=w+-4|0;if(w>>>0<=3)break;else r=r+4|0}r=v+-4|0;w=r&-4;y=r-w|0;z=t+(w+4)|0;A=s}else{y=v;z=t;A=v}switch(y|0){case 3:{B=h[z+2>>0]<<16^A;C=8;break}case 2:{B=A;C=8;break}case 1:{D=A;C=9;break}default:E=A}if((C|0)==8){C=0;D=h[z+1>>0]<<8^B;C=9}if((C|0)==9){C=0;E=X(D^h[z>>0],1540483477)|0}w=X(E>>>13^E,1540483477)|0;r=w>>>15^w;w=f[k>>2]|0;x=(w|0)==0;b:do if(!x){F=w+-1|0;G=(F&w|0)==0;if(!G)if(r>>>0>>0)H=r;else H=(r>>>0)%(w>>>0)|0;else H=r&F;I=f[(f[a>>2]|0)+(H<<2)>>2]|0;if((I|0)!=0?(J=f[I>>2]|0,(J|0)!=0):0){I=(v|0)==0;if(G){if(I){G=J;while(1){K=f[G+4>>2]|0;if(!((K|0)==(r|0)|(K&F|0)==(H|0))){L=H;C=50;break b}K=b[G+8+11>>0]|0;if(!((K<<24>>24<0?f[G+12>>2]|0:K&255)|0))break b;G=f[G>>2]|0;if(!G){L=H;C=50;break b}}}else M=J;while(1){G=f[M+4>>2]|0;if(!((G|0)==(r|0)|(G&F|0)==(H|0))){L=H;C=50;break b}G=M+8|0;K=b[G+11>>0]|0;N=K<<24>>24<0;O=K&255;do if(((N?f[M+12>>2]|0:O)|0)==(v|0)){K=f[G>>2]|0;if(N)if(!(Vk(K,t,v)|0))break b;else break;if((b[t>>0]|0)==(K&255)<<24>>24){K=G;P=O;Q=t;do{P=P+-1|0;K=K+1|0;if(!P)break b;Q=Q+1|0}while((b[K>>0]|0)==(b[Q>>0]|0))}}while(0);M=f[M>>2]|0;if(!M){L=H;C=50;break b}}}if(I){F=J;while(1){O=f[F+4>>2]|0;if((O|0)!=(r|0)){if(O>>>0>>0)R=O;else R=(O>>>0)%(w>>>0)|0;if((R|0)!=(H|0)){L=H;C=50;break b}}O=b[F+8+11>>0]|0;if(!((O<<24>>24<0?f[F+12>>2]|0:O&255)|0))break b;F=f[F>>2]|0;if(!F){L=H;C=50;break b}}}else S=J;while(1){F=f[S+4>>2]|0;if((F|0)!=(r|0)){if(F>>>0>>0)T=F;else T=(F>>>0)%(w>>>0)|0;if((T|0)!=(H|0)){L=H;C=50;break b}}F=S+8|0;I=b[F+11>>0]|0;O=I<<24>>24<0;G=I&255;do if(((O?f[S+12>>2]|0:G)|0)==(v|0)){I=f[F>>2]|0;if(O)if(!(Vk(I,t,v)|0))break b;else break;if((b[t>>0]|0)==(I&255)<<24>>24){I=F;N=G;Q=t;do{N=N+-1|0;I=I+1|0;if(!N)break b;Q=Q+1|0}while((b[I>>0]|0)==(b[Q>>0]|0))}}while(0);S=f[S>>2]|0;if(!S){L=H;C=50;break}}}else{L=H;C=50}}else{L=0;C=50}while(0);if((C|0)==50){C=0;Di(e,a,r,q);U=$(((f[l>>2]|0)+1|0)>>>0);V=$(w>>>0);Y=$(n[g>>2]);do if(x|$(Y*V)>>0<3|(w+-1&w|0)!=0)&1;v=~~$(W($(U/Y)))>>>0;ei(a,t>>>0>>0?v:t);t=f[k>>2]|0;v=t+-1|0;if(!(v&t)){Z=t;_=v&r;break}if(r>>>0>>0){Z=t;_=r}else{Z=t;_=(r>>>0)%(t>>>0)|0}}else{Z=w;_=L}while(0);w=f[(f[a>>2]|0)+(_<<2)>>2]|0;if(!w){f[f[e>>2]>>2]=f[m>>2];f[m>>2]=f[e>>2];f[(f[a>>2]|0)+(_<<2)>>2]=m;r=f[e>>2]|0;x=f[r>>2]|0;if(x|0){q=f[x+4>>2]|0;x=Z+-1|0;if(x&Z)if(q>>>0>>0)aa=q;else aa=(q>>>0)%(Z>>>0)|0;else aa=q&x;f[(f[a>>2]|0)+(aa<<2)>>2]=r}}else{f[f[e>>2]>>2]=f[w>>2];f[w>>2]=f[e>>2]}f[l>>2]=(f[l>>2]|0)+1}w=f[p>>2]|0;if(!w)break a;else{o=w;p=w}}}while(0);e=f[c+28>>2]|0;if(!e){u=d;return}else ba=e;do{e=ba;c=ln(40)|0;Ub(c,f[e+20>>2]|0);aa=Ec(i,e+8|0)|0;e=f[aa>>2]|0;f[aa>>2]=c;if(e|0){c=f[e+28>>2]|0;if(c|0){aa=c;do{c=aa;aa=f[aa>>2]|0;ri(c+8|0);Oq(c)}while((aa|0)!=0)}aa=e+20|0;c=f[aa>>2]|0;f[aa>>2]=0;if(c|0)Oq(c);c=f[e+8>>2]|0;if(c|0){aa=c;do{c=aa;aa=f[aa>>2]|0;a=c+8|0;Z=f[c+20>>2]|0;if(Z|0){_=c+24|0;if((f[_>>2]|0)!=(Z|0))f[_>>2]=Z;Oq(Z)}if((b[a+11>>0]|0)<0)Oq(f[a>>2]|0);Oq(c)}while((aa|0)!=0)}aa=f[e>>2]|0;f[e>>2]=0;if(aa|0)Oq(aa);Oq(e)}ba=f[ba>>2]|0}while((ba|0)!=0);u=d;return}function Vb(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+16|0;j=g+12|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=r;z=0;A=0;B=r;C=r;D=0;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=un(f[r>>2]|0,f[r+4>>2]|0,y+z|0,0)|0;r=Vn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8|h[G+2>>0]<<16|h[G+3>>0]<<24;f[j>>2]=r;G=r&65535;F=r>>>16;H=F&65535;J=(r&65535^318)+239^F;F=(D|0)==0;a:do if(!F){K=D+-1|0;L=(K&D|0)==0;if(!L)if(J>>>0>>0)M=J;else M=(J>>>0)%(D>>>0)|0;else M=J&K;N=f[(f[i>>2]|0)+(M<<2)>>2]|0;do if(N|0?(O=f[N>>2]|0,O|0):0){b:do if(L){P=O;while(1){Q=f[P+4>>2]|0;R=(Q|0)==(J|0);if(!(R|(Q&K|0)==(M|0))){S=27;break b}if((R?(R=P+8|0,(d[R>>1]|0)==G<<16>>16):0)?(d[R+2>>1]|0)==H<<16>>16:0){T=P;S=26;break b}P=f[P>>2]|0;if(!P){S=27;break}}}else{P=O;while(1){R=f[P+4>>2]|0;if((R|0)==(J|0)){Q=P+8|0;if((d[Q>>1]|0)==G<<16>>16?(d[Q+2>>1]|0)==H<<16>>16:0){T=P;S=26;break b}}else{if(R>>>0>>0)U=R;else U=(R>>>0)%(D>>>0)|0;if((U|0)!=(M|0)){S=27;break b}}P=f[P>>2]|0;if(!P){S=27;break}}}while(0);if((S|0)==26){S=0;f[E+(z<<2)>>2]=f[T+12>>2];V=e;X=A;Y=C;Z=B;_=E;break a}else if((S|0)==27){S=0;if(F){aa=0;S=46;break a}else break}}while(0);K=D+-1|0;L=(K&D|0)==0;if(!L)if(J>>>0>>0)ba=J;else ba=(J>>>0)%(D>>>0)|0;else ba=K&J;N=f[(f[i>>2]|0)+(ba<<2)>>2]|0;if((N|0)!=0?(O=f[N>>2]|0,(O|0)!=0):0){if(L){L=O;while(1){N=f[L+4>>2]|0;if(!((N|0)==(J|0)|(N&K|0)==(ba|0))){aa=ba;S=46;break a}N=L+8|0;if((d[N>>1]|0)==G<<16>>16?(d[N+2>>1]|0)==H<<16>>16:0){S=61;break a}L=f[L>>2]|0;if(!L){aa=ba;S=46;break a}}}else ca=O;while(1){L=f[ca+4>>2]|0;if((L|0)!=(J|0)){if(L>>>0>>0)da=L;else da=(L>>>0)%(D>>>0)|0;if((da|0)!=(ba|0)){aa=ba;S=46;break a}}L=ca+8|0;if((d[L>>1]|0)==G<<16>>16?(d[L+2>>1]|0)==H<<16>>16:0){S=61;break a}ca=f[ca>>2]|0;if(!ca){aa=ba;S=46;break}}}else{aa=ba;S=46}}else{aa=0;S=46}while(0);if((S|0)==46){S=0;H=ln(16)|0;G=H+8|0;d[G>>1]=r;d[G+2>>1]=r>>>16;f[H+12>>2]=A;f[H+4>>2]=J;f[H>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(D>>>0);ga=$(n[l>>2]);do if(F|$(ga*fa)>>0<3|(D+-1&D|0)!=0)&1;O=~~$(W($(ea/ga)))>>>0;Uh(i,G>>>0>>0?O:G);G=f[o>>2]|0;O=G+-1|0;if(!(O&G)){ha=G;ia=O&J;break}if(J>>>0>>0){ha=G;ia=J}else{ha=G;ia=(J>>>0)%(G>>>0)|0}}else{ha=D;ia=aa}while(0);J=(f[i>>2]|0)+(ia<<2)|0;F=f[J>>2]|0;if(!F){f[H>>2]=f[v>>2];f[v>>2]=H;f[J>>2]=v;J=f[H>>2]|0;if(J|0){r=f[J+4>>2]|0;J=ha+-1|0;if(J&ha)if(r>>>0>>0)ja=r;else ja=(r>>>0)%(ha>>>0)|0;else ja=r&J;ka=(f[i>>2]|0)+(ja<<2)|0;S=59}}else{f[H>>2]=f[F>>2];ka=F;S=59}if((S|0)==59){S=0;f[ka>>2]=H}f[t>>2]=(f[t>>2]|0)+1;S=61}if((S|0)==61){S=0;F=w;J=f[F>>2]|0;r=un(J|0,f[F+4>>2]|0,A|0,0)|0;kh((f[f[x>>2]>>2]|0)+r|0,j|0,J|0)|0;J=f[k>>2]|0;f[J+(z<<2)>>2]=A;V=J;X=A+1|0;Y=J;Z=J;_=J}J=z+1|0;la=f[m>>2]|0;if(J>>>0>=la>>>0)break;e=V;z=J;A=X;B=Z;C=Y;D=f[o>>2]|0;E=_}if((X|0)==(la|0))ma=Z;else{Z=a+84|0;if(!(b[Z>>0]|0)){_=f[a+72>>2]|0;E=f[a+68>>2]|0;o=E;if((_|0)==(E|0))na=V;else{D=_-E>>2;E=0;do{_=o+(E<<2)|0;f[_>>2]=f[Y+(f[_>>2]<<2)>>2];E=E+1|0}while(E>>>0>>0);na=V}}else{b[Z>>0]=0;Z=a+68|0;V=a+72|0;D=f[V>>2]|0;E=f[Z>>2]|0;Y=D-E>>2;o=E;E=D;if(la>>>0<=Y>>>0)if(la>>>0>>0?(D=o+(la<<2)|0,(D|0)!=(E|0)):0){f[V>>2]=E+(~((E+-4-D|0)>>>2)<<2);oa=la}else oa=la;else{Ch(Z,la-Y|0,1220);oa=f[m>>2]|0}Y=f[k>>2]|0;if(!oa)na=Y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[Y+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);na=Y}}f[m>>2]=X;ma=na}if(!ma)pa=X;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);Oq(ma);pa=X}}else pa=0;X=f[i+8>>2]|0;if(X|0){ma=X;do{X=ma;ma=f[ma>>2]|0;Oq(X)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}Oq(ma);u=g;return pa|0}function Wb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=Oa,da=Oa,ea=Oa,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=u;u=u+48|0;g=e+20|0;i=e;j=e+8|0;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=c+48|0;p=c+40|0;m=g+4|0;s=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=f[d>>2]|0;d=q;y=0;z=0;A=q;B=q;C=q;q=0;while(1){D=r;E=f[D>>2]|0;F=f[D+4>>2]|0;D=p;G=un(f[D>>2]|0,f[D+4>>2]|0,x+y|0,0)|0;D=Vn(G|0,I|0,E|0,F|0)|0;F=(f[f[c>>2]>>2]|0)+D|0;D=F;E=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;D=F+4|0;F=h[D>>0]|h[D+1>>0]<<8|h[D+2>>0]<<16|h[D+3>>0]<<24;D=i;f[D>>2]=E;f[D+4>>2]=F;D=(E^318)+239^F;G=(q|0)==0;a:do if(!G){H=q+-1|0;J=(H&q|0)==0;if(!J)if(D>>>0>>0)K=D;else K=(D>>>0)%(q>>>0)|0;else K=D&H;L=f[(f[g>>2]|0)+(K<<2)>>2]|0;do if(L|0?(M=f[L>>2]|0,M|0):0){b:do if(J){N=M;while(1){O=f[N+4>>2]|0;P=(O|0)==(D|0);if(!(P|(O&H|0)==(K|0))){Q=27;break b}if((P?(f[N+8>>2]|0)==(E|0):0)?(f[N+12>>2]|0)==(F|0):0){R=N;Q=26;break b}N=f[N>>2]|0;if(!N){Q=27;break}}}else{N=M;while(1){P=f[N+4>>2]|0;if((P|0)==(D|0)){if((f[N+8>>2]|0)==(E|0)?(f[N+12>>2]|0)==(F|0):0){R=N;Q=26;break b}}else{if(P>>>0>>0)S=P;else S=(P>>>0)%(q>>>0)|0;if((S|0)!=(K|0)){Q=27;break b}}N=f[N>>2]|0;if(!N){Q=27;break}}}while(0);if((Q|0)==26){Q=0;f[A+(y<<2)>>2]=f[R+16>>2];T=d;U=z;V=C;X=B;Y=A;break a}else if((Q|0)==27){Q=0;if(G){Z=0;Q=46;break a}else break}}while(0);H=q+-1|0;J=(H&q|0)==0;if(!J)if(D>>>0>>0)_=D;else _=(D>>>0)%(q>>>0)|0;else _=H&D;L=f[(f[g>>2]|0)+(_<<2)>>2]|0;if((L|0)!=0?(M=f[L>>2]|0,(M|0)!=0):0){if(J){J=M;while(1){L=f[J+4>>2]|0;if(!((L|0)==(D|0)|(L&H|0)==(_|0))){Z=_;Q=46;break a}if((f[J+8>>2]|0)==(E|0)?(f[J+12>>2]|0)==(F|0):0){Q=61;break a}J=f[J>>2]|0;if(!J){Z=_;Q=46;break a}}}else aa=M;while(1){J=f[aa+4>>2]|0;if((J|0)!=(D|0)){if(J>>>0>>0)ba=J;else ba=(J>>>0)%(q>>>0)|0;if((ba|0)!=(_|0)){Z=_;Q=46;break a}}if((f[aa+8>>2]|0)==(E|0)?(f[aa+12>>2]|0)==(F|0):0){Q=61;break a}aa=f[aa>>2]|0;if(!aa){Z=_;Q=46;break}}}else{Z=_;Q=46}}else{Z=0;Q=46}while(0);if((Q|0)==46){Q=0;M=ln(20)|0;J=M+8|0;f[J>>2]=E;f[J+4>>2]=F;f[M+16>>2]=z;f[M+4>>2]=D;f[M>>2]=0;ca=$(((f[s>>2]|0)+1|0)>>>0);da=$(q>>>0);ea=$(n[k>>2]);do if(G|$(ea*da)>>0<3|(q+-1&q|0)!=0)&1;H=~~$(W($(ca/ea)))>>>0;Yh(g,J>>>0>>0?H:J);J=f[m>>2]|0;H=J+-1|0;if(!(H&J)){fa=J;ga=H&D;break}if(D>>>0>>0){fa=J;ga=D}else{fa=J;ga=(D>>>0)%(J>>>0)|0}}else{fa=q;ga=Z}while(0);D=(f[g>>2]|0)+(ga<<2)|0;G=f[D>>2]|0;if(!G){f[M>>2]=f[t>>2];f[t>>2]=M;f[D>>2]=t;D=f[M>>2]|0;if(D|0){F=f[D+4>>2]|0;D=fa+-1|0;if(D&fa)if(F>>>0>>0)ha=F;else ha=(F>>>0)%(fa>>>0)|0;else ha=F&D;ia=(f[g>>2]|0)+(ha<<2)|0;Q=59}}else{f[M>>2]=f[G>>2];ia=G;Q=59}if((Q|0)==59){Q=0;f[ia>>2]=M}f[s>>2]=(f[s>>2]|0)+1;Q=61}if((Q|0)==61){Q=0;G=v;D=f[G>>2]|0;F=un(D|0,f[G+4>>2]|0,z|0,0)|0;kh((f[f[w>>2]>>2]|0)+F|0,i|0,D|0)|0;D=f[j>>2]|0;f[D+(y<<2)>>2]=z;T=D;U=z+1|0;V=D;X=D;Y=D}D=y+1|0;ja=f[l>>2]|0;if(D>>>0>=ja>>>0)break;d=T;y=D;z=U;A=Y;B=X;C=V;q=f[m>>2]|0}if((U|0)==(ja|0))ka=X;else{X=a+84|0;if(!(b[X>>0]|0)){m=f[a+72>>2]|0;q=f[a+68>>2]|0;C=q;if((m|0)==(q|0))la=T;else{B=m-q>>2;q=0;do{m=C+(q<<2)|0;f[m>>2]=f[V+(f[m>>2]<<2)>>2];q=q+1|0}while(q>>>0>>0);la=T}}else{b[X>>0]=0;X=a+68|0;T=a+72|0;B=f[T>>2]|0;q=f[X>>2]|0;V=B-q>>2;C=q;q=B;if(ja>>>0<=V>>>0)if(ja>>>0>>0?(B=C+(ja<<2)|0,(B|0)!=(q|0)):0){f[T>>2]=q+(~((q+-4-B|0)>>>2)<<2);ma=ja}else ma=ja;else{Ch(X,ja-V|0,1220);ma=f[l>>2]|0}V=f[j>>2]|0;if(!ma)la=V;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[V+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);la=V}}f[l>>2]=U;ka=la}if(!ka)na=U;else{la=f[o>>2]|0;if((la|0)!=(ka|0))f[o>>2]=la+(~((la+-4-ka|0)>>>2)<<2);Oq(ka);na=U}}else na=0;U=f[g+8>>2]|0;if(U|0){ka=U;do{U=ka;ka=f[ka>>2]|0;Oq(U)}while((ka|0)!=0)}ka=f[g>>2]|0;f[g>>2]=0;if(!ka){u=e;return na|0}Oq(ka);u=e;return na|0}function Xb(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+12|0;j=g+32|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=r;z=0;A=0;B=r;C=r;D=0;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=un(f[r>>2]|0,f[r+4>>2]|0,y+z|0,0)|0;r=Vn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8;d[j>>1]=r;G=r&255;F=(r&65535)>>>8;H=F&255;J=((r&255^318)+239<<16>>16^F)&65535;F=(D|0)==0;a:do if(!F){K=D+-1|0;L=(K&D|0)==0;if(!L)if(D>>>0>J>>>0)M=J;else M=(J>>>0)%(D>>>0)|0;else M=K&J;N=f[(f[i>>2]|0)+(M<<2)>>2]|0;do if(N|0?(O=f[N>>2]|0,O|0):0){b:do if(L){P=O;while(1){Q=f[P+4>>2]|0;R=(Q|0)==(J|0);if(!(R|(Q&K|0)==(M|0))){S=27;break b}if((R?(R=P+8|0,(b[R>>0]|0)==G<<24>>24):0)?(b[R+1>>0]|0)==H<<24>>24:0){T=P;S=26;break b}P=f[P>>2]|0;if(!P){S=27;break}}}else{P=O;while(1){R=f[P+4>>2]|0;if((R|0)==(J|0)){Q=P+8|0;if((b[Q>>0]|0)==G<<24>>24?(b[Q+1>>0]|0)==H<<24>>24:0){T=P;S=26;break b}}else{if(R>>>0>>0)U=R;else U=(R>>>0)%(D>>>0)|0;if((U|0)!=(M|0)){S=27;break b}}P=f[P>>2]|0;if(!P){S=27;break}}}while(0);if((S|0)==26){S=0;f[E+(z<<2)>>2]=f[T+12>>2];V=e;X=A;Y=C;Z=B;_=E;break a}else if((S|0)==27){S=0;if(F){aa=0;S=46;break a}else break}}while(0);K=D+-1|0;L=(K&D|0)==0;if(!L)if(D>>>0>J>>>0)ba=J;else ba=(J>>>0)%(D>>>0)|0;else ba=K&J;N=f[(f[i>>2]|0)+(ba<<2)>>2]|0;if((N|0)!=0?(O=f[N>>2]|0,(O|0)!=0):0){if(L){L=O;while(1){N=f[L+4>>2]|0;if(!((N|0)==(J|0)|(N&K|0)==(ba|0))){aa=ba;S=46;break a}N=L+8|0;if((b[N>>0]|0)==G<<24>>24?(b[N+1>>0]|0)==H<<24>>24:0){S=61;break a}L=f[L>>2]|0;if(!L){aa=ba;S=46;break a}}}else ca=O;while(1){L=f[ca+4>>2]|0;if((L|0)!=(J|0)){if(L>>>0>>0)da=L;else da=(L>>>0)%(D>>>0)|0;if((da|0)!=(ba|0)){aa=ba;S=46;break a}}L=ca+8|0;if((b[L>>0]|0)==G<<24>>24?(b[L+1>>0]|0)==H<<24>>24:0){S=61;break a}ca=f[ca>>2]|0;if(!ca){aa=ba;S=46;break}}}else{aa=ba;S=46}}else{aa=0;S=46}while(0);if((S|0)==46){S=0;H=ln(16)|0;G=H+8|0;b[G>>0]=r;b[G+1>>0]=r>>8;f[H+12>>2]=A;f[H+4>>2]=J;f[H>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(D>>>0);ga=$(n[l>>2]);do if(F|$(ga*fa)>>0<3|(D+-1&D|0)!=0)&1;O=~~$(W($(ea/ga)))>>>0;$h(i,G>>>0>>0?O:G);G=f[o>>2]|0;O=G+-1|0;if(!(O&G)){ha=G;ia=O&J;break}if(G>>>0>J>>>0){ha=G;ia=J}else{ha=G;ia=(J>>>0)%(G>>>0)|0}}else{ha=D;ia=aa}while(0);J=(f[i>>2]|0)+(ia<<2)|0;F=f[J>>2]|0;if(!F){f[H>>2]=f[v>>2];f[v>>2]=H;f[J>>2]=v;J=f[H>>2]|0;if(J|0){r=f[J+4>>2]|0;J=ha+-1|0;if(J&ha)if(r>>>0>>0)ja=r;else ja=(r>>>0)%(ha>>>0)|0;else ja=r&J;ka=(f[i>>2]|0)+(ja<<2)|0;S=59}}else{f[H>>2]=f[F>>2];ka=F;S=59}if((S|0)==59){S=0;f[ka>>2]=H}f[t>>2]=(f[t>>2]|0)+1;S=61}if((S|0)==61){S=0;F=w;J=f[F>>2]|0;r=un(J|0,f[F+4>>2]|0,A|0,0)|0;kh((f[f[x>>2]>>2]|0)+r|0,j|0,J|0)|0;J=f[k>>2]|0;f[J+(z<<2)>>2]=A;V=J;X=A+1|0;Y=J;Z=J;_=J}J=z+1|0;la=f[m>>2]|0;if(J>>>0>=la>>>0)break;e=V;z=J;A=X;B=Z;C=Y;D=f[o>>2]|0;E=_}if((X|0)==(la|0))ma=Z;else{Z=a+84|0;if(!(b[Z>>0]|0)){_=f[a+72>>2]|0;E=f[a+68>>2]|0;o=E;if((_|0)==(E|0))na=V;else{D=_-E>>2;E=0;do{_=o+(E<<2)|0;f[_>>2]=f[Y+(f[_>>2]<<2)>>2];E=E+1|0}while(E>>>0>>0);na=V}}else{b[Z>>0]=0;Z=a+68|0;V=a+72|0;D=f[V>>2]|0;E=f[Z>>2]|0;Y=D-E>>2;o=E;E=D;if(la>>>0<=Y>>>0)if(la>>>0>>0?(D=o+(la<<2)|0,(D|0)!=(E|0)):0){f[V>>2]=E+(~((E+-4-D|0)>>>2)<<2);oa=la}else oa=la;else{Ch(Z,la-Y|0,1220);oa=f[m>>2]|0}Y=f[k>>2]|0;if(!oa)na=Y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[Y+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);na=Y}}f[m>>2]=X;ma=na}if(!ma)pa=X;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);Oq(ma);pa=X}}else pa=0;X=f[i+8>>2]|0;if(X|0){ma=X;do{X=ma;ma=f[ma>>2]|0;Oq(X)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}Oq(ma);u=g;return pa|0}function Yb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;c=u;u=u+16|0;d=c+8|0;e=c;g=c+4|0;h=a+16|0;i=f[h>>2]|0;j=a+20|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k+(~((k+-4-i|0)>>>2)<<2)|0;f[j>>2]=m;l=m}m=a+24|0;if((l|0)==(f[m>>2]|0)){Ri(h,b);n=f[h>>2]|0;o=f[j>>2]|0}else{f[l>>2]=f[b>>2];k=l+4|0;f[j>>2]=k;n=i;o=k}k=f[a+8>>2]|0;i=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(i|0)/12|0;if((n|0)==(o|0)){u=c;return 1}n=a+28|0;l=(i|0)>0;i=a+164|0;p=a+12|0;q=a+76|0;r=a+80|0;s=a+72|0;t=a+200|0;v=a+320|0;w=a+152|0;x=a+84|0;y=a+324|0;z=a+292|0;A=a+304|0;B=a+316|0;C=a+328|0;D=a+336|0;E=a+332|0;F=a+168|0;G=a+140|0;H=a+120|0;I=o;do{o=f[I+-4>>2]|0;f[b>>2]=o;a:do if((o|0)!=-1?(J=(o>>>0)/3|0,K=f[n>>2]|0,(f[K+(J>>>5<<2)>>2]&1<<(J&31)|0)==0):0){if(l){J=0;L=K;b:while(1){K=J+1|0;f[i>>2]=(f[i>>2]|0)+1;M=f[b>>2]|0;N=(M|0)==-1?-1:(M>>>0)/3|0;M=L+(N>>>5<<2)|0;f[M>>2]=1<<(N&31)|f[M>>2];M=f[q>>2]|0;if((M|0)==(f[r>>2]|0))Ri(s,b);else{f[M>>2]=f[b>>2];f[q>>2]=M+4}f[v>>2]=f[b>>2];M=f[b>>2]|0;if((M|0)==-1)O=-1;else O=f[(f[f[p>>2]>>2]|0)+(M<<2)>>2]|0;P=(f[(f[w>>2]|0)+(O<<2)>>2]|0)!=-1;Q=(f[x>>2]|0)+(O>>>5<<2)|0;R=1<<(O&31);S=f[Q>>2]|0;do if(!(S&R)){f[Q>>2]=S|R;if(P){T=f[b>>2]|0;U=38;break}f[y>>2]=(f[y>>2]|0)+1;V=f[v>>2]|0;W=V+1|0;do if((V|0)!=-1){X=((W>>>0)%3|0|0)==0?V+-2|0:W;if(!((V>>>0)%3|0)){Y=V+2|0;Z=X;break}else{Y=V+-1|0;Z=X;break}}else{Y=-1;Z=-1}while(0);V=f[z>>2]|0;W=f[A>>2]|0;X=W+(f[V+(Z<<2)>>2]<<2)|0;_=f[X>>2]|0;f[X>>2]=_+-1;X=W+(f[V+(Y<<2)>>2]<<2)|0;f[X>>2]=(f[X>>2]|0)+-1;X=f[B>>2]|0;if((X|0)!=-1){V=f[C>>2]|0;if((_|0)<(V|0))$=V;else{W=f[E>>2]|0;$=(_|0)>(W|0)?W:_}_=$-V|0;V=f[D>>2]|0;W=f[3724+(X<<2)>>2]|0;f[d>>2]=W;X=V+(_*12|0)+4|0;aa=f[X>>2]|0;if(aa>>>0<(f[V+(_*12|0)+8>>2]|0)>>>0){f[aa>>2]=W;f[X>>2]=aa+4}else Ri(V+(_*12|0)|0,d)}f[B>>2]=0;_=f[b>>2]|0;V=_+1|0;if((_|0)!=-1?(aa=((V>>>0)%3|0|0)==0?_+-2|0:V,(aa|0)!=-1):0)ba=f[(f[(f[p>>2]|0)+12>>2]|0)+(aa<<2)>>2]|0;else ba=-1;f[b>>2]=ba}else{T=M;U=38}while(0);if((U|0)==38){U=0;M=T+1|0;if((T|0)==-1){U=43;break}R=((M>>>0)%3|0|0)==0?T+-2|0:M;if((R|0)==-1)ca=-1;else ca=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;f[e>>2]=ca;R=(((T>>>0)%3|0|0)==0?2:-1)+T|0;if((R|0)==-1)da=-1;else da=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;R=(ca|0)==-1;S=R?-1:(ca>>>0)/3|0;ea=(da|0)==-1;fa=ea?-1:(da>>>0)/3|0;Q=((M>>>0)%3|0|0)==0?T+-2|0:M;if(((Q|0)!=-1?(M=f[(f[p>>2]|0)+12>>2]|0,aa=f[M+(Q<<2)>>2]|0,(aa|0)!=-1):0)?(Q=(aa>>>0)/3|0,aa=f[n>>2]|0,(f[aa+(Q>>>5<<2)>>2]&1<<(Q&31)|0)==0):0){Q=(((T>>>0)%3|0|0)==0?2:-1)+T|0;do if((Q|0)!=-1){V=f[M+(Q<<2)>>2]|0;if((V|0)==-1)break;_=(V>>>0)/3|0;if(!(f[aa+(_>>>5<<2)>>2]&1<<(_&31))){U=62;break b}}while(0);if(!ea)xf(a,f[i>>2]|0,N,0,fa);nd(t,3);ga=f[e>>2]|0}else{if(!R){xf(a,f[i>>2]|0,N,1,S);aa=f[b>>2]|0;if((aa|0)==-1){U=52;break}else ha=aa}else ha=T;aa=(((ha>>>0)%3|0|0)==0?2:-1)+ha|0;if((aa|0)==-1){U=52;break}Q=f[(f[(f[p>>2]|0)+12>>2]|0)+(aa<<2)>>2]|0;if((Q|0)==-1){U=52;break}aa=(Q>>>0)/3|0;if(f[(f[n>>2]|0)+(aa>>>5<<2)>>2]&1<<(aa&31)|0){U=52;break}nd(t,5);ga=da}f[b>>2]=ga}if((K|0)>=(k|0))break a;J=K;L=f[n>>2]|0}do if((U|0)==43){U=0;f[e>>2]=-1;U=54}else if((U|0)==52){U=0;if(ea)U=54;else{xf(a,f[i>>2]|0,N,0,fa);U=54}}else if((U|0)==62){U=0;nd(t,1);f[F>>2]=(f[F>>2]|0)+1;if(P?(L=f[(f[w>>2]|0)+(O<<2)>>2]|0,(1<<(L&31)&f[(f[G>>2]|0)+(L>>>5<<2)>>2]|0)==0):0){f[g>>2]=f[b>>2];f[d>>2]=f[g>>2];Pe(a,d,0)|0}L=f[i>>2]|0;f[d>>2]=N;J=je(H,d)|0;f[J>>2]=L;L=f[j>>2]|0;f[L+-4>>2]=da;if((L|0)==(f[m>>2]|0)){Ri(h,e);break}else{f[L>>2]=f[e>>2];f[j>>2]=L+4;break}}while(0);if((U|0)==54){U=0;nd(t,7);f[j>>2]=(f[j>>2]|0)+-4}}}else U=11;while(0);if((U|0)==11){U=0;f[j>>2]=I+-4}I=f[j>>2]|0}while((f[h>>2]|0)!=(I|0));u=c;return 1}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){u=c;return}h=(g>>>0)/3|0;i=a+12|0;if(f[(f[i>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0){u=c;return}h=a+56|0;j=f[h>>2]|0;k=a+60|0;l=f[k>>2]|0;if((l|0)==(j|0))m=j;else{n=l+(~((l+-4-j|0)>>>2)<<2)|0;f[k>>2]=n;m=n}n=a+64|0;if((m|0)==(f[n>>2]|0))Ri(h,b);else{f[m>>2]=g;f[k>>2]=m+4}m=f[a>>2]|0;g=f[b>>2]|0;j=g+1|0;do if((g|0)!=-1){l=f[m+28>>2]|0;o=f[l+((((j>>>0)%3|0|0)==0?g+-2|0:j)<<2)>>2]|0;if(!((g>>>0)%3|0)){p=o;q=g+2|0;r=l;break}else{p=o;q=g+-1|0;r=l;break}}else{l=f[m+28>>2]|0;p=f[l+-4>>2]|0;q=-1;r=l}while(0);m=f[r+(q<<2)>>2]|0;q=a+24|0;r=f[q>>2]|0;g=r+(p>>>5<<2)|0;j=1<<(p&31);l=f[g>>2]|0;if(!(l&j)){f[g>>2]=l|j;j=f[b>>2]|0;l=j+1|0;if((j|0)==-1)s=-1;else s=((l>>>0)%3|0|0)==0?j+-2|0:l;f[e>>2]=s;l=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((s>>>0)/3|0)*12|0)+(((s>>>0)%3|0)<<2)>>2]|0;s=f[a+48>>2]|0;f[d>>2]=l;j=f[s+4>>2]|0;s=j+4|0;g=f[s>>2]|0;if((g|0)==(f[j+8>>2]|0))Ri(j,d);else{f[g>>2]=l;f[s>>2]=g+4}g=a+40|0;s=f[g>>2]|0;l=s+4|0;j=f[l>>2]|0;if((j|0)==(f[s+8>>2]|0)){Ri(s,e);t=f[g>>2]|0}else{f[j>>2]=f[e>>2];f[l>>2]=j+4;t=s}s=t+24|0;f[(f[t+12>>2]|0)+(p<<2)>>2]=f[s>>2];f[s>>2]=(f[s>>2]|0)+1;v=f[q>>2]|0}else v=r;r=v+(m>>>5<<2)|0;v=1<<(m&31);s=f[r>>2]|0;if(!(s&v)){f[r>>2]=s|v;v=f[b>>2]|0;do if((v|0)!=-1)if(!((v>>>0)%3|0)){w=v+2|0;break}else{w=v+-1|0;break}else w=-1;while(0);f[e>>2]=w;v=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((w>>>0)/3|0)*12|0)+(((w>>>0)%3|0)<<2)>>2]|0;w=f[a+48>>2]|0;f[d>>2]=v;s=f[w+4>>2]|0;w=s+4|0;r=f[w>>2]|0;if((r|0)==(f[s+8>>2]|0))Ri(s,d);else{f[r>>2]=v;f[w>>2]=r+4}r=a+40|0;w=f[r>>2]|0;v=w+4|0;s=f[v>>2]|0;if((s|0)==(f[w+8>>2]|0)){Ri(w,e);x=f[r>>2]|0}else{f[s>>2]=f[e>>2];f[v>>2]=s+4;x=w}w=x+24|0;f[(f[x+12>>2]|0)+(m<<2)>>2]=f[w>>2];f[w>>2]=(f[w>>2]|0)+1}w=f[h>>2]|0;m=f[k>>2]|0;if((w|0)==(m|0)){u=c;return}x=a+44|0;s=a+48|0;v=a+40|0;r=m;m=w;while(1){w=f[r+-4>>2]|0;f[b>>2]=w;p=(w>>>0)/3|0;if((w|0)!=-1?(w=f[i>>2]|0,(f[w+(p>>>5<<2)>>2]&1<<(p&31)|0)==0):0){t=p;p=w;w=f[a>>2]|0;a:while(1){j=p+(t>>>5<<2)|0;f[j>>2]=f[j>>2]|1<<(t&31);j=f[b>>2]|0;l=f[(f[w+28>>2]|0)+(j<<2)>>2]|0;g=(f[q>>2]|0)+(l>>>5<<2)|0;o=1<<(l&31);y=f[g>>2]|0;if(!(o&y)){z=f[(f[w+40>>2]|0)+(l<<2)>>2]|0;if((z|0)==-1)A=1;else{B=f[(f[f[w+64>>2]>>2]|0)+(z<<2)>>2]|0;A=(1<<(B&31)&f[(f[w+12>>2]|0)+(B>>>5<<2)>>2]|0)!=0}f[g>>2]=y|o;o=f[b>>2]|0;f[e>>2]=o;y=f[(f[(f[x>>2]|0)+96>>2]|0)+(((o>>>0)/3|0)*12|0)+(((o>>>0)%3|0)<<2)>>2]|0;o=f[s>>2]|0;f[d>>2]=y;g=f[o+4>>2]|0;o=g+4|0;B=f[o>>2]|0;if((B|0)==(f[g+8>>2]|0))Ri(g,d);else{f[B>>2]=y;f[o>>2]=B+4}B=f[v>>2]|0;o=B+4|0;y=f[o>>2]|0;if((y|0)==(f[B+8>>2]|0)){Ri(B,e);C=f[v>>2]|0}else{f[y>>2]=f[e>>2];f[o>>2]=y+4;C=B}B=C+24|0;f[(f[C+12>>2]|0)+(l<<2)>>2]=f[B>>2];f[B>>2]=(f[B>>2]|0)+1;B=f[a>>2]|0;l=f[b>>2]|0;if(A){D=l;E=B;F=57}else{y=l+1|0;do if((l|0)==-1)G=-1;else{o=((y>>>0)%3|0|0)==0?l+-2|0:y;if((o|0)==-1){G=-1;break}if(f[(f[B>>2]|0)+(o>>>5<<2)>>2]&1<<(o&31)|0){G=-1;break}G=f[(f[(f[B+64>>2]|0)+12>>2]|0)+(o<<2)>>2]|0}while(0);f[b>>2]=G;H=(G>>>0)/3|0;I=B}}else{D=j;E=w;F=57}if((F|0)==57){F=0;y=D+1|0;if((D|0)==-1){F=58;break}l=((y>>>0)%3|0|0)==0?D+-2|0:y;if((l|0)!=-1?(f[(f[E>>2]|0)+(l>>>5<<2)>>2]&1<<(l&31)|0)==0:0)J=f[(f[(f[E+64>>2]|0)+12>>2]|0)+(l<<2)>>2]|0;else J=-1;f[d>>2]=J;l=(((D>>>0)%3|0|0)==0?2:-1)+D|0;if((l|0)!=-1?(f[(f[E>>2]|0)+(l>>>5<<2)>>2]&1<<(l&31)|0)==0:0)K=f[(f[(f[E+64>>2]|0)+12>>2]|0)+(l<<2)>>2]|0;else K=-1;l=(J|0)==-1;y=(J>>>0)/3|0;o=l?-1:y;g=(K|0)==-1;z=(K>>>0)/3|0;L=g?-1:z;do if(!l){M=f[i>>2]|0;if(f[M+(o>>>5<<2)>>2]&1<<(o&31)|0){F=67;break}if(g){N=J;O=y;break}if(!(f[M+(L>>>5<<2)>>2]&1<<(L&31))){F=72;break a}else{N=J;O=y}}else F=67;while(0);if((F|0)==67){F=0;if(g){F=69;break}if(!(f[(f[i>>2]|0)+(L>>>5<<2)>>2]&1<<(L&31))){N=K;O=z}else{F=69;break}}f[b>>2]=N;H=O;I=E}t=H;p=f[i>>2]|0;w=I}do if((F|0)==58){F=0;f[d>>2]=-1;F=69}else if((F|0)==72){F=0;w=f[k>>2]|0;f[w+-4>>2]=K;if((w|0)==(f[n>>2]|0)){Ri(h,d);P=f[k>>2]|0;break}else{f[w>>2]=f[d>>2];p=w+4|0;f[k>>2]=p;P=p;break}}while(0);if((F|0)==69){F=0;p=(f[k>>2]|0)+-4|0;f[k>>2]=p;P=p}Q=f[h>>2]|0;R=P}else{p=r+-4|0;f[k>>2]=p;Q=m;R=p}if((Q|0)==(R|0))break;else{r=R;m=Q}}u=c;return}function _b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=Oa,K=Oa,L=Oa,M=0,N=0,O=0,P=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=Id(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];lf(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;Fi(j,8);l=d;d=l;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=l+4|0;l=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;d=f[j>>2]|0;o=d;b[o>>0]=m;b[o+1>>0]=m>>8;b[o+2>>0]=m>>16;b[o+3>>0]=m>>24;m=d+4|0;b[m>>0]=l;b[m+1>>0]=l>>8;b[m+2>>0]=l>>16;b[m+3>>0]=l>>24;pj(i,c);c=i+12|0;f[c>>2]=0;l=i+16|0;f[l>>2]=0;f[i+20>>2]=0;m=f[k>>2]|0;d=f[j>>2]|0;o=m-d|0;if(!o){p=d;q=m;r=0}else{Fi(c,o);p=f[j>>2]|0;q=f[k>>2]|0;r=f[c>>2]|0}kh(r|0,p|0,q-p|0)|0;p=i+11|0;q=b[p>>0]|0;r=q<<24>>24<0;c=r?f[i>>2]|0:i;o=r?f[i+4>>2]|0:q&255;if(o>>>0>3){q=c;r=o;m=o;while(1){d=X(h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24,1540483477)|0;r=(X(d>>>24^d,1540483477)|0)^(X(r,1540483477)|0);m=m+-4|0;if(m>>>0<=3)break;else q=q+4|0}q=o+-4|0;m=q&-4;s=q-m|0;t=c+(m+4)|0;v=r}else{s=o;t=c;v=o}switch(s|0){case 3:{w=h[t+2>>0]<<16^v;x=10;break}case 2:{w=v;x=10;break}case 1:{y=v;x=11;break}default:z=v}if((x|0)==10){y=h[t+1>>0]<<8^w;x=11}if((x|0)==11)z=X(y^h[t>>0],1540483477)|0;t=X(z>>>13^z,1540483477)|0;z=t>>>15^t;t=a+4|0;y=f[t>>2]|0;w=(y|0)==0;a:do if(!w){v=y+-1|0;s=(v&y|0)==0;if(!s)if(z>>>0>>0)A=z;else A=(z>>>0)%(y>>>0)|0;else A=z&v;r=f[(f[a>>2]|0)+(A<<2)>>2]|0;if((r|0)!=0?(m=f[r>>2]|0,(m|0)!=0):0){r=(o|0)==0;if(s){if(r){s=m;while(1){q=f[s+4>>2]|0;if(!((q|0)==(z|0)|(q&v|0)==(A|0))){B=A;x=52;break a}q=b[s+8+11>>0]|0;if(!((q<<24>>24<0?f[s+12>>2]|0:q&255)|0))break a;s=f[s>>2]|0;if(!s){B=A;x=52;break a}}}else C=m;while(1){s=f[C+4>>2]|0;if(!((s|0)==(z|0)|(s&v|0)==(A|0))){B=A;x=52;break a}s=C+8|0;q=b[s+11>>0]|0;d=q<<24>>24<0;D=q&255;do if(((d?f[C+12>>2]|0:D)|0)==(o|0)){q=f[s>>2]|0;if(d)if(!(Vk(q,c,o)|0))break a;else break;if((b[c>>0]|0)==(q&255)<<24>>24){q=s;E=D;F=c;do{E=E+-1|0;q=q+1|0;if(!E)break a;F=F+1|0}while((b[q>>0]|0)==(b[F>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){B=A;x=52;break a}}}if(r){v=m;while(1){D=f[v+4>>2]|0;if((D|0)!=(z|0)){if(D>>>0>>0)G=D;else G=(D>>>0)%(y>>>0)|0;if((G|0)!=(A|0)){B=A;x=52;break a}}D=b[v+8+11>>0]|0;if(!((D<<24>>24<0?f[v+12>>2]|0:D&255)|0))break a;v=f[v>>2]|0;if(!v){B=A;x=52;break a}}}else H=m;while(1){v=f[H+4>>2]|0;if((v|0)!=(z|0)){if(v>>>0>>0)I=v;else I=(v>>>0)%(y>>>0)|0;if((I|0)!=(A|0)){B=A;x=52;break a}}v=H+8|0;r=b[v+11>>0]|0;D=r<<24>>24<0;s=r&255;do if(((D?f[H+12>>2]|0:s)|0)==(o|0)){r=f[v>>2]|0;if(D)if(!(Vk(r,c,o)|0))break a;else break;if((b[c>>0]|0)==(r&255)<<24>>24){r=v;d=s;F=c;do{d=d+-1|0;r=r+1|0;if(!d)break a;F=F+1|0}while((b[r>>0]|0)==(b[F>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){B=A;x=52;break}}}else{B=A;x=52}}else{B=0;x=52}while(0);if((x|0)==52){oi(g,a,z,i);x=a+12|0;J=$(((f[x>>2]|0)+1|0)>>>0);K=$(y>>>0);L=$(n[a+16>>2]);do if(w|$(L*K)>>0<3|(y+-1&y|0)!=0)&1;H=~~$(W($(J/L)))>>>0;ei(a,A>>>0>>0?H:A);A=f[t>>2]|0;H=A+-1|0;if(!(H&A)){M=A;N=H&z;break}if(z>>>0>>0){M=A;N=z}else{M=A;N=(z>>>0)%(A>>>0)|0}}else{M=y;N=B}while(0);B=f[(f[a>>2]|0)+(N<<2)>>2]|0;if(!B){y=a+8|0;f[f[g>>2]>>2]=f[y>>2];f[y>>2]=f[g>>2];f[(f[a>>2]|0)+(N<<2)>>2]=y;y=f[g>>2]|0;N=f[y>>2]|0;if(!N)O=g;else{z=f[N+4>>2]|0;N=M+-1|0;if(N&M)if(z>>>0>>0)P=z;else P=(z>>>0)%(M>>>0)|0;else P=z&N;f[(f[a>>2]|0)+(P<<2)>>2]=y;O=g}}else{f[f[g>>2]>>2]=f[B>>2];f[B>>2]=f[g>>2];O=g}f[x>>2]=(f[x>>2]|0)+1;f[O>>2]=0}O=f[i+12>>2]|0;if(O|0){if((f[l>>2]|0)!=(O|0))f[l>>2]=O;Oq(O)}if((b[p>>0]|0)<0)Oq(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;Oq(i);u=e;return}function $b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=(o|0)==-1;if(p)q=-1;else q=f[(f[n>>2]|0)+(o<<2)>>2]|0;n=a+20|0;r=f[n>>2]|0;s=f[r>>2]|0;if((f[r+4>>2]|0)-s>>2>>>0<=q>>>0)aq(r);r=a+8|0;t=f[(f[r>>2]|0)+(f[s+(q<<2)>>2]<<2)>>2]|0;q=a+4|0;s=f[q>>2]|0;if(!(b[s+84>>0]|0))v=f[(f[s+68>>2]|0)+(t<<2)>>2]|0;else v=t;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=v;v=b[s+24>>0]|0;f[g>>2]=f[h>>2];vb(s,g,v,j)|0;v=a+28|0;a=(f[v>>2]|0)==0;a:do if(!p){s=k+8|0;t=j+8|0;w=k+16|0;x=j+16|0;y=l+8|0;z=l+16|0;A=o;B=o;C=0;D=0;E=0;F=0;G=0;H=0;J=a;K=o;while(1){do if(J){L=K+1|0;if((K|0)==-1){M=A;N=-1;O=-1;P=-1;break}Q=((L>>>0)%3|0|0)==0?K+-2|0:L;if((A|0)!=-1)if(!((A>>>0)%3|0)){R=A;S=A+2|0;T=Q;U=A;V=19;break}else{R=A;S=A+-1|0;T=Q;U=A;V=19;break}else{R=-1;S=-1;T=Q;U=-1;V=19}}else{Q=B+1|0;L=((Q>>>0)%3|0|0)==0?B+-2|0:Q;if(!((B>>>0)%3|0)){R=A;S=B+2|0;T=L;U=K;V=19;break}else{R=A;S=B+-1|0;T=L;U=K;V=19;break}}while(0);if((V|0)==19){V=0;if((T|0)==-1){M=R;N=-1;O=S;P=U}else{M=R;N=f[(f[f[m>>2]>>2]|0)+(T<<2)>>2]|0;O=S;P=U}}W=f[n>>2]|0;L=f[W>>2]|0;if((f[W+4>>2]|0)-L>>2>>>0<=N>>>0){V=22;break}Q=f[(f[r>>2]|0)+(f[L+(N<<2)>>2]<<2)>>2]|0;L=f[q>>2]|0;if(!(b[L+84>>0]|0))X=f[(f[L+68>>2]|0)+(Q<<2)>>2]|0;else X=Q;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=X;Q=b[L+24>>0]|0;f[g>>2]=f[h>>2];vb(L,g,Q,k)|0;if((O|0)==-1)Y=-1;else Y=f[(f[f[m>>2]>>2]|0)+(O<<2)>>2]|0;Z=f[n>>2]|0;Q=f[Z>>2]|0;if((f[Z+4>>2]|0)-Q>>2>>>0<=Y>>>0){V=28;break}L=f[(f[r>>2]|0)+(f[Q+(Y<<2)>>2]<<2)>>2]|0;Q=f[q>>2]|0;if(!(b[Q+84>>0]|0))_=f[(f[Q+68>>2]|0)+(L<<2)>>2]|0;else _=L;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=_;L=b[Q+24>>0]|0;f[g>>2]=f[h>>2];vb(Q,g,L,l)|0;L=k;Q=j;$=f[Q>>2]|0;aa=f[Q+4>>2]|0;Q=Xn(f[L>>2]|0,f[L+4>>2]|0,$|0,aa|0)|0;L=I;ba=s;ca=t;da=f[ca>>2]|0;ea=f[ca+4>>2]|0;ca=Xn(f[ba>>2]|0,f[ba+4>>2]|0,da|0,ea|0)|0;ba=I;fa=w;ga=x;ha=f[ga>>2]|0;ia=f[ga+4>>2]|0;ga=Xn(f[fa>>2]|0,f[fa+4>>2]|0,ha|0,ia|0)|0;fa=I;ja=l;ka=Xn(f[ja>>2]|0,f[ja+4>>2]|0,$|0,aa|0)|0;aa=I;$=y;ja=Xn(f[$>>2]|0,f[$+4>>2]|0,da|0,ea|0)|0;ea=I;da=z;$=Xn(f[da>>2]|0,f[da+4>>2]|0,ha|0,ia|0)|0;ia=I;ha=un($|0,ia|0,ca|0,ba|0)|0;da=I;la=un(ja|0,ea|0,ga|0,fa|0)|0;ma=I;na=un(ka|0,aa|0,ga|0,fa|0)|0;fa=I;ga=un($|0,ia|0,Q|0,L|0)|0;ia=I;$=un(ja|0,ea|0,Q|0,L|0)|0;L=I;Q=un(ka|0,aa|0,ca|0,ba|0)|0;ba=I;ca=Xn(C|0,D|0,la|0,ma|0)|0;ma=Vn(ca|0,I|0,ha|0,da|0)|0;da=I;ha=Vn(na|0,fa|0,E|0,F|0)|0;fa=Xn(ha|0,I|0,ga|0,ia|0)|0;ia=I;ga=Xn(G|0,H|0,Q|0,ba|0)|0;ba=Vn(ga|0,I|0,$|0,L|0)|0;L=I;Hh(i);B=f[c>>2]|0;$=(f[v>>2]|0)==0;if((B|0)==-1){oa=$;pa=da;qa=ma;ra=ia;sa=fa;ta=L;ua=ba;break a}else{A=M;C=ma;D=da;E=fa;F=ia;G=ba;H=L;J=$;K=P}}if((V|0)==22)aq(W);else if((V|0)==28)aq(Z)}else{oa=a;pa=0;qa=0;ra=0;sa=0;ta=0;ua=0}while(0);a=(pa|0)>-1|(pa|0)==-1&qa>>>0>4294967295;Z=Xn(0,0,qa|0,pa|0)|0;V=a?pa:I;W=(ra|0)>-1|(ra|0)==-1&sa>>>0>4294967295;P=Xn(0,0,sa|0,ra|0)|0;M=W?ra:I;v=(ta|0)>-1|(ta|0)==-1&ua>>>0>4294967295;c=Xn(0,0,ua|0,ta|0)|0;i=Vn((W?sa:P)|0,M|0,(v?ua:c)|0,(v?ta:I)|0)|0;v=Vn(i|0,I|0,(a?qa:Z)|0,V|0)|0;V=I;if(oa){if((v|0)<=536870912){va=qa;wa=sa;xa=ua;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}oa=Yn(v|0,V|0,29)|0;Z=oa&7;oa=Ik(qa|0,pa|0,Z|0,0)|0;a=Ik(sa|0,ra|0,Z|0,0)|0;i=Ik(ua|0,ta|0,Z|0,0)|0;va=oa;wa=a;xa=i;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}else{if(!((V|0)>0|(V|0)==0&v>>>0>536870912)){va=qa;wa=sa;xa=ua;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}i=Yn(v|0,V|0,29)|0;V=I;v=Ik(qa|0,pa|0,i|0,V|0)|0;pa=Ik(sa|0,ra|0,i|0,V|0)|0;ra=Ik(ua|0,ta|0,i|0,V|0)|0;va=v;wa=pa;xa=ra;f[d>>2]=va;ya=d+4|0;f[ya>>2]=wa;za=d+8|0;f[za>>2]=xa;u=e;return}}function ac(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=Oa,M=Oa,N=Oa,O=0,P=0,Q=0,R=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=Id(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];lf(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;l=d+11|0;m=b[l>>0]|0;o=d+4|0;p=f[o>>2]|0;q=m<<24>>24<0?p:m&255;if(!q){r=m;s=p;t=0}else{Fi(j,q);r=b[l>>0]|0;s=f[o>>2]|0;t=f[j>>2]|0}o=r<<24>>24<0;kh(t|0,(o?f[d>>2]|0:d)|0,(o?s:r&255)|0)|0;pj(i,c);c=i+12|0;f[c>>2]=0;r=i+16|0;f[r>>2]=0;f[i+20>>2]=0;s=f[k>>2]|0;o=f[j>>2]|0;d=s-o|0;if(!d){v=o;w=s;x=0}else{Fi(c,d);v=f[j>>2]|0;w=f[k>>2]|0;x=f[c>>2]|0}kh(x|0,v|0,w-v|0)|0;v=i+11|0;w=b[v>>0]|0;x=w<<24>>24<0;c=x?f[i>>2]|0:i;d=x?f[i+4>>2]|0:w&255;if(d>>>0>3){w=c;x=d;s=d;while(1){o=X(h[w>>0]|h[w+1>>0]<<8|h[w+2>>0]<<16|h[w+3>>0]<<24,1540483477)|0;x=(X(o>>>24^o,1540483477)|0)^(X(x,1540483477)|0);s=s+-4|0;if(s>>>0<=3)break;else w=w+4|0}w=d+-4|0;s=w&-4;y=w-s|0;z=c+(s+4)|0;A=x}else{y=d;z=c;A=d}switch(y|0){case 3:{B=h[z+2>>0]<<16^A;C=12;break}case 2:{B=A;C=12;break}case 1:{D=A;C=13;break}default:E=A}if((C|0)==12){D=h[z+1>>0]<<8^B;C=13}if((C|0)==13)E=X(D^h[z>>0],1540483477)|0;z=X(E>>>13^E,1540483477)|0;E=z>>>15^z;z=a+4|0;D=f[z>>2]|0;B=(D|0)==0;a:do if(!B){A=D+-1|0;y=(A&D|0)==0;if(!y)if(E>>>0>>0)F=E;else F=(E>>>0)%(D>>>0)|0;else F=E&A;x=f[(f[a>>2]|0)+(F<<2)>>2]|0;if((x|0)!=0?(s=f[x>>2]|0,(s|0)!=0):0){x=(d|0)==0;if(y){if(x){y=s;while(1){w=f[y+4>>2]|0;if(!((w|0)==(E|0)|(w&A|0)==(F|0))){G=F;C=54;break a}w=b[y+8+11>>0]|0;if(!((w<<24>>24<0?f[y+12>>2]|0:w&255)|0))break a;y=f[y>>2]|0;if(!y){G=F;C=54;break a}}}else H=s;while(1){y=f[H+4>>2]|0;if(!((y|0)==(E|0)|(y&A|0)==(F|0))){G=F;C=54;break a}y=H+8|0;w=b[y+11>>0]|0;o=w<<24>>24<0;t=w&255;do if(((o?f[H+12>>2]|0:t)|0)==(d|0)){w=f[y>>2]|0;if(o)if(!(Vk(w,c,d)|0))break a;else break;if((b[c>>0]|0)==(w&255)<<24>>24){w=y;l=t;q=c;do{l=l+-1|0;w=w+1|0;if(!l)break a;q=q+1|0}while((b[w>>0]|0)==(b[q>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){G=F;C=54;break a}}}if(x){A=s;while(1){t=f[A+4>>2]|0;if((t|0)!=(E|0)){if(t>>>0>>0)I=t;else I=(t>>>0)%(D>>>0)|0;if((I|0)!=(F|0)){G=F;C=54;break a}}t=b[A+8+11>>0]|0;if(!((t<<24>>24<0?f[A+12>>2]|0:t&255)|0))break a;A=f[A>>2]|0;if(!A){G=F;C=54;break a}}}else J=s;while(1){A=f[J+4>>2]|0;if((A|0)!=(E|0)){if(A>>>0>>0)K=A;else K=(A>>>0)%(D>>>0)|0;if((K|0)!=(F|0)){G=F;C=54;break a}}A=J+8|0;x=b[A+11>>0]|0;t=x<<24>>24<0;y=x&255;do if(((t?f[J+12>>2]|0:y)|0)==(d|0)){x=f[A>>2]|0;if(t)if(!(Vk(x,c,d)|0))break a;else break;if((b[c>>0]|0)==(x&255)<<24>>24){x=A;o=y;q=c;do{o=o+-1|0;x=x+1|0;if(!o)break a;q=q+1|0}while((b[x>>0]|0)==(b[q>>0]|0))}}while(0);J=f[J>>2]|0;if(!J){G=F;C=54;break}}}else{G=F;C=54}}else{G=0;C=54}while(0);if((C|0)==54){oi(g,a,E,i);C=a+12|0;L=$(((f[C>>2]|0)+1|0)>>>0);M=$(D>>>0);N=$(n[a+16>>2]);do if(B|$(N*M)>>0<3|(D+-1&D|0)!=0)&1;J=~~$(W($(L/N)))>>>0;ei(a,F>>>0>>0?J:F);F=f[z>>2]|0;J=F+-1|0;if(!(J&F)){O=F;P=J&E;break}if(E>>>0>>0){O=F;P=E}else{O=F;P=(E>>>0)%(F>>>0)|0}}else{O=D;P=G}while(0);G=f[(f[a>>2]|0)+(P<<2)>>2]|0;if(!G){D=a+8|0;f[f[g>>2]>>2]=f[D>>2];f[D>>2]=f[g>>2];f[(f[a>>2]|0)+(P<<2)>>2]=D;D=f[g>>2]|0;P=f[D>>2]|0;if(!P)Q=g;else{E=f[P+4>>2]|0;P=O+-1|0;if(P&O)if(E>>>0>>0)R=E;else R=(E>>>0)%(O>>>0)|0;else R=E&P;f[(f[a>>2]|0)+(R<<2)>>2]=D;Q=g}}else{f[f[g>>2]>>2]=f[G>>2];f[G>>2]=f[g>>2];Q=g}f[C>>2]=(f[C>>2]|0)+1;f[Q>>2]=0}Q=f[i+12>>2]|0;if(Q|0){if((f[r>>2]|0)!=(Q|0))f[r>>2]=Q;Oq(Q)}if((b[v>>0]|0)<0)Oq(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;Oq(i);u=e;return}function bc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;d=u;u=u+192|0;e=d+152|0;g=d+144|0;h=d+72|0;i=d;j=d+112|0;k=d+108|0;l=d+104|0;m=a+352|0;if(b[m>>0]|0?(n=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0,((f[n+12>>2]|0)-(f[n+8>>2]|0)|0)>0):0){n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+8|0;o=f[f[n>>2]>>2]|0;f[e>>2]=c;n=o+4|0;p=o+8|0;q=f[p>>2]|0;if((q|0)==(f[o+12>>2]|0))Ri(n,e);else{f[q>>2]=c;f[p>>2]=q+4}q=f[e>>2]|0;r=o+16|0;s=o+20|0;o=f[s>>2]|0;t=f[r>>2]|0;v=o-t>>2;w=t;if((q|0)<(v|0)){x=w;y=q}else{t=q+1|0;f[g>>2]=-1;z=o;if(t>>>0<=v>>>0)if(t>>>0>>0?(o=w+(t<<2)|0,(o|0)!=(z|0)):0){f[s>>2]=z+(~((z+-4-o|0)>>>2)<<2);A=q;B=w}else{A=q;B=w}else{Ch(r,t-v|0,g);A=f[e>>2]|0;B=f[r>>2]|0}x=B;y=A}f[x+(y<<2)>>2]=((f[p>>2]|0)-(f[n>>2]|0)>>2)+-1;C=1;u=d;return C|0}n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+52|0;p=f[(f[(f[n>>2]|0)+84>>2]|0)+(c<<2)>>2]|0;n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+4|0;y=f[(f[(f[n>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;f[g>>2]=-1;n=a+172|0;x=f[a+176>>2]|0;A=f[n>>2]|0;B=A;a:do if((x|0)==(A|0))D=-1;else{r=(x-A|0)/136|0;v=0;while(1){if((f[B+(v*136|0)>>2]|0)==(c|0))break;t=v+1|0;if(t>>>0>>0)v=t;else{D=-1;break a}}f[g>>2]=v;D=v}while(0);b:do if(!(b[m>>0]|0)){A=(f[y+56>>2]|0)==0;do if(!((p|0)==0|A)){if((p|0)==1?b[B+(D*136|0)+28>>0]|0:0)break;x=ln(88)|0;r=f[a+8>>2]|0;t=B+(D*136|0)+104|0;f[x+4>>2]=0;f[x>>2]=3564;w=x+12|0;f[w>>2]=3588;q=x+64|0;f[q>>2]=0;f[x+68>>2]=0;f[x+72>>2]=0;o=x+16|0;z=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(z|0));f[x+76>>2]=r;f[x+80>>2]=t;s=x+84|0;f[s>>2]=0;f[h>>2]=3588;E=h+4|0;F=E+4|0;f[F>>2]=0;f[F+4>>2]=0;f[F+8>>2]=0;f[F+12>>2]=0;f[F+16>>2]=0;f[F+20>>2]=0;F=B+(D*136|0)+4|0;G=i+4|0;f[G>>2]=3588;H=i+56|0;f[H>>2]=0;I=i+60|0;f[I>>2]=0;f[i+64>>2]=0;o=i+8|0;z=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(z|0));f[E>>2]=F;o=f[B+(D*136|0)+68>>2]|0;z=((f[o+4>>2]|0)-(f[o>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;qh(h+8|0,z,e);Va[f[(f[h>>2]|0)+8>>2]&127](h);Df(j,h);Df(e,j);f[i>>2]=f[e+4>>2];z=i+4|0;fg(z,e)|0;f[e>>2]=3588;o=f[e+20>>2]|0;if(o|0)Oq(o);o=f[e+8>>2]|0;if(o|0)Oq(o);f[i+36>>2]=F;f[i+40>>2]=t;f[i+44>>2]=r;f[i+48>>2]=x;f[j>>2]=3588;o=f[j+20>>2]|0;if(o|0)Oq(o);o=f[j+8>>2]|0;if(o|0)Oq(o);f[s>>2]=a+72;f[x+8>>2]=f[i>>2];fg(w,z)|0;z=x+44|0;o=i+36|0;f[z>>2]=f[o>>2];f[z+4>>2]=f[o+4>>2];f[z+8>>2]=f[o+8>>2];f[z+12>>2]=f[o+12>>2];b[z+16>>0]=b[o+16>>0]|0;ng(q,f[H>>2]|0,f[I>>2]|0);o=x;z=f[H>>2]|0;if(z|0){J=f[I>>2]|0;if((J|0)!=(z|0))f[I>>2]=J+(~((J+-4-z|0)>>>2)<<2);Oq(z)}f[G>>2]=3588;z=f[i+24>>2]|0;if(z|0)Oq(z);z=f[i+12>>2]|0;if(z|0)Oq(z);f[h>>2]=3588;z=f[h+20>>2]|0;if(z|0)Oq(z);z=f[h+8>>2]|0;if(z|0)Oq(z);K=0;L=o;M=54;break b}while(0);if(!A){b[B+(D*136|0)+100>>0]=0;N=B+(D*136|0)+104|0;M=26}else M=24}else M=24;while(0);if((M|0)==24){N=a+40|0;M=26}if((M|0)==26){D=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+48|0;do if((mi(f[D>>2]|0)|0)==0?(f[y+56>>2]|0)==0:0){if(b[m>>0]|0?(B=f[a+8>>2]|0,((f[B+12>>2]|0)-(f[B+8>>2]|0)|0)>4):0){M=31;break}gf(e,a,N);O=1;P=f[e>>2]|0}else M=31;while(0);if((M|0)==31){Vd(e,a,N);O=0;P=f[e>>2]|0}if(!P)Q=0;else{K=O;L=P;M=54}}if((M|0)==54){M=f[g>>2]|0;if((M|0)==-1)R=a+68|0;else R=(f[n>>2]|0)+(M*136|0)+132|0;f[R>>2]=K;K=ln(76)|0;f[k>>2]=L;rl(K,k,c);c=K;K=f[k>>2]|0;f[k>>2]=0;if(K|0)Va[f[(f[K>>2]|0)+4>>2]&127](K);K=a+188|0;k=f[K>>2]|0;if((k|0)==(f[a+192>>2]|0))Ri(a+184|0,g);else{f[k>>2]=f[g>>2];f[K>>2]=k+4}k=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0;f[l>>2]=c;a=k+12|0;K=f[a>>2]|0;if(K>>>0<(f[k+16>>2]|0)>>>0){f[l>>2]=0;f[K>>2]=c;f[a>>2]=K+4;S=l}else{Qg(k+8|0,l);S=l}l=f[S>>2]|0;f[S>>2]=0;if(!l)Q=1;else{Va[f[(f[l>>2]|0)+4>>2]&127](l);Q=1}}C=Q;u=d;return C|0}function cc(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;d=u;u=u+192|0;e=d+152|0;g=d+144|0;h=d+72|0;i=d;j=d+112|0;k=d+108|0;l=d+104|0;m=a+288|0;if(b[m>>0]|0?(n=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0,((f[n+12>>2]|0)-(f[n+8>>2]|0)|0)>0):0){n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+8|0;o=f[f[n>>2]>>2]|0;f[e>>2]=c;n=o+4|0;p=o+8|0;q=f[p>>2]|0;if((q|0)==(f[o+12>>2]|0))Ri(n,e);else{f[q>>2]=c;f[p>>2]=q+4}q=f[e>>2]|0;r=o+16|0;s=o+20|0;o=f[s>>2]|0;t=f[r>>2]|0;v=o-t>>2;w=t;if((q|0)<(v|0)){x=w;y=q}else{t=q+1|0;f[g>>2]=-1;z=o;if(t>>>0<=v>>>0)if(t>>>0>>0?(o=w+(t<<2)|0,(o|0)!=(z|0)):0){f[s>>2]=z+(~((z+-4-o|0)>>>2)<<2);A=q;B=w}else{A=q;B=w}else{Ch(r,t-v|0,g);A=f[e>>2]|0;B=f[r>>2]|0}x=B;y=A}f[x+(y<<2)>>2]=((f[p>>2]|0)-(f[n>>2]|0)>>2)+-1;C=1;u=d;return C|0}n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+52|0;p=f[(f[(f[n>>2]|0)+84>>2]|0)+(c<<2)>>2]|0;n=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+4|0;y=f[(f[(f[n>>2]|0)+8>>2]|0)+(c<<2)>>2]|0;f[g>>2]=-1;n=a+172|0;x=f[a+176>>2]|0;A=f[n>>2]|0;B=A;a:do if((x|0)==(A|0))D=-1;else{r=(x-A|0)/136|0;v=0;while(1){if((f[B+(v*136|0)>>2]|0)==(c|0))break;t=v+1|0;if(t>>>0>>0)v=t;else{D=-1;break a}}f[g>>2]=v;D=v}while(0);b:do if(!(b[m>>0]|0)){A=(f[y+56>>2]|0)==0;do if(!((p|0)==0|A)){if((p|0)==1?b[B+(D*136|0)+28>>0]|0:0)break;x=ln(88)|0;r=f[a+8>>2]|0;t=B+(D*136|0)+104|0;f[x+4>>2]=0;f[x>>2]=3564;w=x+12|0;f[w>>2]=3588;q=x+64|0;f[q>>2]=0;f[x+68>>2]=0;f[x+72>>2]=0;o=x+16|0;z=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(z|0));f[x+76>>2]=r;f[x+80>>2]=t;s=x+84|0;f[s>>2]=0;f[h>>2]=3588;E=h+4|0;F=E+4|0;f[F>>2]=0;f[F+4>>2]=0;f[F+8>>2]=0;f[F+12>>2]=0;f[F+16>>2]=0;f[F+20>>2]=0;F=B+(D*136|0)+4|0;G=i+4|0;f[G>>2]=3588;H=i+56|0;f[H>>2]=0;I=i+60|0;f[I>>2]=0;f[i+64>>2]=0;o=i+8|0;z=o+44|0;do{f[o>>2]=0;o=o+4|0}while((o|0)<(z|0));f[E>>2]=F;o=f[B+(D*136|0)+68>>2]|0;z=((f[o+4>>2]|0)-(f[o>>2]|0)>>2>>>0)/3|0;b[e>>0]=0;qh(h+8|0,z,e);Va[f[(f[h>>2]|0)+8>>2]&127](h);Df(j,h);Df(e,j);f[i>>2]=f[e+4>>2];z=i+4|0;fg(z,e)|0;f[e>>2]=3588;o=f[e+20>>2]|0;if(o|0)Oq(o);o=f[e+8>>2]|0;if(o|0)Oq(o);f[i+36>>2]=F;f[i+40>>2]=t;f[i+44>>2]=r;f[i+48>>2]=x;f[j>>2]=3588;o=f[j+20>>2]|0;if(o|0)Oq(o);o=f[j+8>>2]|0;if(o|0)Oq(o);f[s>>2]=a+72;f[x+8>>2]=f[i>>2];fg(w,z)|0;z=x+44|0;o=i+36|0;f[z>>2]=f[o>>2];f[z+4>>2]=f[o+4>>2];f[z+8>>2]=f[o+8>>2];f[z+12>>2]=f[o+12>>2];b[z+16>>0]=b[o+16>>0]|0;ng(q,f[H>>2]|0,f[I>>2]|0);o=x;z=f[H>>2]|0;if(z|0){J=f[I>>2]|0;if((J|0)!=(z|0))f[I>>2]=J+(~((J+-4-z|0)>>>2)<<2);Oq(z)}f[G>>2]=3588;z=f[i+24>>2]|0;if(z|0)Oq(z);z=f[i+12>>2]|0;if(z|0)Oq(z);f[h>>2]=3588;z=f[h+20>>2]|0;if(z|0)Oq(z);z=f[h+8>>2]|0;if(z|0)Oq(z);K=0;L=o;M=54;break b}while(0);if(!A){b[B+(D*136|0)+100>>0]=0;N=B+(D*136|0)+104|0;M=26}else M=24}else M=24;while(0);if((M|0)==24){N=a+40|0;M=26}if((M|0)==26){D=(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)+48|0;do if((mi(f[D>>2]|0)|0)==0?(f[y+56>>2]|0)==0:0){if(b[m>>0]|0?(B=f[a+8>>2]|0,((f[B+12>>2]|0)-(f[B+8>>2]|0)|0)>4):0){M=31;break}gf(e,a,N);O=1;P=f[e>>2]|0}else M=31;while(0);if((M|0)==31){Vd(e,a,N);O=0;P=f[e>>2]|0}if(!P)Q=0;else{K=O;L=P;M=54}}if((M|0)==54){M=f[g>>2]|0;if((M|0)==-1)R=a+68|0;else R=(f[n>>2]|0)+(M*136|0)+132|0;f[R>>2]=K;K=ln(76)|0;f[k>>2]=L;rl(K,k,c);c=K;K=f[k>>2]|0;f[k>>2]=0;if(K|0)Va[f[(f[K>>2]|0)+4>>2]&127](K);K=a+188|0;k=f[K>>2]|0;if((k|0)==(f[a+192>>2]|0))Ri(a+184|0,g);else{f[k>>2]=f[g>>2];f[K>>2]=k+4}k=Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0;f[l>>2]=c;a=k+12|0;K=f[a>>2]|0;if(K>>>0<(f[k+16>>2]|0)>>>0){f[l>>2]=0;f[K>>2]=c;f[a>>2]=K+4;S=l}else{Qg(k+8|0,l);S=l}l=f[S>>2]|0;f[S>>2]=0;if(!l)Q=1;else{Va[f[(f[l>>2]|0)+4>>2]&127](l);Q=1}}C=Q;u=d;return C|0}function dc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;c=u;u=u+16|0;d=c+8|0;e=c;g=f[b>>2]|0;if((g|0)==-1){u=c;return}h=(g>>>0)/3|0;i=a+12|0;if(f[(f[i>>2]|0)+(h>>>5<<2)>>2]&1<<(h&31)|0){u=c;return}h=a+56|0;j=f[h>>2]|0;k=a+60|0;l=f[k>>2]|0;if((l|0)==(j|0))m=j;else{n=l+(~((l+-4-j|0)>>>2)<<2)|0;f[k>>2]=n;m=n}n=a+64|0;if((m|0)==(f[n>>2]|0))Ri(h,b);else{f[m>>2]=g;f[k>>2]=m+4}m=f[a>>2]|0;g=f[b>>2]|0;j=g+1|0;if((g|0)!=-1){l=((j>>>0)%3|0|0)==0?g+-2|0:j;if((l|0)==-1)o=-1;else o=f[(f[m>>2]|0)+(l<<2)>>2]|0;l=(((g>>>0)%3|0|0)==0?2:-1)+g|0;if((l|0)==-1){p=o;q=-1}else{p=o;q=f[(f[m>>2]|0)+(l<<2)>>2]|0}}else{p=-1;q=-1}l=a+24|0;m=f[l>>2]|0;o=m+(p>>>5<<2)|0;g=1<<(p&31);j=f[o>>2]|0;if(!(j&g)){f[o>>2]=j|g;g=f[b>>2]|0;j=g+1|0;if((g|0)==-1)r=-1;else r=((j>>>0)%3|0|0)==0?g+-2|0:j;f[e>>2]=r;j=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((r>>>0)/3|0)*12|0)+(((r>>>0)%3|0)<<2)>>2]|0;r=f[a+48>>2]|0;f[d>>2]=j;g=f[r+4>>2]|0;r=g+4|0;o=f[r>>2]|0;if((o|0)==(f[g+8>>2]|0))Ri(g,d);else{f[o>>2]=j;f[r>>2]=o+4}o=a+40|0;r=f[o>>2]|0;j=r+4|0;g=f[j>>2]|0;if((g|0)==(f[r+8>>2]|0)){Ri(r,e);s=f[o>>2]|0}else{f[g>>2]=f[e>>2];f[j>>2]=g+4;s=r}r=s+24|0;f[(f[s+12>>2]|0)+(p<<2)>>2]=f[r>>2];f[r>>2]=(f[r>>2]|0)+1;t=f[l>>2]|0}else t=m;m=t+(q>>>5<<2)|0;t=1<<(q&31);r=f[m>>2]|0;if(!(r&t)){f[m>>2]=r|t;t=f[b>>2]|0;do if((t|0)!=-1)if(!((t>>>0)%3|0)){v=t+2|0;break}else{v=t+-1|0;break}else v=-1;while(0);f[e>>2]=v;t=f[(f[(f[a+44>>2]|0)+96>>2]|0)+(((v>>>0)/3|0)*12|0)+(((v>>>0)%3|0)<<2)>>2]|0;v=f[a+48>>2]|0;f[d>>2]=t;r=f[v+4>>2]|0;v=r+4|0;m=f[v>>2]|0;if((m|0)==(f[r+8>>2]|0))Ri(r,d);else{f[m>>2]=t;f[v>>2]=m+4}m=a+40|0;v=f[m>>2]|0;t=v+4|0;r=f[t>>2]|0;if((r|0)==(f[v+8>>2]|0)){Ri(v,e);w=f[m>>2]|0}else{f[r>>2]=f[e>>2];f[t>>2]=r+4;w=v}v=w+24|0;f[(f[w+12>>2]|0)+(q<<2)>>2]=f[v>>2];f[v>>2]=(f[v>>2]|0)+1}v=f[h>>2]|0;q=f[k>>2]|0;if((v|0)==(q|0)){u=c;return}w=a+44|0;r=a+48|0;t=a+40|0;m=q;q=v;while(1){v=f[m+-4>>2]|0;f[b>>2]=v;p=(v>>>0)/3|0;if((v|0)!=-1?(v=f[i>>2]|0,(f[v+(p>>>5<<2)>>2]&1<<(p&31)|0)==0):0){s=p;p=v;a:while(1){v=p+(s>>>5<<2)|0;f[v>>2]=f[v>>2]|1<<(s&31);v=f[b>>2]|0;if((v|0)==-1)x=-1;else x=f[(f[f[a>>2]>>2]|0)+(v<<2)>>2]|0;g=(f[l>>2]|0)+(x>>>5<<2)|0;j=1<<(x&31);o=f[g>>2]|0;do if(!(j&o)){y=f[a>>2]|0;z=f[(f[y+24>>2]|0)+(x<<2)>>2]|0;A=z+1|0;if(((z|0)!=-1?(B=((A>>>0)%3|0|0)==0?z+-2|0:A,(B|0)!=-1):0)?(A=f[(f[y+12>>2]|0)+(B<<2)>>2]|0,B=A+1|0,(A|0)!=-1):0)C=((((B>>>0)%3|0|0)==0?A+-2|0:B)|0)==-1;else C=1;f[g>>2]=o|j;B=f[b>>2]|0;f[e>>2]=B;A=f[(f[(f[w>>2]|0)+96>>2]|0)+(((B>>>0)/3|0)*12|0)+(((B>>>0)%3|0)<<2)>>2]|0;B=f[r>>2]|0;f[d>>2]=A;y=f[B+4>>2]|0;B=y+4|0;z=f[B>>2]|0;if((z|0)==(f[y+8>>2]|0))Ri(y,d);else{f[z>>2]=A;f[B>>2]=z+4}z=f[t>>2]|0;B=z+4|0;A=f[B>>2]|0;if((A|0)==(f[z+8>>2]|0)){Ri(z,e);D=f[t>>2]|0}else{f[A>>2]=f[e>>2];f[B>>2]=A+4;D=z}z=D+24|0;f[(f[D+12>>2]|0)+(x<<2)>>2]=f[z>>2];f[z>>2]=(f[z>>2]|0)+1;if(C){E=f[b>>2]|0;F=60;break}z=f[a>>2]|0;A=f[b>>2]|0;do if((A|0)==-1)G=-1;else{B=A+1|0;y=((B>>>0)%3|0|0)==0?A+-2|0:B;if((y|0)==-1){G=-1;break}G=f[(f[z+12>>2]|0)+(y<<2)>>2]|0}while(0);f[b>>2]=G;H=(G>>>0)/3|0}else{E=v;F=60}while(0);if((F|0)==60){F=0;v=f[a>>2]|0;if((E|0)==-1){F=61;break}j=E+1|0;o=((j>>>0)%3|0|0)==0?E+-2|0:j;if((o|0)==-1)I=-1;else I=f[(f[v+12>>2]|0)+(o<<2)>>2]|0;f[d>>2]=I;o=(((E>>>0)%3|0|0)==0?2:-1)+E|0;if((o|0)==-1)J=-1;else J=f[(f[v+12>>2]|0)+(o<<2)>>2]|0;o=(I|0)==-1;v=(I>>>0)/3|0;j=o?-1:v;g=(J|0)==-1;z=(J>>>0)/3|0;A=g?-1:z;do if(!o){y=f[i>>2]|0;if(f[y+(j>>>5<<2)>>2]&1<<(j&31)|0){F=68;break}if(g){K=I;L=v;break}if(!(f[y+(A>>>5<<2)>>2]&1<<(A&31))){F=73;break a}else{K=I;L=v}}else F=68;while(0);if((F|0)==68){F=0;if(g){F=70;break}if(!(f[(f[i>>2]|0)+(A>>>5<<2)>>2]&1<<(A&31))){K=J;L=z}else{F=70;break}}f[b>>2]=K;H=L}s=H;p=f[i>>2]|0}do if((F|0)==61){F=0;f[d>>2]=-1;F=70}else if((F|0)==73){F=0;p=f[k>>2]|0;f[p+-4>>2]=J;if((p|0)==(f[n>>2]|0)){Ri(h,d);M=f[k>>2]|0;break}else{f[p>>2]=f[d>>2];s=p+4|0;f[k>>2]=s;M=s;break}}while(0);if((F|0)==70){F=0;s=(f[k>>2]|0)+-4|0;f[k>>2]=s;M=s}N=f[h>>2]|0;O=M}else{s=m+-4|0;f[k>>2]=s;N=q;O=s}if((N|0)==(O|0))break;else{m=O;q=N}}u=c;return}function ec(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=Oa,fa=Oa,ga=Oa,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;g=u;u=u+48|0;i=g+12|0;j=g+32|0;k=g;l=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=c+48|0;q=c+40|0;o=i+4|0;t=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=f[e>>2]|0;e=0;z=r;A=0;B=0;C=r;D=r;E=r;while(1){r=s;F=f[r>>2]|0;G=f[r+4>>2]|0;r=q;H=un(f[r>>2]|0,f[r+4>>2]|0,y+A|0,0)|0;r=Vn(H|0,I|0,F|0,G|0)|0;G=(f[f[c>>2]>>2]|0)+r|0;r=h[G>>0]|h[G+1>>0]<<8;d[j>>1]=r;G=(r^318)&65535;a:do if(e){F=e+-1|0;H=(F&e|0)==0;if(!H)if(e>>>0>G>>>0)J=G;else J=(G>>>0)%(e>>>0)|0;else J=F&G;K=f[i>>2]|0;L=f[K+(J<<2)>>2]|0;b:do if(L|0?(M=f[L>>2]|0,M|0):0){c:do if(H){N=M;while(1){O=f[N+4>>2]|0;P=(O|0)==(G|0);if(!(P|(O&F|0)==(J|0)))break b;if(P?(d[N+8>>1]|0)==r<<16>>16:0){Q=N;break c}N=f[N>>2]|0;if(!N)break b}}else{N=M;while(1){P=f[N+4>>2]|0;if((P|0)==(G|0)){if((d[N+8>>1]|0)==r<<16>>16){Q=N;break c}}else{if(P>>>0>>0)R=P;else R=(P>>>0)%(e>>>0)|0;if((R|0)!=(J|0))break b}N=f[N>>2]|0;if(!N)break b}}while(0);f[E+(A<<2)>>2]=f[Q+12>>2];S=z;T=B;U=D;V=C;X=E;break a}while(0);if(!H)if(e>>>0>G>>>0)Y=G;else Y=(G>>>0)%(e>>>0)|0;else Y=F&G;L=f[K+(Y<<2)>>2]|0;if(!L){Z=Y;_=e;aa=0;ba=40}else{if(H){M=L;while(1){M=f[M>>2]|0;if(!M){Z=Y;_=e;aa=0;ba=40;break a}N=f[M+4>>2]|0;if(!((N|0)==(G|0)|(N&F|0)==(Y|0))){Z=Y;_=e;aa=0;ba=40;break a}if((d[M+8>>1]|0)==r<<16>>16){ba=55;break a}}}else ca=L;while(1){ca=f[ca>>2]|0;if(!ca){Z=Y;_=e;aa=0;ba=40;break a}M=f[ca+4>>2]|0;if((M|0)!=(G|0)){if(M>>>0>>0)da=M;else da=(M>>>0)%(e>>>0)|0;if((da|0)!=(Y|0)){Z=Y;_=e;aa=0;ba=40;break a}}if((d[ca+8>>1]|0)==r<<16>>16){ba=55;break}}}}else{Z=0;_=0;aa=1;ba=40}while(0);if((ba|0)==40){ba=0;L=ln(16)|0;d[L+8>>1]=r;f[L+12>>2]=B;f[L+4>>2]=G;f[L>>2]=0;ea=$(((f[t>>2]|0)+1|0)>>>0);fa=$(_>>>0);ga=$(n[l>>2]);do if(aa|$(ga*fa)>>0<3|(_+-1&_|0)!=0)&1;F=~~$(W($(ea/ga)))>>>0;Vh(i,M>>>0>>0?F:M);M=f[o>>2]|0;F=M+-1|0;if(!(F&M)){ha=M;ia=F&G;break}if(M>>>0>G>>>0){ha=M;ia=G}else{ha=M;ia=(G>>>0)%(M>>>0)|0}}else{ha=_;ia=Z}while(0);G=(f[i>>2]|0)+(ia<<2)|0;r=f[G>>2]|0;if(!r){f[L>>2]=f[v>>2];f[v>>2]=L;f[G>>2]=v;G=f[L>>2]|0;if(G|0){M=f[G+4>>2]|0;G=ha+-1|0;if(G&ha)if(M>>>0>>0)ja=M;else ja=(M>>>0)%(ha>>>0)|0;else ja=M&G;ka=(f[i>>2]|0)+(ja<<2)|0;ba=53}}else{f[L>>2]=f[r>>2];ka=r;ba=53}if((ba|0)==53){ba=0;f[ka>>2]=L}f[t>>2]=(f[t>>2]|0)+1;ba=55}if((ba|0)==55){ba=0;r=w;G=f[r>>2]|0;M=un(G|0,f[r+4>>2]|0,B|0,0)|0;kh((f[f[x>>2]>>2]|0)+M|0,j|0,G|0)|0;G=f[k>>2]|0;f[G+(A<<2)>>2]=B;S=G;T=B+1|0;U=G;V=G;X=G}G=A+1|0;la=f[m>>2]|0;if(G>>>0>=la>>>0)break;e=f[o>>2]|0;z=S;A=G;B=T;C=V;D=U;E=X}if((T|0)==(la|0))ma=V;else{V=a+84|0;if(!(b[V>>0]|0)){X=f[a+72>>2]|0;E=f[a+68>>2]|0;D=E;if((X|0)==(E|0))na=S;else{C=X-E>>2;E=0;do{X=D+(E<<2)|0;f[X>>2]=f[U+(f[X>>2]<<2)>>2];E=E+1|0}while(E>>>0>>0);na=S}}else{b[V>>0]=0;V=a+68|0;S=a+72|0;C=f[S>>2]|0;E=f[V>>2]|0;U=C-E>>2;D=E;E=C;if(la>>>0<=U>>>0)if(la>>>0>>0?(C=D+(la<<2)|0,(C|0)!=(E|0)):0){f[S>>2]=E+(~((E+-4-C|0)>>>2)<<2);oa=la}else oa=la;else{Ch(V,la-U|0,1220);oa=f[m>>2]|0}U=f[k>>2]|0;if(!oa)na=U;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[U+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);na=U}}f[m>>2]=T;ma=na}if(!ma)pa=T;else{na=f[p>>2]|0;if((na|0)!=(ma|0))f[p>>2]=na+(~((na+-4-ma|0)>>>2)<<2);Oq(ma);pa=T}}else pa=0;T=f[i+8>>2]|0;if(T|0){ma=T;do{T=ma;ma=f[ma>>2]|0;Oq(T)}while((ma|0)!=0)}ma=f[i>>2]|0;f[i>>2]=0;if(!ma){u=g;return pa|0}Oq(ma);u=g;return pa|0}function fc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=Oa,K=Oa,L=Oa,M=0,N=0,O=0,P=0;e=u;u=u+64|0;g=e+40|0;i=e+16|0;j=e;k=Id(a,c)|0;if(k|0){f[i>>2]=k;f[g>>2]=f[i>>2];lf(a,g)|0}f[j>>2]=0;k=j+4|0;f[k>>2]=0;f[j+8>>2]=0;Fi(j,4);l=f[j>>2]|0;m=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[l>>0]=m;b[l+1>>0]=m>>8;b[l+2>>0]=m>>16;b[l+3>>0]=m>>24;pj(i,c);c=i+12|0;f[c>>2]=0;m=i+16|0;f[m>>2]=0;f[i+20>>2]=0;l=f[k>>2]|0;d=f[j>>2]|0;o=l-d|0;if(!o){p=d;q=l;r=0}else{Fi(c,o);p=f[j>>2]|0;q=f[k>>2]|0;r=f[c>>2]|0}kh(r|0,p|0,q-p|0)|0;p=i+11|0;q=b[p>>0]|0;r=q<<24>>24<0;c=r?f[i>>2]|0:i;o=r?f[i+4>>2]|0:q&255;if(o>>>0>3){q=c;r=o;l=o;while(1){d=X(h[q>>0]|h[q+1>>0]<<8|h[q+2>>0]<<16|h[q+3>>0]<<24,1540483477)|0;r=(X(d>>>24^d,1540483477)|0)^(X(r,1540483477)|0);l=l+-4|0;if(l>>>0<=3)break;else q=q+4|0}q=o+-4|0;l=q&-4;s=q-l|0;t=c+(l+4)|0;v=r}else{s=o;t=c;v=o}switch(s|0){case 3:{w=h[t+2>>0]<<16^v;x=10;break}case 2:{w=v;x=10;break}case 1:{y=v;x=11;break}default:z=v}if((x|0)==10){y=h[t+1>>0]<<8^w;x=11}if((x|0)==11)z=X(y^h[t>>0],1540483477)|0;t=X(z>>>13^z,1540483477)|0;z=t>>>15^t;t=a+4|0;y=f[t>>2]|0;w=(y|0)==0;a:do if(!w){v=y+-1|0;s=(v&y|0)==0;if(!s)if(z>>>0>>0)A=z;else A=(z>>>0)%(y>>>0)|0;else A=z&v;r=f[(f[a>>2]|0)+(A<<2)>>2]|0;if((r|0)!=0?(l=f[r>>2]|0,(l|0)!=0):0){r=(o|0)==0;if(s){if(r){s=l;while(1){q=f[s+4>>2]|0;if(!((q|0)==(z|0)|(q&v|0)==(A|0))){B=A;x=52;break a}q=b[s+8+11>>0]|0;if(!((q<<24>>24<0?f[s+12>>2]|0:q&255)|0))break a;s=f[s>>2]|0;if(!s){B=A;x=52;break a}}}else C=l;while(1){s=f[C+4>>2]|0;if(!((s|0)==(z|0)|(s&v|0)==(A|0))){B=A;x=52;break a}s=C+8|0;q=b[s+11>>0]|0;d=q<<24>>24<0;D=q&255;do if(((d?f[C+12>>2]|0:D)|0)==(o|0)){q=f[s>>2]|0;if(d)if(!(Vk(q,c,o)|0))break a;else break;if((b[c>>0]|0)==(q&255)<<24>>24){q=s;E=D;F=c;do{E=E+-1|0;q=q+1|0;if(!E)break a;F=F+1|0}while((b[q>>0]|0)==(b[F>>0]|0))}}while(0);C=f[C>>2]|0;if(!C){B=A;x=52;break a}}}if(r){v=l;while(1){D=f[v+4>>2]|0;if((D|0)!=(z|0)){if(D>>>0>>0)G=D;else G=(D>>>0)%(y>>>0)|0;if((G|0)!=(A|0)){B=A;x=52;break a}}D=b[v+8+11>>0]|0;if(!((D<<24>>24<0?f[v+12>>2]|0:D&255)|0))break a;v=f[v>>2]|0;if(!v){B=A;x=52;break a}}}else H=l;while(1){v=f[H+4>>2]|0;if((v|0)!=(z|0)){if(v>>>0>>0)I=v;else I=(v>>>0)%(y>>>0)|0;if((I|0)!=(A|0)){B=A;x=52;break a}}v=H+8|0;r=b[v+11>>0]|0;D=r<<24>>24<0;s=r&255;do if(((D?f[H+12>>2]|0:s)|0)==(o|0)){r=f[v>>2]|0;if(D)if(!(Vk(r,c,o)|0))break a;else break;if((b[c>>0]|0)==(r&255)<<24>>24){r=v;d=s;F=c;do{d=d+-1|0;r=r+1|0;if(!d)break a;F=F+1|0}while((b[r>>0]|0)==(b[F>>0]|0))}}while(0);H=f[H>>2]|0;if(!H){B=A;x=52;break}}}else{B=A;x=52}}else{B=0;x=52}while(0);if((x|0)==52){oi(g,a,z,i);x=a+12|0;J=$(((f[x>>2]|0)+1|0)>>>0);K=$(y>>>0);L=$(n[a+16>>2]);do if(w|$(L*K)>>0<3|(y+-1&y|0)!=0)&1;H=~~$(W($(J/L)))>>>0;ei(a,A>>>0>>0?H:A);A=f[t>>2]|0;H=A+-1|0;if(!(H&A)){M=A;N=H&z;break}if(z>>>0>>0){M=A;N=z}else{M=A;N=(z>>>0)%(A>>>0)|0}}else{M=y;N=B}while(0);B=f[(f[a>>2]|0)+(N<<2)>>2]|0;if(!B){y=a+8|0;f[f[g>>2]>>2]=f[y>>2];f[y>>2]=f[g>>2];f[(f[a>>2]|0)+(N<<2)>>2]=y;y=f[g>>2]|0;N=f[y>>2]|0;if(!N)O=g;else{z=f[N+4>>2]|0;N=M+-1|0;if(N&M)if(z>>>0>>0)P=z;else P=(z>>>0)%(M>>>0)|0;else P=z&N;f[(f[a>>2]|0)+(P<<2)>>2]=y;O=g}}else{f[f[g>>2]>>2]=f[B>>2];f[B>>2]=f[g>>2];O=g}f[x>>2]=(f[x>>2]|0)+1;f[O>>2]=0}O=f[i+12>>2]|0;if(O|0){if((f[m>>2]|0)!=(O|0))f[m>>2]=O;Oq(O)}if((b[p>>0]|0)<0)Oq(f[i>>2]|0);i=f[j>>2]|0;if(!i){u=e;return}if((f[k>>2]|0)!=(i|0))f[k>>2]=i;Oq(i);u=e;return}function gc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=Oa,da=Oa,ea=Oa,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;e=u;u=u+48|0;g=e+12|0;h=e+32|0;i=e;j=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[j>>2]=$(1.0);k=a+80|0;l=f[k>>2]|0;f[i>>2]=0;m=i+4|0;f[m>>2]=0;f[i+8>>2]=0;if(l){if(l>>>0>1073741823)aq(i);o=l<<2;p=ln(o)|0;f[i>>2]=p;q=p+(l<<2)|0;f[i+8>>2]=q;sj(p|0,0,o|0)|0;f[m>>2]=q;q=c+48|0;o=c+40|0;l=g+4|0;r=g+12|0;s=g+8|0;t=a+40|0;v=a+64|0;w=f[d>>2]|0;d=0;x=p;y=0;z=0;A=p;B=p;C=p;while(1){p=q;D=f[p>>2]|0;E=f[p+4>>2]|0;p=o;F=un(f[p>>2]|0,f[p+4>>2]|0,w+y|0,0)|0;p=Vn(F|0,I|0,D|0,E|0)|0;E=b[(f[f[c>>2]>>2]|0)+p>>0]|0;b[h>>0]=E;p=E&255^318;a:do if(d){D=d+-1|0;F=(D&d|0)==0;if(!F)if(p>>>0>>0)G=p;else G=(p>>>0)%(d>>>0)|0;else G=D&p;H=f[g>>2]|0;J=f[H+(G<<2)>>2]|0;b:do if(J|0?(K=f[J>>2]|0,K|0):0){c:do if(F){L=K;while(1){M=f[L+4>>2]|0;N=(M|0)==(p|0);if(!(N|(M&D|0)==(G|0)))break b;if(N?(b[L+8>>0]|0)==E<<24>>24:0){O=L;break c}L=f[L>>2]|0;if(!L)break b}}else{L=K;while(1){N=f[L+4>>2]|0;if((N|0)==(p|0)){if((b[L+8>>0]|0)==E<<24>>24){O=L;break c}}else{if(N>>>0>>0)P=N;else P=(N>>>0)%(d>>>0)|0;if((P|0)!=(G|0))break b}L=f[L>>2]|0;if(!L)break b}}while(0);f[C+(y<<2)>>2]=f[O+12>>2];Q=x;R=z;S=B;T=A;U=C;break a}while(0);if(!F)if(p>>>0>>0)V=p;else V=(p>>>0)%(d>>>0)|0;else V=D&p;J=f[H+(V<<2)>>2]|0;if(!J){X=V;Y=d;Z=0;_=40}else{if(F){K=J;while(1){K=f[K>>2]|0;if(!K){X=V;Y=d;Z=0;_=40;break a}L=f[K+4>>2]|0;if(!((L|0)==(p|0)|(L&D|0)==(V|0))){X=V;Y=d;Z=0;_=40;break a}if((b[K+8>>0]|0)==E<<24>>24){_=55;break a}}}else aa=J;while(1){aa=f[aa>>2]|0;if(!aa){X=V;Y=d;Z=0;_=40;break a}K=f[aa+4>>2]|0;if((K|0)!=(p|0)){if(K>>>0>>0)ba=K;else ba=(K>>>0)%(d>>>0)|0;if((ba|0)!=(V|0)){X=V;Y=d;Z=0;_=40;break a}}if((b[aa+8>>0]|0)==E<<24>>24){_=55;break}}}}else{X=0;Y=0;Z=1;_=40}while(0);if((_|0)==40){_=0;J=ln(16)|0;b[J+8>>0]=E;f[J+12>>2]=z;f[J+4>>2]=p;f[J>>2]=0;ca=$(((f[r>>2]|0)+1|0)>>>0);da=$(Y>>>0);ea=$(n[j>>2]);do if(Z|$(ea*da)>>0<3|(Y+-1&Y|0)!=0)&1;D=~~$(W($(ca/ea)))>>>0;ai(g,K>>>0>>0?D:K);K=f[l>>2]|0;D=K+-1|0;if(!(D&K)){fa=K;ga=D&p;break}if(p>>>0>>0){fa=K;ga=p}else{fa=K;ga=(p>>>0)%(K>>>0)|0}}else{fa=Y;ga=X}while(0);p=(f[g>>2]|0)+(ga<<2)|0;E=f[p>>2]|0;if(!E){f[J>>2]=f[s>>2];f[s>>2]=J;f[p>>2]=s;p=f[J>>2]|0;if(p|0){K=f[p+4>>2]|0;p=fa+-1|0;if(p&fa)if(K>>>0>>0)ha=K;else ha=(K>>>0)%(fa>>>0)|0;else ha=K&p;ia=(f[g>>2]|0)+(ha<<2)|0;_=53}}else{f[J>>2]=f[E>>2];ia=E;_=53}if((_|0)==53){_=0;f[ia>>2]=J}f[r>>2]=(f[r>>2]|0)+1;_=55}if((_|0)==55){_=0;E=t;p=f[E>>2]|0;K=un(p|0,f[E+4>>2]|0,z|0,0)|0;kh((f[f[v>>2]>>2]|0)+K|0,h|0,p|0)|0;p=f[i>>2]|0;f[p+(y<<2)>>2]=z;Q=p;R=z+1|0;S=p;T=p;U=p}p=y+1|0;ja=f[k>>2]|0;if(p>>>0>=ja>>>0)break;d=f[l>>2]|0;x=Q;y=p;z=R;A=T;B=S;C=U}if((R|0)==(ja|0))ka=T;else{T=a+84|0;if(!(b[T>>0]|0)){U=f[a+72>>2]|0;C=f[a+68>>2]|0;B=C;if((U|0)==(C|0))la=Q;else{A=U-C>>2;C=0;do{U=B+(C<<2)|0;f[U>>2]=f[S+(f[U>>2]<<2)>>2];C=C+1|0}while(C>>>0>>0);la=Q}}else{b[T>>0]=0;T=a+68|0;Q=a+72|0;A=f[Q>>2]|0;C=f[T>>2]|0;S=A-C>>2;B=C;C=A;if(ja>>>0<=S>>>0)if(ja>>>0>>0?(A=B+(ja<<2)|0,(A|0)!=(C|0)):0){f[Q>>2]=C+(~((C+-4-A|0)>>>2)<<2);ma=ja}else ma=ja;else{Ch(T,ja-S|0,1220);ma=f[k>>2]|0}S=f[i>>2]|0;if(!ma)la=S;else{i=f[a+68>>2]|0;a=0;do{f[i+(a<<2)>>2]=f[S+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);la=S}}f[k>>2]=R;ka=la}if(!ka)na=R;else{la=f[m>>2]|0;if((la|0)!=(ka|0))f[m>>2]=la+(~((la+-4-ka|0)>>>2)<<2);Oq(ka);na=R}}else na=0;R=f[g+8>>2]|0;if(R|0){ka=R;do{R=ka;ka=f[ka>>2]|0;Oq(R)}while((ka|0)!=0)}ka=f[g>>2]|0;f[g>>2]=0;if(!ka){u=e;return na|0}Oq(ka);u=e;return na|0}function hc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=Oa,ea=Oa,fa=Oa,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0;e=u;u=u+48|0;g=e+16|0;i=e+12|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=c+48|0;p=c+40|0;m=g+4|0;s=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=f[d>>2]|0;d=0;y=q;z=0;A=0;B=q;C=q;D=q;while(1){q=r;E=f[q>>2]|0;F=f[q+4>>2]|0;q=p;G=un(f[q>>2]|0,f[q+4>>2]|0,x+z|0,0)|0;q=Vn(G|0,I|0,E|0,F|0)|0;F=(f[f[c>>2]>>2]|0)+q|0;q=h[F>>0]|h[F+1>>0]<<8|h[F+2>>0]<<16|h[F+3>>0]<<24;f[i>>2]=q;F=q^318;a:do if(d){E=d+-1|0;G=(E&d|0)==0;if(!G)if(F>>>0>>0)H=F;else H=(F>>>0)%(d>>>0)|0;else H=E&F;J=f[g>>2]|0;K=f[J+(H<<2)>>2]|0;b:do if(K|0?(L=f[K>>2]|0,L|0):0){c:do if(G){M=L;while(1){N=f[M+4>>2]|0;O=(N|0)==(F|0);if(!(O|(N&E|0)==(H|0)))break b;if(O?(f[M+8>>2]|0)==(q|0):0){P=M;break c}M=f[M>>2]|0;if(!M)break b}}else{M=L;while(1){O=f[M+4>>2]|0;if((O|0)==(F|0)){if((f[M+8>>2]|0)==(q|0)){P=M;break c}}else{if(O>>>0>>0)Q=O;else Q=(O>>>0)%(d>>>0)|0;if((Q|0)!=(H|0))break b}M=f[M>>2]|0;if(!M)break b}}while(0);f[D+(z<<2)>>2]=f[P+12>>2];R=y;S=A;T=C;U=B;V=D;break a}while(0);if(!G)if(F>>>0>>0)X=F;else X=(F>>>0)%(d>>>0)|0;else X=E&F;K=f[J+(X<<2)>>2]|0;if(!K){Y=X;Z=d;_=0;aa=40}else{if(G){L=K;while(1){L=f[L>>2]|0;if(!L){Y=X;Z=d;_=0;aa=40;break a}M=f[L+4>>2]|0;if(!((M|0)==(F|0)|(M&E|0)==(X|0))){Y=X;Z=d;_=0;aa=40;break a}if((f[L+8>>2]|0)==(q|0)){aa=55;break a}}}else ba=K;while(1){ba=f[ba>>2]|0;if(!ba){Y=X;Z=d;_=0;aa=40;break a}L=f[ba+4>>2]|0;if((L|0)!=(F|0)){if(L>>>0>>0)ca=L;else ca=(L>>>0)%(d>>>0)|0;if((ca|0)!=(X|0)){Y=X;Z=d;_=0;aa=40;break a}}if((f[ba+8>>2]|0)==(q|0)){aa=55;break}}}}else{Y=0;Z=0;_=1;aa=40}while(0);if((aa|0)==40){aa=0;K=ln(16)|0;f[K+8>>2]=q;f[K+12>>2]=A;f[K+4>>2]=F;f[K>>2]=0;da=$(((f[s>>2]|0)+1|0)>>>0);ea=$(Z>>>0);fa=$(n[k>>2]);do if(_|$(fa*ea)>>0<3|(Z+-1&Z|0)!=0)&1;E=~~$(W($(da/fa)))>>>0;Hi(g,L>>>0>>0?E:L);L=f[m>>2]|0;E=L+-1|0;if(!(E&L)){ga=L;ha=E&F;break}if(F>>>0>>0){ga=L;ha=F}else{ga=L;ha=(F>>>0)%(L>>>0)|0}}else{ga=Z;ha=Y}while(0);F=(f[g>>2]|0)+(ha<<2)|0;q=f[F>>2]|0;if(!q){f[K>>2]=f[t>>2];f[t>>2]=K;f[F>>2]=t;F=f[K>>2]|0;if(F|0){L=f[F+4>>2]|0;F=ga+-1|0;if(F&ga)if(L>>>0>>0)ia=L;else ia=(L>>>0)%(ga>>>0)|0;else ia=L&F;ja=(f[g>>2]|0)+(ia<<2)|0;aa=53}}else{f[K>>2]=f[q>>2];ja=q;aa=53}if((aa|0)==53){aa=0;f[ja>>2]=K}f[s>>2]=(f[s>>2]|0)+1;aa=55}if((aa|0)==55){aa=0;q=v;F=f[q>>2]|0;L=un(F|0,f[q+4>>2]|0,A|0,0)|0;kh((f[f[w>>2]>>2]|0)+L|0,i|0,F|0)|0;F=f[j>>2]|0;f[F+(z<<2)>>2]=A;R=F;S=A+1|0;T=F;U=F;V=F}F=z+1|0;ka=f[l>>2]|0;if(F>>>0>=ka>>>0)break;d=f[m>>2]|0;y=R;z=F;A=S;B=U;C=T;D=V}if((S|0)==(ka|0))la=U;else{U=a+84|0;if(!(b[U>>0]|0)){V=f[a+72>>2]|0;D=f[a+68>>2]|0;C=D;if((V|0)==(D|0))ma=R;else{B=V-D>>2;D=0;do{V=C+(D<<2)|0;f[V>>2]=f[T+(f[V>>2]<<2)>>2];D=D+1|0}while(D>>>0>>0);ma=R}}else{b[U>>0]=0;U=a+68|0;R=a+72|0;B=f[R>>2]|0;D=f[U>>2]|0;T=B-D>>2;C=D;D=B;if(ka>>>0<=T>>>0)if(ka>>>0>>0?(B=C+(ka<<2)|0,(B|0)!=(D|0)):0){f[R>>2]=D+(~((D+-4-B|0)>>>2)<<2);na=ka}else na=ka;else{Ch(U,ka-T|0,1220);na=f[l>>2]|0}T=f[j>>2]|0;if(!na)ma=T;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[T+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);ma=T}}f[l>>2]=S;la=ma}if(!la)oa=S;else{ma=f[o>>2]|0;if((ma|0)!=(la|0))f[o>>2]=ma+(~((ma+-4-la|0)>>>2)<<2);Oq(la);oa=S}}else oa=0;S=f[g+8>>2]|0;if(S|0){la=S;do{S=la;la=f[la>>2]|0;Oq(S)}while((la|0)!=0)}la=f[g>>2]|0;f[g>>2]=0;if(!la){u=e;return oa|0}Oq(la);u=e;return oa|0}function ic(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;e=u;u=u+96|0;g=e+92|0;h=e+88|0;i=e+72|0;j=e+48|0;k=e+24|0;l=e;m=a+16|0;n=f[m>>2]|0;o=f[c>>2]|0;f[i>>2]=n;f[i+4>>2]=o;c=i+8|0;f[c>>2]=o;b[i+12>>0]=1;p=f[(f[n+28>>2]|0)+(o<<2)>>2]|0;n=a+20|0;q=f[n>>2]|0;r=f[q>>2]|0;if((f[q+4>>2]|0)-r>>2>>>0<=p>>>0)aq(q);q=a+8|0;s=f[(f[q>>2]|0)+(f[r+(p<<2)>>2]<<2)>>2]|0;p=a+4|0;r=f[p>>2]|0;if(!(b[r+84>>0]|0))t=f[(f[r+68>>2]|0)+(s<<2)>>2]|0;else t=s;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;f[j+12>>2]=0;f[j+16>>2]=0;f[j+20>>2]=0;f[h>>2]=t;t=b[r+24>>0]|0;f[g>>2]=f[h>>2];vb(r,g,t,j)|0;t=a+28|0;a=(f[t>>2]|0)==0;a:do if((o|0)!=-1){r=k+8|0;s=j+8|0;v=k+16|0;w=j+16|0;x=l+8|0;y=l+16|0;z=o;A=o;B=0;C=0;D=0;E=0;F=0;G=0;H=a;J=o;while(1){do if(H){K=J+1|0;if((J|0)!=-1){L=((K>>>0)%3|0|0)==0?J+-2|0:K;if((z|0)!=-1)if(!((z>>>0)%3|0)){M=z;N=z+2|0;O=L;P=z;break}else{M=z;N=z+-1|0;O=L;P=z;break}else{M=-1;N=-1;O=L;P=-1}}else{M=z;N=-1;O=-1;P=-1}}else{L=A+1|0;K=((L>>>0)%3|0|0)==0?A+-2|0:L;if(!((A>>>0)%3|0)){M=z;N=A+2|0;O=K;P=J;break}else{M=z;N=A+-1|0;O=K;P=J;break}}while(0);K=f[(f[(f[m>>2]|0)+28>>2]|0)+(O<<2)>>2]|0;Q=f[n>>2]|0;L=f[Q>>2]|0;if((f[Q+4>>2]|0)-L>>2>>>0<=K>>>0){R=17;break}S=f[(f[q>>2]|0)+(f[L+(K<<2)>>2]<<2)>>2]|0;K=f[p>>2]|0;if(!(b[K+84>>0]|0))T=f[(f[K+68>>2]|0)+(S<<2)>>2]|0;else T=S;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;f[k+20>>2]=0;f[h>>2]=T;S=b[K+24>>0]|0;f[g>>2]=f[h>>2];vb(K,g,S,k)|0;S=f[(f[(f[m>>2]|0)+28>>2]|0)+(N<<2)>>2]|0;U=f[n>>2]|0;K=f[U>>2]|0;if((f[U+4>>2]|0)-K>>2>>>0<=S>>>0){R=21;break}L=f[(f[q>>2]|0)+(f[K+(S<<2)>>2]<<2)>>2]|0;S=f[p>>2]|0;if(!(b[S+84>>0]|0))V=f[(f[S+68>>2]|0)+(L<<2)>>2]|0;else V=L;f[l>>2]=0;f[l+4>>2]=0;f[l+8>>2]=0;f[l+12>>2]=0;f[l+16>>2]=0;f[l+20>>2]=0;f[h>>2]=V;L=b[S+24>>0]|0;f[g>>2]=f[h>>2];vb(S,g,L,l)|0;L=k;S=j;K=f[S>>2]|0;W=f[S+4>>2]|0;S=Xn(f[L>>2]|0,f[L+4>>2]|0,K|0,W|0)|0;L=I;X=r;Y=s;Z=f[Y>>2]|0;_=f[Y+4>>2]|0;Y=Xn(f[X>>2]|0,f[X+4>>2]|0,Z|0,_|0)|0;X=I;$=v;aa=w;ba=f[aa>>2]|0;ca=f[aa+4>>2]|0;aa=Xn(f[$>>2]|0,f[$+4>>2]|0,ba|0,ca|0)|0;$=I;da=l;ea=Xn(f[da>>2]|0,f[da+4>>2]|0,K|0,W|0)|0;W=I;K=x;da=Xn(f[K>>2]|0,f[K+4>>2]|0,Z|0,_|0)|0;_=I;Z=y;K=Xn(f[Z>>2]|0,f[Z+4>>2]|0,ba|0,ca|0)|0;ca=I;ba=un(K|0,ca|0,Y|0,X|0)|0;Z=I;fa=un(da|0,_|0,aa|0,$|0)|0;ga=I;ha=un(ea|0,W|0,aa|0,$|0)|0;$=I;aa=un(K|0,ca|0,S|0,L|0)|0;ca=I;K=un(da|0,_|0,S|0,L|0)|0;L=I;S=un(ea|0,W|0,Y|0,X|0)|0;X=I;Y=Xn(B|0,C|0,fa|0,ga|0)|0;ga=Vn(Y|0,I|0,ba|0,Z|0)|0;Z=I;ba=Vn(ha|0,$|0,D|0,E|0)|0;$=Xn(ba|0,I|0,aa|0,ca|0)|0;ca=I;aa=Xn(F|0,G|0,S|0,X|0)|0;X=Vn(aa|0,I|0,K|0,L|0)|0;L=I;Pg(i);A=f[c>>2]|0;K=(f[t>>2]|0)==0;if((A|0)==-1){ia=K;ja=Z;ka=ga;la=ca;ma=$;na=L;oa=X;break a}else{z=M;B=ga;C=Z;D=$;E=ca;F=X;G=L;H=K;J=P}}if((R|0)==17)aq(Q);else if((R|0)==21)aq(U)}else{ia=a;ja=0;ka=0;la=0;ma=0;na=0;oa=0}while(0);a=(ja|0)>-1|(ja|0)==-1&ka>>>0>4294967295;U=Xn(0,0,ka|0,ja|0)|0;R=a?ja:I;Q=(la|0)>-1|(la|0)==-1&ma>>>0>4294967295;P=Xn(0,0,ma|0,la|0)|0;M=Q?la:I;t=(na|0)>-1|(na|0)==-1&oa>>>0>4294967295;c=Xn(0,0,oa|0,na|0)|0;i=Vn((Q?ma:P)|0,M|0,(t?oa:c)|0,(t?na:I)|0)|0;t=Vn(i|0,I|0,(a?ka:U)|0,R|0)|0;R=I;if(ia){if((t|0)<=536870912){pa=ka;qa=ma;ra=oa;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}ia=Yn(t|0,R|0,29)|0;U=ia&7;ia=Ik(ka|0,ja|0,U|0,0)|0;a=Ik(ma|0,la|0,U|0,0)|0;i=Ik(oa|0,na|0,U|0,0)|0;pa=ia;qa=a;ra=i;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}else{if(!((R|0)>0|(R|0)==0&t>>>0>536870912)){pa=ka;qa=ma;ra=oa;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}i=Yn(t|0,R|0,29)|0;R=I;t=Ik(ka|0,ja|0,i|0,R|0)|0;ja=Ik(ma|0,la|0,i|0,R|0)|0;la=Ik(oa|0,na|0,i|0,R|0)|0;pa=t;qa=ja;ra=la;f[d>>2]=pa;sa=d+4|0;f[sa>>2]=qa;ta=d+8|0;f[ta>>2]=ra;u=e;return}}function jc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;g=u;u=u+48|0;i=g+28|0;j=g+8|0;k=g;l=g+16|0;m=i+16|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;n[m>>2]=$(1.0);o=a+80|0;p=f[o>>2]|0;f[l>>2]=0;q=l+4|0;f[q>>2]=0;f[l+8>>2]=0;if(p){if(p>>>0>1073741823)aq(l);r=p<<2;s=ln(r)|0;f[l>>2]=s;t=s+(p<<2)|0;f[l+8>>2]=t;sj(s|0,0,r|0)|0;f[q>>2]=t;t=f[e>>2]|0;e=c+48|0;r=c+40|0;s=i+4|0;p=i+12|0;v=i+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=e;B=f[A>>2]|0;C=f[A+4>>2]|0;A=r;D=un(f[A>>2]|0,f[A+4>>2]|0,t+y|0,0)|0;A=Vn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;A=C;B=h[A>>0]|h[A+1>>0]<<8|h[A+2>>0]<<16|h[A+3>>0]<<24;A=C+4|0;C=h[A>>0]|h[A+1>>0]<<8|h[A+2>>0]<<16|h[A+3>>0]<<24;A=j;f[A>>2]=B;f[A+4>>2]=C;A=k;f[A>>2]=B;f[A+4>>2]=C;C=yf(i,k)|0;if(!C){A=k;B=f[A>>2]|0;D=f[A+4>>2]|0;A=B&65535;E=Yn(B|0,D|0,16)|0;F=E&65535;G=D&65535;H=Yn(B|0,D|0,48)|0;J=H&65535;K=((((A^318)&65535)+239^E&65535)+239^D&65535)+239^H&65535;H=f[s>>2]|0;E=(H|0)==0;a:do if(!E){L=H+-1|0;M=(L&H|0)==0;if(!M)if(K>>>0>>0)N=K;else N=(K>>>0)%(H>>>0)|0;else N=K&L;O=f[(f[i>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(K|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}O=M+8|0;if((((d[O>>1]|0)==A<<16>>16?(d[O+2>>1]|0)==F<<16>>16:0)?(d[M+12>>1]|0)==G<<16>>16:0)?(d[O+6>>1]|0)==J<<16>>16:0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(K|0)){if(M>>>0>>0)T=M;else T=(M>>>0)%(H>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}M=S+8|0;if((((d[M>>1]|0)==A<<16>>16?(d[M+2>>1]|0)==F<<16>>16:0)?(d[S+12>>1]|0)==G<<16>>16:0)?(d[M+6>>1]|0)==J<<16>>16:0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;J=ln(20)|0;G=J+8|0;F=G;d[F>>1]=B;d[F+2>>1]=B>>>16;F=G+4|0;d[F>>1]=D;d[F+2>>1]=D>>>16;f[J+16>>2]=z;f[J+4>>2]=K;f[J>>2]=0;U=$(((f[p>>2]|0)+1|0)>>>0);V=$(H>>>0);X=$(n[m>>2]);do if(E|$(X*V)>>0<3|(H+-1&H|0)!=0)&1;G=~~$(W($(U/X)))>>>0;Sh(i,F>>>0>>0?G:F);F=f[s>>2]|0;G=F+-1|0;if(!(G&F)){Y=F;Z=G&K;break}if(K>>>0>>0){Y=F;Z=K}else{Y=F;Z=(K>>>0)%(F>>>0)|0}}else{Y=H;Z=Q}while(0);H=(f[i>>2]|0)+(Z<<2)|0;K=f[H>>2]|0;if(!K){f[J>>2]=f[v>>2];f[v>>2]=J;f[H>>2]=v;H=f[J>>2]|0;if(H|0){E=f[H+4>>2]|0;H=Y+-1|0;if(H&Y)if(E>>>0>>0)_=E;else _=(E>>>0)%(Y>>>0)|0;else _=E&H;aa=(f[i>>2]|0)+(_<<2)|0;R=44}}else{f[J>>2]=f[K>>2];aa=K;R=44}if((R|0)==44){R=0;f[aa>>2]=J}f[p>>2]=(f[p>>2]|0)+1}K=w;H=f[K>>2]|0;E=un(H|0,f[K+4>>2]|0,z|0,0)|0;kh((f[f[x>>2]>>2]|0)+E|0,j|0,H|0)|0;H=f[l>>2]|0;f[H+(y<<2)>>2]=z;ba=z+1|0;ca=H}else{H=f[l>>2]|0;f[H+(y<<2)>>2]=f[C+16>>2];ba=z;ca=H}y=y+1|0;da=f[o>>2]|0;if(y>>>0>=da>>>0)break;else z=ba}if((ba|0)==(da|0))ea=ca;else{z=a+84|0;if(!(b[z>>0]|0)){y=f[a+72>>2]|0;j=f[a+68>>2]|0;x=j;if((y|0)==(j|0))fa=ca;else{w=y-j>>2;j=0;do{y=x+(j<<2)|0;f[y>>2]=f[ca+(f[y>>2]<<2)>>2];j=j+1|0}while(j>>>0>>0);fa=ca}}else{b[z>>0]=0;z=a+68|0;ca=a+72|0;w=f[ca>>2]|0;j=f[z>>2]|0;x=w-j>>2;y=j;j=w;if(da>>>0<=x>>>0)if(da>>>0>>0?(w=y+(da<<2)|0,(w|0)!=(j|0)):0){f[ca>>2]=j+(~((j+-4-w|0)>>>2)<<2);ga=da}else ga=da;else{Ch(z,da-x|0,1220);ga=f[o>>2]|0}x=f[l>>2]|0;if(!ga)fa=x;else{l=f[a+68>>2]|0;a=0;do{f[l+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);fa=x}}f[o>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[q>>2]|0;if((fa|0)!=(ea|0))f[q>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);Oq(ea);ha=ba}}else ha=0;ba=f[i+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;Oq(ba)}while((ea|0)!=0)}ea=f[i>>2]|0;f[i>>2]=0;if(!ea){u=g;return ha|0}Oq(ea);u=g;return ha|0}function kc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;c=u;u=u+16|0;d=c+8|0;e=c;g=c+4|0;h=a+16|0;i=f[h>>2]|0;j=a+20|0;k=f[j>>2]|0;if((k|0)==(i|0))l=i;else{m=k+(~((k+-4-i|0)>>>2)<<2)|0;f[j>>2]=m;l=m}m=a+24|0;if((l|0)==(f[m>>2]|0)){Ri(h,b);n=f[h>>2]|0;o=f[j>>2]|0}else{f[l>>2]=f[b>>2];k=l+4|0;f[j>>2]=k;n=i;o=k}k=f[a+8>>2]|0;i=(f[k+100>>2]|0)-(f[k+96>>2]|0)|0;k=(i|0)/12|0;if((n|0)==(o|0)){u=c;return 1}n=a+28|0;l=(i|0)>0;i=a+164|0;p=a+12|0;q=a+76|0;r=a+80|0;s=a+72|0;t=a+152|0;v=a+84|0;w=a+272|0;x=a+276|0;y=a+268|0;z=a+168|0;A=a+140|0;B=a+120|0;C=o;do{o=f[C+-4>>2]|0;f[b>>2]=o;a:do if((o|0)!=-1?(D=(o>>>0)/3|0,E=f[n>>2]|0,(f[E+(D>>>5<<2)>>2]&1<<(D&31)|0)==0):0){if(l){D=0;F=E;b:while(1){E=D+1|0;f[i>>2]=(f[i>>2]|0)+1;G=f[b>>2]|0;H=(G|0)==-1?-1:(G>>>0)/3|0;G=F+(H>>>5<<2)|0;f[G>>2]=1<<(H&31)|f[G>>2];G=f[q>>2]|0;if((G|0)==(f[r>>2]|0))Ri(s,b);else{f[G>>2]=f[b>>2];f[q>>2]=G+4}G=f[b>>2]|0;if((G|0)==-1)I=-1;else I=f[(f[f[p>>2]>>2]|0)+(G<<2)>>2]|0;J=(f[(f[t>>2]|0)+(I<<2)>>2]|0)!=-1;K=(f[v>>2]|0)+(I>>>5<<2)|0;L=1<<(I&31);M=f[K>>2]|0;do if(!(M&L)){f[K>>2]=M|L;if(J){N=f[b>>2]|0;O=30;break}f[d>>2]=0;P=f[w>>2]|0;if((P|0)==(f[x>>2]|0))Ri(y,d);else{f[P>>2]=0;f[w>>2]=P+4}P=f[b>>2]|0;Q=P+1|0;if((P|0)!=-1?(R=((Q>>>0)%3|0|0)==0?P+-2|0:Q,(R|0)!=-1):0)S=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;else S=-1;f[b>>2]=S}else{N=G;O=30}while(0);if((O|0)==30){O=0;G=N+1|0;if((N|0)==-1){O=35;break}L=((G>>>0)%3|0|0)==0?N+-2|0:G;if((L|0)==-1)T=-1;else T=f[(f[(f[p>>2]|0)+12>>2]|0)+(L<<2)>>2]|0;f[e>>2]=T;L=(((N>>>0)%3|0|0)==0?2:-1)+N|0;if((L|0)==-1)U=-1;else U=f[(f[(f[p>>2]|0)+12>>2]|0)+(L<<2)>>2]|0;L=(T|0)==-1;M=L?-1:(T>>>0)/3|0;V=(U|0)==-1;W=V?-1:(U>>>0)/3|0;K=((G>>>0)%3|0|0)==0?N+-2|0:G;if(((K|0)!=-1?(G=f[(f[p>>2]|0)+12>>2]|0,R=f[G+(K<<2)>>2]|0,(R|0)!=-1):0)?(K=(R>>>0)/3|0,R=f[n>>2]|0,(f[R+(K>>>5<<2)>>2]&1<<(K&31)|0)==0):0){K=(((N>>>0)%3|0|0)==0?2:-1)+N|0;do if((K|0)!=-1){Q=f[G+(K<<2)>>2]|0;if((Q|0)==-1)break;P=(Q>>>0)/3|0;if(!(f[R+(P>>>5<<2)>>2]&1<<(P&31))){O=63;break b}}while(0);if(!V)xf(a,f[i>>2]|0,H,0,W);f[d>>2]=3;R=f[w>>2]|0;if((R|0)==(f[x>>2]|0))Ri(y,d);else{f[R>>2]=3;f[w>>2]=R+4}X=f[e>>2]|0}else{if(!L){xf(a,f[i>>2]|0,H,1,M);R=f[b>>2]|0;if((R|0)==-1){O=44;break}else Y=R}else Y=N;R=(((Y>>>0)%3|0|0)==0?2:-1)+Y|0;if((R|0)==-1){O=44;break}K=f[(f[(f[p>>2]|0)+12>>2]|0)+(R<<2)>>2]|0;if((K|0)==-1){O=44;break}R=(K>>>0)/3|0;if(f[(f[n>>2]|0)+(R>>>5<<2)>>2]&1<<(R&31)|0){O=44;break}f[d>>2]=5;R=f[w>>2]|0;if((R|0)==(f[x>>2]|0))Ri(y,d);else{f[R>>2]=5;f[w>>2]=R+4}X=U}f[b>>2]=X}if((E|0)>=(k|0))break a;D=E;F=f[n>>2]|0}do if((O|0)==35){O=0;f[e>>2]=-1;O=46}else if((O|0)==44){O=0;if(V)O=46;else{xf(a,f[i>>2]|0,H,0,W);O=46}}else if((O|0)==63){O=0;f[d>>2]=1;F=f[w>>2]|0;if((F|0)==(f[x>>2]|0))Ri(y,d);else{f[F>>2]=1;f[w>>2]=F+4}f[z>>2]=(f[z>>2]|0)+1;if(J?(F=f[(f[t>>2]|0)+(I<<2)>>2]|0,(1<<(F&31)&f[(f[A>>2]|0)+(F>>>5<<2)>>2]|0)==0):0){f[g>>2]=f[b>>2];f[d>>2]=f[g>>2];Pe(a,d,0)|0}F=f[i>>2]|0;f[d>>2]=H;D=je(B,d)|0;f[D>>2]=F;F=f[j>>2]|0;f[F+-4>>2]=U;if((F|0)==(f[m>>2]|0)){Ri(h,e);break}else{f[F>>2]=f[e>>2];f[j>>2]=F+4;break}}while(0);if((O|0)==46){O=0;f[d>>2]=7;F=f[w>>2]|0;if((F|0)==(f[x>>2]|0))Ri(y,d);else{f[F>>2]=7;f[w>>2]=F+4}f[j>>2]=(f[j>>2]|0)+-4}}}else O=11;while(0);if((O|0)==11){O=0;f[j>>2]=C+-4}C=f[j>>2]|0}while((f[h>>2]|0)!=(C|0));u=c;return 1}function lc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;e=u;u=u+48|0;g=e+20|0;i=e+16|0;j=e+12|0;k=e;l=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=f[d>>2]|0;d=c+48|0;q=c+40|0;r=g+4|0;o=g+12|0;t=g+8|0;v=a+40|0;w=a+64|0;x=0;y=0;while(1){z=d;A=f[z>>2]|0;B=f[z+4>>2]|0;z=q;C=un(f[z>>2]|0,f[z+4>>2]|0,s+x|0,0)|0;z=Vn(C|0,I|0,A|0,B|0)|0;B=(f[f[c>>2]>>2]|0)+z|0;z=h[B>>0]|h[B+1>>0]<<8|h[B+2>>0]<<16|h[B+3>>0]<<24;f[i>>2]=z;f[j>>2]=z;z=Ef(g,j)|0;if(!z){B=f[j>>2]|0;A=B&255;C=B>>>8;D=C&255;E=B>>>16;F=E&255;G=B>>>24;H=G&255;J=C&255;C=E&255;E=(((B&255^318)+239^J)+239^C)+239^G;G=f[r>>2]|0;K=(G|0)==0;a:do if(!K){L=G+-1|0;M=(L&G|0)==0;if(!M)if(E>>>0>>0)N=E;else N=(E>>>0)%(G>>>0)|0;else N=E&L;O=f[(f[g>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(E|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}O=M+8|0;if((((b[O>>0]|0)==A<<24>>24?(b[O+1>>0]|0)==D<<24>>24:0)?(b[O+2>>0]|0)==F<<24>>24:0)?(b[O+3>>0]|0)==H<<24>>24:0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(E|0)){if(M>>>0>>0)T=M;else T=(M>>>0)%(G>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}M=S+8|0;if((((b[M>>0]|0)==A<<24>>24?(b[M+1>>0]|0)==D<<24>>24:0)?(b[M+2>>0]|0)==F<<24>>24:0)?(b[M+3>>0]|0)==H<<24>>24:0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;H=ln(16)|0;F=H+8|0;D=B&-16776961|C<<16|J<<8;b[F>>0]=D;b[F+1>>0]=D>>8;b[F+2>>0]=D>>16;b[F+3>>0]=D>>24;f[H+12>>2]=y;f[H+4>>2]=E;f[H>>2]=0;U=$(((f[o>>2]|0)+1|0)>>>0);V=$(G>>>0);X=$(n[l>>2]);do if(K|$(X*V)>>0<3|(G+-1&G|0)!=0)&1;F=~~$(W($(U/X)))>>>0;Zh(g,D>>>0>>0?F:D);D=f[r>>2]|0;F=D+-1|0;if(!(F&D)){Y=D;Z=F&E;break}if(E>>>0>>0){Y=D;Z=E}else{Y=D;Z=(E>>>0)%(D>>>0)|0}}else{Y=G;Z=Q}while(0);G=(f[g>>2]|0)+(Z<<2)|0;E=f[G>>2]|0;if(!E){f[H>>2]=f[t>>2];f[t>>2]=H;f[G>>2]=t;G=f[H>>2]|0;if(G|0){K=f[G+4>>2]|0;G=Y+-1|0;if(G&Y)if(K>>>0>>0)_=K;else _=(K>>>0)%(Y>>>0)|0;else _=K&G;aa=(f[g>>2]|0)+(_<<2)|0;R=44}}else{f[H>>2]=f[E>>2];aa=E;R=44}if((R|0)==44){R=0;f[aa>>2]=H}f[o>>2]=(f[o>>2]|0)+1}E=v;G=f[E>>2]|0;K=un(G|0,f[E+4>>2]|0,y|0,0)|0;kh((f[f[w>>2]>>2]|0)+K|0,i|0,G|0)|0;G=f[k>>2]|0;f[G+(x<<2)>>2]=y;ba=y+1|0;ca=G}else{G=f[k>>2]|0;f[G+(x<<2)>>2]=f[z+12>>2];ba=y;ca=G}x=x+1|0;da=f[m>>2]|0;if(x>>>0>=da>>>0)break;else y=ba}if((ba|0)==(da|0))ea=ca;else{y=a+84|0;if(!(b[y>>0]|0)){x=f[a+72>>2]|0;i=f[a+68>>2]|0;w=i;if((x|0)==(i|0))fa=ca;else{v=x-i>>2;i=0;do{x=w+(i<<2)|0;f[x>>2]=f[ca+(f[x>>2]<<2)>>2];i=i+1|0}while(i>>>0>>0);fa=ca}}else{b[y>>0]=0;y=a+68|0;ca=a+72|0;v=f[ca>>2]|0;i=f[y>>2]|0;w=v-i>>2;x=i;i=v;if(da>>>0<=w>>>0)if(da>>>0>>0?(v=x+(da<<2)|0,(v|0)!=(i|0)):0){f[ca>>2]=i+(~((i+-4-v|0)>>>2)<<2);ga=da}else ga=da;else{Ch(y,da-w|0,1220);ga=f[m>>2]|0}w=f[k>>2]|0;if(!ga)fa=w;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[w+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);fa=w}}f[m>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[p>>2]|0;if((fa|0)!=(ea|0))f[p>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);Oq(ea);ha=ba}}else ha=0;ba=f[g+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;Oq(ba)}while((ea|0)!=0)}ea=f[g>>2]|0;f[g>>2]=0;if(!ea){u=e;return ha|0}Oq(ea);u=e;return ha|0}function mc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=Oa,V=Oa,X=Oa,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;e=u;u=u+80|0;g=e+48|0;h=e+32|0;i=e+16|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+4|0;m=i+8|0;s=i+12|0;t=g+4|0;v=g+12|0;w=g+8|0;x=a+40|0;y=a+64|0;z=0;A=0;while(1){B=d;C=f[B>>2]|0;D=f[B+4>>2]|0;B=p;E=un(f[B>>2]|0,f[B+4>>2]|0,r+A|0,0)|0;B=Vn(E|0,I|0,C|0,D|0)|0;D=(f[f[c>>2]>>2]|0)+B|0;B=h;C=D;E=B+16|0;do{b[B>>0]=b[C>>0]|0;B=B+1|0;C=C+1|0}while((B|0)<(E|0));im(i|0,D|0,16)|0;C=Vf(g,i)|0;if(!C){B=f[i>>2]|0;E=f[q>>2]|0;F=f[m>>2]|0;G=f[s>>2]|0;H=(((B^318)+239^E)+239^F)+239^G;J=f[t>>2]|0;K=(J|0)==0;a:do if(!K){L=J+-1|0;M=(L&J|0)==0;if(!M)if(H>>>0>>0)N=H;else N=(H>>>0)%(J>>>0)|0;else N=H&L;O=f[(f[g>>2]|0)+(N<<2)>>2]|0;if((O|0)!=0?(P=f[O>>2]|0,(P|0)!=0):0){if(M){M=P;while(1){O=f[M+4>>2]|0;if(!((O|0)==(H|0)|(O&L|0)==(N|0))){Q=N;R=31;break a}if((((f[M+8>>2]|0)==(B|0)?(f[M+12>>2]|0)==(E|0):0)?(f[M+16>>2]|0)==(F|0):0)?(f[M+20>>2]|0)==(G|0):0)break a;M=f[M>>2]|0;if(!M){Q=N;R=31;break a}}}else S=P;while(1){M=f[S+4>>2]|0;if((M|0)!=(H|0)){if(M>>>0>>0)T=M;else T=(M>>>0)%(J>>>0)|0;if((T|0)!=(N|0)){Q=N;R=31;break a}}if((((f[S+8>>2]|0)==(B|0)?(f[S+12>>2]|0)==(E|0):0)?(f[S+16>>2]|0)==(F|0):0)?(f[S+20>>2]|0)==(G|0):0)break a;S=f[S>>2]|0;if(!S){Q=N;R=31;break}}}else{Q=N;R=31}}else{Q=0;R=31}while(0);if((R|0)==31){R=0;D=ln(28)|0;f[D+8>>2]=B;f[D+12>>2]=E;f[D+16>>2]=F;f[D+20>>2]=G;f[D+24>>2]=z;f[D+4>>2]=H;f[D>>2]=0;U=$(((f[v>>2]|0)+1|0)>>>0);V=$(J>>>0);X=$(n[k>>2]);do if(K|$(X*V)>>0<3|(J+-1&J|0)!=0)&1;M=~~$(W($(U/X)))>>>0;Wh(g,P>>>0>>0?M:P);P=f[t>>2]|0;M=P+-1|0;if(!(M&P)){Y=P;Z=M&H;break}if(H>>>0

>>0){Y=P;Z=H}else{Y=P;Z=(H>>>0)%(P>>>0)|0}}else{Y=J;Z=Q}while(0);J=(f[g>>2]|0)+(Z<<2)|0;H=f[J>>2]|0;if(!H){f[D>>2]=f[w>>2];f[w>>2]=D;f[J>>2]=w;J=f[D>>2]|0;if(J|0){K=f[J+4>>2]|0;J=Y+-1|0;if(J&Y)if(K>>>0>>0)_=K;else _=(K>>>0)%(Y>>>0)|0;else _=K&J;aa=(f[g>>2]|0)+(_<<2)|0;R=44}}else{f[D>>2]=f[H>>2];aa=H;R=44}if((R|0)==44){R=0;f[aa>>2]=D}f[v>>2]=(f[v>>2]|0)+1}H=x;J=f[H>>2]|0;K=un(J|0,f[H+4>>2]|0,z|0,0)|0;kh((f[f[y>>2]>>2]|0)+K|0,h|0,J|0)|0;J=f[j>>2]|0;f[J+(A<<2)>>2]=z;ba=z+1|0;ca=J}else{J=f[j>>2]|0;f[J+(A<<2)>>2]=f[C+24>>2];ba=z;ca=J}A=A+1|0;da=f[l>>2]|0;if(A>>>0>=da>>>0)break;else z=ba}if((ba|0)==(da|0))ea=ca;else{z=a+84|0;if(!(b[z>>0]|0)){A=f[a+72>>2]|0;h=f[a+68>>2]|0;y=h;if((A|0)==(h|0))fa=ca;else{x=A-h>>2;h=0;do{A=y+(h<<2)|0;f[A>>2]=f[ca+(f[A>>2]<<2)>>2];h=h+1|0}while(h>>>0>>0);fa=ca}}else{b[z>>0]=0;z=a+68|0;ca=a+72|0;x=f[ca>>2]|0;h=f[z>>2]|0;y=x-h>>2;A=h;h=x;if(da>>>0<=y>>>0)if(da>>>0>>0?(x=A+(da<<2)|0,(x|0)!=(h|0)):0){f[ca>>2]=h+(~((h+-4-x|0)>>>2)<<2);ga=da}else ga=da;else{Ch(z,da-y|0,1220);ga=f[l>>2]|0}y=f[j>>2]|0;if(!ga)fa=y;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[y+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);fa=y}}f[l>>2]=ba;ea=fa}if(!ea)ha=ba;else{fa=f[o>>2]|0;if((fa|0)!=(ea|0))f[o>>2]=fa+(~((fa+-4-ea|0)>>>2)<<2);Oq(ea);ha=ba}}else ha=0;ba=f[g+8>>2]|0;if(ba|0){ea=ba;do{ba=ea;ea=f[ea>>2]|0;Oq(ba)}while((ea|0)!=0)}ea=f[g>>2]|0;f[g>>2]=0;if(!ea){u=e;return ha|0}Oq(ea);u=e;return ha|0}function nc(a,c,e){a=a|0;c=c|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=Oa,T=Oa,U=Oa,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;g=u;u=u+48|0;h=g+12|0;i=g+38|0;j=g+32|0;k=g;l=h+16|0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;n[l>>2]=$(1.0);m=a+80|0;o=f[m>>2]|0;f[k>>2]=0;p=k+4|0;f[p>>2]=0;f[k+8>>2]=0;if(o){if(o>>>0>1073741823)aq(k);q=o<<2;r=ln(q)|0;f[k>>2]=r;s=r+(o<<2)|0;f[k+8>>2]=s;sj(r|0,0,q|0)|0;f[p>>2]=s;s=f[e>>2]|0;e=c+48|0;q=c+40|0;r=j+2|0;o=j+4|0;t=h+4|0;v=h+12|0;w=h+8|0;x=a+40|0;y=a+64|0;z=0;A=0;while(1){B=e;C=f[B>>2]|0;D=f[B+4>>2]|0;B=q;E=un(f[B>>2]|0,f[B+4>>2]|0,s+A|0,0)|0;B=Vn(E|0,I|0,C|0,D|0)|0;D=(f[f[c>>2]>>2]|0)+B|0;b[i>>0]=b[D>>0]|0;b[i+1>>0]=b[D+1>>0]|0;b[i+2>>0]=b[D+2>>0]|0;b[i+3>>0]=b[D+3>>0]|0;b[i+4>>0]=b[D+4>>0]|0;b[i+5>>0]=b[D+5>>0]|0;im(j|0,D|0,6)|0;D=dg(h,j)|0;if(!D){B=d[j>>1]|0;C=d[r>>1]|0;E=d[o>>1]|0;F=(((B^318)&65535)+239^C&65535)+239^E&65535;G=f[t>>2]|0;H=(G|0)==0;a:do if(!H){J=G+-1|0;K=(J&G|0)==0;if(!K)if(F>>>0>>0)L=F;else L=(F>>>0)%(G>>>0)|0;else L=F&J;M=f[(f[h>>2]|0)+(L<<2)>>2]|0;if((M|0)!=0?(N=f[M>>2]|0,(N|0)!=0):0){if(K){K=N;while(1){M=f[K+4>>2]|0;if(!((M|0)==(F|0)|(M&J|0)==(L|0))){O=L;P=29;break a}M=K+8|0;if(((d[M>>1]|0)==B<<16>>16?(d[M+2>>1]|0)==C<<16>>16:0)?(d[K+12>>1]|0)==E<<16>>16:0)break a;K=f[K>>2]|0;if(!K){O=L;P=29;break a}}}else Q=N;while(1){K=f[Q+4>>2]|0;if((K|0)!=(F|0)){if(K>>>0>>0)R=K;else R=(K>>>0)%(G>>>0)|0;if((R|0)!=(L|0)){O=L;P=29;break a}}K=Q+8|0;if(((d[K>>1]|0)==B<<16>>16?(d[K+2>>1]|0)==C<<16>>16:0)?(d[Q+12>>1]|0)==E<<16>>16:0)break a;Q=f[Q>>2]|0;if(!Q){O=L;P=29;break}}}else{O=L;P=29}}else{O=0;P=29}while(0);if((P|0)==29){P=0;N=ln(20)|0;d[N+8>>1]=B;d[N+10>>1]=C;d[N+12>>1]=E;f[N+16>>2]=z;f[N+4>>2]=F;f[N>>2]=0;S=$(((f[v>>2]|0)+1|0)>>>0);T=$(G>>>0);U=$(n[l>>2]);do if(H|$(U*T)>>0<3|(G+-1&G|0)!=0)&1;J=~~$(W($(S/U)))>>>0;Th(h,K>>>0>>0?J:K);K=f[t>>2]|0;J=K+-1|0;if(!(J&K)){V=K;X=J&F;break}if(F>>>0>>0){V=K;X=F}else{V=K;X=(F>>>0)%(K>>>0)|0}}else{V=G;X=O}while(0);G=(f[h>>2]|0)+(X<<2)|0;F=f[G>>2]|0;if(!F){f[N>>2]=f[w>>2];f[w>>2]=N;f[G>>2]=w;G=f[N>>2]|0;if(G|0){H=f[G+4>>2]|0;G=V+-1|0;if(G&V)if(H>>>0>>0)Y=H;else Y=(H>>>0)%(V>>>0)|0;else Y=H&G;Z=(f[h>>2]|0)+(Y<<2)|0;P=42}}else{f[N>>2]=f[F>>2];Z=F;P=42}if((P|0)==42){P=0;f[Z>>2]=N}f[v>>2]=(f[v>>2]|0)+1}F=x;G=f[F>>2]|0;H=un(G|0,f[F+4>>2]|0,z|0,0)|0;kh((f[f[y>>2]>>2]|0)+H|0,i|0,G|0)|0;G=f[k>>2]|0;f[G+(A<<2)>>2]=z;_=z+1|0;aa=G}else{G=f[k>>2]|0;f[G+(A<<2)>>2]=f[D+16>>2];_=z;aa=G}A=A+1|0;ba=f[m>>2]|0;if(A>>>0>=ba>>>0)break;else z=_}if((_|0)==(ba|0))ca=aa;else{z=a+84|0;if(!(b[z>>0]|0)){A=f[a+72>>2]|0;i=f[a+68>>2]|0;y=i;if((A|0)==(i|0))da=aa;else{x=A-i>>2;i=0;do{A=y+(i<<2)|0;f[A>>2]=f[aa+(f[A>>2]<<2)>>2];i=i+1|0}while(i>>>0>>0);da=aa}}else{b[z>>0]=0;z=a+68|0;aa=a+72|0;x=f[aa>>2]|0;i=f[z>>2]|0;y=x-i>>2;A=i;i=x;if(ba>>>0<=y>>>0)if(ba>>>0>>0?(x=A+(ba<<2)|0,(x|0)!=(i|0)):0){f[aa>>2]=i+(~((i+-4-x|0)>>>2)<<2);ea=ba}else ea=ba;else{Ch(z,ba-y|0,1220);ea=f[m>>2]|0}y=f[k>>2]|0;if(!ea)da=y;else{k=f[a+68>>2]|0;a=0;do{f[k+(a<<2)>>2]=f[y+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);da=y}}f[m>>2]=_;ca=da}if(!ca)fa=_;else{da=f[p>>2]|0;if((da|0)!=(ca|0))f[p>>2]=da+(~((da+-4-ca|0)>>>2)<<2);Oq(ca);fa=_}}else fa=0;_=f[h+8>>2]|0;if(_|0){ca=_;do{_=ca;ca=f[ca>>2]|0;Oq(_)}while((ca|0)!=0)}ca=f[h>>2]|0;f[h>>2]=0;if(!ca){u=g;return fa|0}Oq(ca);u=g;return fa|0}function oc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0;g=a+8|0;Mh(g,b,d,e);d=f[a+48>>2]|0;h=f[a+52>>2]|0;i=e>>>0>1073741823?-1:e<<2;j=Lq(i)|0;sj(j|0,0,i|0)|0;k=Lq(i)|0;sj(k|0,0,i|0)|0;i=f[a+56>>2]|0;l=i+4|0;m=f[l>>2]|0;n=f[i>>2]|0;o=m-n|0;a:do if((o|0)>4){p=o>>2;q=(e|0)>0;r=a+16|0;s=a+32|0;t=a+12|0;u=a+28|0;v=a+20|0;w=a+24|0;x=d+12|0;y=e<<2;z=p+-1|0;if(m-n>>2>>>0>z>>>0){A=p;B=z;C=n}else aq(i);while(1){z=f[C+(B<<2)>>2]|0;if(q)sj(j|0,0,y|0)|0;if((z|0)!=-1){p=f[x>>2]|0;D=0;E=z;while(1){F=f[p+(E<<2)>>2]|0;if((F|0)!=-1){G=f[d>>2]|0;H=f[h>>2]|0;I=f[H+(f[G+(F<<2)>>2]<<2)>>2]|0;J=F+1|0;K=((J>>>0)%3|0|0)==0?F+-2|0:J;if((K|0)==-1)L=-1;else L=f[G+(K<<2)>>2]|0;K=f[H+(L<<2)>>2]|0;J=(((F>>>0)%3|0|0)==0?2:-1)+F|0;if((J|0)==-1)M=-1;else M=f[G+(J<<2)>>2]|0;J=f[H+(M<<2)>>2]|0;if((I|0)<(B|0)&(K|0)<(B|0)&(J|0)<(B|0)){H=X(I,e)|0;I=X(K,e)|0;K=X(J,e)|0;if(q){J=0;do{f[k+(J<<2)>>2]=(f[b+(J+K<<2)>>2]|0)+(f[b+(J+I<<2)>>2]|0)-(f[b+(J+H<<2)>>2]|0);J=J+1|0}while((J|0)!=(e|0));if(q){J=0;do{H=j+(J<<2)|0;f[H>>2]=(f[H>>2]|0)+(f[k+(J<<2)>>2]|0);J=J+1|0}while((J|0)!=(e|0))}}N=D+1|0}else N=D}else N=D;J=(((E>>>0)%3|0|0)==0?2:-1)+E|0;do if((J|0)!=-1?(H=f[p+(J<<2)>>2]|0,(H|0)!=-1):0)if(!((H>>>0)%3|0)){O=H+2|0;break}else{O=H+-1|0;break}else O=-1;while(0);E=(O|0)==(z|0)?-1:O;if((E|0)==-1)break;else D=N}D=X(B,e)|0;if(N){if(q){E=0;do{z=j+(E<<2)|0;f[z>>2]=(f[z>>2]|0)/(N|0)|0;E=E+1|0}while((E|0)!=(e|0))}E=b+(D<<2)|0;z=c+(D<<2)|0;p=f[g>>2]|0;if((p|0)>0){J=0;H=j;I=p;while(1){if((I|0)>0){p=0;do{K=f[H+(p<<2)>>2]|0;G=f[r>>2]|0;if((K|0)>(G|0)){F=f[s>>2]|0;f[F+(p<<2)>>2]=G;P=F}else{F=f[t>>2]|0;G=f[s>>2]|0;f[G+(p<<2)>>2]=(K|0)<(F|0)?F:K;P=G}p=p+1|0}while((p|0)<(f[g>>2]|0));Q=P}else Q=f[s>>2]|0;p=(f[E+(J<<2)>>2]|0)-(f[Q+(J<<2)>>2]|0)|0;G=z+(J<<2)|0;f[G>>2]=p;if((p|0)>=(f[u>>2]|0)){if((p|0)>(f[w>>2]|0)){R=p-(f[v>>2]|0)|0;S=57}}else{R=(f[v>>2]|0)+p|0;S=57}if((S|0)==57){S=0;f[G>>2]=R}J=J+1|0;I=f[g>>2]|0;if((J|0)>=(I|0))break;else H=Q}}}else{T=D;S=30}}else{T=X(B,e)|0;S=30}if((S|0)==30?(S=0,H=b+(T<<2)|0,I=c+(T<<2)|0,J=f[g>>2]|0,(J|0)>0):0){z=0;E=b+((X(A+-2|0,e)|0)<<2)|0;G=J;while(1){if((G|0)>0){J=0;do{p=f[E+(J<<2)>>2]|0;K=f[r>>2]|0;if((p|0)>(K|0)){F=f[s>>2]|0;f[F+(J<<2)>>2]=K;U=F}else{F=f[t>>2]|0;K=f[s>>2]|0;f[K+(J<<2)>>2]=(p|0)<(F|0)?F:p;U=K}J=J+1|0}while((J|0)<(f[g>>2]|0));V=U}else V=f[s>>2]|0;J=(f[H+(z<<2)>>2]|0)-(f[V+(z<<2)>>2]|0)|0;K=I+(z<<2)|0;f[K>>2]=J;if((J|0)>=(f[u>>2]|0)){if((J|0)>(f[w>>2]|0)){W=J-(f[v>>2]|0)|0;S=42}}else{W=(f[v>>2]|0)+J|0;S=42}if((S|0)==42){S=0;f[K>>2]=W}z=z+1|0;G=f[g>>2]|0;if((z|0)>=(G|0))break;else E=V}}if((A|0)<=2)break a;C=f[i>>2]|0;E=B+-1|0;if((f[l>>2]|0)-C>>2>>>0<=E>>>0)break;else{G=B;B=E;A=G}}aq(i)}while(0);if((e|0)>0)sj(j|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){Mq(k);Mq(j);return 1}i=a+16|0;A=a+32|0;B=a+12|0;C=a+28|0;l=a+20|0;V=a+24|0;a=0;W=j;U=e;while(1){if((U|0)>0){e=0;do{T=f[W+(e<<2)>>2]|0;Q=f[i>>2]|0;if((T|0)>(Q|0)){R=f[A>>2]|0;f[R+(e<<2)>>2]=Q;Y=R}else{R=f[B>>2]|0;Q=f[A>>2]|0;f[Q+(e<<2)>>2]=(T|0)<(R|0)?R:T;Y=Q}e=e+1|0}while((e|0)<(f[g>>2]|0));Z=Y}else Z=f[A>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[Z+(a<<2)>>2]|0)|0;Q=c+(a<<2)|0;f[Q>>2]=e;if((e|0)>=(f[C>>2]|0)){if((e|0)>(f[V>>2]|0)){_=e-(f[l>>2]|0)|0;S=72}}else{_=(f[l>>2]|0)+e|0;S=72}if((S|0)==72){S=0;f[Q>>2]=_}a=a+1|0;U=f[g>>2]|0;if((a|0)>=(U|0))break;else W=Z}Mq(k);Mq(j);return 1}function pc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0;g=a+8|0;Mh(g,b,d,e);d=f[a+48>>2]|0;h=f[a+52>>2]|0;i=e>>>0>1073741823?-1:e<<2;j=Lq(i)|0;sj(j|0,0,i|0)|0;k=Lq(i)|0;sj(k|0,0,i|0)|0;i=f[a+56>>2]|0;l=i+4|0;m=f[l>>2]|0;n=f[i>>2]|0;o=m-n|0;a:do if((o|0)>4){p=o>>2;q=(e|0)>0;r=a+16|0;s=a+32|0;t=a+12|0;u=a+28|0;v=a+20|0;w=a+24|0;x=d+64|0;y=d+28|0;z=e<<2;A=p+-1|0;if(m-n>>2>>>0>A>>>0){B=p;C=A;D=n}else aq(i);while(1){A=f[D+(C<<2)>>2]|0;if(q)sj(j|0,0,z|0)|0;if((A|0)!=-1){p=f[d>>2]|0;E=0;F=A;while(1){if(((f[p+(F>>>5<<2)>>2]&1<<(F&31)|0)==0?(G=f[(f[(f[x>>2]|0)+12>>2]|0)+(F<<2)>>2]|0,(G|0)!=-1):0)?(H=f[y>>2]|0,I=f[h>>2]|0,J=f[I+(f[H+(G<<2)>>2]<<2)>>2]|0,K=G+1|0,L=f[I+(f[H+((((K>>>0)%3|0|0)==0?G+-2|0:K)<<2)>>2]<<2)>>2]|0,K=f[I+(f[H+((((G>>>0)%3|0|0)==0?2:-1)+G<<2)>>2]<<2)>>2]|0,(J|0)<(C|0)&(L|0)<(C|0)&(K|0)<(C|0)):0){G=X(J,e)|0;J=X(L,e)|0;L=X(K,e)|0;if(q){K=0;do{f[k+(K<<2)>>2]=(f[b+(K+L<<2)>>2]|0)+(f[b+(K+J<<2)>>2]|0)-(f[b+(K+G<<2)>>2]|0);K=K+1|0}while((K|0)!=(e|0));if(q){K=0;do{G=j+(K<<2)|0;f[G>>2]=(f[G>>2]|0)+(f[k+(K<<2)>>2]|0);K=K+1|0}while((K|0)!=(e|0))}}M=E+1|0}else M=E;K=(((F>>>0)%3|0|0)==0?2:-1)+F|0;do if(((K|0)!=-1?(f[p+(K>>>5<<2)>>2]&1<<(K&31)|0)==0:0)?(G=f[(f[(f[x>>2]|0)+12>>2]|0)+(K<<2)>>2]|0,(G|0)!=-1):0)if(!((G>>>0)%3|0)){N=G+2|0;break}else{N=G+-1|0;break}else N=-1;while(0);F=(N|0)==(A|0)?-1:N;if((F|0)==-1)break;else E=M}E=X(C,e)|0;if(M){if(q){F=0;do{A=j+(F<<2)|0;f[A>>2]=(f[A>>2]|0)/(M|0)|0;F=F+1|0}while((F|0)!=(e|0))}F=b+(E<<2)|0;A=c+(E<<2)|0;p=f[g>>2]|0;if((p|0)>0){K=0;G=j;J=p;while(1){if((J|0)>0){p=0;do{L=f[G+(p<<2)>>2]|0;H=f[r>>2]|0;if((L|0)>(H|0)){I=f[s>>2]|0;f[I+(p<<2)>>2]=H;O=I}else{I=f[t>>2]|0;H=f[s>>2]|0;f[H+(p<<2)>>2]=(L|0)<(I|0)?I:L;O=H}p=p+1|0}while((p|0)<(f[g>>2]|0));P=O}else P=f[s>>2]|0;p=(f[F+(K<<2)>>2]|0)-(f[P+(K<<2)>>2]|0)|0;H=A+(K<<2)|0;f[H>>2]=p;if((p|0)>=(f[u>>2]|0)){if((p|0)>(f[w>>2]|0)){Q=p-(f[v>>2]|0)|0;R=55}}else{Q=(f[v>>2]|0)+p|0;R=55}if((R|0)==55){R=0;f[H>>2]=Q}K=K+1|0;J=f[g>>2]|0;if((K|0)>=(J|0))break;else G=P}}}else{S=E;R=28}}else{S=X(C,e)|0;R=28}if((R|0)==28?(R=0,G=b+(S<<2)|0,J=c+(S<<2)|0,K=f[g>>2]|0,(K|0)>0):0){A=0;F=b+((X(B+-2|0,e)|0)<<2)|0;H=K;while(1){if((H|0)>0){K=0;do{p=f[F+(K<<2)>>2]|0;L=f[r>>2]|0;if((p|0)>(L|0)){I=f[s>>2]|0;f[I+(K<<2)>>2]=L;T=I}else{I=f[t>>2]|0;L=f[s>>2]|0;f[L+(K<<2)>>2]=(p|0)<(I|0)?I:p;T=L}K=K+1|0}while((K|0)<(f[g>>2]|0));U=T}else U=f[s>>2]|0;K=(f[G+(A<<2)>>2]|0)-(f[U+(A<<2)>>2]|0)|0;L=J+(A<<2)|0;f[L>>2]=K;if((K|0)>=(f[u>>2]|0)){if((K|0)>(f[w>>2]|0)){V=K-(f[v>>2]|0)|0;R=40}}else{V=(f[v>>2]|0)+K|0;R=40}if((R|0)==40){R=0;f[L>>2]=V}A=A+1|0;H=f[g>>2]|0;if((A|0)>=(H|0))break;else F=U}}if((B|0)<=2)break a;D=f[i>>2]|0;F=C+-1|0;if((f[l>>2]|0)-D>>2>>>0<=F>>>0)break;else{H=C;C=F;B=H}}aq(i)}while(0);if((e|0)>0)sj(j|0,0,e<<2|0)|0;e=f[g>>2]|0;if((e|0)<=0){Mq(k);Mq(j);return 1}i=a+16|0;B=a+32|0;C=a+12|0;D=a+28|0;l=a+20|0;U=a+24|0;a=0;V=j;T=e;while(1){if((T|0)>0){e=0;do{S=f[V+(e<<2)>>2]|0;P=f[i>>2]|0;if((S|0)>(P|0)){Q=f[B>>2]|0;f[Q+(e<<2)>>2]=P;W=Q}else{Q=f[C>>2]|0;P=f[B>>2]|0;f[P+(e<<2)>>2]=(S|0)<(Q|0)?Q:S;W=P}e=e+1|0}while((e|0)<(f[g>>2]|0));Y=W}else Y=f[B>>2]|0;e=(f[b+(a<<2)>>2]|0)-(f[Y+(a<<2)>>2]|0)|0;P=c+(a<<2)|0;f[P>>2]=e;if((e|0)>=(f[D>>2]|0)){if((e|0)>(f[U>>2]|0)){Z=e-(f[l>>2]|0)|0;R=70}}else{Z=(f[l>>2]|0)+e|0;R=70}if((R|0)==70){R=0;f[P>>2]=Z}a=a+1|0;T=f[g>>2]|0;if((a|0)>=(T|0))break;else V=Y}Mq(k);Mq(j);return 1}function qc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;e=u;u=u+64|0;d=e+48|0;h=e+40|0;i=e+32|0;j=e+16|0;k=e+8|0;l=e;m=e+28|0;n=a+8|0;o=f[n>>2]|0;if((o+-2|0)>>>0<=28){f[a+72>>2]=o;p=1<>2]=p+-1;o=p+-2|0;f[a+80>>2]=o;f[a+84>>2]=(o|0)/2|0}o=a+40|0;f[a+48>>2]=g;g=a+88|0;tk(g);p=a+36|0;q=f[p>>2]|0;r=(f[q+4>>2]|0)-(f[q>>2]|0)|0;s=r>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;t=k;f[t>>2]=0;f[t+4>>2]=0;t=l;f[t>>2]=0;f[t+4>>2]=0;if((r|0)<=0){u=e;return 1}r=j+4|0;t=j+8|0;v=a+84|0;w=a+80|0;x=h+4|0;y=i+4|0;z=d+4|0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=l+4|0;F=a+76|0;a=k+4|0;G=l+4|0;H=f[q>>2]|0;if((f[q+4>>2]|0)==(H|0)){J=q;aq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];ic(o,d,j);H=f[j>>2]|0;q=(H|0)>-1?H:0-H|0;M=f[r>>2]|0;N=(M|0)>-1?M:0-M|0;O=Vn(N|0,((N|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=f[t>>2]|0;N=(q|0)>-1;P=N?q:0-q|0;q=Vn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((q|0)==0&(P|0)==0){O=f[v>>2]|0;Q=O;R=j;S=M;T=O}else{O=f[v>>2]|0;U=((O|0)<0)<<31>>31;V=un(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=Ik(V|0,I|0,q|0,P|0)|0;f[j>>2]=H;V=un(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=Ik(V|0,I|0,q|0,P|0)|0;f[r>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=t;S=M;T=O}f[R>>2]=Q;O=f[j>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[t>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[t>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[t>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){q=(N|0)==(Z|0);if(!(P&q)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(q&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);P=0-S|0;M=0-_|0;f[j>>2]=0-O;f[r>>2]=P;f[t>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(q=(N|0)==(ca|0),!(M&q)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(q&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);N=K<<1;M=b+(N<<2)|0;H=M+4|0;O=f[H>>2]|0;f[h>>2]=f[M>>2];f[x>>2]=O;f[i>>2]=$;f[y>>2]=aa;Od(d,n,h,i);O=f[d>>2]|0;f[k>>2]=O;P=f[z>>2]|0;f[A>>2]=P;q=f[H>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=q;f[i>>2]=da;f[C>>2]=ea;Od(d,n,h,i);q=f[d>>2]|0;f[l>>2]=q;M=f[D>>2]|0;f[E>>2]=M;H=f[v>>2]|0;if((H|0)>=(O|0))if((O|0)<(0-H|0))fa=(f[F>>2]|0)+O|0;else fa=O;else fa=O-(f[F>>2]|0)|0;f[k>>2]=fa;if((H|0)>=(P|0))if((P|0)<(0-H|0))ga=(f[F>>2]|0)+P|0;else ga=P;else ga=P-(f[F>>2]|0)|0;f[a>>2]=ga;if((H|0)>=(q|0))if((q|0)<(0-H|0))ha=(f[F>>2]|0)+q|0;else ha=q;else ha=q-(f[F>>2]|0)|0;f[l>>2]=ha;if((H|0)>=(M|0))if((M|0)<(0-H|0))ia=(f[F>>2]|0)+M|0;else ia=M;else ia=M-(f[F>>2]|0)|0;f[G>>2]=ia;if((((ga|0)>-1?ga:0-ga|0)+((fa|0)>-1?fa:0-fa|0)|0)<(((ha|0)>-1?ha:0-ha|0)+((ia|0)>-1?ia:0-ia|0)|0)){fj(g,0);ja=k}else{fj(g,1);ja=l}M=f[ja>>2]|0;if((M|0)<0)ka=(f[F>>2]|0)+M|0;else ka=M;M=c+(N<<2)|0;f[M>>2]=ka;N=f[ja+4>>2]|0;if((N|0)<0)la=(f[F>>2]|0)+N|0;else la=N;f[M+4>>2]=la;K=K+1|0;if((K|0)>=(s|0)){ma=5;break}M=f[p>>2]|0;L=f[M>>2]|0;if((f[M+4>>2]|0)-L>>2>>>0<=K>>>0){J=M;ma=6;break}}if((ma|0)==5){u=e;return 1}else if((ma|0)==6)aq(J);return 0}function rc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;c=u;u=u+48|0;d=c+24|0;e=c+12|0;g=c;if(!b){h=0;u=c;return h|0}i=a+12|0;j=a+4|0;k=f[j>>2]|0;l=f[a>>2]|0;m=k-l>>2;n=a+16|0;o=f[n>>2]|0;p=f[i>>2]|0;q=o-p>>2;r=p;p=o;if(m>>>0<=q>>>0)if(m>>>0>>0?(o=r+(m<<2)|0,(o|0)!=(p|0)):0){f[n>>2]=p+(~((p+-4-o|0)>>>2)<<2);s=l;t=k}else{s=l;t=k}else{Ch(i,m-q|0,6140);s=f[a>>2]|0;t=f[j>>2]|0}f[d>>2]=0;q=d+4|0;f[q>>2]=0;f[d+8>>2]=0;gk(d,t-s>>2);s=f[j>>2]|0;t=f[a>>2]|0;if((s|0)==(t|0)){v=s;w=s}else{m=f[d>>2]|0;k=m;l=k;o=0;p=s;s=k;k=t;t=m;while(1){m=f[k+(o<<2)>>2]|0;n=f[q>>2]|0;if(m>>>0>2>>>0){x=l;y=s;z=k;A=p}else{r=m+1|0;f[e>>2]=0;B=n-t>>2;C=t;D=n;if(r>>>0<=B>>>0)if(r>>>0>>0?(n=C+(r<<2)|0,(n|0)!=(D|0)):0){f[q>>2]=D+(~((D+-4-n|0)>>>2)<<2);E=l;F=p;G=k}else{E=l;F=p;G=k}else{Ch(d,r-B|0,e);E=f[d>>2]|0;F=f[j>>2]|0;G=f[a>>2]|0}x=E;y=E;z=G;A=F}B=y+(m<<2)|0;f[B>>2]=(f[B>>2]|0)+1;o=o+1|0;if(o>>>0>=A-z>>2>>>0){v=z;w=A;break}else{l=x;p=A;s=y;k=z;t=y}}}y=w-v|0;v=y>>2;f[e>>2]=0;w=e+4|0;f[w>>2]=0;f[e+8>>2]=0;if(!v){H=0;I=0}else{if(v>>>0>536870911)aq(e);t=ln(y<<1)|0;f[w>>2]=t;f[e>>2]=t;y=t+(v<<3)|0;f[e+8>>2]=y;z=v;v=t;k=t;while(1){s=v;f[s>>2]=-1;f[s+4>>2]=-1;s=k+8|0;A=z+-1|0;if(!A)break;else{z=A;v=s;k=s}}f[w>>2]=y;H=t;I=t}t=f[q>>2]|0;y=f[d>>2]|0;k=t-y|0;v=k>>2;f[g>>2]=0;z=g+4|0;f[z>>2]=0;f[g+8>>2]=0;s=y;do if(v)if(v>>>0>1073741823)aq(g);else{A=ln(k)|0;f[g>>2]=A;p=A+(v<<2)|0;f[g+8>>2]=p;sj(A|0,0,k|0)|0;f[z>>2]=p;J=A;K=p;L=A;break}else{J=0;K=0;L=0}while(0);if((t|0)!=(y|0)){y=0;t=0;while(1){f[J+(t<<2)>>2]=y;k=t+1|0;if(k>>>0>>0){y=(f[s+(t<<2)>>2]|0)+y|0;t=k}else break}}t=f[j>>2]|0;j=f[a>>2]|0;y=j;if((t|0)!=(j|0)){k=a+40|0;a=t-j>>2;j=H;t=H;g=H;A=H;p=H;x=H;l=0;o=J;while(1){F=f[y+(l<<2)>>2]|0;G=l+1|0;E=((G>>>0)%3|0|0)==0?l+-2|0:G;if((E|0)==-1)M=-1;else M=f[y+(E<<2)>>2]|0;E=((l>>>0)%3|0|0)==0;G=(E?2:-1)+l|0;if((G|0)==-1)N=-1;else N=f[y+(G<<2)>>2]|0;if(E?(M|0)==(N|0)|((F|0)==(M|0)|(F|0)==(N|0)):0){f[k>>2]=(f[k>>2]|0)+1;O=j;P=t;Q=g;R=A;S=p;T=x;U=l+2|0;V=o}else W=51;a:do if((W|0)==51){W=0;E=f[s+(N<<2)>>2]|0;b:do if((E|0)>0){G=0;B=f[o+(N<<2)>>2]|0;while(1){m=f[p+(B<<3)>>2]|0;if((m|0)==-1){X=j;Y=t;Z=A;_=p;break b}if((m|0)==(M|0)){m=f[p+(B<<3)+4>>2]|0;if((m|0)==-1)$=-1;else $=f[y+(m<<2)>>2]|0;if((F|0)!=($|0))break}m=G+1|0;if((m|0)<(E|0)){G=m;B=B+1|0}else{X=j;Y=t;Z=A;_=p;break b}}m=f[A+(B<<3)+4>>2]|0;r=G;n=B;D=t;while(1){r=r+1|0;if((r|0)>=(E|0))break;C=n+1|0;f[D+(n<<3)>>2]=f[D+(C<<3)>>2];f[D+(n<<3)+4>>2]=f[D+(C<<3)+4>>2];if((f[j+(n<<3)>>2]|0)==-1)break;else{n=C;D=j}}f[g+(n<<3)>>2]=-1;if((m|0)==-1){X=g;Y=g;Z=g;_=g}else{D=f[i>>2]|0;f[D+(l<<2)>>2]=m;f[D+(m<<2)>>2]=l;O=g;P=g;Q=g;R=g;S=g;T=x;U=l;V=o;break a}}else{X=j;Y=t;Z=A;_=p}while(0);E=f[s+(M<<2)>>2]|0;if((E|0)>0){D=0;r=f[J+(M<<2)>>2]|0;while(1){aa=x+(r<<3)|0;if((f[aa>>2]|0)==-1)break;D=D+1|0;if((D|0)>=(E|0)){O=x;P=x;Q=x;R=x;S=x;T=x;U=l;V=J;break a}else r=r+1|0}f[aa>>2]=N;f[H+(r<<3)+4>>2]=l;O=H;P=H;Q=H;R=H;S=H;T=H;U=l;V=J}else{O=X;P=Y;Q=g;R=Z;S=_;T=x;U=l;V=o}}while(0);l=U+1|0;if(l>>>0>=a>>>0)break;else{j=O;t=P;g=Q;A=R;p=S;x=T;o=V}}}f[b>>2]=v;if(!J){ba=H;ca=I}else{if((K|0)!=(J|0))f[z>>2]=K+(~((K+-4-J|0)>>>2)<<2);Oq(L);L=f[e>>2]|0;ba=L;ca=L}if(ba|0){L=f[w>>2]|0;if((L|0)!=(ba|0))f[w>>2]=L+(~((L+-8-ba|0)>>>3)<<3);Oq(ca)}ca=f[d>>2]|0;if(ca|0){d=f[q>>2]|0;if((d|0)!=(ca|0))f[q>>2]=d+(~((d+-4-ca|0)>>>2)<<2);Oq(ca)}h=1;u=c;return h|0}function sc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=Oa,S=Oa,T=Oa,U=0,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0;e=u;u=u+48|0;g=e+12|0;h=e+35|0;i=e+32|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+1|0;m=i+2|0;s=g+4|0;t=g+12|0;v=g+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=d;B=f[A>>2]|0;C=f[A+4>>2]|0;A=p;D=un(f[A>>2]|0,f[A+4>>2]|0,r+y|0,0)|0;A=Vn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;b[h>>0]=b[C>>0]|0;b[h+1>>0]=b[C+1>>0]|0;b[h+2>>0]=b[C+2>>0]|0;im(i|0,C|0,3)|0;C=jg(g,i)|0;if(!C){A=b[i>>0]|0;B=b[q>>0]|0;D=b[m>>0]|0;E=((A&255^318)+239^B&255)+239^D&255;F=f[s>>2]|0;G=(F|0)==0;a:do if(!G){H=F+-1|0;J=(H&F|0)==0;if(!J)if(E>>>0>>0)K=E;else K=(E>>>0)%(F>>>0)|0;else K=E&H;L=f[(f[g>>2]|0)+(K<<2)>>2]|0;if((L|0)!=0?(M=f[L>>2]|0,(M|0)!=0):0){if(J){J=M;while(1){L=f[J+4>>2]|0;if(!((L|0)==(E|0)|(L&H|0)==(K|0))){N=K;O=29;break a}L=J+8|0;if(((b[L>>0]|0)==A<<24>>24?(b[L+1>>0]|0)==B<<24>>24:0)?(b[L+2>>0]|0)==D<<24>>24:0)break a;J=f[J>>2]|0;if(!J){N=K;O=29;break a}}}else P=M;while(1){J=f[P+4>>2]|0;if((J|0)!=(E|0)){if(J>>>0>>0)Q=J;else Q=(J>>>0)%(F>>>0)|0;if((Q|0)!=(K|0)){N=K;O=29;break a}}J=P+8|0;if(((b[J>>0]|0)==A<<24>>24?(b[J+1>>0]|0)==B<<24>>24:0)?(b[J+2>>0]|0)==D<<24>>24:0)break a;P=f[P>>2]|0;if(!P){N=K;O=29;break}}}else{N=K;O=29}}else{N=0;O=29}while(0);if((O|0)==29){O=0;M=ln(16)|0;b[M+8>>0]=A;b[M+9>>0]=B;b[M+10>>0]=D;f[M+12>>2]=z;f[M+4>>2]=E;f[M>>2]=0;R=$(((f[t>>2]|0)+1|0)>>>0);S=$(F>>>0);T=$(n[k>>2]);do if(G|$(T*S)>>0<3|(F+-1&F|0)!=0)&1;H=~~$(W($(R/T)))>>>0;_h(g,J>>>0>>0?H:J);J=f[s>>2]|0;H=J+-1|0;if(!(H&J)){U=J;V=H&E;break}if(E>>>0>>0){U=J;V=E}else{U=J;V=(E>>>0)%(J>>>0)|0}}else{U=F;V=N}while(0);F=(f[g>>2]|0)+(V<<2)|0;E=f[F>>2]|0;if(!E){f[M>>2]=f[v>>2];f[v>>2]=M;f[F>>2]=v;F=f[M>>2]|0;if(F|0){G=f[F+4>>2]|0;F=U+-1|0;if(F&U)if(G>>>0>>0)X=G;else X=(G>>>0)%(U>>>0)|0;else X=G&F;Y=(f[g>>2]|0)+(X<<2)|0;O=42}}else{f[M>>2]=f[E>>2];Y=E;O=42}if((O|0)==42){O=0;f[Y>>2]=M}f[t>>2]=(f[t>>2]|0)+1}E=w;F=f[E>>2]|0;G=un(F|0,f[E+4>>2]|0,z|0,0)|0;kh((f[f[x>>2]>>2]|0)+G|0,h|0,F|0)|0;F=f[j>>2]|0;f[F+(y<<2)>>2]=z;Z=z+1|0;_=F}else{F=f[j>>2]|0;f[F+(y<<2)>>2]=f[C+12>>2];Z=z;_=F}y=y+1|0;aa=f[l>>2]|0;if(y>>>0>=aa>>>0)break;else z=Z}if((Z|0)==(aa|0))ba=_;else{z=a+84|0;if(!(b[z>>0]|0)){y=f[a+72>>2]|0;h=f[a+68>>2]|0;x=h;if((y|0)==(h|0))ca=_;else{w=y-h>>2;h=0;do{y=x+(h<<2)|0;f[y>>2]=f[_+(f[y>>2]<<2)>>2];h=h+1|0}while(h>>>0>>0);ca=_}}else{b[z>>0]=0;z=a+68|0;_=a+72|0;w=f[_>>2]|0;h=f[z>>2]|0;x=w-h>>2;y=h;h=w;if(aa>>>0<=x>>>0)if(aa>>>0>>0?(w=y+(aa<<2)|0,(w|0)!=(h|0)):0){f[_>>2]=h+(~((h+-4-w|0)>>>2)<<2);da=aa}else da=aa;else{Ch(z,aa-x|0,1220);da=f[l>>2]|0}x=f[j>>2]|0;if(!da)ca=x;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);ca=x}}f[l>>2]=Z;ba=ca}if(!ba)ea=Z;else{ca=f[o>>2]|0;if((ca|0)!=(ba|0))f[o>>2]=ca+(~((ca+-4-ba|0)>>>2)<<2);Oq(ba);ea=Z}}else ea=0;Z=f[g+8>>2]|0;if(Z|0){ba=Z;do{Z=ba;ba=f[ba>>2]|0;Oq(Z)}while((ba|0)!=0)}ba=f[g>>2]|0;f[g>>2]=0;if(!ba){u=e;return ea|0}Oq(ba);u=e;return ea|0}function tc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;e=u;u=u+64|0;d=e+48|0;h=e+40|0;i=e+32|0;j=e+16|0;k=e+8|0;l=e;m=e+28|0;n=a+8|0;o=f[n>>2]|0;if((o+-2|0)>>>0<=28){f[a+72>>2]=o;p=1<>2]=p+-1;o=p+-2|0;f[a+80>>2]=o;f[a+84>>2]=(o|0)/2|0}o=a+40|0;f[a+48>>2]=g;g=a+88|0;tk(g);p=a+36|0;q=f[p>>2]|0;r=(f[q+4>>2]|0)-(f[q>>2]|0)|0;s=r>>2;f[j>>2]=0;f[j+4>>2]=0;f[j+8>>2]=0;t=k;f[t>>2]=0;f[t+4>>2]=0;t=l;f[t>>2]=0;f[t+4>>2]=0;if((r|0)<=0){u=e;return 1}r=j+4|0;t=j+8|0;v=a+84|0;w=a+80|0;x=h+4|0;y=i+4|0;z=d+4|0;A=k+4|0;B=h+4|0;C=i+4|0;D=d+4|0;E=l+4|0;F=a+76|0;a=k+4|0;G=l+4|0;H=f[q>>2]|0;if((f[q+4>>2]|0)==(H|0)){J=q;aq(J)}else{K=0;L=H}while(1){f[m>>2]=f[L+(K<<2)>>2];f[d>>2]=f[m>>2];$b(o,d,j);H=f[j>>2]|0;q=(H|0)>-1?H:0-H|0;M=f[r>>2]|0;N=(M|0)>-1?M:0-M|0;O=Vn(N|0,((N|0)<0)<<31>>31|0,q|0,((q|0)<0)<<31>>31|0)|0;q=f[t>>2]|0;N=(q|0)>-1;P=N?q:0-q|0;q=Vn(O|0,I|0,P|0,((P|0)<0)<<31>>31|0)|0;P=I;if((q|0)==0&(P|0)==0){O=f[v>>2]|0;Q=O;R=j;S=M;T=O}else{O=f[v>>2]|0;U=((O|0)<0)<<31>>31;V=un(O|0,U|0,H|0,((H|0)<0)<<31>>31|0)|0;H=Ik(V|0,I|0,q|0,P|0)|0;f[j>>2]=H;V=un(O|0,U|0,M|0,((M|0)<0)<<31>>31|0)|0;M=Ik(V|0,I|0,q|0,P|0)|0;f[r>>2]=M;P=O-((H|0)>-1?H:0-H|0)-((M|0)>-1?M:0-M|0)|0;Q=N?P:0-P|0;R=t;S=M;T=O}f[R>>2]=Q;O=f[j>>2]|0;do if((O|0)<=-1){if((S|0)<0){M=f[t>>2]|0;W=(M|0)>-1?M:0-M|0;X=M}else{M=f[t>>2]|0;W=(f[w>>2]|0)-((M|0)>-1?M:0-M|0)|0;X=M}if((X|0)<0){Y=(S|0)>-1?S:0-S|0;Z=W;_=X;break}else{Y=(f[w>>2]|0)-((S|0)>-1?S:0-S|0)|0;Z=W;_=X;break}}else{M=f[t>>2]|0;Y=M+T|0;Z=T+S|0;_=M}while(0);M=(Z|0)==0;P=(Y|0)==0;N=f[w>>2]|0;do if(Y|Z){H=(N|0)==(Y|0);if(!(M&H)){q=(N|0)==(Z|0);if(!(P&q)){if(M&(T|0)<(Y|0)){$=0;aa=(T<<1)-Y|0;break}if(q&(T|0)>(Y|0)){$=Z;aa=(T<<1)-Y|0;break}if(H&(T|0)>(Z|0)){$=(T<<1)-Z|0;aa=Y;break}if(P){$=(T|0)<(Z|0)?(T<<1)-Z|0:Z;aa=0}else{$=Z;aa=Y}}else{$=Z;aa=Z}}else{$=Y;aa=Y}}else{$=N;aa=N}while(0);P=0-S|0;M=0-_|0;f[j>>2]=0-O;f[r>>2]=P;f[t>>2]=M;if((O|0)<1){ba=T-_|0;ca=T-S|0}else{H=(_|0)<1?M:_;M=(S|0)<1?P:S;ba=(_|0)>0?M:N-M|0;ca=(S|0)>0?H:N-H|0}H=(ca|0)==0;M=(ba|0)==0;do if(((ba|ca|0)!=0?(P=(N|0)==(ba|0),!(H&P)):0)?(q=(N|0)==(ca|0),!(M&q)):0){if(H&(T|0)<(ba|0)){da=0;ea=(T<<1)-ba|0;break}if(q&(T|0)>(ba|0)){da=N;ea=(T<<1)-ba|0;break}if(P&(T|0)>(ca|0)){da=(T<<1)-ca|0;ea=N;break}if(M){da=(T|0)<(ca|0)?(T<<1)-ca|0:ca;ea=0}else{da=ca;ea=ba}}else{da=N;ea=N}while(0);N=K<<1;M=b+(N<<2)|0;H=M+4|0;O=f[H>>2]|0;f[h>>2]=f[M>>2];f[x>>2]=O;f[i>>2]=$;f[y>>2]=aa;Od(d,n,h,i);O=f[d>>2]|0;f[k>>2]=O;P=f[z>>2]|0;f[A>>2]=P;q=f[H>>2]|0;f[h>>2]=f[M>>2];f[B>>2]=q;f[i>>2]=da;f[C>>2]=ea;Od(d,n,h,i);q=f[d>>2]|0;f[l>>2]=q;M=f[D>>2]|0;f[E>>2]=M;H=f[v>>2]|0;if((H|0)>=(O|0))if((O|0)<(0-H|0))fa=(f[F>>2]|0)+O|0;else fa=O;else fa=O-(f[F>>2]|0)|0;f[k>>2]=fa;if((H|0)>=(P|0))if((P|0)<(0-H|0))ga=(f[F>>2]|0)+P|0;else ga=P;else ga=P-(f[F>>2]|0)|0;f[a>>2]=ga;if((H|0)>=(q|0))if((q|0)<(0-H|0))ha=(f[F>>2]|0)+q|0;else ha=q;else ha=q-(f[F>>2]|0)|0;f[l>>2]=ha;if((H|0)>=(M|0))if((M|0)<(0-H|0))ia=(f[F>>2]|0)+M|0;else ia=M;else ia=M-(f[F>>2]|0)|0;f[G>>2]=ia;if((((ga|0)>-1?ga:0-ga|0)+((fa|0)>-1?fa:0-fa|0)|0)<(((ha|0)>-1?ha:0-ha|0)+((ia|0)>-1?ia:0-ia|0)|0)){fj(g,0);ja=k}else{fj(g,1);ja=l}M=f[ja>>2]|0;if((M|0)<0)ka=(f[F>>2]|0)+M|0;else ka=M;M=c+(N<<2)|0;f[M>>2]=ka;N=f[ja+4>>2]|0;if((N|0)<0)la=(f[F>>2]|0)+N|0;else la=N;f[M+4>>2]=la;K=K+1|0;if((K|0)>=(s|0)){ma=5;break}M=f[p>>2]|0;L=f[M>>2]|0;if((f[M+4>>2]|0)-L>>2>>>0<=K>>>0){J=M;ma=6;break}}if((ma|0)==5){u=e;return 1}else if((ma|0)==6)aq(J);return 0}function uc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=Oa,T=Oa,U=Oa,V=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;e=u;u=u+64|0;g=e+36|0;h=e+24|0;i=e+12|0;j=e;k=g+16|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;n[k>>2]=$(1.0);l=a+80|0;m=f[l>>2]|0;f[j>>2]=0;o=j+4|0;f[o>>2]=0;f[j+8>>2]=0;if(m){if(m>>>0>1073741823)aq(j);p=m<<2;q=ln(p)|0;f[j>>2]=q;r=q+(m<<2)|0;f[j+8>>2]=r;sj(q|0,0,p|0)|0;f[o>>2]=r;r=f[d>>2]|0;d=c+48|0;p=c+40|0;q=i+4|0;m=i+8|0;s=g+4|0;t=g+12|0;v=g+8|0;w=a+40|0;x=a+64|0;y=0;z=0;while(1){A=d;B=f[A>>2]|0;C=f[A+4>>2]|0;A=p;D=un(f[A>>2]|0,f[A+4>>2]|0,r+z|0,0)|0;A=Vn(D|0,I|0,B|0,C|0)|0;C=(f[f[c>>2]>>2]|0)+A|0;A=h;B=C;D=A+12|0;do{b[A>>0]=b[B>>0]|0;A=A+1|0;B=B+1|0}while((A|0)<(D|0));im(i|0,C|0,12)|0;B=qg(g,i)|0;if(!B){A=f[i>>2]|0;D=f[q>>2]|0;E=f[m>>2]|0;F=((A^318)+239^D)+239^E;G=f[s>>2]|0;H=(G|0)==0;a:do if(!H){J=G+-1|0;K=(J&G|0)==0;if(!K)if(F>>>0>>0)L=F;else L=(F>>>0)%(G>>>0)|0;else L=F&J;M=f[(f[g>>2]|0)+(L<<2)>>2]|0;if((M|0)!=0?(N=f[M>>2]|0,(N|0)!=0):0){if(K){K=N;while(1){M=f[K+4>>2]|0;if(!((M|0)==(F|0)|(M&J|0)==(L|0))){O=L;P=29;break a}if(((f[K+8>>2]|0)==(A|0)?(f[K+12>>2]|0)==(D|0):0)?(f[K+16>>2]|0)==(E|0):0)break a;K=f[K>>2]|0;if(!K){O=L;P=29;break a}}}else Q=N;while(1){K=f[Q+4>>2]|0;if((K|0)!=(F|0)){if(K>>>0>>0)R=K;else R=(K>>>0)%(G>>>0)|0;if((R|0)!=(L|0)){O=L;P=29;break a}}if(((f[Q+8>>2]|0)==(A|0)?(f[Q+12>>2]|0)==(D|0):0)?(f[Q+16>>2]|0)==(E|0):0)break a;Q=f[Q>>2]|0;if(!Q){O=L;P=29;break}}}else{O=L;P=29}}else{O=0;P=29}while(0);if((P|0)==29){P=0;C=ln(24)|0;f[C+8>>2]=A;f[C+12>>2]=D;f[C+16>>2]=E;f[C+20>>2]=y;f[C+4>>2]=F;f[C>>2]=0;S=$(((f[t>>2]|0)+1|0)>>>0);T=$(G>>>0);U=$(n[k>>2]);do if(H|$(U*T)>>0<3|(G+-1&G|0)!=0)&1;K=~~$(W($(S/U)))>>>0;Xh(g,N>>>0>>0?K:N);N=f[s>>2]|0;K=N+-1|0;if(!(K&N)){V=N;X=K&F;break}if(F>>>0>>0){V=N;X=F}else{V=N;X=(F>>>0)%(N>>>0)|0}}else{V=G;X=O}while(0);G=(f[g>>2]|0)+(X<<2)|0;F=f[G>>2]|0;if(!F){f[C>>2]=f[v>>2];f[v>>2]=C;f[G>>2]=v;G=f[C>>2]|0;if(G|0){H=f[G+4>>2]|0;G=V+-1|0;if(G&V)if(H>>>0>>0)Y=H;else Y=(H>>>0)%(V>>>0)|0;else Y=H&G;Z=(f[g>>2]|0)+(Y<<2)|0;P=42}}else{f[C>>2]=f[F>>2];Z=F;P=42}if((P|0)==42){P=0;f[Z>>2]=C}f[t>>2]=(f[t>>2]|0)+1}F=w;G=f[F>>2]|0;H=un(G|0,f[F+4>>2]|0,y|0,0)|0;kh((f[f[x>>2]>>2]|0)+H|0,h|0,G|0)|0;G=f[j>>2]|0;f[G+(z<<2)>>2]=y;_=y+1|0;aa=G}else{G=f[j>>2]|0;f[G+(z<<2)>>2]=f[B+20>>2];_=y;aa=G}z=z+1|0;ba=f[l>>2]|0;if(z>>>0>=ba>>>0)break;else y=_}if((_|0)==(ba|0))ca=aa;else{y=a+84|0;if(!(b[y>>0]|0)){z=f[a+72>>2]|0;h=f[a+68>>2]|0;x=h;if((z|0)==(h|0))da=aa;else{w=z-h>>2;h=0;do{z=x+(h<<2)|0;f[z>>2]=f[aa+(f[z>>2]<<2)>>2];h=h+1|0}while(h>>>0>>0);da=aa}}else{b[y>>0]=0;y=a+68|0;aa=a+72|0;w=f[aa>>2]|0;h=f[y>>2]|0;x=w-h>>2;z=h;h=w;if(ba>>>0<=x>>>0)if(ba>>>0>>0?(w=z+(ba<<2)|0,(w|0)!=(h|0)):0){f[aa>>2]=h+(~((h+-4-w|0)>>>2)<<2);ea=ba}else ea=ba;else{Ch(y,ba-x|0,1220);ea=f[l>>2]|0}x=f[j>>2]|0;if(!ea)da=x;else{j=f[a+68>>2]|0;a=0;do{f[j+(a<<2)>>2]=f[x+(a<<2)>>2];a=a+1|0}while(a>>>0>>0);da=x}}f[l>>2]=_;ca=da}if(!ca)fa=_;else{da=f[o>>2]|0;if((da|0)!=(ca|0))f[o>>2]=da+(~((da+-4-ca|0)>>>2)<<2);Oq(ca);fa=_}}else fa=0;_=f[g+8>>2]|0;if(_|0){ca=_;do{_=ca;ca=f[ca>>2]|0;Oq(_)}while((ca|0)!=0)}ca=f[g>>2]|0;f[g>>2]=0;if(!ca){u=e;return fa|0}Oq(ca);u=e;return fa|0} function di(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;Je(e,a+40|0,f[a+8>>2]|0,b,c);gj(a,e);a=f[e>>2]|0;f[e>>2]=0;if(!a){u=d;return 1}e=a+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){b=c+12|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;Oq(e)}Oq(c)}c=f[a+68>>2]|0;if(c|0){e=a+72|0;b=f[e>>2]|0;if((b|0)!=(c|0))f[e>>2]=b+(~((b+-4-c|0)>>>2)<<2);Oq(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){e=b+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;Oq(c)}Oq(b)}Oq(a);u=d;return 1}function ei(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Bd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Bd(a,e);return}function fi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=u;u=u+48|0;g=e;h=e+32|0;if(!c){i=0;u=e;return i|0}Gn(g);if((dm(c,0)|0)!=-1?Qa[f[(f[c>>2]|0)+16>>2]&127](c)|0:0){Va[f[(f[c>>2]|0)+20>>2]&127](c);ch(h,a,c,g);c=(f[h>>2]|0)==0;a=h+4|0;if((b[a+11>>0]|0)<0)Oq(f[a>>2]|0);if(c){c=f[g>>2]|0;a=g+4|0;rg(d,c,c+((f[a>>2]|0)-c)|0);j=(f[a>>2]|0)-(f[g>>2]|0)|0}else j=0}else j=0;a=g+12|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0)Oq(c);c=f[g>>2]|0;if(c|0){a=g+4|0;if((f[a>>2]|0)!=(c|0))f[a>>2]=c;Oq(c)}i=j;u=e;return i|0}function gi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;Fe(e,a+40|0,f[a+8>>2]|0,b,c);gj(a,e);a=f[e>>2]|0;f[e>>2]=0;if(!a){u=d;return 1}e=a+88|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0){e=f[c+8>>2]|0;if(e|0){b=c+12|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;Oq(e)}Oq(c)}c=f[a+68>>2]|0;if(c|0){e=a+72|0;b=f[e>>2]|0;if((b|0)!=(c|0))f[e>>2]=b+(~((b+-4-c|0)>>>2)<<2);Oq(c)}c=a+64|0;b=f[c>>2]|0;f[c>>2]=0;if(b|0){c=f[b>>2]|0;if(c|0){e=b+4|0;if((f[e>>2]|0)!=(c|0))f[e>>2]=c;Oq(c)}Oq(b)}Oq(a);u=d;return 1}function hi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{d=g+-4|0;f[c>>2]=d;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=h+88|0;i=f[d>>2]|0;f[d>>2]=0;if(i|0){d=f[i+8>>2]|0;if(d|0){j=i+12|0;if((f[j>>2]|0)!=(d|0))f[j>>2]=d;Oq(d)}Oq(i)}i=f[h+68>>2]|0;if(i|0){d=h+72|0;j=f[d>>2]|0;if((j|0)!=(i|0))f[d>>2]=j+(~((j+-4-i|0)>>>2)<<2);Oq(i)}i=h+64|0;j=f[i>>2]|0;f[i>>2]=0;if(j|0){i=f[j>>2]|0;if(i|0){d=j+4|0;if((f[d>>2]|0)!=(i|0))f[d>>2]=i;Oq(i)}Oq(j)}Oq(h)}g=f[c>>2]|0}while((g|0)!=(b|0));e=f[a>>2]|0}Oq(e);return}function ii(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;if(!(Ie(a,c)|0)){i=0;u=d;return i|0}j=a+36|0;k=a+40|0;a=f[j>>2]|0;if((f[k>>2]|0)==(a|0)){i=1;u=d;return i|0}l=c+16|0;m=c+4|0;n=h+1|0;o=0;p=a;do{a=f[p+(o<<2)>>2]|0;q=Qa[f[(f[a>>2]|0)+32>>2]&127](a)|0;b[h>>0]=q;q=l;a=f[q+4>>2]|0;if(!((a|0)>0|(a|0)==0&(f[q>>2]|0)>>>0>0)){f[g>>2]=f[m>>2];f[e>>2]=f[g>>2];Me(c,e,h,n)|0}o=o+1|0;p=f[j>>2]|0}while(o>>>0<(f[k>>2]|0)-p>>2>>>0);i=1;u=d;return i|0}function ji(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=u;u=u+16|0;d=c;lp(a);f[a+16>>2]=0;f[a+20>>2]=0;f[a+12>>2]=a+16;e=a+24|0;lp(e);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;a=ln(32)|0;f[d>>2]=a;f[d+8>>2]=-2147483616;f[d+4>>2]=20;g=a;h=14538;i=g+20|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[a+20>>0]=0;Vj(e,d,1);if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;a=ln(32)|0;f[d>>2]=a;f[d+8>>2]=-2147483616;f[d+4>>2]=22;g=a;h=14559;i=g+22|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[a+22>>0]=0;Vj(e,d,1);if((b[d+11>>0]|0)>=0){u=c;return}Oq(f[d>>2]|0);u=c;return}function ki(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a+4>>2]|0;c=a+8|0;d=f[c>>2]|0;if((d|0)!=(b|0)){e=d;do{d=e+-4|0;f[c>>2]=d;g=f[d>>2]|0;f[d>>2]=0;if(g|0){d=g+88|0;h=f[d>>2]|0;f[d>>2]=0;if(h|0){d=f[h+8>>2]|0;if(d|0){i=h+12|0;if((f[i>>2]|0)!=(d|0))f[i>>2]=d;Oq(d)}Oq(h)}h=f[g+68>>2]|0;if(h|0){d=g+72|0;i=f[d>>2]|0;if((i|0)!=(h|0))f[d>>2]=i+(~((i+-4-h|0)>>>2)<<2);Oq(h)}h=g+64|0;i=f[h>>2]|0;f[h>>2]=0;if(i|0){h=f[i>>2]|0;if(h|0){d=i+4|0;if((f[d>>2]|0)!=(h|0))f[d>>2]=h;Oq(h)}Oq(i)}Oq(g)}e=f[c>>2]|0}while((e|0)!=(b|0))}b=f[a>>2]|0;if(!b)return;Oq(b);return}function li(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+20>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;u=c;return 1}function mi(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=u;u=u+16|0;d=c;e=ln(16)|0;f[d>>2]=e;f[d+8>>2]=-2147483632;f[d+4>>2]=14;g=e;h=14408;i=g+14|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[e+14>>0]=0;e=Hk(a,d,-1)|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);j=ln(16)|0;f[d>>2]=j;f[d+8>>2]=-2147483632;f[d+4>>2]=14;g=j;h=14423;i=g+14|0;do{b[g>>0]=b[h>>0]|0;g=g+1|0;h=h+1|0}while((g|0)<(i|0));b[j+14>>0]=0;j=Hk(a,d,-1)|0;if((b[d+11>>0]|0)>=0){k=(e|0)<(j|0);l=k?j:e;m=(l|0)==-1;n=m?5:l;u=c;return n|0}Oq(f[d>>2]|0);k=(e|0)<(j|0);l=k?j:e;m=(l|0)==-1;n=m?5:l;u=c;return n|0}function ni(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c+8|0;e=c+4|0;g=c;f[g>>2]=f[a+12>>2];h=b+16|0;i=h;j=f[i>>2]|0;k=f[i+4>>2]|0;if((k|0)>0|(k|0)==0&j>>>0>0){l=k;m=j}else{f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;j=h;l=f[j+4>>2]|0;m=f[j>>2]|0}f[g>>2]=f[a+16>>2];if((l|0)>0|(l|0)==0&m>>>0>0){u=c;return 1}f[e>>2]=f[b+4>>2];f[d>>2]=f[e>>2];Me(b,d,g,g+4|0)|0;u=c;return 1}function oi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=ln(32)|0;f[a>>2]=g;f[a+4>>2]=c+8;c=a+8|0;b[c>>0]=0;h=g+8|0;f[h>>2]=f[e>>2];f[h+4>>2]=f[e+4>>2];f[h+8>>2]=f[e+8>>2];f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;h=g+20|0;i=e+12|0;f[h>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;g=e+16|0;e=f[g>>2]|0;j=f[i>>2]|0;k=e-j|0;if(!k){l=j;m=e;n=0}else{Fi(h,k);l=f[i>>2]|0;m=f[g>>2]|0;n=f[h>>2]|0}kh(n|0,l|0,m-l|0)|0;b[c>>0]=1;c=f[a>>2]|0;f[c+4>>2]=d;f[c>>2]=0;return}function pi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;b=a+32|0;ld(a,b);c=a+80|0;d=f[c>>2]|0;if((d|0?(e=a+84|0,(f[e>>2]|0)>0):0)?(ld(d,b),(f[e>>2]|0)>1):0){d=1;do{ld((f[c>>2]|0)+(d<<5)|0,b);d=d+1|0}while((d|0)<(f[e>>2]|0))}e=a+136|0;d=a+140|0;a=f[e>>2]|0;if((f[d>>2]|0)==(a|0))return;c=0;g=a;while(1){a=g;ci((f[a+(c*12|0)+4>>2]|0)-(f[a+(c*12|0)>>2]|0)>>2,b)|0;a=f[e>>2]|0;h=f[a+(c*12|0)>>2]|0;i=(f[a+(c*12|0)+4>>2]|0)-h>>2;if(!i)j=a;else{Mc(h,i,1,0,b)|0;j=f[e>>2]|0}c=c+1|0;if(c>>>0>=(((f[d>>2]|0)-j|0)/12|0)>>>0)break;else g=j}return}function qi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=d+16|0;g=f[e>>2]|0;if(!g)if(!(vl(d)|0)){h=f[e>>2]|0;i=5}else j=0;else{h=g;i=5}a:do if((i|0)==5){g=d+20|0;e=f[g>>2]|0;k=e;if((h-e|0)>>>0>>0){j=Sa[f[d+36>>2]&31](d,a,c)|0;break}b:do if((b[d+75>>0]|0)>-1){e=c;while(1){if(!e){l=0;m=a;n=c;o=k;break b}p=e+-1|0;if((b[a+p>>0]|0)==10)break;else e=p}p=Sa[f[d+36>>2]&31](d,a,e)|0;if(p>>>0>>0){j=p;break a}l=e;m=a+e|0;n=c-e|0;o=f[g>>2]|0}else{l=0;m=a;n=c;o=k}while(0);kh(o|0,m|0,n|0)|0;f[g>>2]=(f[g>>2]|0)+n;j=l+n|0}while(0);return j|0}function ri(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+12|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d+28>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;ri(c+8|0);Oq(c)}while((e|0)!=0)}e=d+20|0;c=f[e>>2]|0;f[e>>2]=0;if(c|0)Oq(c);c=f[d+8>>2]|0;if(c|0){e=c;do{c=e;e=f[e>>2]|0;g=c+8|0;h=f[c+20>>2]|0;if(h|0){i=c+24|0;if((f[i>>2]|0)!=(h|0))f[i>>2]=h;Oq(h)}if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);Oq(c)}while((e|0)!=0)}e=f[d>>2]|0;f[d>>2]=0;if(e|0)Oq(e);Oq(d)}if((b[a+11>>0]|0)>=0)return;Oq(f[a>>2]|0);return}function si(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,o=0;g=u;u=u+32|0;h=g+12|0;i=g;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;if((e|0)>0){j=i+11|0;k=i+4|0;l=0;do{if((l|0)>0)An(h,14477)|0;il(i,$(n[d+(l<<2)>>2]));m=b[j>>0]|0;o=m<<24>>24<0;lj(h,o?f[i>>2]|0:i,o?f[k>>2]|0:m&255)|0;if((b[j>>0]|0)<0)Oq(f[i>>2]|0);l=l+1|0}while((l|0)<(e|0))}am(Ai(a,c)|0,h)|0;if((b[h+11>>0]|0)>=0){u=g;return}Oq(f[h>>2]|0);u=g;return}function ti(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=u;u=u+16|0;d=c;if((Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){e=1;u=c;return e|0}g=a+4|0;h=a+20|0;i=a+24|0;j=a+16|0;a=0;while(1){k=f[(f[g>>2]|0)+4>>2]|0;l=dm(k,Ra[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;f[d>>2]=l;if((l|0)==-1)break;k=f[h>>2]|0;if((k|0)==(f[i>>2]|0))Ri(j,d);else{f[k>>2]=l;f[h>>2]=k+4}gl(f[g>>2]|0,f[d>>2]|0)|0;a=a+1|0;if((a|0)>=(Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)){e=1;m=9;break}}if((m|0)==9){u=c;return e|0}e=0;u=c;return e|0}function ui(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=1292;hi(a+60|0);b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=a+36|0;d=f[b>>2]|0;if(d|0){c=a+40|0;e=f[c>>2]|0;if((e|0)==(d|0))g=d;else{h=e;do{e=h+-24|0;f[c>>2]=e;Va[f[f[e>>2]>>2]&127](e);h=f[c>>2]|0}while((h|0)!=(d|0));g=f[b>>2]|0}Oq(g)}f[a>>2]=1232;g=f[a+16>>2]|0;if(g|0){b=a+20|0;d=f[b>>2]|0;if((d|0)!=(g|0))f[b>>2]=d+(~((d+-4-g|0)>>>2)<<2);Oq(g)}g=f[a+4>>2]|0;if(!g)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(g|0))f[d>>2]=a+(~((a+-4-g|0)>>>2)<<2);Oq(g);return}function vi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=u;u=u+32|0;d=c+16|0;e=c+8|0;g=c;h=a+8|0;if(f[h>>2]<<5>>>0>=b>>>0){u=c;return}f[d>>2]=0;i=d+4|0;f[i>>2]=0;j=d+8|0;f[j>>2]=0;if((b|0)<0)aq(d);k=((b+-1|0)>>>5)+1|0;b=ln(k<<2)|0;f[d>>2]=b;f[i>>2]=0;f[j>>2]=k;k=f[a>>2]|0;f[e>>2]=k;f[e+4>>2]=0;b=a+4|0;l=f[b>>2]|0;f[g>>2]=k+(l>>>5<<2);f[g+4>>2]=l&31;zg(d,e,g);g=f[a>>2]|0;f[a>>2]=f[d>>2];f[d>>2]=g;d=f[b>>2]|0;f[b>>2]=f[i>>2];f[i>>2]=d;d=f[h>>2]|0;f[h>>2]=f[j>>2];f[j>>2]=d;if(g|0)Oq(g);u=c;return}function wi(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;b=a+136|0;c=f[b>>2]|0;if(c|0){d=a+140|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e;while(1){e=h+-12|0;f[d>>2]=e;i=f[e>>2]|0;if(!i)j=e;else{e=h+-8|0;k=f[e>>2]|0;if((k|0)!=(i|0))f[e>>2]=k+(~((k+-4-i|0)>>>2)<<2);Oq(i);j=f[d>>2]|0}if((j|0)==(c|0))break;else h=j}g=f[b>>2]|0}Oq(g)}g=f[a+104>>2]|0;if(g|0){b=a+108|0;j=f[b>>2]|0;if((j|0)!=(g|0))f[b>>2]=j+(~((j+-4-g|0)>>>2)<<2);Oq(g)}g=f[a+92>>2]|0;if(!g){uj(a);return}j=a+96|0;b=f[j>>2]|0;if((b|0)!=(g|0))f[j>>2]=b+(~((b+-4-g|0)>>>2)<<2);Oq(g);uj(a);return}function xi(a){a=a|0;var c=0,d=0,e=0,g=0;f[a>>2]=3680;c=a+72|0;d=a+136|0;e=a+4|0;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));e=c;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));n[d>>2]=$(1.0);d=a+140|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[a+164>>2]=-1;d=a+168|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[d+24>>2]=0;wn(a+200|0);Gn(a+232|0);d=a+316|0;e=a+264|0;g=e+52|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=-1;f[a+320>>2]=-1;f[a+324>>2]=0;f[a+328>>2]=2;f[a+332>>2]=7;f[a+336>>2]=0;f[a+340>>2]=0;f[a+344>>2]=0;b[a+352>>0]=0;return}function yi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=(e|0)/12|0;h=g+1|0;if(h>>>0>357913941)aq(a);i=a+8|0;j=((f[i>>2]|0)-d|0)/12|0;k=j<<1;l=j>>>0<178956970?(k>>>0>>0?h:k):357913941;do if(l)if(l>>>0>357913941){k=ra(8)|0;Oo(k,16035);f[k>>2]=7256;va(k|0,1112,110)}else{m=ln(l*12|0)|0;break}else m=0;while(0);k=m+(g*12|0)|0;f[k>>2]=f[b>>2];f[k+4>>2]=f[b+4>>2];f[k+8>>2]=f[b+8>>2];b=k+(((e|0)/-12|0)*12|0)|0;if((e|0)>0)kh(b|0,d|0,e|0)|0;f[a>>2]=b;f[c>>2]=k+12;f[i>>2]=m+(l*12|0);if(!d)return;Oq(d);return}function zi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=a+16|0;h=g;i=f[h+4>>2]|0;if((d|0)<0|(d|0)==0&c>>>0<1|((i|0)>0|(i|0)==0&(f[h>>2]|0)>>>0>0)){j=0;return j|0}b[a+24>>0]=e&1;h=Vn(c|0,d|0,7,0)|0;d=Ik(h|0,I|0,8,0)|0;h=I;c=g;f[c>>2]=d;f[c+4>>2]=h;c=a+4|0;g=f[c>>2]|0;i=f[a>>2]|0;k=g-i|0;l=Vn(k|0,0,8,0)|0;m=e?l:k;l=Vn(m|0,(e?I:0)|0,d|0,h|0)|0;h=i;i=g;if(k>>>0>=l>>>0)if(k>>>0>l>>>0?(g=h+l|0,(g|0)!=(i|0)):0){f[c>>2]=g;n=h}else n=h;else{Fi(a,l-k|0);n=f[a>>2]|0}k=ln(8)|0;f[k>>2]=n+m;f[k+4>>2]=0;m=a+12|0;a=f[m>>2]|0;f[m>>2]=k;if(!a){j=1;return j|0}Oq(a);j=1;return j|0}function Ai(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=u;u=u+16|0;d=c;e=yg(a,d,b)|0;g=f[e>>2]|0;if(g|0){h=g;i=h+28|0;u=c;return i|0}g=ln(40)|0;pj(g+16|0,b);b=g+28|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;b=f[d>>2]|0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=b;f[e>>2]=g;b=f[f[a>>2]>>2]|0;if(!b)j=g;else{f[a>>2]=b;j=f[e>>2]|0}Oe(f[a+4>>2]|0,j);j=a+8|0;f[j>>2]=(f[j>>2]|0)+1;h=g;i=h+28|0;u=c;return i|0}function Bi(a,c,d,e,g,h,i,j){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0;k=u;u=u+16|0;l=k;if((-18-c|0)>>>0>>0)aq(a);if((b[a+11>>0]|0)<0)m=f[a>>2]|0;else m=a;if(c>>>0<2147483623){n=d+c|0;d=c<<1;o=n>>>0>>0?d:n;p=o>>>0<11?11:o+16&-16}else p=-17;o=ln(p)|0;if(g|0)Fo(o,m,g)|0;if(i|0)Fo(o+g|0,j,i)|0;j=e-h|0;e=j-g|0;if(e|0)Fo(o+g+i|0,m+g+h|0,e)|0;if((c|0)!=10)Oq(m);f[a>>2]=o;f[a+8>>2]=p|-2147483648;p=j+i|0;f[a+4>>2]=p;b[l>>0]=0;up(o+p|0,l);u=k;return}function Ci(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+8|0;d=f[c>>2]|0;e=a+4|0;g=f[e>>2]|0;if(d-g>>2>>>0>=b>>>0){sj(g|0,0,b<<2|0)|0;f[e>>2]=g+(b<<2);return}h=f[a>>2]|0;i=g-h|0;g=i>>2;j=g+b|0;if(j>>>0>1073741823)aq(a);k=d-h|0;d=k>>1;l=k>>2>>>0<536870911?(d>>>0>>0?j:d):1073741823;do if(l)if(l>>>0>1073741823){d=ra(8)|0;Oo(d,16035);f[d>>2]=7256;va(d|0,1112,110)}else{d=ln(l<<2)|0;m=d;n=d;break}else{m=0;n=0}while(0);d=m+(g<<2)|0;sj(d|0,0,b<<2|0)|0;if((i|0)>0)kh(n|0,h|0,i|0)|0;f[a>>2]=m;f[e>>2]=d+(b<<2);f[c>>2]=m+(l<<2);if(!h)return;Oq(h);return}function Di(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=ln(32)|0;f[a>>2]=g;f[a+4>>2]=c+8;c=a+8|0;b[c>>0]=0;pj(g+8|0,e);h=g+20|0;i=e+12|0;f[h>>2]=0;f[g+24>>2]=0;f[g+28>>2]=0;g=e+16|0;e=f[g>>2]|0;j=f[i>>2]|0;k=e-j|0;if(!k){l=j;m=e;n=0}else{Fi(h,k);l=f[i>>2]|0;m=f[g>>2]|0;n=f[h>>2]|0}kh(n|0,l|0,m-l|0)|0;b[c>>0]=1;c=f[a>>2]|0;f[c+4>>2]=d;f[c>>2]=0;return}function Ei(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=0,h=0,i=0,j=0,k=0.0,l=0,m=0,n=0,o=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=+d;l=j;j=i;while(1){if(j<<24>>24<0)m=f[c>>2]|0;else m=c;p[g>>3]=k;n=Bn(m,l+1|0,18562,g)|0;if((n|0)>-1)if(n>>>0>l>>>0)o=n;else break;else o=l<<1|1;Hj(c,o,0);l=o;j=b[h>>0]|0}Hj(c,n,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function Fi(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;d=a+8|0;e=f[d>>2]|0;g=a+4|0;h=f[g>>2]|0;if((e-h|0)>>>0>=c>>>0){i=c;j=h;do{b[j>>0]=0;j=(f[g>>2]|0)+1|0;f[g>>2]=j;i=i+-1|0}while((i|0)!=0);return}i=f[a>>2]|0;j=h-i|0;h=j+c|0;if((h|0)<0)aq(a);k=e-i|0;i=k<<1;e=k>>>0<1073741823?(i>>>0>>0?h:i):2147483647;if(!e)l=0;else l=ln(e)|0;i=l+j|0;j=l+e|0;e=c;c=i;l=i;do{b[l>>0]=0;l=c+1|0;c=l;e=e+-1|0}while((e|0)!=0);e=f[a>>2]|0;l=(f[g>>2]|0)-e|0;h=i+(0-l)|0;if((l|0)>0)kh(h|0,e|0,l|0)|0;f[a>>2]=h;f[g>>2]=c;f[d>>2]=j;if(!e)return;Oq(e);return}function Gi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=(d-e|0)/136|0;h=d;if(g>>>0>>0){Ge(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+(b*136|0)|0;if((g|0)==(h|0))return;else i=h;do{f[c>>2]=i+-136;h=f[i+-20>>2]|0;if(h|0){b=i+-16|0;e=f[b>>2]|0;if((e|0)!=(h|0))f[b>>2]=e+(~((e+-4-h|0)>>>2)<<2);Oq(h)}h=f[i+-32>>2]|0;if(h|0){e=i+-28|0;b=f[e>>2]|0;if((b|0)!=(h|0))f[e>>2]=b+(~((b+-4-h|0)>>>2)<<2);Oq(h)}Mi(i+-132|0);i=f[c>>2]|0}while((i|0)!=(g|0));return}function Hi(a,b){a=a|0;b=b|0;var c=0,d=Oa,e=0,g=0;if((b|0)!=1)if(!(b+-1&b))c=b;else c=cb(b)|0;else c=2;b=f[a+4>>2]|0;if(c>>>0>b>>>0){Sd(a,c);return}if(c>>>0>=b>>>0)return;d=$((f[a+12>>2]|0)>>>0);e=~~$(W($(d/$(n[a+16>>2]))))>>>0;if(b>>>0>2&(b+-1&b|0)==0)g=1<<32-(_(e+-1|0)|0);else g=cb(e)|0;e=c>>>0>>0?g:c;if(e>>>0>=b>>>0)return;Sd(a,e);return}function Ii(a){a=a|0;var b=0,c=0,d=0;b=f[a+76>>2]|0;if(b|0){c=a+80|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+64>>2]|0;if(b|0){d=a+68|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;Oq(b)}b=f[a+48>>2]|0;if(b|0){d=a+52|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+24>>2]|0;if(b|0){c=a+28|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+12>>2]|0;if(b|0){d=a+16|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Ji(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=u;u=u+16|0;g=e;h=c+11|0;i=b[h>>0]|0;if(i<<24>>24<0)j=f[c+4>>2]|0;else j=i&255;k=j;j=i;while(1){if(j<<24>>24<0)l=f[c>>2]|0;else l=c;f[g>>2]=d;m=Bn(l,k+1|0,18559,g)|0;if((m|0)>-1)if(m>>>0>k>>>0)n=m;else break;else n=k<<1|1;Hj(c,n,0);k=n;j=b[h>>0]|0}Hj(c,m,0);f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];a=0;while(1){if((a|0)==3)break;f[c+(a<<2)>>2]=0;a=a+1|0}u=e;return}function Ki(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+8|0;c=f[b>>2]|0;if((c|0)<0){d=0;return d|0}e=a+4|0;a=f[e>>2]|0;g=a+4|0;h=f[g>>2]|0;i=f[a>>2]|0;j=h-i>>2;k=i;i=h;if(c>>>0<=j>>>0)if(c>>>0>>0?(h=k+(c<<2)|0,(h|0)!=(i|0)):0){f[g>>2]=i+(~((i+-4-h|0)>>>2)<<2);l=c}else l=c;else{Ci(a,c-j|0);l=f[b>>2]|0}if((l|0)<=0){d=1;return d|0}b=f[e>>2]|0;e=f[b>>2]|0;j=(f[b+4>>2]|0)-e>>2;c=e;e=0;while(1){if(j>>>0<=e>>>0){m=10;break}f[c+(e<<2)>>2]=e;e=e+1|0;if((e|0)>=(l|0)){d=1;m=12;break}}if((m|0)==10)aq(b);else if((m|0)==12)return d|0;return 0}function Li(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=ln(16)|0;f[g>>2]=h;f[g+8>>2]=-2147483632;f[g+4>>2]=14;i=h;j=14408;k=i+14|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+14>>0]=0;Xj(a,g,c);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);c=ln(16)|0;f[g>>2]=c;f[g+8>>2]=-2147483632;f[g+4>>2]=14;i=c;j=14423;k=i+14|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[c+14>>0]=0;Xj(a,g,d);if((b[g+11>>0]|0)>=0){u=e;return}Oq(f[g>>2]|0);u=e;return}function Mi(a){a=a|0;var b=0,c=0,d=0;b=f[a+84>>2]|0;if(b|0){c=a+88|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+72>>2]|0;if(b|0){d=a+76|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;Oq(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+40>>2]|0;if(b|0){c=a+44|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+28>>2]|0;if(b|0){d=a+32|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+12>>2]|0;if(b|0)Oq(b);b=f[a>>2]|0;if(!b)return;Oq(b);return}function Ni(a){a=a|0;var b=0,c=0,d=0,e=0;f[a>>2]=1352;b=a+32|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+88|0;d=f[b>>2]|0;f[b>>2]=0;if(d|0){b=f[d+8>>2]|0;if(b|0){e=d+12|0;if((f[e>>2]|0)!=(b|0))f[e>>2]=b;Oq(b)}Oq(d)}d=f[c+68>>2]|0;if(d|0){b=c+72|0;e=f[b>>2]|0;if((e|0)!=(d|0))f[b>>2]=e+(~((e+-4-d|0)>>>2)<<2);Oq(d)}d=c+64|0;e=f[d>>2]|0;f[d>>2]=0;if(e|0){d=f[e>>2]|0;if(d|0){b=e+4|0;if((f[b>>2]|0)!=(d|0))f[b>>2]=d;Oq(d)}Oq(e)}Oq(c)}c=f[a+16>>2]|0;if(!c)return;e=a+20|0;a=f[e>>2]|0;if((a|0)!=(c|0))f[e>>2]=a+(~((a+-4-c|0)>>>2)<<2);Oq(c);return}function Oi(){var a=0,b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;a=u;u=u+48|0;b=a+32|0;c=a+24|0;d=a+16|0;e=a;g=a+36|0;a=sn()|0;if(a|0?(h=f[a>>2]|0,h|0):0){a=h+48|0;i=f[a>>2]|0;j=f[a+4>>2]|0;if(!((i&-256|0)==1126902528&(j|0)==1129074247)){f[c>>2]=18701;Hn(18651,c)}if((i|0)==1126902529&(j|0)==1129074247)k=f[h+44>>2]|0;else k=h+80|0;f[g>>2]=k;k=f[h>>2]|0;h=f[k+4>>2]|0;if(Sa[f[(f[258]|0)+16>>2]&31](1032,k,g)|0){k=f[g>>2]|0;g=Qa[f[(f[k>>2]|0)+8>>2]&127](k)|0;f[e>>2]=18701;f[e+4>>2]=h;f[e+8>>2]=g;Hn(18565,e)}else{f[d>>2]=18701;f[d+4>>2]=h;Hn(18610,d)}}Hn(18689,b)}function Pi(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;do if(a){if(c>>>0<128){b[a>>0]=c;e=1;break}d=(Jq()|0)+188|0;if(!(f[f[d>>2]>>2]|0))if((c&-128|0)==57216){b[a>>0]=c;e=1;break}else{d=Vq()|0;f[d>>2]=84;e=-1;break}if(c>>>0<2048){b[a>>0]=c>>>6|192;b[a+1>>0]=c&63|128;e=2;break}if(c>>>0<55296|(c&-8192|0)==57344){b[a>>0]=c>>>12|224;b[a+1>>0]=c>>>6&63|128;b[a+2>>0]=c&63|128;e=3;break}if((c+-65536|0)>>>0<1048576){b[a>>0]=c>>>18|240;b[a+1>>0]=c>>>12&63|128;b[a+2>>0]=c>>>6&63|128;b[a+3>>0]=c&63|128;e=4;break}else{d=Vq()|0;f[d>>2]=84;e=-1;break}}else e=1;while(0);return e|0}function Qi(a){a=a|0;var b=0,c=0,d=0;b=f[a+92>>2]|0;if(b|0){c=a+96|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+76>>2]|0;if(b|0){d=a+80|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+52>>2]|0;if(b|0){d=a+56|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}f[a+4>>2]=3636;b=f[a+24>>2]|0;if(b|0)Oq(b);b=f[a+12>>2]|0;if(!b)return;Oq(b);return}function Ri(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=a+4|0;d=f[a>>2]|0;e=(f[c>>2]|0)-d|0;g=e>>2;h=g+1|0;if(h>>>0>1073741823)aq(a);i=a+8|0;j=(f[i>>2]|0)-d|0;k=j>>1;l=j>>2>>>0<536870911?(k>>>0>>0?h:k):1073741823;do if(l)if(l>>>0>1073741823){k=ra(8)|0;Oo(k,16035);f[k>>2]=7256;va(k|0,1112,110)}else{k=ln(l<<2)|0;m=k;n=k;break}else{m=0;n=0}while(0);k=m+(g<<2)|0;f[k>>2]=f[b>>2];if((e|0)>0)kh(n|0,d|0,e|0)|0;f[a>>2]=m;f[c>>2]=k+4;f[i>>2]=m+(l<<2);if(!d)return;Oq(d);return}function Si(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=a+104|0;d=f[c>>2]|0;if((d|0)!=0?(f[a+108>>2]|0)>=(d|0):0)e=4;else{d=Wm(a)|0;if((d|0)>=0){g=f[c>>2]|0;c=a+8|0;if(g){i=f[c>>2]|0;j=f[a+4>>2]|0;k=g-(f[a+108>>2]|0)|0;g=i;if((i-j|0)<(k|0)){l=g;m=g}else{l=j+(k+-1)|0;m=g}}else{g=f[c>>2]|0;l=g;m=g}f[a+100>>2]=l;l=a+4|0;if(!m)n=f[l>>2]|0;else{g=f[l>>2]|0;l=a+108|0;f[l>>2]=m+1-g+(f[l>>2]|0);n=g}g=n+-1|0;if((d|0)==(h[g>>0]|0|0))o=d;else{b[g>>0]=d;o=d}}else e=4}if((e|0)==4){f[a+100>>2]=0;o=-1}return o|0}function Ti(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;f[a>>2]=1544;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];fk(a+32|0,c+24|0);f[a>>2]=2384;c=a+44|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[a>>2]=2440;d=a+112|0;c=a+60|0;b=c+52|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(b|0));Zm(d);f[a+152>>2]=0;f[a+156>>2]=0;f[a+160>>2]=0;return}function Ui(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;f[a>>2]=1544;f[a+4>>2]=b;b=a+8|0;f[b>>2]=f[c>>2];f[b+4>>2]=f[c+4>>2];f[b+8>>2]=f[c+8>>2];f[b+12>>2]=f[c+12>>2];f[b+16>>2]=f[c+16>>2];f[b+20>>2]=f[c+20>>2];fk(a+32|0,c+24|0);f[a>>2]=1964;c=a+44|0;f[c>>2]=f[d>>2];f[c+4>>2]=f[d+4>>2];f[c+8>>2]=f[d+8>>2];f[c+12>>2]=f[d+12>>2];f[a>>2]=2020;d=a+112|0;c=a+60|0;b=c+52|0;do{f[c>>2]=0;c=c+4|0}while((c|0)<(b|0));Zm(d);f[a+152>>2]=0;f[a+156>>2]=0;f[a+160>>2]=0;return}function Vi(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2440;b=f[a+152>>2]|0;if(b|0){c=a+156|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+112>>2]|0;if(b|0){d=a+116|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+96>>2]|0;if(b|0)Oq(b);b=f[a+84>>2]|0;if(b|0)Oq(b);b=f[a+72>>2]|0;if(b|0)Oq(b);b=f[a+60>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Wi(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0;d=u;u=u+16|0;e=d;g=f[(f[c+4>>2]|0)+4>>2]|0;if(!g){f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;u=d;return}if(!(Dj(d+12|0,f[c+44>>2]|0,g)|0)){g=ln(32)|0;f[e>>2]=g;f[e+8>>2]=-2147483616;f[e+4>>2]=26;c=g;h=15859;i=c+26|0;do{b[c>>0]=b[h>>0]|0;c=c+1|0;h=h+1|0}while((c|0)<(i|0));b[g+26>>0]=0;f[a>>2]=-1;pj(a+4|0,e);if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0)}else{f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0}u=d;return}function Xi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=b+48|0;if((mi(f[c>>2]|0)|0)>9){d=0;return d|0}if((Qa[f[(f[b>>2]|0)+8>>2]&127](b)|0)!=1){d=0;return d|0}e=b+4|0;b=(f[(f[(f[e>>2]|0)+8>>2]|0)+(a<<2)>>2]|0)+56|0;a=f[b>>2]|0;do if((a|0)==3)if((mi(f[c>>2]|0)|0)<4){d=5;return d|0}else{g=f[b>>2]|0;break}else g=a;while(0);a=mi(f[c>>2]|0)|0;if((g|0)==1){d=(a|0)<4?6:0;return d|0}if((a|0)>7){d=0;return d|0}if((mi(f[c>>2]|0)|0)>1){d=1;return d|0}else return ((f[(f[e>>2]|0)+80>>2]|0)>>>0<40?1:4)|0;return 0}function Yi(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2020;b=f[a+152>>2]|0;if(b|0){c=a+156|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+112>>2]|0;if(b|0){d=a+116|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+96>>2]|0;if(b|0)Oq(b);b=f[a+84>>2]|0;if(b|0)Oq(b);b=f[a+72>>2]|0;if(b|0)Oq(b);b=f[a+60>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Zi(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=u;u=u+128|0;h=g+124|0;i=g;j=i;k=6596;l=j+124|0;do{f[j>>2]=f[k>>2];j=j+4|0;k=k+4|0}while((j|0)<(l|0));if((c+-1|0)>>>0>2147483646)if(!c){m=h;n=1;o=4}else{h=Vq()|0;f[h>>2]=75;p=-1}else{m=a;n=c;o=4}if((o|0)==4){o=-2-m|0;c=n>>>0>o>>>0?o:n;f[i+48>>2]=c;n=i+20|0;f[n>>2]=m;f[i+44>>2]=m;o=m+c|0;m=i+16|0;f[m>>2]=o;f[i+28>>2]=o;o=Ah(i,d,e)|0;if(!c)p=o;else{c=f[n>>2]|0;b[c+(((c|0)==(f[m>>2]|0))<<31>>31)>>0]=0;p=o}}u=g;return p|0}function _i(a){a=a|0;var c=0,d=0,e=0,g=0;f[a>>2]=3480;c=a+72|0;d=a+136|0;e=a+4|0;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));e=c;g=e+64|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));n[d>>2]=$(1.0);d=a+140|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[a+164>>2]=-1;d=a+168|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;f[d+24>>2]=0;wn(a+200|0);Gn(a+232|0);d=a+264|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;b[d+24>>0]=0;return}function $i(a,c,d,e){a=a|0;c=c|0;d=d|0;e=+e;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+16|0;g=a;if(!c){h=0;u=a;return h|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=Gj(d)|0;if(i>>>0>4294967279)aq(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=7}}else{m=i+16&-16;n=ln(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=7}if((l|0)==7){kh(k|0,d|0,i|0)|0;j=k}b[j+i>>0]=0;Zl(c,g,e);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);h=1;u=a;return h|0}function aj(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=u;u=u+16|0;g=a;if(!c){h=0;u=a;return h|0}f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;i=Gj(d)|0;if(i>>>0>4294967279)aq(g);if(i>>>0<11){b[g+11>>0]=i;if(!i)j=g;else{k=g;l=7}}else{m=i+16&-16;n=ln(m)|0;f[g>>2]=n;f[g+8>>2]=m|-2147483648;f[g+4>>2]=i;k=n;l=7}if((l|0)==7){kh(k|0,d|0,i|0)|0;j=k}b[j+i>>0]=0;$l(c,g,e);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);h=1;u=a;return h|0}function bj(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;c=f[a+28>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;g=c+20|0;h=f[g>>2]|0;f[g>>2]=0;if(h|0){bj(h);Oq(h)}if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);Oq(c)}while((d|0)!=0)}d=a+20|0;c=f[d>>2]|0;f[d>>2]=0;if(c|0)Oq(c);c=f[a+8>>2]|0;if(c|0){d=c;do{c=d;d=f[d>>2]|0;e=c+8|0;h=f[c+20>>2]|0;if(h|0){g=c+24|0;if((f[g>>2]|0)!=(h|0))f[g>>2]=h;Oq(h)}if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);Oq(c)}while((d|0)!=0)}d=f[a>>2]|0;f[a>>2]=0;if(!d)return;Oq(d);return}function cj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0;e=u;u=u+16|0;g=e;h=f[c+36>>2]|0;if(!h){i=ln(32)|0;f[g>>2]=i;f[g+8>>2]=-2147483616;f[g+4>>2]=23;j=i;k=15706;l=j+23|0;do{b[j>>0]=b[k>>0]|0;j=j+1|0;k=k+1|0}while((j|0)<(l|0));b[i+23>>0]=0;f[a>>2]=-1;pj(a+4|0,g);if((b[g+11>>0]|0)<0)Oq(f[g>>2]|0);u=e;return}g=f[c+40>>2]|0;if(!g){Sc(a,c,h,d);u=e;return}else{bi(a,c,g,d);u=e;return}}function dj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;tk(a);b=a+84|0;c=f[b>>2]|0;if((c|0)<=0)return;d=c<<5;e=Lq(c>>>0>134217727|d>>>0>4294967291?-1:d+4|0)|0;f[e>>2]=c;d=e+4|0;e=d+(c<<5)|0;c=d;do{wn(c);c=c+32|0}while((c|0)!=(e|0));e=a+80|0;a=f[e>>2]|0;f[e>>2]=d;if(a|0){d=a+-4|0;c=f[d>>2]|0;if(c|0){g=a+(c<<5)|0;do{g=g+-32|0;Fj(g)}while((g|0)!=(a|0))}Mq(d)}if((f[b>>2]|0)>0)h=0;else return;do{tk((f[e>>2]|0)+(h<<5)|0);h=h+1|0}while((h|0)<(f[b>>2]|0));return}function ej(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;if(!b){d=0;return d|0}if(f[b+4>>2]|0){d=0;return d|0}a=ln(52)|0;Ub(a,c);f[a+40>>2]=0;f[a+44>>2]=0;f[a+48>>2]=0;c=b+4|0;b=f[c>>2]|0;f[c>>2]=a;if(!b){d=1;return d|0}a=b+40|0;c=f[a>>2]|0;if(c|0){e=b+44|0;g=f[e>>2]|0;if((g|0)==(c|0))h=c;else{i=g;do{g=i+-4|0;f[e>>2]=g;j=f[g>>2]|0;f[g>>2]=0;if(j|0){bj(j);Oq(j)}i=f[e>>2]|0}while((i|0)!=(c|0));h=f[a>>2]|0}Oq(h)}bj(b);Oq(b);d=1;return d|0}function fj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[a>>2]|0;if(b){b=c+8|0;d=b;e=Vn(f[d>>2]|0,f[d+4>>2]|0,1,0)|0;d=b;f[d>>2]=e;f[d+4>>2]=I;d=a+28|0;e=f[d>>2]|0;b=a+24|0;f[b>>2]=f[b>>2]|1<>2]|0,f[e+4>>2]|0,1,0)|0;e=c;f[e>>2]=d;f[e+4>>2]=I;e=a+28|0;g=e;h=f[e>>2]|0}e=h+1|0;f[g>>2]=e;if((e|0)!=32)return;e=a+24|0;h=a+16|0;d=f[h>>2]|0;if((d|0)==(f[a+20>>2]|0))Ri(a+12|0,e);else{f[d>>2]=f[e>>2];f[h>>2]=d+4}f[g>>2]=0;f[e>>2]=0;return}function gj(a,b){a=a|0;b=b|0;var c=0,d=0;c=a+32|0;a=f[b>>2]|0;f[b>>2]=0;b=f[c>>2]|0;f[c>>2]=a;if(!b)return;a=b+88|0;c=f[a>>2]|0;f[a>>2]=0;if(c|0){a=f[c+8>>2]|0;if(a|0){d=c+12|0;if((f[d>>2]|0)!=(a|0))f[d>>2]=a;Oq(a)}Oq(c)}c=f[b+68>>2]|0;if(c|0){a=b+72|0;d=f[a>>2]|0;if((d|0)!=(c|0))f[a>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c)}c=b+64|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d>>2]|0;if(c|0){a=d+4|0;if((f[a>>2]|0)!=(c|0))f[a>>2]=c;Oq(c)}Oq(d)}Oq(b);return}function hj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;if(c|0){h=a+11|0;i=b[h>>0]|0;if(i<<24>>24<0){j=f[a+4>>2]|0;k=(f[a+8>>2]&2147483647)+-1|0}else{j=i&255;k=10}if((k-j|0)>>>0>>0){xj(a,k,c-k+j|0,j,j,0,0);l=b[h>>0]|0}else l=i;if(l<<24>>24<0)m=f[a>>2]|0;else m=a;Qn(m+j|0,c,d)|0;d=j+c|0;if((b[h>>0]|0)<0)f[a+4>>2]=d;else b[h>>0]=d;b[g>>0]=0;up(m+d|0,g)}u=e;return a|0}function ij(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+48|0;e=d+4|0;g=d;h=f[b+12>>2]|0;i=f[b+4>>2]|0;b=e;j=b+36|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(j|0));zh(g,c,h,i,e);i=f[e+24>>2]|0;if(!i){k=f[g>>2]|0;f[a>>2]=k;u=d;return}h=e+28|0;e=f[h>>2]|0;if((e|0)!=(i|0))f[h>>2]=e+(~((e+-4-i|0)>>>2)<<2);Oq(i);k=f[g>>2]|0;f[a>>2]=k;u=d;return}function jj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=(f[a+8>>2]&2147483647)+-1|0;else k=10;do if(k>>>0>=d>>>0){if(j)l=f[a>>2]|0;else l=a;Eo(l,c,d)|0;b[g>>0]=0;up(l+d|0,g);if((b[h>>0]|0)<0){f[a+4>>2]=d;break}else{b[h>>0]=d;break}}else{if(j)m=f[a+4>>2]|0;else m=i&255;Bi(a,k,d-k|0,m,0,m,d,c)}while(0);u=e;return a|0}function kj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d;do{f[c>>2]=g+-136;d=f[g+-20>>2]|0;if(d|0){h=g+-16|0;i=f[h>>2]|0;if((i|0)!=(d|0))f[h>>2]=i+(~((i+-4-d|0)>>>2)<<2);Oq(d)}d=f[g+-32>>2]|0;if(d|0){i=g+-28|0;h=f[i>>2]|0;if((h|0)!=(d|0))f[i>>2]=h+(~((h+-4-d|0)>>>2)<<2);Oq(d)}Mi(g+-132|0);g=f[c>>2]|0}while((g|0)!=(b|0));e=f[a>>2]|0}Oq(e);return}function lj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j){k=f[a+4>>2]|0;l=(f[a+8>>2]&2147483647)+-1|0}else{k=i&255;l=10}if((l-k|0)>>>0>=d>>>0){if(d|0){if(j)m=f[a>>2]|0;else m=a;Fo(m+k|0,c,d)|0;j=k+d|0;if((b[h>>0]|0)<0)f[a+4>>2]=j;else b[h>>0]=j;b[g>>0]=0;up(m+j|0,g)}}else Bi(a,l,d-l+k|0,k,k,0,d,c);u=e;return a|0}function mj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;f[a>>2]=3932;b=f[a+32>>2]|0;if(b|0){c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+20>>2]|0;if(b|0){d=a+24|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=a+8|0;c=f[b>>2]|0;if(!c)return;d=a+12|0;a=f[d>>2]|0;if((a|0)==(c|0))e=c;else{g=a;do{a=g+-4|0;f[d>>2]=a;h=f[a>>2]|0;f[a>>2]=0;if(h|0)Va[f[(f[h>>2]|0)+4>>2]&127](h);g=f[d>>2]|0}while((g|0)!=(c|0));e=f[b>>2]|0}Oq(e);return}function nj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+4|0;if((Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)<=0){d=1;return d|0}a=0;while(1){e=f[(f[c>>2]|0)+4>>2]|0;g=dm(e,Ra[f[(f[b>>2]|0)+24>>2]&127](b,a)|0)|0;if((g|0)==-1){d=0;h=6;break}e=f[(f[b>>2]|0)+28>>2]|0;i=fl(f[c>>2]|0,g)|0;a=a+1|0;if(!(Ra[e&127](b,i)|0)){d=0;h=6;break}if((a|0)>=(Qa[f[(f[b>>2]|0)+20>>2]&127](b)|0)){d=1;h=6;break}}if((h|0)==6)return d|0;return 0}function oj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;if(!(ho(a,b,c)|0)){d=0;return d|0}if(!(Qa[f[(f[a>>2]|0)+52>>2]&127](a)|0)){d=0;return d|0}c=a+4|0;e=a+8|0;g=f[c>>2]|0;if((f[e>>2]|0)==(g|0)){d=1;return d|0}h=a+36|0;a=0;i=g;while(1){g=f[(f[h>>2]|0)+(a<<2)>>2]|0;if(!(Sa[f[(f[g>>2]|0)+8>>2]&31](g,b,f[i+(a<<2)>>2]|0)|0)){d=0;j=7;break}a=a+1|0;i=f[c>>2]|0;if(a>>>0>=(f[e>>2]|0)-i>>2>>>0){d=1;j=7;break}}if((j|0)==7)return d|0;return 0}function pj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;if((b[c+11>>0]|0)<0){g=f[c>>2]|0;h=f[c+4>>2]|0;if(h>>>0>4294967279)aq(a);if(h>>>0<11){b[a+11>>0]=h;i=a}else{j=h+16&-16;k=ln(j)|0;f[a>>2]=k;f[a+8>>2]=j|-2147483648;f[a+4>>2]=h;i=k}Fo(i,g,h)|0;b[e>>0]=0;up(i+h|0,e)}else{f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2]}u=d;return}function qj(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0;b[c+53>>0]=1;do if((f[c+4>>2]|0)==(e|0)){b[c+52>>0]=1;a=c+16|0;h=f[a>>2]|0;if(!h){f[a>>2]=d;f[c+24>>2]=g;f[c+36>>2]=1;if(!((g|0)==1?(f[c+48>>2]|0)==1:0))break;b[c+54>>0]=1;break}if((h|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;b[c+54>>0]=1;break}h=c+24|0;a=f[h>>2]|0;if((a|0)==2){f[h>>2]=g;i=g}else i=a;if((i|0)==1?(f[c+48>>2]|0)==1:0)b[c+54>>0]=1}while(0);return}function rj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+36|0;d=a+40|0;e=f[c>>2]|0;if((f[d>>2]|0)!=(e|0)){g=0;h=e;do{vg(h+(g*24|0)|0,b)|0;g=g+1|0;h=f[c>>2]|0}while(g>>>0<(((f[d>>2]|0)-h|0)/24|0)>>>0)}h=a+48|0;d=a+52|0;a=f[h>>2]|0;if((f[d>>2]|0)==(a|0))return 1;else{i=0;j=a}do{a=f[j+(i<<2)>>2]|0;ci(a<<1^a>>31,b)|0;i=i+1|0;j=f[h>>2]|0}while(i>>>0<(f[d>>2]|0)-j>>2>>>0);return 1}function sj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;e=a+d|0;c=c&255;if((d|0)>=67){while(a&3){b[a>>0]=c;a=a+1|0}g=e&-4|0;h=g-64|0;i=c|c<<8|c<<16|c<<24;while((a|0)<=(h|0)){f[a>>2]=i;f[a+4>>2]=i;f[a+8>>2]=i;f[a+12>>2]=i;f[a+16>>2]=i;f[a+20>>2]=i;f[a+24>>2]=i;f[a+28>>2]=i;f[a+32>>2]=i;f[a+36>>2]=i;f[a+40>>2]=i;f[a+44>>2]=i;f[a+48>>2]=i;f[a+52>>2]=i;f[a+56>>2]=i;f[a+60>>2]=i;a=a+64|0}while((a|0)<(g|0)){f[a>>2]=i;a=a+4|0}}while((a|0)<(e|0)){b[a>>0]=c;a=a+1|0}return e-d|0}function tj(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;do if(!(fp(a,f[c+8>>2]|0,g)|0)){if(fp(a,f[c>>2]|0,g)|0){if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[c+32>>2]=e;f[h>>2]=d;h=c+40|0;f[h>>2]=(f[h>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0)b[c+54>>0]=1;f[c+44>>2]=4;break}if((e|0)==1)f[c+32>>2]=1}}else Vm(0,c,d,e);while(0);return}function uj(a){a=a|0;var b=0,c=0,d=0,e=0;b=a+80|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=c+-4|0;d=f[b>>2]|0;if(d|0){e=c+(d<<5)|0;do{e=e+-32|0;Fj(e)}while((e|0)!=(c|0))}Mq(b)}b=f[a+68>>2]|0;if(b|0){c=a+72|0;e=f[c>>2]|0;if((e|0)!=(b|0))f[c>>2]=e+(~((e+-4-b|0)>>>2)<<2);Oq(b)}b=a+44|0;e=f[b>>2]|0;f[b>>2]=0;if(e|0)Oq(e);e=f[a+32>>2]|0;if(!e){Fj(a);return}b=a+36|0;if((f[b>>2]|0)!=(e|0))f[b>>2]=e;Oq(e);Fj(a);return}function vj(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3092;b=f[a+136>>2]|0;if(b|0){c=a+140|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+76>>2]|0;if(b|0)Oq(b);b=f[a+64>>2]|0;if(b|0)Oq(b);b=f[a+52>>2]|0;if(b|0)Oq(b);b=f[a+40>>2]|0;if(!b)return;Oq(b);return}function wj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;if((d|0)<0){e=0;return e|0}do if(!b){d=a+4|0;g=f[d>>2]|0;h=f[a>>2]|0;i=g-h|0;if(i>>>0>>0){Fi(a,c-i|0);break}if(i>>>0>c>>>0?(i=h+c|0,(i|0)!=(g|0)):0)f[d>>2]=i}else Cg(a,b,b+c|0);while(0);c=a+24|0;a=c;b=Vn(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=c;f[a>>2]=b;f[a+4>>2]=I;e=1;return e|0}function xj(a,c,d,e,g,h,i){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0;if((-17-c|0)>>>0>>0)aq(a);if((b[a+11>>0]|0)<0)j=f[a>>2]|0;else j=a;if(c>>>0<2147483623){k=d+c|0;d=c<<1;l=k>>>0>>0?d:k;m=l>>>0<11?11:l+16&-16}else m=-17;l=ln(m)|0;if(g|0)Fo(l,j,g)|0;k=e-h-g|0;if(k|0)Fo(l+g+i|0,j+g+h|0,k)|0;if((c|0)!=10)Oq(j);f[a>>2]=l;f[a+8>>2]=m|-2147483648;return}function yj(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2728;b=f[a+136>>2]|0;if(b|0){c=a+140|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+96>>2]|0;if(b|0){d=a+100|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+76>>2]|0;if(b|0)Oq(b);b=f[a+64>>2]|0;if(b|0)Oq(b);b=f[a+52>>2]|0;if(b|0)Oq(b);b=f[a+40>>2]|0;if(!b)return;Oq(b);return}function zj(a,b){a=a|0;b=b|0;if(!b)return;else{zj(a,f[b>>2]|0);zj(a,f[b+4>>2]|0);Ej(b+20|0,f[b+24>>2]|0);Oq(b);return}}function Aj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;Yf(a,b,c);c=f[a+100>>2]|0;d=f[a+96>>2]|0;a=d;if((c|0)==(d|0))return;e=f[b>>2]|0;b=(c-d|0)/12|0;d=0;do{c=a+(d*12|0)|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];c=a+(d*12|0)+4|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];c=a+(d*12|0)+8|0;f[c>>2]=f[e+(f[c>>2]<<2)>>2];d=d+1|0}while(d>>>0>>0);return}function Bj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=a+64|0;if((f[d>>2]|0)==0?(e=ln(32)|0,yn(e),g=f[d>>2]|0,f[d>>2]=e,g|0):0){e=f[g>>2]|0;if(e|0){h=g+4|0;if((f[h>>2]|0)!=(e|0))f[h>>2]=e;Oq(e)}Oq(g)}g=Vl(f[a+28>>2]|0)|0;e=X(g,b[a+24>>0]|0)|0;g=((e|0)<0)<<31>>31;h=f[d>>2]|0;i=un(e|0,g|0,c|0,0)|0;if(!(wj(h,0,i,I)|0)){j=0;return j|0}Kk(a,f[d>>2]|0,e,g,0,0);f[a+80>>2]=c;j=1;return j|0}function Cj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+64|0;e=d;if(!(fp(a,b,0)|0))if((b|0)!=0?(g=Eh(b,1056,1040,0)|0,(g|0)!=0):0){b=e+4|0;h=b+52|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(h|0));f[e>>2]=g;f[e+8>>2]=a;f[e+12>>2]=-1;f[e+48>>2]=1;Ya[f[(f[g>>2]|0)+28>>2]&3](g,e,f[c>>2]|0,1);if((f[e+24>>2]|0)==1){f[c>>2]=f[e+16>>2];i=1}else i=0;j=i}else j=0;else j=1;u=d;return j|0}function Dj(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;if(!c){d=0;return d|0}e=c+40|0;g=c+44|0;ci((f[g>>2]|0)-(f[e>>2]|0)>>2,b)|0;h=f[e>>2]|0;e=f[g>>2]|0;if((h|0)!=(e|0)){g=h;do{h=f[g>>2]|0;if(h|0){ci(f[h+40>>2]|0,b)|0;lg(a,b,h)|0}g=g+4|0}while((g|0)!=(e|0))}lg(a,b,c)|0;d=1;return d|0}function Ej(a,c){a=a|0;c=c|0;var d=0;if(!c)return;Ej(a,f[c>>2]|0);Ej(a,f[c+4>>2]|0);a=c+16|0;d=c+28|0;if((b[d+11>>0]|0)<0)Oq(f[d>>2]|0);if((b[a+11>>0]|0)<0)Oq(f[a>>2]|0);Oq(c);return}function Fj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b;d=c;f[d>>2]=0;f[d+4>>2]=0;qf(a,2,c);c=f[a+12>>2]|0;d=a+16|0;e=f[d>>2]|0;if((e|0)==(c|0))g=c;else{h=e+(~((e+-4-c|0)>>>2)<<2)|0;f[d>>2]=h;g=h}f[a+24>>2]=0;f[a+28>>2]=0;if(c|0){if((g|0)!=(c|0))f[d>>2]=g+(~((g+-4-c|0)>>>2)<<2);Oq(c)}c=f[a>>2]|0;if(!c){u=b;return}g=a+4|0;a=f[g>>2]|0;if((a|0)!=(c|0))f[g>>2]=a+(~((a+-8-c|0)>>>3)<<3);Oq(c);u=b;return}function Gj(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0;c=a;a:do if(!(c&3)){d=a;e=4}else{g=a;h=c;while(1){if(!(b[g>>0]|0)){i=h;break a}j=g+1|0;h=j;if(!(h&3)){d=j;e=4;break}else g=j}}while(0);if((e|0)==4){e=d;while(1){k=f[e>>2]|0;if(!((k&-2139062144^-2139062144)&k+-16843009))e=e+4|0;else break}if(!((k&255)<<24>>24))l=e;else{k=e;while(1){e=k+1|0;if(!(b[e>>0]|0)){l=e;break}else k=e}}i=l}return i-c|0}function Hj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=a+11|0;i=b[h>>0]|0;j=i<<24>>24<0;if(j)k=f[a+4>>2]|0;else k=i&255;do if(k>>>0>=c>>>0)if(j){i=(f[a>>2]|0)+c|0;b[g>>0]=0;up(i,g);f[a+4>>2]=c;break}else{b[g>>0]=0;up(a+c|0,g);b[h>>0]=c;break}else hj(a,c-k|0,d)|0;while(0);u=e;return}function Ij(a){a=a|0;var b=0,c=0,d=0;if(!a)return;b=a+88|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0){b=f[c+8>>2]|0;if(b|0){d=c+12|0;if((f[d>>2]|0)!=(b|0))f[d>>2]=b;Oq(b)}Oq(c)}c=f[a+68>>2]|0;if(c|0){b=a+72|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c)}c=a+64|0;d=f[c>>2]|0;f[c>>2]=0;if(d|0){c=f[d>>2]|0;if(c|0){b=d+4|0;if((f[b>>2]|0)!=(c|0))f[b>>2]=c;Oq(c)}Oq(d)}Oq(a);return}function Jj(a,c,d,e,g,h,i,j,k,l){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0;f[a>>2]=d;if(d|0){m=d+16|0;n=f[m+4>>2]|0;o=a+8|0;f[o>>2]=f[m>>2];f[o+4>>2]=n;n=d+24|0;d=f[n+4>>2]|0;o=a+16|0;f[o>>2]=f[n>>2];f[o+4>>2]=d}b[a+24>>0]=e;f[a+28>>2]=g;b[a+32>>0]=h&1;h=a+40|0;f[h>>2]=i;f[h+4>>2]=j;j=a+48|0;f[j>>2]=k;f[j+4>>2]=l;f[a+56>>2]=c;return}function Kj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=ln(88)|0;d=c+60|0;e=c;g=e+60|0;do{f[e>>2]=0;e=e+4|0}while((e|0)<(g|0));f[d>>2]=c;d=c+64|0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;f[d+20>>2]=0;d=cg(c,b)|0;f[a>>2]=d?c:0;a=d?0:c;if(d)return;Ii(a);Oq(a);return}function Lj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;if((f[c+76>>2]|0)>=0?(Tq(c)|0)!=0:0){d=a&255;e=a&255;if((e|0)!=(b[c+75>>0]|0)?(g=c+20|0,h=f[g>>2]|0,h>>>0<(f[c+16>>2]|0)>>>0):0){f[g>>2]=h+1;b[h>>0]=d;i=e}else i=Nj(c,a)|0;Sq(c);j=i}else k=3;do if((k|0)==3){i=a&255;e=a&255;if((e|0)!=(b[c+75>>0]|0)?(d=c+20|0,h=f[d>>2]|0,h>>>0<(f[c+16>>2]|0)>>>0):0){f[d>>2]=h+1;b[h>>0]=i;j=e;break}j=Nj(c,a)|0}while(0);return j|0}function Mj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d+4|0;g=d;h=d+8|0;i=f[a+4>>2]|0;if((i|0)==-1){j=0;u=d;return j|0}b[h>>0]=i;i=c+16|0;a=f[i+4>>2]|0;if(!((a|0)>0|(a|0)==0&(f[i>>2]|0)>>>0>0)){f[g>>2]=f[c+4>>2];f[e>>2]=f[g>>2];Me(c,e,h,h+1|0)|0}j=1;u=d;return j|0}function Nj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;d=u;u=u+16|0;e=d;g=c&255;b[e>>0]=g;i=a+16|0;j=f[i>>2]|0;if(!j)if(!(vl(a)|0)){k=f[i>>2]|0;l=4}else m=-1;else{k=j;l=4}do if((l|0)==4){j=a+20|0;i=f[j>>2]|0;if(i>>>0>>0?(n=c&255,(n|0)!=(b[a+75>>0]|0)):0){f[j>>2]=i+1;b[i>>0]=g;m=n;break}if((Sa[f[a+36>>2]&31](a,e,1)|0)==1)m=h[e>>0]|0;else m=-1}while(0);u=d;return m|0}function Oj(a,b){a=a|0;b=b|0;if(!b)return;else{Oj(a,f[b>>2]|0);Oj(a,f[b+4>>2]|0);Ej(b+20|0,f[b+24>>2]|0);Oq(b);return}}function Pj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=u;u=u+16|0;g=e;h=e+4|0;f[g>>2]=c;c=ln(32)|0;f[h>>2]=c;f[h+8>>2]=-2147483616;f[h+4>>2]=17;i=c;j=14495;k=i+17|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[c+17>>0]=0;Xj(Hd(a,g)|0,h,d);if((b[h+11>>0]|0)>=0){u=e;return}Oq(f[h>>2]|0);u=e;return}function Qj(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=a+48|0;if((f[a+52>>2]|0)>>>0<=e>>>0)Ce(b,e+1|0,0);c=(f[b>>2]|0)+(e>>>5<<2)|0;f[c>>2]=f[c>>2]|1<<(e&31);c=f[a+36>>2]|0;if((f[a+40>>2]|0)-c>>2>>>0<=e>>>0){d=1;return d|0}Bp(f[c+(e<<2)>>2]|0);d=1;return d|0}function Rj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c>>>0>0|(c|0)==0&a>>>0>4294967295){e=d;f=a;g=c;while(1){c=hn(f|0,g|0,10,0)|0;e=e+-1|0;b[e>>0]=c&255|48;c=f;f=jp(f|0,g|0,10,0)|0;if(!(g>>>0>9|(g|0)==9&c>>>0>4294967295))break;else g=I}h=f;i=e}else{h=a;i=d}if(!h)j=i;else{d=h;h=i;while(1){i=h+-1|0;b[i>>0]=(d>>>0)%10|0|48;if(d>>>0<10){j=i;break}else{d=(d>>>0)/10|0;h=i}}}return j|0}function Sj(a){a=a|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a;while(1){d=c+1|0;if(!(eq(b[c>>0]|0)|0))break;else c=d}a=b[c>>0]|0;switch(a<<24>>24|0){case 45:{e=1;f=5;break}case 43:{e=0;f=5;break}default:{g=0;h=c;i=a}}if((f|0)==5){g=e;h=d;i=b[d>>0]|0}if(!(Aq(i<<24>>24)|0))j=0;else{i=0;d=h;while(1){h=(i*10|0)+48-(b[d>>0]|0)|0;d=d+1|0;if(!(Aq(b[d>>0]|0)|0)){j=h;break}else i=h}}return (g|0?j:0-j|0)|0}function Tj(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=0,h=0;e=u;u=u+16|0;g=e;il(g,d);h=Ai(a,c)|0;c=h+11|0;if((b[c>>0]|0)<0){b[f[h>>2]>>0]=0;f[h+4>>2]=0}else{b[h>>0]=0;b[c>>0]=0}gh(h,0);f[h>>2]=f[g>>2];f[h+4>>2]=f[g+4>>2];f[h+8>>2]=f[g+8>>2];u=e;return}function Uj(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b+8|0;d=b+4|0;e=b;f[e>>2]=f[(f[a+4>>2]|0)+80>>2];g=f[a+44>>2]|0;a=g+16|0;h=f[a+4>>2]|0;if((h|0)>0|(h|0)==0&(f[a>>2]|0)>>>0>0){u=b;return 1}f[d>>2]=f[g+4>>2];f[c>>2]=f[d>>2];Me(g,c,e,e+4|0)|0;u=b;return 1}function Vj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;ll(g,d&1);d=Ai(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}gh(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Wj(a){a=a|0;if(!a)return;Ej(a+24|0,f[a+28>>2]|0);zj(a+12|0,f[a+16>>2]|0);Ej(a,f[a+4>>2]|0);Oq(a);return}function Xj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;ll(g,d);d=Ai(a,c)|0;c=d+11|0;if((b[c>>0]|0)<0){b[f[d>>2]>>0]=0;f[d+4>>2]=0}else{b[d>>0]=0;b[c>>0]=0}gh(d,0);f[d>>2]=f[g>>2];f[d+4>>2]=f[g+4>>2];f[d+8>>2]=f[g+8>>2];u=e;return}function Yj(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;e=Rg(a,c)|0;if((e|0)==(a+4|0)){g=-1;h=(g|0)==-1;i=(g|0)!=0;j=h?d:i;return j|0}a=e+28|0;if((b[a+11>>0]|0)<0)k=f[a>>2]|0;else k=a;g=Sj(k)|0;h=(g|0)==-1;i=(g|0)!=0;j=h?d:i;return j|0}function Zj(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;d=u;u=u+16|0;e=d;if(c>>>0>10){g=0;u=d;return g|0}h=ln(48)|0;f[e>>2]=h;f[e+8>>2]=-2147483600;f[e+4>>2]=33;i=h;j=15987;k=i+33|0;do{b[i>>0]=b[j>>0]|0;i=i+1|0;j=j+1|0}while((i|0)<(k|0));b[h+33>>0]=0;Xj(a,e,c);if((b[e+11>>0]|0)<0)Oq(f[e>>2]|0);g=1;u=d;return g|0}function _j(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=f[b>>2]|0;if((c|0)==-1)return 1;b=c*3|0;if((b|0)==-1)return 1;c=f[a>>2]|0;a=f[c+(b<<2)>>2]|0;d=b+1|0;e=((d>>>0)%3|0|0)==0?b+-2|0:d;if((e|0)==-1)g=-1;else g=f[c+(e<<2)>>2]|0;e=(((b>>>0)%3|0|0)==0?2:-1)+b|0;if((e|0)==-1)h=-1;else h=f[c+(e<<2)>>2]|0;if((a|0)==(g|0))return 1;else return (a|0)==(h|0)|(g|0)==(h|0)|0;return 0}function $j(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0;d=0;while(1){if((h[16654+d>>0]|0)==(a|0)){e=2;break}g=d+1|0;if((g|0)==87){i=16742;j=87;e=5;break}else d=g}if((e|0)==2)if(!d)k=16742;else{i=16742;j=d;e=5}if((e|0)==5)while(1){e=0;d=i;do{a=d;d=d+1|0}while((b[a>>0]|0)!=0);j=j+-1|0;if(!j){k=d;break}else{i=d;e=5}}return jq(k,f[c+20>>2]|0)|0}function ak(a,b){a=+a;b=b|0;var c=0,d=0,e=0,g=0.0,h=0.0,i=0,j=0.0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;e=Yn(c|0,d|0,52)|0;switch(e&2047){case 0:{if(a!=0.0){g=+ak(a*18446744073709551616.0,b);h=g;i=(f[b>>2]|0)+-64|0}else{h=a;i=0}f[b>>2]=i;j=h;break}case 2047:{j=a;break}default:{f[b>>2]=(e&2047)+-1022;f[s>>2]=c;f[s+4>>2]=d&-2146435073|1071644672;j=+p[s>>3]}}return +j}function bk(a,b){a=+a;b=b|0;var c=0.0,d=0,e=0,g=0.0,h=0;if((b|0)<=1023)if((b|0)<-1022){c=a*2.2250738585072014e-308;d=(b|0)<-2044;e=b+2044|0;g=d?c*2.2250738585072014e-308:c;h=d?((e|0)>-1022?e:-1022):b+1022|0}else{g=a;h=b}else{c=a*8988465674311579538646525.0e283;e=(b|0)>2046;d=b+-2046|0;g=e?c*8988465674311579538646525.0e283:c;h=e?((d|0)<1023?d:1023):b+-1023|0}b=Tn(h+1023|0,0,52)|0;h=I;f[s>>2]=b;f[s+4>>2]=h;return +(g*+p[s>>3])}function ck(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;if(!(f[a+80>>2]|0)){b=0;return b|0}c=a+8|0;d=a+12|0;a=f[c>>2]|0;if(((f[d>>2]|0)-a|0)>0){e=0;g=a}else{b=1;return b|0}while(1){a=f[g+(e<<2)>>2]|0;e=e+1|0;if(!(Gl(a,a)|0)){b=0;h=5;break}g=f[c>>2]|0;if((e|0)>=((f[d>>2]|0)-g>>2|0)){b=1;h=5;break}}if((h|0)==5)return b|0;return 0}function dk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=a+36|0;d=a+40|0;e=f[c>>2]|0;if((f[d>>2]|0)==(e|0)){g=1;return g|0}h=a+60|0;a=0;i=e;while(1){e=f[i+(a<<2)>>2]|0;a=a+1|0;if(!(Sa[f[(f[e>>2]|0)+20>>2]&31](e,h,b)|0)){g=0;j=5;break}i=f[c>>2]|0;if(a>>>0>=(f[d>>2]|0)-i>>2>>>0){g=1;j=5;break}}if((j|0)==5)return g|0;return 0}function ek(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0;c=a+36|0;d=a+40|0;a=f[c>>2]|0;if((f[d>>2]|0)==(a|0)){e=1;return e|0}else{g=0;h=a}while(1){a=f[h+(g<<2)>>2]|0;g=g+1|0;if(!(Ra[f[(f[a>>2]|0)+24>>2]&127](a,b)|0)){e=0;i=4;break}h=f[c>>2]|0;if(g>>>0>=(f[d>>2]|0)-h>>2>>>0){e=1;i=4;break}}if((i|0)==4)return e|0;return 0}function fk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;f[a>>2]=0;c=a+4|0;f[c>>2]=0;f[a+8>>2]=0;d=b+4|0;e=(f[d>>2]|0)-(f[b>>2]|0)|0;g=e>>2;if(!g)return;if(g>>>0>1073741823)aq(a);h=ln(e)|0;f[c>>2]=h;f[a>>2]=h;f[a+8>>2]=h+(g<<2);g=f[b>>2]|0;b=(f[d>>2]|0)-g|0;if((b|0)<=0)return;kh(h|0,g|0,b|0)|0;f[c>>2]=h+(b>>>2<<2);return}function gk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;c=a+8|0;d=f[a>>2]|0;if((f[c>>2]|0)-d>>2>>>0>=b>>>0)return;e=a+4|0;if(b>>>0>1073741823){g=ra(8)|0;Oo(g,16035);f[g>>2]=7256;va(g|0,1112,110)}g=(f[e>>2]|0)-d|0;h=ln(b<<2)|0;if((g|0)>0)kh(h|0,d|0,g|0)|0;f[a>>2]=h;f[e>>2]=h+(g>>2<<2);f[c>>2]=h+(b<<2);if(!d)return;Oq(d);return}function hk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0;b=a+36|0;c=a+40|0;d=f[b>>2]|0;if((f[c>>2]|0)==(d|0)){e=1;return e|0}g=a+60|0;a=0;h=d;while(1){d=f[h+(a<<2)>>2]|0;a=a+1|0;if(!(Ra[f[(f[d>>2]|0)+16>>2]&127](d,g)|0)){e=0;i=5;break}h=f[b>>2]|0;if(a>>>0>=(f[c>>2]|0)-h>>2>>>0){e=1;i=5;break}}if((i|0)==5)return e|0;return 0}function ik(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0;d=f[a+176>>2]|0;e=f[a+172>>2]|0;a=e;if((d|0)==(e|0))return 0;g=(d-e|0)/136|0;e=0;while(1){if((f[a+(e*136|0)>>2]|0)==(c|0)){h=4;break}d=e+1|0;if(d>>>0>>0)e=d;else{h=6;break}}if((h|0)==4)return ((b[a+(e*136|0)+100>>0]|0)==0?0:a+(e*136|0)+4|0)|0;else if((h|0)==6)return 0;return 0}function jk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;d=u;u=u+16|0;e=d;g=ln(16)|0;f[e>>2]=g;f[e+8>>2]=-2147483632;f[e+4>>2]=15;h=g;i=14479;j=h+15|0;do{b[h>>0]=b[i>>0]|0;h=h+1|0;i=i+1|0}while((h|0)<(j|0));b[g+15>>0]=0;Xj(a,e,c);if((b[e+11>>0]|0)>=0){u=d;return}Oq(f[e>>2]|0);u=d;return}function kk(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[a+72>>2]|0;if(!c){d=0;return d|0}f[c+4>>2]=a+60;if(!(Qa[f[(f[c>>2]|0)+12>>2]&127](c)|0)){d=0;return d|0}if(!(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)){d=0;return d|0}if(!(Ra[f[(f[a>>2]|0)+44>>2]&127](a,b)|0)){d=0;return d|0}d=Ra[f[(f[a>>2]|0)+48>>2]&127](a,b)|0;return d|0}function lk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;f[a>>2]=0;d=a+4|0;f[d>>2]=0;f[a+8>>2]=0;if(!b)return;if(b>>>0>357913941)aq(a);e=ln(b*12|0)|0;f[d>>2]=e;f[a>>2]=e;f[a+8>>2]=e+(b*12|0);a=b;b=e;do{fk(b,c);b=(f[d>>2]|0)+12|0;f[d>>2]=b;a=a+-1|0}while((a|0)!=0);return}function mk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;c=f[b>>2]|0;if(!c){d=0;return d|0}e=a+44|0;g=f[e>>2]|0;if(g>>>0<(f[a+48>>2]|0)>>>0){f[b>>2]=0;f[g>>2]=c;f[e>>2]=(f[e>>2]|0)+4;d=1;return d|0}else{Ug(a+40|0,b);d=1;return d|0}return 0}function nk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3564;b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a+12>>2]=3588;b=f[a+32>>2]|0;if(b|0)Oq(b);b=f[a+20>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function ok(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3344;f[a+40>>2]=1196;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a>>2]=1476;b=a+36|0;d=f[b>>2]|0;f[b>>2]=0;if(!d){Ni(a);Oq(a);return}Va[f[(f[d>>2]|0)+4>>2]&127](d);Ni(a);Oq(a);return}function pk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0;f[c>>2]=2;d=a+4|0;a=c+8|0;e=f[a>>2]|0;g=(f[c+12>>2]|0)-e|0;if(g>>>0<4294967292){Lk(a,g+4|0,0);i=f[a>>2]|0}else i=e;e=i+g|0;g=h[d>>0]|h[d+1>>0]<<8|h[d+2>>0]<<16|h[d+3>>0]<<24;b[e>>0]=g;b[e+1>>0]=g>>8;b[e+2>>0]=g>>16;b[e+3>>0]=g>>24;return}function qk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3612;b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a+12>>2]=3636;b=f[a+32>>2]|0;if(b|0)Oq(b);b=f[a+20>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function rk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2188;b=f[a+76>>2]|0;if(b|0)Oq(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Mq(c);f[a>>2]=1544;c=f[a+32>>2]|0;if(!c){Oq(a);return}b=a+36|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c);Oq(a);return}function sk(a,c,d){a=a|0;c=c|0;d=$(d);var e=0,g=Oa,h=0;e=Rg(a,c)|0;if((e|0)==(a+4|0)){g=d;return $(g)}a=e+28|0;if((b[a+11>>0]|0)<0)h=f[a>>2]|0;else h=a;g=$(+Iq(h));return $(g)}function tk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=u;u=u+16|0;c=b;d=c;f[d>>2]=0;f[d+4>>2]=0;qf(a,2,c);c=f[a+12>>2]|0;d=a+16|0;e=f[d>>2]|0;if((e|0)==(c|0)){g=a+24|0;f[g>>2]=0;h=a+28|0;f[h>>2]=0;u=b;return}f[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);g=a+24|0;f[g>>2]=0;h=a+28|0;f[h>>2]=0;u=b;return}function uk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;c=f[a+176>>2]|0;d=f[a+172>>2]|0;e=d;a:do if((c|0)!=(d|0)){g=(c-d|0)/136|0;h=0;while(1){if((f[e+(h*136|0)>>2]|0)==(b|0))break;i=h+1|0;if(i>>>0>>0)h=i;else break a}j=e+(h*136|0)+104|0;return j|0}while(0);j=a+40|0;return j|0}function vk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3564;b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a+12>>2]=3588;b=f[a+32>>2]|0;if(b|0)Oq(b);b=f[a+20>>2]|0;if(!b)return;Oq(b);return}function wk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1768;b=f[a+76>>2]|0;if(b|0)Oq(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Mq(c);f[a>>2]=1544;c=f[a+32>>2]|0;if(!c){Oq(a);return}b=a+36|0;d=f[b>>2]|0;if((d|0)!=(c|0))f[b>>2]=d+(~((d+-4-c|0)>>>2)<<2);Oq(c);Oq(a);return}function xk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3344;f[a+40>>2]=1196;b=f[a+48>>2]|0;if(b|0){c=a+52|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a>>2]=1476;b=a+36|0;d=f[b>>2]|0;f[b>>2]=0;if(!d){Ni(a);return}Va[f[(f[d>>2]|0)+4>>2]&127](d);Ni(a);return}function yk(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0;Nc(a,b);if((b|0)<=-1)return;c=a+88|0;d=f[c>>2]|0;e=f[a+84>>2]|0;if((d-e>>2|0)<=(b|0))return;a=e+(b<<2)|0;b=a+4|0;e=d-b|0;g=e>>2;if(!g)h=d;else{im(a|0,b|0,e|0)|0;h=f[c>>2]|0}e=a+(g<<2)|0;if((h|0)==(e|0))return;f[c>>2]=h+(~((h+-4-e|0)>>>2)<<2);return}function zk(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0;b=f[a+32>>2]|0;c=f[a+36>>2]|0;if((b|0)==(c|0)){d=1;return d|0}e=a+8|0;g=a+44|0;a=b;while(1){b=f[(f[e>>2]|0)+(f[a>>2]<<2)>>2]|0;a=a+4|0;if(!(Ra[f[(f[b>>2]|0)+20>>2]&127](b,f[g>>2]|0)|0)){d=0;h=5;break}if((a|0)==(c|0)){d=1;h=5;break}}if((h|0)==5)return d|0;return 0}function Ak(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=3612;b=f[a+64>>2]|0;if(b|0){c=a+68|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}f[a+12>>2]=3636;b=f[a+32>>2]|0;if(b|0)Oq(b);b=f[a+20>>2]|0;if(!b)return;Oq(b);return}function Bk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0.0;d=u;u=u+128|0;e=d;g=e;h=g+124|0;do{f[g>>2]=0;g=g+4|0}while((g|0)<(h|0));g=e+4|0;f[g>>2]=a;h=e+8|0;f[h>>2]=-1;f[e+44>>2]=a;f[e+76>>2]=-1;Ym(e,0);i=+Rc(e,c,1);c=(f[g>>2]|0)-(f[h>>2]|0)+(f[e+108>>2]|0)|0;if(b|0)f[b>>2]=c|0?a+c|0:a;u=d;return +i}function Ck(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0;a=c+16|0;g=f[a>>2]|0;do if(g){if((g|0)!=(d|0)){h=c+36|0;f[h>>2]=(f[h>>2]|0)+1;f[c+24>>2]=2;b[c+54>>0]=1;break}h=c+24|0;if((f[h>>2]|0)==2)f[h>>2]=e}else{f[a>>2]=d;f[c+24>>2]=e;f[c+36>>2]=1}while(0);return}function Dk(a){a=a|0;var b=0,c=0;f[a>>2]=2188;b=f[a+76>>2]|0;if(b|0)Oq(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Mq(c);f[a>>2]=1544;c=f[a+32>>2]|0;if(!c)return;b=a+36|0;a=f[b>>2]|0;if((a|0)!=(c|0))f[b>>2]=a+(~((a+-4-c|0)>>>2)<<2);Oq(c);return}function Ek(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=a+20|0;c=a+28|0;if((f[d>>2]|0)>>>0>(f[c>>2]|0)>>>0)Sa[f[a+36>>2]&31](a,0,0)|0;f[a+16>>2]=0;f[c>>2]=0;f[d>>2]=0;d=f[a>>2]|0;if(!(d&4)){c=(f[a+44>>2]|0)+(f[a+48>>2]|0)|0;f[a+8>>2]=c;f[a+4>>2]=c;e=d<<27>>31}else{f[a>>2]=d|32;e=-1}return e|0}function Fk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;d=Rg(a,c)|0;if((d|0)==(a+4|0)){e=0;return e|0}a=d+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;e=((Sj(g)|0)+1|0)>>>0>1;return e|0}function Gk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=6152;b=f[a+96>>2]|0;if(b|0){c=a+100|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);Oq(b)}b=f[a+84>>2]|0;if(!b){Og(a);Oq(a);return}d=a+88|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b);Og(a);Oq(a);return}function Hk(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;e=Rg(a,c)|0;if((e|0)==(a+4|0)){g=d;return g|0}d=e+28|0;if((b[d+11>>0]|0)<0)h=f[d>>2]|0;else h=d;g=Sj(h)|0;return g|0}function Ik(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=Xn(e^a|0,f^b|0,e|0,f|0)|0;b=I;a=g^e;e=h^f;return Xn((Ld(i,b,Xn(g^c|0,h^d|0,g|0,h|0)|0,I,0)|0)^a|0,I^e|0,a|0,e|0)|0}function Jk(a){a=a|0;var b=0,c=0;f[a>>2]=1768;b=f[a+76>>2]|0;if(b|0)Oq(b);b=a+68|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Mq(c);f[a>>2]=1544;c=f[a+32>>2]|0;if(!c)return;b=a+36|0;a=f[b>>2]|0;if((a|0)!=(c|0))f[b>>2]=a+(~((a+-4-c|0)>>>2)<<2);Oq(c);return}function Kk(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0;f[a>>2]=b;h=b+16|0;i=f[h+4>>2]|0;j=a+8|0;f[j>>2]=f[h>>2];f[j+4>>2]=i;i=b+24|0;b=f[i+4>>2]|0;j=a+16|0;f[j>>2]=f[i>>2];f[j+4>>2]=b;b=a+40|0;f[b>>2]=c;f[b+4>>2]=d;d=a+48|0;f[d>>2]=e;f[d+4>>2]=g;return}function Lk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e|0;h=e;e=d;if(g>>>0>=b>>>0){if(g>>>0>b>>>0?(d=h+b|0,(d|0)!=(e|0)):0)f[c>>2]=d}else Fi(a,b-g|0);g=a+24|0;a=g;b=Vn(f[a>>2]|0,f[a+4>>2]|0,1,0)|0;a=g;f[a>>2]=b;f[a+4>>2]=I;return}function Mk(a,c){a=a|0;c=c|0;var d=0,e=0,g=0;d=Rg(a,c)|0;if((d|0)==(a+4|0)){e=-1;return e|0}a=d+28|0;if((b[a+11>>0]|0)<0)g=f[a>>2]|0;else g=a;e=Sj(g)|0;return e|0}function Nk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=6152;b=f[a+96>>2]|0;if(b|0){c=a+100|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~(((d+-12-b|0)>>>0)/12|0)*12|0);Oq(b)}b=f[a+84>>2]|0;if(!b){Og(a);return}d=a+88|0;c=f[d>>2]|0;if((c|0)!=(b|0))f[d>>2]=c+(~((c+-4-b|0)>>>2)<<2);Oq(b);Og(a);return}function Ok(a){a=a|0;var c=0,d=0,e=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=1;c=a+68|0;d=a+28|0;e=d+40|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(e|0));f[c>>2]=a;c=a+72|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;f[c+20>>2]=0;return}function Pk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2244;b=f[a+76>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Qk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=u;u=u+256|0;g=f;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;sj(g|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;d=e;do{Xo(a,g,256);d=d+-256|0}while(d>>>0>255);h=b&255}else h=e;Xo(a,g,h)}u=f;return}function Rk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1824;b=f[a+76>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Sk(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0;if(fp(a,f[b+8>>2]|0,g)|0)qj(0,b,c,d,e);else{h=f[a+8>>2]|0;_a[f[(f[h>>2]|0)+20>>2]&3](h,b,c,d,e,g)}return}function Tk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=2300;Fj(a+108|0);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Uk(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1880;Fj(a+108|0);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Vk(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;a:do if(!d)e=0;else{f=a;g=d;h=c;while(1){i=b[f>>0]|0;j=b[h>>0]|0;if(i<<24>>24!=j<<24>>24)break;g=g+-1|0;if(!g){e=0;break a}else{f=f+1|0;h=h+1|0}}e=(i&255)-(j&255)|0}while(0);return e|0}function Wk(a){a=a|0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+24>>2]|0))return 0;if(!(f[a+28>>2]|0))return 0;if(!(f[a+32>>2]|0))return 0;else return (f[a+36>>2]|0)!=0|0;return 0}function Xk(a){a=a|0;var b=0,c=0;f[a>>2]=2244;b=f[a+76>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Yk(a){a=a|0;var c=0,d=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;c=0;while(1){if((c|0)==3)break;f[a+(c<<2)>>2]=0;c=c+1|0}if((b[a+11>>0]|0)<0)d=(f[a+8>>2]&2147483647)+-1|0;else d=10;Hj(a,d,0);return}function Zk(a){a=a|0;var b=0,c=0,d=0,e=0.0,g=0.0;b=f[a+8>>2]|0;if((b|0)<2){c=0;d=0;I=c;return d|0}e=+(b|0);g=+Zg(e)*e;e=+W(+(g-+p[a>>3]));c=+K(e)>=1.0?(e>0.0?~~+Y(+J(e/4294967296.0),4294967295.0)>>>0:~~+W((e-+(~~e>>>0))/4294967296.0)>>>0):0;d=~~e>>>0;I=c;return d|0}function _k(a){a=a|0;var b=0,c=0;f[a>>2]=1824;b=f[a+76>>2]|0;if(b|0)Oq(b);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function $k(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=f[(f[a+36>>2]|0)+(e<<2)>>2]|0;e=f[b+32>>2]|0;if(e|0){d=e;return d|0}d=f[b+8>>2]|0;return d|0}function al(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1232;b=f[a+16>>2]|0;if(b|0){c=a+20|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b)}b=f[a+4>>2]|0;if(!b)return;d=a+8|0;a=f[d>>2]|0;if((a|0)!=(b|0))f[d>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function bl(a){a=a|0;var b=0,c=0;f[a>>2]=2300;Fj(a+108|0);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function cl(a){a=a|0;if(!(f[a+64>>2]|0))return 0;if(!(f[a+68>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function dl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(fp(a,f[b+8>>2]|0,0)|0)Ck(0,b,c,d);else{e=f[a+8>>2]|0;Ya[f[(f[e>>2]|0)+28>>2]&3](e,b,c,d)}return}function el(a){a=a|0;var b=0,c=0;f[a>>2]=1880;Fj(a+108|0);f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function fl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=Ra[f[(f[d>>2]|0)+36>>2]&127](d,b)|0;return c|0}function gl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)<0){c=0;return c|0}d=f[a+4>>2]|0;if(((f[d+12>>2]|0)-(f[d+8>>2]|0)>>2|0)<=(b|0)){c=0;return c|0}d=f[(f[a+8>>2]|0)+(f[(f[a+20>>2]|0)+(b<<2)>>2]<<2)>>2]|0;c=Ra[f[(f[d>>2]|0)+32>>2]&127](d,b)|0;return c|0}function hl(a,c){a=a|0;c=c|0;var d=0,e=0,f=0,g=0;d=b[a>>0]|0;e=b[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24){f=e;g=d}else{d=c;c=a;do{c=c+1|0;d=d+1|0;a=b[c>>0]|0;e=b[d>>0]|0}while(!(a<<24>>24==0?1:a<<24>>24!=e<<24>>24));f=e;g=a}return (g&255)-(f&255)|0}function il(a,b){a=a|0;b=$(b);var c=0,d=0;c=u;u=u+16|0;d=c;Yk(d);Ei(a,d,b);Bo(d);u=c;return}function jl(a){a=a|0;var b=0,c=0,d=0,e=0,g=0;b=f[a>>2]|0;c=a+4|0;d=f[c>>2]|0;if((d|0)==(b|0))e=b;else{g=d+(~((d+-4-b|0)>>>2)<<2)|0;f[c>>2]=g;e=g}f[a+12>>2]=0;f[a+16>>2]=0;if(!b)return;if((e|0)!=(b|0))f[c>>2]=e+(~((e+-4-b|0)>>>2)<<2);Oq(b);return}function kl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=f[a+16>>2]|0;if(((f[a+20>>2]|0)-d>>2|0)<=(b|0)){e=-1;return e|0}g=f[d+(b<<2)>>2]|0;if((g|0)<0){e=-1;return e|0}e=f[(f[(f[(f[a+36>>2]|0)+(g<<2)>>2]|0)+16>>2]|0)+(c<<2)>>2]|0;return e|0}function ll(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;Yk(d);Ji(a,d,b);Bo(d);u=c;return}function ml(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;d=u;u=u+32|0;e=d;g=d+20|0;f[e>>2]=f[a+60>>2];f[e+4>>2]=0;f[e+8>>2]=b;f[e+12>>2]=g;f[e+16>>2]=c;if((to(za(140,e|0)|0)|0)<0){f[g>>2]=-1;h=-1}else h=f[g>>2]|0;u=d;return h|0}function nl(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=0;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=0;return c|0}b=f[d>>2]|0;if((b|0)==-1){c=0;return c|0}c=f[(f[a+8>>2]|0)+(b<<2)>>2]|0;return c|0}function ol(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=f[a+16>>2]|0;if(((f[a+20>>2]|0)-c>>2|0)<=(b|0)){d=0;return d|0}e=f[c+(b<<2)>>2]|0;if((e|0)<0){d=0;return d|0}b=f[(f[a+36>>2]|0)+(e<<2)>>2]|0;d=(f[b+20>>2]|0)-(f[b+16>>2]|0)>>2;return d|0}function pl(a){a=a|0;if(!(f[a+40>>2]|0))return 0;if(!(f[a+24>>2]|0))return 0;if(!(f[a+28>>2]|0))return 0;if(!(f[a+32>>2]|0))return 0;else return (f[a+36>>2]|0)!=0|0;return 0}function ql(a){a=a|0;var b=0;if(!(f[a+24>>2]|0)){b=0;return b|0}if(!(f[a+28>>2]|0)){b=0;return b|0}if(!(f[a+32>>2]|0)){b=0;return b|0}b=(f[a+36>>2]|0)!=0;return b|0}function rl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;lh(a,c);f[a>>2]=1408;c=a+72|0;d=a+36|0;a=d+36|0;do{f[d>>2]=0;d=d+4|0}while((d|0)<(a|0));d=f[b>>2]|0;f[b>>2]=0;f[c>>2]=d;return}function sl(a){a=a|0;var b=0,c=0;f[a>>2]=3148;b=f[a+56>>2]|0;if(b|0)Oq(b);b=a+48|0;c=f[b>>2]|0;f[b>>2]=0;if(!c){Oq(a);return}Mq(c);Oq(a);return}function tl(a,c){a=a|0;c=c|0;var d=0,e=0;d=a;e=c;c=d+64|0;do{f[d>>2]=f[e>>2];d=d+4|0;e=e+4|0}while((d|0)<(c|0));e=a+64|0;f[a+88>>2]=0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;b[e+20>>0]=0;return}function ul(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;if((a|0)==0&(c|0)==0)f=d;else{g=d;d=c;c=a;while(1){a=g+-1|0;b[a>>0]=h[16636+(c&15)>>0]|0|e;c=Yn(c|0,d|0,4)|0;d=I;if((c|0)==0&(d|0)==0){f=a;break}else g=a}}return f|0}function vl(a){a=a|0;var c=0,d=0,e=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;d=f[a>>2]|0;if(!(d&8)){f[a+8>>2]=0;f[a+4>>2]=0;c=f[a+44>>2]|0;f[a+28>>2]=c;f[a+20>>2]=c;f[a+16>>2]=c+(f[a+48>>2]|0);e=0}else{f[a>>2]=d|32;e=-1}return e|0}function wl(a){a=a|0;if(!(f[a+60>>2]|0))return 0;if(!(f[a+44>>2]|0))return 0;if(!(f[a+48>>2]|0))return 0;if(!(f[a+52>>2]|0))return 0;else return (f[a+56>>2]|0)!=0|0;return 0}function xl(a,b){a=a|0;b=b|0;var c=0,d=0;c=f[b+88>>2]|0;if(!c){d=0;return d|0}if((f[c>>2]|0)!=2){d=0;return d|0}b=f[c+8>>2]|0;f[a+4>>2]=h[b>>0]|h[b+1>>0]<<8|h[b+2>>0]<<16|h[b+3>>0]<<24;d=1;return d|0}function yl(a){a=a|0;var b=0;if(!(f[a+44>>2]|0)){b=0;return b|0}if(!(f[a+48>>2]|0)){b=0;return b|0}if(!(f[a+52>>2]|0)){b=0;return b|0}b=(f[a+56>>2]|0)!=0;return b|0}function zl(a){a=a|0;vj(a);Oq(a);return}function Al(a){a=a|0;var b=0,c=0;f[a>>2]=2784;b=f[a+56>>2]|0;if(b|0)Oq(b);b=a+48|0;c=f[b>>2]|0;f[b>>2]=0;if(!c){Oq(a);return}Mq(c);Oq(a);return}function Bl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+44>>2]=c;d=1;return d|0}function Cl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;c=a+4|0;d=f[c>>2]|0;e=f[a>>2]|0;g=d-e|0;if(g>>>0>>0){Fi(a,b-g|0);return}if(g>>>0<=b>>>0)return;g=e+b|0;if((g|0)==(d|0))return;f[c>>2]=g;return}function Dl(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=$(e);f[a+4>>2]=b;Zf(a+8|0,c,c+(d<<2)|0);n[a+20>>2]=e;return}function El(a,b){a=a|0;b=b|0;var c=0;if(!(Qa[f[(f[a>>2]|0)+40>>2]&127](a)|0)){c=0;return c|0}if(!(Ra[f[(f[a>>2]|0)+44>>2]&127](a,b)|0)){c=0;return c|0}c=Ra[f[(f[a>>2]|0)+48>>2]&127](a,b)|0;return c|0}function Fl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+40>>2]=c;d=1;return d|0}function Gl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=u;u=u+16|0;d=c+4|0;e=c;f[e>>2]=0;f[d>>2]=f[e>>2];e=vc(a,b,d)|0;u=c;return e|0}function Hl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;d=f[c>>2]|0;c=a;e=b-a>>2;while(1){if(!e)break;a=(e|0)/2|0;b=c+(a<<2)|0;g=(f[b>>2]|0)>>>0>>0;c=g?b+4|0:c;e=g?e+-1-a|0:a}return c|0}function Il(a){a=a|0;var c=0;f[a>>2]=0;c=a+8|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;b[a+24>>0]=1;f[a+28>>2]=9;c=a+40|0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[a+56>>2]=-1;f[a+60>>2]=0;return}function Jl(a){a=a|0;yj(a);Oq(a);return}function Kl(a){a=a|0;var b=0;f[a>>2]=3148;b=f[a+56>>2]|0;if(b|0)Oq(b);b=a+48|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;Mq(a);return}function Ll(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;if(!(Aq(b[f[a>>2]>>0]|0)|0))c=0;else{d=0;while(1){e=f[a>>2]|0;g=(d*10|0)+-48+(b[e>>0]|0)|0;h=e+1|0;f[a>>2]=h;if(!(Aq(b[h>>0]|0)|0)){c=g;break}else d=g}}return c|0}function Ml(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+64>>2]=c;d=1;return d|0}function Nl(a){a=a|0;var b=0,c=0;b=f[r>>2]|0;c=b+a|0;if((a|0)>0&(c|0)<(b|0)|(c|0)<0){ea()|0;ya(12);return -1}f[r>>2]=c;if((c|0)>(da()|0)?(ca()|0)==0:0){f[r>>2]=b;ya(12);return -1}return b|0}function Ol(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,f=0;if((a|0)==0&(c|0)==0)e=d;else{f=d;d=c;c=a;while(1){a=f+-1|0;b[a>>0]=c&7|48;c=Yn(c|0,d|0,3)|0;d=I;if((c|0)==0&(d|0)==0){e=a;break}else f=a}}return e|0}function Pl(a,c){a=a|0;c=c|0;var d=0;if(f[c+56>>2]|0){d=0;return d|0}if((b[c+24>>0]|0)!=3){d=0;return d|0}f[a+60>>2]=c;d=1;return d|0}function Ql(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1544;b=f[a+32>>2]|0;if(!b){Oq(a);return}c=a+36|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function Rl(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;if(fp(a,f[b+8>>2]|0,g)|0)qj(0,b,c,d,e);return}function Sl(a){a=a|0;var b=0;f[a>>2]=2784;b=f[a+56>>2]|0;if(b|0)Oq(b);b=a+48|0;a=f[b>>2]|0;f[b>>2]=0;if(!a)return;Mq(a);return}function Tl(a){a=a|0;var c=0,d=0,e=0,g=0;c=u;u=u+16|0;d=c;e=f[a+4>>2]|0;g=(f[e+56>>2]|0)-(f[e+52>>2]|0)>>2;b[d>>0]=0;qh(a+20|0,g,d);u=c;return}function Ul(a){a=a|0;Vi(a);Oq(a);return}function Vl(a){a=a|0;var b=0;switch(a|0){case 11:case 2:case 1:{b=1;break}case 4:case 3:{b=2;break}case 6:case 5:{b=4;break}case 8:case 7:{b=8;break}case 9:{b=4;break}case 10:{b=8;break}default:b=-1}return b|0}function Wl(a){a=a|0;var c=0,d=0,e=0,g=0;c=u;u=u+16|0;d=c;e=f[a+4>>2]|0;g=(f[e+28>>2]|0)-(f[e+24>>2]|0)>>2;b[d>>0]=0;qh(a+20|0,g,d);u=c;return}function Xl(){var a=0,b=0;a=ln(40)|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;n[a+16>>2]=$(1.0);b=a+20|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;n[a+36>>2]=$(1.0);return a|0}function Yl(a,b){a=+a;b=+b;var c=0,d=0,e=0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;p[s>>3]=b;e=f[s+4>>2]&-2147483648|d&2147483647;f[s>>2]=c;f[s+4>>2]=e;return +(+p[s>>3])}function Zl(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0;d=u;u=u+16|0;e=d;p[e>>3]=c;_b(a,b,e);u=d;return}function _l(a){a=a|0;f[a>>2]=3656;Qi(a+8|0);Oq(a);return}function $l(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;f[e>>2]=c;fc(a,b,e);u=d;return}function am(a,c){a=a|0;c=c|0;var d=0,e=0;if((a|0)!=(c|0)){d=b[c+11>>0]|0;e=d<<24>>24<0;jj(a,e?f[c>>2]|0:c,e?f[c+4>>2]|0:d&255)|0}return a|0}function bm(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=X(d,c)|0;f=a>>>16;a=(e>>>16)+(X(d,f)|0)|0;d=b>>>16;b=X(d,c)|0;return (I=(a>>>16)+(X(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function cm(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=Gj(b)|0;d=ln(c+13|0)|0;f[d>>2]=c;f[d+4>>2]=c;f[d+8>>2]=0;e=Fp(d)|0;kh(e|0,b|0,c+1|0)|0;f[a>>2]=e;return}function dm(a,b){a=a|0;b=b|0;var c=0,d=0;if((b|0)==-1|(b|0)>4){c=-1;return c|0}d=f[a+20+(b*12|0)>>2]|0;if(((f[a+20+(b*12|0)+4>>2]|0)-d|0)<=0){c=-1;return c|0}c=f[d>>2]|0;return c|0}function em(a){a=a|0;Yi(a);Oq(a);return}function fm(a){a=a|0;f[a>>2]=3656;Qi(a+8|0);return}function gm(a){a=a|0;var b=0,c=0;f[a>>2]=1544;b=f[a+32>>2]|0;if(!b)return;c=a+36|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function hm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(fp(a,f[b+8>>2]|0,0)|0)Ck(0,b,c,d);return}function im(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if((c|0)<(a|0)&(a|0)<(c+d|0)){e=a;c=c+d|0;a=a+d|0;while((d|0)>0){a=a-1|0;c=c-1|0;d=d-1|0;b[a>>0]=b[c>>0]|0}a=e}else kh(a,c,d)|0;return a|0}function jm(a){a=a|0;var b=0,c=0,d=0;f[a>>2]=1196;b=f[a+8>>2]|0;if(!b){Oq(a);return}c=a+12|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);Oq(b);Oq(a);return}function km(a){a=a|0;var b=0;f[a>>2]=3204;b=f[a+56>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function lm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=u;u=u+16|0;e=d;f[e>>2]=f[c>>2];g=Sa[f[(f[a>>2]|0)+16>>2]&31](a,b,e)|0;if(g)f[c>>2]=f[e>>2];u=d;return g&1|0}function mm(a,b){a=a|0;b=b|0;var c=0;if(b>>>0>=2){c=0;return c|0}f[a+28>>2]=b;c=1;return c|0}function nm(a){a=a|0;var b=0,c=0;f[a>>2]=3408;b=a+56|0;c=f[b>>2]|0;f[b>>2]=0;if(!c){mj(a);return}Va[f[(f[c>>2]|0)+4>>2]&127](c);mj(a);return}function om(){var a=0,b=0;a=sn()|0;if((a|0?(b=f[a>>2]|0,b|0):0)?(a=b+48|0,(f[a>>2]&-256|0)==1126902528?(f[a+4>>2]|0)==1129074247:0):0)Ho(f[b+12>>2]|0);Ho(Qp()|0)}function pm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Qf(a,b,c,d,e,f,6)|0}function qm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Pf(a,b,c,d,e,f,4)|0}function rm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Wf(a,b,c,d,e,f,2)|0}function sm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Pf(a,b,c,d,e,f,3)|0}function tm(a){a=a|0;var b=0;f[a>>2]=2840;b=f[a+56>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function um(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Wf(a,b,c,d,e,f,1)|0}function vm(a){a=a|0;var c=0;c=b[w+(a&255)>>0]|0;if((c|0)<8)return c|0;c=b[w+(a>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=b[w+(a>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (b[w+(a>>>24)>>0]|0)+24|0}function wm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0.0,f=0.0;if(!a){c=0.0;return +c}if((b|0)==0|(a|0)==(b|0)){c=0.0;return +c}d=+(b>>>0)/+(a>>>0);e=1.0-d;f=d*+Zg(d);c=-(f+e*+Zg(e));return +c}function xm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if((b|0)>0)d=0;else return;do{e=f[a+(d<<2)>>2]|0;f[c+(d<<2)>>2]=e<<1^e>>31;d=d+1|0}while((d|0)!=(b|0));return}function ym(a){a=a|0;var b=0;zo(a);f[a>>2]=3344;f[a+40>>2]=1196;f[a+44>>2]=-1;b=a+48|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function zm(a,c){a=a|0;c=c|0;var d=0;b[c+84>>0]=1;a=f[c+68>>2]|0;d=c+72|0;c=f[d>>2]|0;if((c|0)==(a|0))return 1;f[d>>2]=c+(~((c+-4-a|0)>>>2)<<2);return 1}function Am(a){a=a|0;var b=0,c=0;if(pq(a)|0?(b=Mp(f[a>>2]|0)|0,a=b+8|0,c=f[a>>2]|0,f[a>>2]=c+-1,(c+-1|0)<0):0)Oq(b);return}function Bm(a){a=a|0;var b=0,c=0;b=f[a+16>>2]|0;c=(((f[a+12>>2]|0)+1-b|0)/64|0)+b<<3;a=b<<3;b=Vn(c|0,((c|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;return b|0}function Cm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Qf(a,b,c,d,e,f,5)|0}function Dm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Qf(a,b,c,d,e,f,9)|0}function Em(a){a=a|0;var b=0;f[a>>2]=3204;b=f[a+56>>2]|0;if(!b)return;Oq(b);return}function Fm(a){a=a|0;var b=0,c=0;f[a>>2]=1476;b=a+36|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);Ni(a);Oq(a);return}function Gm(a){a=a|0;var b=0,c=0;f[a>>2]=1196;b=f[a+8>>2]|0;if(!b)return;c=a+12|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Hm(a){a=a|0;var c=0;f[a>>2]=1352;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=-1;c=a+16|0;f[a+32>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;b[c+12>>0]=0;return}function Im(a){a=a|0;var b=0;f[a>>2]=2840;b=f[a+56>>2]|0;if(!b)return;Oq(b);return}function Jm(a){a=a|0;var b=0,c=0;f[a>>2]=1476;b=a+36|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);Ni(a);return}function Km(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);Fg(a,b,c,d,e,f);return}function Lm(a){a=a|0;var b=0,c=0;f[a>>2]=3408;b=a+56|0;c=f[b>>2]|0;f[b>>2]=0;if(c|0)Va[f[(f[c>>2]|0)+4>>2]&127](c);mj(a);Oq(a);return}function Mm(a){a=a|0;var b=0,c=0,d=0;b=f[a>>2]|0;c=a+4|0;d=f[c>>2]|0;if((d|0)!=(b|0))f[c>>2]=d+(~((d+-4-b|0)>>>2)<<2);f[a+12>>2]=0;f[a+16>>2]=0;return}function Nm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;d=a+20|0;e=f[d>>2]|0;g=(f[a+16>>2]|0)-e|0;a=g>>>0>c>>>0?c:g;kh(e|0,b|0,a|0)|0;f[d>>2]=(f[d>>2]|0)+a;return c|0}function Om(a){a=a|0;var b=0;f[a>>2]=3588;b=f[a+20>>2]|0;if(b|0)Oq(b);b=f[a+8>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function Pm(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-8-b|0)>>>3)<<3);Oq(b);return}function Qm(a){a=a|0;var b=0,c=0;b=f[a>>2]|0;if(!b)return;c=a+4|0;a=f[c>>2]|0;if((a|0)!=(b|0))f[c>>2]=a+(~((a+-4-b|0)>>>2)<<2);Oq(b);return}function Rm(a,b){a=a|0;b=b|0;var c=0;c=f[b>>2]|0;return (1<<(c&31)&f[(f[a+28>>2]|0)+(c>>>5<<2)>>2]|0)!=0|0}function Sm(a,b,c){a=a|0;b=b|0;c=c|0;return Sa[f[(f[a>>2]|0)+44>>2]&31](a,b,c)|0}function Tm(a){a=a|0;var c=0;Il(a);c=a+64|0;f[a+88>>2]=0;f[c>>2]=0;f[c+4>>2]=0;f[c+8>>2]=0;f[c+12>>2]=0;f[c+16>>2]=0;b[c+20>>0]=0;return}function Um(a){a=a|0;f[a>>2]=3260;Fj(a+88|0);Oq(a);return}function Vm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((f[b+4>>2]|0)==(c|0)?(c=b+28|0,(f[c>>2]|0)!=1):0)f[c>>2]=d;return}function Wm(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;if((Ek(a)|0)==0?(Sa[f[a+32>>2]&31](a,c,1)|0)==1:0)d=h[c>>0]|0;else d=-1;u=b;return d|0}function Xm(a){a=a|0;var b=0;f[a>>2]=3636;b=f[a+20>>2]|0;if(b|0)Oq(b);b=f[a+8>>2]|0;if(!b){Oq(a);return}Oq(b);Oq(a);return}function Ym(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;f[a+104>>2]=b;c=f[a+8>>2]|0;d=f[a+4>>2]|0;e=c-d|0;f[a+108>>2]=e;f[a+100>>2]=(b|0)!=0&(e|0)>(b|0)?d+b|0:c;return}function Zm(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;return}function _m(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=$(f);Km(a,b,c,d,e,f);return}function $m(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return pm(a,b,c,d,e,f)|0}function an(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return qm(a,b,c,d,e,f)|0}function bn(a,b,c){a=a|0;b=b|0;c=c|0;f[a+4>>2]=b;f[a+8>>2]=f[(f[(f[b+4>>2]|0)+8>>2]|0)+(c<<2)>>2];f[a+12>>2]=c;return 1}function cn(a){a=a|0;var b=0,c=0;if(!a)return;b=f[a>>2]|0;if(b|0){c=a+4|0;if((f[c>>2]|0)!=(b|0))f[c>>2]=b;Oq(b)}Oq(a);return}function dn(a){a=a|0;f[a>>2]=2896;Fj(a+88|0);Oq(a);return}function en(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return rm(a,b,c,d,e,f)|0}function fn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return sm(a,b,c,d,e,f)|0}function gn(a){a=a|0;f[a>>2]=3260;Fj(a+88|0);return}function hn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e|0;Ld(a,b,c,d,g)|0;u=e;return (I=f[g+4>>2]|0,f[g>>2]|0)|0}function jn(a){a=a|0;var b=0;eo(a);f[a>>2]=6152;b=a+84|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;f[b+16>>2]=0;f[b+20>>2]=0;return}function kn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return um(a,b,c,d,e,f)|0}function ln(a){a=a|0;var b=0,c=0;b=(a|0)==0?1:a;while(1){a=$a(b)|0;if(a|0){c=a;break}a=Op()|0;if(!a){c=0;break}Ua[a&3]()}return c|0}function mn(a,b,c){a=a|0;b=b|0;c=c|0;ac(a,b,c);return}function nn(a){a=a|0;var b=0;f[a>>2]=3588;b=f[a+20>>2]|0;if(b|0)Oq(b);b=f[a+8>>2]|0;if(!b)return;Oq(b);return}function on(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Cm(a,b,c,d,e,f)|0}function pn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Dm(a,b,c,d,e,f)|0}function qn(a){a=a|0;f[a>>2]=2896;Fj(a+88|0);return}function rn(a){a=a|0;var b=0,c=0,d=0;b=u;u=u+16|0;c=b;d=Qq(f[a+60>>2]|0)|0;f[c>>2]=d;d=to(Ba(6,c|0)|0)|0;u=b;return d|0}function sn(){var a=0,b=0;a=u;u=u+16|0;if(!(Ka(19700,3)|0)){b=Ia(f[4926]|0)|0;u=a;return b|0}else Hn(18840,a);return 0}function tn(a){a=a|0;var b=0;f[a>>2]=3636;b=f[a+20>>2]|0;if(b|0)Oq(b);b=f[a+8>>2]|0;if(!b)return;Oq(b);return}function un(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=bm(e,a)|0;f=I;return (I=(X(b,a)|0)+(X(d,e)|0)+f|f&0,c|0|0)|0}function vn(a,b){a=a|0;b=b|0;lh(a,b);f[a>>2]=1292;b=a+36|0;a=b+40|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function wn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;f[a+24>>2]=0;f[a+28>>2]=0;return}function xn(a){a=a|0;var b=0;b=u;u=u+16|0;yc(a);if(!(La(f[4926]|0,0)|0)){u=b;return}else Hn(18939,b)}function yn(a){a=a|0;var b=0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;b=a+16|0;f[b>>2]=0;f[b+4>>2]=0;f[b+8>>2]=0;f[b+12>>2]=0;return}function zn(a,b){a=a|0;b=b|0;return vg(a+40|0,b)|0}function An(a,b){a=a|0;b=b|0;return lj(a,b,lq(b)|0)|0}function Bn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;e=u;u=u+16|0;g=e;f[g>>2]=d;d=Zi(a,b,c,g)|0;u=e;return d|0}function Cn(a,b){a=a|0;b=b|0;return Mj(a+40|0,b)|0}function Dn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Qh(a,b,c,d)|0}function En(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return uh(a,b,c,d)|0}function Fn(a,b){a=a|0;b=b|0;var c=0;c=f[a+56>>2]|0;return Ra[f[(f[c>>2]|0)+24>>2]&127](c,b)|0}function Gn(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;f[a+20>>2]=0;b[a+24>>0]=0;return}function Hn(a,b){a=a|0;b=b|0;var c=0,d=0;c=u;u=u+16|0;d=c;f[d>>2]=b;b=f[1556]|0;Ah(b,a,d)|0;Lj(10,b)|0;Ca()}function In(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Ta[a&31](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Jn(a,b){a=a|0;b=b|0;var c=0;c=f[a+56>>2]|0;return Ra[f[(f[c>>2]|0)+16>>2]&127](c,b)|0}function Kn(a,b){a=a|0;b=b|0;var c=0;c=f[a+56>>2]|0;return Ra[f[(f[c>>2]|0)+20>>2]&127](c,b)|0}function Ln(a,b){a=a|0;b=b|0;var c=0;c=f[a+56>>2]|0;return Ra[f[(f[c>>2]|0)+12>>2]&127](c,b)|0}function Mn(){var a=0;a=u;u=u+16|0;if(!(Ja(19704,113)|0)){u=a;return}else Hn(18889,a)}function Nn(a,b,c){a=a|0;b=b|0;c=c|0;Pj(a,b,c);return}function On(a){a=a|0;cf(a);Oq(a);return}function Pn(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;_a[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Qn(a,b,c){a=a|0;b=b|0;c=c|0;if(b|0)sj(a|0,(kq(c)|0)&255|0,b|0)|0;return a|0}function Rn(a){a=a|0;return 4}function Sn(a,b,c){a=a|0;b=b|0;c=c|0;return ej(0,b,c)|0}function Tn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b<>>32-c;return a<>>0;return (I=b+d+(e>>>0>>0|0)>>>0,e|0)|0}function Wn(a,b){a=a|0;b=b|0;var c=0;if(!b)c=0;else c=Dh(f[b>>2]|0,f[b+4>>2]|0,a)|0;return (c|0?c:a)|0}function Xn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return (I=e,a-c>>>0|0)|0}function Yn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>>c;return a>>>c|(b&(1<>>c-32|0}function Zn(a){a=a|0;var b=0;f[a>>2]=3932;b=a+4|0;a=b+44|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function _n(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return De(a,b,c,d)|0}function $n(a){a=a|0;ff(a);Oq(a);return}function ao(a,b){a=a|0;b=b|0;ji(a);f[a+36>>2]=b;f[a+40>>2]=0;return}function bo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;return $i(a,b,c,d)|0}function co(a){a=a|0;return 5}function eo(a){a=a|0;var b=0;f[a>>2]=6192;b=a+4|0;a=b+80|0;do{f[b>>2]=0;b=b+4|0}while((b|0)<(a|0));return}function fo(a){a=a|0;return 6}function go(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return aj(a,b,c,d)|0}function ho(a,b,c){a=a|0;b=b|0;c=c|0;f[a+28>>2]=b;f[a+32>>2]=c;return 1}function io(a,b){a=a|0;b=b|0;ji(a);f[a+36>>2]=b;f[a+40>>2]=b;return}function jo(a,b,c){a=a|0;b=b|0;c=c|0;Nn(a,b,c);return}function ko(a){a=a|0;var b=0;b=f[a+56>>2]|0;return Qa[f[(f[b>>2]|0)+28>>2]&127](b)|0}function lo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ve(a,b,c,d,1);return}function mo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ve(a,b,c,d,0);return}function no(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Xg(a,b,c,d)|0}function oo(a,b,c){a=a|0;b=b|0;c=c|0;return fi(a,b,c)|0}function po(a){a=a|0;var b=0;b=f[a+56>>2]|0;return Qa[f[(f[b>>2]|0)+32>>2]&127](b)|0}function qo(a,b,c){a=a|0;b=b|0;c=c|0;return ej(a,b,c)|0}function ro(a,b,c){a=a|0;b=b|0;c=c|0;return Sn(a,b,c)|0}function so(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Za[a&3](b|0,c|0,d|0,e|0,f|0)}function to(a){a=a|0;var b=0,c=0;if(a>>>0>4294963200){b=Vq()|0;f[b>>2]=0-a;c=-1}else c=a;return c|0}function uo(a,b,c){a=a|0;b=b|0;c=c|0;Li(a,b,c);return}function vo(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;f[a+16>>2]=0;return}function wo(a,b){a=a|0;b=b|0;f[a+8>>2]=b;f[a+12>>2]=-1;return 1}function xo(a,b){a=a|0;b=b|0;f[a+52>>2]=b;ip(a,b);return}function yo(a){a=+a;var b=0;p[s>>3]=a;b=f[s>>2]|0;I=f[s+4>>2]|0;return b|0}function zo(a){a=a|0;Hm(a);f[a>>2]=1476;f[a+36>>2]=0;return}function Ao(a){a=a|0;var b=0;if(!a)b=0;else b=(Eh(a,1056,1144,0)|0)!=0&1;return b|0}function Bo(a){a=a|0;if((b[a+11>>0]|0)<0)Oq(f[a>>2]|0);return}function Co(a){a=a|0;if(!a)return;Va[f[(f[a>>2]|0)+4>>2]&127](a);return}function Do(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ya[a&3](b|0,c|0,d|0,e|0)}function Eo(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)im(a|0,b|0,c|0)|0;return a|0}function Fo(a,b,c){a=a|0;b=b|0;c=c|0;if(c|0)kh(a|0,b|0,c|0)|0;return a|0}function Go(a,b){a=a|0;b=b|0;return -1}function Ho(a){a=a|0;var b=0;b=u;u=u+16|0;Ua[a&3]();Hn(18992,b)}function Io(a){a=a|0;Lh(a);Oq(a);return}function Jo(a,b,c){a=a|0;b=b|0;c=c|0;Ro(a,b,c);return}function Ko(a,b,c){a=a|0;b=$(b);c=c|0;f[a+4>>2]=c;n[a>>2]=b;return}function Lo(a){a=a|0;To(a);f[a>>2]=3408;f[a+56>>2]=0;return}function Mo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Sa[a&31](b|0,c|0,d|0)|0}function No(a,b){a=a|0;b=b|0;return (wp(a,b)|0)<<24>>24|0}function Oo(a,b){a=a|0;b=b|0;f[a>>2]=7236;cm(a+4|0,b);return}function Po(a,b){a=a|0;b=b|0;var c=0;if(!a)c=0;else c=Pi(a,b,0)|0;return c|0}function Qo(a){a=a|0;return f[a+12>>2]|0}function Ro(a,b,c){a=a|0;b=b|0;c=c|0;uo(a,b,c);return}function So(){var a=0;a=ln(64)|0;Il(a);return a|0}function To(a){a=a|0;Zn(a);f[a>>2]=3764;f[a+52>>2]=0;return}function Uo(a){a=a|0;if(!a)return;bj(a);Oq(a);return}function Vo(a){a=a|0;return Qa[f[(f[a>>2]|0)+60>>2]&127](a)|0}function Wo(a){a=a|0;return f[a+4>>2]|0}function Xo(a,b,c){a=a|0;b=b|0;c=c|0;if(!(f[a>>2]&32))qi(b,c,a)|0;return}function Yo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Xa[a&15](b|0,c|0,d|0)}function Zo(){var a=0;a=ln(96)|0;Tm(a);return a|0}function _o(a){a=a|0;var b=0;b=u;u=u+a|0;u=u+15&-16;return b|0}function $o(a){a=a|0;var b=0;b=(Jq()|0)+188|0;return $j(a,f[b>>2]|0)|0}function ap(a){a=a|0;return ((f[a+100>>2]|0)-(f[a+96>>2]|0)|0)/12|0|0}function bp(a,b){a=a|0;b=b|0;kp(a,b);return}function cp(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;aa(3);return 0}function dp(){var a=0;a=ln(12)|0;op(a);return a|0}function ep(a){a=a|0;Ni(a);Oq(a);return}function fp(a,b,c){a=a|0;b=b|0;c=c|0;return (a|0)==(b|0)|0}function gp(a,b){a=a|0;b=b|0;var c=0;c=sp(a|0)|0;return ((b|0)==0?a:c)|0}function hp(a){a=a|0;return (f[a+12>>2]|0)-(f[a+8>>2]|0)>>2|0}function ip(a,b){a=a|0;b=b|0;f[a+4>>2]=b;return}function jp(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ld(a,b,c,d,0)|0}function kp(a,b){a=a|0;b=b|0;jk(a,b);return}function lp(a){a=a|0;f[a+4>>2]=0;f[a+8>>2]=0;f[a>>2]=a+4;return}function mp(){var a=0;a=ln(84)|0;eo(a);return a|0}function np(a){a=a|0;ui(a);Oq(a);return}function op(a){a=a|0;f[a>>2]=0;f[a+4>>2]=0;f[a+8>>2]=0;return}function pp(a){a=a|0;f[a>>2]=7236;Am(a+4|0);return}function qp(a,b,c){a=a|0;b=b|0;c=c|0;return Ra[a&127](b|0,c|0)|0}function rp(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;aa(10)}function sp(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function tp(a){a=a|0;To(a);f[a>>2]=3836;return}function up(a,c){a=a|0;c=c|0;b[a>>0]=b[c>>0]|0;return}function vp(a,b,c){a=a|0;b=b|0;c=c|0;return -1}function wp(a,c){a=a|0;c=c|0;return b[(f[a>>2]|0)+c>>0]|0}function xp(a){a=a|0;return (f[a+4>>2]|0)-(f[a>>2]|0)|0}function yp(a){a=a|0;mj(a);Oq(a);return}function zp(a){a=a|0;if(!a)return;Oq(a);return}function Ap(a){a=a|0;n[a>>2]=$(1.0);f[a+4>>2]=1;return}function Bp(a){a=a|0;b[a+28>>0]=1;return}function Cp(a,b){a=a|0;b=b|0;if(!x){x=a;y=b}}function Dp(a){a=a|0;ji(a);return}function Ep(a,b){a=a|0;b=b|0;return 1}function Fp(a){a=a|0;return a+12|0}function Gp(a,b){a=a|0;b=b|0;f[a+80>>2]=b;return}function Hp(a,b,c){a=a|0;b=b|0;c=c|0;Wa[a&7](b|0,c|0)}function Ip(){var a=0;a=ln(36)|0;qq(a);return a|0}function Jp(a){a=a|0;return gq(a+4|0)|0}function Kp(){var a=0;a=ln(108)|0;jn(a);return a|0}function Lp(a){a=a|0;return (b[a+32>>0]|0)!=0|0}function Mp(a){a=a|0;return a+-12|0}function Np(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;aa(9)}function Op(){var a=0;a=f[4927]|0;f[4927]=a+0;return a|0}function Pp(a){a=a|0;return f[a+56>>2]|0}function Qp(){var a=0;a=f[1786]|0;f[1786]=a+0;return a|0}function Rp(a){a=a|0;Og(a);Oq(a);return}function Sp(a){a=a|0;Sq(a);Oq(a);return}function Tp(a){a=a|0;return b[a+24>>0]|0}function Up(a,b){a=a|0;b=b|0;return 0}function Vp(a){a=a|0;return f[a+40>>2]|0}function Wp(a){a=a|0;return f[a+48>>2]|0}function Xp(a,b){a=a|0;b=b|0;return Qa[a&127](b|0)|0}function Yp(a){a=a|0;return f[a+60>>2]|0}function Zp(a){a=a|0;return f[a+28>>2]|0}function _p(a){a=a|0;sa(a|0)|0;om()}function $p(a){a=a|0;pp(a);Oq(a);return}function aq(a){a=a|0;Ca()}function bq(a,b){a=a|0;b=b|0;return $(+Bk(a,b,0))}function cq(a){a=a|0;return 3}function dq(a,b){a=a|0;b=b|0;u=a;v=b}function eq(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function fq(a){a=a|0;return f[a+80>>2]|0}function gq(a){a=a|0;return f[a>>2]|0}function hq(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;aa(8)}function iq(a,b){a=a|0;b=b|0;Va[a&127](b|0)}function jq(a,b){a=a|0;b=b|0;return Wn(a,b)|0}function kq(a){a=a|0;return a&255|0}function lq(a){a=a|0;return Gj(a)|0}function mq(a,b){a=a|0;b=b|0;return +(+Bk(a,b,1))}function nq(a,b,c){a=a|0;b=b|0;c=c|0;aa(2);return 0}function oq(a){a=a|0;return 2}function pq(a){a=a|0;return 1}function qq(a){a=a|0;Dp(a);return}function rq(a,b){a=+a;b=+b;return +(+Yl(a,b))}function sq(a,b){a=+a;b=b|0;return +(+bk(a,b))}function tq(a,b){a=+a;b=b|0;return +(+ak(a,b))}function uq(){return 3}function vq(a,b,c){a=a|0;b=b|0;c=c|0;aa(7)}function wq(){return 0}function xq(){return -1}function yq(){return ln(1)|0}function zq(){return 4}function Aq(a){a=a|0;return (a+-48|0)>>>0<10|0}function Bq(){return 1}function Cq(){return 2}function Dq(a,b){a=+a;b=+b;return +(+xd(a,b))}function Eq(a,b){a=a|0;b=b|0;aa(1);return 0}function Fq(a){a=a|0;Ha()}function Gq(a){a=a|0;Ua[a&3]()}function Hq(){ua()}function Iq(a){a=a|0;return +(+mq(a,0))}function Jq(){return Yq()|0}function Kq(a,b){a=a|0;b=b|0;aa(6)}function Lq(a){a=a|0;return ln(a)|0}function Mq(a){a=a|0;Oq(a);return}function Nq(a){a=a|0;u=a}function Oq(a){a=a|0;yc(a);return}function Pq(a){a=a|0;I=a}function Qq(a){a=a|0;return a|0}function Rq(a){a=a|0;aa(0);return 0}function Sq(a){a=a|0;return}function Tq(a){a=a|0;return 0}function Uq(){return I|0}function Vq(){return 19632}function Wq(){return u|0}function Xq(a){a=a|0;aa(5)}function Yq(){return 6352}function Zq(){aa(4)} // EMSCRIPTEN_END_FUNCS var Qa=[Rq,oq,pq,pq,oq,gb,Tq,Tq,Tq,hk,kg,pq,Wo,Tq,Tq,pq,Tq,pq,pq,yl,oq,yl,cq,wl,pq,co,wl,pq,fo,cl,pq,Zp,Rn,yl,pq,yl,oq,yl,cq,wl,pq,co,wl,pq,fo,cl,pq,Zp,Rn,yl,pq,cq,Tq,Wo,pq,Tq,pq,cq,pq,ql,oq,ql,Rn,ql,cq,pl,pq,co,pl,pq,fo,Wk,pq,Zp,pq,ql,oq,ql,Rn,ql,cq,pl,pq,co,pl,pq,fo,Wk,pq,Zp,pq,oq,pq,pq,Nd,pq,Vo,Xe,mh,zk,po,ko,pb,Qo,Wo,Mg,Wg,Lf,rb,Qo,Wo,pq,Tq,Tq,zc,Ki,Tq,pq,pq,Uj,Tq,Uj,ck,rn,Jp,Rq,Rq,Rq];var Ra=[Eq,xl,nh,Ie,El,Up,Up,Up,Ep,jb,rj,wo,Ep,Ep,ti,nj,ii,kk,ol,Qj,$k,dk,ek,Te,Go,Up,ni,Up,Pl,$d,Up,Pl,nf,Up,Ml,sh,mm,Ed,Up,Pl,$d,Up,Pl,nf,Up,Ml,sh,mm,Ed,Cn,Go,Up,li,Dd,Up,Fl,Zd,Up,Fl,hf,Up,Bl,rh,mm,Dd,Up,Fl,Zd,Up,Fl,hf,Up,Bl,rh,mm,zn,Kn,Fn,Ln,Jn,dh,ik,uk,cc,ye,Rm,og,vf,wf,ah,ik,uk,bc,ye,Rm,Ep,Up,Up,of,zm,mg,of,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq,Eq];var Sa=[nq,ho,vp,bn,Sm,wg,oj,kl,xh,wc,Kh,pg,gi,Rb,di,Ng,ml,Nm,Cj,nq,nq,nq,nq,nq,nq,nq,nq,nq,nq,nq,nq,nq];var Ta=[cp,Xd,Jc,oc,be,Ae,Tb,bb,Lc,pc,ae,ze,Sb,ab,eh,kd,Ic,fb,pf,If,tc,od,Kc,db,kf,Gf,qc,cp,cp,cp,cp,cp];var Ua=[Zq,Hq,Oi,Mn];var Va=[Xq,Sq,Mq,Gm,jm,al,Fq,ui,np,Ni,ep,Lh,Io,Jm,Fm,gm,Fq,Ql,Ql,Ql,Jk,wk,_k,Rk,el,Uk,Sq,Mq,Fq,Yi,em,Ql,Ql,Dk,rk,Xk,Pk,bl,Tk,Sq,Mq,Fq,Vi,Ul,Jm,Fm,Sq,Mq,Mq,Mq,yj,Jl,Sl,Al,Im,tm,qn,dn,Sq,Mq,Mq,Mq,vj,zl,Kl,sl,Em,km,gn,Um,Sq,Mq,xk,ok,nm,Lm,ff,$n,vk,nk,nn,Om,Tl,Ak,qk,tn,Xm,Wl,fm,_l,cf,On,mj,Fq,yp,Sq,Mq,Fq,yp,yp,Nk,Gk,sb,Og,Rp,Sq,Sp,Sq,Sq,Sp,pp,$p,$p,xn,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq,Xq];var Wa=[Kq,pk,gg,yk,Nc,Kq,Kq,Kq];var Xa=[vq,Ne,ij,$b,ic,yd,$b,ic,$g,Aj,Lg,Yf,vq,vq,vq,vq];var Ya=[hq,hm,dl,hq];var Za=[Np,tj,oh,Np];var _a=[rp,Rl,Sk,rp];return{___cxa_can_catch:lm,___cxa_is_pointer_type:Ao,___divdi3:Ik,___muldi3:un,___udivdi3:jp,___uremdi3:hn,_bitshift64Lshr:Yn,_bitshift64Shl:Tn,_emscripten_bind_DracoInt8Array_DracoInt8Array_0:dp,_emscripten_bind_DracoInt8Array_GetValue_1:No,_emscripten_bind_DracoInt8Array___destroy___0:cn,_emscripten_bind_DracoInt8Array_size_0:xp,_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2:oo,_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3:En,_emscripten_bind_Encoder_Encoder_0:Ip,_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5:_m,_emscripten_bind_Encoder_SetAttributeQuantization_2:jo,_emscripten_bind_Encoder_SetEncodingMethod_1:bp,_emscripten_bind_Encoder_SetSpeedOptions_2:Jo,_emscripten_bind_Encoder___destroy___0:Wj,_emscripten_bind_GeometryAttribute_GeometryAttribute_0:So,_emscripten_bind_GeometryAttribute___destroy___0:zp,_emscripten_bind_MeshBuilder_AddFacesToMesh_3:no,_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5:pn,_emscripten_bind_MeshBuilder_AddFloatAttribute_5:pn,_emscripten_bind_MeshBuilder_AddInt16Attribute_5:fn,_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5:on,_emscripten_bind_MeshBuilder_AddInt32Attribute_5:on,_emscripten_bind_MeshBuilder_AddInt8Attribute_5:kn,_emscripten_bind_MeshBuilder_AddMetadataToMesh_2:ro,_emscripten_bind_MeshBuilder_AddMetadata_2:qo,_emscripten_bind_MeshBuilder_AddUInt16Attribute_5:an,_emscripten_bind_MeshBuilder_AddUInt32Attribute_5:$m,_emscripten_bind_MeshBuilder_AddUInt8Attribute_5:en,_emscripten_bind_MeshBuilder_MeshBuilder_0:yq,_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3:Dn,_emscripten_bind_MeshBuilder___destroy___0:zp,_emscripten_bind_Mesh_Mesh_0:Kp,_emscripten_bind_Mesh___destroy___0:Co,_emscripten_bind_Mesh_num_attributes_0:hp,_emscripten_bind_Mesh_num_faces_0:ap,_emscripten_bind_Mesh_num_points_0:fq,_emscripten_bind_Mesh_set_num_points_1:Gp,_emscripten_bind_MetadataBuilder_AddDoubleEntry_3:bo,_emscripten_bind_MetadataBuilder_AddIntEntry_3:go,_emscripten_bind_MetadataBuilder_AddStringEntry_3:_n,_emscripten_bind_MetadataBuilder_MetadataBuilder_0:yq,_emscripten_bind_MetadataBuilder___destroy___0:zp,_emscripten_bind_Metadata_Metadata_0:Xl,_emscripten_bind_Metadata___destroy___0:Uo,_emscripten_bind_PointAttribute_PointAttribute_0:Zo,_emscripten_bind_PointAttribute___destroy___0:Ij,_emscripten_bind_PointAttribute_attribute_type_0:Pp,_emscripten_bind_PointAttribute_byte_offset_0:Wp,_emscripten_bind_PointAttribute_byte_stride_0:Vp,_emscripten_bind_PointAttribute_data_type_0:Zp,_emscripten_bind_PointAttribute_normalized_0:Lp,_emscripten_bind_PointAttribute_num_components_0:Tp,_emscripten_bind_PointAttribute_size_0:fq,_emscripten_bind_PointAttribute_unique_id_0:Yp,_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5:pn,_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5:fn,_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5:on,_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5:kn,_emscripten_bind_PointCloudBuilder_AddMetadata_2:qo,_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5:an,_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5:$m,_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5:en,_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0:yq,_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3:Dn,_emscripten_bind_PointCloudBuilder___destroy___0:zp,_emscripten_bind_PointCloud_PointCloud_0:mp,_emscripten_bind_PointCloud___destroy___0:Co,_emscripten_bind_PointCloud_num_attributes_0:hp,_emscripten_bind_PointCloud_num_points_0:fq,_emscripten_bind_VoidPtr___destroy___0:zp,_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE:xq,_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD:wq,_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH:Bq,_emscripten_enum_draco_GeometryAttribute_Type_COLOR:Cq,_emscripten_enum_draco_GeometryAttribute_Type_GENERIC:zq,_emscripten_enum_draco_GeometryAttribute_Type_INVALID:xq,_emscripten_enum_draco_GeometryAttribute_Type_NORMAL:Bq,_emscripten_enum_draco_GeometryAttribute_Type_POSITION:wq,_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD:uq,_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING:Bq,_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING:wq,_emscripten_replace_memory:Pa,_free:yc,_i64Add:Vn,_i64Subtract:Xn,_llvm_bswap_i32:sp,_malloc:$a,_memcpy:kh,_memmove:im,_memset:sj,_sbrk:Nl,dynCall_ii:Xp,dynCall_iii:qp,dynCall_iiii:Mo,dynCall_iiiiiii:In,dynCall_v:Gq,dynCall_vi:iq,dynCall_vii:Hp,dynCall_viii:Yo,dynCall_viiii:Do,dynCall_viiiii:so,dynCall_viiiiii:Pn,establishStackSpace:dq,getTempRet0:Uq,runPostSets:Un,setTempRet0:Pq,setThrew:Cp,stackAlloc:_o,stackRestore:Nq,stackSave:Wq}}) // EMSCRIPTEN_END_ASM (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _emscripten_bind_DracoInt8Array_DracoInt8Array_0=Module["_emscripten_bind_DracoInt8Array_DracoInt8Array_0"]=asm["_emscripten_bind_DracoInt8Array_DracoInt8Array_0"];var _emscripten_bind_DracoInt8Array_GetValue_1=Module["_emscripten_bind_DracoInt8Array_GetValue_1"]=asm["_emscripten_bind_DracoInt8Array_GetValue_1"];var _emscripten_bind_DracoInt8Array___destroy___0=Module["_emscripten_bind_DracoInt8Array___destroy___0"]=asm["_emscripten_bind_DracoInt8Array___destroy___0"];var _emscripten_bind_DracoInt8Array_size_0=Module["_emscripten_bind_DracoInt8Array_size_0"]=asm["_emscripten_bind_DracoInt8Array_size_0"];var _emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2=Module["_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2"]=asm["_emscripten_bind_Encoder_EncodeMeshToDracoBuffer_2"];var _emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3=Module["_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3"]=asm["_emscripten_bind_Encoder_EncodePointCloudToDracoBuffer_3"];var _emscripten_bind_Encoder_Encoder_0=Module["_emscripten_bind_Encoder_Encoder_0"]=asm["_emscripten_bind_Encoder_Encoder_0"];var _emscripten_bind_Encoder_SetAttributeExplicitQuantization_5=Module["_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5"]=asm["_emscripten_bind_Encoder_SetAttributeExplicitQuantization_5"];var _emscripten_bind_Encoder_SetAttributeQuantization_2=Module["_emscripten_bind_Encoder_SetAttributeQuantization_2"]=asm["_emscripten_bind_Encoder_SetAttributeQuantization_2"];var _emscripten_bind_Encoder_SetEncodingMethod_1=Module["_emscripten_bind_Encoder_SetEncodingMethod_1"]=asm["_emscripten_bind_Encoder_SetEncodingMethod_1"];var _emscripten_bind_Encoder_SetSpeedOptions_2=Module["_emscripten_bind_Encoder_SetSpeedOptions_2"]=asm["_emscripten_bind_Encoder_SetSpeedOptions_2"];var _emscripten_bind_Encoder___destroy___0=Module["_emscripten_bind_Encoder___destroy___0"]=asm["_emscripten_bind_Encoder___destroy___0"];var _emscripten_bind_GeometryAttribute_GeometryAttribute_0=Module["_emscripten_bind_GeometryAttribute_GeometryAttribute_0"]=asm["_emscripten_bind_GeometryAttribute_GeometryAttribute_0"];var _emscripten_bind_GeometryAttribute___destroy___0=Module["_emscripten_bind_GeometryAttribute___destroy___0"]=asm["_emscripten_bind_GeometryAttribute___destroy___0"];var _emscripten_bind_MeshBuilder_AddFacesToMesh_3=Module["_emscripten_bind_MeshBuilder_AddFacesToMesh_3"]=asm["_emscripten_bind_MeshBuilder_AddFacesToMesh_3"];var _emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5=Module["_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5"]=asm["_emscripten_bind_MeshBuilder_AddFloatAttributeToMesh_5"];var _emscripten_bind_MeshBuilder_AddFloatAttribute_5=Module["_emscripten_bind_MeshBuilder_AddFloatAttribute_5"]=asm["_emscripten_bind_MeshBuilder_AddFloatAttribute_5"];var _emscripten_bind_MeshBuilder_AddInt16Attribute_5=Module["_emscripten_bind_MeshBuilder_AddInt16Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddInt16Attribute_5"];var _emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5=Module["_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5"]=asm["_emscripten_bind_MeshBuilder_AddInt32AttributeToMesh_5"];var _emscripten_bind_MeshBuilder_AddInt32Attribute_5=Module["_emscripten_bind_MeshBuilder_AddInt32Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddInt32Attribute_5"];var _emscripten_bind_MeshBuilder_AddInt8Attribute_5=Module["_emscripten_bind_MeshBuilder_AddInt8Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddInt8Attribute_5"];var _emscripten_bind_MeshBuilder_AddMetadataToMesh_2=Module["_emscripten_bind_MeshBuilder_AddMetadataToMesh_2"]=asm["_emscripten_bind_MeshBuilder_AddMetadataToMesh_2"];var _emscripten_bind_MeshBuilder_AddMetadata_2=Module["_emscripten_bind_MeshBuilder_AddMetadata_2"]=asm["_emscripten_bind_MeshBuilder_AddMetadata_2"];var _emscripten_bind_MeshBuilder_AddUInt16Attribute_5=Module["_emscripten_bind_MeshBuilder_AddUInt16Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddUInt16Attribute_5"];var _emscripten_bind_MeshBuilder_AddUInt32Attribute_5=Module["_emscripten_bind_MeshBuilder_AddUInt32Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddUInt32Attribute_5"];var _emscripten_bind_MeshBuilder_AddUInt8Attribute_5=Module["_emscripten_bind_MeshBuilder_AddUInt8Attribute_5"]=asm["_emscripten_bind_MeshBuilder_AddUInt8Attribute_5"];var _emscripten_bind_MeshBuilder_MeshBuilder_0=Module["_emscripten_bind_MeshBuilder_MeshBuilder_0"]=asm["_emscripten_bind_MeshBuilder_MeshBuilder_0"];var _emscripten_bind_MeshBuilder_SetMetadataForAttribute_3=Module["_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3"]=asm["_emscripten_bind_MeshBuilder_SetMetadataForAttribute_3"];var _emscripten_bind_MeshBuilder___destroy___0=Module["_emscripten_bind_MeshBuilder___destroy___0"]=asm["_emscripten_bind_MeshBuilder___destroy___0"];var _emscripten_bind_Mesh_Mesh_0=Module["_emscripten_bind_Mesh_Mesh_0"]=asm["_emscripten_bind_Mesh_Mesh_0"];var _emscripten_bind_Mesh___destroy___0=Module["_emscripten_bind_Mesh___destroy___0"]=asm["_emscripten_bind_Mesh___destroy___0"];var _emscripten_bind_Mesh_num_attributes_0=Module["_emscripten_bind_Mesh_num_attributes_0"]=asm["_emscripten_bind_Mesh_num_attributes_0"];var _emscripten_bind_Mesh_num_faces_0=Module["_emscripten_bind_Mesh_num_faces_0"]=asm["_emscripten_bind_Mesh_num_faces_0"];var _emscripten_bind_Mesh_num_points_0=Module["_emscripten_bind_Mesh_num_points_0"]=asm["_emscripten_bind_Mesh_num_points_0"];var _emscripten_bind_Mesh_set_num_points_1=Module["_emscripten_bind_Mesh_set_num_points_1"]=asm["_emscripten_bind_Mesh_set_num_points_1"];var _emscripten_bind_MetadataBuilder_AddDoubleEntry_3=Module["_emscripten_bind_MetadataBuilder_AddDoubleEntry_3"]=asm["_emscripten_bind_MetadataBuilder_AddDoubleEntry_3"];var _emscripten_bind_MetadataBuilder_AddIntEntry_3=Module["_emscripten_bind_MetadataBuilder_AddIntEntry_3"]=asm["_emscripten_bind_MetadataBuilder_AddIntEntry_3"];var _emscripten_bind_MetadataBuilder_AddStringEntry_3=Module["_emscripten_bind_MetadataBuilder_AddStringEntry_3"]=asm["_emscripten_bind_MetadataBuilder_AddStringEntry_3"];var _emscripten_bind_MetadataBuilder_MetadataBuilder_0=Module["_emscripten_bind_MetadataBuilder_MetadataBuilder_0"]=asm["_emscripten_bind_MetadataBuilder_MetadataBuilder_0"];var _emscripten_bind_MetadataBuilder___destroy___0=Module["_emscripten_bind_MetadataBuilder___destroy___0"]=asm["_emscripten_bind_MetadataBuilder___destroy___0"];var _emscripten_bind_Metadata_Metadata_0=Module["_emscripten_bind_Metadata_Metadata_0"]=asm["_emscripten_bind_Metadata_Metadata_0"];var _emscripten_bind_Metadata___destroy___0=Module["_emscripten_bind_Metadata___destroy___0"]=asm["_emscripten_bind_Metadata___destroy___0"];var _emscripten_bind_PointAttribute_PointAttribute_0=Module["_emscripten_bind_PointAttribute_PointAttribute_0"]=asm["_emscripten_bind_PointAttribute_PointAttribute_0"];var _emscripten_bind_PointAttribute___destroy___0=Module["_emscripten_bind_PointAttribute___destroy___0"]=asm["_emscripten_bind_PointAttribute___destroy___0"];var _emscripten_bind_PointAttribute_attribute_type_0=Module["_emscripten_bind_PointAttribute_attribute_type_0"]=asm["_emscripten_bind_PointAttribute_attribute_type_0"];var _emscripten_bind_PointAttribute_byte_offset_0=Module["_emscripten_bind_PointAttribute_byte_offset_0"]=asm["_emscripten_bind_PointAttribute_byte_offset_0"];var _emscripten_bind_PointAttribute_byte_stride_0=Module["_emscripten_bind_PointAttribute_byte_stride_0"]=asm["_emscripten_bind_PointAttribute_byte_stride_0"];var _emscripten_bind_PointAttribute_data_type_0=Module["_emscripten_bind_PointAttribute_data_type_0"]=asm["_emscripten_bind_PointAttribute_data_type_0"];var _emscripten_bind_PointAttribute_normalized_0=Module["_emscripten_bind_PointAttribute_normalized_0"]=asm["_emscripten_bind_PointAttribute_normalized_0"];var _emscripten_bind_PointAttribute_num_components_0=Module["_emscripten_bind_PointAttribute_num_components_0"]=asm["_emscripten_bind_PointAttribute_num_components_0"];var _emscripten_bind_PointAttribute_size_0=Module["_emscripten_bind_PointAttribute_size_0"]=asm["_emscripten_bind_PointAttribute_size_0"];var _emscripten_bind_PointAttribute_unique_id_0=Module["_emscripten_bind_PointAttribute_unique_id_0"]=asm["_emscripten_bind_PointAttribute_unique_id_0"];var _emscripten_bind_PointCloudBuilder_AddFloatAttribute_5=Module["_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddFloatAttribute_5"];var _emscripten_bind_PointCloudBuilder_AddInt16Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddInt16Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddInt32Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddInt32Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddInt8Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddInt8Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddMetadata_2=Module["_emscripten_bind_PointCloudBuilder_AddMetadata_2"]=asm["_emscripten_bind_PointCloudBuilder_AddMetadata_2"];var _emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddUInt16Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddUInt32Attribute_5"];var _emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5=Module["_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5"]=asm["_emscripten_bind_PointCloudBuilder_AddUInt8Attribute_5"];var _emscripten_bind_PointCloudBuilder_PointCloudBuilder_0=Module["_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0"]=asm["_emscripten_bind_PointCloudBuilder_PointCloudBuilder_0"];var _emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3=Module["_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3"]=asm["_emscripten_bind_PointCloudBuilder_SetMetadataForAttribute_3"];var _emscripten_bind_PointCloudBuilder___destroy___0=Module["_emscripten_bind_PointCloudBuilder___destroy___0"]=asm["_emscripten_bind_PointCloudBuilder___destroy___0"];var _emscripten_bind_PointCloud_PointCloud_0=Module["_emscripten_bind_PointCloud_PointCloud_0"]=asm["_emscripten_bind_PointCloud_PointCloud_0"];var _emscripten_bind_PointCloud___destroy___0=Module["_emscripten_bind_PointCloud___destroy___0"]=asm["_emscripten_bind_PointCloud___destroy___0"];var _emscripten_bind_PointCloud_num_attributes_0=Module["_emscripten_bind_PointCloud_num_attributes_0"]=asm["_emscripten_bind_PointCloud_num_attributes_0"];var _emscripten_bind_PointCloud_num_points_0=Module["_emscripten_bind_PointCloud_num_points_0"]=asm["_emscripten_bind_PointCloud_num_points_0"];var _emscripten_bind_VoidPtr___destroy___0=Module["_emscripten_bind_VoidPtr___destroy___0"]=asm["_emscripten_bind_VoidPtr___destroy___0"];var _emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=Module["_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE"]=asm["_emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE"];var _emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=Module["_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD"]=asm["_emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD"];var _emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=Module["_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH"]=asm["_emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH"];var _emscripten_enum_draco_GeometryAttribute_Type_COLOR=Module["_emscripten_enum_draco_GeometryAttribute_Type_COLOR"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_COLOR"];var _emscripten_enum_draco_GeometryAttribute_Type_GENERIC=Module["_emscripten_enum_draco_GeometryAttribute_Type_GENERIC"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_GENERIC"];var _emscripten_enum_draco_GeometryAttribute_Type_INVALID=Module["_emscripten_enum_draco_GeometryAttribute_Type_INVALID"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_INVALID"];var _emscripten_enum_draco_GeometryAttribute_Type_NORMAL=Module["_emscripten_enum_draco_GeometryAttribute_Type_NORMAL"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_NORMAL"];var _emscripten_enum_draco_GeometryAttribute_Type_POSITION=Module["_emscripten_enum_draco_GeometryAttribute_Type_POSITION"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_POSITION"];var _emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=Module["_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD"]=asm["_emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD"];var _emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING=Module["_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING"]=asm["_emscripten_enum_draco_MeshEncoderMethod_MESH_EDGEBREAKER_ENCODING"];var _emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING=Module["_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING"]=asm["_emscripten_enum_draco_MeshEncoderMethod_MESH_SEQUENTIAL_ENCODING"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _free=Module["_free"]=asm["_free"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memmove=Module["_memmove"]=asm["_memmove"];var _memset=Module["_memset"]=asm["_memset"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;if(memoryInitializer){if(!isDataURI(memoryInitializer)){if(typeof Module["locateFile"]==="function"){memoryInitializer=Module["locateFile"](memoryInitializer)}else if(Module["memoryInitializerPrefixURL"]){memoryInitializer=Module["memoryInitializerPrefixURL"]+memoryInitializer}}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=exit;function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();function WrapperObject(){}WrapperObject.prototype=Object.create(WrapperObject.prototype);WrapperObject.prototype.constructor=WrapperObject;WrapperObject.prototype.__class__=WrapperObject;WrapperObject.__cache__={};Module["WrapperObject"]=WrapperObject;function getCache(__class__){return(__class__||WrapperObject).__cache__}Module["getCache"]=getCache;function wrapPointer(ptr,__class__){var cache=getCache(__class__);var ret=cache[ptr];if(ret)return ret;ret=Object.create((__class__||WrapperObject).prototype);ret.ptr=ptr;return cache[ptr]=ret}Module["wrapPointer"]=wrapPointer;function castObject(obj,__class__){return wrapPointer(obj.ptr,__class__)}Module["castObject"]=castObject;Module["NULL"]=wrapPointer(0);function destroy(obj){if(!obj["__destroy__"])throw"Error: Cannot destroy object. (Did you create it yourself?)";obj["__destroy__"]();delete getCache(obj.__class__)[obj.ptr]}Module["destroy"]=destroy;function compare(obj1,obj2){return obj1.ptr===obj2.ptr}Module["compare"]=compare;function getPointer(obj){return obj.ptr}Module["getPointer"]=getPointer;function getClass(obj){return obj.__class__}Module["getClass"]=getClass;var ensureCache={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:(function(){if(ensureCache.needed){for(var i=0;i=ensureCache.size){assert(len>0);ensureCache.needed+=len;ret=Module["_malloc"](len);ensureCache.temps.push(ret)}else{ret=ensureCache.buffer+ensureCache.pos;ensureCache.pos+=len}return ret}),copy:(function(array,view,offset){var offsetShifted=offset;var bytes=view.BYTES_PER_ELEMENT;switch(bytes){case 2:offsetShifted>>=1;break;case 4:offsetShifted>>=2;break;case 8:offsetShifted>>=3;break}for(var i=0;i>>0,$jscomp.propertyToPolyfillSymbol[l]=$jscomp.IS_SYMBOL_NATIVE? $jscomp.global.Symbol(l):$jscomp.POLYFILL_PREFIX+k+"$"+l),$jscomp.defineProperty(p,$jscomp.propertyToPolyfillSymbol[l],{configurable:!0,writable:!0,value:n})))}; $jscomp.polyfill("Promise",function(h){function n(){this.batch_=null}function k(f){return f instanceof l?f:new l(function(q,u){q(f)})}if(h&&(!($jscomp.FORCE_POLYFILL_PROMISE||$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION&&"undefined"===typeof $jscomp.global.PromiseRejectionEvent)||!$jscomp.global.Promise||-1===$jscomp.global.Promise.toString().indexOf("[native code]")))return h;n.prototype.asyncExecute=function(f){if(null==this.batch_){this.batch_=[];var q=this;this.asyncExecuteFunction(function(){q.executeBatch_()})}this.batch_.push(f)}; var p=$jscomp.global.setTimeout;n.prototype.asyncExecuteFunction=function(f){p(f,0)};n.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var f=this.batch_;this.batch_=[];for(var q=0;q=y}},"es6","es3"); $jscomp.polyfill("Array.prototype.copyWithin",function(h){function n(k){k=Number(k);return Infinity===k||-Infinity===k?k:k|0}return h?h:function(k,p,l){var y=this.length;k=n(k);p=n(p);l=void 0===l?y:n(l);k=0>k?Math.max(y+k,0):Math.min(k,y);p=0>p?Math.max(y+p,0):Math.min(p,y);l=0>l?Math.max(y+l,0):Math.min(l,y);if(kp;)--l in this?this[--k]=this[l]:delete this[--k];return this}},"es6","es3"); $jscomp.typedArrayCopyWithin=function(h){return h?h:Array.prototype.copyWithin};$jscomp.polyfill("Int8Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint8Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint8ClampedArray.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Int16Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5"); $jscomp.polyfill("Uint16Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Int32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Float32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Float64Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5"); var DracoDecoderModule=function(){var h="undefined"!==typeof document&&document.currentScript?document.currentScript.src:void 0;"undefined"!==typeof __filename&&(h=h||__filename);return function(n){function k(e){return a.locateFile?a.locateFile(e,U):U+e}function p(e,b){if(e){var c=ia;var d=e+b;for(b=e;c[b]&&!(b>=d);)++b;if(16g?d+=String.fromCharCode(g):(g-=65536,d+=String.fromCharCode(55296|g>>10,56320|g&1023))}}else d+=String.fromCharCode(g)}c=d}}else c="";return c}function l(){var e=ja.buffer;a.HEAP8=W=new Int8Array(e);a.HEAP16=new Int16Array(e);a.HEAP32=ca=new Int32Array(e);a.HEAPU8=ia=new Uint8Array(e);a.HEAPU16=new Uint16Array(e);a.HEAPU32=Y=new Uint32Array(e);a.HEAPF32=new Float32Array(e);a.HEAPF64=new Float64Array(e)}function y(e){if(a.onAbort)a.onAbort(e); e="Aborted("+e+")";da(e);sa=!0;e=new WebAssembly.RuntimeError(e+". Build with -sASSERTIONS for more info.");ka(e);throw e;}function f(e){try{if(e==P&&ea)return new Uint8Array(ea);if(ma)return ma(e);throw"both async and sync fetching of the wasm failed";}catch(b){y(b)}}function q(){if(!ea&&(ta||fa)){if("function"==typeof fetch&&!P.startsWith("file://"))return fetch(P,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+P+"'";return e.arrayBuffer()}).catch(function(){return f(P)}); if(na)return new Promise(function(e,b){na(P,function(c){e(new Uint8Array(c))},b)})}return Promise.resolve().then(function(){return f(P)})}function u(e){for(;0>2]=b};this.get_type=function(){return Y[this.ptr+4>>2]};this.set_destructor=function(b){Y[this.ptr+8>>2]=b};this.get_destructor=function(){return Y[this.ptr+8>>2]};this.set_refcount=function(b){ca[this.ptr>>2]=b};this.set_caught=function(b){W[this.ptr+ 12>>0]=b?1:0};this.get_caught=function(){return 0!=W[this.ptr+12>>0]};this.set_rethrown=function(b){W[this.ptr+13>>0]=b?1:0};this.get_rethrown=function(){return 0!=W[this.ptr+13>>0]};this.init=function(b,c){this.set_adjusted_ptr(0);this.set_type(b);this.set_destructor(c);this.set_refcount(0);this.set_caught(!1);this.set_rethrown(!1)};this.add_ref=function(){ca[this.ptr>>2]+=1};this.release_ref=function(){var b=ca[this.ptr>>2];ca[this.ptr>>2]=b-1;return 1===b};this.set_adjusted_ptr=function(b){Y[this.ptr+ 16>>2]=b};this.get_adjusted_ptr=function(){return Y[this.ptr+16>>2]};this.get_exception_ptr=function(){if(ua(this.get_type()))return Y[this.excPtr>>2];var b=this.get_adjusted_ptr();return 0!==b?b:this.excPtr}}function F(){function e(){if(!la&&(la=!0,a.calledRun=!0,!sa)){va=!0;u(oa);wa(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)xa.unshift(a.postRun.shift());u(xa)}}if(!(0=d?b++:2047>=d?b+=2:55296<=d&&57343>= d?(b+=4,++c):b+=3}b=Array(b+1);c=0;d=b.length;if(0=t){var aa=e.charCodeAt(++g);t=65536+((t&1023)<<10)|aa&1023}if(127>=t){if(c>=d)break;b[c++]=t}else{if(2047>=t){if(c+1>=d)break;b[c++]=192|t>>6}else{if(65535>=t){if(c+2>=d)break;b[c++]=224|t>>12}else{if(c+3>=d)break;b[c++]=240|t>>18;b[c++]=128|t>>12&63}b[c++]=128|t>>6&63}b[c++]=128|t&63}}b[c]=0}e=r.alloc(b,W);r.copy(b,W,e);return e}return e}function Z(e){if("object"=== typeof e){var b=r.alloc(e,W);r.copy(e,W,b);return b}return e}function X(){throw"cannot construct a VoidPtr, no constructor in IDL";}function S(){this.ptr=za();w(S)[this.ptr]=this}function Q(){this.ptr=Aa();w(Q)[this.ptr]=this}function V(){this.ptr=Ba();w(V)[this.ptr]=this}function x(){this.ptr=Ca();w(x)[this.ptr]=this}function D(){this.ptr=Da();w(D)[this.ptr]=this}function G(){this.ptr=Ea();w(G)[this.ptr]=this}function H(){this.ptr=Fa();w(H)[this.ptr]=this}function E(){this.ptr=Ga();w(E)[this.ptr]= this}function T(){this.ptr=Ha();w(T)[this.ptr]=this}function C(){throw"cannot construct a Status, no constructor in IDL";}function I(){this.ptr=Ia();w(I)[this.ptr]=this}function J(){this.ptr=Ja();w(J)[this.ptr]=this}function K(){this.ptr=Ka();w(K)[this.ptr]=this}function L(){this.ptr=La();w(L)[this.ptr]=this}function M(){this.ptr=Ma();w(M)[this.ptr]=this}function N(){this.ptr=Na();w(N)[this.ptr]=this}function O(){this.ptr=Oa();w(O)[this.ptr]=this}function z(){this.ptr=Pa();w(z)[this.ptr]=this}function m(){this.ptr= Qa();w(m)[this.ptr]=this}n=void 0===n?{}:n;var a="undefined"!=typeof n?n:{},wa,ka;a.ready=new Promise(function(e,b){wa=e;ka=b});var Ra=!1,Sa=!1;a.onRuntimeInitialized=function(){Ra=!0;if(Sa&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Sa=!0;if(Ra&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(e){if("string"!==typeof e)return!1;e=e.split(".");return 2>e.length||3=e[1]?!0:0!=e[0]||10< e[1]?!1:!0};var Ta=Object.assign({},a),ta="object"==typeof window,fa="function"==typeof importScripts,Ua="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,U="";if(Ua){var Va=require("fs"),pa=require("path");U=fa?pa.dirname(U)+"/":__dirname+"/";var Wa=function(e,b){e=e.startsWith("file://")?new URL(e):pa.normalize(e);return Va.readFileSync(e,b?void 0:"utf8")};var ma=function(e){e=Wa(e,!0);e.buffer||(e=new Uint8Array(e));return e};var na=function(e, b,c){e=e.startsWith("file://")?new URL(e):pa.normalize(e);Va.readFile(e,function(d,g){d?c(d):b(g.buffer)})};1>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,e+100663296);var g=Math;d=Math.max(e,d);g=g.min.call(g,2147483648,d+(65536-d%65536)%65536);a:{d=ja.buffer;try{ja.grow(g-d.byteLength+65535>>>16);l();var t=1;break a}catch(aa){}t=void 0}if(t)return!0}return!1}};(function(){function e(g,t){a.asm=g.exports;ja=a.asm.e;l();oa.unshift(a.asm.f);ba--;a.monitorRunDependencies&&a.monitorRunDependencies(ba);0==ba&&(null!==qa&&(clearInterval(qa),qa=null),ha&&(g=ha,ha=null,g()))}function b(g){e(g.instance)} function c(g){return q().then(function(t){return WebAssembly.instantiate(t,d)}).then(function(t){return t}).then(g,function(t){da("failed to asynchronously prepare wasm: "+t);y(t)})}var d={a:qd};ba++;a.monitorRunDependencies&&a.monitorRunDependencies(ba);if(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(g){da("Module.instantiateWasm callback failed with error: "+g),ka(g)}(function(){return ea||"function"!=typeof WebAssembly.instantiateStreaming||P.startsWith("data:application/octet-stream;base64,")|| P.startsWith("file://")||Ua||"function"!=typeof fetch?c(b):fetch(P,{credentials:"same-origin"}).then(function(g){return WebAssembly.instantiateStreaming(g,d).then(b,function(t){da("wasm streaming compile failed: "+t);da("falling back to ArrayBuffer instantiation");return c(b)})})})().catch(ka);return{}})();var Xa=a._emscripten_bind_VoidPtr___destroy___0=function(){return(Xa=a._emscripten_bind_VoidPtr___destroy___0=a.asm.h).apply(null,arguments)},za=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0= function(){return(za=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=a.asm.i).apply(null,arguments)},Ya=a._emscripten_bind_DecoderBuffer_Init_2=function(){return(Ya=a._emscripten_bind_DecoderBuffer_Init_2=a.asm.j).apply(null,arguments)},Za=a._emscripten_bind_DecoderBuffer___destroy___0=function(){return(Za=a._emscripten_bind_DecoderBuffer___destroy___0=a.asm.k).apply(null,arguments)},Aa=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=function(){return(Aa=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0= a.asm.l).apply(null,arguments)},$a=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return($a=a._emscripten_bind_AttributeTransformData_transform_type_0=a.asm.m).apply(null,arguments)},ab=a._emscripten_bind_AttributeTransformData___destroy___0=function(){return(ab=a._emscripten_bind_AttributeTransformData___destroy___0=a.asm.n).apply(null,arguments)},Ba=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return(Ba=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0= a.asm.o).apply(null,arguments)},bb=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return(bb=a._emscripten_bind_GeometryAttribute___destroy___0=a.asm.p).apply(null,arguments)},Ca=a._emscripten_bind_PointAttribute_PointAttribute_0=function(){return(Ca=a._emscripten_bind_PointAttribute_PointAttribute_0=a.asm.q).apply(null,arguments)},cb=a._emscripten_bind_PointAttribute_size_0=function(){return(cb=a._emscripten_bind_PointAttribute_size_0=a.asm.r).apply(null,arguments)},db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0= function(){return(db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=a.asm.s).apply(null,arguments)},eb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return(eb=a._emscripten_bind_PointAttribute_attribute_type_0=a.asm.t).apply(null,arguments)},fb=a._emscripten_bind_PointAttribute_data_type_0=function(){return(fb=a._emscripten_bind_PointAttribute_data_type_0=a.asm.u).apply(null,arguments)},gb=a._emscripten_bind_PointAttribute_num_components_0=function(){return(gb=a._emscripten_bind_PointAttribute_num_components_0= a.asm.v).apply(null,arguments)},hb=a._emscripten_bind_PointAttribute_normalized_0=function(){return(hb=a._emscripten_bind_PointAttribute_normalized_0=a.asm.w).apply(null,arguments)},ib=a._emscripten_bind_PointAttribute_byte_stride_0=function(){return(ib=a._emscripten_bind_PointAttribute_byte_stride_0=a.asm.x).apply(null,arguments)},jb=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return(jb=a._emscripten_bind_PointAttribute_byte_offset_0=a.asm.y).apply(null,arguments)},kb=a._emscripten_bind_PointAttribute_unique_id_0= function(){return(kb=a._emscripten_bind_PointAttribute_unique_id_0=a.asm.z).apply(null,arguments)},lb=a._emscripten_bind_PointAttribute___destroy___0=function(){return(lb=a._emscripten_bind_PointAttribute___destroy___0=a.asm.A).apply(null,arguments)},Da=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=function(){return(Da=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=a.asm.B).apply(null,arguments)},mb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1= function(){return(mb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=a.asm.C).apply(null,arguments)},nb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=function(){return(nb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=a.asm.D).apply(null,arguments)},ob=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return(ob=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=a.asm.E).apply(null,arguments)},pb= a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return(pb=a._emscripten_bind_AttributeQuantizationTransform_range_0=a.asm.F).apply(null,arguments)},qb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=function(){return(qb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=a.asm.G).apply(null,arguments)},Ea=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return(Ea=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0= a.asm.H).apply(null,arguments)},rb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=function(){return(rb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=a.asm.I).apply(null,arguments)},sb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return(sb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=a.asm.J).apply(null,arguments)},tb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return(tb= a._emscripten_bind_AttributeOctahedronTransform___destroy___0=a.asm.K).apply(null,arguments)},Fa=a._emscripten_bind_PointCloud_PointCloud_0=function(){return(Fa=a._emscripten_bind_PointCloud_PointCloud_0=a.asm.L).apply(null,arguments)},ub=a._emscripten_bind_PointCloud_num_attributes_0=function(){return(ub=a._emscripten_bind_PointCloud_num_attributes_0=a.asm.M).apply(null,arguments)},vb=a._emscripten_bind_PointCloud_num_points_0=function(){return(vb=a._emscripten_bind_PointCloud_num_points_0=a.asm.N).apply(null, arguments)},wb=a._emscripten_bind_PointCloud___destroy___0=function(){return(wb=a._emscripten_bind_PointCloud___destroy___0=a.asm.O).apply(null,arguments)},Ga=a._emscripten_bind_Mesh_Mesh_0=function(){return(Ga=a._emscripten_bind_Mesh_Mesh_0=a.asm.P).apply(null,arguments)},xb=a._emscripten_bind_Mesh_num_faces_0=function(){return(xb=a._emscripten_bind_Mesh_num_faces_0=a.asm.Q).apply(null,arguments)},yb=a._emscripten_bind_Mesh_num_attributes_0=function(){return(yb=a._emscripten_bind_Mesh_num_attributes_0= a.asm.R).apply(null,arguments)},zb=a._emscripten_bind_Mesh_num_points_0=function(){return(zb=a._emscripten_bind_Mesh_num_points_0=a.asm.S).apply(null,arguments)},Ab=a._emscripten_bind_Mesh___destroy___0=function(){return(Ab=a._emscripten_bind_Mesh___destroy___0=a.asm.T).apply(null,arguments)},Ha=a._emscripten_bind_Metadata_Metadata_0=function(){return(Ha=a._emscripten_bind_Metadata_Metadata_0=a.asm.U).apply(null,arguments)},Bb=a._emscripten_bind_Metadata___destroy___0=function(){return(Bb=a._emscripten_bind_Metadata___destroy___0= a.asm.V).apply(null,arguments)},Cb=a._emscripten_bind_Status_code_0=function(){return(Cb=a._emscripten_bind_Status_code_0=a.asm.W).apply(null,arguments)},Db=a._emscripten_bind_Status_ok_0=function(){return(Db=a._emscripten_bind_Status_ok_0=a.asm.X).apply(null,arguments)},Eb=a._emscripten_bind_Status_error_msg_0=function(){return(Eb=a._emscripten_bind_Status_error_msg_0=a.asm.Y).apply(null,arguments)},Fb=a._emscripten_bind_Status___destroy___0=function(){return(Fb=a._emscripten_bind_Status___destroy___0= a.asm.Z).apply(null,arguments)},Ia=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return(Ia=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=a.asm._).apply(null,arguments)},Gb=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return(Gb=a._emscripten_bind_DracoFloat32Array_GetValue_1=a.asm.$).apply(null,arguments)},Hb=a._emscripten_bind_DracoFloat32Array_size_0=function(){return(Hb=a._emscripten_bind_DracoFloat32Array_size_0=a.asm.aa).apply(null,arguments)},Ib= a._emscripten_bind_DracoFloat32Array___destroy___0=function(){return(Ib=a._emscripten_bind_DracoFloat32Array___destroy___0=a.asm.ba).apply(null,arguments)},Ja=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=function(){return(Ja=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=a.asm.ca).apply(null,arguments)},Jb=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return(Jb=a._emscripten_bind_DracoInt8Array_GetValue_1=a.asm.da).apply(null,arguments)},Kb=a._emscripten_bind_DracoInt8Array_size_0= function(){return(Kb=a._emscripten_bind_DracoInt8Array_size_0=a.asm.ea).apply(null,arguments)},Lb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return(Lb=a._emscripten_bind_DracoInt8Array___destroy___0=a.asm.fa).apply(null,arguments)},Ka=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return(Ka=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=a.asm.ga).apply(null,arguments)},Mb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return(Mb=a._emscripten_bind_DracoUInt8Array_GetValue_1= a.asm.ha).apply(null,arguments)},Nb=a._emscripten_bind_DracoUInt8Array_size_0=function(){return(Nb=a._emscripten_bind_DracoUInt8Array_size_0=a.asm.ia).apply(null,arguments)},Ob=a._emscripten_bind_DracoUInt8Array___destroy___0=function(){return(Ob=a._emscripten_bind_DracoUInt8Array___destroy___0=a.asm.ja).apply(null,arguments)},La=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return(La=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=a.asm.ka).apply(null,arguments)},Pb=a._emscripten_bind_DracoInt16Array_GetValue_1= function(){return(Pb=a._emscripten_bind_DracoInt16Array_GetValue_1=a.asm.la).apply(null,arguments)},Qb=a._emscripten_bind_DracoInt16Array_size_0=function(){return(Qb=a._emscripten_bind_DracoInt16Array_size_0=a.asm.ma).apply(null,arguments)},Rb=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return(Rb=a._emscripten_bind_DracoInt16Array___destroy___0=a.asm.na).apply(null,arguments)},Ma=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return(Ma=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0= a.asm.oa).apply(null,arguments)},Sb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return(Sb=a._emscripten_bind_DracoUInt16Array_GetValue_1=a.asm.pa).apply(null,arguments)},Tb=a._emscripten_bind_DracoUInt16Array_size_0=function(){return(Tb=a._emscripten_bind_DracoUInt16Array_size_0=a.asm.qa).apply(null,arguments)},Ub=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return(Ub=a._emscripten_bind_DracoUInt16Array___destroy___0=a.asm.ra).apply(null,arguments)},Na=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0= function(){return(Na=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=a.asm.sa).apply(null,arguments)},Vb=a._emscripten_bind_DracoInt32Array_GetValue_1=function(){return(Vb=a._emscripten_bind_DracoInt32Array_GetValue_1=a.asm.ta).apply(null,arguments)},Wb=a._emscripten_bind_DracoInt32Array_size_0=function(){return(Wb=a._emscripten_bind_DracoInt32Array_size_0=a.asm.ua).apply(null,arguments)},Xb=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return(Xb=a._emscripten_bind_DracoInt32Array___destroy___0= a.asm.va).apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return(Oa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=a.asm.wa).apply(null,arguments)},Yb=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return(Yb=a._emscripten_bind_DracoUInt32Array_GetValue_1=a.asm.xa).apply(null,arguments)},Zb=a._emscripten_bind_DracoUInt32Array_size_0=function(){return(Zb=a._emscripten_bind_DracoUInt32Array_size_0=a.asm.ya).apply(null,arguments)},$b=a._emscripten_bind_DracoUInt32Array___destroy___0= function(){return($b=a._emscripten_bind_DracoUInt32Array___destroy___0=a.asm.za).apply(null,arguments)},Pa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=function(){return(Pa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=a.asm.Aa).apply(null,arguments)},ac=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return(ac=a._emscripten_bind_MetadataQuerier_HasEntry_2=a.asm.Ba).apply(null,arguments)},bc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return(bc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2= a.asm.Ca).apply(null,arguments)},cc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=function(){return(cc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=a.asm.Da).apply(null,arguments)},dc=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return(dc=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=a.asm.Ea).apply(null,arguments)},ec=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return(ec=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=a.asm.Fa).apply(null, arguments)},fc=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return(fc=a._emscripten_bind_MetadataQuerier_NumEntries_1=a.asm.Ga).apply(null,arguments)},gc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return(gc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=a.asm.Ha).apply(null,arguments)},hc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return(hc=a._emscripten_bind_MetadataQuerier___destroy___0=a.asm.Ia).apply(null,arguments)},Qa=a._emscripten_bind_Decoder_Decoder_0= function(){return(Qa=a._emscripten_bind_Decoder_Decoder_0=a.asm.Ja).apply(null,arguments)},ic=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=function(){return(ic=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=a.asm.Ka).apply(null,arguments)},jc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=function(){return(jc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=a.asm.La).apply(null,arguments)},kc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return(kc=a._emscripten_bind_Decoder_GetAttributeId_2= a.asm.Ma).apply(null,arguments)},lc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return(lc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=a.asm.Na).apply(null,arguments)},mc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return(mc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=a.asm.Oa).apply(null,arguments)},nc=a._emscripten_bind_Decoder_GetAttribute_2=function(){return(nc=a._emscripten_bind_Decoder_GetAttribute_2=a.asm.Pa).apply(null,arguments)}, oc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return(oc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=a.asm.Qa).apply(null,arguments)},pc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return(pc=a._emscripten_bind_Decoder_GetMetadata_1=a.asm.Ra).apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return(qc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=a.asm.Sa).apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetFaceFromMesh_3= function(){return(rc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=a.asm.Ta).apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=function(){return(sc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=a.asm.Ua).apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return(tc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=a.asm.Va).apply(null,arguments)},uc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=function(){return(uc= a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=a.asm.Wa).apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return(vc=a._emscripten_bind_Decoder_GetAttributeFloat_3=a.asm.Xa).apply(null,arguments)},wc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return(wc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=a.asm.Ya).apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return(xc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3= a.asm.Za).apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return(yc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=a.asm._a).apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return(zc=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=a.asm.$a).apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return(Ac=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3= a.asm.ab).apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=function(){return(Bc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=a.asm.bb).apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return(Cc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=a.asm.cb).apply(null,arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return(Dc=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3= a.asm.db).apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=function(){return(Ec=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=a.asm.eb).apply(null,arguments)},Fc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return(Fc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=a.asm.fb).apply(null,arguments)},Gc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=function(){return(Gc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1= a.asm.gb).apply(null,arguments)},Hc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=function(){return(Hc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=a.asm.hb).apply(null,arguments)},Ic=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return(Ic=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=a.asm.ib).apply(null,arguments)},Jc=a._emscripten_bind_Decoder___destroy___0=function(){return(Jc=a._emscripten_bind_Decoder___destroy___0=a.asm.jb).apply(null,arguments)},Kc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM= function(){return(Kc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=a.asm.kb).apply(null,arguments)},Lc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return(Lc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=a.asm.lb).apply(null,arguments)},Mc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return(Mc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM= a.asm.mb).apply(null,arguments)},Nc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=function(){return(Nc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=a.asm.nb).apply(null,arguments)},Oc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return(Oc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=a.asm.ob).apply(null,arguments)},Pc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return(Pc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION= a.asm.pb).apply(null,arguments)},Qc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=function(){return(Qc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=a.asm.qb).apply(null,arguments)},Rc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=function(){return(Rc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=a.asm.rb).apply(null,arguments)},Sc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return(Sc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD= a.asm.sb).apply(null,arguments)},Tc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=function(){return(Tc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=a.asm.tb).apply(null,arguments)},Uc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return(Uc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=a.asm.ub).apply(null,arguments)},Vc=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return(Vc=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD= a.asm.vb).apply(null,arguments)},Wc=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=function(){return(Wc=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=a.asm.wb).apply(null,arguments)},Xc=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return(Xc=a._emscripten_enum_draco_DataType_DT_INVALID=a.asm.xb).apply(null,arguments)},Yc=a._emscripten_enum_draco_DataType_DT_INT8=function(){return(Yc=a._emscripten_enum_draco_DataType_DT_INT8=a.asm.yb).apply(null,arguments)},Zc= a._emscripten_enum_draco_DataType_DT_UINT8=function(){return(Zc=a._emscripten_enum_draco_DataType_DT_UINT8=a.asm.zb).apply(null,arguments)},$c=a._emscripten_enum_draco_DataType_DT_INT16=function(){return($c=a._emscripten_enum_draco_DataType_DT_INT16=a.asm.Ab).apply(null,arguments)},ad=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return(ad=a._emscripten_enum_draco_DataType_DT_UINT16=a.asm.Bb).apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return(bd=a._emscripten_enum_draco_DataType_DT_INT32= a.asm.Cb).apply(null,arguments)},cd=a._emscripten_enum_draco_DataType_DT_UINT32=function(){return(cd=a._emscripten_enum_draco_DataType_DT_UINT32=a.asm.Db).apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_INT64=function(){return(dd=a._emscripten_enum_draco_DataType_DT_INT64=a.asm.Eb).apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return(ed=a._emscripten_enum_draco_DataType_DT_UINT64=a.asm.Fb).apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_FLOAT32= function(){return(fd=a._emscripten_enum_draco_DataType_DT_FLOAT32=a.asm.Gb).apply(null,arguments)},gd=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return(gd=a._emscripten_enum_draco_DataType_DT_FLOAT64=a.asm.Hb).apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return(hd=a._emscripten_enum_draco_DataType_DT_BOOL=a.asm.Ib).apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return(id=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT= a.asm.Jb).apply(null,arguments)},jd=a._emscripten_enum_draco_StatusCode_OK=function(){return(jd=a._emscripten_enum_draco_StatusCode_OK=a.asm.Kb).apply(null,arguments)},kd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return(kd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=a.asm.Lb).apply(null,arguments)},ld=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return(ld=a._emscripten_enum_draco_StatusCode_IO_ERROR=a.asm.Mb).apply(null,arguments)},md=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER= function(){return(md=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=a.asm.Nb).apply(null,arguments)},nd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=function(){return(nd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=a.asm.Ob).apply(null,arguments)},od=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return(od=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=a.asm.Pb).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.Qb).apply(null,arguments)}; a._free=function(){return(a._free=a.asm.Rb).apply(null,arguments)};var ua=function(){return(ua=a.asm.Sb).apply(null,arguments)};a.___start_em_js=11660;a.___stop_em_js=11758;var la;ha=function b(){la||F();la||(ha=b)};if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0=r.size?(0>>=0;switch(c.BYTES_PER_ELEMENT){case 2:d>>>=1;break;case 4:d>>>=2;break;case 8:d>>>=3}for(var g=0;gb.byteLength)return a.INVALID_GEOMETRY_TYPE;switch(b[7]){case 0:return a.POINT_CLOUD;case 1:return a.TRIANGULAR_MESH;default:return a.INVALID_GEOMETRY_TYPE}};return n.ready}}();"object"===typeof exports&&"object"===typeof module?module.exports=DracoDecoderModule:"function"===typeof define&&define.amd?define([],function(){return DracoDecoderModule}):"object"===typeof exports&&(exports.DracoDecoderModule=DracoDecoderModule); ================================================ FILE: examples/libs/es-module-shims.js ================================================ /* ES Module Shims 1.5.17 */ (function () { const hasWindow = typeof window !== 'undefined'; const hasDocument = typeof document !== 'undefined'; const noop = () => {}; const optionsScript = hasDocument ? document.querySelector('script[type=esms-options]') : undefined; const esmsInitOptions = optionsScript ? JSON.parse(optionsScript.innerHTML) : {}; Object.assign(esmsInitOptions, self.esmsInitOptions || {}); let shimMode = hasDocument ? !!esmsInitOptions.shimMode : true; const importHook = globalHook(shimMode && esmsInitOptions.onimport); const resolveHook = globalHook(shimMode && esmsInitOptions.resolve); let fetchHook = esmsInitOptions.fetch ? globalHook(esmsInitOptions.fetch) : fetch; const metaHook = esmsInitOptions.meta ? globalHook(shimMode && esmsInitOptions.meta) : noop; const skip = esmsInitOptions.skip ? new RegExp(esmsInitOptions.skip) : null; const mapOverrides = esmsInitOptions.mapOverrides; let nonce = esmsInitOptions.nonce; if (!nonce && hasDocument) { const nonceElement = document.querySelector('script[nonce]'); if (nonceElement) nonce = nonceElement.nonce || nonceElement.getAttribute('nonce'); } const onerror = globalHook(esmsInitOptions.onerror || noop); const onpolyfill = esmsInitOptions.onpolyfill ? globalHook(esmsInitOptions.onpolyfill) : () => { console.log('%c^^ Module TypeError above is polyfilled and can be ignored ^^', 'font-weight:900;color:#391'); }; const { revokeBlobURLs, noLoadEventRetriggers, enforceIntegrity } = esmsInitOptions; function globalHook (name) { return typeof name === 'string' ? self[name] : name; } const enable = Array.isArray(esmsInitOptions.polyfillEnable) ? esmsInitOptions.polyfillEnable : []; const cssModulesEnabled = enable.includes('css-modules'); const jsonModulesEnabled = enable.includes('json-modules'); const edge = !navigator.userAgentData && !!navigator.userAgent.match(/Edge\/\d+\.\d+/); const baseUrl = hasDocument ? document.baseURI : `${location.protocol}//${location.host}${location.pathname.includes('/') ? location.pathname.slice(0, location.pathname.lastIndexOf('/') + 1) : location.pathname}`; const createBlob = (source, type = 'text/javascript') => URL.createObjectURL(new Blob([source], { type })); const eoop = err => setTimeout(() => { throw err }); const throwError = err => { (self.reportError || hasWindow && window.safari && console.error || eoop)(err), void onerror(err); }; function fromParent (parent) { return parent ? ` imported from ${parent}` : ''; } let importMapSrcOrLazy = false; function setImportMapSrcOrLazy () { importMapSrcOrLazy = true; } // shim mode is determined on initialization, no late shim mode if (!shimMode) { if (document.querySelectorAll('script[type=module-shim],script[type=importmap-shim],link[rel=modulepreload-shim]').length) { shimMode = true; } else { let seenScript = false; for (const script of document.querySelectorAll('script[type=module],script[type=importmap]')) { if (!seenScript) { if (script.type === 'module' && !script.ep) seenScript = true; } else if (script.type === 'importmap' && seenScript) { importMapSrcOrLazy = true; break; } } } } const backslashRegEx = /\\/g; function isURL (url) { if (url.indexOf(':') === -1) return false; try { new URL(url); return true; } catch (_) { return false; } } /* * Import maps implementation * * To make lookups fast we pre-resolve the entire import map * and then match based on backtracked hash lookups * */ function resolveUrl (relUrl, parentUrl) { return resolveIfNotPlainOrUrl(relUrl, parentUrl) || (isURL(relUrl) ? relUrl : resolveIfNotPlainOrUrl('./' + relUrl, parentUrl)); } function resolveIfNotPlainOrUrl (relUrl, parentUrl) { // strip off any trailing query params or hashes const queryHashIndex = parentUrl.indexOf('?', parentUrl.indexOf('#') === -1 ? parentUrl.indexOf('#') : parentUrl.length); if (queryHashIndex !== -1) parentUrl = parentUrl.slice(0, queryHashIndex); if (relUrl.indexOf('\\') !== -1) relUrl = relUrl.replace(backslashRegEx, '/'); // protocol-relative if (relUrl[0] === '/' && relUrl[1] === '/') { return parentUrl.slice(0, parentUrl.indexOf(':') + 1) + relUrl; } // relative-url else if (relUrl[0] === '.' && (relUrl[1] === '/' || relUrl[1] === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) || relUrl.length === 1 && (relUrl += '/')) || relUrl[0] === '/') { const parentProtocol = parentUrl.slice(0, parentUrl.indexOf(':') + 1); // Disabled, but these cases will give inconsistent results for deep backtracking //if (parentUrl[parentProtocol.length] !== '/') // throw new Error('Cannot resolve'); // read pathname from parent URL // pathname taken to be part after leading "/" let pathname; if (parentUrl[parentProtocol.length + 1] === '/') { // resolving to a :// so we need to read out the auth and host if (parentProtocol !== 'file:') { pathname = parentUrl.slice(parentProtocol.length + 2); pathname = pathname.slice(pathname.indexOf('/') + 1); } else { pathname = parentUrl.slice(8); } } else { // resolving to :/ so pathname is the /... part pathname = parentUrl.slice(parentProtocol.length + (parentUrl[parentProtocol.length] === '/')); } if (relUrl[0] === '/') return parentUrl.slice(0, parentUrl.length - pathname.length - 1) + relUrl; // join together and split for removal of .. and . segments // looping the string instead of anything fancy for perf reasons // '../../../../../z' resolved to 'x/y' is just 'z' const segmented = pathname.slice(0, pathname.lastIndexOf('/') + 1) + relUrl; const output = []; let segmentIndex = -1; for (let i = 0; i < segmented.length; i++) { // busy reading a segment - only terminate on '/' if (segmentIndex !== -1) { if (segmented[i] === '/') { output.push(segmented.slice(segmentIndex, i + 1)); segmentIndex = -1; } continue; } // new segment - check if it is relative else if (segmented[i] === '.') { // ../ segment if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) { output.pop(); i += 2; continue; } // ./ segment else if (segmented[i + 1] === '/' || i + 1 === segmented.length) { i += 1; continue; } } // it is the start of a new segment while (segmented[i] === '/') i++; segmentIndex = i; } // finish reading out the last segment if (segmentIndex !== -1) output.push(segmented.slice(segmentIndex)); return parentUrl.slice(0, parentUrl.length - pathname.length) + output.join(''); } } function resolveAndComposeImportMap (json, baseUrl, parentMap) { const outMap = { imports: Object.assign({}, parentMap.imports), scopes: Object.assign({}, parentMap.scopes) }; if (json.imports) resolveAndComposePackages(json.imports, outMap.imports, baseUrl, parentMap); if (json.scopes) for (let s in json.scopes) { const resolvedScope = resolveUrl(s, baseUrl); resolveAndComposePackages(json.scopes[s], outMap.scopes[resolvedScope] || (outMap.scopes[resolvedScope] = {}), baseUrl, parentMap); } return outMap; } function getMatch (path, matchObj) { if (matchObj[path]) return path; let sepIndex = path.length; do { const segment = path.slice(0, sepIndex + 1); if (segment in matchObj) return segment; } while ((sepIndex = path.lastIndexOf('/', sepIndex - 1)) !== -1) } function applyPackages (id, packages) { const pkgName = getMatch(id, packages); if (pkgName) { const pkg = packages[pkgName]; if (pkg === null) return; return pkg + id.slice(pkgName.length); } } function resolveImportMap (importMap, resolvedOrPlain, parentUrl) { let scopeUrl = parentUrl && getMatch(parentUrl, importMap.scopes); while (scopeUrl) { const packageResolution = applyPackages(resolvedOrPlain, importMap.scopes[scopeUrl]); if (packageResolution) return packageResolution; scopeUrl = getMatch(scopeUrl.slice(0, scopeUrl.lastIndexOf('/')), importMap.scopes); } return applyPackages(resolvedOrPlain, importMap.imports) || resolvedOrPlain.indexOf(':') !== -1 && resolvedOrPlain; } function resolveAndComposePackages (packages, outPackages, baseUrl, parentMap) { for (let p in packages) { const resolvedLhs = resolveIfNotPlainOrUrl(p, baseUrl) || p; if ((!shimMode || !mapOverrides) && outPackages[resolvedLhs] && (outPackages[resolvedLhs] !== packages[resolvedLhs])) { throw Error(`Rejected map override "${resolvedLhs}" from ${outPackages[resolvedLhs]} to ${packages[resolvedLhs]}.`); } let target = packages[p]; if (typeof target !== 'string') continue; const mapped = resolveImportMap(parentMap, resolveIfNotPlainOrUrl(target, baseUrl) || target, baseUrl); if (mapped) { outPackages[resolvedLhs] = mapped; continue; } console.warn(`Mapping "${p}" -> "${packages[p]}" does not resolve`); } } let dynamicImport = !hasDocument && (0, eval)('u=>import(u)'); let supportsDynamicImport; const dynamicImportCheck = hasDocument && new Promise(resolve => { const s = Object.assign(document.createElement('script'), { src: createBlob('self._d=u=>import(u)'), ep: true }); s.setAttribute('nonce', nonce); s.addEventListener('load', () => { if (!(supportsDynamicImport = !!(dynamicImport = self._d))) { let err; window.addEventListener('error', _err => err = _err); dynamicImport = (url, opts) => new Promise((resolve, reject) => { const s = Object.assign(document.createElement('script'), { type: 'module', src: createBlob(`import*as m from'${url}';self._esmsi=m`) }); err = undefined; s.ep = true; if (nonce) s.setAttribute('nonce', nonce); // Safari is unique in supporting module script error events s.addEventListener('error', cb); s.addEventListener('load', cb); function cb (_err) { document.head.removeChild(s); if (self._esmsi) { resolve(self._esmsi, baseUrl); self._esmsi = undefined; } else { reject(!(_err instanceof Event) && _err || err && err.error || new Error(`Error loading ${opts && opts.errUrl || url} (${s.src}).`)); err = undefined; } } document.head.appendChild(s); }); } document.head.removeChild(s); delete self._d; resolve(); }); document.head.appendChild(s); }); // support browsers without dynamic import support (eg Firefox 6x) let supportsJsonAssertions = false; let supportsCssAssertions = false; let supportsImportMaps = hasDocument && HTMLScriptElement.supports ? HTMLScriptElement.supports('importmap') : false; let supportsImportMeta = supportsImportMaps; const importMetaCheck = 'import.meta'; const cssModulesCheck = `import"x"assert{type:"css"}`; const jsonModulesCheck = `import"x"assert{type:"json"}`; const featureDetectionPromise = Promise.resolve(dynamicImportCheck).then(() => { if (!supportsDynamicImport || supportsImportMaps && !cssModulesEnabled && !jsonModulesEnabled) return; if (!hasDocument) return Promise.all([ supportsImportMaps || dynamicImport(createBlob(importMetaCheck)).then(() => supportsImportMeta = true, noop), cssModulesEnabled && dynamicImport(createBlob(cssModulesCheck.replace('x', createBlob('', 'text/css')))).then(() => supportsCssAssertions = true, noop), jsonModulesEnabled && dynamicImport(createBlob(jsonModulescheck.replace('x', createBlob('{}', 'text/json')))).then(() => supportsJsonAssertions = true, noop), ]); return new Promise(resolve => { const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.setAttribute('nonce', nonce); function cb ({ data: [a, b, c, d] }) { supportsImportMaps = a; supportsImportMeta = b; supportsCssAssertions = c; supportsJsonAssertions = d; resolve(); document.head.removeChild(iframe); window.removeEventListener('message', cb, false); } window.addEventListener('message', cb, false); const importMapTest = ` ================================================ FILE: examples/light_group.html ================================================ t3d - light group

t3d - light group
Select the lighting group for the center mesh material.
================================================ FILE: examples/light_hemispherelight.html ================================================ t3d - hemisphere light
t3d - hemisphere light
================================================ FILE: examples/light_pointlight.html ================================================ t3d - pointlight
t3d - point light
================================================ FILE: examples/light_rectarealight.html ================================================ t3d - rect area light
t3d - rect area light
================================================ FILE: examples/light_shadow.html ================================================ t3d - shadow
t3d - shadow
================================================ FILE: examples/light_shadow_adapter.html ================================================ t3d - shadow adapter
t3d - shadow adapter
================================================ FILE: examples/light_softshadow.html ================================================ t3d - soft shadow
t3d - soft shadow
================================================ FILE: examples/light_sphericalharmonicslight.html ================================================ t3d - sphericalharmonicslight
t3d - pbr
================================================ FILE: examples/light_spotlight.html ================================================ t3d - spotlight
t3d - spot light
================================================ FILE: examples/lines_dashedlines.html ================================================ t3d - dashed lines
t3d - dashed lines
================================================ FILE: examples/lines_instancedlines.html ================================================ t3d - instanced lines
t3d - instanced lines
================================================ FILE: examples/lines_lines.html ================================================ t3d - lines
t3d - lines
================================================ FILE: examples/main.css ================================================ @font-face { font-family: 'body'; src: url('./files/fonts/Montserrat-Regular.ttf') format('truetype'); font-display: fallback; } body { margin: 0px; background-color: #f0f0f0; color: #fff; font-family: "body", "Arial", sans-serif; font-size: 13px; line-height: 24px; overscroll-behavior: none; overflow: hidden; } .dark { color: #000; } a { color: #FF7F02; text-decoration: none; } a:hover { text-decoration: underline; } #info { position: absolute; top: 0px; width: 100%; padding: 10px; box-sizing: border-box; text-align: center; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; pointer-events: none; z-index: 1; /* TODO Solve this in HTML */ } a { pointer-events: auto; } canvas { display: block; -webkit-tap-highlight-color: rgba(0,0,0,0); -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .lil-gui { --number-color: #ff8002; --string-color: lightgreen; z-index: 2 !important; /* TODO Solve this in HTML */ } @media all and (max-width: 640px) { .lil-gui.root { right: auto; top: auto; max-height: 50%; max-width: 80%; bottom: 0; left: 0; } } .bar { background: lightgreen; } #notSupported { width: 50%; margin: auto; background-color: #f00; margin-top: 20px; padding: 10px; } ================================================ FILE: examples/material_alphahash.html ================================================ t3d - alpha hash
t3d - alpha hash
================================================ FILE: examples/material_alphamask.html ================================================ t3d - alpha mask
t3d - alpha mask
Image by unsplash.com/@nypl
================================================ FILE: examples/material_blending.html ================================================ t3d - material blending ================================================ FILE: examples/material_bumpmap.html ================================================ t3d - bump map
t3d - bump map
================================================ FILE: examples/material_clearcoat.html ================================================ t3d - clearcoat
t3d - clearcoat
================================================ FILE: examples/material_clippingplanes.html ================================================ t3d - material clipping planes
t3d - material clipping planes
================================================ FILE: examples/material_depth.html ================================================ t3d - depth material
t3d - depth material
================================================ FILE: examples/material_emissivemap.html ================================================ t3d - emissivemap
t3d - emissivemap
================================================ FILE: examples/material_envmap.html ================================================ t3d - envmap
t3d - envmap
================================================ FILE: examples/material_flatshading.html ================================================ t3d - flat shading
t3d - flat shading
================================================ FILE: examples/material_lightmap.html ================================================ t3d - lightmap
t3d - lightmap
================================================ FILE: examples/material_materials.html ================================================ t3d - materials
t3d - materials
================================================ FILE: examples/material_normalmap.html ================================================ t3d - normalmap
t3d - normalmap
================================================ FILE: examples/material_pbr.html ================================================ t3d - pbr
t3d - pbr
================================================ FILE: examples/material_shader_background.html ================================================ t3d - shader background
t3d - shader background
================================================ FILE: examples/material_shader_extend.html ================================================ t3d - shader extend
t3d - shader extend
================================================ FILE: examples/material_shader_fakeInterior.html ================================================ t3d - fake interior
t3d - fake interior
reference: Fake-Interior-Shader-for-GodotEngine
================================================ FILE: examples/material_shader_grid.html ================================================ t3d - shader grid material
t3d - shader grid
================================================ FILE: examples/material_shader_matcap.html ================================================ t3d - matcap
t3d - matcap
================================================ FILE: examples/material_shader_shadow.html ================================================ t3d - shadow material
t3d - shadow material
================================================ FILE: examples/material_shader_sky.html ================================================ t3d - shader sky
t3d - shader sky
================================================ FILE: examples/material_shader_sky2.html ================================================ t3d - skybox
t3d - skybox
================================================ FILE: examples/material_shader_sky_gradient.html ================================================ t3d - gradient sky
t3d - shader gradient sky
================================================ FILE: examples/material_shader_skybox.html ================================================ t3d - skybox
t3d - skybox
================================================ FILE: examples/material_shader_skybox_filter.html ================================================ t3d - skybox filter
t3d - skybox filter
================================================ FILE: examples/material_shader_skybox_groundprojected.html ================================================ t3d - ground projected skybox
t3d - ground projected skybox
================================================ FILE: examples/material_shader_volume.html ================================================ t3d - volume
t3d - volume
================================================ FILE: examples/material_shader_volume_layered.html ================================================ t3d - shader Layered Volume
t3d - shader Layered Volume
================================================ FILE: examples/material_shader_water.html ================================================ t3d - shader water
t3d - shader water
================================================ FILE: examples/material_shader_water_pbr.html ================================================ t3d - pbr water
t3d - pbr water
================================================ FILE: examples/material_shader_xray.html ================================================ t3d - shader XRay
t3d - shader XRay
================================================ FILE: examples/material_shadermaterial.html ================================================ t3d - shadermaterial
t3d - shadermaterial
================================================ FILE: examples/material_transparent.html ================================================ t3d - transparent
t3d - transparent
================================================ FILE: examples/material_uvcoord.html ================================================ t3d - uv coord
t3d - uv coord
================================================ FILE: examples/material_uvtransform.html ================================================ t3d - uv transform
t3d - uv transform
================================================ FILE: examples/material_vertexcolors.html ================================================ t3d - vertex colors
t3d - vertex colors
================================================ FILE: examples/math_curve.html ================================================ t3d - curve
t3d - curve
================================================ FILE: examples/math_curve_motion.html ================================================ t3d - curve motion
t3d - curve motion
================================================ FILE: examples/math_obb.html ================================================ t3d - obb test
t3d - obb test
================================================ FILE: examples/math_octree.html ================================================ t3d - octree
t3d - octree
================================================ FILE: examples/navigation_pathfinding.html ================================================ t3d - navigation path finding
t3d - navigation path finding reference to three-pathfinding
Controls: LeftClick: Set start/destination | RightClick/Ctrl+LeftClick: Reset path
================================================ FILE: examples/navigation_recast_crowd.html ================================================ t3d - navigation recast crowd
t3d - Navigation recast crowd using recast-navigation-js
Controls: Click to move all agents to that position
================================================ FILE: examples/navigation_recast_generation.html ================================================ t3d - navigation recast generation
t3d - Navigation mesh generation using recast-navigation-js
Controls: Click to move agent
================================================ FILE: examples/navigation_recast_obstacles.html ================================================ t3d - navigation recast obstacles
t3d - Navigation mesh obstacles using recast-navigation-js
Controls: Click to move agent
================================================ FILE: examples/navigation_recast_walking.html ================================================ t3d - navigation recast walking
t3d - Navigation walking using recast-navigation-js
Controls: 'WASD' keys to move, 'Shift' to run faster
================================================ FILE: examples/particle_particle.html ================================================ t3d - particle
t3d - particle
================================================ FILE: examples/physics_ammo.html ================================================ t3d - ammo
t3d.js - Physics demo with ammo.js
Click once to create a cube, or click and hold to create multiple cubes
================================================ FILE: examples/physics_ammo_softbody_volume.html ================================================ t3d - ammo softbody volume
t3d.js - Physics demo Soft Body with ammo.js
Touch screen to throw a ball
================================================ FILE: examples/physics_cannon.html ================================================ t3d - cannon
t3d.js - Physics demo with cannon.js
Click once to create a cube, or click and hold to create multiple cubes
================================================ FILE: examples/physics_ik.html ================================================ t3d - physics ik
t3d - physics ik
================================================ FILE: examples/physics_rapier.html ================================================ t3d - rapier
t3d.js - Physics demo with rapier.js
Click once to create a cube, or click and hold to create multiple cubes
================================================ FILE: examples/physics_rapier_character_controller.html ================================================ t3d - rapier
t3d.js - Physics demo character controller with rapier.js
WASD or Arrow keys to move
================================================ FILE: examples/points_sprites.html ================================================ t3d - sprites
t3d - sprites
================================================ FILE: examples/probes_reflection.html ================================================ t3d - probes reflection
t3d - probes reflection
================================================ FILE: examples/probes_reflection_planar.html ================================================ t3d - probes reflection planar
t3d - probes reflection planar
================================================ FILE: examples/raycast_raycaster.html ================================================ t3d - raycaster
t3d - raycaster
move mouse to raycast objects
================================================ FILE: examples/renderer_clustered_lighting.html ================================================ t3d - clustered lighting
t3d - renderer - clustered lighting
Available only for WebGL 2.0
================================================ FILE: examples/renderer_culling_contribution.html ================================================ t3d - Size-Based Culling
t3d - Size-Based Culling (Contribution Culling)
================================================ FILE: examples/renderer_culling_frustum.html ================================================ t3d - frustum culling test
t3d - frustum culling test
================================================ FILE: examples/renderer_deferred.html ================================================ t3d - deferred renderer
t3d - deferred renderer
================================================ FILE: examples/renderer_deferred_lighting.html ================================================ t3d - deferred lighting
t3d - renderer - deferred lighting
================================================ FILE: examples/resources/3d/Readme.txt ================================================ ** head256x256x109.zip This file is from https://www.codeproject.com/Articles/352270/Getting-started-with-Volume-Rendering This file is licensed under The Code Project Open License (CPOL) https://www.codeproject.com/info/cpol10.aspx ================================================ FILE: examples/resources/fonts/msdf/roboto-regular.fnt ================================================ { "pages": [ "roboto-regular.png" ], "chars": [ { "id": 40, "index": 12, "char": "(", "width": 25, "height": 87, "xoffset": 3, "yoffset": -2, "xadvance": 27, "chnl": 15, "x": 0, "y": 0, "page": 0 }, { "id": 41, "index": 13, "char": ")", "width": 25, "height": 87, "xoffset": -1, "yoffset": -2, "xadvance": 28, "chnl": 15, "x": 0, "y": 88, "page": 0 }, { "id": 91, "index": 63, "char": "[", "width": 19, "height": 81, "xoffset": 4, "yoffset": -3, "xadvance": 21, "chnl": 15, "x": 0, "y": 176, "page": 0 }, { "id": 93, "index": 65, "char": "]", "width": 19, "height": 81, "xoffset": -2, "yoffset": -3, "xadvance": 21, "chnl": 15, "x": 0, "y": 258, "page": 0 }, { "id": 123, "index": 95, "char": "{", "width": 28, "height": 81, "xoffset": 1, "yoffset": 0, "xadvance": 27, "chnl": 15, "x": 0, "y": 340, "page": 0 }, { "id": 125, "index": 97, "char": "}", "width": 28, "height": 81, "xoffset": -1, "yoffset": 0, "xadvance": 27, "chnl": 15, "x": 0, "y": 422, "page": 0 }, { "id": 106, "index": 78, "char": "j", "width": 20, "height": 79, "xoffset": -5, "yoffset": 4, "xadvance": 19, "chnl": 15, "x": 20, "y": 176, "page": 0 }, { "id": 36, "index": 8, "char": "$", "width": 40, "height": 78, "xoffset": 2, "yoffset": -4, "xadvance": 45, "chnl": 15, "x": 20, "y": 256, "page": 0 }, { "id": 64, "index": 36, "char": "@", "width": 67, "height": 78, "xoffset": 3, "yoffset": 6, "xadvance": 72, "chnl": 15, "x": 26, "y": 0, "page": 0 }, { "id": 81, "index": 53, "char": "Q", "width": 50, "height": 71, "xoffset": 2, "yoffset": 4, "xadvance": 55, "chnl": 15, "x": 26, "y": 79, "page": 0 }, { "id": 87, "index": 59, "char": "W", "width": 71, "height": 61, "xoffset": 0, "yoffset": 5, "xadvance": 71, "chnl": 15, "x": 41, "y": 151, "page": 0 }, { "id": 124, "index": 96, "char": "|", "width": 10, "height": 71, "xoffset": 5, "yoffset": 5, "xadvance": 19, "chnl": 15, "x": 77, "y": 79, "page": 0 }, { "id": 92, "index": 64, "char": "\\", "width": 35, "height": 66, "xoffset": 0, "yoffset": 5, "xadvance": 33, "chnl": 15, "x": 88, "y": 79, "page": 0 }, { "id": 47, "index": 19, "char": "/", "width": 34, "height": 66, "xoffset": -1, "yoffset": 5, "xadvance": 33, "chnl": 15, "x": 94, "y": 0, "page": 0 }, { "id": 162, "index": 100, "char": "¢", "width": 40, "height": 65, "xoffset": 2, "yoffset": 11, "xadvance": 44, "chnl": 15, "x": 29, "y": 335, "page": 0 }, { "id": 98, "index": 70, "char": "b", "width": 40, "height": 65, "xoffset": 3, "yoffset": 2, "xadvance": 45, "chnl": 15, "x": 29, "y": 401, "page": 0 }, { "id": 100, "index": 72, "char": "d", "width": 40, "height": 65, "xoffset": 2, "yoffset": 2, "xadvance": 45, "chnl": 15, "x": 61, "y": 213, "page": 0 }, { "id": 102, "index": 74, "char": "f", "width": 30, "height": 65, "xoffset": 0, "yoffset": 1, "xadvance": 28, "chnl": 15, "x": 70, "y": 279, "page": 0 }, { "id": 103, "index": 75, "char": "g", "width": 40, "height": 64, "xoffset": 2, "yoffset": 19, "xadvance": 45, "chnl": 15, "x": 70, "y": 345, "page": 0 }, { "id": 104, "index": 76, "char": "h", "width": 37, "height": 64, "xoffset": 3, "yoffset": 2, "xadvance": 44, "chnl": 15, "x": 101, "y": 279, "page": 0 }, { "id": 107, "index": 79, "char": "k", "width": 39, "height": 64, "xoffset": 4, "yoffset": 2, "xadvance": 41, "chnl": 15, "x": 102, "y": 213, "page": 0 }, { "id": 108, "index": 80, "char": "l", "width": 11, "height": 64, "xoffset": 4, "yoffset": 2, "xadvance": 19, "chnl": 15, "x": 113, "y": 146, "page": 0 }, { "id": 37, "index": 9, "char": "%", "width": 55, "height": 63, "xoffset": 2, "yoffset": 4, "xadvance": 59, "chnl": 15, "x": 124, "y": 67, "page": 0 }, { "id": 109, "index": 81, "char": "m", "width": 63, "height": 47, "xoffset": 3, "yoffset": 19, "xadvance": 70, "chnl": 15, "x": 129, "y": 0, "page": 0 }, { "id": 112, "index": 84, "char": "p", "width": 40, "height": 63, "xoffset": 3, "yoffset": 19, "xadvance": 45, "chnl": 15, "x": 125, "y": 131, "page": 0 }, { "id": 113, "index": 85, "char": "q", "width": 40, "height": 63, "xoffset": 2, "yoffset": 19, "xadvance": 45, "chnl": 15, "x": 70, "y": 410, "page": 0 }, { "id": 121, "index": 93, "char": "y", "width": 40, "height": 63, "xoffset": -1, "yoffset": 20, "xadvance": 38, "chnl": 15, "x": 111, "y": 344, "page": 0 }, { "id": 163, "index": 101, "char": "£", "width": 45, "height": 62, "xoffset": 2, "yoffset": 4, "xadvance": 46, "chnl": 15, "x": 139, "y": 278, "page": 0 }, { "id": 38, "index": 10, "char": "&", "width": 50, "height": 62, "xoffset": 2, "yoffset": 4, "xadvance": 50, "chnl": 15, "x": 142, "y": 195, "page": 0 }, { "id": 48, "index": 20, "char": "0", "width": 40, "height": 62, "xoffset": 2, "yoffset": 4, "xadvance": 45, "chnl": 15, "x": 166, "y": 131, "page": 0 }, { "id": 50, "index": 22, "char": "2", "width": 42, "height": 62, "xoffset": 2, "yoffset": 4, "xadvance": 45, "chnl": 15, "x": 180, "y": 48, "page": 0 }, { "id": 51, "index": 23, "char": "3", "width": 40, "height": 62, "xoffset": 2, "yoffset": 4, "xadvance": 45, "chnl": 15, "x": 111, "y": 408, "page": 0 }, { "id": 53, "index": 25, "char": "5", "width": 40, "height": 62, "xoffset": 4, "yoffset": 5, "xadvance": 45, "chnl": 15, "x": 152, "y": 341, "page": 0 }, { "id": 54, "index": 26, "char": "6", "width": 40, "height": 62, "xoffset": 3, "yoffset": 5, "xadvance": 45, "chnl": 15, "x": 185, "y": 258, "page": 0 }, { "id": 56, "index": 28, "char": "8", "width": 40, "height": 62, "xoffset": 2, "yoffset": 4, "xadvance": 45, "chnl": 15, "x": 193, "y": 194, "page": 0 }, { "id": 57, "index": 29, "char": "9", "width": 40, "height": 62, "xoffset": 2, "yoffset": 4, "xadvance": 45, "chnl": 15, "x": 207, "y": 111, "page": 0 }, { "id": 63, "index": 35, "char": "?", "width": 36, "height": 62, "xoffset": 1, "yoffset": 4, "xadvance": 38, "chnl": 15, "x": 152, "y": 404, "page": 0 }, { "id": 67, "index": 39, "char": "C", "width": 48, "height": 62, "xoffset": 3, "yoffset": 4, "xadvance": 52, "chnl": 15, "x": 189, "y": 404, "page": 0 }, { "id": 71, "index": 43, "char": "G", "width": 48, "height": 62, "xoffset": 3, "yoffset": 4, "xadvance": 54, "chnl": 15, "x": 193, "y": 321, "page": 0 }, { "id": 74, "index": 46, "char": "J", "width": 40, "height": 62, "xoffset": 0, "yoffset": 5, "xadvance": 44, "chnl": 15, "x": 226, "y": 257, "page": 0 }, { "id": 79, "index": 51, "char": "O", "width": 50, "height": 62, "xoffset": 3, "yoffset": 4, "xadvance": 55, "chnl": 15, "x": 234, "y": 174, "page": 0 }, { "id": 83, "index": 55, "char": "S", "width": 45, "height": 62, "xoffset": 1, "yoffset": 4, "xadvance": 47, "chnl": 15, "x": 223, "y": 0, "page": 0 }, { "id": 85, "index": 57, "char": "U", "width": 45, "height": 62, "xoffset": 3, "yoffset": 5, "xadvance": 52, "chnl": 15, "x": 248, "y": 63, "page": 0 }, { "id": 105, "index": 77, "char": "i", "width": 13, "height": 62, "xoffset": 4, "yoffset": 4, "xadvance": 19, "chnl": 15, "x": 269, "y": 0, "page": 0 }, { "id": 165, "index": 103, "char": "¥", "width": 45, "height": 61, "xoffset": -1, "yoffset": 5, "xadvance": 42, "chnl": 15, "x": 283, "y": 0, "page": 0 }, { "id": 161, "index": 99, "char": "¡", "width": 13, "height": 61, "xoffset": 3, "yoffset": 19, "xadvance": 19, "chnl": 15, "x": 238, "y": 384, "page": 0 }, { "id": 33, "index": 5, "char": "!", "width": 13, "height": 61, "xoffset": 4, "yoffset": 5, "xadvance": 21, "chnl": 15, "x": 242, "y": 320, "page": 0 }, { "id": 35, "index": 7, "char": "#", "width": 48, "height": 61, "xoffset": 3, "yoffset": 5, "xadvance": 49, "chnl": 15, "x": 238, "y": 446, "page": 0 }, { "id": 49, "index": 21, "char": "1", "width": 26, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 45, "chnl": 15, "x": 252, "y": 382, "page": 0 }, { "id": 52, "index": 24, "char": "4", "width": 45, "height": 61, "xoffset": 0, "yoffset": 5, "xadvance": 45, "chnl": 15, "x": 256, "y": 320, "page": 0 }, { "id": 55, "index": 27, "char": "7", "width": 42, "height": 61, "xoffset": 1, "yoffset": 5, "xadvance": 45, "chnl": 15, "x": 279, "y": 382, "page": 0 }, { "id": 65, "index": 37, "char": "A", "width": 54, "height": 61, "xoffset": -1, "yoffset": 5, "xadvance": 52, "chnl": 15, "x": 287, "y": 444, "page": 0 }, { "id": 66, "index": 38, "char": "B", "width": 43, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 50, "chnl": 15, "x": 267, "y": 237, "page": 0 }, { "id": 68, "index": 40, "char": "D", "width": 45, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 52, "chnl": 15, "x": 302, "y": 299, "page": 0 }, { "id": 69, "index": 41, "char": "E", "width": 40, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 45, "chnl": 15, "x": 322, "y": 361, "page": 0 }, { "id": 70, "index": 42, "char": "F", "width": 39, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 44, "chnl": 15, "x": 342, "y": 423, "page": 0 }, { "id": 72, "index": 44, "char": "H", "width": 48, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 57, "chnl": 15, "x": 285, "y": 126, "page": 0 }, { "id": 73, "index": 45, "char": "I", "width": 12, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 22, "chnl": 15, "x": 294, "y": 62, "page": 0 }, { "id": 75, "index": 47, "char": "K", "width": 48, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 50, "chnl": 15, "x": 307, "y": 62, "page": 0 }, { "id": 76, "index": 48, "char": "L", "width": 38, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 43, "chnl": 15, "x": 329, "y": 0, "page": 0 }, { "id": 77, "index": 49, "char": "M", "width": 61, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 70, "chnl": 15, "x": 311, "y": 188, "page": 0 }, { "id": 78, "index": 50, "char": "N", "width": 48, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 57, "chnl": 15, "x": 334, "y": 124, "page": 0 }, { "id": 80, "index": 52, "char": "P", "width": 45, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 50, "chnl": 15, "x": 356, "y": 62, "page": 0 }, { "id": 82, "index": 54, "char": "R", "width": 45, "height": 61, "xoffset": 5, "yoffset": 5, "xadvance": 49, "chnl": 15, "x": 368, "y": 0, "page": 0 }, { "id": 84, "index": 56, "char": "T", "width": 48, "height": 61, "xoffset": 0, "yoffset": 5, "xadvance": 48, "chnl": 15, "x": 348, "y": 250, "page": 0 }, { "id": 86, "index": 58, "char": "V", "width": 53, "height": 61, "xoffset": -1, "yoffset": 5, "xadvance": 51, "chnl": 15, "x": 373, "y": 186, "page": 0 }, { "id": 88, "index": 60, "char": "X", "width": 50, "height": 61, "xoffset": 0, "yoffset": 5, "xadvance": 50, "chnl": 15, "x": 383, "y": 124, "page": 0 }, { "id": 89, "index": 61, "char": "Y", "width": 51, "height": 61, "xoffset": -1, "yoffset": 5, "xadvance": 48, "chnl": 15, "x": 402, "y": 62, "page": 0 }, { "id": 90, "index": 62, "char": "Z", "width": 45, "height": 61, "xoffset": 1, "yoffset": 5, "xadvance": 48, "chnl": 15, "x": 414, "y": 0, "page": 0 }, { "id": 119, "index": 91, "char": "w", "width": 61, "height": 46, "xoffset": 0, "yoffset": 20, "xadvance": 60, "chnl": 15, "x": 348, "y": 312, "page": 0 }, { "id": 59, "index": 31, "char": ";", "width": 16, "height": 58, "xoffset": 0, "yoffset": 19, "xadvance": 17, "chnl": 15, "x": 363, "y": 359, "page": 0 }, { "id": 116, "index": 88, "char": "t", "width": 27, "height": 57, "xoffset": -2, "yoffset": 10, "xadvance": 26, "chnl": 15, "x": 397, "y": 248, "page": 0 }, { "id": 164, "index": 102, "char": "¤", "width": 53, "height": 54, "xoffset": 2, "yoffset": 13, "xadvance": 57, "chnl": 15, "x": 454, "y": 62, "page": 0 }, { "id": 97, "index": 69, "char": "a", "width": 39, "height": 48, "xoffset": 2, "yoffset": 19, "xadvance": 44, "chnl": 15, "x": 460, "y": 0, "page": 0 }, { "id": 99, "index": 71, "char": "c", "width": 40, "height": 48, "xoffset": 2, "yoffset": 19, "xadvance": 42, "chnl": 15, "x": 380, "y": 359, "page": 0 }, { "id": 101, "index": 73, "char": "e", "width": 40, "height": 48, "xoffset": 2, "yoffset": 19, "xadvance": 42, "chnl": 15, "x": 410, "y": 306, "page": 0 }, { "id": 111, "index": 83, "char": "o", "width": 42, "height": 48, "xoffset": 2, "yoffset": 19, "xadvance": 46, "chnl": 15, "x": 425, "y": 248, "page": 0 }, { "id": 115, "index": 87, "char": "s", "width": 38, "height": 48, "xoffset": 2, "yoffset": 19, "xadvance": 41, "chnl": 15, "x": 468, "y": 117, "page": 0 }, { "id": 126, "index": 98, "char": "~", "width": 48, "height": 20, "xoffset": 3, "yoffset": 31, "xadvance": 54, "chnl": 15, "x": 342, "y": 485, "page": 0 }, { "id": 58, "index": 30, "char": ":", "width": 13, "height": 47, "xoffset": 3, "yoffset": 19, "xadvance": 19, "chnl": 15, "x": 193, "y": 0, "page": 0 }, { "id": 110, "index": 82, "char": "n", "width": 37, "height": 47, "xoffset": 3, "yoffset": 19, "xadvance": 44, "chnl": 15, "x": 468, "y": 166, "page": 0 }, { "id": 114, "index": 86, "char": "r", "width": 24, "height": 47, "xoffset": 3, "yoffset": 19, "xadvance": 27, "chnl": 15, "x": 223, "y": 63, "page": 0 }, { "id": 117, "index": 89, "char": "u", "width": 37, "height": 47, "xoffset": 3, "yoffset": 20, "xadvance": 44, "chnl": 15, "x": 427, "y": 186, "page": 0 }, { "id": 118, "index": 90, "char": "v", "width": 40, "height": 46, "xoffset": -1, "yoffset": 20, "xadvance": 39, "chnl": 15, "x": 468, "y": 214, "page": 0 }, { "id": 120, "index": 92, "char": "x", "width": 40, "height": 46, "xoffset": 0, "yoffset": 20, "xadvance": 40, "chnl": 15, "x": 468, "y": 261, "page": 0 }, { "id": 122, "index": 94, "char": "z", "width": 38, "height": 46, "xoffset": 1, "yoffset": 20, "xadvance": 40, "chnl": 15, "x": 451, "y": 308, "page": 0 }, { "id": 43, "index": 15, "char": "+", "width": 43, "height": 45, "xoffset": 1, "yoffset": 15, "xadvance": 45, "chnl": 15, "x": 152, "y": 467, "page": 0 }, { "id": 95, "index": 67, "char": "_", "width": 40, "height": 10, "xoffset": -2, "yoffset": 62, "xadvance": 36, "chnl": 15, "x": 29, "y": 467, "page": 0 }, { "id": 60, "index": 32, "char": "<", "width": 36, "height": 39, "xoffset": 1, "yoffset": 19, "xadvance": 41, "chnl": 15, "x": 248, "y": 126, "page": 0 }, { "id": 62, "index": 34, "char": ">", "width": 37, "height": 39, "xoffset": 3, "yoffset": 19, "xadvance": 42, "chnl": 15, "x": 111, "y": 471, "page": 0 }, { "id": 42, "index": 14, "char": "*", "width": 36, "height": 37, "xoffset": -1, "yoffset": 5, "xadvance": 34, "chnl": 15, "x": 311, "y": 250, "page": 0 }, { "id": 61, "index": 33, "char": "=", "width": 37, "height": 27, "xoffset": 4, "yoffset": 24, "xadvance": 44, "chnl": 15, "x": 70, "y": 474, "page": 0 }, { "id": 171, "index": 109, "char": "«", "width": 34, "height": 35, "xoffset": 2, "yoffset": 25, "xadvance": 38, "chnl": 15, "x": 196, "y": 467, "page": 0 }, { "id": 94, "index": 66, "char": "^", "width": 32, "height": 32, "xoffset": 1, "yoffset": 5, "xadvance": 33, "chnl": 15, "x": 434, "y": 124, "page": 0 }, { "id": 44, "index": 16, "char": ",", "width": 15, "height": 24, "xoffset": -1, "yoffset": 53, "xadvance": 16, "chnl": 15, "x": 207, "y": 0, "page": 0 }, { "id": 34, "index": 6, "char": "\"", "width": 20, "height": 23, "xoffset": 3, "yoffset": 2, "xadvance": 26, "chnl": 15, "x": 490, "y": 308, "page": 0 }, { "id": 39, "index": 11, "char": "'", "width": 10, "height": 23, "xoffset": 2, "yoffset": 2, "xadvance": 14, "chnl": 15, "x": 26, "y": 151, "page": 0 }, { "id": 45, "index": 17, "char": "-", "width": 23, "height": 10, "xoffset": -1, "yoffset": 35, "xadvance": 22, "chnl": 15, "x": 311, "y": 288, "page": 0 }, { "id": 96, "index": 68, "char": "`", "width": 20, "height": 15, "xoffset": 0, "yoffset": 2, "xadvance": 25, "chnl": 15, "x": 490, "y": 332, "page": 0 }, { "id": 46, "index": 18, "char": ".", "width": 13, "height": 13, "xoffset": 4, "yoffset": 54, "xadvance": 21, "chnl": 15, "x": 427, "y": 234, "page": 0 }, { "id": 32, "index": 4, "char": " ", "width": 0, "height": 0, "xoffset": -2, "yoffset": 62, "xadvance": 20, "chnl": 15, "x": 124, "y": 131, "page": 0 } ], "info": { "face": "Roboto-Regular", "size": 80, "bold": 0, "italic": 0, "charset": [ "«", "¢", "£", "¤", "¥", "¡", "!", "\\", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", " " ], "unicode": 1, "stretchH": 100, "smooth": 1, "aa": 1, "padding": [ 2, 2, 2, 2 ], "spacing": [ 0, 0 ] }, "common": { "lineHeight": 84, "base": 62, "scaleW": 512, "scaleH": 512, "pages": 1, "packed": 0, "alphaChnl": 0, "redChnl": 0, "greenChnl": 0, "blueChnl": 0 }, "distanceField": { "fieldType": "msdf", "distanceRange": 4 }, "kernings": [ { "first": 34, "second": 34, "amount": -4 }, { "first": 34, "second": 39, "amount": -4 }, { "first": 34, "second": 65, "amount": -5 }, { "first": 34, "second": 97, "amount": -2 }, { "first": 34, "second": 99, "amount": -2 }, { "first": 34, "second": 100, "amount": -2 }, { "first": 34, "second": 101, "amount": -2 }, { "first": 34, "second": 103, "amount": -2 }, { "first": 34, "second": 109, "amount": -1 }, { "first": 34, "second": 110, "amount": -1 }, { "first": 34, "second": 111, "amount": -2 }, { "first": 34, "second": 112, "amount": -1 }, { "first": 34, "second": 113, "amount": -2 }, { "first": 34, "second": 115, "amount": -3 }, { "first": 34, "second": 119, "amount": 0 }, { "first": 39, "second": 34, "amount": -4 }, { "first": 39, "second": 39, "amount": -4 }, { "first": 39, "second": 65, "amount": -5 }, { "first": 39, "second": 97, "amount": -2 }, { "first": 39, "second": 99, "amount": -2 }, { "first": 39, "second": 100, "amount": -2 }, { "first": 39, "second": 101, "amount": -2 }, { "first": 39, "second": 103, "amount": -2 }, { "first": 39, "second": 109, "amount": -1 }, { "first": 39, "second": 110, "amount": -1 }, { "first": 39, "second": 111, "amount": -2 }, { "first": 39, "second": 112, "amount": -1 }, { "first": 39, "second": 113, "amount": -2 }, { "first": 39, "second": 115, "amount": -3 }, { "first": 39, "second": 119, "amount": 0 }, { "first": 40, "second": 86, "amount": 1 }, { "first": 40, "second": 87, "amount": 1 }, { "first": 40, "second": 89, "amount": 1 }, { "first": 44, "second": 34, "amount": -7 }, { "first": 44, "second": 39, "amount": -7 }, { "first": 46, "second": 34, "amount": -7 }, { "first": 46, "second": 39, "amount": -7 }, { "first": 47, "second": 47, "amount": -9 }, { "first": 65, "second": 34, "amount": -5 }, { "first": 65, "second": 39, "amount": -5 }, { "first": 65, "second": 63, "amount": -2 }, { "first": 65, "second": 67, "amount": 0 }, { "first": 65, "second": 71, "amount": 0 }, { "first": 65, "second": 79, "amount": 0 }, { "first": 65, "second": 81, "amount": 0 }, { "first": 65, "second": 84, "amount": -5 }, { "first": 65, "second": 85, "amount": -1 }, { "first": 65, "second": 86, "amount": -3 }, { "first": 65, "second": 87, "amount": -3 }, { "first": 65, "second": 89, "amount": -4 }, { "first": 65, "second": 111, "amount": 0 }, { "first": 65, "second": 116, "amount": -1 }, { "first": 65, "second": 117, "amount": 0 }, { "first": 65, "second": 118, "amount": -2 }, { "first": 65, "second": 119, "amount": -1 }, { "first": 65, "second": 121, "amount": -2 }, { "first": 65, "second": 122, "amount": 0 }, { "first": 66, "second": 84, "amount": -1 }, { "first": 66, "second": 86, "amount": -1 }, { "first": 66, "second": 89, "amount": -2 }, { "first": 67, "second": 41, "amount": -1 }, { "first": 67, "second": 84, "amount": -1 }, { "first": 67, "second": 93, "amount": 0 }, { "first": 67, "second": 125, "amount": -1 }, { "first": 68, "second": 44, "amount": -4 }, { "first": 68, "second": 46, "amount": -4 }, { "first": 68, "second": 65, "amount": -1 }, { "first": 68, "second": 84, "amount": -1 }, { "first": 68, "second": 86, "amount": -1 }, { "first": 68, "second": 88, "amount": -1 }, { "first": 68, "second": 89, "amount": -2 }, { "first": 68, "second": 90, "amount": -1 }, { "first": 69, "second": 84, "amount": 1 }, { "first": 69, "second": 99, "amount": -1 }, { "first": 69, "second": 100, "amount": -1 }, { "first": 69, "second": 101, "amount": -1 }, { "first": 69, "second": 102, "amount": -1 }, { "first": 69, "second": 103, "amount": -1 }, { "first": 69, "second": 111, "amount": -1 }, { "first": 69, "second": 113, "amount": -1 }, { "first": 69, "second": 117, "amount": -1 }, { "first": 69, "second": 118, "amount": -1 }, { "first": 69, "second": 119, "amount": -1 }, { "first": 69, "second": 121, "amount": -1 }, { "first": 70, "second": 44, "amount": -9 }, { "first": 70, "second": 46, "amount": -9 }, { "first": 70, "second": 65, "amount": -7 }, { "first": 70, "second": 74, "amount": -10 }, { "first": 70, "second": 84, "amount": 1 }, { "first": 70, "second": 97, "amount": -1 }, { "first": 70, "second": 99, "amount": -1 }, { "first": 70, "second": 100, "amount": -1 }, { "first": 70, "second": 101, "amount": -1 }, { "first": 70, "second": 103, "amount": -1 }, { "first": 70, "second": 111, "amount": -1 }, { "first": 70, "second": 113, "amount": -1 }, { "first": 70, "second": 114, "amount": -1 }, { "first": 70, "second": 117, "amount": -1 }, { "first": 70, "second": 118, "amount": -1 }, { "first": 70, "second": 121, "amount": -1 }, { "first": 72, "second": 65, "amount": 1 }, { "first": 72, "second": 84, "amount": -1 }, { "first": 72, "second": 88, "amount": 1 }, { "first": 72, "second": 89, "amount": -1 }, { "first": 73, "second": 65, "amount": 1 }, { "first": 73, "second": 84, "amount": -1 }, { "first": 73, "second": 88, "amount": 1 }, { "first": 73, "second": 89, "amount": -1 }, { "first": 74, "second": 65, "amount": -1 }, { "first": 75, "second": 45, "amount": -2 }, { "first": 75, "second": 67, "amount": -1 }, { "first": 75, "second": 71, "amount": -1 }, { "first": 75, "second": 79, "amount": -1 }, { "first": 75, "second": 81, "amount": -1 }, { "first": 75, "second": 99, "amount": -1 }, { "first": 75, "second": 100, "amount": -1 }, { "first": 75, "second": 101, "amount": -1 }, { "first": 75, "second": 103, "amount": -1 }, { "first": 75, "second": 109, "amount": -1 }, { "first": 75, "second": 110, "amount": -1 }, { "first": 75, "second": 111, "amount": -1 }, { "first": 75, "second": 112, "amount": -1 }, { "first": 75, "second": 113, "amount": -1 }, { "first": 75, "second": 117, "amount": -1 }, { "first": 75, "second": 118, "amount": -2 }, { "first": 75, "second": 119, "amount": -2 }, { "first": 75, "second": 121, "amount": -2 }, { "first": 76, "second": 34, "amount": -13 }, { "first": 76, "second": 39, "amount": -13 }, { "first": 76, "second": 65, "amount": 1 }, { "first": 76, "second": 67, "amount": -3 }, { "first": 76, "second": 71, "amount": -3 }, { "first": 76, "second": 79, "amount": -3 }, { "first": 76, "second": 81, "amount": -3 }, { "first": 76, "second": 84, "amount": -11 }, { "first": 76, "second": 85, "amount": -2 }, { "first": 76, "second": 86, "amount": -7 }, { "first": 76, "second": 87, "amount": -6 }, { "first": 76, "second": 89, "amount": -9 }, { "first": 76, "second": 117, "amount": -2 }, { "first": 76, "second": 118, "amount": -5 }, { "first": 76, "second": 119, "amount": -4 }, { "first": 76, "second": 121, "amount": -5 }, { "first": 77, "second": 65, "amount": 1 }, { "first": 77, "second": 84, "amount": -1 }, { "first": 77, "second": 88, "amount": 1 }, { "first": 77, "second": 89, "amount": -1 }, { "first": 78, "second": 65, "amount": 1 }, { "first": 78, "second": 84, "amount": -1 }, { "first": 78, "second": 88, "amount": 1 }, { "first": 78, "second": 89, "amount": -1 }, { "first": 79, "second": 44, "amount": -4 }, { "first": 79, "second": 46, "amount": -4 }, { "first": 79, "second": 65, "amount": -1 }, { "first": 79, "second": 84, "amount": -1 }, { "first": 79, "second": 86, "amount": -1 }, { "first": 79, "second": 88, "amount": -1 }, { "first": 79, "second": 89, "amount": -2 }, { "first": 79, "second": 90, "amount": -1 }, { "first": 80, "second": 44, "amount": -13 }, { "first": 80, "second": 46, "amount": -13 }, { "first": 80, "second": 65, "amount": -5 }, { "first": 80, "second": 74, "amount": -8 }, { "first": 80, "second": 88, "amount": -1 }, { "first": 80, "second": 90, "amount": -1 }, { "first": 80, "second": 97, "amount": 0 }, { "first": 80, "second": 99, "amount": -1 }, { "first": 80, "second": 100, "amount": -1 }, { "first": 80, "second": 101, "amount": -1 }, { "first": 80, "second": 103, "amount": -1 }, { "first": 80, "second": 111, "amount": -1 }, { "first": 80, "second": 113, "amount": -1 }, { "first": 80, "second": 116, "amount": 1 }, { "first": 80, "second": 118, "amount": 1 }, { "first": 80, "second": 121, "amount": 1 }, { "first": 81, "second": 84, "amount": -2 }, { "first": 81, "second": 86, "amount": -1 }, { "first": 81, "second": 87, "amount": -1 }, { "first": 81, "second": 89, "amount": -1 }, { "first": 82, "second": 84, "amount": -3 }, { "first": 82, "second": 86, "amount": -1 }, { "first": 82, "second": 89, "amount": -2 }, { "first": 84, "second": 171, "amount": -13 }, { "first": 84, "second": 44, "amount": -9 }, { "first": 84, "second": 45, "amount": -9 }, { "first": 84, "second": 46, "amount": -9 }, { "first": 84, "second": 65, "amount": -3 }, { "first": 84, "second": 67, "amount": -1 }, { "first": 84, "second": 71, "amount": -1 }, { "first": 84, "second": 74, "amount": -9 }, { "first": 84, "second": 79, "amount": -1 }, { "first": 84, "second": 81, "amount": -1 }, { "first": 84, "second": 83, "amount": -1 }, { "first": 84, "second": 84, "amount": 1 }, { "first": 84, "second": 86, "amount": 1 }, { "first": 84, "second": 87, "amount": 1 }, { "first": 84, "second": 89, "amount": 1 }, { "first": 84, "second": 97, "amount": -4 }, { "first": 84, "second": 99, "amount": -4 }, { "first": 84, "second": 100, "amount": -4 }, { "first": 84, "second": 101, "amount": -4 }, { "first": 84, "second": 103, "amount": -4 }, { "first": 84, "second": 109, "amount": -4 }, { "first": 84, "second": 110, "amount": -4 }, { "first": 84, "second": 111, "amount": -4 }, { "first": 84, "second": 112, "amount": -4 }, { "first": 84, "second": 113, "amount": -4 }, { "first": 84, "second": 114, "amount": -3 }, { "first": 84, "second": 115, "amount": -5 }, { "first": 84, "second": 117, "amount": -4 }, { "first": 84, "second": 118, "amount": -3 }, { "first": 84, "second": 119, "amount": -2 }, { "first": 84, "second": 120, "amount": -3 }, { "first": 84, "second": 121, "amount": -3 }, { "first": 84, "second": 122, "amount": -2 }, { "first": 84, "second": 32, "amount": -2 }, { "first": 85, "second": 65, "amount": -1 }, { "first": 86, "second": 41, "amount": 1 }, { "first": 86, "second": 44, "amount": -9 }, { "first": 86, "second": 45, "amount": -1 }, { "first": 86, "second": 46, "amount": -9 }, { "first": 86, "second": 65, "amount": -3 }, { "first": 86, "second": 67, "amount": -1 }, { "first": 86, "second": 71, "amount": -1 }, { "first": 86, "second": 79, "amount": -1 }, { "first": 86, "second": 81, "amount": -1 }, { "first": 86, "second": 93, "amount": 1 }, { "first": 86, "second": 97, "amount": -2 }, { "first": 86, "second": 99, "amount": -2 }, { "first": 86, "second": 100, "amount": -2 }, { "first": 86, "second": 101, "amount": -2 }, { "first": 86, "second": 103, "amount": -2 }, { "first": 86, "second": 111, "amount": -2 }, { "first": 86, "second": 113, "amount": -2 }, { "first": 86, "second": 114, "amount": -1 }, { "first": 86, "second": 117, "amount": -1 }, { "first": 86, "second": 118, "amount": 0 }, { "first": 86, "second": 121, "amount": 0 }, { "first": 86, "second": 125, "amount": 1 }, { "first": 87, "second": 41, "amount": 1 }, { "first": 87, "second": 44, "amount": -5 }, { "first": 87, "second": 45, "amount": -2 }, { "first": 87, "second": 46, "amount": -5 }, { "first": 87, "second": 65, "amount": -2 }, { "first": 87, "second": 84, "amount": 1 }, { "first": 87, "second": 93, "amount": 0 }, { "first": 87, "second": 97, "amount": -1 }, { "first": 87, "second": 99, "amount": -1 }, { "first": 87, "second": 100, "amount": -1 }, { "first": 87, "second": 101, "amount": -1 }, { "first": 87, "second": 103, "amount": -1 }, { "first": 87, "second": 111, "amount": -1 }, { "first": 87, "second": 113, "amount": -1 }, { "first": 87, "second": 114, "amount": -1 }, { "first": 87, "second": 117, "amount": -1 }, { "first": 87, "second": 125, "amount": 1 }, { "first": 88, "second": 45, "amount": -2 }, { "first": 88, "second": 67, "amount": -1 }, { "first": 88, "second": 71, "amount": -1 }, { "first": 88, "second": 79, "amount": -1 }, { "first": 88, "second": 81, "amount": -1 }, { "first": 88, "second": 86, "amount": 1 }, { "first": 88, "second": 99, "amount": -1 }, { "first": 88, "second": 100, "amount": -1 }, { "first": 88, "second": 101, "amount": -1 }, { "first": 88, "second": 103, "amount": -1 }, { "first": 88, "second": 111, "amount": -1 }, { "first": 88, "second": 113, "amount": -1 }, { "first": 88, "second": 117, "amount": -1 }, { "first": 88, "second": 118, "amount": -1 }, { "first": 88, "second": 121, "amount": -1 }, { "first": 89, "second": 171, "amount": -3 }, { "first": 89, "second": 38, "amount": -1 }, { "first": 89, "second": 41, "amount": 1 }, { "first": 89, "second": 42, "amount": -2 }, { "first": 89, "second": 44, "amount": -8 }, { "first": 89, "second": 45, "amount": -2 }, { "first": 89, "second": 46, "amount": -8 }, { "first": 89, "second": 65, "amount": -4 }, { "first": 89, "second": 67, "amount": -1 }, { "first": 89, "second": 71, "amount": -1 }, { "first": 89, "second": 74, "amount": -4 }, { "first": 89, "second": 79, "amount": -1 }, { "first": 89, "second": 81, "amount": -1 }, { "first": 89, "second": 83, "amount": -1 }, { "first": 89, "second": 84, "amount": 1 }, { "first": 89, "second": 85, "amount": -4 }, { "first": 89, "second": 86, "amount": 1 }, { "first": 89, "second": 87, "amount": 1 }, { "first": 89, "second": 88, "amount": 1 }, { "first": 89, "second": 89, "amount": 1 }, { "first": 89, "second": 93, "amount": 1 }, { "first": 89, "second": 97, "amount": -3 }, { "first": 89, "second": 99, "amount": -3 }, { "first": 89, "second": 100, "amount": -3 }, { "first": 89, "second": 101, "amount": -3 }, { "first": 89, "second": 102, "amount": -1 }, { "first": 89, "second": 103, "amount": -3 }, { "first": 89, "second": 109, "amount": -2 }, { "first": 89, "second": 110, "amount": -2 }, { "first": 89, "second": 111, "amount": -3 }, { "first": 89, "second": 112, "amount": -2 }, { "first": 89, "second": 113, "amount": -3 }, { "first": 89, "second": 114, "amount": -2 }, { "first": 89, "second": 115, "amount": -2 }, { "first": 89, "second": 116, "amount": -1 }, { "first": 89, "second": 117, "amount": -2 }, { "first": 89, "second": 118, "amount": -1 }, { "first": 89, "second": 120, "amount": -1 }, { "first": 89, "second": 121, "amount": -1 }, { "first": 89, "second": 122, "amount": -1 }, { "first": 89, "second": 125, "amount": 1 }, { "first": 90, "second": 65, "amount": 1 }, { "first": 90, "second": 67, "amount": -1 }, { "first": 90, "second": 71, "amount": -1 }, { "first": 90, "second": 79, "amount": -1 }, { "first": 90, "second": 81, "amount": -1 }, { "first": 90, "second": 99, "amount": -1 }, { "first": 90, "second": 100, "amount": -1 }, { "first": 90, "second": 101, "amount": -1 }, { "first": 90, "second": 103, "amount": -1 }, { "first": 90, "second": 111, "amount": -1 }, { "first": 90, "second": 113, "amount": -1 }, { "first": 90, "second": 117, "amount": -1 }, { "first": 90, "second": 118, "amount": -1 }, { "first": 90, "second": 119, "amount": -1 }, { "first": 90, "second": 121, "amount": -1 }, { "first": 91, "second": 74, "amount": -1 }, { "first": 91, "second": 85, "amount": -1 }, { "first": 97, "second": 34, "amount": -3 }, { "first": 97, "second": 39, "amount": -3 }, { "first": 97, "second": 118, "amount": -1 }, { "first": 97, "second": 121, "amount": -1 }, { "first": 98, "second": 34, "amount": -1 }, { "first": 98, "second": 39, "amount": -1 }, { "first": 98, "second": 118, "amount": 0 }, { "first": 98, "second": 120, "amount": -1 }, { "first": 98, "second": 121, "amount": 0 }, { "first": 98, "second": 122, "amount": -1 }, { "first": 99, "second": 34, "amount": 0 }, { "first": 99, "second": 39, "amount": 0 }, { "first": 101, "second": 34, "amount": -1 }, { "first": 101, "second": 39, "amount": -1 }, { "first": 101, "second": 118, "amount": -1 }, { "first": 101, "second": 121, "amount": -1 }, { "first": 102, "second": 34, "amount": 1 }, { "first": 102, "second": 39, "amount": 1 }, { "first": 102, "second": 41, "amount": 1 }, { "first": 102, "second": 93, "amount": 1 }, { "first": 102, "second": 99, "amount": -1 }, { "first": 102, "second": 100, "amount": -1 }, { "first": 102, "second": 101, "amount": -1 }, { "first": 102, "second": 103, "amount": -1 }, { "first": 102, "second": 113, "amount": -1 }, { "first": 102, "second": 125, "amount": 1 }, { "first": 104, "second": 34, "amount": -4 }, { "first": 104, "second": 39, "amount": -4 }, { "first": 107, "second": 99, "amount": -1 }, { "first": 107, "second": 100, "amount": -1 }, { "first": 107, "second": 101, "amount": -1 }, { "first": 107, "second": 103, "amount": -1 }, { "first": 107, "second": 113, "amount": -1 }, { "first": 109, "second": 34, "amount": -4 }, { "first": 109, "second": 39, "amount": -4 }, { "first": 110, "second": 34, "amount": -4 }, { "first": 110, "second": 39, "amount": -4 }, { "first": 111, "second": 34, "amount": -5 }, { "first": 111, "second": 39, "amount": -5 }, { "first": 111, "second": 118, "amount": -1 }, { "first": 111, "second": 120, "amount": -1 }, { "first": 111, "second": 121, "amount": -1 }, { "first": 111, "second": 122, "amount": -1 }, { "first": 112, "second": 34, "amount": -1 }, { "first": 112, "second": 39, "amount": -1 }, { "first": 112, "second": 118, "amount": 0 }, { "first": 112, "second": 120, "amount": -1 }, { "first": 112, "second": 121, "amount": 0 }, { "first": 112, "second": 122, "amount": -1 }, { "first": 114, "second": 34, "amount": 1 }, { "first": 114, "second": 39, "amount": 1 }, { "first": 114, "second": 44, "amount": -5 }, { "first": 114, "second": 46, "amount": -5 }, { "first": 114, "second": 97, "amount": -2 }, { "first": 114, "second": 99, "amount": -1 }, { "first": 114, "second": 100, "amount": -1 }, { "first": 114, "second": 101, "amount": -1 }, { "first": 114, "second": 102, "amount": 1 }, { "first": 114, "second": 103, "amount": -1 }, { "first": 114, "second": 111, "amount": -1 }, { "first": 114, "second": 113, "amount": -1 }, { "first": 114, "second": 116, "amount": 2 }, { "first": 114, "second": 118, "amount": 1 }, { "first": 114, "second": 119, "amount": 1 }, { "first": 114, "second": 121, "amount": 1 }, { "first": 116, "second": 111, "amount": -1 }, { "first": 118, "second": 34, "amount": 1 }, { "first": 118, "second": 39, "amount": 1 }, { "first": 118, "second": 44, "amount": -4 }, { "first": 118, "second": 46, "amount": -4 }, { "first": 118, "second": 97, "amount": -1 }, { "first": 118, "second": 99, "amount": -1 }, { "first": 118, "second": 100, "amount": -1 }, { "first": 118, "second": 101, "amount": -1 }, { "first": 118, "second": 102, "amount": 1 }, { "first": 118, "second": 103, "amount": -1 }, { "first": 118, "second": 111, "amount": -1 }, { "first": 118, "second": 113, "amount": -1 }, { "first": 119, "second": 44, "amount": -5 }, { "first": 119, "second": 46, "amount": -5 }, { "first": 120, "second": 99, "amount": -1 }, { "first": 120, "second": 100, "amount": -1 }, { "first": 120, "second": 101, "amount": -1 }, { "first": 120, "second": 103, "amount": -1 }, { "first": 120, "second": 111, "amount": -1 }, { "first": 120, "second": 113, "amount": -1 }, { "first": 121, "second": 34, "amount": 1 }, { "first": 121, "second": 39, "amount": 1 }, { "first": 121, "second": 44, "amount": -4 }, { "first": 121, "second": 46, "amount": -4 }, { "first": 121, "second": 97, "amount": -1 }, { "first": 121, "second": 99, "amount": -1 }, { "first": 121, "second": 100, "amount": -1 }, { "first": 121, "second": 101, "amount": -1 }, { "first": 121, "second": 102, "amount": 1 }, { "first": 121, "second": 103, "amount": -1 }, { "first": 121, "second": 111, "amount": -1 }, { "first": 121, "second": 113, "amount": -1 }, { "first": 122, "second": 99, "amount": -1 }, { "first": 122, "second": 100, "amount": -1 }, { "first": 122, "second": 101, "amount": -1 }, { "first": 122, "second": 103, "amount": -1 }, { "first": 122, "second": 111, "amount": -1 }, { "first": 122, "second": 113, "amount": -1 }, { "first": 123, "second": 74, "amount": -1 }, { "first": 123, "second": 85, "amount": -1 }, { "first": 32, "second": 84, "amount": -2 } ] } ================================================ FILE: examples/resources/fonts/typeface/LICENSE ================================================ Copyright @ 2004 by MAGENTA Ltd. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word "MgOpen", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator. This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "MgOpen" name. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. ================================================ FILE: examples/resources/fonts/typeface/README.md ================================================ ## MgOpen typefaces # Source and License https://web.archive.org/web/20050528114140/https://ellak.gr/fonts/mgopen/index.en # Usage Use Facetype.js to generate typeface.json fonts: https://gero3.github.io/facetype.js/ Collection of Google fonts as typeface data: https://github.com/components-ai/typefaces ================================================ FILE: examples/resources/fonts/typeface/helvetiker_bold.typeface.json ================================================ {"glyphs":{"ο":{"x_min":0,"x_max":764,"ha":863,"o":"m 380 -25 q 105 87 211 -25 q 0 372 0 200 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 372 764 544 q 658 87 764 200 q 380 -25 552 -25 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 218 204 283 q 379 142 294 142 "},"S":{"x_min":0,"x_max":826,"ha":915,"o":"m 826 306 q 701 55 826 148 q 423 -29 587 -29 q 138 60 255 -29 q 0 318 13 154 l 208 318 q 288 192 216 238 q 437 152 352 152 q 559 181 506 152 q 623 282 623 217 q 466 411 623 372 q 176 487 197 478 q 18 719 18 557 q 136 958 18 869 q 399 1040 244 1040 q 670 956 561 1040 q 791 713 791 864 l 591 713 q 526 826 583 786 q 393 866 469 866 q 277 838 326 866 q 218 742 218 804 q 374 617 218 655 q 667 542 646 552 q 826 306 826 471 "},"¦":{"x_min":0,"x_max":143,"ha":240,"o":"m 143 462 l 0 462 l 0 984 l 143 984 l 143 462 m 143 -242 l 0 -242 l 0 280 l 143 280 l 143 -242 "},"/":{"x_min":196.109375,"x_max":632.5625,"ha":828,"o":"m 632 1040 l 289 -128 l 196 -128 l 538 1040 l 632 1040 "},"Τ":{"x_min":-0.609375,"x_max":808,"ha":878,"o":"m 808 831 l 508 831 l 508 0 l 298 0 l 298 831 l 0 831 l 0 1013 l 808 1013 l 808 831 "},"y":{"x_min":0,"x_max":738.890625,"ha":828,"o":"m 738 749 l 444 -107 q 361 -238 413 -199 q 213 -277 308 -277 q 156 -275 176 -277 q 120 -271 131 -271 l 120 -110 q 147 -113 134 -111 q 179 -116 161 -116 q 247 -91 226 -116 q 269 -17 269 -67 q 206 173 269 -4 q 84 515 162 301 q 0 749 41 632 l 218 749 l 376 207 l 529 749 l 738 749 "},"Π":{"x_min":0,"x_max":809,"ha":922,"o":"m 809 0 l 598 0 l 598 836 l 208 836 l 208 0 l 0 0 l 0 1012 l 809 1012 l 809 0 "},"ΐ":{"x_min":-162,"x_max":364,"ha":364,"o":"m 364 810 l 235 810 l 235 952 l 364 952 l 364 810 m 301 1064 l 86 810 l -12 810 l 123 1064 l 301 1064 m -33 810 l -162 810 l -162 952 l -33 952 l -33 810 m 200 0 l 0 0 l 0 748 l 200 748 l 200 0 "},"g":{"x_min":0,"x_max":724,"ha":839,"o":"m 724 48 q 637 -223 724 -142 q 357 -304 551 -304 q 140 -253 226 -304 q 23 -72 36 -192 l 243 -72 q 290 -127 255 -110 q 368 -144 324 -144 q 504 -82 470 -144 q 530 71 530 -38 l 530 105 q 441 25 496 51 q 319 0 386 0 q 79 115 166 0 q 0 377 0 219 q 77 647 0 534 q 317 775 166 775 q 534 656 456 775 l 534 748 l 724 748 l 724 48 m 368 167 q 492 237 447 167 q 530 382 530 297 q 490 529 530 466 q 364 603 444 603 q 240 532 284 603 q 201 386 201 471 q 240 239 201 300 q 368 167 286 167 "},"²":{"x_min":0,"x_max":463,"ha":560,"o":"m 463 791 q 365 627 463 706 q 151 483 258 555 l 455 483 l 455 382 l 0 382 q 84 565 0 488 q 244 672 97 576 q 331 784 331 727 q 299 850 331 824 q 228 876 268 876 q 159 848 187 876 q 132 762 132 820 l 10 762 q 78 924 10 866 q 228 976 137 976 q 392 925 322 976 q 463 791 463 874 "},"–":{"x_min":0,"x_max":704.171875,"ha":801,"o":"m 704 297 l 0 297 l 0 450 l 704 450 l 704 297 "},"Κ":{"x_min":0,"x_max":899.671875,"ha":969,"o":"m 899 0 l 646 0 l 316 462 l 208 355 l 208 0 l 0 0 l 0 1013 l 208 1013 l 208 596 l 603 1013 l 863 1013 l 460 603 l 899 0 "},"ƒ":{"x_min":-46,"x_max":440,"ha":525,"o":"m 440 609 l 316 609 l 149 -277 l -46 -277 l 121 609 l 14 609 l 14 749 l 121 749 q 159 949 121 894 q 344 1019 208 1019 l 440 1015 l 440 855 l 377 855 q 326 841 338 855 q 314 797 314 827 q 314 773 314 786 q 314 749 314 761 l 440 749 l 440 609 "},"e":{"x_min":0,"x_max":708,"ha":808,"o":"m 708 321 l 207 321 q 254 186 207 236 q 362 141 298 141 q 501 227 453 141 l 700 227 q 566 36 662 104 q 362 -26 477 -26 q 112 72 213 -26 q 0 369 0 182 q 95 683 0 573 q 358 793 191 793 q 619 677 531 793 q 708 321 708 561 m 501 453 q 460 571 501 531 q 353 612 420 612 q 247 570 287 612 q 207 453 207 529 l 501 453 "},"ό":{"x_min":0,"x_max":764,"ha":863,"o":"m 380 -25 q 105 87 211 -25 q 0 372 0 200 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 372 764 544 q 658 87 764 200 q 380 -25 552 -25 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 218 204 283 q 379 142 294 142 m 593 1039 l 391 823 l 293 823 l 415 1039 l 593 1039 "},"J":{"x_min":0,"x_max":649,"ha":760,"o":"m 649 294 q 573 48 649 125 q 327 -29 497 -29 q 61 82 136 -29 q 0 375 0 173 l 200 375 l 199 309 q 219 194 199 230 q 321 145 249 145 q 418 193 390 145 q 441 307 441 232 l 441 1013 l 649 1013 l 649 294 "},"»":{"x_min":-0.234375,"x_max":526,"ha":624,"o":"m 526 286 l 297 87 l 296 250 l 437 373 l 297 495 l 297 660 l 526 461 l 526 286 m 229 286 l 0 87 l 0 250 l 140 373 l 0 495 l 0 660 l 229 461 l 229 286 "},"©":{"x_min":3,"x_max":1007,"ha":1104,"o":"m 507 -6 q 129 153 269 -6 q 3 506 3 298 q 127 857 3 713 q 502 1017 266 1017 q 880 855 740 1017 q 1007 502 1007 711 q 882 152 1007 295 q 507 -6 743 -6 m 502 934 q 184 800 302 934 q 79 505 79 680 q 184 210 79 331 q 501 76 302 76 q 819 210 701 76 q 925 507 925 331 q 820 800 925 682 q 502 934 704 934 m 758 410 q 676 255 748 313 q 506 197 605 197 q 298 291 374 197 q 229 499 229 377 q 297 713 229 624 q 494 811 372 811 q 666 760 593 811 q 752 616 739 710 l 621 616 q 587 688 621 658 q 509 719 554 719 q 404 658 441 719 q 368 511 368 598 q 403 362 368 427 q 498 298 438 298 q 624 410 606 298 l 758 410 "},"ώ":{"x_min":0,"x_max":945,"ha":1051,"o":"m 566 528 l 372 528 l 372 323 q 372 298 372 311 q 373 271 372 285 q 360 183 373 211 q 292 142 342 142 q 219 222 243 142 q 203 365 203 279 q 241 565 203 461 q 334 748 273 650 l 130 748 q 36 552 68 650 q 0 337 0 444 q 69 96 0 204 q 276 -29 149 -29 q 390 0 337 -29 q 470 78 444 28 q 551 0 495 30 q 668 -29 608 -29 q 874 96 793 -29 q 945 337 945 205 q 910 547 945 444 q 814 748 876 650 l 610 748 q 703 565 671 650 q 742 365 742 462 q 718 189 742 237 q 651 142 694 142 q 577 190 597 142 q 565 289 565 221 l 565 323 l 566 528 m 718 1039 l 516 823 l 417 823 l 540 1039 l 718 1039 "},"^":{"x_min":197.21875,"x_max":630.5625,"ha":828,"o":"m 630 836 l 536 836 l 413 987 l 294 836 l 197 836 l 331 1090 l 493 1090 l 630 836 "},"«":{"x_min":0,"x_max":526.546875,"ha":624,"o":"m 526 87 l 297 286 l 297 461 l 526 660 l 526 495 l 385 373 l 526 250 l 526 87 m 229 87 l 0 286 l 0 461 l 229 660 l 229 495 l 88 373 l 229 250 l 229 87 "},"D":{"x_min":0,"x_max":864,"ha":968,"o":"m 400 1013 q 736 874 608 1013 q 864 523 864 735 q 717 146 864 293 q 340 0 570 0 l 0 0 l 0 1013 l 400 1013 m 398 837 l 206 837 l 206 182 l 372 182 q 584 276 507 182 q 657 504 657 365 q 594 727 657 632 q 398 837 522 837 "},"∙":{"x_min":0,"x_max":207,"ha":304,"o":"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 "},"ÿ":{"x_min":0,"x_max":47,"ha":125,"o":"m 47 3 q 37 -7 47 -7 q 28 0 30 -7 q 39 -4 32 -4 q 45 3 45 -1 l 37 0 q 28 9 28 0 q 39 19 28 19 l 47 16 l 47 19 l 47 3 m 37 1 q 44 8 44 1 q 37 16 44 16 q 30 8 30 16 q 37 1 30 1 m 26 1 l 23 22 l 14 0 l 3 22 l 3 3 l 0 25 l 13 1 l 22 25 l 26 1 "},"w":{"x_min":0,"x_max":1056.953125,"ha":1150,"o":"m 1056 749 l 848 0 l 647 0 l 527 536 l 412 0 l 211 0 l 0 749 l 202 749 l 325 226 l 429 748 l 633 748 l 740 229 l 864 749 l 1056 749 "},"$":{"x_min":0,"x_max":704,"ha":800,"o":"m 682 693 l 495 693 q 468 782 491 749 q 391 831 441 824 l 391 579 q 633 462 562 534 q 704 259 704 389 q 616 57 704 136 q 391 -22 528 -22 l 391 -156 l 308 -156 l 308 -22 q 76 69 152 -7 q 0 300 0 147 l 183 300 q 215 191 190 230 q 308 128 245 143 l 308 414 q 84 505 157 432 q 12 700 12 578 q 89 902 12 824 q 308 981 166 981 l 308 1069 l 391 1069 l 391 981 q 595 905 521 981 q 682 693 670 829 m 308 599 l 308 831 q 228 796 256 831 q 200 712 200 762 q 225 642 200 668 q 308 599 251 617 m 391 128 q 476 174 449 140 q 504 258 504 207 q 391 388 504 354 l 391 128 "},"\\":{"x_min":-0.03125,"x_max":434.765625,"ha":532,"o":"m 434 -128 l 341 -128 l 0 1039 l 91 1040 l 434 -128 "},"µ":{"x_min":0,"x_max":647,"ha":754,"o":"m 647 0 l 478 0 l 478 68 q 412 9 448 30 q 330 -11 375 -11 q 261 3 296 -11 q 199 43 226 18 l 199 -277 l 0 -277 l 0 749 l 199 749 l 199 358 q 216 221 199 267 q 322 151 244 151 q 435 240 410 151 q 448 401 448 283 l 448 749 l 647 749 l 647 0 "},"Ι":{"x_min":42,"x_max":250,"ha":413,"o":"m 250 0 l 42 0 l 42 1013 l 250 1013 l 250 0 "},"Ύ":{"x_min":0,"x_max":1211.15625,"ha":1289,"o":"m 1211 1012 l 907 376 l 907 0 l 697 0 l 697 376 l 374 1012 l 583 1012 l 802 576 l 1001 1012 l 1211 1012 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 "},"’":{"x_min":0,"x_max":192,"ha":289,"o":"m 192 834 q 137 692 192 751 q 0 626 83 634 l 0 697 q 101 831 101 723 l 0 831 l 0 1013 l 192 1013 l 192 834 "},"Ν":{"x_min":0,"x_max":833,"ha":946,"o":"m 833 0 l 617 0 l 206 696 l 206 0 l 0 0 l 0 1013 l 216 1013 l 629 315 l 629 1013 l 833 1013 l 833 0 "},"-":{"x_min":27.78125,"x_max":413.890625,"ha":525,"o":"m 413 279 l 27 279 l 27 468 l 413 468 l 413 279 "},"Q":{"x_min":0,"x_max":995.59375,"ha":1096,"o":"m 995 49 l 885 -70 l 762 42 q 641 -12 709 4 q 497 -29 572 -29 q 135 123 271 -29 q 0 504 0 276 q 131 881 0 731 q 497 1040 270 1040 q 859 883 719 1040 q 994 506 994 731 q 966 321 994 413 q 884 152 938 229 l 995 49 m 730 299 q 767 395 755 344 q 779 504 779 446 q 713 743 779 644 q 505 857 638 857 q 284 745 366 857 q 210 501 210 644 q 279 265 210 361 q 492 157 357 157 q 615 181 557 157 l 508 287 l 620 405 l 730 299 "},"ς":{"x_min":0,"x_max":731.78125,"ha":768,"o":"m 731 448 l 547 448 q 485 571 531 533 q 369 610 440 610 q 245 537 292 610 q 204 394 204 473 q 322 186 204 238 q 540 133 430 159 q 659 -15 659 98 q 643 -141 659 -80 q 595 -278 627 -202 l 423 -278 q 458 -186 448 -215 q 474 -88 474 -133 q 352 0 474 -27 q 123 80 181 38 q 0 382 0 170 q 98 660 0 549 q 367 777 202 777 q 622 683 513 777 q 731 448 731 589 "},"M":{"x_min":0,"x_max":1019,"ha":1135,"o":"m 1019 0 l 823 0 l 823 819 l 618 0 l 402 0 l 194 818 l 194 0 l 0 0 l 0 1013 l 309 1012 l 510 241 l 707 1013 l 1019 1013 l 1019 0 "},"Ψ":{"x_min":0,"x_max":995,"ha":1085,"o":"m 995 698 q 924 340 995 437 q 590 200 841 227 l 590 0 l 404 0 l 404 200 q 70 340 152 227 q 0 698 0 437 l 0 1013 l 188 1013 l 188 694 q 212 472 188 525 q 404 383 254 383 l 404 1013 l 590 1013 l 590 383 q 781 472 740 383 q 807 694 807 525 l 807 1013 l 995 1013 l 995 698 "},"C":{"x_min":0,"x_max":970.828125,"ha":1043,"o":"m 970 345 q 802 70 933 169 q 490 -29 672 -29 q 130 130 268 -29 q 0 506 0 281 q 134 885 0 737 q 502 1040 275 1040 q 802 939 668 1040 q 965 679 936 838 l 745 679 q 649 809 716 761 q 495 857 582 857 q 283 747 361 857 q 214 508 214 648 q 282 267 214 367 q 493 154 359 154 q 651 204 584 154 q 752 345 718 255 l 970 345 "},"!":{"x_min":0,"x_max":204,"ha":307,"o":"m 204 739 q 182 515 204 686 q 152 282 167 398 l 52 282 q 13 589 27 473 q 0 739 0 704 l 0 1013 l 204 1013 l 204 739 m 204 0 l 0 0 l 0 203 l 204 203 l 204 0 "},"{":{"x_min":0,"x_max":501.390625,"ha":599,"o":"m 501 -285 q 229 -209 301 -285 q 176 -35 176 -155 q 182 47 176 -8 q 189 126 189 103 q 156 245 189 209 q 0 294 112 294 l 0 438 q 154 485 111 438 q 189 603 189 522 q 186 666 189 636 q 176 783 176 772 q 231 945 176 894 q 501 1015 306 1015 l 501 872 q 370 833 408 872 q 340 737 340 801 q 342 677 340 705 q 353 569 353 579 q 326 451 353 496 q 207 366 291 393 q 327 289 294 346 q 353 164 353 246 q 348 79 353 132 q 344 17 344 26 q 372 -95 344 -58 q 501 -141 408 -141 l 501 -285 "},"X":{"x_min":0,"x_max":894.453125,"ha":999,"o":"m 894 0 l 654 0 l 445 351 l 238 0 l 0 0 l 316 516 l 0 1013 l 238 1013 l 445 659 l 652 1013 l 894 1013 l 577 519 l 894 0 "},"#":{"x_min":0,"x_max":1019.453125,"ha":1117,"o":"m 1019 722 l 969 582 l 776 581 l 717 417 l 919 417 l 868 279 l 668 278 l 566 -6 l 413 -5 l 516 279 l 348 279 l 247 -6 l 94 -6 l 196 278 l 0 279 l 49 417 l 245 417 l 304 581 l 98 582 l 150 722 l 354 721 l 455 1006 l 606 1006 l 507 721 l 673 722 l 776 1006 l 927 1006 l 826 721 l 1019 722 m 627 581 l 454 581 l 394 417 l 567 417 l 627 581 "},"ι":{"x_min":42,"x_max":242,"ha":389,"o":"m 242 0 l 42 0 l 42 749 l 242 749 l 242 0 "},"Ά":{"x_min":0,"x_max":995.828125,"ha":1072,"o":"m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 m 995 0 l 776 0 l 708 208 l 315 208 l 247 0 l 29 0 l 390 1012 l 629 1012 l 995 0 m 652 376 l 509 809 l 369 376 l 652 376 "},")":{"x_min":0,"x_max":389,"ha":486,"o":"m 389 357 q 319 14 389 187 q 145 -293 259 -134 l 0 -293 q 139 22 90 -142 q 189 358 189 187 q 139 689 189 525 q 0 1013 90 853 l 145 1013 q 319 703 258 857 q 389 357 389 528 "},"ε":{"x_min":16.671875,"x_max":652.78125,"ha":742,"o":"m 652 259 q 565 49 652 123 q 340 -25 479 -25 q 102 39 188 -25 q 16 197 16 104 q 45 299 16 249 q 134 390 75 348 q 58 456 86 419 q 25 552 25 502 q 120 717 25 653 q 322 776 208 776 q 537 710 456 776 q 625 508 625 639 l 445 508 q 415 585 445 563 q 327 608 386 608 q 254 590 293 608 q 215 544 215 573 q 252 469 215 490 q 336 453 280 453 q 369 455 347 453 q 400 456 391 456 l 400 308 l 329 308 q 247 291 280 308 q 204 223 204 269 q 255 154 204 172 q 345 143 286 143 q 426 174 398 143 q 454 259 454 206 l 652 259 "},"Δ":{"x_min":0,"x_max":981.953125,"ha":1057,"o":"m 981 0 l 0 0 l 386 1013 l 594 1013 l 981 0 m 715 175 l 490 765 l 266 175 l 715 175 "},"}":{"x_min":0,"x_max":500,"ha":597,"o":"m 500 294 q 348 246 390 294 q 315 128 315 209 q 320 42 315 101 q 326 -48 326 -17 q 270 -214 326 -161 q 0 -285 196 -285 l 0 -141 q 126 -97 90 -141 q 154 8 154 -64 q 150 91 154 37 q 146 157 146 145 q 172 281 146 235 q 294 366 206 339 q 173 451 208 390 q 146 576 146 500 q 150 655 146 603 q 154 731 154 708 q 126 831 154 799 q 0 872 90 872 l 0 1015 q 270 944 196 1015 q 326 777 326 891 q 322 707 326 747 q 313 593 313 612 q 347 482 313 518 q 500 438 390 438 l 500 294 "},"‰":{"x_min":0,"x_max":1681,"ha":1775,"o":"m 861 484 q 1048 404 979 484 q 1111 228 1111 332 q 1048 51 1111 123 q 859 -29 979 -29 q 672 50 740 -29 q 610 227 610 122 q 672 403 610 331 q 861 484 741 484 m 861 120 q 939 151 911 120 q 967 226 967 183 q 942 299 967 270 q 861 333 912 333 q 783 301 811 333 q 756 226 756 269 q 783 151 756 182 q 861 120 810 120 m 904 984 l 316 -28 l 205 -29 l 793 983 l 904 984 m 250 984 q 436 904 366 984 q 499 730 499 832 q 436 552 499 626 q 248 472 366 472 q 62 552 132 472 q 0 728 0 624 q 62 903 0 831 q 250 984 132 984 m 249 835 q 169 801 198 835 q 140 725 140 768 q 167 652 140 683 q 247 621 195 621 q 327 654 298 621 q 357 730 357 687 q 329 803 357 772 q 249 835 301 835 m 1430 484 q 1618 404 1548 484 q 1681 228 1681 332 q 1618 51 1681 123 q 1429 -29 1548 -29 q 1241 50 1309 -29 q 1179 227 1179 122 q 1241 403 1179 331 q 1430 484 1311 484 m 1431 120 q 1509 151 1481 120 q 1537 226 1537 183 q 1511 299 1537 270 q 1431 333 1482 333 q 1352 301 1380 333 q 1325 226 1325 269 q 1352 151 1325 182 q 1431 120 1379 120 "},"a":{"x_min":0,"x_max":700,"ha":786,"o":"m 700 0 l 488 0 q 465 93 469 45 q 365 5 427 37 q 233 -26 303 -26 q 65 37 130 -26 q 0 205 0 101 q 120 409 0 355 q 343 452 168 431 q 465 522 465 468 q 424 588 465 565 q 337 611 384 611 q 250 581 285 611 q 215 503 215 552 l 26 503 q 113 707 26 633 q 328 775 194 775 q 538 723 444 775 q 657 554 657 659 l 657 137 q 666 73 657 101 q 700 33 675 45 l 700 0 m 465 297 l 465 367 q 299 322 358 340 q 193 217 193 287 q 223 150 193 174 q 298 127 254 127 q 417 175 370 127 q 465 297 465 224 "},"—":{"x_min":0,"x_max":941.671875,"ha":1039,"o":"m 941 297 l 0 297 l 0 450 l 941 450 l 941 297 "},"=":{"x_min":29.171875,"x_max":798.609375,"ha":828,"o":"m 798 502 l 29 502 l 29 635 l 798 635 l 798 502 m 798 204 l 29 204 l 29 339 l 798 339 l 798 204 "},"N":{"x_min":0,"x_max":833,"ha":949,"o":"m 833 0 l 617 0 l 206 695 l 206 0 l 0 0 l 0 1013 l 216 1013 l 629 315 l 629 1013 l 833 1013 l 833 0 "},"ρ":{"x_min":0,"x_max":722,"ha":810,"o":"m 364 -17 q 271 0 313 -17 q 194 48 230 16 l 194 -278 l 0 -278 l 0 370 q 87 656 0 548 q 358 775 183 775 q 626 655 524 775 q 722 372 722 541 q 621 95 722 208 q 364 -17 520 -17 m 360 607 q 237 529 280 607 q 201 377 201 463 q 234 229 201 292 q 355 147 277 147 q 467 210 419 147 q 515 374 515 273 q 471 537 515 468 q 360 607 428 607 "},"2":{"x_min":64,"x_max":764,"ha":828,"o":"m 764 685 q 675 452 764 541 q 484 325 637 415 q 307 168 357 250 l 754 168 l 754 0 l 64 0 q 193 301 64 175 q 433 480 202 311 q 564 673 564 576 q 519 780 564 737 q 416 824 475 824 q 318 780 358 824 q 262 633 270 730 l 80 633 q 184 903 80 807 q 415 988 276 988 q 654 907 552 988 q 764 685 764 819 "},"¯":{"x_min":0,"x_max":775,"ha":771,"o":"m 775 958 l 0 958 l 0 1111 l 775 1111 l 775 958 "},"Z":{"x_min":0,"x_max":804.171875,"ha":906,"o":"m 804 836 l 251 182 l 793 182 l 793 0 l 0 0 l 0 176 l 551 830 l 11 830 l 11 1013 l 804 1013 l 804 836 "},"u":{"x_min":0,"x_max":668,"ha":782,"o":"m 668 0 l 474 0 l 474 89 q 363 9 425 37 q 233 -19 301 -19 q 61 53 123 -19 q 0 239 0 126 l 0 749 l 199 749 l 199 296 q 225 193 199 233 q 316 146 257 146 q 424 193 380 146 q 469 304 469 240 l 469 749 l 668 749 l 668 0 "},"k":{"x_min":0,"x_max":688.890625,"ha":771,"o":"m 688 0 l 450 0 l 270 316 l 196 237 l 196 0 l 0 0 l 0 1013 l 196 1013 l 196 483 l 433 748 l 675 748 l 413 469 l 688 0 "},"Η":{"x_min":0,"x_max":837,"ha":950,"o":"m 837 0 l 627 0 l 627 450 l 210 450 l 210 0 l 0 0 l 0 1013 l 210 1013 l 210 635 l 627 635 l 627 1013 l 837 1013 l 837 0 "},"Α":{"x_min":0,"x_max":966.671875,"ha":1043,"o":"m 966 0 l 747 0 l 679 208 l 286 208 l 218 0 l 0 0 l 361 1013 l 600 1013 l 966 0 m 623 376 l 480 809 l 340 376 l 623 376 "},"s":{"x_min":0,"x_max":681,"ha":775,"o":"m 681 229 q 568 33 681 105 q 340 -29 471 -29 q 107 39 202 -29 q 0 245 0 114 l 201 245 q 252 155 201 189 q 358 128 295 128 q 436 144 401 128 q 482 205 482 166 q 363 284 482 255 q 143 348 181 329 q 25 533 25 408 q 129 716 25 647 q 340 778 220 778 q 554 710 465 778 q 658 522 643 643 l 463 522 q 419 596 458 570 q 327 622 380 622 q 255 606 290 622 q 221 556 221 590 q 339 473 221 506 q 561 404 528 420 q 681 229 681 344 "},"B":{"x_min":0,"x_max":835,"ha":938,"o":"m 674 547 q 791 450 747 518 q 835 304 835 383 q 718 75 835 158 q 461 0 612 0 l 0 0 l 0 1013 l 477 1013 q 697 951 609 1013 q 797 754 797 880 q 765 630 797 686 q 674 547 734 575 m 438 621 q 538 646 495 621 q 590 730 590 676 q 537 814 590 785 q 436 838 494 838 l 199 838 l 199 621 l 438 621 m 445 182 q 561 211 513 182 q 618 311 618 247 q 565 410 618 375 q 444 446 512 446 l 199 446 l 199 182 l 445 182 "},"…":{"x_min":0,"x_max":819,"ha":963,"o":"m 206 0 l 0 0 l 0 207 l 206 207 l 206 0 m 512 0 l 306 0 l 306 207 l 512 207 l 512 0 m 819 0 l 613 0 l 613 207 l 819 207 l 819 0 "},"?":{"x_min":1,"x_max":687,"ha":785,"o":"m 687 734 q 621 563 687 634 q 501 454 560 508 q 436 293 436 386 l 251 293 l 251 391 q 363 557 251 462 q 476 724 476 653 q 432 827 476 788 q 332 866 389 866 q 238 827 275 866 q 195 699 195 781 l 1 699 q 110 955 1 861 q 352 1040 210 1040 q 582 963 489 1040 q 687 734 687 878 m 446 0 l 243 0 l 243 203 l 446 203 l 446 0 "},"H":{"x_min":0,"x_max":838,"ha":953,"o":"m 838 0 l 628 0 l 628 450 l 210 450 l 210 0 l 0 0 l 0 1013 l 210 1013 l 210 635 l 628 635 l 628 1013 l 838 1013 l 838 0 "},"ν":{"x_min":0,"x_max":740.28125,"ha":828,"o":"m 740 749 l 473 0 l 266 0 l 0 749 l 222 749 l 373 211 l 529 749 l 740 749 "},"c":{"x_min":0,"x_max":751.390625,"ha":828,"o":"m 751 282 q 625 58 725 142 q 384 -26 526 -26 q 107 84 215 -26 q 0 366 0 195 q 98 651 0 536 q 370 774 204 774 q 616 700 518 774 q 751 486 715 626 l 536 486 q 477 570 516 538 q 380 607 434 607 q 248 533 298 607 q 204 378 204 466 q 242 219 204 285 q 377 139 290 139 q 483 179 438 139 q 543 282 527 220 l 751 282 "},"¶":{"x_min":0,"x_max":566.671875,"ha":678,"o":"m 21 892 l 52 892 l 98 761 l 145 892 l 176 892 l 178 741 l 157 741 l 157 867 l 108 741 l 88 741 l 40 871 l 40 741 l 21 741 l 21 892 m 308 854 l 308 731 q 252 691 308 691 q 227 691 240 691 q 207 696 213 695 l 207 712 l 253 706 q 288 733 288 706 l 288 763 q 244 741 279 741 q 193 797 193 741 q 261 860 193 860 q 287 860 273 860 q 308 854 302 855 m 288 842 l 263 843 q 213 796 213 843 q 248 756 213 756 q 288 796 288 756 l 288 842 m 566 988 l 502 988 l 502 -1 l 439 -1 l 439 988 l 317 988 l 317 -1 l 252 -1 l 252 602 q 81 653 155 602 q 0 805 0 711 q 101 989 0 918 q 309 1053 194 1053 l 566 1053 l 566 988 "},"β":{"x_min":0,"x_max":703,"ha":789,"o":"m 510 539 q 651 429 600 501 q 703 262 703 357 q 617 53 703 136 q 404 -29 532 -29 q 199 51 279 -29 l 199 -278 l 0 -278 l 0 627 q 77 911 0 812 q 343 1021 163 1021 q 551 957 464 1021 q 649 769 649 886 q 613 638 649 697 q 510 539 577 579 m 344 136 q 452 181 408 136 q 497 291 497 227 q 435 409 497 369 q 299 444 381 444 l 299 600 q 407 634 363 600 q 452 731 452 669 q 417 820 452 784 q 329 857 382 857 q 217 775 246 857 q 199 622 199 725 l 199 393 q 221 226 199 284 q 344 136 254 136 "},"Μ":{"x_min":0,"x_max":1019,"ha":1132,"o":"m 1019 0 l 823 0 l 823 818 l 617 0 l 402 0 l 194 818 l 194 0 l 0 0 l 0 1013 l 309 1013 l 509 241 l 708 1013 l 1019 1013 l 1019 0 "},"Ό":{"x_min":0.15625,"x_max":1174,"ha":1271,"o":"m 676 -29 q 312 127 451 -29 q 179 505 179 277 q 311 883 179 733 q 676 1040 449 1040 q 1040 883 901 1040 q 1174 505 1174 733 q 1041 127 1174 277 q 676 -29 903 -29 m 676 154 q 890 266 811 154 q 961 506 961 366 q 891 745 961 648 q 676 857 812 857 q 462 747 541 857 q 392 506 392 648 q 461 266 392 365 q 676 154 540 154 m 314 1034 l 98 779 l 0 779 l 136 1034 l 314 1034 "},"Ή":{"x_min":0,"x_max":1248,"ha":1361,"o":"m 1248 0 l 1038 0 l 1038 450 l 621 450 l 621 0 l 411 0 l 411 1012 l 621 1012 l 621 635 l 1038 635 l 1038 1012 l 1248 1012 l 1248 0 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 "},"•":{"x_min":-27.78125,"x_max":691.671875,"ha":775,"o":"m 691 508 q 588 252 691 358 q 331 147 486 147 q 77 251 183 147 q -27 508 -27 355 q 75 761 -27 655 q 331 868 179 868 q 585 763 479 868 q 691 508 691 658 "},"¥":{"x_min":0,"x_max":836,"ha":931,"o":"m 195 625 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 l 650 625 l 777 625 l 777 472 l 578 472 l 538 389 l 777 389 l 777 236 l 532 236 l 532 0 l 322 0 l 322 236 l 79 236 l 79 389 l 315 389 l 273 472 l 79 472 l 79 625 l 195 625 "},"(":{"x_min":0,"x_max":388.890625,"ha":486,"o":"m 388 -293 l 243 -293 q 70 14 130 -134 q 0 357 0 189 q 69 703 0 526 q 243 1013 129 856 l 388 1013 q 248 695 297 860 q 200 358 200 530 q 248 24 200 187 q 388 -293 297 -138 "},"U":{"x_min":0,"x_max":813,"ha":926,"o":"m 813 362 q 697 79 813 187 q 405 -29 582 -29 q 114 78 229 -29 q 0 362 0 186 l 0 1013 l 210 1013 l 210 387 q 260 226 210 291 q 408 154 315 154 q 554 226 500 154 q 603 387 603 291 l 603 1013 l 813 1013 l 813 362 "},"γ":{"x_min":0.0625,"x_max":729.234375,"ha":815,"o":"m 729 749 l 457 37 l 457 -278 l 257 -278 l 257 37 q 218 155 243 95 q 170 275 194 215 l 0 749 l 207 749 l 363 284 l 522 749 l 729 749 "},"α":{"x_min":-1,"x_max":722,"ha":835,"o":"m 722 0 l 531 0 l 530 101 q 433 8 491 41 q 304 -25 375 -25 q 72 104 157 -25 q -1 372 -1 216 q 72 643 -1 530 q 308 775 158 775 q 433 744 375 775 q 528 656 491 713 l 528 749 l 722 749 l 722 0 m 361 601 q 233 527 277 601 q 196 375 196 464 q 232 224 196 288 q 358 144 277 144 q 487 217 441 144 q 528 370 528 281 q 489 523 528 457 q 361 601 443 601 "},"F":{"x_min":0,"x_max":706.953125,"ha":778,"o":"m 706 837 l 206 837 l 206 606 l 645 606 l 645 431 l 206 431 l 206 0 l 0 0 l 0 1013 l 706 1013 l 706 837 "},"­":{"x_min":0,"x_max":704.171875,"ha":801,"o":"m 704 297 l 0 297 l 0 450 l 704 450 l 704 297 "},":":{"x_min":0,"x_max":207,"ha":304,"o":"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 m 207 0 l 0 0 l 0 207 l 207 207 l 207 0 "},"Χ":{"x_min":0,"x_max":894.453125,"ha":978,"o":"m 894 0 l 654 0 l 445 351 l 238 0 l 0 0 l 316 516 l 0 1013 l 238 1013 l 445 660 l 652 1013 l 894 1013 l 577 519 l 894 0 "},"*":{"x_min":115,"x_max":713,"ha":828,"o":"m 713 740 l 518 688 l 651 525 l 531 438 l 412 612 l 290 439 l 173 523 l 308 688 l 115 741 l 159 880 l 342 816 l 343 1013 l 482 1013 l 481 816 l 664 880 l 713 740 "},"†":{"x_min":0,"x_max":809,"ha":894,"o":"m 509 804 l 809 804 l 809 621 l 509 621 l 509 0 l 299 0 l 299 621 l 0 621 l 0 804 l 299 804 l 299 1011 l 509 1011 l 509 804 "},"°":{"x_min":-1,"x_max":363,"ha":460,"o":"m 181 808 q 46 862 94 808 q -1 992 -1 917 q 44 1118 -1 1066 q 181 1175 96 1175 q 317 1118 265 1175 q 363 991 363 1066 q 315 862 363 917 q 181 808 267 808 m 181 908 q 240 933 218 908 q 263 992 263 958 q 242 1051 263 1027 q 181 1075 221 1075 q 120 1050 142 1075 q 99 991 99 1026 q 120 933 99 958 q 181 908 142 908 "},"V":{"x_min":0,"x_max":895.828125,"ha":997,"o":"m 895 1013 l 550 0 l 347 0 l 0 1013 l 231 1013 l 447 256 l 666 1013 l 895 1013 "},"Ξ":{"x_min":0,"x_max":751.390625,"ha":800,"o":"m 733 826 l 5 826 l 5 1012 l 733 1012 l 733 826 m 681 432 l 65 432 l 65 617 l 681 617 l 681 432 m 751 0 l 0 0 l 0 183 l 751 183 l 751 0 "}," ":{"x_min":0,"x_max":0,"ha":853},"Ϋ":{"x_min":-0.21875,"x_max":836.171875,"ha":914,"o":"m 610 1046 l 454 1046 l 454 1215 l 610 1215 l 610 1046 m 369 1046 l 212 1046 l 212 1215 l 369 1215 l 369 1046 m 836 1012 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1012 l 208 1012 l 427 576 l 626 1012 l 836 1012 "},"0":{"x_min":51,"x_max":779,"ha":828,"o":"m 415 -26 q 142 129 242 -26 q 51 476 51 271 q 141 825 51 683 q 415 984 242 984 q 687 825 585 984 q 779 476 779 682 q 688 131 779 271 q 415 -26 587 -26 m 415 137 q 529 242 485 137 q 568 477 568 338 q 530 713 568 619 q 415 821 488 821 q 303 718 344 821 q 262 477 262 616 q 301 237 262 337 q 415 137 341 137 "},"”":{"x_min":0,"x_max":469,"ha":567,"o":"m 192 834 q 137 692 192 751 q 0 626 83 634 l 0 697 q 101 831 101 723 l 0 831 l 0 1013 l 192 1013 l 192 834 m 469 834 q 414 692 469 751 q 277 626 360 634 l 277 697 q 379 831 379 723 l 277 831 l 277 1013 l 469 1013 l 469 834 "},"@":{"x_min":0,"x_max":1276,"ha":1374,"o":"m 1115 -52 q 895 -170 1015 -130 q 647 -211 776 -211 q 158 -34 334 -211 q 0 360 0 123 q 179 810 0 621 q 698 1019 377 1019 q 1138 859 981 1019 q 1276 514 1276 720 q 1173 210 1276 335 q 884 75 1062 75 q 784 90 810 75 q 737 186 749 112 q 647 104 698 133 q 532 75 596 75 q 360 144 420 75 q 308 308 308 205 q 398 568 308 451 q 638 696 497 696 q 731 671 690 696 q 805 604 772 647 l 840 673 l 964 673 q 886 373 915 490 q 856 239 856 257 q 876 201 856 214 q 920 188 895 188 q 1084 284 1019 188 q 1150 511 1150 380 q 1051 779 1150 672 q 715 905 934 905 q 272 734 439 905 q 121 363 121 580 q 250 41 121 170 q 647 -103 394 -103 q 863 -67 751 -103 q 1061 26 975 -32 l 1115 -52 m 769 483 q 770 500 770 489 q 733 567 770 539 q 651 596 695 596 q 508 504 566 596 q 457 322 457 422 q 483 215 457 256 q 561 175 509 175 q 671 221 625 175 q 733 333 718 268 l 769 483 "},"Ί":{"x_min":0,"x_max":619,"ha":732,"o":"m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 m 619 0 l 411 0 l 411 1012 l 619 1012 l 619 0 "},"i":{"x_min":14,"x_max":214,"ha":326,"o":"m 214 830 l 14 830 l 14 1013 l 214 1013 l 214 830 m 214 0 l 14 0 l 14 748 l 214 748 l 214 0 "},"Β":{"x_min":0,"x_max":835,"ha":961,"o":"m 675 547 q 791 450 747 518 q 835 304 835 383 q 718 75 835 158 q 461 0 612 0 l 0 0 l 0 1013 l 477 1013 q 697 951 609 1013 q 797 754 797 880 q 766 630 797 686 q 675 547 734 575 m 439 621 q 539 646 496 621 q 590 730 590 676 q 537 814 590 785 q 436 838 494 838 l 199 838 l 199 621 l 439 621 m 445 182 q 561 211 513 182 q 618 311 618 247 q 565 410 618 375 q 444 446 512 446 l 199 446 l 199 182 l 445 182 "},"υ":{"x_min":0,"x_max":656,"ha":767,"o":"m 656 416 q 568 55 656 145 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 191 l 0 749 l 200 749 l 200 369 q 216 222 200 268 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 749 l 656 749 l 656 416 "},"]":{"x_min":0,"x_max":349,"ha":446,"o":"m 349 -300 l 0 -300 l 0 -154 l 163 -154 l 163 866 l 0 866 l 0 1013 l 349 1013 l 349 -300 "},"m":{"x_min":0,"x_max":1065,"ha":1174,"o":"m 1065 0 l 866 0 l 866 483 q 836 564 866 532 q 759 596 807 596 q 663 555 700 596 q 627 454 627 514 l 627 0 l 433 0 l 433 481 q 403 563 433 531 q 323 596 374 596 q 231 554 265 596 q 197 453 197 513 l 197 0 l 0 0 l 0 748 l 189 748 l 189 665 q 279 745 226 715 q 392 775 333 775 q 509 744 455 775 q 606 659 563 713 q 695 744 640 713 q 814 775 749 775 q 992 702 920 775 q 1065 523 1065 630 l 1065 0 "},"χ":{"x_min":0,"x_max":759.71875,"ha":847,"o":"m 759 -299 l 548 -299 l 379 66 l 215 -299 l 0 -299 l 261 233 l 13 749 l 230 749 l 379 400 l 527 749 l 738 749 l 500 238 l 759 -299 "},"8":{"x_min":57,"x_max":770,"ha":828,"o":"m 625 516 q 733 416 697 477 q 770 284 770 355 q 675 69 770 161 q 415 -29 574 -29 q 145 65 244 -29 q 57 273 57 150 q 93 413 57 350 q 204 516 130 477 q 112 609 142 556 q 83 718 83 662 q 177 905 83 824 q 414 986 272 986 q 650 904 555 986 q 745 715 745 822 q 716 608 745 658 q 625 516 688 558 m 414 590 q 516 624 479 590 q 553 706 553 659 q 516 791 553 755 q 414 828 480 828 q 311 792 348 828 q 275 706 275 757 q 310 624 275 658 q 414 590 345 590 m 413 135 q 527 179 487 135 q 564 279 564 218 q 525 386 564 341 q 411 436 482 436 q 298 387 341 436 q 261 282 261 344 q 300 178 261 222 q 413 135 340 135 "},"ί":{"x_min":42,"x_max":371.171875,"ha":389,"o":"m 242 0 l 42 0 l 42 748 l 242 748 l 242 0 m 371 1039 l 169 823 l 71 823 l 193 1039 l 371 1039 "},"Ζ":{"x_min":0,"x_max":804.171875,"ha":886,"o":"m 804 835 l 251 182 l 793 182 l 793 0 l 0 0 l 0 176 l 551 829 l 11 829 l 11 1012 l 804 1012 l 804 835 "},"R":{"x_min":0,"x_max":836.109375,"ha":947,"o":"m 836 0 l 608 0 q 588 53 596 20 q 581 144 581 86 q 581 179 581 162 q 581 215 581 197 q 553 345 581 306 q 428 393 518 393 l 208 393 l 208 0 l 0 0 l 0 1013 l 491 1013 q 720 944 630 1013 q 819 734 819 869 q 778 584 819 654 q 664 485 738 513 q 757 415 727 463 q 794 231 794 358 l 794 170 q 800 84 794 116 q 836 31 806 51 l 836 0 m 462 838 l 208 838 l 208 572 l 452 572 q 562 604 517 572 q 612 704 612 640 q 568 801 612 765 q 462 838 525 838 "},"o":{"x_min":0,"x_max":764,"ha":871,"o":"m 380 -26 q 105 86 211 -26 q 0 371 0 199 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 371 764 544 q 658 86 764 199 q 380 -26 552 -26 m 379 141 q 515 216 466 141 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 217 204 282 q 379 141 294 141 "},"5":{"x_min":59,"x_max":767,"ha":828,"o":"m 767 319 q 644 59 767 158 q 382 -29 533 -29 q 158 43 247 -29 q 59 264 59 123 l 252 264 q 295 165 252 201 q 400 129 339 129 q 512 172 466 129 q 564 308 564 220 q 514 437 564 387 q 398 488 464 488 q 329 472 361 488 q 271 420 297 456 l 93 428 l 157 958 l 722 958 l 722 790 l 295 790 l 271 593 q 348 635 306 621 q 431 649 389 649 q 663 551 560 649 q 767 319 767 453 "},"7":{"x_min":65.28125,"x_max":762.5,"ha":828,"o":"m 762 808 q 521 435 604 626 q 409 0 438 244 l 205 0 q 313 422 227 234 q 548 789 387 583 l 65 789 l 65 958 l 762 958 l 762 808 "},"K":{"x_min":0,"x_max":900,"ha":996,"o":"m 900 0 l 647 0 l 316 462 l 208 355 l 208 0 l 0 0 l 0 1013 l 208 1013 l 208 595 l 604 1013 l 863 1013 l 461 603 l 900 0 "},",":{"x_min":0,"x_max":206,"ha":303,"o":"m 206 5 q 150 -151 206 -88 q 0 -238 94 -213 l 0 -159 q 84 -100 56 -137 q 111 -2 111 -62 l 0 -2 l 0 205 l 206 205 l 206 5 "},"d":{"x_min":0,"x_max":722,"ha":836,"o":"m 722 0 l 530 0 l 530 101 q 303 -26 449 -26 q 72 103 155 -26 q 0 373 0 214 q 72 642 0 528 q 305 775 156 775 q 433 743 373 775 q 530 656 492 712 l 530 1013 l 722 1013 l 722 0 m 361 600 q 234 523 280 600 q 196 372 196 458 q 233 220 196 286 q 358 143 278 143 q 489 216 442 143 q 530 369 530 280 q 491 522 530 456 q 361 600 443 600 "},"¨":{"x_min":212,"x_max":609,"ha":933,"o":"m 609 1046 l 453 1046 l 453 1216 l 609 1216 l 609 1046 m 369 1046 l 212 1046 l 212 1216 l 369 1216 l 369 1046 "},"E":{"x_min":0,"x_max":761.109375,"ha":824,"o":"m 761 0 l 0 0 l 0 1013 l 734 1013 l 734 837 l 206 837 l 206 621 l 690 621 l 690 446 l 206 446 l 206 186 l 761 186 l 761 0 "},"Y":{"x_min":0,"x_max":836,"ha":931,"o":"m 836 1013 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 "},"\"":{"x_min":0,"x_max":357,"ha":454,"o":"m 357 604 l 225 604 l 225 988 l 357 988 l 357 604 m 132 604 l 0 604 l 0 988 l 132 988 l 132 604 "},"‹":{"x_min":35.984375,"x_max":791.671875,"ha":828,"o":"m 791 17 l 36 352 l 35 487 l 791 823 l 791 672 l 229 421 l 791 168 l 791 17 "},"„":{"x_min":0,"x_max":483,"ha":588,"o":"m 206 5 q 150 -151 206 -88 q 0 -238 94 -213 l 0 -159 q 84 -100 56 -137 q 111 -2 111 -62 l 0 -2 l 0 205 l 206 205 l 206 5 m 483 5 q 427 -151 483 -88 q 277 -238 371 -213 l 277 -159 q 361 -100 334 -137 q 388 -2 388 -62 l 277 -2 l 277 205 l 483 205 l 483 5 "},"δ":{"x_min":6,"x_max":732,"ha":835,"o":"m 732 352 q 630 76 732 177 q 354 -25 529 -25 q 101 74 197 -25 q 6 333 6 174 q 89 581 6 480 q 323 690 178 690 q 66 864 201 787 l 66 1013 l 669 1013 l 669 856 l 348 856 q 532 729 461 789 q 673 566 625 651 q 732 352 732 465 m 419 551 q 259 496 321 551 q 198 344 198 441 q 238 208 198 267 q 357 140 283 140 q 484 203 437 140 q 526 344 526 260 q 499 466 526 410 q 419 551 473 521 "},"έ":{"x_min":16.671875,"x_max":652.78125,"ha":742,"o":"m 652 259 q 565 49 652 123 q 340 -25 479 -25 q 102 39 188 -25 q 16 197 16 104 q 45 299 16 250 q 134 390 75 348 q 58 456 86 419 q 25 552 25 502 q 120 717 25 653 q 322 776 208 776 q 537 710 456 776 q 625 508 625 639 l 445 508 q 415 585 445 563 q 327 608 386 608 q 254 590 293 608 q 215 544 215 573 q 252 469 215 490 q 336 453 280 453 q 369 455 347 453 q 400 456 391 456 l 400 308 l 329 308 q 247 291 280 308 q 204 223 204 269 q 255 154 204 172 q 345 143 286 143 q 426 174 398 143 q 454 259 454 206 l 652 259 m 579 1039 l 377 823 l 279 823 l 401 1039 l 579 1039 "},"ω":{"x_min":0,"x_max":945,"ha":1051,"o":"m 565 323 l 565 289 q 577 190 565 221 q 651 142 597 142 q 718 189 694 142 q 742 365 742 237 q 703 565 742 462 q 610 749 671 650 l 814 749 q 910 547 876 650 q 945 337 945 444 q 874 96 945 205 q 668 -29 793 -29 q 551 0 608 -29 q 470 78 495 30 q 390 0 444 28 q 276 -29 337 -29 q 69 96 149 -29 q 0 337 0 204 q 36 553 0 444 q 130 749 68 650 l 334 749 q 241 565 273 650 q 203 365 203 461 q 219 222 203 279 q 292 142 243 142 q 360 183 342 142 q 373 271 373 211 q 372 298 372 285 q 372 323 372 311 l 372 528 l 566 528 l 565 323 "},"´":{"x_min":0,"x_max":132,"ha":299,"o":"m 132 604 l 0 604 l 0 988 l 132 988 l 132 604 "},"±":{"x_min":29,"x_max":798,"ha":828,"o":"m 798 480 l 484 480 l 484 254 l 344 254 l 344 480 l 29 480 l 29 615 l 344 615 l 344 842 l 484 842 l 484 615 l 798 615 l 798 480 m 798 0 l 29 0 l 29 136 l 798 136 l 798 0 "},"|":{"x_min":0,"x_max":143,"ha":240,"o":"m 143 462 l 0 462 l 0 984 l 143 984 l 143 462 m 143 -242 l 0 -242 l 0 280 l 143 280 l 143 -242 "},"ϋ":{"x_min":0,"x_max":656,"ha":767,"o":"m 535 810 l 406 810 l 406 952 l 535 952 l 535 810 m 271 810 l 142 810 l 142 952 l 271 952 l 271 810 m 656 417 q 568 55 656 146 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 200 369 q 216 222 200 268 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 748 l 656 748 l 656 417 "},"§":{"x_min":0,"x_max":633,"ha":731,"o":"m 633 469 q 601 356 633 406 q 512 274 569 305 q 570 197 548 242 q 593 105 593 152 q 501 -76 593 -5 q 301 -142 416 -142 q 122 -82 193 -142 q 43 108 43 -15 l 212 108 q 251 27 220 53 q 321 1 283 1 q 389 23 360 1 q 419 83 419 46 q 310 194 419 139 q 108 297 111 295 q 0 476 0 372 q 33 584 0 537 q 120 659 62 626 q 72 720 91 686 q 53 790 53 755 q 133 978 53 908 q 312 1042 207 1042 q 483 984 412 1042 q 574 807 562 921 l 409 807 q 379 875 409 851 q 307 900 349 900 q 244 881 270 900 q 218 829 218 862 q 324 731 218 781 q 524 636 506 647 q 633 469 633 565 m 419 334 q 473 411 473 372 q 451 459 473 436 q 390 502 430 481 l 209 595 q 167 557 182 577 q 153 520 153 537 q 187 461 153 491 q 263 413 212 440 l 419 334 "},"b":{"x_min":0,"x_max":722,"ha":822,"o":"m 416 -26 q 289 6 346 -26 q 192 101 232 39 l 192 0 l 0 0 l 0 1013 l 192 1013 l 192 656 q 286 743 226 712 q 415 775 346 775 q 649 644 564 775 q 722 374 722 533 q 649 106 722 218 q 416 -26 565 -26 m 361 600 q 232 524 279 600 q 192 371 192 459 q 229 221 192 284 q 357 145 275 145 q 487 221 441 145 q 526 374 526 285 q 488 523 526 460 q 361 600 442 600 "},"q":{"x_min":0,"x_max":722,"ha":833,"o":"m 722 -298 l 530 -298 l 530 97 q 306 -25 449 -25 q 73 104 159 -25 q 0 372 0 216 q 72 643 0 529 q 305 775 156 775 q 430 742 371 775 q 530 654 488 709 l 530 750 l 722 750 l 722 -298 m 360 601 q 234 527 278 601 q 197 378 197 466 q 233 225 197 291 q 357 144 277 144 q 488 217 441 144 q 530 370 530 282 q 491 523 530 459 q 360 601 443 601 "},"Ω":{"x_min":-0.03125,"x_max":1008.53125,"ha":1108,"o":"m 1008 0 l 589 0 l 589 199 q 717 368 670 265 q 764 580 764 471 q 698 778 764 706 q 504 855 629 855 q 311 773 380 855 q 243 563 243 691 q 289 360 243 458 q 419 199 336 262 l 419 0 l 0 0 l 0 176 l 202 176 q 77 355 123 251 q 32 569 32 459 q 165 908 32 776 q 505 1040 298 1040 q 844 912 711 1040 q 977 578 977 785 q 931 362 977 467 q 805 176 886 256 l 1008 176 l 1008 0 "},"ύ":{"x_min":0,"x_max":656,"ha":767,"o":"m 656 417 q 568 55 656 146 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 201 369 q 218 222 201 269 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 748 l 656 748 l 656 417 m 579 1039 l 378 823 l 279 823 l 401 1039 l 579 1039 "},"z":{"x_min":0,"x_max":663.890625,"ha":753,"o":"m 663 0 l 0 0 l 0 154 l 411 591 l 25 591 l 25 749 l 650 749 l 650 584 l 245 165 l 663 165 l 663 0 "},"™":{"x_min":0,"x_max":951,"ha":1063,"o":"m 405 921 l 255 921 l 255 506 l 149 506 l 149 921 l 0 921 l 0 1013 l 405 1013 l 405 921 m 951 506 l 852 506 l 852 916 l 750 506 l 643 506 l 539 915 l 539 506 l 442 506 l 442 1013 l 595 1012 l 695 625 l 794 1013 l 951 1013 l 951 506 "},"ή":{"x_min":0,"x_max":669,"ha":779,"o":"m 669 -278 l 469 -278 l 469 390 q 448 526 469 473 q 348 606 417 606 q 244 553 288 606 q 201 441 201 501 l 201 0 l 0 0 l 0 749 l 201 749 l 201 665 q 301 744 244 715 q 423 774 359 774 q 606 685 538 774 q 669 484 669 603 l 669 -278 m 495 1039 l 293 823 l 195 823 l 317 1039 l 495 1039 "},"Θ":{"x_min":0,"x_max":993,"ha":1092,"o":"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 133 883 0 733 q 497 1040 272 1040 q 861 883 722 1040 q 993 505 993 733 q 861 127 993 277 q 497 -29 722 -29 m 497 154 q 711 266 631 154 q 782 506 782 367 q 712 746 782 648 q 497 858 634 858 q 281 746 361 858 q 211 506 211 648 q 280 266 211 365 q 497 154 359 154 m 676 430 l 316 430 l 316 593 l 676 593 l 676 430 "},"®":{"x_min":3,"x_max":1007,"ha":1104,"o":"m 507 -6 q 129 153 269 -6 q 3 506 3 298 q 127 857 3 713 q 502 1017 266 1017 q 880 855 740 1017 q 1007 502 1007 711 q 882 152 1007 295 q 507 -6 743 -6 m 502 934 q 184 800 302 934 q 79 505 79 680 q 184 210 79 331 q 501 76 302 76 q 819 210 701 76 q 925 507 925 331 q 820 800 925 682 q 502 934 704 934 m 782 190 l 639 190 q 627 225 632 202 q 623 285 623 248 l 623 326 q 603 411 623 384 q 527 439 584 439 l 388 439 l 388 190 l 257 190 l 257 829 l 566 829 q 709 787 654 829 q 772 654 772 740 q 746 559 772 604 q 675 497 720 514 q 735 451 714 483 q 756 341 756 419 l 756 299 q 760 244 756 265 q 782 212 764 223 l 782 190 m 546 718 l 388 718 l 388 552 l 541 552 q 612 572 584 552 q 641 635 641 593 q 614 695 641 672 q 546 718 587 718 "},"~":{"x_min":0,"x_max":851,"ha":949,"o":"m 851 968 q 795 750 851 831 q 599 656 730 656 q 406 744 506 656 q 259 832 305 832 q 162 775 193 832 q 139 656 139 730 l 0 656 q 58 871 0 787 q 251 968 124 968 q 442 879 341 968 q 596 791 544 791 q 691 849 663 791 q 712 968 712 892 l 851 968 "},"Ε":{"x_min":0,"x_max":761.546875,"ha":824,"o":"m 761 0 l 0 0 l 0 1012 l 735 1012 l 735 836 l 206 836 l 206 621 l 690 621 l 690 446 l 206 446 l 206 186 l 761 186 l 761 0 "},"³":{"x_min":0,"x_max":467,"ha":564,"o":"m 467 555 q 393 413 467 466 q 229 365 325 365 q 70 413 134 365 q 0 565 0 467 l 123 565 q 163 484 131 512 q 229 461 190 461 q 299 486 269 461 q 329 553 329 512 q 281 627 329 607 q 187 641 248 641 l 187 722 q 268 737 237 722 q 312 804 312 758 q 285 859 312 837 q 224 882 259 882 q 165 858 189 882 q 135 783 140 834 l 12 783 q 86 930 20 878 q 230 976 145 976 q 379 931 314 976 q 444 813 444 887 q 423 744 444 773 q 365 695 402 716 q 439 640 412 676 q 467 555 467 605 "},"[":{"x_min":0,"x_max":347.21875,"ha":444,"o":"m 347 -300 l 0 -300 l 0 1013 l 347 1013 l 347 866 l 188 866 l 188 -154 l 347 -154 l 347 -300 "},"L":{"x_min":0,"x_max":704.171875,"ha":763,"o":"m 704 0 l 0 0 l 0 1013 l 208 1013 l 208 186 l 704 186 l 704 0 "},"σ":{"x_min":0,"x_max":851.3125,"ha":940,"o":"m 851 594 l 712 594 q 761 369 761 485 q 658 83 761 191 q 379 -25 555 -25 q 104 87 208 -25 q 0 372 0 200 q 103 659 0 544 q 378 775 207 775 q 464 762 407 775 q 549 750 521 750 l 851 750 l 851 594 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 608 465 608 q 244 530 293 608 q 203 373 203 465 q 244 218 203 283 q 379 142 293 142 "},"ζ":{"x_min":0,"x_max":622,"ha":701,"o":"m 622 -32 q 604 -158 622 -98 q 551 -278 587 -218 l 373 -278 q 426 -180 406 -229 q 446 -80 446 -131 q 421 -22 446 -37 q 354 -8 397 -8 q 316 -9 341 -8 q 280 -11 291 -11 q 75 69 150 -11 q 0 283 0 150 q 87 596 0 437 q 291 856 162 730 l 47 856 l 47 1013 l 592 1013 l 592 904 q 317 660 422 800 q 197 318 197 497 q 306 141 197 169 q 510 123 408 131 q 622 -32 622 102 "},"θ":{"x_min":0,"x_max":714,"ha":817,"o":"m 357 1022 q 633 833 534 1022 q 714 486 714 679 q 634 148 714 288 q 354 -25 536 -25 q 79 147 175 -25 q 0 481 0 288 q 79 831 0 679 q 357 1022 177 1022 m 510 590 q 475 763 510 687 q 351 862 430 862 q 233 763 272 862 q 204 590 204 689 l 510 590 m 510 440 l 204 440 q 233 251 204 337 q 355 131 274 131 q 478 248 434 131 q 510 440 510 337 "},"Ο":{"x_min":0,"x_max":995,"ha":1092,"o":"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 132 883 0 733 q 497 1040 270 1040 q 861 883 722 1040 q 995 505 995 733 q 862 127 995 277 q 497 -29 724 -29 m 497 154 q 711 266 632 154 q 781 506 781 365 q 711 745 781 647 q 497 857 632 857 q 283 747 361 857 q 213 506 213 647 q 282 266 213 365 q 497 154 361 154 "},"Γ":{"x_min":0,"x_max":703.84375,"ha":742,"o":"m 703 836 l 208 836 l 208 0 l 0 0 l 0 1012 l 703 1012 l 703 836 "}," ":{"x_min":0,"x_max":0,"ha":375},"%":{"x_min":0,"x_max":1111,"ha":1213,"o":"m 861 484 q 1048 404 979 484 q 1111 228 1111 332 q 1048 51 1111 123 q 859 -29 979 -29 q 672 50 740 -29 q 610 227 610 122 q 672 403 610 331 q 861 484 741 484 m 861 120 q 939 151 911 120 q 967 226 967 183 q 942 299 967 270 q 861 333 912 333 q 783 301 811 333 q 756 226 756 269 q 783 151 756 182 q 861 120 810 120 m 904 984 l 316 -28 l 205 -29 l 793 983 l 904 984 m 250 984 q 436 904 366 984 q 499 730 499 832 q 436 552 499 626 q 248 472 366 472 q 62 552 132 472 q 0 728 0 624 q 62 903 0 831 q 250 984 132 984 m 249 835 q 169 801 198 835 q 140 725 140 768 q 167 652 140 683 q 247 621 195 621 q 327 654 298 621 q 357 730 357 687 q 329 803 357 772 q 249 835 301 835 "},"P":{"x_min":0,"x_max":771,"ha":838,"o":"m 208 361 l 208 0 l 0 0 l 0 1013 l 450 1013 q 682 919 593 1013 q 771 682 771 826 q 687 452 771 544 q 466 361 604 361 l 208 361 m 421 837 l 208 837 l 208 544 l 410 544 q 525 579 480 544 q 571 683 571 615 q 527 792 571 747 q 421 837 484 837 "},"Έ":{"x_min":0,"x_max":1172.546875,"ha":1235,"o":"m 1172 0 l 411 0 l 411 1012 l 1146 1012 l 1146 836 l 617 836 l 617 621 l 1101 621 l 1101 446 l 617 446 l 617 186 l 1172 186 l 1172 0 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 "},"Ώ":{"x_min":0.4375,"x_max":1189.546875,"ha":1289,"o":"m 1189 0 l 770 0 l 770 199 q 897 369 849 263 q 945 580 945 474 q 879 778 945 706 q 685 855 810 855 q 492 773 561 855 q 424 563 424 691 q 470 360 424 458 q 600 199 517 262 l 600 0 l 180 0 l 180 176 l 383 176 q 258 355 304 251 q 213 569 213 459 q 346 908 213 776 q 686 1040 479 1040 q 1025 912 892 1040 q 1158 578 1158 785 q 1112 362 1158 467 q 986 176 1067 256 l 1189 176 l 1189 0 m 314 1092 l 99 837 l 0 837 l 136 1092 l 314 1092 "},"_":{"x_min":61.109375,"x_max":766.671875,"ha":828,"o":"m 766 -333 l 61 -333 l 61 -190 l 766 -190 l 766 -333 "},"Ϊ":{"x_min":-56,"x_max":342,"ha":503,"o":"m 342 1046 l 186 1046 l 186 1215 l 342 1215 l 342 1046 m 101 1046 l -56 1046 l -56 1215 l 101 1215 l 101 1046 m 249 0 l 41 0 l 41 1012 l 249 1012 l 249 0 "},"+":{"x_min":43,"x_max":784,"ha":828,"o":"m 784 353 l 483 353 l 483 0 l 343 0 l 343 353 l 43 353 l 43 489 l 343 489 l 343 840 l 483 840 l 483 489 l 784 489 l 784 353 "},"½":{"x_min":0,"x_max":1090,"ha":1188,"o":"m 1090 380 q 992 230 1090 301 q 779 101 886 165 q 822 94 784 95 q 924 93 859 93 l 951 93 l 973 93 l 992 93 l 1009 93 q 1046 93 1027 93 q 1085 93 1066 93 l 1085 0 l 650 0 l 654 38 q 815 233 665 137 q 965 376 965 330 q 936 436 965 412 q 869 461 908 461 q 806 435 831 461 q 774 354 780 409 l 659 354 q 724 505 659 451 q 870 554 783 554 q 1024 506 958 554 q 1090 380 1090 459 m 868 998 l 268 -28 l 154 -27 l 757 999 l 868 998 m 272 422 l 147 422 l 147 799 l 0 799 l 0 875 q 126 900 91 875 q 170 973 162 926 l 272 973 l 272 422 "},"Ρ":{"x_min":0,"x_max":771,"ha":838,"o":"m 208 361 l 208 0 l 0 0 l 0 1012 l 450 1012 q 682 919 593 1012 q 771 681 771 826 q 687 452 771 544 q 466 361 604 361 l 208 361 m 422 836 l 209 836 l 209 544 l 410 544 q 525 579 480 544 q 571 683 571 614 q 527 791 571 747 q 422 836 484 836 "},"'":{"x_min":0,"x_max":192,"ha":289,"o":"m 192 834 q 137 692 192 751 q 0 626 82 632 l 0 697 q 101 830 101 726 l 0 830 l 0 1013 l 192 1013 l 192 834 "},"ª":{"x_min":0,"x_max":350,"ha":393,"o":"m 350 625 l 245 625 q 237 648 241 636 q 233 672 233 661 q 117 611 192 611 q 33 643 66 611 q 0 727 0 675 q 116 846 0 828 q 233 886 233 864 q 211 919 233 907 q 168 931 190 931 q 108 877 108 931 l 14 877 q 56 977 14 942 q 165 1013 98 1013 q 270 987 224 1013 q 329 903 329 955 l 329 694 q 332 661 329 675 q 350 641 336 648 l 350 625 m 233 774 l 233 809 q 151 786 180 796 q 97 733 97 768 q 111 700 97 712 q 149 689 126 689 q 210 713 187 689 q 233 774 233 737 "},"΅":{"x_min":57,"x_max":584,"ha":753,"o":"m 584 810 l 455 810 l 455 952 l 584 952 l 584 810 m 521 1064 l 305 810 l 207 810 l 343 1064 l 521 1064 m 186 810 l 57 810 l 57 952 l 186 952 l 186 810 "},"T":{"x_min":0,"x_max":809,"ha":894,"o":"m 809 831 l 509 831 l 509 0 l 299 0 l 299 831 l 0 831 l 0 1013 l 809 1013 l 809 831 "},"Φ":{"x_min":0,"x_max":949,"ha":1032,"o":"m 566 0 l 385 0 l 385 121 q 111 230 222 121 q 0 508 0 340 q 112 775 0 669 q 385 892 219 875 l 385 1013 l 566 1013 l 566 892 q 836 776 732 875 q 949 507 949 671 q 838 231 949 341 q 566 121 728 121 l 566 0 m 566 285 q 701 352 650 285 q 753 508 753 419 q 703 658 753 597 q 566 729 653 720 l 566 285 m 385 285 l 385 729 q 245 661 297 717 q 193 516 193 604 q 246 356 193 427 q 385 285 300 285 "},"j":{"x_min":-45.828125,"x_max":242,"ha":361,"o":"m 242 830 l 42 830 l 42 1013 l 242 1013 l 242 830 m 242 -119 q 180 -267 242 -221 q 20 -308 127 -308 l -45 -308 l -45 -140 l -24 -140 q 25 -130 8 -140 q 42 -88 42 -120 l 42 748 l 242 748 l 242 -119 "},"Σ":{"x_min":0,"x_max":772.21875,"ha":849,"o":"m 772 0 l 0 0 l 0 140 l 368 526 l 18 862 l 18 1012 l 740 1012 l 740 836 l 315 836 l 619 523 l 298 175 l 772 175 l 772 0 "},"1":{"x_min":197.609375,"x_max":628,"ha":828,"o":"m 628 0 l 434 0 l 434 674 l 197 674 l 197 810 q 373 837 318 810 q 468 984 450 876 l 628 984 l 628 0 "},"›":{"x_min":36.109375,"x_max":792,"ha":828,"o":"m 792 352 l 36 17 l 36 168 l 594 420 l 36 672 l 36 823 l 792 487 l 792 352 "},"<":{"x_min":35.984375,"x_max":791.671875,"ha":828,"o":"m 791 17 l 36 352 l 35 487 l 791 823 l 791 672 l 229 421 l 791 168 l 791 17 "},"£":{"x_min":0,"x_max":716.546875,"ha":814,"o":"m 716 38 q 603 -9 658 5 q 502 -24 548 -24 q 398 -10 451 -24 q 239 25 266 25 q 161 12 200 25 q 77 -29 122 0 l 0 113 q 110 211 81 174 q 151 315 151 259 q 117 440 151 365 l 0 440 l 0 515 l 73 515 q 35 610 52 560 q 15 710 15 671 q 119 910 15 831 q 349 984 216 984 q 570 910 480 984 q 693 668 674 826 l 501 668 q 455 791 501 746 q 353 830 414 830 q 256 795 298 830 q 215 705 215 760 q 249 583 215 655 q 283 515 266 548 l 479 515 l 479 440 l 309 440 q 316 394 313 413 q 319 355 319 374 q 287 241 319 291 q 188 135 263 205 q 262 160 225 152 q 332 168 298 168 q 455 151 368 168 q 523 143 500 143 q 588 152 558 143 q 654 189 617 162 l 716 38 "},"t":{"x_min":0,"x_max":412,"ha":511,"o":"m 412 -6 q 349 -8 391 -6 q 287 -11 307 -11 q 137 38 177 -11 q 97 203 97 87 l 97 609 l 0 609 l 0 749 l 97 749 l 97 951 l 297 951 l 297 749 l 412 749 l 412 609 l 297 609 l 297 191 q 315 152 297 162 q 366 143 334 143 q 389 143 378 143 q 412 143 400 143 l 412 -6 "},"¬":{"x_min":0,"x_max":704,"ha":801,"o":"m 704 93 l 551 93 l 551 297 l 0 297 l 0 450 l 704 450 l 704 93 "},"λ":{"x_min":0,"x_max":701.390625,"ha":775,"o":"m 701 0 l 491 0 l 345 444 l 195 0 l 0 0 l 238 697 l 131 1013 l 334 1013 l 701 0 "},"W":{"x_min":0,"x_max":1291.671875,"ha":1399,"o":"m 1291 1013 l 1002 0 l 802 0 l 645 777 l 490 0 l 288 0 l 0 1013 l 215 1013 l 388 298 l 534 1012 l 757 1013 l 904 299 l 1076 1013 l 1291 1013 "},">":{"x_min":36.109375,"x_max":792,"ha":828,"o":"m 792 352 l 36 17 l 36 168 l 594 420 l 36 672 l 36 823 l 792 487 l 792 352 "},"v":{"x_min":0,"x_max":740.28125,"ha":828,"o":"m 740 749 l 473 0 l 266 0 l 0 749 l 222 749 l 373 211 l 529 749 l 740 749 "},"τ":{"x_min":0.28125,"x_max":618.734375,"ha":699,"o":"m 618 593 l 409 593 l 409 0 l 210 0 l 210 593 l 0 593 l 0 749 l 618 749 l 618 593 "},"ξ":{"x_min":0,"x_max":640,"ha":715,"o":"m 640 -14 q 619 -157 640 -84 q 563 -299 599 -230 l 399 -299 q 442 -194 433 -223 q 468 -85 468 -126 q 440 -25 468 -41 q 368 -10 412 -10 q 333 -11 355 -10 q 302 -13 311 -13 q 91 60 179 -13 q 0 259 0 138 q 56 426 0 354 q 201 530 109 493 q 106 594 144 553 q 65 699 65 642 q 94 787 65 747 q 169 856 123 828 l 22 856 l 22 1013 l 597 1013 l 597 856 l 497 857 q 345 840 398 857 q 257 736 257 812 q 366 614 257 642 q 552 602 416 602 l 552 446 l 513 446 q 313 425 379 446 q 199 284 199 389 q 312 162 199 184 q 524 136 418 148 q 640 -14 640 105 "},"&":{"x_min":-1,"x_max":910.109375,"ha":1007,"o":"m 910 -1 l 676 -1 l 607 83 q 291 -47 439 -47 q 50 100 135 -47 q -1 273 -1 190 q 51 431 -1 357 q 218 568 104 505 q 151 661 169 629 q 120 769 120 717 q 201 951 120 885 q 382 1013 276 1013 q 555 957 485 1013 q 635 789 635 894 q 584 644 635 709 q 468 539 548 597 l 615 359 q 664 527 654 440 l 844 527 q 725 223 824 359 l 910 -1 m 461 787 q 436 848 461 826 q 381 870 412 870 q 325 849 349 870 q 301 792 301 829 q 324 719 301 757 q 372 660 335 703 q 430 714 405 680 q 461 787 461 753 m 500 214 l 318 441 q 198 286 198 363 q 225 204 198 248 q 347 135 268 135 q 425 153 388 135 q 500 214 462 172 "},"Λ":{"x_min":0,"x_max":894.453125,"ha":974,"o":"m 894 0 l 666 0 l 447 757 l 225 0 l 0 0 l 344 1013 l 547 1013 l 894 0 "},"I":{"x_min":41,"x_max":249,"ha":365,"o":"m 249 0 l 41 0 l 41 1013 l 249 1013 l 249 0 "},"G":{"x_min":0,"x_max":971,"ha":1057,"o":"m 971 -1 l 829 -1 l 805 118 q 479 -29 670 -29 q 126 133 261 -29 q 0 509 0 286 q 130 884 0 737 q 493 1040 268 1040 q 790 948 659 1040 q 961 698 920 857 l 736 698 q 643 813 709 769 q 500 857 578 857 q 285 746 364 857 q 213 504 213 644 q 285 263 213 361 q 505 154 365 154 q 667 217 598 154 q 761 374 736 280 l 548 374 l 548 548 l 971 548 l 971 -1 "},"ΰ":{"x_min":0,"x_max":655,"ha":767,"o":"m 583 810 l 454 810 l 454 952 l 583 952 l 583 810 m 186 810 l 57 809 l 57 952 l 186 952 l 186 810 m 516 1039 l 315 823 l 216 823 l 338 1039 l 516 1039 m 655 417 q 567 55 655 146 q 326 -25 489 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 201 369 q 218 222 201 269 q 326 142 245 142 q 439 247 410 142 q 455 422 455 304 l 455 748 l 655 748 l 655 417 "},"`":{"x_min":0,"x_max":190,"ha":288,"o":"m 190 654 l 0 654 l 0 830 q 55 970 0 909 q 190 1040 110 1031 l 190 969 q 111 922 134 952 q 88 836 88 892 l 190 836 l 190 654 "},"·":{"x_min":0,"x_max":207,"ha":304,"o":"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 "},"Υ":{"x_min":-0.21875,"x_max":836.171875,"ha":914,"o":"m 836 1013 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 "},"r":{"x_min":0,"x_max":431.9375,"ha":513,"o":"m 431 564 q 269 536 320 564 q 200 395 200 498 l 200 0 l 0 0 l 0 748 l 183 748 l 183 618 q 285 731 224 694 q 431 768 345 768 l 431 564 "},"x":{"x_min":0,"x_max":738.890625,"ha":826,"o":"m 738 0 l 504 0 l 366 238 l 230 0 l 0 0 l 252 382 l 11 749 l 238 749 l 372 522 l 502 749 l 725 749 l 488 384 l 738 0 "},"μ":{"x_min":0,"x_max":647,"ha":754,"o":"m 647 0 l 477 0 l 477 68 q 411 9 448 30 q 330 -11 374 -11 q 261 3 295 -11 q 199 43 226 18 l 199 -278 l 0 -278 l 0 749 l 199 749 l 199 358 q 216 222 199 268 q 322 152 244 152 q 435 240 410 152 q 448 401 448 283 l 448 749 l 647 749 l 647 0 "},"h":{"x_min":0,"x_max":669,"ha":782,"o":"m 669 0 l 469 0 l 469 390 q 449 526 469 472 q 353 607 420 607 q 248 554 295 607 q 201 441 201 501 l 201 0 l 0 0 l 0 1013 l 201 1013 l 201 665 q 303 743 245 715 q 425 772 362 772 q 609 684 542 772 q 669 484 669 605 l 669 0 "},".":{"x_min":0,"x_max":206,"ha":303,"o":"m 206 0 l 0 0 l 0 207 l 206 207 l 206 0 "},"φ":{"x_min":-1,"x_max":921,"ha":990,"o":"m 542 -278 l 367 -278 l 367 -22 q 99 92 200 -22 q -1 376 -1 206 q 72 627 -1 520 q 288 769 151 742 l 288 581 q 222 495 243 550 q 202 378 202 439 q 240 228 202 291 q 367 145 285 157 l 367 776 l 515 776 q 807 667 694 776 q 921 379 921 558 q 815 93 921 209 q 542 -22 709 -22 l 542 -278 m 542 145 q 672 225 625 145 q 713 381 713 291 q 671 536 713 470 q 542 611 624 611 l 542 145 "},";":{"x_min":0,"x_max":208,"ha":306,"o":"m 208 528 l 0 528 l 0 735 l 208 735 l 208 528 m 208 6 q 152 -151 208 -89 q 0 -238 96 -212 l 0 -158 q 87 -100 61 -136 q 113 0 113 -65 l 0 0 l 0 207 l 208 207 l 208 6 "},"f":{"x_min":0,"x_max":424,"ha":525,"o":"m 424 609 l 300 609 l 300 0 l 107 0 l 107 609 l 0 609 l 0 749 l 107 749 q 145 949 107 894 q 328 1019 193 1019 l 424 1015 l 424 855 l 362 855 q 312 841 324 855 q 300 797 300 827 q 300 773 300 786 q 300 749 300 761 l 424 749 l 424 609 "},"“":{"x_min":0,"x_max":468,"ha":567,"o":"m 190 631 l 0 631 l 0 807 q 55 947 0 885 q 190 1017 110 1010 l 190 947 q 88 813 88 921 l 190 813 l 190 631 m 468 631 l 278 631 l 278 807 q 333 947 278 885 q 468 1017 388 1010 l 468 947 q 366 813 366 921 l 468 813 l 468 631 "},"A":{"x_min":0,"x_max":966.671875,"ha":1069,"o":"m 966 0 l 747 0 l 679 208 l 286 208 l 218 0 l 0 0 l 361 1013 l 600 1013 l 966 0 m 623 376 l 480 810 l 340 376 l 623 376 "},"6":{"x_min":57,"x_max":771,"ha":828,"o":"m 744 734 l 544 734 q 500 802 533 776 q 425 828 466 828 q 315 769 359 828 q 264 571 264 701 q 451 638 343 638 q 691 537 602 638 q 771 315 771 449 q 683 79 771 176 q 420 -29 586 -29 q 134 123 227 -29 q 57 455 57 250 q 184 865 57 721 q 452 988 293 988 q 657 916 570 988 q 744 734 744 845 m 426 128 q 538 178 498 128 q 578 300 578 229 q 538 422 578 372 q 415 479 493 479 q 303 430 342 479 q 264 313 264 381 q 308 184 264 240 q 426 128 352 128 "},"‘":{"x_min":0,"x_max":190,"ha":289,"o":"m 190 631 l 0 631 l 0 807 q 55 947 0 885 q 190 1017 110 1010 l 190 947 q 88 813 88 921 l 190 813 l 190 631 "},"ϊ":{"x_min":-55,"x_max":337,"ha":389,"o":"m 337 810 l 208 810 l 208 952 l 337 952 l 337 810 m 74 810 l -55 810 l -55 952 l 74 952 l 74 810 m 242 0 l 42 0 l 42 748 l 242 748 l 242 0 "},"π":{"x_min":0.5,"x_max":838.890625,"ha":938,"o":"m 838 593 l 750 593 l 750 0 l 549 0 l 549 593 l 287 593 l 287 0 l 88 0 l 88 593 l 0 593 l 0 749 l 838 749 l 838 593 "},"ά":{"x_min":-1,"x_max":722,"ha":835,"o":"m 722 0 l 531 0 l 530 101 q 433 8 491 41 q 304 -25 375 -25 q 72 104 157 -25 q -1 372 -1 216 q 72 643 -1 530 q 308 775 158 775 q 433 744 375 775 q 528 656 491 713 l 528 749 l 722 749 l 722 0 m 361 601 q 233 527 277 601 q 196 375 196 464 q 232 224 196 288 q 358 144 277 144 q 487 217 441 144 q 528 370 528 281 q 489 523 528 457 q 361 601 443 601 m 579 1039 l 377 823 l 279 823 l 401 1039 l 579 1039 "},"O":{"x_min":0,"x_max":994,"ha":1094,"o":"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 131 883 0 733 q 497 1040 270 1040 q 860 883 721 1040 q 994 505 994 733 q 862 127 994 277 q 497 -29 723 -29 m 497 154 q 710 266 631 154 q 780 506 780 365 q 710 745 780 647 q 497 857 631 857 q 283 747 361 857 q 213 506 213 647 q 282 266 213 365 q 497 154 361 154 "},"n":{"x_min":0,"x_max":669,"ha":782,"o":"m 669 0 l 469 0 l 469 452 q 442 553 469 513 q 352 601 412 601 q 245 553 290 601 q 200 441 200 505 l 200 0 l 0 0 l 0 748 l 194 748 l 194 659 q 289 744 230 713 q 416 775 349 775 q 600 700 531 775 q 669 509 669 626 l 669 0 "},"3":{"x_min":61,"x_max":767,"ha":828,"o":"m 767 290 q 653 51 767 143 q 402 -32 548 -32 q 168 48 262 -32 q 61 300 61 140 l 250 300 q 298 173 250 219 q 405 132 343 132 q 514 169 471 132 q 563 282 563 211 q 491 405 563 369 q 343 432 439 432 l 343 568 q 472 592 425 568 q 534 701 534 626 q 493 793 534 758 q 398 829 453 829 q 306 789 344 829 q 268 669 268 749 l 80 669 q 182 909 80 823 q 410 986 274 986 q 633 916 540 986 q 735 719 735 840 q 703 608 735 656 q 615 522 672 561 q 727 427 687 486 q 767 290 767 369 "},"9":{"x_min":58,"x_max":769,"ha":828,"o":"m 769 492 q 646 90 769 232 q 384 -33 539 -33 q 187 35 271 -33 q 83 224 98 107 l 282 224 q 323 154 286 182 q 404 127 359 127 q 513 182 471 127 q 563 384 563 248 q 475 335 532 355 q 372 315 418 315 q 137 416 224 315 q 58 642 58 507 q 144 877 58 781 q 407 984 239 984 q 694 827 602 984 q 769 492 769 699 m 416 476 q 525 521 488 476 q 563 632 563 566 q 521 764 563 709 q 403 826 474 826 q 297 773 337 826 q 258 649 258 720 q 295 530 258 577 q 416 476 339 476 "},"l":{"x_min":41,"x_max":240,"ha":363,"o":"m 240 0 l 41 0 l 41 1013 l 240 1013 l 240 0 "},"¤":{"x_min":40.265625,"x_max":727.203125,"ha":825,"o":"m 727 792 l 594 659 q 620 552 620 609 q 598 459 620 504 l 725 331 l 620 224 l 491 352 q 382 331 443 331 q 273 352 322 331 l 144 224 l 40 330 l 167 459 q 147 552 147 501 q 172 658 147 608 l 40 794 l 147 898 l 283 759 q 383 776 330 776 q 482 759 434 776 l 620 898 l 727 792 m 383 644 q 308 617 334 644 q 283 551 283 590 q 309 489 283 517 q 381 462 335 462 q 456 488 430 462 q 482 554 482 515 q 455 616 482 588 q 383 644 429 644 "},"κ":{"x_min":0,"x_max":691.84375,"ha":779,"o":"m 691 0 l 479 0 l 284 343 l 196 252 l 196 0 l 0 0 l 0 749 l 196 749 l 196 490 l 440 749 l 677 749 l 416 479 l 691 0 "},"4":{"x_min":53,"x_max":775.21875,"ha":828,"o":"m 775 213 l 660 213 l 660 0 l 470 0 l 470 213 l 53 213 l 53 384 l 416 958 l 660 958 l 660 370 l 775 370 l 775 213 m 474 364 l 474 786 l 204 363 l 474 364 "},"p":{"x_min":0,"x_max":722,"ha":824,"o":"m 415 -26 q 287 4 346 -26 q 192 92 228 34 l 192 -298 l 0 -298 l 0 750 l 192 750 l 192 647 q 289 740 230 706 q 416 775 347 775 q 649 645 566 775 q 722 375 722 534 q 649 106 722 218 q 415 -26 564 -26 m 363 603 q 232 529 278 603 q 192 375 192 465 q 230 222 192 286 q 360 146 276 146 q 487 221 441 146 q 526 371 526 285 q 488 523 526 458 q 363 603 443 603 "},"‡":{"x_min":0,"x_max":809,"ha":894,"o":"m 299 621 l 0 621 l 0 804 l 299 804 l 299 1011 l 509 1011 l 509 804 l 809 804 l 809 621 l 509 621 l 509 387 l 809 387 l 809 205 l 509 205 l 509 0 l 299 0 l 299 205 l 0 205 l 0 387 l 299 387 l 299 621 "},"ψ":{"x_min":0,"x_max":875,"ha":979,"o":"m 522 142 q 657 274 620 163 q 671 352 671 316 l 671 748 l 875 748 l 875 402 q 806 134 875 240 q 525 -22 719 -1 l 525 -278 l 349 -278 l 349 -22 q 65 135 152 -1 q 0 402 0 238 l 0 748 l 204 748 l 204 352 q 231 240 204 295 q 353 142 272 159 l 353 922 l 524 922 l 522 142 "},"η":{"x_min":0,"x_max":669,"ha":779,"o":"m 669 -278 l 469 -278 l 469 390 q 448 526 469 473 q 348 606 417 606 q 244 553 288 606 q 201 441 201 501 l 201 0 l 0 0 l 0 749 l 201 749 l 201 665 q 301 744 244 715 q 423 774 359 774 q 606 685 538 774 q 669 484 669 603 l 669 -278 "}},"cssFontWeight":"bold","ascender":1216,"underlinePosition":-100,"cssFontStyle":"normal","boundingBox":{"yMin":-333,"xMin":-162,"yMax":1216,"xMax":1681},"resolution":1000,"original_font_information":{"postscript_name":"Helvetiker-Bold","version_string":"Version 1.00 2004 initial release","vendor_url":"http://www.magenta.gr","full_font_name":"Helvetiker Bold","font_family_name":"Helvetiker","copyright":"Copyright (c) Magenta ltd, 2004.","description":"","trademark":"","designer":"","designer_url":"","unique_font_identifier":"Magenta ltd:Helvetiker Bold:22-10-104","license_url":"http://www.ellak.gr/fonts/MgOpen/license.html","license_description":"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\"Fonts\") and associated documentation files (the \"Font Software\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \r\n\r\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\r\n\r\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \"MgOpen\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\r\n\r\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \"MgOpen\" name.\r\n\r\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \r\n\r\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.","manufacturer_name":"Magenta ltd","font_sub_family_name":"Bold"},"descender":-334,"familyName":"Helvetiker","lineHeight":1549,"underlineThickness":50} ================================================ FILE: examples/resources/fonts/typeface/helvetiker_regular.typeface.json ================================================ {"glyphs":{"ο":{"x_min":0,"x_max":712,"ha":815,"o":"m 356 -25 q 96 88 192 -25 q 0 368 0 201 q 92 642 0 533 q 356 761 192 761 q 617 644 517 761 q 712 368 712 533 q 619 91 712 201 q 356 -25 520 -25 m 356 85 q 527 175 465 85 q 583 369 583 255 q 528 562 583 484 q 356 651 466 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 356 85 250 85 "},"S":{"x_min":0,"x_max":788,"ha":890,"o":"m 788 291 q 662 54 788 144 q 397 -26 550 -26 q 116 68 226 -26 q 0 337 0 168 l 131 337 q 200 152 131 220 q 384 85 269 85 q 557 129 479 85 q 650 270 650 183 q 490 429 650 379 q 194 513 341 470 q 33 739 33 584 q 142 964 33 881 q 388 1041 242 1041 q 644 957 543 1041 q 756 716 756 867 l 625 716 q 561 874 625 816 q 395 933 497 933 q 243 891 309 933 q 164 759 164 841 q 325 609 164 656 q 625 526 475 568 q 788 291 788 454 "},"¦":{"x_min":343,"x_max":449,"ha":792,"o":"m 449 462 l 343 462 l 343 986 l 449 986 l 449 462 m 449 -242 l 343 -242 l 343 280 l 449 280 l 449 -242 "},"/":{"x_min":183.25,"x_max":608.328125,"ha":792,"o":"m 608 1041 l 266 -129 l 183 -129 l 520 1041 l 608 1041 "},"Τ":{"x_min":-0.4375,"x_max":777.453125,"ha":839,"o":"m 777 893 l 458 893 l 458 0 l 319 0 l 319 892 l 0 892 l 0 1013 l 777 1013 l 777 893 "},"y":{"x_min":0,"x_max":684.78125,"ha":771,"o":"m 684 738 l 388 -83 q 311 -216 356 -167 q 173 -279 252 -279 q 97 -266 133 -279 l 97 -149 q 132 -155 109 -151 q 168 -160 155 -160 q 240 -114 213 -160 q 274 -26 248 -98 l 0 738 l 137 737 l 341 139 l 548 737 l 684 738 "},"Π":{"x_min":0,"x_max":803,"ha":917,"o":"m 803 0 l 667 0 l 667 886 l 140 886 l 140 0 l 0 0 l 0 1012 l 803 1012 l 803 0 "},"ΐ":{"x_min":-111,"x_max":339,"ha":361,"o":"m 339 800 l 229 800 l 229 925 l 339 925 l 339 800 m -1 800 l -111 800 l -111 925 l -1 925 l -1 800 m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 737 l 167 737 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 103 239 101 q 284 112 257 104 l 284 3 m 302 1040 l 113 819 l 30 819 l 165 1040 l 302 1040 "},"g":{"x_min":0,"x_max":686,"ha":838,"o":"m 686 34 q 586 -213 686 -121 q 331 -306 487 -306 q 131 -252 216 -306 q 31 -84 31 -190 l 155 -84 q 228 -174 166 -138 q 345 -207 284 -207 q 514 -109 454 -207 q 564 89 564 -27 q 461 6 521 36 q 335 -23 401 -23 q 88 100 184 -23 q 0 370 0 215 q 87 634 0 522 q 330 758 183 758 q 457 728 398 758 q 564 644 515 699 l 564 737 l 686 737 l 686 34 m 582 367 q 529 560 582 481 q 358 652 468 652 q 189 561 250 652 q 135 369 135 482 q 189 176 135 255 q 361 85 251 85 q 529 176 468 85 q 582 367 582 255 "},"²":{"x_min":0,"x_max":442,"ha":539,"o":"m 442 383 l 0 383 q 91 566 0 492 q 260 668 176 617 q 354 798 354 727 q 315 875 354 845 q 227 905 277 905 q 136 869 173 905 q 99 761 99 833 l 14 761 q 82 922 14 864 q 232 974 141 974 q 379 926 316 974 q 442 797 442 878 q 351 635 442 704 q 183 539 321 611 q 92 455 92 491 l 442 455 l 442 383 "},"–":{"x_min":0,"x_max":705.5625,"ha":803,"o":"m 705 334 l 0 334 l 0 410 l 705 410 l 705 334 "},"Κ":{"x_min":0,"x_max":819.5625,"ha":893,"o":"m 819 0 l 650 0 l 294 509 l 139 356 l 139 0 l 0 0 l 0 1013 l 139 1013 l 139 526 l 626 1013 l 809 1013 l 395 600 l 819 0 "},"ƒ":{"x_min":-46.265625,"x_max":392,"ha":513,"o":"m 392 651 l 259 651 l 79 -279 l -46 -278 l 134 651 l 14 651 l 14 751 l 135 751 q 151 948 135 900 q 304 1041 185 1041 q 334 1040 319 1041 q 392 1034 348 1039 l 392 922 q 337 931 360 931 q 271 883 287 931 q 260 793 260 853 l 260 751 l 392 751 l 392 651 "},"e":{"x_min":0,"x_max":714,"ha":813,"o":"m 714 326 l 140 326 q 200 157 140 227 q 359 87 260 87 q 488 130 431 87 q 561 245 545 174 l 697 245 q 577 48 670 123 q 358 -26 484 -26 q 97 85 195 -26 q 0 363 0 197 q 94 642 0 529 q 358 765 195 765 q 626 627 529 765 q 714 326 714 503 m 576 429 q 507 583 564 522 q 355 650 445 650 q 206 583 266 650 q 140 429 152 522 l 576 429 "},"ό":{"x_min":0,"x_max":712,"ha":815,"o":"m 356 -25 q 94 91 194 -25 q 0 368 0 202 q 92 642 0 533 q 356 761 192 761 q 617 644 517 761 q 712 368 712 533 q 619 91 712 201 q 356 -25 520 -25 m 356 85 q 527 175 465 85 q 583 369 583 255 q 528 562 583 484 q 356 651 466 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 356 85 250 85 m 576 1040 l 387 819 l 303 819 l 438 1040 l 576 1040 "},"J":{"x_min":0,"x_max":588,"ha":699,"o":"m 588 279 q 287 -26 588 -26 q 58 73 126 -26 q 0 327 0 158 l 133 327 q 160 172 133 227 q 288 96 198 96 q 426 171 391 96 q 449 336 449 219 l 449 1013 l 588 1013 l 588 279 "},"»":{"x_min":-1,"x_max":503,"ha":601,"o":"m 503 302 l 280 136 l 281 256 l 429 373 l 281 486 l 280 608 l 503 440 l 503 302 m 221 302 l 0 136 l 0 255 l 145 372 l 0 486 l -1 608 l 221 440 l 221 302 "},"©":{"x_min":-3,"x_max":1008,"ha":1106,"o":"m 502 -7 q 123 151 263 -7 q -3 501 -3 294 q 123 851 -3 706 q 502 1011 263 1011 q 881 851 739 1011 q 1008 501 1008 708 q 883 151 1008 292 q 502 -7 744 -7 m 502 60 q 830 197 709 60 q 940 501 940 322 q 831 805 940 681 q 502 944 709 944 q 174 805 296 944 q 65 501 65 680 q 173 197 65 320 q 502 60 294 60 m 741 394 q 661 246 731 302 q 496 190 591 190 q 294 285 369 190 q 228 497 228 370 q 295 714 228 625 q 499 813 370 813 q 656 762 588 813 q 733 625 724 711 l 634 625 q 589 704 629 673 q 498 735 550 735 q 377 666 421 735 q 334 504 334 597 q 374 340 334 408 q 490 272 415 272 q 589 304 549 272 q 638 394 628 337 l 741 394 "},"ώ":{"x_min":0,"x_max":922,"ha":1030,"o":"m 687 1040 l 498 819 l 415 819 l 549 1040 l 687 1040 m 922 339 q 856 97 922 203 q 650 -26 780 -26 q 538 9 587 -26 q 461 103 489 44 q 387 12 436 46 q 277 -22 339 -22 q 69 97 147 -22 q 0 338 0 202 q 45 551 0 444 q 161 737 84 643 l 302 737 q 175 552 219 647 q 124 336 124 446 q 155 179 124 248 q 275 88 197 88 q 375 163 341 88 q 400 294 400 219 l 400 572 l 524 572 l 524 294 q 561 135 524 192 q 643 88 591 88 q 762 182 719 88 q 797 341 797 257 q 745 555 797 450 q 619 737 705 637 l 760 737 q 874 551 835 640 q 922 339 922 444 "},"^":{"x_min":193.0625,"x_max":598.609375,"ha":792,"o":"m 598 772 l 515 772 l 395 931 l 277 772 l 193 772 l 326 1013 l 462 1013 l 598 772 "},"«":{"x_min":0,"x_max":507.203125,"ha":604,"o":"m 506 136 l 284 302 l 284 440 l 506 608 l 507 485 l 360 371 l 506 255 l 506 136 m 222 136 l 0 302 l 0 440 l 222 608 l 221 486 l 73 373 l 222 256 l 222 136 "},"D":{"x_min":0,"x_max":828,"ha":935,"o":"m 389 1013 q 714 867 593 1013 q 828 521 828 729 q 712 161 828 309 q 382 0 587 0 l 0 0 l 0 1013 l 389 1013 m 376 124 q 607 247 523 124 q 681 510 681 355 q 607 771 681 662 q 376 896 522 896 l 139 896 l 139 124 l 376 124 "},"∙":{"x_min":0,"x_max":142,"ha":239,"o":"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 "},"ÿ":{"x_min":0,"x_max":47,"ha":125,"o":"m 47 3 q 37 -7 47 -7 q 28 0 30 -7 q 39 -4 32 -4 q 45 3 45 -1 l 37 0 q 28 9 28 0 q 39 19 28 19 l 47 16 l 47 19 l 47 3 m 37 1 q 44 8 44 1 q 37 16 44 16 q 30 8 30 16 q 37 1 30 1 m 26 1 l 23 22 l 14 0 l 3 22 l 3 3 l 0 25 l 13 1 l 22 25 l 26 1 "},"w":{"x_min":0,"x_max":1009.71875,"ha":1100,"o":"m 1009 738 l 783 0 l 658 0 l 501 567 l 345 0 l 222 0 l 0 738 l 130 738 l 284 174 l 432 737 l 576 738 l 721 173 l 881 737 l 1009 738 "},"$":{"x_min":0,"x_max":700,"ha":793,"o":"m 664 717 l 542 717 q 490 825 531 785 q 381 872 450 865 l 381 551 q 620 446 540 522 q 700 241 700 370 q 618 45 700 116 q 381 -25 536 -25 l 381 -152 l 307 -152 l 307 -25 q 81 62 162 -25 q 0 297 0 149 l 124 297 q 169 146 124 204 q 307 81 215 89 l 307 441 q 80 536 148 469 q 13 725 13 603 q 96 910 13 839 q 307 982 180 982 l 307 1077 l 381 1077 l 381 982 q 574 917 494 982 q 664 717 664 845 m 307 565 l 307 872 q 187 831 233 872 q 142 724 142 791 q 180 618 142 656 q 307 565 218 580 m 381 76 q 562 237 562 96 q 517 361 562 313 q 381 423 472 409 l 381 76 "},"\\":{"x_min":-0.015625,"x_max":425.0625,"ha":522,"o":"m 425 -129 l 337 -129 l 0 1041 l 83 1041 l 425 -129 "},"µ":{"x_min":0,"x_max":697.21875,"ha":747,"o":"m 697 -4 q 629 -14 658 -14 q 498 97 513 -14 q 422 9 470 41 q 313 -23 374 -23 q 207 4 258 -23 q 119 81 156 32 l 119 -278 l 0 -278 l 0 738 l 124 738 l 124 343 q 165 173 124 246 q 308 83 216 83 q 452 178 402 83 q 493 359 493 255 l 493 738 l 617 738 l 617 214 q 623 136 617 160 q 673 92 637 92 q 697 96 684 92 l 697 -4 "},"Ι":{"x_min":42,"x_max":181,"ha":297,"o":"m 181 0 l 42 0 l 42 1013 l 181 1013 l 181 0 "},"Ύ":{"x_min":0,"x_max":1144.5,"ha":1214,"o":"m 1144 1012 l 807 416 l 807 0 l 667 0 l 667 416 l 325 1012 l 465 1012 l 736 533 l 1004 1012 l 1144 1012 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 "},"’":{"x_min":0,"x_max":139,"ha":236,"o":"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 "},"Ν":{"x_min":0,"x_max":801,"ha":915,"o":"m 801 0 l 651 0 l 131 822 l 131 0 l 0 0 l 0 1013 l 151 1013 l 670 191 l 670 1013 l 801 1013 l 801 0 "},"-":{"x_min":8.71875,"x_max":350.390625,"ha":478,"o":"m 350 317 l 8 317 l 8 428 l 350 428 l 350 317 "},"Q":{"x_min":0,"x_max":968,"ha":1072,"o":"m 954 5 l 887 -79 l 744 35 q 622 -11 687 2 q 483 -26 556 -26 q 127 130 262 -26 q 0 504 0 279 q 127 880 0 728 q 484 1041 262 1041 q 841 884 708 1041 q 968 507 968 735 q 933 293 968 398 q 832 104 899 188 l 954 5 m 723 191 q 802 330 777 248 q 828 499 828 412 q 744 790 828 673 q 483 922 650 922 q 228 791 322 922 q 142 505 142 673 q 227 221 142 337 q 487 91 323 91 q 632 123 566 91 l 520 215 l 587 301 l 723 191 "},"ς":{"x_min":1,"x_max":676.28125,"ha":740,"o":"m 676 460 l 551 460 q 498 595 542 546 q 365 651 448 651 q 199 578 263 651 q 136 401 136 505 q 266 178 136 241 q 508 106 387 142 q 640 -50 640 62 q 625 -158 640 -105 q 583 -278 611 -211 l 465 -278 q 498 -182 490 -211 q 515 -80 515 -126 q 381 12 515 -15 q 134 91 197 51 q 1 388 1 179 q 100 651 1 542 q 354 761 199 761 q 587 680 498 761 q 676 460 676 599 "},"M":{"x_min":0,"x_max":954,"ha":1067,"o":"m 954 0 l 819 0 l 819 869 l 537 0 l 405 0 l 128 866 l 128 0 l 0 0 l 0 1013 l 200 1013 l 472 160 l 757 1013 l 954 1013 l 954 0 "},"Ψ":{"x_min":0,"x_max":1006,"ha":1094,"o":"m 1006 678 q 914 319 1006 429 q 571 200 814 200 l 571 0 l 433 0 l 433 200 q 92 319 194 200 q 0 678 0 429 l 0 1013 l 139 1013 l 139 679 q 191 417 139 492 q 433 326 255 326 l 433 1013 l 571 1013 l 571 326 l 580 326 q 813 423 747 326 q 868 679 868 502 l 868 1013 l 1006 1013 l 1006 678 "},"C":{"x_min":0,"x_max":886,"ha":944,"o":"m 886 379 q 760 87 886 201 q 455 -26 634 -26 q 112 136 236 -26 q 0 509 0 283 q 118 882 0 737 q 469 1041 245 1041 q 748 955 630 1041 q 879 708 879 859 l 745 708 q 649 862 724 805 q 473 920 573 920 q 219 791 312 920 q 136 509 136 675 q 217 229 136 344 q 470 99 311 99 q 672 179 591 99 q 753 379 753 259 l 886 379 "},"!":{"x_min":0,"x_max":138,"ha":236,"o":"m 138 684 q 116 409 138 629 q 105 244 105 299 l 33 244 q 16 465 33 313 q 0 684 0 616 l 0 1013 l 138 1013 l 138 684 m 138 0 l 0 0 l 0 151 l 138 151 l 138 0 "},"{":{"x_min":0,"x_max":480.5625,"ha":578,"o":"m 480 -286 q 237 -213 303 -286 q 187 -45 187 -159 q 194 48 187 -15 q 201 141 201 112 q 164 264 201 225 q 0 314 118 314 l 0 417 q 164 471 119 417 q 201 605 201 514 q 199 665 201 644 q 193 772 193 769 q 241 941 193 887 q 480 1015 308 1015 l 480 915 q 336 866 375 915 q 306 742 306 828 q 310 662 306 717 q 314 577 314 606 q 288 452 314 500 q 176 365 256 391 q 289 275 257 337 q 314 143 314 226 q 313 84 314 107 q 310 -11 310 -5 q 339 -131 310 -94 q 480 -182 377 -182 l 480 -286 "},"X":{"x_min":-0.015625,"x_max":854.15625,"ha":940,"o":"m 854 0 l 683 0 l 423 409 l 166 0 l 0 0 l 347 519 l 18 1013 l 186 1013 l 428 637 l 675 1013 l 836 1013 l 504 520 l 854 0 "},"#":{"x_min":0,"x_max":963.890625,"ha":1061,"o":"m 963 690 l 927 590 l 719 590 l 655 410 l 876 410 l 840 310 l 618 310 l 508 -3 l 393 -2 l 506 309 l 329 310 l 215 -2 l 102 -3 l 212 310 l 0 310 l 36 410 l 248 409 l 312 590 l 86 590 l 120 690 l 347 690 l 459 1006 l 573 1006 l 462 690 l 640 690 l 751 1006 l 865 1006 l 754 690 l 963 690 m 606 590 l 425 590 l 362 410 l 543 410 l 606 590 "},"ι":{"x_min":42,"x_max":284,"ha":361,"o":"m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 738 l 167 738 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 103 239 101 q 284 112 257 104 l 284 3 "},"Ά":{"x_min":0,"x_max":906.953125,"ha":982,"o":"m 283 1040 l 88 799 l 5 799 l 145 1040 l 283 1040 m 906 0 l 756 0 l 650 303 l 251 303 l 143 0 l 0 0 l 376 1012 l 529 1012 l 906 0 m 609 421 l 452 866 l 293 421 l 609 421 "},")":{"x_min":0,"x_max":318,"ha":415,"o":"m 318 365 q 257 25 318 191 q 87 -290 197 -141 l 0 -290 q 140 21 93 -128 q 193 360 193 189 q 141 704 193 537 q 0 1024 97 850 l 87 1024 q 257 706 197 871 q 318 365 318 542 "},"ε":{"x_min":0,"x_max":634.71875,"ha":714,"o":"m 634 234 q 527 38 634 110 q 300 -25 433 -25 q 98 29 183 -25 q 0 204 0 93 q 37 314 0 265 q 128 390 67 353 q 56 460 82 419 q 26 555 26 505 q 114 712 26 654 q 295 763 191 763 q 499 700 416 763 q 589 515 589 631 l 478 515 q 419 618 464 580 q 307 657 374 657 q 207 630 253 657 q 151 547 151 598 q 238 445 151 469 q 389 434 280 434 l 389 331 l 349 331 q 206 315 255 331 q 125 210 125 287 q 183 107 125 145 q 302 76 233 76 q 436 117 379 76 q 509 234 493 159 l 634 234 "},"Δ":{"x_min":0,"x_max":952.78125,"ha":1028,"o":"m 952 0 l 0 0 l 400 1013 l 551 1013 l 952 0 m 762 124 l 476 867 l 187 124 l 762 124 "},"}":{"x_min":0,"x_max":481,"ha":578,"o":"m 481 314 q 318 262 364 314 q 282 136 282 222 q 284 65 282 97 q 293 -58 293 -48 q 241 -217 293 -166 q 0 -286 174 -286 l 0 -182 q 143 -130 105 -182 q 171 -2 171 -93 q 168 81 171 22 q 165 144 165 140 q 188 275 165 229 q 306 365 220 339 q 191 455 224 391 q 165 588 165 505 q 168 681 165 624 q 171 742 171 737 q 141 865 171 827 q 0 915 102 915 l 0 1015 q 243 942 176 1015 q 293 773 293 888 q 287 675 293 741 q 282 590 282 608 q 318 466 282 505 q 481 417 364 417 l 481 314 "},"‰":{"x_min":-3,"x_max":1672,"ha":1821,"o":"m 846 0 q 664 76 732 0 q 603 244 603 145 q 662 412 603 344 q 846 489 729 489 q 1027 412 959 489 q 1089 244 1089 343 q 1029 76 1089 144 q 846 0 962 0 m 845 103 q 945 143 910 103 q 981 243 981 184 q 947 340 981 301 q 845 385 910 385 q 745 342 782 385 q 709 243 709 300 q 742 147 709 186 q 845 103 781 103 m 888 986 l 284 -25 l 199 -25 l 803 986 l 888 986 m 241 468 q 58 545 126 468 q -3 715 -3 615 q 56 881 -3 813 q 238 958 124 958 q 421 881 353 958 q 483 712 483 813 q 423 544 483 612 q 241 468 356 468 m 241 855 q 137 811 175 855 q 100 710 100 768 q 136 612 100 653 q 240 572 172 572 q 344 614 306 572 q 382 713 382 656 q 347 810 382 771 q 241 855 308 855 m 1428 0 q 1246 76 1314 0 q 1185 244 1185 145 q 1244 412 1185 344 q 1428 489 1311 489 q 1610 412 1542 489 q 1672 244 1672 343 q 1612 76 1672 144 q 1428 0 1545 0 m 1427 103 q 1528 143 1492 103 q 1564 243 1564 184 q 1530 340 1564 301 q 1427 385 1492 385 q 1327 342 1364 385 q 1291 243 1291 300 q 1324 147 1291 186 q 1427 103 1363 103 "},"a":{"x_min":0,"x_max":698.609375,"ha":794,"o":"m 698 0 q 661 -12 679 -7 q 615 -17 643 -17 q 536 12 564 -17 q 500 96 508 41 q 384 6 456 37 q 236 -25 312 -25 q 65 31 130 -25 q 0 194 0 88 q 118 390 0 334 q 328 435 180 420 q 488 483 476 451 q 495 523 495 504 q 442 619 495 584 q 325 654 389 654 q 209 617 257 654 q 152 513 161 580 l 33 513 q 123 705 33 633 q 332 772 207 772 q 528 712 448 772 q 617 531 617 645 l 617 163 q 624 108 617 126 q 664 90 632 90 l 698 94 l 698 0 m 491 262 l 491 372 q 272 329 350 347 q 128 201 128 294 q 166 113 128 144 q 264 83 205 83 q 414 130 346 83 q 491 262 491 183 "},"—":{"x_min":0,"x_max":941.671875,"ha":1039,"o":"m 941 334 l 0 334 l 0 410 l 941 410 l 941 334 "},"=":{"x_min":8.71875,"x_max":780.953125,"ha":792,"o":"m 780 510 l 8 510 l 8 606 l 780 606 l 780 510 m 780 235 l 8 235 l 8 332 l 780 332 l 780 235 "},"N":{"x_min":0,"x_max":801,"ha":914,"o":"m 801 0 l 651 0 l 131 823 l 131 0 l 0 0 l 0 1013 l 151 1013 l 670 193 l 670 1013 l 801 1013 l 801 0 "},"ρ":{"x_min":0,"x_max":712,"ha":797,"o":"m 712 369 q 620 94 712 207 q 362 -26 521 -26 q 230 2 292 -26 q 119 83 167 30 l 119 -278 l 0 -278 l 0 362 q 91 643 0 531 q 355 764 190 764 q 617 647 517 764 q 712 369 712 536 m 583 366 q 530 559 583 480 q 359 651 469 651 q 190 562 252 651 q 135 370 135 483 q 189 176 135 257 q 359 85 250 85 q 528 175 466 85 q 583 366 583 254 "},"2":{"x_min":59,"x_max":731,"ha":792,"o":"m 731 0 l 59 0 q 197 314 59 188 q 457 487 199 315 q 598 691 598 580 q 543 819 598 772 q 411 867 488 867 q 272 811 328 867 q 209 630 209 747 l 81 630 q 182 901 81 805 q 408 986 271 986 q 629 909 536 986 q 731 694 731 826 q 613 449 731 541 q 378 316 495 383 q 201 122 235 234 l 731 122 l 731 0 "},"¯":{"x_min":0,"x_max":941.671875,"ha":938,"o":"m 941 1033 l 0 1033 l 0 1109 l 941 1109 l 941 1033 "},"Z":{"x_min":0,"x_max":779,"ha":849,"o":"m 779 0 l 0 0 l 0 113 l 621 896 l 40 896 l 40 1013 l 779 1013 l 778 887 l 171 124 l 779 124 l 779 0 "},"u":{"x_min":0,"x_max":617,"ha":729,"o":"m 617 0 l 499 0 l 499 110 q 391 10 460 45 q 246 -25 322 -25 q 61 58 127 -25 q 0 258 0 136 l 0 738 l 125 738 l 125 284 q 156 148 125 202 q 273 82 197 82 q 433 165 369 82 q 493 340 493 243 l 493 738 l 617 738 l 617 0 "},"k":{"x_min":0,"x_max":612.484375,"ha":697,"o":"m 612 738 l 338 465 l 608 0 l 469 0 l 251 382 l 121 251 l 121 0 l 0 0 l 0 1013 l 121 1013 l 121 402 l 456 738 l 612 738 "},"Η":{"x_min":0,"x_max":803,"ha":917,"o":"m 803 0 l 667 0 l 667 475 l 140 475 l 140 0 l 0 0 l 0 1013 l 140 1013 l 140 599 l 667 599 l 667 1013 l 803 1013 l 803 0 "},"Α":{"x_min":0,"x_max":906.953125,"ha":985,"o":"m 906 0 l 756 0 l 650 303 l 251 303 l 143 0 l 0 0 l 376 1013 l 529 1013 l 906 0 m 609 421 l 452 866 l 293 421 l 609 421 "},"s":{"x_min":0,"x_max":604,"ha":697,"o":"m 604 217 q 501 36 604 104 q 292 -23 411 -23 q 86 43 166 -23 q 0 238 0 114 l 121 237 q 175 122 121 164 q 300 85 223 85 q 415 112 363 85 q 479 207 479 147 q 361 309 479 276 q 140 372 141 370 q 21 544 21 426 q 111 708 21 647 q 298 761 190 761 q 492 705 413 761 q 583 531 583 643 l 462 531 q 412 625 462 594 q 298 657 363 657 q 199 636 242 657 q 143 558 143 608 q 262 454 143 486 q 484 394 479 397 q 604 217 604 341 "},"B":{"x_min":0,"x_max":778,"ha":876,"o":"m 580 546 q 724 469 670 535 q 778 311 778 403 q 673 83 778 171 q 432 0 575 0 l 0 0 l 0 1013 l 411 1013 q 629 957 541 1013 q 732 768 732 892 q 691 633 732 693 q 580 546 650 572 m 393 899 l 139 899 l 139 588 l 379 588 q 521 624 462 588 q 592 744 592 667 q 531 859 592 819 q 393 899 471 899 m 419 124 q 566 169 504 124 q 635 303 635 219 q 559 436 635 389 q 402 477 494 477 l 139 477 l 139 124 l 419 124 "},"…":{"x_min":0,"x_max":614,"ha":708,"o":"m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 m 378 0 l 236 0 l 236 151 l 378 151 l 378 0 m 614 0 l 472 0 l 472 151 l 614 151 l 614 0 "},"?":{"x_min":0,"x_max":607,"ha":704,"o":"m 607 777 q 543 599 607 674 q 422 474 482 537 q 357 272 357 391 l 236 272 q 297 487 236 395 q 411 619 298 490 q 474 762 474 691 q 422 885 474 838 q 301 933 371 933 q 179 880 228 933 q 124 706 124 819 l 0 706 q 94 963 0 872 q 302 1044 177 1044 q 511 973 423 1044 q 607 777 607 895 m 370 0 l 230 0 l 230 151 l 370 151 l 370 0 "},"H":{"x_min":0,"x_max":803,"ha":915,"o":"m 803 0 l 667 0 l 667 475 l 140 475 l 140 0 l 0 0 l 0 1013 l 140 1013 l 140 599 l 667 599 l 667 1013 l 803 1013 l 803 0 "},"ν":{"x_min":0,"x_max":675,"ha":761,"o":"m 675 738 l 404 0 l 272 0 l 0 738 l 133 738 l 340 147 l 541 738 l 675 738 "},"c":{"x_min":1,"x_max":701.390625,"ha":775,"o":"m 701 264 q 584 53 681 133 q 353 -26 487 -26 q 91 91 188 -26 q 1 370 1 201 q 92 645 1 537 q 353 761 190 761 q 572 688 479 761 q 690 493 666 615 l 556 493 q 487 606 545 562 q 356 650 428 650 q 186 563 246 650 q 134 372 134 487 q 188 179 134 258 q 359 88 250 88 q 492 136 437 88 q 566 264 548 185 l 701 264 "},"¶":{"x_min":0,"x_max":566.671875,"ha":678,"o":"m 21 892 l 52 892 l 98 761 l 145 892 l 176 892 l 178 741 l 157 741 l 157 867 l 108 741 l 88 741 l 40 871 l 40 741 l 21 741 l 21 892 m 308 854 l 308 731 q 252 691 308 691 q 227 691 240 691 q 207 696 213 695 l 207 712 l 253 706 q 288 733 288 706 l 288 763 q 244 741 279 741 q 193 797 193 741 q 261 860 193 860 q 287 860 273 860 q 308 854 302 855 m 288 842 l 263 843 q 213 796 213 843 q 248 756 213 756 q 288 796 288 756 l 288 842 m 566 988 l 502 988 l 502 -1 l 439 -1 l 439 988 l 317 988 l 317 -1 l 252 -1 l 252 602 q 81 653 155 602 q 0 805 0 711 q 101 989 0 918 q 309 1053 194 1053 l 566 1053 l 566 988 "},"β":{"x_min":0,"x_max":660,"ha":745,"o":"m 471 550 q 610 450 561 522 q 660 280 660 378 q 578 64 660 151 q 367 -22 497 -22 q 239 5 299 -22 q 126 82 178 32 l 126 -278 l 0 -278 l 0 593 q 54 903 0 801 q 318 1042 127 1042 q 519 964 436 1042 q 603 771 603 887 q 567 644 603 701 q 471 550 532 586 m 337 79 q 476 138 418 79 q 535 279 535 198 q 427 437 535 386 q 226 477 344 477 l 226 583 q 398 620 329 583 q 486 762 486 668 q 435 884 486 833 q 312 935 384 935 q 169 861 219 935 q 126 698 126 797 l 126 362 q 170 169 126 242 q 337 79 224 79 "},"Μ":{"x_min":0,"x_max":954,"ha":1068,"o":"m 954 0 l 819 0 l 819 868 l 537 0 l 405 0 l 128 865 l 128 0 l 0 0 l 0 1013 l 199 1013 l 472 158 l 758 1013 l 954 1013 l 954 0 "},"Ό":{"x_min":0.109375,"x_max":1120,"ha":1217,"o":"m 1120 505 q 994 132 1120 282 q 642 -29 861 -29 q 290 130 422 -29 q 167 505 167 280 q 294 883 167 730 q 650 1046 430 1046 q 999 882 868 1046 q 1120 505 1120 730 m 977 504 q 896 784 977 669 q 644 915 804 915 q 391 785 484 915 q 307 504 307 669 q 391 224 307 339 q 644 95 486 95 q 894 224 803 95 q 977 504 977 339 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 "},"Ή":{"x_min":0,"x_max":1158,"ha":1275,"o":"m 1158 0 l 1022 0 l 1022 475 l 496 475 l 496 0 l 356 0 l 356 1012 l 496 1012 l 496 599 l 1022 599 l 1022 1012 l 1158 1012 l 1158 0 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 "},"•":{"x_min":0,"x_max":663.890625,"ha":775,"o":"m 663 529 q 566 293 663 391 q 331 196 469 196 q 97 294 194 196 q 0 529 0 393 q 96 763 0 665 q 331 861 193 861 q 566 763 469 861 q 663 529 663 665 "},"¥":{"x_min":0.1875,"x_max":819.546875,"ha":886,"o":"m 563 561 l 697 561 l 696 487 l 520 487 l 482 416 l 482 380 l 697 380 l 695 308 l 482 308 l 482 0 l 342 0 l 342 308 l 125 308 l 125 380 l 342 380 l 342 417 l 303 487 l 125 487 l 125 561 l 258 561 l 0 1013 l 140 1013 l 411 533 l 679 1013 l 819 1013 l 563 561 "},"(":{"x_min":0,"x_max":318.0625,"ha":415,"o":"m 318 -290 l 230 -290 q 61 23 122 -142 q 0 365 0 190 q 62 712 0 540 q 230 1024 119 869 l 318 1024 q 175 705 219 853 q 125 360 125 542 q 176 22 125 187 q 318 -290 223 -127 "},"U":{"x_min":0,"x_max":796,"ha":904,"o":"m 796 393 q 681 93 796 212 q 386 -25 566 -25 q 101 95 208 -25 q 0 393 0 211 l 0 1013 l 138 1013 l 138 391 q 204 191 138 270 q 394 107 276 107 q 586 191 512 107 q 656 391 656 270 l 656 1013 l 796 1013 l 796 393 "},"γ":{"x_min":0.5,"x_max":744.953125,"ha":822,"o":"m 744 737 l 463 54 l 463 -278 l 338 -278 l 338 54 l 154 495 q 104 597 124 569 q 13 651 67 651 l 0 651 l 0 751 l 39 753 q 168 711 121 753 q 242 594 207 676 l 403 208 l 617 737 l 744 737 "},"α":{"x_min":0,"x_max":765.5625,"ha":809,"o":"m 765 -4 q 698 -14 726 -14 q 564 97 586 -14 q 466 7 525 40 q 337 -26 407 -26 q 88 98 186 -26 q 0 369 0 212 q 88 637 0 525 q 337 760 184 760 q 465 728 407 760 q 563 637 524 696 l 563 739 l 685 739 l 685 222 q 693 141 685 168 q 748 94 708 94 q 765 96 760 94 l 765 -4 m 584 371 q 531 562 584 485 q 360 653 470 653 q 192 566 254 653 q 135 379 135 489 q 186 181 135 261 q 358 84 247 84 q 528 176 465 84 q 584 371 584 260 "},"F":{"x_min":0,"x_max":683.328125,"ha":717,"o":"m 683 888 l 140 888 l 140 583 l 613 583 l 613 458 l 140 458 l 140 0 l 0 0 l 0 1013 l 683 1013 l 683 888 "},"­":{"x_min":0,"x_max":705.5625,"ha":803,"o":"m 705 334 l 0 334 l 0 410 l 705 410 l 705 334 "},":":{"x_min":0,"x_max":142,"ha":239,"o":"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 "},"Χ":{"x_min":0,"x_max":854.171875,"ha":935,"o":"m 854 0 l 683 0 l 423 409 l 166 0 l 0 0 l 347 519 l 18 1013 l 186 1013 l 427 637 l 675 1013 l 836 1013 l 504 521 l 854 0 "},"*":{"x_min":116,"x_max":674,"ha":792,"o":"m 674 768 l 475 713 l 610 544 l 517 477 l 394 652 l 272 478 l 178 544 l 314 713 l 116 766 l 153 876 l 341 812 l 342 1013 l 446 1013 l 446 811 l 635 874 l 674 768 "},"†":{"x_min":0,"x_max":777,"ha":835,"o":"m 458 804 l 777 804 l 777 683 l 458 683 l 458 0 l 319 0 l 319 681 l 0 683 l 0 804 l 319 804 l 319 1015 l 458 1013 l 458 804 "},"°":{"x_min":0,"x_max":347,"ha":444,"o":"m 173 802 q 43 856 91 802 q 0 977 0 905 q 45 1101 0 1049 q 173 1153 90 1153 q 303 1098 255 1153 q 347 977 347 1049 q 303 856 347 905 q 173 802 256 802 m 173 884 q 238 910 214 884 q 262 973 262 937 q 239 1038 262 1012 q 173 1064 217 1064 q 108 1037 132 1064 q 85 973 85 1010 q 108 910 85 937 q 173 884 132 884 "},"V":{"x_min":0,"x_max":862.71875,"ha":940,"o":"m 862 1013 l 505 0 l 361 0 l 0 1013 l 143 1013 l 434 165 l 718 1012 l 862 1013 "},"Ξ":{"x_min":0,"x_max":734.71875,"ha":763,"o":"m 723 889 l 9 889 l 9 1013 l 723 1013 l 723 889 m 673 463 l 61 463 l 61 589 l 673 589 l 673 463 m 734 0 l 0 0 l 0 124 l 734 124 l 734 0 "}," ":{"x_min":0,"x_max":0,"ha":853},"Ϋ":{"x_min":0.328125,"x_max":819.515625,"ha":889,"o":"m 588 1046 l 460 1046 l 460 1189 l 588 1189 l 588 1046 m 360 1046 l 232 1046 l 232 1189 l 360 1189 l 360 1046 m 819 1012 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1012 l 140 1012 l 411 533 l 679 1012 l 819 1012 "},"0":{"x_min":73,"x_max":715,"ha":792,"o":"m 394 -29 q 153 129 242 -29 q 73 479 73 272 q 152 829 73 687 q 394 989 241 989 q 634 829 545 989 q 715 479 715 684 q 635 129 715 270 q 394 -29 546 -29 m 394 89 q 546 211 489 89 q 598 479 598 322 q 548 748 598 640 q 394 871 491 871 q 241 748 298 871 q 190 479 190 637 q 239 211 190 319 q 394 89 296 89 "},"”":{"x_min":0,"x_max":347,"ha":454,"o":"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 m 347 851 q 310 737 347 784 q 208 669 273 690 l 208 734 q 267 787 250 741 q 280 873 280 821 l 208 873 l 208 1013 l 347 1013 l 347 851 "},"@":{"x_min":0,"x_max":1260,"ha":1357,"o":"m 1098 -45 q 877 -160 1001 -117 q 633 -203 752 -203 q 155 -29 327 -203 q 0 360 0 127 q 176 802 0 616 q 687 1008 372 1008 q 1123 854 969 1008 q 1260 517 1260 718 q 1155 216 1260 341 q 868 82 1044 82 q 772 106 801 82 q 737 202 737 135 q 647 113 700 144 q 527 82 594 82 q 367 147 420 82 q 314 312 314 212 q 401 565 314 452 q 639 690 498 690 q 810 588 760 690 l 849 668 l 938 668 q 877 441 900 532 q 833 226 833 268 q 853 182 833 198 q 902 167 873 167 q 1088 272 1012 167 q 1159 512 1159 372 q 1051 793 1159 681 q 687 925 925 925 q 248 747 415 925 q 97 361 97 586 q 226 26 97 159 q 627 -122 370 -122 q 856 -87 737 -122 q 1061 8 976 -53 l 1098 -45 m 786 488 q 738 580 777 545 q 643 615 700 615 q 483 517 548 615 q 425 322 425 430 q 457 203 425 250 q 552 156 490 156 q 722 273 665 156 q 786 488 738 309 "},"Ί":{"x_min":0,"x_max":499,"ha":613,"o":"m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 m 499 0 l 360 0 l 360 1012 l 499 1012 l 499 0 "},"i":{"x_min":14,"x_max":136,"ha":275,"o":"m 136 873 l 14 873 l 14 1013 l 136 1013 l 136 873 m 136 0 l 14 0 l 14 737 l 136 737 l 136 0 "},"Β":{"x_min":0,"x_max":778,"ha":877,"o":"m 580 545 q 724 468 671 534 q 778 310 778 402 q 673 83 778 170 q 432 0 575 0 l 0 0 l 0 1013 l 411 1013 q 629 957 541 1013 q 732 768 732 891 q 691 632 732 692 q 580 545 650 571 m 393 899 l 139 899 l 139 587 l 379 587 q 521 623 462 587 q 592 744 592 666 q 531 859 592 819 q 393 899 471 899 m 419 124 q 566 169 504 124 q 635 302 635 219 q 559 435 635 388 q 402 476 494 476 l 139 476 l 139 124 l 419 124 "},"υ":{"x_min":0,"x_max":617,"ha":725,"o":"m 617 352 q 540 94 617 199 q 308 -24 455 -24 q 76 94 161 -24 q 0 352 0 199 l 0 739 l 126 739 l 126 355 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 355 492 257 l 492 739 l 617 739 l 617 352 "},"]":{"x_min":0,"x_max":275,"ha":372,"o":"m 275 -281 l 0 -281 l 0 -187 l 151 -187 l 151 920 l 0 920 l 0 1013 l 275 1013 l 275 -281 "},"m":{"x_min":0,"x_max":1019,"ha":1128,"o":"m 1019 0 l 897 0 l 897 454 q 860 591 897 536 q 739 660 816 660 q 613 586 659 660 q 573 436 573 522 l 573 0 l 447 0 l 447 455 q 412 591 447 535 q 294 657 372 657 q 165 586 213 657 q 122 437 122 521 l 122 0 l 0 0 l 0 738 l 117 738 l 117 640 q 202 730 150 697 q 316 763 254 763 q 437 730 381 763 q 525 642 494 697 q 621 731 559 700 q 753 763 682 763 q 943 694 867 763 q 1019 512 1019 625 l 1019 0 "},"χ":{"x_min":8.328125,"x_max":780.5625,"ha":815,"o":"m 780 -278 q 715 -294 747 -294 q 616 -257 663 -294 q 548 -175 576 -227 l 379 133 l 143 -277 l 9 -277 l 313 254 l 163 522 q 127 586 131 580 q 36 640 91 640 q 8 637 27 640 l 8 752 l 52 757 q 162 719 113 757 q 236 627 200 690 l 383 372 l 594 737 l 726 737 l 448 250 l 625 -69 q 670 -153 647 -110 q 743 -188 695 -188 q 780 -184 759 -188 l 780 -278 "},"8":{"x_min":55,"x_max":736,"ha":792,"o":"m 571 527 q 694 424 652 491 q 736 280 736 358 q 648 71 736 158 q 395 -26 551 -26 q 142 69 238 -26 q 55 279 55 157 q 96 425 55 359 q 220 527 138 491 q 120 615 153 562 q 88 726 88 668 q 171 904 88 827 q 395 986 261 986 q 618 905 529 986 q 702 727 702 830 q 670 616 702 667 q 571 527 638 565 m 394 565 q 519 610 475 565 q 563 717 563 655 q 521 823 563 781 q 392 872 474 872 q 265 824 312 872 q 224 720 224 783 q 265 613 224 656 q 394 565 312 565 m 395 91 q 545 150 488 91 q 597 280 597 204 q 546 408 597 355 q 395 465 492 465 q 244 408 299 465 q 194 280 194 356 q 244 150 194 203 q 395 91 299 91 "},"ί":{"x_min":42,"x_max":326.71875,"ha":361,"o":"m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 737 l 167 737 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 102 239 101 q 284 112 257 104 l 284 3 m 326 1040 l 137 819 l 54 819 l 189 1040 l 326 1040 "},"Ζ":{"x_min":0,"x_max":779.171875,"ha":850,"o":"m 779 0 l 0 0 l 0 113 l 620 896 l 40 896 l 40 1013 l 779 1013 l 779 887 l 170 124 l 779 124 l 779 0 "},"R":{"x_min":0,"x_max":781.953125,"ha":907,"o":"m 781 0 l 623 0 q 587 242 590 52 q 407 433 585 433 l 138 433 l 138 0 l 0 0 l 0 1013 l 396 1013 q 636 946 539 1013 q 749 731 749 868 q 711 597 749 659 q 608 502 674 534 q 718 370 696 474 q 729 207 722 352 q 781 26 736 62 l 781 0 m 373 551 q 533 594 465 551 q 614 731 614 645 q 532 859 614 815 q 373 896 465 896 l 138 896 l 138 551 l 373 551 "},"o":{"x_min":0,"x_max":713,"ha":821,"o":"m 357 -25 q 94 91 194 -25 q 0 368 0 202 q 93 642 0 533 q 357 761 193 761 q 618 644 518 761 q 713 368 713 533 q 619 91 713 201 q 357 -25 521 -25 m 357 85 q 528 175 465 85 q 584 369 584 255 q 529 562 584 484 q 357 651 467 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 357 85 250 85 "},"5":{"x_min":54.171875,"x_max":738,"ha":792,"o":"m 738 314 q 626 60 738 153 q 382 -23 526 -23 q 155 47 248 -23 q 54 256 54 125 l 183 256 q 259 132 204 174 q 382 91 314 91 q 533 149 471 91 q 602 314 602 213 q 538 469 602 411 q 386 528 475 528 q 284 506 332 528 q 197 439 237 484 l 81 439 l 159 958 l 684 958 l 684 840 l 254 840 l 214 579 q 306 627 258 612 q 407 643 354 643 q 636 552 540 643 q 738 314 738 457 "},"7":{"x_min":58.71875,"x_max":730.953125,"ha":792,"o":"m 730 839 q 469 448 560 641 q 335 0 378 255 l 192 0 q 328 441 235 252 q 593 830 421 630 l 58 830 l 58 958 l 730 958 l 730 839 "},"K":{"x_min":0,"x_max":819.46875,"ha":906,"o":"m 819 0 l 649 0 l 294 509 l 139 355 l 139 0 l 0 0 l 0 1013 l 139 1013 l 139 526 l 626 1013 l 809 1013 l 395 600 l 819 0 "},",":{"x_min":0,"x_max":142,"ha":239,"o":"m 142 -12 q 105 -132 142 -82 q 0 -205 68 -182 l 0 -138 q 57 -82 40 -124 q 70 0 70 -51 l 0 0 l 0 151 l 142 151 l 142 -12 "},"d":{"x_min":0,"x_max":683,"ha":796,"o":"m 683 0 l 564 0 l 564 93 q 456 6 516 38 q 327 -25 395 -25 q 87 100 181 -25 q 0 365 0 215 q 90 639 0 525 q 343 763 187 763 q 564 647 486 763 l 564 1013 l 683 1013 l 683 0 m 582 373 q 529 562 582 484 q 361 653 468 653 q 190 561 253 653 q 135 365 135 479 q 189 175 135 254 q 358 85 251 85 q 529 178 468 85 q 582 373 582 258 "},"¨":{"x_min":-109,"x_max":247,"ha":232,"o":"m 247 1046 l 119 1046 l 119 1189 l 247 1189 l 247 1046 m 19 1046 l -109 1046 l -109 1189 l 19 1189 l 19 1046 "},"E":{"x_min":0,"x_max":736.109375,"ha":789,"o":"m 736 0 l 0 0 l 0 1013 l 725 1013 l 725 889 l 139 889 l 139 585 l 677 585 l 677 467 l 139 467 l 139 125 l 736 125 l 736 0 "},"Y":{"x_min":0,"x_max":820,"ha":886,"o":"m 820 1013 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1013 l 140 1013 l 411 534 l 679 1012 l 820 1013 "},"\"":{"x_min":0,"x_max":299,"ha":396,"o":"m 299 606 l 203 606 l 203 988 l 299 988 l 299 606 m 96 606 l 0 606 l 0 988 l 96 988 l 96 606 "},"‹":{"x_min":17.984375,"x_max":773.609375,"ha":792,"o":"m 773 40 l 18 376 l 17 465 l 773 799 l 773 692 l 159 420 l 773 149 l 773 40 "},"„":{"x_min":0,"x_max":364,"ha":467,"o":"m 141 -12 q 104 -132 141 -82 q 0 -205 67 -182 l 0 -138 q 56 -82 40 -124 q 69 0 69 -51 l 0 0 l 0 151 l 141 151 l 141 -12 m 364 -12 q 327 -132 364 -82 q 222 -205 290 -182 l 222 -138 q 279 -82 262 -124 q 292 0 292 -51 l 222 0 l 222 151 l 364 151 l 364 -12 "},"δ":{"x_min":1,"x_max":710,"ha":810,"o":"m 710 360 q 616 87 710 196 q 356 -28 518 -28 q 99 82 197 -28 q 1 356 1 192 q 100 606 1 509 q 355 703 199 703 q 180 829 288 754 q 70 903 124 866 l 70 1012 l 643 1012 l 643 901 l 258 901 q 462 763 422 794 q 636 592 577 677 q 710 360 710 485 m 584 365 q 552 501 584 447 q 451 602 521 555 q 372 611 411 611 q 197 541 258 611 q 136 355 136 472 q 190 171 136 245 q 358 85 252 85 q 528 173 465 85 q 584 365 584 252 "},"έ":{"x_min":0,"x_max":634.71875,"ha":714,"o":"m 634 234 q 527 38 634 110 q 300 -25 433 -25 q 98 29 183 -25 q 0 204 0 93 q 37 313 0 265 q 128 390 67 352 q 56 459 82 419 q 26 555 26 505 q 114 712 26 654 q 295 763 191 763 q 499 700 416 763 q 589 515 589 631 l 478 515 q 419 618 464 580 q 307 657 374 657 q 207 630 253 657 q 151 547 151 598 q 238 445 151 469 q 389 434 280 434 l 389 331 l 349 331 q 206 315 255 331 q 125 210 125 287 q 183 107 125 145 q 302 76 233 76 q 436 117 379 76 q 509 234 493 159 l 634 234 m 520 1040 l 331 819 l 248 819 l 383 1040 l 520 1040 "},"ω":{"x_min":0,"x_max":922,"ha":1031,"o":"m 922 339 q 856 97 922 203 q 650 -26 780 -26 q 538 9 587 -26 q 461 103 489 44 q 387 12 436 46 q 277 -22 339 -22 q 69 97 147 -22 q 0 339 0 203 q 45 551 0 444 q 161 738 84 643 l 302 738 q 175 553 219 647 q 124 336 124 446 q 155 179 124 249 q 275 88 197 88 q 375 163 341 88 q 400 294 400 219 l 400 572 l 524 572 l 524 294 q 561 135 524 192 q 643 88 591 88 q 762 182 719 88 q 797 342 797 257 q 745 556 797 450 q 619 738 705 638 l 760 738 q 874 551 835 640 q 922 339 922 444 "},"´":{"x_min":0,"x_max":96,"ha":251,"o":"m 96 606 l 0 606 l 0 988 l 96 988 l 96 606 "},"±":{"x_min":11,"x_max":781,"ha":792,"o":"m 781 490 l 446 490 l 446 255 l 349 255 l 349 490 l 11 490 l 11 586 l 349 586 l 349 819 l 446 819 l 446 586 l 781 586 l 781 490 m 781 21 l 11 21 l 11 115 l 781 115 l 781 21 "},"|":{"x_min":343,"x_max":449,"ha":792,"o":"m 449 462 l 343 462 l 343 986 l 449 986 l 449 462 m 449 -242 l 343 -242 l 343 280 l 449 280 l 449 -242 "},"ϋ":{"x_min":0,"x_max":617,"ha":725,"o":"m 482 800 l 372 800 l 372 925 l 482 925 l 482 800 m 239 800 l 129 800 l 129 925 l 239 925 l 239 800 m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 "},"§":{"x_min":0,"x_max":593,"ha":690,"o":"m 593 425 q 554 312 593 369 q 467 233 516 254 q 537 83 537 172 q 459 -74 537 -12 q 288 -133 387 -133 q 115 -69 184 -133 q 47 96 47 -6 l 166 96 q 199 7 166 40 q 288 -26 232 -26 q 371 -5 332 -26 q 420 60 420 21 q 311 201 420 139 q 108 309 210 255 q 0 490 0 383 q 33 602 0 551 q 124 687 66 654 q 75 743 93 712 q 58 812 58 773 q 133 984 58 920 q 300 1043 201 1043 q 458 987 394 1043 q 529 814 529 925 l 411 814 q 370 908 404 877 q 289 939 336 939 q 213 911 246 939 q 180 841 180 883 q 286 720 180 779 q 484 612 480 615 q 593 425 593 534 m 467 409 q 355 544 467 473 q 196 630 228 612 q 146 587 162 609 q 124 525 124 558 q 239 387 124 462 q 398 298 369 315 q 448 345 429 316 q 467 409 467 375 "},"b":{"x_min":0,"x_max":685,"ha":783,"o":"m 685 372 q 597 99 685 213 q 347 -25 501 -25 q 219 5 277 -25 q 121 93 161 36 l 121 0 l 0 0 l 0 1013 l 121 1013 l 121 634 q 214 723 157 692 q 341 754 272 754 q 591 637 493 754 q 685 372 685 526 m 554 356 q 499 550 554 470 q 328 644 437 644 q 162 556 223 644 q 108 369 108 478 q 160 176 108 256 q 330 83 221 83 q 498 169 435 83 q 554 356 554 245 "},"q":{"x_min":0,"x_max":683,"ha":876,"o":"m 683 -278 l 564 -278 l 564 97 q 474 8 533 39 q 345 -23 415 -23 q 91 93 188 -23 q 0 364 0 203 q 87 635 0 522 q 337 760 184 760 q 466 727 408 760 q 564 637 523 695 l 564 737 l 683 737 l 683 -278 m 582 375 q 527 564 582 488 q 358 652 466 652 q 190 565 253 652 q 135 377 135 488 q 189 179 135 261 q 361 84 251 84 q 530 179 469 84 q 582 375 582 260 "},"Ω":{"x_min":-0.171875,"x_max":969.5625,"ha":1068,"o":"m 969 0 l 555 0 l 555 123 q 744 308 675 194 q 814 558 814 423 q 726 812 814 709 q 484 922 633 922 q 244 820 334 922 q 154 567 154 719 q 223 316 154 433 q 412 123 292 199 l 412 0 l 0 0 l 0 124 l 217 124 q 68 327 122 210 q 15 572 15 444 q 144 911 15 781 q 484 1041 274 1041 q 822 909 691 1041 q 953 569 953 777 q 899 326 953 443 q 750 124 846 210 l 969 124 l 969 0 "},"ύ":{"x_min":0,"x_max":617,"ha":725,"o":"m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 m 535 1040 l 346 819 l 262 819 l 397 1040 l 535 1040 "},"z":{"x_min":-0.015625,"x_max":613.890625,"ha":697,"o":"m 613 0 l 0 0 l 0 100 l 433 630 l 20 630 l 20 738 l 594 738 l 593 636 l 163 110 l 613 110 l 613 0 "},"™":{"x_min":0,"x_max":894,"ha":1000,"o":"m 389 951 l 229 951 l 229 503 l 160 503 l 160 951 l 0 951 l 0 1011 l 389 1011 l 389 951 m 894 503 l 827 503 l 827 939 l 685 503 l 620 503 l 481 937 l 481 503 l 417 503 l 417 1011 l 517 1011 l 653 580 l 796 1010 l 894 1011 l 894 503 "},"ή":{"x_min":0.78125,"x_max":697,"ha":810,"o":"m 697 -278 l 572 -278 l 572 454 q 540 587 572 536 q 425 650 501 650 q 271 579 337 650 q 206 420 206 509 l 206 0 l 81 0 l 81 489 q 73 588 81 562 q 0 644 56 644 l 0 741 q 68 755 38 755 q 158 721 124 755 q 200 630 193 687 q 297 726 234 692 q 434 761 359 761 q 620 692 544 761 q 697 516 697 624 l 697 -278 m 479 1040 l 290 819 l 207 819 l 341 1040 l 479 1040 "},"Θ":{"x_min":0,"x_max":960,"ha":1056,"o":"m 960 507 q 833 129 960 280 q 476 -32 698 -32 q 123 129 255 -32 q 0 507 0 280 q 123 883 0 732 q 476 1045 255 1045 q 832 883 696 1045 q 960 507 960 732 m 817 500 q 733 789 817 669 q 476 924 639 924 q 223 792 317 924 q 142 507 142 675 q 222 222 142 339 q 476 89 315 89 q 730 218 636 89 q 817 500 817 334 m 716 449 l 243 449 l 243 571 l 716 571 l 716 449 "},"®":{"x_min":-3,"x_max":1008,"ha":1106,"o":"m 503 532 q 614 562 566 532 q 672 658 672 598 q 614 747 672 716 q 503 772 569 772 l 338 772 l 338 532 l 503 532 m 502 -7 q 123 151 263 -7 q -3 501 -3 294 q 123 851 -3 706 q 502 1011 263 1011 q 881 851 739 1011 q 1008 501 1008 708 q 883 151 1008 292 q 502 -7 744 -7 m 502 60 q 830 197 709 60 q 940 501 940 322 q 831 805 940 681 q 502 944 709 944 q 174 805 296 944 q 65 501 65 680 q 173 197 65 320 q 502 60 294 60 m 788 146 l 678 146 q 653 316 655 183 q 527 449 652 449 l 338 449 l 338 146 l 241 146 l 241 854 l 518 854 q 688 808 621 854 q 766 658 766 755 q 739 563 766 607 q 668 497 713 519 q 751 331 747 472 q 788 164 756 190 l 788 146 "},"~":{"x_min":0,"x_max":833,"ha":931,"o":"m 833 958 q 778 753 833 831 q 594 665 716 665 q 402 761 502 665 q 240 857 302 857 q 131 795 166 857 q 104 665 104 745 l 0 665 q 54 867 0 789 q 237 958 116 958 q 429 861 331 958 q 594 765 527 765 q 704 827 670 765 q 729 958 729 874 l 833 958 "},"Ε":{"x_min":0,"x_max":736.21875,"ha":778,"o":"m 736 0 l 0 0 l 0 1013 l 725 1013 l 725 889 l 139 889 l 139 585 l 677 585 l 677 467 l 139 467 l 139 125 l 736 125 l 736 0 "},"³":{"x_min":0,"x_max":450,"ha":547,"o":"m 450 552 q 379 413 450 464 q 220 366 313 366 q 69 414 130 366 q 0 567 0 470 l 85 567 q 126 470 85 504 q 225 437 168 437 q 320 467 280 437 q 360 552 360 498 q 318 632 360 608 q 213 657 276 657 q 195 657 203 657 q 176 657 181 657 l 176 722 q 279 733 249 722 q 334 815 334 752 q 300 881 334 856 q 220 907 267 907 q 133 875 169 907 q 97 781 97 844 l 15 781 q 78 926 15 875 q 220 972 135 972 q 364 930 303 972 q 426 817 426 888 q 344 697 426 733 q 421 642 392 681 q 450 552 450 603 "},"[":{"x_min":0,"x_max":273.609375,"ha":371,"o":"m 273 -281 l 0 -281 l 0 1013 l 273 1013 l 273 920 l 124 920 l 124 -187 l 273 -187 l 273 -281 "},"L":{"x_min":0,"x_max":645.828125,"ha":696,"o":"m 645 0 l 0 0 l 0 1013 l 140 1013 l 140 126 l 645 126 l 645 0 "},"σ":{"x_min":0,"x_max":803.390625,"ha":894,"o":"m 803 628 l 633 628 q 713 368 713 512 q 618 93 713 204 q 357 -25 518 -25 q 94 91 194 -25 q 0 368 0 201 q 94 644 0 533 q 356 761 194 761 q 481 750 398 761 q 608 739 564 739 l 803 739 l 803 628 m 360 85 q 529 180 467 85 q 584 374 584 262 q 527 566 584 490 q 352 651 463 651 q 187 559 247 651 q 135 368 135 478 q 189 175 135 254 q 360 85 251 85 "},"ζ":{"x_min":0,"x_max":573,"ha":642,"o":"m 573 -40 q 553 -162 573 -97 q 510 -278 543 -193 l 400 -278 q 441 -187 428 -219 q 462 -90 462 -132 q 378 -14 462 -14 q 108 45 197 -14 q 0 290 0 117 q 108 631 0 462 q 353 901 194 767 l 55 901 l 55 1012 l 561 1012 l 561 924 q 261 669 382 831 q 128 301 128 489 q 243 117 128 149 q 458 98 350 108 q 573 -40 573 80 "},"θ":{"x_min":0,"x_max":674,"ha":778,"o":"m 674 496 q 601 160 674 304 q 336 -26 508 -26 q 73 153 165 -26 q 0 485 0 296 q 72 840 0 683 q 343 1045 166 1045 q 605 844 516 1045 q 674 496 674 692 m 546 579 q 498 798 546 691 q 336 935 437 935 q 178 798 237 935 q 126 579 137 701 l 546 579 m 546 475 l 126 475 q 170 233 126 348 q 338 80 230 80 q 504 233 447 80 q 546 475 546 346 "},"Ο":{"x_min":0,"x_max":958,"ha":1054,"o":"m 485 1042 q 834 883 703 1042 q 958 511 958 735 q 834 136 958 287 q 481 -26 701 -26 q 126 130 261 -26 q 0 504 0 279 q 127 880 0 729 q 485 1042 263 1042 m 480 98 q 731 225 638 98 q 815 504 815 340 q 733 783 815 670 q 480 913 640 913 q 226 785 321 913 q 142 504 142 671 q 226 224 142 339 q 480 98 319 98 "},"Γ":{"x_min":0,"x_max":705.28125,"ha":749,"o":"m 705 886 l 140 886 l 140 0 l 0 0 l 0 1012 l 705 1012 l 705 886 "}," ":{"x_min":0,"x_max":0,"ha":375},"%":{"x_min":-3,"x_max":1089,"ha":1186,"o":"m 845 0 q 663 76 731 0 q 602 244 602 145 q 661 412 602 344 q 845 489 728 489 q 1027 412 959 489 q 1089 244 1089 343 q 1029 76 1089 144 q 845 0 962 0 m 844 103 q 945 143 909 103 q 981 243 981 184 q 947 340 981 301 q 844 385 909 385 q 744 342 781 385 q 708 243 708 300 q 741 147 708 186 q 844 103 780 103 m 888 986 l 284 -25 l 199 -25 l 803 986 l 888 986 m 241 468 q 58 545 126 468 q -3 715 -3 615 q 56 881 -3 813 q 238 958 124 958 q 421 881 353 958 q 483 712 483 813 q 423 544 483 612 q 241 468 356 468 m 241 855 q 137 811 175 855 q 100 710 100 768 q 136 612 100 653 q 240 572 172 572 q 344 614 306 572 q 382 713 382 656 q 347 810 382 771 q 241 855 308 855 "},"P":{"x_min":0,"x_max":726,"ha":806,"o":"m 424 1013 q 640 931 555 1013 q 726 719 726 850 q 637 506 726 587 q 413 426 548 426 l 140 426 l 140 0 l 0 0 l 0 1013 l 424 1013 m 379 889 l 140 889 l 140 548 l 372 548 q 522 589 459 548 q 593 720 593 637 q 528 845 593 801 q 379 889 463 889 "},"Έ":{"x_min":0,"x_max":1078.21875,"ha":1118,"o":"m 1078 0 l 342 0 l 342 1013 l 1067 1013 l 1067 889 l 481 889 l 481 585 l 1019 585 l 1019 467 l 481 467 l 481 125 l 1078 125 l 1078 0 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 "},"Ώ":{"x_min":0.125,"x_max":1136.546875,"ha":1235,"o":"m 1136 0 l 722 0 l 722 123 q 911 309 842 194 q 981 558 981 423 q 893 813 981 710 q 651 923 800 923 q 411 821 501 923 q 321 568 321 720 q 390 316 321 433 q 579 123 459 200 l 579 0 l 166 0 l 166 124 l 384 124 q 235 327 289 210 q 182 572 182 444 q 311 912 182 782 q 651 1042 441 1042 q 989 910 858 1042 q 1120 569 1120 778 q 1066 326 1120 443 q 917 124 1013 210 l 1136 124 l 1136 0 m 277 1040 l 83 800 l 0 800 l 140 1041 l 277 1040 "},"_":{"x_min":0,"x_max":705.5625,"ha":803,"o":"m 705 -334 l 0 -334 l 0 -234 l 705 -234 l 705 -334 "},"Ϊ":{"x_min":-110,"x_max":246,"ha":275,"o":"m 246 1046 l 118 1046 l 118 1189 l 246 1189 l 246 1046 m 18 1046 l -110 1046 l -110 1189 l 18 1189 l 18 1046 m 136 0 l 0 0 l 0 1012 l 136 1012 l 136 0 "},"+":{"x_min":23,"x_max":768,"ha":792,"o":"m 768 372 l 444 372 l 444 0 l 347 0 l 347 372 l 23 372 l 23 468 l 347 468 l 347 840 l 444 840 l 444 468 l 768 468 l 768 372 "},"½":{"x_min":0,"x_max":1050,"ha":1149,"o":"m 1050 0 l 625 0 q 712 178 625 108 q 878 277 722 187 q 967 385 967 328 q 932 456 967 429 q 850 484 897 484 q 759 450 798 484 q 721 352 721 416 l 640 352 q 706 502 640 448 q 851 551 766 551 q 987 509 931 551 q 1050 385 1050 462 q 976 251 1050 301 q 829 179 902 215 q 717 68 740 133 l 1050 68 l 1050 0 m 834 985 l 215 -28 l 130 -28 l 750 984 l 834 985 m 224 422 l 142 422 l 142 811 l 0 811 l 0 867 q 104 889 62 867 q 164 973 157 916 l 224 973 l 224 422 "},"Ρ":{"x_min":0,"x_max":720,"ha":783,"o":"m 424 1013 q 637 933 554 1013 q 720 723 720 853 q 633 508 720 591 q 413 426 546 426 l 140 426 l 140 0 l 0 0 l 0 1013 l 424 1013 m 378 889 l 140 889 l 140 548 l 371 548 q 521 589 458 548 q 592 720 592 637 q 527 845 592 801 q 378 889 463 889 "},"'":{"x_min":0,"x_max":139,"ha":236,"o":"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 "},"ª":{"x_min":0,"x_max":350,"ha":397,"o":"m 350 625 q 307 616 328 616 q 266 631 281 616 q 247 673 251 645 q 190 628 225 644 q 116 613 156 613 q 32 641 64 613 q 0 722 0 669 q 72 826 0 800 q 247 866 159 846 l 247 887 q 220 934 247 916 q 162 953 194 953 q 104 934 129 953 q 76 882 80 915 l 16 882 q 60 976 16 941 q 166 1011 104 1011 q 266 979 224 1011 q 308 891 308 948 l 308 706 q 311 679 308 688 q 331 670 315 670 l 350 672 l 350 625 m 247 757 l 247 811 q 136 790 175 798 q 64 726 64 773 q 83 682 64 697 q 132 667 103 667 q 207 690 174 667 q 247 757 247 718 "},"΅":{"x_min":0,"x_max":450,"ha":553,"o":"m 450 800 l 340 800 l 340 925 l 450 925 l 450 800 m 406 1040 l 212 800 l 129 800 l 269 1040 l 406 1040 m 110 800 l 0 800 l 0 925 l 110 925 l 110 800 "},"T":{"x_min":0,"x_max":777,"ha":835,"o":"m 777 894 l 458 894 l 458 0 l 319 0 l 319 894 l 0 894 l 0 1013 l 777 1013 l 777 894 "},"Φ":{"x_min":0,"x_max":915,"ha":997,"o":"m 527 0 l 389 0 l 389 122 q 110 231 220 122 q 0 509 0 340 q 110 785 0 677 q 389 893 220 893 l 389 1013 l 527 1013 l 527 893 q 804 786 693 893 q 915 509 915 679 q 805 231 915 341 q 527 122 696 122 l 527 0 m 527 226 q 712 310 641 226 q 779 507 779 389 q 712 705 779 627 q 527 787 641 787 l 527 226 m 389 226 l 389 787 q 205 698 275 775 q 136 505 136 620 q 206 308 136 391 q 389 226 276 226 "},"⁋":{"x_min":0,"x_max":0,"ha":694},"j":{"x_min":-77.78125,"x_max":167,"ha":349,"o":"m 167 871 l 42 871 l 42 1013 l 167 1013 l 167 871 m 167 -80 q 121 -231 167 -184 q -26 -278 76 -278 l -77 -278 l -77 -164 l -41 -164 q 26 -143 11 -164 q 42 -65 42 -122 l 42 737 l 167 737 l 167 -80 "},"Σ":{"x_min":0,"x_max":756.953125,"ha":819,"o":"m 756 0 l 0 0 l 0 107 l 395 523 l 22 904 l 22 1013 l 745 1013 l 745 889 l 209 889 l 566 523 l 187 125 l 756 125 l 756 0 "},"1":{"x_min":215.671875,"x_max":574,"ha":792,"o":"m 574 0 l 442 0 l 442 697 l 215 697 l 215 796 q 386 833 330 796 q 475 986 447 875 l 574 986 l 574 0 "},"›":{"x_min":18.0625,"x_max":774,"ha":792,"o":"m 774 376 l 18 40 l 18 149 l 631 421 l 18 692 l 18 799 l 774 465 l 774 376 "},"<":{"x_min":17.984375,"x_max":773.609375,"ha":792,"o":"m 773 40 l 18 376 l 17 465 l 773 799 l 773 692 l 159 420 l 773 149 l 773 40 "},"£":{"x_min":0,"x_max":704.484375,"ha":801,"o":"m 704 41 q 623 -10 664 5 q 543 -26 583 -26 q 359 15 501 -26 q 243 36 288 36 q 158 23 197 36 q 73 -21 119 10 l 6 76 q 125 195 90 150 q 175 331 175 262 q 147 443 175 383 l 0 443 l 0 512 l 108 512 q 43 734 43 623 q 120 929 43 854 q 358 1010 204 1010 q 579 936 487 1010 q 678 729 678 857 l 678 684 l 552 684 q 504 838 552 780 q 362 896 457 896 q 216 852 263 896 q 176 747 176 815 q 199 627 176 697 q 248 512 217 574 l 468 512 l 468 443 l 279 443 q 297 356 297 398 q 230 194 297 279 q 153 107 211 170 q 227 133 190 125 q 293 142 264 142 q 410 119 339 142 q 516 96 482 96 q 579 105 550 96 q 648 142 608 115 l 704 41 "},"t":{"x_min":0,"x_max":367,"ha":458,"o":"m 367 0 q 312 -5 339 -2 q 262 -8 284 -8 q 145 28 183 -8 q 108 143 108 64 l 108 638 l 0 638 l 0 738 l 108 738 l 108 944 l 232 944 l 232 738 l 367 738 l 367 638 l 232 638 l 232 185 q 248 121 232 140 q 307 102 264 102 q 345 104 330 102 q 367 107 360 107 l 367 0 "},"¬":{"x_min":0,"x_max":706,"ha":803,"o":"m 706 411 l 706 158 l 630 158 l 630 335 l 0 335 l 0 411 l 706 411 "},"λ":{"x_min":0,"x_max":750,"ha":803,"o":"m 750 -7 q 679 -15 716 -15 q 538 59 591 -15 q 466 214 512 97 l 336 551 l 126 0 l 0 0 l 270 705 q 223 837 247 770 q 116 899 190 899 q 90 898 100 899 l 90 1004 q 152 1011 125 1011 q 298 938 244 1011 q 373 783 326 901 l 605 192 q 649 115 629 136 q 716 95 669 95 l 736 95 q 750 97 745 97 l 750 -7 "},"W":{"x_min":0,"x_max":1263.890625,"ha":1351,"o":"m 1263 1013 l 995 0 l 859 0 l 627 837 l 405 0 l 265 0 l 0 1013 l 136 1013 l 342 202 l 556 1013 l 701 1013 l 921 207 l 1133 1012 l 1263 1013 "},">":{"x_min":18.0625,"x_max":774,"ha":792,"o":"m 774 376 l 18 40 l 18 149 l 631 421 l 18 692 l 18 799 l 774 465 l 774 376 "},"v":{"x_min":0,"x_max":675.15625,"ha":761,"o":"m 675 738 l 404 0 l 272 0 l 0 738 l 133 737 l 340 147 l 541 737 l 675 738 "},"τ":{"x_min":0.28125,"x_max":644.5,"ha":703,"o":"m 644 628 l 382 628 l 382 179 q 388 120 382 137 q 436 91 401 91 q 474 94 447 91 q 504 97 501 97 l 504 0 q 454 -9 482 -5 q 401 -14 426 -14 q 278 67 308 -14 q 260 233 260 118 l 260 628 l 0 628 l 0 739 l 644 739 l 644 628 "},"ξ":{"x_min":0,"x_max":624.9375,"ha":699,"o":"m 624 -37 q 608 -153 624 -96 q 563 -278 593 -211 l 454 -278 q 491 -183 486 -200 q 511 -83 511 -126 q 484 -23 511 -44 q 370 1 452 1 q 323 0 354 1 q 283 -1 293 -1 q 84 76 169 -1 q 0 266 0 154 q 56 431 0 358 q 197 538 108 498 q 94 613 134 562 q 54 730 54 665 q 77 823 54 780 q 143 901 101 867 l 27 901 l 27 1012 l 576 1012 l 576 901 l 380 901 q 244 863 303 901 q 178 745 178 820 q 312 600 178 636 q 532 582 380 582 l 532 479 q 276 455 361 479 q 118 281 118 410 q 165 173 118 217 q 274 120 208 133 q 494 101 384 110 q 624 -37 624 76 "},"&":{"x_min":-3,"x_max":894.25,"ha":992,"o":"m 894 0 l 725 0 l 624 123 q 471 0 553 40 q 306 -41 390 -41 q 168 -7 231 -41 q 62 92 105 26 q 14 187 31 139 q -3 276 -3 235 q 55 433 -3 358 q 248 581 114 508 q 170 689 196 640 q 137 817 137 751 q 214 985 137 922 q 384 1041 284 1041 q 548 988 483 1041 q 622 824 622 928 q 563 666 622 739 q 431 556 516 608 l 621 326 q 649 407 639 361 q 663 493 653 426 l 781 493 q 703 229 781 352 l 894 0 m 504 818 q 468 908 504 877 q 384 940 433 940 q 293 907 331 940 q 255 818 255 875 q 289 714 255 767 q 363 628 313 678 q 477 729 446 682 q 504 818 504 771 m 556 209 l 314 499 q 179 395 223 449 q 135 283 135 341 q 146 222 135 253 q 183 158 158 192 q 333 80 241 80 q 556 209 448 80 "},"Λ":{"x_min":0,"x_max":862.5,"ha":942,"o":"m 862 0 l 719 0 l 426 847 l 143 0 l 0 0 l 356 1013 l 501 1013 l 862 0 "},"I":{"x_min":41,"x_max":180,"ha":293,"o":"m 180 0 l 41 0 l 41 1013 l 180 1013 l 180 0 "},"G":{"x_min":0,"x_max":921,"ha":1011,"o":"m 921 0 l 832 0 l 801 136 q 655 15 741 58 q 470 -28 568 -28 q 126 133 259 -28 q 0 499 0 284 q 125 881 0 731 q 486 1043 259 1043 q 763 957 647 1043 q 905 709 890 864 l 772 709 q 668 866 747 807 q 486 926 589 926 q 228 795 322 926 q 142 507 142 677 q 228 224 142 342 q 483 94 323 94 q 712 195 625 94 q 796 435 796 291 l 477 435 l 477 549 l 921 549 l 921 0 "},"ΰ":{"x_min":0,"x_max":617,"ha":725,"o":"m 524 800 l 414 800 l 414 925 l 524 925 l 524 800 m 183 800 l 73 800 l 73 925 l 183 925 l 183 800 m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 m 489 1040 l 300 819 l 216 819 l 351 1040 l 489 1040 "},"`":{"x_min":0,"x_max":138.890625,"ha":236,"o":"m 138 699 l 0 699 l 0 861 q 36 974 0 929 q 138 1041 72 1020 l 138 977 q 82 931 95 969 q 69 839 69 893 l 138 839 l 138 699 "},"·":{"x_min":0,"x_max":142,"ha":239,"o":"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 "},"Υ":{"x_min":0.328125,"x_max":819.515625,"ha":889,"o":"m 819 1013 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1013 l 140 1013 l 411 533 l 679 1013 l 819 1013 "},"r":{"x_min":0,"x_max":355.5625,"ha":432,"o":"m 355 621 l 343 621 q 179 569 236 621 q 122 411 122 518 l 122 0 l 0 0 l 0 737 l 117 737 l 117 604 q 204 719 146 686 q 355 753 262 753 l 355 621 "},"x":{"x_min":0,"x_max":675,"ha":764,"o":"m 675 0 l 525 0 l 331 286 l 144 0 l 0 0 l 256 379 l 12 738 l 157 737 l 336 473 l 516 738 l 661 738 l 412 380 l 675 0 "},"μ":{"x_min":0,"x_max":696.609375,"ha":747,"o":"m 696 -4 q 628 -14 657 -14 q 498 97 513 -14 q 422 8 470 41 q 313 -24 374 -24 q 207 3 258 -24 q 120 80 157 31 l 120 -278 l 0 -278 l 0 738 l 124 738 l 124 343 q 165 172 124 246 q 308 82 216 82 q 451 177 402 82 q 492 358 492 254 l 492 738 l 616 738 l 616 214 q 623 136 616 160 q 673 92 636 92 q 696 95 684 92 l 696 -4 "},"h":{"x_min":0,"x_max":615,"ha":724,"o":"m 615 472 l 615 0 l 490 0 l 490 454 q 456 590 490 535 q 338 654 416 654 q 186 588 251 654 q 122 436 122 522 l 122 0 l 0 0 l 0 1013 l 122 1013 l 122 633 q 218 727 149 694 q 362 760 287 760 q 552 676 484 760 q 615 472 615 600 "},".":{"x_min":0,"x_max":142,"ha":239,"o":"m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 "},"φ":{"x_min":-2,"x_max":878,"ha":974,"o":"m 496 -279 l 378 -279 l 378 -17 q 101 88 204 -17 q -2 367 -2 194 q 68 626 -2 510 q 283 758 151 758 l 283 646 q 167 537 209 626 q 133 373 133 462 q 192 177 133 254 q 378 93 259 93 l 378 758 q 445 764 426 763 q 476 765 464 765 q 765 659 653 765 q 878 377 878 553 q 771 96 878 209 q 496 -17 665 -17 l 496 -279 m 496 93 l 514 93 q 687 183 623 93 q 746 380 746 265 q 691 569 746 491 q 522 658 629 658 l 496 656 l 496 93 "},";":{"x_min":0,"x_max":142,"ha":239,"o":"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 m 142 -12 q 105 -132 142 -82 q 0 -206 68 -182 l 0 -138 q 58 -82 43 -123 q 68 0 68 -56 l 0 0 l 0 151 l 142 151 l 142 -12 "},"f":{"x_min":0,"x_max":378,"ha":472,"o":"m 378 638 l 246 638 l 246 0 l 121 0 l 121 638 l 0 638 l 0 738 l 121 738 q 137 935 121 887 q 290 1028 171 1028 q 320 1027 305 1028 q 378 1021 334 1026 l 378 908 q 323 918 346 918 q 257 870 273 918 q 246 780 246 840 l 246 738 l 378 738 l 378 638 "},"“":{"x_min":1,"x_max":348.21875,"ha":454,"o":"m 140 670 l 1 670 l 1 830 q 37 943 1 897 q 140 1011 74 990 l 140 947 q 82 900 97 940 q 68 810 68 861 l 140 810 l 140 670 m 348 670 l 209 670 l 209 830 q 245 943 209 897 q 348 1011 282 990 l 348 947 q 290 900 305 940 q 276 810 276 861 l 348 810 l 348 670 "},"A":{"x_min":0.03125,"x_max":906.953125,"ha":1008,"o":"m 906 0 l 756 0 l 648 303 l 251 303 l 142 0 l 0 0 l 376 1013 l 529 1013 l 906 0 m 610 421 l 452 867 l 293 421 l 610 421 "},"6":{"x_min":53,"x_max":739,"ha":792,"o":"m 739 312 q 633 62 739 162 q 400 -31 534 -31 q 162 78 257 -31 q 53 439 53 206 q 178 859 53 712 q 441 986 284 986 q 643 912 559 986 q 732 713 732 833 l 601 713 q 544 830 594 786 q 426 875 494 875 q 268 793 331 875 q 193 517 193 697 q 301 597 240 570 q 427 624 362 624 q 643 540 552 624 q 739 312 739 451 m 603 298 q 540 461 603 400 q 404 516 484 516 q 268 461 323 516 q 207 300 207 401 q 269 137 207 198 q 405 83 325 83 q 541 137 486 83 q 603 298 603 197 "},"‘":{"x_min":1,"x_max":139.890625,"ha":236,"o":"m 139 670 l 1 670 l 1 830 q 37 943 1 897 q 139 1011 74 990 l 139 947 q 82 900 97 940 q 68 810 68 861 l 139 810 l 139 670 "},"ϊ":{"x_min":-70,"x_max":283,"ha":361,"o":"m 283 800 l 173 800 l 173 925 l 283 925 l 283 800 m 40 800 l -70 800 l -70 925 l 40 925 l 40 800 m 283 3 q 232 -10 257 -5 q 181 -15 206 -15 q 84 26 118 -15 q 41 200 41 79 l 41 737 l 166 737 l 167 215 q 171 141 167 157 q 225 101 182 101 q 247 103 238 101 q 283 112 256 104 l 283 3 "},"π":{"x_min":-0.21875,"x_max":773.21875,"ha":857,"o":"m 773 -7 l 707 -11 q 575 40 607 -11 q 552 174 552 77 l 552 226 l 552 626 l 222 626 l 222 0 l 97 0 l 97 626 l 0 626 l 0 737 l 773 737 l 773 626 l 676 626 l 676 171 q 695 103 676 117 q 773 90 714 90 l 773 -7 "},"ά":{"x_min":0,"x_max":765.5625,"ha":809,"o":"m 765 -4 q 698 -14 726 -14 q 564 97 586 -14 q 466 7 525 40 q 337 -26 407 -26 q 88 98 186 -26 q 0 369 0 212 q 88 637 0 525 q 337 760 184 760 q 465 727 407 760 q 563 637 524 695 l 563 738 l 685 738 l 685 222 q 693 141 685 168 q 748 94 708 94 q 765 95 760 94 l 765 -4 m 584 371 q 531 562 584 485 q 360 653 470 653 q 192 566 254 653 q 135 379 135 489 q 186 181 135 261 q 358 84 247 84 q 528 176 465 84 q 584 371 584 260 m 604 1040 l 415 819 l 332 819 l 466 1040 l 604 1040 "},"O":{"x_min":0,"x_max":958,"ha":1057,"o":"m 485 1041 q 834 882 702 1041 q 958 512 958 734 q 834 136 958 287 q 481 -26 702 -26 q 126 130 261 -26 q 0 504 0 279 q 127 880 0 728 q 485 1041 263 1041 m 480 98 q 731 225 638 98 q 815 504 815 340 q 733 783 815 669 q 480 912 640 912 q 226 784 321 912 q 142 504 142 670 q 226 224 142 339 q 480 98 319 98 "},"n":{"x_min":0,"x_max":615,"ha":724,"o":"m 615 463 l 615 0 l 490 0 l 490 454 q 453 592 490 537 q 331 656 410 656 q 178 585 240 656 q 117 421 117 514 l 117 0 l 0 0 l 0 738 l 117 738 l 117 630 q 218 728 150 693 q 359 764 286 764 q 552 675 484 764 q 615 463 615 593 "},"3":{"x_min":54,"x_max":737,"ha":792,"o":"m 737 284 q 635 55 737 141 q 399 -25 541 -25 q 156 52 248 -25 q 54 308 54 140 l 185 308 q 245 147 185 202 q 395 96 302 96 q 539 140 484 96 q 602 280 602 190 q 510 429 602 390 q 324 454 451 454 l 324 565 q 487 584 441 565 q 565 719 565 617 q 515 835 565 791 q 395 879 466 879 q 255 824 307 879 q 203 661 203 769 l 78 661 q 166 909 78 822 q 387 992 250 992 q 603 921 513 992 q 701 723 701 844 q 669 607 701 656 q 578 524 637 558 q 696 434 655 499 q 737 284 737 369 "},"9":{"x_min":53,"x_max":739,"ha":792,"o":"m 739 524 q 619 94 739 241 q 362 -32 516 -32 q 150 47 242 -32 q 59 244 59 126 l 191 244 q 246 129 191 176 q 373 82 301 82 q 526 161 466 82 q 597 440 597 255 q 363 334 501 334 q 130 432 216 334 q 53 650 53 521 q 134 880 53 786 q 383 986 226 986 q 659 841 566 986 q 739 524 739 719 m 388 449 q 535 514 480 449 q 585 658 585 573 q 535 805 585 744 q 388 873 480 873 q 242 809 294 873 q 191 658 191 745 q 239 514 191 572 q 388 449 292 449 "},"l":{"x_min":41,"x_max":166,"ha":279,"o":"m 166 0 l 41 0 l 41 1013 l 166 1013 l 166 0 "},"¤":{"x_min":40.09375,"x_max":728.796875,"ha":825,"o":"m 728 304 l 649 224 l 512 363 q 383 331 458 331 q 256 363 310 331 l 119 224 l 40 304 l 177 441 q 150 553 150 493 q 184 673 150 621 l 40 818 l 119 898 l 267 749 q 321 766 291 759 q 384 773 351 773 q 447 766 417 773 q 501 749 477 759 l 649 898 l 728 818 l 585 675 q 612 618 604 648 q 621 553 621 587 q 591 441 621 491 l 728 304 m 384 682 q 280 643 318 682 q 243 551 243 604 q 279 461 243 499 q 383 423 316 423 q 487 461 449 423 q 525 553 525 500 q 490 641 525 605 q 384 682 451 682 "},"κ":{"x_min":0,"x_max":632.328125,"ha":679,"o":"m 632 0 l 482 0 l 225 384 l 124 288 l 124 0 l 0 0 l 0 738 l 124 738 l 124 446 l 433 738 l 596 738 l 312 466 l 632 0 "},"4":{"x_min":48,"x_max":742.453125,"ha":792,"o":"m 742 243 l 602 243 l 602 0 l 476 0 l 476 243 l 48 243 l 48 368 l 476 958 l 602 958 l 602 354 l 742 354 l 742 243 m 476 354 l 476 792 l 162 354 l 476 354 "},"p":{"x_min":0,"x_max":685,"ha":786,"o":"m 685 364 q 598 96 685 205 q 350 -23 504 -23 q 121 89 205 -23 l 121 -278 l 0 -278 l 0 738 l 121 738 l 121 633 q 220 726 159 691 q 351 761 280 761 q 598 636 504 761 q 685 364 685 522 m 557 371 q 501 560 557 481 q 330 651 437 651 q 162 559 223 651 q 108 366 108 479 q 162 177 108 254 q 333 87 224 87 q 502 178 441 87 q 557 371 557 258 "},"‡":{"x_min":0,"x_max":777,"ha":835,"o":"m 458 238 l 458 0 l 319 0 l 319 238 l 0 238 l 0 360 l 319 360 l 319 681 l 0 683 l 0 804 l 319 804 l 319 1015 l 458 1013 l 458 804 l 777 804 l 777 683 l 458 683 l 458 360 l 777 360 l 777 238 l 458 238 "},"ψ":{"x_min":0,"x_max":808,"ha":907,"o":"m 465 -278 l 341 -278 l 341 -15 q 87 102 180 -15 q 0 378 0 210 l 0 739 l 133 739 l 133 379 q 182 195 133 275 q 341 98 242 98 l 341 922 l 465 922 l 465 98 q 623 195 563 98 q 675 382 675 278 l 675 742 l 808 742 l 808 381 q 720 104 808 213 q 466 -13 627 -13 l 465 -278 "},"η":{"x_min":0.78125,"x_max":697,"ha":810,"o":"m 697 -278 l 572 -278 l 572 454 q 540 587 572 536 q 425 650 501 650 q 271 579 337 650 q 206 420 206 509 l 206 0 l 81 0 l 81 489 q 73 588 81 562 q 0 644 56 644 l 0 741 q 68 755 38 755 q 158 720 124 755 q 200 630 193 686 q 297 726 234 692 q 434 761 359 761 q 620 692 544 761 q 697 516 697 624 l 697 -278 "}},"cssFontWeight":"normal","ascender":1189,"underlinePosition":-100,"cssFontStyle":"normal","boundingBox":{"yMin":-334,"xMin":-111,"yMax":1189,"xMax":1672},"resolution":1000,"original_font_information":{"postscript_name":"Helvetiker-Regular","version_string":"Version 1.00 2004 initial release","vendor_url":"http://www.magenta.gr/","full_font_name":"Helvetiker","font_family_name":"Helvetiker","copyright":"Copyright (c) Μagenta ltd, 2004","description":"","trademark":"","designer":"","designer_url":"","unique_font_identifier":"Μagenta ltd:Helvetiker:22-10-104","license_url":"http://www.ellak.gr/fonts/MgOpen/license.html","license_description":"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\"Fonts\") and associated documentation files (the \"Font Software\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \r\n\r\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\r\n\r\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \"MgOpen\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\r\n\r\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \"MgOpen\" name.\r\n\r\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \r\n\r\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.","manufacturer_name":"Μagenta ltd","font_sub_family_name":"Regular"},"descender":-334,"familyName":"Helvetiker","lineHeight":1522,"underlineThickness":50} ================================================ FILE: examples/resources/fonts/typeface/optimer_bold.typeface.json ================================================ {"glyphs":{"ο":{"x_min":30,"x_max":741,"ha":774,"o":"m 395 683 q 645 587 550 683 q 741 337 741 492 q 646 79 741 173 q 385 -15 552 -15 q 127 78 225 -15 q 30 333 30 172 q 129 590 30 498 q 395 683 228 683 m 269 174 q 305 85 275 119 q 386 52 335 52 q 464 85 436 52 q 503 172 491 119 q 510 237 506 194 q 515 336 515 279 q 510 431 515 391 q 503 494 506 472 q 464 581 491 548 q 385 615 436 615 q 291 563 315 615 q 261 459 267 512 q 256 333 256 407 q 269 174 256 248 "},"S":{"x_min":55,"x_max":687,"ha":742,"o":"m 95 251 l 116 251 q 188 116 145 158 q 322 75 231 75 q 438 113 385 75 q 491 211 491 151 q 382 350 491 294 q 168 461 273 407 q 55 664 55 539 q 159 875 55 801 q 409 949 264 949 q 653 891 535 949 q 622 805 635 848 q 598 712 609 762 l 583 712 q 509 818 559 779 q 391 857 459 857 q 283 827 328 857 q 238 738 238 797 q 349 609 238 666 q 570 497 461 551 q 687 295 687 416 q 570 62 687 143 q 292 -18 453 -18 q 171 -8 229 -18 q 55 26 113 1 q 72 116 64 68 q 95 251 80 165 "},"/":{"x_min":-32.953125,"x_max":420,"ha":383,"o":"m 339 1023 l 420 1024 l 47 -126 l -32 -126 l 339 1023 "},"Τ":{"x_min":8,"x_max":738,"ha":749,"o":"m 493 818 q 490 723 493 790 q 487 652 487 656 q 490 427 487 529 q 498 201 494 326 q 503 0 503 77 q 438 2 482 0 q 374 5 395 5 q 317 3 351 5 q 244 0 284 1 q 252 266 244 88 q 261 476 261 444 q 258 670 261 533 q 255 818 255 808 q 158 815 188 818 q 8 801 128 813 l 12 872 l 8 932 q 198 927 70 932 q 373 922 327 922 q 572 927 445 922 q 738 932 700 932 l 733 870 l 738 801 q 493 818 614 818 "},"ϕ":{"x_min":32,"x_max":997,"ha":1028,"o":"m 418 -6 q 146 79 261 -6 q 32 322 32 165 q 143 560 32 474 q 418 664 254 646 q 411 819 418 715 q 404 978 404 923 q 483 970 445 970 q 622 977 556 970 q 616 829 622 938 q 611 664 611 719 q 882 573 768 664 q 997 328 997 483 q 886 90 997 171 q 611 -6 776 9 q 616 -197 611 -68 q 622 -374 622 -326 l 544 -365 q 471 -366 503 -365 q 404 -373 438 -368 q 411 -183 404 -315 q 418 -6 418 -51 m 611 328 l 611 61 q 742 147 704 72 q 780 328 780 222 q 741 510 780 433 q 612 601 703 588 l 611 328 m 418 601 q 287 510 326 588 q 249 328 249 433 q 286 147 249 223 q 416 61 324 72 l 418 328 l 418 601 "},"y":{"x_min":0,"x_max":669.453125,"ha":653,"o":"m 269 -16 l 76 481 q 37 579 58 529 q 0 667 16 629 q 66 664 22 667 q 134 661 111 661 q 201 664 154 661 q 251 667 248 667 q 308 465 277 561 q 380 256 338 368 l 452 463 q 482 562 462 493 q 512 667 502 631 l 577 661 q 623 664 593 661 q 669 667 654 667 q 438 139 536 375 q 244 -373 341 -97 q 165 -368 206 -368 q 132 -368 145 -368 q 86 -373 119 -368 q 145 -277 119 -323 q 195 -176 170 -230 l 269 -16 "},"≈":{"x_min":118.0625,"x_max":1019.453125,"ha":1139,"o":"m 1019 527 q 894 458 956 483 q 766 433 831 433 q 570 477 698 433 q 373 522 443 522 q 238 489 297 522 q 118 417 179 457 l 118 563 q 254 632 187 607 q 391 658 320 658 q 577 614 450 658 q 761 571 704 571 q 886 596 826 571 q 1019 671 945 622 l 1019 527 m 1019 251 q 892 182 952 207 q 766 158 831 158 q 568 202 697 158 q 373 246 440 246 q 251 219 308 246 q 118 140 194 192 l 118 286 q 252 358 187 331 q 387 385 318 385 q 575 339 447 385 q 761 294 704 294 q 886 321 825 294 q 1019 397 947 348 l 1019 251 "},"Π":{"x_min":91,"x_max":957,"ha":1049,"o":"m 105 284 l 105 461 q 102 651 105 534 q 99 784 99 768 l 91 932 q 210 926 129 932 q 331 921 290 921 l 711 921 q 833 926 751 921 q 957 932 915 932 q 948 692 957 857 q 939 465 939 527 q 942 221 939 315 q 957 0 945 127 l 829 5 q 756 2 808 5 q 698 0 703 0 q 707 63 704 33 q 710 130 710 93 l 713 504 l 710 813 l 515 818 l 336 813 q 333 643 336 762 q 331 516 331 523 l 336 130 q 345 0 336 59 q 278 2 322 0 q 215 5 234 5 l 91 0 q 98 146 91 40 q 105 284 105 252 "},"ΐ":{"x_min":-147,"x_max":552,"ha":396,"o":"m 92 126 l 92 543 l 80 666 q 139 661 105 663 q 197 658 173 658 q 265 660 239 658 q 315 666 292 663 q 305 586 308 616 q 302 523 302 557 l 302 113 q 303 72 302 88 q 315 0 305 56 l 196 4 l 82 0 q 88 67 85 30 q 92 126 92 104 m -65 961 q -7 935 -31 961 q 17 877 17 909 q -8 820 17 844 q -65 797 -33 797 q -121 820 -96 797 q -147 879 -147 844 q -123 935 -147 910 q -65 961 -99 961 m 275 1017 q 316 998 298 1017 q 334 957 334 980 q 321 919 334 935 q 283 886 307 903 l 94 755 l 36 755 l 182 950 q 225 998 204 980 q 275 1017 247 1017 m 470 961 q 528 935 504 961 q 552 877 552 910 q 528 820 552 844 q 471 797 504 797 q 413 820 438 797 q 388 879 388 844 q 412 936 388 912 q 470 961 436 961 "},"g":{"x_min":23,"x_max":714.671875,"ha":700,"o":"m 213 272 q 93 331 142 278 q 45 456 45 384 q 128 623 45 563 q 322 683 211 683 l 382 683 l 534 664 l 606 660 q 666 662 641 660 q 714 666 692 665 l 714 585 l 581 589 q 623 543 610 570 q 637 477 637 515 q 541 300 637 353 q 310 248 446 248 q 258 236 281 248 q 236 199 236 225 q 386 142 236 150 q 623 102 536 134 q 711 -68 711 71 q 591 -296 711 -218 q 313 -374 471 -374 q 111 -326 199 -374 q 23 -175 23 -279 q 63 -64 23 -110 q 171 -7 104 -19 l 171 0 q 103 39 130 7 q 76 112 76 70 q 117 201 76 163 q 213 251 159 239 l 213 272 m 169 -143 q 221 -255 169 -215 q 351 -295 274 -295 q 483 -254 427 -295 q 540 -139 540 -214 q 524 -81 540 -107 q 472 -40 508 -54 q 383 -19 437 -25 q 269 -13 330 -13 l 239 -12 q 169 -143 169 -54 m 332 304 q 411 351 392 304 q 431 472 431 399 q 413 581 431 536 q 341 626 395 626 q 267 578 287 626 q 247 466 247 530 q 262 350 247 396 q 332 304 277 304 "},"²":{"x_min":22,"x_max":465.0625,"ha":494,"o":"m 22 401 q 156 502 102 456 q 248 607 210 548 q 287 742 287 667 q 267 825 287 802 q 216 848 248 848 q 146 816 167 848 q 110 725 126 785 l 102 725 l 30 800 q 245 901 116 901 q 385 864 327 901 q 444 751 444 827 q 411 643 444 681 q 201 471 378 604 l 284 471 q 387 473 314 471 q 465 476 459 476 q 456 413 456 439 q 459 383 456 401 q 465 354 462 365 q 331 356 412 354 q 249 358 251 358 l 27 354 l 22 401 "},"Κ":{"x_min":90,"x_max":892.78125,"ha":856,"o":"m 334 716 l 334 515 l 569 787 q 635 866 619 845 q 682 932 651 886 l 767 926 q 817 929 784 926 q 870 932 851 932 q 687 746 790 851 q 503 554 585 641 l 623 377 q 892 0 753 179 l 753 5 q 664 2 727 5 q 595 0 600 0 q 484 190 545 98 q 334 404 424 281 l 334 193 q 348 0 334 94 q 270 2 325 0 q 212 5 215 5 l 90 0 q 99 236 90 69 q 108 461 108 402 q 103 623 108 515 q 99 787 99 731 l 90 932 q 157 927 113 932 q 219 922 201 922 q 282 925 252 922 q 342 932 312 927 q 338 831 342 907 q 334 716 334 755 "},"ë":{"x_min":41,"x_max":684.046875,"ha":729,"o":"m 482 98 q 566 112 532 98 q 643 160 600 126 l 661 151 q 643 96 652 125 q 628 40 634 66 q 521 -1 577 11 q 403 -15 466 -15 q 141 79 241 -15 q 41 336 41 173 q 137 586 41 490 q 386 683 234 683 q 608 601 532 683 q 684 373 684 520 l 684 332 l 267 332 q 325 165 267 232 q 482 98 383 98 m 233 976 q 300 948 272 976 q 328 878 328 920 q 303 811 328 839 q 236 784 278 784 q 166 811 194 784 q 138 878 138 838 q 166 947 138 918 q 233 976 194 976 m 493 976 q 560 948 532 976 q 588 878 588 920 q 562 811 588 838 q 496 784 536 784 q 427 811 455 784 q 399 878 399 838 q 426 946 399 917 q 493 976 454 976 m 478 411 q 481 444 481 422 q 459 566 481 513 q 377 620 438 620 q 292 562 318 620 q 267 437 267 505 l 267 411 l 478 411 "},"e":{"x_min":43,"x_max":686.046875,"ha":729,"o":"m 484 95 q 566 110 531 95 q 644 161 601 125 l 662 154 q 640 84 647 105 q 629 40 634 62 q 522 -1 577 11 q 404 -15 468 -15 q 141 77 240 -15 q 43 336 43 170 q 138 585 43 488 q 387 683 234 683 q 609 602 533 683 q 686 375 686 522 l 684 332 l 269 332 q 326 162 269 230 q 484 95 384 95 m 480 411 l 482 444 q 459 567 482 513 q 379 622 437 622 q 293 565 318 622 q 269 438 269 509 l 269 411 l 480 411 "},"ό":{"x_min":30,"x_max":741,"ha":774,"o":"m 395 683 q 645 587 550 683 q 741 337 741 492 q 646 79 741 173 q 385 -15 552 -15 q 127 78 225 -15 q 30 333 30 172 q 129 590 30 498 q 395 683 228 683 m 538 953 q 591 1001 571 986 q 639 1017 611 1017 q 692 994 671 1017 q 713 943 713 972 q 694 897 713 915 q 643 863 675 878 l 420 755 l 352 755 l 538 953 m 269 174 q 305 85 275 119 q 386 52 335 52 q 464 85 436 52 q 503 172 491 119 q 510 237 506 194 q 515 336 515 279 q 510 431 515 391 q 503 494 506 472 q 464 581 491 548 q 385 615 436 615 q 291 563 315 615 q 261 459 267 512 q 256 333 256 407 q 269 174 256 248 "},"J":{"x_min":-37,"x_max":356,"ha":447,"o":"m 214 926 q 293 929 237 926 q 356 932 349 932 q 349 680 356 857 q 342 450 342 502 q 344 314 342 411 q 346 213 346 218 l 346 105 q 249 -128 346 -36 q 10 -221 153 -221 l -24 -216 l -37 -143 l 13 -145 q 97 -94 76 -145 q 118 28 118 -44 l 118 219 q 110 619 118 352 q 103 931 103 886 l 214 926 "},"»":{"x_min":54.5625,"x_max":587.890625,"ha":629,"o":"m 187 330 l 54 604 l 110 656 l 339 333 l 110 9 l 54 66 l 187 330 m 437 330 l 304 604 l 358 656 l 587 333 l 358 9 l 304 66 l 437 330 "},"©":{"x_min":72,"x_max":1064,"ha":1138,"o":"m 1064 486 q 918 139 1064 285 q 570 -6 772 -6 q 220 139 369 -6 q 72 488 72 285 q 219 836 72 688 q 568 985 367 985 q 916 836 769 985 q 1064 486 1064 687 m 155 490 q 276 199 155 323 q 566 75 398 75 q 858 197 734 75 q 982 487 982 319 q 861 781 982 659 q 567 904 740 904 q 276 781 398 904 q 155 490 155 658 m 683 597 q 649 666 683 637 q 573 696 616 696 q 470 636 501 696 q 439 499 439 577 q 468 354 439 421 q 563 288 497 288 q 687 397 664 288 l 815 397 q 735 247 805 303 q 570 191 666 191 q 374 273 448 191 q 301 481 301 356 q 371 696 301 604 q 559 788 441 788 q 726 737 655 788 q 808 597 796 686 l 683 597 "},"ώ":{"x_min":30,"x_max":1059,"ha":1093,"o":"m 335 -15 q 111 79 192 -15 q 30 320 30 173 q 72 504 30 420 q 192 666 114 588 q 297 661 237 661 q 347 663 319 661 q 390 666 374 665 q 247 280 247 498 q 269 123 247 194 q 358 52 291 52 q 421 86 399 52 q 443 165 443 121 l 443 291 q 441 415 443 379 q 435 512 440 451 q 511 505 499 505 q 544 505 522 505 q 608 508 579 505 q 657 512 636 511 q 648 402 652 465 q 644 289 644 340 q 644 237 644 258 q 650 165 644 215 q 669 85 650 119 q 730 52 688 52 q 821 122 798 52 q 844 279 844 192 q 807 481 844 386 q 700 666 771 576 q 746 662 724 663 q 793 661 767 661 q 846 663 812 661 q 898 666 881 666 q 1016 508 974 594 q 1059 322 1059 422 q 974 83 1059 182 q 753 -15 890 -15 q 630 13 685 -15 q 545 100 575 41 q 459 14 516 44 q 335 -15 402 -15 m 684 953 q 737 1001 717 986 q 786 1017 757 1017 q 838 994 817 1017 q 859 943 859 972 q 840 897 859 915 q 790 863 821 878 l 567 755 l 498 755 l 684 953 "},"≥":{"x_min":170.828125,"x_max":965,"ha":1139,"o":"m 965 571 l 965 455 l 173 199 l 173 338 l 732 514 l 173 690 l 173 830 l 965 571 m 965 132 l 965 0 l 170 0 l 170 132 l 965 132 "},"^":{"x_min":-3,"x_max":425,"ha":438,"o":"m 148 1003 l 270 1003 l 425 755 l 357 755 l 210 878 l 62 755 l -3 755 l 148 1003 "},"«":{"x_min":40.28125,"x_max":575,"ha":629,"o":"m 193 336 l 326 62 l 272 9 l 40 333 l 272 656 l 325 599 l 193 336 m 443 336 l 575 62 l 520 9 l 288 333 l 520 656 l 575 599 l 443 336 "},"D":{"x_min":87,"x_max":987,"ha":1032,"o":"m 104 221 l 104 465 q 100 742 104 650 q 89 932 97 834 l 216 929 l 283 929 l 442 929 q 532 929 488 929 q 622 929 576 929 q 894 797 802 912 q 987 496 987 682 q 832 110 987 221 q 389 -1 677 -1 l 201 -1 l 87 -1 q 98 119 93 60 q 104 221 104 178 m 415 89 q 659 192 580 89 q 738 468 738 296 q 663 746 738 653 q 407 839 588 839 l 334 839 l 330 605 l 334 98 q 374 91 353 94 q 415 89 394 89 "},"w":{"x_min":6.9375,"x_max":1048.625,"ha":1042,"o":"m 302 6 q 270 5 281 6 q 215 0 258 4 l 6 667 q 77 663 33 667 q 129 659 120 659 q 197 663 154 659 q 248 667 240 667 q 359 238 293 457 l 440 505 l 484 667 q 540 663 502 667 q 580 659 577 659 q 637 663 598 659 q 677 667 676 667 q 712 520 695 586 q 748 383 729 454 l 790 238 l 855 475 q 875 555 862 501 q 899 667 888 609 q 939 662 917 665 q 973 659 961 659 q 1017 662 998 659 q 1048 667 1036 665 l 956 423 l 812 0 q 759 4 776 3 q 727 6 743 6 q 678 3 712 6 q 643 0 644 0 l 562 288 l 522 423 q 391 0 455 221 q 336 4 354 3 q 302 6 318 6 "},"$":{"x_min":43,"x_max":697,"ha":749,"o":"m 43 79 q 104 254 76 165 l 128 254 q 202 128 150 177 q 331 79 254 79 l 331 365 q 108 474 168 409 q 49 623 49 539 q 130 807 49 737 q 331 889 211 878 q 322 1010 331 949 q 344 1006 329 1008 q 371 1002 360 1004 q 393 1004 382 1004 q 417 1010 403 1005 q 410 955 412 983 q 409 892 409 926 q 555 868 502 880 q 662 823 607 855 q 601 665 626 746 l 570 665 q 409 817 538 789 l 409 554 q 637 445 577 511 q 697 289 697 379 q 615 91 697 168 q 409 0 534 15 l 409 -62 q 409 -97 409 -84 q 411 -136 410 -109 l 368 -133 l 325 -136 q 328 -69 328 -112 q 331 0 329 -26 q 43 79 173 0 m 331 817 q 243 778 278 817 q 209 686 209 739 q 245 615 209 644 q 331 577 282 586 l 331 817 m 534 212 q 499 299 534 267 q 405 347 464 330 l 405 78 q 497 123 461 89 q 534 212 534 157 "},"‧":{"x_min":105,"x_max":343,"ha":447,"o":"m 223 654 q 306 617 270 654 q 343 533 343 581 q 306 451 343 486 q 223 417 270 417 q 139 450 174 417 q 105 534 105 483 q 139 619 105 584 q 223 654 174 654 "},"\\":{"x_min":-31.953125,"x_max":422,"ha":383,"o":"m -31 1024 l 49 1024 l 422 -126 l 338 -126 l -31 1024 "},"Ι":{"x_min":94,"x_max":354,"ha":447,"o":"m 111 402 q 107 716 111 609 q 94 932 103 822 q 161 925 124 929 q 220 922 198 922 q 292 927 245 922 q 353 931 339 932 q 340 716 343 819 q 337 465 337 613 q 340 221 337 326 q 354 0 344 116 q 273 2 330 0 q 214 5 216 5 l 95 0 q 107 199 103 88 q 111 402 111 311 "},"Ύ":{"x_min":-28,"x_max":1295.609375,"ha":1247,"o":"m 635 650 q 566 772 622 672 q 469 931 509 872 l 591 926 q 683 929 619 926 q 755 931 748 931 q 844 740 803 825 q 941 554 885 656 q 1040 730 991 636 q 1135 931 1088 825 l 1210 926 q 1252 929 1224 926 q 1295 931 1280 931 q 1142 689 1213 812 q 997 420 1072 566 l 1001 143 l 1007 0 l 913 5 l 755 0 q 761 138 755 50 q 768 237 768 226 l 768 402 l 635 650 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 264 863 295 878 l 40 755 l -28 755 l 158 953 "},"’":{"x_min":70.828125,"x_max":337.5,"ha":374,"o":"m 70 528 l 151 848 q 183 919 158 889 q 244 949 208 949 q 310 924 283 949 q 337 862 337 900 q 331 829 337 845 q 316 797 326 813 l 111 511 l 70 528 "},"Ν":{"x_min":86,"x_max":930.453125,"ha":1010,"o":"m 101 444 q 97 645 101 523 q 94 787 94 768 l 90 931 l 177 926 l 268 934 q 526 623 395 775 q 792 327 657 470 l 792 584 q 787 766 792 643 q 782 931 782 888 q 825 927 811 929 q 854 926 838 926 q 890 927 876 926 q 930 934 904 929 q 919 838 923 889 q 915 738 915 788 q 913 461 915 600 q 911 184 912 322 q 913 106 911 147 q 920 0 915 66 q 876 4 901 2 q 838 6 851 6 q 794 4 812 6 q 756 0 777 2 q 495 309 631 151 q 220 618 359 466 l 220 241 l 227 0 q 194 4 213 1 q 159 6 175 6 q 119 4 134 6 q 86 0 103 2 q 97 208 94 105 q 101 444 101 311 "},"-":{"x_min":58.71875,"x_max":386.5,"ha":447,"o":"m 65 334 q 62 383 65 352 q 58 422 58 415 l 386 422 l 379 333 l 386 247 l 58 247 q 62 296 58 265 q 65 334 65 327 "},"Q":{"x_min":40,"x_max":1098.328125,"ha":1129,"o":"m 40 456 q 190 819 40 689 q 577 949 340 949 q 945 829 804 949 q 1086 486 1086 709 q 1004 185 1086 313 q 759 10 922 56 l 883 -72 q 1098 -182 979 -129 l 1098 -200 q 1005 -241 1053 -216 q 906 -294 956 -265 q 737 -160 824 -226 q 533 -13 649 -94 q 174 110 308 -13 q 40 456 40 233 m 562 72 q 773 193 706 72 q 840 472 840 315 q 773 741 840 623 q 566 860 706 860 q 354 741 421 860 q 287 465 287 622 q 353 192 287 312 q 562 72 420 72 "},"ς":{"x_min":48,"x_max":647,"ha":689,"o":"m 421 600 q 306 538 350 600 q 263 404 263 477 q 357 244 263 304 q 532 151 445 197 q 627 -17 627 88 q 527 -214 627 -140 q 302 -288 427 -288 q 291 -198 302 -247 q 318 -203 296 -198 q 353 -207 341 -207 q 440 -176 402 -207 q 484 -95 478 -145 q 324 60 484 -17 q 106 179 164 139 q 48 353 48 219 q 153 590 48 500 q 409 681 259 681 q 527 666 470 681 q 647 623 584 651 q 616 532 626 561 q 597 465 606 504 l 559 465 q 513 563 546 526 q 421 600 479 600 "},"M":{"x_min":32,"x_max":1165,"ha":1217,"o":"m 105 465 l 168 932 q 211 927 190 929 q 261 926 231 926 q 309 929 277 926 q 358 932 341 932 q 441 709 409 790 q 503 559 473 629 q 608 316 533 488 l 778 690 q 872 932 834 808 q 919 929 887 932 q 966 926 951 926 q 1027 929 1006 926 q 1059 932 1048 932 l 1105 473 q 1130 240 1117 354 q 1165 0 1144 127 q 1095 3 1140 0 q 1041 6 1051 6 q 969 3 1015 6 q 915 0 924 0 q 895 291 915 142 l 865 616 q 731 317 802 480 q 597 0 661 153 l 551 0 l 500 0 q 409 218 465 87 q 317 426 352 349 q 236 605 282 504 l 196 229 q 185 108 190 173 q 180 0 180 44 q 134 3 165 0 q 100 6 102 6 q 60 4 77 6 q 32 0 43 1 q 105 465 77 258 "},"Ψ":{"x_min":84,"x_max":1097.890625,"ha":1185,"o":"m 307 708 q 307 639 307 686 q 307 569 307 593 q 342 407 307 462 q 478 353 377 353 l 480 484 q 472 735 480 568 q 464 932 464 903 q 530 925 494 929 q 587 922 566 922 q 658 927 612 922 q 719 931 705 932 q 712 777 719 877 q 706 666 706 677 l 702 353 q 800 378 761 353 q 853 457 839 404 q 871 582 868 511 q 875 670 875 652 q 868 811 875 720 q 861 931 861 901 q 926 927 881 931 q 984 922 970 922 q 1039 926 1002 922 q 1097 930 1077 930 q 1093 869 1094 904 q 1092 801 1092 834 l 1092 738 l 1092 687 l 1092 610 q 992 354 1092 432 q 702 261 892 277 q 710 126 702 219 q 719 0 719 33 q 646 3 691 0 q 591 6 601 6 q 516 3 562 6 q 464 0 470 0 q 472 134 464 40 q 480 261 480 229 q 188 358 287 261 q 90 651 90 455 l 90 804 l 90 820 q 84 930 90 881 q 139 926 102 930 q 196 922 177 922 q 257 927 219 922 q 322 931 295 931 q 311 813 316 876 q 307 708 307 750 "},"C":{"x_min":43,"x_max":891.84375,"ha":900,"o":"m 587 856 q 363 744 442 856 q 285 479 285 632 q 361 202 285 322 q 586 82 437 82 q 740 108 668 82 q 855 194 812 135 l 877 184 q 861 120 868 152 q 846 45 854 88 q 710 -2 786 12 q 555 -18 634 -18 q 184 109 326 -18 q 43 464 43 236 q 190 819 43 690 q 569 949 338 949 q 723 932 652 949 q 891 876 793 915 q 866 793 879 840 q 846 710 852 746 l 827 710 q 734 818 799 781 q 587 856 669 856 "},"œ":{"x_min":36,"x_max":1154.0625,"ha":1197,"o":"m 387 -15 q 131 79 227 -15 q 36 334 36 173 q 131 586 36 490 q 383 683 226 683 q 630 606 515 683 q 735 664 677 645 q 859 683 792 683 q 1076 600 999 683 q 1154 377 1154 517 l 1152 332 l 736 332 q 793 165 736 232 q 951 98 851 98 q 1111 160 1042 98 l 1127 151 q 1111 101 1116 119 q 1094 40 1105 83 q 990 -1 1049 11 q 870 -15 931 -15 q 735 2 794 -15 q 628 68 676 20 q 521 4 584 23 q 387 -15 458 -15 m 949 411 l 949 445 q 921 580 949 541 q 844 620 893 620 q 756 557 777 620 q 736 411 736 494 l 949 411 m 276 171 q 315 80 286 115 q 395 45 344 45 q 453 62 424 45 q 498 115 481 79 q 520 204 514 151 q 526 329 526 257 q 516 475 526 408 q 476 577 506 542 q 394 612 445 612 q 294 552 327 612 q 271 470 279 520 q 264 329 264 420 q 266 244 264 269 q 276 171 268 219 "},"!":{"x_min":103,"x_max":341,"ha":444,"o":"m 222 221 q 306 187 271 221 q 341 104 341 154 q 306 19 341 54 q 222 -15 271 -15 q 138 19 173 -15 q 103 103 103 53 q 137 186 103 151 q 222 221 172 221 m 113 818 q 142 910 113 872 q 224 949 171 949 q 304 921 274 949 q 334 847 334 894 q 325 741 334 796 q 306 628 317 687 l 276 462 q 253 296 259 369 l 193 296 q 113 818 153 557 "},"ç":{"x_min":36,"x_max":622,"ha":660,"o":"m 423 600 q 306 528 346 600 q 267 373 267 457 q 313 176 267 265 q 459 88 359 88 q 542 99 500 88 q 612 133 584 111 l 622 126 l 590 19 q 502 -6 551 1 q 406 -15 453 -15 q 141 76 247 -15 q 36 325 36 168 q 140 583 36 485 q 408 681 245 681 q 622 637 519 681 q 590 459 602 550 l 565 459 q 519 561 555 522 q 423 600 483 600 m 175 -203 q 276 -231 251 -226 q 332 -236 301 -236 q 381 -223 361 -236 q 402 -184 402 -211 q 384 -144 402 -161 q 341 -128 366 -128 q 319 -130 328 -128 q 301 -135 310 -132 l 301 2 l 358 2 l 358 -77 l 418 -75 q 496 -108 465 -80 q 527 -183 527 -136 q 487 -274 527 -239 q 388 -310 448 -310 q 268 -299 326 -310 q 151 -265 211 -289 l 175 -203 "},"{":{"x_min":104,"x_max":587.328125,"ha":683,"o":"m 587 844 l 540 844 q 468 821 487 844 q 446 785 449 798 q 443 752 443 773 l 443 712 l 443 552 q 416 424 443 464 q 304 353 390 383 q 413 287 383 335 q 443 155 443 238 l 443 -5 q 465 -105 443 -74 q 555 -136 488 -136 l 587 -136 l 587 -277 l 481 -275 q 343 -234 396 -268 q 280 -122 289 -200 l 280 -50 l 280 116 q 246 238 280 194 q 137 283 212 283 l 104 283 l 104 422 q 240 458 201 422 q 280 588 280 494 l 280 756 l 280 831 q 355 951 292 919 q 517 983 417 983 l 587 983 l 587 844 "},"X":{"x_min":-1.390625,"x_max":801.390625,"ha":782,"o":"m 169 241 l 301 436 l 15 932 q 94 929 38 932 q 155 926 150 926 q 235 929 179 926 q 298 932 291 932 q 314 893 308 907 q 358 802 320 880 l 445 638 q 547 805 513 748 q 613 932 581 862 q 655 929 627 932 q 698 926 683 926 q 740 929 712 926 q 783 932 768 932 q 685 800 709 833 q 616 701 661 766 l 502 531 l 801 0 q 713 2 776 0 q 647 5 651 5 l 516 0 l 470 108 l 356 326 q 265 174 316 263 q 170 0 215 84 q 118 3 154 0 q 77 6 81 6 q 31 4 52 6 q -1 0 11 1 l 169 241 "},"ô":{"x_min":32,"x_max":743,"ha":775,"o":"m 395 683 q 647 588 551 683 q 743 337 743 494 q 648 79 743 173 q 387 -15 554 -15 q 129 78 227 -15 q 32 333 32 172 q 130 590 32 497 q 395 683 229 683 m 325 1003 l 450 1003 l 601 755 l 534 755 l 387 878 l 238 755 l 174 755 l 325 1003 m 269 174 q 307 85 277 120 q 387 50 337 50 q 466 84 437 50 q 500 156 494 119 q 511 215 507 194 q 517 335 517 271 q 511 450 517 395 q 500 509 507 471 q 466 582 494 548 q 387 616 439 616 q 294 564 319 616 q 263 459 269 513 q 258 333 258 406 q 260 244 258 270 q 269 174 262 217 "},"#":{"x_min":30,"x_max":1019,"ha":1049,"o":"m 619 974 l 522 698 l 684 698 l 781 974 l 930 975 l 831 698 l 1019 699 l 970 564 l 783 563 l 725 403 l 920 403 l 873 271 l 678 271 l 579 -5 l 432 -5 l 530 271 l 367 271 l 270 -5 l 121 -5 l 220 270 l 30 271 l 79 403 l 268 403 l 326 563 l 127 564 l 174 699 l 374 698 l 472 975 l 619 974 m 414 402 l 582 402 l 639 563 l 470 563 l 414 402 "},"ι":{"x_min":80,"x_max":314.71875,"ha":396,"o":"m 91 126 l 91 543 l 80 667 q 139 661 105 664 q 196 658 173 658 q 264 661 238 658 q 314 666 291 663 q 304 587 307 616 q 301 523 301 558 l 301 113 q 302 72 301 88 q 314 0 304 56 l 195 4 l 81 0 q 87 67 84 30 q 91 126 91 104 "},"Ά":{"x_min":-28,"x_max":983.109375,"ha":963,"o":"m 242 322 q 326 529 276 400 q 411 751 377 659 q 484 948 445 843 l 553 944 l 623 948 q 805 450 717 684 q 983 0 892 215 l 849 4 l 713 0 l 684 91 l 630 259 q 531 261 581 259 q 433 264 481 262 l 335 259 q 245 0 295 134 l 155 4 l 103 0 l 242 322 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 265 863 295 878 l 40 755 l -28 755 l 158 953 m 487 368 l 597 368 q 549 509 573 446 q 488 662 526 572 q 376 370 428 519 l 487 368 "},")":{"x_min":72.21875,"x_max":383,"ha":449,"o":"m 227 366 q 191 656 227 521 q 76 906 156 792 l 120 949 q 317 691 252 826 q 383 382 383 555 q 317 63 383 201 q 115 -201 252 -75 l 72 -158 q 191 81 156 -48 q 227 366 227 211 "},"ε":{"x_min":55,"x_max":599,"ha":657,"o":"m 512 502 q 472 579 502 548 q 396 611 442 611 q 323 577 352 611 q 295 499 295 544 q 317 429 295 460 q 377 394 340 399 l 449 394 l 449 373 q 449 336 449 349 q 449 316 449 323 q 413 319 438 319 q 322 281 362 319 q 283 195 283 244 q 323 101 283 144 q 412 59 363 59 q 498 88 461 59 q 571 167 535 117 l 599 155 q 593 130 595 144 q 592 104 592 115 q 592 82 592 90 q 599 53 592 74 q 351 -15 485 -15 q 145 30 236 -15 q 55 176 55 75 q 105 289 55 244 q 232 360 155 335 q 127 421 166 385 q 88 516 88 456 q 165 643 88 603 q 340 683 243 683 q 592 612 479 683 q 565 556 576 583 q 551 502 554 530 l 512 502 "},"Δ":{"x_min":11,"x_max":958.328125,"ha":972,"o":"m 490 926 q 531 928 509 926 q 566 932 554 930 q 690 599 633 746 q 815 296 747 452 q 958 0 884 140 q 720 3 879 0 q 481 8 562 8 q 247 3 404 8 q 11 0 90 0 q 234 470 126 223 q 415 932 342 716 q 448 928 429 930 q 490 926 468 926 m 314 373 q 217 127 262 259 q 425 118 314 118 q 542 122 468 118 q 636 127 616 127 q 598 232 616 184 q 538 391 580 280 l 433 645 l 314 373 "},"â":{"x_min":44,"x_max":706.78125,"ha":706,"o":"m 237 -15 q 98 35 153 -15 q 44 169 44 86 q 212 352 44 301 q 401 421 380 403 q 410 439 410 432 q 373 539 410 502 q 275 577 337 577 q 140 511 185 577 l 135 511 l 115 585 q 230 657 164 632 q 365 683 296 683 q 543 623 479 683 q 608 452 608 564 l 604 213 q 604 166 604 184 q 608 123 604 148 q 625 87 612 99 q 658 76 638 76 q 679 80 666 76 q 702 90 691 84 l 706 40 q 643 1 676 14 q 566 -15 610 -10 q 482 5 520 -15 q 421 64 443 25 q 237 -15 351 -15 m 291 1003 l 413 1003 l 566 755 l 501 755 l 350 878 l 203 755 l 138 755 l 291 1003 m 240 200 q 261 128 240 158 q 321 99 282 99 q 388 131 367 99 q 410 211 410 164 l 410 352 q 287 302 335 338 q 240 200 240 267 "},"}":{"x_min":93,"x_max":579,"ha":683,"o":"m 126 983 q 323 955 243 983 q 403 831 403 927 l 403 756 l 403 588 q 423 478 403 512 q 473 434 443 444 q 539 423 504 424 q 579 422 574 422 l 579 283 q 442 249 481 283 q 403 116 403 216 l 403 -50 q 373 -204 403 -147 q 284 -267 343 -260 q 179 -275 225 -274 q 93 -277 133 -277 l 93 -137 q 201 -121 163 -137 q 240 -43 240 -105 l 240 -4 l 240 155 q 269 285 240 241 q 380 353 298 328 q 268 421 296 378 q 240 553 240 463 l 240 713 q 227 805 240 771 q 166 844 215 838 l 93 844 l 93 983 l 126 983 "},"‰":{"x_min":28,"x_max":1618,"ha":1647,"o":"m 265 910 q 434 844 369 910 q 500 672 500 779 q 435 496 500 562 q 258 431 370 431 q 91 498 154 431 q 28 669 28 565 q 93 843 28 776 q 265 910 158 910 m 831 1015 l 917 1014 l 272 -125 l 184 -125 l 831 1015 m 850 463 q 1020 401 955 463 q 1085 230 1085 339 q 1023 51 1085 117 q 846 -15 961 -15 q 678 51 743 -15 q 613 222 613 118 q 676 398 613 333 q 850 463 739 463 m 1383 463 q 1554 400 1490 463 q 1618 229 1618 337 q 1556 51 1618 117 q 1378 -15 1494 -15 q 1209 51 1274 -15 q 1144 222 1144 118 q 1209 396 1144 329 q 1383 463 1274 463 m 780 112 q 798 57 780 83 q 847 31 817 31 q 895 59 874 31 q 916 114 916 87 q 922 222 922 162 q 922 275 922 248 q 915 338 917 312 q 896 389 912 364 q 848 414 880 414 q 813 404 828 414 q 792 375 797 394 q 777 312 781 347 q 773 241 773 276 l 773 222 q 773 183 773 201 q 780 112 774 165 m 196 561 q 214 505 196 532 q 261 478 232 478 q 297 489 280 478 q 323 525 314 501 q 335 586 332 548 q 339 669 339 625 q 337 723 339 697 q 332 780 336 749 q 311 836 327 811 q 264 861 296 861 q 204 820 222 861 q 191 752 194 786 q 188 669 188 719 q 196 561 188 615 m 1315 112 q 1333 56 1315 82 q 1381 31 1351 31 q 1417 42 1402 31 q 1442 76 1433 53 q 1454 138 1451 100 q 1458 222 1458 176 q 1458 275 1458 248 q 1449 344 1453 312 q 1426 395 1445 376 q 1383 414 1408 414 q 1327 379 1338 414 q 1311 301 1315 344 q 1307 222 1307 258 q 1308 164 1307 190 q 1315 112 1309 139 "},"Ä":{"x_min":-28,"x_max":848.390625,"ha":829,"o":"m 109 323 q 187 512 148 413 q 274 740 225 611 q 350 948 323 870 l 420 945 l 492 948 q 666 463 583 687 q 848 0 749 240 l 718 2 l 579 0 l 551 91 l 497 259 q 399 261 448 259 q 300 264 349 262 l 202 259 l 113 0 q 74 2 95 2 q 42 2 53 2 l 21 2 l -28 0 l 109 323 m 284 1242 q 351 1214 323 1242 q 380 1148 380 1187 q 353 1079 380 1108 q 286 1050 327 1050 q 216 1077 245 1050 q 187 1148 187 1105 q 215 1214 187 1187 q 284 1242 243 1242 m 543 1242 q 611 1215 583 1242 q 639 1148 639 1189 q 613 1078 639 1107 q 546 1050 587 1050 q 478 1077 507 1050 q 449 1148 449 1105 q 476 1214 449 1186 q 543 1242 504 1242 m 352 368 l 462 368 q 414 511 437 450 q 350 662 390 571 q 243 370 296 516 l 352 368 "},"a":{"x_min":47,"x_max":708.15625,"ha":706,"o":"m 237 -15 q 100 35 154 -15 q 47 169 47 86 q 213 352 47 301 q 403 422 380 404 q 410 440 410 433 q 373 541 410 504 q 273 579 337 579 q 197 561 232 579 q 140 509 162 544 l 135 509 l 114 585 q 364 683 218 683 q 541 624 478 683 q 604 452 604 566 l 604 214 q 604 169 604 191 q 606 119 604 148 q 656 76 616 76 q 677 79 665 76 q 702 89 690 83 l 708 40 q 563 -11 644 -11 q 479 7 516 -11 q 421 64 441 26 q 339 4 387 23 q 237 -15 291 -15 m 240 198 q 261 127 240 158 q 322 97 282 97 q 388 131 367 97 q 410 212 410 165 l 410 351 q 287 301 334 337 q 240 198 240 266 "},"—":{"x_min":226.390625,"x_max":1138.890625,"ha":1365,"o":"m 226 421 l 1138 421 l 1138 278 l 226 278 l 226 421 "},"=":{"x_min":169.4375,"x_max":968.0625,"ha":1138,"o":"m 968 615 l 968 484 l 169 484 l 169 615 l 968 615 m 968 329 l 968 196 l 169 196 l 169 329 l 968 329 "},"N":{"x_min":86,"x_max":930.453125,"ha":1010,"o":"m 101 444 q 97 645 101 523 q 94 787 94 768 l 90 931 l 177 926 l 268 934 q 526 623 395 775 q 792 327 657 470 l 792 584 q 787 766 792 643 q 782 931 782 888 q 825 927 811 929 q 854 926 838 926 q 890 927 876 926 q 930 934 904 929 q 919 838 923 889 q 915 738 915 788 q 913 461 915 600 q 911 184 912 322 q 913 106 911 147 q 920 0 915 66 q 876 4 901 2 q 838 6 851 6 q 794 4 812 6 q 756 0 777 2 q 495 309 631 151 q 220 618 359 466 l 220 241 l 227 0 q 194 4 213 1 q 159 6 175 6 q 119 4 134 6 q 86 0 103 2 q 97 208 94 105 q 101 444 101 311 "},"ρ":{"x_min":48,"x_max":759,"ha":793,"o":"m 160 -366 q 48 -374 109 -366 q 52 -291 48 -343 q 56 -223 56 -239 l 56 169 l 48 314 q 139 585 48 488 q 403 683 231 683 q 661 589 563 683 q 759 336 759 495 q 681 89 759 194 q 465 -15 603 -15 q 266 65 346 -15 l 264 -208 q 265 -268 264 -241 q 275 -373 267 -295 q 197 -367 220 -368 q 160 -366 173 -366 m 275 347 q 284 196 275 264 q 324 109 295 142 q 404 77 352 77 q 494 120 473 77 q 522 212 514 164 q 531 347 531 260 q 526 431 531 388 q 517 511 522 473 q 483 582 512 549 q 401 615 453 615 q 309 566 340 615 q 279 452 279 517 q 275 372 275 412 l 275 347 "},"2":{"x_min":33,"x_max":706.625,"ha":749,"o":"m 33 75 q 236 249 152 168 q 379 431 321 330 q 438 652 438 533 q 413 772 438 723 q 325 822 389 822 q 220 767 251 822 q 170 616 189 712 l 155 616 q 44 743 107 691 q 189 867 105 823 q 373 911 273 911 q 586 847 500 911 q 673 658 673 783 q 619 480 673 548 q 304 196 566 411 l 430 195 l 553 195 l 706 201 q 689 94 689 148 q 696 38 689 66 q 706 0 703 11 q 514 3 630 0 q 380 7 399 7 q 181 3 302 7 q 44 0 60 0 l 33 75 "},"ü":{"x_min":75,"x_max":722,"ha":808,"o":"m 292 -15 q 142 41 202 -15 q 83 188 83 98 l 83 337 q 79 508 83 394 q 75 666 75 623 q 134 660 108 662 q 185 658 160 658 q 240 660 209 658 q 300 666 271 663 q 290 454 290 569 l 290 384 l 290 279 q 316 146 290 181 q 394 111 343 111 q 467 147 441 111 q 501 234 493 184 l 501 330 q 498 498 501 385 q 495 666 495 610 q 554 660 518 663 q 613 658 589 658 q 671 660 640 658 q 722 666 701 663 q 717 479 722 598 q 712 326 712 359 q 717 156 712 270 q 722 1 722 43 l 617 4 l 511 1 l 511 96 q 410 15 468 46 q 292 -15 353 -15 m 273 976 q 338 948 310 976 q 366 878 366 920 q 339 811 366 839 q 274 784 313 784 q 205 811 234 784 q 176 878 176 839 q 204 947 176 918 q 273 976 232 976 m 531 976 q 599 948 571 976 q 627 878 627 920 q 599 812 627 841 q 533 784 572 784 q 464 811 495 784 q 434 878 434 839 q 462 947 434 918 q 531 976 490 976 "},"Z":{"x_min":25,"x_max":831.953125,"ha":831,"o":"m 25 54 q 186 311 81 142 q 354 582 291 480 q 495 813 418 685 l 294 813 q 98 801 186 813 l 105 852 q 98 932 105 894 l 444 926 q 657 928 509 926 q 815 931 805 931 l 815 903 q 573 517 695 715 q 331 119 451 320 l 566 119 q 706 122 654 119 q 831 136 758 125 q 826 43 826 96 l 827 0 q 606 3 761 0 q 443 6 451 6 q 203 3 370 6 q 25 0 36 0 l 25 54 "},"u":{"x_min":75,"x_max":722,"ha":808,"o":"m 292 -15 q 141 41 200 -15 q 83 189 83 97 l 83 336 q 79 508 83 393 q 75 667 75 624 q 140 659 109 662 q 185 656 171 656 q 251 661 218 656 q 299 666 285 665 l 290 454 l 290 382 l 290 279 q 316 147 290 182 q 393 112 343 112 q 464 146 441 112 q 497 234 488 181 l 501 331 q 497 498 501 387 q 493 667 493 610 q 563 659 531 662 q 612 656 594 656 q 672 661 640 656 q 722 666 703 665 q 716 495 722 609 q 711 326 711 381 q 716 163 711 272 q 722 1 722 55 l 616 4 l 511 1 l 511 94 q 411 15 470 45 q 292 -15 353 -15 "},"k":{"x_min":80,"x_max":732.765625,"ha":756,"o":"m 93 550 q 86 827 93 648 q 80 1024 80 1005 q 184 1018 125 1018 q 307 1023 252 1018 q 301 812 307 959 q 296 602 296 665 l 296 389 q 424 511 368 445 q 545 666 481 576 q 595 665 562 666 q 645 663 628 663 l 709 666 l 714 656 l 628 576 l 475 425 q 636 154 543 304 l 732 0 q 661 3 706 0 q 607 6 616 6 q 537 3 580 6 q 487 0 494 0 q 386 174 441 83 q 296 329 332 266 q 299 141 296 273 q 302 0 302 9 l 191 4 l 80 0 q 86 320 80 113 q 93 550 93 526 "},"Η":{"x_min":91,"x_max":955,"ha":1049,"o":"m 105 286 l 105 459 q 101 650 105 533 q 98 784 98 766 l 91 932 q 156 926 125 929 q 214 923 187 923 q 277 926 241 923 q 344 931 314 929 q 339 818 344 894 q 334 713 334 741 l 334 563 l 514 561 l 710 561 l 710 712 q 707 812 710 778 q 697 932 705 846 q 764 926 727 929 q 828 923 800 923 q 889 926 854 923 q 955 931 924 929 q 948 690 955 856 q 941 465 941 523 q 948 225 941 391 q 955 0 955 58 l 828 5 q 764 2 807 5 q 698 0 721 0 q 707 99 704 47 q 710 202 710 152 l 710 444 q 595 447 665 444 q 514 451 525 451 q 411 447 475 451 q 334 444 346 444 l 334 202 q 339 97 334 167 q 344 0 344 26 q 270 2 323 0 q 214 5 218 5 l 91 0 q 98 146 91 40 q 105 286 105 252 "},"Α":{"x_min":-29.171875,"x_max":850,"ha":829,"o":"m 109 322 q 193 530 143 400 q 278 751 244 660 q 351 949 312 843 l 420 944 l 490 949 q 672 450 584 685 q 850 0 759 215 l 716 4 l 580 0 l 551 91 l 497 259 q 398 261 448 259 q 300 264 348 262 l 202 259 q 112 0 162 134 l 22 4 l -29 0 l 109 322 m 354 368 l 464 368 q 416 509 440 446 q 355 662 393 572 q 243 370 295 519 l 354 368 "},"ß":{"x_min":84,"x_max":776,"ha":811,"o":"m 198 4 l 84 1 q 87 120 84 45 q 91 212 91 195 l 91 352 l 91 651 q 167 928 91 832 q 420 1024 243 1024 q 603 985 522 1024 q 684 854 684 946 q 607 713 684 786 q 530 601 530 640 q 543 563 530 583 q 574 533 556 543 l 688 447 q 776 275 776 379 q 690 67 776 150 q 478 -15 605 -15 q 373 8 428 -15 l 403 161 l 417 161 q 461 88 435 113 q 535 64 488 64 q 600 91 574 64 q 626 157 626 118 q 504 316 626 219 q 377 476 383 413 q 459 650 377 547 q 542 822 542 754 q 511 908 542 873 q 428 943 481 943 q 327 892 361 943 q 294 770 294 841 q 296 495 294 602 q 301 238 298 387 q 304 1 304 88 l 198 4 "},"é":{"x_min":41,"x_max":684.046875,"ha":729,"o":"m 482 98 q 566 112 532 98 q 643 160 600 126 l 661 151 q 643 96 652 125 q 628 40 634 66 q 521 -1 577 11 q 403 -15 466 -15 q 141 79 241 -15 q 41 336 41 173 q 137 586 41 490 q 386 683 234 683 q 608 601 532 683 q 684 373 684 520 l 684 332 l 267 332 q 325 165 267 232 q 482 98 383 98 m 409 951 q 459 1000 436 983 q 511 1017 481 1017 q 563 994 542 1017 q 585 943 585 971 q 565 895 585 915 q 515 861 545 875 l 292 754 l 223 754 l 409 951 m 478 411 q 481 444 481 422 q 459 566 481 513 q 377 620 438 620 q 292 562 318 620 q 267 437 267 505 l 267 411 l 478 411 "},"s":{"x_min":43,"x_max":543,"ha":583,"o":"m 95 197 q 155 95 115 133 q 256 57 195 57 q 338 77 300 57 q 376 140 376 98 q 213 259 376 195 q 51 456 51 323 q 129 623 51 563 q 319 683 208 683 q 411 671 366 683 q 515 638 455 660 l 464 485 l 450 485 q 397 575 433 542 q 303 608 362 608 q 234 588 264 608 q 205 530 205 569 q 374 417 205 478 q 543 227 543 356 q 464 48 543 112 q 266 -15 386 -15 q 148 -6 201 -15 q 43 26 95 3 l 76 197 l 95 197 "},"B":{"x_min":91,"x_max":773,"ha":815,"o":"m 109 208 l 109 465 q 105 714 109 605 q 91 932 102 823 l 250 929 l 417 929 q 655 881 560 929 q 751 707 751 834 q 692 566 751 618 q 542 503 634 515 l 542 491 q 704 431 636 491 q 773 276 773 372 q 678 69 773 138 q 438 0 584 0 l 250 4 q 152 2 211 4 q 91 0 92 0 q 103 104 97 51 q 109 208 109 158 m 519 698 q 479 803 519 763 q 374 844 440 844 l 335 839 q 331 687 331 766 l 331 540 q 466 578 413 540 q 519 698 519 617 m 380 87 q 490 137 450 87 q 531 258 531 187 q 484 392 531 338 q 360 446 437 446 l 331 446 l 331 276 l 335 91 l 380 87 "},"…":{"x_min":93,"x_max":1053,"ha":1182,"o":"m 195 191 q 268 160 236 191 q 300 88 300 129 q 268 16 300 46 q 195 -13 237 -13 q 123 16 154 -13 q 93 88 93 45 q 123 160 93 129 q 195 191 154 191 m 575 191 q 647 160 615 191 q 679 88 679 129 q 647 16 679 46 q 575 -13 616 -13 q 501 16 532 -13 q 471 88 471 45 q 501 160 471 129 q 575 191 532 191 m 948 191 q 1021 160 989 191 q 1053 88 1053 129 q 1021 16 1053 46 q 948 -13 990 -13 q 876 16 907 -13 q 846 88 846 45 q 876 160 846 129 q 948 191 907 191 "},"?":{"x_min":93,"x_max":539,"ha":597,"o":"m 295 221 q 377 186 340 221 q 414 104 414 152 q 378 23 414 61 q 295 -15 343 -15 q 210 19 245 -15 q 175 103 175 53 q 211 183 175 146 q 295 221 247 221 m 433 288 q 378 277 411 280 q 339 275 344 275 q 201 329 261 275 q 142 459 142 383 q 238 620 142 530 q 335 777 335 709 q 310 838 335 812 q 252 864 286 864 q 175 838 211 864 q 119 775 138 813 l 101 777 q 93 891 101 843 q 294 949 181 949 q 467 890 395 949 q 539 730 539 832 q 429 554 539 644 q 320 407 320 464 q 338 363 320 378 q 386 349 357 349 q 421 353 403 349 q 448 358 439 357 l 433 288 "},"H":{"x_min":91,"x_max":957,"ha":1049,"o":"m 105 284 l 105 461 q 101 651 105 534 q 98 787 98 768 l 91 932 q 153 927 107 932 q 222 922 200 922 q 288 926 252 922 q 345 932 324 930 q 336 827 339 886 q 334 712 334 769 l 334 564 l 515 560 l 710 564 l 710 712 q 699 932 710 833 q 767 927 721 932 q 829 922 813 922 q 895 927 851 922 q 956 932 940 932 q 943 702 947 829 q 939 461 939 576 q 942 217 939 306 q 957 0 945 128 q 883 3 930 0 q 829 6 837 6 q 755 3 804 6 q 698 0 706 0 q 707 97 704 35 q 710 201 710 158 l 710 445 q 599 447 676 445 q 515 450 522 450 l 334 445 l 334 201 q 336 88 334 120 q 345 0 338 56 q 278 2 322 0 q 215 5 234 5 q 153 2 194 5 q 91 0 111 0 q 98 146 91 40 q 105 284 105 252 "},"ν":{"x_min":9,"x_max":658,"ha":694,"o":"m 470 438 q 463 504 470 477 q 422 642 457 532 q 641 671 528 660 q 658 582 658 626 q 614 412 658 494 l 541 270 q 462 107 487 161 q 417 0 438 53 q 374 3 403 0 q 331 8 345 8 q 289 3 317 8 q 246 0 261 0 q 165 236 209 110 q 85 458 121 361 q 9 667 49 555 q 72 661 40 664 q 128 659 103 659 q 184 661 152 659 q 245 666 217 664 q 403 184 300 449 q 454 328 438 275 q 470 438 470 381 "},"î":{"x_min":-15,"x_max":413,"ha":396,"o":"m 93 126 l 93 543 q 87 602 93 558 q 82 666 82 645 q 141 661 111 664 q 198 659 172 659 q 255 661 223 659 q 316 666 287 664 q 311 621 315 658 q 303 544 307 584 l 303 319 q 305 144 303 212 q 316 0 307 76 l 196 2 l 81 0 q 93 126 93 66 m 136 1003 l 258 1003 l 413 755 l 345 755 l 198 878 l 50 755 l -15 755 l 136 1003 "},"c":{"x_min":36,"x_max":623.109375,"ha":660,"o":"m 421 600 q 306 530 344 600 q 268 376 268 461 q 313 177 268 266 q 459 88 359 88 q 539 99 498 88 q 608 135 580 111 l 617 126 l 587 21 q 500 -5 546 3 q 404 -15 454 -15 q 140 76 245 -15 q 36 324 36 168 q 140 583 36 484 q 406 683 245 683 q 623 638 514 683 q 607 570 617 620 q 587 462 596 520 l 562 462 q 515 561 550 522 q 421 600 480 600 "},"¶":{"x_min":18,"x_max":531,"ha":590,"o":"m 298 968 l 531 968 l 531 910 l 473 910 l 473 4 l 415 4 l 415 910 l 305 910 l 305 4 l 247 4 l 247 558 q 99 601 163 558 q 27 690 36 645 q 18 744 18 734 q 90 896 18 824 q 298 968 163 968 "},"β":{"x_min":82,"x_max":753,"ha":828,"o":"m 91 -115 q 86 188 91 -19 q 82 493 82 397 q 85 654 82 597 q 102 796 88 711 q 205 951 115 882 q 421 1021 294 1021 q 626 953 540 1021 q 713 770 713 886 q 671 634 713 690 q 553 542 629 579 q 700 438 647 506 q 753 273 753 369 q 680 68 753 152 q 490 -15 608 -15 q 390 0 435 -15 q 298 50 345 16 l 298 -105 l 306 -371 q 246 -365 278 -368 q 192 -362 214 -362 q 138 -365 169 -362 q 82 -370 108 -368 q 86 -238 82 -327 q 91 -115 91 -148 m 372 572 q 474 623 445 572 q 503 757 503 674 q 484 897 503 839 q 403 956 466 956 q 332 908 354 956 q 305 807 310 861 q 299 683 300 752 q 298 551 298 613 l 298 269 q 320 131 298 188 q 412 75 343 75 q 501 135 477 75 q 525 273 525 195 q 496 431 525 377 q 372 486 467 486 l 372 572 "},"Μ":{"x_min":32,"x_max":1165,"ha":1217,"o":"m 105 465 l 168 932 q 211 927 190 929 q 261 926 231 926 q 309 929 277 926 q 358 932 341 932 q 441 709 409 790 q 503 559 473 629 q 608 316 533 488 l 778 690 q 872 932 834 808 q 919 929 887 932 q 966 926 951 926 q 1027 929 1006 926 q 1059 932 1048 932 l 1105 473 q 1130 240 1117 354 q 1165 0 1144 127 q 1095 3 1140 0 q 1041 6 1051 6 q 969 3 1015 6 q 915 0 924 0 q 895 291 915 142 l 865 616 q 731 317 802 480 q 597 0 661 153 l 551 0 l 500 0 q 409 218 465 87 q 317 426 352 349 q 236 605 282 504 l 196 229 q 185 108 190 173 q 180 0 180 44 q 134 3 165 0 q 100 6 102 6 q 60 4 77 6 q 32 0 43 1 q 105 465 77 258 "},"Ό":{"x_min":-28,"x_max":1364,"ha":1407,"o":"m 855 949 q 1223 829 1082 949 q 1364 486 1364 710 q 1220 114 1364 244 q 830 -15 1076 -15 q 454 107 591 -15 q 318 465 318 229 q 466 823 318 697 q 855 949 615 949 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 265 863 295 878 l 40 755 l -28 755 l 158 953 m 840 73 q 1051 194 984 73 q 1118 472 1118 315 q 1051 742 1118 624 q 844 860 984 860 q 631 742 698 860 q 565 465 565 624 q 631 193 565 313 q 840 73 698 73 "},"Ή":{"x_min":-28,"x_max":1333.109375,"ha":1424,"o":"m 482 284 l 482 460 q 478 651 482 534 q 474 787 474 768 l 468 931 q 530 927 484 931 q 599 922 577 922 q 665 926 629 922 q 722 931 701 930 q 713 827 716 886 q 711 711 711 769 l 711 563 l 891 560 l 1086 564 l 1086 712 q 1075 931 1086 833 q 1143 927 1097 931 q 1205 922 1190 922 q 1272 927 1227 922 q 1333 931 1316 931 q 1319 702 1323 829 q 1315 460 1315 576 q 1318 217 1315 306 q 1333 0 1321 128 q 1260 3 1306 0 q 1205 6 1213 6 q 1131 3 1180 6 q 1074 0 1083 0 q 1083 97 1080 35 q 1086 201 1086 158 l 1086 444 q 975 447 1052 444 q 891 450 898 450 l 711 444 l 711 201 q 713 88 711 120 q 722 0 715 56 q 655 2 699 0 q 592 5 611 5 q 530 2 571 5 q 468 0 488 0 q 475 146 468 40 q 482 284 482 252 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 265 863 295 878 l 40 755 l -28 755 l 158 953 "},"•":{"x_min":215.28125,"x_max":805.5625,"ha":1024,"o":"m 512 803 q 718 714 631 803 q 805 505 805 626 q 719 299 805 387 q 512 212 633 212 q 301 298 387 212 q 215 505 215 384 q 303 714 215 626 q 512 803 391 803 "},"¥":{"x_min":8,"x_max":752,"ha":764,"o":"m 38 252 l 38 336 l 160 332 l 277 332 l 277 417 q 140 413 225 417 q 38 410 55 410 l 38 494 q 131 486 87 486 l 228 486 l 143 644 q 87 751 114 704 q 8 888 60 799 q 82 884 34 888 q 138 881 130 881 q 213 884 167 881 q 265 888 258 888 q 433 529 349 696 q 524 707 478 613 q 608 888 571 802 q 640 888 624 888 q 674 888 657 888 l 752 888 q 602 642 653 729 q 516 486 551 554 l 722 494 l 722 410 q 583 413 668 410 q 485 417 497 417 l 485 331 l 722 336 l 722 252 q 604 255 690 252 q 485 258 518 258 q 490 123 485 213 q 495 0 495 33 l 386 5 q 316 2 364 5 q 264 0 268 0 q 274 126 271 59 q 277 258 277 194 q 140 255 235 258 q 38 252 45 252 "},"(":{"x_min":91,"x_max":403.5,"ha":449,"o":"m 249 479 l 249 379 l 249 277 q 287 54 249 161 q 402 -158 326 -53 l 356 -201 q 158 57 225 -80 q 91 365 91 195 q 158 683 91 541 q 359 949 225 825 l 403 906 q 288 701 328 808 q 249 479 249 594 "},"U":{"x_min":82,"x_max":910,"ha":999,"o":"m 211 926 q 275 929 232 926 q 338 932 318 932 q 325 681 329 826 q 321 421 321 536 q 373 175 321 241 q 521 110 425 110 q 678 161 611 110 q 755 278 746 212 q 768 419 765 344 q 771 547 771 494 q 754 931 771 761 l 812 926 l 910 932 q 903 769 910 882 q 896 615 896 655 l 896 480 q 896 427 896 462 q 896 375 896 391 q 793 82 896 180 q 494 -15 691 -15 q 211 55 323 -15 q 100 286 100 126 q 91 616 100 383 q 82 932 82 850 q 154 929 102 932 q 211 926 207 926 "},"γ":{"x_min":0,"x_max":713.890625,"ha":700,"o":"m 523 199 q 486 87 498 128 q 474 -62 474 47 q 477 -246 474 -135 q 481 -374 481 -357 q 407 -366 442 -368 q 326 -365 373 -365 l 250 -370 q 258 -204 250 -315 q 267 -72 267 -93 q 246 138 267 52 q 189 344 225 224 q 130 512 154 463 q 50 561 105 561 q 25 558 38 561 q 0 553 11 555 l 0 635 q 79 669 38 656 q 159 683 119 683 q 329 593 293 683 q 433 233 365 503 q 519 456 482 349 q 576 666 555 562 l 644 663 l 713 666 q 633 490 665 572 q 523 199 601 408 "},"α":{"x_min":30,"x_max":827.21875,"ha":878,"o":"m 669 665 l 749 662 l 827 665 q 763 499 782 551 q 720 377 743 447 l 818 0 q 763 6 792 2 q 717 10 733 10 q 662 5 692 10 q 615 0 632 1 l 594 101 q 361 -15 501 -15 q 120 83 210 -15 q 30 334 30 182 q 123 583 30 484 q 368 683 217 683 q 515 647 449 683 q 633 547 582 612 q 651 601 640 563 q 669 665 662 638 m 383 614 q 313 588 343 614 q 276 523 283 562 q 260 434 265 484 q 256 333 256 385 q 269 174 256 249 q 305 87 275 122 q 385 52 335 52 q 509 144 473 52 q 546 340 546 236 q 522 504 546 428 q 455 597 498 580 q 383 614 411 614 "},"F":{"x_min":91,"x_max":645.15625,"ha":686,"o":"m 109 465 q 105 710 109 620 q 91 932 102 800 l 357 926 q 520 929 406 926 q 645 932 635 932 l 638 871 q 645 810 638 844 q 524 815 607 810 q 415 820 442 820 l 339 820 q 337 663 339 778 q 335 546 335 548 l 634 557 l 629 494 l 634 431 q 462 437 573 431 q 335 443 350 443 l 335 236 q 337 106 335 149 q 348 0 339 62 l 219 2 l 91 0 q 105 209 102 102 q 109 465 109 316 "},"­":{"x_min":0,"x_max":683.328125,"ha":683,"o":"m 0 421 l 683 421 l 683 278 l 0 278 l 0 421 "},":":{"x_min":105,"x_max":343,"ha":447,"o":"m 223 221 q 307 185 272 221 q 343 103 343 150 q 306 19 343 54 q 223 -15 270 -15 q 139 18 174 -15 q 105 103 105 51 q 139 186 105 151 q 223 221 174 221 m 223 654 q 306 617 270 654 q 343 532 343 581 q 306 450 343 485 q 223 416 270 416 q 139 449 174 416 q 105 534 105 482 q 139 619 105 584 q 223 654 174 654 "},"Χ":{"x_min":-1.390625,"x_max":801.390625,"ha":782,"o":"m 169 241 l 301 436 l 15 932 q 94 929 38 932 q 155 926 150 926 q 235 929 179 926 q 298 932 291 932 q 314 893 308 907 q 358 802 320 880 l 445 638 q 547 805 513 748 q 613 932 581 862 q 655 929 627 932 q 698 926 683 926 q 740 929 712 926 q 783 932 768 932 q 685 800 709 833 q 616 701 661 766 l 502 531 l 801 0 q 713 2 776 0 q 647 5 651 5 l 516 0 l 470 108 l 356 326 q 265 174 316 263 q 170 0 215 84 q 118 3 154 0 q 77 6 81 6 q 31 4 52 6 q -1 0 11 1 l 169 241 "},"*":{"x_min":91,"x_max":588,"ha":683,"o":"m 154 520 q 128 571 139 550 q 91 634 117 593 q 186 665 139 650 q 284 698 234 680 q 190 734 242 716 q 91 765 139 751 q 154 879 125 816 l 310 750 l 298 808 l 275 949 l 339 947 l 405 948 l 368 745 l 525 879 q 588 765 553 822 q 398 698 499 737 q 490 664 441 680 q 588 634 539 648 q 557 581 574 612 q 525 520 540 551 l 370 650 q 389 528 381 580 q 404 443 397 476 l 337 446 l 273 446 l 310 650 l 154 520 "},"°":{"x_min":165,"x_max":519,"ha":683,"o":"m 165 913 q 221 1032 165 980 q 351 1084 278 1084 q 469 1040 420 1084 q 519 926 519 996 q 464 804 519 853 q 335 755 409 755 q 214 799 264 755 q 165 913 165 844 m 241 905 q 268 832 241 863 q 338 801 295 801 q 414 837 388 801 q 441 927 441 874 q 416 1009 441 977 q 345 1042 392 1042 q 281 1018 310 1042 q 247 962 253 994 q 241 905 241 930 "},"V":{"x_min":-19.4375,"x_max":856.953125,"ha":818,"o":"m 255 230 l -19 932 q 61 929 4 932 q 120 926 117 926 l 247 932 q 298 768 270 840 l 476 296 l 646 770 q 673 852 662 812 q 692 932 685 891 l 766 926 q 812 929 781 926 q 856 932 843 932 q 752 706 801 819 l 566 231 q 488 0 520 123 q 445 4 463 2 q 413 6 427 6 q 368 3 397 6 q 336 0 340 0 q 304 97 322 46 q 255 230 286 147 "},"Ξ":{"x_min":58.328125,"x_max":816.671875,"ha":876,"o":"m 438 190 q 653 193 518 190 q 816 197 788 197 q 812 124 812 160 l 812 99 q 812 51 812 74 q 816 0 812 27 q 629 4 754 0 q 438 8 504 8 q 248 4 375 8 q 58 0 122 0 l 63 98 l 58 197 q 281 193 145 197 q 438 190 418 190 m 438 747 q 258 743 379 747 q 77 739 137 739 q 84 804 83 784 q 84 834 84 823 q 77 932 84 879 q 267 927 140 932 q 438 922 394 922 q 626 927 500 922 q 797 932 752 932 l 793 835 l 797 739 q 619 743 738 739 q 438 747 500 747 m 708 467 l 713 375 q 577 379 669 375 q 438 383 486 383 q 300 379 391 383 q 162 375 208 375 q 165 418 163 397 q 168 468 168 440 q 165 523 168 484 q 162 567 162 562 q 438 554 300 554 q 713 566 577 554 l 708 467 "}," ":{"x_min":0,"x_max":0,"ha":375},"Ϋ":{"x_min":-32,"x_max":797,"ha":747,"o":"m 133 650 q 52 795 94 720 q -32 931 11 869 l 91 928 l 256 932 q 365 700 329 773 q 441 554 401 627 q 541 731 491 634 q 636 932 590 827 l 711 928 l 797 932 q 644 689 714 812 q 498 420 573 566 l 502 143 l 509 0 l 413 5 l 256 0 q 261 118 256 38 q 267 236 267 197 l 267 402 l 133 650 m 242 1242 q 309 1215 281 1242 q 337 1148 337 1189 q 311 1078 337 1107 q 243 1050 285 1050 q 173 1078 203 1050 q 144 1148 144 1107 q 173 1214 144 1186 q 242 1242 202 1242 m 502 1242 q 571 1214 542 1242 q 600 1148 600 1187 q 572 1078 600 1107 q 505 1050 545 1050 q 435 1077 463 1050 q 408 1148 408 1105 q 435 1214 408 1186 q 502 1242 463 1242 "},"0":{"x_min":34,"x_max":709,"ha":749,"o":"m 367 -19 q 104 104 175 -19 q 34 436 34 228 q 109 777 34 644 q 377 910 184 910 q 640 785 572 910 q 709 443 709 660 q 635 108 709 236 q 367 -19 561 -19 m 260 447 q 261 330 260 382 q 269 213 262 279 q 296 101 276 147 q 374 56 316 56 q 453 108 430 56 q 477 221 477 160 q 480 287 478 254 q 483 458 483 365 q 480 590 483 543 q 477 665 478 637 q 452 779 477 727 q 372 832 428 832 q 281 765 299 832 q 263 598 263 698 q 261 505 263 561 q 260 447 260 448 "},"”":{"x_min":72.21875,"x_max":615.28125,"ha":654,"o":"m 72 528 l 152 848 q 183 920 159 891 q 245 949 206 949 q 311 926 286 949 q 337 861 337 903 q 315 797 337 827 l 112 511 l 72 528 m 351 528 l 430 848 q 462 919 437 889 q 525 949 487 949 q 588 925 562 949 q 615 864 615 901 q 609 829 615 845 q 594 797 604 813 l 391 511 l 351 528 "},"@":{"x_min":59,"x_max":1305,"ha":1365,"o":"m 581 72 q 418 131 475 72 q 362 298 362 191 q 455 554 362 437 q 684 672 548 672 q 771 650 734 672 q 843 586 808 629 l 877 653 l 998 653 l 897 254 l 893 229 q 912 193 893 205 q 957 181 931 181 q 1119 290 1056 181 q 1183 504 1183 399 q 1060 772 1183 668 q 771 877 937 877 q 354 735 526 877 q 183 353 183 594 q 327 20 183 140 q 689 -100 471 -100 q 898 -66 792 -100 q 1092 25 1004 -33 l 1143 -51 q 689 -204 945 -204 q 244 -54 429 -204 q 59 348 59 94 q 261 804 59 621 q 739 988 464 988 q 1134 856 964 988 q 1305 505 1305 725 q 1195 206 1305 340 q 920 72 1085 72 l 895 72 q 818 90 846 72 q 777 180 791 108 q 691 99 739 127 q 581 72 643 72 m 693 578 q 552 487 600 578 q 505 294 505 397 q 532 207 505 245 q 606 169 560 169 q 712 212 668 169 q 772 322 756 256 l 808 466 q 773 546 804 515 q 693 578 742 578 "},"Ί":{"x_min":-28,"x_max":728,"ha":822,"o":"m 485 402 q 481 715 485 609 q 468 931 477 822 q 535 925 498 929 q 594 922 572 922 q 666 927 620 922 q 727 931 713 931 q 714 716 717 819 q 711 465 711 613 q 714 221 711 326 q 728 0 718 116 q 647 2 704 0 q 588 5 590 5 l 469 0 q 481 199 477 88 q 485 402 485 310 m 157 953 q 210 1001 190 986 q 258 1017 230 1017 q 311 994 290 1017 q 332 943 332 972 q 313 897 332 916 q 264 863 294 878 l 40 755 l -28 755 l 157 953 "},"ö":{"x_min":32,"x_max":743,"ha":775,"o":"m 395 683 q 647 588 551 683 q 743 337 743 494 q 648 79 743 173 q 387 -15 554 -15 q 129 78 227 -15 q 32 333 32 172 q 130 590 32 497 q 395 683 229 683 m 257 976 q 324 948 296 976 q 352 878 352 920 q 325 811 352 839 q 258 784 299 784 q 190 811 221 784 q 160 878 160 839 q 188 947 160 918 q 257 976 217 976 m 517 976 q 585 948 557 976 q 613 878 613 920 q 586 811 613 839 q 519 784 560 784 q 450 811 479 784 q 421 878 421 839 q 449 947 421 918 q 517 976 478 976 m 269 174 q 307 85 277 120 q 387 50 337 50 q 466 84 437 50 q 500 156 494 119 q 511 215 507 194 q 517 335 517 271 q 511 450 517 395 q 500 509 507 471 q 466 582 494 548 q 387 616 439 616 q 294 564 319 616 q 263 459 269 513 q 258 333 258 406 q 260 244 258 270 q 269 174 262 217 "},"i":{"x_min":80,"x_max":314.71875,"ha":396,"o":"m 196 1014 q 273 980 240 1014 q 307 902 307 947 q 274 825 307 858 q 196 793 241 793 q 118 824 151 793 q 85 902 85 856 q 118 980 85 947 q 196 1014 151 1014 m 91 127 l 91 543 l 80 666 q 140 660 109 663 q 196 658 171 658 q 253 660 223 658 q 314 666 284 663 l 301 545 l 301 319 q 302 145 301 206 q 312 0 304 84 l 194 4 l 81 0 q 88 64 85 33 q 91 127 91 95 "},"Β":{"x_min":91,"x_max":773,"ha":815,"o":"m 109 208 l 109 465 q 105 714 109 605 q 91 932 102 823 l 250 929 l 417 929 q 655 881 560 929 q 751 707 751 834 q 692 566 751 618 q 542 503 634 515 l 542 491 q 704 431 636 491 q 773 276 773 372 q 678 69 773 138 q 438 0 584 0 l 250 4 q 152 2 211 4 q 91 0 92 0 q 103 104 97 51 q 109 208 109 158 m 519 698 q 479 803 519 763 q 374 844 440 844 l 335 839 q 331 687 331 766 l 331 540 q 466 578 413 540 q 519 698 519 617 m 380 87 q 490 137 450 87 q 531 258 531 187 q 484 392 531 338 q 360 446 437 446 l 331 446 l 331 276 l 335 91 l 380 87 "},"≤":{"x_min":170.984375,"x_max":962.28125,"ha":1139,"o":"m 960 690 l 403 514 l 960 338 l 960 200 l 171 455 l 170 572 l 960 830 l 960 690 m 962 132 l 962 0 l 171 0 l 171 132 l 962 132 "},"υ":{"x_min":82,"x_max":765,"ha":843,"o":"m 765 416 q 663 115 765 245 q 401 -15 562 -15 q 162 56 243 -15 q 82 284 82 128 l 86 479 q 84 590 86 523 q 82 666 82 656 q 145 663 99 666 q 195 661 191 661 q 263 663 216 661 q 311 666 309 666 q 295 477 301 566 q 290 294 290 387 q 310 122 290 193 q 402 52 330 52 q 515 146 487 52 q 544 351 544 240 q 525 502 544 433 q 469 656 507 570 q 580 659 528 656 q 684 673 632 662 q 743 548 721 614 q 765 416 765 482 "},"]":{"x_min":76,"x_max":385.71875,"ha":454,"o":"m 80 -129 l 76 -85 l 227 -88 q 231 134 227 -14 q 235 356 235 282 q 231 605 235 438 q 227 855 227 771 l 164 855 l 76 855 l 80 885 q 80 908 80 896 q 76 931 77 925 l 230 926 l 385 933 l 373 566 l 373 359 l 373 199 l 383 -164 l 227 -157 q 141 -160 195 -157 q 76 -164 86 -164 l 80 -129 "},"m":{"x_min":80,"x_max":1135,"ha":1217,"o":"m 91 329 q 85 517 91 394 q 80 667 80 640 l 184 662 l 293 666 l 293 571 q 392 651 334 619 q 511 683 450 683 q 628 653 579 683 q 700 559 676 623 q 791 651 733 620 q 921 683 849 683 q 1068 624 1011 683 q 1125 477 1125 566 l 1125 331 q 1130 158 1125 274 q 1135 0 1135 41 q 1070 2 1116 0 q 1019 5 1024 5 q 954 2 999 5 q 905 0 909 0 q 910 155 905 51 q 915 298 915 259 l 915 385 q 896 506 915 458 q 818 554 877 554 q 755 528 779 554 q 719 460 730 502 q 712 381 714 426 q 710 319 710 335 q 715 153 710 265 q 720 0 720 41 q 656 3 694 0 q 608 6 617 6 q 544 3 585 6 q 496 0 504 0 q 501 155 496 51 q 506 298 506 259 l 506 385 q 487 505 506 456 q 409 554 469 554 q 346 528 370 554 q 310 460 321 502 q 303 381 305 426 q 301 319 301 335 q 306 153 301 265 q 311 0 311 41 q 243 3 284 0 q 195 6 202 6 q 128 3 170 6 q 80 0 86 0 q 85 163 80 53 q 91 329 91 273 "},"χ":{"x_min":15.28125,"x_max":730.5625,"ha":731,"o":"m 569 380 l 472 204 l 545 31 q 631 -159 586 -62 q 729 -368 676 -255 l 600 -363 q 475 -371 537 -363 q 404 -147 438 -259 l 350 1 l 268 -155 q 218 -260 242 -204 q 176 -371 194 -316 q 105 -363 143 -363 q 16 -371 62 -363 q 97 -240 52 -319 q 197 -66 141 -162 l 298 111 l 168 423 q 130 509 148 466 q 63 568 101 563 l 15 564 l 15 638 q 166 683 83 683 q 286 628 252 683 q 367 445 320 573 l 422 318 l 499 479 q 572 665 544 582 l 634 662 q 697 665 674 662 q 730 668 719 668 l 569 380 "},"8":{"x_min":34,"x_max":710,"ha":749,"o":"m 511 492 q 654 412 598 471 q 710 266 710 352 q 607 53 710 128 q 360 -21 504 -21 q 131 50 229 -21 q 34 248 34 122 q 88 406 34 341 q 235 492 143 471 l 235 502 q 117 568 164 516 q 71 689 71 620 q 165 855 71 802 q 382 908 259 908 q 584 857 498 908 q 671 696 671 806 q 628 574 671 621 q 511 502 586 526 l 511 492 m 373 528 q 456 573 432 528 q 481 684 481 618 q 458 792 481 748 q 376 836 435 836 q 290 791 316 836 q 264 683 264 747 q 291 575 264 622 q 373 528 318 528 m 369 55 q 464 117 439 55 q 489 259 489 180 q 465 396 489 335 q 379 457 441 457 q 285 393 314 457 q 256 256 256 329 q 278 114 256 174 q 369 55 301 55 "},"ί":{"x_min":80,"x_max":478.609375,"ha":396,"o":"m 91 126 l 91 543 l 80 666 q 139 660 105 663 q 196 658 173 658 q 264 660 238 658 q 314 666 291 663 q 304 586 307 616 q 301 523 301 557 l 301 113 q 302 72 301 88 q 314 0 304 56 l 195 4 l 81 0 q 87 67 84 30 q 91 126 91 104 m 303 953 q 357 1001 337 986 q 406 1017 377 1017 q 457 994 437 1017 q 478 943 478 972 q 459 897 478 915 q 410 863 441 878 l 187 755 l 118 755 l 303 953 "},"Ζ":{"x_min":25,"x_max":831.953125,"ha":831,"o":"m 25 54 q 186 311 81 142 q 354 582 291 480 q 495 813 418 685 l 294 813 q 98 801 186 813 l 105 852 q 98 932 105 894 l 444 926 q 657 928 509 926 q 815 931 805 931 l 815 903 q 573 517 695 715 q 331 119 451 320 l 566 119 q 706 122 654 119 q 831 136 758 125 q 826 43 826 96 l 827 0 q 606 3 761 0 q 443 6 451 6 q 203 3 370 6 q 25 0 36 0 l 25 54 "},"R":{"x_min":87,"x_max":860.609375,"ha":836,"o":"m 106 398 q 96 663 106 486 q 87 931 87 841 l 182 927 q 295 932 207 927 q 420 938 382 938 q 699 874 625 938 q 773 697 773 811 q 713 538 773 603 q 560 465 654 474 q 701 235 627 350 q 860 0 775 120 l 753 5 l 578 0 q 469 202 531 100 q 320 438 408 304 l 320 258 q 322 114 320 154 q 331 0 324 75 q 261 3 304 0 q 211 6 217 6 q 140 3 184 6 q 87 0 95 0 q 96 198 87 65 q 106 398 106 331 m 544 689 q 505 805 544 760 q 397 850 467 850 l 324 850 l 320 696 l 320 506 q 483 548 422 506 q 544 689 544 590 "},"×":{"x_min":183.828125,"x_max":970.171875,"ha":1139,"o":"m 577 501 l 877 800 l 970 706 l 670 408 l 970 106 l 876 13 l 577 314 l 277 13 l 184 106 l 483 408 l 183 706 l 277 800 l 577 501 "},"o":{"x_min":30,"x_max":741,"ha":774,"o":"m 395 683 q 645 587 550 683 q 741 337 741 492 q 646 79 741 173 q 385 -15 552 -15 q 127 78 225 -15 q 30 333 30 172 q 129 590 30 498 q 395 683 228 683 m 269 174 q 305 85 275 119 q 386 52 335 52 q 464 85 436 52 q 503 172 491 119 q 510 237 506 194 q 515 336 515 279 q 510 431 515 391 q 503 494 506 472 q 464 581 491 548 q 385 615 436 615 q 291 563 315 615 q 261 459 267 512 q 256 333 256 407 q 269 174 256 248 "},"5":{"x_min":46,"x_max":670,"ha":749,"o":"m 284 60 q 397 118 360 60 q 434 258 434 176 q 404 391 434 333 q 307 450 375 450 q 183 388 238 450 l 118 422 q 128 525 126 467 q 131 606 131 583 q 126 749 131 684 q 108 878 121 814 l 118 888 q 268 883 173 888 q 387 878 362 878 q 635 888 519 878 l 630 793 q 636 696 630 739 q 479 702 579 696 q 365 709 378 709 l 225 709 q 213 501 213 608 q 399 548 301 548 q 591 480 513 548 q 670 300 670 413 q 559 59 670 139 q 280 -21 449 -21 q 156 -7 222 -21 q 46 32 90 5 q 94 133 74 84 q 131 238 115 182 l 152 237 q 180 109 152 158 q 284 60 208 60 "},"7":{"x_min":96,"x_max":760,"ha":749,"o":"m 333 343 l 549 689 q 439 693 511 689 q 329 697 366 697 q 221 694 272 697 q 98 689 171 691 q 105 755 104 734 q 105 787 105 775 q 102 844 105 808 q 98 888 98 881 l 401 883 l 741 887 l 760 849 q 312 0 491 452 l 216 0 l 105 0 l 96 18 q 229 187 177 119 q 333 343 280 255 "},"K":{"x_min":90,"x_max":892.78125,"ha":856,"o":"m 334 716 l 334 515 l 569 787 q 635 866 619 845 q 682 932 651 886 l 767 926 q 817 929 784 926 q 870 932 851 932 q 687 746 790 851 q 503 554 585 641 l 623 377 q 892 0 753 179 l 753 5 q 664 2 727 5 q 595 0 600 0 q 484 190 545 98 q 334 404 424 281 l 334 193 q 348 0 334 94 q 270 2 325 0 q 212 5 215 5 l 90 0 q 99 236 90 69 q 108 461 108 402 q 103 623 108 515 q 99 787 99 731 l 90 932 q 157 927 113 932 q 219 922 201 922 q 282 925 252 922 q 342 932 312 927 q 338 831 342 907 q 334 716 334 755 "},",":{"x_min":25,"x_max":319.4375,"ha":375,"o":"m 109 121 q 146 203 119 168 q 218 238 173 238 q 289 208 259 238 q 319 136 319 178 q 313 101 319 118 q 294 64 306 85 l 62 -253 l 25 -238 l 109 121 "},"d":{"x_min":54,"x_max":744,"ha":825,"o":"m 318 -15 q 115 84 177 -15 q 54 336 54 184 q 124 583 54 483 q 336 683 194 683 q 525 584 451 683 l 525 738 l 518 1024 q 581 1016 554 1019 q 630 1013 609 1013 q 678 1015 653 1013 q 744 1023 703 1018 q 740 900 744 983 q 736 775 736 816 q 738 403 736 627 q 740 176 740 179 l 744 0 q 680 3 721 0 q 630 6 638 6 q 568 3 608 6 q 520 0 528 0 q 523 39 522 16 q 525 85 525 62 q 430 8 477 32 q 318 -15 383 -15 m 396 587 q 328 562 355 587 q 289 499 300 538 q 273 409 277 460 q 269 316 269 358 q 295 158 269 227 q 396 89 321 89 q 501 167 473 89 q 530 338 530 245 q 503 511 530 435 q 396 587 477 587 "},"¨":{"x_min":65.28125,"x_max":609.71875,"ha":654,"o":"m 251 613 q 218 541 243 570 q 154 512 194 512 q 90 537 116 512 q 65 601 65 563 q 87 665 65 634 l 291 949 l 331 933 l 251 613 m 530 613 q 498 542 525 573 q 433 512 472 512 q 371 536 397 512 q 345 598 345 560 q 366 665 345 633 l 570 949 l 609 933 l 530 613 "},"E":{"x_min":90,"x_max":644.15625,"ha":703,"o":"m 108 222 l 108 465 q 104 710 108 620 q 91 932 101 800 l 357 926 q 520 929 405 926 q 644 932 634 932 q 640 903 641 916 q 638 872 638 890 q 639 848 638 857 q 644 810 640 840 q 530 815 606 810 q 414 820 453 820 l 338 820 l 334 545 l 634 557 q 630 527 631 541 q 628 494 628 514 l 633 431 q 459 437 571 431 q 334 444 347 444 l 334 296 q 336 190 334 264 q 338 113 338 115 q 638 129 489 113 l 634 63 l 638 0 q 433 3 562 0 q 278 7 305 7 q 169 3 235 7 q 90 0 102 0 q 102 114 96 54 q 108 222 108 175 "},"Y":{"x_min":-30,"x_max":797,"ha":747,"o":"m 136 650 q 67 772 123 672 q -30 932 10 872 l 92 926 q 184 929 120 926 q 256 931 249 931 q 345 740 304 825 q 442 554 386 656 q 541 730 492 636 q 637 931 589 825 l 712 926 q 753 929 726 926 q 797 931 781 931 q 644 689 714 812 q 498 420 573 566 l 502 143 l 508 0 l 414 5 l 256 0 q 262 138 256 50 q 269 237 269 226 l 269 402 l 136 650 "},"\"":{"x_min":53,"x_max":399,"ha":451,"o":"m 181 958 l 181 586 l 53 586 l 53 958 l 181 958 m 399 958 l 399 586 l 271 586 l 271 958 l 399 958 "},"ê":{"x_min":41,"x_max":684.046875,"ha":729,"o":"m 482 98 q 566 112 532 98 q 643 160 600 126 l 661 151 q 643 96 652 125 q 628 40 634 66 q 521 -1 577 11 q 403 -15 466 -15 q 141 79 241 -15 q 41 336 41 173 q 137 586 41 490 q 386 683 234 683 q 608 601 532 683 q 684 373 684 520 l 684 332 l 267 332 q 325 165 267 232 q 482 98 383 98 m 302 1001 l 426 1001 l 577 754 l 512 754 l 364 876 l 216 754 l 149 754 l 302 1001 m 478 411 q 481 444 481 422 q 459 566 481 513 q 377 620 438 620 q 292 562 318 620 q 267 437 267 505 l 267 411 l 478 411 "},"δ":{"x_min":30,"x_max":688,"ha":719,"o":"m 543 794 q 498 889 531 854 q 407 924 465 924 q 329 895 362 924 q 296 822 296 867 q 393 671 296 739 q 585 539 490 603 q 688 308 688 444 q 600 71 688 157 q 359 -15 513 -15 q 119 70 209 -15 q 30 305 30 155 q 88 503 30 419 q 256 614 147 586 q 130 696 178 650 q 82 812 82 743 q 173 968 82 916 q 374 1021 263 1021 q 629 946 510 1021 q 606 875 617 912 q 582 788 596 839 l 543 794 m 269 163 q 296 83 276 114 q 360 52 317 52 q 435 95 414 52 q 462 204 456 139 l 462 306 l 462 407 q 438 513 462 464 q 363 561 415 561 q 298 529 321 561 q 269 449 274 496 q 260 382 263 421 q 258 306 258 343 q 260 227 258 249 q 269 163 262 206 "},"έ":{"x_min":55,"x_max":667.5,"ha":657,"o":"m 512 501 q 472 579 502 548 q 396 611 442 611 q 323 577 352 611 q 295 498 295 544 q 316 429 295 458 q 375 394 337 399 l 450 394 l 450 373 q 450 336 450 349 q 450 316 450 323 q 414 319 438 319 q 322 280 361 319 q 283 194 283 242 q 323 101 283 144 q 413 59 363 59 q 498 88 461 59 q 572 167 536 117 l 600 155 q 594 130 596 144 q 593 104 593 115 q 593 82 593 90 q 600 53 593 74 q 351 -15 486 -15 q 145 30 236 -15 q 55 176 55 75 q 105 289 55 244 q 233 360 156 335 q 127 421 167 385 q 88 516 88 456 q 165 643 88 603 q 340 683 243 683 q 593 612 480 683 q 565 556 576 583 q 551 501 555 530 l 512 501 m 492 955 q 545 1003 525 988 q 595 1019 566 1019 q 646 996 625 1019 q 667 945 667 974 q 648 899 667 917 q 600 865 630 880 l 375 757 l 306 757 l 492 955 "},"ω":{"x_min":30,"x_max":1059,"ha":1093,"o":"m 335 -15 q 111 79 192 -15 q 30 321 30 173 q 72 505 30 421 q 192 667 114 589 q 297 661 237 661 q 347 663 319 661 q 390 667 374 665 q 247 281 247 499 q 269 123 247 195 q 358 52 291 52 q 421 86 399 52 q 443 165 443 121 l 443 291 q 441 415 443 379 q 435 512 440 451 q 510 505 499 505 q 544 505 522 505 q 608 508 579 505 q 657 512 636 511 q 648 402 652 465 q 644 289 644 340 q 644 237 644 258 q 650 165 644 215 q 669 85 650 119 q 730 52 688 52 q 821 122 798 52 q 844 279 844 192 q 807 481 844 386 q 700 666 771 576 q 746 662 724 663 q 793 661 767 661 q 846 664 812 661 q 898 667 881 667 q 1016 508 974 595 q 1059 322 1059 422 q 974 83 1059 182 q 753 -15 890 -15 q 630 13 685 -15 q 545 100 575 41 q 459 14 516 44 q 335 -15 402 -15 "},"´":{"x_min":70.828125,"x_max":337.5,"ha":374,"o":"m 70 528 l 151 848 q 183 919 158 889 q 244 949 208 949 q 310 924 283 949 q 337 862 337 900 q 331 829 337 845 q 316 797 326 813 l 111 511 l 70 528 "},"±":{"x_min":169,"x_max":969,"ha":1139,"o":"m 636 815 l 636 597 l 969 597 l 969 465 l 636 465 l 636 246 l 501 246 l 501 465 l 169 465 l 169 597 l 501 597 l 501 815 l 636 815 m 969 132 l 969 0 l 169 0 l 169 132 l 969 132 "},"|":{"x_min":272,"x_max":411,"ha":683,"o":"m 411 956 l 411 447 l 272 447 l 272 956 l 411 956 m 411 272 l 411 -233 l 272 -233 l 272 272 l 411 272 "},"ϋ":{"x_min":82,"x_max":765,"ha":843,"o":"m 765 415 q 663 114 765 244 q 401 -15 562 -15 q 162 56 243 -15 q 82 284 82 127 l 86 478 q 84 589 86 523 q 82 666 82 656 q 145 663 99 666 q 195 661 191 661 q 263 663 216 661 q 311 666 309 666 q 295 476 301 566 q 290 294 290 387 q 310 122 290 193 q 402 52 330 52 q 515 146 487 52 q 544 351 544 240 q 525 502 544 433 q 469 657 507 570 q 580 659 528 657 q 684 672 632 662 q 743 547 721 613 q 765 415 765 482 m 262 975 q 329 947 301 975 q 357 879 357 919 q 331 811 357 840 q 265 783 305 783 q 195 810 226 783 q 165 879 165 838 q 192 947 165 919 q 262 975 220 975 m 522 975 q 589 947 561 975 q 617 879 617 919 q 591 811 617 840 q 525 783 565 783 q 456 811 486 783 q 427 879 427 840 q 454 947 427 919 q 522 975 482 975 "},"§":{"x_min":61,"x_max":685,"ha":743,"o":"m 118 39 l 136 38 q 207 -72 149 -32 q 341 -113 265 -113 q 441 -84 398 -113 q 485 -1 485 -56 q 378 121 485 73 q 170 213 272 169 q 61 386 61 277 q 95 495 61 437 q 175 584 129 554 q 133 649 148 615 q 118 721 118 683 q 206 887 118 825 q 406 949 295 949 q 531 937 479 949 q 630 895 583 926 q 598 826 613 860 q 570 754 583 791 l 558 754 q 499 848 548 812 q 388 884 451 884 q 300 858 340 884 q 261 785 261 832 q 366 672 261 717 q 575 583 472 626 q 685 414 685 519 q 657 302 685 354 q 580 216 630 250 q 622 149 602 197 q 643 68 643 101 q 545 -116 643 -51 q 322 -182 447 -182 q 197 -171 255 -182 q 86 -135 138 -161 q 118 39 106 -38 m 197 478 q 310 346 197 400 q 521 249 423 293 q 546 312 546 274 q 433 432 546 379 q 224 528 320 485 q 197 478 201 508 "},"b":{"x_min":79,"x_max":772,"ha":825,"o":"m 89 647 q 84 844 89 712 q 79 1024 79 977 q 136 1018 105 1021 q 192 1015 167 1015 q 249 1018 217 1015 q 306 1023 280 1020 l 299 724 l 299 578 q 389 656 339 630 q 505 683 439 683 q 704 581 637 683 q 772 340 772 479 q 694 88 772 191 q 470 -15 617 -15 q 340 15 400 -15 q 237 104 280 45 q 202 74 215 87 q 136 1 190 62 l 79 1 q 84 357 79 132 q 89 647 89 583 m 430 586 q 318 512 346 586 q 291 338 291 438 q 316 162 291 238 q 424 86 342 86 q 528 159 503 86 q 554 331 554 233 q 531 510 554 434 q 430 586 508 586 "},"q":{"x_min":51,"x_max":741,"ha":825,"o":"m 331 -15 q 121 81 191 -15 q 51 323 51 177 q 117 576 51 469 q 323 683 184 683 q 523 580 446 683 l 523 605 q 516 666 523 631 q 586 660 568 661 q 627 659 604 659 q 741 666 675 659 q 738 416 741 561 q 732 125 735 271 q 730 -124 730 -19 q 735 -246 730 -164 q 741 -371 741 -328 q 687 -363 718 -366 q 628 -361 656 -361 q 563 -363 581 -361 q 514 -372 545 -365 l 523 -58 l 523 85 q 437 10 482 35 q 331 -15 392 -15 m 386 81 q 484 135 452 81 q 523 261 516 189 l 523 300 q 523 351 523 330 q 523 392 523 372 q 490 518 523 460 q 393 576 458 576 q 290 502 314 576 q 266 327 266 429 q 288 155 266 229 q 386 81 310 81 "},"Ω":{"x_min":36,"x_max":1174.890625,"ha":1211,"o":"m 1173 129 q 1170 103 1170 116 q 1170 83 1170 90 l 1170 70 q 1170 36 1170 52 q 1174 0 1170 19 l 953 4 l 715 0 l 715 103 q 848 251 813 162 q 883 473 883 340 q 815 741 883 623 q 607 860 747 860 q 396 738 461 860 q 331 457 331 616 q 369 245 331 339 q 496 102 407 152 l 496 0 l 256 4 l 36 0 l 38 80 l 36 129 q 264 113 151 113 q 128 258 172 167 q 85 464 85 350 q 235 821 85 693 q 622 949 386 949 q 988 830 846 949 q 1130 491 1130 712 q 1082 272 1130 363 q 928 112 1034 180 q 1173 129 1049 112 "},"ύ":{"x_min":82,"x_max":765,"ha":843,"o":"m 765 415 q 663 114 765 244 q 400 -15 561 -15 q 162 56 242 -15 q 82 284 82 128 l 86 479 q 84 590 86 523 q 82 666 82 656 q 145 663 99 666 q 195 661 191 661 q 263 663 216 661 q 311 666 309 666 q 295 477 301 566 q 290 294 290 387 q 310 122 290 193 q 402 52 330 52 q 515 146 487 52 q 544 351 544 240 q 525 502 544 433 q 469 656 507 570 q 580 659 528 656 q 684 672 632 662 q 743 547 721 613 q 765 415 765 482 m 548 953 q 601 1001 581 986 q 651 1017 621 1017 q 702 994 681 1017 q 723 943 723 972 q 704 897 723 916 q 655 863 685 878 l 431 755 l 362 755 l 548 953 "},"Ö":{"x_min":40,"x_max":1087,"ha":1129,"o":"m 577 949 q 946 829 805 949 q 1087 486 1087 710 q 942 115 1087 246 q 552 -15 798 -15 q 176 107 313 -15 q 40 465 40 229 q 188 823 40 697 q 577 949 337 949 m 434 1242 q 501 1215 473 1242 q 529 1148 529 1189 q 502 1079 529 1108 q 435 1050 476 1050 q 366 1079 396 1050 q 337 1148 337 1109 q 366 1214 337 1186 q 434 1242 395 1242 m 693 1242 q 761 1215 733 1242 q 789 1148 789 1189 q 762 1079 789 1108 q 695 1050 736 1050 q 627 1079 655 1050 q 600 1148 600 1108 q 627 1214 600 1186 q 693 1242 655 1242 m 562 71 q 774 194 706 71 q 843 470 843 318 q 774 742 843 623 q 563 861 706 861 q 353 741 420 861 q 287 465 287 622 q 354 191 287 312 q 562 71 421 71 "},"z":{"x_min":19.4375,"x_max":640.28125,"ha":664,"o":"m 19 75 q 118 216 33 94 q 257 415 204 337 q 359 567 311 493 l 255 568 q 151 562 205 568 q 65 552 97 556 l 68 608 l 65 667 l 337 660 q 507 663 404 660 q 627 666 611 666 l 627 588 q 515 441 573 519 q 399 276 458 362 q 280 98 340 190 l 375 96 q 506 101 418 96 q 640 107 595 107 q 638 76 638 93 q 637 51 637 59 l 637 34 l 640 0 q 459 3 568 0 q 333 7 351 7 q 147 3 259 7 q 19 0 36 0 l 19 75 "},"™":{"x_min":136,"x_max":964,"ha":1138,"o":"m 461 975 l 461 900 l 350 900 l 350 610 l 249 610 l 249 900 l 136 900 l 136 975 l 461 975 m 666 974 l 751 751 l 833 974 l 964 975 l 964 610 l 874 610 l 874 882 l 772 610 l 730 610 l 625 881 l 625 610 l 535 610 l 535 975 l 666 974 "},"ή":{"x_min":80,"x_max":727,"ha":808,"o":"m 91 339 q 85 512 91 391 q 80 667 80 632 q 137 661 125 662 q 180 661 149 661 q 244 663 199 661 q 293 666 290 666 l 293 568 q 391 651 338 622 q 511 681 443 681 q 660 622 602 681 q 719 471 719 564 l 719 327 l 719 -50 q 723 -219 719 -107 q 727 -374 727 -332 q 618 -365 670 -365 q 502 -373 562 -365 l 512 16 l 512 251 l 512 368 q 491 499 512 446 q 408 552 471 552 q 319 488 342 552 q 302 419 305 457 q 299 330 299 382 q 304 148 299 264 q 309 0 309 33 q 243 3 278 0 q 195 6 207 6 q 127 3 163 6 q 80 0 92 0 q 85 188 80 65 q 91 339 91 311 m 552 953 q 605 1001 585 986 q 654 1017 625 1017 q 706 994 685 1017 q 727 943 727 972 q 708 897 727 916 q 658 863 689 878 l 435 756 l 366 756 l 552 953 "},"Θ":{"x_min":40,"x_max":1087,"ha":1129,"o":"m 51 585 q 235 855 85 761 q 577 949 385 949 q 944 829 802 949 q 1087 487 1087 710 q 941 116 1087 247 q 552 -15 796 -15 q 176 107 313 -15 q 40 465 40 229 q 41 510 40 492 q 51 585 42 528 m 559 73 q 771 194 703 73 q 840 472 840 315 q 773 742 840 624 q 566 860 706 860 q 353 742 420 860 q 287 465 287 624 q 353 193 287 314 q 559 73 419 73 m 566 525 q 678 528 610 525 q 755 532 745 532 l 754 539 l 754 472 l 754 403 l 755 407 l 563 414 l 373 407 l 373 469 l 373 531 q 484 528 416 531 q 566 525 553 525 "},"®":{"x_min":72,"x_max":1065,"ha":1138,"o":"m 1065 488 q 917 139 1065 285 q 567 -6 770 -6 q 219 139 366 -6 q 72 488 72 285 q 219 836 72 688 q 567 985 367 985 q 917 839 770 985 q 1065 488 1065 693 m 155 488 q 276 197 155 320 q 566 75 398 75 q 858 197 734 75 q 983 487 983 320 q 860 780 983 656 q 567 904 738 904 q 277 780 399 904 q 155 488 155 656 m 577 774 q 741 740 670 774 q 812 625 812 707 q 778 527 812 569 q 692 468 745 484 l 811 223 l 666 222 l 561 447 l 497 447 l 497 223 l 361 223 l 361 774 l 577 774 m 497 528 l 562 528 q 641 546 609 528 q 673 608 673 564 q 655 660 673 638 q 607 685 638 682 q 555 691 584 691 l 497 691 l 497 528 "},"É":{"x_min":90,"x_max":644.15625,"ha":703,"o":"m 108 223 l 108 465 q 104 713 108 622 q 91 933 101 804 l 357 929 l 644 933 l 640 872 l 644 811 q 530 816 606 811 q 415 822 453 822 l 340 822 q 337 663 340 774 q 334 545 334 551 l 634 557 q 631 521 634 546 q 628 493 628 496 q 630 458 628 477 q 634 429 633 440 q 476 436 587 429 q 334 444 365 444 l 334 294 q 335 203 334 249 q 340 111 336 156 q 483 114 419 111 q 640 128 546 118 q 634 65 634 100 q 635 37 634 47 q 640 0 635 27 q 427 3 556 0 q 280 7 298 7 q 169 3 242 7 q 90 0 95 0 q 102 117 97 59 q 108 223 108 175 m 410 1222 q 465 1272 445 1257 q 515 1288 485 1288 q 566 1265 545 1288 q 587 1215 587 1243 q 568 1169 587 1189 q 519 1133 549 1148 l 294 1025 l 225 1025 l 410 1222 "},"~":{"x_min":266,"x_max":1091,"ha":1367,"o":"m 1091 938 q 1033 721 1091 807 q 847 636 975 636 q 661 720 757 636 q 518 805 564 805 q 427 756 453 805 q 402 636 402 708 l 266 636 q 327 849 266 761 q 510 938 388 938 q 696 853 599 938 q 846 768 793 768 q 933 815 911 768 q 956 938 956 863 l 1091 938 "},"Ε":{"x_min":90,"x_max":644.15625,"ha":703,"o":"m 108 222 l 108 465 q 104 710 108 620 q 91 932 101 800 l 357 926 q 520 929 405 926 q 644 932 634 932 q 640 903 641 916 q 638 872 638 890 q 639 848 638 857 q 644 810 640 840 q 530 815 606 810 q 414 820 453 820 l 338 820 l 334 545 l 634 557 q 630 527 631 541 q 628 494 628 514 l 633 431 q 459 437 571 431 q 334 444 347 444 l 334 296 q 336 190 334 264 q 338 113 338 115 q 638 129 489 113 l 634 63 l 638 0 q 433 3 562 0 q 278 7 305 7 q 169 3 235 7 q 90 0 102 0 q 102 114 96 54 q 108 222 108 175 "},"³":{"x_min":18,"x_max":448,"ha":494,"o":"m 242 899 q 370 867 315 899 q 425 770 425 836 q 399 699 425 730 q 301 645 373 667 q 403 605 359 642 q 448 512 448 569 q 375 384 448 426 q 210 342 303 342 q 108 352 152 342 q 18 391 65 362 q 88 505 60 451 l 98 505 q 119 420 98 452 q 191 388 141 388 q 263 421 237 388 q 290 501 290 454 q 262 580 290 549 q 186 612 235 612 l 151 612 l 151 660 l 181 658 q 259 684 228 658 q 290 759 290 710 q 268 828 290 800 q 207 856 246 856 q 141 821 163 856 q 119 742 119 787 l 110 736 q 26 815 75 777 q 120 876 53 854 q 242 899 187 899 "},"[":{"x_min":104,"x_max":415.109375,"ha":454,"o":"m 409 883 l 415 852 l 261 855 l 257 541 q 261 212 257 433 q 266 -86 266 -8 l 327 -88 l 415 -88 l 409 -117 q 415 -162 409 -142 l 261 -157 l 104 -164 q 110 154 104 -50 q 117 383 117 359 q 110 703 117 496 q 104 933 104 909 q 194 929 138 933 q 258 926 249 926 q 347 929 284 926 q 415 933 410 933 q 409 883 409 911 "},"L":{"x_min":91,"x_max":639.609375,"ha":650,"o":"m 109 465 q 105 710 109 620 q 91 932 102 800 l 216 927 l 350 931 q 337 618 337 783 l 337 296 q 337 201 337 249 q 341 113 337 153 q 639 129 491 113 l 635 63 l 639 0 q 434 3 563 0 q 279 7 306 7 q 170 3 236 7 q 91 0 103 0 q 105 209 102 102 q 109 465 109 316 "},"σ":{"x_min":30,"x_max":832,"ha":826,"o":"m 679 557 q 730 451 724 495 q 738 384 736 407 q 741 339 741 361 q 738 277 741 295 q 726 190 736 259 q 617 53 716 121 q 385 -15 518 -15 q 126 78 223 -15 q 30 336 30 172 q 127 588 30 494 q 384 683 224 683 q 536 671 432 683 q 677 660 639 660 q 765 663 705 660 q 831 666 825 666 q 827 611 827 637 l 827 594 l 832 552 l 702 557 l 679 557 m 256 333 q 269 174 256 248 q 304 88 275 124 q 381 52 332 52 q 475 104 443 52 q 508 221 508 156 q 512 258 509 235 q 515 323 515 282 q 512 411 515 370 q 508 444 509 427 q 479 563 508 511 q 389 615 450 615 q 299 565 327 615 q 263 450 271 516 q 256 333 256 384 "},"ζ":{"x_min":64,"x_max":667,"ha":656,"o":"m 231 360 l 231 340 l 231 314 q 343 192 231 217 q 554 162 448 176 q 667 24 667 133 q 628 -103 667 -42 q 525 -221 589 -164 l 458 -181 q 505 -114 493 -134 q 521 -63 516 -95 q 375 13 521 -6 q 146 71 229 33 q 64 260 64 110 q 123 495 64 382 q 257 692 182 608 q 467 905 333 776 q 278 903 353 905 q 122 893 204 901 l 126 958 l 122 1024 q 255 1019 166 1024 q 389 1015 344 1015 q 511 1019 429 1015 q 635 1024 593 1024 l 630 978 l 634 934 q 433 764 520 848 q 288 578 346 680 q 231 360 231 476 "},"θ":{"x_min":34,"x_max":710,"ha":749,"o":"m 710 450 q 636 110 710 240 q 367 -19 562 -19 q 104 103 175 -19 q 34 434 34 226 q 106 774 34 641 q 368 908 178 908 q 637 785 565 908 q 710 450 710 662 m 370 416 q 305 413 351 416 q 255 410 259 410 q 257 322 255 371 q 266 208 259 273 q 292 96 272 143 q 370 49 312 49 q 429 72 406 49 q 463 135 452 96 q 479 263 474 192 q 484 410 484 335 q 418 413 464 410 q 370 416 372 416 m 484 601 q 464 769 484 698 q 372 840 445 840 q 277 759 300 840 q 255 560 255 679 l 255 492 l 372 488 l 488 492 l 484 601 "},"Ο":{"x_min":40,"x_max":1086,"ha":1129,"o":"m 577 949 q 945 829 804 949 q 1086 486 1086 710 q 942 114 1086 244 q 552 -15 798 -15 q 176 107 313 -15 q 40 465 40 229 q 188 823 40 697 q 577 949 337 949 m 562 73 q 773 194 706 73 q 840 472 840 315 q 773 742 840 624 q 566 860 706 860 q 353 742 420 860 q 287 465 287 624 q 353 193 287 313 q 562 73 420 73 "},"Γ":{"x_min":91,"x_max":639.609375,"ha":650,"o":"m 232 926 l 449 926 l 639 932 l 635 866 l 639 802 q 485 815 548 812 q 341 819 423 819 q 338 769 339 805 q 337 681 337 734 l 337 635 l 337 312 q 339 138 337 195 q 351 0 341 81 l 216 4 l 91 0 q 100 238 91 70 q 109 465 109 406 q 105 713 109 613 q 91 932 102 813 q 161 929 114 932 q 232 926 209 926 "}," ":{"x_min":0,"x_max":0,"ha":375},"%":{"x_min":28,"x_max":1085,"ha":1122,"o":"m 265 910 q 434 844 369 910 q 500 672 500 779 q 435 496 500 562 q 258 431 370 431 q 91 498 154 431 q 28 669 28 565 q 93 843 28 776 q 265 910 158 910 m 831 1015 l 917 1014 l 272 -125 l 184 -125 l 831 1015 m 849 463 q 1020 401 955 463 q 1085 230 1085 339 q 1023 51 1085 117 q 845 -15 961 -15 q 677 51 742 -15 q 612 222 612 118 q 675 398 612 333 q 849 463 738 463 m 196 561 q 214 505 196 532 q 261 478 232 478 q 297 489 280 478 q 323 525 314 501 q 335 586 332 548 q 339 669 339 625 q 337 723 339 697 q 332 780 336 749 q 311 836 327 811 q 264 861 296 861 q 204 820 222 861 q 191 752 194 786 q 188 669 188 719 q 196 561 188 615 m 779 112 q 797 57 779 83 q 847 31 816 31 q 895 59 873 31 q 916 114 916 87 q 922 222 922 162 q 922 275 922 248 q 915 338 917 312 q 896 389 912 364 q 848 414 880 414 q 812 404 827 414 q 791 375 797 394 q 776 312 780 347 q 772 241 772 276 l 772 222 q 772 183 772 201 q 779 112 773 165 "},"P":{"x_min":91,"x_max":765,"ha":801,"o":"m 334 201 q 335 129 334 148 q 348 0 336 110 q 272 3 317 0 q 219 6 226 6 q 143 3 189 6 q 91 0 97 0 q 104 212 100 112 q 108 462 108 313 q 99 725 108 549 q 91 933 91 900 q 161 929 111 933 q 215 925 211 925 l 395 933 l 445 933 q 677 876 590 933 q 765 681 765 819 q 691 486 765 565 q 544 400 618 408 q 423 390 470 391 q 334 389 375 389 l 334 201 m 536 669 q 498 788 536 741 q 390 836 461 836 l 334 836 l 334 694 l 334 486 q 485 529 435 486 q 536 669 536 572 "},"Ώ":{"x_min":-28,"x_max":1452.5625,"ha":1489,"o":"m 1451 129 q 1448 104 1448 117 q 1448 83 1448 90 l 1448 70 q 1448 36 1448 52 q 1452 0 1448 19 l 1231 4 l 993 0 l 993 103 q 1126 251 1091 162 q 1161 473 1161 340 q 1092 741 1161 623 q 884 860 1024 860 q 673 738 738 860 q 608 457 608 616 q 646 245 608 339 q 774 102 684 152 l 774 0 l 534 4 l 314 0 l 316 80 l 313 129 q 542 113 429 113 q 405 258 449 167 q 362 464 362 350 q 512 821 362 693 q 899 949 663 949 q 1266 830 1124 949 q 1408 491 1408 712 q 1360 272 1408 363 q 1206 112 1312 180 q 1451 129 1327 112 m 158 953 q 211 1001 191 986 q 259 1017 231 1017 q 312 994 291 1017 q 333 943 333 972 q 314 897 333 916 q 265 863 295 878 l 40 755 l -28 755 l 158 953 "},"Έ":{"x_min":-28,"x_max":1020.609375,"ha":1078,"o":"m 485 222 l 485 465 q 481 710 485 620 q 467 931 478 800 l 733 926 q 896 929 781 926 q 1020 932 1010 932 q 1016 903 1017 916 q 1015 872 1015 890 q 1015 848 1015 857 q 1020 810 1016 839 q 906 815 983 810 q 791 820 830 820 l 715 820 l 711 544 l 1010 556 q 1006 527 1008 540 q 1005 493 1005 513 l 1009 430 q 836 436 948 430 q 711 443 724 443 l 711 296 q 713 189 711 264 q 715 113 715 115 q 1015 129 865 113 l 1010 63 l 1015 0 q 810 3 938 0 q 655 7 681 7 q 545 3 612 7 q 466 0 478 0 q 478 114 472 54 q 485 222 485 175 m 158 953 q 212 1001 191 986 q 260 1017 232 1017 q 313 994 292 1017 q 334 943 334 972 q 315 897 334 916 q 265 863 296 878 l 40 755 l -28 755 l 158 953 "},"_":{"x_min":0,"x_max":683.328125,"ha":683,"o":"m 683 -184 l 683 -322 l 0 -322 l 0 -184 l 683 -184 "},"Ϊ":{"x_min":-1,"x_max":450,"ha":449,"o":"m 110 402 q 103 709 110 511 q 97 932 97 908 q 161 926 130 929 q 220 923 192 923 q 287 927 242 923 q 351 931 331 931 q 343 688 351 859 q 336 465 336 516 q 343 221 336 391 q 351 0 351 51 q 283 2 330 0 q 212 5 236 5 l 97 0 q 103 233 97 83 q 110 402 110 383 m 93 1242 q 160 1215 132 1242 q 188 1148 188 1189 q 162 1078 188 1107 q 97 1050 136 1050 q 28 1079 57 1050 q -1 1148 -1 1108 q 26 1214 -1 1186 q 93 1242 54 1242 m 352 1242 q 421 1214 393 1242 q 450 1148 450 1187 q 423 1079 450 1108 q 356 1050 397 1050 q 286 1078 316 1050 q 257 1148 257 1107 q 286 1214 257 1186 q 352 1242 315 1242 "},"+":{"x_min":169,"x_max":968,"ha":1138,"o":"m 636 813 l 636 473 l 968 473 l 968 340 l 636 340 l 636 0 l 501 0 l 501 340 l 169 340 l 169 473 l 501 473 l 501 813 l 636 813 "},"½":{"x_min":68,"x_max":1145.765625,"ha":1171,"o":"m 207 481 l 207 736 l 207 808 q 150 784 180 798 q 103 763 120 770 l 68 813 q 195 860 131 834 q 331 918 259 886 l 348 909 q 346 744 348 844 q 344 644 344 645 l 345 650 l 345 505 l 345 511 q 345 458 345 480 q 349 391 345 437 l 299 394 q 247 392 281 394 q 198 391 213 391 l 207 481 m 844 1014 l 928 1014 l 326 -124 l 243 -124 l 844 1014 m 721 42 q 908 194 839 122 q 977 365 977 266 q 962 434 977 408 q 905 460 947 460 q 840 427 864 460 q 805 345 816 395 l 795 345 q 768 379 789 358 q 727 418 747 400 q 822 487 773 465 q 936 510 870 510 q 1068 474 1012 510 q 1124 365 1124 439 q 1035 209 1124 271 q 890 110 947 147 l 970 109 q 1070 111 999 109 q 1145 114 1140 114 q 1134 48 1134 80 q 1138 23 1134 37 q 1144 0 1143 9 l 1006 3 l 729 3 l 721 42 "},"Ρ":{"x_min":91,"x_max":765,"ha":801,"o":"m 334 201 q 335 129 334 148 q 348 0 336 110 q 272 3 317 0 q 219 6 226 6 q 143 3 189 6 q 91 0 97 0 q 104 212 100 112 q 108 462 108 313 q 99 725 108 549 q 91 933 91 900 q 161 929 111 933 q 215 925 211 925 l 395 933 l 445 933 q 677 876 590 933 q 765 681 765 819 q 691 486 765 565 q 544 400 618 408 q 423 390 470 391 q 334 389 375 389 l 334 201 m 536 669 q 498 788 536 741 q 390 836 461 836 l 334 836 l 334 694 l 334 486 q 485 529 435 486 q 536 669 536 572 "},"'":{"x_min":72.21875,"x_max":337.5,"ha":375,"o":"m 72 528 l 152 848 q 184 919 159 889 q 245 949 209 949 q 311 923 284 949 q 337 861 337 898 q 315 797 337 827 l 112 511 l 72 528 "},"T":{"x_min":8,"x_max":738,"ha":749,"o":"m 493 818 q 490 723 493 790 q 487 652 487 656 q 490 427 487 529 q 498 201 494 326 q 503 0 503 77 q 438 2 482 0 q 374 5 395 5 q 317 3 351 5 q 244 0 284 1 q 252 266 244 88 q 261 476 261 444 q 258 670 261 533 q 255 818 255 808 q 158 815 188 818 q 8 801 128 813 l 12 872 l 8 932 q 198 927 70 932 q 373 922 327 922 q 572 927 445 922 q 738 932 700 932 l 733 870 l 738 801 q 493 818 614 818 "},"Φ":{"x_min":36,"x_max":1093,"ha":1129,"o":"m 445 960 q 513 952 484 955 q 566 950 543 950 q 634 954 599 950 q 683 960 669 958 q 676 909 680 943 q 672 858 672 876 l 751 851 q 998 732 904 829 q 1093 484 1093 634 q 980 206 1093 301 q 672 72 867 112 q 673 31 672 44 q 683 -26 674 19 q 619 -20 653 -23 q 566 -17 585 -17 q 500 -20 535 -17 q 445 -26 465 -24 q 453 17 449 -5 q 458 72 458 40 l 380 82 q 133 205 231 103 q 36 454 36 307 q 150 732 36 636 q 458 858 265 828 q 452 911 458 879 q 445 960 447 943 m 668 700 l 668 467 l 668 234 l 672 171 q 817 266 774 182 q 861 468 861 351 q 817 666 861 583 q 669 764 773 750 l 668 700 m 419 755 q 301 654 336 739 q 267 469 267 570 q 309 267 267 351 q 455 171 351 183 l 458 234 l 462 424 l 458 700 l 458 764 l 419 755 "},"j":{"x_min":-62,"x_max":313,"ha":396,"o":"m 196 660 q 235 660 215 660 q 307 666 254 661 l 306 490 q 309 182 306 369 q 313 -31 313 -4 q 217 -278 313 -195 q -49 -361 121 -361 l -62 -305 q 59 -240 24 -305 q 95 -81 95 -175 l 95 255 q 89 459 95 322 q 84 666 84 597 q 196 660 143 660 m 195 1014 q 272 980 239 1014 q 306 902 306 947 q 273 825 306 858 q 195 793 240 793 q 117 824 150 793 q 84 902 84 856 q 117 980 84 947 q 195 1014 150 1014 "},"Σ":{"x_min":18.0625,"x_max":801.390625,"ha":843,"o":"m 747 865 l 751 804 q 641 808 715 804 q 527 813 568 813 l 369 813 q 481 664 427 733 q 594 519 534 594 q 402 315 496 419 l 304 203 l 544 203 q 672 208 586 203 q 801 214 758 214 l 794 112 q 801 0 794 59 l 456 4 l 18 0 l 18 57 q 261 330 138 181 l 365 461 q 222 657 298 559 q 55 865 147 755 l 55 932 q 243 928 118 932 q 431 924 368 924 q 630 928 511 924 q 751 932 750 932 l 747 865 "},"1":{"x_min":55,"x_max":502,"ha":749,"o":"m 276 616 q 273 680 276 637 q 271 747 271 723 q 197 713 223 726 q 112 666 172 700 l 55 754 q 471 940 291 848 l 498 927 l 492 454 l 493 465 l 493 202 l 493 216 q 497 102 493 178 q 502 0 502 26 l 383 6 q 314 3 362 6 q 264 0 266 0 q 270 359 264 127 q 276 616 276 591 "},"ä":{"x_min":44,"x_max":706.78125,"ha":706,"o":"m 236 -15 q 98 35 153 -15 q 44 169 44 86 q 212 352 44 301 q 401 421 380 403 q 410 439 410 432 q 373 539 410 502 q 275 577 337 577 q 140 511 185 577 l 135 511 l 115 585 q 230 657 164 632 q 365 683 296 683 q 543 623 479 683 q 608 452 608 564 l 604 213 q 604 166 604 184 q 608 123 604 148 q 625 87 612 99 q 658 76 638 76 q 679 80 666 76 q 702 90 691 84 l 706 40 q 643 1 676 14 q 563 -15 610 -10 q 480 5 518 -15 q 419 64 442 25 q 236 -15 350 -15 m 221 976 q 289 948 261 976 q 317 878 317 920 q 290 811 317 839 q 223 784 264 784 q 155 811 186 784 q 125 878 125 839 q 154 946 125 917 q 221 976 183 976 m 481 976 q 549 948 521 976 q 577 878 577 920 q 550 811 577 839 q 483 784 524 784 q 414 812 444 784 q 385 878 385 841 q 412 946 385 917 q 481 976 440 976 m 240 200 q 261 128 240 158 q 321 99 282 99 q 388 131 367 99 q 410 211 410 164 l 410 352 q 287 302 335 338 q 240 200 240 267 "},"<":{"x_min":175,"x_max":959.75,"ha":1138,"o":"m 959 650 l 362 406 l 959 162 l 959 17 l 175 340 l 175 471 l 959 796 l 959 650 "},"£":{"x_min":48,"x_max":734.109375,"ha":749,"o":"m 56 88 q 52 142 56 117 q 48 181 49 167 q 138 198 100 181 q 185 254 177 215 q 193 315 193 292 l 191 429 l 153 429 q 99 425 128 429 q 56 421 70 421 l 61 467 l 56 512 q 113 506 81 508 q 184 504 145 504 q 172 598 172 552 q 259 829 172 748 q 499 910 346 910 q 734 848 623 910 q 710 778 718 809 q 691 695 702 747 l 658 695 q 613 795 645 758 q 523 833 581 833 q 417 787 455 833 q 379 671 379 741 q 384 582 379 637 q 391 504 390 527 l 463 504 l 480 504 q 519 504 500 504 q 598 512 538 505 l 593 466 l 598 422 l 493 429 l 391 429 q 343 288 382 340 q 219 184 303 236 l 542 189 l 724 195 q 716 146 720 174 q 711 98 711 117 q 713 62 711 78 q 724 0 716 45 q 557 3 667 0 q 391 8 448 8 q 220 3 334 8 q 48 0 106 0 q 52 46 49 16 q 56 88 56 77 "},"¹":{"x_min":66,"x_max":360,"ha":494,"o":"m 212 726 l 212 802 q 158 781 187 795 q 102 755 129 768 l 66 808 q 206 857 157 838 q 342 919 256 876 l 356 910 l 356 627 l 356 638 l 356 477 l 356 484 q 356 429 356 451 q 360 354 356 408 l 307 358 l 202 354 q 210 520 209 418 q 212 634 212 623 l 212 726 "},"t":{"x_min":9,"x_max":468.71875,"ha":463,"o":"m 9 584 l 10 627 l 10 671 q 54 667 25 668 q 102 667 84 667 l 102 687 l 102 704 q 95 823 102 765 q 192 859 147 839 q 298 914 237 880 l 327 914 q 319 853 323 890 q 315 791 315 816 l 315 667 l 344 667 q 433 670 387 667 l 430 629 l 430 582 l 309 584 l 309 226 q 322 107 309 149 q 393 65 335 65 q 468 72 427 65 l 463 9 q 381 -11 425 -4 q 292 -18 336 -18 q 145 25 196 -18 q 95 165 95 69 q 98 410 95 260 q 102 583 102 559 l 9 584 "},"λ":{"x_min":22.609375,"x_max":662.890625,"ha":686,"o":"m 550 0 l 433 0 q 394 177 417 79 q 360 323 372 275 q 318 490 349 372 q 234 238 269 359 q 179 0 199 116 l 103 0 l 22 0 q 109 214 69 109 q 182 416 149 318 q 264 662 215 514 q 214 834 247 760 q 111 909 180 909 q 80 903 99 909 q 51 895 61 898 l 32 964 q 121 1008 76 993 q 215 1024 167 1024 q 384 925 342 1024 q 458 718 426 826 l 529 459 l 662 0 l 550 0 "},"ù":{"x_min":75,"x_max":722,"ha":808,"o":"m 474 757 l 249 865 q 198 900 216 883 q 181 946 181 917 q 203 998 181 977 q 256 1019 225 1019 q 303 1003 282 1019 q 356 955 324 987 l 542 757 l 474 757 m 292 -15 q 142 41 202 -15 q 83 189 83 98 l 83 337 q 79 509 83 394 q 75 668 75 624 q 134 661 108 663 q 185 659 160 659 q 240 662 209 659 q 300 668 271 665 q 290 455 290 570 l 290 384 l 290 279 q 316 146 290 181 q 394 111 343 111 q 467 147 441 111 q 501 234 493 184 l 501 330 q 499 488 501 415 q 495 668 497 562 q 554 662 518 665 q 613 659 589 659 q 671 662 640 659 q 722 668 701 665 q 717 505 722 625 q 712 326 712 386 q 717 156 712 270 q 722 1 722 43 l 617 4 l 511 1 l 511 96 q 410 15 468 46 q 292 -15 353 -15 "},"W":{"x_min":-8.328125,"x_max":1325,"ha":1326,"o":"m -8 932 q 67 929 13 932 q 125 926 120 926 q 190 929 147 926 q 255 932 233 932 q 300 737 277 829 q 357 519 323 644 q 419 298 391 394 q 504 548 455 403 q 576 759 554 693 q 633 932 598 825 l 711 926 q 756 929 726 926 q 802 932 787 932 q 859 729 836 807 q 913 557 881 651 q 998 297 944 462 q 1166 932 1094 604 l 1248 926 q 1298 929 1280 926 q 1325 932 1316 932 l 1230 643 l 1019 0 q 972 4 983 4 q 937 5 962 5 q 884 2 904 5 q 855 0 865 0 q 793 200 831 80 q 740 363 754 319 l 652 623 q 543 325 594 476 q 441 0 493 175 q 393 3 423 0 q 359 6 363 6 q 308 4 330 6 q 272 0 286 1 q 184 320 222 191 q 107 576 147 450 q -8 932 68 703 "},"ï":{"x_min":-26,"x_max":422,"ha":396,"o":"m 93 126 l 93 542 q 87 601 93 557 q 82 666 82 645 q 141 660 111 663 q 198 658 172 658 q 255 661 223 658 q 316 666 287 663 q 311 621 315 658 q 303 544 307 584 l 303 319 l 303 115 l 315 0 l 195 2 l 81 0 q 93 126 93 66 m 68 976 q 134 947 107 976 q 162 878 162 918 q 136 811 162 839 q 71 784 111 784 q 2 811 31 784 q -26 878 -26 838 q 1 946 -26 917 q 68 976 29 976 m 327 976 q 394 948 366 976 q 422 878 422 920 q 396 811 422 838 q 329 784 370 784 q 260 811 288 784 q 232 878 232 838 q 260 947 232 918 q 327 976 288 976 "},">":{"x_min":174.984375,"x_max":961,"ha":1138,"o":"m 961 472 l 961 340 l 175 17 l 175 162 l 773 406 l 174 650 l 174 796 l 961 472 "},"v":{"x_min":0,"x_max":669.453125,"ha":667,"o":"m 0 667 q 75 663 26 667 q 131 659 123 659 q 202 663 156 659 q 255 667 247 667 l 293 528 l 387 223 q 526 667 473 447 l 595 659 q 637 663 611 659 q 669 667 663 667 q 541 343 602 505 q 418 0 480 181 q 368 4 395 2 q 330 6 341 6 q 279 3 311 6 q 244 0 248 0 q 129 340 184 186 q 0 667 73 494 "},"τ":{"x_min":9,"x_max":654.84375,"ha":661,"o":"m 446 557 l 445 521 l 445 108 q 456 0 445 55 l 338 4 l 225 0 q 234 69 231 40 q 237 125 237 98 l 237 320 l 237 516 l 237 557 q 59 459 115 557 l 24 459 q 20 516 24 490 q 9 581 17 543 q 122 641 59 625 q 263 658 185 658 l 440 656 q 654 667 556 656 q 649 610 649 641 q 654 554 649 580 q 525 555 603 554 q 446 557 447 557 "},"û":{"x_min":75,"x_max":722,"ha":808,"o":"m 339 1004 l 463 1004 l 616 757 l 549 757 l 400 879 l 254 757 l 186 757 l 339 1004 m 292 -15 q 142 41 202 -15 q 83 189 83 98 l 83 337 q 79 509 83 394 q 75 668 75 625 q 134 662 108 664 q 185 660 160 660 q 240 662 209 660 q 300 668 271 665 q 290 455 290 570 l 290 384 l 290 279 q 316 146 290 181 q 394 111 343 111 q 467 147 441 111 q 501 234 493 184 l 501 330 q 499 488 501 415 q 495 668 497 562 q 554 662 518 665 q 613 660 589 660 q 671 662 640 660 q 722 668 701 665 q 717 505 722 625 q 712 326 712 386 q 717 156 712 270 q 722 1 722 43 l 617 4 l 511 1 l 511 96 q 410 15 468 46 q 292 -15 353 -15 "},"ξ":{"x_min":53,"x_max":675,"ha":675,"o":"m 559 813 q 508 904 534 873 q 432 936 482 936 q 335 887 372 936 q 299 776 299 838 q 372 648 299 683 q 550 614 446 614 l 546 569 l 546 525 l 455 528 q 320 498 379 528 q 251 432 261 469 q 240 386 241 396 q 239 360 239 376 q 240 322 239 335 q 244 304 241 310 q 363 205 258 226 q 569 165 469 183 q 675 25 675 130 q 647 -83 675 -27 q 536 -221 619 -139 l 468 -181 q 514 -114 498 -141 q 531 -55 531 -88 q 380 23 531 -5 q 141 98 229 53 q 53 287 53 143 q 113 467 53 390 q 274 586 173 544 q 144 666 196 615 q 92 790 92 716 q 180 962 92 901 q 389 1024 269 1024 q 515 1009 455 1024 q 640 963 575 994 q 620 886 632 936 q 604 809 608 836 l 559 813 "},"&":{"x_min":50,"x_max":948.609375,"ha":974,"o":"m 316 -18 q 128 44 206 -18 q 50 215 50 107 q 115 388 50 315 q 281 502 180 462 q 216 609 243 547 q 190 723 190 670 q 266 877 190 823 q 446 932 342 932 q 604 889 537 932 q 672 761 672 847 q 621 631 672 687 q 495 541 571 576 q 709 295 593 412 q 786 421 751 348 q 845 567 822 494 q 880 517 861 538 q 934 463 899 495 q 851 336 888 387 q 761 233 813 285 q 856 123 811 174 q 948 26 902 71 l 948 1 q 860 7 887 6 q 817 8 833 8 q 756 6 779 8 q 690 1 734 5 l 612 92 q 469 11 545 40 q 316 -18 394 -18 m 232 284 q 284 160 232 214 q 408 106 337 106 q 484 118 449 106 q 562 155 519 130 q 421 323 469 264 q 330 443 373 382 q 258 373 284 411 q 232 284 232 336 m 547 759 q 522 831 547 802 q 453 860 498 860 q 419 854 435 860 q 379 823 394 850 q 365 769 365 797 q 383 697 365 740 q 449 597 402 654 q 520 668 493 627 q 547 759 547 709 "},"Λ":{"x_min":-19.4375,"x_max":856.953125,"ha":836,"o":"m 583 700 l 856 0 q 781 3 823 0 q 723 6 740 6 q 645 3 688 6 q 587 0 602 0 q 563 90 579 43 q 538 163 547 137 l 359 637 l 189 161 q 142 0 163 87 l 72 5 q 35 4 48 5 q -19 0 23 4 q 25 92 -2 33 q 83 226 52 151 l 272 698 q 311 810 290 747 q 348 932 331 873 q 394 927 379 929 q 423 926 409 926 q 474 929 456 926 q 501 932 491 932 q 583 700 536 819 "},"I":{"x_min":94,"x_max":354,"ha":447,"o":"m 111 402 q 107 716 111 609 q 94 932 103 822 q 161 925 124 929 q 220 922 198 922 q 292 927 245 922 q 353 931 339 932 q 340 716 343 819 q 337 465 337 613 q 340 221 337 326 q 354 0 344 116 q 273 2 330 0 q 214 5 216 5 l 95 0 q 107 199 103 88 q 111 402 111 311 "},"G":{"x_min":43,"x_max":948,"ha":1015,"o":"m 552 -15 q 183 110 324 -15 q 43 461 43 236 q 195 823 43 693 q 583 954 347 954 q 763 932 679 954 q 929 865 848 911 q 879 697 895 784 l 862 697 q 749 816 818 772 q 595 860 680 860 q 390 769 471 860 q 300 608 309 679 q 289 513 291 536 q 287 469 287 490 q 289 404 287 426 q 294 375 292 382 q 389 167 310 250 q 590 84 468 84 q 713 100 651 84 q 699 430 713 272 q 824 423 768 423 q 948 431 886 423 q 942 323 948 395 q 937 214 937 251 q 939 118 937 185 q 942 47 942 51 q 746 1 839 17 q 552 -15 652 -15 "},"ΰ":{"x_min":39,"x_max":768,"ha":843,"o":"m 768 415 q 666 114 768 244 q 404 -15 565 -15 q 165 56 246 -15 q 85 284 85 127 l 89 478 q 87 589 89 523 q 85 666 85 656 q 148 663 102 666 q 198 661 194 661 q 266 663 219 661 q 314 666 312 666 q 298 476 304 566 q 293 294 293 387 q 313 122 293 193 q 405 52 333 52 q 518 146 490 52 q 547 351 547 240 q 528 502 547 433 q 472 656 510 570 q 583 659 531 656 q 687 672 636 662 q 746 547 725 613 q 768 415 768 481 m 121 961 q 179 935 155 961 q 203 877 203 910 q 179 820 203 844 q 121 797 155 797 q 64 820 89 797 q 39 879 39 844 q 62 935 39 910 q 121 961 86 961 m 462 1017 q 504 998 486 1017 q 522 957 522 980 q 508 919 522 935 q 470 886 494 903 l 282 755 l 224 755 l 368 950 q 413 998 391 979 q 462 1017 434 1017 m 657 961 q 713 935 688 961 q 739 877 739 910 q 715 820 739 844 q 658 797 691 797 q 600 820 625 797 q 575 879 575 844 q 599 936 575 912 q 657 961 623 961 "},"`":{"x_min":65.671875,"x_max":330.9375,"ha":375,"o":"m 251 613 q 217 540 240 569 q 153 512 193 512 q 92 537 118 512 q 65 598 65 562 q 87 665 65 634 l 292 949 l 330 933 l 251 613 "},"Υ":{"x_min":-30,"x_max":797,"ha":747,"o":"m 136 650 q 67 772 123 672 q -30 932 10 872 l 92 926 q 184 929 120 926 q 256 931 249 931 q 345 740 304 825 q 442 554 386 656 q 541 730 492 636 q 637 931 589 825 l 712 926 q 753 929 726 926 q 797 931 781 931 q 644 689 714 812 q 498 420 573 566 l 502 143 l 508 0 l 414 5 l 256 0 q 262 138 256 50 q 269 237 269 226 l 269 402 l 136 650 "},"r":{"x_min":80,"x_max":505,"ha":521,"o":"m 91 326 q 85 495 91 381 q 80 666 80 609 l 181 661 q 246 663 201 661 q 297 666 291 666 q 283 592 287 630 q 280 504 280 554 l 288 504 q 357 632 311 581 q 474 683 403 683 l 505 683 q 495 571 498 631 q 492 457 492 511 q 448 477 471 468 q 406 486 424 486 q 320 439 343 486 q 298 323 298 392 q 300 147 298 208 q 311 0 302 85 q 247 3 288 0 q 195 6 206 6 q 130 3 171 6 q 80 0 88 0 q 85 162 80 53 q 91 326 91 270 "},"x":{"x_min":-4.5625,"x_max":646.828125,"ha":644,"o":"m 155 0 l 84 5 q 28 4 46 5 q -4 0 6 0 q 110 148 55 75 q 223 307 164 222 l 113 498 l 7 667 q 86 663 38 667 q 141 659 134 659 q 215 663 169 659 q 271 667 262 667 l 366 473 q 419 555 398 521 q 481 667 439 590 l 553 659 q 601 663 571 659 q 637 667 631 667 q 537 542 580 598 q 419 384 494 486 l 537 177 q 646 0 588 88 q 571 3 620 0 q 516 6 523 6 q 441 3 489 6 q 385 0 392 0 l 276 218 l 155 0 "},"è":{"x_min":41,"x_max":684.046875,"ha":729,"o":"m 482 98 q 566 112 532 98 q 643 160 600 126 l 661 151 q 643 96 652 125 q 628 40 634 66 q 521 -1 577 11 q 403 -15 466 -15 q 141 79 241 -15 q 41 336 41 173 q 137 586 41 490 q 386 683 234 683 q 608 601 532 683 q 684 373 684 520 l 684 332 l 267 332 q 325 165 267 232 q 482 98 383 98 m 436 754 l 211 862 q 162 896 181 877 q 143 946 143 915 q 165 996 143 976 q 217 1017 186 1017 q 274 996 250 1017 q 320 952 298 975 l 508 754 l 436 754 m 478 411 q 481 444 481 422 q 459 566 481 513 q 377 620 438 620 q 292 562 318 620 q 267 437 267 505 l 267 411 l 478 411 "},"μ":{"x_min":79,"x_max":729,"ha":808,"o":"m 717 322 q 723 136 717 256 q 729 0 729 15 l 629 5 q 564 2 609 5 q 518 0 519 0 l 518 81 q 448 4 479 23 q 384 -15 417 -15 q 333 -4 352 -15 q 288 25 313 7 l 288 34 l 287 -57 l 288 -190 l 287 -180 q 292 -278 287 -212 q 297 -368 297 -344 q 221 -361 240 -361 q 189 -361 201 -361 q 150 -361 168 -361 q 79 -368 131 -362 q 86 -277 83 -323 q 90 -187 90 -231 l 90 116 q 90 303 90 177 q 90 491 90 428 q 86 593 90 530 q 82 667 82 655 q 190 659 139 659 q 255 663 214 659 q 305 666 296 666 q 301 506 305 613 q 297 360 297 398 l 297 260 q 315 142 297 189 q 396 95 334 95 q 486 153 466 95 q 507 299 507 211 q 503 517 507 385 q 500 667 500 650 q 619 659 566 659 q 683 663 645 659 q 729 666 722 666 q 723 465 729 594 q 717 322 717 336 "},"÷":{"x_min":169,"x_max":969,"ha":1139,"o":"m 669 667 q 638 597 669 626 q 566 568 608 568 q 497 597 526 568 q 468 669 468 626 q 497 739 468 710 q 567 769 526 769 q 639 739 610 769 q 669 667 669 710 m 969 474 l 969 342 l 169 342 l 169 474 l 969 474 m 669 144 q 638 73 669 103 q 568 44 608 44 q 497 73 526 44 q 468 142 468 102 q 498 214 468 184 q 568 244 528 244 q 639 216 610 244 q 669 144 669 188 "},"h":{"x_min":80,"x_max":729,"ha":808,"o":"m 509 683 q 660 626 601 683 q 719 477 719 570 l 719 403 l 719 246 q 720 109 719 148 q 729 0 722 70 q 665 2 709 0 q 617 5 620 5 q 551 2 598 5 q 501 0 505 0 q 510 147 508 73 q 513 333 513 221 l 509 426 q 482 516 503 482 q 411 551 461 551 q 356 534 380 551 q 322 489 332 517 q 306 428 312 462 q 301 331 301 394 q 304 166 301 277 q 308 0 308 55 q 244 3 284 0 q 194 6 204 6 q 129 3 171 6 q 80 0 88 0 q 85 255 80 84 q 91 513 91 426 q 85 769 91 598 q 80 1024 80 940 l 180 1018 l 197 1018 q 308 1023 259 1018 q 304 902 308 976 q 301 815 301 827 l 301 583 q 509 683 379 683 "},".":{"x_min":68,"x_max":306,"ha":375,"o":"m 187 221 q 268 186 230 221 q 306 104 306 151 q 270 23 306 61 q 187 -15 235 -15 q 102 18 137 -15 q 68 103 68 51 q 102 186 68 151 q 187 221 137 221 "},"φ":{"x_min":32,"x_max":1012,"ha":1044,"o":"m 418 388 q 477 605 418 528 q 671 683 537 683 q 913 589 814 683 q 1012 352 1012 495 q 902 94 1012 180 q 612 -7 793 9 q 617 -198 612 -69 q 622 -374 622 -326 l 544 -365 q 471 -366 503 -365 q 404 -373 438 -368 q 411 -183 404 -315 q 418 -5 418 -51 q 359 1 377 0 q 320 8 341 2 q 112 118 193 29 q 32 334 32 206 q 123 568 32 488 q 374 669 215 648 q 381 643 376 656 q 393 612 386 629 q 278 504 311 576 q 246 329 246 431 q 285 142 246 223 q 418 61 325 61 l 418 276 l 418 388 m 612 61 q 707 88 670 66 q 763 157 743 109 q 788 255 782 205 q 794 377 794 305 q 791 450 794 416 q 779 528 788 484 q 748 593 770 572 q 696 614 725 614 q 631 564 650 614 q 612 459 612 515 l 612 276 l 612 61 "},";":{"x_min":51.390625,"x_max":347,"ha":447,"o":"m 226 654 q 310 619 274 654 q 347 534 347 584 q 312 450 347 485 q 227 416 277 416 q 142 449 177 416 q 108 534 108 482 q 142 619 108 584 q 226 654 177 654 m 134 120 q 172 203 145 170 q 244 237 200 237 q 313 207 284 237 q 343 137 343 178 q 337 100 343 116 q 319 63 331 84 l 88 -254 l 51 -238 l 134 120 "},"f":{"x_min":8,"x_max":463.5625,"ha":425,"o":"m 381 1024 q 433 1019 413 1024 q 463 1010 453 1012 q 443 934 456 987 q 419 826 430 880 l 412 826 q 362 862 384 850 q 310 874 339 874 q 233 812 233 874 q 258 729 233 773 q 300 658 284 685 l 317 658 q 354 658 336 658 q 428 665 372 659 l 425 669 l 425 641 q 425 607 425 625 q 425 576 425 590 l 356 583 l 306 583 l 306 273 q 308 166 306 200 q 323 0 310 133 q 258 3 299 0 q 209 6 217 6 q 144 3 185 6 q 92 0 102 0 q 102 127 99 51 q 105 272 105 203 l 105 580 l 56 583 l 8 583 l 9 622 l 9 665 q 52 659 29 660 q 105 658 74 658 q 183 904 105 784 q 381 1024 262 1024 "},"“":{"x_min":65.28125,"x_max":609.71875,"ha":654,"o":"m 251 613 q 218 541 243 570 q 154 512 194 512 q 90 537 116 512 q 65 601 65 563 q 87 665 65 634 l 291 949 l 331 933 l 251 613 m 530 613 q 498 542 525 573 q 433 512 472 512 q 371 536 397 512 q 345 598 345 560 q 366 665 345 633 l 570 949 l 609 933 l 530 613 "},"A":{"x_min":-29.171875,"x_max":850,"ha":829,"o":"m 109 322 q 193 530 143 400 q 278 751 244 660 q 351 949 312 843 l 420 944 l 490 949 q 672 450 584 685 q 850 0 759 215 l 716 4 l 580 0 l 551 91 l 497 259 q 398 261 448 259 q 300 264 348 262 l 202 259 q 112 0 162 134 l 22 4 l -29 0 l 109 322 m 354 368 l 464 368 q 416 509 440 446 q 355 662 393 572 q 243 370 295 519 l 354 368 "},"6":{"x_min":40,"x_max":716,"ha":749,"o":"m 463 545 q 646 475 576 545 q 716 293 716 405 q 628 65 716 150 q 398 -19 541 -19 q 133 84 226 -19 q 40 362 40 187 q 160 750 40 590 q 501 911 280 911 q 582 903 544 911 q 670 879 620 895 q 658 812 663 845 q 652 748 652 779 l 643 747 q 579 804 612 784 q 502 825 546 825 q 330 716 383 825 q 278 475 278 608 q 359 528 309 511 q 463 545 409 545 m 383 449 q 297 393 317 449 q 278 257 278 337 q 296 113 278 174 q 381 52 315 52 q 469 110 449 52 q 490 256 490 169 q 469 393 490 337 q 383 449 449 449 "},"‘":{"x_min":68.0625,"x_max":331.9375,"ha":374,"o":"m 251 613 q 218 540 241 569 q 151 512 194 512 q 92 537 116 512 q 68 599 68 563 q 75 632 68 612 q 90 663 81 652 l 293 949 l 331 935 l 251 613 "},"ϊ":{"x_min":-28,"x_max":423,"ha":396,"o":"m 91 126 l 91 543 l 80 666 q 139 661 105 663 q 196 658 173 658 q 264 660 238 658 q 314 666 290 663 q 304 586 307 616 q 301 523 301 557 l 301 113 q 302 72 301 88 q 314 0 304 56 l 195 4 l 81 0 q 87 67 84 30 q 91 126 91 104 m 68 975 q 136 947 108 975 q 164 879 164 919 q 138 811 164 840 q 72 783 112 783 q 2 810 33 783 q -28 879 -28 838 q 0 947 -28 919 q 68 975 27 975 m 328 975 q 395 947 367 975 q 423 879 423 919 q 397 811 423 840 q 331 783 371 783 q 261 810 292 783 q 231 879 231 838 q 258 947 231 919 q 328 975 286 975 "},"π":{"x_min":19,"x_max":957.890625,"ha":965,"o":"m 802 521 l 802 108 l 812 0 l 696 4 l 582 0 q 585 61 582 19 q 589 125 589 102 l 594 320 l 589 557 l 504 563 l 421 557 l 421 520 l 421 108 q 432 0 421 55 l 314 4 l 200 0 q 209 64 206 37 q 213 115 213 91 l 213 315 l 213 514 l 213 557 q 129 531 165 557 q 68 461 93 505 l 33 461 q 31 510 33 497 q 19 603 30 523 q 136 645 75 634 q 273 657 196 657 l 531 657 l 792 657 l 957 667 l 955 612 l 957 552 l 803 557 l 802 521 "},"ά":{"x_min":30,"x_max":827.21875,"ha":878,"o":"m 669 665 l 749 662 l 827 665 q 763 499 782 551 q 720 377 743 447 l 818 0 q 763 6 792 2 q 717 10 733 10 q 662 5 692 10 q 615 0 632 1 l 594 101 q 361 -15 501 -15 q 120 83 210 -15 q 30 334 30 182 q 123 583 30 484 q 368 683 217 683 q 515 647 449 683 q 633 547 582 612 q 651 601 640 563 q 669 665 662 638 m 523 952 q 576 1001 556 986 q 625 1017 596 1017 q 677 994 656 1017 q 698 943 698 972 q 679 896 698 915 q 629 862 660 877 l 406 754 l 337 754 l 523 952 m 383 614 q 313 588 343 614 q 276 523 283 562 q 260 434 265 484 q 256 333 256 385 q 269 174 256 249 q 305 87 275 122 q 385 52 335 52 q 509 144 473 52 q 546 340 546 236 q 522 504 546 428 q 455 597 498 580 q 383 614 411 614 "},"O":{"x_min":40,"x_max":1086,"ha":1129,"o":"m 577 949 q 945 829 804 949 q 1086 486 1086 710 q 942 114 1086 244 q 552 -15 798 -15 q 176 107 313 -15 q 40 465 40 229 q 188 823 40 697 q 577 949 337 949 m 562 73 q 773 194 706 73 q 840 472 840 315 q 773 742 840 624 q 566 860 706 860 q 353 742 420 860 q 287 465 287 624 q 353 193 287 313 q 562 73 420 73 "},"n":{"x_min":80,"x_max":727,"ha":808,"o":"m 91 338 q 85 512 91 391 q 80 667 80 632 q 137 661 125 662 q 180 661 149 661 q 249 661 215 661 q 293 666 279 665 l 293 568 q 391 648 333 616 q 508 681 449 681 q 659 624 600 681 q 719 475 719 567 l 719 329 q 723 172 719 287 q 727 0 727 58 q 673 2 709 0 q 617 5 637 5 q 552 2 598 5 q 502 0 506 0 q 507 175 502 58 q 512 333 512 291 l 512 358 q 508 426 512 393 q 483 514 508 476 q 411 552 459 552 q 355 534 379 552 q 318 487 331 517 q 302 419 305 457 q 299 330 299 382 q 304 148 299 264 q 309 0 309 33 q 244 3 285 0 q 195 6 203 6 q 128 3 170 6 q 80 0 86 0 q 85 188 80 65 q 91 338 91 311 "},"3":{"x_min":30,"x_max":680,"ha":749,"o":"m 365 908 q 561 853 479 908 q 643 691 643 799 q 593 565 643 612 q 457 485 544 517 l 457 476 q 617 410 555 463 q 680 260 680 356 q 573 50 680 122 q 318 -21 466 -21 q 30 58 155 -21 q 90 161 67 120 q 137 250 113 202 l 154 250 q 185 109 154 167 q 292 51 216 51 q 404 109 367 51 q 442 245 442 167 q 397 376 442 327 q 271 425 353 425 l 231 425 l 231 505 l 268 504 q 392 549 345 504 q 439 670 439 594 q 408 785 439 738 q 313 833 377 833 q 213 776 244 833 q 183 644 183 719 l 170 634 q 121 690 145 665 q 43 767 97 716 q 179 874 94 840 q 365 908 265 908 "},"9":{"x_min":30,"x_max":705,"ha":749,"o":"m 281 343 q 98 414 167 343 q 30 601 30 486 q 121 827 30 744 q 359 911 213 911 q 618 801 532 911 q 705 515 705 692 q 583 135 705 291 q 243 -21 461 -21 q 158 -12 193 -21 q 74 9 123 -4 q 87 74 82 42 q 92 140 92 106 l 102 143 q 163 84 127 105 q 243 64 199 64 q 414 172 362 64 q 467 414 467 280 q 386 359 435 376 q 281 343 337 343 m 360 440 q 446 495 426 440 q 467 630 467 551 q 447 775 467 714 q 361 837 427 837 q 274 778 293 837 q 256 631 256 720 q 276 496 256 553 q 360 440 296 440 "},"l":{"x_min":86,"x_max":316,"ha":407,"o":"m 99 501 q 95 701 99 579 q 92 843 92 823 l 86 1024 q 154 1016 125 1019 q 201 1013 183 1013 q 265 1018 232 1013 q 316 1023 297 1022 q 309 719 316 915 q 303 501 303 523 l 307 180 l 316 0 q 263 5 309 1 q 201 10 218 10 q 138 6 169 10 q 86 0 108 2 q 92 292 86 104 q 99 501 99 480 "},"κ":{"x_min":80,"x_max":732.765625,"ha":756,"o":"m 184 659 q 306 667 239 659 l 301 509 l 295 461 l 295 389 q 422 510 367 447 q 545 667 478 573 l 618 667 l 709 667 l 714 657 l 628 576 l 475 425 q 552 292 510 364 q 636 154 595 220 l 732 0 q 661 3 706 0 q 607 6 616 6 q 536 3 579 6 q 486 0 493 0 q 386 174 440 83 q 295 329 331 266 l 295 249 q 298 106 295 206 q 301 0 301 6 l 190 4 l 80 0 q 85 127 80 43 q 91 255 91 212 q 85 461 91 323 q 80 666 80 598 l 184 659 "},"4":{"x_min":43,"x_max":708.265625,"ha":749,"o":"m 706 383 l 701 299 q 704 248 701 271 q 708 211 706 225 q 592 221 650 221 l 592 176 q 594 83 592 127 q 606 0 597 40 q 540 3 579 0 q 497 6 501 6 q 433 3 473 6 q 384 0 393 0 q 393 104 390 44 q 396 219 396 165 l 309 221 q 169 216 262 221 q 43 212 76 212 l 44 296 l 44 379 q 174 568 113 477 q 287 738 235 658 q 396 909 338 818 q 503 902 444 902 q 553 902 527 902 q 606 909 589 907 q 599 720 606 843 q 592 534 592 596 l 592 370 q 650 375 614 370 q 706 383 686 380 m 396 370 l 396 752 l 141 370 l 396 370 "},"p":{"x_min":82,"x_max":772,"ha":825,"o":"m 502 683 q 704 574 636 683 q 772 322 772 466 q 701 82 772 179 q 491 -15 630 -15 q 302 85 371 -15 l 302 -71 l 309 -385 q 249 -379 278 -382 q 196 -376 221 -376 q 139 -379 171 -376 q 82 -384 108 -381 q 87 -252 82 -341 q 92 -131 92 -162 l 88 487 l 82 666 q 195 659 141 659 q 235 660 216 659 q 307 666 254 661 q 302 580 302 618 q 391 656 343 630 q 502 683 440 683 m 430 79 q 472 86 453 79 q 515 122 491 94 q 548 204 539 151 q 557 337 557 258 q 532 503 557 431 q 430 576 507 576 q 324 501 350 576 q 298 327 298 427 q 323 152 298 226 q 430 79 349 79 "},"ψ":{"x_min":59,"x_max":1025,"ha":1064,"o":"m 1025 437 q 919 131 1025 249 q 625 -7 813 13 q 630 -190 625 -68 q 636 -374 636 -312 l 558 -365 q 483 -366 516 -365 q 418 -373 451 -368 q 424 -159 418 -297 q 431 -5 431 -22 q 374 0 401 -2 q 271 20 348 2 q 127 124 195 37 q 59 331 59 211 l 60 484 l 59 666 l 168 663 l 277 666 q 269 506 277 619 q 261 358 261 392 q 293 144 261 228 q 431 51 325 60 l 431 253 q 424 572 431 367 q 418 800 418 777 l 536 795 l 636 798 q 630 650 636 748 q 625 501 625 551 l 625 254 l 625 51 q 767 146 726 51 q 808 359 808 241 q 798 498 808 440 q 762 650 788 556 q 867 654 821 650 q 980 666 913 658 q 1025 437 1025 552 "},"Ü":{"x_min":82,"x_max":910,"ha":997,"o":"m 210 927 l 338 931 q 329 643 338 836 q 321 421 321 451 q 360 197 321 284 q 521 110 400 110 q 678 162 609 110 q 756 279 747 214 q 768 420 765 344 q 771 548 771 495 q 756 931 771 755 l 814 927 l 910 931 q 903 770 910 883 q 896 616 896 657 l 896 480 l 896 375 q 794 81 896 178 q 493 -15 692 -15 q 210 56 321 -15 q 100 287 100 128 q 91 619 100 386 q 82 931 82 852 l 210 927 m 394 1242 q 461 1215 433 1242 q 489 1148 489 1189 q 463 1078 489 1107 q 396 1050 437 1050 q 327 1078 355 1050 q 299 1148 299 1107 q 326 1214 299 1186 q 394 1242 354 1242 m 654 1242 q 721 1214 694 1242 q 749 1148 749 1187 q 724 1079 749 1108 q 658 1050 699 1050 q 588 1077 617 1050 q 559 1148 559 1105 q 587 1214 559 1187 q 654 1242 615 1242 "},"à":{"x_min":44,"x_max":706.78125,"ha":706,"o":"m 237 -15 q 98 35 153 -15 q 44 169 44 86 q 212 352 44 301 q 401 421 380 403 q 410 439 410 432 q 373 539 410 502 q 275 577 337 577 q 140 511 185 577 l 135 511 l 115 585 q 230 657 164 632 q 365 683 296 683 q 543 623 479 683 q 608 452 608 564 l 604 213 q 604 166 604 184 q 608 123 604 148 q 625 87 612 99 q 658 76 638 76 q 679 80 666 76 q 702 90 691 84 l 706 40 q 643 1 676 14 q 563 -15 610 -10 q 481 5 520 -15 q 421 64 441 26 q 237 -15 351 -15 m 425 755 l 201 863 q 145 902 159 883 q 131 944 131 921 q 153 996 131 975 q 206 1017 175 1017 q 253 1002 232 1017 q 309 953 273 987 l 494 755 l 425 755 m 240 200 q 261 128 240 158 q 321 99 282 99 q 388 131 367 99 q 410 211 410 164 l 410 352 q 287 302 335 338 q 240 200 240 267 "},"η":{"x_min":80,"x_max":727,"ha":808,"o":"m 91 339 q 85 512 91 391 q 80 667 80 632 q 137 661 125 662 q 180 661 149 661 q 244 663 199 661 q 293 666 290 666 l 293 568 q 391 651 338 622 q 511 681 443 681 q 660 622 602 681 q 719 471 719 564 l 719 328 l 719 -49 q 723 -219 719 -106 q 727 -373 727 -332 q 618 -365 670 -365 q 502 -373 562 -365 l 512 16 l 512 251 l 512 368 q 491 499 512 446 q 408 552 471 552 q 319 488 342 552 q 302 419 305 457 q 299 330 299 382 q 304 148 299 264 q 309 0 309 33 q 243 3 278 0 q 195 6 207 6 q 127 3 163 6 q 80 0 92 0 q 85 188 80 65 q 91 339 91 311 "}},"cssFontWeight":"bold","ascender":1288,"underlinePosition":-133,"cssFontStyle":"normal","boundingBox":{"yMin":-385,"xMin":-147,"yMax":1288,"xMax":1618},"resolution":1000,"original_font_information":{"postscript_name":"Optimer-Bold","version_string":"Version 1.00 2004 initial release","vendor_url":"http://www.magenta.gr/","full_font_name":"Optimer Bold","font_family_name":"Optimer","copyright":"Copyright (c) Magenta Ltd., 2004.","description":"","trademark":"","designer":"","designer_url":"","unique_font_identifier":"Magenta Ltd.:Optimer Bold:22-10-104","license_url":"http://www.ellak.gr/fonts/MgOpen/license.html","license_description":"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\"Fonts\") and associated documentation files (the \"Font Software\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \r\n\r\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\r\n\r\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \"MgOpen\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\r\n\r\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \"MgOpen\" name.\r\n\r\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \r\n\r\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.","manufacturer_name":"Magenta Ltd.","font_sub_family_name":"Bold"},"descender":-385,"familyName":"Optimer","lineHeight":1672,"underlineThickness":20} ================================================ FILE: examples/resources/fonts/typeface/optimer_regular.typeface.json ================================================ {"glyphs":{"ο":{"x_min":41,"x_max":710,"ha":753,"o":"m 371 -15 q 131 78 222 -15 q 41 322 41 172 q 133 573 41 474 q 378 672 225 672 q 619 574 528 672 q 710 326 710 477 q 617 80 710 175 q 371 -15 525 -15 m 377 619 q 226 530 272 619 q 180 327 180 441 q 227 125 180 216 q 375 35 274 35 q 524 123 478 35 q 570 326 570 211 q 524 529 570 440 q 377 619 479 619 "},"S":{"x_min":50,"x_max":639,"ha":699,"o":"m 88 208 q 179 88 122 131 q 318 46 237 46 q 457 98 397 46 q 518 227 518 150 q 401 400 518 336 q 184 498 293 448 q 68 688 68 566 q 156 880 68 811 q 370 950 244 950 q 480 936 430 950 q 597 891 530 922 q 570 822 583 858 q 553 756 558 786 l 539 756 q 354 897 502 897 q 231 855 282 897 q 181 742 181 813 q 298 580 181 640 q 519 483 408 531 q 639 286 639 413 q 538 68 639 152 q 301 -15 438 -15 q 166 2 229 -15 q 50 59 104 19 q 68 135 62 104 q 75 205 75 166 l 88 208 "},"/":{"x_min":-36.03125,"x_max":404.15625,"ha":383,"o":"m -36 -125 l 340 1025 l 404 1024 l 28 -126 l -36 -125 "},"Τ":{"x_min":11,"x_max":713,"ha":725,"o":"m 11 839 l 15 884 l 11 932 q 194 927 72 932 q 361 922 316 922 q 544 927 421 922 q 713 932 668 932 q 707 883 707 911 q 707 861 707 870 q 713 834 707 852 q 609 850 666 843 q 504 857 552 857 l 428 857 q 426 767 428 830 q 424 701 424 704 l 428 220 q 442 0 428 122 q 362 8 401 3 q 323 5 344 8 q 282 0 301 2 q 289 132 282 40 q 296 259 296 225 l 296 683 l 296 857 q 11 839 164 857 "},"ϕ":{"x_min":41,"x_max":960,"ha":1006,"o":"m 441 -10 q 162 76 283 -10 q 41 316 41 163 q 162 562 41 470 q 441 654 283 654 q 434 838 441 719 q 427 971 427 957 q 464 965 443 968 q 503 962 485 962 q 540 965 519 962 q 578 970 560 968 q 563 654 563 824 q 839 567 719 654 q 960 324 960 481 q 841 79 960 169 q 563 -10 722 -10 q 570 -201 563 -68 q 578 -371 578 -334 q 505 -362 539 -362 q 465 -365 483 -362 q 427 -372 446 -368 q 434 -161 427 -297 q 441 -10 441 -26 m 563 39 q 757 118 690 39 q 824 330 824 198 q 750 523 824 445 q 564 601 677 601 l 563 319 l 563 39 m 441 319 l 441 601 q 253 523 326 601 q 180 330 180 446 q 245 117 180 195 q 439 39 310 39 l 441 319 "},"y":{"x_min":4.171875,"x_max":665.28125,"ha":664,"o":"m 4 654 l 86 647 l 165 654 q 202 536 188 577 q 241 431 215 495 l 363 129 l 473 413 q 552 654 519 537 q 606 647 583 647 q 665 654 633 647 q 416 125 531 388 q 223 -372 301 -137 l 187 -366 q 141 -366 163 -366 q 112 -372 122 -370 l 290 -22 q 4 654 170 294 "},"≈":{"x_min":118.0625,"x_max":1019.453125,"ha":1139,"o":"m 765 442 q 564 487 700 442 q 376 533 429 533 q 250 506 298 533 q 118 427 202 480 l 118 501 q 245 572 180 545 q 376 600 311 600 q 574 553 438 600 q 765 507 709 507 q 888 534 829 507 q 1019 614 947 562 l 1019 538 q 892 467 954 493 q 765 442 830 442 m 759 214 q 568 260 702 214 q 376 307 433 307 q 236 272 300 307 q 118 202 173 238 l 118 277 q 247 346 181 320 q 380 372 312 372 q 570 326 445 372 q 765 281 695 281 q 883 306 830 281 q 1019 388 936 331 l 1019 313 q 894 240 959 266 q 759 214 829 214 "},"Π":{"x_min":108,"x_max":927.453125,"ha":1036,"o":"m 432 846 l 263 846 q 260 634 263 781 q 257 475 257 486 q 262 236 257 395 q 268 0 268 77 q 229 3 255 0 q 188 8 202 8 q 149 3 177 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 711 126 620 q 108 932 119 803 q 285 926 166 932 q 464 921 405 921 q 695 926 541 921 q 927 932 849 932 q 915 793 921 871 q 909 659 909 716 l 909 504 q 917 245 909 427 q 926 0 926 62 q 887 4 913 0 q 847 8 860 8 q 810 5 827 8 q 768 0 792 2 q 773 259 768 94 q 778 469 778 423 l 778 731 l 773 846 l 432 846 "},"ΐ":{"x_min":-41,"x_max":384,"ha":342,"o":"m 105 333 l 105 520 q 104 566 105 544 q 97 654 103 588 q 141 647 131 648 q 166 647 152 647 q 234 654 196 647 q 225 555 226 599 q 224 437 224 510 l 224 406 q 229 194 224 337 q 234 0 234 51 q 202 3 217 1 q 166 5 186 5 q 128 3 149 5 q 97 0 108 1 q 101 165 97 51 q 105 333 105 279 m 18 865 q 61 846 43 865 q 80 804 80 828 q 61 761 80 779 q 18 743 43 743 q -22 761 -4 743 q -41 804 -41 779 q -22 846 -41 828 q 18 865 -4 865 m 172 929 q 189 969 179 956 q 225 982 199 982 q 256 971 243 982 q 270 941 270 961 q 257 904 270 919 l 149 743 l 117 743 l 172 929 m 324 865 q 366 846 348 865 q 384 804 384 828 q 366 761 384 779 q 324 743 348 743 q 281 761 298 743 q 265 804 265 779 q 281 846 265 828 q 324 865 298 865 "},"g":{"x_min":32,"x_max":672,"ha":688,"o":"m 81 123 q 112 201 81 169 q 193 252 144 233 l 193 262 q 97 329 130 277 q 64 447 64 380 q 141 610 64 549 q 323 672 218 672 q 421 661 357 672 q 500 650 486 651 l 672 654 l 672 582 q 599 592 635 587 q 537 597 563 597 q 607 458 607 548 q 527 294 607 356 q 342 232 447 232 q 291 235 319 232 q 255 239 262 239 q 208 220 228 239 q 188 173 188 201 q 221 120 188 136 q 296 104 254 104 l 427 104 q 603 56 534 104 q 672 -93 672 9 q 560 -299 672 -226 q 309 -372 448 -372 q 115 -327 199 -372 q 32 -183 32 -283 q 76 -62 32 -110 q 193 8 121 -13 q 112 51 143 25 q 81 123 81 77 m 332 278 q 439 332 401 278 q 478 457 478 386 q 441 575 478 525 q 338 625 404 625 q 232 570 271 625 q 194 447 194 515 q 230 328 194 379 q 332 278 266 278 m 337 -316 q 491 -270 423 -316 q 559 -141 559 -224 q 500 -29 559 -62 q 353 3 441 3 q 199 -36 263 3 q 136 -162 136 -76 q 195 -277 136 -238 q 337 -316 255 -316 "},"²":{"x_min":15.28125,"x_max":412.5,"ha":496,"o":"m 297 744 q 270 830 297 795 q 197 866 244 866 q 120 837 149 866 q 83 761 90 808 l 76 759 q 54 802 68 780 q 31 837 40 824 q 210 901 108 901 q 334 862 278 901 q 390 758 390 824 q 282 568 390 656 q 111 428 174 479 l 293 428 q 350 431 316 428 q 412 439 384 434 l 406 397 l 412 356 l 304 361 l 111 361 l 15 355 l 15 378 q 220 567 144 484 q 297 744 297 651 "},"Κ":{"x_min":108,"x_max":856.625,"ha":821,"o":"m 255 314 q 261 132 255 250 q 268 0 268 13 q 229 4 255 0 q 188 8 202 8 q 148 4 174 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 712 126 621 q 108 932 119 803 q 153 928 124 932 q 188 925 183 925 q 231 928 203 925 q 267 932 259 932 l 255 671 l 255 499 q 480 693 375 586 q 687 932 585 800 q 732 932 710 932 q 777 932 753 932 l 837 932 q 606 727 720 830 q 389 522 493 623 q 525 358 465 426 q 666 202 586 290 q 856 0 747 115 l 746 0 q 692 -1 716 0 q 644 -8 669 -2 q 571 92 610 44 q 477 204 532 140 l 255 459 l 255 314 "},"ë":{"x_min":40,"x_max":646.9375,"ha":681,"o":"m 406 42 q 602 130 523 42 l 621 130 q 613 93 617 112 q 609 47 609 73 q 496 0 558 14 q 369 -15 435 -15 q 130 73 220 -15 q 40 311 40 162 q 126 562 40 456 q 355 669 212 669 q 564 590 481 669 q 646 386 646 512 l 644 331 q 438 333 562 331 q 313 335 315 335 l 179 331 q 235 127 179 212 q 406 42 291 42 m 219 929 q 271 906 249 929 q 294 854 294 884 q 273 800 294 822 q 221 778 252 778 q 166 800 190 778 q 143 854 143 822 q 165 906 143 884 q 219 929 187 929 m 460 929 q 513 906 492 929 q 534 854 534 884 q 513 799 534 820 q 461 778 493 778 q 407 800 429 778 q 385 854 385 822 q 407 906 385 884 q 460 929 429 929 m 513 392 l 513 437 q 470 563 513 509 q 356 618 427 618 q 233 552 271 618 q 183 390 195 487 l 513 392 "},"e":{"x_min":41,"x_max":645.15625,"ha":681,"o":"m 406 42 q 602 130 523 42 l 618 125 q 611 86 614 104 q 609 44 609 67 q 497 0 561 14 q 370 -15 434 -15 q 130 73 220 -15 q 41 311 41 161 q 127 563 41 455 q 356 672 214 672 q 563 592 482 672 q 645 385 645 512 l 643 331 l 313 335 l 179 331 q 235 126 179 210 q 406 42 291 42 m 511 392 l 513 436 q 470 563 513 509 q 356 618 427 618 q 230 553 268 618 q 179 388 191 488 l 511 392 "},"ό":{"x_min":41,"x_max":710,"ha":753,"o":"m 371 -15 q 131 78 222 -15 q 41 322 41 172 q 133 573 41 474 q 378 672 225 672 q 619 574 528 672 q 710 326 710 477 q 617 80 710 175 q 371 -15 525 -15 m 524 943 q 558 974 542 964 q 595 985 574 985 q 632 969 618 985 q 646 932 646 954 q 632 897 646 911 q 591 866 618 883 l 390 743 l 341 743 l 524 943 m 377 619 q 226 530 272 619 q 180 327 180 441 q 227 125 180 216 q 375 35 274 35 q 524 123 478 35 q 570 326 570 211 q 524 529 570 440 q 377 619 479 619 "},"J":{"x_min":-71,"x_max":277,"ha":385,"o":"m 118 -40 q 131 62 128 9 q 135 184 135 115 q 132 462 135 325 q 127 690 130 598 q 111 932 123 782 q 159 928 129 932 q 193 925 189 925 q 238 927 221 925 q 277 932 256 929 q 268 665 277 843 q 260 457 260 487 l 260 165 q 260 107 260 147 q 260 48 260 68 q 169 -155 260 -88 q -62 -222 79 -222 l -71 -180 q 50 -134 1 -166 q 118 -40 100 -102 "},"»":{"x_min":43,"x_max":543,"ha":607,"o":"m 196 322 l 43 607 l 81 645 l 303 322 l 81 0 l 43 37 l 196 322 m 436 322 l 283 607 l 322 645 l 543 322 l 322 0 l 283 37 l 436 322 "},"©":{"x_min":80,"x_max":1058,"ha":1139,"o":"m 816 905 q 992 726 927 841 q 1058 481 1058 611 q 912 138 1058 283 q 567 -6 766 -6 q 225 139 370 -6 q 80 481 80 284 q 224 826 80 681 q 569 971 368 971 q 816 905 698 971 m 569 918 q 263 788 392 918 q 134 481 134 659 q 261 175 134 306 q 566 45 389 45 q 872 174 741 45 q 1004 478 1004 304 q 947 699 1004 596 q 787 859 890 801 q 569 918 684 918 m 570 724 q 441 652 483 724 q 399 490 399 581 q 438 320 399 396 q 560 245 478 245 q 664 278 621 245 q 723 370 707 311 l 798 370 q 720 232 788 283 q 561 181 653 181 q 379 268 446 181 q 313 476 313 355 q 380 694 313 604 q 571 785 447 785 q 717 738 656 785 q 793 610 779 691 l 715 610 q 664 692 705 660 q 570 724 624 724 "},"ώ":{"x_min":39.71875,"x_max":1028.9375,"ha":1068,"o":"m 534 528 l 596 528 l 594 305 q 616 117 594 193 q 722 42 638 42 q 850 118 811 42 q 888 293 888 194 q 829 502 888 409 q 664 654 769 594 l 717 648 q 805 654 766 648 q 967 510 905 606 q 1028 304 1028 413 q 948 81 1028 177 q 744 -15 867 -15 q 622 16 678 -15 q 534 104 566 47 q 445 16 500 48 q 323 -15 389 -15 q 118 83 196 -15 q 39 311 39 182 q 100 511 39 419 q 262 654 161 604 q 303 650 278 651 q 349 648 327 648 l 402 654 q 238 501 296 593 q 179 291 179 409 q 218 116 179 191 q 348 42 257 42 q 419 68 390 42 q 461 138 448 94 q 472 216 469 175 q 475 303 475 257 q 472 420 475 353 q 469 529 470 486 l 534 528 m 681 943 q 714 974 699 964 q 751 985 730 985 q 788 969 774 985 q 802 932 802 954 q 787 896 802 912 q 746 866 773 880 l 547 743 l 498 743 l 681 943 "},"≥":{"x_min":176.1875,"x_max":963,"ha":1139,"o":"m 963 462 l 176 196 l 176 266 l 850 491 l 176 718 l 176 788 l 963 522 l 963 462 m 963 26 l 176 26 l 176 93 l 963 93 l 963 26 "},"^":{"x_min":0,"x_max":390,"ha":403,"o":"m 150 978 l 239 978 l 390 743 l 344 743 l 195 875 l 49 743 l 0 743 l 150 978 "},"«":{"x_min":48,"x_max":549.390625,"ha":607,"o":"m 152 326 l 309 42 l 268 3 l 48 326 l 268 649 l 309 611 l 152 326 m 394 326 l 549 42 l 509 3 l 288 326 l 509 649 l 549 611 l 394 326 "},"D":{"x_min":108,"x_max":991,"ha":1043,"o":"m 126 465 q 117 704 126 536 q 108 931 108 872 l 210 929 q 350 934 251 929 q 477 939 449 939 q 579 936 553 939 q 709 917 605 934 q 902 775 814 900 q 991 483 991 650 q 852 130 991 261 q 491 0 713 0 l 378 0 l 228 7 l 203 7 q 148 4 173 7 q 108 0 123 1 q 117 239 108 70 q 126 465 126 408 m 402 64 q 724 168 609 64 q 840 479 840 273 q 730 774 840 671 q 428 878 621 878 q 345 873 400 878 q 262 869 289 869 l 255 497 l 255 376 l 262 76 q 332 68 292 72 q 402 64 373 64 "},"w":{"x_min":4.171875,"x_max":1052.78125,"ha":1047,"o":"m 4 655 q 55 648 41 648 q 86 647 69 647 q 165 654 120 647 q 190 540 176 587 q 238 394 204 492 l 329 141 q 498 654 419 386 q 551 647 526 647 q 609 654 577 647 q 637 544 620 601 q 677 420 654 487 l 770 135 l 872 413 q 911 532 893 472 q 944 654 930 592 q 979 647 970 648 q 1000 647 988 647 q 1052 654 1022 647 q 961 457 1002 555 q 871 235 919 359 q 782 0 824 110 q 755 3 772 0 q 733 6 738 6 q 708 3 724 6 q 686 0 692 0 q 650 127 667 72 q 611 239 632 183 l 518 494 q 432 258 475 382 q 348 0 390 134 q 325 3 336 1 q 297 5 313 5 q 269 3 284 5 q 245 0 254 1 q 162 244 200 140 q 86 447 125 347 q 4 655 47 546 "},"$":{"x_min":89,"x_max":666,"ha":749,"o":"m 139 186 l 146 186 q 213 91 165 119 q 342 50 261 63 l 342 416 q 142 515 196 458 q 89 648 89 573 q 164 819 89 752 q 342 886 239 886 q 330 985 342 936 l 359 979 l 404 984 q 400 924 401 945 q 399 886 399 904 q 510 874 457 886 q 605 834 562 862 q 582 788 592 808 q 555 729 572 768 l 547 729 q 495 810 535 783 q 399 837 455 837 l 399 520 q 610 419 554 479 q 666 277 666 359 q 588 87 666 164 q 399 0 511 9 l 399 -32 q 399 -63 399 -48 q 405 -125 400 -78 l 368 -121 l 329 -125 l 342 0 q 210 13 273 0 q 98 58 147 27 l 139 186 m 342 836 q 237 787 278 826 q 196 686 196 748 q 237 588 196 626 q 342 537 279 551 l 342 836 m 553 231 q 513 337 553 300 q 399 402 473 375 l 399 51 q 512 113 471 66 q 553 231 553 159 "},"‧":{"x_min":134,"x_max":309,"ha":446,"o":"m 222 636 q 284 611 259 636 q 309 548 309 586 q 284 486 309 512 q 222 461 260 461 q 160 486 186 461 q 134 548 134 511 q 159 610 134 584 q 222 636 185 636 "},"\\":{"x_min":-36,"x_max":403.140625,"ha":383,"o":"m -36 1025 l 28 1025 l 403 -125 l 340 -125 l -36 1025 "},"Ι":{"x_min":109,"x_max":271,"ha":385,"o":"m 127 465 q 123 711 127 620 q 109 932 120 803 q 154 927 129 929 q 190 925 179 925 q 238 928 209 925 q 271 931 266 931 q 263 788 271 887 q 256 659 256 690 l 256 448 l 256 283 q 263 135 256 238 q 271 0 271 31 q 231 3 258 0 q 190 8 204 8 q 151 5 172 8 q 109 0 129 2 q 118 239 109 70 q 127 465 127 408 "},"Ύ":{"x_min":-1,"x_max":1204.5625,"ha":1165,"o":"m 758 177 l 758 386 q 651 570 717 458 q 543 750 585 681 q 431 931 501 819 q 483 928 449 931 q 522 925 518 925 q 572 927 550 925 q 606 931 593 930 q 666 800 633 866 q 735 676 699 734 l 849 475 q 968 688 910 575 q 1086 931 1027 801 l 1142 926 q 1174 927 1160 926 q 1204 931 1187 929 q 1014 627 1099 769 l 891 415 l 891 240 q 894 101 891 198 q 897 0 897 5 q 860 4 885 1 q 820 6 835 6 q 778 4 793 6 q 743 0 763 2 q 753 88 748 36 q 758 177 758 140 m 182 943 q 215 974 200 964 q 252 985 231 985 q 289 969 274 985 q 305 932 305 954 q 290 896 305 911 q 248 866 275 882 l 48 743 l -1 743 l 182 943 "},"’":{"x_min":90.28125,"x_max":305.5625,"ha":374,"o":"m 169 859 q 197 923 177 894 q 250 953 218 953 q 288 939 272 953 q 305 902 305 925 q 295 857 305 882 q 269 811 284 833 l 120 568 l 90 576 l 169 859 "},"Ν":{"x_min":98,"x_max":911.890625,"ha":1011,"o":"m 112 230 q 114 486 112 315 q 117 741 117 656 l 117 950 l 166 950 q 326 766 239 865 q 468 606 413 667 q 610 451 524 544 l 821 227 l 821 604 q 816 765 821 685 q 803 931 812 845 l 855 927 l 911 931 q 901 831 906 884 q 897 741 897 779 q 894 413 897 619 q 892 165 892 207 l 892 -15 l 849 -15 q 730 125 796 50 q 589 281 664 201 l 193 702 l 193 330 q 212 -1 193 169 l 149 2 l 98 -1 q 108 125 105 79 q 112 230 112 170 "},"-":{"x_min":58.328125,"x_max":388.890625,"ha":449,"o":"m 58 390 l 388 390 l 388 273 l 58 273 l 58 390 "},"Q":{"x_min":51,"x_max":1074.609375,"ha":1119,"o":"m 566 -14 q 194 113 338 -14 q 51 465 51 241 q 192 820 51 690 q 559 950 333 950 q 892 853 754 950 q 1047 654 1031 756 q 1065 525 1062 551 q 1068 462 1068 499 q 1065 405 1068 429 q 1050 305 1062 381 q 960 144 1038 229 q 748 6 881 59 l 930 -112 q 1004 -161 963 -136 q 1074 -200 1045 -186 q 1008 -228 1035 -214 q 951 -267 980 -243 q 876 -208 912 -234 q 803 -154 841 -182 l 606 -14 l 566 -14 m 202 468 q 290 163 202 283 q 559 43 379 43 q 826 163 738 43 q 915 468 915 284 q 825 770 915 651 q 559 889 735 889 q 348 826 429 889 q 225 638 267 763 q 202 468 202 552 "},"ς":{"x_min":44,"x_max":613.453125,"ha":644,"o":"m 305 -206 q 350 -218 325 -218 q 447 -177 407 -218 q 487 -79 487 -136 q 376 55 487 4 q 159 156 266 106 q 44 365 44 231 q 143 585 44 499 q 380 672 242 672 q 506 658 448 672 q 613 616 564 645 q 587 500 595 559 l 562 500 q 501 586 549 557 q 391 616 453 616 q 233 551 296 616 q 170 393 170 486 q 216 271 170 320 q 339 196 263 223 l 467 149 q 569 76 531 119 q 608 -27 608 34 q 522 -206 608 -136 q 321 -293 437 -276 l 305 -206 "},"M":{"x_min":55,"x_max":1165,"ha":1238,"o":"m 190 950 l 243 950 q 331 772 291 851 q 412 612 370 693 q 504 436 454 532 l 626 214 q 742 435 671 298 q 882 711 813 572 q 1001 950 952 850 l 1052 950 q 1082 649 1067 791 q 1118 341 1098 508 q 1165 0 1139 174 q 1121 8 1139 5 q 1088 11 1103 11 q 1049 6 1071 11 q 1008 0 1027 2 q 998 226 1008 109 q 974 461 989 343 q 944 695 959 579 l 748 312 q 610 0 665 152 l 594 1 l 576 0 q 227 685 402 364 l 188 307 q 172 128 175 179 q 168 0 168 77 q 138 4 157 1 q 110 6 118 6 q 81 4 93 6 q 55 0 68 2 q 121 333 89 168 q 171 652 152 498 q 190 950 190 805 "},"Ψ":{"x_min":73,"x_max":995.609375,"ha":1071,"o":"m 609 0 q 561 5 585 2 q 532 8 536 8 q 494 5 515 8 q 456 0 474 2 q 463 151 456 45 q 470 297 470 258 q 180 383 287 297 q 73 650 73 469 l 73 817 l 73 932 q 139 925 110 925 q 180 928 155 925 q 212 931 206 931 q 200 818 204 861 q 197 723 197 774 l 197 688 l 197 638 q 268 438 197 508 q 472 368 340 368 l 473 481 q 464 736 473 566 q 456 932 456 905 q 499 927 481 929 q 532 925 518 925 q 577 927 557 925 q 609 931 596 930 q 601 635 609 841 q 594 368 594 429 l 645 372 q 816 465 765 372 q 868 691 868 559 q 861 829 868 740 q 855 932 855 919 q 896 927 878 929 q 924 925 913 925 q 971 927 955 925 q 995 931 987 930 l 994 839 l 994 675 q 894 388 994 480 q 594 297 794 297 q 601 142 594 249 q 609 0 609 35 "},"C":{"x_min":51,"x_max":881.5625,"ha":913,"o":"m 828 737 q 552 889 733 889 q 295 768 383 889 q 207 469 207 647 q 299 177 207 305 q 551 50 391 50 q 710 86 637 50 q 855 189 783 122 l 870 183 q 858 122 862 147 q 855 69 855 97 q 521 -15 699 -15 q 180 116 309 -15 q 51 462 51 248 q 189 820 51 690 q 556 950 327 950 q 719 930 638 950 q 881 875 799 911 q 857 809 867 843 q 845 737 847 775 l 828 737 "},"œ":{"x_min":39,"x_max":1195.9375,"ha":1226,"o":"m 359 -15 q 125 76 212 -15 q 39 318 39 167 q 125 571 39 470 q 362 672 212 672 q 514 640 441 672 q 641 551 588 608 q 897 672 741 672 q 1110 593 1024 672 q 1195 390 1195 515 l 1193 331 q 1022 332 1108 331 q 851 334 935 333 l 708 331 q 765 124 708 206 q 944 42 822 42 q 1145 130 1068 42 l 1162 130 q 1155 85 1158 110 q 1151 47 1152 60 q 1036 0 1100 14 q 904 -15 973 -15 q 754 12 819 -15 q 641 106 689 40 q 514 14 584 44 q 359 -15 444 -15 m 376 625 q 224 534 270 625 q 179 328 179 443 q 224 124 179 215 q 369 34 269 34 q 521 127 470 34 q 573 328 573 221 q 526 534 573 443 q 376 625 480 625 m 1061 392 l 1061 423 q 1017 561 1061 504 q 894 618 973 618 q 756 549 805 618 q 708 390 708 480 l 1061 392 "},"!":{"x_min":136,"x_max":312,"ha":449,"o":"m 223 156 q 285 130 259 156 q 312 68 312 105 q 285 8 312 32 q 223 -15 259 -15 q 161 9 187 -15 q 136 68 136 33 q 160 130 136 105 q 223 156 185 156 m 150 752 l 144 841 q 161 919 144 888 q 223 950 178 950 q 282 925 260 950 q 304 863 304 901 q 299 808 304 845 q 295 752 295 770 l 246 250 q 223 250 238 250 q 199 250 206 250 l 150 752 "},"ç":{"x_min":34,"x_max":614.5625,"ha":644,"o":"m 607 119 l 592 41 q 490 -2 549 10 q 363 -15 431 -15 q 130 80 227 -15 q 34 313 34 175 q 132 576 34 480 q 397 672 231 672 q 511 659 456 672 q 614 617 565 647 q 597 558 604 587 q 584 492 589 528 l 570 492 q 507 587 547 553 q 406 622 467 622 q 234 534 293 622 q 176 329 176 447 q 238 126 176 211 q 414 42 300 42 q 592 124 521 42 l 607 119 m 202 -212 q 350 -246 273 -246 q 414 -232 388 -246 q 440 -186 440 -219 q 421 -142 440 -158 q 373 -126 402 -126 l 323 -126 l 323 0 l 367 0 l 367 -77 l 404 -73 q 495 -102 457 -73 q 533 -183 533 -132 q 494 -270 533 -237 q 402 -303 456 -303 q 286 -294 335 -303 q 184 -261 238 -286 l 202 -212 "},"{":{"x_min":116,"x_max":567.390625,"ha":683,"o":"m 491 909 q 421 874 445 909 q 397 792 397 839 l 397 744 l 397 583 q 368 434 397 493 q 263 354 339 376 q 367 272 338 332 q 397 125 397 212 l 397 -35 q 414 -149 397 -108 q 471 -197 431 -191 q 529 -204 511 -204 q 567 -204 548 -204 l 567 -276 q 387 -239 459 -276 q 315 -105 315 -203 l 315 -28 l 315 132 q 296 244 315 194 q 240 303 277 294 q 176 314 204 312 q 116 317 148 317 l 116 389 q 270 429 225 389 q 315 576 315 469 l 315 737 q 348 918 315 870 q 450 977 381 966 q 567 983 503 983 l 567 912 l 491 909 "},"X":{"x_min":0,"x_max":739,"ha":739,"o":"m 200 285 l 318 456 q 18 932 159 718 q 63 929 33 932 q 109 926 94 926 q 168 929 147 926 q 198 932 188 932 q 296 743 244 841 q 391 568 348 644 l 489 726 q 597 932 548 825 q 627 927 614 929 q 661 926 641 926 q 693 929 671 926 q 728 932 715 932 q 616 781 673 862 q 524 652 558 700 l 427 512 q 523 347 480 419 q 614 197 566 275 q 739 0 662 119 q 686 3 719 0 q 647 6 652 6 q 595 4 618 6 q 558 0 572 1 q 459 197 512 97 q 353 398 405 298 l 265 249 q 174 96 193 130 q 127 0 155 62 q 89 3 113 0 q 62 6 65 6 q 26 4 43 6 q 0 0 9 1 l 200 285 "},"ô":{"x_min":40,"x_max":712,"ha":753,"o":"m 371 -15 q 131 79 223 -15 q 40 322 40 173 q 133 572 40 473 q 380 672 227 672 q 621 575 530 672 q 712 327 712 479 q 619 80 712 175 q 371 -15 527 -15 m 332 978 l 421 978 l 572 743 l 525 743 l 376 875 l 229 743 l 180 743 l 332 978 m 377 622 q 227 532 274 622 q 180 327 180 442 q 227 125 180 216 q 375 35 274 35 q 524 124 478 35 q 570 327 570 214 q 524 531 570 441 q 377 622 479 622 "},"#":{"x_min":78,"x_max":972.4375,"ha":1050,"o":"m 497 647 l 675 647 l 791 969 l 877 968 l 761 647 l 972 647 l 948 576 l 736 576 l 671 390 l 896 390 l 873 319 l 644 319 l 531 0 l 446 0 l 559 319 l 382 319 l 266 0 l 182 0 l 294 319 l 78 319 l 102 390 l 320 390 l 386 576 l 151 576 l 176 647 l 410 647 l 526 969 l 610 969 l 497 647 m 472 576 l 407 390 l 587 390 l 650 576 l 472 576 "},"ι":{"x_min":96,"x_max":233.5,"ha":342,"o":"m 104 333 l 104 521 q 103 567 104 545 q 96 655 102 589 q 141 648 130 648 q 165 647 151 647 q 233 654 196 647 q 224 555 226 599 q 223 437 223 511 l 223 406 q 228 194 223 337 q 233 0 233 51 q 201 3 216 1 q 165 5 185 5 q 127 3 148 5 q 96 0 107 1 q 100 165 96 51 q 104 333 104 279 "},"Ά":{"x_min":12,"x_max":910.609375,"ha":896,"o":"m 328 639 l 458 950 q 489 944 464 947 q 522 950 507 944 q 655 613 602 745 q 770 331 709 480 q 910 0 832 181 q 859 3 891 0 q 823 6 827 6 q 772 4 795 6 q 735 0 749 1 q 672 195 692 135 q 613 353 652 255 l 449 358 l 285 353 l 233 205 q 173 0 194 94 l 116 5 q 76 2 91 5 q 55 0 62 0 q 146 211 101 105 q 229 404 192 317 q 328 639 266 490 m 195 943 q 228 974 213 964 q 265 985 244 985 q 302 969 287 985 q 318 932 318 954 q 303 896 318 911 q 261 866 288 882 l 61 743 l 12 743 l 195 943 m 450 419 l 585 425 l 451 761 l 318 425 l 450 419 "},")":{"x_min":65.671875,"x_max":332,"ha":449,"o":"m 332 376 q 271 81 332 217 q 96 -183 211 -54 q 65 -151 83 -164 q 193 104 155 -16 q 232 386 232 226 q 191 661 232 533 q 65 918 150 789 q 96 950 87 933 q 273 681 215 816 q 332 376 332 545 "},"ε":{"x_min":53,"x_max":567,"ha":628,"o":"m 506 516 q 433 591 467 566 q 353 616 400 616 q 261 580 298 616 q 225 492 225 545 q 268 406 225 437 q 372 375 311 375 l 418 375 l 417 349 l 417 310 l 343 317 q 236 282 280 317 q 193 183 193 247 q 238 77 193 117 q 352 38 284 38 q 460 66 410 38 q 543 144 510 94 q 553 99 547 121 q 567 54 558 76 q 452 2 515 19 q 321 -15 388 -15 q 134 31 216 -15 q 53 175 53 78 q 95 286 53 246 q 214 355 137 326 q 127 408 162 370 q 93 497 93 445 q 165 625 93 579 q 323 672 237 672 q 430 654 378 672 q 541 604 481 637 q 522 564 529 584 q 506 516 514 545 "},"Δ":{"x_min":0,"x_max":899,"ha":899,"o":"m 899 0 q 701 5 833 0 q 501 11 569 11 q 251 5 418 11 q 0 0 84 0 q 225 473 126 251 q 407 932 323 696 q 432 929 415 932 q 457 926 448 926 q 482 927 471 926 q 505 932 493 929 q 691 449 601 664 q 899 0 782 234 m 281 429 q 158 90 212 259 q 290 84 201 90 q 423 79 379 79 l 456 79 q 587 81 550 79 q 692 90 625 83 l 651 188 l 576 383 l 422 778 l 281 429 "},"â":{"x_min":43,"x_max":655.5,"ha":649,"o":"m 234 -15 q 98 33 153 -15 q 43 162 43 82 q 106 303 43 273 q 303 364 169 333 q 444 448 437 395 q 403 568 444 521 q 288 616 362 616 q 191 587 233 616 q 124 507 149 559 l 95 520 l 104 591 q 202 651 144 631 q 323 672 261 672 q 500 622 444 672 q 557 455 557 573 l 557 133 q 567 69 557 84 q 618 54 577 54 q 655 58 643 54 l 655 26 q 594 5 626 14 q 537 -6 562 -3 q 438 85 453 -6 q 342 10 388 35 q 234 -15 296 -15 m 279 978 l 368 978 l 522 743 l 471 743 l 323 875 l 176 743 l 126 743 l 279 978 m 176 186 q 204 98 176 133 q 284 64 232 64 q 390 107 342 64 q 438 212 438 151 l 438 345 q 239 293 303 319 q 176 186 176 268 "},"}":{"x_min":114,"x_max":567,"ha":683,"o":"m 369 576 q 405 438 369 487 q 527 389 441 389 l 567 389 l 567 317 q 415 278 461 317 q 369 132 369 239 l 369 -28 q 319 -229 369 -182 q 114 -276 270 -276 l 114 -204 q 252 -172 218 -204 q 286 -83 286 -141 l 286 -35 l 286 125 q 314 271 286 212 q 418 354 342 329 q 311 435 337 382 q 286 584 286 488 l 286 745 q 268 860 286 818 q 191 913 251 903 l 114 913 l 114 983 l 186 982 q 287 960 242 982 q 346 900 331 938 q 365 822 362 862 q 369 737 369 783 l 369 576 "},"‰":{"x_min":28,"x_max":1511,"ha":1536,"o":"m 799 0 q 647 62 708 0 q 586 218 586 124 q 647 372 586 309 q 799 436 709 436 q 949 373 888 436 q 1011 223 1011 311 q 995 130 1011 176 q 918 35 972 70 q 799 0 865 0 m 1298 0 q 1146 62 1206 0 q 1087 218 1087 124 q 1148 372 1087 308 q 1299 436 1209 436 q 1449 373 1388 436 q 1511 223 1511 311 q 1494 130 1511 169 q 1418 34 1472 69 q 1298 0 1365 0 m 241 448 q 89 510 150 448 q 28 663 28 573 q 89 820 28 755 q 241 885 151 885 q 391 823 329 885 q 453 672 453 761 q 434 580 453 620 q 359 483 412 518 q 241 448 307 448 m 863 1015 l 227 -125 l 158 -125 l 793 1015 l 863 1015 m 897 260 q 872 353 897 310 q 798 397 847 397 q 718 340 737 397 q 700 202 700 283 q 719 86 700 133 q 798 40 738 40 q 866 73 840 40 q 892 149 892 106 q 895 206 894 169 q 897 260 897 242 m 339 684 q 319 797 339 750 q 244 845 300 845 q 161 784 182 845 q 141 645 141 723 q 165 540 141 590 q 237 490 189 490 q 303 524 278 490 q 334 598 329 558 q 339 684 339 638 m 1397 260 q 1373 356 1397 315 q 1297 397 1349 397 q 1218 340 1237 397 q 1200 202 1200 283 q 1219 87 1200 134 q 1297 40 1238 40 q 1366 73 1340 40 q 1392 149 1392 106 q 1395 206 1394 169 q 1397 260 1397 242 "},"Ä":{"x_min":-16,"x_max":839.5625,"ha":826,"o":"m 258 638 l 389 951 q 420 945 395 948 q 453 951 438 945 q 570 651 500 826 q 688 360 640 477 q 839 0 736 242 q 788 3 820 0 q 752 6 756 6 q 702 3 728 6 q 665 0 675 0 q 599 204 615 158 q 542 357 584 251 l 378 357 l 214 357 l 161 207 q 130 109 147 170 q 102 0 113 47 l 45 5 q 20 4 29 5 q -16 0 10 4 q 72 203 29 105 q 169 427 115 301 q 258 638 222 552 m 293 1208 q 345 1186 325 1208 q 366 1133 366 1164 q 345 1080 366 1102 q 293 1058 324 1058 q 239 1080 261 1058 q 217 1133 217 1102 q 239 1185 217 1163 q 293 1208 261 1208 m 535 1208 q 587 1186 565 1208 q 609 1133 609 1164 q 587 1080 609 1103 q 535 1058 565 1058 q 481 1080 503 1058 q 459 1133 459 1102 q 481 1185 459 1163 q 535 1208 503 1208 m 378 421 l 515 425 l 381 762 l 247 425 l 378 421 "},"a":{"x_min":44,"x_max":653.734375,"ha":647,"o":"m 233 -15 q 99 33 154 -15 q 44 162 44 82 q 105 302 44 273 q 302 363 167 331 q 444 448 437 395 q 401 567 444 519 q 287 615 359 615 q 190 587 231 615 q 124 508 149 560 l 95 519 l 103 591 q 204 651 148 631 q 323 672 260 672 q 499 623 443 672 q 555 457 555 574 l 555 132 q 566 70 555 86 q 616 55 578 55 l 653 55 l 653 26 q 594 4 624 15 q 536 -6 564 -6 q 468 15 492 -6 q 436 83 445 38 q 341 9 387 34 q 233 -15 294 -15 m 175 185 q 204 99 175 135 q 282 63 234 63 q 389 106 343 63 q 436 211 436 150 l 436 344 q 239 294 304 320 q 175 185 175 268 "},"—":{"x_min":226.390625,"x_max":1138.890625,"ha":1367,"o":"m 226 375 l 1138 375 l 1138 292 l 226 292 l 226 375 "},"=":{"x_min":169.4375,"x_max":969.453125,"ha":1139,"o":"m 969 499 l 169 499 l 169 564 l 969 564 l 969 499 m 969 248 l 169 248 l 169 315 l 969 315 l 969 248 "},"N":{"x_min":98,"x_max":911.890625,"ha":1011,"o":"m 112 230 q 114 486 112 315 q 117 741 117 656 l 117 950 l 166 950 q 326 766 239 865 q 468 606 413 667 q 610 451 524 544 l 821 227 l 821 604 q 816 765 821 685 q 803 931 812 845 l 855 927 l 911 931 q 901 831 906 884 q 897 741 897 779 q 894 413 897 619 q 892 165 892 207 l 892 -15 l 849 -15 q 730 125 796 50 q 589 281 664 201 l 193 702 l 193 330 q 212 -1 193 169 l 149 2 l 98 -1 q 108 125 105 79 q 112 230 112 170 "},"ρ":{"x_min":65,"x_max":711,"ha":758,"o":"m 191 -99 q 195 -235 191 -145 q 199 -371 199 -325 q 161 -367 169 -367 q 134 -366 153 -366 q 96 -368 116 -366 q 65 -372 76 -370 q 70 -190 65 -311 q 76 -8 76 -69 q 73 166 76 67 q 70 329 71 265 q 148 578 70 484 q 380 672 226 672 q 617 573 524 672 q 711 329 711 474 q 625 84 711 184 q 396 -15 539 -15 q 285 7 334 -15 q 191 78 236 30 l 191 -99 m 377 619 q 231 533 271 619 q 191 327 191 447 q 241 103 191 169 q 376 38 292 38 q 525 125 479 38 q 571 326 571 212 q 525 529 571 440 q 377 619 480 619 "},"2":{"x_min":22,"x_max":622,"ha":749,"o":"m 449 648 q 410 789 449 727 q 298 851 371 851 q 173 802 219 851 q 128 676 128 753 l 118 673 q 84 740 100 712 q 47 799 69 768 q 313 911 158 911 q 507 844 426 911 q 589 667 589 777 q 527 479 589 555 q 315 258 466 404 l 169 118 l 442 118 q 531 123 485 118 q 622 136 576 129 q 617 102 619 117 q 616 68 616 87 q 617 37 616 54 q 622 0 619 20 q 438 4 562 0 q 252 8 315 8 q 142 7 195 8 q 22 0 88 6 l 22 40 q 234 238 155 158 q 380 430 312 319 q 449 648 449 541 "},"ü":{"x_min":90,"x_max":664,"ha":754,"o":"m 653 498 q 653 329 653 443 q 653 158 653 215 q 664 0 653 82 q 631 3 647 1 q 598 5 616 5 q 563 3 583 5 q 533 0 544 1 l 538 118 q 440 18 494 52 q 312 -15 385 -15 q 148 50 201 -15 q 96 229 96 115 l 96 354 l 96 516 l 90 655 q 120 650 103 651 q 158 648 136 648 q 192 650 175 648 q 227 656 210 651 q 220 446 227 592 q 213 247 213 300 q 247 115 213 163 q 362 68 281 68 q 477 113 428 68 q 531 217 525 159 q 538 340 538 274 q 533 520 538 394 q 528 655 528 647 q 558 650 542 651 q 596 648 574 648 q 629 650 612 648 q 663 656 646 651 q 653 498 653 574 m 253 929 q 307 906 285 929 q 330 854 330 884 q 309 800 330 822 q 257 778 288 778 q 202 800 225 778 q 180 854 180 823 q 200 906 180 884 q 253 929 221 929 m 498 929 q 549 906 527 929 q 572 854 572 884 q 551 799 572 820 q 499 778 531 778 q 444 800 466 778 q 422 854 422 822 q 444 906 422 884 q 498 929 466 929 "},"Z":{"x_min":6.9375,"x_max":801.390625,"ha":828,"o":"m 6 36 q 222 324 112 176 q 425 605 333 473 l 597 857 l 433 857 q 59 836 247 857 l 65 883 l 59 932 q 262 927 134 932 q 427 922 390 922 q 622 927 491 922 q 801 932 754 932 l 801 904 q 594 629 709 785 q 399 361 479 473 q 201 77 319 249 l 427 77 q 581 82 520 77 q 801 103 643 87 l 797 68 l 795 54 l 797 34 l 801 0 q 504 4 683 0 q 325 8 326 8 q 166 4 272 8 q 6 0 61 0 l 6 36 "},"u":{"x_min":90,"x_max":662.21875,"ha":754,"o":"m 653 497 l 653 156 q 654 83 653 122 q 661 -1 656 44 q 623 3 632 2 q 596 4 615 4 q 572 3 581 4 q 533 -1 563 2 l 536 117 q 439 18 491 51 q 313 -15 386 -15 q 147 48 199 -15 q 96 227 96 112 l 96 352 l 96 516 l 90 654 q 158 647 125 647 q 189 648 178 647 q 226 654 200 650 q 220 450 226 586 q 215 246 215 314 q 248 114 215 163 q 361 66 281 66 q 473 112 426 66 q 527 225 520 158 q 536 340 536 282 q 531 497 536 393 q 527 654 527 601 q 572 647 563 647 q 595 647 581 647 q 626 648 616 647 q 662 654 637 650 l 653 497 "},"k":{"x_min":97,"x_max":677.5625,"ha":683,"o":"m 104 656 q 100 873 104 741 q 97 1025 97 1005 q 164 1018 134 1018 q 231 1025 196 1018 q 227 825 231 962 q 223 622 223 687 l 223 377 l 245 377 q 507 654 391 506 q 563 647 538 647 q 616 647 589 647 q 648 652 638 651 l 349 398 l 548 165 q 608 93 577 127 q 677 19 638 59 l 677 0 q 628 3 659 0 q 591 6 597 6 q 544 3 567 6 q 510 0 520 0 q 438 101 473 54 q 360 197 402 148 l 269 308 l 252 324 l 223 326 q 227 164 223 272 q 231 0 231 55 q 200 4 215 2 q 164 5 185 5 q 127 3 146 5 q 97 0 108 1 q 100 386 97 151 q 104 656 104 620 "},"Η":{"x_min":109,"x_max":928.453125,"ha":1039,"o":"m 257 317 q 262 142 257 253 q 267 0 267 30 q 226 3 253 0 q 188 8 200 8 q 147 3 174 8 q 109 0 121 0 q 116 243 109 72 q 124 465 124 415 q 116 710 124 540 q 109 932 109 880 q 152 929 121 932 q 188 926 183 926 q 231 929 200 926 q 267 932 262 932 q 262 719 267 854 q 257 547 257 584 q 406 544 301 547 q 517 541 511 541 q 666 544 562 541 q 777 547 770 547 q 773 786 777 641 q 769 932 769 930 q 813 929 781 932 q 849 926 845 926 q 893 929 861 926 q 928 932 924 932 q 914 795 920 866 q 909 659 909 723 l 909 505 q 918 252 909 420 q 927 0 927 84 q 887 4 913 0 q 848 8 861 8 q 811 5 829 8 q 769 0 793 2 q 773 103 769 41 q 777 176 777 166 l 777 317 l 777 465 q 604 466 692 465 q 430 469 517 467 l 257 465 l 257 317 "},"Α":{"x_min":-15.28125,"x_max":838.890625,"ha":825,"o":"m 257 639 l 387 950 q 402 945 395 947 q 417 944 409 944 q 452 950 437 944 q 576 629 536 733 q 686 359 617 526 q 838 0 755 192 q 789 3 820 0 q 751 6 758 6 q 700 4 723 6 q 663 0 677 1 q 600 199 622 137 q 543 353 579 260 l 377 358 l 215 353 l 162 205 q 130 110 145 160 q 101 0 115 59 l 44 5 q 6 2 20 5 q -15 0 -8 0 q 76 211 30 105 q 158 404 121 318 q 257 639 195 490 m 378 419 l 513 425 l 379 761 l 246 425 l 378 419 "},"ß":{"x_min":94,"x_max":726,"ha":765,"o":"m 107 431 l 107 611 l 107 761 q 200 948 118 872 q 395 1025 283 1025 q 543 979 478 1025 q 608 852 608 933 q 530 709 608 783 q 453 586 453 636 q 589 457 453 547 q 726 259 726 368 q 648 64 726 143 q 453 -15 570 -15 q 379 -6 418 -15 q 309 15 339 1 l 334 128 l 348 127 q 405 70 368 91 q 485 49 442 49 q 583 92 544 49 q 622 193 622 135 q 484 365 622 280 q 347 525 347 450 q 433 667 347 561 q 520 838 520 773 q 483 939 520 899 q 386 979 446 979 q 269 924 313 979 q 226 795 226 870 l 226 629 l 226 344 q 229 141 226 265 q 233 1 233 18 q 196 4 219 1 q 166 8 173 8 q 123 5 142 8 q 94 1 105 2 q 100 250 94 91 q 107 431 107 409 "},"é":{"x_min":40,"x_max":646.9375,"ha":681,"o":"m 406 42 q 602 130 523 42 l 621 130 q 613 93 617 112 q 609 47 609 73 q 496 0 558 14 q 369 -15 435 -15 q 130 73 220 -15 q 40 311 40 162 q 126 562 40 456 q 355 669 212 669 q 564 590 481 669 q 646 386 646 512 l 644 331 q 438 333 562 331 q 313 335 315 335 l 179 331 q 235 127 179 212 q 406 42 291 42 m 406 945 q 440 976 424 966 q 477 986 455 986 q 528 934 528 986 q 513 895 528 912 q 471 866 498 879 l 272 743 l 222 743 l 406 945 m 513 392 l 513 437 q 470 563 513 509 q 356 618 427 618 q 233 552 271 618 q 183 390 195 487 l 513 392 "},"s":{"x_min":68,"x_max":531,"ha":593,"o":"m 117 161 q 172 69 130 102 q 276 36 214 36 q 378 67 333 36 q 424 152 424 98 q 334 260 424 224 q 168 320 251 290 q 79 460 79 366 q 147 612 79 552 q 310 672 216 672 q 400 660 355 672 q 500 627 446 649 l 461 508 l 448 508 q 401 587 433 561 q 314 614 369 614 q 223 584 262 614 q 185 505 185 555 q 358 375 185 427 q 531 197 531 322 q 450 39 531 93 q 259 -15 369 -15 q 68 23 162 -15 l 103 161 l 117 161 "},"B":{"x_min":109,"x_max":751,"ha":801,"o":"m 127 559 q 109 931 127 759 l 203 929 q 338 932 244 929 q 438 935 432 935 q 629 883 549 935 q 709 726 709 832 q 638 579 709 633 q 464 504 567 524 q 673 438 595 490 q 751 268 751 387 q 639 66 751 133 q 382 0 528 0 l 232 6 q 162 3 211 6 q 109 0 113 0 q 118 287 109 86 q 127 559 127 488 m 256 257 l 256 149 l 261 61 l 337 57 q 526 108 450 57 q 602 266 602 159 q 523 428 602 386 q 312 471 444 471 l 256 471 l 256 257 m 569 706 q 507 834 569 788 q 361 879 446 879 l 261 875 q 252 709 252 798 l 252 522 q 476 558 384 522 q 569 706 569 595 "},"…":{"x_min":119,"x_max":1005,"ha":1160,"o":"m 191 130 q 244 108 223 130 q 266 55 266 87 q 244 5 266 25 q 191 -15 223 -15 q 139 4 160 -15 q 119 55 119 23 q 139 108 119 87 q 191 130 159 130 m 560 130 q 612 108 591 130 q 634 55 634 87 q 612 5 634 25 q 560 -15 591 -15 q 507 4 528 -15 q 487 55 487 23 q 507 109 487 88 q 560 130 528 130 m 930 130 q 983 108 962 130 q 1005 55 1005 87 q 983 5 1005 25 q 930 -15 962 -15 q 878 4 899 -15 q 858 55 858 23 q 878 108 858 87 q 930 130 898 130 "},"?":{"x_min":128,"x_max":520,"ha":601,"o":"m 307 156 q 367 130 342 156 q 392 68 392 105 q 367 7 392 30 q 307 -15 343 -15 q 244 8 269 -15 q 220 68 220 32 q 244 130 220 105 q 307 156 269 156 m 329 250 q 214 290 261 250 q 168 399 168 331 q 287 595 168 479 q 406 776 406 712 q 371 858 406 823 q 292 894 337 894 q 207 867 243 894 q 162 794 171 840 l 150 794 q 142 835 146 822 q 128 894 139 849 q 210 936 165 922 q 305 950 255 950 q 457 893 394 950 q 520 748 520 837 q 398 550 520 657 q 276 370 276 443 q 293 316 276 337 q 343 296 310 296 q 397 302 372 296 l 383 256 q 357 251 365 252 q 329 250 348 250 "},"H":{"x_min":108,"x_max":927.453125,"ha":1036,"o":"m 258 318 q 263 143 258 255 q 268 0 268 30 q 229 3 255 0 q 188 8 202 8 q 148 3 174 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 711 126 620 q 108 932 119 803 q 153 928 124 932 q 188 925 183 925 q 231 928 204 925 q 268 932 259 932 q 263 719 268 854 q 258 547 258 584 l 517 543 l 777 547 q 773 786 777 641 q 769 932 769 930 q 814 928 785 932 q 848 925 842 925 q 894 928 864 925 q 927 932 923 932 q 914 798 919 868 q 909 659 909 729 l 909 448 l 909 283 q 916 135 909 238 q 924 0 924 31 q 885 4 911 0 q 846 8 860 8 q 807 4 832 8 q 769 0 781 0 q 773 101 769 37 q 777 177 777 164 l 777 318 l 777 468 q 604 468 720 468 q 431 468 489 468 l 258 468 l 258 318 "},"ν":{"x_min":0,"x_max":632,"ha":654,"o":"m 319 8 q 296 5 309 8 q 272 0 283 2 q 200 206 234 120 q 0 654 165 291 q 84 647 45 647 q 113 647 98 647 q 168 654 127 648 q 252 402 204 529 l 360 131 q 469 358 440 267 q 499 520 499 448 q 492 579 499 543 q 477 641 486 615 q 552 649 527 645 q 613 661 576 652 q 628 611 625 623 q 632 576 632 598 q 621 501 632 536 q 560 373 611 466 q 461 190 509 280 q 372 0 412 99 q 345 3 363 0 q 319 8 327 8 "},"î":{"x_min":-25,"x_max":365.328125,"ha":340,"o":"m 104 144 l 104 522 l 97 655 q 138 650 113 651 q 167 649 162 649 q 233 655 206 649 q 225 506 225 581 q 229 254 225 423 q 233 0 233 84 q 201 3 216 1 q 164 5 186 5 q 127 3 146 5 q 97 0 108 1 l 104 144 m 125 978 l 214 978 l 365 743 l 319 743 l 170 875 l 24 743 l -25 743 l 125 978 "},"c":{"x_min":36,"x_max":613.78125,"ha":644,"o":"m 606 119 l 594 41 q 493 -3 548 7 q 365 -15 438 -15 q 131 79 227 -15 q 36 312 36 173 q 134 576 36 480 q 399 672 233 672 q 513 658 459 672 q 613 616 566 645 q 586 492 597 563 l 571 492 q 510 586 550 553 q 406 619 470 619 q 235 532 294 619 q 176 327 176 445 q 237 125 176 209 q 415 42 299 42 q 594 122 520 42 l 606 119 "},"¶":{"x_min":18,"x_max":531,"ha":590,"o":"m 298 968 l 531 968 l 531 910 l 473 910 l 473 4 l 415 4 l 415 910 l 305 910 l 305 4 l 247 4 l 247 558 q 99 602 163 558 q 27 690 36 645 q 18 744 18 734 q 90 896 18 824 q 298 968 163 968 "},"β":{"x_min":96,"x_max":737.671875,"ha":779,"o":"m 160 -365 q 129 -367 151 -365 q 96 -369 107 -369 q 100 -253 96 -325 q 104 -169 104 -182 l 104 101 l 104 565 q 168 898 104 771 q 419 1025 232 1025 q 605 960 525 1025 q 686 787 686 895 q 641 641 686 705 q 522 548 597 577 q 682 454 626 515 q 737 290 737 394 q 648 73 737 162 q 431 -15 559 -15 q 324 3 372 -15 q 226 61 276 22 q 224 -44 226 19 q 223 -110 223 -107 l 230 -369 q 193 -367 220 -369 q 160 -365 166 -365 m 356 564 q 507 618 458 564 q 557 779 557 673 q 520 917 557 859 q 407 975 483 975 q 279 906 323 975 q 234 752 234 838 q 232 613 234 701 q 230 506 230 524 l 226 355 l 230 230 q 275 94 230 147 q 406 41 321 41 q 552 116 504 41 q 600 297 600 192 q 550 443 600 386 q 412 499 500 499 q 361 497 384 499 q 327 493 337 494 l 329 516 l 329 565 l 356 564 "},"Μ":{"x_min":55,"x_max":1165,"ha":1238,"o":"m 190 950 l 243 950 q 331 772 291 851 q 412 612 370 693 q 504 436 454 532 l 626 214 q 742 435 671 298 q 882 711 813 572 q 1001 950 952 850 l 1052 950 q 1082 649 1067 791 q 1118 341 1098 508 q 1165 0 1139 174 q 1121 8 1139 5 q 1088 11 1103 11 q 1049 6 1071 11 q 1008 0 1027 2 q 998 226 1008 109 q 974 461 989 343 q 944 695 959 579 l 748 312 q 610 0 665 152 l 594 1 l 576 0 q 227 685 402 364 l 188 307 q 172 128 175 179 q 168 0 168 77 q 138 4 157 1 q 110 6 118 6 q 81 4 93 6 q 55 0 68 2 q 121 333 89 168 q 171 652 152 498 q 190 950 190 805 "},"Ό":{"x_min":-1,"x_max":1305,"ha":1356,"o":"m 288 465 q 429 820 288 690 q 796 950 570 950 q 1129 853 991 950 q 1284 654 1268 757 q 1302 525 1299 551 q 1305 462 1305 500 q 1302 402 1305 426 q 1284 277 1299 379 q 1131 80 1268 175 q 797 -15 993 -15 q 684 -10 733 -15 q 541 29 635 -5 q 367 186 447 64 q 288 465 288 308 m 182 943 q 215 974 200 964 q 251 985 230 985 q 289 969 274 985 q 304 932 304 954 q 290 896 304 911 q 247 866 275 882 l 48 743 l -1 743 l 182 943 m 439 468 q 527 162 439 282 q 796 42 616 42 q 1063 162 975 42 q 1152 468 1152 283 q 1062 770 1152 651 q 796 889 972 889 q 585 826 666 889 q 462 639 504 764 q 439 468 439 552 "},"Ή":{"x_min":-1.390625,"x_max":1233.046875,"ha":1341,"o":"m 564 316 q 569 142 564 254 q 574 0 574 30 q 535 4 561 0 q 494 8 508 8 q 454 4 480 8 q 414 0 427 0 q 423 239 414 70 q 432 465 432 408 q 428 711 432 620 q 414 931 425 802 q 459 928 430 931 q 494 924 489 924 q 537 928 510 924 q 574 931 565 931 q 569 719 574 854 q 564 547 564 584 l 823 543 l 1083 547 q 1078 786 1083 641 q 1074 931 1074 930 q 1119 928 1091 931 q 1153 924 1148 924 q 1199 928 1170 924 q 1233 931 1228 931 q 1221 798 1226 868 q 1217 659 1217 729 l 1215 448 l 1217 283 q 1225 135 1217 238 q 1233 0 1233 31 q 1194 4 1220 0 q 1154 8 1167 8 q 1113 4 1140 8 q 1075 0 1087 0 q 1078 100 1075 37 q 1082 176 1082 163 l 1083 316 l 1083 465 q 910 466 1026 465 q 737 468 795 468 l 564 465 l 564 316 m 181 943 q 215 974 200 964 q 251 985 230 985 q 288 969 273 985 q 304 932 304 954 q 289 896 304 911 q 247 866 275 882 l 47 743 l -1 743 l 181 943 "},"•":{"x_min":204.171875,"x_max":795.828125,"ha":1003,"o":"m 501 789 q 709 702 622 789 q 795 493 795 615 q 709 286 795 372 q 501 201 623 201 q 290 286 377 201 q 204 493 204 371 q 226 605 204 550 q 312 725 248 661 q 501 789 376 789 "},"¥":{"x_min":32,"x_max":699,"ha":750,"o":"m 313 278 q 176 273 268 278 q 50 268 83 268 l 50 335 q 147 332 82 335 q 246 329 213 329 l 313 329 l 313 436 l 176 436 l 50 432 l 50 495 q 182 492 90 495 q 281 490 275 490 l 126 743 l 32 888 l 91 883 l 191 887 q 225 814 208 845 q 287 699 241 783 l 397 512 q 477 653 433 570 q 592 887 521 736 l 643 883 l 699 887 l 625 773 l 554 655 l 454 490 q 593 492 496 490 q 697 495 690 495 l 697 431 l 434 436 l 434 330 l 572 329 q 636 332 595 329 q 697 335 678 335 l 697 268 l 568 278 l 434 278 q 434 143 434 208 q 442 0 435 77 l 365 5 l 299 0 q 310 131 307 54 q 313 278 313 208 "},"(":{"x_min":114,"x_max":380.5625,"ha":449,"o":"m 114 388 q 175 684 114 545 q 351 950 237 822 q 380 918 361 933 q 253 660 291 782 q 215 379 215 538 q 256 103 215 231 q 380 -151 297 -25 q 351 -183 361 -167 q 173 84 232 -50 q 114 388 114 219 "},"U":{"x_min":101,"x_max":919.0625,"ha":1015,"o":"m 181 926 q 228 929 195 926 q 263 932 262 932 q 251 804 255 853 q 248 697 248 755 l 248 457 q 315 134 248 212 q 515 57 382 57 q 733 129 654 57 q 813 334 813 201 l 813 458 l 813 655 q 810 797 813 733 q 798 931 807 862 q 827 927 813 929 q 859 926 841 926 q 888 929 868 926 q 919 932 907 932 q 905 779 909 853 q 902 600 902 705 l 902 366 q 793 81 902 178 q 492 -15 685 -15 q 211 66 307 -15 q 116 323 116 147 l 116 425 l 116 698 q 109 826 116 759 q 101 931 103 893 q 138 927 120 929 q 181 926 156 926 "},"γ":{"x_min":-12,"x_max":701,"ha":681,"o":"m 642 647 q 701 654 669 647 q 593 440 633 520 q 502 247 553 359 l 411 48 l 411 -90 q 415 -238 411 -138 q 419 -372 419 -337 l 372 -366 q 282 -372 325 -366 q 287 -195 282 -313 q 292 -33 292 -76 q 260 192 292 47 q 170 460 229 338 q 39 583 111 583 l -12 579 l -10 608 l -12 638 q 43 662 14 653 q 101 672 71 672 q 279 554 234 672 q 398 143 324 437 q 496 393 439 244 q 590 654 553 541 q 615 648 607 650 q 642 647 623 647 "},"α":{"x_min":41,"x_max":827.109375,"ha":846,"o":"m 705 352 q 803 -1 763 155 l 739 1 l 673 -1 l 632 172 q 521 36 593 87 q 356 -15 448 -15 q 129 81 217 -15 q 41 316 41 177 q 130 569 41 467 q 368 672 220 672 q 537 622 464 672 q 659 486 610 573 q 711 654 691 569 l 770 650 l 827 654 q 763 505 792 576 q 705 352 734 434 m 377 619 q 226 530 272 619 q 181 326 181 442 q 223 124 181 214 q 367 34 265 34 q 528 137 480 34 q 601 323 577 240 q 527 531 578 444 q 377 619 475 619 "},"F":{"x_min":108,"x_max":613.5625,"ha":671,"o":"m 258 316 q 263 142 258 254 q 268 0 268 30 q 229 3 255 0 q 188 8 202 8 q 148 3 174 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 711 126 620 q 108 932 119 802 l 358 928 l 613 931 l 610 886 l 613 836 q 505 855 549 851 q 388 860 460 860 l 260 860 l 258 671 l 258 528 l 398 528 q 587 541 480 528 l 584 497 l 587 451 l 394 463 l 258 463 l 258 316 "},"­":{"x_min":0,"x_max":683.328125,"ha":683,"o":"m 0 374 l 683 374 l 683 289 l 0 289 l 0 374 "},":":{"x_min":134,"x_max":309,"ha":446,"o":"m 222 636 q 284 611 259 636 q 309 548 309 586 q 284 486 309 512 q 222 461 260 461 q 160 486 186 461 q 134 548 134 511 q 159 610 134 584 q 222 636 185 636 m 221 156 q 283 131 257 156 q 309 69 309 107 q 284 8 309 32 q 221 -15 259 -15 q 159 9 185 -15 q 134 69 134 33 q 159 131 134 107 q 221 156 185 156 "},"Χ":{"x_min":0,"x_max":739,"ha":739,"o":"m 200 285 l 318 456 q 18 932 159 718 q 63 929 33 932 q 109 926 94 926 q 168 929 147 926 q 198 932 188 932 q 296 743 244 841 q 391 568 348 644 l 489 726 q 597 932 548 825 q 627 927 614 929 q 661 926 641 926 q 693 929 671 926 q 728 932 715 932 q 616 781 673 862 q 524 652 558 700 l 427 512 q 523 347 480 419 q 614 197 566 275 q 739 0 662 119 q 686 3 719 0 q 647 6 652 6 q 595 4 618 6 q 558 0 572 1 q 459 197 512 97 q 353 398 405 298 l 265 249 q 174 96 193 130 q 127 0 155 62 q 89 3 113 0 q 62 6 65 6 q 26 4 43 6 q 0 0 9 1 l 200 285 "},"*":{"x_min":94,"x_max":580,"ha":675,"o":"m 336 940 q 367 944 349 940 q 389 948 385 948 q 368 850 375 902 q 362 747 362 799 q 522 873 442 800 q 548 812 539 829 q 580 778 556 796 q 386 702 485 750 q 476 661 427 680 q 575 629 524 643 q 521 535 539 587 q 441 604 478 573 q 362 661 403 634 q 369 564 362 615 q 391 459 377 513 q 360 463 379 459 q 336 467 340 467 q 306 463 325 467 q 282 459 288 459 q 304 568 296 522 q 313 661 313 615 q 152 535 221 602 q 128 589 138 569 q 97 630 117 608 q 185 661 140 643 q 287 704 231 679 q 189 746 234 728 q 94 777 145 763 q 125 818 113 795 q 150 873 137 841 q 227 805 184 839 q 313 747 269 771 q 309 810 313 784 q 282 950 305 836 q 310 942 297 945 q 336 940 324 940 "},"°":{"x_min":176,"x_max":508,"ha":683,"o":"m 176 889 q 228 1010 176 961 q 355 1060 280 1060 q 460 1011 413 1060 q 508 904 508 962 q 455 785 508 839 q 337 731 402 731 q 222 776 269 731 q 176 889 176 821 m 241 880 q 266 805 241 836 q 336 775 292 775 q 413 811 386 775 q 441 899 441 847 q 417 985 441 952 q 343 1018 393 1018 q 281 995 307 1018 q 247 940 254 973 q 241 880 241 906 "},"V":{"x_min":0,"x_max":852.78125,"ha":853,"o":"m 190 477 l 74 759 l 0 932 l 83 926 q 134 929 98 926 q 173 931 170 931 q 206 829 187 884 q 248 704 224 773 l 308 548 l 454 153 l 586 502 q 729 931 666 713 l 790 927 l 852 931 q 643 467 748 720 q 470 0 538 215 q 445 4 457 1 q 418 6 432 6 q 384 3 399 6 q 366 0 368 0 q 279 256 331 123 q 190 477 226 389 "},"Ξ":{"x_min":58.328125,"x_max":818.0625,"ha":878,"o":"m 437 821 q 258 817 377 821 q 77 813 138 813 q 84 851 83 838 q 84 872 84 864 q 77 932 84 900 q 256 928 137 932 q 437 924 376 924 q 618 928 497 924 q 797 932 738 932 l 791 872 q 794 842 791 861 q 797 813 797 822 q 619 817 738 813 q 437 821 500 821 m 470 430 q 335 425 440 430 q 183 421 230 421 q 187 456 186 433 q 188 481 188 480 q 183 543 188 515 q 304 538 215 543 q 437 533 394 533 q 572 538 481 533 q 694 543 662 543 l 687 482 l 694 421 q 572 425 650 421 q 470 430 494 430 m 437 8 q 250 4 376 8 q 58 0 123 0 l 63 63 l 58 129 q 268 124 134 129 q 437 119 401 119 q 636 124 502 119 q 818 129 769 129 l 813 63 l 818 0 q 627 4 754 0 q 437 8 501 8 "}," ":{"x_min":0,"x_max":0,"ha":375},"Ϋ":{"x_min":-26,"x_max":746,"ha":708,"o":"m 299 177 l 299 387 q 190 577 235 501 q 87 747 146 652 q -26 931 29 841 q 23 929 -13 931 q 65 926 61 926 q 110 929 78 926 q 146 931 143 931 q 208 800 175 866 q 278 676 241 734 l 391 475 q 627 931 519 693 l 683 927 q 721 929 701 927 q 746 931 741 931 q 652 786 702 866 q 557 627 602 705 l 432 415 l 432 241 q 435 97 432 184 q 439 0 439 10 q 395 4 414 2 q 361 6 376 6 q 320 4 336 6 q 286 0 304 2 q 294 88 290 36 q 299 177 299 141 m 233 1208 q 286 1187 265 1208 q 307 1133 307 1166 q 285 1080 307 1103 q 233 1058 263 1058 q 179 1080 202 1058 q 157 1133 157 1103 q 179 1186 157 1164 q 233 1208 202 1208 m 475 1208 q 528 1186 506 1208 q 550 1133 550 1164 q 528 1080 550 1103 q 475 1058 506 1058 q 422 1080 444 1058 q 400 1133 400 1102 q 421 1186 400 1164 q 475 1208 443 1208 "},"0":{"x_min":48,"x_max":699,"ha":749,"o":"m 372 909 q 621 773 544 909 q 699 451 699 637 q 627 116 699 252 q 372 -19 556 -19 q 120 114 193 -19 q 48 444 48 247 q 120 774 48 639 q 372 909 193 909 m 187 365 q 226 137 187 238 q 373 37 266 37 q 457 62 421 37 q 519 142 494 88 q 552 271 545 196 q 559 455 559 346 q 526 736 559 622 q 371 851 493 851 q 245 783 280 851 q 198 647 210 716 q 187 444 187 577 l 187 365 "},"”":{"x_min":104.171875,"x_max":570.828125,"ha":625,"o":"m 184 858 q 211 924 193 898 q 265 951 230 951 q 320 903 316 951 q 310 856 320 881 q 283 812 300 831 l 136 568 l 104 576 l 184 858 m 433 858 q 468 928 452 905 q 516 951 483 951 q 555 938 540 951 q 570 903 570 926 q 561 859 570 881 q 536 812 552 837 l 387 568 l 355 576 l 433 858 "},"@":{"x_min":78,"x_max":1289,"ha":1367,"o":"m 906 640 l 970 640 l 876 266 l 864 203 q 886 157 864 172 q 940 142 908 142 q 1136 262 1062 142 q 1211 513 1211 383 q 1067 801 1211 693 q 735 909 923 909 q 324 753 495 909 q 154 362 154 598 q 301 1 154 135 q 679 -132 448 -132 q 904 -99 791 -132 q 1105 -6 1016 -67 l 1129 -43 q 923 -150 1033 -113 q 694 -188 812 -188 q 258 -43 439 -188 q 78 350 78 100 q 273 791 78 614 q 737 969 469 969 q 1122 843 955 969 q 1289 507 1289 717 q 1187 214 1289 346 q 930 82 1086 82 q 835 103 879 82 q 792 170 792 124 l 792 203 q 709 116 762 150 q 595 82 655 82 q 439 139 493 82 q 386 302 386 197 q 471 553 386 441 q 692 665 556 665 q 797 639 754 665 q 864 556 840 613 l 906 640 m 849 477 q 796 572 835 535 q 701 609 758 609 q 529 511 592 609 q 467 297 467 413 q 503 184 467 230 q 605 139 540 139 q 733 188 679 139 q 807 313 787 238 l 849 477 "},"Ί":{"x_min":-1.390625,"x_max":580.0625,"ha":690,"o":"m 433 465 q 429 711 433 620 q 414 931 426 802 q 461 927 435 929 q 498 925 487 925 q 546 928 517 925 q 580 931 575 931 q 572 788 580 887 q 564 659 564 690 l 562 448 l 564 283 q 572 135 564 238 q 580 0 580 31 q 539 4 567 0 q 498 8 512 8 q 457 5 480 8 q 414 0 435 2 q 423 239 414 70 q 433 465 433 408 m 181 943 q 215 974 200 964 q 251 985 230 985 q 288 969 273 985 q 304 932 304 954 q 289 896 304 911 q 247 866 275 882 l 47 743 l -1 743 l 181 943 "},"ö":{"x_min":40,"x_max":712,"ha":753,"o":"m 371 -15 q 131 79 223 -15 q 40 322 40 173 q 133 572 40 473 q 380 672 227 672 q 621 575 530 672 q 712 327 712 479 q 619 80 712 175 q 371 -15 527 -15 m 253 929 q 307 906 285 929 q 330 854 330 884 q 309 800 330 822 q 257 778 288 778 q 202 800 225 778 q 180 854 180 823 q 200 906 180 884 q 253 929 221 929 m 498 929 q 549 906 527 929 q 572 854 572 884 q 551 799 572 820 q 499 778 531 778 q 444 800 466 778 q 422 854 422 822 q 444 906 422 884 q 498 929 466 929 m 377 622 q 227 532 274 622 q 180 327 180 442 q 227 125 180 216 q 375 35 274 35 q 524 124 478 35 q 570 327 570 214 q 524 531 570 441 q 377 622 479 622 "},"i":{"x_min":91.765625,"x_max":244,"ha":342,"o":"m 100 144 l 100 520 l 93 654 q 161 648 130 648 q 194 649 182 648 q 229 654 207 650 q 221 579 224 616 q 219 505 219 543 q 224 240 219 417 q 229 0 229 63 q 197 3 212 1 q 161 5 181 5 q 116 2 131 5 q 91 0 100 0 l 100 144 m 168 963 q 223 940 202 963 q 244 881 244 917 q 222 831 244 849 q 168 813 200 813 q 115 833 137 813 q 93 885 93 853 q 113 941 93 919 q 168 963 134 963 "},"Β":{"x_min":109,"x_max":751,"ha":801,"o":"m 127 559 q 109 931 127 759 l 203 929 q 338 932 244 929 q 438 935 432 935 q 629 883 549 935 q 709 726 709 832 q 638 579 709 633 q 464 504 567 524 q 673 438 595 490 q 751 268 751 387 q 639 66 751 133 q 382 0 528 0 l 232 6 q 162 3 211 6 q 109 0 113 0 q 118 287 109 86 q 127 559 127 488 m 256 257 l 256 149 l 261 61 l 337 57 q 526 108 450 57 q 602 266 602 159 q 523 428 602 386 q 312 471 444 471 l 256 471 l 256 257 m 569 706 q 507 834 569 788 q 361 879 446 879 l 261 875 q 252 709 252 798 l 252 522 q 476 558 384 522 q 569 706 569 595 "},"≤":{"x_min":176,"x_max":962.703125,"ha":1139,"o":"m 288 491 l 962 266 l 962 196 l 176 462 l 176 521 l 962 788 l 962 718 l 288 491 m 962 26 l 176 26 l 176 93 l 962 93 l 962 26 "},"υ":{"x_min":79,"x_max":703,"ha":774,"o":"m 703 397 q 596 110 703 236 q 332 -15 489 -15 q 145 54 211 -15 q 79 244 79 123 l 83 430 q 81 542 83 486 q 79 654 80 598 l 146 650 l 217 654 q 209 503 217 608 q 202 366 202 398 l 202 261 q 240 105 202 168 q 369 43 279 43 q 523 133 476 43 q 571 341 571 223 q 548 493 571 418 q 488 645 526 568 q 550 648 529 645 q 627 659 571 650 q 703 397 703 538 "},"]":{"x_min":83,"x_max":332,"ha":449,"o":"m 209 -154 l 83 -158 l 85 -129 l 85 -98 q 183 -104 128 -104 l 229 -104 l 232 386 l 232 880 l 185 880 q 134 877 162 880 q 83 872 107 874 l 85 903 l 85 932 l 205 929 l 332 929 q 326 852 332 909 q 321 766 321 794 l 321 455 l 321 2 l 332 -158 l 209 -154 "},"m":{"x_min":91,"x_max":1075,"ha":1167,"o":"m 101 155 l 101 494 q 98 568 101 529 q 91 654 96 606 q 155 647 123 647 l 221 654 l 216 537 q 317 638 261 604 q 450 672 373 672 q 629 547 581 672 q 733 639 677 606 q 860 672 789 672 q 1018 606 968 672 q 1069 429 1069 540 l 1069 298 l 1069 136 l 1075 0 q 1038 3 1063 0 q 1006 6 1013 6 q 968 3 992 6 q 938 0 943 0 q 944 203 938 68 q 950 406 950 338 q 918 536 950 486 q 810 587 887 587 q 699 540 745 587 q 648 452 653 493 q 642 376 643 410 q 641 326 641 342 l 641 314 q 644 132 641 258 q 647 0 647 6 q 607 4 621 2 q 581 5 593 5 q 542 2 570 5 q 514 0 515 0 q 519 168 514 55 q 524 321 524 280 l 524 406 q 490 534 524 482 q 383 587 457 587 q 273 541 314 587 q 223 436 231 496 q 216 314 216 376 q 219 133 216 244 q 222 0 222 22 q 183 3 207 0 q 154 6 159 6 q 117 4 134 6 q 91 0 100 1 l 101 155 "},"χ":{"x_min":-1,"x_max":725.390625,"ha":713,"o":"m 500 426 q 554 536 528 476 q 607 654 580 595 l 675 650 l 725 652 q 623 507 672 586 q 519 330 573 427 l 444 197 q 575 -85 507 55 q 719 -371 643 -227 q 665 -371 701 -371 q 611 -371 629 -371 l 560 -371 q 444 -115 497 -230 q 358 72 392 -1 l 255 -95 q 178 -237 208 -174 q 125 -371 147 -299 l 62 -371 l 0 -371 q 125 -192 68 -278 q 240 -5 182 -106 l 324 136 l 201 402 q 146 519 174 460 q 43 587 103 587 l -1 584 l -1 638 q 128 672 57 672 q 222 627 181 672 q 292 522 264 583 l 359 374 l 411 260 l 500 426 "},"8":{"x_min":59,"x_max":689,"ha":749,"o":"m 110 696 q 187 853 110 797 q 370 909 264 909 q 558 854 480 909 q 636 694 636 800 q 589 575 636 621 q 467 510 543 529 l 467 499 q 630 413 572 475 q 689 247 689 351 q 597 51 689 120 q 374 -18 505 -18 q 149 48 239 -18 q 59 247 59 115 q 118 414 59 347 q 281 499 178 480 l 281 510 q 157 570 205 521 q 110 696 110 619 m 371 531 q 472 577 437 531 q 507 693 507 624 q 470 810 507 764 q 366 856 433 856 q 271 807 305 856 q 238 693 238 758 q 271 578 238 625 q 371 531 305 531 m 373 31 q 505 97 461 31 q 550 255 550 164 q 506 415 550 348 q 373 482 462 482 q 239 416 283 482 q 195 255 195 351 q 240 96 195 162 q 373 31 285 31 "},"ί":{"x_min":96,"x_max":429.34375,"ha":342,"o":"m 104 333 l 104 520 q 103 566 104 544 q 96 654 102 588 q 141 647 130 648 q 165 647 151 647 q 233 654 196 647 q 224 555 226 599 q 223 437 223 511 l 223 406 q 228 194 223 337 q 233 0 233 51 q 201 3 216 1 q 165 5 185 5 q 127 3 148 5 q 96 0 107 1 q 100 165 96 51 q 104 333 104 279 m 308 943 q 341 974 326 964 q 377 985 357 985 q 415 969 401 985 q 429 932 429 954 q 414 896 429 912 q 373 866 400 880 l 174 743 l 125 743 l 308 943 "},"Ζ":{"x_min":6.9375,"x_max":801.390625,"ha":828,"o":"m 6 36 q 222 324 112 176 q 425 605 333 473 l 597 857 l 433 857 q 59 836 247 857 l 65 883 l 59 932 q 262 927 134 932 q 427 922 390 922 q 622 927 491 922 q 801 932 754 932 l 801 904 q 594 629 709 785 q 399 361 479 473 q 201 77 319 249 l 427 77 q 581 82 520 77 q 801 103 643 87 l 797 68 l 795 54 l 797 34 l 801 0 q 504 4 683 0 q 325 8 326 8 q 166 4 272 8 q 6 0 61 0 l 6 36 "},"R":{"x_min":109,"x_max":806.234375,"ha":785,"o":"m 261 0 q 223 3 248 0 q 185 8 198 8 q 148 5 168 8 q 109 0 127 2 q 118 306 109 90 q 127 598 127 523 q 122 761 127 672 q 109 931 117 849 l 203 929 l 409 935 q 618 882 529 935 q 708 719 708 830 q 634 559 708 615 q 442 473 560 503 q 620 240 533 355 q 806 0 708 124 l 732 5 l 610 0 q 449 240 529 127 q 283 455 369 353 l 251 455 l 251 307 q 256 138 251 245 q 261 0 261 31 m 570 699 q 504 835 570 791 q 344 879 439 879 l 261 875 q 253 772 255 834 q 251 701 251 709 l 251 504 q 479 542 388 504 q 570 699 570 581 "},"×":{"x_min":203.984375,"x_max":938.015625,"ha":1139,"o":"m 892 775 l 938 729 l 616 406 l 938 86 l 892 38 l 571 361 l 247 38 l 203 86 l 525 407 l 204 729 l 247 775 l 570 453 l 892 775 "},"o":{"x_min":41,"x_max":710,"ha":753,"o":"m 371 -15 q 131 78 222 -15 q 41 322 41 172 q 133 573 41 474 q 378 672 225 672 q 619 574 528 672 q 710 326 710 477 q 617 80 710 175 q 371 -15 525 -15 m 377 619 q 226 530 272 619 q 180 327 180 441 q 227 125 180 216 q 375 35 274 35 q 524 123 478 35 q 570 326 570 211 q 524 529 570 440 q 377 619 479 619 "},"5":{"x_min":75,"x_max":654,"ha":749,"o":"m 116 201 q 176 77 131 120 q 303 35 221 35 q 454 98 396 35 q 512 255 512 161 q 457 407 512 346 q 313 469 403 469 q 170 417 227 469 l 150 428 l 158 526 q 158 662 158 570 q 158 801 158 754 l 147 888 l 383 879 l 412 879 q 628 887 520 879 q 624 848 626 870 q 622 818 622 826 l 626 760 l 425 761 l 227 761 q 221 631 227 717 q 216 500 216 544 q 375 536 296 536 q 572 465 491 536 q 654 279 654 394 q 550 60 654 139 q 304 -18 447 -18 q 179 -6 231 -18 q 75 34 127 4 q 101 201 87 118 l 116 201 "},"7":{"x_min":122.609375,"x_max":729.5625,"ha":749,"o":"m 461 553 l 586 770 l 362 770 q 129 755 232 770 q 133 786 132 769 q 135 820 135 804 q 128 888 135 853 l 408 883 l 729 887 l 729 871 q 463 429 582 641 q 251 0 344 216 l 194 8 q 153 5 169 8 q 122 0 137 2 q 214 146 179 91 q 333 339 249 201 q 461 553 417 477 "},"K":{"x_min":108,"x_max":856.625,"ha":821,"o":"m 255 314 q 261 132 255 250 q 268 0 268 13 q 229 4 255 0 q 188 8 202 8 q 148 4 174 8 q 108 0 121 0 q 117 239 108 70 q 126 465 126 408 q 122 712 126 621 q 108 932 119 803 q 153 928 124 932 q 188 925 183 925 q 231 928 203 925 q 267 932 259 932 l 255 671 l 255 499 q 480 693 375 586 q 687 932 585 800 q 732 932 710 932 q 777 932 753 932 l 837 932 q 606 727 720 830 q 389 522 493 623 q 525 358 465 426 q 666 202 586 290 q 856 0 747 115 l 746 0 q 692 -1 716 0 q 644 -8 669 -2 q 571 92 610 44 q 477 204 532 140 l 255 459 l 255 314 "},",":{"x_min":40.28125,"x_max":272.21875,"ha":374,"o":"m 131 75 q 160 147 144 120 q 213 175 176 175 q 272 119 272 175 q 259 67 272 91 q 231 18 245 43 l 73 -243 l 40 -231 l 131 75 "},"d":{"x_min":55,"x_max":676,"ha":758,"o":"m 668 762 l 672 137 l 676 -1 q 638 3 653 1 q 611 5 623 5 q 574 2 597 5 q 547 -1 551 -1 l 557 119 q 336 -15 484 -15 q 127 86 200 -15 q 55 330 55 187 q 127 569 55 467 q 332 672 199 672 q 457 643 402 672 q 551 556 513 615 l 551 756 l 551 789 l 551 818 q 542 1025 551 927 q 609 1018 576 1018 q 639 1019 628 1018 q 675 1025 651 1020 l 668 762 m 374 57 q 515 139 473 57 q 557 332 557 222 q 513 522 557 437 q 374 607 470 607 q 236 522 278 607 q 194 332 194 438 q 235 141 194 225 q 374 57 277 57 "},"¨":{"x_min":83.71875,"x_max":550.390625,"ha":625,"o":"m 471 659 q 441 593 458 618 q 389 568 424 568 q 350 579 365 568 q 335 613 335 591 q 346 660 335 633 q 371 706 358 687 l 519 950 l 550 940 l 471 659 m 221 659 q 192 593 211 618 q 137 568 174 568 q 83 613 83 568 q 93 658 83 637 q 119 706 103 680 l 268 950 l 300 940 l 221 659 "},"E":{"x_min":108,"x_max":613.5625,"ha":686,"o":"m 126 465 q 122 711 126 620 q 108 932 119 802 l 353 928 l 610 931 l 606 884 l 610 836 q 508 853 562 847 q 408 860 453 860 l 260 860 l 258 671 l 258 528 l 398 528 q 587 541 480 528 l 584 497 l 587 451 l 394 463 l 258 463 l 258 316 l 264 73 q 456 76 380 73 q 613 94 531 80 l 610 47 l 613 0 l 358 4 l 108 0 q 117 239 108 70 q 126 465 126 408 "},"Y":{"x_min":-28,"x_max":746,"ha":707,"o":"m 297 177 l 297 386 q 191 570 256 458 q 84 750 125 682 q -28 932 42 819 q 24 928 -9 932 q 63 925 59 925 q 112 927 91 925 q 146 932 134 930 q 207 800 174 866 q 275 676 239 735 l 389 475 q 509 688 451 575 q 627 932 567 801 l 683 926 q 715 927 701 926 q 746 932 729 929 q 555 627 640 769 l 432 415 l 432 240 q 435 101 432 198 q 438 0 438 5 q 401 4 426 1 q 361 6 376 6 q 319 4 334 6 q 284 0 304 2 q 292 88 288 36 q 297 177 297 140 "},"\"":{"x_min":64,"x_max":315,"ha":379,"o":"m 133 587 l 64 587 l 64 957 l 133 957 l 133 587 m 315 587 l 247 587 l 247 957 l 315 957 l 315 587 "},"ê":{"x_min":40,"x_max":646.9375,"ha":681,"o":"m 406 42 q 602 130 523 42 l 621 130 q 613 93 617 112 q 609 47 609 73 q 496 0 558 14 q 369 -15 435 -15 q 130 73 220 -15 q 40 311 40 162 q 126 562 40 456 q 355 669 212 669 q 564 590 481 669 q 646 386 646 512 l 644 331 q 438 333 562 331 q 314 335 315 335 l 179 331 q 235 127 179 212 q 406 42 291 42 m 296 978 l 386 978 l 537 743 l 488 743 l 340 875 l 193 743 l 143 743 l 296 978 m 513 392 l 513 437 q 470 563 513 509 q 356 618 427 618 q 233 552 271 618 q 183 390 195 487 l 513 392 "},"δ":{"x_min":41,"x_max":670,"ha":710,"o":"m 102 840 q 185 981 102 937 q 375 1025 268 1025 q 497 1010 436 1025 q 621 968 559 995 q 595 876 604 923 q 500 947 547 923 q 393 972 453 972 q 280 937 328 972 q 233 840 233 902 q 272 742 233 794 q 434 627 312 691 q 613 504 556 563 q 670 305 670 445 q 581 75 670 165 q 350 -15 492 -15 q 125 73 210 -15 q 41 305 41 162 q 113 526 41 430 q 306 622 186 622 q 145 726 189 674 q 102 840 102 779 m 356 576 q 221 492 261 576 q 181 302 181 409 q 223 118 181 203 q 356 34 265 34 q 490 116 450 34 q 530 307 530 198 q 489 492 530 409 q 356 576 449 576 "},"έ":{"x_min":53,"x_max":598.828125,"ha":628,"o":"m 506 516 q 433 591 467 566 q 353 616 400 616 q 261 580 298 616 q 225 492 225 545 q 268 406 225 437 q 372 375 311 375 l 418 375 l 417 352 l 417 313 l 343 317 q 237 282 281 317 q 193 185 193 247 q 238 78 193 118 q 352 38 284 38 q 460 66 410 38 q 543 144 510 94 q 553 99 547 121 q 567 54 558 76 q 452 2 515 19 q 321 -15 388 -15 q 134 31 216 -15 q 53 176 53 78 q 96 286 53 246 q 214 355 139 326 q 127 408 162 370 q 93 497 93 445 q 165 625 93 579 q 323 672 237 672 q 430 654 378 672 q 541 604 481 637 q 522 564 529 584 q 506 516 514 545 m 476 944 q 510 975 494 965 q 547 986 526 986 q 584 970 569 986 q 598 933 598 954 q 584 898 598 912 q 541 867 569 884 l 342 744 l 293 744 l 476 944 "},"ω":{"x_min":39.71875,"x_max":1028.9375,"ha":1068,"o":"m 535 526 l 596 528 l 594 305 q 616 117 594 193 q 722 42 638 42 q 850 118 811 42 q 888 293 888 194 q 829 502 888 409 q 664 654 769 594 l 717 648 q 805 654 766 648 q 967 510 905 606 q 1028 304 1028 413 q 948 81 1028 177 q 744 -15 867 -15 q 622 16 678 -15 q 534 104 566 47 q 445 16 500 48 q 323 -15 389 -15 q 118 83 196 -15 q 39 311 39 182 q 100 511 39 419 q 262 654 161 604 q 303 650 278 651 q 349 648 327 648 l 402 654 q 238 501 296 593 q 179 291 179 409 q 218 116 179 191 q 348 42 257 42 q 419 68 390 42 q 461 137 448 94 q 472 216 469 175 q 475 303 475 257 q 472 419 475 353 q 469 528 470 485 l 535 526 "},"´":{"x_min":90.28125,"x_max":305.5625,"ha":374,"o":"m 169 859 q 197 923 177 894 q 250 953 218 953 q 288 939 272 953 q 305 902 305 925 q 295 857 305 882 q 269 811 284 833 l 120 568 l 90 576 l 169 859 "},"±":{"x_min":169,"x_max":969,"ha":1139,"o":"m 602 549 l 969 549 l 969 482 l 602 482 l 602 247 l 534 247 l 534 482 l 169 482 l 169 549 l 534 549 l 534 779 l 602 779 l 602 549 m 969 33 l 169 33 l 169 100 l 969 100 l 969 33 "},"|":{"x_min":305,"x_max":376,"ha":683,"o":"m 376 448 l 305 448 l 305 956 l 376 956 l 376 448 m 376 -233 l 305 -233 l 305 272 l 376 272 l 376 -233 "},"ϋ":{"x_min":79,"x_max":703,"ha":774,"o":"m 703 395 q 595 110 703 236 q 332 -15 488 -15 q 145 54 211 -15 q 79 244 79 123 l 83 429 q 81 542 83 486 q 79 654 80 598 l 146 650 l 217 654 q 209 502 217 608 q 202 365 202 397 l 202 261 q 240 105 202 168 q 369 43 279 43 q 523 132 476 43 q 571 340 571 222 q 548 493 571 418 q 488 645 526 568 q 550 647 529 645 q 627 658 571 650 q 703 395 703 537 m 227 928 q 281 907 259 928 q 304 853 304 886 q 283 800 304 822 q 230 778 262 778 q 175 800 197 778 q 153 853 153 822 q 174 906 153 884 q 227 928 195 928 m 469 928 q 523 906 501 928 q 545 853 545 884 q 524 799 545 821 q 472 778 504 778 q 418 800 440 778 q 396 853 396 822 q 416 905 396 883 q 469 928 437 928 "},"§":{"x_min":64,"x_max":620,"ha":675,"o":"m 114 36 l 128 36 q 198 -76 148 -33 q 319 -120 247 -120 q 430 -78 384 -120 q 476 27 476 -37 q 369 169 476 116 q 170 252 269 210 q 64 419 64 312 q 91 522 64 476 q 171 609 119 568 q 122 739 122 669 q 195 896 122 837 q 369 956 268 956 q 473 940 422 956 q 576 894 523 925 q 559 864 568 882 q 521 775 551 846 l 508 775 q 445 871 483 839 q 343 903 407 903 q 251 867 289 903 q 213 777 213 832 q 318 644 213 694 q 514 563 415 604 q 620 408 620 507 q 592 299 620 348 q 515 213 565 251 q 560 143 544 179 q 576 65 576 108 q 494 -112 576 -46 q 298 -178 412 -178 q 179 -163 239 -178 q 76 -119 120 -148 q 97 -42 86 -89 q 114 36 108 4 m 138 479 q 257 340 138 396 q 478 238 376 285 q 524 285 508 261 q 541 342 541 310 q 384 490 541 423 q 197 587 228 556 q 156 532 175 563 q 138 479 138 501 "},"b":{"x_min":78,"x_max":703,"ha":758,"o":"m 152 1018 q 219 1025 181 1018 q 212 916 214 966 q 210 788 210 866 l 210 755 l 210 555 q 419 672 283 672 q 629 569 555 672 q 703 322 703 466 q 630 79 703 173 q 414 -15 558 -15 q 296 8 350 -15 q 193 79 242 31 q 160 49 175 64 q 120 -1 145 33 l 78 -1 q 87 106 82 43 q 92 213 92 169 l 92 545 q 88 784 92 625 q 85 1025 85 944 q 152 1018 119 1018 m 383 605 q 243 520 285 605 q 202 323 202 435 q 245 133 202 218 q 383 48 288 48 q 522 132 480 48 q 564 326 564 217 q 522 519 564 434 q 383 605 480 605 "},"q":{"x_min":54,"x_max":675,"ha":758,"o":"m 608 -368 q 579 -368 591 -368 q 540 -373 567 -369 q 549 -213 548 -312 q 551 -101 551 -115 l 551 99 q 339 -15 476 -15 q 130 82 207 -15 q 54 316 54 180 q 125 564 54 456 q 333 672 197 672 q 464 636 407 672 q 557 535 520 601 q 546 655 557 594 q 586 649 576 650 q 611 648 597 648 q 674 655 640 648 l 671 433 q 669 163 671 298 q 666 -106 668 27 l 675 -373 q 643 -369 658 -370 q 608 -368 627 -368 m 373 48 q 515 134 473 48 q 557 331 557 220 q 511 514 557 433 q 372 596 466 596 q 234 512 276 596 q 193 322 193 429 q 236 133 193 218 q 373 48 279 48 "},"Ω":{"x_min":8,"x_max":1119.125,"ha":1129,"o":"m 449 0 q 318 4 410 0 q 223 8 227 8 l 10 0 l 13 47 q 11 74 13 59 q 8 95 9 88 q 119 88 69 90 q 249 86 169 86 q 103 261 152 170 q 55 473 55 352 q 200 822 55 694 q 567 950 345 950 q 931 823 791 950 q 1072 473 1072 697 q 1025 261 1072 350 q 878 86 978 173 q 992 91 902 86 q 1119 96 1083 96 l 1114 33 l 1117 0 l 906 8 q 778 4 867 8 q 682 0 688 0 l 682 72 q 864 215 807 122 q 921 451 921 309 q 834 764 921 639 q 565 889 747 889 q 296 767 384 889 q 209 454 209 645 q 268 217 209 319 q 449 72 327 115 l 449 0 "},"ύ":{"x_min":79,"x_max":703,"ha":774,"o":"m 703 395 q 595 110 703 236 q 332 -15 488 -15 q 145 54 211 -15 q 79 244 79 123 l 83 429 q 81 541 83 484 q 79 652 80 597 l 146 648 l 217 652 q 209 502 217 606 q 202 365 202 397 l 202 261 q 240 105 202 168 q 369 43 279 43 q 523 132 476 43 q 571 340 571 222 q 548 491 571 416 q 488 644 526 566 q 550 646 529 644 q 627 656 571 648 q 703 395 703 536 m 499 941 q 532 972 517 962 q 568 983 547 983 q 606 967 592 983 q 620 930 620 952 q 605 894 620 910 q 564 865 590 878 l 365 741 l 316 741 l 499 941 "},"Ö":{"x_min":51,"x_max":1069,"ha":1121,"o":"m 51 465 q 191 819 51 688 q 559 950 332 950 q 891 852 750 950 q 1046 659 1031 755 q 1065 535 1062 562 q 1069 462 1069 508 q 1066 395 1069 416 q 1047 275 1063 373 q 894 80 1031 176 q 562 -15 756 -15 q 451 -8 503 -15 q 304 31 399 -2 q 130 187 209 65 q 51 465 51 308 m 439 1208 q 491 1186 470 1208 q 513 1133 513 1164 q 491 1080 513 1103 q 439 1058 470 1058 q 385 1080 409 1058 q 362 1133 362 1102 q 384 1186 362 1164 q 439 1208 407 1208 m 682 1208 q 735 1186 713 1208 q 757 1133 757 1164 q 735 1080 757 1103 q 682 1058 713 1058 q 628 1079 650 1058 q 607 1133 607 1101 q 628 1186 607 1164 q 682 1208 650 1208 m 204 469 q 292 162 204 283 q 559 42 380 42 q 827 162 739 42 q 916 469 916 283 q 825 767 916 648 q 559 887 735 887 q 349 825 430 887 q 226 638 267 763 q 204 469 204 558 "},"z":{"x_min":15.28125,"x_max":606.9375,"ha":647,"o":"m 15 29 q 164 224 88 124 q 302 416 240 323 l 418 586 l 270 586 q 181 581 218 586 q 62 565 145 577 l 68 609 l 62 654 q 181 648 115 650 q 330 646 248 646 l 363 646 l 393 646 q 606 654 500 646 l 606 626 q 453 428 545 549 q 317 246 361 306 q 194 68 273 185 l 343 68 q 456 72 400 68 q 594 86 513 77 l 588 42 l 594 0 l 280 8 q 148 4 237 8 q 15 0 59 0 l 15 29 "},"™":{"x_min":176,"x_max":918,"ha":1139,"o":"m 463 930 l 346 930 l 346 614 l 293 614 l 293 930 l 176 930 l 176 969 l 463 969 l 463 930 m 736 690 l 840 968 l 918 969 l 918 614 l 871 614 l 871 927 l 752 614 l 719 614 l 594 930 l 594 614 l 548 614 l 548 969 l 625 969 l 736 690 "},"ή":{"x_min":91,"x_max":662,"ha":754,"o":"m 594 -365 q 557 -366 577 -365 q 526 -369 537 -368 q 531 -189 526 -310 q 537 -7 537 -68 l 537 406 q 503 536 537 485 q 391 587 469 587 q 255 508 290 587 q 220 315 220 430 q 222 133 220 259 q 224 1 224 8 l 158 6 l 91 1 l 101 156 l 101 495 q 97 584 101 527 q 93 655 93 640 q 119 650 105 652 q 155 648 134 648 q 185 650 175 648 q 221 655 195 651 l 220 538 q 321 637 265 602 q 452 672 378 672 q 604 603 552 672 q 656 430 656 535 l 656 329 l 656 -186 q 659 -293 656 -227 q 662 -370 662 -359 q 630 -366 645 -368 q 594 -365 614 -365 m 481 944 q 515 975 499 965 q 552 986 531 986 q 589 970 575 986 q 603 933 603 955 q 589 898 603 912 q 547 868 575 884 l 348 744 l 298 744 l 481 944 "},"Θ":{"x_min":51,"x_max":1068,"ha":1119,"o":"m 51 465 q 193 820 51 690 q 562 950 335 950 q 893 852 755 950 q 1047 653 1031 755 q 1065 525 1062 551 q 1068 462 1068 500 q 1065 402 1068 426 q 1047 280 1062 379 q 892 83 1033 182 q 560 -15 751 -15 q 435 -7 480 -15 q 299 32 390 0 q 130 187 209 65 q 51 465 51 308 m 202 468 q 290 163 202 283 q 559 43 379 43 q 826 163 738 43 q 915 468 915 283 q 826 770 915 652 q 559 889 738 889 q 254 720 306 889 q 202 468 202 552 m 560 507 q 683 510 608 507 q 768 514 758 514 l 765 465 l 765 429 q 648 432 730 429 q 558 435 566 435 q 440 432 523 435 q 351 429 357 429 l 353 470 l 353 514 q 474 510 400 514 q 560 507 549 507 "},"®":{"x_min":80,"x_max":1058,"ha":1139,"o":"m 816 905 q 992 726 927 841 q 1058 481 1058 611 q 912 138 1058 283 q 567 -6 766 -6 q 225 139 370 -6 q 80 481 80 284 q 224 826 80 681 q 569 971 368 971 q 816 905 698 971 m 569 918 q 263 788 392 918 q 134 481 134 659 q 261 175 134 306 q 566 45 389 45 q 872 174 741 45 q 1004 478 1004 304 q 947 699 1004 596 q 787 859 890 801 q 569 918 684 918 m 815 619 q 776 521 815 562 q 681 468 738 480 l 809 209 l 709 208 l 592 456 l 462 457 l 462 209 l 376 209 l 376 771 l 581 771 q 745 737 676 771 q 815 619 815 704 m 462 714 l 462 513 l 566 513 q 682 532 635 513 q 729 611 729 551 q 681 692 729 671 q 564 714 634 714 l 462 714 "},"É":{"x_min":109,"x_max":614.5625,"ha":685,"o":"m 124 465 q 116 710 124 540 q 109 932 109 880 l 353 929 l 610 929 q 607 904 607 918 q 607 884 607 891 l 610 838 q 407 860 506 860 l 259 860 l 257 670 l 257 530 l 397 530 q 586 542 492 530 q 584 518 584 530 q 584 499 584 506 q 586 450 584 465 q 487 458 542 454 q 393 463 432 463 l 257 463 l 257 318 l 262 74 q 452 77 381 74 q 614 94 524 80 l 613 47 l 614 0 l 356 0 l 109 0 q 116 243 109 72 q 124 465 124 415 m 426 1225 q 461 1255 445 1244 q 499 1267 478 1267 q 536 1251 522 1267 q 549 1212 549 1236 q 533 1176 549 1192 q 492 1147 517 1160 l 292 1024 l 242 1024 l 426 1225 "},"~":{"x_min":284,"x_max":1080,"ha":1368,"o":"m 850 650 q 667 750 761 650 q 511 850 573 850 q 396 793 431 850 q 362 650 362 737 l 284 650 q 339 846 284 768 q 508 924 395 924 q 697 824 606 924 q 853 725 788 725 q 969 779 936 725 q 1002 924 1002 834 l 1080 924 q 1023 727 1080 805 q 850 650 966 650 "},"Ε":{"x_min":108,"x_max":613.5625,"ha":686,"o":"m 126 465 q 122 711 126 620 q 108 932 119 802 l 353 928 l 610 931 l 606 884 l 610 836 q 508 853 562 847 q 408 860 453 860 l 260 860 l 258 671 l 258 528 l 398 528 q 587 541 480 528 l 584 497 l 587 451 l 394 463 l 258 463 l 258 316 l 264 73 q 456 76 380 73 q 613 94 531 80 l 610 47 l 613 0 l 358 4 l 108 0 q 117 239 108 70 q 126 465 126 408 "},"³":{"x_min":48,"x_max":424,"ha":496,"o":"m 159 636 l 156 663 q 178 661 167 661 q 200 661 189 661 q 280 690 248 661 q 312 767 312 719 q 212 869 312 869 q 143 846 168 869 q 107 781 117 823 l 102 779 q 84 812 93 795 q 66 845 75 830 q 134 886 98 871 q 212 901 171 901 q 341 873 284 901 q 398 778 398 845 q 355 691 398 724 q 252 643 313 658 q 373 610 322 643 q 424 509 424 577 q 353 385 424 427 q 196 343 283 343 q 48 373 117 343 q 57 422 52 391 q 66 469 63 454 l 75 469 q 120 399 88 425 q 199 374 153 374 q 294 409 254 374 q 334 499 334 444 q 299 588 334 553 q 207 623 264 623 q 179 620 193 623 q 156 617 166 618 l 159 636 "},"[":{"x_min":116,"x_max":364.609375,"ha":449,"o":"m 127 2 l 127 386 l 127 769 l 116 932 l 235 929 l 364 929 l 363 908 l 363 872 q 263 880 313 880 l 216 880 l 216 387 l 216 -105 l 264 -105 q 329 -102 308 -105 q 364 -98 351 -99 l 363 -123 l 363 -158 l 237 -154 l 116 -158 q 121 -81 116 -138 q 127 2 127 -24 "},"L":{"x_min":108,"x_max":627.453125,"ha":629,"o":"m 126 465 q 122 712 126 621 q 108 932 119 803 q 149 930 126 932 q 188 926 173 927 q 233 929 202 926 q 268 932 265 932 q 263 797 268 883 q 258 684 258 711 q 261 332 258 577 q 264 73 264 86 l 402 73 q 512 78 458 73 q 627 94 566 84 l 624 47 l 627 0 l 358 4 l 108 0 q 117 239 108 70 q 126 465 126 408 "},"σ":{"x_min":41,"x_max":802.109375,"ha":806,"o":"m 625 644 l 802 651 l 797 611 l 802 566 l 626 573 q 690 464 671 527 q 710 327 710 402 q 616 81 710 177 q 371 -15 522 -15 q 131 78 222 -15 q 41 322 41 172 q 131 572 41 472 q 371 672 221 672 q 439 665 403 672 q 508 653 475 659 q 569 645 541 646 q 625 644 597 644 m 376 619 q 226 530 272 619 q 181 326 181 442 q 224 124 181 213 q 369 35 268 35 q 522 123 474 35 q 570 326 570 211 q 524 529 570 440 q 376 619 479 619 "},"ζ":{"x_min":75,"x_max":675,"ha":683,"o":"m 642 987 l 642 949 q 425 760 524 860 q 260 545 326 661 q 194 303 194 428 q 194 278 194 289 q 202 215 194 267 q 335 141 210 163 q 558 116 447 128 q 675 -7 675 91 q 643 -109 675 -65 q 544 -232 612 -154 l 500 -205 q 565 -113 555 -131 q 576 -66 576 -94 q 552 -20 576 -37 q 292 22 509 2 q 75 240 75 41 q 143 487 75 357 q 297 719 212 616 q 508 949 383 821 l 359 949 q 252 945 301 949 q 130 933 204 941 l 134 977 l 130 1025 q 272 1021 186 1025 q 372 1018 358 1018 q 526 1021 429 1018 q 643 1025 623 1025 l 642 987 "},"θ":{"x_min":48,"x_max":699,"ha":749,"o":"m 375 909 q 621 773 544 909 q 699 456 699 638 q 627 118 699 255 q 372 -19 556 -19 q 120 114 193 -19 q 48 444 48 247 q 122 773 48 638 q 375 909 196 909 m 184 383 q 221 136 184 242 q 374 31 259 31 q 534 137 505 31 q 564 424 564 244 l 408 428 l 184 423 l 184 383 m 371 858 q 257 804 300 858 q 196 673 214 751 q 186 581 189 630 q 184 483 184 532 l 322 478 q 461 480 364 478 q 564 483 558 483 q 528 747 564 637 q 371 858 493 858 "},"Ο":{"x_min":51,"x_max":1068,"ha":1119,"o":"m 51 465 q 192 820 51 690 q 559 950 333 950 q 892 853 754 950 q 1047 654 1031 757 q 1065 525 1062 551 q 1068 462 1068 500 q 1065 402 1068 426 q 1047 277 1062 379 q 894 80 1031 175 q 560 -15 756 -15 q 447 -10 496 -15 q 304 29 398 -5 q 130 186 210 64 q 51 465 51 308 m 202 468 q 290 162 202 282 q 559 42 379 42 q 826 162 738 42 q 915 468 915 283 q 825 770 915 651 q 559 889 735 889 q 348 826 429 889 q 225 639 267 764 q 202 468 202 552 "},"Γ":{"x_min":108,"x_max":627.453125,"ha":629,"o":"m 448 932 l 627 932 q 623 902 624 921 q 621 874 621 883 l 627 836 q 402 863 512 863 l 264 863 q 261 586 264 779 q 258 379 258 393 q 263 181 258 313 q 268 0 268 48 l 187 5 l 108 0 q 121 209 117 106 q 126 427 126 311 q 117 686 126 504 q 108 932 108 869 l 448 932 "}," ":{"x_min":0,"x_max":0,"ha":375},"%":{"x_min":28,"x_max":1011,"ha":1032,"o":"m 799 0 q 647 62 708 0 q 586 218 586 124 q 647 372 586 309 q 799 436 709 436 q 949 373 888 436 q 1011 223 1011 311 q 995 130 1011 176 q 918 35 972 70 q 799 0 865 0 m 863 1015 l 227 -125 l 158 -125 l 793 1015 l 863 1015 m 241 451 q 89 513 150 451 q 28 668 28 576 q 89 823 28 759 q 241 888 150 888 q 391 825 330 888 q 453 673 453 762 q 434 581 453 623 q 359 486 412 521 q 241 451 307 451 m 897 260 q 872 353 897 310 q 798 397 847 397 q 718 340 737 397 q 700 202 700 283 q 719 86 700 133 q 798 40 738 40 q 866 73 840 40 q 892 149 892 106 q 895 206 894 169 q 897 260 897 242 m 339 689 q 312 812 339 775 q 240 849 285 849 q 160 788 179 849 q 141 648 141 728 q 164 541 141 590 q 240 493 188 493 q 307 527 281 493 q 334 602 334 561 q 339 689 339 641 "},"P":{"x_min":109,"x_max":722,"ha":736,"o":"m 127 559 q 109 931 127 759 l 231 927 q 337 931 270 927 q 416 935 403 935 q 632 874 543 935 q 722 694 722 814 q 616 493 722 564 q 371 422 510 422 l 252 422 q 257 200 252 348 q 262 0 262 52 q 224 3 249 0 q 185 8 199 8 q 147 5 168 8 q 109 0 127 2 q 118 287 109 85 q 127 559 127 488 m 576 684 q 515 826 576 773 q 364 879 455 879 l 262 875 q 254 781 257 827 q 252 688 252 735 l 252 476 q 507 530 439 476 q 576 684 576 584 "},"Ώ":{"x_min":-1,"x_max":1355.953125,"ha":1365,"o":"m 685 0 q 555 4 646 0 q 460 8 464 8 l 247 0 l 250 47 q 248 74 250 59 q 244 95 246 88 q 355 88 305 90 q 486 86 405 86 q 340 261 389 170 q 292 473 292 352 q 437 822 292 694 q 804 950 582 950 q 1168 823 1028 950 q 1309 473 1309 697 q 1262 261 1309 350 q 1115 86 1215 173 q 1229 91 1139 86 q 1355 96 1319 96 l 1351 33 l 1354 0 l 1143 8 q 1014 4 1104 8 q 918 0 924 0 l 918 72 q 1100 215 1043 122 q 1158 451 1158 309 q 1071 764 1158 639 q 802 889 984 889 q 533 767 621 889 q 446 454 446 645 q 505 217 446 319 q 685 72 564 115 l 685 0 m 182 943 q 215 974 200 964 q 251 985 230 985 q 289 969 274 985 q 304 932 304 954 q 290 896 304 911 q 247 866 275 882 l 48 743 l -1 743 l 182 943 "},"Έ":{"x_min":-1.390625,"x_max":920.015625,"ha":992,"o":"m 432 465 q 428 711 432 620 q 414 932 425 802 l 660 928 l 917 932 l 912 884 l 917 836 q 814 853 868 847 q 714 860 760 860 l 567 860 l 564 671 l 564 528 l 704 528 q 893 541 786 528 l 890 497 l 893 451 l 700 462 l 564 462 l 564 317 l 570 74 q 762 77 686 74 q 920 94 838 80 l 917 47 l 920 0 l 664 4 l 414 0 q 423 239 414 70 q 432 465 432 408 m 181 943 q 215 974 200 964 q 251 985 230 985 q 288 969 273 985 q 304 932 304 954 q 289 896 304 911 q 247 866 275 882 l 47 743 l -1 743 l 181 943 "},"_":{"x_min":0,"x_max":683.328125,"ha":683,"o":"m 683 -322 l 0 -322 l 0 -256 l 683 -256 l 683 -322 "},"Ϊ":{"x_min":-3,"x_max":388,"ha":386,"o":"m 126 465 q 118 710 126 540 q 111 932 111 880 q 156 929 123 932 q 192 926 190 926 q 238 929 205 926 q 276 932 271 932 q 265 697 276 863 q 255 465 255 530 q 265 230 255 397 q 276 0 276 63 q 233 3 260 0 q 192 8 205 8 q 153 5 176 8 q 111 0 131 2 q 118 243 111 72 q 126 465 126 415 m 73 1208 q 124 1186 102 1208 q 146 1133 146 1164 q 123 1081 146 1105 q 73 1058 101 1058 q 19 1080 42 1058 q -3 1133 -3 1103 q 19 1185 -3 1163 q 73 1208 41 1208 m 313 1208 q 366 1186 344 1208 q 388 1133 388 1164 q 365 1080 388 1103 q 313 1058 342 1058 q 260 1080 283 1058 q 238 1133 238 1103 q 260 1185 238 1163 q 313 1208 282 1208 "},"+":{"x_min":169,"x_max":970,"ha":1139,"o":"m 603 441 l 970 441 l 970 374 l 603 374 l 603 0 l 536 0 l 536 374 l 169 374 l 169 441 l 536 441 l 536 816 l 603 816 l 603 441 "},"½":{"x_min":83,"x_max":1094.125,"ha":1172,"o":"m 250 743 l 245 836 q 181 804 205 818 q 120 768 156 791 q 104 788 117 775 q 83 808 91 801 q 200 851 141 825 q 327 913 259 877 l 336 911 q 331 724 336 850 q 326 551 326 598 l 326 391 q 301 394 319 391 q 280 397 283 397 q 254 394 271 397 q 233 391 238 391 q 246 551 242 473 q 250 743 250 629 m 859 1015 l 929 1015 l 312 -124 l 243 -124 l 859 1015 m 982 363 q 959 443 982 413 q 887 478 936 473 q 821 458 852 478 q 784 407 790 439 l 778 377 l 773 376 q 728 448 753 416 q 899 513 801 513 q 1019 476 967 513 q 1072 374 1072 439 q 955 189 1072 285 q 806 67 838 93 l 978 67 q 1094 79 1039 67 q 1090 63 1092 76 q 1088 41 1088 49 q 1094 3 1088 18 q 981 3 1056 3 q 867 3 906 3 q 791 3 842 3 q 714 3 739 3 l 714 25 q 913 198 844 125 q 982 363 982 270 "},"Ρ":{"x_min":109,"x_max":722,"ha":736,"o":"m 127 559 q 109 931 127 759 l 231 927 q 337 931 270 927 q 416 935 403 935 q 632 874 543 935 q 722 694 722 814 q 616 493 722 564 q 371 422 510 422 l 252 422 q 257 200 252 348 q 262 0 262 52 q 224 3 249 0 q 185 8 199 8 q 147 5 168 8 q 109 0 127 2 q 118 287 109 85 q 127 559 127 488 m 576 684 q 515 826 576 773 q 364 879 455 879 l 262 875 q 254 781 257 827 q 252 688 252 735 l 252 476 q 507 530 439 476 q 576 684 576 584 "},"'":{"x_min":88.890625,"x_max":306.9375,"ha":374,"o":"m 169 858 q 196 923 177 896 q 250 951 215 951 q 289 937 272 951 q 306 903 306 923 q 295 858 306 883 q 269 812 284 833 l 122 568 l 88 576 l 169 858 "},"T":{"x_min":11,"x_max":713,"ha":725,"o":"m 11 839 l 15 884 l 11 932 q 194 927 72 932 q 361 922 316 922 q 544 927 421 922 q 713 932 668 932 q 707 883 707 911 q 707 861 707 870 q 713 834 707 852 q 609 850 666 843 q 504 857 552 857 l 428 857 q 426 767 428 830 q 424 701 424 704 l 428 220 q 442 0 428 122 q 362 8 401 3 q 323 5 344 8 q 282 0 301 2 q 289 132 282 40 q 296 259 296 225 l 296 683 l 296 857 q 11 839 164 857 "},"Φ":{"x_min":50,"x_max":1068,"ha":1119,"o":"m 637 -25 q 559 -15 591 -15 q 527 -17 544 -15 q 483 -25 509 -19 l 487 68 q 181 179 313 68 q 50 465 50 291 q 172 744 50 647 q 487 865 295 842 l 483 958 q 522 952 502 955 q 559 950 543 950 q 596 952 576 950 q 637 958 616 955 l 631 865 q 942 758 816 865 q 1068 465 1068 651 q 944 184 1068 286 q 631 68 820 83 l 637 -25 m 501 502 q 497 677 501 570 q 494 800 494 784 q 278 698 354 786 q 203 466 203 611 q 282 231 203 331 q 494 132 361 132 q 497 363 494 225 q 501 502 501 501 m 915 466 q 839 706 915 612 q 626 800 764 800 q 622 636 626 738 q 618 470 618 533 q 622 301 618 408 q 626 132 626 194 q 839 226 764 132 q 915 466 915 320 "},"j":{"x_min":-55,"x_max":248,"ha":342,"o":"m 113 391 q 106 543 113 444 q 100 654 100 641 q 144 648 135 648 q 167 648 153 648 q 202 649 189 648 q 241 654 214 650 q 237 507 241 595 q 234 405 234 419 l 234 -13 l 234 -109 q 154 -303 234 -234 q -55 -372 74 -372 l -55 -333 q 78 -267 44 -323 q 113 -103 113 -212 l 113 -26 l 113 391 m 171 963 q 226 940 205 963 q 248 881 248 917 q 226 831 248 849 q 171 813 204 813 q 116 833 139 813 q 94 885 94 853 q 115 941 94 919 q 171 963 136 963 "},"Σ":{"x_min":44.4375,"x_max":790.28125,"ha":825,"o":"m 729 883 l 733 835 q 272 855 519 855 q 544 500 391 691 q 372 312 446 399 q 219 119 297 224 l 455 119 q 638 124 522 119 q 790 129 755 129 l 784 86 l 783 68 l 784 42 q 785 25 784 33 q 790 0 786 17 q 558 4 694 0 q 416 8 422 8 q 230 4 350 8 q 44 0 111 0 l 44 50 q 169 182 105 109 q 307 344 232 255 l 406 468 q 242 689 314 594 q 76 899 170 785 l 76 932 q 231 929 123 932 q 345 926 340 926 q 568 929 412 926 q 733 932 723 932 l 729 883 "},"1":{"x_min":72,"x_max":472,"ha":749,"o":"m 334 626 q 331 722 334 655 q 329 793 329 788 q 228 737 278 765 q 133 673 177 709 q 102 713 124 688 q 72 743 80 737 q 274 827 177 780 q 458 935 372 875 l 472 929 q 463 552 472 804 q 455 259 455 300 l 459 0 q 421 5 441 2 q 384 8 401 8 q 349 5 367 8 q 312 0 330 2 q 329 289 324 133 q 334 626 334 445 "},"ä":{"x_min":43,"x_max":655.5,"ha":649,"o":"m 234 -15 q 98 33 153 -15 q 43 162 43 82 q 106 303 43 273 q 303 364 169 333 q 444 448 437 395 q 403 568 444 521 q 288 616 362 616 q 191 587 233 616 q 124 507 149 559 l 95 520 l 104 591 q 202 651 144 631 q 323 672 261 672 q 500 622 444 672 q 557 455 557 573 l 557 133 q 567 69 557 84 q 618 54 577 54 q 655 58 643 54 l 655 26 q 594 5 626 14 q 537 -6 562 -3 q 438 85 453 -6 q 342 10 388 35 q 234 -15 296 -15 m 203 929 q 254 906 232 929 q 277 854 277 884 q 256 799 277 820 q 204 778 236 778 q 149 800 173 778 q 126 854 126 822 q 148 906 126 884 q 203 929 170 929 m 444 929 q 498 906 476 929 q 521 854 521 884 q 500 800 521 822 q 447 778 479 778 q 392 800 415 778 q 370 854 370 823 q 392 906 370 884 q 444 929 414 929 m 176 186 q 204 98 176 133 q 284 64 232 64 q 390 107 342 64 q 438 212 438 151 l 438 345 q 239 293 303 319 q 176 186 176 268 "},"<":{"x_min":176,"x_max":961.109375,"ha":1139,"o":"m 279 406 l 960 130 l 961 56 l 176 379 l 176 432 l 960 756 l 960 682 l 279 406 "},"£":{"x_min":65,"x_max":728.890625,"ha":749,"o":"m 67 47 l 65 98 l 116 101 q 203 168 176 112 q 231 292 231 224 q 227 375 231 330 q 221 444 223 420 q 139 441 171 444 q 76 432 107 439 l 78 479 l 76 503 q 105 495 92 498 q 134 493 117 493 l 219 493 q 212 550 214 522 q 209 609 209 578 q 304 825 209 742 q 537 909 399 909 q 633 896 592 909 q 723 864 673 884 q 666 731 694 809 l 656 731 q 605 825 641 791 q 512 859 570 859 q 383 796 427 859 q 340 646 340 734 l 345 493 l 366 493 q 523 502 450 493 l 521 466 l 526 434 q 438 441 493 439 q 345 444 383 444 l 345 378 q 310 238 345 302 q 213 107 275 173 q 527 113 421 107 q 728 134 633 119 l 721 66 q 728 0 721 34 q 542 3 666 0 q 358 8 419 8 q 176 3 285 8 q 65 0 67 0 l 67 47 "},"¹":{"x_min":82,"x_max":347,"ha":496,"o":"m 255 731 l 255 833 l 123 759 q 104 780 120 763 q 82 801 87 797 q 208 850 148 822 q 337 917 269 878 l 347 912 q 341 721 347 848 q 336 529 336 593 l 336 356 q 311 358 327 356 q 289 361 295 361 q 264 358 280 361 q 242 356 248 356 q 251 498 247 407 q 255 731 255 590 "},"t":{"x_min":18,"x_max":415.21875,"ha":425,"o":"m 18 586 l 22 630 l 18 654 q 133 643 80 643 q 131 732 133 669 q 129 799 129 796 q 199 827 163 811 q 263 863 234 843 q 252 758 255 811 q 250 643 250 705 q 334 645 310 643 q 401 654 358 647 l 398 618 l 401 586 q 248 594 323 594 l 243 258 l 243 162 q 272 76 243 109 q 353 43 301 43 q 387 44 369 43 q 415 48 405 46 l 415 4 q 349 -10 378 -5 q 290 -15 319 -15 q 174 18 221 -15 q 123 118 128 51 l 123 200 l 129 387 l 133 594 q 84 592 113 594 q 18 586 55 590 "},"λ":{"x_min":2.78125,"x_max":652.78125,"ha":657,"o":"m 302 670 q 227 871 262 803 q 111 940 193 940 q 78 937 94 940 q 20 924 62 934 l 20 978 q 96 1012 59 1000 q 170 1025 133 1025 q 329 947 287 1025 q 427 692 372 869 q 538 340 481 515 q 652 1 594 166 l 579 5 l 504 0 q 336 573 423 305 q 218 301 272 438 q 111 0 163 163 l 61 6 q 27 3 48 6 q 2 0 5 0 q 302 670 165 329 "},"ù":{"x_min":90,"x_max":664,"ha":754,"o":"m 653 498 q 653 329 653 443 q 653 158 653 215 q 664 0 653 81 q 631 3 647 1 q 598 5 616 5 q 563 3 583 5 q 533 0 544 1 l 538 118 q 440 18 494 52 q 312 -15 385 -15 q 148 50 201 -15 q 96 229 96 115 l 96 354 l 96 516 l 90 655 q 120 650 103 651 q 158 648 136 648 q 192 650 175 648 q 227 655 210 651 q 220 445 227 591 q 213 247 213 299 q 247 115 213 163 q 362 68 281 68 q 477 113 428 68 q 531 217 525 159 q 538 340 538 274 q 533 520 538 394 q 528 655 528 647 q 561 650 548 651 q 596 648 574 648 q 663 655 628 648 q 653 498 653 573 m 445 743 l 244 866 q 205 896 223 877 q 187 934 187 915 q 202 970 187 955 q 238 986 217 986 q 277 973 256 986 q 309 945 298 961 l 496 743 l 445 743 "},"W":{"x_min":0,"x_max":1306.953125,"ha":1307,"o":"m 0 932 q 47 927 31 929 q 76 926 62 926 q 121 929 88 926 q 155 931 154 931 q 262 547 200 750 l 380 171 q 470 437 415 272 q 552 693 525 602 q 619 931 580 784 l 672 926 q 700 928 684 926 q 726 931 716 930 q 825 604 787 727 q 883 419 862 482 q 969 171 904 357 l 1087 522 q 1143 720 1120 623 q 1187 931 1166 816 q 1221 929 1197 931 q 1247 926 1245 926 q 1280 928 1262 926 q 1306 931 1298 930 q 1131 467 1218 716 q 990 0 1045 217 q 963 4 980 1 q 937 7 947 7 q 904 3 925 7 q 880 0 883 0 q 761 385 831 184 l 641 733 l 491 287 q 402 0 438 133 q 370 3 391 0 q 344 7 350 7 q 315 4 327 7 q 287 0 302 2 q 206 296 252 142 q 122 568 161 450 q 0 932 83 686 "},"ï":{"x_min":-25,"x_max":365.328125,"ha":340,"o":"m 104 144 l 104 522 l 97 655 q 138 650 113 651 q 167 648 162 648 q 233 655 206 648 q 225 506 225 581 q 229 254 225 423 q 233 0 233 84 q 201 3 216 1 q 164 5 186 5 q 128 3 143 5 q 97 0 113 1 l 104 144 m 50 929 q 102 906 80 929 q 125 854 125 884 q 104 799 125 820 q 52 778 84 778 q -2 800 19 778 q -25 854 -25 822 q -4 906 -25 884 q 50 929 16 929 m 290 929 q 343 906 320 929 q 365 854 365 884 q 345 799 365 820 q 294 778 324 778 q 238 800 260 778 q 216 854 216 822 q 237 906 216 884 q 290 929 258 929 "},">":{"x_min":176.390625,"x_max":963,"ha":1139,"o":"m 963 379 l 176 56 l 176 130 l 858 406 l 176 682 l 176 756 l 962 432 l 963 379 "},"v":{"x_min":0,"x_max":658.328125,"ha":654,"o":"m 0 655 q 54 648 38 648 q 86 647 69 647 q 113 647 100 647 q 168 654 127 648 q 252 402 204 529 l 358 134 l 470 436 q 543 654 508 533 q 570 650 554 651 q 600 648 586 648 q 636 648 618 648 q 658 654 652 652 q 506 340 577 502 q 372 0 436 177 q 347 5 362 2 q 319 8 333 8 q 296 5 309 8 q 272 0 283 2 q 200 206 234 120 q 0 655 165 292 "},"τ":{"x_min":30,"x_max":677,"ha":701,"o":"m 423 573 l 419 303 q 423 146 419 250 q 428 0 428 42 q 394 4 410 2 q 359 5 378 5 q 333 4 343 5 q 289 0 323 4 l 298 194 l 294 573 q 156 553 207 573 q 57 472 105 534 q 30 559 49 522 q 149 626 82 609 q 307 644 216 644 l 510 644 q 604 647 545 644 q 677 651 664 651 l 671 610 q 677 566 671 586 q 527 569 618 566 q 423 573 436 573 "},"û":{"x_min":90,"x_max":664,"ha":754,"o":"m 653 498 q 653 328 653 442 q 653 158 653 215 q 664 0 653 81 q 631 3 647 1 q 598 5 616 5 q 563 3 583 5 q 533 0 544 1 l 538 118 q 440 18 494 52 q 312 -15 385 -15 q 148 50 201 -15 q 96 229 96 115 l 96 354 l 96 516 l 90 655 q 120 650 103 651 q 158 648 136 648 q 192 649 175 648 q 227 655 210 651 q 220 445 227 591 q 213 247 213 299 q 247 115 213 163 q 362 68 281 68 q 477 113 428 68 q 531 217 525 159 q 538 340 538 274 q 533 520 538 394 q 528 655 528 647 q 558 650 542 651 q 596 648 574 648 q 629 649 612 648 q 663 655 646 651 q 653 498 653 573 m 332 978 l 421 978 l 572 743 l 525 743 l 376 875 l 227 743 l 180 743 l 332 978 "},"ξ":{"x_min":64,"x_max":654,"ha":656,"o":"m 562 861 q 502 941 539 911 q 414 972 465 972 q 299 917 342 972 q 256 788 256 862 q 312 650 256 701 q 458 599 369 599 l 526 599 l 524 563 l 524 528 q 480 533 503 532 q 427 535 457 535 q 271 494 337 535 q 197 408 205 454 q 187 347 188 361 q 186 326 186 333 q 186 294 186 300 q 190 282 187 287 q 238 200 201 229 q 335 153 276 171 l 494 118 q 610 73 567 100 q 654 -13 654 46 q 628 -103 654 -60 q 511 -238 602 -146 l 466 -210 q 541 -121 530 -139 q 553 -75 553 -103 q 393 16 553 -18 q 149 92 234 50 q 64 276 64 133 q 130 462 64 379 q 299 575 197 544 q 175 652 222 600 q 128 780 128 704 q 213 954 128 883 q 405 1025 298 1025 q 507 1009 458 1025 q 609 965 555 994 q 585 914 600 945 q 562 861 571 883 "},"&":{"x_min":76,"x_max":917.671875,"ha":975,"o":"m 360 -18 q 160 41 245 -18 q 76 211 76 101 q 137 382 76 315 q 314 515 199 448 q 249 618 273 569 q 225 722 225 668 q 287 872 225 812 q 441 932 349 932 q 581 891 520 932 q 643 777 643 851 q 588 640 643 701 q 453 532 533 579 q 568 390 509 459 q 690 253 627 321 q 815 530 792 379 l 829 530 l 887 466 q 814 327 856 396 q 727 209 772 259 q 807 115 760 169 q 917 0 853 61 q 855 1 896 0 q 791 2 813 2 l 739 0 l 649 110 q 515 15 586 48 q 360 -18 445 -18 m 341 475 q 234 380 267 419 q 201 273 201 340 q 258 125 201 190 q 401 61 316 61 q 508 86 458 61 q 606 154 559 111 l 341 475 m 547 770 q 524 854 547 823 q 454 886 502 886 q 363 851 402 886 q 325 769 325 817 q 344 685 325 718 q 422 575 363 652 q 514 661 481 615 q 547 770 547 708 "},"Λ":{"x_min":0,"x_max":852.78125,"ha":853,"o":"m 662 452 l 778 172 l 852 0 l 769 5 q 734 4 747 5 q 679 0 722 4 q 647 102 661 55 q 605 226 633 148 l 547 383 l 401 777 l 266 429 q 191 213 226 319 q 125 0 157 108 l 62 2 l 0 0 q 205 459 95 191 q 380 932 315 726 q 404 927 393 929 q 431 926 416 926 q 459 929 441 926 q 487 932 477 932 q 548 743 511 850 q 662 452 586 637 "},"I":{"x_min":109,"x_max":271,"ha":385,"o":"m 127 465 q 123 711 127 620 q 109 932 120 803 q 154 927 129 929 q 190 925 179 925 q 238 928 209 925 q 271 931 266 931 q 263 788 271 887 q 256 659 256 690 l 256 448 l 256 283 q 263 135 256 238 q 271 0 271 31 q 231 3 258 0 q 190 8 204 8 q 151 5 172 8 q 109 0 129 2 q 118 239 109 70 q 127 465 127 408 "},"G":{"x_min":51,"x_max":942,"ha":1001,"o":"m 581 -15 q 198 107 345 -15 q 51 459 51 229 q 196 815 51 680 q 566 950 342 950 q 755 929 659 950 q 930 869 852 909 q 906 802 916 836 q 895 737 897 769 l 874 737 q 739 855 808 818 q 571 893 670 893 q 305 770 406 893 q 204 479 204 647 q 298 168 204 291 q 577 46 393 46 q 689 56 640 46 q 790 94 738 66 q 794 184 790 123 q 798 251 798 246 q 794 337 798 280 q 790 423 790 394 q 830 417 821 418 q 863 416 838 416 q 901 419 880 416 q 941 425 923 422 l 936 236 q 939 121 936 201 q 942 37 942 41 q 757 -1 843 11 q 581 -15 672 -15 "},"ΰ":{"x_min":79,"x_max":703,"ha":774,"o":"m 703 395 q 595 110 703 236 q 332 -15 488 -15 q 145 54 211 -15 q 79 244 79 123 l 83 430 q 81 542 83 486 q 79 654 80 598 l 146 650 l 217 654 q 209 502 217 608 q 202 365 202 397 l 202 261 q 240 105 202 168 q 369 43 279 43 q 523 132 476 43 q 571 340 571 222 q 548 493 571 418 q 488 645 526 568 q 550 647 529 645 q 627 658 571 650 q 703 395 703 537 m 209 865 q 250 846 232 865 q 269 804 269 828 q 251 761 269 780 q 209 743 234 743 q 166 761 184 743 q 148 804 148 779 q 166 846 148 828 q 209 865 184 865 m 361 929 q 378 969 368 956 q 414 982 388 982 q 458 941 458 982 q 446 904 458 919 l 338 743 l 306 743 l 361 929 m 513 865 q 555 846 537 865 q 573 804 573 828 q 555 761 573 779 q 513 743 537 743 q 470 761 487 743 q 454 804 454 779 q 470 846 454 828 q 513 865 487 865 "},"`":{"x_min":86.5,"x_max":303.171875,"ha":374,"o":"m 222 659 q 194 595 214 622 q 140 568 175 568 q 86 613 86 568 q 96 660 86 636 q 122 706 107 684 l 271 950 l 303 940 l 222 659 "},"Υ":{"x_min":-28,"x_max":746,"ha":707,"o":"m 297 177 l 297 386 q 191 570 256 458 q 84 750 125 682 q -28 932 42 819 q 24 928 -9 932 q 63 925 59 925 q 112 927 91 925 q 146 932 134 930 q 207 800 174 866 q 275 676 239 735 l 389 475 q 509 688 451 575 q 627 932 567 801 l 683 926 q 715 927 701 926 q 746 932 729 929 q 555 627 640 769 l 432 415 l 432 240 q 435 101 432 198 q 438 0 438 5 q 401 4 426 1 q 361 6 376 6 q 319 4 334 6 q 284 0 304 2 q 292 88 288 36 q 297 177 297 140 "},"r":{"x_min":89,"x_max":465.390625,"ha":488,"o":"m 99 120 l 99 400 l 99 433 q 91 654 99 548 q 125 648 114 650 q 162 647 136 647 q 232 654 195 647 q 223 588 226 626 q 220 516 220 550 q 313 628 264 589 q 437 668 362 668 l 465 668 l 459 604 l 465 537 q 427 544 448 541 q 383 551 407 548 q 256 482 292 551 q 220 312 220 413 q 222 131 220 256 q 225 0 225 6 l 157 6 l 89 0 l 99 120 "},"x":{"x_min":1,"x_max":635,"ha":632,"o":"m 264 316 l 158 461 q 78 563 120 508 q 5 655 36 619 q 97 647 51 647 q 141 649 120 647 q 177 654 162 651 q 249 538 214 592 q 334 415 284 484 q 420 533 377 473 q 501 654 464 592 q 523 650 508 652 q 550 647 539 648 q 616 654 582 647 l 371 365 q 477 210 434 267 q 635 0 519 152 q 587 3 616 0 q 551 6 558 6 q 501 4 523 6 q 465 0 479 1 q 380 140 407 98 q 295 264 352 183 q 172 84 194 117 q 123 0 151 51 l 66 5 q 33 2 55 5 q 1 0 10 0 q 131 154 63 72 q 264 316 199 236 "},"è":{"x_min":40,"x_max":646.9375,"ha":681,"o":"m 407 42 q 602 130 523 42 l 621 130 q 613 93 617 112 q 609 47 609 73 q 496 0 558 14 q 369 -15 435 -15 q 130 73 220 -15 q 40 311 40 162 q 126 562 40 456 q 355 669 212 669 q 564 590 481 669 q 646 386 646 512 l 644 331 q 438 333 562 331 q 313 335 315 335 l 179 331 q 235 127 179 212 q 407 42 291 42 m 407 743 l 208 866 q 166 895 183 880 q 149 934 149 911 q 167 967 149 949 q 202 986 185 986 q 243 969 220 986 q 273 945 266 952 l 457 743 l 407 743 m 513 392 l 513 437 q 470 563 513 509 q 356 618 427 618 q 233 552 271 618 q 183 390 195 487 l 513 392 "},"μ":{"x_min":84,"x_max":669.109375,"ha":754,"o":"m 331 -15 q 265 -7 292 -15 q 210 19 238 0 l 208 -128 q 211 -266 208 -178 q 214 -373 214 -354 q 183 -369 198 -370 q 150 -368 168 -368 q 114 -370 133 -368 q 84 -373 95 -372 q 89 -165 84 -304 q 94 43 94 -26 q 89 363 94 149 q 84 655 84 578 q 150 647 118 647 q 219 654 180 647 q 213 495 219 601 q 208 334 208 390 q 232 155 208 227 q 339 75 256 83 q 471 112 419 75 q 531 212 523 150 q 539 332 539 273 q 536 518 539 388 q 533 655 533 648 q 600 647 568 647 q 669 654 629 647 q 660 477 662 566 q 658 257 658 389 q 660 113 658 171 q 669 -1 662 55 l 602 4 l 537 -1 l 539 106 q 449 17 502 50 q 331 -15 397 -15 "},"÷":{"x_min":169,"x_max":969,"ha":1139,"o":"m 641 643 q 618 593 641 615 q 566 571 596 571 q 518 592 538 571 q 498 643 498 613 q 518 692 498 670 q 567 715 539 715 q 610 703 579 715 q 641 643 641 691 m 969 374 l 169 374 l 169 441 l 969 441 l 969 374 m 641 170 q 619 120 641 141 q 570 100 598 100 q 519 120 540 100 q 498 170 498 141 q 518 221 498 199 q 568 243 538 243 q 604 235 584 243 q 632 214 624 227 q 641 170 641 201 "},"h":{"x_min":92,"x_max":665,"ha":758,"o":"m 102 136 l 102 859 q 100 934 102 894 q 94 1025 98 975 q 136 1018 126 1019 q 158 1018 146 1018 q 226 1025 188 1018 q 222 957 223 1001 q 221 888 221 913 l 221 868 l 221 543 q 322 637 264 602 q 450 672 380 672 q 608 606 558 672 q 659 429 659 541 l 659 298 l 659 136 l 665 0 q 633 3 648 1 q 597 5 617 5 q 560 3 580 5 q 529 0 540 1 q 534 202 529 68 q 540 405 540 337 q 503 533 540 481 q 394 586 467 586 q 256 508 291 586 q 221 313 221 430 q 224 133 221 244 q 227 0 227 22 q 188 3 211 0 q 161 6 164 6 q 123 4 137 6 q 92 0 108 2 l 102 136 "},".":{"x_min":100,"x_max":274,"ha":374,"o":"m 187 156 q 248 130 223 156 q 274 68 274 105 q 248 8 274 32 q 187 -15 223 -15 q 125 8 150 -15 q 100 68 100 32 q 125 130 100 105 q 187 156 150 156 "},"φ":{"x_min":39,"x_max":965,"ha":1006,"o":"m 578 -371 q 505 -362 539 -362 q 465 -365 483 -362 q 427 -372 446 -368 q 433 -163 427 -298 q 440 -11 440 -29 q 156 76 274 -11 q 39 327 39 163 q 145 571 39 486 q 410 656 252 656 q 412 635 411 645 q 413 615 413 625 q 235 516 292 580 q 179 327 179 451 q 247 118 179 197 q 442 39 316 39 l 444 197 l 444 311 q 444 400 444 340 q 444 491 444 461 q 514 619 452 570 q 657 668 577 668 q 879 568 794 668 q 965 332 965 469 q 850 84 965 169 q 563 -14 735 0 q 570 -203 563 -71 q 578 -371 578 -334 m 826 347 q 794 534 826 451 q 677 617 763 617 q 592 572 621 617 q 563 470 563 527 l 559 350 l 563 39 q 759 126 693 39 q 826 347 826 213 "},";":{"x_min":72.609375,"x_max":312,"ha":446,"o":"m 224 636 q 287 611 262 636 q 312 548 312 586 q 287 486 312 511 q 224 461 262 461 q 162 486 188 461 q 137 548 137 512 q 162 611 137 586 q 224 636 187 636 m 164 75 q 198 157 182 140 q 244 175 214 175 q 304 119 304 175 q 296 75 304 93 q 262 18 287 56 l 103 -243 l 72 -231 l 164 75 "},"f":{"x_min":12,"x_max":432.546875,"ha":397,"o":"m 127 324 l 127 597 q 66 595 92 597 q 12 588 39 594 l 14 626 l 12 654 q 79 648 38 649 q 127 647 121 647 q 192 901 127 777 q 378 1025 257 1025 q 409 1022 400 1025 q 432 1015 418 1019 l 415 896 q 371 911 395 905 q 325 918 347 918 q 252 886 278 918 q 227 805 227 855 q 235 713 227 760 q 246 647 243 665 q 330 650 276 647 q 396 654 384 654 q 391 642 393 647 q 389 633 389 637 l 388 622 l 389 610 q 396 589 389 609 q 323 595 357 594 q 246 597 289 597 l 246 366 q 250 183 246 305 q 254 0 254 60 q 213 3 238 0 q 183 6 187 6 q 144 4 161 6 q 116 0 127 1 q 121 160 116 52 q 127 324 127 269 "},"“":{"x_min":83.71875,"x_max":550.390625,"ha":625,"o":"m 471 659 q 441 593 458 618 q 389 568 424 568 q 350 579 365 568 q 335 613 335 591 q 346 660 335 633 q 371 706 358 687 l 519 950 l 550 940 l 471 659 m 221 659 q 192 593 211 618 q 137 568 174 568 q 83 613 83 568 q 93 658 83 637 q 119 706 103 680 l 268 950 l 300 940 l 221 659 "},"A":{"x_min":-15.28125,"x_max":838.890625,"ha":825,"o":"m 257 639 l 387 950 q 402 945 395 947 q 417 944 409 944 q 452 950 437 944 q 576 629 536 733 q 686 359 617 526 q 838 0 755 192 q 789 3 820 0 q 751 6 758 6 q 700 4 723 6 q 663 0 677 1 q 600 199 622 137 q 543 353 579 260 l 377 358 l 215 353 l 162 205 q 130 110 145 160 q 101 0 115 59 l 44 5 q 6 2 20 5 q -15 0 -8 0 q 76 211 30 105 q 158 404 121 318 q 257 639 195 490 m 378 419 l 513 425 l 379 761 l 246 425 l 378 419 "},"6":{"x_min":64,"x_max":692,"ha":749,"o":"m 464 859 q 267 730 324 859 q 210 442 210 602 q 315 514 262 488 q 431 540 367 540 q 618 462 545 540 q 692 270 692 385 q 604 65 692 145 q 390 -15 516 -15 q 142 93 221 -15 q 64 377 64 201 q 167 745 64 581 q 462 909 270 909 q 524 905 501 909 q 579 890 547 902 l 574 827 q 521 851 547 844 q 464 859 495 859 m 554 258 q 510 409 554 347 q 380 471 466 471 q 255 409 300 471 q 210 264 210 348 q 253 105 210 172 q 384 39 297 39 q 485 73 441 39 q 540 148 529 108 q 552 206 551 187 q 554 258 554 225 "},"‘":{"x_min":86.5,"x_max":303.171875,"ha":374,"o":"m 224 659 q 193 594 212 620 q 140 568 174 568 q 86 615 86 568 q 98 660 86 633 q 122 708 110 687 l 271 951 l 303 942 l 224 659 "},"ϊ":{"x_min":-29,"x_max":362,"ha":342,"o":"m 104 333 l 104 520 q 103 566 104 544 q 96 654 102 588 q 140 647 130 648 q 165 647 151 647 q 232 654 195 647 q 224 555 225 599 q 223 437 223 511 l 223 406 q 228 194 223 337 q 233 0 233 51 q 201 3 216 1 q 165 5 185 5 q 127 3 148 5 q 96 0 107 1 q 100 165 96 51 q 104 333 104 279 m 45 928 q 99 907 77 928 q 122 853 122 886 q 101 800 122 822 q 48 778 80 778 q -6 800 15 778 q -29 853 -29 822 q -7 906 -29 884 q 45 928 13 928 m 286 928 q 340 906 318 928 q 362 853 362 884 q 341 799 362 821 q 289 778 321 778 q 235 800 257 778 q 213 853 213 822 q 233 905 213 883 q 286 928 254 928 "},"π":{"x_min":19,"x_max":957,"ha":989,"o":"m 702 5 l 635 0 q 639 114 635 44 q 643 196 643 185 l 643 575 l 508 575 l 373 575 l 369 284 q 373 143 369 236 q 377 0 377 50 q 345 3 360 1 q 309 5 329 5 q 271 3 292 5 q 239 0 250 1 l 248 196 l 243 575 q 130 553 171 575 q 43 472 89 532 q 19 559 35 519 q 139 627 71 611 q 305 644 207 644 l 658 644 l 852 644 l 957 651 l 951 610 l 957 566 l 769 575 l 765 310 q 769 154 765 257 q 773 0 773 51 q 739 3 755 1 q 702 5 724 5 "},"ά":{"x_min":41,"x_max":827.109375,"ha":846,"o":"m 705 352 q 803 -1 763 155 l 739 1 l 673 -1 l 632 172 q 521 36 593 87 q 356 -15 448 -15 q 129 81 217 -15 q 41 316 41 177 q 130 569 41 467 q 368 672 220 672 q 537 622 464 672 q 659 486 610 573 q 711 654 691 569 l 770 650 l 827 654 q 763 505 792 576 q 705 352 734 434 m 518 943 q 552 974 536 964 q 589 985 568 985 q 626 969 611 985 q 641 932 641 953 q 627 897 641 911 q 585 866 613 883 l 384 743 l 335 743 l 518 943 m 377 619 q 226 530 272 619 q 181 326 181 442 q 223 124 181 214 q 367 34 265 34 q 528 137 480 34 q 601 323 577 240 q 527 531 578 444 q 377 619 475 619 "},"O":{"x_min":51,"x_max":1068,"ha":1119,"o":"m 51 465 q 192 820 51 690 q 559 950 333 950 q 892 853 754 950 q 1047 654 1031 757 q 1065 525 1062 551 q 1068 462 1068 500 q 1065 402 1068 426 q 1047 277 1062 379 q 894 80 1031 175 q 560 -15 756 -15 q 447 -10 496 -15 q 304 29 398 -5 q 130 186 210 64 q 51 465 51 308 m 202 468 q 290 162 202 282 q 559 42 379 42 q 826 162 738 42 q 915 468 915 283 q 825 770 915 651 q 559 889 735 889 q 348 826 429 889 q 225 639 267 764 q 202 468 202 552 "},"n":{"x_min":89,"x_max":661,"ha":754,"o":"m 99 155 l 99 495 q 97 569 99 530 q 91 655 95 608 q 153 648 122 648 l 219 656 l 218 539 q 319 635 260 599 q 451 672 378 672 q 591 624 528 672 q 654 501 654 576 l 654 299 l 654 136 l 661 0 q 629 3 644 1 q 593 5 613 5 q 556 3 576 5 q 525 0 536 1 q 530 222 525 80 q 535 406 535 364 q 501 536 535 485 q 389 587 467 587 q 253 508 288 587 q 218 313 218 430 q 220 132 218 258 q 222 0 222 6 q 184 3 208 0 q 155 6 159 6 q 117 3 141 6 q 89 0 93 0 l 99 155 "},"3":{"x_min":75,"x_max":644,"ha":749,"o":"m 241 465 l 238 512 l 294 510 q 424 554 375 510 q 474 680 474 599 q 434 805 474 754 q 322 856 394 856 q 220 818 257 856 q 164 711 183 780 l 153 706 q 127 767 136 747 q 99 819 118 788 q 220 886 162 863 q 348 909 278 909 q 526 857 450 909 q 603 706 603 805 q 542 564 603 617 q 383 479 482 511 q 567 423 490 479 q 644 262 644 366 q 542 55 644 129 q 302 -18 441 -18 q 183 -6 240 -18 q 75 32 127 5 q 99 189 91 116 l 113 188 q 182 73 136 115 q 302 31 229 31 q 448 92 392 31 q 505 246 505 154 q 451 389 505 333 q 312 446 398 446 q 238 435 279 446 l 241 465 "},"9":{"x_min":57,"x_max":688,"ha":749,"o":"m 261 38 q 475 166 405 38 q 546 451 546 295 q 442 378 494 403 q 325 354 389 354 q 132 428 208 354 q 57 617 57 502 q 148 828 57 748 q 372 909 240 909 q 612 801 536 909 q 688 520 688 693 q 574 143 688 305 q 252 -18 461 -18 q 186 -14 211 -18 q 127 0 161 -11 l 113 90 q 180 51 143 64 q 261 38 218 38 m 372 419 q 501 482 457 419 q 546 634 546 545 q 504 790 546 725 q 373 855 462 855 q 238 791 284 855 q 193 637 193 727 q 238 482 193 545 q 372 419 284 419 "},"l":{"x_min":100,"x_max":237.5,"ha":342,"o":"m 107 118 l 107 881 q 104 965 107 915 q 101 1025 101 1016 q 169 1018 138 1018 q 237 1025 203 1018 q 228 872 230 948 q 226 684 226 797 l 226 512 l 232 111 l 237 0 q 205 3 220 1 q 169 5 189 5 q 131 3 152 5 q 100 0 111 1 l 107 118 "},"κ":{"x_min":97,"x_max":677.5625,"ha":683,"o":"m 104 365 q 100 531 104 428 q 97 655 97 634 q 164 647 134 647 q 231 654 196 647 q 227 516 231 608 q 223 377 223 425 l 258 377 q 386 498 323 431 q 528 654 449 565 q 588 647 563 647 q 640 647 613 647 q 672 652 662 651 l 358 387 l 548 165 q 608 93 577 127 q 677 19 638 59 l 677 0 q 628 3 659 0 q 591 6 596 6 q 544 3 567 6 q 510 0 520 0 q 437 100 477 47 q 360 196 398 153 l 269 308 l 252 323 l 223 326 q 227 163 223 274 q 231 0 231 52 l 164 5 l 97 0 q 100 208 97 77 q 104 365 104 339 "},"4":{"x_min":39,"x_max":691.78125,"ha":749,"o":"m 453 252 l 177 257 l 39 253 l 39 291 q 204 522 111 392 q 345 721 297 653 q 475 906 394 789 l 527 906 l 581 906 q 575 805 581 872 q 569 705 569 739 l 569 343 l 598 343 q 644 344 620 343 q 690 350 667 345 l 683 297 q 686 270 683 287 q 691 244 689 254 q 568 253 629 253 l 568 137 l 569 0 l 505 6 l 437 0 q 450 120 447 51 q 453 252 453 190 m 453 767 l 344 626 q 230 465 298 562 q 144 343 162 368 l 453 343 l 453 767 "},"p":{"x_min":83,"x_max":702,"ha":758,"o":"m 91 -106 q 89 202 91 47 q 87 513 88 358 l 83 655 q 109 650 95 652 q 146 648 124 648 q 177 650 165 648 q 213 655 188 651 q 202 535 202 591 q 297 637 246 602 q 425 672 349 672 q 630 567 558 672 q 702 322 702 463 q 629 84 702 183 q 423 -15 556 -15 q 210 99 287 -15 l 210 -101 q 214 -244 210 -148 q 219 -373 219 -340 q 185 -369 201 -370 q 151 -368 170 -368 q 130 -368 138 -368 q 83 -373 123 -368 q 87 -240 83 -329 q 91 -106 91 -151 m 384 596 q 245 514 289 596 q 202 328 202 433 q 244 134 202 220 q 383 48 286 48 q 520 131 478 48 q 563 322 563 215 q 519 509 563 423 q 384 596 475 596 "},"ψ":{"x_min":78,"x_max":1002,"ha":1038,"o":"m 78 294 l 82 477 l 82 654 l 145 650 l 215 654 q 209 517 215 605 q 203 421 203 430 l 203 341 q 264 117 203 197 q 465 38 325 38 l 468 260 q 461 535 468 342 q 455 786 455 729 q 496 779 479 782 q 526 776 513 776 q 566 780 545 776 q 600 786 587 784 q 591 496 600 690 q 583 270 583 302 l 587 38 q 791 132 715 38 q 867 357 867 227 q 824 641 867 506 q 885 645 857 641 q 960 656 912 648 q 1002 419 1002 544 q 891 118 1002 231 q 587 -13 780 5 l 591 -221 l 600 -372 q 561 -365 578 -367 q 526 -363 543 -363 q 491 -366 511 -363 q 455 -372 471 -369 q 461 -162 455 -302 q 468 -13 468 -22 q 194 64 310 -13 q 78 294 78 142 "},"Ü":{"x_min":101,"x_max":919.0625,"ha":1015,"o":"m 182 927 l 262 931 q 250 805 253 854 q 247 697 247 757 l 247 457 q 314 136 247 212 q 516 60 381 60 q 733 130 654 60 q 813 336 813 201 l 813 458 l 813 657 q 799 931 813 802 l 859 927 l 919 931 q 905 770 909 863 q 901 600 901 677 l 901 366 q 792 82 901 179 q 491 -15 684 -15 q 211 66 307 -15 q 116 325 116 148 l 116 426 l 116 698 q 112 805 116 757 q 101 931 109 854 l 182 927 m 410 1208 q 462 1186 442 1208 q 483 1133 483 1164 q 460 1081 483 1105 q 410 1058 438 1058 q 356 1080 379 1058 q 334 1133 334 1103 q 356 1185 334 1163 q 410 1208 378 1208 m 650 1208 q 704 1187 682 1208 q 727 1133 727 1166 q 704 1080 727 1103 q 650 1058 681 1058 q 598 1078 620 1058 q 576 1133 576 1099 q 598 1185 576 1163 q 650 1208 620 1208 "},"à":{"x_min":43,"x_max":655.5,"ha":649,"o":"m 234 -15 q 98 33 153 -15 q 43 162 43 82 q 106 303 43 273 q 303 364 169 333 q 444 448 437 395 q 403 568 444 521 q 288 616 362 616 q 191 587 233 616 q 124 507 149 559 l 95 520 l 104 591 q 202 651 144 631 q 323 672 261 672 q 500 622 444 672 q 557 455 557 573 l 557 133 q 567 69 557 84 q 618 54 577 54 q 655 58 643 54 l 655 26 q 594 5 626 14 q 537 -6 562 -3 q 438 85 453 -6 q 342 10 388 35 q 234 -15 296 -15 m 392 743 l 191 866 q 152 896 170 877 q 133 934 133 915 q 148 970 133 955 q 186 986 163 986 q 222 972 200 986 q 254 945 245 958 l 442 743 l 392 743 m 176 186 q 204 98 176 133 q 284 64 232 64 q 390 107 342 64 q 438 212 438 151 l 438 345 q 239 293 303 319 q 176 186 176 268 "},"η":{"x_min":91,"x_max":662,"ha":754,"o":"m 594 -365 q 557 -366 577 -365 q 526 -369 537 -368 q 531 -189 526 -310 q 537 -7 537 -68 l 537 406 q 503 536 537 485 q 391 587 469 587 q 255 508 290 587 q 220 315 220 430 q 222 133 220 259 q 224 1 224 8 l 158 6 l 91 1 l 101 156 l 101 495 q 97 584 101 527 q 93 655 93 640 q 119 650 105 652 q 155 648 134 648 q 185 650 175 648 q 221 655 195 651 l 220 538 q 321 637 265 602 q 452 672 378 672 q 604 603 552 672 q 656 430 656 535 l 656 329 l 656 -186 q 659 -293 656 -227 q 662 -370 662 -359 q 630 -366 645 -368 q 594 -365 614 -365 "}},"cssFontWeight":"normal","ascender":1267,"underlinePosition":-133,"cssFontStyle":"normal","boundingBox":{"yMin":-373.75,"xMin":-71,"yMax":1267,"xMax":1511},"resolution":1000,"original_font_information":{"postscript_name":"Optimer-Regular","version_string":"Version 1.00 2004 initial release","vendor_url":"http://www.magenta.gr/","full_font_name":"Optimer","font_family_name":"Optimer","copyright":"Copyright (c) Magenta Ltd., 2004","description":"","trademark":"","designer":"","designer_url":"","unique_font_identifier":"Magenta Ltd.:Optimer:22-10-104","license_url":"http://www.ellak.gr/fonts/MgOpen/license.html","license_description":"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\"Fonts\") and associated documentation files (the \"Font Software\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \r\n\r\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\r\n\r\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \"MgOpen\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\r\n\r\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \"MgOpen\" name.\r\n\r\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \r\n\r\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.","manufacturer_name":"Magenta Ltd.","font_sub_family_name":"Regular"},"descender":-374,"familyName":"Optimer","lineHeight":1640,"underlineThickness":20} ================================================ FILE: examples/resources/lensflare/LICENSE.txt ================================================ lensflare0.png lensflare1.png lensflare2.png lensflare3.png 3D assets and textures for ROME "3 Dreams of Black" at http://www.ro.me are licensed under a Creative CommonsAttribution-NonCommercial-ShareAlike 3.0 Unported License ( http://creativecommons.org/licenses/by-nc-sa/3.0/ ). --------------------------------------------------------------------------- hexangle.png CC0 - Public Domain Donation by hackcraft.de http://opengameart.org/content/lens-flares-and-particles http://creativecommons.org/publicdomain/zero/1.0/ ================================================ FILE: examples/resources/models/assimp/interior/interior.assimp.json ================================================ { "__metadata__": { "format" : "assimp2json" ,"version": 100 } ,"rootnode": { "name": "<3DSRoot>" ,"transformation": [ 1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ] ,"children": [ { "name": "Box01" ,"transformation": [ -1.20922e-008 ,0.101437 ,9.06915e-009 ,-0.243822 ,0 ,-1.20922e-008 ,0.101437 ,0.00185142 ,0.101437 ,9.06915e-009 ,0 ,0.0490567 ,0 ,0 ,0 ,1 ] ,"meshes": [ 0 ] } ,{ "name": "Box02" ,"transformation": [ -1.20922e-008 ,0.101437 ,9.06915e-009 ,-0.0708746 ,0 ,-1.20922e-008 ,0.101437 ,0.00185238 ,0.101437 ,9.06915e-009 ,0 ,-9.95899 ,0 ,0 ,0 ,1 ] ,"meshes": [ 1 ] } ,{ "name": "Box04" ,"transformation": [ 0.101437 ,1.80188e-016 ,4.43394e-009 ,9.64867 ,-4.43394e-009 ,6.0461e-009 ,0.101437 ,0.0018519 ,-1.80188e-016 ,-0.101437 ,6.0461e-009 ,0.0215668 ,0 ,0 ,0 ,1 ] ,"meshes": [ 3 ] } ,{ "name": "Box05" ,"transformation": [ 0.0522438 ,0.0869483 ,6.0461e-009 ,4.86169 ,-6.0461e-009 ,0 ,0.101437 ,0.00185238 ,0.0869483 ,-0.0522438 ,6.0461e-009 ,-7.55933 ,0 ,0 ,0 ,1 ] ,"meshes": [ 2 ] } ,{ "name": "Box06" ,"transformation": [ 0.0468383 ,0.0899755 ,0 ,6.39023 ,-9.06915e-009 ,6.0461e-009 ,0.101437 ,0.00185238 ,0.0899755 ,-0.0468383 ,1.20922e-008 ,-5.19486 ,0 ,0 ,0 ,1 ] ,"meshes": [ 2 ] } ,{ "name": "Box07" ,"transformation": [ 0.0723498 ,0.071098 ,0 ,5.66533 ,-6.0461e-009 ,0 ,0.101437 ,2.0261 ,0.071098 ,-0.0723498 ,0 ,-6.25246 ,0 ,0 ,0 ,1 ] ,"meshes": [ 2 ] } ,{ "name": "Box08" ,"transformation": [ 1.20922e-008 ,-0.101437 ,0 ,-0.427656 ,0 ,0 ,0.101437 ,0.00185095 ,-0.101437 ,-1.81383e-008 ,0 ,10.0504 ,0 ,0 ,0 ,1 ] ,"meshes": [ 1 ] } ,{ "name": "Box09" ,"transformation": [ -0.101437 ,-1.29215e-008 ,-3.80372e-010 ,-10.1472 ,-3.80372e-010 ,-1.20922e-008 ,0.101437 ,0.00185238 ,-1.29215e-008 ,0.101437 ,6.0461e-009 ,0.0585555 ,0 ,0 ,0 ,1 ] ,"meshes": [ 4 ] } ,{ "name": "Box10" ,"transformation": [ -1.20922e-008 ,0.101437 ,9.06915e-009 ,-0.243822 ,0 ,-1.20922e-008 ,0.101437 ,10.2303 ,0.101437 ,9.06915e-009 ,0 ,0.0490569 ,0 ,0 ,0 ,1 ] ,"meshes": [ 0 ] } ] } ,"flags": 8 ,"meshes": [ { "name": "0" ,"materialindex": 0 ,"primitivetypes": 4 ,"vertices": [ -100.483 ,99.5169 ,-1.86265e-009 ,-100.483 ,-99.5169 ,0 ,100.483 ,99.5169 ,-1.86265e-009 ,100.483 ,-99.5169 ,0 ,100.483 ,-99.5169 ,-1.93237 ,-100.483 ,-99.5169 ,-1.93237 ,100.483 ,99.5169 ,-1.93237 ,-100.483 ,99.5169 ,-1.93237 ,100.483 ,-99.5169 ,0 ,-100.483 ,-99.5169 ,0 ,100.483 ,-99.5169 ,-1.93237 ,-100.483 ,-99.5169 ,-1.93237 ,100.483 ,99.5169 ,-1.86265e-009 ,100.483 ,-99.5169 ,0 ,100.483 ,99.5169 ,-1.93237 ,100.483 ,-99.5169 ,-1.93237 ,-100.483 ,99.5169 ,-1.86265e-009 ,100.483 ,99.5169 ,-1.86265e-009 ,-100.483 ,99.5169 ,-1.93237 ,100.483 ,99.5169 ,-1.93237 ,-100.483 ,-99.5169 ,0 ,-100.483 ,99.5169 ,-1.86265e-009 ,-100.483 ,-99.5169 ,-1.93237 ,-100.483 ,99.5169 ,-1.93237 ] ,"normals": [ -3.77254e-013 ,-1.38133e-013 ,0.101437 ,-3.77254e-013 ,-1.38355e-013 ,0.101437 ,-3.77254e-013 ,-1.38355e-013 ,0.101437 ,-3.77254e-013 ,-1.38355e-013 ,0.101437 ,-1.70011e-011 ,1.41759e-011 ,-0.101437 ,2.00728e-011 ,-2.32577e-011 ,-0.101437 ,2.00728e-011 ,-2.32577e-011 ,-0.101437 ,5.71465e-011 ,-6.06915e-011 ,-0.101437 ,1.51153e-009 ,-0.101437 ,-3.02305e-009 ,1.51153e-009 ,-0.101437 ,-3.02305e-009 ,1.51153e-009 ,-0.101437 ,-3.02305e-009 ,1.51153e-009 ,-0.101437 ,-3.02305e-009 ,0.101437 ,-1.76847e-009 ,6.0461e-009 ,0.101437 ,-1.76847e-009 ,6.0461e-009 ,0.101437 ,-1.76847e-009 ,6.0461e-009 ,0.101437 ,-1.76847e-009 ,6.0461e-009 ,3.23392e-009 ,0.101437 ,3.02305e-009 ,3.23392e-009 ,0.101437 ,3.02305e-009 ,3.23392e-009 ,0.101437 ,3.02305e-009 ,3.23392e-009 ,0.101437 ,3.02305e-009 ,-0.101437 ,-3.02305e-009 ,4.87481e-007 ,-0.101437 ,-6.27291e-010 ,2.40717e-007 ,-0.101437 ,-6.27291e-010 ,2.40717e-007 ,-0.101437 ,1.76847e-009 ,-6.0461e-009 ] ,"tangents": [ 1 ,1.99309e-007 ,3.82652e-014 ,1 ,1.99309e-007 ,3.82652e-014 ,1 ,1.99309e-007 ,3.82652e-014 ,1 ,2.37272e-007 ,3.82652e-014 ,-1 ,-2.37272e-007 ,5.88802e-010 ,-1 ,-2.37272e-007 ,5.85041e-010 ,-1 ,-2.37272e-007 ,5.85041e-010 ,-1 ,-1.99309e-007 ,-5.79661e-012 ,1 ,1.53324e-010 ,4.56942e-018 ,1 ,1.53324e-010 ,4.56942e-018 ,1 ,1.53324e-010 ,4.56942e-018 ,1 ,1.53324e-010 ,-5.93181e-010 ,7.60549e-008 ,1 ,-9.35847e-012 ,7.60549e-008 ,1 ,-9.35847e-012 ,7.60549e-008 ,1 ,-9.35847e-012 ,7.60549e-008 ,1 ,-3.63256e-017 ,-1 ,3.7901e-008 ,-1.86516e-018 ,-1 ,3.7901e-008 ,-1.86516e-018 ,-1 ,3.7901e-008 ,-1.86516e-018 ,-1 ,3.7901e-008 ,-1.86516e-018 ,3.06648e-010 ,-1 ,9.35696e-012 ,6.36304e-011 ,-1 ,9.35828e-012 ,6.36304e-011 ,-1 ,9.35828e-012 ,-3.81171e-008 ,-1 ,5.9894e-010 ] ,"bitangents": [ 2.39576e-007 ,-1 ,9.24813e-012 ,2.39576e-007 ,-1 ,9.24811e-012 ,2.39576e-007 ,-1 ,9.24811e-012 ,1.62912e-007 ,-1 ,9.24811e-012 ,1.62912e-007 ,-1 ,-1.4381e-012 ,1.62912e-007 ,-1 ,2.35905e-012 ,1.62912e-007 ,-1 ,2.35905e-012 ,2.01244e-007 ,-1 ,5.98934e-010 ,-4.56942e-018 ,3.06648e-010 ,-1 ,-4.56942e-018 ,3.06648e-010 ,-1 ,-4.56942e-018 ,3.06648e-010 ,-1 ,-3.94822e-006 ,3.06648e-010 ,-1 ,6.13297e-010 ,-1.06923e-017 ,-1 ,6.13297e-010 ,-1.06923e-017 ,-1 ,6.13297e-010 ,-1.06923e-017 ,-1 ,6.13297e-010 ,-1.06923e-017 ,-1 ,9.77631e-018 ,3.06648e-010 ,-1 ,9.77631e-018 ,3.06648e-010 ,-1 ,9.77631e-018 ,3.06648e-010 ,-1 ,9.77631e-018 ,3.06648e-010 ,-1 ,-3.95704e-006 ,-2.62965e-016 ,-1 ,-3.93201e-006 ,1.00227e-016 ,-1 ,-3.93201e-006 ,1.00227e-016 ,-1 ,6.13297e-010 ,-1.06923e-017 ,-1 ] ,"numuvcomponents": [ 2 ] ,"texturecoords": [ [ -0.00966144 ,3.99034 ,-0.00966239 ,0.00966239 ,4.00966 ,3.99034 ,4.00966 ,0.00966144 ,-0.00966144 ,0.00966144 ,4.00966 ,0.00966239 ,-0.00966239 ,3.99034 ,4.00966 ,3.99034 ,4.00966 ,2.01932 ,-0.00966239 ,2.01932 ,4.00966 ,1.98068 ,-0.00966239 ,1.98068 ,3.99034 ,2.01932 ,0.00966144 ,2.01932 ,3.99034 ,1.98068 ,0.00966144 ,1.98068 ,4.00966 ,2.01932 ,-0.00966239 ,2.01932 ,4.00966 ,1.98068 ,-0.00966239 ,1.98068 ,3.99034 ,2.01932 ,0.00966144 ,2.01932 ,3.99034 ,1.98068 ,0.00966144 ,1.98068 ] ] ,"faces": [ [ 0 ,1 ,2 ] ,[ 3 ,2 ,1 ] ,[ 4 ,5 ,6 ] ,[ 7 ,6 ,5 ] ,[ 8 ,9 ,10 ] ,[ 11 ,10 ,9 ] ,[ 12 ,13 ,14 ] ,[ 15 ,14 ,13 ] ,[ 16 ,17 ,18 ] ,[ 19 ,18 ,17 ] ,[ 20 ,21 ,22 ] ,[ 23 ,22 ,21 ] ] } ,{ "name": "1" ,"materialindex": 1 ,"primitivetypes": 4 ,"vertices": [ -1.93237 ,-97.4285 ,8.19564e-008 ,-1.93237 ,93.9098 ,-7.63685e-008 ,1.93237 ,93.9098 ,-1.30385e-007 ,1.93236 ,-97.4285 ,2.79397e-008 ,-1.93237 ,-97.4285 ,99.5169 ,1.93237 ,-97.4285 ,99.5169 ,1.93236 ,93.9098 ,99.5169 ,-1.93237 ,93.9098 ,99.5169 ,-1.93237 ,-97.4285 ,8.19564e-008 ,1.93236 ,-97.4285 ,2.79397e-008 ,1.93237 ,-97.4285 ,99.5169 ,-1.93237 ,-97.4285 ,99.5169 ,1.93236 ,-97.4285 ,2.79397e-008 ,1.93237 ,93.9098 ,-1.30385e-007 ,1.93236 ,93.9098 ,99.5169 ,1.93237 ,-97.4285 ,99.5169 ,1.93237 ,93.9098 ,-1.30385e-007 ,-1.93237 ,93.9098 ,-7.63685e-008 ,-1.93237 ,93.9098 ,99.5169 ,1.93236 ,93.9098 ,99.5169 ,-1.93237 ,93.9098 ,-7.63685e-008 ,-1.93237 ,-97.4285 ,8.19564e-008 ,-1.93237 ,-97.4285 ,99.5169 ,-1.93237 ,93.9098 ,99.5169 ] ,"normals": [ -1.43508e-009 ,-8.37691e-011 ,-0.101437 ,-1.43508e-009 ,-8.37691e-011 ,-0.101437 ,-1.43508e-009 ,-8.37691e-011 ,-0.101437 ,-1.43508e-009 ,-8.37691e-011 ,-0.101437 ,-3.02305e-009 ,3.47271e-009 ,0.101437 ,-3.02305e-009 ,3.47271e-009 ,0.101437 ,-3.02305e-009 ,3.47271e-009 ,0.101437 ,-3.02305e-009 ,3.47271e-009 ,0.101437 ,1.51153e-009 ,-0.101437 ,-3.02305e-009 ,1.51153e-009 ,-0.101437 ,-3.02305e-009 ,1.51153e-009 ,-0.101437 ,-3.02305e-009 ,1.51153e-009 ,-0.101437 ,-3.02305e-009 ,0.101437 ,5.30934e-010 ,1.25458e-009 ,0.101437 ,-1.96118e-009 ,6.0461e-009 ,0.101437 ,5.30934e-010 ,1.25458e-009 ,0.101437 ,3.02305e-009 ,-3.53694e-009 ,-1.51153e-009 ,0.101437 ,3.02305e-009 ,-1.51153e-009 ,0.101437 ,3.02305e-009 ,-1.51153e-009 ,0.101437 ,3.02305e-009 ,-1.51153e-009 ,0.101437 ,3.02305e-009 ,-0.101437 ,1.96118e-009 ,3.53694e-009 ,-0.101437 ,1.96118e-009 ,3.53694e-009 ,-0.101437 ,1.96118e-009 ,3.53694e-009 ,-0.101437 ,1.96118e-009 ,3.53694e-009 ] ,"tangents": [ -1 ,1.4501e-021 ,1.39786e-008 ,-1 ,1.4501e-021 ,1.39786e-008 ,-1 ,1.4501e-021 ,1.39786e-008 ,-1 ,1.4501e-021 ,1.39786e-008 ,1 ,1.04982e-017 ,3.06648e-010 ,1 ,1.04982e-017 ,3.06648e-010 ,1 ,1.04982e-017 ,3.06648e-010 ,1 ,1.04982e-017 ,3.06648e-010 ,1 ,1.53324e-010 ,-1.39768e-008 ,1 ,1.53324e-010 ,-1.39768e-008 ,1 ,1.53324e-010 ,-1.39768e-008 ,1 ,1.53324e-010 ,4.56942e-018 ,3.94097e-008 ,1 ,-8.2746e-010 ,3.96625e-008 ,1 ,-8.2746e-010 ,3.94097e-008 ,1 ,-8.2746e-010 ,-3.97702e-008 ,1 ,-3.98739e-008 ,-1 ,-1.53324e-010 ,1.39768e-008 ,-1 ,-1.53324e-010 ,1.39768e-008 ,-1 ,-1.53324e-010 ,1.39768e-008 ,-1 ,-1.53324e-010 ,-4.56942e-018 ,-3.96625e-008 ,-1 ,8.2746e-010 ,-3.96625e-008 ,-1 ,8.2746e-010 ,-3.96625e-008 ,-1 ,8.2746e-010 ,-1.98936e-010 ,-1 ,3.98739e-008 ] ,"bitangents": [ 2.09338e-007 ,-1 ,8.2744e-010 ,2.09338e-007 ,-1 ,8.2744e-010 ,2.09338e-007 ,-1 ,8.2744e-010 ,2.09338e-007 ,-1 ,8.2744e-010 ,2.90176e-007 ,-1 ,3.98158e-008 ,2.90176e-007 ,-1 ,3.98158e-008 ,2.90176e-007 ,-1 ,3.98158e-008 ,2.49874e-007 ,-1 ,3.98158e-008 ,-7.74879e-008 ,3.06648e-010 ,-1 ,-7.74879e-008 ,3.06648e-010 ,-1 ,-7.74879e-008 ,3.06648e-010 ,-1 ,-7.74879e-008 ,3.06648e-010 ,-1 ,7.60027e-008 ,-3.46275e-018 ,-1 ,7.64888e-008 ,3.39378e-018 ,-1 ,7.60027e-008 ,-3.46275e-018 ,-1 ,-7.62343e-008 ,1.28166e-017 ,-1 ,-4.56942e-018 ,3.06648e-010 ,-1 ,-4.56942e-018 ,3.06648e-010 ,-1 ,-4.56942e-018 ,3.06648e-010 ,-1 ,7.74879e-008 ,3.06648e-010 ,-1 ,-7.62343e-008 ,-8.31471e-018 ,-1 ,-7.62343e-008 ,-8.31471e-018 ,-1 ,-7.62343e-008 ,-8.31471e-018 ,-1 ,-3.58775e-010 ,6.93657e-018 ,-1 ] ,"numuvcomponents": [ 2 ] ,"texturecoords": [ [ 0.519324 ,-0.509662 ,0.519323 ,1.50966 ,0.480676 ,1.50966 ,0.480677 ,-0.509662 ,0.480676 ,-0.509662 ,0.519323 ,-0.509662 ,0.519324 ,1.50966 ,0.480677 ,1.50966 ,0.480676 ,0.00241548 ,0.519323 ,0.00241548 ,0.519323 ,0.997585 ,0.480676 ,0.997585 ,-0.509662 ,0.00241548 ,1.50966 ,0.00241548 ,1.50966 ,0.997585 ,-0.509662 ,0.997585 ,0.480676 ,0.00241548 ,0.519323 ,0.00241548 ,0.519323 ,0.997585 ,0.480676 ,0.997585 ,-0.509662 ,0.00241548 ,1.50966 ,0.00241548 ,1.50966 ,0.997585 ,-0.509662 ,0.997585 ] ] ,"faces": [ [ 0 ,1 ,2 ] ,[ 2 ,3 ,0 ] ,[ 4 ,5 ,6 ] ,[ 6 ,7 ,4 ] ,[ 8 ,9 ,10 ] ,[ 10 ,11 ,8 ] ,[ 12 ,13 ,14 ] ,[ 14 ,15 ,12 ] ,[ 16 ,17 ,18 ] ,[ 18 ,19 ,16 ] ,[ 20 ,21 ,22 ] ,[ 22 ,23 ,20 ] ] } ,{ "name": "3" ,"materialindex": 2 ,"primitivetypes": 4 ,"vertices": [ -9.99999 ,-9.99999 ,3.72529e-009 ,-9.99999 ,10 ,1.86265e-009 ,10 ,10 ,1.86265e-009 ,10 ,-9.99999 ,1.86265e-009 ,-10 ,-10 ,20 ,10 ,-10 ,20 ,10 ,10 ,20 ,-9.99999 ,10 ,20 ,-9.99999 ,-9.99999 ,3.72529e-009 ,10 ,-9.99999 ,1.86265e-009 ,10 ,-10 ,20 ,-10 ,-10 ,20 ,10 ,-9.99999 ,1.86265e-009 ,10 ,10 ,1.86265e-009 ,10 ,10 ,20 ,10 ,-10 ,20 ,10 ,10 ,1.86265e-009 ,-9.99999 ,10 ,1.86265e-009 ,-9.99999 ,10 ,20 ,10 ,10 ,20 ,-9.99999 ,10 ,1.86265e-009 ,-9.99999 ,-9.99999 ,3.72529e-009 ,-10 ,-10 ,20 ,-9.99999 ,10 ,20 ] ,"normals": [ -4.3574e-012 ,-5.33795e-013 ,-0.101437 ,-4.36096e-012 ,-5.29354e-013 ,-0.101437 ,-4.3574e-012 ,-5.33795e-013 ,-0.101437 ,-4.3574e-012 ,-5.33795e-013 ,-0.101437 ,5.2823e-010 ,-4.14386e-009 ,0.101437 ,5.28228e-010 ,-4.14386e-009 ,0.101437 ,5.2823e-010 ,-4.14386e-009 ,0.101437 ,5.28232e-010 ,-4.14386e-009 ,0.101437 ,0 ,-0.101437 ,-2.30238e-009 ,3.72529e-009 ,-0.101437 ,-8.17843e-009 ,0 ,-0.101437 ,-2.30238e-009 ,-7.45058e-009 ,-0.101437 ,3.57366e-009 ,0.101437 ,3.72529e-009 ,8.20599e-009 ,0.101437 ,1.86265e-008 ,-7.95311e-009 ,0.101437 ,3.72529e-009 ,8.20599e-009 ,0.101437 ,-1.11759e-008 ,2.43651e-008 ,-1.49012e-008 ,0.101437 ,-6.35636e-010 ,-1.49012e-008 ,0.101437 ,-6.35636e-010 ,-1.49012e-008 ,0.101437 ,-6.35636e-010 ,-1.49012e-008 ,0.101437 ,-6.35636e-010 ,-0.101437 ,1.11759e-008 ,-5.26798e-009 ,-0.101437 ,-7.45058e-009 ,-1.84891e-008 ,-0.101437 ,1.11759e-008 ,-5.26798e-009 ,-0.101437 ,2.23517e-008 ,7.95311e-009 ] ,"tangents": [ -1 ,-5.72777e-007 ,4.42023e-013 ,-1 ,-5.72777e-007 ,4.42383e-013 ,-1 ,-5.72777e-007 ,4.42023e-013 ,-1 ,-2.86388e-007 ,9.2616e-011 ,1 ,2.38657e-007 ,-5.35818e-011 ,1 ,2.38657e-007 ,-5.35817e-011 ,1 ,2.38657e-007 ,-5.35818e-011 ,1 ,6.20127e-007 ,-5.35818e-011 ,1 ,2.17507e-020 ,-9.31323e-011 ,1 ,3.77881e-010 ,-9.31322e-011 ,1 ,2.17507e-020 ,-9.31323e-011 ,1 ,-7.55763e-010 ,2.66258e-017 ,-3.77923e-007 ,1 ,2.86962e-016 ,-3.79434e-007 ,1 ,-1.59608e-016 ,-3.77923e-007 ,1 ,2.86962e-016 ,1.13364e-009 ,1 ,2.72301e-016 ,-1 ,-3.79056e-007 ,-1.51243e-017 ,-1 ,-3.79056e-007 ,-1.51243e-017 ,-1 ,-3.79056e-007 ,-1.51243e-017 ,-1 ,-3.79056e-007 ,-1.51243e-017 ,-1.13364e-009 ,-1 ,9.31322e-011 ,7.55763e-010 ,-1 ,9.31324e-011 ,-1.13364e-009 ,-1 ,9.31322e-011 ,-3.79812e-007 ,-1 ,-1.2998e-016 ] ,"bitangents": [ 2.38657e-007 ,-1 ,9.22282e-011 ,2.38657e-007 ,-1 ,9.22277e-011 ,2.38657e-007 ,-1 ,9.22282e-011 ,5.90295e-007 ,-1 ,5.4127e-014 ,2.86388e-007 ,-1 ,-4.2034e-010 ,2.86388e-007 ,-1 ,-4.2034e-010 ,2.86388e-007 ,-1 ,-4.2034e-010 ,-9.54628e-008 ,-1 ,-4.2034e-010 ,1.90926e-007 ,3.77778e-007 ,-1 ,1.90926e-007 ,3.78374e-007 ,-1 ,1.90926e-007 ,3.77778e-007 ,-1 ,2.86388e-007 ,3.77182e-007 ,-1 ,-9.35538e-008 ,6.66073e-017 ,-1 ,-9.51929e-008 ,3.20496e-017 ,-1 ,-9.35538e-008 ,6.66073e-017 ,-1 ,2.8563e-007 ,3.81851e-007 ,-1 ,9.47171e-018 ,-6.44768e-011 ,-1 ,9.47171e-018 ,-6.44768e-011 ,-1 ,9.47171e-018 ,-6.44768e-011 ,-1 ,-9.54628e-008 ,-6.4477e-011 ,-1 ,3.78079e-007 ,3.81851e-007 ,-1 ,3.7942e-007 ,3.81851e-007 ,-1 ,3.78079e-007 ,3.81851e-007 ,-1 ,-8.06738e-010 ,1.77766e-016 ,-1 ] ,"numuvcomponents": [ 2 ] ,"texturecoords": [ [ 0.999501 ,0.000499606 ,0.9995 ,0.999501 ,0.000499487 ,0.9995 ,0.000499696 ,0.000499368 ,0.000499487 ,0.000499606 ,0.9995 ,0.000499368 ,0.999501 ,0.9995 ,0.000499696 ,0.999501 ,0.000499487 ,0.000499517 ,0.9995 ,0.000499517 ,0.9995 ,0.999501 ,0.000499487 ,0.999501 ,0.000499368 ,0.000499517 ,0.9995 ,0.000499517 ,0.9995 ,0.999501 ,0.000499368 ,0.999501 ,0.000499487 ,0.000499517 ,0.9995 ,0.000499517 ,0.9995 ,0.999501 ,0.000499487 ,0.999501 ,0.000499368 ,0.000499517 ,0.9995 ,0.000499517 ,0.9995 ,0.999501 ,0.000499368 ,0.999501 ] ] ,"faces": [ [ 0 ,1 ,2 ] ,[ 2 ,3 ,0 ] ,[ 4 ,5 ,6 ] ,[ 6 ,7 ,4 ] ,[ 8 ,9 ,10 ] ,[ 10 ,11 ,8 ] ,[ 12 ,13 ,14 ] ,[ 14 ,15 ,12 ] ,[ 16 ,17 ,18 ] ,[ 18 ,19 ,16 ] ,[ 20 ,21 ,22 ] ,[ 22 ,23 ,20 ] ] } ,{ "name": "2" ,"materialindex": 1 ,"primitivetypes": 4 ,"vertices": [ -1.93237 ,-100.745 ,-1.02445e-007 ,-1.93237 ,100.248 ,-2.98023e-008 ,1.93236 ,100.248 ,1.39698e-007 ,1.93236 ,-100.745 ,6.70552e-008 ,-1.93237 ,-100.745 ,99.5169 ,1.93236 ,-100.745 ,99.5169 ,1.93236 ,100.248 ,99.5169 ,-1.93237 ,100.248 ,99.5169 ,-1.93237 ,-100.745 ,-1.02445e-007 ,1.93236 ,-100.745 ,6.70552e-008 ,1.93236 ,-100.745 ,99.5169 ,-1.93237 ,-100.745 ,99.5169 ,1.93236 ,-100.745 ,6.70552e-008 ,1.93236 ,100.248 ,1.39698e-007 ,1.93236 ,100.248 ,99.5169 ,1.93236 ,-100.745 ,99.5169 ,1.93236 ,100.248 ,1.39698e-007 ,-1.93237 ,100.248 ,-2.98023e-008 ,-1.93237 ,100.248 ,99.5169 ,1.93236 ,100.248 ,99.5169 ,-1.93237 ,100.248 ,-2.98023e-008 ,-1.93237 ,-100.745 ,-1.02445e-007 ,-1.93237 ,-100.745 ,99.5169 ,-1.93237 ,100.248 ,99.5169 ] ,"normals": [ 4.43394e-009 ,3.56648e-011 ,-0.101437 ,4.43394e-009 ,3.56648e-011 ,-0.101437 ,4.43394e-009 ,3.56648e-011 ,-0.101437 ,4.43394e-009 ,3.56648e-011 ,-0.101437 ,-4.43394e-009 ,-2.14222e-009 ,0.101437 ,-4.43394e-009 ,-2.14222e-009 ,0.101437 ,-4.43394e-009 ,-2.14222e-009 ,0.101437 ,-4.43394e-009 ,-2.14222e-009 ,0.101437 ,2.387e-016 ,-0.101437 ,2.50916e-009 ,2.387e-016 ,-0.101437 ,2.50916e-009 ,2.387e-016 ,-0.101437 ,2.50916e-009 ,2.387e-016 ,-0.101437 ,2.50916e-009 ,0.101437 ,2.83063e-016 ,-5.1491e-009 ,0.101437 ,1.83557e-016 ,-5.1491e-009 ,0.101437 ,2.83063e-016 ,-5.1491e-009 ,0.101437 ,3.82569e-016 ,-5.1491e-009 ,-2.387e-016 ,0.101437 ,-2.50916e-009 ,-2.387e-016 ,0.101437 ,-2.50916e-009 ,-2.387e-016 ,0.101437 ,-2.50916e-009 ,-2.387e-016 ,0.101437 ,-2.50916e-009 ,-0.101437 ,-1.80188e-016 ,-4.43394e-009 ,-0.101437 ,-1.80188e-016 ,-4.43394e-009 ,-0.101437 ,-1.80188e-016 ,-4.43394e-009 ,-0.101437 ,-1.80188e-016 ,-4.43394e-009 ] ,"tangents": [ -1 ,-5.31936e-022 ,-4.38569e-008 ,-1 ,-5.31936e-022 ,-4.38569e-008 ,-1 ,-5.31936e-022 ,-4.38569e-008 ,-1 ,-5.31936e-022 ,-4.38569e-008 ,1 ,-9.49846e-018 ,4.49765e-010 ,1 ,-9.49846e-018 ,4.49765e-010 ,1 ,-9.49846e-018 ,4.49765e-010 ,1 ,-9.49846e-018 ,4.49765e-010 ,1 ,3.53759e-017 ,4.38584e-008 ,1 ,3.53759e-017 ,4.38584e-008 ,1 ,3.53759e-017 ,4.38584e-008 ,1 ,2.4213e-017 ,-5.98938e-025 ,-2.85243e-017 ,1 ,3.61421e-010 ,-1.84307e-017 ,1 ,3.61421e-010 ,-2.85243e-017 ,1 ,3.61421e-010 ,-5.86326e-017 ,1 ,-3.79585e-008 ,-1 ,-3.53759e-017 ,-4.38584e-008 ,-1 ,-3.53759e-017 ,-4.38584e-008 ,-1 ,-3.53759e-017 ,-4.38584e-008 ,-1 ,-2.4213e-017 ,5.98938e-025 ,1.84402e-017 ,-1 ,-3.61421e-010 ,1.84402e-017 ,-1 ,-3.61421e-010 ,1.84402e-017 ,-1 ,-3.61421e-010 ,1.2053e-018 ,-1 ,3.79585e-008 ] ,"bitangents": [ 2.3724e-007 ,-1 ,-3.61309e-010 ,2.3724e-007 ,-1 ,-3.61309e-010 ,2.3724e-007 ,-1 ,-3.61309e-010 ,2.3724e-007 ,-1 ,-3.61309e-010 ,2.37871e-007 ,-1 ,3.73506e-008 ,2.37871e-007 ,-1 ,3.73506e-008 ,2.37871e-007 ,-1 ,3.73506e-008 ,2.37871e-007 ,-1 ,3.73506e-008 ,-1.25733e-024 ,-7.613e-008 ,-1 ,-1.25733e-024 ,-7.613e-008 ,-1 ,-1.25733e-024 ,-7.613e-008 ,-1 ,7.74879e-008 ,-7.613e-008 ,-1 ,-5.22308e-010 ,-1.45752e-024 ,-1 ,-5.22308e-010 ,-9.45154e-025 ,-1 ,-5.22308e-010 ,-1.45752e-024 ,-1 ,-5.22308e-010 ,-1.96989e-024 ,-1 ,7.74879e-008 ,-7.613e-008 ,-1 ,7.74879e-008 ,-7.613e-008 ,-1 ,7.74879e-008 ,-7.613e-008 ,-1 ,-1.25733e-024 ,-7.613e-008 ,-1 ,7.63252e-008 ,-6.02302e-025 ,-1 ,7.63252e-008 ,-6.02302e-025 ,-1 ,7.63252e-008 ,-6.02302e-025 ,-1 ,7.63252e-008 ,-6.02303e-025 ,-1 ] ,"numuvcomponents": [ 2 ] ,"texturecoords": [ [ 0.519324 ,-0.509662 ,0.519323 ,1.50966 ,0.480676 ,1.50966 ,0.480677 ,-0.509662 ,0.480676 ,-0.509662 ,0.519323 ,-0.509662 ,0.519324 ,1.50966 ,0.480677 ,1.50966 ,0.480676 ,0.00241548 ,0.519323 ,0.00241548 ,0.519323 ,0.997585 ,0.480676 ,0.997585 ,-0.509662 ,0.00241548 ,1.50966 ,0.00241548 ,1.50966 ,0.997585 ,-0.509662 ,0.997585 ,0.480676 ,0.00241548 ,0.519323 ,0.00241548 ,0.519323 ,0.997585 ,0.480676 ,0.997585 ,-0.509662 ,0.00241548 ,1.50966 ,0.00241548 ,1.50966 ,0.997585 ,-0.509662 ,0.997585 ] ] ,"faces": [ [ 0 ,1 ,2 ] ,[ 2 ,3 ,0 ] ,[ 4 ,5 ,6 ] ,[ 6 ,7 ,4 ] ,[ 8 ,9 ,10 ] ,[ 10 ,11 ,8 ] ,[ 12 ,13 ,14 ] ,[ 14 ,15 ,12 ] ,[ 16 ,17 ,18 ] ,[ 18 ,19 ,16 ] ,[ 20 ,21 ,22 ] ,[ 22 ,23 ,20 ] ] } ,{ "name": "7" ,"materialindex": 1 ,"primitivetypes": 4 ,"vertices": [ -1.93236 ,-100.69 ,-7.45058e-008 ,-1.93236 ,100.447 ,-7.63685e-008 ,1.93237 ,100.447 ,9.31323e-008 ,1.93237 ,-100.69 ,9.49949e-008 ,-1.93237 ,-100.69 ,99.5169 ,1.93237 ,-100.69 ,99.5169 ,1.93237 ,100.447 ,99.5169 ,-1.93237 ,100.447 ,99.5169 ,-1.93236 ,-100.69 ,-7.45058e-008 ,1.93237 ,-100.69 ,9.49949e-008 ,1.93237 ,-100.69 ,99.5169 ,-1.93237 ,-100.69 ,99.5169 ,1.93237 ,-100.69 ,9.49949e-008 ,1.93237 ,100.447 ,9.31323e-008 ,1.93237 ,100.447 ,99.5169 ,1.93237 ,-100.69 ,99.5169 ,1.93237 ,100.447 ,9.31323e-008 ,-1.93236 ,100.447 ,-7.63685e-008 ,-1.93237 ,100.447 ,99.5169 ,1.93237 ,100.447 ,99.5169 ,-1.93236 ,100.447 ,-7.63685e-008 ,-1.93236 ,-100.69 ,-7.45058e-008 ,-1.93237 ,-100.69 ,99.5169 ,-1.93237 ,100.447 ,99.5169 ] ,"normals": [ 4.43394e-009 ,-1.67688e-012 ,-0.101437 ,4.43394e-009 ,-1.67688e-012 ,-0.101437 ,4.43394e-009 ,-1.67688e-012 ,-0.101437 ,4.43394e-009 ,-1.67688e-012 ,-0.101437 ,-4.43394e-009 ,5.67379e-009 ,0.101437 ,-4.43394e-009 ,5.67379e-009 ,0.101437 ,-4.43394e-009 ,5.67379e-009 ,0.101437 ,-4.43394e-009 ,5.67379e-009 ,0.101437 ,8.86788e-009 ,-0.101437 ,7.07387e-009 ,8.86788e-009 ,-0.101437 ,7.07387e-009 ,8.86788e-009 ,-0.101437 ,7.07387e-009 ,8.86788e-009 ,-0.101437 ,7.07387e-009 ,0.101437 ,-6.14966e-010 ,-5.1491e-009 ,0.101437 ,-6.14964e-010 ,-5.1491e-009 ,0.101437 ,-6.14966e-010 ,-5.1491e-009 ,0.101437 ,-6.14965e-010 ,-5.14909e-009 ,-8.86788e-009 ,0.101437 ,2.50916e-009 ,-8.86788e-009 ,0.101437 ,2.50916e-009 ,-8.86788e-009 ,0.101437 ,2.50916e-009 ,-8.86788e-009 ,0.101437 ,2.50916e-009 ,-0.101437 ,6.14964e-010 ,-4.43394e-009 ,-0.101437 ,6.14963e-010 ,-4.43394e-009 ,-0.101437 ,6.14964e-010 ,-4.43394e-009 ,-0.101437 ,6.14965e-010 ,-4.43394e-009 ] ,"tangents": [ -1 ,2.5012e-023 ,-4.38569e-008 ,-1 ,2.5012e-023 ,-4.38569e-008 ,-1 ,2.5012e-023 ,-4.38569e-008 ,-1 ,2.5012e-023 ,-4.38569e-008 ,1 ,2.51572e-017 ,4.49765e-010 ,1 ,2.51572e-017 ,4.49765e-010 ,1 ,2.51572e-017 ,4.49765e-010 ,1 ,2.51572e-017 ,4.49765e-010 ,1 ,8.99529e-010 ,4.38584e-008 ,1 ,8.99529e-010 ,4.38584e-008 ,1 ,8.99529e-010 ,4.38584e-008 ,1 ,8.99529e-010 ,-6.27303e-017 ,6.23801e-011 ,1 ,-9.26059e-012 ,6.238e-011 ,1 ,-9.26059e-012 ,6.23801e-011 ,1 ,-9.26059e-012 ,3.76035e-008 ,1 ,-7.58628e-008 ,-1 ,-8.99529e-010 ,-4.38584e-008 ,-1 ,-8.99529e-010 ,-4.38584e-008 ,-1 ,-8.99529e-010 ,-4.38584e-008 ,-1 ,-8.99529e-010 ,-2.2251e-017 ,-6.238e-011 ,-1 ,9.26059e-012 ,-6.23799e-011 ,-1 ,9.26059e-012 ,-6.238e-011 ,-1 ,9.26059e-012 ,-6.23801e-011 ,-1 ,7.58628e-008 ] ,"bitangents": [ 2.37071e-007 ,-1 ,9.3458e-012 ,2.37071e-007 ,-1 ,9.3458e-012 ,2.37071e-007 ,-1 ,9.3458e-012 ,2.37071e-007 ,-1 ,9.3458e-012 ,1.99362e-007 ,-1 ,7.56577e-008 ,1.99362e-007 ,-1 ,7.56577e-008 ,1.99362e-007 ,-1 ,7.56577e-008 ,2.37701e-007 ,-1 ,7.56577e-008 ,-7.51933e-017 ,-1.52468e-007 ,-1 ,-7.51933e-017 ,-1.52468e-007 ,-1 ,-7.51933e-017 ,-1.52468e-007 ,-1 ,7.74879e-008 ,-1.52468e-007 ,-1 ,-7.63978e-008 ,-1.61581e-018 ,-1 ,-7.63978e-008 ,-1.6158e-018 ,-1 ,-7.63978e-008 ,-1.61581e-018 ,-1 ,-5.22307e-010 ,-1.51861e-007 ,-1 ,7.74879e-008 ,2.54522e-010 ,-1 ,7.74879e-008 ,2.54521e-010 ,-1 ,7.74879e-008 ,2.54522e-010 ,-1 ,-7.74879e-008 ,2.54521e-010 ,-1 ,7.63252e-008 ,-1.51861e-007 ,-1 ,7.63252e-008 ,-1.51861e-007 ,-1 ,7.63252e-008 ,-1.51861e-007 ,-1 ,7.63252e-008 ,2.0556e-018 ,-1 ] ,"numuvcomponents": [ 2 ] ,"texturecoords": [ [ 0.519324 ,-0.509662 ,0.519323 ,1.50966 ,0.480676 ,1.50966 ,0.480677 ,-0.509662 ,0.480676 ,-0.509662 ,0.519323 ,-0.509662 ,0.519324 ,1.50966 ,0.480677 ,1.50966 ,0.480676 ,0.00241548 ,0.519323 ,0.00241548 ,0.519323 ,0.997585 ,0.480676 ,0.997585 ,-0.509662 ,0.00241548 ,1.50966 ,0.00241548 ,1.50966 ,0.997585 ,-0.509662 ,0.997585 ,0.480676 ,0.00241548 ,0.519323 ,0.00241548 ,0.519323 ,0.997585 ,0.480676 ,0.997585 ,-0.509662 ,0.00241548 ,1.50966 ,0.00241548 ,1.50966 ,0.997585 ,-0.509662 ,0.997585 ] ] ,"faces": [ [ 0 ,1 ,2 ] ,[ 2 ,3 ,0 ] ,[ 4 ,5 ,6 ] ,[ 6 ,7 ,4 ] ,[ 8 ,9 ,10 ] ,[ 10 ,11 ,8 ] ,[ 12 ,13 ,14 ] ,[ 14 ,15 ,12 ] ,[ 16 ,17 ,18 ] ,[ 18 ,19 ,16 ] ,[ 20 ,21 ,22 ] ,[ 22 ,23 ,20 ] ] } ] ,"materials": [ { "properties": [ { "key": "?mat.name" ,"semantic": 0 ,"index": 0 ,"type": 3 ,"value": "2 - Default" } ,{ "key": "$clr.ambient" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.588235 ,0.588235 ,0.588235 ] } ,{ "key": "$clr.diffuse" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.588235 ,0.588235 ,0.588235 ] } ,{ "key": "$clr.specular" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.898039 ,0.898039 ,0.898039 ] } ,{ "key": "$clr.emissive" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0 ,0 ,0 ] } ,{ "key": "$mat.opacity" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$mat.bumpscaling" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$mat.shadingm" ,"semantic": 0 ,"index": 0 ,"type": 4 ,"value": 2 } ,{ "key": "$tex.file" ,"semantic": 1 ,"index": 0 ,"type": 3 ,"value": "image1.jpg" } ,{ "key": "$tex.blend" ,"semantic": 1 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$tex.mapmodeu" ,"semantic": 1 ,"index": 0 ,"type": 4 ,"value": 0 } ,{ "key": "$tex.mapmodev" ,"semantic": 1 ,"index": 0 ,"type": 4 ,"value": 0 } ,{ "key": "$tex.uvtrafo" ,"semantic": 1 ,"index": 0 ,"type": 1 ,"value": [ 0 ,0 ,1 ,1 ,0 ] } ] } ,{ "properties": [ { "key": "?mat.name" ,"semantic": 0 ,"index": 0 ,"type": 3 ,"value": "1 - Default" } ,{ "key": "$clr.ambient" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.588235 ,0.588235 ,0.588235 ] } ,{ "key": "$clr.diffuse" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.588235 ,0.588235 ,0.588235 ] } ,{ "key": "$clr.specular" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.898039 ,0.898039 ,0.898039 ] } ,{ "key": "$clr.emissive" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0 ,0 ,0 ] } ,{ "key": "$mat.opacity" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$mat.bumpscaling" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$mat.shadingm" ,"semantic": 0 ,"index": 0 ,"type": 4 ,"value": 2 } ,{ "key": "$tex.file" ,"semantic": 1 ,"index": 0 ,"type": 3 ,"value": "wall.jpg" } ,{ "key": "$tex.blend" ,"semantic": 1 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$tex.mapmodeu" ,"semantic": 1 ,"index": 0 ,"type": 4 ,"value": 0 } ,{ "key": "$tex.mapmodev" ,"semantic": 1 ,"index": 0 ,"type": 4 ,"value": 0 } ,{ "key": "$tex.uvtrafo" ,"semantic": 1 ,"index": 0 ,"type": 1 ,"value": [ 0 ,0 ,1 ,1 ,0 ] } ] } ,{ "properties": [ { "key": "?mat.name" ,"semantic": 0 ,"index": 0 ,"type": 3 ,"value": "3 - Default" } ,{ "key": "$clr.ambient" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.588235 ,0.588235 ,0.588235 ] } ,{ "key": "$clr.diffuse" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.588235 ,0.588235 ,0.588235 ] } ,{ "key": "$clr.specular" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.898039 ,0.898039 ,0.898039 ] } ,{ "key": "$clr.emissive" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0 ,0 ,0 ] } ,{ "key": "$mat.opacity" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$mat.bumpscaling" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$mat.shadingm" ,"semantic": 0 ,"index": 0 ,"type": 4 ,"value": 2 } ,{ "key": "$tex.file" ,"semantic": 1 ,"index": 0 ,"type": 3 ,"value": "image2.jpg" } ,{ "key": "$tex.blend" ,"semantic": 1 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$tex.mapmodeu" ,"semantic": 1 ,"index": 0 ,"type": 4 ,"value": 0 } ,{ "key": "$tex.mapmodev" ,"semantic": 1 ,"index": 0 ,"type": 4 ,"value": 0 } ,{ "key": "$tex.uvtrafo" ,"semantic": 1 ,"index": 0 ,"type": 1 ,"value": [ 0 ,0 ,1 ,1 ,0 ] } ] } ] } ================================================ FILE: examples/resources/models/assimp/jeep/jeep.assimp.json ================================================ { "__metadata__": { "format" : "assimp2json" ,"version": 100 } ,"rootnode": { "name": "" ,"transformation": [ 1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ] ,"meshes": [ 0 ] } ,"flags": 8 ,"meshes": [ { "name": "" ,"materialindex": 0 ,"primitivetypes": 4 ,"vertices": [ 5.3674 ,2.79918 ,5.58144 ,5.3674 ,2.71248 ,6.01734 ,5.3674 ,1.66012 ,5.58144 ,3.33216 ,2.92574 ,5.58144 ,3.33216 ,1.66012 ,5.58144 ,3.33216 ,2.8294 ,6.06577 ,5.52924 ,2.92574 ,5.58144 ,5.26276 ,3.17887 ,5.58144 ,5.26276 ,3.06326 ,6.16264 ,5.52924 ,2.8294 ,6.06577 ,3.59863 ,3.17887 ,5.58144 ,3.59863 ,3.06326 ,6.16264 ,5.3674 ,2.46556 ,6.38688 ,3.33216 ,2.55505 ,6.47637 ,5.52924 ,2.55505 ,6.47637 ,5.26276 ,2.73404 ,6.65536 ,3.59863 ,2.73404 ,6.65536 ,5.3674 ,2.09602 ,6.63379 ,3.33216 ,2.14445 ,6.75072 ,5.26276 ,2.24132 ,6.98458 ,5.52924 ,2.14445 ,6.75072 ,3.59863 ,2.24132 ,6.98458 ,5.3674 ,1.66012 ,6.7205 ,3.33216 ,1.66012 ,6.84706 ,5.52924 ,1.66012 ,6.84706 ,5.26276 ,1.66012 ,7.10019 ,3.59863 ,1.66012 ,7.10019 ,5.3674 ,1.22421 ,6.63379 ,3.33216 ,1.17579 ,6.75072 ,5.26276 ,1.07892 ,6.98458 ,5.52924 ,1.17579 ,6.75072 ,3.59863 ,1.07892 ,6.98458 ,5.3674 ,0.854673 ,6.38688 ,3.33216 ,0.765187 ,6.47637 ,5.52924 ,0.765187 ,6.47637 ,5.26276 ,0.586201 ,6.65536 ,3.59863 ,0.586201 ,6.65536 ,5.3674 ,0.607756 ,6.01734 ,3.33216 ,0.490834 ,6.06577 ,5.26276 ,0.256977 ,6.16264 ,5.52924 ,0.490834 ,6.06577 ,3.59863 ,0.256977 ,6.16264 ,5.3674 ,0.52106 ,5.58144 ,3.33216 ,0.394494 ,5.58144 ,5.52924 ,0.394494 ,5.58144 ,5.26276 ,0.141369 ,5.58144 ,3.59863 ,0.141369 ,5.58144 ,5.3674 ,0.607756 ,5.14554 ,3.33216 ,0.490834 ,5.09711 ,5.26276 ,0.256977 ,5.00024 ,5.52924 ,0.490834 ,5.09711 ,3.59863 ,0.256977 ,5.00024 ,5.3674 ,0.854673 ,4.776 ,3.33216 ,0.765187 ,4.68651 ,5.52924 ,0.765187 ,4.68651 ,5.26276 ,0.586201 ,4.50752 ,3.59863 ,0.586201 ,4.50752 ,5.3674 ,1.22421 ,4.52909 ,3.33216 ,1.17579 ,4.41216 ,5.26276 ,1.07892 ,4.1783 ,5.52924 ,1.17579 ,4.41216 ,3.59863 ,1.07892 ,4.1783 ,5.3674 ,1.66012 ,4.44238 ,3.33216 ,1.66012 ,4.31581 ,5.52924 ,1.66012 ,4.31581 ,5.26276 ,1.66012 ,4.06269 ,3.59863 ,1.66012 ,4.06269 ,5.3674 ,2.09602 ,4.52909 ,3.33216 ,2.14445 ,4.41216 ,5.26276 ,2.24132 ,4.1783 ,5.52924 ,2.14445 ,4.41216 ,3.59863 ,2.24132 ,4.1783 ,5.3674 ,2.46556 ,4.776 ,3.33216 ,2.55505 ,4.68651 ,5.52924 ,2.55505 ,4.68651 ,5.26276 ,2.73404 ,4.50752 ,3.59863 ,2.73404 ,4.50752 ,5.3674 ,2.71248 ,5.14554 ,3.33216 ,2.8294 ,5.09711 ,5.26276 ,3.06326 ,5.00024 ,5.52924 ,2.8294 ,5.09711 ,3.59863 ,3.06326 ,5.00024 ,5.26276 ,3.17887 ,5.58144 ,4.4307 ,3.33074 ,5.58144 ,5.26276 ,3.06326 ,6.16264 ,4.4307 ,3.20358 ,6.22076 ,4.4307 ,3.33074 ,5.58144 ,3.59863 ,3.17887 ,5.58144 ,3.59863 ,3.06326 ,6.16264 ,4.4307 ,3.20358 ,6.22076 ,5.26276 ,3.06326 ,6.16264 ,4.4307 ,3.20358 ,6.22076 ,4.4307 ,2.84143 ,6.76275 ,5.26276 ,2.73404 ,6.65536 ,4.4307 ,3.20358 ,6.22076 ,3.59863 ,3.06326 ,6.16264 ,4.4307 ,2.84143 ,6.76275 ,3.59863 ,2.73404 ,6.65536 ,5.26276 ,2.73404 ,6.65536 ,4.4307 ,2.84143 ,6.76275 ,5.26276 ,2.24132 ,6.98458 ,4.4307 ,2.29944 ,7.1249 ,4.4307 ,2.84143 ,6.76275 ,3.59863 ,2.73404 ,6.65536 ,3.59863 ,2.24132 ,6.98458 ,4.4307 ,2.29944 ,7.1249 ,5.26276 ,2.24132 ,6.98458 ,4.4307 ,2.29944 ,7.1249 ,4.4307 ,1.66012 ,7.25206 ,5.26276 ,1.66012 ,7.10019 ,4.4307 ,2.29944 ,7.1249 ,3.59863 ,2.24132 ,6.98458 ,4.4307 ,1.66012 ,7.25206 ,3.59863 ,1.66012 ,7.10019 ,5.26276 ,1.66012 ,7.10019 ,4.4307 ,1.66012 ,7.25206 ,5.26276 ,1.07892 ,6.98458 ,4.4307 ,1.0208 ,7.1249 ,4.4307 ,1.66012 ,7.25206 ,3.59863 ,1.66012 ,7.10019 ,3.59863 ,1.07892 ,6.98458 ,4.4307 ,1.0208 ,7.1249 ,5.26276 ,1.07892 ,6.98458 ,4.4307 ,1.0208 ,7.1249 ,4.4307 ,0.478809 ,6.76275 ,5.26276 ,0.586201 ,6.65536 ,4.4307 ,1.0208 ,7.1249 ,3.59863 ,1.07892 ,6.98458 ,4.4307 ,0.478809 ,6.76275 ,3.59863 ,0.586201 ,6.65536 ,5.26276 ,0.586201 ,6.65536 ,4.4307 ,0.478809 ,6.76275 ,5.26276 ,0.256977 ,6.16264 ,4.4307 ,0.116663 ,6.22076 ,4.4307 ,0.478809 ,6.76275 ,3.59863 ,0.586201 ,6.65536 ,3.59863 ,0.256977 ,6.16264 ,4.4307 ,0.116663 ,6.22076 ,5.26276 ,0.256977 ,6.16264 ,4.4307 ,0.116663 ,6.22076 ,4.4307 ,-0.0105057 ,5.58144 ,5.26276 ,0.141369 ,5.58144 ,4.4307 ,0.116663 ,6.22076 ,3.59863 ,0.256977 ,6.16264 ,4.4307 ,-0.0105057 ,5.58144 ,3.59863 ,0.141369 ,5.58144 ,5.26276 ,0.141369 ,5.58144 ,4.4307 ,-0.0105057 ,5.58144 ,5.26276 ,0.256977 ,5.00024 ,4.4307 ,0.116663 ,4.94212 ,4.4307 ,-0.0105057 ,5.58144 ,3.59863 ,0.141369 ,5.58144 ,3.59863 ,0.256977 ,5.00024 ,4.4307 ,0.116663 ,4.94212 ,5.26276 ,0.256977 ,5.00024 ,4.4307 ,0.116663 ,4.94212 ,4.4307 ,0.478809 ,4.40013 ,5.26276 ,0.586201 ,4.50752 ,4.4307 ,0.116663 ,4.94212 ,3.59863 ,0.256977 ,5.00024 ,4.4307 ,0.478809 ,4.40013 ,3.59863 ,0.586201 ,4.50752 ,5.26276 ,0.586201 ,4.50752 ,4.4307 ,0.478809 ,4.40013 ,5.26276 ,1.07892 ,4.1783 ,4.4307 ,1.0208 ,4.03798 ,4.4307 ,0.478809 ,4.40013 ,3.59863 ,0.586201 ,4.50752 ,3.59863 ,1.07892 ,4.1783 ,4.4307 ,1.0208 ,4.03798 ,5.26276 ,1.07892 ,4.1783 ,4.4307 ,1.0208 ,4.03798 ,4.4307 ,1.66012 ,3.91081 ,5.26276 ,1.66012 ,4.06269 ,4.4307 ,1.0208 ,4.03798 ,3.59863 ,1.07892 ,4.1783 ,4.4307 ,1.66012 ,3.91081 ,3.59863 ,1.66012 ,4.06269 ,5.26276 ,1.66012 ,4.06269 ,4.4307 ,1.66012 ,3.91081 ,5.26276 ,2.24132 ,4.1783 ,4.4307 ,2.29944 ,4.03798 ,4.4307 ,1.66012 ,3.91081 ,3.59863 ,1.66012 ,4.06269 ,3.59863 ,2.24132 ,4.1783 ,4.4307 ,2.29944 ,4.03798 ,5.26276 ,2.24132 ,4.1783 ,4.4307 ,2.29944 ,4.03798 ,4.4307 ,2.84143 ,4.40013 ,5.26276 ,2.73404 ,4.50752 ,4.4307 ,2.29944 ,4.03798 ,3.59863 ,2.24132 ,4.1783 ,4.4307 ,2.84143 ,4.40013 ,3.59863 ,2.73404 ,4.50752 ,5.26276 ,2.73404 ,4.50752 ,4.4307 ,2.84143 ,4.40013 ,5.26276 ,3.06326 ,5.00024 ,4.4307 ,3.20358 ,4.94212 ,4.4307 ,2.84143 ,4.40013 ,3.59863 ,2.73404 ,4.50752 ,3.59863 ,3.06326 ,5.00024 ,4.4307 ,3.20358 ,4.94212 ,5.26276 ,3.06326 ,5.00024 ,4.4307 ,3.20358 ,4.94212 ,4.4307 ,3.33074 ,5.58144 ,5.26276 ,3.17887 ,5.58144 ,4.4307 ,3.20358 ,4.94212 ,3.59863 ,3.06326 ,5.00024 ,4.4307 ,3.33074 ,5.58144 ,3.59863 ,3.17887 ,5.58144 ,-5.3674 ,1.66012 ,-5 ,-5.3674 ,2.71248 ,-4.5641 ,-5.3674 ,2.79918 ,-5 ,-3.33216 ,2.8294 ,-4.51567 ,-3.33216 ,1.66012 ,-5 ,-3.33216 ,2.92574 ,-5 ,-5.26276 ,3.06326 ,-4.4188 ,-5.26276 ,3.17887 ,-5 ,-5.52924 ,2.92574 ,-5 ,-5.52924 ,2.8294 ,-4.51567 ,-3.59863 ,3.06326 ,-4.4188 ,-3.59863 ,3.17887 ,-5 ,-5.3674 ,2.46556 ,-4.19456 ,-3.33216 ,2.55505 ,-4.10507 ,-5.52924 ,2.55505 ,-4.10507 ,-5.26276 ,2.73404 ,-3.92608 ,-3.59863 ,2.73404 ,-3.92608 ,-5.3674 ,2.09602 ,-3.94765 ,-3.33216 ,2.14445 ,-3.83072 ,-5.26276 ,2.24132 ,-3.59686 ,-5.52924 ,2.14445 ,-3.83072 ,-3.59863 ,2.24132 ,-3.59686 ,-5.3674 ,1.66012 ,-3.86094 ,-3.33216 ,1.66012 ,-3.73438 ,-5.52924 ,1.66012 ,-3.73438 ,-5.26276 ,1.66012 ,-3.48125 ,-3.59863 ,1.66012 ,-3.48125 ,-5.3674 ,1.22421 ,-3.94765 ,-3.33216 ,1.17579 ,-3.83072 ,-5.26276 ,1.07892 ,-3.59686 ,-5.52924 ,1.17579 ,-3.83072 ,-3.59863 ,1.07892 ,-3.59686 ,-5.3674 ,0.854673 ,-4.19456 ,-3.33216 ,0.765187 ,-4.10507 ,-5.52924 ,0.765187 ,-4.10507 ,-5.26276 ,0.586201 ,-3.92608 ,-3.59863 ,0.586201 ,-3.92608 ,-5.3674 ,0.607756 ,-4.5641 ,-3.33216 ,0.490834 ,-4.51567 ,-5.26276 ,0.256977 ,-4.4188 ,-5.52924 ,0.490834 ,-4.51567 ,-3.59863 ,0.256977 ,-4.4188 ,-5.3674 ,0.52106 ,-5 ,-3.33216 ,0.394494 ,-5 ,-5.52924 ,0.394494 ,-5 ,-5.26276 ,0.141369 ,-5 ,-3.59863 ,0.141369 ,-5 ,-5.3674 ,0.607756 ,-5.4359 ,-3.33216 ,0.490834 ,-5.48433 ,-5.26276 ,0.256977 ,-5.5812 ,-5.52924 ,0.490834 ,-5.48433 ,-3.59863 ,0.256977 ,-5.5812 ,-5.3674 ,0.854673 ,-5.80544 ,-3.33216 ,0.765187 ,-5.89493 ,-5.52924 ,0.765187 ,-5.89493 ,-5.26276 ,0.586201 ,-6.07392 ,-3.59863 ,0.586201 ,-6.07392 ,-5.3674 ,1.22421 ,-6.05235 ,-3.33216 ,1.17579 ,-6.16928 ,-5.26276 ,1.07892 ,-6.40314 ,-5.52924 ,1.17579 ,-6.16928 ,-3.59863 ,1.07892 ,-6.40314 ,-5.3674 ,1.66012 ,-6.13906 ,-3.33216 ,1.66012 ,-6.26563 ,-5.52924 ,1.66012 ,-6.26563 ,-5.26276 ,1.66012 ,-6.51875 ,-3.59863 ,1.66012 ,-6.51875 ,-5.3674 ,2.09602 ,-6.05235 ,-3.33216 ,2.14445 ,-6.16928 ,-5.26276 ,2.24132 ,-6.40314 ,-5.52924 ,2.14445 ,-6.16928 ,-3.59863 ,2.24132 ,-6.40314 ,-5.3674 ,2.46556 ,-5.80544 ,-3.33216 ,2.55505 ,-5.89493 ,-5.52924 ,2.55505 ,-5.89493 ,-5.26276 ,2.73404 ,-6.07392 ,-3.59863 ,2.73404 ,-6.07392 ,-5.3674 ,2.71248 ,-5.4359 ,-3.33216 ,2.8294 ,-5.48433 ,-5.26276 ,3.06326 ,-5.5812 ,-5.52924 ,2.8294 ,-5.48433 ,-3.59863 ,3.06326 ,-5.5812 ,-5.26276 ,3.06326 ,-4.4188 ,-4.4307 ,3.33074 ,-5 ,-5.26276 ,3.17887 ,-5 ,-4.4307 ,3.20358 ,-4.36068 ,-3.59863 ,3.06326 ,-4.4188 ,-3.59863 ,3.17887 ,-5 ,-4.4307 ,3.33074 ,-5 ,-4.4307 ,3.20358 ,-4.36068 ,-4.4307 ,2.84143 ,-3.81869 ,-4.4307 ,3.20358 ,-4.36068 ,-5.26276 ,3.06326 ,-4.4188 ,-5.26276 ,2.73404 ,-3.92608 ,-4.4307 ,2.84143 ,-3.81869 ,-3.59863 ,3.06326 ,-4.4188 ,-4.4307 ,3.20358 ,-4.36068 ,-3.59863 ,2.73404 ,-3.92608 ,-5.26276 ,2.24132 ,-3.59686 ,-4.4307 ,2.84143 ,-3.81869 ,-5.26276 ,2.73404 ,-3.92608 ,-4.4307 ,2.29944 ,-3.45654 ,-3.59863 ,2.24132 ,-3.59686 ,-3.59863 ,2.73404 ,-3.92608 ,-4.4307 ,2.84143 ,-3.81869 ,-4.4307 ,2.29944 ,-3.45654 ,-4.4307 ,1.66012 ,-3.32937 ,-4.4307 ,2.29944 ,-3.45654 ,-5.26276 ,2.24132 ,-3.59686 ,-5.26276 ,1.66012 ,-3.48125 ,-4.4307 ,1.66012 ,-3.32937 ,-3.59863 ,2.24132 ,-3.59686 ,-4.4307 ,2.29944 ,-3.45654 ,-3.59863 ,1.66012 ,-3.48125 ,-5.26276 ,1.07892 ,-3.59686 ,-4.4307 ,1.66012 ,-3.32937 ,-5.26276 ,1.66012 ,-3.48125 ,-4.4307 ,1.0208 ,-3.45654 ,-3.59863 ,1.07892 ,-3.59686 ,-3.59863 ,1.66012 ,-3.48125 ,-4.4307 ,1.66012 ,-3.32937 ,-4.4307 ,1.0208 ,-3.45654 ,-4.4307 ,0.478809 ,-3.81869 ,-4.4307 ,1.0208 ,-3.45654 ,-5.26276 ,1.07892 ,-3.59686 ,-5.26276 ,0.586201 ,-3.92608 ,-4.4307 ,0.478809 ,-3.81869 ,-3.59863 ,1.07892 ,-3.59686 ,-4.4307 ,1.0208 ,-3.45654 ,-3.59863 ,0.586201 ,-3.92608 ,-5.26276 ,0.256977 ,-4.4188 ,-4.4307 ,0.478809 ,-3.81869 ,-5.26276 ,0.586201 ,-3.92608 ,-4.4307 ,0.116663 ,-4.36068 ,-3.59863 ,0.256977 ,-4.4188 ,-3.59863 ,0.586201 ,-3.92608 ,-4.4307 ,0.478809 ,-3.81869 ,-4.4307 ,0.116663 ,-4.36068 ,-4.4307 ,-0.0105057 ,-5 ,-4.4307 ,0.116663 ,-4.36068 ,-5.26276 ,0.256977 ,-4.4188 ,-5.26276 ,0.141369 ,-5 ,-4.4307 ,-0.0105057 ,-5 ,-3.59863 ,0.256977 ,-4.4188 ,-4.4307 ,0.116663 ,-4.36068 ,-3.59863 ,0.141369 ,-5 ,-5.26276 ,0.256977 ,-5.5812 ,-4.4307 ,-0.0105057 ,-5 ,-5.26276 ,0.141369 ,-5 ,-4.4307 ,0.116663 ,-5.63932 ,-3.59863 ,0.256977 ,-5.5812 ,-3.59863 ,0.141369 ,-5 ,-4.4307 ,-0.0105057 ,-5 ,-4.4307 ,0.116663 ,-5.63932 ,-4.4307 ,0.478809 ,-6.18131 ,-4.4307 ,0.116663 ,-5.63932 ,-5.26276 ,0.256977 ,-5.5812 ,-5.26276 ,0.586201 ,-6.07392 ,-4.4307 ,0.478809 ,-6.18131 ,-3.59863 ,0.256977 ,-5.5812 ,-4.4307 ,0.116663 ,-5.63932 ,-3.59863 ,0.586201 ,-6.07392 ,-5.26276 ,1.07892 ,-6.40314 ,-4.4307 ,0.478809 ,-6.18131 ,-5.26276 ,0.586201 ,-6.07392 ,-4.4307 ,1.0208 ,-6.54346 ,-3.59863 ,1.07892 ,-6.40314 ,-3.59863 ,0.586201 ,-6.07392 ,-4.4307 ,0.478809 ,-6.18131 ,-4.4307 ,1.0208 ,-6.54346 ,-4.4307 ,1.66012 ,-6.67063 ,-4.4307 ,1.0208 ,-6.54346 ,-5.26276 ,1.07892 ,-6.40314 ,-5.26276 ,1.66012 ,-6.51875 ,-4.4307 ,1.66012 ,-6.67063 ,-3.59863 ,1.07892 ,-6.40314 ,-4.4307 ,1.0208 ,-6.54346 ,-3.59863 ,1.66012 ,-6.51875 ,-5.26276 ,2.24132 ,-6.40314 ,-4.4307 ,1.66012 ,-6.67063 ,-5.26276 ,1.66012 ,-6.51875 ,-4.4307 ,2.29944 ,-6.54346 ,-3.59863 ,2.24132 ,-6.40314 ,-3.59863 ,1.66012 ,-6.51875 ,-4.4307 ,1.66012 ,-6.67063 ,-4.4307 ,2.29944 ,-6.54346 ,-4.4307 ,2.84143 ,-6.18131 ,-4.4307 ,2.29944 ,-6.54346 ,-5.26276 ,2.24132 ,-6.40314 ,-5.26276 ,2.73404 ,-6.07392 ,-4.4307 ,2.84143 ,-6.18131 ,-3.59863 ,2.24132 ,-6.40314 ,-4.4307 ,2.29944 ,-6.54346 ,-3.59863 ,2.73404 ,-6.07392 ,-5.26276 ,3.06326 ,-5.5812 ,-4.4307 ,2.84143 ,-6.18131 ,-5.26276 ,2.73404 ,-6.07392 ,-4.4307 ,3.20358 ,-5.63932 ,-3.59863 ,3.06326 ,-5.5812 ,-3.59863 ,2.73404 ,-6.07392 ,-4.4307 ,2.84143 ,-6.18131 ,-4.4307 ,3.20358 ,-5.63932 ,-4.4307 ,3.33074 ,-5 ,-4.4307 ,3.20358 ,-5.63932 ,-5.26276 ,3.06326 ,-5.5812 ,-5.26276 ,3.17887 ,-5 ,-4.4307 ,3.33074 ,-5 ,-3.59863 ,3.06326 ,-5.5812 ,-4.4307 ,3.20358 ,-5.63932 ,-3.59863 ,3.17887 ,-5 ,-5.3674 ,1.66012 ,5.58144 ,-5.3674 ,2.71248 ,6.01734 ,-5.3674 ,2.79918 ,5.58144 ,-3.33216 ,2.8294 ,6.06577 ,-3.33216 ,1.66012 ,5.58144 ,-3.33216 ,2.92574 ,5.58144 ,-5.26276 ,3.06326 ,6.16264 ,-5.26276 ,3.17887 ,5.58144 ,-5.52924 ,2.92574 ,5.58144 ,-5.52924 ,2.8294 ,6.06577 ,-3.59863 ,3.06326 ,6.16264 ,-3.59863 ,3.17887 ,5.58144 ,-5.3674 ,2.46556 ,6.38688 ,-3.33216 ,2.55505 ,6.47637 ,-5.52924 ,2.55505 ,6.47637 ,-5.26276 ,2.73404 ,6.65536 ,-3.59863 ,2.73404 ,6.65536 ,-5.3674 ,2.09602 ,6.63379 ,-3.33216 ,2.14445 ,6.75072 ,-5.26276 ,2.24132 ,6.98458 ,-5.52924 ,2.14445 ,6.75072 ,-3.59863 ,2.24132 ,6.98458 ,-5.3674 ,1.66012 ,6.7205 ,-3.33216 ,1.66012 ,6.84706 ,-5.52924 ,1.66012 ,6.84706 ,-5.26276 ,1.66012 ,7.10019 ,-3.59863 ,1.66012 ,7.10019 ,-5.3674 ,1.22421 ,6.63379 ,-3.33216 ,1.17579 ,6.75072 ,-5.26276 ,1.07892 ,6.98458 ,-5.52924 ,1.17579 ,6.75072 ,-3.59863 ,1.07892 ,6.98458 ,-5.3674 ,0.854673 ,6.38688 ,-3.33216 ,0.765187 ,6.47637 ,-5.52924 ,0.765187 ,6.47637 ,-5.26276 ,0.586201 ,6.65536 ,-3.59863 ,0.586201 ,6.65536 ,-5.3674 ,0.607756 ,6.01734 ,-3.33216 ,0.490834 ,6.06577 ,-5.26276 ,0.256977 ,6.16264 ,-5.52924 ,0.490834 ,6.06577 ,-3.59863 ,0.256977 ,6.16264 ,-5.3674 ,0.52106 ,5.58144 ,-3.33216 ,0.394494 ,5.58144 ,-5.52924 ,0.394494 ,5.58144 ,-5.26276 ,0.141369 ,5.58144 ,-3.59863 ,0.141369 ,5.58144 ,-5.3674 ,0.607756 ,5.14554 ,-3.33216 ,0.490834 ,5.09711 ,-5.26276 ,0.256977 ,5.00024 ,-5.52924 ,0.490834 ,5.09711 ,-3.59863 ,0.256977 ,5.00024 ,-5.3674 ,0.854673 ,4.776 ,-3.33216 ,0.765187 ,4.68651 ,-5.52924 ,0.765187 ,4.68651 ,-5.26276 ,0.586201 ,4.50752 ,-3.59863 ,0.586201 ,4.50752 ,-5.3674 ,1.22421 ,4.52909 ,-3.33216 ,1.17579 ,4.41216 ,-5.26276 ,1.07892 ,4.1783 ,-5.52924 ,1.17579 ,4.41216 ,-3.59863 ,1.07892 ,4.1783 ,-5.3674 ,1.66012 ,4.44238 ,-3.33216 ,1.66012 ,4.31581 ,-5.52924 ,1.66012 ,4.31581 ,-5.26276 ,1.66012 ,4.06269 ,-3.59863 ,1.66012 ,4.06269 ,-5.3674 ,2.09602 ,4.52909 ,-3.33216 ,2.14445 ,4.41216 ,-5.26276 ,2.24132 ,4.1783 ,-5.52924 ,2.14445 ,4.41216 ,-3.59863 ,2.24132 ,4.1783 ,-5.3674 ,2.46556 ,4.776 ,-3.33216 ,2.55505 ,4.68651 ,-5.52924 ,2.55505 ,4.68651 ,-5.26276 ,2.73404 ,4.50752 ,-3.59863 ,2.73404 ,4.50752 ,-5.3674 ,2.71248 ,5.14554 ,-3.33216 ,2.8294 ,5.09711 ,-5.26276 ,3.06326 ,5.00024 ,-5.52924 ,2.8294 ,5.09711 ,-3.59863 ,3.06326 ,5.00024 ,-5.26276 ,3.06326 ,6.16264 ,-4.4307 ,3.33074 ,5.58144 ,-5.26276 ,3.17887 ,5.58144 ,-4.4307 ,3.20358 ,6.22076 ,-3.59863 ,3.06326 ,6.16264 ,-3.59863 ,3.17887 ,5.58144 ,-4.4307 ,3.33074 ,5.58144 ,-4.4307 ,3.20358 ,6.22076 ,-4.4307 ,2.84143 ,6.76275 ,-4.4307 ,3.20358 ,6.22076 ,-5.26276 ,3.06326 ,6.16264 ,-5.26276 ,2.73404 ,6.65536 ,-4.4307 ,2.84143 ,6.76275 ,-3.59863 ,3.06326 ,6.16264 ,-4.4307 ,3.20358 ,6.22076 ,-3.59863 ,2.73404 ,6.65536 ,-5.26276 ,2.24132 ,6.98458 ,-4.4307 ,2.84143 ,6.76275 ,-5.26276 ,2.73404 ,6.65536 ,-4.4307 ,2.29944 ,7.1249 ,-3.59863 ,2.24132 ,6.98458 ,-3.59863 ,2.73404 ,6.65536 ,-4.4307 ,2.84143 ,6.76275 ,-4.4307 ,2.29944 ,7.1249 ,-4.4307 ,1.66012 ,7.25206 ,-4.4307 ,2.29944 ,7.1249 ,-5.26276 ,2.24132 ,6.98458 ,-5.26276 ,1.66012 ,7.10019 ,-4.4307 ,1.66012 ,7.25206 ,-3.59863 ,2.24132 ,6.98458 ,-4.4307 ,2.29944 ,7.1249 ,-3.59863 ,1.66012 ,7.10019 ,-5.26276 ,1.07892 ,6.98458 ,-4.4307 ,1.66012 ,7.25206 ,-5.26276 ,1.66012 ,7.10019 ,-4.4307 ,1.0208 ,7.1249 ,-3.59863 ,1.07892 ,6.98458 ,-3.59863 ,1.66012 ,7.10019 ,-4.4307 ,1.66012 ,7.25206 ,-4.4307 ,1.0208 ,7.1249 ,-4.4307 ,0.478809 ,6.76275 ,-4.4307 ,1.0208 ,7.1249 ,-5.26276 ,1.07892 ,6.98458 ,-5.26276 ,0.586201 ,6.65536 ,-4.4307 ,0.478809 ,6.76275 ,-3.59863 ,1.07892 ,6.98458 ,-4.4307 ,1.0208 ,7.1249 ,-3.59863 ,0.586201 ,6.65536 ,-5.26276 ,0.256977 ,6.16264 ,-4.4307 ,0.478809 ,6.76275 ,-5.26276 ,0.586201 ,6.65536 ,-4.4307 ,0.116663 ,6.22076 ,-3.59863 ,0.256977 ,6.16264 ,-3.59863 ,0.586201 ,6.65536 ,-4.4307 ,0.478809 ,6.76275 ,-4.4307 ,0.116663 ,6.22076 ,-4.4307 ,-0.0105057 ,5.58144 ,-4.4307 ,0.116663 ,6.22076 ,-5.26276 ,0.256977 ,6.16264 ,-5.26276 ,0.141369 ,5.58144 ,-4.4307 ,-0.0105057 ,5.58144 ,-3.59863 ,0.256977 ,6.16264 ,-4.4307 ,0.116663 ,6.22076 ,-3.59863 ,0.141369 ,5.58144 ,-5.26276 ,0.256977 ,5.00024 ,-4.4307 ,-0.0105057 ,5.58144 ,-5.26276 ,0.141369 ,5.58144 ,-4.4307 ,0.116663 ,4.94212 ,-3.59863 ,0.256977 ,5.00024 ,-3.59863 ,0.141369 ,5.58144 ,-4.4307 ,-0.0105057 ,5.58144 ,-4.4307 ,0.116663 ,4.94212 ,-4.4307 ,0.478809 ,4.40013 ,-4.4307 ,0.116663 ,4.94212 ,-5.26276 ,0.256977 ,5.00024 ,-5.26276 ,0.586201 ,4.50752 ,-4.4307 ,0.478809 ,4.40013 ,-3.59863 ,0.256977 ,5.00024 ,-4.4307 ,0.116663 ,4.94212 ,-3.59863 ,0.586201 ,4.50752 ,-5.26276 ,1.07892 ,4.1783 ,-4.4307 ,0.478809 ,4.40013 ,-5.26276 ,0.586201 ,4.50752 ,-4.4307 ,1.0208 ,4.03798 ,-3.59863 ,1.07892 ,4.1783 ,-3.59863 ,0.586201 ,4.50752 ,-4.4307 ,0.478809 ,4.40013 ,-4.4307 ,1.0208 ,4.03798 ,-4.4307 ,1.66012 ,3.91081 ,-4.4307 ,1.0208 ,4.03798 ,-5.26276 ,1.07892 ,4.1783 ,-5.26276 ,1.66012 ,4.06269 ,-4.4307 ,1.66012 ,3.91081 ,-3.59863 ,1.07892 ,4.1783 ,-4.4307 ,1.0208 ,4.03798 ,-3.59863 ,1.66012 ,4.06269 ,-5.26276 ,2.24132 ,4.1783 ,-4.4307 ,1.66012 ,3.91081 ,-5.26276 ,1.66012 ,4.06269 ,-4.4307 ,2.29944 ,4.03798 ,-3.59863 ,2.24132 ,4.1783 ,-3.59863 ,1.66012 ,4.06269 ,-4.4307 ,1.66012 ,3.91081 ,-4.4307 ,2.29944 ,4.03798 ,-4.4307 ,2.84143 ,4.40013 ,-4.4307 ,2.29944 ,4.03798 ,-5.26276 ,2.24132 ,4.1783 ,-5.26276 ,2.73404 ,4.50752 ,-4.4307 ,2.84143 ,4.40013 ,-3.59863 ,2.24132 ,4.1783 ,-4.4307 ,2.29944 ,4.03798 ,-3.59863 ,2.73404 ,4.50752 ,-5.26276 ,3.06326 ,5.00024 ,-4.4307 ,2.84143 ,4.40013 ,-5.26276 ,2.73404 ,4.50752 ,-4.4307 ,3.20358 ,4.94212 ,-3.59863 ,3.06326 ,5.00024 ,-3.59863 ,2.73404 ,4.50752 ,-4.4307 ,2.84143 ,4.40013 ,-4.4307 ,3.20358 ,4.94212 ,-4.4307 ,3.33074 ,5.58144 ,-4.4307 ,3.20358 ,4.94212 ,-5.26276 ,3.06326 ,5.00024 ,-5.26276 ,3.17887 ,5.58144 ,-4.4307 ,3.33074 ,5.58144 ,-3.59863 ,3.06326 ,5.00024 ,-4.4307 ,3.20358 ,4.94212 ,-3.59863 ,3.17887 ,5.58144 ,1.57047 ,5.64031 ,-1.49622 ,1.57047 ,5.26549 ,-1.33712 ,1.44886 ,4.47065 ,-3.87612 ,1.44886 ,4.36605 ,-3.83172 ,1.35471 ,4.47065 ,-3.87612 ,1.35471 ,4.36605 ,-3.83172 ,1.2331 ,5.64031 ,-1.49622 ,1.2331 ,5.26549 ,-1.33712 ,1.35471 ,4.47065 ,-3.87612 ,1.2331 ,5.64031 ,-1.49622 ,1.44886 ,4.47065 ,-3.87612 ,1.57047 ,5.64031 ,-1.49622 ,1.2331 ,5.26549 ,-1.33712 ,1.35471 ,4.36605 ,-3.83172 ,1.57047 ,5.26549 ,-1.33712 ,1.44886 ,4.36605 ,-3.83172 ,1.14686 ,5.85852 ,-1.33471 ,1.14686 ,5.30763 ,-1.10087 ,1.64686 ,5.85852 ,-1.33471 ,1.64686 ,5.30763 ,-1.10087 ,2.09281 ,5.79411 ,-1.12728 ,2.09281 ,5.5316 ,-1.01586 ,2.09281 ,5.73347 ,-1.27015 ,2.09281 ,5.47096 ,-1.15873 ,1.64686 ,5.74398 ,-1.60456 ,1.64686 ,5.19309 ,-1.37072 ,1.14686 ,5.74398 ,-1.60456 ,1.14686 ,5.19309 ,-1.37072 ,0.635642 ,5.74122 ,-1.26406 ,0.635642 ,5.46936 ,-1.14866 ,0.635642 ,5.79925 ,-1.12735 ,0.635642 ,5.52739 ,-1.01195 ,1.14686 ,5.85852 ,-1.33471 ,1.64686 ,5.85852 ,-1.33471 ,1.14686 ,5.19309 ,-1.37072 ,1.64686 ,5.19309 ,-1.37072 ,2.09281 ,5.79411 ,-1.12728 ,2.09281 ,5.5316 ,-1.01586 ,2.09281 ,5.79411 ,-1.12728 ,2.09281 ,5.5316 ,-1.01586 ,1.64686 ,5.19309 ,-1.37072 ,2.09281 ,5.47096 ,-1.15873 ,0.635642 ,5.79925 ,-1.12735 ,0.635642 ,5.46936 ,-1.14866 ,0.635642 ,5.52739 ,-1.01195 ,0.635642 ,5.79925 ,-1.12735 ,-1.44886 ,4.47065 ,-3.87612 ,-1.57047 ,5.26549 ,-1.33712 ,-1.57047 ,5.64031 ,-1.49622 ,-1.44886 ,4.36605 ,-3.83172 ,-1.2331 ,5.64031 ,-1.49622 ,-1.35471 ,4.36605 ,-3.83172 ,-1.35471 ,4.47065 ,-3.87612 ,-1.2331 ,5.26549 ,-1.33712 ,-1.44886 ,4.47065 ,-3.87612 ,-1.2331 ,5.64031 ,-1.49622 ,-1.35471 ,4.47065 ,-3.87612 ,-1.57047 ,5.64031 ,-1.49622 ,-1.57047 ,5.26549 ,-1.33712 ,-1.35471 ,4.36605 ,-3.83172 ,-1.2331 ,5.26549 ,-1.33712 ,-1.44886 ,4.36605 ,-3.83172 ,-1.64686 ,5.85852 ,-1.33471 ,-1.14686 ,5.30763 ,-1.10087 ,-1.14686 ,5.85852 ,-1.33471 ,-1.64686 ,5.30763 ,-1.10087 ,-2.09281 ,5.73347 ,-1.27015 ,-2.09281 ,5.5316 ,-1.01586 ,-2.09281 ,5.79411 ,-1.12728 ,-2.09281 ,5.47096 ,-1.15873 ,-1.14686 ,5.74398 ,-1.60456 ,-1.64686 ,5.19309 ,-1.37072 ,-1.64686 ,5.74398 ,-1.60456 ,-1.14686 ,5.19309 ,-1.37072 ,-0.635642 ,5.79925 ,-1.12735 ,-0.635642 ,5.46936 ,-1.14866 ,-0.635642 ,5.74122 ,-1.26406 ,-0.635642 ,5.52739 ,-1.01195 ,-1.14686 ,5.85852 ,-1.33471 ,-1.64686 ,5.85852 ,-1.33471 ,-1.14686 ,5.19309 ,-1.37072 ,-1.64686 ,5.19309 ,-1.37072 ,-2.09281 ,5.79411 ,-1.12728 ,-2.09281 ,5.5316 ,-1.01586 ,-2.09281 ,5.73347 ,-1.27015 ,-2.09281 ,5.79411 ,-1.12728 ,-1.64686 ,5.19309 ,-1.37072 ,-2.09281 ,5.47096 ,-1.15873 ,-2.09281 ,5.73347 ,-1.27015 ,-0.635642 ,5.74122 ,-1.26406 ,-0.635642 ,5.46936 ,-1.14866 ,-0.635642 ,5.79925 ,-1.12735 ,-0.635642 ,5.74122 ,-1.26406 ,-0.635642 ,5.79925 ,-1.12735 ,3.28145 ,5.5256 ,5.3738 ,4.1697 ,4.0473 ,5.3738 ,3.86047 ,5.75026 ,5.25979 ,4.63989 ,4.45308 ,5.25979 ,3.86047 ,5.75026 ,5.25979 ,4.63989 ,4.45308 ,5.25979 ,3.86047 ,5.75026 ,4.3003 ,4.63989 ,4.45308 ,4.3003 ,3.86047 ,5.75026 ,4.3003 ,4.63989 ,4.45308 ,4.3003 ,3.28145 ,5.5256 ,4.1863 ,4.63989 ,4.45308 ,4.3003 ,4.1697 ,4.0473 ,4.1863 ,3.28145 ,5.5256 ,4.1863 ,3.28145 ,5.5256 ,5.3738 ,3.86047 ,5.75026 ,4.3003 ,3.86047 ,5.75026 ,5.25979 ,4.1697 ,4.0473 ,5.3738 ,4.1697 ,4.0473 ,4.1863 ,4.63989 ,4.45308 ,5.25979 ,4.63989 ,4.45308 ,4.3003 ,2.15556 ,3.39441 ,-0.97551 ,2.15556 ,4.16003 ,-1.06926 ,2.15556 ,4.44128 ,-0.88176 ,2.15556 ,4.22253 ,0.368225 ,2.15556 ,3.39441 ,1.64948 ,2.15556 ,5.50378 ,0.961975 ,2.15556 ,5.37878 ,1.46198 ,0.6 ,3.39441 ,-0.97551 ,0.6 ,4.16003 ,-1.06926 ,2.15556 ,4.16003 ,-1.06926 ,0.6 ,4.44128 ,-0.88176 ,2.15556 ,4.44128 ,-0.88176 ,2.15556 ,4.44128 ,-0.88176 ,0.6 ,4.44128 ,-0.88176 ,0.6 ,4.22253 ,0.36824 ,2.15556 ,4.22253 ,0.368225 ,2.15556 ,4.22253 ,0.368225 ,0.6 ,4.22253 ,0.36824 ,0.6 ,5.50378 ,0.96199 ,2.15556 ,5.50378 ,0.961975 ,2.15556 ,5.50378 ,0.961975 ,0.6 ,5.50378 ,0.96199 ,0.6 ,5.37878 ,1.46199 ,2.15556 ,5.37878 ,1.46198 ,2.15556 ,5.37878 ,1.46198 ,0.6 ,5.37878 ,1.46199 ,0.6 ,3.39441 ,1.64949 ,2.15556 ,3.39441 ,1.64948 ,0.6 ,4.44128 ,-0.88176 ,0.6 ,4.22253 ,0.36824 ,0.6 ,3.39441 ,1.64949 ,0.6 ,5.37878 ,1.46199 ,0.6 ,5.50378 ,0.96199 ,3.01518 ,4.97158 ,3.09081 ,3.01518 ,6.18587 ,3.09081 ,2.92589 ,4.97158 ,3.24546 ,2.92589 ,6.18586 ,3.24546 ,2.74732 ,6.18586 ,3.24546 ,2.74732 ,4.97158 ,3.24546 ,2.65804 ,4.97158 ,3.09081 ,2.65804 ,6.18587 ,3.09081 ,2.65804 ,4.97158 ,3.09081 ,2.65804 ,6.18587 ,3.09081 ,2.74732 ,6.18586 ,2.93617 ,2.74732 ,4.97157 ,2.93617 ,2.92589 ,4.97157 ,2.93617 ,2.92589 ,6.18586 ,2.93617 ,3.01518 ,6.18587 ,3.09081 ,3.01518 ,4.97158 ,3.09081 ,2.77919 ,6.71412 ,3.24546 ,2.86501 ,6.73873 ,3.09081 ,2.60753 ,6.6649 ,3.24546 ,2.5217 ,6.64029 ,3.09081 ,2.60753 ,6.6649 ,2.93616 ,2.5217 ,6.64029 ,3.09081 ,2.77919 ,6.71413 ,2.93616 ,2.86501 ,6.73873 ,3.09081 ,2.55914 ,7.02218 ,3.24546 ,2.61412 ,7.09253 ,3.09081 ,2.44921 ,6.88147 ,3.24546 ,2.39421 ,6.81111 ,3.09081 ,2.44921 ,6.88147 ,2.93617 ,2.39421 ,6.81111 ,3.09081 ,2.55914 ,7.02219 ,2.93617 ,2.61412 ,7.09253 ,3.09081 ,2.28942 ,7.15433 ,3.24546 ,2.30647 ,7.24197 ,3.09081 ,2.25536 ,6.97905 ,3.24546 ,2.23831 ,6.89137 ,3.09081 ,2.25536 ,6.97905 ,2.93616 ,2.23831 ,6.89137 ,3.09081 ,2.28942 ,7.15433 ,2.93616 ,2.30647 ,7.24197 ,3.09081 ,1.98661 ,7.18344 ,3.24546 ,1.98661 ,7.27268 ,3.09081 ,1.98661 ,7.00489 ,3.24546 ,1.98661 ,6.91558 ,3.09081 ,1.98661 ,7.00489 ,2.93616 ,1.98661 ,6.91558 ,3.09081 ,1.98661 ,7.18344 ,2.93617 ,1.98661 ,7.27268 ,3.09081 ,-0.00112091 ,7.18345 ,3.24546 ,1.98661 ,7.18344 ,3.24546 ,1.98661 ,7.27268 ,3.09081 ,-0.00112091 ,7.27269 ,3.09081 ,-0.00112091 ,7.00489 ,3.24546 ,1.98661 ,7.00489 ,3.24546 ,-0.00112091 ,6.91557 ,3.09081 ,1.98661 ,6.91558 ,3.09081 ,-0.00112091 ,7.0049 ,2.93616 ,1.98661 ,7.00489 ,2.93616 ,1.98661 ,6.91558 ,3.09081 ,-0.00112091 ,6.91557 ,3.09081 ,-0.00112091 ,7.18345 ,2.93617 ,1.98661 ,7.18344 ,2.93617 ,-0.00112091 ,7.27269 ,3.09081 ,1.98661 ,7.27268 ,3.09081 ,1.40786 ,7.11017 ,-1.88513 ,1.40786 ,7.08937 ,3.10419 ,1.34143 ,6.99511 ,-1.88513 ,1.34143 ,6.97431 ,3.10419 ,1.34143 ,6.99511 ,-1.88513 ,1.34143 ,6.97431 ,3.10419 ,1.20857 ,6.97431 ,3.10419 ,1.20857 ,6.99511 ,-1.88513 ,1.20857 ,6.99511 ,-1.88513 ,1.20857 ,6.97431 ,3.10419 ,1.14214 ,7.11017 ,-1.88513 ,1.14214 ,7.08937 ,3.10419 ,1.14214 ,7.11017 ,-1.88513 ,1.14214 ,7.08937 ,3.10419 ,1.20857 ,7.20442 ,3.10419 ,1.20857 ,7.22523 ,-1.88513 ,1.20857 ,7.22523 ,-1.88513 ,1.20857 ,7.20442 ,3.10419 ,1.34143 ,7.22523 ,-1.88513 ,1.34143 ,7.20442 ,3.10419 ,1.34143 ,7.22523 ,-1.88513 ,1.34143 ,7.20442 ,3.10419 ,1.40786 ,7.08937 ,3.10419 ,1.40786 ,7.11017 ,-1.88513 ,2.52315 ,1.65387 ,-4.08368 ,3.57579 ,1.65387 ,-4.08368 ,2.52315 ,2.29555 ,-4.35369 ,3.57579 ,2.29555 ,-4.35369 ,3.57579 ,2.56134 ,-5.00556 ,2.52315 ,2.56134 ,-5.00556 ,2.52315 ,2.29555 ,-5.65742 ,3.57579 ,2.29555 ,-5.65742 ,3.57579 ,1.65387 ,-5.92743 ,2.52315 ,1.65387 ,-5.92743 ,2.52315 ,1.01219 ,-5.65742 ,3.57579 ,1.01219 ,-5.65742 ,2.52315 ,1.01219 ,-5.65742 ,3.57579 ,1.01219 ,-5.65742 ,3.57579 ,0.746398 ,-5.00556 ,2.52315 ,0.746398 ,-5.00556 ,2.52315 ,1.01219 ,-4.35369 ,3.57579 ,1.01219 ,-4.35369 ,1.64814 ,1.65387 ,-4.70739 ,1.64814 ,1.8494 ,-4.79472 ,1.64814 ,1.93039 ,-5.00556 ,1.64814 ,1.8494 ,-5.2164 ,1.64814 ,1.65387 ,-5.30373 ,1.64814 ,1.45834 ,-5.2164 ,1.64814 ,1.45834 ,-5.2164 ,1.64814 ,1.37735 ,-5.00556 ,1.64814 ,1.45834 ,-4.79472 ,-0.00112091 ,1.65387 ,-4.70738 ,-0.00112091 ,1.8494 ,-4.79472 ,-0.00112091 ,1.93039 ,-5.00555 ,-0.00112091 ,1.8494 ,-5.2164 ,-0.00112091 ,1.65387 ,-5.30373 ,-0.00112091 ,1.45834 ,-5.2164 ,-0.00112091 ,1.45834 ,-5.2164 ,1.64814 ,1.45834 ,-5.2164 ,1.64814 ,1.37735 ,-5.00556 ,-0.00112091 ,1.45834 ,-5.2164 ,-0.00112091 ,1.37735 ,-5.00555 ,-0.00112091 ,1.45834 ,-4.79472 ,-0.00112091 ,1.11017 ,-4.09113 ,-0.00112091 ,1.11017 ,-5.91612 ,0.99375 ,1.11017 ,-5.91612 ,1.1009 ,1.22686 ,-4.09113 ,1.10089 ,1.22686 ,-5.91612 ,1.49375 ,1.34941 ,-5.72404 ,-0.00112091 ,1.11017 ,-4.09113 ,0.99375 ,1.11017 ,-4.09113 ,-0.00112091 ,3.47859 ,-4.09113 ,1.1009 ,1.22686 ,-4.09113 ,0.99375 ,2.22859 ,-4.09113 ,1.49375 ,1.34941 ,-4.28321 ,1.49375 ,2.10776 ,-4.28321 ,1.57708 ,3.47859 ,-4.09113 ,0.99375 ,1.11017 ,-4.09113 ,1.49375 ,1.34941 ,-4.28321 ,1.49375 ,2.10776 ,-5.72404 ,1.49375 ,2.10776 ,-4.28321 ,0.99375 ,2.22859 ,-5.91612 ,0.99375 ,2.22859 ,-4.09113 ,0.99375 ,2.22859 ,-4.09113 ,0.99375 ,2.22859 ,-5.91612 ,1.57708 ,3.47859 ,-5.91612 ,1.57708 ,3.47859 ,-4.09113 ,-0.00112091 ,3.47859 ,-5.91612 ,0.99375 ,2.22859 ,-5.91612 ,1.10089 ,1.22686 ,-5.91612 ,1.49375 ,1.34941 ,-5.72404 ,1.57708 ,3.47859 ,-5.91612 ,1.77987 ,3.46628 ,7.95238 ,2.06737 ,3.46628 ,7.95238 ,1.92362 ,3.69856 ,8.10906 ,2.21112 ,3.69856 ,8.10906 ,2.35487 ,3.46628 ,7.95238 ,2.21112 ,3.234 ,7.79569 ,1.92362 ,3.234 ,7.79569 ,1.77987 ,3.46429 ,5.25238 ,1.77987 ,3.46628 ,7.95238 ,1.92362 ,3.71327 ,5.25238 ,1.92362 ,3.69856 ,8.10906 ,2.21112 ,3.69856 ,8.10906 ,2.21112 ,3.71327 ,5.25238 ,2.35487 ,3.46429 ,5.25238 ,2.35487 ,3.46628 ,7.95238 ,2.35487 ,3.46429 ,5.25238 ,2.35487 ,3.46628 ,7.95238 ,2.21112 ,3.234 ,7.79569 ,2.21112 ,3.2153 ,5.25238 ,1.92362 ,3.2153 ,5.25238 ,1.92362 ,3.234 ,7.79569 ,1.77987 ,3.46628 ,7.95238 ,1.77987 ,3.46429 ,5.25238 ,2.70328 ,4.08592 ,-8.12664 ,2.69656 ,3.52342 ,-8.12664 ,0.752339 ,4.08592 ,-8.12664 ,0.75906 ,3.52342 ,-8.12664 ,2.69656 ,4.08592 ,-6.18914 ,2.69656 ,3.52342 ,-6.18914 ,2.70328 ,4.08592 ,-8.12664 ,2.69656 ,3.52342 ,-8.12664 ,0.752339 ,4.08592 ,-8.12664 ,0.75906 ,3.52342 ,-8.12664 ,0.75906 ,4.08592 ,-6.18914 ,0.75906 ,3.52342 ,-6.18914 ,0.752339 ,4.08592 ,-8.12664 ,0.75906 ,4.08592 ,-6.18914 ,2.70328 ,4.08592 ,-8.12664 ,2.69656 ,4.08592 ,-6.18914 ,0.75906 ,3.52342 ,-6.18914 ,0.75906 ,3.52342 ,-8.12664 ,2.69656 ,3.52342 ,-6.18914 ,2.69656 ,3.52342 ,-8.12664 ,2.53125 ,5.01497 ,7.64841 ,0 ,5.01498 ,8.02341 ,0 ,4.10615 ,7.89073 ,2.53125 ,4.10616 ,7.51572 ,3.15717 ,5.00932 ,7.64841 ,3.15717 ,4.54371 ,7.51572 ,2.53125 ,1.87535 ,-2.97386 ,-0.00112091 ,1.87534 ,-2.97386 ,-0.00112091 ,1.87534 ,-3.16136 ,2.53125 ,1.87535 ,-3.16136 ,2.53125 ,1.87535 ,0.0198975 ,-0.00112091 ,1.87534 ,0.0198903 ,2.53125 ,1.87535 ,2.5199 ,-0.00112091 ,1.87534 ,2.51989 ,-0.00112091 ,1.87534 ,-3.66136 ,2.53125 ,1.87535 ,-3.66136 ,-0.00112091 ,1.87534 ,-4.78636 ,2.53125 ,1.87535 ,-4.78636 ,-0.00112091 ,1.87534 ,-5.81761 ,2.53125 ,1.87535 ,-5.81761 ,-0.00112091 ,1.87534 ,-6.59886 ,2.19301 ,1.87535 ,-6.59886 ,-0.00112091 ,1.43397 ,-7.87386 ,2.19301 ,1.43398 ,-7.37386 ,2.53125 ,2.69243 ,3.46884 ,-0.00112091 ,2.69243 ,3.46884 ,2.53125 ,3.14684 ,6.12253 ,-0.00112091 ,3.14684 ,6.12254 ,2.53125 ,4.10616 ,7.51572 ,0 ,4.10615 ,7.89073 ,2.19301 ,1.87535 ,-8.09261 ,-0.00112091 ,1.87534 ,-8.2505 ,-0.00112091 ,2.88189 ,-8.53681 ,2.53125 ,2.8819 ,-8.37892 ,2.19301 ,1.43398 ,-7.37386 ,-0.00112091 ,1.43397 ,-7.87386 ,4.38446 ,3.77171 ,-2.86449 ,4.38446 ,3.73002 ,0.0210876 ,4.38446 ,3.70921 ,-2.66136 ,4.38446 ,3.58799 ,0.0198975 ,4.38446 ,3.5599 ,2.5199 ,4.38446 ,3.62965 ,2.49609 ,4.38446 ,3.97909 ,-3.66136 ,4.38446 ,3.77516 ,-1.51582 ,4.38446 ,3.76748 ,1.66275 ,4.38446 ,3.92503 ,-2.65868 ,4.38446 ,4.10062 ,-4.23081 ,4.38446 ,4.33654 ,-4.2301 ,4.38446 ,3.88531 ,-5.80244 ,4.38446 ,4.12002 ,-5.87508 ,4.38446 ,3.23414 ,-6.69242 ,4.38446 ,3.8866 ,2.41275 ,4.38446 ,3.70337 ,3.46884 ,4.38446 ,3.97501 ,4.53033 ,4.38446 ,3.75227 ,6.12253 ,4.38446 ,3.99131 ,6.12253 ,4.38446 ,3.85549 ,7.51572 ,4.38446 ,3.95328 ,7.64841 ,4.38446 ,3.11302 ,-6.49854 ,4.38446 ,3.70921 ,-2.66136 ,3.15717 ,3.40081 ,-2.97386 ,3.15717 ,3.40081 ,-3.16136 ,4.38446 ,3.77171 ,-2.86449 ,4.38446 ,3.58799 ,0.0198975 ,3.15717 ,3.40081 ,0.0198975 ,4.38446 ,3.5599 ,2.5199 ,3.15717 ,3.40081 ,2.5199 ,3.15717 ,3.40081 ,-3.66136 ,4.38446 ,3.97909 ,-3.66136 ,4.38446 ,3.77516 ,-1.51582 ,3.15717 ,4.37021 ,-1.51582 ,3.15717 ,4.33361 ,1.66275 ,4.38446 ,3.76748 ,1.66275 ,4.38446 ,3.92503 ,-2.65868 ,3.15717 ,5.08381 ,-2.65868 ,3.15717 ,3.40081 ,-4.78636 ,4.38446 ,4.10062 ,-4.23081 ,4.38446 ,4.33654 ,-4.2301 ,3.15717 ,5.10278 ,-4.2301 ,3.15717 ,3.40081 ,-5.81761 ,4.38446 ,3.88531 ,-5.80244 ,3.15717 ,4.95639 ,-5.87297 ,4.38446 ,4.12002 ,-5.87508 ,3.15717 ,4.34588 ,-7.05154 ,3.15717 ,3.40081 ,-6.59886 ,4.38446 ,3.11302 ,-6.49854 ,4.38446 ,3.23414 ,-6.69242 ,3.77628 ,2.95636 ,-7.52037 ,3.15717 ,2.79988 ,-8.23576 ,3.15717 ,3.17468 ,-7.37386 ,3.77628 ,2.95636 ,-7.52037 ,3.15717 ,5.59528 ,2.99608 ,4.38446 ,3.8866 ,2.41275 ,4.38446 ,3.70337 ,3.46884 ,3.15717 ,3.81942 ,3.46884 ,3.15717 ,5.80724 ,5.11367 ,4.38446 ,3.97501 ,4.53033 ,4.38446 ,3.75227 ,6.12253 ,3.15717 ,4.05223 ,6.12253 ,3.15717 ,5.88485 ,6.70586 ,4.38446 ,3.99131 ,6.12253 ,4.38446 ,3.85549 ,7.51572 ,3.15717 ,4.54371 ,7.51572 ,4.38446 ,3.95328 ,7.64841 ,3.15717 ,5.00932 ,7.64841 ,4.38446 ,3.95328 ,7.64841 ,4.38446 ,3.95328 ,7.64841 ,3.15717 ,5.00932 ,7.64841 ,4.38446 ,3.23414 ,-6.69242 ,4.38446 ,3.11302 ,-6.49854 ,3.15717 ,3.40081 ,-2.97386 ,2.53125 ,1.87535 ,-2.97386 ,2.53125 ,1.87535 ,-3.16136 ,3.15717 ,3.40081 ,-3.16136 ,3.15717 ,3.40081 ,0.0198975 ,2.53125 ,1.87535 ,0.0198975 ,3.15717 ,3.40081 ,2.5199 ,2.53125 ,1.87535 ,2.5199 ,2.53125 ,1.87535 ,-3.66136 ,3.15717 ,3.40081 ,-3.66136 ,2.53125 ,1.87535 ,-4.78636 ,3.15717 ,3.40081 ,-4.78636 ,2.53125 ,1.87535 ,-5.81761 ,3.15717 ,3.40081 ,-5.81761 ,2.19301 ,1.87535 ,-6.59886 ,3.15717 ,3.40081 ,-6.59886 ,3.15717 ,2.79988 ,-8.23576 ,2.19301 ,1.87535 ,-8.09261 ,2.53125 ,2.8819 ,-8.37892 ,2.19301 ,1.43398 ,-7.37386 ,3.15717 ,3.17468 ,-7.37386 ,2.19301 ,1.43398 ,-7.37386 ,2.19301 ,1.87535 ,-8.09261 ,3.15717 ,2.79988 ,-8.23576 ,3.15717 ,3.81942 ,3.46884 ,2.53125 ,2.69243 ,3.46884 ,3.15717 ,4.05223 ,6.12253 ,2.53125 ,3.14684 ,6.12253 ,3.15717 ,4.54371 ,7.51572 ,2.53125 ,4.10616 ,7.51572 ,1.15459 ,5.34434 ,-5.98805 ,2.53125 ,4.91165 ,-5.87297 ,0 ,4.93088 ,-6.07008 ,0 ,5.34434 ,-6.03739 ,2.53125 ,5.19737 ,-4.2301 ,0 ,5.19737 ,-3.51761 ,-0.00112091 ,5.21324 ,-2.65868 ,2.53125 ,5.21324 ,-2.65868 ,1.15459 ,5.34434 ,-5.98805 ,0 ,5.34434 ,-6.03739 ,0 ,5.4666 ,-3.7676 ,1.15459 ,5.44737 ,-4.80095 ,2.53125 ,4.19736 ,-7.05154 ,-0.00112091 ,4.19737 ,-7.61404 ,0 ,4.93088 ,-6.07008 ,2.53125 ,4.91165 ,-5.87297 ,2.53125 ,2.8819 ,-8.37892 ,-0.00112091 ,2.88189 ,-8.53681 ,3.15717 ,5.10278 ,-4.2301 ,3.15717 ,5.08381 ,-2.65868 ,3.15717 ,4.95639 ,-5.87297 ,3.15717 ,4.34588 ,-7.05154 ,3.15717 ,2.79988 ,-8.23576 ,3.15717 ,2.79988 ,-8.23576 ,0 ,5.34434 ,-6.03739 ,0 ,4.93088 ,-6.07008 ,0 ,5.19737 ,-3.51761 ,0 ,5.4666 ,-3.7676 ,2.53125 ,3.82039 ,-1.92372 ,-0.00112091 ,3.82038 ,-1.92372 ,-0.00112091 ,3.74895 ,1.66275 ,2.53125 ,3.74895 ,1.66275 ,2.53125 ,5.21324 ,-2.65868 ,-0.00112091 ,5.21324 ,-2.65868 ,-0.00112091 ,5.55054 ,2.99608 ,2.53125 ,5.55054 ,2.99608 ,3.15717 ,4.37021 ,-1.51582 ,3.15717 ,4.33361 ,1.66275 ,3.15717 ,5.08381 ,-2.65868 ,3.15717 ,5.08381 ,-2.65868 ,3.15717 ,5.59528 ,2.99608 ,2.53125 ,5.55054 ,2.99608 ,-0.00112091 ,5.55054 ,2.99608 ,-0.00112091 ,5.91138 ,5.11366 ,2.53125 ,5.91138 ,5.11367 ,0 ,6.06285 ,6.70587 ,2.53125 ,6.06285 ,6.70586 ,0 ,5.01498 ,8.02341 ,2.53125 ,5.01497 ,7.64841 ,3.15717 ,5.59528 ,2.99608 ,3.15717 ,5.80724 ,5.11367 ,3.15717 ,5.88485 ,6.70586 ,3.15717 ,5.00932 ,7.64841 ,3.28145 ,5.5256 ,6.9363 ,4.1697 ,4.0473 ,6.9363 ,3.86047 ,5.75026 ,6.82229 ,4.63989 ,4.45308 ,6.82229 ,3.86047 ,5.75026 ,6.82229 ,4.63989 ,4.45308 ,6.82229 ,3.86047 ,5.75026 ,5.8628 ,4.63989 ,4.45308 ,5.8628 ,3.86047 ,5.75026 ,5.8628 ,4.63989 ,4.45308 ,5.8628 ,3.28145 ,5.5256 ,5.7488 ,4.63989 ,4.45308 ,5.8628 ,4.1697 ,4.0473 ,5.7488 ,3.28145 ,5.5256 ,5.7488 ,3.28145 ,5.5256 ,6.9363 ,3.86047 ,5.75026 ,5.8628 ,3.86047 ,5.75026 ,6.82229 ,4.1697 ,4.0473 ,6.9363 ,4.1697 ,4.0473 ,5.7488 ,4.63989 ,4.45308 ,6.82229 ,4.63989 ,4.45308 ,5.8628 ,3.01518 ,4.98901 ,-2.96243 ,3.01518 ,6.20824 ,-2.33814 ,2.92589 ,4.90294 ,-2.81899 ,2.92589 ,6.12216 ,-2.19471 ,2.74732 ,6.12216 ,-2.19471 ,2.74732 ,4.90294 ,-2.81899 ,2.65804 ,4.98901 ,-2.96243 ,2.65804 ,6.20824 ,-2.33814 ,2.65804 ,4.98901 ,-2.96243 ,2.65804 ,6.20824 ,-2.33814 ,2.74732 ,6.29431 ,-2.48157 ,2.74732 ,5.07508 ,-3.10586 ,2.92589 ,5.07508 ,-3.10586 ,2.92589 ,6.29431 ,-2.48157 ,3.01518 ,6.20824 ,-2.33814 ,3.01518 ,4.98901 ,-2.96243 ,2.77919 ,6.65258 ,-1.92312 ,2.86501 ,6.76336 ,-2.0539 ,2.60753 ,6.60316 ,-1.94843 ,2.5217 ,6.66452 ,-2.10451 ,2.60753 ,6.7753 ,-2.2353 ,2.5217 ,6.66452 ,-2.10451 ,2.77919 ,6.82473 ,-2.20999 ,2.86501 ,6.76336 ,-2.0539 ,2.55914 ,6.96189 ,-1.76474 ,2.61412 ,7.1186 ,-1.87201 ,2.44921 ,6.82061 ,-1.83709 ,2.39421 ,6.83603 ,-2.01669 ,2.44921 ,6.99275 ,-2.12395 ,2.39421 ,6.83603 ,-2.01669 ,2.55914 ,7.13404 ,-2.05161 ,2.61412 ,7.1186 ,-1.87201 ,2.28942 ,7.09457 ,-1.6968 ,2.30647 ,7.26864 ,-1.79518 ,2.25536 ,6.91858 ,-1.78692 ,2.23831 ,6.91662 ,-1.97543 ,2.25536 ,7.09073 ,-2.07379 ,2.23831 ,6.91662 ,-1.97543 ,2.28942 ,7.26672 ,-1.98367 ,2.30647 ,7.26864 ,-1.79518 ,1.98661 ,7.1238 ,-1.68184 ,1.98661 ,7.29948 ,-1.77939 ,1.98661 ,6.94453 ,-1.77363 ,1.98661 ,6.94093 ,-1.96298 ,1.98661 ,7.11667 ,-2.0605 ,1.98661 ,6.94093 ,-1.96298 ,1.98661 ,7.29594 ,-1.96871 ,1.98661 ,7.29948 ,-1.77939 ,-0.00112091 ,7.12382 ,-1.68183 ,1.98661 ,7.1238 ,-1.68184 ,1.98661 ,7.29948 ,-1.77939 ,-0.00112091 ,7.29949 ,-1.77939 ,-0.00112091 ,6.94453 ,-1.77363 ,1.98661 ,6.94453 ,-1.77363 ,-0.00112091 ,6.94091 ,-1.96299 ,1.98661 ,6.94093 ,-1.96298 ,-0.00112091 ,7.11668 ,-2.0605 ,1.98661 ,7.11667 ,-2.0605 ,1.98661 ,6.94093 ,-1.96298 ,-0.00112091 ,6.94091 ,-1.96299 ,-0.00112091 ,7.29596 ,-1.9687 ,1.98661 ,7.29594 ,-1.96871 ,-0.00112091 ,7.29949 ,-1.77939 ,1.98661 ,7.29948 ,-1.77939 ,1.09654 ,3.46628 ,7.95238 ,1.38404 ,3.46628 ,7.95238 ,1.24029 ,3.69856 ,8.10906 ,1.52779 ,3.69856 ,8.10906 ,1.67154 ,3.46628 ,7.95238 ,1.52779 ,3.234 ,7.79569 ,1.24029 ,3.234 ,7.79569 ,1.09654 ,3.46429 ,5.25238 ,1.09654 ,3.46628 ,7.95238 ,1.24029 ,3.71327 ,5.25238 ,1.24029 ,3.69856 ,8.10906 ,1.52779 ,3.69856 ,8.10906 ,1.52779 ,3.71327 ,5.25238 ,1.67154 ,3.46429 ,5.25238 ,1.67154 ,3.46628 ,7.95238 ,1.67154 ,3.46429 ,5.25238 ,1.67154 ,3.46628 ,7.95238 ,1.52779 ,3.234 ,7.79569 ,1.52779 ,3.2153 ,5.25238 ,1.24029 ,3.2153 ,5.25238 ,1.24029 ,3.234 ,7.79569 ,1.09654 ,3.46628 ,7.95238 ,1.09654 ,3.46429 ,5.25238 ,0 ,1.02193 ,6.13655 ,-0.00112091 ,1.02193 ,4.13605 ,0.99375 ,1.02193 ,4.13605 ,1.1009 ,1.13863 ,6.13655 ,1.10089 ,1.13863 ,4.13605 ,1.49375 ,1.26118 ,4.3466 ,0 ,1.02193 ,6.13655 ,0.99375 ,1.02193 ,6.13655 ,-0.00112091 ,3.39035 ,6.13655 ,1.1009 ,1.13863 ,6.13655 ,0.99375 ,2.14035 ,6.13655 ,1.49375 ,1.26118 ,5.926 ,1.49375 ,2.01953 ,5.926 ,1.57708 ,3.39035 ,6.13655 ,0.99375 ,1.02193 ,6.13655 ,1.49375 ,1.26118 ,5.926 ,1.49375 ,2.01953 ,4.3466 ,1.49375 ,2.01953 ,5.926 ,0.99375 ,2.14035 ,4.13605 ,0.99375 ,2.14035 ,6.13655 ,0.99375 ,2.14035 ,6.13655 ,0.99375 ,2.14035 ,4.13605 ,1.57708 ,3.39035 ,3.46938 ,1.57708 ,3.39035 ,6.13655 ,-0.00112091 ,3.39035 ,3.46938 ,0.99375 ,2.14035 ,4.13605 ,1.10089 ,1.13863 ,4.13605 ,1.49375 ,1.26118 ,4.3466 ,1.57708 ,3.39035 ,3.46938 ,2.52315 ,1.65387 ,6.50281 ,3.57579 ,1.65387 ,6.50281 ,2.52315 ,2.29555 ,6.2328 ,3.57579 ,2.29555 ,6.2328 ,3.57579 ,2.56134 ,5.58093 ,2.52315 ,2.56134 ,5.58093 ,2.52315 ,2.29555 ,4.92907 ,3.57579 ,2.29555 ,4.92907 ,3.57579 ,1.65387 ,4.65906 ,2.52315 ,1.65387 ,4.65906 ,2.52315 ,1.01219 ,4.92907 ,3.57579 ,1.01219 ,4.92907 ,2.52315 ,1.01219 ,4.92907 ,3.57579 ,1.01219 ,4.92907 ,3.57579 ,0.746398 ,5.58093 ,2.52315 ,0.746398 ,5.58093 ,2.52315 ,1.01219 ,6.2328 ,3.57579 ,1.01219 ,6.2328 ,1.64814 ,1.65387 ,5.8791 ,1.64814 ,1.8494 ,5.79177 ,1.64814 ,1.93039 ,5.58093 ,1.64814 ,1.8494 ,5.37009 ,1.64814 ,1.65387 ,5.28276 ,1.64814 ,1.45834 ,5.37009 ,1.64814 ,1.45834 ,5.37009 ,1.64814 ,1.37735 ,5.58093 ,1.64814 ,1.45834 ,5.79177 ,-0.00112091 ,1.65387 ,5.87911 ,-0.00112091 ,1.8494 ,5.79177 ,-0.00112091 ,1.93039 ,5.58094 ,-0.00112091 ,1.8494 ,5.37009 ,-0.00112091 ,1.65387 ,5.28276 ,-0.00112091 ,1.45834 ,5.37009 ,-0.00112091 ,1.45834 ,5.37009 ,1.64814 ,1.45834 ,5.37009 ,1.64814 ,1.37735 ,5.58093 ,-0.00112091 ,1.45834 ,5.37009 ,-0.00112091 ,1.37735 ,5.58094 ,-0.00112091 ,1.45834 ,5.79177 ,-3.86047 ,5.75026 ,5.25979 ,-4.1697 ,4.0473 ,5.3738 ,-3.28145 ,5.5256 ,5.3738 ,-4.63989 ,4.45308 ,5.25979 ,-3.86047 ,5.75026 ,4.3003 ,-4.63989 ,4.45308 ,5.25979 ,-3.86047 ,5.75026 ,5.25979 ,-4.63989 ,4.45308 ,4.3003 ,-3.28145 ,5.5256 ,4.1863 ,-4.63989 ,4.45308 ,4.3003 ,-3.86047 ,5.75026 ,4.3003 ,-4.1697 ,4.0473 ,4.1863 ,-4.63989 ,4.45308 ,4.3003 ,-3.86047 ,5.75026 ,4.3003 ,-3.28145 ,5.5256 ,5.3738 ,-3.28145 ,5.5256 ,4.1863 ,-3.86047 ,5.75026 ,5.25979 ,-4.63989 ,4.45308 ,5.25979 ,-4.1697 ,4.0473 ,4.1863 ,-4.1697 ,4.0473 ,5.3738 ,-4.63989 ,4.45308 ,4.3003 ,-2.15556 ,4.44128 ,-0.88176 ,-2.15556 ,4.16003 ,-1.06926 ,-2.15556 ,3.39441 ,-0.97551 ,-2.15556 ,4.22253 ,0.368225 ,-2.15556 ,3.39441 ,1.64948 ,-2.15556 ,5.37878 ,1.46198 ,-2.15556 ,5.50378 ,0.961975 ,-0.6 ,4.16003 ,-1.06926 ,-0.6 ,3.39441 ,-0.97551 ,-2.15556 ,3.39441 ,-0.97551 ,-2.15556 ,4.16003 ,-1.06926 ,-0.6 ,4.44128 ,-0.88176 ,-2.15556 ,4.44128 ,-0.88176 ,-0.6 ,4.22253 ,0.36824 ,-0.6 ,4.44128 ,-0.88176 ,-2.15556 ,4.44128 ,-0.88176 ,-2.15556 ,4.22253 ,0.368225 ,-0.6 ,5.50378 ,0.96199 ,-0.6 ,4.22253 ,0.36824 ,-2.15556 ,4.22253 ,0.368225 ,-2.15556 ,5.50378 ,0.961975 ,-0.6 ,5.37878 ,1.46199 ,-0.6 ,5.50378 ,0.96199 ,-2.15556 ,5.50378 ,0.961975 ,-0.6 ,3.39441 ,1.64949 ,-0.6 ,5.37878 ,1.46199 ,-0.6 ,3.39441 ,-0.97551 ,-0.6 ,4.16003 ,-1.06926 ,-0.6 ,4.44128 ,-0.88176 ,-0.6 ,4.22253 ,0.36824 ,-0.6 ,5.50378 ,0.96199 ,-0.6 ,5.37878 ,1.46199 ,-2.92589 ,4.97158 ,3.24546 ,-3.01518 ,6.18587 ,3.09081 ,-3.01518 ,4.97158 ,3.09081 ,-2.92589 ,6.18586 ,3.24546 ,-2.74732 ,6.18586 ,3.24546 ,-2.74732 ,4.97158 ,3.24546 ,-2.65804 ,4.97158 ,3.09081 ,-2.65804 ,6.18587 ,3.09081 ,-2.74732 ,6.18586 ,2.93617 ,-2.65804 ,6.18587 ,3.09081 ,-2.65804 ,4.97158 ,3.09081 ,-2.74732 ,4.97157 ,2.93617 ,-2.92589 ,4.97157 ,2.93617 ,-2.92589 ,6.18586 ,2.93617 ,-3.01518 ,6.18587 ,3.09081 ,-3.01518 ,4.97158 ,3.09081 ,-2.77919 ,6.71412 ,3.24546 ,-2.86501 ,6.73873 ,3.09081 ,-2.60753 ,6.6649 ,3.24546 ,-2.5217 ,6.64029 ,3.09081 ,-2.60753 ,6.6649 ,2.93616 ,-2.5217 ,6.64029 ,3.09081 ,-2.77919 ,6.71413 ,2.93616 ,-2.86501 ,6.73873 ,3.09081 ,-2.55914 ,7.02218 ,3.24546 ,-2.61412 ,7.09253 ,3.09081 ,-2.44921 ,6.88147 ,3.24546 ,-2.39421 ,6.81111 ,3.09081 ,-2.44921 ,6.88147 ,2.93617 ,-2.39421 ,6.81111 ,3.09081 ,-2.55914 ,7.02219 ,2.93617 ,-2.61412 ,7.09253 ,3.09081 ,-2.28942 ,7.15433 ,3.24546 ,-2.30647 ,7.24197 ,3.09081 ,-2.25536 ,6.97905 ,3.24546 ,-2.23831 ,6.89137 ,3.09081 ,-2.25536 ,6.97905 ,2.93616 ,-2.23831 ,6.89137 ,3.09081 ,-2.28942 ,7.15433 ,2.93616 ,-2.30647 ,7.24197 ,3.09081 ,-1.98661 ,7.18344 ,3.24546 ,-1.98661 ,7.27268 ,3.09081 ,-1.98661 ,7.00489 ,3.24546 ,-1.98661 ,6.91558 ,3.09081 ,-1.98661 ,7.00489 ,2.93616 ,-1.98661 ,6.91558 ,3.09081 ,-1.98661 ,7.18344 ,2.93617 ,-1.98661 ,7.27268 ,3.09081 ,-1.98661 ,7.27268 ,3.09081 ,-1.98661 ,7.18344 ,3.24546 ,0.00112091 ,7.18345 ,3.24546 ,0.00112091 ,7.27269 ,3.09081 ,-1.98661 ,7.00489 ,3.24546 ,0.00112091 ,7.00489 ,3.24546 ,-1.98661 ,6.91558 ,3.09081 ,0.00112091 ,6.91557 ,3.09081 ,-1.98661 ,6.91558 ,3.09081 ,-1.98661 ,7.00489 ,2.93616 ,0.00112091 ,7.0049 ,2.93616 ,0.00112091 ,6.91557 ,3.09081 ,-1.98661 ,7.18344 ,2.93617 ,0.00112091 ,7.18345 ,2.93617 ,-1.98661 ,7.27268 ,3.09081 ,0.00112091 ,7.27269 ,3.09081 ,-1.34143 ,6.99511 ,-1.88513 ,-1.40786 ,7.08937 ,3.10419 ,-1.40786 ,7.11017 ,-1.88513 ,-1.34143 ,6.97431 ,3.10419 ,-1.20857 ,6.97431 ,3.10419 ,-1.34143 ,6.97431 ,3.10419 ,-1.34143 ,6.99511 ,-1.88513 ,-1.20857 ,6.99511 ,-1.88513 ,-1.14214 ,7.11017 ,-1.88513 ,-1.20857 ,6.97431 ,3.10419 ,-1.20857 ,6.99511 ,-1.88513 ,-1.14214 ,7.08937 ,3.10419 ,-1.20857 ,7.20442 ,3.10419 ,-1.14214 ,7.08937 ,3.10419 ,-1.14214 ,7.11017 ,-1.88513 ,-1.20857 ,7.22523 ,-1.88513 ,-1.34143 ,7.22523 ,-1.88513 ,-1.20857 ,7.20442 ,3.10419 ,-1.20857 ,7.22523 ,-1.88513 ,-1.34143 ,7.20442 ,3.10419 ,-1.40786 ,7.08937 ,3.10419 ,-1.34143 ,7.20442 ,3.10419 ,-1.34143 ,7.22523 ,-1.88513 ,-1.40786 ,7.11017 ,-1.88513 ,-2.52315 ,2.29555 ,-4.35369 ,-3.57579 ,1.65387 ,-4.08368 ,-2.52315 ,1.65387 ,-4.08368 ,-3.57579 ,2.29555 ,-4.35369 ,-3.57579 ,2.56134 ,-5.00556 ,-2.52315 ,2.56134 ,-5.00556 ,-2.52315 ,2.29555 ,-5.65742 ,-3.57579 ,2.29555 ,-5.65742 ,-3.57579 ,1.65387 ,-5.92743 ,-2.52315 ,1.65387 ,-5.92743 ,-2.52315 ,1.01219 ,-5.65742 ,-3.57579 ,1.01219 ,-5.65742 ,-3.57579 ,0.746398 ,-5.00556 ,-3.57579 ,1.01219 ,-5.65742 ,-2.52315 ,1.01219 ,-5.65742 ,-2.52315 ,0.746398 ,-5.00556 ,-2.52315 ,1.01219 ,-4.35369 ,-3.57579 ,1.01219 ,-4.35369 ,-1.64814 ,1.65387 ,-4.70739 ,-1.64814 ,1.8494 ,-4.79472 ,-1.64814 ,1.93039 ,-5.00556 ,-1.64814 ,1.8494 ,-5.2164 ,-1.64814 ,1.65387 ,-5.30373 ,-1.64814 ,1.45834 ,-5.2164 ,-1.64814 ,1.45834 ,-5.2164 ,-1.64814 ,1.37735 ,-5.00556 ,-1.64814 ,1.45834 ,-4.79472 ,0.00112091 ,1.65387 ,-4.70738 ,0.00112091 ,1.8494 ,-4.79472 ,0.00112091 ,1.93039 ,-5.00555 ,0.00112091 ,1.8494 ,-5.2164 ,0.00112091 ,1.65387 ,-5.30373 ,0.00112091 ,1.45834 ,-5.2164 ,-1.64814 ,1.37735 ,-5.00556 ,-1.64814 ,1.45834 ,-5.2164 ,0.00112091 ,1.45834 ,-5.2164 ,0.00112091 ,1.37735 ,-5.00555 ,0.00112091 ,1.45834 ,-5.2164 ,0.00112091 ,1.45834 ,-4.79472 ,-0.99375 ,1.11017 ,-5.91612 ,0.00112091 ,1.11017 ,-5.91612 ,0.00112091 ,1.11017 ,-4.09113 ,-1.49375 ,1.34941 ,-5.72404 ,-1.10089 ,1.22686 ,-5.91612 ,-1.1009 ,1.22686 ,-4.09113 ,0.00112091 ,3.47859 ,-4.09113 ,-0.99375 ,1.11017 ,-4.09113 ,-0.99375 ,2.22859 ,-4.09113 ,-1.1009 ,1.22686 ,-4.09113 ,-1.49375 ,2.10776 ,-4.28321 ,-1.49375 ,1.34941 ,-4.28321 ,-1.57708 ,3.47859 ,-4.09113 ,-1.10089 ,1.22686 ,-5.91612 ,-0.99375 ,1.11017 ,-4.09113 ,-0.99375 ,1.11017 ,-4.09113 ,-1.49375 ,1.34941 ,-4.28321 ,-1.49375 ,1.34941 ,-5.72404 ,-1.1009 ,1.22686 ,-4.09113 ,-1.49375 ,2.10776 ,-5.72404 ,-0.99375 ,2.22859 ,-5.91612 ,-1.49375 ,2.10776 ,-4.28321 ,-0.99375 ,2.22859 ,-4.09113 ,-1.57708 ,3.47859 ,-5.91612 ,-0.99375 ,2.22859 ,-5.91612 ,-0.99375 ,2.22859 ,-4.09113 ,-1.57708 ,3.47859 ,-4.09113 ,0.00112091 ,1.11017 ,-5.91612 ,-0.99375 ,1.11017 ,-5.91612 ,0.00112091 ,3.47859 ,-5.91612 ,-1.10089 ,1.22686 ,-5.91612 ,-0.99375 ,2.22859 ,-5.91612 ,-1.49375 ,1.34941 ,-5.72404 ,-1.49375 ,2.10776 ,-5.72404 ,-1.57708 ,3.47859 ,-5.91612 ,-1.92362 ,3.69856 ,8.10906 ,-2.06737 ,3.46628 ,7.95238 ,-1.77987 ,3.46628 ,7.95238 ,-2.21112 ,3.69856 ,8.10906 ,-2.35487 ,3.46628 ,7.95238 ,-2.21112 ,3.234 ,7.79569 ,-1.92362 ,3.234 ,7.79569 ,-1.92362 ,3.71327 ,5.25238 ,-1.77987 ,3.46628 ,7.95238 ,-1.77987 ,3.46429 ,5.25238 ,-1.92362 ,3.69856 ,8.10906 ,-2.21112 ,3.69856 ,8.10906 ,-2.21112 ,3.71327 ,5.25238 ,-2.35487 ,3.46429 ,5.25238 ,-2.35487 ,3.46628 ,7.95238 ,-2.21112 ,3.234 ,7.79569 ,-2.35487 ,3.46628 ,7.95238 ,-2.35487 ,3.46429 ,5.25238 ,-2.21112 ,3.2153 ,5.25238 ,-1.92362 ,3.2153 ,5.25238 ,-2.21112 ,3.234 ,7.79569 ,-1.92362 ,3.234 ,7.79569 ,-1.77987 ,3.46628 ,7.95238 ,-1.92362 ,3.234 ,7.79569 ,-1.77987 ,3.46429 ,5.25238 ,-0.752339 ,4.08592 ,-8.12664 ,-2.69656 ,3.52342 ,-8.12664 ,-2.70328 ,4.08592 ,-8.12664 ,-0.75906 ,3.52342 ,-8.12664 ,-2.70328 ,4.08592 ,-8.12664 ,-2.69656 ,3.52342 ,-6.18914 ,-2.69656 ,4.08592 ,-6.18914 ,-2.69656 ,3.52342 ,-8.12664 ,-0.75906 ,4.08592 ,-6.18914 ,-0.75906 ,3.52342 ,-8.12664 ,-0.752339 ,4.08592 ,-8.12664 ,-0.75906 ,3.52342 ,-6.18914 ,-2.70328 ,4.08592 ,-8.12664 ,-0.75906 ,4.08592 ,-6.18914 ,-0.752339 ,4.08592 ,-8.12664 ,-2.69656 ,4.08592 ,-6.18914 ,-2.69656 ,3.52342 ,-6.18914 ,-0.75906 ,3.52342 ,-8.12664 ,-0.75906 ,3.52342 ,-6.18914 ,-2.69656 ,3.52342 ,-8.12664 ,0 ,4.10615 ,7.89073 ,0 ,5.01498 ,8.02341 ,-2.53125 ,5.01497 ,7.64841 ,-2.53125 ,4.10616 ,7.51572 ,-3.15717 ,5.00932 ,7.64841 ,-3.15717 ,4.54371 ,7.51572 ,0.00112091 ,1.87534 ,-3.16136 ,0.00112091 ,1.87534 ,-2.97386 ,-2.53125 ,1.87535 ,-2.97386 ,-2.53125 ,1.87535 ,-3.16136 ,0.00112091 ,1.87534 ,0.0198903 ,-2.53125 ,1.87535 ,0.0198975 ,0.00112091 ,1.87534 ,2.51989 ,-2.53125 ,1.87535 ,2.5199 ,0.00112091 ,1.87534 ,-3.66136 ,-2.53125 ,1.87535 ,-3.66136 ,0.00112091 ,1.87534 ,-4.78636 ,-2.53125 ,1.87535 ,-4.78636 ,0.00112091 ,1.87534 ,-5.81761 ,-2.53125 ,1.87535 ,-5.81761 ,0.00112091 ,1.87534 ,-6.59886 ,-2.19301 ,1.87535 ,-6.59886 ,0.00112091 ,1.43397 ,-7.87386 ,-2.19301 ,1.43398 ,-7.37386 ,0.00112091 ,2.69243 ,3.46884 ,-2.53125 ,2.69243 ,3.46884 ,0.00112091 ,3.14684 ,6.12254 ,-2.53125 ,3.14684 ,6.12253 ,0 ,4.10615 ,7.89073 ,-2.53125 ,4.10616 ,7.51572 ,0.00112091 ,2.88189 ,-8.53681 ,0.00112091 ,1.87534 ,-8.2505 ,-2.19301 ,1.87535 ,-8.09261 ,-2.53125 ,2.8819 ,-8.37892 ,0.00112091 ,1.43397 ,-7.87386 ,-2.19301 ,1.43398 ,-7.37386 ,-4.38446 ,3.70921 ,-2.66136 ,-4.38446 ,3.73002 ,0.0210876 ,-4.38446 ,3.77171 ,-2.86449 ,-4.38446 ,3.58799 ,0.0198975 ,-4.38446 ,3.5599 ,2.5199 ,-4.38446 ,3.62965 ,2.49609 ,-4.38446 ,3.77516 ,-1.51582 ,-4.38446 ,3.97909 ,-3.66136 ,-4.38446 ,3.76748 ,1.66275 ,-4.38446 ,3.92503 ,-2.65868 ,-4.38446 ,4.33654 ,-4.2301 ,-4.38446 ,4.10062 ,-4.23081 ,-4.38446 ,4.12002 ,-5.87508 ,-4.38446 ,3.88531 ,-5.80244 ,-4.38446 ,3.23414 ,-6.69242 ,-4.38446 ,3.8866 ,2.41275 ,-4.38446 ,3.70337 ,3.46884 ,-4.38446 ,3.97501 ,4.53033 ,-4.38446 ,3.75227 ,6.12253 ,-4.38446 ,3.99131 ,6.12253 ,-4.38446 ,3.85549 ,7.51572 ,-4.38446 ,3.95328 ,7.64841 ,-4.38446 ,3.11302 ,-6.49854 ,-3.15717 ,3.40081 ,-3.16136 ,-3.15717 ,3.40081 ,-2.97386 ,-4.38446 ,3.70921 ,-2.66136 ,-4.38446 ,3.77171 ,-2.86449 ,-3.15717 ,3.40081 ,0.0198975 ,-4.38446 ,3.58799 ,0.0198975 ,-3.15717 ,3.40081 ,2.5199 ,-4.38446 ,3.5599 ,2.5199 ,-3.15717 ,3.40081 ,-3.66136 ,-4.38446 ,3.97909 ,-3.66136 ,-3.15717 ,4.33361 ,1.66275 ,-3.15717 ,4.37021 ,-1.51582 ,-4.38446 ,3.77516 ,-1.51582 ,-4.38446 ,3.76748 ,1.66275 ,-3.15717 ,5.08381 ,-2.65868 ,-4.38446 ,3.92503 ,-2.65868 ,-3.15717 ,3.40081 ,-4.78636 ,-4.38446 ,4.10062 ,-4.23081 ,-4.38446 ,4.33654 ,-4.2301 ,-3.15717 ,5.10278 ,-4.2301 ,-3.15717 ,3.40081 ,-5.81761 ,-4.38446 ,3.88531 ,-5.80244 ,-3.15717 ,4.95639 ,-5.87297 ,-4.38446 ,4.12002 ,-5.87508 ,-3.15717 ,4.34588 ,-7.05154 ,-3.15717 ,3.40081 ,-6.59886 ,-4.38446 ,3.11302 ,-6.49854 ,-4.38446 ,3.23414 ,-6.69242 ,-3.15717 ,2.79988 ,-8.23576 ,-3.77628 ,2.95636 ,-7.52037 ,-3.15717 ,3.17468 ,-7.37386 ,-3.77628 ,2.95636 ,-7.52037 ,-3.15717 ,5.59528 ,2.99608 ,-4.38446 ,3.8866 ,2.41275 ,-3.15717 ,3.81942 ,3.46884 ,-4.38446 ,3.70337 ,3.46884 ,-3.15717 ,5.80724 ,5.11367 ,-4.38446 ,3.97501 ,4.53033 ,-3.15717 ,4.05223 ,6.12253 ,-4.38446 ,3.75227 ,6.12253 ,-3.15717 ,5.88485 ,6.70586 ,-4.38446 ,3.99131 ,6.12253 ,-3.15717 ,4.54371 ,7.51572 ,-4.38446 ,3.85549 ,7.51572 ,-3.15717 ,5.00932 ,7.64841 ,-4.38446 ,3.95328 ,7.64841 ,-4.38446 ,3.95328 ,7.64841 ,-3.15717 ,5.00932 ,7.64841 ,-4.38446 ,3.95328 ,7.64841 ,-4.38446 ,3.11302 ,-6.49854 ,-4.38446 ,3.23414 ,-6.69242 ,-2.53125 ,1.87535 ,-3.16136 ,-2.53125 ,1.87535 ,-2.97386 ,-3.15717 ,3.40081 ,-2.97386 ,-3.15717 ,3.40081 ,-3.16136 ,-2.53125 ,1.87535 ,0.0198975 ,-3.15717 ,3.40081 ,0.0198975 ,-2.53125 ,1.87535 ,2.5199 ,-3.15717 ,3.40081 ,2.5199 ,-2.53125 ,1.87535 ,-3.66136 ,-3.15717 ,3.40081 ,-3.66136 ,-2.53125 ,1.87535 ,-4.78636 ,-3.15717 ,3.40081 ,-4.78636 ,-2.53125 ,1.87535 ,-5.81761 ,-3.15717 ,3.40081 ,-5.81761 ,-2.19301 ,1.87535 ,-6.59886 ,-3.15717 ,3.40081 ,-6.59886 ,-2.53125 ,2.8819 ,-8.37892 ,-2.19301 ,1.87535 ,-8.09261 ,-3.15717 ,2.79988 ,-8.23576 ,-2.19301 ,1.43398 ,-7.37386 ,-3.15717 ,3.17468 ,-7.37386 ,-2.19301 ,1.43398 ,-7.37386 ,-3.15717 ,2.79988 ,-8.23576 ,-2.19301 ,1.87535 ,-8.09261 ,-2.53125 ,2.69243 ,3.46884 ,-3.15717 ,3.81942 ,3.46884 ,-2.53125 ,3.14684 ,6.12253 ,-3.15717 ,4.05223 ,6.12253 ,-2.53125 ,4.10616 ,7.51572 ,-3.15717 ,4.54371 ,7.51572 ,0 ,4.93088 ,-6.07008 ,-2.53125 ,4.91165 ,-5.87297 ,-1.15459 ,5.34434 ,-5.98805 ,0 ,5.34434 ,-6.03739 ,0.00112091 ,5.21324 ,-2.65868 ,0 ,5.19737 ,-3.51761 ,-2.53125 ,5.19737 ,-4.2301 ,-2.53125 ,5.21324 ,-2.65868 ,0 ,5.4666 ,-3.7676 ,0 ,5.34434 ,-6.03739 ,-1.15459 ,5.34434 ,-5.98805 ,-1.15459 ,5.44737 ,-4.80095 ,0 ,4.93088 ,-6.07008 ,0.00112091 ,4.19737 ,-7.61404 ,-2.53125 ,4.19736 ,-7.05154 ,-2.53125 ,4.91165 ,-5.87297 ,0.00112091 ,2.88189 ,-8.53681 ,-2.53125 ,2.8819 ,-8.37892 ,-3.15717 ,5.10278 ,-4.2301 ,-3.15717 ,5.08381 ,-2.65868 ,-3.15717 ,4.95639 ,-5.87297 ,-3.15717 ,4.34588 ,-7.05154 ,-3.15717 ,2.79988 ,-8.23576 ,-3.15717 ,2.79988 ,-8.23576 ,0 ,5.19737 ,-3.51761 ,0 ,4.93088 ,-6.07008 ,0 ,5.34434 ,-6.03739 ,0 ,5.4666 ,-3.7676 ,0.00112091 ,3.74895 ,1.66275 ,0.00112091 ,3.82038 ,-1.92372 ,-2.53125 ,3.82039 ,-1.92372 ,-2.53125 ,3.74895 ,1.66275 ,0.00112091 ,5.21324 ,-2.65868 ,-2.53125 ,5.21324 ,-2.65868 ,0.00112091 ,5.55054 ,2.99608 ,-2.53125 ,5.55054 ,2.99608 ,-3.15717 ,4.37021 ,-1.51582 ,-3.15717 ,4.33361 ,1.66275 ,-3.15717 ,5.08381 ,-2.65868 ,-3.15717 ,5.08381 ,-2.65868 ,-3.15717 ,5.59528 ,2.99608 ,0.00112091 ,5.91138 ,5.11366 ,0.00112091 ,5.55054 ,2.99608 ,-2.53125 ,5.55054 ,2.99608 ,-2.53125 ,5.91138 ,5.11367 ,0 ,6.06285 ,6.70587 ,-2.53125 ,6.06285 ,6.70586 ,0 ,5.01498 ,8.02341 ,-2.53125 ,5.01497 ,7.64841 ,-3.15717 ,5.59528 ,2.99608 ,-3.15717 ,5.80724 ,5.11367 ,-3.15717 ,5.88485 ,6.70586 ,-3.15717 ,5.00932 ,7.64841 ,-3.86047 ,5.75026 ,6.82229 ,-4.1697 ,4.0473 ,6.9363 ,-3.28145 ,5.5256 ,6.9363 ,-4.63989 ,4.45308 ,6.82229 ,-3.86047 ,5.75026 ,5.8628 ,-4.63989 ,4.45308 ,6.82229 ,-3.86047 ,5.75026 ,6.82229 ,-4.63989 ,4.45308 ,5.8628 ,-3.28145 ,5.5256 ,5.7488 ,-4.63989 ,4.45308 ,5.8628 ,-3.86047 ,5.75026 ,5.8628 ,-4.1697 ,4.0473 ,5.7488 ,-4.63989 ,4.45308 ,5.8628 ,-3.86047 ,5.75026 ,5.8628 ,-3.28145 ,5.5256 ,6.9363 ,-3.28145 ,5.5256 ,5.7488 ,-3.86047 ,5.75026 ,6.82229 ,-4.63989 ,4.45308 ,6.82229 ,-4.1697 ,4.0473 ,5.7488 ,-4.1697 ,4.0473 ,6.9363 ,-4.63989 ,4.45308 ,5.8628 ,-2.92589 ,4.90294 ,-2.81899 ,-3.01518 ,6.20824 ,-2.33814 ,-3.01518 ,4.98901 ,-2.96243 ,-2.92589 ,6.12216 ,-2.19471 ,-2.74732 ,6.12216 ,-2.19471 ,-2.74732 ,4.90294 ,-2.81899 ,-2.65804 ,4.98901 ,-2.96243 ,-2.65804 ,6.20824 ,-2.33814 ,-2.74732 ,6.29431 ,-2.48157 ,-2.65804 ,6.20824 ,-2.33814 ,-2.65804 ,4.98901 ,-2.96243 ,-2.74732 ,5.07508 ,-3.10586 ,-2.92589 ,5.07508 ,-3.10586 ,-2.92589 ,6.29431 ,-2.48157 ,-3.01518 ,6.20824 ,-2.33814 ,-3.01518 ,4.98901 ,-2.96243 ,-2.77919 ,6.65258 ,-1.92312 ,-2.86501 ,6.76336 ,-2.0539 ,-2.60753 ,6.60316 ,-1.94843 ,-2.5217 ,6.66452 ,-2.10451 ,-2.60753 ,6.7753 ,-2.2353 ,-2.5217 ,6.66452 ,-2.10451 ,-2.77919 ,6.82473 ,-2.20999 ,-2.86501 ,6.76336 ,-2.0539 ,-2.55914 ,6.96189 ,-1.76474 ,-2.61412 ,7.1186 ,-1.87201 ,-2.44921 ,6.82061 ,-1.83709 ,-2.39421 ,6.83603 ,-2.01669 ,-2.44921 ,6.99275 ,-2.12395 ,-2.39421 ,6.83603 ,-2.01669 ,-2.55914 ,7.13404 ,-2.05161 ,-2.61412 ,7.1186 ,-1.87201 ,-2.28942 ,7.09457 ,-1.6968 ,-2.30647 ,7.26864 ,-1.79518 ,-2.25536 ,6.91858 ,-1.78692 ,-2.23831 ,6.91662 ,-1.97543 ,-2.25536 ,7.09073 ,-2.07379 ,-2.23831 ,6.91662 ,-1.97543 ,-2.28942 ,7.26672 ,-1.98367 ,-2.30647 ,7.26864 ,-1.79518 ,-1.98661 ,7.1238 ,-1.68184 ,-1.98661 ,7.29948 ,-1.77939 ,-1.98661 ,6.94453 ,-1.77363 ,-1.98661 ,6.94093 ,-1.96298 ,-1.98661 ,7.11667 ,-2.0605 ,-1.98661 ,6.94093 ,-1.96298 ,-1.98661 ,7.29594 ,-1.96871 ,-1.98661 ,7.29948 ,-1.77939 ,-1.98661 ,7.29948 ,-1.77939 ,-1.98661 ,7.1238 ,-1.68184 ,0.00112091 ,7.12382 ,-1.68183 ,0.00112091 ,7.29949 ,-1.77939 ,-1.98661 ,6.94453 ,-1.77363 ,0.00112091 ,6.94453 ,-1.77363 ,-1.98661 ,6.94093 ,-1.96298 ,0.00112091 ,6.94091 ,-1.96299 ,-1.98661 ,6.94093 ,-1.96298 ,-1.98661 ,7.11667 ,-2.0605 ,0.00112091 ,7.11668 ,-2.0605 ,0.00112091 ,6.94091 ,-1.96299 ,-1.98661 ,7.29594 ,-1.96871 ,0.00112091 ,7.29596 ,-1.9687 ,-1.98661 ,7.29948 ,-1.77939 ,0.00112091 ,7.29949 ,-1.77939 ,-1.24029 ,3.69856 ,8.10906 ,-1.38404 ,3.46628 ,7.95238 ,-1.09654 ,3.46628 ,7.95238 ,-1.52779 ,3.69856 ,8.10906 ,-1.67154 ,3.46628 ,7.95238 ,-1.52779 ,3.234 ,7.79569 ,-1.24029 ,3.234 ,7.79569 ,-1.24029 ,3.71327 ,5.25238 ,-1.09654 ,3.46628 ,7.95238 ,-1.09654 ,3.46429 ,5.25238 ,-1.24029 ,3.69856 ,8.10906 ,-1.52779 ,3.69856 ,8.10906 ,-1.52779 ,3.71327 ,5.25238 ,-1.67154 ,3.46429 ,5.25238 ,-1.67154 ,3.46628 ,7.95238 ,-1.52779 ,3.234 ,7.79569 ,-1.67154 ,3.46628 ,7.95238 ,-1.67154 ,3.46429 ,5.25238 ,-1.52779 ,3.2153 ,5.25238 ,-1.24029 ,3.2153 ,5.25238 ,-1.52779 ,3.234 ,7.79569 ,-1.24029 ,3.234 ,7.79569 ,-1.09654 ,3.46628 ,7.95238 ,-1.24029 ,3.234 ,7.79569 ,-1.09654 ,3.46429 ,5.25238 ,-0.99375 ,1.02193 ,4.13605 ,0.00112091 ,1.02193 ,4.13605 ,-1.49375 ,1.26118 ,4.3466 ,-1.10089 ,1.13863 ,4.13605 ,-1.1009 ,1.13863 ,6.13655 ,0.00112091 ,3.39035 ,6.13655 ,-0.99375 ,1.02193 ,6.13655 ,0 ,1.02193 ,6.13655 ,-0.99375 ,2.14035 ,6.13655 ,-1.1009 ,1.13863 ,6.13655 ,-1.49375 ,2.01953 ,5.926 ,-1.49375 ,1.26118 ,5.926 ,-1.57708 ,3.39035 ,6.13655 ,-1.10089 ,1.13863 ,4.13605 ,-0.99375 ,1.02193 ,6.13655 ,-0.99375 ,1.02193 ,6.13655 ,-1.49375 ,1.26118 ,5.926 ,-1.49375 ,1.26118 ,4.3466 ,-1.1009 ,1.13863 ,6.13655 ,-1.49375 ,2.01953 ,4.3466 ,-0.99375 ,2.14035 ,4.13605 ,-1.49375 ,2.01953 ,5.926 ,-0.99375 ,2.14035 ,6.13655 ,-1.57708 ,3.39035 ,3.46938 ,-0.99375 ,2.14035 ,4.13605 ,-0.99375 ,2.14035 ,6.13655 ,-1.57708 ,3.39035 ,6.13655 ,0.00112091 ,1.02193 ,4.13605 ,-0.99375 ,1.02193 ,4.13605 ,0.00112091 ,3.39035 ,3.46938 ,-1.10089 ,1.13863 ,4.13605 ,-0.99375 ,2.14035 ,4.13605 ,-1.49375 ,1.26118 ,4.3466 ,-1.49375 ,2.01953 ,4.3466 ,-1.57708 ,3.39035 ,3.46938 ,-2.52315 ,2.29555 ,6.2328 ,-3.57579 ,1.65387 ,6.50281 ,-2.52315 ,1.65387 ,6.50281 ,-3.57579 ,2.29555 ,6.2328 ,-3.57579 ,2.56134 ,5.58093 ,-2.52315 ,2.56134 ,5.58093 ,-2.52315 ,2.29555 ,4.92907 ,-3.57579 ,2.29555 ,4.92907 ,-3.57579 ,1.65387 ,4.65906 ,-2.52315 ,1.65387 ,4.65906 ,-2.52315 ,1.01219 ,4.92907 ,-3.57579 ,1.01219 ,4.92907 ,-3.57579 ,0.746398 ,5.58093 ,-3.57579 ,1.01219 ,4.92907 ,-2.52315 ,1.01219 ,4.92907 ,-2.52315 ,0.746398 ,5.58093 ,-2.52315 ,1.01219 ,6.2328 ,-3.57579 ,1.01219 ,6.2328 ,-1.64814 ,1.65387 ,5.8791 ,-1.64814 ,1.8494 ,5.79177 ,-1.64814 ,1.93039 ,5.58093 ,-1.64814 ,1.8494 ,5.37009 ,-1.64814 ,1.65387 ,5.28276 ,-1.64814 ,1.45834 ,5.37009 ,-1.64814 ,1.45834 ,5.37009 ,-1.64814 ,1.37735 ,5.58093 ,-1.64814 ,1.45834 ,5.79177 ,0.00112091 ,1.65387 ,5.87911 ,0.00112091 ,1.8494 ,5.79177 ,0.00112091 ,1.93039 ,5.58094 ,0.00112091 ,1.8494 ,5.37009 ,0.00112091 ,1.65387 ,5.28276 ,0.00112091 ,1.45834 ,5.37009 ,-1.64814 ,1.37735 ,5.58093 ,-1.64814 ,1.45834 ,5.37009 ,0.00112091 ,1.45834 ,5.37009 ,0.00112091 ,1.37735 ,5.58094 ,0.00112091 ,1.45834 ,5.37009 ,0.00112091 ,1.45834 ,5.79177 ,1.26855 ,7.62908 ,-1.86968 ,1.26855 ,7.1118 ,-1.86968 ,2.12297 ,7.62908 ,-1.86968 ,2.12297 ,7.1118 ,-1.86968 ,2.12297 ,7.62908 ,-1.86968 ,2.12297 ,7.1118 ,-1.86968 ,2.12297 ,7.62908 ,-2.17578 ,2.12297 ,7.1118 ,-2.17578 ,1.26855 ,7.62908 ,-2.17578 ,1.26855 ,7.1118 ,-2.17578 ,1.26855 ,7.62908 ,-1.86968 ,1.26855 ,7.1118 ,-1.86968 ,0.205712 ,7.62908 ,-1.86968 ,0.205712 ,7.1118 ,-1.86968 ,1.06013 ,7.62908 ,-1.86968 ,1.06013 ,7.1118 ,-1.86968 ,1.06013 ,7.62908 ,-1.86968 ,1.06013 ,7.1118 ,-1.86968 ,1.06013 ,7.62908 ,-2.17578 ,1.06013 ,7.1118 ,-2.17578 ,0.205712 ,7.62908 ,-2.17578 ,0.205712 ,7.1118 ,-2.17578 ,0.205712 ,7.62908 ,-1.86968 ,0.205712 ,7.1118 ,-1.86968 ,-2.12297 ,7.62908 ,-1.86968 ,-1.26855 ,7.1118 ,-1.86968 ,-1.26855 ,7.62908 ,-1.86968 ,-2.12297 ,7.1118 ,-1.86968 ,-2.12297 ,7.62908 ,-2.17578 ,-2.12297 ,7.1118 ,-1.86968 ,-2.12297 ,7.62908 ,-1.86968 ,-2.12297 ,7.1118 ,-2.17578 ,-1.26855 ,7.62908 ,-2.17578 ,-1.26855 ,7.1118 ,-2.17578 ,-1.26855 ,7.62908 ,-1.86968 ,-1.26855 ,7.1118 ,-1.86968 ,-1.06013 ,7.62908 ,-1.86968 ,-0.205712 ,7.1118 ,-1.86968 ,-0.205712 ,7.62908 ,-1.86968 ,-1.06013 ,7.1118 ,-1.86968 ,-1.06013 ,7.62908 ,-2.17578 ,-1.06013 ,7.1118 ,-1.86968 ,-1.06013 ,7.62908 ,-1.86968 ,-1.06013 ,7.1118 ,-2.17578 ,-0.205712 ,7.62908 ,-2.17578 ,-0.205712 ,7.1118 ,-2.17578 ,-0.205712 ,7.62908 ,-1.86968 ,-0.205712 ,7.1118 ,-1.86968 ,1.83513 ,4.90408 ,7.7169 ,0.980712 ,4.3868 ,7.7169 ,0.980712 ,4.90408 ,7.7169 ,1.83513 ,4.3868 ,7.7169 ,1.83513 ,4.90408 ,8.023 ,1.83513 ,4.3868 ,7.7169 ,1.83513 ,4.90408 ,7.7169 ,1.83513 ,4.3868 ,8.023 ,0.980712 ,4.90408 ,8.023 ,0.980712 ,4.3868 ,8.023 ,0.980712 ,4.90408 ,7.7169 ,0.980712 ,4.3868 ,7.7169 ,-0.980712 ,4.90408 ,7.7169 ,-0.980712 ,4.3868 ,7.7169 ,-1.83513 ,4.90408 ,7.7169 ,-1.83513 ,4.3868 ,7.7169 ,-1.83513 ,4.90408 ,7.7169 ,-1.83513 ,4.3868 ,7.7169 ,-1.83513 ,4.90408 ,8.023 ,-1.83513 ,4.3868 ,8.023 ,-0.980712 ,4.90408 ,8.023 ,-0.980712 ,4.3868 ,8.023 ,-0.980712 ,4.90408 ,7.7169 ,-0.980712 ,4.3868 ,7.7169 ,5.3674 ,2.79918 ,-5 ,5.3674 ,2.71248 ,-4.5641 ,5.3674 ,1.66012 ,-5 ,3.33216 ,2.92574 ,-5 ,3.33216 ,1.66012 ,-5 ,3.33216 ,2.8294 ,-4.51567 ,5.52924 ,2.92574 ,-5 ,5.26276 ,3.17887 ,-5 ,5.26276 ,3.06326 ,-4.4188 ,5.52924 ,2.8294 ,-4.51567 ,3.59863 ,3.17887 ,-5 ,3.59863 ,3.06326 ,-4.4188 ,5.3674 ,2.46556 ,-4.19456 ,3.33216 ,2.55505 ,-4.10507 ,5.52924 ,2.55505 ,-4.10507 ,5.26276 ,2.73404 ,-3.92608 ,3.59863 ,2.73404 ,-3.92608 ,5.3674 ,2.09602 ,-3.94765 ,3.33216 ,2.14445 ,-3.83072 ,5.26276 ,2.24132 ,-3.59686 ,5.52924 ,2.14445 ,-3.83072 ,3.59863 ,2.24132 ,-3.59686 ,5.3674 ,1.66012 ,-3.86094 ,3.33216 ,1.66012 ,-3.73438 ,5.52924 ,1.66012 ,-3.73438 ,5.26276 ,1.66012 ,-3.48125 ,3.59863 ,1.66012 ,-3.48125 ,5.3674 ,1.22421 ,-3.94765 ,3.33216 ,1.17579 ,-3.83072 ,5.26276 ,1.07892 ,-3.59686 ,5.52924 ,1.17579 ,-3.83072 ,3.59863 ,1.07892 ,-3.59686 ,5.3674 ,0.854673 ,-4.19456 ,3.33216 ,0.765187 ,-4.10507 ,5.52924 ,0.765187 ,-4.10507 ,5.26276 ,0.586201 ,-3.92608 ,3.59863 ,0.586201 ,-3.92608 ,5.3674 ,0.607756 ,-4.5641 ,3.33216 ,0.490834 ,-4.51567 ,5.26276 ,0.256977 ,-4.4188 ,5.52924 ,0.490834 ,-4.51567 ,3.59863 ,0.256977 ,-4.4188 ,5.3674 ,0.52106 ,-5 ,3.33216 ,0.394494 ,-5 ,5.52924 ,0.394494 ,-5 ,5.26276 ,0.141369 ,-5 ,3.59863 ,0.141369 ,-5 ,5.3674 ,0.607756 ,-5.4359 ,3.33216 ,0.490834 ,-5.48433 ,5.26276 ,0.256977 ,-5.5812 ,5.52924 ,0.490834 ,-5.48433 ,3.59863 ,0.256977 ,-5.5812 ,5.3674 ,0.854673 ,-5.80544 ,3.33216 ,0.765187 ,-5.89493 ,5.52924 ,0.765187 ,-5.89493 ,5.26276 ,0.586201 ,-6.07392 ,3.59863 ,0.586201 ,-6.07392 ,5.3674 ,1.22421 ,-6.05235 ,3.33216 ,1.17579 ,-6.16928 ,5.26276 ,1.07892 ,-6.40314 ,5.52924 ,1.17579 ,-6.16928 ,3.59863 ,1.07892 ,-6.40314 ,5.3674 ,1.66012 ,-6.13906 ,3.33216 ,1.66012 ,-6.26563 ,5.52924 ,1.66012 ,-6.26563 ,5.26276 ,1.66012 ,-6.51875 ,3.59863 ,1.66012 ,-6.51875 ,5.3674 ,2.09602 ,-6.05235 ,3.33216 ,2.14445 ,-6.16928 ,5.26276 ,2.24132 ,-6.40314 ,5.52924 ,2.14445 ,-6.16928 ,3.59863 ,2.24132 ,-6.40314 ,5.3674 ,2.46556 ,-5.80544 ,3.33216 ,2.55505 ,-5.89493 ,5.52924 ,2.55505 ,-5.89493 ,5.26276 ,2.73404 ,-6.07392 ,3.59863 ,2.73404 ,-6.07392 ,5.3674 ,2.71248 ,-5.4359 ,3.33216 ,2.8294 ,-5.48433 ,5.26276 ,3.06326 ,-5.5812 ,5.52924 ,2.8294 ,-5.48433 ,3.59863 ,3.06326 ,-5.5812 ,5.26276 ,3.17887 ,-5 ,4.4307 ,3.33074 ,-5 ,5.26276 ,3.06326 ,-4.4188 ,4.4307 ,3.20358 ,-4.36068 ,4.4307 ,3.33074 ,-5 ,3.59863 ,3.17887 ,-5 ,3.59863 ,3.06326 ,-4.4188 ,4.4307 ,3.20358 ,-4.36068 ,5.26276 ,3.06326 ,-4.4188 ,4.4307 ,3.20358 ,-4.36068 ,4.4307 ,2.84143 ,-3.81869 ,5.26276 ,2.73404 ,-3.92608 ,4.4307 ,3.20358 ,-4.36068 ,3.59863 ,3.06326 ,-4.4188 ,4.4307 ,2.84143 ,-3.81869 ,3.59863 ,2.73404 ,-3.92608 ,5.26276 ,2.73404 ,-3.92608 ,4.4307 ,2.84143 ,-3.81869 ,5.26276 ,2.24132 ,-3.59686 ,4.4307 ,2.29944 ,-3.45654 ,4.4307 ,2.84143 ,-3.81869 ,3.59863 ,2.73404 ,-3.92608 ,3.59863 ,2.24132 ,-3.59686 ,4.4307 ,2.29944 ,-3.45654 ,5.26276 ,2.24132 ,-3.59686 ,4.4307 ,2.29944 ,-3.45654 ,4.4307 ,1.66012 ,-3.32937 ,5.26276 ,1.66012 ,-3.48125 ,4.4307 ,2.29944 ,-3.45654 ,3.59863 ,2.24132 ,-3.59686 ,4.4307 ,1.66012 ,-3.32937 ,3.59863 ,1.66012 ,-3.48125 ,5.26276 ,1.66012 ,-3.48125 ,4.4307 ,1.66012 ,-3.32937 ,5.26276 ,1.07892 ,-3.59686 ,4.4307 ,1.0208 ,-3.45654 ,4.4307 ,1.66012 ,-3.32937 ,3.59863 ,1.66012 ,-3.48125 ,3.59863 ,1.07892 ,-3.59686 ,4.4307 ,1.0208 ,-3.45654 ,5.26276 ,1.07892 ,-3.59686 ,4.4307 ,1.0208 ,-3.45654 ,4.4307 ,0.478809 ,-3.81869 ,5.26276 ,0.586201 ,-3.92608 ,4.4307 ,1.0208 ,-3.45654 ,3.59863 ,1.07892 ,-3.59686 ,4.4307 ,0.478809 ,-3.81869 ,3.59863 ,0.586201 ,-3.92608 ,5.26276 ,0.586201 ,-3.92608 ,4.4307 ,0.478809 ,-3.81869 ,5.26276 ,0.256977 ,-4.4188 ,4.4307 ,0.116663 ,-4.36068 ,4.4307 ,0.478809 ,-3.81869 ,3.59863 ,0.586201 ,-3.92608 ,3.59863 ,0.256977 ,-4.4188 ,4.4307 ,0.116663 ,-4.36068 ,5.26276 ,0.256977 ,-4.4188 ,4.4307 ,0.116663 ,-4.36068 ,4.4307 ,-0.0105057 ,-5 ,5.26276 ,0.141369 ,-5 ,4.4307 ,0.116663 ,-4.36068 ,3.59863 ,0.256977 ,-4.4188 ,4.4307 ,-0.0105057 ,-5 ,3.59863 ,0.141369 ,-5 ,5.26276 ,0.141369 ,-5 ,4.4307 ,-0.0105057 ,-5 ,5.26276 ,0.256977 ,-5.5812 ,4.4307 ,0.116663 ,-5.63932 ,4.4307 ,-0.0105057 ,-5 ,3.59863 ,0.141369 ,-5 ,3.59863 ,0.256977 ,-5.5812 ,4.4307 ,0.116663 ,-5.63932 ,5.26276 ,0.256977 ,-5.5812 ,4.4307 ,0.116663 ,-5.63932 ,4.4307 ,0.478809 ,-6.18131 ,5.26276 ,0.586201 ,-6.07392 ,4.4307 ,0.116663 ,-5.63932 ,3.59863 ,0.256977 ,-5.5812 ,4.4307 ,0.478809 ,-6.18131 ,3.59863 ,0.586201 ,-6.07392 ,5.26276 ,0.586201 ,-6.07392 ,4.4307 ,0.478809 ,-6.18131 ,5.26276 ,1.07892 ,-6.40314 ,4.4307 ,1.0208 ,-6.54346 ,4.4307 ,0.478809 ,-6.18131 ,3.59863 ,0.586201 ,-6.07392 ,3.59863 ,1.07892 ,-6.40314 ,4.4307 ,1.0208 ,-6.54346 ,5.26276 ,1.07892 ,-6.40314 ,4.4307 ,1.0208 ,-6.54346 ,4.4307 ,1.66012 ,-6.67063 ,5.26276 ,1.66012 ,-6.51875 ,4.4307 ,1.0208 ,-6.54346 ,3.59863 ,1.07892 ,-6.40314 ,4.4307 ,1.66012 ,-6.67063 ,3.59863 ,1.66012 ,-6.51875 ,5.26276 ,1.66012 ,-6.51875 ,4.4307 ,1.66012 ,-6.67063 ,5.26276 ,2.24132 ,-6.40314 ,4.4307 ,2.29944 ,-6.54346 ,4.4307 ,1.66012 ,-6.67063 ,3.59863 ,1.66012 ,-6.51875 ,3.59863 ,2.24132 ,-6.40314 ,4.4307 ,2.29944 ,-6.54346 ,5.26276 ,2.24132 ,-6.40314 ,4.4307 ,2.29944 ,-6.54346 ,4.4307 ,2.84143 ,-6.18131 ,5.26276 ,2.73404 ,-6.07392 ,4.4307 ,2.29944 ,-6.54346 ,3.59863 ,2.24132 ,-6.40314 ,4.4307 ,2.84143 ,-6.18131 ,3.59863 ,2.73404 ,-6.07392 ,5.26276 ,2.73404 ,-6.07392 ,4.4307 ,2.84143 ,-6.18131 ,5.26276 ,3.06326 ,-5.5812 ,4.4307 ,3.20358 ,-5.63932 ,4.4307 ,2.84143 ,-6.18131 ,3.59863 ,2.73404 ,-6.07392 ,3.59863 ,3.06326 ,-5.5812 ,4.4307 ,3.20358 ,-5.63932 ,5.26276 ,3.06326 ,-5.5812 ,4.4307 ,3.20358 ,-5.63932 ,4.4307 ,3.33074 ,-5 ,5.26276 ,3.17887 ,-5 ,4.4307 ,3.20358 ,-5.63932 ,3.59863 ,3.06326 ,-5.5812 ,4.4307 ,3.33074 ,-5 ,3.59863 ,3.17887 ,-5 ] ,"normals": [ 0.853097 ,-0.520609 ,-0.0345183 ,0.853101 ,-0.467764 ,-0.231118 ,1 ,0 ,0 ,-0.854735 ,0.519065 ,1.4012e-007 ,-1 ,0 ,0 ,-0.91976 ,0.362606 ,0.150197 ,0.992581 ,0.116804 ,0.0337532 ,0.454129 ,0.890936 ,2.80027e-007 ,0.454129 ,0.823118 ,0.340946 ,0.961402 ,-0.268379 ,-0.0606564 ,-0.45413 ,0.890935 ,2.83971e-007 ,-0.45413 ,0.823117 ,0.340946 ,0.853102 ,-0.343712 ,-0.392528 ,-0.854735 ,0.367035 ,0.367035 ,0.992581 ,0.0587307 ,0.106462 ,0.454129 ,0.629987 ,0.629987 ,-0.45413 ,0.629986 ,0.629987 ,0.853101 ,-0.167336 ,-0.494183 ,-0.919759 ,0.150197 ,0.362607 ,0.454128 ,0.340946 ,0.823118 ,0.961404 ,-0.146879 ,-0.232654 ,-0.454129 ,0.340946 ,0.823117 ,0.8531 ,0.034517 ,-0.520604 ,-0.854734 ,0 ,0.519066 ,0.992581 ,-0.0337527 ,0.116809 ,0.454128 ,0 ,0.890936 ,-0.454129 ,0 ,0.890936 ,0.853099 ,0.231119 ,-0.467768 ,-0.919759 ,-0.150197 ,0.362607 ,0.454128 ,-0.340947 ,0.823118 ,0.961402 ,0.0606552 ,-0.268377 ,-0.454129 ,-0.340946 ,0.823117 ,0.853095 ,0.392537 ,-0.34372 ,-0.854734 ,-0.367035 ,0.367035 ,0.992581 ,-0.106458 ,0.0587268 ,0.454128 ,-0.629987 ,0.629987 ,-0.45413 ,-0.629986 ,0.629987 ,0.853096 ,0.494192 ,-0.167335 ,-0.91976 ,-0.362606 ,0.150196 ,0.454128 ,-0.823118 ,0.340946 ,0.961398 ,0.232674 ,-0.146889 ,-0.45413 ,-0.823117 ,0.340946 ,0.853098 ,0.520607 ,0.0345189 ,-0.854735 ,-0.519065 ,1.37425e-007 ,0.992581 ,-0.116805 ,-0.0337485 ,0.454128 ,-0.890936 ,2.76083e-007 ,-0.45413 ,-0.890936 ,2.80027e-007 ,0.853093 ,0.467778 ,0.231118 ,-0.91976 ,-0.362606 ,-0.150196 ,0.454129 ,-0.823118 ,-0.340946 ,0.9614 ,0.268387 ,0.0606525 ,-0.45413 ,-0.823117 ,-0.340946 ,0.853096 ,0.343719 ,0.392535 ,-0.854735 ,-0.367034 ,-0.367034 ,0.992581 ,-0.0587251 ,-0.106458 ,0.454128 ,-0.629987 ,-0.629987 ,-0.45413 ,-0.629987 ,-0.629987 ,0.853099 ,0.167338 ,0.494187 ,-0.91976 ,-0.150196 ,-0.362606 ,0.454129 ,-0.340947 ,-0.823117 ,0.961401 ,0.146885 ,0.232664 ,-0.45413 ,-0.340946 ,-0.823117 ,0.8531 ,-0.0345193 ,0.520605 ,-0.854735 ,0 ,-0.519064 ,0.992581 ,0.0337517 ,-0.116805 ,0.454129 ,0 ,-0.890936 ,-0.45413 ,0 ,-0.890935 ,0.853103 ,-0.231117 ,0.467762 ,-0.91976 ,0.150196 ,-0.362606 ,0.454129 ,0.340946 ,-0.823117 ,0.961403 ,-0.0606557 ,0.268376 ,-0.45413 ,0.340946 ,-0.823117 ,0.853103 ,-0.392528 ,0.343712 ,-0.854735 ,0.367034 ,-0.367034 ,0.992581 ,0.106462 ,-0.0587312 ,0.454129 ,0.629987 ,-0.629987 ,-0.45413 ,0.629986 ,-0.629987 ,0.853099 ,-0.494187 ,0.167338 ,-0.91976 ,0.362606 ,-0.150196 ,0.454129 ,0.823118 ,-0.340946 ,0.961403 ,-0.232658 ,0.146881 ,-0.45413 ,0.823117 ,-0.340946 ,0.454129 ,0.890936 ,2.80027e-007 ,-1.04184e-007 ,1 ,1.52417e-007 ,0.454129 ,0.823118 ,0.340946 ,-1.04184e-007 ,0.923879 ,0.382684 ,-1.04184e-007 ,1 ,1.52417e-007 ,-0.45413 ,0.890935 ,2.83971e-007 ,-0.45413 ,0.823117 ,0.340946 ,-1.04184e-007 ,0.923879 ,0.382684 ,0.454129 ,0.823118 ,0.340946 ,-1.04184e-007 ,0.923879 ,0.382684 ,-1.04184e-007 ,0.707107 ,0.707107 ,0.454129 ,0.629987 ,0.629987 ,-1.04184e-007 ,0.923879 ,0.382684 ,-0.45413 ,0.823117 ,0.340946 ,-1.04184e-007 ,0.707107 ,0.707107 ,-0.45413 ,0.629986 ,0.629987 ,0.454129 ,0.629987 ,0.629987 ,-1.04184e-007 ,0.707107 ,0.707107 ,0.454128 ,0.340946 ,0.823118 ,-1.04184e-007 ,0.382683 ,0.92388 ,-1.04184e-007 ,0.707107 ,0.707107 ,-0.45413 ,0.629986 ,0.629987 ,-0.454129 ,0.340946 ,0.823117 ,-1.04184e-007 ,0.382683 ,0.92388 ,0.454128 ,0.340946 ,0.823118 ,-1.04184e-007 ,0.382683 ,0.92388 ,-1.04184e-007 ,0 ,1 ,0.454128 ,0 ,0.890936 ,-1.04184e-007 ,0.382683 ,0.92388 ,-0.454129 ,0.340946 ,0.823117 ,-1.04184e-007 ,0 ,1 ,-0.454129 ,0 ,0.890936 ,0.454128 ,0 ,0.890936 ,-1.04184e-007 ,0 ,1 ,0.454128 ,-0.340947 ,0.823118 ,-1.00325e-007 ,-0.382684 ,0.923879 ,-1.04184e-007 ,0 ,1 ,-0.454129 ,0 ,0.890936 ,-0.454129 ,-0.340946 ,0.823117 ,-1.00325e-007 ,-0.382684 ,0.923879 ,0.454128 ,-0.340947 ,0.823118 ,-1.00325e-007 ,-0.382684 ,0.923879 ,-1.00325e-007 ,-0.707107 ,0.707107 ,0.454128 ,-0.629987 ,0.629987 ,-1.00325e-007 ,-0.382684 ,0.923879 ,-0.454129 ,-0.340946 ,0.823117 ,-1.00325e-007 ,-0.707107 ,0.707107 ,-0.45413 ,-0.629986 ,0.629987 ,0.454128 ,-0.629987 ,0.629987 ,-1.00325e-007 ,-0.707107 ,0.707107 ,0.454128 ,-0.823118 ,0.340946 ,-1.04184e-007 ,-0.923879 ,0.382684 ,-1.00325e-007 ,-0.707107 ,0.707107 ,-0.45413 ,-0.629986 ,0.629987 ,-0.45413 ,-0.823117 ,0.340946 ,-1.04184e-007 ,-0.923879 ,0.382684 ,0.454128 ,-0.823118 ,0.340946 ,-1.04184e-007 ,-0.923879 ,0.382684 ,-1.06113e-007 ,-1 ,1.52417e-007 ,0.454128 ,-0.890936 ,2.76083e-007 ,-1.04184e-007 ,-0.923879 ,0.382684 ,-0.45413 ,-0.823117 ,0.340946 ,-1.06113e-007 ,-1 ,1.52417e-007 ,-0.45413 ,-0.890936 ,2.80027e-007 ,0.454128 ,-0.890936 ,2.76083e-007 ,-1.06113e-007 ,-1 ,1.52417e-007 ,0.454129 ,-0.823118 ,-0.340946 ,-1.04184e-007 ,-0.92388 ,-0.382683 ,-1.06113e-007 ,-1 ,1.52417e-007 ,-0.45413 ,-0.890936 ,2.80027e-007 ,-0.45413 ,-0.823117 ,-0.340946 ,-1.04184e-007 ,-0.92388 ,-0.382683 ,0.454129 ,-0.823118 ,-0.340946 ,-1.04184e-007 ,-0.92388 ,-0.382683 ,-1.00325e-007 ,-0.707107 ,-0.707107 ,0.454128 ,-0.629987 ,-0.629987 ,-1.04184e-007 ,-0.92388 ,-0.382683 ,-0.45413 ,-0.823117 ,-0.340946 ,-1.00325e-007 ,-0.707107 ,-0.707107 ,-0.45413 ,-0.629987 ,-0.629987 ,0.454128 ,-0.629987 ,-0.629987 ,-1.00325e-007 ,-0.707107 ,-0.707107 ,0.454129 ,-0.340947 ,-0.823117 ,-1.00325e-007 ,-0.382684 ,-0.92388 ,-1.00325e-007 ,-0.707107 ,-0.707107 ,-0.45413 ,-0.629987 ,-0.629987 ,-0.45413 ,-0.340946 ,-0.823117 ,-1.00325e-007 ,-0.382684 ,-0.92388 ,0.454129 ,-0.340947 ,-0.823117 ,-1.00325e-007 ,-0.382684 ,-0.92388 ,-1.04184e-007 ,0 ,-1 ,0.454129 ,0 ,-0.890936 ,-1.00325e-007 ,-0.382684 ,-0.92388 ,-0.45413 ,-0.340946 ,-0.823117 ,-1.04184e-007 ,0 ,-1 ,-0.45413 ,0 ,-0.890935 ,0.454129 ,0 ,-0.890936 ,-1.04184e-007 ,0 ,-1 ,0.454129 ,0.340946 ,-0.823117 ,-1.00325e-007 ,0.382683 ,-0.92388 ,-1.04184e-007 ,0 ,-1 ,-0.45413 ,0 ,-0.890935 ,-0.45413 ,0.340946 ,-0.823117 ,-1.00325e-007 ,0.382683 ,-0.92388 ,0.454129 ,0.340946 ,-0.823117 ,-1.00325e-007 ,0.382683 ,-0.92388 ,-1.02254e-007 ,0.707107 ,-0.707107 ,0.454129 ,0.629987 ,-0.629987 ,-1.00325e-007 ,0.382683 ,-0.92388 ,-0.45413 ,0.340946 ,-0.823117 ,-1.02254e-007 ,0.707107 ,-0.707107 ,-0.45413 ,0.629986 ,-0.629987 ,0.454129 ,0.629987 ,-0.629987 ,-1.02254e-007 ,0.707107 ,-0.707107 ,0.454129 ,0.823118 ,-0.340946 ,-1.04184e-007 ,0.92388 ,-0.382683 ,-1.02254e-007 ,0.707107 ,-0.707107 ,-0.45413 ,0.629986 ,-0.629987 ,-0.45413 ,0.823117 ,-0.340946 ,-1.04184e-007 ,0.92388 ,-0.382683 ,0.454129 ,0.823118 ,-0.340946 ,-1.04184e-007 ,0.92388 ,-0.382683 ,-1.04184e-007 ,1 ,1.52417e-007 ,0.454129 ,0.890936 ,2.80027e-007 ,-1.04184e-007 ,0.92388 ,-0.382683 ,-0.45413 ,0.823117 ,-0.340946 ,-1.04184e-007 ,1 ,1.52417e-007 ,-0.45413 ,0.890935 ,2.83971e-007 ,-1 ,0 ,0 ,-0.853101 ,-0.467763 ,-0.231118 ,-0.853097 ,-0.520609 ,-0.0345182 ,0.91976 ,0.362606 ,0.150197 ,1 ,0 ,0 ,0.854735 ,0.519065 ,0 ,-0.454129 ,0.823118 ,0.340947 ,-0.454129 ,0.890936 ,0 ,-0.992581 ,0.116804 ,0.0337531 ,-0.961402 ,-0.268378 ,-0.0606563 ,0.45413 ,0.823117 ,0.340946 ,0.45413 ,0.890935 ,0 ,-0.853103 ,-0.343712 ,-0.392528 ,0.854735 ,0.367034 ,0.367035 ,-0.992581 ,0.0587309 ,0.106462 ,-0.454129 ,0.629987 ,0.629987 ,0.45413 ,0.629986 ,0.629987 ,-0.853101 ,-0.167337 ,-0.494183 ,0.91976 ,0.150197 ,0.362606 ,-0.454129 ,0.340947 ,0.823118 ,-0.961404 ,-0.146879 ,-0.232655 ,0.45413 ,0.340946 ,0.823117 ,-0.8531 ,0.034517 ,-0.520605 ,0.854735 ,0 ,0.519065 ,-0.992581 ,-0.0337528 ,0.116807 ,-0.454129 ,0 ,0.890936 ,0.45413 ,0 ,0.890935 ,-0.853099 ,0.231119 ,-0.467768 ,0.91976 ,-0.150197 ,0.362606 ,-0.454129 ,-0.340947 ,0.823118 ,-0.961402 ,0.0606557 ,-0.268378 ,0.45413 ,-0.340947 ,0.823117 ,-0.853095 ,0.392537 ,-0.34372 ,0.854735 ,-0.367035 ,0.367035 ,-0.992581 ,-0.106458 ,0.0587265 ,-0.454128 ,-0.629987 ,0.629987 ,0.45413 ,-0.629987 ,0.629987 ,-0.853097 ,0.494192 ,-0.167334 ,0.91976 ,-0.362606 ,0.150196 ,-0.454128 ,-0.823118 ,0.340947 ,-0.961398 ,0.232674 ,-0.146889 ,0.45413 ,-0.823117 ,0.340946 ,-0.853098 ,0.520607 ,0.034519 ,0.854735 ,-0.519065 ,0 ,-0.992581 ,-0.116805 ,-0.0337486 ,-0.454128 ,-0.890936 ,0 ,0.45413 ,-0.890936 ,0 ,-0.853093 ,0.467778 ,0.231119 ,0.91976 ,-0.362606 ,-0.150196 ,-0.454128 ,-0.823118 ,-0.340947 ,-0.9614 ,0.268386 ,0.0606523 ,0.45413 ,-0.823117 ,-0.340946 ,-0.853096 ,0.343719 ,0.392535 ,0.854735 ,-0.367035 ,-0.367035 ,-0.992581 ,-0.058725 ,-0.106458 ,-0.454128 ,-0.629987 ,-0.629987 ,0.45413 ,-0.629987 ,-0.629987 ,-0.853099 ,0.167337 ,0.494186 ,0.91976 ,-0.150197 ,-0.362606 ,-0.454129 ,-0.340947 ,-0.823118 ,-0.961402 ,0.146884 ,0.232663 ,0.45413 ,-0.340947 ,-0.823117 ,-0.853101 ,-0.0345192 ,0.520603 ,0.854735 ,0 ,-0.519065 ,-0.992581 ,0.0337517 ,-0.116807 ,-0.454129 ,0 ,-0.890936 ,0.45413 ,0 ,-0.890935 ,-0.853103 ,-0.231117 ,0.467761 ,0.91976 ,0.150197 ,-0.362606 ,-0.454129 ,0.340947 ,-0.823118 ,-0.961403 ,-0.0606552 ,0.268374 ,0.45413 ,0.340946 ,-0.823117 ,-0.853102 ,-0.392528 ,0.343713 ,0.854735 ,0.367034 ,-0.367035 ,-0.992581 ,0.106462 ,-0.0587312 ,-0.454129 ,0.629987 ,-0.629987 ,0.45413 ,0.629986 ,-0.629987 ,-0.853099 ,-0.494186 ,0.167338 ,0.91976 ,0.362606 ,-0.150197 ,-0.454129 ,0.823118 ,-0.340947 ,-0.961403 ,-0.232658 ,0.146881 ,0.45413 ,0.823117 ,-0.340946 ,-0.454129 ,0.823118 ,0.340947 ,1.04184e-007 ,1 ,0 ,-0.454129 ,0.890936 ,0 ,1.04184e-007 ,0.92388 ,0.382683 ,0.45413 ,0.823117 ,0.340946 ,0.45413 ,0.890935 ,0 ,1.04184e-007 ,1 ,0 ,1.04184e-007 ,0.92388 ,0.382683 ,1.00325e-007 ,0.707107 ,0.707107 ,1.04184e-007 ,0.92388 ,0.382683 ,-0.454129 ,0.823118 ,0.340947 ,-0.454129 ,0.629987 ,0.629987 ,1.00325e-007 ,0.707107 ,0.707107 ,0.45413 ,0.823117 ,0.340946 ,1.04184e-007 ,0.92388 ,0.382683 ,0.45413 ,0.629986 ,0.629987 ,-0.454129 ,0.340947 ,0.823118 ,1.00325e-007 ,0.707107 ,0.707107 ,-0.454129 ,0.629987 ,0.629987 ,1.00325e-007 ,0.382684 ,0.92388 ,0.45413 ,0.340946 ,0.823117 ,0.45413 ,0.629986 ,0.629987 ,1.00325e-007 ,0.707107 ,0.707107 ,1.00325e-007 ,0.382684 ,0.92388 ,1.04184e-007 ,0 ,1 ,1.00325e-007 ,0.382684 ,0.92388 ,-0.454129 ,0.340947 ,0.823118 ,-0.454129 ,0 ,0.890936 ,1.04184e-007 ,0 ,1 ,0.45413 ,0.340946 ,0.823117 ,1.00325e-007 ,0.382684 ,0.92388 ,0.45413 ,0 ,0.890935 ,-0.454129 ,-0.340947 ,0.823118 ,1.04184e-007 ,0 ,1 ,-0.454129 ,0 ,0.890936 ,1.00325e-007 ,-0.382684 ,0.923879 ,0.45413 ,-0.340947 ,0.823117 ,0.45413 ,0 ,0.890935 ,1.04184e-007 ,0 ,1 ,1.00325e-007 ,-0.382684 ,0.923879 ,1.02254e-007 ,-0.707107 ,0.707107 ,1.00325e-007 ,-0.382684 ,0.923879 ,-0.454129 ,-0.340947 ,0.823118 ,-0.454128 ,-0.629987 ,0.629987 ,1.02254e-007 ,-0.707107 ,0.707107 ,0.45413 ,-0.340947 ,0.823117 ,1.00325e-007 ,-0.382684 ,0.923879 ,0.45413 ,-0.629987 ,0.629987 ,-0.454128 ,-0.823118 ,0.340947 ,1.02254e-007 ,-0.707107 ,0.707107 ,-0.454128 ,-0.629987 ,0.629987 ,1.04184e-007 ,-0.92388 ,0.382683 ,0.45413 ,-0.823117 ,0.340946 ,0.45413 ,-0.629987 ,0.629987 ,1.02254e-007 ,-0.707107 ,0.707107 ,1.04184e-007 ,-0.92388 ,0.382683 ,1.08042e-007 ,-1 ,0 ,1.04184e-007 ,-0.92388 ,0.382683 ,-0.454128 ,-0.823118 ,0.340947 ,-0.454128 ,-0.890936 ,0 ,1.08042e-007 ,-1 ,0 ,0.45413 ,-0.823117 ,0.340946 ,1.04184e-007 ,-0.92388 ,0.382683 ,0.45413 ,-0.890936 ,0 ,-0.454128 ,-0.823118 ,-0.340947 ,1.08042e-007 ,-1 ,0 ,-0.454128 ,-0.890936 ,0 ,1.04184e-007 ,-0.92388 ,-0.382683 ,0.45413 ,-0.823117 ,-0.340946 ,0.45413 ,-0.890936 ,0 ,1.08042e-007 ,-1 ,0 ,1.04184e-007 ,-0.92388 ,-0.382683 ,1.02254e-007 ,-0.707107 ,-0.707107 ,1.04184e-007 ,-0.92388 ,-0.382683 ,-0.454128 ,-0.823118 ,-0.340947 ,-0.454128 ,-0.629987 ,-0.629987 ,1.02254e-007 ,-0.707107 ,-0.707107 ,0.45413 ,-0.823117 ,-0.340946 ,1.04184e-007 ,-0.92388 ,-0.382683 ,0.45413 ,-0.629987 ,-0.629987 ,-0.454129 ,-0.340947 ,-0.823118 ,1.02254e-007 ,-0.707107 ,-0.707107 ,-0.454128 ,-0.629987 ,-0.629987 ,1.00325e-007 ,-0.382684 ,-0.923879 ,0.45413 ,-0.340947 ,-0.823117 ,0.45413 ,-0.629987 ,-0.629987 ,1.02254e-007 ,-0.707107 ,-0.707107 ,1.00325e-007 ,-0.382684 ,-0.923879 ,1.04184e-007 ,0 ,-1 ,1.00325e-007 ,-0.382684 ,-0.923879 ,-0.454129 ,-0.340947 ,-0.823118 ,-0.454129 ,0 ,-0.890936 ,1.04184e-007 ,0 ,-1 ,0.45413 ,-0.340947 ,-0.823117 ,1.00325e-007 ,-0.382684 ,-0.923879 ,0.45413 ,0 ,-0.890935 ,-0.454129 ,0.340947 ,-0.823118 ,1.04184e-007 ,0 ,-1 ,-0.454129 ,0 ,-0.890936 ,1.00325e-007 ,0.382684 ,-0.92388 ,0.45413 ,0.340946 ,-0.823117 ,0.45413 ,0 ,-0.890935 ,1.04184e-007 ,0 ,-1 ,1.00325e-007 ,0.382684 ,-0.92388 ,1.00325e-007 ,0.707107 ,-0.707107 ,1.00325e-007 ,0.382684 ,-0.92388 ,-0.454129 ,0.340947 ,-0.823118 ,-0.454129 ,0.629987 ,-0.629987 ,1.00325e-007 ,0.707107 ,-0.707107 ,0.45413 ,0.340946 ,-0.823117 ,1.00325e-007 ,0.382684 ,-0.92388 ,0.45413 ,0.629986 ,-0.629987 ,-0.454129 ,0.823118 ,-0.340947 ,1.00325e-007 ,0.707107 ,-0.707107 ,-0.454129 ,0.629987 ,-0.629987 ,1.04184e-007 ,0.92388 ,-0.382683 ,0.45413 ,0.823117 ,-0.340946 ,0.45413 ,0.629986 ,-0.629987 ,1.00325e-007 ,0.707107 ,-0.707107 ,1.04184e-007 ,0.92388 ,-0.382683 ,1.04184e-007 ,1 ,0 ,1.04184e-007 ,0.92388 ,-0.382683 ,-0.454129 ,0.823118 ,-0.340947 ,-0.454129 ,0.890936 ,0 ,1.04184e-007 ,1 ,0 ,0.45413 ,0.823117 ,-0.340946 ,1.04184e-007 ,0.92388 ,-0.382683 ,0.45413 ,0.890935 ,0 ,-1 ,0 ,0 ,-0.853101 ,-0.467764 ,-0.231118 ,-0.853097 ,-0.520609 ,-0.0345183 ,0.91976 ,0.362606 ,0.150197 ,1 ,0 ,0 ,0.854735 ,0.519065 ,1.4012e-007 ,-0.454129 ,0.823118 ,0.340946 ,-0.454129 ,0.890936 ,2.80027e-007 ,-0.992581 ,0.116804 ,0.0337532 ,-0.961402 ,-0.268379 ,-0.0606564 ,0.45413 ,0.823117 ,0.340946 ,0.45413 ,0.890935 ,2.83971e-007 ,-0.853102 ,-0.343712 ,-0.392528 ,0.854735 ,0.367035 ,0.367035 ,-0.992581 ,0.0587307 ,0.106462 ,-0.454129 ,0.629987 ,0.629987 ,0.45413 ,0.629986 ,0.629987 ,-0.853101 ,-0.167336 ,-0.494183 ,0.919759 ,0.150197 ,0.362607 ,-0.454128 ,0.340946 ,0.823118 ,-0.961404 ,-0.146879 ,-0.232654 ,0.454129 ,0.340946 ,0.823117 ,-0.8531 ,0.034517 ,-0.520604 ,0.854734 ,0 ,0.519066 ,-0.992581 ,-0.0337527 ,0.116809 ,-0.454128 ,0 ,0.890936 ,0.454129 ,0 ,0.890936 ,-0.853099 ,0.231119 ,-0.467768 ,0.919759 ,-0.150197 ,0.362607 ,-0.454128 ,-0.340947 ,0.823118 ,-0.961402 ,0.0606552 ,-0.268377 ,0.454129 ,-0.340946 ,0.823117 ,-0.853095 ,0.392537 ,-0.34372 ,0.854734 ,-0.367035 ,0.367035 ,-0.992581 ,-0.106458 ,0.0587268 ,-0.454128 ,-0.629987 ,0.629987 ,0.45413 ,-0.629986 ,0.629987 ,-0.853096 ,0.494192 ,-0.167335 ,0.91976 ,-0.362606 ,0.150196 ,-0.454128 ,-0.823118 ,0.340946 ,-0.961398 ,0.232674 ,-0.146889 ,0.45413 ,-0.823117 ,0.340946 ,-0.853098 ,0.520607 ,0.0345189 ,0.854735 ,-0.519065 ,1.37425e-007 ,-0.992581 ,-0.116805 ,-0.0337485 ,-0.454128 ,-0.890936 ,2.76083e-007 ,0.45413 ,-0.890936 ,2.80027e-007 ,-0.853093 ,0.467778 ,0.231118 ,0.91976 ,-0.362606 ,-0.150196 ,-0.454129 ,-0.823118 ,-0.340946 ,-0.9614 ,0.268387 ,0.0606525 ,0.45413 ,-0.823117 ,-0.340946 ,-0.853096 ,0.343719 ,0.392535 ,0.854735 ,-0.367034 ,-0.367034 ,-0.992581 ,-0.0587251 ,-0.106458 ,-0.454128 ,-0.629987 ,-0.629987 ,0.45413 ,-0.629987 ,-0.629987 ,-0.853099 ,0.167338 ,0.494187 ,0.91976 ,-0.150196 ,-0.362606 ,-0.454129 ,-0.340947 ,-0.823117 ,-0.961401 ,0.146885 ,0.232664 ,0.45413 ,-0.340946 ,-0.823117 ,-0.8531 ,-0.0345193 ,0.520605 ,0.854735 ,0 ,-0.519064 ,-0.992581 ,0.0337517 ,-0.116805 ,-0.454129 ,0 ,-0.890936 ,0.45413 ,0 ,-0.890935 ,-0.853103 ,-0.231117 ,0.467762 ,0.91976 ,0.150196 ,-0.362606 ,-0.454129 ,0.340946 ,-0.823117 ,-0.961403 ,-0.0606557 ,0.268376 ,0.45413 ,0.340946 ,-0.823117 ,-0.853103 ,-0.392528 ,0.343712 ,0.854735 ,0.367034 ,-0.367034 ,-0.992581 ,0.106462 ,-0.0587312 ,-0.454129 ,0.629987 ,-0.629987 ,0.45413 ,0.629986 ,-0.629987 ,-0.853099 ,-0.494187 ,0.167338 ,0.91976 ,0.362606 ,-0.150196 ,-0.454129 ,0.823118 ,-0.340946 ,-0.961403 ,-0.232658 ,0.146881 ,0.45413 ,0.823117 ,-0.340946 ,-0.454129 ,0.823118 ,0.340946 ,1.04184e-007 ,1 ,1.52417e-007 ,-0.454129 ,0.890936 ,2.80027e-007 ,1.04184e-007 ,0.923879 ,0.382684 ,0.45413 ,0.823117 ,0.340946 ,0.45413 ,0.890935 ,2.83971e-007 ,1.04184e-007 ,1 ,1.52417e-007 ,1.04184e-007 ,0.923879 ,0.382684 ,1.04184e-007 ,0.707107 ,0.707107 ,1.04184e-007 ,0.923879 ,0.382684 ,-0.454129 ,0.823118 ,0.340946 ,-0.454129 ,0.629987 ,0.629987 ,1.04184e-007 ,0.707107 ,0.707107 ,0.45413 ,0.823117 ,0.340946 ,1.04184e-007 ,0.923879 ,0.382684 ,0.45413 ,0.629986 ,0.629987 ,-0.454128 ,0.340946 ,0.823118 ,1.04184e-007 ,0.707107 ,0.707107 ,-0.454129 ,0.629987 ,0.629987 ,1.04184e-007 ,0.382683 ,0.92388 ,0.454129 ,0.340946 ,0.823117 ,0.45413 ,0.629986 ,0.629987 ,1.04184e-007 ,0.707107 ,0.707107 ,1.04184e-007 ,0.382683 ,0.92388 ,1.04184e-007 ,0 ,1 ,1.04184e-007 ,0.382683 ,0.92388 ,-0.454128 ,0.340946 ,0.823118 ,-0.454128 ,0 ,0.890936 ,1.04184e-007 ,0 ,1 ,0.454129 ,0.340946 ,0.823117 ,1.04184e-007 ,0.382683 ,0.92388 ,0.454129 ,0 ,0.890936 ,-0.454128 ,-0.340947 ,0.823118 ,1.04184e-007 ,0 ,1 ,-0.454128 ,0 ,0.890936 ,1.00325e-007 ,-0.382684 ,0.923879 ,0.454129 ,-0.340946 ,0.823117 ,0.454129 ,0 ,0.890936 ,1.04184e-007 ,0 ,1 ,1.00325e-007 ,-0.382684 ,0.923879 ,1.00325e-007 ,-0.707107 ,0.707107 ,1.00325e-007 ,-0.382684 ,0.923879 ,-0.454128 ,-0.340947 ,0.823118 ,-0.454128 ,-0.629987 ,0.629987 ,1.00325e-007 ,-0.707107 ,0.707107 ,0.454129 ,-0.340946 ,0.823117 ,1.00325e-007 ,-0.382684 ,0.923879 ,0.45413 ,-0.629986 ,0.629987 ,-0.454128 ,-0.823118 ,0.340946 ,1.00325e-007 ,-0.707107 ,0.707107 ,-0.454128 ,-0.629987 ,0.629987 ,1.04184e-007 ,-0.923879 ,0.382684 ,0.45413 ,-0.823117 ,0.340946 ,0.45413 ,-0.629986 ,0.629987 ,1.00325e-007 ,-0.707107 ,0.707107 ,1.04184e-007 ,-0.923879 ,0.382684 ,1.06113e-007 ,-1 ,1.52417e-007 ,1.04184e-007 ,-0.923879 ,0.382684 ,-0.454128 ,-0.823118 ,0.340946 ,-0.454128 ,-0.890936 ,2.76083e-007 ,1.06113e-007 ,-1 ,1.52417e-007 ,0.45413 ,-0.823117 ,0.340946 ,1.04184e-007 ,-0.923879 ,0.382684 ,0.45413 ,-0.890936 ,2.80027e-007 ,-0.454129 ,-0.823118 ,-0.340946 ,1.06113e-007 ,-1 ,1.52417e-007 ,-0.454128 ,-0.890936 ,2.76083e-007 ,1.04184e-007 ,-0.92388 ,-0.382683 ,0.45413 ,-0.823117 ,-0.340946 ,0.45413 ,-0.890936 ,2.80027e-007 ,1.06113e-007 ,-1 ,1.52417e-007 ,1.04184e-007 ,-0.92388 ,-0.382683 ,1.00325e-007 ,-0.707107 ,-0.707107 ,1.04184e-007 ,-0.92388 ,-0.382683 ,-0.454129 ,-0.823118 ,-0.340946 ,-0.454128 ,-0.629987 ,-0.629987 ,1.00325e-007 ,-0.707107 ,-0.707107 ,0.45413 ,-0.823117 ,-0.340946 ,1.04184e-007 ,-0.92388 ,-0.382683 ,0.45413 ,-0.629987 ,-0.629987 ,-0.454129 ,-0.340947 ,-0.823117 ,1.00325e-007 ,-0.707107 ,-0.707107 ,-0.454128 ,-0.629987 ,-0.629987 ,1.00325e-007 ,-0.382684 ,-0.92388 ,0.45413 ,-0.340946 ,-0.823117 ,0.45413 ,-0.629987 ,-0.629987 ,1.00325e-007 ,-0.707107 ,-0.707107 ,1.00325e-007 ,-0.382684 ,-0.92388 ,1.04184e-007 ,0 ,-1 ,1.00325e-007 ,-0.382684 ,-0.92388 ,-0.454129 ,-0.340947 ,-0.823117 ,-0.454129 ,0 ,-0.890936 ,1.04184e-007 ,0 ,-1 ,0.45413 ,-0.340946 ,-0.823117 ,1.00325e-007 ,-0.382684 ,-0.92388 ,0.45413 ,0 ,-0.890935 ,-0.454129 ,0.340946 ,-0.823117 ,1.04184e-007 ,0 ,-1 ,-0.454129 ,0 ,-0.890936 ,1.00325e-007 ,0.382683 ,-0.92388 ,0.45413 ,0.340946 ,-0.823117 ,0.45413 ,0 ,-0.890935 ,1.04184e-007 ,0 ,-1 ,1.00325e-007 ,0.382683 ,-0.92388 ,1.02254e-007 ,0.707107 ,-0.707107 ,1.00325e-007 ,0.382683 ,-0.92388 ,-0.454129 ,0.340946 ,-0.823117 ,-0.454129 ,0.629987 ,-0.629987 ,1.02254e-007 ,0.707107 ,-0.707107 ,0.45413 ,0.340946 ,-0.823117 ,1.00325e-007 ,0.382683 ,-0.92388 ,0.45413 ,0.629986 ,-0.629987 ,-0.454129 ,0.823118 ,-0.340946 ,1.02254e-007 ,0.707107 ,-0.707107 ,-0.454129 ,0.629987 ,-0.629987 ,1.04184e-007 ,0.92388 ,-0.382683 ,0.45413 ,0.823117 ,-0.340946 ,0.45413 ,0.629986 ,-0.629987 ,1.02254e-007 ,0.707107 ,-0.707107 ,1.04184e-007 ,0.92388 ,-0.382683 ,1.04184e-007 ,1 ,1.52417e-007 ,1.04184e-007 ,0.92388 ,-0.382683 ,-0.454129 ,0.823118 ,-0.340946 ,-0.454129 ,0.890936 ,2.80027e-007 ,1.04184e-007 ,1 ,1.52417e-007 ,0.45413 ,0.823117 ,-0.340946 ,1.04184e-007 ,0.92388 ,-0.382683 ,0.45413 ,0.890935 ,2.83971e-007 ,0.705467 ,0.621141 ,-0.341322 ,0.705467 ,-0.677007 ,0.209709 ,0.705467 ,0.621141 ,-0.341322 ,0.705467 ,-0.677007 ,0.209709 ,-0.705467 ,0.621141 ,-0.341322 ,-0.705467 ,-0.677007 ,0.209709 ,-0.705467 ,0.621141 ,-0.341322 ,-0.705467 ,-0.677007 ,0.209709 ,-0.705467 ,0.621141 ,-0.341322 ,-0.705467 ,0.621141 ,-0.341322 ,0.705467 ,0.621141 ,-0.341322 ,0.705467 ,0.621141 ,-0.341322 ,-0.705467 ,-0.677007 ,0.209709 ,-0.705467 ,-0.677007 ,0.209709 ,0.705467 ,-0.677007 ,0.209709 ,0.705467 ,-0.677007 ,0.209709 ,0.0881405 ,0.92773 ,0.362697 ,-0.0749899 ,-0.365697 ,0.927708 ,0.0608426 ,0.923563 ,0.378589 ,-0.0813766 ,-0.382524 ,0.920355 ,0.275718 ,0.736009 ,0.61828 ,0.751143 ,-0.42708 ,0.503375 ,0.835658 ,0.378604 ,-0.397913 ,0.795017 ,-0.480746 ,-0.369907 ,0.338016 ,0.398803 ,-0.852468 ,0.304401 ,-0.885556 ,-0.3509 ,-0.245002 ,0.375557 ,-0.89383 ,-0.320398 ,-0.89276 ,-0.316741 ,-0.760775 ,0.0737597 ,-0.644811 ,-0.833618 ,-0.552225 ,-0.0113731 ,-0.714682 ,0.698376 ,0.0387337 ,-0.308052 ,-0.0591974 ,0.949526 ,0.0881405 ,0.92773 ,0.362697 ,0.0608426 ,0.923563 ,0.378589 ,-0.320398 ,-0.89276 ,-0.316741 ,0.304401 ,-0.885556 ,-0.3509 ,0.275718 ,0.736009 ,0.61828 ,0.751143 ,-0.42708 ,0.503375 ,0.275718 ,0.736009 ,0.61828 ,0.751143 ,-0.42708 ,0.503375 ,0.304401 ,-0.885556 ,-0.3509 ,0.795017 ,-0.480746 ,-0.369907 ,-0.714682 ,0.698376 ,0.0387337 ,-0.833618 ,-0.552225 ,-0.0113731 ,-0.308052 ,-0.0591974 ,0.949526 ,-0.714682 ,0.698376 ,0.0387337 ,-0.705467 ,0.621141 ,-0.341322 ,-0.705467 ,-0.677007 ,0.209709 ,-0.705467 ,0.621141 ,-0.341322 ,-0.705467 ,-0.677007 ,0.209709 ,0.705467 ,0.621141 ,-0.341322 ,0.705467 ,-0.677007 ,0.209709 ,0.705467 ,0.621141 ,-0.341322 ,0.705467 ,-0.677007 ,0.209709 ,-0.705467 ,0.621141 ,-0.341322 ,0.705467 ,0.621141 ,-0.341322 ,0.705467 ,0.621141 ,-0.341322 ,-0.705467 ,0.621141 ,-0.341322 ,-0.705467 ,-0.677007 ,0.209709 ,0.705467 ,-0.677007 ,0.209709 ,0.705467 ,-0.677007 ,0.209709 ,-0.705467 ,-0.677007 ,0.209709 ,-0.0608426 ,0.923563 ,0.378589 ,0.0749899 ,-0.365697 ,0.927708 ,-0.0881405 ,0.92773 ,0.362697 ,0.0813766 ,-0.382524 ,0.920355 ,-0.835658 ,0.378604 ,-0.397913 ,-0.751143 ,-0.42708 ,0.503375 ,-0.275718 ,0.736009 ,0.61828 ,-0.795017 ,-0.480746 ,-0.369907 ,0.245002 ,0.375557 ,-0.89383 ,-0.304401 ,-0.885556 ,-0.3509 ,-0.338016 ,0.398803 ,-0.852468 ,0.320398 ,-0.89276 ,-0.316741 ,0.714682 ,0.698376 ,0.0387337 ,0.833618 ,-0.552225 ,-0.0113731 ,0.760775 ,0.0737597 ,-0.644811 ,0.308052 ,-0.0591974 ,0.949526 ,-0.0881405 ,0.92773 ,0.362697 ,-0.0608426 ,0.923563 ,0.378589 ,0.320398 ,-0.89276 ,-0.316741 ,-0.304401 ,-0.885556 ,-0.3509 ,-0.275718 ,0.736009 ,0.61828 ,-0.751143 ,-0.42708 ,0.503375 ,-0.835658 ,0.378604 ,-0.397913 ,-0.275718 ,0.736009 ,0.61828 ,-0.304401 ,-0.885556 ,-0.3509 ,-0.795017 ,-0.480746 ,-0.369907 ,-0.835658 ,0.378604 ,-0.397913 ,0.760775 ,0.0737597 ,-0.644811 ,0.833618 ,-0.552225 ,-0.0113731 ,0.714682 ,0.698376 ,0.0387337 ,0.760775 ,0.0737597 ,-0.644811 ,0.714682 ,0.698376 ,0.0387337 ,-0.250232 ,0.865327 ,0.434273 ,0.427292 ,-0.251098 ,0.868546 ,0.301697 ,0.609799 ,0.732887 ,0.948845 ,-0.116359 ,0.293518 ,0.301697 ,0.609799 ,0.732887 ,0.948845 ,-0.116359 ,0.293518 ,0.342716 ,0.892408 ,-0.293518 ,0.680059 ,-0.0198999 ,-0.732887 ,0.342716 ,0.892408 ,-0.293518 ,0.680059 ,-0.0198999 ,-0.732887 ,-0.0211057 ,0.495159 ,-0.868546 ,0.680059 ,-0.0198999 ,-0.732887 ,0.646562 ,-0.627187 ,-0.434273 ,-0.0211057 ,0.495159 ,-0.868546 ,-0.250232 ,0.865327 ,0.434273 ,0.342716 ,0.892408 ,-0.293518 ,0.301697 ,0.609799 ,0.732887 ,0.427292 ,-0.251098 ,0.868546 ,0.646562 ,-0.627187 ,-0.434273 ,0.948845 ,-0.116359 ,0.293518 ,0.680059 ,-0.0198999 ,-0.732887 ,0.83205 ,-0.0674189 ,-0.550588 ,0.332707 ,0.328669 ,-0.883902 ,0.613951 ,0.775041 ,-0.149586 ,0.852201 ,0.389021 ,-0.349881 ,0.894428 ,0.0420688 ,0.445229 ,0.384857 ,0.908558 ,-0.162503 ,0.622248 ,0.360366 ,0.694941 ,-0.948683 ,-0.0384348 ,-0.313883 ,-0.332709 ,0.103678 ,-0.937313 ,0.332707 ,0.328669 ,-0.883902 ,-0.613952 ,0.642939 ,-0.457921 ,0.613951 ,0.775041 ,-0.149586 ,0.613951 ,0.775041 ,-0.149586 ,-0.613952 ,0.642939 ,-0.457921 ,-0.852202 ,0.5093 ,-0.119851 ,0.852201 ,0.389021 ,-0.349881 ,0.852201 ,0.389021 ,-0.349881 ,-0.852202 ,0.5093 ,-0.119851 ,-0.384867 ,0.697004 ,-0.605031 ,0.384857 ,0.908558 ,-0.162503 ,0.384857 ,0.908558 ,-0.162503 ,-0.384867 ,0.697004 ,-0.605031 ,-0.622243 ,0.632934 ,0.46066 ,0.622248 ,0.360366 ,0.694941 ,0.622248 ,0.360366 ,0.694941 ,-0.622243 ,0.632934 ,0.46066 ,-0.707103 ,0.0665173 ,0.703975 ,0.894428 ,0.0420688 ,0.445229 ,-0.613952 ,0.642939 ,-0.457921 ,-0.852202 ,0.5093 ,-0.119851 ,-0.707103 ,0.0665173 ,0.703975 ,-0.622243 ,0.632934 ,0.46066 ,-0.384867 ,0.697004 ,-0.605031 ,1 ,-3.65927e-012 ,-4.68014e-006 ,0.990029 ,0.114111 ,0.0825961 ,0.500005 ,-2.72063e-006 ,0.866023 ,0.393293 ,0.0538443 ,0.917835 ,-0.561848 ,-0.0816065 ,0.823205 ,-0.5 ,-3.40079e-006 ,0.866025 ,-1 ,-4.53444e-007 ,-1.00141e-005 ,-0.978292 ,-0.172001 ,-0.115585 ,-1 ,-4.53444e-007 ,-1.00141e-005 ,-0.978292 ,-0.172001 ,-0.115585 ,-0.424177 ,-0.0404165 ,-0.904677 ,-0.499996 ,6.80157e-007 ,-0.866028 ,0.499996 ,4.53437e-007 ,-0.866028 ,0.586015 ,0.106145 ,-0.803318 ,0.990029 ,0.114111 ,0.0825961 ,1 ,-3.65927e-012 ,-4.68014e-006 ,0.463939 ,0.188369 ,0.865609 ,0.903291 ,0.429029 ,-0.000603461 ,-0.434929 ,-0.249205 ,0.865294 ,-0.894154 ,-0.447759 ,-0.000785258 ,-0.461353 ,-0.196404 ,-0.865205 ,-0.894154 ,-0.447759 ,-0.000785258 ,0.438772 ,0.242051 ,-0.865385 ,0.903291 ,0.429029 ,-0.000603461 ,0.3529 ,0.350362 ,0.867588 ,0.647045 ,0.76245 ,0.00172565 ,-0.290974 ,-0.402397 ,0.867993 ,-0.646707 ,-0.762736 ,-0.00199037 ,-0.350494 ,-0.353902 ,-0.867126 ,-0.646707 ,-0.762736 ,-0.00199037 ,0.287348 ,0.404025 ,-0.868444 ,0.647045 ,0.76245 ,0.00172565 ,0.164122 ,0.470607 ,0.866944 ,0.271647 ,0.962396 ,0.0013418 ,-0.108193 ,-0.485199 ,0.867684 ,-0.280939 ,-0.959725 ,-0.000776519 ,-0.169415 ,-0.46838 ,-0.867132 ,-0.280939 ,-0.959725 ,-0.000776519 ,0.106464 ,0.485827 ,-0.867547 ,0.271647 ,0.962396 ,0.0013418 ,0.0319424 ,0.499232 ,0.865879 ,0.0478939 ,0.998852 ,0.000297822 ,-0.015974 ,-0.499594 ,0.866113 ,-0.0479518 ,-0.99885 ,-0.000332738 ,-0.031964 ,-0.499119 ,-0.865944 ,-0.0479518 ,-0.99885 ,-0.000332738 ,0.0159745 ,0.499742 ,-0.866027 ,0.0478939 ,0.998852 ,0.000297822 ,2.96649e-006 ,0.654772 ,0.755826 ,0.0319424 ,0.499232 ,0.865879 ,0.0478939 ,0.998852 ,0.000297822 ,3.71177e-006 ,0.981996 ,-0.1889 ,-1.08423e-007 ,-0.327279 ,0.944928 ,-0.015974 ,-0.499594 ,0.866113 ,4.86842e-006 ,-0.981972 ,0.189029 ,-0.0479518 ,-0.99885 ,-0.000332738 ,1.28932e-006 ,-0.654576 ,-0.755996 ,-0.031964 ,-0.499119 ,-0.865944 ,-0.0479518 ,-0.99885 ,-0.000332738 ,4.86842e-006 ,-0.981972 ,0.189029 ,2.40735e-006 ,0.327407 ,-0.944883 ,0.0159745 ,0.499742 ,-0.866027 ,3.71177e-006 ,0.981996 ,-0.1889 ,0.0478939 ,0.998852 ,0.000297822 ,1 ,-2.7014e-006 ,-1.12917e-008 ,1 ,8.51718e-007 ,1.69443e-007 ,0.499999 ,-0.866019 ,-0.00360998 ,0.499998 ,-0.866019 ,-0.00360996 ,0.499999 ,-0.866019 ,-0.00360998 ,0.499998 ,-0.866019 ,-0.00360996 ,-0.499998 ,-0.866019 ,-0.00360999 ,-0.499999 ,-0.866019 ,-0.00360996 ,-0.499999 ,-0.866019 ,-0.00360996 ,-0.499998 ,-0.866019 ,-0.00360999 ,-1 ,8.51718e-007 ,1.69443e-007 ,-1 ,4.40486e-006 ,1.84163e-008 ,-1 ,8.51718e-007 ,1.69443e-007 ,-1 ,4.40486e-006 ,1.84163e-008 ,-0.499997 ,0.866019 ,0.00361082 ,-0.500001 ,0.866017 ,0.00361095 ,-0.500001 ,0.866017 ,0.00361095 ,-0.499997 ,0.866019 ,0.00361082 ,0.499998 ,0.866019 ,0.00361082 ,0.499994 ,0.866021 ,0.00361096 ,0.499998 ,0.866019 ,0.00361082 ,0.499994 ,0.866021 ,0.00361096 ,1 ,8.51718e-007 ,1.69443e-007 ,1 ,-2.7014e-006 ,-1.12917e-008 ,-0.367955 ,-0.0761971 ,0.926716 ,0 ,3.23333e-008 ,1 ,-0.265348 ,0.650654 ,0.711505 ,0 ,0.711033 ,0.703159 ,0 ,1 ,2.57476e-007 ,-0.370305 ,0.926542 ,0.0662921 ,-0.265741 ,0.722166 ,-0.638638 ,0 ,0.711033 ,-0.703159 ,0 ,3.23333e-008 ,-1 ,-0.367954 ,0.0761933 ,-0.926717 ,-0.265347 ,-0.650652 ,-0.711507 ,0 ,-0.711033 ,-0.703159 ,-0.265347 ,-0.650652 ,-0.711507 ,0 ,-0.711033 ,-0.703159 ,0 ,-1 ,2.57476e-007 ,-0.370305 ,-0.926542 ,-0.0662905 ,-0.265743 ,-0.722165 ,0.638638 ,0 ,-0.711033 ,0.703159 ,-0.31145 ,-0.0163108 ,0.950123 ,-0.311386 ,0.679248 ,0.664575 ,-0.30856 ,0.951172 ,0.00786251 ,-0.308173 ,0.69627 ,-0.648257 ,-0.311446 ,0.0162989 ,-0.950124 ,-0.311387 ,-0.679237 ,-0.664587 ,-0.311387 ,-0.679237 ,-0.664587 ,-0.308561 ,-0.951172 ,-0.00785359 ,-0.308173 ,-0.69627 ,0.648257 ,1.39743e-006 ,0.147265 ,0.989097 ,-3.94317e-007 ,0.812825 ,0.582508 ,7.23949e-007 ,0.991903 ,-0.127 ,7.29602e-007 ,0.624982 ,-0.780639 ,8.25512e-007 ,-0.147255 ,-0.989099 ,8.11694e-007 ,-0.81282 ,-0.582515 ,8.11694e-007 ,-0.81282 ,-0.582515 ,-0.311387 ,-0.679237 ,-0.664587 ,-0.308561 ,-0.951172 ,-0.00785359 ,8.11694e-007 ,-0.81282 ,-0.582515 ,2.83281e-007 ,-0.9919 ,0.127018 ,2.04867e-009 ,-0.625 ,0.780625 ,0 ,-0.894427 ,0.447214 ,0 ,-0.707107 ,-0.707107 ,0.180226 ,-0.654801 ,-0.733998 ,0.489821 ,-0.583377 ,0.647879 ,0.579372 ,-0.509948 ,-0.635831 ,0.694157 ,-0.651324 ,-0.306469 ,0 ,-0.894427 ,0.447214 ,0.360448 ,-0.575609 ,0.733997 ,0 ,0 ,1 ,0.489821 ,-0.583377 ,0.647879 ,0.523076 ,0.0358553 ,0.851532 ,0.901897 ,-0.314565 ,0.296025 ,0.644853 ,0.562006 ,0.51799 ,0.640768 ,-0.299025 ,0.707107 ,0.360448 ,-0.575609 ,0.733997 ,0.901897 ,-0.314565 ,0.296025 ,0.82423 ,0.274109 ,-0.495489 ,0.644853 ,0.562006 ,0.51799 ,0.381047 ,0.34121 ,-0.85929 ,0.523076 ,0.0358553 ,0.851532 ,0.523076 ,0.0358553 ,0.851532 ,0.381047 ,0.34121 ,-0.85929 ,0.810515 ,-0.37824 ,-0.447214 ,0.640768 ,-0.299025 ,0.707107 ,0 ,0 ,-1 ,0.381047 ,0.34121 ,-0.85929 ,0.579372 ,-0.509948 ,-0.635831 ,0.694157 ,-0.651324 ,-0.306469 ,0.810515 ,-0.37824 ,-0.447214 ,-0.863225 ,-0.282098 ,0.418644 ,0 ,-0.559231 ,0.829012 ,-0.444609 ,0.212317 ,0.870198 ,0.560481 ,0.623089 ,0.545547 ,0.647743 ,-0.426056 ,0.631589 ,0.358352 ,-0.865449 ,0.350116 ,-0.261906 ,-0.816291 ,0.514854 ,-1 ,-2.06477e-007 ,4.43098e-008 ,-0.863225 ,-0.282098 ,0.418644 ,-0.493676 ,0.869638 ,0.00363091 ,-0.444609 ,0.212317 ,0.870198 ,0.560481 ,0.623089 ,0.545547 ,0.499997 ,0.866015 ,0.00445858 ,0.999998 ,-4.16758e-007 ,0.00182103 ,0.647743 ,-0.426056 ,0.631589 ,0.999998 ,-4.16758e-007 ,0.00182103 ,0.647743 ,-0.426056 ,0.631589 ,0.358352 ,-0.865449 ,0.350116 ,0.499995 ,-0.866005 ,0.00636769 ,-0.492845 ,-0.8701 ,0.00544761 ,-0.261906 ,-0.816291 ,0.514854 ,-0.863225 ,-0.282098 ,0.418644 ,-1 ,-2.06477e-007 ,4.43098e-008 ,0.668683 ,0.664714 ,-0.333194 ,0.407409 ,-0.412306 ,-0.814875 ,-0.409508 ,0.404646 ,-0.817658 ,-0.665139 ,-0.669138 ,-0.331428 ,0.707103 ,0.707107 ,0.00245314 ,0.704983 ,-0.709223 ,0.00122293 ,0.668683 ,0.664714 ,-0.333194 ,0.407409 ,-0.412306 ,-0.814875 ,-0.409508 ,0.404646 ,-0.817658 ,-0.665139 ,-0.669138 ,-0.331428 ,-0.709208 ,0.704998 ,0.00123014 ,-0.707107 ,-0.707107 ,0 ,-0.409508 ,0.404646 ,-0.817658 ,-0.709208 ,0.704998 ,0.00123014 ,0.668683 ,0.664714 ,-0.333194 ,0.707103 ,0.707107 ,0.00245314 ,-0.707107 ,-0.707107 ,0 ,-0.665139 ,-0.669138 ,-0.331428 ,0.704983 ,-0.709223 ,0.00122293 ,0.407409 ,-0.412306 ,-0.814875 ,0.109932 ,0.301712 ,0.94704 ,0 ,0.486826 ,0.873499 ,0 ,-0.43107 ,0.902319 ,0.166187 ,-0.547738 ,0.819979 ,0.118106 ,0.159625 ,0.980087 ,0.0801055 ,-0.70182 ,0.707836 ,0.556955 ,-0.830543 ,0 ,2.82445e-006 ,-1 ,0 ,2.82445e-006 ,-1 ,0 ,0.556955 ,-0.830543 ,0 ,0.556955 ,-0.830543 ,0 ,2.82445e-006 ,-1 ,0 ,0.538401 ,-0.806279 ,0.245027 ,9.98093e-007 ,-0.887667 ,0.460485 ,2.82445e-006 ,-1 ,0 ,0.556955 ,-0.830543 ,0 ,2.82445e-006 ,-1 ,0 ,0.556955 ,-0.830543 ,0 ,2.82445e-006 ,-1 ,0 ,0.548639 ,-0.832661 ,-0.0752992 ,3.18895e-006 ,-0.993887 ,0.1104 ,0.490043 ,-0.858577 ,0.150676 ,0.0239762 ,-0.999311 ,0.0283283 ,0.559846 ,-0.817331 ,-0.136172 ,0.487773 ,-0.780902 ,0.390218 ,-9.99114e-007 ,-0.940053 ,0.341028 ,0.395642 ,-0.862791 ,0.314736 ,0.0239079 ,-0.911301 ,0.411046 ,0.166187 ,-0.547738 ,0.819979 ,0 ,-0.43107 ,0.902319 ,0.387691 ,-0.598574 ,-0.701003 ,0.0970761 ,-0.617147 ,-0.780836 ,0.0655848 ,0.00329327 ,-0.997842 ,0.156688 ,0.310153 ,-0.937685 ,0.559846 ,-0.817331 ,-0.136172 ,0.0239762 ,-0.999311 ,0.0283283 ,0.823668 ,-0.557629 ,-0.103061 ,1 ,0 ,0 ,0.70498 ,-0.704742 ,-0.0796332 ,0.655536 ,-0.755033 ,-0.0140547 ,0.754386 ,-0.655728 ,0.0303789 ,1 ,0 ,0 ,0.898276 ,-0.434238 ,-0.0673592 ,0.890327 ,0.454797 ,0.0218428 ,0.889904 ,0.432015 ,-0.146402 ,0.84312 ,0.512713 ,0.162091 ,0.860165 ,-0.509928 ,-0.00944199 ,0.853562 ,0.520987 ,0.00222179 ,0.798864 ,-0.569515 ,0.193569 ,0.894332 ,0.398965 ,-0.202476 ,0.928533 ,0.101743 ,-0.357036 ,0.950698 ,0.30853 ,-0.0313385 ,0.801653 ,-0.586522 ,0.115516 ,0.956751 ,0.290742 ,-0.00983039 ,0.637809 ,-0.768826 ,0.0458956 ,0.974108 ,0.226078 ,0.00164488 ,0.311924 ,-0.894668 ,0.3198 ,0.641606 ,0.0593124 ,0.764738 ,0.306116 ,-0.910737 ,0.277221 ,0.70498 ,-0.704742 ,-0.0796332 ,0.644331 ,-0.764702 ,-0.00822072 ,0.676081 ,-0.735039 ,-0.0512933 ,0.823668 ,-0.557629 ,-0.103061 ,0.655536 ,-0.755033 ,-0.0140547 ,0.615222 ,-0.788351 ,-0.00213144 ,0.754386 ,-0.655728 ,0.0303789 ,0.583526 ,-0.799513 ,0.142397 ,0.708729 ,-0.704254 ,-0.0415815 ,0.898276 ,-0.434238 ,-0.0673592 ,0.890327 ,0.454797 ,0.0218428 ,-0.127287 ,0.971722 ,0.198882 ,-0.00964467 ,0.911341 ,-0.411539 ,0.889904 ,0.432015 ,-0.146402 ,0.84312 ,0.512713 ,0.162091 ,0.287558 ,0.877073 ,0.384777 ,0.750597 ,-0.660036 ,-0.0309251 ,0.860165 ,-0.509928 ,-0.00944199 ,0.853562 ,0.520987 ,0.00222179 ,0.317809 ,0.947654 ,-0.0308062 ,0.694281 ,-0.718346 ,-0.044189 ,0.798864 ,-0.569515 ,0.193569 ,0.285563 ,0.930791 ,-0.228215 ,0.894332 ,0.398965 ,-0.202476 ,0.310532 ,0.718717 ,-0.622106 ,0.493777 ,-0.819859 ,0.289854 ,0.306116 ,-0.910737 ,0.277221 ,0.928533 ,0.101743 ,-0.357036 ,0.661634 ,-0.628407 ,-0.409079 ,0.49545 ,-0.0410637 ,-0.867665 ,0.348098 ,-0.909 ,0.22923 ,0.661634 ,-0.628407 ,-0.409079 ,0.369968 ,0.867193 ,-0.333317 ,0.950698 ,0.30853 ,-0.0313385 ,0.801653 ,-0.586522 ,0.115516 ,0.449438 ,-0.863991 ,0.226992 ,0.54844 ,0.833839 ,-0.0626621 ,0.956751 ,0.290742 ,-0.00983039 ,0.637809 ,-0.768826 ,0.0458956 ,0.330452 ,-0.928942 ,0.166939 ,0.573954 ,0.756132 ,0.31439 ,0.974108 ,0.226078 ,0.00164488 ,0.311924 ,-0.894668 ,0.3198 ,0.0801055 ,-0.70182 ,0.707836 ,0.641606 ,0.0593124 ,0.764738 ,0.118106 ,0.159625 ,0.980087 ,0.641606 ,0.0593124 ,0.764738 ,0.641606 ,0.0593124 ,0.764738 ,0.118106 ,0.159625 ,0.980087 ,0.928533 ,0.101743 ,-0.357036 ,0.306116 ,-0.910737 ,0.277221 ,0.644331 ,-0.764702 ,-0.00822072 ,0.556955 ,-0.830543 ,0 ,0.556955 ,-0.830543 ,0 ,0.676081 ,-0.735039 ,-0.0512933 ,0.615222 ,-0.788351 ,-0.00213144 ,0.556955 ,-0.830543 ,0 ,0.583526 ,-0.799513 ,0.142397 ,0.538401 ,-0.806279 ,0.245027 ,0.556955 ,-0.830543 ,0 ,0.708729 ,-0.704254 ,-0.0415815 ,0.556955 ,-0.830543 ,0 ,0.750597 ,-0.660036 ,-0.0309251 ,0.548639 ,-0.832661 ,-0.0752992 ,0.694281 ,-0.718346 ,-0.044189 ,0.490043 ,-0.858577 ,0.150676 ,0.493777 ,-0.819859 ,0.289854 ,0.49545 ,-0.0410637 ,-0.867665 ,0.387691 ,-0.598574 ,-0.701003 ,0.156688 ,0.310153 ,-0.937685 ,0.559846 ,-0.817331 ,-0.136172 ,0.348098 ,-0.909 ,0.22923 ,0.559846 ,-0.817331 ,-0.136172 ,0.387691 ,-0.598574 ,-0.701003 ,0.49545 ,-0.0410637 ,-0.867665 ,0.449438 ,-0.863991 ,0.226992 ,0.487773 ,-0.780902 ,0.390218 ,0.330452 ,-0.928942 ,0.166939 ,0.395642 ,-0.862791 ,0.314736 ,0.0801055 ,-0.70182 ,0.707836 ,0.166187 ,-0.547738 ,0.819979 ,0.0978323 ,0.800769 ,-0.59093 ,0.054913 ,0.881302 ,-0.469352 ,0 ,0.52529 ,-0.850923 ,0 ,0.716196 ,-0.697899 ,0.104375 ,0.993297 ,0.0496695 ,0 ,0.922099 ,0.386953 ,-0.00199464 ,0.944738 ,0.32782 ,0.0874581 ,0.852353 ,0.515602 ,0.0978323 ,0.800769 ,-0.59093 ,0 ,0.716196 ,-0.697899 ,0 ,0.981962 ,0.189077 ,0.156012 ,0.986301 ,-0.0535787 ,0.0343635 ,0.784606 ,-0.619042 ,0.102521 ,0.742202 ,-0.662288 ,0 ,0.52529 ,-0.850923 ,0.054913 ,0.881302 ,-0.469352 ,0.156688 ,0.310153 ,-0.937685 ,0.0655848 ,0.00329327 ,-0.997842 ,0.317809 ,0.947654 ,-0.0308062 ,0.287558 ,0.877073 ,0.384777 ,0.285563 ,0.930791 ,-0.228215 ,0.310532 ,0.718717 ,-0.622106 ,0.49545 ,-0.0410637 ,-0.867665 ,0.49545 ,-0.0410637 ,-0.867665 ,0 ,0.716196 ,-0.697899 ,0 ,0.52529 ,-0.850923 ,0 ,0.922099 ,0.386953 ,0 ,0.981962 ,0.189077 ,-0.26382 ,0.858482 ,0.439781 ,-2.53373e-006 ,0.733988 ,0.679163 ,6.13543e-007 ,0.959276 ,-0.282471 ,-0.359397 ,0.820605 ,-0.444343 ,0.0874581 ,0.852353 ,0.515602 ,-0.00199464 ,0.944738 ,0.32782 ,1.61698e-006 ,0.774727 ,-0.632296 ,-0.109825 ,0.866377 ,-0.487164 ,-0.127287 ,0.971722 ,0.198882 ,-0.00964467 ,0.911341 ,-0.411539 ,0.287558 ,0.877073 ,0.384777 ,0.287558 ,0.877073 ,0.384777 ,0.369968 ,0.867193 ,-0.333317 ,-0.109825 ,0.866377 ,-0.487164 ,1.61698e-006 ,0.774727 ,-0.632296 ,1.32905e-006 ,0.98963 ,-0.143642 ,0.0429343 ,0.991846 ,-0.119989 ,0 ,0.98803 ,0.15426 ,0.135145 ,0.929792 ,0.342377 ,0 ,0.486826 ,0.873499 ,0.109932 ,0.301712 ,0.94704 ,0.369968 ,0.867193 ,-0.333317 ,0.54844 ,0.833839 ,-0.0626621 ,0.573954 ,0.756132 ,0.31439 ,0.118106 ,0.159625 ,0.980087 ,-0.250232 ,0.865327 ,0.434273 ,0.427292 ,-0.251098 ,0.868546 ,0.301697 ,0.609799 ,0.732887 ,0.948845 ,-0.116359 ,0.293518 ,0.301697 ,0.609799 ,0.732887 ,0.948845 ,-0.116359 ,0.293518 ,0.342716 ,0.892408 ,-0.293518 ,0.680059 ,-0.0198999 ,-0.732887 ,0.342716 ,0.892408 ,-0.293518 ,0.680059 ,-0.0198999 ,-0.732887 ,-0.0211057 ,0.495159 ,-0.868546 ,0.680059 ,-0.0198999 ,-0.732887 ,0.646562 ,-0.627187 ,-0.434273 ,-0.0211057 ,0.495159 ,-0.868546 ,-0.250232 ,0.865327 ,0.434273 ,0.342716 ,0.892408 ,-0.293518 ,0.301697 ,0.609799 ,0.732887 ,0.427292 ,-0.251098 ,0.868546 ,0.646562 ,-0.627187 ,-0.434273 ,0.948845 ,-0.116359 ,0.293518 ,0.680059 ,-0.0198999 ,-0.732887 ,1 ,2.93206e-006 ,-5.72892e-006 ,0.991424 ,0.052789 ,0.119546 ,0.513955 ,-0.390961 ,0.763544 ,0.402737 ,-0.373096 ,0.835824 ,-0.581696 ,-0.436238 ,0.686532 ,-0.513952 ,-0.390962 ,0.763546 ,-1 ,4.22909e-006 ,-8.86377e-006 ,-0.981365 ,-0.0834974 ,-0.173066 ,-1 ,4.22909e-006 ,-8.86377e-006 ,-0.981365 ,-0.0834974 ,-0.173066 ,-0.434868 ,0.377403 ,-0.817592 ,-0.513946 ,0.390962 ,-0.76355 ,0.513946 ,0.390961 ,-0.76355 ,0.607667 ,0.4464 ,-0.656862 ,0.991424 ,0.052789 ,0.119546 ,1 ,2.93206e-006 ,-5.72892e-006 ,0.474569 ,-0.240957 ,0.846596 ,0.920933 ,0.336333 ,0.196882 ,-0.463712 ,-0.599929 ,0.651963 ,-0.913194 ,-0.351033 ,-0.20701 ,-0.47197 ,0.234426 ,-0.849876 ,-0.913194 ,-0.351033 ,-0.20701 ,0.467111 ,0.593592 ,-0.655329 ,0.920933 ,0.336333 ,0.196882 ,0.363966 ,-0.110945 ,0.924781 ,0.687988 ,0.625185 ,0.368533 ,-0.32233 ,-0.746837 ,0.581668 ,-0.68821 ,-0.624966 ,-0.368491 ,-0.36174 ,0.107949 ,-0.926008 ,-0.68821 ,-0.624966 ,-0.368491 ,0.318233 ,0.748947 ,-0.58121 ,0.687988 ,0.625185 ,0.368533 ,0.17256 ,-0.00979386 ,0.98495 ,0.303062 ,0.823829 ,0.479019 ,-0.123456 ,-0.832746 ,0.539716 ,-0.313037 ,-0.821266 ,-0.477001 ,-0.177998 ,0.0118203 ,-0.98396 ,-0.313037 ,-0.821266 ,-0.477001 ,0.121571 ,0.833336 ,-0.539232 ,0.303062 ,0.823829 ,0.479019 ,0.0338981 ,0.0160758 ,0.999296 ,0.0544514 ,0.864997 ,0.498813 ,-0.0184916 ,-0.847772 ,0.530039 ,-0.0545173 ,-0.864984 ,-0.49883 ,-0.0339196 ,-0.0159525 ,-0.999297 ,-0.0545173 ,-0.864984 ,-0.49883 ,0.0184925 ,0.84787 ,-0.529882 ,0.0544514 ,0.864997 ,0.498813 ,3.21513e-006 ,0.191634 ,0.981467 ,0.0338981 ,0.0160758 ,0.999296 ,0.0544514 ,0.864997 ,0.498813 ,4.90741e-006 ,0.947702 ,0.319155 ,-3.31268e-007 ,-0.728126 ,0.685443 ,-0.0184916 ,-0.847772 ,0.530039 ,5.65996e-006 ,-0.947753 ,-0.319005 ,-0.0545173 ,-0.864984 ,-0.49883 ,1.41282e-006 ,-0.19139 ,-0.981514 ,-0.0339196 ,-0.0159525 ,-0.999297 ,-0.0545173 ,-0.864984 ,-0.49883 ,5.65996e-006 ,-0.947753 ,-0.319005 ,3.29686e-006 ,0.728227 ,-0.685337 ,0.0184925 ,0.84787 ,-0.529882 ,4.90741e-006 ,0.947702 ,0.319155 ,0.0544514 ,0.864997 ,0.498813 ,-0.863225 ,-0.282098 ,0.418644 ,0 ,-0.559231 ,0.829012 ,-0.444609 ,0.212317 ,0.870198 ,0.560481 ,0.623089 ,0.545547 ,0.647743 ,-0.426056 ,0.631589 ,0.358352 ,-0.865449 ,0.350116 ,-0.261906 ,-0.816291 ,0.514854 ,-1 ,-2.06477e-007 ,1.51228e-010 ,-0.863225 ,-0.282098 ,0.418644 ,-0.493676 ,0.869638 ,0.0036309 ,-0.444609 ,0.212317 ,0.870198 ,0.560481 ,0.623089 ,0.545547 ,0.499997 ,0.866015 ,0.00445858 ,0.999998 ,-3.99393e-007 ,0.00182101 ,0.647743 ,-0.426056 ,0.631589 ,0.999998 ,-3.99393e-007 ,0.00182101 ,0.647743 ,-0.426056 ,0.631589 ,0.358352 ,-0.865449 ,0.350116 ,0.499995 ,-0.866005 ,0.00636769 ,-0.492845 ,-0.8701 ,0.0054476 ,-0.261906 ,-0.816291 ,0.514854 ,-0.863225 ,-0.282098 ,0.418644 ,-1 ,-2.06477e-007 ,1.51228e-010 ,0 ,-0.894427 ,0.447214 ,0 ,-0.797167 ,-0.603758 ,0.303473 ,-0.691578 ,-0.655457 ,0.503047 ,-0.581253 ,0.639601 ,0.591326 ,-0.507329 ,-0.626858 ,0.701164 ,-0.647351 ,-0.298842 ,0 ,-0.894427 ,0.447214 ,0.360448 ,-0.575609 ,0.733997 ,0 ,0 ,1 ,0.503047 ,-0.581253 ,0.639601 ,0.528947 ,0.0365059 ,0.847869 ,0.905362 ,-0.311996 ,0.28806 ,0.657534 ,0.558521 ,0.50567 ,0.640768 ,-0.299025 ,0.707107 ,0.360448 ,-0.575609 ,0.733997 ,0.905362 ,-0.311996 ,0.28806 ,0.832584 ,0.272123 ,-0.482445 ,0.657534 ,0.558521 ,0.50567 ,0.523458 ,0.245644 ,-0.815874 ,0.528947 ,0.0365059 ,0.847869 ,0.528947 ,0.0365059 ,0.847869 ,0.523458 ,0.245644 ,-0.815874 ,0.752803 ,-0.546776 ,-0.366503 ,0.640768 ,-0.299025 ,0.707107 ,0.196581 ,-0.261863 ,-0.944872 ,0.523458 ,0.245644 ,-0.815874 ,0.591326 ,-0.507329 ,-0.626858 ,0.701164 ,-0.647351 ,-0.298842 ,0.752803 ,-0.546776 ,-0.366503 ,-0.367955 ,-0.0761964 ,0.926716 ,0 ,3.23333e-008 ,1 ,-0.265348 ,0.650654 ,0.711506 ,0 ,0.711033 ,0.703159 ,0 ,1 ,0 ,-0.370305 ,0.926542 ,0.0662918 ,-0.265741 ,0.722166 ,-0.638638 ,0 ,0.711033 ,-0.703159 ,0 ,3.23333e-008 ,-1 ,-0.367954 ,0.0761937 ,-0.926717 ,-0.265347 ,-0.650652 ,-0.711507 ,0 ,-0.711033 ,-0.703159 ,-0.265347 ,-0.650652 ,-0.711507 ,0 ,-0.711033 ,-0.703159 ,0 ,-1 ,0 ,-0.370305 ,-0.926542 ,-0.0662908 ,-0.265743 ,-0.722165 ,0.638638 ,0 ,-0.711033 ,0.703159 ,-0.311449 ,-0.0163107 ,0.950123 ,-0.311386 ,0.679247 ,0.664576 ,-0.30856 ,0.951172 ,0.00786201 ,-0.308173 ,0.69627 ,-0.648257 ,-0.311446 ,0.016299 ,-0.950124 ,-0.311387 ,-0.679237 ,-0.664586 ,-0.311387 ,-0.679237 ,-0.664586 ,-0.308561 ,-0.951172 ,-0.00785409 ,-0.308173 ,-0.69627 ,0.648257 ,1.77873e-006 ,0.147264 ,0.989097 ,-3.5727e-007 ,0.812825 ,0.582507 ,7.23951e-007 ,0.991903 ,-0.127 ,6.35273e-007 ,0.624982 ,-0.780639 ,6.34866e-007 ,-0.147255 ,-0.989098 ,7.74649e-007 ,-0.81282 ,-0.582515 ,7.74649e-007 ,-0.81282 ,-0.582515 ,-0.311387 ,-0.679237 ,-0.664586 ,-0.308561 ,-0.951172 ,-0.00785409 ,7.74649e-007 ,-0.81282 ,-0.582515 ,2.83281e-007 ,-0.9919 ,0.127018 ,1.90696e-007 ,-0.624998 ,0.780626 ,-0.301697 ,0.609799 ,0.732887 ,-0.427292 ,-0.251098 ,0.868546 ,0.250232 ,0.865327 ,0.434273 ,-0.948845 ,-0.116359 ,0.293518 ,-0.342716 ,0.892408 ,-0.293518 ,-0.948845 ,-0.116359 ,0.293518 ,-0.301697 ,0.609799 ,0.732887 ,-0.680059 ,-0.0198999 ,-0.732887 ,0.0211057 ,0.495159 ,-0.868546 ,-0.680059 ,-0.0198999 ,-0.732887 ,-0.342716 ,0.892408 ,-0.293518 ,-0.646562 ,-0.627187 ,-0.434273 ,-0.680059 ,-0.0198999 ,-0.732887 ,-0.342716 ,0.892408 ,-0.293518 ,0.250232 ,0.865327 ,0.434273 ,0.0211057 ,0.495159 ,-0.868546 ,-0.301697 ,0.609799 ,0.732887 ,-0.948845 ,-0.116359 ,0.293518 ,-0.646562 ,-0.627187 ,-0.434273 ,-0.427292 ,-0.251098 ,0.868546 ,-0.680059 ,-0.0198999 ,-0.732887 ,-0.613951 ,0.775041 ,-0.149586 ,-0.332707 ,0.328669 ,-0.883902 ,-0.83205 ,-0.0674189 ,-0.550588 ,-0.852201 ,0.389021 ,-0.349881 ,-0.894428 ,0.0420688 ,0.445229 ,-0.622248 ,0.360366 ,0.694941 ,-0.384857 ,0.908558 ,-0.162503 ,0.332709 ,0.103678 ,-0.937313 ,0.948683 ,-0.0384348 ,-0.313883 ,-0.83205 ,-0.0674189 ,-0.550588 ,-0.332707 ,0.328669 ,-0.883902 ,0.613952 ,0.642939 ,-0.457921 ,-0.613951 ,0.775041 ,-0.149586 ,0.852202 ,0.5093 ,-0.119851 ,0.613952 ,0.642939 ,-0.457921 ,-0.613951 ,0.775041 ,-0.149586 ,-0.852201 ,0.389021 ,-0.349881 ,0.384867 ,0.697004 ,-0.605031 ,0.852202 ,0.5093 ,-0.119851 ,-0.852201 ,0.389021 ,-0.349881 ,-0.384857 ,0.908558 ,-0.162503 ,0.622243 ,0.632934 ,0.46066 ,0.384867 ,0.697004 ,-0.605031 ,-0.384857 ,0.908558 ,-0.162503 ,0.707103 ,0.0665173 ,0.703975 ,0.622243 ,0.632934 ,0.46066 ,0.948683 ,-0.0384348 ,-0.313883 ,0.332709 ,0.103678 ,-0.937313 ,0.613952 ,0.642939 ,-0.457921 ,0.852202 ,0.5093 ,-0.119851 ,0.384867 ,0.697004 ,-0.605031 ,0.622243 ,0.632934 ,0.46066 ,-0.500005 ,-2.72063e-006 ,0.866023 ,-0.990029 ,0.114111 ,0.0825961 ,-1 ,-3.65927e-012 ,-4.68014e-006 ,-0.393293 ,0.0538443 ,0.917835 ,0.561848 ,-0.0816065 ,0.823205 ,0.5 ,-3.40079e-006 ,0.866025 ,1 ,-4.53444e-007 ,-1.00141e-005 ,0.978292 ,-0.172001 ,-0.115585 ,0.424177 ,-0.0404165 ,-0.904677 ,0.978292 ,-0.172001 ,-0.115585 ,1 ,-4.53444e-007 ,-1.00141e-005 ,0.499996 ,6.80157e-007 ,-0.866028 ,-0.499996 ,4.53437e-007 ,-0.866028 ,-0.586015 ,0.106145 ,-0.803318 ,-0.990029 ,0.114111 ,0.0825961 ,-1 ,-3.65927e-012 ,-4.68014e-006 ,-0.463939 ,0.188369 ,0.865609 ,-0.903291 ,0.429029 ,-0.000603461 ,0.434929 ,-0.249205 ,0.865294 ,0.894154 ,-0.447759 ,-0.000785258 ,0.461353 ,-0.196404 ,-0.865205 ,0.894154 ,-0.447759 ,-0.000785258 ,-0.438772 ,0.242051 ,-0.865385 ,-0.903291 ,0.429029 ,-0.000603461 ,-0.3529 ,0.350362 ,0.867588 ,-0.647045 ,0.76245 ,0.00172565 ,0.290974 ,-0.402397 ,0.867993 ,0.646707 ,-0.762736 ,-0.00199037 ,0.350494 ,-0.353902 ,-0.867126 ,0.646707 ,-0.762736 ,-0.00199037 ,-0.287348 ,0.404025 ,-0.868444 ,-0.647045 ,0.76245 ,0.00172565 ,-0.164122 ,0.470607 ,0.866944 ,-0.271647 ,0.962396 ,0.0013418 ,0.108193 ,-0.485199 ,0.867684 ,0.280939 ,-0.959725 ,-0.000776519 ,0.169415 ,-0.46838 ,-0.867132 ,0.280939 ,-0.959725 ,-0.000776519 ,-0.106464 ,0.485827 ,-0.867547 ,-0.271647 ,0.962396 ,0.0013418 ,-0.0319424 ,0.499232 ,0.865879 ,-0.0478939 ,0.998852 ,0.000297822 ,0.015974 ,-0.499594 ,0.866113 ,0.0479518 ,-0.99885 ,-0.000332738 ,0.031964 ,-0.499119 ,-0.865944 ,0.0479518 ,-0.99885 ,-0.000332738 ,-0.0159745 ,0.499742 ,-0.866027 ,-0.0478939 ,0.998852 ,0.000297822 ,-0.0478939 ,0.998852 ,0.000297822 ,-0.0319424 ,0.499232 ,0.865879 ,-2.96649e-006 ,0.654772 ,0.755826 ,-3.71177e-006 ,0.981996 ,-0.1889 ,0.015974 ,-0.499594 ,0.866113 ,1.08423e-007 ,-0.327279 ,0.944928 ,0.0479518 ,-0.99885 ,-0.000332738 ,-4.86842e-006 ,-0.981972 ,0.189029 ,0.0479518 ,-0.99885 ,-0.000332738 ,0.031964 ,-0.499119 ,-0.865944 ,-1.28932e-006 ,-0.654576 ,-0.755996 ,-4.86842e-006 ,-0.981972 ,0.189029 ,-0.0159745 ,0.499742 ,-0.866027 ,-2.40735e-006 ,0.327407 ,-0.944883 ,-0.0478939 ,0.998852 ,0.000297822 ,-3.71177e-006 ,0.981996 ,-0.1889 ,-0.499999 ,-0.866019 ,-0.00360998 ,-1 ,8.51718e-007 ,1.69443e-007 ,-1 ,-2.7014e-006 ,-1.12917e-008 ,-0.499998 ,-0.866019 ,-0.00360996 ,0.499998 ,-0.866019 ,-0.00360999 ,-0.499998 ,-0.866019 ,-0.00360996 ,-0.499999 ,-0.866019 ,-0.00360998 ,0.499999 ,-0.866019 ,-0.00360996 ,1 ,8.51718e-007 ,1.69443e-007 ,0.499998 ,-0.866019 ,-0.00360999 ,0.499999 ,-0.866019 ,-0.00360996 ,1 ,4.40486e-006 ,1.84163e-008 ,0.499997 ,0.866019 ,0.00361082 ,1 ,4.40486e-006 ,1.84163e-008 ,1 ,8.51718e-007 ,1.69443e-007 ,0.500001 ,0.866017 ,0.00361095 ,-0.499998 ,0.866019 ,0.00361082 ,0.499997 ,0.866019 ,0.00361082 ,0.500001 ,0.866017 ,0.00361095 ,-0.499994 ,0.866021 ,0.00361096 ,-1 ,8.51718e-007 ,1.69443e-007 ,-0.499994 ,0.866021 ,0.00361096 ,-0.499998 ,0.866019 ,0.00361082 ,-1 ,-2.7014e-006 ,-1.12917e-008 ,0.265348 ,0.650654 ,0.711505 ,0 ,3.23333e-008 ,1 ,0.367955 ,-0.0761971 ,0.926716 ,0 ,0.711033 ,0.703159 ,0 ,1 ,2.57476e-007 ,0.370305 ,0.926542 ,0.0662921 ,0.265741 ,0.722166 ,-0.638638 ,0 ,0.711033 ,-0.703159 ,0 ,3.23333e-008 ,-1 ,0.367954 ,0.0761933 ,-0.926717 ,0.265347 ,-0.650652 ,-0.711507 ,0 ,-0.711033 ,-0.703159 ,0 ,-1 ,2.57476e-007 ,0 ,-0.711033 ,-0.703159 ,0.265347 ,-0.650652 ,-0.711507 ,0.370305 ,-0.926542 ,-0.0662905 ,0.265743 ,-0.722165 ,0.638638 ,0 ,-0.711033 ,0.703159 ,0.31145 ,-0.0163108 ,0.950123 ,0.311386 ,0.679248 ,0.664575 ,0.30856 ,0.951172 ,0.00786251 ,0.308173 ,0.69627 ,-0.648257 ,0.311446 ,0.0162989 ,-0.950124 ,0.311387 ,-0.679237 ,-0.664587 ,0.311387 ,-0.679237 ,-0.664587 ,0.308561 ,-0.951172 ,-0.00785359 ,0.308173 ,-0.69627 ,0.648257 ,-1.39743e-006 ,0.147265 ,0.989097 ,3.94317e-007 ,0.812825 ,0.582508 ,-7.23949e-007 ,0.991903 ,-0.127 ,-7.29602e-007 ,0.624982 ,-0.780639 ,-8.25512e-007 ,-0.147255 ,-0.989099 ,-8.11694e-007 ,-0.81282 ,-0.582515 ,0.308561 ,-0.951172 ,-0.00785359 ,0.311387 ,-0.679237 ,-0.664587 ,-8.11694e-007 ,-0.81282 ,-0.582515 ,-2.83281e-007 ,-0.9919 ,0.127018 ,-8.11694e-007 ,-0.81282 ,-0.582515 ,-2.04867e-009 ,-0.625 ,0.780625 ,-0.180226 ,-0.654801 ,-0.733998 ,0 ,-0.707107 ,-0.707107 ,0 ,-0.894427 ,0.447214 ,-0.694157 ,-0.651324 ,-0.306469 ,-0.579372 ,-0.509948 ,-0.635831 ,-0.489821 ,-0.583377 ,0.647879 ,0 ,0 ,1 ,-0.360448 ,-0.575609 ,0.733997 ,-0.523076 ,0.0358553 ,0.851532 ,-0.489821 ,-0.583377 ,0.647879 ,-0.644853 ,0.562006 ,0.51799 ,-0.901897 ,-0.314565 ,0.296025 ,-0.640768 ,-0.299025 ,0.707107 ,-0.579372 ,-0.509948 ,-0.635831 ,-0.360448 ,-0.575609 ,0.733997 ,-0.360448 ,-0.575609 ,0.733997 ,-0.901897 ,-0.314565 ,0.296025 ,-0.694157 ,-0.651324 ,-0.306469 ,-0.489821 ,-0.583377 ,0.647879 ,-0.82423 ,0.274109 ,-0.495489 ,-0.381047 ,0.34121 ,-0.85929 ,-0.644853 ,0.562006 ,0.51799 ,-0.523076 ,0.0358553 ,0.851532 ,-0.810515 ,-0.37824 ,-0.447214 ,-0.381047 ,0.34121 ,-0.85929 ,-0.523076 ,0.0358553 ,0.851532 ,-0.640768 ,-0.299025 ,0.707107 ,0 ,-0.707107 ,-0.707107 ,-0.180226 ,-0.654801 ,-0.733998 ,0 ,0 ,-1 ,-0.579372 ,-0.509948 ,-0.635831 ,-0.381047 ,0.34121 ,-0.85929 ,-0.694157 ,-0.651324 ,-0.306469 ,-0.82423 ,0.274109 ,-0.495489 ,-0.810515 ,-0.37824 ,-0.447214 ,0.444609 ,0.212317 ,0.870198 ,0 ,-0.559231 ,0.829012 ,0.863225 ,-0.282098 ,0.418644 ,-0.560481 ,0.623089 ,0.545547 ,-0.647743 ,-0.426056 ,0.631589 ,-0.358352 ,-0.865449 ,0.350116 ,0.261906 ,-0.816291 ,0.514854 ,0.493676 ,0.869638 ,0.00363091 ,0.863225 ,-0.282098 ,0.418644 ,1 ,-2.06477e-007 ,4.43098e-008 ,0.444609 ,0.212317 ,0.870198 ,-0.560481 ,0.623089 ,0.545547 ,-0.499997 ,0.866015 ,0.00445858 ,-0.999998 ,-4.16758e-007 ,0.00182103 ,-0.647743 ,-0.426056 ,0.631589 ,-0.358352 ,-0.865449 ,0.350116 ,-0.647743 ,-0.426056 ,0.631589 ,-0.999998 ,-4.16758e-007 ,0.00182103 ,-0.499995 ,-0.866005 ,0.00636769 ,0.492845 ,-0.8701 ,0.00544761 ,-0.358352 ,-0.865449 ,0.350116 ,0.261906 ,-0.816291 ,0.514854 ,0.863225 ,-0.282098 ,0.418644 ,0.261906 ,-0.816291 ,0.514854 ,1 ,-2.06477e-007 ,4.43098e-008 ,0.409508 ,0.404646 ,-0.817658 ,-0.407409 ,-0.412306 ,-0.814875 ,-0.668683 ,0.664714 ,-0.333194 ,0.665139 ,-0.669138 ,-0.331428 ,-0.668683 ,0.664714 ,-0.333194 ,-0.704983 ,-0.709223 ,0.00122293 ,-0.707103 ,0.707107 ,0.00245314 ,-0.407409 ,-0.412306 ,-0.814875 ,0.709208 ,0.704998 ,0.00123014 ,0.665139 ,-0.669138 ,-0.331428 ,0.409508 ,0.404646 ,-0.817658 ,0.707107 ,-0.707107 ,0 ,-0.668683 ,0.664714 ,-0.333194 ,0.709208 ,0.704998 ,0.00123014 ,0.409508 ,0.404646 ,-0.817658 ,-0.707103 ,0.707107 ,0.00245314 ,-0.704983 ,-0.709223 ,0.00122293 ,0.665139 ,-0.669138 ,-0.331428 ,0.707107 ,-0.707107 ,0 ,-0.407409 ,-0.412306 ,-0.814875 ,0 ,-0.43107 ,0.902319 ,0 ,0.486826 ,0.873499 ,-0.109932 ,0.301712 ,0.94704 ,-0.166187 ,-0.547738 ,0.819979 ,-0.118106 ,0.159625 ,0.980087 ,-0.0801055 ,-0.70182 ,0.707836 ,-2.82445e-006 ,-1 ,0 ,-2.82445e-006 ,-1 ,0 ,-0.556955 ,-0.830543 ,0 ,-0.556955 ,-0.830543 ,0 ,-2.82445e-006 ,-1 ,0 ,-0.556955 ,-0.830543 ,0 ,-9.98093e-007 ,-0.887667 ,0.460485 ,-0.538401 ,-0.806279 ,0.245027 ,-2.82445e-006 ,-1 ,0 ,-0.556955 ,-0.830543 ,0 ,-2.82445e-006 ,-1 ,0 ,-0.556955 ,-0.830543 ,0 ,-2.82445e-006 ,-1 ,0 ,-0.548639 ,-0.832661 ,-0.0752992 ,-3.18895e-006 ,-0.993887 ,0.1104 ,-0.490043 ,-0.858577 ,0.150676 ,-0.0239762 ,-0.999311 ,0.0283283 ,-0.559846 ,-0.817331 ,-0.136172 ,9.99114e-007 ,-0.940053 ,0.341028 ,-0.487773 ,-0.780902 ,0.390218 ,-0.0239079 ,-0.911301 ,0.411046 ,-0.395642 ,-0.862791 ,0.314736 ,0 ,-0.43107 ,0.902319 ,-0.166187 ,-0.547738 ,0.819979 ,-0.0655848 ,0.00329327 ,-0.997842 ,-0.0970761 ,-0.617147 ,-0.780836 ,-0.387691 ,-0.598574 ,-0.701003 ,-0.156688 ,0.310153 ,-0.937685 ,-0.0239762 ,-0.999311 ,0.0283283 ,-0.559846 ,-0.817331 ,-0.136172 ,-0.70498 ,-0.704742 ,-0.0796332 ,-1 ,0 ,0 ,-0.823668 ,-0.557629 ,-0.103061 ,-0.655536 ,-0.755033 ,-0.0140547 ,-0.754386 ,-0.655728 ,0.0303789 ,-1 ,0 ,0 ,-0.890327 ,0.454797 ,0.0218428 ,-0.898276 ,-0.434238 ,-0.0673592 ,-0.889904 ,0.432015 ,-0.146402 ,-0.84312 ,0.512713 ,0.162091 ,-0.853562 ,0.520987 ,0.00222179 ,-0.860165 ,-0.509928 ,-0.00944199 ,-0.894332 ,0.398965 ,-0.202476 ,-0.798864 ,-0.569515 ,0.193569 ,-0.928533 ,0.101743 ,-0.357036 ,-0.950698 ,0.30853 ,-0.0313385 ,-0.801653 ,-0.586522 ,0.115516 ,-0.956751 ,0.290742 ,-0.00983039 ,-0.637809 ,-0.768826 ,0.0458956 ,-0.974108 ,0.226078 ,0.00164488 ,-0.311924 ,-0.894668 ,0.3198 ,-0.641606 ,0.0593124 ,0.764738 ,-0.306116 ,-0.910737 ,0.277221 ,-0.676081 ,-0.735039 ,-0.0512933 ,-0.644331 ,-0.764702 ,-0.00822072 ,-0.70498 ,-0.704742 ,-0.0796332 ,-0.823668 ,-0.557629 ,-0.103061 ,-0.615222 ,-0.788351 ,-0.00213144 ,-0.655536 ,-0.755033 ,-0.0140547 ,-0.583526 ,-0.799513 ,0.142397 ,-0.754386 ,-0.655728 ,0.0303789 ,-0.708729 ,-0.704254 ,-0.0415815 ,-0.898276 ,-0.434238 ,-0.0673592 ,0.00964467 ,0.911341 ,-0.411539 ,0.127287 ,0.971722 ,0.198882 ,-0.890327 ,0.454797 ,0.0218428 ,-0.889904 ,0.432015 ,-0.146402 ,-0.287558 ,0.877073 ,0.384777 ,-0.84312 ,0.512713 ,0.162091 ,-0.750597 ,-0.660036 ,-0.0309251 ,-0.860165 ,-0.509928 ,-0.00944199 ,-0.853562 ,0.520987 ,0.00222179 ,-0.317809 ,0.947654 ,-0.0308062 ,-0.694281 ,-0.718346 ,-0.044189 ,-0.798864 ,-0.569515 ,0.193569 ,-0.285563 ,0.930791 ,-0.228215 ,-0.894332 ,0.398965 ,-0.202476 ,-0.310532 ,0.718717 ,-0.622106 ,-0.493777 ,-0.819859 ,0.289854 ,-0.306116 ,-0.910737 ,0.277221 ,-0.928533 ,0.101743 ,-0.357036 ,-0.49545 ,-0.0410637 ,-0.867665 ,-0.661634 ,-0.628407 ,-0.409079 ,-0.348098 ,-0.909 ,0.22923 ,-0.661634 ,-0.628407 ,-0.409079 ,-0.369968 ,0.867193 ,-0.333317 ,-0.950698 ,0.30853 ,-0.0313385 ,-0.449438 ,-0.863991 ,0.226992 ,-0.801653 ,-0.586522 ,0.115516 ,-0.54844 ,0.833839 ,-0.0626621 ,-0.956751 ,0.290742 ,-0.00983039 ,-0.330452 ,-0.928942 ,0.166939 ,-0.637809 ,-0.768826 ,0.0458956 ,-0.573954 ,0.756132 ,0.31439 ,-0.974108 ,0.226078 ,0.00164488 ,-0.0801055 ,-0.70182 ,0.707836 ,-0.311924 ,-0.894668 ,0.3198 ,-0.118106 ,0.159625 ,0.980087 ,-0.641606 ,0.0593124 ,0.764738 ,-0.641606 ,0.0593124 ,0.764738 ,-0.118106 ,0.159625 ,0.980087 ,-0.641606 ,0.0593124 ,0.764738 ,-0.306116 ,-0.910737 ,0.277221 ,-0.928533 ,0.101743 ,-0.357036 ,-0.556955 ,-0.830543 ,0 ,-0.556955 ,-0.830543 ,0 ,-0.644331 ,-0.764702 ,-0.00822072 ,-0.676081 ,-0.735039 ,-0.0512933 ,-0.556955 ,-0.830543 ,0 ,-0.615222 ,-0.788351 ,-0.00213144 ,-0.538401 ,-0.806279 ,0.245027 ,-0.583526 ,-0.799513 ,0.142397 ,-0.556955 ,-0.830543 ,0 ,-0.708729 ,-0.704254 ,-0.0415815 ,-0.556955 ,-0.830543 ,0 ,-0.750597 ,-0.660036 ,-0.0309251 ,-0.548639 ,-0.832661 ,-0.0752992 ,-0.694281 ,-0.718346 ,-0.044189 ,-0.490043 ,-0.858577 ,0.150676 ,-0.493777 ,-0.819859 ,0.289854 ,-0.156688 ,0.310153 ,-0.937685 ,-0.387691 ,-0.598574 ,-0.701003 ,-0.49545 ,-0.0410637 ,-0.867665 ,-0.559846 ,-0.817331 ,-0.136172 ,-0.348098 ,-0.909 ,0.22923 ,-0.559846 ,-0.817331 ,-0.136172 ,-0.49545 ,-0.0410637 ,-0.867665 ,-0.387691 ,-0.598574 ,-0.701003 ,-0.487773 ,-0.780902 ,0.390218 ,-0.449438 ,-0.863991 ,0.226992 ,-0.395642 ,-0.862791 ,0.314736 ,-0.330452 ,-0.928942 ,0.166939 ,-0.166187 ,-0.547738 ,0.819979 ,-0.0801055 ,-0.70182 ,0.707836 ,0 ,0.52529 ,-0.850923 ,-0.054913 ,0.881302 ,-0.469352 ,-0.0978323 ,0.800769 ,-0.59093 ,0 ,0.716196 ,-0.697899 ,0.00199464 ,0.944738 ,0.32782 ,0 ,0.922099 ,0.386953 ,-0.104375 ,0.993297 ,0.0496695 ,-0.0874581 ,0.852353 ,0.515602 ,0 ,0.981962 ,0.189077 ,0 ,0.716196 ,-0.697899 ,-0.0978323 ,0.800769 ,-0.59093 ,-0.156012 ,0.986301 ,-0.0535787 ,0 ,0.52529 ,-0.850923 ,-0.102521 ,0.742202 ,-0.662288 ,-0.0343635 ,0.784606 ,-0.619042 ,-0.054913 ,0.881302 ,-0.469352 ,-0.0655848 ,0.00329327 ,-0.997842 ,-0.156688 ,0.310153 ,-0.937685 ,-0.317809 ,0.947654 ,-0.0308062 ,-0.287558 ,0.877073 ,0.384777 ,-0.285563 ,0.930791 ,-0.228215 ,-0.310532 ,0.718717 ,-0.622106 ,-0.49545 ,-0.0410637 ,-0.867665 ,-0.49545 ,-0.0410637 ,-0.867665 ,0 ,0.922099 ,0.386953 ,0 ,0.52529 ,-0.850923 ,0 ,0.716196 ,-0.697899 ,0 ,0.981962 ,0.189077 ,-6.13543e-007 ,0.959276 ,-0.282471 ,2.53373e-006 ,0.733988 ,0.679163 ,0.26382 ,0.858482 ,0.439781 ,0.359397 ,0.820605 ,-0.444343 ,0.00199464 ,0.944738 ,0.32782 ,-0.0874581 ,0.852353 ,0.515602 ,-1.61698e-006 ,0.774727 ,-0.632296 ,0.109825 ,0.866377 ,-0.487164 ,0.127287 ,0.971722 ,0.198882 ,0.00964467 ,0.911341 ,-0.411539 ,-0.287558 ,0.877073 ,0.384777 ,-0.287558 ,0.877073 ,0.384777 ,-0.369968 ,0.867193 ,-0.333317 ,-1.32905e-006 ,0.98963 ,-0.143642 ,-1.61698e-006 ,0.774727 ,-0.632296 ,0.109825 ,0.866377 ,-0.487164 ,-0.0429343 ,0.991846 ,-0.119989 ,0 ,0.98803 ,0.15426 ,-0.135145 ,0.929792 ,0.342377 ,0 ,0.486826 ,0.873499 ,-0.109932 ,0.301712 ,0.94704 ,-0.369968 ,0.867193 ,-0.333317 ,-0.54844 ,0.833839 ,-0.0626621 ,-0.573954 ,0.756132 ,0.31439 ,-0.118106 ,0.159625 ,0.980087 ,-0.301697 ,0.609799 ,0.732887 ,-0.427292 ,-0.251098 ,0.868546 ,0.250232 ,0.865327 ,0.434273 ,-0.948845 ,-0.116359 ,0.293518 ,-0.342716 ,0.892408 ,-0.293518 ,-0.948845 ,-0.116359 ,0.293518 ,-0.301697 ,0.609799 ,0.732887 ,-0.680059 ,-0.0198999 ,-0.732887 ,0.0211057 ,0.495159 ,-0.868546 ,-0.680059 ,-0.0198999 ,-0.732887 ,-0.342716 ,0.892408 ,-0.293518 ,-0.646562 ,-0.627187 ,-0.434273 ,-0.680059 ,-0.0198999 ,-0.732887 ,-0.342716 ,0.892408 ,-0.293518 ,0.250232 ,0.865327 ,0.434273 ,0.0211057 ,0.495159 ,-0.868546 ,-0.301697 ,0.609799 ,0.732887 ,-0.948845 ,-0.116359 ,0.293518 ,-0.646562 ,-0.627187 ,-0.434273 ,-0.427292 ,-0.251098 ,0.868546 ,-0.680059 ,-0.0198999 ,-0.732887 ,-0.513955 ,-0.390961 ,0.763544 ,-0.991424 ,0.052789 ,0.119546 ,-1 ,2.93206e-006 ,-5.72892e-006 ,-0.402737 ,-0.373096 ,0.835824 ,0.581696 ,-0.436238 ,0.686532 ,0.513952 ,-0.390962 ,0.763546 ,1 ,4.22909e-006 ,-8.86377e-006 ,0.981365 ,-0.0834974 ,-0.173066 ,0.434868 ,0.377403 ,-0.817592 ,0.981365 ,-0.0834974 ,-0.173066 ,1 ,4.22909e-006 ,-8.86377e-006 ,0.513946 ,0.390962 ,-0.76355 ,-0.513946 ,0.390961 ,-0.76355 ,-0.607667 ,0.4464 ,-0.656862 ,-0.991424 ,0.052789 ,0.119546 ,-1 ,2.93206e-006 ,-5.72892e-006 ,-0.474569 ,-0.240957 ,0.846596 ,-0.920933 ,0.336333 ,0.196882 ,0.463712 ,-0.599929 ,0.651963 ,0.913194 ,-0.351033 ,-0.20701 ,0.47197 ,0.234426 ,-0.849876 ,0.913194 ,-0.351033 ,-0.20701 ,-0.467111 ,0.593592 ,-0.655329 ,-0.920933 ,0.336333 ,0.196882 ,-0.363966 ,-0.110945 ,0.924781 ,-0.687988 ,0.625185 ,0.368533 ,0.32233 ,-0.746837 ,0.581668 ,0.68821 ,-0.624966 ,-0.368491 ,0.36174 ,0.107949 ,-0.926008 ,0.68821 ,-0.624966 ,-0.368491 ,-0.318233 ,0.748947 ,-0.58121 ,-0.687988 ,0.625185 ,0.368533 ,-0.17256 ,-0.00979386 ,0.98495 ,-0.303062 ,0.823829 ,0.479019 ,0.123456 ,-0.832746 ,0.539716 ,0.313037 ,-0.821266 ,-0.477001 ,0.177998 ,0.0118203 ,-0.98396 ,0.313037 ,-0.821266 ,-0.477001 ,-0.121571 ,0.833336 ,-0.539232 ,-0.303062 ,0.823829 ,0.479019 ,-0.0338981 ,0.0160758 ,0.999296 ,-0.0544514 ,0.864997 ,0.498813 ,0.0184916 ,-0.847772 ,0.530039 ,0.0545173 ,-0.864984 ,-0.49883 ,0.0339196 ,-0.0159525 ,-0.999297 ,0.0545173 ,-0.864984 ,-0.49883 ,-0.0184925 ,0.84787 ,-0.529882 ,-0.0544514 ,0.864997 ,0.498813 ,-0.0544514 ,0.864997 ,0.498813 ,-0.0338981 ,0.0160758 ,0.999296 ,-3.21513e-006 ,0.191634 ,0.981467 ,-4.90741e-006 ,0.947702 ,0.319155 ,0.0184916 ,-0.847772 ,0.530039 ,3.31268e-007 ,-0.728126 ,0.685443 ,0.0545173 ,-0.864984 ,-0.49883 ,-5.65996e-006 ,-0.947753 ,-0.319005 ,0.0545173 ,-0.864984 ,-0.49883 ,0.0339196 ,-0.0159525 ,-0.999297 ,-1.41282e-006 ,-0.19139 ,-0.981514 ,-5.65996e-006 ,-0.947753 ,-0.319005 ,-0.0184925 ,0.84787 ,-0.529882 ,-3.29686e-006 ,0.728227 ,-0.685337 ,-0.0544514 ,0.864997 ,0.498813 ,-4.90741e-006 ,0.947702 ,0.319155 ,0.444609 ,0.212317 ,0.870198 ,0 ,-0.559231 ,0.829012 ,0.863225 ,-0.282098 ,0.418644 ,-0.560481 ,0.623089 ,0.545547 ,-0.647743 ,-0.426056 ,0.631589 ,-0.358352 ,-0.865449 ,0.350116 ,0.261906 ,-0.816291 ,0.514854 ,0.493676 ,0.869638 ,0.0036309 ,0.863225 ,-0.282098 ,0.418644 ,1 ,-2.06477e-007 ,1.51228e-010 ,0.444609 ,0.212317 ,0.870198 ,-0.560481 ,0.623089 ,0.545547 ,-0.499997 ,0.866015 ,0.00445858 ,-0.999998 ,-3.99393e-007 ,0.00182101 ,-0.647743 ,-0.426056 ,0.631589 ,-0.358352 ,-0.865449 ,0.350116 ,-0.647743 ,-0.426056 ,0.631589 ,-0.999998 ,-3.99393e-007 ,0.00182101 ,-0.499995 ,-0.866005 ,0.00636769 ,0.492845 ,-0.8701 ,0.0054476 ,-0.358352 ,-0.865449 ,0.350116 ,0.261906 ,-0.816291 ,0.514854 ,0.863225 ,-0.282098 ,0.418644 ,0.261906 ,-0.816291 ,0.514854 ,1 ,-2.06477e-007 ,1.51228e-010 ,-0.303473 ,-0.691578 ,-0.655457 ,0 ,-0.797167 ,-0.603758 ,-0.701164 ,-0.647351 ,-0.298842 ,-0.591326 ,-0.507329 ,-0.626858 ,-0.503047 ,-0.581253 ,0.639601 ,0 ,0 ,1 ,-0.360448 ,-0.575609 ,0.733997 ,0 ,-0.894427 ,0.447214 ,-0.528947 ,0.0365059 ,0.847869 ,-0.503047 ,-0.581253 ,0.639601 ,-0.657534 ,0.558521 ,0.50567 ,-0.905362 ,-0.311996 ,0.28806 ,-0.640768 ,-0.299025 ,0.707107 ,-0.591326 ,-0.507329 ,-0.626858 ,-0.360448 ,-0.575609 ,0.733997 ,-0.360448 ,-0.575609 ,0.733997 ,-0.905362 ,-0.311996 ,0.28806 ,-0.701164 ,-0.647351 ,-0.298842 ,-0.503047 ,-0.581253 ,0.639601 ,-0.832584 ,0.272123 ,-0.482445 ,-0.523458 ,0.245644 ,-0.815874 ,-0.657534 ,0.558521 ,0.50567 ,-0.528947 ,0.0365059 ,0.847869 ,-0.752803 ,-0.546776 ,-0.366503 ,-0.523458 ,0.245644 ,-0.815874 ,-0.528947 ,0.0365059 ,0.847869 ,-0.640768 ,-0.299025 ,0.707107 ,0 ,-0.797167 ,-0.603758 ,-0.303473 ,-0.691578 ,-0.655457 ,-0.196581 ,-0.261863 ,-0.944872 ,-0.591326 ,-0.507329 ,-0.626858 ,-0.523458 ,0.245644 ,-0.815874 ,-0.701164 ,-0.647351 ,-0.298842 ,-0.832584 ,0.272123 ,-0.482445 ,-0.752803 ,-0.546776 ,-0.366503 ,0.265348 ,0.650654 ,0.711506 ,0 ,3.23333e-008 ,1 ,0.367955 ,-0.0761964 ,0.926716 ,0 ,0.711033 ,0.703159 ,0 ,1 ,0 ,0.370305 ,0.926542 ,0.0662918 ,0.265741 ,0.722166 ,-0.638638 ,0 ,0.711033 ,-0.703159 ,0 ,3.23333e-008 ,-1 ,0.367954 ,0.0761937 ,-0.926717 ,0.265347 ,-0.650652 ,-0.711507 ,0 ,-0.711033 ,-0.703159 ,0 ,-1 ,0 ,0 ,-0.711033 ,-0.703159 ,0.265347 ,-0.650652 ,-0.711507 ,0.370305 ,-0.926542 ,-0.0662908 ,0.265743 ,-0.722165 ,0.638638 ,0 ,-0.711033 ,0.703159 ,0.311449 ,-0.0163107 ,0.950123 ,0.311386 ,0.679247 ,0.664576 ,0.30856 ,0.951172 ,0.00786201 ,0.308173 ,0.69627 ,-0.648257 ,0.311446 ,0.016299 ,-0.950124 ,0.311387 ,-0.679237 ,-0.664586 ,0.311387 ,-0.679237 ,-0.664586 ,0.308561 ,-0.951172 ,-0.00785409 ,0.308173 ,-0.69627 ,0.648257 ,-1.77873e-006 ,0.147264 ,0.989097 ,3.5727e-007 ,0.812825 ,0.582507 ,-7.23951e-007 ,0.991903 ,-0.127 ,-6.35273e-007 ,0.624982 ,-0.780639 ,-6.34866e-007 ,-0.147255 ,-0.989098 ,-7.74649e-007 ,-0.81282 ,-0.582515 ,0.308561 ,-0.951172 ,-0.00785409 ,0.311387 ,-0.679237 ,-0.664586 ,-7.74649e-007 ,-0.81282 ,-0.582515 ,-2.83281e-007 ,-0.9919 ,0.127018 ,-7.74649e-007 ,-0.81282 ,-0.582515 ,-1.90696e-007 ,-0.624998 ,0.780626 ,-0.666667 ,0.666667 ,0.333333 ,-0.408248 ,-0.408248 ,0.816497 ,0.408248 ,0.408248 ,0.816497 ,0.666667 ,-0.666667 ,0.333333 ,0.408248 ,0.408248 ,0.816497 ,0.666667 ,-0.666667 ,0.333333 ,0.666667 ,0.666667 ,-0.333333 ,0.408248 ,-0.408248 ,-0.816497 ,-0.408248 ,0.408248 ,-0.816497 ,-0.666667 ,-0.666667 ,-0.333333 ,-0.666667 ,0.666667 ,0.333333 ,-0.408248 ,-0.408248 ,0.816497 ,-0.666667 ,0.666667 ,0.333333 ,-0.408248 ,-0.408248 ,0.816497 ,0.408248 ,0.408248 ,0.816497 ,0.666667 ,-0.666667 ,0.333333 ,0.408248 ,0.408248 ,0.816497 ,0.666667 ,-0.666667 ,0.333333 ,0.666667 ,0.666667 ,-0.333333 ,0.408248 ,-0.408248 ,-0.816497 ,-0.408248 ,0.408248 ,-0.816497 ,-0.666667 ,-0.666667 ,-0.333333 ,-0.666667 ,0.666667 ,0.333333 ,-0.408248 ,-0.408248 ,0.816497 ,-0.408248 ,0.408248 ,0.816497 ,0.408248 ,-0.408248 ,0.816497 ,0.666667 ,0.666667 ,0.333333 ,-0.666667 ,-0.666667 ,0.333333 ,-0.666667 ,0.666667 ,-0.333333 ,-0.666667 ,-0.666667 ,0.333333 ,-0.408248 ,0.408248 ,0.816497 ,-0.408248 ,-0.408248 ,-0.816497 ,0.408248 ,0.408248 ,-0.816497 ,0.666667 ,-0.666667 ,-0.333333 ,0.666667 ,0.666667 ,0.333333 ,0.408248 ,-0.408248 ,0.816497 ,-0.408248 ,0.408248 ,0.816497 ,0.408248 ,-0.408248 ,0.816497 ,0.666667 ,0.666667 ,0.333333 ,-0.666667 ,-0.666667 ,0.333333 ,-0.666667 ,0.666667 ,-0.333333 ,-0.666667 ,-0.666667 ,0.333333 ,-0.408248 ,0.408248 ,0.816497 ,-0.408248 ,-0.408248 ,-0.816497 ,0.408248 ,0.408248 ,-0.816497 ,0.666667 ,-0.666667 ,-0.333333 ,0.666667 ,0.666667 ,0.333333 ,0.408248 ,-0.408248 ,0.816497 ,0.408248 ,0.408248 ,-0.816497 ,-0.408248 ,-0.408248 ,-0.816497 ,-0.666667 ,0.666667 ,-0.333333 ,0.666667 ,-0.666667 ,-0.333333 ,0.666667 ,0.666667 ,0.333333 ,0.666667 ,-0.666667 ,-0.333333 ,0.408248 ,0.408248 ,-0.816497 ,0.408248 ,-0.408248 ,0.816497 ,-0.408248 ,0.408248 ,0.816497 ,-0.666667 ,-0.666667 ,0.333333 ,-0.666667 ,0.666667 ,-0.333333 ,-0.408248 ,-0.408248 ,-0.816497 ,0.666667 ,0.666667 ,-0.333333 ,0.408248 ,-0.408248 ,-0.816497 ,-0.408248 ,0.408248 ,-0.816497 ,-0.666667 ,-0.666667 ,-0.333333 ,-0.408248 ,0.408248 ,-0.816497 ,-0.666667 ,-0.666667 ,-0.333333 ,-0.666667 ,0.666667 ,0.333333 ,-0.408248 ,-0.408248 ,0.816497 ,0.408248 ,0.408248 ,0.816497 ,0.666667 ,-0.666667 ,0.333333 ,0.666667 ,0.666667 ,-0.333333 ,0.408248 ,-0.408248 ,-0.816497 ,0.853097 ,-0.520609 ,-0.0345182 ,0.853101 ,-0.467763 ,-0.231118 ,1 ,0 ,0 ,-0.854735 ,0.519065 ,0 ,-1 ,0 ,0 ,-0.91976 ,0.362606 ,0.150197 ,0.992581 ,0.116804 ,0.0337531 ,0.454129 ,0.890936 ,0 ,0.454129 ,0.823118 ,0.340947 ,0.961402 ,-0.268378 ,-0.0606563 ,-0.45413 ,0.890935 ,0 ,-0.45413 ,0.823117 ,0.340946 ,0.853103 ,-0.343712 ,-0.392528 ,-0.854735 ,0.367034 ,0.367035 ,0.992581 ,0.0587309 ,0.106462 ,0.454129 ,0.629987 ,0.629987 ,-0.45413 ,0.629986 ,0.629987 ,0.853101 ,-0.167337 ,-0.494183 ,-0.91976 ,0.150197 ,0.362606 ,0.454129 ,0.340947 ,0.823118 ,0.961404 ,-0.146879 ,-0.232655 ,-0.45413 ,0.340946 ,0.823117 ,0.8531 ,0.034517 ,-0.520605 ,-0.854735 ,0 ,0.519065 ,0.992581 ,-0.0337528 ,0.116807 ,0.454129 ,0 ,0.890936 ,-0.45413 ,0 ,0.890935 ,0.853099 ,0.231119 ,-0.467768 ,-0.91976 ,-0.150197 ,0.362606 ,0.454129 ,-0.340947 ,0.823118 ,0.961402 ,0.0606557 ,-0.268378 ,-0.45413 ,-0.340947 ,0.823117 ,0.853095 ,0.392537 ,-0.34372 ,-0.854735 ,-0.367035 ,0.367035 ,0.992581 ,-0.106458 ,0.0587265 ,0.454128 ,-0.629987 ,0.629987 ,-0.45413 ,-0.629987 ,0.629987 ,0.853097 ,0.494192 ,-0.167334 ,-0.91976 ,-0.362606 ,0.150196 ,0.454128 ,-0.823118 ,0.340947 ,0.961398 ,0.232674 ,-0.146889 ,-0.45413 ,-0.823117 ,0.340946 ,0.853098 ,0.520607 ,0.034519 ,-0.854735 ,-0.519065 ,0 ,0.992581 ,-0.116805 ,-0.0337486 ,0.454128 ,-0.890936 ,0 ,-0.45413 ,-0.890936 ,0 ,0.853093 ,0.467778 ,0.231119 ,-0.91976 ,-0.362606 ,-0.150196 ,0.454128 ,-0.823118 ,-0.340947 ,0.9614 ,0.268386 ,0.0606523 ,-0.45413 ,-0.823117 ,-0.340946 ,0.853096 ,0.343719 ,0.392535 ,-0.854735 ,-0.367035 ,-0.367035 ,0.992581 ,-0.058725 ,-0.106458 ,0.454128 ,-0.629987 ,-0.629987 ,-0.45413 ,-0.629987 ,-0.629987 ,0.853099 ,0.167337 ,0.494186 ,-0.91976 ,-0.150197 ,-0.362606 ,0.454129 ,-0.340947 ,-0.823118 ,0.961402 ,0.146884 ,0.232663 ,-0.45413 ,-0.340947 ,-0.823117 ,0.853101 ,-0.0345192 ,0.520603 ,-0.854735 ,0 ,-0.519065 ,0.992581 ,0.0337517 ,-0.116807 ,0.454129 ,0 ,-0.890936 ,-0.45413 ,0 ,-0.890935 ,0.853103 ,-0.231117 ,0.467761 ,-0.91976 ,0.150197 ,-0.362606 ,0.454129 ,0.340947 ,-0.823118 ,0.961403 ,-0.0606552 ,0.268374 ,-0.45413 ,0.340946 ,-0.823117 ,0.853102 ,-0.392528 ,0.343713 ,-0.854735 ,0.367034 ,-0.367035 ,0.992581 ,0.106462 ,-0.0587312 ,0.454129 ,0.629987 ,-0.629987 ,-0.45413 ,0.629986 ,-0.629987 ,0.853099 ,-0.494186 ,0.167338 ,-0.91976 ,0.362606 ,-0.150197 ,0.454129 ,0.823118 ,-0.340947 ,0.961403 ,-0.232658 ,0.146881 ,-0.45413 ,0.823117 ,-0.340946 ,0.454129 ,0.890936 ,0 ,-1.04184e-007 ,1 ,0 ,0.454129 ,0.823118 ,0.340947 ,-1.04184e-007 ,0.92388 ,0.382683 ,-1.04184e-007 ,1 ,0 ,-0.45413 ,0.890935 ,0 ,-0.45413 ,0.823117 ,0.340946 ,-1.04184e-007 ,0.92388 ,0.382683 ,0.454129 ,0.823118 ,0.340947 ,-1.04184e-007 ,0.92388 ,0.382683 ,-1.00325e-007 ,0.707107 ,0.707107 ,0.454129 ,0.629987 ,0.629987 ,-1.04184e-007 ,0.92388 ,0.382683 ,-0.45413 ,0.823117 ,0.340946 ,-1.00325e-007 ,0.707107 ,0.707107 ,-0.45413 ,0.629986 ,0.629987 ,0.454129 ,0.629987 ,0.629987 ,-1.00325e-007 ,0.707107 ,0.707107 ,0.454129 ,0.340947 ,0.823118 ,-1.00325e-007 ,0.382684 ,0.92388 ,-1.00325e-007 ,0.707107 ,0.707107 ,-0.45413 ,0.629986 ,0.629987 ,-0.45413 ,0.340946 ,0.823117 ,-1.00325e-007 ,0.382684 ,0.92388 ,0.454129 ,0.340947 ,0.823118 ,-1.00325e-007 ,0.382684 ,0.92388 ,-1.04184e-007 ,0 ,1 ,0.454129 ,0 ,0.890936 ,-1.00325e-007 ,0.382684 ,0.92388 ,-0.45413 ,0.340946 ,0.823117 ,-1.04184e-007 ,0 ,1 ,-0.45413 ,0 ,0.890935 ,0.454129 ,0 ,0.890936 ,-1.04184e-007 ,0 ,1 ,0.454129 ,-0.340947 ,0.823118 ,-1.00325e-007 ,-0.382684 ,0.923879 ,-1.04184e-007 ,0 ,1 ,-0.45413 ,0 ,0.890935 ,-0.45413 ,-0.340947 ,0.823117 ,-1.00325e-007 ,-0.382684 ,0.923879 ,0.454129 ,-0.340947 ,0.823118 ,-1.00325e-007 ,-0.382684 ,0.923879 ,-1.02254e-007 ,-0.707107 ,0.707107 ,0.454128 ,-0.629987 ,0.629987 ,-1.00325e-007 ,-0.382684 ,0.923879 ,-0.45413 ,-0.340947 ,0.823117 ,-1.02254e-007 ,-0.707107 ,0.707107 ,-0.45413 ,-0.629987 ,0.629987 ,0.454128 ,-0.629987 ,0.629987 ,-1.02254e-007 ,-0.707107 ,0.707107 ,0.454128 ,-0.823118 ,0.340947 ,-1.04184e-007 ,-0.92388 ,0.382683 ,-1.02254e-007 ,-0.707107 ,0.707107 ,-0.45413 ,-0.629987 ,0.629987 ,-0.45413 ,-0.823117 ,0.340946 ,-1.04184e-007 ,-0.92388 ,0.382683 ,0.454128 ,-0.823118 ,0.340947 ,-1.04184e-007 ,-0.92388 ,0.382683 ,-1.08042e-007 ,-1 ,0 ,0.454128 ,-0.890936 ,0 ,-1.04184e-007 ,-0.92388 ,0.382683 ,-0.45413 ,-0.823117 ,0.340946 ,-1.08042e-007 ,-1 ,0 ,-0.45413 ,-0.890936 ,0 ,0.454128 ,-0.890936 ,0 ,-1.08042e-007 ,-1 ,0 ,0.454128 ,-0.823118 ,-0.340947 ,-1.04184e-007 ,-0.92388 ,-0.382683 ,-1.08042e-007 ,-1 ,0 ,-0.45413 ,-0.890936 ,0 ,-0.45413 ,-0.823117 ,-0.340946 ,-1.04184e-007 ,-0.92388 ,-0.382683 ,0.454128 ,-0.823118 ,-0.340947 ,-1.04184e-007 ,-0.92388 ,-0.382683 ,-1.02254e-007 ,-0.707107 ,-0.707107 ,0.454128 ,-0.629987 ,-0.629987 ,-1.04184e-007 ,-0.92388 ,-0.382683 ,-0.45413 ,-0.823117 ,-0.340946 ,-1.02254e-007 ,-0.707107 ,-0.707107 ,-0.45413 ,-0.629987 ,-0.629987 ,0.454128 ,-0.629987 ,-0.629987 ,-1.02254e-007 ,-0.707107 ,-0.707107 ,0.454129 ,-0.340947 ,-0.823118 ,-1.00325e-007 ,-0.382684 ,-0.923879 ,-1.02254e-007 ,-0.707107 ,-0.707107 ,-0.45413 ,-0.629987 ,-0.629987 ,-0.45413 ,-0.340947 ,-0.823117 ,-1.00325e-007 ,-0.382684 ,-0.923879 ,0.454129 ,-0.340947 ,-0.823118 ,-1.00325e-007 ,-0.382684 ,-0.923879 ,-1.04184e-007 ,0 ,-1 ,0.454129 ,0 ,-0.890936 ,-1.00325e-007 ,-0.382684 ,-0.923879 ,-0.45413 ,-0.340947 ,-0.823117 ,-1.04184e-007 ,0 ,-1 ,-0.45413 ,0 ,-0.890935 ,0.454129 ,0 ,-0.890936 ,-1.04184e-007 ,0 ,-1 ,0.454129 ,0.340947 ,-0.823118 ,-1.00325e-007 ,0.382684 ,-0.92388 ,-1.04184e-007 ,0 ,-1 ,-0.45413 ,0 ,-0.890935 ,-0.45413 ,0.340946 ,-0.823117 ,-1.00325e-007 ,0.382684 ,-0.92388 ,0.454129 ,0.340947 ,-0.823118 ,-1.00325e-007 ,0.382684 ,-0.92388 ,-1.00325e-007 ,0.707107 ,-0.707107 ,0.454129 ,0.629987 ,-0.629987 ,-1.00325e-007 ,0.382684 ,-0.92388 ,-0.45413 ,0.340946 ,-0.823117 ,-1.00325e-007 ,0.707107 ,-0.707107 ,-0.45413 ,0.629986 ,-0.629987 ,0.454129 ,0.629987 ,-0.629987 ,-1.00325e-007 ,0.707107 ,-0.707107 ,0.454129 ,0.823118 ,-0.340947 ,-1.04184e-007 ,0.92388 ,-0.382683 ,-1.00325e-007 ,0.707107 ,-0.707107 ,-0.45413 ,0.629986 ,-0.629987 ,-0.45413 ,0.823117 ,-0.340946 ,-1.04184e-007 ,0.92388 ,-0.382683 ,0.454129 ,0.823118 ,-0.340947 ,-1.04184e-007 ,0.92388 ,-0.382683 ,-1.04184e-007 ,1 ,0 ,0.454129 ,0.890936 ,0 ,-1.04184e-007 ,0.92388 ,-0.382683 ,-0.45413 ,0.823117 ,-0.340946 ,-1.04184e-007 ,1 ,0 ,-0.45413 ,0.890935 ,0 ] ,"tangents": [ -0.040663 ,-0.000383586 ,-0.999173 ,-0.258808 ,0.00523812 ,-0.965914 ,0 ,3.57869e-008 ,-1 ,-2.18394e-007 ,-9.1843e-008 ,-1 ,0 ,-4.76878e-008 ,-1 ,-0.159762 ,0.00365147 ,-0.987149 ,0.0342898 ,-0.00258663 ,-0.999409 ,0.0552983 ,-0.0281864 ,-0.998072 ,0.414342 ,0.143659 ,-0.898712 ,-0.0602478 ,0.00976604 ,-0.998136 ,-0.055298 ,-0.0281863 ,-0.998072 ,-0.41434 ,0.143659 ,-0.898712 ,-0.411744 ,0.0185513 ,-0.911111 ,-0.388404 ,0.016836 ,-0.921335 ,0.106503 ,0.0024515 ,-0.994309 ,0.709306 ,0.17223 ,-0.683536 ,-0.709305 ,0.172231 ,-0.683537 ,-0.498671 ,0.0170538 ,-0.866624 ,-0.365282 ,0.010367 ,-0.930839 ,0.852957 ,0.100491 ,-0.512216 ,-0.226287 ,0.058902 ,-0.972278 ,-0.852957 ,0.100491 ,-0.512217 ,-0.520791 ,-0.00404867 ,-0.853675 ,-0.519066 ,1.53965e-007 ,-0.854734 ,0.116767 ,-0.00323018 ,-0.993154 ,0.890936 ,0 ,-0.454128 ,-0.890936 ,0 ,-0.454129 ,-0.476485 ,-0.0201484 ,-0.878952 ,-0.365282 ,-0.010367 ,-0.930839 ,0.854508 ,-0.0947999 ,-0.510714 ,-0.266827 ,-0.0325038 ,-0.963196 ,-0.854507 ,-0.0948002 ,-0.510715 ,-0.368075 ,-0.0141367 ,-0.929689 ,-0.388405 ,-0.0168355 ,-0.921335 ,0.0592952 ,0.00217883 ,-0.998238 ,0.731654 ,-0.139776 ,-0.667191 ,-0.731653 ,-0.139777 ,-0.667193 ,-0.191516 ,-0.0017315 ,-0.981488 ,-0.159762 ,-0.00365032 ,-0.987149 ,0.263324 ,-0.241582 ,-0.933969 ,-0.143103 ,-0.0331642 ,-0.989152 ,-0.458106 ,-0.112487 ,-0.881751 ,0.0406642 ,-0.000384465 ,-0.999173 ,-2.64718e-007 ,1.77027e-007 ,-1 ,-0.0335702 ,0.00349361 ,-0.99943 ,0.0330475 ,0.0168447 ,-0.999312 ,-0.0552993 ,0.028187 ,-0.998072 ,0.258811 ,0.00523932 ,-0.965914 ,0.159762 ,0.00364994 ,-0.987149 ,-0.236441 ,0.257616 ,-0.936872 ,0.060244 ,0.00976536 ,-0.998136 ,0.414343 ,0.143657 ,-0.898712 ,0.411752 ,0.0185537 ,-0.911107 ,0.388404 ,0.0168356 ,-0.921335 ,-0.106499 ,0.00245157 ,-0.99431 ,-0.709306 ,0.17223 ,-0.683536 ,0.709305 ,0.17223 ,-0.683537 ,0.498675 ,0.017055 ,-0.866621 ,0.365281 ,0.0103668 ,-0.93084 ,-0.852957 ,0.10049 ,-0.512217 ,0.226296 ,0.0589057 ,-0.972276 ,0.852956 ,0.100491 ,-0.512218 ,0.520792 ,-0.00404838 ,-0.853674 ,0.519064 ,-1.4181e-007 ,-0.854735 ,-0.116762 ,-0.00322989 ,-0.993155 ,-0.890936 ,0 ,-0.454129 ,0.890935 ,0 ,-0.45413 ,0.476479 ,-0.020147 ,-0.878955 ,0.365281 ,-0.010367 ,-0.93084 ,-0.854507 ,-0.0948012 ,-0.510715 ,0.266826 ,-0.0325031 ,-0.963196 ,0.854506 ,-0.0948015 ,-0.510717 ,0.368066 ,-0.0141348 ,-0.929692 ,0.388404 ,-0.016836 ,-0.921335 ,-0.0592997 ,0.00217925 ,-0.998238 ,-0.731653 ,-0.139777 ,-0.667192 ,0.731652 ,-0.139778 ,-0.667194 ,0.191519 ,-0.00172977 ,-0.981487 ,0.159761 ,-0.00365147 ,-0.987149 ,-0.458105 ,-0.112489 ,-0.881752 ,0.143095 ,-0.033162 ,-0.989153 ,0.458104 ,-0.112489 ,-0.881752 ,0.0268145 ,-0.0136682 ,0.999547 ,-2.30261e-009 ,-1.46002e-007 ,1 ,-0.0160933 ,-0.375042 ,0.926868 ,4.14468e-009 ,-0.382684 ,0.923879 ,-2.30261e-009 ,-1.46002e-007 ,1 ,-0.0268146 ,-0.0136683 ,0.999547 ,0.0160933 ,-0.375042 ,0.926868 ,4.14468e-009 ,-0.382684 ,0.923879 ,-0.0160933 ,-0.375042 ,0.926868 ,4.14468e-009 ,-0.382684 ,0.923879 ,2.3026e-009 ,-0.707107 ,0.707107 ,-0.0268147 ,-0.697122 ,0.716451 ,4.14468e-009 ,-0.382684 ,0.923879 ,0.0160933 ,-0.375042 ,0.926868 ,2.3026e-009 ,-0.707107 ,0.707107 ,0.0268147 ,-0.697122 ,0.716451 ,-0.0268147 ,-0.697122 ,0.716451 ,2.3026e-009 ,-0.707107 ,0.707107 ,-0.0160932 ,-0.92059 ,0.390199 ,4.14469e-009 ,-0.923879 ,0.382684 ,2.3026e-009 ,-0.707107 ,0.707107 ,0.0268147 ,-0.697122 ,0.716451 ,0.0160932 ,-0.92059 ,0.390199 ,4.14469e-009 ,-0.923879 ,0.382684 ,-0.0160932 ,-0.92059 ,0.390199 ,4.14469e-009 ,-0.923879 ,0.382684 ,2.3026e-009 ,-1 ,0 ,-0.0268145 ,-0.999547 ,0.0136679 ,4.14469e-009 ,-0.923879 ,0.382684 ,0.0160932 ,-0.92059 ,0.390199 ,2.3026e-009 ,-1 ,0 ,0.0268146 ,-0.999547 ,0.013668 ,-0.0268145 ,-0.999547 ,0.0136679 ,2.3026e-009 ,-1 ,0 ,-0.0160933 ,-0.926868 ,-0.375042 ,3.99119e-009 ,-0.923879 ,-0.382684 ,2.3026e-009 ,-1 ,0 ,0.0268146 ,-0.999547 ,0.013668 ,0.0160933 ,-0.926868 ,-0.375042 ,3.99119e-009 ,-0.923879 ,-0.382684 ,-0.0160933 ,-0.926868 ,-0.375042 ,3.99119e-009 ,-0.923879 ,-0.382684 ,2.21731e-009 ,-0.707107 ,-0.707107 ,-0.0268146 ,-0.716451 ,-0.697122 ,3.99119e-009 ,-0.923879 ,-0.382684 ,0.0160933 ,-0.926868 ,-0.375042 ,2.21731e-009 ,-0.707107 ,-0.707107 ,0.0268146 ,-0.716451 ,-0.697121 ,-0.0268146 ,-0.716451 ,-0.697122 ,2.21731e-009 ,-0.707107 ,-0.707107 ,0.263324 ,-0.241582 ,-0.933969 ,4.1447e-009 ,-0.382684 ,-0.923879 ,2.21731e-009 ,-0.707107 ,-0.707107 ,0.0268146 ,-0.716451 ,-0.697121 ,0.0160934 ,-0.3902 ,-0.92059 ,4.1447e-009 ,-0.382684 ,-0.923879 ,0.263324 ,-0.241582 ,-0.933969 ,4.1447e-009 ,-0.382684 ,-0.923879 ,2.34524e-009 ,-1.46002e-007 ,-1 ,0.0330475 ,0.0168447 ,-0.999312 ,4.1447e-009 ,-0.382684 ,-0.923879 ,0.0160934 ,-0.3902 ,-0.92059 ,2.34524e-009 ,-1.46002e-007 ,-1 ,0.0268145 ,-0.0136682 ,-0.999547 ,0.0330475 ,0.0168447 ,-0.999312 ,2.34524e-009 ,-1.46002e-007 ,-1 ,-0.236441 ,0.257616 ,-0.936872 ,4.14468e-009 ,0.382683 ,-0.92388 ,2.34524e-009 ,-1.46002e-007 ,-1 ,0.0268145 ,-0.0136682 ,-0.999547 ,0.0160934 ,0.375042 ,-0.926868 ,4.14468e-009 ,0.382683 ,-0.92388 ,-0.236441 ,0.257616 ,-0.936872 ,4.14468e-009 ,0.382683 ,-0.92388 ,2.21732e-009 ,0.707107 ,-0.707107 ,-0.0268144 ,0.697122 ,-0.716451 ,4.14468e-009 ,0.382683 ,-0.92388 ,0.0160934 ,0.375042 ,-0.926868 ,2.21732e-009 ,0.707107 ,-0.707107 ,0.0268145 ,0.697122 ,-0.716451 ,-0.0268144 ,0.697122 ,-0.716451 ,2.21732e-009 ,0.707107 ,-0.707107 ,-0.0160934 ,0.92059 ,-0.3902 ,3.9912e-009 ,0.923879 ,-0.382684 ,2.21732e-009 ,0.707107 ,-0.707107 ,0.0268145 ,0.697122 ,-0.716451 ,0.0160934 ,0.92059 ,-0.3902 ,3.9912e-009 ,0.923879 ,-0.382684 ,-0.0160934 ,0.92059 ,-0.3902 ,3.9912e-009 ,0.923879 ,-0.382684 ,2.3026e-009 ,1 ,0 ,-0.0268146 ,0.999547 ,-0.0136679 ,3.9912e-009 ,0.923879 ,-0.382684 ,0.0160934 ,0.92059 ,-0.3902 ,2.3026e-009 ,1 ,0 ,0.0268146 ,0.999547 ,-0.013668 ,-0.0268146 ,0.999547 ,-0.0136679 ,2.3026e-009 ,1 ,0 ,-0.0160933 ,0.926868 ,0.375042 ,3.99119e-009 ,0.92388 ,0.382683 ,2.3026e-009 ,1 ,0 ,0.0268146 ,0.999547 ,-0.013668 ,0.0160933 ,0.926868 ,0.375042 ,3.99119e-009 ,0.92388 ,0.382683 ,-0.0160933 ,0.926868 ,0.375042 ,3.99119e-009 ,0.92388 ,0.382683 ,2.25996e-009 ,0.707107 ,0.707107 ,-0.0268145 ,0.716451 ,0.697122 ,3.99119e-009 ,0.92388 ,0.382683 ,0.0160933 ,0.926868 ,0.375042 ,2.25996e-009 ,0.707107 ,0.707107 ,0.0268146 ,0.716451 ,0.697122 ,-0.0268145 ,0.716451 ,0.697122 ,2.25996e-009 ,0.707107 ,0.707107 ,-0.0160933 ,0.3902 ,0.92059 ,4.14468e-009 ,0.382683 ,0.92388 ,2.25996e-009 ,0.707107 ,0.707107 ,0.0268146 ,0.716451 ,0.697122 ,0.0160934 ,0.3902 ,0.92059 ,4.14468e-009 ,0.382683 ,0.92388 ,-0.0160933 ,0.3902 ,0.92059 ,4.14468e-009 ,0.382683 ,0.92388 ,-2.30261e-009 ,-1.46002e-007 ,1 ,0.0268145 ,-0.0136682 ,0.999547 ,4.14468e-009 ,0.382683 ,0.92388 ,0.0160934 ,0.3902 ,0.92059 ,-2.30261e-009 ,-1.46002e-007 ,1 ,-0.0268146 ,-0.0136683 ,0.999547 ,0 ,2.77056e-008 ,-1 ,0.258809 ,0.00523812 ,-0.965914 ,0.0406628 ,-0.000383594 ,-0.999173 ,0.159762 ,0.00365148 ,-0.987149 ,0 ,-5.1428e-008 ,-1 ,5.07272e-008 ,-8.86392e-008 ,-1 ,-0.414342 ,0.143659 ,-0.898712 ,-0.055298 ,-0.0281865 ,-0.998072 ,-0.0342897 ,-0.00258663 ,-0.999409 ,0.0602476 ,0.00976604 ,-0.998136 ,0.414341 ,0.143659 ,-0.898712 ,0.0552976 ,-0.0281864 ,-0.998072 ,0.411744 ,0.0185513 ,-0.911111 ,0.388404 ,0.016836 ,-0.921335 ,-0.106503 ,0.00245147 ,-0.994309 ,-0.709306 ,0.17223 ,-0.683536 ,0.709305 ,0.17223 ,-0.683537 ,0.498671 ,0.0170538 ,-0.866624 ,0.365281 ,0.0103669 ,-0.930839 ,-0.852957 ,0.100491 ,-0.512216 ,0.226288 ,0.0589018 ,-0.972278 ,0.852956 ,0.100492 ,-0.512218 ,0.520791 ,-0.00404873 ,-0.853674 ,0.519065 ,1.4181e-007 ,-0.854735 ,-0.116765 ,-0.00323027 ,-0.993154 ,-0.890936 ,0 ,-0.454129 ,0.890935 ,0 ,-0.45413 ,0.476485 ,-0.0201484 ,-0.878952 ,0.365281 ,-0.0103669 ,-0.930839 ,-0.854508 ,-0.0948003 ,-0.510715 ,0.266828 ,-0.032504 ,-0.963196 ,0.854507 ,-0.0948007 ,-0.510716 ,0.368075 ,-0.0141367 ,-0.929689 ,0.388405 ,-0.0168355 ,-0.921335 ,-0.0592949 ,0.00217878 ,-0.998238 ,-0.731654 ,-0.139776 ,-0.667192 ,0.731653 ,-0.139777 ,-0.667193 ,0.191515 ,-0.00173153 ,-0.981488 ,0.159762 ,-0.00365034 ,-0.987149 ,-0.263324 ,-0.241582 ,-0.933969 ,0.143103 ,-0.0331642 ,-0.989152 ,0.458106 ,-0.112487 ,-0.881751 ,-0.0406643 ,-0.000384468 ,-0.999173 ,1.08396e-007 ,1.75142e-007 ,-1 ,0.0335703 ,0.00349361 ,-0.99943 ,-0.0330473 ,0.0168449 ,-0.999312 ,0.0552989 ,0.0281871 ,-0.998072 ,-0.258811 ,0.00523935 ,-0.965914 ,-0.159762 ,0.00364992 ,-0.987149 ,0.236441 ,0.257617 ,-0.936872 ,-0.0602438 ,0.0097654 ,-0.998136 ,-0.414343 ,0.143657 ,-0.898711 ,-0.411752 ,0.0185537 ,-0.911107 ,-0.388404 ,0.0168356 ,-0.921335 ,0.106499 ,0.00245158 ,-0.99431 ,0.709307 ,0.17223 ,-0.683536 ,-0.709305 ,0.17223 ,-0.683537 ,-0.498674 ,0.0170549 ,-0.866622 ,-0.365281 ,0.0103669 ,-0.930839 ,0.852957 ,0.10049 ,-0.512216 ,-0.226295 ,0.0589055 ,-0.972276 ,-0.852957 ,0.100491 ,-0.512218 ,-0.52079 ,-0.00404831 ,-0.853675 ,-0.519065 ,-1.53965e-007 ,-0.854735 ,0.116764 ,-0.00322987 ,-0.993154 ,0.890936 ,0 ,-0.454129 ,-0.890935 ,0 ,-0.45413 ,-0.476478 ,-0.020147 ,-0.878955 ,-0.365281 ,-0.0103671 ,-0.930839 ,0.854508 ,-0.094801 ,-0.510715 ,-0.266824 ,-0.0325028 ,-0.963197 ,-0.854507 ,-0.0948013 ,-0.510716 ,-0.368067 ,-0.0141349 ,-0.929692 ,-0.388404 ,-0.016836 ,-0.921335 ,0.0592997 ,0.00217923 ,-0.998238 ,0.731653 ,-0.139777 ,-0.667192 ,-0.731652 ,-0.139777 ,-0.667194 ,-0.191519 ,-0.00172977 ,-0.981487 ,-0.159762 ,-0.00365147 ,-0.987149 ,0.458106 ,-0.112489 ,-0.881751 ,-0.143095 ,-0.0331621 ,-0.989153 ,-0.458104 ,-0.112489 ,-0.881752 ,0.0160933 ,-0.375042 ,0.926868 ,2.30261e-009 ,0 ,1 ,-0.0268145 ,-0.0136679 ,0.999547 ,-4.14468e-009 ,-0.382684 ,0.92388 ,-0.0160934 ,-0.375042 ,0.926868 ,0.0268146 ,-0.013668 ,0.999547 ,2.30261e-009 ,0 ,1 ,-4.14468e-009 ,-0.382684 ,0.92388 ,-2.21733e-009 ,-0.707107 ,0.707107 ,-4.14468e-009 ,-0.382684 ,0.92388 ,0.0160933 ,-0.375042 ,0.926868 ,0.0268145 ,-0.697122 ,0.716451 ,-2.21733e-009 ,-0.707107 ,0.707107 ,-0.0160934 ,-0.375042 ,0.926868 ,-4.14468e-009 ,-0.382684 ,0.92388 ,-0.0268146 ,-0.697122 ,0.716451 ,0.0160933 ,-0.92059 ,0.3902 ,-2.21733e-009 ,-0.707107 ,0.707107 ,0.0268145 ,-0.697122 ,0.716451 ,-3.99117e-009 ,-0.92388 ,0.382684 ,-0.0160933 ,-0.92059 ,0.3902 ,-0.0268146 ,-0.697122 ,0.716451 ,-2.21733e-009 ,-0.707107 ,0.707107 ,-3.99117e-009 ,-0.92388 ,0.382684 ,-2.30261e-009 ,-1 ,0 ,-3.99117e-009 ,-0.92388 ,0.382684 ,0.0160933 ,-0.92059 ,0.3902 ,0.0268145 ,-0.999547 ,0.0136679 ,-2.30261e-009 ,-1 ,0 ,-0.0160933 ,-0.92059 ,0.3902 ,-3.99117e-009 ,-0.92388 ,0.382684 ,-0.0268146 ,-0.999547 ,0.013668 ,0.0160933 ,-0.926868 ,-0.375043 ,-2.30261e-009 ,-1 ,0 ,0.0268145 ,-0.999547 ,0.0136679 ,-3.99117e-009 ,-0.923879 ,-0.382684 ,-0.0160934 ,-0.926868 ,-0.375043 ,-0.0268146 ,-0.999547 ,0.013668 ,-2.30261e-009 ,-1 ,0 ,-3.99117e-009 ,-0.923879 ,-0.382684 ,-2.25996e-009 ,-0.707107 ,-0.707107 ,-3.99117e-009 ,-0.923879 ,-0.382684 ,0.0160933 ,-0.926868 ,-0.375043 ,0.0268144 ,-0.716451 ,-0.697122 ,-2.25996e-009 ,-0.707107 ,-0.707107 ,-0.0160934 ,-0.926868 ,-0.375043 ,-3.99117e-009 ,-0.923879 ,-0.382684 ,-0.0268145 ,-0.716451 ,-0.697122 ,-0.263324 ,-0.241582 ,-0.933969 ,-2.25996e-009 ,-0.707107 ,-0.707107 ,0.0268144 ,-0.716451 ,-0.697122 ,-4.14469e-009 ,-0.382684 ,-0.92388 ,-0.0160934 ,-0.3902 ,-0.92059 ,-0.0268145 ,-0.716451 ,-0.697122 ,-2.25996e-009 ,-0.707107 ,-0.707107 ,-4.14469e-009 ,-0.382684 ,-0.92388 ,-2.38788e-009 ,0 ,-1 ,-4.14469e-009 ,-0.382684 ,-0.92388 ,-0.263324 ,-0.241582 ,-0.933969 ,-0.0330473 ,0.0168449 ,-0.999312 ,-2.38788e-009 ,0 ,-1 ,-0.0160934 ,-0.3902 ,-0.92059 ,-4.14469e-009 ,-0.382684 ,-0.92388 ,-0.0268145 ,-0.0136679 ,-0.999547 ,0.236441 ,0.257617 ,-0.936872 ,-2.38788e-009 ,0 ,-1 ,-0.0330473 ,0.0168449 ,-0.999312 ,-4.14469e-009 ,0.382684 ,-0.92388 ,-0.0160934 ,0.375042 ,-0.926868 ,-0.0268145 ,-0.0136679 ,-0.999547 ,-2.38788e-009 ,0 ,-1 ,-4.14469e-009 ,0.382684 ,-0.92388 ,-2.25996e-009 ,0.707107 ,-0.707107 ,-4.14469e-009 ,0.382684 ,-0.92388 ,0.236441 ,0.257617 ,-0.936872 ,0.0268144 ,0.697122 ,-0.716451 ,-2.25996e-009 ,0.707107 ,-0.707107 ,-0.0160934 ,0.375042 ,-0.926868 ,-4.14469e-009 ,0.382684 ,-0.92388 ,-0.0268145 ,0.697122 ,-0.716451 ,0.0160933 ,0.92059 ,-0.3902 ,-2.25996e-009 ,0.707107 ,-0.707107 ,0.0268144 ,0.697122 ,-0.716451 ,-3.99118e-009 ,0.923879 ,-0.382684 ,-0.0160934 ,0.920589 ,-0.3902 ,-0.0268145 ,0.697122 ,-0.716451 ,-2.25996e-009 ,0.707107 ,-0.707107 ,-3.99118e-009 ,0.923879 ,-0.382684 ,-2.30261e-009 ,1 ,0 ,-3.99118e-009 ,0.923879 ,-0.382684 ,0.0160933 ,0.92059 ,-0.3902 ,0.0268145 ,0.999547 ,-0.0136679 ,-2.30261e-009 ,1 ,0 ,-0.0160934 ,0.920589 ,-0.3902 ,-3.99118e-009 ,0.923879 ,-0.382684 ,-0.0268146 ,0.999547 ,-0.013668 ,0.0160933 ,0.926868 ,0.375042 ,-2.30261e-009 ,1 ,0 ,0.0268145 ,0.999547 ,-0.0136679 ,-3.99117e-009 ,0.92388 ,0.382684 ,-0.0160933 ,0.926868 ,0.375042 ,-0.0268146 ,0.999547 ,-0.013668 ,-2.30261e-009 ,1 ,0 ,-3.99117e-009 ,0.92388 ,0.382684 ,-2.21732e-009 ,0.707107 ,0.707107 ,-3.99117e-009 ,0.92388 ,0.382684 ,0.0160933 ,0.926868 ,0.375042 ,0.0268145 ,0.716451 ,0.697122 ,-2.21732e-009 ,0.707107 ,0.707107 ,-0.0160933 ,0.926868 ,0.375042 ,-3.99117e-009 ,0.92388 ,0.382684 ,-0.0268145 ,0.716451 ,0.697122 ,0.0160933 ,0.3902 ,0.92059 ,-2.21732e-009 ,0.707107 ,0.707107 ,0.0268145 ,0.716451 ,0.697122 ,-4.14468e-009 ,0.382684 ,0.92388 ,-0.0160933 ,0.3902 ,0.92059 ,-0.0268145 ,0.716451 ,0.697122 ,-2.21732e-009 ,0.707107 ,0.707107 ,-4.14468e-009 ,0.382684 ,0.92388 ,2.30261e-009 ,0 ,1 ,-4.14468e-009 ,0.382684 ,0.92388 ,0.0160933 ,0.3902 ,0.92059 ,-0.0268145 ,-0.0136679 ,0.999547 ,2.30261e-009 ,0 ,1 ,-0.0160933 ,0.3902 ,0.92059 ,-4.14468e-009 ,0.382684 ,0.92388 ,0.0268146 ,-0.013668 ,0.999547 ,0 ,2.77061e-008 ,-1 ,0.258808 ,0.00523808 ,-0.965914 ,0.040663 ,-0.000383602 ,-0.999173 ,0.159762 ,0.00365147 ,-0.987149 ,0 ,-5.1428e-008 ,-1 ,2.18928e-007 ,-9.1843e-008 ,-1 ,-0.414342 ,0.143659 ,-0.898712 ,-0.0552983 ,-0.0281864 ,-0.998072 ,-0.0342898 ,-0.00258663 ,-0.999409 ,0.0602478 ,0.00976604 ,-0.998136 ,0.41434 ,0.143659 ,-0.898712 ,0.055298 ,-0.0281863 ,-0.998072 ,0.411744 ,0.0185513 ,-0.911111 ,0.388404 ,0.016836 ,-0.921335 ,-0.106503 ,0.00245148 ,-0.994309 ,-0.709306 ,0.17223 ,-0.683536 ,0.709305 ,0.172231 ,-0.683537 ,0.498671 ,0.0170538 ,-0.866624 ,0.365282 ,0.010367 ,-0.930839 ,-0.852957 ,0.100491 ,-0.512216 ,0.226287 ,0.058902 ,-0.972278 ,0.852957 ,0.100491 ,-0.512217 ,0.520791 ,-0.00404872 ,-0.853675 ,0.519066 ,1.4181e-007 ,-0.854734 ,-0.116767 ,-0.00323026 ,-0.993154 ,-0.890936 ,0 ,-0.454128 ,0.890936 ,0 ,-0.454129 ,0.476485 ,-0.0201484 ,-0.878952 ,0.365282 ,-0.010367 ,-0.930839 ,-0.854508 ,-0.0947999 ,-0.510714 ,0.266827 ,-0.0325038 ,-0.963196 ,0.854507 ,-0.0948003 ,-0.510715 ,0.368075 ,-0.0141367 ,-0.929689 ,0.388405 ,-0.0168356 ,-0.921335 ,-0.0592952 ,0.00217881 ,-0.998238 ,-0.731654 ,-0.139776 ,-0.667191 ,0.731653 ,-0.139777 ,-0.667193 ,0.191516 ,-0.00173149 ,-0.981488 ,0.159762 ,-0.00365033 ,-0.987149 ,-0.263324 ,-0.241582 ,-0.933969 ,0.143103 ,-0.0331642 ,-0.989152 ,0.458106 ,-0.112487 ,-0.881751 ,-0.0406642 ,-0.000384472 ,-0.999173 ,2.69121e-007 ,1.82618e-007 ,-1 ,0.0335702 ,0.00349361 ,-0.99943 ,-0.0330475 ,0.0168447 ,-0.999312 ,0.0552993 ,0.028187 ,-0.998072 ,-0.258811 ,0.00523936 ,-0.965914 ,-0.159762 ,0.00364993 ,-0.987149 ,0.236441 ,0.257616 ,-0.936872 ,-0.060244 ,0.00976536 ,-0.998136 ,-0.414343 ,0.143657 ,-0.898712 ,-0.411752 ,0.0185537 ,-0.911107 ,-0.388404 ,0.0168356 ,-0.921335 ,0.106499 ,0.00245154 ,-0.99431 ,0.709307 ,0.17223 ,-0.683536 ,-0.709305 ,0.17223 ,-0.683537 ,-0.498675 ,0.017055 ,-0.866621 ,-0.365281 ,0.0103668 ,-0.93084 ,0.852957 ,0.10049 ,-0.512217 ,-0.226296 ,0.0589056 ,-0.972276 ,-0.852956 ,0.100491 ,-0.512218 ,-0.520792 ,-0.00404834 ,-0.853674 ,-0.519064 ,-1.53965e-007 ,-0.854735 ,0.116762 ,-0.00322988 ,-0.993155 ,0.890936 ,0 ,-0.454129 ,-0.890935 ,0 ,-0.45413 ,-0.476479 ,-0.020147 ,-0.878955 ,-0.365281 ,-0.010367 ,-0.93084 ,0.854507 ,-0.0948012 ,-0.510715 ,-0.266826 ,-0.0325031 ,-0.963196 ,-0.854506 ,-0.0948015 ,-0.510717 ,-0.368066 ,-0.0141349 ,-0.929692 ,-0.388404 ,-0.016836 ,-0.921335 ,0.0592997 ,0.00217922 ,-0.998238 ,0.731653 ,-0.139777 ,-0.667192 ,-0.731652 ,-0.139778 ,-0.667194 ,-0.191519 ,-0.00172975 ,-0.981487 ,-0.159761 ,-0.00365147 ,-0.987149 ,0.458105 ,-0.112489 ,-0.881752 ,-0.143095 ,-0.033162 ,-0.989153 ,-0.458104 ,-0.112489 ,-0.881752 ,0.0160933 ,-0.375042 ,0.926868 ,2.30261e-009 ,-1.46002e-007 ,1 ,-0.0268145 ,-0.0136682 ,0.999547 ,-4.14468e-009 ,-0.382684 ,0.923879 ,-0.0160933 ,-0.375042 ,0.926868 ,0.0268146 ,-0.0136683 ,0.999547 ,2.30261e-009 ,-1.46002e-007 ,1 ,-4.14468e-009 ,-0.382684 ,0.923879 ,-2.3026e-009 ,-0.707107 ,0.707107 ,-4.14468e-009 ,-0.382684 ,0.923879 ,0.0160933 ,-0.375042 ,0.926868 ,0.0268147 ,-0.697122 ,0.716451 ,-2.3026e-009 ,-0.707107 ,0.707107 ,-0.0160933 ,-0.375042 ,0.926868 ,-4.14468e-009 ,-0.382684 ,0.923879 ,-0.0268147 ,-0.697122 ,0.716451 ,0.0160932 ,-0.92059 ,0.390199 ,-2.3026e-009 ,-0.707107 ,0.707107 ,0.0268147 ,-0.697122 ,0.716451 ,-4.14469e-009 ,-0.923879 ,0.382683 ,-0.0160932 ,-0.92059 ,0.390199 ,-0.0268147 ,-0.697122 ,0.716451 ,-2.3026e-009 ,-0.707107 ,0.707107 ,-4.14469e-009 ,-0.923879 ,0.382683 ,-2.3026e-009 ,-1 ,0 ,-4.14469e-009 ,-0.923879 ,0.382683 ,0.0160932 ,-0.92059 ,0.390199 ,0.0268145 ,-0.999547 ,0.0136679 ,-2.3026e-009 ,-1 ,0 ,-0.0160932 ,-0.92059 ,0.390199 ,-4.14469e-009 ,-0.923879 ,0.382683 ,-0.0268146 ,-0.999547 ,0.013668 ,0.0160933 ,-0.926868 ,-0.375042 ,-2.3026e-009 ,-1 ,0 ,0.0268145 ,-0.999547 ,0.0136679 ,-3.99119e-009 ,-0.923879 ,-0.382684 ,-0.0160933 ,-0.926868 ,-0.375042 ,-0.0268146 ,-0.999547 ,0.013668 ,-2.3026e-009 ,-1 ,0 ,-3.99119e-009 ,-0.923879 ,-0.382684 ,-2.21731e-009 ,-0.707107 ,-0.707107 ,-3.99119e-009 ,-0.923879 ,-0.382684 ,0.0160933 ,-0.926868 ,-0.375042 ,0.0268146 ,-0.716451 ,-0.697122 ,-2.21731e-009 ,-0.707107 ,-0.707107 ,-0.0160933 ,-0.926868 ,-0.375042 ,-3.99119e-009 ,-0.923879 ,-0.382684 ,-0.0268146 ,-0.716451 ,-0.697121 ,-0.263324 ,-0.241582 ,-0.933969 ,-2.21731e-009 ,-0.707107 ,-0.707107 ,0.0268146 ,-0.716451 ,-0.697122 ,-4.1447e-009 ,-0.382684 ,-0.923879 ,-0.0160934 ,-0.3902 ,-0.92059 ,-0.0268146 ,-0.716451 ,-0.697121 ,-2.21731e-009 ,-0.707107 ,-0.707107 ,-4.1447e-009 ,-0.382684 ,-0.923879 ,-2.34524e-009 ,-1.46002e-007 ,-1 ,-4.1447e-009 ,-0.382684 ,-0.923879 ,-0.263324 ,-0.241582 ,-0.933969 ,-0.0330475 ,0.0168447 ,-0.999312 ,-2.34524e-009 ,-1.46002e-007 ,-1 ,-0.0160934 ,-0.3902 ,-0.92059 ,-4.1447e-009 ,-0.382684 ,-0.923879 ,-0.0268145 ,-0.0136682 ,-0.999547 ,0.236441 ,0.257616 ,-0.936872 ,-2.34524e-009 ,-1.46002e-007 ,-1 ,-0.0330475 ,0.0168447 ,-0.999312 ,-4.14468e-009 ,0.382683 ,-0.92388 ,-0.0160934 ,0.375042 ,-0.926868 ,-0.0268145 ,-0.0136682 ,-0.999547 ,-2.34524e-009 ,-1.46002e-007 ,-1 ,-4.14468e-009 ,0.382683 ,-0.92388 ,-2.21732e-009 ,0.707107 ,-0.707107 ,-4.14468e-009 ,0.382683 ,-0.92388 ,0.236441 ,0.257616 ,-0.936872 ,0.0268144 ,0.697122 ,-0.716451 ,-2.21732e-009 ,0.707107 ,-0.707107 ,-0.0160934 ,0.375042 ,-0.926868 ,-4.14468e-009 ,0.382683 ,-0.92388 ,-0.0268145 ,0.697122 ,-0.716451 ,0.0160934 ,0.92059 ,-0.3902 ,-2.21732e-009 ,0.707107 ,-0.707107 ,0.0268144 ,0.697122 ,-0.716451 ,-3.9912e-009 ,0.923879 ,-0.382684 ,-0.0160934 ,0.92059 ,-0.3902 ,-0.0268145 ,0.697122 ,-0.716451 ,-2.21732e-009 ,0.707107 ,-0.707107 ,-3.9912e-009 ,0.923879 ,-0.382684 ,-2.3026e-009 ,1 ,0 ,-3.9912e-009 ,0.923879 ,-0.382684 ,0.0160934 ,0.92059 ,-0.3902 ,0.0268146 ,0.999547 ,-0.0136679 ,-2.3026e-009 ,1 ,0 ,-0.0160934 ,0.92059 ,-0.3902 ,-3.9912e-009 ,0.923879 ,-0.382684 ,-0.0268146 ,0.999547 ,-0.013668 ,0.0160933 ,0.926868 ,0.375042 ,-2.3026e-009 ,1 ,0 ,0.0268146 ,0.999547 ,-0.0136679 ,-3.99119e-009 ,0.92388 ,0.382683 ,-0.0160933 ,0.926868 ,0.375042 ,-0.0268146 ,0.999547 ,-0.013668 ,-2.3026e-009 ,1 ,0 ,-3.99119e-009 ,0.92388 ,0.382683 ,-2.25996e-009 ,0.707107 ,0.707107 ,-3.99119e-009 ,0.92388 ,0.382683 ,0.0160933 ,0.926868 ,0.375042 ,0.0268145 ,0.716451 ,0.697122 ,-2.25996e-009 ,0.707107 ,0.707107 ,-0.0160933 ,0.926868 ,0.375042 ,-3.99119e-009 ,0.92388 ,0.382683 ,-0.0268145 ,0.716451 ,0.697122 ,0.0160933 ,0.3902 ,0.92059 ,-2.25996e-009 ,0.707107 ,0.707107 ,0.0268145 ,0.716451 ,0.697122 ,-4.14468e-009 ,0.382683 ,0.92388 ,-0.0160934 ,0.3902 ,0.92059 ,-0.0268145 ,0.716451 ,0.697122 ,-2.25996e-009 ,0.707107 ,0.707107 ,-4.14468e-009 ,0.382683 ,0.92388 ,2.30261e-009 ,-1.46002e-007 ,1 ,-4.14468e-009 ,0.382683 ,0.92388 ,0.0160933 ,0.3902 ,0.92059 ,-0.0268145 ,-0.0136682 ,0.999547 ,2.30261e-009 ,-1.46002e-007 ,1 ,-0.0160934 ,0.3902 ,0.92059 ,-4.14468e-009 ,0.382683 ,0.92388 ,0.0268146 ,-0.0136683 ,0.999547 ,-0.70793 ,0.594509 ,-0.381305 ,0.670362 ,0.541335 ,-0.507515 ,-0.70793 ,0.594509 ,-0.381305 ,0.670362 ,0.541335 ,-0.507514 ,0.70793 ,0.59451 ,-0.381303 ,-0.670362 ,0.541335 ,-0.507514 ,0.70793 ,0.59451 ,-0.381304 ,-0.670361 ,0.541334 ,-0.507516 ,-0.708743 ,-0.61827 ,0.339744 ,-0.708743 ,-0.61827 ,0.339744 ,-0.708743 ,0.61827 ,-0.339744 ,-0.708743 ,0.61827 ,-0.339744 ,0.708743 ,-0.673878 ,0.20874 ,0.708743 ,-0.673878 ,0.20874 ,0.708743 ,0.673878 ,-0.20874 ,0.708743 ,0.673878 ,-0.20874 ,0.0894402 ,-0.370014 ,0.924711 ,0.00942199 ,-0.930546 ,-0.366054 ,0.06001 ,-0.38199 ,0.922216 ,0.0131886 ,-0.92375 ,-0.382769 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.0762166 ,-0.914406 ,-0.397558 ,-0.28081 ,-0.435437 ,0.855301 ,-0.0401044 ,-0.925064 ,-0.377688 ,0.312326 ,-0.415229 ,0.854422 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.0855202 ,0.355722 ,-0.930671 ,0.0612322 ,0.375123 ,-0.92495 ,0.267143 ,0.235642 ,-0.934402 ,-0.274 ,0.271408 ,-0.922638 ,0.133547 ,-0.666305 ,0.733623 ,-0.548622 ,-0.827957 ,0.116196 ,0.457961 ,0.46494 ,-0.757695 ,0.233189 ,-0.54171 ,-0.807572 ,-0.274001 ,0.271408 ,-0.922638 ,-0.494732 ,-0.161046 ,-0.853993 ,-0.231812 ,-0.184249 ,-0.955152 ,0.193617 ,-0.272868 ,-0.942367 ,-0.188679 ,-0.974436 ,-0.121963 ,-0.576313 ,-0.61934 ,0.533181 ,0.70793 ,0.594509 ,-0.381305 ,-0.670362 ,0.541335 ,-0.507515 ,0.707931 ,0.594509 ,-0.381305 ,-0.670362 ,0.541336 ,-0.507514 ,-0.70793 ,0.59451 ,-0.381303 ,0.670362 ,0.541336 ,-0.507514 ,-0.707931 ,0.594511 ,-0.381302 ,0.670362 ,0.541334 ,-0.507516 ,-0.708743 ,-0.61827 ,0.339744 ,-0.708743 ,0.61827 ,-0.339744 ,-0.708743 ,0.61827 ,-0.339744 ,-0.708743 ,-0.61827 ,0.339744 ,0.708743 ,-0.673878 ,0.20874 ,0.708743 ,0.673878 ,-0.20874 ,0.708743 ,0.673878 ,-0.20874 ,0.708743 ,-0.673878 ,0.20874 ,-0.06001 ,-0.38199 ,0.922216 ,-0.00942199 ,-0.930546 ,-0.366054 ,-0.0894402 ,-0.370014 ,0.924711 ,-0.0131886 ,-0.92375 ,-0.382769 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.0401044 ,-0.925064 ,-0.377688 ,0.28081 ,-0.435437 ,0.855301 ,-0.0762166 ,-0.914406 ,-0.397558 ,-0.312326 ,-0.415229 ,0.854422 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.0855202 ,0.355722 ,-0.930671 ,-0.0612322 ,0.375123 ,-0.92495 ,-0.267143 ,0.235642 ,-0.934402 ,0.274 ,0.271408 ,-0.922638 ,-0.133547 ,-0.666305 ,0.733623 ,0.548622 ,-0.827957 ,0.116196 ,0.186975 ,-0.485107 ,-0.854232 ,-0.457961 ,0.46494 ,-0.757695 ,0.274001 ,0.271408 ,-0.922638 ,0.248186 ,-0.814238 ,0.524805 ,-0.487613 ,-0.844835 ,0.220199 ,0.25682 ,-0.94664 ,0.194721 ,-0.486292 ,-0.74354 ,0.458987 ,0.231812 ,-0.184249 ,-0.955152 ,-0.520595 ,-0.523929 ,-0.674151 ,0.576313 ,-0.61934 ,0.533181 ,0.939238 ,0.325823 ,-0.108034 ,0.813652 ,0.52565 ,-0.24832 ,0.816155 ,0.232159 ,-0.529143 ,0.239686 ,0.870578 ,-0.429703 ,0.324995 ,0.656888 ,-0.68035 ,0.291336 ,-0.0357272 ,-0.955954 ,-0.105228 ,-0.274007 ,-0.955953 ,-0.728749 ,-0.127808 ,-0.672749 ,-0.881201 ,0.19708 ,-0.429703 ,-0.728749 ,-0.127808 ,-0.672749 ,-0.872154 ,-0.433832 ,-0.226135 ,-0.535068 ,-0.696867 ,-0.477577 ,-0.744618 ,-0.64261 ,-0.180545 ,0.916967 ,0.355773 ,0.180544 ,0.939238 ,0.325823 ,-0.108034 ,0.918921 ,-0.253505 ,0.302192 ,0.866496 ,0.145278 ,-0.477577 ,0.813652 ,0.52565 ,-0.24832 ,0.690656 ,0.723009 ,-0.0159115 ,0.207575 ,0.930372 ,-0.302192 ,0.535068 ,0.696867 ,0.477577 ,0.552068 ,0.0040742 ,0.833789 ,0.628819 ,0.621184 ,0.467673 ,0.0928835 ,0.117254 ,0.988749 ,0.318286 ,0.145295 ,0.936794 ,-0.444737 ,-0.020918 ,0.895417 ,0.0633831 ,0.149633 ,0.986708 ,-0.601371 ,-0.348276 ,0.719067 ,0.31529 ,-0.0385742 ,-0.948211 ,0.94112 ,-0.0267278 ,-0.337016 ,0.94303 ,-0.115957 ,0.311847 ,0.789343 ,0.500078 ,-0.356173 ,0.789344 ,-0.602826 ,0.116346 ,0.789344 ,-0.602824 ,0.116359 ,0.789343 ,0.500087 ,-0.356162 ,0.523212 ,0.829547 ,-0.195195 ,0.523215 ,-0.633626 ,0.569881 ,0.523215 ,-0.633639 ,0.569866 ,0.523212 ,0.829538 ,-0.195231 ,0.922972 ,0.290635 ,-0.252296 ,0.922976 ,-0.378847 ,0.0677481 ,0.922976 ,-0.378845 ,0.0677604 ,0.922972 ,0.290641 ,-0.252289 ,0.782824 ,0.5031 ,0.366165 ,0.78282 ,-0.286449 ,-0.552395 ,0.78282 ,-0.286443 ,-0.552398 ,0.782824 ,0.503106 ,0.366157 ,0.70711 ,0.0665175 ,0.703968 ,0.447212 ,-0.084136 ,-0.890462 ,0.316248 ,-0.331179 ,-0.888993 ,0.102879 ,-0.0614834 ,-0.992792 ,-0.70088 ,0.0659316 ,-0.710225 ,-0.32295 ,0.328498 ,-0.887577 ,0.292458 ,-0.529652 ,-0.796202 ,-4.66623e-006 ,-1.0141e-006 ,-1 ,0.0891725 ,-0.0537749 ,-0.994563 ,0.866023 ,-1.32003e-006 ,-0.500005 ,0.918952 ,0.00858595 ,-0.394276 ,0.826318 ,-0.00839817 ,0.563141 ,0.866025 ,-3.16448e-007 ,0.5 ,-1.00254e-005 ,1.41466e-006 ,1 ,-0.0946283 ,-0.125433 ,0.987579 ,1.00257e-005 ,2.35761e-006 ,-1 ,0.129765 ,-0.0735839 ,-0.988811 ,0.905328 ,0.00460623 ,-0.424688 ,0.866028 ,1.79772e-007 ,-0.499996 ,0.866028 ,-8.84776e-007 ,0.499996 ,0.808754 ,-0.0154015 ,0.587945 ,-0.0738988 ,-0.0784591 ,0.994175 ,4.6663e-006 ,-4.6599e-007 ,1 ,0.879377 ,0.0201332 ,-0.475699 ,0.112386 ,-0.237977 ,-0.964747 ,0.894525 ,-0.00938743 ,0.446918 ,0.11686 ,-0.235055 ,0.964932 ,0.880175 ,0.0212998 ,-0.474171 ,0.12447 ,-0.246876 ,-0.96102 ,0.892955 ,-0.00968217 ,0.450042 ,0.108324 ,-0.226708 ,0.96792 ,0.918026 ,0.0495232 ,-0.393415 ,0.446873 ,-0.377399 ,-0.811095 ,0.947177 ,0.00673765 ,0.320642 ,0.396054 ,-0.338033 ,0.853742 ,0.91865 ,0.0503137 ,-0.391855 ,0.44484 ,-0.375047 ,-0.8133 ,0.948395 ,0.00690704 ,0.317015 ,0.397279 ,-0.339077 ,0.852758 ,0.975209 ,0.0548359 ,-0.214384 ,0.875951 ,-0.246669 ,-0.414565 ,0.991488 ,0.0109271 ,0.129741 ,0.808012 ,-0.236965 ,0.539411 ,0.973924 ,0.0551524 ,-0.22007 ,0.867902 ,-0.253714 ,-0.427054 ,0.991738 ,0.0109112 ,0.127815 ,0.817742 ,-0.231552 ,0.526956 ,0.997571 ,0.0377368 ,-0.0585581 ,0.985273 ,-0.0471937 ,-0.164349 ,0.999658 ,0.00994681 ,0.0241745 ,0.985249 ,-0.0473536 ,0.164447 ,0.99757 ,0.0377302 ,-0.0585698 ,0.98524 ,-0.0472436 ,-0.164531 ,0.999658 ,0.00995068 ,0.0241815 ,0.985269 ,-0.0472916 ,0.164343 ,-1.2838e-007 ,-0.755826 ,0.654772 ,-2.92895e-005 ,-0.866321 ,0.499488 ,0.0275766 ,-0.00162034 ,0.999618 ,3.21231e-006 ,0.1889 ,0.981996 ,4.69657e-009 ,-0.944928 ,-0.327279 ,-6.88603e-006 ,-0.866223 ,-0.499657 ,-1.68692e-006 ,-0.189029 ,-0.981972 ,0.0276702 ,-0.000995389 ,-0.999617 ,5.58621e-008 ,-0.755996 ,0.654576 ,-2.87907e-005 ,-0.866386 ,0.499375 ,0.0276286 ,-0.00165941 ,0.999617 ,-4.21825e-006 ,0.189029 ,0.981972 ,1.04203e-007 ,-0.944883 ,-0.327407 ,-7.25485e-006 ,-0.866137 ,-0.499806 ,1.28528e-006 ,-0.1889 ,-0.981996 ,0.0276164 ,-0.00102617 ,-0.999618 ,1.12927e-008 ,6.50157e-009 ,1 ,-1.69391e-007 ,-1.05823e-008 ,1 ,0.00361003 ,-0.00208419 ,0.999991 ,0.00360995 ,-0.0020842 ,0.999991 ,0.866026 ,0.499994 ,0.00208422 ,0.866027 ,0.499994 ,0.0020842 ,0.866027 ,-0.499994 ,-0.00208421 ,0.866026 ,-0.499994 ,-0.0020842 ,0.00360994 ,0.0020842 ,-0.999991 ,0.00361 ,0.00208421 ,-0.999991 ,-1.69391e-007 ,2.06201e-008 ,-1 ,-1.84449e-008 ,4.5788e-009 ,-1 ,1.69393e-007 ,1.48484e-008 ,1 ,1.84453e-008 ,1.7754e-008 ,1 ,0.00361065 ,-0.00208479 ,0.999991 ,0.00361096 ,-0.00208475 ,0.999991 ,0.866025 ,0.499997 ,0.00208479 ,0.866027 ,0.499993 ,0.00208469 ,0.866027 ,-0.499994 ,-0.00208469 ,0.866029 ,-0.49999 ,-0.00208476 ,0.00361079 ,0.00208471 ,-0.999991 ,0.00361103 ,0.00208475 ,-0.999991 ,1.69393e-007 ,-2.21265e-008 ,-1 ,-1.12926e-008 ,4.78852e-010 ,-1 ,0.0309835 ,-0.997088 ,-0.0696812 ,0 ,-1 ,2.7732e-008 ,-0.0108945 ,-0.739935 ,0.67259 ,0 ,-0.703159 ,0.711033 ,0 ,-2.45688e-007 ,1 ,-0.0175992 ,-0.0783506 ,0.996771 ,-0.0107913 ,0.660187 ,0.751024 ,0 ,0.703159 ,0.711033 ,0 ,1 ,2.7732e-008 ,-0.0172861 ,0.995904 ,0.0887452 ,-0.0108943 ,0.739937 ,-0.672587 ,0 ,0.703159 ,-0.711033 ,-0.0108943 ,0.739937 ,-0.672587 ,0 ,0.703159 ,-0.711033 ,0 ,-2.45688e-007 ,-1 ,-0.0175992 ,0.0783489 ,-0.996771 ,-0.0107913 ,-0.660188 ,-0.751023 ,0 ,-0.703159 ,-0.711033 ,0.02268 ,-0.999695 ,-0.00972735 ,-0.0131054 ,-0.702347 ,0.711714 ,-0.0123839 ,-0.0122822 ,0.999848 ,-0.0131945 ,0.678228 ,0.734733 ,-0.0139963 ,0.999666 ,0.0217367 ,-0.0131051 ,0.70236 ,-0.711702 ,-0.0131051 ,0.70236 ,-0.711702 ,-0.0123841 ,0.0122729 ,-0.999848 ,-0.0131942 ,-0.678228 ,-0.734733 ,-6.97415e-008 ,-0.989097 ,0.147265 ,-6.38197e-008 ,-0.582508 ,0.812825 ,1.0664e-007 ,0.127 ,0.991903 ,1.18101e-007 ,0.780639 ,0.624982 ,1.48067e-007 ,0.989099 ,-0.147255 ,1.31391e-007 ,0.582515 ,-0.81282 ,1.31391e-007 ,0.582515 ,-0.81282 ,-0.0131051 ,0.70236 ,-0.711702 ,-0.0123841 ,0.0122729 ,-0.999848 ,1.31391e-007 ,0.582515 ,-0.81282 ,4.17275e-008 ,-0.127018 ,-0.9919 ,3.31578e-010 ,-0.780625 ,-0.625 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.416602 ,0.496175 ,0.761743 ,0.477287 ,-0.420094 ,0.771828 ,0.223493 ,-0.209701 ,0.951881 ,1 ,0 ,0 ,0.932779 ,0.222428 ,-0.283634 ,1 ,4.06969e-007 ,0 ,0.863405 ,0.221576 ,-0.45325 ,0.852282 ,-0.018877 ,-0.522742 ,0.388652 ,0.291897 ,-0.873925 ,0.721836 ,-0.225049 ,-0.654451 ,0.767734 ,0.249573 ,-0.590167 ,"NaN" ,"NaN" ,"NaN" ,-0.279512 ,0.0974885 ,0.95518 ,0.503966 ,0.0438818 ,0.862608 ,-0.390499 ,-0.34033 ,0.855387 ,0.64015 ,0.573225 ,0.511489 ,-0.849538 ,-0.0582332 ,0.524303 ,-0.849538 ,-0.0582332 ,0.524303 ,0.64015 ,0.573225 ,0.511489 ,0.405257 ,-0.18912 ,0.894427 ,-0.640768 ,0.299025 ,0.707107 ,1 ,3.6175e-007 ,0 ,0.924215 ,-0.11535 ,0.364034 ,0.807905 ,0.256146 ,0.530734 ,0.640763 ,0.365124 ,0.675357 ,0.585718 ,0.523408 ,0.618853 ,0.504819 ,-0.482379 ,0.715869 ,1 ,0 ,0 ,0.895725 ,0.105387 ,0.431939 ,0.828167 ,-0.421689 ,-0.369211 ,0.761859 ,0.362239 ,-0.536986 ,0.933587 ,0.332198 ,-0.13439 ,0.965093 ,-0.221524 ,0.139721 ,-4.41571e-008 ,-0.000739274 ,-1 ,-0.398332 ,-0.128825 ,-0.90815 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.00182102 ,-0.0031858 ,0.999993 ,-0.527237 ,0.347745 ,0.775303 ,-0.00182102 ,0.00294379 ,0.999994 ,-0.527237 ,0.347745 ,0.775303 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.396257 ,-0.135158 ,-0.908137 ,-4.41571e-008 ,-0.000739283 ,-1 ,-0.743548 ,0.597787 ,-0.299647 ,-0.913246 ,-0.183934 ,-0.363524 ,-0.912307 ,-0.181634 ,0.367023 ,-0.74672 ,0.596033 ,0.295219 ,0.00346926 ,0 ,-0.999994 ,0.0020255 ,0.00028907 ,-0.999998 ,-0.235084 ,-0.236129 ,-0.942857 ,-0.572751 ,0.579636 ,-0.579636 ,-0.578621 ,0.577727 ,0.575699 ,-0.232417 ,-0.236283 ,0.943479 ,0.00202193 ,0.000289124 ,0.999998 ,0 ,0 ,1 ,0.912307 ,0.181634 ,-0.367023 ,0.704999 ,0.709207 ,0.00123748 ,0.743548 ,-0.597787 ,0.299647 ,0.707111 ,-0.707098 ,-0.00245311 ,0.707107 ,-0.707107 ,0 ,0.74672 ,-0.596033 ,-0.295219 ,0.709224 ,0.704982 ,-0.00121562 ,0.913246 ,0.183934 ,0.363524 ,0.993768 ,-0.0510411 ,-0.0990954 ,1 ,0.000320418 ,-0.000178578 ,0.997967 ,-0.0575083 ,-0.0274738 ,0.983829 ,0.0357652 ,-0.175504 ,0.986428 ,-0.132236 ,-0.0973335 ,0.987276 ,-0.0419982 ,-0.153371 ,0.830543 ,0.556955 ,5.3044e-007 ,1 ,2.82445e-006 ,4.17337e-007 ,1 ,2.82445e-006 ,3.0242e-007 ,0.830543 ,0.556955 ,7.66993e-008 ,0.830543 ,0.556955 ,9.42898e-008 ,1 ,2.82445e-006 ,-8.24994e-008 ,0.842689 ,0.515139 ,-0.156549 ,1 ,1.11956e-006 ,-9.33318e-009 ,1 ,2.82445e-006 ,1.12938e-007 ,0.830543 ,0.556955 ,2.56588e-007 ,1 ,2.82445e-006 ,2.14406e-007 ,0.830543 ,0.556955 ,2.55668e-007 ,1 ,2.82445e-006 ,2.11961e-007 ,0.836059 ,0.54641 ,0.0494127 ,1 ,3.20177e-006 ,-6.11715e-008 ,0.871677 ,0.481457 ,-0.0915289 ,0.999712 ,0.0239317 ,-0.00190884 ,0.828268 ,0.547386 ,0.119753 ,0.872971 ,0.436329 ,-0.218035 ,1 ,-1.10043e-006 ,-1.03653e-007 ,0.918405 ,0.371684 ,-0.135586 ,0.99968 ,0.0251831 ,-0.00231334 ,0.985106 ,0.129444 ,-0.113186 ,0.997381 ,0.0652659 ,0.0311798 ,-0.918457 ,-0.315448 ,-0.238599 ,-0.992972 ,-0.00669359 ,-0.118159 ,-0.997847 ,-9.88911e-006 ,-0.0655852 ,-0.987458 ,0.0305527 ,-0.1549 ,-0.827203 ,-0.541779 ,-0.149033 ,-0.974722 ,-0.0296636 ,-0.221443 ,0.559844 ,0.828552 ,-0.00872992 ,0 ,1 ,6.25899e-007 ,0.705857 ,0.708126 ,-0.0179681 ,0.755065 ,0.655638 ,-0.00397675 ,0.655941 ,0.754803 ,0.00369162 ,0 ,1 ,-1.40878e-006 ,0.435118 ,0.900372 ,-0.00177606 ,-0.454661 ,0.890595 ,-0.0111495 ,-0.426285 ,0.901867 ,0.0701276 ,-0.503494 ,0.85856 ,-0.096789 ,0.509945 ,0.860207 ,-0.000731742 ,-0.520985 ,0.853565 ,-0.00134998 ,0.585422 ,0.810069 ,-0.0326849 ,-0.389117 ,0.916966 ,0.0880983 ,-0.0689144 ,0.992236 ,0.10353 ,-0.308362 ,0.951215 ,0.0101675 ,0.591386 ,0.806327 ,-0.0100185 ,-0.290726 ,0.956802 ,0.00298906 ,0.7694 ,0.638725 ,0.00736961 ,-0.226078 ,0.974109 ,-0.000388176 ,0.624699 ,0.446731 ,0.640455 ,-0.03811 ,0.99824 ,-0.0454488 ,0.777048 ,0.407267 ,0.479928 ,0.705857 ,0.708126 ,-0.0179681 ,0.764744 ,0.644321 ,0.00423865 ,0.736651 ,0.675801 ,0.0252549 ,0.559844 ,0.828552 ,-0.00872992 ,0.755065 ,0.655638 ,-0.00397675 ,0.788354 ,0.615221 ,0.00121186 ,0.655941 ,0.754803 ,0.00369162 ,0.812017 ,0.576844 ,-0.0887654 ,0.705293 ,0.708668 ,0.0187526 ,0.435118 ,0.900372 ,-0.00177606 ,0.455167 ,-0.89025 ,-0.0166657 ,0.991861 ,0.125333 ,0.0224383 ,0.999946 ,0.00724259 ,-0.00739581 ,0.447415 ,-0.889189 ,0.0957192 ,0.526887 ,-0.847916 ,-0.0585537 ,0.935437 ,-0.343431 ,0.0837416 ,0.660574 ,0.750674 ,0.011427 ,0.509945 ,0.860207 ,-0.000731742 ,0.52099 ,-0.853563 ,-0.00088898 ,0.948091 ,-0.317997 ,-0.00126181 ,0.719424 ,0.694413 ,0.0147913 ,0.585422 ,0.810069 ,-0.0326849 ,0.955489 ,-0.294937 ,-0.007325 ,0.424833 ,-0.899201 ,0.104665 ,0.920386 ,-0.390933 ,0.00777883 ,0.869582 ,0.464234 ,-0.168267 ,0.94728 ,0.262453 ,-0.183793 ,0.185208 ,-0.960441 ,0.20797 ,0.141208 ,-0.431379 ,0.891051 ,0.714563 ,-0.548679 ,0.433994 ,0.935886 ,0.322808 ,-0.141113 ,0.747349 ,0.508342 ,0.427853 ,0.917491 ,-0.397449 ,-0.0156682 ,0.308974 ,-0.951014 ,0.0103827 ,0.591386 ,0.806327 ,-0.0100185 ,0.892567 ,0.423954 ,-0.15358 ,0.83389 ,-0.550948 ,-0.0329179 ,0.290783 ,-0.956784 ,0.00300493 ,0.7694 ,0.638725 ,0.00736961 ,0.941521 ,0.312103 ,-0.127005 ,0.802496 ,-0.595792 ,-0.0321219 ,0.226079 ,-0.974109 ,-0.000594702 ,0.931115 ,0.220888 ,-0.290231 ,0.903328 ,-0.2491 ,-0.349211 ,0.526489 ,-0.759106 ,-0.382842 ,0.986428 ,-0.132236 ,-0.0973335 ,0.366856 ,-0.899308 ,-0.238038 ,0.562649 ,-0.714006 ,-0.416678 ,0.759812 ,-0.649985 ,0.0142999 ,-0.0689144 ,0.992236 ,0.10353 ,0.777048 ,0.407267 ,0.479928 ,-0.764698 ,-0.644374 ,0.00429268 ,-0.830543 ,-0.556955 ,0 ,-0.830543 ,-0.556955 ,0 ,-0.734963 ,-0.677684 ,0.0239707 ,-0.788351 ,-0.615225 ,0.00121686 ,-0.830543 ,-0.556955 ,0 ,-0.797353 ,-0.597315 ,-0.0862683 ,-0.800918 ,-0.580014 ,-0.14871 ,-0.830543 ,-0.556955 ,0 ,-0.704251 ,-0.709743 ,0.0172141 ,-0.830543 ,-0.556955 ,0 ,-0.660067 ,-0.751132 ,0.0106532 ,-0.831806 ,-0.552703 ,0.0511714 ,-0.718413 ,-0.695404 ,0.0171949 ,-0.856939 ,-0.506168 ,-0.097211 ,-0.824748 ,-0.547188 ,-0.142744 ,-0.52249 ,-0.812064 ,-0.259918 ,-0.694764 ,-0.68954 ,0.204545 ,-0.683381 ,-0.651398 ,-0.329653 ,-0.827203 ,-0.541779 ,-0.149033 ,-0.914563 ,-0.382999 ,-0.12995 ,-0.817866 ,-0.571446 ,0.0674227 ,-0.918457 ,-0.315448 ,-0.238599 ,-0.559876 ,-0.778808 ,-0.282839 ,-0.859345 ,-0.487561 ,-0.154304 ,-0.789697 ,-0.585238 ,-0.184052 ,-0.927622 ,-0.35229 ,-0.124132 ,-0.878387 ,-0.455547 ,-0.144613 ,-0.849184 ,-0.419916 ,-0.320245 ,-0.86283 ,-0.483343 ,-0.147997 ,0.99395 ,-0.048829 ,0.0983867 ,0.996382 ,-0.0178275 ,0.0830995 ,0.999537 ,0.0258919 ,0.0159835 ,0.999532 ,0.0213503 ,0.0219101 ,0.990986 ,-0.10809 ,0.0791359 ,0.999998 ,0.000779112 ,-0.0018566 ,0.999998 ,0.00216411 ,-0.000152172 ,0.995324 ,-0.0960751 ,-0.0100061 ,0.989423 ,-0.142164 ,-0.0288407 ,0.999983 ,0.00402042 ,0.00412583 ,0.99991 ,0.0025338 ,-0.0131592 ,0.983185 ,-0.160274 ,-0.0875146 ,0.996483 ,-0.0742679 ,-0.0388154 ,0.987345 ,-0.156908 ,-0.0230018 ,0.98616 ,-0.141079 ,-0.0870906 ,0.99404 ,-0.0925872 ,-0.0575508 ,0.972498 ,-0.214106 ,0.0916869 ,0.993912 ,-0.0889351 ,0.0650331 ,0.948091 ,-0.317997 ,-0.00126181 ,0.935437 ,-0.343431 ,0.0837416 ,0.955489 ,-0.294937 ,-0.007325 ,0.920386 ,-0.390933 ,0.00777883 ,0.714563 ,-0.548679 ,0.433994 ,0.838368 ,0.283993 ,0.465281 ,0 ,-0.697899 ,-0.716196 ,0 ,-0.850923 ,-0.52529 ,1.291e-008 ,-0.386953 ,0.922099 ,1.69318e-008 ,-0.189077 ,0.981962 ,0.960324 ,0.276512 ,0.0363171 ,1 ,3.54941e-006 ,-1.05268e-007 ,1 ,-6.66899e-007 ,-9.27443e-008 ,0.923116 ,0.382387 ,-0.0404567 ,0.995324 ,-0.0960751 ,-0.0100061 ,0.999998 ,0.00216411 ,-0.000152172 ,1 ,-2.412e-006 ,-3.98011e-007 ,0.992324 ,0.123604 ,-0.0038891 ,0.991861 ,0.125333 ,0.0224383 ,0.999946 ,0.00724259 ,-0.00739581 ,0.935437 ,-0.343431 ,0.0837416 ,0.735604 ,0.0550271 ,-0.675173 ,0.917491 ,-0.397449 ,-0.0156682 ,0.992324 ,0.123604 ,-0.0038891 ,1 ,-2.412e-006 ,-3.98011e-007 ,1 ,-1.36444e-006 ,-1.47892e-007 ,0.998542 ,-0.0465329 ,-0.0273508 ,1 ,2.15221e-008 ,-1.37849e-007 ,0.990722 ,-0.131809 ,-0.0331124 ,1 ,0.000320418 ,-0.000178578 ,0.993768 ,-0.0510411 ,-0.0990954 ,0.917491 ,-0.397449 ,-0.0156682 ,0.83389 ,-0.550948 ,-0.0329179 ,0.802496 ,-0.595792 ,-0.0321219 ,0.986428 ,-0.132236 ,-0.0973335 ,0.939238 ,0.325823 ,-0.108034 ,0.813652 ,0.52565 ,-0.24832 ,0.816155 ,0.232159 ,-0.529143 ,0.239686 ,0.870578 ,-0.429703 ,0.324995 ,0.656888 ,-0.68035 ,0.291336 ,-0.0357272 ,-0.955954 ,-0.105228 ,-0.274007 ,-0.955953 ,-0.728749 ,-0.127808 ,-0.672748 ,-0.881201 ,0.19708 ,-0.429703 ,-0.728749 ,-0.127808 ,-0.672748 ,-0.872154 ,-0.433832 ,-0.226135 ,-0.535068 ,-0.696867 ,-0.477577 ,-0.744618 ,-0.64261 ,-0.180545 ,0.916967 ,0.355773 ,0.180544 ,0.939238 ,0.325823 ,-0.108034 ,0.918921 ,-0.253505 ,0.302192 ,0.866496 ,0.145278 ,-0.477577 ,0.813652 ,0.52565 ,-0.24832 ,0.690656 ,0.723009 ,-0.0159115 ,0.207575 ,0.930372 ,-0.302192 ,0.535068 ,0.696867 ,0.477577 ,-6.40677e-006 ,0.514547 ,-0.857462 ,0.0807288 ,0.471967 ,-0.877912 ,0.85708 ,0.270946 ,-0.438181 ,0.913242 ,0.225221 ,-0.339506 ,0.813342 ,-0.301365 ,0.497648 ,0.857591 ,-0.254681 ,0.44685 ,-9.78097e-006 ,-0.514546 ,0.857463 ,-0.0888403 ,-0.601461 ,0.793948 ,9.78127e-006 ,0.514545 ,-0.857463 ,0.117052 ,0.454501 ,-0.883022 ,0.89894 ,0.235267 ,-0.369536 ,0.856911 ,0.274998 ,-0.43598 ,0.857494 ,-0.258752 ,0.444692 ,0.793899 ,-0.318942 ,0.517688 ,-0.068395 ,-0.569894 ,0.818867 ,6.40692e-006 ,-0.514552 ,0.857459 ,0.869955 ,0.274844 ,-0.409437 ,0.0833837 ,0.323442 ,-0.942567 ,0.882691 ,-0.249425 ,0.3983 ,0.0935362 ,-0.67495 ,0.731911 ,0.870708 ,0.27511 ,-0.407654 ,0.0933141 ,0.314358 ,-0.944707 ,0.881142 ,-0.250932 ,0.400776 ,0.0866726 ,-0.669291 ,0.737928 ,0.908848 ,0.259524 ,-0.32656 ,0.388306 ,0.11189 ,-0.914712 ,0.939037 ,-0.174607 ,0.296177 ,0.34626 ,-0.729264 ,0.590151 ,0.909424 ,0.259445 ,-0.325017 ,0.385592 ,0.115156 ,-0.915455 ,0.940484 ,-0.172305 ,0.292916 ,0.347915 ,-0.729789 ,0.588527 ,0.970804 ,0.170841 ,-0.168383 ,0.854899 ,-0.0129293 ,-0.518634 ,0.989894 ,-0.0651038 ,0.12598 ,0.78082 ,-0.508466 ,0.363018 ,0.969363 ,0.174109 ,-0.173266 ,0.845866 ,-0.0126986 ,-0.533244 ,0.990182 ,-0.0640605 ,0.124238 ,0.791492 ,-0.497549 ,0.354944 ,0.99692 ,0.0702108 ,-0.034947 ,0.982677 ,0.0422041 ,-0.180458 ,0.999622 ,-0.00489406 ,0.0270462 ,0.982659 ,-0.135147 ,0.126954 ,0.996919 ,0.0702115 ,-0.0349597 ,0.982639 ,0.0422481 ,-0.180652 ,0.999622 ,-0.0048911 ,0.0270597 ,0.982683 ,-0.135031 ,0.126888 ,-1.51613e-007 ,-0.981467 ,0.191634 ,-3.22793e-005 ,-0.999871 ,0.0160862 ,0.0326337 ,-0.500829 ,0.864931 ,4.47211e-006 ,-0.319155 ,0.947702 ,1.35144e-008 ,-0.685443 ,-0.728126 ,-1.11493e-005 ,-0.530129 ,-0.847917 ,-2.0258e-006 ,0.319005 ,-0.947753 ,0.0327689 ,0.497754 ,-0.866699 ,6.66766e-008 ,-0.981514 ,0.19139 ,-3.17014e-005 ,-0.999873 ,0.0159628 ,0.0326949 ,-0.500851 ,0.864916 ,-5.16401e-006 ,-0.319005 ,0.947753 ,1.34364e-007 ,-0.685337 ,-0.728227 ,-1.15957e-005 ,-0.529973 ,-0.848015 ,1.75534e-006 ,0.319155 ,-0.947702 ,0.0327056 ,0.497741 ,-0.866709 ,0.504819 ,-0.482379 ,0.715869 ,1 ,0 ,0 ,0.895725 ,0.105387 ,0.431939 ,0.828167 ,-0.421689 ,-0.369211 ,0.761859 ,0.362239 ,-0.536986 ,0.933587 ,0.332198 ,-0.13439 ,0.965093 ,-0.221524 ,0.139721 ,1.41488e-012 ,-0.000739274 ,-1 ,-0.398332 ,-0.128825 ,-0.908149 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.001821 ,-0.0031858 ,0.999993 ,-0.527237 ,0.347746 ,0.775303 ,-0.001821 ,0.00294379 ,0.999994 ,-0.527237 ,0.347746 ,0.775303 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.396257 ,-0.135158 ,-0.908137 ,1.41677e-012 ,-0.000739283 ,-1 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.418557 ,0.483631 ,0.768707 ,0.475756 ,-0.408175 ,0.779134 ,0.219572 ,-0.202719 ,0.954303 ,"NaN" ,"NaN" ,"NaN" ,0.932779 ,0.222428 ,-0.283634 ,1 ,4.06969e-007 ,0 ,0.854459 ,0.223354 ,-0.469054 ,0.84865 ,-0.0193075 ,-0.528602 ,0.37638 ,0.275498 ,-0.884556 ,0.704193 ,-0.216951 ,-0.676051 ,0.767734 ,0.249573 ,-0.590167 ,"NaN" ,"NaN" ,"NaN" ,-0.272343 ,0.093852 ,0.957612 ,0.490567 ,0.0421639 ,0.870383 ,-0.385401 ,-0.327366 ,0.862727 ,0.738592 ,0.346601 ,0.578229 ,-0.845857 ,-0.0583779 ,0.530205 ,-0.845857 ,-0.0583779 ,0.530205 ,0.738592 ,0.346601 ,0.578229 ,0.296538 ,-0.215382 ,0.930417 ,-0.640768 ,0.299025 ,0.707107 ,0.979704 ,0.0139322 ,0.199966 ,0.850743 ,-0.0976274 ,0.516436 ,0.798141 ,0.256996 ,0.544908 ,0.622361 ,0.351164 ,0.699536 ,0.658246 ,0.625319 ,0.419151 ,0.0309834 ,-0.997088 ,-0.0696804 ,0 ,-1 ,2.7732e-008 ,-0.0108945 ,-0.739936 ,0.672589 ,0 ,-0.703159 ,0.711033 ,0 ,0 ,1 ,-0.0175992 ,-0.0783502 ,0.996771 ,-0.0107912 ,0.660187 ,0.751024 ,0 ,0.703159 ,0.711033 ,0 ,1 ,2.7732e-008 ,-0.0172861 ,0.995904 ,0.0887456 ,-0.0108943 ,0.739937 ,-0.672588 ,0 ,0.703159 ,-0.711033 ,-0.0108943 ,0.739937 ,-0.672588 ,0 ,0.703159 ,-0.711033 ,0 ,0 ,-1 ,-0.0175992 ,0.0783492 ,-0.996771 ,-0.0107913 ,-0.660188 ,-0.751023 ,0 ,-0.703159 ,-0.711033 ,0.0226799 ,-0.999695 ,-0.00972728 ,-0.0131055 ,-0.702348 ,0.711713 ,-0.0123839 ,-0.0122817 ,0.999848 ,-0.0131944 ,0.678228 ,0.734733 ,-0.0139963 ,0.999666 ,0.0217368 ,-0.0131051 ,0.702359 ,-0.711702 ,-0.0131051 ,0.702359 ,-0.711702 ,-0.0123841 ,0.0122734 ,-0.999848 ,-0.0131943 ,-0.678228 ,-0.734733 ,-8.87697e-008 ,-0.989097 ,0.147264 ,-5.78237e-008 ,-0.582507 ,0.812825 ,1.0664e-007 ,0.127 ,0.991903 ,1.02832e-007 ,0.780639 ,0.624982 ,1.13872e-007 ,0.989098 ,-0.147255 ,1.25395e-007 ,0.582515 ,-0.81282 ,1.25395e-007 ,0.582515 ,-0.81282 ,-0.0131051 ,0.702359 ,-0.711702 ,-0.0123841 ,0.0122734 ,-0.999848 ,1.25395e-007 ,0.582515 ,-0.81282 ,4.17274e-008 ,-0.127018 ,-0.9919 ,3.08643e-008 ,-0.780626 ,-0.624998 ,-0.816155 ,0.232159 ,-0.529143 ,-0.813652 ,0.52565 ,-0.24832 ,-0.939238 ,0.325823 ,-0.108034 ,-0.239686 ,0.870578 ,-0.429703 ,0.105228 ,-0.274007 ,-0.955953 ,-0.291336 ,-0.0357272 ,-0.955954 ,-0.324995 ,0.656888 ,-0.68035 ,0.728749 ,-0.127808 ,-0.672749 ,0.872154 ,-0.433832 ,-0.226135 ,0.728749 ,-0.127808 ,-0.672749 ,0.881201 ,0.19708 ,-0.429703 ,0.744618 ,-0.64261 ,-0.180545 ,0.535068 ,-0.696867 ,-0.477577 ,-0.918921 ,-0.253505 ,0.302192 ,-0.939238 ,0.325823 ,-0.108034 ,-0.916967 ,0.355773 ,0.180544 ,-0.866495 ,0.145278 ,-0.477577 ,-0.207575 ,0.930372 ,-0.302192 ,-0.690656 ,0.723009 ,-0.0159115 ,-0.813652 ,0.52565 ,-0.24832 ,-0.535068 ,0.696867 ,0.477577 ,0.0928836 ,-0.117254 ,-0.988749 ,0.628819 ,-0.621184 ,-0.467673 ,0.548789 ,0.0444676 ,-0.834777 ,0.318286 ,-0.145295 ,-0.936794 ,-0.445819 ,-0.0053511 ,-0.895107 ,-0.736061 ,0.0328791 ,-0.676116 ,0.0633831 ,-0.149633 ,-0.986708 ,-0.94303 ,0.0365785 ,-0.330692 ,-0.316228 ,-0.115304 ,-0.94165 ,-0.5547 ,0.101129 ,0.825882 ,-0.94303 ,-0.115957 ,0.311847 ,-0.789343 ,0.500078 ,-0.356173 ,-0.789344 ,-0.602826 ,0.116346 ,-0.523212 ,0.829547 ,-0.195195 ,-0.789343 ,0.500087 ,-0.356162 ,-0.789344 ,-0.602824 ,0.116359 ,-0.523215 ,-0.633626 ,0.569881 ,-0.922972 ,0.290635 ,-0.252296 ,-0.523212 ,0.829538 ,-0.195231 ,-0.523215 ,-0.633639 ,0.569866 ,-0.922976 ,-0.378847 ,0.067748 ,-0.782824 ,0.5031 ,0.366166 ,-0.922972 ,0.290641 ,-0.252289 ,-0.922976 ,-0.378845 ,0.0677604 ,-0.706113 ,0.0135666 ,0.707969 ,-0.782824 ,0.503106 ,0.366157 ,0.313626 ,-0.0127064 ,0.949462 ,0.894872 ,0.278856 ,0.348488 ,0.316248 ,0.331179 ,0.888993 ,0.102879 ,0.0614834 ,0.992792 ,0.292459 ,0.529652 ,0.796202 ,-0.32295 ,-0.328498 ,0.887577 ,-0.866023 ,-1.31114e-006 ,-0.500005 ,-0.0891725 ,-0.0537749 ,-0.994563 ,4.66623e-006 ,-1.0141e-006 ,-1 ,-0.918952 ,0.00858596 ,-0.394276 ,-0.826318 ,-0.00839808 ,0.563141 ,-0.866025 ,-3.16448e-007 ,0.5 ,1.00254e-005 ,1.64624e-006 ,1 ,0.0946284 ,-0.125433 ,0.987579 ,-0.905328 ,0.00460619 ,-0.424688 ,-0.129765 ,-0.073584 ,-0.988811 ,-1.00257e-005 ,2.25984e-006 ,-1 ,-0.866028 ,1.79772e-007 ,-0.499996 ,-0.866028 ,-8.55446e-007 ,0.499996 ,-0.808754 ,-0.0154015 ,0.587945 ,0.0738988 ,-0.0784591 ,0.994175 ,-4.6663e-006 ,-4.6599e-007 ,1 ,-0.879377 ,0.0201331 ,-0.475699 ,-0.112386 ,-0.237977 ,-0.964747 ,-0.894525 ,-0.00938743 ,0.446918 ,-0.11686 ,-0.235055 ,0.964932 ,-0.880175 ,0.0212998 ,-0.474171 ,-0.12447 ,-0.246876 ,-0.96102 ,-0.892955 ,-0.00968219 ,0.450042 ,-0.108324 ,-0.226708 ,0.96792 ,-0.918026 ,0.0495232 ,-0.393416 ,-0.446873 ,-0.377399 ,-0.811095 ,-0.947177 ,0.00673766 ,0.320642 ,-0.396054 ,-0.338033 ,0.853742 ,-0.91865 ,0.0503137 ,-0.391855 ,-0.44484 ,-0.375047 ,-0.8133 ,-0.948395 ,0.00690703 ,0.317015 ,-0.397279 ,-0.339077 ,0.852758 ,-0.975209 ,0.0548359 ,-0.214384 ,-0.875951 ,-0.246669 ,-0.414565 ,-0.991488 ,0.0109271 ,0.129741 ,-0.808012 ,-0.236965 ,0.539411 ,-0.973924 ,0.0551524 ,-0.22007 ,-0.867902 ,-0.253714 ,-0.427054 ,-0.991738 ,0.0109112 ,0.127815 ,-0.817742 ,-0.231552 ,0.526956 ,-0.997571 ,0.0377368 ,-0.0585581 ,-0.985273 ,-0.0471937 ,-0.164349 ,-0.999658 ,0.00994682 ,0.0241745 ,-0.985249 ,-0.0473536 ,0.164447 ,-0.99757 ,0.0377302 ,-0.0585698 ,-0.98524 ,-0.0472436 ,-0.164531 ,-0.999658 ,0.00995069 ,0.0241815 ,-0.985269 ,-0.0472916 ,0.164343 ,-0.0275766 ,-0.00162034 ,0.999618 ,2.92895e-005 ,-0.866321 ,0.499488 ,1.2838e-007 ,-0.755826 ,0.654773 ,-3.21231e-006 ,0.1889 ,0.981996 ,6.88579e-006 ,-0.866223 ,-0.499657 ,-4.69657e-009 ,-0.944928 ,-0.327279 ,-0.0276702 ,-0.000995389 ,-0.999617 ,1.68692e-006 ,-0.189029 ,-0.981972 ,-0.0276286 ,-0.00165941 ,0.999617 ,2.87907e-005 ,-0.866386 ,0.499375 ,-5.58621e-008 ,-0.755996 ,0.654576 ,4.21825e-006 ,0.189029 ,0.981972 ,7.25438e-006 ,-0.866137 ,-0.499806 ,-1.04203e-007 ,-0.944883 ,-0.327407 ,-0.0276164 ,-0.00102617 ,-0.999618 ,-1.28528e-006 ,-0.1889 ,-0.981996 ,-0.00361003 ,-0.00208419 ,0.999991 ,1.69391e-007 ,-1.04569e-008 ,1 ,-1.12927e-008 ,6.50157e-009 ,1 ,-0.00360995 ,-0.0020842 ,0.999991 ,-0.866027 ,-0.499994 ,-0.00208421 ,-0.866027 ,0.499994 ,0.0020842 ,-0.866026 ,0.499994 ,0.00208422 ,-0.866026 ,-0.499994 ,-0.0020842 ,1.69391e-007 ,2.03692e-008 ,-1 ,-0.00361 ,0.00208421 ,-0.999991 ,-0.00360994 ,0.0020842 ,-0.999991 ,1.84449e-008 ,5.33166e-009 ,-1 ,-0.00361065 ,-0.00208479 ,0.999991 ,-1.84453e-008 ,1.81304e-008 ,1 ,-1.69393e-007 ,1.49739e-008 ,1 ,-0.00361096 ,-0.00208475 ,0.999991 ,-0.866027 ,-0.499994 ,-0.00208469 ,-0.866027 ,0.499993 ,0.00208469 ,-0.866025 ,0.499997 ,0.00208479 ,-0.866029 ,-0.49999 ,-0.00208476 ,-1.69393e-007 ,-2.13737e-008 ,-1 ,-0.00361103 ,0.00208475 ,-0.999991 ,-0.00361079 ,0.00208471 ,-0.999991 ,1.12926e-008 ,2.73737e-009 ,-1 ,0.0108945 ,-0.739935 ,0.67259 ,0 ,-1 ,2.7732e-008 ,-0.0309835 ,-0.997088 ,-0.0696812 ,0 ,-0.703159 ,0.711033 ,0 ,-2.45688e-007 ,1 ,0.0175992 ,-0.0783506 ,0.996771 ,0.0107912 ,0.660187 ,0.751024 ,0 ,0.703159 ,0.711033 ,0 ,1 ,2.7732e-008 ,0.0172861 ,0.995904 ,0.0887452 ,0.0108943 ,0.739937 ,-0.672587 ,0 ,0.703159 ,-0.711033 ,0 ,-2.45688e-007 ,-1 ,0 ,0.703159 ,-0.711033 ,0.0108943 ,0.739937 ,-0.672587 ,0.0175992 ,0.0783489 ,-0.996771 ,0.0107913 ,-0.660188 ,-0.751023 ,0 ,-0.703159 ,-0.711033 ,-0.02268 ,-0.999695 ,-0.00972736 ,0.0131054 ,-0.702347 ,0.711714 ,0.0123839 ,-0.0122822 ,0.999848 ,0.0131945 ,0.678228 ,0.734733 ,0.0139963 ,0.999666 ,0.0217367 ,0.0131051 ,0.70236 ,-0.711702 ,0.0131051 ,0.70236 ,-0.711702 ,0.0123841 ,0.0122729 ,-0.999848 ,0.0131942 ,-0.678228 ,-0.734733 ,6.97414e-008 ,-0.989097 ,0.147265 ,6.38197e-008 ,-0.582508 ,0.812825 ,-1.0664e-007 ,0.127 ,0.991903 ,-1.18101e-007 ,0.780639 ,0.624982 ,-1.48067e-007 ,0.989099 ,-0.147255 ,-1.31391e-007 ,0.582515 ,-0.81282 ,0.0123841 ,0.0122729 ,-0.999848 ,0.0131051 ,0.70236 ,-0.711702 ,-1.31391e-007 ,0.582515 ,-0.81282 ,-4.17275e-008 ,-0.127018 ,-0.9919 ,-1.31391e-007 ,0.582515 ,-0.81282 ,-3.31578e-010 ,-0.780625 ,-0.625 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.223493 ,-0.209701 ,0.951881 ,-0.477287 ,-0.420093 ,0.771828 ,0.416602 ,0.496176 ,0.761743 ,-1 ,3.6175e-007 ,0 ,"NaN" ,"NaN" ,"NaN" ,-0.852282 ,-0.0188769 ,-0.522742 ,-0.863405 ,0.221576 ,-0.45325 ,-0.669139 ,-0.0876216 ,-0.737954 ,-0.341422 ,0.0993401 ,-0.934646 ,-0.767734 ,0.249573 ,-0.590167 ,0.477286 ,0.420094 ,-0.771828 ,-0.389556 ,-0.622092 ,-0.679152 ,0.389554 ,0.622093 ,0.679152 ,-0.279512 ,-0.0974885 ,-0.95518 ,0.223492 ,0.209701 ,-0.951881 ,-0.416603 ,-0.496174 ,-0.761743 ,0.47017 ,-0.156362 ,-0.868614 ,0.64015 ,-0.573225 ,-0.511489 ,-0.390499 ,0.34033 ,-0.855387 ,-0.849538 ,0.0582332 ,-0.524303 ,0.405257 ,0.18912 ,-0.894427 ,0.64015 ,-0.573225 ,-0.511489 ,-0.849538 ,0.0582332 ,-0.524303 ,-0.640768 ,-0.299025 ,-0.707107 ,-1 ,0 ,0 ,-0.983625 ,0.119978 ,0.134487 ,-1 ,4.06969e-007 ,0 ,-0.807905 ,0.256146 ,0.530734 ,-0.924215 ,-0.11535 ,0.364034 ,-0.640763 ,0.365124 ,0.675357 ,-0.549804 ,-0.178005 ,0.816106 ,-0.585718 ,0.523408 ,0.618853 ,-0.895725 ,0.105387 ,0.431939 ,-1 ,0 ,0 ,-0.504819 ,-0.482379 ,0.715869 ,-0.828167 ,-0.421689 ,-0.369211 ,-0.761859 ,0.362239 ,-0.536986 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.398332 ,0.128825 ,0.90815 ,-4.41571e-008 ,0.000739282 ,1 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.00182102 ,0.0031858 ,-0.999993 ,-0.527237 ,-0.347745 ,-0.775303 ,-0.132834 ,-0.323941 ,-0.936706 ,-0.527237 ,-0.347745 ,-0.775303 ,-0.00182102 ,-0.00294379 ,-0.999994 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.396257 ,0.135158 ,0.908137 ,-0.154807 ,0.491034 ,0.857275 ,-4.41571e-008 ,0.000739274 ,1 ,0.912307 ,-0.181634 ,0.367023 ,0.913246 ,-0.183934 ,-0.363524 ,0.743548 ,0.597787 ,-0.299647 ,0.74672 ,0.596033 ,0.295219 ,0.235084 ,-0.236129 ,-0.942857 ,-0.0020255 ,0.00028907 ,-0.999998 ,-0.00346926 ,0 ,-0.999994 ,0.572751 ,0.579636 ,-0.579636 ,-0.00202193 ,0.000289124 ,0.999998 ,0.232417 ,-0.236283 ,0.943479 ,0.578621 ,0.577727 ,0.575699 ,0 ,0 ,1 ,-0.743548 ,-0.597787 ,0.299647 ,-0.704999 ,0.709207 ,0.00123748 ,-0.912307 ,0.181634 ,-0.367023 ,-0.707111 ,-0.707098 ,-0.00245311 ,-0.709224 ,0.704982 ,-0.00121562 ,-0.74672 ,-0.596033 ,-0.295219 ,-0.707107 ,-0.707107 ,0 ,-0.913246 ,0.183934 ,0.363524 ,-0.997967 ,-0.0575083 ,-0.0274738 ,-1 ,0.000320415 ,-0.000178581 ,-0.993768 ,-0.0510411 ,-0.0990954 ,-0.983829 ,0.0357652 ,-0.175504 ,-0.986428 ,-0.132236 ,-0.0973335 ,-0.987276 ,-0.0419982 ,-0.153371 ,-1 ,2.82445e-006 ,3.04293e-007 ,-1 ,2.82445e-006 ,4.24779e-007 ,-0.830543 ,0.556955 ,5.39665e-007 ,-0.830543 ,0.556955 ,7.68321e-008 ,-1 ,2.82445e-006 ,-8.40155e-008 ,-0.830543 ,0.556955 ,1.058e-007 ,-1 ,1.11515e-006 ,-1.78259e-008 ,-0.842689 ,0.515139 ,-0.156549 ,-1 ,2.82445e-006 ,1.14856e-007 ,-0.830543 ,0.556955 ,2.5815e-007 ,-1 ,2.82445e-006 ,2.12345e-007 ,-0.830543 ,0.556955 ,2.55209e-007 ,-1 ,2.82445e-006 ,2.09363e-007 ,-0.836059 ,0.54641 ,0.0494127 ,-1 ,3.20275e-006 ,-5.23691e-008 ,-0.871677 ,0.481457 ,-0.0915289 ,-0.999712 ,0.0239317 ,-0.00190882 ,-0.828268 ,0.547386 ,0.119753 ,-1 ,-1.10117e-006 ,-1.05688e-007 ,-0.872971 ,0.436329 ,-0.218035 ,-0.99968 ,0.0251831 ,-0.00231335 ,-0.918405 ,0.371684 ,-0.135586 ,-0.997381 ,0.0652659 ,0.0311798 ,-0.985106 ,0.129444 ,-0.113186 ,0.997847 ,-9.89625e-006 ,-0.0655852 ,0.992972 ,-0.00669359 ,-0.118159 ,0.918457 ,-0.315448 ,-0.238599 ,0.987458 ,0.0305527 ,-0.1549 ,0.974722 ,-0.0296636 ,-0.221443 ,0.827203 ,-0.541779 ,-0.149033 ,-0.705857 ,0.708126 ,-0.0179683 ,0 ,1 ,1.28542e-006 ,-0.559844 ,0.828552 ,-0.00872875 ,-0.755065 ,0.655638 ,-0.00397711 ,-0.655941 ,0.754803 ,0.00369167 ,0 ,1 ,-1.45679e-006 ,0.454661 ,0.890595 ,-0.0111479 ,-0.435118 ,0.900372 ,-0.00177599 ,0.426285 ,0.901867 ,0.0701275 ,0.503495 ,0.85856 ,-0.0967891 ,0.520985 ,0.853565 ,-0.00135007 ,-0.509945 ,0.860207 ,-0.000731756 ,0.389117 ,0.916966 ,0.0880983 ,-0.585422 ,0.810069 ,-0.0326849 ,0.0689144 ,0.992236 ,0.10353 ,0.308362 ,0.951215 ,0.0101676 ,-0.591386 ,0.806327 ,-0.0100184 ,0.290726 ,0.956802 ,0.00298917 ,-0.7694 ,0.638725 ,0.00736961 ,0.226078 ,0.974109 ,-0.000388153 ,-0.624699 ,0.446731 ,0.640455 ,0.03811 ,0.99824 ,-0.0454488 ,-0.777048 ,0.407267 ,0.479928 ,-0.736651 ,0.675801 ,0.0252549 ,-0.764744 ,0.644321 ,0.00423862 ,-0.705857 ,0.708126 ,-0.0179683 ,-0.559844 ,0.828552 ,-0.00872875 ,-0.788354 ,0.615221 ,0.00121186 ,-0.755065 ,0.655638 ,-0.00397711 ,-0.812017 ,0.576844 ,-0.0887654 ,-0.655941 ,0.754803 ,0.00369167 ,-0.705293 ,0.708668 ,0.0187526 ,-0.435118 ,0.900372 ,-0.00177599 ,-0.999946 ,0.00724259 ,-0.00739581 ,-0.991861 ,0.125333 ,0.0224383 ,-0.455167 ,-0.89025 ,-0.0166657 ,-0.447415 ,-0.889189 ,0.0957192 ,-0.935437 ,-0.343431 ,0.0837416 ,-0.526887 ,-0.847916 ,-0.0585537 ,-0.660574 ,0.750674 ,0.011427 ,-0.509945 ,0.860207 ,-0.000731756 ,-0.52099 ,-0.853563 ,-0.000889001 ,-0.948091 ,-0.317997 ,-0.00126181 ,-0.719424 ,0.694413 ,0.0147913 ,-0.585422 ,0.810069 ,-0.0326849 ,-0.955489 ,-0.294937 ,-0.00732502 ,-0.424833 ,-0.899201 ,0.104665 ,-0.920386 ,-0.390933 ,0.00777882 ,-0.869582 ,0.464234 ,-0.168267 ,-0.94728 ,0.262453 ,-0.183793 ,-0.185208 ,-0.960441 ,0.20797 ,-0.714563 ,-0.548679 ,0.433994 ,-0.141208 ,-0.431379 ,0.891051 ,-0.935886 ,0.322808 ,-0.141113 ,-0.747349 ,0.508342 ,0.427853 ,-0.917491 ,-0.397449 ,-0.0156682 ,-0.308974 ,-0.951014 ,0.0103827 ,-0.892567 ,0.423954 ,-0.15358 ,-0.591386 ,0.806327 ,-0.0100184 ,-0.83389 ,-0.550948 ,-0.0329179 ,-0.290783 ,-0.956784 ,0.00300491 ,-0.941521 ,0.312103 ,-0.127005 ,-0.7694 ,0.638725 ,0.00736961 ,-0.802496 ,-0.595792 ,-0.0321219 ,-0.226079 ,-0.974109 ,-0.00059471 ,-0.903328 ,-0.2491 ,-0.349211 ,-0.931115 ,0.220888 ,-0.290231 ,-0.986428 ,-0.132236 ,-0.0973335 ,-0.526489 ,-0.759106 ,-0.382842 ,-0.366856 ,-0.899308 ,-0.238038 ,-0.759812 ,-0.649985 ,0.0142999 ,-0.562649 ,-0.714006 ,-0.416678 ,-0.777048 ,0.407267 ,0.479928 ,0.0689144 ,0.992236 ,0.10353 ,0.830543 ,-0.556955 ,0 ,0.830543 ,-0.556955 ,0 ,0.764698 ,-0.644374 ,0.00429268 ,0.734963 ,-0.677684 ,0.0239707 ,0.830543 ,-0.556955 ,0 ,0.788351 ,-0.615225 ,0.00121686 ,0.800918 ,-0.580014 ,-0.14871 ,0.797353 ,-0.597315 ,-0.0862683 ,0.830543 ,-0.556955 ,0 ,0.704251 ,-0.709743 ,0.0172141 ,0.830543 ,-0.556955 ,0 ,0.660067 ,-0.751132 ,0.0106532 ,0.831806 ,-0.552703 ,0.0511714 ,0.718413 ,-0.695404 ,0.0171949 ,0.856939 ,-0.506168 ,-0.097211 ,0.824748 ,-0.547188 ,-0.142744 ,0.683381 ,-0.651398 ,-0.329653 ,0.694764 ,-0.68954 ,0.204545 ,0.52249 ,-0.812064 ,-0.259918 ,0.827203 ,-0.541779 ,-0.149033 ,0.914563 ,-0.382999 ,-0.12995 ,0.817866 ,-0.571446 ,0.0674227 ,0.559876 ,-0.778808 ,-0.282839 ,0.918457 ,-0.315448 ,-0.238599 ,0.789697 ,-0.585238 ,-0.184052 ,0.859345 ,-0.487561 ,-0.154304 ,0.878387 ,-0.455547 ,-0.144613 ,0.927622 ,-0.35229 ,-0.124132 ,0.862831 ,-0.483343 ,-0.147997 ,0.849184 ,-0.419916 ,-0.320245 ,-0.999537 ,0.0258918 ,0.0159835 ,-0.996382 ,-0.0178275 ,0.0830995 ,-0.99395 ,-0.048829 ,0.0983867 ,-0.999532 ,0.0213503 ,0.0219101 ,-0.999998 ,0.00216411 ,-0.000152182 ,-0.999998 ,0.000779111 ,-0.0018566 ,-0.990986 ,-0.10809 ,0.0791359 ,-0.995324 ,-0.0960751 ,-0.0100061 ,-0.99991 ,0.00253381 ,-0.0131592 ,-0.999983 ,0.00402038 ,0.00412579 ,-0.989423 ,-0.142164 ,-0.0288407 ,-0.983185 ,-0.160274 ,-0.0875146 ,-0.98616 ,-0.141079 ,-0.0870906 ,-0.987345 ,-0.156908 ,-0.0230018 ,-0.996483 ,-0.0742679 ,-0.0388154 ,-0.99404 ,-0.0925872 ,-0.0575508 ,-0.993912 ,-0.0889351 ,0.0650331 ,-0.972498 ,-0.214106 ,0.0916869 ,-0.948091 ,-0.317997 ,-0.00126181 ,-0.935437 ,-0.343431 ,0.0837416 ,-0.955489 ,-0.294937 ,-0.00732502 ,-0.920386 ,-0.390933 ,0.00777882 ,-0.714563 ,-0.548679 ,0.433994 ,-0.838368 ,0.283993 ,0.465281 ,0 ,0.386953 ,-0.922099 ,0 ,0.850923 ,0.52529 ,0 ,0.697899 ,0.716196 ,0 ,0.189077 ,-0.981962 ,-1 ,-6.58949e-007 ,-6.57428e-008 ,-1 ,3.53699e-006 ,-9.18438e-008 ,-0.960324 ,0.276512 ,0.0363171 ,-0.923116 ,0.382387 ,-0.0404567 ,-0.999998 ,0.00216411 ,-0.000152182 ,-0.995324 ,-0.0960751 ,-0.0100061 ,-1 ,-2.40393e-006 ,-3.88114e-007 ,-0.992324 ,0.123604 ,-0.0038891 ,-0.991861 ,0.125333 ,0.0224383 ,-0.999946 ,0.00724259 ,-0.00739581 ,-0.935437 ,-0.343431 ,0.0837416 ,-0.735604 ,0.0550272 ,-0.675173 ,-0.917491 ,-0.397449 ,-0.0156682 ,-1 ,-1.36153e-006 ,-1.27821e-007 ,-1 ,-2.40393e-006 ,-3.88114e-007 ,-0.992324 ,0.123604 ,-0.0038891 ,-0.998542 ,-0.0465329 ,-0.0273508 ,-1 ,2.0732e-008 ,-1.32789e-007 ,-0.990722 ,-0.131809 ,-0.0331123 ,-1 ,0.000320415 ,-0.000178581 ,-0.993768 ,-0.0510411 ,-0.0990954 ,-0.917491 ,-0.397449 ,-0.0156682 ,-0.83389 ,-0.550948 ,-0.0329179 ,-0.802496 ,-0.595792 ,-0.0321219 ,-0.986428 ,-0.132236 ,-0.0973335 ,-0.816155 ,0.232159 ,-0.529143 ,-0.813652 ,0.52565 ,-0.24832 ,-0.939238 ,0.325823 ,-0.108034 ,-0.239686 ,0.870578 ,-0.429703 ,0.105228 ,-0.274007 ,-0.955953 ,-0.291336 ,-0.0357272 ,-0.955954 ,-0.324995 ,0.656888 ,-0.68035 ,0.728749 ,-0.127808 ,-0.672749 ,0.872154 ,-0.433832 ,-0.226135 ,0.728749 ,-0.127808 ,-0.672749 ,0.881201 ,0.19708 ,-0.429703 ,0.744618 ,-0.64261 ,-0.180545 ,0.535068 ,-0.696867 ,-0.477577 ,-0.918921 ,-0.253505 ,0.302192 ,-0.939238 ,0.325823 ,-0.108034 ,-0.916967 ,0.355773 ,0.180544 ,-0.866495 ,0.145278 ,-0.477577 ,-0.207575 ,0.930372 ,-0.302192 ,-0.690656 ,0.723009 ,-0.0159115 ,-0.813652 ,0.52565 ,-0.24832 ,-0.535068 ,0.696867 ,0.477577 ,-0.85708 ,0.270946 ,-0.438181 ,-0.0807288 ,0.471967 ,-0.877912 ,6.40677e-006 ,0.514547 ,-0.857462 ,-0.913242 ,0.225221 ,-0.339506 ,-0.813342 ,-0.301365 ,0.497648 ,-0.857591 ,-0.254681 ,0.44685 ,9.78097e-006 ,-0.514546 ,0.857463 ,0.0888402 ,-0.601461 ,0.793947 ,-0.89894 ,0.235268 ,-0.369536 ,-0.117052 ,0.454501 ,-0.883022 ,-9.78127e-006 ,0.514545 ,-0.857463 ,-0.856911 ,0.274998 ,-0.43598 ,-0.857494 ,-0.258752 ,0.444691 ,-0.793899 ,-0.318942 ,0.517688 ,0.068395 ,-0.569894 ,0.818867 ,-6.40692e-006 ,-0.514552 ,0.857459 ,-0.869955 ,0.274844 ,-0.409437 ,-0.0833837 ,0.323442 ,-0.942567 ,-0.882691 ,-0.249425 ,0.3983 ,-0.0935362 ,-0.67495 ,0.731911 ,-0.870708 ,0.27511 ,-0.407654 ,-0.0933141 ,0.314358 ,-0.944707 ,-0.881142 ,-0.250932 ,0.400776 ,-0.0866726 ,-0.669291 ,0.737928 ,-0.908848 ,0.259524 ,-0.32656 ,-0.388306 ,0.11189 ,-0.914712 ,-0.939037 ,-0.174607 ,0.296177 ,-0.34626 ,-0.729264 ,0.590151 ,-0.909424 ,0.259445 ,-0.325017 ,-0.385592 ,0.115156 ,-0.915455 ,-0.940484 ,-0.172305 ,0.292916 ,-0.347915 ,-0.729789 ,0.588527 ,-0.970804 ,0.170841 ,-0.168383 ,-0.854899 ,-0.0129293 ,-0.518634 ,-0.989894 ,-0.0651038 ,0.12598 ,-0.78082 ,-0.508466 ,0.363018 ,-0.969363 ,0.174109 ,-0.173266 ,-0.845866 ,-0.0126986 ,-0.533244 ,-0.990182 ,-0.0640605 ,0.124238 ,-0.791492 ,-0.497549 ,0.354944 ,-0.99692 ,0.0702108 ,-0.034947 ,-0.982677 ,0.0422041 ,-0.180458 ,-0.999622 ,-0.00489406 ,0.0270462 ,-0.982659 ,-0.135147 ,0.126954 ,-0.996919 ,0.0702115 ,-0.0349597 ,-0.982639 ,0.0422481 ,-0.180652 ,-0.999622 ,-0.0048911 ,0.0270598 ,-0.982683 ,-0.135031 ,0.126888 ,-0.0326337 ,-0.500829 ,0.864931 ,3.22793e-005 ,-0.999871 ,0.0160862 ,1.51613e-007 ,-0.981467 ,0.191634 ,-4.47211e-006 ,-0.319155 ,0.947702 ,1.11493e-005 ,-0.530129 ,-0.847917 ,-1.35144e-008 ,-0.685443 ,-0.728126 ,-0.0327689 ,0.497754 ,-0.866699 ,2.0258e-006 ,0.319005 ,-0.947753 ,-0.0326949 ,-0.500851 ,0.864916 ,3.17023e-005 ,-0.999873 ,0.0159628 ,-6.66766e-008 ,-0.981514 ,0.19139 ,5.16401e-006 ,-0.319005 ,0.947753 ,1.15952e-005 ,-0.529973 ,-0.848015 ,-1.34364e-007 ,-0.685337 ,-0.728227 ,-0.0327056 ,0.497741 ,-0.866709 ,-1.75534e-006 ,0.319155 ,-0.947702 ,-0.895725 ,0.105387 ,0.431939 ,-1 ,0 ,0 ,-0.504819 ,-0.482379 ,0.715869 ,-0.828167 ,-0.421689 ,-0.369211 ,-0.761859 ,0.362239 ,-0.536986 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.398332 ,0.128825 ,0.908149 ,1.41651e-012 ,0.000739282 ,1 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.001821 ,0.0031858 ,-0.999993 ,-0.527237 ,-0.347746 ,-0.775303 ,-0.132834 ,-0.323941 ,-0.936706 ,-0.527237 ,-0.347746 ,-0.775303 ,-0.001821 ,-0.00294379 ,-0.999994 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.396257 ,0.135158 ,0.908137 ,-0.154807 ,0.491034 ,0.857275 ,1.41486e-012 ,0.000739274 ,1 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.219572 ,-0.202719 ,0.954303 ,-0.475757 ,-0.408175 ,0.779134 ,0.418557 ,0.483631 ,0.768707 ,-1 ,3.6175e-007 ,0 ,"NaN" ,"NaN" ,"NaN" ,-1 ,0 ,0 ,-0.84865 ,-0.0193074 ,-0.528602 ,-0.854459 ,0.223354 ,-0.469054 ,-0.651469 ,-0.0843326 ,-0.753973 ,-0.330731 ,0.0926065 ,-0.939171 ,-0.767734 ,0.249573 ,-0.590167 ,0.475756 ,0.408175 ,-0.779134 ,-0.389556 ,-0.622092 ,-0.679152 ,0.389554 ,0.622093 ,0.679152 ,-0.272343 ,-0.093852 ,-0.957612 ,0.219571 ,0.20272 ,-0.954302 ,-0.418558 ,-0.48363 ,-0.768707 ,0.458573 ,-0.14988 ,-0.875926 ,0.738592 ,-0.346601 ,-0.578229 ,-0.385401 ,0.327366 ,-0.862727 ,-0.845857 ,0.0583779 ,-0.530205 ,0.296538 ,0.215382 ,-0.930417 ,0.738592 ,-0.346601 ,-0.578229 ,-0.845857 ,0.0583779 ,-0.530205 ,-0.640768 ,-0.299025 ,-0.707107 ,-1 ,0 ,0 ,-0.947738 ,0.147993 ,0.28265 ,-0.979704 ,0.0139322 ,0.199966 ,-0.798141 ,0.256996 ,0.544908 ,-0.850743 ,-0.0976276 ,0.516436 ,-0.622361 ,0.351164 ,0.699536 ,-0.535047 ,-0.169815 ,0.827579 ,-0.658246 ,0.625319 ,0.419151 ,0.0108945 ,-0.739936 ,0.672589 ,0 ,-1 ,2.7732e-008 ,-0.0309834 ,-0.997088 ,-0.0696804 ,0 ,-0.703159 ,0.711033 ,0 ,0 ,1 ,0.0175992 ,-0.0783502 ,0.996771 ,0.0107912 ,0.660187 ,0.751024 ,0 ,0.703159 ,0.711033 ,0 ,1 ,2.7732e-008 ,0.0172861 ,0.995904 ,0.0887456 ,0.0108943 ,0.739937 ,-0.672588 ,0 ,0.703159 ,-0.711033 ,0 ,0 ,-1 ,0 ,0.703159 ,-0.711033 ,0.0108943 ,0.739937 ,-0.672588 ,0.0175992 ,0.0783492 ,-0.996771 ,0.0107913 ,-0.660188 ,-0.751023 ,0 ,-0.703159 ,-0.711033 ,-0.0226799 ,-0.999695 ,-0.00972728 ,0.0131055 ,-0.702348 ,0.711713 ,0.0123839 ,-0.0122817 ,0.999848 ,0.0131944 ,0.678228 ,0.734733 ,0.0139963 ,0.999666 ,0.0217368 ,0.0131051 ,0.702359 ,-0.711702 ,0.0131051 ,0.702359 ,-0.711702 ,0.0123841 ,0.0122734 ,-0.999848 ,0.0131943 ,-0.678228 ,-0.734733 ,8.87696e-008 ,-0.989097 ,0.147264 ,5.78237e-008 ,-0.582507 ,0.812825 ,-1.0664e-007 ,0.127 ,0.991903 ,-1.02832e-007 ,0.780639 ,0.624982 ,-1.13872e-007 ,0.989098 ,-0.147255 ,-1.25395e-007 ,0.582515 ,-0.81282 ,0.0123841 ,0.0122734 ,-0.999848 ,0.0131051 ,0.702359 ,-0.711702 ,-1.25395e-007 ,0.582515 ,-0.81282 ,-4.17274e-008 ,-0.127018 ,-0.9919 ,-1.25395e-007 ,0.582515 ,-0.81282 ,-3.08643e-008 ,-0.780626 ,-0.624998 ,0.745356 ,0.596285 ,0.298142 ,0.912871 ,-0.182574 ,0.365148 ,0.912871 ,-0.182574 ,-0.365148 ,0.745356 ,0.596285 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.912871 ,0.182574 ,-0.365148 ,0.745356 ,-0.596285 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.745356 ,0.596285 ,0.298142 ,0.912871 ,-0.182574 ,0.365148 ,0.912871 ,-0.182574 ,-0.365148 ,0.745356 ,0.596285 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.912871 ,0.182574 ,-0.365148 ,0.745356 ,-0.596285 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.912871 ,-0.182574 ,-0.365148 ,-0.912871 ,-0.182574 ,0.365148 ,-0.745356 ,0.596285 ,0.298142 ,-0.745356 ,0.596285 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.912871 ,0.182574 ,-0.365148 ,-0.745356 ,-0.596285 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.912871 ,-0.182574 ,-0.365148 ,-0.912871 ,-0.182574 ,0.365148 ,-0.745356 ,0.596285 ,0.298142 ,-0.745356 ,0.596285 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.912871 ,0.182574 ,-0.365148 ,-0.745356 ,-0.596285 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.912871 ,-0.182574 ,0.365148 ,0.912871 ,-0.182574 ,-0.365148 ,0.745356 ,0.596285 ,-0.298142 ,0.745356 ,0.596285 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.912871 ,0.182574 ,0.365148 ,0.745356 ,-0.596285 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.745356 ,0.596285 ,-0.298142 ,-0.912871 ,-0.182574 ,-0.365148 ,-0.912871 ,-0.182574 ,0.365148 ,-0.745356 ,0.596285 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.912871 ,0.182574 ,0.365148 ,-0.745356 ,-0.596285 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.0406628 ,-0.000383572 ,-0.999173 ,-0.258808 ,0.00523817 ,-0.965914 ,0 ,3.57864e-008 ,-1 ,-5.60669e-008 ,-8.86392e-008 ,-1 ,0 ,-4.76878e-008 ,-1 ,-0.159762 ,0.00365147 ,-0.987149 ,0.0342897 ,-0.00258663 ,-0.999409 ,0.0552979 ,-0.0281865 ,-0.998072 ,0.414342 ,0.143659 ,-0.898712 ,-0.0602476 ,0.00976605 ,-0.998136 ,-0.0552976 ,-0.0281864 ,-0.998072 ,-0.414341 ,0.143659 ,-0.898712 ,-0.411744 ,0.0185513 ,-0.911111 ,-0.388404 ,0.016836 ,-0.921335 ,0.106503 ,0.00245149 ,-0.994309 ,0.709306 ,0.17223 ,-0.683536 ,-0.709305 ,0.17223 ,-0.683537 ,-0.498671 ,0.0170538 ,-0.866624 ,-0.365281 ,0.0103669 ,-0.930839 ,0.852957 ,0.100491 ,-0.512216 ,-0.226288 ,0.0589018 ,-0.972278 ,-0.852956 ,0.100492 ,-0.512218 ,-0.520791 ,-0.00404868 ,-0.853674 ,-0.519065 ,1.53965e-007 ,-0.854735 ,0.116765 ,-0.00323019 ,-0.993154 ,0.890936 ,0 ,-0.454129 ,-0.890935 ,0 ,-0.45413 ,-0.476485 ,-0.0201484 ,-0.878952 ,-0.365281 ,-0.0103669 ,-0.930839 ,0.854508 ,-0.0948003 ,-0.510715 ,-0.266828 ,-0.0325039 ,-0.963196 ,-0.854507 ,-0.0948006 ,-0.510716 ,-0.368075 ,-0.0141367 ,-0.929689 ,-0.388405 ,-0.0168355 ,-0.921335 ,0.0592949 ,0.00217879 ,-0.998238 ,0.731654 ,-0.139776 ,-0.667192 ,-0.731653 ,-0.139777 ,-0.667193 ,-0.191515 ,-0.00173153 ,-0.981488 ,-0.159762 ,-0.00365033 ,-0.987149 ,0.263324 ,-0.241582 ,-0.933969 ,-0.143103 ,-0.0331642 ,-0.989152 ,-0.458106 ,-0.112487 ,-0.881751 ,0.0406643 ,-0.000384458 ,-0.999173 ,-1.04777e-007 ,1.723e-007 ,-1 ,-0.0335703 ,0.00349361 ,-0.99943 ,0.0330473 ,0.0168449 ,-0.999312 ,-0.055299 ,0.0281871 ,-0.998072 ,0.258811 ,0.00523932 ,-0.965914 ,0.159762 ,0.00364992 ,-0.987149 ,-0.236441 ,0.257617 ,-0.936872 ,0.0602438 ,0.00976541 ,-0.998136 ,0.414343 ,0.143657 ,-0.898711 ,0.411752 ,0.0185537 ,-0.911107 ,0.388404 ,0.0168357 ,-0.921335 ,-0.106499 ,0.00245161 ,-0.99431 ,-0.709307 ,0.17223 ,-0.683536 ,0.709305 ,0.17223 ,-0.683537 ,0.498674 ,0.0170549 ,-0.866622 ,0.365281 ,0.0103669 ,-0.930839 ,-0.852957 ,0.10049 ,-0.512216 ,0.226295 ,0.0589055 ,-0.972276 ,0.852957 ,0.100491 ,-0.512218 ,0.52079 ,-0.00404834 ,-0.853675 ,0.519065 ,-1.4181e-007 ,-0.854735 ,-0.116764 ,-0.00322988 ,-0.993154 ,-0.890936 ,0 ,-0.454129 ,0.890935 ,0 ,-0.45413 ,0.476478 ,-0.0201469 ,-0.878955 ,0.365281 ,-0.0103671 ,-0.930839 ,-0.854508 ,-0.0948009 ,-0.510715 ,0.266824 ,-0.0325027 ,-0.963197 ,0.854507 ,-0.0948013 ,-0.510716 ,0.368067 ,-0.0141349 ,-0.929692 ,0.388404 ,-0.016836 ,-0.921335 ,-0.0592997 ,0.00217926 ,-0.998238 ,-0.731653 ,-0.139777 ,-0.667192 ,0.731652 ,-0.139777 ,-0.667194 ,0.191519 ,-0.0017298 ,-0.981487 ,0.159762 ,-0.00365147 ,-0.987149 ,-0.458106 ,-0.112489 ,-0.881751 ,0.143095 ,-0.0331621 ,-0.989153 ,0.458104 ,-0.112489 ,-0.881752 ,0.0268145 ,-0.0136679 ,0.999547 ,-2.30261e-009 ,0 ,1 ,-0.0160934 ,-0.375042 ,0.926868 ,4.14468e-009 ,-0.382684 ,0.92388 ,-2.30261e-009 ,0 ,1 ,-0.0268146 ,-0.013668 ,0.999547 ,0.0160934 ,-0.375042 ,0.926868 ,4.14468e-009 ,-0.382684 ,0.92388 ,-0.0160934 ,-0.375042 ,0.926868 ,4.14468e-009 ,-0.382684 ,0.92388 ,2.21733e-009 ,-0.707107 ,0.707107 ,-0.0268145 ,-0.697122 ,0.716451 ,4.14468e-009 ,-0.382684 ,0.92388 ,0.0160934 ,-0.375042 ,0.926868 ,2.21733e-009 ,-0.707107 ,0.707107 ,0.0268146 ,-0.697122 ,0.716451 ,-0.0268145 ,-0.697122 ,0.716451 ,2.21733e-009 ,-0.707107 ,0.707107 ,-0.0160933 ,-0.92059 ,0.3902 ,3.99117e-009 ,-0.92388 ,0.382683 ,2.21733e-009 ,-0.707107 ,0.707107 ,0.0268146 ,-0.697122 ,0.716451 ,0.0160933 ,-0.92059 ,0.3902 ,3.99117e-009 ,-0.92388 ,0.382683 ,-0.0160933 ,-0.92059 ,0.3902 ,3.99117e-009 ,-0.92388 ,0.382683 ,2.30261e-009 ,-1 ,0 ,-0.0268145 ,-0.999547 ,0.0136679 ,3.99117e-009 ,-0.92388 ,0.382683 ,0.0160933 ,-0.92059 ,0.3902 ,2.30261e-009 ,-1 ,0 ,0.0268146 ,-0.999547 ,0.013668 ,-0.0268145 ,-0.999547 ,0.0136679 ,2.30261e-009 ,-1 ,0 ,-0.0160933 ,-0.926868 ,-0.375043 ,3.99117e-009 ,-0.923879 ,-0.382684 ,2.30261e-009 ,-1 ,0 ,0.0268146 ,-0.999547 ,0.013668 ,0.0160934 ,-0.926868 ,-0.375043 ,3.99117e-009 ,-0.923879 ,-0.382684 ,-0.0160933 ,-0.926868 ,-0.375043 ,3.99117e-009 ,-0.923879 ,-0.382684 ,2.25996e-009 ,-0.707107 ,-0.707107 ,-0.0268144 ,-0.716451 ,-0.697122 ,3.99117e-009 ,-0.923879 ,-0.382684 ,0.0160934 ,-0.926868 ,-0.375043 ,2.25996e-009 ,-0.707107 ,-0.707107 ,0.0268145 ,-0.716451 ,-0.697122 ,-0.0268144 ,-0.716451 ,-0.697122 ,2.25996e-009 ,-0.707107 ,-0.707107 ,0.263324 ,-0.241582 ,-0.933969 ,4.14469e-009 ,-0.382684 ,-0.92388 ,2.25996e-009 ,-0.707107 ,-0.707107 ,0.0268145 ,-0.716451 ,-0.697122 ,0.0160934 ,-0.3902 ,-0.92059 ,4.14469e-009 ,-0.382684 ,-0.92388 ,0.263324 ,-0.241582 ,-0.933969 ,4.14469e-009 ,-0.382684 ,-0.92388 ,2.38788e-009 ,0 ,-1 ,0.0330473 ,0.0168449 ,-0.999312 ,4.14469e-009 ,-0.382684 ,-0.92388 ,0.0160934 ,-0.3902 ,-0.92059 ,2.38788e-009 ,0 ,-1 ,0.0268145 ,-0.0136679 ,-0.999547 ,0.0330473 ,0.0168449 ,-0.999312 ,2.38788e-009 ,0 ,-1 ,-0.236441 ,0.257617 ,-0.936872 ,4.14469e-009 ,0.382684 ,-0.92388 ,2.38788e-009 ,0 ,-1 ,0.0268145 ,-0.0136679 ,-0.999547 ,0.0160934 ,0.375042 ,-0.926868 ,4.14469e-009 ,0.382684 ,-0.92388 ,-0.236441 ,0.257617 ,-0.936872 ,4.14469e-009 ,0.382684 ,-0.92388 ,2.25996e-009 ,0.707107 ,-0.707107 ,-0.0268144 ,0.697122 ,-0.716451 ,4.14469e-009 ,0.382684 ,-0.92388 ,0.0160934 ,0.375042 ,-0.926868 ,2.25996e-009 ,0.707107 ,-0.707107 ,0.0268145 ,0.697122 ,-0.716451 ,-0.0268144 ,0.697122 ,-0.716451 ,2.25996e-009 ,0.707107 ,-0.707107 ,-0.0160933 ,0.92059 ,-0.3902 ,3.99118e-009 ,0.923879 ,-0.382684 ,2.25996e-009 ,0.707107 ,-0.707107 ,0.0268145 ,0.697122 ,-0.716451 ,0.0160934 ,0.920589 ,-0.3902 ,3.99118e-009 ,0.923879 ,-0.382684 ,-0.0160933 ,0.92059 ,-0.3902 ,3.99118e-009 ,0.923879 ,-0.382684 ,2.30261e-009 ,1 ,0 ,-0.0268145 ,0.999547 ,-0.0136679 ,3.99118e-009 ,0.923879 ,-0.382684 ,0.0160934 ,0.920589 ,-0.3902 ,2.30261e-009 ,1 ,0 ,0.0268146 ,0.999547 ,-0.013668 ,-0.0268145 ,0.999547 ,-0.0136679 ,2.30261e-009 ,1 ,0 ,-0.0160933 ,0.926868 ,0.375042 ,3.99117e-009 ,0.92388 ,0.382684 ,2.30261e-009 ,1 ,0 ,0.0268146 ,0.999547 ,-0.013668 ,0.0160934 ,0.926868 ,0.375042 ,3.99117e-009 ,0.92388 ,0.382684 ,-0.0160933 ,0.926868 ,0.375042 ,3.99117e-009 ,0.92388 ,0.382684 ,2.21732e-009 ,0.707107 ,0.707107 ,-0.0268145 ,0.716451 ,0.697122 ,3.99117e-009 ,0.92388 ,0.382684 ,0.0160934 ,0.926868 ,0.375042 ,2.21732e-009 ,0.707107 ,0.707107 ,0.0268146 ,0.716451 ,0.697122 ,-0.0268145 ,0.716451 ,0.697122 ,2.21732e-009 ,0.707107 ,0.707107 ,-0.0160933 ,0.3902 ,0.92059 ,4.14468e-009 ,0.382684 ,0.92388 ,2.21732e-009 ,0.707107 ,0.707107 ,0.0268146 ,0.716451 ,0.697122 ,0.0160933 ,0.3902 ,0.92059 ,4.14468e-009 ,0.382684 ,0.92388 ,-0.0160933 ,0.3902 ,0.92059 ,4.14468e-009 ,0.382684 ,0.92388 ,-2.30261e-009 ,0 ,1 ,0.0268145 ,-0.0136679 ,0.999547 ,4.14468e-009 ,0.382684 ,0.92388 ,0.0160933 ,0.3902 ,0.92059 ,-2.30261e-009 ,0 ,1 ,-0.0268146 ,-0.013668 ,0.999547 ] ,"bitangents": [ -0.520796 ,-0.853672 ,0.00404876 ,-0.476481 ,-0.878954 ,0.0201475 ,0 ,-1 ,2.28704e-009 ,-0.519065 ,-0.854735 ,5.76011e-007 ,0 ,-1 ,9.25277e-010 ,-0.365282 ,-0.930839 ,0.0103679 ,0.116762 ,-0.993155 ,0.00323107 ,0.890936 ,-0.454129 ,8.30525e-008 ,0.854507 ,-0.510715 ,0.0948014 ,-0.266829 ,-0.963196 ,0.0325066 ,-0.890935 ,-0.45413 ,8.42227e-008 ,-0.854507 ,-0.510716 ,0.0948018 ,-0.368066 ,-0.929692 ,0.014135 ,-0.388404 ,-0.921335 ,0.0168356 ,0.0592992 ,-0.998238 ,-0.00217942 ,0.731654 ,-0.667192 ,0.139776 ,-0.731652 ,-0.667194 ,0.139777 ,-0.191517 ,-0.981488 ,0.00173126 ,-0.159762 ,-0.987149 ,0.00365135 ,0.458106 ,-0.881751 ,0.112488 ,-0.143094 ,-0.989153 ,0.0331622 ,-0.458105 ,-0.881752 ,0.112488 ,0.0406609 ,-0.999173 ,0.000383066 ,5.39311e-008 ,-1 ,9.0775e-008 ,-0.0335745 ,-0.99943 ,-0.00349344 ,0.055298 ,-0.998072 ,-0.0281865 ,-0.0552977 ,-0.998072 ,-0.0281864 ,0.25881 ,-0.965914 ,-0.00523834 ,0.159762 ,-0.987149 ,-0.00365168 ,-0.414342 ,-0.898712 ,-0.143659 ,0.0602464 ,-0.998136 ,-0.00976645 ,0.414341 ,-0.898712 ,-0.143659 ,0.411755 ,-0.911106 ,-0.0185524 ,0.388405 ,-0.921335 ,-0.0168356 ,-0.106499 ,-0.99431 ,-0.00245124 ,-0.709307 ,-0.683536 ,-0.172229 ,0.709306 ,-0.683537 ,-0.172229 ,0.49868 ,-0.866618 ,-0.0170546 ,0.365281 ,-0.930839 ,-0.0103678 ,-0.879127 ,-0.4761 ,0.021558 ,0.226305 ,-0.972273 ,-0.0589106 ,0.852956 ,-0.512218 ,-0.100492 ,0.520794 ,-0.853673 ,0.00404863 ,0.519065 ,-0.854735 ,-5.71719e-007 ,-0.116763 ,-0.993155 ,0.00322858 ,-0.890936 ,-0.454128 ,-1.60722e-008 ,0.890935 ,-0.45413 ,-8.30528e-008 ,0.476495 ,-0.878946 ,0.0201482 ,0.365281 ,-0.930839 ,0.0103668 ,-0.879612 ,-0.475048 ,-0.0247441 ,0.266837 ,-0.963193 ,0.0325018 ,0.854507 ,-0.510716 ,0.0948004 ,0.368074 ,-0.929689 ,0.0141374 ,0.388404 ,-0.921335 ,0.0168346 ,-0.0592937 ,-0.998238 ,-0.0021808 ,-0.731654 ,-0.667192 ,0.139776 ,0.731653 ,-0.667193 ,0.139777 ,0.191517 ,-0.981488 ,0.00173398 ,0.159762 ,-0.987149 ,0.00364929 ,-0.458107 ,-0.881751 ,0.112487 ,0.143099 ,-0.989153 ,0.0331632 ,0.458106 ,-0.881751 ,0.112487 ,-0.0406631 ,-0.999173 ,0.000382166 ,-8.65033e-008 ,-1 ,1.40968e-007 ,0.0335734 ,-0.99943 ,-0.00349349 ,-0.0552984 ,-0.998072 ,-0.0281868 ,0.055298 ,-0.998072 ,-0.0281867 ,-0.258806 ,-0.965915 ,-0.00524028 ,-0.159762 ,-0.987149 ,-0.00364977 ,0.414343 ,-0.898711 ,-0.143657 ,-0.0602467 ,-0.998136 ,-0.00976724 ,-0.414342 ,-0.898712 ,-0.143657 ,-0.411744 ,-0.911111 ,-0.018553 ,-0.388404 ,-0.921335 ,-0.0168343 ,0.106502 ,-0.994309 ,-0.00244955 ,0.709306 ,-0.683536 ,-0.17223 ,-0.709305 ,-0.683537 ,-0.17223 ,-0.498675 ,-0.866621 ,-0.0170548 ,-0.365281 ,-0.930839 ,-0.010367 ,0.852957 ,-0.512216 ,-0.10049 ,-0.22629 ,-0.972277 ,-0.0589018 ,-0.852957 ,-0.512217 ,-0.100491 ,-0.890936 ,0.454129 ,8.38242e-008 ,-1 ,-1.04893e-007 ,-2.48621e-009 ,-0.890844 ,0.425036 ,0.160445 ,-1 ,-1.43853e-007 ,7.94187e-008 ,-1 ,-1.04893e-007 ,-2.48621e-009 ,-0.890935 ,-0.45413 ,-8.50053e-008 ,-0.890843 ,-0.425037 ,-0.160445 ,-1 ,-1.43853e-007 ,7.94187e-008 ,-0.890844 ,0.425036 ,0.160445 ,-1 ,-1.43853e-007 ,7.94187e-008 ,-0.99997 ,0.00548173 ,-0.00548187 ,-0.890936 ,0.321118 ,0.321117 ,-1 ,-1.43853e-007 ,7.94187e-008 ,-0.890843 ,-0.425037 ,-0.160445 ,-0.99997 ,0.00548173 ,-0.00548187 ,-0.890935 ,-0.321119 ,-0.321118 ,-0.890936 ,0.321118 ,0.321117 ,-0.99997 ,0.00548173 ,-0.00548187 ,-0.890844 ,0.187094 ,0.413997 ,-1 ,-6.59327e-008 ,-8.69114e-008 ,-0.99997 ,0.00548173 ,-0.00548187 ,-0.890935 ,-0.321119 ,-0.321118 ,-0.890843 ,-0.187094 ,-0.413998 ,-1 ,-6.59327e-008 ,-8.69114e-008 ,-0.890844 ,0.187094 ,0.413997 ,-1 ,-6.59327e-008 ,-8.69114e-008 ,-0.99997 ,0.00775251 ,-1.0489e-007 ,-0.890936 ,0 ,0.454128 ,-1 ,-6.59327e-008 ,-8.69114e-008 ,-0.890843 ,-0.187094 ,-0.413998 ,-0.99997 ,0.00775251 ,-1.0489e-007 ,-0.890936 ,0 ,-0.454129 ,-0.890936 ,0 ,0.454128 ,-0.99997 ,0.00775251 ,-1.0489e-007 ,-0.890844 ,-0.160444 ,0.425036 ,-1 ,3.11681e-007 ,2.09782e-008 ,-0.99997 ,0.00775251 ,-1.0489e-007 ,-0.890936 ,0 ,-0.454129 ,-0.890843 ,0.160445 ,-0.425037 ,-1 ,3.11681e-007 ,2.09782e-008 ,-0.890844 ,-0.160444 ,0.425036 ,-1 ,3.11681e-007 ,2.09782e-008 ,-0.99997 ,0.00548202 ,0.00548188 ,-0.890936 ,-0.321117 ,0.321117 ,-1 ,3.11681e-007 ,2.09782e-008 ,-0.890843 ,0.160445 ,-0.425037 ,-0.99997 ,0.00548202 ,0.00548188 ,-0.890936 ,0.321118 ,-0.321118 ,-0.890936 ,-0.321117 ,0.321117 ,-0.99997 ,0.00548202 ,0.00548188 ,-0.879127 ,-0.4761 ,0.021558 ,-1 ,1.5584e-007 ,9.88985e-008 ,-0.99997 ,0.00548202 ,0.00548188 ,-0.890936 ,0.321118 ,-0.321118 ,-0.890843 ,0.413998 ,-0.187095 ,-1 ,1.5584e-007 ,9.88985e-008 ,-0.879127 ,-0.4761 ,0.021558 ,-1 ,1.5584e-007 ,9.88985e-008 ,-0.99997 ,1.06553e-007 ,0.00775257 ,-0.890936 ,-0.454128 ,-1.60722e-008 ,-1 ,1.5584e-007 ,9.88985e-008 ,-0.890843 ,0.413998 ,-0.187095 ,-0.99997 ,1.06553e-007 ,0.00775257 ,-0.890935 ,0.45413 ,-8.38246e-008 ,-0.890936 ,-0.454128 ,-1.60722e-008 ,-0.99997 ,1.06553e-007 ,0.00775257 ,-0.879612 ,-0.475048 ,-0.0247441 ,-1 ,3.41061e-013 ,2.81711e-007 ,-0.99997 ,1.06553e-007 ,0.00775257 ,-0.890935 ,0.45413 ,-8.38246e-008 ,-0.890843 ,0.425037 ,0.160445 ,-1 ,3.41061e-013 ,2.81711e-007 ,-0.879612 ,-0.475048 ,-0.0247441 ,-1 ,3.41061e-013 ,2.81711e-007 ,-0.99997 ,-0.00548183 ,0.00548198 ,-0.890936 ,-0.321117 ,-0.321117 ,-1 ,3.41061e-013 ,2.81711e-007 ,-0.890843 ,0.425037 ,0.160445 ,-0.99997 ,-0.00548183 ,0.00548198 ,-0.890936 ,0.321118 ,0.321118 ,-0.890936 ,-0.321117 ,-0.321117 ,-0.99997 ,-0.00548183 ,0.00548198 ,-0.890843 ,-0.187095 ,-0.413998 ,-1 ,-1.49846e-008 ,1.1688e-007 ,-0.99997 ,-0.00548183 ,0.00548198 ,-0.890936 ,0.321118 ,0.321118 ,-0.890843 ,0.187095 ,0.413999 ,-1 ,-1.49846e-008 ,1.1688e-007 ,-0.890843 ,-0.187095 ,-0.413998 ,-1 ,-1.49846e-008 ,1.1688e-007 ,-0.99997 ,-0.00775251 ,1.0489e-007 ,-0.890936 ,0 ,-0.454129 ,-1 ,-1.49846e-008 ,1.1688e-007 ,-0.890843 ,0.187095 ,0.413999 ,-0.99997 ,-0.00775251 ,1.0489e-007 ,-0.890935 ,0 ,0.45413 ,-0.890936 ,0 ,-0.454129 ,-0.99997 ,-0.00775251 ,1.0489e-007 ,-0.890843 ,0.160445 ,-0.425036 ,-1 ,1.04892e-008 ,1.10887e-007 ,-0.99997 ,-0.00775251 ,1.0489e-007 ,-0.890935 ,0 ,0.45413 ,-0.890843 ,-0.160446 ,0.425037 ,-1 ,1.04892e-008 ,1.10887e-007 ,-0.890843 ,0.160445 ,-0.425036 ,-1 ,1.04892e-008 ,1.10887e-007 ,-0.99997 ,-0.00548189 ,-0.00548174 ,-0.890936 ,0.321118 ,-0.321117 ,-1 ,1.04892e-008 ,1.10887e-007 ,-0.890843 ,-0.160446 ,0.425037 ,-0.99997 ,-0.00548189 ,-0.00548174 ,-0.890935 ,-0.321119 ,0.321118 ,-0.890936 ,0.321118 ,-0.321117 ,-0.99997 ,-0.00548189 ,-0.00548174 ,-0.890844 ,0.413998 ,-0.187093 ,-1 ,1.19875e-008 ,2.96697e-007 ,-0.99997 ,-0.00548189 ,-0.00548174 ,-0.890935 ,-0.321119 ,0.321118 ,-0.890843 ,-0.413999 ,0.187094 ,-1 ,1.19875e-008 ,2.96697e-007 ,-0.890844 ,0.413998 ,-0.187093 ,-1 ,1.19875e-008 ,2.96697e-007 ,-1 ,-1.04893e-007 ,-2.48621e-009 ,-0.890936 ,0.454129 ,8.38242e-008 ,-1 ,1.19875e-008 ,2.96697e-007 ,-0.890843 ,-0.413999 ,0.187094 ,-1 ,-1.04893e-007 ,-2.48621e-009 ,-0.890935 ,-0.45413 ,-8.50053e-008 ,0 ,-1 ,1.69193e-012 ,0.476481 ,-0.878954 ,0.0201464 ,0.520796 ,-0.853672 ,0.00404837 ,0.365281 ,-0.930839 ,0.0103676 ,0 ,-1 ,4.6264e-009 ,0.519065 ,-0.854735 ,2.48577e-007 ,-0.854508 ,-0.510715 ,0.0948013 ,-0.890936 ,-0.454129 ,0 ,-0.116762 ,-0.993155 ,0.00323127 ,0.266828 ,-0.963196 ,0.0325057 ,0.854507 ,-0.510716 ,0.0948016 ,0.890935 ,-0.45413 ,0 ,0.368066 ,-0.929692 ,0.0141346 ,0.388404 ,-0.921335 ,0.0168349 ,-0.0592994 ,-0.998238 ,-0.00218039 ,-0.731654 ,-0.667192 ,0.139776 ,0.731653 ,-0.667194 ,0.139777 ,0.191517 ,-0.981488 ,0.00173174 ,0.159762 ,-0.987149 ,0.00365074 ,-0.458106 ,-0.881751 ,0.112488 ,0.143094 ,-0.989153 ,0.0331615 ,0.458105 ,-0.881752 ,0.112488 ,-0.040661 ,-0.999173 ,0.000383189 ,-5.39311e-008 ,-1 ,8.75712e-008 ,0.0335746 ,-0.99943 ,-0.00349338 ,-0.0552981 ,-0.998072 ,-0.0281866 ,0.0552977 ,-0.998072 ,-0.0281865 ,-0.25881 ,-0.965914 ,-0.00523882 ,-0.159762 ,-0.987149 ,-0.00365107 ,0.414343 ,-0.898711 ,-0.143659 ,-0.060247 ,-0.998136 ,-0.00976635 ,-0.414342 ,-0.898712 ,-0.143659 ,-0.411755 ,-0.911106 ,-0.0185516 ,-0.388405 ,-0.921335 ,-0.016835 ,0.106499 ,-0.99431 ,-0.00245044 ,0.709307 ,-0.683536 ,-0.172229 ,-0.709305 ,-0.683537 ,-0.17223 ,-0.49868 ,-0.866619 ,-0.0170534 ,-0.365281 ,-0.930839 ,-0.0103672 ,0.879127 ,-0.4761 ,0.021558 ,-0.226305 ,-0.972273 ,-0.0589092 ,-0.852956 ,-0.512218 ,-0.100492 ,-0.520794 ,-0.853673 ,0.00404816 ,-0.519065 ,-0.854734 ,-2.56596e-007 ,0.116763 ,-0.993155 ,0.00322929 ,0.890936 ,-0.454128 ,0 ,-0.890936 ,-0.45413 ,0 ,-0.476495 ,-0.878946 ,0.0201483 ,-0.365281 ,-0.930839 ,0.0103676 ,0.879612 ,-0.475048 ,-0.0247439 ,-0.266837 ,-0.963193 ,0.0325029 ,-0.854507 ,-0.510716 ,0.0948013 ,-0.368074 ,-0.929689 ,0.0141382 ,-0.388404 ,-0.921335 ,0.0168355 ,0.0592934 ,-0.998238 ,-0.00217858 ,0.731654 ,-0.667192 ,0.139776 ,-0.731653 ,-0.667193 ,0.139777 ,-0.191517 ,-0.981488 ,0.00173257 ,-0.159762 ,-0.987149 ,0.00365091 ,0.458107 ,-0.881751 ,0.112488 ,-0.143098 ,-0.989153 ,0.0331639 ,-0.458106 ,-0.881751 ,0.112488 ,0.0406632 ,-0.999173 ,0.000382587 ,8.38334e-008 ,-1 ,1.399e-007 ,-0.0335735 ,-0.99943 ,-0.00349352 ,0.0552983 ,-0.998072 ,-0.0281867 ,-0.0552979 ,-0.998072 ,-0.0281866 ,0.258806 ,-0.965915 ,-0.00524032 ,0.159762 ,-0.987149 ,-0.00365109 ,-0.414343 ,-0.898711 ,-0.143658 ,0.0602462 ,-0.998136 ,-0.0097673 ,0.414342 ,-0.898712 ,-0.143658 ,0.411744 ,-0.911111 ,-0.0185533 ,0.388404 ,-0.921335 ,-0.0168355 ,-0.106503 ,-0.994309 ,-0.00245154 ,-0.709306 ,-0.683536 ,-0.17223 ,0.709305 ,-0.683538 ,-0.17223 ,0.498675 ,-0.866621 ,-0.0170543 ,0.365281 ,-0.930839 ,-0.0103677 ,-0.852957 ,-0.512216 ,-0.100491 ,0.22629 ,-0.972277 ,-0.0589034 ,0.852956 ,-0.512218 ,-0.100491 ,0.890844 ,0.425036 ,0.160445 ,1 ,-1.04893e-007 ,0 ,0.890936 ,0.454129 ,0 ,1 ,-6.29359e-008 ,-1.0789e-007 ,0.890843 ,-0.425037 ,-0.160445 ,0.890935 ,-0.45413 ,0 ,1 ,-1.04893e-007 ,0 ,1 ,-6.29359e-008 ,-1.0789e-007 ,0.99997 ,0.00548179 ,-0.00548193 ,1 ,-6.29359e-008 ,-1.0789e-007 ,0.890844 ,0.425036 ,0.160445 ,0.890936 ,0.321118 ,0.321118 ,0.99997 ,0.00548179 ,-0.00548193 ,0.890843 ,-0.425037 ,-0.160445 ,1 ,-6.29359e-008 ,-1.0789e-007 ,0.890935 ,-0.321118 ,-0.321118 ,0.890844 ,0.187094 ,0.413997 ,0.99997 ,0.00548179 ,-0.00548193 ,0.890936 ,0.321118 ,0.321118 ,1 ,5.99375e-009 ,-1.16881e-007 ,0.890843 ,-0.187095 ,-0.413998 ,0.890935 ,-0.321118 ,-0.321118 ,0.99997 ,0.00548179 ,-0.00548193 ,1 ,5.99375e-009 ,-1.16881e-007 ,0.99997 ,0.00775251 ,-1.0489e-007 ,1 ,5.99375e-009 ,-1.16881e-007 ,0.890844 ,0.187094 ,0.413997 ,0.890936 ,0 ,0.454129 ,0.99997 ,0.00775251 ,-1.0489e-007 ,0.890843 ,-0.187095 ,-0.413998 ,1 ,5.99375e-009 ,-1.16881e-007 ,0.890935 ,0 ,-0.45413 ,0.890844 ,-0.160444 ,0.425036 ,0.99997 ,0.00775251 ,-1.0489e-007 ,0.890936 ,0 ,0.454129 ,1 ,2.27767e-007 ,-1.79818e-008 ,0.890843 ,0.160445 ,-0.425037 ,0.890935 ,0 ,-0.45413 ,0.99997 ,0.00775251 ,-1.0489e-007 ,1 ,2.27767e-007 ,-1.79818e-008 ,0.99997 ,0.00548196 ,0.00548181 ,1 ,2.27767e-007 ,-1.79818e-008 ,0.890844 ,-0.160444 ,0.425036 ,0.890936 ,-0.321117 ,0.321117 ,0.99997 ,0.00548196 ,0.00548181 ,0.890843 ,0.160445 ,-0.425037 ,1 ,2.27767e-007 ,-1.79818e-008 ,0.890936 ,0.321118 ,-0.321118 ,0.879127 ,-0.4761 ,0.021558 ,0.99997 ,0.00548196 ,0.00548181 ,0.890936 ,-0.321117 ,0.321117 ,1 ,7.49234e-008 ,-8.99079e-008 ,0.890843 ,0.413998 ,-0.187094 ,0.890936 ,0.321118 ,-0.321118 ,0.99997 ,0.00548196 ,0.00548181 ,1 ,7.49234e-008 ,-8.99079e-008 ,0.99997 ,1.0489e-007 ,0.00775245 ,1 ,7.49234e-008 ,-8.99079e-008 ,0.879127 ,-0.4761 ,0.021558 ,0.890936 ,-0.454128 ,0 ,0.99997 ,1.0489e-007 ,0.00775245 ,0.890843 ,0.413998 ,-0.187094 ,1 ,7.49234e-008 ,-8.99079e-008 ,0.890936 ,0.45413 ,0 ,0.879612 ,-0.475048 ,-0.0247439 ,0.99997 ,1.0489e-007 ,0.00775245 ,0.890936 ,-0.454128 ,0 ,1 ,7.19265e-008 ,8.84094e-008 ,0.890843 ,0.425037 ,0.160445 ,0.890936 ,0.45413 ,0 ,0.99997 ,1.0489e-007 ,0.00775245 ,1 ,7.19265e-008 ,8.84094e-008 ,0.99997 ,-0.00548177 ,0.00548192 ,1 ,7.19265e-008 ,8.84094e-008 ,0.879612 ,-0.475048 ,-0.0247439 ,0.890936 ,-0.321117 ,-0.321117 ,0.99997 ,-0.00548177 ,0.00548192 ,0.890843 ,0.425037 ,0.160445 ,1 ,7.19265e-008 ,8.84094e-008 ,0.890936 ,0.321118 ,0.321118 ,0.890844 ,-0.187094 ,-0.413997 ,0.99997 ,-0.00548177 ,0.00548192 ,0.890936 ,-0.321117 ,-0.321117 ,1 ,-1.49837e-009 ,1.04893e-007 ,0.890843 ,0.187095 ,0.413998 ,0.890936 ,0.321118 ,0.321118 ,0.99997 ,-0.00548177 ,0.00548192 ,1 ,-1.49837e-009 ,1.04893e-007 ,0.99997 ,-0.00775251 ,1.0489e-007 ,1 ,-1.49837e-009 ,1.04893e-007 ,0.890844 ,-0.187094 ,-0.413997 ,0.890936 ,0 ,-0.454129 ,0.99997 ,-0.00775251 ,1.0489e-007 ,0.890843 ,0.187095 ,0.413998 ,1 ,-1.49837e-009 ,1.04893e-007 ,0.890935 ,0 ,0.45413 ,0.890844 ,0.160445 ,-0.425036 ,0.99997 ,-0.00775251 ,1.0489e-007 ,0.890936 ,0 ,-0.454129 ,1 ,8.99069e-009 ,1.16881e-007 ,0.890843 ,-0.160445 ,0.425037 ,0.890935 ,0 ,0.45413 ,0.99997 ,-0.00775251 ,1.0489e-007 ,1 ,8.99069e-009 ,1.16881e-007 ,0.99997 ,-0.00548188 ,-0.00548174 ,1 ,8.99069e-009 ,1.16881e-007 ,0.890844 ,0.160445 ,-0.425036 ,0.890936 ,0.321118 ,-0.321118 ,0.99997 ,-0.00548188 ,-0.00548174 ,0.890843 ,-0.160445 ,0.425037 ,1 ,8.99069e-009 ,1.16881e-007 ,0.890935 ,-0.321118 ,0.321119 ,0.890844 ,0.413997 ,-0.187094 ,0.99997 ,-0.00548188 ,-0.00548174 ,0.890936 ,0.321118 ,-0.321118 ,1 ,-5.9939e-008 ,1.06391e-007 ,0.890843 ,-0.413998 ,0.187094 ,0.890935 ,-0.321118 ,0.321119 ,0.99997 ,-0.00548188 ,-0.00548174 ,1 ,-5.9939e-008 ,1.06391e-007 ,1 ,-1.04893e-007 ,0 ,1 ,-5.9939e-008 ,1.06391e-007 ,0.890844 ,0.413997 ,-0.187094 ,0.890936 ,0.454129 ,0 ,1 ,-1.04893e-007 ,0 ,0.890843 ,-0.413998 ,0.187094 ,1 ,-5.9939e-008 ,1.06391e-007 ,0.890935 ,-0.45413 ,0 ,0 ,-1 ,2.52284e-012 ,0.476481 ,-0.878954 ,0.0201475 ,0.520796 ,-0.853672 ,0.00404876 ,0.365282 ,-0.930839 ,0.0103679 ,0 ,-1 ,-9.2524e-010 ,0.519065 ,-0.854735 ,5.72002e-007 ,-0.854508 ,-0.510715 ,0.0948014 ,-0.890936 ,-0.454129 ,8.30525e-008 ,-0.116762 ,-0.993155 ,0.00323105 ,0.266829 ,-0.963196 ,0.0325065 ,0.854507 ,-0.510716 ,0.0948018 ,0.890935 ,-0.45413 ,8.42227e-008 ,0.368066 ,-0.929692 ,0.014135 ,0.388404 ,-0.921335 ,0.0168356 ,-0.0592992 ,-0.998238 ,-0.0021794 ,-0.731654 ,-0.667192 ,0.139776 ,0.731652 ,-0.667194 ,0.139777 ,0.191517 ,-0.981488 ,0.00173125 ,0.159762 ,-0.987149 ,0.00365135 ,-0.458106 ,-0.881751 ,0.112488 ,0.143094 ,-0.989153 ,0.0331622 ,0.458105 ,-0.881752 ,0.112488 ,-0.040661 ,-0.999173 ,0.000383077 ,-5.5533e-008 ,-1 ,9.0775e-008 ,0.0335745 ,-0.99943 ,-0.00349344 ,-0.055298 ,-0.998072 ,-0.0281865 ,0.0552977 ,-0.998072 ,-0.0281864 ,-0.25881 ,-0.965914 ,-0.00523835 ,-0.159762 ,-0.987149 ,-0.00365167 ,0.414342 ,-0.898712 ,-0.143659 ,-0.0602464 ,-0.998136 ,-0.00976645 ,-0.414341 ,-0.898712 ,-0.143659 ,-0.411755 ,-0.911106 ,-0.0185524 ,-0.388405 ,-0.921335 ,-0.0168356 ,0.106499 ,-0.99431 ,-0.00245126 ,0.709307 ,-0.683536 ,-0.172229 ,-0.709306 ,-0.683537 ,-0.17223 ,-0.49868 ,-0.866618 ,-0.0170546 ,-0.365281 ,-0.930839 ,-0.0103678 ,0.879127 ,-0.4761 ,0.021558 ,-0.226305 ,-0.972273 ,-0.0589106 ,-0.852956 ,-0.512218 ,-0.100492 ,-0.520794 ,-0.853673 ,0.00404862 ,-0.519065 ,-0.854735 ,-5.75728e-007 ,0.116763 ,-0.993155 ,0.00322857 ,0.890936 ,-0.454128 ,-1.60722e-008 ,-0.890935 ,-0.45413 ,-8.30528e-008 ,-0.476495 ,-0.878946 ,0.0201481 ,-0.365281 ,-0.930839 ,0.0103668 ,0.879612 ,-0.475048 ,-0.0247441 ,-0.266837 ,-0.963193 ,0.0325018 ,-0.854507 ,-0.510716 ,0.0948004 ,-0.368074 ,-0.929689 ,0.0141373 ,-0.388404 ,-0.921335 ,0.0168346 ,0.0592937 ,-0.998238 ,-0.00218079 ,0.731654 ,-0.667192 ,0.139776 ,-0.731653 ,-0.667193 ,0.139777 ,-0.191517 ,-0.981488 ,0.00173398 ,-0.159762 ,-0.987149 ,0.00364927 ,0.458107 ,-0.881751 ,0.112487 ,-0.143099 ,-0.989153 ,0.0331632 ,-0.458106 ,-0.881751 ,0.112487 ,0.0406631 ,-0.999173 ,0.000382177 ,8.32995e-008 ,-1 ,1.38832e-007 ,-0.0335734 ,-0.99943 ,-0.0034935 ,0.0552984 ,-0.998072 ,-0.0281868 ,-0.055298 ,-0.998072 ,-0.0281867 ,0.258806 ,-0.965915 ,-0.00524027 ,0.159762 ,-0.987149 ,-0.00364979 ,-0.414343 ,-0.898711 ,-0.143657 ,0.0602467 ,-0.998136 ,-0.00976724 ,0.414342 ,-0.898712 ,-0.143658 ,0.411744 ,-0.911111 ,-0.0185529 ,0.388404 ,-0.921335 ,-0.0168343 ,-0.106502 ,-0.994309 ,-0.00244955 ,-0.709306 ,-0.683536 ,-0.17223 ,0.709305 ,-0.683537 ,-0.17223 ,0.498675 ,-0.866621 ,-0.0170548 ,0.365281 ,-0.930839 ,-0.010367 ,-0.852957 ,-0.512216 ,-0.10049 ,0.22629 ,-0.972277 ,-0.0589018 ,0.852957 ,-0.512217 ,-0.100491 ,0.890844 ,0.425036 ,0.160445 ,1 ,-1.04893e-007 ,-2.48621e-009 ,0.890936 ,0.454129 ,8.38242e-008 ,1 ,-1.43853e-007 ,8.09172e-008 ,0.890843 ,-0.425037 ,-0.160445 ,0.890935 ,-0.45413 ,-8.50053e-008 ,1 ,-1.04893e-007 ,-2.48621e-009 ,1 ,-1.43853e-007 ,8.09172e-008 ,0.99997 ,0.00548173 ,-0.00548187 ,1 ,-1.43853e-007 ,8.09172e-008 ,0.890844 ,0.425036 ,0.160445 ,0.890936 ,0.321118 ,0.321117 ,0.99997 ,0.00548173 ,-0.00548187 ,0.890843 ,-0.425037 ,-0.160445 ,1 ,-1.43853e-007 ,8.09172e-008 ,0.890935 ,-0.321119 ,-0.321118 ,0.890844 ,0.187094 ,0.413997 ,0.99997 ,0.00548173 ,-0.00548187 ,0.890936 ,0.321118 ,0.321117 ,1 ,-7.0428e-008 ,-8.39144e-008 ,0.890843 ,-0.187094 ,-0.413998 ,0.890935 ,-0.321119 ,-0.321118 ,0.99997 ,0.00548173 ,-0.00548187 ,1 ,-7.0428e-008 ,-8.39144e-008 ,0.99997 ,0.00775251 ,-1.0489e-007 ,1 ,-7.0428e-008 ,-8.39144e-008 ,0.890844 ,0.187094 ,0.413997 ,0.890936 ,0 ,0.454128 ,0.99997 ,0.00775251 ,-1.0489e-007 ,0.890843 ,-0.187094 ,-0.413998 ,1 ,-7.0428e-008 ,-8.39144e-008 ,0.890936 ,0 ,-0.454129 ,0.890844 ,-0.160444 ,0.425036 ,0.99997 ,0.00775251 ,-1.0489e-007 ,0.890936 ,0 ,0.454128 ,1 ,3.07185e-007 ,2.09782e-008 ,0.890843 ,0.160445 ,-0.425037 ,0.890936 ,0 ,-0.454129 ,0.99997 ,0.00775251 ,-1.0489e-007 ,1 ,3.07185e-007 ,2.09782e-008 ,0.99997 ,0.00548202 ,0.00548187 ,1 ,3.07185e-007 ,2.09782e-008 ,0.890844 ,-0.160444 ,0.425036 ,0.890936 ,-0.321117 ,0.321117 ,0.99997 ,0.00548202 ,0.00548187 ,0.890843 ,0.160445 ,-0.425037 ,1 ,3.07185e-007 ,2.09782e-008 ,0.890936 ,0.321118 ,-0.321118 ,0.879127 ,-0.4761 ,0.021558 ,0.99997 ,0.00548202 ,0.00548187 ,0.890936 ,-0.321117 ,0.321117 ,1 ,1.5584e-007 ,1.03394e-007 ,0.890843 ,0.413998 ,-0.187095 ,0.890936 ,0.321118 ,-0.321118 ,0.99997 ,0.00548202 ,0.00548187 ,1 ,1.5584e-007 ,1.03394e-007 ,0.99997 ,1.06553e-007 ,0.00775257 ,1 ,1.5584e-007 ,1.03394e-007 ,0.879127 ,-0.4761 ,0.021558 ,0.890936 ,-0.454128 ,-1.60722e-008 ,0.99997 ,1.06553e-007 ,0.00775257 ,0.890843 ,0.413998 ,-0.187095 ,1 ,1.5584e-007 ,1.03394e-007 ,0.890936 ,0.45413 ,-8.38246e-008 ,0.879612 ,-0.475048 ,-0.0247441 ,0.99997 ,1.06553e-007 ,0.00775257 ,0.890936 ,-0.454128 ,-1.60722e-008 ,1 ,2.99726e-009 ,2.80213e-007 ,0.890843 ,0.425037 ,0.160445 ,0.890936 ,0.45413 ,-8.38246e-008 ,0.99997 ,1.06553e-007 ,0.00775257 ,1 ,2.99726e-009 ,2.80213e-007 ,0.99997 ,-0.00548183 ,0.00548198 ,1 ,2.99726e-009 ,2.80213e-007 ,0.879612 ,-0.475048 ,-0.0247441 ,0.890936 ,-0.321117 ,-0.321117 ,0.99997 ,-0.00548183 ,0.00548198 ,0.890843 ,0.425037 ,0.160445 ,1 ,2.99726e-009 ,2.80213e-007 ,0.890936 ,0.321118 ,0.321118 ,0.890843 ,-0.187095 ,-0.413998 ,0.99997 ,-0.00548183 ,0.00548198 ,0.890936 ,-0.321117 ,-0.321117 ,1 ,-7.49223e-009 ,1.10887e-007 ,0.890843 ,0.187095 ,0.413999 ,0.890936 ,0.321118 ,0.321118 ,0.99997 ,-0.00548183 ,0.00548198 ,1 ,-7.49223e-009 ,1.10887e-007 ,0.99997 ,-0.00775251 ,1.0489e-007 ,1 ,-7.49223e-009 ,1.10887e-007 ,0.890843 ,-0.187095 ,-0.413998 ,0.890936 ,0 ,-0.454129 ,0.99997 ,-0.00775251 ,1.0489e-007 ,0.890843 ,0.187095 ,0.413999 ,1 ,-7.49223e-009 ,1.10887e-007 ,0.890935 ,0 ,0.45413 ,0.890843 ,0.160445 ,-0.425036 ,0.99997 ,-0.00775251 ,1.0489e-007 ,0.890936 ,0 ,-0.454129 ,1 ,1.6483e-008 ,1.13884e-007 ,0.890843 ,-0.160446 ,0.425037 ,0.890935 ,0 ,0.45413 ,0.99997 ,-0.00775251 ,1.0489e-007 ,1 ,1.6483e-008 ,1.13884e-007 ,0.99997 ,-0.00548189 ,-0.00548174 ,1 ,1.6483e-008 ,1.13884e-007 ,0.890843 ,0.160445 ,-0.425036 ,0.890936 ,0.321118 ,-0.321117 ,0.99997 ,-0.00548189 ,-0.00548174 ,0.890843 ,-0.160446 ,0.425037 ,1 ,1.6483e-008 ,1.13884e-007 ,0.890935 ,-0.321119 ,0.321118 ,0.890844 ,0.413998 ,-0.187093 ,0.99997 ,-0.00548189 ,-0.00548174 ,0.890936 ,0.321118 ,-0.321117 ,1 ,1.19875e-008 ,2.99694e-007 ,0.890843 ,-0.413999 ,0.187094 ,0.890935 ,-0.321119 ,0.321118 ,0.99997 ,-0.00548189 ,-0.00548174 ,1 ,1.19875e-008 ,2.99694e-007 ,1 ,-1.04893e-007 ,-2.48621e-009 ,1 ,1.19875e-008 ,2.99694e-007 ,0.890844 ,0.413998 ,-0.187093 ,0.890936 ,0.454129 ,8.38242e-008 ,1 ,-1.04893e-007 ,-2.48621e-009 ,0.890843 ,-0.413999 ,0.187094 ,1 ,1.19875e-008 ,2.99694e-007 ,0.890935 ,-0.45413 ,-8.50053e-008 ,0.068379 ,0.419691 ,0.905088 ,0.0785872 ,0.368786 ,0.926187 ,0.068379 ,0.419691 ,0.905088 ,0.0785871 ,0.368785 ,0.926186 ,-0.0683789 ,0.419691 ,0.905088 ,-0.0785871 ,0.368786 ,0.926186 ,-0.0683789 ,0.419691 ,0.905088 ,-0.0785871 ,0.368786 ,0.926186 ,0.708743 ,0.61827 ,-0.339744 ,0.708743 ,0.61827 ,-0.339744 ,0.708743 ,-0.61827 ,0.339744 ,0.708743 ,-0.61827 ,0.339744 ,0.708743 ,-0.673878 ,0.20874 ,0.708743 ,-0.673878 ,0.20874 ,0.708743 ,0.673878 ,-0.20874 ,0.708743 ,0.673878 ,-0.20874 ,-0.983523 ,0.0233562 ,0.179268 ,-0.995293 ,-0.0298194 ,-0.0922077 ,-0.994145 ,0.0900013 ,-0.0597891 ,-0.996611 ,0.0423863 ,-0.0705022 ,0.216896 ,0.578988 ,-0.785958 ,0.43759 ,-0.2488 ,-0.864068 ,-0.431291 ,0.00373085 ,-0.902205 ,-0.429586 ,-0.0156904 ,-0.902889 ,-0.934945 ,0.0385318 ,-0.352694 ,-0.942772 ,-0.227459 ,-0.243811 ,-0.96488 ,-0.00433636 ,0.262655 ,-0.911581 ,0.199645 ,0.359391 ,-0.645829 ,0.0122937 ,0.763383 ,-0.100898 ,0.132003 ,0.986101 ,0.0277032 ,-0.0270709 ,0.99925 ,0.932465 ,0.17919 ,0.313689 ,-0.986883 ,0.0318893 ,0.158258 ,-0.945839 ,0.174521 ,-0.273736 ,-0.932061 ,0.356806 ,-0.0628648 ,-0.952544 ,-0.282994 ,-0.112136 ,-0.90796 ,0.41058 ,-0.0838608 ,-0.563761 ,-0.811726 ,0.152558 ,-0.767696 ,0.555687 ,-0.319148 ,-0.585053 ,-0.077485 ,0.807285 ,-0.641746 ,-0.462888 ,0.611471 ,-0.0954938 ,-0.701406 ,0.706336 ,-0.492704 ,-0.541968 ,0.680818 ,-0.298235 ,0.467344 ,-0.832253 ,-0.951336 ,0.0107866 ,-0.307967 ,-0.620755 ,-0.65882 ,0.424993 ,-0.068379 ,0.419691 ,0.905088 ,-0.0785871 ,0.368785 ,0.926186 ,-0.068379 ,0.419691 ,0.905088 ,-0.0785871 ,0.368785 ,0.926187 ,0.0683789 ,0.419691 ,0.905088 ,0.0785872 ,0.368786 ,0.926186 ,0.0683788 ,0.419691 ,0.905088 ,0.0785871 ,0.368786 ,0.926186 ,0.708743 ,0.61827 ,-0.339744 ,0.708743 ,-0.61827 ,0.339744 ,0.708743 ,-0.61827 ,0.339744 ,0.708743 ,0.61827 ,-0.339744 ,0.708743 ,-0.673878 ,0.20874 ,0.708743 ,0.673878 ,-0.20874 ,0.708743 ,0.673878 ,-0.20874 ,0.708743 ,-0.673878 ,0.20874 ,0.994145 ,0.0900013 ,-0.0597891 ,0.995293 ,-0.0298194 ,-0.0922077 ,0.983523 ,0.0233562 ,0.179268 ,0.996611 ,0.0423863 ,-0.0705022 ,-0.36245 ,0.16421 ,0.917423 ,0.504598 ,0.120196 ,0.854947 ,0.216896 ,-0.578988 ,0.785958 ,-0.189575 ,-0.382352 ,0.904361 ,0.96488 ,-0.00433636 ,0.262655 ,0.942772 ,-0.227459 ,-0.243811 ,0.934945 ,0.0385318 ,-0.352694 ,0.911581 ,0.199645 ,0.359391 ,0.0277032 ,0.0270709 ,-0.99925 ,0.118473 ,0.198878 ,-0.972837 ,-0.641801 ,-0.0622252 ,-0.764342 ,0.948483 ,-0.0585825 ,-0.311366 ,0.986883 ,0.0318893 ,0.158258 ,0.945839 ,0.174521 ,-0.273736 ,0.932061 ,0.356806 ,-0.0628648 ,0.952544 ,-0.282994 ,-0.112136 ,0.90796 ,0.41058 ,-0.0838608 ,0.563762 ,-0.811726 ,0.152558 ,0.484208 ,0.165841 ,-0.859092 ,0.767696 ,0.555687 ,-0.319148 ,0.641746 ,-0.462888 ,0.611471 ,0.518429 ,-0.221907 ,-0.825826 ,0.489005 ,0.182961 ,-0.852877 ,0.647626 ,-0.0212846 ,0.761661 ,0.357598 ,0.523894 ,0.773084 ,0.492704 ,-0.541968 ,0.680818 ,0.647591 ,-0.0204639 ,0.761714 ,0.620755 ,-0.65882 ,0.424993 ,0.376435 ,-0.326297 ,0.86708 ,0.475114 ,-0.75496 ,-0.451998 ,0.672894 ,-0.680767 ,0.289432 ,-0.0535424 ,-0.97545 ,-0.213612 ,0.672893 ,-0.680767 ,0.289432 ,-0.0535425 ,-0.97545 ,-0.213612 ,0.886408 ,-0.41067 ,-0.213612 ,0.285178 ,-0.91373 ,0.289432 ,0.886408 ,-0.41067 ,-0.213612 ,0.285178 ,-0.91373 ,0.289432 ,0.56188 ,-0.712689 ,-0.419959 ,0.285178 ,-0.91373 ,0.289432 ,-0.0972898 ,-0.632413 ,0.768497 ,-0.0369874 ,0.867758 ,0.495609 ,0.376435 ,-0.326297 ,0.86708 ,0.105228 ,0.274007 ,0.955953 ,-0.324995 ,-0.656888 ,0.68035 ,0.475114 ,-0.75496 ,-0.451998 ,-0.311712 ,0.302371 ,-0.900781 ,0.291336 ,-0.0357272 ,-0.955954 ,-0.732574 ,0.0214365 ,-0.68035 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.0434482 ,-0.941647 ,-0.333787 ,-0.179728 ,-0.678756 ,-0.712031 ,0.417039 ,-0.479392 ,-0.77218 ,0.179728 ,0.0472697 ,0.98258 ,-0.417039 ,0.22834 ,0.879738 ,-0.179265 ,-0.0690195 ,0.981377 ,0.384997 ,-0.0134101 ,0.922821 ,0.179266 ,-0.845334 ,-0.503263 ,-0.384994 ,-0.765518 ,-0.515521 ,-0.157142 ,-0.695438 ,-0.701194 ,0.444517 ,-0.336757 ,-0.83006 ,0.157139 ,0.108995 ,0.981543 ,-0.444524 ,0.434509 ,0.783327 ,0.190969 ,-0.447951 ,0.873425 ,-0.450923 ,-0.560668 ,0.694493 ,0.190969 ,-0.930799 ,0.311678 ,-0.450922 ,-0.770823 ,0.45 ,1.44839e-008 ,-0.995566 ,0.0940692 ,0 ,-0.995566 ,0.0940691 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,1.6396e-014 ,-1 ,7.85376e-007 ,0.0976033 ,-0.978464 ,0.181886 ,-4.7587e-007 ,-1 ,-2.86677e-006 ,-0.00678098 ,-0.998087 ,0.0614579 ,-0.00918274 ,-0.994446 ,-0.104849 ,-4.24361e-014 ,-1 ,-3.9269e-006 ,4.53467e-007 ,-1 ,-2.35651e-006 ,0.187402 ,-0.972376 ,-0.139159 ,4.53441e-007 ,-1 ,2.59386e-007 ,0.139256 ,-0.9587 ,0.247998 ,-0.00625237 ,-0.998849 ,0.0475553 ,2.0874e-009 ,-1 ,-7.86581e-007 ,2.25751e-008 ,-1 ,-5.10549e-007 ,-0.00744022 ,-0.990636 ,-0.136323 ,0.122105 ,-0.987541 ,-0.0992661 ,1.12098e-014 ,-1 ,7.84268e-007 ,-0.0412873 ,-0.971471 ,0.233535 ,0.338069 ,-0.710914 ,0.616693 ,-0.011539 ,-0.95932 ,-0.282085 ,0.367578 ,-0.733032 ,-0.572321 ,-0.0425017 ,-0.969178 ,0.242669 ,0.343711 ,-0.687496 ,0.639697 ,-0.0120422 ,-0.961368 ,-0.275004 ,0.359886 ,-0.75848 ,-0.543314 ,-0.0412248 ,-0.920523 ,0.388507 ,0.343402 ,-0.293444 ,0.892169 ,0.00672757 ,-0.908086 ,-0.418729 ,0.366398 ,-0.30837 ,-0.877873 ,-0.0411043 ,-0.919153 ,0.391751 ,0.340007 ,-0.290618 ,0.894392 ,0.00689869 ,-0.907531 ,-0.419927 ,0.372315 ,-0.313985 ,-0.873381 ,-0.015669 ,-0.877507 ,0.479308 ,0.154014 ,-0.0448485 ,0.98705 ,0.00758946 ,-0.873186 ,-0.487329 ,0.164712 ,-0.0474187 ,-0.985201 ,-0.0163089 ,-0.878398 ,0.477651 ,0.159387 ,-0.0474551 ,0.986075 ,0.00752302 ,-0.872874 ,-0.487887 ,0.158628 ,-0.0433993 ,-0.986384 ,-0.00924345 ,-0.866137 ,0.499722 ,0.0275777 ,-0.00162037 ,0.999618 ,0.00460346 ,-0.866251 ,-0.499588 ,0.027671 ,-0.000995395 ,-0.999617 ,-0.00924951 ,-0.866202 ,0.499609 ,0.027626 ,-0.00165926 ,0.999617 ,0.0046057 ,-0.866165 ,-0.499737 ,0.0276222 ,-0.00102645 ,-0.999618 ,-1 ,-1.36587e-006 ,5.10809e-006 ,-0.99949 ,0.0159522 ,0.0276739 ,-0.998852 ,0.0478939 ,2.2837e-005 ,-1 ,3.99381e-006 ,1.11241e-006 ,-1 ,1.5251e-007 ,-6.19201e-008 ,-0.999872 ,0.00798293 ,-0.0138362 ,-1 ,-3.22047e-006 ,9.02515e-006 ,-0.99885 ,0.0479518 ,2.95517e-005 ,-1 ,-8.69434e-007 ,-9.52667e-007 ,-0.999489 ,0.0159603 ,0.0276942 ,-0.99885 ,0.0479518 ,1.5975e-005 ,-1 ,-7.47727e-006 ,-1.30883e-005 ,-1 ,-3.16918e-007 ,-2.65759e-006 ,-0.999872 ,0.00798234 ,-0.0138372 ,-1 ,2.37553e-006 ,-7.30022e-006 ,-0.998852 ,0.0478939 ,1.14553e-005 ,3.04998e-011 ,-0.00416861 ,0.999991 ,-1.65891e-007 ,-0.00416854 ,0.999991 ,-4.21933e-008 ,-0.00416847 ,0.999991 ,1.80828e-010 ,-0.00416841 ,0.999991 ,1.39238e-008 ,-0.00416844 ,0.999991 ,0 ,-0.00416841 ,0.999991 ,-1.39238e-008 ,-0.00416844 ,0.999991 ,0 ,-0.00416841 ,0.999991 ,0 ,-0.00416841 ,0.999991 ,1.43457e-008 ,-0.00416846 ,0.999991 ,1.65891e-007 ,-0.00416848 ,0.999991 ,5.40133e-011 ,-0.00416861 ,0.999991 ,1.65891e-007 ,-0.00416893 ,0.999991 ,5.40147e-011 ,-0.00416861 ,0.999991 ,2.06686e-007 ,-0.00416929 ,0.999991 ,-1.80829e-010 ,-0.00416956 ,0.999991 ,-1.80829e-010 ,-0.00416956 ,0.999991 ,-6.88954e-008 ,-0.00416945 ,0.999991 ,6.88955e-008 ,-0.00416945 ,0.999991 ,0 ,-0.00416956 ,0.999991 ,-6.89558e-008 ,-0.00416937 ,0.999991 ,0 ,-0.00416956 ,0.999991 ,-1.6589e-007 ,-0.00416925 ,0.999991 ,3.05005e-011 ,-0.00416861 ,0.999991 ,-0.928935 ,0.0741801 ,-0.362737 ,-1 ,-9.40514e-007 ,4.36815e-014 ,-0.963109 ,-0.144553 ,-0.22699 ,-1 ,0 ,0 ,-1 ,0 ,0 ,-0.927586 ,-0.365025 ,-0.0796325 ,-0.963372 ,-0.223657 ,0.147957 ,-1 ,0 ,0 ,-1 ,0 ,0 ,-0.928935 ,-0.0741779 ,0.362736 ,-0.96311 ,0.144551 ,0.226991 ,-1 ,0 ,0 ,-0.96311 ,0.144551 ,0.226991 ,-1 ,0 ,0 ,-1 ,-2.56885e-013 ,-9.3155e-007 ,-0.927586 ,0.365025 ,0.0796344 ,-0.963372 ,0.223658 ,-0.147957 ,-1 ,-3.28621e-006 ,-3.32301e-006 ,-0.948254 ,-0.0596412 ,-0.311861 ,-0.948962 ,-0.259129 ,-0.179785 ,-0.949292 ,-0.308453 ,0.0608337 ,-0.948625 ,-0.173557 ,0.264553 ,-0.948255 ,0.0596406 ,0.311857 ,-0.948962 ,0.259129 ,0.179788 ,-0.948962 ,0.259129 ,0.179788 ,-0.949292 ,0.308453 ,-0.0608341 ,-0.948625 ,0.173558 ,-0.264552 ,-1 ,-2.81478e-007 ,1.45474e-006 ,-1 ,7.15951e-008 ,-7.76833e-007 ,-1 ,6.79536e-007 ,-3.93036e-007 ,-1 ,2.42972e-007 ,-7.40097e-007 ,-1 ,-2.89744e-007 ,-7.91474e-007 ,-1 ,-4.74714e-007 ,-7.31032e-007 ,-1 ,-4.74714e-007 ,-7.31032e-007 ,-0.948962 ,0.259129 ,0.179788 ,-0.949292 ,0.308453 ,-0.0608341 ,-1 ,-4.74714e-007 ,-7.31032e-007 ,-1 ,-2.76805e-007 ,6.86373e-008 ,-1 ,3.24191e-007 ,2.62185e-007 ,0 ,0.447214 ,0.894427 ,0 ,-0.707107 ,0.707107 ,0.045094 ,-0.739933 ,0.671168 ,-0.416604 ,0.496174 ,0.761743 ,0.477285 ,-0.420095 ,0.771828 ,"NaN" ,"NaN" ,"NaN" ,0 ,-0.447214 ,-0.894427 ,-0.253724 ,-0.817725 ,-0.516671 ,-0.000377874 ,-1 ,0 ,-0.358208 ,-0.812176 ,-0.460497 ,0.014788 ,-0.999346 ,0.0329953 ,-0.298878 ,-0.949236 ,-0.098099 ,0.429968 ,-0.827063 ,0.362069 ,-0.201662 ,-0.954245 ,-0.220793 ,-0.389556 ,0.622092 ,0.679152 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.64015 ,-0.573225 ,-0.511489 ,0.849538 ,0.0582332 ,-0.524303 ,-0.849538 ,-0.0582332 ,0.524303 ,0.64015 ,0.573225 ,0.511489 ,0.405257 ,-0.18912 ,0.894427 ,-0.640768 ,0.299025 ,0.707107 ,-0.000377879 ,-1 ,0 ,0.134769 ,-0.93998 ,-0.313489 ,-0.349667 ,-0.860175 ,0.371258 ,-0.595837 ,-0.7588 ,0.263061 ,-0.331554 ,-0.925707 ,0.182039 ,-0.000220765 ,-0.829085 ,-0.559123 ,2.07438e-007 ,-0.829012 ,-0.559231 ,-0.393391 ,-0.919077 ,0.0232479 ,0.807892 ,-0.556235 ,-0.194712 ,-8.81694e-007 ,-0.829012 ,-0.559231 ,-0.21912 ,-0.442516 ,-0.869578 ,0.110521 ,-0.555334 ,-0.82425 ,-4.41571e-008 ,-0.000739274 ,-1 ,-0.398332 ,-0.128825 ,-0.90815 ,-0.000593292 ,0.00383837 ,-0.999992 ,-0.781175 ,0.383447 ,-0.492681 ,0.362492 ,0.40771 ,-0.838076 ,0 ,0.00514831 ,-0.999987 ,0.00182102 ,0.0031858 ,-0.999993 ,0.527237 ,-0.347745 ,-0.775303 ,-0.00182102 ,0.00294379 ,0.999994 ,-0.527237 ,0.347745 ,0.775303 ,-0.13217 ,0.324215 ,0.936705 ,-1.48986e-009 ,0.00735275 ,0.999973 ,9.89475e-005 ,0.00620474 ,0.999981 ,0.154807 ,0.491034 ,0.857275 ,0.396257 ,0.135158 ,0.908137 ,4.41571e-008 ,0.000739282 ,1 ,0.591718 ,-0.747079 ,-0.302891 ,-0.18785 ,-0.911039 ,0.367044 ,-0.18466 ,-0.914467 ,-0.360072 ,0.602058 ,-0.743119 ,0.292061 ,0.707103 ,-0.707107 ,0.00245314 ,-0.709222 ,-0.704984 ,-0.0012206 ,0.593873 ,-0.747096 ,-0.2986 ,-0.194833 ,-0.910983 ,0.363524 ,-0.17072 ,-0.914411 ,-0.367025 ,0.601011 ,-0.74313 ,0.294184 ,-0.704997 ,-0.709209 ,0.00124256 ,0.707107 ,-0.707107 ,0 ,-0.578621 ,0.577727 ,0.575699 ,0.00144717 ,-0.00028907 ,0.999999 ,0.236912 ,0.23429 ,0.942858 ,-0.00346923 ,-3.01123e-008 ,0.999994 ,0 ,0 ,-1 ,0.233652 ,0.235057 ,-0.94348 ,0.000862149 ,-0.000867333 ,-0.999999 ,-0.572751 ,0.579636 ,-0.579636 ,0.00751858 ,-0.95304 ,0.302751 ,0 ,-0.873499 ,0.486826 ,0 ,-0.902319 ,-0.43107 ,-0.0714406 ,-0.836045 ,-0.543991 ,-0.0105074 ,-0.986739 ,0.161974 ,-0.0439428 ,-0.711914 ,-0.70089 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,-0.0541128 ,0.257088 ,0.964872 ,-1.40811e-007 ,0.460485 ,0.887667 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0.112093 ,-0.0159927 ,0.993569 ,0.101435 ,0.109831 ,0.988761 ,0.179656 ,0.26862 ,0.946344 ,0.00928401 ,0.0285578 ,0.999549 ,0.34336 ,0.0792732 ,0.935852 ,0.0485403 ,0.47057 ,0.881027 ,-9.95781e-008 ,0.341028 ,0.940053 ,-0.0262054 ,0.331954 ,0.942932 ,-0.00144248 ,0.411131 ,0.911575 ,-0.0786219 ,0.821535 ,0.564712 ,0.000688533 ,0.902318 ,0.43107 ,-0.19477 ,-0.796505 ,0.572403 ,-0.0101894 ,-0.785117 ,0.619264 ,-0.0889155 ,-0.995997 ,-0.00913129 ,-0.265828 ,-0.901133 ,-0.342483 ,-0.221427 ,-0.305938 ,0.925944 ,-0.029743 ,0.0276108 ,0.999176 ,0.0487038 ,-0.111506 ,0.99257 ,0 ,1.97762e-007 ,1 ,0.027699 ,-0.084837 ,0.99601 ,0.00455985 ,-0.0146535 ,0.999882 ,-0.0131139 ,0.0312149 ,0.999427 ,0 ,-9.33754e-008 ,1 ,0.0378945 ,-0.0761685 ,0.996375 ,-0.019452 ,-0.00993628 ,0.999761 ,0.131703 ,0.0639368 ,0.989225 ,-0.138493 ,-0.0842195 ,0.986776 ,0.00349707 ,-0.0126157 ,0.999914 ,-0.00189662 ,-0.00115723 ,0.999998 ,-0.0932494 ,0.200658 ,0.975213 ,0.184911 ,0.0824887 ,0.979287 ,0.366999 ,-0.106443 ,0.924111 ,0.0298082 ,0.00967327 ,0.999509 ,-0.0585932 ,0.115214 ,0.991611 ,0.00940561 ,0.00285849 ,0.999952 ,-0.0166786 ,0.0457884 ,0.998812 ,-0.00160239 ,-0.000371486 ,0.999999 ,-0.105282 ,0.301973 ,0.947485 ,-0.761491 ,-0.0703961 ,0.644342 ,-0.165134 ,0.235988 ,0.957622 ,0.027699 ,-0.084837 ,0.99601 ,-0.000269095 ,-0.0109763 ,0.99994 ,-0.00262008 ,-0.0720116 ,0.9974 ,0.0487038 ,-0.111506 ,0.99257 ,0.00455985 ,-0.0146535 ,0.999882 ,-5.08837e-005 ,-0.00274336 ,0.999996 ,-0.0131139 ,0.0312149 ,0.999427 ,-0.0165575 ,0.163595 ,0.986389 ,-0.00241493 ,-0.0613622 ,0.998113 ,0.0378945 ,-0.0761685 ,0.996375 ,-0.00366731 ,-0.0408081 ,0.99916 ,0.00162364 ,-0.200309 ,0.979732 ,-0.000825477 ,0.411551 ,0.911386 ,0.0419145 ,0.24215 ,0.969333 ,0.0318434 ,-0.348515 ,0.936762 ,0.00302969 ,-0.402577 ,0.915381 ,-0.002882 ,-0.0500721 ,0.998741 ,0.00349707 ,-0.0126157 ,0.999914 ,0.0253632 ,-0.0458126 ,0.998628 ,0.00217587 ,0.0317617 ,0.999493 ,0.0478437 ,-0.0151964 ,0.998739 ,-0.0932494 ,0.200658 ,0.975213 ,0.00599234 ,0.236392 ,0.971639 ,0.0321798 ,0.394025 ,0.918536 ,0.0113091 ,0.651621 ,0.758461 ,-0.0248735 ,0.319871 ,0.947134 ,0.0866838 ,0.316656 ,0.944571 ,0.149011 ,0.778708 ,0.609434 ,0.742056 ,0.470408 ,0.477566 ,0.488554 ,0.839089 ,0.239261 ,0.0383749 ,0.258135 ,0.965346 ,0.393471 ,-0.173445 ,0.902828 ,-0.0131114 ,0.363612 ,0.931458 ,-0.0038073 ,0.112658 ,0.993627 ,-0.0585932 ,0.115214 ,0.991611 ,-0.0093968 ,0.249515 ,0.968325 ,-0.000537778 ,0.0752893 ,0.997162 ,-0.000500418 ,0.0354369 ,0.999372 ,-0.0166786 ,0.0457884 ,0.998812 ,-0.00957175 ,0.173568 ,0.984775 ,-0.0593207 ,-0.344523 ,0.936902 ,-0.00127604 ,-0.00177759 ,0.999998 ,0.00116785 ,0.336955 ,0.94152 ,-0.0114275 ,0.709425 ,0.704688 ,-0.390535 ,-0.832841 ,0.392249 ,-0.0105074 ,-0.986739 ,0.161974 ,-0.757397 ,-0.108563 ,0.643867 ,-0.31269 ,0.930625 ,0.190164 ,-0.0549957 ,0.986532 ,-0.154047 ,0.366999 ,-0.106443 ,0.924111 ,-0.165134 ,0.235988 ,0.957622 ,0.0052971 ,-0.00628658 ,0.999966 ,5.04432e-008 ,3.38268e-008 ,1 ,0 ,0 ,1 ,0.0347242 ,-0.0377523 ,0.998684 ,0.00131136 ,-0.00168028 ,0.999998 ,0 ,0 ,1 ,-0.113022 ,0.0936855 ,0.989166 ,-0.241869 ,0.130678 ,0.961469 ,0 ,0 ,1 ,0.0294955 ,-0.0293093 ,0.999135 ,0 ,0 ,1 ,0.0232234 ,-0.0204214 ,0.999522 ,0.112093 ,-0.0159927 ,0.993569 ,0.0839063 ,0.0198096 ,0.996277 ,0.0247243 ,0.186474 ,0.982149 ,-0.241754 ,0.190759 ,0.951402 ,0.868618 ,0.0299246 ,0.494578 ,0.869311 ,-0.0155158 ,0.494022 ,0.985306 ,0.0162614 ,0.170025 ,-0.221427 ,-0.305938 ,0.925944 ,-0.208408 ,0.163367 ,0.964302 ,0.293651 ,0.0420359 ,0.954988 ,-0.19477 ,-0.796505 ,0.572403 ,-0.111427 ,-0.993634 ,-0.016601 ,-0.319004 ,0.0821197 ,0.944189 ,-0.392216 ,0.203306 ,0.897125 ,-0.172058 ,0.11462 ,0.978396 ,-0.378857 ,0.158856 ,0.911719 ,-0.705755 ,0.461539 ,0.537486 ,-0.881763 ,0.289715 ,0.372236 ,0.127806 ,-0.598971 ,-0.790506 ,0.107136 ,-0.472548 ,-0.874769 ,1.912e-006 ,-0.850923 ,-0.52529 ,0 ,-0.697899 ,-0.716196 ,0.00197712 ,-0.0501494 ,0.99874 ,-0.00142623 ,-0.386953 ,0.922098 ,-0.00061527 ,-0.327821 ,0.94474 ,-0.00798393 ,-0.516969 ,0.855967 ,0.0617016 ,0.587756 ,0.806682 ,0 ,0.697899 ,0.716196 ,-2.12914e-007 ,-0.189077 ,0.981962 ,-0.00104704 ,0.054408 ,0.998518 ,0.00128561 ,0.619373 ,0.785096 ,0.00795702 ,0.665163 ,0.746656 ,0.000520645 ,0.850923 ,0.52529 ,0.00726214 ,0.469696 ,0.882798 ,0.0624906 ,0.944397 ,0.322816 ,0.0455381 ,0.998943 ,0.00629 ,0.00217587 ,0.0317617 ,0.999493 ,0.00302969 ,-0.402577 ,0.915381 ,0.00599234 ,0.236392 ,0.971639 ,0.0113091 ,0.651621 ,0.758461 ,0.488554 ,0.839089 ,0.239261 ,0.33508 ,0.930605 ,0.147293 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.0172031 ,-0.451674 ,0.892017 ,6.80049e-007 ,-0.679163 ,0.733988 ,2.9565e-008 ,0.282471 ,0.959276 ,-0.0404551 ,0.462009 ,0.885952 ,-0.00798393 ,-0.516969 ,0.855967 ,-0.00061527 ,-0.327821 ,0.94474 ,-7.94018e-008 ,0.632296 ,0.774727 ,0.00814254 ,0.490897 ,0.87118 ,0.00162364 ,-0.200309 ,0.979732 ,-0.000825477 ,0.411551 ,0.911386 ,0.00302969 ,-0.402577 ,0.915381 ,0.0401104 ,-0.412421 ,0.91011 ,-0.0131114 ,0.363612 ,0.931458 ,0.00814254 ,0.490897 ,0.87118 ,-7.94018e-008 ,0.632296 ,0.774727 ,0.000175404 ,0.143642 ,0.98963 ,-0.000194238 ,0.120108 ,0.992761 ,0.000361616 ,-0.15426 ,0.98803 ,-0.00918028 ,-0.344357 ,0.938794 ,0 ,-0.873499 ,0.486826 ,0.00751858 ,-0.95304 ,0.302751 ,-0.0131114 ,0.363612 ,0.931458 ,-0.000537778 ,0.0752893 ,0.997162 ,-0.0593207 ,-0.344523 ,0.936902 ,-0.0105074 ,-0.986739 ,0.161974 ,0.376435 ,-0.326297 ,0.86708 ,0.475114 ,-0.75496 ,-0.451998 ,0.672894 ,-0.680767 ,0.289432 ,-0.0535424 ,-0.97545 ,-0.213612 ,0.672893 ,-0.680767 ,0.289432 ,-0.0535425 ,-0.97545 ,-0.213612 ,0.886408 ,-0.41067 ,-0.213612 ,0.285178 ,-0.91373 ,0.289432 ,0.886408 ,-0.41067 ,-0.213612 ,0.285178 ,-0.91373 ,0.289432 ,0.56188 ,-0.712689 ,-0.419959 ,0.285178 ,-0.91373 ,0.289432 ,-0.0972898 ,-0.632413 ,0.768497 ,-0.0369874 ,0.867758 ,0.495609 ,0.376435 ,-0.326297 ,0.86708 ,0.105228 ,0.274007 ,0.955953 ,-0.324995 ,-0.656888 ,0.68035 ,0.475114 ,-0.75496 ,-0.451998 ,-0.311712 ,0.302371 ,-0.900781 ,0.291336 ,-0.0357272 ,-0.955954 ,-0.732574 ,0.0214365 ,-0.68035 ,-1.17824e-009 ,-0.890103 ,-0.45576 ,0.0863506 ,-0.951254 ,-0.296072 ,-3.25394e-007 ,-0.890102 ,-0.455762 ,-0.00690504 ,-0.914366 ,-0.404829 ,-0.0116145 ,-0.839481 ,-0.543265 ,0 ,-0.890101 ,-0.455762 ,2.75443e-007 ,-0.890102 ,-0.455762 ,0.168797 ,-0.804975 ,-0.568791 ,2.75427e-007 ,-0.890103 ,-0.45576 ,0.123315 ,-0.964391 ,-0.233972 ,-0.0062414 ,-0.909179 ,-0.41636 ,-1.01367e-008 ,-0.890102 ,-0.455761 ,1.82461e-008 ,-0.890102 ,-0.455761 ,-0.0104442 ,-0.822519 ,-0.568641 ,0.109447 ,-0.835271 ,-0.538835 ,-1.17824e-009 ,-0.890103 ,-0.45576 ,-0.040652 ,-0.966775 ,-0.252375 ,0.304925 ,-0.936453 ,0.173426 ,-0.0181537 ,-0.729273 ,-0.683981 ,0.3499 ,-0.414959 ,-0.839869 ,-0.04185 ,-0.96887 ,-0.244008 ,0.311185 ,-0.928639 ,0.201975 ,-0.0185824 ,-0.734402 ,-0.678461 ,0.34084 ,-0.450125 ,-0.825358 ,-0.0404774 ,-0.993827 ,-0.103298 ,0.344309 ,-0.728213 ,0.592586 ,0.00409827 ,-0.615558 ,-0.788081 ,0.387176 ,0.113164 ,-0.915035 ,-0.0404289 ,-0.994156 ,-0.1001 ,0.341395 ,-0.727121 ,0.595604 ,0.0044418 ,-0.614254 ,-0.789096 ,0.393499 ,0.105326 ,-0.913272 ,-0.015518 ,-0.999853 ,-0.00722333 ,0.17509 ,-0.542238 ,0.82178 ,0.00854592 ,-0.544748 ,-0.838556 ,0.190125 ,0.437889 ,-0.878696 ,-0.0161542 ,-0.999828 ,-0.00908857 ,0.180732 ,-0.544578 ,0.819006 ,0.00849429 ,-0.544115 ,-0.838967 ,0.18337 ,0.442853 ,-0.877643 ,-0.0090645 ,-0.999825 ,0.0163918 ,0.032635 ,-0.500829 ,0.864931 ,0.00552107 ,-0.530208 ,-0.84785 ,0.03277 ,0.497754 ,-0.866699 ,-0.0090701 ,-0.999827 ,0.0162688 ,0.0326919 ,-0.500851 ,0.864916 ,0.00552396 ,-0.530051 ,-0.847948 ,0.0327124 ,0.497741 ,-0.866709 ,-1 ,-3.47581e-006 ,3.9545e-006 ,-0.999425 ,0.000542307 ,0.0338938 ,-0.998516 ,0.0471658 ,0.0272091 ,-1 ,4.00754e-006 ,3.47623e-006 ,-1 ,4.1005e-007 ,-4.77067e-008 ,-0.999829 ,0.0156802 ,-0.00980156 ,-1 ,-8.26652e-006 ,6.81703e-006 ,-0.998513 ,0.0472193 ,0.0272484 ,-1 ,2.94654e-009 ,-1.44001e-006 ,-0.999425 ,0.000539843 ,0.0339153 ,-0.998513 ,0.0472269 ,0.0272353 ,-1 ,-5.76512e-007 ,-1.60298e-005 ,-1 ,2.13516e-006 ,-2.5418e-006 ,-0.999829 ,0.0156811 ,-0.00980176 ,-1 ,6.95161e-006 ,-5.26594e-006 ,-0.998516 ,0.0471719 ,0.0271987 ,-0.000220812 ,-0.829085 ,-0.559123 ,1.74899e-007 ,-0.829012 ,-0.559231 ,-0.393391 ,-0.919077 ,0.0232481 ,0.807892 ,-0.556235 ,-0.194712 ,-8.87842e-007 ,-0.829012 ,-0.559231 ,-0.21912 ,-0.442516 ,-0.869578 ,0.110521 ,-0.555334 ,-0.82425 ,1.41488e-012 ,-0.000739274 ,-1 ,-0.398332 ,-0.128825 ,-0.90815 ,-0.000593273 ,0.00383836 ,-0.999992 ,-0.781174 ,0.383447 ,-0.492681 ,0.362492 ,0.40771 ,-0.838076 ,0 ,0.00514831 ,-0.999987 ,0.001821 ,0.0031858 ,-0.999993 ,0.527237 ,-0.347746 ,-0.775303 ,-0.001821 ,0.00294379 ,0.999994 ,-0.527237 ,0.347746 ,0.775303 ,-0.13217 ,0.324216 ,0.936705 ,-1.09256e-009 ,0.00735275 ,0.999973 ,9.89354e-005 ,0.00620474 ,0.999981 ,0.154807 ,0.491034 ,0.857275 ,0.396257 ,0.135158 ,0.908137 ,-1.41659e-012 ,0.000739282 ,1 ,0.000417634 ,0.447214 ,0.894427 ,0.000468588 ,-0.603758 ,0.797167 ,0.0450911 ,-0.676704 ,0.734873 ,-0.418559 ,0.483629 ,0.768707 ,0.475755 ,-0.408176 ,0.779134 ,"NaN" ,"NaN" ,"NaN" ,0.000685749 ,-0.447214 ,-0.894427 ,-0.253491 ,-0.817725 ,-0.516786 ,-0.000141237 ,-1 ,0 ,-0.366401 ,-0.81369 ,-0.451286 ,0.014956 ,-0.99932 ,0.0336964 ,-0.29731 ,-0.950083 ,-0.0945957 ,0.433887 ,-0.829404 ,0.351898 ,-0.201662 ,-0.954245 ,-0.220793 ,-0.389556 ,0.622092 ,0.679152 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.738592 ,-0.346601 ,-0.578229 ,0.845857 ,0.0583779 ,-0.530205 ,-0.845857 ,-0.0583779 ,0.530205 ,0.738592 ,0.346601 ,0.578229 ,0.296538 ,-0.215382 ,0.930417 ,-0.640768 ,0.299025 ,0.707107 ,-0.00253074 ,-0.963808 ,0.266584 ,0.181859 ,-0.967686 ,-0.174673 ,-0.354936 ,-0.861714 ,0.362586 ,-0.595517 ,-0.762192 ,0.253815 ,-0.245964 ,-0.750116 ,0.613863 ,-0.928935 ,0.07418 ,-0.362737 ,-1 ,-9.40514e-007 ,4.36815e-014 ,-0.963109 ,-0.144553 ,-0.22699 ,-1 ,0 ,0 ,-1 ,0 ,0 ,-0.927586 ,-0.365025 ,-0.0796323 ,-0.963372 ,-0.223657 ,0.147957 ,-1 ,0 ,0 ,-1 ,0 ,0 ,-0.928935 ,-0.074178 ,0.362736 ,-0.96311 ,0.144551 ,0.226991 ,-1 ,0 ,0 ,-0.96311 ,0.144551 ,0.226991 ,-1 ,0 ,0 ,-1 ,0 ,-9.31549e-007 ,-0.927586 ,0.365025 ,0.0796346 ,-0.963372 ,0.223658 ,-0.147957 ,-1 ,-3.28621e-006 ,-3.32301e-006 ,-0.948254 ,-0.0596413 ,-0.311861 ,-0.948962 ,-0.25913 ,-0.179785 ,-0.949292 ,-0.308453 ,0.060834 ,-0.948625 ,-0.173557 ,0.264553 ,-0.948255 ,0.0596406 ,0.311857 ,-0.948962 ,0.259129 ,0.179788 ,-0.948962 ,0.259129 ,0.179788 ,-0.949292 ,0.308453 ,-0.0608337 ,-0.948625 ,0.173558 ,-0.264552 ,-1 ,-2.8854e-007 ,1.84129e-006 ,-1 ,6.69743e-008 ,-7.06787e-007 ,-1 ,7.07126e-007 ,-1.7757e-007 ,-1 ,2.1936e-007 ,-6.38166e-007 ,-1 ,-2.93299e-007 ,-5.98197e-007 ,-1 ,-4.78313e-007 ,-6.62415e-007 ,-1 ,-4.78313e-007 ,-6.62415e-007 ,-0.948962 ,0.259129 ,0.179788 ,-0.949292 ,0.308453 ,-0.0608337 ,-1 ,-4.78313e-007 ,-6.62415e-007 ,-1 ,-2.49759e-007 ,2.79847e-007 ,-1 ,2.76966e-007 ,4.66036e-007 ,-0.672894 ,-0.680767 ,0.289432 ,-0.475114 ,-0.75496 ,-0.451998 ,-0.376435 ,-0.326297 ,0.86708 ,0.0535425 ,-0.97545 ,-0.213612 ,-0.886408 ,-0.41067 ,-0.213612 ,0.0535425 ,-0.97545 ,-0.213612 ,-0.672893 ,-0.680767 ,0.289432 ,-0.285178 ,-0.91373 ,0.289432 ,-0.56188 ,-0.712689 ,-0.419959 ,-0.285178 ,-0.91373 ,0.289432 ,-0.886408 ,-0.41067 ,-0.213612 ,0.0972898 ,-0.632413 ,0.768497 ,-0.285178 ,-0.91373 ,0.289432 ,-0.105228 ,0.274007 ,0.955953 ,-0.376435 ,-0.326297 ,0.86708 ,0.0369874 ,0.867758 ,0.495609 ,0.324995 ,-0.656888 ,0.68035 ,-0.291336 ,-0.0357272 ,-0.955954 ,0.311712 ,0.302371 ,-0.900781 ,-0.475114 ,-0.75496 ,-0.451998 ,0.732574 ,0.0214365 ,-0.68035 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.0154838 ,-0.994405 ,-0.104497 ,-3.76609e-009 ,-0.992586 ,0.121541 ,-3.96372e-008 ,-0.992586 ,0.121541 ,-0.0434482 ,-0.941647 ,-0.333787 ,0.179728 ,-0.678756 ,-0.712031 ,-0.417039 ,-0.479392 ,-0.77218 ,0.179265 ,-0.0690195 ,0.981377 ,0.417039 ,0.22834 ,0.879738 ,-0.179728 ,0.0472697 ,0.98258 ,-0.384997 ,-0.0134101 ,0.922821 ,0.157142 ,-0.695438 ,-0.701194 ,0.384994 ,-0.765518 ,-0.515521 ,-0.179266 ,-0.845334 ,-0.503263 ,-0.444517 ,-0.336757 ,-0.83006 ,-0.190969 ,-0.447951 ,0.873425 ,0.444524 ,0.434509 ,0.783327 ,-0.157139 ,0.108995 ,0.981543 ,"NaN" ,"NaN" ,"NaN" ,0.450922 ,-0.770823 ,0.45 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,4.75921e-007 ,-1 ,-2.86674e-006 ,-0.0976033 ,-0.978464 ,0.181886 ,-1.12101e-014 ,-1 ,7.84268e-007 ,0.00678098 ,-0.998087 ,0.0614579 ,0.00918275 ,-0.994446 ,-0.104849 ,4.01573e-010 ,-1 ,-3.92713e-006 ,-4.53467e-007 ,-1 ,-2.35799e-006 ,-0.187402 ,-0.972376 ,-0.139159 ,0.00625237 ,-0.998849 ,0.0475553 ,-0.139256 ,-0.9587 ,0.247998 ,-4.53441e-007 ,-1 ,2.61055e-007 ,2.12178e-014 ,-1 ,-7.85376e-007 ,-2.2767e-008 ,-1 ,-5.10438e-007 ,0.00744022 ,-0.990636 ,-0.136323 ,-0.122105 ,-0.987541 ,-0.0992661 ,-1.6396e-014 ,-1 ,7.85376e-007 ,0.0412873 ,-0.971472 ,0.233535 ,-0.338069 ,-0.710914 ,0.616693 ,0.0115391 ,-0.95932 ,-0.282085 ,-0.367578 ,-0.733032 ,-0.572321 ,0.0425017 ,-0.969178 ,0.242669 ,-0.343711 ,-0.687496 ,0.639697 ,0.0120422 ,-0.961368 ,-0.275003 ,-0.359886 ,-0.75848 ,-0.543314 ,0.0412248 ,-0.920523 ,0.388507 ,-0.343402 ,-0.293444 ,0.892169 ,-0.00672757 ,-0.908087 ,-0.418729 ,-0.366398 ,-0.30837 ,-0.877873 ,0.0411043 ,-0.919153 ,0.391751 ,-0.340007 ,-0.290618 ,0.894392 ,-0.00689869 ,-0.907531 ,-0.419927 ,-0.372315 ,-0.313985 ,-0.873381 ,0.015669 ,-0.877507 ,0.479308 ,-0.154014 ,-0.0448485 ,0.98705 ,-0.00758947 ,-0.873186 ,-0.487329 ,-0.164712 ,-0.0474187 ,-0.985201 ,0.0163089 ,-0.878398 ,0.477651 ,-0.159387 ,-0.0474551 ,0.986075 ,-0.00752302 ,-0.872874 ,-0.487887 ,-0.158628 ,-0.0433993 ,-0.986384 ,0.00924347 ,-0.866137 ,0.499722 ,-0.0275777 ,-0.00162037 ,0.999618 ,-0.00460349 ,-0.866251 ,-0.499588 ,-0.027671 ,-0.000995395 ,-0.999617 ,0.0092495 ,-0.866202 ,0.499609 ,-0.027626 ,-0.00165926 ,0.999617 ,-0.00460571 ,-0.866165 ,-0.499737 ,-0.0276221 ,-0.00102645 ,-0.999618 ,0.998852 ,0.0478939 ,2.28377e-005 ,0.99949 ,0.0159522 ,0.0276739 ,1 ,-1.36753e-006 ,5.10953e-006 ,1 ,3.99357e-006 ,1.11115e-006 ,0.999872 ,0.00798293 ,-0.0138362 ,1 ,1.54003e-007 ,-6.14032e-008 ,0.99885 ,0.0479518 ,2.95514e-005 ,1 ,-3.22047e-006 ,9.0251e-006 ,0.99885 ,0.0479518 ,1.59752e-005 ,0.999489 ,0.0159603 ,0.0276942 ,1 ,-8.70488e-007 ,-9.51755e-007 ,1 ,-7.47731e-006 ,-1.30885e-005 ,0.999872 ,0.00798234 ,-0.0138372 ,1 ,-3.15864e-007 ,-2.65722e-006 ,0.998852 ,0.0478939 ,1.14573e-005 ,1 ,2.37574e-006 ,-7.29914e-006 ,4.26152e-008 ,-0.00416847 ,0.999991 ,1.65891e-007 ,-0.00416855 ,0.999991 ,-3.04971e-011 ,-0.00416861 ,0.999991 ,0 ,-0.00416841 ,0.999991 ,1.39238e-008 ,-0.00416844 ,0.999991 ,0 ,-0.00416841 ,0.999991 ,-1.39238e-008 ,-0.00416844 ,0.999991 ,0 ,-0.00416841 ,0.999991 ,-1.65891e-007 ,-0.00416848 ,0.999991 ,-1.39841e-008 ,-0.00416846 ,0.999991 ,3.61656e-010 ,-0.00416841 ,0.999991 ,-5.40147e-011 ,-0.00416861 ,0.999991 ,-2.06807e-007 ,-0.00416929 ,0.999991 ,-5.4016e-011 ,-0.00416861 ,0.999991 ,-1.65891e-007 ,-0.00416893 ,0.999991 ,1.80829e-010 ,-0.00416956 ,0.999991 ,-6.88955e-008 ,-0.00416945 ,0.999991 ,6.88954e-008 ,-0.00416945 ,0.999991 ,1.80829e-010 ,-0.00416956 ,0.999991 ,0 ,-0.00416956 ,0.999991 ,1.6589e-007 ,-0.00416925 ,0.999991 ,0 ,-0.00416956 ,0.999991 ,6.88955e-008 ,-0.00416937 ,0.999991 ,-3.04998e-011 ,-0.00416861 ,0.999991 ,0.963109 ,-0.144553 ,-0.22699 ,1 ,-9.3897e-007 ,4.36815e-014 ,0.928935 ,0.0741801 ,-0.362737 ,1 ,0 ,0 ,1 ,0 ,0 ,0.927586 ,-0.365025 ,-0.0796325 ,0.963372 ,-0.223657 ,0.147957 ,1 ,0 ,0 ,1 ,0 ,0 ,0.928935 ,-0.0741779 ,0.362736 ,0.96311 ,0.144551 ,0.226991 ,1 ,0 ,0 ,1 ,-2.56885e-013 ,-9.36472e-007 ,1 ,0 ,0 ,0.96311 ,0.144551 ,0.226991 ,0.927586 ,0.365025 ,0.0796344 ,0.963372 ,0.223658 ,-0.147957 ,1 ,-3.29295e-006 ,-3.32983e-006 ,0.948254 ,-0.0596413 ,-0.311861 ,0.948962 ,-0.259129 ,-0.179785 ,0.949292 ,-0.308453 ,0.0608337 ,0.948625 ,-0.173557 ,0.264553 ,0.948255 ,0.0596406 ,0.311857 ,0.948962 ,0.25913 ,0.179788 ,0.948962 ,0.25913 ,0.179788 ,0.949292 ,0.308453 ,-0.0608341 ,0.948625 ,0.173558 ,-0.264552 ,1 ,-2.80179e-007 ,1.45455e-006 ,1 ,7.15551e-008 ,-7.76777e-007 ,1 ,6.79976e-007 ,-3.89599e-007 ,1 ,2.4414e-007 ,-7.39162e-007 ,1 ,-2.89895e-007 ,-7.91451e-007 ,1 ,-4.75189e-007 ,-7.30368e-007 ,0.949292 ,0.308453 ,-0.0608341 ,0.948962 ,0.25913 ,0.179788 ,1 ,-4.75189e-007 ,-7.30368e-007 ,1 ,-2.77171e-007 ,6.578e-008 ,1 ,-4.75189e-007 ,-7.30368e-007 ,1 ,3.2386e-007 ,2.61919e-007 ,0.194781 ,0.707682 ,-0.679151 ,0 ,0.707107 ,-0.707107 ,0 ,-0.447214 ,-0.894427 ,-0.223492 ,-0.209702 ,0.951881 ,-0.477285 ,-0.420096 ,0.771828 ,0.416604 ,0.496174 ,0.761743 ,0.000377879 ,-1 ,0 ,0.13015 ,-0.810231 ,-0.571478 ,-0.014788 ,-0.999346 ,0.0329953 ,0.358208 ,-0.812175 ,-0.460497 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.201662 ,-0.954245 ,-0.220793 ,0.477286 ,0.420094 ,-0.771828 ,-0.389556 ,-0.622092 ,-0.679152 ,0.389557 ,0.622091 ,0.679152 ,-0.279512 ,-0.0974885 ,-0.95518 ,"NaN" ,"NaN" ,"NaN" ,-0.416603 ,-0.496174 ,-0.761743 ,"NaN" ,"NaN" ,"NaN" ,-0.64015 ,0.573225 ,0.511489 ,0.390499 ,-0.34033 ,0.855387 ,0.849538 ,-0.0582332 ,0.524303 ,0.405257 ,0.18912 ,-0.894427 ,0.64015 ,-0.573225 ,-0.511489 ,-0.849538 ,0.0582332 ,-0.524303 ,-0.640768 ,-0.299025 ,-0.707107 ,0 ,-0.707107 ,0.707107 ,0.156142 ,-0.755801 ,0.635912 ,0.000377874 ,-1 ,0 ,0.349667 ,-0.860175 ,0.371258 ,-0.134769 ,-0.93998 ,-0.313489 ,0.595837 ,-0.7588 ,0.263061 ,-0.228496 ,-0.961624 ,-0.151883 ,0.331554 ,-0.925707 ,0.182039 ,0.393391 ,-0.919077 ,0.0232479 ,-2.15573e-007 ,-0.829012 ,-0.559231 ,0.000220765 ,-0.829085 ,-0.559123 ,-0.807892 ,-0.556235 ,-0.194712 ,8.71665e-007 ,-0.829012 ,-0.559231 ,0.0803752 ,-0.40223 ,-0.912004 ,-0.0445054 ,-0.543124 ,-0.838472 ,-0.000593291 ,-0.00383837 ,0.999992 ,-0.398332 ,0.128825 ,0.90815 ,-4.41571e-008 ,0.000739273 ,1 ,-0.781175 ,-0.383447 ,0.492681 ,0.362492 ,-0.40771 ,0.838076 ,3.53718e-010 ,-0.00514831 ,0.999987 ,0.00182102 ,-0.0031858 ,0.999993 ,0.527237 ,0.347745 ,0.775303 ,-0.132834 ,-0.323941 ,-0.936706 ,-0.527237 ,-0.347745 ,-0.775303 ,-0.00182102 ,-0.00294378 ,-0.999994 ,-2.97972e-010 ,-0.00735275 ,-0.999973 ,9.89478e-005 ,-0.00620474 ,-0.999981 ,0.0803752 ,-0.40223 ,-0.912004 ,-0.0445054 ,-0.543124 ,-0.838472 ,0.396257 ,-0.135158 ,-0.908137 ,0.154807 ,-0.491034 ,-0.857275 ,4.41571e-008 ,-0.000739274 ,-1 ,0.18466 ,-0.914467 ,-0.360072 ,0.187849 ,-0.911039 ,0.367044 ,-0.591718 ,-0.747079 ,-0.302891 ,-0.602058 ,-0.743119 ,0.292061 ,-0.593873 ,-0.747096 ,-0.2986 ,0.709222 ,-0.704984 ,-0.0012206 ,-0.707103 ,-0.707107 ,0.00245314 ,0.194833 ,-0.910983 ,0.363524 ,0.704997 ,-0.709209 ,0.00124256 ,-0.601011 ,-0.74313 ,0.294184 ,0.17072 ,-0.914411 ,-0.367025 ,-0.707107 ,-0.707107 ,0 ,-0.236912 ,0.23429 ,0.942858 ,-0.00144717 ,-0.000289069 ,0.999999 ,0.578621 ,0.577727 ,0.575699 ,0.00346926 ,0 ,0.999994 ,-0.000862149 ,-0.000867333 ,-0.999999 ,-0.233652 ,0.235057 ,-0.94348 ,0 ,0 ,-1 ,0.572751 ,0.579636 ,-0.579636 ,0 ,-0.902319 ,-0.43107 ,0 ,-0.873499 ,0.486826 ,-0.00751858 ,-0.95304 ,0.302751 ,0.0714406 ,-0.836045 ,-0.543991 ,0.0105074 ,-0.986739 ,0.161974 ,0.0439428 ,-0.711914 ,-0.70089 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,1.40811e-007 ,0.460485 ,0.887667 ,0.0541128 ,0.257088 ,0.964872 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,1 ,-0.112093 ,-0.0159927 ,0.993569 ,-0.101435 ,0.109831 ,0.988761 ,-0.179656 ,0.26862 ,0.946344 ,-0.00928401 ,0.0285578 ,0.999549 ,-0.34336 ,0.0792732 ,0.935852 ,9.95781e-008 ,0.341028 ,0.940053 ,-0.0485403 ,0.47057 ,0.881027 ,0.00144246 ,0.411131 ,0.911575 ,0.0262054 ,0.331954 ,0.942932 ,-0.000688597 ,0.902318 ,0.43107 ,0.0786219 ,0.821535 ,0.564712 ,0.0889155 ,-0.995997 ,-0.00913129 ,0.0101894 ,-0.785117 ,0.619264 ,0.19477 ,-0.796505 ,0.572403 ,0.265828 ,-0.901133 ,-0.342483 ,0.029743 ,0.0276108 ,0.999176 ,0.221427 ,-0.305938 ,0.925944 ,-0.027699 ,-0.084837 ,0.99601 ,0 ,1.98636e-007 ,1 ,-0.0487038 ,-0.111506 ,0.99257 ,-0.00455985 ,-0.0146535 ,0.999882 ,0.0131139 ,0.0312149 ,0.999427 ,0 ,-8.92106e-008 ,1 ,0.019452 ,-0.00993628 ,0.999761 ,-0.0378945 ,-0.0761685 ,0.996375 ,-0.131703 ,0.0639368 ,0.989225 ,0.138493 ,-0.0842195 ,0.986776 ,0.00189662 ,-0.00115724 ,0.999998 ,-0.00349707 ,-0.0126157 ,0.999914 ,-0.184911 ,0.0824887 ,0.979287 ,0.0932494 ,0.200658 ,0.975213 ,-0.366999 ,-0.106443 ,0.924111 ,-0.0298082 ,0.00967327 ,0.999509 ,0.0585932 ,0.115214 ,0.991611 ,-0.00940561 ,0.00285849 ,0.999952 ,0.0166786 ,0.0457884 ,0.998812 ,0.00160239 ,-0.000371487 ,0.999999 ,0.105282 ,0.301974 ,0.947485 ,0.761491 ,-0.0703961 ,0.644342 ,0.165134 ,0.235988 ,0.957622 ,0.00262008 ,-0.0720116 ,0.9974 ,0.000269095 ,-0.0109763 ,0.99994 ,-0.027699 ,-0.084837 ,0.99601 ,-0.0487038 ,-0.111506 ,0.99257 ,5.08836e-005 ,-0.00274336 ,0.999996 ,-0.00455985 ,-0.0146535 ,0.999882 ,0.0165575 ,0.163595 ,0.986389 ,0.0131139 ,0.0312149 ,0.999427 ,0.00241493 ,-0.0613622 ,0.998113 ,-0.0378945 ,-0.0761685 ,0.996375 ,0.000825477 ,0.411551 ,0.911386 ,-0.00162364 ,-0.200309 ,0.979732 ,0.00366731 ,-0.0408081 ,0.99916 ,-0.0419145 ,0.24215 ,0.969333 ,-0.00302969 ,-0.402577 ,0.915381 ,-0.0318434 ,-0.348515 ,0.936762 ,0.002882 ,-0.0500721 ,0.998741 ,-0.00349707 ,-0.0126157 ,0.999914 ,-0.0253632 ,-0.0458127 ,0.998628 ,-0.00217587 ,0.0317617 ,0.999493 ,-0.0478437 ,-0.0151964 ,0.998739 ,0.0932494 ,0.200658 ,0.975213 ,-0.00599234 ,0.236392 ,0.971639 ,-0.0321798 ,0.394025 ,0.918536 ,-0.0113092 ,0.651621 ,0.758461 ,0.0248735 ,0.319871 ,0.947135 ,-0.0866838 ,0.316656 ,0.944571 ,-0.149011 ,0.778708 ,0.609434 ,-0.488554 ,0.839089 ,0.239261 ,-0.742056 ,0.470408 ,0.477566 ,-0.0383749 ,0.258135 ,0.965346 ,-0.393471 ,-0.173445 ,0.902828 ,0.0131114 ,0.363612 ,0.931458 ,0.0038073 ,0.112658 ,0.993627 ,0.0093968 ,0.249515 ,0.968325 ,0.0585932 ,0.115214 ,0.991611 ,0.000537778 ,0.0752893 ,0.997162 ,0.000500418 ,0.0354369 ,0.999372 ,0.00957175 ,0.173568 ,0.984775 ,0.0166786 ,0.0457884 ,0.998812 ,0.0593207 ,-0.344523 ,0.936902 ,0.00127604 ,-0.00177759 ,0.999998 ,0.0114275 ,0.709425 ,0.704688 ,-0.00116785 ,0.336955 ,0.94152 ,0.0105074 ,-0.986739 ,0.161974 ,0.390535 ,-0.832841 ,0.392249 ,0.757397 ,-0.108563 ,0.643867 ,0.0549957 ,0.986532 ,-0.154047 ,0.31269 ,0.930625 ,0.190164 ,0.165134 ,0.235988 ,0.957622 ,-0.366999 ,-0.106443 ,0.924111 ,0 ,0 ,1 ,-5.04432e-008 ,3.38268e-008 ,1 ,-0.0052971 ,-0.00628658 ,0.999966 ,-0.0347242 ,-0.0377523 ,0.998684 ,0 ,0 ,1 ,-0.00131136 ,-0.00168028 ,0.999998 ,0.241869 ,0.130678 ,0.961469 ,0.113022 ,0.0936855 ,0.989166 ,0 ,0 ,1 ,-0.0294955 ,-0.0293093 ,0.999135 ,0 ,0 ,1 ,-0.0232234 ,-0.0204214 ,0.999522 ,-0.112093 ,-0.0159927 ,0.993569 ,-0.0839063 ,0.0198096 ,0.996277 ,-0.0247243 ,0.186474 ,0.982149 ,0.241754 ,0.190759 ,0.951402 ,-0.985306 ,0.0162614 ,0.170025 ,-0.869311 ,-0.0155158 ,0.494022 ,-0.868618 ,0.0299246 ,0.494578 ,0.221427 ,-0.305938 ,0.925944 ,0.208408 ,0.163367 ,0.964302 ,-0.293651 ,0.0420359 ,0.954988 ,0.111427 ,-0.993634 ,-0.016601 ,0.19477 ,-0.796505 ,0.572403 ,0.392216 ,0.203306 ,0.897125 ,0.319004 ,0.0821197 ,0.944189 ,0.378857 ,0.158856 ,0.911719 ,0.172058 ,0.11462 ,0.978396 ,0.881763 ,0.289715 ,0.372236 ,0.705755 ,0.461539 ,0.537486 ,-1.82096e-006 ,-0.850923 ,-0.52529 ,-0.107136 ,-0.472548 ,-0.874769 ,-0.127806 ,-0.598971 ,-0.790506 ,0 ,-0.697899 ,-0.716196 ,0.000615315 ,-0.327821 ,0.94474 ,0.00142632 ,-0.386953 ,0.922098 ,-0.0019771 ,-0.0501494 ,0.99874 ,0.00798393 ,-0.516969 ,0.855967 ,2.01085e-007 ,-0.189077 ,0.981962 ,0 ,0.697899 ,0.716196 ,-0.0617016 ,0.587756 ,0.806682 ,0.00104703 ,0.054408 ,0.998518 ,-0.000520678 ,0.850923 ,0.52529 ,-0.00795704 ,0.665163 ,0.746656 ,-0.00128562 ,0.619373 ,0.785096 ,-0.00726214 ,0.469696 ,0.882798 ,-0.0455381 ,0.998943 ,0.00629 ,-0.0624906 ,0.944397 ,0.322816 ,-0.00217587 ,0.0317617 ,0.999493 ,-0.00302969 ,-0.402577 ,0.915381 ,-0.00599234 ,0.236392 ,0.971639 ,-0.0113092 ,0.651621 ,0.758461 ,-0.488554 ,0.839089 ,0.239261 ,-0.33508 ,0.930605 ,0.147293 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-2.9565e-008 ,0.282471 ,0.959276 ,-6.80049e-007 ,-0.679163 ,0.733988 ,-0.0172031 ,-0.451674 ,0.892017 ,0.0404551 ,0.462009 ,0.885952 ,0.000615315 ,-0.327821 ,0.94474 ,0.00798393 ,-0.516969 ,0.855967 ,7.94018e-008 ,0.632296 ,0.774727 ,-0.00814254 ,0.490897 ,0.87118 ,-0.00162364 ,-0.200309 ,0.979732 ,0.000825477 ,0.411551 ,0.911386 ,-0.00302969 ,-0.402577 ,0.915381 ,-0.0401104 ,-0.412421 ,0.91011 ,0.0131114 ,0.363612 ,0.931458 ,-0.000175412 ,0.143642 ,0.98963 ,7.94018e-008 ,0.632296 ,0.774727 ,-0.00814254 ,0.490897 ,0.87118 ,0.000194233 ,0.120108 ,0.992761 ,-0.000361633 ,-0.15426 ,0.98803 ,0.00918028 ,-0.344357 ,0.938794 ,0 ,-0.873499 ,0.486826 ,-0.00751858 ,-0.95304 ,0.302751 ,0.0131114 ,0.363612 ,0.931458 ,0.000537778 ,0.0752893 ,0.997162 ,0.0593207 ,-0.344523 ,0.936902 ,0.0105074 ,-0.986739 ,0.161974 ,-0.672894 ,-0.680767 ,0.289432 ,-0.475114 ,-0.754959 ,-0.451998 ,-0.376435 ,-0.326297 ,0.86708 ,0.0535425 ,-0.97545 ,-0.213612 ,-0.886408 ,-0.41067 ,-0.213612 ,0.0535425 ,-0.97545 ,-0.213612 ,-0.672893 ,-0.680767 ,0.289432 ,-0.285178 ,-0.91373 ,0.289432 ,-0.56188 ,-0.712689 ,-0.419959 ,-0.285178 ,-0.91373 ,0.289432 ,-0.886408 ,-0.41067 ,-0.213612 ,0.0972898 ,-0.632413 ,0.768497 ,-0.285178 ,-0.91373 ,0.289432 ,-0.105228 ,0.274007 ,0.955953 ,-0.376435 ,-0.326297 ,0.86708 ,0.0369874 ,0.867758 ,0.495609 ,0.324995 ,-0.656888 ,0.68035 ,-0.291336 ,-0.0357272 ,-0.955954 ,0.311712 ,0.302371 ,-0.900781 ,-0.475114 ,-0.754959 ,-0.451998 ,0.732574 ,0.0214365 ,-0.68035 ,3.25394e-007 ,-0.890102 ,-0.455762 ,-0.0863506 ,-0.951254 ,-0.296072 ,1.17824e-009 ,-0.890103 ,-0.45576 ,0.00690505 ,-0.914366 ,-0.404829 ,0.0116145 ,-0.839481 ,-0.543265 ,0 ,-0.890101 ,-0.455762 ,-2.75443e-007 ,-0.890102 ,-0.455762 ,-0.168797 ,-0.804975 ,-0.568791 ,0.00624141 ,-0.909178 ,-0.41636 ,-0.123315 ,-0.964391 ,-0.233972 ,-2.75427e-007 ,-0.890103 ,-0.45576 ,0 ,-0.890102 ,-0.455761 ,-1.82461e-008 ,-0.890102 ,-0.455761 ,0.0104442 ,-0.822519 ,-0.568641 ,-0.109447 ,-0.835271 ,-0.538835 ,1.17824e-009 ,-0.890103 ,-0.45576 ,0.040652 ,-0.966775 ,-0.252375 ,-0.304925 ,-0.936453 ,0.173426 ,0.0181537 ,-0.729273 ,-0.683981 ,-0.349899 ,-0.414959 ,-0.839869 ,0.04185 ,-0.96887 ,-0.244008 ,-0.311185 ,-0.928639 ,0.201975 ,0.0185824 ,-0.734402 ,-0.678461 ,-0.34084 ,-0.450125 ,-0.825358 ,0.0404774 ,-0.993827 ,-0.103298 ,-0.344309 ,-0.728213 ,0.592586 ,-0.00409827 ,-0.615558 ,-0.788081 ,-0.387176 ,0.113164 ,-0.915035 ,0.0404289 ,-0.994156 ,-0.1001 ,-0.341395 ,-0.727121 ,0.595604 ,-0.00444181 ,-0.614254 ,-0.789096 ,-0.393499 ,0.105326 ,-0.913272 ,0.015518 ,-0.999853 ,-0.00722333 ,-0.17509 ,-0.542238 ,0.82178 ,-0.00854593 ,-0.544748 ,-0.838556 ,-0.190125 ,0.437889 ,-0.878696 ,0.0161542 ,-0.999828 ,-0.00908857 ,-0.180732 ,-0.544578 ,0.819006 ,-0.00849429 ,-0.544115 ,-0.838967 ,-0.18337 ,0.442853 ,-0.877643 ,0.00906452 ,-0.999825 ,0.0163918 ,-0.032635 ,-0.500829 ,0.864931 ,-0.00552109 ,-0.530208 ,-0.84785 ,-0.03277 ,0.497754 ,-0.866699 ,0.0090701 ,-0.999827 ,0.0162688 ,-0.0326919 ,-0.500851 ,0.864916 ,-0.00552397 ,-0.530051 ,-0.847948 ,-0.0327124 ,0.497741 ,-0.866709 ,0.998516 ,0.0471658 ,0.0272091 ,0.999425 ,0.000542307 ,0.0338938 ,1 ,-3.47459e-006 ,3.95426e-006 ,1 ,4.00763e-006 ,3.47594e-006 ,0.999829 ,0.0156802 ,-0.00980156 ,1 ,4.09259e-007 ,-4.85469e-008 ,0.998513 ,0.0472193 ,0.0272484 ,1 ,-8.26804e-006 ,6.82152e-006 ,0.998513 ,0.0472269 ,0.0272353 ,0.999425 ,0.000539847 ,0.0339153 ,1 ,5.50938e-009 ,-1.44051e-006 ,1 ,-5.76883e-007 ,-1.60287e-005 ,0.999829 ,0.0156811 ,-0.00980176 ,1 ,2.13668e-006 ,-2.54018e-006 ,0.998516 ,0.0471719 ,0.0271987 ,1 ,6.95132e-006 ,-5.26506e-006 ,0.393391 ,-0.919077 ,0.0232481 ,-1.83034e-007 ,-0.829012 ,-0.559231 ,0.000220812 ,-0.829085 ,-0.559123 ,-0.807892 ,-0.556235 ,-0.194712 ,8.77812e-007 ,-0.829012 ,-0.559231 ,0.0803752 ,-0.40223 ,-0.912004 ,-0.0445055 ,-0.543124 ,-0.838472 ,-0.000593272 ,-0.00383836 ,0.999992 ,-0.398332 ,0.128825 ,0.90815 ,1.41473e-012 ,0.000739273 ,1 ,-0.781174 ,-0.383447 ,0.492681 ,0.362492 ,-0.40771 ,0.838076 ,2.65289e-010 ,-0.00514831 ,0.999987 ,0.001821 ,-0.0031858 ,0.999993 ,0.527237 ,0.347746 ,0.775303 ,-0.132834 ,-0.323941 ,-0.936706 ,-0.527237 ,-0.347746 ,-0.775303 ,-0.001821 ,-0.00294378 ,-0.999994 ,2.97972e-010 ,-0.00735275 ,-0.999973 ,9.89358e-005 ,-0.00620474 ,-0.999981 ,0.0803752 ,-0.40223 ,-0.912004 ,-0.0445055 ,-0.543124 ,-0.838472 ,0.396257 ,-0.135158 ,-0.908137 ,0.154807 ,-0.491034 ,-0.857275 ,-1.41488e-012 ,-0.000739274 ,-1 ,0.263692 ,0.600075 ,-0.755233 ,0.000702887 ,0.603758 ,-0.797167 ,-0.219571 ,-0.20272 ,0.954303 ,-0.475755 ,-0.408177 ,0.779134 ,0.418559 ,0.483629 ,0.768707 ,0.000141242 ,-1 ,0 ,0.129952 ,-0.810207 ,-0.571557 ,-0.00105827 ,-0.447213 ,-0.894427 ,-0.014956 ,-0.99932 ,0.0336964 ,0.366401 ,-0.81369 ,-0.451286 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.201662 ,-0.954245 ,-0.220793 ,0.475756 ,0.408175 ,-0.779134 ,-0.389556 ,-0.622092 ,-0.679152 ,0.389557 ,0.622091 ,0.679152 ,-0.272343 ,-0.093852 ,-0.957612 ,"NaN" ,"NaN" ,"NaN" ,-0.418558 ,-0.48363 ,-0.768707 ,"NaN" ,"NaN" ,"NaN" ,-0.738592 ,0.346601 ,0.578229 ,0.385401 ,-0.327366 ,0.862727 ,0.845857 ,-0.0583779 ,0.530205 ,0.296539 ,0.215382 ,-0.930417 ,0.738592 ,-0.346601 ,-0.578229 ,-0.845857 ,0.0583779 ,-0.530205 ,-0.640768 ,-0.299025 ,-0.707107 ,0 ,-0.603758 ,0.797167 ,0.230636 ,-0.720758 ,0.653694 ,0.00253074 ,-0.963808 ,0.266584 ,0.354936 ,-0.861714 ,0.362586 ,-0.181859 ,-0.967686 ,-0.174673 ,0.595518 ,-0.762192 ,0.253815 ,-0.22853 ,-0.962172 ,-0.148325 ,0.245964 ,-0.750116 ,0.613863 ,0.963109 ,-0.144553 ,-0.22699 ,1 ,-9.3897e-007 ,4.36815e-014 ,0.928935 ,0.07418 ,-0.362737 ,1 ,0 ,0 ,1 ,0 ,0 ,0.927586 ,-0.365025 ,-0.0796323 ,0.963372 ,-0.223657 ,0.147957 ,1 ,0 ,0 ,1 ,0 ,0 ,0.928935 ,-0.074178 ,0.362736 ,0.96311 ,0.144551 ,0.226991 ,1 ,0 ,0 ,1 ,0 ,-9.36472e-007 ,1 ,0 ,0 ,0.96311 ,0.144551 ,0.226991 ,0.927586 ,0.365025 ,0.0796346 ,0.963372 ,0.223658 ,-0.147957 ,1 ,-3.29295e-006 ,-3.32983e-006 ,0.948254 ,-0.0596413 ,-0.311861 ,0.948962 ,-0.25913 ,-0.179785 ,0.949292 ,-0.308453 ,0.060834 ,0.948625 ,-0.173557 ,0.264553 ,0.948255 ,0.0596406 ,0.311857 ,0.948962 ,0.259129 ,0.179788 ,0.948962 ,0.259129 ,0.179788 ,0.949292 ,0.308453 ,-0.0608337 ,0.948625 ,0.173558 ,-0.264552 ,1 ,-2.86939e-007 ,1.84105e-006 ,1 ,6.74446e-008 ,-7.07443e-007 ,1 ,7.07158e-007 ,-1.7732e-007 ,1 ,2.20451e-007 ,-6.37293e-007 ,1 ,-2.93254e-007 ,-5.98204e-007 ,1 ,-4.79302e-007 ,-6.61036e-007 ,0.949292 ,0.308453 ,-0.0608337 ,0.948962 ,0.259129 ,0.179788 ,1 ,-4.79302e-007 ,-6.61036e-007 ,1 ,-2.49716e-007 ,2.80182e-007 ,1 ,-4.79302e-007 ,-6.61036e-007 ,1 ,2.77065e-007 ,4.66115e-007 ,-0.596285 ,-0.745356 ,0.298142 ,0.182574 ,-0.912871 ,-0.365148 ,0.182574 ,-0.912871 ,0.365148 ,-0.596285 ,-0.745356 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.182574 ,-0.912871 ,-0.365148 ,0.596285 ,-0.745356 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.596285 ,-0.745356 ,0.298142 ,0.182574 ,-0.912871 ,-0.365148 ,0.182574 ,-0.912871 ,0.365148 ,-0.596285 ,-0.745356 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.182574 ,-0.912871 ,-0.365148 ,0.596285 ,-0.745356 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.182574 ,-0.912871 ,0.365148 ,-0.182574 ,-0.912871 ,-0.365148 ,0.596285 ,-0.745356 ,0.298142 ,0.596285 ,-0.745356 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.182574 ,-0.912871 ,-0.365148 ,-0.596285 ,-0.745356 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.182574 ,-0.912871 ,0.365148 ,-0.182574 ,-0.912871 ,-0.365148 ,0.596285 ,-0.745356 ,0.298142 ,0.596285 ,-0.745356 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.182574 ,-0.912871 ,-0.365148 ,-0.596285 ,-0.745356 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.182574 ,-0.912871 ,-0.365148 ,0.182574 ,-0.912871 ,0.365148 ,-0.596285 ,-0.745356 ,-0.298142 ,-0.596285 ,-0.745356 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.182574 ,-0.912871 ,0.365148 ,0.596285 ,-0.745356 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.596285 ,-0.745356 ,-0.298142 ,-0.182574 ,-0.912871 ,0.365148 ,-0.182574 ,-0.912871 ,-0.365148 ,0.596285 ,-0.745356 ,0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,0.182574 ,-0.912871 ,0.365148 ,-0.596285 ,-0.745356 ,-0.298142 ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,"NaN" ,-0.520796 ,-0.853672 ,0.00404836 ,-0.476481 ,-0.878954 ,0.0201464 ,0 ,-1 ,1.14416e-009 ,-0.519065 ,-0.854735 ,2.56596e-007 ,0 ,-1 ,-4.62625e-009 ,-0.365282 ,-0.930839 ,0.0103676 ,0.116762 ,-0.993155 ,0.00323129 ,0.890936 ,-0.454129 ,0 ,0.854508 ,-0.510715 ,0.0948013 ,-0.266828 ,-0.963196 ,0.0325057 ,-0.890935 ,-0.45413 ,0 ,-0.854507 ,-0.510716 ,0.0948016 ,-0.368066 ,-0.929692 ,0.0141346 ,-0.388404 ,-0.921335 ,0.0168349 ,0.0592994 ,-0.998238 ,-0.00218043 ,0.731654 ,-0.667192 ,0.139776 ,-0.731652 ,-0.667193 ,0.139777 ,-0.191517 ,-0.981488 ,0.00173176 ,-0.159762 ,-0.987149 ,0.00365074 ,0.458106 ,-0.881751 ,0.112488 ,-0.143094 ,-0.989153 ,0.0331614 ,-0.458105 ,-0.881752 ,0.112488 ,0.040661 ,-0.999173 ,0.000383196 ,5.4999e-008 ,-1 ,9.1843e-008 ,-0.0335746 ,-0.99943 ,-0.00349338 ,0.0552981 ,-0.998072 ,-0.0281866 ,-0.0552977 ,-0.998072 ,-0.0281865 ,0.25881 ,-0.965914 ,-0.00523883 ,0.159762 ,-0.987149 ,-0.00365109 ,-0.414343 ,-0.898711 ,-0.143659 ,0.060247 ,-0.998136 ,-0.00976635 ,0.414342 ,-0.898712 ,-0.143659 ,0.411755 ,-0.911106 ,-0.0185516 ,0.388405 ,-0.921335 ,-0.016835 ,-0.106499 ,-0.99431 ,-0.00245046 ,-0.709307 ,-0.683536 ,-0.172229 ,0.709305 ,-0.683537 ,-0.17223 ,0.49868 ,-0.866619 ,-0.0170534 ,0.365281 ,-0.930839 ,-0.0103672 ,-0.879127 ,-0.4761 ,0.021558 ,0.226305 ,-0.972273 ,-0.0589092 ,0.852956 ,-0.512218 ,-0.100492 ,0.520794 ,-0.853673 ,0.00404818 ,0.519065 ,-0.854735 ,-2.48577e-007 ,-0.116763 ,-0.993155 ,0.00322929 ,-0.890936 ,-0.454128 ,0 ,0.890936 ,-0.45413 ,0 ,0.476495 ,-0.878946 ,0.0201482 ,0.365281 ,-0.930839 ,0.0103676 ,-0.879612 ,-0.475048 ,-0.0247439 ,0.266837 ,-0.963193 ,0.0325029 ,0.854507 ,-0.510716 ,0.0948013 ,0.368074 ,-0.929689 ,0.0141381 ,0.388404 ,-0.921335 ,0.0168355 ,-0.0592934 ,-0.998238 ,-0.00217865 ,-0.731654 ,-0.667192 ,0.139776 ,0.731653 ,-0.667193 ,0.139777 ,0.191517 ,-0.981488 ,0.00173255 ,0.159762 ,-0.987149 ,0.00365091 ,-0.458107 ,-0.881751 ,0.112488 ,0.143098 ,-0.989153 ,0.0331639 ,0.458106 ,-0.881751 ,0.112488 ,-0.0406632 ,-0.999173 ,0.000382581 ,-8.49014e-008 ,-1 ,1.38832e-007 ,0.0335735 ,-0.99943 ,-0.00349352 ,-0.0552983 ,-0.998072 ,-0.0281867 ,0.0552979 ,-0.998072 ,-0.0281866 ,-0.258806 ,-0.965915 ,-0.00524031 ,-0.159762 ,-0.987149 ,-0.00365109 ,0.414343 ,-0.898711 ,-0.143658 ,-0.0602461 ,-0.998136 ,-0.00976731 ,-0.414342 ,-0.898712 ,-0.143658 ,-0.411744 ,-0.911111 ,-0.0185533 ,-0.388404 ,-0.921335 ,-0.0168355 ,0.106503 ,-0.994309 ,-0.00245155 ,0.709306 ,-0.683536 ,-0.17223 ,-0.709305 ,-0.683538 ,-0.17223 ,-0.498675 ,-0.866621 ,-0.0170543 ,-0.365281 ,-0.930839 ,-0.0103677 ,0.852957 ,-0.512216 ,-0.100491 ,-0.22629 ,-0.972277 ,-0.0589033 ,-0.852956 ,-0.512218 ,-0.100491 ,-0.890936 ,0.454129 ,0 ,-1 ,-1.04893e-007 ,0 ,-0.890844 ,0.425036 ,0.160445 ,-1 ,-6.29359e-008 ,-1.06391e-007 ,-1 ,-1.04893e-007 ,0 ,-0.890935 ,-0.45413 ,0 ,-0.890843 ,-0.425037 ,-0.160445 ,-1 ,-6.29359e-008 ,-1.06391e-007 ,-0.890844 ,0.425036 ,0.160445 ,-1 ,-6.29359e-008 ,-1.06391e-007 ,-0.99997 ,0.0054818 ,-0.00548193 ,-0.890936 ,0.321118 ,0.321118 ,-1 ,-6.29359e-008 ,-1.06391e-007 ,-0.890843 ,-0.425037 ,-0.160445 ,-0.99997 ,0.0054818 ,-0.00548193 ,-0.890935 ,-0.321118 ,-0.321119 ,-0.890936 ,0.321118 ,0.321118 ,-0.99997 ,0.0054818 ,-0.00548193 ,-0.890844 ,0.187094 ,0.413997 ,-1 ,1.49846e-008 ,-1.16881e-007 ,-0.99997 ,0.0054818 ,-0.00548193 ,-0.890935 ,-0.321118 ,-0.321119 ,-0.890843 ,-0.187095 ,-0.413998 ,-1 ,1.49846e-008 ,-1.16881e-007 ,-0.890844 ,0.187094 ,0.413997 ,-1 ,1.49846e-008 ,-1.16881e-007 ,-0.99997 ,0.00775251 ,-1.0489e-007 ,-0.890936 ,0 ,0.454129 ,-1 ,1.49846e-008 ,-1.16881e-007 ,-0.890843 ,-0.187095 ,-0.413998 ,-0.99997 ,0.00775251 ,-1.0489e-007 ,-0.890935 ,0 ,-0.45413 ,-0.890936 ,0 ,0.454129 ,-0.99997 ,0.00775251 ,-1.0489e-007 ,-0.890844 ,-0.160445 ,0.425036 ,-1 ,2.27767e-007 ,-1.49849e-008 ,-0.99997 ,0.00775251 ,-1.0489e-007 ,-0.890935 ,0 ,-0.45413 ,-0.890843 ,0.160445 ,-0.425037 ,-1 ,2.27767e-007 ,-1.49849e-008 ,-0.890844 ,-0.160445 ,0.425036 ,-1 ,2.27767e-007 ,-1.49849e-008 ,-0.99997 ,0.00548196 ,0.00548181 ,-0.890936 ,-0.321117 ,0.321117 ,-1 ,2.27767e-007 ,-1.49849e-008 ,-0.890843 ,0.160445 ,-0.425037 ,-0.99997 ,0.00548196 ,0.00548181 ,-0.890936 ,0.321118 ,-0.321118 ,-0.890936 ,-0.321117 ,0.321117 ,-0.99997 ,0.00548196 ,0.00548181 ,-0.879127 ,-0.4761 ,0.021558 ,-1 ,7.49234e-008 ,-8.99079e-008 ,-0.99997 ,0.00548196 ,0.00548181 ,-0.890936 ,0.321118 ,-0.321118 ,-0.890843 ,0.413998 ,-0.187094 ,-1 ,7.49234e-008 ,-8.99079e-008 ,-0.879127 ,-0.4761 ,0.021558 ,-1 ,7.49234e-008 ,-8.99079e-008 ,-0.99997 ,1.0489e-007 ,0.00775245 ,-0.890936 ,-0.454128 ,0 ,-1 ,7.49234e-008 ,-8.99079e-008 ,-0.890843 ,0.413998 ,-0.187094 ,-0.99997 ,1.0489e-007 ,0.00775245 ,-0.890936 ,0.45413 ,0 ,-0.890936 ,-0.454128 ,0 ,-0.99997 ,1.0489e-007 ,0.00775245 ,-0.879612 ,-0.475048 ,-0.0247439 ,-1 ,7.19265e-008 ,9.29048e-008 ,-0.99997 ,1.0489e-007 ,0.00775245 ,-0.890936 ,0.45413 ,0 ,-0.890843 ,0.425037 ,0.160445 ,-1 ,7.19265e-008 ,9.29048e-008 ,-0.879612 ,-0.475048 ,-0.0247439 ,-1 ,7.19265e-008 ,9.29048e-008 ,-0.99997 ,-0.00548177 ,0.00548192 ,-0.890936 ,-0.321117 ,-0.321117 ,-1 ,7.19265e-008 ,9.29048e-008 ,-0.890843 ,0.425037 ,0.160445 ,-0.99997 ,-0.00548177 ,0.00548192 ,-0.890936 ,0.321118 ,0.321118 ,-0.890936 ,-0.321117 ,-0.321117 ,-0.99997 ,-0.00548177 ,0.00548192 ,-0.890844 ,-0.187094 ,-0.413997 ,-1 ,-8.9907e-009 ,1.10887e-007 ,-0.99997 ,-0.00548177 ,0.00548192 ,-0.890936 ,0.321118 ,0.321118 ,-0.890843 ,0.187095 ,0.413998 ,-1 ,-8.9907e-009 ,1.10887e-007 ,-0.890844 ,-0.187094 ,-0.413997 ,-1 ,-8.9907e-009 ,1.10887e-007 ,-0.99997 ,-0.00775251 ,1.0489e-007 ,-0.890936 ,0 ,-0.454129 ,-1 ,-8.9907e-009 ,1.10887e-007 ,-0.890843 ,0.187095 ,0.413998 ,-0.99997 ,-0.00775251 ,1.0489e-007 ,-0.890935 ,0 ,0.45413 ,-0.890936 ,0 ,-0.454129 ,-0.99997 ,-0.00775251 ,1.0489e-007 ,-0.890844 ,0.160445 ,-0.425036 ,-1 ,2.99681e-009 ,1.13884e-007 ,-0.99997 ,-0.00775251 ,1.0489e-007 ,-0.890935 ,0 ,0.45413 ,-0.890843 ,-0.160445 ,0.425037 ,-1 ,2.99681e-009 ,1.13884e-007 ,-0.890844 ,0.160445 ,-0.425036 ,-1 ,2.99681e-009 ,1.13884e-007 ,-0.99997 ,-0.00548188 ,-0.00548174 ,-0.890936 ,0.321118 ,-0.321118 ,-1 ,2.99681e-009 ,1.13884e-007 ,-0.890843 ,-0.160445 ,0.425037 ,-0.99997 ,-0.00548188 ,-0.00548174 ,-0.890935 ,-0.321118 ,0.321118 ,-0.890936 ,0.321118 ,-0.321118 ,-0.99997 ,-0.00548188 ,-0.00548174 ,-0.890844 ,0.413997 ,-0.187094 ,-1 ,-5.9939e-008 ,1.04893e-007 ,-0.99997 ,-0.00548188 ,-0.00548174 ,-0.890935 ,-0.321118 ,0.321118 ,-0.890843 ,-0.413998 ,0.187094 ,-1 ,-5.9939e-008 ,1.04893e-007 ,-0.890844 ,0.413997 ,-0.187094 ,-1 ,-5.9939e-008 ,1.04893e-007 ,-1 ,-1.04893e-007 ,0 ,-0.890936 ,0.454129 ,0 ,-1 ,-5.9939e-008 ,1.04893e-007 ,-0.890843 ,-0.413998 ,0.187094 ,-1 ,-1.04893e-007 ,0 ,-0.890935 ,-0.45413 ,0 ] ,"numuvcomponents": [ 2 ] ,"texturecoords": [ [ 0.698905 ,0.252746 ,0.656802 ,0.244458 ,0.698905 ,0.143875 ,0.698905 ,0.264843 ,0.698905 ,0.143875 ,0.652123 ,0.255634 ,0.698905 ,0.264843 ,0.698905 ,0.289036 ,0.642766 ,0.277986 ,0.652123 ,0.255634 ,0.698905 ,0.289036 ,0.642766 ,0.277986 ,0.621107 ,0.220858 ,0.612463 ,0.229412 ,0.612463 ,0.229412 ,0.595174 ,0.246519 ,0.595174 ,0.246519 ,0.597257 ,0.185538 ,0.585963 ,0.190167 ,0.563374 ,0.199426 ,0.585963 ,0.190167 ,0.563374 ,0.199426 ,0.588882 ,0.143875 ,0.576657 ,0.143875 ,0.576657 ,0.143875 ,0.552208 ,0.143875 ,0.552208 ,0.143875 ,0.597257 ,0.102211 ,0.585963 ,0.0975826 ,0.563374 ,0.0883241 ,0.585963 ,0.0975826 ,0.563374 ,0.0883241 ,0.621107 ,0.0668908 ,0.612463 ,0.0583378 ,0.612463 ,0.0583378 ,0.595174 ,0.0412304 ,0.595174 ,0.0412304 ,0.656802 ,0.0432907 ,0.652123 ,0.0321153 ,0.642766 ,0.00976348 ,0.652123 ,0.0321153 ,0.642766 ,0.00976348 ,0.698905 ,0.0350043 ,0.698905 ,0.0229071 ,0.698905 ,0.0229071 ,0.698905 ,-0.00128639 ,0.698905 ,-0.00128639 ,0.741009 ,0.0432907 ,0.745687 ,0.0321153 ,0.755044 ,0.00976348 ,0.745687 ,0.0321153 ,0.755044 ,0.00976348 ,0.776703 ,0.0668908 ,0.785347 ,0.0583378 ,0.785347 ,0.0583378 ,0.802636 ,0.0412304 ,0.802636 ,0.0412304 ,0.800553 ,0.102211 ,0.811848 ,0.0975826 ,0.834436 ,0.0883241 ,0.811848 ,0.0975826 ,0.834436 ,0.0883241 ,0.808928 ,0.143875 ,0.821153 ,0.143875 ,0.821153 ,0.143875 ,0.845603 ,0.143875 ,0.845603 ,0.143875 ,0.800553 ,0.185538 ,0.811848 ,0.190167 ,0.834436 ,0.199426 ,0.811848 ,0.190167 ,0.834436 ,0.199426 ,0.776703 ,0.220858 ,0.785347 ,0.229412 ,0.785347 ,0.229412 ,0.802636 ,0.246519 ,0.802636 ,0.246519 ,0.741009 ,0.244458 ,0.745687 ,0.255634 ,0.755044 ,0.277986 ,0.745687 ,0.255634 ,0.755044 ,0.277986 ,0.443616 ,0.222924 ,0.443616 ,0.00341809 ,0.518311 ,0.222924 ,0.518311 ,0.00341809 ,0.443616 ,0.223044 ,0.443616 ,0.00353873 ,0.518311 ,0.00353873 ,0.518311 ,0.223044 ,0.443848 ,0.222924 ,0.443848 ,0.00341809 ,0.518543 ,0.00341809 ,0.518543 ,0.222924 ,0.443848 ,0.223044 ,0.443848 ,0.00353873 ,0.518543 ,0.223044 ,0.518543 ,0.00353873 ,0.442219 ,0.222924 ,0.442219 ,0.00341809 ,0.516915 ,0.222924 ,0.516915 ,0.00341809 ,0.442219 ,0.223044 ,0.442219 ,0.00353873 ,0.516915 ,0.00353873 ,0.516915 ,0.223044 ,0.442452 ,0.222924 ,0.442452 ,0.00341809 ,0.517147 ,0.00341809 ,0.517147 ,0.222924 ,0.442452 ,0.223044 ,0.442452 ,0.00353873 ,0.517147 ,0.223044 ,0.517147 ,0.00353873 ,0.442685 ,0.222924 ,0.442685 ,0.00341809 ,0.51738 ,0.222924 ,0.51738 ,0.00341809 ,0.442685 ,0.223044 ,0.442685 ,0.00353873 ,0.51738 ,0.00353873 ,0.51738 ,0.223044 ,0.442918 ,0.222924 ,0.442918 ,0.00341809 ,0.517613 ,0.00341809 ,0.517613 ,0.222924 ,0.442918 ,0.223044 ,0.442918 ,0.00353873 ,0.517613 ,0.223044 ,0.517613 ,0.00353873 ,0.44315 ,0.222924 ,0.44315 ,0.00341809 ,0.517846 ,0.222924 ,0.517846 ,0.00341809 ,0.44315 ,0.223044 ,0.44315 ,0.00353873 ,0.517846 ,0.00353873 ,0.517846 ,0.223044 ,0.443383 ,0.222924 ,0.443383 ,0.00341809 ,0.518078 ,0.00341809 ,0.518078 ,0.222924 ,0.443383 ,0.223044 ,0.443383 ,0.00353873 ,0.518078 ,0.223044 ,0.518078 ,0.00353873 ,0.443615 ,0.222924 ,0.443615 ,0.00341809 ,0.518311 ,0.222924 ,0.518311 ,0.00341809 ,0.443615 ,0.223044 ,0.443615 ,0.00353873 ,0.518311 ,0.00353873 ,0.518311 ,0.223044 ,0.443848 ,0.222924 ,0.443848 ,0.00341809 ,0.518543 ,0.00341809 ,0.518543 ,0.222924 ,0.443848 ,0.223044 ,0.443848 ,0.00353873 ,0.518543 ,0.223044 ,0.518543 ,0.00353873 ,0.442219 ,0.222924 ,0.442219 ,0.00341809 ,0.516915 ,0.222924 ,0.516915 ,0.00341809 ,0.442219 ,0.223044 ,0.442219 ,0.00353873 ,0.516915 ,0.00353873 ,0.516915 ,0.223044 ,0.442452 ,0.222924 ,0.442452 ,0.00341809 ,0.517147 ,0.00341809 ,0.517147 ,0.222924 ,0.442452 ,0.223044 ,0.442452 ,0.00353873 ,0.517147 ,0.223044 ,0.517147 ,0.00353873 ,0.442685 ,0.222924 ,0.442685 ,0.00341809 ,0.51738 ,0.222924 ,0.51738 ,0.00341809 ,0.442685 ,0.223044 ,0.442685 ,0.00353873 ,0.51738 ,0.00353873 ,0.51738 ,0.223044 ,0.442918 ,0.222924 ,0.442918 ,0.00341809 ,0.517613 ,0.00341809 ,0.517613 ,0.222924 ,0.442918 ,0.223044 ,0.442918 ,0.00353873 ,0.517613 ,0.223044 ,0.517613 ,0.00353873 ,0.44315 ,0.222924 ,0.44315 ,0.00341809 ,0.517845 ,0.222924 ,0.517845 ,0.00341809 ,0.44315 ,0.223044 ,0.44315 ,0.00353873 ,0.517845 ,0.00353873 ,0.517845 ,0.223044 ,0.443383 ,0.222924 ,0.443383 ,0.00341809 ,0.518078 ,0.00341809 ,0.518078 ,0.222924 ,0.443383 ,0.223044 ,0.443383 ,0.00353873 ,0.518078 ,0.223044 ,0.518078 ,0.00353873 ,0.698905 ,0.143875 ,0.656802 ,0.244458 ,0.698905 ,0.252746 ,0.652123 ,0.255634 ,0.698905 ,0.143875 ,0.698905 ,0.264843 ,0.642766 ,0.277986 ,0.698905 ,0.289036 ,0.698905 ,0.264843 ,0.652123 ,0.255634 ,0.642766 ,0.277986 ,0.698905 ,0.289036 ,0.621107 ,0.220858 ,0.612463 ,0.229412 ,0.612463 ,0.229412 ,0.595174 ,0.246519 ,0.595174 ,0.246519 ,0.597257 ,0.185538 ,0.585963 ,0.190167 ,0.563374 ,0.199426 ,0.585963 ,0.190167 ,0.563374 ,0.199426 ,0.588882 ,0.143875 ,0.576657 ,0.143875 ,0.576657 ,0.143875 ,0.552208 ,0.143875 ,0.552208 ,0.143875 ,0.597257 ,0.102211 ,0.585963 ,0.0975826 ,0.563374 ,0.0883241 ,0.585963 ,0.0975826 ,0.563374 ,0.0883241 ,0.621107 ,0.0668908 ,0.612463 ,0.0583378 ,0.612463 ,0.0583378 ,0.595174 ,0.0412304 ,0.595174 ,0.0412304 ,0.656802 ,0.0432907 ,0.652123 ,0.0321153 ,0.642766 ,0.00976348 ,0.652123 ,0.0321153 ,0.642766 ,0.00976348 ,0.698905 ,0.0350043 ,0.698905 ,0.0229071 ,0.698905 ,0.0229071 ,0.698905 ,-0.00128639 ,0.698905 ,-0.00128639 ,0.741009 ,0.0432907 ,0.745687 ,0.0321153 ,0.755044 ,0.00976348 ,0.745687 ,0.0321153 ,0.755044 ,0.00976348 ,0.776703 ,0.0668908 ,0.785347 ,0.0583378 ,0.785347 ,0.0583378 ,0.802636 ,0.0412304 ,0.802636 ,0.0412304 ,0.800553 ,0.102211 ,0.811848 ,0.0975826 ,0.834436 ,0.0883241 ,0.811848 ,0.0975826 ,0.834436 ,0.0883241 ,0.808928 ,0.143875 ,0.821153 ,0.143875 ,0.821153 ,0.143875 ,0.845603 ,0.143875 ,0.845603 ,0.143875 ,0.800553 ,0.185538 ,0.811848 ,0.190167 ,0.834436 ,0.199426 ,0.811848 ,0.190167 ,0.834436 ,0.199426 ,0.776703 ,0.220858 ,0.785347 ,0.229412 ,0.785347 ,0.229412 ,0.802636 ,0.246519 ,0.802636 ,0.246519 ,0.741009 ,0.244458 ,0.745687 ,0.255634 ,0.755044 ,0.277986 ,0.745687 ,0.255634 ,0.755044 ,0.277986 ,0.518311 ,0.222924 ,0.443616 ,0.00341809 ,0.443616 ,0.222924 ,0.518311 ,0.00341809 ,0.518311 ,0.00353873 ,0.443616 ,0.00353873 ,0.443616 ,0.223044 ,0.518311 ,0.223044 ,0.518543 ,0.00341809 ,0.443848 ,0.00341809 ,0.443848 ,0.222924 ,0.518543 ,0.222924 ,0.518543 ,0.223044 ,0.443848 ,0.00353873 ,0.443848 ,0.223044 ,0.518543 ,0.00353873 ,0.516915 ,0.222924 ,0.442219 ,0.00341809 ,0.442219 ,0.222924 ,0.516915 ,0.00341809 ,0.516915 ,0.00353873 ,0.442219 ,0.00353873 ,0.442219 ,0.223044 ,0.516915 ,0.223044 ,0.517147 ,0.00341809 ,0.442452 ,0.00341809 ,0.442452 ,0.222924 ,0.517147 ,0.222924 ,0.517147 ,0.223044 ,0.442452 ,0.00353873 ,0.442452 ,0.223044 ,0.517147 ,0.00353873 ,0.51738 ,0.222924 ,0.442685 ,0.00341809 ,0.442685 ,0.222924 ,0.51738 ,0.00341809 ,0.51738 ,0.00353873 ,0.442685 ,0.00353873 ,0.442685 ,0.223044 ,0.51738 ,0.223044 ,0.517613 ,0.00341809 ,0.442918 ,0.00341809 ,0.442918 ,0.222924 ,0.517613 ,0.222924 ,0.517613 ,0.223044 ,0.442918 ,0.00353873 ,0.442918 ,0.223044 ,0.517613 ,0.00353873 ,0.517846 ,0.222924 ,0.44315 ,0.00341809 ,0.44315 ,0.222924 ,0.517846 ,0.00341809 ,0.517846 ,0.00353873 ,0.44315 ,0.00353873 ,0.44315 ,0.223044 ,0.517846 ,0.223044 ,0.518078 ,0.00341809 ,0.443383 ,0.00341809 ,0.443383 ,0.222924 ,0.518078 ,0.222924 ,0.518078 ,0.223044 ,0.443383 ,0.00353873 ,0.443383 ,0.223044 ,0.518078 ,0.00353873 ,0.518311 ,0.222924 ,0.443615 ,0.00341809 ,0.443615 ,0.222924 ,0.518311 ,0.00341809 ,0.518311 ,0.00353873 ,0.443615 ,0.00353873 ,0.443615 ,0.223044 ,0.518311 ,0.223044 ,0.518543 ,0.00341809 ,0.443848 ,0.00341809 ,0.443848 ,0.222924 ,0.518543 ,0.222924 ,0.518543 ,0.223044 ,0.443848 ,0.00353873 ,0.443848 ,0.223044 ,0.518543 ,0.00353873 ,0.516915 ,0.222924 ,0.442219 ,0.00341809 ,0.442219 ,0.222924 ,0.516915 ,0.00341809 ,0.516915 ,0.00353873 ,0.442219 ,0.00353873 ,0.442219 ,0.223044 ,0.516915 ,0.223044 ,0.517147 ,0.00341809 ,0.442452 ,0.00341809 ,0.442452 ,0.222924 ,0.517147 ,0.222924 ,0.517147 ,0.223044 ,0.442452 ,0.00353873 ,0.442452 ,0.223044 ,0.517147 ,0.00353873 ,0.51738 ,0.222924 ,0.442685 ,0.00341809 ,0.442685 ,0.222924 ,0.51738 ,0.00341809 ,0.51738 ,0.00353873 ,0.442685 ,0.00353873 ,0.442685 ,0.223044 ,0.51738 ,0.223044 ,0.517613 ,0.00341809 ,0.442918 ,0.00341809 ,0.442918 ,0.222924 ,0.517613 ,0.222924 ,0.517613 ,0.223044 ,0.442918 ,0.00353873 ,0.442918 ,0.223044 ,0.517613 ,0.00353873 ,0.517845 ,0.222924 ,0.44315 ,0.00341809 ,0.44315 ,0.222924 ,0.517845 ,0.00341809 ,0.517845 ,0.00353873 ,0.44315 ,0.00353873 ,0.44315 ,0.223044 ,0.517845 ,0.223044 ,0.518078 ,0.00341809 ,0.443383 ,0.00341809 ,0.443383 ,0.222924 ,0.518078 ,0.222924 ,0.518078 ,0.223044 ,0.443383 ,0.00353873 ,0.443383 ,0.223044 ,0.518078 ,0.00353873 ,0.698905 ,0.143875 ,0.656802 ,0.244458 ,0.698905 ,0.252746 ,0.652123 ,0.255634 ,0.698905 ,0.143875 ,0.698905 ,0.264843 ,0.642766 ,0.277986 ,0.698905 ,0.289036 ,0.698905 ,0.264843 ,0.652123 ,0.255634 ,0.642766 ,0.277986 ,0.698905 ,0.289036 ,0.621107 ,0.220858 ,0.612463 ,0.229412 ,0.612463 ,0.229412 ,0.595174 ,0.246519 ,0.595174 ,0.246519 ,0.597257 ,0.185538 ,0.585963 ,0.190167 ,0.563374 ,0.199426 ,0.585963 ,0.190167 ,0.563374 ,0.199426 ,0.588882 ,0.143875 ,0.576657 ,0.143875 ,0.576657 ,0.143875 ,0.552208 ,0.143875 ,0.552208 ,0.143875 ,0.597257 ,0.102211 ,0.585963 ,0.0975826 ,0.563374 ,0.0883241 ,0.585963 ,0.0975826 ,0.563374 ,0.0883241 ,0.621107 ,0.0668908 ,0.612463 ,0.0583378 ,0.612463 ,0.0583378 ,0.595174 ,0.0412304 ,0.595174 ,0.0412304 ,0.656802 ,0.0432907 ,0.652123 ,0.0321153 ,0.642766 ,0.00976348 ,0.652123 ,0.0321153 ,0.642766 ,0.00976348 ,0.698905 ,0.0350043 ,0.698905 ,0.0229071 ,0.698905 ,0.0229071 ,0.698905 ,-0.00128639 ,0.698905 ,-0.00128639 ,0.741009 ,0.0432907 ,0.745687 ,0.0321153 ,0.755044 ,0.00976348 ,0.745687 ,0.0321153 ,0.755044 ,0.00976348 ,0.776703 ,0.0668908 ,0.785347 ,0.0583378 ,0.785347 ,0.0583378 ,0.802636 ,0.0412304 ,0.802636 ,0.0412304 ,0.800553 ,0.102211 ,0.811848 ,0.0975826 ,0.834436 ,0.0883241 ,0.811848 ,0.0975826 ,0.834436 ,0.0883241 ,0.808928 ,0.143875 ,0.821153 ,0.143875 ,0.821153 ,0.143875 ,0.845603 ,0.143875 ,0.845603 ,0.143875 ,0.800553 ,0.185538 ,0.811848 ,0.190167 ,0.834436 ,0.199426 ,0.811848 ,0.190167 ,0.834436 ,0.199426 ,0.776703 ,0.220858 ,0.785347 ,0.229412 ,0.785347 ,0.229412 ,0.802636 ,0.246519 ,0.802636 ,0.246519 ,0.741009 ,0.244458 ,0.745687 ,0.255634 ,0.755044 ,0.277986 ,0.745687 ,0.255634 ,0.755044 ,0.277986 ,0.518311 ,0.222924 ,0.443616 ,0.00341809 ,0.443616 ,0.222924 ,0.518311 ,0.00341809 ,0.518311 ,0.00353873 ,0.443616 ,0.00353873 ,0.443616 ,0.223044 ,0.518311 ,0.223044 ,0.518543 ,0.00341809 ,0.443848 ,0.00341809 ,0.443848 ,0.222924 ,0.518543 ,0.222924 ,0.518543 ,0.223044 ,0.443848 ,0.00353873 ,0.443848 ,0.223044 ,0.518543 ,0.00353873 ,0.516915 ,0.222924 ,0.442219 ,0.00341809 ,0.442219 ,0.222924 ,0.516915 ,0.00341809 ,0.516915 ,0.00353873 ,0.442219 ,0.00353873 ,0.442219 ,0.223044 ,0.516915 ,0.223044 ,0.517147 ,0.00341809 ,0.442452 ,0.00341809 ,0.442452 ,0.222924 ,0.517147 ,0.222924 ,0.517147 ,0.223044 ,0.442452 ,0.00353873 ,0.442452 ,0.223044 ,0.517147 ,0.00353873 ,0.51738 ,0.222924 ,0.442685 ,0.00341809 ,0.442685 ,0.222924 ,0.51738 ,0.00341809 ,0.51738 ,0.00353873 ,0.442685 ,0.00353873 ,0.442685 ,0.223044 ,0.51738 ,0.223044 ,0.517613 ,0.00341809 ,0.442918 ,0.00341809 ,0.442918 ,0.222924 ,0.517613 ,0.222924 ,0.517613 ,0.223044 ,0.442918 ,0.00353873 ,0.442918 ,0.223044 ,0.517613 ,0.00353873 ,0.517846 ,0.222924 ,0.44315 ,0.00341809 ,0.44315 ,0.222924 ,0.517846 ,0.00341809 ,0.517846 ,0.00353873 ,0.44315 ,0.00353873 ,0.44315 ,0.223044 ,0.517846 ,0.223044 ,0.518078 ,0.00341809 ,0.443383 ,0.00341809 ,0.443383 ,0.222924 ,0.518078 ,0.222924 ,0.518078 ,0.223044 ,0.443383 ,0.00353873 ,0.443383 ,0.223044 ,0.518078 ,0.00353873 ,0.518311 ,0.222924 ,0.443615 ,0.00341809 ,0.443615 ,0.222924 ,0.518311 ,0.00341809 ,0.518311 ,0.00353873 ,0.443615 ,0.00353873 ,0.443615 ,0.223044 ,0.518311 ,0.223044 ,0.518543 ,0.00341809 ,0.443848 ,0.00341809 ,0.443848 ,0.222924 ,0.518543 ,0.222924 ,0.518543 ,0.223044 ,0.443848 ,0.00353873 ,0.443848 ,0.223044 ,0.518543 ,0.00353873 ,0.516915 ,0.222924 ,0.442219 ,0.00341809 ,0.442219 ,0.222924 ,0.516915 ,0.00341809 ,0.516915 ,0.00353873 ,0.442219 ,0.00353873 ,0.442219 ,0.223044 ,0.516915 ,0.223044 ,0.517147 ,0.00341809 ,0.442452 ,0.00341809 ,0.442452 ,0.222924 ,0.517147 ,0.222924 ,0.517147 ,0.223044 ,0.442452 ,0.00353873 ,0.442452 ,0.223044 ,0.517147 ,0.00353873 ,0.51738 ,0.222924 ,0.442685 ,0.00341809 ,0.442685 ,0.222924 ,0.51738 ,0.00341809 ,0.51738 ,0.00353873 ,0.442685 ,0.00353873 ,0.442685 ,0.223044 ,0.51738 ,0.223044 ,0.517613 ,0.00341809 ,0.442918 ,0.00341809 ,0.442918 ,0.222924 ,0.517613 ,0.222924 ,0.517613 ,0.223044 ,0.442918 ,0.00353873 ,0.442918 ,0.223044 ,0.517613 ,0.00353873 ,0.517845 ,0.222924 ,0.44315 ,0.00341809 ,0.44315 ,0.222924 ,0.517845 ,0.00341809 ,0.517845 ,0.00353873 ,0.44315 ,0.00353873 ,0.44315 ,0.223044 ,0.517845 ,0.223044 ,0.518078 ,0.00341809 ,0.443383 ,0.00341809 ,0.443383 ,0.222924 ,0.518078 ,0.222924 ,0.518078 ,0.223044 ,0.443383 ,0.00353873 ,0.443383 ,0.223044 ,0.518078 ,0.00353873 ,0.881113 ,0.00552255 ,0.839638 ,0.00910175 ,0.868919 ,0.178103 ,0.857345 ,0.179102 ,0.868919 ,0.178103 ,0.857345 ,0.179102 ,0.881113 ,0.00552255 ,0.839638 ,0.00910175 ,0.868919 ,0.178103 ,0.881113 ,0.00552255 ,0.868919 ,0.178103 ,0.881113 ,0.00552255 ,0.839638 ,0.00910175 ,0.857345 ,0.179102 ,0.839638 ,0.00910175 ,0.857345 ,0.179102 ,0.882347 ,0.117749 ,0.940844 ,0.117749 ,0.882347 ,0.180999 ,0.940844 ,0.180999 ,0.889187 ,0.237412 ,0.917062 ,0.237412 ,0.895626 ,0.237412 ,0.923501 ,0.237412 ,0.89451 ,0.180999 ,0.953007 ,0.180999 ,0.89451 ,0.117749 ,0.953007 ,0.117749 ,0.894803 ,0.0530801 ,0.923672 ,0.0530801 ,0.888641 ,0.0530801 ,0.917509 ,0.0530801 ,0.882347 ,0.117749 ,0.882347 ,0.180999 ,0.953007 ,0.117749 ,0.953007 ,0.180999 ,0.889187 ,0.237412 ,0.917062 ,0.237412 ,0.889187 ,0.237412 ,0.917062 ,0.237412 ,0.953007 ,0.180999 ,0.923501 ,0.237412 ,0.888641 ,0.0530801 ,0.923672 ,0.0530801 ,0.917509 ,0.0530801 ,0.888641 ,0.0530801 ,0.868919 ,0.178103 ,0.839638 ,0.00910175 ,0.881113 ,0.00552255 ,0.857345 ,0.179102 ,0.881113 ,0.00552255 ,0.857345 ,0.179102 ,0.868919 ,0.178103 ,0.839638 ,0.00910175 ,0.868919 ,0.178103 ,0.881113 ,0.00552255 ,0.868919 ,0.178103 ,0.881113 ,0.00552255 ,0.839638 ,0.00910175 ,0.857345 ,0.179102 ,0.839638 ,0.00910175 ,0.857345 ,0.179102 ,0.882347 ,0.180999 ,0.940844 ,0.117749 ,0.882347 ,0.117749 ,0.940844 ,0.180999 ,0.895626 ,0.237412 ,0.917062 ,0.237412 ,0.889187 ,0.237412 ,0.923501 ,0.237412 ,0.89451 ,0.117749 ,0.953007 ,0.180999 ,0.89451 ,0.180999 ,0.953007 ,0.117749 ,0.888641 ,0.0530801 ,0.923672 ,0.0530801 ,0.894803 ,0.0530801 ,0.917509 ,0.0530801 ,0.882347 ,0.117749 ,0.882347 ,0.180999 ,0.953007 ,0.117749 ,0.953007 ,0.180999 ,0.889187 ,0.237412 ,0.917062 ,0.237412 ,0.895626 ,0.237412 ,0.889187 ,0.237412 ,0.953007 ,0.180999 ,0.923501 ,0.237412 ,0.895626 ,0.237412 ,0.894803 ,0.0530801 ,0.923672 ,0.0530801 ,0.888641 ,0.0530801 ,0.894803 ,0.0530801 ,0.888641 ,0.0530801 ,0.774877 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.835329 ,0.771139 ,0.835329 ,0.949326 ,0.835329 ,0.771139 ,0.945384 ,0.949326 ,0.945384 ,0.771139 ,0.774877 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.771139 ,0.774877 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.835329 ,0.771139 ,0.774877 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.835329 ,0.771139 ,0.412102 ,0.00402963 ,0.412102 ,0.084874 ,0.412102 ,0.114572 ,0.412102 ,0.0914736 ,0.412102 ,0.00402963 ,0.412102 ,0.226764 ,0.412102 ,0.213565 ,0.260028 ,0.00402963 ,0.260028 ,0.0848737 ,0.412102 ,0.084874 ,0.260028 ,0.114572 ,0.412102 ,0.114572 ,0.412102 ,0.114572 ,0.260028 ,0.114572 ,0.260028 ,0.0914732 ,0.412102 ,0.0914736 ,0.412102 ,0.0914736 ,0.260028 ,0.0914732 ,0.260028 ,0.226763 ,0.412102 ,0.226764 ,0.412102 ,0.226764 ,0.260028 ,0.226763 ,0.260028 ,0.213564 ,0.412102 ,0.213565 ,0.412102 ,0.213565 ,0.260028 ,0.213564 ,0.260028 ,0.00402963 ,0.412102 ,0.00402963 ,0.260028 ,0.114572 ,0.260028 ,0.0914732 ,0.260028 ,0.00402963 ,0.260028 ,0.213564 ,0.260028 ,0.226763 ,0.934784 ,0.326831 ,0.934784 ,0.457182 ,0.923294 ,0.326831 ,0.923294 ,0.457181 ,0.900312 ,0.457181 ,0.900312 ,0.326831 ,0.888821 ,0.326831 ,0.888821 ,0.457182 ,0.888821 ,0.326831 ,0.888821 ,0.457182 ,0.900312 ,0.457181 ,0.900312 ,0.326831 ,0.923294 ,0.326831 ,0.923294 ,0.457181 ,0.934784 ,0.457182 ,0.934784 ,0.326831 ,0.904413 ,0.513888 ,0.915458 ,0.51653 ,0.882322 ,0.508605 ,0.871275 ,0.505963 ,0.882322 ,0.508605 ,0.871275 ,0.505963 ,0.904413 ,0.513889 ,0.915458 ,0.51653 ,0.876093 ,0.546958 ,0.883169 ,0.55451 ,0.861946 ,0.531853 ,0.854868 ,0.5243 ,0.861946 ,0.531853 ,0.854868 ,0.5243 ,0.876093 ,0.546958 ,0.883169 ,0.55451 ,0.841382 ,0.561143 ,0.843576 ,0.570551 ,0.836998 ,0.542327 ,0.834804 ,0.532916 ,0.836998 ,0.542327 ,0.834804 ,0.532916 ,0.841382 ,0.561143 ,0.843576 ,0.570551 ,0.802411 ,0.564268 ,0.802411 ,0.573848 ,0.802411 ,0.545101 ,0.802411 ,0.535515 ,0.802411 ,0.545101 ,0.802411 ,0.535515 ,0.802411 ,0.564268 ,0.802411 ,0.573848 ,0.90039 ,0.326536 ,0.900391 ,0.456899 ,0.888511 ,0.456899 ,0.88851 ,0.326536 ,0.92416 ,0.326536 ,0.92416 ,0.456899 ,0.936051 ,0.326536 ,0.936049 ,0.456899 ,0.92416 ,0.326536 ,0.924161 ,0.456899 ,0.936049 ,0.456899 ,0.936051 ,0.326536 ,0.900389 ,0.326536 ,0.900392 ,0.456899 ,0.88851 ,0.326536 ,0.888511 ,0.456899 ,0.850181 ,0.485973 ,0.850181 ,0.480371 ,0.834052 ,0.45498 ,0.834052 ,0.449378 ,0.834052 ,0.45498 ,0.834052 ,0.449378 ,0.801794 ,0.449378 ,0.801794 ,0.45498 ,0.801794 ,0.45498 ,0.801794 ,0.449378 ,0.785665 ,0.485973 ,0.785665 ,0.480371 ,0.785665 ,0.485973 ,0.785665 ,0.480371 ,0.801794 ,0.511362 ,0.801794 ,0.516966 ,0.801794 ,0.516966 ,0.801794 ,0.511362 ,0.834052 ,0.516966 ,0.834052 ,0.511362 ,0.834052 ,0.516966 ,0.834052 ,0.511362 ,0.850181 ,0.480371 ,0.850181 ,0.485973 ,0.897263 ,0.710387 ,0.897263 ,0.762724 ,0.88181 ,0.710387 ,0.88181 ,0.762724 ,0.866044 ,0.762724 ,0.866044 ,0.710387 ,0.850278 ,0.710387 ,0.850278 ,0.762724 ,0.834825 ,0.762724 ,0.834825 ,0.710387 ,0.819372 ,0.710387 ,0.819372 ,0.762724 ,0.944248 ,0.710387 ,0.944248 ,0.762724 ,0.928482 ,0.762724 ,0.928482 ,0.710387 ,0.912716 ,0.710387 ,0.912716 ,0.762724 ,0.897263 ,0.666883 ,0.882402 ,0.666883 ,0.866044 ,0.666883 ,0.849686 ,0.666883 ,0.834825 ,0.666883 ,0.819964 ,0.666883 ,0.94484 ,0.666883 ,0.928482 ,0.666883 ,0.912124 ,0.666883 ,0.897263 ,0.584536 ,0.882402 ,0.584536 ,0.866044 ,0.584536 ,0.849686 ,0.584536 ,0.834825 ,0.584536 ,0.819965 ,0.584536 ,0.944902 ,0.584536 ,0.944901 ,0.666883 ,0.928543 ,0.666883 ,0.944841 ,0.584536 ,0.928482 ,0.584536 ,0.912124 ,0.584536 ,0.740601 ,0.58462 ,0.740601 ,0.58462 ,0.786603 ,0.58462 ,0.791533 ,0.59326 ,0.791532 ,0.59326 ,0.809605 ,0.602334 ,0.740601 ,0.58462 ,0.786603 ,0.58462 ,0.740601 ,0.759979 ,0.791533 ,0.59326 ,0.786603 ,0.667429 ,0.809605 ,0.602334 ,0.809605 ,0.658483 ,0.813438 ,0.759979 ,0.786603 ,0.58462 ,0.809605 ,0.602334 ,0.809605 ,0.658483 ,0.809605 ,0.658483 ,0.786603 ,0.667429 ,0.786603 ,0.667429 ,0.786603 ,0.667429 ,0.786603 ,0.667429 ,0.813438 ,0.759979 ,0.813438 ,0.759979 ,0.740601 ,0.759979 ,0.786603 ,0.667429 ,0.791532 ,0.59326 ,0.809605 ,0.602334 ,0.813438 ,0.759979 ,0.88398 ,0.278045 ,0.913166 ,0.278045 ,0.898573 ,0.306463 ,0.927758 ,0.306463 ,0.942351 ,0.278045 ,0.927758 ,0.249627 ,0.898573 ,0.249627 ,0.802552 ,0.280318 ,0.802552 ,0.280318 ,0.821754 ,0.316417 ,0.821754 ,0.316417 ,0.860156 ,0.316417 ,0.860156 ,0.316417 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.860156 ,0.24422 ,0.860156 ,0.24422 ,0.821754 ,0.24422 ,0.821754 ,0.24422 ,0.802552 ,0.280318 ,0.802552 ,0.280318 ,0.690331 ,0.37869 ,0.690331 ,0.324926 ,0.879271 ,0.37869 ,0.879271 ,0.324926 ,0.689568 ,0.435519 ,0.689568 ,0.389436 ,0.880044 ,0.435519 ,0.880044 ,0.389436 ,0.689568 ,0.435519 ,0.689568 ,0.389436 ,0.880044 ,0.435519 ,0.880044 ,0.389436 ,0.689568 ,0.435519 ,0.689568 ,0.389436 ,0.880044 ,0.435519 ,0.880044 ,0.389436 ,0.689568 ,0.435519 ,0.689568 ,0.389436 ,0.880044 ,0.435519 ,0.880044 ,0.389436 ,0.200805 ,0.222353 ,0.000555187 ,0.222353 ,0.000555187 ,0.150136 ,0.200805 ,0.150137 ,0.251093 ,0.221904 ,0.251093 ,0.184906 ,0.430837 ,0.764583 ,0.252311 ,0.764583 ,0.252311 ,0.773707 ,0.430837 ,0.773707 ,0.430837 ,0.618906 ,0.252311 ,0.618906 ,0.430837 ,0.497254 ,0.252311 ,0.497255 ,0.252311 ,0.798037 ,0.430837 ,0.798037 ,0.252311 ,0.85278 ,0.430837 ,0.85278 ,0.252311 ,0.902961 ,0.430837 ,0.902961 ,0.252311 ,0.940977 ,0.430837 ,0.940977 ,0.252311 ,1.00302 ,0.430837 ,0.978689 ,0.430837 ,0.451078 ,0.252311 ,0.451078 ,0.430837 ,0.321949 ,0.252311 ,0.321948 ,0.430837 ,0.254156 ,0.252311 ,0.235907 ,-0.000121474 ,0.0662142 ,0.250417 ,0.0662137 ,0.250417 ,0.142609 ,-0.000121474 ,0.14261 ,-0.000121474 ,0.00445557 ,0.250417 ,0.00445557 ,0.958071 ,0.733892 ,0.955088 ,0.533297 ,0.953598 ,0.719772 ,0.944924 ,0.533379 ,0.942914 ,0.359587 ,0.947905 ,0.361242 ,0.972912 ,0.789288 ,0.958318 ,0.640138 ,0.957768 ,0.419173 ,0.969043 ,0.719585 ,0.981608 ,0.828875 ,0.998491 ,0.828826 ,0.9662 ,0.938129 ,0.982997 ,0.943179 ,0.919602 ,0.999998 ,0.966293 ,0.367036 ,0.953181 ,0.29362 ,0.972619 ,0.219828 ,0.95668 ,0.109144 ,0.973786 ,0.109144 ,0.964066 ,0.0122942 ,0.971064 ,0.00306976 ,0.910934 ,0.98652 ,0.526618 ,0.734238 ,0.436489 ,0.749387 ,0.436489 ,0.758476 ,0.526618 ,0.744085 ,0.526618 ,0.604265 ,0.436489 ,0.604265 ,0.526618 ,0.483078 ,0.436489 ,0.483078 ,0.436489 ,0.782713 ,0.526618 ,0.782713 ,0.526618 ,0.678709 ,0.436489 ,0.678709 ,0.436489 ,0.524628 ,0.526618 ,0.524628 ,0.526618 ,0.734108 ,0.436489 ,0.734108 ,0.436489 ,0.837247 ,0.526618 ,0.810317 ,0.526618 ,0.810282 ,0.436489 ,0.810282 ,0.436489 ,0.887236 ,0.526618 ,0.886501 ,0.436489 ,0.88992 ,0.526618 ,0.890022 ,0.436489 ,0.947051 ,0.436489 ,0.925107 ,0.526618 ,0.920244 ,0.526618 ,0.929642 ,0.481954 ,0.969777 ,0.441162 ,0.996667 ,0.436489 ,0.962675 ,0.481954 ,0.969777 ,0.436489 ,0.459995 ,0.526618 ,0.488272 ,0.526618 ,0.437079 ,0.436489 ,0.437079 ,0.436489 ,0.357346 ,0.526618 ,0.385623 ,0.526618 ,0.308442 ,0.436489 ,0.308442 ,0.436489 ,0.280165 ,0.526618 ,0.308442 ,0.526618 ,0.240908 ,0.436489 ,0.240908 ,0.526618 ,0.234476 ,0.436489 ,0.234476 ,0.526618 ,0.234476 ,0.526618 ,0.234476 ,0.436489 ,0.234476 ,0.526618 ,0.929642 ,0.526618 ,0.920244 ,0.621644 ,0.742645 ,0.733876 ,0.742645 ,0.733876 ,0.751677 ,0.621644 ,0.751677 ,0.621644 ,0.598429 ,0.733876 ,0.598429 ,0.621644 ,0.477999 ,0.733876 ,0.477999 ,0.733876 ,0.775763 ,0.621644 ,0.775763 ,0.733876 ,0.829957 ,0.621644 ,0.829957 ,0.733876 ,0.879635 ,0.621644 ,0.879635 ,0.733876 ,0.917269 ,0.621644 ,0.917269 ,0.673644 ,0.988334 ,0.733876 ,0.989226 ,0.66761 ,0.99523 ,0.766348 ,0.954602 ,0.638281 ,0.954602 ,0.766348 ,0.954602 ,0.733876 ,0.989226 ,0.673644 ,0.988334 ,0.590846 ,0.432286 ,0.673761 ,0.432286 ,0.573718 ,0.304453 ,0.64033 ,0.304453 ,0.537558 ,0.23734 ,0.56975 ,0.23734 ,0.854111 ,0.996865 ,0.937655 ,0.961534 ,0.784045 ,0.961535 ,0.784045 ,0.996865 ,0.191293 ,0.818675 ,0.000912905 ,0.788956 ,0.000912905 ,0.753128 ,0.191293 ,0.753128 ,0.0877513 ,0.912057 ,0.000912905 ,0.914115 ,0.000912905 ,0.791362 ,0.0877513 ,0.842487 ,0.191293 ,0.936363 ,0.000912905 ,0.959826 ,0.000912905 ,0.910666 ,0.191293 ,0.887203 ,0.191293 ,0.991731 ,0.000912905 ,0.998317 ,0.238369 ,0.818675 ,0.238369 ,0.753128 ,0.238369 ,0.887203 ,0.238369 ,0.936363 ,0.238369 ,0.98576 ,0.238369 ,0.98576 ,0.000912905 ,0.914115 ,0.000912905 ,0.910666 ,0.000912905 ,0.788956 ,0.000912905 ,0.791362 ,0.193801 ,0.715195 ,0.00120509 ,0.715195 ,0.00120509 ,0.536951 ,0.193801 ,0.536951 ,0.193801 ,0.751721 ,0.00120509 ,0.751722 ,0.00120509 ,0.470686 ,0.193801 ,0.470686 ,0.241908 ,0.694923 ,0.241908 ,0.536951 ,0.241908 ,0.751721 ,0.241908 ,0.751721 ,0.241908 ,0.470686 ,0.19682 ,0.468498 ,0.001445 ,0.468498 ,0.001445 ,0.368241 ,0.19682 ,0.36824 ,0.001445 ,0.292857 ,0.19682 ,0.292858 ,0.001445 ,0.230478 ,0.19682 ,0.248233 ,0.243662 ,0.466545 ,0.243662 ,0.366287 ,0.243662 ,0.290905 ,0.243662 ,0.24628 ,0.774877 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.835329 ,0.771139 ,0.835329 ,0.949326 ,0.835329 ,0.771139 ,0.945384 ,0.949326 ,0.945384 ,0.771139 ,0.774877 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.771139 ,0.774877 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.835329 ,0.771139 ,0.774877 ,0.949326 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.835329 ,0.771139 ,0.934784 ,0.326831 ,0.934784 ,0.457182 ,0.923294 ,0.326831 ,0.923294 ,0.457181 ,0.900312 ,0.457181 ,0.900312 ,0.326831 ,0.888821 ,0.326831 ,0.888821 ,0.457182 ,0.888821 ,0.326831 ,0.888821 ,0.457182 ,0.900312 ,0.457181 ,0.900312 ,0.326831 ,0.923294 ,0.326831 ,0.923294 ,0.457181 ,0.934784 ,0.457182 ,0.934784 ,0.326831 ,0.904413 ,0.513888 ,0.915458 ,0.51653 ,0.882322 ,0.508605 ,0.871275 ,0.505963 ,0.882322 ,0.508605 ,0.871275 ,0.505963 ,0.904413 ,0.513889 ,0.915458 ,0.51653 ,0.876093 ,0.546958 ,0.883169 ,0.55451 ,0.861946 ,0.531853 ,0.854868 ,0.5243 ,0.861946 ,0.531853 ,0.854868 ,0.5243 ,0.876093 ,0.546958 ,0.883169 ,0.55451 ,0.841382 ,0.561143 ,0.843576 ,0.570551 ,0.836998 ,0.542327 ,0.834804 ,0.532916 ,0.836998 ,0.542327 ,0.834804 ,0.532916 ,0.841382 ,0.561143 ,0.843576 ,0.570551 ,0.802411 ,0.564268 ,0.802411 ,0.573848 ,0.802411 ,0.545101 ,0.802411 ,0.535515 ,0.802411 ,0.545101 ,0.802411 ,0.535515 ,0.802411 ,0.564268 ,0.802411 ,0.573848 ,0.90039 ,0.326536 ,0.900391 ,0.456899 ,0.888511 ,0.456899 ,0.88851 ,0.326536 ,0.92416 ,0.326536 ,0.92416 ,0.456899 ,0.936051 ,0.326536 ,0.936049 ,0.456899 ,0.92416 ,0.326536 ,0.924161 ,0.456899 ,0.936049 ,0.456899 ,0.936051 ,0.326536 ,0.900389 ,0.326536 ,0.900392 ,0.456899 ,0.88851 ,0.326536 ,0.888511 ,0.456899 ,0.88398 ,0.278045 ,0.913166 ,0.278045 ,0.898573 ,0.306463 ,0.927758 ,0.306463 ,0.942351 ,0.278045 ,0.927758 ,0.249627 ,0.898573 ,0.249627 ,0.802552 ,0.280318 ,0.802552 ,0.280318 ,0.821754 ,0.316417 ,0.821754 ,0.316417 ,0.860156 ,0.316417 ,0.860156 ,0.316417 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.860156 ,0.24422 ,0.860156 ,0.24422 ,0.821754 ,0.24422 ,0.821754 ,0.24422 ,0.802552 ,0.280318 ,0.802552 ,0.280318 ,0.740601 ,0.58462 ,0.740601 ,0.58462 ,0.786603 ,0.58462 ,0.791533 ,0.59326 ,0.791532 ,0.59326 ,0.809605 ,0.602334 ,0.740601 ,0.58462 ,0.786603 ,0.58462 ,0.740601 ,0.759979 ,0.791533 ,0.59326 ,0.786603 ,0.667429 ,0.809605 ,0.602334 ,0.809605 ,0.658483 ,0.813438 ,0.759979 ,0.786603 ,0.58462 ,0.809605 ,0.602334 ,0.809605 ,0.658483 ,0.809605 ,0.658483 ,0.786603 ,0.667429 ,0.786603 ,0.667429 ,0.786603 ,0.667429 ,0.786603 ,0.667429 ,0.813438 ,0.759979 ,0.813438 ,0.759979 ,0.740601 ,0.759979 ,0.786603 ,0.667429 ,0.791532 ,0.59326 ,0.809605 ,0.602334 ,0.813438 ,0.759979 ,0.897263 ,0.710387 ,0.897263 ,0.762724 ,0.88181 ,0.710387 ,0.88181 ,0.762724 ,0.866044 ,0.762724 ,0.866044 ,0.710387 ,0.850278 ,0.710387 ,0.850278 ,0.762724 ,0.834825 ,0.762724 ,0.834825 ,0.710387 ,0.819372 ,0.710387 ,0.819372 ,0.762724 ,0.944248 ,0.710387 ,0.944248 ,0.762724 ,0.928482 ,0.762724 ,0.928482 ,0.710387 ,0.912716 ,0.710387 ,0.912716 ,0.762724 ,0.897263 ,0.666883 ,0.882402 ,0.666883 ,0.866044 ,0.666883 ,0.849686 ,0.666883 ,0.834825 ,0.666883 ,0.819964 ,0.666883 ,0.94484 ,0.666883 ,0.928482 ,0.666883 ,0.912124 ,0.666883 ,0.897263 ,0.584536 ,0.882402 ,0.584536 ,0.866044 ,0.584536 ,0.849686 ,0.584536 ,0.834825 ,0.584536 ,0.819965 ,0.584536 ,0.944902 ,0.584536 ,0.944901 ,0.666883 ,0.928543 ,0.666883 ,0.944841 ,0.584536 ,0.928482 ,0.584536 ,0.912124 ,0.584536 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.774877 ,0.949326 ,0.835329 ,0.771139 ,0.945384 ,0.949326 ,0.835329 ,0.771139 ,0.835329 ,0.949326 ,0.945384 ,0.771139 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.774877 ,0.949326 ,0.835329 ,0.771139 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.774877 ,0.949326 ,0.835329 ,0.771139 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.774877 ,0.949326 ,0.835329 ,0.771139 ,0.412102 ,0.114572 ,0.412102 ,0.084874 ,0.412102 ,0.00402963 ,0.412102 ,0.0914736 ,0.412102 ,0.00402963 ,0.412102 ,0.213565 ,0.412102 ,0.226764 ,0.260028 ,0.0848737 ,0.260028 ,0.00402963 ,0.412102 ,0.00402963 ,0.412102 ,0.084874 ,0.260028 ,0.114572 ,0.412102 ,0.114572 ,0.260028 ,0.0914732 ,0.260028 ,0.114572 ,0.412102 ,0.114572 ,0.412102 ,0.0914736 ,0.260028 ,0.226763 ,0.260028 ,0.0914732 ,0.412102 ,0.0914736 ,0.412102 ,0.226764 ,0.260028 ,0.213564 ,0.260028 ,0.226763 ,0.412102 ,0.226764 ,0.260028 ,0.00402963 ,0.260028 ,0.213564 ,0.260028 ,0.00402963 ,0.260028 ,0.0848737 ,0.260028 ,0.114572 ,0.260028 ,0.0914732 ,0.260028 ,0.226763 ,0.260028 ,0.213564 ,0.923294 ,0.326831 ,0.934784 ,0.457182 ,0.934784 ,0.326831 ,0.923294 ,0.457181 ,0.900312 ,0.457181 ,0.900312 ,0.326831 ,0.888821 ,0.326831 ,0.888821 ,0.457182 ,0.900312 ,0.457181 ,0.888821 ,0.457182 ,0.888821 ,0.326831 ,0.900312 ,0.326831 ,0.923294 ,0.326831 ,0.923294 ,0.457181 ,0.934784 ,0.457182 ,0.934784 ,0.326831 ,0.904413 ,0.513888 ,0.915458 ,0.51653 ,0.882322 ,0.508605 ,0.871275 ,0.505963 ,0.882322 ,0.508605 ,0.871275 ,0.505963 ,0.904413 ,0.513889 ,0.915458 ,0.51653 ,0.876093 ,0.546958 ,0.883169 ,0.55451 ,0.861946 ,0.531853 ,0.854868 ,0.5243 ,0.861946 ,0.531853 ,0.854868 ,0.5243 ,0.876093 ,0.546958 ,0.883169 ,0.55451 ,0.841382 ,0.561143 ,0.843576 ,0.570551 ,0.836998 ,0.542327 ,0.834804 ,0.532916 ,0.836998 ,0.542327 ,0.834804 ,0.532916 ,0.841382 ,0.561143 ,0.843576 ,0.570551 ,0.802411 ,0.564268 ,0.802411 ,0.573848 ,0.802411 ,0.545101 ,0.802411 ,0.535515 ,0.802411 ,0.545101 ,0.802411 ,0.535515 ,0.802411 ,0.564268 ,0.802411 ,0.573848 ,0.888511 ,0.456899 ,0.900391 ,0.456899 ,0.90039 ,0.326536 ,0.88851 ,0.326536 ,0.92416 ,0.456899 ,0.92416 ,0.326536 ,0.936049 ,0.456899 ,0.936051 ,0.326536 ,0.936049 ,0.456899 ,0.924161 ,0.456899 ,0.92416 ,0.326536 ,0.936051 ,0.326536 ,0.900392 ,0.456899 ,0.900389 ,0.326536 ,0.888511 ,0.456899 ,0.88851 ,0.326536 ,0.834052 ,0.45498 ,0.850181 ,0.480371 ,0.850181 ,0.485973 ,0.834052 ,0.449378 ,0.801794 ,0.449378 ,0.834052 ,0.449378 ,0.834052 ,0.45498 ,0.801794 ,0.45498 ,0.785665 ,0.485973 ,0.801794 ,0.449378 ,0.801794 ,0.45498 ,0.785665 ,0.480371 ,0.801794 ,0.511362 ,0.785665 ,0.480371 ,0.785665 ,0.485973 ,0.801794 ,0.516966 ,0.834052 ,0.516966 ,0.801794 ,0.511362 ,0.801794 ,0.516966 ,0.834052 ,0.511362 ,0.850181 ,0.480371 ,0.834052 ,0.511362 ,0.834052 ,0.516966 ,0.850181 ,0.485973 ,0.88181 ,0.710387 ,0.897263 ,0.762724 ,0.897263 ,0.710387 ,0.88181 ,0.762724 ,0.866044 ,0.762724 ,0.866044 ,0.710387 ,0.850278 ,0.710387 ,0.850278 ,0.762724 ,0.834825 ,0.762724 ,0.834825 ,0.710387 ,0.819372 ,0.710387 ,0.819372 ,0.762724 ,0.928482 ,0.762724 ,0.944248 ,0.762724 ,0.944248 ,0.710387 ,0.928482 ,0.710387 ,0.912716 ,0.710387 ,0.912716 ,0.762724 ,0.897263 ,0.666883 ,0.882402 ,0.666883 ,0.866044 ,0.666883 ,0.849686 ,0.666883 ,0.834825 ,0.666883 ,0.819964 ,0.666883 ,0.94484 ,0.666883 ,0.928482 ,0.666883 ,0.912124 ,0.666883 ,0.897263 ,0.584536 ,0.882402 ,0.584536 ,0.866044 ,0.584536 ,0.849686 ,0.584536 ,0.834825 ,0.584536 ,0.819965 ,0.584536 ,0.928543 ,0.666883 ,0.944901 ,0.666883 ,0.944902 ,0.584536 ,0.928482 ,0.584536 ,0.944841 ,0.584536 ,0.912124 ,0.584536 ,0.786603 ,0.58462 ,0.740601 ,0.58462 ,0.740601 ,0.58462 ,0.809605 ,0.602334 ,0.791532 ,0.59326 ,0.791533 ,0.59326 ,0.740601 ,0.759979 ,0.786603 ,0.58462 ,0.786603 ,0.667429 ,0.791533 ,0.59326 ,0.809605 ,0.658483 ,0.809605 ,0.602334 ,0.813438 ,0.759979 ,0.791532 ,0.59326 ,0.786603 ,0.58462 ,0.786603 ,0.58462 ,0.809605 ,0.602334 ,0.809605 ,0.602334 ,0.791533 ,0.59326 ,0.809605 ,0.658483 ,0.786603 ,0.667429 ,0.809605 ,0.658483 ,0.786603 ,0.667429 ,0.813438 ,0.759979 ,0.786603 ,0.667429 ,0.786603 ,0.667429 ,0.813438 ,0.759979 ,0.740601 ,0.58462 ,0.786603 ,0.58462 ,0.740601 ,0.759979 ,0.791532 ,0.59326 ,0.786603 ,0.667429 ,0.809605 ,0.602334 ,0.809605 ,0.658483 ,0.813438 ,0.759979 ,0.898573 ,0.306463 ,0.913166 ,0.278045 ,0.88398 ,0.278045 ,0.927758 ,0.306463 ,0.942351 ,0.278045 ,0.927758 ,0.249627 ,0.898573 ,0.249627 ,0.821754 ,0.316417 ,0.802552 ,0.280318 ,0.802552 ,0.280318 ,0.821754 ,0.316417 ,0.860156 ,0.316417 ,0.860156 ,0.316417 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.860156 ,0.24422 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.860156 ,0.24422 ,0.821754 ,0.24422 ,0.860156 ,0.24422 ,0.821754 ,0.24422 ,0.802552 ,0.280318 ,0.821754 ,0.24422 ,0.802552 ,0.280318 ,0.879271 ,0.37869 ,0.690331 ,0.324926 ,0.690331 ,0.37869 ,0.879271 ,0.324926 ,0.880044 ,0.435519 ,0.689568 ,0.389436 ,0.689568 ,0.435519 ,0.880044 ,0.389436 ,0.880044 ,0.435519 ,0.689568 ,0.389436 ,0.689568 ,0.435519 ,0.880044 ,0.389436 ,0.880044 ,0.435519 ,0.689568 ,0.389436 ,0.689568 ,0.435519 ,0.880044 ,0.389436 ,0.880044 ,0.435519 ,0.689568 ,0.389436 ,0.689568 ,0.435519 ,0.880044 ,0.389436 ,0.000555187 ,0.150136 ,0.000555187 ,0.222353 ,0.200805 ,0.222353 ,0.200805 ,0.150137 ,0.251093 ,0.221904 ,0.251093 ,0.184906 ,0.252311 ,0.773707 ,0.252311 ,0.764583 ,0.430837 ,0.764583 ,0.430837 ,0.773707 ,0.252311 ,0.618906 ,0.430837 ,0.618906 ,0.252311 ,0.497255 ,0.430837 ,0.497254 ,0.252311 ,0.798037 ,0.430837 ,0.798037 ,0.252311 ,0.85278 ,0.430837 ,0.85278 ,0.252311 ,0.902961 ,0.430837 ,0.902961 ,0.252311 ,0.940977 ,0.430837 ,0.940977 ,0.252311 ,1.00302 ,0.430837 ,0.978689 ,0.252311 ,0.451078 ,0.430837 ,0.451078 ,0.252311 ,0.321948 ,0.430837 ,0.321949 ,0.252311 ,0.235907 ,0.430837 ,0.254156 ,0.250417 ,0.142609 ,0.250417 ,0.0662137 ,-0.000121474 ,0.0662142 ,-0.000121474 ,0.14261 ,0.250417 ,0.00445557 ,-0.000121474 ,0.00445557 ,0.953598 ,0.719772 ,0.955088 ,0.533297 ,0.958071 ,0.733892 ,0.944924 ,0.533379 ,0.942914 ,0.359587 ,0.947905 ,0.361242 ,0.958318 ,0.640138 ,0.972912 ,0.789288 ,0.957768 ,0.419173 ,0.969043 ,0.719585 ,0.998491 ,0.828826 ,0.981608 ,0.828875 ,0.982997 ,0.943179 ,0.9662 ,0.938129 ,0.919602 ,0.999998 ,0.966293 ,0.367036 ,0.953181 ,0.29362 ,0.972619 ,0.219828 ,0.95668 ,0.109144 ,0.973786 ,0.109144 ,0.964066 ,0.0122942 ,0.971064 ,0.00306976 ,0.910934 ,0.98652 ,0.436489 ,0.758476 ,0.436489 ,0.749387 ,0.526618 ,0.734238 ,0.526618 ,0.744085 ,0.436489 ,0.604265 ,0.526618 ,0.604265 ,0.436489 ,0.483078 ,0.526618 ,0.483078 ,0.436489 ,0.782713 ,0.526618 ,0.782713 ,0.436489 ,0.524628 ,0.436489 ,0.678709 ,0.526618 ,0.678709 ,0.526618 ,0.524628 ,0.436489 ,0.734108 ,0.526618 ,0.734108 ,0.436489 ,0.837247 ,0.526618 ,0.810317 ,0.526618 ,0.810282 ,0.436489 ,0.810282 ,0.436489 ,0.887236 ,0.526618 ,0.886501 ,0.436489 ,0.88992 ,0.526618 ,0.890022 ,0.436489 ,0.947051 ,0.436489 ,0.925107 ,0.526618 ,0.920244 ,0.526618 ,0.929642 ,0.441162 ,0.996667 ,0.481954 ,0.969777 ,0.436489 ,0.962675 ,0.481954 ,0.969777 ,0.436489 ,0.459995 ,0.526618 ,0.488272 ,0.436489 ,0.437079 ,0.526618 ,0.437079 ,0.436489 ,0.357346 ,0.526618 ,0.385623 ,0.436489 ,0.308442 ,0.526618 ,0.308442 ,0.436489 ,0.280165 ,0.526618 ,0.308442 ,0.436489 ,0.240908 ,0.526618 ,0.240908 ,0.436489 ,0.234476 ,0.526618 ,0.234476 ,0.526618 ,0.234476 ,0.436489 ,0.234476 ,0.526618 ,0.234476 ,0.526618 ,0.920244 ,0.526618 ,0.929642 ,0.733876 ,0.751677 ,0.733876 ,0.742645 ,0.621644 ,0.742645 ,0.621644 ,0.751677 ,0.733876 ,0.598429 ,0.621644 ,0.598429 ,0.733876 ,0.477999 ,0.621644 ,0.477999 ,0.733876 ,0.775763 ,0.621644 ,0.775763 ,0.733876 ,0.829957 ,0.621644 ,0.829957 ,0.733876 ,0.879635 ,0.621644 ,0.879635 ,0.733876 ,0.917269 ,0.621644 ,0.917269 ,0.66761 ,0.99523 ,0.733876 ,0.989226 ,0.673644 ,0.988334 ,0.766348 ,0.954602 ,0.638281 ,0.954602 ,0.766348 ,0.954602 ,0.673644 ,0.988334 ,0.733876 ,0.989226 ,0.673761 ,0.432286 ,0.590846 ,0.432286 ,0.64033 ,0.304453 ,0.573718 ,0.304453 ,0.56975 ,0.23734 ,0.537558 ,0.23734 ,0.784045 ,0.961535 ,0.937655 ,0.961534 ,0.854111 ,0.996865 ,0.784045 ,0.996865 ,0.000912905 ,0.753128 ,0.000912905 ,0.788956 ,0.191293 ,0.818675 ,0.191293 ,0.753128 ,0.000912905 ,0.791362 ,0.000912905 ,0.914115 ,0.0877513 ,0.912057 ,0.0877513 ,0.842487 ,0.000912905 ,0.910666 ,0.000912905 ,0.959826 ,0.191293 ,0.936363 ,0.191293 ,0.887203 ,0.000912905 ,0.998317 ,0.191293 ,0.991731 ,0.238369 ,0.818675 ,0.238369 ,0.753128 ,0.238369 ,0.887203 ,0.238369 ,0.936363 ,0.238369 ,0.98576 ,0.238369 ,0.98576 ,0.000912905 ,0.788956 ,0.000912905 ,0.910666 ,0.000912905 ,0.914115 ,0.000912905 ,0.791362 ,0.00120509 ,0.536951 ,0.00120509 ,0.715195 ,0.193801 ,0.715195 ,0.193801 ,0.536951 ,0.00120509 ,0.751722 ,0.193801 ,0.751721 ,0.00120509 ,0.470686 ,0.193801 ,0.470686 ,0.241908 ,0.694923 ,0.241908 ,0.536951 ,0.241908 ,0.751721 ,0.241908 ,0.751721 ,0.241908 ,0.470686 ,0.001445 ,0.368241 ,0.001445 ,0.468498 ,0.19682 ,0.468498 ,0.19682 ,0.36824 ,0.001445 ,0.292857 ,0.19682 ,0.292858 ,0.001445 ,0.230478 ,0.19682 ,0.248233 ,0.243662 ,0.466545 ,0.243662 ,0.366287 ,0.243662 ,0.290905 ,0.243662 ,0.24628 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.774877 ,0.949326 ,0.835329 ,0.771139 ,0.945384 ,0.949326 ,0.835329 ,0.771139 ,0.835329 ,0.949326 ,0.945384 ,0.771139 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.774877 ,0.949326 ,0.835329 ,0.771139 ,0.774877 ,0.771139 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.774877 ,0.949326 ,0.835329 ,0.771139 ,0.835329 ,0.949326 ,0.774877 ,0.771139 ,0.774877 ,0.949326 ,0.835329 ,0.771139 ,0.923294 ,0.326831 ,0.934784 ,0.457182 ,0.934784 ,0.326831 ,0.923294 ,0.457181 ,0.900312 ,0.457181 ,0.900312 ,0.326831 ,0.888821 ,0.326831 ,0.888821 ,0.457182 ,0.900312 ,0.457181 ,0.888821 ,0.457182 ,0.888821 ,0.326831 ,0.900312 ,0.326831 ,0.923294 ,0.326831 ,0.923294 ,0.457181 ,0.934784 ,0.457182 ,0.934784 ,0.326831 ,0.904413 ,0.513888 ,0.915458 ,0.51653 ,0.882322 ,0.508605 ,0.871275 ,0.505963 ,0.882322 ,0.508605 ,0.871275 ,0.505963 ,0.904413 ,0.513889 ,0.915458 ,0.51653 ,0.876093 ,0.546958 ,0.883169 ,0.55451 ,0.861946 ,0.531853 ,0.854868 ,0.5243 ,0.861946 ,0.531853 ,0.854868 ,0.5243 ,0.876093 ,0.546958 ,0.883169 ,0.55451 ,0.841382 ,0.561143 ,0.843576 ,0.570551 ,0.836998 ,0.542327 ,0.834804 ,0.532916 ,0.836998 ,0.542327 ,0.834804 ,0.532916 ,0.841382 ,0.561143 ,0.843576 ,0.570551 ,0.802411 ,0.564268 ,0.802411 ,0.573848 ,0.802411 ,0.545101 ,0.802411 ,0.535515 ,0.802411 ,0.545101 ,0.802411 ,0.535515 ,0.802411 ,0.564268 ,0.802411 ,0.573848 ,0.888511 ,0.456899 ,0.900391 ,0.456899 ,0.90039 ,0.326536 ,0.88851 ,0.326536 ,0.92416 ,0.456899 ,0.92416 ,0.326536 ,0.936049 ,0.456899 ,0.936051 ,0.326536 ,0.936049 ,0.456899 ,0.924161 ,0.456899 ,0.92416 ,0.326536 ,0.936051 ,0.326536 ,0.900392 ,0.456899 ,0.900389 ,0.326536 ,0.888511 ,0.456899 ,0.88851 ,0.326536 ,0.898573 ,0.306463 ,0.913166 ,0.278045 ,0.88398 ,0.278045 ,0.927758 ,0.306463 ,0.942351 ,0.278045 ,0.927758 ,0.249627 ,0.898573 ,0.249627 ,0.821754 ,0.316417 ,0.802552 ,0.280318 ,0.802552 ,0.280318 ,0.821754 ,0.316417 ,0.860156 ,0.316417 ,0.860156 ,0.316417 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.860156 ,0.24422 ,0.879357 ,0.280318 ,0.879357 ,0.280318 ,0.860156 ,0.24422 ,0.821754 ,0.24422 ,0.860156 ,0.24422 ,0.821754 ,0.24422 ,0.802552 ,0.280318 ,0.821754 ,0.24422 ,0.802552 ,0.280318 ,0.786603 ,0.58462 ,0.740601 ,0.58462 ,0.809605 ,0.602334 ,0.791532 ,0.59326 ,0.791533 ,0.59326 ,0.740601 ,0.759979 ,0.786603 ,0.58462 ,0.740601 ,0.58462 ,0.786603 ,0.667429 ,0.791533 ,0.59326 ,0.809605 ,0.658483 ,0.809605 ,0.602334 ,0.813438 ,0.759979 ,0.791532 ,0.59326 ,0.786603 ,0.58462 ,0.786603 ,0.58462 ,0.809605 ,0.602334 ,0.809605 ,0.602334 ,0.791533 ,0.59326 ,0.809605 ,0.658483 ,0.786603 ,0.667429 ,0.809605 ,0.658483 ,0.786603 ,0.667429 ,0.813438 ,0.759979 ,0.786603 ,0.667429 ,0.786603 ,0.667429 ,0.813438 ,0.759979 ,0.740601 ,0.58462 ,0.786603 ,0.58462 ,0.740601 ,0.759979 ,0.791532 ,0.59326 ,0.786603 ,0.667429 ,0.809605 ,0.602334 ,0.809605 ,0.658483 ,0.813438 ,0.759979 ,0.88181 ,0.710387 ,0.897263 ,0.762724 ,0.897263 ,0.710387 ,0.88181 ,0.762724 ,0.866044 ,0.762724 ,0.866044 ,0.710387 ,0.850278 ,0.710387 ,0.850278 ,0.762724 ,0.834825 ,0.762724 ,0.834825 ,0.710387 ,0.819372 ,0.710387 ,0.819372 ,0.762724 ,0.928482 ,0.762724 ,0.944248 ,0.762724 ,0.944248 ,0.710387 ,0.928482 ,0.710387 ,0.912716 ,0.710387 ,0.912716 ,0.762724 ,0.897263 ,0.666883 ,0.882402 ,0.666883 ,0.866044 ,0.666883 ,0.849686 ,0.666883 ,0.834825 ,0.666883 ,0.819964 ,0.666883 ,0.94484 ,0.666883 ,0.928482 ,0.666883 ,0.912124 ,0.666883 ,0.897263 ,0.584536 ,0.882402 ,0.584536 ,0.866044 ,0.584536 ,0.849686 ,0.584536 ,0.834825 ,0.584536 ,0.819965 ,0.584536 ,0.928543 ,0.666883 ,0.944901 ,0.666883 ,0.944902 ,0.584536 ,0.928482 ,0.584536 ,0.944841 ,0.584536 ,0.912124 ,0.584536 ,0.528035 ,0.0748031 ,0.528035 ,0.049881 ,0.549842 ,0.0748031 ,0.549842 ,0.049881 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.528035 ,0.0748031 ,0.528035 ,0.049881 ,0.549842 ,0.0748031 ,0.549842 ,0.049881 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.549842 ,0.0748031 ,0.528035 ,0.049881 ,0.528035 ,0.0748031 ,0.549842 ,0.049881 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.549842 ,0.0748031 ,0.528035 ,0.049881 ,0.528035 ,0.0748031 ,0.549842 ,0.049881 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.549842 ,0.0748031 ,0.528035 ,0.049881 ,0.528035 ,0.0748031 ,0.549842 ,0.049881 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.528035 ,0.0748031 ,0.528035 ,0.049881 ,0.549842 ,0.0748031 ,0.549842 ,0.049881 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.588696 ,0.0374125 ,0.588696 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.52016 ,0.0374125 ,0.52016 ,0.00158685 ,0.698905 ,0.252746 ,0.656802 ,0.244458 ,0.698905 ,0.143875 ,0.698905 ,0.264843 ,0.698905 ,0.143875 ,0.652123 ,0.255634 ,0.698905 ,0.264843 ,0.698905 ,0.289036 ,0.642766 ,0.277986 ,0.652123 ,0.255634 ,0.698905 ,0.289036 ,0.642766 ,0.277986 ,0.621107 ,0.220858 ,0.612463 ,0.229412 ,0.612463 ,0.229412 ,0.595174 ,0.246519 ,0.595174 ,0.246519 ,0.597257 ,0.185538 ,0.585963 ,0.190167 ,0.563374 ,0.199426 ,0.585963 ,0.190167 ,0.563374 ,0.199426 ,0.588882 ,0.143875 ,0.576657 ,0.143875 ,0.576657 ,0.143875 ,0.552208 ,0.143875 ,0.552208 ,0.143875 ,0.597257 ,0.102211 ,0.585963 ,0.0975826 ,0.563374 ,0.0883241 ,0.585963 ,0.0975826 ,0.563374 ,0.0883241 ,0.621107 ,0.0668908 ,0.612463 ,0.0583378 ,0.612463 ,0.0583378 ,0.595174 ,0.0412304 ,0.595174 ,0.0412304 ,0.656802 ,0.0432907 ,0.652123 ,0.0321153 ,0.642766 ,0.00976348 ,0.652123 ,0.0321153 ,0.642766 ,0.00976348 ,0.698905 ,0.0350043 ,0.698905 ,0.0229071 ,0.698905 ,0.0229071 ,0.698905 ,-0.00128639 ,0.698905 ,-0.00128639 ,0.741009 ,0.0432907 ,0.745687 ,0.0321153 ,0.755044 ,0.00976348 ,0.745687 ,0.0321153 ,0.755044 ,0.00976348 ,0.776703 ,0.0668908 ,0.785347 ,0.0583378 ,0.785347 ,0.0583378 ,0.802636 ,0.0412304 ,0.802636 ,0.0412304 ,0.800553 ,0.102211 ,0.811848 ,0.0975826 ,0.834436 ,0.0883241 ,0.811848 ,0.0975826 ,0.834436 ,0.0883241 ,0.808928 ,0.143875 ,0.821153 ,0.143875 ,0.821153 ,0.143875 ,0.845603 ,0.143875 ,0.845603 ,0.143875 ,0.800553 ,0.185538 ,0.811848 ,0.190167 ,0.834436 ,0.199426 ,0.811848 ,0.190167 ,0.834436 ,0.199426 ,0.776703 ,0.220858 ,0.785347 ,0.229412 ,0.785347 ,0.229412 ,0.802636 ,0.246519 ,0.802636 ,0.246519 ,0.741009 ,0.244458 ,0.745687 ,0.255634 ,0.755044 ,0.277986 ,0.745687 ,0.255634 ,0.755044 ,0.277986 ,0.443616 ,0.222924 ,0.443616 ,0.00341809 ,0.518311 ,0.222924 ,0.518311 ,0.00341809 ,0.443616 ,0.223044 ,0.443616 ,0.00353873 ,0.518311 ,0.00353873 ,0.518311 ,0.223044 ,0.443848 ,0.222924 ,0.443848 ,0.00341809 ,0.518543 ,0.00341809 ,0.518543 ,0.222924 ,0.443848 ,0.223044 ,0.443848 ,0.00353873 ,0.518543 ,0.223044 ,0.518543 ,0.00353873 ,0.442219 ,0.222924 ,0.442219 ,0.00341809 ,0.516915 ,0.222924 ,0.516915 ,0.00341809 ,0.442219 ,0.223044 ,0.442219 ,0.00353873 ,0.516915 ,0.00353873 ,0.516915 ,0.223044 ,0.442452 ,0.222924 ,0.442452 ,0.00341809 ,0.517147 ,0.00341809 ,0.517147 ,0.222924 ,0.442452 ,0.223044 ,0.442452 ,0.00353873 ,0.517147 ,0.223044 ,0.517147 ,0.00353873 ,0.442685 ,0.222924 ,0.442685 ,0.00341809 ,0.51738 ,0.222924 ,0.51738 ,0.00341809 ,0.442685 ,0.223044 ,0.442685 ,0.00353873 ,0.51738 ,0.00353873 ,0.51738 ,0.223044 ,0.442918 ,0.222924 ,0.442918 ,0.00341809 ,0.517613 ,0.00341809 ,0.517613 ,0.222924 ,0.442918 ,0.223044 ,0.442918 ,0.00353873 ,0.517613 ,0.223044 ,0.517613 ,0.00353873 ,0.44315 ,0.222924 ,0.44315 ,0.00341809 ,0.517846 ,0.222924 ,0.517846 ,0.00341809 ,0.44315 ,0.223044 ,0.44315 ,0.00353873 ,0.517846 ,0.00353873 ,0.517846 ,0.223044 ,0.443383 ,0.222924 ,0.443383 ,0.00341809 ,0.518078 ,0.00341809 ,0.518078 ,0.222924 ,0.443383 ,0.223044 ,0.443383 ,0.00353873 ,0.518078 ,0.223044 ,0.518078 ,0.00353873 ,0.443615 ,0.222924 ,0.443615 ,0.00341809 ,0.518311 ,0.222924 ,0.518311 ,0.00341809 ,0.443615 ,0.223044 ,0.443615 ,0.00353873 ,0.518311 ,0.00353873 ,0.518311 ,0.223044 ,0.443848 ,0.222924 ,0.443848 ,0.00341809 ,0.518543 ,0.00341809 ,0.518543 ,0.222924 ,0.443848 ,0.223044 ,0.443848 ,0.00353873 ,0.518543 ,0.223044 ,0.518543 ,0.00353873 ,0.442219 ,0.222924 ,0.442219 ,0.00341809 ,0.516915 ,0.222924 ,0.516915 ,0.00341809 ,0.442219 ,0.223044 ,0.442219 ,0.00353873 ,0.516915 ,0.00353873 ,0.516915 ,0.223044 ,0.442452 ,0.222924 ,0.442452 ,0.00341809 ,0.517147 ,0.00341809 ,0.517147 ,0.222924 ,0.442452 ,0.223044 ,0.442452 ,0.00353873 ,0.517147 ,0.223044 ,0.517147 ,0.00353873 ,0.442685 ,0.222924 ,0.442685 ,0.00341809 ,0.51738 ,0.222924 ,0.51738 ,0.00341809 ,0.442685 ,0.223044 ,0.442685 ,0.00353873 ,0.51738 ,0.00353873 ,0.51738 ,0.223044 ,0.442918 ,0.222924 ,0.442918 ,0.00341809 ,0.517613 ,0.00341809 ,0.517613 ,0.222924 ,0.442918 ,0.223044 ,0.442918 ,0.00353873 ,0.517613 ,0.223044 ,0.517613 ,0.00353873 ,0.44315 ,0.222924 ,0.44315 ,0.00341809 ,0.517845 ,0.222924 ,0.517845 ,0.00341809 ,0.44315 ,0.223044 ,0.44315 ,0.00353873 ,0.517845 ,0.00353873 ,0.517845 ,0.223044 ,0.443383 ,0.222924 ,0.443383 ,0.00341809 ,0.518078 ,0.00341809 ,0.518078 ,0.222924 ,0.443383 ,0.223044 ,0.443383 ,0.00353873 ,0.518078 ,0.223044 ,0.518078 ,0.00353873 ] ] ,"faces": [ [ 0 ,1 ,2 ] ,[ 77 ,0 ,2 ] ,[ 0 ,6 ,9 ] ,[ 0 ,9 ,1 ] ,[ 77 ,6 ,0 ] ,[ 1 ,12 ,2 ] ,[ 1 ,9 ,14 ] ,[ 1 ,14 ,12 ] ,[ 6 ,8 ,9 ] ,[ 9 ,8 ,14 ] ,[ 8 ,15 ,14 ] ,[ 14 ,15 ,19 ] ,[ 14 ,19 ,20 ] ,[ 12 ,14 ,20 ] ,[ 12 ,17 ,2 ] ,[ 12 ,20 ,17 ] ,[ 20 ,19 ,24 ] ,[ 17 ,20 ,24 ] ,[ 19 ,25 ,24 ] ,[ 24 ,25 ,29 ] ,[ 24 ,29 ,30 ] ,[ 17 ,24 ,22 ] ,[ 22 ,24 ,30 ] ,[ 17 ,22 ,2 ] ,[ 22 ,27 ,2 ] ,[ 22 ,30 ,27 ] ,[ 30 ,29 ,34 ] ,[ 27 ,30 ,34 ] ,[ 29 ,35 ,34 ] ,[ 34 ,35 ,39 ] ,[ 34 ,39 ,40 ] ,[ 27 ,34 ,32 ] ,[ 32 ,34 ,40 ] ,[ 27 ,32 ,2 ] ,[ 32 ,37 ,2 ] ,[ 32 ,40 ,37 ] ,[ 40 ,39 ,44 ] ,[ 37 ,40 ,44 ] ,[ 39 ,45 ,44 ] ,[ 44 ,45 ,49 ] ,[ 44 ,49 ,50 ] ,[ 37 ,44 ,42 ] ,[ 42 ,44 ,50 ] ,[ 37 ,42 ,2 ] ,[ 42 ,47 ,2 ] ,[ 42 ,50 ,47 ] ,[ 50 ,49 ,54 ] ,[ 47 ,50 ,54 ] ,[ 49 ,55 ,54 ] ,[ 54 ,55 ,59 ] ,[ 54 ,59 ,60 ] ,[ 47 ,54 ,52 ] ,[ 52 ,54 ,60 ] ,[ 47 ,52 ,2 ] ,[ 52 ,57 ,2 ] ,[ 52 ,60 ,57 ] ,[ 60 ,59 ,64 ] ,[ 57 ,60 ,64 ] ,[ 59 ,65 ,64 ] ,[ 64 ,65 ,69 ] ,[ 64 ,69 ,70 ] ,[ 57 ,64 ,62 ] ,[ 62 ,64 ,70 ] ,[ 57 ,62 ,2 ] ,[ 62 ,67 ,2 ] ,[ 62 ,70 ,67 ] ,[ 70 ,69 ,74 ] ,[ 67 ,70 ,74 ] ,[ 69 ,75 ,74 ] ,[ 74 ,75 ,79 ] ,[ 74 ,79 ,80 ] ,[ 67 ,74 ,72 ] ,[ 72 ,74 ,80 ] ,[ 67 ,72 ,2 ] ,[ 72 ,77 ,2 ] ,[ 72 ,80 ,77 ] ,[ 80 ,79 ,6 ] ,[ 77 ,80 ,6 ] ,[ 79 ,7 ,6 ] ,[ 6 ,7 ,8 ] ,[ 3 ,4 ,5 ] ,[ 10 ,3 ,11 ] ,[ 3 ,5 ,11 ] ,[ 78 ,4 ,3 ] ,[ 81 ,78 ,3 ] ,[ 81 ,3 ,10 ] ,[ 5 ,4 ,13 ] ,[ 11 ,5 ,13 ] ,[ 11 ,13 ,16 ] ,[ 13 ,4 ,18 ] ,[ 16 ,13 ,21 ] ,[ 13 ,18 ,21 ] ,[ 18 ,4 ,23 ] ,[ 21 ,18 ,23 ] ,[ 21 ,23 ,26 ] ,[ 23 ,4 ,28 ] ,[ 26 ,23 ,31 ] ,[ 23 ,28 ,31 ] ,[ 28 ,4 ,33 ] ,[ 31 ,28 ,33 ] ,[ 31 ,33 ,36 ] ,[ 33 ,4 ,38 ] ,[ 36 ,33 ,41 ] ,[ 33 ,38 ,41 ] ,[ 38 ,4 ,43 ] ,[ 41 ,38 ,43 ] ,[ 41 ,43 ,46 ] ,[ 43 ,4 ,48 ] ,[ 46 ,43 ,51 ] ,[ 43 ,48 ,51 ] ,[ 48 ,4 ,53 ] ,[ 51 ,48 ,53 ] ,[ 51 ,53 ,56 ] ,[ 53 ,4 ,58 ] ,[ 56 ,53 ,61 ] ,[ 53 ,58 ,61 ] ,[ 58 ,4 ,63 ] ,[ 61 ,58 ,63 ] ,[ 61 ,63 ,66 ] ,[ 63 ,4 ,68 ] ,[ 66 ,63 ,71 ] ,[ 63 ,68 ,71 ] ,[ 68 ,4 ,73 ] ,[ 73 ,4 ,78 ] ,[ 71 ,68 ,73 ] ,[ 71 ,73 ,76 ] ,[ 76 ,73 ,81 ] ,[ 73 ,78 ,81 ] ,[ 82 ,83 ,84 ] ,[ 83 ,85 ,84 ] ,[ 86 ,87 ,88 ] ,[ 86 ,88 ,89 ] ,[ 90 ,91 ,92 ] ,[ 90 ,92 ,93 ] ,[ 94 ,95 ,96 ] ,[ 95 ,97 ,96 ] ,[ 98 ,99 ,100 ] ,[ 99 ,101 ,100 ] ,[ 102 ,103 ,104 ] ,[ 102 ,104 ,105 ] ,[ 106 ,107 ,108 ] ,[ 106 ,108 ,109 ] ,[ 110 ,111 ,112 ] ,[ 111 ,113 ,112 ] ,[ 114 ,115 ,116 ] ,[ 115 ,117 ,116 ] ,[ 118 ,119 ,120 ] ,[ 118 ,120 ,121 ] ,[ 122 ,123 ,124 ] ,[ 122 ,124 ,125 ] ,[ 126 ,127 ,128 ] ,[ 127 ,129 ,128 ] ,[ 130 ,131 ,132 ] ,[ 131 ,133 ,132 ] ,[ 134 ,135 ,136 ] ,[ 134 ,136 ,137 ] ,[ 138 ,139 ,140 ] ,[ 138 ,140 ,141 ] ,[ 142 ,143 ,144 ] ,[ 143 ,145 ,144 ] ,[ 146 ,147 ,148 ] ,[ 147 ,149 ,148 ] ,[ 150 ,151 ,152 ] ,[ 150 ,152 ,153 ] ,[ 154 ,155 ,156 ] ,[ 154 ,156 ,157 ] ,[ 158 ,159 ,160 ] ,[ 159 ,161 ,160 ] ,[ 162 ,163 ,164 ] ,[ 163 ,165 ,164 ] ,[ 166 ,167 ,168 ] ,[ 166 ,168 ,169 ] ,[ 170 ,171 ,172 ] ,[ 170 ,172 ,173 ] ,[ 174 ,175 ,176 ] ,[ 175 ,177 ,176 ] ,[ 178 ,179 ,180 ] ,[ 179 ,181 ,180 ] ,[ 182 ,183 ,184 ] ,[ 182 ,184 ,185 ] ,[ 186 ,187 ,188 ] ,[ 186 ,188 ,189 ] ,[ 190 ,191 ,192 ] ,[ 191 ,193 ,192 ] ,[ 194 ,195 ,196 ] ,[ 195 ,197 ,196 ] ,[ 198 ,199 ,200 ] ,[ 198 ,200 ,201 ] ,[ 202 ,203 ,204 ] ,[ 202 ,204 ,205 ] ,[ 206 ,207 ,208 ] ,[ 207 ,209 ,208 ] ,[ 210 ,211 ,212 ] ,[ 210 ,222 ,211 ] ,[ 210 ,227 ,222 ] ,[ 210 ,232 ,227 ] ,[ 210 ,237 ,232 ] ,[ 210 ,242 ,237 ] ,[ 210 ,247 ,242 ] ,[ 210 ,252 ,247 ] ,[ 210 ,257 ,252 ] ,[ 210 ,262 ,257 ] ,[ 210 ,267 ,262 ] ,[ 210 ,272 ,267 ] ,[ 210 ,277 ,272 ] ,[ 210 ,282 ,277 ] ,[ 210 ,287 ,282 ] ,[ 210 ,212 ,287 ] ,[ 272 ,274 ,267 ] ,[ 280 ,274 ,272 ] ,[ 277 ,280 ,272 ] ,[ 284 ,280 ,277 ] ,[ 282 ,284 ,277 ] ,[ 290 ,284 ,282 ] ,[ 287 ,290 ,282 ] ,[ 218 ,290 ,287 ] ,[ 212 ,218 ,287 ] ,[ 219 ,218 ,212 ] ,[ 211 ,219 ,212 ] ,[ 216 ,217 ,218 ] ,[ 219 ,216 ,218 ] ,[ 218 ,289 ,290 ] ,[ 218 ,217 ,289 ] ,[ 290 ,289 ,284 ] ,[ 289 ,285 ,284 ] ,[ 284 ,285 ,279 ] ,[ 284 ,279 ,280 ] ,[ 279 ,275 ,274 ] ,[ 280 ,279 ,274 ] ,[ 274 ,275 ,269 ] ,[ 274 ,269 ,270 ] ,[ 274 ,270 ,267 ] ,[ 269 ,265 ,264 ] ,[ 270 ,269 ,264 ] ,[ 270 ,264 ,262 ] ,[ 267 ,270 ,262 ] ,[ 264 ,259 ,260 ] ,[ 264 ,265 ,259 ] ,[ 264 ,260 ,257 ] ,[ 262 ,264 ,257 ] ,[ 259 ,255 ,254 ] ,[ 260 ,259 ,254 ] ,[ 260 ,254 ,252 ] ,[ 257 ,260 ,252 ] ,[ 254 ,249 ,250 ] ,[ 254 ,255 ,249 ] ,[ 254 ,250 ,247 ] ,[ 252 ,254 ,247 ] ,[ 249 ,245 ,244 ] ,[ 250 ,249 ,244 ] ,[ 250 ,244 ,242 ] ,[ 247 ,250 ,242 ] ,[ 244 ,239 ,240 ] ,[ 244 ,245 ,239 ] ,[ 244 ,240 ,237 ] ,[ 242 ,244 ,237 ] ,[ 239 ,235 ,234 ] ,[ 240 ,239 ,234 ] ,[ 240 ,234 ,232 ] ,[ 237 ,240 ,232 ] ,[ 234 ,229 ,230 ] ,[ 234 ,235 ,229 ] ,[ 234 ,230 ,227 ] ,[ 232 ,234 ,227 ] ,[ 229 ,225 ,224 ] ,[ 230 ,229 ,224 ] ,[ 230 ,224 ,222 ] ,[ 227 ,230 ,222 ] ,[ 224 ,216 ,219 ] ,[ 224 ,225 ,216 ] ,[ 224 ,219 ,211 ] ,[ 222 ,224 ,211 ] ,[ 213 ,214 ,215 ] ,[ 220 ,213 ,215 ] ,[ 223 ,214 ,213 ] ,[ 223 ,213 ,220 ] ,[ 220 ,215 ,221 ] ,[ 215 ,214 ,288 ] ,[ 215 ,288 ,291 ] ,[ 221 ,215 ,291 ] ,[ 226 ,223 ,220 ] ,[ 228 ,214 ,223 ] ,[ 231 ,223 ,226 ] ,[ 231 ,228 ,223 ] ,[ 233 ,214 ,228 ] ,[ 233 ,228 ,231 ] ,[ 236 ,233 ,231 ] ,[ 238 ,214 ,233 ] ,[ 241 ,233 ,236 ] ,[ 241 ,238 ,233 ] ,[ 243 ,214 ,238 ] ,[ 243 ,238 ,241 ] ,[ 246 ,243 ,241 ] ,[ 248 ,214 ,243 ] ,[ 251 ,243 ,246 ] ,[ 251 ,248 ,243 ] ,[ 253 ,214 ,248 ] ,[ 253 ,248 ,251 ] ,[ 256 ,253 ,251 ] ,[ 258 ,214 ,253 ] ,[ 261 ,253 ,256 ] ,[ 261 ,258 ,253 ] ,[ 263 ,214 ,258 ] ,[ 263 ,258 ,261 ] ,[ 266 ,263 ,261 ] ,[ 268 ,214 ,263 ] ,[ 271 ,263 ,266 ] ,[ 271 ,268 ,263 ] ,[ 273 ,214 ,268 ] ,[ 273 ,268 ,271 ] ,[ 278 ,214 ,273 ] ,[ 283 ,214 ,278 ] ,[ 288 ,214 ,283 ] ,[ 276 ,273 ,271 ] ,[ 281 ,273 ,276 ] ,[ 281 ,278 ,273 ] ,[ 283 ,278 ,281 ] ,[ 286 ,283 ,281 ] ,[ 291 ,283 ,286 ] ,[ 291 ,288 ,283 ] ,[ 292 ,293 ,294 ] ,[ 292 ,295 ,293 ] ,[ 296 ,297 ,298 ] ,[ 299 ,296 ,298 ] ,[ 300 ,301 ,302 ] ,[ 303 ,300 ,302 ] ,[ 304 ,305 ,306 ] ,[ 304 ,307 ,305 ] ,[ 308 ,309 ,310 ] ,[ 308 ,311 ,309 ] ,[ 312 ,313 ,314 ] ,[ 315 ,312 ,314 ] ,[ 316 ,317 ,318 ] ,[ 319 ,316 ,318 ] ,[ 320 ,321 ,322 ] ,[ 320 ,323 ,321 ] ,[ 324 ,325 ,326 ] ,[ 324 ,327 ,325 ] ,[ 328 ,329 ,330 ] ,[ 331 ,328 ,330 ] ,[ 332 ,333 ,334 ] ,[ 335 ,332 ,334 ] ,[ 336 ,337 ,338 ] ,[ 336 ,339 ,337 ] ,[ 340 ,341 ,342 ] ,[ 340 ,343 ,341 ] ,[ 344 ,345 ,346 ] ,[ 347 ,344 ,346 ] ,[ 348 ,349 ,350 ] ,[ 351 ,348 ,350 ] ,[ 352 ,353 ,354 ] ,[ 352 ,355 ,353 ] ,[ 356 ,357 ,358 ] ,[ 356 ,359 ,357 ] ,[ 360 ,361 ,362 ] ,[ 363 ,360 ,362 ] ,[ 364 ,365 ,366 ] ,[ 367 ,364 ,366 ] ,[ 368 ,369 ,370 ] ,[ 368 ,371 ,369 ] ,[ 372 ,373 ,374 ] ,[ 372 ,375 ,373 ] ,[ 376 ,377 ,378 ] ,[ 379 ,376 ,378 ] ,[ 380 ,381 ,382 ] ,[ 383 ,380 ,382 ] ,[ 384 ,385 ,386 ] ,[ 384 ,387 ,385 ] ,[ 388 ,389 ,390 ] ,[ 388 ,391 ,389 ] ,[ 392 ,393 ,394 ] ,[ 395 ,392 ,394 ] ,[ 396 ,397 ,398 ] ,[ 399 ,396 ,398 ] ,[ 400 ,401 ,402 ] ,[ 400 ,403 ,401 ] ,[ 404 ,405 ,406 ] ,[ 404 ,407 ,405 ] ,[ 408 ,409 ,410 ] ,[ 411 ,408 ,410 ] ,[ 412 ,413 ,414 ] ,[ 415 ,412 ,414 ] ,[ 416 ,417 ,418 ] ,[ 416 ,419 ,417 ] ,[ 420 ,421 ,422 ] ,[ 420 ,432 ,421 ] ,[ 420 ,437 ,432 ] ,[ 420 ,442 ,437 ] ,[ 420 ,447 ,442 ] ,[ 420 ,452 ,447 ] ,[ 420 ,457 ,452 ] ,[ 420 ,462 ,457 ] ,[ 420 ,467 ,462 ] ,[ 420 ,472 ,467 ] ,[ 420 ,477 ,472 ] ,[ 420 ,482 ,477 ] ,[ 420 ,487 ,482 ] ,[ 420 ,492 ,487 ] ,[ 420 ,497 ,492 ] ,[ 420 ,422 ,497 ] ,[ 482 ,484 ,477 ] ,[ 490 ,484 ,482 ] ,[ 487 ,490 ,482 ] ,[ 494 ,490 ,487 ] ,[ 492 ,494 ,487 ] ,[ 500 ,494 ,492 ] ,[ 497 ,500 ,492 ] ,[ 428 ,500 ,497 ] ,[ 422 ,428 ,497 ] ,[ 429 ,428 ,422 ] ,[ 421 ,429 ,422 ] ,[ 426 ,427 ,428 ] ,[ 429 ,426 ,428 ] ,[ 428 ,499 ,500 ] ,[ 428 ,427 ,499 ] ,[ 500 ,499 ,494 ] ,[ 499 ,495 ,494 ] ,[ 494 ,495 ,489 ] ,[ 494 ,489 ,490 ] ,[ 489 ,485 ,484 ] ,[ 490 ,489 ,484 ] ,[ 484 ,485 ,479 ] ,[ 484 ,479 ,480 ] ,[ 484 ,480 ,477 ] ,[ 479 ,475 ,474 ] ,[ 480 ,479 ,474 ] ,[ 480 ,474 ,472 ] ,[ 477 ,480 ,472 ] ,[ 474 ,469 ,470 ] ,[ 474 ,475 ,469 ] ,[ 474 ,470 ,467 ] ,[ 472 ,474 ,467 ] ,[ 469 ,465 ,464 ] ,[ 470 ,469 ,464 ] ,[ 470 ,464 ,462 ] ,[ 467 ,470 ,462 ] ,[ 464 ,459 ,460 ] ,[ 464 ,465 ,459 ] ,[ 464 ,460 ,457 ] ,[ 462 ,464 ,457 ] ,[ 459 ,455 ,454 ] ,[ 460 ,459 ,454 ] ,[ 460 ,454 ,452 ] ,[ 457 ,460 ,452 ] ,[ 454 ,449 ,450 ] ,[ 454 ,455 ,449 ] ,[ 454 ,450 ,447 ] ,[ 452 ,454 ,447 ] ,[ 449 ,445 ,444 ] ,[ 450 ,449 ,444 ] ,[ 450 ,444 ,442 ] ,[ 447 ,450 ,442 ] ,[ 444 ,439 ,440 ] ,[ 444 ,445 ,439 ] ,[ 444 ,440 ,437 ] ,[ 442 ,444 ,437 ] ,[ 439 ,435 ,434 ] ,[ 440 ,439 ,434 ] ,[ 440 ,434 ,432 ] ,[ 437 ,440 ,432 ] ,[ 434 ,426 ,429 ] ,[ 434 ,435 ,426 ] ,[ 434 ,429 ,421 ] ,[ 432 ,434 ,421 ] ,[ 423 ,424 ,425 ] ,[ 430 ,423 ,425 ] ,[ 433 ,424 ,423 ] ,[ 433 ,423 ,430 ] ,[ 430 ,425 ,431 ] ,[ 425 ,424 ,498 ] ,[ 425 ,498 ,501 ] ,[ 431 ,425 ,501 ] ,[ 436 ,433 ,430 ] ,[ 438 ,424 ,433 ] ,[ 441 ,433 ,436 ] ,[ 441 ,438 ,433 ] ,[ 443 ,424 ,438 ] ,[ 443 ,438 ,441 ] ,[ 446 ,443 ,441 ] ,[ 448 ,424 ,443 ] ,[ 451 ,443 ,446 ] ,[ 451 ,448 ,443 ] ,[ 453 ,424 ,448 ] ,[ 453 ,448 ,451 ] ,[ 456 ,453 ,451 ] ,[ 458 ,424 ,453 ] ,[ 461 ,453 ,456 ] ,[ 461 ,458 ,453 ] ,[ 463 ,424 ,458 ] ,[ 463 ,458 ,461 ] ,[ 466 ,463 ,461 ] ,[ 468 ,424 ,463 ] ,[ 471 ,463 ,466 ] ,[ 471 ,468 ,463 ] ,[ 473 ,424 ,468 ] ,[ 473 ,468 ,471 ] ,[ 476 ,473 ,471 ] ,[ 478 ,424 ,473 ] ,[ 481 ,473 ,476 ] ,[ 481 ,478 ,473 ] ,[ 483 ,424 ,478 ] ,[ 483 ,478 ,481 ] ,[ 488 ,424 ,483 ] ,[ 493 ,424 ,488 ] ,[ 498 ,424 ,493 ] ,[ 486 ,483 ,481 ] ,[ 491 ,483 ,486 ] ,[ 491 ,488 ,483 ] ,[ 493 ,488 ,491 ] ,[ 496 ,493 ,491 ] ,[ 501 ,493 ,496 ] ,[ 501 ,498 ,493 ] ,[ 502 ,503 ,504 ] ,[ 502 ,505 ,503 ] ,[ 506 ,507 ,508 ] ,[ 509 ,506 ,508 ] ,[ 510 ,511 ,512 ] ,[ 513 ,510 ,512 ] ,[ 514 ,515 ,516 ] ,[ 514 ,517 ,515 ] ,[ 518 ,519 ,520 ] ,[ 518 ,521 ,519 ] ,[ 522 ,523 ,524 ] ,[ 525 ,522 ,524 ] ,[ 526 ,527 ,528 ] ,[ 529 ,526 ,528 ] ,[ 530 ,531 ,532 ] ,[ 530 ,533 ,531 ] ,[ 534 ,535 ,536 ] ,[ 534 ,537 ,535 ] ,[ 538 ,539 ,540 ] ,[ 541 ,538 ,540 ] ,[ 542 ,543 ,544 ] ,[ 545 ,542 ,544 ] ,[ 546 ,547 ,548 ] ,[ 546 ,549 ,547 ] ,[ 550 ,551 ,552 ] ,[ 550 ,553 ,551 ] ,[ 554 ,555 ,556 ] ,[ 557 ,554 ,556 ] ,[ 558 ,559 ,560 ] ,[ 561 ,558 ,560 ] ,[ 562 ,563 ,564 ] ,[ 562 ,565 ,563 ] ,[ 566 ,567 ,568 ] ,[ 566 ,569 ,567 ] ,[ 570 ,571 ,572 ] ,[ 573 ,570 ,572 ] ,[ 574 ,575 ,576 ] ,[ 577 ,574 ,576 ] ,[ 578 ,579 ,580 ] ,[ 578 ,581 ,579 ] ,[ 582 ,583 ,584 ] ,[ 582 ,585 ,583 ] ,[ 586 ,587 ,588 ] ,[ 589 ,586 ,588 ] ,[ 590 ,591 ,592 ] ,[ 593 ,590 ,592 ] ,[ 594 ,595 ,596 ] ,[ 594 ,597 ,595 ] ,[ 598 ,599 ,600 ] ,[ 598 ,601 ,599 ] ,[ 602 ,603 ,604 ] ,[ 605 ,602 ,604 ] ,[ 606 ,607 ,608 ] ,[ 609 ,606 ,608 ] ,[ 610 ,611 ,612 ] ,[ 610 ,613 ,611 ] ,[ 614 ,615 ,616 ] ,[ 614 ,617 ,615 ] ,[ 618 ,619 ,620 ] ,[ 621 ,618 ,620 ] ,[ 622 ,623 ,624 ] ,[ 625 ,622 ,624 ] ,[ 626 ,627 ,628 ] ,[ 626 ,629 ,627 ] ,[ 630 ,631 ,632 ] ,[ 631 ,633 ,632 ] ,[ 634 ,635 ,636 ] ,[ 635 ,637 ,636 ] ,[ 638 ,639 ,640 ] ,[ 639 ,641 ,640 ] ,[ 642 ,643 ,644 ] ,[ 643 ,645 ,644 ] ,[ 646 ,647 ,648 ] ,[ 674 ,647 ,646 ] ,[ 674 ,646 ,675 ] ,[ 647 ,649 ,648 ] ,[ 647 ,664 ,649 ] ,[ 673 ,664 ,647 ] ,[ 673 ,647 ,674 ] ,[ 666 ,648 ,649 ] ,[ 664 ,665 ,649 ] ,[ 666 ,649 ,667 ] ,[ 669 ,649 ,670 ] ,[ 669 ,670 ,671 ] ,[ 650 ,651 ,652 ] ,[ 651 ,653 ,652 ] ,[ 652 ,654 ,663 ] ,[ 652 ,663 ,668 ] ,[ 653 ,654 ,652 ] ,[ 653 ,655 ,654 ] ,[ 654 ,655 ,656 ] ,[ 656 ,662 ,654 ] ,[ 662 ,663 ,654 ] ,[ 655 ,657 ,656 ] ,[ 658 ,656 ,657 ] ,[ 672 ,662 ,656 ] ,[ 672 ,656 ,658 ] ,[ 658 ,657 ,659 ] ,[ 658 ,659 ,660 ] ,[ 659 ,661 ,660 ] ,[ 676 ,677 ,678 ] ,[ 676 ,679 ,677 ] ,[ 680 ,681 ,682 ] ,[ 680 ,683 ,681 ] ,[ 684 ,685 ,686 ] ,[ 684 ,687 ,685 ] ,[ 688 ,689 ,690 ] ,[ 688 ,691 ,689 ] ,[ 692 ,693 ,694 ] ,[ 692 ,695 ,693 ] ,[ 695 ,692 ,712 ] ,[ 695 ,710 ,693 ] ,[ 693 ,710 ,705 ] ,[ 707 ,693 ,705 ] ,[ 694 ,693 ,707 ] ,[ 723 ,694 ,707 ] ,[ 704 ,707 ,705 ] ,[ 704 ,705 ,706 ] ,[ 695 ,711 ,710 ] ,[ 713 ,695 ,712 ] ,[ 716 ,695 ,697 ] ,[ 699 ,716 ,697 ] ,[ 696 ,697 ,698 ] ,[ 696 ,699 ,697 ] ,[ 700 ,701 ,702 ] ,[ 700 ,703 ,701 ] ,[ 702 ,708 ,700 ] ,[ 703 ,700 ,719 ] ,[ 700 ,708 ,721 ] ,[ 722 ,700 ,721 ] ,[ 702 ,701 ,717 ] ,[ 718 ,702 ,717 ] ,[ 702 ,709 ,708 ] ,[ 709 ,702 ,714 ] ,[ 715 ,709 ,714 ] ,[ 720 ,703 ,719 ] ,[ 724 ,725 ,726 ] ,[ 725 ,727 ,726 ] ,[ 728 ,729 ,730 ] ,[ 729 ,731 ,730 ] ,[ 732 ,733 ,734 ] ,[ 735 ,736 ,734 ] ,[ 737 ,738 ,739 ] ,[ 738 ,740 ,739 ] ,[ 741 ,742 ,743 ] ,[ 742 ,744 ,743 ] ,[ 745 ,746 ,747 ] ,[ 747 ,748 ,745 ] ,[ 748 ,749 ,745 ] ,[ 745 ,752 ,753 ] ,[ 745 ,753 ,754 ] ,[ 748 ,750 ,751 ] ,[ 751 ,749 ,748 ] ,[ 754 ,753 ,755 ] ,[ 754 ,755 ,756 ] ,[ 773 ,753 ,752 ] ,[ 752 ,774 ,773 ] ,[ 752 ,775 ,774 ] ,[ 776 ,777 ,774 ] ,[ 774 ,775 ,776 ] ,[ 757 ,758 ,759 ] ,[ 757 ,759 ,760 ] ,[ 761 ,762 ,763 ] ,[ 761 ,763 ,764 ] ,[ 765 ,766 ,767 ] ,[ 765 ,767 ,768 ] ,[ 769 ,770 ,771 ] ,[ 769 ,771 ,772 ] ,[ 778 ,779 ,780 ] ,[ 779 ,781 ,780 ] ,[ 794 ,781 ,779 ] ,[ 794 ,779 ,795 ] ,[ 780 ,781 ,782 ] ,[ 780 ,782 ,783 ] ,[ 796 ,782 ,781 ] ,[ 796 ,781 ,794 ] ,[ 802 ,794 ,795 ] ,[ 804 ,796 ,794 ] ,[ 804 ,794 ,802 ] ,[ 802 ,795 ,803 ] ,[ 810 ,802 ,803 ] ,[ 812 ,804 ,802 ] ,[ 812 ,802 ,810 ] ,[ 805 ,796 ,804 ] ,[ 813 ,805 ,804 ] ,[ 813 ,804 ,812 ] ,[ 797 ,782 ,796 ] ,[ 805 ,797 ,796 ] ,[ 797 ,785 ,782 ] ,[ 782 ,785 ,784 ] ,[ 783 ,782 ,784 ] ,[ 820 ,812 ,810 ] ,[ 821 ,813 ,812 ] ,[ 821 ,812 ,820 ] ,[ 820 ,810 ,818 ] ,[ 818 ,810 ,811 ] ,[ 818 ,811 ,819 ] ,[ 810 ,803 ,811 ] ,[ 786 ,787 ,788 ] ,[ 786 ,788 ,789 ] ,[ 798 ,788 ,787 ] ,[ 798 ,787 ,799 ] ,[ 789 ,788 ,790 ] ,[ 788 ,791 ,790 ] ,[ 800 ,791 ,788 ] ,[ 800 ,788 ,798 ] ,[ 806 ,798 ,799 ] ,[ 808 ,800 ,798 ] ,[ 808 ,798 ,806 ] ,[ 806 ,799 ,807 ] ,[ 814 ,806 ,807 ] ,[ 816 ,808 ,806 ] ,[ 816 ,806 ,814 ] ,[ 809 ,800 ,808 ] ,[ 817 ,809 ,808 ] ,[ 817 ,808 ,816 ] ,[ 801 ,791 ,800 ] ,[ 809 ,801 ,800 ] ,[ 801 ,792 ,791 ] ,[ 790 ,791 ,792 ] ,[ 790 ,792 ,793 ] ,[ 824 ,816 ,814 ] ,[ 825 ,817 ,816 ] ,[ 825 ,816 ,824 ] ,[ 824 ,814 ,822 ] ,[ 822 ,814 ,815 ] ,[ 822 ,815 ,823 ] ,[ 814 ,807 ,815 ] ,[ 826 ,827 ,828 ] ,[ 826 ,828 ,829 ] ,[ 830 ,827 ,826 ] ,[ 830 ,831 ,827 ] ,[ 832 ,831 ,830 ] ,[ 832 ,833 ,831 ] ,[ 834 ,835 ,836 ] ,[ 834 ,836 ,837 ] ,[ 838 ,835 ,834 ] ,[ 838 ,839 ,835 ] ,[ 840 ,839 ,838 ] ,[ 840 ,841 ,839 ] ,[ 842 ,843 ,844 ] ,[ 843 ,845 ,844 ] ,[ 846 ,847 ,848 ] ,[ 846 ,848 ,849 ] ,[ 850 ,851 ,852 ] ,[ 851 ,853 ,852 ] ,[ 854 ,855 ,856 ] ,[ 854 ,856 ,857 ] ,[ 858 ,859 ,860 ] ,[ 859 ,861 ,860 ] ,[ 862 ,863 ,864 ] ,[ 862 ,864 ,865 ] ,[ 866 ,867 ,868 ] ,[ 882 ,867 ,866 ] ,[ 884 ,866 ,868 ] ,[ 892 ,882 ,866 ] ,[ 892 ,866 ,884 ] ,[ 867 ,869 ,868 ] ,[ 882 ,883 ,867 ] ,[ 868 ,869 ,870 ] ,[ 868 ,870 ,871 ] ,[ 871 ,870 ,872 ] ,[ 870 ,873 ,872 ] ,[ 885 ,868 ,871 ] ,[ 885 ,871 ,886 ] ,[ 886 ,871 ,872 ] ,[ 872 ,873 ,874 ] ,[ 872 ,874 ,875 ] ,[ 886 ,872 ,887 ] ,[ 887 ,872 ,875 ] ,[ 894 ,885 ,886 ] ,[ 894 ,886 ,895 ] ,[ 895 ,886 ,887 ] ,[ 887 ,875 ,888 ] ,[ 895 ,887 ,896 ] ,[ 896 ,887 ,888 ] ,[ 875 ,874 ,876 ] ,[ 888 ,875 ,876 ] ,[ 874 ,877 ,876 ] ,[ 888 ,876 ,889 ] ,[ 896 ,888 ,897 ] ,[ 897 ,888 ,889 ] ,[ 897 ,889 ,898 ] ,[ 893 ,885 ,894 ] ,[ 893 ,884 ,885 ] ,[ 904 ,884 ,893 ] ,[ 884 ,868 ,885 ] ,[ 904 ,892 ,884 ] ,[ 903 ,892 ,904 ] ,[ 891 ,882 ,892 ] ,[ 903 ,891 ,892 ] ,[ 902 ,891 ,903 ] ,[ 890 ,881 ,891 ] ,[ 891 ,881 ,882 ] ,[ 881 ,880 ,882 ] ,[ 880 ,883 ,882 ] ,[ 878 ,880 ,881 ] ,[ 890 ,878 ,881 ] ,[ 878 ,879 ,880 ] ,[ 899 ,900 ,901 ] ,[ 905 ,906 ,907 ] ,[ 905 ,907 ,919 ] ,[ 929 ,907 ,906 ] ,[ 919 ,907 ,909 ] ,[ 930 ,931 ,907 ] ,[ 907 ,929 ,930 ] ,[ 919 ,909 ,908 ] ,[ 908 ,909 ,910 ] ,[ 908 ,910 ,920 ] ,[ 920 ,910 ,921 ] ,[ 920 ,921 ,922 ] ,[ 922 ,921 ,923 ] ,[ 921 ,932 ,931 ] ,[ 931 ,930 ,921 ] ,[ 929 ,933 ,930 ] ,[ 922 ,923 ,924 ] ,[ 911 ,912 ,913 ] ,[ 912 ,914 ,915 ] ,[ 915 ,913 ,912 ] ,[ 915 ,918 ,913 ] ,[ 917 ,915 ,914 ] ,[ 914 ,916 ,917 ] ,[ 925 ,926 ,927 ] ,[ 925 ,927 ,928 ] ,[ 934 ,935 ,936 ] ,[ 940 ,935 ,934 ] ,[ 936 ,935 ,937 ] ,[ 937 ,935 ,938 ] ,[ 938 ,935 ,939 ] ,[ 939 ,935 ,940 ] ,[ 941 ,942 ,943 ] ,[ 942 ,944 ,943 ] ,[ 943 ,944 ,945 ] ,[ 943 ,945 ,946 ] ,[ 946 ,945 ,947 ] ,[ 945 ,948 ,947 ] ,[ 949 ,950 ,951 ] ,[ 949 ,951 ,952 ] ,[ 952 ,951 ,953 ] ,[ 951 ,954 ,953 ] ,[ 953 ,954 ,955 ] ,[ 953 ,955 ,956 ] ,[ 957 ,958 ,959 ] ,[ 958 ,960 ,959 ] ,[ 961 ,962 ,963 ] ,[ 962 ,964 ,963 ] ,[ 965 ,966 ,967 ] ,[ 966 ,968 ,967 ] ,[ 969 ,970 ,971 ] ,[ 970 ,972 ,971 ] ,[ 973 ,974 ,975 ] ,[ 974 ,976 ,975 ] ,[ 977 ,978 ,979 ] ,[ 977 ,979 ,980 ] ,[ 981 ,977 ,980 ] ,[ 981 ,980 ,982 ] ,[ 983 ,984 ,985 ] ,[ 983 ,985 ,986 ] ,[ 987 ,984 ,983 ] ,[ 987 ,988 ,984 ] ,[ 989 ,988 ,987 ] ,[ 989 ,990 ,988 ] ,[ 1001 ,990 ,989 ] ,[ 1001 ,1002 ,990 ] ,[ 1003 ,1002 ,1001 ] ,[ 1003 ,1004 ,1002 ] ,[ 1005 ,1004 ,1003 ] ,[ 1005 ,1006 ,1004 ] ,[ 986 ,985 ,991 ] ,[ 986 ,991 ,992 ] ,[ 992 ,991 ,993 ] ,[ 992 ,993 ,994 ] ,[ 994 ,993 ,995 ] ,[ 994 ,995 ,996 ] ,[ 996 ,995 ,997 ] ,[ 996 ,997 ,998 ] ,[ 998 ,997 ,999 ] ,[ 998 ,999 ,1000 ] ,[ 1007 ,1008 ,1009 ] ,[ 1007 ,1009 ,1010 ] ,[ 1011 ,1008 ,1007 ] ,[ 1011 ,1012 ,1008 ] ,[ 1013 ,1014 ,1015 ] ,[ 1013 ,1019 ,1020 ] ,[ 1020 ,1014 ,1013 ] ,[ 1014 ,1016 ,1015 ] ,[ 1014 ,1017 ,1016 ] ,[ 1014 ,1018 ,1017 ] ,[ 1021 ,1014 ,1020 ] ,[ 1018 ,1014 ,1021 ] ,[ 1022 ,1020 ,1019 ] ,[ 1019 ,1023 ,1024 ] ,[ 1024 ,1022 ,1019 ] ,[ 1023 ,1025 ,1026 ] ,[ 1023 ,1026 ,1024 ] ,[ 1025 ,1027 ,1026 ] ,[ 1035 ,1027 ,1025 ] ,[ 1021 ,1028 ,1018 ] ,[ 1018 ,1028 ,1029 ] ,[ 1029 ,1028 ,1030 ] ,[ 1029 ,1017 ,1018 ] ,[ 1031 ,1029 ,1030 ] ,[ 1031 ,1030 ,1032 ] ,[ 1033 ,1031 ,1032 ] ,[ 1032 ,1034 ,1033 ] ,[ 1036 ,1037 ,1038 ] ,[ 1036 ,1038 ,1039 ] ,[ 1040 ,1037 ,1036 ] ,[ 1040 ,1041 ,1037 ] ,[ 1042 ,1041 ,1040 ] ,[ 1042 ,1043 ,1041 ] ,[ 1070 ,1043 ,1042 ] ,[ 1070 ,1071 ,1043 ] ,[ 1074 ,1071 ,1070 ] ,[ 1074 ,1075 ,1071 ] ,[ 1078 ,1075 ,1074 ] ,[ 1078 ,1079 ,1075 ] ,[ 1083 ,1079 ,1078 ] ,[ 1083 ,1084 ,1079 ] ,[ 1039 ,1038 ,1044 ] ,[ 1039 ,1044 ,1045 ] ,[ 1045 ,1044 ,1052 ] ,[ 1045 ,1052 ,1053 ] ,[ 1053 ,1052 ,1056 ] ,[ 1053 ,1056 ,1057 ] ,[ 1057 ,1056 ,1061 ] ,[ 1057 ,1061 ,1062 ] ,[ 1062 ,1061 ,1066 ] ,[ 1062 ,1066 ,1067 ] ,[ 1067 ,1066 ,1065 ] ,[ 1067 ,1085 ,1086 ] ,[ 1064 ,1065 ,1060 ] ,[ 1064 ,1060 ,1063 ] ,[ 1059 ,1060 ,1058 ] ,[ 1059 ,1063 ,1060 ] ,[ 1059 ,1058 ,1054 ] ,[ 1054 ,1058 ,1055 ] ,[ 1050 ,1054 ,1051 ] ,[ 1054 ,1055 ,1051 ] ,[ 1050 ,1051 ,1047 ] ,[ 1050 ,1047 ,1046 ] ,[ 1046 ,1047 ,1048 ] ,[ 1046 ,1048 ,1049 ] ,[ 1049 ,1048 ,1068 ] ,[ 1049 ,1068 ,1069 ] ,[ 1069 ,1068 ,1072 ] ,[ 1069 ,1072 ,1073 ] ,[ 1073 ,1072 ,1076 ] ,[ 1073 ,1076 ,1077 ] ,[ 1080 ,1076 ,1081 ] ,[ 1077 ,1076 ,1082 ] ,[ 1087 ,1088 ,1089 ] ,[ 1087 ,1089 ,1090 ] ,[ 1091 ,1088 ,1087 ] ,[ 1091 ,1092 ,1088 ] ,[ 1093 ,1092 ,1091 ] ,[ 1093 ,1094 ,1092 ] ,[ 1111 ,1094 ,1093 ] ,[ 1111 ,1112 ,1094 ] ,[ 1113 ,1112 ,1111 ] ,[ 1113 ,1114 ,1112 ] ,[ 1115 ,1114 ,1113 ] ,[ 1115 ,1116 ,1114 ] ,[ 1090 ,1089 ,1095 ] ,[ 1090 ,1095 ,1096 ] ,[ 1096 ,1095 ,1097 ] ,[ 1096 ,1097 ,1098 ] ,[ 1098 ,1097 ,1099 ] ,[ 1098 ,1099 ,1100 ] ,[ 1100 ,1099 ,1101 ] ,[ 1100 ,1101 ,1102 ] ,[ 1102 ,1101 ,1106 ] ,[ 1102 ,1106 ,1107 ] ,[ 1107 ,1108 ,1104 ] ,[ 1107 ,1109 ,1110 ] ,[ 1103 ,1104 ,1105 ] ,[ 1117 ,1118 ,1119 ] ,[ 1117 ,1119 ,1120 ] ,[ 1121 ,1122 ,1123 ] ,[ 1121 ,1123 ,1124 ] ,[ 1135 ,1121 ,1124 ] ,[ 1137 ,1132 ,1121 ] ,[ 1137 ,1121 ,1135 ] ,[ 1144 ,1143 ,1121 ] ,[ 1127 ,1121 ,1128 ] ,[ 1128 ,1121 ,1132 ] ,[ 1135 ,1124 ,1136 ] ,[ 1129 ,1131 ,1132 ] ,[ 1138 ,1129 ,1132 ] ,[ 1138 ,1132 ,1137 ] ,[ 1128 ,1132 ,1125 ] ,[ 1125 ,1127 ,1128 ] ,[ 1125 ,1126 ,1127 ] ,[ 1140 ,1129 ,1138 ] ,[ 1129 ,1130 ,1131 ] ,[ 1133 ,1130 ,1129 ] ,[ 1139 ,1133 ,1129 ] ,[ 1133 ,1134 ,1130 ] ,[ 1141 ,1142 ,1143 ] ,[ 1141 ,1143 ,1144 ] ,[ 1752 ,1143 ,1144 ] ,[ 1750 ,1751 ,1752 ] ,[ 1753 ,1750 ,1752 ] ,[ 1753 ,1752 ,1764 ] ,[ 1752 ,1761 ,1766 ] ,[ 1764 ,1752 ,1766 ] ,[ 1757 ,1752 ,1754 ] ,[ 1761 ,1752 ,1757 ] ,[ 1765 ,1753 ,1764 ] ,[ 1757 ,1754 ,1756 ] ,[ 1756 ,1761 ,1757 ] ,[ 1761 ,1758 ,1760 ] ,[ 1761 ,1760 ,1767 ] ,[ 1766 ,1761 ,1767 ] ,[ 1758 ,1759 ,1760 ] ,[ 1760 ,1759 ,1763 ] ,[ 1760 ,1763 ,1768 ] ,[ 1767 ,1760 ,1769 ] ,[ 1759 ,1762 ,1763 ] ,[ 1754 ,1755 ,1756 ] ,[ 1145 ,1146 ,1147 ] ,[ 1145 ,1147 ,1148 ] ,[ 1149 ,1146 ,1145 ] ,[ 1153 ,1145 ,1148 ] ,[ 1155 ,1149 ,1145 ] ,[ 1156 ,1145 ,1153 ] ,[ 1149 ,1150 ,1146 ] ,[ 1153 ,1148 ,1154 ] ,[ 1154 ,1148 ,1152 ] ,[ 1154 ,1152 ,1157 ] ,[ 1148 ,1151 ,1152 ] ,[ 1148 ,1147 ,1151 ] ,[ 1158 ,1159 ,1160 ] ,[ 1158 ,1160 ,1161 ] ,[ 1166 ,1158 ,1161 ] ,[ 1161 ,1160 ,1162 ] ,[ 1161 ,1162 ,1163 ] ,[ 1166 ,1161 ,1167 ] ,[ 1167 ,1161 ,1163 ] ,[ 1163 ,1162 ,1164 ] ,[ 1163 ,1164 ,1165 ] ,[ 1167 ,1163 ,1168 ] ,[ 1168 ,1163 ,1165 ] ,[ 1168 ,1165 ,1169 ] ,[ 1170 ,1171 ,1172 ] ,[ 1171 ,1173 ,1172 ] ,[ 1174 ,1175 ,1176 ] ,[ 1175 ,1177 ,1176 ] ,[ 1178 ,1179 ,1180 ] ,[ 1181 ,1182 ,1180 ] ,[ 1183 ,1184 ,1185 ] ,[ 1184 ,1186 ,1185 ] ,[ 1187 ,1188 ,1189 ] ,[ 1188 ,1190 ,1189 ] ,[ 1191 ,1192 ,1193 ] ,[ 1192 ,1194 ,1193 ] ,[ 1207 ,1194 ,1192 ] ,[ 1207 ,1192 ,1208 ] ,[ 1193 ,1194 ,1195 ] ,[ 1193 ,1195 ,1196 ] ,[ 1209 ,1195 ,1194 ] ,[ 1209 ,1194 ,1207 ] ,[ 1215 ,1207 ,1208 ] ,[ 1217 ,1209 ,1207 ] ,[ 1217 ,1207 ,1215 ] ,[ 1215 ,1208 ,1216 ] ,[ 1223 ,1215 ,1216 ] ,[ 1225 ,1217 ,1215 ] ,[ 1225 ,1215 ,1223 ] ,[ 1218 ,1209 ,1217 ] ,[ 1226 ,1218 ,1217 ] ,[ 1226 ,1217 ,1225 ] ,[ 1210 ,1195 ,1209 ] ,[ 1218 ,1210 ,1209 ] ,[ 1210 ,1198 ,1195 ] ,[ 1195 ,1198 ,1197 ] ,[ 1196 ,1195 ,1197 ] ,[ 1233 ,1225 ,1223 ] ,[ 1234 ,1226 ,1225 ] ,[ 1234 ,1225 ,1233 ] ,[ 1233 ,1223 ,1231 ] ,[ 1231 ,1223 ,1224 ] ,[ 1231 ,1224 ,1232 ] ,[ 1223 ,1216 ,1224 ] ,[ 1199 ,1200 ,1201 ] ,[ 1199 ,1201 ,1202 ] ,[ 1211 ,1201 ,1200 ] ,[ 1211 ,1200 ,1212 ] ,[ 1202 ,1201 ,1203 ] ,[ 1201 ,1204 ,1203 ] ,[ 1213 ,1204 ,1201 ] ,[ 1213 ,1201 ,1211 ] ,[ 1219 ,1211 ,1212 ] ,[ 1221 ,1213 ,1211 ] ,[ 1221 ,1211 ,1219 ] ,[ 1219 ,1212 ,1220 ] ,[ 1227 ,1219 ,1220 ] ,[ 1229 ,1221 ,1219 ] ,[ 1229 ,1219 ,1227 ] ,[ 1222 ,1213 ,1221 ] ,[ 1230 ,1222 ,1221 ] ,[ 1230 ,1221 ,1229 ] ,[ 1214 ,1204 ,1213 ] ,[ 1222 ,1214 ,1213 ] ,[ 1214 ,1205 ,1204 ] ,[ 1203 ,1204 ,1205 ] ,[ 1203 ,1205 ,1206 ] ,[ 1237 ,1229 ,1227 ] ,[ 1238 ,1230 ,1229 ] ,[ 1238 ,1229 ,1237 ] ,[ 1237 ,1227 ,1235 ] ,[ 1235 ,1227 ,1228 ] ,[ 1235 ,1228 ,1236 ] ,[ 1227 ,1220 ,1228 ] ,[ 1239 ,1240 ,1241 ] ,[ 1239 ,1241 ,1242 ] ,[ 1243 ,1240 ,1239 ] ,[ 1243 ,1244 ,1240 ] ,[ 1245 ,1244 ,1243 ] ,[ 1245 ,1246 ,1244 ] ,[ 1247 ,1248 ,1249 ] ,[ 1247 ,1249 ,1250 ] ,[ 1251 ,1248 ,1247 ] ,[ 1251 ,1252 ,1248 ] ,[ 1253 ,1252 ,1251 ] ,[ 1253 ,1254 ,1252 ] ,[ 1255 ,1256 ,1257 ] ,[ 1261 ,1256 ,1255 ] ,[ 1257 ,1256 ,1258 ] ,[ 1258 ,1256 ,1259 ] ,[ 1259 ,1256 ,1260 ] ,[ 1260 ,1256 ,1261 ] ,[ 1262 ,1263 ,1264 ] ,[ 1263 ,1265 ,1264 ] ,[ 1264 ,1265 ,1266 ] ,[ 1264 ,1266 ,1267 ] ,[ 1267 ,1266 ,1268 ] ,[ 1266 ,1269 ,1268 ] ,[ 1270 ,1271 ,1272 ] ,[ 1270 ,1272 ,1273 ] ,[ 1273 ,1272 ,1274 ] ,[ 1272 ,1275 ,1274 ] ,[ 1274 ,1275 ,1276 ] ,[ 1274 ,1276 ,1277 ] ,[ 1278 ,1279 ,1280 ] ,[ 1278 ,1280 ,1292 ] ,[ 1302 ,1280 ,1279 ] ,[ 1292 ,1280 ,1282 ] ,[ 1303 ,1304 ,1280 ] ,[ 1280 ,1302 ,1303 ] ,[ 1292 ,1282 ,1281 ] ,[ 1281 ,1282 ,1283 ] ,[ 1281 ,1283 ,1293 ] ,[ 1293 ,1283 ,1294 ] ,[ 1293 ,1294 ,1295 ] ,[ 1295 ,1294 ,1296 ] ,[ 1294 ,1305 ,1304 ] ,[ 1304 ,1303 ,1294 ] ,[ 1302 ,1306 ,1303 ] ,[ 1295 ,1296 ,1297 ] ,[ 1284 ,1285 ,1286 ] ,[ 1909 ,1910 ,1284 ] ,[ 1915 ,1909 ,1284 ] ,[ 1285 ,1287 ,1288 ] ,[ 1288 ,1286 ,1285 ] ,[ 1288 ,1291 ,1286 ] ,[ 1290 ,1288 ,1287 ] ,[ 1287 ,1289 ,1290 ] ,[ 1922 ,1909 ,1923 ] ,[ 1914 ,1915 ,1916 ] ,[ 1917 ,1918 ,1915 ] ,[ 1915 ,1914 ,1917 ] ,[ 1914 ,1921 ,1917 ] ,[ 1918 ,1917 ,1919 ] ,[ 1919 ,1920 ,1918 ] ,[ 1919 ,1928 ,1920 ] ,[ 1928 ,1926 ,1920 ] ,[ 1929 ,1928 ,1930 ] ,[ 1931 ,1929 ,1930 ] ,[ 1925 ,1926 ,1927 ] ,[ 1298 ,1299 ,1300 ] ,[ 1298 ,1300 ,1301 ] ,[ 1307 ,1308 ,1309 ] ,[ 1323 ,1308 ,1307 ] ,[ 1325 ,1307 ,1309 ] ,[ 1333 ,1323 ,1307 ] ,[ 1333 ,1307 ,1325 ] ,[ 1308 ,1310 ,1309 ] ,[ 1323 ,1324 ,1308 ] ,[ 1309 ,1310 ,1311 ] ,[ 1309 ,1311 ,1312 ] ,[ 1312 ,1311 ,1313 ] ,[ 1311 ,1314 ,1313 ] ,[ 1326 ,1309 ,1312 ] ,[ 1326 ,1312 ,1327 ] ,[ 1327 ,1312 ,1313 ] ,[ 1313 ,1314 ,1315 ] ,[ 1313 ,1315 ,1316 ] ,[ 1327 ,1313 ,1328 ] ,[ 1328 ,1313 ,1316 ] ,[ 1335 ,1326 ,1327 ] ,[ 1335 ,1327 ,1336 ] ,[ 1336 ,1327 ,1328 ] ,[ 1328 ,1316 ,1329 ] ,[ 1336 ,1328 ,1337 ] ,[ 1337 ,1328 ,1329 ] ,[ 1316 ,1315 ,1317 ] ,[ 1329 ,1316 ,1317 ] ,[ 1315 ,1318 ,1317 ] ,[ 1329 ,1317 ,1330 ] ,[ 1337 ,1329 ,1338 ] ,[ 1338 ,1329 ,1330 ] ,[ 1338 ,1330 ,1339 ] ,[ 1334 ,1326 ,1335 ] ,[ 1334 ,1325 ,1326 ] ,[ 1345 ,1325 ,1334 ] ,[ 1325 ,1309 ,1326 ] ,[ 1345 ,1333 ,1325 ] ,[ 1344 ,1333 ,1345 ] ,[ 1332 ,1323 ,1333 ] ,[ 1344 ,1332 ,1333 ] ,[ 1343 ,1332 ,1344 ] ,[ 1331 ,1322 ,1332 ] ,[ 1332 ,1322 ,1323 ] ,[ 1322 ,1321 ,1323 ] ,[ 1321 ,1324 ,1323 ] ,[ 1319 ,1321 ,1322 ] ,[ 1331 ,1319 ,1322 ] ,[ 1319 ,1320 ,1321 ] ,[ 1340 ,1341 ,1342 ] ,[ 1346 ,1347 ,1348 ] ,[ 1346 ,1349 ,1347 ] ,[ 1350 ,1351 ,1352 ] ,[ 1350 ,1353 ,1351 ] ,[ 1354 ,1355 ,1356 ] ,[ 1354 ,1357 ,1358 ] ,[ 1359 ,1360 ,1361 ] ,[ 1359 ,1362 ,1360 ] ,[ 1363 ,1364 ,1365 ] ,[ 1363 ,1366 ,1364 ] ,[ 1367 ,1368 ,1369 ] ,[ 1369 ,1370 ,1367 ] ,[ 1369 ,1371 ,1370 ] ,[ 1372 ,1373 ,1370 ] ,[ 1370 ,1371 ,1372 ] ,[ 1371 ,1391 ,1372 ] ,[ 1372 ,1388 ,1390 ] ,[ 1391 ,1392 ,1372 ] ,[ 1396 ,1391 ,1393 ] ,[ 1398 ,1391 ,1396 ] ,[ 1395 ,1396 ,1393 ] ,[ 1396 ,1397 ,1398 ] ,[ 1393 ,1394 ,1395 ] ,[ 1388 ,1389 ,1390 ] ,[ 1374 ,1375 ,1376 ] ,[ 1377 ,1374 ,1376 ] ,[ 1378 ,1374 ,1377 ] ,[ 1379 ,1378 ,1377 ] ,[ 1380 ,1381 ,1382 ] ,[ 1383 ,1380 ,1382 ] ,[ 1384 ,1385 ,1386 ] ,[ 1387 ,1384 ,1386 ] ,[ 1399 ,1400 ,1401 ] ,[ 1399 ,1402 ,1400 ] ,[ 1403 ,1402 ,1399 ] ,[ 1404 ,1403 ,1399 ] ,[ 1400 ,1402 ,1415 ] ,[ 1416 ,1400 ,1415 ] ,[ 1402 ,1403 ,1417 ] ,[ 1415 ,1402 ,1417 ] ,[ 1416 ,1415 ,1423 ] ,[ 1415 ,1417 ,1425 ] ,[ 1423 ,1415 ,1425 ] ,[ 1424 ,1416 ,1423 ] ,[ 1424 ,1423 ,1431 ] ,[ 1423 ,1425 ,1433 ] ,[ 1431 ,1423 ,1433 ] ,[ 1425 ,1417 ,1426 ] ,[ 1425 ,1426 ,1434 ] ,[ 1433 ,1425 ,1434 ] ,[ 1417 ,1403 ,1418 ] ,[ 1417 ,1418 ,1426 ] ,[ 1403 ,1406 ,1418 ] ,[ 1405 ,1403 ,1404 ] ,[ 1405 ,1406 ,1403 ] ,[ 1433 ,1434 ,1442 ] ,[ 1441 ,1433 ,1442 ] ,[ 1431 ,1433 ,1441 ] ,[ 1439 ,1431 ,1441 ] ,[ 1432 ,1431 ,1439 ] ,[ 1440 ,1432 ,1439 ] ,[ 1432 ,1424 ,1431 ] ,[ 1407 ,1408 ,1409 ] ,[ 1410 ,1407 ,1409 ] ,[ 1411 ,1407 ,1410 ] ,[ 1411 ,1412 ,1407 ] ,[ 1408 ,1407 ,1419 ] ,[ 1407 ,1412 ,1421 ] ,[ 1419 ,1407 ,1421 ] ,[ 1420 ,1408 ,1419 ] ,[ 1420 ,1419 ,1427 ] ,[ 1419 ,1421 ,1429 ] ,[ 1427 ,1419 ,1429 ] ,[ 1421 ,1412 ,1422 ] ,[ 1421 ,1422 ,1430 ] ,[ 1429 ,1421 ,1430 ] ,[ 1413 ,1412 ,1411 ] ,[ 1412 ,1413 ,1422 ] ,[ 1414 ,1413 ,1411 ] ,[ 1429 ,1430 ,1438 ] ,[ 1427 ,1429 ,1437 ] ,[ 1437 ,1429 ,1438 ] ,[ 1437 ,1438 ,1446 ] ,[ 1435 ,1427 ,1437 ] ,[ 1435 ,1437 ,1445 ] ,[ 1445 ,1437 ,1446 ] ,[ 1428 ,1427 ,1435 ] ,[ 1436 ,1428 ,1435 ] ,[ 1436 ,1435 ,1443 ] ,[ 1443 ,1435 ,1445 ] ,[ 1428 ,1420 ,1427 ] ,[ 1444 ,1436 ,1443 ] ,[ 1447 ,1448 ,1449 ] ,[ 1450 ,1447 ,1449 ] ,[ 1448 ,1451 ,1452 ] ,[ 1449 ,1448 ,1452 ] ,[ 1451 ,1453 ,1454 ] ,[ 1452 ,1451 ,1454 ] ,[ 1455 ,1456 ,1457 ] ,[ 1458 ,1455 ,1457 ] ,[ 1456 ,1459 ,1460 ] ,[ 1457 ,1456 ,1460 ] ,[ 1459 ,1461 ,1462 ] ,[ 1460 ,1459 ,1462 ] ,[ 1463 ,1464 ,1465 ] ,[ 1463 ,1466 ,1464 ] ,[ 1467 ,1468 ,1469 ] ,[ 1470 ,1467 ,1469 ] ,[ 1471 ,1472 ,1473 ] ,[ 1471 ,1474 ,1472 ] ,[ 1475 ,1476 ,1477 ] ,[ 1478 ,1475 ,1477 ] ,[ 1479 ,1480 ,1481 ] ,[ 1479 ,1482 ,1480 ] ,[ 1483 ,1484 ,1485 ] ,[ 1486 ,1483 ,1485 ] ,[ 1487 ,1488 ,1489 ] ,[ 1487 ,1490 ,1488 ] ,[ 1491 ,1490 ,1487 ] ,[ 1492 ,1491 ,1487 ] ,[ 1487 ,1489 ,1505 ] ,[ 1506 ,1487 ,1505 ] ,[ 1492 ,1487 ,1506 ] ,[ 1488 ,1504 ,1503 ] ,[ 1489 ,1488 ,1503 ] ,[ 1489 ,1503 ,1513 ] ,[ 1505 ,1489 ,1513 ] ,[ 1506 ,1505 ,1514 ] ,[ 1505 ,1513 ,1525 ] ,[ 1514 ,1505 ,1525 ] ,[ 1507 ,1492 ,1506 ] ,[ 1515 ,1506 ,1514 ] ,[ 1507 ,1506 ,1515 ] ,[ 1493 ,1492 ,1507 ] ,[ 1508 ,1493 ,1507 ] ,[ 1516 ,1507 ,1515 ] ,[ 1508 ,1507 ,1516 ] ,[ 1496 ,1493 ,1508 ] ,[ 1509 ,1496 ,1508 ] ,[ 1517 ,1508 ,1516 ] ,[ 1509 ,1508 ,1517 ] ,[ 1496 ,1495 ,1493 ] ,[ 1497 ,1495 ,1496 ] ,[ 1497 ,1496 ,1509 ] ,[ 1510 ,1497 ,1509 ] ,[ 1518 ,1509 ,1517 ] ,[ 1510 ,1509 ,1518 ] ,[ 1497 ,1498 ,1495 ] ,[ 1495 ,1494 ,1493 ] ,[ 1493 ,1494 ,1491 ] ,[ 1493 ,1491 ,1492 ] ,[ 1519 ,1510 ,1518 ] ,[ 1525 ,1513 ,1523 ] ,[ 1513 ,1503 ,1512 ] ,[ 1513 ,1512 ,1523 ] ,[ 1523 ,1512 ,1524 ] ,[ 1512 ,1502 ,1511 ] ,[ 1503 ,1502 ,1512 ] ,[ 1503 ,1499 ,1502 ] ,[ 1503 ,1504 ,1499 ] ,[ 1502 ,1499 ,1501 ] ,[ 1502 ,1501 ,1511 ] ,[ 1499 ,1500 ,1501 ] ,[ 1520 ,1521 ,1522 ] ,[ 1526 ,1527 ,1528 ] ,[ 1533 ,1526 ,1528 ] ,[ 1539 ,1526 ,1540 ] ,[ 1532 ,1533 ,1528 ] ,[ 1534 ,1535 ,1533 ] ,[ 1533 ,1532 ,1534 ] ,[ 1532 ,1538 ,1534 ] ,[ 1535 ,1534 ,1536 ] ,[ 1536 ,1537 ,1535 ] ,[ 1536 ,1545 ,1537 ] ,[ 1545 ,1543 ,1537 ] ,[ 1546 ,1545 ,1547 ] ,[ 1548 ,1546 ,1547 ] ,[ 1542 ,1543 ,1544 ] ,[ 1529 ,1530 ,1531 ] ,[ 1531 ,1530 ,1541 ] ,[ 1549 ,1550 ,1551 ] ,[ 1552 ,1549 ,1551 ] ,[ 1553 ,1554 ,1555 ] ,[ 1554 ,1556 ,1557 ] ,[ 1557 ,1555 ,1554 ] ,[ 1557 ,1560 ,1555 ] ,[ 1559 ,1557 ,1556 ] ,[ 1556 ,1558 ,1559 ] ,[ 1561 ,1562 ,1563 ] ,[ 1564 ,1562 ,1561 ] ,[ 1565 ,1562 ,1564 ] ,[ 1566 ,1562 ,1565 ] ,[ 1567 ,1562 ,1566 ] ,[ 1563 ,1562 ,1567 ] ,[ 1568 ,1569 ,1570 ] ,[ 1568 ,1571 ,1569 ] ,[ 1572 ,1571 ,1568 ] ,[ 1573 ,1572 ,1568 ] ,[ 1574 ,1572 ,1573 ] ,[ 1574 ,1575 ,1572 ] ,[ 1576 ,1577 ,1578 ] ,[ 1579 ,1576 ,1578 ] ,[ 1580 ,1581 ,1579 ] ,[ 1580 ,1582 ,1581 ] ,[ 1583 ,1584 ,1580 ] ,[ 1585 ,1583 ,1580 ] ,[ 1586 ,1587 ,1588 ] ,[ 1586 ,1589 ,1587 ] ,[ 1590 ,1591 ,1592 ] ,[ 1590 ,1593 ,1591 ] ,[ 1594 ,1595 ,1596 ] ,[ 1594 ,1597 ,1595 ] ,[ 1598 ,1599 ,1600 ] ,[ 1598 ,1601 ,1599 ] ,[ 1602 ,1603 ,1604 ] ,[ 1602 ,1605 ,1603 ] ,[ 1606 ,1607 ,1608 ] ,[ 1609 ,1606 ,1608 ] ,[ 1609 ,1608 ,1610 ] ,[ 1611 ,1609 ,1610 ] ,[ 1612 ,1613 ,1614 ] ,[ 1615 ,1612 ,1614 ] ,[ 1620 ,1612 ,1615 ] ,[ 1613 ,1616 ,1617 ] ,[ 1614 ,1613 ,1617 ] ,[ 1616 ,1618 ,1619 ] ,[ 1617 ,1616 ,1619 ] ,[ 1618 ,1630 ,1631 ] ,[ 1619 ,1618 ,1631 ] ,[ 1630 ,1632 ,1633 ] ,[ 1631 ,1630 ,1633 ] ,[ 1632 ,1634 ,1635 ] ,[ 1633 ,1632 ,1635 ] ,[ 1621 ,1620 ,1615 ] ,[ 1622 ,1620 ,1621 ] ,[ 1623 ,1622 ,1621 ] ,[ 1624 ,1622 ,1623 ] ,[ 1625 ,1624 ,1623 ] ,[ 1626 ,1624 ,1625 ] ,[ 1627 ,1626 ,1625 ] ,[ 1628 ,1626 ,1627 ] ,[ 1629 ,1628 ,1627 ] ,[ 1636 ,1637 ,1638 ] ,[ 1639 ,1636 ,1638 ] ,[ 1637 ,1640 ,1641 ] ,[ 1638 ,1637 ,1641 ] ,[ 1642 ,1643 ,1644 ] ,[ 1642 ,1645 ,1643 ] ,[ 1648 ,1649 ,1644 ] ,[ 1644 ,1643 ,1648 ] ,[ 1648 ,1643 ,1650 ] ,[ 1649 ,1648 ,1651 ] ,[ 1652 ,1653 ,1649 ] ,[ 1649 ,1651 ,1652 ] ,[ 1652 ,1654 ,1653 ] ,[ 1654 ,1655 ,1653 ] ,[ 1654 ,1656 ,1655 ] ,[ 1655 ,1656 ,1664 ] ,[ 1650 ,1643 ,1647 ] ,[ 1647 ,1657 ,1650 ] ,[ 1645 ,1646 ,1643 ] ,[ 1646 ,1647 ,1643 ] ,[ 1658 ,1657 ,1647 ] ,[ 1647 ,1646 ,1658 ] ,[ 1659 ,1657 ,1658 ] ,[ 1659 ,1658 ,1660 ] ,[ 1661 ,1659 ,1660 ] ,[ 1661 ,1660 ,1662 ] ,[ 1662 ,1663 ,1661 ] ,[ 1665 ,1666 ,1667 ] ,[ 1668 ,1665 ,1667 ] ,[ 1673 ,1665 ,1668 ] ,[ 1666 ,1669 ,1670 ] ,[ 1667 ,1666 ,1670 ] ,[ 1669 ,1671 ,1672 ] ,[ 1670 ,1669 ,1672 ] ,[ 1671 ,1699 ,1700 ] ,[ 1672 ,1671 ,1700 ] ,[ 1699 ,1703 ,1704 ] ,[ 1700 ,1699 ,1704 ] ,[ 1703 ,1707 ,1708 ] ,[ 1704 ,1703 ,1708 ] ,[ 1707 ,1712 ,1713 ] ,[ 1708 ,1707 ,1713 ] ,[ 1674 ,1673 ,1668 ] ,[ 1681 ,1673 ,1674 ] ,[ 1682 ,1681 ,1674 ] ,[ 1685 ,1681 ,1682 ] ,[ 1686 ,1685 ,1682 ] ,[ 1690 ,1685 ,1686 ] ,[ 1691 ,1690 ,1686 ] ,[ 1695 ,1690 ,1691 ] ,[ 1696 ,1695 ,1691 ] ,[ 1693 ,1695 ,1696 ] ,[ 1714 ,1715 ,1696 ] ,[ 1689 ,1693 ,1694 ] ,[ 1687 ,1689 ,1688 ] ,[ 1689 ,1692 ,1688 ] ,[ 1692 ,1689 ,1694 ] ,[ 1684 ,1687 ,1683 ] ,[ 1683 ,1687 ,1688 ] ,[ 1679 ,1684 ,1683 ] ,[ 1679 ,1683 ,1680 ] ,[ 1676 ,1679 ,1680 ] ,[ 1677 ,1676 ,1680 ] ,[ 1675 ,1676 ,1677 ] ,[ 1678 ,1675 ,1677 ] ,[ 1697 ,1675 ,1678 ] ,[ 1698 ,1697 ,1678 ] ,[ 1701 ,1697 ,1698 ] ,[ 1702 ,1701 ,1698 ] ,[ 1705 ,1701 ,1702 ] ,[ 1706 ,1705 ,1702 ] ,[ 1709 ,1705 ,1710 ] ,[ 1711 ,1705 ,1706 ] ,[ 1716 ,1717 ,1718 ] ,[ 1719 ,1716 ,1718 ] ,[ 1724 ,1716 ,1719 ] ,[ 1717 ,1720 ,1721 ] ,[ 1718 ,1717 ,1721 ] ,[ 1720 ,1722 ,1723 ] ,[ 1721 ,1720 ,1723 ] ,[ 1722 ,1740 ,1741 ] ,[ 1723 ,1722 ,1741 ] ,[ 1740 ,1742 ,1743 ] ,[ 1741 ,1740 ,1743 ] ,[ 1742 ,1744 ,1745 ] ,[ 1743 ,1742 ,1745 ] ,[ 1725 ,1724 ,1719 ] ,[ 1726 ,1724 ,1725 ] ,[ 1727 ,1726 ,1725 ] ,[ 1728 ,1726 ,1727 ] ,[ 1729 ,1728 ,1727 ] ,[ 1730 ,1728 ,1729 ] ,[ 1731 ,1730 ,1729 ] ,[ 1735 ,1730 ,1731 ] ,[ 1736 ,1735 ,1731 ] ,[ 1733 ,1737 ,1736 ] ,[ 1738 ,1739 ,1736 ] ,[ 1732 ,1733 ,1734 ] ,[ 1746 ,1747 ,1748 ] ,[ 1749 ,1746 ,1748 ] ,[ 1770 ,1771 ,1772 ] ,[ 1773 ,1770 ,1772 ] ,[ 1774 ,1775 ,1776 ] ,[ 1777 ,1774 ,1776 ] ,[ 1780 ,1774 ,1777 ] ,[ 1775 ,1778 ,1779 ] ,[ 1776 ,1775 ,1779 ] ,[ 1777 ,1776 ,1782 ] ,[ 1776 ,1779 ,1784 ] ,[ 1782 ,1776 ,1785 ] ,[ 1783 ,1777 ,1782 ] ,[ 1781 ,1780 ,1777 ] ,[ 1781 ,1777 ,1783 ] ,[ 1786 ,1781 ,1783 ] ,[ 1787 ,1788 ,1789 ] ,[ 1790 ,1787 ,1789 ] ,[ 1791 ,1787 ,1790 ] ,[ 1790 ,1789 ,1795 ] ,[ 1792 ,1791 ,1790 ] ,[ 1796 ,1790 ,1795 ] ,[ 1792 ,1790 ,1796 ] ,[ 1793 ,1791 ,1792 ] ,[ 1794 ,1793 ,1792 ] ,[ 1797 ,1792 ,1796 ] ,[ 1794 ,1792 ,1797 ] ,[ 1798 ,1794 ,1797 ] ,[ 1799 ,1800 ,1801 ] ,[ 1799 ,1802 ,1800 ] ,[ 1803 ,1804 ,1805 ] ,[ 1803 ,1806 ,1804 ] ,[ 1807 ,1808 ,1809 ] ,[ 1807 ,1810 ,1811 ] ,[ 1812 ,1813 ,1814 ] ,[ 1812 ,1815 ,1813 ] ,[ 1816 ,1817 ,1818 ] ,[ 1816 ,1819 ,1817 ] ,[ 1820 ,1821 ,1822 ] ,[ 1820 ,1823 ,1821 ] ,[ 1824 ,1823 ,1820 ] ,[ 1825 ,1824 ,1820 ] ,[ 1821 ,1823 ,1836 ] ,[ 1837 ,1821 ,1836 ] ,[ 1823 ,1824 ,1838 ] ,[ 1836 ,1823 ,1838 ] ,[ 1837 ,1836 ,1844 ] ,[ 1836 ,1838 ,1846 ] ,[ 1844 ,1836 ,1846 ] ,[ 1845 ,1837 ,1844 ] ,[ 1845 ,1844 ,1852 ] ,[ 1844 ,1846 ,1854 ] ,[ 1852 ,1844 ,1854 ] ,[ 1846 ,1838 ,1847 ] ,[ 1846 ,1847 ,1855 ] ,[ 1854 ,1846 ,1855 ] ,[ 1838 ,1824 ,1839 ] ,[ 1838 ,1839 ,1847 ] ,[ 1824 ,1827 ,1839 ] ,[ 1826 ,1824 ,1825 ] ,[ 1826 ,1827 ,1824 ] ,[ 1854 ,1855 ,1863 ] ,[ 1862 ,1854 ,1863 ] ,[ 1852 ,1854 ,1862 ] ,[ 1860 ,1852 ,1862 ] ,[ 1853 ,1852 ,1860 ] ,[ 1861 ,1853 ,1860 ] ,[ 1853 ,1845 ,1852 ] ,[ 1828 ,1829 ,1830 ] ,[ 1831 ,1828 ,1830 ] ,[ 1832 ,1828 ,1831 ] ,[ 1832 ,1833 ,1828 ] ,[ 1829 ,1828 ,1840 ] ,[ 1828 ,1833 ,1842 ] ,[ 1840 ,1828 ,1842 ] ,[ 1841 ,1829 ,1840 ] ,[ 1841 ,1840 ,1848 ] ,[ 1840 ,1842 ,1850 ] ,[ 1848 ,1840 ,1850 ] ,[ 1842 ,1833 ,1843 ] ,[ 1842 ,1843 ,1851 ] ,[ 1850 ,1842 ,1851 ] ,[ 1834 ,1833 ,1832 ] ,[ 1833 ,1834 ,1843 ] ,[ 1835 ,1834 ,1832 ] ,[ 1850 ,1851 ,1859 ] ,[ 1848 ,1850 ,1858 ] ,[ 1858 ,1850 ,1859 ] ,[ 1858 ,1859 ,1867 ] ,[ 1856 ,1848 ,1858 ] ,[ 1856 ,1858 ,1866 ] ,[ 1866 ,1858 ,1867 ] ,[ 1849 ,1848 ,1856 ] ,[ 1857 ,1849 ,1856 ] ,[ 1857 ,1856 ,1864 ] ,[ 1864 ,1856 ,1866 ] ,[ 1849 ,1841 ,1848 ] ,[ 1865 ,1857 ,1864 ] ,[ 1868 ,1869 ,1870 ] ,[ 1871 ,1868 ,1870 ] ,[ 1869 ,1872 ,1873 ] ,[ 1870 ,1869 ,1873 ] ,[ 1872 ,1874 ,1875 ] ,[ 1873 ,1872 ,1875 ] ,[ 1876 ,1877 ,1878 ] ,[ 1879 ,1876 ,1878 ] ,[ 1877 ,1880 ,1881 ] ,[ 1878 ,1877 ,1881 ] ,[ 1880 ,1882 ,1883 ] ,[ 1881 ,1880 ,1883 ] ,[ 1884 ,1885 ,1886 ] ,[ 1887 ,1885 ,1884 ] ,[ 1888 ,1885 ,1887 ] ,[ 1889 ,1885 ,1888 ] ,[ 1890 ,1885 ,1889 ] ,[ 1886 ,1885 ,1890 ] ,[ 1891 ,1892 ,1893 ] ,[ 1891 ,1894 ,1892 ] ,[ 1895 ,1894 ,1891 ] ,[ 1896 ,1895 ,1891 ] ,[ 1897 ,1895 ,1896 ] ,[ 1897 ,1898 ,1895 ] ,[ 1899 ,1900 ,1901 ] ,[ 1902 ,1899 ,1901 ] ,[ 1903 ,1904 ,1902 ] ,[ 1903 ,1905 ,1904 ] ,[ 1906 ,1907 ,1903 ] ,[ 1908 ,1906 ,1903 ] ,[ 1911 ,1912 ,1913 ] ,[ 1913 ,1912 ,1924 ] ,[ 1932 ,1933 ,1934 ] ,[ 1935 ,1932 ,1934 ] ,[ 1936 ,1937 ,1938 ] ,[ 1937 ,1939 ,1940 ] ,[ 1940 ,1938 ,1937 ] ,[ 1940 ,1943 ,1938 ] ,[ 1942 ,1940 ,1939 ] ,[ 1939 ,1941 ,1942 ] ,[ 1944 ,1945 ,1946 ] ,[ 1944 ,1947 ,1945 ] ,[ 1948 ,1947 ,1944 ] ,[ 1949 ,1948 ,1944 ] ,[ 1944 ,1946 ,1962 ] ,[ 1963 ,1944 ,1962 ] ,[ 1949 ,1944 ,1963 ] ,[ 1945 ,1961 ,1960 ] ,[ 1946 ,1945 ,1960 ] ,[ 1946 ,1960 ,1970 ] ,[ 1962 ,1946 ,1970 ] ,[ 1963 ,1962 ,1971 ] ,[ 1962 ,1970 ,1982 ] ,[ 1971 ,1962 ,1982 ] ,[ 1964 ,1949 ,1963 ] ,[ 1972 ,1963 ,1971 ] ,[ 1964 ,1963 ,1972 ] ,[ 1950 ,1949 ,1964 ] ,[ 1965 ,1950 ,1964 ] ,[ 1973 ,1964 ,1972 ] ,[ 1965 ,1964 ,1973 ] ,[ 1953 ,1950 ,1965 ] ,[ 1966 ,1953 ,1965 ] ,[ 1974 ,1965 ,1973 ] ,[ 1966 ,1965 ,1974 ] ,[ 1953 ,1952 ,1950 ] ,[ 1954 ,1952 ,1953 ] ,[ 1954 ,1953 ,1966 ] ,[ 1967 ,1954 ,1966 ] ,[ 1975 ,1966 ,1974 ] ,[ 1967 ,1966 ,1975 ] ,[ 1954 ,1955 ,1952 ] ,[ 1952 ,1951 ,1950 ] ,[ 1950 ,1951 ,1948 ] ,[ 1950 ,1948 ,1949 ] ,[ 1976 ,1967 ,1975 ] ,[ 1982 ,1970 ,1980 ] ,[ 1970 ,1960 ,1969 ] ,[ 1970 ,1969 ,1980 ] ,[ 1980 ,1969 ,1981 ] ,[ 1969 ,1959 ,1968 ] ,[ 1960 ,1959 ,1969 ] ,[ 1960 ,1956 ,1959 ] ,[ 1960 ,1961 ,1956 ] ,[ 1959 ,1956 ,1958 ] ,[ 1959 ,1958 ,1968 ] ,[ 1956 ,1957 ,1958 ] ,[ 1977 ,1978 ,1979 ] ,[ 1983 ,1984 ,1985 ] ,[ 1984 ,1986 ,1985 ] ,[ 1987 ,1988 ,1989 ] ,[ 1993 ,1987 ,1989 ] ,[ 1988 ,1990 ,1989 ] ,[ 1994 ,1992 ,1988 ] ,[ 1992 ,1990 ,1988 ] ,[ 1989 ,1990 ,1991 ] ,[ 1991 ,1993 ,1989 ] ,[ 1991 ,1992 ,1993 ] ,[ 1992 ,1994 ,1993 ] ,[ 1990 ,1992 ,1991 ] ,[ 1995 ,1996 ,1997 ] ,[ 1996 ,1998 ,1997 ] ,[ 1999 ,2000 ,2001 ] ,[ 2005 ,1999 ,2001 ] ,[ 2000 ,2002 ,2001 ] ,[ 2006 ,2004 ,2000 ] ,[ 2004 ,2002 ,2000 ] ,[ 2001 ,2002 ,2003 ] ,[ 2003 ,2005 ,2001 ] ,[ 2003 ,2004 ,2005 ] ,[ 2004 ,2006 ,2005 ] ,[ 2002 ,2004 ,2003 ] ,[ 2007 ,2008 ,2009 ] ,[ 2007 ,2010 ,2008 ] ,[ 2011 ,2012 ,2013 ] ,[ 2011 ,2014 ,2012 ] ,[ 2015 ,2014 ,2011 ] ,[ 2011 ,2017 ,2015 ] ,[ 2011 ,2013 ,2017 ] ,[ 2012 ,2016 ,2018 ] ,[ 2012 ,2014 ,2016 ] ,[ 2015 ,2016 ,2014 ] ,[ 2017 ,2016 ,2015 ] ,[ 2017 ,2018 ,2016 ] ,[ 2019 ,2020 ,2021 ] ,[ 2019 ,2022 ,2020 ] ,[ 2023 ,2024 ,2025 ] ,[ 2023 ,2026 ,2024 ] ,[ 2027 ,2026 ,2023 ] ,[ 2023 ,2029 ,2027 ] ,[ 2023 ,2025 ,2029 ] ,[ 2024 ,2028 ,2030 ] ,[ 2024 ,2026 ,2028 ] ,[ 2027 ,2028 ,2026 ] ,[ 2029 ,2028 ,2027 ] ,[ 2029 ,2030 ,2028 ] ,[ 2031 ,2032 ,2033 ] ,[ 2031 ,2034 ,2032 ] ,[ 2035 ,2036 ,2037 ] ,[ 2035 ,2038 ,2036 ] ,[ 2039 ,2038 ,2035 ] ,[ 2035 ,2041 ,2039 ] ,[ 2035 ,2037 ,2041 ] ,[ 2036 ,2040 ,2042 ] ,[ 2036 ,2038 ,2040 ] ,[ 2039 ,2040 ,2038 ] ,[ 2041 ,2040 ,2039 ] ,[ 2041 ,2042 ,2040 ] ,[ 2043 ,2044 ,2045 ] ,[ 2044 ,2046 ,2045 ] ,[ 2047 ,2048 ,2049 ] ,[ 2053 ,2047 ,2049 ] ,[ 2048 ,2050 ,2049 ] ,[ 2054 ,2052 ,2048 ] ,[ 2052 ,2050 ,2048 ] ,[ 2049 ,2050 ,2051 ] ,[ 2051 ,2053 ,2049 ] ,[ 2051 ,2052 ,2053 ] ,[ 2052 ,2054 ,2053 ] ,[ 2050 ,2052 ,2051 ] ,[ 2055 ,2056 ,2057 ] ,[ 2132 ,2055 ,2057 ] ,[ 2055 ,2061 ,2064 ] ,[ 2055 ,2064 ,2056 ] ,[ 2132 ,2061 ,2055 ] ,[ 2056 ,2067 ,2057 ] ,[ 2056 ,2064 ,2069 ] ,[ 2056 ,2069 ,2067 ] ,[ 2061 ,2063 ,2064 ] ,[ 2064 ,2063 ,2069 ] ,[ 2063 ,2070 ,2069 ] ,[ 2069 ,2070 ,2074 ] ,[ 2069 ,2074 ,2075 ] ,[ 2067 ,2069 ,2075 ] ,[ 2067 ,2072 ,2057 ] ,[ 2067 ,2075 ,2072 ] ,[ 2075 ,2074 ,2079 ] ,[ 2072 ,2075 ,2079 ] ,[ 2074 ,2080 ,2079 ] ,[ 2079 ,2080 ,2084 ] ,[ 2079 ,2084 ,2085 ] ,[ 2072 ,2079 ,2077 ] ,[ 2077 ,2079 ,2085 ] ,[ 2072 ,2077 ,2057 ] ,[ 2077 ,2082 ,2057 ] ,[ 2077 ,2085 ,2082 ] ,[ 2085 ,2084 ,2089 ] ,[ 2082 ,2085 ,2089 ] ,[ 2084 ,2090 ,2089 ] ,[ 2089 ,2090 ,2094 ] ,[ 2089 ,2094 ,2095 ] ,[ 2082 ,2089 ,2087 ] ,[ 2087 ,2089 ,2095 ] ,[ 2082 ,2087 ,2057 ] ,[ 2087 ,2092 ,2057 ] ,[ 2087 ,2095 ,2092 ] ,[ 2095 ,2094 ,2099 ] ,[ 2092 ,2095 ,2099 ] ,[ 2094 ,2100 ,2099 ] ,[ 2099 ,2100 ,2104 ] ,[ 2099 ,2104 ,2105 ] ,[ 2092 ,2099 ,2097 ] ,[ 2097 ,2099 ,2105 ] ,[ 2092 ,2097 ,2057 ] ,[ 2097 ,2102 ,2057 ] ,[ 2097 ,2105 ,2102 ] ,[ 2105 ,2104 ,2109 ] ,[ 2102 ,2105 ,2109 ] ,[ 2104 ,2110 ,2109 ] ,[ 2109 ,2110 ,2114 ] ,[ 2109 ,2114 ,2115 ] ,[ 2102 ,2109 ,2107 ] ,[ 2107 ,2109 ,2115 ] ,[ 2102 ,2107 ,2057 ] ,[ 2107 ,2112 ,2057 ] ,[ 2107 ,2115 ,2112 ] ,[ 2115 ,2114 ,2119 ] ,[ 2112 ,2115 ,2119 ] ,[ 2114 ,2120 ,2119 ] ,[ 2119 ,2120 ,2124 ] ,[ 2119 ,2124 ,2125 ] ,[ 2112 ,2119 ,2117 ] ,[ 2117 ,2119 ,2125 ] ,[ 2112 ,2117 ,2057 ] ,[ 2117 ,2122 ,2057 ] ,[ 2117 ,2125 ,2122 ] ,[ 2125 ,2124 ,2129 ] ,[ 2122 ,2125 ,2129 ] ,[ 2124 ,2130 ,2129 ] ,[ 2129 ,2130 ,2134 ] ,[ 2129 ,2134 ,2135 ] ,[ 2122 ,2129 ,2127 ] ,[ 2127 ,2129 ,2135 ] ,[ 2122 ,2127 ,2057 ] ,[ 2127 ,2132 ,2057 ] ,[ 2127 ,2135 ,2132 ] ,[ 2135 ,2134 ,2061 ] ,[ 2132 ,2135 ,2061 ] ,[ 2134 ,2062 ,2061 ] ,[ 2061 ,2062 ,2063 ] ,[ 2058 ,2059 ,2060 ] ,[ 2065 ,2058 ,2066 ] ,[ 2058 ,2060 ,2066 ] ,[ 2133 ,2059 ,2058 ] ,[ 2136 ,2133 ,2058 ] ,[ 2136 ,2058 ,2065 ] ,[ 2060 ,2059 ,2068 ] ,[ 2066 ,2060 ,2068 ] ,[ 2066 ,2068 ,2071 ] ,[ 2068 ,2059 ,2073 ] ,[ 2071 ,2068 ,2076 ] ,[ 2068 ,2073 ,2076 ] ,[ 2073 ,2059 ,2078 ] ,[ 2076 ,2073 ,2078 ] ,[ 2076 ,2078 ,2081 ] ,[ 2078 ,2059 ,2083 ] ,[ 2081 ,2078 ,2086 ] ,[ 2078 ,2083 ,2086 ] ,[ 2083 ,2059 ,2088 ] ,[ 2086 ,2083 ,2088 ] ,[ 2086 ,2088 ,2091 ] ,[ 2088 ,2059 ,2093 ] ,[ 2091 ,2088 ,2096 ] ,[ 2088 ,2093 ,2096 ] ,[ 2093 ,2059 ,2098 ] ,[ 2096 ,2093 ,2098 ] ,[ 2096 ,2098 ,2101 ] ,[ 2098 ,2059 ,2103 ] ,[ 2101 ,2098 ,2106 ] ,[ 2098 ,2103 ,2106 ] ,[ 2103 ,2059 ,2108 ] ,[ 2106 ,2103 ,2108 ] ,[ 2106 ,2108 ,2111 ] ,[ 2108 ,2059 ,2113 ] ,[ 2111 ,2108 ,2116 ] ,[ 2108 ,2113 ,2116 ] ,[ 2113 ,2059 ,2118 ] ,[ 2116 ,2113 ,2118 ] ,[ 2116 ,2118 ,2121 ] ,[ 2118 ,2059 ,2123 ] ,[ 2121 ,2118 ,2126 ] ,[ 2118 ,2123 ,2126 ] ,[ 2123 ,2059 ,2128 ] ,[ 2128 ,2059 ,2133 ] ,[ 2126 ,2123 ,2128 ] ,[ 2126 ,2128 ,2131 ] ,[ 2131 ,2128 ,2136 ] ,[ 2128 ,2133 ,2136 ] ,[ 2137 ,2138 ,2139 ] ,[ 2138 ,2140 ,2139 ] ,[ 2141 ,2142 ,2143 ] ,[ 2141 ,2143 ,2144 ] ,[ 2145 ,2146 ,2147 ] ,[ 2145 ,2147 ,2148 ] ,[ 2149 ,2150 ,2151 ] ,[ 2150 ,2152 ,2151 ] ,[ 2153 ,2154 ,2155 ] ,[ 2154 ,2156 ,2155 ] ,[ 2157 ,2158 ,2159 ] ,[ 2157 ,2159 ,2160 ] ,[ 2161 ,2162 ,2163 ] ,[ 2161 ,2163 ,2164 ] ,[ 2165 ,2166 ,2167 ] ,[ 2166 ,2168 ,2167 ] ,[ 2169 ,2170 ,2171 ] ,[ 2170 ,2172 ,2171 ] ,[ 2173 ,2174 ,2175 ] ,[ 2173 ,2175 ,2176 ] ,[ 2177 ,2178 ,2179 ] ,[ 2177 ,2179 ,2180 ] ,[ 2181 ,2182 ,2183 ] ,[ 2182 ,2184 ,2183 ] ,[ 2185 ,2186 ,2187 ] ,[ 2186 ,2188 ,2187 ] ,[ 2189 ,2190 ,2191 ] ,[ 2189 ,2191 ,2192 ] ,[ 2193 ,2194 ,2195 ] ,[ 2193 ,2195 ,2196 ] ,[ 2197 ,2198 ,2199 ] ,[ 2198 ,2200 ,2199 ] ,[ 2201 ,2202 ,2203 ] ,[ 2202 ,2204 ,2203 ] ,[ 2205 ,2206 ,2207 ] ,[ 2205 ,2207 ,2208 ] ,[ 2209 ,2210 ,2211 ] ,[ 2209 ,2211 ,2212 ] ,[ 2213 ,2214 ,2215 ] ,[ 2214 ,2216 ,2215 ] ,[ 2217 ,2218 ,2219 ] ,[ 2218 ,2220 ,2219 ] ,[ 2221 ,2222 ,2223 ] ,[ 2221 ,2223 ,2224 ] ,[ 2225 ,2226 ,2227 ] ,[ 2225 ,2227 ,2228 ] ,[ 2229 ,2230 ,2231 ] ,[ 2230 ,2232 ,2231 ] ,[ 2233 ,2234 ,2235 ] ,[ 2234 ,2236 ,2235 ] ,[ 2237 ,2238 ,2239 ] ,[ 2237 ,2239 ,2240 ] ,[ 2241 ,2242 ,2243 ] ,[ 2241 ,2243 ,2244 ] ,[ 2245 ,2246 ,2247 ] ,[ 2246 ,2248 ,2247 ] ,[ 2249 ,2250 ,2251 ] ,[ 2250 ,2252 ,2251 ] ,[ 2253 ,2254 ,2255 ] ,[ 2253 ,2255 ,2256 ] ,[ 2257 ,2258 ,2259 ] ,[ 2257 ,2259 ,2260 ] ,[ 2261 ,2262 ,2263 ] ,[ 2262 ,2264 ,2263 ] ] } ] ,"materials": [ { "properties": [ { "key": "$tex.file" ,"semantic": 1 ,"index": 0 ,"type": 3 ,"value": ".\\jeep1.jpg" } ,{ "key": "?mat.name" ,"semantic": 0 ,"index": 0 ,"type": 3 ,"value": "Material01" } ,{ "key": "$clr.ambient" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.2 ,0.2 ,0.2 ,1 ] } ,{ "key": "$clr.diffuse" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0.8 ,0.8 ,0.8 ,1 ] } ,{ "key": "$clr.specular" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": [ 0 ,0 ,0 ,1 ] } ,{ "key": "$mat.shininess" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": 25 } ,{ "key": "$mat.opacity" ,"semantic": 0 ,"index": 0 ,"type": 1 ,"value": 1 } ,{ "key": "$mat.shadingm" ,"semantic": 0 ,"index": 0 ,"type": 4 ,"value": 3 } ] } ] } ================================================ FILE: examples/resources/models/assimp/jeep/jeep1.readme.txt ================================================ Jeep designed, modelled and skinned by me, Psionic FREE for use however you like, credits are appreciated!!! It was modelled in Milkshape 3D and includes the MS3D files oriented for X or B3D format (BlitzBasic 3D), its 2032 polys with a 512x512 jpg texture map. There are two skin variations plus a UV template to help out if you want to create your own skin variations. I'd love to see a few screenshots of it being used in-game so feel free to stop by my site and maybe drop by my forums and show us all what your doing with it!!!!!!! Check out more of my work at:- http://xu1productions.com/3dstudio/index.html - 3D Game Resources http://www.psionicdesign.com - My Main 2D/3D Digital Art site Psionic 2002 ================================================ FILE: examples/resources/models/gltf/BotSkinned/glTF-MaterialsUnlit/Bot_Skinned.gltf ================================================ { "asset": { "generator": "FBX2glTF", "version": "2.0" }, "scene": 0, "extensionsUsed": [ "KHR_materials_unlit" ], "buffers": [ { "byteLength": 272844, "uri": "buffer.bin" } ], "bufferViews": [ { "buffer": 0, "byteLength": 644, "byteOffset": 0 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 644 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 3220 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 5796 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 8372 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 10948 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 13524 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 16100 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 18676 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 21252 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 23828 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 26404 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 28980 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 31556 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 34132 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 36708 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 39284 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 41860 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 44436 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 47012 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 49588 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 52164 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 54740 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 57316 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 59892 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 62468 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 65044 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 67620 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 70196 }, { "buffer": 0, "byteLength": 1932, "byteOffset": 72772 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 74704 }, { "buffer": 0, "byteLength": 1932, "byteOffset": 77280 }, { "buffer": 0, "byteLength": 2576, "byteOffset": 79212 }, { "buffer": 0, "byteLength": 12330, "byteOffset": 81788, "target": 34963 }, { "buffer": 0, "byteLength": 33108, "byteOffset": 94120, "target": 34962 }, { "buffer": 0, "byteLength": 33108, "byteOffset": 127228, "target": 34962 }, { "buffer": 0, "byteLength": 22072, "byteOffset": 160336, "target": 34962 }, { "buffer": 0, "byteLength": 22072, "byteOffset": 182408, "target": 34962 }, { "buffer": 0, "byteLength": 44144, "byteOffset": 204480, "target": 34962 }, { "buffer": 0, "byteLength": 2268, "byteOffset": 248624, "target": 34963 }, { "buffer": 0, "byteLength": 4032, "byteOffset": 250892, "target": 34962 }, { "buffer": 0, "byteLength": 4032, "byteOffset": 254924, "target": 34962 }, { "buffer": 0, "byteLength": 2688, "byteOffset": 258956, "target": 34962 }, { "buffer": 0, "byteLength": 2688, "byteOffset": 261644, "target": 34962 }, { "buffer": 0, "byteLength": 5376, "byteOffset": 264332, "target": 34962 }, { "buffer": 0, "byteLength": 3136, "byteOffset": 269708 } ], "scenes": [ { "name": "Root Scene", "nodes": [ 0 ] } ], "accessors": [ { "componentType": 5126, "type": "SCALAR", "count": 161, "bufferView": 0, "byteOffset": 0, "min": [ 0.0 ], "max": [ 6.66666650772095 ] }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 1, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 2, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 3, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 4, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 5, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 6, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 7, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 8, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 9, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 10, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 11, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 12, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 13, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 14, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 15, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 16, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 17, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 18, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 19, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 20, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 21, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 22, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 23, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 24, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 25, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 26, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 27, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 28, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC3", "count": 161, "bufferView": 29, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 30, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC3", "count": 161, "bufferView": 31, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 161, "bufferView": 32, "byteOffset": 0 }, { "componentType": 5123, "type": "SCALAR", "count": 6165, "bufferView": 33, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC3", "count": 2759, "bufferView": 34, "byteOffset": 0, "min": [ -81.9805221557617, 86.7850799560547, -18.6015281677246 ], "max": [ 81.9540557861328, 143.793167114258, 17.2828502655029 ] }, { "componentType": 5126, "type": "VEC3", "count": 2759, "bufferView": 35, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC2", "count": 2759, "bufferView": 36, "byteOffset": 0 }, { "componentType": 5123, "type": "VEC4", "count": 2759, "bufferView": 37, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 2759, "bufferView": 38, "byteOffset": 0 }, { "componentType": 5123, "type": "SCALAR", "count": 1134, "bufferView": 39, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC3", "count": 336, "bufferView": 40, "byteOffset": 0, "min": [ -12.0123357772827, 151.862823486328, -8.23231601715088 ], "max": [ 12.0123262405396, 174.369445800781, 16.5866527557373 ] }, { "componentType": 5126, "type": "VEC3", "count": 336, "bufferView": 41, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC2", "count": 336, "bufferView": 42, "byteOffset": 0 }, { "componentType": 5123, "type": "VEC4", "count": 336, "bufferView": 43, "byteOffset": 0 }, { "componentType": 5126, "type": "VEC4", "count": 336, "bufferView": 44, "byteOffset": 0 }, { "componentType": 5126, "type": "MAT4", "count": 49, "bufferView": 45, "byteOffset": 0 } ], "images": [ { "name": "AvatarBotA_Tex_Combined.png", "uri": "AvatarBotA_Tex_Combined.png" }, { "name": "AvatarBotA_Head_Tex_Combined.png", "uri": "AvatarBotA_Head_Tex_Combined.png" } ], "samplers": [ {} ], "textures": [ { "name": "file5", "sampler": 0, "source": 0 }, { "name": "file6", "sampler": 0, "source": 1 } ], "materials": [ { "name": "Bot_BodyHands_mat", "alphaMode": "OPAQUE", "pbrMetallicRoughness": { "baseColorTexture": { "index": 0, "texCoord": 0 }, "baseColorFactor": [ 0.800000011920929, 0.800000011920929, 0.800000011920929, 1.0 ], "metallicFactor": 0.0, "roughnessFactor": 1.0 }, "extensions": { "KHR_materials_unlit": {} } }, { "name": "Bot_Head_mat", "alphaMode": "OPAQUE", "pbrMetallicRoughness": { "baseColorTexture": { "index": 1, "texCoord": 0 }, "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 0.0, "roughnessFactor": 1.0 }, "extensions": { "KHR_materials_unlit": {} } } ], "meshes": [ { "name": "Bot_Skinned", "primitives": [ { "material": 0, "mode": 4, "attributes": { "JOINTS_0": 37, "NORMAL": 35, "POSITION": 34, "TEXCOORD_0": 36, "WEIGHTS_0": 38 }, "indices": 33 }, { "material": 1, "mode": 4, "attributes": { "JOINTS_0": 43, "NORMAL": 41, "POSITION": 40, "TEXCOORD_0": 42, "WEIGHTS_0": 44 }, "indices": 39 } ] } ], "skins": [ { "joints": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 ], "inverseBindMatrices": 45, "skeleton": 1 } ], "animations": [ { "name": "Take 001", "channels": [ { "sampler": 0, "target": { "node": 5, "path": "rotation" } }, { "sampler": 1, "target": { "node": 6, "path": "rotation" } }, { "sampler": 2, "target": { "node": 8, "path": "rotation" } }, { "sampler": 3, "target": { "node": 9, "path": "rotation" } }, { "sampler": 4, "target": { "node": 10, "path": "rotation" } }, { "sampler": 5, "target": { "node": 12, "path": "rotation" } }, { "sampler": 6, "target": { "node": 13, "path": "rotation" } }, { "sampler": 7, "target": { "node": 14, "path": "rotation" } }, { "sampler": 8, "target": { "node": 16, "path": "rotation" } }, { "sampler": 9, "target": { "node": 17, "path": "rotation" } }, { "sampler": 10, "target": { "node": 18, "path": "rotation" } }, { "sampler": 11, "target": { "node": 20, "path": "rotation" } }, { "sampler": 12, "target": { "node": 21, "path": "rotation" } }, { "sampler": 13, "target": { "node": 22, "path": "rotation" } }, { "sampler": 14, "target": { "node": 26, "path": "rotation" } }, { "sampler": 15, "target": { "node": 27, "path": "rotation" } }, { "sampler": 16, "target": { "node": 29, "path": "rotation" } }, { "sampler": 17, "target": { "node": 30, "path": "rotation" } }, { "sampler": 18, "target": { "node": 31, "path": "rotation" } }, { "sampler": 19, "target": { "node": 33, "path": "rotation" } }, { "sampler": 20, "target": { "node": 34, "path": "rotation" } }, { "sampler": 21, "target": { "node": 35, "path": "rotation" } }, { "sampler": 22, "target": { "node": 37, "path": "rotation" } }, { "sampler": 23, "target": { "node": 38, "path": "rotation" } }, { "sampler": 24, "target": { "node": 39, "path": "rotation" } }, { "sampler": 25, "target": { "node": 41, "path": "rotation" } }, { "sampler": 26, "target": { "node": 42, "path": "rotation" } }, { "sampler": 27, "target": { "node": 43, "path": "rotation" } }, { "sampler": 28, "target": { "node": 48, "path": "translation" } }, { "sampler": 29, "target": { "node": 48, "path": "rotation" } }, { "sampler": 30, "target": { "node": 49, "path": "translation" } }, { "sampler": 31, "target": { "node": 49, "path": "rotation" } } ], "samplers": [ { "input": 0, "interpolation": "LINEAR", "output": 1 }, { "input": 0, "interpolation": "LINEAR", "output": 2 }, { "input": 0, "interpolation": "LINEAR", "output": 3 }, { "input": 0, "interpolation": "LINEAR", "output": 4 }, { "input": 0, "interpolation": "LINEAR", "output": 5 }, { "input": 0, "interpolation": "LINEAR", "output": 6 }, { "input": 0, "interpolation": "LINEAR", "output": 7 }, { "input": 0, "interpolation": "LINEAR", "output": 8 }, { "input": 0, "interpolation": "LINEAR", "output": 9 }, { "input": 0, "interpolation": "LINEAR", "output": 10 }, { "input": 0, "interpolation": "LINEAR", "output": 11 }, { "input": 0, "interpolation": "LINEAR", "output": 12 }, { "input": 0, "interpolation": "LINEAR", "output": 13 }, { "input": 0, "interpolation": "LINEAR", "output": 14 }, { "input": 0, "interpolation": "LINEAR", "output": 15 }, { "input": 0, "interpolation": "LINEAR", "output": 16 }, { "input": 0, "interpolation": "LINEAR", "output": 17 }, { "input": 0, "interpolation": "LINEAR", "output": 18 }, { "input": 0, "interpolation": "LINEAR", "output": 19 }, { "input": 0, "interpolation": "LINEAR", "output": 20 }, { "input": 0, "interpolation": "LINEAR", "output": 21 }, { "input": 0, "interpolation": "LINEAR", "output": 22 }, { "input": 0, "interpolation": "LINEAR", "output": 23 }, { "input": 0, "interpolation": "LINEAR", "output": 24 }, { "input": 0, "interpolation": "LINEAR", "output": 25 }, { "input": 0, "interpolation": "LINEAR", "output": 26 }, { "input": 0, "interpolation": "LINEAR", "output": 27 }, { "input": 0, "interpolation": "LINEAR", "output": 28 }, { "input": 0, "interpolation": "LINEAR", "output": 29 }, { "input": 0, "interpolation": "LINEAR", "output": 30 }, { "input": 0, "interpolation": "LINEAR", "output": 31 }, { "input": 0, "interpolation": "LINEAR", "output": 32 } ] } ], "nodes": [ { "name": "RootNode", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 1, 50 ] }, { "name": "Hips", "translation": [ 0.0, 1.0, 0.0 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 0.00999999977648258, 0.00999999977648258, 0.00999999977648258 ], "children": [ 2 ] }, { "name": "Chest", "translation": [ 0.0, 33.0, 0.0 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 3, 24, 45 ] }, { "name": "RightHand", "translation": [ -65.8264923095703, 0.0, 2.53653403836651e-10 ], "rotation": [ -0.52379697561264, -0.475012362003326, -0.475012362003326, 0.52379697561264 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 4, 8, 12, 16, 20 ] }, { "name": "RightHandThumb1", "translation": [ 2.75763964653015, -2.15007448196411, 0.0 ], "rotation": [ -0.0845961794257164, 0.24460332095623, 0.315717250108719, 0.912872016429901 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 5 ] }, { "name": "RightHandThumb2", "translation": [ -0.193791568279266, -3.45449066162109, -0.111885614693165 ], "rotation": [ 0.259822696447372, 0.0406266376376152, -0.0417451933026314, 0.963897824287415 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 6 ] }, { "name": "RightHandThumb3", "translation": [ 0.0183828547596931, -2.60901737213135, 0.604700565338135 ], "rotation": [ 0.130526185035706, -3.11409512388451e-17, -2.38952924416889e-17, 0.991444885730743 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 7 ] }, { "name": "RightHandThumb4", "translation": [ -0.00614145956933498, -1.84276032447815, 0.275437027215958 ], "rotation": [ -0.0143108321353793, -0.00529135810211301, -0.346111297607422, 0.938069403171539 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "RightHandIndex1", "translation": [ 2.1877007484436, -8.50447845458984, -0.00400000018998981 ], "rotation": [ 0.129879087209702, 0.00267119123600423, 0.0197229869663715, 0.991330087184906 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 9 ] }, { "name": "RightHandIndex2", "translation": [ 1.10285200207727e-05, -3.35957384109497, -0.000199394213268533 ], "rotation": [ 0.131140783429146, 0.000969027169048786, 0.00806150026619434, 0.991330504417419 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 10 ] }, { "name": "RightHandIndex3", "translation": [ -2.62199250755657e-07, -2.57685971260071, 1.63709046319127e-11 ], "rotation": [ 0.130491554737091, -0.00300704198889434, -0.02284075319767, 0.99118173122406 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 11 ] }, { "name": "RightHandIndex4", "translation": [ -6.4880941863521e-07, -2.16984295845032, 1.45519152283669e-11 ], "rotation": [ 7.44831396559675e-09, -1.83785861529451e-10, -0.0246648676693439, 0.999695777893066 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "RightHandMiddle1", "translation": [ -1.02776675703353e-06, -8.89051723480225, 0.0 ], "rotation": [ 0.13047268986702, -0.00373660982586443, -0.0283823702484369, 0.991038501262665 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 13 ] }, { "name": "RightHandMiddle2", "translation": [ 1.85175611022714e-06, -3.40467071533203, 0.0 ], "rotation": [ 0.130523636937141, -0.000818223459646106, -0.00621502334252, 0.991425395011902 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 14 ] }, { "name": "RightHandMiddle3", "translation": [ 1.05654953586054e-06, -2.67793536186218, -1.81898940354586e-12 ], "rotation": [ 0.130522698163986, 0.000956544012296945, 0.00726567255333066, 0.991418242454529 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 15 ] }, { "name": "RightHandMiddle4", "translation": [ -3.79802463612577e-06, -2.63057136535645, 6.78955984767526e-08 ], "rotation": [ 1.82495529799098e-08, 3.47519013566e-10, 0.0078874584287405, 0.999968886375427 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "RightHandRing1", "translation": [ -1.72323477268219, -8.434814453125, 0.0 ], "rotation": [ 0.130034267902374, -0.0113214813172817, -0.085995189845562, 0.987708330154419 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 17 ] }, { "name": "RightHandRing2", "translation": [ 4.97117707709549e-06, -2.92135119438171, 0.0 ], "rotation": [ 0.130523890256882, 0.000776301021687686, 0.00589659111574292, 0.991427302360535 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 18 ] }, { "name": "RightHandRing3", "translation": [ -4.25719008489978e-06, -2.7104823589325, -1.81898940354586e-12 ], "rotation": [ 0.130523800849915, -0.000789301353506744, -0.0059953392483294, 0.991426706314087 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 19 ] }, { "name": "RightHandRing4", "translation": [ -1.67088660418813e-06, -2.41632723808289, 0.0 ], "rotation": [ -2.85607333715533e-17, 4.32810741164245e-17, 0.067211352288723, 0.997738778591156 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "RightHandPinky1", "translation": [ -3.45131826400757, -7.36873292922974, 0.0 ], "rotation": [ 0.128799960017204, -0.0211579278111458, -0.160710424184799, 0.978332817554474 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 21 ] }, { "name": "RightHandPinky2", "translation": [ 7.14437692295178e-06, -3.33492231369019, -1.81898940354586e-12 ], "rotation": [ 0.130520552396774, 0.00121425895486027, 0.00922321155667305, 0.991401970386505 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 22 ] }, { "name": "RightHandPinky3", "translation": [ -6.04431488682167e-06, -1.95470726490021, 5.04514900967479e-08 ], "rotation": [ 0.13052274286747, -0.0009512152755633, -0.00722519494593143, 0.991418540477753 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 23 ] }, { "name": "RightHandPinky4", "translation": [ 7.62369018048048e-06, -1.84980952739716, 1.02871126728132e-07 ], "rotation": [ 2.44651445768795e-08, 1.11148032999608e-08, 0.140648439526558, 0.990059614181519 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "LeftHand", "translation": [ 65.8000030517578, 0.0, 0.0 ], "rotation": [ 0.52379697561264, 0.475012362003326, -0.475012362003326, 0.52379697561264 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 25, 29, 33, 37, 41 ] }, { "name": "LeftHandThumb1", "translation": [ -2.7576425075531, 2.15009140968323, -1.09139364212751e-11 ], "rotation": [ -0.0845961794257164, 0.24460332095623, 0.315717250108719, 0.912872016429901 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 26 ] }, { "name": "LeftHandThumb2", "translation": [ 0.193819507956505, 3.45451331138611, 0.111901737749577 ], "rotation": [ 0.258741647005081, 0.0406734235584736, -0.0416996106505394, 0.964188575744629 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 27 ] }, { "name": "LeftHandThumb3", "translation": [ -0.018382428213954, 2.60901665687561, -0.604700148105621 ], "rotation": [ 0.130526185035706, 8.98000309354021e-17, 4.41677554847997e-17, 0.991444885730743 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 28 ] }, { "name": "LeftHandThumb4", "translation": [ 0.00620248122140765, 1.84271383285522, -0.275547921657562 ], "rotation": [ -0.0143108321353793, -0.00529135810211301, -0.346111297607422, 0.938069403171539 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "LeftHandIndex1", "translation": [ -2.18770694732666, 8.50446128845215, 0.00419948389753699 ], "rotation": [ 0.129879087209702, 0.00267119123600423, 0.0197229869663715, 0.991330087184906 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 30 ] }, { "name": "LeftHandIndex2", "translation": [ -1.13686837721616e-13, 3.35964441299438, 1.81898940354586e-12 ], "rotation": [ 0.131140783429146, 0.000969027169048786, 0.00806150026619434, 0.991330504417419 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 31 ] }, { "name": "LeftHandIndex3", "translation": [ 0.0, 2.57680535316467, 0.0 ], "rotation": [ 0.130491554737091, -0.00300704198889434, -0.02284075319767, 0.99118173122406 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 32 ] }, { "name": "LeftHandIndex4", "translation": [ -1.13686837721616e-13, 2.16987800598145, 0.0 ], "rotation": [ 4.28986164068626e-18, 6.83516462791247e-18, -0.0246648676693439, 0.999695777893066 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "LeftHandMiddle1", "translation": [ 0.0, 8.89050388336182, 4.54747350886464e-11 ], "rotation": [ 0.13047268986702, -0.00373660982586443, -0.0283823702484369, 0.991038501262665 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 34 ] }, { "name": "LeftHandMiddle2", "translation": [ -5.6843418860808e-14, 3.40468168258667, 2.36468622460961e-11 ], "rotation": [ 0.13052362203598, -0.000818223343230784, -0.00621502334252, 0.991425395011902 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 35 ] }, { "name": "LeftHandMiddle3", "translation": [ -2.8421709430404e-14, 2.67797994613647, 3.63797880709171e-12 ], "rotation": [ 0.130522683262825, 0.000956543954089284, 0.00726567255333066, 0.991418242454529 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 36 ] }, { "name": "LeftHandMiddle4", "translation": [ 0.0, 2.63050961494446, -1.81898940354586e-12 ], "rotation": [ -6.30038723337714e-17, 1.23782160635548e-18, 0.0078874584287405, 0.999968886375427 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "LeftHandRing1", "translation": [ 1.72323560714722, 8.4348258972168, 6.00266503170133e-11 ], "rotation": [ 0.130034267902374, -0.0113214813172817, -0.085995189845562, 0.987708330154419 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 38 ] }, { "name": "LeftHandRing2", "translation": [ 0.0, 2.92133402824402, 2.36468622460961e-11 ], "rotation": [ 0.130523890256882, 0.000776300963480026, 0.00589659111574292, 0.991427302360535 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 39 ] }, { "name": "LeftHandRing3", "translation": [ 0.0, 2.71053099632263, 0.0 ], "rotation": [ 0.130523800849915, -0.000789301353506744, -0.0059953392483294, 0.991426706314087 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 40 ] }, { "name": "LeftHandRing4", "translation": [ 0.0, 2.4163134098053, 1.81898940354586e-12 ], "rotation": [ 5.34889858011413e-17, -6.82871510067639e-18, 0.067211352288723, 0.997738778591156 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "LeftHandPinky1", "translation": [ 3.45132112503052, 7.36876058578491, 6.54836185276508e-11 ], "rotation": [ 0.128799960017204, -0.0211579278111458, -0.160710424184799, 0.978332817554474 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 42 ] }, { "name": "LeftHandPinky2", "translation": [ 0.0, 3.33487010002136, 3.09228198602796e-11 ], "rotation": [ 0.130520537495613, 0.00121425883844495, 0.00922321155667305, 0.991401970386505 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 43 ] }, { "name": "LeftHandPinky3", "translation": [ 2.27373675443232e-13, 1.95477187633514, 1.81898940354586e-12 ], "rotation": [ 0.130522727966309, -0.000951214926317334, -0.00722519494593143, 0.991418540477753 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 44 ] }, { "name": "LeftHandPinky4", "translation": [ 0.0, 1.84976482391357, 1.81898940354586e-12 ], "rotation": [ 8.82180761380352e-18, -1.27638923328801e-17, 0.140648439526558, 0.990059614181519 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "Neck", "translation": [ -2.09076530502568e-16, 14.3466949462891, -3.28626015289046e-14 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 46 ] }, { "name": "Head", "translation": [ -1.72115390890012e-17, 9.05494976043701, 2.07404236001782e-16 ], "rotation": [ -6.93889390390723e-18, 1.27054942088145e-20, 1.0842021724855e-19, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 47, 48, 49 ] }, { "name": "HeadTop_End", "translation": [ -2.66453525910038e-15, 17.8367767333984, -4.03896783473158e-28 ], "rotation": [ 0.0, 0.0, 1.76324152623343e-37, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "RightEye", "translation": [ -6.14273977279663, 6.2331337928772, 13.0336484909058 ], "rotation": [ -6.938892249546e-18, -1.36491360355013e-20, 0.00379808945581317, 0.999992787837982 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "LeftEye", "translation": [ 6.14274263381958, 6.2331337928772, 13.0336484909058 ], "rotation": [ -6.938892249546e-18, -1.36491360355013e-20, 0.00379808945581317, 0.999992787837982 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "Bot_Skinned", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 0.00999999977648258, 0.00999999977648258, 0.00999999977648258 ], "mesh": 0, "skin": 0 } ] } ================================================ FILE: examples/resources/models/gltf/CesiumMan/README.md ================================================ # Cesium Man ## Screenshot ![screenshot](screenshot/screenshot.gif) ## License Information Donated by Cesium for glTF testing. Please follow the [Cesium Trademark Terms and Conditions](https://github.com/AnalyticalGraphicsInc/cesium/wiki/CesiumTrademark.pdf). ================================================ FILE: examples/resources/models/gltf/CesiumMan/glTF/CesiumMan.gltf ================================================ { "asset": { "generator": "COLLADA2GLTF", "version": "2.0" }, "scene": 0, "scenes": [ { "nodes": [ 0 ] } ], "nodes": [ { "children": [ 21, 1 ], "matrix": [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "mesh": 0, "skin": 0 }, { "children": [ 11, 7, 3 ], "translation": [ -3.352759847530251e-8, 0.00499989278614521, 0.6789997816085815 ], "rotation": [ -0.02679471485316753, -0.026732556521892549, -0.7065614461898804, -0.706638753414154 ], "scale": [ 0.9999999403953552, 0.9999998211860656, 0.9999999403953552 ] }, { "children": [ 4 ], "translation": [ -0.06804201006889343, -0.02857022918760777, -0.06294959783554077 ], "rotation": [ -0.06642699986696243, -0.6115013957023621, 0.7850273251533508, 0.073387511074543 ], "scale": [ 0.9999999403953552, 1.000000238418579, 1.0 ] }, { "children": [ 5 ], "translation": [ 0.0, 0.2661114931106568, 0.0 ], "rotation": [ 0.2162912338972092, 0.12430649250745774, 0.0015752052422612906, -0.9683818817138672 ], "scale": [ 1.0, 0.9999998807907105, 1.0 ] }, { "children": [ 6 ], "translation": [ 0.0, 0.2758249044418335, -1.1175900205273593e-8 ], "rotation": [ 0.8472740650177002, -0.029564039781689645, -0.020868001505732538, -0.5299217700958252 ], "scale": [ 0.9999999403953552, 0.9999998807907105, 1.0 ] }, { "translation": [ -0.001458480954170227, -0.06619883328676224, 0.027856720611453058 ], "rotation": [ -0.03726436197757721, -0.31931325793266299, 0.9460535645484924, -0.040414959192276 ], "scale": [ 1.0, 1.0000003576278689, 1.0000005960464478 ] }, { "children": [ 8 ], "translation": [ 0.06803668290376663, -0.028518669307231904, -0.06296277046203613 ], "rotation": [ 0.2475697100162506, -0.5775680541992188, 0.7479144334793091, -0.2138892114162445 ], "scale": [ 1.0, 1.000000238418579, 1.0000001192092896 ] }, { "children": [ 9 ], "translation": [ 3.725289854372704e-9, 0.2661128044128418, 1.4901200273698124e-8 ], "rotation": [ 0.20902779698371888, -0.32988959550857546, -0.05559924244880676, -0.9189064502716065 ], "scale": [ 1.0, 1.0000001192092896, 1.0000001192092896 ] }, { "children": [ 10 ], "translation": [ -7.450579708745408e-9, 0.2758241891860962, 5.5879398885849708e-9 ], "rotation": [ 0.8477396965026856, -0.004254077095538378, -0.009491981938481333, -0.5303107500076294 ], "scale": [ 0.9999998807907105, 1.0000001192092896, 1.0000001192092896 ] }, { "translation": [ -0.002346522873267532, -0.06617332994937897, 0.027856789529323576 ], "rotation": [ 0.026573536917567254, -0.3201442956924439, 0.9445450901985169, 0.06808964908123017 ], "scale": [ 1.0, 1.000000238418579, 1.000000238418579 ] }, { "children": [ 12 ], "translation": [ -1.024449947095718e-8, 1.4901200273698124e-8, 0.14541690051555634 ], "rotation": [ -0.6572523713111877, -0.00017969288455788046, -0.00010428009409224616, -0.7536706328392029 ], "scale": [ 1.0, 1.0, 1.0000001192092896 ] }, { "children": [ 19, 16, 13 ], "translation": [ 4.6566100975198307e-10, 0.250516802072525, 3.725289854372704e-9 ], "rotation": [ 0.6226037740707398, 0.00001678345142863691, -0.0000031824047255213374, -0.7825372219085693 ], "scale": [ 1.0, 1.0, 0.9999999403953552 ] }, { "children": [ 14 ], "translation": [ -0.09098775684833528, 0.00006259980000322685, -0.00006532669794978574 ], "rotation": [ 0.2964428961277008, 0.031510334461927417, -0.6522551774978638, -0.6969160437583923 ], "scale": [ 1.0000001192092896, 0.9999999403953552, 1.0000001192092896 ] }, { "children": [ 15 ], "translation": [ 0.0, 0.24200820922851566, -5.96045985901128e-8 ], "rotation": [ -0.1887933611869812, 0.9157071709632874, -0.16780903935432438, -0.3125341236591339 ], "scale": [ 0.9999999403953552, 0.9999999403953552, 0.9999998807907105 ] }, { "translation": [ 0.0, 0.18779200315475465, 0.0 ], "rotation": [ -0.058613914996385577, 0.2637767195701599, 0.05226854607462883, -0.9613814353942872 ], "scale": [ 1.0, 1.0000001192092896, 0.9999999403953552 ] }, { "children": [ 17 ], "translation": [ 0.0910135880112648, 0.000014185899999574758, -0.000058054902183357629 ], "rotation": [ 0.6797328591346741, 0.689685583114624, -0.2269716113805771, -0.10383165627717972 ], "scale": [ 1.0000001192092896, 1.0000001192092896, 1.0 ] }, { "children": [ 18 ], "translation": [ 1.1641500263781524e-10, 0.2420089989900589, 0.0 ], "rotation": [ -0.013960935175418854, -0.12937255203723908, -0.2522056996822357, -0.9588848352432252 ], "scale": [ 1.0, 0.9999999403953552, 1.0 ] }, { "translation": [ 1.4901200273698124e-8, 0.18779149651527408, 5.96045985901128e-8 ], "rotation": [ 0.006119169760495424, -0.042325541377067569, -0.07877591997385025, -0.9959746599197388 ], "scale": [ 0.9999998807907105, 1.000000238418579, 0.9999999403953552 ] }, { "children": [ 20 ], "translation": [ -8.847560017954948e-9, 5.96045985901128e-8, 0.06483662128448487 ], "rotation": [ -0.6606296300888062, 0.00008344435627805069, 0.0000710925814928487, -0.750711977481842 ] }, { "translation": [ 0.0, 0.0520397387444973, 0.0 ], "rotation": [ 0.000002552607384131989, 0.9996904730796814, -0.02487966977059841, -4.329927776325349e-7 ], "scale": [ 1.0, 1.0000001192092896, 1.0 ] }, { "children": [ 2 ] } ], "meshes": [ { "primitives": [ { "attributes": { "JOINTS_0": 1, "NORMAL": 2, "POSITION": 3, "TEXCOORD_0": 4, "WEIGHTS_0": 5 }, "indices": 0, "mode": 4, "material": 0 } ], "name": "Cesium_Man" } ], "animations": [ { "channels": [ { "sampler": 0, "target": { "node": 2, "path": "translation" } }, { "sampler": 1, "target": { "node": 2, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "scale" } } ], "samplers": [ { "input": 6, "interpolation": "LINEAR", "output": 7 }, { "input": 6, "interpolation": "LINEAR", "output": 8 }, { "input": 6, "interpolation": "LINEAR", "output": 9 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 11, "path": "translation" } }, { "sampler": 1, "target": { "node": 11, "path": "rotation" } }, { "sampler": 2, "target": { "node": 11, "path": "scale" } } ], "samplers": [ { "input": 10, "interpolation": "LINEAR", "output": 11 }, { "input": 10, "interpolation": "LINEAR", "output": 12 }, { "input": 10, "interpolation": "LINEAR", "output": 13 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 12, "path": "translation" } }, { "sampler": 1, "target": { "node": 12, "path": "rotation" } }, { "sampler": 2, "target": { "node": 12, "path": "scale" } } ], "samplers": [ { "input": 14, "interpolation": "LINEAR", "output": 15 }, { "input": 14, "interpolation": "LINEAR", "output": 16 }, { "input": 14, "interpolation": "LINEAR", "output": 17 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 19, "path": "translation" } }, { "sampler": 1, "target": { "node": 19, "path": "rotation" } }, { "sampler": 2, "target": { "node": 19, "path": "scale" } } ], "samplers": [ { "input": 18, "interpolation": "LINEAR", "output": 19 }, { "input": 18, "interpolation": "LINEAR", "output": 20 }, { "input": 18, "interpolation": "LINEAR", "output": 21 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 20, "path": "translation" } }, { "sampler": 1, "target": { "node": 20, "path": "rotation" } }, { "sampler": 2, "target": { "node": 20, "path": "scale" } } ], "samplers": [ { "input": 22, "interpolation": "LINEAR", "output": 23 }, { "input": 22, "interpolation": "LINEAR", "output": 24 }, { "input": 22, "interpolation": "LINEAR", "output": 25 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 16, "path": "translation" } }, { "sampler": 1, "target": { "node": 16, "path": "rotation" } }, { "sampler": 2, "target": { "node": 16, "path": "scale" } } ], "samplers": [ { "input": 26, "interpolation": "LINEAR", "output": 27 }, { "input": 26, "interpolation": "LINEAR", "output": 28 }, { "input": 26, "interpolation": "LINEAR", "output": 29 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 17, "path": "translation" } }, { "sampler": 1, "target": { "node": 17, "path": "rotation" } }, { "sampler": 2, "target": { "node": 17, "path": "scale" } } ], "samplers": [ { "input": 30, "interpolation": "LINEAR", "output": 31 }, { "input": 30, "interpolation": "LINEAR", "output": 32 }, { "input": 30, "interpolation": "LINEAR", "output": 33 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 18, "path": "translation" } }, { "sampler": 1, "target": { "node": 18, "path": "rotation" } }, { "sampler": 2, "target": { "node": 18, "path": "scale" } } ], "samplers": [ { "input": 34, "interpolation": "LINEAR", "output": 35 }, { "input": 34, "interpolation": "LINEAR", "output": 36 }, { "input": 34, "interpolation": "LINEAR", "output": 37 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 13, "path": "translation" } }, { "sampler": 1, "target": { "node": 13, "path": "rotation" } }, { "sampler": 2, "target": { "node": 13, "path": "scale" } } ], "samplers": [ { "input": 38, "interpolation": "LINEAR", "output": 39 }, { "input": 38, "interpolation": "LINEAR", "output": 40 }, { "input": 38, "interpolation": "LINEAR", "output": 41 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 14, "path": "translation" } }, { "sampler": 1, "target": { "node": 14, "path": "rotation" } }, { "sampler": 2, "target": { "node": 14, "path": "scale" } } ], "samplers": [ { "input": 42, "interpolation": "LINEAR", "output": 43 }, { "input": 42, "interpolation": "LINEAR", "output": 44 }, { "input": 42, "interpolation": "LINEAR", "output": 45 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 15, "path": "translation" } }, { "sampler": 1, "target": { "node": 15, "path": "rotation" } }, { "sampler": 2, "target": { "node": 15, "path": "scale" } } ], "samplers": [ { "input": 46, "interpolation": "LINEAR", "output": 47 }, { "input": 46, "interpolation": "LINEAR", "output": 48 }, { "input": 46, "interpolation": "LINEAR", "output": 49 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 7, "path": "translation" } }, { "sampler": 1, "target": { "node": 7, "path": "rotation" } }, { "sampler": 2, "target": { "node": 7, "path": "scale" } } ], "samplers": [ { "input": 50, "interpolation": "LINEAR", "output": 51 }, { "input": 50, "interpolation": "LINEAR", "output": 52 }, { "input": 50, "interpolation": "LINEAR", "output": 53 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 8, "path": "translation" } }, { "sampler": 1, "target": { "node": 8, "path": "rotation" } }, { "sampler": 2, "target": { "node": 8, "path": "scale" } } ], "samplers": [ { "input": 54, "interpolation": "LINEAR", "output": 55 }, { "input": 54, "interpolation": "LINEAR", "output": 56 }, { "input": 54, "interpolation": "LINEAR", "output": 57 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 9, "path": "translation" } }, { "sampler": 1, "target": { "node": 9, "path": "rotation" } }, { "sampler": 2, "target": { "node": 9, "path": "scale" } } ], "samplers": [ { "input": 58, "interpolation": "LINEAR", "output": 59 }, { "input": 58, "interpolation": "LINEAR", "output": 60 }, { "input": 58, "interpolation": "LINEAR", "output": 61 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 10, "path": "translation" } }, { "sampler": 1, "target": { "node": 10, "path": "rotation" } }, { "sampler": 2, "target": { "node": 10, "path": "scale" } } ], "samplers": [ { "input": 62, "interpolation": "LINEAR", "output": 63 }, { "input": 62, "interpolation": "LINEAR", "output": 64 }, { "input": 62, "interpolation": "LINEAR", "output": 65 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 3, "path": "translation" } }, { "sampler": 1, "target": { "node": 3, "path": "rotation" } }, { "sampler": 2, "target": { "node": 3, "path": "scale" } } ], "samplers": [ { "input": 66, "interpolation": "LINEAR", "output": 67 }, { "input": 66, "interpolation": "LINEAR", "output": 68 }, { "input": 66, "interpolation": "LINEAR", "output": 69 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 4, "path": "translation" } }, { "sampler": 1, "target": { "node": 4, "path": "rotation" } }, { "sampler": 2, "target": { "node": 4, "path": "scale" } } ], "samplers": [ { "input": 70, "interpolation": "LINEAR", "output": 71 }, { "input": 70, "interpolation": "LINEAR", "output": 72 }, { "input": 70, "interpolation": "LINEAR", "output": 73 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 5, "path": "translation" } }, { "sampler": 1, "target": { "node": 5, "path": "rotation" } }, { "sampler": 2, "target": { "node": 5, "path": "scale" } } ], "samplers": [ { "input": 74, "interpolation": "LINEAR", "output": 75 }, { "input": 74, "interpolation": "LINEAR", "output": 76 }, { "input": 74, "interpolation": "LINEAR", "output": 77 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 6, "path": "translation" } }, { "sampler": 1, "target": { "node": 6, "path": "rotation" } }, { "sampler": 2, "target": { "node": 6, "path": "scale" } } ], "samplers": [ { "input": 78, "interpolation": "LINEAR", "output": 79 }, { "input": 78, "interpolation": "LINEAR", "output": 80 }, { "input": 78, "interpolation": "LINEAR", "output": 81 } ] } ], "skins": [ { "inverseBindMatrices": 82, "skeleton": 2, "joints": [ 2, 11, 12, 19, 20, 16, 13, 17, 14, 18, 15, 7, 3, 8, 4, 9, 5, 10, 6 ], "name": "Armature" } ], "accessors": [ { "bufferView": 0, "byteOffset": 0, "componentType": 5123, "count": 14016, "max": [ 3272 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 0, "componentType": 5123, "count": 3273, "max": [ 18, 18, 18, 18 ], "min": [ 0, 0, 0, 0 ], "type": "VEC4" }, { "bufferView": 2, "byteOffset": 0, "componentType": 5126, "count": 3273, "max": [ 1.0, 0.9999808073043824, 0.9944446086883544 ], "min": [ -1.0, -0.9999808073043824, -1.0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 39276, "componentType": 5126, "count": 3273, "max": [ 0.1809539943933487, 0.569136917591095, 1.5065499544143677 ], "min": [ -0.13100001215934754, -0.5691370964050293, 0.0 ], "type": "VEC3" }, { "bufferView": 1, "byteOffset": 26184, "componentType": 5126, "count": 3273, "max": [ 0.990805983543396, 0.9880298972129822 ], "min": [ 0.014079390093684197, 0.008445978164672852 ], "type": "VEC2" }, { "bufferView": 3, "byteOffset": 0, "componentType": 5126, "count": 3273, "max": [ 1.0, 0.989919900894165, 0.951076328754425, 0.8741077184677124 ], "min": [ 0.010080150328576565, 0.0, 0.0, 0.0 ], "type": "VEC4" }, { "bufferView": 4, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ 2.386510011831433e-8, -0.02000010944902897, 0.7110069990158081 ], "min": [ -7.101329746461715e-9, -0.030000120401382448, 0.6399999856948853 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ -0.02314124070107937, -0.006974140647798777, -0.7065909504890442, -0.7031946778297424 ], "min": [ -0.05146743357181549, -0.034400247037410739, -0.7094300389289856, -0.7066542506217957 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 588, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000003576278689, 1.0000001192092896 ], "min": [ 0.9999998211860656, 0.9999998807907105, 0.9999997615814208 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 196, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 1176, "componentType": 5126, "count": 49, "max": [ 0.0009999829344451428, 3.725289943190546e-8, 0.1454170048236847 ], "min": [ 0.0009999759495258332, -4.470349779239769e-8, 0.14541690051555634 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 784, "componentType": 5126, "count": 49, "max": [ -0.7105135917663574, 0.008397356607019902, 0.000531485362444073, -0.6789330840110779 ], "min": [ -0.7337970733642578, -0.011321297846734524, -0.02596380189061165, -0.703567624092102 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 1764, "componentType": 5126, "count": 49, "max": [ 1.0000003576278689, 1.0000004768371585, 0.999999701976776 ], "min": [ 1.0, 1.0000001192092896, 0.9999992847442628 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 392, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ 0.0, 0.25051671266555788, 0.0 ], "min": [ 0.0, 0.25051671266555788, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 1568, "componentType": 5126, "count": 49, "max": [ 0.6358352899551392, 0.06165437772870064, -0.00338419945910573, -0.7642753720283508 ], "min": [ 0.6224426627159119, -0.1380288153886795, -0.06534028053283692, -0.782635509967804 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 2940, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000007152557374, 0.999999701976776 ], "min": [ 0.9999998211860656, 1.0000003576278689, 0.9999992847442628 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 588, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 3528, "componentType": 5126, "count": 49, "max": [ 2.1420399676230774e-8, 8.940700269022274e-8, 0.064838707447052 ], "min": [ -1.5832499755674694e-8, 2.98022992950564e-8, 0.06483834981918335 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ -0.6325308680534363, 0.024829493835568429, 0.04200226813554764, -0.7498575448989868 ], "min": [ -0.6592774987220764, -0.03641732409596443, -0.03000717982649803, -0.7735550999641419 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 4116, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 0.9999998807907105, 1.0 ], "min": [ 0.9999998211860656, 0.9999995231628418, 0.999999701976776 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 784, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 4704, "componentType": 5126, "count": 49, "max": [ 7.450579708745408e-9, 0.0520397387444973, 0.0 ], "min": [ 7.450579708745408e-9, 0.0520397387444973, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 3136, "componentType": 5126, "count": 49, "max": [ 0.04680429771542549, 0.9995073676109314, -0.018450811505317689, 0.002033286727964878 ], "min": [ -0.09362706542015076, 0.995067298412323, -0.09058911353349686, -0.0025854958221316339 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 5292, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.0000001192092896, 1.0000004768371585 ], "min": [ 0.999999701976776, 0.9999998211860656, 1.0000001192092896 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 980, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 5880, "componentType": 5126, "count": 49, "max": [ 0.08800014853477478, 0.000014096500308369288, -0.00005573029920924455 ], "min": [ 0.08799994736909867, 0.000013977300113765525, -0.00005596880146185868 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 3920, "componentType": 5126, "count": 49, "max": [ 0.7787204384803772, 0.6963526606559753, -0.2913321256637573, -0.12775331735610966 ], "min": [ 0.41440603137016299, 0.2682091891765595, -0.6041955351829529, -0.508333683013916 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 6468, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1.0000001192092896, 1.0000004768371585 ], "min": [ 1.0, 0.9999995827674866, 1.0000001192092896 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1176, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 7056, "componentType": 5126, "count": 49, "max": [ 0.0, 0.24200910329818729, 0.0 ], "min": [ 0.0, 0.24200910329818729, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 4704, "componentType": 5126, "count": 49, "max": [ 0.005276965908706188, -0.10532382130622864, -0.0563904233276844, -0.9007523059844972 ], "min": [ -0.08755125105381012, -0.15304648876190186, -0.4198120832443238, -0.989989936351776 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 7644, "componentType": 5126, "count": 49, "max": [ 0.9999999403953552, 0.9999998807907105, 0.9999998807907105 ], "min": [ 0.9999994039535524, 0.9999992847442628, 0.9999995231628418 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1372, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 8232, "componentType": 5126, "count": 49, "max": [ -2.98022992950564e-8, 0.18779130280017854, 0.0 ], "min": [ -2.98022992950564e-8, 0.18779130280017854, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 5488, "componentType": 5126, "count": 49, "max": [ 0.04831664264202118, -0.03682959079742432, 0.1515040546655655, -0.9875762462615968 ], "min": [ -0.01958325318992138, -0.043389420956373218, -0.0806758776307106, -0.9989553689956664 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 8820, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.0000009536743165, 1.0000005960464478 ], "min": [ 0.999999701976776, 1.0000005960464478, 1.000000238418579 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1568, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 9408, "componentType": 5126, "count": 49, "max": [ -0.0879998505115509, 0.00006264450348680839, -0.00006240609945962206 ], "min": [ -0.0880001038312912, 0.00006249549915082753, -0.00006282330286921933 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 6272, "componentType": 5126, "count": 49, "max": [ 0.6748494505882263, 0.3152157068252564, -0.300369679927826, -0.3483264744281769 ], "min": [ 0.3661315143108368, 0.09874838590621948, -0.6449660658836365, -0.8451733589172363 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 9996, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000001192092896, 1.0 ], "min": [ 0.9999997615814208, 0.9999996423721314, 0.999999701976776 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1764, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 10584, "componentType": 5126, "count": 49, "max": [ 0.0, 0.24200810492038728, 0.0 ], "min": [ 0.0, 0.24200810492038728, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 7056, "componentType": 5126, "count": 49, "max": [ -0.003387797623872757, 0.9475951790809633, -0.0798693522810936, -0.3012830018997193 ], "min": [ -0.12710869312286378, 0.916045308113098, -0.2270231395959854, -0.3146948218345642 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 11172, "componentType": 5126, "count": 49, "max": [ 1.0000003576278689, 0.9999998807907105, 1.0000001192092896 ], "min": [ 0.9999999403953552, 0.9999995827674866, 0.9999997615814208 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1960, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 11760, "componentType": 5126, "count": 49, "max": [ 0.0, 0.187792107462883, 0.0 ], "min": [ 0.0, 0.187792107462883, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 7840, "componentType": 5126, "count": 49, "max": [ 0.15000686049461366, 0.26206517219543459, 0.06808223575353623, -0.9487173557281494 ], "min": [ -0.0010455237934365869, 0.25685790181159975, -0.10152826458215714, -0.9656248688697816 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 12348, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000009536743165, 1.0 ], "min": [ 0.9999996423721314, 1.0000003576278689, 0.9999995231628418 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2156, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 12936, "componentType": 5126, "count": 49, "max": [ 0.06761906296014786, -0.02851865068078041, -0.06296355277299881 ], "min": [ 0.0676189586520195, -0.028518760576844217, -0.06296365708112717 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 8624, "componentType": 5126, "count": 49, "max": [ 0.301033079624176, -0.20796972513198853, 0.92630273103714, -0.08994945138692856 ], "min": [ 0.1658332496881485, -0.7997090816497803, 0.4959096908569336, -0.3118112981319428 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 13524, "componentType": 5126, "count": 49, "max": [ 1.0000008344650269, 1.0, 0.9999999403953552 ], "min": [ 1.0000003576278689, 0.9999995231628418, 0.9999996423721314 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 14112, "componentType": 5126, "count": 49, "max": [ -1.4901200273698124e-8, 0.26611289381980898, 0.0 ], "min": [ -1.4901200273698124e-8, 0.26611289381980898, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 9408, "componentType": 5126, "count": 49, "max": [ 0.8112500905990601, -0.1822210103273392, 0.032220568507909778, -0.4743982553482056 ], "min": [ -0.03036016784608364, -0.3419179916381836, -0.289162427186966, -0.9452491998672484 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 14700, "componentType": 5126, "count": 49, "max": [ 0.9999994039535524, 1.000000238418579, 1.000000238418579 ], "min": [ 0.9999989867210388, 0.9999996423721314, 0.9999994039535524 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2548, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 15288, "componentType": 5126, "count": 49, "max": [ 0.0, 0.2758241891860962, 0.0 ], "min": [ 0.0, 0.2758241891860962, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 10192, "componentType": 5126, "count": 49, "max": [ 0.9907974004745485, -0.0014961245469748974, 0.02489613927900791, -0.13506969809532166 ], "min": [ 0.8542653918266296, -0.05430477112531662, -0.00011262076441198587, -0.5192484259605408 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 15876, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1.0000004768371585, 1.0000004768371585 ], "min": [ 1.000000238418579, 1.0, 1.0000001192092896 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2744, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 16464, "componentType": 5126, "count": 49, "max": [ -0.0023464488331228496, -0.06617332249879837, 0.02785664983093739 ], "min": [ -0.002346470952033997, -0.06617333739995957, 0.02785659022629261 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 10976, "componentType": 5126, "count": 49, "max": [ 0.02062430046498776, -0.23465925455093385, 0.9716955423355104, 0.0638260766863823 ], "min": [ 0.003326366888359189, -0.5406339168548584, 0.8410344123840332, 0.016216862946748738 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 17052, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000009536743165, 1.0000005960464478 ], "min": [ 0.9999998211860656, 1.000000238418579, 0.9999998211860656 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2940, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 17640, "componentType": 5126, "count": 49, "max": [ -0.06845708936452866, -0.028570100665092469, -0.062949538230896 ], "min": [ -0.06845712661743164, -0.02857035957276821, -0.06294971704483032 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 11760, "componentType": 5126, "count": 49, "max": [ -0.018168065696954728, -0.18232035636901856, 0.9812799096107484, 0.117560513317585 ], "min": [ -0.07457219809293747, -0.902503490447998, 0.413051187992096, 0.03284534439444542 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 18228, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.000000238418579, 1.0000003576278689 ], "min": [ 0.9999998211860656, 0.9999995827674866, 0.9999996423721314 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 3136, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 18816, "componentType": 5126, "count": 49, "max": [ -1.1175900205273593e-8, 0.2661114931106568, 0.0 ], "min": [ -1.1175900205273593e-8, 0.2661114931106568, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 12544, "componentType": 5126, "count": 49, "max": [ 0.8507033586502075, 0.14946134388446809, 0.04984176158905029, -0.5191445350646973 ], "min": [ -0.06756377220153809, 0.06949601322412491, -0.026268262416124345, -0.9922308921813964 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 19404, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1.0000003576278689, 1.0000005960464478 ], "min": [ 1.0000001192092896, 0.9999995231628418, 0.9999998211860656 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 3332, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 19992, "componentType": 5126, "count": 49, "max": [ 0.0, 0.2758249044418335, 0.0 ], "min": [ 0.0, 0.2758249044418335, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 13328, "componentType": 5126, "count": 49, "max": [ 0.99649316072464, -0.01710231974720955, -0.022676724940538408, -0.07459255307912827 ], "min": [ 0.8792483806610107, -0.04609288275241852, -0.06820148974657059, -0.4750169813632965 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 20580, "componentType": 5126, "count": 49, "max": [ 0.9999995827674866, 1.0, 1.0000003576278689 ], "min": [ 0.999999225139618, 0.9999995231628418, 1.0 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 3528, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 21168, "componentType": 5126, "count": 49, "max": [ -0.0014585109893232585, -0.06619886308908463, 0.02785670943558216 ], "min": [ -0.0014585329918190837, -0.06619889289140701, 0.02785668894648552 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 14112, "componentType": 5126, "count": 49, "max": [ -0.00960757862776518, -0.2635453343391419, 0.9620476961135864, 0.06995902955532074 ], "min": [ -0.04577624797821045, -0.4899238646030426, 0.8689604997634888, -0.06424159556627274 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 21756, "componentType": 5126, "count": 49, "max": [ 0.9999996423721314, 1.0000003576278689, 0.9999998807907105 ], "min": [ 0.9999991655349731, 0.9999997615814208, 0.9999994039535524 ], "type": "VEC3" }, { "bufferView": 7, "byteOffset": 0, "componentType": 5126, "count": 19, "max": [ 0.780990481376648, 0.9918341040611268, 0.9992613196372986, 0.0, 1.0, 0.8904604315757752, 0.6854007244110107, 0.0, 0.79917311668396, 0.9999359250068665, 0.997134804725647, 0.0, 0.20702040195465089, 0.5989438891410828, 1.001250982284546, 1.0 ], "min": [ -0.9985063076019288, -0.9971349835395812, -0.9999359250068665, 0.0, -1.0, -0.8904621005058289, -0.4517692029476166, 0.0, -0.18484599888324736, -0.9853218197822572, -0.997802197933197, 0.0, -0.811928927898407, -1.18982994556427, -1.058609962463379, 1.0 ], "type": "MAT4" } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0 }, "emissiveFactor": [ 0.0, 0.0, 0.0 ], "name": "Cesium_Man-effect" } ], "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "uri": "CesiumMan.jpg" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9986, "wrapS": 10497, "wrapT": 10497 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 225468, "byteLength": 28032, "target": 34963 }, { "buffer": 0, "byteOffset": 169376, "byteLength": 52368, "byteStride": 8, "target": 34962 }, { "buffer": 0, "byteOffset": 90824, "byteLength": 78552, "byteStride": 12, "target": 34962 }, { "buffer": 0, "byteOffset": 16112, "byteLength": 52368, "byteStride": 16, "target": 34962 }, { "buffer": 0, "byteOffset": 221744, "byteLength": 3724 }, { "buffer": 0, "byteOffset": 68480, "byteLength": 22344 }, { "buffer": 0, "byteOffset": 1216, "byteLength": 14896 }, { "buffer": 0, "byteOffset": 0, "byteLength": 1216 } ], "buffers": [ { "byteLength": 253500, "uri": "CesiumMan0.bin" } ] } ================================================ FILE: examples/resources/models/gltf/CesiumMan/glTF-Draco/CesiumMan.gltf ================================================ { "asset": { "generator": "COLLADA2GLTF", "version": "2.0" }, "scene": 0, "scenes": [ { "nodes": [ 0 ] } ], "nodes": [ { "children": [ 21, 1 ], "matrix": [ 1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1 ] }, { "mesh": 0, "skin": 0 }, { "children": [ 11, 7, 3 ], "translation": [ -3.352759847530251e-8, 0.00499989278614521, 0.6789997816085815 ], "rotation": [ -0.026794714853167537, -0.026732556521892548, -0.7065613865852356, -0.706638753414154 ], "scale": [ 0.9999998807907104, 0.9999998211860656, 0.9999999403953552 ] }, { "children": [ 4 ], "translation": [ -0.06804201006889343, -0.02857022918760777, -0.06294959783554077 ], "rotation": [ -0.06642699241638184, -0.6115013957023621, 0.7850273251533508, 0.073387511074543 ], "scale": [ 0.9999999403953552, 1.000000238418579, 1 ] }, { "children": [ 5 ], "translation": [ 0, 0.26611149311065674, 0 ], "rotation": [ 0.216291218996048, 0.12430648505687714, 0.0015752052422612906, -0.9683818817138672 ], "scale": [ 1, 0.9999998211860656, 1 ] }, { "children": [ 6 ], "translation": [ 0, 0.2758249044418335, -1.1175900205273592e-8 ], "rotation": [ 0.8472740650177002, -0.029564039781689644, -0.020868001505732536, -0.5299217700958252 ], "scale": [ 0.9999999403953552, 0.9999998807907104, 1 ] }, { "translation": [ -0.001458480954170227, -0.06619883328676224, 0.027856720611453056 ], "rotation": [ -0.03726436197757721, -0.319313257932663, 0.9460535645484924, -0.040414959192276 ], "scale": [ 1, 1.0000003576278689, 1.0000005960464478 ] }, { "children": [ 8 ], "translation": [ 0.06803668290376663, -0.028518669307231903, -0.06296277046203613 ], "rotation": [ 0.2475697100162506, -0.5775680541992188, 0.7479144334793091, -0.2138892114162445 ], "scale": [ 1, 1.000000238418579, 1.0000001192092896 ] }, { "children": [ 9 ], "translation": [ 3.725290076417309e-9, 0.2661128044128418, 1.4901200273698123e-8 ], "rotation": [ 0.2090278267860413, -0.32988959550857544, -0.05559924989938736, -0.9189063906669616 ] }, { "children": [ 10 ], "translation": [ -7.450580152834618e-9, 0.2758241891860962, 5.5879398885849704e-9 ], "rotation": [ 0.8477396965026855, -0.004254077095538378, -0.009491981938481333, -0.5303107500076294 ], "scale": [ 0.9999998807907104, 1.0000001192092896, 1.0000001192092896 ] }, { "translation": [ -0.002346523106098175, -0.06617332994937897, 0.02785678952932358 ], "rotation": [ 0.026573536917567257, -0.3201442956924439, 0.9445450901985168, 0.06808964908123016 ], "scale": [ 1, 1.000000238418579, 1.000000238418579 ] }, { "children": [ 12 ], "translation": [ -1.02445003591356e-8, 1.4901200273698123e-8, 0.14541690051555634 ], "rotation": [ -0.6572523713111877, -0.00017969288455788046, -0.00010428010864416136, -0.7536706328392029 ], "scale": [ 0.9999999403953552, 1, 1.0000001192092896 ] }, { "children": [ 19, 16, 13 ], "translation": [ 4.6566100975198305e-10, 0.250516802072525, 3.725290076417309e-9 ], "rotation": [ 0.6226037740707397, 0.00001678345142863691, -0.0000031824047255213377, -0.7825372219085693 ], "scale": [ 1, 1, 0.9999999403953552 ] }, { "children": [ 14 ], "translation": [ -0.09098775684833528, 0.00006259980000322685, -0.00006532669794978574 ], "rotation": [ 0.2964428961277008, 0.03151032328605652, -0.652255117893219, -0.6969160437583923 ], "scale": [ 1.0000001192092896, 0.9999999403953552, 1.0000001192092896 ] }, { "children": [ 15 ], "translation": [ 0, 0.24200819432735443, -5.96045985901128e-8 ], "rotation": [ -0.1887933611869812, 0.9157071709632874, -0.16780903935432437, -0.3125341236591339 ], "scale": [ 0.9999999403953552, 0.9999999403953552, 0.9999998807907104 ] }, { "translation": [ 0, 0.18779200315475464, 0 ], "rotation": [ -0.058613914996385574, 0.2637767195701599, 0.05226854607462883, -0.9613814353942872 ], "scale": [ 1, 1, 0.9999999403953552 ] }, { "children": [ 17 ], "translation": [ 0.0910135880112648, 0.000014185899999574758, -0.00005805489854537882 ], "rotation": [ 0.6797328591346741, 0.689685583114624, -0.2269716113805771, -0.10383165627717972 ], "scale": [ 1, 1.0000001192092896, 1 ] }, { "children": [ 18 ], "translation": [ 1.1641500263781523e-10, 0.2420089989900589, 0 ], "rotation": [ -0.013960935175418854, -0.12937255203723907, -0.2522056698799134, -0.9588848352432252 ], "scale": [ 1, 0.9999999403953552, 1 ] }, { "translation": [ 1.4901200273698123e-8, 0.18779149651527408, 5.96045985901128e-8 ], "rotation": [ 0.006119169760495424, -0.042325541377067566, -0.07877591997385025, -0.9959746599197388 ], "scale": [ 0.9999998807907104, 1.000000238418579, 0.9999999403953552 ] }, { "children": [ 20 ], "translation": [ -8.847560017954947e-9, 5.96045985901128e-8, 0.06483662128448486 ], "rotation": [ -0.6606296300888062, 0.00008344435627805069, 0.00007109258876880631, -0.750711977481842 ] }, { "translation": [ 0, 0.0520397387444973, 0 ], "rotation": [ 0.000002552607384131989, 0.9996904730796814, -0.02487966977059841, -4.329927776325349e-7 ] }, { "children": [ 2 ] } ], "meshes": [ { "primitives": [ { "attributes": { "JOINTS_0": 78, "NORMAL": 79, "POSITION": 80, "TEXCOORD_0": 81, "WEIGHTS_0": 82 }, "indices": 77, "mode": 4, "material": 0, "extensions": { "KHR_draco_mesh_compression": { "bufferView": 4, "attributes": { "JOINTS_0": 0, "NORMAL": 1, "POSITION": 2, "TEXCOORD_0": 3, "WEIGHTS_0": 4 } } } } ], "name": "Cesium_Man" } ], "animations": [ { "channels": [ { "sampler": 0, "target": { "node": 2, "path": "translation" } }, { "sampler": 1, "target": { "node": 2, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "scale" } }, { "sampler": 3, "target": { "node": 11, "path": "translation" } }, { "sampler": 4, "target": { "node": 11, "path": "rotation" } }, { "sampler": 5, "target": { "node": 11, "path": "scale" } }, { "sampler": 6, "target": { "node": 12, "path": "translation" } }, { "sampler": 7, "target": { "node": 12, "path": "rotation" } }, { "sampler": 8, "target": { "node": 12, "path": "scale" } }, { "sampler": 9, "target": { "node": 19, "path": "translation" } }, { "sampler": 10, "target": { "node": 19, "path": "rotation" } }, { "sampler": 11, "target": { "node": 19, "path": "scale" } }, { "sampler": 12, "target": { "node": 20, "path": "translation" } }, { "sampler": 13, "target": { "node": 20, "path": "rotation" } }, { "sampler": 14, "target": { "node": 20, "path": "scale" } }, { "sampler": 15, "target": { "node": 16, "path": "translation" } }, { "sampler": 16, "target": { "node": 16, "path": "rotation" } }, { "sampler": 17, "target": { "node": 16, "path": "scale" } }, { "sampler": 18, "target": { "node": 17, "path": "translation" } }, { "sampler": 19, "target": { "node": 17, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "scale" } }, { "sampler": 21, "target": { "node": 18, "path": "translation" } }, { "sampler": 22, "target": { "node": 18, "path": "rotation" } }, { "sampler": 23, "target": { "node": 18, "path": "scale" } }, { "sampler": 24, "target": { "node": 13, "path": "translation" } }, { "sampler": 25, "target": { "node": 13, "path": "rotation" } }, { "sampler": 26, "target": { "node": 13, "path": "scale" } }, { "sampler": 27, "target": { "node": 14, "path": "translation" } }, { "sampler": 28, "target": { "node": 14, "path": "rotation" } }, { "sampler": 29, "target": { "node": 14, "path": "scale" } }, { "sampler": 30, "target": { "node": 15, "path": "translation" } }, { "sampler": 31, "target": { "node": 15, "path": "rotation" } }, { "sampler": 32, "target": { "node": 15, "path": "scale" } }, { "sampler": 33, "target": { "node": 7, "path": "translation" } }, { "sampler": 34, "target": { "node": 7, "path": "rotation" } }, { "sampler": 35, "target": { "node": 7, "path": "scale" } }, { "sampler": 36, "target": { "node": 8, "path": "translation" } }, { "sampler": 37, "target": { "node": 8, "path": "rotation" } }, { "sampler": 38, "target": { "node": 8, "path": "scale" } }, { "sampler": 39, "target": { "node": 9, "path": "translation" } }, { "sampler": 40, "target": { "node": 9, "path": "rotation" } }, { "sampler": 41, "target": { "node": 9, "path": "scale" } }, { "sampler": 42, "target": { "node": 10, "path": "translation" } }, { "sampler": 43, "target": { "node": 10, "path": "rotation" } }, { "sampler": 44, "target": { "node": 10, "path": "scale" } }, { "sampler": 45, "target": { "node": 3, "path": "translation" } }, { "sampler": 46, "target": { "node": 3, "path": "rotation" } }, { "sampler": 47, "target": { "node": 3, "path": "scale" } }, { "sampler": 48, "target": { "node": 4, "path": "translation" } }, { "sampler": 49, "target": { "node": 4, "path": "rotation" } }, { "sampler": 50, "target": { "node": 4, "path": "scale" } }, { "sampler": 51, "target": { "node": 5, "path": "translation" } }, { "sampler": 52, "target": { "node": 5, "path": "rotation" } }, { "sampler": 53, "target": { "node": 5, "path": "scale" } }, { "sampler": 54, "target": { "node": 6, "path": "translation" } }, { "sampler": 55, "target": { "node": 6, "path": "rotation" } }, { "sampler": 56, "target": { "node": 6, "path": "scale" } } ], "samplers": [ { "input": 0, "interpolation": "LINEAR", "output": 1 }, { "input": 0, "interpolation": "LINEAR", "output": 2 }, { "input": 0, "interpolation": "LINEAR", "output": 3 }, { "input": 4, "interpolation": "LINEAR", "output": 5 }, { "input": 4, "interpolation": "LINEAR", "output": 6 }, { "input": 4, "interpolation": "LINEAR", "output": 7 }, { "input": 8, "interpolation": "LINEAR", "output": 9 }, { "input": 8, "interpolation": "LINEAR", "output": 10 }, { "input": 8, "interpolation": "LINEAR", "output": 11 }, { "input": 12, "interpolation": "LINEAR", "output": 13 }, { "input": 12, "interpolation": "LINEAR", "output": 14 }, { "input": 12, "interpolation": "LINEAR", "output": 15 }, { "input": 16, "interpolation": "LINEAR", "output": 17 }, { "input": 16, "interpolation": "LINEAR", "output": 18 }, { "input": 16, "interpolation": "LINEAR", "output": 19 }, { "input": 20, "interpolation": "LINEAR", "output": 21 }, { "input": 20, "interpolation": "LINEAR", "output": 22 }, { "input": 20, "interpolation": "LINEAR", "output": 23 }, { "input": 24, "interpolation": "LINEAR", "output": 25 }, { "input": 24, "interpolation": "LINEAR", "output": 26 }, { "input": 24, "interpolation": "LINEAR", "output": 27 }, { "input": 28, "interpolation": "LINEAR", "output": 29 }, { "input": 28, "interpolation": "LINEAR", "output": 30 }, { "input": 28, "interpolation": "LINEAR", "output": 31 }, { "input": 32, "interpolation": "LINEAR", "output": 33 }, { "input": 32, "interpolation": "LINEAR", "output": 34 }, { "input": 32, "interpolation": "LINEAR", "output": 35 }, { "input": 36, "interpolation": "LINEAR", "output": 37 }, { "input": 36, "interpolation": "LINEAR", "output": 38 }, { "input": 36, "interpolation": "LINEAR", "output": 39 }, { "input": 40, "interpolation": "LINEAR", "output": 41 }, { "input": 40, "interpolation": "LINEAR", "output": 42 }, { "input": 40, "interpolation": "LINEAR", "output": 43 }, { "input": 44, "interpolation": "LINEAR", "output": 45 }, { "input": 44, "interpolation": "LINEAR", "output": 46 }, { "input": 44, "interpolation": "LINEAR", "output": 47 }, { "input": 48, "interpolation": "LINEAR", "output": 49 }, { "input": 48, "interpolation": "LINEAR", "output": 50 }, { "input": 48, "interpolation": "LINEAR", "output": 51 }, { "input": 52, "interpolation": "LINEAR", "output": 53 }, { "input": 52, "interpolation": "LINEAR", "output": 54 }, { "input": 52, "interpolation": "LINEAR", "output": 55 }, { "input": 56, "interpolation": "LINEAR", "output": 57 }, { "input": 56, "interpolation": "LINEAR", "output": 58 }, { "input": 56, "interpolation": "LINEAR", "output": 59 }, { "input": 60, "interpolation": "LINEAR", "output": 61 }, { "input": 60, "interpolation": "LINEAR", "output": 62 }, { "input": 60, "interpolation": "LINEAR", "output": 63 }, { "input": 64, "interpolation": "LINEAR", "output": 65 }, { "input": 64, "interpolation": "LINEAR", "output": 66 }, { "input": 64, "interpolation": "LINEAR", "output": 67 }, { "input": 68, "interpolation": "LINEAR", "output": 69 }, { "input": 68, "interpolation": "LINEAR", "output": 70 }, { "input": 68, "interpolation": "LINEAR", "output": 71 }, { "input": 72, "interpolation": "LINEAR", "output": 73 }, { "input": 72, "interpolation": "LINEAR", "output": 74 }, { "input": 72, "interpolation": "LINEAR", "output": 75 } ] } ], "skins": [ { "inverseBindMatrices": 76, "skeleton": 2, "joints": [ 2, 11, 12, 19, 20, 16, 13, 17, 14, 18, 15, 7, 3, 8, 4, 9, 5, 10, 6 ], "name": "Armature" } ], "accessors": [ { "bufferView": 0, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ 2.386510011831433e-8, -0.02000010944902897, 0.7110069990158081 ], "min": [ -7.101330190550925e-9, -0.030000120401382446, 0.6399999856948853 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ -0.02314124070107937, -0.006974140647798777, -0.7065909504890442, -0.7031946778297424 ], "min": [ -0.05146743357181549, -0.03440024703741074, -0.7094300389289856, -0.7066542506217957 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 588, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000003576278689, 1.0000001192092896 ], "min": [ 0.9999998211860656, 0.9999998211860656, 0.9999997615814208 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 196, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 1176, "componentType": 5126, "count": 49, "max": [ 0.0009999830508604646, 3.725289943190546e-8, 0.1454170048236847 ], "min": [ 0.0009999759495258331, -4.470350134511136e-8, 0.14541690051555634 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 784, "componentType": 5126, "count": 49, "max": [ -0.7105135917663574, 0.008397356607019901, 0.000531485362444073, -0.6789330840110779 ], "min": [ -0.733797013759613, -0.0113212987780571, -0.02596380189061165, -0.703567624092102 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 1764, "componentType": 5126, "count": 49, "max": [ 1.0000003576278689, 1.0000004768371584, 0.999999701976776 ], "min": [ 0.9999999403953552, 1.0000001192092896, 0.9999992847442628 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 392, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ 0, 0.25051671266555786, 0 ], "min": [ 0, 0.25051671266555786, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 1568, "componentType": 5126, "count": 49, "max": [ 0.6358352899551392, 0.06165437772870064, -0.00338419945910573, -0.7642753720283508 ], "min": [ 0.6224426627159119, -0.1380288153886795, -0.06534027308225632, -0.782635509967804 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 2940, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000007152557373, 0.9999996423721313 ], "min": [ 0.9999998211860656, 1.000000238418579, 0.999999225139618 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 588, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 3528, "componentType": 5126, "count": 49, "max": [ 2.1420399676230776e-8, 8.940700269022274e-8, 0.064838707447052 ], "min": [ -1.5832499755674693e-8, 2.98022992950564e-8, 0.06483834981918335 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ -0.632530927658081, 0.02482949569821358, 0.04200226813554764, -0.749857485294342 ], "min": [ -0.6592774987220764, -0.03641732409596443, -0.03000718355178833, -0.7735550403594971 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 4116, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 0.9999998807907104, 1 ], "min": [ 0.9999998211860656, 0.9999995231628418, 0.9999996423721313 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 784, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 4704, "componentType": 5126, "count": 49, "max": [ 7.450580152834618e-9, 0.0520397387444973, 0 ], "min": [ 7.450580152834618e-9, 0.0520397387444973, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 3136, "componentType": 5126, "count": 49, "max": [ 0.04680429771542549, 0.9995073676109314, -0.018450811505317688, 0.002033286727964878 ], "min": [ -0.09362706542015076, 0.995067298412323, -0.09058911353349686, -0.002585495822131634 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 5292, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.0000001192092896, 1.0000004768371584 ], "min": [ 0.999999701976776, 0.9999998211860656, 1.0000001192092896 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 980, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 5880, "componentType": 5126, "count": 49, "max": [ 0.08800014853477478, 0.000014096500308369288, -0.00005573029920924455 ], "min": [ 0.08799994736909866, 0.000013977300113765525, -0.00005596880146185868 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 3920, "componentType": 5126, "count": 49, "max": [ 0.7787204384803772, 0.6963526606559753, -0.2913321256637573, -0.12775331735610965 ], "min": [ 0.41440603137016296, 0.2682091891765595, -0.6041955351829529, -0.508333683013916 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 6468, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1, 1.0000004768371584 ], "min": [ 1, 0.9999995827674866, 1.0000001192092896 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 1176, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 7056, "componentType": 5126, "count": 49, "max": [ 0, 0.24200910329818728, 0 ], "min": [ 0, 0.24200910329818728, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 4704, "componentType": 5126, "count": 49, "max": [ 0.005276965908706188, -0.10532382130622864, -0.0563904233276844, -0.9007523059844972 ], "min": [ -0.08755125850439072, -0.15304648876190186, -0.4198120832443238, -0.989989936351776 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 7644, "componentType": 5126, "count": 49, "max": [ 0.9999999403953552, 0.9999998807907104, 0.9999998807907104 ], "min": [ 0.9999994039535524, 0.9999992847442628, 0.9999995231628418 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 1372, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 8232, "componentType": 5126, "count": 49, "max": [ -2.98022992950564e-8, 0.18779130280017856, 0 ], "min": [ -2.98022992950564e-8, 0.18779130280017856, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 5488, "componentType": 5126, "count": 49, "max": [ 0.04831664264202118, -0.03682959079742432, 0.1515040546655655, -0.9875762462615968 ], "min": [ -0.01958325318992138, -0.043389420956373215, -0.0806758776307106, -0.9989553689956664 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 8820, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.0000009536743164, 1.0000005960464478 ], "min": [ 0.9999997615814208, 1.0000005960464478, 1.000000238418579 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 1568, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 9408, "componentType": 5126, "count": 49, "max": [ -0.0879998505115509, 0.00006264450348680839, -0.00006240609945962206 ], "min": [ -0.0880000963807106, 0.00006249549915082753, -0.00006282330286921933 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 6272, "componentType": 5126, "count": 49, "max": [ 0.6748494505882263, 0.31521570682525635, -0.300369679927826, -0.3483264744281769 ], "min": [ 0.3661315143108368, 0.09874838590621948, -0.6449660062789917, -0.8451733589172363 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 9996, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000001192092896, 1 ], "min": [ 0.9999997615814208, 0.9999996423721313, 0.9999996423721313 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 1764, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 10584, "componentType": 5126, "count": 49, "max": [ 0, 0.24200810492038727, 0 ], "min": [ 0, 0.24200810492038727, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 7056, "componentType": 5126, "count": 49, "max": [ -0.003387797623872757, 0.9475951790809632, -0.0798693522810936, -0.3012830018997193 ], "min": [ -0.12710869312286377, 0.916045308113098, -0.2270231395959854, -0.3146948218345642 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 11172, "componentType": 5126, "count": 49, "max": [ 1.0000003576278689, 0.9999998807907104, 1.0000001192092896 ], "min": [ 0.9999999403953552, 0.9999995231628418, 0.999999701976776 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 1960, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 11760, "componentType": 5126, "count": 49, "max": [ 0, 0.1877920925617218, 0 ], "min": [ 0, 0.1877920925617218, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 7840, "componentType": 5126, "count": 49, "max": [ 0.15000686049461365, 0.2620651721954346, 0.06808223575353622, -0.9487173557281494 ], "min": [ -0.0010455237934365869, 0.2568579018115998, -0.10152826458215714, -0.9656248688697816 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 12348, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000009536743164, 1 ], "min": [ 0.9999996423721313, 1.0000003576278689, 0.999999463558197 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 2156, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 12936, "componentType": 5126, "count": 49, "max": [ 0.06761906296014786, -0.02851865068078041, -0.06296355277299881 ], "min": [ 0.0676189586520195, -0.028518760576844215, -0.06296365708112717 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 8624, "componentType": 5126, "count": 49, "max": [ 0.301033079624176, -0.20796972513198853, 0.92630273103714, -0.08994945138692856 ], "min": [ 0.1658332496881485, -0.7997090816497803, 0.4959096908569336, -0.3118112683296204 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 13524, "componentType": 5126, "count": 49, "max": [ 1.0000008344650269, 1, 0.9999999403953552 ], "min": [ 1.0000003576278689, 0.9999995231628418, 0.9999996423721313 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 14112, "componentType": 5126, "count": 49, "max": [ -1.4901200273698123e-8, 0.26611289381980896, 0 ], "min": [ -1.4901200273698123e-8, 0.26611289381980896, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 9408, "componentType": 5126, "count": 49, "max": [ 0.8112500905990601, -0.1822210103273392, 0.032220568507909775, -0.4743982553482056 ], "min": [ -0.03036016784608364, -0.3419179916381836, -0.28916242718696594, -0.9452491998672484 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 14700, "componentType": 5126, "count": 49, "max": [ 0.9999994039535524, 1.000000238418579, 1.000000238418579 ], "min": [ 0.9999989867210388, 0.9999996423721313, 0.9999994039535524 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 2548, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 15288, "componentType": 5126, "count": 49, "max": [ 0, 0.2758241891860962, 0 ], "min": [ 0, 0.2758241891860962, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 10192, "componentType": 5126, "count": 49, "max": [ 0.9907974004745485, -0.0014961245469748974, 0.02489613927900791, -0.13506969809532166 ], "min": [ 0.8542653322219849, -0.05430477112531662, -0.00011262076441198587, -0.5192484259605408 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 15876, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1.0000003576278689, 1.0000004768371584 ], "min": [ 1.0000001192092896, 0.9999999403953552, 1 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 2744, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 16464, "componentType": 5126, "count": 49, "max": [ -0.002346449065953493, -0.06617332249879837, 0.02785664983093739 ], "min": [ -0.002346470952033997, -0.06617333739995956, 0.02785659022629261 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 10976, "componentType": 5126, "count": 49, "max": [ 0.020624300464987755, -0.23465925455093384, 0.9716955423355104, 0.0638260766863823 ], "min": [ 0.003326366888359189, -0.5406339168548584, 0.8410344123840332, 0.016216862946748737 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 17052, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000009536743164, 1.0000005960464478 ], "min": [ 0.9999997615814208, 1.000000238418579, 0.9999998211860656 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 2940, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 17640, "componentType": 5126, "count": 49, "max": [ -0.06845708936452866, -0.028570100665092468, -0.062949538230896 ], "min": [ -0.06845712661743164, -0.02857035957276821, -0.06294971704483032 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 11760, "componentType": 5126, "count": 49, "max": [ -0.018168065696954727, -0.18232035636901855, 0.9812799096107484, 0.117560513317585 ], "min": [ -0.07457219809293747, -0.902503490447998, 0.4130511581897736, 0.03284534439444542 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 18228, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.000000238418579, 1.0000003576278689 ], "min": [ 0.9999998211860656, 0.9999995231628418, 0.9999996423721313 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 3136, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 18816, "componentType": 5126, "count": 49, "max": [ -1.1175900205273592e-8, 0.26611149311065674, 0 ], "min": [ -1.1175900205273592e-8, 0.26611149311065674, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 12544, "componentType": 5126, "count": 49, "max": [ 0.8507033586502075, 0.14946134388446808, 0.04984175786376, -0.5191445350646973 ], "min": [ -0.06756377220153809, 0.06949601322412491, -0.026268262416124344, -0.9922308921813964 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 19404, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1.000000238418579, 1.0000005960464478 ], "min": [ 1.0000001192092896, 0.9999995231628418, 0.9999998211860656 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 3332, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 19992, "componentType": 5126, "count": 49, "max": [ 0, 0.2758249044418335, 0 ], "min": [ 0, 0.2758249044418335, 0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 13328, "componentType": 5126, "count": 49, "max": [ 0.99649316072464, -0.01710231974720955, -0.022676724940538406, -0.07459255307912827 ], "min": [ 0.8792483806610107, -0.04609288275241852, -0.06820148974657059, -0.4750169813632965 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 20580, "componentType": 5126, "count": 49, "max": [ 0.9999995827674866, 1, 1.0000003576278689 ], "min": [ 0.9999991655349731, 0.9999995231628418, 0.9999999403953552 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 3528, "componentType": 5126, "count": 49, "max": [ 2 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 21168, "componentType": 5126, "count": 49, "max": [ -0.0014585109893232584, -0.06619886308908463, 0.02785670943558216 ], "min": [ -0.0014585329918190837, -0.06619889289140701, 0.02785669080913067 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 14112, "componentType": 5126, "count": 49, "max": [ -0.009607579559087753, -0.2635453343391419, 0.9620476961135864, 0.06995902955532074 ], "min": [ -0.04577624797821045, -0.4899238646030426, 0.8689604997634888, -0.06424159556627274 ], "type": "VEC4" }, { "bufferView": 1, "byteOffset": 21756, "componentType": 5126, "count": 49, "max": [ 0.9999996423721313, 1.0000003576278689, 0.9999998807907104 ], "min": [ 0.9999991655349731, 0.9999997615814208, 0.9999994039535524 ], "type": "VEC3" }, { "bufferView": 3, "byteOffset": 0, "componentType": 5126, "count": 19, "max": [ 0.780990481376648, 0.9918341040611268, 0.9992613196372986, 0, 1, 0.8904603719711304, 0.6854007244110107, 0, 0.79917311668396, 0.9999359250068665, 0.997134804725647, 0, 0.20702040195465088, 0.5989438891410828, 1.001250982284546, 1 ], "min": [ -0.9985063076019288, -0.9971349835395812, -0.9999359250068665, 0, -1, -0.8904621005058289, -0.4517692029476166, 0, -0.18484599888324735, -0.9853218197822572, -0.997802197933197, 0, -0.811928927898407, -1.18982994556427, -1.058609962463379, 1 ], "type": "MAT4" }, { "componentType": 5123, "count": 14016, "max": [ 3272 ], "min": [ 0 ], "type": "SCALAR" }, { "componentType": 5123, "count": 3273, "max": [ 18, 18, 18, 18 ], "min": [ 0, 0, 0, 0 ], "type": "VEC4" }, { "componentType": 5126, "count": 3273, "max": [ 1, 0.9999808073043824, 0.9944446086883544 ], "min": [ -1, -0.9999808073043824, -1 ], "type": "VEC3" }, { "componentType": 5126, "count": 3273, "max": [ 0.1809539943933487, 0.569136917591095, 1.5065499544143677 ], "min": [ -0.13099999725818637, -0.5691370964050293, 0 ], "type": "VEC3" }, { "componentType": 5126, "count": 3273, "max": [ 0.990805983543396, 0.9880298972129822 ], "min": [ 0.014079390093684196, 0.008445978164672852 ], "type": "VEC2" }, { "componentType": 5126, "count": 3273, "max": [ 1, 0.989919900894165, 0.951076328754425, 0.8741077184677124 ], "min": [ 0.010080150328576565, 0, 0, 0 ], "type": "VEC4" } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0 }, "emissiveFactor": [ 0, 0, 0 ], "name": "Cesium_Man-effect" } ], "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "uri": "CesiumMan.jpg" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9986, "wrapS": 10497, "wrapT": 10497 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 0, "byteLength": 3724 }, { "buffer": 0, "byteOffset": 3724, "byteLength": 22344 }, { "buffer": 0, "byteOffset": 26068, "byteLength": 14896 }, { "buffer": 0, "byteOffset": 40964, "byteLength": 1216 }, { "buffer": 0, "byteOffset": 42180, "byteLength": 27757 } ], "buffers": [ { "byteLength": 69937, "uri": "0.bin" } ], "extensionsRequired": [ "KHR_draco_mesh_compression" ], "extensionsUsed": [ "KHR_draco_mesh_compression" ] } ================================================ FILE: examples/resources/models/gltf/CesiumMan/glTF-Embedded/CesiumMan.gltf ================================================ { "asset": { "generator": "COLLADA2GLTF", "version": "2.0" }, "scene": 0, "scenes": [ { "nodes": [ 0 ] } ], "nodes": [ { "children": [ 21, 1 ], "matrix": [ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "mesh": 0, "skin": 0 }, { "children": [ 11, 7, 3 ], "translation": [ -3.352759847530251e-8, 0.00499989278614521, 0.6789997816085815 ], "rotation": [ -0.02679471485316753, -0.026732556521892549, -0.7065614461898804, -0.706638753414154 ], "scale": [ 0.9999999403953552, 0.9999998211860656, 0.9999999403953552 ] }, { "children": [ 4 ], "translation": [ -0.06804201006889343, -0.02857022918760777, -0.06294959783554077 ], "rotation": [ -0.06642699986696243, -0.6115013957023621, 0.7850273251533508, 0.073387511074543 ], "scale": [ 0.9999999403953552, 1.000000238418579, 1.0 ] }, { "children": [ 5 ], "translation": [ 0.0, 0.2661114931106568, 0.0 ], "rotation": [ 0.2162912338972092, 0.12430649250745774, 0.0015752052422612906, -0.9683818817138672 ], "scale": [ 1.0, 0.9999998807907105, 1.0 ] }, { "children": [ 6 ], "translation": [ 0.0, 0.2758249044418335, -1.1175900205273593e-8 ], "rotation": [ 0.8472740650177002, -0.029564039781689645, -0.020868001505732538, -0.5299217700958252 ], "scale": [ 0.9999999403953552, 0.9999998807907105, 1.0 ] }, { "translation": [ -0.001458480954170227, -0.06619883328676224, 0.027856720611453058 ], "rotation": [ -0.03726436197757721, -0.31931325793266299, 0.9460535645484924, -0.040414959192276 ], "scale": [ 1.0, 1.0000003576278689, 1.0000005960464478 ] }, { "children": [ 8 ], "translation": [ 0.06803668290376663, -0.028518669307231904, -0.06296277046203613 ], "rotation": [ 0.2475697100162506, -0.5775680541992188, 0.7479144334793091, -0.2138892114162445 ], "scale": [ 1.0, 1.000000238418579, 1.0000001192092896 ] }, { "children": [ 9 ], "translation": [ 3.725289854372704e-9, 0.2661128044128418, 1.4901200273698124e-8 ], "rotation": [ 0.20902779698371888, -0.32988959550857546, -0.05559924244880676, -0.9189064502716065 ], "scale": [ 1.0, 1.0000001192092896, 1.0000001192092896 ] }, { "children": [ 10 ], "translation": [ -7.450579708745408e-9, 0.2758241891860962, 5.5879398885849708e-9 ], "rotation": [ 0.8477396965026856, -0.004254077095538378, -0.009491981938481333, -0.5303107500076294 ], "scale": [ 0.9999998807907105, 1.0000001192092896, 1.0000001192092896 ] }, { "translation": [ -0.002346522873267532, -0.06617332994937897, 0.027856789529323576 ], "rotation": [ 0.026573536917567254, -0.3201442956924439, 0.9445450901985169, 0.06808964908123017 ], "scale": [ 1.0, 1.000000238418579, 1.000000238418579 ] }, { "children": [ 12 ], "translation": [ -1.024449947095718e-8, 1.4901200273698124e-8, 0.14541690051555634 ], "rotation": [ -0.6572523713111877, -0.00017969288455788046, -0.00010428009409224616, -0.7536706328392029 ], "scale": [ 1.0, 1.0, 1.0000001192092896 ] }, { "children": [ 19, 16, 13 ], "translation": [ 4.6566100975198307e-10, 0.250516802072525, 3.725289854372704e-9 ], "rotation": [ 0.6226037740707398, 0.00001678345142863691, -0.0000031824047255213374, -0.7825372219085693 ], "scale": [ 1.0, 1.0, 0.9999999403953552 ] }, { "children": [ 14 ], "translation": [ -0.09098775684833528, 0.00006259980000322685, -0.00006532669794978574 ], "rotation": [ 0.2964428961277008, 0.031510334461927417, -0.6522551774978638, -0.6969160437583923 ], "scale": [ 1.0000001192092896, 0.9999999403953552, 1.0000001192092896 ] }, { "children": [ 15 ], "translation": [ 0.0, 0.24200820922851566, -5.96045985901128e-8 ], "rotation": [ -0.1887933611869812, 0.9157071709632874, -0.16780903935432438, -0.3125341236591339 ], "scale": [ 0.9999999403953552, 0.9999999403953552, 0.9999998807907105 ] }, { "translation": [ 0.0, 0.18779200315475465, 0.0 ], "rotation": [ -0.058613914996385577, 0.2637767195701599, 0.05226854607462883, -0.9613814353942872 ], "scale": [ 1.0, 1.0000001192092896, 0.9999999403953552 ] }, { "children": [ 17 ], "translation": [ 0.0910135880112648, 0.000014185899999574758, -0.000058054902183357629 ], "rotation": [ 0.6797328591346741, 0.689685583114624, -0.2269716113805771, -0.10383165627717972 ], "scale": [ 1.0000001192092896, 1.0000001192092896, 1.0 ] }, { "children": [ 18 ], "translation": [ 1.1641500263781524e-10, 0.2420089989900589, 0.0 ], "rotation": [ -0.013960935175418854, -0.12937255203723908, -0.2522056996822357, -0.9588848352432252 ], "scale": [ 1.0, 0.9999999403953552, 1.0 ] }, { "translation": [ 1.4901200273698124e-8, 0.18779149651527408, 5.96045985901128e-8 ], "rotation": [ 0.006119169760495424, -0.042325541377067569, -0.07877591997385025, -0.9959746599197388 ], "scale": [ 0.9999998807907105, 1.000000238418579, 0.9999999403953552 ] }, { "children": [ 20 ], "translation": [ -8.847560017954948e-9, 5.96045985901128e-8, 0.06483662128448487 ], "rotation": [ -0.6606296300888062, 0.00008344435627805069, 0.0000710925814928487, -0.750711977481842 ] }, { "translation": [ 0.0, 0.0520397387444973, 0.0 ], "rotation": [ 0.000002552607384131989, 0.9996904730796814, -0.02487966977059841, -4.329927776325349e-7 ], "scale": [ 1.0, 1.0000001192092896, 1.0 ] }, { "children": [ 2 ] } ], "meshes": [ { "primitives": [ { "attributes": { "JOINTS_0": 1, "NORMAL": 2, "POSITION": 3, "TEXCOORD_0": 4, "WEIGHTS_0": 5 }, "indices": 0, "mode": 4, "material": 0 } ], "name": "Cesium_Man" } ], "animations": [ { "channels": [ { "sampler": 0, "target": { "node": 2, "path": "translation" } }, { "sampler": 1, "target": { "node": 2, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "scale" } } ], "samplers": [ { "input": 6, "interpolation": "LINEAR", "output": 7 }, { "input": 6, "interpolation": "LINEAR", "output": 8 }, { "input": 6, "interpolation": "LINEAR", "output": 9 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 11, "path": "translation" } }, { "sampler": 1, "target": { "node": 11, "path": "rotation" } }, { "sampler": 2, "target": { "node": 11, "path": "scale" } } ], "samplers": [ { "input": 10, "interpolation": "LINEAR", "output": 11 }, { "input": 10, "interpolation": "LINEAR", "output": 12 }, { "input": 10, "interpolation": "LINEAR", "output": 13 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 12, "path": "translation" } }, { "sampler": 1, "target": { "node": 12, "path": "rotation" } }, { "sampler": 2, "target": { "node": 12, "path": "scale" } } ], "samplers": [ { "input": 14, "interpolation": "LINEAR", "output": 15 }, { "input": 14, "interpolation": "LINEAR", "output": 16 }, { "input": 14, "interpolation": "LINEAR", "output": 17 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 19, "path": "translation" } }, { "sampler": 1, "target": { "node": 19, "path": "rotation" } }, { "sampler": 2, "target": { "node": 19, "path": "scale" } } ], "samplers": [ { "input": 18, "interpolation": "LINEAR", "output": 19 }, { "input": 18, "interpolation": "LINEAR", "output": 20 }, { "input": 18, "interpolation": "LINEAR", "output": 21 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 20, "path": "translation" } }, { "sampler": 1, "target": { "node": 20, "path": "rotation" } }, { "sampler": 2, "target": { "node": 20, "path": "scale" } } ], "samplers": [ { "input": 22, "interpolation": "LINEAR", "output": 23 }, { "input": 22, "interpolation": "LINEAR", "output": 24 }, { "input": 22, "interpolation": "LINEAR", "output": 25 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 16, "path": "translation" } }, { "sampler": 1, "target": { "node": 16, "path": "rotation" } }, { "sampler": 2, "target": { "node": 16, "path": "scale" } } ], "samplers": [ { "input": 26, "interpolation": "LINEAR", "output": 27 }, { "input": 26, "interpolation": "LINEAR", "output": 28 }, { "input": 26, "interpolation": "LINEAR", "output": 29 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 17, "path": "translation" } }, { "sampler": 1, "target": { "node": 17, "path": "rotation" } }, { "sampler": 2, "target": { "node": 17, "path": "scale" } } ], "samplers": [ { "input": 30, "interpolation": "LINEAR", "output": 31 }, { "input": 30, "interpolation": "LINEAR", "output": 32 }, { "input": 30, "interpolation": "LINEAR", "output": 33 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 18, "path": "translation" } }, { "sampler": 1, "target": { "node": 18, "path": "rotation" } }, { "sampler": 2, "target": { "node": 18, "path": "scale" } } ], "samplers": [ { "input": 34, "interpolation": "LINEAR", "output": 35 }, { "input": 34, "interpolation": "LINEAR", "output": 36 }, { "input": 34, "interpolation": "LINEAR", "output": 37 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 13, "path": "translation" } }, { "sampler": 1, "target": { "node": 13, "path": "rotation" } }, { "sampler": 2, "target": { "node": 13, "path": "scale" } } ], "samplers": [ { "input": 38, "interpolation": "LINEAR", "output": 39 }, { "input": 38, "interpolation": "LINEAR", "output": 40 }, { "input": 38, "interpolation": "LINEAR", "output": 41 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 14, "path": "translation" } }, { "sampler": 1, "target": { "node": 14, "path": "rotation" } }, { "sampler": 2, "target": { "node": 14, "path": "scale" } } ], "samplers": [ { "input": 42, "interpolation": "LINEAR", "output": 43 }, { "input": 42, "interpolation": "LINEAR", "output": 44 }, { "input": 42, "interpolation": "LINEAR", "output": 45 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 15, "path": "translation" } }, { "sampler": 1, "target": { "node": 15, "path": "rotation" } }, { "sampler": 2, "target": { "node": 15, "path": "scale" } } ], "samplers": [ { "input": 46, "interpolation": "LINEAR", "output": 47 }, { "input": 46, "interpolation": "LINEAR", "output": 48 }, { "input": 46, "interpolation": "LINEAR", "output": 49 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 7, "path": "translation" } }, { "sampler": 1, "target": { "node": 7, "path": "rotation" } }, { "sampler": 2, "target": { "node": 7, "path": "scale" } } ], "samplers": [ { "input": 50, "interpolation": "LINEAR", "output": 51 }, { "input": 50, "interpolation": "LINEAR", "output": 52 }, { "input": 50, "interpolation": "LINEAR", "output": 53 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 8, "path": "translation" } }, { "sampler": 1, "target": { "node": 8, "path": "rotation" } }, { "sampler": 2, "target": { "node": 8, "path": "scale" } } ], "samplers": [ { "input": 54, "interpolation": "LINEAR", "output": 55 }, { "input": 54, "interpolation": "LINEAR", "output": 56 }, { "input": 54, "interpolation": "LINEAR", "output": 57 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 9, "path": "translation" } }, { "sampler": 1, "target": { "node": 9, "path": "rotation" } }, { "sampler": 2, "target": { "node": 9, "path": "scale" } } ], "samplers": [ { "input": 58, "interpolation": "LINEAR", "output": 59 }, { "input": 58, "interpolation": "LINEAR", "output": 60 }, { "input": 58, "interpolation": "LINEAR", "output": 61 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 10, "path": "translation" } }, { "sampler": 1, "target": { "node": 10, "path": "rotation" } }, { "sampler": 2, "target": { "node": 10, "path": "scale" } } ], "samplers": [ { "input": 62, "interpolation": "LINEAR", "output": 63 }, { "input": 62, "interpolation": "LINEAR", "output": 64 }, { "input": 62, "interpolation": "LINEAR", "output": 65 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 3, "path": "translation" } }, { "sampler": 1, "target": { "node": 3, "path": "rotation" } }, { "sampler": 2, "target": { "node": 3, "path": "scale" } } ], "samplers": [ { "input": 66, "interpolation": "LINEAR", "output": 67 }, { "input": 66, "interpolation": "LINEAR", "output": 68 }, { "input": 66, "interpolation": "LINEAR", "output": 69 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 4, "path": "translation" } }, { "sampler": 1, "target": { "node": 4, "path": "rotation" } }, { "sampler": 2, "target": { "node": 4, "path": "scale" } } ], "samplers": [ { "input": 70, "interpolation": "LINEAR", "output": 71 }, { "input": 70, "interpolation": "LINEAR", "output": 72 }, { "input": 70, "interpolation": "LINEAR", "output": 73 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 5, "path": "translation" } }, { "sampler": 1, "target": { "node": 5, "path": "rotation" } }, { "sampler": 2, "target": { "node": 5, "path": "scale" } } ], "samplers": [ { "input": 74, "interpolation": "LINEAR", "output": 75 }, { "input": 74, "interpolation": "LINEAR", "output": 76 }, { "input": 74, "interpolation": "LINEAR", "output": 77 } ] }, { "channels": [ { "sampler": 0, "target": { "node": 6, "path": "translation" } }, { "sampler": 1, "target": { "node": 6, "path": "rotation" } }, { "sampler": 2, "target": { "node": 6, "path": "scale" } } ], "samplers": [ { "input": 78, "interpolation": "LINEAR", "output": 79 }, { "input": 78, "interpolation": "LINEAR", "output": 80 }, { "input": 78, "interpolation": "LINEAR", "output": 81 } ] } ], "skins": [ { "inverseBindMatrices": 82, "skeleton": 2, "joints": [ 2, 11, 12, 19, 20, 16, 13, 17, 14, 18, 15, 7, 3, 8, 4, 9, 5, 10, 6 ], "name": "Armature" } ], "accessors": [ { "bufferView": 0, "byteOffset": 0, "componentType": 5123, "count": 14016, "max": [ 3272 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 0, "componentType": 5123, "count": 3273, "max": [ 18, 18, 18, 18 ], "min": [ 0, 0, 0, 0 ], "type": "VEC4" }, { "bufferView": 2, "byteOffset": 0, "componentType": 5126, "count": 3273, "max": [ 1.0, 0.9999808073043824, 0.9944446086883544 ], "min": [ -1.0, -0.9999808073043824, -1.0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 39276, "componentType": 5126, "count": 3273, "max": [ 0.1809539943933487, 0.569136917591095, 1.5065499544143677 ], "min": [ -0.13100001215934754, -0.5691370964050293, 0.0 ], "type": "VEC3" }, { "bufferView": 1, "byteOffset": 26184, "componentType": 5126, "count": 3273, "max": [ 0.990805983543396, 0.9880298972129822 ], "min": [ 0.014079390093684197, 0.008445978164672852 ], "type": "VEC2" }, { "bufferView": 3, "byteOffset": 0, "componentType": 5126, "count": 3273, "max": [ 1.0, 0.989919900894165, 0.951076328754425, 0.8741077184677124 ], "min": [ 0.010080150328576565, 0.0, 0.0, 0.0 ], "type": "VEC4" }, { "bufferView": 4, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ 2.386510011831433e-8, -0.02000010944902897, 0.7110069990158081 ], "min": [ -7.101329746461715e-9, -0.030000120401382448, 0.6399999856948853 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 0, "componentType": 5126, "count": 49, "max": [ -0.02314124070107937, -0.006974140647798777, -0.7065909504890442, -0.7031946778297424 ], "min": [ -0.05146743357181549, -0.034400247037410739, -0.7094300389289856, -0.7066542506217957 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 588, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000003576278689, 1.0000001192092896 ], "min": [ 0.9999998211860656, 0.9999998807907105, 0.9999997615814208 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 196, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 1176, "componentType": 5126, "count": 49, "max": [ 0.0009999829344451428, 3.725289943190546e-8, 0.1454170048236847 ], "min": [ 0.0009999759495258332, -4.470349779239769e-8, 0.14541690051555634 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 784, "componentType": 5126, "count": 49, "max": [ -0.7105135917663574, 0.008397356607019902, 0.000531485362444073, -0.6789330840110779 ], "min": [ -0.7337970733642578, -0.011321297846734524, -0.02596380189061165, -0.703567624092102 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 1764, "componentType": 5126, "count": 49, "max": [ 1.0000003576278689, 1.0000004768371585, 0.999999701976776 ], "min": [ 1.0, 1.0000001192092896, 0.9999992847442628 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 392, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ 0.0, 0.25051671266555788, 0.0 ], "min": [ 0.0, 0.25051671266555788, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 1568, "componentType": 5126, "count": 49, "max": [ 0.6358352899551392, 0.06165437772870064, -0.00338419945910573, -0.7642753720283508 ], "min": [ 0.6224426627159119, -0.1380288153886795, -0.06534028053283692, -0.782635509967804 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 2940, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000007152557374, 0.999999701976776 ], "min": [ 0.9999998211860656, 1.0000003576278689, 0.9999992847442628 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 588, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 3528, "componentType": 5126, "count": 49, "max": [ 2.1420399676230774e-8, 8.940700269022274e-8, 0.064838707447052 ], "min": [ -1.5832499755674694e-8, 2.98022992950564e-8, 0.06483834981918335 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ -0.6325308680534363, 0.024829493835568429, 0.04200226813554764, -0.7498575448989868 ], "min": [ -0.6592774987220764, -0.03641732409596443, -0.03000717982649803, -0.7735550999641419 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 4116, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 0.9999998807907105, 1.0 ], "min": [ 0.9999998211860656, 0.9999995231628418, 0.999999701976776 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 784, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 4704, "componentType": 5126, "count": 49, "max": [ 7.450579708745408e-9, 0.0520397387444973, 0.0 ], "min": [ 7.450579708745408e-9, 0.0520397387444973, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 3136, "componentType": 5126, "count": 49, "max": [ 0.04680429771542549, 0.9995073676109314, -0.018450811505317689, 0.002033286727964878 ], "min": [ -0.09362706542015076, 0.995067298412323, -0.09058911353349686, -0.0025854958221316339 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 5292, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.0000001192092896, 1.0000004768371585 ], "min": [ 0.999999701976776, 0.9999998211860656, 1.0000001192092896 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 980, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 5880, "componentType": 5126, "count": 49, "max": [ 0.08800014853477478, 0.000014096500308369288, -0.00005573029920924455 ], "min": [ 0.08799994736909867, 0.000013977300113765525, -0.00005596880146185868 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 3920, "componentType": 5126, "count": 49, "max": [ 0.7787204384803772, 0.6963526606559753, -0.2913321256637573, -0.12775331735610966 ], "min": [ 0.41440603137016299, 0.2682091891765595, -0.6041955351829529, -0.508333683013916 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 6468, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1.0000001192092896, 1.0000004768371585 ], "min": [ 1.0, 0.9999995827674866, 1.0000001192092896 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1176, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 7056, "componentType": 5126, "count": 49, "max": [ 0.0, 0.24200910329818729, 0.0 ], "min": [ 0.0, 0.24200910329818729, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 4704, "componentType": 5126, "count": 49, "max": [ 0.005276965908706188, -0.10532382130622864, -0.0563904233276844, -0.9007523059844972 ], "min": [ -0.08755125105381012, -0.15304648876190186, -0.4198120832443238, -0.989989936351776 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 7644, "componentType": 5126, "count": 49, "max": [ 0.9999999403953552, 0.9999998807907105, 0.9999998807907105 ], "min": [ 0.9999994039535524, 0.9999992847442628, 0.9999995231628418 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1372, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 8232, "componentType": 5126, "count": 49, "max": [ -2.98022992950564e-8, 0.18779130280017854, 0.0 ], "min": [ -2.98022992950564e-8, 0.18779130280017854, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 5488, "componentType": 5126, "count": 49, "max": [ 0.04831664264202118, -0.03682959079742432, 0.1515040546655655, -0.9875762462615968 ], "min": [ -0.01958325318992138, -0.043389420956373218, -0.0806758776307106, -0.9989553689956664 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 8820, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.0000009536743165, 1.0000005960464478 ], "min": [ 0.999999701976776, 1.0000005960464478, 1.000000238418579 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1568, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 9408, "componentType": 5126, "count": 49, "max": [ -0.0879998505115509, 0.00006264450348680839, -0.00006240609945962206 ], "min": [ -0.0880001038312912, 0.00006249549915082753, -0.00006282330286921933 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 6272, "componentType": 5126, "count": 49, "max": [ 0.6748494505882263, 0.3152157068252564, -0.300369679927826, -0.3483264744281769 ], "min": [ 0.3661315143108368, 0.09874838590621948, -0.6449660658836365, -0.8451733589172363 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 9996, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000001192092896, 1.0 ], "min": [ 0.9999997615814208, 0.9999996423721314, 0.999999701976776 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1764, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 10584, "componentType": 5126, "count": 49, "max": [ 0.0, 0.24200810492038728, 0.0 ], "min": [ 0.0, 0.24200810492038728, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 7056, "componentType": 5126, "count": 49, "max": [ -0.003387797623872757, 0.9475951790809633, -0.0798693522810936, -0.3012830018997193 ], "min": [ -0.12710869312286378, 0.916045308113098, -0.2270231395959854, -0.3146948218345642 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 11172, "componentType": 5126, "count": 49, "max": [ 1.0000003576278689, 0.9999998807907105, 1.0000001192092896 ], "min": [ 0.9999999403953552, 0.9999995827674866, 0.9999997615814208 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 1960, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 11760, "componentType": 5126, "count": 49, "max": [ 0.0, 0.187792107462883, 0.0 ], "min": [ 0.0, 0.187792107462883, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 7840, "componentType": 5126, "count": 49, "max": [ 0.15000686049461366, 0.26206517219543459, 0.06808223575353623, -0.9487173557281494 ], "min": [ -0.0010455237934365869, 0.25685790181159975, -0.10152826458215714, -0.9656248688697816 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 12348, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000009536743165, 1.0 ], "min": [ 0.9999996423721314, 1.0000003576278689, 0.9999995231628418 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2156, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 12936, "componentType": 5126, "count": 49, "max": [ 0.06761906296014786, -0.02851865068078041, -0.06296355277299881 ], "min": [ 0.0676189586520195, -0.028518760576844217, -0.06296365708112717 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 8624, "componentType": 5126, "count": 49, "max": [ 0.301033079624176, -0.20796972513198853, 0.92630273103714, -0.08994945138692856 ], "min": [ 0.1658332496881485, -0.7997090816497803, 0.4959096908569336, -0.3118112981319428 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 13524, "componentType": 5126, "count": 49, "max": [ 1.0000008344650269, 1.0, 0.9999999403953552 ], "min": [ 1.0000003576278689, 0.9999995231628418, 0.9999996423721314 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2352, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 14112, "componentType": 5126, "count": 49, "max": [ -1.4901200273698124e-8, 0.26611289381980898, 0.0 ], "min": [ -1.4901200273698124e-8, 0.26611289381980898, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 9408, "componentType": 5126, "count": 49, "max": [ 0.8112500905990601, -0.1822210103273392, 0.032220568507909778, -0.4743982553482056 ], "min": [ -0.03036016784608364, -0.3419179916381836, -0.289162427186966, -0.9452491998672484 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 14700, "componentType": 5126, "count": 49, "max": [ 0.9999994039535524, 1.000000238418579, 1.000000238418579 ], "min": [ 0.9999989867210388, 0.9999996423721314, 0.9999994039535524 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2548, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 15288, "componentType": 5126, "count": 49, "max": [ 0.0, 0.2758241891860962, 0.0 ], "min": [ 0.0, 0.2758241891860962, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 10192, "componentType": 5126, "count": 49, "max": [ 0.9907974004745485, -0.0014961245469748974, 0.02489613927900791, -0.13506969809532166 ], "min": [ 0.8542653918266296, -0.05430477112531662, -0.00011262076441198587, -0.5192484259605408 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 15876, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1.0000004768371585, 1.0000004768371585 ], "min": [ 1.000000238418579, 1.0, 1.0000001192092896 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2744, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 16464, "componentType": 5126, "count": 49, "max": [ -0.0023464488331228496, -0.06617332249879837, 0.02785664983093739 ], "min": [ -0.002346470952033997, -0.06617333739995957, 0.02785659022629261 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 10976, "componentType": 5126, "count": 49, "max": [ 0.02062430046498776, -0.23465925455093385, 0.9716955423355104, 0.0638260766863823 ], "min": [ 0.003326366888359189, -0.5406339168548584, 0.8410344123840332, 0.016216862946748738 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 17052, "componentType": 5126, "count": 49, "max": [ 1.0000001192092896, 1.0000009536743165, 1.0000005960464478 ], "min": [ 0.9999998211860656, 1.000000238418579, 0.9999998211860656 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 2940, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 17640, "componentType": 5126, "count": 49, "max": [ -0.06845708936452866, -0.028570100665092469, -0.062949538230896 ], "min": [ -0.06845712661743164, -0.02857035957276821, -0.06294971704483032 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 11760, "componentType": 5126, "count": 49, "max": [ -0.018168065696954728, -0.18232035636901856, 0.9812799096107484, 0.117560513317585 ], "min": [ -0.07457219809293747, -0.902503490447998, 0.413051187992096, 0.03284534439444542 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 18228, "componentType": 5126, "count": 49, "max": [ 1.000000238418579, 1.000000238418579, 1.0000003576278689 ], "min": [ 0.9999998211860656, 0.9999995827674866, 0.9999996423721314 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 3136, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 18816, "componentType": 5126, "count": 49, "max": [ -1.1175900205273593e-8, 0.2661114931106568, 0.0 ], "min": [ -1.1175900205273593e-8, 0.2661114931106568, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 12544, "componentType": 5126, "count": 49, "max": [ 0.8507033586502075, 0.14946134388446809, 0.04984176158905029, -0.5191445350646973 ], "min": [ -0.06756377220153809, 0.06949601322412491, -0.026268262416124345, -0.9922308921813964 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 19404, "componentType": 5126, "count": 49, "max": [ 1.0000005960464478, 1.0000003576278689, 1.0000005960464478 ], "min": [ 1.0000001192092896, 0.9999995231628418, 0.9999998211860656 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 3332, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 19992, "componentType": 5126, "count": 49, "max": [ 0.0, 0.2758249044418335, 0.0 ], "min": [ 0.0, 0.2758249044418335, 0.0 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 13328, "componentType": 5126, "count": 49, "max": [ 0.99649316072464, -0.01710231974720955, -0.022676724940538408, -0.07459255307912827 ], "min": [ 0.8792483806610107, -0.04609288275241852, -0.06820148974657059, -0.4750169813632965 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 20580, "componentType": 5126, "count": 49, "max": [ 0.9999995827674866, 1.0, 1.0000003576278689 ], "min": [ 0.999999225139618, 0.9999995231628418, 1.0 ], "type": "VEC3" }, { "bufferView": 4, "byteOffset": 3528, "componentType": 5126, "count": 49, "max": [ 2.0 ], "min": [ 0.0 ], "type": "SCALAR" }, { "bufferView": 5, "byteOffset": 21168, "componentType": 5126, "count": 49, "max": [ -0.0014585109893232585, -0.06619886308908463, 0.02785670943558216 ], "min": [ -0.0014585329918190837, -0.06619889289140701, 0.02785668894648552 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 14112, "componentType": 5126, "count": 49, "max": [ -0.00960757862776518, -0.2635453343391419, 0.9620476961135864, 0.06995902955532074 ], "min": [ -0.04577624797821045, -0.4899238646030426, 0.8689604997634888, -0.06424159556627274 ], "type": "VEC4" }, { "bufferView": 5, "byteOffset": 21756, "componentType": 5126, "count": 49, "max": [ 0.9999996423721314, 1.0000003576278689, 0.9999998807907105 ], "min": [ 0.9999991655349731, 0.9999997615814208, 0.9999994039535524 ], "type": "VEC3" }, { "bufferView": 7, "byteOffset": 0, "componentType": 5126, "count": 19, "max": [ 0.780990481376648, 0.9918341040611268, 0.9992613196372986, 0.0, 1.0, 0.8904604315757752, 0.6854007244110107, 0.0, 0.79917311668396, 0.9999359250068665, 0.997134804725647, 0.0, 0.20702040195465089, 0.5989438891410828, 1.001250982284546, 1.0 ], "min": [ -0.9985063076019288, -0.9971349835395812, -0.9999359250068665, 0.0, -1.0, -0.8904621005058289, -0.4517692029476166, 0.0, -0.18484599888324736, -0.9853218197822572, -0.997802197933197, 0.0, -0.811928927898407, -1.18982994556427, -1.058609962463379, 1.0 ], "type": "MAT4" } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0 }, "emissiveFactor": [ 0.0, 0.0, 0.0 ], "name": "Cesium_Man-effect" } ], "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "uri": "data:image/jpeg;base64,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AEdybiBkb3ViQG/gAAAAAAAAAAAAQmwgIGRvdWJAb+AAAAAAAAAAAABCcmRUVW50RiNSbHQAAAAAAAAAAAAAAABCbGQgVW50RiNSbHQAAAAAAAAAAAAAAABSc2x0VW50RiNQeGxAcsAAAAAAAAAAAAp2ZWN0b3JEYXRhYm9vbAEAAAAAUGdQc2VudW0AAAAAUGdQcwAAAABQZ1BDAAAAAExlZnRVbnRGI1JsdAAAAAAAAAAAAAAAAFRvcCBVbnRGI1JsdAAAAAAAAAAAAAAAAFNjbCBVbnRGI1ByY0BZAAAAAAAAOEJJTQPtAAAAAAAQASwAAAABAAEBLAAAAAEAAThCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQPyAAAAAAAKAAD///////8AADhCSU0EDQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAAAAACAAE4QklNBAIAAAAAAAYAAAAAAAA4QklNBDAAAAAAAAMBAQEAOEJJTQQtAAAAAAAGAAEAAAAHOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA0kAAAAGAAAAAAAAAAAAAAQAAAAEAAAAAAoAQwBlAHMAaQB1AG0AXwBNAGEAbgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAA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IHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgeG1wOkNyZWF0ZURhdGU9IjIwMTQtMDItMThUMTc6MDI6MTEtMDU6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE0LTAyLTE5VDE1OjE4OjEwLTA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE0LTAyLTE5VDE1OjE4OjEwLTA1OjAwIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTcxQzBBRjRBMjk5RTMxMUJCQ0RDNzdBMkI5NjZCNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjNDNDA2RDBFMTk4RTMxMUEzRTVENjc4RUNDRDhGQkQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2M0M0MDZEMEUxOThFMzExQTNFNUQ2NzhFQ0NEOEZCRCI+IDxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDxyZGY6QmFnPiA8cmRmOmxpPnhtcC5kaWQ6NjFDNDA2RDBFMTk4RTMxMUEzRTVENjc4RUNDRDhGQkQ8L3JkZjpsaT4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2M0M0MDZEMEUxOThFMzExQTNFNUQ2NzhFQ0NEOEZCRCIgc3RFdnQ6d2hlbj0iMjAxNC0wMi0xOFQxNzowMjoxMS0wNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvcG5nIHRvIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY0QzQwNkQwRTE5OEUzMTFBM0U1RDY3OEVDQ0Q4RkJEIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE4VDE3OjA3OjU0LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY1QzQwNkQwRTE5OEUzMTFBM0U1RDY3OEVDQ0Q4RkJEIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE4VDE3OjA5OjA3LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY2QzQwNkQwRTE5OEUzMTFBM0U1RDY3OEVDQ0Q4RkJEIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE4VDE3OjIwOjA5LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY3QzQwNkQwRTE5OEUzMTFBM0U1RDY3OEVDQ0Q4RkJEIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE4VDE3OjIwOjIzLTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE2MUMwQUY0QTI5OUUzMTFCQkNEQzc3QTJCOTY2QjZFIiBzdEV2dDp3aGVuPSIyMDE0LTAyLTE5VDE1OjE4OjEwLTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MTcxQzBBRjRBMjk5RTMxMUJCQ0RDNzdBMkI5NjZCNkUiIHN0RXZ0OndoZW49IjIwMTQtMDItMTlUMTU6MTg6MTAtMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTYxQzBBRjRBMjk5RTMxMUJCQ0RDNzdBMkI5NjZCNkUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjNDNDA2RDBFMTk4RTMxMUEzRTVENjc4RUNDRDhGQkQiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2M0M0MDZEMEUxOThFMzExQTNFNUQ2NzhFQ0NEOEZCRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg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" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9986, "wrapS": 10497, "wrapT": 10497 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 225468, "byteLength": 28032, "target": 34963 }, { "buffer": 0, "byteOffset": 169376, "byteLength": 52368, "byteStride": 8, "target": 34962 }, { "buffer": 0, "byteOffset": 90824, "byteLength": 78552, "byteStride": 12, "target": 34962 }, { "buffer": 0, "byteOffset": 16112, "byteLength": 52368, "byteStride": 16, "target": 34962 }, { "buffer": 0, "byteOffset": 221744, "byteLength": 3724 }, { "buffer": 0, "byteOffset": 68480, "byteLength": 22344 }, { "buffer": 0, "byteOffset": 1216, "byteLength": 14896 }, { "buffer": 0, "byteOffset": 0, "byteLength": 1216 } ], "buffers": [ { "byteLength": 253500, "uri": "data:application/octet-stream;base64,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AQCAPwAAgD8AAIA/AACAPwAAgD8AAIA/AgCAP///fz///38/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP/7/fz/9/38/AgCAPwAAgD8AAIA/AQCAP/3/fz8AAIA/AgCAP/z/fz8BAIA/AgCAP///fz8AAIA/AgCAP/7/fz8BAIA/AQCAP///fz/+/38/AACAPwEAgD8BAIA/AQCAP/3/fz8AAIA/AgCAP/3/fz8AAIA/AQCAP///fz8AAIA/AQCAP///fz8AAIA/AQCAP/7/fz8AAIA/AQCAPwAAgD8AAIA/AACAPwAAgD8AAIA/AQCAP/7/fz8AAIA/AQCAPwEAgD8AAIA/AwCAP///fz///38/AgCAP///fz8BAIA/AgCAP///fz8AAIA/AACAPwEAgD8AAIA/AACAPwAAgD8BAIA/AQCAPwEAgD8AAIA/AQCAPwAAgD///38/AQCAPwEAgD/DEYM68///MivoFD7DEYM66P+/MjLoFD7DEYM6AAAAACvoFD7DEYM66P+/sjLoFD7DEYM68///sivoFD7DEYM6/v//MTLoFD7DEYM6FgCAsivoFD7DEYM6/v//sTLoFD7DEYM68///sivoFD7DEYM6AAAAACvoFD7DEYM68///sivoFD7DEYM6FgCAsivoFD7DEYM6BABAsyvoFD7DEYM66P+/sivoFD7DEYM6AAAAACvoFD7DEYM6FgCAsivoFD7DEYM6/v//MTLoFD7DEYM6FgCAsivoFD7DEYM6/v//MTLoFD7DEYM6/v//MTLoFD7DEYM6/v//MTLoFD7DEYM6//8fsyvoFD7DEYM6FgCAsivoFD7DEYM6FgCAsivoFD7DEYM6//8fMzLoFD7DEYM6/v//MSvoFD7DEYM6AAAAACvoFD7DEYM6/v//MTLoFD7DEYM66P+/sjLoFD7DEYM68///sivoFD7DEYM6AAAAACvoFD7DEYM6/v//MTLoFD7DEYM6FgCAMivoFD7DEYM6AAAAACvoFD7DEYM66P+/sivoFD6gEYM68///MivoFD7cEYM6FgCAsivoFD7cEYM6//8fsyvoFD7DEYM6/v//MTLoFD7DEYM6GwCgMjLoFD7UEYM6AAAAACvoFD6xEYM6AAAAACvoFD6xEYM6AAAAACvoFD7DEYM66P+/sjLoFD7DEYM6//8fsyvoFD7DEYM66P+/MjLoFD7DEYM6/v//MTLoFD7DEYM66P+/sjLoFD7DEYM68///MivoFD4BAIA/AgCAP/b/fz8CAIA/AgCAP/j/fz8CAIA/AgCAP/X/fz8BAIA/AgCAP/f/fz8BAIA/AQCAP/f/fz8CAIA/AgCAP/f/fz8BAIA/AQCAP/f/fz8CAIA/AgCAP/f/fz8CAIA/AQCAP/X/fz8CAIA/AQCAP/b/fz8BAIA/AgCAP/f/fz8BAIA/AwCAP/f/fz8BAIA/AgCAP/j/fz8CAIA/AwCAP/r/fz8BAIA/AgCAP/b/fz8AAIA/AgCAP/b/fz8CAIA/AgCAP/f/fz8CAIA/AwCAP/j/fz8AAIA/AgCAP/T/fz8CAIA/AgCAP/b/fz8CAIA/AgCAP/n/fz8CAIA/AgCAP/f/fz8BAIA/AwCAP/f/fz8AAIA/AgCAP/j/fz8BAIA/AgCAP/T/fz8CAIA/AwCAP/f/fz8BAIA/AgCAP/b/fz8CAIA/AQCAP/X/fz8CAIA/AgCAP/v/fz8CAIA/AQCAP/X/fz8CAIA/AwCAP/f/fz8DAIA/AgCAP/j/fz8BAIA/AwCAP/b/fz8CAIA/BACAP/v/fz8CAIA/AQCAP/r/fz8CAIA/AgCAP/n/fz8BAIA/AgCAP/n/fz8CAIA/AgCAP/T/fz8CAIA/AQCAP/T/fz8AAIA/AgCAP/b/fz8AAIA/AgCAP/j/fz8BAIA/AQCAP/X/fz8AAIA/AQCAP/f/fz8BAIA/AgCAP/f/fz8BAIA/BACAP/X/fz8CAIA/AgCAP/T/fz8CAIA/AwCAP/f/fz8BAIA/AQCAP/b/fz8BAIA/AgCAP/b/fz8AAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAAAAAAAukOAPgAAAAD//38/BACAP/n/fz8AAIA/BgCAP/b/fz///38/BACAP/f/fz///38/BQCAP/b/fz8AAIA/BACAP/b/fz///38/BACAP/f/fz///38/BACAP/b/fz/9/38/AwCAP/X/fz/9/38/BACAP/T/fz8AAIA/BACAP/j/fz8AAIA/BACAP/j/fz///38/BACAP/b/fz/+/38/BQCAP/f/fz8BAIA/BgCAP/X/fz8AAIA/AwCAP/X/fz/+/38/BACAP/j/fz8AAIA/BQCAP/f/fz///38/AwCAP/X/fz/+/38/BACAP/f/fz8BAIA/BACAP/n/fz8AAIA/BACAP/f/fz8AAIA/BACAP/X/fz///38/BQCAP/b/fz8BAIA/AwCAP/j/fz8BAIA/BQCAP/n/fz///38/BQCAP/r/fz/+/38/BQCAP/j/fz///38/BQCAP/f/fz///38/AwCAP/b/fz///38/BQCAP/X/fz8AAIA/AwCAP/n/fz/+/38/BQCAP/n/fz/9/38/BACAP/b/fz8AAIA/BQCAP/X/fz/+/38/BQCAP/j/fz///38/BQCAP/f/fz///38/BACAP/f/fz/+/38/BQCAP/T/fz///38/BQCAP/X/fz/9/38/BgCAP/f/fz///38/AwCAP/b/fz8AAIA/BACAP/j/fz/+/38/BQCAP/T/fz/+/38/BQCAP/n/fz///38/BQCAP/X/fz/+/38/BgCAP/j/fz8AAIA/BgCAP/j/fz/+/38/BACAP/v/fz///38/BACAP/n/fz8EAICw8///MhjKhD0JAIiy8/9/MxjKhD38/w+y8/9/MxjKhD0EAICw8/9/MxjKhD35/5+x8/9/MxjKhD0KAECx8///MhjKhD0EAIAw8///MvjJhD0EAICw8/9/MxjKhD0EAOAx8///MhjKhD3+//8x8/9/MwjKhD0EAICw8///MhjKhD31/7cy8/9/MxjKhD3+//8x8/9/MwjKhD0EAOAx8/9/MxjKhD3U/28y8/9/MxjKhD0EAICw8/9/MxjKhD0AAAAA8///MgjKhD0EAICw8/9/MxjKhD3+/3+x8///MgjKhD0WAAAxBQDAMyjKhD0EAIAw8/9/MxjKhD0AAAAA8///MgjKhD0AAAAA8///MgjKhD0WAACx8///MgjKhD0WAACx8///MgjKhD0EAICw8/9/MxjKhD0EAIAw8/9/MxjKhD0WAAAxBQDAMyjKhD3+//8x8///MgjKhD3+//8x8///MgjKhD0EAOAx8/9/MxjKhD0KAMAxBQDAMyjKhD0EAOAx8/9/MxjKhD3+//8x8///MgjKhD0WAACxBQDAMyjKhD0EAICw8///MhjKhD0EAICw8/9/MxjKhD0EAIAw8/9/MxjKhD0AAAAA8///MgjKhD0AAAAA8/9/MwjKhD3+/3+x8///MgjKhD35/5+x8/9/MxjKhD35/5+x8///MhjKhD3+//+x8///MgjKhD3+//+x8///MgjKhD0AAAAA8/9/MwjKhD3+//+x8/9/MwjKhD0EAICw8/9/MxjKhD0EAICw8///MhjKhD0AAIA/+/9/P/v/fz8BAIA/+/9/P/3/fz///38//P9/P///fz/+/38/+/9/P/7/fz///38//P9/P/7/fz8AAIA/+/9/P/7/fz8AAIA/+v9/P/z/fz///38//f9/P/3/fz///38/+/9/P/v/fz8AAIA//P9/P/3/fz///38//v9/P/7/fz8AAIA//v9/PwAAgD8AAIA/+/9/P///fz8BAIA/+v9/P/3/fz8AAIA//f9/P/3/fz8CAIA/+/9/P/7/fz8AAIA//f9/P/v/fz///38//P9/P///fz8AAIA/+v9/PwAAgD8AAIA/+/9/P///fz8AAIA//f9/P/z/fz///38//f9/P/7/fz8AAIA/+/9/P/3/fz8AAIA//v9/PwAAgD8AAIA/+f9/P/7/fz8AAIA//f9/P/3/fz8AAIA/+f9/P/3/fz8AAIA//f9/P/3/fz8AAIA/+/9/P///fz///38//P9/P/7/fz8AAIA//P9/P/7/fz8BAIA/+/9/P///fz///38//f9/P/7/fz8BAIA//v9/P/v/fz///38//f9/P/v/fz8AAIA//P9/P/3/fz///38//P9/P/7/fz/9/38//P9/P/v/fz/+/38//P9/P/3/fz///38/+/9/P/7/fz8AAIA//P9/P/z/fz8BAIA//P9/P/7/fz///38/+v9/P///fz8AAIA//v9/P/7/fz///38/+P9/P/7/fz8AAIA/+/9/P/z/fz8BAIA/+/9/P/7/fz8AAIA//P9/PwAAgD8AAIA/+/9/P/v/fz/+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAD+//8xnydVPQAAAAABAIA/AACAPwMAgD8AAIA/AACAPwMAgD/+/38//f9/PwMAgD/+/38///9/PwMAgD///38/AACAPwQAgD///38///9/PwMAgD8AAIA/AACAPwMAgD8AAIA//f9/PwMAgD8CAIA//v9/PwMAgD8AAIA//f9/PwMAgD///38//f9/PwMAgD8AAIA/AACAPwQAgD/9/38/AQCAPwMAgD8BAIA/AACAPwIAgD///38//v9/PwQAgD/7/38//f9/PwQAgD///38///9/PwMAgD/+/38/AACAPwIAgD/8/38/AACAPwIAgD/+/38///9/PwMAgD8AAIA/AACAPwIAgD8AAIA/AQCAPwIAgD8AAIA/AQCAPwMAgD8AAIA/AQCAPwQAgD8AAIA///9/PwQAgD8BAIA///9/PwIAgD8BAIA///9/PwMAgD8AAIA///9/PwMAgD///38/AACAPwMAgD8BAIA/AACAPwQAgD///38/AQCAPwMAgD///38///9/PwIAgD///38/AACAPwMAgD8AAIA//v9/PwIAgD/+/38/AQCAPwQAgD///38/AACAPwQAgD8BAIA/AACAPwMAgD///38///9/PwIAgD8CAIA/AACAPwQAgD///38//f9/PwQAgD8AAIA///9/PwMAgD///38/AQCAPwMAgD8BAIA/AACAPwMAgD8AAIA/AACAPwIAgD8BAIA/AACAPwIAgD8AAIA/AACAPwQAgD///38//f9/PwIAgD8AAIA//v9/PwEAgD8BAIA/AACAPwMAgD9dObQ9B4BrNw1AarhkObQ9CgBrNw1AarhdObQ9BABsNw1AarhVObQ9BABsNw1AarhkObQ9BABsNw1AarhkObQ9BABsNw1AarhdObQ9B4BrNw1AarhkObQ9BABsNw1AarhkObQ9B4BrNw1AarhhObQ9B4BrNw1AarhhObQ9B4BrNw1AarhVObQ9B4BrNw1AarhdObQ9B4BrNw1AarhoObQ9B4BrNw1AarhhObQ9CgBrNw1AarhVObQ9B4BrNw1AarhhObQ9CgBrNwvAarhhObQ9DIBqNwvAarhhObQ9BABsNw1AarhhObQ9BABsNw1AarhdObQ9B4BrNw1AarhhObQ9BABsNw1AarhkObQ9BABsNw1AarhdObQ9B4BrNw1AarhdObQ9B4BrNw1AarhdObQ9B4BrNw1AarhhObQ9B4BrNw1AarhhObQ9B4BrNw1AarhhObQ9B4BrNw1AarhVObQ9B4BrNw1AarhkObQ9BABsN/S/abhhObQ9B4BrNw1AarhRObQ9BABsNw1AarhoObQ9B4BrNw1AarhoObQ9CgBrNwvAarhRObQ9B4BrNw1AarhhObQ9B4BrNw1AarhsObQ9CgBrNwvAarhRObQ9BABsN/S/abhoObQ9BABsN/S/abhVObQ9BABsNw1AarhZObQ9AoBsN/S/abhhObQ9CgBrNwvAarhkObQ9BABsNw1AarhVObQ9BABsNw1AarhoObQ9BABsNw1AarhoObQ9AoBsNw1AarhkObQ9B4BrNw1AarhdObQ9B4BrNw1AargDAIA//P9/PwEAgD8EAIA//P9/PwEAgD8DAIA//f9/PwMAgD8DAIA//v9/PwIAgD8EAIA//f9/PwMAgD8DAIA//v9/PwIAgD8CAIA//f9/PwEAgD8DAIA//v9/PwIAgD8DAIA//f9/PwIAgD8AAIA/AACAPwIAgD8CAIA/AACAPwIAgD8BAIA//P9/PwIAgD8BAIA/AACAPwIAgD8BAIA//v9/PwMAgD8BAIA//v9/PwIAgD8CAIA/AACAPwIAgD8CAIA//v9/PwMAgD8BAIA/AQCAPwMAgD8DAIA/AACAPwMAgD8BAIA/AACAPwIAgD8CAIA//v9/PwIAgD8CAIA/AACAPwMAgD8CAIA//v9/PwIAgD8BAIA/AACAPwMAgD8BAIA/AACAPwIAgD8AAIA/AACAPwIAgD8CAIA/AACAPwEAgD8BAIA/AACAPwIAgD8CAIA///9/PwEAgD8CAIA//v9/PwMAgD8DAIA//v9/PwMAgD8EAIA//f9/PwIAgD8EAIA//P9/PwQAgD8DAIA//v9/PwIAgD8EAIA///9/PwMAgD8BAIA/+/9/PwEAgD8DAIA//f9/PwMAgD8DAIA//v9/PwEAgD8DAIA//P9/PwMAgD8FAIA/+/9/PwEAgD8DAIA//P9/PwIAgD8DAIA//f9/PwIAgD8EAIA/+/9/PwMAgD8EAIA/+/9/PwMAgD8EAIA/+f9/PwIAgD8FAIA//v9/PwEAgD8EAIA//f9/PwEAgD8DAIA//P9/PwMAgD8DAIA//P9/PwEAgD8AAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAAAAAAAPNF3PgAAAAD2/38/+v9/P/z/fz/5/38//f9/P/7/fz/2/38/+v9/P/3/fz/5/38//f9/P/z/fz/7/38/+v9/P/3/fz/5/38/+v9/P/v/fz/6/38/+/9/P/3/fz/6/38/+P9/P/3/fz/7/38/+f9/P/z/fz/+/38/9f9/P/z/fz///38/+P9/P/r/fz///38/9v9/P/n/fz/+/38/9P9/P/v/fz/8/38/+P9/P/v/fz/9/38/9v9/P/v/fz/9/38/+P9/P/z/fz/9/38/+P9/P/v/fz/5/38/+f9/P/3/fz/9/38/+/9/P/z/fz/7/38/+P9/P/z/fz/7/38/+v9/P/r/fz/5/38/+v9/P/z/fz/3/38/9/9/P/v/fz/7/38/+/9/P/v/fz/6/38//P9/P/r/fz/5/38//v9/P/z/fz/5/38/+v9/P/z/fz/7/38//P9/P/v/fz/5/38//P9/P/7/fz/4/38//P9/P/v/fz/5/38/+/9/P/j/fz/6/38//P9/P/z/fz/5/38//P9/P/n/fz/6/38//v9/P/r/fz/4/38/+/9/P/r/fz/5/38//P9/P/3/fz/6/38/+v9/P/3/fz/6/38//f9/P/7/fz/8/38/+/9/P/3/fz/5/38//P9/P/v/fz/7/38/+/9/P/r/fz/6/38//P9/P/r/fz/5/38//v9/P/z/fz/4/38//P9/P/v/fz/7/38/+f9/P/3/fz/5/38/+/9/P/7/fz/5/38/+P9/P/z/fz/4/38/+v9/P/v/fz/2/38/+v9/P/z/fz/z//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAADz//+yXUxAPgAAAAAAAIA/BgCAPwQAgD8AAIA/BgCAPwQAgD8AAIA/BgCAPwQAgD8AAIA/BgCAPwUAgD8AAIA/BgCAPwUAgD8AAIA/BgCAPwUAgD8AAIA/BgCAPwUAgD/8/38/BgCAPwMAgD8BAIA/BgCAPwMAgD///38/BgCAPwQAgD8BAIA/BwCAPwMAgD8BAIA/BwCAPwUAgD8AAIA/BgCAPwUAgD8AAIA/BgCAPwMAgD8CAIA/BwCAPwMAgD8AAIA/BwCAPwQAgD/8/38/BwCAPwQAgD/+/38/BwCAPwQAgD/+/38/BgCAPwMAgD/+/38/BgCAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD8AAIA/CACAPwMAgD/9/38/CACAPwMAgD/9/38/CACAPwMAgD/9/38/CACAPwMAgD8BAIA/BwCAPwMAgD8AAIA/BwCAPwUAgD/+/38/CACAPwQAgD///38/BwCAPwUAgD/9/38/BwCAPwQAgD/7/38/BQCAPwQAgD/+/38/CACAPwUAgD8AAIA/BwCAPwMAgD///38/BwCAPwUAgD/+/38/BwCAPwMAgD///38/BwCAPwQAgD/8/38/BwCAPwUAgD/8/38/BgCAPwMAgD///38/BgCAPwQAgD8AAIA/BwCAPwQAgD8AAIA/BgCAPwUAgD8BAIA/BgCAPwIAgD8AAIA/BgCAPwQAgD9dObS9A1CDOANAg7hZObS9BDCDOAKAg7hcObS9A1CDOANAg7hQObS9BCCDOAGgg7hVObS9BDCDOANgg7hZObS9BDCDOANgg7hZObS9BDCDOAKAg7hZObS9A1CDOANAg7hRObS9BCCDOAGgg7hRObS9BCCDOAHAg7hVObS9BDCDOANgg7hZObS9A2CDOANAg7hZObS9BDCDOAKAg7hEObS9BCCDOANgg7hIObS9BBCDOAGgg7hcObS9A0CDOAKAg7hZObS9BDCDOAKAg7hQObS9A0CDOAQgg7hVObS9BDCDOANgg7hVObS9A1CDOANAg7hRObS9BDCDOANgg7hVObS9BCCDOANgg7hgObS9A1CDOANAg7hVObS9BCCDOAGgg7hdObS9BDCDOAKAg7hRObS9BBCDOAGgg7hRObS9BCCDOAGgg7hdObS9A1CDOAQgg7hPObS9BDCDOAKAg7hZObS9BDCDOAKAg7hQObS9BDCDOANgg7hRObS9BCCDOAGgg7hVObS9BCCDOAGgg7hVObS9BDCDOAKAg7hdObS9A1CDOAQgg7hdObS9A2CDOAXggrhZObS9A1CDOANAg7hRObS9BDCDOAKAg7hRObS9BCCDOAGgg7hkObS9A1CDOAKAg7hPObS9BDCDOANgg7hMObS9BDCDOANgg7hcObS9A0CDOAKAg7hVObS9BCCDOANgg7hcObS9A0CDOAKAg7hVObS9BDCDOANgg7hZObS9BDCDOAKAg7hmObS9A2CDOANAg7hdObS9A1CDOANAg7j//38/AACAP///fz8AAIA/AQCAP///fz8AAIA//f9/P/3/fz8AAIA//v9/P/3/fz///38//f9/P/z/fz///38//f9/P/3/fz/9/38//f9/P/v/fz///38//P9/P/v/fz///38//P9/P/v/fz///38//P9/P/7/fz/+/38///9/P/3/fz///38//P9/P/3/fz8AAIA/+v9/P/7/fz8AAIA/AACAP/7/fz///38//f9/P/z/fz8AAIA//v9/P///fz///38//P9/P/z/fz/9/38//f9/P/7/fz///38//P9/P/7/fz8BAIA///9/P/7/fz8BAIA/+/9/P/7/fz///38//v9/P/3/fz8AAIA/AQCAPwAAgD8AAIA//v9/P/7/fz/+/38//v9/P/3/fz8BAIA//v9/P///fz8BAIA//v9/PwAAgD/8/38//f9/P/3/fz///38///9/P///fz///38//f9/PwAAgD8AAIA///9/PwAAgD///38/AACAP/7/fz8AAIA//P9/P///fz///38//f9/P/7/fz8AAIA//v9/P/3/fz/+/38/AACAP/3/fz///38/AACAP/7/fz/9/38//f9/P/z/fz/+/38/AACAP/7/fz/+/38//v9/P/3/fz/8/38/AQCAP/z/fz/+/38///9/P/7/fz///38//v9/P/3/fz///38//v9/P/3/fz/+/38///9/PwAAgD/9/38//v9/PwAAgD8AAIA//f9/P/7/fz8AAIA//P9/P/7/fz///38/AACAP///fz8AAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAAAAAAA+dB3PgAAAAACAIA//P9/P/7/fz8CAIA//v9/PwAAgD8AAIA/+/9/PwAAgD8BAIA/+/9/PwAAgD8BAIA/+/9/PwAAgD8CAIA/+/9/PwAAgD8CAIA//v9/PwEAgD8AAIA//P9/PwAAgD8BAIA//f9/P/7/fz8CAIA/+/9/P///fz8DAIA//P9/PwEAgD8CAIA//f9/P/7/fz8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA/+f9/PwAAgD8BAIA//P9/P/3/fz8CAIA/+/9/P/7/fz8CAIA/+v9/PwEAgD8CAIA//P9/PwAAgD8AAIA//P9/PwAAgD8BAIA//P9/PwEAgD8DAIA//f9/PwAAgD8CAIA/+/9/PwAAgD8CAIA/+/9/PwAAgD8BAIA/+/9/P///fz8CAIA/+/9/PwEAgD8BAIA/+/9/PwAAgD8CAIA//P9/P/3/fz8BAIA//v9/PwAAgD8BAIA//f9/PwAAgD8CAIA//P9/PwAAgD8BAIA//P9/P///fz8CAIA//v9/PwAAgD8CAIA/+/9/PwAAgD8BAIA//f9/PwAAgD8BAIA//f9/P/z/fz8CAIA/+v9/P///fz8BAIA//f9/PwAAgD///38//P9/PwAAgD8BAIA//P9/PwAAgD8AAIA//P9/P///fz8CAIA//v9/P///fz8CAIA//f9/PwAAgD8CAIA//P9/PwAAgD8CAIA//P9/P/7/fz8AAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAAAAAAAk0xAPgAAAAD6/38/BwCAP/z/fz/+/38/BgCAP/v/fz/6/38/BwCAP/z/fz/+/38/CACAPwAAgD/9/38/BgCAP/z/fz/+/38/BwCAP/z/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BgCAP/7/fz/8/38/BQCAP/z/fz///38/BACAP/3/fz/+/38/BwCAP///fz/9/38/BgCAP/z/fz/8/38/BQCAP/r/fz/+/38/BgCAP/r/fz/9/38/BQCAP/r/fz/8/38/BACAP/3/fz8BAIA/BACAP///fz/9/38/BQCAP/j/fz///38/BQCAP/z/fz///38/BACAP/r/fz///38/BACAP/r/fz///38/BACAP/r/fz///38/BACAP/r/fz/+/38/BACAP/v/fz/+/38/AwCAP/v/fz/+/38/AwCAP/v/fz/9/38/BQCAP/z/fz/8/38/BgCAP/z/fz8AAIA/BACAP/n/fz/8/38/BACAP/r/fz/+/38/BQCAP/3/fz8AAIA/BACAP/v/fz8BAIA/BQCAP/z/fz/+/38/BQCAP///fz/+/38/BgCAP/v/fz/+/38/BACAP/3/fz///38/BgCAP/3/fz///38/BQCAP/v/fz/8/38/BQCAP/z/fz/7/38/BQCAP/v/fz/9/38/BgCAP/n/fz/6/38/BQCAP/3/fz///38/BwCAP/n/fz/6/38/BwCAP/z/fz/Ve4o9HKDpvA/zgL3We4o9/J/pvAnzgL3de4o9LaDpvA/zgL3Xe4o9EqDpvA/zgL3be4o9HKDpvA/zgL3Ze4o9EqDpvA/zgL3Ze4o9DaDpvAnzgL3We4o9DaDpvA/zgL3Ve4o9F6DpvA/zgL3Ve4o9IqDpvBfzgL3Te4o98p/pvAnzgL3Ze4o9DaDpvAnzgL3Ve4o9EqDpvAnzgL3Se4o98p/pvA/zgL3Xe4o9B6DpvA/zgL3Ve4o9DaDpvA/zgL3Ve4o9DaDpvA/zgL3Ze4o9DaDpvAnzgL3Xe4o9AqDpvA/zgL3We4o9DaDpvA/zgL3We4o9DaDpvA/zgL3Xe4o9AqDpvAnzgL3Xe4o9HKDpvBfzgL3Ve4o9DaDpvA/zgL3Ve4o9B6DpvAnzgL3We4o9EqDpvA/zgL3Xe4o9DaDpvA/zgL3Xe4o9B6DpvA/zgL3Ze4o9B6DpvAnzgL3Xe4o9IqDpvA/zgL3Xe4o9EqDpvA/zgL3Se4o9/J/pvA/zgL3Se4o9/J/pvA/zgL3Ve4o9HKDpvA/zgL3We4o9B6DpvA/zgL3We4o9AqDpvA/zgL3We4o9/J/pvAnzgL3We4o9DaDpvBfzgL3Ve4o9F6DpvA/zgL3Se4o9B6DpvAnzgL3Ze4o9IqDpvA/zgL3Pe4o9B6DpvA/zgL3Xe4o9EqDpvA/zgL3Ve4o9B6DpvA/zgL3Ze4o9DaDpvA/zgL3Ze4o9DaDpvAnzgL3We4o9AqDpvA/zgL3Te4o9DaDpvA/zgL3Ve4o9HKDpvA/zgL0DAIA//v9/P/z/fz8EAIA//v9/P/z/fz8FAIA///9/P/3/fz8FAIA/+/9/P/3/fz8GAIA/+P9/P/7/fz8EAIA/+/9/P/7/fz8GAIA//P9/P/z/fz8FAIA/+v9/P/v/fz8GAIA/+/9/P/z/fz8FAIA/+/9/P/z/fz8GAIA//v9/P/v/fz8EAIA//v9/P/v/fz8EAIA///9/P/r/fz8EAIA//P9/P/v/fz8FAIA/AACAP/v/fz8FAIA//P9/P/z/fz8FAIA//f9/P/3/fz8GAIA/+/9/P/3/fz8HAIA/+/9/P/3/fz8FAIA//f9/P/z/fz8FAIA/+v9/P/v/fz8GAIA/+v9/P/3/fz8EAIA/+v9/P/3/fz8GAIA//f9/P/7/fz8EAIA/+/9/P/3/fz8FAIA/+/9/P/3/fz8GAIA/+/9/P/z/fz8FAIA/+/9/P///fz8FAIA/+/9/P/v/fz8EAIA/+f9/P/r/fz8FAIA/+f9/P/v/fz8GAIA/+/9/P/3/fz8FAIA//P9/P/z/fz8EAIA//f9/P/v/fz8FAIA/+v9/P/v/fz8EAIA//f9/P/v/fz8HAIA//P9/P/3/fz8EAIA//f9/P/z/fz8GAIA/+f9/P/v/fz8GAIA//v9/P/7/fz8EAIA/+f9/P/v/fz8GAIA//P9/P/r/fz8EAIA//v9/P/3/fz8FAIA///9/P/7/fz8HAIA///9/P/3/fz8FAIA/AACAP/z/fz8FAIA//P9/P/v/fz8FAIA//f9/P/r/fz8DAIA//v9/P/z/fz8WAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAAAWAICy8z+IPgAAAADx/38//v9/PwAAgD/y/38/+/9/PwAAgD/z/38//v9/P/7/fz/0/38//v9/PwIAgD/y/38///9/P/z/fz/z/38/AACAP/z/fz/x/38/AACAP/3/fz/z/38/AACAP/v/fz/x/38/AQCAP/b/fz/0/38/AgCAP/v/fz/y/38/AQCAP/3/fz/y/38/AACAP/v/fz/0/38/AACAP/3/fz/y/38/AACAP///fz/0/38///9/PwAAgD/0/38//v9/P///fz/y/38//v9/P///fz/1/38/+/9/PwAAgD/2/38///9/P///fz/1/38///9/P/v/fz/0/38/AACAPwAAgD/z/38///9/PwAAgD/1/38//f9/PwEAgD/y/38/+/9/PwEAgD/0/38//P9/P///fz/1/38//P9/PwEAgD/0/38/+/9/P/7/fz/0/38/+/9/PwAAgD/0/38//P9/PwEAgD/0/38//v9/PwAAgD/y/38//v9/P/3/fz/v/38//P9/P///fz/z/38///9/PwEAgD/z/38//f9/PwAAgD/y/38//v9/P/7/fz/1/38//v9/PwAAgD/z/38//v9/PwAAgD/0/38//P9/PwAAgD/y/38/+v9/PwIAgD/z/38//v9/P///fz/z/38//f9/PwAAgD/z/38//P9/PwAAgD/1/38///9/PwEAgD/0/38//P9/PwEAgD/2/38//v9/PwEAgD/2/38///9/P///fz/z/38//f9/PwEAgD/2/38//P9/PwAAgD/x/38//v9/PwAAgD8AAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAAAAAAA1DiNPgAAAAADAIA/AgCAPwIAgD8DAIA/AQCAPwIAgD8DAIA/AgCAPwMAgD8FAIA/AQCAPwMAgD8EAIA/AQCAPwMAgD8EAIA/AQCAPwMAgD8EAIA/AACAPwMAgD8DAIA/AgCAPwMAgD8EAIA/AQCAPwIAgD8DAIA/AgCAPwIAgD8DAIA/AQCAPwMAgD8EAIA/AQCAPwQAgD8EAIA/AQCAPwMAgD8FAIA/AQCAPwMAgD8EAIA/AACAPwEAgD8FAIA/AQCAPwIAgD8EAIA/AwCAPwEAgD8DAIA/AwCAPwIAgD8DAIA/AQCAPwMAgD8DAIA/BACAPwEAgD8FAIA/AwCAPwEAgD8FAIA/AQCAPwIAgD8DAIA/AQCAPwEAgD8CAIA/AwCAPwEAgD8FAIA/AwCAPwMAgD8DAIA/AwCAPwMAgD8CAIA/AgCAPwMAgD8CAIA/AwCAPwEAgD8DAIA/AQCAPwIAgD8EAIA/AgCAPwIAgD8EAIA/AwCAPwIAgD8EAIA/AwCAPwIAgD8EAIA/AwCAPwEAgD8EAIA/AACAPwIAgD8DAIA/AgCAPwEAgD8EAIA/AACAPwMAgD8EAIA/AgCAPwMAgD8EAIA/AgCAPwMAgD8EAIA/AACAPwIAgD8DAIA/AgCAPwMAgD8FAIA/AgCAPwQAgD8EAIA/AQCAPwIAgD8EAIA/AwCAPwQAgD8CAIA/AQCAPwMAgD8CAIA/AQCAPwIAgD8EAIA/AQCAPwMAgD8EAIA/AgCAPwMAgD8EAIA/AwCAPwEAgD8DAIA/AgCAPwIAgD8ixxm74oWHvZEz5Dwixxm74YWHvaEz5Dwixxm74YWHvaEz5Dz/xhm74YWHvaEz5Dwixxm74YWHvaEz5Dz/xhm74YWHvaEz5Dz/xhm74YWHvaEz5Dz/xhm744WHvaEz5Dwixxm744WHvaEz5Dzhxhm744WHvaEz5Dzhxhm744WHvaEz5Dz/xhm744WHvaEz5Dzhxhm744WHvaEz5Dz/xhm744WHvaEz5Dz/xhm744WHvaEz5Dz/xhm744WHvaEz5Dwixxm74YWHvaEz5Dwixxm74YWHvaEz5Dwixxm74YWHvaEz5Dwixxm74YWHvaEz5Dz/xhm74YWHvaEz5Dwixxm74YWHvaEz5Dz/xhm744WHvaEz5Dzhxhm744WHvaEz5Dzhxhm744WHvaEz5Dwixxm744WHvaEz5Dzhxhm744WHvaEz5Dz/xhm744WHvaEz5Dwixxm744WHvaEz5Dwixxm744WHvaEz5Dz/xhm74YWHvaEz5Dzhxhm74YWHvaEz5Dz/xhm74YWHvaEz5Dz/xhm74oWHvZEz5Dwixxm74oWHvZEz5Dz/xhm74oWHvZEz5Dwixxm74oWHvZEz5Dwixxm74oWHvYEz5Dz/xhm744WHvYEz5Dz/xhm744WHvYEz5Dz/xhm744WHvYEz5Dz/xhm74oWHvYEz5Dz/xhm744WHvYEz5Dz/xhm74oWHvZEz5Dz/xhm74oWHvZEz5Dz/xhm74oWHvZEz5DxAxxm74YWHvaEz5DxAxxm74YWHvaEz5Dwixxm74oWHvZEz5DwBAIA/BgCAPwAAgD/+/38/BgCAPwEAgD8AAIA/BgCAPwEAgD///38/BQCAPwAAgD/+/38/BQCAPwIAgD8AAIA/BgCAPwEAgD/+/38/BQCAPwIAgD8AAIA/BgCAPwEAgD/9/38/BACAPwMAgD///38/BACAPwMAgD8AAIA/AgCAPwMAgD8BAIA/BQCAPwQAgD///38/AgCAPwMAgD/+/38/BACAPwQAgD8AAIA/BACAPwUAgD///38/BgCAPwEAgD8AAIA/BACAPwIAgD8AAIA/BgCAPwAAgD///38/BQCAPwAAgD8AAIA/BgCAPwEAgD8AAIA/BwCAPwIAgD8AAIA/BgCAPwMAgD/9/38/BwCAPwEAgD8BAIA/BQCAPwIAgD///38/BQCAPwQAgD///38/BQCAPwIAgD///38/BACAPwQAgD8BAIA/BgCAPwEAgD8AAIA/BQCAPwMAgD8BAIA/BgCAPwMAgD8AAIA/BgCAPwQAgD8BAIA/BQCAPwEAgD8AAIA/BgCAPwEAgD///38/BwCAPwEAgD8AAIA/BwCAPwAAgD///38/BwCAPwAAgD8AAIA/BwCAP///fz///38/BwCAP/3/fz/+/38/CACAPwAAgD8AAIA/BwCAPwAAgD8BAIA/BwCAP///fz///38/BgCAPwEAgD8BAIA/CACAPwEAgD/+/38/BwCAP/7/fz///38/BgCAPwEAgD/+/38/BwCAPwEAgD8BAIA/BgCAPwEAgD8AAIA/BgCAPwAAgD8BAIA/BgCAPwAAgD89M4y9CAzqvLDrgL0/M4y9CAzqvMDrgL0+M4y9CAzqvLjrgL0+M4y9HQzqvMDrgL09M4y9HQzqvMDrgL0+M4y9KAzqvLjrgL09M4y9HQzqvMDrgL0+M4y9LQzqvLjrgL09M4y9PgzqvLjrgL09M4y9LQzqvLjrgL0+M4y9PgzqvLjrgL1AM4y9WAzqvLjrgL1AM4y9XgzqvLjrgL0+M4y9PgzqvLjrgL09M4y9PgzqvLjrgL0/M4y9OAzqvLjrgL09M4y9PgzqvLjrgL09M4y9PgzqvLjrgL0/M4y9YwzqvMDrgL09M4y9PgzqvLjrgL09M4y9PgzqvLjrgL0+M4y9XgzqvLjrgL0+M4y9YwzqvMDrgL09M4y9PgzqvLjrgL1AM4y9WAzqvLjrgL0/M4y9QwzqvMDrgL09M4y9LQzqvLjrgL0+M4y9IwzqvLDrgL09M4y9GAzqvLjrgL09M4y9HQzqvMDrgL09M4y9GAzqvMDrgL0/M4y9EwzqvMDrgL0+M4y9CAzqvMDrgL0/M4y9CAzqvMDrgL0/M4y9CAzqvMDrgL0/M4y9CAzqvMDrgL0+M4y92AvqvMDrgL07M4y97QvqvMDrgL0/M4y9CAzqvMDrgL09M4y93QvqvMDrgL09M4y9/QvqvMjrgL0+M4y9AgzqvLDrgL09M4y9EwzqvMDrgL09M4y9EwzqvMDrgL09M4y9CAzqvLjrgL0+M4y9AgzqvLjrgL0/M4y9EwzqvMDrgL0/M4y9AgzqvLjrgL09M4y9CAzqvLDrgL0AAIA/AACAPwAAgD8BAIA///9/P///fz///38/AACAPwEAgD///38/AACAPwEAgD8BAIA/+/9/PwEAgD///38//P9/PwAAgD8AAIA/+/9/PwIAgD/+/38//P9/PwEAgD///38/+f9/PwMAgD8AAIA//f9/PwEAgD///38//v9/PwAAgD8AAIA//v9/PwIAgD8AAIA//f9/PwIAgD8AAIA//P9/PwEAgD8AAIA/AACAPwIAgD///38/AACAPwEAgD8BAIA/+v9/PwEAgD8AAIA//P9/PwEAgD8BAIA//P9/PwIAgD8AAIA/+/9/PwEAgD///38//f9/PwIAgD/9/38///9/PwIAgD8CAIA///9/PwEAgD8BAIA//f9/PwEAgD8AAIA/AACAPwIAgD8AAIA//P9/PwIAgD/9/38//f9/PwEAgD/+/38//P9/PwMAgD8AAIA//f9/PwEAgD8AAIA/AACAP/7/fz8AAIA/AACAPwAAgD/+/38/AACAP///fz8AAIA/AACAP///fz8AAIA/AACAP/z/fz8AAIA/AACAPwAAgD8AAIA/AQCAP/r/fz8AAIA/AACAP/7/fz8AAIA/AQCAPwAAgD///38/AQCAP/z/fz8AAIA/AACAP/z/fz///38/AACAP/z/fz8BAIA/AgCAP/3/fz8AAIA/AACAPwEAgD///38//f9/PwAAgD8AAIA/AACAPwAAgD///38/AACAP/3/fz///38/AACAP/7/fz///38///9/PwAAgD8AAIA/AACAPwAAgD8hAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAhAECyxD+IPgAAAAAFAIA/AACAP/7/fz8CAIA/AwCAP/7/fz8DAIA/AQCAPwEAgD8DAIA/AQCAPwAAgD8EAIA///9/PwAAgD8CAIA//v9/PwEAgD8EAIA//v9/PwIAgD8EAIA/+/9/PwIAgD8EAIA//v9/PwEAgD8FAIA/AACAPwEAgD8EAIA///9/P///fz8EAIA/AQCAP///fz8DAIA///9/PwEAgD8FAIA///9/PwAAgD8EAIA///9/P///fz8EAIA/AQCAPwAAgD8DAIA/AQCAP///fz8EAIA/AQCAP/7/fz8DAIA/AACAPwEAgD8EAIA/AQCAPwEAgD8DAIA/AQCAPwAAgD8EAIA/AQCAPwEAgD8FAIA/AQCAPwAAgD8DAIA/AACAPwAAgD8DAIA/AQCAPwAAgD8EAIA/AQCAP/7/fz8DAIA/AACAP/7/fz8EAIA/AACAPwEAgD8DAIA/AACAPwEAgD8DAIA/+v9/PwEAgD8CAIA//P9/PwQAgD8BAIA//f9/PwIAgD8FAIA//P9/PwQAgD8CAIA/+/9/PwIAgD8EAIA//P9/PwUAgD8EAIA//v9/PwMAgD8EAIA/+P9/PwMAgD8EAIA//f9/PwIAgD8EAIA/AACAPwAAgD8FAIA/AgCAPwAAgD8FAIA/AQCAPwAAgD8FAIA//v9/PwAAgD8DAIA/AQCAP///fz8FAIA///9/PwAAgD8EAIA//v9/PwEAgD8DAIA//P9/P/3/fz8FAIA/AACAP///fz8CAIA/AQCAP///fz8FAIA/AACAP/7/fz8AAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAAAAAAA7DiNPgAAAAD2/38//f9/PwEAgD/4/38//v9/PwIAgD/2/38/+/9/PwIAgD/1/38//P9/PwIAgD/3/38//v9/PwEAgD/3/38//P9/PwAAgD/3/38//f9/PwIAgD/2/38//v9/PwEAgD/5/38/+v9/PwEAgD/3/38//v9/PwAAgD/4/38///9/PwAAgD/2/38///9/PwEAgD/3/38//P9/PwEAgD/3/38//f9/PwIAgD/5/38//P9/PwAAgD/3/38//f9/PwIAgD/0/38//P9/PwEAgD/3/38//v9/PwIAgD/3/38//P9/PwIAgD/3/38/+v9/PwIAgD/4/38//f9/PwIAgD/2/38/+v9/PwMAgD/2/38//f9/PwMAgD/1/38//P9/PwIAgD/4/38/+/9/PwMAgD/3/38/+P9/PwAAgD/3/38/+/9/PwIAgD/4/38//P9/PwMAgD/2/38//f9/PwEAgD/4/38///9/PwIAgD/4/38//v9/PwIAgD/4/38//f9/PwEAgD/2/38/+f9/PwAAgD/3/38/+/9/PwEAgD/4/38/AACAPwEAgD/3/38//f9/PwAAgD/4/38//v9/PwAAgD/5/38//v9/PwEAgD/4/38//P9/PwEAgD/5/38/+/9/PwEAgD/3/38//P9/PwIAgD/2/38/+v9/PwEAgD/3/38//v9/PwIAgD/2/38//P9/PwEAgD/2/38//f9/PwIAgD/3/38///9/PwIAgD/z/38/+v9/PwAAgD/1/38/+/9/PwAAgD/2/38//f9/PwEAgD+CK7+6SZOHvbYz5Dw/LL+6SZOHvbYz5DwDLL+6SZOHvbYz5DwDLL+6SZOHvbYz5Dy+K7+6SZOHvbYz5DwDLL+6SZOHvbYz5DwDLL+6SZOHvbYz5DwDLL+6SZOHvbYz5Dy+K7+6RpOHvcEz5Dy+K7+6RpOHvcEz5DwDLL+6RpOHvcEz5DyCK7+6RpOHvcEz5Dy+K7+6RpOHvcEz5Dy+K7+6RpOHvcEz5Dy+K7+6RZOHvbYz5Dy+K7+6RpOHvcEz5Dy+K7+6RpOHvcEz5Dw/LL+6RZOHvbYz5DwDLL+6RZOHvbYz5DwDLL+6RZOHvcEz5DyCK7+6RpOHvcEz5Dy+K7+6RpOHvcEz5Dy+K7+6RpOHvcEz5DwDLL+6RpOHvcEz5Dw/LL+6SZOHvbYz5DwDLL+6SZOHvbYz5DwDLL+6SZOHvbYz5Dw/LL+6SZOHvbYz5Dy+K7+6SZOHvbYz5DwDLL+6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AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/B34WtgAAAAAAAIA/B34WtgAAAAAAAIA/B34WtgAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/HXWvNQAAAAAAAIC/HXWvNQAAAAAAAIC/HXWvNQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/SK+qNQAAAAAAAIC/SK+qNQAAAAAAAIC/SK+qNQAAAAAAAIC/WVantQAAAAAAAIC/WVantQAAAAAAAIC/WVantQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/ppmYtQAAAAAAAIC/ppmYtQAAAAAAAIC/ppmYtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/4+edtQAAAAAAAIC/4+edtQAAAAAAAIC/4+edtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/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AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/noFtNQAAAAAAAIA/noFtNQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/XWOpNQAAAAAAAIA/XWOpNQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/Fyy4tQAAAAAAAIA/Fyy4tQAAAAAAAIA/Fyy4tQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/Kp/cNQAAAAAAAIC/Kp/cNQAAAAAAAIC/Kp/cNQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/WZ+fNQAAAAAAAIC/WZ+fNQAAAAAAAIC/WZ+fNQAAAAAAAIC/UtuntQAAAAAAAIC/UtuntQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/w5KqtQAAAAAAAIC/w5KqtQAAAAAAAIC/w5KqtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC//dYPNgAAAAAAAIC//dYPNgAAAAAAAIC//dYPNgAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/wKiqtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/E+qoNQAAAAAAAIC/E+qoNQAAAAAAAIC/n72MNQAAAAAAAIC/n72MNQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/V26qtQAAAAAAAIC/V26qtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/d72lNQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/P2mntQAAAAAAAIC/P2mntQAAAAAAAIC/P2mntQAAAAAAAIC/axQLNgAAAAAAAIC/axQLNgAAAAAAAIC/axQLNgAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/DYWXNQAAAAAAAIC/DYWXNQAAAAAAAIC/DYWXNQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAB7Qp88sdtkP7E35b6Sq2U+1Hd0Px37Rr78Aey8SeR/P/8AgrvPmRY+EDV9P3+BCDzqpbs+b8RtP08iYj3PYas+ichwP29iaz3PYas+ichwv29iaz3qpbs+b8Rtv08iYj15u2Q+hLVmv+Umvj7AAj28jF4pv+LwPz/8/686d1Z/P2cxkz2Sbwy/ZPJVPzvCy7x4Aka8dNt/P1sD/zz6bw0/+thUv19DcT38/686d1Z/v2cxkz3KlHa/fSGEPrixmb0aY3+/AAAAALihjb1nYHu/rFEvPpDhpL3eaH+/AAAAAI8Bi72Sbwy/ZPJVvzvCy7zKlHa/fSGEvrixmb1nYHu/rFEvvpDhpL3qbw0/4dhUPz9jcT2+9nM/tSmYPq1Ccj2+9nM/tSmYvq1Ccj1FnH8/AAAAAADiYT35L3w/KsIKvm7D2D3vwzA/m7sSv3nq4T6PMXw/I2IXvoBCsz0X9DA/5BUgvy1uuT7woYW+tHN/Pne7bj8uOoW+F+u8Pr5rZD+D2DK/pwI+PnzmMD/MYDK/NcaMPqiYKT/ZMXw/TVoXvrdCs72pSHw/qukfvm9hiL0X9DA/5BUgvy1uub4anjE/BTwqv62Jjb7t0vs9zZkaP1maST/01zA/f9rhPp+pEj920/w9eqYzP3qeMz9fCjE/wb8CP8LBAj/x8YW+AAAAAJkVd7/I4YW+tbEAvkT9dL/NRTO/AAAAANW/Nr/ONDO/9zK/vdc+Nb+spYW+LXN/vvq6br8uOoW+F+u8vr5rZL+D2DK/pwI+vnzmML/MYDK/NcaMvqiYKb/01zA/f9rhPp+pEr9fCjE/wb8CP8LBAr/GMHw/ZLLYPYWxCr6ZP3w/iAP3PYgD970xCoa+Afh0PxuqAD4OMDO/E0Q1Py8Svz0WsoW+ubluP/hrfz4P2DK/CugwPyryPT77ajI/L0PAPQsBNj+9Ynw//wG4PNjpKT7maQI+qMF7v+cpBD40cjI/P/o1v1gywD301zA/f9rhvp+pEj9fCjE/wb8Cv8LBAj/GMHw/ZLLYvYWxCj6ZP3w/iAP3vYgD9z2vjjI/xHI3PwAAAACnZ3w/eAIrPgAAAAA0cjI/P/o1P1gywL13ZHw/qMEpPr7Bt7zONDO/9zK/Pdc+Nb+b7nq/PYLZPBLqSL7Tcvs9RZxJP76ZGj/vwzA/m7sSP3nq4T4YMXw/MFKzPdhpF75+Rnw/V4GIPY8ZIL469DA/U2a5PgMYIL89qjE/zIWNPiYwKr9kMXw/aFKzvQhiFz5+Rnw/V4GIvY8ZID469DA/U2a5vgMYID89qjE/zIWNviYwKj+ZUQI+AAAAAB/rfb8IagI+CiIEPunBe79xfDI/AAAAAIOEN7/7ajI/L0PAPQsBNr+3YYS+MAP3PsQ+Vj8lZoS+cIIWPy03RD8tyjG/QXa4PvRvHz+PrjG/PsvgPhsOEj/bSzO/47k2vwAAAAA673q/mLJKvgAAAAAOMDO/E0Q1vy8Sv71f63q/sCpJvt6C2bw0cjI/P/o1v1gywL2cBzI/m6cxv7gBP753ZHw/qMEpvr7Bt7xaVnw/jWEmvq+hN70uOoW+F+u8vr5rZD/MYDK/NcaMvqiYKT+3YYS+MAP3vsQ+Vj8tyjG/QXa4vvRvHz+pSHw/qukfPm9hiD0anjE/BTwqP62JjT7+aTI/H0LAvQcCNr+9Ynw//wG4vNjpKb4uOoW+F+u8Pr5rZL/MYDK/NcaMPqiYKb+3YYS+MAP3PsQ+Vr8tyjG/QXa4PvRvH7/NVYS+rzhEPxCEFj/ptjG/ZAgSP6u/4D6zlYS+PdYuPz7aLj9i6DG/vicCP70rAj9UNYa+dQx3PwAAAAAxCoa+Afh0PxuqAL7bSzO/47k2PwAAAAAOMDO/E0Q1Py8Sv70lZoS+cIIWvy03RD+PrjG/PsvgvhsOEj+zlYS+PdYuvz7aLj9i6DG/vicCv70rAj8OMDO/E0Q1vy8Svz1f63q/sCpJvt6C2Tw0cjI/P/o1P1gywD2TBjI/kqgxP74CPz53ZHw/qMEpPr7BtzxaVnw/jWEmPq+hNz2m5YW+jqkAPgH9dD/ONDO/9zK/Pdc+NT8lZoS+cIIWPy03RL+PrjG/PsvgPhsOEr+zlYS+PdYuPz7aLr9i6DG/vicCP70rAr9+Rnw/V4GIvY8ZIL49qjE/zIWNviYwKr/uVHw/HsI3ve2BJr4dFjI/QfI+vh2aMb+rJYW+4m5kv2LqvL5dYjK/P5Ypv93JjL6ceYS+lj5Wv/z29r6tyjG/ZnAfv8hyuL6ceYS+lj5Wv/z29j7NVYS+rzhEvxCEFj+tyjG/ZnAfv8hyuD7ptjG/ZAgSv6u/4D7ONDO/9zK/vdc+NT+b7nq/PYLZvBLqSD6ceYS+lj5WP/z29r7NVYS+rzhEPxCEFr+tyjG/ZnAfP8hyuL6FtzG/5QgSP3G84L7GMHw/ZLLYvYWxCr701zA/f9rhvp+pEr8YMXw/MFKzvdhpF7469DA/U2a5vgMYIL/NVYS+rzhEvxCEFr+FtzG/5QgSv3G84L6zlYS+PdYuvz7aLr9i6DG/vicCv70rAr+pSHw/qukfPm9hiL0anjE/BTwqP62Jjb5aVnw/jWEmPq+hN72cBzI/m6cxP7gBP76rJYW+4m5kP2LqvD5dYjK/P5YpP93JjD6ceYS+lj5WP/z29j6tyjG/ZnAfP8hyuD6rJYW+4m5kv2LqvD5dYjK/P5Ypv93JjD6pSHw/qukfvm9hiD0anjE/BTwqv62JjT4WsoW+ubluP/hrf76rJYW+4m5kP2LqvL4P2DK/CugwPyryPb5dYjK/P5YpP93JjL7vwzA/m7sSv3nq4b5fCjE/wb8Cv8LBAr/5L3w/KsIKvm7D2L2ZP3w/iAP3vYgD971+Rnw/V4GIPY8ZID49qjE/zIWNPiYwKj/uVHw/HsI3Pe2BJj4dFjI/QfI+Ph2aMT8CYgI+ECoEvunBez/7ajI/L0PAvQsBNj+3YYS+MAP3vsQ+Vr8lZoS+cIIWvy03RL8tyjG/QXa4vvRvH7+PrjG/PsvgvhsOEr/5L3w/KsIKPm7D2L3vwzA/m7sSP3nq4b7ZMXw/TVoXPrdCs70X9DA/5BUgPy1uub5mWiG+vqN6v/X5A77aUSG+TY5Iv8TnGb/9GSG+ZYrBvuOOab+WUiG+feYZPz6PSL9jaiG+eI9pP912wb5mWiG+vqN6P/X5Az758te9yPZJPyL6Gj/aUSG+TY5IP8TnGT/9GSG+ZYrBPuOOaT+WUiG+feYZvz6PSD8zciG+LY9pv6F2wT4AAIA/YokENgAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/OGa1NQAAAAAAAIA/OGa1NQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/PZUEtgAAAAAAAIA/PZUEtgAAAAAAAIA/PZUEtgAAAAAAAIA/GXgENQAAAAAAAIA/AAAAAAAAAAAAAIA/eEjXNAAAAAAAAIA/eEjXNAAAAAAAAIA/CokEtgAAAAAAAIA/CokEtgAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/4k+1tQAAAAAAAIA/4k+1tQAAAAAAAIA/ySrXtQAAAAAAAIA/ySrXtQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/GXgEtQAAAAAAAIA/GXgEtQAAAAAAAIA/GXgEtQAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/yEfXtAAAAAAAAIA/yEfXtAAAAAAAAIA/yEfXtAAAAAAAAIA/XJkEtQAAAAAwchW+qBd7v+w5BL5TahW+8Bd7vxQ6BL6KYRW+FO5Iv5grGr9RchW+JetIv2guGr92ihW+NNfBvt/5ab+PmhW+VtPBvgj6ab9CghW+VigaPw3vSL+/mRW+zycaP13uSL/naRW+/PxpP3rOwb6fYRW+jvxpPx7Swb4wchW+qBd7P+w5BD5TahW+8Bd7PxQ6BD6KYRW+FO5IP5grGj9RchW+JetIP2guGj92ihW+NNfBPt/5aT+PmhW+VtPBPgj6aT9CghW+Vigavw3vSD+/mRW+zycav13uSD/naRW+/Pxpv3rOwT6fYRW+jvxpvx7SwT4AAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/27jZtAAAAAAAAIC/27jZtAAAAAAAAIC/27jZtAAAAAAAAIC/VHUTtQAAAAAAAIC/VHUTtQAAAAAAAIC/VHUTtQAAAAAAAIC/c9EwtQAAAAAAAIC/c9EwtQAAAAAAAIC/c9EwtQAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/onYTNQAAAAAAAIC/onYTNQAAAAAAAIC/onYTNQAAAAAAAIC/c9EwNQAAAAAAAIC/c9EwNQAAAAAAAIC/c9EwNQAAAAAAAIC/AAAAAAAAAABzMSG+LtmCvjIydL82YiG+zfkDvm+jer+kKSG+WtmCPoEydD82YiG+zfkDPm+jej8AAIA/TqSptQAAAAAAAIA/TqSptQAAAAAAAIA/TqSptQAAAAAAAIA/AAAAAAAAAAAAAIA/BqapNQAAAAAAAIA/BqapNQAAAAAAAIA/BqapNQAAAAAAAIA/AAAAAAAAAACNqRW+XA2DvoqgdL8YuhW+0ykEvoAVe7+NqRW+XA2DPoqgdD8YuhW+0ykEPoAVez8AAIC/qmePtQAAAAAAAIC/qmePtQAAAAAAAIC/qmePtQAAAAAAAIC/pqieNQAAAAAAAIC/pqieNQAAAAAAAIC/SmaPNQAAAAAAAIC/SmaPNQAAAAAAAIC/SmaPNQAAAAAAAIC/VametQAAAAAAAIC/VametQAAAABzS2O+rUtxP+Obf77Z2R6+CTYuPyVUN78dBhS/+HBPP8fSwr17c+K+hLYjP3r6IL//Ady8unE5vlWse7+PIaK9IXpavnNIeb9P8su92YB7v8+ZIb6lUHw/PgLhvMrRKr4bdT0/XoKVvNMaLL+26iw/4bw3P7ZCLb5jO/0+6ZkOP0rKKr/uwTQ9vFZ7vwoyPb67Qt48Nqoyv0M2N7/Sa3g+y8l0P5eyJ75iMjA+dcQ0P2TWL79OohY9wjoxvvT1e79iMjA+dcQ0v2TWL79fomC+fwG1O6fCeb88QYq8i7kdPnrofL/fgvM8DR19P81JFr7IYUi+NFB2P7opQr58gv68wbkwvoIIfL/Z2R6+CTYuvyVUN784wrC9qtpRviqXeb/+AIO7tokuvnhAfL9fomC+fwG1u6fCeb+7Qt48NqoyP0M2N79+AqI7cwofPu7jfL+L8uY92cEnvsjier8/ckM+/gFCO+hKe79jO/0+6ZkOv0rKKr8bdT0/XoKVPNMaLL+yqB+/UltEP5daGj58YkW+L/d6Py1CLb09VnC/PwJ/vKEpsD4I1h+/hexGvw+Coz0I1h+/hexGPw+Coz33iUW+e5R5Pz9C4709VnC/PwJ/PKEpsD4En2w/HAKrPH4ewz5SMCY/WBoov72OxD5XEq09RXlwv00uqj5XEq09RXlwP00uqj7+Aus8Sd9/P7sCWTwAAAAAYu8uNAAAgL8AAAAAYu8uNAAAgL8AAAAAYu8uNAAAgL9dWo8+221pP4m+mT5o4no+ZSx4P/4BXrxdWo8+221pv4m+mT6h/3+/AAAAAPsCXrutz+++C9IEvm67X78Mh8O+O5IOvqblab/KstY9WN6yvh9dbr8Mh8O+O5IOvqblab+tz+++C9IEPm67X78Mh8O+O5IOPqblab88CCW/m8Q/vxs6HD4cchW+2+xIvzEsGr+ANtg+fIWAPpT6Xr9vkRW+fCsaP/DrSL9YchW+svtpPxDTwb5RchW+6Bd7Pw8yBD7egtu9rUpNP/V1Fr/JIh+/Yq9BP6HDT74KgCK/eCJFP5/hgr0KgCK/eCJFP5/hgr1OgRc9PaB/P19hIb3T+wm/sNpKv+09kr6eAcC5FYx/v+2Bc70osAq/OMdOv68jbr6/AQ+8fP1/v7kCSDp2+CI/+2ZFv7eCPzxnjDe/TyIxPVUcMr+AbyW/fh2kvpxLMb9CJC2/zG2JvkqaL78ysB6/P4N0PMrYSL8ysB6/P4N0vMrYSL9PkCe/PKaivmugL79pPCS/VTNjPsL6O7/ZtRO/D+IlvZ3UUL+TOQ4+6OUqPxVCOz9eQ2O9MfARvyfZUb9RPBW/fgK1Ozn/T7+MaRK//wHFuzj+Ub9RPBW/fgK1uzn/T79TuBe/vQN2vCgpTr/DESa/ENxBP6ABmz0oHCi/cVo+P6IJAT4uoha9xNF/P34D+juWniq/16Q7vxhqCz7zmii/Sj08v9iqIz4AAIA/AAAAAAAAAAAAAIA/e6m5tQAAAAAAAIA/e6m5tQAAAAAAAIA/AAAAAAAAAAAAAIA/Yq2zNQAAAAAAAIA/Yq2zNQAAAAAAAIA/AAAAAAAAAAAAAIA/ghbGNQAAAAAAAIA/ghbGNQAAAAAAAIA/ghbGNQAAAAAAAIA/S8O3NQAAAAAAAIA/S8O3NQAAAAAAAIA/S8O3NQAAAAAAAIA/tWrFNQAAAAAAAIA/tWrFNQAAAAAAAIA/MnrVNQAAAAAAAIA/MnrVNQAAAAAAAIA/AAAAAAAAAAAAAIA/B34WtgAAAAAAAIA/B34WtgAAAAAAAIA/B34WtgAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/jFu2NQAAAAAAAIC/jFu2NQAAAAAAAIC/jFu2NQAAAAAAAIC/96+qNQAAAAAAAIC/96+qNQAAAAAAAIC/96+qNQAAAAAAAIC/WVantQAAAAAAAIC/WVantQAAAAAAAIC/AAAAAAAAAAAAAIC/VpqYNQAAAAAAAIC/VpqYNQAAAAAAAIC/VpqYNQAAAAAAAIC/jASXNQAAAAAAAIC/jASXNQAAAAAAAIC/LUKiNQAAAAAAAIC/LUKiNQAAAAAAAIC/iqmltQAAAAAAAIC/iqmltQAAAAAAAIC/AAAAAAAAAAAAAIC/MKvctQAAAAAAAIC/MKvctQAAAAAAAIC/MKvctQAAAAAAAIC/kCHDNQAAAAAAAIC/kCHDNQAAAAAAAIC/kCHDNQAAAAAAAIC/ArSutQAAAAAAAIC/ArSutQAAAAAAAIC/ArSutQAAAADH6qg+SIFHvz1iCD++g2K9UVoKv5jtVj8AAIA/AAAAAAAAAAAAAIA/Uyb5NQAAAAAAAIA/Uyb5NQAAAAAAAIA/pgGDtQAAAAAAAIA/pgGDtQAAAAAAAIA/RjiwNQAAAAAAAIA/RjiwNQAAAAAAAIA/PmdKNQAAAAAAAIA/PmdKNQAAAAAAAIA/AAAAAAAAAAAAAIA/oyX5tQAAAAAAAIA/oyX5tQAAAAAAAIA/IgGDNQAAAAAAAIA/IgGDNQAAAAAAAIA/PjewtQAAAAAAAIA/PjewtQAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/BuSQtQAAAAAAAIC/BuSQtQAAAAAAAIC/AAAAAAAAAAAAAIC/BuSQNQAAAAAAAIC/BuSQNQAAAAAPKiG+AAAAADrPfL8AAIA/AAAAAAAAAABYqRW+AAAAAEVAfb8AAIC/KUmLtQAAAAAAAIC/bQqVNQAAAAAAAIC/4UqLNQAAAAAAAIC/DgmVtQAAAAA1Aku+uph6Py5iS71L812+tR94P5Pj7r3o2Re/lYZNPw8Ddj3dWw4/bNY4P8HC0j4AAAAAYu8uNAAAgL/OsQi/WAIxvs3gU79L5X0//AASu64BA75bG+w+PTIdv1X6I79HDo++EAIAuOnNdb+voUy9AAAAACyuf78NSgY/AAAAAFLzWb/aXii/SsR9PhQbNr+ANtg+fIWAPpT6Xr/egtu9rUpNv/V1Fr9Tmm6/vgE9vM9tub4osAq/OMdOv68jbr6uP3c/1HI+vsDqOL78Afi63vl/PzYDXjz8Afi63vl/PzYDXjx2aXi/0PEBvuyaUr6uP3c/1HI+PsDqOL7UARA/sKRTP78BELy+g2K9UVoKP5jtVj8MBre+fERdPwYitb57Qp88sdtkP7E35b7s1n8/n8EPvX4BmLsK3im/7vmgvhbKLb8AAAAA/trhvgu/Zb/4Ax+/vSpevmLIQL/DTaG+AAAAAKr2cj/Zdym/EhY9P25pAj4AAIA/B34WNgAAAAAAAIA/B34WNgAAAAAAAIA/B34WNgAAAAAAAIA/MnrVtQAAAAAAAIA/MnrVtQAAAAAAAIA/+8O3tQAAAAAAAIA/+8O3tQAAAAAAAIA/DWvFtQAAAAAAAIA/DWvFtQAAAAAAAIA/Cq2ztQAAAAAAAIA/Cq2ztQAAAAAAAIA/ghbGtQAAAAAAAIA/ghbGtQAAAAAAAIA/ghbGtQAAAAAAAIA/AAAAAAAAAAAAAIA/K6q5NQAAAAAAAIA/K6q5NQAAAAAAAIC/MKvcNQAAAAAAAIC/MKvcNQAAAAAAAIC/MKvcNQAAAAAAAIC/ArSuNQAAAAAAAIC/ArSuNQAAAAAAAIC/kCHDtQAAAAAAAIC/kCHDtQAAAAAAAIC/jASXtQAAAAAAAIC/jASXtQAAAAAAAIC/jASXtQAAAAAAAIC/3UKitQAAAAAAAIC/ppmYtQAAAAAAAIC/ppmYtQAAAAAAAIC/ppmYtQAAAAAAAIC//7CqtQAAAAAAAIC//7CqtQAAAAAAAIC/WVanNQAAAAAAAIC/WVanNQAAAAAAAIC/hFq2tQAAAAAAAIC/hFq2tQAAAAAaY3+/AAAAALihjb29eRW+RtbBPr36aT+CQRW+WQ2DvoKkdL9aOhW+HDIEvvwZe7+TgRW+DdbBvnr6ab9TahW+8Bd7PxQ6BD4AAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAC9eRW+Vu5IP8spGj+kkhW+uCYav4vvSD+CQRW+WQ2DPoKkdD9aOhW+HDIEPvwZez+kkhW+uCYaP4vvSL8AAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAC9eRW+Vu5Iv8spGr8AAIA/AAAAAAAAAABNkhW+m/lpv/vWwT5NkhW+m/lpP/vWwb4AAIA/7fk3NgAAAAAAAIA/7fk3NgAAAAAAAIA/7fk3NgAAAAAAAIA/3mbItQAAAAAAAIA/3mbItQAAAAAAAIA/3mbItQAAAAAAAIA/EeyJtQAAAAAAAIA/EeyJtQAAAAAAAIA/y5sstQAAAAAAAIA/y5sstQAAAAAAAIA/y5sstQAAAAAAAIA/LmbINQAAAAAAAIA/LmbINQAAAAAAAIA/LmbINQAAAAAAAIA/YeuJNQAAAAAAAIA/fYYsNQAAAAAAAIC/e/SjNQAAAAAAAIC/e/SjNQAAAAAAAIC/e/SjNQAAAAAAAIC/mciNtQAAAAAAAIC/i9cNtgAAAAAAAIC/i9cNtgAAAAAAAIC/i9cNtgAAAAAAAIC/ZPGjtQAAAAAAAIC/ZPGjtQAAAAAAAIC/ZPGjtQAAAAAAAIC/ScmNNQAAAAA2ShW+AAAAAMhDfb8AAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8I1h+/hexGPw+Coz32kD6/9QEAuKjwKr/2kD6/9QEAuKjwKr/tfSM/AAAAAFL+RL/eaH+/AAAAAI8Bi73mpRq/AAAAAIECTL+MK+u+RBIWP5TYKj8AAIA/XWOptQAAAAAAAIA/XWOptQAAAAAAAIA/Fyy4NQAAAAAAAIA/Fyy4NQAAAAAAAIA/Fyy4NQAAAAAAAIA/g4JttQAAAAAAAIA/g4JttQAAAAAAAIA/cyymtQAAAAAAAIA/cyymtQAAAAAAAIA/0QavNQAAAAAAAIA/B224tQAAAAAAAIA/B224tQAAAAAAAIA/2mrPtQAAAAAAAIA/2mrPtQAAAAAAAIA/2mrPtQAAAAAAAIA/EJuWtQAAAAAAAIA/EJuWtQAAAAAAAIC/axQLtgAAAAAAAIC/axQLtgAAAAAAAIC/axQLtgAAAAAAAIC/DYWXtQAAAAAAAIC/DYWXtQAAAAAAAIC/DYWXtQAAAAAAAIC/d72ltQAAAAAAAIC/P2mnNQAAAAAAAIC/R72MtQAAAAAAAIC/R72MtQAAAAAAAIC/V26qNQAAAAAAAIC/V26qNQAAAAAAAIC/AAAAAAAAAAAAAIC/rdcPtgAAAAAAAIC/rdcPtgAAAAAAAIC/rdcPtgAAAAAAAIC/EKiqNQAAAAAAAIC/C+motQAAAAAAAIC/w5KqNQAAAAAAAIC/w5KqNQAAAAAAAIC/Kp/ctQAAAAAAAIC/Kp/ctQAAAAAAAIC/Kp/ctQAAAAAAAIC/WZ+ftQAAAAAAAIC/UtunNQAAAAAAAIA/GxzBtQAAAAAAAIA/GxzBtQAAAAAAAIA/GxzBtQAAAAAAAIA/3KYlNQAAAAAAAIA/3KYlNQAAAAAAAIA/GcY7tQAAAAAAAIA/7aaltAAAAAAAAIA/7aaltAAAAAAAAIA/LKXetAAAAAAAAIA/psY7tQAAAAAAAIA/psY7tQAAAAAAAIA/psY7tQAAAAAAAIC/OhcINgAAAAAAAIC/OhcINgAAAAAAAIC/OhcINgAAAAAAAIC/S+82tgAAAAAAAIC/S+82tgAAAAAAAIC/S+82tgAAAAAAAIC/dLgetgAAAAAAAIC/dLgetgAAAAAAAIC/dLgetgAAAAAAAIC/vhcItgAAAAAAAIC/vhcItgAAAAAAAIC/vhcItgAAAAAAAIC/b+42NgAAAAAAAIC/b+42NgAAAAAAAIC/b+42NgAAAAAAAIC/zLgeNgAAAAAAAIC/zLgeNgAAAAAAAIC/zLgeNgAAAAAAAIC/qRuItAAAAAAAAIC/qRuItAAAAAAAAIC/qRuItAAAAAAAAIA/UHIuNQAAAAAAAIA/UHIuNQAAAAAAAIA/mCNBtQAAAAAAAIA/mCNBtQAAAAAAAIA/mCNBtQAAAAAAAIA/mCNBtQAAAAAAAIA/mCNBtQAAAAAAAIC/j22CtQAAAAAAAIC/C22CNQAAAADPV789/ohHPTY8eT+YGpY90Mq2Pbw/ej9/t609z+U+PSUBhj93RZw9EOSmPQFqhj/WASA+xnwEPxQ9WD9vLCg+WQ0BP/qWVT92Ty4+UJwLPwOTTz8BTDk+NvsLPwZ/Sz/2etc9WUUHPyZjTT8vMsg956EKPy8UUD/oiAw+30cNP47bSD/pKRI+BX0RPxdUSD/WASA+ynwEvxM9WD9W8QY+2MYIvxpQVz92Ty4+VJwLvwKTTz/ivCY+kYkQv2pETD/2etc9XEUHvyRjTT8zVAU+bugCv/5aTj/oiAw+4kcNv4rbSD+/uCQ+su4Mv6+ORz/SQjA++LIRvzfwRj8BTDk+OfsLvwV/Sz/uhRU9X+rnPRfelz0fJf08bJPfPaAtuD2PxDs9l5+iPefnoT2tjy49L6qhPQeUtz0fely995ugPV+/lT2QCCi9H39PPYcUlT3QokK9UGefPU9OuD0+3BC9vlxIPWiMtz0uCRk9j445vbDalj0OQAI9f2BGvfAotz2PxDs9oJ+ivd/noT2tjy49L6qhvf+Ttz3PHBi9+TDbvY/huD3QokK9UGefvUdOuD1fOy69LdHZvSBnlj0fely995ugvVe/lT1PgBy99roAvkj5oT9PgBy9I1MJvlInpD/YJIa9u1H6vSU7oj/YJIa99oMFvslZpD9PgBy9H6WUvVEsmz9PgBy9z/i0vQWGnD/YJIa9l4WQvVqemz/YJIa9t/OvvY3unD/Pn0m91hxQtMdGmD9vrEi934mbvHZsmD/YJIa90V9RtAkzmT/YJIa9/ueWvK9amT9PgBy956SUPVEsmz9PgBy9rYZjPREZmj/YJIa9YIWQPVqemz/YJIa98DZdPfeSmj9PgBy927oAPkj5oT9PgBy959jrPeDznz/YJIa9hVH6PSU7oj/YJIa9zU3lPXxEoD9PgBy9AqUUPpZDqz9PgBy9JF4TPqHWqD/YJIa9WoUQPpZDqz/YJIa9okcPPv/nqD9PgBy927oAPuKNtD9PgBy9CFMJPthfsj/YJIa9hVH6PQVMtD/YJIa924MFPmItsj9PgBy956SUPdlauz9PgBy9kPi0PSUBuj/YJIa9WIWQPdHouj/YJIa9f/OvPZ6YuT9PgBy9VrqBtDDYvT9PgBy9WzWbPDqvvT/YJIa9LWCBtCFUvT/YJIa9HeeWPHssvT9PgBy9J6WUvdlauz9PgBy9HodjvRluvD/YJIa9l4WQvdHouj/YJIa9XjddvTT0uz9PgBy99roAvuKNtD9PgBy9HdnrvUqTtj/YJIa9u1H6vQVMtD/YJIa9A07lva9Ctj9PgBy9I6UUvpZDqz9PgBy9P14TvomwrT/YJIa9fIUQvpZDqz/YJIa9xEcPviufrT/Ijq49MPsQviDNoD/Ijq49PKkavp5Boz/YJIY9okwOvpv+oD/YJIY9zswXvqFnoz/Ijq49D2mnvUokmT/Ijq49f9HLvZOpmj/YJIY9MFCkvSR6mT/YJIY9LwzIvTf4mj/Ijq49cHZNtFhWlj/Ijq49X86uvIyElj/YJIY9Ov5NtKG5lj/YJIY9gJKrvNnmlj/Ijq494GinPUokmT/Ijq499x+APU7ulz/YJIY9AFCkPSR6mT/YJIY9T4J7PQ5KmD/Ijq49DvsQPiDNoD/Ijq49ec8EPoOGnj/YJIY9h0wOPpv+oD/YJIY9W1oCPs7Cnj/Ijq490mgnPpZDqz/Ijq49xvglPlCIqD/YJIY9E1AkPpZDqz/YJIY9muYiPmyVqD/Ijq49DvsQPgq6tT/Ijq49GqkaPo1Fsz/YJIY9gEwOPo+ItT/YJIY9s8wXPoofsz/Ijq492GinPeBivT/Ijq49R9HLPZjduz/YJIY990+kPQYNvT/YJIY97wvIPfOOuz/Ijq493lSDtNMwwD/Ijq49fs2uPJ8CwD/YJIY9+RCDtInNvz/YJIY9fpGrPFGgvz/Ijq49F2mnveBivT/Ijq49OCCAvd2Yvj/YJIY9OFCkvQYNvT/YJIY9vYJ7vRw9vj/Ijq49MPsQvgq6tT/Ijq49m88EvqcAuD/YJIY9okwOvo+ItT/YJIY9dloCvlzEtz/Ijq497WgnvpZDqz/Ijq494Pglvtr+rT/YJIY9NFAkvpZDqz/YJIY9teYivr/xrT8AAAAAAN0fPZLovT8AAAAAn1xsPX4YvT9PgBy9HuMZPfw1vT9PgBy9oIZjPRluvD9PgBw9UrsavlxysD9PgBw9of0TvhPtsj8AAAAA8ycVvoVCsD8AAAAAYqgOvqCmsj8AAAAAqGqaPRX7uz8AAAAAt/+7PZ6Tuj8AAAAAwLoFvkrqtD8AAAAAugH1va8Dtz8AAAAArGDaPaLpuD8AAAAAdwH1Pa8Dtz9PgBy93DbSPeRmuD9PgBy959jrPUqTtj9PgBw9v4rivWFsuT9PgBw9HwfDvRcmuz8AAAAA72DavaLpuD8AAAAA9/+7vZ6Tuj8AAAAAnroFPkrqtD8AAAAAR6gOPqCmsj8AAAAA52qavRX7uz8AAAAAHl1svX4YvT8AAAAAft0fvZLovT8AAAAAfT2hvGZmvj9PgBy9nuMZvfw1vT9PgBy9XDabvDqvvT8AAAAA2GoavpZDqz8AAAAAGxcZvnXIrT8uqyO9TzYbvVfnmD/yG6A3rkQ1vaommD9PgBy9HodjvREZmj8AAAAAHl1svaxumT+wogC9HiYPPTiElj/9FaA4ADsmPbdAlj+dX/m83iwUPeBnlD+NFgE5HzMqPYJWlD+ARTE9oOqpvPKYlT9ucjA9m2arvAETlD+ODTU9MkxMtBx8lT8fPDc9E0lKtEcDlD9fsDC9fYyivNpylj+ehi+9wACpvDZUlD+wogC9jiYPvTiElj+dX/m8Pi0UveBnlD9PBga9nzMiPZogkj//tfe8noIWPWACkz+R++i3TlU5PaMekj/4Seg4IB8sPbgBkz9/9Tw9n0e5vH8Tkj+OM0U9jZ5HtOQPkj+/JTE9+0asvLvtkj9QZDk98sRItC3nkj9PBga9/zMivZogkj//tfe8D4MWvWACkz+OlD69H2S5vPcekj8wYDC9XPirvED2kj8wEmo9zdcIPT/8vD4uEUo9/6EAPT6Rzz4fNYI8HoczPWnfvD78wVM7/qIsPbhazz7+4Cm770OePTvFmj4/Uic8jvY5Pfm8mj5+l507vxqePbBxrT4ACJI8fmw3PXJsrT7dXNw9r6igPX0kvT6ZLdk9+AWePRbczz5HMMc9bqo4Pd8ZvT4oA8E9n+QwPW3Izz4wlVY9mC75PYpbrT4tvjQ91vr3PQK7mj4gf4g8tWnhPTttrT5/nRI8VWngPbzHmj7dXNw9v6igvX0kvT5HMMc9jqo4vd8ZvT6ZLdk9CAaevRbczz4oA8E9z+QwvW3Izz7/bFc9LnD5vZv+vD7e7l0993/5vaUytT7Hirs93h7kvZMbvT4gubs9L3DkvZkptT5/wCA8EVD2PZKwDz8g3lm9Oh3dPdi3Dz//PiY7s8f1PccQGD9nloS9Y17cPRoZGD8vBaE9/DX8PFg6Gz/v2KA9PtUIPdkIGD/HTso913+NPY85Gz+P0cg9N3qQPfcFGD+6BX08/cq6vNWwDz9/GlS9z8wOvfq3Dz+/2gg8Xf+rvBsRGD+YnIG9ro0IvUwZGD/HTso973+NvY85Gz+oNpI9V+/bvSY6Gz+P0cg9UHqQvfcFGD+v9JE9a37cvZYIGD+7HtO8NuLePQyw9z6fvN08dJH3PRXJ9z7/cwU7fa3gPRRdzz5/kTY9Ftj4PYWUzz4uEUo9H6IAvT6Rzz78wVM7HqMsvbhazz7gKgQ9fsLdvILH9z6cc8i8bpwdvd6u9z5fsjG9/5+WvSKn9z6cc8i8bpwdvd6u9z5/40a8NyObva5Jzz78wVM7HqMsvbhazz6YT6Y9rTjgvbnh9z7X1bQ9JuHivQnLzz7RXdI9D2KYvXXp9z5g1JY9S/naPexpHz8P0ps9TpTZPUHxIz8TntA9DxeGPVFqHz97ENc9riR9PVLxIz9/eLo7eUgnPFFqHz+AeNc7O42TPGA8Gz8fE6U9XdLEPKVqHz9fnZC9XdLEPOxpHz9YtMS9DxeGPctpHz8vDIm9YBL8PFc+Gz8HOLu9gHSNPe4+Gz+4dpO9c/navctpHz/385i9aZTZvTDxIz9YtMS9LxeGvctpHz8Y9cu97yR9vTDxIz+neZq9T7fXveEpKD/7XwS3RYj2veEpKD9I7pa9H6fTvdEGMD/FeT46tePxvRAIMD+neZq9NLfXPeEpKD8S9s29L4h2PeEpKD9I7pa9BKfTPdEGMD+nvMm9b+NxPWwGMD/gBmY9eKKmvfYLjj93RZw9P+SmvQFqhj+/Cps9fkwzvcstjT9/t609L+Y+vSUBhj8S99g9cIh2vaYnKD+4M509T7fXvUkpKD97ENc97yR9vVLxIz8P0ps9aZTZvUHxIz+/eOm8b+TQvSxgjj+/eOm8A/0HvjRojD99/0s8rOrQvRv1jD+9Iz48/08HvpoIiz+/eOm8qJQCvg1sgT+/OY69rEEDvlPLgj+/eOm8PRfRvUoHgz9X+I+9/xDRvVxyhD/+LNE8nEgFPiDqhj+9Iz48608HPpoIiz+dcto8ZP3QPZGziD99/0s8hOrQPRv1jD+vB6m9t0gFviDqhj/PgIy9/08HvpoIiz8PWau9jP3QvZGziD9fPI69rOrQvRv1jD89ihc9OHysvjoHcz+8Btk8uUymvrWnbD+dMs88x5qivmjPdT+3TWc8VgWcvkY6bz/8Aay8GbWZPkELbT9/uNe7zLykPgFbaj+3TWc8TAWcPkk6bz+8Btk8r0ymPrenbD+/eOm89hmOPmMogz9+DPo7xiKMPoL/gT+/eOm8pQCfPl4MgT/+C9w7b8WcPqnZfz9/aQo81VeAvh0Wdj//b/U7FmKPvldecj+/eOm8S8F8vo7Ecz+/eOm84CaNviAfcD8vXYS9xiKMPoL/gT8nfYK9b8WcPqnZfz8nJZ69OD2GPr0KfT9Qlpu9qxOWPggceT89Ra28mzOrvuKmfj/+b967yMa1vhM+ez85plk89xypvlFpfD88NdI8Yg6zvlBJeT8nJZ69Qj2GvroKfT+XCYa91VeAvh0Wdj9Qlpu9tROWvgcceT9vE4S9FmKPvmhecj/coqU8OD2GPr0KfT9/aQo8y1eAPiAWdj9/Z5s8qxOWPggceT//b/U7DGKPPmlecj+/eOm8K7hRvjHOhz8XdYi9ymNPvnKKhj966ks8rEEDvlPLgj/3cys8Q2lBvj3ofT+/eOm84hQ/vr5gez/AkLs8lGZIPjO/gj9/xR08tmNPPnKKhj+goKO9qGZIvjO/gj9vjX09xdfYvjakXT8O4kk92jTPvrX9Xz8/Pak94sjUvmAEYT9nXJM9YuvLvnE8Yz/meOU9aDbhvooiZD9DGNQ9wwHevmCKXj97LNI9V8vevqbVZD+P3sI95Enbvh1PXz/nIJM9hB7gPuK9Wz8/7Z09pr7jPs63Wj+P3sI92knbPiBPXz9DGNQ9uQHePmOKXj9nXJM9WOvLPnM8Yz8/Pak92MjUPmIEYT9/S6I9iyTQPsT5aD/X5bY9gaLYPnSVZj99U588YPndvn4BZT/7VNo8Q2vWvvs+YD9QvQ09qmHovuMPYj/euyg9tbvgvk6bXT+v9Sw9tlT1PjxZXj+vkE899D7tPkcoWj/fSyg92YbwPvu7Xz+uzkY9ibjoPh1yWz+fMZM9sDPvvq3TaD9fBp49dMzyvvfDZz/g+ME937vmvqwVaT+CGdM9jnLpvmtIaD+O+309bCzoPiEBaz++Xko9DunePnz9bT+gjKg93GvgPiMFaz8HnZI95tLXPgC5bT+e6/s9VQbkPkVSYz/S++Y9BJnsPiNaZz/meOU9XjbhPosiZD+CGdM9hHLpPm1IaD/uYjI9Juz6Ply8XD9/x1k9B4byPqanWD/uYjI9MOz6vlq8XD9dW1w9w5j9vnN2Yj+v9Sw9wFT1vjlZXj+/2VE92GL4vnX8Yz+e6/s9XwbkvkRSYz9vLOg9Fi3hvu+kXT/7Dni8gDjGPtG5az99U588VvndPoABZT/+lsu7DSe/PkY0Zj/7VNo8OWvWPv0+YD+8+LA83I/KPruLdD//Pbq71l7LPtnMcT/+b967vsa1PhY+ez8PgSC9nDy0Phj6eD9OTUg9FKrFvilvcz8HnZI98NLXvv64bT/+L289o4u+vtfvbT9/S6I9lSTQvsL5aD//Pbq74F7LvtjMcT+dyN48MxLivhbCaj+8+LA85o/KvriLdD++Xko9GOnevnn9bT+/4Dk93mhuvdTxkD/8NSC7QDqIvWcKkT/fZkc9P/eLvbk2kD+/fwC8yP+fvZRlkD/8NSC7DzqIPWcKkT+/fwC8l/+fPZRlkD9e5U+9r2JuPRkckT9XsIS9QAiMPeKNkD84ToE9PzwIPf7UkD8IKI49wPEfPeMZkD+/4Dk9bmhuPdTxkD/fZkc9B/eLPbk2kD8IGIQ9KJtFtJfFkD84ToE9oDwIvf7UkD+fDpE9tuJEtLoPkD8IKI49HvIfveMZkD/nu7G9Lg0gPQ+XkD9vXLa9lZdFtByUkD8XTY+9nzcIPfsikT+wFJS92FtGtKIjkT/nu7G9jw0gvQ+XkD9XsIS9bwiMveKNkD8XTY+9EDgIvfsikT9e5U+9D2NuvRkckT/eWds9sIChvcQntT7ylNU9X8ShvcNKrT6fEMc97007vW8rtT4Yj8E9T5U8vTJUrT6vq7Y94FPkvSdLrT4wlVY9pS75vYpbrT7/j9c8I2T1PYklZT7+PPu7u0DePYI6ZT5QIcI92LWhPeatmj7HE5g9R5ehPSriZD6Hb6Q9l43jPaOtmj4/I3o9S+LhPef8ZD6/k4M9LhtBPZXVZD6A6/A8TqAVPd7WZD5PnzM9TydEPVhyFT69oTQ87ywbPVFyFT5/O8u7j28/Pd3rZD5805e84JyePUMaZT49Obe8DtNEPWeZFT4PMwy9f/SePQzoFT4+b++8vxxHvaXa5z09Obe8HtNEvWeZFT79E1M7/ocdvVJ95z29oTQ8/ywbvVFyFT4O+QY9T+NFvdKN0D2OKRA9fnJFvV9+5z2PjzE993mhvTT30D19HTo9p2yhvXXi5z2eqgs9FYvfvTZz6D393a06GsLxvej46D0eFwM9WHDfvauO0T38PYi6xY/xvZwY0j0vfSe9rxmfvSST6D1duP284jnbvbQf6T0PMwy9f/SevQzoFT4A1MS8kiDcvQcjFj4fZ6I9v89avd36ez2n76E9+HyqvafiiT2Uwvw9T4xzvaCcUz2EgPw9gN20vR6SZT2EgPw9gN20PS6SZT2hMCg+t5C+PR+iMD3sMvw9Wi3wPU/4VD3iPx0+LEXnPb8SMT3eJAY+N4KyvXEDsj/eJAY+8PONvTHrsT/eJAY+HzSvvd4atD/eJAY+QAyNvVEUtD/eJAY+34W4vZZDqz/eJAY+YL23vWH4qD/eJAY+YMaQvZZDqz/eJAY+sFqQvSUGqT/eJAY+YMaQvZZDqz/eJAY+YL23vWH4qD/eJAY+B3SNvUhQoD/eJAY+SAyNvdpyoj/eJAY+SJ6svZF5oD/eJAY+FzSvvUxsoj/eJAY+f3ZUvULnsT/eJAY+X8YNvdDtsT/eJAY+Le9UvbwitD/eJAY+cNMOvQQ5tD/eJAY+Le9UvbwitD/eJAY+X8YNvdDtsT/eJAY+73lWvZZDqz/eJAY+nxRWvQsMqT/eJAY+nyAOvZZDqz/eJAY+H/kNvVoNqT/eJAY+v8ERvRDpnz/eJAY+X9MOvSdOoj/eJAY+fwBYvYYboD/eJAY+He9UvW9koj/eJAY+BoZwtPRPtD/eJAY+P1mPvGZJtD/eJAY++rhytFH3sT/eJAY+39qNvF70sT/eJAY+p4ljtAYNqT/eJAY+FhBqtJZDqz/eJAY+nIaNvFoNqT/eJAY+PJ2NvJZDqz/eJAY+K01gtDC7nz/eJAY+8DljtDc3oj/eJAY+m8+SvKPHnz/eJAY+P1mPvMQ9oj/eJAY+PViPPGZJtD/eJAY+/dmNPF70sT/eJAY+79IOPQQ5tD/eJAY+3sUNPdDtsT/eJAY+n4WNPFoNqT/eJAY+nvgNPVoNqT/eJAY+W5yNPJZDqz/eJAY+LyAOPZZDqz/eJAY+v86SPKPHnz/eJAY+TsERPRDpnz/eJAY+XViPPMQ9oj/eJAY+/9IOPSdOoj/eJAY+XViPPMQ9oj/eJAY+TsERPRDpnz/eJAY+/nVUPULnsT/eJAY+sPONPTHrsT/eJAY+r+5UPbwitD/eJAY+DwyNPVEUtD/eJAY+r+5UPbwitD/eJAY+sPONPTHrsT/eJAY+KMaQPZZDqz/eJAY+f3lWPZZDqz/eJAY+d1qQPSUGqT/eJAY+LhRWPQsMqT/eJAY+HwBYPYYboD/eJAY+2HONPUhQoD/eJAY+r+5UPW9koj/eJAY+/wuNPdpyoj/eJAY+dfvWPdE6sj/eJAY+5OXPPQFNtD/eJAY+94GyPXEDsj/eJAY+4DOvPd4atD/eJAY+ztjhPZZDqz/eJAY+p4W4PZZDqz/eJAY+sIfgPcrgqD/eJAY+J723PWH4qD/eJAY+D56sPZF5oD/eJAY+GHfIPYxnoD/eJAY+4DOvPUxsoj/eJAY+5OXPPSo6oj/eJAY+4DOvPUxsoj/eJAY+GHfIPYxnoD/eJAa+lzyLvdb/pT/eJAa+T3JdvdcSpj/eJAa+r6iIvV9epD/eJAa+8AhcvUljpD/eJAa+r6iIvV9epD/eJAa+T3JdvdcSpj/eJAa+h+2PvZZDqz/eJAa+OFGPva4NrT/eJAa+b9lhvZZDqz/eJAa+TjFhvd4CrT/eJAa+3qpcvTHOsz/eJAa+AAlcveEjsj/eJAa+d6SGvcCtsz/eJAa+r6iIvcwosj/eJAa+n7glvcoVpj/eJAa+PyvdvOAQpj/eJAa+sBYmvSVYpD/eJAa+/c7evMdGpD/eJAa+sBYmvSVYpD/eJAa+PyvdvOAQpj/eJAa+r0onvZZDqz/eJAa+r/smvUf+rD/eJAa+PbjdvJZDqz/eJAa+n3rdvPj8rD/eJAa+n2HjvHketD/eJAa+/c7evGNAsj/eJAa+T3sovXv3sz/eJAa+sBYmvQUvsj/eJAa+gZxbtME0pD/eJAa+eJ9fvAA6pD/eJAa+O2titFYJpj/eJAa+gEtdvKILpj/eJAa+tWtptEz9rD/eJAa+FhBqtJZDqz/eJAa+98dcvEz9rD/eJAa+PetcvJZDqz/eJAa+fxt7tIVCtD/eJAa+yxN4tGlSsj/eJAa+gAZlvLA4tD/eJAa+uJ9fvCtNsj/eJAa+gAZlvLA4tD/eJAa+yxN4tGlSsj/eJAa+wJ1fPAA6pD/eJAa+vUldPKILpj/eJAa+HM7ePMdGpD/eJAa+XSrdPOAQpj/eJAa+/8VcPEz9rD/eJAa+nnndPPj8rD/eJAa+OulcPJZDqz/eJAa+W7fdPJZDqz/eJAa+fARlPLA4tD/eJAa+nWDjPHketD/eJAa+wJ1fPCtNsj/eJAa+/M3ePGNAsj/eJAa+wJ1fPCtNsj/eJAa+nWDjPHketD/eJAa+LrglPcoVpj/eJAa+3nFdPdcSpj/eJAa+PxYmPSVYpD/eJAa+fwhcPUljpD/eJAa+7thhPZZDqz/eJAa+L0onPZZDqz/eJAa+4DBhPd4CrT/eJAa+P/smPUf+rD/eJAa+znooPXv3sz/eJAa+UKpcPTHOsz/eJAa+PxYmPQUvsj/eJAa+fwhcPeEjsj/eJAa+v6+nPZXUpT/eJAa+/yiiPQ03pD/eJAa+XzyLPdb/pT/eJAa+d6iIPV9epD/eJAa+XzyLPdb/pT/eJAa+/yiiPQ03pD/eJAa+HymwPZZDqz/eJAa+T+2PPZZDqz/eJAa+DyKvPQggrT/eJAa+91CPPa4NrT/eJAa+DyKvPQggrT/eJAa+T+2PPZZDqz/eJAa+P6SGPcCtsz/eJAa+2FycPde7sz/eJAa+d6iIPcwosj/eJAa+/yiiPR5Qsj+wRLC9l7fCPYrIiD9P+ZG9YEPEPXEghD9Her29J2a+PbrVhz8nz5a9z+PBPe0Ngj/gIZG9dyrBPQVujT9Yq5i9X+O6PbyRjT/7itu8oKLAPVLyjj/fwbG8D6q5PYVajz9Yq5i9j+O6vbyRjT+I2qy9p9GmvXKKjj9Her29WGa+vbrVhz83lcu9HwOnvUm6hj8nz5a9/+PBve0Ngj94A6y958+2vcZQej/cb4K85w3DvcAhgD//va67J5PIvQJHdj/3N429OKnLPTl7Pz8oN4e9j7TBPZi/Uj/+DkE7SMHoPQKAPz//aoM7z2DdPWXHUj/+DkE7YsHovQKAPz93oJs9WKnLvTSEPz//aoM792DdvWXHUj/XcJk9r7TBvRDPUj93Tb69X8FoPZZ5Pz93Tb69htcCtJZ5Pz9nBre9jmBdPfm8Uj9nBre9hgEQtPm8Uj/3N429WKnLvTl7Pz8oN4e9r7TBvZi/Uj93Tb69oMFovZZ5Pz9nBre9z2Bdvfm8Uj93oJs9OKnLPTSEPz/XcJk9j7TBPRDPUj+DvNM9X8FoPb6DPz8vpc49jmBdPSjRUj+DvNM9oMFovb6DPz+ca9g9kt0CtF6CPz8vpc49z2BdvSjRUj/VPdI9/w4QtNXQUj+1Ffs9NnkVvkUNtj+1Ffs95uwIvpRluD8jTuc9EO8Uvh0Dtj8jTuc9SW4IvnVZuD/eJAa+PtUHPciwuj/eJAa+jlFIPdr+uT/eJAa+wDoDPfqWuT/eJAa+7ytBPRr1uD+1Ffs9NnkVvuV5oD+1Ffs9EXQfvgwCoz8jTuc9EO8Uvg6EoD8jTuc9vuAevpUJoz/eJAY+sHHJPZl8uz/eJAY+2CHAPQd8uj/eJAY+30PoPc3HuT/eJAY+eMDbPZf/uD/eJAa+ODVUtOBFmz/eJAa+XjWJvJRqmz/eJAa+tyJVtM5rnD/eJAa+frOEvI+NnD/eJAa+r9UHvWLWmz/eJAa+DlJIvVCInD/eJAa+LjsDvTDwnD/eJAa+XSxBvRCSnT+1Ffs9oxb0PUsCnD+1Ffs98SHSPdklmj8jTuc9MTXzPWIQnD8jTuc99V/RPec1mj/eJAa+nZL9PXJorT/eJAa+12DrPW1WrT/eJAa+/dD2PSuCrz/eJAa+ljPlPXhdrz+1Ffs9HsaDtKHWwD+1Ffs9+ze0PB6nwD8jTuc9griDtKTCwD8jTuc9XZGzPHSTwD/eJAY+AYwivh0Drj/eJAY+L+IWvi3srT/eJAY+ZjcevuG0sD/eJAY+vOwSvrGFsD+1Ffs92Rb0vd+Euj+1Ffs9JyLSvVJhvD8jTuc9ZzXzvch2uj8jTuc9KmDRvUNRvD+1Ffs92JgsPpZDqz+1Ffs9Qh0rPrFyqD8jTuc9M/krPpZDqz8jTuc95n4qPk91qD8jTue9LplStGkYmj+1Ffu989hStPFGmj8jTue9XWuPPBg+mj+1Ffu9W+WNPExsmj/eJAY+iH8NPtmxtT/eJAY+GskBPqXatz/eJAY+5+UDPlZItT/eJAY+dIfzPY1Ftz+1Ffs9uJisPXCUmD+1Ffs9PxiEPfNUlz8jTuc9MPmrPc6lmD8jTuc9KJ6DPaFnlz+1Ffs995isvbryvT+1Ffs9fxiEvTcyvz8jTuc9Z/mrvVzhvT8jTuc9YJ6DvYofvz/eJAY+PYtOtCLDlj/eJAY+f+evPP7xlj/eJAY+/1NRtEs8mD/eJAY+YCCqPDhnmD/eJAa+6C2CPVEPuT/eJAa+VyCdPQfrtz/eJAa+8At6PckfuD/eJAa++NyVPdEitz8jTue9vVoJvpZDqz+1Ffu9L+UHvpZDqz8jTue9fCwIvtEFqT+1Ffu9V7oGvgsMqT+1Ffs9dbcmvj6upT+1Ffs9XR0rvrFyqD8jTuc9UR0mviizpT8jTuc9B38qvk91qD/eJAa+DlJIvdr+uT/eJAa+bSxBvRr1uD/eJAa+Jy6CvVEPuT/eJAa+bgx6vckfuD+1Ffs9HHkVPkUNtj+1Ffs993MfPh6Fsz8jTuc97u4UPh0Dtj8jTuc9o+AePpV9sz+1Ffs98JNMtImwlT+1Ffs93Ti0vA3glT8jTuc9J69MtIbElT8jTuc9XpKzvLbzlT/eJAa+nlFIPVCInD/eJAa+ACxBPRCSnT/eJAa+8C2CPdl3nT/eJAa+AAx6PWJnnj/eJAa+F3fKPYsVtT/eJAa+//O9PYyhtD/eJAa+hyq1PT2Wtj/eJAa+52erPfD5tT/eJAa+q9v/PZZDqz/eJAa+nZL9PbgeqT/eJAa+O3vtPZZDqz/eJAa+12DrPb4wqT/eJAa+lyCdvQfrtz/eJAa+L92VvdEitz/eJAa+xyq1vT2Wtj/eJAa+H2irvfD5tT8jTue9eqwEvkq1rz+1Ffu9xUMDviqprz8jTue9fCwIvlqBrT+1Ffu9V7oGviB7rT+1Ffs9U7cmPuzYsD+1Ffs9Qh0rPnsUrj8jTuc9Lx0mPgLUsD8jTuc95n4qPtwRrj/eJAa+8+p/tEpBuz/eJAa+fDSJPJccuz/eJAa+df1+tFwbuj/eJAa+nbKEPJz5uT/eJAa+XyCdPSOcnj/eJAa++NyVPVpknz/eJAa+jyq1Pe3wnz/eJAa+52erPTuNoD+1Ffs9ra8yvaBslj+1Ffs9dxiEvfNUlz8jTuc9fwoyvfV/lj8jTuc9WJ6DvaFnlz/eJAa+ULLrveYApT/eJAa+VxbbvT46pT/eJAa+6rzcvdkgoz/eJAa+UsPNvRlzoz/eJAa+6rzcvVFmsz/eJAa+WHfKvYsVtT/eJAa+UsPNvRIUsz/eJAa+P/S9vYyhtD8jTue9XMOAtMFuvD+1Ffu9nKOAtDlAvD8jTue9X2yPvBJJvD+1Ffu9PeaNvN4avD/eJAa+tLzcPdkgoz/eJAa+F3fKPZ9xoT/eJAa+HMPNPRlzoz/eJAa+//O9PZ/loT+1Ffs98JisvXCUmD+1Ffs9JyLSvdklmj8jTuc9Z/mrvc6lmD8jTuc9KmDRvec1mj/eJAa+UHfKvZ9xoT/eJAa+N/S9vZ/loT/eJAa+xyq1ve3wnz/eJAa+H2irvTuNoD+1Ffs9WrcmPj6upT+1Ffs993MfPgwCoz8jTuc9Nh0mPiizpT8jTuc9o+AePpUJoz/eJAa+DbLrPUSGsT/eJAa+FBbbPexMsT/eJAa+p7zcPVFmsz/eJAa+D8PNPRIUsz/eJAa+M9H2vSuCrz/eJAa+ULLrvUSGsT/eJAa+zDPlvXhdrz/eJAa+VxbbvexMsT+1Ffs9dbcmvuzYsD+1Ffs9EXQfvh6Fsz8jTuc9UR0mvgLUsD8jTuc9vuAevpV9sz/eJAa+/dD2Pf8Epz/eJAa+G7LrPeYApT/eJAa+ljPlPbIppz/eJAa+FBbbPT46pT+1Ffs92Rb0vUsCnD+1Ffs95uwIvpYhnj8jTuc9ZzXzvWIQnD8jTuc9SW4IvrYtnj+1Ffs9L68yPYoawD+1Ffs9NxiEPTcyvz8jTuc9DgoyPTUHwD8jTuc9IJ6DPYofvz/eJAY+d8qCtAnEvz/eJAY+W+ivvC2Vvz/eJAY+FmaBtOBKvj/eJAY+PCGqvPMfvj/eJAa+Jy6Cvdl3nT/eJAa+jyCdvSOcnj/eJAa+Xgx6vWJnnj/eJAa+L92VvVpknz+1Ffs9HHkVPuV5oD+1Ffs9zOwIPpYhnj8jTuc97u4UPg6EoD8jTuc9Lm4IPrYtnj/uXs495U4kvuPCpT/uXs49giYdvoUgoz/uXs49jJDwvac6nD/uXs49KBnPvWplmj8jTuc9HgoyPfV/lj/uXs49sBowPaG5lj/uXs491y+CPa6elz/uXs49VpDwPac6nD/uXs49kvIGPhVSnj/uXs49yk4kPuPCpT/uXs49cqQoPix9qD/uXs49w04kPkfEsD/uXs49ZyYdPqVmsz8jTuc9JDXzPch2uj/uXs49VpDwPYNMuj8jTuc951/RPUNRvD/uXs495RjPPcAhvD8jTuc9jwoyvTUHwD/uXs49HhswvYnNvz/uXs49DzCCvX3ovj/uXs49jJDwvYNMuj/uXs49s/IGvhU1uD/uXs495U4kvkfEsD8jTuc9B38qvtwRrj/uXs49jKQovv4Jrj/eJAY+bnb6vVfsoz/eJAY+ZA0Cvp1Gpj/eJAY+13AMvm6Goz/eJAY+vOwSvnkBpj/eJAY+ZA0Cvo1AsD/eJAY+tAcFvnHJrT/eJAY+t4fzvY1Ftz/eJAY+Mfffvcuctj/eJAY+u8DbvZf/uD/eJAY+fdzNvWwhuD/eJAY+fqh3vbfRvD/eJAY+n0mgvW7Auz/eJAY+3+hqvRzruj/eJAY+H9uXvTEluj/eJAY+3+hqvRzruj/eJAY+n0mgvW7Auz/eJAY+2CHAPQd8uj/eJAY+35K1PRdDuT/eJAY+eMDbPZf/uD/eJAY+R9zNPWwhuD/eJAY+35K1PRdDuT/eJAY+K3b6PdSasj/eJAY+Qg0CPo1AsD/eJAY+tnAMPrwAsz/eJAY+m+wSPrGFsD/eJAY+Qg0CPp1Gpj/eJAY+ouwSPnkBpj/eJAY+mQcFPg6+qD/eJAY+DuIWPv6aqD/eJAY+mQcFPg6+qD/eJAY+ouwSPnkBpj/eJAY+gofzPZ5Bnz/eJAY+/PbfPV/qnz/eJAY+hsDbPZSHnT/eJAY+R9zNPb5lnj/eJAY+/6d3PXS1mT/eJAY+aEmgPb3Gmj/eJAY+buhqPQ6cmz/eJAY+59qXPfphnD/eJAY+DyLAvSQLnD/eJAY+F5O1vRNEnT/eJAY+u8DbvZSHnT/eJAY+fdzNvb5lnj/Ijq69r7cIvnmvpj/uXs69THMGvs7Cpj/Ijq69DsMCvnx+pD/uXs691pcAvv6apD/Ijq69ICvIvdfAnj/uXs69b9nEvez1nj/Ijq69iFKsvT46nT/uXs69F3epveJ1nT/Ijq69PYgSPbosmj/uXs69PxoQPSV1mj/Ijq69wKZYPRzrmj/uXs69Hg9VPZQwmz/Ijq695yrIPdfAnj/uXs69P9nEPez1nj/Ijq69spLgPXx+oD/uXs69itncPQisoD/Ijq69jrcIPnmvpj/uXs69MXMGPs7Cpj/Ijq692lIMPnP0qD/uXs69Q/8JPkf+qD/Ijq69jrcIPrLXrz/uXs69K3MGPlzErz/Ijq6988ICPq8Isj/uXs69u5cAPi3ssT/Ijq693yrIPVTGtz/uXs69N9nEPT6Rtz/Ijq69T1KsPexMuT/uXs6933apPUkRuT/Ijq69rogSvXBavD/uXs69sBoQvQUSvD/Ijq69LqdYvQ6cuz/uXs69jw9VvZdWuz/Ijq69ICvIvVTGtz/uXs69d9nEvT6Rtz/Ijq696JLgva8Itj/uXs69wNncvSPbtT/Ijq69r7cIvrLXrz/uXs69THMGvlzErz/Ijq699VIMvriSrT/uXs69Xf8JvuOIrT/eJAa+iFzDvUz9sD/eJAa+l+HKvbsnrz/eJAa+l+HKvXBfpz/eJAa+zDPlvbIppz/eJAa+vIbPvfBLqT/eJAa+DWHrvb4wqT/eJAa+vIbPvfBLqT/eJAa+zDPlvbIppz/eJAa+N/S9vZ/loT/eJAa+kLGuva1poj/eJAa+H2irvTuNoD/eJAa+b5KgvZI6oT/eJAa+H2irvTuNoD/eJAa+kLGuva1poj/eJAa+vzo3vdgNnz/eJAa+PgH5vJaVnj/eJAa+p6CNPXlYoD/eJAa+OJKgPZI6oT/eJAa+R1zDPd+JpT/eJAa+YOHKPXBfpz/eJAa+YOHKPbsnrz/eJAa+ljPlPXhdrz/eJAa+hobPPTo7rT/eJAa+hobPPTo7rT/eJAa+//O9PYyhtD/eJAa+T7GuPX0dtD/eJAa+52erPfD5tT/eJAa+MJKgPZhMtT/eJAa+52erPfD5tT/eJAa+T7GuPX0dtD/eJAa+Tjo3PVN5tz/eJAa+PAD5PJXxtz/eJAa+4KCNvbEutj/eJAa+b5KgvZhMtT/eJAa+H2irvfD5tT/eJAa+4KCNvbEutj8jTuc9J69MtIbElT/uXs49hABNtCoAlj8jTuc9fZGzPLbzlT/uXs49vZ2xPAUvlj/uXs49sY+DtAGHwD8jTuc9f5KzvHSTwD/uXs49vp6xvCVYwD/eJAY+0J0fPR+Fuz/eJAY+UD4oPSOhvT/eJAY++2uhPHnkuz/eJAY+PyCqPPMfvj/eJAY++2uhPHnkuz/eJAY+UD4oPSOhvT/eJAY+Pp4fvQ0Cmz/eJAY+vj4ovQjmmD/eJAY+/WyhvLGimj/eJAY+GyGqvDhnmD/eJAY+/WyhvLGimj/eJAY+vj4ovQjmmD/Ijq69HOJRtGSSmT/uXs69pEhStG7dmT/Ijq69PcqTPA65mT/uXs69AFeRPMQDmj/Ijq69CB+BtMf0vD/uXs69xOuAtL2pvD/Ijq69HsuTvBzOvD/uXs693FeRvGaDvD/eJAa+XAD5PJaVnj/eJAa+wDoDPTDwnD/eJAa+fdF7PDRLnj/eJAa+nbKEPI+NnD/eJAa+fdF7PDRLnj/eJAa+wDoDPTDwnD/eJAa+PgH5vJXxtz/eJAa+PjsDvfqWuT/eJAa+QNN7vPc7uD/eJAa+nrOEvJz5uT/eJAa+QNN7vPc7uD/eJAa+PjsDvfqWuT97HUy8/wmQvQAAAABPpS+9t/uXvQAAAAC9xYO8P2d5vQAAAACfIG69sPWQvQAAAAAcdoG8upvnvcBj0jzfJXK9kubPvd13zTwfC5m8w7TkvfkcLzwfeIO9P53MvXlxKDxfaWA98PPGvQAAAACYBKA9L+zLvQAAAACuiGA9onzhvQAAAACXTaA9I0vmvQAAAAC6oSk+LwDAvQAAAADG3BU+JzS7vQAAAAD7dx0+f8uSvQAAAAAEdA8+V+aevQAAAAAe+WI9LglZPQAAAACfyGE9aMWHPQAAAAD3PqE9329iPQAAAADXhKA9lzCLPQAAAAD3PqE9329ivQAAAABx//E97oJ2vQAAAADXhKA9lzCLvQAAAAAyAuo9xySTvQAAAACQTaI9fqYzPTumzTwwNKI9EEw0PfeqNjxstPw9nY9NPd0dwjxEpvw9z0ROPYCpNjzAOqO9dwupPb+MIzwn3Za9VxKnPbuCyTwfeIO9P53MPXlxKDzfJXK9kubPPd13zTzfX2E9FAP5PT9g1DxP8qA9Bg39Pf88zjz+IWE9TFL5PXirNjz/2KA93V/9PfeqNjyYBKA9L+zLPQAAAACXTaA9I0vmPQAAAADOw+k9pRTUPQAAAACRgPE9vFruPQAAAAB79Eq8/5e9PQAAAAAvnS69sPS3PQAAAAB/h4K8Ef/QPQAAAACP8Gu9x2rAPQAAAAD7In68HstEPRyazjx+gnK94Gp6Pd0LyTx+eZm8vyZPPXcbKzxAiIS9/wWEPb9vIzxP8qA9Bg39vf88zjz/2KA93V/9vfeqNjyI9Ps92lMCvh2pwjxT5vs98YACvj+pNjzAOqO9dwupvb+MIzwn3Za9XxKnvbuCyTxAiIS9/wWEvYBvIzx+gnK94Gp6vd0LyTwNu2Q9gOUlvVzD0zyQTaI9fqYzvTumzTz/fGQ9HoQmvXirNjwwNKI9EEw0vfeqNjwuNyg+KK+FPV5/tzxZNSg+MBGGPb2nNjxrKzY+QGjCPbsetDxrKzY+h8zCPTynNjw6Aye8DrszPa5RRz0usgY9kNIkPSCgRz3/Bp+7sEokPb/5lD0uCRk9j445PbDalj3ejvE87+zCPQAAAAC/gvI8Bz2mPQAAAAA/8je8L86mPQAAAAC5qza8i1DsvU7jST1+BQM9eVz0vUAzST1+k9K7LnXwvdd4lj3uhRU9X+rnvRfelz0fxfM8QEOJvQAAAAC/gvI8Bz2mvQAAAAA/8je8L86mvQAAAAB87fs8IojzvbuW1TzfX2E9IQP5vR9g1Dw9vGE9Ko34vf9pRD187fs8IojzPduW1Tx+BQM9a1z0PVAzST09vGE9Ko34PQ9qRD3ejvE87+zCvQAAAAD+4GA9T3unvQAAAABfaWA98PPGPQAAAAD+4GA9T3unPQAAAACO9QA9Xsgpvb0s1DwusgY9kNIkvSCgRz0+F2U9bvokvS4wQz2O9QA9XsgpPd4s1DwNu2Q9gOUlPVzD0zw+F2U9bvokPS4wQz1rKzY+qAnCvU7sAz2hMCg+t5C+vf+hMD2vISg+amf4vS9vCz3iPx0+OUXnvb8SMT333sA9CVAqtFg8eT8X1689jSQ3tHkBhj8zUh8+EwMAPxuQUT/YSS0+5asIP2CCSz8b89o9TZkLP+MlVD/NBQ4+gycQP+b1TD8b89o9UJkLv+AlVD/NBQ4+hicQv+P1TD8zUh8+GAMAvxmQUT/YSS0+6qsIv12CSz+/uCQ+su4Mv6+ORz/YSS0+6qsIv12CSz8OQAI9f2BGPfgotz3PHBi97DDbPY/huD1fOy69LdHZPSBnlj0fJf08eZPfvaAtuD0+3BC9vlxIvWiMtz2QCCi9L39PvYcUlT3Ijq69eif1vf1qoj/Ijq69X4qNvUHxmz/Ijq69HsuTvA65mT/Ijq69HOJRtGSSmT/Ijq69J4qNPUHxmz/Ijq69RCf1Pf1qoj/Ijq69R4oNPpZDqz/Ijq69Nyf1PS4ctD/Ijq69J4qNPeqVuj/Ijq69HMqTPBzOvD/Ijq69Z4qNveqVuj/Ijq69eif1vS4ctD/Ijq69YooNvpZDqz9PgBw9iboKvnhAoT9PgBw9of0Tvheaoz9PgBw9qDCgvS3smT9PgBw9FwfDvRNhmz+u0Ug9gG+pvLjHlj+uw0k98dlNtBaflj9PgBw9bzCgPS3smT9PgBw9rzJ1PfTDmD9PgBw9broKPnhAoT9PgBw9Iir+PRYTnz9PgBw9azAgPpZDqz9PgBw9INAePnamqD9PgBw9broKPrJGtT9PgBw9f/0TPhPtsj9PgBw9ZzCgPf6avD9PgBw93wbDPRcmuz9PgBw987aCtM9Jvz9PgBw9O0OnPJIdvz9PgBw9qDCgvf6avD9PgBw9HjN1vTfDvT9PgBw9iboKvrJGtT9PgBw9WCr+vRR0tz9PgBw9jTAgvpZDqz9PgBw9OtAevrXgrT9PgBy9k5QPvq0SsD9PgBy9I1MJvthfsj9PgBy9HzfSveRmuD9PgBy9z/i0vSUBuj8AAAAA2CcVPoVCsD9PgBy9eJQPPq0SsD8AAAAApTiCtP+Qvj8AAAAA4GqavWmMmj8fQAE98MATPQ3glT+8WPs8oKwVPcYzlD8fQAE9XsETvQ3glT+8WPs8/qwVvcYzlD9/Wza9dp1KtOFAlD/efTS9g3RNtAhVlj/ecgU9riEiPQ0akj9cdfk8zrMWPTP5kj/ecgU9DiIivQ0akj9cdfk8L7QWvTP5kj/vhEe9srBHtAAdkj9AsDi968xItBPtkj/X1bQ9GeHiPQzLzz7Hirs90R7kPZMbvT6vq7Y9xVPkPSdLrT79tnE8ToDhvfngvD688pE8h6XhvbA7tT6v9JE9Xn7cPZYIGD9gAZg9DpvdPW2pDz+oNpI9Pe/bPSY6Gz/v2KA9b9UIvdkIGD+HbKY9v8wPvaCpDz8vBaE9XDb8vFg6Gz+YT6Y9kjjgPbnh9z5AnrM9XjYgvYvg9z648Ze91yySvVa6Dz9/GlS9z8wOvfq3Dz9gAZg9G5vdvW2pDz9/qss9z9WSvSKnDz9fnZC9XdLEPOxpHz8vDIm9YBL8PFc+Gz8nAoy9X+fbPTY+Gz+4dpO9S/naPctpHz8nAoy9eufbvTY+Gz8HOLu9oHSNve4+Gz/ImJw9H6fTvUIIMD8S9s29AAAAAOEpKD+nvMm9AAAAAGwGMD+X/p09cO9AtNQrjT/deNc9oONxvaMFMD8631k8/xDRvVxyhD8631k8yhDRPVxyhD966ks8kUEDPlPLgj9X+I+9/xDRvVxyhD+/OY69rEEDvlPLgj/u/WW9jMSbPiJDbz9fpyK9Z2+nPgpHbD+XCYa91VeAvh0Wdj9vE4S9FmKPvmhecj9vE4S9DGKPPmlecj+XCYa9y1eAPiAWdj+QhmO9ouqovpB9fD8PgSC9pjy0vhb6eD8vXYS91CKMvoL/gT8nfYK9ecWcvqjZfz9/xR08ymNPvnKKhj/vKoq9Q2lBvj3ofT/euyg9tbvgvk6bXT/7VNo8Q2vWvvs+YD+uzkY9ibjoPh1yWz+vkE899D7tPkcoWj9ewio9zhfsvtOlZz+/2VE9zmL4Pnj8Yz9vzEg9WubzPkRMZT9vzEg9ZObzvkNMZT9ewio9xBfsPtSlZz+dyN48KRLiPhjCaj/xhA4+vQztPgZ0Xz+u7wM+YGD1PmwTYz/Pymw9DkACP1i1WD/fRYo931r8PoMIVT/Pymw9EkACv1e1WD/3LYw9PGQDv8oRXj/xhA4+xwztvgR0Xz+qRQQ+7ZXqvtwkWj/8C3O8jxWyvfzGjz+I2qy9d9GmPXKKjj/8C3O8WBWyPfzGjz/gBmY9R6KmPfYLjj+/Cps9IEwzPcstjT9YyMy9cIYzPV66jT8iqtC9zqlBtCS0jT9YyMy9zYYzvV66jT9QIcI957Whveatmj4A9609bgM+ve6zmj4tvjQ94/r3vQK7mj6Hb6Q9o43jvaOtmj5/uw88ZtfyPRsPFj4A1MS8hSDcPQcjFj5uSl09T3mhPWeZFT4+liw93j3gPSDUFT5/O8u7j28/Pd3rZD49Obe8DtNEPWeZFT40Z0k6jjoevcWM0D2vhwK9AMtHvUru0D0/wQm9kBLbvWg/0j3vqzK9GDOfvaet0T3dXx0+uAiRve1AMD2Uwvw9T4xzPbCcUz3dXx0+sAiRPe1AMD3eJAY+F6a1vczRrz/eJAY+V1WPvTS6rz/eJAY+F6a1vbO1pj/eJAY+sFqQvSUGqT/eJAY+V1WPvfbMpj/eJAY+SJ6svZF5oD/eJAY+qL6tvUC8nj/eJAY+B3SNvUhQoD/eJAY+j5WQvU5Fnj/eJAY+qL6tvUC8nj/eJAY+3kdVva+xrz/eJAY+38QNva+xrz/eJAY+f3ZUvULnsT/eJAY+f3ZUvULnsT/eJAY+38QNva+xrz/eJAY+3kdVvXzVpj/eJAY+38QNvXzVpj/eJAY+bigXvYp2nT/eJAY+v8ERvRDpnz/eJAY+X+leve3TnT/eJAY+X+leve3TnT/eJAY+MoN0tKK0rz/eJAY+3oSNvFKzrz/eJAY+3oSNvNjTpj/eJAY+0HxftInSpj/eJAY+BzFbtO4lnT/eJAY+K01gtDC7nz/eJAY+ILCYvDo7nT/eJAY+ILCYvDo7nT/eJAY+/IONPFKzrz/eJAY+bsQNPa+xrz/eJAY+/IONPNjTpj/eJAY+bsQNPXzVpj/eJAY+Pq+YPDo7nT/eJAY+ACgXPYp2nT/eJAY+v86SPKPHnz/eJAY+/nVUPULnsT/eJAY+cEdVPa+xrz/eJAY+sPONPTHrsT/eJAY+IFWPPTS6rz/eJAY+cEdVPa+xrz/eJAY+IFWPPfbMpj/eJAY+cEdVPXzVpj/eJAY+7uhePe3TnT/eJAY+UJWQPU5Fnj/eJAY+2HONPUhQoD/eJAY+HwBYPYYboD/eJAY+UJWQPU5Fnj/eJAY+QNPcPbn8rz/eJAY+36W1PczRrz/eJAY+sIfgPcrgqD/eJAY+J723PWH4qD/eJAY+QNPcPXKKpj/eJAY+36W1PbO1pj/eJAY+QNPcPXKKpj/eJAY+D56sPZF5oD/eJAY+b76tPUC8nj/eJAY+GHfIPYxnoD/eJAY+r5HBPVoqnz/eJAY+b76tPUC8nj/eJAa+p6+NvfG1pz/eJAa+nplfvUvIpz/eJAa+T3JdvdcSpj/eJAa+lzyLvdb/pT/eJAa+nplfvUvIpz/eJAa+p6+NvTnRrj/eJAa+rplfvd++rj/eJAa+aIWHvWsJtT/eJAa+Lo1hvSdmtT/eJAa+3qpcvTHOsz/eJAa+aIWHvWsJtT/eJAa+/1smvdrOpz/eJAa++yjdvNrOpz/eJAa+n7glvcoVpj/eJAa+PyvdvOAQpj/eJAa+/1smvVK4rj/eJAa++yjdvFK4rj/eJAa+gM7rvF8Htj/eJAa+Ht8tvaC+tT/eJAa+H9totI7Mpz/eJAa+/cRcvInNpz/eJAa+H9totI7Mpz/eJAa+gEtdvKILpj/eJAa+/cRcvKG5rj/eJAa+4yRrtJ26rj/eJAa+tWtptEz9rD/eJAa+/cRcvKG5rj/eJAa+UT58tElGtj/eJAa+9zFuvJM1tj/eJAa+gAZlvLA4tD/eJAa+9zFuvJM1tj/eJAa+fxt7tIVCtD/eJAa+vUldPKILpj/eJAa+OsNcPInNpz/eJAa+XSrdPOAQpj/eJAa+HyjdPNrOpz/eJAa+OsNcPInNpz/eJAa++cJcPKG5rj/eJAa+HyjdPFK4rj/eJAa+vi9uPJM1tj/eJAa+ns3rPF8Htj/eJAa+fARlPLA4tD/eJAa+ns3rPF8Htj/eJAa+LrglPcoVpj/eJAa+j1smPdrOpz/eJAa+3nFdPdcSpj/eJAa+MJlfPUvIpz/eJAa+3nFdPdcSpj/eJAa+j1smPdrOpz/eJAa+MJlfPd++rj/eJAa+j1smPVK4rj/eJAa+MJlfPd++rj/eJAa+P/smPUf+rD/eJAa+nd4tPaC+tT/eJAa+wIxhPSdmtT/eJAa+Xz6sPYWUpz/eJAa+v6+nPZXUpT/eJAa+b6+NPfG1pz/eJAa+b6+NPfG1pz/eJAa+v6+nPZXUpT/eJAa+DyKvPQggrT/eJAa+91CPPa4NrT/eJAa+Xz6sPaXyrj/eJAa+b6+NPTnRrj/eJAa+Xz6sPaXyrj/eJAa+91CPPa4NrT/eJAa+P6SGPcCtsz/eJAa+J4WHPWsJtT/eJAa+2FycPde7sz/eJAa+2PuWPT2ztD/eJAa+J4WHPWsJtT8/ZpA8ByTBPZ5ejT/wfgU9sMm6PR1VjT/gIZG9qCrBvQVujT+wRLC9v7fCvYrIiD9P+ZG9iEPEvXEghD98ts+8gMfEvUuTgj/FeT46jePxPRAIMD+nvMm9oONxvWwGMD/ImJw9BKfTPUIIMD/deNc9b+NxPaMFMD8r2tw9AAAAAJsDMD/eJAY+oOWmPXfzvD/eJAY+YEmgPW7Auz/eJAY+IgMkvpZDqz/eJAY+bjsYvpZDqz8jTue9vjIOPSmumj+1Ffu9D7AMPQ7bmj+1Ffs9P68yPaBslj+1Ffs9va8yvYoawD/eJAY+PyUuPZl8lz/eJAY+YD4oPQjmmD8jTue9eqwEvuHRpj+1Ffu9xUMDvgHepj+1Ffs985gsvpZDqz8jTuc9TvkrvpZDqz/eJAa+v9UHvciwuj/eJAa+PjsDvfqWuT/eJAa+PtUHPWLWmz/eJAa+wDoDPTDwnD/eJAa+M9H2vf8Epz8jTue9LzMOvQHZuz+1Ffu9gLAMvR2suz+1Ffs9uJisPbryvT8jTuc9KPmrPVzhvT/eJAY+sCUuvZEKvz/eJAY+zj4ovSOhvT/uXs49nVATvt+hoD/uXs49xxqqvZTZmD/uXs49jxqqPZTZmD/uXs49glATPt+hoD/uXs49fxoqPpZDqz/uXs49e1ATPkvltT/uXs49hxqqPZatvT/uXs49xxqqvZatvT/uXs49nVATvkvltT/uXs49oRoqvpZDqz/eJAY+dtPcvXKKpj/eJAY+qvvWvVlMpD/eJAY+dtPcvXKKpj/eJAY+bnb6vVfsoz/eJAY+5YfgvWGmrT/eJAY+dtPcvbn8rz/eJAY+UHfIvZ8ftj/eJAY+75HBvdBctz/eJAY+Lp4fvR+Fuz/eJAY+fqh3vbfRvD/eJAY+zj4ovSOhvT/eJAY+fqh3vbfRvD/eJAY+Lp4fvR+Fuz/eJAY+35K1PRdDuT/eJAY+Z76tPerKtz/eJAY+R9zNPWwhuD/eJAY+r5HBPdBctz/eJAY+Z76tPerKtz/eJAY+dfvWPdE6sj/eJAY+QNPcPbn8rz/eJAY+K3b6PdSasj/eJAY+Qg0CPp1Gpj/eJAY+/PbfPV/qnz/eJAY+GHfIPYxnoD/eJAY+R9zNPb5lnj/eJAY+wJ0fPQ0Cmz/eJAY+YD4oPQjmmD/eJAY+/6d3PXS1mT/eJAY+wJ0fPQ0Cmz/eJAY+F5O1vRNEnT/eJAY+qL6tvUC8nj/eJAY+fdzNvb5lnj/eJAY+55HBvVoqnz/uXs69ShfxvViQoj/uXs69lzGLvSIynD/uXs69XzGLPSIynD/uXs69FBfxPViQoj/uXs69azELPpZDqz/uXs69BxfxPdP2sz/uXs69XzGLPQhVuj/uXs69nzGLvQhVuj/uXs69ShfxvdP2sz/uXs69jTELvpZDqz/eJAa+l+HKvbsnrz/eJAa+iFzDvUz9sD/eJAa+oD6svaXyrj/eJAa++K+nvZaysD/eJAa+oD6svaXyrj/eJAa+RyKvvSNnqT/eJAa+l+HKvXBfpz/eJAa+oD6svYWUpz/eJAa+kLGuva1poj/eJAa+D12cvVPLoj/eJAa+b5KgvZI6oT/eJAa+F/yWve3ToT/eJAa+PgH5vJaVnj/eJAa+vzo3vdgNnz/eJAa+gM7rvMt/oD/eJAa+Dt8tvYrIoD/eJAa+gM7rvMt/oD/eJAa+J4WHPb99oT/eJAa+4PuWPe3ToT/eJAa+OJKgPZI6oT/eJAa+J4WHPb99oT/eJAa+YOHKPbsnrz/eJAa+T7GuPX0dtD/eJAa+MJKgPZhMtT/eJAa+PAD5PJXxtz/eJAa+Tjo3PVN5tz/eJAa+ns3rPF8Htj/eJAa+b5KgvZhMtT/eJAa+F/yWvT2ztD/eJAa+b5KgvZhMtT/eJAa+aIWHvWsJtT/eJAY++2uhPHnkuz/eJAY+Pq+YPPBLuT/eJAY+0J0fPR+Fuz/eJAY+7ycXPfUQuT/eJAY+Pp4fvQ0Cmz/eJAY+bigXvYp2nT/eJAa+PzBuPJdRoD/eJAa+XAD5PJaVnj/eJAa+ns3rPMt/oD/eJAa+XAD5PJaVnj/eJAa+PzBuPJdRoD/eJAa+9zFuvJM1tj/eJAa+PgH5vJXxtz/eJAa+PgH5vJXxtz8d/fQ8bxhfvQAAAAC/pfU8QQnzvb7HNDwdQvE8ZcbbvQAAAABZah0+upvnvQAAAAAsZw8+l6rUvQAAAAAd/fQ8bxhfPQAAAAAfxfM8QEOJPQAAAABAiIS9/wWEPb9vIzx+gnK94Gp6Pd0LyTy/pfU8QQnzPf7HNDwsZw8+l6rUPQAAAABZah0+upvnPQAAAAAdQvE8ZcbbPQAAAAB+7vo88NQsPXjHMzxTHyg+78j4vVzgtzx+HSg+cyr5vXynNjx+7vo88NQsvXjHMzx+HSg+cyr5Pb2nNjxTHyg+78j4PXzgtzzNj0+9cCqoPQAAAADNj0+9cCqovQAAAABAeGI9v2TjvVd1iT1XF6E9NJv8PS4kOD2HGaA9T32rvQAAAAB3cqI9LsMyva/2Nj1O/GQ9brFNPTexiD3NOSg+H06Fvf+sCj2qRQQ+45XqPt8kWj/3LYw9N2QDP80RXj8PIco9Ftn/vu0RYj8wTsk9trPxvlwXVj/pKRI+CX0RvxRUSD/oiAw+4kcNv4rbSD8O+QY9T+NFPdKN0D2PjzE973mhPTT30D3vqzK9GDOfPaet0T0/wQm9gxLbPWg/0j2vhwK9AMtHvUru0D3YJIa91ZgLvpGWpj/YJIa9d2LMvVZ9nj/YJIa9vp4VvVLQmT/Ijq69rogSvbosmj/YJIa9YJ4VPVLQmT/YJIa9QGLMPVZ9nj/YJIa9u5gLPpGWpj/YJIa9u5gLPpnwrz/YJIa9QGLMPdQJuD/YJIa9T54VPdi2vD/Ijq69LYgSPXBavD/YJIa9zp4Vvdi2vD/YJIa9d2LMvdQJuD/YJIa91ZgLvpnwrz/YJIY9zbYevrrypT9PgBw9Ursavs4Upj/YJIY961/ovbq9nD9PgBw9v4rivckanT/YJIY9Lhwqvd9slz9dxCM9rucmvcaFlz9dxCM9QOcmPcaFlz/YJIY9wBsqPd9slz/YJIY9tl/oPbq9nD9PgBw9ioriPckanT/YJIY9srYePrrypT9PgBw9OLsaPs4Upj/YJIY9q7YePnCUsD9PgBw9OLsaPlxysD/YJIY9qF/oPXHJuT9PgBw9fIriPWFsuT/YJIY9sBsqPUwavz9PgBw939YlPdSavj/YJIY9PhwqvUwavz9PgBw9YNclvdSavj/YJIY961/ovXHJuT/YJIY9zbYevnCUsD9PgBw9nzJ1PTfDvT9PgBw9FSr+PRR0tz9PgBw9XUSnvJIdvz9PgBw9EDN1vfTDmD9dxCM9QOcmPcaFlz/yG6A3UEQ1PaommD9dxCM9rucmvcaFlz+u0Ug9gG+pvLjHlj9vrEi934mbvHZsmD/Pn0m91hxQtMdGmD+/JnA9PbILPW4ztT6fEMc9z007PW8rtT688pE8eqXhPbA7tT7+C7s7MNidPS0+tT7eWds9n4ChPcQntT4gubs9FXDkPZkptT7e7l093H/5PagytT5/kTY9I9j4vYWUzz7/cwU7mK3gvRRdzz4im086JxH2PR08Gz9/qss9t9WSPSKnDz+AeNc7nI2TvGA8Gz8g3lm9VR3dvdi3Dz+7HtO8Q+LevQyw9z4Qq7S9AAAAAPmBIz9+R7M7AAAAAAnCIT/385i9TpTZPTDxIz8Y9cu9riR9PTDxIz9fnZC9vdLEvOxpHz8vDIm9uxL8vFc+Gz8UJ/g3sOr3vTDxIz8Qq7S9AAAAAPmBIz8Y9cu9riR9PTDxIz/PV789TolHvTY8eT8HfN49AAAAAIkmKD/7itu80KLAvVLyjj/gIZG9qCrBvQVujT98ts+8gMfEvUuTgj+8gqU8R0LEvdEdhD+8gqU8F0LEPdEdhD+P6Ao9b7LCPb68iD+wRLC9v7fCvYrIiD9P+ZG9iEPEvXEghD/A3QU8+zijvsQmfj+AKaY8z5OcvtZydz8fG9q8jKmTPiWFbj/tu369ntmVPlDCcD9g2Xu9XCyjPuArfj/ca9q82WqlPsoygD/tu369qNmVvk/CcD8fG9q8lqmTviOFbj8frJa9n4CcPq93dz/tu369ntmVPlDCcD/ca9q842qlvsoygD9g2Xu9Ziyjvt8rfj8frJa9qYCcvq53dz/A3QU88TijPsYmfj+AKaY8xZOcPthydz+/eOm8AxqOvmMogz9+DPo71CKMvoL/gT/3cys8L2lBPkDofT/vKoq9Q2lBvj3ofT8/Rjs9R6bkvpWTXD8/F4k9iqPcvpGvXD9nfsI96STcvtWXZT/gvbM9W+jjvvrvaT8/Rjs9PabkPpiTXD8/F4k9gKPcPpSvXD/gvbM9UejjPvzvaT9nfsI93yTcPtaXZT9PID09yeLvvgN9Zj8fhB89GUnsvsrzYD8fhB89D0nsPs3zYD9PID09v+LvPgR9Zj8/KYk9fMrrvg7caT8/KYk9csrrPhDcaT9vLOg9DC3hPvKkXT9dW1w9uZj9PnR2Yj9/x1k9EYbyvqOnWD/fRYo96lr8voEIVT/S++Y9DpnsviFaZz+u7wM+amD1vmkTYz9eT069fgeuPuqRcj9OTUg9CarFPipvcz/PxUo9fFi5vgfjZz8iqtC9zqlBtCS0jT9vXLa9lZdFtByUkD8gf4g80GnhvTttrT5/nRI8b2ngvbnHmj5P5kQ9//0PPSC4mj4/Uic8jvY5Pfm8mj5uSl09V3mhvWeZFT4+liw93j3gvSDUFT5/uw88c9fyvRsPFj4+b++8vxxHvaXa5z3sMvw9Wi3wvT/4VD0fZ6I9v89aPe76ez2n76E9+HyqPbDiiT3eJAY+qvvWvdE6sj/eJAY+5YfgvcrgqD/eJAY+dtPcvXKKpj/eJAY+YL23vWH4qD/eJAY+SJ6svZF5oD/eJAY+SHfIvYxnoD/eJAY+SHfIvYxnoD/eJAY+8PONvTHrsT/eJAY+3kdVva+xrz/eJAY+B3SNvUhQoD/eJAY+j5WQvU5Fnj/eJAY+fwBYvYYboD/eJAY+X8YNvdDtsT/eJAY+BzFbtO4lnT/eJAY+Pq+YPDo7nT/eJAY+K01gtDC7nz/eJAY+3sUNPdDtsT/eJAY+bsQNPa+xrz/eJAY+/nVUPULnsT/eJAY+ACgXPYp2nT/eJAY+7uhePe3TnT/eJAY+TsERPRDpnz/eJAY+D56sPZF5oD/eJAY+2HONPUhQoD/eJAY+b76tPUC8nj/eJAa+p6+NvfG1pz/eJAa++K+nvZXUpT/eJAa++K+nvZXUpT/eJAa+p6+NvfG1pz/eJAa+RyKvvQggrT/eJAa+oD6svaXyrj/eJAa+OFGPva4NrT/eJAa+d6SGvcCtsz/eJAa+F12cvde7sz/eJAa+aIWHvWsJtT/eJAa+F/yWvT2ztD/eJAa+F12cvde7sz/eJAa+n7glvcoVpj/eJAa+/1smvdrOpz/eJAa+/1smvdrOpz/eJAa+/1smvVK4rj/eJAa+r/smvUf+rD/eJAa+rplfvd++rj/eJAa+Lo1hvSdmtT/eJAa+gEtdvKILpj/eJAa+/cRcvInNpz/eJAa+/cRcvInNpz/eJAa+gM7rvF8Htj/eJAa+OsNcPInNpz/eJAa+vUldPKILpj/eJAa+H9totI7Mpz/eJAa+4yRrtJ26rj/eJAa++cJcPKG5rj/eJAa+tWtptEz9rD/eJAa+vi9uPJM1tj/eJAa+fARlPLA4tD/eJAa+fxt7tIVCtD/eJAa+vi9uPJM1tj/eJAa+j1smPdrOpz/eJAa+j1smPVK4rj/eJAa+b6+NPfG1pz/eJAa+MJlfPUvIpz/eJAa+wIxhPSdmtT/eJAa+J4WHPWsJtT/eJAa+UKpcPTHOsz83lcu9+AKnPUm6hj+8gqU8R0LEvdEdhD8fRCU92N7BvcQDgj+nvMm9AAAAAGwGMD93Tb69htcCtJZ5Pz9W/gM+/CMHvthCuD9W/gM+TSLxvbBVuj9W/gO+t9SFPZatuT9W/gO+sB1NPaikuj9W/gM+P5ckvhe3pT9W/gM+glwdvssQoz9W/gM+n/XPPfonvD9W/gM+9yurPdWyvT9W/gO+PxCMvNu/mj9W/gO+kNEKvaEtmz9W/gO++NSFvZTZnD9W/gO+Hh5NvYLimz9W/gM+/yurPVbUmD9W/gM+rPXPPTFfmj9W/gO+p0QFPpZDqz9W/gO++xwEPupzrT9W/gM+viOzPKFiwD9W/gM+wIwxPWLWvz9W/gM+f3MqvpZDqz9W/gM+9fgovjgQrj9W/gM+NyyrvdWyvT9W/gM+4vXPvfonvD9W/gM+2/goPvJ2qD9W/gM+JJckPhe3pT9W/gO+XQ+MPNu/mj9W/gO+L9EKPaEtmz9W/gM+2iMHPthCuD9W/gM+FyLxPbBVuj9W/gM+zYwxPciwlj9W/gM+cCyDPSCYlz9W/gM+Po0xvWLWvz9W/gM+pyyDvQvvvj9W/gM+3yOzPIkklj9W/gM+zYwxPciwlj9W/gO+Z5iiPZZ4uD9W/gO+MIi8PTQMtz9W/gO+Fh0EvkATqT9W/gO+9K8AvhPtpj9W/gM+f3MqvpZDqz9W/gM+9fgovvJ2qD9W/gO+oNEKvYpZuz9W/gO+Lh5Nvaikuj9W/gM+JJckPhPQsD9W/gM+Z1wdPmB2sz9W/gM+oCSzvIkklj9W/gM+Lo0xvciwlj9W/gO+L9EKPaEtmz9W/gO+vR1NPYLimz9W/gO+353mPfmgsz9W/gO+jlLTPQlttT9W/gO++xwEPkATqT9W/gO+0q8APhPtpj9W/gO++NSFvZatuT9W/gO+qJiivZZ4uD9W/gO+yUQFvpZDqz9W/gO+Fh0EvupzrT9W/gM+ZHMqPpZDqz9W/gM+2/goPjgQrj9W/gO+PQ+MPE/Huz9W/gO+H9EKPYpZuz9W/gO+v9SFPZTZnD9W/gO+Z5iiPZUOnj9W/gM+nyyDvSCYlz9W/gM+LyyrvVbUmD9W/gO+9K8AvhPtpj9W/gO+WxL2vZDapD9W/gO+w1LTvQlttT9W/gO+b4i8vTQMtz9W/gO+PxCMvE/Huz9W/gO+oNEKvYpZuz9W/gO+jlLTPSIaoT9W/gO+OIi8PfZ6nz9W/gM+4vXPvTFfmj9W/gM+TSLxvXsxnD9W/gO+FJ7mvTLmoj9W/gO+w1LTvSIaoT9W/gM+Z1wdPssQoz9W/gM+t3oTPtWQoD9W/gO+0q8APhearz9W/gO+JhL2PZussT9W/gO+FJ7mvfmgsz9W/gO+WxL2vZussT9W/gM+glwdvmB2sz9W/gM+0XoTvlX2tT9W/gO+353mPTLmoj9W/gO+JhL2PZDapD9W/gM+0XoTvtWQoD9W/gM+/CMHvlJEnj9W/gM+aCyDPQvvvj9W/gM+9yurPdWyvT9W/gM+uySzvKFiwD9W/gM+Po0xvWLWvz9W/gO+oJiivZUOnj9W/gO+b4i8vfZ6nz9W/gM+2iMHPlJEnj9W/gM+FyLxPXsxnD/eJAY+yBjuvdbFoT/eJAY+qvvWvVlMpD/eJAY+J+bPvSo6oj/eJAY+qvvWvVlMpD/eJAY+yBjuvdbFoT/eJAY+5g4GvpZDqz/eJAY+A9nhvZZDqz/eJAY+yBjuvVTBtD/eJAY+J+bPvQFNtD/eJAY+3+hqvRzruj/eJAY+bigXvfUQuT/eJAY+X+levT2zuD/eJAY+bigXvfUQuT/eJAY+39qXPTEluj/eJAY+WJWQPd1BuD/eJAY+Z76tPerKtz/eJAY+WJWQPd1BuD/eJAY+hRjuPVTBtD/eJAY+5OXPPQFNtD/eJAY+dfvWPdE6sj/eJAY+hRjuPVTBtD/eJAY+yw4GPpZDqz/eJAY+khjuPdbFoT/eJAY+wJ0fPQ0Cmz/eJAY+buhqPQ6cmz/eJAY+F9uXvfphnD/eJAY+F5O1vRNEnT/eJAY+j5WQvU5Fnj8jTue9f+ftvdWtoj8jTue94Mn9vZqxpD8jTue9t1qJvUFlnD8jTue9xzmnvb2knT8jTue9h1qJPUFlnD8jTue9bj5SPflmmz8jTue9POftPdWtoj8jTue9bu7ZPRPQoD8jTue9m1oJPpZDqz8jTue9YiwIPtEFqT8jTue9POftPVXZsz8jTue9ncn9PZDVsT8jTue9f1qJPeohuj8jTue9kDmnPW3iuD8jTue9wFqJveohuj8jTue93z5SvTEguz8jTue9f+ftvVXZsz8jTue9pO7ZvRe3tT/eJAa+SLe5veKqsj/eJAa+OCmivR5Qsj/eJAa+QCHRvZZDqz/eJAa+XymwvZZDqz/eJAa+SLe5vUjcoz/eJAa+OCmivQ03pD/eJAa+LuVsvS6onz/eJAa+Lo1hvQMhoT/eJAa+0ORsPS6onz/eJAa+wIxhPQMhoT/eJAa+J4WHPb99oT/eJAa+p6CNPXlYoD/eJAa+wIxhPQMhoT/eJAa+D7e5PUjcoz/eJAa+/yiiPQ03pD/eJAa+/SDRPZZDqz/eJAa+B7e5PeKqsj/eJAa+wORsPfzetj/eJAa+PuVsvfzetj/eJAa+aIWHvWsJtT/eJAa+4KCNvbEutj/eJAa+Lo1hvSdmtT/Ijq49jlAtPdwMlz/Ijq49ns2uPIyElj/Ijq49DlEtvU56vz/Ijq49f86uvJ8CwD/eJAY+Cnd+tJIFvD/eJAY+Je94tD1huT/eJAY+IalVtJmBmj/eJAY+BzFbtO4lnT/eJAa+fdF7PDRLnj/eJAa+NrNWtKQxnj/eJAa+6dFXtOFAoD/eJAa+QNN7vPc7uD/eJAa+9Wx9tIZVuD/cEvc83nE6vf3GMzub9py8rjddvf8aKzt8XvI8Vg7tvf7GNDsdkpu8hsfevQAcLzte5GA9gXrzvQCrNjv1byU+qff0vf2mNjv/CDM+B03Cvf2mNjt/BGQ9n2EzPQCrNjvcEvc83nE6Pf3GMzvs9vk9r6dYvfyoNjt7hSU+AHGJvf2mNjvs9vk9r6dYPfyoNjt7hSU+AHGJPf2mNjsn+4S994yJPf5vIzsYaqO9v7+pPfyMIzt8XvI8Vg7tPfzHNDte5GA9gXrzPQCrNjvQR/k9H4H/PfyoNjv1byU+qff0Pf+nNjsdkpu8hsfePf0cLzvcEvc83nE6Pf3GMzub9py8rjddPf8aKzvQR/k9H4H/vfyoNjt4rIO9cGvIvfxwKDsYaqO9v7+pvf+LIzvcEvc83nE6vf3GMzt/BGQ9n2EzvQCrNjv/CDM+B03CPf2mNjvfX0297t9jPc/LRT17HUy8/wmQPQAAAABPpS+9t/uXPQAAAABPaVC9Iy3VvW5hSD179Eq8/5e9vQAAAAAvnS69sPS3vQAAAABXF6E9QZv8vS4kOD3YYqE9yNLnvb5zfT1AeGI9v2TjPV91iT3YYqE9yNLnPb5zfT2fyGE9aMWHvQAAAACHGaA9T32rPQAAAABO/GQ9f7FNvTexiD13cqI9LsMyPb/2Nj0uNyg+KK+FvT1/tzxrKzY+QGjCvZsetDzfRYo96lr8voEIVT8eFwM9S3DfPbmO0T2vhwK9AMtHPUru0D1PgBy9k5QPvn10pj9PgBy9HzfSvUcgnj8uqyO93jUbPVfnmD9PgBy96jbSPUcgnj9PgBy9eJQPPn10pj/Ijq49ybQhvivZpT/Ijq492cDsvZp3nD/Ijq49/lAtvdwMlz/Ijq49o8DsPZp3nD/Ijq49rrQhPivZpT/Ijq49p7QhPv+tsD/Ijq49lsDsPZAPuj/Ijq49jlAtPU56vz/Ijq492cDsvZAPuj/Ijq49ybQhvv+tsD8uqyO93jUbPVfnmD+uw0k98dlNtBaflj8uqyO9TzYbvVfnmD+dPJs83+k1PSo7tT6dPJs83+k1PSo7tT6HbKY9jswPPaCpDz8vDIm9uxL8vFc+Gz8vMsg9AAAAAPWCIz8Qq7S9AAAAAPmBIz8Qq7S9AAAAAPmBIz/385i9aZTZvTDxIz/385i9TpTZPTDxIz+YGpY998q2vbw/ej8vMsg9AAAAAPWCIz8/ZpA8OCTBvZ5ejT9P+ZG9iEPEvXEghD8/ZpA8ByTBPZ5ejT//WhI85emVvhXAcD//WhI82+mVPhjAcD/tu369qNmVvk/CcD/oj7Q9k2rYvq0WYD/oj7Q9iWrYPq8WYD8/Rjs9R6bkvpWTXD8/Rjs9PabkPpiTXD+vkE89HD/tvkYoWj9fpyK9Z2+nPgpHbD88NdI8WA6zPlFJeT+wFJS92FtGtKIjkT8A9609XgM+Pe6zmj5PnzM9XydEvVFyFT49Obe8HtNEvWeZFT7eJAY+5YfgvcrgqD/eJAY+SJ6svZF5oD/eJAY+FzSvvUxsoj/eJAY+SHfIvYxnoD/eJAY+J+bPvSo6oj/eJAY+8PONvTHrsT/eJAY+Le9UvbwitD/eJAY+cNMOvQQ5tD/eJAY+m8+SvKPHnz/eJAY+P1mPvMQ9oj/eJAY+v8ERvRDpnz/eJAY+r+5UPbwitD/eJAY+3sUNPdDtsT/eJAY+79IOPQQ5tD/eJAY+d1qQPSUGqT/eJAY+J723PWH4qD/eJAY+KMaQPZZDqz/eJAY+D56sPZF5oD/eJAa+r6iIvV9epD/eJAa+OCmivQ03pD/eJAa++K+nvZXUpT/eJAa+OCmivQ03pD/eJAa+RyKvvQggrT/eJAa+OFGPva4NrT/eJAa+h+2PvZZDqz/eJAa+RyKvvQggrT/eJAa+sBYmvSVYpD/eJAa+/c7evMdGpD/eJAa+uJ9fvCtNsj/eJAa+/c7evGNAsj/eJAa+n2HjvHketD/eJAa+uJ9fvCtNsj/eJAa+wJ1fPCtNsj/eJAa+yxN4tGlSsj/eJAa+LrglPcoVpj/eJAa+PxYmPSVYpD/eJAa+XSrdPOAQpj/eJAa+HM7ePMdGpD/eJAa+PxYmPSVYpD/eJAa+/M3ePGNAsj/eJAa+d6iIPV9epD/eJAa+d6iIPV9epD94A6y9v8+2PcZQej9nBre9hgEQtPm8Uj9W/gO+k0tTtNSamj9W/gM+ToeDtCWSwD9W/gM+P5ckvhPQsD9W/gO+k0tTtNSamj9W/gM+sHoTPlX2tT9W/gM+ZfFMtAb1lT9W/gM+sHoTPlX2tT9W/gM+ZfFMtAb1lT9W/gO+9K8Avhearz9W/gO+TGqAtFfsuz9W/gO+TGqAtFfsuz9W/gO+9K8Avhearz9W/gM+P5ckvhPQsD9W/gM+ToeDtCWSwD/eJAY+13AMvm6Goz/eJAY+CeYDvtU+oT/eJAY+bnb6vVfsoz/eJAY+CeYDvtU+oT/eJAY+tAcFvnHJrT/eJAY+L+IWvi3srT/eJAY+5g4GvpZDqz/eJAY+CeYDvlZItT/eJAY+yBjuvVTBtD/eJAY+t4fzvY1Ftz/eJAY+3+hqvRzruj/eJAY+H9uXvTEluj/eJAY+X+levT2zuD/eJAY+h5WQvd1BuD/eJAY+YEmgPW7Auz/eJAY+39qXPTEluj/eJAY+2CHAPQd8uj/eJAY+39qXPTEluj/eJAY+hRjuPVTBtD/eJAY+K3b6PdSasj/eJAY+5+UDPlZItT/eJAY+UzsYPpZDqz/eJAY+mQcFPg6+qD/eJAY+DuIWPv6aqD/eJAY+yw4GPpZDqz/eJAY+7uUDPtU+oT/eJAY+khjuPdbFoT/eJAY+gofzPZ5Bnz/eJAY+l0mgvb3Gmj/eJAY+F9uXvfphnD8jTue9jz/CvYofnz8jTue9WD/CPYofnz8jTue9YKwEPuHRpj8jTue9YKwEPkq1rz8jTue9WD/CPaFntz8jTue9jz/CvaFntz/eJAa+fnvtvZZDqz/eJAa+XSxBvRCSnT/eJAa+Xgx6vWJnnj/eJAa++NyVPVpknz/eJAa+0ORsPS6onz/eJAa+7ytBPRr1uD/eJAa+8At6PckfuD/eJAa+bgx6vckfuD/eJAa+PuVsvfzetj/eJAa+L92VvdEitz/eJAa+L92VvdEitz/eJAa+PuVsvfzetj/Ijq49cHZNtFhWlj/eJAY+FmaBtOBKvj/eJAY+Cnd+tJIFvD/eJAY+PyCqPPMfvj/eJAY+PyCqPPMfvj/eJAY+/1NRtEs8mD/eJAY+IalVtJmBmj/eJAY+GyGqvDhnmD/eJAa+tyJVtM5rnD/eJAa+NrNWtKQxnj/eJAa+nbKEPI+NnD/eJAa+NrNWtKQxnj/eJAa+df1+tFwbuj/eJAa+9Wx9tIZVuD/eJAa+nrOEvJz5uT/eJAa+9Wx9tIZVuD8n+4S994yJvf1uIztvrKA9+bv3vf6pNjsI7aE9bxhAPQCrNjsI7aE9bxhAvf6pNjsI7aE9bxhAPQCrNjt4rIO9cGvIPf5xKDtvrKA9+bv3PQCrNjsn+4S994yJPf5vIzsI7aE9bxhAvf6pNjuQCCi9H39PPYcUlT0aMdO97w4/PQRWhj9W8QY+1cYIPxxQVz/ivCY+jokQP21ETD8zVAU+a+gCPwFbTj+/uCQ+re4MP7KORz/SQjA+9bIRPzvwRj/pKRI+BX0RPxdUSD8vMsg96qEKvy4UUD/pKRI+CX0RvxRUSD9vLCg+XA0Bv/mWVT8BTDk+OfsLvwV/Sz9+k9K7LnXwPdd4lj3841q7darxPce5uD36m8y6rs0ePYcotz36m8y6rs0evYcotz3/Bp+7sEokvb/5lD0+3BC9vlxIvWiMtz2QCCi9L39PvYcUlT3841q7gqrxvcC5uD1PgBy9P14TvqHWqD/YJIa9xEcPvv/nqD9PgBy9HdnrveDznz/YJIa9A07lvXxEoD/YJIa9XjddvfeSmj9vrEi9HYmbPHZsmD/YJIa9HeeWPK9amT9PgBy9l/i0PQWGnD/YJIa9f/OvPY3unD9PgBy9CFMJPlInpD/YJIa924MFPslZpD9PgBy9JF4TPomwrT/YJIa9okcPPiufrT/YJIa9zU3lPa9Ctj/YJIa94DZdPTT0uz/YJIa9HuiWvHssvT/YJIa9v/OvvZ6YuT/YJIa99oMFvmItsj/Ijq494PglvlCIqD/YJIY9teYivmyVqD/Ijq49m88EvoOGnj/YJIY9dloCvs7Cnj/Ijq49MCCAvU7ulz/YJIY9vYJ7vQ5KmD/YJIY9npGrPNnmlj/Ijq49R9HLPZOpmj/YJIY99wvIPTf4mj/Ijq49GqkaPp5Boz/YJIY9s8wXPqFnoz/Ijq49v/glPtr+rT/YJIY9k+YiPr/xrT/Ijq49ec8EPqcAuD/YJIY9VFoCPlzEtz/Ijq497x+APd2Yvj/YJIY9P4J7PRw9vj/YJIY9m5KrvFGgvz/Ijq49iNHLvZjduz/YJIY9LwzIvfOOuz/Ijq49PKkavo1Fsz/YJIY9zswXvoofsz8AAAAA2CcVPqZEpj8AAAAAR6gOPovgoz8AAAAA7/+7vYzzmz8AAAAAnroFPuCcoT8AAAAAhQH1PXuDnz8AAAAA72DavYidnT8AAAAAugH1vXuDnz8AAAAAumDaPYidnT8AAAAAv/+7PYzzmz8AAAAAwLoFvuCcoT8AAAAAYqgOvovgoz8AAAAAsGqaPWmMmj8AAAAAsFxsPaxumT9PgBw9OtAevnamqD8AAAAA8ycVvqZEpj8AAAAAGxcZvrW+qD8AAAAAABcZPnXIrT8AAAAAtmoaPpZDqz8AAAAAABcZPrW+qD8AAAAAWzyhPGZmvj9/Wza9dp1KtOFAlD/efTS9g3RNtAhVlj+ehi+9/v+oPDZUlD9fsDC9m4uiPNpylj+ARTE93umpPPKYlT9ucjA932WrPAETlD/9FaA4XjsmvbdAlj+NFgE5kDMqvYJWlD+OlD69XmO5PPcekj/vhEe9srBHtAAdkj8wYDC9oPerPED2kj9AsDi968xItBPtkj9/9Tw93ka5PH8Tkj+/JTE9P0asPLvtkj9t/Oi3r1U5vaMekj/4Seg4jh8svbgBkz9fR2g9X2ENPQthrT4ACJI8fmw3PXJsrT7+Wgw7FzOdPYDWvD4fNYI8HoczPWnfvD7ylNU9T8ShPcNKrT4Yj8E9L5U8PTJUrT79tnE8QIDhPfzgvD7/bFc9IXD5PZv+vD7+Wgw7JzOdvYDWvD7+C7s7QNidvS0+tT4wEmo97tcIvT/8vD4fNYI8PoczvWnfvD4/hLK9/0yQPesbGD+/2gg83P6rPBsRGD+YnIG9fY0IPUwZGD8/hLK9IE2QvesbGD+YnIG9ro0IvUwZGD//PiY728f1vccQGD8im086QhH2vR08Gz9nloS9fl7cvQkZGD+cc8i8PZwdPd6u9z7gKgQ9HcLdPILH9z6fvN08j5H3vRXJ9z5fsjG955+WPSKn9z5/40a8HyObPa5Jzz6cc8i8PZwdPd6u9z78wVM7/qIsPbhazz7RXdI9+GGYPXXp9z4fE6U9vdLEvKVqHz8TntA9LxeGvVFqHz8P0ps9aZTZvUHxIz8UJ/g3sOr3vTDxIz9g1JY9c/navexpHz9jWQQ5A0X3vctpHz9jWQQ520T3PctpHz8Qq7S9AAAAAPmBIz9+R7M7AAAAAAnCIT9fnZC9vdLEvOxpHz/+d7o7e0knvFFqHz/7XwS3Koj2PeEpKD+4M509NLfXPUkpKD8aMdO9Tw8/vQRWhj/yXtW9OpI3tMFRhj8S9s29cIh2veEpKD8S9s29AAAAAOEpKD8S99g9L4h2PaYnKD+/eOm8OeTQPSxgjj+/eOm87/wHPjRojD9fPI69hOrQPRv1jD/fgIy9608HPpoIiz+/eOm8jZQCPg1sgT+/eOm8FBfRPUoHgz+wRLC9l7fCPYrIiD8PWau9ZP3QPZGziD9P+ZG9YEPEPXEghD9X+I+9yhDRPVxyhD+dcto8jP3QvZGziD+P6Ao9oLLCvb68iD9/Z5s8tROWvgcceT+/eOm81SaNPiMfcD85plk88BypPlNpfD89Ra28kTOrPuWmfj/8Aay8JLWZvkALbT+PHoq97k2iPr/idT+QhmO9mOqoPpN9fD+/eOm8swCfvl4MgT/+C9w7ecWcvqjZfz+PHoq9+E2ivr3idT/u/WW9lsSbvh9Dbz+dMs88vZqiPmrPdT+/eOm8F7hRPjHOhz+/OY69kUEDPlPLgj/vKoq9L2lBPkDofT+/eOm8zhQ/Pr9gez+goKO9lGZIPjO/gj+vB6m9nEgFPiDqhj8XdYi9tmNPPnKKhj/AkLs8qGZIvjO/gj/+LNE8t0gFviDqhj/nIJM9jh7gvuC9Wz/X5bY9i6LYvnOVZj9vjX09u9fYPjekXT97LNI9UMvePqjVZD/fSyg944bwvvi7Xz+uzkY9lLjovhxyWz/euyg9q7vgPlCbXT9QvQ09oGHoPuQPYj+O+309dizoviABaz+gjKg942vgviEFaz/g+ME91bvmPq8VaT+fMZM9pTPvPq7TaD9fBp49aszyPvrDZz/wlqo9zPj2Pp6IZj8Xhqo9r/nnPgOGWT/wlqo91vj2vpuIZj8/7Z09sL7jvsy3Wj8Xhqo9ufnnvgCGWT+vkE89HD/tvkYoWj9/x1k9EYbyvqOnWD+/X7E8PTS6PvEdZT8O4kk90DTPPrf9Xz/PxUo9cli5PgjjZz89ihc9LnysPjwHcz/+L289mYu+PtjvbT9/uNe71rykvv5aaj+/X7E8RzS6vu8dZT9eT069iAeuvumRcj9fpyK9cW+nvglHbD/7Dni8ijjGvtC5az/+lsu7Fye/vkQ0Zj/g3B49fkFDvbZ/kT+uhry5PSxfvTOKkT9phry54CtfPTOKkT8gEyO9r0tDPW2QkT/g3B49EEFDPbZ/kT9eeF09PCPfPABvkT9eeF09/SPfvABvkT9tV2Q9dLVGtCxlkT8ve2W9/TPfPFuUkT+v4m69s/dGtKuVkT8ve2W9vjTfvFuUkT8gEyO9EExDvW2QkT/+4Cm7/0OevTvFmj5+l507xxqevbBxrT5fR2g9gGENvQthrT5P5kQ9EP4PvSC4mj4ACJI8nmw3vXJsrT4/Uic8nvY5vfm8mj5duP281TnbPbQf6T393a06DcLxPej46D2eqgs9FYvfPTZz6D19HTo9n2yhPYLi5z2OKRA9bXJFPV9+5z39E1M7/ocdPVJ95z00Z0k6jjoePcWM0D0+b++8rxxHPaXa5z0vfSe9pxmfPTKT6D2A6/A8XqAVvd7WZD5/O8u7n28/vdfrZD7HE5g9V5ehvSriZD6/k4M9PhtBvY7VZD4/I3o9WOLhvef8ZD7/j9c8MGT1vYMlZT7+PPu7yEDevYI6ZT5805e86JyevUMaZT4/1WM9cPykvS8ilj0f1WM9aPykPS8ilj3eJAY+UJ6svZkNtj/eJAY+D3SNveM2tj/eJAY+qL6tverKtz/eJAY+qL6tverKtz/eJAY+D3SNveM2tj/eJAY+aL23vcmOrT/eJAY+uFqQvQaBrT/eJAY+L4KyvbqDpD/eJAY+6PONvfqbpD/eJAY+X+levT2zuD/eJAY+z8ERvRuetj/eJAY+kABYvaRrtj/eJAY+z8ERvRuetj/eJAY+rxRWvSB7rT/eJAY+H/kNvdB5rT/eJAY+X8YNvVqZpD/eJAY+38QNvXzVpj/eJAY+b3ZUveifpD/eJAY+b3ZUveifpD/eJAY+Je94tD1huT/eJAY+QLCYvPBLuT/eJAY+ANNztPvLtj/eJAY+u8+SvIe/tj/eJAY+ANNztPvLtj/eJAY+QLCYvPBLuT/eJAY+nIaNvNB5rT/eJAY+PpZwtCR6rT/eJAY+GudgtNqPpD/eJAY+39qNvM2SpD/eJAY+v86SPIe/tj/eJAY+TsERPRuetj/eJAY+nvgNPdB5rT/eJAY+n4WNPNB5rT/eJAY+/dmNPM2SpD/eJAY+7sUNPVqZpD/eJAY+0HONPeM2tj/eJAY+DwBYPaRrtj/eJAY+7uhePT2zuD/eJAY+DwBYPaRrtj/eJAY+WJWQPd1BuD/eJAY+d1qQPQaBrT/eJAY+LhRWPSB7rT/eJAY+/nVUPeifpD/eJAY+sPONPfqbpD/eJAY+D56sPZkNtj/eJAY+D3fIPZ8ftj/eJAY+D3fIPZ8ftj/eJAY+sIfgPWGmrT/eJAY+J723PcmOrT/eJAY+36W1PczRrz/eJAY+J723PcmOrT/eJAY+QNPcPbn8rz/eJAY+dfvWPVlMpD/eJAY+94GyPbqDpD/eJAa+d6SGvWrZoj/eJAa+vqpcvfm4oj/eJAa+YIWHvb99oT/eJAa+Lo1hvQMhoT/eJAa+YIWHvb99oT/eJAa+vqpcvfm4oj/eJAa+MFGPvXx5qT/eJAa+TjFhvU2EqT/eJAa+nplfvUvIpz/eJAa+p6+NvTnRrj/eJAa+nzyLvVWHsD/eJAa+rplfvd++rj/eJAa+T3JdvVN0sD/eJAa+nzyLvVWHsD/eJAa+n2HjvLFooj/eJAa+PnsovbCPoj/eJAa+r/smveOIqT/eJAa+n3rdvDOKqT/eJAa+XyvdvEt2sD/eJAa++yjdvFK4rj/eJAa+n7glvWBxsD/eJAa+n7glvWBxsD/eJAa+djFuvJdRoD/eJAa+oMRYtKZEoj/eJAa+gAZlvHpOoj/eJAa+oMRYtKZEoj/eJAa+djFuvJdRoD/eJAa+98dcvN+JqT/eJAa+drRqtN+JqT/eJAa+drRqtN+JqT/eJAa+HzVxtNR9sD/eJAa+4yRrtJ26rj/eJAa+gEtdvIl7sD/eJAa+/cRcvKG5rj/eJAa+gEtdvIl7sD/eJAa+vARlPHpOoj/eJAa+ns3rPMt/oD/eJAa+vWDjPLFooj/eJAa+vARlPHpOoj/eJAa+nnndPDOKqT/eJAa+/8VcPN+JqT/eJAa+/8VcPN+JqT/eJAa+HyjdPNrOpz/eJAa+vUldPIl7sD/eJAa+XSrdPEt2sD/eJAa+UKpcPfm4oj/eJAa+znooPbCPoj/eJAa+rd4tPYrIoD/eJAa+4DBhPU2EqT/eJAa+MJlfPUvIpz/eJAa+P/smPeOIqT/eJAa+P/smPeOIqT/eJAa+LrglPWBxsD/eJAa+3nFdPVN0sD/eJAa+MJlfPd++rj/eJAa+j1smPVK4rj/eJAa+3nFdPVN0sD/eJAa+P6SGPWrZoj/eJAa+2FycPVPLoj/eJAa+J4WHPb99oT/eJAa+4PuWPe3ToT/eJAa+2FycPVPLoj/eJAa+DyKvPSNnqT/eJAa+91CPPXx5qT/eJAa+Xz6sPaXyrj/eJAa+b6+NPTnRrj/eJAa+v6+nPZaysD/eJAa+XzyLPVWHsD/eJAa+v6+nPZaysD98ts+8WMfEPUuTgj+8gqU8F0LEPdEdhD/cb4K8uA3DPcAhgD8fRCU9r97BPcQDgj+P6Ao9b7LCPb68iD+g22A9n1G+PYumhz+g22A90FG+vYumhz+P6Ao9oLLCvb68iD/wfgU938m6vR1VjT//wbG8P6q5vYVajz/876c63f/RPbITZj8vzI698L+3PZ0MZj//va67AJPIPQJHdj/QL5U9F8C3vdYaZj/876c6BQDSvbITZj9/Rb+9z/9RPTEKZj9/Rb+92jEdtDEKZj9vQcy9P5NHPc1beT/NzMy9GmQqtKNZeT8vzI69F8C3vZ0MZj9/Rb+9IABSvTEKZj9vQcy9kJNHvc1beT/QL5U98L+3PdYaZj9AFck9z/9RPTIdZj9AFck9IABSvTIdZj9gXcs9Cz8dtDIdZj/eJAY+O8kBvqXatz9W/gM+/CMHvthCuD/eJAY+o38NvtmxtT9W/gM+0XoTvlX2tT+1Ffu9/68MPR2suz+1Ffu9nwJQPfH0uj9W/gO+H9EKPYpZuz9W/gO+sB1NPaikuj/eJAY+o38NvlLVoD/eJAY+WhYXvgg9oz9W/gM+0XoTvtWQoD9W/gM+glwdvssQoz+1Ffs95CHSPVJhvD9W/gM+n/XPPfonvD+1Ffs9lhb0Pd+Euj9W/gM+FyLxPbBVuj+1Ffu989hStPFGmj+1Ffu9HeaNvExsmj9W/gO+k0tTtNSamj9W/gO+PxCMvNu/mj+1Ffu9cLAMvQ7bmj+1Ffu9EANQvTqSmz9W/gO+kNEKvaEtmz9W/gO+Hh5NvYLimz9W/gM+rPXPPTFfmj9W/gM+FyLxPXsxnD/eJAY+sHHJPZEKmz/eJAY+7EPoPV2/nD+1Ffu9PLoGPiB7rT9W/gO++xwEPupzrT+1Ffu9o0MDPiqprz9W/gO+0q8APhearz9W/gM+viOzPKFiwD/eJAY+XuevPC2Vvz+1Ffs9XR0rvnsUrj9W/gM+9fgovjgQrj9W/gM+4vXPvfonvD9W/gM+TSLxvbBVuj/eJAY+73HJvZl8uz/eJAY+IkTovc3HuT9W/gM+ZHMqPpZDqz/eJAY+BwMkPpZDqz9W/gM+2/goPvJ2qD/eJAY+5osiPg6EqD9W/gO+XQ+MPNu/mj/eJAa+fDSJPJRqmz+1Ffs9zOwIPpRluD9W/gM+2iMHPthCuD/eJAY+oOWmPbOTmT/eJAY+6GiAPapgmD9W/gM+/yurPVbUmD9W/gM+cCyDPSCYlz/eJAY+3+WmvXfzvD/eJAY+IGmAvYAmvj9W/gM+NyyrvdWyvT9W/gM+pyyDvQvvvj+1Ffs98JNMtImwlT+1Ffs9+ze0PA3glT9W/gM+ZfFMtAb1lT9W/gM+3yOzPIkklj+1Ffu98OSHPZz5uT+1Ffu9x3KlPWa9uD9W/gO+t9SFPZatuT9W/gO+Z5iiPZZ4uD9W/gO+yUQFvpZDqz/eJAa+7tv/vZZDqz9W/gO+Fh0EvkATqT/eJAa+05L9vbgeqT9W/gM+9fgovvJ2qD9W/gM+P5ckvhe3pT/eJAY+AYwivg6EqD/eJAY+ZjcevkrSpT+1Ffu9IANQvfH0uj9W/gO+Lh5Nvaikuj+1Ffu9L+WHvZz5uT9W/gO++NSFvZatuT/eJAY+PxYXPiNKsz9W/gM+Z1wdPmB2sz9W/gM+oCSzvIkklj/eJAY+QOivvP7xlj+1Ffu9nwJQPTqSmz9W/gO+vR1NPYLimz+1Ffu9+OSHPY+NnD9W/gO+v9SFPZTZnD+1Ffu9753XPematT9W/gO+jlLTPQlttT+1Ffu9Dy/APYhGtz9W/gO+MIi8PTQMtz+1Ffu9FOUHPpZDqz+1Ffu9PLoGPgsMqT9W/gO+p0QFPpZDqz9W/gO++xwEPkATqT+1Ffu9CHOlvWa9uD9W/gO+qJiivZZ4uD+1Ffu9SC/AvYhGtz9W/gO+b4i8vTQMtz9W/gO+Fh0EvupzrT/eJAa+05L9vXJorT9W/gM+2/goPjgQrj9W/gM+JJckPhPQsD/eJAY+5osiPh0Drj/eJAY+SzcePuG0sD+1Ffu9O+WNPN4avD9W/gO+PQ+MPE/Huz+1Ffu9z3KlPcXJnT9W/gO+Z5iiPZUOnj+1Ffu9Dy/APaJAnz9W/gO+OIi8PfZ6nz/eJAY+GGmAvapgmD9W/gM+nyyDvSCYlz/eJAY+oCUuvZl8lz9W/gM+Lo0xvciwlj+1Ffu9Yxf7vaDDpD9W/gO+WxL2vZDapD+1Ffu9h2DrvW3Foj9W/gO+FJ7mvTLmoj+1Ffu9h2Drvb3Bsz+1Ffu9Mp7XvematT9W/gO+FJ7mvfmgsz9W/gO+w1LTvQlttT9W/gO+PxCMvE/Huz/eJAa+fjWJvJccuz+1Ffu9Q2DrPW3Foj+1Ffu9/J3XPULsoD9W/gO+353mPTLmoj9W/gO+jlLTPSIaoT/eJAY+6HHJvZEKmz9W/gM+4vXPvTFfmj/eJAY+1+WmvbOTmT9W/gM+LyyrvVbUmD+1Ffu9Mp7XvULsoD9W/gO+w1LTvSIaoT+1Ffu9SC/AvaJAnz9W/gO+b4i8vfZ6nz/eJAY+PxYXPgg9oz9W/gM+Z1wdPssQoz/eJAY+SzcePkrSpT9W/gM+JJckPhe3pT+1Ffu9LRf7PYvDsT9W/gO+JhL2PZussT+1Ffu9Q2DrPb3Bsz9W/gO+353mPfmgsz+1Ffu9Yxf7vYvDsT9W/gO+WxL2vZussT/eJAY+WhYXviNKsz9W/gM+glwdvmB2sz+1Ffu9qkMDPgHepj+1Ffu9LRf7PaDDpD9W/gO+0q8APhPtpj9W/gO+JhL2PZDapD9W/gM+/CMHvlJEnj9W/gM+TSLxvXsxnD/eJAY+O8kBvoasnj/eJAY+IkTovV2/nD/eJAY+4GiAPYAmvj9W/gM+aCyDPQvvvj/eJAY+LyUuPZEKvz9W/gM+wIwxPWLWvz+1Ffs9/Ti0vB6nwD9W/gM+uySzvKFiwD+1Ffu9L+WHvY+NnD+1Ffu9CHOlvcXJnT9W/gO++NSFvZTZnD9W/gO+oJiivZUOnj/eJAY+GskBPoasnj9W/gM+2iMHPlJEnj/eJAY+iH8NPlLVoD9W/gM+t3oTPtWQoD/uXs49jKQovix9qD/uXs49s/IGvhVSnj/uXs49FzCCva6elz/uXs498hjPPWplmj/uXs49ZyYdPoUgoz/uXs49a6QoPv4Jrj8jTuc9J24IPnVZuD/uXs49kvIGPhU1uD/uXs491y+CPX3ovj/uXs49KBnPvcAhvD/uXs49giYdvqVmsz/eJAY+t4fzvZ5Bnz/eJAY+MfffvV/qnz/eJAY+t4fzvZ5Bnz/eJAY+L+IWvv6aqD/eJAY+tAcFvg6+qD/eJAY+L+IWvv6aqD/eJAY+13AMvrwAsz/eJAY+bnb6vdSasj/eJAY+CeYDvlZItT/eJAY+yBjuvVTBtD/eJAY+CeYDvlZItT/eJAY+bnb6vdSasj/eJAY+FyLAvQd8uj/eJAY+H5O1vRdDuT/eJAY+/6d3PbfRvD/eJAY+XuhqPRzruj/eJAY+5+UDPlZItT/eJAY+dIfzPY1Ftz/eJAY+7vbfPcuctj/eJAY+DuIWPi3srT/eJAY+kwcFPnHJrT/eJAY+DuIWPi3srT/eJAY+tnAMPm6Goz/eJAY+K3b6PVfsoz/eJAY+7uUDPtU+oT/eJAY+K3b6PVfsoz/eJAY+aEmgPb3Gmj/eJAY+2CHAPSQLnD/eJAY+59qXPfphnD/eJAY+55K1PRNEnT/eJAY+2CHAPSQLnD/eJAY+bqh3vXS1mT/eJAY+3+hqvQ6cmz/eJAY+l0mgvb3Gmj/eJAY+F9uXvfphnD/Ijq699VIMvnP0qD/uXs69Xf8Jvkf+qD/Ijq696JLgvXx+oD/uXs69wNncvQisoD/Ijq69HqdYvRzrmj/uXs69jw9VvZQwmz/Ijq69T1KsPT46nT/uXs6933apPeJ1nT/Ijq6988ICPnx+pD/uXs69u5cAPv6apD/Ijq6901IMPriSrT/uXs69Q/8JPuOIrT/Ijq69pZLgPa8Itj/uXs69fdncPSPbtT/Ijq69sKZYPQ6cuz/uXs69Dg9VPZdWuz/Ijq69kFKsvexMuT/uXs69H3epvUkRuT/Ijq69DsMCvq8Isj/uXs691pcAvi3ssT/eJAa+kLGuvX0dtD/eJAa+DWHrvW1WrT/eJAa+vIbPvTo7rT/eJAa+f1zDvd+JpT/eJAa+Xgx6vWJnnj/eJAa+L92VvVpknz/eJAa+LuVsvS6onz/eJAa+4KCNvXlYoD/eJAa+LuVsvS6onz/eJAa+L92VvVpknz/eJAa+ACxBPRCSnT/eJAa+Tjo3PdgNnz/eJAa+AAx6PWJnnj/eJAa+Tjo3PdgNnz/eJAa+V7GuPa1poj/eJAa+hobPPfBLqT/eJAa+R1zDPUz9sD/eJAa+n6CNPbEutj/eJAa+wORsPfzetj/eJAa++NyVPdEitz/eJAa+bSxBvRr1uD/eJAa+zzo3vVN5tz/eJAa+bgx6vckfuD/eJAa+zzo3vVN5tz/uXs49DhswvaG5lj/uXs49np6xvAUvlj/uXs49oBowPYnNvz/uXs49nZ2xPCVYwD/eJAY+FmaBtOBKvj/eJAY+PCGqvPMfvj/eJAY+Cnd+tJIFvD/eJAY+/WyhvHnkuz/eJAY+/1NRtEs8mD/eJAY+YCCqPDhnmD/eJAY+IalVtJmBmj/eJAY+G2yhPLGimj/uXs69sBoQvSV1mj/uXs693FeRvMQDmj/uXs69LxoQPQUSvD/uXs694FaRPGaDvD/eJAa+frOEvI+NnD/eJAa+LjsDvTDwnD/eJAa+QNN7vDRLnj/eJAa+QNN7vDRLnj/eJAa+LjsDvTDwnD/eJAa+nbKEPJz5uT/eJAa+wDoDPfqWuT/eJAa+PNF7PPc7uD/eJAa+PNF7PPc7uD/eJAa+wDoDPfqWuT9+eZm8vyZPvXcbKzyb9py8rjddvf8aKztAiIS9/wWEvYBvIzwn+4S994yJvf1uIzt/h4K8Ef/QvQAAAACP8Gu9x2rAvQAAAAD+IWE9TFL5vTirNjxrKzY+h8zCvTynNjz/CDM+B03Cvf2mNjtZNSg+MBGGvb2nNjx7hSU+AHGJvf2mNjv/fGQ9HoQmPXirNjx/BGQ9n2EzPQCrNjtEpvw9z0ROvT+pNjzs9vk9r6dYvfyoNjtx//E97oJ2PQAAAADs9vk9r6dYPfyoNjvQF5O9J02pPQAAAACuiGA9onzhPQAAAABT5vs98YACPoCpNjwfC5m8w7TkPfkcLzy9xYO8P2d5PQAAAACb9py8rjddPf8aKzufIG69sPWQPQAAAACRgPE9vFruvQAAAADQF5O9J02pvQAAAAB/BGQ9n2EzvQCrNjse+WI9LglZvQAAAAD7dx0+f8uSPQAAAAC6oSk+LwDAPQAAAAB7hSU+AHGJPf2mNjv/CDM+B03CPf2mNjtPaVC9Iy3VPX5hSD25qza8i1DsPV7jST3HpIK9Z7ajPV6VRj3fX0297t9jPc/LRT3fX0297t9jvc/LRT06Aye8Drszva5RRz3HpIK9b7ajvU2VRj1rKzY+qAnCPU7sAz3NOSg+F06FPf+sCj36CPw95h4CvnD+ID36CPw95h4CPoD+ID2I9Ps92lMCPh2pwjzOw+k9pRTUvQAAAAAsROc9DzezvQAAAAAsROc9DzezPQAAAADeyPw9QL1MvV3oHz1stPw9nY9Nvd0dwjzeyPw9QL1MPV3oHz3yXtW9OpI3tMFRhj/2etc9WUUHPyZjTT/oiAw+30cNP47bSD+/uCQ+re4MP7KORz/oiAw+30cNP47bSD/2etc9XEUHvyRjTT/oiAw+4kcNv4rbSD8+3BC9vlxIPWiMtz1PgBw9WCr+vRYTnz+u0Ug9v26pPLjHlj9PgBw93wbDPRNhmz9PgBw9hv0TPheaoz9PgBw9INAePrXgrT/yG6A3UEQ1PaommD8fNYI8PoczvWnfvD6dPJs8/+k1vSo7tT6dPJs8/+k1vSo7tT6/JnA9XrILvW4ztT6YnIG9fY0IPUwZGD+6BX08nMq6PNWwDz9/GlS9j8wOPfq3Dz9/wCA8LFD2vZKwDz9AnrM9LjYgPYvg9z5X+I+9yhDRPVxyhD+/OY69kUEDPlPLgj9vE4S9DGKPPmlecj/u/WW9lsSbvh9Dbz/u/WW9jMSbPiJDbz/vKoq9L2lBPkDofT+uzkY9lLjovhxyWz/euyg9q7vgPlCbXT8PIco9DNn/Pu4RYj8wTsk9rLPxPl8XVj/+lsu7DSe/PkY0Zj/7VNo8OWvWPv0+YD/+lsu7Fye/vkQ0Zj9fpyK9cW+nvglHbD8ACJI8nmw3vXJsrT4/Uic8nvY5vfm8mj78PYi6xY/xPZwY0j0+b++8rxxHPaXa5z2vhwK9AMtHPUru0D3eJAY+UJ6svZkNtj/eJAY+uFqQvQaBrT/eJAY+aL23vcmOrT/eJAY+X8YNvVqZpD/eJAY+u8+SvIe/tj/eJAY+BoZwtPRPtD/eJAY+u8+SvIe/tj/eJAY+39qNvM2SpD/eJAY+P1mPvMQ9oj/eJAY+GudgtNqPpD/eJAY+v86SPIe/tj/eJAY+PViPPGZJtD/eJAY+TsERPRuetj/eJAY+/9IOPSdOoj/eJAY+/dmNPM2SpD/eJAY+DwBYPaRrtj/eJAY+0HONPeM2tj/eJAY+0HONPeM2tj/eJAY+D56sPZkNtj/eJAY+4DOvPd4atD/eJAY+D3fIPZ8ftj/eJAa+nzyLvVWHsD/eJAa+T3JdvVN0sD/eJAa+AAlcveEjsj/eJAa+T3JdvVN0sD/eJAa+r6iIvcwosj/eJAa+n7glvWBxsD/eJAa+sBYmvQUvsj/eJAa+XyvdvEt2sD/eJAa+/c7evGNAsj/eJAa+sBYmvQUvsj/eJAa+gAZlvHpOoj/eJAa+eJ9fvAA6pD/eJAa+gZxbtME0pD/eJAa+gAZlvHpOoj/eJAa+wJ1fPAA6pD/eJAa+vWDjPLFooj/eJAa+/M3ePGNAsj/eJAa+vUldPIl7sD/eJAa+XSrdPEt2sD/eJAa+vUldPIl7sD/eJAa+P6SGPWrZoj/eJAa+/yiiPQ03pD/eJAa+2FycPVPLoj/eJAa+d6iIPV9epD/eJAa+d6iIPcwosj/eJAa+/yiiPR5Qsj/eJAa+XzyLPVWHsD/eJAa+v6+nPZaysD/eJAa+XzyLPVWHsD/eJAa+/yiiPR5Qsj8/ZpA8OCTBvZ5ejT/7itu80KLAvVLyjj/eJAY+tAcFvg6+qD/eJAY+J+bPvQFNtD/eJAY+qvvWvdE6sj/eJAY+H5O1vRdDuT/eJAY+h5WQvd1BuD/eJAY+h5WQvd1BuD/eJAY+H5O1vRdDuT/eJAY+XuhqPRzruj/eJAY+7uhePT2zuD/eJAY+kwcFPnHJrT/eJAY+5OXPPSo6oj/eJAY+dfvWPVlMpD/eJAY+59qXPfphnD/eJAY+55K1PRNEnT/eJAY+UJWQPU5Fnj/eJAY+55K1PRNEnT/eJAY+3+hqvQ6cmz/eJAa+4KCNvXlYoD/eJAa+YIWHvb99oT/eJAa+Lo1hvQMhoT/eJAa+n6CNPbEutj/eJAa+J4WHPWsJtT/eJAa+wIxhPSdmtT/uXs49hABNtCoAlj/eJAY+QLCYvPBLuT/uXs69pEhStG7dmT/eJAa+tyJVtM5rnD/eJAa+frOEvI+NnD/eJAa+df1+tFwbuj/eJAa+nbKEPJz5uT8cdoG8upvnPdtj0jz7In68HstEvRyazjx+gnK94Gp6vd0LyTyvISg+amf4PS9vCz0yAuo9xySTPQAAAADfRYo931r8PoMIVT8BTDk+NvsLPwZ/Sz/YSS0+5asIP2CCSz/YJIa90V9RtAkzmT/YJIY9Ov5NtKG5lj+uw0k98dlNtBaflj9vrEi9HYmbPHZsmD+u0Ug9v26pPLjHlj/yG6A3rkQ1vaommD+48Ze9vyySPVa6Dz9/GlS9j8wOPfq3Dz97ENc97yR9vVLxIz8UJ/g3ler3PTDxIz8UJ/g3ler3PTDxIz8Y9cu97yR9vTDxIz97ENc9riR9PVLxIz8P0ps9TpTZPUHxIz/7itu8oKLAPVLyjj9P+ZG9YEPEPXEghD98ts+8WMfEPUuTgj/coqU8Qj2GvroKfT+XCYa9y1eAPiAWdj+/eOm8N8F8PpHEcz9/x1k9B4byPqanWD+v4m69s/dGtKuVkT9/O8u7n28/vdfrZD7eJAY+UJ6svZkNtj/eJAY+UHfIvZ8ftj/eJAY+HzSvvd4atD/eJAY+kABYvaRrtj/eJAY+D3SNveM2tj/eJAY+z8ERvRuetj/eJAY+P1mPvGZJtD/eJAY+39qNvM2SpD/eJAY+X9MOvSdOoj/eJAY+BoZwtPRPtD/eJAY+v86SPIe/tj/eJAY+/dmNPM2SpD/eJAY+GudgtNqPpD/eJAY+XViPPMQ9oj/eJAY+D56sPZkNtj/eJAY+d1qQPQaBrT/eJAY+J723PcmOrT/eJAa+OCmivQ03pD/eJAa+r6iIvV9epD/eJAa+D12cvVPLoj/eJAa++K+nvZaysD/eJAa+OCmivR5Qsj/eJAa+r6iIvcwosj/eJAa+OCmivR5Qsj/eJAa+gAZlvHpOoj/eJAa+n2HjvLFooj/eJAa+eJ9fvAA6pD/eJAa+gEtdvIl7sD/eJAa+wJ1fPAA6pD/eJAa+vARlPHpOoj/eJAa+gZxbtME0pD/eJAa+LrglPWBxsD/eJAa+PxYmPQUvsj/eJAa+PxYmPQUvsj/eJAa+XSrdPEt2sD/eJAa+fwhcPeEjsj/eJAa+d6iIPcwosj9/Rb+92jEdtDEKZj8jTue9Xj5SPTEguz8jTue9LzMOvSmumj8jTue9P2yPvBg+mj8jTue93z5Svflmmz8jTue9WywIPlqBrT/eJAY+UD4oPSOhvT/eJAa+nbKEPI+NnD8jTue9bu7ZPRe3tT8jTue9zzmnvW3iuD8jTue9rjIOPQHZuz8jTue9XWuPPBJJvD8jTue9kDmnPb2knT/eJAY+bqh3vXS1mT/eJAa+nrOEvJz5uT8jTue9pO7ZvRPQoD/eJAY+tnAMPm6Goz8jTue94Mn9vZDVsT8jTue9ncn9PZqxpD/eJAY+MfffvV/qnz/eJAY+fdzNvb5lnj/eJAY+SHfIvYxnoD/eJAY+qvvWvdE6sj/eJAY+bnb6vdSasj/eJAY+dtPcvbn8rz/eJAY+fdzNvWwhuD/eJAY+qL6tverKtz/eJAY+0J0fPR+Fuz/eJAY+7ycXPfUQuT/eJAY+XuhqPRzruj/eJAY+dfvWPVlMpD/eJAY+K3b6PVfsoz/eJAY+QNPcPXKKpj/eJAY+R9zNPb5lnj/eJAY+3+hqvQ6cmz/eJAa+F/yWve3ToT/eJAa+YIWHvb99oT/eJAa+b5KgvZI6oT/eJAa+ns3rPMt/oD/eJAa+YOHKPbsnrz/eJAa+Xz6sPaXyrj/eJAa+R1zDPUz9sD/eJAa+2PuWPT2ztD/eJAa+J4WHPWsJtT/eJAa+MJKgPZhMtT/eJAa+gM7rvF8Htj8jTue9LplStGkYmj/eJAa+QNN7vDRLnj/eJAa+PNF7PPc7uD8EdA8+V+aePQAAAADG3BU+JzS7PQAAAADfX0297t9jvc/LRT3Pn0m91hxQtMdGmD/Pn0m91hxQtMdGmD8vMsg9AAAAAPWCIz/NzMy9GmQqtKNZeT8Qq7S9AAAAAPmBIz/gIZG9dyrBPQVujT/eJAY+UJ6svZkNtj/eJAY+UHfIvZ8ftj/eJAY+F6a1vczRrz/eJAY+dtPcvbn8rz/eJAY+aL23vcmOrT/eJAY+D3SNveM2tj/eJAY+kABYvaRrtj/eJAY+Je94tD1huT/eJAY+Pq+YPPBLuT/eJAY+Pq+YPPBLuT/eJAY+TsERPRuetj/eJAY+7uhePT2zuD/eJAY+7sUNPVqZpD/eJAY+/nVUPeifpD/eJAY+bsQNPXzVpj/eJAY+D56sPZkNtj/eJAY+0HONPeM2tj/eJAa+d6SGvWrZoj/eJAa+YIWHvb99oT/eJAa+D12cvVPLoj/eJAa+oD6svaXyrj/eJAa++K+nvZaysD/eJAa+p6+NvTnRrj/eJAa+r/smveOIqT/eJAa+/1smvVK4rj/eJAa+djFuvJdRoD/eJAa+gM7rvMt/oD/eJAa++yjdvNrOpz/eJAa+98dcvN+JqT/eJAa+XyvdvEt2sD/eJAa+vARlPHpOoj/eJAa+PzBuPJdRoD/eJAa+oMRYtKZEoj/eJAa+drRqtN+JqT/eJAa++cJcPKG5rj/eJAa+LrglPWBxsD/eJAa+HyjdPFK4rj/eJAa+wIxhPQMhoT/eJAa+UKpcPfm4oj/eJAa+J4WHPb99oT/eJAa+b6+NPTnRrj/eJAa+3nFdPVN0sD/eJAY+ZA0Cvp1Gpj/eJAY+tAcFvg6+qD/eJAY+vOwSvnkBpj/eJAY+FyLAvQd8uj/eJAY+u8DbvZf/uD/eJAY+/6d3PbfRvD/eJAY+hsDbPZSHnT/eJAY+55K1PRNEnT/eJAY+R9zNPb5lnj/eJAY+vj4ovQjmmD/eJAY+Pp4fvQ0Cmz/eJAY+bqh3vXS1mT/eJAa+P/S9vYyhtD/eJAa+H2irvfD5tT/eJAa+kLGuvX0dtD/eJAa+b5KgvZhMtT/eJAa+kLGuvX0dtD/eJAa+H2irvfD5tT/eJAa+l+HKvbsnrz/eJAa+vIbPvTo7rT/eJAa+zDPlvXhdrz/eJAa+//O9PZ/loT/eJAa+52erPTuNoD/eJAa+V7GuPa1poj/eJAa+OJKgPZI6oT/eJAa+V7GuPa1poj/eJAa+52erPTuNoD/eJAa+YOHKPXBfpz/eJAa+hobPPfBLqT/eJAa+ljPlPbIppz/eJAa++NyVPdEitz/eJAa+52erPfD5tT/eJAa+n6CNPbEutj/eJAY+PCGqvPMfvj/eJAY+/WyhvHnkuz/eJAY+Lp4fvR+Fuz/eJAY+/WyhvHnkuz/eJAY+zj4ovSOhvT/eJAY+G2yhPLGimj/eJAY+YD4oPQjmmD/eJAa+PgH5vJaVnj/eJAa+PAD5PJXxtz8AAAEAAgADAAAAAQACAAMAAAABAAIAAwAAAAEAAgADAAcACQAAAAAABwAJAAAAAAAJAAAAAAAAAAkAAAAAAAAABwAJAAAAAAAHAAkAAAAAAAkAAAAAAAAACQAAAAAAAAAIAAoAAAAAAAgACgAAAAAACgAAAAAAAAAKAAAAAAAAAAgACgAAAAAACAAKAAAAAAAKAAAAAAAAAAoAAAAAAAAACgAAAAAAAAAKAAAAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQABgACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAFAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAYAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQABQADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQABgACAAMABAAGAAIAAwAEAAYAAgADAAQABgACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAYAAgADAAQABgACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQAAAAsADQAAAAAACwANAAAAAAALAA0ADwAAAAsADQAAAAsADQAPAAAACwANAA8AAAAAAAsADQAPAAAACwANAA8AAAALAA0AAAAAAAsADQAAAAAACwANAAAAAAALAA0AAAALAA0ADwAAAAsADQAPAAAAAAALAA0ADwALAA0ADwAAAAAADAAOAAAAAAAMAA4AAAAAAAwADgAAAAAADAAOAAAAAAAMAA4AAAAAAAwADgAQAAAADAAOAAAADAAOAAAAAAAAAAsADQAAAAAACwANAAAAAAALAA0AAAAAAAsADQAAAAAACwAMAA0AAAALAAwADQAAAAsADAANAAAACwAMAA0AAAALAAwADgAAAAsADAAAAAAACwAMAA4AAAALAAwAAAAAAAsADAAOAAAADAAOAAAAAAALAAwADgAAAAwADgAAAAAACwANAAAAAAALAA0AAAAAAAsADQAAAAAACwANAAAAAAAMAA4AAAAAAAwADgAAAAAACwAMAA4AAAALAAwADgAAAAwADgAAAAAACwAMAA4AAAAMAA4AAAAAAAwADgAAAAAADAAOAAAAAAAMAA4AAAAAAAsADAAOAAAACwAMAA0AAAALAAwAAAAAAAsADAANAAAACwAMAAAAAAALAAwAAAAAAAsADAANAAAACwAMAA0AAAALAAwAAAAAAAsADAAAAAAACwAMAAAAAAALAAwAAAAAAAwAAAAAAAAADAAAAAAAAAALAAwAAAAAAAsADAAAAAAAAQAGAAwAAAABAAYADAAAAAEABgAMAAAAAQAGAAsAAAABAAUACwAAAAEACwAMAAAAAQAFAAsAAAABAAUACwABAAIAAwAGAAAAAQACAAMAAQACAAMABQAAAAEAAgADAAAAAQALAAwAAAABAAYACwAAAAsADAAAAAAADAAAAAAAAgADAAYACAACAAMABgAIAAIAAwAGAAgAAgADAAYACAAAAAEAAgAGAAAAAQACAAYAAAABAAIABQAAAAEAAgAFAAEAAgAFAAcAAgADAAUABwAAAAEAAgADAAIAAwAFAAcAAAABAAIABgACAAYACAAAAAAAAQACAAMAAgADAAYACAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAAGAAgACgAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAUABwAJAAAAAgAFAAcAAAACAAUABwAAAAIABQAHAAAAAgAFAAcAAAAGAAgAAAAAAAYACAAKAAAABgAIAAAAAAAGAAgACgAAAAIABQAHAAAAAgAFAAcAAAACAAUABwAAAAIABQAHAAAABgAIAAoAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAACAAYACAAAAAYACAAAAAAAAgAGAAgAAAAGAAgACgAAAAIABQAHAAAABQAHAAAAAAACAAUABwAJAAUABwAJAAAAAgAGAAgAAAACAAYACAAAAAAAAQACAAYAAQACAAYACAAAAAEAAgAGAAIABQAHAAAAAgAFAAcAAAABAAIABgAIAAYACAAKAAAABgAIAAoAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAHAAkAAAAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAcACQAAAAAABgAIAAoAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAHAAkAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAABQAHAAkAAAAFAAcACQAAAAcACQAAAAAABQAHAAkAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAFAAcACQAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAUABwAJAAAABgAIAAoAAAAIAAoAAAAAAAYACAAKAAAACAAKAAAAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAAGAAgACgAAAAIAAwAEAAYAAgADAAQABgABAAIAAwAGAAIAAwAEAAYAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQABAAIAAwAEAAEAAgADAAUAAgADAAQABQACAAMABQAAAAEAAgADAAQAAQACAAMABAABAAIAAwAFAAEAAgADAAUAAQACAAMABAABAAIAAwAEAAEAAgADAAQAAQACAAMABAABAAIAAwAEAAIAAwAEAAYAAQACAAMABAACAAMABAAFAAAADAAOAAAADAAOAAAAAAAAAAwADgAAAAwADgAAAAAADAAOAAAAAAAMAA4AEAAAAAsADQAPABEACwANAA8AAAALAA0AAAAAAAsADQAPABEACwANAAAAAAALAA0ADwARAAsADQAPABEACwANAA8AEQALAA0ADwARAAsADQAPABEACwANAA8AAAALAA0ADwAAAAsADQAPAAAACwANAA8AEQAMAA4AEAASAAwADgAQAAAADAAOABAAEgAMAA4AEAASAAwADgAQABIADAAOABAAEgAMAA4AEAASAAwADgAQABIADAAOABAAEgAMAA4AEAASAA4AEAASAAAADgAQABIAAAAMAA4AEAASAA4AEAASAAAADAAOABAAEgAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADQAPABEAAAAPABEAAAAAAA0ADwARAAAADwARAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAAAAQACAAMAAAABAAIABQAAAAEAAgADAAAAAQACAAUAAgADAAUAAAACAAMABQAAAAIAAwAFAAAAAgADAAUAAAACAAMABgAAAAIAAwAGAAAAAAABAAIAAwAAAAEAAgADAAAAAQACAAUAAAABAAIABQAAAAEAAgADAAAAAQACAAMAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAGAAAAAQACAAYAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABgAAAAEAAgAGAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAMAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAEAASAAAAAAAQABIAAAAAAA4AEAASAAAAEAASAAAAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAABAAEgAAAAAAEAASAAAAAAAOABAAEgAAABAAEgAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAANAA8AEQAAAA8AEQAAAAAADQAPABEAAAAPABEAAAAAAA4AEAASAAAAEAASAAAAAAAQABIAAAAAABAAEgAAAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADwARAAAAAAAPABEAAAAAAA8AEQAAAAAADwARAAAAAAAPABEAAAAAAA8AEQAAAAAADQAPABEAAAAPABEAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAAEAASAAAAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAAEQAAAAAAAAARAAAAAAAAABEAAAAAAAAAEQAAAAAAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA8AEQAAAAAADwARAAAAAAAPABEAAAAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAQABIAAAAAABAAEgAAAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAAEAASAAAAAAAQABIAAAAAAA8AEQAAAAAADwARAAAAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAAQABIAAAAAABAAEgAAAAAAEgAAAAAAAAAQABIAAAAAAAAAAQACAAMAAAABAAIAAwAHAAkAAAAAAAkAAAAAAAAABwAJAAAAAAAJAAAAAAAAAAgACgAAAAAACgAAAAAAAAAIAAoAAAAAAAoAAAAAAAAACgAAAAAAAAAKAAAAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAGAAIAAwAEAAUAAgADAAQAAAACAAMABAAFAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAACAAMABAAAAAIAAwAEAAUAAgADAAQABQACAAMABAAGAAIAAwAEAAYAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAGAAIAAwAEAAYAAQACAAMABAACAAMABAAFAAAACwANAAAAAAALAA0AAAALAA0AAAAAAAAADAAOABAAAAAMAA4AEAAAAAsADQAAAAAACwANAAAAAAALAAwADQAAAAsADAAOAAAACwAMAA4AAAALAAwADgAAAAsADQAAAAAACwAMAA4AAAALAAwADgAAAAsADAAAAAAADAAOAAAAAAALAAwADgAAAAsADAAAAAAACwAMAAAAAAALAAAAAAAAAAsAAAAAAAAADAAOAAAAAAALAAwAAAAAAAEABgALAAAAAQALAAwAAAABAAsADAAAAAEAAgADAAAAAQAGAAsAAAABAAIABgAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAGAAUABwAJAAAABQAHAAkAAAAGAAgAAAAAAAYACAAKAAAABQAHAAkAAAAFAAcAAAAAAAYACAAKAAAABgAIAAoAAAACAAYACAAAAAIABgAIAAAAAgAGAAgAAAAAAAEAAgAGAAYACAAKAAAABgAIAAoAAAAHAAkAAAAAAAcACQAAAAAABgAIAAoAAAAHAAkAAAAAAAcACQAAAAAACAAKAAAAAAAFAAcACQAAAAUABwAJAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAIAAwAGAAAAAgADAAUAAAACAAMABQAAAAEAAgADAAUAAQACAAMABQABAAIAAwAEAAAAAQACAAMAAQACAAMABQAMAA4AAAAAAAwADgAAAAAADAAOABAAAAAMAA4AAAAAAAsADQAPABEADQAPABEAAAALAA0ADwARAAsADQAPABEACwANAA8AAAALAA0ADwAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAAEAASAAAAAAANAA8AEQAAAA8AEQAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAIAAwAFAAAAAgADAAUAAAACAAMABgAAAAAAAQACAAMAAAABAAIABQAAAAEAAgADAAAAAQAFAAsAAAABAAYACwAAAAEABQALAAAAAQAFAAsAAAABAAsADAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAQAAAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAASAAAAAAAAABIAAAAAAAAADQAPABEAAAAPABEAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAABEAAAAAAAAAEQAAAAAAAAANAA8AEQAAAA0ADwARAAAAEgAAAAAAAAASAAAAAAAAAA4AEAASAAAAEQAAAAAAAAARAAAAAAAAAA8AEQAAAAAAEAASAAAAAAAOABAAEgAAAA0ADwARAAAAEAASAAAAAAAOABAAEgAAAA0ADwARAAAAEAASAAAAAAAHAAkAAAAAAAcACQAAAAAACAAKAAAAAAAIAAoAAAAAAAoAAAAAAAAACgAAAAAAAAALAA0ADwARAAsADQAPABEADQAPABEAAAANAA8AEQAAAA4AEAASAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAYAAgADAAQAAAACAAMABAAFAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQABgACAAMABAAGAAIAAwAEAAUAAgADAAQABQACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAAAgADAAQABgACAAMABAAFAAIAAwAEAAUAAgADAAQABgACAAMABAAGAAIAAwAEAAYAAgADAAQAAAAAAAsADQAPAAAACwANAAAAAAALAA0ADwAAAAsADQAPAAAACwANAAAACwANAAAAAAAAAAsADQAPAAAADAAOAAAAAAAMAA4AAAAAAAsADQAAAAAACwAMAA0AAAALAAwADgAAAAwADgAAAAAADAAOAAAAAAALAAwAAAAAAAsADAAAAAAACwAAAAAAAAALAAwAAAAAAAsADAAAAAAACwAMAAAAAAAMAAAAAAAAAAsADAAAAAAACwAMAAAAAAABAAIAAwAAAAEACwAMAAIAAwAGAAAAAgADAAYAAAAAAAEAAgADAAAAAQACAAMAAAABAAIAAwAAAAEAAgADAAAAAQACAAMAAAABAAIABQACAAYACAAKAAYACAAKAAAABQAHAAkAAAAFAAcACQAAAAIABQAHAAkAAgAFAAcACQAGAAgACgAAAAYACAAKAAAABQAHAAkAAAAFAAcACQAAAAIABgAIAAoAAgAGAAgACgAGAAgACgAAAAIABQAHAAkABQAHAAkAAAACAAYACAAAAAIABgAIAAAAAQACAAUABwAAAAEAAgAGAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAIAAoAAAAAAAgACgAAAAAABwAJAAAAAAAHAAkAAAAAAAgACgAAAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAFAAcACQAAAAUABwAJAAAABgAIAAoAAAAAAAEAAgADAAEAAgADAAQAAAAMAA4AEAAMAA4AEAAAAAsADQAPAAAACwANAA8AAAAMAA4AEAASAAwADgAQABIADAAOABAAEgAMAA4AEAASAA4AEAASAAAADQAPABEAAAANAA8AEQAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAEAAgADAAAAAQACAAMAAAABAAIAAwAAAAEACwAMAAAAAQACAAUAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAABAAAAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAIAAwAEAAAAAgADAAQAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAABIAAAAAAAAAEgAAAAAAAAANAA8AEQAAAA0ADwARAAAADgAQABIAAAASAAAAAAAAAA0ADwARAAAAEQAAAAAAAAAPABEAAAAAAA8AEQAAAAAADQAPABEAAAANAA8AEQAAAA8AEQAAAAAAEQAAAAAAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAAQABIAAAAAABAAEgAAAAAAEAASAAAAAAAOABAAEgAAAA4AEAASAAAAEQAAAAAAAAANAA8AEQAAAA8AEQAAAAAADwARAAAAAAAOABAAEgAAABAAEgAAAAAAEAASAAAAAAAOABAAEgAAAA4AEAASAAAADQAPABEAAAANAA8AEQAAABAAEgAAAAAADwARAAAAAAAOABAAEgAAAA0ADwARAAAAEgAAAAAAAAASAAAAAAAAAAgACgAAAAAADQAPABEAAAANAA8AEQAAAAMABAAAAAAAAgADAAQAAAACAAMABAAFAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAUAAgADAAQABQACAAMABAAGAAAACwANAA8AAAALAA0ADwAAAAsADAANAAAACwAMAAAAAAABAAsADAAAAAsADAAAAAAACwAMAAAAAAAMAAAAAAAAAAsAAAAAAAAAAQACAAMAAAABAAsADAACAAMABgAAAAAAAQACAAUAAgADAAUAAAAGAAgACgAAAAUABwAJAAAABgAIAAoAAAAIAAoAAAAAAAcACQAAAAAACAAKAAAAAAAHAAkAAAAAAAgACgAAAAAABQAHAAkAAAAFAAcACQAAAAEAAgADAAQACwANAAAAAAAMAA4AEAASAAwADgAQAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAAABAAIABQAAAAEAAgAFAAIAAwAEAAAABAAAAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAABAAEgAAAAAADgAQABIAAAANAA8AEQAAAA4AEAASAAAADQAPABEAAAAPABEAAAAAAA0ADwARAAAADwARAAAAAAAOABAAEgAAAA0ADwARAAAAAAABAAIAAwAHAAkAAAAAAAkAAAAAAAAABwAJAAAAAAAJAAAAAAAAAAkAAAAAAAAACQAAAAAAAAAIAAoAAAAAAAoAAAAAAAAACAAKAAAAAAAKAAAAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA4AEAASAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADgAQABIAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQABQACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQABgACAAMABAAFAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAUAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAGAAIAAwAEAAYAAgADAAQABQABAAIAAwAEAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAAACwANAA8AAAALAA0ADwAAAAsADQAPAAAACwANAA8ACwANAAAAAAALAA0AAAAAAAAACwANAA8AAAALAA0AAAAAAAwADgAQAAAADAAOABAAAAAMAA4AAAAAAAwADgAQAAAACwAMAAAAAAALAAwADQAAAAsADAAAAAAACwAMAAAAAAALAAwAAAAAAAwADgAAAAAADAAOAAAAAAAMAA4AAAAAAAsADAANAAAACwAMAA0AAAAMAA4AAAAAAAsADQAAAAAACwANAAAAAAALAAwADQAAAAsADQAAAAAACwAMAA0AAAALAAwADgAAAAsADAAOAAAADAAAAAAAAAAMAAAAAAAAAAwADgAAAAAADAAAAAAAAAALAAAAAAAAAAsADAAAAAAACwAMAAAAAAALAAwAAAAAAAsADAAAAAAAAQAFAAsAAAABAAUACwAAAAEAAgADAAAAAQACAAMAAAABAAsADAAAAAEACwAMAAAAAQALAAwAAgADAAUABwACAAMABQAHAAIAAwAFAAcAAgADAAUABwAAAAEAAgAFAAAAAQACAAUAAAABAAIAAwAAAAEAAgADAAAAAQACAAUAAAABAAIABQAAAAEAAgADAAAAAQACAAMAAgAGAAgAAAAFAAcACQAAAAUABwAJAAAABQAHAAkAAAAGAAgACgAAAAUABwAJAAAABQAHAAkAAAACAAYACAAAAAIABgAIAAAABgAIAAoAAAAGAAgACgAAAAUABwAJAAAAAgAFAAcAAAAAAAEAAgAFAAAAAQACAAUAAAABAAIABQABAAIABQAHAAAAAQACAAUAAgAFAAcAAAACAAYACAAAAAEAAgADAAYACAAKAAAAAAAIAAoAAAAAAAUABwAJAAAABwAJAAAAAAAIAAoAAAAAAAgACgAAAAAABQAHAAkAAAAFAAcACQAAAAYACAAKAAAACAAKAAAAAAAHAAkAAAAAAAcACQAAAAAABwAJAAAAAAAHAAkAAAAAAAcACQAAAAAACAAKAAAAAAAIAAoAAAAAAAgACgAAAAAACAAKAAAAAAAIAAoAAAAAAAUABwAJAAAABQAHAAkAAAAFAAcACQAAAAUABwAJAAAABQAHAAkAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAAGAAgACgAAAAYACAAKAAAABgAIAAoAAAACAAMABAAGAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAUAAQACAAMABAABAAIAAwAEAAEAAgADAAQAAQACAAMABAABAAIAAwAEAAEAAgADAAQAAgADAAQABQAMAA4AEAAAAAAADAAOABAAAAAMAA4AEAAMAA4AEAAAAAAADAAOABAADAAOABAAAAANAA8AEQAAAAsADQAPABEACwANAA8AEQALAA0ADwARAAsADQAPABEACwANAA8AEQANAA8AEQAAAAsADQAPABEACwANAA8AEQAMAA4AEAASAAwADgAQAAAADAAOABAAEgAMAA4AEAASAAwADgAQABIADAAOABAAEgAMAA4AEAAAAAwADgAQAAAADgAQABIAAAANAA8AEQAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAAAAQACAAMAAAABAAIAAwAAAAEAAgADAAAAAQACAAMAAAABAAIAAwAAAAEAAgADAAAAAQACAAMAAAABAAIAAwACAAMABgAAAAIAAwAGAAAAAAABAAIABQAAAAEAAgAFAAAAAQACAAMAAAABAAIAAwAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIABQAAAAEAAgAFAAAAAQACAAUAAAABAAIAAwAAAAEAAgADAAAAAQACAAMAAAABAAIAAwADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAACAAMABAAAAAIAAwAEAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAAABAAAAAAAAAAEAAAAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAADgAQABIAAAAOABAAEgAAABAAEgAAAAAAEAASAAAAAAAOABAAEgAAABAAEgAAAAAADgAQABIAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAASAAAAAAAAAA0ADwARAAAADQAPABEAAAAOABAAEgAAAA4AEAASAAAADwARAAAAAAANAA8AEQAAAA8AEQAAAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA8AEQAAAAAAEAASAAAAAAAQABIAAAAAAA4AEAASAAAADgAQABIAAAARAAAAAAAAABEAAAAAAAAAEQAAAAAAAAARAAAAAAAAAA0ADwARAAAADQAPABEAAAANAA8AEQAAAA0ADwARAAAADgAQABIAAAAOABAAEgAAAA4AEAASAAAADwARAAAAAAAPABEAAAAAAA4AEAASAAAADQAPABEAAAANAA8AEQAAABAAEgAAAAAAEAASAAAAAAAPABEAAAAAAA4AEAASAAAADgAQABIAAAANAA8AEQAAAAAAAQACAAMABwAJAAAAAAAJAAAAAAAAAAkAAAAAAAAACQAAAAAAAAAIAAoAAAAAAAoAAAAAAAAADQAPABEAAAACAAMABAAAAAIAAwAEAAUAAgADAAQAAAADAAQAAAAAAAMABAAAAAAAAgADAAQABQAAAAwADgAQAAAADAAOABAAAAAMAA4AEAAAAAwADgAQAAAACwAMAAAAAAALAAwADQAAAAsADAAAAAAADAAOAAAAAAALAAwADQAAAAEAAgAFAAAAAQACAAUABQAHAAkAAAAGAAgACgAAAAUABwAJAAAAAAABAAIABQAIAAoAAAAAAAUABwAJAAAABwAJAAAAAAAHAAkAAAAAAAUABwAJAAAABQAHAAkAAAAGAAgACgAAAAYACAAKAAAAAAAMAA4AEAAMAA4AEAAAAA0ADwARAAAACwANAA8AEQANAA8AEQAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAQAAAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAGAAAAAgADAAYAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAIAAwAEAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAgADAAQAAAADAAQAAAAAAAIAAwAEAAAAAgADAAQAAAADAAQAAAAAAAQAAAAAAAAABAAAAAAAAAANAA8AEQAAAA4AEAASAAAADgAQABIAAAARAAAAAAAAAA8AEQAAAAAABwAJAAAAAAAJAAAAAAAAAAkAAAAAAAAAAgADAAQAAAACAAMABAAAAAIAAwAEAAUAAgADAAQABQACAAMABAAFAAIAAwAEAAYAAAALAAwADQAAAAsADAAAAAAACwAMAAAAAAALAAAAAAAAAAsAAAAAAAAACwAMAAAAAAALAAwAAAAAAAsADAAAAAIAAwAFAAAAAAABAAIABQAAAAEAAgADAAIABgAIAAAABQAHAAAAAAAFAAcAAAAAAAcACQAAAAAAAQACAAMABAAMAA4AEAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAAEAAAAAAAAAAMABAAAAAAAAAABAAIABQAEAAAAAAAAAAIAAwAEAAAAAgADAAQAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAwAEAAAAAAACAAMABAAAAAQAAAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMABAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAACAAMABAAAAAMABAAAAAAABAAAAAAAAAARAAAAAAAAABEAAAAAAAAADgAQABIAAAACAAMABAAAAAIAAwAEAAAAAAABAAsADAAAAAEAAgAFAAAACwAMAAAAAgADAAUAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAADAAQAAAAAAAMABAAAAAAAAwAEAAAAAAACAAMA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jgCPAEIAQwBCAI8AkACRAE4ATwBOAJEAkgCTAJQAlQCUAJMAlgCXAJgAmQCYAJcAmgCbAD4APwA+AJsAnACdAEoASwBKAJ0AngCfAKAAoQCgAJ8AogCjAFIAUwBSAKMApAClAKYApwCmAKUAqACpAKoAqwCqAKkArACtAK4ArwCuAK0AsACxALIAswCyALEAtAC1ALYAtwC2ALUAuAC5ALoAuwC6ALkAvAC9AL4AvwC+AL0AwADBAMIAwwDCAMEAxADFAMYAxwDGAMUAyADJAMoAywDKAMkAzADNAM4AzwDOAM0A0ADRANIA0wDSANEA1ADVANYA1wDWANUA2ADZANoA2wDaANkA3ADdAN4A3wDeAN0A4ADhAOIA4wDiAOEA5ADlAOYA5wDmAOUA6ADpAOoA6wDqAOkA7ADtAO4A7wDuAO0A8ADxAPIA8wDyAPEA9AD1APYA0gD2APUA9wD4APkA+gD5APgA+wD8AP0A3AD9APwA/gD/AAABAQEAAf8AAgEDAQQBBQEEAQMBBgEHAQgBCQEIAQcBCgELAQwBDQEMAQsBDgEPARABEQEQAQ8BEgETARQBFQEUARMBFgEXARgBGQEYARcBGgEbARwBHQEcARsBHgEfASABIQEgAR8BIgEjASQBJQEkASMBJgEnASgBKQEoAScBKgErASwBLQEsASsBLgEvATABMQEwAS8BMgEzATQBNQE0ATMBNgE3ATgBOQE4ATcBOgE7ATwBPQE8ATsBPgE/AUABQQFAAT8BQgFDAUQBRQFEAUMBFwEjAUYBRwFGASMBSAFJARoBSgEaAUkBSwFMAR4BHwEeAUwBTQFHASIBIwEiAUcBTgFPAVABUQFQAU8BUgFTAVQBVQFUAVMBVgFXAVgBWQFYAVcBWgFbAVwBXQFcAVsBXgFfAWABYQFgAV8BYgFjAWQBZQFkAWMBZgFnAWgBaQFoAWcBagFrAWwBbQFsAWsBbgFvAXABcQFwAW8BcgFzAWIBYwFiAXMBdAF1AXYBdwF2AXUBeAF5AVIBUwFSAXkBegF7AXwBfQF8AXsBfgF/AYABgQGAAX8BggGDAYQBhQGEAYMBhgGHAYgBiQGIAYcBigGLAYwBjQGMAYsBjgGPAZABkQGQAY8BkgGTAZQBlQGUAZMBlgGXAZgBmQGYAZcBmgGbAZwBnQGcAZsBngGfAaABoQGgAZ8BogGjAaQBpQGkAaMB1wDVAKYBpwGmAdUAzQCoAc8AqQHPAKgBqgGrAawBrQGsAasBrgGvAbABsQGwAa8BsgGzAbQBtQG0AbMBtgG3AbgBuQG4AbcBugG7AbwBvQG8AbsBvgG/AcABwQHAAb8BwgHDAcQBxQHEAcMBxgHHAcgByQHIAccBygHLAcwBzQHMAcsBzgHPAdAB0QHQAc8B0gHTAdQB1QHWAdcB2AHZAdoB2wHaAdkB3AHdAd4B3wHgAeEB4gHjAeQB5QHkAeMB5gHnAegB6QHoAecB6gHrAewB7QHsAesB7gHvAfAB8QHwAe8B8gHzAfQB9QH0AfMB9gH3AfgB+QH4AfcB+gH7AfwB/QH8AfsB/gH/AQACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIMAgsCDgIPAhACEQIQAg8CEgITAhQCFQIUAhMCFgIXAhgCGQIYAhcCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIoAicCKgIrAiwCLQIsAisCLgIvAjACMQIyAjMCNAI1AjYCNwI2AjUCOAI5AjoCOwI6AjkCPAI9Aj4CPwI+Aj0CQAJBAkICQwJCAkECRAJFAkYCRwJIAkkCSgJLAkwCTQJMAksCTgJPAlACUQJQAk8CUgJTAlQCVQJWAlcCWAJZAloCWwJaAlkCXAJdAl4CXwJeAl0CYAJhAmICYwJiAmECZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJyAnECdAJ1AnYCdwJ2AnUCeAJ5AnoCewJ6AnkCfAJ9An4CfwJ+An0CgAKBAoICgwKCAoEChAKFAoYChwKGAoUCiAKJAooCiwKKAokCjAKNAo4CjwKOAo0CkAKRApICkwKSApEClAKVApYClwKWApUCmAKZApoCmwKaApkCnAKdAp4CnwKeAp0CoAKhAqICowKiAqECpAKlAqYCpwKmAqUCqAKpAqoCqwKqAqkCrAKtAq4CrwKuAq0CsAKxArICswKyArECtAK1ArYCtwK2ArUCuAK5AroCuwK6ArkCvAK9Ar4CvwK+Ar0CwALBAsICwwLCAsECxALFAsYCxwLGAsUCyALJAsoCywLKAskCzALNAs4CzwLOAs0C0ALRAtIC0wLSAtEC1ALVAtYC1wLWAtUC2ALZAtoC2wLaAtkC3ALdAt4C3wLeAt0C4ALhAuIC4wLiAuEC5ALlAuYC5wLmAuUC6ALpAuoC6wLqAukC7ALtAu4C7wLuAu0C8ALxAvIC8wLyAvEC9AL1AvYC9wL2AvUC+AL5AvoC+wL6AvkC/AL9Av4C/wL+Av0CAAMBAwIDAwMCAwEDBAMFAwYDBwMGAwUDCAMJAwoDCwMKAwkDDAMNAw4DDwMOAw0DEAMRAxIDEwMSAxEDFAMVAxYDFwMWAxUDGAMZAxoDGwMaAxkDHAMdAx4DHwMeAx0DIAMhAyIDIwMiAyEDJAMlAyYDJwMmAyUDKAMpAyoDKwMqAykDLAMtAy4DLwMuAy0DMAMxAzIDMwMyAzEDNAM1AzYDNwM2AzUDOAM5AzoDOwM6AzkDPAM9Az4DPwM+Az0DQANBA0IDQwNCA0EDRANFA0YDRwNGA0UDSANJA0oDSwNKA0kDTANNA04DTwNOA00DUANRA1IDUwNSA1EDVANVA1YDVwNWA1UDWANZA1oDWwNaA1kD6gJcA6cCXQOnAlwDSgNeAy8DXwMvA14DYANhA9cCYgPXAmEDtgJjA1sDZANbA2MDNgNlA8sCZgPLAmUDDgNnA/MCaAPzAmcDaQNqA2sDbANrA2oDbQNuA9sCbwPbAm4DxgJwA58CcQOfAnADQgNyA3MDdANzA3IDdQN2A3cDeAN3A3YDeQPDAnoDwQJ6A8MCewN8A30DfgN9A3wDfwOAA4EDggODA4QDhQOGA4cDiAOrAokDigOLA4wDjQOMA4sDjgOPA5ADkQOSA5MDlAOVA5YDlwOWA5UDmAOZA5oDmwOaA5kDnAOdA54DnwOeA50DoAOhA6IDowOiA6EDpAOlA6YDpwOmA6UDqAOpA6oDqwOqA6kDrAOtA64DrwOuA60DsAOxA7IDswOyA7EDtAO1A7YDtwO2A7UDuAO5A7oDuwO6A7kDvAO9A74DvwO+A70DwAPBA8IDwwPCA8EDxAPFA8YDxwPGA8UDyAPJAz8DPgM/A8kDygPLA8wDzQPOA88D0APRA9ID0wPUA9UD1gPXA7MCsgKzAtcDFQPYAxcD2QMXA9gD2gPbA0cDRgNHA9sD3APdA94DuQLfA7sC4APhA+ID4wPkA+UD5gPnA6MCogKjAucDBQPoAwcD6QPqA+sD7APtA+4D7wPuA+0DvgLwA/ED8gPxA/AD8wP0A/UD9gP3A/gD+QP6A/sD/AP9A/4D/wMABAEEAgQBBAAEAwQEBAUEBgQFBAQEBwQIBAkECgQLBAwEDQQOBA8EEAQRBBIEEwQUBBUEFgQVBBQEFwQYBBkEGgQZBBgEGwQcBB0EHgQdBBwEHwQgBCEEIgQhBCAEIwQkBCUEJgQlBCQEJwQoBCkEKgQpBCgEKwQsBC0ELgQtBCwELwQwBDEEMgQxBDAEMwQ0BDUENgQ1BDQENwQ4BDkEOgQ5BDgEOwQ8BD0EPgQ9BDwEPwRABEEEQgRBBEAEQwREBEUERgRFBEQERwRIBEkESgRJBEgESwRMBE0ETgRNBEwETwRQBFEEUgRRBFAEUwRUBFUEVgRVBFQEVwRYBDsEWQQ7BFgEWgRbBFwEXQRcBFsEXgRfBBMEYAQTBF8EYQRiBFsEYwRbBGIEZARlBDMEZgQzBGUEGwRnBGgEXwRoBGcEaQRqBFcEWARXBGoEawRsBEsEbQRLBGwEbgRvBFQEcARUBG8EcQRyBHMEdARzBHIEAAACAHUEdgR1BAIAdwR4BAUABwAFAHgEeQR6BAkACwAJAHoEewR8BA0ADwANAHwEfQR+BBEAEwARAH4EFAB/BBUAgAQVAH8EVgQYAIEEGQCBBBgAggSDBBwAGgAcAIMEXQQgAIQEIQCEBCAAhQSGBCMAJQAjAIYEKQCiAygAhwQoAKIDLQCmAywAiAQsAKYDMQCJBDAAigQwAIkENQCqAzQAiwQ0AKoDOQCuAzgAjAQ4AK4DPQCyAzwAjQQ8ALIDQQC2A0AAjgRAALYDRQC6A0QAjwREALoDSQCQBEgAAwRIAJAETQC+A0wAkQRMAL4DUQDCA1AAkgRQAMIDVQDGA1QAkwRUAMYDWABZAJQElQSUBFkAXABdAJYElwSWBF0AYQCYBGAAmQRgAJgEZABlAJoEmwSaBGUAaABpAJwEnQScBGkAbABtAJ4EnwSeBG0AcABxAKAEoQSgBHEAdAB1AKIEowSiBHUAeAB5AKQEpQSkBHkAfAB9AKYEpwSmBH0AgACBAKgEqQSoBIEAhACFAKoEqwSqBIUAjgBCAIcAiQCHAEIAjACNAKwErQSsBI0AkgCUAI8AQwCPAJQAmACuBJEATwCRAK4EmgA+AJMAlQCTAD4AmACZAK4ErwSuBJkAsASxBJsAPwCbALEEngCgAJ0ASwCdAKAAsgRGAJ8AoQCfAEYAjACsBKMAUwCjAKwEswQqAKcApgCnACoAqQC0BKsAtQSrALQEtgS3BKwArQCsALcEuASxALkEsAC5BLEAtgC3ALoEuwS6BLcAvAS4AL0EugC9BLgAvgC/AL4EvwS+BL8AygDLAMAAwQDAAMsAzgDPAMYAxADGAM8AwATJAMEEyADBBMkAwgSsAcwAzQDMAKwB0QDQAKQBogGkAdAAwwTEBNQA1QDUAMQE2gDFBNgAxgTYAMUE3gDfAMcExQTHBN8A4gDIBOAAyQTgAMgEygTkAMgE5gDIBOQA6QDLBOsAwATrAMsE7gDMBOwA0wDsAMwEzQTOBPAA8QDwAM4EzwT0ANAE9gDQBPQAxwT3AN4A+QDeAPcA0QTSBPsA/AD7ANIE0wQBAdQE/wDUBAEB1QQCAdYEBAHWBAIBBwETAQkB1wQJARMBCwHYBA0B2QQNAdgEEQF2BBAB2gQQAXYEEwESAdcE2wTXBBIBFgElARcBIwEXASUB3ARIARwBGgEcAUgBIAHdBB4B3gQeAd0EJAHfBCIB4AQiAd8EPAE9ASgBJgEoAT0B4QTiBCoBKwEqAeIENgEuATcBMAE3AS4B4wQ0AeQENQHkBDQB5QTmBDkBOAE5AeYE5wToBDoBOwE6AegE6QQ+AeoEQAHqBD4BLwFCATEBRAExAUIBFwFGARkB6wQZAUYBGwEaAewESgHsBBoBTAFLAS8BQgEvAUsBRwFNAekEPgHpBE0B7QTuBE4BTwFOAe4EUgFUAWkBaAFpAVQBVgHvBFcB8ARXAe8EbQFcAWwBXQFsAVwBhwFeAfEEYAHxBF4BYgFkAfIE8wTyBGQBZgH0BGcBdwFnAfQE9QT2BGoBawFqAfYE9wT4BG4BbwFuAfgEcgH5BHMB+gRzAfkE+wT8BHQBdQF0AfwEeAH9BHkB/gR5Af0EegF/AXsB9gR7AX8BfwF+AfYEawH2BH4BPQGCASYBhAEmAYIBiAE7AYYB6ASGATsBDgGMAf8EjQH/BIwBAAWRAQEFjwEBBZEBAgWVAQMFkwEDBZUBEAHaBJkBmAGZAdoEBAUFBZoBmwGaAQUFBgV9Ap4BnwGeAX0CowEHBaUBCAWlAQcFCQUKBacBpgGnAQoFqAELBakBDAWpAQsFqwENBa0BDgWtAQ0FrwEPBbEBEAWxAQ8FqQEMBbMBtQGzAQwFuAERBbYBEgW2AREFvQG+AbwBwAG8Ab4BvwHDAcEBEwXBAcMBwwHCARMFFAUTBcIByAHJARUFcgQVBckBFgUXBcoBywHKARcFGAUZBc4BzwHOARkF0wEaBRsFHAUbBRoFHQUeBR8FIAXYASEFIgUjBSQF4QElBSYF4wEnBeUBKAXlAScFKQUqBSsF6AEsBeYB7AHtAS0FLgUtBe0B8AEvBe4BMAXuAS8FMQUyBTMF9AE0BfIB9wE1BfkBNgX5ATUFNwU4BfoB+wH6ATgFOQU6BTsFAwI7BToFPAU9BT4FPwUJAkAFDAINAkEFQgVBBQ0CQwVEBQ4CRQVGBUcFSAUSAkkFFAJJBRICSgVLBUwFTQVOBRkCTwVQBVEFUgUfAlMFVAVVBSACVgVXBVgFJwJZBSkCWgUpAlkFLAJbBSoCXAVdBV4FXwVgBWEFYgVhBWAFNQJjBTcCZAU3AmMFZQU4AmYFOgJmBTgCPgI/AmcFaAVpBWoFQgJrBUACbAVtBW4FbwVEAnAFcQVyBXMFdAV1BXYFdwVNAngFeQV6BU4CTwJOAnoFewV8BX0FUwJSAn4FfwWABYEFggWDBYQFXgJfAoUFhgWHBYgFiQWKBWACYQJgAooFiwWMBY0FaAKOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQVxApoFeAJ0AnkCdgJ5AnQCegJ7ApsFnAWbBXsCnQV8Ap4FfgKeBXwCnwWAAqAFggKgBYAChgKhBYQCDAGEAqEFCQHXBIgCiQKIAtcEDQHZBIwCjQKMAtkECAGQAqIFkgKiBZACowWUAqQFlgKkBZQC2wSlBZgCmQKYAqUFxALGAp0CnwKdAsYCoQLgAqMC4gKjAuAC6ALqAqUCpwKlAuoCpgWnBagCqQKoAqcFrQKwAq8CsgKvArACsQJUA7MCVgOzAlQD1ALWArUCtwK1AtYCAAMCA7gCuQK4AgIDTANOA70CvwK9Ak4DqAWpBcACwQLAAqkF2ALaAsUCxwLFAtoCNAM2A8kCywLJAjYDqgXOAqsFzwKrBc4C0QKqAtMCqwLTAqoCrAVgA9UC1wLVAmADrQVtA9kC2wLZAm0D3QKuBd8CrwXfAq4F4QL+AuMC/wLjAv4CsAXmArEF5wKxBeYCsgWzBekC6wLpArMFtAW1BewC7QLsArUFDAMOA/EC8wLxAg4DGAMaA/UC9wL1AhoDtgW3BfgC+QL4ArcFOgM7A/wC/QL8AjsDAQNEAwMDRgMDA0QD7gLvAgQDBQMEA+8C5AIKA+UCCwPlAgoDyALKAg0DDwMNA8oCEQOgAhMDogITA6AC+gL7AhQDFQMUA/sCLAMuAxkDGwMZAy4DuAXPAxwDHQMcA88DIQMGAyMDBwMjAwYDuQUmA7oFJwO6BSYDKQMWAysDFwMrAxYDSANKAy0DLwMtA0oDHgMfAzADMQMwAx8DWANaAzUDNwM1A1oDugK7AjgDOQM4A7sCPQMgAz8DIgM/AyADnAKeAkEDQwNBA54CRQMoA0cDKgNHAygDpAKmAkkDSwNJA6YCuwW8BU0DTwNNA7wFUQO9BVMDvgVTA70FVQMyA1cDMwNXAzIDtAK2AlkDWwNZA7YCpgKnAr8FXQO/BacCLgMvA8AFXwPABS8D1gLXAsEFYgPBBdcCWgNbA8IFZAPCBVsDygLLAsMFZgPDBcsC8gLzAsQFaAPEBfMCvAVrA8UFbAPFBWsD2gLbAsYFbwPGBdsCngKfAscFcQPHBZ8CswVzA8gFdAPIBXMDdgN1A8kFygXLBcwFegPNBXkDzgV5A80FfAPPBX4D0AV+A88FgwPRBdIF0wXUBdUF1gXXBdgF2QWIA9oFiwOKA0gF2wXcBd0FkgMYAt4FTgXeBRgC3wXgBeEFUgWXAx8CmgPiBZgD4wXkBeUF5gXnBegF6QWfAyEFhwSiA+oFowPqBaIDiASmA+sFpwPrBaYDiwSqA+wFqwPsBaoDjASuA+0FrwPtBa4DjQSyA+4FswPuBbIDjgS2A+8FtwPvBbYDjwS6A/AFuwPwBboDkQS+A/EFvwPxBb4DkgTCA/IFwwPyBcIDkwTGA/MFxwPzBcYD9AX1BfYF9wX4BcgDzgP5BfoF+wX6BfkF/AX9Bf4F/wX+Bf0FAAYBBgIGAwYEBtYD2AMFBtkDBgYHBggG2wPaA4sFjAWLBdoD3wNsAgkGlAUJBmwCCgZxAgsGmQULBnECDAYNBg4GiQV+BeYD6ANbBQ8GEAYRBhIGYAPuA2ED7wNhA+4DbQPxA24D8gNuA/EDEwYUBhUGFgYVBhQG/QM0BRcGGAYXBjQFqAMBBKkDAgSpAwEEvAMFBL0DBgS9AwUECwQZBhoGGwYcBh0GEQQeBh8GZQUgBnAFIQZeBBUEEwQVBF4EGQQiBhcEYQQXBCIGHQQjBhsEZwQbBCMGHwQkBiAEJQYgBCQGIwQmBiQEJwYkBCYGKgQoBCIEIQQiBCgELQQuBE8EUARPBC4ELwQoBjAEKQYwBCgGKgZkBDUEMwQ1BGQEOQQ6BCsGLAYrBjoELQZXBD0EOwQ9BFcEbgQ/BC4GQQQuBj8ERQRGBC8GMAYvBkYERwQaBEgEGARIBBoEMQZrBE0ESwRNBGsEMgYzBlIEUQRSBDMGPwRuBFMEVARTBG4EOwRZBDwENAY8BFkEFwRhBFoEWwRaBGEEEwRgBBQENQYUBGAEYwQ2BlsEXQRbBDYGZgQ3BjMENAQzBDcGHAQbBDgGaAQ4BhsEJAQnBmoEWARqBCcGbQQ5BksETARLBDkGcAQ6BlQEVgRUBDoGcQQ7BnIEFQVyBDsGAgADBXYE2gR2BAMF9wQ8BgUAdwQFADwGPQZ5BPkECQD5BHkE/AR7BD4GDQA+BnsE/gR9BD8GEQA/Bn0EFABABn8EQQZ/BEAGgQQZAEIGQwZCBhkAHABEBoIERQaCBEQGhAQhAMABvAHAASEAIwAUBYUERgaFBBQFKQBHBqIDoAOiA0cGLQBIBqYDpAOmA0gGMQBJBokESgaJBEkGNQBLBqoDqAOqA0sGOQBMBq4DrAOuA0wGPQBNBrIDsAOyA00GQQBOBrYDtAO2A04GRQBPBroDuAO6A08GSQBQBpAEUQaQBFAGTQBSBr4DvAO+A1IGUQBTBsIDwAPCA1MGVQBUBsYDxAPGA1QGVQZWBlkAlQRZAFYGVwZYBl0AlwRdAFgGWQZaBmEAmARhAFoGmwRlAFsGXAZbBmUAXQZeBmkAnQRpAF4GXwZgBm0AnwRtAGAGYQZiBnEAoQRxAGIGYwZkBnUAowR1AGQGZQZmBnkApQR5AGYGZwZoBn0ApwR9AGgGaQaWAIEAqQSBAJYAagaKAIUAqwSFAIoAogSOAGsGhwBrBo4AkABOAI0ArQSNAE4AZAaSAKMEjwCjBJIAlgCYAKkEkQCpBJgAoASaAGwGkwBsBpoAnABKAJkArwSZAEoAYgawBKEEmwChBLAEaAaeAKcEnQCnBJ4ApASyBG0GnwBtBrIEigCMAKsEowCrBIwAlgSzBG4GpwBuBrMEbwa0BHAGqQBwBrQEcQa2BHIGrAByBrYEsABzBrkEdAa5BHMGqwC1BLcAuwS3ALUEtwS9BK0AugCtAL0EvwCxAL8EuAS/BLEAwAB1BsoAdgbKAHUGdwbOAHgGxgB4Bs4AyAB5BsEEegbBBHkGegbCBHsGzAB7BsIE0ADWAKIB1wCiAdYA1AB8BsMEfQbDBHwGfgbHBNoAxQTaAMcExQTfAMYEfwbGBN8AyATiAMoEgAbKBOIA0ATJBOYAyATmAMkE2ADGBOkAywTpAMYE4ADJBO4AzATuAMkEzQTwAIEGggaBBvAAyQTQBMwE9gDMBNAE/QDcAPkA3gD5ANwAgwbRBIQG+wCEBtEE1AT/AIUGhgaFBv8AhwaIBgQB1gQEAYgGEwEHARUBiQYVAQcBigbYBIsGCwGLBtgEjAZ1BBEBdgQRAXUEEgGNBtsEpQXbBI0GjgaPBhYBJQEWAY8GHAGQBtwEkQbcBJAG3QQgAZIGkwaSBiABlAaVBiQB3wQkAZUGlgY8AZcGKAGXBjwBKgGYBuEEmQbhBJgGNwEwAZoGmwaaBjAB5AQ1AZwGnQacBjUBOQGeBuUEnwblBJ4GOgGgBucEoQbnBKAGQAGiBuoEoQbqBKIGMQFEAaMGpAajBkQBRgGlBusEpgbrBKUG7ARKAeMENAHjBEoBSwGnBkIBQwFCAacGTQGoBj4BPwE+AagGqQbtBKoGTgGqBu0EVAGrBmgBrAZoAasG7wRWAa0GrgatBlYBbAFdAa8GsAavBl0B8QRgAbEGsgaxBmABZAGzBvMEtAbzBLMG9ARmAbEGtQaxBmYBtAb1BLYGagG2BvUEbgG3BvcEPAb3BLcGuAY9BnIB+QRyAT0GdAG5BvsEugb7BLkGuwa8BngB/QR4AbwGvQaBAXoBfwF6AYEBfgG+BmsBbQFrAb4GJwEmAb8GhAG/BiYBggE9AYgBOwGIAT0BfQL/BJ8BjQGfAf8EAgUBBZUBjwGVAQEFAwWTAdoEmAHaBJMBDgEQAYwBmQGMARABkQEABZoBBAWaAQAFBgWeAcAGwQbABp4BowGmAQcFCgUHBaYBpwHCBgkFwwYJBcIGrQEOBagBCwWoAQ4FqwGuAQ0FsAENBa4BxAbFBq8BDwWvAcUGzwCpAcQAswHEAKkBuwG6AbgBEQW4AboBxgbHBr0BvgG9AccGyAbFAb8BwwG/AcUByQZGBsIBFAXCAUYGyQHKBnIEdARyBMoGywYWBcwGygHMBhYFzgUYBc0GzgHNBhgFzgbPBtAGGgXTAckF0QbSBucF6QUhBdMG3AHUBtUGGQUiBc8BGwUcBeMBJwXjARwF1gbXBtgGLAXoASAF7QHZBi4FIwUuBdkG5QEoBfABLwXwASgFNAX0ARgG5gEYBvQB7AEtBfcBNQX3AS0F+gHuATcFMAU3Be4B2gbbBtwGOwXyATkF3QbeBgQCQAXfBjYFDQL7AUIFOAVCBfsB4AbhBuIGDgIDAkMFSQUUAj8FCQI/BRQCGQIMAk0FQQVNBQwC4wbkBuUGRAVTBQ8C+wXmBucGVwXoBukG6gbrBuwGWQUnAvgF7QbuBu8G8AZbBfEG8gZWBfMGVQX0BiECKQJaBTUC9Qb2BvcGKgL4BjoCZgU6AvgG+QYzAvoGYAX7BmIFNwJkBUICawVCAmQFHgZIAvwGOAJlBUYCPgJnBUsC/Qb+Bv8GTgJAAnkFAAcBBwIHbwUDB0QCBAcFBwYHTQJ3BVgCBwdYAncFXwJPAggHegUIB08CfgWJBVMCYAJTAokFCQdmAoIFgQUKB2gClQVeApMFhQWTBV4CcAJhApoFCwcMBw0HeQJ2AgAFDgcABXYCAgWcBQEFewIBBZwFngV+Ap8FgAKfBX4CoAWCAg8HEAcPB4ICoQWGAqMFlAKjBYYCiAKQAgkBCAEJAZACDAENAYQCjAKEAg0BogWSAhEHEgcRB5ICpQWkBZkClgKZAqQF1wTbBIkCmAKJAtsEnQITB8QCFAfEAhMH4AKhAhUHFgcVB6EC6AKlAhcHGAcXB6UCqAIZB6YFGgemBRkHGwccB60CsAKtAhwHVAOxAh0HHgcdB7EC1AK1Ah8HIAcfB7UCIQcAAyIHuAIiBwADvQIjB0wDJAdMAyMHJQeoBSYHwAImB6gF2ALFAicHKAcnB8UCyQIpBzQDKgc0AykHzwIrB6sFLAerBSsHLQcuB9ECqgLRAi4HrAXVAi8HMAcvB9UCrQXZAjEHMgcxB9kCMwc0B90CrgXdAjQHNQc2B+EC/gLhAjYH5wI3B7EFOAexBTcHsgXpAjkHOgc5B+kCOwe0BTwH7AI8B7QFDAPxAj0HPgc9B/EC9QI/BxgDQAcYAz8HQQe2BUIH+AJCB7YFQwc6A0QH/AJEBzoDRQdGBwEDRAMBA0YHRwfuAkgHBANIB+4C5QILA0kHSgdJBwsDyAINA0sHTAdLBw0DTQdOBxEDoAIRA04HTwf6AlAHFANQB/oCGQNRBywDUgcsA1EHUwe4BVQHHANUB7gFVQdWByEDBgMhA1YHJwNXB7oFWAe6BVcHWQdaBykDFgMpA1oHLQNbB0gDXAdIA1sHXQceA14HMANeBx4DNQNfB1gDYAdYA18HYQe6AmIHOANiB7oCIAM9A2MHZAdjBz0DQQNlB5wCZgecAmUHKANFA2cHaAdnB0UDpAJJA2kHagdpB0kDTQNrB7sFbAe7BWsHbQduB1EDvQVRA24HbwdwB1UDMgNVA3AHWQNxB7QCcge0AnEHvwVdA1YAVwBWAF0DwAVfA1oAWwBaAF8DwQViA2IAYwBiAGIDwgVkA2YAZwBmAGQDwwVmA2oAawBqAGYDxAVoA24AbwBuAGgDxQVsA3IAcwByAGwDxgVvA3oAewB6AG8DxwVxA34AfwB+AHEDyAV0A4IAgwCCAHQDdQNzB3QHdQd2B3cHegN4B80FeQfNBXgHegd7B3wDzwV8A3sH1QV8B30Hfgd/B4MDgAeBB9YFggeGA4MHigOEBxIChQeGB4cHkgOIBxgCFgIYAogHiQcdApUDHwKVAx0CigeLB+AGQwU6BZoDjAfXBuYFHgWNB44H6gWjA48HkAePB6MD6wWnA5EHkgeRB6cD7AWrA5MHlAeTB6sD7QWvA5UHlgeVB68D7gWzA5cHmAeXB7MD7wW3A5kHmgeZB7cD8AW7A5sHnAebB7sD8QW/A50HngedB78D8gXDA58HoAefB8MD8wXHA+QCCgPkAscDyAOhB/cFogf3BaEHzgOjB/kFpAf5BaMHpQemB/wF/QX8BaYH1gOnBwMGqAcDBqcHqQeqB9gDqwesB60H2gOuB4wFrweMBa4H3wOwB2wCagJsArAHsQdzAgoGcQIKBnMC5gOyB4kFigWJBbIHswf4BugDtAe1B7YHYQPvA7cHuAe3B+8DbgPyA7kHuge5B/IDEwa7BxQGvAcUBrsH/QO9BzQFvgc0Bb0HqQMCBKoFzgKqBQIEvQMGBLkFJgO5BQYEvwfABx0GwQcdBsAHwgfDB3AFbwVwBcMHxAchBsUHFQTFByEGIgYZBMYHxwfGBxkEyAfGBx0EIwYdBMYHyQckBsoHHwTKByQGywfMByMEJgYjBMwHKATNByEEzgchBM0HzwfQBy4EUAQuBNAHKAYvBNEH0gfRBy8E0wcqBtQHNQTUByoGOgTVBywG1gcsBtUH0wctBtcHPQTXBy0GLgZBBNgH2QfYB0EE2gfJB0YEMAZGBMkHGgRHBNsH3AfbB0cE3QcxBt4HTQTeBzEGUgTfBzIG1gcyBt8HUwTgBz8EQAQ/BOAH4QfiB1kENAZZBOIHWgTjBxcEGAQXBOMH5AflB2AENQZgBOUH5gfnB2MENgZjBOcH6AfpB2YENwZmBOkHOAZoBCkE6gcpBGgE6wcmBGoEJARqBCYE7AfGAW0EOQZtBMYB7QfLBnAEOgZwBMsGOwZxBO4H7wfuB3EEAgUDBQMAAgADAAMF+AT3BAQABQAEAPcE+QQJAPoECAD6BAkAvAY+BgwADQAMAD4G8Ac/BhAAEQAQAD8GFAAPAEAGfARABg8AFwDxBxkAQwYZAPEHHAAdAEQG8gdEBh0AHwC6ASEAvAEhALoBIwAiABQFEwUUBSIA8wdHBicAKQAnAEcG9AdIBisALQArAEgGpABJBi8AMQAvAEkGMwD1BzUASwY1APUH9gdMBjcAOQA3AEwG9wdNBjsAPQA7AE0GsQROBj8AQQA/AE4GlABPBkMARQBDAE8GiABQBkcASQBHAFAGoABSBksATQBLAFIGrgRTBk8AUQBPAFMGrARUBlMAVQBTAFQGVwD4B1kAVQZZAPgHWwD5B10AVwZdAPkHXwD6B2EAWQZhAPoHYwC3B2UAXAZlALcHZwD7B2kAXQZpAPsHawD8B20AXwZtAPwHbwD9B3EAYQZxAP0HcwD+B3UAYwZ1AP4HdwD/B3kAZQZ5AP8HewC5B30AZwZ9ALkHfwAACIEAaQaBAAAIgwABCIUAagaFAAEIZgZrBoYAhwCGAGsGqASQAIsAjQCLAJAAogSjBI4AjwCOAKMEqASpBJAAkQCQAKkEZAZsBpIAkwCSAGwGpgScAJcAmQCXAJwAoAShBJoAmwCaAKEEpgSnBJwAnQCcAKcEaAZtBp4AnwCeAG0GqgSrBKIAowCiAKsEWgZuBqUApwClAG4GAghwBqgAqQCoAHAGcgasAAMIrgADCKwAsgAECLAAcwawAAQIqgCrALUAtwC1AKsArQC6AK8AuwCvALoAvQCzAL8AsQC/ALMAwgAFCMAAdQbAAAUIBgh4BscAxgDHAHgGygB2BsgAeQbIAHYGewbMAHcGzgB3BswA0gD1ANAA1gDQAPUA1gD1ANQAfAbUAPUA2gDbAH4G0wR+BtsA3QAHCN8AfwbfAAcI4gDjAIAGCAiABuMA5wDPBOYA0ATmAM8E6QDoANgA2QDYAOgA7gDvAOAA4QDgAO8A8ADyAIIGfQaCBvIAzAT2ANMA0gDTAPYACQj9APoA+QD6AP0ACQiEBv0A+wD9AIQGCgiGBv4A/wD+AIYGCwiHBgUBBAEFAYcGBgEMCAcBiQYHAQwICwEKAYsGDQiLBgoBjAYRAQ4IDwEOCBEBDwiNBhQBEgEUAY0GFgEYAY4GEAiOBhgBHQERCBwBkAYcAREIkwYgARIIIQESCCABjwaUBiUBJAElAZQGEwiXBikBKAEpAZcGLAEUCCoBmAYqARQIMAExAZsGowabBjEBNQEzAZ0GEwidBjMBOQE3AZ4GmgaeBjcBPAGWBjoBoAY6AZYGQAFBAaIGFQiiBkEBRQEUCEQBpAZEARQIRgFHAaUG6QSlBkcBSQEyAUoBNAFKATIBpwZLAd4EHgHeBEsBqAZNAeAEIgHgBE0BFgiqBlABTgFQAaoGVAFVAasGFgirBlUBWAEXCFYBrgZWARcIWwEXCF0BsAZdARcIYQEYCGABsgZgARgIZAFlAbMGGQizBmUBaAGsBmYBtQZmAawGtgZqAa8GbAGvBmoBbgFwAbcGWQG3BnABcgFiAbgG8gS4BmIBdAF2AbkGGgi5BnYBeAFSAbsGaQG7BlIBvQZ6ARsIfAEbCHoBgAEcCH4BvgZ+ARwIvwaEAVEBhQFRAYQBiAGJAYIBgwGCAYkBiwGhAY0BnwGNAaEBlAGVAY4BjwGOAZUBlgGYAZIBkwGSAZgBlwGKAZkBjAGZAYoBmgGcAZEBkAGRAZwBngGgAcEGHQjBBqABogHXAKMBpgGjAdcA1QDEBKcBwganAcQErAGtAc0AqAHNAK0BqgEeCKsBrgGrAR4IHgjEBq4BrwGuAcQGxQDEALIBswGyAcQAuAG5AbsBHwi7AbkBuwEfCL0Bxga9AR8IvwG+AcgGxwbIBr4BwgHEAckGIAjJBsQBxwHnB8kBygbJAecHzAHpB8oBzAbKAekH0AF7B84BzQbOAXsHeQchCNIB0wHSASEIIggjCCQIJQjTBtsBJQXgASYI0QHPAScI1AEbBeIB4wHiARsF6AHpAdgB2QHYAekB6wEoCO0B2QbtASgI8AHxAeUB5AHlAfEBKQgqCCsI5wHmAfUB6gHsAfYB9wH2AewB/AHvAfoB7gH6Ae8B8gE7BfMBAgLzATsFPAUsCC0ILgjdBgYCCwL9AQ0C+wENAv0BAwIOAgECEAIBAg4CFAIVAgkCBwIJAhUCFwIKAhkCLwgwCDEIHgIRAjIIDwIyCBECMwg0CFcFNQggAjYIpAc3CCYCOAg5CDoILAItAvEGogfxBi0CYQU7CCUCIwIlAjsIKAIpAjQCNQI0AikCOgI7AioCKwIqAjsCPQI8CD8CYgU/AjwIQgJDAjcCNgI3AkMCRgI9CDgCPgg/CEAIPAI+AkoCSwJKAj4CUAJBAk4CQAJOAkECRAJSAkUCQQhCCH0FQwhECEUIRgh2BUcIXQJRAl8CTwJfAlECUwJgAkgIYgJICGACZgJJCIMFWwJZAkoIawJcApUFXgKVBVwCcgJjAnACYQJwAmMCdgJ3Ag4HSwgOB3cCeQIABXsCAQV7AgAFfgJ/AoACgQKAAn8CDggQB4MCggKDAhAHhgKHApQClQKUAocCkAKIApECigKRAogChAKMAoUCjgKFAowCkgKTAhIHTAgSB5MClgKXApkCmwKZApcCiQKYAosCmgKLApgCnAJmB50CEwedAmYHTgcWB6ACoQKgAhYHpQKkAhgHaQcYB6QCGQeoAi4HqgIuB6gCTQgbB6wCrQKsAhsHHAceB7ACsQKwAh4HtQK0AiAHcgcgB7QCIge4AmEHugJhB7gCvAJOCL0CIwe9Ak4IJgfAAk8IwgJPCMACxQLEAigHFAcoB8QCyAJLB8kCKQfJAksHzQJQCM8CKwfPAlAI0QLQAi0HUQgtB9AC1QLUAjAHHwcwB9QC2QLYAjIHJwcyB9gCUggzB9wC3QLcAjMHFQc1B+AC4QLgAjUH5QJJB+cCNwfnAkkH6QLoAjoHFwc6B+gC7gJHB+wCPAfsAkcH8QLwAj4HUwg+B/AC9AJUCPUCPwf1AlQI+gJPB/gCQgf4Ak8HRAf8AjYH/gI2B/wCIQdFBwADAQMAA0UHSAcEA1YHBgNWBwQDCwMJA0oHVQhKBwkDDQMMA0wHPQdMBwwDVghNBxADEQMQA00HUAcUA1oHFgNaBxQDGANABxkDUQcZA0AHHgNdBxwDVAccA10HYwdVByADIQMgA1UHJQNXCCcDVwcnA1cIZwdZBygDKQMoA1kHLANSBy0DWwctA1IHXgcwA3AHMgNwBzADNAMqBzUDXwc1AyoHOgNDBzgDYgc4A0MHWAhkBzwDPQM8A2QHQANZCEEDZQdBA1kIRgdoB0QDRQNEA2gHSQNIA2oHXAdqB0gDTAMkB00DawdNAyQHWghtB1ADUQNQA20HHQdvB1QDVQNUA28HWANgB1kDcQdZA2AHXAP4B10DVwBdA/gHXgP5B18DWwBfA/kHYQO3B2IDYwBiA7cHYwP7B2QDZwBkA/sHZQP8B2YDawBmA/wHZwP9B2gDbwBoA/0HagP+B2wDcwBsA/4HbgO5B28DewBvA7kHcAMACHEDfwBxAwAIcgMBCHQDgwB0AwEIWwhcCF0Icwd1A14IqQV4B8ECXwhgCGEIYghjCGQIfAN7A3oHZQhmCGcIaAh+B4IDaQhqCGsIiQOpAmwIjAPSAooDbQhuCG8IcAiIB5EDcQhyCHMIdAh1CHYIlQOUA4kHmgObA0MFRAVDBZsDdwh4CJwDnQOcA3gIoQOwBaMDkAejA7AFpQN5CKcDkgenA3kIqQOqBasDlAerA6oFrQN6CK8DlgevA3oIsQN7CLMDmAezA3sItQN8CLcDmge3A3wIuQN9CLsDnAe7A30IvQO5Bb8Dnge/A7kFwQN+CMMDoAfDA34IxQMIA8cDCgPHAwgDPwMiA8gDoQfIAyIDfwijB80DzgPNA6MHHwOlBzED/AUxA6UHgAiBCAEGpwfWA1YD+wKpBxUDrAeCCIMIRwMqA9oDrgfaAyoDAgOwB7kC3wO5ArAHOwOxB/0CCgb9ArEHhAiFCA0GsgfmA+IChgiHCIgItQeJCIoI7QOLCO8DuAfvA4sI8AN2APIDugfyA3YAjAiNCI4IEwaPCLsHkAiRCJII/QP8A70HAATMAgIEzgICBMwCBAQkAwYEJgMGBCQDkwiUCAoECQSVCJYIlwiYCBAEDwSZCJoIFQQWBMUHmwjFBxYEGQQaBMcH2wfHBxoEHQQeBMgHnAjIBx4EIQTOBx8EygcfBM4HywcjBJ0IJQSdCCMEJwSeCCgEzQcoBJ4ILgQsBM8HnwjPBywEMQSgCC8E0gcvBKAI1Ac1BKEINgShCDUEOAShCDoE1Qc6BKEIPQQ+BNcHoAjXBz4EQQRCBNkHogjZB0IEnAjaB0QERgREBNoHSQSbCEcE3AdHBJsITQROBN4HowjeB04EUgRQBN8H0AffB1AEVQSkCFME4AdTBKQIJwbhB1gEWQRYBOEHXAQkAFoE4wdaBCQAZwTkB18EYARfBOQHYwRiBOYHQwTmB2IEZgRlBOgHFgDoB2UE6gdoBF4EXwReBGgENwTrB2kEagRpBOsHbQRsBOwHHgDsB2wEcARvBO0HKwTtB28EcwQvBnEE7wdxBC8GAAUOBwQFpQgEBQ4HeQSmCHoEpwh6BKYIdwSoCHgEqQh4BKgIqgirCKcIegSnCKsIewSsCHwErQh8BKwIfQSuCH4Erwh+BK4IgwSCBLAIsQiwCIIEVQRWBLIIgQSyCFYEswi0CLUItgi1CLQIXARdBLcIhAS3CF0E8we4CEcGuQhHBrgI9Ae6CEgGuwhIBroIpgC8CKQASQakALwI9Qe9CEsGvghLBr0I9ge/CEwGwAhMBr8I9wfBCE0GwghNBsEIsQTDCE4GxAhOBsMIlACVAE8GxQhPBpUAiACJAFAGxghQBokAoAChAFIGxwhSBqEArgSvBFMGyAhTBq8ErAStBFQGyQhUBq0E+AfKCFUGywhVBsoI+QfMCFcGzQhXBswI+gfOCFkGzwhZBs4Itwe4B1wG0AhcBrgH+wfRCF0G0ghdBtEI/AfTCF8G1AhfBtMI/QfVCGEG1ghhBtUI/gfXCGMG2AhjBtcI/wfZCGUG2ghlBtkIuQe6B2cG2whnBroHAAjcCGkG3QhpBtwIAQjeCGoG3whqBt4I4AjhCPcHwQj3B+EIswTiCCoAKwAqAOII4wjkCDYANwA2AOQI5QjmCPQHugj0B+YI5wjoCPYHvwj2B+gI6QjqCCYAJwAmAOoI6wjsCDIAMwAyAOwIVgbtCO4I7wjuCO0IsATwCLEEwwixBPAI8QjyCDoAOwA6APIIsgTzCEYARwBGAPMI9Aj1CPYI9wj2CPUItAT4CLUE+Qi1BPgI+gj7CLYEtwS2BPsI/Aj9CP4I/wj+CP0IugS7BAAJAQkACbsEAgm8BAMJvQQDCbwEdQYFCAQJBQkECQUIBgl4BgcJBggHCXgGeQZ2BggJCQkICXYGCgkLCXcGewZ3BgsJDAkNCcMExATDBA0JDgkPCewA7QDsAA8J2wAQCdMEAQHTBBAJEQn8ABIJ0gQSCfwA1gSIBhMJFAkTCYgGFQkWCRcJ1QQXCRYJGAnDABkJwQAZCcMAggZ9BhoJfAYaCX0GGwkcCR0JHgkdCRwJywQfCcAEyQDABB8JIAkhCcoE5ADKBCEJIgkjCSQJJQkkCSMJfgbTBCYJ1AQmCdMEJwkoCSkJKgkpCSgJKwmhBSwJowUsCaEFLQkGBS4JwAYuCQYFLwmiBTAJEQcwCaIFMQmkBY0GpQWNBqQFMgkzCTQJNQk0CTMJNgneBDcJ3QQ3Cd4EOAk5CToJOwk6CTkJ3ASRBjwJPQk8CZEGMwE+CRMIlwYTCD4JPwmYBkUBFAhFAZgGQAlBCaMGmwajBkEJKQFCCRMInQYTCEIJngaaBkMJRAlDCZoGRQmgBkYJlgZGCaAGogYVCEcJSAlHCRUIFAgsAaQGSQmkBiwBMwkfAUoJTAFKCR8BSwlMCTYJTQk2CUwJTglPCVAJNQlQCU8JUQlSCesEGQHrBFIJVQFTCRYIqgYWCFMJUAFUCRYIqwYWCFQJFwhbAa4GVQmuBlsBVgmwBlgBFwhYAbAGVwmyBlgJGAhYCbIGWQlaCRkIswYZCFoJtQasBlsJXAlbCawGXQleCa8GtgavBl4JXwlgCfIEuAbyBGAJVwFhCVkBtwZZAWEJZwFiCWkBuwZpAWIJYwlkCWUJZgllCWQJZwloCWkJWgFpCWgJHAhqCb4Gawm+BmoJbAknAW0JvwZtCScBbglvCXAJcQlwCW8Jcgm8BHMJAglzCbwEtgB0CbQAdQm0AHQJdgm6BHcJAAl3CboEeAl5CbgAuQC4AHkJegl7CfwI/Qj8CHsJfAl9Cb4AvAC+AH0JfgnDBn8JwgZ/CcMGgAmBCYIJgwmCCYEJhAkMBYUJCwWFCQwFhgkOBYcJDQWHCQ4FiAmJCUIGiglCBokJiwmMCfIHRAbyB4wJgQmNCYMJjgmDCY0JjwnGBpAJHwiQCcYGkQmSCccGyAbHBpIJwwZ+CZMJlAmTCX4JHgAgAOwHlQnsByAAlgnMBugH6QfoB8wGlwmYCZkJaAiaCZsJnAmdCRgFGQUYBZ0JGgWeCRwFnwkcBZ4JfQegCaEJogmjCX4HpAmlCSIFIwUiBaUJpgmnCagJJwWpCSgFqgmrCawJrQmuCa8JsAmxCS4FLQUuBbEJsgkwBbMJLwWzCTAFFAa0CRYGtQkWBrQJtgk2BbcJNQW3CTYFuAm5CTcFOAU3BbkJugmBB7sJvAm9Cb4Jvwk/BcAJQAXACT8FwQnCCUIFQQVCBcIJwwnECdcF2QXaBcUJxglIBccJyAnJCcoJTgVNBcsJzAnLCU0FzQnOCc8J0AnRCdIJ0wnUCeYG1QnmBtQJ1gnXCdgJ2Qn3BtoJBAYDBtsJ3AnbCQMG3QneCV8FYAVfBd4J3wngCeEJYwXiCWQFwQfjCeQJ5QnmCecJ6AnpCfsG/wb6BuoJ6wnsCe0J7gnvCQAHGQbwCfEJ8gkbBvMJ9Al3BfUJ/Qb2CfcJ+An5CXkFegV5BfkJ+gmqB/sJ/An7CaoH/Qn+Cf8JgAUACgoHAQoCCggHAwoECgUKBgoHCggKCQoFBgoKCwqLBQwKjQUMCosFDQoOCg8KEAoRCpMFEgoTChQKFQoUChMKmwWcBRYKFwoWCpwFEAcYCg8HGQoPBxgKDgH/BBoKGwoaCv8EHAodCh4KSwgeCh0KDgiDAh8KIAofCoMCIQoiCiMKJAojCiIKJQqBAiYKJwomCoECAQAAACgKKQooCgAAKgorCowGdQSMBisKLAotCi4KLwouCi0KMAoxCjIKMwoyCjEKNAo1CjYKNwo2CjUKOAo5CjoKOwo6CjkKPAo9Cj4KPwo+Cj0KQApBCkIKQwpCCkEKRApFCkYKRwpGCkUKSApJCkoKSwpKCkkKWghQA0wKTQpMClADTgpPCkADWQhAA08KUApRClIKUwpSClEKVApVClYKVwpWClUKTQisAlgKWQpYCqwC8AJaClMIWwpTCFoKXApdCl4KXwpeCl0KYAphCmIKYwpiCmEKZAplCmYKZwpmCmUKaAppCmoKawpqCmkKbAptCm4KbwpuCm0KcApxCnIKcwpyCnEKdAp1CnYKdwp2CnUK0AJ4ClEIeQpRCHgKUgjcAnoKewp6CtwCfAp9Cn4Kfwp+Cn0KgAqBCoIKgwqCCoEKhAqFCoYKhwqGCoUKiAqJCooKiwqKCokKjApYCI0KPAONClgIjgqPCpAKkQqQCo8KJQOSClcIkwpXCJIKlAqVCpYKlwqWCpUKmAqZCpoKmwqaCpkKnAqdCp4KnwqeCp0KoAqhCqIKowqiCqEKVggQA6QKpQqkChADpgqnCqgKqQqoCqcKqgqrCqwKrQqsCqsKrgqvCrAKsQqwCq8KsgqzCrQKtQq0CrMKtgq3CrgKuQq4CrcKCQO6ClUIuwpVCLoKvAq9CsICTwjCAr0Kvgq/CsAKwQrACr8KwgrDCsQKxQrECsMKxgrHCsgKyQrICscKvALKCk4IywpOCMoKzArNCs4KzwrOCs0K0ArRCtIK0wrSCtEKswXIBesC1ArrAsgFpgK/BUsD1QpLA78FLgPABRsD1gobA8AF1gLBBbcC1wq3AsEFWgPCBTcD2Ao3A8IFygLDBQ8D2QoPA8MF8gLEBdoK2wraCsQFvAXFBU8D3ApPA8UF2gLGBccC3QrHAsYFngLHBUMD3gpDA8cFXAjfCncH4ApzB+EKqQXiCngH4wphCOQK5QrmCucK6ArpCuoKhAPrCoID7AqCA+sK7QruCqcFbAinBe4K7wrwCocH8QqEB9MCcAjyCogH8wpzCPQK9Qr2CnQIiQf3CvgK+Qr6CvsK/AqbA/0K/gr/CgALAQsAC/8KkwTzBQILAwsCC/MFhwTqBQQLBQsEC+oFiATrBQYLBwsGC+sFiwTsBQgLCQsIC+wFjATtBQoLCwsKC+0FjQTuBQwLDQsMC+4FjgTvBQ4LDwsOC+8FjwTwBRALEQsQC/AFkQTxBRILEwsSC/EFkgTyBRQLFQsUC/IFIgMjA6EHFguhByMDfwgXC6MHGAujBxcLHQMZCx8DpQcfAxkLGgsbCxwLHQseCx8LIAshCyILqQf7AiMLKgMrA64HJAuuBysDAgMDA7AHJQuwBwMDOQMmCzsDsQc7AyYL4gLjArIHJwsoCykLKgsrCywLswfvAi0LGgMuC/cCLwv3Ai4LTgMwC78CMQu/AjALMgszCzQLNQu7B1MDNgs3CzgLOQu9B98CSgY6C4kEOwuJBDoLUQY8C5AEPQuQBDwLPgs/C0ALAAZBC0ILQwtEC0ULDAZGC0cLSAtJC0oLSwtKC0kLTAvHB00L2wdNC8cHyAecCE4LRAROC5wITwtQC1ELUgtRC1ALUwtUCywEnwgsBFQLVQtWC04EowhOBFYLJQRXC50IWAudCFcLPgRZC6AI0gegCFkLWgvUBzgEoQg4BNQHoQg2BNUHWwvVBzYEXAvXBzEEoAgxBNcHXQteC18L0QdfC14LHgRgC5wI2gecCGALFgRhC5sI3AebCGELYgueCGMLJwRjC54IZAtlC2YLZwtmC2ULaAuDBGkLsAhpC4MEagtrCxoAGwAaAGsLbAu2CG0LtAhtC7YIbgvjByUAJAAlAOMHbwvLAXALFwVwC8sB5gdDBHELRQRxC0MENwZyCzQEcws0BHILdAscBHULOAZ1CxwEOQR2CzcE6wc3BHYLOQZ3C0wEeAtMBHcL7QcrBHkLLQR5CysEpQh6CwQFBQUEBXoLBAAGAKYIpwimCAYAewt8C6gIqQioCHwLqgh9C6sIfgurCH0LfwuAC6wIrQisCIALDAAOAK4IrwiuCA4AsAixCBYAFwAWALEIsgiBC1UEpAhVBIELtAizCB4AHwAeALMIJABcBCIAtwgiAFwEuQgCC0cGoANHBgILuwgEC0gGpANIBgQLvAgGC0kGSgZJBgYLvggBBEsGqANLBgEEwAgIC0wGrANMBggLwggKC00GsANNBgoLxAgMC04GtANOBgwLxQgOC08GuANPBg4LxggQC1AGUQZQBhALxwgFBFIGvANSBgUEyAgSC1MGwANTBhILyQgUC1QGxANUBhQLVQbLCFYG7QhWBssIVwbNCFgGggtYBs0IbgZaBs8IWQbPCFoGWwZcBoML0AiDC1wGXQbSCF4GhAteBtIIXwbUCGAGhQtgBtQIYQbWCGIGhgtiBtYIYwbYCGQGbAZkBtgIZQbaCGYGawZmBtoIZwbbCGgGbQZoBtsIaQbdCJYAlwCWAN0IagbfCIoAiwCKAN8I4wg2AOEIwQjhCDYA5Qj0B+IIKwDiCPQH5wj2B+QINwDkCPYH6QgmAOYIugjmCCYA6wgyAOgIvwjoCDIA7gjzB+oIJwDqCPMH9QczAIcL7AiHCzMA7gjvCPMHuAjzB+8I8Qg6APAIwwjwCDoA4Aj3B/IIOwDyCPcHhgCIAPMIRwDzCIgA9wioAPYIqgD2CKgA+AiuAPkIrwD5CK4AsgCzAPoI+wj6CLMAtAD8CLUA/gi1APwIAAkBCbkAuwC5AAEJvAACCb0AAwm9AAIJdgZ1BgkJBAkJCXUGBgkKCXgGdwZ4BgoJeQYICXoGwgR6BggJCwnBBHsGegZ7BsEEDAmICw0JiQsNCYgLDwkOCYoLiwuKCw4JAQEQCQABjAsAARAJ3QDcABEJ/AARCdwAFwnVBBMJ1gQTCdUEFgkVCeUA5wDlABUJGQmNCxgJjgsYCY0LGgmPC4IGgQaCBo8LGwnoABwJ6gAcCegAkAvLAB8JyQAfCcsA5QDkACQJIQkkCeQAJAklCeUAFgnlACUJ9wDHBCYJfgYmCccEKQkqCQgIgAYICCoJCgEMASsJoQUrCQwBfQIGBX8CLQl/AgYFBgEIAS8JogUvCQgBLAmjBTEJpAUxCaMFMgkhATMJHwEzCSEBkQtLCTcJNgk3CUsJOQlPCTsJkgs7CU8JPAlSCdwESAHcBFIJRgmWBj4JlwY+CZYGkwuZBj8JmAY/CZkGQQlECZsGmgabBkQJQgmUC50GnAadBpQLngZDCZ8GlQufBkMJ6gShBkUJoAZFCaEGogZHCaEG5wShBkcJowakBkAJSQlACaQGMwlKCTUJUAk1CUoJ3gQ2CacGTQmnBjYJlguSC04JTwlOCZILSQFIAVEJUglRCUgBlwupBlMJqgZTCakGXAmsBlQJqwZUCawGrQauBpgLVQmYC64GVgldCbAGrwawBl0JVwn0BLIGsQayBvQE9QS0BloJswZaCbQGsQa1BvEEWwnxBLUG8wS0Bl4JtgZeCbQGYAmZC7gGPQa4BpkLPAa3BpoLYQmaC7cGYgk+BrsGvAa7Bj4G8AdmCT8GZAk/BmYJmwucC2cJaAlnCZwLvgZrCW0BXAFtAWsJbQmdC2wJngtsCZ0LbglwCegEhgHoBHAJigFyCYsBcwmLAXIJdAmOAXUJkAF1CY4BlAF2CZIBdwmSAXYJlwGWAXgJeQl4CZYBnAGdAXoJewl6CZ0BoAGhAXwJfQl8CaEBnwugC38Jfgl/CaALpQEIBYAJgQmACQgFhQmhC4QJRQaECaELhwlDBoYJ8QeGCUMGiQmiC4oJowuKCaILhAlFBowJRAaMCUUGjQm5AY4JtwGOCbkBjwmRCcYGxwbGBpEJkgmTCcgGxQHIBpMJkwmUCcUBxAHFAZQJxwHGAZUJ7AeVCcYBOgbLBpYJzAaWCcsG0AHRAaQLmwmkC9EB0gHUAZwJpQumC9YBngnbAZ8J2QGfCdsBowmiCSgIJwgoCKIJ4gHkAaQJpQmkCeQBqQnpAacL5wGnC+kBrAmoC6kL6wHqAaoL8QHvAbAJsQmwCe8B8wGyCfUBqwusC60LrguvC7AL+AG1CfYBtwn8AbYJ/QG2CfwBAAKxC7ILuQm4CQECswssCLQLBwK1CwgCCgK/CQsCwAkLAr8JwQkQAsIJEQLCCRACtgu3C7gLEwLFCRUCFgLGCRcCxwkXAsYJHgIdAswJywnMCR0CJAIjAs0JzgnNCSMCJgIoAtMJ1AnTCSgCuQstAroLuwu8C70L2wncCTwIOwg8CNwJNAI2At0J3gndCTYCvgu/C8ALwQvfCcIL5AnDCzwCxAvFC8YLQwJBAugJ6QnoCUECRQLrCT0I7Qk9COsJ8AnHC8gLTALyCUoC9QlQAvQJUQL0CVACQQjJC8oLywvMC1UC+wlaAvoJWwL6CVoCXAL9CV0C/wldAv0JAQpiAgIKYwICCmICzQtKCAoKzgvPC9ALagILCmsCDAprAgsK0QvSC9ML1AvVC9YLdQISCncCFAp3AhIKFQoTChcKFgoXChMK1wsZChoKGAoaChkK2AvXCxsKGgobCtcLhwKFAhwKHQocCoUCIAqKAh8KiwIfCooCjgKPAiEKIgohCo8CkQIlCpMCJgqTAiUKlQIoCpcCKQqXAigKmgKbAioKKwoqCpsCLQosClEKUwpRCiwKMQpoCjMKagozCmgKNQpzCjcKcQo3CnMKuwVsBzgKOQo4CmwHPQpACj8KQgo/CkAKQQrMCkMKzgpDCswKRgpcCkQKXgpEClwKhAqGCkgKSQpICoYKTApNCskKyArJCk0KsgU5B04KTwpOCjkHUgpgClAKYgpQCmAKVgpXCrUKtAq1ClcKWApZCkEHtgVBB1kKWgo6ClsKOwpbCjoKXQquBV8KNAdfCq4FYQq9BWMKbgdjCr0FZQqsBWcKLwdnCqwFaQqCCmsKgwprCoIKbgpvClMHuAVTB28KJQdwCqgFcgqoBXAKugVYB3QKdQp0ClgHeAqRCnkKjwp5CpEKegp7CpsKmgqbCnsKqwUsB3wKfQp8CiwHuAq5CoAKgQqACrkKhQq+CocKwAqHCr4Kdgp3CogKiQqICncKbAqMCm0KjQptCowKVAqOClUKkApVCo4KkgowCpMKMgqTCjAKfgp/CpQKlQqUCn8KrAqtCpgKmQqYCq0KsQU4B5wKnQqcCjgHoQqKCqMKiwqjCooKpAqlCjsHtAU7B6UKpwqWCqkKlwqpCpYKqwqqCsMKxQrDCqoKngqfCq4KrwquCp8K0grTCrIKswqyCtMKSgpLCrYKtwq2CksKugqgCrsKogq7CqAKLgovCrwKvQq8Ci8KvwqmCsEKqArBCqYKxAo0CsIKNgrCCjQKpgUaB8YKxwrGChoHygqtBcsKMQfLCq0FzQqwCs8KsQrPCrAK0QrQCkUKRwpFCtAK6gLrAlwD1ApcA+sCSgNLA14D1QpeA0sDGgMbAy4L1gouCxsDtgK3AmMD1wpjA7cCNgM3A2UD2AplAzcDDgMPA2cD2QpnAw8DaQPaCmoD2wpqA9oKTgNPAzAL3AowC08DxgLHAnAD3QpwA8cCQgNDA3ID3gpyA0MDcwfgCiUI0wYlCOAK2QshCHgHeQd4ByEI5grNBnoH2gtjCNsLZgjcC90LmQneC98L4AvhC4AHvglsCLwJhAfxChMCxQkTAvEK4gvGCYgHFgKIB8YJ+ArLCYkH4wt1COQL5QvmC0cF5QbnC+gL6QssBXgIIAV4CCwFoAMCC6EDAwuhAwILpAMEC6UDBQulAwQLSgYGCzoLBws6CwYLrAMIC60DCQutAwgLsAMKC7EDCwuxAwoLtAMMC7UDDQu1AwwLuAMOC7kDDwu5Aw4LUQYQCzwLEQs8CxALwAMSC8EDEwvBAxILxAMUC8UDFQvFAxQLoQcWC6IH8QaiBxYLGAs3CKMHpAejBzcIGQvnBqUHpgelB+cGpwfqC6gH6wvsCx0LIwv8CakHqgepB/wJrgckC68HCgqvByQLJQsLCrAHagKwBwsKJgsRCrEHcwKxBxEKsgftC4oF7gvvCycLLQtmBbMH+AazB2YF9gL3AvALLwvwC/cCvgK/AvADMQvwA78CNQvxC7sHvAe7B/ELOQs5Bb0Hvge9BzkFigSJBPILOwvyC4kEAwSQBAQEPQsEBJAE8ws+C5YIQQuUCPQL9QtDC5oIRguYCPYLMQbdB0gLSQtIC90HxgfHByMGTAsjBscHxgfIByIGTgsiBsgHTwswBlALyQdQCzAG2AdUCy4GUwsuBlQLVgtVC1ILUQtSC1ULVwtkC1gLZgtYC2QLXwvRB1kL0gdZC9EH1AdaC9MHLQbTB1oL1QdbC9YHMgbWB1sLKgbTB1wL1wdcC9MHzAdeCyYGXQsmBl4LYAskBtoHyQfaByQGTQvbB2EL3AdhC9sHYgtjC8QHIQbEB2ML1gdnCywGZQssBmcLaQv3C2gLMgRoC/cLMAQpBmoLawtqCykGbQv4C2wL+QtsC/gLSAQYBG4L4wduCxgEbwv6C8sBzQHLAfoL5wfmB8oGcQvKBuYHcgv6C3MLMwZzC/oLdQsgBHQLJQZ0CyAEJgTrB/sLdgv7C+sHdws7BngL7gd4CzsGywbtBxYFeQsWBe0HIwokCqUIegulCCQK+AQEAJkLpgiZCwQA/At7C5oLqAiaC3sLqgj9C30L/gt9C/0L+wS6BqwIfwusCLoGvAYMAP0Ergj9BAwAsQihCxcA8QcXAKELigmjC7IIgQuyCKMLswgRBR8AugEfABEFwQETBbcIIgC3CBMFuQhUAAILkwQCC1QAuwgoAAQLhwQECygAvAgsAAYLiAQGCywAvgj/CwEE/wMBBP8LwAg0AAgLiwQICzQAwgg4AAoLjAQKCzgAxAg8AAwLjQQMCzwAxQhAAA4LjgQOC0AAxghEABALjwQQC0QAxwhIAAUEAwQFBEgAyAhMABILkQQSC0wAyQhQABQLkgQUC1AAhACqBMsI7QjLCKoEWACUBM0IggvNCJQEXACWBM8IbgbPCJYE0AgADIMLAQyDCwAMZACaBNIIhAvSCJoEaACcBNQIhQvUCJwEbACeBNYIhgvWCJ4EcACgBNgIbAbYCKAEdACiBNoIawbaCKIEeACkBNsIbQbbCKQEfACmBN0IlwDdCKYEgACoBN8IiwDfCKgEnATjCIUL4QiFC+MIWAblCJcE4giXBOUIXgbnCJ0E5AidBOcIlATpCIIL5giCC+kImgTrCIQL6AiEC+sIVgbuCJUE6giVBO4IWwaHC5sE7AibBIcLogBSAO8IuAjvCFIAngTxCIYL8AiGC/EIYAbgCJ8E8gifBOAIZgaGAKUE8wilBIYAAgioAAIM9wgCDKgAAwwDCPgIrgD4CAMIBAiyAAQM+ggEDLIAtQD+CKoA9giqAP4I+QivAAEJuwABCa8AswC9APsIAwn7CL0AxAYeCAQJCQkECR4IHAnqAAYJCgkGCeoACAmqAcIErAHCBKoB6wDABAsJwQQLCcAE8gDzAAwJiAsMCfMADgnRAIsLpAGLC9EAEAkFDIwLBgyMCwUMEQmNC90ABwjdAI0LEwnNBBcJgQYXCc0EFQmPC+cAzwTnAI8LkAsHCBkJjQsZCQcI9ADPBBoJjwsaCc8EBQzZABsJ6AAbCdkABwiQC38GHwl/BpALJAkhCSIJBwwiCSEJFgklCdUEAgHVBCUJ+AD3AAgMJgkIDPcAKgkgCYAGygSABiAJCgErCQ0ICQwNCCsJgQJ/AicKLQknCn8CLwkKDAYBDAgGAQoMMQkLDCwJDAwsCQsMMgkNDCEBEgghAQ0MkQs3CQ4MDwwODDcJNAk1CTkJTwk5CTUJGAEZATwJUgk8CRkBpgZGCRAMPgkQDEYJEQyTCxIMPwkSDJMLgAGBAUEJRAlBCYEBbAmeC0IJlAtCCZ4LQwm9BpULGwiVC70GpQbpBEUJ6gRFCekERwluCecE6ATnBG4JagkcCEkJQAlJCRwISgkuAVAJNgFQCS4BpwZNCUMBEgxDAU0JTgk4AZYL5gSWCzgBUQkQDEkBMgFJARAMUwljCZcLZQmXC2MJgwFcCYUBVAmFAVwJnAuYC2gJVQloCZgLcAFxAVYJXQlWCXEBdgF3AVcJ9ARXCXcBewH2BFoJ9QRaCfYEhwHxBIkBWwmJAfEEXglfCfME8gTzBF8JYAlvAZkL+ASZC28B/AuaCxMMYQkTDJoLYgl1AT4G/AQ+BnUB/gQ/BnkBZAl5AT8GZwkrAZsL4gSbCysBaQlaAWsJXAFrCVoBnQttCe4ETwHuBG0JcAleAYYBhwGGAV4Bcwl9CYsBoQGLAX0JlAGOAXYJdAl2CY4BkgF3CZYBeQmWAXcJigGXAXIJeAlyCZcBnAF6CZABdQmQAXoJoAF8CR0IFAwdCHwJiQufCw0JfwkNCZ8LpAGlAYsLgAmLC6UBhgnxB4UJoQuFCfEHQgZDBogJhwmICUMGsQEQBYkJoguJCRAFjAm1AYQJDAWECbUBkAkfCI0JuQGNCR8IBwUKBY8JkQmPCQoFCQXDBpIJkwmSCcMGFQwgCJQJxAGUCSAIlQk2BscB5wfHATYGVgQ6BhgAlgkYADoGFgwXDBgMewfQAc8FeQfSAc0FnAnNBdIBdAclCJ4J2wGeCSUIGQwaDN4B0QEnCJsJ1AHiAZ0JpAmdCeIBqQmfCekB2QHpAZ8JrQkbDBwMKAjrAaMJsAmlCfEB5AHxAaUJKggdDB4MpwvnAbMJrgkfDCAM9gG0CeoBsQnvAbcJ/AG3Ce8B8wECArIJIQwiDCMMtQn4Ab0JCAK9CfgBCwLACf0Btgn9AcAJwQm5CRACAQIQArkJtQsHAiQMFQIkDAcCFwLHCQoCJQwxCCYMzAnCCR4CEQIeAsIJzQn9BSQCJwwoDCkMpAcmAvkF0wn5BSYCKgwrDNcJLAzaCS0M3AnOCTsIIwI7CM4JKAI0AtQJ3QnUCTQC4gm6CzsCKwI7AroLLgwvDDAMPAg9AtsJ6AneCUMCNgJDAt4JRwIxDMELwAs+CO8J5Ak8AvMJMgwzDDQM6QlBAvUJUAL1CUECRQJUAusJ+AnrCVQC8glMAvsJWgL7CUwCXQL/CVEC9AlRAv8JNQzLCzYMyQs3DDgM+glbAs0LSgjNC1sCawIMClwC/QlcAgwKEAoCCnICOQw6DAUKdwIUCksIHgpLCBQKAQAVCgMAFwoDABUKGgoYCg4BDwEOARgKnQXYC3wCGwp8AtgLHAooCocClQKHAigKJQqRAiAKigIgCpEChQKOAh0KIQodCo4CkwImCkwIOwxMCCYKlwIpCpsCKwqbAikKiwKaAh8KKgofCpoCLAp7A1MKfQNTCnsDmwdoCjwMMQo8DGgKcwo1CngDdwN4AzUKuwU4CrwFawO8BTgKPQxACj4MPQo+DEAKkQfMCj8MQQo/DMwKXApGCpkD/QqZA0YKlweECkAMSApADIQKTQqPCMgKQQzICo8IsgVOCrMFcwOzBU4KYApSCoQD6wqEA1IKVwqRA7QKkwO0CpEDWQpCDLYFtwW2BUIMOgpaCmkD2gppA1oKrgVdCq8FmAOvBV0KvQVhCr4F0gW+BWEKrAVlCmAD7gNgA2UKfQiCCpwHaQqcB4IKbwrNA7gFzwO4Bc0DqAVyCqkF4gqpBXIKuQW6BZ4HdAqeB7oFkQp4Co0DjAONA3gKewr8A5oK/gOaCvwDqgWrBZQHfAqUB6sFmQe4CkMMgApDDLgKewi+CpgHhQqYB74KnQd2CkQMiApEDHYKbQqNCn8IFwt/CI0KVQqQCnAI8gpwCJAKRQwwCkYMkgpGDDAKkwd+CkcMlApHDH4KmApIDKwKdwisCkgMsAWxBZAHnAqQB7EFfgiKCqAHoQqgB4oKpQpJDLQFtQW0BUkMegiWCpYHpwqWB5YKqgqcA8UKngPFCpwDjweeCkoMrgpKDJ4KsgpLDNIK9wrSCksMfAhKCpoHtgqaB0oKnwegCkwMugpMDKAKvArlCi4K5wouCuUKlQemCk0MvwpNDKYKNArECl4I4QpeCMQKxgrtCqYFpwWmBe0KrQXKCm0D8QNtA8oKeQiwCpIHzQqSB7AK0AqUA0cKlgNHCpQDXAPUCvgHygj4B9QKXgPVCvkHzAj5B9UKLgvWCvoHzgj6B9YKYwPXCvsH0Qj7B9cKZQPYCvwH0wj8B9gKZwPZCv0H1Qj9B9kKagPbCv4H1wj+B9sKMAvcCv8H2Qj/B9wKcAPdCgAI3AgACN0KcgPeCgEI3ggBCN4KTgxPDFAM6QXTBp8D2Qt2AyEIyQUhCHYDeQPOBeYKUQxSDFMM3AtUDFUM0AWaCX4DVgxXDFgMvAnuChYG8QqIA8UJ2QXFCYgD4guLA8YJSAXGCYsD3gVOBfgKWQxaDFsM5gtcDFAFUgVTBZcD+QMpBV0MLAXpCxgGoQMDC7AF5gKwBQMLpQMFC3kISgx5CAULOgsHCz0MPww9DAcLrQMJC3oIRwx6CAkLsQMLC3sITQx7CAsLtQMNC3wIQAx8CA0LuQMPC30IQwx9CA8LPAsRC0UMPAxFDBELwQMTC34IRAx+CBMLxQMVCwgDTAwIAxULFgsPBvEG8AbxBg8GGAvJAzcI+AU3CMkD+gX7BRkL5wYZC/sF6gv+Bc8JXgxfDGAMBwRhDCEL/AkjCxsGJAvZAwoKCQoKCtkDJQvbAwsKiwULCtsDYgxjDGQMEQomC5QF7QsLBpoFZQxmDGcMDQRoDCsLZgUtC2UF8AsvC14AXwBeAC8L8AMxC3YAdwB2ADELNQvRBfELfwfxC9EFOQviBTkFOgU5BeIF8gs7C2kMPgxpDDsLBAQ9CyQDRgwkAz0LagzjCcAHwQfAB+MJawwDB8MHbwXDBwMHawQxBvgLSAv4CzEGIwZMC2cE5AdnBEwLIgZOC2EEYgRhBE4LMAZPCy8G7wcvBk8LLgZTC24EbwRuBFMLeAvuB1ULUQtVC+4H+wtsDFcLZAtXC2wMWQs0Bl8L4gdfCzQGWgtpBC0GVwQtBmkEcwszBlsLMgZbCzMGXAv3CyoGZAQqBvcLJgZdCycG4QcnBl0LdAslBmALJAZgCyUGYQs1Bk0L5QdNCzUGYwvqByEGXgQhBuoHZQttDCwGKwYsBm0M9wtpC2QEZQRkBGkLaAsyBGoLMARqCzIE+AttC2sEbARrBG0LbgxKBG4LSARuC0oE+gtvCzMGUQQzBm8LygZxC3QEcwR0BHELzAHNAXIL+gtyC80BKgQiBHULIAR1CyIE+wt2C2wMbQxsDHYLyAEVBXcLOwZ3CxUFFgV5CxcFcAsXBXkLSwgjCg4HpQgOByMKPQaZC3kEpgh5BJkLPAaaC3cEqAh3BJoLqginCP0LBgD9C6cI/AT7BHsErAh7BPsE/QSuCP4EfQT+BK4IoQuxCEUGggRFBrEIsgiBBIoJQgaKCYEEEQWzCBIFtQgSBbMItwiEBMEBwAHBAYQEUgBUALgIuQi4CFQAJgAoALoIuwi6CCgAKgAsAKYAvAimACwAvQhvDL4I/wu+CG8MMgA0AL8IwAi/CDQANgA4AMEIwgjBCDgAOgA8AMMIxAjDCDwAPgBAAJUAxQiVAEAAQgBEAIkAxgiJAEQARgBIAKEAxwihAEgASgBMAK8EyAivBEwATgBQAK0EyQitBFAAygiCAMsIhADLCIIAzAhWAM0IWADNCFYAzghaAM8IXADPCFoAuAeLCNAIAAzQCIsI0QhiANIIZADSCGIA0whmANQIaADUCGYA1QhqANYIbADWCGoA1whuANgIcADYCG4A2QhyANoIdADaCHIAugd2ANsIeADbCHYA3Ah6AN0IfADdCHoA3gh+AN8IgADfCH4AYAaFC+AI4QjgCIULlgSXBLME4gizBJcEnASdBOMI5AjjCJ0EWAaCC+UI5gjlCIILXgaEC+cI6AjnCIQLlASVBOkI6gjpCJUEmgSbBOsI7AjrCJsEqgSiAO0I7wjtCKIAYgaGC7AE8AiwBIYLngSfBPEI8gjxCJ8EpASlBLIE8wiyBKUE9wj1CAIMcAwCDPUIbwYDDLQE+Ai0BAMMcQYEDLYE+gi2BAQM/gj/CPYI9Aj2CP8ItQT5CLsEAQm7BPkI+wgDCbcEvQS3BAMJBAkFCcQGxQbEBgUJBwkeCQYJHAkGCR4JCAkJCaoBHgiqAQkJCwkKCesA6gDrAAoJwwR9BgwJ8gAMCX0G7ADTAA4J0QAOCdMAEAnbAAUM2QAFDNsAjQsRCY4LEgmOCxEJEwkUCc0EzgTNBBQJjwsVCYEGFwmBBhUJGQnBAJALywCQC8EAGgl8BvQA9QD0AHwGBQwbCQYMHQkGDBsJxgR/BssEHwnLBH8GcQwHDCAJIQkgCQcMAwECASMJJQkjCQIBhQYIDNQEJgnUBAgMcQwgCSgJKgkoCSAJLAkMDCsJCQwrCQwMJwotCXIMLglyDC0JcwwKDDAJLwkwCQoMDwgLDI0GMQmNBgsMDQwyCXQMNAl0DDIJNwndBA8MkgYPDN0EdAw0CTgJOQk4CTQJPQkQCDwJGAE8CRAIMwEyAT4JEAw+CTIBQwESDEUBPwlFARIMQQlACYABHAiAAUAJQgkpAWwJJwFsCSkBQwlECb0GgQG9BkQJpgalBkYJRQlGCaUGRwlICW4JbwluCUgJLAEtAUkJaglJCS0BSglMAS4BLwEuAUwBTAkRDE0JEgxNCREMUAk2AU4JOAFOCTYB6wSmBlEJEAxRCaYGUwlVAWMJUwFjCVUBUQGFAVABVAlQAYUBVQlbAWgJWgFoCVsBcAFWCVkBWAFZAVYJdgFXCRoIWAkaCFcJewFaCX0BWQl9AVoJWwlcCYkBgwGJAVwJXgldCV8JcQFfCV0JXwlxAWAJbwFgCXEBVwHwBGEJEwxhCfAEZwF3AWIJdQFiCXcBYwlTAWQJeQFkCVMBaQktAWcJKwFnCS0BLQFpCWoJawlqCWkJbQm/Bk8BUQFPAb8GcAlxCV4BXwFeAXEJAgm8AHMJfQlzCbwAdgl0CboEtgC6BHQJdwkACXkJuQB5CQAJcgl4CbwEuAC8BHgJegn8CHUJtAB1CfwIfAm+ABQMvgQUDL4AxAQNCcIGfwnCBg0JiwuACYoLggmKC4AJhQkLBYYJDgWGCQsFDQWwAYcJiAmHCbABiQmICbEBsAGxAYgJjAmLCbUBtAG1AYsJCAWQCYEJjQmBCZAJBwWPCQgFkAkIBY8JCgUJBZEJkgmRCQkFoAsVDH4JlAl+CRUMXQQ2BiAAlQkgADYGFgAYAOgHlgnoBxgAdQxVDHYM0AXPBZoJzQWcCc4Fdwx4DHkMyQV0BxoFngkaBXQHfgdoCKIJegx7DN0LnQmkCRkFIgUZBaQJqQknBZ8JHAWfCScF8Qt/B6oLowmqC38HLgUjBbAJpQmwCSMFswkvBacLKAWnCy8FfAyuCX0Mrgt+DKwJtwk1BbEJLQWxCTUFsgm4CTAFNwUwBbgJVwx/DIAMvQm8CbUJwAlABbYJNgW2CUAFQgU4BcEJgQyCDIMMhAyCB4UMvgm1C9oFxwlJBb8JPwW/CUkFTQVBBcwJwgnMCUEFhgyHDIgM/wX9Bc8J+QXTCfsF5gb7BdMJiQyKDIsMuQtZBfcFAwaoB9wJzgncCagH1AndCdUJ8wZYBYwM4gljBboL2Am8C40MjgyPDC4M2wnDCwQGaAWQDJEM3gnoCWAF7QlrBZIMZAWSDGsFwQfkCR0GkwyUDJUM9Ql4BekJaQWWDHUF6wn4CewJlwxsBcwLGwbyCfwJ+wn8CfIJ/wkHB/QJdwX0CQcHCAd6BQEKOAyYDJkMzQsFBvoJmgybDJwMDAqNBf0J/gn9CY0FnQwDCtULngzTC4cFAQAeChUKFAoVCh4KnAUCBRcKAwAXCgIFDggPARAHGAoQBw8BfAIbCn0C/wR9AhsKAQAoCh4KHAoeCigKIAqDAiUKgQIlCoMCHQohCksIIwpLCCEKJgonCjsMcgw7DCcKKQoAACsKdQQrCgAADggfCowGKgqMBh8KLgrnCiwKewMsCucKRQw8DDAKMQowCjwMNQo0CncDXgh3AzQKOgppAzgKawM4CmkDaQw+DDwKPQo8Cj4MPQw/DEAKQQpACj8MRgpHCv0KlgP9CkcKfAhADEoKSApKCkAMUANSA00KjwhNClIDQANCA04KcwNOCkIDUgpTCusKfQPrClMKVQpwCFcKkQNXCnAIrAKuAlkKQgxZCq4C8ALyAloK2gpaCvICXQpcCpgDmQOYA1wKYQpgCtIFhAPSBWAKZArsA2UK7gNlCuwDmwecB2gKaQpoCpwHbQp/CG8KzQNvCn8IcgpzCuIKeAPiCnMKnQeeB3YKdAp2Cp4HeArQAowD0gKMA9AC3ALeAnsK/AN7Ct4CkweUB34KfAp+CpQHfQhDDIIKgAqCCkMMlweYB4QKhQqECpgHfghEDIoKiAqKCkQMjQo8AxcLPgMXCzwDkAqRCvIKjQPyCpEKJANGDCUDkgolA0YMeghHDJYKlAqWCkcMmgr+A5gKSAyYCv4DjweQB54KnAqeCpAHnwegB6AKoQqgCqAHEAMSA6UKSQylChIDlQeWB6YKpwqmCpYHrAp3CKoKnAOqCncIeQhKDLAKrgqwCkoMtAqTA7IKSwyyCpMDmQeaB7gKtgq4CpoHCANMDAkDugoJA0wMwgLDArwK5Qq8CsMCewhNDL4Kvwq+Ck0MxArFCuEKngPhCsUKyApBDMYK7QrGCkEMvAK+AsoK8QPKCr4CkQeSB8wKzQrMCpIH0gr3CtAKlAPQCvcKyAWCANQKygjUCoIAvwVWANUKzAjVClYAwAVaANYKzgjWCloAwQViANcK0QjXCmIAwgVmANgK0wjYCmYAwwVqANkK1QjZCmoAxAVuANsK1wjbCm4AxQVyANwK2QjcCnIAxgV6AN0K3AjdCnoAxwV+AN4K3gjeCn4A4QqeA+AKnwPgCp4D4gp4A9kLnwygDKEM5grlCnkDwwJ5A+UKogyjDN8LfgPsCn0D7grtChUG+ANWDKQM0wKrAvEKiAPxCqsC8gqNA+ILiwPiC40D+ApLDN4FkwPeBUsM+gqlDKYMpwymDKUM6QtIDBcGqAypDKoM8wXkAgML5gIDC+QC6gWPBwULSgwFC48H6wWRBwcLPwwHC5EH7AWTBwkLRwwJC5MH7QWVBwsLTQwLC5UH7gWXBw0LQAwNC5cH7wWZBw8LQwwPC5kH8AWbBxELPAwRC5sH8QWdBxMLRAwTC50H8gWfBxULTAwVC58HqwysDK0MrgyvDLAMFws+AxgLsQyyDLMMGQsdA/oFzwP6BR0DVwMzA+oL/gXqCzMDIwv5AhwGtwUcBvkCtAy1DLYMtwy4DLkMAwNGAyULugy7DLwMJgs5AwkGuwIJBjkDvQy+DL8MCwbtC/8CLQvtAiAGtQUgBu0CLgv6By8LXwAvC/oHMAv/BzELdwAxC/8HwAzTBcEMwgzDDMQM3wKvBTkLigfFDMYMOgs9DDsLPgw7Cz0MPAtFDD0LRgw9C0UMQAvHDI4MBAbjCdcDRQvIDHsFfgUDB+cD+AtIC/kLSgv5C0gL5AdMC+UHTQvlB0wLYgROC0MERARDBE4L7gfvB1ELTwtRC+8HbwRTCysELAQrBFMLTAR4C04EVQtOBHgLJQQmBFcL+wtXCyYEWQs+BDQGPAQ0Bj4EaQRaCzcEOAQ3BFoLNARzCzYEWws2BHML9wtcCzIEMQQyBFwL4QddC+IHXwviB10LHAR0Cx4EYAseBHQLYQsWBDUGFAQ1BhYEYwsnBOoHKQTqBycEZQtkC20MbAxtDGQLaQuwCGUEFgBlBLAIagsaAGgLgwRoCxoAbQu0CGwEHgBsBLQIbgslAG4MhgRuDCUAcAtPBG8LUQRvC08EcQtFBHMELwZzBEUE6QfMATcGcgs3BswBKQQqBDgGdQs4BioEdgs5BG0MKwZtDDkExgHIATkGdws5BsgBeQstBHALTwRwCy0E" } ] } ================================================ FILE: examples/resources/models/gltf/DamagedHelmet/README.md ================================================ # Damaged Helmet https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/DamagedHelmet ## License Information Battle Damaged Sci-fi Helmet - PBR by [theblueturtle_](https://sketchfab.com/theblueturtle_), published under a Creative Commons Attribution-NonCommercial license https://sketchfab.com/models/b81008d513954189a063ff901f7abfe4 ## Modifications The original model was built on an early draft of glTF 2.0 that did not become final. This new model has been imported and re-exported from Blender to bring it into alignment with the final release glTF 2.0 specification. ================================================ FILE: examples/resources/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf ================================================ { "accessors" : [ { "bufferView" : 0, "componentType" : 5123, "count" : 46356, "max" : [ 14555 ], "min" : [ 0 ], "type" : "SCALAR" }, { "bufferView" : 1, "componentType" : 5126, "count" : 14556, "max" : [ 0.9424954056739807, 0.8128451108932495, 0.900973916053772 ], "min" : [ -0.9474585652351379, -1.18715500831604, -0.9009949564933777 ], "type" : "VEC3" }, { "bufferView" : 2, "componentType" : 5126, "count" : 14556, "max" : [ 1.0, 1.0, 1.0 ], "min" : [ -1.0, -1.0, -1.0 ], "type" : "VEC3" }, { "bufferView" : 3, "componentType" : 5126, "count" : 14556, "max" : [ 0.9999759793281555, 1.998665988445282 ], "min" : [ 0.002448640065267682, 1.0005531199858524 ], "type" : "VEC2" } ], "asset" : { "generator" : "Khronos Blender glTF 2.0 exporter", "version" : "2.0" }, "bufferViews" : [ { "buffer" : 0, "byteLength" : 92712, "byteOffset" : 0, "target" : 34963 }, { "buffer" : 0, "byteLength" : 174672, "byteOffset" : 92712, "target" : 34962 }, { "buffer" : 0, "byteLength" : 174672, "byteOffset" : 267384, "target" : 34962 }, { "buffer" : 0, "byteLength" : 116448, "byteOffset" : 442056, "target" : 34962 } ], "buffers" : [ { "byteLength" : 558504, "uri" : "DamagedHelmet.bin" } ], "images" : [ { "uri" : "Default_albedo.jpg" }, { "uri" : "Default_metalRoughness.jpg" }, { "uri" : "Default_emissive.jpg" }, { "uri" : "Default_AO.jpg" }, { "uri" : "Default_normal.jpg" } ], "materials" : [ { "emissiveFactor" : [ 1.0, 1.0, 1.0 ], "emissiveTexture" : { "index" : 2 }, "name" : "Material_MR", "normalTexture" : { "index" : 4 }, "occlusionTexture" : { "index" : 3 }, "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 0 }, "metallicRoughnessTexture" : { "index" : 1 } } } ], "meshes" : [ { "name" : "mesh_helmet_LP_13930damagedHelmet", "primitives" : [ { "attributes" : { "NORMAL" : 2, "POSITION" : 1, "TEXCOORD_0" : 3 }, "indices" : 0, "material" : 0 } ] } ], "nodes" : [ { "mesh" : 0, "name" : "node_damagedHelmet_-6514", "rotation" : [ 0.7071068286895752, 0.0, -0.0, 0.7071068286895752 ] } ], "samplers" : [ {} ], "scene" : 0, "scenes" : [ { "name" : "Scene", "nodes" : [ 0 ] } ], "textures" : [ { "sampler" : 0, "source" : 0 }, { "sampler" : 0, "source" : 1 }, { "sampler" : 0, "source" : 2 }, { "sampler" : 0, "source" : 3 }, { "sampler" : 0, "source" : 4 } ] } ================================================ FILE: examples/resources/models/gltf/DragonAttenuation/DragonAttenuation.gltf ================================================ { "asset":{ "generator":"Khronos glTF Blender I/O v3.6.28", "version":"2.0" }, "extensionsUsed":[ "KHR_materials_transmission", "KHR_materials_volume", "KHR_materials_variants" ], "extensionsRequired":[ "KHR_materials_variants" ], "extensions":{ "KHR_materials_variants":{ "variants":[ { "name":"Attenuation" }, { "name":"Surface Color" } ] } }, "scene":0, "scenes":[ { "name":"Scene", "nodes":[ 0, 1 ] } ], "nodes":[ { "mesh":0, "name":"Cloth Backdrop", "scale":[ 3.5, 3.5, 3.5 ], "translation":[ -0.15470129251480103, -0.841584324836731, -0.1703687310218811 ] }, { "mesh":1, "name":"Dragon", "rotation":[ 0.70710688829422, 0, 0, 0.7071066498756409 ], "scale":[ 0.25, 0.2500000298023224, 0.2500000298023224 ], "translation":[ 0, -0.7306479811668396, 0 ] } ], "materials":[ { "name":"Cloth Backdrop", "pbrMetallicRoughness":{ "baseColorTexture":{ "index":0 }, "metallicFactor":0, "roughnessFactor":0.4934999942779541 } }, { "doubleSided":false, "extensions":{ "KHR_materials_transmission":{ "transmissionFactor":1 }, "KHR_materials_volume":{ "attenuationColor":[ 0.9210000038146973, 0.6399999856948853, 0.06400000303983688 ], "attenuationDistance":0.1549999988913536, "thicknessFactor":2.2699999809265137, "thicknessTexture":{ "index":1 } } }, "name":"Dragon with Attenuation", "pbrMetallicRoughness":{ "metallicFactor":0, "roughnessFactor":0 } }, { "doubleSided":false, "extensions":{ "KHR_materials_transmission":{ "transmissionFactor":1 }, "KHR_materials_volume":{ "attenuationColor":[ 1, 1, 1 ], "thicknessFactor":2.2699999809265137, "thicknessTexture":{ "index":2 } } }, "name":"Dragon with Surface Coloring Only", "pbrMetallicRoughness":{ "baseColorFactor":[ 0.9210000038146973, 0.6399999856948853, 0.06400000303983688, 1 ], "metallicFactor":0, "roughnessFactor":0 } } ], "meshes":[ { "name":"Cloth Backdrop", "primitives":[ { "attributes":{ "POSITION":0, "NORMAL":1, "TEXCOORD_0":2 }, "indices":3, "material":0 } ] }, { "name":"Dragon", "primitives":[ { "attributes":{ "POSITION":4, "NORMAL":5, "TEXCOORD_0":6 }, "extensions":{ "KHR_materials_variants":{ "mappings":[ { "material":1, "variants":[ 0 ] }, { "material":2, "variants":[ 1 ] } ] } }, "indices":7, "material":1 } ] } ], "textures":[ { "sampler":0, "source":0 }, { "sampler":0, "source":1 }, { "sampler":0, "source":1 } ], "images":[ { "mimeType":"image/jpeg", "name":"Image_0", "uri":"Image_0.jpg" }, { "mimeType":"image/jpeg", "name":"Image_1", "uri":"Image_1.jpg" } ], "accessors":[ { "bufferView":0, "componentType":5126, "count":62640, "max":[ 0.9809443354606628, 1.0221298933029175, 1.4283748865127563 ], "min":[ -0.8216659426689148, 0.0015843699220567942, -0.46063709259033203 ], "type":"VEC3" }, { "bufferView":1, "componentType":5126, "count":62640, "type":"VEC3" }, { "bufferView":2, "componentType":5126, "count":62640, "type":"VEC2" }, { "bufferView":3, "componentType":5123, "count":131337, "type":"SCALAR" }, { "bufferView":4, "componentType":5126, "count":76809, "max":[ 7.0467000007629395, 3.1512999534606934, 0 ], "min":[ -7.0467000007629395, -3.1512999534606934, -9.939900398254395 ], "type":"VEC3" }, { "bufferView":5, "componentType":5126, "count":76809, "type":"VEC3" }, { "bufferView":6, "componentType":5126, "count":76809, "type":"VEC2" }, { "bufferView":7, "componentType":5125, "count":273648, "type":"SCALAR" } ], "bufferViews":[ { "buffer":0, "byteLength":751680, "byteOffset":0, "target":34962 }, { "buffer":0, "byteLength":751680, "byteOffset":751680, "target":34962 }, { "buffer":0, "byteLength":501120, "byteOffset":1503360, "target":34962 }, { "buffer":0, "byteLength":262674, "byteOffset":2004480, "target":34963 }, { "buffer":0, "byteLength":921708, "byteOffset":2267156, "target":34962 }, { "buffer":0, "byteLength":921708, "byteOffset":3188864, "target":34962 }, { "buffer":0, "byteLength":614472, "byteOffset":4110572, "target":34962 }, { "buffer":0, "byteLength":1094592, "byteOffset":4725044, "target":34963 } ], "samplers":[ { "magFilter":9729, "minFilter":9987 } ], "buffers":[ { "byteLength":5819636, "uri":"DragonAttenuation.bin" } ] } ================================================ FILE: examples/resources/models/gltf/Duck/README.md ================================================ # Duck ## Screenshot ![screenshot](screenshot/screenshot.png) ## License Information Copyright 2006 Sony Computer Entertainment Inc. Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at: http://research.scea.com/scea_shared_source_license.html Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: examples/resources/models/gltf/Duck/glTF/Duck.gltf ================================================ { "asset": { "generator": "COLLADA2GLTF", "version": "2.0" }, "scene": 0, "scenes": [ { "nodes": [ 0 ] } ], "nodes": [ { "children": [ 2, 1 ], "matrix": [ 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "matrix": [ -0.7289686799049377, 0.0, -0.6845470666885376, 0.0, -0.4252049028873444, 0.7836934328079224, 0.4527972936630249, 0.0, 0.5364750623703003, 0.6211478114128113, -0.571287989616394, 0.0, 400.1130065917969, 463.2640075683594, -431.0780334472656, 1.0 ], "camera": 0 }, { "mesh": 0 } ], "cameras": [ { "perspective": { "aspectRatio": 1.5, "yfov": 0.6605925559997559, "zfar": 10000.0, "znear": 1.0 }, "type": "perspective" } ], "meshes": [ { "primitives": [ { "attributes": { "NORMAL": 1, "POSITION": 2, "TEXCOORD_0": 3 }, "indices": 0, "mode": 4, "material": 0 } ], "name": "LOD3spShape" } ], "accessors": [ { "bufferView": 0, "byteOffset": 0, "componentType": 5123, "count": 12636, "max": [ 2398 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 0, "componentType": 5126, "count": 2399, "max": [ 0.9995989799499512, 0.999580979347229, 0.9984359741210938 ], "min": [ -0.9990839958190918, -1.0, -0.9998319745063782 ], "type": "VEC3" }, { "bufferView": 1, "byteOffset": 28788, "componentType": 5126, "count": 2399, "max": [ 96.17990112304688, 163.97000122070313, 53.92519760131836 ], "min": [ -69.29850006103516, 9.929369926452637, -61.32819747924805 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 0, "componentType": 5126, "count": 2399, "max": [ 0.9833459854125976, 0.9800369739532472 ], "min": [ 0.026409000158309938, 0.01996302604675293 ], "type": "VEC2" } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0 }, "emissiveFactor": [ 0.0, 0.0, 0.0 ], "name": "blinn3-fx" } ], "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "uri": "DuckCM.png" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9986, "wrapS": 10497, "wrapT": 10497 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 76768, "byteLength": 25272, "target": 34963 }, { "buffer": 0, "byteOffset": 0, "byteLength": 57576, "byteStride": 12, "target": 34962 }, { "buffer": 0, "byteOffset": 57576, "byteLength": 19192, "byteStride": 8, "target": 34962 } ], "buffers": [ { "byteLength": 102040, "uri": "Duck0.bin" } ] } ================================================ FILE: examples/resources/models/gltf/Duck/glTF-Draco/Duck.gltf ================================================ { "asset": { "generator": "COLLADA2GLTF", "version": "2.0" }, "scene": 0, "scenes": [ { "nodes": [ 0 ] } ], "nodes": [ { "children": [ 2, 1 ], "matrix": [ 0.009999999776482582, 0, 0, 0, 0, 0.009999999776482582, 0, 0, 0, 0, 0.009999999776482582, 0, 0, 0, 0, 1 ] }, { "matrix": [ -0.7289686799049377, 0, -0.6845470666885376, 0, -0.4252049028873444, 0.7836934328079224, 0.4527972936630249, 0, 0.5364750623703003, 0.6211478114128113, -0.571287989616394, 0, 400.1130065917969, 463.2640075683594, -431.0780334472656, 1 ], "camera": 0 }, { "mesh": 0 } ], "cameras": [ { "perspective": { "aspectRatio": 1.5, "yfov": 0.6605925559997559, "zfar": 10000, "znear": 1 }, "type": "perspective" } ], "meshes": [ { "primitives": [ { "attributes": { "NORMAL": 1, "POSITION": 2, "TEXCOORD_0": 3 }, "indices": 0, "mode": 4, "material": 0, "extensions": { "KHR_draco_mesh_compression": { "bufferView": 0, "attributes": { "NORMAL": 0, "POSITION": 1, "TEXCOORD_0": 2 } } } } ], "name": "LOD3spShape" } ], "accessors": [ { "componentType": 5123, "count": 12636, "max": [ 2398 ], "min": [ 0 ], "type": "SCALAR" }, { "componentType": 5126, "count": 2399, "max": [ 0.9995989799499512, 0.999580979347229, 0.9984359741210938 ], "min": [ -0.9990839958190918, -1, -0.9998319745063782 ], "type": "VEC3" }, { "componentType": 5126, "count": 2399, "max": [ 96.17990112304688, 163.97000122070312, 53.92519760131836 ], "min": [ -69.29850006103516, 9.929369926452637, -61.32819747924805 ], "type": "VEC3" }, { "componentType": 5126, "count": 2399, "max": [ 0.9833459854125975, 0.9800369739532472 ], "min": [ 0.026409000158309937, 0.01996302604675293 ], "type": "VEC2" } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0 }, "emissiveFactor": [ 0, 0, 0 ], "name": "blinn3-fx" } ], "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "uri": "DuckCM.png" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9986, "wrapS": 10497, "wrapT": 10497 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 0, "byteLength": 18884 } ], "buffers": [ { "byteLength": 18884, "uri": "0.bin" } ], "extensionsRequired": [ "KHR_draco_mesh_compression" ], "extensionsUsed": [ "KHR_draco_mesh_compression" ] } ================================================ FILE: examples/resources/models/gltf/Duck/glTF-Embedded/Duck.gltf ================================================ { "asset": { "generator": "COLLADA2GLTF", "version": "2.0" }, "scene": 0, "scenes": [ { "nodes": [ 0 ] } ], "nodes": [ { "children": [ 2, 1 ], "matrix": [ 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "matrix": [ -0.7289686799049377, 0.0, -0.6845470666885376, 0.0, -0.4252049028873444, 0.7836934328079224, 0.4527972936630249, 0.0, 0.5364750623703003, 0.6211478114128113, -0.571287989616394, 0.0, 400.1130065917969, 463.2640075683594, -431.0780334472656, 1.0 ], "camera": 0 }, { "mesh": 0 } ], "cameras": [ { "perspective": { "aspectRatio": 1.5, "yfov": 0.6605925559997559, "zfar": 10000.0, "znear": 1.0 }, "type": "perspective" } ], "meshes": [ { "primitives": [ { "attributes": { "NORMAL": 1, "POSITION": 2, "TEXCOORD_0": 3 }, "indices": 0, "mode": 4, "material": 0 } ], "name": "LOD3spShape" } ], "accessors": [ { "bufferView": 0, "byteOffset": 0, "componentType": 5123, "count": 12636, "max": [ 2398 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 0, "componentType": 5126, "count": 2399, "max": [ 0.9995989799499512, 0.999580979347229, 0.9984359741210938 ], "min": [ -0.9990839958190918, -1.0, -0.9998319745063782 ], "type": "VEC3" }, { "bufferView": 1, "byteOffset": 28788, "componentType": 5126, "count": 2399, "max": [ 96.17990112304688, 163.97000122070313, 53.92519760131836 ], "min": [ -69.29850006103516, 9.929369926452637, -61.32819747924805 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 0, "componentType": 5126, "count": 2399, "max": [ 0.9833459854125976, 0.9800369739532472 ], "min": [ 0.026409000158309938, 0.01996302604675293 ], "type": "VEC2" } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0 }, "emissiveFactor": [ 0.0, 0.0, 0.0 ], "name": "blinn3-fx" } ], "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAAolBMVEX/2AD/fgD/yQD/vgD/1gD/uAD/0wAAAAD/////1wD/0AD/1QD/zwD/wgD/uwD/zQD/yAD/vQD/wwD/xAD/xgD/0gD/wAD/ywD/gwD/rgD/jAD/nAAZGRn//e84ODj/3Rvf399tbW3/7YXv7+//8qb/4DXQ0NCioqL/+db/9sJWVlb/5E6Hh4f//vj/6Gf/++K6urr5wAD1xwD0zwDwywDhvwC5yx0UAAA+x0lEQVR4XmIwNRnBYBSYAtilYxSGYRgKwxmVQxiDkMBCyB6a+5+tyVwCbZNA7LwPNAi06Z9e04PBa1qmB4PlLgEAAgAEAFm9sohZaS2tWitmIlxd89gBgDpLSUE7IhVh1wEDgDk7Swn6QmwV5JECAK3S6CdNqo4RAChb0B/CWAcIAN+nA4y13wAgVws6KKzmLgMA5UanaKzdBQAuQacJ8a4CADc6mfmDA8D7N+ZdBABqdBHT2wcAKkGXCdFOAphXn9v4Mie6VOJ85wDmbfZtB0PzN/tl16IgEAVQEIk7JSTbSk8xICNMhPr//922qXunZppW79hc0vOSZPRyzp0PDbOjL+wCsMX7+djxV/AWlGQUgDDNL7oB0bTwJtqGEEBU9RiAWMefgpJxA7gKJLPu/hT0JVoAwmYtoKzhzdRllABEWNbln4CShAAC2l8LqDREQVf0AOj61wSaE0Ti1BACmFF86uBzCyghIiUhgNCn/fQlH1mAgqgoOWMAdPM2HxaAPAMwLYAewAj1pARW/yTOcqYAnho31S87AamBAVrOEgBl4HePvEhgvf6R0FX4ACbI31lsejCCIAVwCadqgQltFTgAYfFo2mse3SOPDUwMgNHuIVtgg65mDMA/6C/tI/3b6QWI5yxz/0e0DBmAZ/Sn6EfwR57TYP8gxrFk/1iAPwC6frdjx9dFUXgSQFIHwwsxkqj3P5a3QQyA7N9y76O4Y7vtHzw9uNoy8+CXgAJ2qDABBNC/fYIrA89/Ygf/Xg+W6B9RgQO4t+8bdPR7e8xueDLYjABvEHwKECVwpC49AVD8u/VvkSzb/5J1n8hQQjYwPQNHAmkaK4FLDSypL9QABOLWj0M/cHV+7EiSY8/eQfaHuSOMS8BUnl6JVEB1AqacKmIAfv+ddmOiO/mJSZ7nCZZgF2EtBCMyMC4HvtPhci6ANlq6A6D4N9b8Xvp+mPfed55/P5JjBIndgnVAcDdwa+P+FV4M4hWggDHKHQDBP+rv3HfyTdkHg6/DARtA7AXBOBu4GihsNsWQwF0Fbz8ONsCahhoA+v9h7lybE+XhKD4jLY5FxBvyhrVaWm2tbf3+n24lUQ9JyA0g4cwzO91n99WeH/9rCJz992g/p5Zff4njeLlcxhui689xKYLADQOSDip61AlCeUAZUIr+BZIIBAIcbpg/foYNwM+HDgB7/9PS/UegX62WRPGGKuC12SxXkBgQxNJAzAmc91QgoM0RA/8FQHG4HM/703a7zW+6/njan4+XQ9FVGWAPwARC/L/ZT2L+ijofl+JtX1DNFjcFJCJQgQRAkEHJDQMgwDPA/09sFt0TMGlZAOwu59M2H0uVb0/ny659GWAPAOs+/L/+oye3qF+a/3joF7Or20HwMH3GaREQCOLlTXw8mIMCSYcAifVi3SLBCQDfbcw/7hnvFRTsj20g+G4AQH35R1P/fL0i9j+efN5u+C9AQDBgEEA4AAR8owi7xSFSCgKEAwYMBIM6AlBc9tuxlbb7S9N88PfaEoC7+6Tqn1PHYH8At/Ui+QDpgIkEc6Yw4CZGmDGyf0AJAALyRDCADhDu48l3wcC7NQBC+g9DMuK7Bv+7/yTyI9hbidQEVA8IkAvus6NELvJnqBVAgOKk2VASwAHPfhMGDo2TgD0A8J+3/573oSYMUAjKXIJIgF6xkgwyInGC8GAgZcaDUgD8dwDFEe431PZYNO0EAIBdAghTYv8IT3+9+8/P1/+ebSCAytIACFTmxzCfbRwhQkBaZcARANY7wB1Cfxvl9mHgjQPA3H8S/RP4v1zSh3/Bm8+oSUh4UFCGA5oNYDn7M/0daEjYTVL9yRHvI6AD7HeOwM9HIwAe/mfZ/Fb7xzTzw3iZZlYULBYIBVfFTFVwE7FeEEEAlQAI6B2ALzv7T+NOdbJD4IsFwM7/LCOdP5n2cQ//s0o2/iMd0OKgukSQa3QVAGAI6B2AX7vgP+5a+X5ntROwAAD+h2FK/F8T/2E/vO8KgAC6jQ05ADgOuNUSaRNdAjCxqQCLcz7uQfm5sKsDAYCp/yn8Lxs/2P9sJHv/AcCdAEiGACkEeQAiHgCPFSAq/66VHy3qQGsAysef+E/sN/cfMrVfBKAU6QokENxaAgCAEOAGgNe/psnfVynw92oHwBM98UP9p40/7DeVtf0b1IEEAAEBdIkaACIOAE8B4AfRvx/l5x+LEAAA9P6nKQkAZfcXw/9nK1nMAjZ3AQBlCGD7QBaAqFS/AeCf7ePvPwj8ewUApv5PyfAvvtv/bCvj5E9sZ1VXBtRXgNlje5wyAPgPAEfm8fddCbwBAK3/UUiff+p/AP8tpXn6mfafYeBWA+gffkMAfASAYj92pH1hFgKMASj9J8d+mvkPWRX/Acwn4gCA/RwAiQyACeQhABy2Y2faHoxCAADQJ4CXhPi/7M1/FACIAQwASzYEwP6KFAD4DgAI/97TAEKAIQDR3f/1cgP/uwMACiCUf0S30wL1Dz+kBMBnADiPHetsGgL0ADyFpf9k/A//G8l0AowEgCXxDYA51kK1kgLQm/+T179m6d9/IfD5qgRgchPd/4yI/6j/m0jhPMwX2wAcIKUEwH8jACIBANdbgOI09qCTnoBfEwCewpcp9X9J/e8cALjPz3/QAiIEIADUigKAE6ISAFyuAXfbsRdtd9qloAkAUUr9JwEA/vf0+CP7gwAmB+j8ZwFw4P93c//9E/CtAYAGAPraxyqG/93aLyIAoQqwAWDKAMANAZy9CgD/B0vAOwCQZoB0mhD/l6X/3TaAFfMlAPBt4EpRAIiDQAIA9gCOp8Dwf7gE/HvVAkADwBoBoEv/oYCrAqC7/dR/FQCZ4H9aORLo+iAI/B8yAb8AwCAABJ3lf6R+6jy04RGA/QQA5dNfBwD893ASrID/nrQt1GWgJgI8ReUGgAQA4n9XAMB/of2D0ASuHroCMNf5n0gCQC9HQdv1f/67wQ8AICkBaQW4QgLowP+b+7UVIISDANBa2P3jR3ETBAD8nAXfjwegvXoaCADq/I/Sael/mQE6mgDCf6YEkBIQLzkA5nOkfCrO/wQviAEA2N+tPtvNf/1PhT/VAIRpcgsAHU6AFjUK6lX6XyWgegAog1j/6aFwAICH3+3bYMfxQHRUjgJUAETIAOgAG6jGf3CgBgD2A4A5D4Do/wMAxn+nGeCQDwWA/KDKAQoAnsLwlgFiBIDWGeDmP4OAtATgCKguAk38jyL47ywDiA3AkFuBTwBQEwDChACAANBNDQgWpABUm0AWACQBwX5xDYjqrw99tC8A/ReCH/IIEN1LgDiY9bAElIcAZgxUbQTFg2CM+1PO/74DwNvACwDoqOwDpBngXgJsSvublwCW/vNzYEQBsgusSwKwn18Cwv8e9KUvAIZfBnxpACABoBsAYDzvv3IRgFkgtR8ACM0/tT+tXBHi5064n9N4YDr9SPcBAEBoAsMpAQA9YIf+L6qSLwIBwFLif0KE/Q9zP0ifAEx+zScA/nW2AAAlQMcAwH/JGGAjAgAEblMgxn/m7igy/RUAcHArrNsEgMvCLoddUewOF5MLxvJDIwDoUdAAGaCjOaDefxEAbhfI2o/kz94RBf8dNoGn3t0/8TfF7Y4nDQMnyxRAm4Bs1OUQAPMfTvBfngJIDzCC2NKffR8Y/vcYAT58dQD5uXbJuzurETg2BQAHQdoPgeE/I/ivqAGFK2WFW2RTpwDISoAi79n+otnNA3mhBwD+IwWsutsDLmSC/6wY/wEAZ79IAPzvEYB3LxXgSXnEY6fKPudmAGAR2LX/kNL/JfWfSjj6JxKAc2Be5sC73M8rP/pXkPKdRQoAADGtATsu/wL58w/Bf1wShewvEJCWYvzvE4BXSWe99zLPgS5yAvamEQCvBBEAEAG62wIH8gIAgv2Vq0OZC6RlADDHwJyugg/+TvjpzyEeGgEQBIvuA0Cg7ABgP3Uf/pcAoPmrASBlToG4XwWf/PmvJ+DUNAJ0HQACAkCgAKAy/4XIGAD+cwSkVPC/XwDeHQQAbQq3LUMOVgBEJQArWgPY26/0v/IrkTT3r6HHlbFaAOC/8xpw7zP/60eRezsAwpekKQAzXqz/MgDQ+bH+4xtDWP4KBCADwH/HNeAu97DRFfUjnUXtDACYsAAgBbSb/wMAhH4AwNtP/RcBwPpPBOBRA8J/BzWggwCgmOTaTqP3dgCkHQCw4Ko/OC95Dwi1v5gBMgUAWAbAf8erwCL3WwDoQ1FeWAEQAoDGAQC2yySkf+K+CoCM+C8SEFLBf8engY7Ot7nWG+mjCQC4HDrJ1g3eCZtZAQD3xUOArP9aAFIWAOe74P5ugS1UZtsEo61JEQgApi0BwNUvxgDAfxGA7CH47wmAL5c9IAJA+xBwMAYgogA0SAEzVnoA9P6jBKRKAICYA6I6/x3cDLT3XwHoq4C9DQDpS3ZbBrUbAcjNh/+1rwJC8B8AyEJAxPjvrAsscv8tgL4RyAsrAJL1qicAcBsgRO2H7sEfMwB8GUgRAiL47/I0yMXfDMCmIr2YFoHl58EIAORUeHP/LQBgyj/xWkD4z/eBkCMAvr1lgPY5wA6A+RWAoAUACx0AyP6M/xC1XwrA1AsAv44yACp3e21lOcASAKwDewFAX/6J/isASMPIBQBvLjPA3sZ2fUS6DA0A/jVQcQQsAKDIATwAzr4TvvdTAtgXAWeTIhAArCkAs4ZjoLYAwP8R47+qCHjqPwK8O5oC4ZG110WXUfQApC/ZnPaBVzUGwHAKyGcA0X8AgBMhAgCpJwB2495ksgi2mUvtrABYrfoBQBwC1gMwMgMACvFOcH/6crMHgGF6mSN5NBwFtwdA3wVuAkUEQAAQMwAIEAGYOADA5WHQohkAhaaoBACKKjCjt8Qv2gBguATQAJCZApC6AOBTXgIMH4AtD4A8B0zpu2HlOqjlJkC/BKqbAc+lAIAAXikyQH/6k49dhp8C8p0xAC/ZqK8IsOHEAIAhoNgDagGA/w4BuIwHXwRCF4sUMJoTACwmAVb+Q+wWSApAogUghP/96Z9k+zrkNhA6WwGw3gSeAGAuhDIFIA3hvwsAsHsb+iAIOpmlAHoqdHQHYNb4PBg+BISfBS3NAwBUCwDsdwEAasChj4KhrRYAHAum7wYFbQCANnL/Y0kFYA4AikC3AGATNPBlEJQXuhtCAAA5FtoUAPEKKCMA1uYA1L4h/OQUABRcQ18HQwczAJ4iBgB7AjTXQErOgqylGUAk4EVUuQ52CQAKrqEfCIEumhQAAKZJeShs0wyAhTkAMQsAVUMAIgcE/NkPgv0fCYOOugiA6+KzbL2KuwBAqADlg0ALAKa1APRPwJ99F+j/UCh0NgTgKUwy7AMbFwGwnQcgqAAAApQpQBcC0hKAMOoZgE9JxT3oY+HQvh4AiAVgFXfSBwIA0f+rDABIEj0AIVXPIeBLEm8H/WIIdNIAgLfDCADrVasQwPivAkC/CEgESe+JcggAWq5hvxoGbfURgCqaZtmoJQAgQMwAAQDAleBWACT1ASDsuRd81wDg/+XQjgB4yUajNcrAbgCABADgvzgJTmolBgCqyCsA/l8PbwcAvhycjEZzCgAIsAVgIZQAEAjoBIAQADg9Epb7vPLf/jXl3CAC4Mb4EQHAsA4kf0MZATYKAMTzwIYAIAA4yQGTNwUA/pfCl7wtALgxvgwB6yX5cKzRSpBAItsGqAFY8v5fZQlACPWbA36VAPi/JKodACAgJN8MWJEvxyIJ2AKwUPiPOUCsAGCkAQD+O8oB3zoA/F8T1z4CUABektG6BMBwIUD/ihkAlZ9L/5dL+I8awAKAkNXE4cuhY2jAF0VCxkVgmQMAAAjoHIBYA4CUgCn85+Ty9fDc66d/xCvi2qcAAEBvjKYV3MIIgJmwD5AAUPktAJCkACkBrP+OqsDXPzkAvi+L7hYA+uGgVWwFwEwPAAhACBg+ANCXHgD/18W3B+CpBCBBCNC3gjNOyu+C0RVhtRGUpgA5AVMvALwrB0H+PxjRdhCENiAlx8LufYD2A3IzGwLwOx0Ao6EB8KYAwOMnYzoHICIA0GEgLQOJWgEA06u/EQcB8N8oB4S8XN0QIQLg76NR7QGAHleGkxCwXgEABQEzUYpvgwYiAXwAeMgYgMgFAJNvzezd/2fjLNbByhxw/aedEgCWtAhYdAQAaoD/7J3dctMwEIUziSkksl3XpZMbmkwyNJTCFC54/2cj0to51W6ktQpVq5meV9A3Z3+9HgFg54HZb4JzOkB6Hbj7WJR20wEwq6MubQyYFATaM5KrwU8AgEQvcBoA+GU4k8n5eejPsgBgK2HRGHDjLKCzFtCQB/w7APTwbDbUDJvB/w2AWcaB8LeyAGBLoVECLsgCLABDLRgjoD0nvhjKAFiwgWAgC1BCAB4+DwB7thZelH4nAGBWZAEWgAYEtIk/Cl74YjlgBAB9HiQMAABkGwcdygLgkALAYAEAgAiY2gdii4ESADgAJ4AAUOtAXgOgDZAhC8QOZinSPw2DqBCkQuCYBVoAMBXSAAABobUw+AFbDD1XByhroRdCy6yb4ZuSANh8SgPgYrCAawIgNhhuJQFyLYj0hAD8LCQMwDwKAHN/FAG5ssCHkgB4mAwAdYNtM6imVsCgxRQArlgnQBKA9wcAjAC9G1z7u6AZUgDSY2l1oH4gQoqSAOcB646CgBMqAZ2AKwCANACCA4gY0E3qBZEBCJnqhQG4K64M0E/ESA0xwO6FdK4SbJo4ASz+EwY+AIyAoAUAgCgBzACgKksSgD28AhQ8EqVbAF2M6y0BDdKAVgHgijC4YkFAt4CAA8wlADXen6vKmQRsyswBdQBgAXPqBcQJOFMEIg0U6R/CwiQAyAQEABdCJgcBj6VOA+ShSN0CaDXMVgKWgEgx2HoiAAaxE6G+zrQCOgAQqwRFCZBvHlROM1g/FatbAO0FHBE42gAIUAAAAV4QcApEAeYAgWOxEIsAJl838PuLHovOdHjyOwDQCgH6UNQScP00CigEUCrACYAEAL0oAxIBMK+zFbQpKQWA9ioARADthq3JAlwqECCg9QUA/HaQQABpoGwGQwoAwgNMvo8DdiWlANAdAFC7QTWCgCXAvpxMBNsIAQCAiRUC4hvxSC+ovmEAmHyVwH1pnQB5ePT+zzQAKhcDLokAbgFtfBrgAAABBIAUCBCXwmJZ4CoAQA4L2Jc2D5LXRvYAQCNgtIAjAUNDwPWDSNpaKJ8ISMEA+l4BYC0ByG8BciS8KzEC/JgIAM2FaxBwnUAAWYBOAP4cj2GARsDqRgHAvMeAWASYAQCVgApBYMgEexcESNpiqLwYpR8L7FQAahhAiIDZewyIRIBpAICAS5+ABgRwC9BXgyQAOBMU7gSRYAAqAO91QKwGSAIAHjAAoBEgRoNRAvidsE4CwM/GryQAmT8RLG4v7OB3gRIBOBIwIkBPpRMARQiQh+K6eScAkH8PXSEC5M8C5TxgU1oX6DEZAOO2xC/RE7RpQAoBAgBshHoZgHv0CABrvP9rArC9ZfOAsuYA26kAgAC3HXTKBD5bAlAL0NM/g4Cx/DsJ/wvk0wAQUNdKAMh2Lw5pYFkp4NdZOgAmSABpCgFAAM8PAuAAJJ4EwgDOlQCZd8OWrBVQWBMgAQAQYCgPQDXgBkMAwBKQAgD6PyAAF+JOkYAHgBrLgAFlOhpb0l7QFzYI9ABYnl5bAgBVxlgTcATYpwEBJyUSgPcHARgBAAIQgGVQOIBWBbyvhUgDeGQA+PLeH6p8Aqgi7BtOQDu1EiAAuAWgBSwSQLSAwjWg4QBkuxZ0KKgG/LVlAGgCADQbHAlwCCANwOtHEODv348IjGWgAACvj/cPA2CyfSCy3JfzfcAD2wQAAGkE0IqYSwbXAQKAgPK1aAOBADkHnosWsAXASgVgBmWoBA/FGMDt9pkAeAQgF2xSPABj4UYQ0GMOIAAQ768DYGYvrX0pWcCOGQAASLcASUBPxaBUYDiEPTBhAcETQRgBKABkSQFgAUUUAigBYAC8DEyzANcRAAGNJOAD5YOhPBB9IMg/E8Trf7x/LATkmQVB+zI+EvspDUACUCUHgaElAAI8xe6G+NMgAQAIECOgURMAMBkAuLstoR2IJiAMQDSCltWoCArVUQgCLgq4lsB13wQICCQCC7EPIq4EMQLE++sAzDJoX8K5mG/MABgAIACKEuAQcACMBHwWBKA5rAOAhRBxKRAAiPeXAJjcAMjLwQ9vvwT8tZUAgAANgipAANUC0gQCRQFfCaBhgFgKZyEArx8AIHcOKHsBhzcYBL4chAEAAEaAYQykEYBDYm28L8AWhIcScFDAAmz9xwjIUASUfjROZoD3WwEAVBmnGAHVQIDxCLCpIPYDwrnAwMfiL3Nn0uQoDkRhBbgUYOEGF7a51DJub7WY7v//76aJHPGEUmoVeEzpHepSF4fz88tFiRiYvxV/yCQAr4sHAPM3AeETgTa6JPDR8lMAAMAJCDEAAjQCJZmAl4AHRkDqWQgmOQgou/gDAS8AyvwrZtI7SwIRJ4B38VcAcgUBAmcSMGeC2gRwr7jDAkAA6wFwGgQGzAxQmgCEuwCFDDCHTi3rBKLtANqTEwCIvjtmAwwAEKC7QTIBvFrAXwfQFCBEgFUBUvzHtIHd58/F/K1gto9wBowKMADAQkonAhYASALIAiCAm4AFgOfJoEEaqCprC5AACAyClA3BDAjkr8M68BDRgujLwaoAQwAISeIMcACQBYreAyrqBhkBDAAPAjVJzwIHDsBMQELfOw/8zCIsA1AAQJ8iCMBC+hEAAEgCnQYEbOrOA1ANcq13kHMcxKfBpZMA+TUhEcz1FplLnAVAdhRhAIQ0f1muWmDhIAB1gH7bLEqBAAAMAQLAXA+FB1itgJRRmAB/k9g1sgkAZoBhAHKJ9AoEuAAACIAJAIFRAKAOwFMiWAigdeCCGUAEBHxmERaC+4wngDAAQlkl9iQCVjtWDYYB0HUgZCcC0wCkjIYAngQOEcyDPg6uBBAGQEgU2WECCAEaCJgE0LWSqYZgHQDA3AupIRwMGnkAAERDADoBtAJxNQDoAMIA5NulB4EwASgE6IZ58gF6ODjgAMZimKENCdcEagKkjIuAUzviPb7zv20YI6AwAGKBVnsEAZII6PvBugYB/+krKYDEp8LGTBAlYExZ4FcWEwGIP84AwgCgDCAxEwgQsDUJMN8yQFqvw13AI9QBALEnQ6Ij4MgIiCj+RzEGACGLAgiECZA2ATQWxOWiuiugS8PCAHACKr4ZMgKAeZ4TeYuFAMQfBYAHgDABIQSUGiCgx8L6iPiPVlYqSP3hNzUEYHgwQB8tNgJOz4yASOL/fBIjARCyBAK3ENDfMg4TSNMQAM6xMGZC/k7wm/eEP9sshm4Q/R8mAGEAuAcQAjAB31RIORBogAAx0OeBDgACwiEGAOZBIKBYAoDIeoGfmaXDN0yE9iz+P8UEAITqCChcJqBCBCwHJtBJXzWPp8J2HvkdgNQQl8VEAsRdlR8zW9dvmv9C7VGMAwDdYFl6CFBeAngeGBKw0wD4GED8TQBgADQOLiYCIOdqBaDLrGeDT5fM1lFMBEDk29JpAmEC5LbQ7UB/wyyKAUTZeRqgL42FNnw7CDkgKgsQr++ZrfOMpeDLObP1/joaAGhZMhNwu4DiJkAdO5nAHw1s4LGTxQBeI+xYD6qwHaqhLABALBaAZnD+QgDpnzeA0wFYlKXbBEh/NQGTgIoIIA/Qx/6AgDhYUWngWQ/DIIgcoJgIgBJzEoA0ML/9I/7TARBb+sa/QIDqhTQABAZ3zRsJnqwAYtNgqwU0d0NwHhCVBYjT74zpPEM/+HHOmH6fxG0A5IWTACCg/ATQLfMoBVAJUHSdCFDk++eEBlshcAByJThABNMgKHcR0F7vbAJP1zZjejuJGwEQCiu5PgTUgAA+EyDRbLiT+RhYDwFU1/2P39oKwlpIp4nxl2rmLVGYwHw/f8T/ZgBEk6arTcIKARcCypBkDGAogCGvyYB2hJqnfxBQFkgBUQKAOoDrcrd24AXZn+X/aQDkctkktNbx0GldN65dPAWBAIaAZoD6AXbSW0NAAbcFDeIPAOAAcRUB6Aa5Dten+7g/in/W/00BQDZ1yl8MuktwOGAhAIUQSPqQbwyR3UP8CADb4R0DMIAYAQABXOc7dIT7fzJP/CcBIJvdg0dpXTXljQgkVU9AVW0s1fzhMLsDQAKIG4AcM8H7lgL7c+bU8VVMAGBR1Pjpu/RjvUpKvTU6BgEMiBPKAxThiv5WgIG7vzkDAgH4ENEBgJsDPC7w9L+ZP8LPzn/y8QCo5nH9ENaPusFh/DgEcLmYNngIDPCb4hIj/pQDYEOxAQD9evYjcN/wP/MFsDAAKtkh8we0TnerOimX4xHQD5LhKnBDvRXwf1H8QcByS4oZAHF6yzw63N4RvFwO/zJ3hr2pwlAYPhFpVjXlemfnF4XJYIoIeP//n7vVwo7rcQJFlj5+mFG3ZHkf3tMqwReEbP96CxC8LZfC74f3GsieCuAV5ta4uJu0ouJHvgaAZOrmsAAQJZgKrYEBDoR48NuMfyoAexXLpW+BN8Ea6GgAUwZoBW6YqJt2QQtBxj/SDADbGQC/SVz8HNTHebexq/4zHvyEIgboLcDaE0Lnb6MAaYE2D/DaMpRAP3ybf2CA+UvGelswh18lN8YAcaBnD4RG+iaHHHoLMF2JC74t3mq9kDYKXHcFgQLj1xhGmPnLL5hjZ4ZSuDEGKO/7XdipCTbhbo97ftv6pwKwN8zfFuGprYFNCxjoN3luJAja8peOLgEQXlYvbbyfT8dHFmzC4+lMwidUJfDeAsw8n+RvWQSoQAcH8HKzdeiLbwQIrX88/KXVEsClEkA+Ps/70+4YhuGmRt097k778ye2/sDDnwqwEJj/UAQq0A5uCRSzhgXyc/6I/afBzqwE7LGf/ihAk7/wn4O3ZjVdFMAmmElDAX2Hpm/g6rsAlHg7bvzbOAILAWYk/6G8LlT2aEDHIrgyozRNUJeENHG+AJA0KcaLv0hS4BYCSOE/HfG2CrQDJOzp9EETEAUo0oUCsCfNxso/S0FhIYDnj4P3Z3avBabKgOldEViN1HTJ3/0CoOSjKJDlAHYC/PNHQ6xqBRi5+Cg9g+i+CFQAyohnA7mvAMZvK4A/JmLCNKYBiuZn6+cGz4xfqvwdIE+KZ87+HMAxAZC/M1QAuaaPtC0R5VMGgH49uEEaV8+Jv4pTAIcF8L0Fa6A9YGhgSoJt8bVJsBagfjkHV4jKbHANFFkZAbgtgC8C1lcB+iyvn2WWAkjNnHNwBg5pnA2a/HjwuyyAL9aMdXYA14gGXINl0OdsgPq1lz8CbpHGdj1QYPrjCiA0g98YusFo+o6YX2DciNAuQKPKnF8A50jLpOo595MS0x9NAHEP306G5UQOUoAbgEK3AXs0DfSjTfwacJEoj5NDpyYoDkmcR4CMJYBop+9uQNorwAlwheu1gV4lGiLU4bMLc7zMObjI9f9JLxZsf9Sg2F6yTwHQ4rEEEJThDngBe3AWcd/4ORjowaCos25+kXzTCbhNlOZlnCRZdqiqraKqDlmWJHGZp9F/9s6gt0EYhsIW2cVrFZSpo///n65iUQ2O+9yQIe3g70IPFZf3YQUFeCScKUAGjCiQp+bZjfcMYAPqYWcA/X+YAGcLkAGjCixT+yaHGHDpEYCJ+ED6DygAAmSfUjnkQboBBS7nzADJ3xEgBPDD33JsGKQ6BUwHsAD9DjC1XXekCAE649cKrMceGb6u323lW68BogCDdbXVdEcmIQAIfa16KJCuBUK6S+sfmgK6yx6sBaxxYJedfpBFCOBc8z49i8Q8fZoKIAcAz/iVGUb+pgAhAM5/XIFsGqAdwDvGDFHhg7prLUAI4OZ/xhjId13/6e8U8WG2tRZMDSGAt+gbV6BoCcpsVwD7t4Vj+RsChADj8WvMs+wlWObNqyCNAsKQAOuf9602NE4I4PP6DE8HbqoCFH5u5MWNwXqASuhCiwu9RwhQhshQjmrAfJ2BAnizSDSQLtsmebn8V8xHwkOArAUo5/OrwKIa4Y1NfeCAwPWgML9gzQQIAST8lORn5e8VSNP8AEwBkcA3wZn+FUKEAD/snd2qhSAQhUFDOKYalfr+b3rQOTKo1hSdrmwB+4fN7mZ9zkjkGjSI9/XPBJjF2n4VoCkoU8qntBmA12b1i+y/620BPgAI/99iwCABNhFAMCDmVlPk4KQ9zOVQy34H+ABA99H/1xHgQACzWARQdB2gu0Inny4/KDZPNQkfAJX97yHAUZEAzkLoMXDy1H909YSEw6TaPNw85RMGJQCCDwDTAkDrgfMVARozgFTNAH36YyYzCIojhgoAiLMsvV+ZdNJCfv2+MCvFNCoAaNEF/33UbQoOODLGLHUEsETJKwwUHSIXiPTDXJwzzsmEMLRCa4/DrGFLavwW5DQgANcWvi91pxKc1hJfxkCqGgJqRjCt6D4s/7TeYSiV9sn8LIw629U0JACE+a0uNwPqwnsA2YqB5wQ4EPhvw7JpnqNw0fL2G2diJABIl3xfF/cD9KVXFnAcxFEvqIMhXes1vJXm538rG3YfW87laItxAEgEEJY/QoBEa6smgvULgasFHmfXXSOJsmGLFR/9J2U2N1QFIOynCOBPANBAAAv9VtC5RSDbsADReI9Sdon230xCN2wepwKc2a//RBFwHwC8+sqSeuHADQRIgkwIwKfjkLm4/MF+czvmyjrxM0QF4Fm/7J0BbuMqFEUlaCMlDZgAJev4+9/cr5+x74OEAK4zGmdyNHFMR0qk3tOLbZr6JnerGOsMkAX42zgxAQOuAwcG9HIeRMx/7R9AFqePf6UB5uitdQzLJKgY0C0ADDAikikAOg2Y7jBP+SP+dUg3fL12AyARhJ9gcavntCSYBJ0CZDOMvVUgN6DWAueR8SkO6AZzwoVK/P/seQEaYMwuxu/qUCMANMEaAdjdop0XDEgAcDhwPsWo4/hEo5lh+jcinNT6cxPCcHxJAaaI0PxNpHd9J4oGtORPKG+EQA+IK4AB4EQPYqBNTsz/czPC8JINIGUl/FoVhBm5UgBLOKvu3SoODBFEzlLHPrgKd9n6zx5+HV9MgP/G4idWOZAZIPsF4O+unBkdEKbmAN1AmAQoQss+Un9ujJbKieFwfB0BlgwcBOirgfDYgMohYGKf9d6bEcHJDQDn+8nT5iqMRf5ba+CGw6s0wFLBa7EqOS1cJ0B2Q/GyA3naI9gDwhgUwDPQ9vr1SgK4X2BV2YDKSWA++/gFI4zILKAjwzT/AmLMHwXwJLT/fhUB3C+xCgLIhgIoCuDMnL83RqAImARL0f/spaFjj14l6M+n404vIIBCAOux9ztANs0ADnjBpgHj0QLTnSQpZiTPDRDAj1j5+Sdwh7cAE0oFlZeAbBLAcYzwC8bgaOB6/j5dFxk4sxoRE29Br/pW/1bXhRYfexYA+f8aiwuDRF0AFADwQngOKUA9cCYBiKz4Y/K08S4SdHv4xGoHwuktQMTCgEfkMwDHGxgABwRIrxUKhjHeuwWpy3HHZ8SfG6A7S+D4FiBVoCd/63IDzGMDAARgP/vW0uauALqDHgnc134FQAIbYUOQobcAwJi2dw0KmPFB0KxP2AUldTn/7R0Ih70KgAi2VeABhfwhgDHO55g0eQpfUPYxfov46WhE6kr+2zpwOb0FYCgY0HEKAAO8gwLsugAXgE4RPBMgEpcnbhtAg2d4oE9vATihmH9dADIgzX9EGIRPGxLgdo2aXjwVQG9BjwFvAVyo5Y+3vhVAULRZBUyZkwIkg6cCKOQfpO7P/xJZp4C+frwFSKeBeD7AXWgUgAxgTMnTgwQY8cbDAOQ/bdcIcFlgX+hRQIrD3gSwVQH87wyIlH4ToCyAwbKAH7OOtS8Ig0PATIDxtQOh6/FP8V7mAeBf6GsBc9ifAA8TZy3bjQ2SK4BBkwBzCRjDrwlDgNmRQv7hUs8fxAFgY53xEpeGIYB7jgC4JMCQjQKwy/pmQXADCgLQK8e3ojmgGn7rp1w7FAjnPQlQ6Xw/wsfYaUKFhFYBYMCcPuIHbA6w1qIAIvpx/PKWjQzQ5mM3AjgizRjZRwF85oP37dVgVbsAyB8GmIi4AdMEE0AxAWRf/JAALkyD/olAfe9NAB5yzLkoAHC9BrSdBQpQCh+GEC5eA7IVAdD6bZ94xX6nAXLYqQDeQwAGws9ZrCnpMAbTJ4DgIP9p5fdKm5/9fBbgAqhApJktebZ/7h17MICx5xVCCJD8nFPB95D0Au02GfDwECBf7sOIIybSwwCcDGQVgDBDlerBQZsB5rgTAXjmawTgA0gBaJnmvgAOYI5J88bohrkC0AHzTKDmIFH8tfhrH4DnGrSUwM//mOMeBEDoG4AqycvANgmAZT8EPo9gQOpAthzsYIAMQVL8DeWP2qBncLcLdN0BrakDdiDAsyABgK0J4CNz4IAN818Gzg8EcEmAfV5N1vJXWEVglGeEhhrQxPXvF8ADYLZygGPrAqAAksTjYKAN4AZ4n68LLc1OiT3KX5WARTcaVK8LaOIy7FSAJxsAAeoFQEnH5yGl0AEogSnE2tGfekBxLqisEumIPO1IAIOVlxESwfy6GRyLBd/Q4ieCDM9/uMOZHokC9EGgfGXIjorBgHr+VjGshQJlB8oG6Bn19ZcL8D9357bbRgiEYYmuLC3ZdLd2bN6j7/9wFac5MkCaXtD8cvaArNzMxwwMY4BMW31I/R8asClevuoIcqfsAgDmtwCoPw1nCFACcCyYYkGkbqb7x+/iC33rJQpMAEBuXxuAa1a2N5gngJRsGAA0+n+x9pE+aVcIECDgooQTqCCkvj3s/knlGd6wzULASgqQ9MOxNgCBrK26dI/KTU4BABCkx3kGMAhU2Q4gOG5/Ie8P2BSoPRaUE9BHtmPP/CB8QzUdAZ0QUAJ+MgDi4TuPbWkAVMpVld1lKLQyASw2zBOQS3il/S+1OxBu/FTMz4ROAH0A1gnTasE7WS58vUv7K2kCFEIVAIJAtjxzAPErYWUAfrsZ2TEBxorXNUsAAvCo6tr/GOwMprwAMKBTkkWJARLxQSMQhgTgFfPP77f/HQBNgtPx4VMEiBygtD8d7/muDoqAg/lAvGBZKQOg3OiIf15GkhAJgCtmoF8/3NoAhODCJyFAGpwTAJAHnldAAjQAYH97z/DnEx6KfG3JABQvABJAMgCSOvYHb6FlDgWo6QUA77eVAQhJeehFV1yndTV8QSUCWzgBGP/t/k/NXy1et4a+MQTYlDAQUCUBdSuifIcWaf4iKw5YZ2e0aw/iN9zCAAQhh08OwRgJXIElHgWiWva3ABD7w+OZAIKAUy8UUgh6tc4aANsJKAbg+BntABIA97elAZjXCIP8KXL1npskAXIFUAUAfZZguqHADcB0IEeCk2aINQB8YKAhEE210ZgY2gj8KgBEuf2bABCynaZigmO/5YIZGnXC6YWnfxsbA8c+bwu8gD9oKHB0YogAaBo+KzNJmCNBsrwC4HXuqwJwSs2BEKamC7LloyrFXvGzX25/f4xOC1KBAAhg/sqYoID7wTs0zxMg48ArIpAsXwGoh2IAAWsDgF606OxHhKFL0ASwCZoq92L+3zxFViGA8wEyJRDkSYHNR6uYrQInIzmY/YAEIO6H/3HuSwNgO4KhX3DTYwSRQ2pU+3H/z+3/po6JZGEgQSDDgEBAA2Cr6wOAAJ1g5iXlCAAQsBoAsLAmVRwA34P1a8GBjQup+VX31wD0DgYtJwipOEABaIWBj746PuDePUslV6AQAO5xpOOXBOAgOpsshNPQDAUSCFXkH9D8uv8/pfW3rdz12bBR5iIRpIWmAeDTVz0MaBIgqsgYANflnksCUAbQ6Q9W2mcVLA6gjF9s5nY5rtZu8Dr+08OhN1BtVQT4TDILSqNU9SCL0fQDGgBBQAYgJT6T47stCIDnAl+QLihoYAqwa+uMnCjy7tnfa/sXo29UciwgVgnnEchBos/AmIB0h4LkqFcBIP/rsK0MAOrwXkaEA2XFg8kZJAKgza/9P5rfkAwEjICMHQJgMDBbDtMhoHXEHgHgcWX9fXHIvm23fysFgHYF+cqMDw+2ZghgLdr+z679932PF2zgQwG2TJzVB+CaVXMwIAG4KwDAAcQg8Ie2c1FuGwSiaKoozEjGkevIQXZ+o///bRWg1a58gQGCTz15uJ1pJvd4WRDItfl/v3/cfxyPx2NpwGMTwDfQdLkNedqLI2WIa7BVg6QN/HdT1uufwx8G/uiQ84GnyYAUYCMkQL0CNB8QBx79184AeiuumRZHa+eCw/unF+Dx4+L/82sWFkAy3mISwBPEFMNIH0AImmgyOjT/k/FT9IJ+49kAPQZmgz4FzL/OAFRg31pI7YAQgBh/JcDDKrA4WgmgbvTm29IC/+EYOTohmfIwpABMMPXE6UcEGBA5CpAD1AcIAeLLwnT9GijuBr/PdNHIyWA1cFzdLdCJyj5wOK8C3G38jQX4pwTWAnwbZjYB0UKFKVcDGz+ix9DyD8Zva6gQwD24GZSdIAvAReCwtZWDLywDMxYBEoC+sx5Q/ixAdQkYvt6tABZqAZoKgLAJ7EJKBGoZQ7PHNN6dMZo/CmAfkogB25IGnyLdBPAPFoCpd+B62OfkTNg2Dnw9CWBOVQLM54+7LwG7AEtjAZBbwIJwlyBHik0CMW1wSTyJQKrQxILiT4z/xJurAjASsAAKG0G4GhEe/bsCBdAAuZlonyPALQ+mvkqA69/VgK0CeAVeVgFQA0UiSCeCArAJHhvC0+QR9HDlw4Prf5HR/20lbsBmKQrQ7RkHmz9xS5oKBc5X8Q09B/e8MEafKgS4rGPA2gbefQl4tBPg5PHX2lQKGY7oFQH0QfP8kQYFzQhvCtq/N0e8BJAAbABxAQPoud2RjYJxgF/2yCyGAN//qBoBvmkiSAY0EgAAD2IcBoZc6KVP340Sjh/yRwE8qRKg8bKQzHUGATwsQEkRQHijiRBgcqgKAc5/P2kMsDQVAFF5JtykBiVQ8NH44/lvoYMAK6d+bwPTAuxL//YbHzrinSAqDLDhX2YSgPKvMmDovq77WtDi/7RpAnv6zYXJcAAZi8Dqn379vzH+ayGABdpAY6JjQJdNRg24Bu6xSockOP86AwZzmXkMsCwtBZBENFgfhS64TEvix9d/On8UgBcEYXdIJygXIF0DWIAZBXAKQP5TYSc4TKabv60A1AVaBdoIgJz8dddwOXAyxIeHWwR0wStC6ePmn3D9P+KfYwGwAuioAEXxc3eIBhwiP95s0++L9gXAmEkyls0G/buhiyZgWV4gAIoQbA6cAJ6EBX4C6T+RArzMDMTjx/yZfWmwRwNIAFp/RgEqSRtwFAC3PBPjUCLA6EvAthZECjQQgFqoJNFOkWpCGrGQgKFD/p54/mhATAA2INwGdM0NmFeid7yajmhVLMDZLwZR/G0EQOLVANkjK1pQcp/4acmJCOePYAlQUAKcARhh18oAzt9BX/HYH8pfF7UBN206+3bIdzbAOtBKACRdDSJlQWVxEx+RzPrPsAD+hyYBxtC+AKY2/uDJaCr8G4cDj675s/mDASWDgBpNZxeDnAEPp8DSWgCkH1LtQUKCehLzfwkOAu7fixJA+wLgrFAT2B9pwEywAMb47i8kgFYlAkxdN5/fP+/OgNcKgPQpYiNDTfaZ+aMBVtZhgCYAKkAaOiBfAhcB3GnSdVj85eHnvkgAWwL2S0IrrxUAyW8Ukaz0s6b/yOARAuAYkHV2yUisDTlcUlvNuPvXAQHGUZUIYLrL2gZ+ijYArgk3FaC9CDZnLg00l+TwOX58/acQArABkc2B+JLntA1Sq4D9mvI3Lu5QARjHvlAAux7MU8E2FYBX1AqpLgeUOwLxFwnQswDSgClhgMkhqyG0D/nifxZAYwFYUWUC2Pdh+ziUgF8LAL9KoKJNPOWrgOnL1DH/9BiQmAhimCabzK6QDaCrTCSABgHoAHyfK8BtnDp7rP5bjAFLCwGAwT5cX1VfDJBE4rHCf1jryy4BsX1BOBMwbQ3o2AAqCUYKoKECWFSBAMYKYBeDVtpXAITW2dt6IFQQcvQM558N//8wBrABIkxDY38J2QbQMiMLoEGAfRvcbSgQ4LIKYBeDyADqApsKgJRasD5y8Aog5fnzz5cSYBJZmgByy7I7qlzXEITyTwgw9gUCdO492A4CLC+sAOhBgQq0LkOfMxmYXwrABmgwAJI3puC8Y5fAiFsgGBaAfwiHFgKoEgHmr69VADbg9QIglfPGwWabSh07/9eUAAw/4yxL/l0wDN8YS+Z/NEB7xoIxQKlxmsw8rwJ87gIsj3YCtLcA2dMOVYdWAsBqMBmACky5GJCgA/B+SdwBih8CDVCZAty0LQEzC/Dz6grQqD1AegGf9UMqBICJoEUOwKUC4KFXVgAnFUcBfENBAowgwLYvJqsLOCml3aaQq10N/mgoQAOoOWgFR1orgIISoCcinv9+biF5zC1SCuApYyYqACDA9J+9M+xtHITB8OmOVCJw604bq6b+//954LpxwQaTNN1WiVdbV3Uq/fA+NSZgZyEgRJk+AOY0XpwD/iQAor4ZAB4L0sNOIKCrGyMAJ4D5mbW/As9JagW8RIDwCu4C0wFocRkYdbCdABwTAHEduMwB3wKATsJ90qzXCaDT4XnLEFn+8lMX38kRFgacievqYgbxOYA6YYaONMAAALAOSMuACQGI+mkAEAarUcC33JmVspVgg4Dym79YxaUgwAA4IQCeA4C43VRDmJ4IAJeCXt8jALQQ/LEA8HPb/QHgIQDM5CKJjIcfL5S61sqeewAA+ZkRsMBGzXBtBwBwJAABmJ4EAD4z/Nrde8ZYXiW4IFD0wPPHxfq2PJIgZAV1Ak4NAMh/CgGuAwDcEYYq0Wl6NgDIqWqWcN+4MgCBCMh7WaBWlbLx2aDRTZkBgGkg/+QUAZzVAQgEwJNFAK58ybDPiIuKGjFGAGneID4dNAHIPwSzTUaAngUYFwHwcDb8AsC0MwDPLzkEIANFQJftD6jleb0dypEpt54BgEL/WRLgjO0C4HhKxQG0DHh6AOzeAPA0EAmoC0qWaprl9/qj2DeVN0ArMBPjDwBgNADcAaaQ949/GAF2BuD5JcwBiAAYWbN/EcCSFaw0Cp7h8gADgJyHxwYA6SlFAAwBKgA+LgQ/4FwoRgDR/wFAQQA6KZlP0vofzHPgVspbyCBxBmDzz0oA5gTAn5dlCjgzAAYAjIAqAuR86GmDUTZPBAA0sURDyAAQgDYBJiUBBADtBw4AxJVgUkZA3gw1LO4HxX0+gMyAvx8AY60CAEwBcDIcc4DWHDAAMEUM4DqsU2D9cHyrvf4VgNCeAjoBcLgdBO3C+G7QAIAT4JCAQpTxbRGR1Oya7JMIgIIA3hrJAQANApxxDmsD6Erg+TwAuBXrHWqghcEWUS8MSflMUAEArvq0AOARoEGAWQDAzaBpAKATAAa6TsPxUSpZqkwHt9bmEPgLAOh1kPwnhQMmgUnKFJBufvSRAgCdCaoYPABIQl8V550uKZTwhWUOwOw7AQhdAMQPRADA/nEdQCeAgkANAa1UTYkFIUoiwC8AzN0AMP95BAizPyUAMAc4j+sATLZCgNAJ15X+XwuU8KmrNscpCBCS/DoA+CJPAo1VADAGloG/6UDIeUSAHgLQMxYJyPguyRQEiQDyPj4w+ZkHgG4AoD7wA1JABEDzeQBg0DDkgMmskYhAkQ2i7V4yG5ngAaADAHcDwIQpwACgTYBVa9S1OjWOgMkZCIEvCstve+AAlNcBtRQAAEi7Qad0HuCzcwYYAJCDiv+yykH4YEIUUAAQG2SD/zoA4QrANADoJsAKtrW85oVsKBkCKRMgcQD4978bADwXTBEg+j8A4FrZtsAqMvWRyhhQUdgFAAcAwKVg7TzQAKCTgQ3dcMqhynuWVk4dKP5rVwEQgBABeAUA0P8BwBoCcus217SWPIk7zmjw3gDMCACdCB0ASLIPlJAYOmG/GUM//uIzxX8NABdmj1NAFAWAAQCT/RJxAHCPGR3PACiThPgKAYA7wU0AjLkAkOoCwP8vA2AQUB+QCCAAoqTDxUhFeR6NdgLV28e7AwJwbROH/j8cgIFAczQigGUDdDMEwkC4SY6zthuAePewFxYABgAKAQ9mQSbg5gYJUoJ4kRIASBaywBgB3uDOQQOADj3EenlgtlFMJQYXl3v8bzJgXVQE4DUFgOT//gAMBHreWfm/1hE9LCoBcHQUTAVgPuJ9gyAA7AbAQGDFAJX/mFUAoPdJdBi0YwpIAKQ1AAWAAcC9CGwZQ3rZuKQOAtB+5r8OwAEA+Deh//cCMADYPFB8yl815YkhJwNA9lMC0A/A6e3lcwCwAwKbh+KNjBgBdNo0B2D5S3JrAIDd4L8TSwE3AvCfvTvsTRAGwgDMWLnkOBUCQ5j//4du7dK9CTTT1iZr473GxE/9co8nKSctAECV/0UHgL8FyF4AHSKo/4MAhvG9w2OiFUBhXeYAQO4MpGMQ6H7YbQPMF1wCKICi2gl6gBDJHoAcqh9Z/4aNvQZ0AFD/fwSgORaOMYEq5OqLbhA+IC+iAXgAn6UC0EAAiQgAiIQA4HTcR9emZRh/AGzFAlABNv7rbz96DE5CUv0BgE7t3OUGwE3mqADG+cqYHRUBgMj6A0Df2o3gW14AnJeAAmAOTA8TgvK7+kcAWPr1imvArADyIVABHBAAA7vDMZs4AIMDsGUG4NLkiQaTQgED+8Nxm1gAkwfwVioATQgAYpIBsJ0JnAGg2I0gzVFAev0RC2D4AACkfAAqwOzrH9912XwDqLYDqAAk9Xa0IXsvoOIOoAYYSQPQThYAGkDBADSMBAE0CQDGswdQVQdQAgEACavJabxefjeC7EsB1PXQMkZSVpO+9TuBKH4lAFRAYvkRBgC0gFcCoAOJ0q9T5ycCcSVYFwAlkL6QLOvZj4TW+BOgBp5cxdAwWQBWgHtvT+RWJQCVZITIiAgtGDVMyxd7d4yCQAyEYTSFzbDH8f53k6AwRALZUmfe18jW/yOFCxsA9J8ABIAAEAACQAAIAAEgAASAAIjvxxhtAiBm8f79PHbbH4CsDwAAtp9w7bE/AHni9wQAQMza7g9AZL0AAGB/AKLf/gDYHwD7AxBZv/0BOFzoF48aAACYM0asf/nduuB1lAiAufhyWddp+2L7A5Cz99ofgOze+GX3B2Ac18+uq978AIy7AK5a+wOQHQ7+2vMDsH53b5m+w/wAJIF911y/7PwAZHsCc/wG6wOwPwii7/heBo1fCwABIAAEgAAQAAJAAAgAASAABIAAEAACQAAIAAEgAASAABAAAkAACAABIAAEgAAQAAJAAAgAASAABIAAEAACQAAIAAEgAASAABAAAkAACAABIAAEgAAQAAJAAAgAASAAAHiOxuk5XjM1GcFgFJgCAJU/FGgcW25VAAAAAElFTkSuQmCC" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9986, "wrapS": 10497, "wrapT": 10497 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 76768, "byteLength": 25272, "target": 34963 }, { "buffer": 0, "byteOffset": 0, "byteLength": 57576, "byteStride": 12, "target": 34962 }, { "buffer": 0, "byteOffset": 57576, "byteLength": 19192, "byteStride": 8, "target": 34962 } ], "buffers": [ { "byteLength": 102040, "uri": "data:application/octet-stream;base64,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WwBcAFQAUwBdAF0AUwBeAF8AYABhAGEAYABiAGAAUwBiAGIAUwBVAFMAYABeAF4AYABjAGAAXwBjAGMAXwBkAGUAZgBkAGQAZgBjAGYAZwBjAGMAZwBeAGcAZgBoAGgAZgBpAGYAZQBpAGkAZQBqAGsAbABtAG0AbABuAG4AbABvAG8AbABwAGwAZQBwAHAAZQBkAGwAawBlAGUAawBqAHEAGAAjACMAGAAUABgAcQAZABkAcQByAHEAcwByAHIAcwB0AHMAcQAlACUAcQAjAHUAdgB3AHcAdgB4AHYAeQB4AHgAeQB6ACQAewAlACUAewB8AHsAfQB8AHwAfQB+AH0AewB/AH8AewCAAHsAJACAAIAAJAAmAHMAgQB0AHQAgQCCAIEAgwCCAIIAgwCEAIMAgQB+AH4AgQB8AIEAcwB8AHwAcwAlAIUAhgCHAIcAhgCIAHkAhQB6AHoAhQCHAIkAigCLAIsAigCMAI0AjgBNAE0AjgBMAI4AjwBMAEwAjwBBAJAAkQCSAJIAkQCTAJEAlACTAJMAlACVAJYAlwCYAJgAlwCZAJcAOwCZAJkAOwA9AJoAmwBJAEkAmwBHAJsAnABHAEcAnABIAJwAmwCWAJYAmwCXAJsAmgCXAJcAmgA7AEAAnQA9AD0AnQCZAJ0AngCZAJkAngCYAJ8AUgBGAEYAUgBFAEYASACfAJ8ASACgAKEAogBcAFwAogBaAKIAowBaAFoAowBZAKMAogCVAJUAogCTAKIAoQCTAJMAoQCSAKQApQCmAKYApQCnAKUAqACnAKcAqACpAKgApQBvAG8ApQBuAKUApABuAG4ApABtAKoAqwChAKEAqwCSAKwArQBoAGgArQBnAK0AXQBnAGcAXQBeAFsAqgBcAFwAqgChAHAArgBvAG8ArgCoAKgArgCpAKkArgCvAK4AXwCvAK8AXwBhAF8ArgBkAGQArgBwAJ4AsACYAJgAsACxALAAsgCxALEAsgCzALQAtQC2ALYAtQCgALUAtAC3ALcAtAC4ALQAuQC4ALgAuQC6ALkAtACWAJYAtAC2ALoAuQCzALMAuQCxALEAuQCYAJgAuQCWALUAuwCgAKAAuwCfALsAvACfAJ8AvABSALwAuwC9AL0AuwC+ALsAtQC+AL4AtQC3AL8AwAAPAA8AwAAOAMEAwgDDAMMAwgDEAMIAvwDEAMQAvwAPAMUAxgADAAMAxgACAMAAxwAOAA4AxwAbAMgAyQDEAMQAyQDDAMkAyADKAMoAyADLAMgACgDLAMsACgAMAAoAyAAPAA8AyADEAMYAzAACAAIAzAARAMwAzQARABEAzQAVAM4AzwDQANAAzwDRAM8A0gDRANEA0gDTANQA1QDWANYA1QDXANUA1ADYANgA1ADZANIA2gDTANMA2gDbANsA2gDcANwA2gDdAN4A3wDgAOAA3wDhAN8A1gDhAOEA1gDXAOIA4wDdAN0A4wDcAOMA4gDkAOQA4gDlAOYA5wDoAOgA5wDpAOcA3gDpAOkA3gDgAOoAmgDrAOsAmgBJAJoA6gA7ADsA6gA8AOoA7AA8ADwA7AA1AJwAtgBIAEgAtgCgALYAnACWAOwA7QA1ADUA7QA2AO0A7gA2ADYA7gAvAO4A7wAvAC8A7wAwADAA7wArACsA7wDwAPEAKgDwAPAAKgArACoA8QAfAB8A8QDyAPMA9ADLAMsA9ADKAPMAHQDyAPIAHQAfAB0A8wAMAAwA8wDLAM0A9QAVABUA9QAiAPUA9gAiACIA9gAmAPYA9wAmACYA9wCAAPcA+ACAAIAA+AB/APkA+gD7APsA+gD8APgA+QB/AH8A+QD7AP0A/gD6APoA/gD8AP4A/QD/AP8A/QCJAAABAQGGAIYAAQGIAAIBAwEAAQABAwEBAYsAjwCJAIkAjwD/AAQBQgCLAEIAQQCLAIsAQQCPAAUBBgH3APcABgH4AAcBCAEJAQkBCAEKAQsBBwEMAQwBBwEJAQ0BBQH2APYABQH3AA4BDwH5APkADwH6ABABEQESARIBEQETAQgBEAEKAQoBEAESAQYBDgH4APgADgH5APMAFAH0APQAFAEVARYBFwEYARgBFwEZARoBGwEcARwBGwEdARQB8wAeAR4B8wDyAB8BDQH1APUADQH2ACABCwEhASEBCwEMAfEAIgHyAPIAIgEeARwBHQEjASMBHQEkASMBJAElASUBJAEmASIB8QAnAScB8QDwAO8AKAHwAPAAKAEnASUBJgEpASkBJgEqASsBKQEsASwBKQEqAS0BKAHuAO4AKAHvAC4BLwHqAOoALwHsADABMQEyATIBMQEzATQBNQE2ATYBNQE3ATgBLgHrAOsALgHqADkBLQHtAO0ALQHuADoBKwE7ATsBKwEsATEBOgEzATMBOgE7AS8BOQHsAOwAOQHtAP0APAGJAIkAPAGKAD0BPgE/AT8BPgFAAT8BQAERAREBQAETATwB/QAPAQ8B/QD6AEEBQgE9AT0BQgE+AUMBRAFBAUEBRAFCAUUBRgF6AHoARgF4AHcAeABHAUcBeABGAUgBSQGIAIgASQGHAHoAhwBFAUUBhwBJAUoBzgBLAUsBzgDQANkATAHYANgATAFNAUcBTgF3AHcATgF1ANgATQHVANUATQFPAdUATwHXANcATwFQAdcAUAHhAOEAUAFRAeAA4QBSAVIB4QBRAVMBVAHoAOgAVAHmAOQA5QBVAVUB5QBWAVIBVwHgAOAAVwHpAOgA6QBTAVMB6QBXAVgBAQFZAVkBAQEDAUgBiABYAVgBiAABAVkBAwFaAVoBAwECAVoBAgFbAVsBAgFcAVwB5ABbAVsB5ABVAQABXQECAQIBXQFcAeMAXQHcANwAXQFeAV8BXgGFAIUAXgGGAF8BYAHbANsAYAHTAGEBYAF2AHYAYAF5AGEBYgHRANEAYgHQAGIBdQBjAWMBdQBOAWIBYwHQANAAYwFLAWQBIAFlAWUBIAEhAWYBZwEVARUBZwH0AGcBaAH0APQAaAHKAGkBaAHMAMwAaAHNAMkAaQHDAMMAaQFqAWsBagHFAMUAagHGABABCAFJAUkBCAFFAREBEAFIAUgBEAFJAQsBIAFHAUcBIAFOAQgBBwFFAUUBBwFGAQcBCwFGAUYBCwFHAVgBPwFIAUgBPwERAT8BWAE9AT0BWAFZASABZAFOAU4BZAFjARcBFgFlAWUBFgFkAU8BIwFQAVABIwElASMBTwEcARwBTwFNARgBSgEWARYBSgFLAUwBGgFNAU0BGgEcASkBUQElASUBUQFQASkBKwFRAVEBKwFSASsBOgFSAVIBOgFXAToBMQFXAVcBMQFTAUMBNAFEAUQBNAE2ATQBQwFVAVUBQwFbATEBMAFTAVMBMAFUATUBNAFWAVYBNAFVAVoBQQFZAVkBQQE9ARoAbAEcABwAbAFtAWwBGgBuAW4BGgAbACcAbwEoACgAbwFwAW8BJwBtAW0BJwAcAC0AcQEuAC4AcQFyAXEBLQBwAXABLQAoAHMBdAEzADMAdAE0AHIBcwEuAC4AcwEzAHUBdgE5ADkAdgE6AHQBdQE0ADQAdQE5AHcBeAE/AD8AeAFAAHYBdwE6ADoAdwE/AHkBegGdAJ0AegGeAJ0AQAB5AXkBQAB4AXsBfAGwALAAfAGyALAAngB7AXsBngB6AccAfQEbABsAfQFuAX4BUAC8ALwAUABSAFAAfgFRAFEAfgF/AX4BgAF/AX8BgAGBAX4BvACAAYABvAC9AIIBgwG9AL0AgwGAAYMBhAGAAYABhAGBAYQBgwGFAYUBgwGGAYMBggGGAYYBggGHAYgBiQG3ALcAiQG+AIkBggG+AL4AggG9AIIBiQGHAYcBiQGKAYkBiAGKAYoBiAGLAYwBiAG4ALgAiAG3AIgBjAGLAYsBjAGNAY0BjAGOAY4BjAGPAYwBuACPAY8BuAC6AI4BjwGQAZABjwGRAY8BugCRAZEBugCzALIAkgGzALMAkgGRAZEBkgGQAZABkgGTAXwBlAGyALIAlAGSAZQBlQGSAZIBlQGTAYsAjAAEAQQBjACWAQQB6wBCAEIA6wBJAJYBOAEEAQQBOAHrAGoBawHDAMMAawHBAGoBaQHGAMYAaQHMAMoAaAHJAMkAaAFpAWgBZwHNAM0AZwH1APUAZwEfAR8BZwFmAWMBZAFLAUsBZAEWAWIBYQF1AHUAYQF2AGABYQHTANMAYQHRAGABXwF5AHkAXwGFANwAXgHbANsAXgFfAYYAXgEAAQABXgFdAeQAXAHjAOMAXAFdAVsBQwFaAVoBQwFBAQgACQCXAZcBCQCYAQkAFwCYAZgBFwCZARcAGQCZAZkBGQCaAWwBmwFtAW0BmwGcAW4BnQFsAWwBnQGbAW8BngFwAXABngGfAW8BbQGeAZ4BbQGcAXEBoAFyAXIBoAGhAXABnwFxAXEBnwGgAXMBogF0AXQBogGjAXIBoQFzAXMBoQGiAXUBpAF2AXYBpAGlAXQBowF1AXUBowGkAXgBdwGmAaYBdwGnAXYBpQF3AXcBpQGnAagBqQGqAaoBqQGrAawBrQGoAagBrQGpAa4BrwGsAawBrwGtAVUAVgCwAbABVgCxAbIBswG0AbQBswG1AWEAYgC2AbYBYgC3AWIAVQC3AbcBVQCwARkAcgCaAZoBcgC4AbkBugG7AbsBugG8Ab0BvgG/Ab8BvgHAAaoBqwHBAcEBqwHCAXkBwwF6AXoBwwHEAXgBpgF5AXkBpgHDAcUBxgG1AbUBxgG0Ab8BwAHFAcUBwAHGAaYApwDHAccBpwDIAacAqQDIAcgBqQDJAakArwDJAckBrwDKAa8AYQDKAcoBYQC2AXsBywF8AXwBywHMAXoBxAF7AXsBxAHLAc0BzgGuAa4BzgGvAc8B0AHNAc0B0AHOAX0B0QFuAW4B0QGdAdIB0wHPAc8B0wHQAdQB1QHSAdIB1QHTAZUBlAHWAdYBlAHXAZQBfAHXAdcBfAHMAdgB2QHaAdoB2QHbAdwB2AHdAd0B2AHaAd4B3AHfAd8B3AHdAeAB3gHhAeEB3gHfAeIB4wHkAeQB4wHlAeMB5gHlAeUB5gHnAdkB2AHoAegB2AHpAdgB3AHpAekB3AHqAesB7AHqAeoB7AHpAewB7QHpAekB7QHoAdwB3gHqAeoB3gHuAd4B4AHuAe4B4AHvAfAB8QHvAe8B8QHuAfEB6wHuAe4B6wHqAeYB4wHyAfIB4wHzAeMB4gHzAfMB4gH0AfUB9gH3AfcB9gH4AfYB4gH4AfgB4gHkAe0B7AH5AfkB7AH6AewB6wH6AfoB6wH7AfwB/QH7AfsB/QH6Af0B/gH6AfoB/gH5AeIB9gH0AfQB9gH/AfYB9QH/Af8B9QEAAgEC9QECAgIC9QH3AQMCAQIEAgQCAQICAvUBAQIAAgACAQIFAgECAwIFAgUCAwIGAgcCCAIJAgkCCAIKAgoCAwIJAgkCAwIEAgMCCgIGAgYCCgILAggCDAIKAgoCDAILAg0CDgIPAg8CDgIQAggCBwIQAhACBwIPAgwCCAIRAhECCAIQAg4CEgIQAhACEgIRAhMCFAIVAhUCFAIWAg4CDQIWAhYCDQIVAhICDgIXAhcCDgIWAhQCGAIWAhYCGAIXAhkCGgIbAhsCGgIcAhoCHQIcAhwCHQIeAh8CIAIeAh4CIAIcAiACIQIcAhwCIQIbAiICIwIkAiQCIwIlAiMCJgIlAiUCJgInAh0CGgInAicCGgIlAhoCGQIlAiUCGQIkAicCJgIoAigCJgIpAicCKAIdAh0CKAIqAisCLAItAi0CLAIuAi8CMAIxAjECMAIyAjMCNAIyAjICNAIxAjUCKwI2AjYCKwItAjcCOAI5AjkCOAI6AiwCKwI6AjoCKwI5AisCNQI5AjkCNQI7AjwCNwI7AjsCNwI5Aj0CPAI+Aj4CPAI7AjUCPwI7AjsCPwI+Aj8CQAI+Aj4CQAJBAkICPQJBAkECPQI+AkMCRAJFAkUCRAJGAkYCRwJFAkUCRwJIAjwCPQJIAkgCPQJFAkICQwI9Aj0CQwJFAusB8QH7AfsB8QFJAvEB8AFJAkkC8AFKAksCTAJKAkoCTAJJAkwC/AFJAkkC/AH7AU0CTgJPAk8CTgJQAlECUgJQAlACUgJPAv0B/AFTAlMC/AFUAlUCVgJUAlQCVgJTAlYCVwJTAlMCVwJYAv4B/QFYAlgC/QFTAkwCSwJZAlkCSwJaAlsCXAJaAloCXAJZAlwCVQJZAlkCVQJUAvwBTAJUAlQCTAJZAl0CXgJfAl8CXgJgAlICUQJgAmACUQJfAmECYgJjAmMCYgJkAmUCIgJmAmYCIgIkAhkCZwIkAiQCZwJmAmgCaQJqAmoCaQJrAmwCbQJrAmsCbQJqAm4CbwJwAnACbwJxAhQCEwJxAnECEwJwAnICIQJzAnMCIQIgAh8CdAIgAiACdAJzAnQCbgJzAnMCbgJwAhMCcgJwAnACcgJzAhgCFAJ1AnUCFAJxAm8CdgJxAnECdgJ1AncCHgIqAioCHgIdAngCHwJ3AncCHwIeAnkCMwJ6AnoCMwIyAjACewIyAjICewJ6AnsCbAJ6AnoCbAJrAmkCeQJrAmsCeQJ6AnwCfQJ+An4CfQJ/AoACgQJ/An8CgQJ+AoECRwJ+An4CRwJGAkQCfAJGAkYCfAJ+AnkCaQKCAoICaQKDAkACPwKEAoQCPwKFAjUCNgI/Aj8CNgKFAjQCMwKCAoICMwJ5AkcCgQJIAkgCgQKGAoECgAKGAoYCgAKHAjgCNwKHAocCNwKGAjcCPAKGAoYCPAJIAnYCbwKIAogCbwKJAooCiwKJAokCiwKIAngCjAKNAo0CjAKOAowCjwKOAo4CjwKQApACkQKOAo4CkQKSApICbgKOAo4CbgKNApECigKSApICigKJAm8CbgKJAokCbgKSAowCeAKTApMCeAJ3AioClAJ3AncClAKTApQClQKTApMClQKWAo8CjAKWApYCjAKTAuYBlwLnAecBlwKYApkCmgKbApsCmgKcAucBmAKcApwCmAKbAtkBnQLbAdsBnQKeApcC5gGfAp8C5gHyAZoCoAKcApwCoAKhAqACogKhAqECogKjAuQB5QGjAqMC5QGhAuUB5wGhAqEC5wGcAp0C2QGkAqQC2QHoAe0BpQLoAegBpQKkAqYCpwKoAqgCpwKpAqoCqwKpAqkCqwKoAqwCrQKuAq4CrQKvAq0CsAKvAq8CsAKxAqsCqgKyArICqgKzArQCtQKzArMCtQKyArYCtwK4ArgCtwK5ArkCrAK4ArgCrAKuArUCtAK6AroCtAK7ArsCvAK6AroCvAK9Ar4CvwLAAsACvwLBArcCtgLBAsECtgLAAiECcgLCAsICcgLDAnICEwLDAsMCEwIVAg0CxAIVAhUCxALDAh8CeAJ0AnQCeAKNAo0CbgJ0AsQCDQLFAsUCDQIPAgcCxgIPAg8CxgLFAsYCBwLHAscCBwIJAgkCBALHAscCBALIAgQCAgLIAsgCAgLJAgIC9wHJAskC9wHKAqICywKjAqMCywLMAvcB+AHKAsoC+AHMAvgB5AHMAswC5AGjAqUC7QHNAs0C7QH5Af4BzgL5AfkBzgLNAs4C/gHPAs8C/gFYAlcC0AJYAlgC0ALPAtEC0gLTAtMC0gLUAtACVwLUAtQCVwLTAtEC1QLSAtIC1QLWAtUC1wLWAtYC1wJkAl0C2AJeAl4C2ALZAtoC2QLbAtsC2QLYAtcCZwJkAmQCZwJjAtwCYwIbAmMCZwIbAmcCGQIbAtAC3QLPAs8C3QLeAt8C4ALhAuEC4ALiAuMC5ALfAt8C5ALgAuUCzgLeAt4CzgLPAtIC5gLUAtQC5gLnAugC6QLqAuoC6QLrAuEC4gLoAugC4gLpAt0C0ALnAucC0ALUAswCywLsAuwCywLtAu4C7wLwAvAC7wLxAvIC8wL0AvQC8wL1AsoCzAL2AvYCzALsAs4C5QLNAs0C5QL3AvgC+QLjAuMC+QLkAskCygL6AvoCygL2AvMC+wL1AvUC+wL8AvsC/QL8AvwC/QL+AsgCyQL/Av8CyQL6AscCyAIAAwADyAL/Av0CAQP+Av4CAQMCAwMDBAMBAwEDBAMCAwUDxgIAAwADxgLHAsQCBgPDAsMCBgMHAwgDCQMKAwoDCQMLAwwDDQMOAw4DDQMPAxADwgIHAwcDwgLDAsYCBQPFAsUCBQMRAxIDEwMDAwMDEwMEAwoDCwMSAxIDCwMTAwYDxAIRAxEDxALFAtYCZAIUAxQDZAJiAhUDFgMXAxcDFgMYAxYD6gIYAxgD6gLrAtIC1gLmAuYC1gIUAxkDFQMaAxoDFQMXAxsDGQMcAxwDGQMaAx0DUQIeAx4DUQJQAh4DUAIfAx8DUAJOAiADXQIhAyEDXQJfAiEDXwIdAx0DXwJRAiIDIwOmAqYCIwOnArECsAIkAyQDsAIlAx8DTgImAyYDTgJNAicDJQOtAq0CJQOwAq0CrAInAycDrAIoAykDKAO5ArkCKAOsAikDuQIqAyoDuQK3AisDvwIsAywDvwK+Ai0DvQIuAy4DvQK8AioDtwIvAy8DtwLBAi8DwQIrAysDwQK/AjADMQPYAtgCMQPbAtgCXQIwAzADXQIgAzEDMgPbAtsCMgPaAjIDMwPaAtoCMwM0Ay4DvAIzAzMDvAI0A9kC2gI1AzUD2gI0A7QCNgO7ArsCNgM1A14CNgNgAmACNgM3A6oCOAOzArMCOAM3A1ICOANPAk8COAM5A6cCOgOpAqkCOgM5AyYDTQI7AzsDTQI6AyMDOwOnAqcCOwM6A/kC+AI8AzwD+AI9A8sCPgPtAu0CPgM/A6ICQAPLAssCQAM+A6UCQAOkAqQCQANBA6ACmgJBA0EDmgJCA50CQgOeAp4CQgNDAx0D4QIhAyED4QLoAuoCIAPoAugCIAMhA+MCHwP4AvgCHwMmA+ECHQPfAt8CHQMeAx8D4wIeAx4D4wLfAjADIAMWAxYDIAPqAjEDMAMVAxUDMAMWA/gCJgM9Az0DJgM7Az0D7gI8AzwD7gLwAicDKAP7AvsCKAP9AiUDJwPzAvMCJwP7AiMDIgPuAu4CIgPvAiQDJQPyAvICJQPzAigDKQP9Av0CKQMBAyoDAwMpAykDAwMBAwMDKgMSAxIDKgMvAysDCgMvAy8DCgMSAxsDHAMMAwwDHAMNAwwDLgMbAxsDLgMzAwoDKwMIAwgDKwMsAy4DDAMtAy0DDAMOAzIDMQMZAxkDMQMVA0QD4AFFA0UD4AHhAeABRAPvAe8BRANGA0cD8AFGA0YD8AHvAfMB9AGbAZsB9AGcAfIB8wGdAZ0B8wGbAf8BAAKeAZ4BAAKfAfQB/wGcAZwB/wGeAQYCoQEFAgUCoQGgAQACBQKfAZ8BBQKgAQwCowELAgsCowGiAaEBBgKiAaIBBgILAhICpQERAhECpQGkAaMBDAKkAaQBDAIRAhgCpgEXAhcCpgGnAaUBEgKnAacBEgIXAiMCIgKpAakBIgKrASYCIwKtAa0BIwKpASYCrQEpAikCrQGvASwCSAMuAi4CSANJA7QBMAKyAbIBMAIvAjgCSgM6AjoCSgNLA0gDLAJLA0sDLAI6AvABRwNKAkoCRwNMA7kBSwJMA0wDSwJKAksCuQFaAloCuQG7AU0DWwK7AbsBWwJaAmwCwAFtAm0CwAG+AasBIgLCAcIBIgJlAnYCxAF1AnUCxAHDAXUCwwEYAhgCwwGmAXsCMALGAcYBMAK0AWwCewLAAcABewLGAX0CTgN/An8CTgNPA1ADgAJPA08DgAJ/AoACUAOHAocCUANRA0oDOAJRA1EDOAKHAosCzAGIAogCzAHLAYgCywF2AnYCywHEASkCrwFSA1IDrwHOAdABUwPOAc4BUwNSA58C8gHRAdEB8gGdASoCKAKUApQCKAJUAygCKQJUA1QDKQJSA1MDVQNSA1IDVQNUA1UDlQJUA1QDlQKUAlMD0AFWA1YD0AHTAVcDVgPVAdUBVgPTAZUCVQNYA1gDVQNZA1UDUwNZA1kDUwNWA1cDWgNWA1YDWgNZA1sDWANaA1oDWANZA1wDjwJdA10DjwKWApYClQJdA10DlQJYA1sDXgNYA1gDXgNdA14DXwNdA10DXwNcA5ACjwJgA2ADjwJcA18DYQNcA1wDYQNgA2EDYgNgA2ADYgNjA5ECkAJjA2MDkAJgA2IDZANjA2MDZANlA4oCkQJlA2UDkQJjA4sCigJmA2YDigJlA2QDZwNlA2UDZwNmA8wBiwLXAdcBiwJmA2cD1gFmA2YD1gHXAWgDaQNqA2oDaQNrA2wDbQNoA2gDbQNpA24DbwNsA2wDbwNtA3ADcQNuA24DcQNvA3IDcwNwA3ADcwNxA3QDdQNyA3IDdQNzA3YDdwN0A3QDdwN1A3gDeQN2A3YDeQN3A3gDegN5A3kDegN7A3oDfAN7A3sDfAN9A34DfwN8A3wDfwN9A4ADgQN+A34DgQN/A4IDgwOEA4QDgwOFA2kDhgNrA2sDhgOHA20DiANpA2kDiAOGA28DiQNtA20DiQOIA3EDigNvA28DigOJA3MDiwNxA3EDiwOKA3UDjANzA3MDjAOLA3cDjQN1A3UDjQOMA3kDjgN3A3cDjgONA3kDewOOA44DewOPA3sDfQOPA48DfQOQA38DkQN9A30DkQOQA5IDgQOTA5MDgQOFA4YDlAOHA4cDlAOVA4gDlgOGA4YDlgOUA4kDlwOIA4gDlwOWA4oDmAOJA4kDmAOXA4sDmQOKA4oDmQOYA4wDmgOLA4sDmgOZA40DmwOMA4wDmwOaA44DnAONA40DnAObA44DjwOcA5wDjwOdA5ADngOPA48DngOdA5EDnwOQA5ADnwOeA6ADkgOhA6EDkgOTA5UDlAOiA6IDlAOjA5YDpAOUA5QDpAOjA5cDpQOWA5YDpQOkA5gDpgOXA5cDpgOlA5kDpwOYA5gDpwOmA5oDqAOZA5kDqAOnA5sDqQOaA5oDqQOoA5wDqgObA5sDqgOpA5wDnQOqA6oDnQOrA54DrAOdA50DrAOrA58DrQOeA54DrQOsA64DoAOvA68DoAOhA6IDowOwA7ADowOxA6QDsgOjA6MDsgOxA6UDswOkA6QDswOyA6YDtAOlA6UDtAOzA6cDtQOmA6YDtQO0A6gDtgOnA6cDtgO1A6kDtwOoA6gDtwO2A6oDuAOpA6kDuAO3A6oDqwO4A7gDqwO5A6wDugOrA6sDugO5A60DuwOsA6wDuwO6A7wDrgO9A70DrgOvA7ADsQO+A74DsQO/A7IDwAOxA7EDwAO/A7MDwQOyA7IDwQPAA7QDwgOzA7MDwgPBA7UDwwO0A7QDwwPCA7YDxAO1A7UDxAPDA7cDxQO2A7YDxQPEA7gDxgO3A7cDxgPFA7gDuQPGA8YDuQPHA7kDugPHA8cDugPIA7sDyQO6A7oDyQPIA4cBvAOGAYYBvAO9A74DvwPKA8oDvwPLA8ADzAO/A78DzAPLA8EDzQPAA8ADzQPMA8IDzgPBA8EDzgPNA8MDzwPCA8IDzwPOA8QD0APDA8MD0APPA8UD0QPEA8QD0QPQA8YD0gPFA8UD0gPRA8YDxwPSA9IDxwPTA8cDyAPTA9MDyAPUA8kD1QPIA8gD1QPUA8oDywPWA9YDywPXA8wD2APLA8sD2APXA80D2QPMA8wD2QPYA84D2gPNA80D2gPZA88D2wPOA84D2wPaA9AD3APPA88D3APbA9ED3QPQA9AD3QPcA9ID3gPRA9ED3gPdA9ID0wPeA94D0wPfA9MD1APfA98D1APgA9UD4QPUA9QD4QPgA9YD1wPiA+ID1wPjA9gD5APXA9cD5APjA9kD5QPYA9gD5QPkA9oD5gPZA9kD5gPlA9sD5wPaA9oD5wPmA9wD6APbA9sD6APnA90D6QPcA9wD6QPoA94D6gPdA90D6gPpA94D3wPqA+oD3wPrA98D4APrA+sD4APsA+ED7QPgA+AD7QPsA+ID4wPuA+4D4wPvA+QD8APjA+MD8APvA+UD8QPkA+QD8QPwA+YD8gPlA+UD8gPxA+cD8wPmA+YD8wPyA+gD9APnA+cD9APzA+kD9QPoA+gD9QP0A+kD6gP1A/UD6gP2A+oD6wP2A/YD6wP3A+sD7AP3A/cD7AP4A+wD7QP4A/gD7QP5A+4D7wP6A/oD7wP7A/AD/APvA+8D/AP7A/ED/QPwA/AD/QP8A/ID/gPxA/ED/gP9A/MD/wPyA/ID/wP+A/QDAATzA/MDAAT/A/UDAQT0A/QDAQQABPUD9gMBBAEE9gMCBPYD9wMCBAIE9wMDBPgDBAT3A/cDBAQDBPgD+QMEBAQE+QMFBPoD+wMGBAYE+wMHBPsD/AMHBAcE/AMIBPwD/QMIBAgE/QMJBP0D/gMJBAkE/gMKBP8DCwT+A/4DCwQKBAAEDAT/A/8DDAQLBAEEDQQABAAEDQQMBAEEAgQNBA0EAgQOBAMEDwQCBAIEDwQOBAQEEAQDBAMEEAQPBAUEEQQEBAQEEQQQBAYEBwQSBBIEBwQTBAcECAQTBBMECAQUBAgECQQUBBQECQQVBAwEDQQWBA4EFwQNBA0EFwQWBA8EGAQOBA4EGAQXBBAEGQQPBA8EGQQYBBEEGgQQBBAEGgQZBBIEEwQbBBsEEwQcBBMEFAQcBBwEFAQdBBsEHAQeBB4EHAQfBB0EIAQcBBwEIAQfBCEEIgQYBBgEIgQXBBkEIwQYBBgEIwQhBBoEJAQZBBkEJAQjBB4EHwQlBCUEHwQmBCAEJwQfBB8EJwQmBCgEIgQpBCkEIgQhBCEEIwQpBCkEIwQqBCQEKwQjBCMEKwQqBCUEJgQsBCwEJgQtBCYEJwQtBC0EJwQuBC8EMAQpBCkEMAQoBCkEKgQvBC8EKgQxBCsEMgQqBCoEMgQxBCwELQQzBDMELQQ0BC0ELgQ0BDQELgQ1BDAELwQ2BDYELwQ3BC8EMQQ3BDcEMQQ4BDEEMgQ4BDgEMgQ5BDIEOgQ5BDkEOgQ7BDwEOgQ9BD0EOgQ+BDMENAQ/BD8ENARABDQENQRABEAENQRBBEIEQwREBEQEQwRFBGgDagNGBGwDaANGBG4DbANGBHADbgNGBHIDcANGBHQDcgNGBHYDdANGBHgDdgNGBHoDeANGBHwDegNGBH4DfANGBH4DRgSAA4IDhANGBEcESARJBEkESARKBEkESwRHBEcESwRMBE0ETgRJBEkETgRLBEkESgRNBE0ESgRPBFAEUQRSBFIEUQRTBFIEVARQBFAEVARVBEcETARSBFIETARUBFIEUwRHBEcEUwRIBFYEVwRYBFgEVwRZBFgEWgRWBFYEWgRbBFAEVQRYBFgEVQRaBFgEWQRQBFAEWQRRBFwEXQReBF4EXQRfBF8EYAReBF4EYARhBFYEWwRfBF8EWwRgBF8EXQRWBFYEXQRXBGIEYwRkBGQEYwRlBGEEYgReBF4EYgRkBGQEZQRmBGYEZQRnBGgEaQRqBGoEaQRrBGwEbQRrBGsEbQRqBGMEbARlBGUEbARrBGkEZwRrBGsEZwRlBG4EbwRwBHAEbwRxBHIEcwRxBHEEcwRwBG0EcgRqBGoEcgRxBG8EaARxBHEEaARqBHQEdQR2BHYEdQR3BHgEeQR3BHcEeQR2BHMEeARwBHAEeAR3BHUEbgR3BHcEbgRwBHoEewR8BHwEewR9BH4EfwR9BH0EfwR8BHkEfgR2BHYEfgR9BHsEdAR9BH0EdAR2BE0ETwSABIAETwSBBIAEggRNBE0EggROBHwEfwSABIAEfwSCBIAEgQR8BHwEgQR6BHUEdARKBEoEdARPBIMEhASFBIUEhASGBIcEiASJBIkEiASGBIoEiwSMBIwEiwSNBI4EjwSQBJAEjwSNBJEEkgSQBJAEkgSTBJQElQSFBIUElQSTBJYElwSYBJgElwSJBJkEmgSbBJsEmgSXBJwEnQSbBJsEnQSeBJ8EngSgBKAEngShBKIEowSkBKQEowSlBKYEowSnBKcEowShBKgEqQSqBKoEqQSlBKsEqQSsBKwEqQStBK4ErwSwBLAErwStBLEErwSyBLIErwSzBLQEtQS2BLYEtQSzBLcEtQS4BLgEtQS5BLoEuwS8BLwEuwS5BL0EuwS+BL4EuwSMBFoEvwRbBFsEvwTABMEEWgTCBMIEWgRVBEsEwwRMBEwEwwTEBMUESwTGBMYESwROBFQExwRVBFUExwTIBMkEVATKBMoEVARMBGAEywRhBGEEywTMBM0EYATOBM4EYARbBIIEzwROBE4EzwTQBNEEggTSBNIEggR/BGMEYgTTBNMEYgTUBGIEYQTVBNUEYQTWBH8EfgTXBNcEfgTYBH4EeQTZBNkEeQTaBG0EbATbBNsEbATcBGwEYwTdBN0EYwTeBHkEeATfBN8EeATgBHgEcwThBOEEcwTiBHMEcgTjBOMEcgTkBHIEbQTlBOUEbQTmBOcEmgToBOgEmgSZBJoE6QSHBIcE6QTqBOsElQTsBOwElQSUBI4ElQTtBO0ElQTuBIcE7wSIBIgE7wTwBPEElATyBPIElASIBPMEnwT0BPQEnwSgBPUEmQT2BPYEmQSfBPcE+ASOBI4E+ASPBL4EjwT5BPkEjwT6BPsEogT8BPwEogSkBP0EoAT+BP4EoASiBP8EAAW+BL4EAAW9BLgEvQQBBQEFvQQCBQMFqwQEBQQFqwSsBAUFpAQGBQYFpASrBAcFCAW4BLgECAW3BLIEtwQJBQkFtwQKBbIECwWxBLEECwUMBQ0FrAQOBQ4FrASxBKYEDwWqBKoEDwUQBaYEpwQPBQ8FpwQRBagEEgWwBLAEEgUTBRIFqAQQBRAFqASqBJgEhAQUBRQFhAQVBYQEgwQVBRUFgwQWBbQEFwW8BLwEFwUYBRcFtAQZBRkFtAS2BJEEiwQaBRoFiwQbBRsFiwQcBRwFiwSKBIMEkgQWBRYFkgQdBZIEkQQdBR0FkQQaBZwElgQeBR4FlgQfBZYEmAQfBR8FmAQUBacEnQQRBREFnQQgBZ0EnAQgBSAFnAQeBa4EIQW2BLYEIQUZBSEFrgQTBRMFrgSwBLoEIgWKBIoEIgUcBSIFugQYBRgFugS8BCMFJAUPBQ8FJAUQBSUFIwURBREFIwUPBRIFJgUTBRMFJgUnBSYFEgUkBSQFEgUQBSgFKQUVBRUFKQUUBSoFKAUWBRYFKAUVBRcFKwUYBRgFKwUsBSsFFwUtBS0FFwUZBRsFLgUaBRoFLgUvBS4FGwUwBTAFGwUcBTEFKgUdBR0FKgUWBS8FMQUaBRoFMQUdBTIFMwUfBR8FMwUeBSkFMgUUBRQFMgUfBTQFJQUgBSAFJQURBTMFNAUeBR4FNAUgBSEFNQUZBRkFNQUtBTUFIQUnBScFIQUTBSIFNgUcBRwFNgUwBTYFIgUsBSwFIgUYBXsEegR0BHQEegRPBHoEgQRPBEgEUwRuBG4EUwRvBEoESAR1BHUESARuBFMEUQRvBG8EUQRoBF0EXARXBGcEVwRmBFcEXARmBFkEaQRRBFEEaQRoBGYEXARkBGQEXAReBFcEZwRZBFkEZwRpBCQFIwU3BTcFIwU4BSMFJQU4BTgFJQU2BCYFOQUnBScFOQU6BSgFFgQpBSkFFgQXBCgFKgUWBBYEKgUMBCsFLgQsBSwFLgQnBC0FNQQrBSsFNQQuBC8FLgUKBAoELgUVBC4FMAUVBBUEMAUdBDEFCwQqBSoFCwQMBDEFLwULBAsELwUKBDMFMgUoBCgEMgUiBDIFKQUiBCIEKQUXBDQFMwUwBDAEMwUoBC0FNQU1BDUENQVBBCcFOgU1BTUFOgVBBDAFNgUdBB0ENgUgBDYFLAUgBCAELAUnBCQFNwUmBSYFNwU5BR0EFAQVBBUECQQKBDQFMAQlBSUFMAQ2BDsFPAU9BTwFPgU/BT8FPgU9BUAFQQVCBUIFQQVDBUEFQAVEBUQFQAVFBUYFRwVABUAFRwVFBUgFSQVKBUoFSQVGBUYFQAVKBUoFQAVCBUsFTAVNBU0FTAVOBU8FTgVQBVAFTgVMBVEFUgVTBVMFUgVUBVUFVAVWBVYFVAVXBUwFWAVZBVkFWAVaBVgFWwVcBVwFWwVdBVsFWAVeBV4FWAVfBVgFTAVfBV8FTAVLBWAFYQViBWIFYQVjBU0FYwVLBUsFYwVhBWQFZQVmBWYFZQVnBWUFaAVnBWcFaAVpBWgFZQVqBWoFZQVrBWsFZQVkBWwFbQVTBVMFbQVuBW0FbAVvBW8FbAVwBWwFcQVwBXAFcQVyBXEFcwVyBXIFcwV0BXMFcQVVBVUFcQVUBXEFbAVUBVQFbAVTBXUFdgV3BXcFdgV4BXgFdgVgBWAFdgVhBXYFXwVhBWEFXwVLBXYFdQVfBV8FdQVeBWkFaAV5BXkFaAV6BXoFaAV7BXwFfQV+BX4FfQV/BX0FfAWABYAFfAWBBYIFgwWEBYQFgwWFBYUFgwWGBYYFgwWHBYMFfQWHBYcFfQWABYMFggV9BX0FggV/BYgFiQWKBYoFiQWLBYkFjAWLBYsFjAWNBY4FjwWQBZAFjwWRBY4FPAWPBY8FPAU7BZIFkwWQBZAFkwWOBY4FlAU8BTwFlAU+BZQFjgWVBZUFjgWTBZYFlwWYBZgFlwWZBZcFQQWZBZkFQQVEBUEFlwVDBUMFlwWaBZcFlgWaBZoFlgWbBWIFnAVgBWAFnAWdBZ4FnQWfBZ8FnQWcBaAFoQWiBaIFoQWjBaEFpAWjBaMFpAWlBaQFoQWRBZEFoQWQBaYFoAWnBacFoAWiBZMFkgWoBakFqAWSBakFpgV5BXkFpgWqBaYFpwWqBaoFpwWrBawFpAWtBa0FpAWRBaQFrAWlBaUFrAWuBawFrwWuBa4FrwWwBa8FrAWxBbEFrAWtBbIFswW0BbQFswW1BbYFtQW3BbcFtQWzBbgFuQW6BboFuQW7BbkFvAW7BbsFvAW9BbwFuQW+Bb4FuQW/BbkFuAW/Bb8FuAXABcEFwgXDBcMFwgXEBcIFxQXEBcQFxQWNBcIFuAXFBcUFuAW6BbgFwgXABcAFwgXBBcYFxwXIBcgFxwXJBccFygXJBckFygXLBcoFxwW2BbYFxwW1BccFxgW1BbUFxgW0BcwFvAXNBc0FvAW+BbwFzAW9Bb0FzAXOBcwFzwXOBc4FzwXQBc8FzAXRBdEFzAXNBbcF0gW2BbYF0gXKBdMFywXSBdIFywXKBdQF1QXWBdYF1QXXBdUF1AXQBdAF1AXOBc4F1AW9Bb0F1AW7BdQF1gW7BbsF1gW6BdgF2QVwBXAF2QVvBdkF2AXaBdoF2AXbBdwF3QXeBd4F3QXfBZMF4AWVBZUF4AXhBeIF4wXkBeQF4wXhBdgF5QXbBdsF5QXmBeUF5wXmBeYF5wXoBecF5QV0BXQF5QVyBeUF2AVyBXIF2AVwBekFlgXjBeMFlgWYBZYF6QWbBZsF6QXqBekF6wXqBeoF6wXsBesF6QXiBeIF6QXjBe0F7gXbBdsF7gXaBd0F7wXfBd8F7wXwBfEF4gXyBfIF4gXkBfMF9AXoBegF9AXmBfQF7QXmBeYF7QXbBesF9QXsBewF9QX2BfUF6wXxBfEF6wXiBe8FfAXwBfAFfAV+BYYFhwXzBfMFhwX0BYcFgAX0BfQFgAXtBfcF+AX5BfkF+AX6BfgF9wWeBZ4F9wWdBfcFeAWdBZ0FeAVgBXgF9wV3BXcF9wX5BfsF/AWwBbAF/AWuBfwF/QWuBa4F/QWlBf0F/AW+Bb4F/AXNBfwF+wXNBc0F+wXRBf4F/wXDBcMF/wUABv8FAQYABgAGAQarBZ8FAgaeBZ4FAgYDBrQFAwayBbIFAwYCBgQGBQbABcAFBQa/BQUG/QW/Bb8F/QW+Bf0FBQalBaUFBQajBQUGBAajBaMFBAaiBdMF0gWIBYgF0gWJBdIFtwWJBYkFtwWMBbcFswWMBYwFswUGBrMFsgUGBgYGsgX+BZ8FnAUBBgEGnAUHBpwFYgUHBgcGYgVpBWIFYwVpBWkFYwVnBWMFTQVnBWcFTQVmBQgGZAUJBgkGZAVmBQoGagVrBdwF2QXdBd0F2QXaBe4F7wXaBdoF7wXdBYEFfAXuBe4FfAXvBQsGWwUMBgwGWwUNBg0GWwUOBg4GWwVeBXUFDwZeBV4FDwYOBg8GdQUQBhAGdQV3BfkFEQZ3BXcFEQYQBvkF+gURBhEG+gUSBvoFEwYSBhIGEwYUBhMGyAUUBhQGyAUVBsgFyQUVBhUGyQUWBskFywUWBhYGywUXBssF0wUXBhcG0wUYBtMFiAUYBhgGiAUZBhoGGwaKBYoFGwYcBhsGGgYdBh0GGgbXBR4G1QUfBh8G1QXQBdUFHgbXBdcFHgYdBs8FIAbQBdAFIAYfBiAGzwUhBiEGzwXRBSIG+wUjBiMG+wWwBfsFIgbRBdEFIgYhBq8FJAawBbAFJAYjBiQGrwUlBiUGrwWxBUkFSAWxBbEFSAUlBoIFJgZ/BX8FJgYnBiYG9QUnBicG9QXxBfUFJgb2BfYFJgYoBiYGggUoBigGggWEBRkGiAUcBhwGiAWKBSkGqAXeBd4FqAUqBqgFKQaTBZMFKQbgBSkGKwbgBeAFKwYsBisGKQbfBd8FKQbeBQEGBwarBasFBwaqBaoFBwZ5BXkFBwZpBS0GKwbwBfAFKwbfBSsGLQYsBiwGLQYuBgQGLwaiBaIFLwanBacFLwarBasFLwYABi8GwQUABgAGwQXDBS8GBAbBBcEFBAbABTAGLQZ+BX4FLQbwBS0GMAYuBi4GMAbyBYwFBgaNBY0FBgbEBQYG/gXEBcQF/gXDBScGMAZ/BX8FMAZ+BRoGMQbXBdcFMQbWBTEGxQXWBdYFxQW6BcUFMQaNBY0FMQaLBTEGGgaLBYsFGgaKBYAFgQXtBe0FgQXuBU0FTgVmBWYFTgUyBnkFegWpBXoFKgapBagFqQUqBjMGSQWtBa0FSQWxBUkFMwZGBUYFMwZHBY8FMwaRBZEFMwatBfgFNAb6BfoFNAYTBjQGxgUTBhMGxgXIBcYFNAa0BbQFNAYDBjQG+AUDBgMG+AWeBbIFAgb+Bf4FAgb/BQIGnwX/Bf8FnwUBBpIFoAWpBakFoAWmBaEFoAWQBZAFoAWSBSwGLgbkBeQFLgbyBeAFLAbhBeEFLAbkBfIFMAbxBfEFMAYnBuMFmAXhBeEFmAWVBZkFlAWYBZgFlAWVBZQFmQU+BT4FmQVEBUQFRQU+BT4FRQU9BUcFOwVFBUUFOwU9BTMGjwVHBUcFjwU7BTUGNgY3BjcGNgY4BjkGNgY5BTkFNgZFBDkFRQQ6BToFRQRDBEAEQQRDBEMEQQQ6BT8EQARCBEIEQARDBDoGOwY8BjwGOwY9Bj4GOwY2BDYEOwY4BT8GQAZBBkEGQAZCBkMGRAZFBkUGRAY7BDoGOQY3BTcFOQY5BT8GPgY3BDcEPgY2BEYGRwZkBWQFRwZrBVMFbgVIBkgGbgVJBkoGQAY5BDkEQAY4BG4FawVLBksGawVMBjYGNQZFBEUENQZEBEQGQwZNBk0GQwZOBk8GNgZQBlAGNgY5BlEGOQZSBlIGOQY6BjgFOwY3BTcFOwY6BjsGPgZTBlMGPgZUBj4GPwZVBlUGPwZWBkAGPwY4BDgEPwY3BEAGSgZXBlcGSgZYBkoGRAZZBlkGRAZaBlsG3AUqBioG3AXeBdkF3AVvBW8F3AVbBm0FbwVcBlwGbwVbBlsGKgZ7BXsFKgZ6BVwGWwYKBgoGWwZ7BVwGCgZuBW4FCgZrBW4FbQVcBgoGewVqBWoFewVoBTkEOwRKBkoGOwREBoEDkgN/A38DkgORA5IDoAORA5EDoAOfA6ADrgOfA58DrgOtA64DvAOtA60DvAO7A7sDvAPJA8kDvAOHAYcBigHJA8kDigHVAysEPgQyBDIEPgQ6BGsDXQZqA2oDXQZeBl0GXwZeBl4GXwZgBl8GYQZgBmAGYQZiBmEGYwZiBmIGYwZkBmMGZQZkBmQGZQZmBmUGZwZmBmYGZwZoBmcGaQZoBmgGaQZqBmkGawZqBmoGawZsBmwGawZtBm0GawZuBm0GbgZvBm8GbgZwBnAGcQZvBm8GcQZyBnEGcwZyBnIGcwZ0BnMGdQZ0BnQGdQZ2BocDdwZrA2sDdwZdBncGeAZdBl0GeAZfBngGeQZfBl8GeQZhBnkGegZhBmEGegZjBnoGewZjBmMGewZlBnsGfAZlBmUGfAZnBnwGfQZnBmcGfQZpBn0GfgZpBmkGfgZrBmsGfgZuBm4GfgZ/Bm4GfwZwBnAGfwaABoAGgQZwBnAGgQZxBoIGgwZzBnMGgwZ1BpUDhAaHA4cDhAZ3BoQGhQZ3BncGhQZ4BoUGhgZ4BngGhgZ5BoYGhwZ5BnkGhwZ6BocGiAZ6BnoGiAZ7BogGiQZ7BnsGiQZ8BokGigZ8BnwGigZ9BooGiwZ9Bn0GiwZ+Bn4GiwZ/Bn8GiwaMBn8GjAaABoAGjAaNBoAGjQaBBoEGjQaOBo8GkAaCBoIGkAaDBpUDogOEBoQGogORBpEGkgaEBoQGkgaFBpIGkwaFBoUGkwaGBpMGlAaGBoYGlAaHBpQGlQaHBocGlQaIBpUGlgaIBogGlgaJBpYGlwaJBokGlwaKBpcGmAaKBooGmAaLBosGmAaMBowGmAaZBpkGmgaMBowGmgaNBo0GmgaOBo4GmgabBpwGnQaPBo8GnQaQBqIDsAORBpEGsAOeBp4GnwaRBpEGnwaSBp8GoAaSBpIGoAaTBqAGoQaTBpMGoQaUBqEGogaUBpQGogaVBqIGowaVBpUGowaWBqMGpAaWBpYGpAaXBqQGpQaXBpcGpQaYBpgGpQaZBpkGpQamBqYGpwaZBpkGpwaaBqcGqAaaBpoGqAabBqkGqgacBpwGqgadBrADvgOeBp4GvgOrBqsGrAaeBp4GrAafBqwGrQafBp8GrQagBq0GrgagBqAGrgahBq4GrwahBqEGrwaiBq8GsAaiBqIGsAajBrAGsQajBqMGsQakBrEGsgakBqQGsgalBqUGsgamBqYGsgazBrMGtAamBqYGtAanBrQGtQanBqcGtQaoBrYGqgbUAdQBqgbVAb4DygOrBqsGygO3BrcGuAarBqsGuAasBrgGuQasBqwGuQatBrkGugatBq0GugauBroGuwauBq4GuwavBrsGvAavBq8GvAawBrwGvQawBrAGvQaxBr0GvgaxBrEGvgayBrIGvgazBrMGvga/BrMGvwa0BrQGvwbABsAGwQa0BrQGwQa1BsoD1gO3BrcG1gPCBsIGwwa3BrcGwwa4BsMGxAa4BrgGxAa5BsQGxQa5BrkGxQa6BsUGxga6BroGxga7BsYGxwa7BrsGxwa8BscGyAa8BrwGyAa9BsgGyQa9Br0GyQa+Br4GyQa/Br8GyQbKBsoGywa/Br8GywbABssGzAbABsAGzAbBBtYD4gPCBsIG4gPNBs0GzgbCBsIGzgbDBs4GzwbDBsMGzwbEBs8G0AbEBsQG0AbFBtAG0QbFBsUG0QbGBtEG0gbGBsYG0gbHBtIG0wbHBscG0wbIBtMG1AbIBsgG1AbJBskG1AbKBsoG1AbVBtUG1gbKBsoG1gbLBtYG1wbLBssG1wbMBuID7gPNBs0G7gPYBtgG2QbNBs0G2QbOBtkG2gbOBs4G2gbPBtoG2wbPBs8G2wbQBtsG3AbQBtAG3AbRBtwG3QbRBtEG3QbSBt0G3gbSBtIG3gbTBt4G3wbTBtMG3wbUBtQG3wbVBtUG3wbgBtUG4AbWBtYG4AbhBtYG4QbXBtcG4QbiBu4D+gPYBtgG+gPjBuMG5AbYBtgG5AbZBuQG5QbZBtkG5QbaBuUG5gbaBtoG5gbbBuYG5wbbBtsG5wbcBucG6AbcBtwG6AbdBugG6QbdBt0G6QbeBt4G6QbfBt8G6QbqBt8G6gbgBuAG6gbrBuAG6wbhBuEG6wbsBuEG7AbiBuIG7AbtBvoDBgTjBuMGBgTuBuMG7gbkBuQG7gbvBuQG7wblBuUG7wbwBuUG8AbmBuYG8AbxBvEG8gbmBuYG8gbnBvIG8wbnBucG8wboBvMG9AboBugG9AbpBukG9AbqBuoG9Ab1BuoG9QbrBusG9Qb2BusG9gbsBuwG9gb3BuwG9wbtBu0G9wb4BgYEEgTuBu4GEgT5Bu4G+QbvBu8G+Qb6Bu8G+gbwBvAG+gb7BvMG/Ab0BvwG/Qb0BvQG/Qb1Bv0G/gb1BvUG/gb2Bv4G/wb2BvYG/wb3BvcG/wb4BvgG/wYABxIEGwT5BvkGGwQBB/kGAQf6BvoGAQcCBxsEHgQBBwEHHgQDBwMHBAcBBwEHBAcCBwUH/gYGBwYH/gb9BgUHBwf+Bv4GBwf/Bv8GBwcABwAHBwcIBx4EJQQDBwMHJQQJBwkHCgcDBwMHCgcEBwUHBgcLBwsHBgcMBwUHCwcHBwcHCwcNBwcHDQcIBwgHDQcOByUELAQJBwkHLAQPBwkHDwcKBwoHDwcQBxEHCwcSBxIHCwcMBwsHEQcNBw0HEQcTBw0HEwcOBw4HEwcUBywEMwQPBw8HMwQVBw8HFQcQBxAHFQcWBxcHEQcYBxgHEQcSBxEHFwcTBxMHFwcZBxMHGQcUBxQHGQcaBxQHGgcbBxsHGgccBxsHPAQdBx0HPAQ9BDMEPwQVBxUHPwQeBxUHHgcWBxYHHgcfB0IERAQgByAHRAQhB14GRgRqA2AGRgReBmIGRgRgBmQGRgRiBmYGRgRkBmgGRgRmBmoGRgRoBmwGRgRqBm0GRgRsBm8GRgRtBnIGRgRvBnIGdAZGBHYGRgR0BiIHIwckByQHIwclByMHIgcmByYHIgcnBygHIwcpBykHIwcmByMHKAclByUHKAcqBysHLActBy0HLAcuBywHKwcvBy8HKwcwByIHLAcnBycHLAcvBywHIgcuBy4HIgckBzEHMgczBzMHMgc0BzIHMQc1BzUHMQc2BysHMgcwBzAHMgc1BzIHKwc0BzQHKwctBzcHOAc5BzkHOAc6BzcHOQc7BzsHOQc8BzEHNwc2BzYHNwc7BzcHMQc4BzgHMQczBz0HPgc/Bz8HPgdABz8HQAc5BzkHQAc8Bz8HQQc9Bz0HQQdCB0MHRAdFB0UHRAdGB0UHRwdDB0MHRwdIB0MHSAc9Bz0HSAc+Bz0HQgdDB0MHQgdEB0kHSgdLB0sHSgdMB0sHTQdJB0kHTQdOB0kHTgdFB0UHTgdHB0UHRgdJB0kHRgdKB08HUAdRB1EHUAdSB1EHUwdPB08HUwdUB08HVAdLB0sHVAdNB0sHTAdPB08HTAdQB1UHVgdXB1cHVgdYB1cHWQdVB1UHWQdaB1UHWgdRB1EHWgdTB1EHUgdVB1UHUgdWBygHWwcqByoHWwdcB1sHKAddB10HKAcpB1cHWwdZB1kHWwddB1sHVwdcB1wHVwdYByoHUgclByUHUgdQB14HXwdgB2AHXwdhB2IHYwdkB2QHYwdhB2UHZgdnB2cHZgdoB2kHagdrB2sHagdoB2wHagdtB20HagduB28HXwdwB3AHXwduB3EHcgdzB3MHcgdjB3QHdQd2B3YHdQdzB3cHdQd4B3gHdQd5B3oHewd5B3kHewd8B30Hfgd/B38HfgeAB4EHggd/B38Hggd8B4MHhAeFB4UHhAeAB4YHhweFB4UHhweIB4kHigeLB4sHigeIB4wHjQeLB4sHjQeOB48HkAeRB5EHkAeOB5IHkweRB5EHkweUB5UHlgeXB5cHlgeUB5gHmQeXB5cHmQdmB5oHmwc2BzYHmwc1B5wHnQc1BzUHnQcwB54HnwcnBycHnwcmB6AHoQcmByYHoQcpB6IHowcwBzAHowcvB6QHpQcvBy8HpQcnB6YHpwc8BzwHpwc7B6gHqQc7BzsHqQc2B6oHqwcpBykHqwddB6wHrQddB10HrQdZBz4HrgdAB0AHrgevB7AHPAexB7EHPAdAB1kHsgdaB1oHsgezB7QHUwe1B7UHUwdaB0cHtgdIB0gHtge3B7gHPge5B7kHPgdIB1MHugdUB1QHuge7B7wHTQe9B70HTQdUB00HvgdOB04Hvge/B8AHRwfBB8EHRwdOB8IHwwd2B3YHwwd0B3YHYgfEB8QHYgfFB8YHxwdwB3AHxwdvB8gHcAfJB8kHcAdpB8oHywdkB2QHywdiB2QHbwfMB8wHbwfNB84Hzwd6B3oHzwd7B3oHdAfQB9AHdAfRB9IHaQfTB9MHaQdrB9QHawfVB9UHaweZB9YH1wd9B30H1wd+B30HewfYB9gHewfZB9oHmQfbB9sHmQeYB9wHmAfdB90HmAeTB94H3weGB4YH3weHB4YHfgfgB+AHfgfhB+IHkwfjB+MHkweSB+QHkgflB+UHkgeNB+YH5weMB4wH5weNB4wHhwfoB+gHhwfpB+oH6weEB4QH6weBB+wHggfrB+sHggeBB+0H7geKB4oH7geDB+4H6geDB4MH6geEB3IH7wdgB2AH7wfwB/EHXgfwB/AHXgdgB/IH8weWB5YH8wePB/MH9AePB48H9AeQB2wH9QdnB2cH9Qf2B/YH9wdnB2cH9wdlB14H8QdtB20H8Qf4B/UHbAf4B/gHbAdtB3cH+QdxB3EH+Qf6B+8Hcgf6B/oHcgdxB4IH7Ad4B3gH7Af7B/kHdwf7B/sHdwd4B/QH/AeQB5AH/AeJB/wH7QeJB4kH7QeKB/cH/QdlB2UH/QeVB/0H8geVB5UH8geWB+oH/gfrB+sH/gf/BwAI7Af/B/8H7AfrB+4H7QcBCAEI7QcCCOoH7gf+B/4H7gcBCO8HAwjwB/AHAwgECAUI8QcECAQI8QfwB/MH8gcGCAYI8gcHCPQH8wcICAgI8wcGCPYH9QcJCAkI9QcKCPcH9gcLCAsI9gcJCPEHBQj4B/gHBQgMCAoI9QcMCAwI9Qf4B/kHDQj6B/oHDQgOCAMI7wcOCA4I7wf6B+wHAAj7B/sHAAgPCA0I+QcPCA8I+Qf7B/wH9AcQCBAI9AcICO0H/AcCCAII/AcQCP0H9wcRCBEI9wcLCPIH/QcHCAcI/QcRCFYHUgdYB1IHKgdYByoHXAdYByQHTAcuBy4HTAdKByUHUAckByQHUAdMBy4HSgctBy0HSgdGBzgHMwc6B0IHQQczBzMHQQc6B0YHRActBy0HRAc0BzkHOgc/Bz8HOgdBBzMHNAdCB0IHNAdEB/4HEgj/B/8HEggTCP8HEwgACAAIEwgYBxQIFQgCCAIIFQgBCP0G/AYDCAMI/AYECAQI/AYFCAUI/AbzBgoHEAcHCAcIEAcGCBAHFgcGCAYIFgcICAoI8QYJCAkI8Qb7BgkI+wYLCAsI+wYCB/MG8gYFCAUI8gYMCAwI8gYKCAoI8gbxBg0IDAcOCA4IDAcGBw4IBgcDCAMIBgf9Bg8IEgcNCA0IEgcMBwgIFgcQCBAIFgcfBx8HFAgQCBAIFAgCCAsIAgcRCBEIAgcEBxEIBAcHCAcIBAcKBxUIEggBCAEIEgj+BwIH+wb6BvsG8QbwBg8IAAgSBxIHAAgYBxYIFwgYCBcIGQgYCBgIGQgWCBoIQgUbCBsIQgVDBRwIGggdCB0IGggbCBoIHAgeCB4IHAgfCEoFHghIBUgFHgggCEIFGghKBUoFGggeCCEIIggjCCMIIggkCCIIIQglCCUIIQgmCCcIKAgpCCkIKAgqCFUFKwgnCCcIKwgsCCIILQguCC4ILQgvCDAIMQgyCDIIMQguCDEIMwguCC4IMwg0CCQIIgg0CDQIIgguCDUINgg3CDcINgg4CCMIJAg1CDUIJAg2CDkIOgg7CDsIOgg8CD0IPgg8CDwIPgg7CD4IPwg7CD8IQAg7CDsIQAg5CEEIKQhCCEIIKQhDCEQIQQhFCEUIQQhCCEEIRAhGCEYIRAhHCHQFcwVHCEcIcwVGCHMFVQVGCEYIVQUnCCkIQQgnCCcIQQhGCEgISQhKCEoISQhLCEsIOAhKCEoIOAg2CCQINAg2CDYINAhKCDMISAg0CDQISAhKCD0ITAg+CD4ITAhNCE0ITgg+CE8IUAhRCFEIUAhSCFAIUwhSCFIIUwhUCFUIhAVWCFYIhAWFBYUFhgVWCFYIhgVXCFMIUAhXCFcIUAhWCE8IVQhQCFAIVQhWCFgIWQhaCFoIWQhbCFwIXQhbCFsIXQhaCF4IXwhgCGAIXwhhCGIIFghfCF8IFghhCGEIYwhgCGAIYwhkCBkIZQgWCBYIZQhhCGUIZghhCGEIZghjCGcIaAhpCGkIaAhqCGgIHQhqCGoIHQgbCBsIQwVqCGoIQwWaBZsFaQiaBZoFaQhqCDcIOAhrCGsIOAhsCGsIbAhtCG0IbAhuCG8IcAhxCHEIcAhyCHMIdAhyCHIIdAhxCHQIXghxCHEIXghgCHAIbwh1CHUIbwh2CGMIdwhkCHgIZAh3CHgITAh2CHYITAh5CHoIdQh5CHkIdQh2CF4IdAh7CHsIdAh8CHQIcwh8CHwIcwh9CH4Ifwh9CH0Ifwh8CH8IgAh8CHwIgAh7CIEIggiDCIMIggiECIIIgQiFCIUIgQiGCIcIiAiJCIkIiAiKCIsIjAiKCIoIjAiJCIwIjQiJCIkIjQiOCI8IhwiOCI4IhwiJCJAIkQiSCJIIkQiTCFwIlAiTCJMIlAiSCIgIhwiUCJQIhwiSCIcIjwiSCJIIjwiQCJUIlgiXCJcIlgiYCJkImgiYCJgImgiXCJoIhgiXCJcIhgiBCIMIlQiBCIEIlQiXCI0IjAibCJsIjAicCIwIiwicCJwIiwidCJ4InwidCJ0InwicCJ8IoAicCJwIoAibCIUIhgihCKEIhgiaCKIIoQiZCJkIoQiaCKMIpAilCKUIpAimCKQIngimCKYIngidCJ0IiwimCKYIiwiKCIgIpQiKCIoIpQimCKcIRAioCKgIRAhFCKkIpwiqCKoIpwioCKsIrAitCK0IrAiuCGMIZgivCK8IZgiwCLAIsQiyCLIIsQizCKcIqQi0CLQIqQi1COgF5wW1CLUI5wW0COcFdAW0CLQIdAVHCEQIpwhHCEcIpwi0CGcIaQixCLEIaQi2CGkImwW2CLYImwXqBewFtwjqBeoFtwi2CLcIswi2CLYIswixCLgIqQi5CLkIqQiqCKwIqwi6CLoIqwi7CLIIswi8CLwIswi9CPMF6AW+CL4I6AW1CKkIuAi1CLUIuAi+CLcI7AW/CL8I7AX2BbMItwi9CL0Itwi/CLoIuwhSCFIIuwhRCIYF8wVXCFcI8wW+CLgIUwi+CL4IUwhXCMAIwQjCCMIIwQjDCMEIbgjDCMMIbghsCDgISwhsCGwISwjDCEsISQjDCMMISQjCCMQIfgjFCMUIfgh9CHMIxgh9CH0IxgjFCMYIjQjFCMUIjQibCKAIxAibCJsIxAjFCMcIkQjICMgIkQjJCHoIygjJCMkIygjICG0IbgjLCMsIbgjMCIMIhAjMCMwIhAjLCM0IjwjOCM4IjwiOCI0IxgiOCI4IxgjOCMYIcwjOCM4IcwhyCHAIzQhyCHIIzQjOCKIIWAihCKEIWAhaCF0IhQhaCFoIhQihCIUIXQiCCIIIXQjPCMcIhAjPCM8IhAiCCG0IyghrCGsIygjQCD0INwjQCNAINwhrCDcIPQg1CDUIPQg8CDoIIwg8CDwIIwg1CDoIOQjRCNEIOQjSCNMIQAg/CK4IrAioCKgIrAiqCKwIugiqCKoIugi5CLoIUgi5CLkIUghUCNQIDQbVCNUIDQYxCA0GDgYxCDEIDgYzCA4GDwYzCDMIDwZICA8GEAZICEgIEAZJCBAGEQZJCEkIEQbCCBIGwAgRBhEGwAjCCMAIEgbWCNYIEgYUBhUGlggUBhQGlgjWCJYIFQaYCJgIFQYWBhcGmQgWBhYGmQiYCBgGoggXBhcGogiZCBkGWAgYBhgGWAiiCBwGGwZZCFkIGwbXCBsGHQbXCNcIHQajCB4GHwakCKQIHwaeCB0GHgajCKMIHgakCB8GIAaeCJ4IIAafCCAGIQafCJ8IIQagCCIGIwbECMQIIwZ+CCEGIgagCKAIIgbECCMGJAZ+CH4IJAZ/CCQGJQZ/CH8IJQaACCUGSAWACIAISAUgCFUITwjYCNgITwjZCL0IvwjZCNkIvwjYCL8I9gXYCNgI9gUoBoQFVQgoBigGVQjYCBkGHAZYCFgIHAZZCNoIdwitCK0IdwjbCHcIYwjbCNsIYwivCNwI3QivCK8I3QjbCN0IqwjbCNsIqwitCMoIegjQCNAIegh5CD0I0AhMCEwI0Ah5CKsI3Qi7CLsI3QjeCN0I3AjeCN4I3AjfCM0IcAjgCOAIcAh1CHUIegjgCOAIegjJCJEIkAjJCMkIkAjgCI8IzQiQCJAIzQjgCLsI3ghRCFEI3gjhCN8IvAjeCN4IvAjhCF0IXAjPCM8IXAiTCJEIxwiTCJMIxwjPCNkITwjhCOEITwhRCNcIowjiCOIIowilCIgIlAilCKUIlAjiCJQIXAjiCOIIXAhbCFkI1whbCFsI1wjiCFMIuAhUCFQIuAi5CCMIOgghCCEIOgjjCEwIeAhNCE0IeAjaCHcI2gh4CIAIIAh7CHsIIAjkCCAIHgjkCB4IHwjkCF8IXgjkCOQIXgh7CMEIwAjlCOUIwAjWCJYIlQjWCNYIlQjlCJUIgwjlCOUIgwjMCG4IwQjMCMwIwQjlCIQIxwjLCMsIxwjICMoIbQjICMgIbQjLCGQIeAhvCG8IeAh2CGQIbwhgCGAIbwhxCNwIsgjfCN8Isgi8CLII3AiwCLAI3AivCLwIvQjhCOEIvQjZCGYIZwiwCLAIZwixCGgIZwhlCGUIZwhmCGUIGQhoCGgIGQgdCBcIHAgZCBkIHAgdCB8IHAhiCGIIHAgXCOQIHwhfCF8IHwhiCOYI5wjoCOgI5wg1BiEH5wgVCBUI5wjpCBUIFAghByEHFAggBxQIHwcgByAHHwceBz8EQgQeBx4HQgQgB+oI6wjsCOwI6wjtCBgHEwjuCO4IEwjtCO8I8AjxCPEI8AjyCBwH8whFBkUG8whDBhUI6QgSCBII6QjsCBgH7ggXBxcH7gjyCDkIQAj0CPQIQAj1CCkI9ghDCEMI9gj3CBkH8AgaBxoH8Aj4CPkIQAj6CPoIQAhDCEQENQYhByEHNQbnCPsIQwb8CPwIQwbzCP0I/gjnCOcI/gjpCP8IAAnpCOkIAAnsCBMIEgjtCO0IEgjsCAEJ7ggCCQIJ7gjtCAMJ8ggECQQJ8gjuCBcH8ggZBxkH8gjwCAUJ+AgGCQYJ+AjwCAcJ8wgICQgJ8wj4CAkJ2giuCK4I2gitCAkJrghFCEUIrgioCAkJRQgKCQoJRQhCCE0I2ghOCE4I2ggJCU4ICQnTCNMICQkKCUAI0whDCEMI0wgKCUMICglCCD4ITgg/CD8ITgjTCBoH+AgcBxwH+AjzCIEGggZxBnEGggZzBo4GjwaBBoEGjwaCBpsGnAaOBo4GnAaPBqgGqQabBpsGqQacBqgGtQapBqkGtQZXA8EGWgO1BrUGWgNXAwgHHQdnAw4HFAcdBx0HFAcbB5IEgwSTBJMEgwSFBIQEmASGBIYEmASJBIgElASGBIYElASFBJUEjgSTBJMEjgSQBJoEhwSXBJcEhwSJBIsEkQSNBI0EkQSQBJYEnASXBJcEnASbBI8EvgSNBI0EvgSMBJ8EmQSeBJ4EmQSbBIoEjAS6BLoEjAS7BKcEoQSdBJ0EoQSeBLgEuQS9BL0EuQS7BKAEoQSiBKIEoQSjBLwEuQS0BLQEuQS1BKoEpQSmBKYEpQSjBLIEswS3BLcEswS1BKQEpQSrBKsEpQSpBLYEswSuBK4EswSvBLAErQSoBKgErQSpBKwErQSxBLEErQSvBGAHYQdyB3IHYQdjB20HbgdeB14HbgdfB2QHYQdvB28HYQdfB3YHcwdiB2IHcwdjB3AHbgdpB2kHbgdqB3EHcwd3B3cHcwd1B2cHaAdsB2wHaAdqB3oHeQd0B3QHeQd1B2sHaAeZB5kHaAdmB4IHeAd8B3wHeAd5B2UHlQdmB2YHlQeXB3sHfQd8B3wHfQd/B5MHmAeUB5QHmAeXB4QHgQeAB4AHgQd/B5YHjweUB5QHjweRB34HhgeAB4AHhgeFB40HkgeOB44HkgeRB4oHgweIB4gHgweFB5AHiQeOB44HiQeLB4cHjAeIB4gHjAeLB2MC3AJhAmEC3AILCSECwgIbAhsCwgLcAgsJ3AIQAxAD3ALCApoCmQJCA0IDmQJDA6QCQQOdAp0CQQNCA6ICoAJAA0ADoAJBA80CPgOlAqUCPgNAA80C9wI+Az4D9wI/A+4CPQMjAyMDPQM7A08COQNNAk0COQM6A6kCOQOqAqoCOQM4A2ACNwNSAlICNwM4A7MCNwO0ArQCNwM2A14C2QI2AzYD2QI1A7wCuwI0AzQDuwI1AxkDGwMyAzIDGwMzA+0G+AZhA2ED+AZiA+IG7QZfA18D7QZhA9cG4gZeA14D4gZfA8wG1wZbA1sD1wZeA2QDYgMABwAHYgP4BmcDZAMIBwgHZAMAB2cDHQfWAdYBHQc9BNYBPQSVAZUBPQQ+BFoDwQZbA1sDwQbMBgwJdgYNCQ0JdgZ1BlcD1QGpBqkG1QGqBg4JDQmDBoMGDQl1Bg8JDgmQBpAGDgmDBg8JkAYQCRAJkAadBrYGEAmqBqoGEAmdBrsBvAFNA00DvAERCXIAdAC4AbgBdAC6AREEkAEaBBoEkAGTAREEBQSQAZABBQSOAYEDgAOFA4UDgAOEA4UBhgESCRIJhgG9AxMJkwODA4MDkwOFAxQJoQMTCRMJoQOTAxUJrwMUCRQJrwOhAxIJvQMVCRUJvQOvA+ED1QOLAYsB1QOKAYsBjQHhA+EDjQHtA+0DjQH5A/kDjQGOAQUE+QOOAZUBPgQWCRYJkwGVARwHRQYbBxsHRQY8BDoEPAQ7BDsEPARFBgEAFwkDAAMAFwkYCQQAGQkBAAEAGQkXCQcAGgkEAAQAGgkZCQgAGwkHAAcAGwkaCcAAvwAcCRwJvwAdCcIAwQAeCR4JwQAfCb8AwgAdCR0JwgAeCQMAGAnFAMUAGAkgCccAwAAhCSEJwAAcCcUAIAlrAWsBIAkiCX0BxwAjCSMJxwAhCWsBIgnBAMEAIgkfCRsJCAAkCSQJCACXAX0BIwnRAdEBIwklCdoB2wEmCSYJ2wEnCd0B2gEoCSgJ2gEmCd8B3QEpCSkJ3QEoCd8BKQnhAeEBKQkqCZcCKwmYApgCKwksCZsCLQmZApkCLQkuCZgCLAmbApsCLAktCdsBngInCScJngIvCZ8CMAmXApcCMAkrCZ4CQwMvCS8JQwMxCeEBKglFA0UDKgkyCdEBJQmfAp8CJQkwCUMDmQIxCTEJmQIuCRgJFwkzCRcJGQkzCRkJGgkzCRoJGwkzCRwJHQkzCR4JHwkzCR0JHgkzCSAJGAkzCSEJHAkzCSIJIAkzCSMJIQkzCR8JIgkzCRsJJAkzCSQJMgkzCSUJIwkzCSYJJwkzCSgJJgkzCSkJKAkzCSoJKQkzCSwJKwkzCS4JLQkzCS0JLAkzCScJLwkzCSsJMAkzCS8JMQkzCTIJKgkzCTAJJQkzCTEJLgkzCT4EKwQWCRYJKwQkBBoEkwEkBCQEkwEWCQgHDgcdBzIJJAlFA0UDJAmXAVkANAlXAFcANAk1CUYDRAOZAZkBRAOYAUQDRQOYAZgBRQOXAUcDRgOaAZoBRgOZAUcDmgFMA0wDmgG4AUwDuAG5AbkBuAG6AXQAggC6AboBggC8AYIAhAC8AbwBhAARCU4DNglPA08DNgk3CU8DNwlQA1ADNwk4CVADOAlRA1EDOAk5CVEDOQlKA0oDOQk6CUsDSgM7CTsJSgM6CUgDSwM8CTwJSwM7CUgDPAlJA0kDPAk9CTQJWQA+CT4JWQCjAJUAPwmjAKMAPwk+CZQAQAmVAJUAQAk/CY0ATQDBAcEBTQCqAUsAqAFNAE0AqAGqAU4ArAFLAEsArAGoAU4AUQCsAawBUQCuAVEAfwGuAa4BfwHNAX8BgQHNAc0BgQHPAYQB0gGBAYEB0gHPAYUB1AGEAYQB1AHSARIJtgaFAYUBtgbUARUJEAkSCRIJEAm2BhUJFAkQCRAJFAkPCRQJEwkPCQ8JEwkOCRMJgwMOCQ4JgwMNCYMDggMNCQ0JggMMCUYEDAmCA3YGDAlGBEYEhAOAAz4BQQlAAUABQQlCCUQBQwlCAUIBQwlECUIBRAk+AT4BRAlBCQwBCQFFCUUJCQFGCQoBEgFHCUcJEgFICQkBCgFGCUYJCgFHCSEBDAFJCUkJDAFFCUABQgkTARMBQglKCRIBEwFICUgJEwFKCRsBFAEdAR0BFAEeAWUBSwkXARcBSwlMCRcBTAkZARkBTAlNCR0BHgEkASQBHgEiAWUBIQFLCUsJIQFJCSQBIgEmASYBIgEnASYBJwEqASoBJwEoASwBKgEtAS0BKgEoATsBLAE5ATkBLAEtATYBNwFOCU4JNwFPCTMBOwEvAS8BOwE5ATIBMwEuAS4BMwEvAUQBNgFDCUMJNgFOCRwDGgNQCVAJGgNRCRcDGANSCVIJGANTCRoDFwNRCVEJFwNSCeICVAnpAukCVAlVCeQCVgngAuACVglXCeACVwniAuICVwlUCfkCWAnkAuQCWAlWCRgD6wJTCVMJ6wJZCekCVQnrAusCVQlZCTwD8AJaCVoJ8AJbCfQC9QLsAuwC9QL2AvAC8QJbCVsJ8QJcCfUC/AL2AvYC/AL6AjwDWgn5AvkCWglYCfwC/gL6AvoC/gL/Av4CAgP/Av8CAgMAAwQDBQMCAwIDBQMAAxMDEQMEAwQDEQMFAwsDBgMTAxMDBgMRAw0DXQkPAw8DXQleCQkDBwMLAwsDBwMGAxwDUAkNAw0DUAldCWIIFwgWCD0FPAU/BQ==" } ] } ================================================ FILE: examples/resources/models/gltf/Duck/glTF-pbrSpecularGlossiness/Duck.gltf ================================================ { "asset": { "generator": "COLLADA2GLTF", "version": "2.0" }, "scene": 0, "scenes": [ { "nodes": [ 0 ] } ], "nodes": [ { "children": [ 2, 1 ], "matrix": [ 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "matrix": [ -0.7289686799049377, 0.0, -0.6845470666885376, 0.0, -0.4252049028873444, 0.7836934328079224, 0.4527972936630249, 0.0, 0.5364750623703003, 0.6211478114128113, -0.571287989616394, 0.0, 400.1130065917969, 463.2640075683594, -431.0780334472656, 1.0 ], "camera": 0 }, { "mesh": 0 } ], "cameras": [ { "perspective": { "aspectRatio": 1.5, "yfov": 0.6605925559997559, "zfar": 10000.0, "znear": 1.0 }, "type": "perspective" } ], "meshes": [ { "primitives": [ { "attributes": { "NORMAL": 1, "POSITION": 2, "TEXCOORD_0": 3 }, "indices": 0, "mode": 4, "material": 0 } ], "name": "LOD3spShape" } ], "accessors": [ { "bufferView": 0, "byteOffset": 0, "componentType": 5123, "count": 12636, "max": [ 2398 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 0, "componentType": 5126, "count": 2399, "max": [ 0.9995989799499512, 0.999580979347229, 0.9984359741210938 ], "min": [ -0.9990839958190918, -1.0, -0.9998319745063782 ], "type": "VEC3" }, { "bufferView": 1, "byteOffset": 28788, "componentType": 5126, "count": 2399, "max": [ 96.17990112304688, 163.97000122070313, 53.92519760131836 ], "min": [ -69.29850006103516, 9.929369926452637, -61.32819747924805 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 0, "componentType": 5126, "count": 2399, "max": [ 0.9833459854125976, 0.9800369739532472 ], "min": [ 0.026409000158309938, 0.01996302604675293 ], "type": "VEC2" } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0 }, "emissiveFactor": [ 0.0, 0.0, 0.0 ], "extensions": { "KHR_materials_pbrSpecularGlossiness": { "diffuseTexture": { "index": 0 }, "specularFactor": [ 0.0, 0.0, 0.0 ], "glossinessFactor": 0.30000001192092898 } }, "name": "blinn3-fx" } ], "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "uri": "DuckCM.png" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9986, "wrapS": 10497, "wrapT": 10497 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 76768, "byteLength": 25272, "target": 34963 }, { "buffer": 0, "byteOffset": 0, "byteLength": 57576, "byteStride": 12, "target": 34962 }, { "buffer": 0, "byteOffset": 57576, "byteLength": 19192, "byteStride": 8, "target": 34962 } ], "buffers": [ { "byteLength": 102040, "uri": "Duck0.bin" } ], "extensionsUsed": [ "KHR_materials_pbrSpecularGlossiness" ] } ================================================ FILE: examples/resources/models/gltf/GlamVelvetSofa/README.md ================================================ # GlamVelvetSofa ## Screenshot ![screenshot](screenshot/screenshot_large.jpg) Above: screenshot from the [Babylon.js Sandbox](https://sandbox.babylonjs.com/). ## Description This model represents a real product, a velvet sofa bed being sold [on the Wayfair website](https://www.wayfair.com/furniture/pdp/mercer41-frankie-velvet-86-recessed-arm-sofa-bed-mcrf6337.html). The model is made of three parts, each with their own materials. Two 1024x1024 PNG textures are used for the whole model, an ambient occlusion map and a normal bump map. All UVs are arranged between 0 and 1, and `KHR_texture_transform` is used to repeat the normal map for the fabric. The model uses 4319 triangles and 3204 vertices. The model uses several extensions: * [KHR_lights_punctual](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual) to provide a key light for better velvet illumination. Sheen seems to respond better to punctual lights than with image-based lighting alone. * [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_sheen) for velvet sheen. * [KHR_materials_specular](https://github.com/KhronosGroup/glTF/pull/1719) to colorize facing-angle reflections, which occurs with some fabrics (satins, silks, velvets, etc.). * [KHR_materials_variants](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_variants/README.md) to represent the five fabric color options on this product. * [KHR_texture_transform](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_transform/README.md) to scale the normal bump texture separately from the ambient occlusion texture. ## Reference Photos The use of real-world photographic reference is meant to help glTF developers with calibrating material features and renderer behavior, so we can more accurately represent e-commerce products. Additional photo reference is available [on the Wayfair website](https://www.wayfair.com/furniture/pdp/mercer41-frankie-velvet-86-recessed-arm-sofa-bed-mcrf6337.html). The official photos of the product have been retouched to emphasize materials and finishes, a common practice in retail photography. This can make the materials difficult to reproduce in a 3D model, as it's tricky to isolate accurate base colors, roughness, specular color, etc. Sometimes a physical sample of the surface is difficult to obtain, and prescribing controlled photography can be onerous for manufacturers. Fortunately, we can rely on customer review photos to provide additional material reference. Although lighting can be poor, customer photos are often unretouched which can offer a less-biased view of the surface materials. The ground truth is usually somewhere in the middle, since the official photography provides higher resolution and controlled lighting, while the customer imagery provides little or no retouching. ![photo references](screenshot/photoreference_vs_customer.jpg) Photo references of the product. Top row: official product photography, bottom row: customer review photography ## KHR_materials_variants The model uses the extension [KHR_materials_variants](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_variants/README.md) to add five fabric variants. Each uses slightly different UV offsets via `KHR_texture_transform` to add variety. * Black * Champagne * Gray * Navy * Pale Pink ![screenshots of the five variants](screenshot/screenshot_variants.jpg) ## KHR_materials_sheen and KHR_materials_specular The extension [KHR_materials_sheen](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_sheen) is used for the main fabric color; it best represents how velvet microfibers interact with lighting at glancing angles. [KHR_materials_specular](https://github.com/KhronosGroup/glTF/pull/1719) is used to colorize reflections on dielectric (non-metal) surfaces. Velvet, satin, silk, and similar fabrics can colorize reflections which makes them difficult to replicate in a traditional PBR metal-rough material. ![screenshots of how the various material layers combine together](screenshot/screenshot_layers.jpg) Top to bottom: base color alone, sheen color added, specular color added. A normalTexture simulates the bending of velvet microfibers from human touches, by bending the surface normals to point at different areas of the image-based lighting. The texture is a combination of tiled "grunge" patterns. The red channel was rotated 90 degrees to create variation, the blue channel was filled with white, and a cotton-weave normal map was overlaid. Then the texture was re-normalized. ![the fabric normalTexture](screenshot/normalTexture.jpg) The normal map, enlarged and cropped to show detail. ## KHR_lights_punctual The extension [KHR_lights_punctual](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual) is used to add a directional light to the model, with its Intensity set to 3. This provides better velvet illumination, as sheen responds better to punctual lights than to image-based lighting (IBL) alone. This is highly dependent on the exposure range in each IBL, however most IBLs do not capture strong exposure values for the lights unless the sun or a suitably bright light source are present. In these examples, the "studio" IBL from Babylon.js was used, which uses +2.40 stops for each light. Augmented reality IBLs typically contain a low value range, as they're often created by transforming the view from the mobile device's front camera. It is hoped the addition of a punctual light can restore the benefits of strong key light to improve the sheen response. ![screenshots with punctual enabled and disabled](screenshot/screenshot_punctual.jpg) Top: Punctual light improves sheen. Bottom: Disabling the punctual light. ## Authoring Details ## The model was created with [3ds Max](https://www.autodesk.com/products/3ds-max/) and exported to glTF via the [Max2Babylon](https://github.com/BabylonJS/Exporters/tree/master/3ds%20Max) exporter. The glTF file was then edited manually in [Visual Studio Code](https://code.visualstudio.com) with the [glTF Tools](https://github.com/AnalyticalGraphicsInc/gltf-vscode) extension to add KHR extensions and fine-tune material values. ## License Information (C) 2021, Wayfair LLC. CC-BY 4.0 International https://creativecommons.org/licenses/by/4.0/. ================================================ FILE: examples/resources/models/gltf/GlamVelvetSofa/glTF/GlamVelvetSofa.gltf ================================================ { "asset": { "version": "2.0", "copyright": "(c) 2021 Wayfair, CC BY 4.0.", "generator": "Created in 3ds Max, exported with babylon.js glTF exporter, and hand-edited in VSCode with glTF Tools" }, "extensionsUsed": [ "KHR_texture_transform", "KHR_materials_sheen", "KHR_materials_specular", "KHR_materials_variants", "KHR_lights_punctual" ], "extensionsRequired": [ "KHR_texture_transform" ], "extensions": { "KHR_lights_punctual": { "lights": [ { "type": "directional", "intensity": 3 } ] }, "KHR_materials_variants": { "variants": [ { "name": "Champagne" }, { "name": "Navy" }, { "name": "Gray" }, { "name": "Black" }, { "name": "Pale Pink" } ] } }, "scene": 0, "scenes": [ { "nodes": [ 0, 1, 2, 3 ] } ], "nodes": [ { "mesh": 0, "name": "GlamVelvetSofa_legs" }, { "mesh": 1, "name": "GlamVelvetSofa_fabric" }, { "mesh": 2, "name": "GlamVelvetSofa_feet" }, { "translation": [ 0, 0, 0 ], "rotation": [ -0.13959079166529637, -0.6590063691119785, -0.12632793024247307, 0.7281938412213848 ], "scale": [ 1, 1, 1 ], "name": "Key Light", "extensions": { "KHR_lights_punctual": { "light": 0 } } } ], "meshes": [ { "primitives": [ { "attributes": { "POSITION": 1, "NORMAL": 2, "TEXCOORD_0": 3 }, "indices": 0, "material": 0 } ], "name": "GlamVelvetSofa_legs" }, { "primitives": [ { "attributes": { "POSITION": 5, "NORMAL": 6, "TEXCOORD_0": 7 }, "extensions": { "KHR_materials_variants": { "mappings": [ { "material": 2, "variants": [ 0 ] }, { "material": 3, "variants": [ 1 ] }, { "material": 4, "variants": [ 2 ] }, { "material": 5, "variants": [ 3 ] }, { "material": 6, "variants": [ 4 ] } ] } }, "indices": 4, "material": 3 } ], "name": "GlamVelvetSofa_fabric" }, { "primitives": [ { "attributes": { "POSITION": 9, "NORMAL": 10, "TEXCOORD_0": 11 }, "indices": 8, "material": 1 } ], "name": "GlamVelvetSofa_feet" } ], "accessors": [ { "bufferView": 0, "componentType": 5123, "count": 918, "type": "SCALAR", "name": "accessorIndices" }, { "bufferView": 1, "componentType": 5126, "count": 342, "max": [ 0.967309833, 0.228355348, 0.392912269 ], "min": [ -1.07995892, 4.544779E-05, -0.62551266 ], "type": "VEC3", "name": "accessorPositions" }, { "bufferView": 1, "byteOffset": 4104, "componentType": 5126, "count": 342, "type": "VEC3", "name": "accessorNormals" }, { "bufferView": 2, "componentType": 5126, "count": 342, "type": "VEC2", "name": "accessorUVs" }, { "bufferView": 0, "byteOffset": 1836, "componentType": 5123, "count": 9726, "type": "SCALAR", "name": "accessorIndices" }, { "bufferView": 1, "byteOffset": 8208, "componentType": 5126, "count": 2092, "max": [ 1.07446992, 0.7875869, 0.382825553 ], "min": [ -1.11397314, 0.211583689, -0.6070921 ], "type": "VEC3", "name": "accessorPositions" }, { "bufferView": 1, "byteOffset": 33312, "componentType": 5126, "count": 2092, "type": "VEC3", "name": "accessorNormals" }, { "bufferView": 2, "byteOffset": 2736, "componentType": 5126, "count": 2092, "type": "VEC2", "name": "accessorUVs" }, { "bufferView": 0, "byteOffset": 21288, "componentType": 5123, "count": 1944, "type": "SCALAR", "name": "accessorIndices" }, { "bufferView": 1, "byteOffset": 58416, "componentType": 5126, "count": 684, "max": [ 0.969506, 0.0342675373, 0.3951283 ], "min": [ -1.08214879, 4.544779E-05, -0.627700269 ], "type": "VEC3", "name": "accessorPositions" }, { "bufferView": 1, "byteOffset": 66624, "componentType": 5126, "count": 684, "type": "VEC3", "name": "accessorNormals" }, { "bufferView": 2, "byteOffset": 19472, "componentType": 5126, "count": 684, "type": "VEC2", "name": "accessorUVs" } ], "bufferViews": [ { "buffer": 0, "byteLength": 25176, "name": "bufferViewScalar" }, { "buffer": 0, "byteOffset": 25176, "byteLength": 74832, "byteStride": 12, "name": "bufferViewFloatVec3" }, { "buffer": 0, "byteOffset": 100008, "byteLength": 24944, "byteStride": 8, "name": "bufferViewFloatVec2" } ], "buffers": [ { "uri": "GlamVelvetSofa.bin", "byteLength": 124952 } ], "materials": [ { "name": "GlamVelvetSofa_legs", "pbrMetallicRoughness": { "baseColorFactor": [ 0.02, 0.02, 0.02, 1.0 ], "metallicFactor": 0.0, "roughnessFactor": 0.4 }, "occlusionTexture": { "index": 0 } }, { "name": "GlamVelvetSofa_feet", "pbrMetallicRoughness": { "baseColorFactor": [ 1.0, 0.8, 0.7, 1.0 ], "roughnessFactor": 0.4 }, "occlusionTexture": { "index": 0 } }, { "name": "GlamVelvetSofa_fabric_champagne", "pbrMetallicRoughness": { "baseColorFactor": [ 0.075, 0.06, 0.04, 1 ], "metallicFactor": 0, "roughnessFactor": 0.7 }, "normalTexture": { "index": 1, "scale": 0.5, "extensions": { "KHR_texture_transform": { "rotation": 0, "scale": [ 5, 5 ], "texCoord": 0 } } }, "occlusionTexture": { "index": 0 }, "extensions": { "KHR_materials_specular": { "specularColorFactor": [ 0, 0, 0 ] }, "KHR_materials_sheen": { "sheenColorFactor": [ 0.9, 0.7, 0.6 ], "sheenRoughnessFactor": 0.6 } } }, { "name": "GlamVelvetSofa_fabric_navy", "pbrMetallicRoughness": { "baseColorFactor": [ 0.01, 0.01, 0.01, 1 ], "metallicFactor": 0, "roughnessFactor": 0.7 }, "normalTexture": { "index": 1, "scale": 0.75, "extensions": { "KHR_texture_transform": { "rotation": 0.36, "scale": [ 5, 5 ], "texCoord": 0 } } }, "occlusionTexture": { "index": 0 }, "extensions": { "KHR_materials_specular": { "specularColorFactor": [ 0.1, 0.34, 1 ] }, "KHR_materials_sheen": { "sheenColorFactor": [ 0.05, 0.17, 0.5 ], "sheenRoughnessFactor": 0.6 } } }, { "name": "GlamVelvetSofa_fabric_gray", "pbrMetallicRoughness": { "baseColorFactor": [ 0.25, 0.25, 0.225, 1 ], "metallicFactor": 0, "roughnessFactor": 1 }, "normalTexture": { "index": 1, "scale": 0.3, "extensions": { "KHR_texture_transform": { "rotation": 1.5, "scale": [ 5, 5 ], "texCoord": 0 } } }, "occlusionTexture": { "index": 0 }, "extensions": { "KHR_materials_specular": { "specularColorFactor": [ 0, 0, 0 ] }, "KHR_materials_sheen": { "sheenColorFactor": [ 0.85, 0.9, 1 ], "sheenRoughnessFactor": 1 } } }, { "name": "GlamVelvetSofa_fabric_black", "pbrMetallicRoughness": { "baseColorFactor": [ 0.01, 0.01, 0.01, 1 ], "metallicFactor": 0, "roughnessFactor": 0.5 }, "normalTexture": { "index": 1, "scale": 0.4, "extensions": { "KHR_texture_transform": { "rotation": 2, "scale": [ 5, 5 ], "texCoord": 0 } } }, "occlusionTexture": { "index": 0 }, "extensions": { "KHR_materials_specular": { "specularColorFactor": [ 0.12, 0.12, 0.13 ] }, "KHR_materials_sheen": { "sheenColorFactor": [ 0.12, 0.12, 0.13 ], "sheenRoughnessFactor": 0.3 } } }, { "name": "GlamVelvetSofa_fabric_palepink", "pbrMetallicRoughness": { "baseColorFactor": [ 0.76, 0.53, 0.54, 1 ], "metallicFactor": 0, "roughnessFactor": 0.75 }, "normalTexture": { "index": 1, "scale": 0.2, "extensions": { "KHR_texture_transform": { "rotation": 2.5, "scale": [ 5, 5 ], "texCoord": 0 } } }, "occlusionTexture": { "index": 0 }, "extensions": { "KHR_materials_specular": { "specularColorFactor": [ 1, 0.9, 0.9 ] }, "KHR_materials_sheen": { "sheenColorFactor": [ 1, 0.9, 0.9 ], "sheenRoughnessFactor": 0.85 } } } ], "textures": [ { "sampler": 0, "source": 0, "name": "GlamVelvetSofa_occlusion.png" }, { "sampler": 0, "source": 1, "name": "GlamVelvetSofa_normal.png" } ], "images": [ { "uri": "GlamVelvetSofa_occlusion.png" }, { "uri": "GlamVelvetSofa_normal.png" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9987 } ] } ================================================ FILE: examples/resources/models/gltf/LeePerrySmith/LeePerrySmith_License.txt ================================================ Creative Commons Licence Infinite, 3D Head Scan by Lee Perry-Smith is licensed under a Creative Commons Attribution 3.0 Unported License. Based on a work at www.triplegangers.com. Permissions beyond the scope of this license may be available at http://www.ir-ltd.net/ Please remember: Do what you want with the files, but always mention where you got them from... ================================================ FILE: examples/resources/models/gltf/NormalTangentMirrorTest/README.md ================================================ # Normal-Tangent Mirror Test ## Screenshot ![screenshot](screenshot/screenshot-larger.png) ## Description This model compares normal maps of various orientations to actual geometry, to test if the model's supplied tangent vectors are being imported and used correctly. Note that this model (`NormalTangentMirrorTest`) supplies tangent vectors, and specifically tests a rendering engine's ability to use the supplied vectors as opposed to generating them automatically. To test automatic generation of tangent vectors, see [`NormalTangentTest`](../NormalTangentTest/README.md). This test is best performed with an environment map that contains a clear horizon line, so it is easy to spot if the reflection of the horizon is level. The screenshot above shows a successful render of this model from the front. All of the test blocks show similar reflections. ## Top Down ![Top-down View](screenshot/top-down.png) Viewing off-axis, such as top-down in this case, breaks the illusion provided by normal-mapping. From this angle, the viewer can see the difference between real geometry on the left test cells, and normal-mapped quads on the rest. Normal-mapping works best when viewed face-on. ## Back Side ![Back-side View](screenshot/back-side.png) The back of the model shows concave geometry and normal maps, like looking into a set of mirror-bowls. It is expected to see the sky below the ground in the reflections. Above is a correct rendering of the back. ## Problem: Supplied Tangent Vectors Not Used ![Supplied Tangents Ignored](screenshot/supplied-tangents-ignored.png) The above image was taken in a different rendering engine with a different environment map, but the results should still be clear. A red border has been added for emphasis on the incorrect results. Here, the horizon line appears level in all the test blocks, but the two "Mirror" sets of tests show inverted reflections, as if seen from the back instead of the front. This problem is typically caused by a rendering engine that ignores the supplied tangent vectors and calculates its own. Without the supplied tangent vectors, the engine does not know that the geometry has been mirrored from the original normal-mapped column, and it calculates an inverted set of axes for the reflection vectors. ## Problem: Flipped Y Axis (or flipped green channel) ![Incorrect flipped Y](screenshot/incorrect-flipped-y.png) In the above image, note the test cells on the right three blocks of each set. A red border has been added for emphasis on the incorrect results. Here, the real geometry reflects level horizon lines, but the normal-mapped geometry appears to reflect several different orientations. This is a common problem, that often indicates the rendering engine has mis-interpreted the direction of the normal Y vector, supplied by the green channel of the normal map. Some systems intentionally use or expect left-handed normal maps, however, glTF [specifies](https://github.com/KhronosGroup/glTF/tree/065a01206014cd5f198085de6b4ce6f565ae79c6/specification/2.0#materialnormaltexture) that its own normal maps should use the OpenGL convention with right-handed coordinates. This issue can often be fixed by flipping the normal Y vector, or inverting the intensity of the green channel of the normal map. Fixes should be applied such that glTF models contain only the specified OpenGL normal convention, and rendering engines automatically adapt this to their own internal convention as needed. ## License Information Copyright 2017-2018 Analytical Graphics, Inc. CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ Model and textures by Ed Mackey. ================================================ FILE: examples/resources/models/gltf/NormalTangentMirrorTest/glTF/NormalTangentMirrorTest.gltf ================================================ { "accessors" : [ { "bufferView" : 0, "componentType" : 5123, "count" : 15720, "max" : [ 2769 ], "min" : [ 0 ], "type" : "SCALAR" }, { "bufferView" : 1, "componentType" : 5126, "count" : 2770, "max" : [ 1.4138822555541992, 1.0467524528503418, 0.08050008118152618 ], "min" : [ -1.4246257543563843, -1.2000000476837158, -0.009999947622418404 ], "type" : "VEC3" }, { "bufferView" : 2, "componentType" : 5126, "count" : 2770, "max" : [ 0.9247413277626038, 0.9247413277626038, 1.0 ], "min" : [ -0.9247413277626038, -0.9247413277626038, -1.0 ], "type" : "VEC3" }, { "bufferView" : 3, "componentType" : 5126, "count" : 2770, "max" : [ 1.0, 0.8718903064727783, 0.9247627258300781, 1.0 ], "min" : [ -1.0, -0.8827678561210632, -0.9247735142707825, -1.0 ], "type" : "VEC4" }, { "bufferView" : 4, "componentType" : 5126, "count" : 2770, "max" : [ 0.9821357727050781, 0.9877346605062485 ], "min" : [ 0.1472877860069275, 0.03816509246826172 ], "type" : "VEC2" } ], "asset" : { "copyright" : "Copyright 2017-2018 Analytical Graphics, Inc., CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Mesh and textures by Ed Mackey.", "generator" : "Khronos Blender glTF 2.0 exporter", "version" : "2.0" }, "bufferViews" : [ { "buffer" : 0, "byteLength" : 31440, "byteOffset" : 0, "target" : 34963 }, { "buffer" : 0, "byteLength" : 33240, "byteOffset" : 31440, "target" : 34962 }, { "buffer" : 0, "byteLength" : 33240, "byteOffset" : 64680, "target" : 34962 }, { "buffer" : 0, "byteLength" : 44320, "byteOffset" : 97920, "target" : 34962 }, { "buffer" : 0, "byteLength" : 22160, "byteOffset" : 142240, "target" : 34962 } ], "buffers" : [ { "byteLength" : 164400, "uri" : "NormalTangentMirrorTest.bin" } ], "images" : [ { "uri" : "NormalTangentMirrorTest_OcclusionRoughnessMetallic.png" }, { "uri" : "NormalTangentTest_Normal.png" }, { "uri" : "NormalTangentMirrorTest_BaseColor.png" } ], "materials" : [ { "doubleSided" : true, "name" : "Material", "normalTexture" : { "index" : 1 }, "occlusionTexture" : { "index" : 0 }, "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 2 }, "metallicRoughnessTexture" : { "index" : 0 } } } ], "meshes" : [ { "name" : "NormalTangentTest_low", "primitives" : [ { "attributes" : { "NORMAL" : 2, "POSITION" : 1, "TANGENT" : 3, "TEXCOORD_0" : 4 }, "indices" : 0, "material" : 0 } ] } ], "nodes" : [ { "mesh" : 0, "name" : "NormalTangentTest_low" } ], "samplers" : [ {} ], "scene" : 0, "scenes" : [ { "name" : "Scene", "nodes" : [ 0 ] } ], "textures" : [ { "sampler" : 0, "source" : 0 }, { "sampler" : 0, "source" : 1 }, { "sampler" : 0, "source" : 2 } ] } ================================================ FILE: examples/resources/models/gltf/NormalTangentTest/README.md ================================================ # Normal-Tangent Test ## Screenshot ![screenshot](screenshot/screenshot-larger.png) ## Description This model compares normal maps of various orientations to actual geometry, to test if tangent vectors are being calculated and handled correctly. Note that this model (`NormalTangentTest`) does not supply tangent vectors, and specifically tests a rendering engine's ability to generate the tangent vectors at runtime. To test supplied tangent vectors, see [`NormalTangentMirrorTest`](../NormalTangentMirrorTest/README.md). This test is best performed with an environment map that contains a clear horizon line, so it is easy to spot if the reflection of the horizon is level. The screenshot above shows a successful render of this model from the front. All of the test blocks show similar reflections. ## Top down ![Top-down View](screenshot/top-down.png) Viewing off-axis, such as top-down in this case, breaks the illusion provided by normal-mapping. From this angle, the viewer can see the difference between real geometry on the left test cells, and normal-mapped quads on the right. Normal-mapping works best when viewed face-on. ## Back Side ![Back-side View](screenshot/back-side.png) The back of the model shows concave geometry and normal maps, like looking into a set of mirror-bowls. It is expected to see the sky below the ground in the reflections. Above is a correct rendering of the back. ## Problem: Flipped Y Axis (or flipped green channel) ![Incorrect flipped Y](screenshot/incorrect-flipped-y.png) In the above image, note the test cells on the right half of each pair. A red border has been added for emphasis on the incorrect results. Here, the real geometry reflects level horizon lines, but the normal-mapped geometry appears to reflect several different orientations. This is a common problem, that often indicates the rendering engine has mis-interpreted the direction of the normal Y vector, supplied by the green channel of the normal map. Some systems intentionally use or expect left-handed normal maps, however, glTF [specifies](https://github.com/KhronosGroup/glTF/tree/065a01206014cd5f198085de6b4ce6f565ae79c6/specification/2.0#materialnormaltexture) that its own normal maps should use the OpenGL convention with right-handed coordinates. This issue can often be fixed by flipping the normal Y vector, or inverting the intensity of the green channel of the normal map. Fixes should be applied such that glTF models contain only the specified OpenGL normal convention, and rendering engines automatically adapt this to their own internal convention as needed. ## License Information Copyright 2017-2018 Analytical Graphics, Inc. CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ Model and textures by Ed Mackey. ================================================ FILE: examples/resources/models/gltf/NormalTangentTest/glTF/NormalTangentTest.gltf ================================================ { "asset": { "copyright": "Copyright 2017 Analytical Graphics, Inc., CC-BY 4.0 https://creativecommons.org/licenses/by/4.0/ - Mesh and textures by Ed Mackey, see: https://emackey.github.io/testing-pbr/normal-tangent-readme.html", "generator": "COLLADA2GLTF with hand-edits", "version": "2.0" }, "scene": 0, "scenes": [ { "nodes": [ 0 ] } ], "nodes": [ { "children": [ 1 ] }, { "mesh": 0 } ], "meshes": [ { "primitives": [ { "attributes": { "NORMAL": 1, "POSITION": 2, "TEXCOORD_0": 3 }, "indices": 0, "mode": 4, "material": 0 } ], "name": "NormalTangentTest_low" } ], "accessors": [ { "bufferView": 0, "byteOffset": 0, "componentType": 5123, "count": 23322, "max": [ 3982 ], "min": [ 0 ], "type": "SCALAR" }, { "bufferView": 1, "byteOffset": 0, "componentType": 5126, "count": 3983, "max": [ 0.9247629046440125, 0.9247735142707824, 1.0 ], "min": [ -0.9247629046440125, -0.9247629046440125, -1.0 ], "type": "VEC3" }, { "bufferView": 1, "byteOffset": 47796, "componentType": 5126, "count": 3983, "max": [ 1.1100000143051148, 0.9500001072883606, 0.08049999922513962 ], "min": [ -1.1100000143051148, -1.200000047683716, -0.009999989531934262 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 0, "componentType": 5126, "count": 3983, "max": [ 0.9821358323097228, 0.9877346754074096 ], "min": [ 0.0106734000146389, 0.03816509246826172 ], "type": "VEC2" } ], "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicRoughnessTexture": { "index": 1 } }, "occlusionTexture": { "index": 1 }, "normalTexture": { "index": 2 }, "doubleSided": true, "emissiveFactor": [ 0.0, 0.0, 0.0 ] } ], "textures": [ { "sampler": 0, "source": 0 }, { "sampler": 0, "source": 1 }, { "sampler": 0, "source": 2 } ], "images": [ { "uri": "NormalTangentTest_BaseColor.png" }, { "uri": "NormalTangentTest_OcclusionRoughnessMetallic.png" }, { "uri": "NormalTangentTest_Normal.png" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9986, "wrapS": 10497, "wrapT": 10497 } ], "bufferViews": [ { "buffer": 0, "byteOffset": 127456, "byteLength": 46644, "target": 34963 }, { "buffer": 0, "byteOffset": 0, "byteLength": 95592, "byteStride": 12, "target": 34962 }, { "buffer": 0, "byteOffset": 95592, "byteLength": 31864, "byteStride": 8, "target": 34962 } ], "buffers": [ { "byteLength": 174100, "uri": "NormalTangentTest0.bin" } ] } ================================================ FILE: examples/resources/models/gltf/Spheres/Spheres.gltf ================================================ { "materials": [ { "name": "(color 177 88 27)dimi.bmp", "occlusionTexture": { "index": 0, "texCoord": 1 }, "pbrMetallicRoughness": { "baseColorFactor": [ 0.694117665, 0.345098048, 0.105882354, 1.0 ], "metallicFactor": 0.1, "roughnessFactor": 0.5 } }, { "name": "01_-_Defaultqiuqiu2.bmp", "occlusionTexture": { "index": 1, "texCoord": 1 }, "pbrMetallicRoughness": { "baseColorTexture": { "index": 2, "texCoord": 0 }, "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 0.0, "roughnessFactor": 1 }, "alphaMode": "OPAQUE" }, { "name": "02_-_Defaultqiuqiu2.bmp", "occlusionTexture": { "index": 1, "texCoord": 1 }, "pbrMetallicRoughness": { "baseColorFactor": [ 0.5882353, 0.5882353, 0.5882353, 1.0 ], "metallicFactor": 0.0, "roughnessFactor": 0.0 }, "alphaMode": "OPAQUE" }, { "name": "03_-_Defaultqiuqiu2.bmp", "occlusionTexture": { "index": 1, "texCoord": 1 }, "pbrMetallicRoughness": { "baseColorTexture": { "index": 2, "texCoord": 0 }, "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 1.0, "roughnessFactor": 0.0 }, "alphaMode": "OPAQUE" }, { "name": "04_-_Defaultqiuqiu2.bmp", "occlusionTexture": { "index": 1, "texCoord": 1 }, "pbrMetallicRoughness": { "baseColorFactor": [ 0.5882353, 0.5882353, 0.5882353, 1.0 ], "metallicFactor": 1.0, "roughnessFactor": 0.6 }, "alphaMode": "OPAQUE" }, { "name": "05_-_Defaultqiuqiu2.bmp", "occlusionTexture": { "index": 1, "texCoord": 1 }, "pbrMetallicRoughness": { "baseColorFactor": [ 0.5882353, 0.5882353, 0.5882353, 1.0 ], "metallicFactor": 0.099999994, "roughnessFactor": 1 }, "alphaMode": "OPAQUE", "emissiveFactor": [ 0.9882353, 0.6745098, 0.0, 1.0 ] }, { "name": "06_-_Default", "pbrMetallicRoughness": { "baseColorTexture": { "index": 2, "texCoord": 0 }, "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 0.88, "roughnessFactor": 0.0 }, "alphaMode": "OPAQUE", "normalTexture": { "index": 3, "texCoord": 0, "scale": 1.00000012 } } ], "images": [ { "uri": "CC639F155DFE5CE150FF23C3D8F8C459.jpg" }, { "uri": "CC171C0A6CDE0AB24354127556E42957.jpg" }, { "uri": "417DB8B5D7E6316249EF1FB59148873A.jpg" }, { "uri": "8BB764BB7B4C3C1FAFA13B969D4F9CF1.jpg" } ], "textures": [ { "name": "dimi_f_bmp.jpg", "sampler": 0, "source": 0 }, { "name": "qiuqiu2_f_bmp.jpg", "sampler": 0, "source": 1 }, { "name": "楼顶2.jpg", "sampler": 0, "source": 2 }, { "name": "水.jpg", "sampler": 0, "source": 3 } ], "meshes": [ { "name": "Plane001", "primitives": [ { "material": 0, "mode": 4, "indices": 0, "attributes": { "COLOR_0": 3, "NORMAL": 2, "POSITION": 1, "TEXCOORD_0": 4, "TEXCOORD_1": 5 } } ] }, { "name": "Sphere001", "primitives": [ { "material": 1, "mode": 4, "indices": 6, "attributes": { "COLOR_0": 9, "NORMAL": 8, "POSITION": 7, "TEXCOORD_0": 10, "TEXCOORD_1": 11 } } ] }, { "name": "Sphere002", "primitives": [ { "material": 2, "mode": 4, "indices": 12, "attributes": { "COLOR_0": 15, "NORMAL": 14, "POSITION": 13, "TEXCOORD_0": 16, "TEXCOORD_1": 17 } } ] }, { "name": "Sphere003", "primitives": [ { "material": 3, "mode": 4, "indices": 18, "attributes": { "COLOR_0": 21, "NORMAL": 20, "POSITION": 19, "TEXCOORD_0": 22, "TEXCOORD_1": 23 } } ] }, { "name": "Sphere004", "primitives": [ { "material": 4, "mode": 4, "indices": 24, "attributes": { "COLOR_0": 27, "NORMAL": 26, "POSITION": 25, "TEXCOORD_0": 28, "TEXCOORD_1": 29 } } ] }, { "name": "Sphere005", "primitives": [ { "material": 5, "mode": 4, "indices": 30, "attributes": { "COLOR_0": 33, "NORMAL": 32, "POSITION": 31, "TEXCOORD_0": 34, "TEXCOORD_1": 35 } } ] }, { "name": "Sphere006", "primitives": [ { "material": 6, "mode": 4, "indices": 36, "attributes": { "COLOR_0": 39, "NORMAL": 38, "POSITION": 37, "TEXCOORD_0": 40, "TEXCOORD_1": 41 } } ] } ], "buffers": [ { "byteLength": 277736, "uri": "713E7264A7E5E61FD13590171F47525F.bin" } ], "bufferViews": [ { "buffer": 0, "target": 34963, "byteLength": 192, "byteOffset": 0 }, { "buffer": 0, "target": 34962, "byteLength": 300, "byteOffset": 192 }, { "buffer": 0, "target": 34962, "byteLength": 300, "byteOffset": 492 }, { "buffer": 0, "target": 34962, "byteLength": 400, "byteOffset": 792 }, { "buffer": 0, "target": 34962, "byteLength": 200, "byteOffset": 1192 }, { "buffer": 0, "target": 34962, "byteLength": 200, "byteOffset": 1392 }, { "buffer": 0, "target": 34963, "byteLength": 5760, "byteOffset": 1592 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 7352 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 15980 }, { "buffer": 0, "target": 34962, "byteLength": 11504, "byteOffset": 24608 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 36112 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 41864 }, { "buffer": 0, "target": 34963, "byteLength": 5760, "byteOffset": 47616 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 53376 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 62004 }, { "buffer": 0, "target": 34962, "byteLength": 11504, "byteOffset": 70632 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 82136 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 87888 }, { "buffer": 0, "target": 34963, "byteLength": 5760, "byteOffset": 93640 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 99400 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 108028 }, { "buffer": 0, "target": 34962, "byteLength": 11504, "byteOffset": 116656 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 128160 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 133912 }, { "buffer": 0, "target": 34963, "byteLength": 5760, "byteOffset": 139664 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 145424 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 154052 }, { "buffer": 0, "target": 34962, "byteLength": 11504, "byteOffset": 162680 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 174184 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 179936 }, { "buffer": 0, "target": 34963, "byteLength": 5760, "byteOffset": 185688 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 191448 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 200076 }, { "buffer": 0, "target": 34962, "byteLength": 11504, "byteOffset": 208704 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 220208 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 225960 }, { "buffer": 0, "target": 34963, "byteLength": 5760, "byteOffset": 231712 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 237472 }, { "buffer": 0, "target": 34962, "byteLength": 8628, "byteOffset": 246100 }, { "buffer": 0, "target": 34962, "byteLength": 11504, "byteOffset": 254728 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 266232 }, { "buffer": 0, "target": 34962, "byteLength": 5752, "byteOffset": 271984 } ], "accessors": [ { "componentType": 5123, "type": "SCALAR", "bufferView": 0, "byteOffset": 0, "count": 96 }, { "componentType": 5126, "type": "VEC3", "bufferView": 1, "byteOffset": 0, "count": 25, "min": [ -19.6646308898926, -19.430233001709, 0.0 ], "max": [ 19.6646308898926, 19.430233001709, 0.0 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 2, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 3, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC2", "bufferView": 4, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC2", "bufferView": 5, "byteOffset": 0, "count": 25 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 6, "byteOffset": 0, "count": 2880 }, { "componentType": 5126, "type": "VEC3", "bufferView": 7, "byteOffset": 0, "count": 719, "min": [ -4.53262519836426, -4.53262519836426, -4.53262519836426 ], "max": [ 4.53262519836426, 4.53262519836426, 4.53262519836426 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 8, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC4", "bufferView": 9, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 10, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 11, "byteOffset": 0, "count": 719 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 12, "byteOffset": 0, "count": 2880 }, { "componentType": 5126, "type": "VEC3", "bufferView": 13, "byteOffset": 0, "count": 719, "min": [ -4.53262519836426, -4.53262519836426, -4.53262519836426 ], "max": [ 4.53262519836426, 4.53262519836426, 4.53262519836426 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 14, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC4", "bufferView": 15, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 16, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 17, "byteOffset": 0, "count": 719 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 18, "byteOffset": 0, "count": 2880 }, { "componentType": 5126, "type": "VEC3", "bufferView": 19, "byteOffset": 0, "count": 719, "min": [ -4.53262519836426, -4.53262519836426, -4.53262519836426 ], "max": [ 4.53262519836426, 4.53262519836426, 4.53262519836426 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 20, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC4", "bufferView": 21, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 22, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 23, "byteOffset": 0, "count": 719 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 24, "byteOffset": 0, "count": 2880 }, { "componentType": 5126, "type": "VEC3", "bufferView": 25, "byteOffset": 0, "count": 719, "min": [ -4.53262519836426, -4.53262519836426, -4.53262519836426 ], "max": [ 4.53262519836426, 4.53262519836426, 4.53262519836426 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 26, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC4", "bufferView": 27, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 28, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 29, "byteOffset": 0, "count": 719 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 30, "byteOffset": 0, "count": 2880 }, { "componentType": 5126, "type": "VEC3", "bufferView": 31, "byteOffset": 0, "count": 719, "min": [ -4.53262519836426, -4.53262519836426, -4.53262519836426 ], "max": [ 4.53262519836426, 4.53262519836426, 4.53262519836426 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 32, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC4", "bufferView": 33, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 34, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 35, "byteOffset": 0, "count": 719 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 36, "byteOffset": 0, "count": 2880 }, { "componentType": 5126, "type": "VEC3", "bufferView": 37, "byteOffset": 0, "count": 719, "min": [ -4.53262519836426, -4.53262519836426, -4.53262519836426 ], "max": [ 4.53262519836426, 4.53262519836426, 4.53262519836426 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 38, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC4", "bufferView": 39, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 40, "byteOffset": 0, "count": 719 }, { "componentType": 5126, "type": "VEC2", "bufferView": 41, "byteOffset": 0, "count": 719 } ], "nodes": [ { "name": "RootNode", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 1, 2, 3, 4, 5, 6, 7, 8 ] }, { "name": "Plane001", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 0 }, { "name": "Sphere001", "translation": [ 9.90610790252686, 4.59714460372925, -12.4250316619873 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 1 }, { "name": "Sky001", "translation": [ 6.99357748031616, 0.0, 8.95987319946289 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "Sphere002", "translation": [ -8.55751132965088, 4.59714460372925, -12.4250316619873 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 2 }, { "name": "Sphere003", "translation": [ 9.90610790252686, 4.59714460372925, -0.347654342651367 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 3 }, { "name": "Sphere004", "translation": [ -8.55751132965088, 4.59714460372925, -0.347654342651367 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 4 }, { "name": "Sphere005", "translation": [ 9.90610790252686, 4.59714460372925, 11.7297229766846 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 5 }, { "name": "Sphere006", "translation": [ -8.55751132965088, 4.59714460372925, 11.7297229766846 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 6 } ], "asset": { "generator": "FBX2glTF", "version": "2.0" }, "scene": 0, "scenes": [ { "name": "Root Scene", "nodes": [ 0 ] } ], "samplers": [ {} ] } ================================================ FILE: examples/resources/models/gltf/TextureTransformTest/README.md ================================================ # Texture Transform Test ## Screenshot ![screenshot](screenshot/screenshot.jpg) ## Description This model demonstrates the usage of the KHR_texture_transform extension. There are six quads in this model using two main textures. UV Arrow Note: Both textures have a gray border and use a sampler that clamps and disables mipmapping. ### Offsets The top row tests different combinations of the offset parameter with UV coordinates of `(0.0, 0.0)` to `(0.5, 0.5)` and offsets of `(0.5, 0.0)`, `(0.0, 0.5)`, and `(0.5, 0.5)` respectively from left to right, using the UV texture. A yellow image indicates that offset was not applied. ### Rotation The bottom left quad tests the rotation parameter with UV coordinates of `(0.0, 0.0)` to `(1.0, 1.0)` and a rotation angle of `‪0.392699‬` radians or `22.5` degrees, using the arrow texture. The green marker indicates the correct rotation. The yellow marker indicates the rotation was not applied. The red marker indicates the rotation was applied in the opposite direction. ### Scale The bottom middle quad tests the scale parameter with UV coordinates of `(0.0, 0.0)` to `(1.0, 1.0)` and a scale of `1.5`, using the arrow texture. The green marker indicates the correct scale. The yellow marker indicates the scale was not applied. ### All The bottom right quad tests offset, rotation, and scale at the same time. If everything is supported correctly, the arrow should point to the green marker. ## License Information Donated by Microsoft for glTF testing ================================================ FILE: examples/resources/models/gltf/TextureTransformTest/glTF/TextureTransformTest.gltf ================================================ { "accessors": [ { "bufferView": 0, "componentType": 5126, "count": 4, "type": "VEC3", "max": [ 0.5, 0.5, 0.0 ], "min": [ -0.5, -0.5, 0.0 ], "name": "Positions" }, { "bufferView": 1, "componentType": 5126, "count": 4, "type": "VEC2", "name": "UV0" }, { "bufferView": 2, "componentType": 5126, "count": 4, "type": "VEC2", "name": "UV1" }, { "bufferView": 3, "componentType": 5125, "count": 6, "type": "SCALAR", "name": "Indices" } ], "asset": { "version": "2.0" }, "buffers": [ { "uri": "TextureTransformTest.bin", "byteLength": 136 } ], "bufferViews": [ { "buffer": 0, "byteLength": 48, "name": "Positions" }, { "buffer": 0, "byteOffset": 48, "byteLength": 32, "name": "UV0" }, { "buffer": 0, "byteOffset": 80, "byteLength": 32, "name": "UV1" }, { "buffer": 0, "byteOffset": 112, "byteLength": 24, "name": "Indices" } ], "extensionsUsed": [ "KHR_texture_transform" ], "images": [ { "uri": "UV.png" }, { "uri": "Arrow.png" }, { "uri": "Correct.png" }, { "uri": "NotSupported.png" }, { "uri": "Error.png" } ], "materials": [ { "name": "Offset U", "pbrMetallicRoughness": { "baseColorTexture": { "index": 0, "extensions": { "KHR_texture_transform": { "offset": [ 0.5, 0.0 ] } } }, "metallicFactor": 0 } }, { "name": "Offset V", "pbrMetallicRoughness": { "baseColorTexture": { "index": 0, "extensions": { "KHR_texture_transform": { "offset": [ 0.0, 0.5 ] } } }, "metallicFactor": 0 } }, { "name": "Offset UV", "pbrMetallicRoughness": { "baseColorTexture": { "index": 0, "extensions": { "KHR_texture_transform": { "offset": [ 0.5, 0.5 ] } } }, "metallicFactor": 0 } }, { "name": "Rotation", "pbrMetallicRoughness": { "baseColorTexture": { "index": 1, "extensions": { "KHR_texture_transform": { "rotation": 0.39269908169872415480783042290994 } } }, "metallicFactor": 0 } }, { "name": "Scale", "pbrMetallicRoughness": { "baseColorTexture": { "index": 1, "extensions": { "KHR_texture_transform": { "scale": [ 1.5, 1.5 ] } } }, "metallicFactor": 0 } }, { "name": "All", "pbrMetallicRoughness": { "baseColorTexture": { "index": 1, "extensions": { "KHR_texture_transform": { "offset": [ -0.2, -0.1 ], "rotation": 0.3, "scale": [ 1.5, 1.5 ] } } }, "metallicFactor": 0 } }, { "name": "Correct", "pbrMetallicRoughness": { "baseColorTexture": { "index": 2 }, "metallicFactor": 0 } }, { "name": "NotSupported", "pbrMetallicRoughness": { "baseColorTexture": { "index": 3 }, "metallicFactor": 0 } }, { "name": "Error", "pbrMetallicRoughness": { "baseColorTexture": { "index": 4 }, "metallicFactor": 0 } } ], "meshes": [ { "name": "Offset U", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 2 }, "indices": 3, "material": 0 } ] }, { "name": "Offset V", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 2 }, "indices": 3, "material": 1 } ] }, { "name": "Offset UV", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 2 }, "indices": 3, "material": 2 } ] }, { "name": "Rotation", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 1 }, "indices": 3, "material": 3 } ] }, { "name": "Scale", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 1 }, "indices": 3, "material": 4 } ] }, { "name": "All", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 1 }, "indices": 3, "material": 5 } ] }, { "name": "Correct Marker", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 1 }, "indices": 3, "material": 6 } ] }, { "name": "Not Supported Marker", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 1 }, "indices": 3, "material": 7 } ] }, { "name": "Error Marker", "primitives": [ { "attributes": { "POSITION": 0, "TEXCOORD_0": 1 }, "indices": 3, "material": 8 } ] } ], "nodes": [ { "name": "Offset U", "mesh": 0, "translation": [ -1.1, 0.55, 0 ] }, { "name": "Offset V", "mesh": 1, "translation": [ 0, 0.55, 0 ] }, { "name": "Offset UV", "mesh": 2, "translation": [ 1.1, 0.55, 0 ] }, { "name": "Rotation", "mesh": 3, "translation": [ -1.1, -0.55, 0 ], "children": [ 4, 5, 6 ] }, { "name": "Rotation - Correct", "mesh": 6, "translation": [ -0.07904822439840125109869401756656, -0.51626748576241543174100150833647, 0.01 ], "scale": [ 0.15, 0.15, 0.15 ] }, { "name": "Rotation - Not Supported", "mesh": 7, "translation": [ 0.27781745930520227684092879831533, -0.27781745930520227684092879831533, 0.01 ], "scale": [ 0.15, 0.15, 0.15 ] }, { "name": "Rotation - Error", "mesh": 8, "translation": [ 0.51626748576241543174100150833647, 0.07904822439840125109869401756656, 0.01 ], "scale": [ 0.15, 0.15, 0.15 ] }, { "name": "Scale", "mesh": 4, "translation": [ 0, -0.55, 0 ], "children": [ 8, 9 ] }, { "name": "Scale - Correct", "mesh": 6, "translation": [ 0.01854497287013485122728586554355, -0.01854497287013485122728586554355, 0.01 ], "scale": [ 0.1, 0.1, 0.1 ] }, { "name": "Scale - Not Supported", "mesh": 7, "translation": [ 0.27781745930520227684092879831533, -0.27781745930520227684092879831533, 0.01 ], "scale": [ 0.15, 0.15, 0.15 ] }, { "name": "All", "mesh": 5, "translation": [ 1.1, -0.55, 0 ], "children": [ 11 ] }, { "name": "All - Correct", "mesh": 6, "translation": [ -0.07, -0.25, 0.01 ], "scale": [ 0.1, 0.1, 0.1 ] } ], "scene": 0, "scenes": [ { "nodes": [ 0, 1, 2, 3, 7, 10 ] } ], "textures": [ { "source": 0, "sampler": 0 }, { "source": 1, "sampler": 0 }, { "source": 2 }, { "source": 3 }, { "source": 4 } ], "samplers": [ { "wrapS": 33071, "wrapT": 33071, "magFilter": 9729, "minFilter": 9729 } ] } ================================================ FILE: examples/resources/models/gltf/UinoDog/README.md ================================================ # UINO Dog ## License Information Donated by UINO for glTF testing. ================================================ FILE: examples/resources/models/gltf/UinoDog/glTF/robot.gltf ================================================ { "asset" : { "generator" : "Khronos glTF Blender I/O v1.7.33", "version" : "2.0" }, "scene" : 0, "scenes" : [ { "name" : "Scene", "nodes" : [ 43 ] } ], "nodes" : [ { "name" : "eye", "rotation" : [ 1.0308056898290438e-13, 2.2795231302552565e-07, -4.546038212538406e-07, 1 ], "translation" : [ 8.70398721986021e-08, -0.0648142397403717, 0.3108687698841095 ] }, { "name" : "Leg_B_L_Link1", "rotation" : [ -0.6296749114990234, 0.3217291533946991, -0.32172930240631104, 0.6296746730804443 ], "scale" : [ 1, 1.0000001192092896, 1 ], "translation" : [ 0.441219300031662, 0.04513220489025116, 0.05038616061210632 ] }, { "name" : "Leg_B_L_Link3", "rotation" : [ -0.3798401355743408, 0.5964224338531494, -0.5964247584342957, 0.3798412084579468 ], "scale" : [ 1, 1.0000001192092896, 1.0000001192092896 ], "translation" : [ 0.4443120062351227, -0.0605289489030838, 0.05038616061210632 ] }, { "name" : "Leg_B_L_Link2", "rotation" : [ -0.45005878806114197, -0.8929097652435303, -0.011286498047411442, 0.005648559890687466 ], "scale" : [ 0.9999994039535522, 0.9999996423721313, 0.9999997615814209 ], "translation" : [ 0.046388328075408936, 0.0007264270097948611, 0.0020529215689748526 ] }, { "name" : "Leg_B_L_Link4", "rotation" : [ -0.8404396176338196, -0.5417584180831909, -0.006868395954370499, 0.010589773766696453 ], "translation" : [ 0.0051451437175273895, 0.454822838306427, 0.013515406288206577 ] }, { "name" : "Leg_B_L_Down", "rotation" : [ 0.29947230219841003, -6.203210432431661e-06, 0.004826804623007774, 0.954092800617218 ], "scale" : [ 1.0000003576278687, 0.9999998211860657, 0.9999999403953552 ], "translation" : [ -2.6339895953242376e-07, 0.6127797961235046, 4.17618792880603e-08 ] }, { "children" : [ 3, 4, 5 ], "name" : "Leg_B_L_Up", "rotation" : [ -0.00010586287680780515, -0.012619905173778534, 0.9999052882194519, 0.005493273492902517 ], "scale" : [ 1, 0.9999990463256836, 1.0000003576278687 ], "translation" : [ 0.7679466605186462, 0.24811120331287384, 0.04835561290383339 ] }, { "name" : "Leg_B_R_Link1", "rotation" : [ -0.62967449426651, -0.3217299282550812, 0.32173025608062744, 0.6296742558479309 ], "scale" : [ 0.9999999403953552, 1, 0.9999999403953552 ], "translation" : [ -0.4414442777633667, 0.045131124556064606, 0.050386156886816025 ] }, { "name" : "Leg_B_R_Link3", "rotation" : [ -0.3798385262489319, -0.5964243412017822, 0.5964241623878479, 0.3798406720161438 ], "scale" : [ 0.9999998807907104, 1, 0.9999998807907104 ], "translation" : [ -0.4445367455482483, -0.060530126094818115, 0.050386156886816025 ] }, { "name" : "Leg_B_R_Link2", "rotation" : [ -0.4500632584095001, 0.892907440662384, 0.011128860525786877, 0.005960808601230383 ], "scale" : [ 0.9999999403953552, 0.9999996423721313, 0.9999998807907104 ], "translation" : [ -0.04638973996043205, 0.0007261708960868418, 0.0020204083994030952 ] }, { "name" : "Leg_B_R_Link4", "rotation" : [ -0.8404421806335449, 0.5417541265487671, 0.006575463339686394, 0.010779684409499168 ], "scale" : [ 0.9999997019767761, 0.9999995827674866, 1 ], "translation" : [ -0.005154602695256472, 0.45482316613197327, 0.013511735014617443 ] }, { "name" : "Leg_B_R_Down", "rotation" : [ 0.29945918917655945, -0.003295654896646738, -0.005653269123286009, 0.9540867209434509 ], "scale" : [ 1.0000003576278687, 0.9999997615814209, 1.000000238418579 ], "translation" : [ 3.6483228882389085e-07, 0.6127797365188599, -1.927717008243235e-08 ] }, { "children" : [ 9, 10, 11 ], "name" : "Leg_B_R_Up", "rotation" : [ 0.00024454703088849783, 0.012622637674212456, -0.9999052286148071, 0.005490147043019533 ], "scale" : [ 1, 0.9999997615814209, 1.0000004768371582 ], "translation" : [ -0.7681720852851868, 0.2481093853712082, 0.04835561662912369 ] }, { "name" : "Leg_A_L_Down_end", "rotation" : [ -2.1551676354647498e-07, 3.0046066967770457e-07, -2.686984998945263e-07, 1 ], "scale" : [ 1.0000001192092896, 1, 1 ], "translation" : [ 8.85920599102974e-08, 0.27570343017578125, 4.337918824148801e-08 ] }, { "children" : [ 13 ], "name" : "Leg_A_L_Down", "rotation" : [ -0.0008819869835861027, 0.0009771108161658049, 0.7443721890449524, 0.6677637696266174 ], "scale" : [ 1, 1.000000238418579, 0.9999999403953552 ], "translation" : [ 7.795063794446833e-08, 0.2757039964199066, 3.4930611292338654e-08 ] }, { "children" : [ 14 ], "name" : "Leg_A_L_Middle", "rotation" : [ 0.2969473600387573, 0.21951113641262054, -0.616892397403717, 0.695040225982666 ], "scale" : [ 0.9999996423721313, 0.9999998807907104, 1.000001072883606 ], "translation" : [ -4.584470758572934e-08, 0.38095247745513916, 2.3436843576973843e-08 ] }, { "children" : [ 15 ], "name" : "Leg_A_L_Up", "rotation" : [ 0.9282538294792175, -0.04346515238285065, 0.015678953379392624, 0.3690660893917084 ], "scale" : [ 0.9999998211860657, 0.9999999403953552, 1 ], "translation" : [ -3.894461144682282e-07, 0.10024332255125046, 0.18828915059566498 ] }, { "name" : "Leg_A_R_Down_end", "rotation" : [ 2.701376047298254e-07, -3.71146626321206e-07, 5.271398606510047e-08, 1 ], "scale" : [ 1, 0.9999999403953552, 0.9999999403953552 ], "translation" : [ -8.38190601371025e-08, 0.275703102350235, -2.8522335604463933e-09 ] }, { "children" : [ 17 ], "name" : "Leg_A_R_Down", "rotation" : [ -0.0008820351795293391, 0.0009770785691216588, 0.744371771812439, 0.6677641868591309 ], "scale" : [ 1.000000238418579, 0.9999995231628418, 1 ], "translation" : [ 1.4117754743026012e-09, 0.2757038176059723, -1.5192098246075147e-08 ] }, { "children" : [ 18 ], "name" : "Leg_A_R_Middle", "rotation" : [ -0.24434509873390198, -0.27721354365348816, -0.6395540237426758, 0.6741058826446533 ], "scale" : [ 0.9999989867210388, 0.9999992847442627, 1.000000238418579 ], "translation" : [ 7.271583335466403e-09, 0.3809526860713959, 4.090584937443964e-08 ] }, { "children" : [ 19 ], "name" : "Leg_A_R_Up", "rotation" : [ -0.9262985587120056, 0.07426314055919647, -0.062222350388765335, 0.36412161588668823 ], "scale" : [ 0.9999999403953552, 1, 0.9999991655349731 ], "translation" : [ -2.3118383296605316e-07, 0.10024376958608627, -0.18813546001911163 ] }, { "children" : [ 16, 20 ], "name" : "HIP", "rotation" : [ 0.7071070671081543, -4.045504624627938e-07, 0.7071065902709961, 1.1858617909865643e-07 ], "scale" : [ 1.0000001192092896, 1, 1.000000238418579 ], "translation" : [ 8.891195071858427e-14, 0.020288586616516113, 2.0145551005157358e-08 ] }, { "children" : [ 21 ], "name" : "ROOT", "rotation" : [ -0.5861675143241882, 9.95548035120919e-08, 7.202726948207783e-08, 0.8101899027824402 ], "scale" : [ 0.9999998807907104, 0.9999999403953552, 0.9999997615814209 ], "translation" : [ -1.8099596488241332e-08, 0.40599846839904785, -0.07364848256111145 ] }, { "children" : [ 22 ], "name" : "Link3", "rotation" : [ -0.009425217285752296, 2.8262139850632195e-10, 6.880784830798348e-09, 0.9999555945396423 ], "scale" : [ 1.0000001192092896, 0.9999999403953552, 1 ], "translation" : [ 2.4287780377922445e-14, 0.2067003846168518, -8.711758425761218e-08 ] }, { "children" : [ 23 ], "name" : "Link2", "rotation" : [ 0.011704010888934135, -7.68776223236678e-11, 1.2174924179930713e-08, 0.9999315142631531 ], "scale" : [ 0.9999998807907104, 0.9999996423721313, 0.9999995827674866 ], "translation" : [ 2.986810289113545e-14, 0.2237572818994522, -4.517870877407404e-07 ] }, { "children" : [ 24 ], "name" : "Link1", "rotation" : [ -0.8115238547325134, -6.138199637462094e-07, 5.00432633998571e-07, 0.5843193531036377 ], "scale" : [ 1, 0.9999998211860657, 1.0000004768371582 ], "translation" : [ 6.952578956997968e-09, -0.00516811478883028, -0.3183101713657379 ] }, { "name" : "doorLink", "rotation" : [ -0.9496852159500122, 6.584051337986396e-13, 1.525633706478402e-06, 0.31320610642433167 ], "scale" : [ 1, 0.9999998211860657, 0.9999994039535522 ], "translation" : [ -7.833469339857402e-08, 0.3991953134536743, -0.04876171052455902 ] }, { "children" : [ 26 ], "name" : "door", "rotation" : [ -0.7074362635612488, -1.0429287158331135e-06, 1.0426371090943576e-06, 0.7067772150039673 ], "scale" : [ 1, 1.0000001192092896, 1.000000238418579 ], "translation" : [ -5.693180469279469e-07, 0.4238869845867157, 0.2092338502407074 ] }, { "children" : [ 0, 1, 2, 6, 7, 8, 12, 25, 27 ], "name" : "Bone", "rotation" : [ -9.942360179593379e-08, 1.798178272949258e-11, -6.726625088049332e-07, 1 ], "translation" : [ -2.274414651840667e-13, 1.0302940607070923, 0.4585784375667572 ] }, { "name" : "Foor_B_L_Up", "rotation" : [ 0.505608320236206, 0.0015724850818514824, 5.2286672769241704e-09, 0.8627618551254272 ], "scale" : [ 0.9999998211860657, 0.9999997615814209, 0.9999999403953552 ], "translation" : [ 0.00020509983005467802, -0.065970279276371, 0.08358170092105865 ] }, { "name" : "Foor_B_L_Down", "rotation" : [ -0.5269593596458435, -0.0016388531075790524, 2.7703617178076456e-08, 0.8498889207839966 ], "scale" : [ 0.9999999403953552, 0.9999996423721313, 0.9999997019767761 ], "translation" : [ -0.0001929824211401865, 0.062028367072343826, 0.08038971573114395 ] }, { "children" : [ 29, 30 ], "name" : "Foor_B_L", "rotation" : [ 0.0010857508750632405, -0.6982361674308777, 0.7158657908439636, 0.0011132085928693414 ], "scale" : [ 1, 1.0000003576278687, 1.0000004768371582 ], "translation" : [ 0.7612166404724121, 0.16786102950572968, 0.8199025988578796 ] }, { "name" : "Foot_B_R_Up", "rotation" : [ 0.5056081414222717, 0.0015727386344224215, -4.945306741888089e-08, 0.8627619743347168 ], "scale" : [ 0.9999999403953552, 1.0000001192092896, 1.000000238418579 ], "translation" : [ 0.0006378455436788499, -0.06596884876489639, 0.08358174562454224 ] }, { "name" : "Foot_B_R_Down", "rotation" : [ -0.5269593000411987, -0.0016390724340453744, -2.7395419266440513e-10, 0.8498889803886414 ], "scale" : [ 1, 1.0000001192092896, 0.9999999403953552 ], "translation" : [ 0.00023975693329703063, 0.06202973052859306, 0.08038969337940216 ] }, { "children" : [ 32, 33 ], "name" : "Foot_B_R", "rotation" : [ 0.0010858702007681131, -0.6982361674308777, 0.7158657908439636, 0.0011134578380733728 ], "scale" : [ 1.0000001192092896, 0.9999999403953552, 0.9999997019767761 ], "translation" : [ -0.7614412903785706, 0.16786102950572968, 0.8199025392532349 ] }, { "name" : "Foot_A_L", "rotation" : [ -0.5028163194656372, 0.5050809979438782, -0.49486684799194336, 0.49716776609420776 ], "scale" : [ 1.0000001192092896, 0.9999998807907104, 1 ], "translation" : [ 0.44878876209259033, 0.1091223955154419, -0.7555992007255554 ] }, { "name" : "Foot_A_R", "rotation" : [ -0.5028164386749268, 0.5050811171531677, -0.49486684799194336, 0.49716758728027344 ], "scale" : [ 1, 0.9999998807907104, 0.9999998211860657 ], "translation" : [ -0.4486347734928131, 0.10912244766950607, -0.7555995583534241 ] }, { "children" : [ 28, 31, 34, 35, 36 ], "name" : "root", "rotation" : [ 1.1634129748472333e-07, 0, 0, 1 ], "translation" : [ 0, 8.239450721703179e-08, -0.5057339072227478 ] }, { "mesh" : 0, "name" : "body.002", "skin" : 0 }, { "mesh" : 1, "name" : "body.003", "skin" : 0 }, { "mesh" : 2, "name" : "body.004", "skin" : 0 }, { "mesh" : 3, "name" : "body.005", "skin" : 0 }, { "mesh" : 4, "name" : "body.007", "skin" : 0 }, { "children" : [ 38, 39, 40, 41, 42, 37 ], "name" : "\u9aa8\u67b6.004", "translation" : [ 0, 0, 0.5057339072227478 ] } ], "animations" : [ { "channels" : [ { "sampler" : 0, "target" : { "node" : 28, "path" : "translation" } }, { "sampler" : 1, "target" : { "node" : 28, "path" : "rotation" } }, { "sampler" : 2, "target" : { "node" : 28, "path" : "scale" } }, { "sampler" : 3, "target" : { "node" : 0, "path" : "translation" } }, { "sampler" : 4, "target" : { "node" : 0, "path" : "rotation" } }, { "sampler" : 5, "target" : { "node" : 0, "path" : "scale" } }, { "sampler" : 6, "target" : { "node" : 1, "path" : "translation" } }, { "sampler" : 7, "target" : { "node" : 1, "path" : "rotation" } }, { "sampler" : 8, "target" : { "node" : 1, "path" : "scale" } }, { "sampler" : 9, "target" : { "node" : 2, "path" : "translation" } }, { "sampler" : 10, "target" : { "node" : 2, "path" : "rotation" } }, { "sampler" : 11, "target" : { "node" : 2, "path" : "scale" } }, { "sampler" : 12, "target" : { "node" : 6, "path" : "translation" } }, { "sampler" : 13, "target" : { "node" : 6, "path" : "rotation" } }, { "sampler" : 14, "target" : { "node" : 6, "path" : "scale" } }, { "sampler" : 15, "target" : { "node" : 3, "path" : "translation" } }, { "sampler" : 16, "target" : { "node" : 3, "path" : "rotation" } }, { "sampler" : 17, "target" : { "node" : 3, "path" : "scale" } }, { "sampler" : 18, "target" : { "node" : 4, "path" : "translation" } }, { "sampler" : 19, "target" : { "node" : 4, "path" : "rotation" } }, { "sampler" : 20, "target" : { "node" : 4, "path" : "scale" } }, { "sampler" : 21, "target" : { "node" : 5, "path" : "translation" } }, { "sampler" : 22, "target" : { "node" : 5, "path" : "rotation" } }, { "sampler" : 23, "target" : { "node" : 5, "path" : "scale" } }, { "sampler" : 24, "target" : { "node" : 7, "path" : "translation" } }, { "sampler" : 25, "target" : { "node" : 7, "path" : "rotation" } }, { "sampler" : 26, "target" : { "node" : 7, "path" : "scale" } }, { "sampler" : 27, "target" : { "node" : 8, "path" : "translation" } }, { "sampler" : 28, "target" : { "node" : 8, "path" : "rotation" } }, { "sampler" : 29, "target" : { "node" : 8, "path" : "scale" } }, { "sampler" : 30, "target" : { "node" : 12, "path" : "translation" } }, { "sampler" : 31, "target" : { "node" : 12, "path" : "rotation" } }, { "sampler" : 32, "target" : { "node" : 12, "path" : "scale" } }, { "sampler" : 33, "target" : { "node" : 9, "path" : "translation" } }, { "sampler" : 34, "target" : { "node" : 9, "path" : "rotation" } }, { "sampler" : 35, "target" : { "node" : 9, "path" : "scale" } }, { "sampler" : 36, "target" : { "node" : 10, "path" : "translation" } }, { "sampler" : 37, "target" : { "node" : 10, "path" : "rotation" } }, { "sampler" : 38, "target" : { "node" : 10, "path" : "scale" } }, { "sampler" : 39, "target" : { "node" : 11, "path" : "translation" } }, { "sampler" : 40, "target" : { "node" : 11, "path" : "rotation" } }, { "sampler" : 41, "target" : { "node" : 11, "path" : "scale" } }, { "sampler" : 42, "target" : { "node" : 25, "path" : "translation" } }, { "sampler" : 43, "target" : { "node" : 25, "path" : "rotation" } }, { "sampler" : 44, "target" : { "node" : 25, "path" : "scale" } }, { "sampler" : 45, "target" : { "node" : 24, "path" : "translation" } }, { "sampler" : 46, "target" : { "node" : 24, "path" : "rotation" } }, { "sampler" : 47, "target" : { "node" : 24, "path" : "scale" } }, { "sampler" : 48, "target" : { "node" : 23, "path" : "translation" } }, { "sampler" : 49, "target" : { "node" : 23, "path" : "rotation" } }, { "sampler" : 50, "target" : { "node" : 23, "path" : "scale" } }, { "sampler" : 51, "target" : { "node" : 22, "path" : "translation" } }, { "sampler" : 52, "target" : { "node" : 22, "path" : "rotation" } }, { "sampler" : 53, "target" : { "node" : 22, "path" : "scale" } }, { "sampler" : 54, "target" : { "node" : 21, "path" : "translation" } }, { "sampler" : 55, "target" : { "node" : 21, "path" : "rotation" } }, { "sampler" : 56, "target" : { "node" : 21, "path" : "scale" } }, { "sampler" : 57, "target" : { "node" : 16, "path" : "translation" } }, { "sampler" : 58, "target" : { "node" : 16, "path" : "rotation" } }, { "sampler" : 59, "target" : { "node" : 16, "path" : "scale" } }, { "sampler" : 60, "target" : { "node" : 15, "path" : "translation" } }, { "sampler" : 61, "target" : { "node" : 15, "path" : "rotation" } }, { "sampler" : 62, "target" : { "node" : 15, "path" : "scale" } }, { "sampler" : 63, "target" : { "node" : 14, "path" : "translation" } }, { "sampler" : 64, "target" : { "node" : 14, "path" : "rotation" } }, { "sampler" : 65, "target" : { "node" : 14, "path" : "scale" } }, { "sampler" : 66, "target" : { "node" : 20, "path" : "translation" } }, { "sampler" : 67, "target" : { "node" : 20, "path" : "rotation" } }, { "sampler" : 68, "target" : { "node" : 20, "path" : "scale" } }, { "sampler" : 69, "target" : { "node" : 19, "path" : "translation" } }, { "sampler" : 70, "target" : { "node" : 19, "path" : "rotation" } }, { "sampler" : 71, "target" : { "node" : 19, "path" : "scale" } }, { "sampler" : 72, "target" : { "node" : 18, "path" : "translation" } }, { "sampler" : 73, "target" : { "node" : 18, "path" : "rotation" } }, { "sampler" : 74, "target" : { "node" : 18, "path" : "scale" } }, { "sampler" : 75, "target" : { "node" : 27, "path" : "translation" } }, { "sampler" : 76, "target" : { "node" : 27, "path" : "rotation" } }, { "sampler" : 77, "target" : { "node" : 27, "path" : "scale" } }, { "sampler" : 78, "target" : { "node" : 26, "path" : "translation" } }, { "sampler" : 79, "target" : { "node" : 26, "path" : "rotation" } }, { "sampler" : 80, "target" : { "node" : 26, "path" : "scale" } }, { "sampler" : 81, "target" : { "node" : 31, "path" : "translation" } }, { "sampler" : 82, "target" : { "node" : 31, "path" : "rotation" } }, { "sampler" : 83, "target" : { "node" : 31, "path" : "scale" } }, { "sampler" : 84, "target" : { "node" : 29, "path" : "translation" } }, { "sampler" : 85, "target" : { "node" : 29, "path" : "rotation" } }, { "sampler" : 86, "target" : { "node" : 29, "path" : "scale" } }, { "sampler" : 87, "target" : { "node" : 30, "path" : "translation" } }, { "sampler" : 88, "target" : { "node" : 30, "path" : "rotation" } }, { "sampler" : 89, "target" : { "node" : 30, "path" : "scale" } }, { "sampler" : 90, "target" : { "node" : 34, "path" : "translation" } }, { "sampler" : 91, "target" : { "node" : 34, "path" : "rotation" } }, { "sampler" : 92, "target" : { "node" : 34, "path" : "scale" } }, { "sampler" : 93, "target" : { "node" : 32, "path" : "translation" } }, { "sampler" : 94, "target" : { "node" : 32, "path" : "rotation" } }, { "sampler" : 95, "target" : { "node" : 32, "path" : "scale" } }, { "sampler" : 96, "target" : { "node" : 33, "path" : "translation" } }, { "sampler" : 97, "target" : { "node" : 33, "path" : "rotation" } }, { "sampler" : 98, "target" : { "node" : 33, "path" : "scale" } }, { "sampler" : 99, "target" : { "node" : 35, "path" : "translation" } }, { "sampler" : 100, "target" : { "node" : 35, "path" : "rotation" } }, { "sampler" : 101, "target" : { "node" : 35, "path" : "scale" } }, { "sampler" : 102, "target" : { "node" : 36, "path" : "translation" } }, { "sampler" : 103, "target" : { "node" : 36, "path" : "rotation" } }, { "sampler" : 104, "target" : { "node" : 36, "path" : "scale" } } ], "name" : "run", "samplers" : [ { "input" : 35, "interpolation" : "LINEAR", "output" : 36 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 37 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 39 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 40 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 41 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 42 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 43 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 44 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 45 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 46 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 47 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 48 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 49 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 50 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 51 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 52 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 53 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 54 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 55 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 56 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 57 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 58 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 59 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 60 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 61 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 62 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 63 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 64 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 65 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 66 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 67 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 68 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 69 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 70 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 71 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 72 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 73 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 74 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 75 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 76 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 77 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 78 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 79 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 80 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 81 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 82 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 83 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 84 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 85 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 86 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 87 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 88 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 89 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 90 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 91 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 92 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 93 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 94 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 95 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 96 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 97 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 98 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 99 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 100 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 101 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 102 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 103 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 104 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 105 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 106 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 107 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 108 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 109 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 110 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 111 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 112 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 113 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 114 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 115 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 116 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 117 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 118 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 119 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 120 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 121 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 122 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 123 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 124 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 125 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 126 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 127 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 128 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 129 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 130 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 131 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 132 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 133 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 134 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 135 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 136 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 137 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 138 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 139 }, { "input" : 35, "interpolation" : "LINEAR", "output" : 140 }, { "input" : 38, "interpolation" : "LINEAR", "output" : 141 } ] } ], "materials" : [ { "doubleSided" : true, "name" : "PBRLegB", "normalTexture" : { "index" : 0, "scale" : 0.4000000059604645 }, "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 1 }, "metallicRoughnessTexture" : { "index" : 2 } } }, { "doubleSided" : true, "name" : "PBRBody", "normalTexture" : { "index" : 3, "scale" : 0.4000000059604645 }, "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 4 }, "metallicRoughnessTexture" : { "index" : 5 } } }, { "doubleSided" : true, "emissiveFactor" : [ 1, 1, 1 ], "emissiveTexture" : { "index" : 6 }, "name" : "light.006", "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 7 }, "metallicFactor" : 0 } }, { "alphaMode" : "BLEND", "doubleSided" : true, "name" : "glass.005", "pbrMetallicRoughness" : { "baseColorFactor" : [ 0.32209986448287964, 0.6948907971382141, 0.8000000715255737, 0.40979379415512085 ], "metallicFactor" : 0, "roughnessFactor" : 0.20360827445983887 } }, { "doubleSided" : true, "name" : "PBRLegA", "normalTexture" : { "index" : 8, "scale" : 0.4000000059604645 }, "pbrMetallicRoughness" : { "baseColorTexture" : { "index" : 9 }, "metallicRoughnessTexture" : { "index" : 10 } } } ], "meshes" : [ { "name" : "\u7403\u4f53.001", "primitives" : [ { "attributes" : { "POSITION" : 0, "NORMAL" : 1, "TEXCOORD_0" : 2, "TEXCOORD_1" : 3, "JOINTS_0" : 4, "WEIGHTS_0" : 5 }, "indices" : 6, "material" : 0 } ] }, { "name" : "\u7403\u4f53.004", "primitives" : [ { "attributes" : { "POSITION" : 8, "NORMAL" : 9, "TEXCOORD_0" : 10, "TEXCOORD_1" : 11, "JOINTS_0" : 12, "WEIGHTS_0" : 13 }, "indices" : 14, "material" : 1 } ] }, { "name" : "\u7403\u4f53.005", "primitives" : [ { "attributes" : { "POSITION" : 15, "NORMAL" : 16, "TEXCOORD_0" : 17, "TEXCOORD_1" : 18, "JOINTS_0" : 19, "WEIGHTS_0" : 20 }, "indices" : 21, "material" : 2 } ] }, { "name" : "\u7403\u4f53.015", "primitives" : [ { "attributes" : { "POSITION" : 22, "NORMAL" : 23, "TEXCOORD_0" : 24, "JOINTS_0" : 25, "WEIGHTS_0" : 26 }, "indices" : 27, "material" : 3 } ] }, { "name" : "\u7403\u4f53.017", "primitives" : [ { "attributes" : { "POSITION" : 28, "NORMAL" : 29, "TEXCOORD_0" : 30, "TEXCOORD_1" : 31, "JOINTS_0" : 32, "WEIGHTS_0" : 33 }, "indices" : 34, "material" : 4 } ] } ], "textures" : [ { "sampler" : 0, "source" : 0 }, { "sampler" : 0, "source" : 1 }, { "sampler" : 0, "source" : 2 }, { "sampler" : 0, "source" : 3 }, { "sampler" : 0, "source" : 4 }, { "sampler" : 0, "source" : 5 }, { "sampler" : 0, "source" : 6 }, { "sampler" : 0, "source" : 6 }, { "sampler" : 0, "source" : 7 }, { "sampler" : 0, "source" : 8 }, { "sampler" : 0, "source" : 9 } ], "images" : [ { "mimeType" : "image/jpeg", "name" : "legBNormal", "uri" : "texture/legBNormal.jpg" }, { "mimeType" : "image/jpeg", "name" : "LegBColorAo", "uri" : "texture/LegBColorAo.jpg" }, { "mimeType" : "image/jpeg", "name" : "legBMetallic-Roughness", "uri" : "texture/legBMetallic-Roughness.jpg" }, { "mimeType" : "image/jpeg", "name" : "bodyNormal", "uri" : "texture/bodyNormal.jpg" }, { "mimeType" : "image/jpeg", "name" : "bodyColorAo", "uri" : "texture/bodyColorAo.jpg" }, { "mimeType" : "image/jpeg", "name" : "bodyM", "uri" : "texture/bodyM.jpg" }, { "mimeType" : "image/jpeg", "name" : "lightColor", "uri" : "texture/lightColor.jpg" }, { "mimeType" : "image/jpeg", "name" : "legANormal", "uri" : "texture/legANormal.jpg" }, { "mimeType" : "image/jpeg", "name" : "LegAColorAo", "uri" : "texture/LegAColorAo.jpg" }, { "mimeType" : "image/jpeg", "name" : "legAMetallic-Roughness", "uri" : "texture/legAMetallic-Roughness.jpg" } ], "skins" : [ { "inverseBindMatrices" : 7, "joints" : [ 37, 28, 0, 1, 2, 6, 3, 4, 5, 7, 8, 12, 9, 10, 11, 25, 24, 23, 22, 21, 16, 15, 14, 13, 20, 19, 18, 17, 27, 26, 31, 29, 30, 34, 32, 33, 35, 36 ], "name" : "\u9aa8\u67b6.004" } ], "accessors" : [ { "bufferView" : 0, "componentType" : 5126, "count" : 21384, "max" : [ 0.510848343372345, 1.1013883352279663, 0.21214276552200317 ], "min" : [ -0.510848343372345, 0.00034224559203721583, -0.9314292073249817 ], "type" : "VEC3" }, { "bufferView" : 1, "componentType" : 5126, "count" : 21384, "type" : "VEC3" }, { "bufferView" : 2, "componentType" : 5126, "count" : 21384, "type" : "VEC2" }, { "bufferView" : 3, "componentType" : 5126, "count" : 21384, "type" : "VEC2" }, { "bufferView" : 4, "componentType" : 5121, "count" : 21384, "type" : "VEC4" }, { "bufferView" : 5, "componentType" : 5126, "count" : 21384, "type" : "VEC4" }, { "bufferView" : 6, "componentType" : 5123, "count" : 65304, "type" : "SCALAR" }, { "bufferView" : 7, "componentType" : 5126, "count" : 38, "type" : "MAT4" }, { "bufferView" : 8, "componentType" : 5126, "count" : 14608, "max" : [ 0.4723866581916809, 1.6941920518875122, 1.0888464450836182 ], "min" : [ -0.46661391854286194, 0.5273327231407166, 0.006076717283576727 ], "type" : "VEC3" }, { "bufferView" : 9, "componentType" : 5126, "count" : 14608, "type" : "VEC3" }, { "bufferView" : 10, "componentType" : 5126, "count" : 14608, "type" : "VEC2" }, { "bufferView" : 11, "componentType" : 5126, "count" : 14608, "type" : "VEC2" }, { "bufferView" : 12, "componentType" : 5121, "count" : 14608, "type" : "VEC4" }, { "bufferView" : 13, "componentType" : 5126, "count" : 14608, "type" : "VEC4" }, { "bufferView" : 14, "componentType" : 5123, "count" : 39447, "type" : "SCALAR" }, { "bufferView" : 15, "componentType" : 5126, "count" : 352, "max" : [ 0.04665682464838028, 1.1574490070343018, 1.0764967203140259 ], "min" : [ -0.046663861721754074, 0.8331701755523682, 1.048673391342163 ], "type" : "VEC3" }, { "bufferView" : 16, "componentType" : 5126, "count" : 352, "type" : "VEC3" }, { "bufferView" : 17, "componentType" : 5126, "count" : 352, "type" : "VEC2" }, { "bufferView" : 18, "componentType" : 5126, "count" : 352, "type" : "VEC2" }, { "bufferView" : 19, "componentType" : 5121, "count" : 352, "type" : "VEC4" }, { "bufferView" : 20, "componentType" : 5126, "count" : 352, "type" : "VEC4" }, { "bufferView" : 21, "componentType" : 5123, "count" : 1728, "type" : "SCALAR" }, { "bufferView" : 22, "componentType" : 5126, "count" : 178, "max" : [ 0.044646505266427994, 1.1556379795074463, 1.0931721925735474 ], "min" : [ -0.04465353861451149, 0.8349812030792236, 1.0728838443756104 ], "type" : "VEC3" }, { "bufferView" : 23, "componentType" : 5126, "count" : 178, "type" : "VEC3" }, { "bufferView" : 24, "componentType" : 5126, "count" : 178, "type" : "VEC2" }, { "bufferView" : 25, "componentType" : 5121, "count" : 178, "type" : "VEC4" }, { "bufferView" : 26, "componentType" : 5126, "count" : 178, "type" : "VEC4" }, { "bufferView" : 27, "componentType" : 5123, "count" : 660, "type" : "SCALAR" }, { "bufferView" : 28, "componentType" : 5126, "count" : 13169, "max" : [ 0.8473179340362549, 1.4347223043441772, 1.049629807472229 ], "min" : [ -0.8473178744316101, 0.0007248258334584534, 0.3242524564266205 ], "type" : "VEC3" }, { "bufferView" : 29, "componentType" : 5126, "count" : 13169, "type" : "VEC3" }, { "bufferView" : 30, "componentType" : 5126, "count" : 13169, "type" : "VEC2" }, { "bufferView" : 31, "componentType" : 5126, "count" : 13169, "type" : "VEC2" }, { "bufferView" : 32, "componentType" : 5121, "count" : 13169, "type" : "VEC4" }, { "bufferView" : 33, "componentType" : 5126, "count" : 13169, "type" : "VEC4" }, { "bufferView" : 34, "componentType" : 5123, "count" : 43260, "type" : "SCALAR" }, { "bufferView" : 35, "componentType" : 5126, "count" : 140, "max" : [ 5.833333333333333 ], "min" : [ 0.041666666666666664 ], "type" : "SCALAR" }, { "bufferView" : 36, "componentType" : 5126, "count" : 140, "type" : "VEC3" }, { "bufferView" : 37, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 38, "componentType" : 5126, "count" : 2, "max" : [ 5.833333333333333 ], "min" : [ 0.041666666666666664 ], "type" : "SCALAR" }, { "bufferView" : 39, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 40, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 41, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 42, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 43, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 44, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 45, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 46, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 47, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 48, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 49, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 50, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 51, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 52, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 53, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 54, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 55, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 56, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 57, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 58, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 59, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 60, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 61, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 62, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 63, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 64, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 65, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 66, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 67, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 68, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 69, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 70, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 71, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 72, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 73, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 74, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 75, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 76, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 77, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 78, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 79, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 80, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 81, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 82, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 83, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 84, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 85, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 86, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 87, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 88, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 89, "componentType" : 5126, "count" : 2, "type" : "VEC4" }, { "bufferView" : 90, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 91, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 92, "componentType" : 5126, "count" : 2, "type" : "VEC4" }, { "bufferView" : 93, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 94, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 95, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 96, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 97, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 98, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 99, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 100, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 101, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 102, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 103, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 104, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 105, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 106, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 107, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 108, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 109, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 110, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 111, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 112, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 113, "componentType" : 5126, "count" : 2, "type" : "VEC4" }, { "bufferView" : 114, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 115, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 116, "componentType" : 5126, "count" : 2, "type" : "VEC4" }, { "bufferView" : 117, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 118, "componentType" : 5126, "count" : 140, "type" : "VEC3" }, { "bufferView" : 119, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 120, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 121, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 122, "componentType" : 5126, "count" : 2, "type" : "VEC4" }, { "bufferView" : 123, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 124, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 125, "componentType" : 5126, "count" : 2, "type" : "VEC4" }, { "bufferView" : 126, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 127, "componentType" : 5126, "count" : 140, "type" : "VEC3" }, { "bufferView" : 128, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 129, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 130, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 131, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 132, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 133, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 134, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 135, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 136, "componentType" : 5126, "count" : 140, "type" : "VEC3" }, { "bufferView" : 137, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 138, "componentType" : 5126, "count" : 2, "type" : "VEC3" }, { "bufferView" : 139, "componentType" : 5126, "count" : 140, "type" : "VEC3" }, { "bufferView" : 140, "componentType" : 5126, "count" : 140, "type" : "VEC4" }, { "bufferView" : 141, "componentType" : 5126, "count" : 2, "type" : "VEC3" } ], "bufferViews" : [ { "buffer" : 0, "byteLength" : 256608, "byteOffset" : 0 }, { "buffer" : 0, "byteLength" : 256608, "byteOffset" : 256608 }, { "buffer" : 0, "byteLength" : 171072, "byteOffset" : 513216 }, { "buffer" : 0, "byteLength" : 171072, "byteOffset" : 684288 }, { "buffer" : 0, "byteLength" : 85536, "byteOffset" : 855360 }, { "buffer" : 0, "byteLength" : 342144, "byteOffset" : 940896 }, { "buffer" : 0, "byteLength" : 130608, "byteOffset" : 1283040 }, { "buffer" : 0, "byteLength" : 2432, "byteOffset" : 1413648 }, { "buffer" : 0, "byteLength" : 175296, "byteOffset" : 1416080 }, { "buffer" : 0, "byteLength" : 175296, "byteOffset" : 1591376 }, { "buffer" : 0, "byteLength" : 116864, "byteOffset" : 1766672 }, { "buffer" : 0, "byteLength" : 116864, "byteOffset" : 1883536 }, { "buffer" : 0, "byteLength" : 58432, "byteOffset" : 2000400 }, { "buffer" : 0, "byteLength" : 233728, "byteOffset" : 2058832 }, { "buffer" : 0, "byteLength" : 78894, "byteOffset" : 2292560 }, { "buffer" : 0, "byteLength" : 4224, "byteOffset" : 2371456 }, { "buffer" : 0, "byteLength" : 4224, "byteOffset" : 2375680 }, { "buffer" : 0, "byteLength" : 2816, "byteOffset" : 2379904 }, { "buffer" : 0, "byteLength" : 2816, "byteOffset" : 2382720 }, { "buffer" : 0, "byteLength" : 1408, "byteOffset" : 2385536 }, { "buffer" : 0, "byteLength" : 5632, "byteOffset" : 2386944 }, { "buffer" : 0, "byteLength" : 3456, "byteOffset" : 2392576 }, { "buffer" : 0, "byteLength" : 2136, "byteOffset" : 2396032 }, { "buffer" : 0, "byteLength" : 2136, "byteOffset" : 2398168 }, { "buffer" : 0, "byteLength" : 1424, "byteOffset" : 2400304 }, { "buffer" : 0, "byteLength" : 712, "byteOffset" : 2401728 }, { "buffer" : 0, "byteLength" : 2848, "byteOffset" : 2402440 }, { "buffer" : 0, "byteLength" : 1320, "byteOffset" : 2405288 }, { "buffer" : 0, "byteLength" : 158028, "byteOffset" : 2406608 }, { "buffer" : 0, "byteLength" : 158028, "byteOffset" : 2564636 }, { "buffer" : 0, "byteLength" : 105352, "byteOffset" : 2722664 }, { "buffer" : 0, "byteLength" : 105352, "byteOffset" : 2828016 }, { "buffer" : 0, "byteLength" : 52676, "byteOffset" : 2933368 }, { "buffer" : 0, "byteLength" : 210704, "byteOffset" : 2986044 }, { "buffer" : 0, "byteLength" : 86520, "byteOffset" : 3196748 }, { "buffer" : 0, "byteLength" : 560, "byteOffset" : 3283268 }, { "buffer" : 0, "byteLength" : 1680, "byteOffset" : 3283828 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3285508 }, { "buffer" : 0, "byteLength" : 8, "byteOffset" : 3287748 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3287756 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3287780 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3287804 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3290044 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3290068 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3290092 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3292332 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3292356 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3292380 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3294620 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3294644 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3294668 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3296908 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3296932 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3296956 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3299196 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3299220 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3299244 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3301484 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3301508 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3301532 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3303772 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3303796 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3303820 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3306060 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3306084 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3306108 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3308348 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3308372 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3308396 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3310636 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3310660 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3310684 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3312924 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3312948 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3312972 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3315212 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3315236 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3315260 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3317500 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3317524 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3317548 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3319788 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3319812 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3319836 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3322076 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3322100 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3322124 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3324364 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3324388 }, { "buffer" : 0, "byteLength" : 32, "byteOffset" : 3324412 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3324444 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3324468 }, { "buffer" : 0, "byteLength" : 32, "byteOffset" : 3324492 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3324524 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3324548 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3324572 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3326812 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3326836 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3326860 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3329100 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3329124 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3329148 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3331388 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3331412 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3331436 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3333676 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3333700 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3333724 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3335964 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3335988 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3336012 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3338252 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3338276 }, { "buffer" : 0, "byteLength" : 32, "byteOffset" : 3338300 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3338332 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3338356 }, { "buffer" : 0, "byteLength" : 32, "byteOffset" : 3338380 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3338412 }, { "buffer" : 0, "byteLength" : 1680, "byteOffset" : 3338436 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3340116 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3342356 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3342380 }, { "buffer" : 0, "byteLength" : 32, "byteOffset" : 3342404 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3342436 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3342460 }, { "buffer" : 0, "byteLength" : 32, "byteOffset" : 3342484 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3342516 }, { "buffer" : 0, "byteLength" : 1680, "byteOffset" : 3342540 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3344220 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3346460 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3346484 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3346508 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3348748 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3348772 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3348796 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3351036 }, { "buffer" : 0, "byteLength" : 1680, "byteOffset" : 3351060 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3352740 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3354980 }, { "buffer" : 0, "byteLength" : 1680, "byteOffset" : 3355004 }, { "buffer" : 0, "byteLength" : 2240, "byteOffset" : 3356684 }, { "buffer" : 0, "byteLength" : 24, "byteOffset" : 3358924 } ], "samplers" : [ { "magFilter" : 9729, "minFilter" : 9987 } ], "buffers" : [ { "byteLength" : 3358948, "uri" : "robot.bin" } ] } ================================================ FILE: examples/resources/models/gltf/UinoHelmet/README.md ================================================ # UINO Helmet ## License Information Donated by UINO for glTF testing. ================================================ FILE: examples/resources/models/gltf/UinoHelmet/glTF/UinoHelmet.gltf ================================================ { "asset": { "version": "2.0", "generator": "Unreal Engine 4.27.0 glTF Exporter 1.0.6" }, "scene": 0, "accessors": [ { "bufferView": 0, "count": 16890, "type": "SCALAR", "componentType": 5123 }, { "bufferView": 1, "count": 4087, "type": "VEC3", "componentType": 5126, "min": [ -0.315339983, 0.840499163, -0.253357053 ], "max": [ 0.293061942, 1.51543701, 0.295733541 ] }, { "bufferView": 2, "count": 4087, "type": "VEC3", "componentType": 5126 }, { "bufferView": 3, "count": 4087, "type": "VEC4", "componentType": 5126 }, { "bufferView": 4, "count": 4087, "type": "VEC2", "componentType": 5126 } ], "buffers": [ { "uri": "a01.bin", "byteLength": 229956 } ], "bufferViews": [ { "buffer": 0, "byteLength": 33780, "target": 34963 }, { "buffer": 0, "byteLength": 49044, "byteOffset": 33780, "target": 34962 }, { "buffer": 0, "byteLength": 49044, "byteOffset": 82824, "target": 34962 }, { "buffer": 0, "byteLength": 65392, "byteOffset": 131868, "target": 34962 }, { "buffer": 0, "byteLength": 32696, "byteOffset": 197260, "target": 34962 } ], "images": [ { "uri": "lambert9_MetallicRoughness.jpg" }, { "uri": "lambert9_Occlusion.jpg" }, { "uri": "lambert9_Base_Color.jpg" }, { "uri": "lambert9_Normal_OpenGL.jpg" } ], "materials": [ { "name": "lambert9", "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicRoughnessTexture": { "index": 1 } }, "normalTexture": { "index": 2 }, "occlusionTexture": { "index": 3 } } ], "meshes": [ { "name": "a01", "primitives": [ { "attributes": { "POSITION": 1, "NORMAL": 2, "TANGENT": 3, "TEXCOORD_0": 4 }, "indices": 0, "material": 0 } ] } ], "nodes": [ { "mesh": 0 } ], "samplers": [ { "name": "lambert9_MetallicRoughness", "minFilter": 9987, "magFilter": 9729 }, { "name": "lambert9_Occlusion", "minFilter": 9987, "magFilter": 9729 }, { "name": "lambert9_Base_Color", "minFilter": 9987, "magFilter": 9729 }, { "name": "lambert9_Normal_OpenGL", "minFilter": 9987, "magFilter": 9729 } ], "scenes": [ { "nodes": [ 0 ] } ], "textures": [ { "name": "lambert9_Base_Color", "sampler": 2, "source": 2 }, { "name": "lambert9_MetallicRoughness", "sampler": 0, "source": 0 }, { "name": "lambert9_Normal_OpenGL", "sampler": 3, "source": 3 }, { "name": "lambert9_Occlusion", "sampler": 1, "source": 1 } ] } ================================================ FILE: examples/resources/models/gltf/UinoMan/README.md ================================================ # UINO Man ## License Information Donated by UINO for glTF testing. ================================================ FILE: examples/resources/models/gltf/UinoMan/glTF/UinoMan.gltf ================================================ { "materials": [ { "name": "mia_material1", "pbrMetallicRoughness": { "baseColorTexture": { "index": 0, "texCoord": 0 }, "baseColorFactor": [ 0.943137348, 0.943137348, 0.943137348, 1.0 ], "metallicFactor": 0.199999988, "roughnessFactor": 0.0 }, "alphaMode": "OPAQUE" }, { "name": "07_-_Default", "pbrMetallicRoughness": { "baseColorFactor": [ 1.0, 0.164705887, 0.0, 1.0 ], "metallicFactor": 0.099999994, "roughnessFactor": 0.0 }, "alphaMode": "OPAQUE" } ], "images": [ { "uri": "C442714FA64B64623E0A9800E728ACB5.jpg" } ], "textures": [ { "name": "bai01.jpg", "sampler": 0, "source": 0 } ], "meshes": [ { "name": "Rectangle001", "primitives": [ { "material": 0, "mode": 4, "indices": 256, "attributes": { "JOINTS_0": 259, "NORMAL": 258, "POSITION": 257, "WEIGHTS_0": 260 } }, { "material": 1, "mode": 4, "indices": 261, "attributes": { "JOINTS_0": 264, "NORMAL": 263, "POSITION": 262, "WEIGHTS_0": 265 } } ] } ], "buffers": [ { "byteLength": 433512, "uri": "420D26C5E2ECE7CBA6AA2E6A000BEF4D.bin" } ], "bufferViews": [ { "buffer": 0, "byteLength": 136, "byteOffset": 0 }, { "buffer": 0, "byteLength": 408, "byteOffset": 136 }, { "buffer": 0, "byteLength": 544, "byteOffset": 544 }, { "buffer": 0, "byteLength": 408, "byteOffset": 1088 }, { "buffer": 0, "byteLength": 544, "byteOffset": 1496 }, { "buffer": 0, "byteLength": 408, "byteOffset": 2040 }, { "buffer": 0, "byteLength": 544, "byteOffset": 2448 }, { "buffer": 0, "byteLength": 408, "byteOffset": 2992 }, { "buffer": 0, "byteLength": 544, "byteOffset": 3400 }, { "buffer": 0, "byteLength": 408, "byteOffset": 3944 }, { "buffer": 0, "byteLength": 544, "byteOffset": 4352 }, { "buffer": 0, "byteLength": 408, "byteOffset": 4896 }, { "buffer": 0, "byteLength": 544, "byteOffset": 5304 }, { "buffer": 0, "byteLength": 408, "byteOffset": 5848 }, { "buffer": 0, "byteLength": 544, "byteOffset": 6256 }, { "buffer": 0, "byteLength": 544, "byteOffset": 6800 }, { "buffer": 0, "byteLength": 544, "byteOffset": 7344 }, { "buffer": 0, "byteLength": 544, "byteOffset": 7888 }, { "buffer": 0, "byteLength": 544, "byteOffset": 8432 }, { "buffer": 0, "byteLength": 544, "byteOffset": 8976 }, { "buffer": 0, "byteLength": 544, "byteOffset": 9520 }, { "buffer": 0, "byteLength": 544, "byteOffset": 10064 }, { "buffer": 0, "byteLength": 544, "byteOffset": 10608 }, { "buffer": 0, "byteLength": 544, "byteOffset": 11152 }, { "buffer": 0, "byteLength": 408, "byteOffset": 11696 }, { "buffer": 0, "byteLength": 544, "byteOffset": 12104 }, { "buffer": 0, "byteLength": 544, "byteOffset": 12648 }, { "buffer": 0, "byteLength": 544, "byteOffset": 13192 }, { "buffer": 0, "byteLength": 408, "byteOffset": 13736 }, { "buffer": 0, "byteLength": 544, "byteOffset": 14144 }, { "buffer": 0, "byteLength": 544, "byteOffset": 14688 }, { "buffer": 0, "byteLength": 544, "byteOffset": 15232 }, { "buffer": 0, "byteLength": 88, "byteOffset": 15776 }, { "buffer": 0, "byteLength": 264, "byteOffset": 15864 }, { "buffer": 0, "byteLength": 352, "byteOffset": 16128 }, { "buffer": 0, "byteLength": 264, "byteOffset": 16480 }, { "buffer": 0, "byteLength": 352, "byteOffset": 16744 }, { "buffer": 0, "byteLength": 264, "byteOffset": 17096 }, { "buffer": 0, "byteLength": 352, "byteOffset": 17360 }, { "buffer": 0, "byteLength": 264, "byteOffset": 17712 }, { "buffer": 0, "byteLength": 352, "byteOffset": 17976 }, { "buffer": 0, "byteLength": 264, "byteOffset": 18328 }, { "buffer": 0, "byteLength": 352, "byteOffset": 18592 }, { "buffer": 0, "byteLength": 264, "byteOffset": 18944 }, { "buffer": 0, "byteLength": 352, "byteOffset": 19208 }, { "buffer": 0, "byteLength": 264, "byteOffset": 19560 }, { "buffer": 0, "byteLength": 352, "byteOffset": 19824 }, { "buffer": 0, "byteLength": 352, "byteOffset": 20176 }, { "buffer": 0, "byteLength": 352, "byteOffset": 20528 }, { "buffer": 0, "byteLength": 352, "byteOffset": 20880 }, { "buffer": 0, "byteLength": 352, "byteOffset": 21232 }, { "buffer": 0, "byteLength": 352, "byteOffset": 21584 }, { "buffer": 0, "byteLength": 352, "byteOffset": 21936 }, { "buffer": 0, "byteLength": 352, "byteOffset": 22288 }, { "buffer": 0, "byteLength": 352, "byteOffset": 22640 }, { "buffer": 0, "byteLength": 352, "byteOffset": 22992 }, { "buffer": 0, "byteLength": 264, "byteOffset": 23344 }, { "buffer": 0, "byteLength": 352, "byteOffset": 23608 }, { "buffer": 0, "byteLength": 352, "byteOffset": 23960 }, { "buffer": 0, "byteLength": 352, "byteOffset": 24312 }, { "buffer": 0, "byteLength": 264, "byteOffset": 24664 }, { "buffer": 0, "byteLength": 352, "byteOffset": 24928 }, { "buffer": 0, "byteLength": 352, "byteOffset": 25280 }, { "buffer": 0, "byteLength": 352, "byteOffset": 25632 }, { "buffer": 0, "byteLength": 56, "byteOffset": 25984 }, { "buffer": 0, "byteLength": 168, "byteOffset": 26040 }, { "buffer": 0, "byteLength": 224, "byteOffset": 26208 }, { "buffer": 0, "byteLength": 168, "byteOffset": 26432 }, { "buffer": 0, "byteLength": 224, "byteOffset": 26600 }, { "buffer": 0, "byteLength": 168, "byteOffset": 26824 }, { "buffer": 0, "byteLength": 224, "byteOffset": 26992 }, { "buffer": 0, "byteLength": 168, "byteOffset": 27216 }, { "buffer": 0, "byteLength": 224, "byteOffset": 27384 }, { "buffer": 0, "byteLength": 168, "byteOffset": 27608 }, { "buffer": 0, "byteLength": 224, "byteOffset": 27776 }, { "buffer": 0, "byteLength": 168, "byteOffset": 28000 }, { "buffer": 0, "byteLength": 224, "byteOffset": 28168 }, { "buffer": 0, "byteLength": 168, "byteOffset": 28392 }, { "buffer": 0, "byteLength": 224, "byteOffset": 28560 }, { "buffer": 0, "byteLength": 224, "byteOffset": 28784 }, { "buffer": 0, "byteLength": 224, "byteOffset": 29008 }, { "buffer": 0, "byteLength": 224, "byteOffset": 29232 }, { "buffer": 0, "byteLength": 224, "byteOffset": 29456 }, { "buffer": 0, "byteLength": 224, "byteOffset": 29680 }, { "buffer": 0, "byteLength": 224, "byteOffset": 29904 }, { "buffer": 0, "byteLength": 224, "byteOffset": 30128 }, { "buffer": 0, "byteLength": 224, "byteOffset": 30352 }, { "buffer": 0, "byteLength": 224, "byteOffset": 30576 }, { "buffer": 0, "byteLength": 168, "byteOffset": 30800 }, { "buffer": 0, "byteLength": 224, "byteOffset": 30968 }, { "buffer": 0, "byteLength": 224, "byteOffset": 31192 }, { "buffer": 0, "byteLength": 224, "byteOffset": 31416 }, { "buffer": 0, "byteLength": 168, "byteOffset": 31640 }, { "buffer": 0, "byteLength": 224, "byteOffset": 31808 }, { "buffer": 0, "byteLength": 224, "byteOffset": 32032 }, { "buffer": 0, "byteLength": 224, "byteOffset": 32256 }, { "buffer": 0, "byteLength": 148, "byteOffset": 32480 }, { "buffer": 0, "byteLength": 444, "byteOffset": 32628 }, { "buffer": 0, "byteLength": 592, "byteOffset": 33072 }, { "buffer": 0, "byteLength": 444, "byteOffset": 33664 }, { "buffer": 0, "byteLength": 592, "byteOffset": 34108 }, { "buffer": 0, "byteLength": 444, "byteOffset": 34700 }, { "buffer": 0, "byteLength": 592, "byteOffset": 35144 }, { "buffer": 0, "byteLength": 444, "byteOffset": 35736 }, { "buffer": 0, "byteLength": 592, "byteOffset": 36180 }, { "buffer": 0, "byteLength": 444, "byteOffset": 36772 }, { "buffer": 0, "byteLength": 592, "byteOffset": 37216 }, { "buffer": 0, "byteLength": 444, "byteOffset": 37808 }, { "buffer": 0, "byteLength": 592, "byteOffset": 38252 }, { "buffer": 0, "byteLength": 444, "byteOffset": 38844 }, { "buffer": 0, "byteLength": 592, "byteOffset": 39288 }, { "buffer": 0, "byteLength": 592, "byteOffset": 39880 }, { "buffer": 0, "byteLength": 592, "byteOffset": 40472 }, { "buffer": 0, "byteLength": 592, "byteOffset": 41064 }, { "buffer": 0, "byteLength": 592, "byteOffset": 41656 }, { "buffer": 0, "byteLength": 592, "byteOffset": 42248 }, { "buffer": 0, "byteLength": 592, "byteOffset": 42840 }, { "buffer": 0, "byteLength": 592, "byteOffset": 43432 }, { "buffer": 0, "byteLength": 592, "byteOffset": 44024 }, { "buffer": 0, "byteLength": 592, "byteOffset": 44616 }, { "buffer": 0, "byteLength": 444, "byteOffset": 45208 }, { "buffer": 0, "byteLength": 592, "byteOffset": 45652 }, { "buffer": 0, "byteLength": 592, "byteOffset": 46244 }, { "buffer": 0, "byteLength": 592, "byteOffset": 46836 }, { "buffer": 0, "byteLength": 444, "byteOffset": 47428 }, { "buffer": 0, "byteLength": 592, "byteOffset": 47872 }, { "buffer": 0, "byteLength": 592, "byteOffset": 48464 }, { "buffer": 0, "byteLength": 592, "byteOffset": 49056 }, { "buffer": 0, "byteLength": 436, "byteOffset": 49648 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 50084 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 51392 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 53136 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 54444 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 56188 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 57496 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 59240 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 60548 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 62292 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 63600 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 65344 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 66652 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 68396 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 69704 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 71448 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 73192 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 74936 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 76680 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 78424 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 80168 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 81912 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 83656 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 85400 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 87144 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 88452 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 90196 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 91940 }, { "buffer": 0, "byteLength": 1308, "byteOffset": 93684 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 94992 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 96736 }, { "buffer": 0, "byteLength": 1744, "byteOffset": 98480 }, { "buffer": 0, "byteLength": 308, "byteOffset": 100224 }, { "buffer": 0, "byteLength": 924, "byteOffset": 100532 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 101456 }, { "buffer": 0, "byteLength": 924, "byteOffset": 102688 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 103612 }, { "buffer": 0, "byteLength": 924, "byteOffset": 104844 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 105768 }, { "buffer": 0, "byteLength": 924, "byteOffset": 107000 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 107924 }, { "buffer": 0, "byteLength": 924, "byteOffset": 109156 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 110080 }, { "buffer": 0, "byteLength": 924, "byteOffset": 111312 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 112236 }, { "buffer": 0, "byteLength": 924, "byteOffset": 113468 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 114392 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 115624 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 116856 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 118088 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 119320 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 120552 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 121784 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 123016 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 124248 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 125480 }, { "buffer": 0, "byteLength": 924, "byteOffset": 126712 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 127636 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 128868 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 130100 }, { "buffer": 0, "byteLength": 924, "byteOffset": 131332 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 132256 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 133488 }, { "buffer": 0, "byteLength": 1232, "byteOffset": 134720 }, { "buffer": 0, "byteLength": 296, "byteOffset": 135952 }, { "buffer": 0, "byteLength": 888, "byteOffset": 136248 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 137136 }, { "buffer": 0, "byteLength": 888, "byteOffset": 138320 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 139208 }, { "buffer": 0, "byteLength": 888, "byteOffset": 140392 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 141280 }, { "buffer": 0, "byteLength": 888, "byteOffset": 142464 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 143352 }, { "buffer": 0, "byteLength": 888, "byteOffset": 144536 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 145424 }, { "buffer": 0, "byteLength": 888, "byteOffset": 146608 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 147496 }, { "buffer": 0, "byteLength": 888, "byteOffset": 148680 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 149568 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 150752 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 151936 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 153120 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 154304 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 155488 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 156672 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 157856 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 159040 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 160224 }, { "buffer": 0, "byteLength": 888, "byteOffset": 161408 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 162296 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 163480 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 164664 }, { "buffer": 0, "byteLength": 888, "byteOffset": 165848 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 166736 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 167920 }, { "buffer": 0, "byteLength": 1184, "byteOffset": 169104 }, { "buffer": 0, "byteLength": 100, "byteOffset": 170288 }, { "buffer": 0, "byteLength": 300, "byteOffset": 170388 }, { "buffer": 0, "byteLength": 400, "byteOffset": 170688 }, { "buffer": 0, "byteLength": 300, "byteOffset": 171088 }, { "buffer": 0, "byteLength": 400, "byteOffset": 171388 }, { "buffer": 0, "byteLength": 300, "byteOffset": 171788 }, { "buffer": 0, "byteLength": 400, "byteOffset": 172088 }, { "buffer": 0, "byteLength": 300, "byteOffset": 172488 }, { "buffer": 0, "byteLength": 400, "byteOffset": 172788 }, { "buffer": 0, "byteLength": 300, "byteOffset": 173188 }, { "buffer": 0, "byteLength": 400, "byteOffset": 173488 }, { "buffer": 0, "byteLength": 300, "byteOffset": 173888 }, { "buffer": 0, "byteLength": 400, "byteOffset": 174188 }, { "buffer": 0, "byteLength": 300, "byteOffset": 174588 }, { "buffer": 0, "byteLength": 400, "byteOffset": 174888 }, { "buffer": 0, "byteLength": 400, "byteOffset": 175288 }, { "buffer": 0, "byteLength": 400, "byteOffset": 175688 }, { "buffer": 0, "byteLength": 400, "byteOffset": 176088 }, { "buffer": 0, "byteLength": 400, "byteOffset": 176488 }, { "buffer": 0, "byteLength": 400, "byteOffset": 176888 }, { "buffer": 0, "byteLength": 400, "byteOffset": 177288 }, { "buffer": 0, "byteLength": 400, "byteOffset": 177688 }, { "buffer": 0, "byteLength": 400, "byteOffset": 178088 }, { "buffer": 0, "byteLength": 400, "byteOffset": 178488 }, { "buffer": 0, "byteLength": 300, "byteOffset": 178888 }, { "buffer": 0, "byteLength": 400, "byteOffset": 179188 }, { "buffer": 0, "byteLength": 400, "byteOffset": 179588 }, { "buffer": 0, "byteLength": 400, "byteOffset": 179988 }, { "buffer": 0, "byteLength": 300, "byteOffset": 180388 }, { "buffer": 0, "byteLength": 400, "byteOffset": 180688 }, { "buffer": 0, "byteLength": 400, "byteOffset": 181088 }, { "buffer": 0, "byteLength": 400, "byteOffset": 181488 }, { "buffer": 0, "target": 34963, "byteLength": 7944, "byteOffset": 181888 }, { "buffer": 0, "target": 34962, "byteLength": 15852, "byteOffset": 189832 }, { "buffer": 0, "target": 34962, "byteLength": 15852, "byteOffset": 205684 }, { "buffer": 0, "target": 34962, "byteLength": 10568, "byteOffset": 221536 }, { "buffer": 0, "target": 34962, "byteLength": 21136, "byteOffset": 232104 }, { "buffer": 0, "target": 34963, "byteLength": 20208, "byteOffset": 253240 }, { "buffer": 0, "target": 34962, "byteLength": 39648, "byteOffset": 273448 }, { "buffer": 0, "target": 34962, "byteLength": 39648, "byteOffset": 313096 }, { "buffer": 0, "target": 34962, "byteLength": 26432, "byteOffset": 352744 }, { "buffer": 0, "target": 34962, "byteLength": 52864, "byteOffset": 379176 }, { "buffer": 0, "byteLength": 1472, "byteOffset": 432040 } ], "accessors": [ { "componentType": 5126, "type": "SCALAR", "bufferView": 0, "byteOffset": 0, "count": 34, "min": [ -0.0416663289070129 ], "max": [ 1.33333361148834 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 1, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 2, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC3", "bufferView": 3, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 4, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC3", "bufferView": 5, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 6, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC3", "bufferView": 7, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 8, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC3", "bufferView": 9, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 10, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC3", "bufferView": 11, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 12, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC3", "bufferView": 13, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 14, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 15, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 16, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 17, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 18, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 19, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 20, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 21, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 22, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 23, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC3", "bufferView": 24, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 25, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 26, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 27, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC3", "bufferView": 28, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 29, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 30, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "VEC4", "bufferView": 31, "byteOffset": 0, "count": 34 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 32, "byteOffset": 0, "count": 22, "min": [ -0.0416634082794189 ], "max": [ 0.833336710929871 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 33, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 34, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC3", "bufferView": 35, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 36, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC3", "bufferView": 37, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 38, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC3", "bufferView": 39, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 40, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC3", "bufferView": 41, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 42, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC3", "bufferView": 43, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 44, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC3", "bufferView": 45, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 46, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 47, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 48, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 49, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 50, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 51, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 52, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 53, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 54, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 55, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC3", "bufferView": 56, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 57, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 58, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 59, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC3", "bufferView": 60, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 61, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 62, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "VEC4", "bufferView": 63, "byteOffset": 0, "count": 22 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 64, "byteOffset": 0, "count": 14, "min": [ 0.0 ], "max": [ 0.541666746139526 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 65, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 66, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC3", "bufferView": 67, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 68, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC3", "bufferView": 69, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 70, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC3", "bufferView": 71, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 72, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC3", "bufferView": 73, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 74, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC3", "bufferView": 75, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 76, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC3", "bufferView": 77, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 78, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 79, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 80, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 81, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 82, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 83, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 84, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 85, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 86, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 87, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC3", "bufferView": 88, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 89, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 90, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 91, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC3", "bufferView": 92, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 93, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 94, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "VEC4", "bufferView": 95, "byteOffset": 0, "count": 14 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 96, "byteOffset": 0, "count": 37, "min": [ -0.0250000953674316 ], "max": [ 1.47499990463257 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 97, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 98, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC3", "bufferView": 99, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 100, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC3", "bufferView": 101, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 102, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC3", "bufferView": 103, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 104, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC3", "bufferView": 105, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 106, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC3", "bufferView": 107, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 108, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC3", "bufferView": 109, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 110, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 111, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 112, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 113, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 114, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 115, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 116, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 117, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 118, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 119, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC3", "bufferView": 120, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 121, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 122, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 123, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC3", "bufferView": 124, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 125, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 126, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "VEC4", "bufferView": 127, "byteOffset": 0, "count": 37 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 128, "byteOffset": 0, "count": 109, "min": [ -0.0250034332275391 ], "max": [ 4.47499704360962 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 129, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 130, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC3", "bufferView": 131, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 132, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC3", "bufferView": 133, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 134, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC3", "bufferView": 135, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 136, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC3", "bufferView": 137, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 138, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC3", "bufferView": 139, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 140, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC3", "bufferView": 141, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 142, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 143, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 144, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 145, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 146, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 147, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 148, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 149, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 150, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 151, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC3", "bufferView": 152, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 153, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 154, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 155, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC3", "bufferView": 156, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 157, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 158, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "VEC4", "bufferView": 159, "byteOffset": 0, "count": 109 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 160, "byteOffset": 0, "count": 77, "min": [ -0.0249671936035156 ], "max": [ 3.14169979095459 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 161, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 162, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC3", "bufferView": 163, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 164, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC3", "bufferView": 165, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 166, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC3", "bufferView": 167, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 168, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC3", "bufferView": 169, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 170, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC3", "bufferView": 171, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 172, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC3", "bufferView": 173, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 174, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 175, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 176, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 177, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 178, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 179, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 180, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 181, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 182, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 183, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC3", "bufferView": 184, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 185, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 186, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 187, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC3", "bufferView": 188, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 189, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 190, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "VEC4", "bufferView": 191, "byteOffset": 0, "count": 77 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 192, "byteOffset": 0, "count": 74, "min": [ -0.0250329971313477 ], "max": [ 3.01663398742676 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 193, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 194, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC3", "bufferView": 195, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 196, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC3", "bufferView": 197, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 198, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC3", "bufferView": 199, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 200, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC3", "bufferView": 201, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 202, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC3", "bufferView": 203, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 204, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC3", "bufferView": 205, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 206, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 207, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 208, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 209, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 210, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 211, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 212, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 213, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 214, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 215, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC3", "bufferView": 216, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 217, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 218, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 219, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC3", "bufferView": 220, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 221, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 222, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "VEC4", "bufferView": 223, "byteOffset": 0, "count": 74 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 224, "byteOffset": 0, "count": 25, "min": [ -0.0167007446289063 ], "max": [ 0.983299255371094 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 225, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 226, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC3", "bufferView": 227, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 228, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC3", "bufferView": 229, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 230, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC3", "bufferView": 231, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 232, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC3", "bufferView": 233, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 234, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC3", "bufferView": 235, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 236, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC3", "bufferView": 237, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 238, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 239, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 240, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 241, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 242, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 243, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 244, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 245, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 246, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 247, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC3", "bufferView": 248, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 249, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 250, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 251, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC3", "bufferView": 252, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 253, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 254, "byteOffset": 0, "count": 25 }, { "componentType": 5126, "type": "VEC4", "bufferView": 255, "byteOffset": 0, "count": 25 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 256, "byteOffset": 0, "count": 3972 }, { "componentType": 5126, "type": "VEC3", "bufferView": 257, "byteOffset": 0, "count": 1321, "min": [ -0.631720960140228, -0.987726211547852, -0.00609945505857468 ], "max": [ 0.635584473609924, 0.743749380111694, 0.115580216050148 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 258, "byteOffset": 0, "count": 1321 }, { "componentType": 5123, "type": "VEC4", "bufferView": 259, "byteOffset": 0, "count": 1321 }, { "componentType": 5126, "type": "VEC4", "bufferView": 260, "byteOffset": 0, "count": 1321 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 261, "byteOffset": 0, "count": 10104 }, { "componentType": 5126, "type": "VEC3", "bufferView": 262, "byteOffset": 0, "count": 3304, "min": [ -0.694011926651001, -1.05007696151733, 9.20049175734405E-11 ], "max": [ 0.694011926651001, 0.905986249446869, 0.161730408668518 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 263, "byteOffset": 0, "count": 3304 }, { "componentType": 5123, "type": "VEC4", "bufferView": 264, "byteOffset": 0, "count": 3304 }, { "componentType": 5126, "type": "VEC4", "bufferView": 265, "byteOffset": 0, "count": 3304 }, { "componentType": 5126, "type": "MAT4", "bufferView": 266, "byteOffset": 0, "count": 23 } ], "nodes": [ { "name": "RootNode", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 1, 37 ] }, { "name": "Bip001", "translation": [ 0.0, 0.556053459644318, 0.0 ], "rotation": [ -0.500000536441803, -0.499999463558197, -0.499999463558197, 0.500000536441803 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 2, 3 ] }, { "name": "Bip001_Footsteps", "translation": [ 0.0, -1.17549435082229E-38, -0.575027167797089 ], "rotation": [ 4.56519357454961E-33, 4.15056990104971E-33, 0.707105994224548, 0.707107543945313 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "Bip001_Pelvis", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ -0.5, -0.5, -0.499999314546585, 0.500000715255737 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 4 ] }, { "name": "Bip001_Spine", "translation": [ 0.14355856180191, -7.53745043766685E-05, 1.99191504179907E-07 ], "rotation": [ -2.08047595151584E-06, -6.93675929142046E-07, 0.000398158997995779, 0.999999940395355 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 5, 23, 30 ] }, { "name": "Bip001_Spine1", "translation": [ 0.0946972966194153, -7.54050561226904E-05, -2.09143591334282E-10 ], "rotation": [ -1.70940724937015E-15, 2.82792371916566E-23, 1.62630325872826E-19, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 6 ] }, { "name": "Bip001_Spine2", "translation": [ 0.0946973562240601, -7.54050561226904E-05, -2.09143591334282E-10 ], "rotation": [ -1.70940735524927E-15, -6.22970398828999E-23, 1.0842021724855E-19, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 7 ] }, { "name": "Bip001_Spine3", "translation": [ 0.0946973562240601, -6.75612245686352E-05, -1.87387882988332E-10 ], "rotation": [ -1.70940735524927E-15, -4.7097596127238E-23, 1.62630325872826E-19, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 8 ] }, { "name": "Bip001_Neck", "translation": [ 0.0848507285118103, -0.000102765450719744, -2.57675214498931E-10 ], "rotation": [ -1.32319925683078E-07, -9.07349786416489E-08, 0.0202760715037584, 0.99979442358017 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 9, 15, 21 ] }, { "name": "Bip001_L_Clavicle", "translation": [ 1.19209289550781E-07, 0.000102777034044266, 0.0228433422744274 ], "rotation": [ 0.614420592784882, -0.012706539593637, 0.788707733154297, 0.0163084100931883 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 10 ] }, { "name": "Bip001_L_UpperArm", "translation": [ 0.168243989348412, 4.61852778244065E-14, 1.19209289550781E-07 ], "rotation": [ -0.059801634401083, 0.413152545690536, 0.0394934490323067, 0.907837569713593 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 11 ] }, { "name": "Bip001_L_Forearm", "translation": [ 0.180058240890503, 1.38777878078145E-17, 0.0 ], "rotation": [ 1.18579674347345E-17, -1.26615626464818E-17, -0.17377233505249, 0.984785854816437 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 12 ] }, { "name": "Bip001_L_Hand", "translation": [ 0.218532353639603, 0.0, 5.96046447753906E-08 ], "rotation": [ -0.678476691246033, 0.198327571153641, 0.198169693350792, 0.679017186164856 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 13 ] }, { "name": "Bip001_L_Finger0", "translation": [ 0.0910552144050598, 0.0, 5.55111512312578E-17 ], "rotation": [ -0.00039816094795242, -1.49019019346497E-08, 1.85671200636506E-09, 0.999999940395355 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 14 ] }, { "name": "Bip001_L_Finger0Nub", "translation": [ 0.0227637887001038, 2.98023223876953E-08, 2.98023223876953E-08 ], "rotation": [ 3.1225025876305E-17, -1.49011611938477E-08, 1.86264514923096E-09, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "Bip001_R_Clavicle", "translation": [ 1.19209289550781E-07, 0.000102914869785309, -0.0228433422744274 ], "rotation": [ -0.623302102088928, 0.0128878122195601, 0.781707763671875, 0.016165541484952 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 16 ] }, { "name": "Bip001_R_UpperArm", "translation": [ 0.221783712506294, -5.32907051820075E-14, -1.19209289550781E-07 ], "rotation": [ -0.123283706605434, -0.422829777002335, -0.000592334545217454, 0.897783815860748 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 17 ] }, { "name": "Bip001_R_Forearm", "translation": [ 0.13731324672699, -1.49011611938477E-08, 0.0 ], "rotation": [ -7.33295943900504E-18, 1.82047712464406E-17, -0.39169830083847, 0.920093715190887 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 18 ] }, { "name": "Bip001_R_Hand", "translation": [ 0.21853244304657, -2.98023223876953E-08, 0.0 ], "rotation": [ 0.687779307365417, -0.163106694817543, 0.162976816296577, 0.688327252864838 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 19 ] }, { "name": "Bip001_R_Finger0", "translation": [ 0.091055154800415, -5.55111512312578E-17, 2.98023223876953E-08 ], "rotation": [ 0.000398149742977694, -5.55166701803048E-17, -1.38556847146664E-17, 0.999999940395355 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 20 ] }, { "name": "Bip001_R_Finger0Nub", "translation": [ 0.022763729095459, 0.0, 0.0 ], "rotation": [ 1.49011611938477E-08, -1.86264514923096E-09, 1.0, 1.86264503820865E-09 ], "scale": [ -1.0, -1.0, -1.0 ] }, { "name": "Bip001_Head", "translation": [ 0.129162311553955, -6.93889390390723E-18, -2.11758236813575E-22 ], "rotation": [ 1.94586377233463E-07, -5.19076309046795E-07, 0.108859837055206, 0.99405711889267 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 22 ] }, { "name": "Bip001_HeadNub", "translation": [ 0.60014009475708, 2.98023223876953E-08, 2.27373675443232E-13 ], "rotation": [ 1.4210854715202E-14, 5.68434256370716E-14, 7.45058059692383E-09, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "Bip001_L_Thigh", "translation": [ -0.143558502197266, 0.000189370854059234, 0.124833516776562 ], "rotation": [ 0.0017798823537305, 0.999618232250214, -0.000209213278139941, -0.0275716409087181 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 24 ] }, { "name": "Bip001_L_Calf", "translation": [ 0.220977544784546, 1.16415321826935E-10, -2.77555756156289E-17 ], "rotation": [ -2.11358944453434E-20, 4.14737357631941E-18, -0.007974898442626, 0.99996817111969 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 25 ] }, { "name": "Bip001_L_Foot", "translation": [ 0.252047121524811, 4.65661287307739E-10, -1.49011611938477E-08 ], "rotation": [ -1.68952419699053E-06, -0.0275724455714226, 0.00658996682614088, 0.99959808588028 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 26 ] }, { "name": "Bip001_L_Toe0", "translation": [ 0.0837707594037056, 0.107809320092201, -1.49011611938477E-08 ], "rotation": [ -1.54543080554959E-08, -1.54543080554959E-08, 0.70710676908493, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 27 ] }, { "name": "Bip001_L_Toe01", "translation": [ 0.0109266191720963, 2.64697796016969E-23, 1.49011611938477E-08 ], "rotation": [ -2.98949656894235E-22, 9.55340720879103E-16, -1.77635726291672E-15, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 28 ] }, { "name": "Bip001_L_Toe02", "translation": [ 0.0109266266226768, 2.64697796016969E-23, -1.49011611938477E-08 ], "rotation": [ -3.06865831901917E-22, 9.55340720879103E-16, -1.77635726291672E-15, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 29 ] }, { "name": "Bip001_L_Toe0Nub", "translation": [ 0.0109266191720963, 8.88178313821007E-16, 0.0 ], "rotation": [ 9.5534093263734E-16, 1.83377621529267E-22, 1.0, 1.83758927467374E-15 ], "scale": [ -1.0, -1.0, -1.0 ] }, { "name": "Bip001_R_Thigh", "translation": [ -0.143558502197266, 0.000190063350601122, -0.124833516776562 ], "rotation": [ 0.00195688824169338, 0.999578893184662, 0.000242012785747647, 0.0289512798190117 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 31 ] }, { "name": "Bip001_R_Calf", "translation": [ 0.215908050537109, 1.16415321826935E-10, 2.77555756156289E-17 ], "rotation": [ -4.16264232230077E-20, -8.52490436781741E-18, -0.00806227512657642, 0.999967515468597 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 32 ] }, { "name": "Bip001_R_Foot", "translation": [ 0.248086482286453, -8.67361737988404E-19, 1.49011611938477E-08 ], "rotation": [ 1.87325349543244E-05, 0.0289522744715214, 0.00650005834177136, 0.999559640884399 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 33 ] }, { "name": "Bip001_R_Toe0", "translation": [ 0.0837707594037056, 0.107809312641621, -1.49011611938477E-08 ], "rotation": [ -1.54543080554959E-08, -1.54543080554959E-08, 0.70710676908493, 0.70710676908493 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 34 ] }, { "name": "Bip001_R_Toe01", "translation": [ 0.0109266117215157, -1.73472347597681E-18, 1.49011611938477E-08 ], "rotation": [ -1.0659340986836E-22, 9.5534093263734E-16, -1.77635683940025E-15, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 35 ] }, { "name": "Bip001_R_Toe02", "translation": [ 0.0109266340732574, 1.73472347597681E-18, -1.49011611938477E-08 ], "rotation": [ -1.17816085893945E-22, 9.5534093263734E-16, -1.77635705115849E-15, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 36 ] }, { "name": "Bip001_R_Toe0Nub", "translation": [ 0.0109266191720963, 0.0, 0.0 ], "rotation": [ -1.29039165816314E-22, 9.55341144395576E-16, -1.77635683940025E-15, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "Rectangle001", "translation": [ -0.00846058130264282, 1.0601464509964, -0.054740384221077 ], "rotation": [ 8.14603424714733E-08, 0.0, 0.0, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 0, "skin": 0 } ], "animations": [ { "name": "_defaultAnim_", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "translation" } }, { "sampler": 1, "target": { "node": 1, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "translation" } }, { "sampler": 3, "target": { "node": 2, "path": "rotation" } }, { "sampler": 4, "target": { "node": 3, "path": "translation" } }, { "sampler": 5, "target": { "node": 3, "path": "rotation" } }, { "sampler": 6, "target": { "node": 4, "path": "translation" } }, { "sampler": 7, "target": { "node": 4, "path": "rotation" } }, { "sampler": 8, "target": { "node": 5, "path": "translation" } }, { "sampler": 9, "target": { "node": 5, "path": "rotation" } }, { "sampler": 10, "target": { "node": 6, "path": "translation" } }, { "sampler": 11, "target": { "node": 6, "path": "rotation" } }, { "sampler": 12, "target": { "node": 7, "path": "translation" } }, { "sampler": 13, "target": { "node": 7, "path": "rotation" } }, { "sampler": 14, "target": { "node": 9, "path": "rotation" } }, { "sampler": 15, "target": { "node": 10, "path": "rotation" } }, { "sampler": 16, "target": { "node": 11, "path": "rotation" } }, { "sampler": 17, "target": { "node": 12, "path": "rotation" } }, { "sampler": 18, "target": { "node": 15, "path": "rotation" } }, { "sampler": 19, "target": { "node": 16, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "rotation" } }, { "sampler": 21, "target": { "node": 18, "path": "rotation" } }, { "sampler": 22, "target": { "node": 21, "path": "rotation" } }, { "sampler": 23, "target": { "node": 23, "path": "translation" } }, { "sampler": 24, "target": { "node": 23, "path": "rotation" } }, { "sampler": 25, "target": { "node": 24, "path": "rotation" } }, { "sampler": 26, "target": { "node": 25, "path": "rotation" } }, { "sampler": 27, "target": { "node": 30, "path": "translation" } }, { "sampler": 28, "target": { "node": 30, "path": "rotation" } }, { "sampler": 29, "target": { "node": 31, "path": "rotation" } }, { "sampler": 30, "target": { "node": 32, "path": "rotation" } } ], "samplers": [ { "input": 0, "interpolation": "LINEAR", "output": 1 }, { "input": 0, "interpolation": "LINEAR", "output": 2 }, { "input": 0, "interpolation": "LINEAR", "output": 3 }, { "input": 0, "interpolation": "LINEAR", "output": 4 }, { "input": 0, "interpolation": "LINEAR", "output": 5 }, { "input": 0, "interpolation": "LINEAR", "output": 6 }, { "input": 0, "interpolation": "LINEAR", "output": 7 }, { "input": 0, "interpolation": "LINEAR", "output": 8 }, { "input": 0, "interpolation": "LINEAR", "output": 9 }, { "input": 0, "interpolation": "LINEAR", "output": 10 }, { "input": 0, "interpolation": "LINEAR", "output": 11 }, { "input": 0, "interpolation": "LINEAR", "output": 12 }, { "input": 0, "interpolation": "LINEAR", "output": 13 }, { "input": 0, "interpolation": "LINEAR", "output": 14 }, { "input": 0, "interpolation": "LINEAR", "output": 15 }, { "input": 0, "interpolation": "LINEAR", "output": 16 }, { "input": 0, "interpolation": "LINEAR", "output": 17 }, { "input": 0, "interpolation": "LINEAR", "output": 18 }, { "input": 0, "interpolation": "LINEAR", "output": 19 }, { "input": 0, "interpolation": "LINEAR", "output": 20 }, { "input": 0, "interpolation": "LINEAR", "output": 21 }, { "input": 0, "interpolation": "LINEAR", "output": 22 }, { "input": 0, "interpolation": "LINEAR", "output": 23 }, { "input": 0, "interpolation": "LINEAR", "output": 24 }, { "input": 0, "interpolation": "LINEAR", "output": 25 }, { "input": 0, "interpolation": "LINEAR", "output": 26 }, { "input": 0, "interpolation": "LINEAR", "output": 27 }, { "input": 0, "interpolation": "LINEAR", "output": 28 }, { "input": 0, "interpolation": "LINEAR", "output": 29 }, { "input": 0, "interpolation": "LINEAR", "output": 30 }, { "input": 0, "interpolation": "LINEAR", "output": 31 } ] }, { "name": "蹲下", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "translation" } }, { "sampler": 1, "target": { "node": 1, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "translation" } }, { "sampler": 3, "target": { "node": 2, "path": "rotation" } }, { "sampler": 4, "target": { "node": 3, "path": "translation" } }, { "sampler": 5, "target": { "node": 3, "path": "rotation" } }, { "sampler": 6, "target": { "node": 4, "path": "translation" } }, { "sampler": 7, "target": { "node": 4, "path": "rotation" } }, { "sampler": 8, "target": { "node": 5, "path": "translation" } }, { "sampler": 9, "target": { "node": 5, "path": "rotation" } }, { "sampler": 10, "target": { "node": 6, "path": "translation" } }, { "sampler": 11, "target": { "node": 6, "path": "rotation" } }, { "sampler": 12, "target": { "node": 7, "path": "translation" } }, { "sampler": 13, "target": { "node": 7, "path": "rotation" } }, { "sampler": 14, "target": { "node": 9, "path": "rotation" } }, { "sampler": 15, "target": { "node": 10, "path": "rotation" } }, { "sampler": 16, "target": { "node": 11, "path": "rotation" } }, { "sampler": 17, "target": { "node": 12, "path": "rotation" } }, { "sampler": 18, "target": { "node": 15, "path": "rotation" } }, { "sampler": 19, "target": { "node": 16, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "rotation" } }, { "sampler": 21, "target": { "node": 18, "path": "rotation" } }, { "sampler": 22, "target": { "node": 21, "path": "rotation" } }, { "sampler": 23, "target": { "node": 23, "path": "translation" } }, { "sampler": 24, "target": { "node": 23, "path": "rotation" } }, { "sampler": 25, "target": { "node": 24, "path": "rotation" } }, { "sampler": 26, "target": { "node": 25, "path": "rotation" } }, { "sampler": 27, "target": { "node": 30, "path": "translation" } }, { "sampler": 28, "target": { "node": 30, "path": "rotation" } }, { "sampler": 29, "target": { "node": 31, "path": "rotation" } }, { "sampler": 30, "target": { "node": 32, "path": "rotation" } } ], "samplers": [ { "input": 32, "interpolation": "LINEAR", "output": 33 }, { "input": 32, "interpolation": "LINEAR", "output": 34 }, { "input": 32, "interpolation": "LINEAR", "output": 35 }, { "input": 32, "interpolation": "LINEAR", "output": 36 }, { "input": 32, "interpolation": "LINEAR", "output": 37 }, { "input": 32, "interpolation": "LINEAR", "output": 38 }, { "input": 32, "interpolation": "LINEAR", "output": 39 }, { "input": 32, "interpolation": "LINEAR", "output": 40 }, { "input": 32, "interpolation": "LINEAR", "output": 41 }, { "input": 32, "interpolation": "LINEAR", "output": 42 }, { "input": 32, "interpolation": "LINEAR", "output": 43 }, { "input": 32, "interpolation": "LINEAR", "output": 44 }, { "input": 32, "interpolation": "LINEAR", "output": 45 }, { "input": 32, "interpolation": "LINEAR", "output": 46 }, { "input": 32, "interpolation": "LINEAR", "output": 47 }, { "input": 32, "interpolation": "LINEAR", "output": 48 }, { "input": 32, "interpolation": "LINEAR", "output": 49 }, { "input": 32, "interpolation": "LINEAR", "output": 50 }, { "input": 32, "interpolation": "LINEAR", "output": 51 }, { "input": 32, "interpolation": "LINEAR", "output": 52 }, { "input": 32, "interpolation": "LINEAR", "output": 53 }, { "input": 32, "interpolation": "LINEAR", "output": 54 }, { "input": 32, "interpolation": "LINEAR", "output": 55 }, { "input": 32, "interpolation": "LINEAR", "output": 56 }, { "input": 32, "interpolation": "LINEAR", "output": 57 }, { "input": 32, "interpolation": "LINEAR", "output": 58 }, { "input": 32, "interpolation": "LINEAR", "output": 59 }, { "input": 32, "interpolation": "LINEAR", "output": 60 }, { "input": 32, "interpolation": "LINEAR", "output": 61 }, { "input": 32, "interpolation": "LINEAR", "output": 62 }, { "input": 32, "interpolation": "LINEAR", "output": 63 } ] }, { "name": "跑步", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "translation" } }, { "sampler": 1, "target": { "node": 1, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "translation" } }, { "sampler": 3, "target": { "node": 2, "path": "rotation" } }, { "sampler": 4, "target": { "node": 3, "path": "translation" } }, { "sampler": 5, "target": { "node": 3, "path": "rotation" } }, { "sampler": 6, "target": { "node": 4, "path": "translation" } }, { "sampler": 7, "target": { "node": 4, "path": "rotation" } }, { "sampler": 8, "target": { "node": 5, "path": "translation" } }, { "sampler": 9, "target": { "node": 5, "path": "rotation" } }, { "sampler": 10, "target": { "node": 6, "path": "translation" } }, { "sampler": 11, "target": { "node": 6, "path": "rotation" } }, { "sampler": 12, "target": { "node": 7, "path": "translation" } }, { "sampler": 13, "target": { "node": 7, "path": "rotation" } }, { "sampler": 14, "target": { "node": 9, "path": "rotation" } }, { "sampler": 15, "target": { "node": 10, "path": "rotation" } }, { "sampler": 16, "target": { "node": 11, "path": "rotation" } }, { "sampler": 17, "target": { "node": 12, "path": "rotation" } }, { "sampler": 18, "target": { "node": 15, "path": "rotation" } }, { "sampler": 19, "target": { "node": 16, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "rotation" } }, { "sampler": 21, "target": { "node": 18, "path": "rotation" } }, { "sampler": 22, "target": { "node": 21, "path": "rotation" } }, { "sampler": 23, "target": { "node": 23, "path": "translation" } }, { "sampler": 24, "target": { "node": 23, "path": "rotation" } }, { "sampler": 25, "target": { "node": 24, "path": "rotation" } }, { "sampler": 26, "target": { "node": 25, "path": "rotation" } }, { "sampler": 27, "target": { "node": 30, "path": "translation" } }, { "sampler": 28, "target": { "node": 30, "path": "rotation" } }, { "sampler": 29, "target": { "node": 31, "path": "rotation" } }, { "sampler": 30, "target": { "node": 32, "path": "rotation" } } ], "samplers": [ { "input": 64, "interpolation": "LINEAR", "output": 65 }, { "input": 64, "interpolation": "LINEAR", "output": 66 }, { "input": 64, "interpolation": "LINEAR", "output": 67 }, { "input": 64, "interpolation": "LINEAR", "output": 68 }, { "input": 64, "interpolation": "LINEAR", "output": 69 }, { "input": 64, "interpolation": "LINEAR", "output": 70 }, { "input": 64, "interpolation": "LINEAR", "output": 71 }, { "input": 64, "interpolation": "LINEAR", "output": 72 }, { "input": 64, "interpolation": "LINEAR", "output": 73 }, { "input": 64, "interpolation": "LINEAR", "output": 74 }, { "input": 64, "interpolation": "LINEAR", "output": 75 }, { "input": 64, "interpolation": "LINEAR", "output": 76 }, { "input": 64, "interpolation": "LINEAR", "output": 77 }, { "input": 64, "interpolation": "LINEAR", "output": 78 }, { "input": 64, "interpolation": "LINEAR", "output": 79 }, { "input": 64, "interpolation": "LINEAR", "output": 80 }, { "input": 64, "interpolation": "LINEAR", "output": 81 }, { "input": 64, "interpolation": "LINEAR", "output": 82 }, { "input": 64, "interpolation": "LINEAR", "output": 83 }, { "input": 64, "interpolation": "LINEAR", "output": 84 }, { "input": 64, "interpolation": "LINEAR", "output": 85 }, { "input": 64, "interpolation": "LINEAR", "output": 86 }, { "input": 64, "interpolation": "LINEAR", "output": 87 }, { "input": 64, "interpolation": "LINEAR", "output": 88 }, { "input": 64, "interpolation": "LINEAR", "output": 89 }, { "input": 64, "interpolation": "LINEAR", "output": 90 }, { "input": 64, "interpolation": "LINEAR", "output": 91 }, { "input": 64, "interpolation": "LINEAR", "output": 92 }, { "input": 64, "interpolation": "LINEAR", "output": 93 }, { "input": 64, "interpolation": "LINEAR", "output": 94 }, { "input": 64, "interpolation": "LINEAR", "output": 95 } ] }, { "name": "奔跑", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "translation" } }, { "sampler": 1, "target": { "node": 1, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "translation" } }, { "sampler": 3, "target": { "node": 2, "path": "rotation" } }, { "sampler": 4, "target": { "node": 3, "path": "translation" } }, { "sampler": 5, "target": { "node": 3, "path": "rotation" } }, { "sampler": 6, "target": { "node": 4, "path": "translation" } }, { "sampler": 7, "target": { "node": 4, "path": "rotation" } }, { "sampler": 8, "target": { "node": 5, "path": "translation" } }, { "sampler": 9, "target": { "node": 5, "path": "rotation" } }, { "sampler": 10, "target": { "node": 6, "path": "translation" } }, { "sampler": 11, "target": { "node": 6, "path": "rotation" } }, { "sampler": 12, "target": { "node": 7, "path": "translation" } }, { "sampler": 13, "target": { "node": 7, "path": "rotation" } }, { "sampler": 14, "target": { "node": 9, "path": "rotation" } }, { "sampler": 15, "target": { "node": 10, "path": "rotation" } }, { "sampler": 16, "target": { "node": 11, "path": "rotation" } }, { "sampler": 17, "target": { "node": 12, "path": "rotation" } }, { "sampler": 18, "target": { "node": 15, "path": "rotation" } }, { "sampler": 19, "target": { "node": 16, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "rotation" } }, { "sampler": 21, "target": { "node": 18, "path": "rotation" } }, { "sampler": 22, "target": { "node": 21, "path": "rotation" } }, { "sampler": 23, "target": { "node": 23, "path": "translation" } }, { "sampler": 24, "target": { "node": 23, "path": "rotation" } }, { "sampler": 25, "target": { "node": 24, "path": "rotation" } }, { "sampler": 26, "target": { "node": 25, "path": "rotation" } }, { "sampler": 27, "target": { "node": 30, "path": "translation" } }, { "sampler": 28, "target": { "node": 30, "path": "rotation" } }, { "sampler": 29, "target": { "node": 31, "path": "rotation" } }, { "sampler": 30, "target": { "node": 32, "path": "rotation" } } ], "samplers": [ { "input": 96, "interpolation": "LINEAR", "output": 97 }, { "input": 96, "interpolation": "LINEAR", "output": 98 }, { "input": 96, "interpolation": "LINEAR", "output": 99 }, { "input": 96, "interpolation": "LINEAR", "output": 100 }, { "input": 96, "interpolation": "LINEAR", "output": 101 }, { "input": 96, "interpolation": "LINEAR", "output": 102 }, { "input": 96, "interpolation": "LINEAR", "output": 103 }, { "input": 96, "interpolation": "LINEAR", "output": 104 }, { "input": 96, "interpolation": "LINEAR", "output": 105 }, { "input": 96, "interpolation": "LINEAR", "output": 106 }, { "input": 96, "interpolation": "LINEAR", "output": 107 }, { "input": 96, "interpolation": "LINEAR", "output": 108 }, { "input": 96, "interpolation": "LINEAR", "output": 109 }, { "input": 96, "interpolation": "LINEAR", "output": 110 }, { "input": 96, "interpolation": "LINEAR", "output": 111 }, { "input": 96, "interpolation": "LINEAR", "output": 112 }, { "input": 96, "interpolation": "LINEAR", "output": 113 }, { "input": 96, "interpolation": "LINEAR", "output": 114 }, { "input": 96, "interpolation": "LINEAR", "output": 115 }, { "input": 96, "interpolation": "LINEAR", "output": 116 }, { "input": 96, "interpolation": "LINEAR", "output": 117 }, { "input": 96, "interpolation": "LINEAR", "output": 118 }, { "input": 96, "interpolation": "LINEAR", "output": 119 }, { "input": 96, "interpolation": "LINEAR", "output": 120 }, { "input": 96, "interpolation": "LINEAR", "output": 121 }, { "input": 96, "interpolation": "LINEAR", "output": 122 }, { "input": 96, "interpolation": "LINEAR", "output": 123 }, { "input": 96, "interpolation": "LINEAR", "output": 124 }, { "input": 96, "interpolation": "LINEAR", "output": 125 }, { "input": 96, "interpolation": "LINEAR", "output": 126 }, { "input": 96, "interpolation": "LINEAR", "output": 127 } ] }, { "name": "招手", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "translation" } }, { "sampler": 1, "target": { "node": 1, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "translation" } }, { "sampler": 3, "target": { "node": 2, "path": "rotation" } }, { "sampler": 4, "target": { "node": 3, "path": "translation" } }, { "sampler": 5, "target": { "node": 3, "path": "rotation" } }, { "sampler": 6, "target": { "node": 4, "path": "translation" } }, { "sampler": 7, "target": { "node": 4, "path": "rotation" } }, { "sampler": 8, "target": { "node": 5, "path": "translation" } }, { "sampler": 9, "target": { "node": 5, "path": "rotation" } }, { "sampler": 10, "target": { "node": 6, "path": "translation" } }, { "sampler": 11, "target": { "node": 6, "path": "rotation" } }, { "sampler": 12, "target": { "node": 7, "path": "translation" } }, { "sampler": 13, "target": { "node": 7, "path": "rotation" } }, { "sampler": 14, "target": { "node": 9, "path": "rotation" } }, { "sampler": 15, "target": { "node": 10, "path": "rotation" } }, { "sampler": 16, "target": { "node": 11, "path": "rotation" } }, { "sampler": 17, "target": { "node": 12, "path": "rotation" } }, { "sampler": 18, "target": { "node": 15, "path": "rotation" } }, { "sampler": 19, "target": { "node": 16, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "rotation" } }, { "sampler": 21, "target": { "node": 18, "path": "rotation" } }, { "sampler": 22, "target": { "node": 21, "path": "rotation" } }, { "sampler": 23, "target": { "node": 23, "path": "translation" } }, { "sampler": 24, "target": { "node": 23, "path": "rotation" } }, { "sampler": 25, "target": { "node": 24, "path": "rotation" } }, { "sampler": 26, "target": { "node": 25, "path": "rotation" } }, { "sampler": 27, "target": { "node": 30, "path": "translation" } }, { "sampler": 28, "target": { "node": 30, "path": "rotation" } }, { "sampler": 29, "target": { "node": 31, "path": "rotation" } }, { "sampler": 30, "target": { "node": 32, "path": "rotation" } } ], "samplers": [ { "input": 128, "interpolation": "LINEAR", "output": 129 }, { "input": 128, "interpolation": "LINEAR", "output": 130 }, { "input": 128, "interpolation": "LINEAR", "output": 131 }, { "input": 128, "interpolation": "LINEAR", "output": 132 }, { "input": 128, "interpolation": "LINEAR", "output": 133 }, { "input": 128, "interpolation": "LINEAR", "output": 134 }, { "input": 128, "interpolation": "LINEAR", "output": 135 }, { "input": 128, "interpolation": "LINEAR", "output": 136 }, { "input": 128, "interpolation": "LINEAR", "output": 137 }, { "input": 128, "interpolation": "LINEAR", "output": 138 }, { "input": 128, "interpolation": "LINEAR", "output": 139 }, { "input": 128, "interpolation": "LINEAR", "output": 140 }, { "input": 128, "interpolation": "LINEAR", "output": 141 }, { "input": 128, "interpolation": "LINEAR", "output": 142 }, { "input": 128, "interpolation": "LINEAR", "output": 143 }, { "input": 128, "interpolation": "LINEAR", "output": 144 }, { "input": 128, "interpolation": "LINEAR", "output": 145 }, { "input": 128, "interpolation": "LINEAR", "output": 146 }, { "input": 128, "interpolation": "LINEAR", "output": 147 }, { "input": 128, "interpolation": "LINEAR", "output": 148 }, { "input": 128, "interpolation": "LINEAR", "output": 149 }, { "input": 128, "interpolation": "LINEAR", "output": 150 }, { "input": 128, "interpolation": "LINEAR", "output": 151 }, { "input": 128, "interpolation": "LINEAR", "output": 152 }, { "input": 128, "interpolation": "LINEAR", "output": 153 }, { "input": 128, "interpolation": "LINEAR", "output": 154 }, { "input": 128, "interpolation": "LINEAR", "output": 155 }, { "input": 128, "interpolation": "LINEAR", "output": 156 }, { "input": 128, "interpolation": "LINEAR", "output": 157 }, { "input": 128, "interpolation": "LINEAR", "output": 158 }, { "input": 128, "interpolation": "LINEAR", "output": 159 } ] }, { "name": "扑到", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "translation" } }, { "sampler": 1, "target": { "node": 1, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "translation" } }, { "sampler": 3, "target": { "node": 2, "path": "rotation" } }, { "sampler": 4, "target": { "node": 3, "path": "translation" } }, { "sampler": 5, "target": { "node": 3, "path": "rotation" } }, { "sampler": 6, "target": { "node": 4, "path": "translation" } }, { "sampler": 7, "target": { "node": 4, "path": "rotation" } }, { "sampler": 8, "target": { "node": 5, "path": "translation" } }, { "sampler": 9, "target": { "node": 5, "path": "rotation" } }, { "sampler": 10, "target": { "node": 6, "path": "translation" } }, { "sampler": 11, "target": { "node": 6, "path": "rotation" } }, { "sampler": 12, "target": { "node": 7, "path": "translation" } }, { "sampler": 13, "target": { "node": 7, "path": "rotation" } }, { "sampler": 14, "target": { "node": 9, "path": "rotation" } }, { "sampler": 15, "target": { "node": 10, "path": "rotation" } }, { "sampler": 16, "target": { "node": 11, "path": "rotation" } }, { "sampler": 17, "target": { "node": 12, "path": "rotation" } }, { "sampler": 18, "target": { "node": 15, "path": "rotation" } }, { "sampler": 19, "target": { "node": 16, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "rotation" } }, { "sampler": 21, "target": { "node": 18, "path": "rotation" } }, { "sampler": 22, "target": { "node": 21, "path": "rotation" } }, { "sampler": 23, "target": { "node": 23, "path": "translation" } }, { "sampler": 24, "target": { "node": 23, "path": "rotation" } }, { "sampler": 25, "target": { "node": 24, "path": "rotation" } }, { "sampler": 26, "target": { "node": 25, "path": "rotation" } }, { "sampler": 27, "target": { "node": 30, "path": "translation" } }, { "sampler": 28, "target": { "node": 30, "path": "rotation" } }, { "sampler": 29, "target": { "node": 31, "path": "rotation" } }, { "sampler": 30, "target": { "node": 32, "path": "rotation" } } ], "samplers": [ { "input": 160, "interpolation": "LINEAR", "output": 161 }, { "input": 160, "interpolation": "LINEAR", "output": 162 }, { "input": 160, "interpolation": "LINEAR", "output": 163 }, { "input": 160, "interpolation": "LINEAR", "output": 164 }, { "input": 160, "interpolation": "LINEAR", "output": 165 }, { "input": 160, "interpolation": "LINEAR", "output": 166 }, { "input": 160, "interpolation": "LINEAR", "output": 167 }, { "input": 160, "interpolation": "LINEAR", "output": 168 }, { "input": 160, "interpolation": "LINEAR", "output": 169 }, { "input": 160, "interpolation": "LINEAR", "output": 170 }, { "input": 160, "interpolation": "LINEAR", "output": 171 }, { "input": 160, "interpolation": "LINEAR", "output": 172 }, { "input": 160, "interpolation": "LINEAR", "output": 173 }, { "input": 160, "interpolation": "LINEAR", "output": 174 }, { "input": 160, "interpolation": "LINEAR", "output": 175 }, { "input": 160, "interpolation": "LINEAR", "output": 176 }, { "input": 160, "interpolation": "LINEAR", "output": 177 }, { "input": 160, "interpolation": "LINEAR", "output": 178 }, { "input": 160, "interpolation": "LINEAR", "output": 179 }, { "input": 160, "interpolation": "LINEAR", "output": 180 }, { "input": 160, "interpolation": "LINEAR", "output": 181 }, { "input": 160, "interpolation": "LINEAR", "output": 182 }, { "input": 160, "interpolation": "LINEAR", "output": 183 }, { "input": 160, "interpolation": "LINEAR", "output": 184 }, { "input": 160, "interpolation": "LINEAR", "output": 185 }, { "input": 160, "interpolation": "LINEAR", "output": 186 }, { "input": 160, "interpolation": "LINEAR", "output": 187 }, { "input": 160, "interpolation": "LINEAR", "output": 188 }, { "input": 160, "interpolation": "LINEAR", "output": 189 }, { "input": 160, "interpolation": "LINEAR", "output": 190 }, { "input": 160, "interpolation": "LINEAR", "output": 191 } ] }, { "name": "翻跟头", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "translation" } }, { "sampler": 1, "target": { "node": 1, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "translation" } }, { "sampler": 3, "target": { "node": 2, "path": "rotation" } }, { "sampler": 4, "target": { "node": 3, "path": "translation" } }, { "sampler": 5, "target": { "node": 3, "path": "rotation" } }, { "sampler": 6, "target": { "node": 4, "path": "translation" } }, { "sampler": 7, "target": { "node": 4, "path": "rotation" } }, { "sampler": 8, "target": { "node": 5, "path": "translation" } }, { "sampler": 9, "target": { "node": 5, "path": "rotation" } }, { "sampler": 10, "target": { "node": 6, "path": "translation" } }, { "sampler": 11, "target": { "node": 6, "path": "rotation" } }, { "sampler": 12, "target": { "node": 7, "path": "translation" } }, { "sampler": 13, "target": { "node": 7, "path": "rotation" } }, { "sampler": 14, "target": { "node": 9, "path": "rotation" } }, { "sampler": 15, "target": { "node": 10, "path": "rotation" } }, { "sampler": 16, "target": { "node": 11, "path": "rotation" } }, { "sampler": 17, "target": { "node": 12, "path": "rotation" } }, { "sampler": 18, "target": { "node": 15, "path": "rotation" } }, { "sampler": 19, "target": { "node": 16, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "rotation" } }, { "sampler": 21, "target": { "node": 18, "path": "rotation" } }, { "sampler": 22, "target": { "node": 21, "path": "rotation" } }, { "sampler": 23, "target": { "node": 23, "path": "translation" } }, { "sampler": 24, "target": { "node": 23, "path": "rotation" } }, { "sampler": 25, "target": { "node": 24, "path": "rotation" } }, { "sampler": 26, "target": { "node": 25, "path": "rotation" } }, { "sampler": 27, "target": { "node": 30, "path": "translation" } }, { "sampler": 28, "target": { "node": 30, "path": "rotation" } }, { "sampler": 29, "target": { "node": 31, "path": "rotation" } }, { "sampler": 30, "target": { "node": 32, "path": "rotation" } } ], "samplers": [ { "input": 192, "interpolation": "LINEAR", "output": 193 }, { "input": 192, "interpolation": "LINEAR", "output": 194 }, { "input": 192, "interpolation": "LINEAR", "output": 195 }, { "input": 192, "interpolation": "LINEAR", "output": 196 }, { "input": 192, "interpolation": "LINEAR", "output": 197 }, { "input": 192, "interpolation": "LINEAR", "output": 198 }, { "input": 192, "interpolation": "LINEAR", "output": 199 }, { "input": 192, "interpolation": "LINEAR", "output": 200 }, { "input": 192, "interpolation": "LINEAR", "output": 201 }, { "input": 192, "interpolation": "LINEAR", "output": 202 }, { "input": 192, "interpolation": "LINEAR", "output": 203 }, { "input": 192, "interpolation": "LINEAR", "output": 204 }, { "input": 192, "interpolation": "LINEAR", "output": 205 }, { "input": 192, "interpolation": "LINEAR", "output": 206 }, { "input": 192, "interpolation": "LINEAR", "output": 207 }, { "input": 192, "interpolation": "LINEAR", "output": 208 }, { "input": 192, "interpolation": "LINEAR", "output": 209 }, { "input": 192, "interpolation": "LINEAR", "output": 210 }, { "input": 192, "interpolation": "LINEAR", "output": 211 }, { "input": 192, "interpolation": "LINEAR", "output": 212 }, { "input": 192, "interpolation": "LINEAR", "output": 213 }, { "input": 192, "interpolation": "LINEAR", "output": 214 }, { "input": 192, "interpolation": "LINEAR", "output": 215 }, { "input": 192, "interpolation": "LINEAR", "output": 216 }, { "input": 192, "interpolation": "LINEAR", "output": 217 }, { "input": 192, "interpolation": "LINEAR", "output": 218 }, { "input": 192, "interpolation": "LINEAR", "output": 219 }, { "input": 192, "interpolation": "LINEAR", "output": 220 }, { "input": 192, "interpolation": "LINEAR", "output": 221 }, { "input": 192, "interpolation": "LINEAR", "output": 222 }, { "input": 192, "interpolation": "LINEAR", "output": 223 } ] }, { "name": "行走", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "translation" } }, { "sampler": 1, "target": { "node": 1, "path": "rotation" } }, { "sampler": 2, "target": { "node": 2, "path": "translation" } }, { "sampler": 3, "target": { "node": 2, "path": "rotation" } }, { "sampler": 4, "target": { "node": 3, "path": "translation" } }, { "sampler": 5, "target": { "node": 3, "path": "rotation" } }, { "sampler": 6, "target": { "node": 4, "path": "translation" } }, { "sampler": 7, "target": { "node": 4, "path": "rotation" } }, { "sampler": 8, "target": { "node": 5, "path": "translation" } }, { "sampler": 9, "target": { "node": 5, "path": "rotation" } }, { "sampler": 10, "target": { "node": 6, "path": "translation" } }, { "sampler": 11, "target": { "node": 6, "path": "rotation" } }, { "sampler": 12, "target": { "node": 7, "path": "translation" } }, { "sampler": 13, "target": { "node": 7, "path": "rotation" } }, { "sampler": 14, "target": { "node": 9, "path": "rotation" } }, { "sampler": 15, "target": { "node": 10, "path": "rotation" } }, { "sampler": 16, "target": { "node": 11, "path": "rotation" } }, { "sampler": 17, "target": { "node": 12, "path": "rotation" } }, { "sampler": 18, "target": { "node": 15, "path": "rotation" } }, { "sampler": 19, "target": { "node": 16, "path": "rotation" } }, { "sampler": 20, "target": { "node": 17, "path": "rotation" } }, { "sampler": 21, "target": { "node": 18, "path": "rotation" } }, { "sampler": 22, "target": { "node": 21, "path": "rotation" } }, { "sampler": 23, "target": { "node": 23, "path": "translation" } }, { "sampler": 24, "target": { "node": 23, "path": "rotation" } }, { "sampler": 25, "target": { "node": 24, "path": "rotation" } }, { "sampler": 26, "target": { "node": 25, "path": "rotation" } }, { "sampler": 27, "target": { "node": 30, "path": "translation" } }, { "sampler": 28, "target": { "node": 30, "path": "rotation" } }, { "sampler": 29, "target": { "node": 31, "path": "rotation" } }, { "sampler": 30, "target": { "node": 32, "path": "rotation" } } ], "samplers": [ { "input": 224, "interpolation": "LINEAR", "output": 225 }, { "input": 224, "interpolation": "LINEAR", "output": 226 }, { "input": 224, "interpolation": "LINEAR", "output": 227 }, { "input": 224, "interpolation": "LINEAR", "output": 228 }, { "input": 224, "interpolation": "LINEAR", "output": 229 }, { "input": 224, "interpolation": "LINEAR", "output": 230 }, { "input": 224, "interpolation": "LINEAR", "output": 231 }, { "input": 224, "interpolation": "LINEAR", "output": 232 }, { "input": 224, "interpolation": "LINEAR", "output": 233 }, { "input": 224, "interpolation": "LINEAR", "output": 234 }, { "input": 224, "interpolation": "LINEAR", "output": 235 }, { "input": 224, "interpolation": "LINEAR", "output": 236 }, { "input": 224, "interpolation": "LINEAR", "output": 237 }, { "input": 224, "interpolation": "LINEAR", "output": 238 }, { "input": 224, "interpolation": "LINEAR", "output": 239 }, { "input": 224, "interpolation": "LINEAR", "output": 240 }, { "input": 224, "interpolation": "LINEAR", "output": 241 }, { "input": 224, "interpolation": "LINEAR", "output": 242 }, { "input": 224, "interpolation": "LINEAR", "output": 243 }, { "input": 224, "interpolation": "LINEAR", "output": 244 }, { "input": 224, "interpolation": "LINEAR", "output": 245 }, { "input": 224, "interpolation": "LINEAR", "output": 246 }, { "input": 224, "interpolation": "LINEAR", "output": 247 }, { "input": 224, "interpolation": "LINEAR", "output": 248 }, { "input": 224, "interpolation": "LINEAR", "output": 249 }, { "input": 224, "interpolation": "LINEAR", "output": 250 }, { "input": 224, "interpolation": "LINEAR", "output": 251 }, { "input": 224, "interpolation": "LINEAR", "output": 252 }, { "input": 224, "interpolation": "LINEAR", "output": 253 }, { "input": 224, "interpolation": "LINEAR", "output": 254 }, { "input": 224, "interpolation": "LINEAR", "output": 255 } ] } ], "asset": { "generator": "FBX2glTF", "version": "2.0" }, "scene": 0, "scenes": [ { "name": "Root Scene", "nodes": [ 0 ] } ], "samplers": [ {} ], "skins": [ { "joints": [ 12, 21, 9, 7, 8, 15, 16, 18, 6, 5, 4, 3, 1, 23, 30, 32, 24, 25, 31, 10, 11, 17, 22 ], "inverseBindMatrices": 266, "skeleton": 1 } ] } ================================================ FILE: examples/resources/models/gltf/UinoSpaceman/README.md ================================================ # UINO Spaceman ## License Information Donated by UINO for glTF testing. ================================================ FILE: examples/resources/models/gltf/UinoSpaceman/glTF/UinoSpaceman.gltf ================================================ { "materials": [ { "name": "Material__0", "pbrMetallicRoughness": { "baseColorTexture": { "index": 0, "texCoord": 0 }, "metallicRoughnessTexture": { "index": 1, "texCoord": 0 }, "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 1.0, "roughnessFactor": 1 }, "alphaMode": "OPAQUE", "normalTexture": { "index": 2, "texCoord": 0, "scale": 3.33333325 } }, { "name": "pasted__blinn2", "pbrMetallicRoughness": { "baseColorTexture": { "index": 3, "texCoord": 0 }, "metallicRoughnessTexture": { "index": 4, "texCoord": 0 }, "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 1.0, "roughnessFactor": 1 }, "alphaMode": "OPAQUE", "normalTexture": { "index": 5, "texCoord": 0, "scale": 3.33333325 } }, { "name": "blinn2", "pbrMetallicRoughness": { "baseColorTexture": { "index": 6, "texCoord": 0 }, "metallicRoughnessTexture": { "index": 7, "texCoord": 0 }, "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 1.0, "roughnessFactor": 1 }, "alphaMode": "OPAQUE", "normalTexture": { "index": 8, "texCoord": 0, "scale": 1.00000012 } }, { "name": "pasted__blinn3", "pbrMetallicRoughness": { "baseColorTexture": { "index": 9, "texCoord": 0 }, "metallicRoughnessTexture": { "index": 10, "texCoord": 0 }, "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 1.0, "roughnessFactor": 1 }, "alphaMode": "OPAQUE", "normalTexture": { "index": 11, "texCoord": 0, "scale": 3.33333325 } }, { "name": "phong2", "pbrMetallicRoughness": { "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 0.432192773, "roughnessFactor": 1 }, "alphaMode": "OPAQUE" }, { "name": "phong1", "pbrMetallicRoughness": { "baseColorFactor": [ 1.0, 1.0, 1.0, 1.0 ], "metallicFactor": 0.432192773, "roughnessFactor": 1 }, "alphaMode": "OPAQUE" }, { "name": "14_-_Default", "pbrMetallicRoughness": { "baseColorFactor": [ 1.0, 0.235294119, 0.0, 1.0 ], "metallicFactor": 0.099999994, "roughnessFactor": 1 }, "alphaMode": "OPAQUE" }, { "name": "13_-_Default", "pbrMetallicRoughness": { "baseColorFactor": [ 0.458823532, 0.458823532, 0.458823532, 1.0 ], "metallicFactor": 0.099999994, "roughnessFactor": 1 }, "alphaMode": "OPAQUE", "emissiveFactor": [ 0.0, 0.0, 0.0, 1.0 ] } ], "images": [ { "uri": "0605F879518358A23C3A7BD61E0DCE5D.jpg" }, { "uri": "9F4C460B2286137594802E0D6DC56CCF.jpg" }, { "uri": "FFDABEEA4B7D1A4658AD85BF905A1277.jpg" }, { "uri": "1916F27F123E47B55837AE5B5168E305.jpg" }, { "uri": "77467CC5AD8C9483B1C972DACC46050C.jpg" }, { "uri": "DC2CC8C40955EA55A3EC4B751E652C87.jpg" }, { "uri": "BEE58ADC6115F4C8416BC072E498185E.jpg" }, { "uri": "8BA17DF047BB36FBCA7200AB32A67B14.jpg" }, { "uri": "9FCD436A3C76F5CE2A75D78F213B5C53.jpg" }, { "uri": "AA91BD633E318F9EEDAE9812A3A801CE.jpg" }, { "uri": "61576C484F56D84C580E9D1A44FF688F.jpg" }, { "uri": "1D8523D0BE883390D0DE359432371C62.jpg" } ], "textures": [ { "name": "smd_10.jpg", "sampler": 0, "source": 0 }, { "name": "smd_11.jpg", "sampler": 0, "source": 1 }, { "name": "smd_12.jpg", "sampler": 0, "source": 2 }, { "name": "smd_1.jpg", "sampler": 0, "source": 3 }, { "name": "smd_2.jpg", "sampler": 0, "source": 4 }, { "name": "smd_3.jpg", "sampler": 0, "source": 5 }, { "name": "smd_4.jpg", "sampler": 0, "source": 6 }, { "name": "smd_5.jpg", "sampler": 0, "source": 7 }, { "name": "smd_6.jpg", "sampler": 0, "source": 8 }, { "name": "smd_7.jpg", "sampler": 0, "source": 9 }, { "name": "smd_8.jpg", "sampler": 0, "source": 10 }, { "name": "smd_9.jpg", "sampler": 0, "source": 11 } ], "meshes": [ { "name": "pasted__head", "primitives": [ { "material": 0, "mode": 4, "indices": 162, "attributes": { "JOINTS_0": 166, "NORMAL": 164, "POSITION": 163, "TEXCOORD_0": 165, "WEIGHTS_0": 167 } } ] }, { "name": "low", "primitives": [ { "material": 1, "mode": 4, "indices": 168, "attributes": { "JOINTS_0": 172, "NORMAL": 170, "POSITION": 169, "TEXCOORD_0": 171, "WEIGHTS_0": 173 } }, { "material": 2, "mode": 4, "indices": 174, "attributes": { "JOINTS_0": 178, "NORMAL": 176, "POSITION": 175, "TEXCOORD_0": 177, "WEIGHTS_0": 179 } }, { "material": 3, "mode": 4, "indices": 180, "attributes": { "JOINTS_0": 184, "NORMAL": 182, "POSITION": 181, "TEXCOORD_0": 183, "WEIGHTS_0": 185 } }, { "material": 4, "mode": 4, "indices": 186, "attributes": { "JOINTS_0": 190, "NORMAL": 188, "POSITION": 187, "TEXCOORD_0": 189, "WEIGHTS_0": 191 } }, { "material": 5, "mode": 4, "indices": 192, "attributes": { "JOINTS_0": 196, "NORMAL": 194, "POSITION": 193, "TEXCOORD_0": 195, "WEIGHTS_0": 197 } } ] }, { "name": "Object", "primitives": [ { "material": 6, "mode": 4, "indices": 198, "attributes": { "NORMAL": 200, "POSITION": 199, "TEXCOORD_0": 201 } }, { "material": 7, "mode": 4, "indices": 202, "attributes": { "NORMAL": 204, "POSITION": 203, "TEXCOORD_0": 205 } } ] } ], "buffers": [ { "byteLength": 1667988, "uri": "8BEF09AA5C4E08AE56A3C325C2EB3610.bin" } ], "bufferViews": [ { "buffer": 0, "byteLength": 104, "byteOffset": 0 }, { "buffer": 0, "byteLength": 312, "byteOffset": 104 }, { "buffer": 0, "byteLength": 416, "byteOffset": 416 }, { "buffer": 0, "byteLength": 416, "byteOffset": 832 }, { "buffer": 0, "byteLength": 416, "byteOffset": 1248 }, { "buffer": 0, "byteLength": 416, "byteOffset": 1664 }, { "buffer": 0, "byteLength": 416, "byteOffset": 2080 }, { "buffer": 0, "byteLength": 416, "byteOffset": 2496 }, { "buffer": 0, "byteLength": 416, "byteOffset": 2912 }, { "buffer": 0, "byteLength": 416, "byteOffset": 3328 }, { "buffer": 0, "byteLength": 416, "byteOffset": 3744 }, { "buffer": 0, "byteLength": 416, "byteOffset": 4160 }, { "buffer": 0, "byteLength": 416, "byteOffset": 4576 }, { "buffer": 0, "byteLength": 416, "byteOffset": 4992 }, { "buffer": 0, "byteLength": 416, "byteOffset": 5408 }, { "buffer": 0, "byteLength": 416, "byteOffset": 5824 }, { "buffer": 0, "byteLength": 416, "byteOffset": 6240 }, { "buffer": 0, "byteLength": 416, "byteOffset": 6656 }, { "buffer": 0, "byteLength": 416, "byteOffset": 7072 }, { "buffer": 0, "byteLength": 416, "byteOffset": 7488 }, { "buffer": 0, "byteLength": 416, "byteOffset": 7904 }, { "buffer": 0, "byteLength": 416, "byteOffset": 8320 }, { "buffer": 0, "byteLength": 416, "byteOffset": 8736 }, { "buffer": 0, "byteLength": 416, "byteOffset": 9152 }, { "buffer": 0, "byteLength": 416, "byteOffset": 9568 }, { "buffer": 0, "byteLength": 416, "byteOffset": 9984 }, { "buffer": 0, "byteLength": 416, "byteOffset": 10400 }, { "buffer": 0, "byteLength": 416, "byteOffset": 10816 }, { "buffer": 0, "byteLength": 416, "byteOffset": 11232 }, { "buffer": 0, "byteLength": 416, "byteOffset": 11648 }, { "buffer": 0, "byteLength": 416, "byteOffset": 12064 }, { "buffer": 0, "byteLength": 416, "byteOffset": 12480 }, { "buffer": 0, "byteLength": 416, "byteOffset": 12896 }, { "buffer": 0, "byteLength": 416, "byteOffset": 13312 }, { "buffer": 0, "byteLength": 416, "byteOffset": 13728 }, { "buffer": 0, "byteLength": 416, "byteOffset": 14144 }, { "buffer": 0, "byteLength": 416, "byteOffset": 14560 }, { "buffer": 0, "byteLength": 416, "byteOffset": 14976 }, { "buffer": 0, "byteLength": 416, "byteOffset": 15392 }, { "buffer": 0, "byteLength": 416, "byteOffset": 15808 }, { "buffer": 0, "byteLength": 416, "byteOffset": 16224 }, { "buffer": 0, "byteLength": 416, "byteOffset": 16640 }, { "buffer": 0, "byteLength": 416, "byteOffset": 17056 }, { "buffer": 0, "byteLength": 416, "byteOffset": 17472 }, { "buffer": 0, "byteLength": 416, "byteOffset": 17888 }, { "buffer": 0, "byteLength": 416, "byteOffset": 18304 }, { "buffer": 0, "byteLength": 416, "byteOffset": 18720 }, { "buffer": 0, "byteLength": 416, "byteOffset": 19136 }, { "buffer": 0, "byteLength": 416, "byteOffset": 19552 }, { "buffer": 0, "byteLength": 416, "byteOffset": 19968 }, { "buffer": 0, "byteLength": 416, "byteOffset": 20384 }, { "buffer": 0, "byteLength": 416, "byteOffset": 20800 }, { "buffer": 0, "byteLength": 416, "byteOffset": 21216 }, { "buffer": 0, "byteLength": 416, "byteOffset": 21632 }, { "buffer": 0, "byteLength": 144, "byteOffset": 22048 }, { "buffer": 0, "byteLength": 432, "byteOffset": 22192 }, { "buffer": 0, "byteLength": 576, "byteOffset": 22624 }, { "buffer": 0, "byteLength": 576, "byteOffset": 23200 }, { "buffer": 0, "byteLength": 576, "byteOffset": 23776 }, { "buffer": 0, "byteLength": 576, "byteOffset": 24352 }, { "buffer": 0, "byteLength": 576, "byteOffset": 24928 }, { "buffer": 0, "byteLength": 576, "byteOffset": 25504 }, { "buffer": 0, "byteLength": 576, "byteOffset": 26080 }, { "buffer": 0, "byteLength": 576, "byteOffset": 26656 }, { "buffer": 0, "byteLength": 576, "byteOffset": 27232 }, { "buffer": 0, "byteLength": 576, "byteOffset": 27808 }, { "buffer": 0, "byteLength": 576, "byteOffset": 28384 }, { "buffer": 0, "byteLength": 576, "byteOffset": 28960 }, { "buffer": 0, "byteLength": 576, "byteOffset": 29536 }, { "buffer": 0, "byteLength": 576, "byteOffset": 30112 }, { "buffer": 0, "byteLength": 576, "byteOffset": 30688 }, { "buffer": 0, "byteLength": 576, "byteOffset": 31264 }, { "buffer": 0, "byteLength": 576, "byteOffset": 31840 }, { "buffer": 0, "byteLength": 576, "byteOffset": 32416 }, { "buffer": 0, "byteLength": 576, "byteOffset": 32992 }, { "buffer": 0, "byteLength": 576, "byteOffset": 33568 }, { "buffer": 0, "byteLength": 576, "byteOffset": 34144 }, { "buffer": 0, "byteLength": 576, "byteOffset": 34720 }, { "buffer": 0, "byteLength": 576, "byteOffset": 35296 }, { "buffer": 0, "byteLength": 576, "byteOffset": 35872 }, { "buffer": 0, "byteLength": 576, "byteOffset": 36448 }, { "buffer": 0, "byteLength": 576, "byteOffset": 37024 }, { "buffer": 0, "byteLength": 576, "byteOffset": 37600 }, { "buffer": 0, "byteLength": 576, "byteOffset": 38176 }, { "buffer": 0, "byteLength": 576, "byteOffset": 38752 }, { "buffer": 0, "byteLength": 576, "byteOffset": 39328 }, { "buffer": 0, "byteLength": 576, "byteOffset": 39904 }, { "buffer": 0, "byteLength": 576, "byteOffset": 40480 }, { "buffer": 0, "byteLength": 576, "byteOffset": 41056 }, { "buffer": 0, "byteLength": 576, "byteOffset": 41632 }, { "buffer": 0, "byteLength": 576, "byteOffset": 42208 }, { "buffer": 0, "byteLength": 576, "byteOffset": 42784 }, { "buffer": 0, "byteLength": 576, "byteOffset": 43360 }, { "buffer": 0, "byteLength": 576, "byteOffset": 43936 }, { "buffer": 0, "byteLength": 576, "byteOffset": 44512 }, { "buffer": 0, "byteLength": 576, "byteOffset": 45088 }, { "buffer": 0, "byteLength": 576, "byteOffset": 45664 }, { "buffer": 0, "byteLength": 576, "byteOffset": 46240 }, { "buffer": 0, "byteLength": 576, "byteOffset": 46816 }, { "buffer": 0, "byteLength": 576, "byteOffset": 47392 }, { "buffer": 0, "byteLength": 576, "byteOffset": 47968 }, { "buffer": 0, "byteLength": 576, "byteOffset": 48544 }, { "buffer": 0, "byteLength": 576, "byteOffset": 49120 }, { "buffer": 0, "byteLength": 576, "byteOffset": 49696 }, { "buffer": 0, "byteLength": 576, "byteOffset": 50272 }, { "buffer": 0, "byteLength": 576, "byteOffset": 50848 }, { "buffer": 0, "byteLength": 576, "byteOffset": 51424 }, { "buffer": 0, "byteLength": 576, "byteOffset": 52000 }, { "buffer": 0, "byteLength": 388, "byteOffset": 52576 }, { "buffer": 0, "byteLength": 1164, "byteOffset": 52964 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 54128 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 55680 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 57232 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 58784 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 60336 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 61888 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 63440 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 64992 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 66544 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 68096 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 69648 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 71200 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 72752 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 74304 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 75856 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 77408 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 78960 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 80512 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 82064 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 83616 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 85168 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 86720 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 88272 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 89824 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 91376 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 92928 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 94480 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 96032 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 97584 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 99136 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 100688 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 102240 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 103792 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 105344 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 106896 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 108448 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 110000 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 111552 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 113104 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 114656 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 116208 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 117760 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 119312 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 120864 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 122416 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 123968 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 125520 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 127072 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 128624 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 130176 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 131728 }, { "buffer": 0, "byteLength": 1552, "byteOffset": 133280 }, { "buffer": 0, "target": 34963, "byteLength": 33168, "byteOffset": 134832 }, { "buffer": 0, "target": 34962, "byteLength": 48096, "byteOffset": 168000 }, { "buffer": 0, "target": 34962, "byteLength": 48096, "byteOffset": 216096 }, { "buffer": 0, "target": 34962, "byteLength": 32064, "byteOffset": 264192 }, { "buffer": 0, "target": 34962, "byteLength": 32064, "byteOffset": 296256 }, { "buffer": 0, "target": 34962, "byteLength": 64128, "byteOffset": 328320 }, { "buffer": 0, "target": 34963, "byteLength": 84480, "byteOffset": 392448 }, { "buffer": 0, "target": 34962, "byteLength": 159588, "byteOffset": 476928 }, { "buffer": 0, "target": 34962, "byteLength": 159588, "byteOffset": 636516 }, { "buffer": 0, "target": 34962, "byteLength": 106392, "byteOffset": 796104 }, { "buffer": 0, "target": 34962, "byteLength": 106392, "byteOffset": 902496 }, { "buffer": 0, "target": 34962, "byteLength": 212784, "byteOffset": 1008888 }, { "buffer": 0, "target": 34963, "byteLength": 42408, "byteOffset": 1221672 }, { "buffer": 0, "target": 34962, "byteLength": 52584, "byteOffset": 1264080 }, { "buffer": 0, "target": 34962, "byteLength": 52584, "byteOffset": 1316664 }, { "buffer": 0, "target": 34962, "byteLength": 35056, "byteOffset": 1369248 }, { "buffer": 0, "target": 34962, "byteLength": 35056, "byteOffset": 1404304 }, { "buffer": 0, "target": 34962, "byteLength": 70112, "byteOffset": 1439360 }, { "buffer": 0, "target": 34963, "byteLength": 9252, "byteOffset": 1509472 }, { "buffer": 0, "target": 34962, "byteLength": 21264, "byteOffset": 1518724 }, { "buffer": 0, "target": 34962, "byteLength": 21264, "byteOffset": 1539988 }, { "buffer": 0, "target": 34962, "byteLength": 14176, "byteOffset": 1561252 }, { "buffer": 0, "target": 34962, "byteLength": 14176, "byteOffset": 1575428 }, { "buffer": 0, "target": 34962, "byteLength": 28352, "byteOffset": 1589604 }, { "buffer": 0, "target": 34963, "byteLength": 1056, "byteOffset": 1617956 }, { "buffer": 0, "target": 34962, "byteLength": 2352, "byteOffset": 1619012 }, { "buffer": 0, "target": 34962, "byteLength": 2352, "byteOffset": 1621364 }, { "buffer": 0, "target": 34962, "byteLength": 1568, "byteOffset": 1623716 }, { "buffer": 0, "target": 34962, "byteLength": 1568, "byteOffset": 1625284 }, { "buffer": 0, "target": 34962, "byteLength": 3136, "byteOffset": 1626852 }, { "buffer": 0, "target": 34963, "byteLength": 1440, "byteOffset": 1629988 }, { "buffer": 0, "target": 34962, "byteLength": 3432, "byteOffset": 1631428 }, { "buffer": 0, "target": 34962, "byteLength": 3432, "byteOffset": 1634860 }, { "buffer": 0, "target": 34962, "byteLength": 2288, "byteOffset": 1638292 }, { "buffer": 0, "target": 34962, "byteLength": 2288, "byteOffset": 1640580 }, { "buffer": 0, "target": 34962, "byteLength": 4576, "byteOffset": 1642868 }, { "buffer": 0, "target": 34963, "byteLength": 1056, "byteOffset": 1647444 }, { "buffer": 0, "target": 34962, "byteLength": 2352, "byteOffset": 1648500 }, { "buffer": 0, "target": 34962, "byteLength": 2352, "byteOffset": 1650852 }, { "buffer": 0, "target": 34962, "byteLength": 1568, "byteOffset": 1653204 }, { "buffer": 0, "target": 34963, "byteLength": 1440, "byteOffset": 1654772 }, { "buffer": 0, "target": 34962, "byteLength": 3072, "byteOffset": 1656212 }, { "buffer": 0, "target": 34962, "byteLength": 3072, "byteOffset": 1659284 }, { "buffer": 0, "target": 34962, "byteLength": 2048, "byteOffset": 1662356 }, { "buffer": 0, "byteLength": 256, "byteOffset": 1664404 }, { "buffer": 0, "byteLength": 3328, "byteOffset": 1664660 } ], "accessors": [ { "componentType": 5126, "type": "SCALAR", "bufferView": 0, "byteOffset": 0, "count": 26, "min": [ 0.0 ], "max": [ 1.04166662693024 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 1, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 2, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 3, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 4, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 5, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 6, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 7, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 8, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 9, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 10, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 11, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 12, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 13, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 14, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 15, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 16, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 17, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 18, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 19, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 20, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 21, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 22, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 23, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 24, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 25, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 26, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 27, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 28, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 29, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 30, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 31, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 32, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 33, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 34, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 35, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 36, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 37, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 38, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 39, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 40, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 41, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 42, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 43, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 44, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 45, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 46, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 47, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 48, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 49, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 50, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 51, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 52, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "VEC4", "bufferView": 53, "byteOffset": 0, "count": 26 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 54, "byteOffset": 0, "count": 36, "min": [ -0.02500319480896 ], "max": [ 1.43333005905151 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 55, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 56, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 57, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 58, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 59, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 60, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 61, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 62, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 63, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 64, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 65, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 66, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 67, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 68, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 69, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 70, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 71, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 72, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 73, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 74, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 75, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 76, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 77, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 78, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 79, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 80, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 81, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 82, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 83, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 84, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 85, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 86, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 87, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 88, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 89, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 90, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 91, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 92, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 93, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 94, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 95, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 96, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 97, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 98, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 99, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 100, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 101, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 102, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 103, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 104, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 105, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 106, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "VEC4", "bufferView": 107, "byteOffset": 0, "count": 36 }, { "componentType": 5126, "type": "SCALAR", "bufferView": 108, "byteOffset": 0, "count": 97, "min": [ -0.00833368301391602 ], "max": [ 3.99166679382324 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 109, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 110, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 111, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 112, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 113, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 114, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 115, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 116, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 117, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 118, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 119, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 120, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 121, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 122, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 123, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 124, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 125, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 126, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 127, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 128, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 129, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 130, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 131, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 132, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 133, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 134, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 135, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 136, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 137, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 138, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 139, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 140, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 141, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 142, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 143, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 144, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 145, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 146, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 147, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 148, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 149, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 150, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 151, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 152, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 153, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 154, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 155, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 156, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 157, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 158, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 159, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 160, "byteOffset": 0, "count": 97 }, { "componentType": 5126, "type": "VEC4", "bufferView": 161, "byteOffset": 0, "count": 97 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 162, "byteOffset": 0, "count": 16584 }, { "componentType": 5126, "type": "VEC3", "bufferView": 163, "byteOffset": 0, "count": 4008, "min": [ -31.4961032867432, 84.049919128418, -25.3357048034668 ], "max": [ 29.3061943054199, 151.543701171875, 29.5733547210693 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 164, "byteOffset": 0, "count": 4008 }, { "componentType": 5126, "type": "VEC2", "bufferView": 165, "byteOffset": 0, "count": 4008 }, { "componentType": 5123, "type": "VEC4", "bufferView": 166, "byteOffset": 0, "count": 4008 }, { "componentType": 5126, "type": "VEC4", "bufferView": 167, "byteOffset": 0, "count": 4008 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 168, "byteOffset": 0, "count": 42240 }, { "componentType": 5126, "type": "VEC3", "bufferView": 169, "byteOffset": 0, "count": 13299, "min": [ -109.253967285156, -50.0867004394531, -53.347770690918 ], "max": [ 109.253967285156, 102.821922302246, 45.3497695922852 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 170, "byteOffset": 0, "count": 13299 }, { "componentType": 5126, "type": "VEC2", "bufferView": 171, "byteOffset": 0, "count": 13299 }, { "componentType": 5123, "type": "VEC4", "bufferView": 172, "byteOffset": 0, "count": 13299 }, { "componentType": 5126, "type": "VEC4", "bufferView": 173, "byteOffset": 0, "count": 13299 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 174, "byteOffset": 0, "count": 21204 }, { "componentType": 5126, "type": "VEC3", "bufferView": 175, "byteOffset": 0, "count": 4382, "min": [ -109.888336181641, -172.572296142578, -26.7215366363525 ], "max": [ 109.888336181641, 91.2343368530273, 24.635103225708 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 176, "byteOffset": 0, "count": 4382 }, { "componentType": 5126, "type": "VEC2", "bufferView": 177, "byteOffset": 0, "count": 4382 }, { "componentType": 5123, "type": "VEC4", "bufferView": 178, "byteOffset": 0, "count": 4382 }, { "componentType": 5126, "type": "VEC4", "bufferView": 179, "byteOffset": 0, "count": 4382 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 180, "byteOffset": 0, "count": 4626 }, { "componentType": 5126, "type": "VEC3", "bufferView": 181, "byteOffset": 0, "count": 1772, "min": [ -47.3228912353516, -20.2738227844238, -57.0333862304688 ], "max": [ 47.3228912353516, 107.502044677734, -15.4966373443604 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 182, "byteOffset": 0, "count": 1772 }, { "componentType": 5126, "type": "VEC2", "bufferView": 183, "byteOffset": 0, "count": 1772 }, { "componentType": 5123, "type": "VEC4", "bufferView": 184, "byteOffset": 0, "count": 1772 }, { "componentType": 5126, "type": "VEC4", "bufferView": 185, "byteOffset": 0, "count": 1772 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 186, "byteOffset": 0, "count": 528 }, { "componentType": 5126, "type": "VEC3", "bufferView": 187, "byteOffset": 0, "count": 196, "min": [ -9.11502838134766, 48.9572410583496, -52.668571472168 ], "max": [ 9.20424652099609, 54.1539268493652, -51.3487129211426 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 188, "byteOffset": 0, "count": 196 }, { "componentType": 5126, "type": "VEC2", "bufferView": 189, "byteOffset": 0, "count": 196 }, { "componentType": 5123, "type": "VEC4", "bufferView": 190, "byteOffset": 0, "count": 196 }, { "componentType": 5126, "type": "VEC4", "bufferView": 191, "byteOffset": 0, "count": 196 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 192, "byteOffset": 0, "count": 720 }, { "componentType": 5126, "type": "VEC3", "bufferView": 193, "byteOffset": 0, "count": 286, "min": [ -10.0765247344971, 29.3010082244873, -52.668571472168 ], "max": [ 10.0765266418457, 49.4540672302246, -51.3487091064453 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 194, "byteOffset": 0, "count": 286 }, { "componentType": 5126, "type": "VEC2", "bufferView": 195, "byteOffset": 0, "count": 286 }, { "componentType": 5123, "type": "VEC4", "bufferView": 196, "byteOffset": 0, "count": 286 }, { "componentType": 5126, "type": "VEC4", "bufferView": 197, "byteOffset": 0, "count": 286 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 198, "byteOffset": 0, "count": 528 }, { "componentType": 5126, "type": "VEC3", "bufferView": 199, "byteOffset": 0, "count": 196, "min": [ -10.1690511703491, 67.3666610717773, -54.4268188476563 ], "max": [ 8.18783092498779, 72.8659057617188, -50.9455146789551 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 200, "byteOffset": 0, "count": 196 }, { "componentType": 5126, "type": "VEC2", "bufferView": 201, "byteOffset": 0, "count": 196 }, { "componentType": 5123, "type": "SCALAR", "bufferView": 202, "byteOffset": 0, "count": 720 }, { "componentType": 5126, "type": "VEC3", "bufferView": 203, "byteOffset": 0, "count": 256, "min": [ -11.4010210037231, 47.8448944091797, -54.7154273986816 ], "max": [ 8.78729820251465, 68.0142364501953, -51.098316192627 ] }, { "componentType": 5126, "type": "VEC3", "bufferView": 204, "byteOffset": 0, "count": 256 }, { "componentType": 5126, "type": "VEC2", "bufferView": 205, "byteOffset": 0, "count": 256 }, { "componentType": 5126, "type": "MAT4", "bufferView": 206, "byteOffset": 0, "count": 4 }, { "componentType": 5126, "type": "MAT4", "bufferView": 207, "byteOffset": 0, "count": 52 } ], "nodes": [ { "name": "RootNode", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ 0.0, 0.0, 0.0, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 1, 2, 3, 4, 5, 71, 72 ] }, { "name": "cryExporterSettingsNode", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 0.00100000004749745, 0.00100000004749745, 0.00100000004749745 ] }, { "name": "cryAnimationExportNode", "translation": [ 0.0, 0.0, 0.0 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 0.00100000004749745, 0.00100000004749745, 0.00100000004749745 ] }, { "name": "pasted__head", "translation": [ -0.0778043791651726, 1.53551316261292, 0.0861874967813492 ], "rotation": [ 8.14603424714733E-08, 0.0, 0.0, 1.0 ], "scale": [ 0.00999999977648258, 0.00999999977648258, 0.00999999977648258 ], "mesh": 0, "skin": 0 }, { "name": "low", "translation": [ -0.0778043791651726, 1.53551316261292, 0.0861874967813492 ], "rotation": [ 8.14603424714733E-08, 0.0, 0.0, 1.0 ], "scale": [ 0.00999999977648258, 0.00999999977648258, 0.00999999977648258 ], "mesh": 1, "skin": 1 }, { "name": "mixamorig_Hips", "translation": [ -0.0780411958694458, 1.55584228038788, 0.0741503313183784 ], "rotation": [ 0.00858990103006363, 0.0231941305100918, -0.00999393500387669, 0.999644100666046 ], "scale": [ 0.00999999977648258, 0.0100000025704503, 0.0100000025704503 ], "children": [ 6, 60, 65, 70 ] }, { "name": "mixamorig_Spine", "translation": [ -4.76837158203125E-06, 20.0980072021484, -1.10401082038879 ], "rotation": [ -0.0256792064756155, 0.00346903689205647, -0.000803391274530441, 0.999663889408112 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 7 ] }, { "name": "mixamorig_Spine1", "translation": [ -1.9073486328125E-06, 23.4830932617188, -3.814697265625E-06 ], "rotation": [ 0.00338568934239447, 0.00577971758320928, 0.00468070758506656, 0.999966621398926 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 8 ] }, { "name": "mixamorig_Spine2", "translation": [ 0.0, 26.8378295898438, -1.77635683940025E-15 ], "rotation": [ 0.00338569236919284, 0.00577974785119295, 0.0046807024627924, 0.999966621398926 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 9, 12, 36 ] }, { "name": "mixamorig_Neck", "translation": [ -4.76837158203125E-07, 30.1925048828125, 7.62939453125E-06 ], "rotation": [ 0.0274373479187489, -0.0036887195892632, -0.0106473453342915, 0.999559998512268 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 10 ] }, { "name": "mixamorig_Head", "translation": [ 1.77635683940025E-15, 10.6904144287109, 1.09310865402222 ], "rotation": [ 0.0235005505383015, -0.0268053039908409, 0.0160073470324278, 0.999236166477203 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 11 ] }, { "name": "mixamorig_HeadTop_End", "translation": [ -4.76837158203125E-07, 51.9999389648438, 5.3170690536499 ], "rotation": [ -3.72529029846191E-09, -6.11180495102559E-10, 2.32830671409445E-10, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_LeftShoulder", "translation": [ 13.0577793121338, 23.2421722412109, -0.3502197265625 ], "rotation": [ 0.701449275016785, 0.282089680433273, -0.556536138057709, 0.344473361968994 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 13 ] }, { "name": "mixamorig_LeftArm", "translation": [ -9.5367431640625E-07, 29.6032409667969, 1.52587890625E-05 ], "rotation": [ 0.268739372491837, -0.0745446681976318, -0.0327057205140591, 0.959766924381256 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 14 ] }, { "name": "mixamorig_LeftForeArm", "translation": [ -3.814697265625E-06, 26.2665405273438, -1.4210854715202E-14 ], "rotation": [ 0.101996399462223, 0.158388122916222, 0.258760213851929, 0.947392761707306 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 15 ] }, { "name": "mixamorig_LeftHand", "translation": [ -7.62939453125E-06, 44.8494415283203, -2.288818359375E-05 ], "rotation": [ -0.0773848071694374, 0.158544167876244, 0.0612231679260731, 0.982408821582794 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 16, 20, 24, 28, 32 ] }, { "name": "mixamorig_LeftHandThumb1", "translation": [ -3.60839080810547, 7.37313079833984, 2.35345458984375 ], "rotation": [ 0.276571691036224, -0.0327966585755348, 0.15356083214283, 0.948077797889709 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 17 ] }, { "name": "mixamorig_LeftHandThumb2", "translation": [ -0.602554321289063, 6.804931640625, -1.9073486328125E-05 ], "rotation": [ -0.015937926247716, -0.0184175167232752, -0.0836632400751114, 0.996196389198303 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 18 ] }, { "name": "mixamorig_LeftHandThumb3", "translation": [ -0.769996643066406, 5.86551666259766, -3.814697265625E-06 ], "rotation": [ -0.00063543685246259, -0.00866128411144018, 0.202381789684296, 0.979268193244934 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 19 ] }, { "name": "mixamorig_LeftHandThumb4", "translation": [ 1.37254333496094, 4.82631683349609, -7.62939453125E-06 ], "rotation": [ 4.84287738800049E-08, 1.49011611938477E-08, -8.04911745792798E-16, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_LeftHandIndex1", "translation": [ -6.47254943847656, 23.4429702758789, -0.19500732421875 ], "rotation": [ 0.341717272996902, -0.00357847264967859, 0.0426864363253117, 0.938826084136963 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 21 ] }, { "name": "mixamorig_LeftHandIndex2", "translation": [ 0.0068206787109375, 4.31729125976563, 3.814697265625E-06 ], "rotation": [ 0.658300995826721, -0.00674140267074108, -0.0186324138194323, 0.752493977546692 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 22 ] }, { "name": "mixamorig_LeftHandIndex3", "translation": [ -0.0999526977539063, 4.03782653808594, 1.52587890625E-05 ], "rotation": [ 5.23713310940366E-07, -0.00035063482937403, 0.027121813967824, 0.999632060527802 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 23 ] }, { "name": "mixamorig_LeftHandIndex4", "translation": [ 0.0931243896484375, 3.15346145629883, 1.52587890625E-05 ], "rotation": [ -1.86264514923096E-09, 1.99493199737333E-17, -3.25962923319878E-09, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_LeftHandMiddle1", "translation": [ -1.72256851196289, 21.9356994628906, -1.29385375976563 ], "rotation": [ 0.503296911716461, -0.0341310128569603, 0.0727194026112556, 0.860371530056 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 25 ] }, { "name": "mixamorig_LeftHandMiddle2", "translation": [ 0.0718994140625, 5.13180541992188, -3.814697265625E-06 ], "rotation": [ 0.780757069587708, -0.00516836252063513, -0.0142697729170322, 0.624650359153748 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 26 ] }, { "name": "mixamorig_LeftHandMiddle3", "translation": [ -0.0765838623046875, 5.09765625, 2.8421709430404E-14 ], "rotation": [ -1.93891355593223E-06, 0.000325019122101367, 0.00812015030533075, 0.999966979026794 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 27 ] }, { "name": "mixamorig_LeftHandMiddle4", "translation": [ 0.004669189453125, 3.86862182617188, -3.0517578125E-05 ], "rotation": [ 1.49011611938477E-08, 1.49011594174908E-08, -1.49011594174908E-08, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_LeftHandRing1", "translation": [ 2.23248291015625, 20.6041641235352, -0.98486328125 ], "rotation": [ 0.511155009269714, -0.122393362224102, 0.0143185341730714, 0.850608825683594 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 29 ] }, { "name": "mixamorig_LeftHandRing2", "translation": [ 0.0888442993164063, 5.16531372070313, -7.62939453125E-06 ], "rotation": [ 0.79233318567276, -0.00271370331756771, -0.0721675083041191, 0.605799198150635 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 30 ] }, { "name": "mixamorig_LeftHandRing3", "translation": [ 0.02703857421875, 4.86283874511719, 0.0 ], "rotation": [ 1.70235089171911E-05, -0.00156306964345276, -0.0166997294872999, 0.99985933303833 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 31 ] }, { "name": "mixamorig_LeftHandRing4", "translation": [ -0.115890502929688, 4.16069793701172, 0.0 ], "rotation": [ -2.08166896526556E-16, -1.49011629702045E-08, -1.49011647465613E-08, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_LeftHandPinky1", "translation": [ 5.96266937255859, 18.7975387573242, -0.90228271484375 ], "rotation": [ 0.582997977733612, -0.199826896190643, -0.0379013642668724, 0.786604106426239 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 33 ] }, { "name": "mixamorig_LeftHandPinky2", "translation": [ -0.0107269287109375, 4.08926391601563, -7.105427357601E-15 ], "rotation": [ 0.729269921779633, 0.028753899037838, -0.144257292151451, 0.668227851390839 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 34 ] }, { "name": "mixamorig_LeftHandPinky3", "translation": [ 0.0215301513671875, 3.39088821411133, -1.52587890625E-05 ], "rotation": [ -1.7562278742389E-07, -0.000155539702973329, -0.00553603656589985, 0.999984681606293 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 35 ] }, { "name": "mixamorig_LeftHandPinky4", "translation": [ -0.0108299255371094, 2.28256225585938, 1.52587890625E-05 ], "rotation": [ -1.49011611938477E-08, -1.49011611938477E-08, 1.49011611938477E-08, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_RightShoulder", "translation": [ -13.0577869415283, 23.2456359863281, -0.413176536560059 ], "rotation": [ 0.666995644569397, -0.307142376899719, 0.600895643234253, 0.315760672092438 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 37 ] }, { "name": "mixamorig_RightArm", "translation": [ 8.10623168945313E-06, 29.6032180786133, -1.52587890625E-05 ], "rotation": [ 0.29125851392746, 0.092711441218853, 0.152578696608543, 0.93983656167984 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 38 ] }, { "name": "mixamorig_RightForeArm", "translation": [ -3.814697265625E-06, 26.2828674316406, -1.52587890625E-05 ], "rotation": [ 0.125037610530853, -0.114294819533825, -0.196367219090462, 0.965785801410675 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 39 ] }, { "name": "mixamorig_RightHand", "translation": [ -3.814697265625E-06, 44.7671813964844, 0.0 ], "rotation": [ -0.030215673148632, -0.199038341641426, 0.00341757154092193, 0.979519844055176 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 40, 44, 48, 52, 56 ] }, { "name": "mixamorig_RightHandThumb1", "translation": [ 3.61030101776123, 7.41763305664063, 2.34453582763672 ], "rotation": [ 0.170410796999931, 0.0504509843885899, -0.209833353757858, 0.961449325084686 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 41 ] }, { "name": "mixamorig_RightHandThumb2", "translation": [ 0.295150756835938, 6.85467529296875, 1.1444091796875E-05 ], "rotation": [ 0.0794776082038879, -0.186261773109436, 0.147058352828026, 0.96817547082901 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 42 ] }, { "name": "mixamorig_RightHandThumb3", "translation": [ 0.328197479248047, 6.10063171386719, -3.814697265625E-06 ], "rotation": [ -0.000274145335424691, 0.00670120632275939, -0.0945486351847649, 0.995497643947601 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 43 ] }, { "name": "mixamorig_RightHandThumb4", "translation": [ -0.623348236083984, 4.56706237792969, -9.5367431640625E-06 ], "rotation": [ -7.45058148510225E-09, -5.55111512312578E-17, -2.77555756156289E-17, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_RightHandIndex1", "translation": [ 6.32326316833496, 22.1758346557617, -0.0350570678710938 ], "rotation": [ 0.308014512062073, 0.0190459731966257, -0.0321906022727489, 0.950646162033081 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 45 ] }, { "name": "mixamorig_RightHandIndex2", "translation": [ -0.126022338867188, 4.72535705566406, 3.5527136788005E-15 ], "rotation": [ 0.552379190921783, 0.0296952817589045, 0.0169027559459209, 0.83289235830307 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 46 ] }, { "name": "mixamorig_RightHandIndex3", "translation": [ 0.0701007843017578, 4.39042663574219, -1.52587890625E-05 ], "rotation": [ 8.22923666987663E-08, -5.83010023547104E-06, -0.000261857261648402, 0.999999940395355 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 47 ] }, { "name": "mixamorig_RightHandIndex4", "translation": [ 0.0559272766113281, 3.61975479125977, -1.52587890625E-05 ], "rotation": [ 9.31322796660083E-10, 1.11758717835642E-08, 2.79396794589104E-09, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_RightHandMiddle1", "translation": [ 1.88641166687012, 22.1183776855469, -1.45953369140625 ], "rotation": [ 0.387795507907867, 0.0569556765258312, -0.020181629806757, 0.919762670993805 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 49 ] }, { "name": "mixamorig_RightHandMiddle2", "translation": [ -0.019317626953125, 5.23527526855469, 7.62939453125E-06 ], "rotation": [ 0.596116542816162, 0.0365558490157127, 0.0259225554764271, 0.801646292209625 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 50 ] }, { "name": "mixamorig_RightHandMiddle3", "translation": [ -0.018610954284668, 5.082763671875, 0.0 ], "rotation": [ -5.12359576987365E-08, 0.000129199092043564, 0.00639397231861949, 0.999979555606842 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 51 ] }, { "name": "mixamorig_RightHandMiddle4", "translation": [ 0.0379300117492676, 4.15168380737305, -1.52587890625E-05 ], "rotation": [ -1.49011594174908E-08, 5.58793500360366E-09, -2.23517382380578E-08, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_RightHandRing1", "translation": [ -2.29168319702148, 20.9904022216797, -0.538551330566406 ], "rotation": [ 0.38022392988205, 0.0287463273853064, -0.0538149625062943, 0.922879934310913 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 53 ] }, { "name": "mixamorig_RightHandRing2", "translation": [ -0.101470947265625, 4.92262268066406, 3.814697265625E-06 ], "rotation": [ 0.647808432579041, -0.0126825859770179, 0.0207728482782841, 0.761414349079132 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 54 ] }, { "name": "mixamorig_RightHandRing3", "translation": [ 0.0193042755126953, 4.73216247558594, 0.0 ], "rotation": [ 1.42236767715076E-05, 0.0011907946318388, 0.00809002481400967, 0.999966561794281 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 55 ] }, { "name": "mixamorig_RightHandRing4", "translation": [ 0.0821628570556641, 4.05702209472656, -3.0517578125E-05 ], "rotation": [ 1.56125112837913E-17, 4.33680827635171E-18, -3.72529100900465E-08, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_RightHandPinky1", "translation": [ -5.91796684265137, 18.9087066650391, -0.817703247070313 ], "rotation": [ 0.355771571397781, 0.0667038783431053, -0.0497678406536579, 0.930859982967377 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 57 ] }, { "name": "mixamorig_RightHandPinky2", "translation": [ 0.0285511016845703, 3.89680480957031, -7.62939453125E-06 ], "rotation": [ 0.687846004962921, -0.0430763177573681, 0.0637564659118652, 0.721766889095306 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 58 ] }, { "name": "mixamorig_RightHandPinky3", "translation": [ -0.0183124542236328, 3.27626800537109, -1.52587890625E-05 ], "rotation": [ -9.05223416225454E-08, 3.43918072758242E-05, 0.000898983504157513, 0.999999582767487 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 59 ] }, { "name": "mixamorig_RightHandPinky4", "translation": [ -0.0102348327636719, 2.69295883178711, -3.0517578125E-05 ], "rotation": [ 1.49011629702045E-08, -7.45058148510225E-09, 1.49011647465613E-08, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_LeftUpLeg", "translation": [ 17.3406925201416, -11.1701202392578, -2.82427215576172 ], "rotation": [ 0.0632223263382912, 0.19430148601532, 0.977621793746948, -0.0500544272363186 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 61 ] }, { "name": "mixamorig_LeftLeg", "translation": [ 1.9073486328125E-06, 68.798225402832, -1.1444091796875E-05 ], "rotation": [ -0.542776346206665, 0.00966412108391523, -0.0181848555803299, 0.839624762535095 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 62 ] }, { "name": "mixamorig_LeftFoot", "translation": [ 1.52587890625E-05, 56.1653099060059, 0.0 ], "rotation": [ 0.448129504919052, -0.0609910152852535, 0.0576151199638844, 0.890022754669189 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 63 ] }, { "name": "mixamorig_LeftToeBase", "translation": [ -1.71661376953125E-05, 30.944938659668, 3.45706939697266E-06 ], "rotation": [ 0.390491783618927, -0.0149825718253851, -0.00321882800199091, 0.920478880405426 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 64 ] }, { "name": "mixamorig_LeftToe_End", "translation": [ -1.9073486328125E-06, 11.8308887481689, -4.29153442382813E-06 ], "rotation": [ -1.4901157641134E-08, -2.22044551985472E-16, 1.49011611938477E-08, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "mixamorig_RightUpLeg", "translation": [ -17.3406982421875, -11.1701202392578, -3.41980719566345 ], "rotation": [ -0.0704485028982162, 0.0765243247151375, 0.994312763214111, -0.0228715427219868 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 66 ] }, { "name": "mixamorig_RightLeg", "translation": [ 0.0, 68.7107849121094, -9.5367431640625E-06 ], "rotation": [ -0.164243295788765, -0.0687382966279984, 0.027061378583312, 0.983649790287018 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 67 ] }, { "name": "mixamorig_RightFoot", "translation": [ -3.814697265625E-06, 56.1737403869629, 1.19209289550781E-06 ], "rotation": [ 0.481625467538834, 0.0393618158996105, -0.101585015654564, 0.869579255580902 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 68 ] }, { "name": "mixamorig_RightToeBase", "translation": [ -1.9073486328125E-06, 30.6320095062256, -3.814697265625E-06 ], "rotation": [ 0.403990715742111, 0.0372881665825844, -0.0117762573063374, 0.913926899433136 ], "scale": [ 1.0, 1.0, 1.0 ], "children": [ 69 ] }, { "name": "mixamorig_RightToe_End", "translation": [ -3.814697265625E-06, 11.631763458252, -1.19209289550781E-07 ], "rotation": [ 3.52365731907183E-19, -1.39698386192322E-09, -4.71482053399086E-09, 1.0 ], "scale": [ 1.0, 1.0, 1.0 ] }, { "name": "Object", "translation": [ 0.00743770599365234, -2.01158142089844, 1.239013671875 ], "rotation": [ -0.00858977343887091, -0.0231941137462854, 0.00999393407255411, 0.999644100666046 ], "scale": [ 1.0, 1.0, 1.0 ], "mesh": 2, "extensions": { "0": "0.1", "effects": { "glow": 1.0, "bloom": true } } }, { "name": "cryExporterSettingsNode70", "translation": [ -0.0778043791651726, -7.70371977754894E-34, 0.0861874967813492 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 0.00100000004749745, 0.00100000004749745, 0.00100000004749745 ] }, { "name": "cryAnimationExportNode71", "translation": [ -0.0778043791651726, -7.70371977754894E-34, 0.0861874967813492 ], "rotation": [ -0.70710676908493, 0.0, 0.0, 0.70710676908493 ], "scale": [ 0.00100000004749745, 0.00100000004749745, 0.00100000004749745 ] } ], "animations": [ { "name": "Walk", "channels": [ { "sampler": 0, "target": { "node": 5, "path": "translation" } }, { "sampler": 1, "target": { "node": 5, "path": "rotation" } }, { "sampler": 2, "target": { "node": 6, "path": "rotation" } }, { "sampler": 3, "target": { "node": 7, "path": "rotation" } }, { "sampler": 4, "target": { "node": 8, "path": "rotation" } }, { "sampler": 5, "target": { "node": 9, "path": "rotation" } }, { "sampler": 6, "target": { "node": 10, "path": "rotation" } }, { "sampler": 7, "target": { "node": 12, "path": "rotation" } }, { "sampler": 8, "target": { "node": 13, "path": "rotation" } }, { "sampler": 9, "target": { "node": 14, "path": "rotation" } }, { "sampler": 10, "target": { "node": 15, "path": "rotation" } }, { "sampler": 11, "target": { "node": 16, "path": "rotation" } }, { "sampler": 12, "target": { "node": 17, "path": "rotation" } }, { "sampler": 13, "target": { "node": 18, "path": "rotation" } }, { "sampler": 14, "target": { "node": 20, "path": "rotation" } }, { "sampler": 15, "target": { "node": 21, "path": "rotation" } }, { "sampler": 16, "target": { "node": 22, "path": "rotation" } }, { "sampler": 17, "target": { "node": 24, "path": "rotation" } }, { "sampler": 18, "target": { "node": 25, "path": "rotation" } }, { "sampler": 19, "target": { "node": 26, "path": "rotation" } }, { "sampler": 20, "target": { "node": 28, "path": "rotation" } }, { "sampler": 21, "target": { "node": 29, "path": "rotation" } }, { "sampler": 22, "target": { "node": 30, "path": "rotation" } }, { "sampler": 23, "target": { "node": 32, "path": "rotation" } }, { "sampler": 24, "target": { "node": 33, "path": "rotation" } }, { "sampler": 25, "target": { "node": 34, "path": "rotation" } }, { "sampler": 26, "target": { "node": 36, "path": "rotation" } }, { "sampler": 27, "target": { "node": 37, "path": "rotation" } }, { "sampler": 28, "target": { "node": 38, "path": "rotation" } }, { "sampler": 29, "target": { "node": 39, "path": "rotation" } }, { "sampler": 30, "target": { "node": 40, "path": "rotation" } }, { "sampler": 31, "target": { "node": 41, "path": "rotation" } }, { "sampler": 32, "target": { "node": 42, "path": "rotation" } }, { "sampler": 33, "target": { "node": 44, "path": "rotation" } }, { "sampler": 34, "target": { "node": 45, "path": "rotation" } }, { "sampler": 35, "target": { "node": 46, "path": "rotation" } }, { "sampler": 36, "target": { "node": 48, "path": "rotation" } }, { "sampler": 37, "target": { "node": 49, "path": "rotation" } }, { "sampler": 38, "target": { "node": 50, "path": "rotation" } }, { "sampler": 39, "target": { "node": 52, "path": "rotation" } }, { "sampler": 40, "target": { "node": 53, "path": "rotation" } }, { "sampler": 41, "target": { "node": 54, "path": "rotation" } }, { "sampler": 42, "target": { "node": 56, "path": "rotation" } }, { "sampler": 43, "target": { "node": 57, "path": "rotation" } }, { "sampler": 44, "target": { "node": 58, "path": "rotation" } }, { "sampler": 45, "target": { "node": 60, "path": "rotation" } }, { "sampler": 46, "target": { "node": 61, "path": "rotation" } }, { "sampler": 47, "target": { "node": 62, "path": "rotation" } }, { "sampler": 48, "target": { "node": 63, "path": "rotation" } }, { "sampler": 49, "target": { "node": 65, "path": "rotation" } }, { "sampler": 50, "target": { "node": 66, "path": "rotation" } }, { "sampler": 51, "target": { "node": 67, "path": "rotation" } }, { "sampler": 52, "target": { "node": 68, "path": "rotation" } } ], "samplers": [ { "input": 0, "interpolation": "LINEAR", "output": 1 }, { "input": 0, "interpolation": "LINEAR", "output": 2 }, { "input": 0, "interpolation": "LINEAR", "output": 3 }, { "input": 0, "interpolation": "LINEAR", "output": 4 }, { "input": 0, "interpolation": "LINEAR", "output": 5 }, { "input": 0, "interpolation": "LINEAR", "output": 6 }, { "input": 0, "interpolation": "LINEAR", "output": 7 }, { "input": 0, "interpolation": "LINEAR", "output": 8 }, { "input": 0, "interpolation": "LINEAR", "output": 9 }, { "input": 0, "interpolation": "LINEAR", "output": 10 }, { "input": 0, "interpolation": "LINEAR", "output": 11 }, { "input": 0, "interpolation": "LINEAR", "output": 12 }, { "input": 0, "interpolation": "LINEAR", "output": 13 }, { "input": 0, "interpolation": "LINEAR", "output": 14 }, { "input": 0, "interpolation": "LINEAR", "output": 15 }, { "input": 0, "interpolation": "LINEAR", "output": 16 }, { "input": 0, "interpolation": "LINEAR", "output": 17 }, { "input": 0, "interpolation": "LINEAR", "output": 18 }, { "input": 0, "interpolation": "LINEAR", "output": 19 }, { "input": 0, "interpolation": "LINEAR", "output": 20 }, { "input": 0, "interpolation": "LINEAR", "output": 21 }, { "input": 0, "interpolation": "LINEAR", "output": 22 }, { "input": 0, "interpolation": "LINEAR", "output": 23 }, { "input": 0, "interpolation": "LINEAR", "output": 24 }, { "input": 0, "interpolation": "LINEAR", "output": 25 }, { "input": 0, "interpolation": "LINEAR", "output": 26 }, { "input": 0, "interpolation": "LINEAR", "output": 27 }, { "input": 0, "interpolation": "LINEAR", "output": 28 }, { "input": 0, "interpolation": "LINEAR", "output": 29 }, { "input": 0, "interpolation": "LINEAR", "output": 30 }, { "input": 0, "interpolation": "LINEAR", "output": 31 }, { "input": 0, "interpolation": "LINEAR", "output": 32 }, { "input": 0, "interpolation": "LINEAR", "output": 33 }, { "input": 0, "interpolation": "LINEAR", "output": 34 }, { "input": 0, "interpolation": "LINEAR", "output": 35 }, { "input": 0, "interpolation": "LINEAR", "output": 36 }, { "input": 0, "interpolation": "LINEAR", "output": 37 }, { "input": 0, "interpolation": "LINEAR", "output": 38 }, { "input": 0, "interpolation": "LINEAR", "output": 39 }, { "input": 0, "interpolation": "LINEAR", "output": 40 }, { "input": 0, "interpolation": "LINEAR", "output": 41 }, { "input": 0, "interpolation": "LINEAR", "output": 42 }, { "input": 0, "interpolation": "LINEAR", "output": 43 }, { "input": 0, "interpolation": "LINEAR", "output": 44 }, { "input": 0, "interpolation": "LINEAR", "output": 45 }, { "input": 0, "interpolation": "LINEAR", "output": 46 }, { "input": 0, "interpolation": "LINEAR", "output": 47 }, { "input": 0, "interpolation": "LINEAR", "output": 48 }, { "input": 0, "interpolation": "LINEAR", "output": 49 }, { "input": 0, "interpolation": "LINEAR", "output": 50 }, { "input": 0, "interpolation": "LINEAR", "output": 51 }, { "input": 0, "interpolation": "LINEAR", "output": 52 }, { "input": 0, "interpolation": "LINEAR", "output": 53 } ] }, { "name": "Waving", "channels": [ { "sampler": 0, "target": { "node": 5, "path": "translation" } }, { "sampler": 1, "target": { "node": 5, "path": "rotation" } }, { "sampler": 2, "target": { "node": 6, "path": "rotation" } }, { "sampler": 3, "target": { "node": 7, "path": "rotation" } }, { "sampler": 4, "target": { "node": 8, "path": "rotation" } }, { "sampler": 5, "target": { "node": 9, "path": "rotation" } }, { "sampler": 6, "target": { "node": 10, "path": "rotation" } }, { "sampler": 7, "target": { "node": 12, "path": "rotation" } }, { "sampler": 8, "target": { "node": 13, "path": "rotation" } }, { "sampler": 9, "target": { "node": 14, "path": "rotation" } }, { "sampler": 10, "target": { "node": 15, "path": "rotation" } }, { "sampler": 11, "target": { "node": 16, "path": "rotation" } }, { "sampler": 12, "target": { "node": 17, "path": "rotation" } }, { "sampler": 13, "target": { "node": 18, "path": "rotation" } }, { "sampler": 14, "target": { "node": 20, "path": "rotation" } }, { "sampler": 15, "target": { "node": 21, "path": "rotation" } }, { "sampler": 16, "target": { "node": 22, "path": "rotation" } }, { "sampler": 17, "target": { "node": 24, "path": "rotation" } }, { "sampler": 18, "target": { "node": 25, "path": "rotation" } }, { "sampler": 19, "target": { "node": 26, "path": "rotation" } }, { "sampler": 20, "target": { "node": 28, "path": "rotation" } }, { "sampler": 21, "target": { "node": 29, "path": "rotation" } }, { "sampler": 22, "target": { "node": 30, "path": "rotation" } }, { "sampler": 23, "target": { "node": 32, "path": "rotation" } }, { "sampler": 24, "target": { "node": 33, "path": "rotation" } }, { "sampler": 25, "target": { "node": 34, "path": "rotation" } }, { "sampler": 26, "target": { "node": 36, "path": "rotation" } }, { "sampler": 27, "target": { "node": 37, "path": "rotation" } }, { "sampler": 28, "target": { "node": 38, "path": "rotation" } }, { "sampler": 29, "target": { "node": 39, "path": "rotation" } }, { "sampler": 30, "target": { "node": 40, "path": "rotation" } }, { "sampler": 31, "target": { "node": 41, "path": "rotation" } }, { "sampler": 32, "target": { "node": 42, "path": "rotation" } }, { "sampler": 33, "target": { "node": 44, "path": "rotation" } }, { "sampler": 34, "target": { "node": 45, "path": "rotation" } }, { "sampler": 35, "target": { "node": 46, "path": "rotation" } }, { "sampler": 36, "target": { "node": 48, "path": "rotation" } }, { "sampler": 37, "target": { "node": 49, "path": "rotation" } }, { "sampler": 38, "target": { "node": 50, "path": "rotation" } }, { "sampler": 39, "target": { "node": 52, "path": "rotation" } }, { "sampler": 40, "target": { "node": 53, "path": "rotation" } }, { "sampler": 41, "target": { "node": 54, "path": "rotation" } }, { "sampler": 42, "target": { "node": 56, "path": "rotation" } }, { "sampler": 43, "target": { "node": 57, "path": "rotation" } }, { "sampler": 44, "target": { "node": 58, "path": "rotation" } }, { "sampler": 45, "target": { "node": 60, "path": "rotation" } }, { "sampler": 46, "target": { "node": 61, "path": "rotation" } }, { "sampler": 47, "target": { "node": 62, "path": "rotation" } }, { "sampler": 48, "target": { "node": 63, "path": "rotation" } }, { "sampler": 49, "target": { "node": 65, "path": "rotation" } }, { "sampler": 50, "target": { "node": 66, "path": "rotation" } }, { "sampler": 51, "target": { "node": 67, "path": "rotation" } }, { "sampler": 52, "target": { "node": 68, "path": "rotation" } } ], "samplers": [ { "input": 54, "interpolation": "LINEAR", "output": 55 }, { "input": 54, "interpolation": "LINEAR", "output": 56 }, { "input": 54, "interpolation": "LINEAR", "output": 57 }, { "input": 54, "interpolation": "LINEAR", "output": 58 }, { "input": 54, "interpolation": "LINEAR", "output": 59 }, { "input": 54, "interpolation": "LINEAR", "output": 60 }, { "input": 54, "interpolation": "LINEAR", "output": 61 }, { "input": 54, "interpolation": "LINEAR", "output": 62 }, { "input": 54, "interpolation": "LINEAR", "output": 63 }, { "input": 54, "interpolation": "LINEAR", "output": 64 }, { "input": 54, "interpolation": "LINEAR", "output": 65 }, { "input": 54, "interpolation": "LINEAR", "output": 66 }, { "input": 54, "interpolation": "LINEAR", "output": 67 }, { "input": 54, "interpolation": "LINEAR", "output": 68 }, { "input": 54, "interpolation": "LINEAR", "output": 69 }, { "input": 54, "interpolation": "LINEAR", "output": 70 }, { "input": 54, "interpolation": "LINEAR", "output": 71 }, { "input": 54, "interpolation": "LINEAR", "output": 72 }, { "input": 54, "interpolation": "LINEAR", "output": 73 }, { "input": 54, "interpolation": "LINEAR", "output": 74 }, { "input": 54, "interpolation": "LINEAR", "output": 75 }, { "input": 54, "interpolation": "LINEAR", "output": 76 }, { "input": 54, "interpolation": "LINEAR", "output": 77 }, { "input": 54, "interpolation": "LINEAR", "output": 78 }, { "input": 54, "interpolation": "LINEAR", "output": 79 }, { "input": 54, "interpolation": "LINEAR", "output": 80 }, { "input": 54, "interpolation": "LINEAR", "output": 81 }, { "input": 54, "interpolation": "LINEAR", "output": 82 }, { "input": 54, "interpolation": "LINEAR", "output": 83 }, { "input": 54, "interpolation": "LINEAR", "output": 84 }, { "input": 54, "interpolation": "LINEAR", "output": 85 }, { "input": 54, "interpolation": "LINEAR", "output": 86 }, { "input": 54, "interpolation": "LINEAR", "output": 87 }, { "input": 54, "interpolation": "LINEAR", "output": 88 }, { "input": 54, "interpolation": "LINEAR", "output": 89 }, { "input": 54, "interpolation": "LINEAR", "output": 90 }, { "input": 54, "interpolation": "LINEAR", "output": 91 }, { "input": 54, "interpolation": "LINEAR", "output": 92 }, { "input": 54, "interpolation": "LINEAR", "output": 93 }, { "input": 54, "interpolation": "LINEAR", "output": 94 }, { "input": 54, "interpolation": "LINEAR", "output": 95 }, { "input": 54, "interpolation": "LINEAR", "output": 96 }, { "input": 54, "interpolation": "LINEAR", "output": 97 }, { "input": 54, "interpolation": "LINEAR", "output": 98 }, { "input": 54, "interpolation": "LINEAR", "output": 99 }, { "input": 54, "interpolation": "LINEAR", "output": 100 }, { "input": 54, "interpolation": "LINEAR", "output": 101 }, { "input": 54, "interpolation": "LINEAR", "output": 102 }, { "input": 54, "interpolation": "LINEAR", "output": 103 }, { "input": 54, "interpolation": "LINEAR", "output": 104 }, { "input": 54, "interpolation": "LINEAR", "output": 105 }, { "input": 54, "interpolation": "LINEAR", "output": 106 }, { "input": 54, "interpolation": "LINEAR", "output": 107 } ] }, { "name": "Jump", "channels": [ { "sampler": 0, "target": { "node": 5, "path": "translation" } }, { "sampler": 1, "target": { "node": 5, "path": "rotation" } }, { "sampler": 2, "target": { "node": 6, "path": "rotation" } }, { "sampler": 3, "target": { "node": 7, "path": "rotation" } }, { "sampler": 4, "target": { "node": 8, "path": "rotation" } }, { "sampler": 5, "target": { "node": 9, "path": "rotation" } }, { "sampler": 6, "target": { "node": 10, "path": "rotation" } }, { "sampler": 7, "target": { "node": 12, "path": "rotation" } }, { "sampler": 8, "target": { "node": 13, "path": "rotation" } }, { "sampler": 9, "target": { "node": 14, "path": "rotation" } }, { "sampler": 10, "target": { "node": 15, "path": "rotation" } }, { "sampler": 11, "target": { "node": 16, "path": "rotation" } }, { "sampler": 12, "target": { "node": 17, "path": "rotation" } }, { "sampler": 13, "target": { "node": 18, "path": "rotation" } }, { "sampler": 14, "target": { "node": 20, "path": "rotation" } }, { "sampler": 15, "target": { "node": 21, "path": "rotation" } }, { "sampler": 16, "target": { "node": 22, "path": "rotation" } }, { "sampler": 17, "target": { "node": 24, "path": "rotation" } }, { "sampler": 18, "target": { "node": 25, "path": "rotation" } }, { "sampler": 19, "target": { "node": 26, "path": "rotation" } }, { "sampler": 20, "target": { "node": 28, "path": "rotation" } }, { "sampler": 21, "target": { "node": 29, "path": "rotation" } }, { "sampler": 22, "target": { "node": 30, "path": "rotation" } }, { "sampler": 23, "target": { "node": 32, "path": "rotation" } }, { "sampler": 24, "target": { "node": 33, "path": "rotation" } }, { "sampler": 25, "target": { "node": 34, "path": "rotation" } }, { "sampler": 26, "target": { "node": 36, "path": "rotation" } }, { "sampler": 27, "target": { "node": 37, "path": "rotation" } }, { "sampler": 28, "target": { "node": 38, "path": "rotation" } }, { "sampler": 29, "target": { "node": 39, "path": "rotation" } }, { "sampler": 30, "target": { "node": 40, "path": "rotation" } }, { "sampler": 31, "target": { "node": 41, "path": "rotation" } }, { "sampler": 32, "target": { "node": 42, "path": "rotation" } }, { "sampler": 33, "target": { "node": 44, "path": "rotation" } }, { "sampler": 34, "target": { "node": 45, "path": "rotation" } }, { "sampler": 35, "target": { "node": 46, "path": "rotation" } }, { "sampler": 36, "target": { "node": 48, "path": "rotation" } }, { "sampler": 37, "target": { "node": 49, "path": "rotation" } }, { "sampler": 38, "target": { "node": 50, "path": "rotation" } }, { "sampler": 39, "target": { "node": 52, "path": "rotation" } }, { "sampler": 40, "target": { "node": 53, "path": "rotation" } }, { "sampler": 41, "target": { "node": 54, "path": "rotation" } }, { "sampler": 42, "target": { "node": 56, "path": "rotation" } }, { "sampler": 43, "target": { "node": 57, "path": "rotation" } }, { "sampler": 44, "target": { "node": 58, "path": "rotation" } }, { "sampler": 45, "target": { "node": 60, "path": "rotation" } }, { "sampler": 46, "target": { "node": 61, "path": "rotation" } }, { "sampler": 47, "target": { "node": 62, "path": "rotation" } }, { "sampler": 48, "target": { "node": 63, "path": "rotation" } }, { "sampler": 49, "target": { "node": 65, "path": "rotation" } }, { "sampler": 50, "target": { "node": 66, "path": "rotation" } }, { "sampler": 51, "target": { "node": 67, "path": "rotation" } }, { "sampler": 52, "target": { "node": 68, "path": "rotation" } } ], "samplers": [ { "input": 108, "interpolation": "LINEAR", "output": 109 }, { "input": 108, "interpolation": "LINEAR", "output": 110 }, { "input": 108, "interpolation": "LINEAR", "output": 111 }, { "input": 108, "interpolation": "LINEAR", "output": 112 }, { "input": 108, "interpolation": "LINEAR", "output": 113 }, { "input": 108, "interpolation": "LINEAR", "output": 114 }, { "input": 108, "interpolation": "LINEAR", "output": 115 }, { "input": 108, "interpolation": "LINEAR", "output": 116 }, { "input": 108, "interpolation": "LINEAR", "output": 117 }, { "input": 108, "interpolation": "LINEAR", "output": 118 }, { "input": 108, "interpolation": "LINEAR", "output": 119 }, { "input": 108, "interpolation": "LINEAR", "output": 120 }, { "input": 108, "interpolation": "LINEAR", "output": 121 }, { "input": 108, "interpolation": "LINEAR", "output": 122 }, { "input": 108, "interpolation": "LINEAR", "output": 123 }, { "input": 108, "interpolation": "LINEAR", "output": 124 }, { "input": 108, "interpolation": "LINEAR", "output": 125 }, { "input": 108, "interpolation": "LINEAR", "output": 126 }, { "input": 108, "interpolation": "LINEAR", "output": 127 }, { "input": 108, "interpolation": "LINEAR", "output": 128 }, { "input": 108, "interpolation": "LINEAR", "output": 129 }, { "input": 108, "interpolation": "LINEAR", "output": 130 }, { "input": 108, "interpolation": "LINEAR", "output": 131 }, { "input": 108, "interpolation": "LINEAR", "output": 132 }, { "input": 108, "interpolation": "LINEAR", "output": 133 }, { "input": 108, "interpolation": "LINEAR", "output": 134 }, { "input": 108, "interpolation": "LINEAR", "output": 135 }, { "input": 108, "interpolation": "LINEAR", "output": 136 }, { "input": 108, "interpolation": "LINEAR", "output": 137 }, { "input": 108, "interpolation": "LINEAR", "output": 138 }, { "input": 108, "interpolation": "LINEAR", "output": 139 }, { "input": 108, "interpolation": "LINEAR", "output": 140 }, { "input": 108, "interpolation": "LINEAR", "output": 141 }, { "input": 108, "interpolation": "LINEAR", "output": 142 }, { "input": 108, "interpolation": "LINEAR", "output": 143 }, { "input": 108, "interpolation": "LINEAR", "output": 144 }, { "input": 108, "interpolation": "LINEAR", "output": 145 }, { "input": 108, "interpolation": "LINEAR", "output": 146 }, { "input": 108, "interpolation": "LINEAR", "output": 147 }, { "input": 108, "interpolation": "LINEAR", "output": 148 }, { "input": 108, "interpolation": "LINEAR", "output": 149 }, { "input": 108, "interpolation": "LINEAR", "output": 150 }, { "input": 108, "interpolation": "LINEAR", "output": 151 }, { "input": 108, "interpolation": "LINEAR", "output": 152 }, { "input": 108, "interpolation": "LINEAR", "output": 153 }, { "input": 108, "interpolation": "LINEAR", "output": 154 }, { "input": 108, "interpolation": "LINEAR", "output": 155 }, { "input": 108, "interpolation": "LINEAR", "output": 156 }, { "input": 108, "interpolation": "LINEAR", "output": 157 }, { "input": 108, "interpolation": "LINEAR", "output": 158 }, { "input": 108, "interpolation": "LINEAR", "output": 159 }, { "input": 108, "interpolation": "LINEAR", "output": 160 }, { "input": 108, "interpolation": "LINEAR", "output": 161 } ] } ], "asset": { "generator": "FBX2glTF", "version": "2.0" }, "scene": 0, "scenes": [ { "name": "Root Scene", "nodes": [ 0 ] } ], "samplers": [ {} ], "skins": [ { "joints": [ 9, 10, 8, 36 ], "inverseBindMatrices": 206, "skeleton": 8 }, { "joints": [ 39, 56, 52, 48, 44, 8, 5, 36, 37, 38, 15, 32, 16, 17, 20, 28, 24, 7, 12, 6, 9, 10, 13, 60, 61, 65, 66, 14, 62, 63, 40, 67, 68, 45, 46, 49, 53, 41, 57, 58, 50, 54, 42, 22, 21, 25, 29, 33, 34, 26, 30, 18 ], "inverseBindMatrices": 207, "skeleton": 5 } ] } ================================================ FILE: examples/resources/models/gltf/bust_of_woman/glTF/bust_of_woman.gltf ================================================ { "asset" : { "generator" : "Khronos glTF Blender I/O v1.7.33", "version" : "2.0" }, "scene" : 0, "scenes" : [ { "name" : "Scene", "nodes" : [ 0 ] } ], "nodes" : [ { "mesh" : 0, "name" : "Model", "rotation" : [ -0.7071068286895752, 0, 0, 0.7071068286895752 ], "scale" : [ 0.10000002384185791, 0.10000002384185791, 0.10000002384185791 ] } ], "materials" : [ { "doubleSided" : true, "name" : "default_mat", "pbrMetallicRoughness" : { "baseColorFactor" : [ 0.800000011920929, 0.800000011920929, 0.800000011920929, 1 ], "metallicFactor" : 0.20000000298023224, "roughnessFactor" : 0.800000011920929 } } ], "meshes" : [ { "name" : "model", "primitives" : [ { "attributes" : { "POSITION" : 0, "NORMAL" : 1, "TEXCOORD_0" : 2 }, "indices" : 3, "material" : 0 } ] } ], "accessors" : [ { "bufferView" : 0, "componentType" : 5126, "count" : 32953, "max" : [ 177.9490966796875, 111.3333969116211, 532.2510375976562 ], "min" : [ -172.76531982421875, -104.85065460205078, -1.408761181664886e-05 ], "type" : "VEC3" }, { "bufferView" : 1, "componentType" : 5126, "count" : 32953, "type" : "VEC3" }, { "bufferView" : 2, "componentType" : 5126, "count" : 32953, "type" : "VEC2" }, { "bufferView" : 3, "componentType" : 5123, "count" : 182364, "type" : "SCALAR" } ], "bufferViews" : [ { "buffer" : 0, "byteLength" : 395436, "byteOffset" : 0 }, { "buffer" : 0, "byteLength" : 395436, "byteOffset" : 395436 }, { "buffer" : 0, "byteLength" : 263624, "byteOffset" : 790872 }, { "buffer" : 0, "byteLength" : 364728, "byteOffset" : 1054496 } ], "buffers" : [ { "byteLength" : 1419224, "uri" : "bust_of_woman.bin" } ] } ================================================ FILE: examples/resources/models/gltf/grass/grass.gltf ================================================ { "asset": { "generator": "Khronos glTF Blender I/O v1.1.46", "version": "2.0" }, "scene": 0, "scenes": [ { "name": "Scene", "nodes": [ 0 ] } ], "nodes": [ { "mesh": 0, "name": "Plane" } ], "meshes": [ { "name": "Plane", "primitives": [ { "attributes": { "POSITION": 0, "NORMAL": 1, "TEXCOORD_0": 2 }, "indices": 3 } ] } ], "accessors": [ { "bufferView": 0, "componentType": 5126, "count": 162, "max": [ 0.3105661869049072, 0.43607327342033386, 0.30094847083091736 ], "min": [ -0.3133178949356079, -0.011662454344332218, -0.35548436641693115 ], "type": "VEC3" }, { "bufferView": 1, "componentType": 5126, "count": 162, "type": "VEC3" }, { "bufferView": 2, "componentType": 5126, "count": 162, "type": "VEC2" }, { "bufferView": 3, "componentType": 5123, "count": 576, "type": "SCALAR" } ], "bufferViews": [ { "buffer": 0, "byteLength": 1944, "byteOffset": 0 }, { "buffer": 0, "byteLength": 1944, "byteOffset": 1944 }, { "buffer": 0, "byteLength": 1296, "byteOffset": 3888 }, { "buffer": 0, "byteLength": 1152, "byteOffset": 5184 } ], "buffers": [ { "uri": "grass.bin", "byteLength": 6336 } ] } ================================================ FILE: examples/resources/models/gltf/robot_arm/glTF/license.txt ================================================ Model Information: * title: Gilberto A Robot Arm * source: https://sketchfab.com/3d-models/gilberto-a-robot-arm-362d32e0b32945ae8174ebf71dae97f0 * author: GilbertoA (https://sketchfab.com/GilbertoA) Model License: * license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) * requirements: Author must be credited. Commercial use is allowed. If you use this 3D model in your project be sure to copy paste this credit wherever you share it: This work is based on "Gilberto A Robot Arm" (https://sketchfab.com/3d-models/gilberto-a-robot-arm-362d32e0b32945ae8174ebf71dae97f0) by GilbertoA (https://sketchfab.com/GilbertoA) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) ================================================ FILE: examples/resources/models/gltf/robot_arm/glTF/scene.gltf ================================================ { "accessors": [ { "bufferView": 3, "componentType": 5126, "count": 6125, "max": [ 202.12489318847656, 508.0434265136719, 355.9891357421875 ], "min": [ -202.12496948242188, -1.1920940323761897e-06, -202.12493896484375 ], "type": "VEC3" }, { "bufferView": 3, "byteOffset": 73500, "componentType": 5126, "count": 6125, "max": [ 1.0, 1.0, 1.0 ], "min": [ -1.0, -1.0, -1.0 ], "type": "VEC3" }, { "bufferView": 4, "componentType": 5126, "count": 6125, "max": [ 1.0, 1.0, 1.0, 1.0 ], "min": [ -1.0, -0.999963104724884, -1.0, -1.0 ], "type": "VEC4" }, { "bufferView": 2, "componentType": 5126, "count": 6125, "max": [ 1.0, 0.997261643409729 ], "min": [ -0.7044410109519958, 0.0 ], "type": "VEC2" }, { "bufferView": 1, "componentType": 5125, "count": 29208, "type": "SCALAR" }, { "bufferView": 3, "byteOffset": 147000, "componentType": 5126, "count": 24, "max": [ 0.5, 1.0, 0.5 ], "min": [ -0.5, -1.0228283997548715e-08, -0.5 ], "type": "VEC3" }, { "bufferView": 3, "byteOffset": 147288, "componentType": 5126, "count": 24, "max": [ 1.0, 1.0, 1.0 ], "min": [ -1.0, -1.0, -1.0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 49000, "componentType": 5126, "count": 24, "max": [ 0.875, 1.0 ], "min": [ 0.125, 0.0 ], "type": "VEC2" }, { "bufferView": 1, "byteOffset": 116832, "componentType": 5125, "count": 36, "type": "SCALAR" }, { "bufferView": 3, "byteOffset": 147576, "componentType": 5126, "count": 24, "max": [ 0.5, 1.0, 0.5 ], "min": [ -0.5, -1.0228283997548715e-08, -0.5 ], "type": "VEC3" }, { "bufferView": 3, "byteOffset": 147864, "componentType": 5126, "count": 24, "max": [ 1.0, 1.0, 1.0 ], "min": [ -1.0, -1.0, -1.0 ], "type": "VEC3" }, { "bufferView": 2, "byteOffset": 49192, "componentType": 5126, "count": 24, "max": [ 0.875, 1.0 ], "min": [ 0.125, 0.0 ], "type": "VEC2" }, { "bufferView": 1, "byteOffset": 116976, "componentType": 5125, "count": 36, "type": "SCALAR" }, { "bufferView": 5, "componentType": 5126, "count": 23, "max": [ 1.0, 0.002771326806396246, 0.9999961853027344, 0.0, 1.0, 1.0, 2.746702604944362e-13, 0.0, 0.9999976754188538, 2.6009152520600765e-07, 1.0, 0.0, 248.5543975830078, 328.1393127441406, 328.73565673828125, 1.0 ], "min": [ -0.7515499591827393, -1.0, -0.9999990463256836, 0.0, -0.999999463558197, -0.7515499591827393, -0.009517377242445946, 0.0, -0.008283392526209354, -0.9999955892562866, -1.0, 0.0, -285.9608459472656, -475.56512451171875, -328.7359924316406, 1.0 ], "type": "MAT4" }, { "bufferView": 0, "componentType": 5123, "count": 6125, "type": "VEC4" }, { "bufferView": 4, "byteOffset": 98000, "componentType": 5126, "count": 6125, "max": [ 1.0, 0.0, 0.0, 0.0 ], "min": [ 1.0, 0.0, 0.0, 0.0 ], "type": "VEC4" }, { "bufferView": 6, "componentType": 5126, "count": 142, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "componentType": 5126, "count": 142, "max": [ 313.05010986328125, 9.734435479913373e-13, -9.556799795973347e-13 ], "min": [ 313.05010986328125, 9.663381206337363e-13, -9.663381206337363e-13 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 568, "componentType": 5126, "count": 140, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "componentType": 5126, "count": 140, "max": [ -0.5074944496154785, -0.4930981993675232, -0.49240514636039734, 0.5067945718765259 ], "min": [ -0.5074944496154785, -0.4930981993675232, -0.49240514636039734, 0.5067945718765259 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 1128, "componentType": 5126, "count": 142, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 2240, "componentType": 5126, "count": 142, "max": [ 1.110136931667002e-16, -0.004758742637932301, 7.77115919568562e-18, 0.9999886751174927 ], "min": [ -1.387908482701494e-16, -0.004758742637932301, -9.791173129028903e-18, 0.9999886751174927 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 1696, "componentType": 5126, "count": 185, "max": [ 8.041666984558105 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 1704, "componentType": 5126, "count": 185, "max": [ -28.952293395996094, 175.68385314941406, -67.44589233398438 ], "min": [ -202.48196411132813, -79.14119720458984, -266.7228088378906 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 2436, "componentType": 5126, "count": 139, "max": [ 8.041666984558105 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 4512, "componentType": 5126, "count": 139, "max": [ 7.806255641895632e-18, 8.326672684688674e-17, 5.421010862427522e-18, 1.0 ], "min": [ -6.749158523722265e-18, -8.326672684688674e-17, -9.513874063560301e-18, 1.0 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 2992, "componentType": 5126, "count": 140, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 6736, "componentType": 5126, "count": 140, "max": [ -0.5051454305648804, -0.49550431966781616, -0.49481460452079773, 0.5044423341751099 ], "min": [ -0.5051454305648804, -0.49550431966781616, -0.49481460452079773, 0.5044423341751099 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 3552, "componentType": 5126, "count": 137, "max": [ 7.041666507720947 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 3924, "componentType": 5126, "count": 137, "max": [ 0.0, 8.79539107154605e-16, 5.702295596430804e-14 ], "min": [ 0.0, -5.222353175989361e-14, -5.4320277117526905e-14 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 4100, "componentType": 5126, "count": 137, "max": [ 7.041666507720947 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 8976, "componentType": 5126, "count": 137, "max": [ 0.683461606502533, 0.0070043583400547504, 0.01686592400074005, 0.9998577833175659 ], "min": [ -0.6013435125350952, -0.013909111730754375, 0.009539208374917507, 0.7297916412353516 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 4648, "componentType": 5126, "count": 84, "max": [ 8.041666984558105 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 5568, "componentType": 5126, "count": 84, "max": [ -1.1038569027732592e-06, 1.128343569689605e-06, -4.977417120244354e-06 ], "min": [ -1.1038571301469347e-06, 1.1283433423159295e-06, -4.977417120244354e-06 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 4984, "componentType": 5126, "count": 233, "max": [ 8.041666984558105 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 11168, "componentType": 5126, "count": 233, "max": [ 1.1484186518926091e-16, 1.1071140828364882e-16, 0.258819043636322, 1.0 ], "min": [ -1.1102230246251565e-16, -1.160303847631567e-16, -1.3877787807814457e-16, 0.9659258127212524 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 5916, "componentType": 5126, "count": 5, "max": [ 8.041666984558105 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 6576, "componentType": 5126, "count": 5, "max": [ -4.237911525706295e-06, 4.726242877950426e-06, -7.568358341814019e-06 ], "min": [ -4.237911525706295e-06, 4.726242877950426e-06, -7.56835879656137e-06 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 5936, "componentType": 5126, "count": 233, "max": [ 8.041666984558105 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 14896, "componentType": 5126, "count": 233, "max": [ 1.3659664912495654e-16, 1.1137439023588763e-16, 0.258819043636322, 1.0 ], "min": [ -1.250292363250068e-16, -1.1345159295524099e-16, -1.249000902703301e-16, 0.9659258127212524 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 6868, "componentType": 5126, "count": 200, "max": [ 7.541666507720947 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 18624, "componentType": 5126, "count": 200, "max": [ 1.0, 1.115658990913059e-16, 1.3877787807814457e-16, 1.0 ], "min": [ -0.8476265072822571, -5.844287122804787e-17, -1.1102230246251565e-16, -0.48012101650238037 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 7668, "componentType": 5126, "count": 197, "max": [ 7.541666507720947 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 6636, "componentType": 5126, "count": 197, "max": [ -7.676888344576582e-06, -2.404088661478454e-07, 1.9511787741066655e-08 ], "min": [ -7.676888344576582e-06, -2.404090650998114e-07, 1.9511674054228934e-08 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 8456, "componentType": 5126, "count": 200, "max": [ 7.541666507720947 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 21824, "componentType": 5126, "count": 200, "max": [ 5.551115123125783e-17, 1.1102230246251565e-16, 1.1102230246251565e-16, 1.0 ], "min": [ -8.326672684688674e-17, -8.326672684688674e-17, -1.1102230246251565e-16, 1.0 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 9256, "componentType": 5126, "count": 229, "max": [ 8.541666984558105 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 9000, "componentType": 5126, "count": 229, "max": [ -4.547473508864641e-13, 1.054615950124571e-09, 2.842170943040401e-14 ], "min": [ -1.684099970589159e-09, -4.915534645988373e-09, -2.842170943040401e-14 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 10172, "componentType": 5126, "count": 231, "max": [ 8.541666984558105 ], "min": [ 0.0416666679084301 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 25024, "componentType": 5126, "count": 231, "max": [ -2.6206410257743677e-17, 9.837974677214908e-17, 0.0660829097032547, 0.9999938607215881 ], "min": [ -2.3705127589329893e-16, -5.137215451300174e-17, -0.32484546303749084, 0.9457671046257019 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 11096, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 11748, "componentType": 5126, "count": 337, "max": [ 318.54022216796875, 630.33740234375, 237.40353393554688 ], "min": [ -12.112994194030762, 386.9071350097656, -248.53347778320313 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 12444, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 28720, "componentType": 5126, "count": 337, "max": [ 0.04600140079855919, 0.42464447021484375, 0.3964240849018097, 0.9999402165412903 ], "min": [ -0.23962785303592682, -0.7070702910423279, -0.10814829170703888, 0.6947174072265625 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 13792, "componentType": 5126, "count": 387, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 34112, "componentType": 5126, "count": 387, "max": [ -0.5472221970558167, 0.4493703544139862, 0.4475567936897278, 0.6436712145805359 ], "min": [ -0.6451535820960999, 0.291826456785202, 0.290347158908844, 0.546174943447113 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 15340, "componentType": 5126, "count": 383, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 40304, "componentType": 5126, "count": 383, "max": [ -0.2910188138484955, -0.5457077622413635, 0.6454575657844543, -0.2911529242992401 ], "min": [ -0.4481267035007477, -0.643368124961853, 0.5476906299591064, -0.44879886507987976 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 16872, "componentType": 5126, "count": 348, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 15792, "componentType": 5126, "count": 348, "max": [ 45.730587005615234, 2.2737367544323206e-13, 5.684341886080802e-14 ], "min": [ 45.730587005615234, -1.1368683772161603e-13, -5.684341886080802e-14 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 18264, "componentType": 5126, "count": 357, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 46432, "componentType": 5126, "count": 357, "max": [ 0.9999813437461853, 0.0031017654109746218, 0.0017947877058759332, 0.9999909400939941 ], "min": [ -0.8575454950332642, -0.003620013128966093, -0.0036200748290866613, -0.4945509731769562 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 19692, "componentType": 5126, "count": 357, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 19968, "componentType": 5126, "count": 357, "max": [ 220.04998779296875, 1.0231815394945443e-12, -3.010669047398551e-09 ], "min": [ 220.04998779296875, 4.547473508864641e-13, -3.0109390536381397e-09 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 21120, "componentType": 5126, "count": 357, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 52144, "componentType": 5126, "count": 357, "max": [ -0.65187007188797, 0.7582981586456299, -0.004577083513140678, -0.005324366502463818 ], "min": [ -0.65187007188797, 0.7582981586456299, -0.004577083513140678, -0.005324366502463818 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 22548, "componentType": 5126, "count": 166, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 24252, "componentType": 5126, "count": 166, "max": [ 98.12543487548828, 12.167859077453613, 0.013729646801948547 ], "min": [ 88.89757537841797, 10.043222427368164, -0.0029429341666400433 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 23212, "componentType": 5126, "count": 357, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 57856, "componentType": 5126, "count": 357, "max": [ 0.06891659647226334, 0.7087311148643494, 0.2088788002729416, 0.705477237701416 ], "min": [ -0.2089976817369461, 0.6770735383033752, -0.0687708631157875, 0.673988938331604 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 24640, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 63568, "componentType": 5126, "count": 337, "max": [ -6.586460949620232e-05, -0.0016048576217144728, 0.02174687571823597, 0.999762237071991 ], "min": [ -6.586460949620232e-05, -0.0016048576217144728, 0.02174687571823597, 0.999762237071991 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 25988, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 26244, "componentType": 5126, "count": 337, "max": [ 313.05010986328125, 1.0118572646433677e-12, -7.887024366937112e-13 ], "min": [ 313.05010986328125, 8.8662410746565e-13, -1.0871303857129533e-12 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 27336, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 68960, "componentType": 5126, "count": 337, "max": [ 0.4998927116394043, 0.6076653003692627, 0.6070996522903442, 0.68681401014328 ], "min": [ -0.6869204044342041, -0.4991248846054077, -0.4984317123889923, -0.4991729259490967 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 28684, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 74352, "componentType": 5126, "count": 337, "max": [ 0.9408049583435059, 0.23972687125205994, 0.20430870354175568, 0.9997484683990479 ], "min": [ -0.004368336405605078, -0.1358264684677124, -0.16257184743881226, 0.3319318890571594 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 30032, "componentType": 5126, "count": 230, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 30288, "componentType": 5126, "count": 230, "max": [ 313.05010986328125, 9.627854069549358e-13, -9.556799795973347e-13 ], "min": [ 313.05010986328125, 9.543477119677846e-13, -9.654499422140361e-13 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 30952, "componentType": 5126, "count": 228, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 79744, "componentType": 5126, "count": 228, "max": [ -0.5074944496154785, -0.4930981993675232, -0.49240514636039734, 0.5067945718765259 ], "min": [ -0.5074944496154785, -0.4930981993675232, -0.49240514636039734, 0.5067945718765259 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 31864, "componentType": 5126, "count": 232, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 83392, "componentType": 5126, "count": 232, "max": [ 0.6840468049049377, 0.007014197297394276, 0.016513004899024963, 0.9998577833175659 ], "min": [ -0.6018123626708984, -0.013916215859353542, 0.008828219957649708, 0.7293509840965271 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 32792, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 87104, "componentType": 5126, "count": 337, "max": [ 8.326672684688674e-17, 1.3877787807814457e-16, 1.1102230246251565e-16, 1.0 ], "min": [ -8.326672684688674e-17, -1.3877787807814457e-16, -1.1102230246251565e-16, 1.0 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 34140, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 33048, "componentType": 5126, "count": 337, "max": [ 313.05010986328125, 9.796607969292381e-13, -9.166001291305292e-13 ], "min": [ 313.05010986328125, 9.29034627006331e-13, -1.0231815394945443e-12 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 35488, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 92496, "componentType": 5126, "count": 337, "max": [ 0.4998927116394043, 0.6076653003692627, 0.6070996522903442, 0.68681401014328 ], "min": [ -0.6869204044342041, -0.4991248846054077, -0.4984317123889923, -0.4991729259490967 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 36836, "componentType": 5126, "count": 337, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 97888, "componentType": 5126, "count": 337, "max": [ 0.9407076239585876, 0.2443431168794632, 0.1999777853488922, 0.999740481376648 ], "min": [ -0.004273300990462303, -0.13228261470794678, -0.16697582602500916, 0.33217671513557434 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 38184, "componentType": 5126, "count": 111, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 37092, "componentType": 5126, "count": 111, "max": [ 335.1918640136719, 407.3770446777344, 611.0030517578125 ], "min": [ -0.025772370398044586, -7.046273231506348, 249.3863525390625 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 38628, "componentType": 5126, "count": 111, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 103280, "componentType": 5126, "count": 111, "max": [ 0.14067663252353668, 0.4137909412384033, 0.04096294194459915, 1.0 ], "min": [ -0.16367553174495697, -3.627369005698711e-05, -0.04674958065152168, 0.9055138826370239 ], "type": "VEC4" }, { "bufferView": 6, "byteOffset": 39072, "componentType": 5126, "count": 55, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 7, "byteOffset": 38424, "componentType": 5126, "count": 55, "max": [ 690.0953979492188, 175.10842895507813, 97.23301696777344 ], "min": [ 359.1990051269531, -0.18982672691345215, -425.05828857421875 ], "type": "VEC3" }, { "bufferView": 6, "byteOffset": 39292, "componentType": 5126, "count": 55, "max": [ 8.541666984558105 ], "min": [ 1.2417634698280722e-09 ], "type": "SCALAR" }, { "bufferView": 8, "byteOffset": 105056, "componentType": 5126, "count": 55, "max": [ 0.06280556321144104, 0.9526336193084717, 0.37870773673057556, 0.962663471698761 ], "min": [ -0.40558043122291565, -0.8528416752815247, -0.03827761113643646, -0.48484617471694946 ], "type": "VEC4" } ], "animations": [ { "channels": [ { "sampler": 0, "target": { "node": 12, "path": "translation" } }, { "sampler": 1, "target": { "node": 12, "path": "rotation" } }, { "sampler": 2, "target": { "node": 10, "path": "rotation" } }, { "sampler": 3, "target": { "node": 16, "path": "translation" } }, { "sampler": 4, "target": { "node": 16, "path": "rotation" } }, { "sampler": 5, "target": { "node": 15, "path": "rotation" } }, { "sampler": 6, "target": { "node": 9, "path": "translation" } }, { "sampler": 7, "target": { "node": 9, "path": "rotation" } }, { "sampler": 8, "target": { "node": 26, "path": "translation" } }, { "sampler": 9, "target": { "node": 26, "path": "rotation" } }, { "sampler": 10, "target": { "node": 28, "path": "translation" } }, { "sampler": 11, "target": { "node": 28, "path": "rotation" } }, { "sampler": 12, "target": { "node": 24, "path": "rotation" } }, { "sampler": 13, "target": { "node": 22, "path": "translation" } }, { "sampler": 14, "target": { "node": 22, "path": "rotation" } }, { "sampler": 15, "target": { "node": 20, "path": "translation" } }, { "sampler": 16, "target": { "node": 20, "path": "rotation" } }, { "sampler": 17, "target": { "node": 18, "path": "translation" } }, { "sampler": 18, "target": { "node": 18, "path": "rotation" } }, { "sampler": 19, "target": { "node": 45, "path": "rotation" } }, { "sampler": 20, "target": { "node": 47, "path": "rotation" } }, { "sampler": 21, "target": { "node": 43, "path": "translation" } }, { "sampler": 22, "target": { "node": 43, "path": "rotation" } }, { "sampler": 23, "target": { "node": 41, "path": "translation" } }, { "sampler": 24, "target": { "node": 41, "path": "rotation" } }, { "sampler": 25, "target": { "node": 39, "path": "translation" } }, { "sampler": 26, "target": { "node": 39, "path": "rotation" } }, { "sampler": 27, "target": { "node": 38, "path": "rotation" } }, { "sampler": 28, "target": { "node": 37, "path": "translation" } }, { "sampler": 29, "target": { "node": 37, "path": "rotation" } }, { "sampler": 30, "target": { "node": 36, "path": "rotation" } }, { "sampler": 31, "target": { "node": 51, "path": "translation" } }, { "sampler": 32, "target": { "node": 51, "path": "rotation" } }, { "sampler": 33, "target": { "node": 50, "path": "rotation" } }, { "sampler": 34, "target": { "node": 55, "path": "rotation" } }, { "sampler": 35, "target": { "node": 54, "path": "translation" } }, { "sampler": 36, "target": { "node": 54, "path": "rotation" } }, { "sampler": 37, "target": { "node": 53, "path": "rotation" } }, { "sampler": 38, "target": { "node": 59, "path": "translation" } }, { "sampler": 39, "target": { "node": 59, "path": "rotation" } }, { "sampler": 40, "target": { "node": 61, "path": "translation" } }, { "sampler": 41, "target": { "node": 61, "path": "rotation" } } ], "name": "Take 001", "samplers": [ { "input": 16, "interpolation": "LINEAR", "output": 17 }, { "input": 18, "interpolation": "LINEAR", "output": 19 }, { "input": 20, "interpolation": "LINEAR", "output": 21 }, { "input": 22, "interpolation": "LINEAR", "output": 23 }, { "input": 24, "interpolation": "LINEAR", "output": 25 }, { "input": 26, "interpolation": "LINEAR", "output": 27 }, { "input": 28, "interpolation": "LINEAR", "output": 29 }, { "input": 30, "interpolation": "LINEAR", "output": 31 }, { "input": 32, "interpolation": "LINEAR", "output": 33 }, { "input": 34, "interpolation": "LINEAR", "output": 35 }, { "input": 36, "interpolation": "LINEAR", "output": 37 }, { "input": 38, "interpolation": "LINEAR", "output": 39 }, { "input": 40, "interpolation": "LINEAR", "output": 41 }, { "input": 42, "interpolation": "LINEAR", "output": 43 }, { "input": 44, "interpolation": "LINEAR", "output": 45 }, { "input": 46, "interpolation": "LINEAR", "output": 47 }, { "input": 48, "interpolation": "LINEAR", "output": 49 }, { "input": 50, "interpolation": "LINEAR", "output": 51 }, { "input": 52, "interpolation": "LINEAR", "output": 53 }, { "input": 54, "interpolation": "LINEAR", "output": 55 }, { "input": 56, "interpolation": "LINEAR", "output": 57 }, { "input": 58, "interpolation": "LINEAR", "output": 59 }, { "input": 60, "interpolation": "LINEAR", "output": 61 }, { "input": 62, "interpolation": "LINEAR", "output": 63 }, { "input": 64, "interpolation": "LINEAR", "output": 65 }, { "input": 66, "interpolation": "LINEAR", "output": 67 }, { "input": 68, "interpolation": "LINEAR", "output": 69 }, { "input": 70, "interpolation": "LINEAR", "output": 71 }, { "input": 72, "interpolation": "LINEAR", "output": 73 }, { "input": 74, "interpolation": "LINEAR", "output": 75 }, { "input": 76, "interpolation": "LINEAR", "output": 77 }, { "input": 78, "interpolation": "LINEAR", "output": 79 }, { "input": 80, "interpolation": "LINEAR", "output": 81 }, { "input": 82, "interpolation": "LINEAR", "output": 83 }, { "input": 84, "interpolation": "LINEAR", "output": 85 }, { "input": 86, "interpolation": "LINEAR", "output": 87 }, { "input": 88, "interpolation": "LINEAR", "output": 89 }, { "input": 90, "interpolation": "LINEAR", "output": 91 }, { "input": 92, "interpolation": "LINEAR", "output": 93 }, { "input": 94, "interpolation": "LINEAR", "output": 95 }, { "input": 96, "interpolation": "LINEAR", "output": 97 }, { "input": 98, "interpolation": "LINEAR", "output": 99 } ] } ], "asset": { "extras": { "author": "GilbertoA (https://sketchfab.com/GilbertoA)", "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)", "source": "https://sketchfab.com/3d-models/gilberto-a-robot-arm-362d32e0b32945ae8174ebf71dae97f0", "title": "Gilberto A Robot Arm" }, "generator": "Sketchfab-12.68.0", "version": "2.0" }, "bufferViews": [ { "buffer": 0, "byteLength": 49000, "byteStride": 8, "name": "shortBufferViews", "target": 34962 }, { "buffer": 0, "byteLength": 117120, "byteOffset": 49000, "name": "floatBufferViews", "target": 34963 }, { "buffer": 0, "byteLength": 49384, "byteOffset": 166120, "byteStride": 8, "name": "floatBufferViews", "target": 34962 }, { "buffer": 0, "byteLength": 148152, "byteOffset": 215504, "byteStride": 12, "name": "floatBufferViews", "target": 34962 }, { "buffer": 0, "byteLength": 196000, "byteOffset": 363656, "byteStride": 16, "name": "floatBufferViews", "target": 34962 }, { "buffer": 0, "byteLength": 1472, "byteOffset": 559656, "name": "floatBufferViews" }, { "buffer": 0, "byteLength": 39512, "byteOffset": 561128, "name": "floatBufferViews" }, { "buffer": 0, "byteLength": 39084, "byteOffset": 600640, "byteStride": 12, "name": "floatBufferViews" }, { "buffer": 0, "byteLength": 105936, "byteOffset": 639724, "byteStride": 16, "name": "floatBufferViews" } ], "buffers": [ { "byteLength": 745660, "uri": "scene.bin" } ], "images": [ { "uri": "textures/Robot_Armstrong_baseColor.png" }, { "uri": "textures/Robot_Armstrong_metallicRoughness.png" }, { "uri": "textures/Robot_Armstrong_normal.png" } ], "materials": [ { "doubleSided": true, "name": "Robot_Armstrong", "normalTexture": { "index": 2 }, "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicRoughnessTexture": { "index": 1 } } }, { "doubleSided": true, "name": "lambert3", "pbrMetallicRoughness": { "baseColorFactor": [ 0.5, 0.0, 0.0961499, 1.0 ], "metallicFactor": 0.0, "roughnessFactor": 0.6 } }, { "doubleSided": true, "name": "lambert2", "pbrMetallicRoughness": { "baseColorFactor": [ 0.0, 0.0769167, 1.0, 1.0 ], "metallicFactor": 0.0, "roughnessFactor": 0.6 } } ], "meshes": [ { "name": "Arm_Geo_Robot_Armstrong_0", "primitives": [ { "attributes": { "JOINTS_0": 14, "NORMAL": 1, "POSITION": 0, "TANGENT": 2, "TEXCOORD_0": 3, "TEXCOORD_1": 3, "TEXCOORD_2": 3, "TEXCOORD_3": 3, "TEXCOORD_4": 3, "WEIGHTS_0": 15 }, "indices": 4, "material": 0, "mode": 4 } ] }, { "name": "Heavy_Boi_lambert3_0", "primitives": [ { "attributes": { "NORMAL": 6, "POSITION": 5, "TEXCOORD_0": 7 }, "indices": 8, "material": 1, "mode": 4 } ] }, { "name": "Light_Boi_lambert2_0", "primitives": [ { "attributes": { "NORMAL": 10, "POSITION": 9, "TEXCOORD_0": 11 }, "indices": 12, "material": 2, "mode": 4 } ] } ], "nodes": [ { "children": [ 1 ], "matrix": [ 0.2859538793563843, 0.0, 0.0, 0.0, 0.0, 6.349451616846841e-17, -0.2859538793563843, 0.0, 0.0, 0.2859538793563843, 6.349451616846841e-17, 0.0, 0.0, 0.0, 0.0, 1.0 ], "name": "Sketchfab_model" }, { "children": [ 2 ], "matrix": [ 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.0, 0.009999999776482582, 0.0, 0.0, -0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], "name": "d751c7eea7b444fa9fab6aeb279a28ad.fbx" }, { "children": [ 3 ], "name": "Object_2" }, { "children": [ 4, 5, 59, 61 ], "name": "RootNode" }, { "name": "transform1" }, { "children": [ 6, 30 ], "name": "Robot_Arm_Strong_Rig" }, { "children": [ 7 ], "name": "Controls" }, { "children": [ 8, 18, 29 ], "name": "Ctrl_Global_Move_Scale" }, { "children": [ 9 ], "name": "CTRL_Base_Rotate_os_GRP", "rotation": [ 0.0, 0.0, 0.7071068286895752, 0.7071068286895752 ], "translation": [ -1.466250978410244e-06, 80.76246643066406, 5.289912223815918e-07 ] }, { "children": [ 10, 14 ], "name": "CTRL_Base_Rotate", "rotation": [ -0.5907620787620544, -0.013782167807221413, 0.009721717797219753, 0.8066696524620056 ], "translation": [ 0.0, -3.877882850987849e-14, -5.388716545467326e-14 ] }, { "children": [ 11 ], "name": "CTRL_FK_Base_Pivot_os_GRP", "rotation": [ 5.552128915684528e-17, -0.004758742637932301, 1.99895763726044e-18, 0.9999886751174927 ], "translation": [ 63.50892639160156, -2.6192622044618474e-06, -5.289912223815918e-07 ] }, { "children": [ 12 ], "name": "CTRL_FK_Base_Pivot", "rotation": [ 0.0, 8.673617379884035e-19, 0.0, 1.0 ] }, { "children": [ 13 ], "name": "CTRL_FK_Elboq_os_GRP", "rotation": [ -0.5074944496154785, -0.4930981993675232, -0.49240514636039734, 0.5067945718765259 ], "translation": [ 313.05010986328125, 9.688916335903741e-13, -9.610090501155355e-13 ] }, { "name": "CTRL_FK_Elboq", "rotation": [ -2.1064858766735392e-35, 2.7755575615628914e-17, 7.589415207398531e-19, 1.0 ] }, { "children": [ 15 ], "name": "IK_Controls_Base_Offset", "rotation": [ 5.551115123125783e-17, 6.288372600415926e-18, -3.490748024201865e-34, 1.0 ], "translation": [ -2.842170943040401e-14, -5.684341886080802e-14, -4.440892098500626e-16 ] }, { "children": [ 16 ], "name": "CTRL_IK_Translate_os_GRP", "rotation": [ -0.5051454901695251, -0.49550437927246094, -0.4948146641254425, 0.5044423937797546 ], "translation": [ 376.6277160644531, -8.195183909265324e-06, 223.40667724609375 ] }, { "children": [ 17 ], "name": "CTRL_IK_Translate", "rotation": [ -1.504632769052528e-35, 2.7755575615628914e-17, 5.421010862427522e-19, 1.0 ], "translation": [ -199.87384033203125, -33.0147705078125, -76.0296401977539 ] }, { "name": "ikHandle1", "rotation": [ 0.006817307323217392, 0.7075662612915039, -0.006807818077504635, 0.7065813541412354 ], "translation": [ -2.842170943040401e-14, -5.684341886080802e-14, 0.0 ] }, { "children": [ 19 ], "name": "Ctrls_Upper", "rotation": [ 0.017764955759048462, -0.7060953974723816, 0.011095577850937843, 0.7078068852424622 ], "translation": [ -10.996893882751465, 419.47149658203125, 83.73381805419922 ] }, { "children": [ 20 ], "name": "CTRL_FK_Upper_os_GRP", "rotation": [ -0.6998886466026306, 0.7142516374588013, -0.0004917712649330497, 0.0004828870005439967 ], "translation": [ 95.67628479003906, 4.164312839508057, 0.3070385456085205 ] }, { "children": [ 21 ], "name": "CTRL_FK_Upper", "rotation": [ -1.0378402211642343e-16, 3.600520668329787e-17, -0.3085783123970032, 0.951198935508728 ], "translation": [ -1.5194245861493982e-09, -4.696062205766793e-09, -8.881784197001252e-16 ] }, { "children": [ 22 ], "name": "CTRL_Claw_Main_Rotate_os_GRP", "rotation": [ -0.7067376971244812, 0.7074756026268005, -0.00022029303363524377, -0.00022052304120734334 ], "translation": [ 217.5917205810547, 32.79703140258789, 0.4431872069835663 ] }, { "children": [ 23 ], "name": "CTRL_Claw_Main_Rotate", "rotation": [ -5.963111948670274e-19, -4.553649124439119e-18, -2.7755575615628914e-17, 1.0 ], "translation": [ -7.676888344576582e-06, -2.40409036678102e-07, 1.9511730897647794e-08 ] }, { "children": [ 24 ], "name": "CTRL_Claw_Ball_Rotate_os_GRP", "rotation": [ -0.7067376971244812, 0.7074756026268005, -0.00022029303363524377, 0.00022052304120734334 ], "translation": [ 42.38798522949219, -45.72901916503906, 0.0034909327514469624 ] }, { "children": [ 25, 27 ], "name": "CTRL_Claw_Ball_Rotate", "rotation": [ -6.505213034913027e-19, 7.589415207398531e-19, 4.9370762734536075e-37, 1.0 ] }, { "children": [ 26 ], "name": "CTRL_Claw_R_os_GRP", "rotation": [ -0.6448816657066345, 0.2924268841743469, 0.29094618558883667, 0.6434006690979004 ], "translation": [ -0.34568727016448975, -0.39553704857826233, -3.544440984725952 ] }, { "name": "CTRL_Claw_R", "rotation": [ -2.7677852070912206e-17, -2.075696423457903e-18, 0.07478484511375427, 0.9971997141838074 ], "translation": [ -1.103857016460097e-06, 1.1283434560027672e-06, -4.977417120244354e-06 ] }, { "children": [ 28 ], "name": "CTRL_Claw_L_os_GRP", "rotation": [ -0.29161757230758667, -0.6430969834327698, 0.6451862454414368, -0.2917536199092865 ], "translation": [ -0.3455682694911957, -0.3762337863445282, 3.5465784072875977 ] }, { "name": "CTRL_Claw_R1", "rotation": [ -1.259625260121769e-18, 1.382050555039516e-17, 0.0907655656337738, 0.9958723783493042 ], "translation": [ -4.237911525706295e-06, 4.726242877950426e-06, -7.56835879656137e-06 ] }, { "name": "CTRL_IK_FK_Switch" }, { "children": [ 31, 57 ], "name": "DO_NOT_TOUCH" }, { "children": [ 32 ], "name": "Skeleton" }, { "children": [ 33, 56 ], "name": "Object_32" }, { "children": [ 34 ], "name": "_rootJoint" }, { "children": [ 35 ], "name": "Mech_Root_00", "rotation": [ 0.0, 0.0, 0.7071068286895752, 0.7071068286895752 ] }, { "children": [ 36, 49 ], "name": "J_Base_Rot_01", "translation": [ 80.76246643066406, 1.1991035470332659e-14, 5.289912223815918e-07 ] }, { "children": [ 37 ], "name": "J_Base_Pivot_Rot_02", "rotation": [ -0.0026823505759239197, 0.22385600209236145, 0.020366698503494263, 0.9744057059288025 ], "translation": [ 63.50892639160156, -2.6192622044618474e-06, -5.289912223815918e-07 ] }, { "children": [ 38 ], "name": "J_Elbow_03", "rotation": [ 0.37304437160491943, 0.6013069748878479, 0.6007223725318909, -0.37202218174934387 ], "translation": [ 313.05010986328125, 9.530154443382344e-13, -9.237055564881302e-13 ] }, { "children": [ 39 ], "name": "joint9_04", "rotation": [ -6.586461677215993e-05, -0.0016048576217144728, 0.021746881306171417, 0.999762237071991 ], "translation": [ 220.38771057128906, -4.164312839508057, -0.3070385456085205 ] }, { "children": [ 40 ], "name": "J_Upper_Pivot_05", "rotation": [ -0.1970391720533371, 0.6806640625, 0.19693194329738617, 0.6775616407394409 ], "translation": [ 89.25628662109375, 10.27928638458252, 0.01310022547841072 ] }, { "children": [ 41 ], "name": "J_Upper_Rot_06", "rotation": [ -0.4572065472602844, 0.5318527221679688, -0.4646695852279663, 0.5405341982841492 ], "translation": [ 8.896137160263606e-09, -12.167906761169434, 3.751665644813329e-12 ] }, { "children": [ 42 ], "name": "J_Claw_Base_Rot_07", "rotation": [ -0.6518701314926147, 0.7582982778549194, -0.004577083978801966, -0.005324366968125105 ], "translation": [ 220.04998779296875, 8.526512829121202e-13, -3.0108360249414545e-09 ] }, { "children": [ 43 ], "name": "J_Helper_01_08", "rotation": [ -0.7041645050048828, 0.7100219130516052, 0.003244806081056595, -0.0032717972062528133 ], "translation": [ 42.76677322387695, 0.0, 5.1514348342607263e-14 ] }, { "children": [ 44, 45, 47 ], "name": "J_Claw_Both_Rot_09", "rotation": [ 0.00491962069645524, -2.2941925635677762e-05, -0.003620013128966093, 0.9999813437461853 ], "translation": [ 45.730587005615234, 5.684341886080802e-14, 4.440892098500626e-16 ] }, { "name": "J_Claw_Both_Rot_end_010", "rotation": [ 3.63207727782644e-18, -2.087089182034596e-18, 8.326672684688674e-17, 1.0 ], "translation": [ 39.738319396972656, -0.04146943241357803, 7.216686412903073e-07 ] }, { "children": [ 46 ], "name": "Claw_Pivot_R_011", "rotation": [ -0.6212067008018494, 0.33983537554740906, 0.338248074054718, 0.6198406219482422 ], "translation": [ -0.34568727016448975, -0.39553704857826233, -3.544440984725952 ] }, { "name": "Claw_Pivot_R_end_012", "rotation": [ 0.06940634548664093, -0.0808509960770607, 0.010946989059448242, 0.9942464828491211 ], "translation": [ 16.797748565673828, 2.842170943040401e-14, -1.1368683772161603e-13 ] }, { "children": [ 48 ], "name": "Claw_Pivot_L_013", "rotation": [ -0.3487849235534668, -0.6139736175537109, 0.616041898727417, -0.34911003708839417 ], "translation": [ -0.3455682694911957, -0.3762337863445282, 3.5465784072875977 ] }, { "name": "Claw_Pivot_L_end_014", "rotation": [ 0.06940634548664093, -0.0808509960770607, 0.010946989059448242, 0.9942464828491211 ], "translation": [ -16.7977237701416, -7.804499182384461e-05, -4.977429398422828e-06 ] }, { "children": [ 50, 53 ], "name": "IKFKSkel_015", "rotation": [ -7.873035982679803e-27, -0.004758742637932301, -1.6544174314455523e-24, 0.9999886751174927 ], "translation": [ 63.50892639160156, -2.6192622044618474e-06, -5.289912223815918e-07 ] }, { "children": [ 51 ], "name": "J_FK1_016", "rotation": [ -0.5906427502632141, -0.013782165944576263, 0.015343781560659409, 0.8066695332527161 ], "translation": [ 0.0, 8.470329472543003e-22, 0.0 ] }, { "children": [ 52 ], "name": "J_FK2_017", "rotation": [ -0.5074944496154785, -0.4930981993675232, -0.49240514636039734, 0.5067945718765259 ], "translation": [ 313.05010986328125, 9.575673587391975e-13, -9.618972285352356e-13 ] }, { "name": "J_FK3_018", "rotation": [ -1.3010426069826053e-18, 2.7755575615628914e-17, -5.421010862427522e-19, 1.0 ], "translation": [ 220.38771057128906, -4.164312839508057, -0.3070385456085205 ] }, { "children": [ 54 ], "name": "J_Base_Pivot_Rot1_IK_019", "rotation": [ -0.0025854003615677357, 0.22849041223526, 0.020379232242703438, 0.9733294248580933 ] }, { "children": [ 55 ], "name": "J_IK1_020", "rotation": [ 0.37304437160491943, 0.6013069748878479, 0.6007223725318909, -0.37202218174934387 ], "translation": [ 313.05010986328125, 9.565681580170349e-13, -9.663381206337363e-13 ] }, { "name": "J_IK2_021", "rotation": [ 4.199589352486821e-18, -2.168404344971009e-19, -8.673617379884035e-19, 1.0 ], "translation": [ 220.38771057128906, -4.164312839508057, -0.3070385456085205 ] }, { "mesh": 0, "name": "Object_56", "skin": 0 }, { "children": [ 58 ], "name": "Geo" }, { "name": "Arm_Geo" }, { "children": [ 60 ], "name": "Heavy_Boi", "rotation": [ 0.016099955886602402, 0.002024458721280098, 3.91020075767301e-05, 0.9998683333396912 ], "scale": [ 89.95779418945313, 155.5825958251953, 155.5825958251953 ], "translation": [ 1.3999370336532593, -3.4926185607910156, 441.70330810546875 ] }, { "mesh": 1, "name": "Heavy_Boi_lambert3_0" }, { "children": [ 62 ], "name": "Light_Boi", "rotation": [ -1.1102231569740545e-16, -0.3814648687839508, 2.000136698702739e-32, 0.9243834614753723 ], "scale": [ 76.03485870361328, 64.671630859375, 118.6207504272461 ], "translation": [ 359.965576171875, 1.0228262681266642e-08, -424.65753173828125 ] }, { "mesh": 2, "name": "Light_Boi_lambert2_0" } ], "samplers": [ { "magFilter": 9729, "minFilter": 9987, "wrapS": 10497, "wrapT": 10497 } ], "scene": 0, "scenes": [ { "name": "Sketchfab_Scene", "nodes": [ 0 ] } ], "skins": [ { "inverseBindMatrices": 13, "joints": [ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55 ], "skeleton": 33 } ], "textures": [ { "sampler": 0, "source": 0 }, { "sampler": 0, "source": 1 }, { "sampler": 0, "source": 2 } ] } ================================================ FILE: examples/resources/models/gltf/suzanne/suzanne.gltf ================================================ { "accessors": [ { "bufferView": 0, "byteOffset": 0, "componentType": 5126, "count": 3034, "max": [ 1.307556, 0.9131775, 0.8170619 ], "min": [ -1.307556, -0.9631042999999999, -0.7441406 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 36408, "componentType": 5126, "count": 3034, "max": [ 0.9970338, 0.9999959999999999, 0.9999014999999999 ], "min": [ -0.9970338, -0.998828, -0.9994199 ], "type": "VEC3" }, { "bufferView": 0, "byteOffset": 72816, "componentType": 5126, "count": 3034, "max": [ 1.0, 1.0 ], "min": [ 0.0, 0.0 ], "type": "VEC2" }, { "bufferView": 1, "byteOffset": 0, "componentType": 5123, "count": 11808, "max": [ 3033 ], "min": [ 0 ], "type": "SCALAR" } ], "asset": { "generator": "clay fbx2gltf", "version": "2.0" }, "bufferViews": [ { "buffer": 0, "byteLength": 97088, "byteOffset": 0, "target": 34962 }, { "buffer": 0, "byteLength": 23616, "byteOffset": 97088, "target": 34963 } ], "buffers": [ { "byteLength": 120704, "uri": "suzanne.bin" } ], "extensionsUsed": [ "KHR_materials_common" ], "materials": [ { "emissiveFactor": [ 0.0, 0.0, 0.0 ], "name": "Material_001", "pbrMetallicRoughness": { "baseColorFactor": [ 0.64, 0.64, 0.64, 1 ], "metallicFactor": 0, "roughnessFactor": 0.565857216171175 } } ], "meshes": [ { "name": "Suzanne", "primitives": [ { "attributes": { "NORMAL": 1, "POSITION": 0, "TEXCOORD_0": 2 }, "indices": 3, "material": 0 } ] } ], "nodes": [ { "matrix": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], "mesh": 0, "name": "Suzanne" } ], "scene": 0, "scenes": [ { "nodes": [ 0 ] } ] } ================================================ FILE: examples/resources/models/gltf/teapots_galore/teapots_galore.gltf ================================================ { "accessors": [ { "bufferView": 0, "componentType": 5126, "count": 2204, "extras": { "arrayIndex": 0 }, "max": [ 3.433150053024292, 3.1500000953674316, 2.0 ], "min": [ -3.0, 0.0, -2.0 ], "type": "VEC3" }, { "bufferView": 1, "componentType": 5126, "count": 2204, "extras": { "arrayIndex": 1 }, "type": "VEC3" }, { "bufferView": 2, "componentType": 5125, "count": 12096, "extras": { "arrayIndex": 2 }, "type": "SCALAR" }, { "bufferView": 3, "componentType": 5126, "count": 958, "extras": { "arrayIndex": 3 }, "type": "VEC3" }, { "bufferView": 4, "componentType": 5126, "count": 958, "extras": { "arrayIndex": 4 }, "type": "VEC4" }, { "bufferView": 5, "componentType": 5126, "count": 958, "extras": { "arrayIndex": 5 }, "type": "VEC3" }, { "bufferView": 6, "componentType": 5126, "count": 941, "extras": { "arrayIndex": 6 }, "type": "VEC3" }, { "bufferView": 7, "componentType": 5126, "count": 941, "extras": { "arrayIndex": 7 }, "type": "VEC4" }, { "bufferView": 8, "componentType": 5126, "count": 941, "extras": { "arrayIndex": 8 }, "type": "VEC3" }, { "bufferView": 9, "componentType": 5126, "count": 4, "extras": { "arrayIndex": 9 }, "max": [ 1.0, 0.0, 1.0 ], "min": [ -1.0, 0.0, -1.0 ], "type": "VEC3" }, { "bufferView": 10, "componentType": 5126, "count": 4, "extras": { "arrayIndex": 10 }, "type": "VEC3" }, { "bufferView": 11, "componentType": 5126, "count": 4, "extras": { "arrayIndex": 11 }, "type": "VEC2" }, { "bufferView": 12, "componentType": 5125, "count": 6, "extras": { "arrayIndex": 12 }, "type": "SCALAR" } ], "asset": { "generator": "OctaneGltfExporter Version:2.2", "version": "2.0" }, "bufferViews": [ { "buffer": 0, "byteLength": 26448, "extras": { "arrayIndex": 0 } }, { "buffer": 0, "byteLength": 26448, "byteOffset": 26448, "extras": { "arrayIndex": 1 } }, { "buffer": 0, "byteLength": 48384, "byteOffset": 52896, "extras": { "arrayIndex": 2 } }, { "buffer": 1, "byteLength": 11496, "extras": { "arrayIndex": 3 } }, { "buffer": 1, "byteLength": 15328, "byteOffset": 11496, "extras": { "arrayIndex": 4 } }, { "buffer": 1, "byteLength": 11496, "byteOffset": 26824, "extras": { "arrayIndex": 5 } }, { "buffer": 1, "byteLength": 11292, "byteOffset": 38320, "extras": { "arrayIndex": 6 } }, { "buffer": 1, "byteLength": 15056, "byteOffset": 49612, "extras": { "arrayIndex": 7 } }, { "buffer": 1, "byteLength": 11292, "byteOffset": 64668, "extras": { "arrayIndex": 8 } }, { "buffer": 2, "byteLength": 48, "extras": { "arrayIndex": 9 } }, { "buffer": 2, "byteLength": 48, "byteOffset": 48, "extras": { "arrayIndex": 10 } }, { "buffer": 2, "byteLength": 32, "byteOffset": 96, "extras": { "arrayIndex": 11 } }, { "buffer": 2, "byteLength": 24, "byteOffset": 128, "extras": { "arrayIndex": 12 } } ], "buffers": [ { "byteLength": 101280, "extras": { "arrayIndex": 0 }, "uri": "mesh.bin" }, { "byteLength": 75960, "extras": { "arrayIndex": 1 }, "uri": "transforms.bin" }, { "byteLength": 152, "extras": { "arrayIndex": 2 }, "uri": "mesh_2.bin" } ], "cameras": [ { "extras": { "arrayIndex": 0 }, "name": "Thin lens camera", "perspective": { "aspectRatio": 1.3333333730697632, "yfov": 0.8172757029533386, "zfar": 10000000000.0, "znear": 9.999999747378752e-05 }, "type": "perspective" } ], "extensionsUsed": [ "EXT_mesh_gpu_instancing" ], "materials": [ { "extras": { "arrayIndex": 0 }, "name": "cube", "pbrMetallicRoughness": { "baseColorFactor": [ 0.699999988079071, 0.699999988079071, 0.699999988079071, 1.0 ], "roughnessFactor": 0.06319999694824219 } }, { "extras": { "arrayIndex": 1 }, "name": "cube_1", "pbrMetallicRoughness": { "baseColorFactor": [ 0.7000000476837158, 0.0006436262046918273, 0.03353740647435188, 1.0 ], "roughnessFactor": 0.06319999694824219 } }, { "extras": { "arrayIndex": 2 }, "name": "cube_2", "pbrMetallicRoughness": { "baseColorFactor": [ 0.15800000727176666, 0.10700000077486038, 0.09399999678134918, 1.0 ], "metallicFactor": 0.11500000208616257, "roughnessFactor": 0.13469399511814117 } } ], "meshes": [ { "extras": { "arrayIndex": 0 }, "name": "teapot", "primitives": [ { "attributes": { "NORMAL": 1, "POSITION": 0 }, "indices": 2, "material": 0, "mode": 4 } ] }, { "extras": { "arrayIndex": 1 }, "name": "plane", "primitives": [ { "attributes": { "NORMAL": 10, "POSITION": 9, "TEXCOORD_0": 11 }, "indices": 12, "material": 2, "mode": 4 } ] } ], "nodes": [ { "children": [ 1, 2, 3, 4 ], "extras": { "arrayIndex": 0 }, "name": "teapots_galore" }, { "camera": 0, "extras": { "arrayIndex": 1 }, "matrix": [ 1.0, -0.0, 0.0, -0.0, -0.0, 0.9578263163566589, -0.2873478829860687, 0.0, -0.0, 0.2873478829860687, 0.9578263163566589, -0.0, -0.0, 20.000001907348633, -0.0, 1.0 ], "name": "Thin lens camera" }, { "children": [ 5 ], "extras": { "arrayIndex": 2 }, "matrix": [ 0.7071068286895752, 0.0, -0.7071067690849304, 0.0, 0.0, 1.0, 0.0, 0.0, 0.7071067690849304, 0.0, 0.7071068286895752, 0.0, 0.0, 0.0, 0.0, 1.0 ], "name": "Placement" }, { "extensions": { "EXT_mesh_gpu_instancing": { "attributes": { "ROTATION": 4, "SCALE": 5, "TRANSLATION": 3 } } }, "extras": { "arrayIndex": 3 }, "matrix": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.2999999523162842, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], "mesh": 0, "name": "teapot" }, { "extensions": { "EXT_mesh_gpu_instancing": { "attributes": { "ROTATION": 7, "SCALE": 8, "TRANSLATION": 6 } } }, "extras": { "arrayIndex": 4 }, "matrix": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], "mesh": 0, "name": "teapot0" }, { "children": [ 6 ], "extras": { "arrayIndex": 5 }, "matrix": [ 240.0, 0.0, 0.0, 0.0, 0.0, 240.0, 0.0, 0.0, 0.0, 0.0, 240.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], "name": "Placement_3" }, { "extras": { "arrayIndex": 6 }, "mesh": 1, "name": "plane" } ], "scene": 0, "scenes": [ { "extras": { "arrayIndex": 0 }, "name": "teapots_galore", "nodes": [ 0 ] } ] } ================================================ FILE: examples/resources/skybox/Bridge2/readme.txt ================================================ Author ====== This is the work of Emil Persson, aka Humus. http://www.humus.name humus@comhem.se Legal stuff =========== This work is free and may be used by anyone for any purpose and may be distributed freely to anyone using any distribution media or distribution method as long as this file is included. Distribution without this file is allowed if it's distributed with free non-commercial software; however, fair credit of the original author is expected. Any commercial distribution of this software requires the written approval of Emil Persson. ================================================ FILE: examples/resources/skybox/Park2/readme.txt ================================================ Author ====== This is the work of Emil Persson, aka Humus. http://www.humus.name humus@comhem.se Legal stuff =========== This work is free and may be used by anyone for any purpose and may be distributed freely to anyone using any distribution media or distribution method as long as this file is included. Distribution without this file is allowed if it's distributed with free non-commercial software; however, fair credit of the original author is expected. Any commercial distribution of this software requires the written approval of Emil Persson. ================================================ FILE: examples/resources/skybox/mp_cloud9/Cloud 9.nfo ================================================ .oOOOo. o o .O o O O .oOOo. o o o O o o O o o O o o .oOo. O o .oOoO `OooOo O O O o o O o O O `o .o o o O O o O o o `OoooO' Oo `OoO' `OoO'o `OoO'o `OooO' From the Mind of the Mighty Pete ! Enjoy ! http://www.geocities.com/petes-oasis/ $, $, , "ss.$ss. .s' , .ss$$$$$$$$$$s, $. s$$$$$$$$$$$$$$`$$Ss "$$$$$$$$$$$$$$$$$$o$$$ , s$$$$$$$$$$$$$$$$$$$$$$$$s, ,s s$$$$$$$$$"$$$$$$""""$$$$$$"$$$$$, s$$$$$$$$$$s""$$$$ssssss"$$$$$$$$" s$$$$$$$$$$' `"""ss"$"$s"" s$$$$$$$$$$, `"""""$ .s$$s s$$$$$$$$$$$$s,... `s$$' ` `ssss$$$$$$$$$$$$$$$$$$$$####s. .$$"$. , s- `""""$$$$$$$$$$$$$$$$$$$$#####$$$$$$" $.$' "$$$$$$$$$$$$$$$$$$$$$####s"" .$$$| "$$$$$$$$$$$$$$$$$$$$$$$$##s .$$" $ $$""$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" ` $$" "$"$$$$$$$$$$$$$$$$$$$$S""""' , ," ' $$$$$$$$$$$$$$$$####s $. .s$$$$$$$$$$$$$$$$$####" , "$s. ..ssS$$$$$$$$$$$$$$$$$$$####" $ .$$$S$$$$$$$$$$$$$$$$$$$$$$$$#####" Ss ..sS$$$$$$$$$$$$$$$$$$$$$$$$$$$######"" "$$sS$$$$$$$$$$$$$$$$$$$$$$$$$$$########" , s$$$$$$$$$$$$$$$$$$$$$$$$#########""' $ s$$$$$$$$$$$$$$$$$$$$$#######""' s' , $$..$$$$$$$$$$$$$$$$$$######"' ....,$$.... ,$ "$$$$$$$$$$$$$$$######"' , .sS$$$$$$$$$$$$$$$$s$$ $$$$$$$$$$$$#####" $, .s$$$$$$$$$$$$$$$$$$$$$$$$s. ) $$$$$$$$$$$#####' `$$$$$$$$$###########$$$$$$$$$$$. (( $$$$$$$$$$$##### $$$$$$$$###" "####$$$$$$$$$$ ) \ $$$$$$$$$$$$####. $$$$$$###" "###$$$$$$$$$ s' ( ) $$$$$$$$$$$$$####. $$$$$###" The Mighty ####$$$$$$$$s$$' ) ( ( $$"$$$$$$$$$$$#####.$$$$$###' Pete .###$$$$$$$$$$" ( ) ) _,$" $$$$$$$$$$$$######.$$##' .###$$$$$$$$$$ ) ( ( \. "$$$$$$$$$$$$$#######,,,. ..####$$$$$$$$$$$" ( )$ ) ) ,$$$$$$$$$$$$$$$$$$####################$$$$$$$$$$$" ( ($$ ( \ _sS" `"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$S$$, ) )$$$s ) ) . . `$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"' `$$ ( $$$Ss/ .$, .$,,s$$$$$$##S$$$$$$$$$$$$$$$$$$$$$$$$S"" ' \)_$$$$$$$$$$$$$$$$$$$$$$$##" $$ `$$. `$$. `"S$$$$$$$$$$$$$$$$$#" $ `$ `$ `"""""""""""""' ' ' ' ================================================ FILE: examples/resources/skybox/mp_cloud9/license.txt ================================================ This skybox has been created by 'The Mighty Pete'. He can be reached at the following WEB site: http://www.petesoasis.com The author grants you the right to freely use this sky box in your projects and distribute it under the GNU General Public License version 2. ================================================ FILE: examples/resources/skybox/mp_cloud9/mp_cloud9.shader ================================================ textures/skies/mp_cloud9 { qer_editorimage env/mp_cloud9/cloud9_ft.tga surfaceparm noimpact surfaceparm nolightmap q3map_globaltexture q3map_lightsubdivide 256 q3map_surfacelight 100 surfaceparm sky q3map_sun 1 1 1 100 0 90 skyparms env/mp_cloud9/cloud9 - - } ================================================ FILE: examples/resources/skybox/skyboxsun25deg/skyboxsun25degtest.txt ================================================ http://reije081.home.xs4all.nl/skyboxes/ ================================================ FILE: examples/scene_anchor.html ================================================ t3d - anchor matrix
t3d - anchor matrix
================================================ FILE: examples/scene_clippingplanes.html ================================================ t3d - scene clipping planes
t3d - scene clipping planes
================================================ FILE: examples/scene_fog.html ================================================ t3d - fog
t3d - fog
================================================ FILE: examples/scene_gamma_correction.html ================================================ t3d - gamma correction
t3d - gamma correction
================================================ FILE: examples/sprite_sprites.html ================================================ t3d - sprites
t3d - sprites
================================================ FILE: examples/stereo_anaglyph.html ================================================ t3d - anaglyph
t3d - anaglyph
================================================ FILE: examples/stereo_webvr_car.html ================================================ t3d - car
t3d - car
it's a webvr demo
================================================ FILE: examples/stereo_webxr_vr_car.html ================================================ t3d - car
t3d - car
================================================ FILE: examples/text_bitmap.html ================================================ t3d - bitmap text
t3d - bitmap text
Reference to three-msdf-text-utils
================================================ FILE: examples/text_bitmap_dynamic.html ================================================ t3d - bitmap dynamic text
t3d - bitmap dynamic text
================================================ FILE: examples/text_sdf.html ================================================ t3d - text sdf
t3d - text sdf
generate sdf font from tiny-sdf
generate msdf font from three-msdf-text
================================================ FILE: examples/text_sdf_dynamic.html ================================================ t3d - text sdf dynamic
t3d - dynamic sdf text
================================================ FILE: examples/text_typeface.html ================================================ t3d - text typeface
t3d - text typeface
Use Facetype.js to generate typeface.json fonts.
Collection of Google fonts as typeface data.
================================================ FILE: examples/texture_2darray.html ================================================ t3d - texture2d array
t3d - texture2d array
Scanned head data by Divine Augustine
licensed under CPOL
================================================ FILE: examples/texture_3d.html ================================================ t3d - texture3d ================================================ FILE: examples/texture_anisotropic.html ================================================ t3d - anisotropic
t3d - anisotropic
================================================ FILE: examples/texture_depth.html ================================================ t3d - depth texture
t3d - depth texture
================================================ FILE: examples/texture_generator_heatmap.html ================================================ t3d - texture heatmap
t3d - texture heatmap
================================================ FILE: examples/texture_generator_idwmap.html ================================================ t3d - texture idwmap
t3d - texture idwmap
================================================ FILE: examples/texture_integer.html ================================================ t3d - integer texture
t3d - integer texture
This is a texture of signed integer. The upper and lower parts represent the positive part and the negative part respectively.
Available only for WebGL 2.0
================================================ FILE: examples/texture_loader_compressed_dds.html ================================================ t3d - compressed texture dds loader
t3d - compressed texture dds
================================================ FILE: examples/texture_loader_compressed_pvr.html ================================================ t3d - compressed texture pvr loader
t3d - compressed texture pvr
================================================ FILE: examples/texture_loader_env.html ================================================ t3d - env loader
t3d - env cube texture loader
IBL map is generated by t3d-ibl-baker
================================================ FILE: examples/texture_loader_exr.html ================================================ t3d - exr loader
t3d - exr texture loader example
Image courtesy of Paul Debevec.
================================================ FILE: examples/texture_loader_hdr.html ================================================ t3d - hdr loader
t3d - hdr texture loader example
Image courtesy of Paul Debevec.
================================================ FILE: examples/texture_loader_hdr_cube.html ================================================ t3d - hdr loader
t3d - hdr loader for cube
================================================ FILE: examples/texture_loader_hdr_panorama.html ================================================ t3d - hdr loader
t3d - hdr loader for panorama
================================================ FILE: examples/texture_loader_imagebitmap.html ================================================ t3d - image bitmap loader
t3d - image bitmap loader
================================================ FILE: examples/texture_loader_ktx2.html ================================================ t3d - ktx2 loader
t3d - ktx2 texture loader
================================================ FILE: examples/texture_loader_tga.html ================================================ t3d - tga texture loader
t3d - tga texture loader
================================================ FILE: examples/texture_mipmap.html ================================================ t3d - mipmap
t3d - mipmap
================================================ FILE: examples/texture_video.html ================================================ t3d - video texture
t3d - video texture
playing sintel trailer
================================================ FILE: examples/webgl_canvas_transparent.html ================================================ t3d - canvas transparent
t3d - canvas transparent
================================================ FILE: examples/webgl_clipculldistance.html ================================================ t3d - webgl clip cull distance
t3d - vertex shader clipping
via WEBGL_clip_cull_distance
================================================ FILE: examples/webgl_contextlost.html ================================================ t3d - contextlost
t3d - contextlost
================================================ FILE: examples/webgl_depthfunc.html ================================================ t3d - depth func
t3d - depth func
================================================ FILE: examples/webgl_external_buffer.html ================================================ t3d - external buffer
t3d - external buffer
Setting external glBuffer for t3d buffer.
================================================ FILE: examples/webgl_external_texture.html ================================================ t3d - external texture
t3d - external texture
Setting external glTexture for t3d texture.
================================================ FILE: examples/webgl_helpers.html ================================================ t3d - webgl helpers
t3d - webgl helpers
================================================ FILE: examples/webgl_instanced_draw.html ================================================ t3d - webgl instanced draw
t3d - instanced draw
Model from "asteroid" by shawn0326
================================================ FILE: examples/webgl_logarithmicDepthBuffer.html ================================================ t3d - logarithmic depth buffer
t3d - logarithmic depth buffer
================================================ FILE: examples/webgl_mesh_batch.html ================================================ t3d - webgl batched mesh
t3d - batched mesh
================================================ FILE: examples/webgl_multi_draw.html ================================================ t3d - multi draw
t3d - multi draw
Draw 30k planes using WEBGL_multi_draw.
Setting multiDrawCount will have no effect if useMultiDraw is set to false.
================================================ FILE: examples/webgl_polygonoffset.html ================================================ t3d - polygon offset
t3d - polygon offset
================================================ FILE: examples/webgl_primitive_restart.html ================================================ t3d - primitive restart
t3d - primitive restart
================================================ FILE: examples/webgl_query_occlusion.html ================================================ t3d - query occlusion
t3d - query occlusion
The light turns red when the ball is occluded.
================================================ FILE: examples/webgl_query_occlusion_proxy.html ================================================ t3d - occlusion query proxy
t3d - occlusion query proxy
The sprite becomes translucent when it is occluded.
Only available in WebGL2.0.
================================================ FILE: examples/webgl_query_timer.html ================================================ t3d - query timer
t3d - query timer
================================================ FILE: examples/webgl_renderinfo.html ================================================ t3d - render info
t3d - render info
================================================ FILE: examples/webgl_shader_compile.html ================================================ t3d - shader compile async
t3d - compile shaders asynchronously
To facilitate testing, the material defines for each mesh is different.
================================================ FILE: examples/webgl_shader_precompile.html ================================================ t3d - shader precompile
t3d - precompile shaders
Displayed immediately after creation VS Wait 10ms after precompile
To facilitate testing, the material defines for each mesh is different.
================================================ FILE: examples/webgl_stencil.html ================================================ t3d - stencil
t3d - stencil
================================================ FILE: package.json ================================================ { "name": "t3d", "version": "0.5.3", "description": "t3d.js is a lightweight, web-first, and extendable 3D rendering library.", "type": "module", "main": "./build/t3d.js", "module": "./build/t3d.module.js", "exports": { ".": "./build/t3d.module.js", "./src/*": "./src/*", "./examples/jsm/*": "./examples/jsm/*", "./addons/*": "./examples/jsm/*" }, "repository": { "type": "git", "url": "https://github.com/uinosoft/t3d.js" }, "files": [ "build", "examples/*.html", "examples/jsm", "LICENSE", "package.json", "README.md", "src" ], "keywords": [ "t3d", "t3d.js", "javascript", "3d", "virtual-reality", "augmented-reality", "webgl", "webgl2", "webxr", "canvas", "html5" ], "author": "uino", "license": "BSD-3-Clause", "bugs": { "url": "https://github.com/uinosoft/t3d.js/issues" }, "devDependencies": { "@babel/core": "^7.19.1", "@babel/preset-env": "^7.19.1", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-terser": "^0.4.0", "clean-jsdoc-theme": "^4.2.13", "eslint": "^9.25.1", "eslint-plugin-html": "^8.0.0", "eslint-plugin-import": "^2.28.1", "eslint-plugin-jsdoc": "^61.5.0", "globals": "^17.0.0", "jsdoc": "^4.0.2", "qunit": "^2.24.1", "rollup": "^4.9.1", "servez": "^2.1.1" }, "scripts": { "start": "npm run dev", "test": "npm run lint && npm run test-unit", "b": "npm run build", "build": "rollup -c", "build-module": "rollup -c --configOnlyModule", "dev": "rollup -c -w", "server": "servez -p 8080 --ssl", "doc": "jsdoc -c ./tools/doc.config.json", "lint": "eslint src", "lint-fix": "eslint src --fix", "lint-addons": "eslint examples/jsm", "lint-addons-fix": "eslint examples/jsm --fix", "lint-examples": "eslint \"examples/**/*.html\"", "lint-examples-fix": "eslint \"examples/**/*.html\" --fix", "lint-tests": "eslint tests", "test-unit": "qunit tests/unit/source.unit.js" } } ================================================ FILE: rollup.config.js ================================================ import { babel } from '@rollup/plugin-babel'; import terser from '@rollup/plugin-terser'; const babelrc = { presets: [ [ '@babel/preset-env', { modules: false, targets: '>0.3%, not dead', loose: true, bugfixes: true } ] ] }; function glsl() { return { transform(code, id) { if (/\.glsl$/.test(id) === false) return; const transformedCode = 'export default ' + JSON.stringify( code .trim() .replace(/\r/g, '') .replace(/[ \t]*\/\/.*\n/g, '') // remove // .replace(/[ \t]*\/\*[\s\S]*?\*\//g, '') // remove /* */ .replace(/\n{2,}/g, '\n') // # \n+ to \n ) + ';'; return { code: transformedCode, map: { mappings: '' } }; } }; } function babelCleanup() { const doubleSpaces = / {2}/g; return { transform(code) { code = code.replace(doubleSpaces, '\t'); return { code: code, map: null }; } }; } const headerString = `/** * @license * Copyright 2021-present uino * SPDX-License-Identifier: BSD-3-Clause */\n`; function header() { return { renderChunk(code) { return headerString + code; } }; } const builds = [ { input: 'src/main.js', plugins: [ glsl(), header() ], output: [ { format: 'esm', file: 'build/t3d.module.js' } ] }, { input: 'src/main.js', plugins: [ glsl(), babel({ babelHelpers: 'bundled', compact: false, babelrc: false, ...babelrc }), babelCleanup(), header() ], output: [ { format: 'umd', name: 't3d', file: 'build/t3d.js', indent: '\t' } ] }, { input: 'src/main.js', plugins: [ glsl(), babel({ babelHelpers: 'bundled', babelrc: false, ...babelrc }), babelCleanup(), terser(), header() ], output: [ { format: 'umd', name: 't3d', file: 'build/t3d.min.js' } ] } ]; export default args => args.configOnlyModule ? builds[0] : builds; ================================================ FILE: src/EventDispatcher.js ================================================ /** * JavaScript events for custom objects. */ class EventDispatcher { /** * Adds a listener to an event type. * @param {string} type - The type of event to listen to. * @param {Function} listener - The function that gets called when the event is fired. */ addEventListener(type, listener) { if (this._listeners === undefined) this._listeners = {}; const listeners = this._listeners; if (listeners[type] === undefined) { listeners[type] = []; } if (listeners[type].indexOf(listener) === -1) { listeners[type].push(listener); } } /** * Removes a listener from an event type. * @param {string} type - The type of the listener that gets removed. * @param {Function} listener - The listener function that gets removed. */ removeEventListener(type, listener) { const listeners = this._listeners; if (listeners === undefined) return; const listenerArray = listeners[type]; if (listenerArray !== undefined) { const index = listenerArray.indexOf(listener); if (index !== -1) { listenerArray.splice(index, 1); } } } /** * Fire an event. * @param {object} event - The event that gets fired. */ dispatchEvent(event) { const listeners = this._listeners; if (listeners === undefined) return; const listenerArray = listeners[event.type]; if (listenerArray !== undefined) { event.target = this; // Make a copy, in case listeners are removed while iterating. const array = listenerArray.slice(0); for (let i = 0, l = array.length; i < l; i++) { array[i].call(this, event); } event.target = null; } } } export { EventDispatcher }; ================================================ FILE: src/animation/AnimationAction.js ================================================ import { BLEND_TYPE } from '../const.js'; import { EventDispatcher } from '../EventDispatcher.js'; /** * AnimationAction wraps AnimationClip and is mainly responsible for the update logic of time. * You can extend other functions by inheriting this class, such as repeat playback, pingpang, etc. * And since this class inherits from EventDispatcher, animation events can also be extended. * @extends EventDispatcher */ class AnimationAction extends EventDispatcher { /** * @param {KeyframeClip} clip - The keyframe clip for this action. */ constructor(clip) { super(); /** * The keyframe clip for this action. * @type {KeyframeClip} */ this.clip = clip; /** * The degree of influence of this action (in the interval [0, 1]). * Values can be used to blend between several actions. * @type {number} * @default 0 */ this.weight = 0; /** * The local time of this action (in seconds). * @type {number} */ this.time = 0; /** * The blend mode for this action, currently only two values BLEND_TYPE.NORMAL and BLEND_TYPE.ADD are available. * @type {BLEND_TYPE} * @default {BLEND_TYPE.NORMAL} */ this.blendMode = BLEND_TYPE.NORMAL; } /** * Update time. * @param {number} deltaTime - The delta time in seconds. */ update(deltaTime) { this.time += deltaTime; const endTime = this.clip.duration; if (endTime === 0) { this.time = 0; return; } if (this.time > endTime) { this.time = this.time % endTime; } if (this.time < 0) { this.time = this.time % endTime + endTime; } } } export { AnimationAction }; ================================================ FILE: src/animation/AnimationMixer.js ================================================ import { PropertyBindingMixer } from './PropertyBindingMixer.js'; import { BLEND_TYPE } from '../const.js'; /** * The AnimationMixer is a player for animations on a particular object in the scene. * When multiple objects in the scene are animated independently, one AnimationMixer may be used for each object. */ class AnimationMixer { constructor() { this._actions = []; this._bindings = {}; } /** * Add an action to this mixer. * @param {AnimationAction} action - The action to add. */ addAction(action) { if (this._actions.indexOf(action) !== -1) { console.warn('AnimationMixer.addAction(): already has the action, clip name is <' + action.clip.name + '>.'); return; } this._actions.push(action); const tracks = action.clip.tracks; for (let i = 0; i < tracks.length; i++) { const track = tracks[i]; const trackName = track.name; if (!this._bindings[trackName]) { const binding = new PropertyBindingMixer(track.target, track.propertyPath, track.valueTypeName, track.valueSize); this._bindings[trackName] = { binding, referenceCount: 0, active: false, cachedActive: false }; } this._bindings[trackName].referenceCount++; } } /** * Remove an action from this mixer. * @param {AnimationAction} action - The action to be removed. */ removeAction(action) { const index = this._actions.indexOf(action); if (index === -1) { console.warn('AnimationMixer.removeAction(): action not found in this mixer, clip name is <' + action.clip.name + '>.'); return; } if (action.weight > 0) { console.warn('AnimationMixer.removeAction(): make sure action\'s weight is zero before removing it.'); return; } this._actions.splice(index, 1); const tracks = action.clip.tracks; for (let i = 0; i < tracks.length; i++) { const trackName = tracks[i].name; const bindingInfo = this._bindings[trackName]; if (bindingInfo) { if (--bindingInfo.referenceCount <= 0) { if (bindingInfo.cachedActive) { bindingInfo.binding.restoreOriginalState(); } delete this._bindings[trackName]; } } } } /** * Whether has this action. * @param {AnimationAction} action - The action. * @returns {boolean} */ hasAction(action) { return this._actions.indexOf(action) > -1; } /** * Get all actions. * @returns {AnimationAction[]} */ getActions() { return this._actions; } /** * Advances the global mixer time and updates the animation. * @param {number} deltaTime - The delta time in seconds. */ update(deltaTime) { // Mark active to false for all bindings. for (const bindingName in this._bindings) { this._bindings[bindingName].active = false; } // Update the time of actions with a weight greater than 1 // And accumulate those bindings for (let i = 0, l = this._actions.length; i < l; i++) { const action = this._actions[i]; if (action.weight > 0) { action.update(deltaTime); const tracks = action.clip.tracks; for (let j = 0, tl = tracks.length; j < tl; j++) { const track = tracks[j]; const bindingInfo = this._bindings[track.name]; const binding = bindingInfo.binding; bindingInfo.active = true; if (!bindingInfo.cachedActive) { bindingInfo.binding.saveOriginalState(); bindingInfo.cachedActive = true; } track.getValue(action.time, binding.buffer); if (action.blendMode === BLEND_TYPE.ADD) { binding.accumulateAdditive(action.weight); } else { binding.accumulate(action.weight); } } } } // Apply all bindings. for (const bindingName in this._bindings) { const bindingInfo = this._bindings[bindingName]; if (bindingInfo.active) { bindingInfo.binding.apply(); } else { if (bindingInfo.cachedActive) { bindingInfo.binding.restoreOriginalState(); bindingInfo.cachedActive = false; } } } } } export { AnimationMixer }; ================================================ FILE: src/animation/KeyframeClip.js ================================================ /** * An KeyframeClip is a reusable set of keyframe tracks which represent an animation. */ class KeyframeClip { /** * @param {string} [name=''] - A name for this clip. * @param {KeyframeTrack[]} [tracks=[]] - An array of KeyframeTracks. * @param {number} [duration] - The duration of this clip (in seconds). If not passed, the duration will be calculated from the passed tracks array. */ constructor(name = '', tracks = [], duration = -1) { /** * A name for this clip. * @type {string} */ this.name = name; /** * An array of KeyframeTracks. * @type {KeyframeTrack[]} */ this.tracks = tracks; /** * The duration of this clip (in seconds). * If a negative value is passed, the duration will be calculated from the passed tracks array. * @type {number} */ this.duration = duration; if (this.duration < 0) { this.resetDuration(); } } /** * Sets the duration of the clip to the duration of its longest KeyframeTrack. * @returns {KeyframeClip} */ resetDuration() { const tracks = this.tracks; let duration = 0; for (let i = 0, l = tracks.length; i < l; i++) { const track = tracks[i]; duration = Math.max(duration, track.times[track.times.length - 1]); } this.duration = duration; return this; } } export { KeyframeClip }; ================================================ FILE: src/animation/KeyframeInterpolants.js ================================================ import { Quaternion } from '../math/Quaternion.js'; /** * Interpolant serves as the base class for all interpolation algorithms. * It defines a set of static methods that are intended to be invoked by a keyframe track for the purpose of interpolation. * @abstract */ class KeyframeInterpolant { /** * Get the value size for keyframe values. * @returns {number} - the value size. */ static getValueSize() { return this.values.length / this.times.length; } /** * Interpolate the value for the specified time. * @param {number} index0 - the index of the first keyframe. * @param {number} ratio - the ratio (0-1) of the time passed between the first keyframe and the next keyframe. * @param {number} duration - the duration time between the first keyframe and the next keyframe. * @param {Array} outBuffer - the output buffer to store the interpolated value. * @returns {Array} - the output buffer to store the interpolated value. */ static interpolate(index0, ratio, duration, outBuffer) { throw new Error('Interpolant: call to abstract method'); } /** * Copy the value for the specified index. * @param {number} index - the index of the keyframe. * @param {Array} outBuffer - the output buffer to store the copied value. * @returns {Array} - the output buffer to store the copied value. */ static copyValue(index, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Step (Discrete) interpolation of keyframe values. * @extends KeyframeInterpolant */ class StepInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index0; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Linear interpolation of keyframe values. * @extends KeyframeInterpolant */ class LinearInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, offset0 = index0 * valueSize, offset1 = (index0 + 1) * valueSize; let value1, value2; for (let i = 0; i < valueSize; i++) { value1 = values[offset0 + i]; value2 = values[offset1 + i]; if (value1 !== undefined && value2 !== undefined) { outBuffer[i] = value1 * (1 - ratio) + value2 * ratio; } else { outBuffer[i] = value1; } } return outBuffer; } } /** * Quaternion Linear interpolation of keyframe values. * @extends KeyframeInterpolant */ class QuaternionLinearInterpolant extends KeyframeInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize; Quaternion.slerpFlat(outBuffer, 0, values, index0 * valueSize, values, (index0 + 1) * valueSize, ratio); return outBuffer; } } /** * Cubic spline interpolation of keyframe values. * @extends KeyframeInterpolant */ class CubicSplineInterpolant extends KeyframeInterpolant { static getValueSize() { return this.values.length / this.times.length / 3; } static interpolate(index0, ratio, duration, outBuffer) { const values = this.values, valueSize = this.valueSize, valueSize2 = valueSize * 2, valueSize3 = valueSize * 3, rr = ratio * ratio, rrr = rr * ratio, offset0 = index0 * valueSize3, offset1 = offset0 + valueSize3, s2 = -2 * rrr + 3 * rr, s3 = rrr - rr, s0 = 1 - s2, s1 = s3 - rr + ratio; // Layout of keyframe output values for CUBICSPLINE animations: // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] for (let i = 0; i < valueSize; i++) { const p0 = values[offset0 + i + valueSize], // splineVertex_k m0 = values[offset0 + i + valueSize2] * duration, // outTangent_k * (t_k+1 - t_k) p1 = values[offset1 + i + valueSize], // splineVertex_k+1 m1 = values[offset1 + i] * duration; // inTangent_k+1 * (t_k+1 - t_k) outBuffer[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; } return outBuffer; } static copyValue(index, outBuffer) { const values = this.values, valueSize = this.valueSize, offset = valueSize * index * 3 + valueSize; for (let i = 0; i < valueSize; i++) { outBuffer[i] = values[offset + i]; } return outBuffer; } } /** * Quaternion Cubic spline interpolation of keyframe values. * @extends CubicSplineInterpolant */ class QuaternionCubicSplineInterpolant extends CubicSplineInterpolant { static interpolate(index0, ratio, duration, outBuffer) { const result = super.interpolate(index0, ratio, duration, outBuffer); _q.fromArray(result).normalize().toArray(result); return result; } } const _q = new Quaternion(); export { KeyframeInterpolant, StepInterpolant, LinearInterpolant, QuaternionLinearInterpolant, CubicSplineInterpolant, QuaternionCubicSplineInterpolant }; ================================================ FILE: src/animation/KeyframeTrack.js ================================================ import { LinearInterpolant, StepInterpolant } from './KeyframeInterpolants.js'; /** * Base class for property track. * @abstract */ class KeyframeTrack { /** * @param {Object3D|Material} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant = LinearInterpolant) { this.target = target; this.propertyPath = propertyPath; this.name = this.target.uuid + '.' + propertyPath; this.times = times; this.values = values; this.valueSize = 0; this.interpolant = null; // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = LinearInterpolant; } else if (interpolant === false) { interpolant = StepInterpolant; } this.setInterpolant(interpolant); } /** * Set interpolant for this keyframe track. * @param {KeyframeInterpolant.constructor} interpolant * @returns {KeyframeTrack} */ setInterpolant(interpolant) { this.valueSize = interpolant.getValueSize.call(this); this.interpolant = interpolant; return this; } /** * Get value at time. * The value will be interpolated by interpolant if time is between keyframes. * @param {number} t - time * @param {Array} outBuffer - output buffer * @returns {Array} output buffer */ getValue(t, outBuffer) { const interpolant = this.interpolant, times = this.times, tl = times.length; if (t <= times[0]) { return interpolant.copyValue.call(this, 0, outBuffer); } else if (t >= times[tl - 1]) { return interpolant.copyValue.call(this, tl - 1, outBuffer); } // TODO use index cache for better performance // https://github.com/mrdoob/three.js/blob/dev/src/math/Interpolant.js let i0 = tl - 1; while (t < times[i0] && i0 > 0) { i0--; } const duration = times[i0 + 1] - times[i0]; const ratio = (t - times[i0]) / duration; return interpolant.interpolate.call(this, i0, ratio, duration, outBuffer); } } export { KeyframeTrack }; ================================================ FILE: src/animation/PropertyBindingMixer.js ================================================ import { Quaternion } from '../math/Quaternion.js'; /** * This holds a reference to a real property in the scene graph; used internally. * Binding property and value, mixer for multiple values. */ class PropertyBindingMixer { /** * @param {Object3D|Material} target * @param {string} propertyPath * @param {string} typeName - vector/bool/string/quaternion/number/color * @param {number} valueSize */ constructor(target, propertyPath, typeName, valueSize) { this.target = null; this.property = ''; this.parseBinding(target, propertyPath); this.valueSize = valueSize; let BufferType = Float64Array; let mixFunction, mixFunctionAdditive, setIdentity; switch (typeName) { case 'quaternion': mixFunction = slerp; mixFunctionAdditive = slerpAdditive; setIdentity = setIdentityQuaternion; break; case 'string': case 'bool': BufferType = Array; mixFunction = select; mixFunctionAdditive = select; setIdentity = setIdentityOther; break; default: mixFunction = lerp; mixFunctionAdditive = lerpAdditive; setIdentity = setIdentityNumeric; } // [ incoming | accu | orig | addAccu ] this.buffer = new BufferType(valueSize * 4); this._mixBufferFunction = mixFunction; this._mixBufferFunctionAdditive = mixFunctionAdditive; this._setIdentity = setIdentity; this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; // cache whether the bound property should be treated as an array-like value // (treat existing arrays or types with toArray/fromArray as array bindings, // or when valueSize > 1) const boundValue = this.target && this.target[this.property]; this._isArrayProperty = this.valueSize > 1 || Array.isArray(boundValue) || (boundValue && (typeof boundValue.toArray === 'function' || typeof boundValue.fromArray === 'function')); } parseBinding(target, propertyPath) { propertyPath = propertyPath.split('.'); if (propertyPath.length > 1) { let property = target[propertyPath[0]]; for (let index = 1; index < propertyPath.length - 1; index++) { property = property[propertyPath[index]]; } this.property = propertyPath[propertyPath.length - 1]; this.target = property; } else { this.property = propertyPath[0]; this.target = target; } } /** * Remember the state of the bound property and copy it to both accus. */ saveOriginalState() { const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * 2; // get value if (this._isArrayProperty) { if (this.target[this.property].toArray) { this.target[this.property].toArray(buffer, originalValueOffset); } else { setArray(buffer, this.target[this.property], originalValueOffset, stride); } } else { this.target[this.property] = buffer[originalValueOffset]; } // accu[0..1] := orig -- initially detect changes against the original for (let i = stride, e = originalValueOffset; i !== e; ++i) { buffer[i] = buffer[originalValueOffset + (i % stride)]; } // Add to identify for additive this._setIdentity(buffer, stride * 3, stride, originalValueOffset); this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; } /** * Apply the state previously taken via 'saveOriginalState' to the binding. */ restoreOriginalState() { const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * 2; // accu[0..1] := orig -- initially detect changes against the original for (let i = stride, e = originalValueOffset; i !== e; ++i) { buffer[i] = buffer[originalValueOffset + (i % stride)]; } this.apply(); } /** * Accumulate value. * @param {number} weight */ accumulate(weight) { const buffer = this.buffer, stride = this.valueSize, offset = stride; let currentWeight = this.cumulativeWeight; if (currentWeight === 0) { for (let i = 0; i !== stride; ++i) { buffer[offset + i] = buffer[i]; } currentWeight = weight; } else { currentWeight += weight; const mix = weight / currentWeight; this._mixBufferFunction(buffer, offset, 0, mix, stride); } this.cumulativeWeight = currentWeight; } /** * Additive Accumulate value. * @param {number} weight */ accumulateAdditive(weight) { const buffer = this.buffer, stride = this.valueSize, offset = stride * 3; if (this.cumulativeWeightAdditive === 0) { this._setIdentity(buffer, offset, stride, stride * 2); } this._mixBufferFunctionAdditive(buffer, offset, 0, weight, stride); this.cumulativeWeightAdditive += weight; } /** * Apply to scene graph. */ apply() { const buffer = this.buffer, stride = this.valueSize, weight = this.cumulativeWeight, weightAdditive = this.cumulativeWeightAdditive; this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; if (weight < 1) { // accuN := accuN + original * ( 1 - cumulativeWeight ) const originalValueOffset = stride * 2; this._mixBufferFunction(buffer, stride, originalValueOffset, 1 - weight, stride); } if (weightAdditive > 0) { // accuN := accuN + additive accuN this._mixBufferFunctionAdditive(buffer, stride, 3 * stride, 1, stride); } // set value if (this._isArrayProperty) { if (this.target[this.property].fromArray) { this.target[this.property].fromArray(buffer, stride); } else { getArray(this.target[this.property], buffer, stride, stride); } } else { this.target[this.property] = buffer[stride]; } if (this.target.isTransformUV) { this.target.needsUpdate = true; } } } // Mix functions function select(buffer, dstOffset, srcOffset, t, stride) { if (t >= 0.5) { for (let i = 0; i !== stride; ++i) { buffer[dstOffset + i] = buffer[srcOffset + i]; } } } function slerp(buffer, dstOffset, srcOffset, t) { Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t); } const tempQuternionBuffer = new Float64Array(4); function slerpAdditive(buffer, dstOffset, srcOffset, t) { // Store result in tempQuternionBuffer Quaternion.multiplyQuaternionsFlat(tempQuternionBuffer, 0, buffer, dstOffset, buffer, srcOffset); // Slerp to the result Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, tempQuternionBuffer, 0, t); } function lerp(buffer, dstOffset, srcOffset, t, stride) { const s = 1 - t; for (let i = 0; i !== stride; ++i) { const j = dstOffset + i; buffer[j] = buffer[j] * s + buffer[srcOffset + i] * t; } } function lerpAdditive(buffer, dstOffset, srcOffset, t, stride) { for (let i = 0; i !== stride; ++i) { const j = dstOffset + i; buffer[j] = buffer[j] + buffer[srcOffset + i] * t; } } // identity function setIdentityNumeric(buffer, offset, stride) { for (let i = 0; i < stride; i++) { buffer[offset + i] = 0; } } function setIdentityQuaternion(buffer, offset) { setIdentityNumeric(buffer, offset, 3); buffer[offset + 3] = 1; } function setIdentityOther(buffer, offset, stride, copyOffset) { for (let i = 0; i < stride; i++) { buffer[offset + i] = buffer[copyOffset + i]; } } // get array function getArray(target, source, stride, count) { for (let i = 0; i < count; i++) { target[i] = source[stride + i]; } } function setArray(target, source, stride, count) { for (let i = 0; i < count; i++) { target[stride + i] = source[i]; } } export { PropertyBindingMixer }; ================================================ FILE: src/animation/tracks/BooleanKeyframeTrack.js ================================================ import { KeyframeTrack } from '../KeyframeTrack.js'; import { StepInterpolant } from '../KeyframeInterpolants.js'; /** * Used for boolean property track. * @extends KeyframeTrack */ class BooleanKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant] */ constructor(target, propertyPath, times, values, interpolant = StepInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = StepInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'bool' */ BooleanKeyframeTrack.prototype.valueTypeName = 'bool'; export { BooleanKeyframeTrack }; ================================================ FILE: src/animation/tracks/ColorKeyframeTrack.js ================================================ import { KeyframeTrack } from '../KeyframeTrack.js'; /** * Used for color property track. * @extends KeyframeTrack */ class ColorKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'color' */ ColorKeyframeTrack.prototype.valueTypeName = 'color'; export { ColorKeyframeTrack }; ================================================ FILE: src/animation/tracks/NumberKeyframeTrack.js ================================================ import { KeyframeTrack } from '../KeyframeTrack.js'; /** * Used for number property track. * @extends KeyframeTrack */ class NumberKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'number' */ NumberKeyframeTrack.prototype.valueTypeName = 'number'; export { NumberKeyframeTrack }; ================================================ FILE: src/animation/tracks/QuaternionKeyframeTrack.js ================================================ import { KeyframeTrack } from '../KeyframeTrack.js'; import { QuaternionLinearInterpolant } from '../KeyframeInterpolants.js'; /** * Used for quaternion property track. * @extends KeyframeTrack */ class QuaternionKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=QuaternionLinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant = QuaternionLinearInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = QuaternionLinearInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'quaternion' */ QuaternionKeyframeTrack.prototype.valueTypeName = 'quaternion'; export { QuaternionKeyframeTrack }; ================================================ FILE: src/animation/tracks/StringKeyframeTrack.js ================================================ import { KeyframeTrack } from '../KeyframeTrack.js'; import { StepInterpolant } from '../KeyframeInterpolants.js'; /** * Used for string property track. * @extends KeyframeTrack */ class StringKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=StepInterpolant] */ constructor(target, propertyPath, times, values, interpolant = StepInterpolant) { // since 0.2.2, remove this after few versions later if (interpolant === true) { interpolant = StepInterpolant; } super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'string' */ StringKeyframeTrack.prototype.valueTypeName = 'string'; export { StringKeyframeTrack }; ================================================ FILE: src/animation/tracks/VectorKeyframeTrack.js ================================================ import { KeyframeTrack } from '../KeyframeTrack.js'; /** * Used for vector property track. * @extends KeyframeTrack */ class VectorKeyframeTrack extends KeyframeTrack { /** * @param {Object3D} target * @param {string} propertyPath * @param {Array} times * @param {Array} values * @param {KeyframeInterpolant.constructor} [interpolant=LinearInterpolant] */ constructor(target, propertyPath, times, values, interpolant) { super(target, propertyPath, times, values, interpolant); } } /** * @readonly * @type {string} * @default 'vector' */ VectorKeyframeTrack.prototype.valueTypeName = 'vector'; export { VectorKeyframeTrack }; ================================================ FILE: src/base.js ================================================ /** * Clone uniforms. * @function * @name cloneUniforms * @param {object} uniforms_src - The input uniforms. * @returns {object} - The output uniforms. */ export function cloneUniforms(uniforms_src) { const uniforms_dst = {}; for (const name in uniforms_src) { const uniform_src = uniforms_src[name]; if (Array.isArray(uniform_src) || ArrayBuffer.isView(uniform_src)) { uniforms_dst[name] = uniform_src.slice(); } else { uniforms_dst[name] = uniform_src; } } return uniforms_dst; } /** * Clone json. * This is faster than JSON.parse(JSON.stringify()). * @function * @name cloneJson * @param {object} obj - The input json. * @returns {object} - The output json. */ export function cloneJson(obj) { const newObj = Array.isArray(obj) ? [] : {}; if (obj && typeof obj === 'object') { for (const key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = (obj[key] && typeof obj[key] === 'object') ? cloneJson(obj[key]) : obj[key]; } } } return newObj; } ================================================ FILE: src/const.js ================================================ /** * Enum for material Type. * @readonly * @enum {string} */ const MATERIAL_TYPE = { BASIC: 'basic', LAMBERT: 'lambert', PHONG: 'phong', PBR: 'pbr', PBR2: 'pbr2', POINT: 'point', LINE: 'line', SHADER: 'shader', DEPTH: 'depth', DISTANCE: 'distance' }; export { MATERIAL_TYPE }; /** * Enum for blend Type. * @readonly * @enum {string} */ const BLEND_TYPE = { NONE: 'none', NORMAL: 'normal', ADD: 'add', SUB: 'sub', MUL: 'mul', CUSTOM: 'custom' }; export { BLEND_TYPE }; /** * Enum for blend equation. * @readonly * @enum {number} */ const BLEND_EQUATION = { ADD: 100, SUBTRACT: 101, REVERSE_SUBTRACT: 102, /** Only webgl2 */ MIN: 103, MAX: 104 }; export { BLEND_EQUATION }; /** * Enum for blend factor. * @readonly * @enum {number} */ const BLEND_FACTOR = { ZERO: 200, ONE: 201, SRC_COLOR: 202, SRC_ALPHA: 203, SRC_ALPHA_SATURATE: 204, DST_COLOR: 205, DST_ALPHA: 206, ONE_MINUS_SRC_COLOR: 207, ONE_MINUS_SRC_ALPHA: 208, ONE_MINUS_DST_COLOR: 209, ONE_MINUS_DST_ALPHA: 210 }; export { BLEND_FACTOR }; /** * Enum for cull face Type. * @readonly * @enum {string} */ const CULL_FACE_TYPE = { NONE: 'none', FRONT: 'front', BACK: 'back', FRONT_AND_BACK: 'front_and_back' }; export { CULL_FACE_TYPE }; /** * Enum for draw side. * @readonly * @enum {string} */ const DRAW_SIDE = { FRONT: 'front', BACK: 'back', DOUBLE: 'double' }; export { DRAW_SIDE }; /** * Enum for shading side. * @readonly * @enum {string} */ const SHADING_TYPE = { SMOOTH_SHADING: 'smooth_shading', FLAT_SHADING: 'flat_shading' }; export { SHADING_TYPE }; /** * Enum for pixel format. * @readonly * @enum {number} */ const PIXEL_FORMAT = { DEPTH_COMPONENT: 1000, DEPTH_STENCIL: 1001, STENCIL_INDEX8: 1002, ALPHA: 1003, RED: 1004, RGB: 1005, RGBA: 1006, LUMINANCE: 1007, LUMINANCE_ALPHA: 1008, /** Only webgl2 */ RED_INTEGER: 1010, RG: 1011, RG_INTEGER: 1012, RGB_INTEGER: 1013, RGBA_INTEGER: 1014, /** Only internal formats and webgl2 */ R32F: 1100, R16F: 1101, R8: 1102, RG32F: 1103, RG16F: 1104, RG8: 1105, RGB32F: 1106, RGB16F: 1107, RGB8: 1108, RGBA32F: 1109, RGBA16F: 1110, RGBA8: 1111, RGBA4: 1112, RGB5_A1: 1113, DEPTH_COMPONENT32F: 1114, DEPTH_COMPONENT24: 1115, DEPTH_COMPONENT16: 1116, DEPTH24_STENCIL8: 1117, DEPTH32F_STENCIL8: 1118, R11F_G11F_B10F: 1119, /** For compressed texture formats */ RGB_S3TC_DXT1: 1200, RGBA_S3TC_DXT1: 1201, RGBA_S3TC_DXT3: 1202, RGBA_S3TC_DXT5: 1203, RGB_PVRTC_4BPPV1: 1204, RGB_PVRTC_2BPPV1: 1205, RGBA_PVRTC_4BPPV1: 1206, RGBA_PVRTC_2BPPV1: 1207, RGB_ETC1: 1208, RGBA_ASTC_4x4: 1209, RGBA_BPTC: 1210, RGB_BPTC_SIGNED_FORMAT: 1211, RGB_BPTC_UNSIGNED_FORMAT: 1212 }; export { PIXEL_FORMAT }; /** * Enum for pixel Type. * @readonly * @enum {number} */ const PIXEL_TYPE = { UNSIGNED_BYTE: 1500, UNSIGNED_SHORT_5_6_5: 1501, UNSIGNED_SHORT_4_4_4_4: 1502, UNSIGNED_SHORT_5_5_5_1: 1503, UNSIGNED_SHORT: 1504, UNSIGNED_INT: 1505, UNSIGNED_INT_24_8: 1506, FLOAT: 1507, HALF_FLOAT: 1508, FLOAT_32_UNSIGNED_INT_24_8_REV: 1509, BYTE: 1510, SHORT: 1511, INT: 1512 }; export { PIXEL_TYPE }; /** * Enum for texture filter. * @readonly * @enum {number} */ const TEXTURE_FILTER = { NEAREST: 1600, LINEAR: 1601, NEAREST_MIPMAP_NEAREST: 1602, LINEAR_MIPMAP_NEAREST: 1603, NEAREST_MIPMAP_LINEAR: 1604, LINEAR_MIPMAP_LINEAR: 1605 }; export { TEXTURE_FILTER }; /** * Enum for texture wrap. * @readonly * @enum {number} */ const TEXTURE_WRAP = { REPEAT: 1700, CLAMP_TO_EDGE: 1701, MIRRORED_REPEAT: 1702 }; export { TEXTURE_WRAP }; /** * Enum for compare function. * @readonly * @enum {number} */ const COMPARE_FUNC = { LEQUAL: 0x0203, GEQUAL: 0x0206, LESS: 0x0201, GREATER: 0x0204, EQUAL: 0x0202, NOTEQUAL: 0x0205, ALWAYS: 0x0207, NEVER: 0x0200 }; export { COMPARE_FUNC }; /** * Enum for operation. * @readonly * @enum {number} */ const OPERATION = { KEEP: 0x1E00, REPLACE: 0x1E01, INCR: 0x1E02, DECR: 0x1E03, INVERT: 0x150A, INCR_WRAP: 0x8507, DECR_WRAP: 0x8508 }; export { OPERATION }; /** * Enum for Shadow Type. * @readonly * @enum {string} */ const SHADOW_TYPE = { HARD: 'hard', POISSON_SOFT: 'poisson_soft', VOGEL5_SOFT: 'vogel5_soft', PCF3_SOFT: 'pcf3_soft', PCF5_SOFT: 'pcf5_soft', /** Only webgl2 */ PCSS16_SOFT: 'pcss16_soft', PCSS32_SOFT: 'pcss32_soft', PCSS64_SOFT: 'pcss64_soft' }; export { SHADOW_TYPE }; /** * Enum for Texel Encoding Type. * @readonly * @enum {string} */ const TEXEL_ENCODING_TYPE = { LINEAR: 'linear', SRGB: 'sRGB', GAMMA: 'Gamma' }; export { TEXEL_ENCODING_TYPE }; /** * Enum for Envmap Combine Type. * @readonly * @enum {string} */ const ENVMAP_COMBINE_TYPE = { MULTIPLY: 'ENVMAP_BLENDING_MULTIPLY', MIX: 'ENVMAP_BLENDING_MIX', ADD: 'ENVMAP_BLENDING_ADD' }; export { ENVMAP_COMBINE_TYPE }; /** * Enum for Draw Mode. * @readonly * @enum {number} */ const DRAW_MODE = { POINTS: 0, LINES: 1, LINE_LOOP: 2, LINE_STRIP: 3, TRIANGLES: 4, TRIANGLE_STRIP: 5, TRIANGLE_FAN: 6 }; export { DRAW_MODE }; /** * Enum for Vertex Color. * @readonly * @enum {number} */ const VERTEX_COLOR = { NONE: 0, RGB: 1, RGBA: 2 }; export { VERTEX_COLOR }; /** * Enum for ATTACHMENT * @readonly * @enum {number} */ const ATTACHMENT = { COLOR_ATTACHMENT0: 2000, COLOR_ATTACHMENT1: 2001, COLOR_ATTACHMENT2: 2002, COLOR_ATTACHMENT3: 2003, COLOR_ATTACHMENT4: 2004, COLOR_ATTACHMENT5: 2005, COLOR_ATTACHMENT6: 2006, COLOR_ATTACHMENT7: 2007, COLOR_ATTACHMENT8: 2008, COLOR_ATTACHMENT9: 2009, COLOR_ATTACHMENT10: 2010, COLOR_ATTACHMENT11: 2011, COLOR_ATTACHMENT12: 2012, COLOR_ATTACHMENT13: 2013, COLOR_ATTACHMENT14: 2014, COLOR_ATTACHMENT15: 2015, DEPTH_ATTACHMENT: 2020, STENCIL_ATTACHMENT: 2021, DEPTH_STENCIL_ATTACHMENT: 2030 }; export { ATTACHMENT }; /** * Enum for BUFFER_USAGE * @readonly * @enum {number} */ const BUFFER_USAGE = { STREAM_DRAW: 35040, STREAM_READ: 35041, STREAM_COPY: 35042, STATIC_DRAW: 35044, STATIC_READ: 35045, STATIC_COPY: 35046, DYNAMIC_DRAW: 35048, DYNAMIC_READ: 35049, DYNAMIC_COPY: 35050 }; export { BUFFER_USAGE }; /** * Enum for QUERYSET_TYPE * @readonly * @enum {number} */ const QUERYSET_TYPE = { OCCLUSION: 8000, TIMESTAMP: 8001 }; export { QUERYSET_TYPE }; ================================================ FILE: src/legacy.js ================================================ import { WebGLRenderer } from './webgl/WebGLRenderer.js'; import { WebGLTextures } from './webgl/WebGLTextures.js'; import { Scene } from './scenes/Scene.js'; import { MathUtils } from './math/MathUtils.js'; import { RenderStates } from './render/RenderStates.js'; import { Matrix4 } from './math/Matrix4.js'; import { Matrix3 } from './math/Matrix3.js'; import { Vector3 } from './math/Vector3.js'; import { EventDispatcher } from './EventDispatcher.js'; import { PropertyMap } from './render/PropertyMap.js'; import { ScreenRenderTarget } from './resources/targets/ScreenRenderTarget.js'; import { OffscreenRenderTarget } from './resources/targets/OffscreenRenderTarget.js'; import { RenderBuffer } from './resources/RenderBuffer.js'; import { Texture2D } from './resources/textures/Texture2D.js'; import { TextureCube } from './resources/textures/TextureCube.js'; import { Texture3D } from './resources/textures/Texture3D.js'; import { Texture2DArray } from './resources/textures/Texture2DArray.js'; import { ATTACHMENT, PIXEL_FORMAT } from './const.js'; Object.defineProperties(WebGLRenderer.prototype, { // deprecated since 0.4.5 asyncReadPixel: { configurable: true, get: function() { if (this._asyncReadPixel === undefined) { this._asyncReadPixel = false; } return this._asyncReadPixel; }, set: function(value) { this._asyncReadPixel = value; } } }); // deprecated since 0.4.5, use readTexturePixels instead WebGLRenderer.prototype.readRenderTargetPixels = function(x, y, width, height, buffer) { const state = this._state; const renderTarget = state.currentRenderTarget; const zIndex = renderTarget.activeLayer || renderTarget.activeLayer || 0; const mipLevel = renderTarget.activeMipmapLevel || 0; if (renderTarget && renderTarget.texture) { if ((x >= 0 && x <= (renderTarget.width - width)) && (y >= 0 && y <= (renderTarget.height - height))) { if (this.asyncReadPixel) { return this.readTexturePixels(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel); } else { this.readTexturePixelsSync(renderTarget.texture, x, y, width, height, buffer, zIndex, mipLevel); return Promise.resolve(buffer); } } } console.warn('WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed.'); return Promise.reject(); }; // deprecated since 0.5.1 WebGLTextures.prototype.setTexture2D = function(texture, slot) { // console.warn('WebGLTextures: .setTexture2D() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTextureCube = function(texture, slot) { // console.warn('WebGLTextures: .setTextureCube() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTexture3D = function(texture, slot) { // console.warn('WebGLTextures: .setTexture3D() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; WebGLTextures.prototype.setTexture2DArray = function(texture, slot) { // console.warn('WebGLTextures: .setTexture2DArray() has been deprecated, use .setTexture() instead.'); return this.setTexture(texture, slot); }; Object.defineProperties(Scene.prototype, { // deprecated since 0.2.7, add warning since 0.4.0 environmentLightIntensity: { configurable: true, get: function() { console.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.'); return this.envDiffuseIntensity; }, set: function(value) { console.warn('Scene: .environmentLightIntensity has been deprecated, use .envDiffuseIntensity instead.'); this.envDiffuseIntensity = value; } }, // deprecated since 0.4.0 _lightData: { configurable: true, get: function() { console.warn('Scene: ._lightData has been deprecated since v0.4.0, use .collector.lightingData.getGroup(0) instead.'); return this.collector.lightingData.getGroup(0); } }, // deprecated since 0.4.4 _sceneData: { configurable: true, get: function() { console.warn('Scene: ._sceneData has been deprecated since v0.4.4, use .collector.sceneData instead.'); return this.collector.sceneData; } }, // deprecated since 0.4.4 _lightingData: { configurable: true, get: function() { console.warn('Scene: ._lightingData has been deprecated since v0.4.4, use .collector.lightingData instead.'); return this.collector.lightingData; } } }); Object.defineProperties(RenderStates.prototype, { // deprecated since 0.4.0 lights: { configurable: true, get: function() { console.warn('RenderStates: .lights has been deprecated since v0.4.0, use .lighting.getGroup(0) instead.'); return this.lighting.getGroup(0); } } }); // deprecated since 0.2.8 export const generateUUID = MathUtils.generateUUID; export const isPowerOfTwo = MathUtils.isPowerOfTwo; export const nearestPowerOfTwo = MathUtils.nearestPowerOfTwo; export const nextPowerOfTwo = MathUtils.nextPowerOfTwo; // deprecated since 0.4.3 Matrix4.prototype.inverse = function() { return this.invert(); }; // deprecated since 0.4.3 Matrix4.prototype.getInverse = function(m) { return this.copy(m).invert(); }; // deprecated since 0.4.3 Matrix4.prototype.transform = function(position, scale, quaternion) { return this.compose(position, quaternion, scale); }; // deprecated since 0.4.3 Matrix3.prototype.inverse = function() { return this.invert(); }; // deprecated since 0.4.3 Matrix3.prototype.getInverse = function(m) { return this.copy(m).invert(); }; // deprecated since 0.4.3 Vector3.prototype.subtract = function(a, target = new Vector3()) { return target.set(this.x - a.x, this.y - a.y, this.z - a.z); }; // The old version of Query API has been deprecated since 0.4.4 export const QUERY_TYPE = { ANY_SAMPLES_PASSED: 7000, ANY_SAMPLES_PASSED_CONSERVATIVE: 7001, TIME_ELAPSED: 7002 }; let _queryId = 0; export class Query extends EventDispatcher { constructor() { super(); this.id = _queryId++; } dispose() { this.dispatchEvent({ type: 'dispose' }); } } WebGLRenderer.prototype.beginQuery = function(query, target) { this._queries.begin(query, target); }; WebGLRenderer.prototype.endQuery = function(query) { this._queries.end(query); }; WebGLRenderer.prototype.queryCounter = function(query) { this._queries.counter(query); }; WebGLRenderer.prototype.isTimerQueryDisjoint = function(query) { return this._queries.isTimerDisjoint(query); }; WebGLRenderer.prototype.isQueryResultAvailable = function(query) { return this._queries.isResultAvailable(query); }; WebGLRenderer.prototype.getQueryResult = function(query) { return this._queries.getResult(query); }; Object.defineProperties(WebGLRenderer.prototype, { _queries: { configurable: true, get: function() { if (this.__queries === undefined) { this.__queries = new WebGLQueries(`_gl${this.id}`, this.context, this.capabilities); } return this.__queries; } } }); export class WebGLQueries extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; const timerQuery = capabilities.timerQuery; const that = this; const onQueryDispose = event => { const query = event.target; const queryProperties = that.get(query); query.removeEventListener('dispose', onQueryDispose); if (queryProperties._webglQuery) { if (capabilities.version > 1) { gl.deleteQuery(queryProperties._webglQuery); } else { timerQuery.deleteQueryEXT(queryProperties._webglQuery); } } that.delete(query); }; this._onQueryDispose = onQueryDispose; this._typeToGL = { [QUERY_TYPE.ANY_SAMPLES_PASSED]: 0x8C2F, [QUERY_TYPE.ANY_SAMPLES_PASSED_CONSERVATIVE]: 0x8D6A, [QUERY_TYPE.TIME_ELAPSED]: 0x88BF }; } _get(query) { const capabilities = this._capabilities; const queryProperties = this.get(query); if (queryProperties._webglQuery === undefined) { query.addEventListener('dispose', this._onQueryDispose); queryProperties._webglQuery = capabilities.version > 1 ? this._gl.createQuery() : capabilities.timerQuery.createQueryEXT(); queryProperties._target = null; queryProperties._result = null; } return queryProperties; } begin(query, target) { const capabilities = this._capabilities; const typeToGL = this._typeToGL; const queryProperties = this._get(query); if (capabilities.version > 1) { this._gl.beginQuery(typeToGL[target], queryProperties._webglQuery); } else { capabilities.timerQuery.beginQueryEXT(typeToGL[target], queryProperties._webglQuery); } queryProperties._target = target; queryProperties._result = null; // clear the last result. } end(query) { const capabilities = this._capabilities; const typeToGL = this._typeToGL; const queryProperties = this._get(query); if (capabilities.version > 1) { this._gl.endQuery(typeToGL[queryProperties._target]); } else { capabilities.timerQuery.endQueryEXT(typeToGL[queryProperties._target]); } } counter(query) { const timerQuery = this._capabilities.timerQuery; const queryProperties = this._get(query); timerQuery.queryCounterEXT(queryProperties._webglQuery, timerQuery.TIMESTAMP_EXT); queryProperties._target = timerQuery.TIMESTAMP_EXT; queryProperties._result = null; // clear the last result. } isResultAvailable(query) { const gl = this._gl; const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const queryProperties = this._get(query); let available; if (capabilities.version > 1) { available = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT_AVAILABLE); } else { available = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_AVAILABLE); } return available; } isTimerDisjoint() { return this._gl.getParameter(this._capabilities.timerQuery.GPU_DISJOINT_EXT); } getResult(query) { const gl = this._gl; const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const queryProperties = this._get(query); if (queryProperties._result === null) { if (capabilities.version > 1) { queryProperties._result = gl.getQueryParameter(queryProperties._webglQuery, gl.QUERY_RESULT); } else { queryProperties._result = timerQuery.getQueryObjectEXT(queryProperties._webglQuery, timerQuery.QUERY_RESULT_EXT); } } return queryProperties._result; } } // deprecated since 0.5.0 WebGLRenderer.prototype.clear = function(color, depth, stencil) { const gl = this.context; let bits = 0; if (color === undefined || color) bits |= gl.COLOR_BUFFER_BIT; if (depth === undefined || depth) bits |= gl.DEPTH_BUFFER_BIT; if (stencil === undefined || stencil) bits |= gl.STENCIL_BUFFER_BIT; if (bits > 0) { // Prevent warning when bits is equal to zero gl.clear(bits); } }; // deprecated since 0.5.0 WebGLRenderer.prototype.setClearColor = function(r, g, b, a, premultipliedAlpha) { this._state.colorBuffer.setClear(r, g, b, a, premultipliedAlpha); }; // deprecated since 0.5.0 WebGLRenderer.prototype.getClearColor = function() { return this._state.colorBuffer.getClear(); }; // deprecated since 0.5.0 WebGLRenderer.prototype.setRenderTarget = function(renderTarget) { this._renderTargets.setRenderTarget(renderTarget); }; // deprecated since 0.5.0 WebGLRenderer.prototype.getRenderTarget = function() { return this._state.currentRenderTarget; }; // deprecated since 0.5.0 WebGLRenderer.prototype.setOcclusionQuerySet = function(querySet) { this._currentOcclusionQuerySet = querySet; }; // deprecated since 0.5.0 WebGLRenderer.prototype.setTimestampWrites = function(querySet, beginIndex = 0, endIndex = 1) { this._currentTimestampWrites.querySet = querySet; this._currentTimestampWrites.beginningOfPassWriteIndex = beginIndex; this._currentTimestampWrites.endOfPassWriteIndex = endIndex; }; // deprecated since 0.5.0 WebGLRenderer.prototype.updateRenderTargetMipmap = function(renderTarget) { if (renderTarget.texture) { this.generateMipmaps(renderTarget.texture); } }; Object.defineProperties(OffscreenRenderTarget.prototype, { // deprecated since 0.5.0 depth: { configurable: true, get: function() { console.warn('OffscreenRenderTarget: .depth property is deprecated.'); return 1; } } }); // deprecated since 0.5.0 export class RenderTarget2D extends OffscreenRenderTarget { constructor(width, height) { super(width, height); this.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0); this.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); } } RenderTarget2D.prototype.isRenderTarget2D = true; // deprecated since 0.5.0 export class RenderTargetCube extends OffscreenRenderTarget { constructor(width, height) { super(width, height); this.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0); this.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); } } RenderTargetCube.prototype.isRenderTargetCube = true; // deprecated since 0.5.0 export class RenderTarget3D extends OffscreenRenderTarget { constructor(width, height, depth) { super(width, height); const texture = new Texture3D(); texture.resizeAsAttachment(width, height, depth); this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } } RenderTarget3D.prototype.isRenderTarget3D = true; // deprecated since 0.5.0 export class RenderTarget2DArray extends OffscreenRenderTarget { constructor(width, height, depth) { super(width, height); const texture = new Texture2DArray(); texture.resizeAsAttachment(width, height, depth); this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } } RenderTarget2DArray.prototype.isRenderTarget2DArray = true; // deprecated since 0.5.0 ScreenRenderTarget.prototype.isRenderTargetBack = true; export { ScreenRenderTarget as RenderTargetBack }; ================================================ FILE: src/loaders/FileLoader.js ================================================ import { Loader } from './Loader.js'; /** * A low level class for loading resources with the Fetch API, used internally by * most loaders. It can also be used directly to load any file type that does * not have a loader. * ```js * const loader = new FileLoader(); * const data = await loader.loadAsync('example.txt'); * ``` * @extends Loader */ class FileLoader extends Loader { /** * Constructs a new file loader. * @param {LoadingManager} [manager] - The loading manager. */ constructor(manager) { super(manager); /** * The expected response type. See {@link FileLoader.setResponseType}. * @type {'arraybuffer'|'blob'|'document'|'json'|''} * @default '' */ this.responseType = ''; /** * The expected mimeType. See {@link FileLoader.setMimeType}. * @type {string} * @default '' */ this.mimeType = ''; } /** * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback. * @param {string} url — The path/URL of the file to be loaded. This can also be a data URI. * @param {Function} [onLoad] — Executed when the loading process has been finished. The argument is the loaded data. * @param {onProgressCallback} [onProgress] — Executed while the loading is in progress. * @param {onErrorCallback} [onError] — Executed when errors occur. */ load(url, onLoad, onProgress, onError) { if (url === undefined) url = ''; if (this.path != undefined) url = this.path + url; url = this.manager.resolveURL(url); // create request const req = new Request(url, { headers: new Headers(this.requestHeader), credentials: this.withCredentials ? 'include' : 'same-origin' // An abort controller could be added within a future PR }); // record states ( avoid data race ) const mimeType = this.mimeType; const responseType = this.responseType; // start the fetch fetch(req) .then(response => { if (response.status === 200 || response.status === 0) { // Some browsers return HTTP Status 0 when using non-http protocol // e.g. 'file://' or 'data://'. Handle as success. if (response.status === 0) { console.warn('FileLoader: HTTP Status 0 received.'); } // Workaround: Checking if response.body === undefined for Alipay browser #23548 if (typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined) { return response; } const reader = response.body.getReader(); // Nginx needs X-File-Size check // https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content const contentLength = response.headers.get('X-File-Size') || response.headers.get('Content-Length'); const total = contentLength ? parseInt(contentLength) : 0; const lengthComputable = total !== 0; let loaded = 0; // periodically read data into the new stream tracking while download progress const stream = new ReadableStream({ start(controller) { readData(); function readData() { reader.read().then(({ done, value }) => { if (done) { controller.close(); } else { loaded += value.byteLength; const event = new ProgressEvent('progress', { lengthComputable, loaded, total }); if (onProgress) onProgress(event); controller.enqueue(value); readData(); } }, error => { controller.error(error); }); } } }); return new Response(stream); } else { throw new HttpError(`fetch for "${response.url}" responded with ${response.status}: ${response.statusText}`, response); } }) .then(response => { switch (responseType) { case 'arraybuffer': return response.arrayBuffer(); case 'blob': return response.blob(); case 'document': return response.text() .then(text => { const parser = new DOMParser(); return parser.parseFromString(text, mimeType); }); case 'json': return response.json(); default: if (mimeType === '') { return response.text(); } else { // sniff encoding const re = /charset="?([^;"\s]*)"?/i; const exec = re.exec(mimeType); const label = exec && exec[1] ? exec[1].toLowerCase() : undefined; const decoder = new TextDecoder(label); return response.arrayBuffer().then(ab => decoder.decode(ab)); } } }) .then(data => { if (onLoad) onLoad(data); }) .catch(err => { onError && onError(err); this.manager.itemError(url); }) .finally(() => { this.manager.itemEnd(url); }); this.manager.itemStart(url); } /** * Sets the expected response type. * @param {'arraybuffer'|'blob'|'document'|'json'|''} value - The response type. * @returns {FileLoader} A reference to this file loader. */ setResponseType(value) { this.responseType = value; return this; } /** * Sets the expected mime type of the loaded file. * @param {string} value - The mime type. * @returns {FileLoader} A reference to this file loader. */ setMimeType(value) { this.mimeType = value; return this; } } class HttpError extends Error { constructor(message, response) { super(message); this.response = response; } } export { FileLoader }; ================================================ FILE: src/loaders/ImageLoader.js ================================================ import { Loader } from './Loader.js'; /** * A loader for loading images. The class loads images with the HTML `Image` API. * Please note that 'ImageLoader' not support progress events. * ```js * const loader = new ImageLoader(); * const image = await loader.loadAsync('image.png'); * ``` * @extends Loader */ class ImageLoader extends Loader { /** * Constructs a new image loader. * @param {LoadingManager} [manager] - The loading manager. */ constructor(manager) { super(manager); } /** * Starts loading from the given URL and passes the loaded image * to the `onLoad()` callback. The method also returns a new `Image` object which can * directly be used for texture creation. If you do it this way, the texture * may pop up in your scene once the respective loading process is finished. * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. * @param {Function} [onLoad] - Executed when the loading process has been finished. The argument is an `HTMLImageElement`. * @param {onProgressCallback} [onProgress] - Unsupported in this loader. * @param {onErrorCallback} [onError] - Executed when errors occur. * @returns {HTMLImageElement} The image. */ load(url, onLoad, onProgress, onError) { if (url === undefined) url = ''; if (this.path !== undefined) url = this.path + url; url = this.manager.resolveURL(url); const scope = this; const image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img'); function onImageLoad() { removeEventListeners(); if (onLoad) onLoad(this); scope.manager.itemEnd(url); } function onImageError(event) { removeEventListeners(); if (onError) onError(event); scope.manager.itemError(url); scope.manager.itemEnd(url); } function removeEventListeners() { image.removeEventListener('load', onImageLoad, false); image.removeEventListener('error', onImageError, false); } image.addEventListener('load', onImageLoad, false); image.addEventListener('error', onImageError, false); if (url.slice(0, 5) !== 'data:') { if (this.crossOrigin !== undefined) image.crossOrigin = this.crossOrigin; } scope.manager.itemStart(url); image.src = url; return image; } } export { ImageLoader }; ================================================ FILE: src/loaders/Loader.js ================================================ import { DefaultLoadingManager } from './LoadingManager.js'; /** * Abstract base class for loaders. * @abstract */ class Loader { /** * Constructs a new Loader. * @param {LoadingManager} [manager=DefaultLoadingManager] - The loading manager. */ constructor(manager) { /** * The loading manager. * @type {LoadingManager} * @default DefaultLoadingManager */ this.manager = (manager !== undefined) ? manager : DefaultLoadingManager; /** * The crossOrigin string to implement CORS for loading the url from a * different domain that allows CORS. * @type {string} * @default 'anonymous' */ this.crossOrigin = 'anonymous'; /** * Whether the XMLHttpRequest uses credentials. * @type {boolean} * @default false */ this.withCredentials = false; /** * The base path from which the asset will be loaded. * @type {string} * @default '' */ this.path = ''; /** * The [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header} * used in HTTP request. * @type {object} * @default {} */ this.requestHeader = {}; } /** * This method needs to be implement by all concrete loaders. * It holds the logic for loading the asset from the backend. * @param {string} url - The path/URL of the file to be loaded. * @param {Function} onLoad - Executed when the loading process has been finished. * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress. * @param {onErrorCallback} [onError] - Executed when errors occur. */ load(url, onLoad, onProgress, onError) {} /** * A async version of {@link Loader#load}. * @param {string} url - The path/URL of the file to be loaded. * @param {Function} [onProgress] - Executed while the loading is in progress. * @returns {Promise} A Promise that resolves when the asset has been loaded. */ loadAsync(url, onProgress) { const scope = this; return new Promise(function(resolve, reject) { scope.load(url, resolve, onProgress, reject); }); } /** * Sets the `crossOrigin` String to implement CORS for loading the URL * from a different domain that allows CORS. * @param {string} crossOrigin - The `crossOrigin` value. * @returns {Loader} A reference to this instance. */ setCrossOrigin(crossOrigin) { this.crossOrigin = crossOrigin; return this; } /** * Whether the XMLHttpRequest uses credentials such as cookies, authorization * headers or TLS client certificates, see [XMLHttpRequest.withCredentials]{@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials}. * Note: This setting has no effect if you are loading files locally or from the same domain. * @param {boolean} value - The `withCredentials` value. * @returns {Loader} A reference to this instance. */ setWithCredentials(value) { this.withCredentials = value; return this; } /** * Sets the base path for the asset. * @param {string} path - The base path. * @returns {Loader} A reference to this instance. */ setPath(path) { this.path = path; return this; } /** * Sets the given request header. * @param {object} requestHeader - A [request header]{@link https://developer.mozilla.org/en-US/docs/Glossary/Request_header} * for configuring the HTTP request. * @returns {Loader} A reference to this instance. */ setRequestHeader(requestHeader) { this.requestHeader = requestHeader; return this; } } /** * Callback for onProgress in loaders. * @callback onProgressCallback * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status. */ /** * Callback for onError in loaders. * @callback onErrorCallback * @param {Error} error - The error which occurred during the loading process. */ export { Loader }; ================================================ FILE: src/loaders/LoadingManager.js ================================================ /** * Handles and keeps track of loaded and pending data. A default global * instance of this class is created and used by loaders if not supplied * manually. * In general that should be sufficient, however there are times when it can * be useful to have separate loaders - for example if you want to show * separate loading bars for objects and textures. * ```js * const manager = new LoadingManager( * () => console.log('All items loaded!'), * (url, itemsLoaded, itemsTotal) => { * console.log(`Loaded ${itemsLoaded} of ${itemsTotal} items`); * }, * url => console.error(`Error loading ${url}`) * ); * ``` */ class LoadingManager { /** * Constructs a new loading manager. * @param {Function} [onLoad] - Executes when all items have been loaded. * @param {Function} [onProgress] - Executes when single items have been loaded. * @param {Function} [onError] - Executes when an error occurs. */ constructor(onLoad, onProgress, onError) { this.isLoading = false; this.itemsLoaded = 0; this.itemsTotal = 0; this.urlModifier = undefined; /** * Executes when an item starts loading. * @type {Function|undefined} * @default undefined */ this.onStart = undefined; /** * Executes when all items have been loaded. * @type {Function|undefined} * @default undefined */ this.onLoad = onLoad; /** * Executes when single items have been loaded. * @type {Function|undefined} * @default undefined */ this.onProgress = onProgress; /** * Executes when an error occurs. * @type {Function|undefined} * @default undefined */ this.onError = onError; } /** * This should be called by any loader using the manager when the loader * starts loading an item. * @param {string} url - The URL to load. */ itemStart(url) { this.itemsTotal++; if (this.isLoading === false) { if (this.onStart !== undefined) { this.onStart(url, this.itemsLoaded, this.itemsTotal); } } this.isLoading = true; } /** * This should be called by any loader using the manager when the loader * ended loading an item. * @param {string} url - The URL of the loaded item. */ itemEnd(url) { this.itemsLoaded++; if (this.onProgress !== undefined) { this.onProgress(url, this.itemsLoaded, this.itemsTotal); } if (this.itemsLoaded === this.itemsTotal) { this.isLoading = false; if (this.onLoad !== undefined) { this.onLoad(); } } } /** * This should be called by any loader using the manager when the loader * encounters an error when loading an item. * @param {string} url - The URL of the item that produces an error. */ itemError(url) { if (this.onError !== undefined) { this.onError(url); } } /** * Given a URL, uses the URL modifier callback (if any) and returns a * resolved URL. If no URL modifier is set, returns the original URL. * @param {string} url - The URL to load. * @returns {string} The resolved URL. */ resolveURL(url) { if (this.urlModifier) { return this.urlModifier(url); } return url; } /** * If provided, the callback will be passed each resource URL before a * request is sent. The callback may return the original URL, or a new URL to * override loading behavior. This behavior can be used to load assets from * .ZIP files, drag-and-drop APIs, and Data URIs. * @param {Function} transform - URL modifier callback. Called with an URL and must return a resolved URL. * @returns {LoadingManager} A reference to this loading manager. * @example * const blobs = { 'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3 }; * * const manager = new LoadingManager(); * * // Initialize loading manager with URL callback. * const objectURLs = []; * manager.setURLModifier(url => { * url = URL.createObjectURL(blobs[url]); * objectURLs.push(url); * return url; * }); * * // Load as usual, then revoke the blob URLs. * const loader = new GLTFLoader(manager); * loader.load('fish.gltf', gltf => { * scene.add(gltf.scene); * objectURLs.forEach(url => URL.revokeObjectURL(url)); * }); */ setURLModifier(transform) { this.urlModifier = transform; return this; } } /** * The global default loading manager. * @type {LoadingManager} */ const DefaultLoadingManager = new LoadingManager(); export { DefaultLoadingManager, LoadingManager }; ================================================ FILE: src/main.js ================================================ export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js'; export { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js'; export { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js'; export { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js'; export { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js'; export { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js'; export { AnimationAction } from './animation/AnimationAction.js'; export { AnimationMixer } from './animation/AnimationMixer.js'; export { KeyframeClip } from './animation/KeyframeClip.js'; export * from './animation/KeyframeInterpolants.js'; export { KeyframeTrack } from './animation/KeyframeTrack.js'; export { PropertyBindingMixer } from './animation/PropertyBindingMixer.js'; export { FileLoader } from './loaders/FileLoader.js'; export { ImageLoader } from './loaders/ImageLoader.js'; export { Loader } from './loaders/Loader.js'; export { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js'; export { Box2 } from './math/Box2.js'; export { Box3 } from './math/Box3.js'; export { Color3 } from './math/Color3.js'; export { Color4 } from './math/Color4.js'; export { Euler } from './math/Euler.js'; export { Frustum } from './math/Frustum.js'; export { MathUtils } from './math/MathUtils.js'; export { Matrix3 } from './math/Matrix3.js'; export { Matrix4 } from './math/Matrix4.js'; export { Plane } from './math/Plane.js'; export { Quaternion } from './math/Quaternion.js'; export { Ray } from './math/Ray.js'; export { Sphere } from './math/Sphere.js'; export { Spherical } from './math/Spherical.js'; export { SphericalHarmonics3 } from './math/SphericalHarmonics3.js'; export { Triangle } from './math/Triangle.js'; export { Vector2 } from './math/Vector2.js'; export { Vector3 } from './math/Vector3.js'; export { Vector4 } from './math/Vector4.js'; export { ShaderPostPass } from './render/passes/ShaderPostPass.js'; export { ShadowMapPass } from './render/passes/ShadowMapPass.js'; export { PropertyMap } from './render/PropertyMap.js'; export { RenderInfo } from './render/RenderInfo.js'; export { RenderQueue } from './render/RenderQueue.js'; export { RenderQueueLayer } from './render/RenderQueueLayer.js'; export { RenderStates } from './render/RenderStates.js'; export { SceneData } from './render/SceneData.js'; export { ThinRenderer } from './render/ThinRenderer.js'; export { Fog } from './resources/fogs/Fog.js'; export { FogExp2 } from './resources/fogs/FogExp2.js'; export { Attribute } from './resources/geometries/Attribute.js'; export { BoxGeometry } from './resources/geometries/BoxGeometry.js'; export { Buffer } from './resources/geometries/Buffer.js'; export { CylinderGeometry } from './resources/geometries/CylinderGeometry.js'; export { Geometry } from './resources/geometries/Geometry.js'; export { PlaneGeometry } from './resources/geometries/PlaneGeometry.js'; export { SphereGeometry } from './resources/geometries/SphereGeometry.js'; export { TorusKnotGeometry } from './resources/geometries/TorusKnotGeometry.js'; export { BasicMaterial } from './resources/materials/BasicMaterial.js'; export { DepthMaterial } from './resources/materials/DepthMaterial.js'; export { DistanceMaterial } from './resources/materials/DistanceMaterial.js'; export { LambertMaterial } from './resources/materials/LambertMaterial.js'; export { LineMaterial } from './resources/materials/LineMaterial.js'; export { Material } from './resources/materials/Material.js'; export { PBR2Material } from './resources/materials/PBR2Material.js'; export { PBRMaterial } from './resources/materials/PBRMaterial.js'; export { PhongMaterial } from './resources/materials/PhongMaterial.js'; export { PointsMaterial } from './resources/materials/PointsMaterial.js'; export { ShaderMaterial } from './resources/materials/ShaderMaterial.js'; export { CameraProjection } from './resources/projections/CameraProjection.js'; export { OrthographicProjection } from './resources/projections/OrthographicProjection.js'; export { PerspectiveProjection } from './resources/projections/PerspectiveProjection.js'; export { OffscreenRenderTarget } from './resources/targets/OffscreenRenderTarget.js'; export { ScreenRenderTarget } from './resources/targets/ScreenRenderTarget.js'; export { RenderTargetBase } from './resources/targets/RenderTargetBase.js'; export { Texture2D } from './resources/textures/Texture2D.js'; export { Texture2DArray } from './resources/textures/Texture2DArray.js'; export { Texture3D } from './resources/textures/Texture3D.js'; export { TextureBase } from './resources/textures/TextureBase.js'; export { TextureCube } from './resources/textures/TextureCube.js'; export { QuerySet } from './resources/QuerySet.js'; export { Raycaster } from './resources/Raycaster.js'; export { RenderBuffer } from './resources/RenderBuffer.js'; export { Skeleton } from './resources/Skeleton.js'; export { TransformUV } from './resources/TransformUV.js'; export { AmbientLight } from './scenes/lights/AmbientLight.js'; export { DirectionalLight } from './scenes/lights/DirectionalLight.js'; export { DirectionalLightShadow } from './scenes/lights/DirectionalLightShadow.js'; export { HemisphereLight } from './scenes/lights/HemisphereLight.js'; export { LightShadow } from './scenes/lights/LightShadow.js'; export { PointLight } from './scenes/lights/PointLight.js'; export { PointLightShadow } from './scenes/lights/PointLightShadow.js'; export { RectAreaLight } from './scenes/lights/RectAreaLight.js'; export { SphericalHarmonicsLight } from './scenes/lights/SphericalHarmonicsLight.js'; export { SpotLight } from './scenes/lights/SpotLight.js'; export { SpotLightShadow } from './scenes/lights/SpotLightShadow.js'; export { Bone } from './scenes/Bone.js'; export { Camera } from './scenes/Camera.js'; export { Light } from './scenes/Light.js'; export { Mesh } from './scenes/Mesh.js'; export { Object3D } from './scenes/Object3D.js'; export { Scene } from './scenes/Scene.js'; export { SkinnedMesh } from './scenes/SkinnedMesh.js'; export { ShaderChunk } from './shaders/ShaderChunk.js'; export { ShaderLib } from './shaders/ShaderLib.js'; export { WebGLAttribute } from './webgl/WebGLAttribute.js'; export { WebGLCapabilities } from './webgl/WebGLCapabilities.js'; export { WebGLGeometries } from './webgl/WebGLGeometries.js'; export { WebGLProgram } from './webgl/WebGLProgram.js'; export { WebGLPrograms } from './webgl/WebGLPrograms.js'; export { WebGLQuerySets } from './webgl/WebGLQuerySets.js'; export { WebGLRenderer } from './webgl/WebGLRenderer.js'; export { WebGLState } from './webgl/WebGLState.js'; export { WebGLTextures } from './webgl/WebGLTextures.js'; export { WebGLRenderBuffers } from './webgl/WebGLRenderBuffers.js'; export { WebGLUniforms } from './webgl/WebGLUniforms.js'; export * from './base.js'; export * from './const.js'; export { EventDispatcher } from './EventDispatcher.js'; export * from './legacy.js'; ================================================ FILE: src/math/Box2.js ================================================ import { Vector2 } from './Vector2.js'; /** * Represents an axis-aligned bounding box (AABB) in 2D space. */ class Box2 { /** * @param {Vector2} min - (optional) Vector2 representing the lower (x, y) boundary of the box. * Default is ( + Infinity, + Infinity ). * @param {Vector2} max - (optional) Vector2 representing the upper (x, y) boundary of the box. * Default is ( - Infinity, - Infinity ). */ constructor(min, max) { this.min = (min !== undefined) ? min : new Vector2(+Infinity, +Infinity); this.max = (max !== undefined) ? max : new Vector2(-Infinity, -Infinity); } /** * @param {number} x1 * @param {number} y1 * @param {number} x2 * @param {number} y2 */ set(x1, y1, x2, y2) { this.min.set(x1, y1); this.max.set(x2, y2); } /** * Returns a new Box2 with the same min and max as this one. * @returns {Box2} */ clone() { return new Box2().copy(this); } /** * Copies the min and max from box to this box. * @param {Box2} box * @returns {Box2} */ copy(box) { this.min.copy(box.min); this.max.copy(box.max); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Box2.prototype.isBox2 = true; export { Box2 }; ================================================ FILE: src/math/Box3.js ================================================ import { Vector3 } from './Vector3.js'; import { MathUtils } from './MathUtils.js'; /** * Represents an axis-aligned bounding box (AABB) in 3D space. */ class Box3 { /** * @param {Vector3} min - (optional) Vector3 representing the lower (x, y, z) boundary of the box. * Default is ( + Infinity, + Infinity, + Infinity ). * @param {Vector3} max - (optional) Vector3 representing the upper (x, y, z) boundary of the box. * Default is ( - Infinity, - Infinity, - Infinity ). */ constructor(min, max) { this.min = (min !== undefined) ? min : new Vector3(+Infinity, +Infinity, +Infinity); this.max = (max !== undefined) ? max : new Vector3(-Infinity, -Infinity, -Infinity); } /** * Sets the lower and upper (x, y, z) boundaries of this box. * @param {Vector3} min - Vector3 representing the lower (x, y, z) boundary of the box. * @param {Vector3} max - Vector3 representing the lower upper (x, y, z) boundary of the box. */ set(min, max) { this.min.copy(min); this.max.copy(max); } /** * Sets the upper and lower bounds of this box to include all of the points in points. * @param {Vector3[]} points - Array of Vector3s that the resulting box will contain. * @returns {Box3} */ setFromPoints(points) { this.makeEmpty(); for (let i = 0, il = points.length; i < il; i++) { this.expandByPoint(points[i]); } return this; } /** * Makes this box empty. * @returns {Box3} */ makeEmpty() { this.min.x = this.min.y = this.min.z = +Infinity; this.max.x = this.max.y = this.max.z = -Infinity; return this; } /** * Expands the boundaries of this box to include point. * @param {Vector3} point - Vector3 that should be included in the box. * @returns {Box3} */ expandByPoint(point) { this.min.min(point); this.max.max(point); return this; } /** * Expands each dimension of the box by scalar. If negative, the dimensions of the box will be contracted. * @param {number} scalar - Distance to expand the box by. * @returns {Box3} */ expandByScalar(scalar) { this.min.addScalar(-scalar); this.max.addScalar(scalar); return this; } /** * Expands the boundaries of this box to include box3. * @param {Box3} box3 - Box that will be unioned with this box. * @returns {Box3} */ expandByBox3(box3) { this.min.min(box3.min); this.max.max(box3.max); return this; } /** * Sets the upper and lower bounds of this box to include all of the data in array. * @param {number[]} array - An array of position data that the resulting box will envelop. * @param {number} [gap=3] - The number of elements between the start of each position in the array. * @param {number} [offset=0] - The offset in each gap where the position data starts. * @param {boolean} [denormalize=false] - Whether to denormalize the values in the array. * @returns {Box3} A reference to this box. */ setFromArray(array, gap = 3, offset = 0, denormalize = false) { let minX = +Infinity; let minY = +Infinity; let minZ = +Infinity; let maxX = -Infinity; let maxY = -Infinity; let maxZ = -Infinity; for (let i = 0, l = array.length; i < l; i += gap) { let x = array[i + offset]; let y = array[i + offset + 1]; let z = array[i + offset + 2]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); } if (x < minX) minX = x; if (y < minY) minY = y; if (z < minZ) minZ = z; if (x > maxX) maxX = x; if (y > maxY) maxY = y; if (z > maxZ) maxZ = z; } this.min.set(minX, minY, minZ); this.max.set(maxX, maxY, maxZ); return this; } /** * Clamps the point within the bounds of this box. * @param {Vector3} point - Vector3 to clamp. * @param {Vector3} target - Vector3 to store the result in. * @returns {Vector3} */ clampPoint(point, target) { return target.copy(point).min(this.max).max(this.min); } /** * Returns the distance from any edge of this box to the specified point. * If the point lies inside of this box, the distance will be 0. * @param {Vector3} point - Vector3 to measure the distance to. * @returns {number} */ distanceToPoint(point) { return this.clampPoint(point, _vec3_1).distanceTo(point); } /** * Returns aMinimum Bounding Sphere for the box. * @param {Sphere} target — the result will be copied into this Sphere. * @returns {Sphere} */ getBoundingSphere(target) { if (this.isEmpty()) { target.makeEmpty(); } else { this.getCenter(target.center); target.radius = this.getSize(_vec3_1).getLength() * 0.5; } return target; } /** * Returns true if this box includes zero points within its bounds. * @returns {boolean} */ isEmpty() { // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes return (this.max.x < this.min.x) || (this.max.y < this.min.y) || (this.max.z < this.min.z); } /** * Returns true if this box and box share the same lower and upper bounds. * @param {Box3} box - Box to compare with this one. * @returns {boolean} */ equals(box) { return box.min.equals(this.min) && box.max.equals(this.max); } /** * Returns the center point of the box as a Vector3. * @param {Vector3} target - the result will be copied into this Vector3. * @returns {Vector3} */ getCenter(target = new Vector3()) { return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); } /** * Returns the width, height and depth of this box. * @param {Vector3} target - the result will be copied into this Vector3. * @returns {Vector3} */ getSize(target = new Vector3()) { return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min); } /** * Get the 8 corner points of the bounding box, the order is as follows: * 7-------3 * /| /| * 4-------0 | * | | | | * | 6-----|-2 * |/ |/ * 5-------1 * @param {Vector3[]} points - The array to store the points. * @returns {Vector3[]} The array of points. */ getPoints(points) { const minX = this.min.x, minY = this.min.y, minZ = this.min.z; const maxX = this.max.x, maxY = this.max.y, maxZ = this.max.z; points[0].set(maxX, maxY, maxZ); points[1].set(maxX, minY, maxZ); points[2].set(maxX, minY, minZ); points[3].set(maxX, maxY, minZ); points[4].set(minX, maxY, maxZ); points[5].set(minX, minY, maxZ); points[6].set(minX, minY, minZ); points[7].set(minX, maxY, minZ); return points; } /** * Computes the union of this box and box, * setting the upper bound of this box to the greater of the two boxes' upper bounds and the lower bound of this box to the lesser of the two boxes' lower bounds. * @param {Box3} box - Box that will be unioned with this box. * @returns {Box3} */ union(box) { this.min.min(box.min); this.max.max(box.max); return this; } /** * Transforms this Box3 with the supplied matrix. * @param {Matrix4} matrix - The Matrix4 to apply * @returns {Box3} */ applyMatrix4(matrix) { // transform of empty box is an empty box. if (this.isEmpty()) return this; // NOTE: I am using a binary pattern to specify all 2^3 combinations below _points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); // 000 _points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); // 001 _points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); // 010 _points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); // 011 _points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); // 100 _points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); // 101 _points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); // 110 _points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); // 111 this.setFromPoints(_points); return this; } /** * Returns true if the specified point lies within or on the boundaries of this box. * @param {Vector3} point - Vector3 to check for inclusion. * @returns {boolean} */ containsPoint(point) { return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z ? false : true; } /** * Determines whether or not this box intersects triangle. * @param {Triangle} triangle - Triangle to check for intersection against. * @returns {boolean} */ intersectsTriangle(triangle) { if (this.isEmpty()) { return false; } // compute box center and extents this.getCenter(_center); _extents.subVectors(this.max, _center); // translate triangle to aabb origin _v0.subVectors(triangle.a, _center); _v1.subVectors(triangle.b, _center); _v2.subVectors(triangle.c, _center); // compute edge vectors for triangle _f0.subVectors(_v1, _v0); _f1.subVectors(_v2, _v1); _f2.subVectors(_v0, _v2); // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) let axes = [ 0, -_f0.z, _f0.y, 0, -_f1.z, _f1.y, 0, -_f2.z, _f2.y, _f0.z, 0, -_f0.x, _f1.z, 0, -_f1.x, _f2.z, 0, -_f2.x, -_f0.y, _f0.x, 0, -_f1.y, _f1.x, 0, -_f2.y, _f2.x, 0 ]; if (!satForAxes(axes, _v0, _v1, _v2, _extents)) { return false; } // test 3 face normals from the aabb axes = [1, 0, 0, 0, 1, 0, 0, 0, 1]; if (!satForAxes(axes, _v0, _v1, _v2, _extents)) { return false; } // finally testing the face normal of the triangle // use already existing triangle edge vectors here _triangleNormal.crossVectors(_f0, _f1); axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z]; return satForAxes(axes, _v0, _v1, _v2, _extents); } /** * Returns a new Box3 with the same min and max as this one. * @returns {Box3} */ clone() { return new Box3().copy(this); } /** * Copies the min and max from box to this box. * @param {Box3} box - Box3 to copy. * @returns {Box3} */ copy(box) { this.min.copy(box.min); this.max.copy(box.max); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Box3.prototype.isBox3 = true; const _points = [ new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3() ]; const _vec3_1 = new Vector3(); // triangle centered vertices const _v0 = new Vector3(); const _v1 = new Vector3(); const _v2 = new Vector3(); // triangle edge vectors const _f0 = new Vector3(); const _f1 = new Vector3(); const _f2 = new Vector3(); const _center = new Vector3(); const _extents = new Vector3(); const _triangleNormal = new Vector3(); const _testAxis = new Vector3(); function satForAxes(axes, v0, v1, v2, extents) { for (let i = 0, j = axes.length - 3; i <= j; i += 3) { _testAxis.fromArray(axes, i); // project the aabb onto the separating axis const r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z); // project all 3 vertices of the triangle onto the separating axis const p0 = v0.dot(_testAxis); const p1 = v1.dot(_testAxis); const p2 = v2.dot(_testAxis); // actual test, basically see if either of the most extreme of the triangle points intersects r if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) { // points of the projected triangle are outside the projected half-length of the aabb // the axis is separating and we can exit return false; } } return true; } export { Box3 }; ================================================ FILE: src/math/Color3.js ================================================ import { MathUtils } from './MathUtils.js'; /** * A Color3 instance is represented by RGB components. */ class Color3 { /** * Constructs a new three-component color. * @param {number} [r] - The red component of the color. If `g` and `b` are not provided, it can be a hexadecimal triplet. * @param {number} [g] - The green component. * @param {number} [b] - The blue component. */ constructor(r, g, b) { /** * The red component. * @type {number} * @default 0 */ this.r = 0; /** * The green component. * @type {number} * @default 0 */ this.g = 0; /** * The blue component. * @type {number} * @default 0 */ this.b = 0; if (g === undefined && b === undefined) { this.setHex(r); } else { this.setRGB(r, g, b); } } /** * Sets this color from a hexadecimal value. * @param {number} hex - The hexadecimal value. * @returns {Color3} A reference to this color. */ setHex(hex) { hex = Math.floor(hex); this.r = (hex >> 16 & 255) / 255; this.g = (hex >> 8 & 255) / 255; this.b = (hex & 255) / 255; return this; } /** * Sets this color from RGB values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @returns {Color3} A reference to this color. */ setRGB(r, g, b) { this.r = r; this.g = g; this.b = b; return this; } /** * Set this color from HSL values. * @param {number} h - Hue value between 0.0 and 1.0. * @param {number} s - Saturation value between 0.0 and 1.0. * @param {number} l - Lightness value between 0.0 and 1.0. * @returns {Color3} A reference to this color. */ setHSL(h, s, l) { // h,s,l ranges are in 0.0 - 1.0 h = MathUtils.euclideanModulo(h, 1); s = MathUtils.clamp(s, 0, 1); l = MathUtils.clamp(l, 0, 1); if (s === 0) { this.r = this.g = this.b = l; } else { const p = l <= 0.5 ? l * (1 + s) : l + s - (l * s); const q = (2 * l) - p; this.r = hue2rgb(q, p, h + 1 / 3); this.g = hue2rgb(q, p, h); this.b = hue2rgb(q, p, h - 1 / 3); } return this; } /** * Returns a new color with copied values from this instance. * @returns {Color3} A clone of this instance. */ clone() { return new this.constructor(this.r, this.g, this.b); } /** * Copies the values of the given color to this instance. * @param {Color3} color - The color to copy. * @returns {Color3} A reference to this color. */ copy(color) { this.r = color.r; this.g = color.g; this.b = color.b; return this; } /** * Converts this color from sRGB space to linear space. * @returns {Color3} A reference to this color. */ convertSRGBToLinear() { this.r = SRGBToLinear(this.r); this.g = SRGBToLinear(this.g); this.b = SRGBToLinear(this.b); return this; } /** * Converts this color from linear space to sRGB space. * @returns {Color3} A reference to this color. */ convertLinearToSRGB() { this.r = LinearToSRGB(this.r); this.g = LinearToSRGB(this.g); this.b = LinearToSRGB(this.b); return this; } /** * Returns the hexadecimal value of this color. * @returns {number} The hexadecimal value. */ getHex() { return MathUtils.clamp(this.r * 255, 0, 255) << 16 ^ MathUtils.clamp(this.g * 255, 0, 255) << 8 ^ MathUtils.clamp(this.b * 255, 0, 255) << 0; } /** * Linearly interpolates this color's RGB values toward the RGB values of the * given color. The alpha argument can be thought of as the ratio between * the two colors, where 0.0 is this color and 1.0 is the first argument. * @param {Color3} color - The color to converge on. * @param {number} alpha - The interpolation factor in the closed interval [0,1]. * @returns {Color3} A reference to this color. */ lerp(color, alpha) { return this.lerpColors(this, color, alpha); } /** * Linearly interpolates between the given colors and stores the result in this instance. * The alpha argument can be thought of as the ratio between the two colors, where 0.0 * is the first and 1.0 is the second color. * @param {Color3} color1 - The first color. * @param {Color3} color2 - The second color. * @param {number} alpha - The interpolation factor in the closed interval [0,1]. * @returns {Color3} A reference to this color. */ lerpColors(color1, color2, alpha) { this.r = MathUtils.lerp(color1.r, color2.r, alpha); this.g = MathUtils.lerp(color1.g, color2.g, alpha); this.b = MathUtils.lerp(color1.b, color2.b, alpha); return this; } /** * Sets this color's RGB components from the given array. * @param {number[]} array - An array holding the RGB values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Color3} A reference to this color. */ fromArray(array, offset = 0, denormalize = false) { let r = array[offset], g = array[offset + 1], b = array[offset + 2]; if (denormalize) { r = MathUtils.denormalize(r, array); g = MathUtils.denormalize(g, array); b = MathUtils.denormalize(b, array); } this.r = r; this.g = g; this.b = b; return this; } /** * Writes the RGB components of this color to the given array. If no array is provided, * the method returns a new instance. * @param {number[]} [array=[]] - The target array holding the color components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {number[]} The color components. */ toArray(array = [], offset = 0, normalize = false) { let r = this.r, g = this.g, b = this.b; if (normalize) { r = MathUtils.normalize(r, array); g = MathUtils.normalize(g, array); b = MathUtils.normalize(b, array); } array[offset] = r; array[offset + 1] = g; array[offset + 2] = b; return array; } * [Symbol.iterator]() { yield this.r; yield this.g; yield this.b; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Color3.prototype.isColor3 = true; function hue2rgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t); return p; } function SRGBToLinear(c) { return (c < 0.04045) ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4); } function LinearToSRGB(c) { return (c < 0.0031308) ? c * 12.92 : 1.055 * (Math.pow(c, 0.41666)) - 0.055; } export { Color3 }; ================================================ FILE: src/math/Color4.js ================================================ import { MathUtils } from './MathUtils.js'; /** * A Color4 instance is represented by RGBA components. */ class Color4 { /** * Constructs a new four-component color. * @param {number} [r=0] - The red value. * @param {number} [g=0] - The green value. * @param {number} [b=0] - The blue value. * @param {number} [a=1] - The alpha value. */ constructor(r = 0, g = 0, b = 0, a = 1) { /** * The red component. * @type {number} * @default 0 */ this.r = r; /** * The green component. * @type {number} * @default 0 */ this.g = g; /** * The blue component. * @type {number} * @default 0 */ this.b = b; /** * The alpha component. * @type {number} * @default 1 */ this.a = a; } /** * Sets this color from RGBA values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @param {number} a - Alpha channel value between 0.0 and 1.0. * @returns {Color4} A reference to this color. */ setRGBA(r, g, b, a) { this.r = r; this.g = g; this.b = b; this.a = a; return this; } /** * Returns a new color with copied values from this instance. * @returns {Color4} A clone of this instance. */ clone() { return new Color4(this.r, this.g, this.b, this.a); } /** * Copies the values of the given color to this instance. * @param {Color4} color - The color to copy. * @returns {Color4} A clone of this instance. */ copy(color) { this.r = color.r; this.g = color.g; this.b = color.b; this.a = color.a; return this; } /** * Sets this color's RGBA components from the given array. * @param {number[]} array - An array holding the RGBA values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Color4} A reference to this color. */ fromArray(array, offset = 0, denormalize = false) { let r = array[offset], g = array[offset + 1], b = array[offset + 2], a = array[offset + 3]; if (denormalize) { r = MathUtils.denormalize(r, array); g = MathUtils.denormalize(g, array); b = MathUtils.denormalize(b, array); a = MathUtils.denormalize(a, array); } this.r = r; this.g = g; this.b = b; this.a = a; return this; } /** * Writes the RGBA components of this color to the given array. If no array is provided, * the method returns a new instance. * @param {number[]} [array=[]] - The target array holding the color components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {number[]} The color components. */ toArray(array = [], offset = 0, normalize = false) { let r = this.r, g = this.g, b = this.b, a = this.a; if (normalize) { r = MathUtils.normalize(r, array); g = MathUtils.normalize(g, array); b = MathUtils.normalize(b, array); a = MathUtils.normalize(a, array); } array[offset] = r; array[offset + 1] = g; array[offset + 2] = b; array[offset + 3] = a; return array; } * [Symbol.iterator]() { yield this.r; yield this.g; yield this.b; yield this.a; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Color4.prototype.isColor4 = true; export { Color4 }; ================================================ FILE: src/math/Euler.js ================================================ import { Matrix4 } from './Matrix4.js'; import { MathUtils } from './MathUtils.js'; const _matrix = new Matrix4(); /** * Euler class. */ class Euler { /** * @param {number} [x=0] * @param {number} [y=0] * @param {number} [z=0] * @param {string} [order=Euler.DefaultOrder] */ constructor(x = 0, y = 0, z = 0, order = Euler.DefaultOrder) { this._x = x; this._y = y; this._z = z; this._order = order; } /** * @type {number} */ get x() { return this._x; } /** * @type {number} */ set x(value) { this._x = value; this.onChangeCallback(); } /** * @type {number} */ get y() { return this._y; } /** * @type {number} */ set y(value) { this._y = value; this.onChangeCallback(); } /** * @type {number} */ get z() { return this._z; } /** * @type {number} */ set z(value) { this._z = value; this.onChangeCallback(); } /** * @type {string} */ get order() { return this._order; } /** * @type {string} */ set order(value) { this._order = value; this.onChangeCallback(); } /** * Returns a new Euler with the same parameters as this one. * @returns {Euler} */ clone() { return new Euler(this._x, this._y, this._z, this._order); } /** * Copies value of euler to this euler. * @param {Euler} euler * @returns {Euler} */ copy(euler) { this._x = euler._x; this._y = euler._y; this._z = euler._z; this._order = euler._order; this.onChangeCallback(); return this; } /** * @param {number} x - the angle of the x axis in radians. * @param {number} y - the angle of the y axis in radians. * @param {number} z - the angle of the z axis in radians. * @param {string} order - (optional) a string representing the order that the rotations are applied. * @returns {Euler} */ set(x = 0, y = 0, z = 0, order = this._order) { this._x = x; this._y = y; this._z = z; this._order = order; this.onChangeCallback(); return this; } /** * Sets the angles of this euler transform from a pure rotation matrix based on the orientation specified by order. * @param {Matrix4} m - a Matrix4 of which the upper 3x3 of matrix is a pure rotation matrix * @param {string} order - (optional) a string representing the order that the rotations are applied. * @param {boolean} [update=true] - Whether to notify Euler angle has changed * @returns {Euler} */ setFromRotationMatrix(m, order = this._order, update = true) { // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) const te = m.elements; const m11 = te[0], m12 = te[4], m13 = te[8]; const m21 = te[1], m22 = te[5], m23 = te[9]; const m31 = te[2], m32 = te[6], m33 = te[10]; if (order === 'XYZ') { this._y = Math.asin(MathUtils.clamp(m13, -1, 1)); if (Math.abs(m13) < 0.99999) { this._x = Math.atan2(-m23, m33); this._z = Math.atan2(-m12, m11); } else { this._x = Math.atan2(m32, m22); this._z = 0; } } else if (order === 'YXZ') { this._x = Math.asin(-MathUtils.clamp(m23, -1, 1)); if (Math.abs(m23) < 0.99999) { this._y = Math.atan2(m13, m33); this._z = Math.atan2(m21, m22); } else { this._y = Math.atan2(-m31, m11); this._z = 0; } } else if (order === 'ZXY') { this._x = Math.asin(MathUtils.clamp(m32, -1, 1)); if (Math.abs(m32) < 0.99999) { this._y = Math.atan2(-m31, m33); this._z = Math.atan2(-m12, m22); } else { this._y = 0; this._z = Math.atan2(m21, m11); } } else if (order === 'ZYX') { this._y = Math.asin(-MathUtils.clamp(m31, -1, 1)); if (Math.abs(m31) < 0.99999) { this._x = Math.atan2(m32, m33); this._z = Math.atan2(m21, m11); } else { this._x = 0; this._z = Math.atan2(-m12, m22); } } else if (order === 'YZX') { this._z = Math.asin(MathUtils.clamp(m21, -1, 1)); if (Math.abs(m21) < 0.99999) { this._x = Math.atan2(-m23, m22); this._y = Math.atan2(-m31, m11); } else { this._x = 0; this._y = Math.atan2(m13, m33); } } else if (order === 'XZY') { this._z = Math.asin(-MathUtils.clamp(m12, -1, 1)); if (Math.abs(m12) < 0.99999) { this._x = Math.atan2(m32, m22); this._y = Math.atan2(m13, m11); } else { this._x = Math.atan2(-m23, m33); this._y = 0; } } else { console.warn('given unsupported order: ' + order); } this._order = order; if (update === true) this.onChangeCallback(); return this; } /** * Sets the angles of this euler transform from a normalized quaternion based on the orientation specified by order. * @param {Quaternion} q - a normalized quaternion. * @param {string} order - (optional) a string representing the order that the rotations are applied. * @param {boolean} [update=true] - Whether to notify Euler angle has changed * @returns {Euler} */ setFromQuaternion(q, order, update) { q.toMatrix4(_matrix); return this.setFromRotationMatrix(_matrix, order, update); } /** * @param {Function} callback - When the Euler angle value changes, the callback method is triggered * @returns {Euler} */ onChange(callback) { this.onChangeCallback = callback; return this; } onChangeCallback() {} * [Symbol.iterator]() { yield this._x; yield this._y; yield this._z; yield this._order; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Euler.prototype.isEuler = true; /** * The order in which to apply rotations. * @readonly */ Euler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX']; /** * The default order in which to apply rotations. * @readonly */ Euler.DefaultOrder = 'XYZ'; export { Euler }; ================================================ FILE: src/math/Frustum.js ================================================ import { Matrix3 } from './Matrix3.js'; import { Plane } from './Plane.js'; import { Vector3 } from './Vector3.js'; const _vec3_1 = new Vector3(); const _mat3_1 = new Matrix3(); /** * Frustums are used to determine what is inside the camera's field of view. * They help speed up the rendering process - objects which lie outside a camera's frustum can safely be excluded from rendering. */ class Frustum { /** * @param {Plane} p0 - (optional) defaults to a new Plane. * @param {Plane} p1 - (optional) defaults to a new Plane. * @param {Plane} p2 - (optional) defaults to a new Plane. * @param {Plane} p3 - (optional) defaults to a new Plane. * @param {Plane} p4 - (optional) defaults to a new Plane. * @param {Plane} p5 - (optional) defaults to a new Plane. */ constructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) { this.planes = [p0, p1, p2, p3, p4, p5]; } /** * Sets the frustum from the passed planes. No plane order is implied. * @param {Plane} p0 - (optional) defaults to a new Plane. * @param {Plane} p1 - (optional) defaults to a new Plane. * @param {Plane} p2 - (optional) defaults to a new Plane. * @param {Plane} p3 - (optional) defaults to a new Plane. * @param {Plane} p4 - (optional) defaults to a new Plane. * @param {Plane} p5 - (optional) defaults to a new Plane. * @returns {Frustum} */ set(p0, p1, p2, p3, p4, p5) { const planes = this.planes; planes[0].copy(p0); planes[1].copy(p1); planes[2].copy(p2); planes[3].copy(p3); planes[4].copy(p4); planes[5].copy(p5); return this; } /** * Sets the frustum planes from the matrix. * @param {Matrix4} m - a Matrix4 used to set the planes * @returns {Frustum} */ setFromMatrix(m) { const planes = this.planes; const me = m.elements; const me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3]; const me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7]; const me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11]; const me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15]; planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize(); planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize(); planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize(); planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize(); planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize(); planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize(); return this; } /** * Return true if sphere intersects with this frustum. * @param {Sphere} sphere - Sphere to check for intersection. * @returns {boolean} */ intersectsSphere(sphere) { const planes = this.planes; const center = sphere.center; const negRadius = -sphere.radius; for (let i = 0; i < 6; i++) { const distance = planes[i].distanceToPoint(center); if (distance < negRadius) { return false; } } return true; } /** * Return true if box intersects with this frustum. * @param {Box3} box - Box3 to check for intersection. * @returns {boolean} */ intersectsBox(box) { const planes = this.planes; for (let i = 0; i < 6; i++) { const plane = planes[i]; // corner at max distance _vec3_1.x = plane.normal.x > 0 ? box.max.x : box.min.x; _vec3_1.y = plane.normal.y > 0 ? box.max.y : box.min.y; _vec3_1.z = plane.normal.z > 0 ? box.max.z : box.min.z; // if both outside plane, no intersection if (plane.distanceToPoint(_vec3_1) < 0) { return false; } } return true; } /** * Apply a matrix4x4 to the frustum. * @param {Matrix4} matrix - Matrix4 to apply to the frustum. * @returns {Frustum} */ applyMatrix4(matrix) { const planes = this.planes; const normalMatrix = _mat3_1.setFromMatrix4(matrix).invert().transpose(); for (let i = 0; i < 6; i++) { planes[i].applyMatrix4(matrix, normalMatrix); } return this; } /** * Return a new Frustum with the same parameters as this one. * @returns {Frustum} */ clone() { return new this.constructor().copy(this); } /** * Copies the properties of the passed frustum into this one. * @param {Frustum} frustum - The frustum to copy * @returns {Frustum} */ copy(frustum) { const planes = this.planes; for (let i = 0; i < 6; i++) { planes[i].copy(frustum.planes[i]); } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Frustum.prototype.isFrustum = true; export { Frustum }; ================================================ FILE: src/math/MathUtils.js ================================================ /** * An utility class for mathematical operations. */ class MathUtils { /** * Method for generate uuid. * http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136 * @returns {string} - The uuid. */ static generateUUID() { const d0 = Math.random() * 0xffffffff | 0; const d1 = Math.random() * 0xffffffff | 0; const d2 = Math.random() * 0xffffffff | 0; const d3 = Math.random() * 0xffffffff | 0; const uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' + _lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' + _lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] + _lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff]; // .toUpperCase() here flattens concatenated strings to save heap memory space. return uuid.toUpperCase(); } /** * Returns a value linearly interpolated from two known points based on the given interval - t = 0 will return x and t = 1 will return y. * @param {number} x - The first value. * @param {number} y - The second value. * @param {number} t - The interpolation factor. * @returns {number} - The interpolated value. */ static lerp(x, y, t) { return x + (y - x) * t; } /** * Clamps the value to be between min and max. * @param {number} value - Value to be clamped. * @param {number} min - The minimum value. * @param {number} max - The maximum value. * @returns {number} - The clamped value. */ static clamp(value, min, max) { return Math.max(min, Math.min(max, value)); } /** * Compute euclidean modulo of m % n. * Refer to: https://en.wikipedia.org/wiki/Modulo_operation * @param {number} n - The dividend. * @param {number} m - The divisor. * @returns {number} - The result of the modulo operation. */ static euclideanModulo(n, m) { return ((n % m) + m) % m; } /** * Performs a linear mapping from range `` to range `` * for the given value. * @param {number} x - The value to be mapped. * @param {number} a1 - Minimum value for range A. * @param {number} a2 - Maximum value for range A. * @param {number} b1 - Minimum value for range B. * @param {number} b2 - Maximum value for range B. * @returns {number} The mapped value. */ static mapLinear(x, a1, a2, b1, b2) { return b1 + (x - a1) * (b2 - b1) / (a2 - a1); } /** * Is this number a power of two. * @param {number} value - The input number. * @returns {boolean} - Is this number a power of two. */ static isPowerOfTwo(value) { return (value & (value - 1)) === 0 && value !== 0; } /** * Return the nearest power of two number of this number. * @param {number} value - The input number. * @returns {number} - The result number. */ static nearestPowerOfTwo(value) { return Math.pow(2, Math.round(Math.log(value) / Math.LN2)); } /** * Return the next power of two number of this number. * @param {number} value - The input number. * @returns {number} - The result number. */ static nextPowerOfTwo(value) { value--; value |= value >> 1; value |= value >> 2; value |= value >> 4; value |= value >> 8; value |= value >> 16; value++; return value; } /** * Return the next power of two square size of this number. * This method is usually used to calculate the minimum 2d texture size based on the pixel length. * @param {number} value - The input number. * @returns {number} - The result size. */ static nextPowerOfTwoSquareSize(value) { return this.nextPowerOfTwo(Math.ceil(Math.sqrt(value))); } /** * Denormalizes a value based on the type of the provided array. * @param {number} value - The value to be denormalized. * @param {TypedArray} array - The typed array to determine the normalization factor. * @returns {number} - The denormalized value. * @throws {Error} - Throws an error if the array type is invalid. */ static denormalize(value, array) { switch (array.constructor) { case Float32Array: return value; case Uint32Array: return value / 4294967295.0; case Uint16Array: return value / 65535.0; case Uint8Array: return value / 255.0; case Int32Array: return Math.max(value / 2147483647.0, -1.0); case Int16Array: return Math.max(value / 32767.0, -1.0); case Int8Array: return Math.max(value / 127.0, -1.0); default: throw new Error('Invalid component type.'); } } /** * Normalizes a value based on the type of the provided array. * @param {number} value - The value to be normalized. * @param {TypedArray} array - The typed array to determine the normalization factor. * @returns {number} - The normalized value. * @throws {Error} - Throws an error if the array type is invalid. */ static normalize(value, array) { switch (array.constructor) { case Float32Array: return value; case Uint32Array: return Math.round(value * 4294967295.0); case Uint16Array: return Math.round(value * 65535.0); case Uint8Array: return Math.round(value * 255.0); case Int32Array: return Math.round(value * 2147483647.0); case Int16Array: return Math.round(value * 32767.0); case Int8Array: return Math.round(value * 127.0); default: throw new Error('Invalid component type.'); } } /** * Converts float to half float. * @param {number} val - The float value. * @returns {number} - The half float value. */ static toHalfFloat(val) { if (Math.abs(val) > 65504) { console.warn('MathUtils.toHalfFloat(): Value out of range.'); val = this.clamp(val, -65504, 65504); } _tables.floatView[0] = val; const f = _tables.uint32View[0]; const e = (f >> 23) & 0x1ff; return _tables.baseTable[e] + ((f & 0x007fffff) >> _tables.shiftTable[e]); } /** * Converts half float to float. * @param {number} val - The half float value. * @returns {number} - The float value. */ static fromHalfFloat(val) { const m = val >> 10; _tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 0x3ff)] + _tables.exponentTable[m]; return _tables.floatView[0]; } } const _lut = []; for (let i = 0; i < 256; i++) { _lut[i] = (i < 16 ? '0' : '') + (i).toString(16); } // Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf const _tables = _generateTables(); function _generateTables() { // float32 to float16 helpers const buffer = new ArrayBuffer(4); const floatView = new Float32Array(buffer); const uint32View = new Uint32Array(buffer); const baseTable = new Uint32Array(512); const shiftTable = new Uint32Array(512); for (let i = 0; i < 256; ++i) { const e = i - 127; if (e < -27) { // very small number (0, -0) baseTable[i] = 0x0000; baseTable[i | 0x100] = 0x8000; shiftTable[i] = 24; shiftTable[i | 0x100] = 24; } else if (e < -14) { // small number (denorm) baseTable[i] = 0x0400 >> (-e - 14); baseTable[i | 0x100] = (0x0400 >> (-e - 14)) | 0x8000; shiftTable[i] = -e - 1; shiftTable[i | 0x100] = -e - 1; } else if (e <= 15) { // normal number baseTable[i] = (e + 15) << 10; baseTable[i | 0x100] = ((e + 15) << 10) | 0x8000; shiftTable[i] = 13; shiftTable[i | 0x100] = 13; } else if (e < 128) { // large number (Infinity, -Infinity) baseTable[i] = 0x7c00; baseTable[i | 0x100] = 0xfc00; shiftTable[i] = 24; shiftTable[i | 0x100] = 24; } else { // stay (NaN, Infinity, -Infinity) baseTable[i] = 0x7c00; baseTable[i | 0x100] = 0xfc00; shiftTable[i] = 13; shiftTable[i | 0x100] = 13; } } // float16 to float32 helpers const mantissaTable = new Uint32Array(2048); const exponentTable = new Uint32Array(64); const offsetTable = new Uint32Array(64); for (let i = 1; i < 1024; ++i) { let m = i << 13; // zero pad mantissa bits let e = 0; // zero exponent // normalized while ((m & 0x00800000) === 0) { m <<= 1; e -= 0x00800000; // decrement exponent } m &= ~0x00800000; // clear leading 1 bit e += 0x38800000; // adjust bias mantissaTable[i] = m | e; } for (let i = 1024; i < 2048; ++i) { mantissaTable[i] = 0x38000000 + ((i - 1024) << 13); } for (let i = 1; i < 31; ++i) { exponentTable[i] = i << 23; } exponentTable[31] = 0x47800000; exponentTable[32] = 0x80000000; for (let i = 33; i < 63; ++i) { exponentTable[i] = 0x80000000 + ((i - 32) << 23); } exponentTable[63] = 0xc7800000; for (let i = 1; i < 64; ++i) { if (i !== 32) { offsetTable[i] = 1024; } } return { floatView: floatView, uint32View: uint32View, baseTable: baseTable, shiftTable: shiftTable, mantissaTable: mantissaTable, exponentTable: exponentTable, offsetTable: offsetTable }; } export { MathUtils }; ================================================ FILE: src/math/Matrix3.js ================================================ /** * The 3x3 matrix class. */ class Matrix3 { /** * Create a 3x3 matrix. */ constructor() { this.elements = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; } /** * Sets the 3x3 matrix values to the given row-major sequence of values. * @param {number} n11 - value to put in row 1, col 1. * @param {number} n12 - value to put in row 1, col 2. * @param {number} n13 - value to put in row 1, col 3. * @param {number} n21 - value to put in row 2, col 1. * @param {number} n22 - value to put in row 2, col 2. * @param {number} n23 - value to put in row 2, col 3. * @param {number} n31 - value to put in row 3, col 1. * @param {number} n32 - value to put in row 3, col 2. * @param {number} n33 - value to put in row 3, col 3. * @returns {Matrix3} */ set(n11, n12, n13, n21, n22, n23, n31, n32, n33) { const ele = this.elements; ele[0] = n11; ele[3] = n12; ele[6] = n13; ele[1] = n21; ele[4] = n22; ele[7] = n23; ele[2] = n31; ele[5] = n32; ele[8] = n33; return this; } /** * Resets this matrix to the 3x3 identity matrix * @returns {Matrix3} */ identity() { return this.set( 1, 0, 0, 0, 1, 0, 0, 0, 1 ); } /** * Checks if the matrix is an identity matrix. * @returns {boolean} - True if the matrix is an identity matrix, false otherwise. */ isIdentity() { const te = this.elements; return te[0] === 1 && te[3] === 0 && te[6] === 0 && te[1] === 0 && te[4] === 1 && te[7] === 0 && te[2] === 0 && te[5] === 0 && te[8] === 1; } /** * Computes and returns the determinant of this matrix. * @returns {number} The determinant. */ determinant() { const te = this.elements; const a = te[0], b = te[1], c = te[2], d = te[3], e = te[4], f = te[5], g = te[6], h = te[7], i = te[8]; return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; } /** * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}. * You can not invert with a determinant of zero. If you attempt this, the method produces * a zero matrix instead. * @returns {Matrix3} A reference to this matrix. */ invert() { const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n12 = te[3], n22 = te[4], n32 = te[5], n13 = te[6], n23 = te[7], n33 = te[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13; if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); const detInv = 1 / det; te[0] = t11 * detInv; te[1] = (n31 * n23 - n33 * n21) * detInv; te[2] = (n32 * n21 - n31 * n22) * detInv; te[3] = t12 * detInv; te[4] = (n33 * n11 - n31 * n13) * detInv; te[5] = (n31 * n12 - n32 * n11) * detInv; te[6] = t13 * detInv; te[7] = (n21 * n13 - n23 * n11) * detInv; te[8] = (n22 * n11 - n21 * n12) * detInv; return this; } /** * Transposes this matrix in place. * @returns {Matrix3} */ transpose() { let tmp; const m = this.elements; tmp = m[1]; m[1] = m[3]; m[3] = tmp; tmp = m[2]; m[2] = m[6]; m[6] = tmp; tmp = m[5]; m[5] = m[7]; m[7] = tmp; return this; } /** * Return true if this matrix and m are equal. * @param {Matrix3} matrix * @returns {boolean} */ equals(matrix) { const te = this.elements; const me = matrix.elements; for (let i = 0; i < 9; i++) { if (te[i] !== me[i]) return false; } return true; } /** * Sets the elements of this matrix based on an array in column-major format. * @param {number[]} array * @param {number} [offset=0] * @returns {Matrix3} */ fromArray(array, offset = 0) { for (let i = 0; i < 9; i++) { this.elements[i] = array[i + offset]; } return this; } /** * Writes the elements of this matrix to an array in column-major format. * @param {number[]} [array] * @param {number} [offset=0] * @returns {number[]} */ toArray(array = [], offset = 0) { const te = this.elements; array[offset] = te[0]; array[offset + 1] = te[1]; array[offset + 2] = te[2]; array[offset + 3] = te[3]; array[offset + 4] = te[4]; array[offset + 5] = te[5]; array[offset + 6] = te[6]; array[offset + 7] = te[7]; array[offset + 8] = te[8]; return array; } /** * Creates a new Matrix3 and with identical elements to this one. * @returns {Matrix3} */ clone() { return new Matrix3().fromArray(this.elements); } /** * Copies the elements of matrix m into this matrix. * @param {Matrix3} m * @returns {Matrix3} */ copy(m) { const te = this.elements; const me = m.elements; te[0] = me[0]; te[1] = me[1]; te[2] = me[2]; te[3] = me[3]; te[4] = me[4]; te[5] = me[5]; te[6] = me[6]; te[7] = me[7]; te[8] = me[8]; return this; } /** * Post-multiplies this matrix by m. * @param {Matrix3} m * @returns {Matrix3} */ multiply(m) { return this.multiplyMatrices(this, m); } /** * Pre-multiplies this matrix by m. * @param {Matrix3} m * @returns {Matrix3} */ premultiply(m) { return this.multiplyMatrices(m, this); } /** * Sets this matrix to a x b. * @param {Matrix3} a * @param {Matrix3} b * @returns {Matrix3} */ multiplyMatrices(a, b) { const ae = a.elements; const be = b.elements; const te = this.elements; const a11 = ae[0], a12 = ae[3], a13 = ae[6]; const a21 = ae[1], a22 = ae[4], a23 = ae[7]; const a31 = ae[2], a32 = ae[5], a33 = ae[8]; const b11 = be[0], b12 = be[3], b13 = be[6]; const b21 = be[1], b22 = be[4], b23 = be[7]; const b31 = be[2], b32 = be[5], b33 = be[8]; te[0] = a11 * b11 + a12 * b21 + a13 * b31; te[3] = a11 * b12 + a12 * b22 + a13 * b32; te[6] = a11 * b13 + a12 * b23 + a13 * b33; te[1] = a21 * b11 + a22 * b21 + a23 * b31; te[4] = a21 * b12 + a22 * b22 + a23 * b32; te[7] = a21 * b13 + a22 * b23 + a23 * b33; te[2] = a31 * b11 + a32 * b21 + a33 * b31; te[5] = a31 * b12 + a32 * b22 + a33 * b32; te[8] = a31 * b13 + a32 * b23 + a33 * b33; return this; } /** * Transform 2D * @param {number} x - position.x * @param {number} y - position.y * @param {number} scaleX - scale.x * @param {number} scaleY - scale.y * @param {number} rotation - rotation * @param {number} anchorX - anchor.x * @param {number} anchorY - anchor.y * @returns {Matrix3} */ transform(x, y, scaleX, scaleY, rotation, anchorX, anchorY) { const te = this.elements; const cr = Math.cos(rotation); const sr = Math.sin(rotation); te[0] = cr * scaleX; te[3] = -sr * scaleY; te[6] = x; te[1] = sr * scaleX; te[4] = cr * scaleY; te[7] = y; te[2] = 0; te[5] = 0; te[8] = 1; if (anchorX || anchorY) { // prepend the anchor offset: te[6] -= anchorX * te[0] + anchorY * te[3]; te[7] -= anchorX * te[1] + anchorY * te[4]; } return this; } /** * Set the transformation matrix of uv coordinates * @param {number} tx * @param {number} ty * @param {number} sx * @param {number} sy * @param {number} rotation * @param {number} cx * @param {number} cy * @returns {Matrix3} */ setUvTransform(tx, ty, sx, sy, rotation, cx, cy) { const c = Math.cos(rotation); const s = Math.sin(rotation); return this.set( sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1 ); } /** * Sets the matri3 planes from the matrix4. * @param {Matrix4} m * @returns {Matrix3} */ setFromMatrix4(m) { const me = m.elements; return this.set( me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10] ); } /** * Extracts the basis vectors from the matrix. * @param {Vector3} xAxis * @param {Vector3} yAxis * @param {Vector3} zAxis * @returns {Matrix3} */ extractBasis(xAxis, yAxis, zAxis) { const te = this.elements; xAxis.fromArray(te); yAxis.fromArray(te, 3); zAxis.fromArray(te, 6); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Matrix3.prototype.isMatrix3 = true; export { Matrix3 }; ================================================ FILE: src/math/Matrix4.js ================================================ import { Vector3 } from './Vector3.js'; /** * Represents a 4x4 matrix. */ class Matrix4 { /** * Constructs a new 4x4 matrix. */ constructor() { /** * A column-major list of matrix values. * @type {Array} */ this.elements = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]; } /** * Sets the elements of the matrix.The arguments are supposed to be * in row-major order. * @param {number} [n11] - 1-1 matrix element. * @param {number} [n12] - 1-2 matrix element. * @param {number} [n13] - 1-3 matrix element. * @param {number} [n14] - 1-4 matrix element. * @param {number} [n21] - 2-1 matrix element. * @param {number} [n22] - 2-2 matrix element. * @param {number} [n23] - 2-3 matrix element. * @param {number} [n24] - 2-4 matrix element. * @param {number} [n31] - 3-1 matrix element. * @param {number} [n32] - 3-2 matrix element. * @param {number} [n33] - 3-3 matrix element. * @param {number} [n34] - 3-4 matrix element. * @param {number} [n41] - 4-1 matrix element. * @param {number} [n42] - 4-2 matrix element. * @param {number} [n43] - 4-3 matrix element. * @param {number} [n44] - 4-4 matrix element. * @returns {Matrix4} A reference to this matrix. */ set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { const ele = this.elements; ele[0] = n11; ele[4] = n12; ele[8] = n13; ele[12] = n14; ele[1] = n21; ele[5] = n22; ele[9] = n23; ele[13] = n24; ele[2] = n31; ele[6] = n32; ele[10] = n33; ele[14] = n34; ele[3] = n41; ele[7] = n42; ele[11] = n43; ele[15] = n44; return this; } /** * Sets this matrix to the 4x4 identity matrix. * @returns {Matrix4} A reference to this matrix. */ identity() { return this.set( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); } /** * Checks if the matrix is an identity matrix. * @returns {boolean} - True if the matrix is an identity matrix, false otherwise. */ isIdentity() { const te = this.elements; return te[0] === 1 && te[4] === 0 && te[8] === 0 && te[12] === 0 && te[1] === 0 && te[5] === 1 && te[9] === 0 && te[13] === 0 && te[2] === 0 && te[6] === 0 && te[10] === 1 && te[14] === 0 && te[3] === 0 && te[7] === 0 && te[11] === 0 && te[15] === 1; } /** * Returns a matrix with copied values from this instance. * @returns {Matrix4} A clone of this instance. */ clone() { return new Matrix4().fromArray(this.elements); } /** * Copies the values of the given matrix to this instance. * @param {Matrix4} m - The matrix to copy. * @returns {Matrix4} A reference to this matrix. */ copy(m) { const te = this.elements; const me = m.elements; te[0] = me[0]; te[1] = me[1]; te[2] = me[2]; te[3] = me[3]; te[4] = me[4]; te[5] = me[5]; te[6] = me[6]; te[7] = me[7]; te[8] = me[8]; te[9] = me[9]; te[10] = me[10]; te[11] = me[11]; te[12] = me[12]; te[13] = me[13]; te[14] = me[14]; te[15] = me[15]; return this; } /** * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix. * @param {Matrix3} m - The 3x3 matrix. * @returns {Matrix4} A reference to this matrix. */ setFromMatrix3(m) { const me = m.elements; return this.set( me[0], me[3], me[6], 0, me[1], me[4], me[7], 0, me[2], me[5], me[8], 0, 0, 0, 0, 1 ); } /** * Extracts the basis of this matrix into the three axis vectors provided. * @param {Vector3} xAxis - The basis's x axis. * @param {Vector3} yAxis - The basis's y axis. * @param {Vector3} zAxis - The basis's z axis. * @returns {Matrix4} A reference to this matrix. */ extractBasis(xAxis, yAxis, zAxis) { xAxis.setFromMatrixColumn(this, 0); yAxis.setFromMatrixColumn(this, 1); zAxis.setFromMatrixColumn(this, 2); return this; } /** * Sets the given basis vectors to this matrix. * @param {Vector3} xAxis - The basis's x axis. * @param {Vector3} yAxis - The basis's y axis. * @param {Vector3} zAxis - The basis's z axis. * @returns {Matrix4} A reference to this matrix. */ makeBasis(xAxis, yAxis, zAxis) { this.set( xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1 ); return this; } /** * Extracts the rotation component of the given matrix * into this matrix's rotation component. * * Note: This method does not support reflection matrices. * @param {Matrix4} m - The matrix. * @returns {Matrix4} A reference to this matrix. */ extractRotation(m) { const te = this.elements; const me = m.elements; const scaleX = 1 / _vec3_1.setFromMatrixColumn(m, 0).getLength(); const scaleY = 1 / _vec3_1.setFromMatrixColumn(m, 1).getLength(); const scaleZ = 1 / _vec3_1.setFromMatrixColumn(m, 2).getLength(); te[0] = me[0] * scaleX; te[1] = me[1] * scaleX; te[2] = me[2] * scaleX; te[3] = 0; te[4] = me[4] * scaleY; te[5] = me[5] * scaleY; te[6] = me[6] * scaleY; te[7] = 0; te[8] = me[8] * scaleZ; te[9] = me[9] * scaleZ; te[10] = me[10] * scaleZ; te[11] = 0; te[12] = 0; te[13] = 0; te[14] = 0; te[15] = 1; return this; } /** * Sets the rotation component (the upper left 3x3 matrix) of this matrix to * the rotation specified by the given Euler angles. The rest of * the matrix is set to the identity. Depending on the {@link Euler#order}, * there are six possible outcomes. See [this page]{@link https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix} * for a complete list. * @param {Euler} euler - The Euler angles. * @returns {Matrix4} A reference to this matrix. */ makeRotationFromEuler(euler) { const te = this.elements; const x = euler.x, y = euler.y, z = euler.z; const a = Math.cos(x), b = Math.sin(x); const c = Math.cos(y), d = Math.sin(y); const e = Math.cos(z), f = Math.sin(z); if (euler.order === 'XYZ') { const ae = a * e, af = a * f, be = b * e, bf = b * f; te[0] = c * e; te[4] = -c * f; te[8] = d; te[1] = af + be * d; te[5] = ae - bf * d; te[9] = -b * c; te[2] = bf - ae * d; te[6] = be + af * d; te[10] = a * c; } else if (euler.order === 'YXZ') { const ce = c * e, cf = c * f, de = d * e, df = d * f; te[0] = ce + df * b; te[4] = de * b - cf; te[8] = a * d; te[1] = a * f; te[5] = a * e; te[9] = -b; te[2] = cf * b - de; te[6] = df + ce * b; te[10] = a * c; } else if (euler.order === 'ZXY') { const ce = c * e, cf = c * f, de = d * e, df = d * f; te[0] = ce - df * b; te[4] = -a * f; te[8] = de + cf * b; te[1] = cf + de * b; te[5] = a * e; te[9] = df - ce * b; te[2] = -a * d; te[6] = b; te[10] = a * c; } else if (euler.order === 'ZYX') { const ae = a * e, af = a * f, be = b * e, bf = b * f; te[0] = c * e; te[4] = be * d - af; te[8] = ae * d + bf; te[1] = c * f; te[5] = bf * d + ae; te[9] = af * d - be; te[2] = -d; te[6] = b * c; te[10] = a * c; } else if (euler.order === 'YZX') { const ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[0] = c * e; te[4] = bd - ac * f; te[8] = bc * f + ad; te[1] = f; te[5] = a * e; te[9] = -b * e; te[2] = -d * e; te[6] = ad * f + bc; te[10] = ac - bd * f; } else if (euler.order === 'XZY') { const ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[0] = c * e; te[4] = -f; te[8] = d * e; te[1] = ac * f + bd; te[5] = a * e; te[9] = ad * f - bc; te[2] = bc * f - ad; te[6] = b * e; te[10] = bd * f + ac; } // bottom row te[3] = 0; te[7] = 0; te[11] = 0; // last column te[12] = 0; te[13] = 0; te[14] = 0; te[15] = 1; return this; } /** * Sets the rotation component of this matrix to the rotation specified by q, as outlined here. * @param {Quaternion} q * @returns {Matrix4} */ makeRotationFromQuaternion(q) { return this.compose(_zero, q, _one); } /** * Constructs a rotation matrix, looking from eye towards center oriented by the up vector. * @param {Vector3} eye - The eye vector. * @param {Vector3} target - The target vector. * @param {Vector3} up - The up vector. * @returns {Matrix4} A reference to this matrix. */ lookAtRH(eye, target, up) { const te = this.elements; _z.subVectors(eye, target); if (_z.getLengthSquared() === 0) { // eye and target are in the same position _z.z = 1; } _z.normalize(); _x.crossVectors(up, _z); if (_x.getLengthSquared() === 0) { // up and z are parallel if (Math.abs(up.z) === 1) { _z.x += 0.0001; } else { _z.z += 0.0001; } _z.normalize(); _x.crossVectors(up, _z); } _x.normalize(); _y.crossVectors(_z, _x); te[0] = _x.x; te[4] = _y.x; te[8] = _z.x; te[1] = _x.y; te[5] = _y.y; te[9] = _z.y; te[2] = _x.z; te[6] = _y.z; te[10] = _z.z; return this; } /** * Post-multiplies this matrix by the given 4x4 matrix. * @param {Matrix4} m - The matrix to multiply with. * @returns {Matrix4} A reference to this matrix. */ multiply(m) { return this.multiplyMatrices(this, m); } /** * Pre-multiplies this matrix by the given 4x4 matrix. * @param {Matrix4} m - The matrix to multiply with. * @returns {Matrix4} A reference to this matrix. */ premultiply(m) { return this.multiplyMatrices(m, this); } /** * Multiples the given 4x4 matrices and stores the result * in this matrix. * @param {Matrix4} a - The first matrix. * @param {Matrix4} b - The second matrix. * @returns {Matrix4} A reference to this matrix. */ multiplyMatrices(a, b) { const ae = a.elements; const be = b.elements; const te = this.elements; const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; return this; } /** * Computes and returns the determinant of this matrix. * Based on the method outlined [here]{@link http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html}. * @returns {number} The determinant. */ determinant() { const te = this.elements; const n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12]; const n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13]; const n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14]; const n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15]; // TODO: make this more efficient return ( n41 * ( +n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34 ) + n42 * ( +n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31 ) + n43 * ( +n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31 ) + n44 * ( -n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31 ) ); } /** * Transposes this matrix in place. * @returns {Matrix4} A reference to this matrix. */ transpose() { const te = this.elements; let tmp; tmp = te[1]; te[1] = te[4]; te[4] = tmp; tmp = te[2]; te[2] = te[8]; te[8] = tmp; tmp = te[6]; te[6] = te[9]; te[9] = tmp; tmp = te[3]; te[3] = te[12]; te[12] = tmp; tmp = te[7]; te[7] = te[13]; te[13] = tmp; tmp = te[11]; te[11] = te[14]; te[14] = tmp; return this; } /** * Sets the position component for this matrix from the given vector, * without affecting the rest of the matrix. * @param {number|Vector3} x - The x component of the vector or alternatively the vector object. * @param {number} y - The y component of the vector. * @param {number} z - The z component of the vector. * @returns {Matrix4} A reference to this matrix. */ setPosition(x, y, z) { const te = this.elements; if (x.isVector3) { te[12] = x.x; te[13] = x.y; te[14] = x.z; } else { te[12] = x; te[13] = y; te[14] = z; } return this; } /** * Inverts this matrix, using the [analytic method]{@link https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution}. * You can not invert with a determinant of zero. If you attempt this, the method produces * a zero matrix instead. * @returns {Matrix4} A reference to this matrix. */ invert() { // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n41 = te[3], n12 = te[4], n22 = te[5], n32 = te[6], n42 = te[7], n13 = te[8], n23 = te[9], n33 = te[10], n43 = te[11], n14 = te[12], n24 = te[13], n34 = te[14], n44 = te[15], t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const detInv = 1 / det; te[0] = t11 * detInv; te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv; te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv; te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv; te[4] = t12 * detInv; te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv; te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv; te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv; te[8] = t13 * detInv; te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv; te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv; te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv; te[12] = t14 * detInv; te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv; te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv; te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv; return this; } /** * Gets the maximum scale value of the three axes. * @returns {number} The maximum scale. */ getMaxScaleOnAxis() { const te = this.elements; const scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2]; const scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6]; const scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10]; return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)); } /** * Sets this matrix as a translation transform from the given vector. * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector. * @param {number} y - The amount to translate in the Y axis. * @param {number} z - The amount to translate in the z axis. * @returns {Matrix4} A reference to this matrix. */ makeTranslation(x, y, z) { if (x.isVector3) { this.set( 1, 0, 0, x.x, 0, 1, 0, x.y, 0, 0, 1, x.z, 0, 0, 0, 1 ); } else { this.set( 1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1 ); } return this; } /** * Sets this matrix as a rotational transformation around the given axis by * the given angle. * This is a somewhat controversial but mathematically sound alternative to * rotating via Quaternions. See the discussion [here]{@link https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199}. * @param {Vector3} axis - The normalized rotation axis. * @param {number} angle - The rotation in radians. * @returns {Matrix4} A reference to this matrix. */ makeRotationAxis(axis, angle) { // Based on http://www.gamedev.net/reference/articles/article1199.asp const c = Math.cos(angle); const s = Math.sin(angle); const t = 1 - c; const x = axis.x, y = axis.y, z = axis.z; const tx = t * x, ty = t * y; return this.set( tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1 ); } /** * Sets this matrix as a scale transformation. * @param {number} x - The amount to scale in the X axis. * @param {number} y - The amount to scale in the Y axis. * @param {number} z - The amount to scale in the Z axis. * @returns {Matrix4} A reference to this matrix. */ makeScale(x, y, z) { return this.set( x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1 ); } /** * Sets this matrix to the transformation composed of the given position, * rotation (Quaternion) and scale. * @param {Vector3} position - The position vector. * @param {Quaternion} quaternion - The rotation as a Quaternion. * @param {Vector3} scale - The scale vector. * @returns {Matrix4} A reference to this matrix. */ compose(position, quaternion, scale) { const te = this.elements; const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; const x2 = x + x, y2 = y + y, z2 = z + z; const xx = x * x2, xy = x * y2, xz = x * z2; const yy = y * y2, yz = y * z2, zz = z * z2; const wx = w * x2, wy = w * y2, wz = w * z2; const sx = scale.x, sy = scale.y, sz = scale.z; te[0] = (1 - (yy + zz)) * sx; te[1] = (xy + wz) * sx; te[2] = (xz - wy) * sx; te[3] = 0; te[4] = (xy - wz) * sy; te[5] = (1 - (xx + zz)) * sy; te[6] = (yz + wx) * sy; te[7] = 0; te[8] = (xz + wy) * sz; te[9] = (yz - wx) * sz; te[10] = (1 - (xx + yy)) * sz; te[11] = 0; te[12] = position.x; te[13] = position.y; te[14] = position.z; te[15] = 1; return this; } /** * Decomposes this matrix into its position, rotation and scale components * and provides the result in the given objects. * Note: Not all matrices are decomposable in this way. For example, if an * object has a non-uniformly scaled parent, then the object's world matrix * may not be decomposable, and this method may not be appropriate. * @param {Vector3} position - The position vector. * @param {Quaternion} quaternion - The rotation as a Quaternion. * @param {Vector3} scale - The scale vector. * @returns {Matrix4} A reference to this matrix. */ decompose(position, quaternion, scale) { const te = this.elements; let sx = _vec3_1.set(te[0], te[1], te[2]).getLength(); const sy = _vec3_1.set(te[4], te[5], te[6]).getLength(); const sz = _vec3_1.set(te[8], te[9], te[10]).getLength(); // if determine is negative, we need to invert one scale const det = this.determinant(); if (det < 0) { sx = -sx; } position.x = te[12]; position.y = te[13]; position.z = te[14]; // scale the rotation part _mat4_1.copy(this); const invSX = 1 / sx; const invSY = 1 / sy; const invSZ = 1 / sz; _mat4_1.elements[0] *= invSX; _mat4_1.elements[1] *= invSX; _mat4_1.elements[2] *= invSX; _mat4_1.elements[4] *= invSY; _mat4_1.elements[5] *= invSY; _mat4_1.elements[6] *= invSY; _mat4_1.elements[8] *= invSZ; _mat4_1.elements[9] *= invSZ; _mat4_1.elements[10] *= invSZ; quaternion.setFromRotationMatrix(_mat4_1); scale.x = sx; scale.y = sy; scale.z = sz; return this; } /** * Returns `true` if this matrix is equal with the given one. * @param {Matrix4} matrix - The matrix to test for equality. * @returns {boolean} Whether this matrix is equal with the given one. */ equals(matrix) { const te = this.elements; const me = matrix.elements; for (let i = 0; i < 16; i++) { if (te[i] !== me[i]) return false; } return true; } /** * Sets the elements of the matrix from the given array. * @param {Array} array - The matrix elements in column-major order. * @param {number} [offset=0] - Index of the first element in the array. * @returns {Matrix4} A reference to this matrix. */ fromArray(array, offset = 0) { for (let i = 0; i < 16; i++) { this.elements[i] = array[i + offset]; } return this; } /** * Writes the elements of this matrix to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order. * @param {number} [offset=0] - Index of the first element in the array. * @returns {Array} The matrix elements in column-major order. */ toArray(array = [], offset = 0) { const te = this.elements; array[offset] = te[0]; array[offset + 1] = te[1]; array[offset + 2] = te[2]; array[offset + 3] = te[3]; array[offset + 4] = te[4]; array[offset + 5] = te[5]; array[offset + 6] = te[6]; array[offset + 7] = te[7]; array[offset + 8] = te[8]; array[offset + 9] = te[9]; array[offset + 10] = te[10]; array[offset + 11] = te[11]; array[offset + 12] = te[12]; array[offset + 13] = te[13]; array[offset + 14] = te[14]; array[offset + 15] = te[15]; return array; } /** * Linearly interpolates between two matrix4. * @param {Matrix4} m1 * @param {Matrix4} m2 * @param {number} ratio * @returns {Matrix4} */ lerpMatrices(m1, m2, ratio) { if (ratio === 0) return this.copy(m1); if (ratio === 1) return this.copy(m2); const te = this.elements, te1 = m1.elements, te2 = m2.elements; for (let i = 0; i < 16; i++) { te[i] = te1[i] * (1 - ratio) + te2[i] * ratio; } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Matrix4.prototype.isMatrix4 = true; const _vec3_1 = new Vector3(); const _mat4_1 = new Matrix4(); const _zero = new Vector3(0, 0, 0); const _one = new Vector3(1, 1, 1); const _x = new Vector3(); const _y = new Vector3(); const _z = new Vector3(); export { Matrix4 }; ================================================ FILE: src/math/Plane.js ================================================ import { Vector3 } from './Vector3.js'; import { Matrix3 } from './Matrix3.js'; const _vec3_1 = new Vector3(); const _vec3_2 = new Vector3(); const _mat3_1 = new Matrix3(); /** * A two dimensional surface that extends infinitely in 3d space, * represented in Hessian normal form by a unit length normal vector and a constant. */ class Plane { /** * Constructs a new Plane. * @param {Vector3} [normal=Vector3(1, 0, 0)] - A unit length Vector3 defining the normal of the plane. * @param {number} [constant=0] - The signed distance from the origin to the plane. */ constructor(normal = new Vector3(1, 0, 0), constant = 0) { this.normal = normal; this.constant = constant; } /** * Solve a system of equations to find the point where the three planes intersect. * @param {Plane} p1 - The first plane. * @param {Plane} p2 - The second plane. * @param {Plane} p3 - The third plane. * @param {Vector3} target - The result will be copied into this Vector3. * @returns {Vector3} */ static intersectPlanes(p1, p2, p3, target) { // Create the matrix using the normals of the planes as rows _mat3_1.set( p1.normal.x, p1.normal.y, p1.normal.z, p2.normal.x, p2.normal.y, p2.normal.z, p3.normal.x, p3.normal.y, p3.normal.z ); // Create the vector using the constants of the planes target.set(-p1.constant, -p2.constant, -p3.constant); // Solve for X by applying the inverse matrix to vector target.applyMatrix3(_mat3_1.invert()); return target; } /** * Sets this plane's normal and constant properties by copying the values from the given normal. * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane. * @param {number} constant - the signed distance from the origin to the plane. Default is 0. * @returns {Plane} */ set(normal, constant) { this.normal.copy(normal); this.constant = constant; return this; } /** * Set the individual components that define the plane. * @param {number} x - x value of the unit length normal vector. * @param {number} y - y value of the unit length normal vector. * @param {number} z - z value of the unit length normal vector. * @param {number} w - the value of the plane's constant property. * @returns {Plane} */ setComponents(x, y, z, w) { this.normal.set(x, y, z); this.constant = w; return this; } /** * Sets the plane's properties as defined by a normal and an arbitrary coplanar point. * @param {Vector3} normal - a unit length Vector3 defining the normal of the plane. * @param {Vector3} point - Vector3 * @returns {Plane} */ setFromNormalAndCoplanarPoint(normal, point) { this.normal.copy(normal); this.constant = -point.dot(this.normal); return this; } /** * Defines the plane based on the 3 provided points. * The winding order is assumed to be counter-clockwise, and determines the direction of the normal. * @param {Vector3} a - first point on the plane. * @param {Vector3} b - second point on the plane. * @param {Vector3} c - third point on the plane. * @returns {Plane} */ setFromCoplanarPoints(a, b, c) { const normal = _vec3_1.subVectors(c, b).cross(_vec3_2.subVectors(a, b)).normalize(); // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? this.setFromNormalAndCoplanarPoint(normal, a); return this; } /** * Normalizes the normal vector, and adjusts the constant value accordingly. * @returns {Plane} */ normalize() { // Note: will lead to a divide by zero if the plane is invalid. const inverseNormalLength = 1.0 / this.normal.getLength(); this.normal.multiplyScalar(inverseNormalLength); this.constant *= inverseNormalLength; return this; } /** * Returns the signed distance from the point to the plane. * @param {Vector3} point * @returns {number} */ distanceToPoint(point) { return this.normal.dot(point) + this.constant; } /** * Projects a point onto the plane. * @param {Vector3} point - the Vector3 to project onto the plane. * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ projectPoint(point, target = new Vector3()) { return target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point)); } /** * Reflects a point through the plane. * @param {Vector3} point - the Vector3 to reflect through the plane. * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ mirrorPoint(point, target = new Vector3()) { const distance = this.distanceToPoint(point); return target.copy(point).addScaledVector(this.normal, -2 * distance); } /** * Returns a Vector3 coplanar to the plane, by calculating the projection of the normal vector at the origin onto the plane. * @param {Vector3} [target] * @returns {Vector3} */ coplanarPoint(target = new Vector3()) { return target.copy(this.normal).multiplyScalar(-this.constant); } /** * Returns a new plane with the same normal and constant as this one. * @returns {Plane} */ clone() { return new Plane().copy(this); } /** * Copies the values of the passed plane's normal and constant properties to this plane. * @param {Plane} plane * @returns {Plane} */ copy(plane) { this.normal.copy(plane.normal); this.constant = plane.constant; return this; } /** * Apply a Matrix4 to the plane. The matrix must be an affine, homogeneous transform. * @param {Matrix4} matrix - the Matrix4 to apply. * @param {Matrix3} [optionalNormalMatrix] - (optional) pre-computed normal Matrix3 of the Matrix4 being applied. * @returns {Plane} */ applyMatrix4(matrix, optionalNormalMatrix) { const normalMatrix = optionalNormalMatrix || _mat3_1.setFromMatrix4(matrix).invert().transpose(); const referencePoint = this.coplanarPoint(_vec3_1).applyMatrix4(matrix); const normal = this.normal.applyMatrix3(normalMatrix).normalize(); this.constant = -referencePoint.dot(normal); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Plane.prototype.isPlane = true; export { Plane }; ================================================ FILE: src/math/Quaternion.js ================================================ import { MathUtils } from './MathUtils.js'; import { Matrix4 } from './Matrix4.js'; /** * Class for representing a Quaternion. */ class Quaternion { /** * Constructs a new quaternion. * @param {number} [x=0] - The x value of this quaternion. * @param {number} [y=0] - The y value of this quaternion. * @param {number} [z=0] - The z value of this quaternion. * @param {number} [w=1] - The w value of this quaternion. */ constructor(x = 0, y = 0, z = 0, w = 1) { this._x = x; this._y = y; this._z = z; this._w = w; } /** * Interpolates between two quaternions via SLERP. This implementation assumes the * quaternion data are managed in flat arrays. * @param {Array} dst - The destination array. * @param {number} dstOffset - An offset into the destination array. * @param {Array} src0 - The source array of the first quaternion. * @param {number} srcOffset0 - An offset into the first source array. * @param {Array} src1 - The source array of the second quaternion. * @param {number} srcOffset1 - An offset into the second source array. * @param {number} t - The interpolation factor in the range `[0,1]`. * @see {@link Quaternion#slerp} */ static slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) { let x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3]; let x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3]; if (t <= 0) { dst[dstOffset + 0] = x0; dst[dstOffset + 1] = y0; dst[dstOffset + 2] = z0; dst[dstOffset + 3] = w0; return; } if (t >= 1) { dst[dstOffset + 0] = x1; dst[dstOffset + 1] = y1; dst[dstOffset + 2] = z1; dst[dstOffset + 3] = w1; return; } if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { let dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1; if (dot < 0) { x1 = -x1; y1 = -y1; z1 = -z1; w1 = -w1; dot = -dot; } let s = 1 - t; if (dot < 0.9995) { // slerp const theta = Math.acos(dot); const sin = Math.sin(theta); s = Math.sin(s * theta) / sin; t = Math.sin(t * theta) / sin; x0 = x0 * s + x1 * t; y0 = y0 * s + y1 * t; z0 = z0 * s + z1 * t; w0 = w0 * s + w1 * t; } else { // for small angles, lerp then normalize x0 = x0 * s + x1 * t; y0 = y0 * s + y1 * t; z0 = z0 * s + z1 * t; w0 = w0 * s + w1 * t; const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0); x0 *= f; y0 *= f; z0 *= f; w0 *= f; } } dst[dstOffset] = x0; dst[dstOffset + 1] = y0; dst[dstOffset + 2] = z0; dst[dstOffset + 3] = w0; } /** * Multiplies two quaternions. This implementation assumes the quaternion data are managed * in flat arrays. * @param {Array} dst - The destination array. * @param {number} dstOffset - An offset into the destination array. * @param {Array} src0 - The source array of the first quaternion. * @param {number} srcOffset0 - An offset into the first source array. * @param {Array} src1 - The source array of the second quaternion. * @param {number} srcOffset1 - An offset into the second source array. * @returns {Array} The destination array. * @see {@link Quaternion#multiplyQuaternions} */ static multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) { const x0 = src0[srcOffset0]; const y0 = src0[srcOffset0 + 1]; const z0 = src0[srcOffset0 + 2]; const w0 = src0[srcOffset0 + 3]; const x1 = src1[srcOffset1]; const y1 = src1[srcOffset1 + 1]; const z1 = src1[srcOffset1 + 2]; const w1 = src1[srcOffset1 + 3]; dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; return dst; } /** * The x value of this quaternion. * @type {number} * @default 0 */ get x() { return this._x; } set x(value) { this._x = value; this.onChangeCallback(); } /** * The y value of this quaternion. * @type {number} * @default 0 */ get y() { return this._y; } set y(value) { this._y = value; this.onChangeCallback(); } /** * The z value of this quaternion. * @type {number} * @default 0 */ get z() { return this._z; } set z(value) { this._z = value; this.onChangeCallback(); } /** * The w value of this quaternion. * @type {number} * @default 1 */ get w() { return this._w; } set w(value) { this._w = value; this.onChangeCallback(); } /** * Sets the quaternion components. * @param {number} x - The x value of this quaternion. * @param {number} y - The y value of this quaternion. * @param {number} z - The z value of this quaternion. * @param {number} w - The w value of this quaternion. * @returns {Quaternion} A reference to this quaternion. */ set(x, y, z, w) { this._x = x; this._y = y; this._z = z; this._w = w; this.onChangeCallback(); return this; } /** * Returns a new quaternion with copied values from this instance. * @returns {Quaternion} A clone of this instance. */ clone() { return new Quaternion(this._x, this._y, this._z, this._w); } /** * Copies the values of the given quaternion to this instance. * @param {Quaternion} quaternion - The quaternion to copy. * @returns {Quaternion} A reference to this quaternion. */ copy(quaternion) { this._x = quaternion.x; this._y = quaternion.y; this._z = quaternion.z; this._w = quaternion.w; this.onChangeCallback(); return this; } /** * Sets this quaternion from the rotation specified by the given * Euler angles. * @param {Euler} euler - The Euler angles. * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. * @returns {Quaternion} A reference to this quaternion. */ setFromEuler(euler, update = true) { const c1 = Math.cos(euler._x / 2); const c2 = Math.cos(euler._y / 2); const c3 = Math.cos(euler._z / 2); const s1 = Math.sin(euler._x / 2); const s2 = Math.sin(euler._y / 2); const s3 = Math.sin(euler._z / 2); const order = euler._order; if (order === 'XYZ') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'YXZ') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if (order === 'ZXY') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'ZYX') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if (order === 'YZX') { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if (order === 'XZY') { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } if (update === true) this.onChangeCallback(); return this; } /** * Sets this quaternion from the given axis and angle. * @param {Vector3} axis - The normalized axis. * @param {number} angle - The angle in radians. * @returns {Quaternion} A reference to this quaternion. */ setFromAxisAngle(axis, angle) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm const halfAngle = angle / 2, s = Math.sin(halfAngle); this._x = axis.x * s; this._y = axis.y * s; this._z = axis.z * s; this._w = Math.cos(halfAngle); this.onChangeCallback(); return this; } /** * Sets this quaternion from the given rotation matrix. * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled). * @returns {Quaternion} A reference to this quaternion. */ setFromRotationMatrix(m) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) const te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10], trace = m11 + m22 + m33; let s; if (trace > 0) { s = 0.5 / Math.sqrt(trace + 1.0); this._w = 0.25 / s; this._x = (m32 - m23) * s; this._y = (m13 - m31) * s; this._z = (m21 - m12) * s; } else if (m11 > m22 && m11 > m33) { s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33); this._w = (m32 - m23) / s; this._x = 0.25 * s; this._y = (m12 + m21) / s; this._z = (m13 + m31) / s; } else if (m22 > m33) { s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33); this._w = (m13 - m31) / s; this._x = (m12 + m21) / s; this._y = 0.25 * s; this._z = (m23 + m32) / s; } else { s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22); this._w = (m21 - m12) / s; this._x = (m13 + m31) / s; this._y = (m23 + m32) / s; this._z = 0.25 * s; } this.onChangeCallback(); return this; } /** * Sets this quaternion to the rotation required to rotate the direction vector * `vFrom` to the direction vector `vTo`. * @param {Vector3} vFrom - The first (normalized) direction vector. * @param {Vector3} vTo - The second (normalized) direction vector. * @returns {Quaternion} A reference to this quaternion. */ setFromUnitVectors(vFrom, vTo) { // assumes direction vectors vFrom and vTo are normalized let r = vFrom.dot(vTo) + 1; if (r < 1e-8) { // vFrom and vTo point in opposite directions r = 0; if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) { this._x = -vFrom.y; this._y = vFrom.x; this._z = 0; this._w = r; } else { this._x = 0; this._y = -vFrom.z; this._z = vFrom.y; this._w = r; } } else { // crossVectors(vFrom, vTo); // inlined to avoid cyclic dependency on Vector3 this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; this._w = r; } return this.normalize(); } /** * Returns the angle between this quaternion and the given one in radians. * @param {Quaternion} q - The quaternion to compute the angle with. * @returns {number} The angle in radians. */ angleTo(q) { return 2 * Math.acos(Math.abs(MathUtils.clamp(this.dot(q), -1, 1))); } /** * Sets this quaternion to the identity quaternion; that is, to the * quaternion that represents "no rotation". * @returns {Quaternion} A reference to this quaternion. */ identity() { return this.set(0, 0, 0, 1); } /** * Returns the rotational conjugate of this quaternion. The conjugate of a * quaternion represents the same rotation in the opposite direction about * the rotational axis. * @returns {Quaternion} A reference to this quaternion. */ conjugate() { this._x *= -1; this._y *= -1; this._z *= -1; this.onChangeCallback(); return this; } /** * Calculates the dot product of this quaternion and the given one. * @param {Quaternion} v - The quaternion to compute the dot product with. * @returns {number} The result of the dot product. */ dot(v) { return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; } /** * Computes the squared Euclidean length (straight-line length) of this quaternion, * considered as a 4 dimensional vector. This can be useful if you are comparing the * lengths of two quaternions, as this is a slightly more efficient calculation than * {@link Quaternion#length}. * @returns {number} The squared Euclidean length. */ lengthSq() { return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; } /** * Computes the Euclidean length (straight-line length) of this quaternion, * considered as a 4 dimensional vector. * @returns {number} The Euclidean length. */ length() { return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w); } /** * Normalizes this quaternion - that is, calculated the quaternion that performs * the same rotation as this one, but has a length equal to `1`. * @returns {Quaternion} A reference to this quaternion. */ normalize() { let l = this.length(); if (l === 0) { this._x = 0; this._y = 0; this._z = 0; this._w = 1; } else { l = 1 / l; this._x = this._x * l; this._y = this._y * l; this._z = this._z * l; this._w = this._w * l; } this.onChangeCallback(); return this; } /** * Multiplies this quaternion by the given one. * @param {Quaternion} q - The quaternion. * @returns {Quaternion} A reference to this quaternion. */ multiply(q) { return this.multiplyQuaternions(this, q); } /** * Pre-multiplies this quaternion by the given one. * @param {Quaternion} q - The quaternion. * @returns {Quaternion} A reference to this quaternion. */ premultiply(q) { return this.multiplyQuaternions(q, this); } /** * Multiplies the given quaternions and stores the result in this instance. * @param {Quaternion} a - The first quaternion. * @param {Quaternion} b - The second quaternion. * @returns {Quaternion} A reference to this quaternion. */ multiplyQuaternions(a, b) { // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; this.onChangeCallback(); return this; } /** * Linearly interpolates between two quaternions. * @param {Quaternion} q1 * @param {Quaternion} q2 * @param {number} ratio * @returns {Quaternion} */ lerpQuaternions(q1, q2, ratio) { if (ratio === 0) return this.copy(q1); if (ratio === 1) return this.copy(q2); const w1 = q1._w, x1 = q1._x, y1 = q1._y, z1 = q1._z; let w2 = q2._w, x2 = q2._x, y2 = q2._y, z2 = q2._z; const dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2; // shortest direction if (dot < 0) { w2 = -w2; x2 = -x2; y2 = -y2; z2 = -z2; } this._w = w1 + ratio * (w2 - w1); this._x = x1 + ratio * (x2 - x1); this._y = y1 + ratio * (y2 - y1); this._z = z1 + ratio * (z2 - z1); const len = 1.0 / Math.sqrt(this._w * this._w + this._x * this._x + this._y * this._y + this._z * this._z); this._w *= len; this._x *= len; this._y *= len; this._z *= len; this.onChangeCallback(); return this; } /** * Performs a spherical linear interpolation between quaternions. * @param {Quaternion} qb - The target quaternion. * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. * @returns {Quaternion} A reference to this quaternion. */ slerp(qb, t) { if (t <= 0) return this; if (t >= 1) return this.copy(qb); // copy calls onChangeCallback() let x = qb._x, y = qb._y, z = qb._z, w = qb._w; let dot = this.dot(qb); if (dot < 0) { x = -x; y = -y; z = -z; w = -w; dot = -dot; } let s = 1 - t; if (dot < 0.9995) { // slerp const theta = Math.acos(dot); const sin = Math.sin(theta); s = Math.sin(s * theta) / sin; t = Math.sin(t * theta) / sin; this._x = this._x * s + x * t; this._y = this._y * s + y * t; this._z = this._z * s + z * t; this._w = this._w * s + w * t; this.onChangeCallback(); } else { // for small angles, lerp then normalize this._x = this._x * s + x * t; this._y = this._y * s + y * t; this._z = this._z * s + z * t; this._w = this._w * s + w * t; this.normalize(); // normalize calls onChangeCallback() } return this; } /** * Performs a spherical linear interpolation between the given quaternions * and stores the result in this quaternion. * @param {Quaternion} qa - The source quaternion. * @param {Quaternion} qb - The target quaternion. * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. * @returns {Quaternion} A reference to this quaternion. */ slerpQuaternions(qa, qb, t) { return this.copy(qa).slerp(qb, t); } /** * Returns `true` if this quaternion is equal with the given one. * @param {Quaternion} quaternion - The quaternion to test for equality. * @returns {boolean} Whether this quaternion is equal with the given one. */ equals(quaternion) { return (quaternion._x === this._x) && (quaternion._y === this._y) && (quaternion._z === this._z) && (quaternion._w === this._w); } /** * Sets this quaternion's components from the given array. * @param {Array} array - An array holding the quaternion component values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Quaternion} A reference to this quaternion. */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2], w = array[offset + 3]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); w = MathUtils.denormalize(w, array); } this._x = x; this._y = y; this._z = z; this._w = w; this.onChangeCallback(); return this; } /** * Writes the components of this quaternion to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the quaternion components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - If true, normalize the values, and array should be a typed array. * @returns {Quaternion} The quaternion components. */ toArray(array = [], offset = 0, normalize = false) { let x = this._x, y = this._y, z = this._z, w = this._w; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); w = MathUtils.normalize(w, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; array[offset + 3] = w; return array; } /** * Convert the current quaternion to a matrix4. * @param {Matrix4} target - The target matrix to write the quaternion data to. * @returns {Matrix4} The target matrix with the quaternion data written to it. */ toMatrix4(target = new Matrix4()) { const ele = target.elements; const xy2 = 2.0 * this._x * this._y, xz2 = 2.0 * this._x * this._z, xw2 = 2.0 * this._x * this._w; const yz2 = 2.0 * this._y * this._z, yw2 = 2.0 * this._y * this._w, zw2 = 2.0 * this._z * this._w; const xx = this._x * this._x, yy = this._y * this._y, zz = this._z * this._z, ww = this._w * this._w; ele[0] = xx - yy - zz + ww; ele[4] = xy2 - zw2; ele[8] = xz2 + yw2; ele[12] = 0; ele[1] = xy2 + zw2; ele[5] = -xx + yy - zz + ww; ele[9] = yz2 - xw2; ele[13] = 0; ele[2] = xz2 - yw2; ele[6] = yz2 + xw2; ele[10] = -xx - yy + zz + ww; ele[14] = 0; ele[3] = 0.0; ele[7] = 0.0; ele[11] = 0; ele[15] = 1; return target; } /** * Registers a callback that is called whenever the quaternion's * angle value changes. * @param {Function} callback - When the Quaternion angle value changes, the callback method is triggered * @returns {Quaternion} A reference to this quaternion. */ onChange(callback) { this.onChangeCallback = callback; return this; } onChangeCallback() {} * [Symbol.iterator]() { yield this._x; yield this._y; yield this._z; yield this._w; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Quaternion.prototype.isQuaternion = true; export { Quaternion }; ================================================ FILE: src/math/Ray.js ================================================ import { Vector3 } from './Vector3.js'; const _vec3_1 = new Vector3(); const _diff = new Vector3(); const _edge1 = new Vector3(); const _edge2 = new Vector3(); const _normal = new Vector3(); /** * A ray that emits from an origin in a certain direction. This is used by * {@link Raycaster} to assist with raycasting. Raycasting is used for * mouse picking (working out what objects in the 3D space the mouse is over) * amongst other things. */ class Ray { /** * Constructs a new ray. * @param {Vector3} [origin=(0,0,0)] - The origin of the ray. * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray. */ constructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) { /** * The origin of the ray. * @type {Vector3} */ this.origin = origin; /** * The (normalized) direction of the ray. * @type {Vector3} */ this.direction = direction; } /** * Sets the ray's components by copying the given values. * @param {Vector3} origin - The origin. * @param {Vector3} direction - The direction. * @returns {Ray} A reference to this ray. */ set(origin, direction) { this.origin.copy(origin); this.direction.copy(direction); return this; } /** * Copies the values of the given ray to this instance. * @param {Ray} ray - The ray to copy. * @returns {Ray} A reference to this ray. */ copy(ray) { this.origin.copy(ray.origin); this.direction.copy(ray.direction); return this; } /** * Returns a vector that is located at a given distance along this ray. * @param {number} t - The distance along the ray to retrieve a position for. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {Vector3} A position on the ray. */ at(t, target = new Vector3()) { return target.copy(this.origin).addScaledVector(this.direction, t); } /** * Shift the origin of this ray along its direction by the given distance. * @param {number} t - The distance along the ray to interpolate. * @returns {Ray} A reference to this ray. */ recast(t) { this.origin.copy(this.at(t, _vec3_1)); return this; } /** * Returns the point along this ray that is closest to the given point. * @param {Vector3} point - A point in 3D space to get the closet location on the ray for. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {Vector3} The closest point on this ray. */ closestPointToPoint(point, target) { target.subVectors(point, this.origin); const directionDistance = target.dot(this.direction); if (directionDistance < 0) { return target.copy(this.origin); } return target.copy(this.origin).addScaledVector(this.direction, directionDistance); } /** * Returns the distance of the closest approach between this ray and the given point. * @param {Vector3} point - A point in 3D space to compute the distance to. * @returns {number} The distance. */ distanceToPoint(point) { return Math.sqrt(this.distanceSqToPoint(point)); } /** * Returns the squared distance of the closest approach between this ray and the given point. * @param {Vector3} point - A point in 3D space to compute the distance to. * @returns {number} The squared distance. */ distanceSqToPoint(point) { const directionDistance = _vec3_1.subVectors(point, this.origin).dot(this.direction); if (directionDistance < 0) { return this.origin.distanceToSquared(point); } _vec3_1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin); return _vec3_1.distanceToSquared(point); } /** * Intersects this ray with the given sphere, returning the intersection * point or `null` if there is no intersection. * @param {Sphere} sphere - The sphere to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectSphere(sphere, target) { _vec3_1.subVectors(sphere.center, this.origin); const tca = _vec3_1.dot(this.direction); const d2 = _vec3_1.dot(_vec3_1) - tca * tca; const radius2 = sphere.radius * sphere.radius; if (d2 > radius2) { return null; } const thc = Math.sqrt(radius2 - d2); // t0 = first intersect point - entrance on front of sphere const t0 = tca - thc; // t1 = second intersect point - exit point on back of sphere const t1 = tca + thc; // test to see if both t0 and t1 are behind the ray - if so, return null if (t0 < 0 && t1 < 0) { return null; } // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, // in order to always return an intersect point that is in front of the ray. if (t0 < 0) { return this.at(t1, target); } // else t0 is in front of the ray, so return the first collision point scaled by t0 return this.at(t0, target); } /** * Returns `true` if this ray intersects with the given sphere. * @param {Sphere} sphere - The sphere to intersect. * @returns {boolean} Whether this ray intersects with the given sphere or not. */ intersectsSphere(sphere) { if (sphere.radius < 0) return false; // handle empty spheres return this.distanceSqToPoint(sphere.center) <= (sphere.radius * sphere.radius); } /** * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray * does not intersect with the plane. * @param {Plane} plane - The plane to compute the distance to. * @returns {?number} Whether this ray intersects with the given sphere or not. */ distanceToPlane(plane) { const denominator = plane.normal.dot(this.direction); if (denominator === 0) { // line is coplanar, return origin if (plane.distanceToPoint(this.origin) === 0) { return 0; } // Null is preferable to undefined since undefined means.... it is undefined return null; } const t = -(this.origin.dot(plane.normal) + plane.constant) / denominator; // Return if the ray never intersects the plane return t >= 0 ? t : null; } /** * Intersects this ray with the given plane, returning the intersection * point or `null` if there is no intersection. * @param {Plane} plane - The plane to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectPlane(plane, target) { const t = this.distanceToPlane(plane); if (t === null) { return null; } return this.at(t, target); } /** * Returns `true` if this ray intersects with the given plane. * @param {Plane} plane - The plane to intersect. * @returns {boolean} Whether this ray intersects with the given plane or not. */ intersectsPlane(plane) { // check if the ray lies on the plane first const distToPoint = plane.distanceToPoint(this.origin); if (distToPoint === 0) { return true; } const denominator = plane.normal.dot(this.direction); if (denominator * distToPoint < 0) { return true; } // ray origin is behind the plane (and is pointing behind it) return false; } /** * Intersects this ray with the given bounding box, returning the intersection * point or `null` if there is no intersection. * @param {Box3} box - The box to intersect. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectBox(box, target) { let tmin, tmax, tymin, tymax, tzmin, tzmax; const invdirx = 1 / this.direction.x, invdiry = 1 / this.direction.y, invdirz = 1 / this.direction.z; const origin = this.origin; if (invdirx >= 0) { tmin = (box.min.x - origin.x) * invdirx; tmax = (box.max.x - origin.x) * invdirx; } else { tmin = (box.max.x - origin.x) * invdirx; tmax = (box.min.x - origin.x) * invdirx; } if (invdiry >= 0) { tymin = (box.min.y - origin.y) * invdiry; tymax = (box.max.y - origin.y) * invdiry; } else { tymin = (box.max.y - origin.y) * invdiry; tymax = (box.min.y - origin.y) * invdiry; } if ((tmin > tymax) || (tymin > tmax)) return null; // These lines also handle the case where tmin or tmax is NaN // (result of 0 * Infinity). x !== x returns true if x is NaN if (tymin > tmin || tmin !== tmin) tmin = tymin; if (tymax < tmax || tmax !== tmax) tmax = tymax; if (invdirz >= 0) { tzmin = (box.min.z - origin.z) * invdirz; tzmax = (box.max.z - origin.z) * invdirz; } else { tzmin = (box.max.z - origin.z) * invdirz; tzmax = (box.min.z - origin.z) * invdirz; } if ((tmin > tzmax) || (tzmin > tmax)) return null; if (tzmin > tmin || tmin !== tmin) tmin = tzmin; if (tzmax < tmax || tmax !== tmax) tmax = tzmax; // return point closest to the ray (positive side) if (tmax < 0) return null; return this.at(tmin >= 0 ? tmin : tmax, target); } /** * Returns `true` if this ray intersects with the given box. * @param {Box3} box - The box to intersect. * @returns {boolean} Whether this ray intersects with the given box or not. */ intersectsBox(box) { return this.intersectBox(box, _vec3_1) !== null; } /** * Intersects this ray with the given triangle, returning the intersection * point or `null` if there is no intersection. * @param {Vector3} a - The first vertex of the triangle. * @param {Vector3} b - The second vertex of the triangle. * @param {Vector3} c - The third vertex of the triangle. * @param {boolean} backfaceCulling - Whether to use backface culling or not. * @param {Vector3} target - The target vector that is used to store the method's result. * @returns {?Vector3} The intersection point. */ intersectTriangle(a, b, c, backfaceCulling, target) { // Compute the offset origin, edges, and normal. // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h _edge1.subVectors(b, a); _edge2.subVectors(c, a); _normal.crossVectors(_edge1, _edge2); // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) let DdN = this.direction.dot(_normal); let sign; if (DdN > 0) { if (backfaceCulling) return null; sign = 1; } else if (DdN < 0) { sign = -1; DdN = -DdN; } else { return null; } _diff.subVectors(this.origin, a); const DdQxE2 = sign * this.direction.dot(_edge2.crossVectors(_diff, _edge2)); // b1 < 0, no intersection if (DdQxE2 < 0) { return null; } const DdE1xQ = sign * this.direction.dot(_edge1.cross(_diff)); // b2 < 0, no intersection if (DdE1xQ < 0) { return null; } // b1+b2 > 1, no intersection if (DdQxE2 + DdE1xQ > DdN) { return null; } // Line intersects triangle, check if ray does. const QdN = -sign * _diff.dot(_normal); // t < 0, no intersection if (QdN < 0) { return null; } // Ray intersects triangle. return this.at(QdN / DdN, target); } /** * Transforms this ray with the given 4x4 transformation matrix. * @param {Matrix4} matrix4 - The transformation matrix. * @returns {Ray} A reference to this ray. */ applyMatrix4(matrix4) { this.origin.applyMatrix4(matrix4); this.direction.transformDirection(matrix4); return this; } /** * Returns `true` if this ray is equal with the given one. * @param {Ray} ray - The ray to test for equality. * @returns {boolean} Whether this ray is equal with the given one. */ equals(ray) { return ray.origin.equals(this.origin) && ray.direction.equals(this.direction); } /** * Returns a new ray with copied values from this instance. * @returns {Ray} A clone of this instance. */ clone() { return new this.constructor().copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Ray.prototype.isRay = true; export { Ray }; ================================================ FILE: src/math/Sphere.js ================================================ import { Vector3 } from './Vector3.js'; import { Box3 } from './Box3.js'; const _box3_1 = new Box3(); const _vec3_1 = new Vector3(); const _vec3_2 = new Vector3(); /** * A sphere defined by a center and radius. */ class Sphere { /** * @param {Vector3} [center=Vector3(0, 0, 0)] - center of the sphere. * @param {number} [radius=-1] - radius of the sphere. */ constructor(center = new Vector3(), radius = -1) { this.center = center; this.radius = radius; } /** * Sets the center and radius properties of this sphere. * @param {Vector3} center - center of the sphere. * @param {number} radius - radius of the sphere. * @returns {Sphere} */ set(center, radius) { this.center.copy(center); this.radius = radius; return this; } /** * Computes the minimum bounding sphere for an array of points. * If optionalCenteris given, it is used as the sphere's center. * Otherwise, the center of the axis-aligned bounding box encompassing points is calculated. * @param {Vector3[]} points - an Array of Vector3 positions. * @param {Vector3} [optionalCenter] - the center of the sphere. * @returns {Sphere} */ setFromPoints(points, optionalCenter) { const center = this.center; if (optionalCenter !== undefined) { center.copy(optionalCenter); } else { _box3_1.setFromPoints(points).getCenter(center); } let maxRadiusSq = 0; for (let i = 0, il = points.length; i < il; i++) { maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i])); } this.radius = Math.sqrt(maxRadiusSq); return this; } /** * Computes the minimum bounding sphere for an array of points. * @param {number[]} array - An Array of position data that the resulting sphere will envelop. * @param {number} [gap=3] - The number of elements between the start of each position in the array. * @param {number} [offset=0] - The offset in each gap where the position data starts. * @param {boolean} [denormalize=false] - whether to denormalize the values in the array. * @returns {Sphere} A reference to this sphere. */ setFromArray(array, gap = 3, offset = 0, denormalize = false) { const center = this.center; _box3_1.setFromArray(array, gap, offset, denormalize).getCenter(center); let maxRadiusSq = 0; for (let i = 0, l = array.length; i < l; i += gap) { _vec3_1.fromArray(array, i + offset, denormalize); maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vec3_1)); } this.radius = Math.sqrt(maxRadiusSq); return this; } /** * Transforms this sphere with the provided Matrix4. * @param {Matrix4} matrix - the Matrix4 to apply * @returns {Matrix4} */ applyMatrix4(matrix) { this.center.applyMatrix4(matrix); this.radius = this.radius * matrix.getMaxScaleOnAxis(); return this; } /** * Returns aMinimum Bounding Box for the sphere. * @param {Box3} target — the result will be copied into this Box3. * @returns {Box3} */ getBoundingBox(target) { if (this.isEmpty()) { // Empty sphere produces empty bounding box target.makeEmpty(); return target; } target.set(this.center, this.center); target.expandByScalar(this.radius); return target; } /** * Checks to see if the sphere is empty (the radius set to a negative number). * Spheres with a radius of 0 contain only their center point and are not considered to be empty. * @returns {boolean} */ isEmpty() { return this.radius < 0; } /** * Makes the sphere empty by setting center to (0, 0, 0) and radius to -1. * @returns {Sphere} */ makeEmpty() { this.center.set(0, 0, 0); this.radius = -1; return this; } /** * Checks to see if the sphere contains the provided point inclusive of the surface of the sphere. * @param {Vector3} point - The point to check for containment. * @returns {boolean} */ containsPoint(point) { return (point.distanceToSquared(this.center) <= (this.radius * this.radius)); } /** * Returns the closest distance from the boundary of the sphere to the point. * If the sphere contains the point, the distance will be negative. * @param {Vector3} point - The point to calculate the distance to. * @returns {number} */ distanceToPoint(point) { return (point.distanceTo(this.center) - this.radius); } /** * Expands the boundaries of this sphere to include point. * @param {Vector3} point - The vector3 that should be included in the sphere. * @returns {Sphere} */ expandByPoint(point) { if (this.isEmpty()) { this.center.copy(point); this.radius = 0; return this; } _vec3_1.subVectors(point, this.center); const lengthSq = _vec3_1.getLengthSquared(); if (lengthSq > (this.radius * this.radius)) { // calculate the minimal sphere const length = Math.sqrt(lengthSq); const delta = (length - this.radius) * 0.5; this.center.addScaledVector(_vec3_1, delta / length); this.radius += delta; } return this; } /** * Expands this sphere to enclose both the original sphere and the given sphere. * @param {Sphere} sphere - The sphere to include. * @returns {Sphere} A reference to this sphere. */ union(sphere) { if (sphere.isEmpty()) { return this; } if (this.isEmpty()) { this.copy(sphere); return this; } if (this.center.equals(sphere.center)) { this.radius = Math.max(this.radius, sphere.radius); } else { _vec3_2.subVectors(sphere.center, this.center).normalize().multiplyScalar(sphere.radius); this.expandByPoint(_vec3_1.addVectors(sphere.center, _vec3_2)); this.expandByPoint(_vec3_1.addVectors(sphere.center, _vec3_2)); } return this; } /** * Returns a new sphere with the same center and radius as this one. * @returns {Sphere} */ clone() { return new Sphere().copy(this); } /** * Copies the values of the passed sphere's center and radius properties to this sphere. * @param {Sphere} sphere * @returns {Sphere} */ copy(sphere) { this.center.copy(sphere.center); this.radius = sphere.radius; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Sphere.prototype.isSphere = true; export { Sphere }; ================================================ FILE: src/math/Spherical.js ================================================ import { MathUtils } from './MathUtils.js'; /** * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system * * The poles (phi) are at the positive and negative y axis. * The equator starts at positive z. */ class Spherical { /** * @param {number} [radius=1] - the radius, or the Euclidean distance (straight-line distance) from the point to the origin. Default is 1.0. * @param {number} [phi=0] - - polar angle in radians from the y (up) axis. Default is 0. * @param {number} [theta=0] - - equator angle in radians around the y (up) axis. Default is 0. */ constructor(radius = 1, phi = 0, theta = 0) { this.radius = radius; this.phi = phi; // up / down towards top and bottom pole this.theta = theta; // around the equator of the sphere } /** * Sets values of this spherical's radius, phi and theta properties. * @param {number} radius * @param {number} phi * @param {number} theta * @returns {Spherical} */ set(radius, phi, theta) { this.radius = radius; this.phi = phi; this.theta = theta; return this; } /** * Copies the values of the passed Spherical's radius, phi and theta properties to this spherical. * @param {Spherical} other * @returns {Spherical} */ copy(other) { this.radius = other.radius; this.phi = other.phi; this.theta = other.theta; return this; } /** * Returns a new spherical with the same radius, phi and theta properties as this one. * @returns {Spherical} */ clone() { return new Spherical().copy(this); } /** * Restrict phi to be betwee EPS and PI-EPS. * @returns {Spherical} */ makeSafe() { const EPS = 0.000001; this.phi = MathUtils.clamp(this.phi, EPS, Math.PI - EPS); return this; } /** * Sets values of this spherical's radius, phi and theta properties from the Vector3. * @param {Vector3} vec3 * @returns {Spherical} */ setFromVector3(vec3) { this.radius = vec3.getLength(); if (this.radius === 0) { this.theta = 0; this.phi = 0; } else { this.theta = Math.atan2(vec3.x, vec3.z); // equator angle around y-up axis this.phi = Math.acos(MathUtils.clamp(vec3.y / this.radius, -1, 1)); // polar angle } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Spherical.prototype.isSpherical = true; export { Spherical }; ================================================ FILE: src/math/SphericalHarmonics3.js ================================================ import { Vector3 } from './Vector3.js'; /** * Primary reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf * Secondary reference: https://www.ppsloan.org/publications/StupidSH36.pdf * 3-band SH defined by 9 coefficients. */ class SphericalHarmonics3 { /** * Creates a new instance of SphericalHarmonics3. */ constructor() { /** * An array holding the (9) SH coefficients. * A single coefficient is represented as an instance of Vector3. * @type {Array} */ this.coefficients = []; for (let i = 0; i < 9; i++) { this.coefficients.push(new Vector3()); } } /** * Set this sphericalHarmonics3 value. * @param {Vector3[]} coefficients An array of SH coefficients. * @returns {SphericalHarmonics3} */ set(coefficients) { for (let i = 0; i < 9; i++) { this.coefficients[i].copy(coefficients[i]); } return this; } /** * Sets all SH coefficients to 0. * @returns {SphericalHarmonics3} */ zero() { for (let i = 0; i < 9; i++) { this.coefficients[i].set(0, 0, 0); } return this; } /** * Returns the radiance in the direction of the given normal. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {Vector3} target - The result vector. * @returns {Vector3} */ getAt(normal, target) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; const coeff = this.coefficients; // band 0 target.copy(coeff[0]).multiplyScalar(0.282095); // band 1 target.addScaledVector(coeff[1], 0.488603 * y); target.addScaledVector(coeff[2], 0.488603 * z); target.addScaledVector(coeff[3], 0.488603 * x); // band 2 target.addScaledVector(coeff[4], 1.092548 * (x * y)); target.addScaledVector(coeff[5], 1.092548 * (y * z)); target.addScaledVector(coeff[6], 0.315392 * (3.0 * z * z - 1.0)); target.addScaledVector(coeff[7], 1.092548 * (x * z)); target.addScaledVector(coeff[8], 0.546274 * (x * x - y * y)); return target; } /** * Reference: https://graphics.stanford.edu/papers/envmap/envmap.pdf * Returns the irradiance (radiance convolved with cosine lobe) in the direction of the given normal. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {Vector3} target - The result vector. * @returns {Vector3} */ getIrradianceAt(normal, target) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; const coeff = this.coefficients; // band 0 target.copy(coeff[0]).multiplyScalar(0.886227); // π * 0.282095 // band 1 target.addScaledVector(coeff[1], 2.0 * 0.511664 * y); // ( 2 * π / 3 ) * 0.488603 target.addScaledVector(coeff[2], 2.0 * 0.511664 * z); target.addScaledVector(coeff[3], 2.0 * 0.511664 * x); // band 2 target.addScaledVector(coeff[4], 2.0 * 0.429043 * x * y); // ( π / 4 ) * 1.092548 target.addScaledVector(coeff[5], 2.0 * 0.429043 * y * z); target.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); // ( π / 4 ) * 0.315392 * 3 target.addScaledVector(coeff[7], 2.0 * 0.429043 * x * z); target.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); // ( π / 4 ) * 0.546274 return target; } /** * Adds the given SH to this instance. * @param {SphericalHarmonics3} sh - The SH to add. * @returns {SphericalHarmonics3} */ add(sh) { for (let i = 0; i < 9; i++) { this.coefficients[i].add(sh.coefficients[i]); } return this; } /** * A convenience method for performing .add() and .scale() at once. * @param {SphericalHarmonics3} sh - The SH to add. * @param {Vector3} s - The scale factor. * @returns {SphericalHarmonics3} */ addScaledSH(sh, s) { for (let i = 0; i < 9; i++) { this.coefficients[i].addScaledVector(sh.coefficients[i], s); } return this; } /** * Multiply the s to this SphericalHarmonics3. * @param {number} s - The scale factor. * @returns {SphericalHarmonics3} */ scale(s) { for (let i = 0; i < 9; i++) { this.coefficients[i].multiplyScalar(s); } return this; } /** * Linear interpolates between the given SH and this instance by the given alpha factor. * Sets this coefficients vector to be the vector linearly interpolated between v1 and v2 * where alpha is the percent distance along the line connecting the two vectors * - alpha = 0 will be v1, and alpha = 1 will be v2. * @param {SphericalHarmonics3} sh - The SH to interpolate with. * @param {number} alpha - The alpha factor. * @returns {SphericalHarmonics3} */ lerp(sh, alpha) { for (let i = 0; i < 9; i++) { this.coefficients[i].lerpVectors(this.coefficients[i], sh.coefficients[i], alpha); } return this; } /** * Returns true if the given SH and this instance have equal coefficients. * @param {SphericalHarmonics3} sh - The SH to compare with. * @returns {boolean} */ equals(sh) { for (let i = 0; i < 9; i++) { if (!this.coefficients[i].equals(sh.coefficients[i])) { return false; } } return true; } /** * Copies the given SH to this instance. * @param {SphericalHarmonics3} sh - The SH to compare with. * @returns {SphericalHarmonics3} */ copy(sh) { return this.set(sh.coefficients); } /** * Returns a new instance of SphericalHarmonics3 with equal coefficients. * @returns {SphericalHarmonics3} */ clone() { return new this.constructor().copy(this); } /** * Sets the coefficients of this instance from the given array. * @param {number[]} array - The array holding the numbers of the SH coefficients. * @param {number} [offset=0] - The array offset. * @returns {SphericalHarmonics3} */ fromArray(array, offset = 0) { const coefficients = this.coefficients; for (let i = 0; i < 9; i++) { coefficients[i].fromArray(array, offset + (i * 3)); } return this; } /** * Returns an array with the coefficients, or copies them into the provided array. * The coefficients are represented as numbers. * @param {number[]} [array] - The target array. * @param {number} [offset=0] - The array offset. * @returns {number[]} */ toArray(array = [], offset = 0) { const coefficients = this.coefficients; for (let i = 0; i < 9; i++) { coefficients[i].toArray(array, offset + (i * 3)); } return array; } /** * Computes the SH basis for the given normal vector. * @param {Vector3} normal - The normal vector (assumed to be unit length). * @param {number[]} shBasis - The resulting SH basis. */ static getBasisAt(normal, shBasis) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; // band 0 shBasis[0] = 0.282095; // band 1 shBasis[1] = 0.488603 * y; shBasis[2] = 0.488603 * z; shBasis[3] = 0.488603 * x; // band 2 shBasis[4] = 1.092548 * x * y; shBasis[5] = 1.092548 * y * z; shBasis[6] = 0.315392 * (3 * z * z - 1); shBasis[7] = 1.092548 * x * z; shBasis[8] = 0.546274 * (x * x - y * y); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SphericalHarmonics3.prototype.isSphericalHarmonics3 = true; export { SphericalHarmonics3 }; ================================================ FILE: src/math/Triangle.js ================================================ import { Vector3 } from './Vector3.js'; const _v0 = new Vector3(); const _v1 = new Vector3(); const _v2 = new Vector3(); const _v3 = new Vector3(); /** * A geometric triangle as defined by three Vector3s representing its three corners. */ class Triangle { /** * @param {Vector3} [a] - the first corner of the triangle. Default is a Vector3 at (0, 0, 0). * @param {Vector3} [b] - the second corner of the triangle. Default is a Vector3 at (0, 0, 0). * @param {Vector3} [c] - the final corner of the triangle. Default is a Vector3 at (0, 0, 0). */ constructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) { this.a = a; this.b = b; this.c = c; } /** * Calculate the normal vector of the triangle. * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @param {Vector3} [optionalTarget] * @returns {Vector3} */ static normal(a, b, c, optionalTarget) { const result = optionalTarget || new Vector3(); result.subVectors(c, b); _v0.subVectors(a, b); result.cross(_v0); const resultLengthSq = result.getLengthSquared(); if (resultLengthSq > 0) { return result.multiplyScalar(1 / Math.sqrt(resultLengthSq)); } return result.set(0, 0, 0); } /** * static/instance method to calculate barycentric coordinates. * based on: http://www.blackpawn.com/texts/pointinpoly/default.html * @param {Vector3} point - Vector3 * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @param {Vector3} [target] - the result will be copied into this Vector3. * @returns {Vector3} */ static barycoordFromPoint(point, a, b, c, target) { _v0.subVectors(c, a); _v1.subVectors(b, a); _v2.subVectors(point, a); const dot00 = _v0.dot(_v0); const dot01 = _v0.dot(_v1); const dot02 = _v0.dot(_v2); const dot11 = _v1.dot(_v1); const dot12 = _v1.dot(_v2); const denom = (dot00 * dot11 - dot01 * dot01); const result = target || new Vector3(); // collinear or singular triangle if (denom === 0) { // arbitrary location outside of triangle? // not sure if this is the best idea, maybe should be returning undefined return result.set(-2, -1, -1); } const invDenom = 1 / denom; const u = (dot11 * dot02 - dot01 * dot12) * invDenom; const v = (dot00 * dot12 - dot01 * dot02) * invDenom; // barycentric coordinates must always sum to 1 return result.set(1 - u - v, v, u); } /** * Returns true if the passed point, when projected onto the plane of the triangle, lies within the triangle. * @param {Vector3} point * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @returns {Vector3} */ static containsPoint(point, a, b, c) { this.barycoordFromPoint(point, a, b, c, _v3); return (_v3.x >= 0) && (_v3.y >= 0) && ((_v3.x + _v3.y) <= 1); } /** * Sets the triangle's a, b and c properties to the passed vector3s. * @param {Vector3} a * @param {Vector3} b * @param {Vector3} c * @returns {Triangle} */ set(a, b, c) { this.a.copy(a); this.b.copy(b); this.c.copy(c); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Triangle.prototype.isTriangle = true; export { Triangle }; ================================================ FILE: src/math/Vector2.js ================================================ import { MathUtils } from './MathUtils.js'; /** * The vector 2 class */ class Vector2 { /** * @param {number} [x=0] - the x value of this vector. * @param {number} [y=0] - the y value of this vector. */ constructor(x = 0, y = 0) { this.x = x; this.y = y; } /** * Sets the x and y components of this vector. * @param {number} x * @param {number} y * @returns {Vector2} */ set(x = 0, y = 0) { this.x = x; this.y = y; return this; } /** * Sets this vector to be the vector linearly interpolated between v1 and v2 * where ratio is the percent distance along the line connecting the two vectors * - ratio = 0 will be v1, and ratio = 1 will be v2. * @param {Vector2} v1 - the starting Vector2. * @param {Vector2} v2 - Vector2 to interpolate towards. * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1]. * @returns {Vector2} */ lerpVectors(v1, v2, ratio) { return this.subVectors(v2, v1).multiplyScalar(ratio).add(v1); } /** * If this vector's x or y value is greater than v's x or y value, replace that value with the corresponding min value. * @param {Vector2} v * @returns {Vector2} */ min(v) { this.x = Math.min(this.x, v.x); this.y = Math.min(this.y, v.y); return this; } /** * If this vector's x or y value is less than v's x or y value, replace that value with the corresponding max value. * @param {Vector2} v * @returns {Vector2} */ max(v) { this.x = Math.max(this.x, v.x); this.y = Math.max(this.y, v.y); return this; } /** * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y). * @returns {number} */ getLength() { return Math.sqrt(this.getLengthSquared()); } /** * Computes the square of the Euclidean length (straight-line length) from (0, 0) to (x, y). * If you are comparing the lengths of vectors, you should compare the length squared instead * as it is slightly more efficient to calculate. * @returns {number} */ getLengthSquared() { return this.x * this.x + this.y * this.y; } /** * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1. * @param {number} [thickness=1] * @returns {Vector2} */ normalize(thickness = 1) { const length = this.getLength() || 1; const invLength = thickness / length; this.x *= invLength; this.y *= invLength; return this; } /** * Subtracts v from the vector. * @param {Vector2} a * @param {Vector2} target - the result vector2 * @returns {Vector2} */ subtract(a, target = new Vector2()) { return target.set(this.x - a.x, this.y - a.y); } /** * Subtracts v from this vector. * @param {Vector2} v * @returns {Vector2} */ sub(v) { this.x -= v.x; this.y -= v.y; return this; } /** * Copies the values of the passed Vector2's x and y properties to this Vector2. * @param {Vector2} v * @returns {Vector2} */ copy(v) { this.x = v.x; this.y = v.y; return this; } /** * Sets this vector to a + b. * @param {Vector2} a * @param {Vector2} b * @returns {Vector2} */ addVectors(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; return this; } /** * Sets this vector to a - b. * @param {Vector2} a * @param {Vector2} b * @returns {Vector2} */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; return this; } /** * Multiplies this vector by scalar. * @param {number} scalar * @returns {Vector2} */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; return this; } /** * Computes the squared distance from this vector to v. If you are just comparing the distance with * another distance, you should compare the distance squared instead as it is slightly more efficient to calculate. * @param {Vector2} v * @returns {number} */ distanceToSquared(v) { const dx = this.x - v.x, dy = this.y - v.y; return dx * dx + dy * dy; } /** * Computes the distance from this vector to v. * @param {Vector2} v * @returns {number} */ distanceTo(v) { return Math.sqrt(this.distanceToSquared(v)); } /** * Sets this vector's x value to be array[ offset ] and y value to be array[ offset + 1 ]. * @param {number[]} array - the source array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array. * @returns {Vector2} */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); } this.x = x; this.y = y; return this; } /** * Sets this array[ offset ] value to be vector's x and array[ offset + 1 ] to be vector's y. * @param {number[]} [array] - the target array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {number[]} */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); } array[offset] = x; array[offset + 1] = y; return array; } /** * Adds v to this vector. * @param {Vector2} v * @returns {Vector2} */ add(v) { this.x += v.x; this.y += v.y; return this; } /** * Computes the angle in radians of this vector with respect to the positive x-axis. * @returns {number} */ angle() { // computes the angle in radians with respect to the positive x-axis // let angle = Math.atan2(this.y, this.x); // if (angle < 0) angle += 2 * Math.PI; // return angle; return Math.atan2(-this.y, -this.x) + Math.PI; } /** * Inverts this vector - i.e. sets x = -x, y = -y. * @returns {Vector2} */ negate() { this.x = -this.x; this.y = -this.y; return this; } /** * Calculate the dot product of this vector and v. * @param {Vector2} a * @returns {number} */ dot(a) { return this.x * a.x + this.y * a.y; } /** * Checks for strict equality of this vector and v. * @param {Vector2} v * @returns {boolean} */ equals(v) { return ((v.x === this.x) && (v.y === this.y)); } /** * Returns a new Vector2 with the same x and y values as this one. * @returns {Vector2} */ clone() { return new Vector2(this.x, this.y); } * [Symbol.iterator]() { yield this.x; yield this.y; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector2.prototype.isVector2 = true; export { Vector2 }; ================================================ FILE: src/math/Vector3.js ================================================ import { MathUtils } from './MathUtils.js'; /** * Class representing a 3D vector. */ class Vector3 { /** * Constructs a new 3D vector. * @param {number} [x=0] - The x value of this vector. * @param {number} [y=0] - The y value of this vector. * @param {number} [z=0] - The z value of this vector. */ constructor(x = 0, y = 0, z = 0) { /** * The x value of this vector. * @type {number} */ this.x = x; /** * The y value of this vector. * @type {number} */ this.y = y; /** * The z value of this vector. * @type {number} */ this.z = z; } /** * Sets the vector components. * @param {number} x - The value of the x component. * @param {number} y - The value of the y component. * @param {number} z - The value of the z component. * @returns {Vector3} A reference to this vector. */ set(x = 0, y = 0, z = 0) { this.x = x; this.y = y; this.z = z; return this; } /** * Sets the vector components to the same value. * @param {number} scalar - The value to set for all vector components. * @returns {Vector3} A reference to this vector. */ setScalar(scalar) { this.x = scalar; this.y = scalar; this.z = scalar; return this; } /** * Returns a new vector with copied values from this instance. * @returns {Vector3} A clone of this instance. */ clone() { return new Vector3(this.x, this.y, this.z); } /** * Copies the values of the given vector to this instance. * @param {Vector3} v - The vector to copy. * @returns {Vector3} A reference to this vector. */ copy(v) { this.x = v.x; this.y = v.y; this.z = v.z; return this; } /** * Adds the given vector to this instance. * @param {Vector3} v - The vector to add. * @returns {Vector3} A reference to this vector. */ add(v) { this.x += v.x; this.y += v.y; this.z += v.z; return this; } /** * Adds the given scalar value to all components of this instance. * @param {number} s - The scalar to add. * @returns {Vector3} A reference to this vector. */ addScalar(s) { this.x += s; this.y += s; this.z += s; return this; } /** * Adds the given vectors and stores the result in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ addVectors(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; this.z = a.z + b.z; return this; } /** * Adds the given vector scaled by the given factor to this instance. * @param {Vector3|Vector4} v - The vector. * @param {number} s - The factor that scales `v`. * @returns {Vector3} A reference to this vector. */ addScaledVector(v, s) { this.x += v.x * s; this.y += v.y * s; this.z += v.z * s; return this; } /** * Subtracts the given vector from this instance. * @param {Vector3} v - The vector to subtract. * @returns {Vector3} A reference to this vector. */ sub(v) { this.x -= v.x; this.y -= v.y; this.z -= v.z; return this; } /** * Subtracts the given vectors and stores the result in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; return this; } /** * Multiplies the given vector with this instance. * @param {Vector3} v - The vector to multiply. * @returns {Vector3} A reference to this vector. */ multiply(v) { this.x *= v.x; this.y *= v.y; this.z *= v.z; return this; } /** * Multiplies the given scalar value with all components of this instance. * @param {number} scalar - The scalar to multiply. * @returns {Vector3} A reference to this vector. */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; this.z *= scalar; return this; } /** * Multiplies this vector with the given 3x3 matrix. * @param {Matrix3} m - The 3x3 matrix. * @returns {Vector3} A reference to this vector. */ applyMatrix3(m) { const x = this.x, y = this.y, z = this.z; const e = m.elements; this.x = e[0] * x + e[3] * y + e[6] * z; this.y = e[1] * x + e[4] * y + e[7] * z; this.z = e[2] * x + e[5] * y + e[8] * z; return this; } /** * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and * divides by perspective. * @param {Matrix4} m - The matrix to apply. * @returns {Vector3} A reference to this vector. */ applyMatrix4(m) { const x = this.x, y = this.y, z = this.z; const e = m.elements; const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]); this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w; this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w; this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w; return this; } /** * Applies the given Quaternion to this vector. * @param {Quaternion} q - The Quaternion. * @returns {Vector3} A reference to this vector. */ applyQuaternion(q) { const x = this.x, y = this.y, z = this.z; const qx = q._x, qy = q._y, qz = q._z, qw = q._w; // calculate quat * vector const ix = qw * x + qy * z - qz * y; const iy = qw * y + qz * x - qx * z; const iz = qw * z + qx * y - qy * x; const iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; return this; } /** * Projects this vector from world space into the camera's normalized * device coordinate (NDC) space. * @param {Camera} camera - The camera. * @returns {Vector3} A reference to this vector. */ project(camera) { return this.applyMatrix4(camera.projectionViewMatrix); } /** * Unprojects this vector from the camera's normalized device coordinate (NDC) * space into world space. * @param {Camera} camera - The camera. * @returns {Vector3} A reference to this vector. */ unproject(camera) { return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.worldMatrix); } /** * Transforms the direction of this vector by a matrix (the upper left 3 x 3 * subset of the given 4x4 matrix and then normalizes the result. * @param {Matrix4} m - The matrix. * @returns {Vector3} A reference to this vector. */ transformDirection(m) { // input: Matrix4 affine matrix // vector interpreted as a direction const x = this.x, y = this.y, z = this.z; const e = m.elements; this.x = e[0] * x + e[4] * y + e[8] * z; this.y = e[1] * x + e[5] * y + e[9] * z; this.z = e[2] * x + e[6] * y + e[10] * z; return this.normalize(); } /** * If this vector's x, y or z value is greater than the given vector's x, y or z * value, replace that value with the corresponding min value. * @param {Vector3} v - The vector. * @returns {Vector3} A reference to this vector. */ min(v) { this.x = Math.min(this.x, v.x); this.y = Math.min(this.y, v.y); this.z = Math.min(this.z, v.z); return this; } /** * If this vector's x, y or z value is less than the given vector's x, y or z * value, replace that value with the corresponding max value. * @param {Vector3} v - The vector. * @returns {Vector3} A reference to this vector. */ max(v) { this.x = Math.max(this.x, v.x); this.y = Math.max(this.y, v.y); this.z = Math.max(this.z, v.z); return this; } /** * Inverts this vector - i.e. sets x = -x, y = -y and z = -z. * @returns {Vector3} A reference to this vector. */ negate() { this.x = -this.x; this.y = -this.y; this.z = -this.z; return this; } /** * Calculates the dot product of the given vector with this instance. * @param {Vector3} v - The vector to compute the dot product with. * @returns {number} The result of the dot product. */ dot(v) { return this.x * v.x + this.y * v.y + this.z * v.z; } /** * Computes the square of the Euclidean length (straight-line length) from * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should * compare the length squared instead as it is slightly more efficient to calculate. * @returns {number} The square length of this vector. */ getLengthSquared() { return this.x * this.x + this.y * this.y + this.z * this.z; } /** * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z). * @returns {number} The length of this vector. */ getLength() { return Math.sqrt(this.getLengthSquared()); } /** * Converts this vector to a unit vector - that is, sets it equal to a vector * with the same direction as this one, but with a vector length of `1`. * @param {number} [thickness=1] * @returns {Vector3} A reference to this vector. */ normalize(thickness = 1) { const length = this.getLength() || 1; const invLength = thickness / length; this.x *= invLength; this.y *= invLength; this.z *= invLength; return this; } /** * Linearly interpolates between the given vector and this instance, where * alpha is the percent distance along the line - alpha = 0 will be this * vector, and alpha = 1 will be the given one. * @param {Vector3} v - The vector to interpolate towards. * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. * @returns {Vector3} A reference to this vector. */ lerp(v, alpha) { this.x += (v.x - this.x) * alpha; this.y += (v.y - this.y) * alpha; this.z += (v.z - this.z) * alpha; return this; } /** * Linearly interpolates between the given vectors, where alpha is the percent * distance along the line - alpha = 0 will be first vector, and alpha = 1 will * be the second one. The result is stored in this instance. * @param {Vector3} v1 - The first vector. * @param {Vector3} v2 - The second vector. * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. * @returns {Vector3} A reference to this vector. */ lerpVectors(v1, v2, alpha) { this.x = v1.x + (v2.x - v1.x) * alpha; this.y = v1.y + (v2.y - v1.y) * alpha; this.z = v1.z + (v2.z - v1.z) * alpha; return this; } /** * Calculates the cross product of the given vector with this instance. * @param {Vector3} v - The vector to compute the cross product with. * @returns {Vector3} The result of the cross product. */ cross(v) { return this.crossVectors(this, v); } /** * Calculates the cross product of the given vectors and stores the result * in this instance. * @param {Vector3} a - The first vector. * @param {Vector3} b - The second vector. * @returns {Vector3} A reference to this vector. */ crossVectors(a, b) { const ax = a.x, ay = a.y, az = a.z; const bx = b.x, by = b.y, bz = b.z; this.x = ay * bz - az * by; this.y = az * bx - ax * bz; this.z = ax * by - ay * bx; return this; } /** * Reflects this vector off a plane orthogonal to the given normal vector. * @param {Vector3} normal - The (normalized) normal vector. * @returns {Vector3} A reference to this vector. */ reflect(normal) { return this.sub(_vector.copy(normal).multiplyScalar(2 * this.dot(normal))); } /** * Scales this vector along the given direction vector by the given scale factor. * @param {Vector3} direction - The (normalized) direction vector to scale along. * @param {number} scale - The scale factor. * @returns {Vector3} A reference to this vector. */ scaleAlong(direction, scale) { _vector.copy(direction).multiplyScalar(this.dot(direction)); return this.sub(_vector).addScaledVector(_vector, scale); } /** * Returns the angle between the given vector and this instance in radians. * @param {Vector3} v - The vector to compute the angle with. * @returns {number} The angle in radians. */ angleTo(v) { const denominator = Math.sqrt(this.getLengthSquared() * v.getLengthSquared()); if (denominator === 0) return Math.PI / 2; const theta = this.dot(v) / denominator; // clamp, to handle numerical problems return Math.acos(MathUtils.clamp(theta, -1, 1)); } /** * Computes the distance from the given vector to this instance. * @param {Vector3} v - The vector to compute the distance to. * @returns {number} The distance. */ distanceTo(v) { return Math.sqrt(this.distanceToSquared(v)); } /** * Computes the squared distance from the given vector to this instance. * If you are just comparing the distance with another distance, you should compare * the distance squared instead as it is slightly more efficient to calculate. * @param {Vector3} v - The vector to compute the squared distance to. * @returns {number} The squared distance. */ distanceToSquared(v) { const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; return dx * dx + dy * dy + dz * dz; } /** * Sets the vector components from the given spherical coordinates. * @param {Spherical} s - The spherical coordinates. * @returns {Vector3} A reference to this vector. */ setFromSpherical(s) { const sinPhiRadius = Math.sin(s.phi) * s.radius; this.x = sinPhiRadius * Math.sin(s.theta); this.y = Math.cos(s.phi) * s.radius; this.z = sinPhiRadius * Math.cos(s.theta); return this; } /** * Sets the vector components to the position elements of the * given transformation matrix. * @param {Matrix4} m - The 4x4 matrix. * @returns {Vector3} A reference to this vector. */ setFromMatrixPosition(m) { const e = m.elements; this.x = e[12]; this.y = e[13]; this.z = e[14]; return this; } /** * Sets the vector components to the scale elements of the * given transformation matrix. * @param {Matrix4} m - The 4x4 matrix. * @returns {Vector3} A reference to this vector. */ setFromMatrixScale(m) { const sx = this.setFromMatrixColumn(m, 0).getLength(); const sy = this.setFromMatrixColumn(m, 1).getLength(); const sz = this.setFromMatrixColumn(m, 2).getLength(); return this.set(sx, sy, sz); } /** * Sets the vector components from the specified matrix column. * @param {Matrix4} m - The 4x4 matrix. * @param {number} index - The column index. * @returns {Vector3} A reference to this vector. */ setFromMatrixColumn(m, index) { return this.fromArray(m.elements, index * 4); } /** * Returns `true` if this vector is equal with the given one. * @param {Vector3} v - The vector to test for equality. * @returns {boolean} Whether this vector is equal with the given one. */ equals(v) { return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z)); } /** * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]` * and z value to be `array[ offset + 2 ]`. * @param {Array} array - An array holding the vector component values. * @param {number} [offset=0] - The offset into the array. * @param {boolean} [denormalize=false] - If true, denormalize the values, and array should be a typed array. * @returns {Vector3} A reference to this vector. */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); } this.x = x; this.y = y; this.z = z; return this; } /** * Writes the components of this vector to the given array. If no array is provided, * the method returns a new instance. * @param {Array} [array=[]] - The target array holding the vector components. * @param {number} [offset=0] - Index of the first element in the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {Array} The vector components. */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y, z = this.z; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; return array; } * [Symbol.iterator]() { yield this.x; yield this.y; yield this.z; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector3.prototype.isVector3 = true; const _vector = new Vector3(); export { Vector3 }; ================================================ FILE: src/math/Vector4.js ================================================ import { MathUtils } from './MathUtils.js'; /** * The vector 4 class */ class Vector4 { /** * @param {number} [x=0] - the x value of this vector. * @param {number} [y=0] - the y value of this vector. * @param {number} [z=0] - the z value of this vector. * @param {number} [w=1] - the w value of this vector. */ constructor(x = 0, y = 0, z = 0, w = 1) { this.x = x; this.y = y; this.z = z; this.w = w; } /** * Sets this vector to be the vector linearly interpolated between v1 and v2 * where ratio is the percent distance along the line connecting the two vectors * - ratio = 0 will be v1, and ratio = 1 will be v2. * @param {Vector4} v1 - the starting Vector4. * @param {Vector4} v2 - Vector4 to interpolate towards. * @param {number} ratio - interpolation factor, typically in the closed interval [0, 1]. * @returns {Vector4} */ lerpVectors(v1, v2, ratio) { return this.subVectors(v2, v1).multiplyScalar(ratio).add(v1); } /** * Sets the x, y, z and w components of this vector. * @param {number} x * @param {number} y * @param {number} z * @param {number} w * @returns {Vector4} */ set(x = 0, y = 0, z = 0, w = 1) { this.x = x; this.y = y; this.z = z; this.w = w; return this; } /** * Converts this vector to a unit vector - that is, sets it equal to a vector with the same direction as this one, but length 1. * @returns {Vector4} */ normalize() { return this.multiplyScalar(1 / (this.getLength() || 1)); } /** * Multiplies this vector by scalar s. * @param {number} scalar * @returns {Vector4} */ multiplyScalar(scalar) { this.x *= scalar; this.y *= scalar; this.z *= scalar; this.w *= scalar; return this; } /** * Calculates the dot product of this vector and v. * @param {Vector4} v * @returns {Vector4} */ dot(v) { return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; } /** * Computes the square of the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w). * If you are comparing the lengths of vectors, you should compare the length squared instead * as it is slightly more efficient to calculate. * @returns {number} */ getLengthSquared() { return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; } /** * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w). * @returns {number} */ getLength() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); } /** * Computes the {@link https://en.wikipedia.org/wiki/Taxicab_geometry|Manhattan length} from (0, 0, 0, 0) to (x, y, z, w). * @returns {number} */ getManhattanLength() { return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w); } /** * Multiplies this vector by 4 x 4 m. * @param {Matrix4} m * @returns {Vector4} */ applyMatrix4(m) { const x = this.x, y = this.y, z = this.z, w = this.w; const e = m.elements; this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w; this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w; this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w; this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w; return this; } /** * Sets this vector to the position represented by the matrix m. * @param {Matrix4} m * @returns {Vector4} */ setFromMatrixPosition(m) { const e = m.elements; this.x = e[12]; this.y = e[13]; this.z = e[14]; this.w = e[15]; return this; } /** * Checks for strict equality of this vector and v. * @param {Vector4} v * @returns {boolean} */ equals(v) { return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z) && (v.w === this.w)); } /** * Adds v to this vector. * @param {Vector4} v * @returns {Vector4} */ add(v) { this.x += v.x; this.y += v.y; this.z += v.z; this.w += v.w; return this; } /** * Multiplies this vector by v. * @param {Vector4} v * @returns {Vector4} */ multiply(v) { this.x *= v.x; this.y *= v.y; this.z *= v.z; this.w *= v.w; return this; } /** * Sets this vector to a - b. * @param {Vector4} a * @param {Vector4} b * @returns {Vector4} */ subVectors(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; this.w = a.w - b.w; return this; } /** * Sets this vector's x value to be array[ offset + 0 ], * y value to be array[ offset + 1 ] z value to be array[ offset + 2 ] * and w value to be array[ offset + 3 ]. * @param {number[]} array - the source array. * @param {number} [offset=0] - offset into the array. * @param {boolean} [denormalize=false] - if true, denormalize the values, and array should be a typed array. * @returns {Vector4} */ fromArray(array, offset = 0, denormalize = false) { let x = array[offset], y = array[offset + 1], z = array[offset + 2], w = array[offset + 3]; if (denormalize) { x = MathUtils.denormalize(x, array); y = MathUtils.denormalize(y, array); z = MathUtils.denormalize(z, array); w = MathUtils.denormalize(w, array); } this.x = x; this.y = y; this.z = z; this.w = w; return this; } /** * Returns an array [x, y, z, w], or copies x, y, z and w into the provided array. * @param {number[]} [array] - array to store this vector to. If this is not provided, a new array will be created. * @param {number} [offset=0] - offset into the array. * @param {boolean} [normalize=false] - if true, normalize the values, and array should be a typed array. * @returns {number[]} */ toArray(array = [], offset = 0, normalize = false) { let x = this.x, y = this.y, z = this.z, w = this.w; if (normalize) { x = MathUtils.normalize(x, array); y = MathUtils.normalize(y, array); z = MathUtils.normalize(z, array); w = MathUtils.normalize(w, array); } array[offset] = x; array[offset + 1] = y; array[offset + 2] = z; array[offset + 3] = w; return array; } /** * Rounds the x, y, z and w values of this vector to the nearest integer value. * @returns {Vector4} */ round() { this.x = Math.round(this.x); this.y = Math.round(this.y); this.z = Math.round(this.z); this.w = Math.round(this.w); return this; } /** * Returns a new Vector4 with the same x, y, z and w values as this one. * @returns {Vector4} */ clone() { return new Vector4(this.x, this.y, this.z, this.w); } /** * Copies the values of the passed Vector4's x, y, z and w properties to this Vector4. * @param {Vector4} v * @returns {Vector4} */ copy(v) { this.x = v.x; this.y = v.y; this.z = v.z; this.w = (v.w !== undefined) ? v.w : 1; return this; } * [Symbol.iterator]() { yield this.x; yield this.y; yield this.z; yield this.w; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Vector4.prototype.isVector4 = true; export { Vector4 }; ================================================ FILE: src/render/LightingData.js ================================================ import { LightingGroup } from './LightingGroup.js'; class LightingData { constructor() { this.lightsArray = []; this.shadowsNum = 0; this.groupList = []; this.groupList.push(new LightingGroup()); // create default group 0 this._locked = true; } getGroup(id) { return this.groupList[id]; } setMaxGroupCount(max) { max = Math.max(1, max); // at least one group const groupList = this.groupList; const oldMax = groupList.length; if (max < oldMax) { for (let i = max; i < oldMax; i++) { groupList[i].dispose(); } groupList.length = max; } else if (max > oldMax) { for (let i = oldMax; i < max; i++) { groupList.push(new LightingGroup()); } } } begin() { if (!this._locked) { console.warn('LightingData: begin() called without end().'); } this.lightsArray.length = 0; this.shadowsNum = 0; this._locked = false; } collect(light) { if (this._locked) return; this.lightsArray.push(light); if (castShadow(light)) { this.shadowsNum++; } } end(sceneData) { const lightsArray = this.lightsArray; const shadowsNum = this.shadowsNum; const groupList = this.groupList; lightsArray.sort(shadowCastingLightsFirst); let i, l; for (i = 0, l = groupList.length; i < l; i++) { groupList[i].begin(); } for (i = 0, l = lightsArray.length; i < l; i++) { this._distribute(lightsArray[i], i < shadowsNum); } for (i = 0, l = groupList.length; i < l; i++) { groupList[i].end(sceneData); } this._locked = true; } _distribute(light, shadow) { const groupMask = light.groupMask; const groupList = this.groupList; // optimize for single group if (groupList.length === 1 && (groupMask & 1)) { groupList[0].push(light, shadow); return; } for (let i = 0, l = groupList.length; i < l; i++) { const mask = 1 << i; if (groupMask < mask) break; if (groupMask & mask) { groupList[i].push(light, shadow); } } } } function shadowCastingLightsFirst(lightA, lightB) { const a = castShadow(lightA) ? 1 : 0; const b = castShadow(lightB) ? 1 : 0; return b - a; } function castShadow(light) { return light.shadow && light.castShadow; } export { LightingData }; ================================================ FILE: src/render/LightingGroup.js ================================================ import { Vector3 } from '../math/Vector3.js'; import { Matrix4 } from '../math/Matrix4.js'; import { RectAreaLight } from '../scenes/lights/RectAreaLight.js'; import { EventDispatcher } from '../EventDispatcher.js'; class LightingGroup extends EventDispatcher { constructor() { super(); this.id = _lightingGroupId++; // Light collection array this.lights = []; // Data caches this.ambient = new Float32Array([0, 0, 0]); this.sh = new Float32Array(27); this.hemisphere = []; this.directional = []; this.directionalShadow = []; this.directionalShadowMap = []; this.directionalShadowDepthMap = []; this.directionalShadowMatrix = new Float32Array(0); this.point = []; this.pointShadow = []; this.pointShadowMap = []; this.pointShadowMatrix = new Float32Array(0); this.spot = []; this.spotShadow = []; this.spotShadowMap = []; this.spotShadowDepthMap = []; this.spotShadowMatrix = new Float32Array(0); this.rectArea = []; this.LTC1 = null; this.LTC2 = null; // Status this.useAmbient = false; this.useSphericalHarmonics = false; this.hemisNum = 0; this.directsNum = 0; this.pointsNum = 0; this.spotsNum = 0; this.rectAreaNum = 0; this.directShadowNum = 0; this.pointShadowNum = 0; this.spotShadowNum = 0; this.totalNum = 0; this.shadowsNum = 0; // Version this.version = 0; } begin() { this.totalNum = 0; this.shadowsNum = 0; } push(light, shadow) { this.lights[this.totalNum++] = light; if (shadow) { this.shadowsNum++; } } end(sceneData) { this.lights.length = this.totalNum; this._setupCache(sceneData); this.version++; } dispose() { this.dispatchEvent({ type: 'dispose' }); } _setupCache(sceneData) { for (let i = 0; i < 3; i++) { this.ambient[i] = 0; } for (let i = 0; i < this.sh.length; i++) { this.sh[i] = 0; } this.useAmbient = false; this.useSphericalHarmonics = false; this.hemisNum = 0; this.directsNum = 0; this.pointsNum = 0; this.spotsNum = 0; this.rectAreaNum = 0; this.directShadowNum = 0; this.pointShadowNum = 0; this.spotShadowNum = 0; this.LTC1 = null; this.LTC2 = null; // Setup Uniforms for (let i = 0, l = this.lights.length; i < l; i++) { const light = this.lights[i]; if (light.isAmbientLight) { this._doAddAmbientLight(light); } else if (light.isHemisphereLight) { this._doAddHemisphereLight(light, sceneData); } else if (light.isDirectionalLight) { this._doAddDirectLight(light, sceneData); } else if (light.isPointLight) { this._doAddPointLight(light, sceneData); } else if (light.isSpotLight) { this._doAddSpotLight(light, sceneData); } else if (light.isSphericalHarmonicsLight) { this._doAddSphericalHarmonicsLight(light); } else if (light.isRectAreaLight) { this._doAddRectAreaLight(light, sceneData); } } const directShadowNum = this.directShadowNum; if (directShadowNum > 0) { this.directionalShadowMap.length = directShadowNum; this.directionalShadowDepthMap.length = directShadowNum; tempDirectionalShadowMatrices.length = directShadowNum; if (this.directionalShadowMatrix.length !== directShadowNum * 16) { this.directionalShadowMatrix = new Float32Array(directShadowNum * 16); } for (let i = 0; i < directShadowNum; i++) { tempDirectionalShadowMatrices[i].toArray(this.directionalShadowMatrix, i * 16); } } const pointShadowNum = this.pointShadowNum; if (pointShadowNum > 0) { this.pointShadowMap.length = pointShadowNum; tempPointShadowMatrices.length = pointShadowNum; if (this.pointShadowMatrix.length !== pointShadowNum * 16) { this.pointShadowMatrix = new Float32Array(pointShadowNum * 16); } for (let i = 0; i < pointShadowNum; i++) { tempPointShadowMatrices[i].toArray(this.pointShadowMatrix, i * 16); } } const spotShadowNum = this.spotShadowNum; if (spotShadowNum > 0) { this.spotShadowMap.length = spotShadowNum; this.spotShadowDepthMap.length = spotShadowNum; tempSpotShadowMatrices.length = spotShadowNum; if (this.spotShadowMatrix.length !== spotShadowNum * 16) { this.spotShadowMatrix = new Float32Array(spotShadowNum * 16); } for (let i = 0; i < spotShadowNum; i++) { tempSpotShadowMatrices[i].toArray(this.spotShadowMatrix, i * 16); } } if (this.rectAreaNum > 0) { this.LTC1 = RectAreaLight.LTC1; this.LTC2 = RectAreaLight.LTC2; } } _doAddAmbientLight(object) { const intensity = object.intensity; const color = object.color; this.ambient[0] += color.r * intensity; this.ambient[1] += color.g * intensity; this.ambient[2] += color.b * intensity; this.useAmbient = true; } _doAddSphericalHarmonicsLight(object) { const intensity = object.intensity; const sh = object.sh.coefficients; for (let i = 0; i < sh.length; i += 1) { this.sh[i * 3] += sh[i].x * intensity; this.sh[i * 3 + 1] += sh[i].y * intensity; this.sh[i * 3 + 2] += sh[i].z * intensity; } this.useSphericalHarmonics = true; } _doAddHemisphereLight(object, sceneData) { const intensity = object.intensity; const skyColor = object.color; const groundColor = object.groundColor; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.skyColor[0] = skyColor.r * intensity; cache.skyColor[1] = skyColor.g * intensity; cache.skyColor[2] = skyColor.b * intensity; cache.groundColor[0] = groundColor.r * intensity; cache.groundColor[1] = groundColor.g * intensity; cache.groundColor[2] = groundColor.b * intensity; const e = object.worldMatrix.elements; const direction = helpVector3.set(e[4], e[5], e[6]).normalize(); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.toArray(cache.direction); this.hemisphere[this.hemisNum++] = cache; } _doAddDirectLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; const direction = object.getWorldDirection(helpVector3); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.multiplyScalar(-1).toArray(cache.direction); if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = shadow.frustumEdgeFalloff; this.directionalShadow[this.directShadowNum++] = shadowCache; shadow.update(object); shadow.updateMatrix(); if (useAnchorMatrix) { shadow.matrix.multiply(sceneData.anchorMatrix); } this.directionalShadowMap[this.directsNum] = shadow.map; this.directionalShadowDepthMap[this.directsNum] = shadow.depthMap; tempDirectionalShadowMatrices[this.directsNum] = shadow.matrix; } this.directional[this.directsNum++] = cache; } _doAddPointLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const distance = object.distance; const decay = object.decay; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; cache.distance = distance; cache.decay = decay; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = 0; shadowCache.shadowCameraRange[0] = shadow.cameraNear; shadowCache.shadowCameraRange[1] = shadow.cameraFar; this.pointShadow[this.pointShadowNum++] = shadowCache; shadow.update(object, 0); shadow.matrix.makeTranslation(-position.x, -position.y, -position.z); // for point light this.pointShadowMap[this.pointsNum] = shadow.map; tempPointShadowMatrices[this.pointsNum] = shadow.matrix; } this.point[this.pointsNum++] = cache; } _doAddSpotLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const distance = object.distance; const decay = object.decay; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; cache.distance = distance; cache.decay = decay; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; const direction = object.getWorldDirection(helpVector3); if (useAnchorMatrix) { direction.transformDirection(sceneData.anchorMatrixInverse); } direction.multiplyScalar(-1).toArray(cache.direction); const coneCos = Math.cos(object.angle); const penumbraCos = Math.cos(object.angle * (1 - object.penumbra)); cache.coneCos = coneCos; cache.penumbraCos = penumbraCos; if (object.castShadow) { const shadow = object.shadow; const shadowCache = getShadowCache(object); shadowCache.shadowBias[0] = shadow.bias; shadowCache.shadowBias[1] = shadow.normalBias; shadowCache.shadowMapSize[0] = shadow.mapSize.x; shadowCache.shadowMapSize[1] = shadow.mapSize.y; shadowCache.shadowParams[0] = shadow.radius; shadowCache.shadowParams[1] = shadow.frustumEdgeFalloff; this.spotShadow[this.spotShadowNum++] = shadowCache; shadow.update(object); shadow.updateMatrix(); if (useAnchorMatrix) { shadow.matrix.multiply(sceneData.anchorMatrix); } this.spotShadowMap[this.spotsNum] = shadow.map; this.spotShadowDepthMap[this.spotsNum] = shadow.depthMap; tempSpotShadowMatrices[this.spotsNum] = shadow.matrix; } this.spot[this.spotsNum++] = cache; } _doAddRectAreaLight(object, sceneData) { const intensity = object.intensity; const color = object.color; const halfHeight = object.height; const halfWidth = object.width; const useAnchorMatrix = sceneData.useAnchorMatrix; const cache = getLightCache(object); cache.color[0] = color.r * intensity; cache.color[1] = color.g * intensity; cache.color[2] = color.b * intensity; const position = helpVector3.setFromMatrixPosition(object.worldMatrix); if (useAnchorMatrix) { position.applyMatrix4(sceneData.anchorMatrixInverse); } cache.position[0] = position.x; cache.position[1] = position.y; cache.position[2] = position.z; // extract rotation of light to derive width/height half vectors helpMatrix4.copy(object.worldMatrix); if (useAnchorMatrix) { helpMatrix4.premultiply(sceneData.anchorMatrixInverse); } helpMatrix4.extractRotation(helpMatrix4); const halfWidthPos = helpVector3.set(halfWidth * 0.5, 0.0, 0.0); halfWidthPos.applyMatrix4(helpMatrix4); cache.halfWidth[0] = halfWidthPos.x; cache.halfWidth[1] = halfWidthPos.y; cache.halfWidth[2] = halfWidthPos.z; const halfHeightPos = helpVector3.set(0.0, halfHeight * 0.5, 0.0); halfHeightPos.applyMatrix4(helpMatrix4); cache.halfHeight[0] = halfHeightPos.x; cache.halfHeight[1] = halfHeightPos.y; cache.halfHeight[2] = halfHeightPos.z; this.rectArea[this.rectAreaNum++] = cache; } } // Variables let _lightingGroupId = 0; const helpVector3 = new Vector3(); const helpMatrix4 = new Matrix4(); const tempDirectionalShadowMatrices = []; const tempPointShadowMatrices = []; const tempSpotShadowMatrices = []; // Light caches const lightCaches = new WeakMap(); function getLightCache(light) { if (lightCaches.has(light)) { return lightCaches.get(light); } let cache; if (light.isHemisphereLight) { cache = { direction: new Float32Array(3), skyColor: new Float32Array([0, 0, 0]), groundColor: new Float32Array([0, 0, 0]) }; } else if (light.isDirectionalLight) { cache = { direction: new Float32Array(3), color: new Float32Array([0, 0, 0]) }; } else if (light.isPointLight) { cache = { position: new Float32Array(3), color: new Float32Array([0, 0, 0]), distance: 0, decay: 0 }; } else if (light.isSpotLight) { cache = { position: new Float32Array(3), direction: new Float32Array(3), color: new Float32Array([0, 0, 0]), distance: 0, coneCos: 0, penumbraCos: 0, decay: 0 }; } else if (light.isRectAreaLight) { cache = { position: new Float32Array(3), color: new Float32Array([0, 0, 0]), halfWidth: new Float32Array(3), halfHeight: new Float32Array(3) }; } lightCaches.set(light, cache); return cache; } // Shadow caches const shadowCaches = new WeakMap(); function getShadowCache(light) { if (shadowCaches.has(light)) { return shadowCaches.get(light); } let cache; if (light.isDirectionalLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff] }; } else if (light.isPointLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2), // [radius, 0] shadowCameraRange: new Float32Array(2) // [cameraNear, cameraFar] }; } else if (light.isSpotLight) { cache = { shadowBias: new Float32Array(2), // [bias, normalBias] shadowMapSize: new Float32Array(2), // [width, height] shadowParams: new Float32Array(2) // [radius, frustumEdgeFalloff] }; } shadowCaches.set(light, cache); return cache; } export { LightingGroup }; ================================================ FILE: src/render/PropertyMap.js ================================================ /** * PropertyMap is a helper class for storing properties on objects. * Instead of using a Map, we store the property map directly on the object itself, * which provides better lookup performance. * This is generally used to store the gpu resources corresponding to objects. */ class PropertyMap { /** * Create a new PropertyMap. * @param {string} prefix - The prefix of the properties name. */ constructor(prefix) { this._key = prefix + '$'; this._count = 0; } /** * Get the properties of the object. * If the object does not have properties, create a new one. * @param {object} object - The object to get properties. * @returns {object} - The properties of the object. */ get(object) { const key = this._key; let properties = object[key]; if (properties === undefined) { properties = {}; object[key] = properties; this._count++; } return properties; } /** * Delete the properties of the object. * @param {object} object - The object to delete properties. */ delete(object) { const key = this._key; const properties = object[key]; if (properties) { this._count--; delete object[key]; } } /** * Get the number of objects that have properties. * @returns {number} - The number of objects that have properties. */ size() { return this._count; } } export { PropertyMap }; ================================================ FILE: src/render/RenderCollector.js ================================================ import { SceneData } from './SceneData.js'; import { LightingData } from './LightingData.js'; import { RenderStates } from './RenderStates.js'; import { RenderQueue } from './RenderQueue.js'; import { Sphere } from '../math/Sphere.js'; /** * RenderCollector traverses the scene graph and collects all necessary rendering information. * It manages scene data, lighting data, and per-camera render states/queues. */ class RenderCollector { /** * Creates a new RenderCollector instance. * In most cases, RenderCollector does not need to be created manually, * as Scene will automatically create one. See {@link Scene#collector}. */ constructor() { // collects scene and lighting data for single scene this.sceneData = new SceneData(); this.lightingData = new LightingData(); // collects render states and render queues for each camera this._renderStatesMap = new WeakMap(); this._renderQueueMap = new WeakMap(); // internal states this._lightingNeedsUpdate = true; this._skeletonVersion = 1; const _boundingSphere = new Sphere(); /** * Visibility checking function called during scene traversal. * Determines whether an object should be included in the render queue. * Can be overridden to implement custom culling logic (LOD, distance, etc.). * @param {Object3D} object - The object to test for visibility. * @param {Camera} camera - The camera to test against. * @returns {boolean} True if the object should be rendered, false to cull it. * @type {Function} * @example * // Custom visibility check that always returns true * collector.checkVisibility = function(object, camera) { * return true; * }; */ this.checkVisibility = function(object, camera) { if (!object.renderable) { return false; } if (!object.frustumCulled || !camera.frustumCulled) { return true; } _boundingSphere.copy(object.geometry.boundingSphere).applyMatrix4(object.worldMatrix); return camera.frustum.intersectsSphere(_boundingSphere); }; } /** * Setting this property to `true` indicates the lighting data needs to be updated. * Lighting data updates are triggered by the {@link RenderCollector#traverseAndCollect} method. * @type {boolean} * @default false * @param {boolean} value */ set lightingNeedsUpdate(value) { if (value) { this._lightingNeedsUpdate = true; } } /** * Setting this property to `true` indicates all skeletons in the scene should be updated. * Skeleton updates are triggered by the {@link RenderCollector#traverseAndCollect} method. * @type {boolean} * @default false * @param {boolean} value */ set skeletonNeedsUpdate(value) { if (value) { this._skeletonVersion++; } } /** * Get the RenderStates for the scene and camera. * If the RenderStates for the camera does not exist, it will be created. * @param {Camera} camera - The render camera. * @returns {RenderStates} The target render states. */ getRenderStates(camera) { let renderStates = this._renderStatesMap.get(camera); if (!renderStates) { // every camera has its own RenderStates // but they share the same scene and lighting data renderStates = new RenderStates(this.sceneData, this.lightingData); this._renderStatesMap.set(camera, renderStates); } return renderStates; } /** * Get the RenderQueue for the scene and camera. * If the RenderQueue for the camera does not exist, it will be created. * @param {Camera} camera - The render camera. * @returns {RenderQueue} The target render queue. */ getRenderQueue(camera) { let renderQueue = this._renderQueueMap.get(camera); if (!renderQueue) { renderQueue = new RenderQueue(); this._renderQueueMap.set(camera, renderQueue); } return renderQueue; } /** * Traverse the scene and collect all renderable objects, lights and skeletons. * This method will update the RenderQueue and RenderStates for the camera. * @param {Scene} scene - The scene to traverse. * @param {Camera} camera - The camera to collect renderable objects for. * @returns {RenderQueue} The collected render queue. */ traverseAndCollect(scene, camera) { const sceneData = this.sceneData; const lightingData = this.lightingData; const lightingNeedsUpdate = this._lightingNeedsUpdate; const renderQueue = this.getRenderQueue(camera); if (lightingNeedsUpdate) { lightingData.begin(); } renderQueue.begin(); this._traverseAndCollect(scene, camera, renderQueue); renderQueue.end(); if (lightingNeedsUpdate) { lightingData.end(sceneData); this._lightingNeedsUpdate = false; } // Since skeletons may be referenced by different mesh, // it is necessary to collect skeletons in the scene in order to avoid repeated updates. // For IOS platform, we should try to avoid repeated texture updates within one frame, // otherwise the performance will be seriously degraded. const skeletonVersion = this._skeletonVersion; for (const skeleton of _skeletons) { // Skeleton version ensures uncollected skeletons will be updated in subsequent frames if (skeleton._version !== skeletonVersion) { skeleton.updateBones(sceneData); skeleton._version = skeletonVersion; } } _skeletons.clear(); return renderQueue; } _traverseAndCollect(object, camera, renderQueue) { if (!object.visible) { return; } if (object.isMesh) { if (this.checkVisibility(object, camera)) { renderQueue.push(object, camera); if (object.skeleton) { _skeletons.add(object.skeleton); } } } else if (object.isLight) { this.lightingData.collect(object); } const children = object.children; for (let i = 0, l = children.length; i < l; i++) { this._traverseAndCollect(children[i], camera, renderQueue); } } } const _skeletons = new Set(); export { RenderCollector }; ================================================ FILE: src/render/RenderInfo.js ================================================ /** * Render info collector. * If you want to collect information about the rendering of this frame, * pass an instance of RenderInfo to RenderOption when calling renderRenderableList. */ class RenderInfo { constructor() { const render = { calls: 0, triangles: 0, lines: 0, points: 0 }; // A series of function use for collect information. const updateFuncs = [ function updatePoints(instanceCount, count) { render.points += instanceCount * count; }, function updateLines(instanceCount, count) { render.lines += instanceCount * (count / 2); }, function updateLineLoop(instanceCount, count) { render.lines += instanceCount * count; }, function updateLineStrip(instanceCount, count) { render.lines += instanceCount * (count - 1); }, function updateTriangles(instanceCount, count) { render.triangles += instanceCount * (count / 3); }, function updateTriangleStrip(instanceCount, count) { render.triangles += instanceCount * (count - 2); }, function updateTriangleFan(instanceCount, count) { render.triangles += instanceCount * (count - 2); } ]; /** * Method of update render info. * This method will be executed after each draw. * @private * @param {number} count * @param {DRAW_MODE} mode * @param {number} instanceCount */ this.update = function(count, mode, instanceCount) { render.calls++; updateFuncs[mode](instanceCount, count); }; /** * Reset the render info. * Call this method whenever you have finished to render a single frame. */ this.reset = function() { render.calls = 0; render.triangles = 0; render.lines = 0; render.points = 0; }; /** * A series of statistical information of rendering process, include calls, triangles, lines and points. * @type {object} */ this.render = render; } } export { RenderInfo }; ================================================ FILE: src/render/RenderQueue.js ================================================ import { RenderQueueLayer } from './RenderQueueLayer.js'; import { Vector4 } from '../math/Vector4.js'; /** * RenderQueue is used to collect all renderable items, lights and skeletons from the scene. * Renderable items will be dispatched to the corresponding RenderQueueLayer according to the object's renderLayer property. */ class RenderQueue { constructor() { this.layerMap = new Map(); this.layerList = []; this.skeletons = new Set(); // to optimize the performance of the next push, cache the last layer used this._lastLayer = this.createLayer(0); } begin() { for (let i = 0, l = this.layerList.length; i < l; i++) { this.layerList[i].begin(); } this.skeletons.clear(); } end() { for (let i = 0, l = this.layerList.length; i < l; i++) { this.layerList[i].end(); this.layerList[i].sort(); } } push(object, camera) { // collect skeleton if exists if (object.skeleton) { this.skeletons.add(object.skeleton); } _vec4.setFromMatrixPosition(object.worldMatrix) .applyMatrix4(camera.projectionViewMatrix); const clipZ = _vec4.z; const layerId = object.renderLayer || 0; let layer = this._lastLayer; if (layer.id !== layerId) { layer = this.layerMap.get(layerId); if (!layer) { layer = this.createLayer(layerId); } this._lastLayer = layer; } if (Array.isArray(object.material)) { const groups = object.geometry.groups; for (let i = 0; i < groups.length; i++) { const group = groups[i]; const groupMaterial = object.material[group.materialIndex]; if (groupMaterial) { layer.addRenderable(object, object.geometry, groupMaterial, clipZ, group); } } } else { layer.addRenderable(object, object.geometry, object.material, clipZ); } } /** * Set a render queue layer. * @param {number} id - The layer id. * @param {RenderQueueLayer} layer - The layer to set. */ setLayer(id, layer) { this.layerMap.set(id, layer); this.layerList.push(layer); this.layerList.sort(sortLayer); } /** * Create and set a render queue layer. * @param {number} id - The layer id. * @returns {RenderQueueLayer} */ createLayer(id) { const layer = new RenderQueueLayer(id); this.setLayer(id, layer); return layer; } /** * Get the render queue layer. * @param {number} id - The layer id. * @returns {RenderQueueLayer} */ getLayer(id) { return this.layerMap.get(id); } /** * Remove the render queue layer. * @param {number} id - The layer id. */ removeLayer(id) { const layer = this.layerMap.get(id); if (layer) { this.layerMap.delete(id); const index = this.layerList.indexOf(layer); if (index !== -1) { this.layerList.splice(index, 1); } if (this._lastLayer === id) { this._lastLayer = null; } } } } const _vec4 = new Vector4(); function sortLayer(a, b) { return a.id - b.id; } export { RenderQueue }; ================================================ FILE: src/render/RenderQueueLayer.js ================================================ /** * RenderQueueLayer holds all the renderable objects. * Now has an opaque list and a transparent list. */ class RenderQueueLayer { /** * @param {number} id - layer id. */ constructor(id) { this.id = id; this.opaque = []; this.opaqueCount = 0; this.transparent = []; this.transparentCount = 0; this._cache = []; this._cacheIndex = 0; this._lastCacheIndex = 0; this.opaqueSortCompareFn = defaultOpaqueSortCompare; this.transparentSortCompareFn = defaultTransparentSortCompare; } begin() { this._cacheIndex = 0; this.opaqueCount = 0; this.transparentCount = 0; } end() { this.opaque.length = this.opaqueCount; this.transparent.length = this.transparentCount; // Clear references from inactive renderables in the list const cacheIndex = this._cacheIndex, lastCacheIndex = this._lastCacheIndex; if (lastCacheIndex > cacheIndex) { const cache = this._cache; for (let i = cacheIndex; i < lastCacheIndex; i++) { const renderable = cache[i]; renderable.object = null; renderable.geometry = null; renderable.material = null; renderable.group = null; } } this._lastCacheIndex = cacheIndex; } addRenderable(object, geometry, material, z, group) { const cache = this._cache; let renderable = cache[this._cacheIndex]; if (renderable === undefined) { renderable = { object: object, geometry: geometry, material: material, z: z, renderOrder: object.renderOrder, group: group }; cache[this._cacheIndex] = renderable; } else { renderable.object = object; renderable.geometry = geometry; renderable.material = material; renderable.z = z; renderable.renderOrder = object.renderOrder; renderable.group = group; } if (material.transparent) { this.transparent[this.transparentCount] = renderable; this.transparentCount++; } else { this.opaque[this.opaqueCount] = renderable; this.opaqueCount++; } this._cacheIndex++; } sort() { this.opaque.sort(this.opaqueSortCompareFn); quickSort(this.transparent, 0, this.transparent.length, this.transparentSortCompareFn); } } function defaultOpaqueSortCompare(a, b) { if (a.renderOrder !== b.renderOrder) { return a.renderOrder - b.renderOrder; } else if (a.material.id !== b.material.id) { return a.material.id - b.material.id; } else { return a.id - b.id; } } function defaultTransparentSortCompare(a, b) { if (a.renderOrder !== b.renderOrder) { return a.renderOrder - b.renderOrder; } else if (a.z !== b.z) { return b.z - a.z; } else if (a.material.id !== b.material.id) { // fix Unstable sort below chrome version 7.0 // if render same object with different materials return a.material.id - b.material.id; } else { return a.id - b.id; } } // Reference github.com/ant-galaxy/oasis-engine/blob/main/packages/core/src/RenderPipeline/RenderQueue.ts // quickSort is faster when sorting highly randomized arrays, // but for sorting lowly randomized arrays, Array.prototype.sort is faster, // so quickSort is more suitable for transparent list sorting. function quickSort(a, from, to, compareFunc) { while (true) { // Insertion sort is faster for short arrays. if (to - from <= 10) { insertionSort(a, from, to, compareFunc); return; } const third_index = (from + to) >> 1; // Find a pivot as the median of first, last and middle element. let v0 = a[from]; let v1 = a[to - 1]; let v2 = a[third_index]; const c01 = compareFunc(v0, v1); if (c01 > 0) { const tmp = v0; v0 = v1; v1 = tmp; } const c02 = compareFunc(v0, v2); if (c02 >= 0) { const tmp = v0; v0 = v2; v2 = v1; v1 = tmp; } else { const c12 = compareFunc(v1, v2); if (c12 > 0) { const tmp = v1; v1 = v2; v2 = tmp; } } a[from] = v0; a[to - 1] = v2; const pivot = v1; let low_end = from + 1; // Upper bound of elements lower than pivot. let high_start = to - 1; // Lower bound of elements greater than pivot. a[third_index] = a[low_end]; a[low_end] = pivot; // From low_end to i are elements equal to pivot. // From i to high_start are elements that haven't been compared yet. partition: for (let i = low_end + 1; i < high_start; i++) { let element = a[i]; let order = compareFunc(element, pivot); if (order < 0) { a[i] = a[low_end]; a[low_end] = element; low_end++; } else if (order > 0) { do { high_start--; if (high_start == i) break partition; const top_elem = a[high_start]; order = compareFunc(top_elem, pivot); } while (order > 0); a[i] = a[high_start]; a[high_start] = element; if (order < 0) { element = a[i]; a[i] = a[low_end]; a[low_end] = element; low_end++; } } } if (to - high_start < low_end - from) { quickSort(a, high_start, to, compareFunc); to = low_end; } else { quickSort(a, from, low_end, compareFunc); from = high_start; } } } function insertionSort(a, from, to, compareFunc) { for (let i = from + 1; i < to; i++) { let j; const element = a[i]; for (j = i - 1; j >= from; j--) { const tmp = a[j]; const order = compareFunc(tmp, element); if (order > 0) { a[j + 1] = tmp; } else { break; } } a[j + 1] = element; } } export { RenderQueueLayer }; ================================================ FILE: src/render/RenderStates.js ================================================ import { TEXEL_ENCODING_TYPE } from '../const.js'; import { Matrix4 } from '../math/Matrix4.js'; import { Vector3 } from '../math/Vector3.js'; import { Vector4 } from '../math/Vector4.js'; function _isPerspectiveMatrix(m) { return m.elements[11] === -1.0; } let _cameraDataId = 0; /** * RenderStates collect all render states about scene and camera. */ class RenderStates { constructor(sceneData, lightingData) { this.scene = sceneData; this.lighting = lightingData; this.camera = { id: _cameraDataId++, version: 0, near: 0, far: 0, position: new Vector3(), logDepthCameraNear: 0, logDepthBufFC: 0, viewMatrix: new Matrix4(), projectionMatrix: new Matrix4(), projectionViewMatrix: new Matrix4(), rect: new Vector4(0, 0, 1, 1) }; this.gammaFactor = 2.0; this.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR; } /** * Update render states about camera. * @param {Camera} camera */ updateCamera(camera) { const sceneData = this.scene; const cameraData = this.camera; const projectionMatrix = camera.projectionMatrix; let cameraNear = 0, cameraFar = 0; if (_isPerspectiveMatrix(projectionMatrix)) { cameraNear = projectionMatrix.elements[14] / (projectionMatrix.elements[10] - 1); cameraFar = projectionMatrix.elements[14] / (projectionMatrix.elements[10] + 1); } else { cameraNear = (projectionMatrix.elements[14] + 1) / projectionMatrix.elements[10]; cameraFar = (projectionMatrix.elements[14] - 1) / projectionMatrix.elements[10]; } cameraData.near = cameraNear; cameraData.far = cameraFar; if (sceneData.logarithmicDepthBuffer) { cameraData.logDepthCameraNear = cameraNear; cameraData.logDepthBufFC = 2.0 / (Math.log(cameraFar - cameraNear + 1.0) * Math.LOG2E); } else { cameraData.logDepthCameraNear = 0; cameraData.logDepthBufFC = 0; } cameraData.position.setFromMatrixPosition(camera.worldMatrix); if (sceneData.useAnchorMatrix) { cameraData.position.applyMatrix4(sceneData.anchorMatrixInverse); } cameraData.viewMatrix.copy(camera.viewMatrix); if (sceneData.useAnchorMatrix) { cameraData.viewMatrix.multiply(sceneData.anchorMatrix); } cameraData.projectionMatrix.copy(projectionMatrix); cameraData.projectionViewMatrix.copy(projectionMatrix).multiply(cameraData.viewMatrix); cameraData.rect.copy(camera.rect); cameraData.version++; this.gammaFactor = camera.gammaFactor; this.outputEncoding = camera.outputEncoding; } } export { RenderStates }; ================================================ FILE: src/render/SceneData.js ================================================ import { Matrix4 } from '../math/Matrix4.js'; import { Plane } from '../math/Plane.js'; const _plane_1 = new Plane(); let _sceneDataId = 0; /** * SceneData collect all render states about scene, Including lights. */ class SceneData { constructor() { this.id = _sceneDataId++; this.version = 0; this.useAnchorMatrix = false; this.anchorMatrix = new Matrix4(); this.anchorMatrixInverse = new Matrix4(); this.disableShadowSampler = false; this.logarithmicDepthBuffer = false; this.fog = null; this.environment = null; this.envDiffuseIntensity = 1; this.envSpecularIntensity = 1; this.clippingPlanesData = new Float32Array([]); this.numClippingPlanes = 0; } /** * Update scene data. * @param {Scene} scene */ update(scene) { this.useAnchorMatrix = !scene.anchorMatrix.isIdentity(); this.anchorMatrix.copy(scene.anchorMatrix); this.anchorMatrixInverse.copy(scene.anchorMatrix).invert(); this.disableShadowSampler = scene.disableShadowSampler; this.logarithmicDepthBuffer = scene.logarithmicDepthBuffer; this.fog = scene.fog; this.environment = scene.environment; this.envDiffuseIntensity = scene.envDiffuseIntensity; this.envSpecularIntensity = scene.envSpecularIntensity; if (this.clippingPlanesData.length < scene.clippingPlanes.length * 4) { this.clippingPlanesData = new Float32Array(scene.clippingPlanes.length * 4); } this.setClippingPlanesData(scene.clippingPlanes, this.clippingPlanesData); this.numClippingPlanes = scene.clippingPlanes.length; this.version++; } setClippingPlanesData(clippingPlanes, clippingPlanesData) { for (let i = 0; i < clippingPlanes.length; i++) { _plane_1.copy(clippingPlanes[i]); if (this.useAnchorMatrix) { _plane_1.applyMatrix4(this.anchorMatrixInverse); } clippingPlanesData[i * 4 + 0] = _plane_1.normal.x; clippingPlanesData[i * 4 + 1] = _plane_1.normal.y; clippingPlanesData[i * 4 + 2] = _plane_1.normal.z; clippingPlanesData[i * 4 + 3] = _plane_1.constant; } return clippingPlanesData; } } export { SceneData }; ================================================ FILE: src/render/ThinRenderer.js ================================================ import { Vector3 } from '../math/Vector3.js'; import { Vector2 } from '../math/Vector2.js'; let _rendererId = 0; /** * Base class for WebGL and WebGPU renderers. */ class ThinRenderer { constructor() { /** * The unique id of this renderer. * This will be incremented when the context is lost and restored. * @readonly * @type {number} */ this.id = 0; // assigned in init method /** * The Rendering Context privided by canvas. * @type {WebGLRenderingContext|WebGPURenderingContext} */ this.context = null; // assigned in init method /** * An object containing details about the capabilities of the current RenderingContext. * @type {object} */ this.capabilities = {}; /** * The shader compiler options. * @type {object} * @property {boolean} checkErrors - Whether to use error checking when compiling shaders, defaults to true. * @property {boolean} compileAsynchronously - Whether to compile shaders asynchronously, defaults to false. * @property {number} maxMaterialPrograms - The maximum number of programs that one material can cache, defaults to 5. */ this.shaderCompileOptions = { checkErrors: true, compileAsynchronously: false, maxMaterialPrograms: 5 }; /** * The lighting options. * @type {object} * @property {object} clustered - The clustered lighting options. * @property {boolean} clustered.enabled - Whether to use clustered lighting, defaults to false. * @property {number} clustered.maxClusterLights - The maximum number of lights, defaults to 1024. * @property {boolean} clustered.useFloatPrecision - Whether the lights are stored as floats, defaults to false (half floats). * @property {Vector3} clustered.gridDimensions - The number of cells in each dimension, defaults to Vector3(16, 8, 32). * @property {number} clustered.maxLightsPerCell - The maximum number of lights per cell, defaults to 256. * @property {Vector2} clustered.zClip - The near and far clipping planes for the cells, defaults to Vector2(-1, -1) (clip based on camera near and far planes). * @property {number} clustered.version - The version of the clustered lighting options. If the options change, the version should be incremented, defaults to 0. */ this.lightingOptions = { clustered: { enabled: false, maxClusterLights: 1024, useFloatPrecision: false, gridDimensions: new Vector3(16, 8, 32), maxLightsPerCell: 256, zClip: new Vector2(-1, -1), version: 0 } }; this._passInfo = { // Whether the renderer is in the process of pass rendering. // If true, means that the beginRender method has been called but the endRender method has not been called. enabled: false, // The pass rendering count count: 0 }; } /** * Initialize this renderer with a rendering context. * This method is called automatically by {@link WebGLRenderer} constructor when a context is provided. * For WebGPURenderer, you must call this method manually and wait for the promise to resolve. * @param {WebGLRenderingContext|WebGPURenderingContext} context - The rendering context. * @param {object} [options] - The options for initializing this renderer. * @returns {Promise} A promise that resolves when initialization completes. */ init(context, options = {}) {} /** * Begin rendering. * @param {RenderTargetBase} renderTarget - The render target to render to. */ beginRender(renderTarget) { this._passInfo.enabled = true; } /** * End rendering. */ endRender() { this._passInfo.enabled = false; this._passInfo.count++; } /** * @typedef {object} RenderOptions - The render options for renderRenderableItem and renderRenderableList methods. * @property {Function} getGeometry - (Optional) Get renderable geometry. * @property {Function} getMaterial - (Optional) Get renderable material. * @property {Function} beforeRender - (Optional) Before render each renderable item. * @property {Function} afterRender - (Optional) After render each renderable item. * @property {Function} ifRender - (Optional) If render the renderable item. * @property {RenderInfo} renderInfo - (Optional) Render info for collect information. * @property {boolean} onlyCompile - (Optional) Only compile shader, do not render. */ /** * Render a single renderable item with render states. * @param {object} renderable - The renderable item. * @param {RenderStates} renderStates - The render states. * @param {RenderOptions} [options] - The render options for this render task. */ renderRenderableItem(renderable, renderStates, options) {} /** * Render a single renderable list with render states. * @param {Array} renderables - Array of renderable. * @param {RenderStates} renderStates - Render states. * @param {RenderOptions} [options] - The render options for this render task. */ renderRenderableList(renderables, renderStates, options = {}) { for (let i = 0, l = renderables.length; i < l; i++) { this.renderRenderableItem(renderables[i], renderStates, options); } } /** * Render a scene with a particular camera. * This method will render all layers in scene's RenderQueue by default. * If you need a customized rendering process, it is recommended to use renderRenderableList method. * @param {Scene} scene - The scene to render. * @param {Camera} camera - The camera used to render the scene. * @param {RenderTargetBase} renderTarget - The render target to render to. * @param {RenderOptions} [options] - The render options for this scene render task. */ renderScene(scene, camera, renderTarget, options = {}) { // Compatibility handling: if there are only 3 arguments, // and the third is not a RenderTarget, treat it as options. if (arguments.length === 3 && (!renderTarget || !renderTarget.isRenderTarget)) { options = renderTarget; renderTarget = null; } const renderStates = scene.getRenderStates(camera); const renderQueue = scene.getRenderQueue(camera); this.beginRender(renderTarget); let renderQueueLayer; for (let i = 0, l = renderQueue.layerList.length; i < l; i++) { renderQueueLayer = renderQueue.layerList[i]; this.renderRenderableList(renderQueueLayer.opaque, renderStates, options); this.renderRenderableList(renderQueueLayer.transparent, renderStates, options); } this.endRender(); } /** * Copy a frame buffer to another. * This copy process can be used to perform multi-sampling (MSAA). * @param {RenderTargetBase} read - The source renderTarget. * @param {RenderTargetBase} draw - The destination renderTarget. * @param {boolean} [color=true] - Copy color buffer. * @param {boolean} [depth=true] - Copy depth buffer. * @param {boolean} [stencil=true] - Copy stencil buffer. */ blitRenderTarget(read, draw, color = true, depth = true, stencil = true) {} /** * Generate mipmaps for the texture you pass in. * @param {TextureBase} texture - The texture to update. */ generateMipmaps(texture) {} /** * Read pixels from a texture. * This is an asynchronous operation. See {@link ThinRenderer#readTexturePixelsSync} for the synchronous version. * @param {TextureBase} texture - The texture to read from. * @param {number} x - The x coordinate of the rectangle to read from. * @param {number} y - The y coordinate of the rectangle to read from. * @param {number} width - The width of the rectangle to read from. * @param {number} height - The height of the rectangle to read from. * @param {TypedArray} buffer - The buffer to store the pixel data. * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index. * @param {number} [mipLevel=0] - The mip level to read. * @returns {Promise} A promise that resolves with the passed in buffer after it has been filled with the pixel data. */ readTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {} /** * Read pixels from a texture. * This is a synchronous operation. See {@link ThinRenderer#readTexturePixels} for the asynchronous version. * @param {TextureBase} texture - The texture to read from. * @param {number} x - The x coordinate of the rectangle to read from. * @param {number} y - The y coordinate of the rectangle to read from. * @param {number} width - The width of the rectangle to read from. * @param {number} height - The height of the rectangle to read from. * @param {TypedArray} buffer - The buffer to store the pixel data. * @param {number} [zIndex=0] - For CubeTexture, the face index; for Texture3D/TextureArray, the layer/slice index. * @param {number} [mipLevel=0] - The mip level to read. * @returns {TypedArray} The passed in buffer after it has been filled with the pixel data. */ readTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) {} /** * Reset vertex array object bindings. * @param {boolean} [force=false] - Whether clear the current vertex array object. */ resetVertexArrayBindings(force) {} /** * Reset all render states cached in this renderer. * This is useful when you use multiple renderers in one application. */ resetState() {} /** * Begin an occlusion query. * @param {number} index - The query index in the current occlusion query set. */ beginOcclusionQuery(index) {} /** * End the current occlusion query. */ endOcclusionQuery() {} /** * Read back the results of a query set. * This is an asynchronous operation. * @param {QuerySet} querySet - The query set to read from. * @param {Array|TypedArray} dstBuffer - The buffer to store the results. * @param {number} [firstQuery=0] - The first query index to read. * @param {number} [queryCount=querySet.count] - The number of queries to read. * @returns {Promise} A promise that resolves with the passed in buffer after it has been filled with the results. */ readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) {} /** * Used for context lost and restored. * @protected * @returns {number} */ increaseId() { this.id = _rendererId++; return this.id; } } export { ThinRenderer }; ================================================ FILE: src/render/passes/ShaderPostPass.js ================================================ import { Scene } from '../../scenes/Scene.js'; import { Camera } from '../../scenes/Camera.js'; import { Mesh } from '../../scenes/Mesh.js'; import { Vector3 } from '../../math/Vector3.js'; import { Geometry } from '../../resources/geometries/Geometry.js'; import { Attribute } from '../../resources/geometries/Attribute.js'; import { Buffer } from '../../resources/geometries/Buffer.js'; import { ShaderMaterial } from '../../resources/materials/ShaderMaterial.js'; /** * Shader post pass. */ class ShaderPostPass { /** * @param {object} shader - Shader object for the shader material. * @param {string} shader.name - Name of the shader. * @param {object} shader.defines - Defines of the shader. * @param {object} shader.uniforms - Uniforms of the shader. * @param {string} shader.vertexShader - Vertex shader GLSL code. * @param {string} shader.fragmentShader - Fragment shader GLSL code. */ constructor(shader) { const scene = new Scene(); const camera = this.camera = new Camera(); camera.frustumCulled = false; camera.position.set(0, 0, 1); camera.lookAt(new Vector3(0, 0, 0), new Vector3(0, 1, 0)); camera.setOrtho(-1, 1, -1, 1, 0.1, 2); scene.add(camera); const geometry = this.geometry = new Geometry(); // fullscreen triangle geometry.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array([-1, 3, 0, -1, -1, 0, 3, -1, 0]), 3))); geometry.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array([0, 2, 0, 0, 2, 0]), 2))); const material = this.material = new ShaderMaterial(shader); this.uniforms = material.uniforms; const plane = new Mesh(geometry, material); plane.frustumCulled = false; scene.add(plane); // static scene scene.updateMatrix(); this.renderStates = scene.updateRenderStates(camera); const renderQueue = scene.updateRenderQueue(camera, false, false); this.renderQueueLayer = renderQueue.layerList[0]; this.renderConfig = {}; } /** * Render the post pass. * @param {ThinRenderer} renderer - The renderer. * @param {RenderTarget} renderTarget - The render target. */ render(renderer, renderTarget) { renderer.beginRender(renderTarget); renderer.renderRenderableList(this.renderQueueLayer.opaque, this.renderStates, this.renderConfig); renderer.endRender(); } /** * Dispose the post pass. */ dispose() { this.geometry.dispose(); this.material.dispose(); } } export { ShaderPostPass }; ================================================ FILE: src/render/passes/ShadowMapPass.js ================================================ import { DRAW_SIDE } from '../../const.js'; import { DepthMaterial } from '../../resources/materials/DepthMaterial.js'; import { DistanceMaterial } from '../../resources/materials/DistanceMaterial.js'; import { Vector4 } from '../../math/Vector4.js'; /** * Shadow map pass. */ class ShadowMapPass { constructor() { /** * Get depth material function. * Override this to use custom depth material. * @type {Function} */ this.getDepthMaterial = _getDepthMaterial; /** * Get distance material function. * Override this to use custom distance material. * @type {Function} */ this.getDistanceMaterial = _getDistanceMaterial; /** * Define which render layers will produce shadows. * If the value is Null, it means that all render layers will produce shadows. * @type {null | Array} * @default null */ this.shadowLayers = null; /** * Whether transparent objects can cast shadows. * @type {boolean} * @default false */ this.transparentShadow = false; const state = { isPointLight: false, light: null }; this._state = state; const that = this; this._renderOptions = { getGeometry: null, getMaterial: function(renderable) { return state.isPointLight ? that.getDistanceMaterial(renderable, state.light) : that.getDepthMaterial(renderable, state.light); }, ifRender: function(renderable) { return (state.light.groupMask & (1 << renderable.material.lightingGroup)) && renderable.object.castShadow; } }; } /** * Get geometry function for shadow render options. * @type {null | Function} */ set getGeometry(func) { if (func) { this._renderOptions.getGeometry = func; } else { delete this._renderOptions.getGeometry; } } get getGeometry() { return this._renderOptions.getGeometry; } /** * The if render function for shadow render options. * @type {Function} */ set ifRender(func) { if (func) { this._renderOptions.ifRender = func; } else { delete this._renderOptions.ifRender; } } get ifRender() { return this._renderOptions.ifRender; } /** * Render shadow map. * @param {ThinRenderer} renderer * @param {Scene} scene */ render(renderer, scene) { // @deprecated // This can be deleted when renderer.setClearColor is completely removed. oldClearColor.copy(renderer.getClearColor()); const lightingData = scene.collector.lightingData; const lightsArray = lightingData.lightsArray; const shadowsNum = lightingData.shadowsNum; for (let i = 0; i < shadowsNum; i++) { const light = lightsArray[i]; const shadow = light.shadow; if (shadow.autoUpdate === false && shadow.needsUpdate === false) continue; const camera = shadow.camera; const shadowTarget = shadow.renderTarget; const isPointLight = light.isPointLight; const faces = isPointLight ? 6 : 1; this._state.isPointLight = isPointLight; this._state.light = light; const renderOptions = this._renderOptions; shadow.prepareDepthMap(!scene.disableShadowSampler, renderer.capabilities); for (let j = 0; j < faces; j++) { if (isPointLight) { shadow.update(light, j); shadowTarget.activeLayer = j; } shadowTarget .setColorClearValue(1, 1, 1, 1) .setClear(true, true, false); const renderStates = scene.updateRenderStates(camera, j === 0); const renderQueue = scene.updateRenderQueue(camera, false, false); renderer.beginRender(shadowTarget); for (let k = 0; k < renderQueue.layerList.length; k++) { const renderQueueLayer = renderQueue.layerList[k]; if (this.shadowLayers !== null && this.shadowLayers.indexOf(renderQueueLayer.id) === -1) continue; renderer.renderRenderableList(renderQueueLayer.opaque, renderStates, renderOptions); if (this.transparentShadow) { renderer.renderRenderableList(renderQueueLayer.transparent, renderStates, renderOptions); } } renderer.endRender(); } shadow.needsUpdate = false; } // @deprecated // This can be deleted when renderer.setClearColor is completely removed. renderer.setClearColor(oldClearColor.x, oldClearColor.y, oldClearColor.z, oldClearColor.w); } } const oldClearColor = new Vector4(); const shadowSide = { 'front': DRAW_SIDE.BACK, 'back': DRAW_SIDE.FRONT, 'double': DRAW_SIDE.DOUBLE }; const depthMaterials = {}; const distanceMaterials = {}; function _getDepthMaterial(renderable, light) { const useSkinning = !!renderable.object.skeleton; const useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0; const clippingPlanes = renderable.material.clippingPlanes; const numClippingPlanes = (clippingPlanes && clippingPlanes.length > 0) ? clippingPlanes.length : 0; const index = useMorphing << 0 | useSkinning << 1; let materials = depthMaterials[index]; if (materials === undefined) { materials = {}; depthMaterials[index] = materials; } let material = materials[numClippingPlanes]; if (material === undefined) { material = new DepthMaterial(); material.packToRGBA = true; materials[numClippingPlanes] = material; } material.side = shadowSide[renderable.material.side]; material.clippingPlanes = renderable.material.clippingPlanes; material.drawMode = renderable.material.drawMode; return material; } function _getDistanceMaterial(renderable, light) { const useSkinning = !!renderable.object.skeleton; const useMorphing = renderable.geometry.morphAttributes.position && renderable.geometry.morphAttributes.position.length > 0; const clippingPlanes = renderable.material.clippingPlanes; const numClippingPlanes = (clippingPlanes && clippingPlanes.length > 0) ? clippingPlanes.length : 0; const index = useMorphing << 0 | useSkinning << 1; let materials = distanceMaterials[index]; if (materials === undefined) { materials = {}; distanceMaterials[index] = materials; } let material = materials[numClippingPlanes]; if (material === undefined) { material = new DistanceMaterial(); materials[numClippingPlanes] = material; } material.side = shadowSide[renderable.material.side]; material.uniforms['nearDistance'] = light.shadow.cameraNear; material.uniforms['farDistance'] = light.shadow.cameraFar; material.clippingPlanes = renderable.material.clippingPlanes; material.drawMode = renderable.material.drawMode; return material; } export { ShadowMapPass }; ================================================ FILE: src/resources/QuerySet.js ================================================ import { EventDispatcher } from '../EventDispatcher.js'; let _querySetId = 0; /** * A QuerySet holds a set of queries of a particular type. * @extends EventDispatcher */ class QuerySet extends EventDispatcher { /** * Creates a new QuerySet. * @param {QUERYSET_TYPE} type - The type of the query set. * @param {number} count - The number of queries in the set. */ constructor(type, count) { super(); /** * Unique number for this query set instance. * @readonly * @type {number} */ this.id = _querySetId++; /** * The name of the query set. * @type {string} * @default "" */ this.name = ''; /** * The type of the query set. * @readonly * @type {QUERYSET_TYPE} */ this.type = type; /** * The max number of queries in the set. * @readonly * @type {number} */ this.count = count; /** * Indicates whether the query set operates in conservative mode. * This property only applies to occlusion query sets in WebGL renderer. * @type {boolean} * @default true */ this.conservative = true; } /** * Dispose this query set. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } export { QuerySet }; ================================================ FILE: src/resources/Raycaster.js ================================================ import { Ray } from '../math/Ray.js'; /** * This class is designed to assist with raycasting. Raycasting is used for * mouse picking (working out what objects in the 3d space the mouse is over) * amongst other things. */ class Raycaster { /** * Constructs a new raycaster. * @param {Vector3} origin — The origin vector where the ray casts from. * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray. */ constructor(origin, direction) { /** * The ray used for raycasting. * @type {Ray} */ this.ray = new Ray(origin, direction); } /** * Updates the ray with a new origin and direction by copying the values from the arguments. * @param {Vector3} origin — The origin vector where the ray casts from. * @param {Vector3} direction — The (normalized) direction vector that gives direction to the ray. */ set(origin, direction) { // direction is assumed to be normalized (for accurate distance calculations) this.ray.set(origin, direction); } /** * Uses the given coordinates and camera to compute a new origin and direction for the internal ray. * @param {Vector2} coords — 2D coordinates of the mouse, in normalized device coordinates (NDC). * X and Y components should be between `-1` and `1`. * @param {Camera} camera — The camera from which the ray should originate. */ setFromCamera(coords, camera) { if (camera.projectionMatrix.elements[11] === -1.0) { // perspective this.ray.origin.setFromMatrixPosition(camera.worldMatrix); this.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize(); } else { // orthographic // set origin in plane of camera // projectionMatrix.elements[14] = (near + far) / (near - far) this.ray.origin.set(coords.x, coords.y, camera.projectionMatrix.elements[14]).unproject(camera); this.ray.direction.set(0, 0, -1).transformDirection(camera.worldMatrix); } } /** * Checks all intersection between the ray and the object with or without the * descendants. Intersections are returned sorted by distance, closest first. * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ] * @param {Object3D} object — The 3D object to check for intersection with the ray. * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants. * Otherwise it only checks intersection with the object. * @param {object[]} [intersects=[]] - The target array that holds the result of the method. * @returns {object[]} An array holding the intersection points. */ intersectObject(object, recursive = false, intersects = []) { intersect(object, this, intersects, recursive); intersects.sort(ascSort); return intersects; } /** * Checks all intersection between the ray and the objects with or without * the descendants. Intersections are returned sorted by distance, closest first. * An array of intersections is returned: [ { distance, point, face, faceIndex, object, uv }, ... ] * @param {Object3D[]} objects — The 3D objects to check for intersection with the ray. * @param {boolean} [recursive=false] — If set to `true`, it also checks all descendants. * Otherwise it only checks intersection with the object. * @param {object[]} [intersects=[]] - The target array that holds the result of the method. * @returns {object[]} An array holding the intersection points. */ intersectObjects(objects, recursive = false, intersects = []) { for (let i = 0, l = objects.length; i < l; i++) { intersect(objects[i], this, intersects, recursive); } intersects.sort(ascSort); return intersects; } } function ascSort(a, b) { return a.distance - b.distance; } function intersect(object, raycaster, intersects, recursive) { let propagate = true; const result = object.raycast(raycaster.ray, intersects); if (result === false) propagate = false; if (propagate === true && recursive === true) { const children = object.children; for (let i = 0, l = children.length; i < l; i++) { intersect(children[i], raycaster, intersects, true); } } } export { Raycaster }; ================================================ FILE: src/resources/RenderBuffer.js ================================================ import { PIXEL_FORMAT } from '../const.js'; import { EventDispatcher } from '../EventDispatcher.js'; /** * Render Buffer can be attached to RenderTarget. * @extends EventDispatcher */ class RenderBuffer extends EventDispatcher { /** * @param {number} width - The width of the render buffer. * @param {number} height - The height of the render buffer. * @param {PIXEL_FORMAT} [format=PIXEL_FORMAT.RGBA8] - The internal format of the render buffer. * @param {number} [multipleSampling=0] - If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0) */ constructor(width, height, format = PIXEL_FORMAT.RGBA8, multipleSampling = 0) { super(); /** * The width of the render buffer. * @type {number} */ this.width = width; /** * The height of the render buffer. * @type {number} */ this.height = height; /** * Render buffer texel storage data format. * DEPTH_COMPONENT16: for depth attachments. * DEPTH_STENCIL: for depth stencil attachments. * RGBA8:for multiple sampled color attachments. * DEPTH_COMPONENT16: for multiple sampled depth attachments. * DEPTH24_STENCIL8: for multiple sampled depth stencil attachments. * @type {PIXEL_FORMAT} * @default PIXEL_FORMAT.RGBA8 */ this.format = format; /** * If bigger than zero, this renderBuffer will support multipleSampling. (Only usable in WebGL 2.0) * A Render Target's attachments must have the same multipleSampling value. * Texture can't be attached to the same render target with a multiple sampled render buffer. * Max support 8. * @type {number} * @default 0 */ this.multipleSampling = multipleSampling; } /** * Resize the render buffer. * @param {number} width - The width of the render buffer. * @param {number} height - The height of the render buffer. * @returns {boolean} - If size changed. */ resize(width, height) { if (this.width !== width || this.height !== height) { this.dispose(); this.width = width; this.height = height; return true; } return false; } /** * Returns a clone of this render buffer. * @returns {RenderBuffer} */ clone() { return new this.constructor().copy(this); } /** * Copy the given render buffer into this render buffer. * @param {RenderBuffer} source - The render buffer to be copied. * @returns {RenderBuffer} */ copy(source) { this.format = source.format; this.multipleSampling = source.multipleSampling; return this; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RenderBuffer.prototype.isRenderBuffer = true; export { RenderBuffer }; ================================================ FILE: src/resources/Skeleton.js ================================================ import { Texture2D } from './textures/Texture2D.js'; import { PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_FILTER } from '../const.js'; import { Matrix4 } from '../math/Matrix4.js'; import { MathUtils } from '../math/MathUtils.js'; const _offsetMatrix = new Matrix4(); /** * Use an array of bones to create a skeleton that can be used by a {@link SkinnedMesh}. */ class Skeleton { /** * @param {Bone[]} bones * @param {Matrix4[]} boneInverses */ constructor(bones, boneInverses) { /** * The array of bones. * @type {Bone[]} */ this.bones = bones.slice(0); /** * An array of Matrix4s that represent the inverse of the worldMatrix of the individual bones. * @type {Matrix4[]} */ this.boneInverses = boneInverses; /** * The array buffer holding the bone data. * @type {Float32Array} */ this.boneMatrices = new Float32Array(16 * this.bones.length); /** * The {@link Texture2D} holding the bone data when using a vertex texture. * Use vertex texture to update boneMatrices, by that way, we can use more bones on phone. * @type {Texture2D|undefined} * @default undefined */ this.boneTexture = undefined; this._version = 0; } /** * Returns the skeleton to the base pose. */ pose() { const boneInverses = this.boneInverses; for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; bone.worldMatrix.copy(boneInverses[i]).invert(); } for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; if (bone.parent && bone.parent.isBone) { bone.matrix.copy(bone.parent.worldMatrix).invert(); bone.matrix.multiply(bone.worldMatrix); } else { bone.matrix.copy(bone.worldMatrix); } bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); } } /** * Clone skeleton. * @returns {Skeleton} */ clone() { return new Skeleton(this.bones, this.boneInverses); } /** * Updates the boneMatrices and boneTexture after changing the bones. * This is called automatically if the skeleton is used with a SkinnedMesh. * @ignore */ updateBones(sceneData) { const useAnchorMatrix = sceneData.useAnchorMatrix; const anchorMatrixInverse = sceneData.anchorMatrixInverse; const boneInverses = this.boneInverses; for (let i = 0; i < this.bones.length; i++) { const bone = this.bones[i]; _offsetMatrix.multiplyMatrices(bone.worldMatrix, boneInverses[i]); if (useAnchorMatrix) { _offsetMatrix.premultiply(anchorMatrixInverse); } _offsetMatrix.toArray(this.boneMatrices, i * 16); } if (this.boneTexture !== undefined) { this.boneTexture.version++; } } generateBoneTexture() { let size = MathUtils.nextPowerOfTwoSquareSize(this.bones.length * 4); size = Math.max(size, 4); const boneMatrices = new Float32Array(size * size * 4); boneMatrices.set(this.boneMatrices); const boneTexture = new Texture2D(); boneTexture.image = { data: boneMatrices, width: size, height: size }; boneTexture.format = PIXEL_FORMAT.RGBA; boneTexture.type = PIXEL_TYPE.FLOAT; boneTexture.magFilter = TEXTURE_FILTER.NEAREST; boneTexture.minFilter = TEXTURE_FILTER.NEAREST; boneTexture.generateMipmaps = false; boneTexture.flipY = false; this.boneMatrices = boneMatrices; this.boneTexture = boneTexture; } } export { Skeleton }; ================================================ FILE: src/resources/TransformUV.js ================================================ import { Matrix3 } from '../math/Matrix3.js'; import { Vector2 } from '../math/Vector2.js'; /** * A transform object for UV coordinates. * @extends Matrix3 */ class TransformUV extends Matrix3 { /** * Create a new TransformUV object. */ constructor() { super(); this.offset = new Vector2(0, 0); this.scale = new Vector2(1, 1); this.center = new Vector2(0, 0); this.rotation = 0; this.needsUpdate = false; } /** * Update the matrix for UV transformation based on the offset, scale, rotation and center. * If needsUpdate is false, this method will do nothing. * @returns {TransformUV} This object. */ update() { if (!this.needsUpdate) return this; this.needsUpdate = false; this.updateMatrix(); return this; } /** * Update the matrix for UV transformation based on the offset, scale, rotation and center. * This method will always update the matrix regardless of the needsUpdate flag. * @returns {TransformUV} This object. */ updateMatrix() { return this.setUvTransform( this.offset.x, this.offset.y, this.scale.x, this.scale.y, this.rotation, this.center.x, this.center.y ); } /** * Copy the properties of another TransformUV object. * @param {TransformUV|Matrix3} source - The object to copy the properties from. * @returns {TransformUV} This object. */ copy(source) { super.copy(source); // in case source is only a Matrix3 object (without additional properties) if (!source.isTransformUV) return this; this.offset.copy(source.offset); this.scale.copy(source.scale); this.center.copy(source.center); this.rotation = source.rotation; this.needsUpdate = source.needsUpdate; return this; } /** * Clone this TransformUV object. * @returns {TransformUV} The cloned object. */ clone() { return new this.constructor().copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TransformUV.prototype.isTransformUV = true; export { TransformUV }; ================================================ FILE: src/resources/fogs/Fog.js ================================================ import { Color3 } from '../../math/Color3.js'; /** * Linear fog. */ class Fog { /** * @param {number} [color=0x000000] - The color of the fog. * @param {number} [near=1] - The near clip of the fog. * @param {number} [far=1000] - The far clip of the fog. */ constructor(color = 0x000000, near = 1, far = 1000) { /** * The color of the fog. * @type {Color3} * @default Color3(0x000000) */ this.color = new Color3(color); /** * The near clip of the fog. * @type {number} * @default 1 */ this.near = near; /** * The far clip of the fog. * @type {number} * @default 1000 */ this.far = far; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Fog.prototype.isFog = true; export { Fog }; ================================================ FILE: src/resources/fogs/FogExp2.js ================================================ import { Color3 } from '../../math/Color3.js'; /** * Exp2 fog. */ class FogExp2 { /** * @param {number} [color=0x000000] - The color of the fog. * @param {number} [density=0.00025] - The density of the exp2 fog. */ constructor(color = 0x000000, density = 0.00025) { /** * The color of the fog. * @type {Color3} * @default Color3(0x000000) */ this.color = new Color3(color); /** * The density of the exp2 fog. * @type {number} * @default 0.00025 */ this.density = density; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ FogExp2.prototype.isFogExp2 = true; export { FogExp2 }; ================================================ FILE: src/resources/geometries/Attribute.js ================================================ /** * The Attribute add structural information to Buffer. * This class stores data for an attribute (such as vertex positions, face indices, normals, colors, UVs, and any custom attributes ) associated with a Geometry, which allows for more efficient passing of data to the GPU. * Data is stored as vectors of any length (defined by size). */ class Attribute { /** * @param {Buffer} buffer - The Buffer instance passed in the constructor. * @param {number} [size=buffer.stride] - The number of values of the array that should be associated with a particular vertex. For instance, if this attribute is storing a 3-component vector (such as a position, normal, or color), then size should be 3. * @param {number} [offset=0] - The offset in the underlying array buffer where an item starts. * @param {boolean} [normalized=false] - Indicates how the underlying data in the buffer maps to the values in the GLSL shader code. */ constructor(buffer, size = buffer.stride, offset = 0, normalized = false) { /** * The Buffer instance passed in the constructor. * @type {Buffer} */ this.buffer = buffer; /** * The number of values of the buffer that should be associated with the attribute. * @type {number} * @default buffer.stride */ this.size = size; /** * The offset in the underlying buffer where an item starts. * @type {number} * @default 0 */ this.offset = offset; /** * Indicates how the underlying data in the buffer maps to the values in the GLSL shader code. * @type {boolean} * @default false */ this.normalized = normalized; /** * Instance cadence, the number of instances drawn for each vertex in the buffer, non-instance attributes must be 0. * @type {number} * @default 0 */ this.divisor = 0; } /** * Copy the parameters from the passed attribute. * @param {Attribute} source - The attribute to be copied. * @returns {Attribute} */ copy(source) { this.buffer = source.buffer; this.size = source.size; this.offset = source.offset; this.normalized = source.normalized; this.divisor = source.divisor; return this; } /** * Return a new attribute with the same parameters as this attribute. * @param {object} buffers - A WeakMap to save shared buffers. * @returns {Attribute} */ clone(buffers) { let attribute; if (!buffers) { console.warn('Attribute.clone(): now requires a WeakMap as an argument to save shared buffers.'); attribute = new Attribute(this.buffer.clone(), this.size, this.offset, this.normalized); attribute.divisor = this.divisor; return attribute; } if (!buffers.has(this.buffer)) { buffers.set(this.buffer, this.buffer.clone()); } attribute = new Attribute(buffers.get(this.buffer), this.size, this.offset, this.normalized); attribute.divisor = this.divisor; return attribute; } } export { Attribute }; ================================================ FILE: src/resources/geometries/BoxGeometry.js ================================================ import { Geometry } from './Geometry.js'; import { Buffer } from './Buffer.js'; import { Attribute } from './Attribute.js'; import { Vector3 } from '../../math/Vector3.js'; /** * BoxGeometry is the quadrilateral primitive geometry class. * It is typically used for creating a cube or irregular quadrilateral of the dimensions provided with the 'width', 'height', and 'depth' constructor arguments. * @extends Geometry */ class BoxGeometry extends Geometry { /** * @param {number} [width=1] - Width of the sides on the X axis. * @param {number} [height=1] - Height of the sides on the Y axis. * @param {number} [depth=1] - Depth of the sides on the Z axis. * @param {number} [widthSegments=1] - Number of segmented faces along the width of the sides. * @param {number} [heightSegments=1] - Number of segmented faces along the height of the sides. * @param {number} [depthSegments=1] - Number of segmented faces along the depth of the sides. */ constructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) { super(); const scope = this; // segments widthSegments = Math.floor(widthSegments); heightSegments = Math.floor(heightSegments); depthSegments = Math.floor(depthSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let numberOfVertices = 0; let groupStart = 0; // build each side of the box geometry buildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0); // px buildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1); // nx buildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2); // py buildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3); // ny buildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4); // pz buildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5); // nz // build geometry this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); function buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) { const segmentWidth = width / gridX; const segmentHeight = height / gridY; const widthHalf = width / 2; const heightHalf = height / 2; const depthHalf = depth / 2; const gridX1 = gridX + 1; const gridY1 = gridY + 1; let vertexCounter = 0; let groupCount = 0; const vector = new Vector3(); // generate vertices, normals and uvs for (let iy = 0; iy < gridY1; iy++) { const y = iy * segmentHeight - heightHalf; for (let ix = 0; ix < gridX1; ix++) { const x = ix * segmentWidth - widthHalf; // set values to correct vector component vector[u] = x * udir; vector[v] = y * vdir; vector[w] = depthHalf; // now apply vector to vertex buffer vertices.push(vector.x, vector.y, vector.z); // set values to correct vector component vector[u] = 0; vector[v] = 0; vector[w] = depth > 0 ? 1 : -1; // now apply vector to normal buffer normals.push(vector.x, vector.y, vector.z); // uvs uvs.push(ix / gridX); uvs.push(1 - (iy / gridY)); // counters vertexCounter += 1; } } // indices // 1. you need three indices to draw a single face // 2. a single segment consists of two faces // 3. so we need to generate six (2*3) indices per segment for (let iy = 0; iy < gridY; iy++) { for (let ix = 0; ix < gridX; ix++) { const a = numberOfVertices + ix + gridX1 * iy; const b = numberOfVertices + ix + gridX1 * (iy + 1); const c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1); const d = numberOfVertices + (ix + 1) + gridX1 * iy; // faces indices.push(a, b, d); indices.push(b, c, d); // increase counter groupCount += 6; } } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, materialIndex); // calculate new start value for groups groupStart += groupCount; // update total number of vertices numberOfVertices += vertexCounter; } this.computeBoundingBox(); this.computeBoundingSphere(); } } export { BoxGeometry }; ================================================ FILE: src/resources/geometries/Buffer.js ================================================ import { BUFFER_USAGE } from '../../const.js'; /** * The Buffer contain the data that is used for the geometry of 3D models, animations, and skinning. */ class Buffer { /** * @param {TypedArray} array -- A typed array with a shared buffer. Stores the geometry data. * @param {number} stride -- The number of typed-array elements per vertex. */ constructor(array, stride) { /** * A typed array with a shared buffer. * Stores the geometry data. * @type {TypedArray} */ this.array = array; /** * The number of typed-array elements per vertex. * @type {number} */ this.stride = stride; /** * Gives the total number of elements in the array. * @type {number} */ this.count = array !== undefined ? array.length / stride : 0; /** * Defines the intended usage pattern of the data store for optimization purposes. * Corresponds to the usage parameter of WebGLRenderingContext.bufferData(). * @type {BUFFER_USAGE} * @default BUFFER_USAGE.STATIC_DRAW */ this.usage = BUFFER_USAGE.STATIC_DRAW; /** * Object containing offset and count. * @type {object} * @default { offset: 0, count: - 1 } */ this.updateRange = { offset: 0, count: -1 }; /** * A version number, incremented every time the data is changed. * @type {number} * @default 0 */ this.version = 0; } /** * A callback function that is executed after the Renderer has transferred the attribute array data to the GPU. */ onUploadCallback() {} /** * Copies another Buffer to this Buffer. * @param {Buffer} source - The buffer to be copied. * @returns {Buffer} */ copy(source) { this.array = new source.array.constructor(source.array); this.stride = source.stride; this.count = source.array.length / this.stride; this.usage = source.usage; return this; } /** * Return a copy of this buffer. * @returns {Buffer} */ clone() { const array = new this.array.constructor(this.array); const ib = new Buffer(array, this.stride); ib.usage = this.usage; return ib; } } export { Buffer }; ================================================ FILE: src/resources/geometries/CylinderGeometry.js ================================================ import { Geometry } from './Geometry.js'; import { Attribute } from './Attribute.js'; import { Buffer } from './Buffer.js'; import { Vector2 } from '../../math/Vector2.js'; import { Vector3 } from '../../math/Vector3.js'; /** * A class for generating cylinder geometries. * @extends Geometry */ class CylinderGeometry extends Geometry { /** * @param {number} [radiusTop=1] — Radius of the cylinder at the top. * @param {number} [radiusBottom=1] — Radius of the cylinder at the bottom. * @param {number} [height=1] — Height of the cylinder. * @param {number} [radialSegments=8] — Number of segmented faces around the circumference of the cylinder. * @param {number} [heightSegments=1] — Number of rows of faces along the height of the cylinder. * @param {number} [openEnded=false] — A Boolean indicating whether the ends of the cylinder are open or capped. Default is false, meaning capped. * @param {number} [thetaStart=0] — Start angle for first segment, default = 0 (three o'clock position). * @param {number} [thetaLength=2*Pi] — The central angle, often called theta, of the circular sector. The default is 2*Pi, which makes for a complete cylinder. */ constructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { super(); const scope = this; radialSegments = Math.floor(radialSegments); heightSegments = Math.floor(heightSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let index = 0; const indexArray = []; const halfHeight = height / 2; let groupStart = 0; // generate geometry generateTorso(); if (openEnded === false) { if (radiusTop > 0) generateCap(true); if (radiusBottom > 0) generateCap(false); } // build geometry this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); function generateTorso() { const normal = new Vector3(); const vertex = new Vector3(); let groupCount = 0; let x, y; // this will be used to calculate the normal const slope = (radiusBottom - radiusTop) / height; // generate vertices, normals and uvs for (y = 0; y <= heightSegments; y++) { const indexRow = []; const v = y / heightSegments; // calculate the radius of the current row const radius = v * (radiusBottom - radiusTop) + radiusTop; for (x = 0; x <= radialSegments; x++) { const u = x / radialSegments; const theta = u * thetaLength + thetaStart; const sinTheta = Math.sin(theta); const cosTheta = Math.cos(theta); // vertex vertex.x = radius * sinTheta; vertex.y = -v * height + halfHeight; vertex.z = radius * cosTheta; vertices.push(vertex.x, vertex.y, vertex.z); // normal normal.set(sinTheta, slope, cosTheta).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(u, 1 - v); // save index of vertex in respective row indexRow.push(index++); } // now save vertices of the row in our index array indexArray.push(indexRow); } // generate indices for (x = 0; x < radialSegments; x++) { for (y = 0; y < heightSegments; y++) { // we use the index array to access the correct indices const a = indexArray[y][x]; const b = indexArray[y + 1][x]; const c = indexArray[y + 1][x + 1]; const d = indexArray[y][x + 1]; // faces if (radiusTop > 0 || y !== 0) { indices.push(a, b, d); groupCount += 3; } if (radiusBottom > 0 || y !== heightSegments - 1) { indices.push(b, c, d); groupCount += 3; } } } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, 0); // calculate new start value for groups groupStart += groupCount; } function generateCap(top) { // save the index of the first center vertex const centerIndexStart = index; const uv = new Vector2(); const vertex = new Vector3(); let groupCount = 0; let x; const radius = (top === true) ? radiusTop : radiusBottom; const sign = (top === true) ? 1 : -1; // first we generate the center vertex data of the cap. // because the geometry needs one set of uvs per face, // we must generate a center vertex per face/segment for (x = 1; x <= radialSegments; x++) { // vertex vertices.push(0, halfHeight * sign, 0); // normal normals.push(0, sign, 0); // uv uvs.push(0.5, 0.5); // increase index index++; } // save the index of the last center vertex const centerIndexEnd = index; // now we generate the surrounding vertices, normals and uvs for (x = 0; x <= radialSegments; x++) { const u = x / radialSegments; const theta = u * thetaLength + thetaStart; const cosTheta = Math.cos(theta); const sinTheta = Math.sin(theta); // vertex vertex.x = radius * sinTheta; vertex.y = halfHeight * sign; vertex.z = radius * cosTheta; vertices.push(vertex.x, vertex.y, vertex.z); // normal normals.push(0, sign, 0); // uv uv.x = (cosTheta * 0.5) + 0.5; uv.y = (sinTheta * 0.5 * sign) + 0.5; uvs.push(uv.x, uv.y); // increase index index++; } // generate indices for (x = 0; x < radialSegments; x++) { const c = centerIndexStart + x; const i = centerIndexEnd + x; if (top === true) { // face top indices.push(i, i + 1, c); } else { // face bottom indices.push(i + 1, i, c); } groupCount += 3; } // add a group to the geometry. this will ensure multi material support scope.addGroup(groupStart, groupCount, top === true ? 1 : 2); // calculate new start value for groups groupStart += groupCount; } this.computeBoundingBox(); this.computeBoundingSphere(); } } export { CylinderGeometry }; ================================================ FILE: src/resources/geometries/Geometry.js ================================================ import { Attribute } from './Attribute.js'; import { Buffer } from './Buffer.js'; import { EventDispatcher } from '../../EventDispatcher.js'; import { MathUtils } from '../../math/MathUtils.js'; import { Box3 } from '../../math/Box3.js'; import { Sphere } from '../../math/Sphere.js'; import { Vector3 } from '../../math/Vector3.js'; let _geometryId = 0; const _vector = new Vector3(); const _offset = new Vector3(); const _sum = new Vector3(); const _box3 = new Box3(); const _boxMorphTargets = new Box3(); /** * An efficient representation of mesh, line, or point geometry. * Includes vertex positions, face indices, normals, colors, UVs, and custom attributes within buffers, reducing the cost of passing all this data to the GPU. * To read and edit data in {@link Geometry#attributes}. * @extends EventDispatcher */ class Geometry extends EventDispatcher { /** * Create a geometry. */ constructor() { super(); /** * Unique number for this geometry instance. * @readonly * @type {number} */ this.id = _geometryId++; /** * UUID of this geometry instance. * This gets automatically assigned, so this shouldn't be edited. * @readonly * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * This hashmap has as id the name of the attribute to be set and as value the buffer to set it to. * Rather than accessing this property directly, use {@link Geometry#addAttribute} and {@link Geometry#getAttribute} to access attributes of this geometry. * @type {object} */ this.attributes = {}; /** * Hashmap of Attributes Array for morph targets. * @type {object} */ this.morphAttributes = {}; /** * Allows for vertices to be re-used across multiple triangles; this is called using "indexed triangles" and each triangle is associated with the indices of three vertices. * This attribute therefore stores the index of each vertex for each triangular face. * If this attribute is not set, the renderer assumes that each three contiguous positions represent a single triangle. * @type {Attribute | null} */ this.index = null; /** * Bounding box for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingBox}. * @type {Box3} * @default Box3() */ this.boundingBox = new Box3(); /** * Bounding sphere for the bufferGeometry, which can be calculated with {@link Geometry#computeBoundingSphere}. * @type {Sphere} * @default Sphere() */ this.boundingSphere = new Sphere(); /** * Split the geometry into groups, each of which will be rendered in a separate WebGL draw call. This allows an array of materials to be used with the geometry. * Each group is an object of the form: { start: Integer, count: Integer, materialIndex: Integer }, * or { multiDrawStarts: Integer[], multiDrawCounts: Integer[], multiDrawCount: Integer, materialIndex: Integer } if multiDraw is available. * @type {Array} * @default [] */ this.groups = []; /** * The number of instances to be rendered. If set to -1 (default), instanced rendering is disabled. * This property is used for instanced rendering, where multiple copies of the geometry * are drawn with a single draw call. * @type {number} * @default -1 */ this.instanceCount = -1; /** * A version number, incremented every time the attribute object or index object changes to mark VAO drity. * @type {number} * @default 0 */ this.version = 0; } /** * Adds an attribute to this geometry. * Use this rather than the attributes property. * @param {string} name * @param {Attribute} attribute */ addAttribute(name, attribute) { this.attributes[name] = attribute; } /** * Returns the attribute with the specified name. * @param {string} name * @returns {Attribute} */ getAttribute(name) { return this.attributes[name]; } /** * Removes the attribute with the specified name. * @param {string} name */ removeAttribute(name) { delete this.attributes[name]; } /** * Set the {@link Geometry#index} buffer. * @param {Array | Attribute | null} index */ setIndex(index) { if (Array.isArray(index)) { const typedArray = new (arrayMax(index) > 65535 ? Uint32Array : Uint16Array)(index); this.index = new Attribute(new Buffer(typedArray, 1)); } else { this.index = index; } } /** * Adds a group to this geometry; see the {@link Geometry#groups} for details. * @param {number} start * @param {number} count * @param {number} [materialIndex=0] */ addGroup(start, count, materialIndex = 0) { this.groups.push({ start: start, count: count, materialIndex: materialIndex }); } /** * Clears all groups. */ clearGroups() { this.groups = []; } /** * Computes bounding box of the geometry, updating {@link Geometry#boundingBox}. * Bounding boxes aren't computed by default. They need to be explicitly computed. */ computeBoundingBox() { const position = this.attributes['a_Position'] || this.attributes['position']; if (position) { this.boundingBox.setFromArray(position.buffer.array, position.buffer.stride, position.offset, position.normalized); } const morphAttributesPosition = this.morphAttributes.position; if (morphAttributesPosition) { for (let i = 0; i < morphAttributesPosition.length; i++) { const morphAttribute = morphAttributesPosition[i]; _box3.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized); _vector.addVectors(this.boundingBox.min, _box3.min); this.boundingBox.expandByPoint(_vector); _vector.addVectors(this.boundingBox.max, _box3.max); this.boundingBox.expandByPoint(_vector); } } } /** * Computes bounding sphere of the geometry, updating {@link Geometry#boundingSphere}. * Bounding spheres aren't computed by default. They need to be explicitly computed. */ computeBoundingSphere() { const position = this.attributes['a_Position'] || this.attributes['position']; const morphAttributesPosition = this.morphAttributes.position; if (!position) { return; } const bufferStride = position.buffer.stride; const positionOffset = position.offset; if (morphAttributesPosition) { _box3.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized); for (let i = 0; i < morphAttributesPosition.length; i++) { const morphAttribute = morphAttributesPosition[i]; _boxMorphTargets.setFromArray(morphAttribute.buffer.array, morphAttribute.buffer.stride, morphAttribute.offset, morphAttribute.normalized); _vector.addVectors(_box3.min, _boxMorphTargets.min); _box3.expandByPoint(_vector); _vector.addVectors(_box3.max, _boxMorphTargets.max); _box3.expandByPoint(_vector); } const center = this.boundingSphere.center; _box3.getCenter(center); let maxRadiusSq = 0; for (let i = 0; i < position.buffer.count; i++) { _offset.fromArray(position.buffer.array, i * bufferStride + positionOffset); maxRadiusSq = center.distanceToSquared(_offset); for (let j = 0; j < morphAttributesPosition.length; j++) { const morphAttribute = morphAttributesPosition[j]; _vector.fromArray(morphAttribute.buffer.array, i * morphAttribute.buffer.stride + morphAttribute.offset); _sum.addVectors(_offset, _vector); const offsetLengthSq = center.distanceToSquared(_sum); // TODO The maximum radius cannot be obtained here if (offsetLengthSq > maxRadiusSq) { maxRadiusSq = offsetLengthSq; _offset.add(_vector); } } } this.boundingSphere.radius = Math.sqrt(maxRadiusSq); } else { this.boundingSphere.setFromArray(position.buffer.array, bufferStride, positionOffset, position.normalized); } } /** * Disposes the object from memory. * You need to call this when you want the BufferGeometry removed while the application is running. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } /** * Copies another Geometry to this Geometry. * @param {Geometry} source - The geometry to be copied. * @returns {Geometry} */ copy(source) { let name, i, l; // reset this.index = null; this.attributes = {}; this.morphAttributes = {}; this.groups = []; const buffers = new WeakMap(); // used for storing cloned, shared buffers // index const index = source.index; if (index !== null) { this.setIndex(index.clone(buffers)); } // attributes const attributes = source.attributes; for (name in attributes) { const attribute = attributes[name]; this.addAttribute(name, attribute.clone(buffers)); } // morph attributes const morphAttributes = source.morphAttributes; for (name in morphAttributes) { const array = []; const morphAttribute = morphAttributes[name]; // morphAttribute: array of Float32BufferAttributes for (i = 0, l = morphAttribute.length; i < l; i++) { array.push(morphAttribute[i].clone(buffers)); } this.morphAttributes[name] = array; } // groups const groups = source.groups; for (i = 0, l = groups.length; i < l; i++) { const group = groups[i]; this.addGroup(group.start, group.count, group.materialIndex); } // boundings this.boundingBox.copy(source.boundingBox); this.boundingSphere.copy(source.boundingSphere); // instance count this.instanceCount = source.instanceCount; return this; } /** * Creates a clone of this Geometry. * @returns {Geometry} */ clone() { return new Geometry().copy(this); } } function arrayMax(array) { if (array.length === 0) return -Infinity; let max = array[0]; for (let i = 1, l = array.length; i < l; ++i) { if (array[i] > max) max = array[i]; } return max; } export { Geometry }; ================================================ FILE: src/resources/geometries/PlaneGeometry.js ================================================ import { Geometry } from './Geometry.js'; import { Attribute } from './Attribute.js'; import { Buffer } from './Buffer.js'; /** * A class for generating plane geometries. * @extends Geometry */ class PlaneGeometry extends Geometry { /** * @param {number} [width=1] — Width along the X axis. * @param {number} [height=1] — Height along the Y axis. * @param {number} [widthSegments=1] * @param {number} [heightSegments=1] */ constructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) { super(); const width_half = width / 2; const height_half = height / 2; const gridX = Math.floor(widthSegments); const gridY = Math.floor(heightSegments); const gridX1 = gridX + 1; const gridY1 = gridY + 1; const segment_width = width / gridX; const segment_height = height / gridY; let ix, iy; // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // generate vertices, normals and uvs for (iy = 0; iy < gridY1; iy++) { const y = iy * segment_height - height_half; for (ix = 0; ix < gridX1; ix++) { const x = ix * segment_width - width_half; vertices.push(x, 0, y); normals.push(0, 1, 0); uvs.push(ix / gridX); uvs.push(1 - (iy / gridY)); } } // indices for (iy = 0; iy < gridY; iy++) { for (ix = 0; ix < gridX; ix++) { const a = ix + gridX1 * iy; const b = ix + gridX1 * (iy + 1); const c = (ix + 1) + gridX1 * (iy + 1); const d = (ix + 1) + gridX1 * iy; // faces indices.push(a, b, d); indices.push(b, c, d); } } // build geometry this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); } } export { PlaneGeometry }; ================================================ FILE: src/resources/geometries/SphereGeometry.js ================================================ import { Geometry } from './Geometry.js'; import { Attribute } from './Attribute.js'; import { Buffer } from './Buffer.js'; import { Vector3 } from '../../math/Vector3.js'; /** * A class for generating sphere geometries. * The geometry is created by sweeping and calculating vertexes around the Y axis (horizontal sweep) and the Z axis (vertical sweep). * Thus, incomplete spheres (akin to 'sphere slices') can be created through the use of different values of phiStart, phiLength, thetaStart and thetaLength, in order to define the points in which we start (or end) calculating those vertices. * @extends Geometry */ class SphereGeometry extends Geometry { /** * @param {number} [radius=1] — sphere radius. Default is 1. * @param {number} [widthSegments=8] — number of horizontal segments. Minimum value is 3, and the default is 8. * @param {number} [heightSegments=6] — number of vertical segments. Minimum value is 2, and the default is 6. * @param {number} [phiStart=0] — specify horizontal starting angle. Default is 0. * @param {number} [phiLength=Math.PI*2] — specify horizontal sweep angle size. Default is Math.PI * 2. * @param {number} [thetaStart=0] — specify vertical starting angle. Default is 0. * @param {number} [thetaLength=Math.PI] — specify vertical sweep angle size. Default is Math.PI. */ constructor(radius = 1, widthSegments = 8, heightSegments = 6, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) { super(); widthSegments = Math.max(3, Math.floor(widthSegments)); heightSegments = Math.max(2, Math.floor(heightSegments)); const thetaEnd = thetaStart + thetaLength; let ix, iy; let index = 0; const grid = []; const vertex = new Vector3(); const normal = new Vector3(); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // generate vertices, normals and uvs for (iy = 0; iy <= heightSegments; iy++) { const verticesRow = []; const v = iy / heightSegments; // special case for the poles // https://github.com/mrdoob/three.js/pull/16043 let uOffset = 0; if (iy == 0 && thetaStart == 0) { uOffset = 0.5 / widthSegments; } else if (iy == heightSegments && thetaEnd == Math.PI) { uOffset = -0.5 / widthSegments; } for (ix = 0; ix <= widthSegments; ix++) { const u = ix / widthSegments; // vertex vertex.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); vertex.y = radius * Math.cos(thetaStart + v * thetaLength); vertex.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); vertices.push(vertex.x, vertex.y, vertex.z); // normal normal.copy(vertex).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(u + uOffset, 1 - v); verticesRow.push(index++); } grid.push(verticesRow); } // indices for (iy = 0; iy < heightSegments; iy++) { for (ix = 0; ix < widthSegments; ix++) { const a = grid[iy][ix + 1]; const b = grid[iy][ix]; const c = grid[iy + 1][ix]; const d = grid[iy + 1][ix + 1]; if (iy !== 0 || thetaStart > 0) indices.push(a, b, d); if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d); } } this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); } } export { SphereGeometry }; ================================================ FILE: src/resources/geometries/TorusKnotGeometry.js ================================================ import { Geometry } from './Geometry.js'; import { Attribute } from './Attribute.js'; import { Buffer } from './Buffer.js'; import { Vector3 } from '../../math/Vector3.js'; /** * Creates a torus knot, the particular shape of which is defined by a pair of coprime integers, p and q. * If p and q are not coprime, the result will be a torus link. * @extends Geometry */ class TorusKnotGeometry extends Geometry { /** * @param {number} [radius=1] — Radius of the torus. Default is 1. * @param {number} [tube=0.4] — Radius of the tube. Default is 0.4. * @param {number} [tubularSegments=64] — Default is 64. * @param {number} [radialSegments=8] — Default is 8. * @param {number} [p=2] — This value determines, how many times the geometry winds around its axis of rotational symmetry. Default is 2. * @param {number} [q=3] — This value determines, how many times the geometry winds around a circle in the interior of the torus. Default is 3. */ constructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) { super(); tubularSegments = Math.floor(tubularSegments); radialSegments = Math.floor(radialSegments); // buffers const indices = []; const vertices = []; const normals = []; const uvs = []; // helper variables let i, j; const vertex = new Vector3(); const normal = new Vector3(); const P1 = new Vector3(); const P2 = new Vector3(); const B = new Vector3(); const T = new Vector3(); const N = new Vector3(); // generate vertices, normals and uvs for (i = 0; i <= tubularSegments; ++i) { // the radian "u" is used to calculate the position on the torus curve of the current tubular segement const u = i / tubularSegments * p * Math.PI * 2; // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions calculatePositionOnCurve(u, p, q, radius, P1); calculatePositionOnCurve(u + 0.01, p, q, radius, P2); // calculate orthonormal basis T.subVectors(P2, P1); N.addVectors(P2, P1); B.crossVectors(T, N); N.crossVectors(B, T); // normalize B, N. T can be ignored, we don't use it B.normalize(); N.normalize(); for (j = 0; j <= radialSegments; ++j) { // now calculate the vertices. they are nothing more than an extrusion of the torus curve. // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. const v = j / radialSegments * Math.PI * 2; const cx = -tube * Math.cos(v); const cy = tube * Math.sin(v); // now calculate the final vertex position. // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve vertex.x = P1.x + (cx * N.x + cy * B.x); vertex.y = P1.y + (cx * N.y + cy * B.y); vertex.z = P1.z + (cx * N.z + cy * B.z); vertices.push(vertex.x, vertex.y, vertex.z); // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) normal.subVectors(vertex, P1).normalize(); normals.push(normal.x, normal.y, normal.z); // uv uvs.push(i / tubularSegments); uvs.push(j / radialSegments); } } // generate indices for (j = 1; j <= tubularSegments; j++) { for (i = 1; i <= radialSegments; i++) { // indices const a = (radialSegments + 1) * (j - 1) + (i - 1); const b = (radialSegments + 1) * j + (i - 1); const c = (radialSegments + 1) * j + i; const d = (radialSegments + 1) * (j - 1) + i; // faces indices.push(a, b, d); indices.push(b, c, d); } } // build geometry this.setIndex(new Attribute(new Buffer( (vertices.length / 3) > 65536 ? new Uint32Array(indices) : new Uint16Array(indices), 1 ))); this.addAttribute('a_Position', new Attribute(new Buffer(new Float32Array(vertices), 3))); this.addAttribute('a_Normal', new Attribute(new Buffer(new Float32Array(normals), 3))); this.addAttribute('a_Uv', new Attribute(new Buffer(new Float32Array(uvs), 2))); this.computeBoundingBox(); this.computeBoundingSphere(); // this function calculates the current position on the torus curve function calculatePositionOnCurve(u, p, q, radius, position) { const cu = Math.cos(u); const su = Math.sin(u); const quOverP = q / p * u; const cs = Math.cos(quOverP); position.x = radius * (2 + cs) * 0.5 * cu; position.y = radius * (2 + cs) * su * 0.5; position.z = radius * Math.sin(quOverP) * 0.5; } } } export { TorusKnotGeometry }; ================================================ FILE: src/resources/materials/BasicMaterial.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE } from '../../const.js'; /** * A material for drawing geometries in a simple shaded (flat or wireframe) way. * This material is not affected by lights. * @extends Material */ class BasicMaterial extends Material { /** * Create a BasicMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.BASIC; } } export { BasicMaterial }; ================================================ FILE: src/resources/materials/DepthMaterial.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE } from '../../const.js'; /** * A material for drawing geometry by depth. * Depth is based off of the camera near and far plane. White is nearest, black is farthest. * @extends Material */ class DepthMaterial extends Material { /** * Create a DepthMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.DEPTH; /** * Encoding for depth packing. * @type {boolean} * @default false */ this.packToRGBA = false; } } export { DepthMaterial }; ================================================ FILE: src/resources/materials/DistanceMaterial.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE } from '../../const.js'; /** * A material for drawing geometry by distance. * @extends Material */ class DistanceMaterial extends Material { /** * Create a DistanceMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.DISTANCE; } } export { DistanceMaterial }; ================================================ FILE: src/resources/materials/LambertMaterial.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE } from '../../const.js'; /** * A material for non-shiny surfaces, without specular highlights. * The material uses a non-physically based Lambertian model for calculating reflectance. * This can simulate some surfaces (such as untreated wood or stone) well, but cannot simulate shiny surfaces with specular highlights (such as varnished wood). * @extends Material */ class LambertMaterial extends Material { /** * Create a LambertMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.LAMBERT; /** * @default true */ this.acceptLight = true; } } export { LambertMaterial }; ================================================ FILE: src/resources/materials/LineMaterial.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE, DRAW_MODE } from '../../const.js'; /** * A material for drawing wireframe-style geometries. * @extends Material */ class LineMaterial extends Material { /** * Create a LineMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.LINE; /** * Controls line thickness. * Due to limitations of the OpenGL Core Profile with the WebGL renderer on most platforms linewidth will always be 1 regardless of the set value. * @type {number} * @default 1 */ this.lineWidth = 1; /** * Set draw mode to LINES / LINE_LOOP / LINE_STRIP * @type {DRAW_MODE} * @default DRAW_MODE.LINES */ this.drawMode = DRAW_MODE.LINES; } copy(source) { super.copy(source); this.lineWidth = source.lineWidth; return this; } } export { LineMaterial }; ================================================ FILE: src/resources/materials/Material.js ================================================ import { BLEND_TYPE, BLEND_EQUATION, BLEND_FACTOR, ENVMAP_COMBINE_TYPE, DRAW_SIDE, SHADING_TYPE, DRAW_MODE, COMPARE_FUNC, OPERATION, VERTEX_COLOR, MATERIAL_TYPE } from '../../const.js'; import { cloneUniforms } from '../../base.js'; import { EventDispatcher } from '../../EventDispatcher.js'; import { Color3 } from '../../math/Color3.js'; import { Vector2 } from '../../math/Vector2.js'; import { TransformUV } from '../TransformUV.js'; import { MathUtils } from '../../math/MathUtils.js'; let _materialId = 0; /** * Abstract base class for materials. * Materials describe the appearance of {@link Object3D}. * They are defined in a (mostly) renderer-independent way, so you don't have to rewrite materials if you decide to use a different renderer. * The following properties and methods are inherited by all other material types (although they may have different defaults). * @abstract * @extends EventDispatcher */ class Material extends EventDispatcher { constructor() { super(); /** * Unique number for this material instance. * @readonly * @type {number} */ this.id = _materialId++; /** * UUID of this material instance. * This gets automatically assigned, so this shouldn't be edited. * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * Type of the material. * @type {MATERIAL_TYPE} * @default MATERIAL_TYPE.SHADER */ this.type = MATERIAL_TYPE.SHADER; /** * Custom shader name. This naming can help ShaderMaterial to optimize the length of the index hash string. * It is valid only when the material type is MATERIAL_TYPE.SHADER. * Otherwise, if the material is a built-in type, the name of the shader will always be equal to the material type. * @type {string} * @default "" */ this.shaderName = ''; /** * Custom defines of the shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {object} * @default {} */ this.defines = {}; /** * Custom uniforms of the shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {object} * @default {} */ this.uniforms = {}; /** * Custom GLSL code for vertex shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {string} * @default "" */ this.vertexShader = ''; /** * Custom GLSL code for fragment shader. * Only valid when the material type is MATERIAL_TYPE.SHADER. * @type {string} * @default "" */ this.fragmentShader = ''; /** * Override the renderer's default precision for this material. * Can be "highp", "mediump" or "lowp". * @type {string} * @default null */ this.precision = null; /** * The bitmask of UV coordinate channels to use for the external texture. * This will be combined with the internal UV coordinate mask collected from the renderer by default. * Finally, it will be used to determine which UV coordinate attribute to use and to generate the shader code. * @type {number} * @default 0 */ this.extUvCoordMask = 0; /** * Defines whether this material is transparent. * This has an effect on rendering as transparent objects need special treatment and are rendered after non-transparent objects. * When set to true, the extent to which the material is transparent is controlled by setting it's blending property. * @type {boolean} * @default false */ this.transparent = false; /** * Which blending to use when displaying objects with this material. * This must be set to BLEND_TYPE.CUSTOM to use custom blendSrc, blendDst or blendEquation. * @type {BLEND_TYPE} * @default BLEND_TYPE.NORMAL */ this.blending = BLEND_TYPE.NORMAL; /** * Blending source. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default BLEND_FACTOR.SRC_ALPHA */ this.blendSrc = BLEND_FACTOR.SRC_ALPHA; /** * Blending destination. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default BLEND_FACTOR.ONE_MINUS_SRC_ALPHA */ this.blendDst = BLEND_FACTOR.ONE_MINUS_SRC_ALPHA; /** * Blending equation to use when applying blending. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_EQUATION} * @default BLEND_EQUATION.ADD */ this.blendEquation = BLEND_EQUATION.ADD; /** * The transparency of the {@link Material#blendSrc}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default null */ this.blendSrcAlpha = null; /** * The transparency of the {@link Material#blendDst}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_FACTOR} * @default null */ this.blendDstAlpha = null; /** * The tranparency of the {@link Material#blendEquation}. * The {@link Material#blending} must be set to BLEND_TYPE.CUSTOM for this to have any effect. * @type {BLEND_EQUATION} * @default null */ this.blendEquationAlpha = null; /** * Whether to premultiply the alpha (transparency) value. * @type {boolean} * @default false */ this.premultipliedAlpha = false; /** * Defines whether vertex coloring is used. * @type {VERTEX_COLOR} * @default VERTEX_COLOR.NONE */ this.vertexColors = VERTEX_COLOR.NONE; /** * Defines whether precomputed vertex tangents, which must be provided in a vec4 "tangent" attribute, are used. * When disabled, tangents are derived automatically. * Using precomputed tangents will give more accurate normal map details in some cases, such as with mirrored UVs. * @type {boolean} * @default false */ this.vertexTangents = false; /** * Float in the range of 0.0 - 1.0 indicating how transparent the material is. * A value of 0.0 indicates fully transparent, 1.0 is fully opaque. * @type {number} * @default 1 */ this.opacity = 1; /** * The diffuse color. * @type {Color3} * @default Color3(0xffffff) */ this.diffuse = new Color3(0xffffff); /** * The diffuse map. * @type {Texture2D} * @default null */ this.diffuseMap = null; /** * Define the UV chanel for the diffuse map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.diffuseMapCoord = 0; /** * The uv-transform matrix of diffuse map. * This will also affect other maps that cannot be individually specified uv transform, such as normalMap, bumpMap, etc. * @type {TransformUV} * @default TransformUV() */ this.diffuseMapTransform = new TransformUV(); /** * The alpha map. * @type {Texture2D} * @default null */ this.alphaMap = null; /** * Define the UV chanel for the alpha map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.alphaMapCoord = 0; /** * The uv-transform matrix of alpha map. * @type {TransformUV} * @default TransformUV() */ this.alphaMapTransform = new TransformUV(); /** * Emissive (light) color of the material, essentially a solid color unaffected by other lighting. * @type {Color3} * @default Color3(0x000000) */ this.emissive = new Color3(0x000000); /** * Set emissive (glow) map. * The emissive map color is modulated by the emissive color. * If you have an emissive map, be sure to set the emissive color to something other than black. * @type {Texture2D} * @default null */ this.emissiveMap = null; /** * Define the UV chanel for the emissive map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.emissiveMapCoord = 0; /** * The uv-transform matrix of emissive map. * @type {TransformUV} * @default TransformUV() */ this.emissiveMapTransform = new TransformUV(); /** * The red channel of this texture is used as the ambient occlusion map. * @type {Texture2D} * @default null */ this.aoMap = null; /** * Intensity of the ambient occlusion effect. * @type {number} * @default 1 */ this.aoMapIntensity = 1.0; /** * Define the UV chanel for the ao map to use starting from 0 and defaulting to 0. * @type {number} * @default 0 */ this.aoMapCoord = 0; /** * The uv-transform matrix of ao map. * @type {TransformUV} * @default TransformUV() */ this.aoMapTransform = new TransformUV(); /** * The normal map. * @type {Texture2D} * @default null */ this.normalMap = null; /** * How much the normal map affects the material. Typical ranges are 0-1. * @type {Vector2} * @default Vector2(1,1) */ this.normalScale = new Vector2(1, 1); /** * The texture to create a bump map. * The black and white values map to the perceived depth in relation to the lights. Bump doesn't actually affect the geometry of the object, only the lighting. * @type {Texture2D} * @default null */ this.bumpMap = null; /** * How much the bump map affects the material. * Typical ranges are 0-1. * @type {number} * @default 1 */ this.bumpScale = 1; /** * The environment map. * If set to undefined, then the material will not inherit envMap from scene.environment. * @type {TextureCube|null|undefined} * @default null */ this.envMap = null; /** * Scales the effect of the environment map by multiplying its color. * This can effect both the diffuse and specular components of environment map. * @type {number} * @default 1 */ this.envMapIntensity = 1; /** * How to combine the result of the surface's color with the environment map, if any. * This has no effect in a {@link PBRMaterial}. * @type {ENVMAP_COMBINE_TYPE} * @default ENVMAP_COMBINE_TYPE.MULTIPLY */ this.envMapCombine = ENVMAP_COMBINE_TYPE.MULTIPLY; /** * Which depth function to use. See the {@link COMPARE_FUNC} constants for all possible values. * @type {COMPARE_FUNC} * @default COMPARE_FUNC.LEQUAL */ this.depthFunc = COMPARE_FUNC.LEQUAL; /** * Whether to have depth test enabled when rendering this material. * @type {boolean} * @default true */ this.depthTest = true; /** * Whether rendering this material has any effect on the depth buffer. * When drawing 2D overlays it can be useful to disable the depth writing in order to layer several things together without creating z-index artifacts. * @type {boolean} * @default true */ this.depthWrite = true; /** * Whether to render the material's color. * This can be used in conjunction with a mesh's renderOrder property to create invisible objects that occlude other objects. * @type {boolean} * @default true */ this.colorWrite = true; /** * Whether stencil operations are performed against the stencil buffer. * In order to perform writes or comparisons against the stencil buffer this value must be true. * @type {boolean} * @default false */ this.stencilTest = false; /** * The bit mask to use when writing to the stencil buffer. * @type {number} * @default 0xFF */ this.stencilWriteMask = 0xff; /** * The stencil comparison function to use. * See the {@link COMPARE_FUNC} constants for all possible values. * @type {COMPARE_FUNC} * @default COMPARE_FUNC.ALWAYS */ this.stencilFunc = COMPARE_FUNC.ALWAYS; /** * The value to use when performing stencil comparisons or stencil operations. * @type {number} * @default 0 */ this.stencilRef = 0; /** * The bit mask to use when comparing against the stencil buffer. * @type {number} * @default 0xFF */ this.stencilFuncMask = 0xff; /** * Which stencil operation to perform when the comparison function returns false. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilFail = OPERATION.KEEP; /** * Which stencil operation to perform when the comparison function returns true but the depth test fails. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilZFail = OPERATION.KEEP; /** * Which stencil operation to perform when the comparison function returns true and the depth test passes. * See the {@link OPERATION} constants for all possible values. * @type {OPERATION} * @default OPERATION.KEEP */ this.stencilZPass = OPERATION.KEEP; /** * The stencil comparison function to use. * See the {@link COMPARE_FUNC} constants for all possible values. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {COMPARE_FUNC|null} * @default null */ this.stencilFuncBack = null; /** * The value to use when performing stencil comparisons or stencil operations. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {number | null} * @default null */ this.stencilRefBack = null; /** * The bit mask to use when comparing against the stencil buffer. * You can explicitly specify the two-sided stencil function state by defining stencilFuncBack, stencilRefBack and stencilFuncMaskBack. * @type {number | null} * @default null */ this.stencilFuncMaskBack = null; /** * Which stencil operation to perform when the comparison function returns false. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilFailBack = null; /** * Which stencil operation to perform when the comparison function returns true but the depth test fails. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilZFailBack = null; /** * Which stencil operation to perform when the comparison function returns true and the depth test passes. * See the {@link OPERATION} constants for all possible values. * You can explicitly specify the two-sided stencil op state by defining stencilFailBack, stencilZFailBack and stencilZPassBack. * @type {OPERATION|null} * @default null */ this.stencilZPassBack = null; /** * User-defined clipping planes specified as Plane objects in world space. * These planes apply to the objects this material is attached to. * Points in space whose signed distance to the plane is negative are clipped (not rendered). * @type {Plane[]} * @default null */ this.clippingPlanes = null; /** * Sets the alpha value to be used when running an alpha test. * The material will not be renderered if the opacity is lower than this value. * @type {number} * @default 0 */ this.alphaTest = 0; /** * Enables alpha to coverage. * Can only be used when MSAA is enabled. * @type {boolean} * @default false */ this.alphaToCoverage = false; /** * Defines which side of faces will be rendered - front, back or double. * @type {DRAW_SIDE} * @default DRAW_SIDE.FRONT */ this.side = DRAW_SIDE.FRONT; /** * Whether to use polygon offset. * This corresponds to the GL_POLYGON_OFFSET_FILL WebGL feature. * @type {boolean} * @default false */ this.polygonOffset = false; /** * Sets the polygon offset factor. * @type {number} * @default 0 */ this.polygonOffsetFactor = 0; /** * Sets the polygon offset units. * @type {number} * @default 0 */ this.polygonOffsetUnits = 0; /** * Define whether the material is rendered with flat shading or smooth shading. * @type {SHADING_TYPE} * @default SHADING_TYPE.SMOOTH_SHADING */ this.shading = SHADING_TYPE.SMOOTH_SHADING; /** * Whether to apply dithering to the color to remove the appearance of banding. * @type {boolean} * @default false */ this.dithering = false; /** * Whether the material is affected by lights. * If set true, renderer will try to upload light uniforms. * @type {boolean} * @default false */ this.acceptLight = false; /** * The lighting group of the material. * Used in conjunction with {@link Light#groupMask}. * @type {number} * @default 0 */ this.lightingGroup = 0; /** * Whether the material is affected by fog. * @type {boolean} * @default true */ this.fog = true; /** * Determines how the mesh triangles are constructed from the vertices. * @type {DRAW_MODE} * @default DRAW_MODE.TRIANGLES */ this.drawMode = DRAW_MODE.TRIANGLES; /** * Whether the material uniforms need to be updated every draw call. * If set false, the material uniforms are only updated once per frame , this can help optimize performance. * @type {boolean} * @default true */ this.forceUpdateUniforms = true; /** * Specifies that the material needs to be recompiled. * This property is automatically set to true when instancing a new material. * @type {boolean} * @default true */ this.needsUpdate = true; } /** * Copy the parameters from the passed material into this material. * @param {Material} source - The material to be copied. * @returns {Material} */ copy(source) { this.shaderName = source.shaderName; this.defines = Object.assign({}, source.defines); this.uniforms = cloneUniforms(source.uniforms); this.vertexShader = source.vertexShader; this.fragmentShader = source.fragmentShader; this.precision = source.precision; this.extUvCoordMask = source.extUvCoordMask; this.transparent = source.transparent; this.blending = source.blending; this.blendSrc = source.blendSrc; this.blendDst = source.blendDst; this.blendEquation = source.blendEquation; this.blendSrcAlpha = source.blendSrcAlpha; this.blendDstAlpha = source.blendDstAlpha; this.blendEquationAlpha = source.blendEquationAlpha; this.premultipliedAlpha = source.premultipliedAlpha; this.vertexColors = source.vertexColors; this.vertexTangents = source.vertexTangents; this.opacity = source.opacity; this.diffuse.copy(source.diffuse); this.diffuseMap = source.diffuseMap; this.diffuseMapCoord = source.diffuseMapCoord; this.diffuseMapTransform.copy(source.diffuseMapTransform); this.alphaMap = source.alphaMap; this.alphaMapCoord = source.alphaMapCoord; this.alphaMapTransform.copy(source.alphaMapTransform); this.emissive.copy(source.emissive); this.emissiveMap = source.emissiveMap; this.emissiveMapCoord = source.emissiveMapCoord; this.emissiveMapTransform.copy(source.emissiveMapTransform); this.aoMap = source.aoMap; this.aoMapIntensity = source.aoMapIntensity; this.aoMapCoord = source.aoMapCoord; this.aoMapTransform.copy(source.aoMapTransform); this.normalMap = source.normalMap; this.normalScale.copy(source.normalScale); this.bumpMap = source.bumpMap; this.bumpScale = source.bumpScale; this.envMap = source.envMap; this.envMapIntensity = source.envMapIntensity; this.envMapCombine = source.envMapCombine; this.depthFunc = source.depthFunc; this.depthTest = source.depthTest; this.depthWrite = source.depthWrite; this.colorWrite = source.colorWrite; this.stencilTest = source.stencilTest; this.stencilWriteMask = source.stencilWriteMask; this.stencilFunc = source.stencilFunc; this.stencilRef = source.stencilRef; this.stencilFuncMask = source.stencilFuncMask; this.stencilFail = source.stencilFail; this.stencilZFail = source.stencilZFail; this.stencilZPass = source.stencilZPass; this.stencilFuncBack = source.stencilFuncBack; this.stencilRefBack = source.stencilRefBack; this.stencilFuncMaskBack = source.stencilFuncMaskBack; this.stencilFailBack = source.stencilFailBack; this.stencilZFailBack = source.stencilZFailBack; this.stencilZPassBack = source.stencilZPassBack; this.clippingPlanes = source.clippingPlanes; this.alphaTest = source.alphaTest; this.alphaToCoverage = source.alphaToCoverage; this.side = source.side; this.polygonOffset = source.polygonOffset; this.polygonOffsetFactor = source.polygonOffsetFactor; this.polygonOffsetUnits = source.polygonOffsetUnits; this.shading = source.shading; this.dithering = source.dithering; this.acceptLight = source.acceptLight; this.lightingGroup = source.lightingGroup; this.fog = source.fog; this.drawMode = source.drawMode; return this; } /** * Return a new material with the same parameters as this material. * @returns {Material} */ clone() { return new this.constructor().copy(this); } /** * This disposes the material. * Textures of a material don't get disposed. These needs to be disposed by Texture. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } export { Material }; ================================================ FILE: src/resources/materials/PBR2Material.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE } from '../../const.js'; import { Color3 } from '../../math/Color3.js'; /** * A standard physically based material, using Specular-Glossiness workflow. * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max. * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used. * The idea is that, instead of tweaking materials to look good under specific lighting, a material can be created that will react 'correctly' under all lighting scenarios. * @extends Material */ class PBR2Material extends Material { /** * Create a PBR2Material. */ constructor() { super(); this.type = MATERIAL_TYPE.PBR2; /** * Specular color of the material. * @type {number} * @default 0.5 */ this.specular = new Color3(0x111111); /** * Glossiness of the material. * @type {number} * @default 0.5 */ this.glossiness = 0.5; /** * The RGB channel of this texture is used to alter the specular of the material. * @type {Texture2D} * @default null */ this.specularMap = null; /** * The A channel of this texture is used to alter the glossiness of the material. * @type {Texture2D} * @default null */ this.glossinessMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.specular = source.specular; this.glossiness = source.glossiness; this.specularMap = source.specularMap; this.glossinessMap = source.glossinessMap; return this; } } export { PBR2Material }; ================================================ FILE: src/resources/materials/PBRMaterial.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE } from '../../const.js'; import { Vector2 } from '../../math/Vector2.js'; /** * A standard physically based material, using Metallic-Roughness workflow. * Physically based rendering (PBR) has recently become the standard in many 3D applications, such as Unity, Unreal and 3D Studio Max. * This approach differs from older approaches in that instead of using approximations for the way in which light interacts with a surface, a physically correct model is used. * The idea is that, instead of tweaking materials to look good under specific lighting, a material can be created that will react 'correctly' under all lighting scenarios. * @extends Material */ class PBRMaterial extends Material { /** * Create a PBRMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.PBR; /** * How rough the material appears. 0.0 means a smooth mirror reflection, 1.0 means fully diffuse. * If roughnessMap is also provided, both values are multiplied. * @type {number} * @default 0.5 */ this.roughness = 0.5; /** * How much the material is like a metal. * Non-metallic materials such as wood or stone use 0.0, metallic use 1.0, with nothing (usually) in between. * A value between 0.0 and 1.0 could be used for a rusty metal look. If metalnessMap is also provided, both values are multiplied. * @type {number} * @default 0.5 */ this.metalness = 0.5; /** * The green channel of this texture is used to alter the roughness of the material. * @type {Texture2D} * @default null */ this.roughnessMap = null; /** * The blue channel of this texture is used to alter the metalness of the material. * @type {Texture2D} * @default null */ this.metalnessMap = null; /** * The strength of a clearcoat layer on a material surface. * When clearcoatFactor is set to 0.0, it indicates that there is no clearcoat present. * When it is set to 1.0, it indicates a very strong clearcoat that- * will cause the reflection and refraction effects on the surface of the object to become more prominent. * @type {number} * @default 0.0 */ this.clearcoat = 0.0; /** * A texture property that allows for the modulation of the strength or roughness of the clearcoat layer. * @type {Texture2D} * @default null */ this.clearcoatMap = null; /** * The roughness of a clearcoat layer on a material surface. * When clearcoatRoughness is set to 0.0, the clearcoat layer will appear perfectly smooth and reflective- * and 0.0 represents a rough, textured clearcoat layer. * Adjusting the clearcoatRoughness can achieve a wide range of effects and create more realistic materials. * @type {number} * @default 0.0 */ this.clearcoatRoughness = 0.0; /** * A texture that will be applied to the clearcoat layer of a material to simulate the roughness of the surface. * @type {Texture2D} * @default null */ this.clearcoatRoughnessMap = null; /** * Adjust the normal map's strength or intensity. * Affect the amount of bumpiness or surface detail that is visible on the clearcoat layer. * Typical ranges are 0-1. * @type {number} * @default 1 */ this.clearcoatNormalScale = new Vector2(1, 1); /** * The texture that modulates the clearcoat layer's surface normal. * @type {Texture2D} * @default null */ this.clearcoatNormalMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.roughness = source.roughness; this.metalness = source.metalness; this.roughnessMap = source.roughnessMap; this.metalnessMap = source.metalnessMap; this.clearcoat = source.clearcoat; this.clearcoatMap = source.clearcoatMap; this.clearcoatRoughness = source.clearcoatRoughness; this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; this.clearcoatNormalScale.copy(source.clearcoatNormalScale); return this; } } export { PBRMaterial }; ================================================ FILE: src/resources/materials/PhongMaterial.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE } from '../../const.js'; import { Color3 } from '../../math/Color3.js'; /** * A material for shiny surfaces with specular highlights. * The material uses a non-physically based Blinn-Phong model for calculating reflectance. * Unlike the Lambertian model used in the {@link LambertMaterial} this can simulate shiny surfaces with specular highlights (such as varnished wood). * @extends Material */ class PhongMaterial extends Material { /** * Create a PhongMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.PHONG; /** * How shiny the {@link PhongMaterial#specular} highlight is; a higher value gives a sharper highlight. * @type {number} * @default 30 */ this.shininess = 30; /** * Specular color of the material. * This defines how shiny the material is and the color of its shine. * @type {Color3} * @default Color(0x111111) */ this.specular = new Color3(0x111111); /** * The specular map value affects both how much the specular surface highlight contributes and how much of the environment map affects the surface. * @type {Texture2D} * @default null */ this.specularMap = null; /** * @default true */ this.acceptLight = true; } copy(source) { super.copy(source); this.shininess = source.shininess; this.specular.copy(source.specular); this.specularMap = source.specularMap; return this; } } export { PhongMaterial }; ================================================ FILE: src/resources/materials/PointsMaterial.js ================================================ import { Material } from './Material.js'; import { MATERIAL_TYPE, DRAW_MODE } from '../../const.js'; /** * The default material used by Points. * @extends Material */ class PointsMaterial extends Material { /** * Create a PointsMaterial. */ constructor() { super(); this.type = MATERIAL_TYPE.POINT; /** * Sets the size of the points. * @type {number} * @default 1 */ this.size = 1; /** * Specify whether points' size is attenuated by the camera depth. (Perspective camera only.) * @type {boolean} * @default true */ this.sizeAttenuation = true; /** * Set draw mode to POINTS. * @type {DRAW_MODE} * @default DRAW_MODE.POINTS */ this.drawMode = DRAW_MODE.POINTS; } copy(source) { super.copy(source); this.size = source.size; this.sizeAttenuation = source.sizeAttenuation; return this; } } export { PointsMaterial }; ================================================ FILE: src/resources/materials/ShaderMaterial.js ================================================ import { Material } from './Material.js'; import { cloneUniforms } from '../../base.js'; /** * A material rendered with custom shaders. * A shader is a small program written in GLSL that runs on the GPU. * @extends Material */ class ShaderMaterial extends Material { /** * @param {object} shader - Shader object for the shader material. * @param {string} shader.name - Name of the shader. * @param {object} shader.defines - Defines of the shader. * @param {object} shader.uniforms - Uniforms of the shader. * @param {string} shader.vertexShader - Vertex shader GLSL code. * @param {string} shader.fragmentShader - Fragment shader GLSL code. */ constructor(shader) { super(); // Set values if (shader) { this.shaderName = shader.name; Object.assign(this.defines, shader.defines); this.uniforms = cloneUniforms(shader.uniforms); this.vertexShader = shader.vertexShader; this.fragmentShader = shader.fragmentShader; } } } export { ShaderMaterial }; ================================================ FILE: src/resources/projections/CameraProjection.js ================================================ import { Matrix4 } from '../../math/Matrix4.js'; /** * Base camera projection class. All projection types should inherit from this. * Should not be instantiated directly; subclasses must implement matrix calculation. * @abstract */ class CameraProjection { /** * Creates a CameraProjection instance. */ constructor() { this._matrix = new Matrix4(); this._dirty = true; } /** * Get the current projection matrix. * @returns {Matrix4} The projection matrix. */ get matrix() { if (this._dirty) { this._updateMatrix(); } return this._matrix; } /** * Copy parameters from another CameraProjection. Should be implemented by subclasses. * @param {CameraProjection} source The source projection object. * @returns {CameraProjection} this */ copy(source) { console.warn('CameraProjection: copy() must be implemented in subclass.'); return this; } /** * Clone this projection object. * @returns {CameraProjection} A new projection object. */ clone() { return new this.constructor().copy(this); } /** * Update the projection matrix. Should be implemented by subclasses. * @protected */ _updateMatrix() { console.warn('CameraProjection: _updateMatrix() must be implemented in subclass.'); this._dirty = false; } } export { CameraProjection }; ================================================ FILE: src/resources/projections/OrthographicProjection.js ================================================ import { CameraProjection } from './CameraProjection.js'; /** * Orthographic projection camera class. * Generates an orthographic projection matrix based on left, right, top, bottom, near, and far planes. */ class OrthographicProjection extends CameraProjection { /** * Creates an OrthographicProjection instance. * @param {number} [left=-1] Left plane of the orthographic box. * @param {number} [right=1] Right plane of the orthographic box. * @param {number} [top=1] Top plane of the orthographic box. * @param {number} [bottom=-1] Bottom plane of the orthographic box. * @param {number} [near=0.1] Near clipping plane. * @param {number} [far=2000] Far clipping plane. */ constructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000) { super(); this._left = left; this._right = right; this._top = top; this._bottom = bottom; this._near = near; this._far = far; } /** * The left plane of the orthographic box. * @type {number} * @default -1 */ set left(value) { this._left = value; this._dirty = true; } get left() { return this._left; } /** * The right plane of the orthographic box. * @type {number} * @default 1 */ set right(value) { this._right = value; this._dirty = true; } get right() { return this._right; } /** * The top plane of the orthographic box. * @type {number} * @default 1 */ set top(value) { this._top = value; this._dirty = true; } get top() { return this._top; } /** * The bottom plane of the orthographic box. * @type {number} * @default -1 */ set bottom(value) { this._bottom = value; this._dirty = true; } get bottom() { return this._bottom; } /** * The near clipping plane. * @type {number} * @default 0.1 */ set near(value) { this._near = value; this._dirty = true; } get near() { return this._near; } /** * The far clipping plane. * @type {number} * @default 2000 */ set far(value) { this._far = value; this._dirty = true; } get far() { return this._far; } /** * Sets all orthographic parameters at once. * @param {number} left The left plane of the orthographic box. * @param {number} right The right plane of the orthographic box. * @param {number} top The top plane of the orthographic box. * @param {number} bottom The bottom plane of the orthographic box. * @param {number} near The near clipping plane. * @param {number} far The far clipping plane. * @returns {OrthographicProjection} this */ set(left, right, top, bottom, near, far) { this._left = left; this._right = right; this._top = top; this._bottom = bottom; this._near = near; this._far = far; this._dirty = true; return this; } /** * Sets the orthographic box size by width and height, centered at (0, 0). * @param {number} width The width of the orthographic box. * @param {number} height The height of the orthographic box. * @returns {OrthographicProjection} this */ setSize(width, height) { this._left = -width / 2; this._right = width / 2; this._top = height / 2; this._bottom = -height / 2; this._dirty = true; return this; } /** * Copies the parameters from another OrthographicProjection. * @param {OrthographicProjection} source * @returns {OrthographicProjection} this */ copy(source) { this._left = source._left; this._right = source._right; this._top = source._top; this._bottom = source._bottom; this._near = source._near; this._far = source._far; this._dirty = true; return this; } /** * Updates the orthographic projection matrix. * @protected */ _updateMatrix() { const left = this._left, right = this._right, bottom = this._bottom, top = this._top, near = this._near, far = this._far; this._matrix.set( 2 / (right - left), 0, 0, -(right + left) / (right - left), 0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom), 0, 0, -2 / (far - near), -(far + near) / (far - near), 0, 0, 0, 1 ); this._dirty = false; } } export { OrthographicProjection }; ================================================ FILE: src/resources/projections/PerspectiveProjection.js ================================================ import { CameraProjection } from './CameraProjection.js'; /** * Perspective projection camera class. * Generates a perspective projection matrix based on field of view, aspect ratio, near and far planes. * Field of view is specified in degrees. */ class PerspectiveProjection extends CameraProjection { /** * Creates a PerspectiveProjection instance. * @param {number} [fov=50] Vertical field of view in degrees. * @param {number} [aspect=1] Aspect ratio (width / height). * @param {number} [near=0.1] Near clipping plane. * @param {number} [far=2000] Far clipping plane. */ constructor(fov = 50, aspect = 1, near = 0.1, far = 2000) { super(); this._fov = fov; this._aspect = aspect; this._near = near; this._far = far; } /** * The vertical field of view in degrees. * @type {number} * @default 50 */ set fov(value) { this._fov = value; this._dirty = true; } get fov() { return this._fov; } /** * The aspect ratio (width / height). * @type {number} * @default 1 */ set aspect(value) { this._aspect = value; this._dirty = true; } get aspect() { return this._aspect; } /** * The near clipping plane. * @type {number} * @default 0.1 */ set near(value) { this._near = value; this._dirty = true; } get near() { return this._near; } /** * The far clipping plane. * @type {number} * @default 2000 */ set far(value) { this._far = value; this._dirty = true; } get far() { return this._far; } /** * Sets all perspective parameters at once. * @param {number} fov Vertical field of view in degrees. * @param {number} aspect Aspect ratio (width / height). * @param {number} near Near clipping plane. * @param {number} far Far clipping plane. * @returns {PerspectiveProjection} this */ set(fov, aspect, near, far) { this._fov = fov; this._aspect = aspect; this._near = near; this._far = far; this._dirty = true; return this; } /** * Copies the parameters from another PerspectiveProjection. * @param {PerspectiveProjection} source * @returns {PerspectiveProjection} this */ copy(source) { this._fov = source._fov; this._aspect = source._aspect; this._near = source._near; this._far = source._far; this._dirty = true; return this; } /** * Updates the perspective projection matrix. * @protected */ _updateMatrix() { const fov = this._fov * Math.PI / 180, aspect = this._aspect, near = this._near, far = this._far; const f = 1 / Math.tan(fov / 2); this._matrix.set( f / aspect, 0, 0, 0, 0, f, 0, 0, 0, 0, (far + near) / (near - far), (2 * far * near) / (near - far), 0, 0, -1, 0 ); this._dirty = false; } } export { PerspectiveProjection }; ================================================ FILE: src/resources/targets/OffscreenRenderTarget.js ================================================ import { RenderTargetBase } from './RenderTargetBase.js'; import { RenderBuffer } from '../RenderBuffer.js'; import { Texture2D } from '../textures/Texture2D.js'; import { TextureCube } from '../textures/TextureCube.js'; import { Texture3D } from '../textures/Texture3D.js'; import { Texture2DArray } from '../textures/Texture2DArray.js'; import { ATTACHMENT, PIXEL_FORMAT } from '../../const.js'; /** * Render Target that render to offscreen textures or renderbuffers. * @extends RenderTargetBase */ class OffscreenRenderTarget extends RenderTargetBase { /** * Create a new OffscreenRenderTarget. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. */ constructor(width, height) { super(width, height); /** * The active layer index for rendering. * For cube render targets, this represents the active cube face. * @type {number} * @default 0 */ this.activeLayer = 0; /** * The active mipmap level for rendering. * Not supported in WebGL1. * @type {number} * @default 0 */ this.activeMipmapLevel = 0; this._attachments = {}; } /** * Resize the render target to the specified dimensions. * This will resize all attached attachments. * @param {number} width - The new width of the render target. * @param {number} height - The new height of the render target. * @param {number} [depth] - **DEPRECATED**: Depth parameter is no longer used. * Individual textures manage their own depth dimensions. */ resize(width, height, depth) { if (arguments.length > 2) { console.warn('OffscreenRenderTarget.resize(): The depth parameter is deprecated. ' + 'RenderTarget no longer manages texture depth as it is not required by the rendering backend. ' + 'Use texture.resizeAsAttachment() directly to control texture dimensions.'); } if (this.width === width && this.height === height) return; this.width = width; this.height = height; this.dispose(false); for (const attachment in this._attachments) { const target = this._attachments[attachment]; if (target.isTexture) { target.resizeAsAttachment(width, height); } else { target.resize(width, height); } } } /** * Dispose the render target. * @param {boolean} [disposeAttachments=true] - Whether to dispose attachments as well. */ dispose(disposeAttachments = true) { this.dispatchEvent({ type: 'dispose' }); if (disposeAttachments) { for (const attachment in this._attachments) { this._attachments[attachment].dispose(); } } } /** * Attach a texture(RTT) or renderbuffer to the framebuffer. * Notice: For now, dynamic Attachment during rendering is not supported. * @param {TextureBase|RenderBuffer} target - The texture or renderbuffer to attach. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point. * @returns {OffscreenRenderTarget} Self for chaining. */ attach(target, attachment = ATTACHMENT.COLOR_ATTACHMENT0) { if (target.isTexture) { target.resizeAsAttachment(this.width, this.height); } else { target.resize(this.width, this.height); } this._attachments[attachment] = target; return this; } /** * Detach a texture(RTT) or renderbuffer. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point to detach. * @returns {OffscreenRenderTarget} Self for chaining. */ detach(attachment = ATTACHMENT.COLOR_ATTACHMENT0) { delete this._attachments[attachment]; return this; } /** * Get the attached attachment at the specified attachment point. * @param {ATTACHMENT} [attachment=ATTACHMENT.COLOR_ATTACHMENT0] - The attachment point. * @returns {TextureBase|RenderBuffer|null} The attached texture or renderbuffer. */ getAttachment(attachment = ATTACHMENT.COLOR_ATTACHMENT0) { return this._attachments[attachment] || null; } /** * The main texture attachment which is the first color attachment. * @type {TextureBase|null} */ set texture(texture) { if (texture && texture.isTexture) { this.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); } else { this.detach(ATTACHMENT.COLOR_ATTACHMENT0); } } get texture() { const target = this._attachments[ATTACHMENT.COLOR_ATTACHMENT0]; return target && target.isTexture ? target : null; } /** * An alias for {@link OffscreenRenderTarget#activeLayer}. Specifically represents * the currently rendered cube face (0-5) when using cube textures. * @type {number} */ set activeCubeFace(value) { this.activeLayer = value; } get activeCubeFace() { return this.activeLayer; } /** * Create a simple offscreen render target with a color texture and * a depth-stencil renderbuffer. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create2D(width, height) { const renderTarget = new OffscreenRenderTarget(width, height); renderTarget.attach(new Texture2D(), ATTACHMENT.COLOR_ATTACHMENT0); renderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); return renderTarget; } /** * Create a simple offscreen render target with a cube color texture and * a depth-stencil renderbuffer. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static createCube(width, height) { const renderTarget = new OffscreenRenderTarget(width, height); renderTarget.attach(new TextureCube(), ATTACHMENT.COLOR_ATTACHMENT0); renderTarget.attach(new RenderBuffer(width, height, PIXEL_FORMAT.DEPTH_STENCIL), ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); return renderTarget; } /** * Create a simple offscreen render target with a 3D color texture. * Note: No depth-stencil attachment is created by default. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @param {number} depth - The depth of the 3D texture. * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create3D(width, height, depth) { const renderTarget = new OffscreenRenderTarget(width, height); const texture = new Texture3D(); texture.resizeAsAttachment(width, height, depth); renderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); return renderTarget; } /** * Create a simple offscreen render target with a 2D array color texture. * Note: No depth-stencil attachment is created by default. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. * @param {number} depth - The depth of the 2D array texture (number of layers). * @returns {OffscreenRenderTarget} The created offscreen render target. */ static create2DArray(width, height, depth) { const renderTarget = new OffscreenRenderTarget(width, height); const texture = new Texture2DArray(); texture.resizeAsAttachment(width, height, depth); renderTarget.attach(texture, ATTACHMENT.COLOR_ATTACHMENT0); return renderTarget; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ OffscreenRenderTarget.prototype.isOffscreenRenderTarget = true; export { OffscreenRenderTarget }; ================================================ FILE: src/resources/targets/RenderTargetBase.js ================================================ import { EventDispatcher } from '../../EventDispatcher.js'; import { Color4 } from '../../math/Color4.js'; /** * RenderTargetBase is an abstract class representing a rendering target, * which encapsulates the configuration for a render pass, * including clear states, attachments, and other rendering parameters. * @extends EventDispatcher * @abstract */ class RenderTargetBase extends EventDispatcher { constructor(width, height) { super(); /** * The width of the render target. * @type {number} */ this.width = width; /** * The height of the render target. * @type {number} */ this.height = height; /** * Whether to clear the color buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearColor = true; /** * Whether to clear the depth buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearDepth = true; /** * Whether to clear the stencil buffer before rendering to this render target. * @type {boolean} * @default true */ this.clearStencil = true; /** * Clear color value. * @type {Color4} */ this.colorClearValue = new Color4(0, 0, 0, 0); /** * Clear depth value. * @type {number} * @default 1 */ this.depthClearValue = 1; /** * Clear stencil value. * @type {number} * @default 0 */ this.stencilClearValue = 0; /** * A querySet that will store the occlusion query results. If null, occlusion queries are disabled. * @type {QuerySet|null} * @default null */ this.occlusionQuerySet = null; /** * An array of objects defining where and when timestamp query values will be written. * @type {object} * @property {QuerySet|null} querySet - A timestamp querySet. If null, timestamp queries are disabled. * @property {number} beginningOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the beginning of the render pass will be written. * @property {number} endOfPassWriteIndex - A number specifying the query index in querySet where the timestamp at the end of the render pass will be written. */ this.timestampWrites = { querySet: null, beginningOfPassWriteIndex: 0, endOfPassWriteIndex: 1 }; } /** * Resize the render target to the specified dimensions. * @abstract */ resize() { throw new Error('RenderTargetBase: resize method must be implemented by subclass'); } /** * Dispose the render target. * @abstract */ dispose() { throw new Error('RenderTargetBase: dispose method must be implemented by subclass'); } /** * Sets the clear state. * @param {boolean} [color] - Whether to clear the color buffer. * @param {boolean} [depth] - Whether to clear the depth buffer. * @param {boolean} [stencil] - Whether to clear the stencil buffer. * @returns {RenderTargetBase} A reference to this render target. */ setClear(color, depth, stencil) { this.clearColor = color !== undefined ? color : this.clearColor; this.clearDepth = depth !== undefined ? depth : this.clearDepth; this.clearStencil = stencil !== undefined ? stencil : this.clearStencil; return this; } /** * Sets the clear values. * @param {number} r - Red channel value between 0.0 and 1.0. * @param {number} g - Green channel value between 0.0 and 1.0. * @param {number} b - Blue channel value between 0.0 and 1.0. * @param {number} a - Alpha channel value between 0.0 and 1.0. * @returns {RenderTargetBase} A reference to this render target. */ setColorClearValue(r, g, b, a) { this.colorClearValue.setRGBA(r, g, b, a); return this; } /** * Sets the clear depth value. * @param {number} depth - The depth value. * @returns {RenderTargetBase} A reference to this render target. */ setDepthClearValue(depth) { this.depthClearValue = depth; return this; } /** * Sets the clear stencil value. * @param {number} stencil - The stencil value. * @returns {RenderTargetBase} A reference to this render target. */ setStencilClearValue(stencil) { this.stencilClearValue = stencil; return this; } /** * Sets the occlusion query set. * @param {QuerySet|null} querySet - The occlusion query set. If null, occlusion queries are disabled. * @returns {RenderTargetBase} A reference to this render target. */ setOcclusionQuerySet(querySet) { this.occlusionQuerySet = querySet; return this; } /** * Sets the timestamp query set and the query indices. * @param {QuerySet|null} querySet - The timestamp query set. If null, timestamp queries are disabled. * @param {number} [beginIndex=0] - The query index in querySet where the timestamp at the beginning of the render pass will be written. * @param {number} [endIndex=1] - The query index in querySet where the timestamp at the end of the render pass will be written. * @returns {RenderTargetBase} A reference to this render target. */ setTimestampWrites(querySet, beginIndex = 0, endIndex = 1) { this.timestampWrites.querySet = querySet; this.timestampWrites.beginningOfPassWriteIndex = beginIndex; this.timestampWrites.endOfPassWriteIndex = endIndex; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RenderTargetBase.prototype.isRenderTarget = true; export { RenderTargetBase }; ================================================ FILE: src/resources/targets/ScreenRenderTarget.js ================================================ import { RenderTargetBase } from './RenderTargetBase.js'; /** * Render Target that render to screen (canvas). * @extends RenderTargetBase */ class ScreenRenderTarget extends RenderTargetBase { /** * Create a new ScreenRenderTarget. * @param {HTMLCanvasElement} view - The canvas element which the Render Target rendered to. */ constructor(view) { super(view.width, view.height); /** * The canvas element which the Render Target rendered to. * @type {HTMLCanvasElement} */ this.view = view; } /** * Resizes the render target to the specified dimensions. * This method will set the width and height properties of the canvas. * @param {number} width - The width of the render target. * @param {number} height - The height of the render target. */ resize(width, height) { this.view.width = width; this.view.height = height; this.width = width; this.height = height; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ ScreenRenderTarget.prototype.isScreenRenderTarget = true; export { ScreenRenderTarget }; ================================================ FILE: src/resources/textures/Texture2D.js ================================================ import { TextureBase } from './TextureBase.js'; /** * Creates a 2d texture. * @extends TextureBase */ class Texture2D extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {null | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | object} * @default null */ this.image = null; } /** * Copy the given 2d texture into this texture. * @param {Texture2D} source - The 2d texture to be copied. * @returns {Texture2D} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height) { if (this.image && this.image.rtt) { if (this.image.width !== width || this.image.height !== height) { this.version++; this.image.width = width; this.image.height = height; } } else { this.version++; this.image = { rtt: true, data: null, width, height }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture2D.prototype.isTexture2D = true; export { Texture2D }; ================================================ FILE: src/resources/textures/Texture2DArray.js ================================================ import { TextureBase } from './TextureBase.js'; import { TEXTURE_FILTER, PIXEL_FORMAT } from '../../const.js'; /** * Creates a 2d texture. (WebGL 2.0) * @extends TextureBase */ class Texture2DArray extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {object} * @default null */ this.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 }; /** * @default PIXEL_FORMAT.RED */ this.format = PIXEL_FORMAT.RED; /** * @default TEXTURE_FILTER.NEAREST */ this.magFilter = TEXTURE_FILTER.NEAREST; /** * @default TEXTURE_FILTER.NEAREST */ this.minFilter = TEXTURE_FILTER.NEAREST; /** * @default false */ this.generateMipmaps = false; /** * @default false */ this.flipY = false; /** * @default 1 */ this.unpackAlignment = 1; /** * A set of all layers which need to be updated in the texture. * @type {Set} */ this.layerUpdates = new Set(); } /** * Copy the given 2d texture into this texture. * @param {Texture2DArray} source - The 2d texture to be copied. * @returns {Texture2DArray} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height, depth) { const resizeDepth = depth !== undefined; if (this.image && this.image.rtt) { if ( this.image.width !== width || this.image.height !== height || (resizeDepth && this.image.depth !== depth) ) { this.version++; this.image.width = width; this.image.height = height; if (resizeDepth) this.image.depth = depth; } } else { this.version++; const oldDepth = (this.image && this.image.depth) ? this.image.depth : 1; this.image = { rtt: true, data: null, width, height, depth: resizeDepth ? depth : oldDepth }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture2DArray.prototype.isTexture2DArray = true; export { Texture2DArray }; ================================================ FILE: src/resources/textures/Texture3D.js ================================================ import { TextureBase } from './TextureBase.js'; import { PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_WRAP, TEXTURE_FILTER } from '../../const.js'; /** * Creates a 3D texture. (WebGL 2.0) * @extends TextureBase */ class Texture3D extends TextureBase { constructor() { super(); /** * Image data for this texture. * @type {object} */ this.image = { data: new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]), width: 2, height: 2, depth: 2 }; /** * This defines how the texture is wrapped in the depth direction. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * @default PIXEL_FORMAT.RED */ this.format = PIXEL_FORMAT.RED; /** * @default PIXEL_TYPE.UNSIGNED_BYTE */ this.type = PIXEL_TYPE.UNSIGNED_BYTE; /** * @default TEXTURE_FILTER.NEAREST */ this.magFilter = TEXTURE_FILTER.NEAREST; /** * @default TEXTURE_FILTER.NEAREST */ this.minFilter = TEXTURE_FILTER.NEAREST; /** * @default false */ this.generateMipmaps = false; /** * @default false */ this.flipY = false; /** * @default 1 */ this.unpackAlignment = 1; } /** * Copy the given 3d texture into this texture. * @param {Texture3D} source - The 3d texture to be copied. * @returns {Texture3D} */ copy(source) { super.copy(source); this.image = source.image; return this; } /** * @override */ resizeAsAttachment(width, height, depth) { const resizeDepth = depth !== undefined; if (this.image && this.image.rtt) { if ( this.image.width !== width || this.image.height !== height || (resizeDepth && this.image.depth !== depth) ) { this.version++; this.image.width = width; this.image.height = height; if (resizeDepth) this.image.depth = depth; } } else { this.version++; const oldDepth = (this.image && this.image.depth) ? this.image.depth : 1; this.image = { rtt: true, data: null, width, height, depth: resizeDepth ? depth : oldDepth }; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Texture3D.prototype.isTexture3D = true; export { Texture3D }; ================================================ FILE: src/resources/textures/TextureBase.js ================================================ import { cloneJson } from '../../base.js'; import { PIXEL_FORMAT, PIXEL_TYPE, TEXTURE_FILTER, TEXTURE_WRAP, TEXEL_ENCODING_TYPE } from '../../const.js'; import { EventDispatcher } from '../../EventDispatcher.js'; let _textureId = 0; /** * Create a texture to apply to a surface or as a reflection or refraction map. * @abstract * @extends EventDispatcher */ class TextureBase extends EventDispatcher { constructor() { super(); /** * Unique number for this texture instance. * @readonly * @type {number} */ this.id = _textureId++; /** * An object that can be used to store custom data about the {@link TextureBase}. * It should not hold references to functions as these will not be cloned. * @type {object} * @default {} */ this.userData = {}; /** * Array of user-specified mipmaps (optional). * @type {HTMLImageElement[] | object[]} * @default [] */ this.mipmaps = []; /** * WebGLTexture border. * See {@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D WebGLTexture texImage2D()}. * Must be zero. * @type {number} */ this.border = 0; /** * WebGLTexture texel data format. * @type {PIXEL_FORMAT} * @default PIXEL_FORMAT.RGBA */ this.format = PIXEL_FORMAT.RGBA; /** * The default value is null, the texture's internal format will be obtained using a combination of .format and .type. * Users can also specify a specific internalFormat. * @type {null | PIXEL_FORMAT} * @default null */ this.internalformat = null; /** * WebGLTexture texel data type. * @type {PIXEL_TYPE} * @default PIXEL_TYPE.UNSIGNED_BYTE */ this.type = PIXEL_TYPE.UNSIGNED_BYTE; /** * How the texture is sampled when a texel covers more than one pixel. * @type {TEXTURE_FILTER} * @default TEXTURE_FILTER.LINEAR */ this.magFilter = TEXTURE_FILTER.LINEAR; /** * How the texture is sampled when a texel covers less than one pixel. * @type {TEXTURE_FILTER} * @default TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR */ this.minFilter = TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR; /** * This defines how the texture is wrapped horizontally and corresponds to U in UV mapping. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * This defines how the texture is wrapped vertically and corresponds to V in UV mapping. * @type {TEXTURE_WRAP} * @default TEXTURE_WRAP.CLAMP_TO_EDGE */ this.wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE; /** * The number of samples taken along the axis through the pixel that has the highest density of texels. * A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used. * Use {@link WebGLcapabilities#maxAnisotropy} to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2. * @type {number} * @default 1 */ this.anisotropy = 1; /** * Use for shadow sampler (WebGL 2.0 Only). * @type {COMPARE_FUNC | undefined} * @default undefined */ this.compare = undefined; /** * Whether to generate mipmaps (if possible) for a texture. * Set this to false if you are creating mipmaps manually. * @type {boolean} * @default true */ this.generateMipmaps = true; /** * texture pixel encoding. * @type {TEXEL_ENCODING_TYPE} * @default TEXEL_ENCODING_TYPE.LINEAR */ this.encoding = TEXEL_ENCODING_TYPE.LINEAR; /** * If set to true, the texture is flipped along the vertical axis when uploaded to the GPU. * Default is true to flips the image's Y axis to match the WebGL texture coordinate space. * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead. * @type {boolean} * @default true */ this.flipY = true; /** * If set to true, the alpha channel, if present, is multiplied into the color channels when the texture is uploaded to the GPU. * Note that this property has no effect for ImageBitmap. You need to configure on bitmap creation instead. * @type {boolean} * @default false */ this.premultiplyAlpha = false; /** * Specifies the alignment requirements for the start of each pixel row in memory. * The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on double-word boundaries). * @type {number} * @default 4 */ this.unpackAlignment = 4; /** * version code increse if texture changed. * if version is still 0, this texture will be skiped. * @type {number} * @default 0 */ this.version = 0; } /** * Returns a clone of this texture. * @returns {TextureBase} */ clone() { return new this.constructor().copy(this); } /** * Copy the given texture into this texture. * @param {TextureBase} source - The texture to be copied. * @returns {TextureBase} */ copy(source) { this.userData = cloneJson(source.userData); this.mipmaps = source.mipmaps.slice(0); this.border = source.border; this.format = source.format; this.internalformat = source.internalformat; this.type = source.type; this.magFilter = source.magFilter; this.minFilter = source.minFilter; this.wrapS = source.wrapS; this.wrapT = source.wrapT; this.anisotropy = source.anisotropy; this.compare = source.compare; this.generateMipmaps = source.generateMipmaps; this.encoding = source.encoding; this.flipY = source.flipY; this.premultiplyAlpha = source.premultiplyAlpha; this.unpackAlignment = source.unpackAlignment; this.version = source.version; return this; } /** * Dispatches a dispose event. */ dispose() { this.dispatchEvent({ type: 'dispose' }); this.version = 0; } /** * Resize the texture for use as a render target attachment. * @param {number} width - The new width of the texture. * @param {number} height - The new height of the texture. * @param {number} [depth] - The new depth of the texture. * Only {@link Texture3D} and {@link Texture2DArray} will use this parameter. * If not specified, the depth will not be changed. */ resizeAsAttachment(width, height, depth) {} } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TextureBase.prototype.isTexture = true; export { TextureBase }; ================================================ FILE: src/resources/textures/TextureCube.js ================================================ import { TextureBase } from './TextureBase.js'; /** * Creates a cube texture. * @extends TextureBase */ class TextureCube extends TextureBase { constructor() { super(); /** * Images data for this texture. * @type {HTMLImageElement[]} * @default [] */ this.images = []; /** * @default false */ this.flipY = false; } /** * Copy the given cube texture into this texture. * @param {TextureCube} source - The cube texture to be copied. * @returns {TextureCube} */ copy(source) { super.copy(source); this.images = source.images.slice(0); return this; } /** * @override */ resizeAsAttachment(width, height) { let changed = false; for (let i = 0; i < 6; i++) { if (this.images[i] && this.images[i].rtt) { if (this.images[i].width !== width || this.images[i].height !== height) { this.images[i].width = width; this.images[i].height = height; changed = true; } } else { this.images[i] = { rtt: true, data: null, width, height }; changed = true; } } if (changed) { this.version++; } } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ TextureCube.prototype.isTextureCube = true; export { TextureCube }; ================================================ FILE: src/scenes/Bone.js ================================================ import { Object3D } from './Object3D.js'; /** * A bone which is part of a Skeleton. * The skeleton in turn is used by the SkinnedMesh. * Bones are almost identical to a blank Object3D. * Bone acturely is a joint. * The position means joint position. * Mesh transform is based this joint space. * @extends Object3D */ class Bone extends Object3D { constructor() { super(); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Bone.prototype.isBone = true; export { Bone }; ================================================ FILE: src/scenes/Camera.js ================================================ import { Object3D } from './Object3D.js'; import { TEXEL_ENCODING_TYPE } from '../const.js'; import { Matrix4 } from '../math/Matrix4.js'; import { Frustum } from '../math/Frustum.js'; import { Vector4 } from '../math/Vector4.js'; import { Vector3 } from '../math/Vector3.js'; import { PerspectiveProjection } from '../resources/projections/PerspectiveProjection.js'; import { OrthographicProjection } from '../resources/projections/OrthographicProjection.js'; /** * The camera used for rendering a 3D scene. * The camera's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed camera points down the -Z axis. * @extends Object3D */ class Camera extends Object3D { /** * Create a camera. */ constructor() { super(); /** * This is the inverse of worldMatrix. * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here. * @type {Matrix4} */ this.viewMatrix = new Matrix4(); /** * This is the matrix which contains the projection. * @type {Matrix4} */ this.projectionMatrix = new Matrix4(); /** * This is the matrix which contains the projection. * @type {Matrix4} */ this.projectionMatrixInverse = new Matrix4(); /** * This is the matrix which contains the projection and view matrix. * The matrix may be different from the value passed in the shader, scene.anchorMatrix is not considered here. * @type {Matrix4} */ this.projectionViewMatrix = new Matrix4(); /** * The frustum of the camera. * @type {Frustum} */ this.frustum = new Frustum(); /** * The factor of gamma. * @type {number} * @default 2.0 */ this.gammaFactor = 2.0; /** * Output pixel encoding. * @type {TEXEL_ENCODING_TYPE} * @default TEXEL_ENCODING_TYPE.LINEAR */ this.outputEncoding = TEXEL_ENCODING_TYPE.LINEAR; /** * Where on the screen is the camera rendered in normalized coordinates. * The values in rect range from zero (left/bottom) to one (right/top). * @type {Vector4} * @default Vector4(0, 0, 1, 1) */ this.rect = new Vector4(0, 0, 1, 1); /** * When this is set, it checks every frame if objects are in the frustum of the camera before rendering objects. * Otherwise objects gets rendered every frame even if it isn't visible. * @type {boolean} * @default true */ this.frustumCulled = true; } /** * Set view by look at, this func will set quaternion of this camera. * @param {Vector3} target - The target that the camera look at. * @param {Vector3} up - The up direction of the camera. */ lookAt(target, up) { _mat4_1.lookAtRH(this.position, target, up); this.quaternion.setFromRotationMatrix(_mat4_1); } /** * Set orthographic projection matrix. * @param {number} left Camera frustum left plane. * @param {number} right Camera frustum right plane. * @param {number} bottom Camera frustum bottom plane. * @param {number} top Camera frustum top plane. * @param {number} near Camera frustum near plane. * @param {number} far Camera frustum far plane. * @deprecated Use OrthographicProjection instead. */ setOrtho(left, right, bottom, top, near, far) { _orthographicProjection.set(left, right, top, bottom, near, far); this.setProjectionMatrix(_orthographicProjection.matrix); } /** * Set perspective projection matrix. * @param {number} fov Camera frustum vertical field of view. * @param {number} aspect Camera frustum aspect ratio. * @param {number} near Camera frustum near plane. * @param {number} far Camera frustum far plane. * @deprecated Use PerspectiveProjection instead. */ setPerspective(fov, aspect, near, far) { _perspectiveProjection.set(fov * 180 / Math.PI, aspect, near, far); this.setProjectionMatrix(_perspectiveProjection.matrix); } /** * Set the projection matrix. * @param {Matrix4} matrix The projection matrix. */ setProjectionMatrix(matrix) { this.projectionMatrix.copy(matrix); this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); } getWorldDirection(optionalTarget = new Vector3()) { return super.getWorldDirection(optionalTarget).negate(); } updateMatrix(force) { Object3D.prototype.updateMatrix.call(this, force); this.viewMatrix.copy(this.worldMatrix).invert(); // update view matrix this.projectionViewMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix); // get PV matrix this.frustum.setFromMatrix(this.projectionViewMatrix); // update frustum } copy(source, recursive) { Object3D.prototype.copy.call(this, source, recursive); this.viewMatrix.copy(source.viewMatrix); this.projectionMatrix.copy(source.projectionMatrix); this.projectionMatrixInverse.copy(source.projectionMatrixInverse); this.frustum.copy(source.frustum); this.gammaFactor = source.gammaFactor; this.outputEncoding = source.outputEncoding; this.rect.copy(source.rect); this.frustumCulled = source.frustumCulled; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Camera.prototype.isCamera = true; const _mat4_1 = new Matrix4(); const _perspectiveProjection = new PerspectiveProjection(); const _orthographicProjection = new OrthographicProjection(); export { Camera }; ================================================ FILE: src/scenes/Light.js ================================================ import { Object3D } from './Object3D.js'; import { Color3 } from '../math/Color3.js'; import { Matrix4 } from '../math/Matrix4.js'; /** * Abstract base class for lights * - The light's direction is defined as the 3-vector (0.0, 0,0, -1.0), that is, an untransformed light points down the -Z axis. * - all other light types inherit the properties and methods described here. * @abstract * @extends Object3D */ class Light extends Object3D { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color = 0xffffff, intensity = 1) { super(); /** * Color of the light. * @type {Color3} * @default Color3(0xffffff) */ this.color = new Color3(color); /** * The light's intensity, or strength. * @type {number} * @default 1 */ this.intensity = intensity; /** * Group mask of the light, indicating which lighting group the light belongs to. Default is 1 (binary 0001), meaning the light belongs to lighting group 0. * For example, to make the light effective in both lighting group 0 and lighting group 1, set groupMask to 3 (binary 0011). * Used in conjunction with {@link Material#lightingGroup}. * @type {number} * @default 1 */ this.groupMask = 1; } /** * Set light direction, this func will set quaternion of this light. * @param {Vector3} target - The target that the light look at. * @param {Vector3} up - The up direction of the light. */ lookAt(target, up) { _mat4_1.lookAtRH(this.position, target, up); this.quaternion.setFromRotationMatrix(_mat4_1); } /** * Copies properties from the source light into this one. * @param {Light} source - The source light. * @returns {Light} - This light. */ copy(source) { super.copy(source); this.color.copy(source.color); this.intensity = source.intensity; this.groupMask = source.groupMask; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Light.prototype.isLight = true; const _mat4_1 = new Matrix4(); export { Light }; ================================================ FILE: src/scenes/Mesh.js ================================================ import { Object3D } from './Object3D.js'; import { DRAW_SIDE } from '../const.js'; import { Sphere } from '../math/Sphere.js'; import { Matrix4 } from '../math/Matrix4.js'; import { Ray } from '../math/Ray.js'; import { Vector3 } from '../math/Vector3.js'; import { Vector2 } from '../math/Vector2.js'; import { Triangle } from '../math/Triangle.js'; const _sphere = new Sphere(); const _inverseMatrix = new Matrix4(); const _ray = new Ray(); const _barycoord = new Vector3(); const _vA = new Vector3(); const _vB = new Vector3(); const _vC = new Vector3(); const _tempA = new Vector3(); const _morphA = new Vector3(); const _uvA = new Vector2(); const _uvB = new Vector2(); const _uvC = new Vector2(); const _intersectionPoint = new Vector3(); const _intersectionPointWorld = new Vector3(); /** * Class representing triangular polygon mesh based objects. * Also serves as a base for other classes such as {@link SkinnedMesh}. * @extends Object3D */ class Mesh extends Object3D { /** * @param {Geometry} geometry — an instance of {@link Geometry}. * @param {Material} material - a single or an array of {@link Material}. */ constructor(geometry, material) { super(); /** * an instance of {@link Geometry}. * @type {Geometry} */ this.geometry = geometry; /** * a single or an array of {@link Material}. * @type {Material|Material[]} */ this.material = material; /** * An array of weights typically from 0-1 that specify how much of the morph is applied. * @type {number[] | null} * @default null */ this.morphTargetInfluences = null; } /** * Get the local-space position of the vertex at the given index, * taking into account the current animation state of both morph targets and skinning. * @param {number} index - The index of the vertex. * @param {Vector3} target - The target vector. * @returns {Vector3} The target vector. */ getVertexPosition(index, target) { const geometry = this.geometry; const position = geometry.getAttribute('a_Position'); const morphPosition = geometry.morphAttributes.position; target.fromArray(position.buffer.array, index * position.buffer.stride + position.offset); const morphInfluences = this.morphTargetInfluences; if (morphPosition && morphInfluences) { _morphA.set(0, 0, 0); for (let i = 0, il = morphPosition.length; i < il; i++) { const influence = morphInfluences[i]; const morphAttribute = morphPosition[i]; if (influence === 0) continue; _tempA.fromArray(morphAttribute.buffer.array, index * morphAttribute.buffer.stride + morphAttribute.offset); _morphA.addScaledVector(_tempA, influence); } target.add(_morphA); } return target; } raycast(ray, intersects) { const geometry = this.geometry; const material = this.material; const worldMatrix = this.worldMatrix; _sphere.copy(geometry.boundingSphere); _sphere.applyMatrix4(worldMatrix); if (!ray.intersectsSphere(_sphere)) { return; } _inverseMatrix.copy(worldMatrix).invert(); _ray.copy(ray).applyMatrix4(_inverseMatrix); if (!_ray.intersectsBox(geometry.boundingBox)) { return; } const position = geometry.getAttribute('a_Position'); if (!position) { return; } const uv = geometry.getAttribute('a_Uv'); const groups = geometry.groups; let intersection; if (geometry.index) { const index = geometry.index.buffer.array; if (Array.isArray(material)) { for (let i = 0, il = groups.length; i < il; i++) { const group = groups[i]; const groupMaterial = material[group.materialIndex]; const start = group.start; const end = Math.min(index.length, group.start + group.count); for (let j = start, jl = end; j < jl; j += 3) { const a = index[j]; const b = index[j + 1]; const c = index[j + 2]; intersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersection.face.materialIndex = group.materialIndex; intersects.push(intersection); } } } } else { for (let i = 0, il = index.length; i < il; i += 3) { const a = index[i]; const b = index[i + 1]; const c = index[i + 2]; intersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersects.push(intersection); } } } } else { if (Array.isArray(material)) { for (let i = 0, il = groups.length; i < il; i++) { const group = groups[i]; const groupMaterial = material[group.materialIndex]; const start = group.start; const end = Math.min(position.buffer.count, group.start + group.count); for (let j = start, jl = end; j < jl; j += 3) { const a = j; const b = j + 1; const c = j + 2; intersection = checkGeometryIntersection(this, groupMaterial, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersection.face.materialIndex = group.materialIndex; intersects.push(intersection); } } } } else { for (let i = 0, il = position.buffer.count; i < il; i += 3) { const a = i; const b = i + 1; const c = i + 2; intersection = checkGeometryIntersection(this, material, ray, _ray, uv, a, b, c); if (intersection) { intersection.faceIndex = Math.floor(i / 3); intersects.push(intersection); } } } } } copy(source) { super.copy(source); if (source.morphTargetInfluences) { this.morphTargetInfluences = source.morphTargetInfluences.slice(); } return this; } clone() { return new this.constructor(this.geometry, this.material).copy(this); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Mesh.prototype.isMesh = true; function checkGeometryIntersection(object, material, ray, _ray, uv, a, b, c) { object.getVertexPosition(a, _vA); object.getVertexPosition(b, _vB); object.getVertexPosition(c, _vC); const intersection = checkIntersection(object, material, ray, _ray, _vA, _vB, _vC, _intersectionPoint); if (intersection) { let array; let bufferStride; let attributeOffset; if (uv) { array = uv.buffer.array; bufferStride = uv.buffer.stride; attributeOffset = uv.offset; _uvA.fromArray(array, a * bufferStride + attributeOffset); _uvB.fromArray(array, b * bufferStride + attributeOffset); _uvC.fromArray(array, c * bufferStride + attributeOffset); intersection.uv = uvIntersection(_intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC); } const face = { a: a, b: b, c: c, normal: new Vector3() }; Triangle.normal(_vA, _vB, _vC, face.normal); intersection.face = face; } return intersection; } function uvIntersection(point, p1, p2, p3, uv1, uv2, uv3) { Triangle.barycoordFromPoint(point, p1, p2, p3, _barycoord); uv1.multiplyScalar(_barycoord.x); uv2.multiplyScalar(_barycoord.y); uv3.multiplyScalar(_barycoord.z); uv1.add(uv2).add(uv3); return uv1.clone(); } function checkIntersection(object, material, ray, localRay, pA, pB, pC, point) { let intersect; if (material.side === DRAW_SIDE.BACK) { intersect = localRay.intersectTriangle(pC, pB, pA, true, point); } else { intersect = localRay.intersectTriangle(pA, pB, pC, material.side !== DRAW_SIDE.DOUBLE, point); } if (intersect === null) return null; _intersectionPointWorld.copy(point); _intersectionPointWorld.applyMatrix4(object.worldMatrix); const distance = ray.origin.distanceTo(_intersectionPointWorld); return { distance: distance, point: _intersectionPointWorld.clone(), object: object }; } export { Mesh }; ================================================ FILE: src/scenes/Object3D.js ================================================ import { cloneJson } from '../base.js'; import { SHADOW_TYPE } from '../const.js'; import { Vector3 } from '../math/Vector3.js'; import { Euler } from '../math/Euler.js'; import { Quaternion } from '../math/Quaternion.js'; import { Matrix4 } from '../math/Matrix4.js'; import { MathUtils } from '../math/MathUtils.js'; let _object3DId = 0; const _mat4_1 = new Matrix4(); /** * This is the base class for most objects, * and provides a set of properties and methods for manipulating objects in 3D space. */ class Object3D { constructor() { /** * Unique number for this object instance. * @readonly * @type {number} */ this.id = _object3DId++; /** * UUID of this object instance. * This gets automatically assigned, so this shouldn't be edited. * @type {string} */ this.uuid = MathUtils.generateUUID(); /** * Optional name of the object (doesn't need to be unique). * @type {string} * @default "" */ this.name = ''; /** * A Vector3 representing the object's local position. * @type {Vector3} * @default Vector3(0, 0, 0) */ this.position = new Vector3(); /** * The object's local scale. * @type {Vector3} * @default Vector3(1, 1, 1) */ this.scale = new Vector3(1, 1, 1); /** * Object's local rotation as an {@link Euler}, in radians. * @type {Euler} * @default Euler(0, 0, 0) */ this.euler = new Euler(); /** * Object's local rotation as a {@link Quaternion}. * @type {Quaternion} * @default Quaternion(0, 0, 0, 1) */ this.quaternion = new Quaternion(); // bind euler and quaternion const euler = this.euler, quaternion = this.quaternion; euler.onChange(function() { quaternion.setFromEuler(euler, false); }); quaternion.onChange(function() { euler.setFromQuaternion(quaternion, undefined, false); }); /** * The local transform matrix. * @type {Matrix4} */ this.matrix = new Matrix4(); /** * The global transform of the object. * If the Object3D has no parent, then it's identical to the local transform {@link Object3D#matrix}. * @type {Matrix4} */ this.worldMatrix = new Matrix4(); /** * Object's parent in the scene graph. * An object can have at most one parent. * @type {Object3D[]} */ this.children = new Array(); /** * Object's parent in the scene graph. * An object can have at most one parent. * @type {Object3D} */ this.parent = null; /** * Whether the object gets rendered into shadow map. * @type {boolean} * @default false */ this.castShadow = false; /** * Whether the material receives shadows. * @type {boolean} * @default false */ this.receiveShadow = false; /** * Defines shadow map type. * Note: In webgl1 or {@link Scene#disableShadowSampler} is true, soft shadow types will fallback to POISSON_SOFT without warning. * Note: Point light only support POISSON_SOFT for now. * @type {SHADOW_TYPE} * @default SHADOW_TYPE.PCF3_SOFT */ this.shadowType = SHADOW_TYPE.PCF3_SOFT; /** * When this is set, it checks every frame if the object is in the frustum of the camera before rendering the object. * Otherwise the object gets rendered every frame even if it isn't visible. * @type {boolean} * @default true */ this.frustumCulled = true; /** * Object gets rendered if true. * @type {boolean} * @default true */ this.visible = true; /** * This value allows the default rendering order of scene graph objects to be overridden although opaque and transparent objects remain sorted independently. * Sorting is from lowest to highest renderOrder. * @type {number} * @default 0 */ this.renderOrder = 0; /** * Render layer of this object. * RenderQueue will dispatch all renderable objects to the corresponding RenderQueueLayer according to object.renderLayer. * @type {number} * @default 0 */ this.renderLayer = 0; /** * Whether it can be collected into the Render Queue. * @type {boolean} * @default true */ this.renderable = true; /** * An object that can be used to store custom data about the {@link Object3D}. * It should not hold references to functions as these will not be cloned. * @type {object} * @default {} */ this.userData = {}; /** * When this is set, it calculates the matrix of position, (rotation or quaternion) and scale every frame and also recalculates the worldMatrix property. * @type {boolean} * @default true */ this.matrixAutoUpdate = true; /** * When this is set, it calculates the matrix in that frame and resets this property to false. * @type {boolean} * @default true */ this.matrixNeedsUpdate = true; /** * When this is set, it calculates the world matrix in that frame and resets this property to false. * @type {boolean} * @default true */ this.worldMatrixNeedsUpdate = true; } /** * An optional callback that is executed immediately before the Object3D is rendered. */ onBeforeRender() {} /** * An optional callback that is executed immediately after the Object3D is rendered. */ onAfterRender() {} /** * Add object as child of this object. * @param {Object3D} object */ add(object) { if (object === this) { console.error('Object3D.add: object can\'t be added as a child of itself.', object); return; } if (object.parent !== null) { object.parent.remove(object); } object.parent = this; this.children.push(object); object.worldMatrixNeedsUpdate = true; } /** * Remove object as child of this object. * @param {Object3D} object */ remove(object) { const index = this.children.indexOf(object); if (index !== -1) { object.parent = null; this.children.splice(index, 1); object.worldMatrixNeedsUpdate = true; } } /** * Searches through the object's children and returns the first with a matching name. * Note that for most objects the name is an empty string by default. * You will have to set it manually to make use of this method. * @param {string} name - String to match to the children's {@link Object3D#name} property. * @returns {Object3D} */ getObjectByName(name) { return this.getObjectByProperty('name', name); } /** * Searches through the object's children and returns the first with a property that matches the value given. * @param {string} name - the property name to search for. * @param {number} value - value of the given property. * @returns {Object3D} */ getObjectByProperty(name, value) { if (this[name] === value) return this; for (let i = 0, l = this.children.length; i < l; i++) { const child = this.children[i]; const object = child.getObjectByProperty(name, value); if (object !== undefined) { return object; } } return undefined; } /** * Update the local transform. * @param {boolean} force */ updateMatrix(force) { if (this.matrixAutoUpdate || this.matrixNeedsUpdate) { this.matrix.compose(this.position, this.quaternion, this.scale); this.matrixNeedsUpdate = false; this.worldMatrixNeedsUpdate = true; } if (this.worldMatrixNeedsUpdate || force) { this.worldMatrix.copy(this.matrix); if (this.parent) { const parentMatrix = this.parent.worldMatrix; this.worldMatrix.premultiply(parentMatrix); } this.worldMatrixNeedsUpdate = false; force = true; } const children = this.children; for (let i = 0, l = children.length; i < l; i++) { children[i].updateMatrix(force); } } /** * Returns a vector representing the direction of object's positive z-axis in world space. * This call must be after {@link Object3D#updateMatrix}. * @param {Vector3} [optionalTarget] — the result will be copied into this Vector3. * @returns {Vector3} - the result. */ getWorldDirection(optionalTarget = new Vector3()) { const e = this.worldMatrix.elements; return optionalTarget.set(e[8], e[9], e[10]).normalize(); } /** * Rotates the object to face a point in local space. * @param {Vector3} target - A vector representing a position in local space. * @param {Vector3} up — A vector representing the up direction in local space. */ lookAt(target, up) { _mat4_1.lookAtRH(target, this.position, up); this.quaternion.setFromRotationMatrix(_mat4_1); } /** * Method to get intersections between a casted ray and this object. * @abstract * @param {Ray} ray - The {@link Ray} instance. * @param {Array} intersects - output intersects array. */ raycast(ray, intersects) { } /** * Executes the callback on this object and all descendants. * @param {Function} callback - A function with as first argument an object3D object. */ traverse(callback) { callback(this); const children = this.children; for (let i = 0, l = children.length; i < l; i++) { children[i].traverse(callback); } } /** * Returns a clone of this object and optionally all descendants. * @param {Function} [recursive=true] - if true, descendants of the object are also cloned. * @returns {Object3D} */ clone(recursive) { return new this.constructor().copy(this, recursive); } /** * Copy the given object into this object. * @param {Object3D} source - The object to be copied. * @param {boolean} [recursive=true] - if true, descendants of the object are also copied. * @returns {Object3D} */ copy(source, recursive = true) { this.name = source.name; this.position.copy(source.position); this.quaternion.copy(source.quaternion); this.scale.copy(source.scale); this.matrix.copy(source.matrix); this.worldMatrix.copy(source.worldMatrix); this.castShadow = source.castShadow; this.receiveShadow = source.receiveShadow; this.shadowType = source.shadowType; this.frustumCulled = source.frustumCulled; this.visible = source.visible; this.renderOrder = source.renderOrder; this.renderLayer = source.renderLayer; this.renderable = source.renderable; this.userData = cloneJson(source.userData); if (recursive === true) { for (let i = 0; i < source.children.length; i++) { const child = source.children[i]; this.add(child.clone()); } } return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Object3D.prototype.isObject3D = true; export { Object3D }; ================================================ FILE: src/scenes/Scene.js ================================================ import { Object3D } from './Object3D.js'; import { Matrix4 } from '../math/Matrix4.js'; import { RenderCollector } from '../render/RenderCollector.js'; /** * Scenes allow you to set up what and where is to be rendered, * this is where you place objects, lights and cameras. * @extends Object3D */ class Scene extends Object3D { /** * Create a scene. */ constructor() { super(); /** * A {@link Fog} instance defining the type of fog that affects everything rendered in the scene. * @type {Fog} * @default null */ this.fog = null; /** * Sets the environment map for all materials in the scene. * However, it's not possible to overwrite an existing texture assigned to Material.envMap. * @type {TextureCube | null} * @default null */ this.environment = null; /** * The diffuse intensity of the environment map. * @type {number} * @default 1 */ this.envDiffuseIntensity = 1; /** * The specular intensity of the environment map. * This value is multiplied with the envMapIntensity of the material to get the final intensity. * @type {number} * @default 1 */ this.envSpecularIntensity = 1; /** * User-defined clipping planes specified as {@link Plane} objects in world space. * These planes apply to the scene. * Points in space whose dot product with the plane is negative are cut away. * @type {Plane[]} * @default [] */ this.clippingPlanes = []; /** * Defines whether disable shadow sampler feature. * Shader with sampler2DShadow uniforms may cause unknown error on some android phones, set disableShadowSampler to true to avoid these bugs. * When this property is set to true, soft shadow types will fallback to POISSON_SOFT without warning. * @type {boolean} * @default false */ this.disableShadowSampler = false; /** * whether to use a logarithmic depth buffer. It may be neccesary to use this if dealing with huge differences in scale in a single scene. * Note that this setting uses gl_FragDepth if available which disables the Early Fragment Test optimization and can cause a decrease in performance. * @type {boolean} * @default false */ this.logarithmicDepthBuffer = false; /** * The anchor matrix of the world coordinate system. * If it is not an identity matrix, the actual lighting calculating and the world position in the shader, will be in the anchor coordinate system. * By setting this property, you can solve the floating point precision problem caused by the rendering object far away from the origin of the world coordinate system. * In addition, by setting the rotation, it can also repair the direction of the reflection. * @type {Matrix4} */ this.anchorMatrix = new Matrix4(); /** * A {@link RenderCollector} instance for this scene. * @type {RenderCollector} */ this.collector = new RenderCollector(); } /** * The maximum number of lighting groups. * @type {number} * @default 1 */ set maxLightingGroups(value) { this.collector.lightingData.setMaxGroupCount(value); } get maxLightingGroups() { return this.collector.lightingData.groupList.length; } /** * Get {@link RenderStates} for the scene and camera. * The RenderStates will be updated by calling {@link Scene#updateRenderStates}. * The light data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @returns {RenderQueue} - The target render queue. */ getRenderStates(camera) { return this.collector.getRenderStates(camera); } /** * Get {@link RenderQueue} for the scene and camera. * The RenderQueue will be updated by calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @returns {RenderQueue} - The target render queue. */ getRenderQueue(camera) { return this.collector.getRenderQueue(camera); } /** * Update {@link RenderStates} for the scene and camera. * The lighting data in RenderStates will be empty unless calling {@link Scene#updateRenderQueue}. * @param {Camera} camera - The camera. * @param {boolean} [updateScene=true] - Whether to update scene data. * @returns {RenderStates} - The result render states. */ updateRenderStates(camera, updateScene = true) { const collector = this.collector; if (updateScene) { collector.sceneData.update(this); } const renderStates = collector.getRenderStates(camera); renderStates.updateCamera(camera); return renderStates; } /** * Update {@link RenderQueue} for the scene and camera. * Collect all visible meshes (and lights) from scene graph, and push meshes to render queue. * Light data will be stored in RenderStates. * @param {Camera} camera - The camera. * @param {boolean} [collectLights=true] - Whether to collect light data. * @param {boolean} [updateSkeletons=true] - Whether to update skeletons. * @returns {RenderQueue} - The result render queue. */ updateRenderQueue(camera, collectLights = true, updateSkeletons = true) { const collector = this.collector; collector.lightingNeedsUpdate = collectLights; collector.skeletonNeedsUpdate = updateSkeletons; return collector.traverseAndCollect(this, camera); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ Scene.prototype.isScene = true; export { Scene }; ================================================ FILE: src/scenes/SkinnedMesh.js ================================================ import { Mesh } from './Mesh.js'; import { Matrix4 } from '../math/Matrix4.js'; import { Vector3 } from '../math/Vector3.js'; import { Vector4 } from '../math/Vector4.js'; /** * A mesh that has a {@link Skeleton} with bones that can then be used to animate the vertices of the geometry. * The material must support skinning. * @extends Mesh */ class SkinnedMesh extends Mesh { constructor(geometry, material) { super(geometry, material); /** * Skeleton created from the bones of the Geometry. * @type {Skeleton} */ this.skeleton = undefined; /** * Either "attached" or "detached". * "attached" uses the {@link SkinnedMesh#worldMatrix} property for the base transform matrix of the bones. * "detached" uses the {@link SkinnedMesh#bindMatrix}. * @type {string} * @default "attached" */ this.bindMode = 'attached'; /** * The base matrix that is used for the bound bone transforms. * @type {Matrix4} */ this.bindMatrix = new Matrix4(); /** * The base matrix that is used for resetting the bound bone transforms. * @type {Matrix4} */ this.bindMatrixInverse = new Matrix4(); } /** * Bind a skeleton to the skinned mesh. * The bindMatrix gets saved to .bindMatrix property and the .bindMatrixInverse gets calculated. * @param {Skeleton} skeleton - Skeleton created from a Bones tree. * @param {Matrix4} [bindMatrix] - Matrix4 that represents the base transform of the skeleton. */ bind(skeleton, bindMatrix) { this.skeleton = skeleton; if (bindMatrix === undefined) { this.updateMatrix(); bindMatrix = this.worldMatrix; } this.bindMatrix.copy(bindMatrix); this.bindMatrixInverse.copy(bindMatrix).invert(); } updateMatrix(force) { super.updateMatrix(force); if (this.bindMode === 'attached') { this.bindMatrixInverse.copy(this.worldMatrix).invert(); } else if (this.bindMode === 'detached') { this.bindMatrixInverse.copy(this.bindMatrix).invert(); } else { console.warn('SkinnedMesh: Unrecognized bindMode: ' + this.bindMode); } } copy(source) { super.copy(source); this.bindMode = source.bindMode; this.bindMatrix.copy(source.bindMatrix); this.bindMatrixInverse.copy(source.bindMatrixInverse); this.skeleton = source.skeleton; return this; } getVertexPosition(index, target) { super.getVertexPosition(index, target); this.applyBoneTransform(index, target); return target; } /** * Applies the bone transform associated with the given index to the given position vector. * Returns the updated vector. * @param {number} index - The index of the vertex. * @param {Vector3} target - The target vector. * @returns {Vector3} The target vector. */ applyBoneTransform(index, target) { const skeleton = this.skeleton; const geometry = this.geometry; const skinIndex = geometry.attributes.skinIndex; const skinWeight = geometry.attributes.skinWeight; _skinIndex.fromArray(skinIndex.buffer.array, index * skinIndex.size); _skinWeight.fromArray(skinWeight.buffer.array, index * skinWeight.size); _basePosition.copy(target).applyMatrix4(this.bindMatrix); target.set(0, 0, 0); for (let i = 0; i < 4; i++) { const weight = getComponent(_skinWeight, i); if (weight < Number.EPSILON) continue; const boneIndex = getComponent(_skinIndex, i); if (!skeleton.bones[boneIndex]) continue; _matrix.multiplyMatrices(skeleton.bones[boneIndex].worldMatrix, skeleton.boneInverses[boneIndex]); target.addScaledVector(_vector.copy(_basePosition).applyMatrix4(_matrix), weight); } return target.applyMatrix4(this.bindMatrixInverse); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SkinnedMesh.prototype.isSkinnedMesh = true; const _basePosition = new Vector3(); const _skinIndex = new Vector4(); const _skinWeight = new Vector4(); const _vector = new Vector3(); const _matrix = new Matrix4(); function getComponent(vec, index) { switch (index) { case 0: return vec.x; case 1: return vec.y; case 2: return vec.z; case 3: return vec.w; default: throw new Error('index is out of range: ' + index); } } export { SkinnedMesh }; ================================================ FILE: src/scenes/lights/AmbientLight.js ================================================ import { Light } from '../Light.js'; /** * This light globally illuminates all objects in the scene equally. * This light cannot be used to cast shadows as it does not have a direction. * @extends Light */ class AmbientLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color, intensity) { super(color, intensity); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ AmbientLight.prototype.isAmbientLight = true; export { AmbientLight }; ================================================ FILE: src/scenes/lights/DirectionalLight.js ================================================ import { DirectionalLightShadow } from './DirectionalLightShadow.js'; import { Light } from '../Light.js'; /** * A light that gets emitted in a specific direction. * This light will behave as though it is infinitely far away and the rays produced from it are all parallel. * The common use case for this is to simulate daylight; the sun is far enough away that its position can be considered to be infinite, and all light rays coming from it are parallel. * This light can cast shadows - see the {@link DirectionalLightShadow} page for details. * @extends Light */ class DirectionalLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] */ constructor(color, intensity) { super(color, intensity); /** * A {@link DirectionalLightShadow} used to calculate shadows for this light. * @type {DirectionalLightShadow} * @default DirectionalLightShadow() */ this.shadow = new DirectionalLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ DirectionalLight.prototype.isDirectionalLight = true; export { DirectionalLight }; ================================================ FILE: src/scenes/lights/DirectionalLightShadow.js ================================================ import { LightShadow } from './LightShadow.js'; import { TEXTURE_FILTER, PIXEL_FORMAT, PIXEL_TYPE, ATTACHMENT, COMPARE_FUNC } from '../../const.js'; import { Texture2D } from '../../resources/textures/Texture2D.js'; import { OffscreenRenderTarget } from '../../resources/targets/OffscreenRenderTarget.js'; import { RenderBuffer } from '../../resources/RenderBuffer.js'; /** * This is used internally by DirectionalLights for calculating shadows. * @extends LightShadow */ class DirectionalLightShadow extends LightShadow { constructor() { super(); /** * The cast shadow window size. * @type {number} * @default 500 */ this.windowSize = 500; /** * Controls the extent to which the shadows fade out at the edge of the frustum. * If the value is greater than 0, the shadow fades out from center to all sides of shadow texture (radial fade out), * if the value is less than 0, the shadow will fade out from the y+ direction (vertical fade out). * @type {number} * @default 0 */ this.frustumEdgeFalloff = 0.0; this.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; const depthTexture = new Texture2D(); depthTexture.type = PIXEL_TYPE.UNSIGNED_INT; depthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT; depthTexture.magFilter = TEXTURE_FILTER.LINEAR; depthTexture.minFilter = TEXTURE_FILTER.LINEAR; depthTexture.compare = COMPARE_FUNC.LESS; depthTexture.generateMipmaps = false; const depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16); this.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); this.map = map; this.depthMap = depthTexture; this._depthBuffer = depthBuffer; } update(light) { this._updateCamera(light); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light) { const camera = this.camera; camera.matrix.copy(light.worldMatrix); camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); camera.updateMatrix(); const halfWindowSize = this.windowSize / 2; camera.setOrtho(-halfWindowSize, halfWindowSize, -halfWindowSize, halfWindowSize, this.cameraNear, this.cameraFar); } copy(source) { super.copy(source); this.windowSize = source.windowSize; this.frustumEdgeFalloff = source.frustumEdgeFalloff; return this; } prepareDepthMap(enable, capabilities) { const useDepthMap = enable && capabilities.version >= 2; const renderTarget = this.renderTarget; const attachments = renderTarget._attachments; const depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap; if (useDepthMap === depthMapAttached) return; if (useDepthMap) { if (capabilities.getExtension('OES_texture_float_linear')) { this.depthMap.type = PIXEL_TYPE.FLOAT; } renderTarget.dispose(); renderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT); } else { renderTarget.dispose(); renderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); } } } export { DirectionalLightShadow }; ================================================ FILE: src/scenes/lights/HemisphereLight.js ================================================ import { Light } from '../Light.js'; import { Color3 } from '../../math/Color3.js'; /** * A light source positioned directly above the scene, with color fading from the sky color to the ground color. * This light cannot be used to cast shadows. * @extends Light */ class HemisphereLight extends Light { /** * @param {number} [skyColor=0xffffff] - Hexadecimal color of the sky. * @param {number} [groundColor=0xffffff] - Hexadecimal color of the ground. * @param {number} [intensity=1] - numeric value of the light's strength/intensity. */ constructor(skyColor, groundColor, intensity) { super(skyColor, intensity); /** * Color of the ground. * @type {Color3} * @default Color3(0xffffff) */ this.groundColor = new Color3(groundColor !== undefined ? groundColor : 0xffffff); } copy(source) { super.copy(source); this.groundColor.copy(source.groundColor); } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ HemisphereLight.prototype.isHemisphereLight = true; export { HemisphereLight }; ================================================ FILE: src/scenes/lights/LightShadow.js ================================================ import { Camera } from '../Camera.js'; import { Matrix4 } from '../../math/Matrix4.js'; import { Vector2 } from '../../math/Vector2.js'; /** * Serves as a base class for the other shadow classes. * @abstract */ class LightShadow { constructor() { /** * The light's view of the world. * This is used to generate a depth map of the scene; objects behind other objects from the light's perspective will be in shadow. * @type {Camera} */ this.camera = new Camera(); /** * Model to shadow camera space, to compute location and depth in shadow map. Stored in a {@link Matrix4}. * This is computed internally during rendering. * @type {Matrix4} */ this.matrix = new Matrix4(); /** * Shadow map bias, how much to add or subtract from the normalized depth when deciding whether a surface is in shadow. * Very tiny adjustments here (in the order of 0.0001) may help reduce artefacts in shadows. * @type {number} * @default 0 */ this.bias = 0; /** * Defines how much the position used to query the shadow map is offset along the object normal. * Increasing this value can be used to reduce shadow acne especially in large scenes where light shines onto geometry at a shallow angle. * The cost is that shadows may appear distorted. * @type {number} * @default 0 */ this.normalBias = 0; /** * Setting this to values greater than 1 will blur the edges of the shadow. * High values will cause unwanted banding effects in the shadows - a greater mapSize will allow for a higher value to be used here before these effects become visible. * Note that this has no effect if the {@link Object3D#shadowType} is set to PCF or PCSS. * @type {number} * @default 1 */ this.radius = 1; /** * Shadow camera near. * @type {number} * @default 1 */ this.cameraNear = 1; /** * Shadow camera far. * @type {number} * @default 500 */ this.cameraFar = 500; /** * A {@link Vector2} defining the width and height of the shadow map. * Higher values give better quality shadows at the cost of computation time. * Values must be powers of 2. * @type {Vector2} * @default Vector2(512, 512) */ this.mapSize = new Vector2(512, 512); /** * Enables automatic updates of the light's shadow. * If you do not require dynamic lighting / shadows, you may set this to false. * @type {boolean} * @default true */ this.autoUpdate = true; /** * When set to true, shadow maps will be updated in the next ShadowMapPass.render call. * If you have set .autoUpdate to false, you will need to set this property to true and then make a ShadowMapPass.render call to update the light's shadow. * @type {boolean} * @default false */ this.needsUpdate = false; this.renderTarget = null; this.map = null; this.depthMap = null; } update(light, face) {} updateMatrix() { const matrix = this.matrix; const camera = this.camera; // matrix * 0.5 + 0.5, after identity, range is 0 ~ 1 instead of -1 ~ 1 matrix.set( 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0 ); matrix.multiply(camera.projectionMatrix); matrix.multiply(camera.viewMatrix); } copy(source) { this.camera.copy(source.camera); this.matrix.copy(source.matrix); this.bias = source.bias; this.normalBias = source.normalBias; this.radius = source.radius; this.cameraNear = source.cameraNear; this.cameraFar = source.cameraFar; this.mapSize.copy(source.mapSize); return this; } clone() { return new this.constructor().copy(this); } prepareDepthMap(_enable, _capabilities) {} } export { LightShadow }; ================================================ FILE: src/scenes/lights/PointLight.js ================================================ import { PointLightShadow } from './PointLightShadow.js'; import { Light } from '../Light.js'; /** * A light that gets emitted from a single point in all directions. * A common use case for this is to replicate the light emitted from a bare lightbulb. * This light can cast shadows - see {@link PointLightShadow} page for details. * @extends Light */ class PointLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [distance=200] * @param {number} [decay=1] */ constructor(color, intensity, distance, decay) { super(color, intensity); /** * The amount the light dims along the distance of the light. * @type {number} * @default 1 */ this.decay = (decay !== undefined) ? decay : 1; /** * The distance from the light where the intensity is 0. * @type {number} * @default 200 */ this.distance = (distance !== undefined) ? distance : 200; /** * A {@link PointLightShadow} used to calculate shadows for this light. * @type {PointLightShadow} * @default PointLightShadow() */ this.shadow = new PointLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ PointLight.prototype.isPointLight = true; export { PointLight }; ================================================ FILE: src/scenes/lights/PointLightShadow.js ================================================ import { LightShadow } from './LightShadow.js'; import { TEXTURE_FILTER } from '../../const.js'; import { OffscreenRenderTarget } from '../../resources/targets/OffscreenRenderTarget.js'; import { Vector3 } from '../../math/Vector3.js'; /** * This is used internally by PointLights for calculating shadows. * @extends LightShadow */ class PointLightShadow extends LightShadow { constructor() { super(); this.renderTarget = OffscreenRenderTarget.createCube(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; this.map = map; this._targets = [ new Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1) ]; this._ups = [ new Vector3(0, -1, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(0, -1, 0) ]; this._lookTarget = new Vector3(); } update(light, face) { this._updateCamera(light, face); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light, face) { const camera = this.camera; const lookTarget = this._lookTarget; const targets = this._targets; const ups = this._ups; // set camera position and lookAt(rotation) camera.position.setFromMatrixPosition(light.worldMatrix); lookTarget.set(targets[face].x + camera.position.x, targets[face].y + camera.position.y, targets[face].z + camera.position.z); camera.lookAt(lookTarget, ups[face]); // update view matrix camera.updateMatrix(); // update projection camera.setPerspective(90 / 180 * Math.PI, 1, this.cameraNear, this.cameraFar); } } export { PointLightShadow }; ================================================ FILE: src/scenes/lights/RectAreaLight.js ================================================ import { Light } from '../Light.js'; /** * RectAreaLight emits light uniformly across the face a rectangular plane. * This light can be used to simulate light sources such as bright windows or strip lighting. * Important Notes: * - There is no shadow support. * - Only PBRMaterial are supported. * - You have to set LTC1 and LTC2 in RectAreaLight before using it. * @extends Light */ class RectAreaLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [width=10] * @param {number} [height=10] */ constructor(color, intensity, width = 10, height = 10) { super(color, intensity); /** * The width of the light. * @type {number} * @default 10 */ this.width = width; /** * The height of the light. * @type {number} * @default 10 */ this.height = height; } /** * The light's power. * Power is the luminous power of the light measured in lumens (lm). * Changing the power will also change the light's intensity. * @type {number} */ get power() { // compute the light's luminous power (in lumens) from its intensity (in nits) return this.intensity * this.width * this.height * Math.PI; } set power(power) { // set the light's intensity (in nits) from the desired luminous power (in lumens) this.intensity = power / (this.width * this.height * Math.PI); } copy(source) { super.copy(source); this.width = source.width; this.height = source.height; return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ RectAreaLight.prototype.isRectAreaLight = true; /** * The first LTC (Linearly Transformed Cosines). * If you want to use RectAreaLight, you have to set this before using it. * @type {null | Texture2D} */ RectAreaLight.LTC1 = null; /** * The second LTC (Linearly Transformed Cosines). * If you want to use RectAreaLight, you have to set this before using it. * @type {null | Texture2D} */ RectAreaLight.LTC2 = null; export { RectAreaLight }; ================================================ FILE: src/scenes/lights/SphericalHarmonicsLight.js ================================================ import { Light } from '../Light.js'; import { SphericalHarmonics3 } from '../../math/SphericalHarmonics3.js'; /** * This light globally all objects in the scene equally. * This light depends on spherical harmonics. * @extends Light */ class SphericalHarmonicsLight extends Light { /** * Creates a new SphericalHarmonicsLight. * @param {SphericalHarmonics3} [sh = new SphericalHarmonics3()] * @param {number} [intensity = 1] */ constructor(sh = new SphericalHarmonics3(), intensity = 1) { super(undefined, intensity); /** * An instance of SphericalHarmonics3. * @type {SphericalHarmonics3} */ this.sh = sh; } copy(source) { super.copy(source); this.sh.copy(source.sh); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SphericalHarmonicsLight.prototype.isSphericalHarmonicsLight = true; export { SphericalHarmonicsLight }; ================================================ FILE: src/scenes/lights/SpotLight.js ================================================ import { SpotLightShadow } from './SpotLightShadow.js'; import { Light } from '../Light.js'; /** * This light gets emitted from a single point in one direction, along a cone that increases in size the further from the light it gets. * This light can cast shadows - see the {@link SpotLightShadow} page for details. * @extends Light */ class SpotLight extends Light { /** * @param {number} [color=0xffffff] * @param {number} [intensity=1] * @param {number} [distance=200] * @param {number} [angle=Math.PI/6] * @param {number} [penumbra=0] * @param {number} [decay=1] */ constructor(color, intensity, distance, angle, penumbra, decay) { super(color, intensity); /** * The amount the light dims along the distance of the light. * @type {number} * @default 1 */ this.decay = (decay !== undefined) ? decay : 1; /** * The distance from the light where the intensity is 0. * @type {number} * @default 200 */ this.distance = (distance !== undefined) ? distance : 200; /** * Percent of the spotlight cone that is attenuated due to penumbra. * Takes values between zero and 1. * @type {number} * @default 0 */ this.penumbra = (penumbra !== undefined) ? penumbra : 0; /** * Maximum extent of the spotlight, in radians, from its direction. * Should be no more than Math.PI/2. * @type {number} * @default Math.PI/6 */ this.angle = (angle !== undefined) ? angle : Math.PI / 6; /** * A {@link SpotLightShadow} used to calculate shadows for this light. * @type {SpotLightShadow} * @default SpotLightShadow() */ this.shadow = new SpotLightShadow(); } copy(source) { super.copy(source); this.shadow.copy(source.shadow); return this; } } /** * This flag can be used for type testing. * @readonly * @type {boolean} * @default true */ SpotLight.prototype.isSpotLight = true; export { SpotLight }; ================================================ FILE: src/scenes/lights/SpotLightShadow.js ================================================ import { LightShadow } from './LightShadow.js'; import { TEXTURE_FILTER, PIXEL_FORMAT, PIXEL_TYPE, ATTACHMENT, COMPARE_FUNC } from '../../const.js'; import { Texture2D } from '../../resources/textures/Texture2D.js'; import { OffscreenRenderTarget } from '../../resources/targets/OffscreenRenderTarget.js'; import { RenderBuffer } from '../../resources/RenderBuffer.js'; /** * This is used internally by SpotLights for calculating shadows. * @extends LightShadow */ class SpotLightShadow extends LightShadow { constructor() { super(); /** * Controls the extent to which the shadows fade out at the edge of the frustum. * @type {number} * @default 0 */ this.frustumEdgeFalloff = 0.0; this.renderTarget = OffscreenRenderTarget.create2D(this.mapSize.x, this.mapSize.y); const map = this.renderTarget.texture; map.generateMipmaps = false; map.minFilter = TEXTURE_FILTER.NEAREST; map.magFilter = TEXTURE_FILTER.NEAREST; const depthTexture = new Texture2D(); depthTexture.type = PIXEL_TYPE.UNSIGNED_INT; depthTexture.format = PIXEL_FORMAT.DEPTH_COMPONENT; depthTexture.magFilter = TEXTURE_FILTER.LINEAR; depthTexture.minFilter = TEXTURE_FILTER.LINEAR; depthTexture.compare = COMPARE_FUNC.LESS; depthTexture.generateMipmaps = false; const depthBuffer = new RenderBuffer(this.mapSize.x, this.mapSize.y, PIXEL_FORMAT.DEPTH_COMPONENT16); this.renderTarget.detach(ATTACHMENT.DEPTH_STENCIL_ATTACHMENT); this.renderTarget.attach(depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); this.map = map; this.depthMap = depthTexture; this._depthBuffer = depthBuffer; } update(light) { this._updateCamera(light); if (this.mapSize.x !== this.renderTarget.width || this.mapSize.y !== this.renderTarget.height) { this.renderTarget.resize(this.mapSize.x, this.mapSize.y); } } _updateCamera(light) { const camera = this.camera; camera.matrix.copy(light.worldMatrix); camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); camera.updateMatrix(); camera.setPerspective(light.angle * 2, 1, this.cameraNear, this.cameraFar); } copy(source) { super.copy(source); this.frustumEdgeFalloff = source.frustumEdgeFalloff; return this; } prepareDepthMap(enable, capabilities) { const useDepthMap = enable && capabilities.version >= 2; const renderTarget = this.renderTarget; const attachments = renderTarget._attachments; const depthMapAttached = attachments[ATTACHMENT.DEPTH_ATTACHMENT] === this.depthMap; if (useDepthMap === depthMapAttached) return; if (useDepthMap) { if (capabilities.getExtension('OES_texture_float_linear')) { this.depthMap.type = PIXEL_TYPE.FLOAT; } renderTarget.dispose(); renderTarget.attach(this.depthMap, ATTACHMENT.DEPTH_ATTACHMENT); } else { renderTarget.dispose(); renderTarget.attach(this._depthBuffer, ATTACHMENT.DEPTH_ATTACHMENT); } } } export { SpotLightShadow }; ================================================ FILE: src/shaders/ShaderChunk.js ================================================ import alphaTest_frag from './shaderChunk/alphaTest_frag.glsl'; import alphaTest_pars_frag from './shaderChunk/alphaTest_pars_frag.glsl'; import aoMap_pars_frag from './shaderChunk/aoMap_pars_frag.glsl'; import aoMap_pars_vert from './shaderChunk/aoMap_pars_vert.glsl'; import aoMap_vert from './shaderChunk/aoMap_vert.glsl'; import aoMap_frag from './shaderChunk/aoMap_frag.glsl'; import begin_frag from './shaderChunk/begin_frag.glsl'; import begin_vert from './shaderChunk/begin_vert.glsl'; import bsdfs from './shaderChunk/bsdfs.glsl'; import bumpMap_pars_frag from './shaderChunk/bumpMap_pars_frag.glsl'; import clippingPlanes_frag from './shaderChunk/clippingPlanes_frag.glsl'; import clippingPlanes_pars_frag from './shaderChunk/clippingPlanes_pars_frag.glsl'; import color_frag from './shaderChunk/color_frag.glsl'; import color_pars_frag from './shaderChunk/color_pars_frag.glsl'; import color_pars_vert from './shaderChunk/color_pars_vert.glsl'; import color_vert from './shaderChunk/color_vert.glsl'; import common_frag from './shaderChunk/common_frag.glsl'; import common_vert from './shaderChunk/common_vert.glsl'; import diffuseMap_frag from './shaderChunk/diffuseMap_frag.glsl'; import diffuseMap_pars_frag from './shaderChunk/diffuseMap_pars_frag.glsl'; import diffuseMap_vert from './shaderChunk/diffuseMap_vert.glsl'; import diffuseMap_pars_vert from './shaderChunk/diffuseMap_pars_vert.glsl'; import emissiveMap_frag from './shaderChunk/emissiveMap_frag.glsl'; import emissiveMap_pars_frag from './shaderChunk/emissiveMap_pars_frag.glsl'; import emissiveMap_vert from './shaderChunk/emissiveMap_vert.glsl'; import emissiveMap_pars_vert from './shaderChunk/emissiveMap_pars_vert.glsl'; import encodings_frag from './shaderChunk/encodings_frag.glsl'; import encodings_pars_frag from './shaderChunk/encodings_pars_frag.glsl'; import end_frag from './shaderChunk/end_frag.glsl'; import envMap_frag from './shaderChunk/envMap_frag.glsl'; import envMap_pars_frag from './shaderChunk/envMap_pars_frag.glsl'; import envMap_pars_vert from './shaderChunk/envMap_pars_vert.glsl'; import envMap_vert from './shaderChunk/envMap_vert.glsl'; import fog_frag from './shaderChunk/fog_frag.glsl'; import fog_pars_frag from './shaderChunk/fog_pars_frag.glsl'; import inverse from './shaderChunk/inverse.glsl'; import light_frag from './shaderChunk/light_frag.glsl'; import light_pars_frag from './shaderChunk/light_pars_frag.glsl'; import alphamap_pars_frag from './shaderChunk/alphamap_pars_frag.glsl'; import alphamap_frag from './shaderChunk/alphamap_frag.glsl'; import alphamap_pars_vert from './shaderChunk/alphamap_pars_vert.glsl'; import alphamap_vert from './shaderChunk/alphamap_vert.glsl'; import normalMap_pars_frag from './shaderChunk/normalMap_pars_frag.glsl'; import normal_frag from './shaderChunk/normal_frag.glsl'; import normal_pars_frag from './shaderChunk/normal_pars_frag.glsl'; import normal_pars_vert from './shaderChunk/normal_pars_vert.glsl'; import normal_vert from './shaderChunk/normal_vert.glsl'; import packing from './shaderChunk/packing.glsl'; import premultipliedAlpha_frag from './shaderChunk/premultipliedAlpha_frag.glsl'; import pvm_vert from './shaderChunk/pvm_vert.glsl'; import dithering_frag from './shaderChunk/dithering_frag.glsl'; import dithering_pars_frag from './shaderChunk/dithering_pars_frag.glsl'; import shadow from './shaderChunk/shadow.glsl'; import shadowMap_frag from './shaderChunk/shadowMap_frag.glsl'; import shadowMap_pars_frag from './shaderChunk/shadowMap_pars_frag.glsl'; import shadowMap_pars_vert from './shaderChunk/shadowMap_pars_vert.glsl'; import shadowMap_vert from './shaderChunk/shadowMap_vert.glsl'; import morphnormal_vert from './shaderChunk/morphnormal_vert.glsl'; import morphtarget_pars_vert from './shaderChunk/morphtarget_pars_vert.glsl'; import morphtarget_vert from './shaderChunk/morphtarget_vert.glsl'; import skinning_pars_vert from './shaderChunk/skinning_pars_vert.glsl'; import skinning_vert from './shaderChunk/skinning_vert.glsl'; import skinnormal_vert from './shaderChunk/skinnormal_vert.glsl'; import specularMap_frag from './shaderChunk/specularMap_frag.glsl'; import specularMap_pars_frag from './shaderChunk/specularMap_pars_frag.glsl'; import transpose from './shaderChunk/transpose.glsl'; import tsn from './shaderChunk/tsn.glsl'; import uv_pars_frag from './shaderChunk/uv_pars_frag.glsl'; import uv_pars_vert from './shaderChunk/uv_pars_vert.glsl'; import uv_vert from './shaderChunk/uv_vert.glsl'; import modelPos_pars_frag from './shaderChunk/modelPos_pars_frag.glsl'; import modelPos_pars_vert from './shaderChunk/modelPos_pars_vert.glsl'; import modelPos_vert from './shaderChunk/modelPos_vert.glsl'; import logdepthbuf_frag from './shaderChunk/logdepthbuf_frag.glsl'; import logdepthbuf_pars_frag from './shaderChunk/logdepthbuf_pars_frag.glsl'; import logdepthbuf_pars_vert from './shaderChunk/logdepthbuf_pars_vert.glsl'; import logdepthbuf_vert from './shaderChunk/logdepthbuf_vert.glsl'; import clearcoat_pars_frag from './shaderChunk/clearcoat_pars_frag.glsl'; export const ShaderChunk = { alphaTest_frag: alphaTest_frag, alphaTest_pars_frag: alphaTest_pars_frag, aoMap_pars_frag: aoMap_pars_frag, aoMap_pars_vert: aoMap_pars_vert, aoMap_vert: aoMap_vert, aoMap_frag: aoMap_frag, begin_frag: begin_frag, begin_vert: begin_vert, bsdfs: bsdfs, bumpMap_pars_frag: bumpMap_pars_frag, clippingPlanes_frag: clippingPlanes_frag, clippingPlanes_pars_frag: clippingPlanes_pars_frag, color_frag: color_frag, color_pars_frag: color_pars_frag, color_pars_vert: color_pars_vert, color_vert: color_vert, common_frag: common_frag, common_vert: common_vert, diffuseMap_frag: diffuseMap_frag, diffuseMap_pars_frag: diffuseMap_pars_frag, diffuseMap_vert: diffuseMap_vert, diffuseMap_pars_vert: diffuseMap_pars_vert, emissiveMap_frag: emissiveMap_frag, emissiveMap_pars_frag: emissiveMap_pars_frag, emissiveMap_vert: emissiveMap_vert, emissiveMap_pars_vert: emissiveMap_pars_vert, encodings_frag: encodings_frag, encodings_pars_frag: encodings_pars_frag, end_frag: end_frag, envMap_frag: envMap_frag, envMap_pars_frag: envMap_pars_frag, envMap_pars_vert: envMap_pars_vert, envMap_vert: envMap_vert, fog_frag: fog_frag, fog_pars_frag: fog_pars_frag, inverse: inverse, light_frag: light_frag, light_pars_frag: light_pars_frag, alphamap_pars_frag: alphamap_pars_frag, alphamap_frag: alphamap_frag, alphamap_pars_vert: alphamap_pars_vert, alphamap_vert: alphamap_vert, normalMap_pars_frag: normalMap_pars_frag, normal_frag: normal_frag, normal_pars_frag: normal_pars_frag, normal_pars_vert: normal_pars_vert, normal_vert: normal_vert, packing: packing, premultipliedAlpha_frag: premultipliedAlpha_frag, pvm_vert: pvm_vert, dithering_frag: dithering_frag, dithering_pars_frag: dithering_pars_frag, shadow: shadow, shadowMap_frag: shadowMap_frag, shadowMap_pars_frag: shadowMap_pars_frag, shadowMap_pars_vert: shadowMap_pars_vert, shadowMap_vert: shadowMap_vert, morphnormal_vert: morphnormal_vert, morphtarget_pars_vert: morphtarget_pars_vert, morphtarget_vert: morphtarget_vert, skinning_pars_vert: skinning_pars_vert, skinning_vert: skinning_vert, skinnormal_vert: skinnormal_vert, specularMap_frag: specularMap_frag, specularMap_pars_frag: specularMap_pars_frag, transpose: transpose, tsn: tsn, uv_pars_frag: uv_pars_frag, uv_pars_vert: uv_pars_vert, uv_vert: uv_vert, modelPos_pars_frag: modelPos_pars_frag, modelPos_pars_vert: modelPos_pars_vert, modelPos_vert: modelPos_vert, logdepthbuf_frag: logdepthbuf_frag, logdepthbuf_pars_frag: logdepthbuf_pars_frag, logdepthbuf_pars_vert: logdepthbuf_pars_vert, logdepthbuf_vert: logdepthbuf_vert, clearcoat_pars_frag: clearcoat_pars_frag }; ================================================ FILE: src/shaders/ShaderLib.js ================================================ import basic_frag from './shaderLib/basic_frag.glsl'; import basic_vert from './shaderLib/basic_vert.glsl'; import depth_frag from './shaderLib/depth_frag.glsl'; import depth_vert from './shaderLib/depth_vert.glsl'; import distance_frag from './shaderLib/distance_frag.glsl'; import distance_vert from './shaderLib/distance_vert.glsl'; import lambert_frag from './shaderLib/lambert_frag.glsl'; import lambert_vert from './shaderLib/lambert_vert.glsl'; import normaldepth_frag from './shaderLib/normaldepth_frag.glsl'; import normaldepth_vert from './shaderLib/normaldepth_vert.glsl'; import pbr_frag from './shaderLib/pbr_frag.glsl'; import pbr2_frag from './shaderLib/pbr2_frag.glsl'; import pbr_vert from './shaderLib/pbr_vert.glsl'; import phong_frag from './shaderLib/phong_frag.glsl'; import phong_vert from './shaderLib/phong_vert.glsl'; import point_frag from './shaderLib/point_frag.glsl'; import point_vert from './shaderLib/point_vert.glsl'; export const ShaderLib = { basic_frag: basic_frag, basic_vert: basic_vert, depth_frag: depth_frag, depth_vert: depth_vert, distance_frag: distance_frag, distance_vert: distance_vert, lambert_frag: lambert_frag, lambert_vert: lambert_vert, normaldepth_frag: normaldepth_frag, normaldepth_vert: normaldepth_vert, pbr_frag: pbr_frag, pbr_vert: pbr_vert, pbr2_frag: pbr2_frag, pbr2_vert: pbr_vert, phong_frag: phong_frag, phong_vert: phong_vert, point_frag: point_frag, point_vert: point_vert }; ================================================ FILE: src/shaders/shaderChunk/alphaTest_frag.glsl ================================================ #ifdef ALPHATEST if (outColor.a < u_AlphaTest) discard; // prevent alpha test edge gradient outColor.a = u_Opacity; #endif ================================================ FILE: src/shaders/shaderChunk/alphaTest_pars_frag.glsl ================================================ #ifdef ALPHATEST uniform float u_AlphaTest; #endif ================================================ FILE: src/shaders/shaderChunk/alphamap_frag.glsl ================================================ #ifdef USE_ALPHA_MAP outColor.a *= texture2D(alphaMap, vAlphaMapUV).g; #endif ================================================ FILE: src/shaders/shaderChunk/alphamap_pars_frag.glsl ================================================ #ifdef USE_ALPHA_MAP uniform sampler2D alphaMap; varying vec2 vAlphaMapUV; #endif ================================================ FILE: src/shaders/shaderChunk/alphamap_pars_vert.glsl ================================================ #ifdef USE_ALPHA_MAP uniform mat3 alphaMapUVTransform; varying vec2 vAlphaMapUV; #endif ================================================ FILE: src/shaders/shaderChunk/alphamap_vert.glsl ================================================ #ifdef USE_ALPHA_MAP vAlphaMapUV = (alphaMapUVTransform * vec3(ALPHAMAP_UV, 1.)).xy; #endif ================================================ FILE: src/shaders/shaderChunk/aoMap_frag.glsl ================================================ // Use V, roughness from light_frag // Use N from normal_frag #ifdef USE_AOMAP // reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture float ambientOcclusion = (texture2D(aoMap, vAOMapUV).r - 1.0) * aoMapIntensity + 1.0; reflectedLight.indirectDiffuse *= ambientOcclusion; #if defined(USE_ENV_MAP) && defined(USE_PBR) float dotNV = saturate(dot(N, V)); reflectedLight.indirectSpecular *= computeSpecularOcclusion(dotNV, ambientOcclusion, roughness); #endif #endif ================================================ FILE: src/shaders/shaderChunk/aoMap_pars_frag.glsl ================================================ #ifdef USE_AOMAP uniform sampler2D aoMap; uniform float aoMapIntensity; varying vec2 vAOMapUV; #endif ================================================ FILE: src/shaders/shaderChunk/aoMap_pars_vert.glsl ================================================ #ifdef USE_AOMAP uniform mat3 aoMapUVTransform; varying vec2 vAOMapUV; #endif ================================================ FILE: src/shaders/shaderChunk/aoMap_vert.glsl ================================================ #ifdef USE_AOMAP vAOMapUV = (aoMapUVTransform * vec3(AOMAP_UV, 1.)).xy; #endif ================================================ FILE: src/shaders/shaderChunk/begin_frag.glsl ================================================ vec4 outColor = vec4(u_Color, u_Opacity); ================================================ FILE: src/shaders/shaderChunk/begin_vert.glsl ================================================ vec3 transformed = vec3(a_Position); vec3 objectNormal = vec3(a_Normal); #ifdef USE_TANGENT vec3 objectTangent = vec3(a_Tangent.xyz); #endif ================================================ FILE: src/shaders/shaderChunk/bsdfs.glsl ================================================ // About Cook-Torrance microfacet model, referenced to: https://en.wikipedia.org/wiki/Specular_highlight#Cook–Torrance_model vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { return RECIPROCAL_PI * diffuseColor; } vec3 F_Schlick(const in vec3 specularColor, const in float dotLH) { // Original approximation by Christophe Schlick '94 // float fresnel = pow( 1.0 - dotLH, 5.0 ); // Optimized variant (presented by Epic at SIGGRAPH '13) // https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf float fresnel = exp2((-5.55473 * dotLH - 6.98316) * dotLH); return (1.0 - specularColor) * fresnel + specularColor; } float D_BlinnPhong(const in float shininess, const in float dotNH) { // normalized Blinn-Phong return RECIPROCAL_PI * (shininess * 0.5 + 1.0) * pow(dotNH, shininess); } float G_BlinnPhong_Implicit(/* const in float dotNL, const in float dotNV */) { // geometry term is (n dot l)(n dot v) / 4(n dot l)(n dot v) return 0.25; } vec3 BRDF_Specular_BlinnPhong(vec3 specularColor, vec3 N, vec3 L, vec3 V, float shininess) { vec3 H = normalize(L + V); float dotNH = saturate(dot(N, H)); float dotLH = saturate(dot(L, H)); vec3 F = F_Schlick(specularColor, dotLH); float G = G_BlinnPhong_Implicit(/* dotNL, dotNV */); float D = D_BlinnPhong(shininess, dotNH); return F * G * D; } // Microfacet Models for Refraction through Rough Surfaces - equation (33) // http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html // alpha is "roughness squared" in Disney’s reparameterization float D_GGX(const in float alpha, const in float dotNH) { float a2 = pow2(alpha); float denom = pow2(dotNH) * (a2 - 1.0) + 1.0; // avoid alpha = 0 with dotNH = 1 return RECIPROCAL_PI * a2 / pow2(denom); } // Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2 // https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf float G_GGX_SmithCorrelated(const in float alpha, const in float dotNL, const in float dotNV) { float a2 = pow2(alpha); // dotNL and dotNV are explicitly swapped. This is not a mistake. float gv = dotNL * sqrt(a2 + (1.0 - a2) * pow2(dotNV)); float gl = dotNV * sqrt(a2 + (1.0 - a2) * pow2(dotNL)); return 0.5 / max(gv + gl, EPSILON); } // GGX Distribution, Schlick Fresnel, GGX-Smith Visibility vec3 BRDF_Specular_GGX(vec3 specularColor, vec3 N, vec3 L, vec3 V, float roughness) { float alpha = pow2(roughness); // UE4's roughness vec3 H = normalize(L + V); float dotNL = saturate(dot(N, L)); float dotNV = saturate(dot(N, V)); float dotNH = saturate(dot(N, H)); float dotLH = saturate(dot(L, H)); vec3 F = F_Schlick(specularColor, dotLH); float G = G_GGX_SmithCorrelated(alpha, dotNL, dotNV); float D = D_GGX(alpha, dotNH); return F * G * D; } // Analytical approximation of the DFG LUT, one half of the // split-sum approximation used in indirect specular lighting. // via 'environmentBRDF' from "Physically Based Shading on Mobile" // https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile vec2 integrateSpecularBRDF(const in float dotNV, const in float roughness) { const vec4 c0 = vec4(-1, -0.0275, -0.572, 0.022); const vec4 c1 = vec4(1, 0.0425, 1.04, -0.04); vec4 r = roughness * c0 + c1; float a004 = min(r.x * r.x, exp2(-9.28 * dotNV)) * r.x + r.y; return vec2(-1.04, 1.04) * a004 + r.zw; } vec3 F_Schlick_RoughnessDependent(const in vec3 F0, const in float dotNV, const in float roughness) { // See F_Schlick float fresnel = exp2((-5.55473 * dotNV - 6.98316) * dotNV); vec3 Fr = max(vec3(1.0 - roughness), F0) - F0; return Fr * fresnel + F0; } // ref: https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile vec3 BRDF_Specular_GGX_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness) { float dotNV = saturate(dot(N, V)); vec2 brdf = integrateSpecularBRDF(dotNV, roughness); return specularColor * brdf.x + brdf.y; } // Fdez-Agüera's "Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting" // Approximates multiscattering in order to preserve energy. // http://www.jcgt.org/published/0008/01/03/ void BRDF_Specular_Multiscattering_Environment(const in vec3 N, const in vec3 V, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter) { float dotNV = saturate(dot(N, V)); vec3 F = F_Schlick_RoughnessDependent(specularColor, dotNV, roughness); vec2 brdf = integrateSpecularBRDF(dotNV, roughness); vec3 FssEss = F * brdf.x + brdf.y; float Ess = brdf.x + brdf.y; float Ems = 1.0 - Ess; vec3 Favg = specularColor + (1.0 - specularColor) * 0.047619; // 1/21 vec3 Fms = FssEss * Favg / (1.0 - Ems * Favg); singleScatter += FssEss; multiScatter += Fms * Ems; } ================================================ FILE: src/shaders/shaderChunk/bumpMap_pars_frag.glsl ================================================ #ifdef USE_BUMPMAP uniform sampler2D bumpMap; uniform float bumpScale; // Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen // http://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2) vec2 dHdxy_fwd(vec2 uv) { vec2 dSTdx = dFdx( uv ); vec2 dSTdy = dFdy( uv ); float Hll = bumpScale * texture2D( bumpMap, uv ).x; float dBx = bumpScale * texture2D( bumpMap, uv + dSTdx ).x - Hll; float dBy = bumpScale * texture2D( bumpMap, uv + dSTdy ).x - Hll; return vec2( dBx, dBy ); } vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy) { vec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) ); vec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) ); vec3 vN = surf_norm; // normalized vec3 R1 = cross( vSigmaY, vN ); vec3 R2 = cross( vN, vSigmaX ); float fDet = dot( vSigmaX, R1 ); fDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 ); vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 ); return normalize( abs( fDet ) * surf_norm - vGrad ); } #endif ================================================ FILE: src/shaders/shaderChunk/clearcoat_pars_frag.glsl ================================================ #ifdef USE_CLEARCOAT uniform float u_Clearcoat; uniform float u_ClearcoatRoughness; #endif #ifdef USE_CLEARCOATMAP uniform sampler2D clearcoatMap; #endif #ifdef USE_CLEARCOAT_ROUGHNESSMAP uniform sampler2D clearcoatRoughnessMap; #endif #ifdef USE_CLEARCOAT_NORMALMAP uniform sampler2D clearcoatNormalMap; uniform vec2 clearcoatNormalScale; #endif ================================================ FILE: src/shaders/shaderChunk/clippingPlanes_frag.glsl ================================================ // Use v_modelPos from modelPos_pars_frag #if NUM_CLIPPING_PLANES > 0 vec4 plane; #pragma unroll_loop_start for (int i = 0; i < NUM_CLIPPING_PLANES; i++) { plane = clippingPlanes[i]; if ( dot( -v_modelPos, plane.xyz ) > plane.w ) discard; } #pragma unroll_loop_end #endif ================================================ FILE: src/shaders/shaderChunk/clippingPlanes_pars_frag.glsl ================================================ #if NUM_CLIPPING_PLANES > 0 uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; #endif ================================================ FILE: src/shaders/shaderChunk/color_frag.glsl ================================================ #ifdef USE_VCOLOR_RGB outColor.rgb *= v_Color; #endif #ifdef USE_VCOLOR_RGBA outColor *= v_Color; #endif ================================================ FILE: src/shaders/shaderChunk/color_pars_frag.glsl ================================================ #ifdef USE_VCOLOR_RGB varying vec3 v_Color; #endif #ifdef USE_VCOLOR_RGBA varying vec4 v_Color; #endif ================================================ FILE: src/shaders/shaderChunk/color_pars_vert.glsl ================================================ #ifdef USE_VCOLOR_RGB attribute vec3 a_Color; varying vec3 v_Color; #endif #ifdef USE_VCOLOR_RGBA attribute vec4 a_Color; varying vec4 v_Color; #endif ================================================ FILE: src/shaders/shaderChunk/color_vert.glsl ================================================ #if defined(USE_VCOLOR_RGB) || defined(USE_VCOLOR_RGBA) v_Color = a_Color; #endif ================================================ FILE: src/shaders/shaderChunk/common_frag.glsl ================================================ uniform mat4 u_View; uniform float u_Opacity; uniform vec3 u_Color; uniform vec3 u_CameraPosition; bool isPerspectiveMatrix( mat4 m ) { return m[ 2 ][ 3 ] == - 1.0; } struct ReflectedLight { vec3 directDiffuse; vec3 directSpecular; vec3 indirectDiffuse; vec3 indirectSpecular; }; ================================================ FILE: src/shaders/shaderChunk/common_vert.glsl ================================================ attribute vec3 a_Position; attribute vec3 a_Normal; #ifdef USE_TANGENT attribute vec4 a_Tangent; #endif #include #include uniform mat4 u_Projection; uniform mat4 u_View; uniform mat4 u_Model; uniform mat4 u_ProjectionView; uniform vec3 u_CameraPosition; #define EPSILON 1e-6 #ifdef USE_MORPHTARGETS attribute vec3 morphTarget0; attribute vec3 morphTarget1; attribute vec3 morphTarget2; attribute vec3 morphTarget3; #ifdef USE_MORPHNORMALS attribute vec3 morphNormal0; attribute vec3 morphNormal1; attribute vec3 morphNormal2; attribute vec3 morphNormal3; #else attribute vec3 morphTarget4; attribute vec3 morphTarget5; attribute vec3 morphTarget6; attribute vec3 morphTarget7; #endif #endif bool isPerspectiveMatrix( mat4 m ) { return m[ 2 ][ 3 ] == - 1.0; } ================================================ FILE: src/shaders/shaderChunk/diffuseMap_frag.glsl ================================================ #ifdef USE_DIFFUSE_MAP outColor *= mapTexelToLinear(texture2D(diffuseMap, vDiffuseMapUV)); #endif ================================================ FILE: src/shaders/shaderChunk/diffuseMap_pars_frag.glsl ================================================ #ifdef USE_DIFFUSE_MAP uniform sampler2D diffuseMap; varying vec2 vDiffuseMapUV; #endif ================================================ FILE: src/shaders/shaderChunk/diffuseMap_pars_vert.glsl ================================================ #ifdef USE_DIFFUSE_MAP varying vec2 vDiffuseMapUV; #endif ================================================ FILE: src/shaders/shaderChunk/diffuseMap_vert.glsl ================================================ #ifdef USE_DIFFUSE_MAP vDiffuseMapUV = (uvTransform * vec3(DIFFUSEMAP_UV, 1.)).xy; #endif ================================================ FILE: src/shaders/shaderChunk/dithering_frag.glsl ================================================ #if defined( DITHERING ) gl_FragColor.rgb = dithering( gl_FragColor.rgb ); #endif ================================================ FILE: src/shaders/shaderChunk/dithering_pars_frag.glsl ================================================ #if defined( DITHERING ) // based on http://loopit.dk/banding_in_games.pdf vec3 dithering( vec3 color ) { //Calculate grid position float grid_position = rand( gl_FragCoord.xy ); //Shift the individual colors differently, thus making it even harder to see the dithering pattern vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); //modify shift acording to grid position. dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); //shift the color by dither_shift return color + dither_shift_RGB; } #endif ================================================ FILE: src/shaders/shaderChunk/emissiveMap_frag.glsl ================================================ #ifdef USE_EMISSIVEMAP vec4 emissiveColor = emissiveMapTexelToLinear(texture2D(emissiveMap, vEmissiveMapUV)); totalEmissiveRadiance *= emissiveColor.rgb; #endif ================================================ FILE: src/shaders/shaderChunk/emissiveMap_pars_frag.glsl ================================================ #ifdef USE_EMISSIVEMAP uniform sampler2D emissiveMap; varying vec2 vEmissiveMapUV; #endif ================================================ FILE: src/shaders/shaderChunk/emissiveMap_pars_vert.glsl ================================================ #ifdef USE_EMISSIVEMAP uniform mat3 emissiveMapUVTransform; varying vec2 vEmissiveMapUV; #endif ================================================ FILE: src/shaders/shaderChunk/emissiveMap_vert.glsl ================================================ #ifdef USE_EMISSIVEMAP vEmissiveMapUV = (emissiveMapUVTransform * vec3(EMISSIVEMAP_UV, 1.)).xy; #endif ================================================ FILE: src/shaders/shaderChunk/encodings_frag.glsl ================================================ gl_FragColor = linearToOutputTexel(gl_FragColor); ================================================ FILE: src/shaders/shaderChunk/encodings_pars_frag.glsl ================================================ vec4 LinearToLinear(in vec4 value) { return value; } vec4 GammaToLinear(in vec4 value, in float gammaFactor) { return vec4(pow(value.xyz, vec3(gammaFactor)), value.w); } vec4 LinearToGamma(in vec4 value, in float gammaFactor) { return vec4(pow(value.xyz, vec3(1.0 / gammaFactor)), value.w); } vec4 sRGBToLinear(in vec4 value) { return vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w); } vec4 LinearTosRGB(in vec4 value) { return vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w); } ================================================ FILE: src/shaders/shaderChunk/end_frag.glsl ================================================ gl_FragColor = outColor; ================================================ FILE: src/shaders/shaderChunk/envMap_frag.glsl ================================================ #ifdef USE_ENV_MAP vec3 envDir; #ifdef USE_VERTEX_ENVDIR envDir = v_EnvDir; #else // Use v_modelPos from modelPos_pars_frag // Use N from normal_frag envDir = reflect(normalize(v_modelPos - u_CameraPosition), N); #endif vec4 envColor = textureCube(envMap, vec3(envMapParams.z * envDir.x, envDir.yz)); envColor = envMapTexelToLinear( envColor ); #ifdef ENVMAP_BLENDING_MULTIPLY outColor = mix(outColor, envColor * outColor, envMapParams.y); #elif defined( ENVMAP_BLENDING_MIX ) outColor = mix(outColor, envColor, envMapParams.y); #elif defined( ENVMAP_BLENDING_ADD ) outColor += envColor * envMapParams.y; #endif #endif ================================================ FILE: src/shaders/shaderChunk/envMap_pars_frag.glsl ================================================ #ifdef USE_ENV_MAP #ifdef USE_VERTEX_ENVDIR varying vec3 v_EnvDir; #endif uniform samplerCube envMap; uniform vec3 envMapParams; uniform int maxMipLevel; #endif ================================================ FILE: src/shaders/shaderChunk/envMap_pars_vert.glsl ================================================ #ifdef USE_ENV_MAP #ifdef USE_VERTEX_ENVDIR varying vec3 v_EnvDir; #endif #endif ================================================ FILE: src/shaders/shaderChunk/envMap_vert.glsl ================================================ // Use worldPosition from pvm_vert #ifdef USE_ENV_MAP #ifdef USE_VERTEX_ENVDIR vec3 transformedNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz; transformedNormal = normalize(transformedNormal); v_EnvDir = reflect(normalize(worldPosition.xyz - u_CameraPosition), transformedNormal); #endif #endif ================================================ FILE: src/shaders/shaderChunk/fog_frag.glsl ================================================ #ifdef USE_FOG float depth = gl_FragCoord.z / gl_FragCoord.w; #ifdef USE_EXP2_FOG float fogFactor = 1.0 - exp(-u_FogDensity * u_FogDensity * depth * depth); #else float fogFactor = smoothstep(u_FogNear, u_FogFar, depth); #endif gl_FragColor.rgb = mix(gl_FragColor.rgb, u_FogColor, fogFactor); #endif ================================================ FILE: src/shaders/shaderChunk/fog_pars_frag.glsl ================================================ #ifdef USE_FOG uniform vec3 u_FogColor; #ifdef USE_EXP2_FOG uniform float u_FogDensity; #else uniform float u_FogNear; uniform float u_FogFar; #endif #endif ================================================ FILE: src/shaders/shaderChunk/inverse.glsl ================================================ mat4 inverseMat4(mat4 m) { float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3], a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3], a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3], a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3], b00 = a00 * a11 - a01 * a10, b01 = a00 * a12 - a02 * a10, b02 = a00 * a13 - a03 * a10, b03 = a01 * a12 - a02 * a11, b04 = a01 * a13 - a03 * a11, b05 = a02 * a13 - a03 * a12, b06 = a20 * a31 - a21 * a30, b07 = a20 * a32 - a22 * a30, b08 = a20 * a33 - a23 * a30, b09 = a21 * a32 - a22 * a31, b10 = a21 * a33 - a23 * a31, b11 = a22 * a33 - a23 * a32, det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; return mat4( a11 * b11 - a12 * b10 + a13 * b09, a02 * b10 - a01 * b11 - a03 * b09, a31 * b05 - a32 * b04 + a33 * b03, a22 * b04 - a21 * b05 - a23 * b03, a12 * b08 - a10 * b11 - a13 * b07, a00 * b11 - a02 * b08 + a03 * b07, a32 * b02 - a30 * b05 - a33 * b01, a20 * b05 - a22 * b02 + a23 * b01, a10 * b10 - a11 * b08 + a13 * b06, a01 * b08 - a00 * b10 - a03 * b06, a30 * b04 - a31 * b02 + a33 * b00, a21 * b02 - a20 * b04 - a23 * b00, a11 * b07 - a10 * b09 - a12 * b06, a00 * b09 - a01 * b07 + a02 * b06, a31 * b01 - a30 * b03 - a32 * b00, a20 * b03 - a21 * b01 + a22 * b00) / det; } ================================================ FILE: src/shaders/shaderChunk/light_frag.glsl ================================================ // Use v_modelPos from modelPos_pars_frag // Use geometryNormal, N from normal_frag #if (defined(USE_PHONG) || defined(USE_PBR)) vec3 V = normalize(u_CameraPosition - v_modelPos); #endif #ifdef USE_PBR #ifdef USE_PBR2 vec3 diffuseColor = outColor.xyz; vec3 specularColor = specularFactor.xyz; float roughness = max(1.0 - glossinessFactor, 0.0525); #else vec3 diffuseColor = outColor.xyz * (1.0 - metalnessFactor); vec3 specularColor = mix(vec3(0.04), outColor.xyz, metalnessFactor); float roughness = max(roughnessFactor, 0.0525); #endif vec3 dxy = max(abs(dFdx(geometryNormal)), abs(dFdy(geometryNormal))); float geometryRoughness = max(max(dxy.x, dxy.y), dxy.z); roughness += geometryRoughness; roughness = min(roughness, 1.0); #ifdef USE_CLEARCOAT float clearcoat = u_Clearcoat; float clearcoatRoughness = u_ClearcoatRoughness; #ifdef USE_CLEARCOATMAP clearcoat *= texture2D(clearcoatMap, v_Uv).x; #endif #ifdef USE_CLEARCOAT_ROUGHNESSMAP clearcoatRoughness *= texture2D(clearcoatRoughnessMap, v_Uv).y; #endif clearcoat = saturate(clearcoat); clearcoatRoughness = max(clearcoatRoughness, 0.0525); clearcoatRoughness += geometryRoughness; clearcoatRoughness = min(clearcoatRoughness, 1.0); #endif #else vec3 diffuseColor = outColor.xyz; #ifdef USE_PHONG vec3 specularColor = u_SpecularColor.xyz; float shininess = u_Specular; #endif #endif vec3 L; float falloff; float dotNL; vec3 irradiance; float clearcoatDHR; #ifdef USE_CLEARCOAT float ccDotNL; vec3 ccIrradiance; #endif #if NUM_DIR_LIGHTS > 0 #pragma unroll_loop_start for (int i = 0; i < NUM_DIR_LIGHTS; i++) { L = normalize(-u_Directional[i].direction); falloff = 1.0; #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_DIR_SHADOWS) #ifdef USE_PCSS_SOFT_SHADOW falloff *= getShadowWithPCSS(directionalDepthMap[i], directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams); #else falloff *= getShadow(directionalShadowMap[i], vDirectionalShadowCoord[i], u_DirectionalShadow[i].shadowMapSize, u_DirectionalShadow[i].shadowBias, u_DirectionalShadow[i].shadowParams); #endif #endif dotNL = saturate(dot(N, L)); irradiance = u_Directional[i].color * falloff * dotNL * PI; #ifdef USE_CLEARCOAT ccDotNL = saturate(dot(clearcoatNormal, L)); ccIrradiance = ccDotNL * u_Directional[i].color * falloff * PI; clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL); reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness); #else clearcoatDHR = 0.0; #endif reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor); #ifdef USE_PHONG reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength; #endif #ifdef USE_PBR reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness); #endif } #pragma unroll_loop_end #endif #if NUM_POINT_LIGHTS > 0 vec3 worldV; #pragma unroll_loop_start for (int i = 0; i < NUM_POINT_LIGHTS; i++) { worldV = v_modelPos - u_Point[i].position; L = -worldV; falloff = pow(clamp(1. - length(L) / u_Point[i].distance, 0.0, 1.0), u_Point[i].decay); L = normalize(L); #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_POINT_SHADOWS) falloff *= getPointShadow(pointShadowMap[i], vPointShadowCoord[i], u_PointShadow[i].shadowMapSize, u_PointShadow[i].shadowBias, u_PointShadow[i].shadowParams, u_PointShadow[i].shadowCameraRange); #endif dotNL = saturate(dot(N, L)); irradiance = u_Point[i].color * falloff * dotNL * PI; #ifdef USE_CLEARCOAT ccDotNL = saturate(dot(clearcoatNormal, L)); ccIrradiance = ccDotNL * u_Point[i].color * falloff * PI; clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL); reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness); #else clearcoatDHR = 0.0; #endif reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor); #ifdef USE_PHONG reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength; #endif #ifdef USE_PBR reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness); #endif } #pragma unroll_loop_end #endif #if NUM_SPOT_LIGHTS > 0 float lightDistance; float angleCos; #pragma unroll_loop_start for (int i = 0; i < NUM_SPOT_LIGHTS; i++) { L = u_Spot[i].position - v_modelPos; lightDistance = length(L); L = normalize(L); angleCos = dot(L, -normalize(u_Spot[i].direction)); falloff = smoothstep(u_Spot[i].coneCos, u_Spot[i].penumbraCos, angleCos); falloff *= pow(clamp(1. - lightDistance / u_Spot[i].distance, 0.0, 1.0), u_Spot[i].decay); #if defined(USE_SHADOW) && (UNROLLED_LOOP_INDEX < NUM_SPOT_SHADOWS) #ifdef USE_PCSS_SOFT_SHADOW falloff *= getShadowWithPCSS(spotDepthMap[i], spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams); #else falloff *= getShadow(spotShadowMap[i], vSpotShadowCoord[i], u_SpotShadow[i].shadowMapSize, u_SpotShadow[i].shadowBias, u_SpotShadow[i].shadowParams); #endif #endif dotNL = saturate(dot(N, L)); irradiance = u_Spot[i].color * falloff * dotNL * PI; #ifdef USE_CLEARCOAT ccDotNL = saturate(dot(clearcoatNormal, L)); ccIrradiance = ccDotNL * u_Spot[i].color * falloff * PI; clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL); reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness); #else clearcoatDHR = 0.0; #endif reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor); #ifdef USE_PHONG reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength; #endif #ifdef USE_PBR reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness); #endif } #pragma unroll_loop_end #endif #if NUM_RECT_AREA_LIGHTS > 0 vec3 RectAreaLightDirectSpecular; vec3 RectAreaLightDirectDiffuse; vec3 rectCoords[4]; #pragma unroll_loop_start for (int i = 0; i < NUM_RECT_AREA_LIGHTS; i++) { LTC_RectCoords(u_RectArea[i].position, u_RectArea[i].halfWidth, u_RectArea[i].halfHeight, rectCoords); reflectedLight.directDiffuse += u_RectArea[i].color * LTC_Diffuse(diffuseColor, N, V, v_modelPos, rectCoords); #ifdef USE_PBR reflectedLight.directSpecular += u_RectArea[i].color * LTC_Specular(specularColor, N, V, v_modelPos, rectCoords, roughness); #endif } #pragma unroll_loop_end #endif #ifdef USE_CLUSTERED_LIGHTS vec4 positionView = u_View * vec4(v_modelPos, 1.0); float perspectiveFactor = step(0.0, cellsTransformFactors.z); float halfFrustumHeight = -cellsTransformFactors.z * mix(1.0, positionView.z, perspectiveFactor); float halfFrustumWidth = halfFrustumHeight * cellsTransformFactors.w; vec3 cellCoords; cellCoords.z = floor(log(-positionView.z) * cellsTransformFactors.x + cellsTransformFactors.y); cellCoords.y = floor((positionView.y / (2.0 * halfFrustumHeight) + 0.5) * cells.y); cellCoords.x = floor((positionView.x / (2.0 * halfFrustumWidth) + 0.5) * cells.x); if(!(any(lessThan(cellCoords, vec3(0.0))) || any(greaterThanEqual(cellCoords, cells)))) { float cellIndex = dot(cellsDotData, cellCoords); float clusterV = floor(cellIndex * cellsTextureSize.y); float clusterU = cellIndex - (clusterV * cellsTextureSize.x); int size = textureSize(lightsTexture, 0).x; ClusteredPointLight clusteredPointLight; ClusteredSpotLight clusteredSpotLight; vec3 clusteredLightColor; float clusteredLightDistance; float clusteredAngleCos; for (int lightCellIndex = 0; lightCellIndex < maxLightsPerCell; lightCellIndex++) { float lightIndex = texelFetch(cellsTexture, ivec2(int(clusterU) + lightCellIndex, clusterV), 0).x; if (lightIndex <= 0.0) break; int lightOffset = int(lightIndex - 1.) * 4; ivec2 lightDataCoords = ivec2(lightOffset % size, lightOffset / size); vec4 lightData0 = texelFetch(lightsTexture, lightDataCoords, 0); if (lightData0.x == 1.0) { getPointLightFromTexture(lightDataCoords, lightData0, clusteredPointLight); L = clusteredPointLight.position - v_modelPos; clusteredLightDistance = length(L); L = normalize(L); falloff = pow(clamp(1. - clusteredLightDistance / clusteredPointLight.distance, 0.0, 1.0), clusteredPointLight.decay); clusteredLightColor = clusteredPointLight.color; } else if (lightData0.x == 2.0) { getSpotLightFromTexture(lightDataCoords, lightData0, clusteredSpotLight); L = clusteredSpotLight.position - v_modelPos; clusteredLightDistance = length(L); L = normalize(L); clusteredAngleCos = dot(L, -normalize(clusteredSpotLight.direction)); falloff = smoothstep(clusteredSpotLight.coneCos, clusteredSpotLight.penumbraCos, clusteredAngleCos); falloff *= pow(clamp(1. - clusteredLightDistance / clusteredSpotLight.distance, 0.0, 1.0), clusteredSpotLight.decay); clusteredLightColor = clusteredSpotLight.color; } dotNL = saturate(dot(N, L)); irradiance = clusteredLightColor * falloff * dotNL * PI; #ifdef USE_CLEARCOAT ccDotNL = saturate(dot(clearcoatNormal, L)); ccIrradiance = ccDotNL * clusteredLightColor * falloff * PI; clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL); reflectedLight.directSpecular += ccIrradiance * clearcoat * BRDF_Specular_GGX(specularColor, clearcoatNormal, L, V, clearcoatRoughness); #else clearcoatDHR = 0.0; #endif reflectedLight.directDiffuse += (1.0 - clearcoatDHR) * irradiance * BRDF_Diffuse_Lambert(diffuseColor); #ifdef USE_PHONG reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong(specularColor, N, L, V, shininess) * specularStrength; #endif #ifdef USE_PBR reflectedLight.directSpecular += (1.0 - clearcoatDHR) * irradiance * BRDF_Specular_GGX(specularColor, N, L, V, roughness); #endif } } #endif vec3 indirectIrradiance = vec3(0., 0., 0.); #ifdef USE_AMBIENT_LIGHT indirectIrradiance += u_AmbientLightColor * PI; #endif #ifdef USE_SPHERICALHARMONICS_LIGHT indirectIrradiance += getLightProbeIrradiance(u_SphericalHarmonicsLightData, N); #endif #if NUM_HEMI_LIGHTS > 0 float hemiDiffuseWeight; #pragma unroll_loop_start for (int i = 0; i < NUM_HEMI_LIGHTS; i++) { L = normalize(u_Hemi[i].direction); dotNL = dot(N, L); hemiDiffuseWeight = 0.5 * dotNL + 0.5; indirectIrradiance += mix(u_Hemi[i].groundColor, u_Hemi[i].skyColor, hemiDiffuseWeight) * PI; } #pragma unroll_loop_end #endif reflectedLight.indirectDiffuse += indirectIrradiance * BRDF_Diffuse_Lambert(diffuseColor); // TODO light map #if defined(USE_ENV_MAP) && defined(USE_PBR) vec3 iblIrradiance = vec3(0., 0., 0.); vec3 indirectRadiance = vec3(0., 0., 0.); vec3 clearcoatRadiance = vec3(0., 0., 0.); vec3 envDir; #ifdef USE_VERTEX_ENVDIR envDir = v_EnvDir; #else envDir = reflect(normalize(v_modelPos - u_CameraPosition), N); #endif iblIrradiance += getLightProbeIndirectIrradiance(maxMipLevel, N); indirectRadiance += getLightProbeIndirectRadiance(roughness, maxMipLevel, N, envDir); #ifdef USE_CLEARCOAT vec3 clearcoatDir = reflect(normalize(v_modelPos - u_CameraPosition), clearcoatNormal); clearcoatRadiance += getLightProbeIndirectRadiance(clearcoatRoughness, maxMipLevel, clearcoatNormal, clearcoatDir); #endif // reflectedLight.indirectSpecular += indirectRadiance * BRDF_Specular_GGX_Environment(N, V, specularColor, roughness); #ifdef USE_CLEARCOAT float ccDotNV = saturate(dot(clearcoatNormal, V)); reflectedLight.indirectSpecular += clearcoatRadiance * clearcoat * BRDF_Specular_GGX_Environment(clearcoatNormal, V, specularColor, clearcoatRoughness); ccDotNL = ccDotNV; clearcoatDHR = clearcoat * clearcoatDHRApprox(clearcoatRoughness, ccDotNL); #else clearcoatDHR = 0.0; #endif float clearcoatInv = 1.0 - clearcoatDHR; // Both indirect specular and indirect diffuse light accumulate here vec3 singleScattering = vec3(0.0); vec3 multiScattering = vec3(0.0); vec3 cosineWeightedIrradiance = iblIrradiance * RECIPROCAL_PI; BRDF_Specular_Multiscattering_Environment(N, V, specularColor, roughness, singleScattering, multiScattering); vec3 diffuse = diffuseColor * (1.0 - (singleScattering + multiScattering)); reflectedLight.indirectSpecular += clearcoatInv * indirectRadiance * singleScattering; reflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance; reflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance; #endif ================================================ FILE: src/shaders/shaderChunk/light_pars_frag.glsl ================================================ #ifdef USE_AMBIENT_LIGHT uniform vec3 u_AmbientLightColor; #endif #ifdef USE_SPHERICALHARMONICS_LIGHT uniform vec3 u_SphericalHarmonicsLightData[9]; #endif #ifdef USE_CLEARCOAT // Clear coat directional hemishperical reflectance (this approximation should be improved) float clearcoatDHRApprox(const in float roughness, const in float dotNL) { return 0.04 + (1.0 - 0.16) * (pow(1.0 - dotNL, 5.0) * pow(1.0 - roughness, 2.0)); } #endif #if NUM_HEMI_LIGHTS > 0 struct HemisphereLight { vec3 direction; vec3 skyColor; vec3 groundColor; }; uniform HemisphereLight u_Hemi[NUM_HEMI_LIGHTS]; #endif #if NUM_DIR_LIGHTS > 0 struct DirectLight { vec3 direction; vec3 color; }; uniform DirectLight u_Directional[NUM_DIR_LIGHTS]; #endif #if NUM_POINT_LIGHTS > 0 struct PointLight { vec3 position; vec3 color; float distance; float decay; }; uniform PointLight u_Point[NUM_POINT_LIGHTS]; #endif #if NUM_SPOT_LIGHTS > 0 struct SpotLight { vec3 position; vec3 color; float distance; float decay; float coneCos; float penumbraCos; vec3 direction; }; uniform SpotLight u_Spot[NUM_SPOT_LIGHTS]; #endif #if NUM_RECT_AREA_LIGHTS > 0 struct RectAreaLight { vec3 position; vec3 color; vec3 halfWidth; vec3 halfHeight; }; uniform RectAreaLight u_RectArea[NUM_RECT_AREA_LIGHTS]; // Pre-computed values of LinearTransformedCosine approximation of BRDF // BRDF approximation Texture is 64x64 uniform sampler2D ltc_1; // RGBA Float uniform sampler2D ltc_2; // RGBA Float void LTC_RectCoords(const in vec3 lightPos, const in vec3 halfWidth, const in vec3 halfHeight, inout vec3 rectCoords[4]) { rectCoords[0] = lightPos + halfWidth - halfHeight; // counterclockwise; light shines in local neg z direction rectCoords[1] = lightPos - halfWidth - halfHeight; rectCoords[2] = lightPos - halfWidth + halfHeight; rectCoords[3] = lightPos + halfWidth + halfHeight; } vec2 LTC_Uv(const in vec3 N, const in vec3 V, const in float roughness) { const float LUT_SIZE = 64.0; const float LUT_SCALE = (LUT_SIZE - 1.0) / LUT_SIZE; const float LUT_BIAS = 0.5 / LUT_SIZE; float dotNV = saturate(dot(N, V)); // texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) ) vec2 uv = vec2(roughness, sqrt(1.0 - dotNV)); uv = uv * LUT_SCALE + LUT_BIAS; return uv; } vec3 LTC_EdgeVectorFormFactor(const in vec3 v1, const in vec3 v2) { float x = dot(v1, v2); float y = abs(x); // rational polynomial approximation to theta / sin( theta ) / 2PI float a = 0.8543985 + (0.4965155 + 0.0145206 * y) * y; float b = 3.4175940 + (4.1616724 + y) * y; float v = a / b; float theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt(max(1.0 - x * x, 1e-7)) - v; return cross(v1, v2) * theta_sintheta; } float LTC_ClippedSphereFormFactor(const in vec3 f) { // Real-Time Area Lighting: a Journey from Research to Production (p.102) // An approximation of the form factor of a horizon-clipped rectangle. float l = length(f); return max((l * l + f.z) / (l + 1.0), 0.0); } vec3 LTC_Evaluate(const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[4]) { // bail if point is on back side of plane of light // assumes ccw winding order of light vertices vec3 v1 = rectCoords[1] - rectCoords[0]; vec3 v2 = rectCoords[3] - rectCoords[0]; vec3 lightNormal = cross(v1, v2); if(dot(lightNormal, P - rectCoords[0]) < 0.0) return vec3(0.0); // construct orthonormal basis around N vec3 T1, T2; T1 = normalize(V - N * dot(V, N)); T2 = - cross(N, T1); // negated from paper; possibly due to a different handedness of world coordinate system // compute transform mat3 mat = mInv * mat3( T1.x, T2.x, N.x, T1.y, T2.y, N.y, T1.z, T2.z, N.z ); // transform rect vec3 coords[4]; coords[0] = mat * (rectCoords[0] - P); coords[1] = mat * (rectCoords[1] - P); coords[2] = mat * (rectCoords[2] - P); coords[3] = mat * (rectCoords[3] - P); // project rect onto sphere coords[0] = normalize(coords[0]); coords[1] = normalize(coords[1]); coords[2] = normalize(coords[2]); coords[3] = normalize(coords[3]); // calculate vector form factor vec3 vectorFormFactor = vec3(0.0); vectorFormFactor += LTC_EdgeVectorFormFactor(coords[0], coords[1]); vectorFormFactor += LTC_EdgeVectorFormFactor(coords[1], coords[2]); vectorFormFactor += LTC_EdgeVectorFormFactor(coords[2], coords[3]); vectorFormFactor += LTC_EdgeVectorFormFactor(coords[3], coords[0]); // adjust for horizon clipping float result = LTC_ClippedSphereFormFactor(vectorFormFactor); return vec3(result); } vec3 LTC_Diffuse(const in vec3 diffuseColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4]) { return diffuseColor * LTC_Evaluate(N, V, P, mat3(1.0), rectCoords); } vec3 LTC_Specular(const in vec3 specularColor, const in vec3 N, const in vec3 V, const in vec3 P, const in vec3 rectCoords[4], const in float roughness) { vec2 ltc_uv = LTC_Uv(N, V, roughness); vec4 t1 = texture2D(ltc_1, ltc_uv); vec4 t2 = texture2D(ltc_2, ltc_uv); mat3 mInv = mat3( vec3(t1.x, 0, t1.y), vec3(0, 1, 0), vec3(t1.z, 0, t1.w) ); // LTC Fresnel Approximation by Stephen Hill // http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf vec3 fresnel = (specularColor * t2.x + (vec3(1.0) - specularColor) * t2.y); return fresnel * LTC_Evaluate(N, V, P, mInv, rectCoords); } #endif #if defined(USE_PBR) && defined(USE_ENV_MAP) vec3 getLightProbeIndirectIrradiance(const in int maxMIPLevel, const in vec3 N) { // TODO: replace with properly filtered cubemaps and access the irradiance LOD level, be it the last LOD level // of a specular cubemap, or just the default level of a specially created irradiance cubemap. vec3 coordVec = vec3(envMapParams.z * N.x, N.yz); #ifdef TEXTURE_LOD_EXT vec4 envMapColor = textureCubeLodEXT(envMap, coordVec, float(maxMIPLevel)); #else // force the bias high to get the last LOD level as it is the most blurred. vec4 envMapColor = textureCube(envMap, coordVec, float(maxMIPLevel)); #endif envMapColor = envMapTexelToLinear(envMapColor); return PI * envMapColor.rgb * envMapParams.x; } // Trowbridge-Reitz distribution to Mip level, following the logic of http://casual-effects.blogspot.ca/2011/08/plausible-environment-lighting-in-two.html float getSpecularMIPLevel(const in float roughness, const in int maxMIPLevel) { float maxMIPLevelScalar = float(maxMIPLevel); float sigma = PI * roughness * roughness / (1.0 + roughness); float desiredMIPLevel = maxMIPLevelScalar + log2(sigma); // clamp to allowable LOD ranges. return clamp(desiredMIPLevel, 0.0, maxMIPLevelScalar); } vec3 getLightProbeIndirectRadiance(const in float roughness, const in int maxMIPLevel, const in vec3 normal, const in vec3 envDir) { float specularMIPLevel = getSpecularMIPLevel(roughness, maxMIPLevel); // Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane. vec3 coordVec = normalize(mix(envDir, normal, roughness * roughness)); coordVec.x *= envMapParams.z; #ifdef TEXTURE_LOD_EXT vec4 envMapColor = textureCubeLodEXT(envMap, coordVec, specularMIPLevel); #else vec4 envMapColor = textureCube(envMap, coordVec, specularMIPLevel); #endif envMapColor = envMapTexelToLinear(envMapColor); return envMapColor.rgb * envMapParams.y; } // ref: https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf float computeSpecularOcclusion(const in float dotNV, const in float ambientOcclusion, const in float roughness) { return saturate(pow(dotNV + ambientOcclusion, exp2(-16.0 * roughness - 1.0)) - 1.0 + ambientOcclusion); } #endif #ifdef USE_SPHERICALHARMONICS_LIGHT vec3 shGetIrradianceAt(in vec3 normal, in vec3 shCoefficients[9]) { float x = normal.x, y = normal.y, z = normal.z; vec3 result = shCoefficients[0] * 0.886227; result += shCoefficients[1] * 2.0 * 0.511664 * y; result += shCoefficients[2] * 2.0 * 0.511664 * z; result += shCoefficients[3] * 2.0 * 0.511664 * x; result += shCoefficients[4] * 2.0 * 0.429043 * x * y; result += shCoefficients[5] * 2.0 * 0.429043 * y * z; result += shCoefficients[6] * (0.743125 * z * z - 0.247708); result += shCoefficients[7] * 2.0 * 0.429043 * x * z; result += shCoefficients[8] * 0.429043 * (x * x - y * y); return result; } vec3 getLightProbeIrradiance(const in vec3 lightProbe[9], const in vec3 normal) { vec3 irradiance = shGetIrradianceAt(normal, lightProbe); return irradiance; } #endif #ifdef USE_CLUSTERED_LIGHTS uniform vec3 cells; uniform int maxLightsPerCell; uniform vec3 cellsDotData; uniform vec3 cellsTextureSize; uniform vec4 cellsTransformFactors; uniform sampler2D cellsTexture; uniform sampler2D lightsTexture; struct ClusteredPointLight { vec3 position; vec3 color; float distance; float decay; }; struct ClusteredSpotLight { vec3 position; vec3 color; float distance; float decay; vec3 direction; float coneCos; float penumbraCos; }; void getPointLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredPointLight pointLight) { vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0); vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0); pointLight.color = lightData1.xyz; pointLight.decay = lightData1.w; pointLight.position = lightData2.xyz; pointLight.distance = lightData2.w; } void getSpotLightFromTexture(ivec2 lightDataCoords, vec4 lightData0, inout ClusteredSpotLight spotLight) { vec4 lightData1 = texelFetch(lightsTexture, lightDataCoords + ivec2(1, 0), 0); vec4 lightData2 = texelFetch(lightsTexture, lightDataCoords + ivec2(2, 0), 0); vec4 lightData3 = texelFetch(lightsTexture, lightDataCoords + ivec2(3, 0), 0); spotLight.color = lightData1.xyz; spotLight.decay = lightData1.w; spotLight.position = lightData2.xyz; spotLight.distance = lightData2.w; spotLight.direction = lightData3.xyz; spotLight.coneCos = lightData3.w; spotLight.penumbraCos = lightData0.y; } #endif ================================================ FILE: src/shaders/shaderChunk/logdepthbuf_frag.glsl ================================================ #if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) // Doing a strict comparison with == 1.0 can cause noise artifacts // on some platforms. gl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; #endif ================================================ FILE: src/shaders/shaderChunk/logdepthbuf_pars_frag.glsl ================================================ #if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT ) uniform float logDepthBufFC; varying float vFragDepth; varying float vIsPerspective; #endif ================================================ FILE: src/shaders/shaderChunk/logdepthbuf_pars_vert.glsl ================================================ #ifdef USE_LOGDEPTHBUF #ifdef USE_LOGDEPTHBUF_EXT uniform float logDepthCameraNear; varying float vFragDepth; varying float vIsPerspective; #else uniform float logDepthBufFC; uniform float logDepthCameraNear; #endif #endif ================================================ FILE: src/shaders/shaderChunk/logdepthbuf_vert.glsl ================================================ #ifdef USE_LOGDEPTHBUF #ifdef USE_LOGDEPTHBUF_EXT vFragDepth = 1.0 + gl_Position.w - logDepthCameraNear; vIsPerspective = float( isPerspectiveMatrix( u_Projection ) ); #else if ( isPerspectiveMatrix( u_Projection ) ) { gl_Position.z = log2( max( EPSILON, gl_Position.w - logDepthCameraNear + 1.0 ) ) * logDepthBufFC - 1.0; gl_Position.z *= gl_Position.w; } #endif #endif ================================================ FILE: src/shaders/shaderChunk/modelPos_pars_frag.glsl ================================================ varying vec3 v_modelPos; ================================================ FILE: src/shaders/shaderChunk/modelPos_pars_vert.glsl ================================================ varying vec3 v_modelPos; ================================================ FILE: src/shaders/shaderChunk/modelPos_vert.glsl ================================================ // Use worldPosition from pvm_vert v_modelPos = worldPosition.xyz; ================================================ FILE: src/shaders/shaderChunk/morphnormal_vert.glsl ================================================ #ifdef USE_MORPHNORMALS objectNormal += morphNormal0 * morphTargetInfluences[ 0 ]; objectNormal += morphNormal1 * morphTargetInfluences[ 1 ]; objectNormal += morphNormal2 * morphTargetInfluences[ 2 ]; objectNormal += morphNormal3 * morphTargetInfluences[ 3 ]; #endif ================================================ FILE: src/shaders/shaderChunk/morphtarget_pars_vert.glsl ================================================ #ifdef USE_MORPHTARGETS #ifndef USE_MORPHNORMALS uniform float morphTargetInfluences[ 8 ]; #else uniform float morphTargetInfluences[ 4 ]; #endif #endif ================================================ FILE: src/shaders/shaderChunk/morphtarget_vert.glsl ================================================ #ifdef USE_MORPHTARGETS transformed += morphTarget0 * morphTargetInfluences[ 0 ]; transformed += morphTarget1 * morphTargetInfluences[ 1 ]; transformed += morphTarget2 * morphTargetInfluences[ 2 ]; transformed += morphTarget3 * morphTargetInfluences[ 3 ]; #ifndef USE_MORPHNORMALS transformed += morphTarget4 * morphTargetInfluences[ 4 ]; transformed += morphTarget5 * morphTargetInfluences[ 5 ]; transformed += morphTarget6 * morphTargetInfluences[ 6 ]; transformed += morphTarget7 * morphTargetInfluences[ 7 ]; #endif #endif ================================================ FILE: src/shaders/shaderChunk/normalMap_pars_frag.glsl ================================================ #ifdef USE_NORMAL_MAP uniform sampler2D normalMap; uniform vec2 normalScale; #endif #if defined(USE_NORMAL_MAP) || defined(USE_CLEARCOAT_NORMALMAP) #if defined(USE_TANGENT) && !defined(FLAT_SHADED) #define USE_TBN #else #include #endif #endif ================================================ FILE: src/shaders/shaderChunk/normal_frag.glsl ================================================ // Use v_modelPos from modelPos_pars_frag #ifdef FLAT_SHADED vec3 fdx = dFdx(v_modelPos); vec3 fdy = dFdy(v_modelPos); vec3 N = normalize(cross(fdx, fdy)); #else vec3 N = normalize(v_Normal); #ifdef DOUBLE_SIDED N = N * (float(gl_FrontFacing) * 2.0 - 1.0); #endif #endif #ifdef USE_TBN vec3 tangent = normalize(v_Tangent); vec3 bitangent = normalize(v_Bitangent); #ifdef DOUBLE_SIDED tangent = tangent * (float(gl_FrontFacing) * 2.0 - 1.0); bitangent = bitangent * (float(gl_FrontFacing) * 2.0 - 1.0); #endif mat3 tspace = mat3(tangent, bitangent, N); #endif // non perturbed normal vec3 geometryNormal = N; #ifdef USE_NORMAL_MAP vec3 mapN = texture2D(normalMap, v_Uv).rgb * 2.0 - 1.0; mapN.xy *= normalScale; #ifdef USE_TBN N = normalize(tspace * mapN); #else mapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0); N = normalize(tsn(N, v_modelPos, v_Uv) * mapN); #endif #elif defined(USE_BUMPMAP) N = perturbNormalArb(v_modelPos, N, dHdxy_fwd(v_Uv)); #endif #ifdef USE_CLEARCOAT vec3 clearcoatNormal = geometryNormal; #endif #ifdef USE_CLEARCOAT_NORMALMAP vec3 clearcoatMapN = texture2D(clearcoatNormalMap, v_Uv).xyz * 2.0 - 1.0; clearcoatMapN.xy *= clearcoatNormalScale; #ifdef USE_TBN clearcoatNormal = normalize(tspace * clearcoatMapN); #else clearcoatMapN.xy *= (float(gl_FrontFacing) * 2.0 - 1.0); clearcoatNormal = normalize(tsn(clearcoatNormal, v_modelPos, v_Uv) * clearcoatMapN); #endif #endif ================================================ FILE: src/shaders/shaderChunk/normal_pars_frag.glsl ================================================ #ifndef FLAT_SHADED varying vec3 v_Normal; #ifdef USE_TANGENT varying vec3 v_Tangent; varying vec3 v_Bitangent; #endif #endif ================================================ FILE: src/shaders/shaderChunk/normal_pars_vert.glsl ================================================ #ifndef FLAT_SHADED varying vec3 v_Normal; #ifdef USE_TANGENT varying vec3 v_Tangent; varying vec3 v_Bitangent; #endif #endif ================================================ FILE: src/shaders/shaderChunk/normal_vert.glsl ================================================ #ifndef FLAT_SHADED v_Normal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz; #ifdef FLIP_SIDED v_Normal = - v_Normal; #endif #ifdef USE_TANGENT v_Tangent = (transposeMat4(inverseMat4(u_Model)) * vec4(objectTangent, 0.0)).xyz; #ifdef FLIP_SIDED v_Tangent = - v_Tangent; #endif v_Bitangent = normalize(cross(v_Normal, v_Tangent) * a_Tangent.w); #endif #endif ================================================ FILE: src/shaders/shaderChunk/packing.glsl ================================================ const float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1) const float UnpackDownscale = 255. / 256.; // 0..1 -> fraction (excluding 1) const vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. ); const vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. ); const float ShiftRight8 = 1. / 256.; vec4 packDepthToRGBA( const in float v ) { vec4 r = vec4( fract( v * PackFactors ), v ); r.yzw -= r.xyz * ShiftRight8; // tidy overflow return r * PackUpscale; } float unpackRGBAToDepth( const in vec4 v ) { return dot( v, UnpackFactors ); } ================================================ FILE: src/shaders/shaderChunk/premultipliedAlpha_frag.glsl ================================================ #ifdef USE_PREMULTIPLIED_ALPHA gl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a; #endif ================================================ FILE: src/shaders/shaderChunk/pvm_vert.glsl ================================================ vec4 worldPosition = u_Model * vec4(transformed, 1.0); gl_Position = u_ProjectionView * worldPosition; ================================================ FILE: src/shaders/shaderChunk/shadow.glsl ================================================ #ifdef USE_SHADOW_SAMPLER float computeShadow(sampler2DShadow shadowMap, vec3 shadowCoord) { return texture2D( shadowMap, shadowCoord ); } #else float computeShadow(sampler2D shadowMap, vec3 shadowCoord) { return step(shadowCoord.z, unpackRGBAToDepth(texture2D(shadowMap, shadowCoord.xy))); } #endif #ifdef USE_POISSON_SOFT_SHADOW float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) { float texelSize = shadowParams.x * 0.5 * shadowMapSizeAndInverse.y; vec3 poissonDisk[4]; poissonDisk[0] = vec3(-0.94201624, -0.39906216, 0); poissonDisk[1] = vec3(0.94558609, -0.76890725, 0); poissonDisk[2] = vec3(-0.094184101, -0.92938870, 0); poissonDisk[3] = vec3(0.34495938, 0.29387760, 0); return computeShadow(shadowMap, shadowCoord + poissonDisk[0] * texelSize) * 0.25 + computeShadow(shadowMap, shadowCoord + poissonDisk[1] * texelSize) * 0.25 + computeShadow(shadowMap, shadowCoord + poissonDisk[2] * texelSize) * 0.25 + computeShadow(shadowMap, shadowCoord + poissonDisk[3] * texelSize) * 0.25; } #elif defined(USE_VOGEL5_SOFT_SHADOW) float interleavedGradientNoise(vec2 position) { return fract(52.9829189 * fract(dot(position, vec2(0.06711056, 0.00583715)))); } vec2 vogelDiskSample(int sampleIndex, int samplesCount, float phi) { const float goldenAngle = 2.399963229728653; float r = sqrt((float(sampleIndex) + 0.5) / float(samplesCount)); float theta = float(sampleIndex) * goldenAngle + phi; return vec2(cos(theta), sin(theta)) * r; } float computeShadowWithPCF(sampler2DShadow shadowMap, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) { float radius = shadowParams.x * shadowMapSizeAndInverse.y; float phi = interleavedGradientNoise(gl_FragCoord.xy) * 6.28318530718; float shadow = 0.0; shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(0, 5, phi) * radius, shadowCoord.z)); shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(1, 5, phi) * radius, shadowCoord.z)); shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(2, 5, phi) * radius, shadowCoord.z)); shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(3, 5, phi) * radius, shadowCoord.z)); shadow += computeShadow(shadowMap, vec3(shadowCoord.xy + vogelDiskSample(4, 5, phi) * radius, shadowCoord.z)); return shadow * 0.2; } #elif defined(USE_PCF3_SOFT_SHADOW) // Shadow PCF kernel 3*3 in only 4 taps (medium quality) // This uses a well distributed taps to allow a gaussian distribution covering a 3*3 kernel // https://mynameismjp.wordpress.com/2013/09/10/shadow-maps/ float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) { vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x; // uv in texel units uv += 0.5; // offset of half to be in the center of the texel vec2 st = fract(uv); // how far from the center vec2 base_uv = floor(uv) - 0.5; // texel coord base_uv *= shadowMapSizeAndInverse.y; // move back to uv coords // Equation resolved to fit in a 3*3 distribution like // 1 2 1 // 2 4 2 // 1 2 1 vec2 uvw0 = 3. - 2. * st; vec2 uvw1 = 1. + 2. * st; vec2 u = vec2((2. - st.x) / uvw0.x - 1., st.x / uvw1.x + 1.) * shadowMapSizeAndInverse.y; vec2 v = vec2((2. - st.y) / uvw0.y - 1., st.y / uvw1.y + 1.) * shadowMapSizeAndInverse.y; float shadow = 0.; shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z)); shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z)); shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z)); shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z)); shadow = shadow / 16.; return shadow; } #elif defined(USE_PCF5_SOFT_SHADOW) // Shadow PCF kernel 5*5 in only 9 taps (high quality) // This uses a well distributed taps to allow a gaussian distribution covering a 5*5 kernel // https://mynameismjp.wordpress.com/2013/09/10/shadow-maps/ float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) { vec2 uv = shadowCoord.xy * shadowMapSizeAndInverse.x; // uv in texel units uv += 0.5; // offset of half to be in the center of the texel vec2 st = fract(uv); // how far from the center vec2 base_uv = floor(uv) - 0.5; // texel coord base_uv *= shadowMapSizeAndInverse.y; // move back to uv coords // Equation resolved to fit in a 5*5 distribution like // 1 2 4 2 1 vec2 uvw0 = 4. - 3. * st; vec2 uvw1 = vec2(7.); vec2 uvw2 = 1. + 3. * st; vec3 u = vec3((3. - 2. * st.x) / uvw0.x - 2., (3. + st.x) / uvw1.x, st.x / uvw2.x + 2.) * shadowMapSizeAndInverse.y; vec3 v = vec3((3. - 2. * st.y) / uvw0.y - 2., (3. + st.y) / uvw1.y, st.y / uvw2.y + 2.) * shadowMapSizeAndInverse.y; float shadow = 0.; shadow += uvw0.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[0]), shadowCoord.z)); shadow += uvw1.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[0]), shadowCoord.z)); shadow += uvw2.x * uvw0.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[0]), shadowCoord.z)); shadow += uvw0.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[1]), shadowCoord.z)); shadow += uvw1.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[1]), shadowCoord.z)); shadow += uvw2.x * uvw1.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[1]), shadowCoord.z)); shadow += uvw0.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[0], v[2]), shadowCoord.z)); shadow += uvw1.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[1], v[2]), shadowCoord.z)); shadow += uvw2.x * uvw2.y * computeShadow(shadowSampler, vec3(base_uv.xy + vec2(u[2], v[2]), shadowCoord.z)); shadow = shadow / 144.; return shadow; } #else // Shadow PCF kernel size 1 with a single tap (lowest quality) float computeShadowWithPCF(sampler2DShadow shadowSampler, vec3 shadowCoord, vec2 shadowMapSizeAndInverse, vec2 shadowParams) { return computeShadow(shadowSampler, shadowCoord); } #endif float computeFallOff(float value, vec2 clipSpace, float frustumEdgeFalloff) { float factor = mix(clipSpace.y * abs(clipSpace.y), dot(clipSpace, clipSpace), step(0., frustumEdgeFalloff)); float mask = smoothstep(1.0 - abs(frustumEdgeFalloff), 1.00000012, clamp(factor, 0., 1.)); return mix(value, 1.0, mask); } float getShadow(sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) { shadowCoord.xyz /= shadowCoord.w; shadowCoord.z += shadowBias.x; bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0); bool inFrustum = all(inFrustumVec); bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0); bool frustumTest = all(frustumTestVec); float shadow = 1.0; if (frustumTest) { vec2 shadowMapSizeAndInverse = vec2(shadowMapSize.x, 1. / shadowMapSize.x); shadow = computeShadowWithPCF(shadowMap, shadowCoord.xyz, shadowMapSizeAndInverse, shadowParams); shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y); } return shadow; } float textureCubeCompare(samplerCube depths, vec3 uv, float compare) { return step(compare, unpackRGBAToDepth(textureCube(depths, uv))); } float getPointShadow(samplerCube shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams, vec2 shadowCameraRange) { float shadow = 1.0; vec3 lightToPosition = shadowCoord.xyz; float lightToPositionLength = length(lightToPosition); if (lightToPositionLength - shadowCameraRange.y <= 0.0 && lightToPositionLength - shadowCameraRange.x >= 0.0) { // dp = normalized distance from light to fragment position float dp = (lightToPositionLength - shadowCameraRange.x) / (shadowCameraRange.y - shadowCameraRange.x); dp += shadowBias.x; // bd3D = base direction 3D vec3 bd3D = normalize(lightToPosition); #ifdef USE_HARD_SHADOW shadow = textureCubeCompare(shadowMap, bd3D, dp); #else float texelSize = shadowParams.x * 0.5 / shadowMapSize.x; vec2 offset = vec2(-1.0, 1.0) * texelSize; shadow = ( textureCubeCompare(shadowMap, bd3D + offset.xyy, dp) + textureCubeCompare(shadowMap, bd3D + offset.yyy, dp) + textureCubeCompare(shadowMap, bd3D + offset.xyx, dp) + textureCubeCompare(shadowMap, bd3D + offset.yyx, dp) + textureCubeCompare(shadowMap, bd3D, dp) + textureCubeCompare(shadowMap, bd3D + offset.xxy, dp) + textureCubeCompare(shadowMap, bd3D + offset.yxy, dp) + textureCubeCompare(shadowMap, bd3D + offset.xxx, dp) + textureCubeCompare(shadowMap, bd3D + offset.yxx, dp) ) * (1.0 / 9.0); #endif } return shadow; } #ifdef USE_PCSS_SOFT_SHADOW const vec3 PoissonSamplers32[64] = vec3[64]( vec3(0.06407013, 0.05409927, 0.), vec3(0.7366577, 0.5789394, 0.), vec3(-0.6270542, -0.5320278, 0.), vec3(-0.4096107, 0.8411095, 0.), vec3(0.6849564, -0.4990818, 0.), vec3(-0.874181, -0.04579735, 0.), vec3(0.9989998, 0.0009880066, 0.), vec3(-0.004920578, -0.9151649, 0.), vec3(0.1805763, 0.9747483, 0.), vec3(-0.2138451, 0.2635818, 0.), vec3(0.109845, 0.3884785, 0.), vec3(0.06876755, -0.3581074, 0.), vec3(0.374073, -0.7661266, 0.), vec3(0.3079132, -0.1216763, 0.), vec3(-0.3794335, -0.8271583, 0.), vec3(-0.203878, -0.07715034, 0.), vec3(0.5912697, 0.1469799, 0.), vec3(-0.88069, 0.3031784, 0.), vec3(0.5040108, 0.8283722, 0.), vec3(-0.5844124, 0.5494877, 0.), vec3(0.6017799, -0.1726654, 0.), vec3(-0.5554981, 0.1559997, 0.), vec3(-0.3016369, -0.3900928, 0.), vec3(-0.5550632, -0.1723762, 0.), vec3(0.925029, 0.2995041, 0.), vec3(-0.2473137, 0.5538505, 0.), vec3(0.9183037, -0.2862392, 0.), vec3(0.2469421, 0.6718712, 0.), vec3(0.3916397, -0.4328209, 0.), vec3(-0.03576927, -0.6220032, 0.), vec3(-0.04661255, 0.7995201, 0.), vec3(0.4402924, 0.3640312, 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.), vec3(0., 0., 0.) ); const vec3 PoissonSamplers64[64] = vec3[64]( vec3(-0.613392, 0.617481, 0.), vec3(0.170019, -0.040254, 0.), vec3(-0.299417, 0.791925, 0.), vec3(0.645680, 0.493210, 0.), vec3(-0.651784, 0.717887, 0.), vec3(0.421003, 0.027070, 0.), vec3(-0.817194, -0.271096, 0.), vec3(-0.705374, -0.668203, 0.), vec3(0.977050, -0.108615, 0.), vec3(0.063326, 0.142369, 0.), vec3(0.203528, 0.214331, 0.), vec3(-0.667531, 0.326090, 0.), vec3(-0.098422, -0.295755, 0.), vec3(-0.885922, 0.215369, 0.), vec3(0.566637, 0.605213, 0.), vec3(0.039766, -0.396100, 0.), vec3(0.751946, 0.453352, 0.), vec3(0.078707, -0.715323, 0.), vec3(-0.075838, -0.529344, 0.), vec3(0.724479, -0.580798, 0.), vec3(0.222999, -0.215125, 0.), vec3(-0.467574, -0.405438, 0.), vec3(-0.248268, -0.814753, 0.), vec3(0.354411, -0.887570, 0.), vec3(0.175817, 0.382366, 0.), vec3(0.487472, -0.063082, 0.), vec3(-0.084078, 0.898312, 0.), vec3(0.488876, -0.783441, 0.), vec3(0.470016, 0.217933, 0.), vec3(-0.696890, -0.549791, 0.), vec3(-0.149693, 0.605762, 0.), vec3(0.034211, 0.979980, 0.), vec3(0.503098, -0.308878, 0.), vec3(-0.016205, -0.872921, 0.), vec3(0.385784, -0.393902, 0.), vec3(-0.146886, -0.859249, 0.), vec3(0.643361, 0.164098, 0.), vec3(0.634388, -0.049471, 0.), vec3(-0.688894, 0.007843, 0.), vec3(0.464034, -0.188818, 0.), vec3(-0.440840, 0.137486, 0.), vec3(0.364483, 0.511704, 0.), vec3(0.034028, 0.325968, 0.), vec3(0.099094, -0.308023, 0.), vec3(0.693960, -0.366253, 0.), vec3(0.678884, -0.204688, 0.), vec3(0.001801, 0.780328, 0.), vec3(0.145177, -0.898984, 0.), vec3(0.062655, -0.611866, 0.), vec3(0.315226, -0.604297, 0.), vec3(-0.780145, 0.486251, 0.), vec3(-0.371868, 0.882138, 0.), vec3(0.200476, 0.494430, 0.), vec3(-0.494552, -0.711051, 0.), vec3(0.612476, 0.705252, 0.), vec3(-0.578845, -0.768792, 0.), vec3(-0.772454, -0.090976, 0.), vec3(0.504440, 0.372295, 0.), vec3(0.155736, 0.065157, 0.), vec3(0.391522, 0.849605, 0.), vec3(-0.620106, -0.328104, 0.), vec3(0.789239, -0.419965, 0.), vec3(-0.545396, 0.538133, 0.), vec3(-0.178564, -0.596057, 0.) ); // https://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl float getRand(vec2 seed) { return fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) * 43758.5453); } // PCSS // This helps to achieve a contact hardening effect on the shadow // It uses 16 Taps for search and a 32 PCF taps in a randomly rotating poisson sampling disc. // This is heavily inspired from http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf // and http://developer.download.nvidia.com/whitepapers/2008/PCSS_Integration.pdf float computeShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowSampler, vec3 shadowCoord, float shadowMapSizeInverse, float lightSizeUV, int searchTapCount, int pcfTapCount, vec3[64] poissonSamplers) { float depthMetric = shadowCoord.z; float blockerDepth = 0.0; float sumBlockerDepth = 0.0; float numBlocker = 0.0; for (int i = 0; i < searchTapCount; i++) { blockerDepth = unpackRGBAToDepth(texture(depthSampler, shadowCoord.xy + (lightSizeUV * shadowMapSizeInverse * PoissonSamplers32[i].xy))); if (blockerDepth < depthMetric) { sumBlockerDepth += blockerDepth; numBlocker++; } } if (numBlocker < 1.0) { return 1.0; } float avgBlockerDepth = sumBlockerDepth / numBlocker; // Offset preventing aliasing on contact. float AAOffset = shadowMapSizeInverse * 10.; // Do not dividing by z despite being physically incorrect looks better due to the limited kernel size. // float penumbraRatio = (depthMetric - avgBlockerDepth) / avgBlockerDepth; float penumbraRatio = ((depthMetric - avgBlockerDepth) + AAOffset); float filterRadius = penumbraRatio * lightSizeUV * shadowMapSizeInverse; float random = getRand(shadowCoord.xy);//getRand(vPositionFromLight.xy); float rotationAngle = random * 3.1415926; vec2 rotationVector = vec2(cos(rotationAngle), sin(rotationAngle)); float shadow = 0.; for (int i = 0; i < pcfTapCount; i++) { vec3 offset = poissonSamplers[i]; // Rotated offset. offset = vec3(offset.x * rotationVector.x - offset.y * rotationVector.y, offset.y * rotationVector.x + offset.x * rotationVector.y, 0.); shadow += texture(shadowSampler, shadowCoord + offset * filterRadius); } shadow /= float(pcfTapCount); // Blocker distance falloff shadow = mix(shadow, 1., depthMetric - avgBlockerDepth); return shadow; } float getShadowWithPCSS(sampler2D depthSampler, sampler2DShadow shadowMap, vec4 shadowCoord, vec2 shadowMapSize, vec2 shadowBias, vec2 shadowParams) { shadowCoord.xyz /= shadowCoord.w; shadowCoord.z += shadowBias.x; bvec4 inFrustumVec = bvec4 (shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0); bool inFrustum = all(inFrustumVec); bvec2 frustumTestVec = bvec2(inFrustum, shadowCoord.z <= 1.0); bool frustumTest = all(frustumTestVec); float shadow = 1.0; if (frustumTest) { #ifdef USE_PCSS16_SOFT_SHADOW shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 16, PoissonSamplers32); #else #ifdef USE_PCSS32_SOFT_SHADOW shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 16, 32, PoissonSamplers32); #else shadow = computeShadowWithPCSS(depthSampler, shadowMap, shadowCoord.xyz, 1. / shadowMapSize.x, 0.1 * shadowMapSize.x, 32, 64, PoissonSamplers64); #endif #endif shadow = computeFallOff(shadow, shadowCoord.xy * 2. - 1., shadowParams.y); } return shadow; } #endif ================================================ FILE: src/shaders/shaderChunk/shadowMap_frag.glsl ================================================ #ifdef USE_SHADOW // outColor *= getShadowMask(); #endif ================================================ FILE: src/shaders/shaderChunk/shadowMap_pars_frag.glsl ================================================ #ifdef USE_SHADOW #if NUM_DIR_SHADOWS > 0 uniform sampler2DShadow directionalShadowMap[NUM_DIR_SHADOWS]; varying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS]; #ifdef USE_PCSS_SOFT_SHADOW uniform sampler2D directionalDepthMap[NUM_DIR_SHADOWS]; #endif struct DirectLightShadow { vec2 shadowBias; vec2 shadowMapSize; vec2 shadowParams; }; uniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS]; #endif #if NUM_POINT_SHADOWS > 0 uniform samplerCube pointShadowMap[NUM_POINT_SHADOWS]; varying vec4 vPointShadowCoord[NUM_POINT_SHADOWS]; struct PointLightShadow { vec2 shadowBias; vec2 shadowMapSize; vec2 shadowParams; vec2 shadowCameraRange; float shadowCameraNear; float shadowCameraFar; }; uniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS]; #endif #if NUM_SPOT_SHADOWS > 0 uniform sampler2DShadow spotShadowMap[NUM_SPOT_SHADOWS]; varying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS]; #ifdef USE_PCSS_SOFT_SHADOW uniform sampler2D spotDepthMap[NUM_SPOT_SHADOWS]; #endif struct SpotLightShadow { vec2 shadowBias; vec2 shadowMapSize; vec2 shadowParams; }; uniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS]; #endif #include #include #endif ================================================ FILE: src/shaders/shaderChunk/shadowMap_pars_vert.glsl ================================================ #ifdef USE_SHADOW #if NUM_DIR_SHADOWS > 0 uniform mat4 directionalShadowMatrix[NUM_DIR_SHADOWS]; varying vec4 vDirectionalShadowCoord[NUM_DIR_SHADOWS]; struct DirectLightShadow { vec2 shadowBias; vec2 shadowMapSize; vec2 shadowParams; }; uniform DirectLightShadow u_DirectionalShadow[NUM_DIR_SHADOWS]; #endif #if NUM_POINT_SHADOWS > 0 uniform mat4 pointShadowMatrix[NUM_POINT_SHADOWS]; varying vec4 vPointShadowCoord[NUM_POINT_SHADOWS]; struct PointLightShadow { vec2 shadowBias; vec2 shadowMapSize; vec2 shadowParams; vec2 shadowCameraRange; float shadowCameraNear; float shadowCameraFar; }; uniform PointLightShadow u_PointShadow[NUM_POINT_SHADOWS]; #endif #if NUM_SPOT_SHADOWS > 0 uniform mat4 spotShadowMatrix[NUM_SPOT_SHADOWS]; varying vec4 vSpotShadowCoord[NUM_SPOT_SHADOWS]; struct SpotLightShadow { vec2 shadowBias; vec2 shadowMapSize; vec2 shadowParams; }; uniform SpotLightShadow u_SpotShadow[NUM_SPOT_SHADOWS]; #endif #endif ================================================ FILE: src/shaders/shaderChunk/shadowMap_vert.glsl ================================================ // Use worldPosition from pvm_vert #ifdef USE_SHADOW vec3 shadowWorldNormal = (transposeMat4(inverseMat4(u_Model)) * vec4(objectNormal, 0.0)).xyz; shadowWorldNormal = normalize(shadowWorldNormal); #ifdef FLIP_SIDED shadowWorldNormal = -shadowWorldNormal; #endif vec4 shadowWorldPosition; #if NUM_DIR_SHADOWS > 0 #pragma unroll_loop_start for (int i = 0; i < NUM_DIR_SHADOWS; i++) { shadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_DirectionalShadow[i].shadowBias[1], 0); vDirectionalShadowCoord[i] = directionalShadowMatrix[i] * shadowWorldPosition; } #pragma unroll_loop_end #endif #if NUM_POINT_SHADOWS > 0 #pragma unroll_loop_start for (int i = 0; i < NUM_POINT_SHADOWS; i++) { shadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_PointShadow[i].shadowBias[1], 0); vPointShadowCoord[i] = pointShadowMatrix[i] * shadowWorldPosition; } #pragma unroll_loop_end #endif #if NUM_SPOT_SHADOWS > 0 #pragma unroll_loop_start for (int i = 0; i < NUM_SPOT_SHADOWS; i++) { shadowWorldPosition = worldPosition + vec4(shadowWorldNormal * u_SpotShadow[i].shadowBias[1], 0); vSpotShadowCoord[i] = spotShadowMatrix[i] * shadowWorldPosition; } #pragma unroll_loop_end #endif #endif ================================================ FILE: src/shaders/shaderChunk/skinning_pars_vert.glsl ================================================ #ifdef USE_SKINNING attribute vec4 skinIndex; attribute vec4 skinWeight; uniform mat4 bindMatrix; uniform mat4 bindMatrixInverse; #ifdef BONE_TEXTURE uniform sampler2D boneTexture; uniform int boneTextureSize; mat4 getBoneMatrix( const in float i ) { float j = i * 4.0; float x = mod( j, float( boneTextureSize ) ); float y = floor( j / float( boneTextureSize ) ); float dx = 1.0 / float( boneTextureSize ); float dy = 1.0 / float( boneTextureSize ); y = dy * ( y + 0.5 ); vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) ); vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) ); vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) ); vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) ); mat4 bone = mat4( v1, v2, v3, v4 ); return bone; } #else uniform mat4 boneMatrices[MAX_BONES]; mat4 getBoneMatrix(const in float i) { mat4 bone = boneMatrices[int(i)]; return bone; } #endif #endif ================================================ FILE: src/shaders/shaderChunk/skinning_vert.glsl ================================================ #ifdef USE_SKINNING mat4 boneMatX = getBoneMatrix( skinIndex.x ); mat4 boneMatY = getBoneMatrix( skinIndex.y ); mat4 boneMatZ = getBoneMatrix( skinIndex.z ); mat4 boneMatW = getBoneMatrix( skinIndex.w ); vec4 skinVertex = bindMatrix * vec4(transformed, 1.0); vec4 skinned = vec4( 0.0 ); skinned += boneMatX * skinVertex * skinWeight.x; skinned += boneMatY * skinVertex * skinWeight.y; skinned += boneMatZ * skinVertex * skinWeight.z; skinned += boneMatW * skinVertex * skinWeight.w; skinned = bindMatrixInverse * skinned; transformed = skinned.xyz / skinned.w; #endif ================================================ FILE: src/shaders/shaderChunk/skinnormal_vert.glsl ================================================ #ifdef USE_SKINNING mat4 skinMatrix = mat4( 0.0 ); skinMatrix += skinWeight.x * boneMatX; skinMatrix += skinWeight.y * boneMatY; skinMatrix += skinWeight.z * boneMatZ; skinMatrix += skinWeight.w * boneMatW; skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix; objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz; #ifdef USE_TANGENT objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; #endif #endif ================================================ FILE: src/shaders/shaderChunk/specularMap_frag.glsl ================================================ float specularStrength; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D( specularMap, v_Uv ); specularStrength = texelSpecular.r; #else specularStrength = 1.0; #endif ================================================ FILE: src/shaders/shaderChunk/specularMap_pars_frag.glsl ================================================ #ifdef USE_SPECULARMAP uniform sampler2D specularMap; #endif ================================================ FILE: src/shaders/shaderChunk/transpose.glsl ================================================ mat4 transposeMat4(mat4 inMatrix) { vec4 i0 = inMatrix[0]; vec4 i1 = inMatrix[1]; vec4 i2 = inMatrix[2]; vec4 i3 = inMatrix[3]; mat4 outMatrix = mat4( vec4(i0.x, i1.x, i2.x, i3.x), vec4(i0.y, i1.y, i2.y, i3.y), vec4(i0.z, i1.z, i2.z, i3.z), vec4(i0.w, i1.w, i2.w, i3.w) ); return outMatrix; } ================================================ FILE: src/shaders/shaderChunk/tsn.glsl ================================================ // Per-Pixel Tangent Space Normal Mapping // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html mat3 tsn(vec3 N, vec3 V, vec2 uv) { vec3 q0 = dFdx(V.xyz); vec3 q1 = dFdy(V.xyz); vec2 st0 = dFdx(uv.xy); vec2 st1 = dFdy(uv.xy); float scale = sign(st1.y * st0.x - st0.y * st1.x); vec3 S = normalize((q0 * st1.y - q1 * st0.y) * scale); vec3 T = normalize((-q0 * st1.x + q1 * st0.x) * scale); // N has been normalized return mat3(S, T, N); } ================================================ FILE: src/shaders/shaderChunk/uv_pars_frag.glsl ================================================ #ifdef USE_UV1 varying vec2 v_Uv; #endif ================================================ FILE: src/shaders/shaderChunk/uv_pars_vert.glsl ================================================ #if defined(USE_UV) || defined(USE_UV1) uniform mat3 uvTransform; #endif #ifdef USE_UV1 attribute vec2 a_Uv; varying vec2 v_Uv; #endif ================================================ FILE: src/shaders/shaderChunk/uv_vert.glsl ================================================ #ifdef USE_UV1 v_Uv = (uvTransform * vec3(a_Uv, 1.)).xy; #endif ================================================ FILE: src/shaders/shaderLib/basic_frag.glsl ================================================ #include #include #include #include #include #include #include #if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR) #include #include #endif #include #include #include #include #include void main() { #include #include #include #include #include #include #include ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)); reflectedLight.indirectDiffuse += vec3(1.0); #include reflectedLight.indirectDiffuse *= outColor.xyz; outColor.xyz = reflectedLight.indirectDiffuse; #if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR) #include #endif #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/basic_vert.glsl ================================================ #include #include #include #include #include #if defined(USE_ENV_MAP) && !defined(USE_VERTEX_ENVDIR) #include #endif #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include #ifdef USE_ENV_MAP #include #include #ifndef USE_VERTEX_ENVDIR #include #endif #endif #include #include #include } ================================================ FILE: src/shaders/shaderLib/depth_frag.glsl ================================================ #include #include #include #include #include #include #include #include void main() { #include #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST) vec4 texelColor = texture2D( diffuseMap, v_Uv ); float alpha = texelColor.a * u_Opacity; if(alpha < u_AlphaTest) discard; #endif #include #ifdef DEPTH_PACKING_RGBA gl_FragColor = packDepthToRGBA(gl_FragCoord.z); #else gl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), u_Opacity ); #endif } ================================================ FILE: src/shaders/shaderLib/depth_vert.glsl ================================================ #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/distance_frag.glsl ================================================ #include uniform float nearDistance; uniform float farDistance; #include #include #include void main() { #include float dist = length( v_modelPos - u_CameraPosition ); dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); dist = saturate( dist ); // clamp to [ 0, 1 ] gl_FragColor = packDepthToRGBA(dist); } ================================================ FILE: src/shaders/shaderLib/distance_vert.glsl ================================================ #include #include #include #include void main() { #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/lambert_frag.glsl ================================================ #define USE_LAMBERT #include #include uniform vec3 emissive; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)); #include #include outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse; #include #include vec3 totalEmissiveRadiance = emissive; #include outColor.xyz += totalEmissiveRadiance; #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/lambert_vert.glsl ================================================ #define USE_LAMBERT #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/normaldepth_frag.glsl ================================================ #include #include #include #include #include #include #include void main() { #if defined(USE_DIFFUSE_MAP) && defined(ALPHATEST) vec4 texelColor = texture2D( diffuseMap, v_Uv ); float alpha = texelColor.a * u_Opacity; if(alpha < u_AlphaTest) discard; #endif #include vec4 packedNormalDepth; packedNormalDepth.xyz = normalize(v_Normal) * 0.5 + 0.5; packedNormalDepth.w = gl_FragCoord.z; gl_FragColor = packedNormalDepth; } ================================================ FILE: src/shaders/shaderLib/normaldepth_vert.glsl ================================================ #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/pbr2_frag.glsl ================================================ #define USE_PBR #define USE_PBR2 #include #include // if no light> this will not active uniform vec3 u_SpecularColor; #ifdef USE_SPECULARMAP uniform sampler2D specularMap; #endif uniform float glossiness; #ifdef USE_GLOSSINESSMAP uniform sampler2D glossinessMap; #endif uniform vec3 emissive; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include vec3 specularFactor = u_SpecularColor; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D(specularMap, v_Uv); texelSpecular = sRGBToLinear(texelSpecular); // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture specularFactor *= texelSpecular.rgb; #endif float glossinessFactor = glossiness; #ifdef USE_GLOSSINESSMAP vec4 texelGlossiness = texture2D(glossinessMap, v_Uv); // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture glossinessFactor *= texelGlossiness.a; #endif ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)); #include #include outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular; #include vec3 totalEmissiveRadiance = emissive; #include outColor.xyz += totalEmissiveRadiance; #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/pbr_frag.glsl ================================================ #define USE_PBR #include #include // if no light> this will not active uniform float u_Metalness; #ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; #endif uniform float u_Roughness; #ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; #endif uniform vec3 emissive; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include float roughnessFactor = u_Roughness; #ifdef USE_ROUGHNESSMAP vec4 texelRoughness = texture2D( roughnessMap, v_Uv ); // reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture roughnessFactor *= texelRoughness.g; #endif float metalnessFactor = u_Metalness; #ifdef USE_METALNESSMAP vec4 texelMetalness = texture2D( metalnessMap, v_Uv ); // reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture metalnessFactor *= texelMetalness.b; #endif ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)); #include #include outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular; #include vec3 totalEmissiveRadiance = emissive; #include outColor.xyz += totalEmissiveRadiance; #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/pbr_vert.glsl ================================================ #define USE_PBR #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/phong_frag.glsl ================================================ #define USE_PHONG #include #include // if no light> this will not active uniform float u_Specular; uniform vec3 u_SpecularColor; #include uniform vec3 emissive; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)); #include #include outColor.xyz = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular; #include #include vec3 totalEmissiveRadiance = emissive; #include outColor.xyz += totalEmissiveRadiance; #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/phong_vert.glsl ================================================ #define USE_PHONG #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/point_frag.glsl ================================================ #include #include #include #include #include void main() { #include #include #include #ifdef USE_DIFFUSE_MAP outColor *= texture2D(diffuseMap, vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y)); #endif #include #include #include #include } ================================================ FILE: src/shaders/shaderLib/point_vert.glsl ================================================ #include #include #include uniform float u_PointSize; uniform vec2 u_RenderTargetSize; void main() { #include #include #include vec4 mvPosition = u_View * u_Model * vec4(transformed, 1.0); #ifdef USE_SIZEATTENUATION gl_PointSize = u_PointSize * (u_RenderTargetSize.y * 0.5 / -mvPosition.z); #else gl_PointSize = u_PointSize; #endif #include } ================================================ FILE: src/webgl/WebGLAttribute.js ================================================ class WebGLAttribute { constructor(gl, program, attributeData) { this.gl = gl; this.name = attributeData.name; this.type = attributeData.type; this.size = attributeData.size; this.location = gl.getAttribLocation(program, this.name); this.count = getAttributeCount(gl, this.type); this.format = getAttributeFormat(gl, this.type); this.locationSize = 1; if (this.type === gl.FLOAT_MAT2) this.locationSize = 2; if (this.type === gl.FLOAT_MAT3) this.locationSize = 3; if (this.type === gl.FLOAT_MAT4) this.locationSize = 4; } } function getAttributeCount(gl, type) { switch (type) { case gl.FLOAT: case gl.INT: case gl.UNSIGNED_INT: return 1; case gl.FLOAT_VEC2: case gl.INT_VEC2: return 2; case gl.FLOAT_VEC3: case gl.INT_VEC3: return 3; case gl.FLOAT_VEC4: case gl.INT_VEC4: return 4; case gl.FLOAT_MAT2: return 4; case gl.FLOAT_MAT3: return 9; case gl.FLOAT_MAT4: return 16; default: return 0; } } function getAttributeFormat(gl, type) { switch (type) { case gl.FLOAT: case gl.FLOAT_VEC2: case gl.FLOAT_VEC3: case gl.FLOAT_VEC4: case gl.FLOAT_MAT2: case gl.FLOAT_MAT3: case gl.FLOAT_MAT4: return gl.FLOAT; case gl.INT: case gl.INT_VEC2: case gl.INT_VEC3: case gl.INT_VEC4: return gl.INT; case gl.UNSIGNED_INT: return gl.UNSIGNED_INT; default: return gl.FLOAT; } } export { WebGLAttribute }; ================================================ FILE: src/webgl/WebGLBuffers.js ================================================ import { PropertyMap } from '../render/PropertyMap.js'; class WebGLBuffers extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; } setBuffer(buffer, bufferType, vertexArrayBindings) { const bufferProperties = this.get(buffer); const needCreate = bufferProperties.glBuffer === undefined; if (!needCreate && bufferProperties.version === buffer.version) return; // Avoid polluting the binding state if (vertexArrayBindings) { vertexArrayBindings.reset(); } if (needCreate || bufferProperties.__external) { // Because Buffer does not have a dispose interface at present, // when the version increases, the external is automatically closed this._createGLBuffer(bufferProperties, buffer, bufferType); } else { this._updateGLBuffer(bufferProperties.glBuffer, buffer, bufferType); bufferProperties.version = buffer.version; } } removeBuffer(buffer) { const gl = this._gl; const bufferProperties = this.get(buffer); if (bufferProperties.glBuffer && !bufferProperties.__external) { gl.deleteBuffer(bufferProperties.glBuffer); } this.delete(buffer); } setBufferExternal(buffer, webglBuffer) { const gl = this._gl; const bufferProperties = this.get(buffer); if (!bufferProperties.__external) { if (bufferProperties.glBuffer) { gl.deleteBuffer(bufferProperties.glBuffer); } } const type = getBufferType(gl, buffer.array); bufferProperties.glBuffer = webglBuffer; bufferProperties.type = type; bufferProperties.bytesPerElement = buffer.array.BYTES_PER_ELEMENT; bufferProperties.version = buffer.version; bufferProperties.__external = true; } _createGLBuffer(bufferProperties, buffer, bufferType) { const gl = this._gl; const array = buffer.array; const usage = buffer.usage; const glBuffer = gl.createBuffer(); gl.bindBuffer(bufferType, glBuffer); gl.bufferData(bufferType, array, usage); buffer.onUploadCallback(); const type = getBufferType(gl, array); bufferProperties.glBuffer = glBuffer; bufferProperties.type = type; bufferProperties.bytesPerElement = array.BYTES_PER_ELEMENT; bufferProperties.version = buffer.version; bufferProperties.__external = false; buffer.updateRange.count = -1; // reset range } _updateGLBuffer(glBuffer, buffer, bufferType) { const gl = this._gl; const capabilities = this._capabilities; const array = buffer.array; const updateRange = buffer.updateRange; gl.bindBuffer(bufferType, glBuffer); if (updateRange.count === -1) { // Not using update ranges gl.bufferSubData(bufferType, 0, array); } else { if (capabilities.version >= 2) { gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array, updateRange.offset, updateRange.count); } else { gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array.subarray(updateRange.offset, updateRange.offset + updateRange.count)); } updateRange.count = -1; // reset range } } } function getBufferType(gl, array) { let type; if (array instanceof Float32Array) { type = gl.FLOAT; } else if (array instanceof Float64Array) { console.warn('Unsupported data buffer format: Float64Array.'); } else if (array instanceof Uint16Array) { type = gl.UNSIGNED_SHORT; } else if (array instanceof Int16Array) { type = gl.SHORT; } else if (array instanceof Uint32Array) { type = gl.UNSIGNED_INT; } else if (array instanceof Int32Array) { type = gl.INT; } else if (array instanceof Int8Array) { type = gl.BYTE; } else if (array instanceof Uint8Array) { type = gl.UNSIGNED_BYTE; } else { type = gl.FLOAT; } return type; } export { WebGLBuffers }; ================================================ FILE: src/webgl/WebGLCapabilities.js ================================================ class WebGLCapabilities { constructor(gl) { this._gl = gl; this._extensions = {}; // webgl version this.version = parseFloat(/^WebGL (\d)/.exec(gl.getParameter(gl.VERSION))[1]); // texture filter anisotropic extension // this extension is available to both, WebGL1 and WebGL2 contexts. const anisotropyExt = this.getExtension('EXT_texture_filter_anisotropic'); this.anisotropyExt = anisotropyExt; this.maxAnisotropy = (anisotropyExt !== null) ? gl.getParameter(anisotropyExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1; // query extension let timerQuery = null, canUseTimestamp = false; try { if (this.version > 1) { timerQuery = this.getExtension('EXT_disjoint_timer_query_webgl2'); if (timerQuery) { canUseTimestamp = !!gl.getQuery(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT); } } else { timerQuery = this.getExtension('EXT_disjoint_timer_query'); if (timerQuery) { canUseTimestamp = !!timerQuery.getQueryEXT(timerQuery.TIMESTAMP_EXT, timerQuery.QUERY_COUNTER_BITS_EXT); } } } catch (err) { console.warn(err); } this.timerQuery = timerQuery; this.canUseTimestamp = canUseTimestamp; // parallel_shader_compile this.parallelShaderCompileExt = this.getExtension('KHR_parallel_shader_compile'); // others this.maxPrecision = getMaxPrecision(gl, 'highp'); this.maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); this.maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS); this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); this.maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE); this.maxVertexUniformVectors = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS); this.maxSamples = this.version > 1 ? gl.getParameter(gl.MAX_SAMPLES) : 1; this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE); } getExtension(name) { const gl = this._gl; const extensions = this._extensions; if (extensions[name] !== undefined) { return extensions[name]; } let ext = null; for (const prefix of vendorPrefixes) { ext = gl.getExtension(prefix + name); if (ext) { break; } } extensions[name] = ext; return ext; } } const vendorPrefixes = ['', 'WEBKIT_', 'MOZ_']; function getMaxPrecision(gl, precision) { if (precision === 'highp') { if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) { return 'highp'; } precision = 'mediump'; } if (precision === 'mediump') { if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) { return 'mediump'; } } return 'lowp'; } export { WebGLCapabilities }; ================================================ FILE: src/webgl/WebGLClusteredLighting.js ================================================ import { PIXEL_TYPE, PIXEL_FORMAT, TEXTURE_FILTER } from '../const.js'; import { Texture2D } from '../resources/textures/Texture2D.js'; import { MathUtils } from '../math/MathUtils.js'; import { Sphere } from '../math/Sphere.js'; import { Box3 } from '../math/Box3.js'; import { Vector3 } from '../math/Vector3.js'; class WebGLClusteredLighting { constructor(options) { this.lightsTexture = new LightsTexture(); this.lightsTexture.initLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT); this.cellsTexture = new CellsTexture(); this.cellsTexture.initCells(options.gridDimensions, options.maxLightsPerCell); this._zClip = options.zClip.clone(); this._cellsTextureEmpty = false; this.cellsTransform = { clips: [0, 0], // near, far factors: [0, 0, 0, 0], // logFactor1, logFactor2, persp:tan(fov/2)|ortho:-height/2, aspect perspective: true }; } dispose() { this._cellsTextureEmpty = false; this.cellsTexture.dispose(); this.lightsTexture.dispose(); } setOptions(options) { this.lightsTexture.updateLights(options.maxClusterLights, options.useFloatPrecision ? PIXEL_TYPE.FLOAT : PIXEL_TYPE.HALF_FLOAT); this.cellsTexture.updateCells(options.gridDimensions, options.maxLightsPerCell); this._zClip.copy(options.zClip); } update(lightingGroup, cameraData, lightsNeedsUpdate = true) { this._updateCellsTransform(cameraData); this.cellsTexture.resetLightIndices(); const cellsTable = this.cellsTexture.cellsInfo.table; const cellsTransform = this.cellsTransform; let lightIndicesWritten = false; for (let i = 0; i < lightingGroup.pointsNum; i++) { const pointLight = lightingGroup.point[i]; getPointLightBoundingSphere(pointLight, _lightSphere); _lightSphere.center.applyMatrix4(cameraData.viewMatrix); _lightSphere.center.z *= -1; if (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) { lightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i) || lightIndicesWritten; lightsNeedsUpdate && this.lightsTexture.setPointLight(i, pointLight); } } for (let i = 0; i < lightingGroup.spotsNum; i++) { const spotLight = lightingGroup.spot[i]; getSpotLightBoundingSphere(spotLight, _lightSphere); _lightSphere.center.applyMatrix4(cameraData.viewMatrix); _lightSphere.center.z *= -1; if (getCellsRange(_lightSphere, cellsTable, cellsTransform, _cellsRange)) { lightIndicesWritten = this.cellsTexture.setLightIndex(_cellsRange, i + lightingGroup.pointsNum) || lightIndicesWritten; lightsNeedsUpdate && this.lightsTexture.setSpotLight(i + lightingGroup.pointsNum, spotLight); } } (lightIndicesWritten && lightsNeedsUpdate) && this.lightsTexture.version++; (lightIndicesWritten || !this._cellsTextureEmpty) && this.cellsTexture.version++; this._cellsTextureEmpty = !lightIndicesWritten; } _updateCellsTransform(cameraData) { const { clips, factors } = this.cellsTransform; this._zClip.toArray(clips); clips[0] = clips[0] > 0 ? clips[0] : cameraData.near; clips[1] = clips[1] > 0 ? clips[1] : cameraData.far; const cz = this.cellsTexture.cellsInfo.table[2]; const _logFarNear = Math.log(clips[1] / clips[0]); factors[0] = cz / _logFarNear; factors[1] = -cz * Math.log(clips[0]) / _logFarNear; const perspective = _isPerspectiveMatrix(cameraData.projectionMatrix); const elements = cameraData.projectionMatrix.elements; factors[2] = (perspective ? 1 : -1) / elements[5]; // persp: tan(fov / 2), ortho: -height / 2 factors[3] = elements[5] / elements[0]; // aspect: (width / height) this.cellsTransform.perspective = perspective; } } class CellsTexture extends Texture2D { constructor() { super(); this.format = PIXEL_FORMAT.RED; this.type = PIXEL_TYPE.HALF_FLOAT; this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; this.unpackAlignment = 1; this.cellsInfo = { table: [], maxLightsPerCell: 0, textureSize: [], dotData: [] }; this._counts = null; } initCells(cellTable, maxLightsPerCell) { const numCells = cellTable.x * cellTable.y * cellTable.z; const numPixels = numCells * maxLightsPerCell; // TODO - better texture size calculation let width = Math.ceil(Math.sqrt(numPixels)); width = Math.ceil(width / maxLightsPerCell) * maxLightsPerCell; const height = Math.ceil(numPixels / width); const data = new Uint16Array(width * height); this.image = { data, width, height }; cellTable.toArray(this.cellsInfo.table); this.cellsInfo.maxLightsPerCell = maxLightsPerCell; this.cellsInfo.textureSize[0] = width; this.cellsInfo.textureSize[1] = 1 / width; this.cellsInfo.textureSize[2] = 1 / height; this.cellsInfo.dotData[0] = maxLightsPerCell; this.cellsInfo.dotData[1] = cellTable.x * cellTable.z * maxLightsPerCell; this.cellsInfo.dotData[2] = cellTable.x * maxLightsPerCell; this._counts = new Int32Array(numCells); } updateCells(cellTable, maxLightsPerCell) { const cellsInfo = this.cellsInfo; if (_vec3_1.fromArray(cellsInfo.table).equals(cellTable) && cellsInfo.maxLightsPerCell === maxLightsPerCell) { return; } this.dispose(); this.initCells(cellTable, maxLightsPerCell); this.version++; } resetLightIndices() { this.image.data.fill(0); this._counts.fill(0); } setLightIndex(cellsRange, index) { const data = this.image.data; const counts = this._counts; const { table, maxLightsPerCell } = this.cellsInfo; const { min, max } = cellsRange; let needsUpdate = false; for (let x = min.x; x <= max.x; x++) { for (let z = min.z; z <= max.z; z++) { for (let y = min.y; y <= max.y; y++) { const idx = x + table[0] * (z + y * table[2]); const count = counts[idx]; if (count < maxLightsPerCell) { const offset = idx * maxLightsPerCell + count; data[offset] = MathUtils.toHalfFloat(index + 1); // 0 is reserved for empty cell, so we offset by 1 counts[idx]++; needsUpdate = true; } } } } return needsUpdate; } } class LightsTexture extends Texture2D { constructor() { super(); this.format = PIXEL_FORMAT.RGBA; this.magFilter = TEXTURE_FILTER.NEAREST; this.minFilter = TEXTURE_FILTER.NEAREST; this.generateMipmaps = false; this.flipY = false; } initLights(maxLights, type) { const size = lightsTextureSize(maxLights); const arrayType = type === PIXEL_TYPE.FLOAT ? Float32Array : Uint16Array; const data = new arrayType(size * size * 4); // eslint-disable-line new-cap this.image = { data, width: size, height: size }; this.type = type; } updateLights(maxLights, type) { const size = lightsTextureSize(maxLights); if (size === this.image.width && type === this.type) return; this.dispose(); this.initLights(maxLights, type); this.version++; } setPointLight(index, lightInfo) { const data = this.image.data; const halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT; const start = index * LIGHT_STRIDE * 4; const { color, decay, position, distance } = lightInfo; // pixel 0 - R: lightType, G: -, B: -, A: - data[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(1) : 1; // pixel 1 - R: color.r, G: color.g, B: color.b, A: decay data[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0]; data[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1]; data[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2]; data[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay; // pixel 2 - R: position.x, G: position.y, B: position.z, A: distance data[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0]; data[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1]; data[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2]; data[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance; // pixel 3 - R: -, G: -, B: -, A: - } setSpotLight(index, lightInfo) { const data = this.image.data; const halfFloat = this.type === PIXEL_TYPE.HALF_FLOAT; const start = index * LIGHT_STRIDE * 4; const { color, decay, position, distance, direction, coneCos, penumbraCos } = lightInfo; // pixel 0 - R: lightType, G: penumbraCos, B: -, A: - data[start + 0 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(2) : 2; data[start + 0 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(penumbraCos) : penumbraCos; // pixel 1 - R: color.r, G: color.g, B: color.b, A: decay data[start + 1 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(color[0]) : color[0]; data[start + 1 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(color[1]) : color[1]; data[start + 1 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(color[2]) : color[2]; data[start + 1 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(decay) : decay; // pixel 2 - R: position.x, G: position.y, B: position.z, A: distance data[start + 2 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(position[0]) : position[0]; data[start + 2 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(position[1]) : position[1]; data[start + 2 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(position[2]) : position[2]; data[start + 2 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(distance) : distance; // pixel 3 - R: direction.x, G: direction.y, B: direction.z, A: coneCos data[start + 3 * 4 + 0] = halfFloat ? MathUtils.toHalfFloat(direction[0]) : direction[0]; data[start + 3 * 4 + 1] = halfFloat ? MathUtils.toHalfFloat(direction[1]) : direction[1]; data[start + 3 * 4 + 2] = halfFloat ? MathUtils.toHalfFloat(direction[2]) : direction[2]; data[start + 3 * 4 + 3] = halfFloat ? MathUtils.toHalfFloat(coneCos) : coneCos; } } const LIGHT_STRIDE = 4; const _lightSphere = new Sphere(); const _cellsRange = new Box3(); const _vec3_1 = new Vector3(); function getPointLightBoundingSphere(light, sphere) { sphere.center.fromArray(light.position); sphere.radius = light.distance; } function getSpotLightBoundingSphere(light, sphere) { if (light.coneCos < 0.70710678118) { // obtuse angle _vec3_1.fromArray(light.direction).multiplyScalar(light.distance * light.coneCos); sphere.center.fromArray(light.position).add(_vec3_1); sphere.radius = light.distance * Math.sqrt(1 - light.coneCos * light.coneCos); } else { _vec3_1.fromArray(light.direction).multiplyScalar(light.distance / (light.coneCos * 2)); sphere.center.fromArray(light.position).add(_vec3_1); sphere.radius = light.distance / (light.coneCos * 2); } } function lightsTextureSize(maxLights) { return Math.max(MathUtils.nextPowerOfTwo(Math.ceil(Math.sqrt(maxLights * LIGHT_STRIDE))), LIGHT_STRIDE); } function _isPerspectiveMatrix(m) { return m.elements[11] === -1.0; } function getCellsRange(lightSphere, cellsTable, cellsTransform, cellsRange) { const { center, radius } = lightSphere; const { clips, factors, perspective } = cellsTransform; let zMin = center.z - radius; const zMax = center.z + radius; if (zMin > clips[1] || zMax < clips[0]) { return false; } zMin = Math.max(zMin, clips[0]); const zStart = Math.floor(Math.log(zMin) * factors[0] + factors[1]); const zEnd = Math.min(Math.floor(Math.log(zMax) * factors[0] + factors[1]), cellsTable[2] - 1); const halfFrustumHeight = (perspective ? Math.abs(center.z) : -1) * factors[2]; const invH = 1 / (2 * halfFrustumHeight); const yMin = (center.y - radius) * invH + 0.5; const yMax = (center.y + radius) * invH + 0.5; if (yMin > 1 || yMax < 0) { return false; } const yStart = Math.max(Math.floor(yMin * cellsTable[1]), 0); const yEnd = Math.min(Math.floor(yMax * cellsTable[1]), cellsTable[1] - 1); const halfFrustumWidth = halfFrustumHeight * factors[3]; const invW = 1 / (2 * halfFrustumWidth); const xMin = (center.x - radius) * invW + 0.5; const xMax = (center.x + radius) * invW + 0.5; if (xMin > 1 || xMax < 0) { return false; } const xStart = Math.max(Math.floor(xMin * cellsTable[0]), 0); const xEnd = Math.min(Math.floor(xMax * cellsTable[0]), cellsTable[0] - 1); cellsRange.min.set(xStart, yStart, zStart); cellsRange.max.set(xEnd, yEnd, zEnd); return true; } export { WebGLClusteredLighting }; ================================================ FILE: src/webgl/WebGLConstants.js ================================================ import { PIXEL_TYPE, PIXEL_FORMAT } from '../const.js'; class WebGLConstants { constructor(gl, capabilities) { this._gl = gl; this._capabilities = capabilities; } getGLType(type) { const gl = this._gl; const capabilities = this._capabilities; const isWebGL2 = capabilities.version >= 2; if (type === PIXEL_TYPE.UNSIGNED_BYTE) return gl.UNSIGNED_BYTE; if (type === PIXEL_TYPE.UNSIGNED_SHORT_5_6_5) return gl.UNSIGNED_SHORT_5_6_5; if (type === PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4) return gl.UNSIGNED_SHORT_4_4_4_4; if (type === PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1) return gl.UNSIGNED_SHORT_5_5_5_1; let extension; if (!isWebGL2) { if (type === PIXEL_TYPE.UNSIGNED_SHORT || type === PIXEL_TYPE.UNSIGNED_INT || type === PIXEL_TYPE.UNSIGNED_INT_24_8) { extension = capabilities.getExtension('WEBGL_depth_texture'); if (extension) { if (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT; if (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT; if (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return extension.UNSIGNED_INT_24_8_WEBGL; } else { console.warn('extension WEBGL_depth_texture is not support.'); return null; } } if (type === PIXEL_TYPE.FLOAT) { extension = capabilities.getExtension('OES_texture_float'); if (extension) { return gl.FLOAT; } else { console.warn('extension OES_texture_float is not support.'); return null; } } if (type === PIXEL_TYPE.HALF_FLOAT) { extension = capabilities.getExtension('OES_texture_half_float'); if (extension) { return extension.HALF_FLOAT_OES; } else { console.warn('extension OES_texture_half_float is not support.'); return null; } } } else { if (type === PIXEL_TYPE.UNSIGNED_SHORT) return gl.UNSIGNED_SHORT; if (type === PIXEL_TYPE.UNSIGNED_INT) return gl.UNSIGNED_INT; if (type === PIXEL_TYPE.UNSIGNED_INT_24_8) return gl.UNSIGNED_INT_24_8; if (type === PIXEL_TYPE.FLOAT) return gl.FLOAT; if (type === PIXEL_TYPE.HALF_FLOAT) return gl.HALF_FLOAT; if (type === PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV) return gl.FLOAT_32_UNSIGNED_INT_24_8_REV; if (type === PIXEL_TYPE.BYTE) return gl.BYTE; if (type === PIXEL_TYPE.SHORT) return gl.SHORT; if (type === PIXEL_TYPE.INT) return gl.INT; // does not include: // UNSIGNED_INT_2_10_10_10_REV // UNSIGNED_INT_10F_11F_11F_REV // UNSIGNED_INT_5_9_9_9_REV } return (gl[type] !== undefined) ? gl[type] : type; } getGLFormat(format) { const gl = this._gl; const capabilities = this._capabilities; if (format === PIXEL_FORMAT.RGB) return gl.RGB; if (format === PIXEL_FORMAT.RGBA) return gl.RGBA; if (format === PIXEL_FORMAT.ALPHA) return gl.ALPHA; if (format === PIXEL_FORMAT.LUMINANCE) return gl.LUMINANCE; if (format === PIXEL_FORMAT.LUMINANCE_ALPHA) return gl.LUMINANCE_ALPHA; if (format === PIXEL_FORMAT.DEPTH_COMPONENT) return gl.DEPTH_COMPONENT; if (format === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL; if (format === PIXEL_FORMAT.RED) return gl.RED; if (format === PIXEL_FORMAT.RED_INTEGER) return gl.RED_INTEGER; if (format === PIXEL_FORMAT.RG) return gl.RG; if (format === PIXEL_FORMAT.RG_INTEGER) return gl.RG_INTEGER; if (format === PIXEL_FORMAT.RGB_INTEGER) return gl.RGB_INTEGER; if (format === PIXEL_FORMAT.RGBA_INTEGER) return gl.RGBA_INTEGER; let extension; // S3TC if (format === PIXEL_FORMAT.RGB_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT1 || format === PIXEL_FORMAT.RGBA_S3TC_DXT3 || format === PIXEL_FORMAT.RGBA_S3TC_DXT5) { extension = capabilities.getExtension('WEBGL_compressed_texture_s3tc'); if (extension) { if (format === PIXEL_FORMAT.RGB_S3TC_DXT1) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT1) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT3) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; if (format === PIXEL_FORMAT.RGBA_S3TC_DXT5) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; } else { console.warn('extension WEBGL_compressed_texture_s3tc is not support.'); return null; } } // PVRTC if (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1 || format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) { extension = capabilities.getExtension('WEBGL_compressed_texture_pvrtc'); if (extension) { if (format === PIXEL_FORMAT.RGB_PVRTC_4BPPV1) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if (format === PIXEL_FORMAT.RGB_PVRTC_2BPPV1) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if (format === PIXEL_FORMAT.RGBA_PVRTC_4BPPV1) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if (format === PIXEL_FORMAT.RGBA_PVRTC_2BPPV1) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; } else { console.warn('extension WEBGL_compressed_texture_pvrtc is not support.'); return null; } } // ETC1 if (format === PIXEL_FORMAT.RGB_ETC1) { extension = capabilities.getExtension('WEBGL_compressed_texture_etc1'); if (extension) { return extension.COMPRESSED_RGB_ETC1_WEBGL; } else { console.warn('extension WEBGL_compressed_texture_etc1 is not support.'); return null; } } // ASTC if (format === PIXEL_FORMAT.RGBA_ASTC_4x4) { extension = capabilities.getExtension('WEBGL_compressed_texture_astc'); if (extension) { return extension.COMPRESSED_RGBA_ASTC_4x4_KHR; } else { console.warn('extension WEBGL_compressed_texture_astc is not support.'); return null; } } // BPTC if (format === PIXEL_FORMAT.RGBA_BPTC || format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT || format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) { extension = capabilities.getExtension('EXT_texture_compression_bptc'); if (extension) { if (format === PIXEL_FORMAT.RGBA_BPTC) return extension.COMPRESSED_RGBA_BPTC_UNORM_EXT; if (format === PIXEL_FORMAT.RGB_BPTC_SIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; if (format === PIXEL_FORMAT.RGB_BPTC_UNSIGNED_FORMAT) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; } else { console.warn('extension EXT_texture_compression_bptc is not support.'); return null; } } return (gl[format] !== undefined) ? gl[format] : format; } getGLInternalFormat(internalFormat) { const gl = this._gl; const capabilities = this._capabilities; const isWebGL2 = capabilities.version >= 2; if (internalFormat === PIXEL_FORMAT.RGBA4) return gl.RGBA4; if (internalFormat === PIXEL_FORMAT.RGB5_A1) return gl.RGB5_A1; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT16) return gl.DEPTH_COMPONENT16; if (internalFormat === PIXEL_FORMAT.STENCIL_INDEX8) return gl.STENCIL_INDEX8; if (internalFormat === PIXEL_FORMAT.DEPTH_STENCIL) return gl.DEPTH_STENCIL; // does not include: // RGB565 let extension; if (!isWebGL2) { if (internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.RGB32F) { extension = capabilities.getExtension('WEBGL_color_buffer_float'); if (extension) { if (internalFormat === PIXEL_FORMAT.RGBA32F) return extension.RGBA32F_EXT; if (internalFormat === PIXEL_FORMAT.RGB32F) return extension.RGB32F_EXT; } else { console.warn('extension WEBGL_color_buffer_float is not support.'); return null; } } } else { if (internalFormat === PIXEL_FORMAT.R8) return gl.R8; if (internalFormat === PIXEL_FORMAT.RG8) return gl.RG8; if (internalFormat === PIXEL_FORMAT.RGB8) return gl.RGB8; if (internalFormat === PIXEL_FORMAT.RGBA8) return gl.RGBA8; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT24) return gl.DEPTH_COMPONENT24; if (internalFormat === PIXEL_FORMAT.DEPTH_COMPONENT32F) return gl.DEPTH_COMPONENT32F; if (internalFormat === PIXEL_FORMAT.DEPTH24_STENCIL8) return gl.DEPTH24_STENCIL8; if (internalFormat === PIXEL_FORMAT.DEPTH32F_STENCIL8) return gl.DEPTH32F_STENCIL8; // does not include: // R8UI R8I R16UI R16I R32UI R32I RG8UI RG8I RG16UI RG16I RG32UI RG32I SRGB8_ALPHA8 // RGB10_A2 RGBA8UI RGBA8I RGB10_A2UI RGBA16UI RGBA16I RGBA32I RGBA32UI if (internalFormat === PIXEL_FORMAT.R16F || internalFormat === PIXEL_FORMAT.RG16F || internalFormat === PIXEL_FORMAT.RGB16F || internalFormat === PIXEL_FORMAT.RGBA16F || internalFormat === PIXEL_FORMAT.R32F || internalFormat === PIXEL_FORMAT.RG32F || internalFormat === PIXEL_FORMAT.RGB32F || internalFormat === PIXEL_FORMAT.RGBA32F || internalFormat === PIXEL_FORMAT.R11F_G11F_B10F ) { extension = capabilities.getExtension('EXT_color_buffer_float'); if (extension) { if (internalFormat === PIXEL_FORMAT.R16F) return gl.R16F; if (internalFormat === PIXEL_FORMAT.RG16F) return gl.RG16F; if (internalFormat === PIXEL_FORMAT.RGB16F) return gl.RGB16F; if (internalFormat === PIXEL_FORMAT.RGBA16F) return gl.RGBA16F; if (internalFormat === PIXEL_FORMAT.R32F) return gl.R32F; if (internalFormat === PIXEL_FORMAT.RG32F) return gl.RG32F; if (internalFormat === PIXEL_FORMAT.RGB32F) return gl.RGB32F; if (internalFormat === PIXEL_FORMAT.RGBA32F) return gl.RGBA32F; if (internalFormat === PIXEL_FORMAT.R11F_G11F_B10F) return gl.R11F_G11F_B10F; } else { console.warn('extension EXT_color_buffer_float is not support.'); return null; } } } return (gl[internalFormat] !== undefined) ? gl[internalFormat] : internalFormat; } } export { WebGLConstants }; ================================================ FILE: src/webgl/WebGLGeometries.js ================================================ import { PropertyMap } from '../render/PropertyMap.js'; // This class handles buffer creation and updating for geometries. class WebGLGeometries extends PropertyMap { constructor(prefix, gl, buffers, vertexArrayBindings) { super(prefix); this._gl = gl; this._buffers = buffers; this._vertexArrayBindings = vertexArrayBindings; const that = this; function onGeometryDispose(event) { const geometry = event.target; const geometryProperties = that.get(geometry); geometry.removeEventListener('dispose', onGeometryDispose); if (geometry.index !== null) { buffers.removeBuffer(geometry.index.buffer); } for (const name in geometry.attributes) { buffers.removeBuffer(geometry.attributes[name].buffer); } for (const name in geometry.morphAttributes) { const array = geometry.morphAttributes[name]; for (let i = 0, l = array.length; i < l; i++) { buffers.removeBuffer(array[i].buffer); } } vertexArrayBindings.releaseByGeometry(geometry); geometryProperties.created = false; that.delete(geometry); } this._onGeometryDispose = onGeometryDispose; } setGeometry(geometry, passInfo) { const gl = this._gl; const buffers = this._buffers; const geometryProperties = this.get(geometry); // If in pass rendering, skip the geometry if it has been set in this pass. if (geometryProperties.pass === passInfo.count) { return; } geometryProperties.pass = passInfo.count; if (!geometryProperties.created) { geometry.addEventListener('dispose', this._onGeometryDispose); geometryProperties.created = true; } if (geometry.index !== null) { buffers.setBuffer(geometry.index.buffer, gl.ELEMENT_ARRAY_BUFFER, this._vertexArrayBindings); } for (const name in geometry.attributes) { buffers.setBuffer(geometry.attributes[name].buffer, gl.ARRAY_BUFFER); } for (const name in geometry.morphAttributes) { const array = geometry.morphAttributes[name]; for (let i = 0, l = array.length; i < l; i++) { buffers.setBuffer(array[i].buffer, gl.ARRAY_BUFFER); } } return geometryProperties; } } export { WebGLGeometries }; ================================================ FILE: src/webgl/WebGLLights.js ================================================ import { PropertyMap } from '../render/PropertyMap.js'; import { WebGLClusteredLighting } from './WebGLClusteredLighting.js'; class WebGLLights extends PropertyMap { constructor(prefix, capabilities, textures) { super(prefix); const that = this; function onLightingGroupDispose(event) { const lightingGroup = event.target; const lightingProperties = that.get(lightingGroup); lightingGroup.removeEventListener('dispose', onLightingGroupDispose); if (lightingProperties.clustered) { lightingProperties.clustered.dispose(); } that.delete(lightingGroup); } this._onLightingGroupDispose = onLightingGroupDispose; this._capabilities = capabilities; this._textures = textures; } setLightingGroup(lightingGroup, passInfo, options, cameraData) { const lightingProperties = this.get(lightingGroup); // Skip early if this lighting group has been set in this pass. if (lightingProperties.pass === passInfo.count) { return lightingProperties; } lightingProperties.pass = passInfo.count; if (lightingProperties.state === undefined) { lightingGroup.addEventListener('dispose', this._onLightingGroupDispose); lightingProperties.state = new LightingState(); lightingProperties.uploadVersion = 0; } // Skip early if this lighting group is empty if (lightingGroup.totalNum === 0) { return lightingProperties; } const clusteredOptions = options.clustered; const clusteredEnabled = clusteredOptions.enabled; let clusteredLightsChanged = false; if (lightingProperties.lightingVersion !== lightingGroup.version || lightingProperties.clusteredEnabled !== clusteredEnabled) { lightingProperties.state.update(lightingGroup, clusteredEnabled); lightingProperties.uploadVersion++; const hasClusteredLights = lightingProperties.state._factor[10] > 0; lightingProperties.lightingVersion = lightingGroup.version; lightingProperties.clusteredEnabled = clusteredEnabled; lightingProperties.hasClusteredLights = hasClusteredLights; clusteredLightsChanged = hasClusteredLights; // prepare clustered lighting if (hasClusteredLights && !lightingProperties.clustered) { lightingProperties.clustered = new WebGLClusteredLighting(clusteredOptions); lightingProperties.clusteredOptionVersion = clusteredOptions.version; } else if (!clusteredEnabled && lightingProperties.clustered) { lightingProperties.clustered.dispose(); delete lightingProperties.clustered; } } if (lightingProperties.hasClusteredLights) { if (lightingProperties.clusteredOptionVersion !== clusteredOptions.version) { lightingProperties.clustered.setOptions(clusteredOptions); lightingProperties.clusteredOptionVersion = clusteredOptions.version; clusteredLightsChanged = true; } let cameraChanged = false; if (lightingProperties.cameraId !== cameraData.id || lightingProperties.cameraVersion !== cameraData.version) { lightingProperties.cameraId = cameraData.id; lightingProperties.cameraVersion = cameraData.version; cameraChanged = true; } if (clusteredLightsChanged || cameraChanged) { lightingProperties.clustered.update(lightingGroup, cameraData, clusteredLightsChanged); } } return lightingProperties; } uploadUniforms(program, lightingGroup, disableShadowSampler) { const lightingGroupProperties = this.get(lightingGroup); let refresh = false; if (program.lightId !== lightingGroup.id || program.lightVersion !== lightingGroupProperties.uploadVersion) { refresh = true; program.lightId = lightingGroup.id; program.lightVersion = lightingGroupProperties.uploadVersion; } const uniforms = program.getUniforms(); const capabilities = this._capabilities; const textures = this._textures; const lightingFactor = lightingGroupProperties.state._factor; if (lightingFactor[0] && refresh) { uniforms.set('u_AmbientLightColor', lightingGroup.ambient); } if (lightingFactor[1] && refresh) { uniforms.set('u_SphericalHarmonicsLightData', lightingGroup.sh); } if (lightingFactor[2] > 0 && refresh) { uniforms.set('u_Hemi', lightingGroup.hemisphere); } if (lightingFactor[3] > 0) { if (refresh) uniforms.set('u_Directional', lightingGroup.directional); if (lightingFactor[7] > 0) { if (refresh) uniforms.set('u_DirectionalShadow', lightingGroup.directionalShadow); if (uniforms.has('directionalShadowMap')) { if (capabilities.version >= 2 && !disableShadowSampler) { uniforms.set('directionalShadowMap', lightingGroup.directionalShadowDepthMap, textures); } else { uniforms.set('directionalShadowMap', lightingGroup.directionalShadowMap, textures); } uniforms.set('directionalShadowMatrix', lightingGroup.directionalShadowMatrix); } if (uniforms.has('directionalDepthMap')) { uniforms.set('directionalDepthMap', lightingGroup.directionalShadowMap, textures); } } } if (lightingFactor[4] > 0) { if (refresh) uniforms.set('u_Point', lightingGroup.point); if (lightingFactor[8] > 0) { if (refresh) uniforms.set('u_PointShadow', lightingGroup.pointShadow); if (uniforms.has('pointShadowMap')) { uniforms.set('pointShadowMap', lightingGroup.pointShadowMap, textures); uniforms.set('pointShadowMatrix', lightingGroup.pointShadowMatrix); } } } if (lightingFactor[5] > 0) { if (refresh) uniforms.set('u_Spot', lightingGroup.spot); if (lightingFactor[9] > 0) { if (refresh) uniforms.set('u_SpotShadow', lightingGroup.spotShadow); if (uniforms.has('spotShadowMap')) { if (capabilities.version >= 2 && !disableShadowSampler) { uniforms.set('spotShadowMap', lightingGroup.spotShadowDepthMap, textures); } else { uniforms.set('spotShadowMap', lightingGroup.spotShadowMap, textures); } uniforms.set('spotShadowMatrix', lightingGroup.spotShadowMatrix); } if (uniforms.has('spotDepthMap')) { uniforms.set('spotDepthMap', lightingGroup.spotShadowMap, textures); } } } if (lightingFactor[6] > 0) { if (refresh) uniforms.set('u_RectArea', lightingGroup.rectArea); if (lightingGroup.LTC1 && lightingGroup.LTC2) { uniforms.set('ltc_1', lightingGroup.LTC1, textures); uniforms.set('ltc_2', lightingGroup.LTC2, textures); } else { console.warn('WebGLRenderer: RectAreaLight.LTC1 and LTC2 need to be set before use.'); } } if (lightingFactor[10] > 0) { const clusteredLighting = lightingGroupProperties.clustered; const cellsInfo = clusteredLighting.cellsTexture.cellsInfo; uniforms.set('maxLightsPerCell', cellsInfo.maxLightsPerCell); uniforms.set('cells', cellsInfo.table); uniforms.set('cellsDotData', cellsInfo.dotData); uniforms.set('cellsTextureSize', cellsInfo.textureSize); uniforms.set('cellsTransformFactors', clusteredLighting.cellsTransform.factors); uniforms.set('lightsTexture', clusteredLighting.lightsTexture, textures); uniforms.set('cellsTexture', clusteredLighting.cellsTexture, textures); } } } class LightingState { constructor() { this._factor = new Uint16Array(11); this._totalNum = 0; this._shadowsNum = 0; } update(lightingGroup, clusteredEnabled) { const selfFactor = this._factor; selfFactor[0] = lightingGroup.useAmbient ? 1 : 0; selfFactor[1] = lightingGroup.useSphericalHarmonics ? 1 : 0; selfFactor[2] = lightingGroup.hemisNum; selfFactor[3] = lightingGroup.directsNum; selfFactor[4] = lightingGroup.pointsNum; selfFactor[5] = lightingGroup.spotsNum; selfFactor[6] = lightingGroup.rectAreaNum; selfFactor[7] = lightingGroup.directShadowNum; selfFactor[8] = lightingGroup.pointShadowNum; selfFactor[9] = lightingGroup.spotShadowNum; selfFactor[10] = 0; this._totalNum = lightingGroup.totalNum; this._shadowsNum = lightingGroup.shadowsNum; if (clusteredEnabled) { const clusteredPointsNum = selfFactor[4] - selfFactor[8]; const clusteredSpotsNum = selfFactor[5] - selfFactor[9]; selfFactor[4] = selfFactor[8]; selfFactor[5] = selfFactor[9]; selfFactor[10] = (clusteredPointsNum + clusteredSpotsNum) > 0 ? 1 : 0; } } compare(factor) { if (!factor) { return false; } const selfFactor = this._factor; for (let i = 0, l = factor.length; i < l; i++) { if (selfFactor[i] !== factor[i]) { return false; } } return true; } copyTo(factor) { const selfFactor = this._factor; if (!factor) { factor = new selfFactor.constructor(this._factor.length); } factor.set(selfFactor); return factor; } hasLight() { return this._totalNum > 0; } hasShadow() { return this._shadowsNum > 0; } setProgramProps(props, receiveShadow) { const selfFactor = this._factor; props.useAmbientLight = selfFactor[0]; props.useSphericalHarmonicsLight = selfFactor[1]; props.hemisphereLightNum = selfFactor[2]; props.directLightNum = selfFactor[3]; props.pointLightNum = selfFactor[4]; props.spotLightNum = selfFactor[5]; props.rectAreaLightNum = selfFactor[6]; props.directShadowNum = receiveShadow ? selfFactor[7] : 0; props.pointShadowNum = receiveShadow ? selfFactor[8] : 0; props.spotShadowNum = receiveShadow ? selfFactor[9] : 0; props.useClusteredLights = selfFactor[10]; props.useShadow = this._shadowsNum > 0 && receiveShadow; } } export { WebGLLights }; ================================================ FILE: src/webgl/WebGLMaterials.js ================================================ import { PropertyMap } from '../render/PropertyMap.js'; class WebGLMaterials extends PropertyMap { constructor(prefix, programs, vertexArrayBindings) { super(prefix); const that = this; function onMaterialDispose(event) { const material = event.target; const materialProperties = that.get(material); material.removeEventListener('dispose', onMaterialDispose); const programList = materialProperties.programList; if (programList !== undefined) { for (let i = 0, l = programList.length; i < l; i++) { const program = programList[i]; vertexArrayBindings.releaseByProgram(program); programs.releaseProgram(program); } } that.delete(material); } this._onMaterialDispose = onMaterialDispose; this._programs = programs; this._vertexArrayBindings = vertexArrayBindings; } setMaterial(material) { const materialProperties = this.get(material); if (materialProperties.programList === undefined) { material.addEventListener('dispose', this._onMaterialDispose); materialProperties.programList = []; } // Set other material properties in renderer return materialProperties; } updateProgram(material, object, lightingState, renderStates, shaderCompileOptions) { const programs = this._programs; const vertexArrayBindings = this._vertexArrayBindings; const materialProperties = this.get(material); const props = programs.generateProps(material, object, lightingState, renderStates); const programCode = programs.generateProgramCode(props, material); const programList = materialProperties.programList; let targetProgram = findProgram(programList, programCode); if (targetProgram === null) { targetProgram = programs.getProgram(material, props, programCode, shaderCompileOptions); programList.unshift(targetProgram); if (programList.length > shaderCompileOptions.maxMaterialPrograms) { // release the last program const lastProgram = programList.pop(); vertexArrayBindings.releaseByProgram(lastProgram); programs.releaseProgram(lastProgram); } } materialProperties.currentProgram = targetProgram; } } function findProgram(list, code) { let index = 0, target = null; for (let l = list.length; index < l; index++) { const program = list[index]; if (program.code === code) { target = program; break; } } // move to the first if (target !== null && index > 0) { for (let i = index; i > 0; i--) { list[i] = list[i - 1]; } list[0] = target; } return target; } export { WebGLMaterials }; ================================================ FILE: src/webgl/WebGLProgram.js ================================================ import { WebGLUniforms } from './WebGLUniforms.js'; import { WebGLAttribute } from './WebGLAttribute.js'; let programIdCount = 0; class WebGLProgram { constructor(gl, vshader, fshader) { this.gl = gl; this.vshaderSource = vshader; this.fshaderSource = fshader; this.id = programIdCount++; this.usedTimes = 1; this.code = ''; this.name = ''; this.lightId = -1; this.lightVersion = -1; this.cameraId = -1; this.cameraVersion = -1; this.sceneId = -1; this.sceneVersion = -1; this.program; this._checkErrors = true; this._compileAsynchronously = false; this._status = 0; let program, vertexShader, fragmentShader; // compile program this.compile = function(options) { // create shaders vertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader); fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader); // create a program object program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); this.program = program; // set properties this._checkErrors = options.checkErrors; this._compileAsynchronously = options.compileAsynchronously; this._status = 1; // here we can delete shaders, // according to the documentation: https://www.opengl.org/sdk/docs/man/html/glLinkProgram.xhtml gl.deleteShader(vertexShader); gl.deleteShader(fragmentShader); }; // check if program is ready to be used this.isReady = function(parallelShaderCompileExt) { if (this._status === 1) { if (this._compileAsynchronously && parallelShaderCompileExt) { if (gl.getProgramParameter(program, parallelShaderCompileExt.COMPLETION_STATUS_KHR)) { this._status = 2; this._tryCheckErrors(); } } else { this._status = 2; this._tryCheckErrors(); } } return this._status === 2; }; this._tryCheckErrors = function() { if (!this._checkErrors) return; if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { const programLog = gl.getProgramInfoLog(program).trim(); const vertexErrors = getShaderErrors(gl, vertexShader, 'VERTEX'); const fragmentErrors = getShaderErrors(gl, fragmentShader, 'FRAGMENT'); this.program = undefined; this._status = 0; console.error( 'Shader Error ' + gl.getError() + ' - ' + 'VALIDATE_STATUS ' + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + '\n\n' + 'Shader Name: ' + this.name + '\n' + 'Program Info Log: ' + programLog + '\n' + vertexErrors + '\n' + fragmentErrors ); } }; // set up caching for uniforms let cachedUniforms; this.getUniforms = function() { if (cachedUniforms === undefined) { cachedUniforms = new WebGLUniforms(gl, program); } return cachedUniforms; }; // set up caching for attributes let cachedAttributes; this.getAttributes = function() { if (cachedAttributes === undefined) { cachedAttributes = extractAttributes(gl, program); } return cachedAttributes; }; // free program this.dispose = function() { gl.deleteProgram(program); this.program = undefined; this._status = 0; }; } } function handleSource(string, errorLine) { const lines = string.split('\n'); const lines2 = []; const from = Math.max(errorLine - 6, 0); const to = Math.min(errorLine + 6, lines.length); for (let i = from; i < to; i++) { const line = i + 1; lines2.push(`${line === errorLine ? '>' : ' '} ${line}: ${lines[i]}`); } return lines2.join('\n'); } function loadShader(gl, type, source) { const shader = gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); return shader; } function getShaderErrors(gl, shader, type) { const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS); const errors = gl.getShaderInfoLog(shader).trim(); if (status && errors === '') return ''; const errorMatches = /ERROR: 0:(\d+)/.exec(errors); if (errorMatches) { // --enable-privileged-webgl-extension // console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); const errorLine = parseInt(errorMatches[1]); return type + '\n\n' + errors + '\n\n' + handleSource(gl.getShaderSource(shader), errorLine); } else { return errors; } } // extract attributes function extractAttributes(gl, program) { const attributes = {}; const totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); for (let i = 0; i < totalAttributes; i++) { const attribData = gl.getActiveAttrib(program, i); attributes[attribData.name] = new WebGLAttribute(gl, program, attribData); } return attributes; } export { WebGLProgram }; ================================================ FILE: src/webgl/WebGLPrograms.js ================================================ import { WebGLProgram } from './WebGLProgram.js'; import { MATERIAL_TYPE, TEXEL_ENCODING_TYPE, SHADOW_TYPE, SHADING_TYPE, VERTEX_COLOR, DRAW_SIDE } from '../const.js'; import { ShaderChunk } from '../shaders/ShaderChunk.js'; import { ShaderLib } from '../shaders/ShaderLib.js'; class WebGLPrograms { constructor(gl, state, capabilities) { this._gl = gl; this._state = state; this._capabilities = capabilities; this._programs = []; } getProgram(material, props, programCode, compileOptions) { const programs = this._programs; let program; for (let p = 0, pl = programs.length; p < pl; p++) { const programInfo = programs[p]; if (programInfo.code === programCode) { program = programInfo; ++program.usedTimes; break; } } if (program === undefined) { const customDefines = generateDefines(material.defines); const vertexShader = ShaderLib[material.type + '_vert'] || material.vertexShader || ShaderLib.basic_vert; const fragmentShader = ShaderLib[material.type + '_frag'] || material.fragmentShader || ShaderLib.basic_frag; program = createProgram(this._gl, customDefines, props, vertexShader, fragmentShader); program.name = props.shaderName; program.compile(compileOptions); program.code = programCode; programs.push(program); } return program; } releaseProgram(program) { if (--program.usedTimes === 0) { const programs = this._programs; // Remove from unordered set const index = programs.indexOf(program); programs[index] = programs[programs.length - 1]; programs.pop(); // Free WebGL resources program.dispose(this._gl); } } generateProps(material, object, lightingState, renderStates) { const state = this._state; const capabilities = this._capabilities; const fog = material.fog ? renderStates.scene.fog : null; const envMap = material.envMap !== undefined ? (material.envMap || renderStates.scene.environment) : null; const logarithmicDepthBuffer = renderStates.scene.logarithmicDepthBuffer; const disableShadowSampler = renderStates.scene.disableShadowSampler; const numClippingPlanes = (material.clippingPlanes && material.clippingPlanes.length > 0) ? material.clippingPlanes.length : renderStates.scene.numClippingPlanes; const HAS_CLEARCOAT = material.clearcoat > 0; const HAS_DIFFUSEMAP = !!material.diffuseMap; const HAS_ALPHAMAP = !!material.alphaMap; const HAS_EMISSIVEMAP = !!material.emissiveMap; const HAS_AOMAP = !!material.aoMap; const HAS_NORMALMAP = !!material.normalMap; const HAS_BUMPMAP = !!material.bumpMap; const HAS_SPECULARMAP = !!material.specularMap; const HAS_ROUGHNESSMAP = !!material.roughnessMap; const HAS_METALNESSMAP = !!material.metalnessMap; const HAS_GLOSSINESSMAP = !!material.glossinessMap; const HAS_ENVMAP = !!envMap; const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap; const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap; const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap; _activeMapCoords = material.extUvCoordMask; // reset const props = {}; // cache this props? props.shaderName = (material.type === MATERIAL_TYPE.SHADER && material.shaderName) ? material.shaderName : material.type; // capabilities props.version = capabilities.version; props.precision = material.precision || capabilities.maxPrecision; props.useStandardDerivatives = capabilities.version >= 2 || !!capabilities.getExtension('OES_standard_derivatives') || !!capabilities.getExtension('GL_OES_standard_derivatives'); props.useShaderTextureLOD = capabilities.version >= 2 || !!capabilities.getExtension('EXT_shader_texture_lod'); // maps props.useDiffuseMap = HAS_DIFFUSEMAP; props.useAlphaMap = HAS_ALPHAMAP; props.useEmissiveMap = HAS_EMISSIVEMAP; props.useAOMap = HAS_AOMAP; props.useNormalMap = HAS_NORMALMAP; props.useBumpMap = HAS_BUMPMAP; props.useSpecularMap = HAS_SPECULARMAP; props.useRoughnessMap = HAS_ROUGHNESSMAP; props.useMetalnessMap = HAS_METALNESSMAP; props.useGlossinessMap = HAS_GLOSSINESSMAP; props.useEnvMap = HAS_ENVMAP; props.envMapCombine = HAS_ENVMAP && material.envMapCombine; props.useClearcoat = HAS_CLEARCOAT; props.useClearcoatMap = HAS_CLEARCOATMAP; props.useClearcoatRoughnessMap = HAS_CLEARCOAT_ROUGHNESSMAP; props.useClearcoatNormalMap = HAS_CLEARCOAT_NORMALMAP; props.diffuseMapUv = HAS_DIFFUSEMAP && getUVChannel(material.diffuseMapCoord); props.alphaMapUv = HAS_ALPHAMAP && getUVChannel(material.alphaMapCoord); props.emissiveMapUv = HAS_EMISSIVEMAP && getUVChannel(material.emissiveMapCoord); props.aoMapUv = HAS_AOMAP && getUVChannel(material.aoMapCoord); if (HAS_NORMALMAP || HAS_BUMPMAP || HAS_SPECULARMAP || HAS_ROUGHNESSMAP || HAS_METALNESSMAP || HAS_GLOSSINESSMAP || HAS_CLEARCOATMAP || HAS_CLEARCOAT_ROUGHNESSMAP || HAS_CLEARCOAT_NORMALMAP) { _activeMapCoords |= 1 << 0; // these maps use uv coord 0 by default } props.activeMapCoords = _activeMapCoords; // lights lightingState.setProgramProps(props, object.receiveShadow); props.useShadowSampler = capabilities.version >= 2 && !disableShadowSampler; props.shadowType = object.shadowType; if (!props.useShadowSampler && ( props.shadowType == SHADOW_TYPE.PCF3_SOFT || props.shadowType == SHADOW_TYPE.PCF5_SOFT || props.shadowType == SHADOW_TYPE.PCSS16_SOFT || props.shadowType == SHADOW_TYPE.PCSS32_SOFT || props.shadowType == SHADOW_TYPE.PCSS64_SOFT ) ) { props.shadowType = SHADOW_TYPE.VOGEL5_SOFT; if (props.useShadow) { console.warn('WebGLPrograms: PCF and PCSS shadow type need shadow sampler support, falling back to VOGEL5_SOFT.'); } } props.dithering = material.dithering; // encoding const currentRenderTarget = state.currentRenderTarget; props.gammaFactor = renderStates.gammaFactor; props.outputEncoding = currentRenderTarget.texture ? getTextureEncodingFromMap(currentRenderTarget.texture) : renderStates.outputEncoding; props.diffuseMapEncoding = getTextureEncodingFromMap(material.diffuseMap || material.cubeMap); props.envMapEncoding = getTextureEncodingFromMap(envMap); props.emissiveMapEncoding = getTextureEncodingFromMap(material.emissiveMap); // other props.alphaTest = material.alphaTest > 0; props.premultipliedAlpha = material.premultipliedAlpha; props.useVertexColors = material.vertexColors; props.useVertexTangents = !!material.normalMap && material.vertexTangents; props.numClippingPlanes = numClippingPlanes; props.flatShading = material.shading === SHADING_TYPE.FLAT_SHADING; props.fog = !!fog; props.fogExp2 = !!fog && fog.isFogExp2; props.sizeAttenuation = material.sizeAttenuation; props.doubleSided = material.side === DRAW_SIDE.DOUBLE; props.flipSided = material.side === DRAW_SIDE.BACK; props.packDepthToRGBA = material.packToRGBA; props.logarithmicDepthBuffer = !!logarithmicDepthBuffer; props.rendererExtensionFragDepth = capabilities.version >= 2 || !!capabilities.getExtension('EXT_frag_depth'); // morph targets props.morphTargets = !!object.morphTargetInfluences; props.morphNormals = !!object.morphTargetInfluences && object.geometry.morphAttributes.normal; // skinned mesh const useSkinning = object.isSkinnedMesh && object.skeleton; const maxVertexUniformVectors = capabilities.maxVertexUniformVectors; const useVertexTexture = capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2); let maxBones = 0; if (useVertexTexture) { maxBones = 1024; } else { maxBones = object.skeleton ? object.skeleton.bones.length : 0; if (maxBones * 16 > maxVertexUniformVectors) { console.warn('Program: too many bones (' + maxBones + '), current cpu only support ' + Math.floor(maxVertexUniformVectors / 16) + ' bones!!'); maxBones = Math.floor(maxVertexUniformVectors / 16); } } props.useSkinning = useSkinning; props.bonesNum = maxBones; props.useVertexTexture = useVertexTexture; return props; } generateProgramCode(props, material) { let code = ''; for (const key in props) { code += props[key] + '_'; } for (const name in material.defines) { code += name + '_' + material.defines[name] + '_'; } // If the material type is SHADER and there is no shader Name, // use the entire shader code as part of the signature if (material.type === MATERIAL_TYPE.SHADER && !material.shaderName) { code += material.vertexShader; code += material.fragmentShader; } return code; } } // Helper functions function generateDefines(defines) { const chunks = []; for (const name in defines) { const value = defines[name]; if (value === false) continue; chunks.push('#define ' + name + ' ' + value); } return chunks.join('\n'); } let _activeMapCoords = 0; // bit mask function getUVChannel(coord) { _activeMapCoords |= (1 << coord); if (coord === 0) return 'a_Uv'; return `a_Uv${coord + 1}`; // a_Uv2, a_Uv3, a_Uv4, ... } function getTextureEncodingFromMap(map) { let encoding; if (!map) { encoding = TEXEL_ENCODING_TYPE.LINEAR; } else if (map.encoding) { encoding = map.encoding; } return encoding; } function getEncodingComponents(encoding) { switch (encoding) { case TEXEL_ENCODING_TYPE.LINEAR: return ['Linear', '(value)']; case TEXEL_ENCODING_TYPE.SRGB: return ['sRGB', '(value)']; case TEXEL_ENCODING_TYPE.GAMMA: return ['Gamma', '(value, float(GAMMA_FACTOR))']; default: console.error('unsupported encoding: ' + encoding); } } function getTexelDecodingFunction(functionName, encoding) { const components = getEncodingComponents(encoding); return 'vec4 ' + functionName + '(vec4 value) { return ' + components[0] + 'ToLinear' + components[1] + '; }'; } function getTexelEncodingFunction(functionName, encoding) { const components = getEncodingComponents(encoding); return 'vec4 ' + functionName + '(vec4 value) { return LinearTo' + components[0] + components[1] + '; }'; } function uvAttributes(activeMapCoords) { let str = ''; for (let i = 1; i < 8; i++) { // skip uv0 if (activeMapCoords & (1 << i)) { str += 'attribute vec2 a_Uv' + (i + 1) + ';'; if (i !== 7) str += '\n'; } } return str; } const shadowDefines = { [SHADOW_TYPE.HARD]: '#define USE_HARD_SHADOW', [SHADOW_TYPE.POISSON_SOFT]: '#define USE_POISSON_SOFT_SHADOW', [SHADOW_TYPE.VOGEL5_SOFT]: '#define USE_VOGEL5_SOFT_SHADOW', [SHADOW_TYPE.PCF3_SOFT]: '#define USE_PCF3_SOFT_SHADOW', [SHADOW_TYPE.PCF5_SOFT]: '#define USE_PCF5_SOFT_SHADOW', [SHADOW_TYPE.PCSS16_SOFT]: [ '#define USE_PCSS16_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW' ].join('\n'), [SHADOW_TYPE.PCSS32_SOFT]: [ '#define USE_PCSS32_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW' ].join('\n'), [SHADOW_TYPE.PCSS64_SOFT]: [ '#define USE_PCSS64_SOFT_SHADOW', '#define USE_PCSS_SOFT_SHADOW' ].join('\n') }; function getShadowTypeDefines(shadowType) { if (shadowDefines[shadowType]) { return shadowDefines[shadowType]; } else { console.warn('unsupported shadow type: ' + shadowType); return shadowDefines[SHADOW_TYPE.HARD]; } } function createProgram(gl, defines, props, vertex, fragment) { let prefixVertex = [ 'precision ' + props.precision + ' float;', 'precision ' + props.precision + ' int;', // depth texture may have precision problem on iOS device. 'precision ' + props.precision + ' sampler2D;', (props.version >= 2) ? 'precision ' + props.precision + ' isampler2D;' : '', (props.version >= 2) ? 'precision ' + props.precision + ' usampler2D;' : '', '#define SHADER_NAME ' + props.shaderName, defines, (props.version >= 2) ? '#define WEBGL2' : '', // maps props.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '', props.useAlphaMap ? '#define USE_ALPHA_MAP' : '', props.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '', props.useAOMap ? '#define USE_AOMAP' : '', props.useNormalMap ? '#define USE_NORMAL_MAP' : '', props.useBumpMap ? '#define USE_BUMPMAP' : '', props.useSpecularMap ? '#define USE_SPECULARMAP' : '', props.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '', props.useMetalnessMap ? '#define USE_METALNESSMAP' : '', props.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '', props.useEnvMap ? '#define USE_ENV_MAP' : '', props.diffuseMapUv ? '#define DIFFUSEMAP_UV ' + props.diffuseMapUv : '', props.alphaMapUv ? '#define ALPHAMAP_UV ' + props.alphaMapUv : '', props.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + props.emissiveMapUv : '', props.aoMapUv ? '#define AOMAP_UV ' + props.aoMapUv : '', props.activeMapCoords > 0 ? '#define USE_UV' : '', props.activeMapCoords & 1 ? '#define USE_UV1' : '', uvAttributes(props.activeMapCoords), // lights props.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '', props.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '', props.useShadow ? '#define USE_SHADOW' : '', // other props.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '', props.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '', props.useVertexTangents ? '#define USE_TANGENT' : '', props.flatShading ? '#define FLAT_SHADED' : '', props.fog ? '#define USE_FOG' : '', props.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', props.flipSided ? '#define FLIP_SIDED' : '', props.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', (props.logarithmicDepthBuffer && props.rendererExtensionFragDepth) ? '#define USE_LOGDEPTHBUF_EXT' : '', // morph targets props.morphTargets ? '#define USE_MORPHTARGETS' : '', props.morphNormals && props.flatShading === false ? '#define USE_MORPHNORMALS' : '', // skinned mesh props.useSkinning ? '#define USE_SKINNING' : '', (props.bonesNum > 0) ? ('#define MAX_BONES ' + props.bonesNum) : '', props.useVertexTexture ? '#define BONE_TEXTURE' : '', '\n' ].filter(filterEmptyLine).join('\n'); let prefixFragment = [ // use dfdx and dfdy must enable OES_standard_derivatives (props.useStandardDerivatives && props.version < 2) ? '#extension GL_OES_standard_derivatives : enable' : '', (props.useShaderTextureLOD && props.version < 2) ? '#extension GL_EXT_shader_texture_lod : enable' : '', (props.logarithmicDepthBuffer && props.rendererExtensionFragDepth && props.version < 2) ? '#extension GL_EXT_frag_depth : enable' : '', 'precision ' + props.precision + ' float;', 'precision ' + props.precision + ' int;', // depth texture may have precision problem on iOS device. 'precision ' + props.precision + ' sampler2D;', (props.version >= 2) ? 'precision ' + props.precision + ' isampler2D;' : '', (props.version >= 2) ? 'precision ' + props.precision + ' usampler2D;' : '', (props.version >= 2) ? 'precision ' + props.precision + ' sampler2DShadow;' : '', (props.version >= 2) ? 'precision ' + props.precision + ' samplerCubeShadow;' : '', '#define SHADER_NAME ' + props.shaderName, '#define PI 3.14159265359', '#define EPSILON 1e-6', 'float pow2(const in float x) { return x * x; }', '#define LOG2 1.442695', '#define RECIPROCAL_PI 0.31830988618', '#define saturate(a) clamp(a, 0.0, 1.0)', '#define whiteCompliment(a) (1.0 - saturate(a))', // expects values in the range of [0,1] x [0,1], returns values in the [0,1] range. // do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ 'highp float rand(const in vec2 uv) {', ' const highp float a = 12.9898, b = 78.233, c = 43758.5453;', ' highp float dt = dot(uv.xy, vec2(a, b)), sn = mod(dt, PI);', ' return fract(sin(sn) * c);', '}', defines, (props.version >= 2) ? '#define WEBGL2' : '', props.useShadowSampler ? '#define USE_SHADOW_SAMPLER' : '#define sampler2DShadow sampler2D', props.useShaderTextureLOD ? '#define TEXTURE_LOD_EXT' : '', // maps props.useDiffuseMap ? '#define USE_DIFFUSE_MAP' : '', props.useAlphaMap ? '#define USE_ALPHA_MAP' : '', props.useEmissiveMap ? '#define USE_EMISSIVEMAP' : '', props.useAOMap ? '#define USE_AOMAP' : '', props.useNormalMap ? '#define USE_NORMAL_MAP' : '', props.useBumpMap ? '#define USE_BUMPMAP' : '', props.useSpecularMap ? '#define USE_SPECULARMAP' : '', props.useRoughnessMap ? '#define USE_ROUGHNESSMAP' : '', props.useMetalnessMap ? '#define USE_METALNESSMAP' : '', props.useGlossinessMap ? '#define USE_GLOSSINESSMAP' : '', props.useEnvMap ? '#define USE_ENV_MAP' : '', props.envMapCombine ? '#define ' + props.envMapCombine : '', props.useClearcoat ? '#define USE_CLEARCOAT' : '', props.useClearcoatMap ? '#define USE_CLEARCOATMAP' : '', props.useClearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', props.useClearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', props.activeMapCoords & 1 ? '#define USE_UV1' : '', // lights props.useAmbientLight ? '#define USE_AMBIENT_LIGHT' : '', props.useSphericalHarmonicsLight ? '#define USE_SPHERICALHARMONICS_LIGHT' : '', props.useClusteredLights ? '#define USE_CLUSTERED_LIGHTS' : '', props.useShadow ? '#define USE_SHADOW' : '', getShadowTypeDefines(props.shadowType), props.dithering ? '#define DITHERING' : '', // encoding ShaderChunk['encodings_pars_frag'], '#define GAMMA_FACTOR ' + props.gammaFactor, getTexelEncodingFunction('linearToOutputTexel', props.outputEncoding), getTexelDecodingFunction('mapTexelToLinear', props.diffuseMapEncoding), props.useEnvMap ? getTexelDecodingFunction('envMapTexelToLinear', props.envMapEncoding) : '', props.useEmissiveMap ? getTexelDecodingFunction('emissiveMapTexelToLinear', props.emissiveMapEncoding) : '', // other props.alphaTest ? '#define ALPHATEST' : '', props.premultipliedAlpha ? '#define USE_PREMULTIPLIED_ALPHA' : '', props.useVertexColors == VERTEX_COLOR.RGB ? '#define USE_VCOLOR_RGB' : '', props.useVertexColors == VERTEX_COLOR.RGBA ? '#define USE_VCOLOR_RGBA' : '', props.useVertexTangents ? '#define USE_TANGENT' : '', props.flatShading ? '#define FLAT_SHADED' : '', props.fog ? '#define USE_FOG' : '', props.fogExp2 ? '#define USE_EXP2_FOG' : '', props.doubleSided ? '#define DOUBLE_SIDED' : '', props.packDepthToRGBA ? '#define DEPTH_PACKING_RGBA' : '', props.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', (props.logarithmicDepthBuffer && props.rendererExtensionFragDepth) ? '#define USE_LOGDEPTHBUF_EXT' : '', '\n' ].filter(filterEmptyLine).join('\n'); let vshader = vertex; let fshader = fragment; vshader = parseIncludes(vshader); fshader = parseIncludes(fshader); vshader = replaceLightNums(vshader, props); fshader = replaceLightNums(fshader, props); vshader = replaceClippingPlaneNums(vshader, props); fshader = replaceClippingPlaneNums(fshader, props); vshader = unrollLoops(vshader); fshader = unrollLoops(fshader); // enable glsl version 300 es for webgl ^2.0 if (props.version > 1) { // extract vertex extensions and insert after version strings later // because it must be at the top of the shader const vertexExtensions = vshader.match(extensionPattern); if (vertexExtensions) { vshader = vshader.replace(extensionPattern, ''); } prefixVertex = [ '#version 300 es', vertexExtensions ? vertexExtensions.join('\n') : '', '#define attribute in', '#define varying out', '#define texture2D texture' ].join('\n') + '\n' + prefixVertex; fshader = fshader.replace('#extension GL_EXT_draw_buffers : require', ''); // replace gl_FragData by layout let i = 0; const layout = []; while (fshader.indexOf('gl_FragData[' + i + ']') > -1) { fshader = fshader.replace('gl_FragData[' + i + ']', 'pc_fragData' + i); layout.push('layout(location = ' + i + ') out highp vec4 pc_fragData' + i + ';'); i++; } prefixFragment = [ '#version 300 es', '#define varying in', (fshader.indexOf('layout') > -1 || layout.length > 0) ? '' : 'out highp vec4 pc_fragColor;', '#define gl_FragColor pc_fragColor', '#define gl_FragDepthEXT gl_FragDepth', '#define texture2D texture', '#define textureCube texture', '#define texture2DProj textureProj', '#define texture2DLodEXT textureLod', '#define texture2DProjLodEXT textureProjLod', '#define textureCubeLodEXT textureLod', '#define texture2DGradEXT textureGrad', '#define texture2DProjGradEXT textureProjGrad', '#define textureCubeGradEXT textureGrad', layout.join('\n') ].join('\n') + '\n' + prefixFragment; } vshader = prefixVertex + vshader; fshader = prefixFragment + fshader; return new WebGLProgram(gl, vshader, fshader); } const parseIncludes = function(string) { const pattern = /#include +<([\w\d.]+)>/g; function replace(match, include) { const replace = ShaderChunk[include]; if (replace === undefined) { throw new Error('Can not resolve #include <' + include + '>'); } return parseIncludes(replace); } return string.replace(pattern, replace); }; function filterEmptyLine(string) { return string !== ''; } function replaceLightNums(string, parameters) { return string .replace(/NUM_HEMI_LIGHTS/g, parameters.hemisphereLightNum) .replace(/NUM_DIR_LIGHTS/g, parameters.directLightNum) .replace(/NUM_SPOT_LIGHTS/g, parameters.spotLightNum) .replace(/NUM_POINT_LIGHTS/g, parameters.pointLightNum) .replace(/NUM_RECT_AREA_LIGHTS/g, parameters.rectAreaLightNum) .replace(/NUM_DIR_SHADOWS/g, parameters.directShadowNum) .replace(/NUM_SPOT_SHADOWS/g, parameters.spotShadowNum) .replace(/NUM_POINT_SHADOWS/g, parameters.pointShadowNum); } function replaceClippingPlaneNums(string, parameters) { return string .replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes); } const unrollLoopPattern = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; function loopReplacer(match, start, end, snippet) { let string = ''; for (let i = parseInt(start); i < parseInt(end); i++) { string += snippet .replace(/\[\s*i\s*\]/g, '[' + i + ']') .replace(/UNROLLED_LOOP_INDEX/g, i); } return string; } function unrollLoops(string) { return string .replace(unrollLoopPattern, loopReplacer); } const extensionPattern = /#extension .*/g; export { WebGLPrograms }; ================================================ FILE: src/webgl/WebGLQuerySets.js ================================================ import { QUERYSET_TYPE } from '../const.js'; import { PropertyMap } from '../render/PropertyMap.js'; class WebGLQuerySets extends PropertyMap { constructor(prefix, gl, capabilities) { super(prefix); this._gl = gl; this._capabilities = capabilities; const timerQuery = capabilities.timerQuery; const that = this; function onQuerySetDispose(event) { const querySet = event.target; const querySetProperties = that.get(querySet); querySet.removeEventListener('dispose', onQuerySetDispose); if (querySetProperties._queriesGL) { const queriesGL = querySetProperties._queriesGL; queriesGL.forEach(queryGL => { if (queryGL) { if (capabilities.version > 1) { gl.deleteQuery(queryGL); } else { timerQuery.deleteQueryEXT(queryGL); } } }); } querySetProperties._isDisposed = true; that.delete(querySet); } this._onQuerySetDispose = onQuerySetDispose; this._checkResultAvailable = capabilities.version > 1 ? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT_AVAILABLE) : queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_AVAILABLE_EXT); this._getQueryResult = capabilities.version > 1 ? queryGL => gl.getQueryParameter(queryGL, gl.QUERY_RESULT) : queryGL => timerQuery.getQueryObjectEXT(queryGL, timerQuery.QUERY_RESULT_EXT); } setQuerySet(querySet) { const querySetProperties = this.get(querySet); if (querySetProperties._queriesGL === undefined) { querySet.addEventListener('dispose', this._onQuerySetDispose); querySetProperties._queriesGL = new Array(querySet.count).fill(null); querySetProperties._valueCache = new Array(querySet.count).fill(0); querySetProperties._valueCacheValid = new Array(querySet.count).fill(true); const gl = this._gl; const capabilities = this._capabilities; if (querySet.type === QUERYSET_TYPE.OCCLUSION) { querySetProperties._targetGL = querySet.conservative ? gl.ANY_SAMPLES_PASSED_CONSERVATIVE : gl.ANY_SAMPLES_PASSED; } else { // If timestamp is supported, this variable will not be used, // so it is okay to set it to TIME_ELAPSED_EXT here. querySetProperties._targetGL = capabilities.timerQuery.TIME_ELAPSED_EXT; } querySetProperties._activeIndex = -1; querySetProperties._reading = false; } } beginQuery(querySet, index) { const gl = this._gl; const querySetProperties = this.get(querySet); if (querySetProperties._reading) { return; } const queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index); if (this._capabilities.version > 1) { gl.beginQuery(querySetProperties._targetGL, queryGL); } else { this._capabilities.timerQuery.beginQueryEXT(querySetProperties._targetGL, queryGL); } querySetProperties._activeIndex = index; } endQuery(querySet) { const querySetProperties = this.get(querySet); if (querySetProperties._reading || querySetProperties._activeIndex < 0) { return; } if (this._capabilities.version > 1) { this._gl.endQuery(querySetProperties._targetGL); } else { this._capabilities.timerQuery.endQueryEXT(querySetProperties._targetGL); } querySetProperties._valueCacheValid[querySetProperties._activeIndex] = false; querySetProperties._activeIndex = -1; } queryCounter(querySet, index) { const capabilities = this._capabilities; const timerQuery = capabilities.timerQuery; const querySetProperties = this.get(querySet); if (querySetProperties._reading) { return; } const queryGL = this._getQueryGLByIndex(querySetProperties._queriesGL, index); timerQuery.queryCounterEXT(queryGL, timerQuery.TIMESTAMP_EXT); querySetProperties._valueCacheValid[index] = false; } readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount) { const querySetProperties = this.get(querySet); querySetProperties._reading = true; return new Promise((resolve, reject) => { const checkQueries = () => { if (querySetProperties._isDisposed) { reject(new Error('QuerySet has been disposed')); return; } let completed = true; try { for (let i = firstQuery; i < queryCount; i++) { const queryGL = querySetProperties._queriesGL[i]; const valueCacheValid = querySetProperties._valueCacheValid[i]; if (!valueCacheValid) { if (this._checkResultAvailable(queryGL)) { const result = this._getQueryResult(queryGL); querySetProperties._valueCache[i] = result; querySetProperties._valueCacheValid[i] = true; } else { completed = false; break; } } } } catch (e) { for (let i = firstQuery; i < queryCount; i++) { querySetProperties._valueCacheValid[i] = true; } querySetProperties._reading = false; reject(e); return; } if (completed) { for (let i = firstQuery; i < queryCount; i++) { dstBuffer[i - firstQuery] = querySetProperties._valueCache[i]; } querySetProperties._reading = false; resolve(dstBuffer); } else { requestAnimationFrame(checkQueries); } }; checkQueries(); }); } _getQueryGLByIndex(queriesGL, index) { let queryGL = queriesGL[index]; if (!queryGL) { const gl = this._gl; const capabilities = this._capabilities; queryGL = capabilities.version > 1 ? gl.createQuery() : capabilities.timerQuery.createQueryEXT(); queriesGL[index] = queryGL; } return queryGL; } } export { WebGLQuerySets }; ================================================ FILE: src/webgl/WebGLRenderBuffers.js ================================================ import { PropertyMap } from '../render/PropertyMap.js'; class WebGLRenderBuffers extends PropertyMap { constructor(prefix, gl, capabilities, constants) { super(prefix); this._gl = gl; this._capabilities = capabilities; this._constants = constants; const that = this; function onRenderBufferDispose(event) { const renderBuffer = event.target; renderBuffer.removeEventListener('dispose', onRenderBufferDispose); const renderBufferProperties = that.get(renderBuffer); if (renderBufferProperties.__webglRenderbuffer && !renderBufferProperties.__external) { gl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer); } that.delete(renderBuffer); } this._onRenderBufferDispose = onRenderBufferDispose; } setRenderBuffer(renderBuffer) { const gl = this._gl; const capabilities = this._capabilities; const constants = this._constants; const renderBufferProperties = this.get(renderBuffer); if (renderBufferProperties.__webglRenderbuffer === undefined) { renderBuffer.addEventListener('dispose', this._onRenderBufferDispose); renderBufferProperties.__webglRenderbuffer = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); const glFormat = constants.getGLInternalFormat(renderBuffer.format); if (renderBuffer.multipleSampling > 0) { if (capabilities.version < 2) { console.error('render buffer multipleSampling is not support in webgl 1.0.'); } gl.renderbufferStorageMultisample(gl.RENDERBUFFER, Math.min(renderBuffer.multipleSampling, capabilities.maxSamples), glFormat, renderBuffer.width, renderBuffer.height); } else { gl.renderbufferStorage(gl.RENDERBUFFER, glFormat, renderBuffer.width, renderBuffer.height); } } else { gl.bindRenderbuffer(gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); } return renderBufferProperties; } setRenderBufferExternal(renderBuffer, webglRenderbuffer) { const gl = this._gl; const renderBufferProperties = this.get(renderBuffer); if (!renderBufferProperties.__external) { if (renderBufferProperties.__webglRenderbuffer) { gl.deleteRenderbuffer(renderBufferProperties.__webglRenderbuffer); } else { renderBuffer.addEventListener('dispose', this._onRenderBufferDispose); } } renderBufferProperties.__webglRenderbuffer = webglRenderbuffer; renderBufferProperties.__external = true; } } export { WebGLRenderBuffers }; ================================================ FILE: src/webgl/WebGLRenderTargets.js ================================================ import { ATTACHMENT } from '../const.js'; import { PropertyMap } from '../render/PropertyMap.js'; class WebGLRenderTargets extends PropertyMap { constructor(prefix, gl, state, capabilities, textures, renderBuffers, constants) { super(prefix); this._gl = gl; this._state = state; this._capabilities = capabilities; this._textures = textures; this._renderBuffers = renderBuffers; this._constants = constants; const that = this; function onRenderTargetDispose(event) { const renderTarget = event.target; renderTarget.removeEventListener('dispose', onRenderTargetDispose); const renderTargetProperties = that.get(renderTarget); if (renderTargetProperties.__webglFramebuffer && !renderTargetProperties.__external) { gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); } that.delete(renderTarget); if (state.currentRenderTarget === renderTarget) { state.currentRenderTarget = null; } } this._onRenderTargetDispose = onRenderTargetDispose; } _setupRenderTarget(renderTarget) { const gl = this._gl; const state = this._state; const textures = this._textures; const renderBuffers = this._renderBuffers; const capabilities = this._capabilities; const renderTargetProperties = this.get(renderTarget); renderTarget.addEventListener('dispose', this._onRenderTargetDispose); const glFrameBuffer = gl.createFramebuffer(); const drawBuffers = []; renderTargetProperties.__webglFramebuffer = glFrameBuffer; renderTargetProperties.__drawBuffers = drawBuffers; renderTargetProperties.__currentActiveMipmapLevel = renderTarget.activeMipmapLevel; renderTargetProperties.__currentActiveLayer = renderTarget.activeLayer; gl.bindFramebuffer(gl.FRAMEBUFFER, glFrameBuffer); for (const attachTarget in renderTarget._attachments) { const glAttachTarget = attachTargetToGL[attachTarget]; if (glAttachTarget === gl.DEPTH_ATTACHMENT || glAttachTarget === gl.DEPTH_STENCIL_ATTACHMENT) { if (capabilities.version < 2 && !capabilities.getExtension('WEBGL_depth_texture')) { console.warn('WebGLRenderTargets: extension WEBGL_depth_texture is not support.'); } } else if (glAttachTarget !== gl.STENCIL_ATTACHMENT) { drawBuffers.push(glAttachTarget); } const attachment = renderTarget._attachments[attachTarget]; if (attachment.isTexture) { const textureProperties = textures.setTexture(attachment); if (attachment.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_2D, textureProperties.__webglTexture, renderTarget.activeMipmapLevel); } else if (attachment.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachTarget, gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeLayer, textureProperties.__webglTexture, renderTarget.activeMipmapLevel); } else if (attachment.isTexture3D || attachment.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, glAttachTarget, textureProperties.__webglTexture, renderTarget.activeMipmapLevel, renderTarget.activeLayer); } state.bindTexture(textureProperties.__webglTarget, null); } else { const renderBufferProperties = renderBuffers.setRenderBuffer(attachment); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, glAttachTarget, gl.RENDERBUFFER, renderBufferProperties.__webglRenderbuffer); } } drawBuffers.sort(drawBufferSort); if (capabilities.version >= 2) { gl.drawBuffers(drawBuffers); } else if (capabilities.getExtension('WEBGL_draw_buffers')) { capabilities.getExtension('WEBGL_draw_buffers').drawBuffersWEBGL(drawBuffers); } } setRenderTarget(renderTarget) { const gl = this._gl; const state = this._state; const textures = this._textures; let renderTargetProperties; if (state.currentRenderTarget !== renderTarget) { if (renderTarget.isScreenRenderTarget) { gl.bindFramebuffer(gl.FRAMEBUFFER, null); } else { renderTargetProperties = this.get(renderTarget); if (renderTargetProperties.__webglFramebuffer === undefined) { this._setupRenderTarget(renderTarget); } else { gl.bindFramebuffer(gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); } } state.currentRenderTarget = renderTarget; } renderTargetProperties = this.get(renderTarget); if (renderTargetProperties.__external) return; const activeLayer = renderTarget.activeLayer; const activeMipmapLevel = renderTarget.activeMipmapLevel; if (renderTargetProperties.__currentActiveLayer !== activeLayer || renderTargetProperties.__currentActiveMipmapLevel !== activeMipmapLevel) { for (const attachTarget in renderTarget._attachments) { const attachment = renderTarget._attachments[attachTarget]; if (!attachment.isTexture) continue; const textureProperties = textures.get(attachment); if (attachment.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel); } else if (attachment.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeLayer, textureProperties.__webglTexture, activeMipmapLevel); } else if (attachment.isTexture3D || attachment.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachTargetToGL[attachTarget], textureProperties.__webglTexture, activeMipmapLevel, activeLayer); } } renderTargetProperties.__currentActiveLayer = activeLayer; renderTargetProperties.__currentActiveMipmapLevel = activeMipmapLevel; } } blitRenderTarget(read, draw, color = true, depth = true, stencil = true) { const gl = this._gl; const state = this._state; const capabilities = this._capabilities; if (capabilities.version < 2) { console.warn('WebGLRenderTargets: blitFramebuffer not support by WebGL' + capabilities.version); return; } let needRestoreFramebuffer = false; let readBuffer = this.get(read).__webglFramebuffer; if (!readBuffer) { this._setupRenderTarget(read); readBuffer = this.get(read).__webglFramebuffer; needRestoreFramebuffer = true; } let drawBuffer = this.get(draw).__webglFramebuffer; if (!drawBuffer) { this._setupRenderTarget(draw); drawBuffer = this.get(draw).__webglFramebuffer; needRestoreFramebuffer = true; } if (needRestoreFramebuffer) { // restore framebuffer binding const framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ? this.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); } gl.bindFramebuffer(gl.READ_FRAMEBUFFER, readBuffer); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, drawBuffer); let mask = 0; if (color) mask |= gl.COLOR_BUFFER_BIT; if (depth) mask |= gl.DEPTH_BUFFER_BIT; if (stencil) mask |= gl.STENCIL_BUFFER_BIT; // gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 0.0]); gl.blitFramebuffer( 0, 0, read.width, read.height, 0, 0, draw.width, draw.height, mask, gl.NEAREST ); } setFramebufferExternal(renderTarget, webglFramebuffer) { const renderTargetProperties = this.get(renderTarget); if (!renderTargetProperties.__external) { if (renderTargetProperties.__webglFramebuffer) { this._gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); } else { renderTarget.addEventListener('dispose', this._onRenderTargetDispose); } } renderTargetProperties.__webglFramebuffer = webglFramebuffer; renderTargetProperties.__external = true; } } const attachTargetToGL = { [ATTACHMENT.COLOR_ATTACHMENT0]: 0x8CE0, [ATTACHMENT.COLOR_ATTACHMENT1]: 0x8CE1, [ATTACHMENT.COLOR_ATTACHMENT2]: 0x8CE2, [ATTACHMENT.COLOR_ATTACHMENT3]: 0x8CE3, [ATTACHMENT.COLOR_ATTACHMENT4]: 0x8CE4, [ATTACHMENT.COLOR_ATTACHMENT5]: 0x8CE5, [ATTACHMENT.COLOR_ATTACHMENT6]: 0x8CE6, [ATTACHMENT.COLOR_ATTACHMENT7]: 0x8CE7, [ATTACHMENT.COLOR_ATTACHMENT8]: 0x8CE8, [ATTACHMENT.COLOR_ATTACHMENT9]: 0x8CE9, [ATTACHMENT.COLOR_ATTACHMENT10]: 0x8CEA, [ATTACHMENT.COLOR_ATTACHMENT11]: 0x8CEB, [ATTACHMENT.COLOR_ATTACHMENT12]: 0x8CEC, [ATTACHMENT.COLOR_ATTACHMENT13]: 0x8CED, [ATTACHMENT.COLOR_ATTACHMENT14]: 0x8CEE, [ATTACHMENT.COLOR_ATTACHMENT15]: 0x8CEF, [ATTACHMENT.DEPTH_ATTACHMENT]: 0x8D00, [ATTACHMENT.STENCIL_ATTACHMENT]: 0x8D20, [ATTACHMENT.DEPTH_STENCIL_ATTACHMENT]: 0x821A }; function drawBufferSort(a, b) { return a - b; } export { WebGLRenderTargets }; ================================================ FILE: src/webgl/WebGLRenderer.js ================================================ import { WebGLPrograms } from './WebGLPrograms.js'; import { WebGLCapabilities } from './WebGLCapabilities.js'; import { WebGLConstants } from './WebGLConstants.js'; import { WebGLState } from './WebGLState.js'; import { WebGLTextures } from './WebGLTextures.js'; import { WebGLRenderBuffers } from './WebGLRenderBuffers.js'; import { WebGLRenderTargets } from './WebGLRenderTargets.js'; import { WebGLBuffers } from './WebGLBuffers.js'; import { WebGLGeometries } from './WebGLGeometries.js'; import { WebGLMaterials } from './WebGLMaterials.js'; import { WebGLVertexArrayBindings } from './WebGLVertexArrayBindings.js'; import { WebGLQuerySets } from './WebGLQuerySets.js'; import { WebGLLights } from './WebGLLights.js'; import { Vector4 } from '../math/Vector4.js'; import { Matrix4 } from '../math/Matrix4.js'; import { Matrix3 } from '../math/Matrix3.js'; import { MathUtils } from '../math/MathUtils.js'; import { ThinRenderer } from '../render/ThinRenderer.js'; import { LightingGroup } from '../render/LightingGroup.js'; import { TEXTURE_FILTER } from '../const.js'; const helpVector4 = new Vector4(); const helpMatrix3 = new Matrix3(); const helpMatrix4 = new Matrix4(); const influencesList = new WeakMap(); const morphInfluences = new Float32Array(8); const _envData = { map: null, diffuse: 1, specular: 1 }; let _clippingPlanesData = new Float32Array([]); function defaultGetGeometry(renderable) { return renderable.geometry; } function defaultGetMaterial(renderable) { return renderable.material; } function defaultIfRender(renderable) { return true; } const _emptyLightingGroup = new LightingGroup(); function getLightingGroup(lighting, material) { if (!material.acceptLight) { return _emptyLightingGroup; } const lightingGroup = lighting.getGroup(material.lightingGroup); if (lightingGroup && lightingGroup.totalNum > 0) { return lightingGroup; } return _emptyLightingGroup; } function clientWaitAsync(gl) { const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0); gl.flush(); return new Promise(function(resolve, reject) { function test() { const res = gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0); if (res === gl.WAIT_FAILED) { gl.deleteSync(sync); reject(); return; } if (res === gl.TIMEOUT_EXPIRED) { requestAnimationFrame(test); return; } gl.deleteSync(sync); resolve(); } test(); }); } /** * The WebGL renderer. * @extends ThinRenderer */ class WebGLRenderer extends ThinRenderer { /** * Create a WebGLRenderer. * @param {WebGLRenderingContext} [context] - The WebGL Rendering Context privided by canvas. * If not provided, you must call {@link WebGLRenderer.init} method with a valid context * before using this renderer. */ constructor(context) { super(); /** * An object containing details about the capabilities of the current RenderingContext. * @type {WebGLCapabilities} */ this.capabilities = {}; this._textures = null; this._renderBuffers = null; this._renderTargets = null; this._buffers = null; this._geometries = null; this._lights = null; this._programs = null; this._materials = null; this._state = null; this._vertexArrayBindings = null; if (context) { this.init(context); } // Cache current material if beginRender is called. this._currentMaterial = null; this._currentOcclusionQuerySet = null; this._currentTimestampWrites = { querySet: null, beginningOfPassWriteIndex: -1, endOfPassWriteIndex: -1 }; } init(context, options = {}) { if (!context) { context = this.context; } if (!context) { throw new Error('WebGLRenderer.init: context must be provided.'); } this.context = context; const prefix = `_gl${this.increaseId()}`; const capabilities = new WebGLCapabilities(context); const constants = new WebGLConstants(context, capabilities); const state = new WebGLState(context, capabilities); const textures = new WebGLTextures(prefix, context, state, capabilities, constants); const renderBuffers = new WebGLRenderBuffers(prefix, context, capabilities, constants); const renderTargets = new WebGLRenderTargets(prefix, context, state, capabilities, textures, renderBuffers, constants); const buffers = new WebGLBuffers(prefix, context, capabilities); const vertexArrayBindings = new WebGLVertexArrayBindings(prefix, context, capabilities, buffers); const geometries = new WebGLGeometries(prefix, context, buffers, vertexArrayBindings); const lights = new WebGLLights(prefix, capabilities, textures); const programs = new WebGLPrograms(context, state, capabilities); const materials = new WebGLMaterials(prefix, programs, vertexArrayBindings); const querySets = new WebGLQuerySets(prefix, context, capabilities); this.capabilities = capabilities; this._constants = constants; this._textures = textures; this._renderBuffers = renderBuffers; this._renderTargets = renderTargets; this._buffers = buffers; this._geometries = geometries; this._lights = lights; this._programs = programs; this._materials = materials; this._state = state; this._vertexArrayBindings = vertexArrayBindings; this._querySets = querySets; return Promise.resolve(this); } beginRender(renderTarget) { super.beginRender(renderTarget); if (renderTarget) { this._renderTargets.setRenderTarget(renderTarget); const gl = this.context; const state = this._state; let clearBits = 0; if (renderTarget.clearColor) { state.colorBuffer.setClear( renderTarget.colorClearValue.r, renderTarget.colorClearValue.g, renderTarget.colorClearValue.b, renderTarget.colorClearValue.a ); clearBits |= gl.COLOR_BUFFER_BIT; } if (renderTarget.clearDepth) { state.depthBuffer.setClear(renderTarget.depthClearValue); clearBits |= gl.DEPTH_BUFFER_BIT; } if (renderTarget.clearStencil) { state.stencilBuffer.setClear(renderTarget.stencilClearValue); clearBits |= gl.STENCIL_BUFFER_BIT; } if (clearBits > 0) { // Prevent warning when bits is equal to zero gl.clear(clearBits); } this._currentOcclusionQuerySet = renderTarget.occlusionQuerySet; this._currentTimestampWrites.querySet = renderTarget.timestampWrites.querySet; this._currentTimestampWrites.beginningOfPassWriteIndex = renderTarget.timestampWrites.beginningOfPassWriteIndex; this._currentTimestampWrites.endOfPassWriteIndex = renderTarget.timestampWrites.endOfPassWriteIndex; } if (this._currentOcclusionQuerySet) { this._querySets.setQuerySet(this._currentOcclusionQuerySet); } if (this._currentTimestampWrites.querySet) { this._querySets.setQuerySet(this._currentTimestampWrites.querySet); if (this.capabilities.canUseTimestamp) { this._querySets.queryCounter( this._currentTimestampWrites.querySet, this._currentTimestampWrites.beginningOfPassWriteIndex ); } else { // fallback to use TIME_ELAPSED_EXT this._querySets.beginQuery( this._currentTimestampWrites.querySet, this._currentTimestampWrites.endOfPassWriteIndex ); } } } endRender() { if (this._currentTimestampWrites.querySet) { if (this.capabilities.canUseTimestamp) { this._querySets.queryCounter( this._currentTimestampWrites.querySet, this._currentTimestampWrites.endOfPassWriteIndex ); } else { // fallback to use TIME_ELAPSED_EXT this._querySets.endQuery(this._currentTimestampWrites.querySet); } } // Ensure depth buffer writing is enabled so it can be cleared on next render const state = this._state; state.depthBuffer.setTest(true); state.depthBuffer.setMask(true); state.colorBuffer.setMask(true); this._currentMaterial = null; // Automatically clear the occlusion query set and timestamp writes this._currentOcclusionQuerySet = null; this._currentTimestampWrites.querySet = null; super.endRender(); } renderRenderableItem(renderable, renderStates, options) { const state = this._state; const capabilities = this.capabilities; const vertexArrayBindings = this._vertexArrayBindings; const textures = this._textures; const passInfo = this._passInfo; const getGeometry = options.getGeometry || defaultGetGeometry; const getMaterial = options.getMaterial || defaultGetMaterial; const beforeRender = options.beforeRender; const afterRender = options.afterRender; const ifRender = options.ifRender || defaultIfRender; const renderInfo = options.renderInfo; const sceneData = renderStates.scene; const cameraData = renderStates.camera; const currentRenderTarget = state.currentRenderTarget; if (!ifRender(renderable)) { return; } if (!passInfo.enabled) { console.warn('WebGLRenderer: beginRender must be called before renderRenderableItem.'); return; } const object = renderable.object; const material = getMaterial.call(this, renderable); const geometry = getGeometry.call(this, renderable); const group = renderable.group; const fog = material.fog ? sceneData.fog : null; const lightingGroup = getLightingGroup(renderStates.lighting, material); const lightingState = this._lights.setLightingGroup(lightingGroup, passInfo, this.lightingOptions, cameraData).state; const hasLighting = lightingState.hasLight(); const hasShadow = lightingState.hasShadow() && object.receiveShadow; _envData.map = material.envMap !== undefined ? (material.envMap || sceneData.environment) : null; _envData.diffuse = sceneData.envDiffuseIntensity * material.envMapIntensity; _envData.specular = sceneData.envSpecularIntensity * material.envMapIntensity; let clippingPlanesData = sceneData.clippingPlanesData; let numClippingPlanes = sceneData.numClippingPlanes; if (material.clippingPlanes && material.clippingPlanes.length > 0) { if (_clippingPlanesData.length < material.clippingPlanes.length * 4) { _clippingPlanesData = new Float32Array(material.clippingPlanes.length * 4); } clippingPlanesData = sceneData.setClippingPlanesData(material.clippingPlanes, _clippingPlanesData); numClippingPlanes = material.clippingPlanes.length; } object.onBeforeRender(renderable, material); beforeRender && beforeRender.call(this, renderable, material); // Check material version const materialProperties = this._materials.setMaterial(material); if (material.needsUpdate === false) { if (materialProperties.currentProgram === undefined) { material.needsUpdate = true; } else if (materialProperties.fog !== fog) { material.needsUpdate = true; } else if (materialProperties.envMap !== _envData.map) { material.needsUpdate = true; } else if (materialProperties.numClippingPlanes !== numClippingPlanes) { material.needsUpdate = true; } else if (materialProperties.logarithmicDepthBuffer !== sceneData.logarithmicDepthBuffer) { material.needsUpdate = true; } else if (renderStates.outputEncoding !== materialProperties.outputEncoding || renderStates.gammaFactor !== materialProperties.gammaFactor) { material.needsUpdate = true; } else if (capabilities.version > 1 && sceneData.disableShadowSampler !== materialProperties.disableShadowSampler) { material.needsUpdate = true; } else { if (hasLighting !== materialProperties.hasLighting) { material.needsUpdate = true; } else if (hasLighting) { if (!lightingState.compare(materialProperties.lightingFactors)) { material.needsUpdate = true; } else if (hasShadow !== materialProperties.hasShadow) { material.needsUpdate = true; } else if (hasShadow) { material.needsUpdate = materialProperties.shadowType !== object.shadowType; } } } } // Update program if needed. if (material.needsUpdate) { this._materials.updateProgram(material, object, lightingState, renderStates, this.shaderCompileOptions); materialProperties.fog = fog; materialProperties.envMap = _envData.map; materialProperties.logarithmicDepthBuffer = sceneData.logarithmicDepthBuffer; materialProperties.hasLighting = hasLighting; materialProperties.lightingFactors = lightingState.copyTo(materialProperties.lightingFactors); materialProperties.hasShadow = hasShadow; materialProperties.shadowType = object.shadowType; materialProperties.numClippingPlanes = numClippingPlanes; materialProperties.outputEncoding = renderStates.outputEncoding; materialProperties.gammaFactor = renderStates.gammaFactor; materialProperties.disableShadowSampler = sceneData.disableShadowSampler; material.needsUpdate = false; } const program = materialProperties.currentProgram; if (options.onlyCompile || !program.isReady(capabilities.parallelShaderCompileExt)) return; state.setProgram(program); this._geometries.setGeometry(geometry, passInfo); // update morph targets if (object.morphTargetInfluences) { this._updateMorphtargets(object, geometry, program); } vertexArrayBindings.setup(object, geometry, program); let refreshCamera = false; if (program.cameraId !== cameraData.id || program.cameraVersion !== cameraData.version) { refreshCamera = true; program.cameraId = cameraData.id; program.cameraVersion = cameraData.version; } let refreshScene = false; if (program.sceneId !== sceneData.id || program.sceneVersion !== sceneData.version) { refreshScene = true; program.sceneId = sceneData.id; program.sceneVersion = sceneData.version; } let refreshMaterial = true; if (!material.forceUpdateUniforms) { if (materialProperties.pass !== passInfo.count) { materialProperties.pass = passInfo.count; } else { refreshMaterial = this._currentMaterial !== material; } } this._currentMaterial = material; const uniforms = program.getUniforms(); // upload light uniforms if (hasLighting) { this._lights.uploadUniforms(program, lightingGroup, sceneData.disableShadowSampler); } // upload bone matrices if (object.isSkinnedMesh) { this._uploadSkeleton(uniforms, object, sceneData); } // upload other uniforms for (let n = 0, ll = uniforms.seq.length; n < ll; n++) { const uniform = uniforms.seq[n]; const key = uniform.id; const internalGroup = uniform.internalGroup; // upload custom uniforms if (material.uniforms && material.uniforms[key] !== undefined) { uniform.set(material.uniforms[key], textures); continue; } // u_Model: always upload this matrix if (internalGroup === 1) { let modelMatrix = object.worldMatrix; if (sceneData.useAnchorMatrix) { modelMatrix = helpMatrix4.copy(modelMatrix).premultiply(sceneData.anchorMatrixInverse); } uniform.set(modelMatrix.elements); continue; } // uniforms about camera data if (internalGroup === 2 && refreshCamera) { uniform.internalFun(cameraData); continue; } // uniforms about scene data if (internalGroup === 3 && refreshScene) { uniform.internalFun(sceneData); continue; } // uniforms about material if (internalGroup === 4 && refreshMaterial) { uniform.internalFun(material, textures); continue; } // uniforms about environment map if (internalGroup === 5) { uniform.internalFun(_envData, textures); continue; } // other internal uniforms if (key === 'clippingPlanes') { uniform.set(clippingPlanesData); } else if (key === 'u_RenderTargetSize') { uniform.setValue(currentRenderTarget.width, currentRenderTarget.height); } } const frontFaceCW = helpMatrix3.setFromMatrix4(object.worldMatrix).determinant() < 0; state.setMaterial(material, frontFaceCW); const viewport = helpVector4.set( currentRenderTarget.width, currentRenderTarget.height, currentRenderTarget.width, currentRenderTarget.height ).multiply(cameraData.rect); viewport.z -= viewport.x; viewport.w -= viewport.y; state.viewport(viewport.round()); this._draw(geometry, material, group, renderInfo); textures.resetTextureUnits(); afterRender && afterRender.call(this, renderable); object.onAfterRender(renderable); } blitRenderTarget(read, draw, color = true, depth = true, stencil = true) { this._renderTargets.blitRenderTarget(read, draw, color, depth, stencil); } generateMipmaps(texture) { const state = this._state; const capabilities = this.capabilities; const textures = this._textures; const textureProperties = textures.get(texture); if (!textureProperties.__webglTexture) return; const powerOfTwo = MathUtils.isPowerOfTwo(textureProperties.__width) && MathUtils.isPowerOfTwo(textureProperties.__height); if ( texture.generateMipmaps && texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR && (powerOfTwo || capabilities.version >= 2) ) { const target = textureProperties.__webglTarget; state.bindTexture(target, textureProperties.__webglTexture); textures.generateMipmaps(texture); state.bindTexture(target, null); } } readTexturePixels(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) { const gl = this.context; const constants = this._constants; const state = this._state; const renderTargets = this._renderTargets; const textures = this._textures; if (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) { return Promise.reject('WebGLRenderer.readTexturePixels: Unsupported texture.'); } const glType = constants.getGLType(texture.type); const glFormat = constants.getGLFormat(texture.format); const textureProperties = textures.get(texture); if (textureProperties.__readBuffer === undefined) { textureProperties.__readBuffer = gl.createBuffer(); } gl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer); gl.bufferData(gl.PIXEL_PACK_BUFFER, buffer.byteLength, gl.STREAM_READ); gl.readPixels(x, y, width, height, glFormat, glType, 0); // restore framebuffer binding const framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ? renderTargets.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); return clientWaitAsync(gl).then(() => { if (!textureProperties.__readBuffer) { throw new Error('WebGLRenderer.readTexturePixels: Texture has been disposed.'); } gl.bindBuffer(gl.PIXEL_PACK_BUFFER, textureProperties.__readBuffer); gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, buffer); gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null); return buffer; }); } readTexturePixelsSync(texture, x, y, width, height, buffer, zIndex = 0, mipLevel = 0) { const gl = this.context; const constants = this._constants; const state = this._state; const renderTargets = this._renderTargets; if (!this._bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel)) { console.warn('WebGLRenderer.readTexturePixels: Unsupported texture.'); return buffer; } const glType = constants.getGLType(texture.type); const glFormat = constants.getGLFormat(texture.format); gl.readPixels(x, y, width, height, glFormat, glType, buffer); // restore framebuffer binding const framebuffer = (state.currentRenderTarget && !state.currentRenderTarget.isScreenRenderTarget) ? renderTargets.get(state.currentRenderTarget).__webglFramebuffer : null; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); return buffer; } resetVertexArrayBindings(force) { this._vertexArrayBindings.reset(force); } resetState() { this._state.reset(); } beginOcclusionQuery(index) { const querySet = this._currentOcclusionQuerySet; if (!querySet) return; this._querySets.beginQuery(querySet, index); } endOcclusionQuery() { const querySet = this._currentOcclusionQuerySet; if (!querySet) return; this._querySets.endQuery(querySet); } async readQuerySetResults(querySet, dstBuffer, firstQuery = 0, queryCount = querySet.count) { return this._querySets.readQuerySetResults(querySet, dstBuffer, firstQuery, queryCount); } /** * Bind webglTexture to Texture. * @param {TextureBase} texture * @param {WebGLTexture} webglTexture */ setTextureExternal(texture, webglTexture) { this._textures.setTextureExternal(texture, webglTexture); } /** * Bind webglRenderbuffer to RenderBuffer. * @param {RenderBuffer} renderBuffer * @param {WebGLRenderbuffer} webglRenderbuffer */ setRenderBufferExternal(renderBuffer, webglRenderbuffer) { this._renderBuffers.setRenderBufferExternal(renderBuffer, webglRenderbuffer); } /** * Bind webglBuffer to Buffer. * @param {Buffer} buffer * @param {WebGLBuffer} webglBuffer */ setBufferExternal(buffer, webglBuffer) { this._buffers.setBufferExternal(buffer, webglBuffer); } /** * Bind webglFramebuffer to RenderTarget. * @param {RenderTarget} renderTarget * @param {WebGLFramebuffer} webglFramebuffer */ setFramebufferExternal(renderTarget, webglFramebuffer) { this._renderTargets.setFramebufferExternal(renderTarget, webglFramebuffer); } _uploadSkeleton(uniforms, object, sceneData) { if (object.skeleton && object.skeleton.bones.length > 0) { const skeleton = object.skeleton; const capabilities = this.capabilities; if (capabilities.maxVertexTextures > 0 && (!!capabilities.getExtension('OES_texture_float') || capabilities.version >= 2)) { if (skeleton.boneTexture === undefined) { skeleton.generateBoneTexture(capabilities.version >= 2); } uniforms.set('boneTexture', skeleton.boneTexture, this._textures); uniforms.set('boneTextureSize', skeleton.boneTexture.image.width); } else { uniforms.set('boneMatrices', skeleton.boneMatrices); } uniforms.set('bindMatrix', object.bindMatrix.elements); helpMatrix4.copy(object.bindMatrixInverse); if (sceneData.useAnchorMatrix) { helpMatrix4.multiply(sceneData.anchorMatrix); // convert to anchor space } uniforms.set('bindMatrixInverse', helpMatrix4.elements); } } _updateMorphtargets(object, geometry, program) { const objectInfluences = object.morphTargetInfluences; if (!influencesList.has(geometry)) { influencesList.set(geometry, objectInfluences.slice(0)); } const morphTargets = geometry.morphAttributes.position; const morphNormals = geometry.morphAttributes.normal; // Remove current morphAttributes const influences = influencesList.get(geometry); for (let i = 0; i < influences.length; i++) { const influence = influences[i]; if (influence !== 0) { if (morphTargets) geometry.removeAttribute('morphTarget' + i); if (morphNormals) geometry.removeAttribute('morphNormal' + i); } } // Collect influences for (let i = 0; i < objectInfluences.length; i++) { influences[i] = objectInfluences[i]; } influences.length = objectInfluences.length; // Add morphAttributes let count = 0; for (let i = 0; i < influences.length; i++) { const influence = influences[i]; if (influence > 0) { if (morphTargets) geometry.addAttribute('morphTarget' + count, morphTargets[i]); if (morphNormals) geometry.addAttribute('morphNormal' + count, morphNormals[i]); morphInfluences[count] = influence; count++; } } for (; count < 8; count++) { morphInfluences[count] = 0; } program.getUniforms().set('morphTargetInfluences', morphInfluences); } _draw(geometry, material, group, renderInfo) { const gl = this.context; const capabilities = this.capabilities; const buffers = this._buffers; const instanceCount = geometry.instanceCount; const useInstancing = instanceCount >= 0; const useGroup = !!group; const useMultiDraw = useGroup && group.multiDrawCount !== undefined; const useIndexBuffer = geometry.index !== null; let drawStart = 0; let drawCount = Infinity; if (!useMultiDraw) { const position = geometry.getAttribute('a_Position'); if (useIndexBuffer) { drawCount = geometry.index.buffer.count; } else if (position) { drawCount = position.buffer.count; } if (useGroup) { drawStart = Math.max(drawStart, group.start); drawCount = Math.min(drawCount, group.count); } if (drawCount < 0 || drawCount === Infinity) return; } if (useIndexBuffer) { const indexBufferProperties = buffers.get(geometry.index.buffer); const bytesPerElement = indexBufferProperties.bytesPerElement; const type = indexBufferProperties.type; if (type === gl.UNSIGNED_INT) { if (capabilities.version < 2 && !capabilities.getExtension('OES_element_index_uint')) { console.warn('WebGLRenderer: draw elements type not support UNSIGNED_INT!'); } } if (useInstancing) { if (instanceCount <= 0) return; if (capabilities.version >= 2) { gl.drawElementsInstanced(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').drawElementsInstancedANGLE(material.drawMode, drawCount, type, drawStart * bytesPerElement, instanceCount); } else { console.warn('WebGLRenderer: using instanced draw but hardware does not support.'); return; } } else if (useMultiDraw) { if (group.multiDrawCount <= 0) return; const extension = capabilities.getExtension('WEBGL_multi_draw'); if (!extension) { console.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.'); return; } extension.multiDrawElementsWEBGL(material.drawMode, group.multiDrawCounts, 0, type, group.multiDrawStarts, 0, group.multiDrawCount); } else { gl.drawElements(material.drawMode, drawCount, type, drawStart * bytesPerElement); } } else { if (useInstancing) { if (instanceCount <= 0) return; if (capabilities.version >= 2) { gl.drawArraysInstanced(material.drawMode, drawStart, drawCount, instanceCount); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').drawArraysInstancedANGLE(material.drawMode, drawStart, drawCount, instanceCount); } else { console.warn('WebGLRenderer: using instanced draw but hardware does not support.'); return; } } else if (useMultiDraw) { if (group.multiDrawCount <= 0) return; const extension = capabilities.getExtension('WEBGL_multi_draw'); if (!extension) { console.warn('WebGLRenderer: using multi draw but hardware does not support extension WEBGL_multi_draw.'); return; } extension.multiDrawArraysWEBGL(material.drawMode, group.multiDrawStarts, 0, group.multiDrawCounts, 0, group.multiDrawCount); } else { gl.drawArrays(material.drawMode, drawStart, drawCount); } } if (renderInfo) { if (useMultiDraw) { drawCount = 0; for (let i = 0; i < group.multiDrawCount; i++) { drawCount += group.multiDrawCounts[i]; } } renderInfo.update(drawCount, material.drawMode, instanceCount < 0 ? 1 : instanceCount); } } _bindTextureToDummyFrameBuffer(texture, zIndex, mipLevel) { if (!texture.isTexture) return false; const gl = this.context; const textures = this._textures; const state = this._state; if (!this._dummyFrameBuffer) { this._dummyFrameBuffer = gl.createFramebuffer(); } gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFrameBuffer); const textureProperties = textures.setTexture(texture); if (texture.isTexture2D) { gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureProperties.__webglTexture, mipLevel); } else if (texture.isTextureCube) { gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + zIndex, textureProperties.__webglTexture, mipLevel); } else if (texture.isTexture3D || texture.isTexture2DArray) { gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, mipLevel, zIndex); } state.bindTexture(textureProperties.__webglTarget, null); return true; } } export { WebGLRenderer }; ================================================ FILE: src/webgl/WebGLState.js ================================================ import { BLEND_TYPE, CULL_FACE_TYPE, DRAW_SIDE, COMPARE_FUNC, BLEND_EQUATION, BLEND_FACTOR } from '../const.js'; import { Vector4 } from '../math/Vector4.js'; function createTexture(gl, type, target, count) { const data = new Uint8Array(4); // 4 is required to match default unpack alignment of 4. const texture = gl.createTexture(); gl.bindTexture(type, texture); gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST); for (let i = 0; i < count; i++) { gl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); } return texture; } function ColorBuffer(gl) { let locked = false; const color = new Vector4(); let currentColorMask = null; const currentColorClear = new Vector4(0, 0, 0, 0); return { setMask: function(colorMask) { if (currentColorMask !== colorMask && !locked) { gl.colorMask(colorMask, colorMask, colorMask, colorMask); currentColorMask = colorMask; } }, setLocked: function(lock) { locked = lock; }, setClear: function(r, g, b, a, premultipliedAlpha) { if (premultipliedAlpha === true) { r *= a; g *= a; b *= a; } color.set(r, g, b, a); if (currentColorClear.equals(color) === false) { gl.clearColor(r, g, b, a); currentColorClear.copy(color); } }, getClear: function() { return currentColorClear; }, reset: function() { locked = false; currentColorMask = null; currentColorClear.set(-1, 0, 0, 0); // set to invalid state } }; } function DepthBuffer(gl, state) { let locked = false; let currentDepthMask = null; let currentDepthFunc = null; let currentDepthClear = null; return { setTest: function(depthTest) { if (depthTest) { state.enable(gl.DEPTH_TEST); } else { state.disable(gl.DEPTH_TEST); } }, setMask: function(depthMask) { if (currentDepthMask !== depthMask && !locked) { gl.depthMask(depthMask); currentDepthMask = depthMask; } }, setFunc: function(depthFunc) { if (currentDepthFunc !== depthFunc) { gl.depthFunc(depthFunc); currentDepthFunc = depthFunc; } }, setLocked: function(lock) { locked = lock; }, setClear: function(depth) { if (currentDepthClear !== depth) { gl.clearDepth(depth); currentDepthClear = depth; } }, reset: function() { locked = false; currentDepthMask = null; currentDepthFunc = null; currentDepthClear = null; } }; } function StencilBuffer(gl, state) { let locked = false; let currentStencilMask = null; let currentStencilFunc = null; let currentStencilRef = null; let currentStencilFuncMask = null; let currentStencilFail = null; let currentStencilZFail = null; let currentStencilZPass = null; let currentStencilFuncBack = null; let currentStencilRefBack = null; let currentStencilFuncMaskBack = null; let currentStencilFailBack = null; let currentStencilZFailBack = null; let currentStencilZPassBack = null; let currentStencilClear = null; return { setTest: function(stencilTest) { if (stencilTest) { state.enable(gl.STENCIL_TEST); } else { state.disable(gl.STENCIL_TEST); } }, setMask: function(stencilMask) { if (currentStencilMask !== stencilMask && !locked) { gl.stencilMask(stencilMask); currentStencilMask = stencilMask; } }, setFunc: function(stencilFunc, stencilRef, stencilMask, stencilFuncBack, stencilRefBack, stencilMaskBack) { if (currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask || currentStencilFuncBack !== stencilFuncBack || currentStencilRefBack !== stencilRefBack || currentStencilFuncMaskBack !== stencilMaskBack) { if (stencilFuncBack === null || stencilRefBack === null || stencilMaskBack === null) { gl.stencilFunc(stencilFunc, stencilRef, stencilMask); } else { gl.stencilFuncSeparate(gl.FRONT, stencilFunc, stencilRef, stencilMask); gl.stencilFuncSeparate(gl.BACK, stencilFuncBack, stencilRefBack, stencilMaskBack); } currentStencilFunc = stencilFunc; currentStencilRef = stencilRef; currentStencilFuncMask = stencilMask; currentStencilFuncBack = stencilFuncBack; currentStencilRefBack = stencilRefBack; currentStencilFuncMaskBack = stencilMaskBack; } }, setOp: function(stencilFail, stencilZFail, stencilZPass, stencilFailBack, stencilZFailBack, stencilZPassBack) { if (currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass || currentStencilFailBack !== stencilFailBack || currentStencilZFailBack !== stencilZFailBack || currentStencilZPassBack !== stencilZPassBack) { if (stencilFailBack === null || stencilZFailBack === null || stencilZPassBack === null) { gl.stencilOp(stencilFail, stencilZFail, stencilZPass); } else { gl.stencilOpSeparate(gl.FRONT, stencilFail, stencilZFail, stencilZPass); gl.stencilOpSeparate(gl.BACK, stencilFailBack, stencilZFailBack, stencilZPassBack); } currentStencilFail = stencilFail; currentStencilZFail = stencilZFail; currentStencilZPass = stencilZPass; currentStencilFailBack = stencilFailBack; currentStencilZFailBack = stencilZFailBack; currentStencilZPassBack = stencilZPassBack; } }, setLocked: function(lock) { locked = lock; }, setClear: function(stencil) { if (currentStencilClear !== stencil) { gl.clearStencil(stencil); currentStencilClear = stencil; } }, reset: function() { locked = false; currentStencilMask = null; currentStencilFunc = null; currentStencilRef = null; currentStencilFuncMask = null; currentStencilFail = null; currentStencilZFail = null; currentStencilZPass = null; currentStencilFuncBack = null; currentStencilRefBack = null; currentStencilFuncMaskBack = null; currentStencilFailBack = null; currentStencilZFailBack = null; currentStencilZPassBack = null; currentStencilClear = null; } }; } class WebGLState { constructor(gl, capabilities) { this.gl = gl; this.capabilities = capabilities; this.colorBuffer = new ColorBuffer(gl); this.depthBuffer = new DepthBuffer(gl, this); this.stencilBuffer = new StencilBuffer(gl, this); this.states = {}; this.currentBlending = null; this.currentBlendEquation = null; this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendEquationAlpha = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; this.currentPremultipliedAlpha = null; this.currentFlipSided = false; this.currentCullFace = null; const viewportParam = gl.getParameter(gl.VIEWPORT); this.currentViewport = new Vector4().fromArray(viewportParam); this.currentLineWidth = null; this.currentPolygonOffsetFactor = null; this.currentPolygonOffsetUnits = null; this.currentProgram = null; this.currentBoundBuffers = {}; this.currentRenderTarget = null; // used in WebGLRenderTargets this.currentTextureSlot = null; this.currentBoundTextures = {}; this.emptyTextures = {}; this.emptyTextures[gl.TEXTURE_2D] = createTexture(gl, gl.TEXTURE_2D, gl.TEXTURE_2D, 1); this.emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl, gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6); this.blendEquationToGL = { [BLEND_EQUATION.ADD]: gl.FUNC_ADD, [BLEND_EQUATION.SUBTRACT]: gl.FUNC_SUBTRACT, [BLEND_EQUATION.REVERSE_SUBTRACT]: gl.FUNC_REVERSE_SUBTRACT, [BLEND_EQUATION.MIN]: gl.MIN, [BLEND_EQUATION.MAX]: gl.MAX }; this.blendFactorToGL = { [BLEND_FACTOR.ZERO]: gl.ZERO, [BLEND_FACTOR.ONE]: gl.ONE, [BLEND_FACTOR.SRC_COLOR]: gl.SRC_COLOR, [BLEND_FACTOR.SRC_ALPHA]: gl.SRC_ALPHA, [BLEND_FACTOR.SRC_ALPHA_SATURATE]: gl.SRC_ALPHA_SATURATE, [BLEND_FACTOR.DST_COLOR]: gl.DST_COLOR, [BLEND_FACTOR.DST_ALPHA]: gl.DST_ALPHA, [BLEND_FACTOR.ONE_MINUS_SRC_COLOR]: gl.ONE_MINUS_SRC_COLOR, [BLEND_FACTOR.ONE_MINUS_SRC_ALPHA]: gl.ONE_MINUS_SRC_ALPHA, [BLEND_FACTOR.ONE_MINUS_DST_COLOR]: gl.ONE_MINUS_DST_COLOR, [BLEND_FACTOR.ONE_MINUS_DST_ALPHA]: gl.ONE_MINUS_DST_ALPHA }; // init this.colorBuffer.setClear(0, 0, 0, 1); this.depthBuffer.setClear(1); this.stencilBuffer.setClear(0); this.depthBuffer.setTest(true); this.depthBuffer.setFunc(COMPARE_FUNC.LEQUAL); this.setFlipSided(false); this.setCullFace(CULL_FACE_TYPE.BACK); } enable(id) { if (this.states[id] !== true) { this.gl.enable(id); this.states[id] = true; } } disable(id) { if (this.states[id] !== false) { this.gl.disable(id); this.states[id] = false; } } setBlending(blend, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha) { const gl = this.gl; if (blend === BLEND_TYPE.NONE) { this.disable(gl.BLEND); return; } this.enable(gl.BLEND); if (blend !== BLEND_TYPE.CUSTOM) { if (blend !== this.currentBlending || premultipliedAlpha !== this.currentPremultipliedAlpha) { if (this.currentBlendEquation !== BLEND_EQUATION.ADD || this.currentBlendEquationAlpha !== BLEND_EQUATION.ADD) { gl.blendEquation(gl.FUNC_ADD); this.currentBlendEquation = BLEND_EQUATION.ADD; this.currentBlendEquationAlpha = BLEND_EQUATION.ADD; } if (blend === BLEND_TYPE.NORMAL) { if (premultipliedAlpha) { gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); } else { gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); } } else if (blend === BLEND_TYPE.ADD) { if (premultipliedAlpha) { gl.blendFunc(gl.ONE, gl.ONE); } else { gl.blendFunc(gl.SRC_ALPHA, gl.ONE); } } else if (blend === BLEND_TYPE.SUB) { gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE); } else if (blend === BLEND_TYPE.MUL) { if (premultipliedAlpha) { gl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA); } else { gl.blendFunc(gl.ZERO, gl.SRC_COLOR); } } else { console.error('WebGLState: Invalid blending: ', blend); } } this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; } else { blendEquationAlpha = blendEquationAlpha || blendEquation; blendSrcAlpha = blendSrcAlpha || blendSrc; blendDstAlpha = blendDstAlpha || blendDst; const equationToGL = this.blendEquationToGL; const factorToGL = this.blendFactorToGL; if (blendEquation !== this.currentBlendEquation || blendEquationAlpha !== this.currentBlendEquationAlpha) { gl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]); this.currentBlendEquation = blendEquation; this.currentBlendEquationAlpha = blendEquationAlpha; } if (blendSrc !== this.currentBlendSrc || blendDst !== this.currentBlendDst || blendSrcAlpha !== this.currentBlendSrcAlpha || blendDstAlpha !== this.currentBlendDstAlpha) { gl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]); this.currentBlendSrc = blendSrc; this.currentBlendDst = blendDst; this.currentBlendSrcAlpha = blendSrcAlpha; this.currentBlendDstAlpha = blendDstAlpha; } } this.currentBlending = blend; this.currentPremultipliedAlpha = premultipliedAlpha; } setFlipSided(flipSided) { const gl = this.gl; if (this.currentFlipSided !== flipSided) { if (flipSided) { gl.frontFace(gl.CW); } else { gl.frontFace(gl.CCW); } this.currentFlipSided = flipSided; } } setCullFace(cullFace) { const gl = this.gl; if (cullFace !== CULL_FACE_TYPE.NONE) { this.enable(gl.CULL_FACE); if (cullFace !== this.currentCullFace) { if (cullFace === CULL_FACE_TYPE.BACK) { gl.cullFace(gl.BACK); } else if (cullFace === CULL_FACE_TYPE.FRONT) { gl.cullFace(gl.FRONT); } else { gl.cullFace(gl.FRONT_AND_BACK); } } } else { this.disable(gl.CULL_FACE); } this.currentCullFace = cullFace; } viewport(viewport) { const currentViewport = this.currentViewport; if (currentViewport.equals(viewport)) return; this.gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w); currentViewport.copy(viewport); } setLineWidth(width) { if (width !== this.currentLineWidth) { const lineWidthRange = this.capabilities.lineWidthRange; if (lineWidthRange[0] <= width && width <= lineWidthRange[1]) { this.gl.lineWidth(width); } else { console.warn('GL_ALIASED_LINE_WIDTH_RANGE is [' + lineWidthRange[0] + ',' + lineWidthRange[1] + '], but set to ' + width + '.'); } this.currentLineWidth = width; } } setPolygonOffset(polygonOffset, factor, units) { const gl = this.gl; if (polygonOffset) { this.enable(gl.POLYGON_OFFSET_FILL); if (this.currentPolygonOffsetFactor !== factor || this.currentPolygonOffsetUnits !== units) { gl.polygonOffset(factor, units); this.currentPolygonOffsetFactor = factor; this.currentPolygonOffsetUnits = units; } } else { this.disable(gl.POLYGON_OFFSET_FILL); } } setProgram(program) { if (this.currentProgram !== program) { this.gl.useProgram(program.program); this.currentProgram = program; } } bindBuffer(type, buffer) { const gl = this.gl; const boundBuffer = this.currentBoundBuffers[type]; if (boundBuffer !== buffer) { gl.bindBuffer(type, buffer); this.currentBoundBuffers[type] = buffer; } } activeTexture(slot) { const gl = this.gl; if (slot === undefined) { slot = gl.TEXTURE0 + this.capabilities.maxTextures - 1; } if (this.currentTextureSlot !== slot) { gl.activeTexture(slot); this.currentTextureSlot = slot; } } bindTexture(type, texture) { const gl = this.gl; if (this.currentTextureSlot === null) { this.activeTexture(); } let boundTexture = this.currentBoundTextures[this.currentTextureSlot]; if (boundTexture === undefined) { boundTexture = { type: undefined, texture: undefined }; this.currentBoundTextures[this.currentTextureSlot] = boundTexture; } if (boundTexture.type !== type || boundTexture.texture !== texture) { gl.bindTexture(type, texture || this.emptyTextures[type]); boundTexture.type = type; boundTexture.texture = texture; } } reset() { const gl = this.gl; gl.colorMask(true, true, true, true); gl.clearColor(0, 0, 0, 0); gl.depthMask(true); gl.depthFunc(gl.LESS); gl.clearDepth(1); gl.stencilMask(0xffffffff); gl.stencilFunc(gl.ALWAYS, 0, 0xffffffff); gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); gl.clearStencil(0); gl.disable(gl.BLEND); gl.disable(gl.CULL_FACE); gl.disable(gl.DEPTH_TEST); gl.disable(gl.POLYGON_OFFSET_FILL); gl.disable(gl.SCISSOR_TEST); gl.disable(gl.STENCIL_TEST); gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE); gl.blendEquation(gl.FUNC_ADD); gl.blendFunc(gl.ONE, gl.ZERO); gl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO); gl.cullFace(gl.BACK); gl.frontFace(gl.CCW); // gl.scissor(0, 0, gl.canvas.width, gl.canvas.height); gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); gl.lineWidth(1); gl.polygonOffset(0, 0); gl.useProgram(null); gl.bindFramebuffer(gl.FRAMEBUFFER, null); gl.activeTexture(gl.TEXTURE0); this.colorBuffer.reset(); this.depthBuffer.reset(); this.stencilBuffer.reset(); this.states = {}; this.currentBlending = null; this.currentBlendEquation = null; this.currentBlendSrc = null; this.currentBlendDst = null; this.currentBlendEquationAlpha = null; this.currentBlendSrcAlpha = null; this.currentBlendDstAlpha = null; this.currentPremultipliedAlpha = null; this.currentFlipSided = false; this.currentCullFace = null; this.currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height); this.currentLineWidth = null; this.currentPolygonOffsetFactor = null; this.currentPolygonOffsetUnits = null; this.currentProgram = null; this.currentBoundBuffers = {}; this.currentRenderTarget = null; // used in WebGLRenderTargets this.currentTextureSlot = null; this.currentBoundTextures = {}; } setMaterial(material, frontFaceCW) { this.setCullFace( (material.side === DRAW_SIDE.DOUBLE) ? CULL_FACE_TYPE.NONE : CULL_FACE_TYPE.BACK ); let flipSided = (material.side === DRAW_SIDE.BACK); if (frontFaceCW) flipSided = !flipSided; this.setFlipSided(flipSided); if (material.blending === BLEND_TYPE.NORMAL && material.transparent === false) { this.setBlending(BLEND_TYPE.NONE); } else { this.setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha); } this.depthBuffer.setFunc(material.depthFunc); this.depthBuffer.setTest(material.depthTest); this.depthBuffer.setMask(material.depthWrite); this.colorBuffer.setMask(material.colorWrite); const stencilTest = material.stencilTest; this.stencilBuffer.setTest(stencilTest); if (stencilTest) { this.stencilBuffer.setMask(material.stencilWriteMask); this.stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask, material.stencilFuncBack, material.stencilRefBack, material.stencilFuncMaskBack); this.stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass, material.stencilFailBack, material.stencilZFailBack, material.stencilZPassBack); } this.setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits); if (material.lineWidth !== undefined) { this.setLineWidth(material.lineWidth); } material.alphaToCoverage === true ? this.enable(this.gl.SAMPLE_ALPHA_TO_COVERAGE) : this.disable(this.gl.SAMPLE_ALPHA_TO_COVERAGE); } } export { WebGLState }; ================================================ FILE: src/webgl/WebGLTextures.js ================================================ import { TEXTURE_FILTER, TEXTURE_WRAP, PIXEL_FORMAT, PIXEL_TYPE } from '../const.js'; import { PropertyMap } from '../render/PropertyMap.js'; import { MathUtils } from '../math/MathUtils.js'; class WebGLTextures extends PropertyMap { constructor(prefix, gl, state, capabilities, constants) { super(prefix); this._gl = gl; this._state = state; this._capabilities = capabilities; this._constants = constants; this._usedTextureUnits = 0; const that = this; function onTextureDispose(event) { const texture = event.target; const textureProperties = that.get(texture); texture.removeEventListener('dispose', onTextureDispose); if (textureProperties.__webglTexture && !textureProperties.__external) { gl.deleteTexture(textureProperties.__webglTexture); } if (textureProperties.__readBuffer) { gl.deleteBuffer(textureProperties.__readBuffer); } that.delete(texture); } this._onTextureDispose = onTextureDispose; this._wrappingToGL = { [TEXTURE_WRAP.REPEAT]: gl.REPEAT, [TEXTURE_WRAP.CLAMP_TO_EDGE]: gl.CLAMP_TO_EDGE, [TEXTURE_WRAP.MIRRORED_REPEAT]: gl.MIRRORED_REPEAT }; this._filterToGL = { [TEXTURE_FILTER.NEAREST]: gl.NEAREST, [TEXTURE_FILTER.LINEAR]: gl.LINEAR, [TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST]: gl.NEAREST_MIPMAP_NEAREST, [TEXTURE_FILTER.LINEAR_MIPMAP_NEAREST]: gl.LINEAR_MIPMAP_NEAREST, [TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR]: gl.NEAREST_MIPMAP_LINEAR, [TEXTURE_FILTER.LINEAR_MIPMAP_LINEAR]: gl.LINEAR_MIPMAP_LINEAR }; } allocTexUnit() { const textureUnit = this._usedTextureUnits++; if (textureUnit >= this._capabilities.maxTextures) { console.warn('trying to use ' + textureUnit + ' texture units while this GPU supports only ' + this._capabilities.maxTextures); } return textureUnit; } resetTextureUnits() { this._usedTextureUnits = 0; } setTexture(texture, slot) { const gl = this._gl; const capabilities = this._capabilities; const constants = this._constants; const state = this._state; if ((texture.isTexture3D || texture.isTexture2DArray) && capabilities.version < 2) { console.warn('WebGLTextures: Texture3D/Texture2DArray is not supported in WebGL1.0.'); return; } if (slot !== undefined) { slot = gl.TEXTURE0 + slot; } const textureProperties = this.get(texture); const textureTarget = getTextureTarget(gl, texture); const hasImage = texture.isTextureCube ? texture.images.length === 6 : !!texture.image; let singleImage = texture.isTextureCube ? texture.images[0] : texture.image; if ( hasImage && textureProperties.__version !== texture.version // Do not initialize rtt texture, unless slot is undefined, // which means the caller just wants to bind the texture to the framebuffer, not use it for sampling. && (!singleImage.rtt || slot === undefined) // Do not initialize external texture && !textureProperties.__external ) { if (textureProperties.__webglTexture === undefined) { texture.addEventListener('dispose', this._onTextureDispose); textureProperties.__webglTexture = gl.createTexture(); textureProperties.__webglTarget = textureTarget; } if ( capabilities.version < 2 && texture.isTexture2D && !_isPowerOfTwo(singleImage) && textureNeedsPowerOfTwo(texture) && domCheck(singleImage) ) { singleImage = makePowerOf2(singleImage); } const needFallback = capabilities.version < 2 && !_isPowerOfTwo(singleImage); const uploadMipmaps = texture.mipmaps.length > 0 && !needFallback; const glFormat = constants.getGLFormat(texture.format), glType = constants.getGLType(texture.type), glInternalFormat = (texture.internalformat !== null) ? constants.getGLInternalFormat(texture.internalformat) : getGLInternalFormat(gl, capabilities, glFormat, glType); textureProperties.__glFormat = glFormat; textureProperties.__glType = glType; textureProperties.__glInternalFormat = glInternalFormat; textureProperties.__width = singleImage.width; textureProperties.__height = singleImage.height; textureProperties.__maxMipLevel = uploadMipmaps ? texture.mipmaps.length - 1 : 0; state.activeTexture(slot); state.bindTexture(textureTarget, textureProperties.__webglTexture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); gl.pixelStorei(gl.UNPACK_ALIGNMENT, texture.unpackAlignment); gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE); this._setTextureParameters(texture, textureTarget, needFallback); if (texture.isTexture2D) { this._upload2DImage(texture, textureProperties, uploadMipmaps, singleImage); } else if (texture.isTextureCube) { this._uploadCubeImages(texture, textureProperties, uploadMipmaps); } else if (texture.isTexture3D) { this._upload3DImage(texture, textureProperties); } else if (texture.isTexture2DArray) { this._upload2DArrayImage(texture, textureProperties); } if (texture.generateMipmaps && !uploadMipmaps && !needFallback) { this.generateMipmaps(texture); } textureProperties.__version = texture.version; return textureProperties; } state.activeTexture(slot); state.bindTexture(textureTarget, textureProperties.__webglTexture); return textureProperties; } generateMipmaps(texture) { const gl = this._gl; const textureProperties = this.get(texture); gl.generateMipmap(textureProperties.__webglTarget); const width = textureProperties.__width, height = textureProperties.__height; // Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 textureProperties.__maxMipLevel = Math.log(Math.max(width, height)) * Math.LOG2E; } setTextureExternal(texture, webglTexture) { const gl = this._gl; const textureProperties = this.get(texture); if (!textureProperties.__external) { if (textureProperties.__webglTexture) { gl.deleteTexture(textureProperties.__webglTexture); } else { texture.addEventListener('dispose', this._onTextureDispose); } } textureProperties.__webglTexture = webglTexture; textureProperties.__external = true; } _setTextureParameters(texture, textureType, needFallback) { const gl = this._gl; const capabilities = this._capabilities; const wrappingToGL = this._wrappingToGL; const filterToGL = this._filterToGL; let wrapS = texture.wrapS, wrapT = texture.wrapT, wrapR = texture.wrapR, magFilter = texture.magFilter, minFilter = texture.minFilter; // fix for non power of 2 image in WebGL 1.0 if (needFallback) { wrapS = TEXTURE_WRAP.CLAMP_TO_EDGE; wrapT = TEXTURE_WRAP.CLAMP_TO_EDGE; if (texture.isTexture3D) { wrapR = TEXTURE_WRAP.CLAMP_TO_EDGE; } if (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) { console.warn('Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to TEXTURE_WRAP.CLAMP_TO_EDGE.', texture); } magFilter = filterFallback(texture.magFilter); minFilter = filterFallback(texture.minFilter); if ( (texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR) || (texture.magFilter !== TEXTURE_FILTER.NEAREST && texture.magFilter !== TEXTURE_FILTER.LINEAR) ) { console.warn('Texture is not power of two. Texture.minFilter and Texture.magFilter should be set to TEXTURE_FILTER.NEAREST or TEXTURE_FILTER.LINEAR.', texture); } } gl.texParameteri(textureType, gl.TEXTURE_WRAP_S, wrappingToGL[wrapS]); gl.texParameteri(textureType, gl.TEXTURE_WRAP_T, wrappingToGL[wrapT]); if (texture.isTexture3D) { gl.texParameteri(textureType, gl.TEXTURE_WRAP_R, wrappingToGL[wrapR]); } gl.texParameteri(textureType, gl.TEXTURE_MAG_FILTER, filterToGL[magFilter]); gl.texParameteri(textureType, gl.TEXTURE_MIN_FILTER, filterToGL[minFilter]); // anisotropy if EXT_texture_filter_anisotropic exist const extension = capabilities.anisotropyExt; if (extension) { gl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.maxAnisotropy)); } if (capabilities.version >= 2) { if (texture.compare !== undefined) { gl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE); gl.texParameteri(textureType, gl.TEXTURE_COMPARE_FUNC, texture.compare); } else { gl.texParameteri(textureType, gl.TEXTURE_COMPARE_MODE, gl.NONE); } } } _upload2DImage(texture, textureProperties, uploadMipmaps, image) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; if (domCheck(image)) { if (uploadMipmaps) { const mipmaps = texture.mipmaps; for (let level = 0, l = mipmaps.length; level < l; level++) { gl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level]); } } else { gl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image); } } else { if (uploadMipmaps) { const isCompressed = image.isCompressed; const mipmaps = texture.mipmaps; let mipmap; for (let level = 0, l = mipmaps.length; level < l; level++) { mipmap = mipmaps[level]; if (isCompressed) { gl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); } else { gl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data); } } } else { gl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data); } } } _uploadCubeImages(texture, textureProperties, uploadMipmaps) { const gl = this._gl; const glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const images = texture.images; for (let face = 0; face < 6; face++) { const image = images[face]; const glTarget = gl.TEXTURE_CUBE_MAP_POSITIVE_X + face; if (domCheck(image)) { if (uploadMipmaps) { const mipmaps = texture.mipmaps; for (let level = 0, l = mipmaps.length; level < l; level++) { gl.texImage2D(glTarget, level, glInternalFormat, glFormat, glType, mipmaps[level][face]); } } else { gl.texImage2D(glTarget, 0, glInternalFormat, glFormat, glType, image); } } else { if (uploadMipmaps) { const isCompressed = image.isCompressed; const mipmaps = texture.mipmaps; let mipmap; for (let level = 0, l = mipmaps.length; level < l; level++) { mipmap = mipmaps[level][face]; if (isCompressed) { gl.compressedTexImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); } else { gl.texImage2D(glTarget, level, glInternalFormat, mipmap.width, mipmap.height, texture.border, glFormat, glType, mipmap.data); } } } else { gl.texImage2D(glTarget, 0, glInternalFormat, image.width, image.height, texture.border, glFormat, glType, image.data); } } } } _upload3DImage(texture, textureProperties) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const image = texture.image; gl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data); } _upload2DArrayImage(texture, textureProperties) { const gl = this._gl; const glTarget = textureProperties.__webglTarget, glFormat = textureProperties.__glFormat, glType = textureProperties.__glType, glInternalFormat = textureProperties.__glInternalFormat; const image = texture.image; if (texture.layerUpdates.size > 0) { for (const layerIndex of texture.layerUpdates) { const layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type); const layerData = image.data.subarray( layerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT, (layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT ); gl.texSubImage3D(glTarget, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData); } texture.layerUpdates.clear(); } else { gl.texImage3D(glTarget, 0, glInternalFormat, image.width, image.height, image.depth, texture.border, glFormat, glType, image.data); } } } function textureNeedsPowerOfTwo(texture) { return (texture.wrapS !== TEXTURE_WRAP.CLAMP_TO_EDGE || texture.wrapT !== TEXTURE_WRAP.CLAMP_TO_EDGE) || (texture.minFilter !== TEXTURE_FILTER.NEAREST && texture.minFilter !== TEXTURE_FILTER.LINEAR); } function filterFallback(filter) { if (filter === TEXTURE_FILTER.NEAREST || filter === TEXTURE_FILTER.NEAREST_MIPMAP_LINEAR || filter === TEXTURE_FILTER.NEAREST_MIPMAP_NEAREST) { return TEXTURE_FILTER.NEAREST; } return TEXTURE_FILTER.LINEAR; } function _isPowerOfTwo(image) { return MathUtils.isPowerOfTwo(image.width) && MathUtils.isPowerOfTwo(image.height); } let _canvas; function makePowerOf2(image) { if (_canvas === undefined) _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); _canvas.width = MathUtils.nearestPowerOfTwo(image.width); _canvas.height = MathUtils.nearestPowerOfTwo(image.height); const context = _canvas.getContext('2d'); context.drawImage(image, 0, 0, _canvas.width, _canvas.height); console.warn('image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image); return _canvas; } function getGLInternalFormat(gl, capabilities, glFormat, glType) { const isWebGL2 = capabilities.version >= 2; if (isWebGL2 === false) return glFormat; let glInternalFormat = glFormat; if (glFormat === gl.RED) { if (glType === gl.FLOAT) glInternalFormat = gl.R32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.R16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.R8; } if (glFormat === gl.RG) { if (glType === gl.FLOAT) glInternalFormat = gl.RG32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RG16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RG8; } if (glFormat === gl.RGB) { if (glType === gl.FLOAT) glInternalFormat = gl.RGB32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGB16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGB8; } if (glFormat === gl.RGBA) { if (glType === gl.FLOAT) glInternalFormat = gl.RGBA32F; if (glType === gl.HALF_FLOAT) glInternalFormat = gl.RGBA16F; if (glType === gl.UNSIGNED_BYTE) glInternalFormat = gl.RGBA8; if (glType === gl.UNSIGNED_SHORT_4_4_4_4) glInternalFormat = gl.RGBA4; if (glType === gl.UNSIGNED_SHORT_5_5_5_1) glInternalFormat = gl.RGB5_A1; } if (glFormat === gl.DEPTH_COMPONENT || glFormat === gl.DEPTH_STENCIL) { glInternalFormat = gl.DEPTH_COMPONENT16; if (glType === gl.FLOAT) glInternalFormat = gl.DEPTH_COMPONENT32F; if (glType === gl.UNSIGNED_INT) glInternalFormat = gl.DEPTH_COMPONENT24; if (glType === gl.UNSIGNED_INT_24_8) glInternalFormat = gl.DEPTH24_STENCIL8; if (glType === gl.FLOAT_32_UNSIGNED_INT_24_8_REV) glInternalFormat = gl.DEPTH32F_STENCIL8; } if (glInternalFormat === gl.R16F || glInternalFormat === gl.R32F || glInternalFormat === gl.RG16F || glInternalFormat === gl.RG32F || glInternalFormat === gl.RGB16F || glInternalFormat === gl.RGB32F || glInternalFormat === gl.RGBA16F || glInternalFormat === gl.RGBA32F) { capabilities.getExtension('EXT_color_buffer_float'); } return glInternalFormat; } function domCheck(image) { return (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) || (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) || (typeof HTMLVideoElement !== 'undefined' && image instanceof HTMLVideoElement) || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap); } function getByteLength(width, height, format, type) { const typeByteLength = getTextureTypeByteLength(type); switch (format) { // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml case PIXEL_FORMAT.ALPHA: return width * height; case PIXEL_FORMAT.LUMINANCE: return width * height; case PIXEL_FORMAT.LUMINANCE_ALPHA: return width * height * 2; case PIXEL_FORMAT.RED: return ((width * height) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RED_INTEGER: return ((width * height) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RG: return ((width * height * 2) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RG_INTEGER: return ((width * height * 2) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RGB: return ((width * height * 3) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RGBA: return ((width * height * 4) / typeByteLength.components) * typeByteLength.byteLength; case PIXEL_FORMAT.RGBA_INTEGER: return ((width * height * 4) / typeByteLength.components) * typeByteLength.byteLength; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/ case PIXEL_FORMAT.RGB_S3TC_DXT1: case PIXEL_FORMAT.RGBA_S3TC_DXT1: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; case PIXEL_FORMAT.RGBA_S3TC_DXT3: case PIXEL_FORMAT.RGBA_S3TC_DXT5: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/ case PIXEL_FORMAT.RGB_PVRTC_2BPPV1: case PIXEL_FORMAT.RGBA_PVRTC_2BPPV1: return (Math.max(width, 16) * Math.max(height, 8)) / 4; case PIXEL_FORMAT.RGB_PVRTC_4BPPV1: case PIXEL_FORMAT.RGBA_PVRTC_4BPPV1: return (Math.max(width, 8) * Math.max(height, 8)) / 2; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/ case PIXEL_FORMAT.RGB_ETC1: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/ case PIXEL_FORMAT.RGBA_ASTC_4x4: return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/ case PIXEL_FORMAT.RGBA_BPTC: return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; } throw new Error( `Unable to determine texture byte length for ${format} format.` ); } const _tempTypeByteLength = { byteLength: 0, components: 0 }; function getTextureTypeByteLength(type) { switch (type) { case PIXEL_TYPE.UNSIGNED_BYTE: case PIXEL_TYPE.ByteType: _tempTypeByteLength.byteLength = 1; _tempTypeByteLength.components = 1; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_SHORT: case PIXEL_TYPE.SHORT: case PIXEL_TYPE.HALF_FLOAT: _tempTypeByteLength.byteLength = 2; _tempTypeByteLength.components = 1; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_SHORT_4_4_4_4: case PIXEL_TYPE.UNSIGNED_SHORT_5_5_5_1: _tempTypeByteLength.byteLength = 2; _tempTypeByteLength.components = 4; return _tempTypeByteLength; case PIXEL_TYPE.UNSIGNED_INT: case PIXEL_TYPE.INT: case PIXEL_TYPE.FLOAT: _tempTypeByteLength.byteLength = 4; _tempTypeByteLength.components = 1; return _tempTypeByteLength; } throw new Error(`Unknown texture type ${type}.`); } function getTextureTarget(gl, texture) { if (texture.isTexture2D) { return gl.TEXTURE_2D; } else if (texture.isTextureCube) { return gl.TEXTURE_CUBE_MAP; } else if (texture.isTexture3D) { return gl.TEXTURE_3D; } else if (texture.isTexture2DArray) { return gl.TEXTURE_2D_ARRAY; } else { return gl.TEXTURE_2D; } } export { WebGLTextures }; ================================================ FILE: src/webgl/WebGLUniforms.js ================================================ import { PIXEL_TYPE, PIXEL_FORMAT, TEXTURE_FILTER, COMPARE_FUNC } from '../const.js'; import { Texture2D } from '../resources/textures/Texture2D.js'; import { Texture2DArray } from '../resources/textures/Texture2DArray.js'; import { TextureCube } from '../resources/textures/TextureCube.js'; import { Texture3D } from '../resources/textures/Texture3D.js'; // Build-in uniforms const internalUniforms = { 'u_Model': [1, null], 'u_Projection': [2, function(cameraData) { this.set(cameraData.projectionMatrix.elements) }], 'u_View': [2, function(cameraData) { this.set(cameraData.viewMatrix.elements) }], 'u_ProjectionView': [2, function(cameraData) { this.set(cameraData.projectionViewMatrix.elements) }], 'u_CameraPosition': [2, function(cameraData) { this.setValue(cameraData.position.x, cameraData.position.y, cameraData.position.z) }], 'logDepthBufFC': [2, function(cameraData) { this.set(cameraData.logDepthBufFC) }], 'logDepthCameraNear': [2, function(cameraData) { this.set(cameraData.logDepthCameraNear) }], 'u_FogColor': [3, function(sceneData) { const color = sceneData.fog.color; this.setValue(color.r, color.g, color.b) }], 'u_FogDensity': [3, function(sceneData) { this.set(sceneData.fog.density) }], 'u_FogNear': [3, function(sceneData) { this.set(sceneData.fog.near) }], 'u_FogFar': [3, function(sceneData) { this.set(sceneData.fog.far) }], 'u_Color': [4, function(material, textures) { const color = material.diffuse; this.setValue(color.r, color.g, color.b) }], 'u_Opacity': [4, function(material, textures) { this.set(material.opacity) }], 'u_AlphaTest': [4, function(material, textures) { this.set(material.alphaTest) }], 'diffuseMap': [4, function(material, textures) { this.set(material.diffuseMap, textures) }], 'alphaMap': [4, function(material, textures) { this.set(material.alphaMap, textures) }], 'alphaMapUVTransform': [4, function(material, textures) { const transform = material.alphaMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements) }], 'normalMap': [4, function(material, textures) { this.set(material.normalMap, textures) }], 'normalScale': [4, function(material, textures) { this.setValue(material.normalScale.x, material.normalScale.y) }], 'bumpMap': [4, function(material, textures) { this.set(material.bumpMap, textures) }], 'bumpScale': [4, function(material, textures) { this.set(material.bumpScale) }], 'cubeMap': [4, function(material, textures) { this.set(material.cubeMap, textures) }], 'u_Specular': [4, function(material, textures) { this.set(material.shininess) }], 'u_SpecularColor': [4, function(material, textures) { const color = material.specular; this.setValue(color.r, color.g, color.b) }], 'specularMap': [4, function(material, textures) { this.set(material.specularMap, textures) }], 'aoMap': [4, function(material, textures) { this.set(material.aoMap, textures) }], 'aoMapIntensity': [4, function(material, textures) { this.set(material.aoMapIntensity) }], 'aoMapUVTransform': [4, function(material, textures) { const transform = material.aoMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements) }], 'u_Roughness': [4, function(material, textures) { this.set(material.roughness) }], 'roughnessMap': [4, function(material, textures) { this.set(material.roughnessMap, textures) }], 'u_Metalness': [4, function(material, textures) { this.set(material.metalness) }], 'metalnessMap': [4, function(material, textures) { this.set(material.metalnessMap, textures) }], 'u_Clearcoat': [4, function(material, textures) { this.set(material.clearcoat) }], 'u_ClearcoatRoughness': [4, function(material, textures) { this.set(material.clearcoatRoughness) }], 'clearcoatMap': [4, function(material, textures) { this.set(material.clearcoatMap, textures) }], 'clearcoatRoughnessMap': [4, function(material, textures) { this.set(material.clearcoatRoughnessMap, textures) }], 'clearcoatNormalMap': [4, function(material, textures) { this.set(material.clearcoatNormalMap, textures) }], 'clearcoatNormalScale': [4, function(material, textures) { this.setValue(material.clearcoatNormalScale.x, material.clearcoatNormalScale.y) }], 'glossiness': [4, function(material, textures) { this.set(material.glossiness) }], 'glossinessMap': [4, function(material, textures) { this.set(material.glossinessMap, textures) }], 'emissive': [4, function(material, textures) { const color = material.emissive; this.setValue(color.r, color.g, color.b) }], 'emissiveMap': [4, function(material, textures) { this.set(material.emissiveMap, textures) }], 'emissiveMapUVTransform': [4, function(material, textures) { const transform = material.emissiveMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements) }], 'uvTransform': [4, function(material, textures) { const transform = material.diffuseMapTransform; transform.isTransformUV && transform.update(); this.set(transform.elements) }], 'u_PointSize': [4, function(material, textures) { this.set(material.size) }], 'envMap': [5, function(envData, textures) { this.set(envData.map, textures) }], 'envMapParams': [5, function(envData, textures) { this.setValue(envData.diffuse, envData.specular, (envData.map.images[0] && envData.map.images[0].rtt) ? 1 : -1) }], 'maxMipLevel': [5, function(envData, textures) { this.set(textures.get(envData.map).__maxMipLevel || 8) }] }; // Empty textures const emptyTexture = new Texture2D(); emptyTexture.image = { data: new Uint8Array([1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1]), width: 2, height: 2 }; emptyTexture.magFilter = TEXTURE_FILTER.NEAREST; emptyTexture.minFilter = TEXTURE_FILTER.NEAREST; emptyTexture.generateMipmaps = false; emptyTexture.version++; const emptyShadowTexture = new Texture2D(); emptyShadowTexture.image = { data: null, width: 2, height: 2 }; emptyShadowTexture.version++; emptyShadowTexture.type = PIXEL_TYPE.FLOAT_32_UNSIGNED_INT_24_8_REV; emptyShadowTexture.format = PIXEL_FORMAT.DEPTH_STENCIL; emptyShadowTexture.magFilter = TEXTURE_FILTER.NEAREST; emptyShadowTexture.minFilter = TEXTURE_FILTER.NEAREST; emptyShadowTexture.compare = COMPARE_FUNC.LESS; emptyShadowTexture.generateMipmaps = false; emptyShadowTexture.version++; const emptyTexture3d = new Texture3D(); const emptyTexture2dArray = new Texture2DArray(); const emptyCubeTexture = new TextureCube(); // Array helpers function arraysEqual(a, b) { if (a.length !== b.length) return false; for (let i = 0, l = a.length; i < l; i++) { if (a[i] !== b[i]) return false; } return true; } function copyArray(a, b) { for (let i = 0, l = b.length; i < l; i++) { a[i] = b[i]; } } // Texture unit allocation const arrayCacheI32 = []; function allocTexUnits(textures, n) { let r = arrayCacheI32[n]; if (r === undefined) { r = new Int32Array(n); arrayCacheI32[n] = r; } for (let i = 0; i !== n; ++i) { r[i] = textures.allocTexUnit(); } return r; } // Helper to pick the right setter for uniform function generateSetter(uniform, pureArray) { const gl = uniform.gl; const type = uniform.type; const location = uniform.location; const cache = uniform.cache; switch (type) { case gl.FLOAT: uniform.setValue = function(value) { if (cache[0] === value) return; gl.uniform1f(location, value); cache[0] = value; }; if (pureArray) { uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform1fv(location, value); copyArray(cache, value); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_2D: case gl.SAMPLER_2D_SHADOW: case gl.INT_SAMPLER_2D: case gl.UNSIGNED_INT_SAMPLER_2D: uniform.setValue = function(value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function(value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || (type === gl.SAMPLER_2D_SHADOW ? emptyShadowTexture : emptyTexture), units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_2D_ARRAY: case gl.SAMPLER_2D_ARRAY_SHADOW: case gl.INT_SAMPLER_2D_ARRAY: case gl.UNSIGNED_INT_SAMPLER_2D_ARRAY: uniform.setValue = function(value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyTexture2dArray, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function(value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyTexture2dArray, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_CUBE: case gl.SAMPLER_CUBE_SHADOW: uniform.setValue = function(value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyCubeTexture, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function(value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyCubeTexture, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.SAMPLER_3D: uniform.setValue = function(value, textures) { const unit = textures.allocTexUnit(); textures.setTexture(value || emptyTexture3d, unit); if (cache[0] === unit) return; gl.uniform1i(location, unit); cache[0] = unit; }; if (pureArray) { uniform.set = function(value, textures) { const n = value.length; const units = allocTexUnits(textures, n); for (let i = 0; i !== n; ++i) { textures.setTexture(value[i] || emptyTexture3d, units[i]); } if (arraysEqual(cache, units)) return; gl.uniform1iv(location, units); copyArray(cache, units); }; } else { uniform.set = uniform.setValue; } break; case gl.BOOL: case gl.INT: uniform.setValue = function(value) { if (cache[0] === value) return; gl.uniform1i(location, value); cache[0] = value; }; if (pureArray) { uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform1iv(location, value); copyArray(cache, value); }; } else { uniform.set = uniform.setValue; } break; case gl.FLOAT_VEC2: uniform.setValue = function(p1, p2) { if (cache[0] !== p1 || cache[1] !== p2) { gl.uniform2f(location, p1, p2); cache[0] = p1; cache[1] = p2; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform2fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC2: case gl.INT_VEC2: uniform.setValue = function(p1, p2) { if (cache[0] !== p1 || cache[1] !== p2) { gl.uniform2i(location, p1, p2); cache[0] = p1; cache[1] = p2; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform2iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_VEC3: uniform.setValue = function(p1, p2, p3) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) { gl.uniform3f(location, p1, p2, p3); cache[0] = p1; cache[1] = p2; cache[2] = p3; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform3fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC3: case gl.INT_VEC3: uniform.setValue = function(p1, p2, p3) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3) { gl.uniform3i(location, p1, p2, p3); cache[0] = p1; cache[1] = p2; cache[2] = p3; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform3iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_VEC4: uniform.setValue = function(p1, p2, p3, p4) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) { gl.uniform4f(location, p1, p2, p3, p4); cache[0] = p1; cache[1] = p2; cache[2] = p3; cache[3] = p4; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform4fv(location, value); copyArray(cache, value); }; break; case gl.BOOL_VEC4: case gl.INT_VEC4: uniform.setValue = function(p1, p2, p3, p4) { if (cache[0] !== p1 || cache[1] !== p2 || cache[2] !== p3 || cache[3] !== p4) { gl.uniform4i(location, p1, p2, p3, p4); cache[0] = p1; cache[1] = p2; cache[2] = p3; cache[3] = p4; } }; uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniform4iv(location, value); copyArray(cache, value); }; break; case gl.FLOAT_MAT2: if (pureArray) { uniform.setValue = uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix2fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function(value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3]) { gl.uniformMatrix2fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; } }; } break; case gl.FLOAT_MAT3: if (pureArray) { uniform.setValue = uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix3fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function(value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8]) { gl.uniformMatrix3fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; cache[4] = value[4]; cache[5] = value[5]; cache[6] = value[6]; cache[7] = value[7]; cache[8] = value[8]; } }; } break; case gl.FLOAT_MAT4: if (pureArray) { uniform.setValue = uniform.set = function(value) { if (arraysEqual(cache, value)) return; gl.uniformMatrix4fv(location, false, value); copyArray(cache, value); }; } else { uniform.setValue = uniform.set = function(value) { if (cache[0] !== value[0] || cache[1] !== value[1] || cache[2] !== value[2] || cache[3] !== value[3] || cache[4] !== value[4] || cache[5] !== value[5] || cache[6] !== value[6] || cache[7] !== value[7] || cache[8] !== value[8] || cache[9] !== value[9] || cache[10] !== value[10] || cache[11] !== value[11] || cache[12] !== value[12] || cache[13] !== value[13] || cache[14] !== value[14] || cache[15] !== value[15]) { gl.uniformMatrix4fv(location, false, value); cache[0] = value[0]; cache[1] = value[1]; cache[2] = value[2]; cache[3] = value[3]; cache[4] = value[4]; cache[5] = value[5]; cache[6] = value[6]; cache[7] = value[7]; cache[8] = value[8]; cache[9] = value[9]; cache[10] = value[10]; cache[11] = value[11]; cache[12] = value[12]; cache[13] = value[13]; cache[14] = value[14]; cache[15] = value[15]; } }; } break; } } // --- Uniform Classes --- class SingleUniform { constructor(gl, id, activeInfo, location) { this.gl = gl; this.id = id; this.type = activeInfo.type; // this.size = activeInfo.size; // always be 1 this.location = location; this.setValue = undefined; this.set = undefined; this.cache = []; generateSetter(this); // internal this.internalGroup = 0; this.internalFun = null; const internal = internalUniforms[id]; if (internal) { this.internalGroup = internal[0]; this.internalFun = internal[1]; } } } class PureArrayUniform { constructor(gl, id, activeInfo, location) { this.gl = gl; this.id = id; this.type = activeInfo.type; this.size = activeInfo.size; this.location = location; this.setValue = undefined; this.set = undefined; this.cache = []; generateSetter(this, true); } } class UniformContainer { constructor() { this.seq = []; this.map = {}; } } class StructuredUniform extends UniformContainer { constructor(id) { super(); this.id = id; } set(value, textures) { const seq = this.seq; for (let i = 0, n = seq.length; i !== n; ++i) { const u = seq[i]; u.set(value[u.id], textures); } } } // --- Top-level --- // Parser - builds up the property tree from the path strings const RePathPart = /(\w+)(\])?(\[|\.)?/g; // extracts // - the identifier (member name or array index) // - followed by an optional right bracket (found when array index) // - followed by an optional left bracket or dot (type of subscript) // // Note: These portions can be read in a non-overlapping fashion and // allow straightforward parsing of the hierarchy that WebGL encodes // in the uniform names. function addUniform(container, uniformObject) { container.seq.push(uniformObject); container.map[uniformObject.id] = uniformObject; } // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getActiveUniform function parseUniform(gl, activeInfo, location, container) { const path = activeInfo.name, pathLength = path.length; // reset RegExp object, because of the early exit of a previous run RePathPart.lastIndex = 0; while (true) { const match = RePathPart.exec(path), matchEnd = RePathPart.lastIndex; let id = match[1]; const idIsIndex = match[2] === ']', subscript = match[3]; if (idIsIndex) id = id | 0; // convert to integer if (subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength) { // bare name or "pure" bottom-level array "[0]" suffix addUniform(container, subscript === undefined ? new SingleUniform(gl, id, activeInfo, location) : new PureArrayUniform(gl, id, activeInfo, location)); break; } else { // step into inner node / create it in case it doesn't exist const map = container.map; let next = map[id]; if (next === undefined) { next = new StructuredUniform(id); addUniform(container, next); } container = next; } } } // Root Container class WebGLUniforms extends UniformContainer { constructor(gl, program) { super(); const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); for (let i = 0; i < n; ++i) { const info = gl.getActiveUniform(program, i), addr = gl.getUniformLocation(program, info.name); parseUniform(gl, info, addr, this); } } set(name, value, textures) { const u = this.map[name]; if (u !== undefined) u.set(value, textures); } has(name) { return !!this.map[name]; } } export { WebGLUniforms }; ================================================ FILE: src/webgl/WebGLVertexArrayBindings.js ================================================ import { PropertyMap } from '../render/PropertyMap.js'; const emptyString = ''; export class WebGLVertexArrayBindings extends PropertyMap { constructor(prefix, gl, capabilities, buffers) { super(prefix); this._gl = gl; this._capabilities = capabilities; this._buffers = buffers; this._isWebGL2 = capabilities.version >= 2; this._vaoExt = capabilities.getExtension('OES_vertex_array_object'); this._vaoCache = {}; // save vao cache here for releaseByProgram() method this._currentGeometryProgram = ''; this._currentVAO = null; } setup(object, geometry, program) { if (object.morphTargetInfluences) { this.reset(); this._setupVertexAttributes(program, geometry); this._currentGeometryProgram = emptyString; } else if (this._isWebGL2 || this._vaoExt) { // use VAO const geometryProperties = this.get(geometry); if (geometryProperties._vaos === undefined) { geometryProperties._vaos = {}; this._vaoCache[geometry.id] = geometryProperties._vaos; } let vao = geometryProperties._vaos[program.id]; if (!vao) { vao = geometryProperties._vaos[program.id] = { version: -1, object: this._createVAO() }; } this._bindVAO(vao.object); if (vao.version !== geometry.version) { this._setupVertexAttributes(program, geometry); vao.version = geometry.version; } } else { const geometryProgram = program.id + '_' + geometry.id + '_' + geometry.version; if (geometryProgram !== this._currentGeometryProgram) { this._setupVertexAttributes(program, geometry); this._currentGeometryProgram = geometryProgram; } } } releaseByGeometry(geometry) { const geometryProperties = this.get(geometry); const vaos = geometryProperties._vaos; if (vaos) { for (const programId in vaos) { const vao = vaos[programId]; if (!vao) continue; this._disposeVAO(vao.object); } delete geometryProperties._vaos; delete this._vaoCache[geometry.id]; } } releaseByProgram(program) { for (const geometryId in this._vaoCache) { const vaos = this._vaoCache[geometryId]; if (vaos) { const vao = vaos[program.id]; if (!vao) continue; this._disposeVAO(vao.object); delete vaos[program.id]; } } } reset(force) { if (this._currentVAO !== null || force) { if (this._isWebGL2) { this._gl.bindVertexArray(null); } else if (this._vaoExt) { this._vaoExt.bindVertexArrayOES(null); } this._currentVAO = null; } if (this._currentGeometryProgram !== emptyString) { this._currentGeometryProgram = emptyString; } } _createVAO() { if (this._isWebGL2) { return this._gl.createVertexArray(); } else if (this._vaoExt) { return this._vaoExt.createVertexArrayOES(); } return null; } _bindVAO(vao) { if (this._currentVAO !== vao) { if (this._isWebGL2) { this._gl.bindVertexArray(vao); } else if (this._vaoExt) { this._vaoExt.bindVertexArrayOES(vao); } this._currentVAO = vao; } } _disposeVAO(vao) { if (this._isWebGL2) { this._gl.deleteVertexArray(vao); } else if (this._vaoExt) { this._vaoExt.deleteVertexArrayOES(vao); } } _setupVertexAttributes(program, geometry) { const gl = this._gl; const isWebGL2 = this._isWebGL2; const attributes = program.getAttributes(); const capabilities = this._capabilities; const buffers = this._buffers; for (const key in attributes) { const programAttribute = attributes[key]; const geometryAttribute = geometry.getAttribute(key); if (geometryAttribute) { const size = geometryAttribute.size; if (programAttribute.count !== size) { console.warn('WebGLVertexArrayBindings: attribute ' + key + ' size not match! ' + programAttribute.count + ' : ' + size); } const buffer = geometryAttribute.buffer; const bufferProperties = buffers.get(buffer); const type = bufferProperties.type; const integer = isWebGL2 && (programAttribute.format === gl.INT || programAttribute.format === gl.UNSIGNED_INT); for (let i = 0, l = programAttribute.locationSize; i < l; i++) { gl.enableVertexAttribArray(programAttribute.location + i); } if (geometryAttribute.divisor > 0) { // use instancing for (let i = 0, l = programAttribute.locationSize; i < l; i++) { if (isWebGL2) { gl.vertexAttribDivisor(programAttribute.location + i, geometryAttribute.divisor); } else if (capabilities.getExtension('ANGLE_instanced_arrays')) { capabilities.getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(programAttribute.location + i, geometryAttribute.divisor); } else { console.warn('vertexAttribDivisor not supported'); } } } const bytesPerElement = bufferProperties.bytesPerElement; const glBuffer = bufferProperties.glBuffer; const stride = buffer.stride; const offset = geometryAttribute.offset; const normalized = geometryAttribute.normalized; gl.bindBuffer(gl.ARRAY_BUFFER, glBuffer); if (programAttribute.count === stride && programAttribute.locationSize === 1) { this._vertexAttribPointer(programAttribute.location, programAttribute.count, type, normalized, 0, 0, integer); } else { for (let i = 0; i < programAttribute.locationSize; i++) { this._vertexAttribPointer( programAttribute.location + i, programAttribute.count / programAttribute.locationSize, type, normalized, bytesPerElement * stride, bytesPerElement * (offset + (programAttribute.count / programAttribute.locationSize) * i), integer ); } } } else { // console.warn("WebGLVertexArrayBindings: geometry attribute " + key + " not found!"); } } // bind index if could if (geometry.index) { const indexBufferProperties = buffers.get(geometry.index.buffer); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBufferProperties.glBuffer); } } _vertexAttribPointer(index, size, type, normalized, stride, offset, integer) { const gl = this._gl; if (integer) { gl.vertexAttribIPointer(index, size, type, stride, offset); } else { gl.vertexAttribPointer(index, size, type, normalized, stride, offset); } } } ================================================ FILE: tests/index.html ================================================ T3D Unit Test
================================================ FILE: tests/unit/source.unit.js ================================================ import './src/math/Box2.tests.js'; import './src/math/Box3.tests.js'; import './src/math/Color3.tests.js'; import './src/math/Color4.tests.js'; import './src/math/MathUtils.tests.js'; import './src/math/Matrix3.tests.js'; import './src/math/Matrix4.tests.js'; import './src/math/Plane.tests.js'; import './src/math/Quaternion.tests.js'; import './src/math/Ray.tests.js'; import './src/math/Sphere.tests.js'; import './src/math/Vector2.tests.js'; import './src/math/Vector3.tests.js'; import './src/math/Vector4.tests.js'; import './src/EventDispatcher.tests.js'; ================================================ FILE: tests/unit/src/EventDispatcher.tests.js ================================================ import { EventDispatcher } from 't3d'; QUnit.module('EventDispatcher'); QUnit.test('Instancing', assert => { const object = new EventDispatcher(); assert.ok(object, 'Can instantiate an EventDispatcher.'); }); QUnit.test('addEventListener', assert => { const eventDispatcher = new EventDispatcher(); const listener = {}; eventDispatcher.addEventListener('anyType', listener); assert.ok(eventDispatcher._listeners.anyType.length === 1, 'listener with unknown type was added'); assert.ok(eventDispatcher._listeners.anyType[0] === listener, 'listener with unknown type was added'); eventDispatcher.addEventListener('anyType', listener); assert.ok(eventDispatcher._listeners.anyType.length === 1, 'can\'t add one listener twice to same type'); assert.ok(eventDispatcher._listeners.anyType[0] === listener, 'listener is still there'); }); QUnit.test('removeEventListener', assert => { const eventDispatcher = new EventDispatcher(); const listener = {}; assert.ok(eventDispatcher._listeners === undefined, 'there are no listeners by default'); eventDispatcher.addEventListener('anyType', listener); assert.ok(Object.keys(eventDispatcher._listeners).length === 1 && eventDispatcher._listeners.anyType.length === 1, 'if a listener was added, there is a new key'); eventDispatcher.removeEventListener('anyType', listener); assert.ok(eventDispatcher._listeners.anyType.length === 0, 'listener was deleted'); eventDispatcher.removeEventListener('unknownType', listener); assert.ok(eventDispatcher._listeners.unknownType === undefined, 'unknown types will be ignored'); eventDispatcher.removeEventListener('anyType', undefined); assert.ok(eventDispatcher._listeners.anyType.length === 0, 'undefined listeners are ignored'); }); QUnit.test('dispatchEvent', assert => { const eventDispatcher = new EventDispatcher(); let callCount = 0; const listener = function() { callCount++; }; eventDispatcher.addEventListener('anyType', listener); assert.ok(callCount === 0, 'no event, no call'); eventDispatcher.dispatchEvent({ type: 'anyType' }); assert.ok(callCount === 1, 'one event, one call'); eventDispatcher.dispatchEvent({ type: 'anyType' }); assert.ok(callCount === 2, 'two events, two calls'); }); ================================================ FILE: tests/unit/src/math/Box2.tests.js ================================================ import { Box2, Vector2 } from 't3d'; // Define 2D constants for tests const zero2 = new Vector2(0, 0); const one2 = new Vector2(1, 1); QUnit.module('Box2'); QUnit.test('constructor', assert => { let a = new Box2(); assert.ok(a.min.x == Infinity, 'Default min.x is Infinity'); assert.ok(a.min.y == Infinity, 'Default min.y is Infinity'); assert.ok(a.max.x == -Infinity, 'Default max.x is -Infinity'); assert.ok(a.max.y == -Infinity, 'Default max.y is -Infinity'); a = new Box2(zero2.clone(), one2.clone()); assert.ok(a.min.equals(zero2), 'Min vector set correctly'); assert.ok(a.max.equals(one2), 'Max vector set correctly'); }); QUnit.test('set', assert => { const a = new Box2(); a.set(0, 1, 2, 3); assert.strictEqual(a.min.x, 0, 'min.x set correctly'); assert.strictEqual(a.min.y, 1, 'min.y set correctly'); assert.strictEqual(a.max.x, 2, 'max.x set correctly'); assert.strictEqual(a.max.y, 3, 'max.y set correctly'); }); QUnit.test('clone', assert => { const a = new Box2(zero2.clone(), one2.clone()); const b = a.clone(); assert.ok(b.min.equals(zero2), 'Min cloned correctly'); assert.ok(b.max.equals(one2), 'Max cloned correctly'); assert.ok(b !== a, 'New instance created via clone'); // Ensure it's a deep copy a.min.set(1, 1); a.max.set(2, 2); assert.ok(!b.min.equals(a.min), 'Changes to original do not affect clone (min)'); assert.ok(!b.max.equals(a.max), 'Changes to original do not affect clone (max)'); }); QUnit.test('copy', assert => { const a = new Box2(zero2.clone(), one2.clone()); const b = new Box2().copy(a); assert.ok(b.min.equals(zero2), 'Min copied correctly'); assert.ok(b.max.equals(one2), 'Max copied correctly'); assert.ok(b !== a, 'Different instances'); // Ensure it's a deep copy a.min.set(1, 1); a.max.set(2, 2); assert.ok(!b.min.equals(a.min), 'Changes to original do not affect copy (min)'); assert.ok(!b.max.equals(a.max), 'Changes to original do not affect copy (max)'); }); ================================================ FILE: tests/unit/src/math/Box3.tests.js ================================================ import { Box3, Vector3, Matrix4, Sphere } from 't3d'; import { zero3, one3, two3, eps } from '../../utils/math-constants.js'; QUnit.module('Box3'); QUnit.test('constructor', assert => { let a = new Box3(); assert.ok(a.min.x == Infinity, 'Passed!'); assert.ok(a.min.y == Infinity, 'Passed!'); assert.ok(a.min.z == Infinity, 'Passed!'); assert.ok(a.max.x == -Infinity, 'Passed!'); assert.ok(a.max.y == -Infinity, 'Passed!'); assert.ok(a.max.z == -Infinity, 'Passed!'); a = new Box3(zero3.clone(), one3.clone()); assert.ok(a.min.equals(zero3), 'Passed!'); assert.ok(a.max.equals(one3), 'Passed!'); }); QUnit.test('set', assert => { const a = new Box3(); a.set(zero3, one3); assert.ok(a.min.equals(zero3), 'Passed!'); assert.ok(a.max.equals(one3), 'Passed!'); }); QUnit.test('setFromPoints', assert => { const a = new Box3(); a.setFromPoints([zero3, one3, two3]); assert.ok(a.min.equals(zero3), 'Passed!'); assert.ok(a.max.equals(two3), 'Passed!'); a.setFromPoints([]); assert.ok(a.isEmpty(), 'Passed!'); }); QUnit.test('makeEmpty', assert => { const a = new Box3(); a.set(zero3, one3); a.makeEmpty(); assert.ok(a.isEmpty(), 'Passed!'); }); QUnit.test('expandByPoint', assert => { const a = new Box3(zero3.clone(), one3.clone()); const point = new Vector3(2, 2, 2); const expectedResult = new Box3(zero3.clone(), point.clone()); a.expandByPoint(point); assert.ok(a.equals(expectedResult), 'Passed!'); }); QUnit.test('expandByScalar', assert => { const a = new Box3(zero3.clone(), one3.clone()); const scalar = 1; const expectedResult = new Box3( new Vector3(-1, -1, -1), new Vector3(2, 2, 2) ); a.expandByScalar(scalar); assert.ok(a.equals(expectedResult), 'Passed!'); }); QUnit.test('expandByBox3', assert => { const a = new Box3(zero3.clone(), one3.clone()); const b = new Box3( new Vector3(-1, -1, -1), new Vector3(2, 2, 2) ); const expectedResult = new Box3( new Vector3(-1, -1, -1), new Vector3(2, 2, 2) ); a.expandByBox3(b); assert.ok(a.equals(expectedResult), 'Passed!'); }); QUnit.test('setFromArray', assert => { const a = new Box3(); const array = [0, 0, 0, 1, 1, 1, 2, 2, 2]; a.setFromArray(array); assert.ok(a.min.equals(zero3), 'Passed!'); assert.ok(a.max.equals(two3), 'Passed!'); a.setFromArray(array, 3); assert.ok(a.min.equals(zero3), 'Passed!'); assert.ok(a.max.equals(two3), 'Passed!'); a.setFromArray(array, 3, 0); assert.ok(a.min.equals(zero3), 'Passed!'); assert.ok(a.max.equals(two3), 'Passed!'); a.setFromArray([]); assert.ok(a.isEmpty(), 'Passed!'); }); QUnit.test('clampPoint', assert => { const a = new Box3(zero3.clone(), one3.clone()); const point = new Vector3(-1, -1, -1); const expectedResult = zero3.clone(); const result = new Vector3(); a.clampPoint(point, result); assert.ok(result.equals(expectedResult), 'Clamped point should be min boundary when point is below min'); const point2 = new Vector3(2, 2, 2); const expectedResult2 = one3.clone(); a.clampPoint(point2, result); assert.ok(result.equals(expectedResult2), 'Clamped point should be max boundary when point is above max'); const point3 = new Vector3(0.5, 0.5, 0.5); const expectedResult3 = point3.clone(); a.clampPoint(point3, result); assert.ok(result.equals(expectedResult3), 'Clamped point should be unchanged when point is inside box'); }); QUnit.test('distanceToPoint', assert => { const a = new Box3(zero3.clone(), one3.clone()); assert.ok(a.distanceToPoint(new Vector3(2, 2, 2)) === Math.sqrt(3), 'Correct distance to point outside box'); assert.ok(a.distanceToPoint(new Vector3(0.5, 0.5, 0.5)) === 0, 'Distance to point inside box should be 0'); assert.ok(a.distanceToPoint(new Vector3(1, 1, 1)) === 0, 'Distance to point on box boundary should be 0'); assert.ok(a.distanceToPoint(new Vector3(1.5, 1.5, 1.5)) === Math.sqrt(0.75), 'Correct distance to point outside box'); assert.ok(a.distanceToPoint(new Vector3(-0.5, -0.5, -0.5)) === Math.sqrt(0.75), 'Correct distance to point outside box'); }); QUnit.test('getBoundingSphere', assert => { const a = new Box3(zero3.clone(), one3.clone()); const sphere = new Sphere(); const expectedCenter = new Vector3(0.5, 0.5, 0.5); a.getBoundingSphere(sphere); assert.ok(Math.abs(sphere.radius - Math.sqrt(3) * 0.5) <= eps, 'Bounding sphere radius is correct'); assert.ok(sphere.center.equals(expectedCenter), 'Bounding sphere center is correct'); const emptyBox = new Box3(); emptyBox.makeEmpty(); emptyBox.getBoundingSphere(sphere); assert.ok(sphere.isEmpty(), 'Bounding sphere for empty box should be empty'); }); QUnit.test('isEmpty', assert => { const a = new Box3(); assert.ok(a.isEmpty(), 'Empty box should report isEmpty() === true'); const b = new Box3(zero3.clone(), one3.clone()); assert.ok(!b.isEmpty(), 'Non-empty box should report isEmpty() === false'); // Edge cases const c = new Box3(one3.clone(), zero3.clone()); // min > max assert.ok(c.isEmpty(), 'Box with min > max should be considered empty'); const d = new Box3(zero3.clone(), zero3.clone()); // min === max assert.ok(!d.isEmpty(), 'Box with min === max should not be considered empty (contains one point)'); }); QUnit.test('equals', assert => { const a = new Box3(zero3.clone(), one3.clone()); const b = new Box3(zero3.clone(), one3.clone()); assert.ok(a.equals(b), 'Identical boxes should be equal'); const c = new Box3(zero3.clone(), two3.clone()); assert.ok(!a.equals(c), 'Different boxes should not be equal'); }); QUnit.test('getCenter', assert => { const a = new Box3(zero3.clone(), one3.clone()); const expectedCenter = new Vector3(0.5, 0.5, 0.5); const result = new Vector3(); a.getCenter(result); assert.ok(result.equals(expectedCenter), 'Center is correct for non-empty box'); const emptyBox = new Box3(); emptyBox.makeEmpty(); emptyBox.getCenter(result); assert.ok(result.equals(new Vector3(0, 0, 0)), 'Center defaults to (0,0,0) for empty box'); }); QUnit.test('getSize', assert => { const a = new Box3(zero3.clone(), one3.clone()); const expectedSize = new Vector3(1, 1, 1); const result = new Vector3(); a.getSize(result); assert.ok(result.equals(expectedSize), 'Size is correct for non-empty box'); const emptyBox = new Box3(); emptyBox.makeEmpty(); emptyBox.getSize(result); assert.ok(result.equals(new Vector3(0, 0, 0)), 'Size defaults to (0,0,0) for empty box'); }); QUnit.test('getPoints', assert => { const a = new Box3( new Vector3(-1, -2, -3), new Vector3(2, 3, 4) ); const points = Array(8).fill().map(() => new Vector3()); a.getPoints(points); assert.ok(points[0].equals(new Vector3(2, 3, 4)), 'Corner point 0 is correct'); assert.ok(points[1].equals(new Vector3(2, -2, 4)), 'Corner point 1 is correct'); assert.ok(points[2].equals(new Vector3(2, -2, -3)), 'Corner point 2 is correct'); assert.ok(points[3].equals(new Vector3(2, 3, -3)), 'Corner point 3 is correct'); assert.ok(points[4].equals(new Vector3(-1, 3, 4)), 'Corner point 4 is correct'); assert.ok(points[5].equals(new Vector3(-1, -2, 4)), 'Corner point 5 is correct'); assert.ok(points[6].equals(new Vector3(-1, -2, -3)), 'Corner point 6 is correct'); assert.ok(points[7].equals(new Vector3(-1, 3, -3)), 'Corner point 7 is correct'); }); QUnit.test('union', assert => { const a = new Box3(zero3.clone(), one3.clone()); const b = new Box3( new Vector3(-1, -1, -1), new Vector3(2, 2, 2) ); const expectedResult = new Box3( new Vector3(-1, -1, -1), new Vector3(2, 2, 2) ); a.union(b); assert.ok(a.equals(expectedResult), 'Union of overlapping boxes is correct'); const c = new Box3( new Vector3(3, 3, 3), new Vector3(4, 4, 4) ); const expectedResult2 = new Box3( new Vector3(-1, -1, -1), new Vector3(4, 4, 4) ); a.union(c); assert.ok(a.equals(expectedResult2), 'Union of non-overlapping boxes is correct'); }); QUnit.test('applyMatrix4', assert => { const a = new Box3(zero3.clone(), one3.clone()); const m = new Matrix4().makeTranslation(1, 2, 3); const expectedResult = new Box3( new Vector3(1, 2, 3), new Vector3(2, 3, 4) ); a.applyMatrix4(m); assert.ok(a.equals(expectedResult), 'Box translated correctly'); const b = new Box3(zero3.clone(), one3.clone()); // Create a scale matrix const m2 = new Matrix4().makeScale(2, 3, 4); const expectedResult2 = new Box3( new Vector3(0, 0, 0), new Vector3(2, 3, 4) ); b.applyMatrix4(m2); assert.ok(b.equals(expectedResult2), 'Box scaled correctly'); const emptyBox = new Box3(); emptyBox.makeEmpty(); emptyBox.applyMatrix4(m); assert.ok(emptyBox.isEmpty(), 'Empty box remains empty after transformation'); }); QUnit.test('containsPoint', assert => { const a = new Box3(zero3.clone(), one3.clone()); assert.ok(a.containsPoint(new Vector3(0.5, 0.5, 0.5)), 'Point inside box should return true'); assert.ok(a.containsPoint(zero3), 'Point on min boundary should return true'); assert.ok(a.containsPoint(one3), 'Point on max boundary should return true'); assert.ok(!a.containsPoint(new Vector3(2, 2, 2)), 'Point outside box should return false'); const emptyBox = new Box3(); emptyBox.makeEmpty(); assert.ok(!emptyBox.containsPoint(zero3), 'Empty box should not contain any points'); }); QUnit.test('intersectsTriangle', assert => { const a = new Box3(zero3.clone(), one3.clone()); // Triangle completely inside box const insideTriangle = { a: new Vector3(0.1, 0.1, 0.1), b: new Vector3(0.5, 0.5, 0.5), c: new Vector3(0.9, 0.9, 0.9) }; assert.ok(a.intersectsTriangle(insideTriangle), 'Triangle inside box should intersect'); // Triangle intersecting box const intersectingTriangle = { a: new Vector3(0.5, 0.5, 0.5), b: new Vector3(1.5, 0.5, 0.5), c: new Vector3(0.5, 1.5, 0.5) }; assert.ok(a.intersectsTriangle(intersectingTriangle), 'Triangle intersecting box should intersect'); // Triangle completely outside box const outsideTriangle = { a: new Vector3(2, 2, 2), b: new Vector3(3, 2, 2), c: new Vector3(2, 3, 2) }; assert.ok(!a.intersectsTriangle(outsideTriangle), 'Triangle outside box should not intersect'); // Empty box should not intersect any triangle const emptyBox = new Box3(); emptyBox.makeEmpty(); assert.ok(!emptyBox.intersectsTriangle(insideTriangle), 'Empty box should not intersect any triangle'); }); QUnit.test('clone', assert => { const a = new Box3(zero3.clone(), one3.clone()); const b = a.clone(); assert.ok(b.min.equals(zero3), 'Min cloned correctly'); assert.ok(b.max.equals(one3), 'Max cloned correctly'); assert.ok(b !== a, 'New instance created via clone'); // Ensure it's a deep copy a.min.set(1, 1, 1); a.max.set(2, 2, 2); assert.ok(!b.min.equals(a.min), 'Changes to original do not affect clone (min)'); assert.ok(!b.max.equals(a.max), 'Changes to original do not affect clone (max)'); }); QUnit.test('copy', assert => { const a = new Box3(zero3.clone(), one3.clone()); const b = new Box3().copy(a); assert.ok(b.min.equals(zero3), 'Min copied correctly'); assert.ok(b.max.equals(one3), 'Max copied correctly'); assert.ok(b !== a, 'Different instances'); // Ensure it's a deep copy a.min.set(1, 1, 1); a.max.set(2, 2, 2); assert.ok(!b.min.equals(a.min), 'Changes to original do not affect copy (min)'); assert.ok(!b.max.equals(a.max), 'Changes to original do not affect copy (max)'); }); ================================================ FILE: tests/unit/src/math/Color3.tests.js ================================================ import { Color3 } from 't3d'; import { eps } from '../../utils/math-constants.js'; QUnit.module('Color3'); QUnit.test('setHex', assert => { const a = new Color3(); a.setHex(0xff0000); assert.ok(a.r == 1, 'Passed!'); assert.ok(a.g == 0, 'Passed!'); assert.ok(a.b == 0, 'Passed!'); }); QUnit.test('setRGB', assert => { const a = new Color3(); a.setRGB(0.5, 0.5, 0.5); assert.ok(a.r == 0.5, 'Passed!'); assert.ok(a.g == 0.5, 'Passed!'); assert.ok(a.b == 0.5, 'Passed!'); }); QUnit.test('setHSL', assert => { const a = new Color3(); a.setHSL(0, 1, 0.5); assert.ok(Math.abs(a.r - 1) < eps, 'Passed!'); assert.ok(Math.abs(a.g - 0) < eps, 'Passed!'); assert.ok(Math.abs(a.b - 0) < eps, 'Passed!'); }); QUnit.test('clone', assert => { const a = new Color3().clone(); assert.ok(a.r == 0, 'Passed!'); assert.ok(a.g == 0, 'Passed!'); assert.ok(a.b == 0, 'Passed!'); const b = a.setRGB(0.3, 0.3, 0.3).clone(); assert.ok(b.r == 0.3, 'Passed!'); assert.ok(b.g == 0.3, 'Passed!'); assert.ok(b.b == 0.3, 'Passed!'); }); QUnit.test('copy', assert => { const a = new Color3(0.5, 0.5, 0.5); const b = new Color3().copy(a); assert.ok(b.r == 0.5, 'Passed!'); assert.ok(b.g == 0.5, 'Passed!'); assert.ok(b.b == 0.5, 'Passed!'); }); QUnit.test('convertSRGBToLinear', assert => { const a = new Color3(0.5, 0.5, 0.5).convertSRGBToLinear(); assert.ok(a.r < 0.5, 'Passed!'); assert.ok(a.g < 0.5, 'Passed!'); assert.ok(a.b < 0.5, 'Passed!'); }); QUnit.test('convertLinearToSRGB', assert => { const a = new Color3(0.5, 0.5, 0.5).convertLinearToSRGB(); assert.ok(a.r > 0.5, 'Passed!'); assert.ok(a.g > 0.5, 'Passed!'); assert.ok(a.b > 0.5, 'Passed!'); }); QUnit.test('getHex', assert => { const a = new Color3(1, 0, 0); assert.ok(a.getHex() == 0xff0000, 'Passed!'); }); QUnit.test('lerp', assert => { const a = new Color3(0, 0, 0); const b = new Color3(1, 1, 1); a.lerp(b, 0.5); assert.ok(a.r == 0.5, 'Passed!'); assert.ok(a.g == 0.5, 'Passed!'); assert.ok(a.b == 0.5, 'Passed!'); }); QUnit.test('lerpColors', assert => { const a = new Color3(); const b = new Color3(0, 0, 0); const c = new Color3(1, 1, 1); a.lerpColors(b, c, 0.5); assert.ok(a.r == 0.5, 'Passed!'); assert.ok(a.g == 0.5, 'Passed!'); assert.ok(a.b == 0.5, 'Passed!'); }); QUnit.test('fromArray', assert => { const array = new Uint8Array([255, 255, 0]); const a = new Color3(); a.fromArray(array, 0, true); assert.ok(a.r == 1, 'Passed!'); assert.ok(a.g == 1, 'Passed!'); assert.ok(a.b == 0, 'Passed!'); }); QUnit.test('toArray', assert => { const array = new Uint8Array(3); const a = new Color3(1, 1, 0); a.toArray(array, 0, true); assert.ok(array[0] == 255, 'Passed!'); assert.ok(array[1] == 255, 'Passed!'); assert.ok(array[2] == 0, 'Passed!'); }); QUnit.test('iterable', assert => { const c = new Color3(0.5, 0.75, 1); const array = [...c]; assert.strictEqual(array[0], 0.5, 'Color3 is iterable.'); assert.strictEqual(array[1], 0.75, 'Color3 is iterable.'); assert.strictEqual(array[2], 1, 'Color3 is iterable.'); }); ================================================ FILE: tests/unit/src/math/Color4.tests.js ================================================ import { Color4 } from 't3d'; QUnit.module('Color4'); QUnit.test('setRGBA', assert => { const a = new Color4(); a.setRGBA(0.5, 0.5, 0.5, 0.5); assert.ok(a.r == 0.5, 'Passed!'); assert.ok(a.g == 0.5, 'Passed!'); assert.ok(a.b == 0.5, 'Passed!'); assert.ok(a.a == 0.5, 'Passed!'); }); QUnit.test('clone', assert => { const a = new Color4().clone(); assert.ok(a.r == 0, 'Passed!'); assert.ok(a.g == 0, 'Passed!'); assert.ok(a.b == 0, 'Passed!'); assert.ok(a.a == 1, 'Passed!'); const b = a.setRGBA(0.3, 0.3, 0.3, 0.3).clone(); assert.ok(b.r == 0.3, 'Passed!'); assert.ok(b.g == 0.3, 'Passed!'); assert.ok(b.b == 0.3, 'Passed!'); assert.ok(b.a == 0.3, 'Passed!'); }); QUnit.test('copy', assert => { const a = new Color4(0.5, 0.5, 0.5, 0.5); const b = new Color4().copy(a); assert.ok(b.r == 0.5, 'Passed!'); assert.ok(b.g == 0.5, 'Passed!'); assert.ok(b.b == 0.5, 'Passed!'); assert.ok(b.a == 0.5, 'Passed!'); }); QUnit.test('fromArray', assert => { const array = new Uint8Array([255, 255, 0, 128]); const a = new Color4(); a.fromArray(array, 0, true); assert.ok(a.r == 1, 'Passed!'); assert.ok(a.g == 1, 'Passed!'); assert.ok(a.b == 0, 'Passed!'); assert.ok(a.a == 0.5019607843137255, 'Passed!'); }); QUnit.test('toArray', assert => { const array = new Uint8Array(4); const a = new Color4(1, 1, 0, 0.5); a.toArray(array, 0, true); assert.ok(array[0] == 255, 'Passed!'); assert.ok(array[1] == 255, 'Passed!'); assert.ok(array[2] == 0, 'Passed!'); assert.ok(array[3] == 128, 'Passed!'); }); QUnit.test('iterable', assert => { const c = new Color4(0.5, 0.75, 1, 0.5); const array = [...c]; assert.strictEqual(array[0], 0.5, 'Color4 is iterable.'); assert.strictEqual(array[1], 0.75, 'Color4 is iterable.'); assert.strictEqual(array[2], 1, 'Color4 is iterable.'); assert.strictEqual(array[3], 0.5, 'Color4 is iterable.'); }); ================================================ FILE: tests/unit/src/math/MathUtils.tests.js ================================================ import { MathUtils } from 't3d'; QUnit.module('MathUtils'); QUnit.test('generateUUID', assert => { const a = MathUtils.generateUUID(); const regex = /[A-Z0-9]{8}-[A-Z0-9]{4}-4[A-Z0-9]{3}-[A-Z0-9]{4}-[A-Z0-9]{12}/i; // note the fixed '4' here ----------^ assert.ok(regex.test(a), 'Generated UUID matches the expected pattern'); }); QUnit.test('clamp', assert => { assert.strictEqual(MathUtils.clamp(0.5, 0, 1), 0.5, 'Value already within limits'); assert.strictEqual(MathUtils.clamp(0, 0, 1), 0, 'Value equal to one limit'); assert.strictEqual(MathUtils.clamp(-0.1, 0, 1), 0, 'Value too low'); assert.strictEqual(MathUtils.clamp(1.1, 0, 1), 1, 'Value too high'); }); QUnit.test('euclideanModulo', assert => { assert.ok(isNaN(MathUtils.euclideanModulo(6, 0)), 'Division by zero returns NaN'); assert.strictEqual(MathUtils.euclideanModulo(6, 1), 0, 'Division by trivial divisor'); assert.strictEqual(MathUtils.euclideanModulo(6, 2), 0, 'Division by non-trivial divisor'); assert.strictEqual(MathUtils.euclideanModulo(6, 5), 1, 'Division by itself - 1'); assert.strictEqual(MathUtils.euclideanModulo(6, 6), 0, 'Division by itself'); assert.strictEqual(MathUtils.euclideanModulo(6, 7), 6, 'Division by itself + 1'); }); QUnit.test('mapLinear', assert => { assert.strictEqual(MathUtils.mapLinear(0.5, 0, 1, 0, 10), 5, 'Value within range'); assert.strictEqual(MathUtils.mapLinear(0.0, 0, 1, 0, 10), 0, 'Value equal to lower boundary'); assert.strictEqual(MathUtils.mapLinear(1.0, 0, 1, 0, 10), 10, 'Value equal to upper boundary'); }); QUnit.test('lerp', assert => { assert.strictEqual(MathUtils.lerp(1, 2, 0), 1, 'Value equal to lower boundary'); assert.strictEqual(MathUtils.lerp(1, 2, 1), 2, 'Value equal to upper boundary'); assert.strictEqual(MathUtils.lerp(1, 2, 0.4), 1.4, 'Value within range'); }); QUnit.todo('isPowerOfTwo', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.todo('nearestPowerOfTwo', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.todo('nextPowerOfTwo', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.todo('nextPowerOfTwoSquareSize', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.todo('denormalize/normalize', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.todo('toHalfFloat/fromHalfFloat', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); ================================================ FILE: tests/unit/src/math/Matrix3.tests.js ================================================ import { Matrix3 } from 't3d'; QUnit.module('Matrix3'); function matrixEquals3(a, b, tolerance) { tolerance = tolerance || 0.0001; if (a.elements.length != b.elements.length) { return false; } for (let i = 0, il = a.elements.length; i < il; i++) { const delta = a.elements[i] - b.elements[i]; if (delta > tolerance) { return false; } } return true; } QUnit.test('determinant', assert => { const a = new Matrix3(); assert.ok(a.determinant() == 1, 'Passed!'); a.elements[0] = 2; assert.ok(a.determinant() == 2, 'Passed!'); a.elements[0] = 0; assert.ok(a.determinant() == 0, 'Passed!'); // calculated via http://www.euclideanspace.com/maths/algebra/matrix/functions/determinant/threeD/index.htm a.set(2, 3, 4, 5, 13, 7, 8, 9, 11); assert.ok(a.determinant() == -73, 'Passed!'); }); QUnit.test('clone', assert => { const a = new Matrix3().set(0, 1, 2, 3, 4, 5, 6, 7, 8); const b = a.clone(); assert.ok(matrixEquals3(a, b), 'Passed!'); // ensure that it is a true copy a.elements[0] = 2; assert.ok(!matrixEquals3(a, b), 'Passed!'); }); ================================================ FILE: tests/unit/src/math/Matrix4.tests.js ================================================ import { Vector3, Matrix3, Matrix4, Euler, Quaternion } from 't3d'; import { eps } from '../../utils/math-constants.js'; QUnit.module('Matrix4'); function matrixEquals4(a, b, tolerance) { tolerance = tolerance || 0.0001; if (a.elements.length != b.elements.length) { return false; } for (let i = 0, il = a.elements.length; i < il; i++) { const delta = Math.abs(a.elements[i] - b.elements[i]); if (delta > tolerance) { return false; } } return true; } function eulerEquals(a, b, tolerance) { tolerance = tolerance || 0.0001; const diff = Math.abs(a.x - b.x) + Math.abs(a.y - b.y) + Math.abs(a.z - b.z); return (diff < tolerance); } QUnit.test('set', assert => { const b = new Matrix4(); assert.ok(b.determinant() == 1, 'Passed!'); b.set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); assert.ok(b.elements[0] == 0); assert.ok(b.elements[1] == 4); assert.ok(b.elements[2] == 8); assert.ok(b.elements[3] == 12); assert.ok(b.elements[4] == 1); assert.ok(b.elements[5] == 5); assert.ok(b.elements[6] == 9); assert.ok(b.elements[7] == 13); assert.ok(b.elements[8] == 2); assert.ok(b.elements[9] == 6); assert.ok(b.elements[10] == 10); assert.ok(b.elements[11] == 14); assert.ok(b.elements[12] == 3); assert.ok(b.elements[13] == 7); assert.ok(b.elements[14] == 11); assert.ok(b.elements[15] == 15); }); QUnit.test('identity', assert => { const b = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); assert.ok(b.elements[0] == 0); assert.ok(b.elements[1] == 4); assert.ok(b.elements[2] == 8); assert.ok(b.elements[3] == 12); assert.ok(b.elements[4] == 1); assert.ok(b.elements[5] == 5); assert.ok(b.elements[6] == 9); assert.ok(b.elements[7] == 13); assert.ok(b.elements[8] == 2); assert.ok(b.elements[9] == 6); assert.ok(b.elements[10] == 10); assert.ok(b.elements[11] == 14); assert.ok(b.elements[12] == 3); assert.ok(b.elements[13] == 7); assert.ok(b.elements[14] == 11); assert.ok(b.elements[15] == 15); const a = new Matrix4(); assert.ok(!matrixEquals4(a, b), 'Passed!'); b.identity(); assert.ok(matrixEquals4(a, b), 'Passed!'); }); QUnit.test('clone', assert => { const a = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const b = a.clone(); assert.ok(matrixEquals4(a, b), 'Passed!'); // ensure that it is a true copy a.elements[0] = 2; assert.ok(!matrixEquals4(a, b), 'Passed!'); }); QUnit.test('copy', assert => { const a = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const b = new Matrix4().copy(a); assert.ok(matrixEquals4(a, b), 'Passed!'); // ensure that it is a true copy a.elements[0] = 2; assert.ok(!matrixEquals4(a, b), 'Passed!'); }); QUnit.test('setFromMatrix3', assert => { const a = new Matrix3().set( 0, 1, 2, 3, 4, 5, 6, 7, 8 ); const b = new Matrix4(); const c = new Matrix4().set( 0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 8, 0, 0, 0, 0, 1 ); b.setFromMatrix3(a); assert.ok(b.equals(c)); }); QUnit.test('makeBasis/extractBasis', assert => { const identityBasis = [new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1)]; const a = new Matrix4().makeBasis(identityBasis[0], identityBasis[1], identityBasis[2]); const identity = new Matrix4(); assert.ok(matrixEquals4(a, identity), 'Passed!'); const testBases = [[new Vector3(0, 1, 0), new Vector3(-1, 0, 0), new Vector3(0, 0, 1)]]; for (let i = 0; i < testBases.length; i++) { const testBasis = testBases[i]; const b = new Matrix4().makeBasis(testBasis[0], testBasis[1], testBasis[2]); const outBasis = [new Vector3(), new Vector3(), new Vector3()]; b.extractBasis(outBasis[0], outBasis[1], outBasis[2]); // check what goes in, is what comes out. for (let j = 0; j < outBasis.length; j++) { assert.ok(outBasis[j].equals(testBasis[j]), 'Passed!'); } // get the basis out the hard war for (let j = 0; j < identityBasis.length; j++) { outBasis[j].copy(identityBasis[j]); outBasis[j].applyMatrix4(b); } // did the multiply method of basis extraction work? for (let j = 0; j < outBasis.length; j++) { assert.ok(outBasis[j].equals(testBasis[j]), 'Passed!'); } } }); QUnit.test('makeRotationFromEuler/extractRotation', assert => { const testValues = [ new Euler(0, 0, 0, 'XYZ'), new Euler(1, 0, 0, 'XYZ'), new Euler(0, 1, 0, 'ZYX'), new Euler(0, 0, 0.5, 'YZX'), new Euler(0, 0, -0.5, 'YZX') ]; for (let i = 0; i < testValues.length; i++) { const v = testValues[i]; const m = new Matrix4().makeRotationFromEuler(v); const v2 = new Euler().setFromRotationMatrix(m, v.order); const m2 = new Matrix4().makeRotationFromEuler(v2); assert.ok(matrixEquals4(m, m2, eps), 'makeRotationFromEuler #' + i + ': original and Euler-derived matrices are equal'); assert.ok(eulerEquals(v, v2, eps), 'makeRotationFromEuler #' + i + ': original and matrix-derived Eulers are equal'); const m3 = new Matrix4().extractRotation(m2); const v3 = new Euler().setFromRotationMatrix(m3, v.order); assert.ok(matrixEquals4(m, m3, eps), 'extractRotation #' + i + ': original and extracted matrices are equal'); assert.ok(eulerEquals(v, v3, eps), 'extractRotation #' + i + ': original and extracted Eulers are equal'); } }); QUnit.todo('makeRotationFromQuaternion', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('lookAtRH', assert => { const a = new Matrix4(); const expected = new Matrix4().identity(); const eye = new Vector3(0, 0, 0); const target = new Vector3(0, 1, -1); const up = new Vector3(0, 1, 0); a.lookAtRH(eye, target, up); const rotation = new Euler().setFromRotationMatrix(a); assert.ok(Math.abs(rotation.x * (180 / Math.PI) - 45) < eps, 'Check the rotation'); // eye and target are in the same position eye.copy(target); a.lookAtRH(eye, target, up); assert.ok(matrixEquals4(a, expected), 'Check the result for eye == target'); // up and z are parallel eye.set(0, 1, 0); target.set(0, 0, 0); a.lookAtRH(eye, target, up); expected.set( 1, 0, 0, 0, 0, 0.0001, 1, 0, 0, -1, 0.0001, 0, 0, 0, 0, 1 ); assert.ok(matrixEquals4(a, expected), 'Check the result for when up and z are parallel'); }); QUnit.test('multiply', assert => { const lhs = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53); const rhs = new Matrix4().set(59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131); lhs.multiply(rhs); assert.ok(lhs.elements[0] == 1585); assert.ok(lhs.elements[1] == 5318); assert.ok(lhs.elements[2] == 10514); assert.ok(lhs.elements[3] == 15894); assert.ok(lhs.elements[4] == 1655); assert.ok(lhs.elements[5] == 5562); assert.ok(lhs.elements[6] == 11006); assert.ok(lhs.elements[7] == 16634); assert.ok(lhs.elements[8] == 1787); assert.ok(lhs.elements[9] == 5980); assert.ok(lhs.elements[10] == 11840); assert.ok(lhs.elements[11] == 17888); assert.ok(lhs.elements[12] == 1861); assert.ok(lhs.elements[13] == 6246); assert.ok(lhs.elements[14] == 12378); assert.ok(lhs.elements[15] == 18710); }); QUnit.test('premultiply', assert => { const lhs = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53); const rhs = new Matrix4().set(59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131); rhs.premultiply(lhs); assert.ok(rhs.elements[0] == 1585); assert.ok(rhs.elements[1] == 5318); assert.ok(rhs.elements[2] == 10514); assert.ok(rhs.elements[3] == 15894); assert.ok(rhs.elements[4] == 1655); assert.ok(rhs.elements[5] == 5562); assert.ok(rhs.elements[6] == 11006); assert.ok(rhs.elements[7] == 16634); assert.ok(rhs.elements[8] == 1787); assert.ok(rhs.elements[9] == 5980); assert.ok(rhs.elements[10] == 11840); assert.ok(rhs.elements[11] == 17888); assert.ok(rhs.elements[12] == 1861); assert.ok(rhs.elements[13] == 6246); assert.ok(rhs.elements[14] == 12378); assert.ok(rhs.elements[15] == 18710); }); QUnit.test('multiplyMatrices', assert => { const lhs = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53); const rhs = new Matrix4().set(59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131); const ans = new Matrix4(); ans.multiplyMatrices(lhs, rhs); assert.ok(ans.elements[0] == 1585); assert.ok(ans.elements[1] == 5318); assert.ok(ans.elements[2] == 10514); assert.ok(ans.elements[3] == 15894); assert.ok(ans.elements[4] == 1655); assert.ok(ans.elements[5] == 5562); assert.ok(ans.elements[6] == 11006); assert.ok(ans.elements[7] == 16634); assert.ok(ans.elements[8] == 1787); assert.ok(ans.elements[9] == 5980); assert.ok(ans.elements[10] == 11840); assert.ok(ans.elements[11] == 17888); assert.ok(ans.elements[12] == 1861); assert.ok(ans.elements[13] == 6246); assert.ok(ans.elements[14] == 12378); assert.ok(ans.elements[15] == 18710); }); QUnit.test('determinant', assert => { const a = new Matrix4(); assert.ok(a.determinant() == 1, 'Passed!'); a.elements[0] = 2; assert.ok(a.determinant() == 2, 'Passed!'); a.elements[0] = 0; assert.ok(a.determinant() == 0, 'Passed!'); a.set(2, 3, 4, 5, -1, -21, -3, -4, 6, 7, 8, 10, -8, -9, -10, -12); assert.ok(a.determinant() == 76, 'Passed!'); }); QUnit.test('transpose', assert => { const a = new Matrix4(); let b = a.clone().transpose(); assert.ok(matrixEquals4(a, b), 'Passed!'); b = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const c = b.clone().transpose(); assert.ok(!matrixEquals4(b, c), 'Passed!'); c.transpose(); assert.ok(matrixEquals4(b, c), 'Passed!'); }); QUnit.test('setPosition', assert => { const a = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const b = new Vector3(-1, -2, -3); const c = new Matrix4().set(0, 1, 2, -1, 4, 5, 6, -2, 8, 9, 10, -3, 12, 13, 14, 15); a.setPosition(b); assert.ok(matrixEquals4(a, c), 'Passed!'); const d = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const e = new Matrix4().set(0, 1, 2, -1, 4, 5, 6, -2, 8, 9, 10, -3, 12, 13, 14, 15); d.setPosition(-1, -2, -3); assert.ok(matrixEquals4(d, e), 'Passed!'); }); QUnit.todo('invert', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('getMaxScaleOnAxis', assert => { const a = new Matrix4().set(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); const expected = Math.sqrt(3 * 3 + 7 * 7 + 11 * 11); assert.ok(Math.abs(a.getMaxScaleOnAxis() - expected) <= eps, 'Check result'); }); QUnit.test('makeTranslation', assert => { const a = new Matrix4(); const b = new Vector3(2, 3, 4); const c = new Matrix4().set(1, 0, 0, 2, 0, 1, 0, 3, 0, 0, 1, 4, 0, 0, 0, 1); a.makeTranslation(b.x, b.y, b.z); assert.ok(matrixEquals4(a, c), 'Passed!'); a.makeTranslation(b); assert.ok(matrixEquals4(a, c), 'Passed!'); }); QUnit.test('makeRotationAxis', assert => { const axis = new Vector3(1.5, 0.0, 1.0).normalize(); const radians = 45 * (Math.PI / 180); // Convert degrees to radians const a = new Matrix4().makeRotationAxis(axis, radians); const expected = new Matrix4().set( 0.9098790095958609, -0.39223227027636803, 0.13518148560620882, 0, 0.39223227027636803, 0.7071067811865476, -0.588348405414552, 0, 0.13518148560620882, 0.588348405414552, 0.7972277715906868, 0, 0, 0, 0, 1 ); assert.ok(matrixEquals4(a, expected), 'Check numeric result'); }); QUnit.test('makeScale', assert => { const a = new Matrix4(); const c = new Matrix4().set(2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1); a.makeScale(2, 3, 4); assert.ok(matrixEquals4(a, c), 'Passed!'); }); QUnit.test('compose/decompose', assert => { const tValues = [ new Vector3(), new Vector3(3, 0, 0), new Vector3(0, 4, 0), new Vector3(0, 0, 5), new Vector3(-6, 0, 0), new Vector3(0, -7, 0), new Vector3(0, 0, -8), new Vector3(-2, 5, -9), new Vector3(-2, -5, -9) ]; const sValues = [ new Vector3(1, 1, 1), new Vector3(2, 2, 2), new Vector3(1, -1, 1), new Vector3(-1, 1, 1), new Vector3(1, 1, -1), new Vector3(2, -2, 1), new Vector3(-1, 2, -2), new Vector3(-1, -1, -1), new Vector3(-2, -2, -2) ]; const rValues = [ new Quaternion(), new Quaternion().setFromEuler(new Euler(1, 1, 0)), new Quaternion().setFromEuler(new Euler(1, -1, 1)), new Quaternion(0, 0.9238795292366128, 0, 0.38268342717215614) ]; for (let ti = 0; ti < tValues.length; ti++) { for (let si = 0; si < sValues.length; si++) { for (let ri = 0; ri < rValues.length; ri++) { const t = tValues[ti]; const s = sValues[si]; const r = rValues[ri]; const m = new Matrix4().compose(t, r, s); const t2 = new Vector3(); const r2 = new Quaternion(); const s2 = new Vector3(); m.decompose(t2, r2, s2); const m2 = new Matrix4().compose(t2, r2, s2); assert.ok(matrixEquals4(m, m2), 'Passed!'); } } } }); QUnit.test('equals', assert => { const a = new Matrix4().set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); const b = new Matrix4().set(0, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); assert.notOk(a.equals(b), 'Check that a does not equal b'); assert.notOk(b.equals(a), 'Check that b does not equal a'); a.copy(b); assert.ok(a.equals(b), 'Check that a equals b after copy()'); assert.ok(b.equals(a), 'Check that b equals a after copy()'); }); QUnit.test('fromArray', assert => { const a = new Matrix4(); const b = new Matrix4().set(1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16); a.fromArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); assert.ok(a.equals(b), 'Passed'); }); QUnit.test('toArray', assert => { const a = new Matrix4().set(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); const noOffset = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16]; const withOffset = [undefined, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16]; let array = a.toArray(); assert.deepEqual(array, noOffset, 'No array, no offset'); array = []; a.toArray(array); assert.deepEqual(array, noOffset, 'With array, no offset'); array = []; a.toArray(array, 1); assert.deepEqual(array, withOffset, 'With array, with offset'); }); ================================================ FILE: tests/unit/src/math/Plane.tests.js ================================================ import { Plane, Vector3 } from 't3d'; import { eps } from '../../utils/math-constants.js'; QUnit.module('Plane'); QUnit.test('intersectPlanes', assert => { const p1 = new Plane(new Vector3(1, 0, 0), -1); const p2 = new Plane(new Vector3(0, 1, 0), -1); const p3 = new Plane(new Vector3(0, 0, 1), -1); const point = Plane.intersectPlanes(p1, p2, p3, new Vector3()); assert.ok(Math.abs(point.x - 1) <= eps, 'Passed!'); assert.ok(Math.abs(point.y - 1) <= eps, 'Passed!'); assert.ok(Math.abs(point.z - 1) <= eps, 'Passed!'); }); ================================================ FILE: tests/unit/src/math/Quaternion.tests.js ================================================ import { Quaternion, Vector3, Euler, Matrix4, Vector4 } from 't3d'; import { x, y, z, w, eps } from '../../utils/math-constants.js'; QUnit.module('Quaternion'); QUnit.test('constructor', assert => { let a = new Quaternion(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z == 0, 'Passed!'); assert.ok(a.w == 1, 'Passed!'); a = new Quaternion(x, y, z, w); assert.ok(a.x === x, 'Passed!'); assert.ok(a.y === y, 'Passed!'); assert.ok(a.z === z, 'Passed!'); assert.ok(a.w === w, 'Passed!'); }); QUnit.test('slerp', assert => { slerpTestSkeleton(doSlerpObject, Number.EPSILON, assert); }); QUnit.test('slerpFlat', assert => { slerpTestSkeleton(doSlerpArray, Number.EPSILON, assert); }); QUnit.test('properties', assert => { assert.expect(8); const a = new Quaternion(); a.onChange(function() { assert.ok(true, 'onChange called'); }); a.x = x; a.y = y; a.z = z; a.w = w; assert.strictEqual(a.x, x, 'Check x'); assert.strictEqual(a.y, y, 'Check y'); assert.strictEqual(a.z, z, 'Check z'); assert.strictEqual(a.w, w, 'Check w'); }); QUnit.test('x', assert => { let a = new Quaternion(); assert.ok(a.x === 0, 'Passed!'); a = new Quaternion(1, 2, 3); assert.ok(a.x === 1, 'Passed!'); a = new Quaternion(4, 5, 6, 1); assert.ok(a.x === 4, 'Passed!'); a = new Quaternion(7, 8, 9); a.x = 10; assert.ok(a.x === 10, 'Passed!'); a = new Quaternion(11, 12, 13); let b = false; a.onChange(function() { b = true; }); assert.ok(!b, 'Passed!'); a.x = 14; assert.ok(b, 'Passed!'); assert.ok(a.x === 14, 'Passed!'); }); QUnit.test('y', assert => { let a = new Quaternion(); assert.ok(a.y === 0, 'Passed!'); a = new Quaternion(1, 2, 3); assert.ok(a.y === 2, 'Passed!'); a = new Quaternion(4, 5, 6, 1); assert.ok(a.y === 5, 'Passed!'); a = new Quaternion(7, 8, 9); a.y = 10; assert.ok(a.y === 10, 'Passed!'); a = new Quaternion(11, 12, 13); let b = false; a.onChange(function() { b = true; }); assert.ok(!b, 'Passed!'); a.y = 14; assert.ok(b, 'Passed!'); assert.ok(a.y === 14, 'Passed!'); }); QUnit.test('z', assert => { let a = new Quaternion(); assert.ok(a.z === 0, 'Passed!'); a = new Quaternion(1, 2, 3); assert.ok(a.z === 3, 'Passed!'); a = new Quaternion(4, 5, 6, 1); assert.ok(a.z === 6, 'Passed!'); a = new Quaternion(7, 8, 9); a.z = 10; assert.ok(a.z === 10, 'Passed!'); a = new Quaternion(11, 12, 13); let b = false; a.onChange(function() { b = true; }); assert.ok(!b, 'Passed!'); a.z = 14; assert.ok(b, 'Passed!'); assert.ok(a.z === 14, 'Passed!'); }); QUnit.test('w', assert => { let a = new Quaternion(); assert.ok(a.w === 1, 'Passed!'); a = new Quaternion(1, 2, 3); assert.ok(a.w === 1, 'Passed!'); a = new Quaternion(4, 5, 6, 1); assert.ok(a.w === 1, 'Passed!'); a = new Quaternion(7, 8, 9); a.w = 10; assert.ok(a.w === 10, 'Passed!'); a = new Quaternion(11, 12, 13); let b = false; a.onChange(function() { b = true; }); assert.ok(!b, 'Passed!'); a.w = 14; assert.ok(b, 'Passed!'); assert.ok(a.w === 14, 'Passed!'); }); QUnit.test('isQuaternion', assert => { const object = new Quaternion(); assert.ok(object.isQuaternion, 'Quaternion.isQuaternion should be true'); }); QUnit.test('set', assert => { const a = new Quaternion(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z == 0, 'Passed!'); assert.ok(a.w == 1, 'Passed!'); a.set(x, y, z, w); assert.ok(a.x == x, 'Passed!'); assert.ok(a.y == y, 'Passed!'); assert.ok(a.z === z, 'Passed!'); assert.ok(a.w === w, 'Passed!'); }); QUnit.test('clone', assert => { const a = new Quaternion().clone(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z == 0, 'Passed!'); assert.ok(a.w == 1, 'Passed!'); const b = a.set(x, y, z, w).clone(); assert.ok(b.x == x, 'Passed!'); assert.ok(b.y == y, 'Passed!'); assert.ok(b.z === z, 'Passed!'); assert.ok(b.w === w, 'Passed!'); }); QUnit.test('copy', assert => { const a = new Quaternion(x, y, z, w); const b = new Quaternion().copy(a); assert.ok(b.x == x, 'Passed!'); assert.ok(b.y == y, 'Passed!'); assert.ok(b.z == z, 'Passed!'); assert.ok(b.w == w, 'Passed!'); // ensure that it is a true copy a.x = 0; a.y = -1; a.z = 0; a.w = -1; assert.ok(b.x == x, 'Passed!'); assert.ok(b.y == y, 'Passed!'); }); QUnit.test('setFromEuler/setFromQuaternion', assert => { const angles = [new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1)]; // ensure euler conversion to/from Quaternion matches. for (let i = 0; i < orders.length; i++) { for (let j = 0; j < angles.length; j++) { const eulers2 = new Euler().setFromQuaternion(new Quaternion().setFromEuler(new Euler(angles[j].x, angles[j].y, angles[j].z, orders[i])), orders[i]); const newAngle = new Vector3(eulers2.x, eulers2.y, eulers2.z); assert.ok(newAngle.distanceTo(angles[j]) < 0.001, 'Passed!'); } } }); QUnit.test('setFromAxisAngle', assert => { // TODO: find cases to validate. // assert.ok( true, "Passed!" ); const zero = new Quaternion(); let a = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), 0); assert.ok(a.equals(zero), 'Passed!'); a = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), 0); assert.ok(a.equals(zero), 'Passed!'); a = new Quaternion().setFromAxisAngle(new Vector3(0, 0, 1), 0); assert.ok(a.equals(zero), 'Passed!'); const b1 = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), Math.PI); assert.ok(!a.equals(b1), 'Passed!'); const b2 = new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -Math.PI); assert.ok(!a.equals(b2), 'Passed!'); b1.multiply(b2); assert.ok(a.equals(b1), 'Passed!'); }); QUnit.test('setFromEuler/setFromRotationMatrix', assert => { // ensure euler conversion for Quaternion matches that of Matrix4 for (let i = 0; i < orders.length; i++) { const q = new Quaternion().setFromEuler(changeEulerOrder(eulerAngles, orders[i])); const m = new Matrix4().makeRotationFromEuler(changeEulerOrder(eulerAngles, orders[i])); const q2 = new Quaternion().setFromRotationMatrix(m); assert.ok(qSub(q, q2).length() < 0.001, 'Passed!'); } }); QUnit.test('setFromRotationMatrix', assert => { // contrived examples purely to please the god of code coverage... // match conditions in various 'else [if]' blocks const a = new Quaternion(); let q = new Quaternion(-9, -2, 3, -4).normalize(); const m = new Matrix4().makeRotationFromQuaternion(q); let expected = new Vector4(0.8581163303210332, 0.19069251784911848, -0.2860387767736777, 0.38138503569823695); a.setFromRotationMatrix(m); assert.ok(Math.abs(a.x - expected.x) <= eps, 'm11 > m22 && m11 > m33: check x'); assert.ok(Math.abs(a.y - expected.y) <= eps, 'm11 > m22 && m11 > m33: check y'); assert.ok(Math.abs(a.z - expected.z) <= eps, 'm11 > m22 && m11 > m33: check z'); assert.ok(Math.abs(a.w - expected.w) <= eps, 'm11 > m22 && m11 > m33: check w'); q = new Quaternion(-1, -2, 1, -1).normalize(); m.makeRotationFromQuaternion(q); expected = new Vector4(0.37796447300922714, 0.7559289460184544, -0.37796447300922714, 0.37796447300922714); a.setFromRotationMatrix(m); assert.ok(Math.abs(a.x - expected.x) <= eps, 'm22 > m33: check x'); assert.ok(Math.abs(a.y - expected.y) <= eps, 'm22 > m33: check y'); assert.ok(Math.abs(a.z - expected.z) <= eps, 'm22 > m33: check z'); assert.ok(Math.abs(a.w - expected.w) <= eps, 'm22 > m33: check w'); }); QUnit.test('setFromUnitVectors', assert => { const a = new Quaternion(); const b = new Vector3(1, 0, 0); const c = new Vector3(0, 1, 0); const expected = new Quaternion(0, 0, Math.sqrt(2) / 2, Math.sqrt(2) / 2); a.setFromUnitVectors(b, c); assert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x'); assert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y'); assert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z'); assert.ok(Math.abs(a.w - expected.w) <= eps, 'Check w'); }); QUnit.test('angleTo', assert => { const a = new Quaternion(); const b = new Quaternion().setFromEuler(new Euler(0, Math.PI, 0)); const c = new Quaternion().setFromEuler(new Euler(0, Math.PI * 2, 0)); assert.ok(a.angleTo(a) === 0, 'Passed!'); assert.ok(a.angleTo(b) === Math.PI, 'Passed!'); assert.ok(a.angleTo(c) === 0, 'Passed!'); }); QUnit.test('identity', assert => { const a = new Quaternion(); a.set(x, y, z, w); a.identity(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z === 0, 'Passed!'); assert.ok(a.w === 1, 'Passed!'); }); QUnit.test('conjugate', assert => { const a = new Quaternion(x, y, z, w); // TODO: add better validation here. const b = a.clone().conjugate(); assert.ok(a.x == -b.x, 'Passed!'); assert.ok(a.y == -b.y, 'Passed!'); assert.ok(a.z == -b.z, 'Passed!'); assert.ok(a.w == b.w, 'Passed!'); }); QUnit.test('dot', assert => { let a = new Quaternion(); let b = new Quaternion(); assert.ok(a.dot(b) === 1, 'Passed!'); a = new Quaternion(1, 2, 3, 1); b = new Quaternion(3, 2, 1, 1); assert.ok(a.dot(b) === 11, 'Passed!'); }); QUnit.test('normalize/length/lengthSq', assert => { const a = new Quaternion(x, y, z, w); assert.ok(a.length() != 1, 'Passed!'); assert.ok(a.lengthSq() != 1, 'Passed!'); a.normalize(); assert.ok(a.length() == 1, 'Passed!'); assert.ok(a.lengthSq() == 1, 'Passed!'); a.set(0, 0, 0, 0); assert.ok(a.lengthSq() == 0, 'Passed!'); assert.ok(a.length() == 0, 'Passed!'); a.normalize(); assert.ok(a.lengthSq() == 1, 'Passed!'); assert.ok(a.length() == 1, 'Passed!'); }); QUnit.test('multiplyQuaternions/multiply', assert => { const angles = [new Euler(1, 0, 0), new Euler(0, 1, 0), new Euler(0, 0, 1)]; const q1 = new Quaternion().setFromEuler(changeEulerOrder(angles[0], 'XYZ')); const q2 = new Quaternion().setFromEuler(changeEulerOrder(angles[1], 'XYZ')); const q3 = new Quaternion().setFromEuler(changeEulerOrder(angles[2], 'XYZ')); const q = new Quaternion().multiplyQuaternions(q1, q2).multiply(q3); const m1 = new Matrix4().makeRotationFromEuler(changeEulerOrder(angles[0], 'XYZ')); const m2 = new Matrix4().makeRotationFromEuler(changeEulerOrder(angles[1], 'XYZ')); const m3 = new Matrix4().makeRotationFromEuler(changeEulerOrder(angles[2], 'XYZ')); const m = new Matrix4().multiplyMatrices(m1, m2).multiply(m3); const qFromM = new Quaternion().setFromRotationMatrix(m); assert.ok(qSub(q, qFromM).length() < 0.001, 'Passed!'); }); QUnit.test('premultiply', assert => { const a = new Quaternion(x, y, z, w); const b = new Quaternion(2 * x, -y, -2 * z, w); const expected = new Quaternion(42, -32, -2, 58); a.premultiply(b); assert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x'); assert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y'); assert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z'); assert.ok(Math.abs(a.w - expected.w) <= eps, 'Check w'); }); QUnit.test('slerp', assert => { const a = new Quaternion(x, y, z, w); const b = new Quaternion(-x, -y, -z, -w); const c = a.clone().slerp(b, 0); const d = a.clone().slerp(b, 1); assert.ok(a.equals(c), 'Passed'); assert.ok(b.equals(d), 'Passed'); const D = Math.SQRT1_2; const e = new Quaternion(1, 0, 0, 0); const f = new Quaternion(0, 0, 1, 0); let expected = new Quaternion(D, 0, D, 0); let result = e.clone().slerp(f, 0.5); assert.ok(Math.abs(result.x - expected.x) <= eps, 'Check x'); assert.ok(Math.abs(result.y - expected.y) <= eps, 'Check y'); assert.ok(Math.abs(result.z - expected.z) <= eps, 'Check z'); assert.ok(Math.abs(result.w - expected.w) <= eps, 'Check w'); const g = new Quaternion(0, D, 0, D); const h = new Quaternion(0, -D, 0, D); expected = new Quaternion(0, 0, 0, 1); result = g.clone().slerp(h, 0.5); assert.ok(Math.abs(result.x - expected.x) <= eps, 'Check x'); assert.ok(Math.abs(result.y - expected.y) <= eps, 'Check y'); assert.ok(Math.abs(result.z - expected.z) <= eps, 'Check z'); assert.ok(Math.abs(result.w - expected.w) <= eps, 'Check w'); }); QUnit.test('slerpQuaternions', assert => { const e = new Quaternion(1, 0, 0, 0); const f = new Quaternion(0, 0, 1, 0); const expected = new Quaternion(Math.SQRT1_2, 0, Math.SQRT1_2, 0); const a = new Quaternion(); a.slerpQuaternions(e, f, 0.5); assert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x'); assert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y'); assert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z'); assert.ok(Math.abs(a.w - expected.w) <= eps, 'Check w'); }); QUnit.test('equals', assert => { const a = new Quaternion(x, y, z, w); const b = new Quaternion(-x, -y, -z, -w); assert.ok(a.x != b.x, 'Passed!'); assert.ok(a.y != b.y, 'Passed!'); assert.ok(!a.equals(b), 'Passed!'); assert.ok(!b.equals(a), 'Passed!'); a.copy(b); assert.ok(a.x == b.x, 'Passed!'); assert.ok(a.y == b.y, 'Passed!'); assert.ok(a.equals(b), 'Passed!'); assert.ok(b.equals(a), 'Passed!'); }); QUnit.test('fromArray', assert => { const a = new Quaternion(); a.fromArray([x, y, z, w]); assert.ok(a.x == x, 'Passed!'); assert.ok(a.y == y, 'Passed!'); assert.ok(a.z === z, 'Passed!'); assert.ok(a.w === w, 'Passed!'); a.fromArray([undefined, x, y, z, w, undefined], 1); assert.ok(a.x == x, 'Passed!'); assert.ok(a.y == y, 'Passed!'); assert.ok(a.z === z, 'Passed!'); assert.ok(a.w === w, 'Passed!'); }); QUnit.test('toArray', assert => { const a = new Quaternion(x, y, z, w); let array = a.toArray(); assert.strictEqual(array[0], x, 'No array, no offset: check x'); assert.strictEqual(array[1], y, 'No array, no offset: check y'); assert.strictEqual(array[2], z, 'No array, no offset: check z'); assert.strictEqual(array[3], w, 'No array, no offset: check w'); array = []; a.toArray(array); assert.strictEqual(array[0], x, 'With array, no offset: check x'); assert.strictEqual(array[1], y, 'With array, no offset: check y'); assert.strictEqual(array[2], z, 'With array, no offset: check z'); assert.strictEqual(array[3], w, 'With array, no offset: check w'); array = []; a.toArray(array, 1); assert.strictEqual(array[0], undefined, 'With array and offset: check [0]'); assert.strictEqual(array[1], x, 'With array and offset: check x'); assert.strictEqual(array[2], y, 'With array and offset: check y'); assert.strictEqual(array[3], z, 'With array and offset: check z'); assert.strictEqual(array[4], w, 'With array and offset: check w'); }); QUnit.test('onChange', assert => { let b = false; const f = function() { b = true; }; const a = new Quaternion(11, 12, 13, 1); a.onChange(f); assert.ok(a.onChangeCallback === f, 'Passed!'); a.onChangeCallback(); assert.ok(b, 'Passed!'); }); QUnit.test('onChangeCallback', assert => { let b = false; const a = new Quaternion(11, 12, 13, 1); const f = function() { b = true; assert.ok(a === this, 'Passed!'); }; a.onChangeCallback = f; assert.ok(a.onChangeCallback === f, 'Passed!'); a.onChangeCallback(); assert.ok(b, 'Passed!'); }); QUnit.test('iterable', assert => { const q = new Quaternion(0, 0.5, 0.7, 1); const array = [...q]; assert.strictEqual(array[0], 0, 'Quaternion is iterable.'); assert.strictEqual(array[1], 0.5, 'Quaternion is iterable.'); assert.strictEqual(array[2], 0.7, 'Quaternion is iterable.'); assert.strictEqual(array[3], 1, 'Quaternion is iterable.'); }); const orders = ['XYZ', 'YXZ', 'ZXY', 'ZYX', 'YZX', 'XZY']; const eulerAngles = new Euler(0.1, -0.3, 0.25); function qSub(a, b) { const result = new Quaternion(); result.copy(a); result.x -= b.x; result.y -= b.y; result.z -= b.z; result.w -= b.w; return result; } function doSlerpObject(aArr, bArr, t) { const a = new Quaternion().fromArray(aArr), b = new Quaternion().fromArray(bArr), c = new Quaternion().fromArray(aArr); c.slerp(b, t); return { equals: function(x, y, z, w, maxError) { if (maxError === undefined) maxError = Number.EPSILON; return Math.abs(x - c.x) <= maxError && Math.abs(y - c.y) <= maxError && Math.abs(z - c.z) <= maxError && Math.abs(w - c.w) <= maxError; }, length: c.length(), dotA: c.dot(a), dotB: c.dot(b) }; } function doSlerpArray(a, b, t) { const result = [0, 0, 0, 0]; Quaternion.slerpFlat(result, 0, a, 0, b, 0, t); function arrDot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; } return { equals: function(x, y, z, w, maxError) { if (maxError === undefined) maxError = Number.EPSILON; return Math.abs(x - result[0]) <= maxError && Math.abs(y - result[1]) <= maxError && Math.abs(z - result[2]) <= maxError && Math.abs(w - result[3]) <= maxError; }, length: Math.sqrt(arrDot(result, result)), dotA: arrDot(result, a), dotB: arrDot(result, b) }; } function slerpTestSkeleton(doSlerp, maxError, assert) { let result; const a = [ 0.6753410084407496, 0.4087830051091744, 0.32856700410659473, 0.5185120064806223 ]; const b = [ 0.6602792107657797, 0.43647413932562285, 0.35119011210236006, 0.5001871596632682 ]; let maxNormError = 0; function isNormal(result) { const normError = Math.abs(1 - result.length); maxNormError = Math.max(maxNormError, normError); return normError <= maxError; } result = doSlerp(a, b, 0); assert.ok(result.equals( a[0], a[1], a[2], a[3], 0), 'Exactly A @ t = 0'); result = doSlerp(a, b, 1); assert.ok(result.equals( b[0], b[1], b[2], b[3], 0), 'Exactly B @ t = 1'); result = doSlerp(a, b, 0.5); assert.ok(Math.abs(result.dotA - result.dotB) <= Number.EPSILON, 'Symmetry at 0.5'); assert.ok(isNormal(result), 'Approximately normal (at 0.5)'); result = doSlerp(a, b, 0.25); assert.ok(result.dotA > result.dotB, 'Interpolating at 0.25'); assert.ok(isNormal(result), 'Approximately normal (at 0.25)'); result = doSlerp(a, b, 0.75); assert.ok(result.dotA < result.dotB, 'Interpolating at 0.75'); assert.ok(isNormal(result), 'Approximately normal (at 0.75)'); const D = Math.SQRT1_2; result = doSlerp([1, 0, 0, 0], [0, 0, 1, 0], 0.5); assert.ok(result.equals(D, 0, D, 0), 'X/Z diagonal from axes'); assert.ok(isNormal(result), 'Approximately normal (X/Z diagonal)'); result = doSlerp([0, D, 0, D], [0, -D, 0, D], 0.5); assert.ok(result.equals(0, 0, 0, 1), 'W-Unit from diagonals'); assert.ok(isNormal(result), 'Approximately normal (W-Unit)'); } function changeEulerOrder(euler, order) { return new Euler(euler.x, euler.y, euler.z, order); } ================================================ FILE: tests/unit/src/math/Ray.tests.js ================================================ import { Ray, Vector3, Plane, Sphere, Box3 } from 't3d'; import { zero3, one3, two3, eps, posInf3 } from '../../utils/math-constants.js'; QUnit.module('Ray'); QUnit.test('Instancing', assert => { let a = new Ray(); assert.ok(a.origin.equals(zero3), 'Passed!'); assert.ok(a.direction.equals(new Vector3(0, 0, -1)), 'Passed!'); a = new Ray(two3.clone(), one3.clone()); assert.ok(a.origin.equals(two3), 'Passed!'); assert.ok(a.direction.equals(one3), 'Passed!'); }); QUnit.test('set', assert => { const a = new Ray(); a.set(one3, one3); assert.ok(a.origin.equals(one3), 'Passed!'); assert.ok(a.direction.equals(one3), 'Passed!'); }); QUnit.test('recast/clone', assert => { const a = new Ray(one3.clone(), new Vector3(0, 0, 1)); assert.ok(a.recast(0).equals(a), 'Passed!'); const b = a.clone(); assert.ok(b.recast(-1).equals(new Ray(new Vector3(1, 1, 0), new Vector3(0, 0, 1))), 'Passed!'); const c = a.clone(); assert.ok(c.recast(1).equals(new Ray(new Vector3(1, 1, 2), new Vector3(0, 0, 1))), 'Passed!'); const d = a.clone(); const e = d.clone().recast(1); assert.ok(d.equals(a), 'Passed!'); assert.ok(!e.equals(d), 'Passed!'); assert.ok(e.equals(c), 'Passed!'); }); QUnit.test('copy/equals', assert => { const a = new Ray(zero3.clone(), one3.clone()); const b = new Ray().copy(a); assert.ok(b.origin.equals(zero3), 'Passed!'); assert.ok(b.direction.equals(one3), 'Passed!'); // ensure that it is a true copy a.origin = zero3; a.direction = one3; assert.ok(b.origin.equals(zero3), 'Passed!'); assert.ok(b.direction.equals(one3), 'Passed!'); }); QUnit.test('at', assert => { const a = new Ray(one3.clone(), new Vector3(0, 0, 1)); const point = new Vector3(); a.at(0, point); assert.ok(point.equals(one3), 'Passed!'); a.at(-1, point); assert.ok(point.equals(new Vector3(1, 1, 0)), 'Passed!'); a.at(1, point); assert.ok(point.equals(new Vector3(1, 1, 2)), 'Passed!'); }); QUnit.test('closestPointToPoint', assert => { const a = new Ray(one3.clone(), new Vector3(0, 0, 1)); const point = new Vector3(); // behind the ray a.closestPointToPoint(zero3, point); assert.ok(point.equals(one3), 'Passed!'); // front of the ray a.closestPointToPoint(new Vector3(0, 0, 50), point); assert.ok(point.equals(new Vector3(1, 1, 50)), 'Passed!'); // exactly on the ray a.closestPointToPoint(one3, point); assert.ok(point.equals(one3), 'Passed!'); }); QUnit.test('distanceToPoint', assert => { const a = new Ray(one3.clone(), new Vector3(0, 0, 1)); // behind the ray const b = a.distanceToPoint(zero3); assert.ok(b === Math.sqrt(3), 'Passed!'); // front of the ray const c = a.distanceToPoint(new Vector3(0, 0, 50)); assert.ok(c === Math.sqrt(2), 'Passed!'); // exactly on the ray const d = a.distanceToPoint(one3); assert.ok(d === 0, 'Passed!'); }); QUnit.test('distanceSqToPoint', assert => { const a = new Ray(one3.clone(), new Vector3(0, 0, 1)); // behind the ray const b = a.distanceSqToPoint(zero3); assert.ok(b === 3, 'Passed!'); // front of the ray const c = a.distanceSqToPoint(new Vector3(0, 0, 50)); assert.ok(c === 2, 'Passed!'); // exactly on the ray const d = a.distanceSqToPoint(one3); assert.ok(d === 0, 'Passed!'); }); QUnit.test('intersectSphere', assert => { const TOL = 0.0001; const point = new Vector3(); // ray a0 origin located at ( 0, 0, 0 ) and points outward in negative-z direction const a0 = new Ray(zero3.clone(), new Vector3(0, 0, -1)); // ray a1 origin located at ( 1, 1, 1 ) and points left in negative-x direction const a1 = new Ray(one3.clone(), new Vector3(-1, 0, 0)); // sphere (radius of 2) located behind ray a0, should result in null let b = new Sphere(new Vector3(0, 0, 3), 2); a0.intersectSphere(b, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); // sphere (radius of 2) located in front of, but too far right of ray a0, should result in null b = new Sphere(new Vector3(3, 0, -1), 2); a0.intersectSphere(b, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); // sphere (radius of 2) located below ray a1, should result in null b = new Sphere(new Vector3(1, -2, 1), 2); a1.intersectSphere(b, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); // sphere (radius of 1) located to the left of ray a1, should result in intersection at 0, 1, 1 b = new Sphere(new Vector3(-1, 1, 1), 1); a1.intersectSphere(b, point); assert.ok(point.distanceTo(new Vector3(0, 1, 1)) < TOL, 'Passed!'); // sphere (radius of 1) located in front of ray a0, should result in intersection at 0, 0, -1 b = new Sphere(new Vector3(0, 0, -2), 1); a0.intersectSphere(b, point); assert.ok(point.distanceTo(new Vector3(0, 0, -1)) < TOL, 'Passed!'); // sphere (radius of 2) located in front & right of ray a0, should result in intersection at 0, 0, -1, or left-most edge of sphere b = new Sphere(new Vector3(2, 0, -1), 2); a0.intersectSphere(b, point); assert.ok(point.distanceTo(new Vector3(0, 0, -1)) < TOL, 'Passed!'); // same situation as above, but move the sphere a fraction more to the right, and ray a0 should now just miss b = new Sphere(new Vector3(2.01, 0, -1), 2); a0.intersectSphere(b, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); // following QUnit.tests are for situations where the ray origin is inside the sphere // sphere (radius of 1) center located at ray a0 origin / sphere surrounds the ray origin, so the first intersect point 0, 0, 1, // is behind ray a0. Therefore, second exit point on back of sphere will be returned: 0, 0, -1 // thus keeping the intersection point always in front of the ray. b = new Sphere(zero3.clone(), 1); a0.intersectSphere(b, point); assert.ok(point.distanceTo(new Vector3(0, 0, -1)) < TOL, 'Passed!'); // sphere (radius of 4) center located behind ray a0 origin / sphere surrounds the ray origin, so the first intersect point 0, 0, 5, // is behind ray a0. Therefore, second exit point on back of sphere will be returned: 0, 0, -3 // thus keeping the intersection point always in front of the ray. b = new Sphere(new Vector3(0, 0, 1), 4); a0.intersectSphere(b, point); assert.ok(point.distanceTo(new Vector3(0, 0, -3)) < TOL, 'Passed!'); // sphere (radius of 4) center located in front of ray a0 origin / sphere surrounds the ray origin, so the first intersect point 0, 0, 3, // is behind ray a0. Therefore, second exit point on back of sphere will be returned: 0, 0, -5 // thus keeping the intersection point always in front of the ray. b = new Sphere(new Vector3(0, 0, -1), 4); a0.intersectSphere(b, point); assert.ok(point.distanceTo(new Vector3(0, 0, -5)) < TOL, 'Passed!'); }); QUnit.test('intersectsSphere', assert => { const a = new Ray(one3.clone(), new Vector3(0, 0, 1)); const b = new Sphere(zero3, 0.5); const c = new Sphere(zero3, 1.5); const d = new Sphere(one3, 0.1); const e = new Sphere(two3, 0.1); const f = new Sphere(two3, 1); assert.ok(!a.intersectsSphere(b), 'Passed!'); assert.ok(!a.intersectsSphere(c), 'Passed!'); assert.ok(a.intersectsSphere(d), 'Passed!'); assert.ok(!a.intersectsSphere(e), 'Passed!'); assert.ok(!a.intersectsSphere(f), 'Passed!'); }); QUnit.todo('distanceToPlane', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('intersectPlane', assert => { const a = new Ray(one3.clone(), new Vector3(0, 0, 1)); const point = new Vector3(); // parallel plane behind const b = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), new Vector3(1, 1, -1)); a.intersectPlane(b, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); // parallel plane coincident with origin const c = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), new Vector3(1, 1, 0)); a.intersectPlane(c, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); // parallel plane in front const d = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), new Vector3(1, 1, 1)); a.intersectPlane(d, point.copy(posInf3)); assert.ok(point.equals(a.origin), 'Passed!'); // perpendicular ray that overlaps exactly const e = new Plane().setFromNormalAndCoplanarPoint(new Vector3(1, 0, 0), one3); a.intersectPlane(e, point.copy(posInf3)); assert.ok(point.equals(a.origin), 'Passed!'); // perpendicular ray that doesn't overlap const f = new Plane().setFromNormalAndCoplanarPoint(new Vector3(1, 0, 0), zero3); a.intersectPlane(f, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); }); QUnit.test('intersectsPlane', assert => { const a = new Ray(one3.clone(), new Vector3(0, 0, 1)); // parallel plane in front of the ray const b = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), one3.clone().sub(new Vector3(0, 0, -1))); assert.ok(a.intersectsPlane(b), 'Passed!'); // parallel plane coincident with origin const c = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), one3.clone().sub(new Vector3(0, 0, 0))); assert.ok(a.intersectsPlane(c), 'Passed!'); // parallel plane behind the ray const d = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), one3.clone().sub(new Vector3(0, 0, 1))); assert.ok(!a.intersectsPlane(d), 'Passed!'); // perpendicular ray that overlaps exactly const e = new Plane().setFromNormalAndCoplanarPoint(new Vector3(1, 0, 0), one3); assert.ok(a.intersectsPlane(e), 'Passed!'); // perpendicular ray that doesn't overlap const f = new Plane().setFromNormalAndCoplanarPoint(new Vector3(1, 0, 0), zero3); assert.ok(!a.intersectsPlane(f), 'Passed!'); }); QUnit.test('intersectBox', assert => { const TOL = 0.0001; const box = new Box3(new Vector3(-1, -1, -1), new Vector3(1, 1, 1)); const point = new Vector3(); const a = new Ray(new Vector3(-2, 0, 0), new Vector3(1, 0, 0)); // ray should intersect box at -1,0,0 assert.ok(a.intersectsBox(box) === true, 'Passed!'); a.intersectBox(box, point); assert.ok(point.distanceTo(new Vector3(-1, 0, 0)) < TOL, 'Passed!'); const b = new Ray(new Vector3(-2, 0, 0), new Vector3(-1, 0, 0)); // ray is point away from box, it should not intersect assert.ok(b.intersectsBox(box) === false, 'Passed!'); b.intersectBox(box, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); const c = new Ray(new Vector3(0, 0, 0), new Vector3(1, 0, 0)); // ray is inside box, should return exit point assert.ok(c.intersectsBox(box) === true, 'Passed!'); c.intersectBox(box, point); assert.ok(point.distanceTo(new Vector3(1, 0, 0)) < TOL, 'Passed!'); const d = new Ray(new Vector3(0, 2, 1), new Vector3(0, -1, -1).normalize()); // tilted ray should intersect box at 0,1,0 assert.ok(d.intersectsBox(box) === true, 'Passed!'); d.intersectBox(box, point); assert.ok(point.distanceTo(new Vector3(0, 1, 0)) < TOL, 'Passed!'); const e = new Ray(new Vector3(1, -2, 1), new Vector3(0, 1, 0).normalize()); // handle case where ray is coplanar with one of the boxes side - box in front of ray assert.ok(e.intersectsBox(box) === true, 'Passed!'); e.intersectBox(box, point); assert.ok(point.distanceTo(new Vector3(1, -1, 1)) < TOL, 'Passed!'); const f = new Ray(new Vector3(1, -2, 0), new Vector3(0, -1, 0).normalize()); // handle case where ray is coplanar with one of the boxes side - box behind ray assert.ok(f.intersectsBox(box) === false, 'Passed!'); f.intersectBox(box, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'Passed!'); }); QUnit.todo('intersectsBox', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('intersectTriangle', assert => { const ray = new Ray(); const a = new Vector3(1, 1, 0); const b = new Vector3(0, 1, 1); const c = new Vector3(1, 0, 1); const point = new Vector3(); // DdN == 0 ray.set(ray.origin, zero3.clone()); ray.intersectTriangle(a, b, c, false, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'No intersection if direction == zero'); // DdN > 0, backfaceCulling = true ray.set(ray.origin, one3.clone()); ray.intersectTriangle(a, b, c, true, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'No intersection with backside faces if backfaceCulling is true'); // DdN > 0 ray.set(ray.origin, one3.clone()); ray.intersectTriangle(a, b, c, false, point); assert.ok(Math.abs(point.x - 2 / 3) <= eps, 'Successful intersection: check x'); assert.ok(Math.abs(point.y - 2 / 3) <= eps, 'Successful intersection: check y'); assert.ok(Math.abs(point.z - 2 / 3) <= eps, 'Successful intersection: check z'); // DdN > 0, DdQxE2 < 0 b.multiplyScalar(-1); ray.intersectTriangle(a, b, c, false, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'No intersection'); // DdN > 0, DdE1xQ < 0 a.multiplyScalar(-1); ray.intersectTriangle(a, b, c, false, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'No intersection'); // DdN > 0, DdQxE2 + DdE1xQ > DdN b.multiplyScalar(-1); ray.intersectTriangle(a, b, c, false, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'No intersection'); // DdN < 0, QdN < 0 a.multiplyScalar(-1); b.multiplyScalar(-1); ray.direction.multiplyScalar(-1); ray.intersectTriangle(a, b, c, false, point.copy(posInf3)); assert.ok(point.equals(posInf3), 'No intersection when looking in the wrong direction'); }); QUnit.todo('applyMatrix4', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); ================================================ FILE: tests/unit/src/math/Sphere.tests.js ================================================ import { Sphere, Vector3, Matrix4, Box3 } from 't3d'; import { zero3, one3, two3, eps } from '../../utils/math-constants.js'; QUnit.module('Sphere'); QUnit.test('constructor', assert => { let a = new Sphere(); assert.ok(a.center.equals(zero3), 'Passed!'); assert.ok(a.radius == -1, 'Passed!'); a = new Sphere(one3.clone(), 1); assert.ok(a.center.equals(one3), 'Passed!'); assert.ok(a.radius == 1, 'Passed!'); }); QUnit.test('set', assert => { const a = new Sphere(); assert.ok(a.center.equals(zero3), 'Passed!'); assert.ok(a.radius == -1, 'Passed!'); a.set(one3, 1); assert.ok(a.center.equals(one3), 'Passed!'); assert.ok(a.radius == 1, 'Passed!'); }); QUnit.test('setFromArray', assert => { const a = new Sphere(); const expectedCenter = new Vector3(0.9330126941204071, 0, 0); const expectedRadius = 1.3676668773461689; const array = [ 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0.8660253882408142, 0.5, 0, -0, 0.5, 0.8660253882408142, 1.8660253882408142, 0.5, 0, 0, 0.5, -0.8660253882408142, 0.8660253882408142, 0.5, -0, 0.8660253882408142, -0.5, 0, -0, -0.5, 0.8660253882408142, 1.8660253882408142, -0.5, 0, 0, -0.5, -0.8660253882408142, 0.8660253882408142, -0.5, -0, -0, -1, 0, -0, -1, 0, 0, -1, 0, 0, -1, -0, -0, -1, -0 ]; a.setFromArray(array); assert.ok(Math.abs(a.center.x - expectedCenter.x) <= eps, 'Default center: check center.x'); assert.ok(Math.abs(a.center.y - expectedCenter.y) <= eps, 'Default center: check center.y'); assert.ok(Math.abs(a.center.z - expectedCenter.z) <= eps, 'Default center: check center.z'); assert.ok(Math.abs(a.radius - expectedRadius) <= eps, 'Default center: check radius'); }); QUnit.test('setFromPoints', assert => { const a = new Sphere(); const points = [ new Vector3(1, 1, 1), new Vector3(2, 2, 2), new Vector3(-1, -1, -1) ]; // Setting from points with automatic center calculation a.setFromPoints(points); assert.ok(a.center.equals(new Vector3(0.5, 0.5, 0.5)), 'Auto-center: check center'); assert.ok(Math.abs(a.radius - Math.sqrt(1.5 * 1.5 + 1.5 * 1.5 + 1.5 * 1.5)) <= eps, 'Auto-center: check radius'); console.log(a.radius); // Setting from points with specified center const center = new Vector3(0, 0, 0); a.setFromPoints(points, center); assert.ok(a.center.equals(center), 'Specified center: check center'); assert.ok(Math.abs(a.radius - Math.sqrt(2 * 2 + 2 * 2 + 2 * 2)) <= eps, 'Specified center: check radius'); console.log(a.radius); }); QUnit.test('applyMatrix4', assert => { const a = new Sphere(one3.clone(), 1); const m = new Matrix4().makeTranslation(1, -2, 1); const aabb1 = new Box3(); const aabb2 = new Box3(); a.clone().applyMatrix4(m).getBoundingBox(aabb1); a.getBoundingBox(aabb2); assert.ok(aabb1.equals(aabb2.applyMatrix4(m)), 'Passed!'); }); QUnit.test('getBoundingBox', assert => { const a = new Sphere(one3.clone(), 1); const aabb = new Box3(); a.getBoundingBox(aabb); assert.ok(aabb.equals(new Box3(zero3, two3)), 'Passed!'); a.set(zero3, 0); a.getBoundingBox(aabb); assert.ok(aabb.equals(new Box3(zero3, zero3)), 'Passed!'); // Empty sphere produces empty bounding box a.makeEmpty(); a.getBoundingBox(aabb); assert.ok(aabb.isEmpty(), 'Passed!'); }); QUnit.test('isEmpty', assert => { const a = new Sphere(); assert.ok(a.isEmpty(), 'Passed!'); a.set(one3, 1); assert.ok(!a.isEmpty(), 'Passed!'); // Negative radius contains no points a.set(one3, -1); assert.ok(a.isEmpty(), 'Passed!'); // Zero radius contains only the center point a.set(one3, 0); assert.ok(!a.isEmpty(), 'Passed!'); }); QUnit.test('makeEmpty', assert => { const a = new Sphere(one3.clone(), 1); assert.ok(!a.isEmpty(), 'Passed!'); a.makeEmpty(); assert.ok(a.isEmpty(), 'Passed!'); assert.ok(a.center.equals(zero3), 'Passed!'); }); QUnit.test('containsPoint', assert => { const a = new Sphere(one3.clone(), 1); // Point inside the sphere assert.ok(a.containsPoint(new Vector3(1.5, 1, 1)), 'Inside point: Passed!'); // Point on the surface of the sphere const surfacePoint = new Vector3(1, 1, 2); assert.ok(a.containsPoint(surfacePoint), 'Surface point: Passed!'); // Point outside the sphere assert.ok(!a.containsPoint(new Vector3(3, 1, 1)), 'Outside point: Passed!'); // With an empty sphere a.makeEmpty(); assert.ok(!a.containsPoint(one3), 'Empty sphere contains no points: Passed!'); }); QUnit.test('distanceToPoint', assert => { const a = new Sphere(one3.clone(), 1); // Point inside the sphere assert.ok(a.distanceToPoint(one3) === -1, 'Center point distance: Passed!'); assert.ok(a.distanceToPoint(new Vector3(1.5, 1, 1)) < 0, 'Inside point distance is negative: Passed!'); // Point on the surface of the sphere const surfacePoint = new Vector3(1, 1, 2); assert.ok(Math.abs(a.distanceToPoint(surfacePoint)) <= eps, 'Surface point distance is zero: Passed!'); // Point outside the sphere const outsidePoint = new Vector3(1, 1, 3); assert.ok(Math.abs(a.distanceToPoint(outsidePoint) - 1) <= eps, 'Outside point distance: Passed!'); }); QUnit.test('expandByPoint', assert => { // Starting with default sphere const a = new Sphere(); // Expand empty sphere by point a.expandByPoint(one3); assert.ok(a.center.equals(one3), 'First point becomes center: Passed!'); assert.ok(a.radius === 0, 'Radius is 0 after first point: Passed!'); // Expand by another point a.expandByPoint(new Vector3(3, 1, 1)); assert.ok(Math.abs(a.radius - 1) <= eps, 'Radius updates correctly: Passed!'); assert.ok(a.center.distanceTo(new Vector3(2, 1, 1)) <= eps, 'Center updates correctly: Passed!'); // Test with third point inside existing sphere a.expandByPoint(new Vector3(1.5, 1, 1)); assert.ok(Math.abs(a.radius - 1) <= eps, 'Radius unchanged for inside point: Passed!'); }); QUnit.test('union', assert => { // Test combining two non-empty spheres const a = new Sphere(zero3.clone(), 1); const b = new Sphere(new Vector3(2, 0, 0), 1); a.union(b); assert.ok(a.center.equals(new Vector3(1, 0, 0)), 'Union centers: Passed!'); assert.ok(Math.abs(a.radius - 2) <= eps, 'Union radius: Passed!'); // Test with an empty sphere const c = new Sphere(); const d = new Sphere(one3.clone(), 1); c.union(d); assert.ok(c.center.equals(one3), 'Empty with non-empty center: Passed!'); assert.ok(c.radius === 1, 'Empty with non-empty radius: Passed!'); // Test with spheres having the same center const e = new Sphere(one3.clone(), 1); const f = new Sphere(one3.clone(), 2); e.union(f); assert.ok(e.center.equals(one3), 'Same center result: Passed!'); assert.ok(e.radius === 2, 'Same center takes larger radius: Passed!'); }); QUnit.test('clone', assert => { const a = new Sphere(one3.clone(), 1); const b = a.clone(); assert.ok(a.center.equals(b.center), 'Clone center: Passed!'); assert.ok(a.radius === b.radius, 'Clone radius: Passed!'); // Verify it's a true copy a.center.x = 0; a.radius = 0; assert.ok(!a.center.equals(b.center), 'Original change doesn\'t affect clone center: Passed!'); assert.ok(a.radius !== b.radius, 'Original change doesn\'t affect clone radius: Passed!'); }); QUnit.test('copy', assert => { const a = new Sphere(one3.clone(), 1); const b = new Sphere().copy(a); assert.ok(b.center.equals(one3), 'Passed!'); assert.ok(b.radius == 1, 'Passed!'); // ensure that it is a true copy a.center = zero3; a.radius = 0; assert.ok(b.center.equals(one3), 'Passed!'); assert.ok(b.radius == 1, 'Passed!'); }); ================================================ FILE: tests/unit/src/math/Vector2.tests.js ================================================ import { Vector2 } from 't3d'; import { x, y } from '../../utils/math-constants.js'; QUnit.module('Vector2'); QUnit.test('fromArray', assert => { const array = new Float32Array([1, 2]); const a = new Vector2(); a.fromArray(array, 0, true); assert.ok(a.x == 1, 'Passed!'); assert.ok(a.y == 2, 'Passed!'); }); QUnit.test('toArray', assert => { const array = new Float32Array(2); const a = new Vector2(1, 2); a.toArray(array, 0, true); assert.ok(array[0] == 1, 'Passed!'); assert.ok(array[1] == 2, 'Passed!'); }); QUnit.test('clone', assert => { const a = new Vector2().clone(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); const b = a.set(x, y).clone(); assert.ok(b.x == x, 'Passed!'); assert.ok(b.y == y, 'Passed!'); }); QUnit.test('iterable', assert => { const v = new Vector2(0, 1); const array = [...v]; assert.strictEqual(array[0], 0, 'Vector2 is iterable.'); assert.strictEqual(array[1], 1, 'Vector2 is iterable.'); }); ================================================ FILE: tests/unit/src/math/Vector3.tests.js ================================================ import { Vector3, Matrix3, Matrix4, Quaternion, Spherical } from 't3d'; import { x, y, z, eps } from '../../utils/math-constants.js'; QUnit.module('Vector3'); QUnit.test('Instancing', assert => { let a = new Vector3(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z == 0, 'Passed!'); a = new Vector3(x, y, z); assert.ok(a.x === x, 'Passed!'); assert.ok(a.y === y, 'Passed!'); assert.ok(a.z === z, 'Passed!'); }); QUnit.test('set', assert => { const a = new Vector3(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z == 0, 'Passed!'); a.set(x, y, z); assert.ok(a.x == x, 'Passed!'); assert.ok(a.y == y, 'Passed!'); assert.ok(a.z == z, 'Passed!'); }); QUnit.test('clone', assert => { const a = new Vector3().clone(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z == 0, 'Passed!'); const b = a.set(x, y, z).clone(); assert.ok(b.x == x, 'Passed!'); assert.ok(b.y == y, 'Passed!'); assert.ok(b.z === z, 'Passed!'); }); QUnit.test('copy', assert => { const a = new Vector3(x, y, z); const b = new Vector3().copy(a); assert.ok(b.x == x, 'Passed!'); assert.ok(b.y == y, 'Passed!'); assert.ok(b.z == z, 'Passed!'); // ensure that it is a true copy a.x = 0; a.y = -1; a.z = -2; assert.ok(b.x == x, 'Passed!'); assert.ok(b.y == y, 'Passed!'); assert.ok(b.z == z, 'Passed!'); }); QUnit.test('add', assert => { const a = new Vector3(x, y, z); const b = new Vector3(-x, -y, -z); a.add(b); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z == 0, 'Passed!'); const c = new Vector3().addVectors(b, b); assert.ok(c.x == -2 * x, 'Passed!'); assert.ok(c.y == -2 * y, 'Passed!'); assert.ok(c.z == -2 * z, 'Passed!'); }); QUnit.todo('addVectors', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('addScaledVector', assert => { const a = new Vector3(x, y, z); const b = new Vector3(2, 3, 4); const s = 3; a.addScaledVector(b, s); assert.strictEqual(a.x, x + b.x * s, 'Check x'); assert.strictEqual(a.y, y + b.y * s, 'Check y'); assert.strictEqual(a.z, z + b.z * s, 'Check z'); }); QUnit.test('sub', assert => { const a = new Vector3(x, y, z); const b = new Vector3(-x, -y, -z); a.sub(b); assert.ok(a.x == 2 * x, 'Passed!'); assert.ok(a.y == 2 * y, 'Passed!'); assert.ok(a.z == 2 * z, 'Passed!'); const c = new Vector3().subVectors(a, a); assert.ok(c.x == 0, 'Passed!'); assert.ok(c.y == 0, 'Passed!'); assert.ok(c.z == 0, 'Passed!'); }); QUnit.todo('subVectors', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('applyMatrix3', assert => { const a = new Vector3(x, y, z); const m = new Matrix3().set(2, 3, 5, 7, 11, 13, 17, 19, 23); a.applyMatrix3(m); assert.strictEqual(a.x, 33, 'Check x'); assert.strictEqual(a.y, 99, 'Check y'); assert.strictEqual(a.z, 183, 'Check z'); }); QUnit.todo('applyMatrix4', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('applyQuaternion', assert => { const a = new Vector3(x, y, z); a.applyQuaternion(new Quaternion()); assert.strictEqual(a.x, x, 'Identity rotation: check x'); assert.strictEqual(a.y, y, 'Identity rotation: check y'); assert.strictEqual(a.z, z, 'Identity rotation: check z'); }); QUnit.todo('project', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.todo('unproject', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('transformDirection', assert => { const a = new Vector3(x, y, z); const m = new Matrix4(); const transformed = new Vector3(0.3713906763541037, 0.5570860145311556, 0.7427813527082074); a.transformDirection(m); assert.ok(Math.abs(a.x - transformed.x) <= eps, 'Check x'); assert.ok(Math.abs(a.y - transformed.y) <= eps, 'Check y'); assert.ok(Math.abs(a.z - transformed.z) <= eps, 'Check z'); }); QUnit.test('negate', assert => { const a = new Vector3(x, y, z); a.negate(); assert.ok(a.x == -x, 'Passed!'); assert.ok(a.y == -y, 'Passed!'); assert.ok(a.z == -z, 'Passed!'); }); QUnit.test('dot', assert => { const a = new Vector3(x, y, z); const b = new Vector3(-x, -y, -z); const c = new Vector3(); let result = a.dot(b); assert.ok(result == (-x * x - y * y - z * z), 'Passed!'); result = a.dot(c); assert.ok(result == 0, 'Passed!'); }); QUnit.test('normalize', assert => { const a = new Vector3(x, 0, 0); const b = new Vector3(0, -y, 0); const c = new Vector3(0, 0, z); a.normalize(); assert.ok(a.getLength() == 1, 'Passed!'); assert.ok(a.x == 1, 'Passed!'); b.normalize(); assert.ok(b.getLength() == 1, 'Passed!'); assert.ok(b.y == -1, 'Passed!'); c.normalize(); assert.ok(c.getLength() == 1, 'Passed!'); assert.ok(c.z == 1, 'Passed!'); }); QUnit.todo('lerpVectors', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('cross', assert => { const a = new Vector3(x, y, z); const b = new Vector3(2 * x, -y, 0.5 * z); const crossed = new Vector3(18, 12, -18); a.cross(b); assert.ok(Math.abs(a.x - crossed.x) <= eps, 'Check x'); assert.ok(Math.abs(a.y - crossed.y) <= eps, 'Check y'); assert.ok(Math.abs(a.z - crossed.z) <= eps, 'Check z'); }); QUnit.test('crossVectors', assert => { const a = new Vector3(x, y, z); const b = new Vector3(x, -y, z); const c = new Vector3(); const crossed = new Vector3(24, 0, -12); c.crossVectors(a, b); assert.ok(Math.abs(c.x - crossed.x) <= eps, 'Check x'); assert.ok(Math.abs(c.y - crossed.y) <= eps, 'Check y'); assert.ok(Math.abs(c.z - crossed.z) <= eps, 'Check z'); }); QUnit.test('reflect', assert => { const a = new Vector3(); const normal = new Vector3(0, 1, 0); const b = new Vector3(); a.set(0, -1, 0); assert.ok(b.copy(a).reflect(normal).equals(new Vector3(0, 1, 0)), 'Passed!'); a.set(1, -1, 0); assert.ok(b.copy(a).reflect(normal).equals(new Vector3(1, 1, 0)), 'Passed!'); a.set(1, -1, 0); normal.set(0, -1, 0); assert.ok(b.copy(a).reflect(normal).equals(new Vector3(1, 1, 0)), 'Passed!'); }); QUnit.test('angleTo', assert => { const a = new Vector3(0, -0.18851655680720186, 0.9820700116639124); const b = new Vector3(0, 0.18851655680720186, -0.9820700116639124); assert.equal(a.angleTo(a), 0); assert.equal(a.angleTo(b), Math.PI); const x = new Vector3(1, 0, 0); const y = new Vector3(0, 1, 0); const z = new Vector3(0, 0, 1); assert.equal(x.angleTo(y), Math.PI / 2); assert.equal(x.angleTo(z), Math.PI / 2); assert.equal(z.angleTo(x), Math.PI / 2); assert.ok(Math.abs(x.angleTo(new Vector3(1, 1, 0)) - (Math.PI / 4)) < 0.0000001); }); QUnit.test('setFromSpherical', assert => { const a = new Vector3(); const phi = Math.acos(-0.5); const theta = Math.sqrt(Math.PI) * phi; const sph = new Spherical(10, phi, theta); const expected = new Vector3(-4.677914006701843, -5, -7.288149322420796); a.setFromSpherical(sph); assert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x'); assert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y'); assert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z'); }); QUnit.test('setFromMatrixPosition', assert => { const a = new Vector3(); const m = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53); a.setFromMatrixPosition(m); assert.strictEqual(a.x, 7, 'Check x'); assert.strictEqual(a.y, 19, 'Check y'); assert.strictEqual(a.z, 37, 'Check z'); }); QUnit.test('setFromMatrixScale', assert => { const a = new Vector3(); const m = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53); const expected = new Vector3(25.573423705088842, 31.921779399024736, 35.70714214271425); a.setFromMatrixScale(m); assert.ok(Math.abs(a.x - expected.x) <= eps, 'Check x'); assert.ok(Math.abs(a.y - expected.y) <= eps, 'Check y'); assert.ok(Math.abs(a.z - expected.z) <= eps, 'Check z'); }); QUnit.test('setFromMatrixColumn', assert => { const a = new Vector3(); const m = new Matrix4().set(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53); a.setFromMatrixColumn(m, 0); assert.strictEqual(a.x, 2, 'Index 0: check x'); assert.strictEqual(a.y, 11, 'Index 0: check y'); assert.strictEqual(a.z, 23, 'Index 0: check z'); a.setFromMatrixColumn(m, 2); assert.strictEqual(a.x, 5, 'Index 2: check x'); assert.strictEqual(a.y, 17, 'Index 2: check y'); assert.strictEqual(a.z, 31, 'Index 2: check z'); }); QUnit.test('equals', assert => { const a = new Vector3(x, 0, z); const b = new Vector3(0, -y, 0); assert.ok(a.x != b.x, 'Passed!'); assert.ok(a.y != b.y, 'Passed!'); assert.ok(a.z != b.z, 'Passed!'); assert.ok(!a.equals(b), 'Passed!'); assert.ok(!b.equals(a), 'Passed!'); a.copy(b); assert.ok(a.x == b.x, 'Passed!'); assert.ok(a.y == b.y, 'Passed!'); assert.ok(a.z == b.z, 'Passed!'); assert.ok(a.equals(b), 'Passed!'); assert.ok(b.equals(a), 'Passed!'); }); QUnit.test('fromArray', assert => { const a = new Vector3(); const array = [1, 2, 3, 4, 5, 6]; a.fromArray(array); assert.strictEqual(a.x, 1, 'No offset: check x'); assert.strictEqual(a.y, 2, 'No offset: check y'); assert.strictEqual(a.z, 3, 'No offset: check z'); a.fromArray(array, 3); assert.strictEqual(a.x, 4, 'With offset: check x'); assert.strictEqual(a.y, 5, 'With offset: check y'); assert.strictEqual(a.z, 6, 'With offset: check z'); }); QUnit.test('toArray', assert => { const a = new Vector3(x, y, z); let array = a.toArray(); assert.strictEqual(array[0], x, 'No array, no offset: check x'); assert.strictEqual(array[1], y, 'No array, no offset: check y'); assert.strictEqual(array[2], z, 'No array, no offset: check z'); array = []; a.toArray(array); assert.strictEqual(array[0], x, 'With array, no offset: check x'); assert.strictEqual(array[1], y, 'With array, no offset: check y'); assert.strictEqual(array[2], z, 'With array, no offset: check z'); array = []; a.toArray(array, 1); assert.strictEqual(array[0], undefined, 'With array and offset: check [0]'); assert.strictEqual(array[1], x, 'With array and offset: check x'); assert.strictEqual(array[2], y, 'With array and offset: check y'); assert.strictEqual(array[3], z, 'With array and offset: check z'); }); QUnit.test('distanceTo/distanceToSquared', assert => { const a = new Vector3(x, 0, 0); const b = new Vector3(0, -y, 0); const c = new Vector3(0, 0, z); const d = new Vector3(); assert.ok(a.distanceTo(d) == x, 'Passed!'); assert.ok(a.distanceToSquared(d) == x * x, 'Passed!'); assert.ok(b.distanceTo(d) == y, 'Passed!'); assert.ok(b.distanceToSquared(d) == y * y, 'Passed!'); assert.ok(c.distanceTo(d) == z, 'Passed!'); assert.ok(c.distanceToSquared(d) == z * z, 'Passed!'); }); QUnit.test('setScalar/addScalar', assert => { const a = new Vector3(); const s = 3; a.setScalar(s); assert.strictEqual(a.x, s, 'setScalar: check x'); assert.strictEqual(a.y, s, 'setScalar: check y'); assert.strictEqual(a.z, s, 'setScalar: check z'); a.addScalar(s); assert.strictEqual(a.x, 2 * s, 'addScalar: check x'); assert.strictEqual(a.y, 2 * s, 'addScalar: check y'); assert.strictEqual(a.z, 2 * s, 'addScalar: check z'); }); QUnit.test('multiply', assert => { const a = new Vector3(x, y, z); const b = new Vector3(2 * x, 2 * y, 2 * z); a.multiply(b); assert.strictEqual(a.x, x * b.x, 'multiply: check x'); assert.strictEqual(a.y, y * b.y, 'multiply: check y'); assert.strictEqual(a.z, z * b.z, 'multiply: check z'); }); QUnit.test('multiplyScalar', assert => { const a = new Vector3(x, y, z); const b = new Vector3(-x, -y, -z); a.multiplyScalar(-2); assert.ok(a.x == x * -2, 'Passed!'); assert.ok(a.y == y * -2, 'Passed!'); assert.ok(a.z == z * -2, 'Passed!'); b.multiplyScalar(-2); assert.ok(b.x == 2 * x, 'Passed!'); assert.ok(b.y == 2 * y, 'Passed!'); assert.ok(b.z == 2 * z, 'Passed!'); }); QUnit.todo('project/unproject', assert => { assert.ok(false, 'everything\'s gonna be alright'); }); QUnit.test('getLength/getLengthSquared', assert => { const a = new Vector3(x, 0, 0); const b = new Vector3(0, -y, 0); const c = new Vector3(0, 0, z); const d = new Vector3(); assert.ok(a.getLength() == x, 'Passed!'); assert.ok(a.getLengthSquared() == x * x, 'Passed!'); assert.ok(b.getLength() == y, 'Passed!'); assert.ok(b.getLengthSquared() == y * y, 'Passed!'); assert.ok(c.getLength() == z, 'Passed!'); assert.ok(c.getLengthSquared() == z * z, 'Passed!'); assert.ok(d.getLength() == 0, 'Passed!'); assert.ok(d.getLengthSquared() == 0, 'Passed!'); a.set(x, y, z); assert.ok(a.getLength() == Math.sqrt(x * x + y * y + z * z), 'Passed!'); assert.ok(a.getLengthSquared() == (x * x + y * y + z * z), 'Passed!'); }); QUnit.test('lerp/clone', assert => { const a = new Vector3(x, 0, z); const b = new Vector3(0, -y, 0); assert.ok(a.lerp(a, 0).equals(a.lerp(a, 0.5)), 'Passed!'); assert.ok(a.lerp(a, 0).equals(a.lerp(a, 1)), 'Passed!'); assert.ok(a.clone().lerp(b, 0).equals(a), 'Passed!'); assert.ok(a.clone().lerp(b, 0.5).x == x * 0.5, 'Passed!'); assert.ok(a.clone().lerp(b, 0.5).y == -y * 0.5, 'Passed!'); assert.ok(a.clone().lerp(b, 0.5).z == z * 0.5, 'Passed!'); assert.ok(a.clone().lerp(b, 1).equals(b), 'Passed!'); }); QUnit.test('iterable', assert => { const v = new Vector3(0, 0.5, 1); const array = [...v]; assert.strictEqual(array[0], 0, 'Vector3 is iterable.'); assert.strictEqual(array[1], 0.5, 'Vector3 is iterable.'); assert.strictEqual(array[2], 1, 'Vector3 is iterable.'); }); ================================================ FILE: tests/unit/src/math/Vector4.tests.js ================================================ import { Vector4 } from 't3d'; import { x, y, z, w } from '../../utils/math-constants.js'; QUnit.module('Vector4'); QUnit.test('fromArray', assert => { const array = new Float32Array([1, 2, 3, 4]); const a = new Vector4(); a.fromArray(array, 0, true); assert.ok(a.x == 1, 'Passed!'); assert.ok(a.y == 2, 'Passed!'); assert.ok(a.z == 3, 'Passed!'); assert.ok(a.w == 4, 'Passed!'); }); QUnit.test('toArray', assert => { const array = new Float32Array(4); const a = new Vector4(1, 2, 3, 4); a.toArray(array, 0, true); assert.ok(array[0] == 1, 'Passed!'); assert.ok(array[1] == 2, 'Passed!'); assert.ok(array[2] == 3, 'Passed!'); assert.ok(array[3] == 4, 'Passed!'); }); QUnit.test('clone', assert => { const a = new Vector4().clone(); assert.ok(a.x == 0, 'Passed!'); assert.ok(a.y == 0, 'Passed!'); assert.ok(a.z == 0, 'Passed!'); assert.ok(a.w == 1, 'Passed!'); const b = a.set(x, y, z, w).clone(); assert.ok(b.x == x, 'Passed!'); assert.ok(b.y == y, 'Passed!'); assert.ok(b.z === z, 'Passed!'); assert.ok(b.w === w, 'Passed!'); }); QUnit.test('iterable', assert => { const v = new Vector4(0, 0.3, 0.7, 1); const array = [...v]; assert.strictEqual(array[0], 0, 'Vector4 is iterable.'); assert.strictEqual(array[1], 0.3, 'Vector4 is iterable.'); assert.strictEqual(array[2], 0.7, 'Vector4 is iterable.'); assert.strictEqual(array[3], 1, 'Vector4 is iterable.'); }); ================================================ FILE: tests/unit/utils/math-constants.js ================================================ import { Vector2, Vector3 } from 't3d'; export const x = 2; export const y = 3; export const z = 4; export const w = 5; export const negInf2 = new Vector2(-Infinity, -Infinity); export const posInf2 = new Vector2(Infinity, Infinity); export const negOne2 = new Vector2(-1, -1); export const zero2 = new Vector2(); export const one2 = new Vector2(1, 1); export const two2 = new Vector2(2, 2); export const negInf3 = new Vector3(-Infinity, -Infinity, -Infinity); export const posInf3 = new Vector3(Infinity, Infinity, Infinity); export const zero3 = new Vector3(); export const one3 = new Vector3(1, 1, 1); export const two3 = new Vector3(2, 2, 2); export const eps = 0.0001; ================================================ FILE: tools/doc.config.json ================================================ { "source": { "include": ["./src"] }, "plugins": ["plugins/markdown"], "templates": { "default": { "outputSourceFiles": false } }, "opts":{ "encoding": "utf8", "destination": "./docs", "recurse": true, "verbose": true, "readme": "./README.md", "template": "node_modules/clean-jsdoc-theme", "theme_opts": { "favicon": "../examples/favicon.ico", "title": "t3d.js", "homepageTitle": "t3d.js API", "default_theme": "fallback-light", "exclude_inherited": false, "menu": [ { "title": "Github", "link": "https://github.com/uinosoft/t3d.js", "target": "_blank" }, { "title": "Npm", "link": "https://www.npmjs.com/package/t3d", "target": "_blank" } ] } }, "markdown": { "hardwrap": false, "idInHeadings": true } }